<?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>kegelergebnisse</name>
	<version>0.0.9</version>
  <mincmsversion>1.10.2</mincmsversion>
	<help><![CDATA[PGgzPldoYXQgaXMgdGhlIGludGVudGlvbiBvZiBTa2l0dGxlIHJlc3VsdHM/PC9oMz4KPHA+VGhpcyBtb2R1bGUgY2FuIGJlIHVzZWQgdG8gbWFuYWdlIHRoZSByZXN1bHRzIG9mIHlvdXIgc2tpdHRsZXMgY2x1YiBhbmQgc2hvdyB0aGVuIG9uIHlvdXIgd2VicGFnZS4gWW91IGNhbiBtYW5hZ2UgeW91ciBwbGF5ZXJzLCB0ZWFtcyBhbmQgc2Vhc29ucy4gQWRkaXRpb25hbGx5IHRoZXJlIGV4aXN0cyB0aGUgcG9zc2liaWxpdHkgZm9yIHNob3dpbmcgc29tZSBzdGF0aXN0aWMgZGF0YS48L3A+CjxwPkl0IGlzIGFsc28gcG9zc2libGUgdG8gc2hvdyBvbmx5IG9uZSBza2l0dGxlIHJlc3VsdCBzaGVldC4gVXNpbmcgc3RhbmRhcmQgY29udGVudCBjYW4gdGhlcmVmb3JlIGJlIHVzZWQgdG8gZG8gY29tbWVudHMgb24gYSBnYW1lLiBJdCBvbmx5IGhhcyB0byBiZSBpbnNpZGUgdGhlIGRhdGFiYXNlIGFuZCB5b3UgY2FuIHB1dCB0aGUgY29udGVudCB3aGVyZXZlciB5b3Ugd2FudC48L3A+Cgo8aDM+SW5mb3JtYXRpb24gZm9yIGFkbWluaXN0cmF0b3JzIHRvIGludGVncmF0ZSB0aGUgU2tpdHRsZSByZXN1bHQgbW9kdWxlIGludG8gQ01TTWFkZVNpbXBsZTwvaDM+CjxwPkRlcHJlY2F0ZWQ6IFRvIHVzZSBhbGwgdGhlIHBvc3NpYmlsaXRlcyBvZiB0aGlzIG1vZHVsZSAoZXNwZWNpYWxseSB0aGUgYWN0aW9uPSJjb21wbGV0ZXRlYW1pbmZvcm1hdGlvbiIgaXQgaXMgbmVjZXNzYXJ5IHRvIHB1dCB0aGUgZm9sbG93aW5nIGNvZGUgdG8gdGhlIGhlYWRlciBvZiB5b3VyIHRlbXBsYXRlOjxici8+Cjxjb2RlPgpmdW5jdGlvbiBzZXRWaXNpYmlsaXR5KGlkLCB2aXNpYmlsaXR5KSB7PGJyLz4KJm5ic3A7aWRlbnRpdHk9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpOzxici8+CiZuYnNwO2lkZW50aXR5LnN0eWxlLmRpc3BsYXk9dmlzaWJpbGl0eTs8YnIvPgp9PGJyLz4KPC9jb2RlPgpUaGlzIGNvZGUgaXMgYWxzbyBjb250YWluZWQgaW5zaWRlIDxjb2RlPnRlbXBsYXRlPC9jb2RlPiBkaXJlY3RvcnkgaW4gdGhlIGZpbGUgPGNvZGU+a2VnZWxlcmdlYm5pc3NlLmpzPC9jb2RlPi4KPC9wPgo8cD5BZnRlciBJbnN0YWxsYXRpb24gaXQgaXMgbm90IG5lY2Vzc2FyeSB0byBpbnNlcnQgdGhpcyBKYXZhc2NyaXB0IGNvZGUgdG8geW91ciB0ZW1wbGF0ZS4gWW91IG1heSByZW1vdmUgdGhpcyBjb2RlIGZyb20gdGhlIHRlbXBsYXRlIGlmIHlvdSBoYXZlIHVzZWQgaXQgaW5zaWRlIGFuIGVhcmxpZXIgdmVyc2lvbi48L3A+Cgo8cD4KVG8gaW50ZWdyYXRlIGFsbCBmb3JtYXRzIGZvciByZXN1bHQgc2hlZXRzLCB0YWJsZXMgYW5kIGF2ZXJhZ2Ugc3RhdGlzdGljcyBpbnRvIENNU01hZGVTaW1wbGUgeW91IGhhdmUgdG8gaW1wb3J0IHRoZSBzdHlsZXNoZWV0IDxjb2RlPmtlZ2VsZXJnZWJuaXNzZS5jc3M8L2NvZGU+IHdoaWNoIGNhbiBhbHNvIGJlIGZvdW5kIGluc2lkZSB0aGUgdGVtcGxhdGUgZGlyZWN0b3J5IHVzaW5nIHRoZSBzdHlsZXNoZWV0IG1hbmFnZXIuIEFmdGVyd2FyZHMgeW91IGhhdmUgdG8gY29ubmVjdCB0aGUgc3R5bGVzaGVldCB0byBhbGwgeW91ciB0ZW1wbGF0ZXMgdXNlZCBmb3Igc2tpdHRsZSByZXN1bHQgdGFncy48L3A+Cgo8aDM+SG93IHdpbGwgdGhlIFNraXR0bGUgcmVzdWx0cyBtb2R1bGUgYmUgdXNlZD88L2gzPgo8cD5UaGUgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHdpdGggdGhlIGZvbGxvd2luZyBzbWFydHkgdGFnOiA8Y29kZT57Y21zX21vZHVsZSBtb2R1bGU9ImtlZ2VsZXJnZWJuaXNzZSJ9PC9jb2RlPjwvcD4KCjxoMz5XaGljaCBwYXJhbWV0ZXJzIGNhbiBiZSBnaXZlbiB0byB0aGUgbW9kdWxlPzwvaDM+CjxwPlRoZSBkaWZmZXJlbnQgcG9zc2liaWxpdGllcyB0aGUgbW9kdWxlIGlzIGFibGUgdG8gc2hvdyBpcyBkZXRlcm1pbmVkIGJ5IHRoZSA8Y29kZT5hY3Rpb248L2NvZGU+IHBhcmFtdGVyLi4gVGhlIGZvbGxvd2luZyBleGFtcGxlcyBzaG93IHRoZSB1c2FnZSBvZiBldmVyeSBwb3NzaWJsZSBhY3Rpb24gcGFyYW1ldGVyIHZhbHVlOgo8dWw+CiAgPGxpPjxjb2RlPmFjdGlvbj0iY29tcGxldGV0ZWFtaW5mb3JtYXRpb24iPC9jb2RlPjogSGVyZSBpcyBhbiBleGFtcGxlIHRvIHNob3cgdGhlIGNvbXBsZXRlIHRlYW0gaW5mb3JtYXRpb24gdGhlIHRoZSB0ZWFtICJUU1YgTGFobSBKdWdlbmQgQSAxIiBkdXJpbmcgc2Vhc29uICIyMDExLzIwMTIiOgogIDxici8+PGNvZGU+e2tlZ2VsZXJnZWJuaXNzZSBhY3Rpb249ImNvbXBsZXRldGVhbWluZm9ybWF0aW9uIiBzYWlzb249IjIwMTEvMjAxMiIgdGVhbT0iVFNWIExhaG0gSnVnZW5kIEEgMSJ9PC9jb2RlPjwvbGk+CiAgPGxpPjxjb2RlPmFjdGlvbj0ic2hvd3RlYW10YWJsZSI8L2NvZGU+OiBIZXJlIGlzIGFuIGV4YW1wbGUgdG8gc2hvdyB0aGUgc2NoZWR1bGUgb2YgdGhlIHRlYW0gIlRTViBMYWhtIEp1Z2VuZCBBIDEiIGR1cmluZyBzZWFzb24gIjIwMTEvMjAxMiI6CiAgPGJyLz48Y29kZT57a2VnZWxlcmdlYm5pc3NlIGFjdGlvbj0ic2hvd3RlYW10YWJsZSIgc2Fpc29uPSIyMDExLzIwMTIiIHRlYW09IlRTViBMYWhtIEp1Z2VuZCBBIDEifTwvY29kZT48L2xpPgogIDxsaT48Y29kZT5hY3Rpb249InNob3dnYW1lIjwvY29kZT46IEhlcmUgaXMgYW4gZXhhbXBsZSB0byBzaG93IHRoZSBzZWNvbmQgZ2FtZSBvZiB0aGUgdGVhbSAiVFNWIExhaG0gSnVnZW5kIEEgMSIgZHVyaW5nIHNlYXNvbiAiMjAxMS8yMDEyIjoKICA8YnIvPjxjb2RlPntrZWdlbGVyZ2Vibmlzc2UgYWN0aW9uPSJzaG93Z2FtZSIgc2Fpc29uPSIyMDExLzIwMTIiIHRlYW09IlRTViBMYWhtIEp1Z2VuZCBBIDEiIG51bWJlcj0iMiJ9PC9jb2RlPjwvbGk+CiAgPGxpPjxjb2RlPmFjdGlvbj0ic2hvd2F2ZXJhZ2V0ZWFtIjwvY29kZT4gSGVyZSBpcyBhbiBleGFtcGxlIHRvIHNob3cgdGhlIGF2ZXJhZ2Ugc3RhdGlzdGljcyBvZiB0aGUgdGVhbSAiVFNWIExhaG0gSnVnZW5kIEEgMSIgZHVyaW5nIHNlYXNvbiAiMjAxMS8yMDEyIjoKICA8YnIvPjxjb2RlPntrZWdlbGVyZ2Vibmlzc2UgYWN0aW9uPSJzaG93YXZlcmFnZXRlYW0iIHNhaXNvbj0iMjAxMS8yMDEyIiB0ZWFtPSJUU1YgTGFobSBKdWdlbmQgQSAxIn08L2NvZGU+PC9saT4KICA8bGk+PGNvZGU+YWN0aW9uPSJzaG93YXZlcmFnZXRlYW0xMjAiPC9jb2RlPiBIZXJlIGlzIGFuIGV4YW1wbGUgdG8gc2hvdyB0aGUgYXZlcmFnZSBzdGF0aXN0aWNzIG9mIHRoZSB0ZWFtICJUU1YgTGFobSBKdWdlbmQgQSAxIiBkdXJpbmcgc2Vhc29uICIyMDExLzIwMTIiIGluIDEyMCBiYWxsIHN5c3RlbToKICA8YnIvPjxjb2RlPntrZWdlbGVyZ2Vibmlzc2UgYWN0aW9uPSJzaG93YXZlcmFnZXRlYW0xMjAiIHNhaXNvbj0iMjAxMS8yMDEyIiB0ZWFtPSJUU1YgTGFobSBKdWdlbmQgQSAxIn08L2NvZGU+PC9saT4KICA8bGk+PGNvZGU+YWN0aW9uPSJzaG93bGF0ZXN0cmVzdWx0cyI8L2NvZGU+IEhlcmUgaXMgYW4gZXhhbXBsZSB0byBzaG93IHRoZSBsYXRlc3QgcmVzdWx0cyBvZiBhbGwgdGVhbSBkdXJpbmcgdGhlIGxhc3QgMTQgZGF5czoKICA8YnIvPjxjb2RlPntrZWdlbGVyZ2Vibmlzc2UgYWN0aW9uPSJzaG93bGF0ZXN0cmVzdWx0cyIgZGF5cz0iLTE0In08L2NvZGU+PC9saT4KICA8bGk+PGNvZGU+YWN0aW9uPSJ4bHN0ZWFtdGFibGUiPC9jb2RlPiBIZXJlIGlzIGFuIGV4YW1wbGUgdG8gc2hvdyB0aGUgdGVhbSBzY2hlZHVsZSBvZiAiVFNWIExhaG0gSnVnZW5kIEEgMSIgZHVyaW5nIHNlYXNvbiAiMjAxMS8yMDEyIiB1c2luZyBFeGNlbC0yMDA3IGZvcm1hdAogIDxici8+PGNvZGU+e2tlZ2VsZXJnZWJuaXNzZSBhY3Rpb249Inhsc3RlYW10YWJsZSIgc2Fpc29uPSIyMDExLzIwMTIiIHRlYW09IlRTViBMYWhtIEp1Z2VuZCBBMSIgbGlua3R5cGU9Inhsc3gifTwvY29kZT48L2xpPgogIDxsaT48Y29kZT5hY3Rpb249InNob3dwbGF5ZXJyZXN1bHRzIjwvY29kZT4gSGVyZSBpcyBhbiBleGFtcGxlIHRvIHNob3cgdGhlIGluZm9ybWF0aW9uIG9mIHBsYXllciAiR2VyYWxkIEx1dHRlciIgZHVyaW5nIHNlYXNvbiAiMjAxMS8yMDEyIiBhcyBtZW1iZXIgb2YgdGVhbSAiVFNWIExhaG0gSGVycmVuIDEiCiAgPGJyLz48Y29kZT57a2VnZWxlcmdlYm5pc3NlIGFjdGlvbj0ic2hvd3BsYXllcnJlc3VsdHMiIHNhaXNvbj0iMjAxMS8yMDEyIiB0ZWFtPSJUU1YgTGFobSBIZXJyZW4gMSJ9PC9jb2RlPjwvbGk+CiAgPGxpPjxjb2RlPmFjdGlvbj0ic2hvd3BsYXllcnJlc3VsdHMxMjAiPC9jb2RlPiBIZXJlIGlzIGFuIGV4YW1wbGUgdG8gc2hvdyB0aGUgaW5mb3JtYXRpb24gb2YgcGxheWVyICJHZXJhbGQgTHV0dGVyIiBkdXJpbmcgc2Vhc29uICIyMDExLzIwMTIiIGFzIG1lbWJlciBvZiB0ZWFtICJUU1YgTGFobSBIZXJyZW4gMSIgaW4gMTIwIGJhbGwgc3lzdGVtCiAgPGJyLz48Y29kZT57a2VnZWxlcmdlYm5pc3NlIGFjdGlvbj0ic2hvd3BsYXllcnJlc3VsdHMxMjAiIHNhaXNvbj0iMjAxMS8yMDEyIiB0ZWFtPSJUU1YgTGFobSBIZXJyZW4gMSJ9PC9jb2RlPjwvbGk+CjwvdWw+CjwvcD4KCjwvcD4KSWYgeW91IGhhdmUgaW5zdGFsbGVkIHRoZSBUaW55TUNFIGVkaXRvciwgdGhlbiB5b3Ugb25seSBoYXZlIHRvIGFjdGl2YXRlIHRoZSA8Y29kZT5rZWdlbGVyZ2Vibmlzc2VfaW5zZXJ0PC9jb2RlPiBwbHVnaW4gYW5kIGFkZCB0aGlzIHRhZyB0byB0aGUgYWRtaW4gcGFuZWwuCk5vdyBhIGJ1dHRvbiBzaG91bGQgYXBwZWFyIGluc2lkZSB0aGUgVGlueU1DRSBFZGl0b3Igd2hlcmUgeW91IGNhbiBpbnNlcnQgdGhlIGNvbnRlbnQgZGVzY3JpYmVkIGFib3ZlIGJ5IHNpbXBseSBjbGlja2luZyB0aGUgaXRlbXMgb2YgdGhlIGJ1dHRvbm1lbnUuCjwvcD4KCjxoMz5TdXBwb3J0PC9oMz4KPHA+QXMgcGVyIHRoZSBHUEwsIHRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYXMtaXMuIFBsZWFzZSByZWFkIHRoZSB0ZXh0IG9mIHRoZSBsaWNlbnNlIGZvciB0aGUgZnVsbCBkaXNjbGFpbWVyLjwvcD4KCjxoMz5Db3B5cmlnaHQgYW5kIExpY2Vuc2U8L2gzPgo8cD5Db3B5cmlnaHQgJmNvcHk7IDIwMTIsIEdlcmFsZCBMdXR0ZXIgPGEgaHJlZj0ibWFpbHRvOmdlcmFsZEBpdHpncnVuZC5uZXQiPiZsdDtnZXJhbGRAaXR6Z3J1bmQubmV0Jmd0OzwvYT4uIEFsbCBSaWdodHMgQXJlIFJlc2VydmVkLjwvcD4KPHA+VGhpcyBtb2R1bGUgaGFzIGJlZW4gcmVsZWFzZWQgdW5kZXIgdGhlIDxhIGhyZWY9Imh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9saWNlbnNlcy5odG1sI0dQTCI+R05VIFB1YmxpYyBMaWNlbnNlPC9hPi4gWW91IG11c3QgYWdyZWUgdG8gdGhpcyBsaWNlbnNlIGJlZm9yZSB1c2luZyB0aGUgbW9kdWxlLjwvcD4KPHA+VGhpcyBtb2R1bGUgdXNlcyB0aGUgUEhQRXhjZWwgbGlicmFyeSBhdmFpbGFibGUgZnJvbSA8YSBocmVmPSJodHRwOi8vcGhwZXhjZWwuY29kZXBsZXguY29tIj5odHRwOi8vcGhwZXhjZWwuY29kZXBsZXguY29tPC9hPi4gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZQo8YSBocmVmPSJodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvb2xkLWxpY2Vuc2VzL2xncGwtMi4xIj5MZXNzZXIgR05VIFB1YmxpYyBMaWNlbnNlIC0gMi4xPC9hPi4gWW91IGhhdmUgdG8gYWdyZWUgdG8gdGhpcyBsaWNlbnNlIGlmIHlvdSB3YW50IHRvIHVzZSB0aGUgeGxzIGV4cG9ydApmdW5jdGlvbnMgb2YgdGhpcyBtb2R1bGUuPC9wPjxoMz5QYXJhbWV0ZXJzPC9oMz48dWw+PGxpPjxlbT4ob3B0aW9uYWwpPC9lbT4gbGFuZz0iZW5fVVMiIC0gRGllc2VyIFBhcmFtZXRlciBsZWd0IGRpZSBTcHJhY2hlIGZlc3QsIGRpZSB2b20gTW9kdWwgZiZ1dW1sO3IgZGllIEF1c2dhYmUgYXVmIGRlciBXZWJzZWl0ZSB2ZXJ3ZW5kZXQgd2lyZC4gRGllcyB3aXJkIGplZG9jaCBuaWNodCB2b24gYWxsZW4gTW9kdWxlbiB1bnRlcnN0JnV1bWw7dHp0IGJ6dy4gYmVuJm91bWw7dGlndC48L2xpPjxsaT5hY3Rpb249IiIgLSBEZXIgUGFyYW1ldGVyIDxjb2RlPmFjdGlvbjwvY29kZT4gZ2lidCBhbiwgd2FzIGRhcyBQbHVnaW4gYW56ZWlnZW4gc29sbC4gSmUgbmFjaCBJbmhhbHQgaGF0IGVyIG5vY2ggd2VpdGVyZSBTdWJwYXJhbWV0ZXIuCjx1bD4KPGxpPjxjb2RlPmNvbXBsZXRldGVhbWluZm9ybWF0aW9uPC9jb2RlPjogWmVpZ3Qgc8OkbXRsaWNoZSBEYXRlbiDDvGJlciBlaW5lIE1hbm5zY2hhZnQgYW4gKFNwaWVscGxhbiwgU3BpZWxlLCBTY2huaXR0bGlzdGUpPC9saT4KPGxpPjxjb2RlPnNob3d0ZWFtdGFibGU8L2NvZGU+OiBaZWlndCBkZW4gU3BpZWxwbGFuIGVpbmVyIE1hbm5zY2hhZnQgYW4uPC9saT4KPGxpPjxjb2RlPnNob3dnYW1lPC9jb2RlPjogWmVpZ3QgZWluZW4gU3BpZWxiZXJpY2h0IGbDvHIgZWluIGJlbGllYmlnZXMgU3BpZWwgYW4uPC9saT4KPGxpPjxjb2RlPnNob3dhdmVyYWdldGVhbTwvY29kZT46IFplaWd0IGRpZSBTY2huaXR0bGlzdGUgZGVyIE1hbm5zY2hhZnQgc293aWUgZGVyIGVpbnplbG5lbiBTcGllbGVyIGFuLjwvbGk+CjxsaT48Y29kZT5zaG93bGF0ZXN0cmVzdWx0czwvY29kZT46IFplaWd0IGVpbmVuIEF1c3NjaG5pdHQgZGVzIFNwaWVscGxhbnMgYWxsZXIgTWFubnNjaGFmdGVuIGFuPC9saT4KPGxpPjxjb2RlPnhsc3RlYW10YWJsZTwvY29kZT46IEdpYnQgZGVzIFNwaWVscGxhbiBlaW5lciBNYW5uc2NoYWZ0IGFscyBFeGNlbC1UYWJlbGxlIG9kZXIgaUNhbGVuZGFyIHp1csO8Y2s8L2xpPgo8bGk+PGNvZGU+c2hvd3BsYXllcnJlc3VsdHM8L2NvZGU+OiBHaWJ0IEluZm9ybWF0aW9uZW4gw7xiZXIgZWluZW4gU3BpZWxlciB6dXLDvGNrLiBFaW5zY2hyw6Rua3VuZyBhdWYgTWFubnNjaGFmdCB1bmQvb2RlciBTYWlzb24gbcO2Z2xpY2guPC9saT4KPGxpPjxjb2RlPnNob3dwbGF5ZXJyZXN1bHRzMTIwPC9jb2RlPjogR2lidCBJbmZvcm1hdGlvbmVuIMO8YmVyIGVpbmVuIFNwaWVsZXIgaW0gMTIwIFd1cmYgU3lzdGVtIHp1csO8Y2suIEVpbnNjaHLDpG5rdW5nIGF1ZiBNYW5uc2NoYWZ0IHVuZC9vZGVyIFNhaXNvbiBtw7ZnbGljaC48L2xpPgo8bGk+PGNvZGU+c2hvd2F2ZXJhZ2V0ZWFtMTIwPC9jb2RlPjogWmVpZ3QgZGllIFNjaG5pdHRsaXN0ZSBkZXIgTWFubnNjaGFmdCBzb3dpZSBkZXIgZWluemVsbmVuIFNwaWVsZXIgaW0gMTIwIFd1cmYgU3lzdGVtIGFuLjwvbGk+CjwvdWw+PC9saT48bGk+PGVtPihvcHRpb25hbCk8L2VtPiBzYWlzb249IiIgLSBEZXIgUGFyYW1ldGVyIDxjb2RlPnNhaXNvbjwvY29kZT4gZ2lidCBhbiwgYXVzIHdlbGNoZXIgU2Fpc29uIGV0d2FzIGFuZ2V6ZWlndCB3ZXJkZW4gc29sbC4gRXIgaXN0IG51ciBzaW5udm9sbCBiZWkgZm9sZ2VuZGVuIFdlcnRlbiBkZXMgPGNvZGU+YWN0aW9uPC9jb2RlPiBQYXJhbWV0ZXJzOgo8dWw+CjxsaT48Y29kZT5jb21wbGV0ZXRlYW1pbmZvcm1hdGlvbjwvY29kZT4gKG5vdHdlbmRpZyk8L2xpPgo8bGk+PGNvZGU+c2hvd3RlYW10YWJsZTwvY29kZT4gKG5vdHdlbmRpZyk8L2xpPgo8bGk+PGNvZGU+c2hvd2dhbWU8L2NvZGU+IChub3R3ZW5kaWcpPC9saT4KPGxpPjxjb2RlPnNob3dhdmVyYWdldGVhbTwvY29kZT4gKG5vdHdlbmRpZyk8L2xpPgo8bGk+PGNvZGU+c2hvd2F2ZXJhZ2V0ZWFtMTIwPC9jb2RlPiAobm90d2VuZGlnKTwvbGk+CjxsaT48Y29kZT54bHN0ZWFtdGFibGU8L2NvZGU+IChub3R3ZW5kaWcpPC9saT4KPGxpPjxjb2RlPnNob3dwbGF5ZXJyZXN1bHRzPC9jb2RlPiAob3B0aW9uYWwpIC0gU2NocsOkbmt0IGRpZSBTcGllbGVyZ2Vibmlzc2UgYXVmIGRpZSBTYWlzb24gZWluLjwvbGk+CjxsaT48Y29kZT5zaG93cGxheWVycmVzdWx0czEyMDwvY29kZT4gKG9wdGlvbmFsKSAtIFNjaHLDpG5rdCBkaWUgU3BpZWxlcmdlYm5pc3NlIGF1ZiBkaWUgU2Fpc29uIGVpbi48L2xpPgo8L3VsPjwvbGk+PGxpPjxlbT4ob3B0aW9uYWwpPC9lbT4gdGVhbT0iIiAtIERlciBQYXJhbWV0ZXIgPGNvZGU+dGVhbTwvY29kZT4gZ2lidCBhbiwgdm9uIHdlbGNoZXIgTWFubnNjaGFmdCBldHdhcyBhbmdlemVpZ3Qgd2VyZGVuIHNvbGwuIEVyIGlzdCBudXIgc2lubnZvbGwgYmVpIGZvbGdlbmRlbiBXZXJ0ZW4gZGVzIDxjb2RlPmFjdGlvbjwvY29kZT4gUGFyYW1ldGVyczoKPHVsPgo8bGk+PGNvZGU+Y29tcGxldGV0ZWFtaW5mb3JtYXRpb248L2NvZGU+IChub3R3ZW5kaWcpPC9saT4KPGxpPjxjb2RlPnNob3d0ZWFtdGFibGU8L2NvZGU+IChub3R3ZW5kaWcgLSBoaWVyIGlzdCBhdWNoIGRlciBXZXJ0ICJhbGwiIGbDvHIgYWxsZSBNYW5uc2NoYWZ0ZW4gbcO2Z2xpY2gpPC9saT4KPGxpPjxjb2RlPnNob3dnYW1lPC9jb2RlPiAobm90d2VuZGlnKTwvbGk+CjxsaT48Y29kZT5zaG93YXZlcmFnZXRlYW08L2NvZGU+IChub3R3ZW5kaWcpPC9saT4KPGxpPjxjb2RlPnNob3dhdmVyYWdldGVhbTEyMDwvY29kZT4gKG5vdHdlbmRpZyk8L2xpPgo8bGk+PGNvZGU+eGxzdGVhbXRhYmxlPC9jb2RlPiAobm90d2VuZGlnKTwvbGk+CjxsaT48Y29kZT5zaG93cGxheWVycmVzdWx0czwvY29kZT4gKG9wdGlvbmFsKSAtIFNjaHLDpG5rdCBkaWUgU3BpZWxlcmVyZ2Vibmlzc2UgYXVmIGRhcyBUZWFtIGVpbi48L2xpPgo8bGk+PGNvZGU+c2hvd3BsYXllcnJlc3VsdHMxMjA8L2NvZGU+IChvcHRpb25hbCkgLSBTY2hyw6Rua3QgZGllIFNwaWVsZXJlcmdlYm5pc3NlIGF1ZiBkYXMgVGVhbSBlaW4uPC9saT4KPC91bD48L2xpPjxsaT48ZW0+KG9wdGlvbmFsKTwvZW0+IG51bWJlcj0iIiAtIERlciBQYXJhbWV0ZXIgPGNvZGU+bnVtYmVyPC9jb2RlPiBnaWJ0IGFuLCB3ZWxjaGVzIFNwaWVsIChjaHJvbm9sb2dpc2NoIGdlb3JkbmV0KSBlaW5lciBNYW5uc2NoYWZ0IHfDpGhyZW5kIGVpbmVyIGdlZ2ViZW5lbiBTYWlzb24gYW5nZXplaWd0IHdlcmRlbiBzb2xsIHVuZCBpc3QgZGFoZXIgbnVyIGbDvHIgZWluZW4gV2VydCBkZXMgPGNvZGU+YWN0aW9uPC9jb2RlPiBQYXJhbWV0ZXJzIGfDvGx0aWc6Cjx1bD4KPGxpPjxjb2RlPnNob3dnYW1lPC9jb2RlPiAobm90d2VuZGlnKTwvbGk+CjwvdWw+PC9saT48bGk+PGVtPihvcHRpb25hbCk8L2VtPiBkYXlzPSIiIC0gRGVyIFBhcmFtZXRlciA8Y29kZT5kYXlzPC9jb2RlPiBnaWJ0IGFuLCB3aWV2aWVsZSBUYWdlIGluIGRpZSBadWt1bmZ0IChkYXlzID4gMCkgb2RlciBpbiBkaWUgVmVyZ2FuZ2VuaGVpdCAoZGF5cyA8IDApIGdlc2NoYXV0IHdlcmRlbiBzb2xsLCB1bSBkaWUgRXJnZWJuaXNzZSBhbGxlciBNYW5uc2NoYWZ0ZW4gYWJ6dXJ1ZmVuIHVuZCBpc3QgZGFoZXIgbnVyIGbDvHIgZm9sZ2VuZGVuIFdlcnQgZGVzIDxjb2RlPmFjdGlvbjwvY29kZT4gUGFyYW1ldGVycyBnw7xsdGlnOgo8dWw+CjxsaT48Y29kZT5zaG93bGF0ZXN0cmVzdWx0czwvY29kZT4gKG5vdHdlbmRpZyk8L2xpPgo8L3VsPjwvbGk+PGxpPjxlbT4ob3B0aW9uYWwpPC9lbT4gbGlua3R5cGU9IiIgLSBEZXIgUGFyYW1ldGVyIDxjb2RlPmxpbmt0eXBlPC9jb2RlPiBlbnRzY2hlaWRldCBpbiB3ZWxjaGVtIEZvcm1hdCBkZXIgU3BpZWxwbGFuIHp1csO8Y2tnZWdlYmVuIHdlcmRlbiBzb2xsLiBGb2xnZW5kZSBXZXJ0ZSBzaW5kIHZvcmdlc2VoZW46Cjx1bD4KPGxpPjxjb2RlPnhsczwvY29kZT46IFLDvGNrZ2FiZSBkZXMgU3BpZWxwbGFucyBlaW5lcyBUZWFtcyBpbSBFeGNlbC0yMDAzIEZvcm1hdC4KPGxpPjxjb2RlPnhsc3g8L2NvZGU+OiBSw7xja2dhYmUgZGVzIFNwaWVscGxhbnMgZWluZXMgVGVhbXMgaW0gRXhjZWwtMjAwNy8yMDEwIEZvcm1hdC4KPGxpPjxjb2RlPmljczwvY29kZT46IFLDvGNrZ2FiZSBkZXMgU3BpZWxwbGFucyBhbHMgaWNzIEthbGVuZGVyIERhdGVpLgo8L3VsPgpEZXIgUGFyYW1ldGVyIGlzdCBudXIgZsO8ciBkaWUgZm9sZ2VuZGVuIFdlcnRlIGRlcyA8Y29kZT5hY3Rpb248L2NvZGU+IFBhcmFtZXRlcnMgZ8O8bHRpZzoKPHVsPgo8bGk+PGNvZGU+eGxzdGVhbXRhYmxlPC9jb2RlPiAobm90d2VuZGlnKTwvbGk+CjwvdWw+PC9saT48bGk+PGVtPihvcHRpb25hbCk8L2VtPiB4bHNsaW5rPSJub25lIiAtIERlciBQYXJhbWV0ZXIgPGNvZGU+eGxzbGluazwvY29kZT4gZW50c2NoZWlkZXQgaW4gd2VsY2hlbSBMaW5rcyBmw7xyIGVpbiBEYXR1bSBhdXNnZWdlYmVuIHdlcmRlbiBzb2xsZW4uIEZvbGdlbmRlIFdlcnRlIHNpbmQgdm9yZ2VzZWhlbiB1bmQga8O2bm5lbiBiZWxpZWJpZyBrb21iaW5pZXJ0IHdlcmRlbiAoZHVyY2ggIiwiIGdldHJlbm50KToKPHVsPgo8bGk+PGNvZGU+eGxzPC9jb2RlPjogQXVzZ2FiZSBlaW5lcyBMaW5rcyBmw7xyIGVpbiBFeGNlbC0yMDAzIEZpbGU8L2xpPgo8bGk+PGNvZGU+eGxzeDwvY29kZT46IEF1c2dhYmUgZWluZXMgTGlua3MgZsO8ciBlaW4gRXhjZWwtMjAwNy8yMDEwIEZpbGU8L2xpPgo8bGk+PGNvZGU+aWNzPC9jb2RlPjogQXVzZ2FiZSBlaW5lcyBMaW5rcyBmw7xyIGVpbiBpY3MgS2FsZW5kZXIgRmlsZTwvbGk+CjxsaT48Y29kZT5ub25lPC9jb2RlPjogRGVmYXVsdHdlcnQsIGtlaW4gTGluayBzb2xsIGF1c2dlZ2ViZW4gd2VyZGVuLiBTb2JhbGQgZGllc2VyIFdlcnQgaW4gZGVyIExpc3RlIHZvcmhhbmRlbiBpc3QsIHdpcmQga2VpbiBMaW5rIGF1c2dlZ2ViZW4uPC9saT4KPC91bD4KRGVyIFBhcmFtZXRlciBpc3QgbnVyIGbDvHIgZGllIGZvbGdlbmRlbiBXZXJ0ZSBkZXMgPGNvZGU+YWN0aW9uPC9jb2RlPiBQYXJhbWV0ZXJzIGfDvGx0aWc6Cjx1bD4KPGxpPjxjb2RlPmNvbXBsZXRldGVhbWluZm9ybWF0aW9uPC9jb2RlPiAob3B0aW9uYWwpPC9saT4KPGxpPjxjb2RlPnNob3d0ZWFtdGFibGU8L2NvZGU+IG51ciBnw7xsdGlnLCB3ZW5uIG5pY2h0IGRlciBXZXJ0ICJhbGwiIGbDvHIgZGVuIFBhcmFtZXRlciA8Y29kZT50ZWFtPC9jb2RlPiBhdXNnZXfDpGhsdCB3dXJkZS4gKG9wdGlvbmFsKTwvbGk+CjwvdWw+PC9saT48bGk+PGVtPihvcHRpb25hbCk8L2VtPiBwbGF5ZXI9IiIgLSBEZXIgUGFyYW1ldGVyIDxjb2RlPnBsYXllcjwvY29kZT4gZW50c2NoZWlkZXQsIGbDvHIgd2VsY2hlbiBTcGllbGVyIEluZm9ybWF0aW9uZW4gYW5nZXplaWd0IHdlcmRlbiBzb2xsZW4uIEZvbGdlbmRlIFdlcnRlIHNpbmQgdm9yZ2VzZWhlbjoKPHVsPgo8bGk+PGNvZGU+U3BpZWxlcm5hbWU8L2NvZGU+OiBEZXIgTmFtZSBkZXMgU3BpZWxlcnMgKHZvcnNpY2h0LCBrw7ZubnRlIG5pY2h0IGVpbmRldXRpZyBzZWluISk8L2xpPgo8bGk+PGNvZGU+U3BpZWxlcmlkPC9jb2RlPjogRGllIElkIGRlcyBTcGllbGVycyBpbm5lcmhhbGIgZGVyIERhdGVuYmFuayAoYXVmIGplZGVuIEZhbGwgZWluZGV1dGlnKTwvbGk+CjwvdWw+CkRlciBQYXJhbWV0ZXIgaXN0IG51ciBmw7xyIGRpZSBmb2xnZW5kZW4gV2VydGUgZGVzIDxjb2RlPmFjdGlvbjwvY29kZT4gUGFyYW1ldGVycyBnw7xsdGlnOgo8dWw+CjxsaT48Y29kZT5zaG93cGxheWVycmVzdWx0czwvY29kZT4gKG5vdHdlbmRpZyk8L2xpPgo8bGk+PGNvZGU+c2hvd3BsYXllcnJlc3VsdHMxMjA8L2NvZGU+IChub3R3ZW5kaWcpPC9saT4KPC91bD48L2xpPjwvdWw+]]></help>
	<about><![CDATA[PGJyIC8+QXV0aG9yOiBHZXJhbGQgTHV0dGVyICZsdDtnZXJhbGRAaXR6Z3J1bmQubmV0Jmd0OzxiciAvPjxiciAvPlZlcnNpb246IDAuMC45PGJyIC8+PGJyIC8+Q2hhbmdlIEhpc3Rvcnk6PGJyIC8+PHVsPgo8bGk+VmVyc2lvbiAwLjAuMSAtIDIuIEphbnVhciAyMDEyLiBGaXJzdCBSZWxlYXNlLjwvbGk+CjxsaT5WZXJzaW9uIDAuMC4yIC0gMTkuIEFwcmlsIDIwMTIuIE5vIG5ldyBmZWF0dXJlcyBidXQgYWRkZWQgdXNlZnVsbCBkb2N1bWVudGF0aW9uLjwvbGk+CjxsaT5WZXJzaW9uIDAuMC4zIC0gMjcuIEFwcmlsIDIwMTIuIENoYW5nZWQgZG9jdW1lbnRhdGlvbiBhbmQgYWRkZWQgcGFyYW1ldGVyIHNob3dsYXRlc3RyZXN1bHRzIGFuZCB0aGUgbmVjZXNzYXJ5IHRlbXBsYXRlczwvbGk+CjxsaT5WZXJzaW9uIDAuMC40IC0gMjguIEFwcmlsIDIwMTIuIGFkZGVkIFRpbnlNQ0UgaW50ZWdyYXRpb248L2xpPgo8bGk+VmVyc2lvbiAwLjAuNSAtIDIuIFNlcHRlbWJlciAyMDEyLiAKICAgICAgICAgICAgICAgICAgICA8YnIvPmFkZGVkIHRlYW0gc2NoZWR1bGUgb3V0cHV0IHVzaW5nIHhscy9wZGYvaWNzIGZvcm1hdC4KICAgICAgICAgICAgICAgICAgICA8YnIvPk1hZGUgaXQgT25lRWxldmVuIGNvbXBhdGlibGUKICAgICAgICAgICAgICAgICAgICA8YnIvPkFkZGluZyBqYXZhIHNjcmlwdCBjb2RlIHRvIHlvdXIgdGVtcGxhdGUgaXMgbm90IG5lY2Vzc2FyeSBhbnltb3JlPC9saT4KPGxpPlZlcnNpb24gMC4wLjYgLSA2LiBTZXB0ZW1iZXIgMjAxMi4KCQkJCSA8YnIvPlJlbW92ZWQgcGRmIHN1cHBvcnQgKGJlY2F1c2Ugb2YgZmlsZXNpemUgb2YgdGhlIG1vZHVsZSkKCQkJCSA8YnIvPmNoYW5nZWQgbWV0aG9kIGZyb20gcG9zdCB0byBtZXRob2QgZ2V0LCBvdGhlcndpc2UgdGVhbXRhYmxlcyBpbiB4bHN7eH0vaWNzIG9ubHkgd29yayBvbiBtYWluIHBhZ2U8L2xpPgo8bGk+VmVyc2lvbiAwLjAuNyAtIDEwLiBTZXB0ZW1iZXIgMjAxMgoJCQkJPGJyLz5BZGRlZCBhY3Rpb24gcGFyYW1ldGVyIHNob3dwbGF5ZXJyZXN1bHRzCgkJCQk8YnIvPkNoYW5nZWQgY29tcGxldGV0ZWFtaW5mb3JtYXRpb24gdGFnIChhZGRlZCBzaG93cGxheWVycmVzdWx0cyk8L2xpPgo8bGk+VmVyc2lvbiAwLjAuOCAtIDMwLiBTZXB0ZW1iZXIgMjAxNC4KCQkJCTxici8+Rmlyc3QgdmVyc2lvbiB0aGF0IHN1cHBvcnRzIDEyMCBCYWxsIHN5c3RlbTwvbGk+CjxsaT5WZXJzaW9uIDAuMC45IC0gMTYuIEF1Z3VzdCAyMDE1LgoJCQkJPGJyLz5TdGF0aXN0aWNzIGZvciAxMjAgQmFsbCBzeXN0ZW0gYWRkZWQgZm9yIFRlYW1zIGFuZCBQbGF5ZXJzPC9saT4KPC91bD48YnIgLz4=]]></about>
	<description><![CDATA[Here you can manage your teams. There is no option to delete data you have put in. It is only possible to add new data or to alter existing data.]]></description>
	<file>
	  <filename>/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/action.addGame.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKaWYgKCFpc3NldCgkZ0NtcykpIGV4aXQ7CgppZiAoISAkdGhpcy0+Q2hlY2tBY2Nlc3MoJ0tlZ2VsZXJnZWJuaXNzZScpKQoJewoJcmV0dXJuICR0aGlzLT5EaXNwbGF5RXJyb3JQYWdlKCRpZCwgJHBhcmFtcywgJHJldHVybmlkLCR0aGlzLT5MYW5nKCdhY2Nlc3NkZW5pZWQnKSk7Cgl9CgovKiAtPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LQoKICAgQ29kZSBmb3Iga2VnZWxlcmdlYm5pc3NlICJhZGRHYW1lIiBhZG1pbiBhY3Rpb24KICAgCiAgIC09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tCiAgIAogICBUeXBpY2FsbHksIHRoaXMgd2lsbCBkaXNwbGF5IHNvbWV0aGluZyBmcm9tIGEgdGVtcGxhdGUKICAgb3IgZG8gc29tZSBvdGhlciB0YXNrLgogICAKKi8KJG1hY3RfdmFycyA9IGV4cGxvZGUoIiwiLCAkX1BPU1RbJ21hY3QnXSk7CiRnYW1laWQgPSAwOwokdGVhbSA9IERhdGFiYXNlT3BlcmF0aW9uczo6Z2V0VGVhbSgkX1BPU1RbJ3NwaWVscGxhbl90ZWFtJ10pOwokaG9tZSA9IChpc3NldCgkX1BPU1RbJ2dhbWVhZGRfaG9tZSddKSAmJiAoJF9QT1NUWydnYW1lYWRkX2hvbWUnXSA9PSB0cnVlKSkgPyB0cnVlOmZhbHNlOwokaXMxMjAgPSAoaXNzZXQoJF9QT1NUWydnYW1lYWRkXzEyMCddKSAmJiAoJF9QT1NUWydnYW1lYWRkXzEyMCddID09IHRydWUpKSA/IHRydWU6ZmFsc2U7CiRuZXdnYW1lID0gbmV3IEdhbWUoJGdhbWVpZCwKCSR0ZWFtLAoJJF9QT1NUWydnYW1lYWRkX29wcG9uZW50J10sCglEYXRlVGltZTo6Y3JlYXRlRnJvbUZvcm1hdCgiZC5tLlkgSDppIiwgJF9QT1NUWydnYW1lYWRkX2RhdGUnXS4iICIuJF9QT1NUWydnYW1lYWRkX3RpbWUnXSksCgkkaG9tZSwKICAgICRpczEyMCk7CkRhdGFiYXNlT3BlcmF0aW9uczo6Y3JlYXRlR2FtZSgkbmV3Z2FtZSk7CgkKaW5jbHVkZSgnYWN0aW9uLmRlZmF1bHRhZG1pbi5waHAnKTsKCgo/Pgo=]]></data>
	</file>
	<file>
	  <filename>/action.addPlayer.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKaWYgKCFpc3NldCgkZ0NtcykpIGV4aXQ7CgppZiAoISAkdGhpcy0+Q2hlY2tBY2Nlc3MoJ0tlZ2VsZXJnZWJuaXNzZScpKQoJewoJcmV0dXJuICR0aGlzLT5EaXNwbGF5RXJyb3JQYWdlKCRpZCwgJHBhcmFtcywgJHJldHVybmlkLCR0aGlzLT5MYW5nKCdhY2Nlc3NkZW5pZWQnKSk7Cgl9CgovKiAtPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LQoKICAgQ29kZSBmb3Iga2VnZWxlcmdlYm5pc3NlICJhZGRQbGF5ZXIiIGFkbWluIGFjdGlvbgogICAKICAgLT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS0KICAgCiAgIFR5cGljYWxseSwgdGhpcyB3aWxsIGRpc3BsYXkgc29tZXRoaW5nIGZyb20gYSB0ZW1wbGF0ZQogICBvciBkbyBzb21lIG90aGVyIHRhc2suCiAgIAoqLwoKLyogd29yayBvbiB0aGUgcG9zdCByZXF1ZXN0ICovCiRtYWN0X3ZhcnMgPSBleHBsb2RlKCIsIiwgJF9QT1NUWydtYWN0J10pOwokcGxheWVyaWQgPSAkbWFjdF92YXJzWzFdOwpEYXRhYmFzZU9wZXJhdGlvbnM6OmNyZWF0ZVBsYXllcigkX1BPU1RbJ3BsYXllcmFkZF9uYW1lJ10pOwoJCmluY2x1ZGUoJ2FjdGlvbi5kZWZhdWx0YWRtaW4ucGhwJyk7CgoKPz4=]]></data>
	</file>
	<file>
	  <filename>/action.addPlayerToTeam.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKcmVxdWlyZV9vbmNlKCdkYXRhbW9kZWwvZGF0YWJhc2VvcGVyYXRpb25zLnBocCcpOwoKaWYgKCFpc3NldCgkZ0NtcykpIGV4aXQ7CmlmICghICR0aGlzLT5DaGVja0FjY2VzcygnS2VnZWxlcmdlYm5pc3NlJykpCgl7CglyZXR1cm4gJHRoaXMtPkRpc3BsYXlFcnJvclBhZ2UoJGlkLCAkcGFyYW1zLCAkcmV0dXJuaWQsJHRoaXMtPkxhbmcoJ2FjY2Vzc2RlbmllZCcpKTsKCX0KCi8qIC09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tCgogICBDb2RlIGZvciBrZWdlbGVyZ2Vibmlzc2UgImFkZFBsYXllclRvVGVhbSIgYWN0aW9uCgogICAtPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LQogICAKICAgVHlwaWNhbGx5LCB0aGlzIHdpbGwgZGlzcGxheSBzb21ldGhpbmcgZnJvbSBhIHRlbXBsYXRlCiAgIG9yIGRvIHNvbWUgb3RoZXIgdGFzay4KICAgCiovCiRwbGF5ZXIgPSBEYXRhYmFzZU9wZXJhdGlvbnM6OmdldFBsYXllcigkX1BPU1RbJ3B0dGFkZF9wbGF5ZXInXSk7CiR0ZWFtID0gRGF0YWJhc2VPcGVyYXRpb25zOjpnZXRUZWFtKCRfUE9TVFsncHR0YWRkX3RlYW0nXSk7CiRzYWlzb24gPSBEYXRhYmFzZU9wZXJhdGlvbnM6OmdldFNhaXNvbigkX1BPU1RbJ3B0dF9zYWlzb24nXSk7CgpEYXRhYmFzZU9wZXJhdGlvbnM6OmNyZWF0ZVBsYXllclRvVGVhbSgkcGxheWVyLCAkdGVhbSwgJHNhaXNvbik7CgppbmNsdWRlKCdhY3Rpb24uRWRpdFBsYXllclRvVGVhbS5waHAnKTsKPz4=]]></data>
	</file>
	<file>
	  <filename>/action.addSaison.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKaWYgKCFpc3NldCgkZ0NtcykpIGV4aXQ7CgppZiAoISAkdGhpcy0+Q2hlY2tBY2Nlc3MoJ0tlZ2VsZXJnZWJuaXNzZScpKQoJewoJcmV0dXJuICR0aGlzLT5EaXNwbGF5RXJyb3JQYWdlKCRpZCwgJHBhcmFtcywgJHJldHVybmlkLCR0aGlzLT5MYW5nKCdhY2Nlc3NkZW5pZWQnKSk7Cgl9CgovKiAtPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LQoKICAgQ29kZSBmb3Iga2VnZWxlcmdlYm5pc3NlICJhZGRTYWlzb24iIGFkbWluIGFjdGlvbgogICAKICAgLT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS0KICAgCiAgIFR5cGljYWxseSwgdGhpcyB3aWxsIGRpc3BsYXkgc29tZXRoaW5nIGZyb20gYSB0ZW1wbGF0ZQogICBvciBkbyBzb21lIG90aGVyIHRhc2suCiAgIAoqLwoKLyogd29yayBvbiB0aGUgcG9zdCByZXF1ZXN0ICovCiRtYWN0X3ZhcnMgPSBleHBsb2RlKCIsIiwgJF9QT1NUWydtYWN0J10pOwokc2Fpc29uaWQgPSAkbWFjdF92YXJzWzFdOwokc2Fpc29uID0gbmV3IFNhaXNvbigwLCAkX1BPU1RbJ3NhaXNvbmFkZF9uYW1lJ10sIERhdGVUaW1lOjpjcmVhdGVGcm9tRm9ybWF0KCJkLm0uWSBIOmkiLCAkX1BPU1RbJ3NhaXNvbmFkZF9iZWdpbiddKSxEYXRlVGltZTo6Y3JlYXRlRnJvbUZvcm1hdCgiZC5tLlkgSDppIiwgJF9QT1NUWydzYWlzb25hZGRfZW5kJ10pKTsKRGF0YWJhc2VPcGVyYXRpb25zOjpjcmVhdGVTYWlzb24oJHNhaXNvbik7CgppbmNsdWRlKCdhY3Rpb24uZGVmYXVsdGFkbWluLnBocCcpOwoKPz4=]]></data>
	</file>
	<file>
	  <filename>/action.addTeam.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKaWYgKCFpc3NldCgkZ0NtcykpIGV4aXQ7CgppZiAoISAkdGhpcy0+Q2hlY2tBY2Nlc3MoJ0tlZ2VsZXJnZWJuaXNzZScpKQoJewoJcmV0dXJuICR0aGlzLT5EaXNwbGF5RXJyb3JQYWdlKCRpZCwgJHBhcmFtcywgJHJldHVybmlkLCR0aGlzLT5MYW5nKCdhY2Nlc3NkZW5pZWQnKSk7Cgl9CgovKiAtPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LQoKICAgQ29kZSBmb3Iga2VnZWxlcmdlYm5pc3NlICJhZGRUZWFtIiBhZG1pbiBhY3Rpb24KICAgCiAgIC09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tCiAgIAogICBUeXBpY2FsbHksIHRoaXMgd2lsbCBkaXNwbGF5IHNvbWV0aGluZyBmcm9tIGEgdGVtcGxhdGUKICAgb3IgZG8gc29tZSBvdGhlciB0YXNrLgogICAKKi8KCi8qIHdvcmsgb24gdGhlIHBvc3QgcmVxdWVzdCAqLwokbWFjdF92YXJzID0gZXhwbG9kZSgiLCIsICRfUE9TVFsnbWFjdCddKTsKJHRlYW1pZCA9ICRtYWN0X3ZhcnNbMV07CkRhdGFiYXNlT3BlcmF0aW9uczo6Y3JlYXRlVGVhbSgkX1BPU1RbJ3RlYW1hZGRfbmFtZSddKTsKCQppbmNsdWRlKCdhY3Rpb24uZGVmYXVsdGFkbWluLnBocCcpOwoKCj8+]]></data>
	</file>
	<file>
	  <filename>/action.change120GameResult.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKcmVxdWlyZV9vbmNlICgnZGF0YW1vZGVsL2RhdGFiYXNlb3BlcmF0aW9ucy5waHAnKTsKaWYgKCFpc3NldCgkZ0NtcykpIGV4aXQ7CgppZiAoISAkdGhpcy0+Q2hlY2tBY2Nlc3MoJ0tlZ2VsZXJnZWJuaXNzZScpKQoJewoJcmV0dXJuICR0aGlzLT5EaXNwbGF5RXJyb3JQYWdlKCRpZCwgJHBhcmFtcywgJHJldHVybmlkLCR0aGlzLT5MYW5nKCdhY2Nlc3NkZW5pZWQnKSk7Cgl9CgovKiAtPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LQoKICAgQ29kZSBmb3Iga2VnZWxlcmdlYm5pc3NlICJjaGFuZ2VHYW1lIiBhZG1pbiBhY3Rpb24KICAgCiAgIC09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tCiAgIAogICBUeXBpY2FsbHksIHRoaXMgd2lsbCBkaXNwbGF5IHNvbWV0aGluZyBmcm9tIGEgdGVtcGxhdGUKICAgb3IgZG8gc29tZSBvdGhlciB0YXNrLgogICAKKi8KJG1hY3RfdmFycyA9IGV4cGxvZGUoIiwiLCAkX1BPU1RbJ21hY3QnXSk7CiRnYW1laWQgPSAkbWFjdF92YXJzWzFdOwokZ2FtZSA9IERhdGFiYXNlT3BlcmF0aW9uczo6Z2V0R2FtZSgkZ2FtZWlkKTsKCi8qIHdvcmsgb24gdGhlIHBvc3QgcmVxdWVzdCAqLwpmb3IoJGkgPSAwOyAkaSA8IDY7ICRpID0gJGkgKyAxKSB7Cgkkc2V0cyA9IGFycmF5KE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwpOwoJJG1hdGNoaW5kZXggPSAkX1BPU1QgWydtYXRjaF9pbmRleCcuJGldOwoJCglmb3IoJGogPSAxOyAkaiA8IDU7ICRqID0gJGogKyAxKSB7CgkJJGluZGV4ID0gJF9QT1NUIFsnZ2FtZV9pbmRleF9TJy4gJGogLiAkaV07CgkJCgkJLyogaGFuZGxlIGV4aXN0aW5nIHJlc3VsdCAqLwoJCWlmICgkaW5kZXggIT0gIm5ldyIpIHsKCQkJJHBsYXllcmlkID0gJF9QT1NUIFsnZ2FtZV9wbGF5ZXJfUycuICRqIC4gJGluZGV4XTsKCQkJJGdlcyA9ICRfUE9TVCBbJ2dhbWVfZ2VzX1MnLiAkaiAuICRpbmRleF07CgkJCSRhYnIgPSAkX1BPU1QgWydnYW1lX2Ficl9TJy4gJGogLiAkaW5kZXhdOwoJCQkkZmVobCA9ICRfUE9TVCBbJ2dhbWVfZmVobF9TJy4gJGogLiAkaW5kZXhdOwoJCQkkb3Bwb25lbnQgPSAkX1BPU1QgWydnYW1lX29wcG9uZW50X1MnLiAkaiAuICRpbmRleF07CgkJCSRvZ2VzID0gJF9QT1NUIFsnZ2FtZV9vZ2VzX1MnLiAkaiAuICRpbmRleF07CgkJCSRvYWJyID0gJF9QT1NUIFsnZ2FtZV9vYWJyX1MnLiAkaiAuICRpbmRleF07CgkJCSRvZmVobCA9ICRfUE9TVCBbJ2dhbWVfb2ZlaGxfUycuICRqIC4gJGluZGV4XTsKCQkJJHBsYXllciA9IERhdGFiYXNlT3BlcmF0aW9uczo6Z2V0UGxheWVyICggJHBsYXllcmlkICk7CgkJCSRuZXdzZXQgPSBuZXcgU2V0MTIwICggJGluZGV4LCAkcGxheWVyLCAkb3Bwb25lbnQsICRnZXMsICRhYnIsICRmZWhsLCAkb2dlcywgJG9hYnIsICRvZmVobCwgTlVMTCApOwoJCQkkc2V0c1skai0xXSA9ICRuZXdzZXQ7CgkJCQoJCQkvKiBoYW5kbGUgbmV3IHJlc3VsdCAqLwoJCX0gZWxzZSB7CgkJCSRwbGF5ZXJpZCA9ICRfUE9TVCBbJ2dhbWVfcGxheWVyX25ld19TJy4gJGogLiAkaV07CgkJCSRnZXMgPSAkX1BPU1QgWydnYW1lX2dlc19uZXdfUycuICRqIC4gJGldOwoJCQkkYWJyID0gJF9QT1NUIFsnZ2FtZV9hYnJfbmV3X1MnLiAkaiAuICRpXTsKCQkJJGZlaGwgPSAkX1BPU1QgWydnYW1lX2ZlaGxfbmV3X1MnLiAkaiAuICRpXTsKCQkJJG9wcG9uZW50ID0gJF9QT1NUIFsnZ2FtZV9vcHBvbmVudF9uZXdfUycuICRqIC4gJGldOwoJCQkkb2dlcyA9ICRfUE9TVCBbJ2dhbWVfb2dlc19uZXdfUycuICRqIC4gJGldOwoJCQkkb2FiciA9ICRfUE9TVCBbJ2dhbWVfb2Ficl9uZXdfUycuICRqIC4gJGldOwoJCQkkb2ZlaGwgPSAkX1BPU1QgWydnYW1lX29mZWhsX25ld19TJy4gJGogLiAkaV07CgkJCSRwbGF5ZXIgPSBEYXRhYmFzZU9wZXJhdGlvbnM6OmdldFBsYXllciAoICRwbGF5ZXJpZCApOwoJCQkkbmV3c2V0ID0gbmV3IFNldDEyMCAoIDAsICRwbGF5ZXIsICRvcHBvbmVudCwgJGdlcywgJGFiciwgJGZlaGwsICRvZ2VzLCAkb2FiciwgJG9mZWhsLCBOVUxMICk7CgkJCWlmICgkb3Bwb25lbnQgIT0gIiIpIHsKCQkJCSRzZXRzWyRqLTFdID0gJG5ld3NldDsKCQkJfQoJCX0KCX0JCglpZiAoJG1hdGNoaW5kZXggIT0gIm5ldyIpIHsKCQkkcGNvdW50ID0gKChpc3NldCAoICRfUE9TVCBbJ2dhbWVfY291bnQnIC4gJG1hdGNoaW5kZXhdICkpICYmICgkX1BPU1QgWydnYW1lX2NvdW50JyAuICRtYXRjaGluZGV4XSA9PSAxKSkgPyB0cnVlIDogZmFsc2U7CgkJJG9jb3VudCA9ICgoaXNzZXQgKCAkX1BPU1QgWydnYW1lX29jb3VudCcgLiAkbWF0Y2hpbmRleF0gKSkgJiYgKCRfUE9TVCBbJ2dhbWVfb2NvdW50JyAuICRtYXRjaGluZGV4XSA9PSAxKSkgPyB0cnVlIDogZmFsc2U7CgkJJG1hdGNoID0gbmV3IE1hdGNoMTIwICgkbWF0Y2hpbmRleCwgJGdhbWUsICRvY291bnQsICRwY291bnQsICRzZXRzWzBdLCAkc2V0c1sxXSwgJHNldHNbMl0sICRzZXRzWzNdKTsKCQlEYXRhYmFzZU9wZXJhdGlvbnM6OmNoYW5nZU1hdGNoMTIwKCRtYXRjaCk7CgkJRGF0YWJhc2VPcGVyYXRpb25zOjpjaGFuZ2VTZXQxMjAoJHNldHNbMF0pOwoJCURhdGFiYXNlT3BlcmF0aW9uczo6Y2hhbmdlU2V0MTIwKCRzZXRzWzFdKTsKCQlEYXRhYmFzZU9wZXJhdGlvbnM6OmNoYW5nZVNldDEyMCgkc2V0c1syXSk7CgkJRGF0YWJhc2VPcGVyYXRpb25zOjpjaGFuZ2VTZXQxMjAoJHNldHNbM10pOwoJfSBlbHNlIHsKCQkkcGNvdW50ID0gKChpc3NldCAoICRfUE9TVCBbJ2dhbWVfY291bnRfbmV3JyAuICRpXSApKSAmJiAoJF9QT1NUIFsnZ2FtZV9jb3VudF9uZXcnIC4gJGldID09IDEpKSA/IHRydWUgOiBmYWxzZTsKCQkkb2NvdW50ID0gKChpc3NldCAoICRfUE9TVCBbJ2dhbWVfb2NvdW50X25ldycgLiAkaV0gKSkgJiYgKCRfUE9TVCBbJ2dhbWVfb2NvdW50X25ldycgLiAkaV0gPT0gMSkpID8gdHJ1ZSA6IGZhbHNlOwoJCSRtYXRjaCA9IG5ldyBNYXRjaDEyMCAoIDAsICRnYW1lLCAkb2NvdW50LCAkcGNvdW50LCAkc2V0c1swXSwgJHNldHNbMV0sICRzZXRzWzJdLCAkc2V0c1szXSk7CgkJRGF0YWJhc2VPcGVyYXRpb25zOjpjcmVhdGVNYXRjaDEyMCgkbWF0Y2gpOwoJfQp9CiRfR0VUID0gJF9TRVNTSU9OWydnYW1lMTIwUmVzdWx0J107CmluY2x1ZGUoJ2FjdGlvbi5FZGl0MTIwR2FtZS5waHAnKTsKPz4=]]></data>
	</file>
	<file>
	  <filename>/action.changeGame.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKcmVxdWlyZV9vbmNlICgnZGF0YW1vZGVsL2RhdGFiYXNlb3BlcmF0aW9ucy5waHAnKTsKaWYgKCFpc3NldCgkZ0NtcykpIGV4aXQ7CgppZiAoISAkdGhpcy0+Q2hlY2tBY2Nlc3MoJ0tlZ2VsZXJnZWJuaXNzZScpKQoJewoJcmV0dXJuICR0aGlzLT5EaXNwbGF5RXJyb3JQYWdlKCRpZCwgJHBhcmFtcywgJHJldHVybmlkLCR0aGlzLT5MYW5nKCdhY2Nlc3NkZW5pZWQnKSk7Cgl9CgovKiAtPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LQoKICAgQ29kZSBmb3Iga2VnZWxlcmdlYm5pc3NlICJjaGFuZ2VHYW1lIiBhZG1pbiBhY3Rpb24KICAgCiAgIC09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tCiAgIAogICBUeXBpY2FsbHksIHRoaXMgd2lsbCBkaXNwbGF5IHNvbWV0aGluZyBmcm9tIGEgdGVtcGxhdGUKICAgb3IgZG8gc29tZSBvdGhlciB0YXNrLgogICAKKi8KCi8qIHdvcmsgb24gdGhlIHBvc3QgcmVxdWVzdCAqLwokbWFjdF92YXJzID0gZXhwbG9kZSgiLCIsICRfUE9TVFsnbWFjdCddKTsKJGdhbWVpZCA9ICRfUE9TVFsnZ2FtZWNoYW5nZV9nYW1laWQnXTsKJHRlYW0gPSBEYXRhYmFzZU9wZXJhdGlvbnM6OmdldFRlYW0oJF9QT1NUWydzcGllbHBsYW5fdGVhbSddKTsKJGhvbWUgPSAoaXNzZXQoJF9QT1NUWydnYW1lY2hhbmdlX2hvbWUnXSkgJiYgKCRfUE9TVFsnZ2FtZWNoYW5nZV9ob21lJ10gPT0gdHJ1ZSkpID8gdHJ1ZTpmYWxzZTsKJGlzMTIwID0gKGlzc2V0KCRfUE9TVFsnZ2FtZWNoYW5nZV8xMjAnXSkgJiYgKCRfUE9TVFsnZ2FtZWNoYW5nZV8xMjAnXSA9PSB0cnVlKSkgPyB0cnVlOmZhbHNlOwokbmV3Z2FtZSA9IG5ldyBHYW1lKCRnYW1laWQsCgkkdGVhbSwKCSRfUE9TVFsnZ2FtZWNoYW5nZV9vcHBvbmVudCddLAoJRGF0ZVRpbWU6OmNyZWF0ZUZyb21Gb3JtYXQoImQubS5ZIEg6aSIsICRfUE9TVFsnZ2FtZWNoYW5nZV9kYXRlJ10uIiAiLiRfUE9TVFsnZ2FtZWNoYW5nZV90aW1lJ10pLAoJJGhvbWUsCiAgICAkaXMxMjApOwokb2xkZ2FtZSA9IERhdGFiYXNlT3BlcmF0aW9uczo6Z2V0R2FtZSgkZ2FtZWlkKTsKRGF0YWJhc2VPcGVyYXRpb25zOjpjaGFuZ2VHYW1lKCRvbGRnYW1lLCAkbmV3Z2FtZSk7CgkKaW5jbHVkZSgnYWN0aW9uLmRlZmF1bHRhZG1pbi5waHAnKTsKPz4=]]></data>
	</file>
	<file>
	  <filename>/action.changeGameResult.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKcmVxdWlyZV9vbmNlICgnZGF0YW1vZGVsL2RhdGFiYXNlb3BlcmF0aW9ucy5waHAnKTsKaWYgKCFpc3NldCgkZ0NtcykpIGV4aXQ7CgppZiAoISAkdGhpcy0+Q2hlY2tBY2Nlc3MoJ0tlZ2VsZXJnZWJuaXNzZScpKQoJewoJcmV0dXJuICR0aGlzLT5EaXNwbGF5RXJyb3JQYWdlKCRpZCwgJHBhcmFtcywgJHJldHVybmlkLCR0aGlzLT5MYW5nKCdhY2Nlc3NkZW5pZWQnKSk7Cgl9CgovKiAtPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LQoKICAgQ29kZSBmb3Iga2VnZWxlcmdlYm5pc3NlICJjaGFuZ2VHYW1lIiBhZG1pbiBhY3Rpb24KICAgCiAgIC09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tCiAgIAogICBUeXBpY2FsbHksIHRoaXMgd2lsbCBkaXNwbGF5IHNvbWV0aGluZyBmcm9tIGEgdGVtcGxhdGUKICAgb3IgZG8gc29tZSBvdGhlciB0YXNrLgogICAKKi8KJG1hY3RfdmFycyA9IGV4cGxvZGUoIiwiLCAkX1BPU1RbJ21hY3QnXSk7CiRnYW1laWQgPSAkbWFjdF92YXJzWzFdOwokZ2FtZSA9IERhdGFiYXNlT3BlcmF0aW9uczo6Z2V0R2FtZSgkZ2FtZWlkKTsKCi8qIHdvcmsgb24gdGhlIHBvc3QgcmVxdWVzdCAqLwpmb3IoJGkgPSAwOyAkaSA8IDg7ICRpID0gJGkgKyAxKSB7CgkkaW5kZXggPSAkX1BPU1RbJ2dhbWVfaW5kZXgnLiRpXTsKCQoJLyogaGFuZGxlIGV4aXN0aW5nIHJlc3VsdCAqLwoJaWYgKCRpbmRleCAhPSAibmV3IikgewoJCSRwbGF5ZXJpZCA9ICRfUE9TVFsnZ2FtZV9wbGF5ZXInLiRpbmRleF07CgkJJGNvdW50ID0gKChpc3NldCgkX1BPU1RbJ2dhbWVfY291bnQnLiRpbmRleF0pKSAmJiAoKGJvb2xlYW4pJF9QT1NUWydnYW1lX2NvdW50Jy4kaW5kZXhdID09IHRydWUpKSA/IHRydWU6ZmFsc2U7CgkJJGdlcyA9ICRfUE9TVFsnZ2FtZV9nZXMnLiRpbmRleF07CgkJJGFiciA9ICRfUE9TVFsnZ2FtZV9hYnInLiRpbmRleF07CgkJJGZlaGwgPSAkX1BPU1RbJ2dhbWVfZmVobCcuJGluZGV4XTsKCQkkb3Bwb25lbnQgPSAkX1BPU1RbJ2dhbWVfb3Bwb25lbnQnLiRpbmRleF07CgkJJG9jb3VudCA9ICgoaXNzZXQoJF9QT1NUWydnYW1lX29jb3VudCcuJGluZGV4XSkpICYmICgoYm9vbGVhbikkX1BPU1RbJ2dhbWVfb2NvdW50Jy4kaW5kZXhdID09IHRydWUpKSA/IHRydWU6ZmFsc2U7CgkJJG9nZXMgPSAkX1BPU1RbJ2dhbWVfb2dlcycuJGluZGV4XTsKCQkkb2FiciA9ICRfUE9TVFsnZ2FtZV9vYWJyJy4kaW5kZXhdOwoJCSRvZmVobCA9ICRfUE9TVFsnZ2FtZV9vZmVobCcuJGluZGV4XTsKCQkkcGxheWVyID0gRGF0YWJhc2VPcGVyYXRpb25zOjpnZXRQbGF5ZXIoJHBsYXllcmlkKTsKCQkkb2xkcmVzdWx0ID0gRGF0YWJhc2VPcGVyYXRpb25zOjpnZXRSZXN1bHQoJGluZGV4KTsKCQkkbmV3cmVzdWx0ID0gbmV3IFJlc3VsdCgkaW5kZXgsICRwbGF5ZXIsICRnYW1lLCAkb3Bwb25lbnQsICRnZXMsICRhYnIsICRmZWhsLCAkY291bnQsICRvZ2VzLCAkb2FiciwgJG9mZWhsLCAkb2NvdW50KTsKCQlEYXRhYmFzZU9wZXJhdGlvbnM6OmNoYW5nZVJlc3VsdCgkb2xkcmVzdWx0LCAkbmV3cmVzdWx0KTsKCQoJLyogaGFuZGxlIG5ldyByZXN1bHQgKi8JCgl9IGVsc2UgewoJCSRwbGF5ZXJpZCA9ICRfUE9TVFsnZ2FtZV9wbGF5ZXJfbmV3Jy4kaV07CgkJJGNvdW50ID0gKChpc3NldCgkX1BPU1RbJ2dhbWVfY291bnRfbmV3Jy4kaV0pKSAmJiAoKGJvb2xlYW4pJF9QT1NUWydnYW1lX2NvdW50X25ldycuJGldID09IHRydWUpKSA/IHRydWU6ZmFsc2U7CgkJJGdlcyA9ICRfUE9TVFsnZ2FtZV9nZXNfbmV3Jy4kaV07CgkJJGFiciA9ICRfUE9TVFsnZ2FtZV9hYnJfbmV3Jy4kaV07CgkJJGZlaGwgPSAkX1BPU1RbJ2dhbWVfZmVobF9uZXcnLiRpXTsKCQkkb3Bwb25lbnQgPSAkX1BPU1RbJ2dhbWVfb3Bwb25lbnRfbmV3Jy4kaV07CgkJJG9jb3VudCA9ICgoaXNzZXQoJF9QT1NUWydnYW1lX29jb3VudF9uZXcnLiRpXSkpICYmICgoYm9vbGVhbikkX1BPU1RbJ2dhbWVfb2NvdW50X25ldycuJGldID09IHRydWUpKSA/IHRydWU6ZmFsc2U7CgkJJG9nZXMgPSAkX1BPU1RbJ2dhbWVfb2dlc19uZXcnLiRpXTsKCQkkb2FiciA9ICRfUE9TVFsnZ2FtZV9vYWJyX25ldycuJGldOwoJCSRvZmVobCA9ICRfUE9TVFsnZ2FtZV9vZmVobF9uZXcnLiRpXTsKCQkkcGxheWVyID0gRGF0YWJhc2VPcGVyYXRpb25zOjpnZXRQbGF5ZXIoJHBsYXllcmlkKTsKCQkkbmV3cmVzdWx0ID0gbmV3IFJlc3VsdCgwLCAkcGxheWVyLCAkZ2FtZSwgJG9wcG9uZW50LCAkZ2VzLCAkYWJyLCAkZmVobCwgJGNvdW50LCAkb2dlcywgJG9hYnIsICRvZmVobCwgJG9jb3VudCk7CgkJaWYgKCRvcHBvbmVudCAhPSAiIikgewoJCQlEYXRhYmFzZU9wZXJhdGlvbnM6OmNyZWF0ZVJlc3VsdCgkbmV3cmVzdWx0KTsKCQl9Cgl9Cn0KJF9HRVQgPSAkX1NFU1NJT05bJ2dhbWVSZXN1bHQnXTsKaW5jbHVkZSgnYWN0aW9uLkVkaXRHYW1lLnBocCcpOwo/Pg==]]></data>
	</file>
	<file>
	  <filename>/action.changePlayer.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKcmVxdWlyZV9vbmNlKCJkYXRhbW9kZWwvZGF0YWJhc2VvcGVyYXRpb25zLnBocCIpOwoKaWYgKCFpc3NldCgkZ0NtcykpIGV4aXQ7CgppZiAoISAkdGhpcy0+Q2hlY2tBY2Nlc3MoJ0tlZ2VsZXJnZWJuaXNzZScpKQoJewoJcmV0dXJuICR0aGlzLT5EaXNwbGF5RXJyb3JQYWdlKCRpZCwgJHBhcmFtcywgJHJldHVybmlkLCR0aGlzLT5MYW5nKCdhY2Nlc3NkZW5pZWQnKSk7Cgl9CgovKiAtPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LQoKICAgQ29kZSBmb3Iga2VnZWxlcmdlYm5pc3NlICJjaGFuZ2VQbGF5ZXIiIGFkbWluIGFjdGlvbgogICAKICAgLT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS0KICAgCiAgIFR5cGljYWxseSwgdGhpcyB3aWxsIGRpc3BsYXkgc29tZXRoaW5nIGZyb20gYSB0ZW1wbGF0ZQogICBvciBkbyBzb21lIG90aGVyIHRhc2suCiAgIAoqLwoKLyogd29yayBvbiB0aGUgcG9zdCByZXF1ZXN0ICovCiRtYWN0X3ZhcnMgPSBleHBsb2RlKCIsIiwgJF9QT1NUWydtYWN0J10pOwokcGxheWVyaWQgPSAkbWFjdF92YXJzWzFdOwokcGxheWVyID0gbmV3IFBsYXllcigkcGxheWVyaWQsICRfUE9TVFsncGxheWVyY2hhbmdlX25hbWUnXSk7CiRvbGRwbGF5ZXIgPSBEYXRhYmFzZU9wZXJhdGlvbnM6OmdldFBsYXllcigkcGxheWVyaWQpOwpEYXRhYmFzZU9wZXJhdGlvbnM6OmNoYW5nZVBsYXllcigkb2xkcGxheWVyLCAkcGxheWVyKTsKCQppbmNsdWRlKCdhY3Rpb24uZGVmYXVsdGFkbWluLnBocCcpOwo/Pg==]]></data>
	</file>
	<file>
	  <filename>/action.changePlayerToTeam.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKcmVxdWlyZV9vbmNlKCdkYXRhbW9kZWwvZGF0YWJhc2VvcGVyYXRpb25zLnBocCcpOwoKaWYgKCFpc3NldCgkZ0NtcykpIGV4aXQ7CmlmICghICR0aGlzLT5DaGVja0FjY2VzcygnS2VnZWxlcmdlYm5pc3NlJykpCgl7CglyZXR1cm4gJHRoaXMtPkRpc3BsYXlFcnJvclBhZ2UoJGlkLCAkcGFyYW1zLCAkcmV0dXJuaWQsJHRoaXMtPkxhbmcoJ2FjY2Vzc2RlbmllZCcpKTsKCX0KLyogLT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS0KCiAgIENvZGUgZm9yIGtlZ2VsZXJnZWJuaXNzZSAiYWRkUGxheWVyVG9UZWFtIiBhY3Rpb24KCiAgIC09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tCiAgIAogICBUeXBpY2FsbHksIHRoaXMgd2lsbCBkaXNwbGF5IHNvbWV0aGluZyBmcm9tIGEgdGVtcGxhdGUKICAgb3IgZG8gc29tZSBvdGhlciB0YXNrLgogICAKKi8KJG1hY3RfdmFycyA9IGV4cGxvZGUoIiwiLCAkX1BPU1RbJ21hY3QnXSk7CiRwdHRpZCA9ICRtYWN0X3ZhcnNbMV07CgokcGxheWVydG90ZWFtb2xkID0gRGF0YWJhc2VPcGVyYXRpb25zOjpnZXRQbGF5ZXJUb1RlYW0oJHB0dGlkKTsKJHBsYXllciA9IERhdGFiYXNlT3BlcmF0aW9uczo6Z2V0UGxheWVyKCRfUE9TVFsncHR0Y2hhbmdlX3BsYXllciddKTsKJHRlYW0gPSBEYXRhYmFzZU9wZXJhdGlvbnM6OmdldFRlYW0oJF9QT1NUWydwdHRjaGFuZ2VfdGVhbSddKTsKJHNhaXNvbiA9IERhdGFiYXNlT3BlcmF0aW9uczo6Z2V0U2Fpc29uKCRfUE9TVFsncHR0X3NhaXNvbiddKTsKJHBsYXllcnRvdGVhbW5ldyA9IG5ldyBQbGF5ZXJUb1RlYW0oJHBsYXllcnRvdGVhbW9sZC0+Z2V0SWQoKSwgJHBsYXllciwgJHNhaXNvbiwgJHRlYW0pOwpEYXRhYmFzZU9wZXJhdGlvbnM6OmNoYW5nZVBsYXllclRvVGVhbSgkcGxheWVydG90ZWFtb2xkLCAkcGxheWVydG90ZWFtbmV3KTsKCmluY2x1ZGUoJ2FjdGlvbi5FZGl0UGxheWVyVG9UZWFtLnBocCcpOwo/Pg==]]></data>
	</file>
	<file>
	  <filename>/action.changeSaison.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKaWYgKCFpc3NldCgkZ0NtcykpIGV4aXQ7CgppZiAoISAkdGhpcy0+Q2hlY2tBY2Nlc3MoJ0tlZ2VsZXJnZWJuaXNzZScpKQoJewoJcmV0dXJuICR0aGlzLT5EaXNwbGF5RXJyb3JQYWdlKCRpZCwgJHBhcmFtcywgJHJldHVybmlkLCR0aGlzLT5MYW5nKCdhY2Nlc3NkZW5pZWQnKSk7Cgl9CgovKiAtPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LQoKICAgQ29kZSBmb3Iga2VnZWxlcmdlYm5pc3NlICJjaGFuZ2VTYWlzb24iIGFkbWluIGFjdGlvbgogICAKICAgLT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS0KICAgCiAgIFR5cGljYWxseSwgdGhpcyB3aWxsIGRpc3BsYXkgc29tZXRoaW5nIGZyb20gYSB0ZW1wbGF0ZQogICBvciBkbyBzb21lIG90aGVyIHRhc2suCiAgIAoqLwoKLyogd29yayBvbiB0aGUgcG9zdCByZXF1ZXN0ICovCiRtYWN0X3ZhcnMgPSBleHBsb2RlKCIsIiwgJF9QT1NUWydtYWN0J10pOwokc2Fpc29uaWQgPSAkbWFjdF92YXJzWzFdOwokb2xkc2Fpc29uID0gRGF0YWJhc2VPcGVyYXRpb25zOjpnZXRTYWlzb24oJHNhaXNvbmlkKTsKJG5ld3NhaXNvbiA9IG5ldyBTYWlzb24oJHNhaXNvbmlkLCAkX1BPU1RbJ3NhaXNvbmNoYW5nZV9uYW1lJ10sIERhdGVUaW1lOjpjcmVhdGVGcm9tRm9ybWF0KCJkLm0uWSBIOmkiLCAkX1BPU1RbJ3NhaXNvbmNoYW5nZV9iZWdpbiddKSxEYXRlVGltZTo6Y3JlYXRlRnJvbUZvcm1hdCgiZC5tLlkgSDppIiwgJF9QT1NUWydzYWlzb25jaGFuZ2VfZW5kJ10pKTsKRGF0YWJhc2VPcGVyYXRpb25zOjpjaGFuZ2VTYWlzb24oJG9sZHNhaXNvbiwgJG5ld3NhaXNvbik7CgppbmNsdWRlKCdhY3Rpb24uZGVmYXVsdGFkbWluLnBocCcpOwoKCj8+]]></data>
	</file>
	<file>
	  <filename>/action.changeTeam.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKaWYgKCFpc3NldCgkZ0NtcykpIGV4aXQ7CgppZiAoISAkdGhpcy0+Q2hlY2tBY2Nlc3MoJ0tlZ2VsZXJnZWJuaXNzZScpKQoJewoJcmV0dXJuICR0aGlzLT5EaXNwbGF5RXJyb3JQYWdlKCRpZCwgJHBhcmFtcywgJHJldHVybmlkLCR0aGlzLT5MYW5nKCdhY2Nlc3NkZW5pZWQnKSk7Cgl9CgovKiAtPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LQoKICAgQ29kZSBmb3Iga2VnZWxlcmdlYm5pc3NlICJjaGFuZ2VUZWFtIiBhZG1pbiBhY3Rpb24KICAgCiAgIC09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tCiAgIAogICBUeXBpY2FsbHksIHRoaXMgd2lsbCBkaXNwbGF5IHNvbWV0aGluZyBmcm9tIGEgdGVtcGxhdGUKICAgb3IgZG8gc29tZSBvdGhlciB0YXNrLgogICAKKi8KCi8qIHdvcmsgb24gdGhlIHBvc3QgcmVxdWVzdCAqLwokbWFjdF92YXJzID0gZXhwbG9kZSgiLCIsICRfUE9TVFsnbWFjdCddKTsKJHRlYW1pZCA9ICRtYWN0X3ZhcnNbMV07CiR0ZWFtID0gbmV3IFRlYW0oJHRlYW1pZCwgJF9QT1NUWyd0ZWFtY2hhbmdlX25hbWUnXSk7CiRvbGR0ZWFtID0gRGF0YWJhc2VPcGVyYXRpb25zOjpnZXRUZWFtKCR0ZWFtaWQpOwpEYXRhYmFzZU9wZXJhdGlvbnM6OmNoYW5nZVRlYW0oJG9sZHRlYW0sICR0ZWFtKTsKCQppbmNsdWRlKCdhY3Rpb24uZGVmYXVsdGFkbWluLnBocCcpOwoKCj8+]]></data>
	</file>
	<file>
	  <filename>/action.completeteaminformation.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKaWYgKCFpc3NldCgkZ0NtcykpIGV4aXQ7Ci8qIC09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tCgogICBDb2RlIGZvciBrZWdlbGVyZ2Vibmlzc2UgInNob3d0ZWFtdGFibGUiIGFjdGlvbgoKICAgLT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS0KICAgCiAgIFR5cGljYWxseSwgdGhpcyB3aWxsIGRpc3BsYXkgc29tZXRoaW5nIGZyb20gYSB0ZW1wbGF0ZQogICBvciBkbyBzb21lIG90aGVyIHRhc2suCiAgIAoqLwovKiBzZWFyY2ggZm9yIHRlYW0gaW5zaWRlIHRoZSBkYXRhYmFzZSAqLwokdGVhbXMgPSBEYXRhYmFzZU9wZXJhdGlvbnM6OmdldEFsbFRlYW1zKCk7CmZvcmVhY2ggKCR0ZWFtcyBhcyAkdGVtcHRlYW0pIHsKCWlmICgkdGVtcHRlYW0tPmdldE5hbWUoKSA9PSAkcGFyYW1zWyd0ZWFtJ10pIHsKCQkkdGVhbSA9ICR0ZW1wdGVhbTsKCX0KfQoKLyogc2VhcmNoIGZvciBzYWlzb24gaW5zaWRlIHRoZSBkYXRhYmFzZSAqLwokc2Fpc29ucyA9IERhdGFiYXNlT3BlcmF0aW9uczo6Z2V0QWxsU2Fpc29ucygpOwpmb3JlYWNoICgkc2Fpc29ucyBhcyAkdGVtcHNhaXNvbikgewoJaWYgKCR0ZW1wc2Fpc29uLT5nZXROYW1lKCkgPT0gJHBhcmFtc1snc2Fpc29uJ10pIHsKCQkkc2Fpc29uID0gJHRlbXBzYWlzb247Cgl9Cn0KCi8qIHNlYXJjaCBmb3IgcGxheWVycyB0aGF0IGFyZSBhc3NpZ25lZCB0byBhIHRlYW0gZHVyaW5nIHRoaXMgc2Vhc29uICovCiRwdHRzID0gRGF0YWJhc2VPcGVyYXRpb25zOjpnZXRQbGF5ZXJzVG9UZWFtKCRzYWlzb24pOwokaSA9IDA7CiRwbGF5ZXJpZHMgPSBhcnJheSgpOwpmb3JlYWNoICgkcHR0cyBhcyAkcHR0KSB7CglpZiAoJHB0dC0+Z2V0VGVhbSgpLT5nZXRJZCgpID09ICR0ZWFtLT5nZXRJZCgpKSB7CgkJJHBsYXllcnNbJGldID0gJHB0dC0+Z2V0UGxheWVyKCk7CgkJYXJyYXlfcHVzaCgkcGxheWVyaWRzLCAkcHR0LT5nZXRQbGF5ZXIoKS0+Z2V0SWQoKSk7Cgl9CgkkaSArPSAxOwp9CgovKiBjb3VudCBnYW1lcyB3aXRoIDEyMCBhbmQgMTAwLzIwMCByZXN1bHRzICovCiRnYW1lczEyMGNvdW50ID0gMDsKJGdhbWVzY291bnQgPSAwOwokZ2FtZXMgPSBEYXRhYmFzZU9wZXJhdGlvbnM6OmdldFRpbWVUYWJsZSgkc2Fpc29uLCAkdGVhbSk7CmZvcmVhY2ggKCRnYW1lcyBhcyAkZ2FtZSkgewoJaWYgKCRnYW1lLT5pczEyMCgpID09IHRydWUpIHsKCQkkZ2FtZXMxMjBjb3VudCArPSAxOwoJfSBlbHNlIHsKCQkkZ2FtZXNjb3VudCArPSAxOwoJfQp9CgppZiAoaXNzZXQoJHBsYXllcnMpICYmIGlzc2V0KCRzYWlzb24pICYmIGlzc2V0KCR0ZWFtKSkgewoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCJUYWdBdmdUYWJsZSIsICR0aGlzLT5MYW5nKCdhdmVyYWdldGFibGUnKSk7CgkkdGhpcy0+c21hcnR5LT5hc3NpZ24oIlRhZ1RpbWVUYWJsZSIsICR0aGlzLT5MYW5nKCd0aW1ldGFibGUnKSk7CgkkdGhpcy0+c21hcnR5LT5hc3NpZ24oIlRhZ0Rlc2NyaXB0aW9uIiwgJHRoaXMtPkxhbmcoJ2NvbXBsZXRldGVhbWluZm9ybWF0aW9uZGVzYycpKTsKCSR0aGlzLT5zbWFydHktPmFzc2lnbigiU2Fpc29uIiwgJHNhaXNvbi0+Z2V0TmFtZSgpKTsKCSR0aGlzLT5zbWFydHktPmFzc2lnbigiVGVhbSIsICR0ZWFtLT5nZXROYW1lKCkpOwoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCJQbGF5ZXJzIiwgJHBsYXllcmlkcyk7CgkkdGhpcy0+c21hcnR5LT5hc3NpZ24oInhsc2xpbmsiLCAkcGFyYW1zWyd4bHNsaW5rJ10pOwoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCJOdW1iZXJPZkdhbWVzIiwgY291bnQoRGF0YWJhc2VPcGVyYXRpb25zOjpnZXRUaW1lVGFibGUoJHNhaXNvbiwgJHRlYW0pKSk7CgkkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ0JhY2tncm91bmQnLCAkdGhpcy0+R2V0TW9kdWxlVXJsUGF0aCgpLiIvaW1nL3NjaGF0dGVuLnBuZyIpOwoJaWYgKCRnYW1lczEyMGNvdW50ID49ICRnYW1lc2NvdW50KSB7CgkJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdyZXN1bHRzMTIwJywgdHJ1ZSk7Cgl9CgllY2hvICR0aGlzLT5Qcm9jZXNzVGVtcGxhdGUoJ2NvbXBsZXRldGVhbWluZm9ybWF0aW9uLnRwbCcpOwp9IGVsc2UgewoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCd0aXRsZV9lcnJvcicsICR0aGlzLT5MYW5nKCdlcnJvcnRhZycpKTsKCSR0aGlzLT5zbWFydHktPmFzc2lnbignbWVzc2FnZScsICR0aGlzLT5MYW5nKCdlcnJvcl90ZWFtJykuJzxici8+Jy4kcGFyYW1zWyd0ZWFtJ10uJHRoaXMtPkxhbmcoJ2Vycm9yX3NhaXNvbicpLiRwYXJhbXNbJ3NhaXNvbiddKTsKCWVjaG8gJHRoaXMtPlByb2Nlc3NUZW1wbGF0ZSgnZXJyb3IudHBsJyk7Cn0KCj8+]]></data>
	</file>
	<file>
	  <filename>/action.defaultadmin.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKaWYgKCFpc3NldCgkZ0NtcykpIGV4aXQ7CgppZiAoISAkdGhpcy0+Q2hlY2tBY2Nlc3MoJ0tlZ2VsZXJnZWJuaXNzZScpKQoJewoJcmV0dXJuICR0aGlzLT5EaXNwbGF5RXJyb3JQYWdlKCRpZCwgJHBhcmFtcywgJHJldHVybmlkLCR0aGlzLT5MYW5nKCdhY2Nlc3NkZW5pZWQnKSk7Cgl9CgovKiAtPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LQoKICAgQ29kZSBmb3Iga2VnZWxlcmdlYm5pc3NlICJkZWZhdWx0YWRtaW4iIGFkbWluIGFjdGlvbgogICAKICAgLT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS0KICAgCiAgIFR5cGljYWxseSwgdGhpcyB3aWxsIGRpc3BsYXkgc29tZXRoaW5nIGZyb20gYSB0ZW1wbGF0ZQogICBvciBkbyBzb21lIG90aGVyIHRhc2suCiAgIAoqLwokY3VydGFiID0gJF9QT1NUWydhY3RpdmVfdGFiJ107CgokdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3RhYl9oZWFkZXJzJywkdGhpcy0+U3RhcnRUYWJIZWFkZXJzKCkuCiR0aGlzLT5TZXRUYWJIZWFkZXIoJ3NhaXNvbicsJHRoaXMtPkxhbmcoJ3RpdGxlX3NhaXNvbicpLCAoJ3NhaXNvbic9PSRjdXJ0YWIpID8gdHJ1ZTpmYWxzZSkuCiR0aGlzLT5TZXRUYWJIZWFkZXIoJ3NwaWVsZXInLCR0aGlzLT5MYW5nKCd0aXRsZV9zcGllbGVyJyksICgnc3BpZWxlcic9PSRjdXJ0YWIpID8gdHJ1ZTpmYWxzZSkuCiR0aGlzLT5TZXRUYWJIZWFkZXIoJ21hbm5zY2hhZnQnLCR0aGlzLT5MYW5nKCd0aXRsZV9tYW5uc2NoYWZ0JyksICgnbWFubnNjaGFmdCc9PSRjdXJ0YWIpID8gdHJ1ZTpmYWxzZSkuCiR0aGlzLT5TZXRUYWJIZWFkZXIoJ3NwaWVscGxhbicsJHRoaXMtPkxhbmcoJ3RpdGxlX3NwaWVscGxhbicpLCAoJ3NwaWVscGxhbic9PSRjdXJ0YWIpID8gdHJ1ZTpmYWxzZSkuCiR0aGlzLT5FbmRUYWJIZWFkZXJzKCkuJHRoaXMtPlN0YXJ0VGFiQ29udGVudCgpKTsKJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdlbmRfdGFiJywkdGhpcy0+RW5kVGFiKCkpOwokdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3RhYl9mb290ZXJzJywkdGhpcy0+RW5kVGFiQ29udGVudCgpKTsKJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdzdGFydF9zYWlzb25fdGFiJywkdGhpcy0+U3RhcnRUYWIoJ3NhaXNvbicpKTsKJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdzdGFydF9zcGllbGVyX3RhYicsJHRoaXMtPlN0YXJ0VGFiKCdzcGllbGVyJykpOwokdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3N0YXJ0X21hbm5zY2hhZnRfdGFiJywkdGhpcy0+U3RhcnRUYWIoJ21hbm5zY2hhZnQnKSk7CiR0aGlzLT5zbWFydHktPmFzc2lnbignc3RhcnRfc3BpZWxwbGFuX3RhYicsJHRoaXMtPlN0YXJ0VGFiKCdzcGllbHBsYW4nKSk7CgovKiBzbWFydHkgdGFncyBmb3IgcGxheWVyIHRhYiAqLwokcGxheWVycyA9IERhdGFiYXNlT3BlcmF0aW9uczo6Z2V0QWxsUGxheWVycygpOwokcGxheWVyY29udGVudCA9IGFycmF5KCk7CmZvcmVhY2goJHBsYXllcnMgYXMgJHBsYXllcikgewoJJHBsYXllcmNvbnRlbnRbJHBsYXllci0+Z2V0SWQoKV1bJ1BsYXllckZvcm1DaGFuZ2VTdGFydCddID0gJHRoaXMtPkNyZWF0ZUZvcm1TdGFydCgkcGxheWVyLT5nZXRJZCgpLCJjaGFuZ2VQbGF5ZXIiKTsKCSRwbGF5ZXJjb250ZW50WyRwbGF5ZXItPmdldElkKCldWydQbGF5ZXJGb3JtQ2hhbmdlVGV4dCddID0gJHRoaXMtPkNyZWF0ZUlucHV0VGV4dCgiIiwicGxheWVyY2hhbmdlX25hbWUiLCAkcGxheWVyLT5nZXROYW1lKCksIDUwLCA1MCk7CgkkcGxheWVyY29udGVudFskcGxheWVyLT5nZXRJZCgpXVsnUGxheWVyRm9ybUNoYW5nZVN1Ym1pdCddID0gJHRoaXMtPkNyZWF0ZUlucHV0U3VibWl0KCIiLCJwbGF5ZXJjaGFuZ2Vfc3VibWl0IiwkdGhpcy0+TGFuZygnY2hhbmdlJykpOwoJJHBsYXllcmNvbnRlbnRbJHBsYXllci0+Z2V0SWQoKV1bJ1BsYXllckZvcm1DaGFuZ2VTdG9wJ10gPSAkdGhpcy0+Q3JlYXRlRm9ybUVuZCgpOwoJJHBsYXllcmNvbnRlbnRbJHBsYXllci0+Z2V0SWQoKV1bJ1BsYXllck5hbWUnXSA9ICRwbGF5ZXItPmdldE5hbWUoKTsKfQokdGhpcy0+c21hcnR5LT5hc3NpZ24oJ1BsYXllckZvcm1BZGRTdGFydCcsJHRoaXMtPkNyZWF0ZUZvcm1TdGFydCgiIiwiYWRkUGxheWVyIikpOwokdGhpcy0+c21hcnR5LT5hc3NpZ24oJ1BsYXllckZvcm1BZGRUZXh0JywkdGhpcy0+Q3JlYXRlSW5wdXRUZXh0KCIiLCJwbGF5ZXJhZGRfbmFtZSIsICIiLCA1MCwgNTApKTsKJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdQbGF5ZXJGb3JtQWRkU3VibWl0JywkdGhpcy0+Q3JlYXRlSW5wdXRTdWJtaXQoIiIsInBsYXllcmFkZF9zdWJtaXQiLCR0aGlzLT5MYW5nKCdhZGQnKSkpOwokdGhpcy0+c21hcnR5LT5hc3NpZ24oJ1BsYXllckZvcm1BZGRTdG9wJywkdGhpcy0+Q3JlYXRlRm9ybUVuZCgpKTsKJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdwbGF5ZXJuYW1lX2hlYWRlcicsJHRoaXMtPkxhbmcoJ3BsYXllcm5hbWVfaGVhZGVyJykpOwokdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3BsYXllcmFjdGlvbl9oZWFkZXInLCR0aGlzLT5MYW5nKCdwbGF5ZXJhY3Rpb25faGVhZGVyJykpOwokdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3BsYXllcnMnLCRwbGF5ZXJjb250ZW50KTsKJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdhY3RpdmV0YWJfc3BpZWxlcicsJHRoaXMtPkNyZWF0ZUlucHV0SGlkZGVuKCIiLCJhY3RpdmVfdGFiIiwic3BpZWxlciIpKTsKJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdQbGF5ZXJEZXNjQWxsJywgJHRoaXMtPkxhbmcoJ2FsbFBsYXllcnMnKSk7CgovKiBzbWFydHkgdGFncyBmb3IgdGVhbXMgdGFiICovCiR0ZWFtcyA9IERhdGFiYXNlT3BlcmF0aW9uczo6Z2V0QWxsVGVhbXMoKTsKJHRlYW1jb250ZW50ID0gYXJyYXkoKTsKZm9yZWFjaCgkdGVhbXMgYXMgJHRlYW0pIHsKCSR0ZWFtY29udGVudFskdGVhbS0+Z2V0SWQoKV1bJ1RlYW1Gb3JtQ2hhbmdlU3RhcnQnXSA9ICR0aGlzLT5DcmVhdGVGb3JtU3RhcnQoJHRlYW0tPmdldElkKCksImNoYW5nZVRlYW0iKTsKCSR0ZWFtY29udGVudFskdGVhbS0+Z2V0SWQoKV1bJ1RlYW1Gb3JtQ2hhbmdlVGV4dCddID0gJHRoaXMtPkNyZWF0ZUlucHV0VGV4dCgiIiwidGVhbWNoYW5nZV9uYW1lIiwgJHRlYW0tPmdldE5hbWUoKSwgNTAsIDUwKTsKCSR0ZWFtY29udGVudFskdGVhbS0+Z2V0SWQoKV1bJ1RlYW1Gb3JtQ2hhbmdlU3VibWl0J10gPSAkdGhpcy0+Q3JlYXRlSW5wdXRTdWJtaXQoIiIsInRlYW1jaGFuZ2Vfc3VibWl0IiwkdGhpcy0+TGFuZygnY2hhbmdlJykpOwoJJHRlYW1jb250ZW50WyR0ZWFtLT5nZXRJZCgpXVsnVGVhbUZvcm1DaGFuZ2VTdG9wJ10gPSAkdGhpcy0+Q3JlYXRlRm9ybUVuZCgpOwoJJHRlYW1jb250ZW50WyR0ZWFtLT5nZXRJZCgpXVsnVGVhbU5hbWUnXSA9ICR0ZWFtLT5nZXROYW1lKCk7Cn0KJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdUZWFtRm9ybUFkZFN0YXJ0JywkdGhpcy0+Q3JlYXRlRm9ybVN0YXJ0KCIiLCJhZGRUZWFtIikpOwokdGhpcy0+c21hcnR5LT5hc3NpZ24oJ1RlYW1Gb3JtQWRkVGV4dCcsJHRoaXMtPkNyZWF0ZUlucHV0VGV4dCgiIiwidGVhbWFkZF9uYW1lIiwgIiIsIDUwLCA1MCkpOwokdGhpcy0+c21hcnR5LT5hc3NpZ24oJ1RlYW1Gb3JtQWRkU3VibWl0JywkdGhpcy0+Q3JlYXRlSW5wdXRTdWJtaXQoIiIsInRlYW1hZGRfc3VibWl0IiwkdGhpcy0+TGFuZygnYWRkJykpKTsKJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdUZWFtRm9ybUFkZFN0b3AnLCR0aGlzLT5DcmVhdGVGb3JtRW5kKCkpOwokdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3RlYW1uYW1lX2hlYWRlcicsJHRoaXMtPkxhbmcoJ3RlYW1uYW1lX2hlYWRlcicpKTsKJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCd0ZWFtYWN0aW9uX2hlYWRlcicsJHRoaXMtPkxhbmcoJ3RlYW1hY3Rpb25faGVhZGVyJykpOwokdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3RlYW1zJywkdGVhbWNvbnRlbnQpOwokdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2FjdGl2ZXRhYl9tYW5uc2NoYWZ0JywkdGhpcy0+Q3JlYXRlSW5wdXRIaWRkZW4oIiIsImFjdGl2ZV90YWIiLCJtYW5uc2NoYWZ0IikpOwoKLyogc21hcnR5IHRhZ3MgZm9yIHNhaXNvbnMgdGFiICovCiRzYWlzb25zID0gRGF0YWJhc2VPcGVyYXRpb25zOjpnZXRBbGxTYWlzb25zKCk7CiRzYWlzb25jb250ZW50ID0gYXJyYXkoKTsKZm9yZWFjaCgkc2Fpc29ucyBhcyAkc2Fpc29uKSB7Cgkkc2Fpc29uY29udGVudFskc2Fpc29uLT5nZXRJZCgpXVsnU2Fpc29uRm9ybUNoYW5nZVN0YXJ0J10gPSAkdGhpcy0+Q3JlYXRlRm9ybVN0YXJ0KCRzYWlzb24tPmdldElkKCksImNoYW5nZVNhaXNvbiIpOwoJJHNhaXNvbmNvbnRlbnRbJHNhaXNvbi0+Z2V0SWQoKV1bJ1NhaXNvbkZvcm1DaGFuZ2VOYW1lJ10gPSAkdGhpcy0+Q3JlYXRlSW5wdXRUZXh0KCIiLCJzYWlzb25jaGFuZ2VfbmFtZSIsICRzYWlzb24tPmdldE5hbWUoKSwgMjAsIDIwKTsKCSRzYWlzb25jb250ZW50WyRzYWlzb24tPmdldElkKCldWydTYWlzb25Gb3JtQ2hhbmdlQmVnaW4nXSA9ICR0aGlzLT5DcmVhdGVJbnB1dFRleHQoIiIsInNhaXNvbmNoYW5nZV9iZWdpbiIsICRzYWlzb24tPmdldEJlZ2luKCktPmZvcm1hdCgiZC5tLlkgSDppIiksIDIwLCAyMCk7Cgkkc2Fpc29uY29udGVudFskc2Fpc29uLT5nZXRJZCgpXVsnU2Fpc29uRm9ybUNoYW5nZUVuZCddID0gJHRoaXMtPkNyZWF0ZUlucHV0VGV4dCgiIiwic2Fpc29uY2hhbmdlX2VuZCIsICRzYWlzb24tPmdldEVuZCgpLT5mb3JtYXQoImQubS5ZIEg6aSIpLCAyMCwgMjApOwoJJHNhaXNvbmNvbnRlbnRbJHNhaXNvbi0+Z2V0SWQoKV1bJ1NhaXNvbkZvcm1DaGFuZ2VTdWJtaXQnXSA9ICR0aGlzLT5DcmVhdGVJbnB1dFN1Ym1pdCgiIiwic2Fpc29uY2hhbmdlX3N1Ym1pdCIsJHRoaXMtPkxhbmcoJ2NoYW5nZScpKTsKCSRzYWlzb25jb250ZW50WyRzYWlzb24tPmdldElkKCldWydTYWlzb25Gb3JtQ2hhbmdlU3RvcCddID0gJHRoaXMtPkNyZWF0ZUZvcm1FbmQoKTsKCSRzYWlzb25jb250ZW50WyRzYWlzb24tPmdldElkKCldWydUZWFtTmFtZSddID0gIiI7Cgkkc2Fpc29uY29udGVudFskc2Fpc29uLT5nZXRJZCgpXVsnU2Fpc29uTGlua1BsYXllckNvbm5lY3Rpb24nXSA9ICR0aGlzLT5DcmVhdGVMaW5rKCRzYWlzb24tPmdldElkKCksIkVkaXRQbGF5ZXJUb1RlYW0iLCIiLCR0aGlzLT5MYW5nKCdwbGF5ZXJ0b3RlYW0nKSk7Cn0KJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdTYWlzb25Gb3JtQWRkU3RhcnQnLCAkdGhpcy0+Q3JlYXRlRm9ybVN0YXJ0KCIiLCAiYWRkU2Fpc29uIikpOwokdGhpcy0+c21hcnR5LT5hc3NpZ24oJ1NhaXNvbkZvcm1BZGROYW1lJywgJHRoaXMtPkNyZWF0ZUlucHV0VGV4dCgiIiwic2Fpc29uYWRkX25hbWUiLCAiIiwgMjAsIDIwKSk7CiR0aGlzLT5zbWFydHktPmFzc2lnbignU2Fpc29uRm9ybUFkZEJlZ2luJywgJHRoaXMtPkNyZWF0ZUlucHV0VGV4dCgiIiwic2Fpc29uYWRkX2JlZ2luIiwgIiIsIDIwLCAyMCkpOwokdGhpcy0+c21hcnR5LT5hc3NpZ24oJ1NhaXNvbkZvcm1BZGRFbmQnLCAkdGhpcy0+Q3JlYXRlSW5wdXRUZXh0KCIiLCJzYWlzb25hZGRfZW5kIiwgIiIsIDIwLCAyMCkpOwokdGhpcy0+c21hcnR5LT5hc3NpZ24oJ1NhaXNvbkZvcm1BZGRTdWJtaXQnLCAkdGhpcy0+Q3JlYXRlSW5wdXRTdWJtaXQoIiIsInNhaXNvbmFkZF9zdWJtaXQiLCR0aGlzLT5MYW5nKCdhZGQnKSkpOwokdGhpcy0+c21hcnR5LT5hc3NpZ24oJ1NhaXNvbkZvcm1BZGRTdG9wJywgJHRoaXMtPkNyZWF0ZUZvcm1FbmQoKSk7CiR0aGlzLT5zbWFydHktPmFzc2lnbignc2Fpc29ubmFtZV9oZWFkZXInLCR0aGlzLT5MYW5nKCdzYWlzb25uYW1lX2hlYWRlcicpKTsKJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdzYWlzb25hY3Rpb25faGVhZGVyJywkdGhpcy0+TGFuZygnc2Fpc29uYWN0aW9uX2hlYWRlcicpKTsKJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdzYWlzb25zJywkc2Fpc29uY29udGVudCk7CiR0aGlzLT5zbWFydHktPmFzc2lnbignYWN0aXZldGFiX3NhaXNvbicsJHRoaXMtPkNyZWF0ZUlucHV0SGlkZGVuKCIiLCJhY3RpdmVfdGFiIiwic2Fpc29uIikpOwoKLyogc21hcnR5IHRhZ3MgZm9yIHNwaWVscGxhbiB0YWIgKi8KJHNhaXNvbmxpc3QgPSBhcnJheSgpOwokc2Fpc29uc2VsZWN0ZWQgPSAtMTsKJHNhaXNvbmluZGV4ID0gMDsKZm9yZWFjaCgkc2Fpc29ucyBhcyAkc2Fpc29uKSB7Cgkkc2Fpc29ubGlzdFskc2Fpc29uLT5nZXROYW1lKCldID0gJHNhaXNvbi0+Z2V0SWQoKTsKCWlmICgkX1BPU1RbJ3NwaWVscGxhbl9zYWlzb24nXSA9PSAkc2Fpc29uLT5nZXRJZCgpKSB7CgkJJHNhaXNvbnNlbGVjdGVkID0gJHNhaXNvbmluZGV4OwoJfQoJJHNhaXNvbmluZGV4ID0gJHNhaXNvbmluZGV4ICsgMTsKfQokdGVhbWxpc3QgPSBhcnJheSgpOwokdGVhbXNlbGVjdGVkID0gLTE7CiR0ZWFtaW5kZXggPSAwOwpmb3JlYWNoKCR0ZWFtcyBhcyAkdGVhbSkgewoJJHRlYW1saXN0WyR0ZWFtLT5nZXROYW1lKCldID0gJHRlYW0tPmdldElkKCk7CglpZiAoJF9QT1NUWydzcGllbHBsYW5fdGVhbSddID09ICR0ZWFtLT5nZXRJZCgpKSB7CgkJJHRlYW1zZWxlY3RlZCA9ICR0ZWFtaW5kZXg7Cgl9CgkkdGVhbWluZGV4ID0gJHRlYW1pbmRleCArIDE7Cn0KJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdTcGllbHBsYW5DaG9vc2VGb3JtU3RhcnQnLCAkdGhpcy0+Q3JlYXRlRm9ybVN0YXJ0KCIiLCAiZGVmYXVsdGFkbWluIikpOwokdGhpcy0+c21hcnR5LT5hc3NpZ24oJ1NwaWVscGxhbkNob29zZUZvcm1TYWlzb25TZWxlY3QnLCAkdGhpcy0+Q3JlYXRlSW5wdXREcm9wZG93bigiIiwgInNwaWVscGxhbl9zYWlzb24iLCAkc2Fpc29ubGlzdCwgJHNhaXNvbnNlbGVjdGVkKSk7CiR0aGlzLT5zbWFydHktPmFzc2lnbignU3BpZWxwbGFuQ2hvb3NlRm9ybVNhaXNvbkxhYmVsJywgJHRoaXMtPkxhbmcoJ3NhaXNvbmxhYmVsJykpOwokdGhpcy0+c21hcnR5LT5hc3NpZ24oJ1NwaWVscGxhbkNob29zZUZvcm1UZWFtU2VsZWN0JywgJHRoaXMtPkNyZWF0ZUlucHV0RHJvcGRvd24oIiIsICJzcGllbHBsYW5fdGVhbSIsICR0ZWFtbGlzdCwgJHRlYW1zZWxlY3RlZCkpOwokdGhpcy0+c21hcnR5LT5hc3NpZ24oJ1NwaWVscGxhbkNob29zZUZvcm1UZWFtTGFiZWwnLCAkdGhpcy0+TGFuZygndGVhbWxhYmVsJykpOwokdGhpcy0+c21hcnR5LT5hc3NpZ24oJ1NwaWVscGxhbkNob29zZUZvcm1TdWJtaXQnLCAkdGhpcy0+Q3JlYXRlSW5wdXRTdWJtaXQoIiIsICIiLCAkdGhpcy0+TGFuZygnbG9hZCcpKSk7CiR0aGlzLT5zbWFydHktPmFzc2lnbignU3BpZWxwbGFuQ2hvb3NlRm9ybVN0b3AnLCAkdGhpcy0+Q3JlYXRlRm9ybUVuZCgpKTsKJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdTcGllbHBsYW5USG9wcG9uZW50JywgJHRoaXMtPkxhbmcoJ29wcG9uZW50JykpOwokdGhpcy0+c21hcnR5LT5hc3NpZ24oJ1NwaWVscGxhblRIZGF0ZScsICR0aGlzLT5MYW5nKCdkYXRlJykpOwokdGhpcy0+c21hcnR5LT5hc3NpZ24oJ1NwaWVscGxhblRIdGltZScsICR0aGlzLT5MYW5nKCd0aW1lJykpOwokdGhpcy0+c21hcnR5LT5hc3NpZ24oJ1NwaWVscGxhblRIaG9tZWF3YXknLCAkdGhpcy0+TGFuZygnaG9tZWF3YXknKSk7CiR0aGlzLT5zbWFydHktPmFzc2lnbignU3BpZWxwbGFuVEgxMjAnLCAkdGhpcy0+TGFuZygnMTIwQmFsbHMnKSk7CiR0aGlzLT5zbWFydHktPmFzc2lnbignU3BpZWxwbGFuVEhyZXN1bHQnLCAkdGhpcy0+TGFuZygncmVzdWx0JykpOwokdGhpcy0+c21hcnR5LT5hc3NpZ24oJ1NwaWVscGxhblRIYWN0aW9uJywgJHRoaXMtPkxhbmcoJ2FjdGlvbicpKTsKJGdhbWVjb250ZW50ID0gYXJyYXkoKTsKaWYgKCgkdGVhbXNlbGVjdGVkICE9IC0xKSAmJiAoJHNhaXNvbnNlbGVjdGVkICE9IC0xKSkgewoJJHNhaXNvbnZhbHVlcyA9IGFycmF5X3ZhbHVlcygkc2Fpc29ubGlzdCk7CgkkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ1NwaWVscGxhblNlbGVjdFNhaXNvbkhpZGRlbicsJHRoaXMtPkNyZWF0ZUlucHV0SGlkZGVuKCIiLCAic3BpZWxwbGFuX3NhaXNvbiIsICRzYWlzb252YWx1ZXNbJHNhaXNvbnNlbGVjdGVkXSkpOwoJJHRlYW12YWx1ZXMgPSBhcnJheV92YWx1ZXMoJHRlYW1saXN0KTsKCSR0aGlzLT5zbWFydHktPmFzc2lnbignU3BpZWxwbGFuU2VsZWN0VGVhbUhpZGRlbicsJHRoaXMtPkNyZWF0ZUlucHV0SGlkZGVuKCIiLCAic3BpZWxwbGFuX3RlYW0iLCAkdGVhbXZhbHVlc1skdGVhbXNlbGVjdGVkXSkpOwoJJHRlYW0gPSBEYXRhYmFzZU9wZXJhdGlvbnM6OmdldFRlYW0oJHRlYW12YWx1ZXNbJHRlYW1zZWxlY3RlZF0pOwoJJHNhaXNvbiA9IERhdGFiYXNlT3BlcmF0aW9uczo6Z2V0U2Fpc29uKCRzYWlzb252YWx1ZXNbJHNhaXNvbnNlbGVjdGVkXSk7CgkkZ2FtZXMgPSBEYXRhYmFzZU9wZXJhdGlvbnM6OmdldFRpbWVUYWJsZSgkc2Fpc29uLCAkdGVhbSk7CgkkdGVtcEZvcm1BZGQgPSAgJHRoaXMtPkNyZWF0ZUZvcm1TdGFydCgiaWRfYWRkR2FtZSIsICJhZGRHYW1lIik7CgkkdGVtcEZvcm1BZGRJZCA9IHByZWdfcmVwbGFjZSgnLy4qPGZvcm0gaWQ9IihbXiJdKykiKC4qXG4pKi4qLycsICckezF9JywgJHRlbXBGb3JtQWRkKTsKCSR0aGlzLT5zbWFydHktPmFzc2lnbignU3BpZWxwbGFuR2FtZUFkZFN0YXJ0JywgJHRlbXBGb3JtQWRkKTsKCSR0aGlzLT5zbWFydHktPmFzc2lnbignU3BpZWxwbGFuR2FtZUFkZFN0b3AnLCAkdGhpcy0+Q3JlYXRlRm9ybUVuZCgpKTsKCSR0ZW1wRm9ybUNoYW5nZSA9ICR0aGlzLT5DcmVhdGVGb3JtU3RhcnQoImlkX2NoYW5nZUdhbWUiLCAiY2hhbmdlR2FtZSIpOwoJJHRlbXBGb3JtQ2hhbmdlSWQgPSBwcmVnX3JlcGxhY2UoJy8uKjxmb3JtIGlkPSIoW14iXSspIiguKlxuKSouKi8nLCAnJHsxfScsICR0ZW1wRm9ybUNoYW5nZSk7CgkkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ1NwaWVscGxhbkdhbWVDaGFuZ2VTdGFydCcsICR0ZW1wRm9ybUNoYW5nZSk7CgkkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ1NwaWVscGxhbkdhbWVDaGFuZ2VTdG9wJywgJHRoaXMtPkNyZWF0ZUZvcm1FbmQoKSk7Cglmb3JlYWNoICgkZ2FtZXMgYXMgJGdhbWUpIHsKCQlpZiAoJGdhbWUtPmlzMTIwICgpID09IGZhbHNlKSB7CgkJCSRnYW1lcmVzdWx0cyA9IERhdGFiYXNlT3BlcmF0aW9uczo6Z2V0UmVzdWx0T2ZHYW1lICggJGdhbWUgKTsKCQkJJG91cnJlc3VsdCA9IDA7CgkJCSR0aGVpcnJlc3VsdCA9IDA7CgkJCWZvcmVhY2ggKCAkZ2FtZXJlc3VsdHMgYXMgJGdhbWVyZXN1bHQgKSB7CgkJCQkkb3VycmVzdWx0ICs9ICRnYW1lcmVzdWx0LT5nZXRHZXMgKCk7CgkJCQkkdGhlaXJyZXN1bHQgKz0gJGdhbWVyZXN1bHQtPmdldE9HZXMgKCk7CgkJCX0KCQkJaWYgKCRnYW1lLT5nZXRIb21lICgpKSB7CgkJCQkkZ2FtZXJlc3VsdCA9ICRvdXJyZXN1bHQgLiAiIDogIiAuICR0aGVpcnJlc3VsdDsKCQkJfSBlbHNlIHsKCQkJCSRnYW1lcmVzdWx0ID0gJHRoZWlycmVzdWx0IC4gIiA6ICIgLiAkb3VycmVzdWx0OwoJCQl9CgkJfSBlbHNlIHsKCQkJJGdhbWVyZXN1bHRzID0gRGF0YWJhc2VPcGVyYXRpb25zOjpnZXRNYXRjaDEyME9mR2FtZSgkZ2FtZSk7CgkJCSRvdXJwb2ludHMgPSAwOwoJCQkkdGhlaXJwb2ludHMgPSAwOwoJCQkkb3VyY29tcGxldGUgPSAwOwoJCQkkdGhlaXJjb21wbGV0ZSA9IDA7CgkJCWZvcmVhY2goJGdhbWVyZXN1bHRzIGFzICRnYW1lcmVzdWx0KSB7CgkJCQkkb3VycG9pbnRzICs9ICRnYW1lcmVzdWx0LT5nZXRNYXRjaFBvaW50cygpOwoJCQkJJHRoZWlycG9pbnRzICs9ICRnYW1lcmVzdWx0LT5nZXRNYXRjaE9Qb2ludHMoKTsKCQkJCSRvdXJjb21wbGV0ZSArPSAkZ2FtZXJlc3VsdC0+Z2V0TWF0Y2hDb21wbGV0ZUdlcygpOwoJCQkJJHRoZWlyY29tcGxldGUgKz0gJGdhbWVyZXN1bHQtPmdldE1hdGNoQ29tcGxldGVPR2VzKCk7CgkJCX0KCQkJaWYgKCgkb3VyY29tcGxldGUgPiAwKSAmJiAoJHRoZWlyY29tcGxldGUgPiAwKSkgewoJCQkJaWYgKCRvdXJjb21wbGV0ZSA+ICR0aGVpcmNvbXBsZXRlKSB7CgkJCQkJJG91cnBvaW50cyArPSAyMDsKCQkJCX0gZWxzZSBpZiAoJG91cmNvbXBsZXRlIDwgJHRoZWlyY29tcGxldGUpIHsKCQkJCQkkdGhlaXJwb2ludHMgKz0gMjA7CgkJCQl9IGVsc2UgewoJCQkJCSRvdXJwb2ludHMgKz0gMTA7CgkJCQkJJHRoZWlycG9pbnRzICs9IDEwOwoJCQkJfQoJCQl9CgkJCWlmICgkZ2FtZS0+Z2V0SG9tZSgpKSB7CgkJCQkkZ2FtZXJlc3VsdCA9IChpbnQpKCRvdXJwb2ludHMvMTApLiIuIi4oaW50KSgkb3VycG9pbnRzJTEwKS4iIDogIi4oaW50KSgkdGhlaXJwb2ludHMvMTApLiIuIi4oaW50KSgkdGhlaXJwb2ludHMlMTApLiIgKCIuJG91cmNvbXBsZXRlLiIgOiAiLiR0aGVpcmNvbXBsZXRlLiIpIjsKCQkJfSBlbHNlIHsKCQkJCSRnYW1lcmVzdWx0ID0gKGludCkoJHRoZWlycG9pbnRzLzEwKS4iLiIuKGludCkoJHRoZWlycG9pbnRzJTEwKS4iIDogIi4oaW50KSgkb3VycG9pbnRzLzEwKS4iLiIuKGludCkoJG91cnBvaW50cyUxMCkuIiAoIi4kdGhlaXJjb21wbGV0ZS4iIDogIi4kb3VyY29tcGxldGUuIikiOwoJCQl9CgkJfQoJCSRsaW5rZmxhZ3MgPSBhcnJheSgic3BpZWxwbGFuX3RlYW0iID0+ICR0ZWFtdmFsdWVzWyR0ZWFtc2VsZWN0ZWRdLCAic3BpZWxwbGFuX3NhaXNvbiIgPT4gJHNhaXNvbnZhbHVlc1skc2Fpc29uc2VsZWN0ZWRdKTsKCQlpZiAoJGdhbWUtPmlzMTIwKCkgPT0gZmFsc2UpIHsKCQkJJGdhbWVjb250ZW50WyRnYW1lLT5nZXRJZCgpXVsnU3BpZWxwbGFuR2FtZUNoYW5nZVJlc3VsdCddID0gJHRoaXMtPkNyZWF0ZUxpbmsoJGdhbWUtPmdldElkKCksIkVkaXRHYW1lIiwiIiwkZ2FtZXJlc3VsdCwkbGlua2ZsYWdzKTsKCQl9IGVsc2UgewoJCQkkZ2FtZWNvbnRlbnRbJGdhbWUtPmdldElkKCldWydTcGllbHBsYW5HYW1lQ2hhbmdlUmVzdWx0J10gPSAkdGhpcy0+Q3JlYXRlTGluaygkZ2FtZS0+Z2V0SWQoKSwiRWRpdDEyMEdhbWUiLCIiLCRnYW1lcmVzdWx0LCRsaW5rZmxhZ3MpOwoJCX0KCQkkZ2FtZWNvbnRlbnRbJGdhbWUtPmdldElkKCldWydTcGllbHBsYW5HYW1lQ2hhbmdlR2FtZUlkSGlkZGVuJ10gPSAkdGhpcy0+Q3JlYXRlSW5wdXRIaWRkZW4oIiIsICJnYW1lY2hhbmdlX2dhbWVpZCIsICRnYW1lLT5nZXRJZCgpKTsKCQkkZ2FtZWNvbnRlbnRbJGdhbWUtPmdldElkKCldWydTcGllbHBsYW5HYW1lQ2hhbmdlSG9tZUJvb2wnXSA9ICRnYW1lLT5nZXRIb21lKCk7CgkJJGdhbWVjb250ZW50WyRnYW1lLT5nZXRJZCgpXVsnU3BpZWxwbGFuR2FtZUNoYW5nZURhdGUnXSA9ICR0aGlzLT5DcmVhdGVJbnB1dFRleHQoIiIsImdhbWVjaGFuZ2VfZGF0ZSIsICRnYW1lLT5nZXREYXRlKCktPmZvcm1hdCgiZC5tLlkiKSwgMTAsIDEwKTsKCQkkZ2FtZWNvbnRlbnRbJGdhbWUtPmdldElkKCldWydTcGllbHBsYW5HYW1lQ2hhbmdlVGltZSddID0gJHRoaXMtPkNyZWF0ZUlucHV0VGV4dCgiIiwiZ2FtZWNoYW5nZV90aW1lIiwgJGdhbWUtPmdldERhdGUoKS0+Zm9ybWF0KCJIOmkiKSwgNSwgNSk7CgkJJGdhbWVjb250ZW50WyRnYW1lLT5nZXRJZCgpXVsnU3BpZWxwbGFuR2FtZUNoYW5nZU9wcG9uZW50J10gPSAkdGhpcy0+Q3JlYXRlSW5wdXRUZXh0KCIiLCJnYW1lY2hhbmdlX29wcG9uZW50IiwgJGdhbWUtPmdldE9wcG9uZW50KCksIDMwLCAzMCk7CgkJJGdhbWVjb250ZW50WyRnYW1lLT5nZXRJZCgpXVsnU3BpZWxwbGFuR2FtZUNoYW5nZUhvbWUnXSA9ICR0aGlzLT5DcmVhdGVJbnB1dENoZWNrYm94KCIiLCJnYW1lY2hhbmdlX2hvbWUiLCB0cnVlLCAkZ2FtZS0+Z2V0SG9tZSgpKTsKCQkkZ2FtZWNvbnRlbnRbJGdhbWUtPmdldElkKCldWydTcGllbHBsYW5HYW1lQ2hhbmdlMTIwJ10gPSAkdGhpcy0+Q3JlYXRlSW5wdXRDaGVja2JveCgiIiwgImdhbWVjaGFuZ2VfMTIwIiwgdHJ1ZSwgJGdhbWUtPmlzMTIwKCkpOwoJCSRnYW1lY29udGVudFskZ2FtZS0+Z2V0SWQoKV1bJ1NwaWVscGxhbkdhbWVDaGFuZ2VTdWJtaXQnXSA9ICR0aGlzLT5DcmVhdGVJbnB1dFN1Ym1pdCgiIiwiZ2FtZWNoYW5nZV9zdWJtaXQiLCAkdGhpcy0+TGFuZygnY2hhbmdlJyksICJvbmNsaWNrPVwic3VibWl0Rm9ybSh0aGlzLCAnIi4kdGVtcEZvcm1DaGFuZ2VJZC4iJylcIiIpOwoJfQoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdTcGllbHBsYW5HYW1lQWRkRGF0ZScsICR0aGlzLT5DcmVhdGVJbnB1dFRleHQoIiIsImdhbWVhZGRfZGF0ZSIsICIiLCAxMCwgMTApKTsKCSR0aGlzLT5zbWFydHktPmFzc2lnbignU3BpZWxwbGFuR2FtZUFkZFRpbWUnLCAkdGhpcy0+Q3JlYXRlSW5wdXRUZXh0KCIiLCJnYW1lYWRkX3RpbWUiLCAiIiwgNSwgNSkpOwoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdTcGllbHBsYW5HYW1lQWRkT3Bwb25lbnQnLCAkdGhpcy0+Q3JlYXRlSW5wdXRUZXh0KCIiLCJnYW1lYWRkX29wcG9uZW50IiwgIiIsIDMwLCAzMCkpOwoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdTcGllbHBsYW5HYW1lQWRkSG9tZScsICR0aGlzLT5DcmVhdGVJbnB1dENoZWNrYm94KCIiLCJnYW1lYWRkX2hvbWUiLCB0cnVlLCBmYWxzZSkpOwoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdTcGllbHBsYW5HYW1lQWRkMTIwJywgJHRoaXMtPkNyZWF0ZUlucHV0Q2hlY2tib3goIiIsImdhbWVhZGRfMTIwIiwgdHJ1ZSwgZmFsc2UpKTsKCSR0aGlzLT5zbWFydHktPmFzc2lnbignU3BpZWxwbGFuR2FtZUFkZFN1Ym1pdCcsICR0aGlzLT5DcmVhdGVJbnB1dFN1Ym1pdCgiIiwiZ2FtZWFkZF9zdWJtaXQiLCAkdGhpcy0+TGFuZygnYWRkJyksICJvbmNsaWNrPVwic3VibWl0Rm9ybSh0aGlzLCAnIi4kdGVtcEZvcm1BZGRJZC4iJylcIiIpKTsKfQokdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2dhbWVzJywkZ2FtZWNvbnRlbnQpOwokdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2FjdGl2ZXRhYl9zcGllbHBsYW4nLCR0aGlzLT5DcmVhdGVJbnB1dEhpZGRlbigiIiwiYWN0aXZlX3RhYiIsInNwaWVscGxhbiIpKTsKCmVjaG8gJHRoaXMtPlByb2Nlc3NUZW1wbGF0ZSgnYWRtaW5wYW5lbC50cGwnKTsKPz4K]]></data>
	</file>
	<file>
	  <filename>/action.Edit120Game.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKcmVxdWlyZV9vbmNlKCdkYXRhbW9kZWwvZGF0YWJhc2VvcGVyYXRpb25zLnBocCcpOwppZiAoIWlzc2V0KCRnQ21zKSkgZXhpdDsKaWYgKCEgJHRoaXMtPkNoZWNrQWNjZXNzKCdLZWdlbGVyZ2Vibmlzc2UnKSkKCXsKCXJldHVybiAkdGhpcy0+RGlzcGxheUVycm9yUGFnZSgkaWQsICRwYXJhbXMsICRyZXR1cm5pZCwkdGhpcy0+TGFuZygnYWNjZXNzZGVuaWVkJykpOwoJfQovKiAtPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LQoKICAgQ29kZSBmb3Iga2VnZWxlcmdlYm5pc3NlICJFZGl0R2FtZSIgYWN0aW9uCgogICAtPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LQogICAKICAgVHlwaWNhbGx5LCB0aGlzIHdpbGwgZGlzcGxheSBzb21ldGhpbmcgZnJvbSBhIHRlbXBsYXRlCiAgIG9yIGRvIHNvbWUgb3RoZXIgdGFzay4KICAgCiovCgovKiBQcm9jZXNzIFBvc3QgVGhpbmdzICovCiRtYWN0X3ZhcnMgPSBleHBsb2RlKCIsIiwgJF9HRVRbJ21hY3QnXSk7CiRnYW1laWQgPSAkbWFjdF92YXJzWzFdOwokX1NFU1NJT05bJ2dhbWUxMjBSZXN1bHQnXSA9ICRfR0VUOwoKLyogZmV0Y2ggZGF0YSBmcm9tIGRhdGFiYXNlICovCiRnYW1lID0gRGF0YWJhc2VPcGVyYXRpb25zOjpnZXRHYW1lKCRnYW1laWQpOwokcmVzdWx0cyA9IERhdGFiYXNlT3BlcmF0aW9uczo6Z2V0TWF0Y2gxMjBPZkdhbWUoJGdhbWUpOwoKLyogY3JlYXRlIGFycmF5IG9mIHBsYXllcnMgZm9yIHNlbGVjdGlvbiAqLwokc2Fpc29uaWQgPSAkX0dFVFskZ2FtZWlkLiJzcGllbHBsYW5fc2Fpc29uIl07CiRzYWlzb24gPSBEYXRhYmFzZU9wZXJhdGlvbnM6OmdldFNhaXNvbigkc2Fpc29uaWQpOwokcHR0cyA9IERhdGFiYXNlT3BlcmF0aW9uczo6Z2V0UGxheWVyc1RvVGVhbSgkc2Fpc29uKTsKJHBsYXllcnNvZnRlYW0gPSBhcnJheSgpOwokb3RoZXJwbGF5ZXJzID0gYXJyYXkoKTsKLyogZmlyc3QgYWxsIHBsYXllcnMgb2YgdGhlIHRlYW0gKi8KZm9yZWFjaCgkcHR0cyBhcyAkcHR0KSB7CglpZiAoJHB0dC0+Z2V0VGVhbSgpLT5nZXRJZCgpID09ICRnYW1lLT5nZXRPdXJUZWFtKCktPmdldElkKCkpIHsKCQkkcGxheWVyc29mdGVhbVskcHR0LT5nZXRQbGF5ZXIoKS0+Z2V0TmFtZSgpXSA9ICRwdHQtPmdldFBsYXllcigpLT5nZXRJZCgpOwoJfQllbHNlIHsKCQkkb3RoZXJwbGF5ZXJzWyRwdHQtPmdldFBsYXllcigpLT5nZXROYW1lKCldID0gJHB0dC0+Z2V0UGxheWVyKCktPmdldElkKCk7Cgl9Cn0KJHBsYXllcnNhcnJheSA9IGFycmF5X21lcmdlKCRwbGF5ZXJzb2Z0ZWFtLCAkb3RoZXJwbGF5ZXJzKTsKCi8qIGNyZWF0ZSBhcnJheSBvZiBpbnB1dCBmaWVsZHMgZm9yIGV4aXN0aW5nIHJlc3VsdHMgKi8KJG51bWJlcm9mcmVzdWx0cyA9IDA7CiRmb3JtZWxlbWVudHMgPSBhcnJheSgpOwpmb3JlYWNoKCRyZXN1bHRzIGFzICRyZXN1bHQpIAp7CgkkZm9ybWVsZW1lbnRzWyRyZXN1bHQtPmdldElkKCldWydHYW1lQ291bnQnXSA9ICR0aGlzLT5DcmVhdGVJbnB1dENoZWNrYm94KCIiLCJnYW1lX2NvdW50Ii4kcmVzdWx0LT5nZXRJZCgpLCB0cnVlLCAkcmVzdWx0LT5nZXRQQ291bnQoKSk7CgkkZm9ybWVsZW1lbnRzWyRyZXN1bHQtPmdldElkKCldWydHYW1lT0NvdW50J10gPSAkdGhpcy0+Q3JlYXRlSW5wdXRDaGVja2JveCgiIiwiZ2FtZV9vY291bnQiLiRyZXN1bHQtPmdldElkKCksIHRydWUsICRyZXN1bHQtPmdldE9Db3VudCgpKTsKCSRmb3JtZWxlbWVudHNbJHJlc3VsdC0+Z2V0SWQoKV1bJ0dhbWVQbGF5ZXJTZWxlY3Rpb25fUzEnXSA9ICR0aGlzLT5DcmVhdGVJbnB1dERyb3Bkb3duKCIiLCJnYW1lX3BsYXllcl9TMSIuJHJlc3VsdC0+Z2V0UzEoKS0+Z2V0SWQoKSwkcGxheWVyc2FycmF5LCItMSIsJHJlc3VsdC0+Z2V0UzEoKS0+Z2V0UGxheWVyKCktPmdldElkKCkpOwoJJGZvcm1lbGVtZW50c1skcmVzdWx0LT5nZXRJZCgpXVsnR2FtZU9wcG9uZW50X1MxJ10gPSAkdGhpcy0+Q3JlYXRlSW5wdXRUZXh0KCIiLCJnYW1lX29wcG9uZW50X1MxIi4kcmVzdWx0LT5nZXRTMSgpLT5nZXRJZCgpLCAkcmVzdWx0LT5nZXRTMSgpLT5nZXRPcHBvbmVudCgpLCAzMCwgMzApOwoJJGZvcm1lbGVtZW50c1skcmVzdWx0LT5nZXRJZCgpXVsnR2FtZUdlc19TMSddID0gJHRoaXMtPkNyZWF0ZUlucHV0VGV4dCgiIiwiZ2FtZV9nZXNfUzEiLiRyZXN1bHQtPmdldFMxKCktPmdldElkKCksICRyZXN1bHQtPmdldFMxKCktPmdldEdlcygpLCA1LCA1KTsKCSRmb3JtZWxlbWVudHNbJHJlc3VsdC0+Z2V0SWQoKV1bJ0dhbWVBYnJfUzEnXSA9ICR0aGlzLT5DcmVhdGVJbnB1dFRleHQoIiIsImdhbWVfYWJyX1MxIi4kcmVzdWx0LT5nZXRTMSgpLT5nZXRJZCgpLCAkcmVzdWx0LT5nZXRTMSgpLT5nZXRBYnIoKSwgNSwgNSk7CgkkZm9ybWVsZW1lbnRzWyRyZXN1bHQtPmdldElkKCldWydHYW1lRmVobF9TMSddID0gJHRoaXMtPkNyZWF0ZUlucHV0VGV4dCgiIiwiZ2FtZV9mZWhsX1MxIi4kcmVzdWx0LT5nZXRTMSgpLT5nZXRJZCgpLCAkcmVzdWx0LT5nZXRTMSgpLT5nZXRGZWhsKCksIDUsIDUpOwoJJGZvcm1lbGVtZW50c1skcmVzdWx0LT5nZXRJZCgpXVsnR2FtZU9HZXNfUzEnXSA9ICR0aGlzLT5DcmVhdGVJbnB1dFRleHQoIiIsImdhbWVfb2dlc19TMSIuJHJlc3VsdC0+Z2V0UzEoKS0+Z2V0SWQoKSwgJHJlc3VsdC0+Z2V0UzEoKS0+Z2V0T0dlcygpLCA1LCA1KTsKCSRmb3JtZWxlbWVudHNbJHJlc3VsdC0+Z2V0SWQoKV1bJ0dhbWVPQWJyX1MxJ10gPSAkdGhpcy0+Q3JlYXRlSW5wdXRUZXh0KCIiLCJnYW1lX29hYnJfUzEiLiRyZXN1bHQtPmdldFMxKCktPmdldElkKCksICRyZXN1bHQtPmdldFMxKCktPmdldE9BYnIoKSwgNSwgNSk7CgkkZm9ybWVsZW1lbnRzWyRyZXN1bHQtPmdldElkKCldWydHYW1lT0ZlaGxfUzEnXSA9ICR0aGlzLT5DcmVhdGVJbnB1dFRleHQoIiIsImdhbWVfb2ZlaGxfUzEiLiRyZXN1bHQtPmdldFMxKCktPmdldElkKCksICRyZXN1bHQtPmdldFMxKCktPmdldE9GZWhsKCksIDUsIDUpOwoJJGZvcm1lbGVtZW50c1skcmVzdWx0LT5nZXRJZCgpXVsnR2FtZUluZGV4X1MxJ10gPSAkdGhpcy0+Q3JlYXRlSW5wdXRIaWRkZW4oIiIsImdhbWVfaW5kZXhfUzEiLiRudW1iZXJvZnJlc3VsdHMsICRyZXN1bHQtPmdldFMxKCktPmdldElkKCkpOwoJJGZvcm1lbGVtZW50c1skcmVzdWx0LT5nZXRJZCgpXVsnR2FtZVBsYXllclNlbGVjdGlvbl9TMiddID0gJHRoaXMtPkNyZWF0ZUlucHV0RHJvcGRvd24oIiIsImdhbWVfcGxheWVyX1MyIi4kcmVzdWx0LT5nZXRTMigpLT5nZXRJZCgpLCRwbGF5ZXJzYXJyYXksIi0xIiwkcmVzdWx0LT5nZXRTMigpLT5nZXRQbGF5ZXIoKS0+Z2V0SWQoKSk7CgkkZm9ybWVsZW1lbnRzWyRyZXN1bHQtPmdldElkKCldWydHYW1lT3Bwb25lbnRfUzInXSA9ICR0aGlzLT5DcmVhdGVJbnB1dFRleHQoIiIsImdhbWVfb3Bwb25lbnRfUzIiLiRyZXN1bHQtPmdldFMyKCktPmdldElkKCksICRyZXN1bHQtPmdldFMyKCktPmdldE9wcG9uZW50KCksIDMwLCAzMCk7CgkkZm9ybWVsZW1lbnRzWyRyZXN1bHQtPmdldElkKCldWydHYW1lR2VzX1MyJ10gPSAkdGhpcy0+Q3JlYXRlSW5wdXRUZXh0KCIiLCJnYW1lX2dlc19TMiIuJHJlc3VsdC0+Z2V0UzIoKS0+Z2V0SWQoKSwgJHJlc3VsdC0+Z2V0UzIoKS0+Z2V0R2VzKCksIDUsIDUpOwoJJGZvcm1lbGVtZW50c1skcmVzdWx0LT5nZXRJZCgpXVsnR2FtZUFicl9TMiddID0gJHRoaXMtPkNyZWF0ZUlucHV0VGV4dCgiIiwiZ2FtZV9hYnJfUzIiLiRyZXN1bHQtPmdldFMyKCktPmdldElkKCksICRyZXN1bHQtPmdldFMyKCktPmdldEFicigpLCA1LCA1KTsKCSRmb3JtZWxlbWVudHNbJHJlc3VsdC0+Z2V0SWQoKV1bJ0dhbWVGZWhsX1MyJ10gPSAkdGhpcy0+Q3JlYXRlSW5wdXRUZXh0KCIiLCJnYW1lX2ZlaGxfUzIiLiRyZXN1bHQtPmdldFMyKCktPmdldElkKCksICRyZXN1bHQtPmdldFMyKCktPmdldEZlaGwoKSwgNSwgNSk7CgkkZm9ybWVsZW1lbnRzWyRyZXN1bHQtPmdldElkKCldWydHYW1lT0dlc19TMiddID0gJHRoaXMtPkNyZWF0ZUlucHV0VGV4dCgiIiwiZ2FtZV9vZ2VzX1MyIi4kcmVzdWx0LT5nZXRTMigpLT5nZXRJZCgpLCAkcmVzdWx0LT5nZXRTMigpLT5nZXRPR2VzKCksIDUsIDUpOwoJJGZvcm1lbGVtZW50c1skcmVzdWx0LT5nZXRJZCgpXVsnR2FtZU9BYnJfUzInXSA9ICR0aGlzLT5DcmVhdGVJbnB1dFRleHQoIiIsImdhbWVfb2Ficl9TMiIuJHJlc3VsdC0+Z2V0UzIoKS0+Z2V0SWQoKSwgJHJlc3VsdC0+Z2V0UzIoKS0+Z2V0T0FicigpLCA1LCA1KTsKCSRmb3JtZWxlbWVudHNbJHJlc3VsdC0+Z2V0SWQoKV1bJ0dhbWVPRmVobF9TMiddID0gJHRoaXMtPkNyZWF0ZUlucHV0VGV4dCgiIiwiZ2FtZV9vZmVobF9TMiIuJHJlc3VsdC0+Z2V0UzIoKS0+Z2V0SWQoKSwgJHJlc3VsdC0+Z2V0UzIoKS0+Z2V0T0ZlaGwoKSwgNSwgNSk7CgkkZm9ybWVsZW1lbnRzWyRyZXN1bHQtPmdldElkKCldWydHYW1lSW5kZXhfUzInXSA9ICR0aGlzLT5DcmVhdGVJbnB1dEhpZGRlbigiIiwiZ2FtZV9pbmRleF9TMiIuJG51bWJlcm9mcmVzdWx0cywgJHJlc3VsdC0+Z2V0UzIoKS0+Z2V0SWQoKSk7CgkkZm9ybWVsZW1lbnRzWyRyZXN1bHQtPmdldElkKCldWydHYW1lUGxheWVyU2VsZWN0aW9uX1MzJ10gPSAkdGhpcy0+Q3JlYXRlSW5wdXREcm9wZG93bigiIiwiZ2FtZV9wbGF5ZXJfUzMiLiRyZXN1bHQtPmdldFMzKCktPmdldElkKCksJHBsYXllcnNhcnJheSwiLTEiLCRyZXN1bHQtPmdldFMzKCktPmdldFBsYXllcigpLT5nZXRJZCgpKTsKCSRmb3JtZWxlbWVudHNbJHJlc3VsdC0+Z2V0SWQoKV1bJ0dhbWVPcHBvbmVudF9TMyddID0gJHRoaXMtPkNyZWF0ZUlucHV0VGV4dCgiIiwiZ2FtZV9vcHBvbmVudF9TMyIuJHJlc3VsdC0+Z2V0UzMoKS0+Z2V0SWQoKSwgJHJlc3VsdC0+Z2V0UzMoKS0+Z2V0T3Bwb25lbnQoKSwgMzAsIDMwKTsKCSRmb3JtZWxlbWVudHNbJHJlc3VsdC0+Z2V0SWQoKV1bJ0dhbWVHZXNfUzMnXSA9ICR0aGlzLT5DcmVhdGVJbnB1dFRleHQoIiIsImdhbWVfZ2VzX1MzIi4kcmVzdWx0LT5nZXRTMygpLT5nZXRJZCgpLCAkcmVzdWx0LT5nZXRTMygpLT5nZXRHZXMoKSwgNSwgNSk7CgkkZm9ybWVsZW1lbnRzWyRyZXN1bHQtPmdldElkKCldWydHYW1lQWJyX1MzJ10gPSAkdGhpcy0+Q3JlYXRlSW5wdXRUZXh0KCIiLCJnYW1lX2Ficl9TMyIuJHJlc3VsdC0+Z2V0UzMoKS0+Z2V0SWQoKSwgJHJlc3VsdC0+Z2V0UzMoKS0+Z2V0QWJyKCksIDUsIDUpOwoJJGZvcm1lbGVtZW50c1skcmVzdWx0LT5nZXRJZCgpXVsnR2FtZUZlaGxfUzMnXSA9ICR0aGlzLT5DcmVhdGVJbnB1dFRleHQoIiIsImdhbWVfZmVobF9TMyIuJHJlc3VsdC0+Z2V0UzMoKS0+Z2V0SWQoKSwgJHJlc3VsdC0+Z2V0UzMoKS0+Z2V0RmVobCgpLCA1LCA1KTsKCSRmb3JtZWxlbWVudHNbJHJlc3VsdC0+Z2V0SWQoKV1bJ0dhbWVPR2VzX1MzJ10gPSAkdGhpcy0+Q3JlYXRlSW5wdXRUZXh0KCIiLCJnYW1lX29nZXNfUzMiLiRyZXN1bHQtPmdldFMzKCktPmdldElkKCksICRyZXN1bHQtPmdldFMzKCktPmdldE9HZXMoKSwgNSwgNSk7CgkkZm9ybWVsZW1lbnRzWyRyZXN1bHQtPmdldElkKCldWydHYW1lT0Ficl9TMyddID0gJHRoaXMtPkNyZWF0ZUlucHV0VGV4dCgiIiwiZ2FtZV9vYWJyX1MzIi4kcmVzdWx0LT5nZXRTMygpLT5nZXRJZCgpLCAkcmVzdWx0LT5nZXRTMygpLT5nZXRPQWJyKCksIDUsIDUpOwoJJGZvcm1lbGVtZW50c1skcmVzdWx0LT5nZXRJZCgpXVsnR2FtZU9GZWhsX1MzJ10gPSAkdGhpcy0+Q3JlYXRlSW5wdXRUZXh0KCIiLCJnYW1lX29mZWhsX1MzIi4kcmVzdWx0LT5nZXRTMygpLT5nZXRJZCgpLCAkcmVzdWx0LT5nZXRTMygpLT5nZXRPRmVobCgpLCA1LCA1KTsKCSRmb3JtZWxlbWVudHNbJHJlc3VsdC0+Z2V0SWQoKV1bJ0dhbWVJbmRleF9TMyddID0gJHRoaXMtPkNyZWF0ZUlucHV0SGlkZGVuKCIiLCJnYW1lX2luZGV4X1MzIi4kbnVtYmVyb2ZyZXN1bHRzLCAkcmVzdWx0LT5nZXRTMygpLT5nZXRJZCgpKTsKCSRmb3JtZWxlbWVudHNbJHJlc3VsdC0+Z2V0SWQoKV1bJ0dhbWVQbGF5ZXJTZWxlY3Rpb25fUzQnXSA9ICR0aGlzLT5DcmVhdGVJbnB1dERyb3Bkb3duKCIiLCJnYW1lX3BsYXllcl9TNCIuJHJlc3VsdC0+Z2V0UzQoKS0+Z2V0SWQoKSwkcGxheWVyc2FycmF5LCItMSIsJHJlc3VsdC0+Z2V0UzQoKS0+Z2V0UGxheWVyKCktPmdldElkKCkpOwoJJGZvcm1lbGVtZW50c1skcmVzdWx0LT5nZXRJZCgpXVsnR2FtZU9wcG9uZW50X1M0J10gPSAkdGhpcy0+Q3JlYXRlSW5wdXRUZXh0KCIiLCJnYW1lX29wcG9uZW50X1M0Ii4kcmVzdWx0LT5nZXRTNCgpLT5nZXRJZCgpLCAkcmVzdWx0LT5nZXRTNCgpLT5nZXRPcHBvbmVudCgpLCAzMCwgMzApOwoJJGZvcm1lbGVtZW50c1skcmVzdWx0LT5nZXRJZCgpXVsnR2FtZUdlc19TNCddID0gJHRoaXMtPkNyZWF0ZUlucHV0VGV4dCgiIiwiZ2FtZV9nZXNfUzQiLiRyZXN1bHQtPmdldFM0KCktPmdldElkKCksICRyZXN1bHQtPmdldFM0KCktPmdldEdlcygpLCA1LCA1KTsKCSRmb3JtZWxlbWVudHNbJHJlc3VsdC0+Z2V0SWQoKV1bJ0dhbWVBYnJfUzQnXSA9ICR0aGlzLT5DcmVhdGVJbnB1dFRleHQoIiIsImdhbWVfYWJyX1M0Ii4kcmVzdWx0LT5nZXRTNCgpLT5nZXRJZCgpLCAkcmVzdWx0LT5nZXRTNCgpLT5nZXRBYnIoKSwgNSwgNSk7CgkkZm9ybWVsZW1lbnRzWyRyZXN1bHQtPmdldElkKCldWydHYW1lRmVobF9TNCddID0gJHRoaXMtPkNyZWF0ZUlucHV0VGV4dCgiIiwiZ2FtZV9mZWhsX1M0Ii4kcmVzdWx0LT5nZXRTNCgpLT5nZXRJZCgpLCAkcmVzdWx0LT5nZXRTNCgpLT5nZXRGZWhsKCksIDUsIDUpOwoJJGZvcm1lbGVtZW50c1skcmVzdWx0LT5nZXRJZCgpXVsnR2FtZU9HZXNfUzQnXSA9ICR0aGlzLT5DcmVhdGVJbnB1dFRleHQoIiIsImdhbWVfb2dlc19TNCIuJHJlc3VsdC0+Z2V0UzQoKS0+Z2V0SWQoKSwgJHJlc3VsdC0+Z2V0UzQoKS0+Z2V0T0dlcygpLCA1LCA1KTsKCSRmb3JtZWxlbWVudHNbJHJlc3VsdC0+Z2V0SWQoKV1bJ0dhbWVPQWJyX1M0J10gPSAkdGhpcy0+Q3JlYXRlSW5wdXRUZXh0KCIiLCJnYW1lX29hYnJfUzQiLiRyZXN1bHQtPmdldFM0KCktPmdldElkKCksICRyZXN1bHQtPmdldFM0KCktPmdldE9BYnIoKSwgNSwgNSk7CgkkZm9ybWVsZW1lbnRzWyRyZXN1bHQtPmdldElkKCldWydHYW1lT0ZlaGxfUzQnXSA9ICR0aGlzLT5DcmVhdGVJbnB1dFRleHQoIiIsImdhbWVfb2ZlaGxfUzQiLiRyZXN1bHQtPmdldFM0KCktPmdldElkKCksICRyZXN1bHQtPmdldFM0KCktPmdldE9GZWhsKCksIDUsIDUpOwoJJGZvcm1lbGVtZW50c1skcmVzdWx0LT5nZXRJZCgpXVsnR2FtZUluZGV4X1M0J10gPSAkdGhpcy0+Q3JlYXRlSW5wdXRIaWRkZW4oIiIsImdhbWVfaW5kZXhfUzQiLiRudW1iZXJvZnJlc3VsdHMsICRyZXN1bHQtPmdldFM0KCktPmdldElkKCkpOwoJJGZvcm1lbGVtZW50c1skcmVzdWx0LT5nZXRJZCgpXVsnTWF0Y2gnXSA9ICR0aGlzLT5DcmVhdGVJbnB1dEhpZGRlbigiIiwibWF0Y2hfaW5kZXgiLiRudW1iZXJvZnJlc3VsdHMsICRyZXN1bHQtPmdldElkKCkpOwoJJG51bWJlcm9mcmVzdWx0cyArPSAxOwp9CmZvciAoOyRudW1iZXJvZnJlc3VsdHMgPCA2OyAkbnVtYmVyb2ZyZXN1bHRzICs9IDEpIHsKCSRmb3JtZWxlbWVudHMgWyJuZXciIC4gJG51bWJlcm9mcmVzdWx0c10gWydHYW1lT0NvdW50J10gPSAkdGhpcy0+Q3JlYXRlSW5wdXRDaGVja2JveCAoICIiLCAiZ2FtZV9vY291bnRfbmV3IiAuICRudW1iZXJvZnJlc3VsdHMsIHRydWUsIHRydWUgKTsKCSRmb3JtZWxlbWVudHMgWyJuZXciIC4gJG51bWJlcm9mcmVzdWx0c10gWydHYW1lQ291bnQnXSA9ICR0aGlzLT5DcmVhdGVJbnB1dENoZWNrYm94ICggIiIsICJnYW1lX2NvdW50X25ldyIgLiAkbnVtYmVyb2ZyZXN1bHRzLCB0cnVlLCB0cnVlICk7CQoJZm9yKCRpID0gMTsgJGkgPCA1OyAkaSA9ICRpICsgMSkgewoJCSRmb3JtZWxlbWVudHMgWyJuZXciIC4gJG51bWJlcm9mcmVzdWx0c10gWydHYW1lUGxheWVyU2VsZWN0aW9uX1MnLiRpXSA9ICR0aGlzLT5DcmVhdGVJbnB1dERyb3Bkb3duICggIiIsICJnYW1lX3BsYXllcl9uZXdfUyIgLiAkaSAuICRudW1iZXJvZnJlc3VsdHMsICRwbGF5ZXJzYXJyYXksICItMSIgKTsKCQkkZm9ybWVsZW1lbnRzIFsibmV3IiAuICRudW1iZXJvZnJlc3VsdHNdIFsnR2FtZU9wcG9uZW50X1MnLiRpXSA9ICR0aGlzLT5DcmVhdGVJbnB1dFRleHQgKCAiIiwgImdhbWVfb3Bwb25lbnRfbmV3X1MiIC4gJGkgLiAkbnVtYmVyb2ZyZXN1bHRzLCAiIiwgMzAsIDMwICk7CgkJJGZvcm1lbGVtZW50cyBbIm5ldyIgLiAkbnVtYmVyb2ZyZXN1bHRzXSBbJ0dhbWVHZXNfUycuJGldID0gJHRoaXMtPkNyZWF0ZUlucHV0VGV4dCAoICIiLCAiZ2FtZV9nZXNfbmV3X1MiIC4gJGkgLiAkbnVtYmVyb2ZyZXN1bHRzLCAiIiwgNSwgNSApOwoJCSRmb3JtZWxlbWVudHMgWyJuZXciIC4gJG51bWJlcm9mcmVzdWx0c10gWydHYW1lQWJyX1MnLiRpXSA9ICR0aGlzLT5DcmVhdGVJbnB1dFRleHQgKCAiIiwgImdhbWVfYWJyX25ld19TIiAuICRpIC4gJG51bWJlcm9mcmVzdWx0cywgIiIsIDUsIDUgKTsKCQkkZm9ybWVsZW1lbnRzIFsibmV3IiAuICRudW1iZXJvZnJlc3VsdHNdIFsnR2FtZUZlaGxfUycuJGldID0gJHRoaXMtPkNyZWF0ZUlucHV0VGV4dCAoICIiLCAiZ2FtZV9mZWhsX25ld19TIiAuICRpIC4gJG51bWJlcm9mcmVzdWx0cywgIiIsIDUsIDUgKTsKCQkkZm9ybWVsZW1lbnRzIFsibmV3IiAuICRudW1iZXJvZnJlc3VsdHNdIFsnR2FtZU9HZXNfUycuJGldID0gJHRoaXMtPkNyZWF0ZUlucHV0VGV4dCAoICIiLCAiZ2FtZV9vZ2VzX25ld19TIiAuICRpIC4gJG51bWJlcm9mcmVzdWx0cywgIiIsIDUsIDUgKTsKCQkkZm9ybWVsZW1lbnRzIFsibmV3IiAuICRudW1iZXJvZnJlc3VsdHNdIFsnR2FtZU9BYnJfUycuJGldID0gJHRoaXMtPkNyZWF0ZUlucHV0VGV4dCAoICIiLCAiZ2FtZV9vYWJyX25ld19TIiAuICRpIC4gJG51bWJlcm9mcmVzdWx0cywgIiIsIDUsIDUgKTsKCQkkZm9ybWVsZW1lbnRzIFsibmV3IiAuICRudW1iZXJvZnJlc3VsdHNdIFsnR2FtZU9GZWhsX1MnLiRpXSA9ICR0aGlzLT5DcmVhdGVJbnB1dFRleHQgKCAiIiwgImdhbWVfb2ZlaGxfbmV3X1MiIC4gJGkgLiAkbnVtYmVyb2ZyZXN1bHRzLCAiIiwgNSwgNSApOwoJCSRmb3JtZWxlbWVudHMgWyJuZXciIC4gJG51bWJlcm9mcmVzdWx0c10gWydHYW1lSW5kZXhfUycuJGldID0gJHRoaXMtPkNyZWF0ZUlucHV0SGlkZGVuICggIiIsICJnYW1lX2luZGV4X1MiIC4gJGkgLiAkbnVtYmVyb2ZyZXN1bHRzLCAibmV3IiApOwoJfQoJJGZvcm1lbGVtZW50c1sibmV3IiAuICRudW1iZXJvZnJlc3VsdHNdWydNYXRjaCddID0gJHRoaXMtPkNyZWF0ZUlucHV0SGlkZGVuICggIiIsICJtYXRjaF9pbmRleCIgLiAkbnVtYmVyb2ZyZXN1bHRzLCAibmV3IiApOwp9CiR0aGlzLT5zbWFydHktPmFzc2lnbigncGFnZXRpdGxlJywgJHNhaXNvbi0+Z2V0TmFtZSgpLiIgLSAiLiR0aGlzLT5MYW5nKCdnYW1lcmVzdWx0JykuIjogIi4kZ2FtZS0+Z2V0RGF0ZSgpLT5mb3JtYXQoImQubS5ZIEg6aSIpKTsKJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdHYW1lUmVzdWx0cycsICRmb3JtZWxlbWVudHMpOwokdGhpcy0+c21hcnR5LT5hc3NpZ24oJ0dhbWVPcHBvbmVudCcsICRnYW1lLT5nZXRPcHBvbmVudCgpKTsKJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdHYW1lSG9tZVRlYW0nLCAkZ2FtZS0+Z2V0T3VyVGVhbSgpLT5nZXROYW1lKCkpOwokdGhpcy0+c21hcnR5LT5hc3NpZ24oJ0dhbWVJc0hvbWUnLCAkZ2FtZS0+Z2V0SG9tZSgpKTsKJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdHYW1lRm9ybVN0YXJ0JywgJHRoaXMtPkNyZWF0ZUZvcm1TdGFydCgkZ2FtZS0+Z2V0SWQoKSwgImNoYW5nZTEyMEdhbWVSZXN1bHQiKSk7CiR0aGlzLT5zbWFydHktPmFzc2lnbignR2FtZUZvcm1FbmQnLCAkdGhpcy0+Q3JlYXRlRm9ybUVuZCgpKTsKJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdHYW1lRm9ybVN1Ym1pdCcsICR0aGlzLT5DcmVhdGVJbnB1dFN1Ym1pdCgiIiwgImdhbWVTdWJtaXQiLCAkdGhpcy0+TGFuZygnc2F2ZScpKSk7CgplY2hvICR0aGlzLT5Qcm9jZXNzVGVtcGxhdGUoJ2VkaXQxMjBnYW1lLnRwbCcpOwo/Pg==]]></data>
	</file>
	<file>
	  <filename>/action.EditGame.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKcmVxdWlyZV9vbmNlKCdkYXRhbW9kZWwvZGF0YWJhc2VvcGVyYXRpb25zLnBocCcpOwppZiAoIWlzc2V0KCRnQ21zKSkgZXhpdDsKaWYgKCEgJHRoaXMtPkNoZWNrQWNjZXNzKCdLZWdlbGVyZ2Vibmlzc2UnKSkKCXsKCXJldHVybiAkdGhpcy0+RGlzcGxheUVycm9yUGFnZSgkaWQsICRwYXJhbXMsICRyZXR1cm5pZCwkdGhpcy0+TGFuZygnYWNjZXNzZGVuaWVkJykpOwoJfQovKiAtPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LQoKICAgQ29kZSBmb3Iga2VnZWxlcmdlYm5pc3NlICJFZGl0R2FtZSIgYWN0aW9uCgogICAtPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LQogICAKICAgVHlwaWNhbGx5LCB0aGlzIHdpbGwgZGlzcGxheSBzb21ldGhpbmcgZnJvbSBhIHRlbXBsYXRlCiAgIG9yIGRvIHNvbWUgb3RoZXIgdGFzay4KICAgCiovCgovKiBQcm9jZXNzIFBvc3QgVGhpbmdzICovCiRtYWN0X3ZhcnMgPSBleHBsb2RlKCIsIiwgJF9HRVRbJ21hY3QnXSk7CiRnYW1laWQgPSAkbWFjdF92YXJzWzFdOwokX1NFU1NJT05bJ2dhbWVSZXN1bHQnXSA9ICRfR0VUOwoKLyogZmV0Y2ggZGF0YSBmcm9tIGRhdGFiYXNlICovCiRnYW1lID0gRGF0YWJhc2VPcGVyYXRpb25zOjpnZXRHYW1lKCRnYW1laWQpOwokcmVzdWx0cyA9IERhdGFiYXNlT3BlcmF0aW9uczo6Z2V0UmVzdWx0T2ZHYW1lKCRnYW1lKTsKCi8qIGNyZWF0ZSBhcnJheSBvZiBwbGF5ZXJzIGZvciBzZWxlY3Rpb24gKi8KJHNhaXNvbmlkID0gJF9HRVRbJGdhbWVpZC4ic3BpZWxwbGFuX3NhaXNvbiJdOwokc2Fpc29uID0gRGF0YWJhc2VPcGVyYXRpb25zOjpnZXRTYWlzb24oJHNhaXNvbmlkKTsKJHB0dHMgPSBEYXRhYmFzZU9wZXJhdGlvbnM6OmdldFBsYXllcnNUb1RlYW0oJHNhaXNvbik7CiRwbGF5ZXJzb2Z0ZWFtID0gYXJyYXkoKTsKJG90aGVycGxheWVycyA9IGFycmF5KCk7Ci8qIGZpcnN0IGFsbCBwbGF5ZXJzIG9mIHRoZSB0ZWFtICovCmZvcmVhY2goJHB0dHMgYXMgJHB0dCkgewoJaWYgKCRwdHQtPmdldFRlYW0oKS0+Z2V0SWQoKSA9PSAkZ2FtZS0+Z2V0T3VyVGVhbSgpLT5nZXRJZCgpKSB7CgkJJHBsYXllcnNvZnRlYW1bJHB0dC0+Z2V0UGxheWVyKCktPmdldE5hbWUoKV0gPSAkcHR0LT5nZXRQbGF5ZXIoKS0+Z2V0SWQoKTsKCX0JZWxzZSB7CgkJJG90aGVycGxheWVyc1skcHR0LT5nZXRQbGF5ZXIoKS0+Z2V0TmFtZSgpXSA9ICRwdHQtPmdldFBsYXllcigpLT5nZXRJZCgpOwoJfQp9CiRwbGF5ZXJzYXJyYXkgPSBhcnJheV9tZXJnZSgkcGxheWVyc29mdGVhbSwgJG90aGVycGxheWVycyk7CgovKiBjcmVhdGUgYXJyYXkgb2YgaW5wdXQgZmllbGRzIGZvciBleGlzdGluZyByZXN1bHRzICovCiRudW1iZXJvZnJlc3VsdHMgPSAwOwokZm9ybWVsZW1lbnRzID0gYXJyYXkoKTsKZm9yZWFjaCgkcmVzdWx0cyBhcyAkcmVzdWx0KSAKewoJJGZvcm1lbGVtZW50c1skcmVzdWx0LT5nZXRJZCgpXVsnR2FtZVBsYXllclNlbGVjdGlvbiddID0gJHRoaXMtPkNyZWF0ZUlucHV0RHJvcGRvd24oIiIsImdhbWVfcGxheWVyIi4kcmVzdWx0LT5nZXRJZCgpLCRwbGF5ZXJzYXJyYXksIi0xIiwkcmVzdWx0LT5nZXRQbGF5ZXIoKS0+Z2V0SWQoKSk7CgkkZm9ybWVsZW1lbnRzWyRyZXN1bHQtPmdldElkKCldWydHYW1lT3Bwb25lbnQnXSA9ICR0aGlzLT5DcmVhdGVJbnB1dFRleHQoIiIsImdhbWVfb3Bwb25lbnQiLiRyZXN1bHQtPmdldElkKCksICRyZXN1bHQtPmdldE9wcG9uZW50KCksIDMwLCAzMCk7CgkkZm9ybWVsZW1lbnRzWyRyZXN1bHQtPmdldElkKCldWydHYW1lR2VzJ10gPSAkdGhpcy0+Q3JlYXRlSW5wdXRUZXh0KCIiLCJnYW1lX2dlcyIuJHJlc3VsdC0+Z2V0SWQoKSwgJHJlc3VsdC0+Z2V0R2VzKCksIDUsIDUpOwoJJGZvcm1lbGVtZW50c1skcmVzdWx0LT5nZXRJZCgpXVsnR2FtZUFiciddID0gJHRoaXMtPkNyZWF0ZUlucHV0VGV4dCgiIiwiZ2FtZV9hYnIiLiRyZXN1bHQtPmdldElkKCksICRyZXN1bHQtPmdldEFicigpLCA1LCA1KTsKCSRmb3JtZWxlbWVudHNbJHJlc3VsdC0+Z2V0SWQoKV1bJ0dhbWVGZWhsJ10gPSAkdGhpcy0+Q3JlYXRlSW5wdXRUZXh0KCIiLCJnYW1lX2ZlaGwiLiRyZXN1bHQtPmdldElkKCksICRyZXN1bHQtPmdldEZlaGwoKSwgNSwgNSk7CgkkZm9ybWVsZW1lbnRzWyRyZXN1bHQtPmdldElkKCldWydHYW1lQ291bnQnXSA9ICR0aGlzLT5DcmVhdGVJbnB1dENoZWNrYm94KCIiLCJnYW1lX2NvdW50Ii4kcmVzdWx0LT5nZXRJZCgpLCB0cnVlLCAkcmVzdWx0LT5nZXRDb3VudCgpKTsKCSRmb3JtZWxlbWVudHNbJHJlc3VsdC0+Z2V0SWQoKV1bJ0dhbWVPR2VzJ10gPSAkdGhpcy0+Q3JlYXRlSW5wdXRUZXh0KCIiLCJnYW1lX29nZXMiLiRyZXN1bHQtPmdldElkKCksICRyZXN1bHQtPmdldE9HZXMoKSwgNSwgNSk7CgkkZm9ybWVsZW1lbnRzWyRyZXN1bHQtPmdldElkKCldWydHYW1lT0FiciddID0gJHRoaXMtPkNyZWF0ZUlucHV0VGV4dCgiIiwiZ2FtZV9vYWJyIi4kcmVzdWx0LT5nZXRJZCgpLCAkcmVzdWx0LT5nZXRPQWJyKCksIDUsIDUpOwoJJGZvcm1lbGVtZW50c1skcmVzdWx0LT5nZXRJZCgpXVsnR2FtZU9GZWhsJ10gPSAkdGhpcy0+Q3JlYXRlSW5wdXRUZXh0KCIiLCJnYW1lX29mZWhsIi4kcmVzdWx0LT5nZXRJZCgpLCAkcmVzdWx0LT5nZXRPRmVobCgpLCA1LCA1KTsKCSRmb3JtZWxlbWVudHNbJHJlc3VsdC0+Z2V0SWQoKV1bJ0dhbWVPQ291bnQnXSA9ICR0aGlzLT5DcmVhdGVJbnB1dENoZWNrYm94KCIiLCJnYW1lX29jb3VudCIuJHJlc3VsdC0+Z2V0SWQoKSwgdHJ1ZSwgJHJlc3VsdC0+Z2V0T0NvdW50KCkpOwoJJGZvcm1lbGVtZW50c1skcmVzdWx0LT5nZXRJZCgpXVsnR2FtZUluZGV4J10gPSAkdGhpcy0+Q3JlYXRlSW5wdXRIaWRkZW4oIiIsImdhbWVfaW5kZXgiLiRudW1iZXJvZnJlc3VsdHMsICRyZXN1bHQtPmdldElkKCkpOwoJJG51bWJlcm9mcmVzdWx0cyArPSAxOwp9CmZvciAoOyRudW1iZXJvZnJlc3VsdHMgPCA4OyAkbnVtYmVyb2ZyZXN1bHRzICs9IDEpIHsKCSRmb3JtZWxlbWVudHNbIm5ldyIuJG51bWJlcm9mcmVzdWx0c11bJ0dhbWVQbGF5ZXJTZWxlY3Rpb24nXSA9ICR0aGlzLT5DcmVhdGVJbnB1dERyb3Bkb3duKCIiLCJnYW1lX3BsYXllcl9uZXciLiRudW1iZXJvZnJlc3VsdHMsJHBsYXllcnNhcnJheSwiLTEiKTsKCSRmb3JtZWxlbWVudHNbIm5ldyIuJG51bWJlcm9mcmVzdWx0c11bJ0dhbWVPcHBvbmVudCddID0gJHRoaXMtPkNyZWF0ZUlucHV0VGV4dCgiIiwiZ2FtZV9vcHBvbmVudF9uZXciLiRudW1iZXJvZnJlc3VsdHMsICIiLCAzMCwgMzApOwoJJGZvcm1lbGVtZW50c1sibmV3Ii4kbnVtYmVyb2ZyZXN1bHRzXVsnR2FtZUdlcyddID0gJHRoaXMtPkNyZWF0ZUlucHV0VGV4dCgiIiwiZ2FtZV9nZXNfbmV3Ii4kbnVtYmVyb2ZyZXN1bHRzLCAiIiwgNSwgNSk7CgkkZm9ybWVsZW1lbnRzWyJuZXciLiRudW1iZXJvZnJlc3VsdHNdWydHYW1lQWJyJ10gPSAkdGhpcy0+Q3JlYXRlSW5wdXRUZXh0KCIiLCJnYW1lX2Ficl9uZXciLiRudW1iZXJvZnJlc3VsdHMsICIiLCA1LCA1KTsKCSRmb3JtZWxlbWVudHNbIm5ldyIuJG51bWJlcm9mcmVzdWx0c11bJ0dhbWVGZWhsJ10gPSAkdGhpcy0+Q3JlYXRlSW5wdXRUZXh0KCIiLCJnYW1lX2ZlaGxfbmV3Ii4kbnVtYmVyb2ZyZXN1bHRzLCAiIiwgNSwgNSk7CgkkZm9ybWVsZW1lbnRzWyJuZXciLiRudW1iZXJvZnJlc3VsdHNdWydHYW1lQ291bnQnXSA9ICR0aGlzLT5DcmVhdGVJbnB1dENoZWNrYm94KCIiLCJnYW1lX2NvdW50X25ldyIuJG51bWJlcm9mcmVzdWx0cywgdHJ1ZSwgdHJ1ZSk7CgkkZm9ybWVsZW1lbnRzWyJuZXciLiRudW1iZXJvZnJlc3VsdHNdWydHYW1lT0dlcyddID0gJHRoaXMtPkNyZWF0ZUlucHV0VGV4dCgiIiwiZ2FtZV9vZ2VzX25ldyIuJG51bWJlcm9mcmVzdWx0cywgIiIsIDUsIDUpOwoJJGZvcm1lbGVtZW50c1sibmV3Ii4kbnVtYmVyb2ZyZXN1bHRzXVsnR2FtZU9BYnInXSA9ICR0aGlzLT5DcmVhdGVJbnB1dFRleHQoIiIsImdhbWVfb2Ficl9uZXciLiRudW1iZXJvZnJlc3VsdHMsICIiLCA1LCA1KTsKCSRmb3JtZWxlbWVudHNbIm5ldyIuJG51bWJlcm9mcmVzdWx0c11bJ0dhbWVPRmVobCddID0gJHRoaXMtPkNyZWF0ZUlucHV0VGV4dCgiIiwiZ2FtZV9vZmVobF9uZXciLiRudW1iZXJvZnJlc3VsdHMsICIiLCA1LCA1KTsKCSRmb3JtZWxlbWVudHNbIm5ldyIuJG51bWJlcm9mcmVzdWx0c11bJ0dhbWVPQ291bnQnXSA9ICR0aGlzLT5DcmVhdGVJbnB1dENoZWNrYm94KCIiLCJnYW1lX29jb3VudF9uZXciLiRudW1iZXJvZnJlc3VsdHMsIHRydWUsIHRydWUpOwoJJGZvcm1lbGVtZW50c1sibmV3Ii4kbnVtYmVyb2ZyZXN1bHRzXVsnR2FtZUluZGV4J10gPSAkdGhpcy0+Q3JlYXRlSW5wdXRIaWRkZW4oIiIsImdhbWVfaW5kZXgiLiRudW1iZXJvZnJlc3VsdHMsICJuZXciKTsKfQokdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3BhZ2V0aXRsZScsICRzYWlzb24tPmdldE5hbWUoKS4iIC0gIi4kdGhpcy0+TGFuZygnZ2FtZXJlc3VsdCcpLiI6ICIuJGdhbWUtPmdldERhdGUoKS0+Zm9ybWF0KCJkLm0uWSBIOmkiKSk7CiR0aGlzLT5zbWFydHktPmFzc2lnbignR2FtZVJlc3VsdHMnLCAkZm9ybWVsZW1lbnRzKTsKJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdHYW1lT3Bwb25lbnQnLCAkZ2FtZS0+Z2V0T3Bwb25lbnQoKSk7CiR0aGlzLT5zbWFydHktPmFzc2lnbignR2FtZUhvbWVUZWFtJywgJGdhbWUtPmdldE91clRlYW0oKS0+Z2V0TmFtZSgpKTsKJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdHYW1lSXNIb21lJywgJGdhbWUtPmdldEhvbWUoKSk7CiR0aGlzLT5zbWFydHktPmFzc2lnbignR2FtZUZvcm1TdGFydCcsICR0aGlzLT5DcmVhdGVGb3JtU3RhcnQoJGdhbWUtPmdldElkKCksICJjaGFuZ2VHYW1lUmVzdWx0IikpOwokdGhpcy0+c21hcnR5LT5hc3NpZ24oJ0dhbWVGb3JtRW5kJywgJHRoaXMtPkNyZWF0ZUZvcm1FbmQoKSk7CiR0aGlzLT5zbWFydHktPmFzc2lnbignR2FtZUZvcm1TdWJtaXQnLCAkdGhpcy0+Q3JlYXRlSW5wdXRTdWJtaXQoIiIsICJnYW1lU3VibWl0IiwgJHRoaXMtPkxhbmcoJ3NhdmUnKSkpOwoKZWNobyAkdGhpcy0+UHJvY2Vzc1RlbXBsYXRlKCdlZGl0Z2FtZS50cGwnKTsKPz4=]]></data>
	</file>
	<file>
	  <filename>/action.EditPlayerToTeam.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKcmVxdWlyZV9vbmNlKCdkYXRhbW9kZWwvZGF0YWJhc2VvcGVyYXRpb25zLnBocCcpOwoKaWYgKCFpc3NldCgkZ0NtcykpIGV4aXQ7CmlmICghICR0aGlzLT5DaGVja0FjY2VzcygnS2VnZWxlcmdlYm5pc3NlJykpCgl7CglyZXR1cm4gJHRoaXMtPkRpc3BsYXlFcnJvclBhZ2UoJGlkLCAkcGFyYW1zLCAkcmV0dXJuaWQsJHRoaXMtPkxhbmcoJ2FjY2Vzc2RlbmllZCcpKTsKCX0KLyogLT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS0KCiAgIENvZGUgZm9yIGtlZ2VsZXJnZWJuaXNzZSAiRWRpdFBsYXllclRvVGVhbSIgYWN0aW9uCgogICAtPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LQogICAKICAgVHlwaWNhbGx5LCB0aGlzIHdpbGwgZGlzcGxheSBzb21ldGhpbmcgZnJvbSBhIHRlbXBsYXRlCiAgIG9yIGRvIHNvbWUgb3RoZXIgdGFzay4KICAgCiovCgovKiBQcm9jZXNzIEZvcm0gZGF0YSAqLwppZiAoIWlzc2V0KCRfR0VUWydtYWN0J10pKSB7CgkkX0dFVCA9ICRfU0VTU0lPTlsncHB0X29sZGdldCddOwp9CiRtYWN0X3ZhcnMgPSBleHBsb2RlKCIsIiwgJF9HRVRbJ21hY3QnXSk7CiRzYWlzb25pZCA9ICRtYWN0X3ZhcnNbMV07CgokX1NFU1NJT05bJ3BwdF9vbGRnZXQnXSA9ICRfR0VUOwoKLyogZ2V0IGRhdGEgZnJvbSBkYXRhYmFzZSAqLwokc2Fpc29uID0gRGF0YWJhc2VPcGVyYXRpb25zOjpnZXRTYWlzb24oJHNhaXNvbmlkKTsKJHBsYXllcnMgPSBEYXRhYmFzZU9wZXJhdGlvbnM6OmdldEFsbFBsYXllcnMoKTsKJHRlYW1zID0gRGF0YWJhc2VPcGVyYXRpb25zOjpnZXRBbGxUZWFtcygpOyRwbGF5ZXJzYXJyYXkgPSBhcnJheSgpOwokcHR0cyA9IERhdGFiYXNlT3BlcmF0aW9uczo6Z2V0UGxheWVyc1RvVGVhbSgkc2Fpc29uKTsKCi8qIFNldCBjb21tb24gc21hcnR5IHRhZ3MgKi8KJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdwYWdldGl0bGUnLCAkdGhpcy0+TGFuZygncGxheWVydG90ZWFtJykuIiAtICIuJHNhaXNvbi0+Z2V0TmFtZSgpKTsKJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdzb3J0Ynl0ZWFtJywgJHRoaXMtPkxhbmcoJ3NvcnRieXRlYW0nKSk7CiR0aGlzLT5zbWFydHktPmFzc2lnbignc29ydGJ5cGxheWVyJywgJHRoaXMtPkxhbmcoJ3NvcnRieXBsYXllcicpKTsKJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCd0ZWFtbmFtZWhlYWRlcicsICR0aGlzLT5MYW5nKCd0ZWFtbmFtZV9oZWFkZXInKSk7CiR0aGlzLT5zbWFydHktPmFzc2lnbigncGxheWVybmFtZWhlYWRlcicsICR0aGlzLT5MYW5nKCdwbGF5ZXJuYW1lX2hlYWRlcicpKTsKJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdzYWlzb25pZF9oaWRkZW4nLCAkdGhpcy0+Q3JlYXRlSW5wdXRIaWRkZW4oIiIsICJwdHRfc2Fpc29uIiwgJHNhaXNvbmlkKSk7CgovKiBjcmVhdGUgYXJyYXkgZm9yIHBsYXllciBkcm9wYm94ICovCiRwbGF5ZXJzYXJyYXkgPSBhcnJheSgpOwpmb3JlYWNoKCRwbGF5ZXJzIGFzICRwbGF5ZXIpIHsKCSRwbGF5ZXJzYXJyYXlbJHBsYXllci0+Z2V0TmFtZSgpXSA9ICRwbGF5ZXItPmdldElkKCk7Cn0KCi8qIGNyZWF0ZSBhcnJheSBmb3IgdGVhbXMgZHJvcGJveCAqLwokdGVhbXNhcnJheSA9IGFycmF5KCk7CmZvcmVhY2goJHRlYW1zIGFzICR0ZWFtKSB7CgkkdGVhbXNhcnJheVskdGVhbS0+Z2V0TmFtZSgpXSA9ICR0ZWFtLT5nZXRJZCgpOwp9CgovKiBjcmVhdGUgaW5wdXQgZmllbGRzIHRoYXQgY291bGQgYmUgY2hhZ25lZCAqLwokcHR0Y29udGVudCA9IGFycmF5KCk7CmZvcmVhY2goJHB0dHMgYXMgJHB0dCkgewoJLyogY3JlYXRlIGRyb3Bib3ggZm9yIHBsYXllciB3aXRoIHRoZSBzZWxlY3RlZCBwbGF5ZXIgKi8KCSR0ZW1wcGxheWVyaWRzID0gYXJyYXlfdmFsdWVzKCRwbGF5ZXJzYXJyYXkpOwoJJHNlbGVjdGVkcGxheWVyID0gLTE7Cglmb3IgKCRpID0gMDsgJGkgPCBjb3VudCgkdGVtcHBsYXllcmlkcyk7ICRpID0gJGkgKyAxKSB7CgkJaWYgKCR0ZW1wcGxheWVyaWRzWyRpXSA9PSAkcHR0LT5nZXRQbGF5ZXIoKS0+Z2V0SWQoKSkgewoJCQkkc2VsZWN0ZWRwbGF5ZXIgPSAkaTsKCQl9Cgl9CgkkcHR0Y29udGVudFskcHR0LT5nZXRJZCgpXVsnUFRUQ2hhbmdlUGxheWVyRHJvcCddID0gJHRoaXMtPkNyZWF0ZUlucHV0RHJvcGRvd24oIiIsInB0dGNoYW5nZV9wbGF5ZXIiLCRwbGF5ZXJzYXJyYXksJHNlbGVjdGVkcGxheWVyKTsKCQoJLyogY3JlYXRlIGRyb3Bib3ggZm9yIHRlYW0gd2l0aCB0aGUgc2VsZWN0ZWQgdGVhbSAqLwoJJHRlbXB0ZWFtaWRzID0gYXJyYXlfdmFsdWVzKCR0ZWFtc2FycmF5KTsKCSRzZWxlY3RlZHRlYW0gPSAtMTsKCWZvciAoJGkgPSAwOyAkaSA8IGNvdW50KCR0ZW1wdGVhbWlkcyk7ICRpID0gJGkgKyAxKSB7CgkJaWYgKCR0ZW1wdGVhbWlkc1skaV0gPT0gJHB0dC0+Z2V0VGVhbSgpLT5nZXRJZCgpKSB7CgkJCSRzZWxlY3RlZHRlYW0gPSAkaTsKCQl9Cgl9CgkkcHR0Y29udGVudFskcHR0LT5nZXRJZCgpXVsnUFRUQ2hhbmdlVGVhbURyb3AnXSA9ICR0aGlzLT5DcmVhdGVJbnB1dERyb3Bkb3duKCIiLCJwdHRjaGFuZ2VfdGVhbSIsJHRlYW1zYXJyYXksJHNlbGVjdGVkdGVhbSk7CgkKCS8qIGFzc2lnbiByYXcgdmFsdWVzICovCgkkcHR0Y29udGVudFskcHR0LT5nZXRJZCgpXVsnUFRUQ2hhbmdlVGVhbU5hbWUnXSA9ICRwdHQtPmdldFRlYW0oKS0+Z2V0TmFtZSgpOwoJJHB0dGNvbnRlbnRbJHB0dC0+Z2V0SWQoKV1bJ1BUVENoYW5nZVRlYW1JZCddID0gJHB0dC0+Z2V0VGVhbSgpLT5nZXRJZCgpOwoJJHB0dGNvbnRlbnRbJHB0dC0+Z2V0SWQoKV1bJ1BUVENoYW5nZVRlYW1JZF9oaWRkZW4nXSA9ICR0aGlzLT5DcmVhdGVJbnB1dEhpZGRlbigiIiwicHR0Y2hhbmdlX3RlYW0iLCRwdHQtPmdldFRlYW0oKS0+Z2V0SWQoKSk7CgkkcHR0Y29udGVudFskcHR0LT5nZXRJZCgpXVsnUFRUQ2hhbmdlUGxheWVyTmFtZSddID0gJHB0dC0+Z2V0UGxheWVyKCktPmdldE5hbWUoKTsKCSRwdHRjb250ZW50WyRwdHQtPmdldElkKCldWydQVFRDaGFuZ2VQbGF5ZXJJZCddID0gJHB0dC0+Z2V0UGxheWVyKCktPmdldElkKCk7CgkkcHR0Y29udGVudFskcHR0LT5nZXRJZCgpXVsnUFRUQ2hhbmdlUGxheWVySWRfaGlkZGVuJ10gPSAkdGhpcy0+Q3JlYXRlSW5wdXRIaWRkZW4oIiIsInB0dGNoYW5nZV9wbGF5ZXIiLCRwdHQtPmdldFBsYXllcigpLT5nZXRJZCgpKTsKCQoJLyogY3JlYXRlIHN1Ym1pdCBidXR0b25zICovCgkkcHR0Y29udGVudFskcHR0LT5nZXRJZCgpXVsnUFRUQ2hhbmdlU3VibWl0J10gPSAkdGhpcy0+Q3JlYXRlSW5wdXRTdWJtaXQoIiIsICJwdHRjaGFuZ2Vfc3VibWl0IiwgJHRoaXMtPkxhbmcoJ2NoYW5nZScpKTsKCSRwdHRjb250ZW50WyRwdHQtPmdldElkKCldWydQVFRDaGFuZ2VGb3JtU3RhcnQnXSA9ICR0aGlzLT5DcmVhdGVGb3JtU3RhcnQoJHB0dC0+Z2V0SWQoKSwgImNoYW5nZVBsYXllclRvVGVhbSIpOwoJJHB0dGNvbnRlbnRbJHB0dC0+Z2V0SWQoKV1bJ1BUVENoYW5nZUZvcm1FbmQnXSA9ICR0aGlzLT5DcmVhdGVGb3JtRW5kKCk7Cn0KJHRlYW1fbmFtZWhpZGRlbiA9IGFycmF5KCk7CmZvcmVhY2ggKCR0ZWFtcyBhcyAkdGVtcHRlYW0pIHsKCSR0ZWFtX25hbWVoaWRkZW5bJHRlbXB0ZWFtLT5nZXROYW1lKCldID0gJHRoaXMtPkNyZWF0ZUlucHV0SGlkZGVuKCIiLCJwdHRhZGRfdGVhbSIsJHRlbXB0ZWFtLT5nZXRJZCgpKTsKfQokdGhpcy0+c21hcnR5LT5hc3NpZ24oJ1BUVENoYW5nZURhdGFTZXQnLCAkcHR0Y29udGVudCk7CiR0aGlzLT5zbWFydHktPmFzc2lnbignUFRUQWRkRm9ybVN0YXJ0JywgICR0aGlzLT5DcmVhdGVGb3JtU3RhcnQoIm5ldyIsICJhZGRQbGF5ZXJUb1RlYW0iKSk7CiR0aGlzLT5zbWFydHktPmFzc2lnbignUFRUQWRkRm9ybUVuZCcsICAkdGhpcy0+Q3JlYXRlRm9ybUVuZCgpKTsKJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdQVFRBZGRTdWJtaXQnLCAgJHRoaXMtPkNyZWF0ZUlucHV0U3VibWl0KCIiLCAicHR0Y2hhbmdlX3N1Ym1pdCIsICR0aGlzLT5MYW5nKCdhZGQnKSkpOwokdGhpcy0+c21hcnR5LT5hc3NpZ24oJ1BUVEFkZFBsYXllckRyb3AnLCAgJHRoaXMtPkNyZWF0ZUlucHV0RHJvcGRvd24oIiIsInB0dGFkZF9wbGF5ZXIiLCRwbGF5ZXJzYXJyYXkpKTsKJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdQVFRBZGRUZWFtc0Ryb3AnLCAgJHRoaXMtPkNyZWF0ZUlucHV0RHJvcGRvd24oIiIsInB0dGFkZF90ZWFtIiwkdGVhbXNhcnJheSkpOwokdGhpcy0+c21hcnR5LT5hc3NpZ24oJ1BUVEFkZFRlYW1zSGlkZGVuJywgJHRlYW1fbmFtZWhpZGRlbik7CiR0aGlzLT5zbWFydHktPmFzc2lnbignUFRUYWxsdGVhbXMnLCAkdGVhbXNhcnJheSk7CiR0aGlzLT5zbWFydHktPmFzc2lnbignUFRUYWxsdGVhbW5hbWVzJywgYXJyYXlfa2V5cygkdGVhbXNhcnJheSkpOwokdGhpcy0+c21hcnR5LT5hc3NpZ24oJ1BUVGFsbHRlYW1pZHMnLCBhcnJheV92YWx1ZXMoJHRlYW1zYXJyYXkpKTsKJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdQVFRhbGxwbGF5ZXJzJywgJHBsYXllcnNhcnJheSk7CiR0aGlzLT5zbWFydHktPmFzc2lnbignUFRUYWxscGxheWVybmFtZXMnLCBhcnJheV9rZXlzKCRwbGF5ZXJzYXJyYXkpKTsKJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdQVFRhbGxwbGF5ZXJpZHMnLCBhcnJheV92YWx1ZXMoJHBsYXllcnNhcnJheSkpOwoKZWNobyAkdGhpcy0+UHJvY2Vzc1RlbXBsYXRlKCdwbGF5ZXJ0b3RlYW0udHBsJyk7Cj8+]]></data>
	</file>
	<file>
	  <filename>/action.showaverageteam.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKaWYgKCFpc3NldCgkZ0NtcykpIGV4aXQ7CgovKiAtPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LQoKICAgQ29kZSBmb3Iga2VnZWxlcmdlYm5pc3NlICJzaG93dGVhbXRhYmxlIiBhY3Rpb24KCiAgIC09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tCiAgIAogICBUeXBpY2FsbHksIHRoaXMgd2lsbCBkaXNwbGF5IHNvbWV0aGluZyBmcm9tIGEgdGVtcGxhdGUKICAgb3IgZG8gc29tZSBvdGhlciB0YXNrLgogICAKKi8KLyogc2VhcmNoIGZvciB0ZWFtIGluc2lkZSB0aGUgZGF0YWJhc2UgKi8KJHRlYW1zID0gRGF0YWJhc2VPcGVyYXRpb25zOjpnZXRBbGxUZWFtcygpOwpmb3JlYWNoICgkdGVhbXMgYXMgJHRlbXB0ZWFtKSB7CglpZiAoJHRlbXB0ZWFtLT5nZXROYW1lKCkgPT0gJHBhcmFtc1sndGVhbSddKSB7CgkJJHRlYW0gPSAkdGVtcHRlYW07Cgl9Cn0KCi8qIHNlYXJjaCBmb3Igc2Fpc29uIGluc2lkZSB0aGUgZGF0YWJhc2UgKi8KJHNhaXNvbnMgPSBEYXRhYmFzZU9wZXJhdGlvbnM6OmdldEFsbFNhaXNvbnMoKTsKZm9yZWFjaCAoJHNhaXNvbnMgYXMgJHRlbXBzYWlzb24pIHsKCWlmICgkdGVtcHNhaXNvbi0+Z2V0TmFtZSgpID09ICRwYXJhbXNbJ3NhaXNvbiddKSB7CgkJJHNhaXNvbiA9ICR0ZW1wc2Fpc29uOwoJfQp9CgovKiBzZWFyY2ggZm9yIHBsYXllcnMgdGhhdCBhcmUgYXNzaWduZWQgdG8gYSB0ZWFtIGR1cmluZyB0aGlzIHNlYXNvbiAqLwokcHR0cyA9IERhdGFiYXNlT3BlcmF0aW9uczo6Z2V0UGxheWVyc1RvVGVhbSgkc2Fpc29uKTsKJGkgPSAwOwpmb3JlYWNoICgkcHR0cyBhcyAkcHR0KSB7CglpZiAoJHB0dC0+Z2V0VGVhbSgpLT5nZXRJZCgpID09ICR0ZWFtLT5nZXRJZCgpKSB7CgkJJHBsYXllcnNbJGldID0gJHB0dC0+Z2V0UGxheWVyKCk7Cgl9CgkkaSArPSAxOwp9CgppZiAoaXNzZXQoJHNhaXNvbikgJiYgaXNzZXQoJHRlYW0pICYmIGlzc2V0KCRwbGF5ZXJzKSkgewoJLyogYWxsZSBTcGllbGUgZGVyIE1hbm5zY2hhZnQgaG9sZW4gdW5kIEVyZ2Vibmlzc2UgYmVyZWNobmVuICovCgkkZ2FtZXMgPSBEYXRhYmFzZU9wZXJhdGlvbnM6OmdldFRpbWVUYWJsZSgkc2Fpc29uLCAkdGVhbSk7CgkkdGFibGVpbmZvID0gYXJyYXkoKTsKCQoJLyogU2Nobml0dGJlcmVjaG51bmcgZsO8ciBkaWUgU3BpZWxlciBpbml0aWFsaXNpZXJlbiAqLwoJZm9yZWFjaCgkcGxheWVycyBhcyAkcGxheWVyKSB7CgkJJGNvbXByZXN1bHRbJ3AnLiRwbGF5ZXItPmdldElkKCldWydHZXMnXSA9IDA7CgkJJGNvbXByZXN1bHRbJ3AnLiRwbGF5ZXItPmdldElkKCldWydBYnInXSA9IDA7CgkJJGNvbXByZXN1bHRbJ3AnLiRwbGF5ZXItPmdldElkKCldWydGZWhsJ10gPSAwOwoJCSRjb21wcmVzdWx0WydwJy4kcGxheWVyLT5nZXRJZCgpXVsnVm9sbCddID0gMDsKCQkkY29tcHJlc3VsdFsncCcuJHBsYXllci0+Z2V0SWQoKV1bJ0NvdW50J10gPSAwOwoJCSRjb21wcmVzdWx0WydwJy4kcGxheWVyLT5nZXRJZCgpXVsnR2VzSG9tZSddID0gMDsKCQkkY29tcHJlc3VsdFsncCcuJHBsYXllci0+Z2V0SWQoKV1bJ0FickhvbWUnXSA9IDA7CgkJJGNvbXByZXN1bHRbJ3AnLiRwbGF5ZXItPmdldElkKCldWydGZWhsSG9tZSddID0gMDsKCQkkY29tcHJlc3VsdFsncCcuJHBsYXllci0+Z2V0SWQoKV1bJ1ZvbGxIb21lJ10gPSAwOwoJCSRjb21wcmVzdWx0WydwJy4kcGxheWVyLT5nZXRJZCgpXVsnQ291bnRIb21lJ10gPSAwOwoJCSRjb21wcmVzdWx0WydwJy4kcGxheWVyLT5nZXRJZCgpXVsnR2VzQXdheSddID0gMDsKCQkkY29tcHJlc3VsdFsncCcuJHBsYXllci0+Z2V0SWQoKV1bJ0FickF3YXknXSA9IDA7CgkJJGNvbXByZXN1bHRbJ3AnLiRwbGF5ZXItPmdldElkKCldWydGZWhsQXdheSddID0gMDsKCQkkY29tcHJlc3VsdFsncCcuJHBsYXllci0+Z2V0SWQoKV1bJ1ZvbGxBd2F5J10gPSAwOwoJCSRjb21wcmVzdWx0WydwJy4kcGxheWVyLT5nZXRJZCgpXVsnQ291bnRBd2F5J10gPSAwOwoJCSRjb21wcmVzdWx0WydwJy4kcGxheWVyLT5nZXRJZCgpXVsnTmFtZSddID0gJHBsYXllci0+Z2V0TmFtZSgpOwoJCSRjb21wcmVzdWx0WydwJy4kcGxheWVyLT5nZXRJZCgpXVsnSUQnXSA9ICRwbGF5ZXItPmdldElkKCk7CQoJfQoJCgkvKiBTY2huaXR0YmVyZWNobnVuZyBmw7xyIGRpZSBNYW5uc2NoYWZ0IGluaXRpYWxpc2llcmVuICovCgkkY29tcHJlc3VsdFsnSGVpbSddWydHZXMnXSA9IDA7CgkkY29tcHJlc3VsdFsnSGVpbSddWydBYnInXSA9IDA7CgkkY29tcHJlc3VsdFsnSGVpbSddWydGZWhsJ10gPSAwOwoJJGNvbXByZXN1bHRbJ0hlaW0nXVsnVm9sbCddID0gMDsKCSRjb21wcmVzdWx0WydIZWltJ11bJ0NvdW50J10gPSAwOwoJJGNvbXByZXN1bHRbJ0hlaW0nXVsnR2VzSG9tZSddID0gMDsKCSRjb21wcmVzdWx0WydIZWltJ11bJ0FickhvbWUnXSA9IDA7CgkkY29tcHJlc3VsdFsnSGVpbSddWydGZWhsSG9tZSddID0gMDsKCSRjb21wcmVzdWx0WydIZWltJ11bJ1ZvbGxIb21lJ10gPSAwOwoJJGNvbXByZXN1bHRbJ0hlaW0nXVsnQ291bnRIb21lJ10gPSAwOwoJJGNvbXByZXN1bHRbJ0hlaW0nXVsnR2VzQXdheSddID0gMDsKCSRjb21wcmVzdWx0WydIZWltJ11bJ0FickF3YXknXSA9IDA7CgkkY29tcHJlc3VsdFsnSGVpbSddWydGZWhsQXdheSddID0gMDsKCSRjb21wcmVzdWx0WydIZWltJ11bJ1ZvbGxBd2F5J10gPSAwOwoJJGNvbXByZXN1bHRbJ0hlaW0nXVsnQ291bnRBd2F5J10gPSAwOwoJJGNvbXByZXN1bHRbJ0hlaW0nXVsnTmFtZSddID0gJHRlYW0tPmdldE5hbWUoKTsKCSRjb21wcmVzdWx0WydBdXN3J11bJ0dlcyddID0gMDsKCSRjb21wcmVzdWx0WydBdXN3J11bJ0FiciddID0gMDsKCSRjb21wcmVzdWx0WydBdXN3J11bJ0ZlaGwnXSA9IDA7CgkkY29tcHJlc3VsdFsnQXVzdyddWydWb2xsJ10gPSAwOwoJJGNvbXByZXN1bHRbJ0F1c3cnXVsnQ291bnQnXSA9IDA7CgkkY29tcHJlc3VsdFsnQXVzdyddWydHZXNIb21lJ10gPSAwOwoJJGNvbXByZXN1bHRbJ0F1c3cnXVsnQWJySG9tZSddID0gMDsKCSRjb21wcmVzdWx0WydBdXN3J11bJ0ZlaGxIb21lJ10gPSAwOwoJJGNvbXByZXN1bHRbJ0F1c3cnXVsnVm9sbEhvbWUnXSA9IDA7CgkkY29tcHJlc3VsdFsnQXVzdyddWydDb3VudEhvbWUnXSA9IDA7CgkkY29tcHJlc3VsdFsnQXVzdyddWydHZXNBd2F5J10gPSAwOwoJJGNvbXByZXN1bHRbJ0F1c3cnXVsnQWJyQXdheSddID0gMDsKCSRjb21wcmVzdWx0WydBdXN3J11bJ0ZlaGxBd2F5J10gPSAwOwoJJGNvbXByZXN1bHRbJ0F1c3cnXVsnVm9sbEF3YXknXSA9IDA7CgkkY29tcHJlc3VsdFsnQXVzdyddWydDb3VudEF3YXknXSA9IDA7CgkkY29tcHJlc3VsdFsnQXVzdyddWydOYW1lJ10gPSAkdGhpcy0+TGFuZygnb3Bwb25lbnQnKTsKCWZvcmVhY2ggKCRnYW1lcyBhcyAkdGVtcGdhbWUpIHsKCQlpZiAoJHRlbXBnYW1lLT5pczEyMCAoKSA9PSBmYWxzZSkgewoJCQkkdGVtcHJlc3VsdHMgPSBEYXRhYmFzZU9wZXJhdGlvbnM6OmdldFJlc3VsdE9mR2FtZSAoICR0ZW1wZ2FtZSApOwoJCQkkdGVtcGNvbXByZXN1bHQgWydob21lZ2VzJ10gPSAwOwoJCQkkdGVtcGNvbXByZXN1bHQgWydvcHBvbmVudGdlcyddID0gMDsKCQkJJHRlbXBjb21wcmVzdWx0IFsnaG9tZXZvbGwnXSA9IDA7CgkJCSR0ZW1wY29tcHJlc3VsdCBbJ29wcG9uZW50dm9sbCddID0gMDsKCQkJJHRlbXBjb21wcmVzdWx0IFsnaG9tZWFiciddID0gMDsKCQkJJHRlbXBjb21wcmVzdWx0IFsnb3Bwb25lbnRhYnInXSA9IDA7CgkJCSR0ZW1wY29tcHJlc3VsdCBbJ2hvbWVmZWhsJ10gPSAwOwoJCQkkdGVtcGNvbXByZXN1bHQgWydvcHBvbmVudGZlaGwnXSA9IDA7CgkJCWZvcmVhY2ggKCAkdGVtcHJlc3VsdHMgYXMgJHRlbXByZXN1bHQgKSB7CgkJCQkkdGVtcGNvbXByZXN1bHQgWydob21lZ2VzJ10gKz0gJHRlbXByZXN1bHQtPmdldEdlcyAoKTsKCQkJCSR0ZW1wY29tcHJlc3VsdCBbJ29wcG9uZW50Z2VzJ10gKz0gJHRlbXByZXN1bHQtPmdldE9HZXMgKCk7CgkJCQkkdGVtcGNvbXByZXN1bHQgWydob21ldm9sbCddICs9ICR0ZW1wcmVzdWx0LT5nZXRWb2xsICgpOwoJCQkJJHRlbXBjb21wcmVzdWx0IFsnb3Bwb25lbnR2b2xsJ10gKz0gJHRlbXByZXN1bHQtPmdldE9Wb2xsICgpOwoJCQkJJHRlbXBjb21wcmVzdWx0IFsnaG9tZWFiciddICs9ICR0ZW1wcmVzdWx0LT5nZXRBYnIgKCk7CgkJCQkkdGVtcGNvbXByZXN1bHQgWydvcHBvbmVudGFiciddICs9ICR0ZW1wcmVzdWx0LT5nZXRPQWJyICgpOwoJCQkJJHRlbXBjb21wcmVzdWx0IFsnaG9tZWZlaGwnXSArPSAkdGVtcHJlc3VsdC0+Z2V0RmVobCAoKTsKCQkJCSR0ZW1wY29tcHJlc3VsdCBbJ29wcG9uZW50ZmVobCddICs9ICR0ZW1wcmVzdWx0LT5nZXRPRmVobCAoKTsKCQkJCWlmICgkdGVtcHJlc3VsdC0+Z2V0Q291bnQgKCkgJiYgaXNzZXQgKCAkY29tcHJlc3VsdCBbJ3AnIC4gJHRlbXByZXN1bHQtPmdldFBsYXllciAoKS0+Z2V0SWQgKCldICkpIHsKCQkJCQkkY29tcHJlc3VsdCBbJ3AnIC4gJHRlbXByZXN1bHQtPmdldFBsYXllciAoKS0+Z2V0SWQgKCldIFsnR2VzJ10gKz0gJHRlbXByZXN1bHQtPmdldEdlcyAoKTsKCQkJCQkkY29tcHJlc3VsdCBbJ3AnIC4gJHRlbXByZXN1bHQtPmdldFBsYXllciAoKS0+Z2V0SWQgKCldIFsnQWJyJ10gKz0gJHRlbXByZXN1bHQtPmdldEFiciAoKTsKCQkJCQkkY29tcHJlc3VsdCBbJ3AnIC4gJHRlbXByZXN1bHQtPmdldFBsYXllciAoKS0+Z2V0SWQgKCldIFsnRmVobCddICs9ICR0ZW1wcmVzdWx0LT5nZXRGZWhsICgpOwoJCQkJCSRjb21wcmVzdWx0IFsncCcgLiAkdGVtcHJlc3VsdC0+Z2V0UGxheWVyICgpLT5nZXRJZCAoKV0gWydWb2xsJ10gKz0gJHRlbXByZXN1bHQtPmdldFZvbGwgKCk7CgkJCQkJJGNvbXByZXN1bHQgWydwJyAuICR0ZW1wcmVzdWx0LT5nZXRQbGF5ZXIgKCktPmdldElkICgpXSBbJ0NvdW50J10gKz0gMTsKCQkJCQlpZiAoJHRlbXBnYW1lLT5nZXRIb21lICgpID09IHRydWUpIHsKCQkJCQkJJGNvbXByZXN1bHQgWydwJyAuICR0ZW1wcmVzdWx0LT5nZXRQbGF5ZXIgKCktPmdldElkICgpXSBbJ0dlc0hvbWUnXSArPSAkdGVtcHJlc3VsdC0+Z2V0R2VzICgpOwoJCQkJCQkkY29tcHJlc3VsdCBbJ3AnIC4gJHRlbXByZXN1bHQtPmdldFBsYXllciAoKS0+Z2V0SWQgKCldIFsnQWJySG9tZSddICs9ICR0ZW1wcmVzdWx0LT5nZXRBYnIgKCk7CgkJCQkJCSRjb21wcmVzdWx0IFsncCcgLiAkdGVtcHJlc3VsdC0+Z2V0UGxheWVyICgpLT5nZXRJZCAoKV0gWydGZWhsSG9tZSddICs9ICR0ZW1wcmVzdWx0LT5nZXRGZWhsICgpOwoJCQkJCQkkY29tcHJlc3VsdCBbJ3AnIC4gJHRlbXByZXN1bHQtPmdldFBsYXllciAoKS0+Z2V0SWQgKCldIFsnVm9sbEhvbWUnXSArPSAkdGVtcHJlc3VsdC0+Z2V0Vm9sbCAoKTsKCQkJCQkJJGNvbXByZXN1bHQgWydwJyAuICR0ZW1wcmVzdWx0LT5nZXRQbGF5ZXIgKCktPmdldElkICgpXSBbJ0NvdW50SG9tZSddICs9IDE7CgkJCQkJfSBlbHNlIHsKCQkJCQkJJGNvbXByZXN1bHQgWydwJyAuICR0ZW1wcmVzdWx0LT5nZXRQbGF5ZXIgKCktPmdldElkICgpXSBbJ0dlc0F3YXknXSArPSAkdGVtcHJlc3VsdC0+Z2V0R2VzICgpOwoJCQkJCQkkY29tcHJlc3VsdCBbJ3AnIC4gJHRlbXByZXN1bHQtPmdldFBsYXllciAoKS0+Z2V0SWQgKCldIFsnQWJyQXdheSddICs9ICR0ZW1wcmVzdWx0LT5nZXRBYnIgKCk7CgkJCQkJCSRjb21wcmVzdWx0IFsncCcgLiAkdGVtcHJlc3VsdC0+Z2V0UGxheWVyICgpLT5nZXRJZCAoKV0gWydGZWhsQXdheSddICs9ICR0ZW1wcmVzdWx0LT5nZXRGZWhsICgpOwoJCQkJCQkkY29tcHJlc3VsdCBbJ3AnIC4gJHRlbXByZXN1bHQtPmdldFBsYXllciAoKS0+Z2V0SWQgKCldIFsnVm9sbEF3YXknXSArPSAkdGVtcHJlc3VsdC0+Z2V0Vm9sbCAoKTsKCQkJCQkJJGNvbXByZXN1bHQgWydwJyAuICR0ZW1wcmVzdWx0LT5nZXRQbGF5ZXIgKCktPmdldElkICgpXSBbJ0NvdW50QXdheSddICs9IDE7CgkJCQkJfQoJCQkJfQoJCQl9CgkJCWlmICgoJHRlbXBjb21wcmVzdWx0IFsnaG9tZWdlcyddICE9IDApIHx8ICgkdGVtcGNvbXByZXN1bHQgWydvcHBvbmVudGdlcyddICE9IDApKSB7CgkJCQkkY29tcHJlc3VsdCBbJ0hlaW0nXSBbJ0dlcyddICs9ICR0ZW1wY29tcHJlc3VsdCBbJ2hvbWVnZXMnXTsKCQkJCSRjb21wcmVzdWx0IFsnSGVpbSddIFsnQWJyJ10gKz0gJHRlbXBjb21wcmVzdWx0IFsnaG9tZWFiciddOwoJCQkJJGNvbXByZXN1bHQgWydIZWltJ10gWydGZWhsJ10gKz0gJHRlbXBjb21wcmVzdWx0IFsnaG9tZWZlaGwnXTsKCQkJCSRjb21wcmVzdWx0IFsnSGVpbSddIFsnVm9sbCddICs9ICR0ZW1wY29tcHJlc3VsdCBbJ2hvbWV2b2xsJ107CgkJCQkkY29tcHJlc3VsdCBbJ0hlaW0nXSBbJ0NvdW50J10gKz0gMTsKCQkJCSRjb21wcmVzdWx0IFsnQXVzdyddIFsnR2VzJ10gKz0gJHRlbXBjb21wcmVzdWx0IFsnb3Bwb25lbnRnZXMnXTsKCQkJCSRjb21wcmVzdWx0IFsnQXVzdyddIFsnQWJyJ10gKz0gJHRlbXBjb21wcmVzdWx0IFsnb3Bwb25lbnRhYnInXTsKCQkJCSRjb21wcmVzdWx0IFsnQXVzdyddIFsnRmVobCddICs9ICR0ZW1wY29tcHJlc3VsdCBbJ29wcG9uZW50ZmVobCddOwoJCQkJJGNvbXByZXN1bHQgWydBdXN3J10gWydWb2xsJ10gKz0gJHRlbXBjb21wcmVzdWx0IFsnb3Bwb25lbnR2b2xsJ107CgkJCQkkY29tcHJlc3VsdCBbJ0F1c3cnXSBbJ0NvdW50J10gKz0gMTsKCQkJCWlmICgkdGVtcGdhbWUtPmdldEhvbWUgKCkgPT0gdHJ1ZSkgewoJCQkJCSRjb21wcmVzdWx0IFsnSGVpbSddIFsnR2VzSG9tZSddICs9ICR0ZW1wY29tcHJlc3VsdCBbJ2hvbWVnZXMnXTsKCQkJCQkkY29tcHJlc3VsdCBbJ0hlaW0nXSBbJ0FickhvbWUnXSArPSAkdGVtcGNvbXByZXN1bHQgWydob21lYWJyJ107CgkJCQkJJGNvbXByZXN1bHQgWydIZWltJ10gWydGZWhsSG9tZSddICs9ICR0ZW1wY29tcHJlc3VsdCBbJ2hvbWVmZWhsJ107CgkJCQkJJGNvbXByZXN1bHQgWydIZWltJ10gWydWb2xsSG9tZSddICs9ICR0ZW1wY29tcHJlc3VsdCBbJ2hvbWV2b2xsJ107CgkJCQkJJGNvbXByZXN1bHQgWydIZWltJ10gWydDb3VudEhvbWUnXSArPSAxOwoJCQkJCSRjb21wcmVzdWx0IFsnQXVzdyddIFsnR2VzSG9tZSddICs9ICR0ZW1wY29tcHJlc3VsdCBbJ29wcG9uZW50Z2VzJ107CgkJCQkJJGNvbXByZXN1bHQgWydBdXN3J10gWydBYnJIb21lJ10gKz0gJHRlbXBjb21wcmVzdWx0IFsnb3Bwb25lbnRhYnInXTsKCQkJCQkkY29tcHJlc3VsdCBbJ0F1c3cnXSBbJ0ZlaGxIb21lJ10gKz0gJHRlbXBjb21wcmVzdWx0IFsnb3Bwb25lbnRmZWhsJ107CgkJCQkJJGNvbXByZXN1bHQgWydBdXN3J10gWydWb2xsSG9tZSddICs9ICR0ZW1wY29tcHJlc3VsdCBbJ29wcG9uZW50dm9sbCddOwoJCQkJCSRjb21wcmVzdWx0IFsnQXVzdyddIFsnQ291bnRIb21lJ10gKz0gMTsKCQkJCX0gZWxzZSB7CgkJCQkJJGNvbXByZXN1bHQgWydIZWltJ10gWydHZXNBd2F5J10gKz0gJHRlbXBjb21wcmVzdWx0IFsnaG9tZWdlcyddOwoJCQkJCSRjb21wcmVzdWx0IFsnSGVpbSddIFsnQWJyQXdheSddICs9ICR0ZW1wY29tcHJlc3VsdCBbJ2hvbWVhYnInXTsKCQkJCQkkY29tcHJlc3VsdCBbJ0hlaW0nXSBbJ0ZlaGxBd2F5J10gKz0gJHRlbXBjb21wcmVzdWx0IFsnaG9tZWZlaGwnXTsKCQkJCQkkY29tcHJlc3VsdCBbJ0hlaW0nXSBbJ1ZvbGxBd2F5J10gKz0gJHRlbXBjb21wcmVzdWx0IFsnaG9tZXZvbGwnXTsKCQkJCQkkY29tcHJlc3VsdCBbJ0hlaW0nXSBbJ0NvdW50QXdheSddICs9IDE7CgkJCQkJJGNvbXByZXN1bHQgWydBdXN3J10gWydHZXNBd2F5J10gKz0gJHRlbXBjb21wcmVzdWx0IFsnb3Bwb25lbnRnZXMnXTsKCQkJCQkkY29tcHJlc3VsdCBbJ0F1c3cnXSBbJ0FickF3YXknXSArPSAkdGVtcGNvbXByZXN1bHQgWydvcHBvbmVudGFiciddOwoJCQkJCSRjb21wcmVzdWx0IFsnQXVzdyddIFsnRmVobEF3YXknXSArPSAkdGVtcGNvbXByZXN1bHQgWydvcHBvbmVudGZlaGwnXTsKCQkJCQkkY29tcHJlc3VsdCBbJ0F1c3cnXSBbJ1ZvbGxBd2F5J10gKz0gJHRlbXBjb21wcmVzdWx0IFsnb3Bwb25lbnR2b2xsJ107CgkJCQkJJGNvbXByZXN1bHQgWydBdXN3J10gWydDb3VudEF3YXknXSArPSAxOwoJCQkJfQoJCQl9CgkJfQoJfQoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdTYWlzb24nLCAkc2Fpc29uLT5nZXROYW1lKCkpOwoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdUZWFtJywgJHRlYW0tPmdldE5hbWUoKSk7CgkkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ1Jlc3VsdHMnLCAkY29tcHJlc3VsdCk7CgkkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ1RhZ1ZvbGwnLCAkdGhpcy0+TGFuZygnU0JWb2xsJykpOwoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdUYWdBYnInLCAkdGhpcy0+TGFuZygnU0JBYnInKSk7CgkkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ1RhZ0dlcycsICR0aGlzLT5MYW5nKCdTQkdlcycpKTsKCSR0aGlzLT5zbWFydHktPmFzc2lnbignVGFnRmVobCcsICR0aGlzLT5MYW5nKCdTQkZlaGwnKSk7CgkkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ1RhZ05hbWUnLCAkdGhpcy0+TGFuZygnU0JOYW1lJykpOwoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdUYWdUeXBlJywgJHRoaXMtPkxhbmcoJ1NCVHlwZScpKTsKCSR0aGlzLT5zbWFydHktPmFzc2lnbignVGFnQXdheScsICR0aGlzLT5MYW5nKCdTQkF3YXknKSk7CgkkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ1RhZ0hvbWUnLCAkdGhpcy0+TGFuZygnU0JIb21lJykpOwoJZWNobyAkdGhpcy0+UHJvY2Vzc1RlbXBsYXRlKCdzaG93YXZlcmFnZXRlYW0udHBsJyk7Cn0gZWxzZSB7CgkkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3RpdGxlX2Vycm9yJywgJHRoaXMtPkxhbmcoJ2Vycm9ydGFnJykpOwoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdtZXNzYWdlJywgJHRoaXMtPkxhbmcoJ2Vycm9yX3RlYW0nKS4nPGJyLz4nLiRwYXJhbXNbJ3RlYW0nXS4kdGhpcy0+TGFuZygnZXJyb3Jfc2Fpc29uJykuJHBhcmFtc1snc2Fpc29uJ10pOwoJZWNobyAkdGhpcy0+UHJvY2Vzc1RlbXBsYXRlKCdlcnJvci50cGwnKTsKfQoKPz4=]]></data>
	</file>
	<file>
	  <filename>/action.showaverageteam120.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKaWYgKCFpc3NldCgkZ0NtcykpIGV4aXQ7CgovKiAtPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LQoKICAgQ29kZSBmb3Iga2VnZWxlcmdlYm5pc3NlICJzaG93dGVhbXRhYmxlIiBhY3Rpb24KCiAgIC09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tCiAgIAogICBUeXBpY2FsbHksIHRoaXMgd2lsbCBkaXNwbGF5IHNvbWV0aGluZyBmcm9tIGEgdGVtcGxhdGUKICAgb3IgZG8gc29tZSBvdGhlciB0YXNrLgogICAKKi8KLyogc2VhcmNoIGZvciB0ZWFtIGluc2lkZSB0aGUgZGF0YWJhc2UgKi8KJHRlYW1zID0gRGF0YWJhc2VPcGVyYXRpb25zOjpnZXRBbGxUZWFtcygpOwpmb3JlYWNoICgkdGVhbXMgYXMgJHRlbXB0ZWFtKSB7CglpZiAoJHRlbXB0ZWFtLT5nZXROYW1lKCkgPT0gJHBhcmFtc1sndGVhbSddKSB7CgkJJHRlYW0gPSAkdGVtcHRlYW07Cgl9Cn0KCi8qIHNlYXJjaCBmb3Igc2Fpc29uIGluc2lkZSB0aGUgZGF0YWJhc2UgKi8KJHNhaXNvbnMgPSBEYXRhYmFzZU9wZXJhdGlvbnM6OmdldEFsbFNhaXNvbnMoKTsKZm9yZWFjaCAoJHNhaXNvbnMgYXMgJHRlbXBzYWlzb24pIHsKCWlmICgkdGVtcHNhaXNvbi0+Z2V0TmFtZSgpID09ICRwYXJhbXNbJ3NhaXNvbiddKSB7CgkJJHNhaXNvbiA9ICR0ZW1wc2Fpc29uOwoJfQp9CgovKiBzZWFyY2ggZm9yIHBsYXllcnMgdGhhdCBhcmUgYXNzaWduZWQgdG8gYSB0ZWFtIGR1cmluZyB0aGlzIHNlYXNvbiAqLwokcHR0cyA9IERhdGFiYXNlT3BlcmF0aW9uczo6Z2V0UGxheWVyc1RvVGVhbSgkc2Fpc29uKTsKJGkgPSAwOwpmb3JlYWNoICgkcHR0cyBhcyAkcHR0KSB7CglpZiAoJHB0dC0+Z2V0VGVhbSgpLT5nZXRJZCgpID09ICR0ZWFtLT5nZXRJZCgpKSB7CgkJJHBsYXllcnNbJGldID0gJHB0dC0+Z2V0UGxheWVyKCk7Cgl9CgkkaSArPSAxOwp9CgppZiAoaXNzZXQoJHNhaXNvbikgJiYgaXNzZXQoJHRlYW0pICYmIGlzc2V0KCRwbGF5ZXJzKSkgewoJLyogYWxsZSBTcGllbGUgZGVyIE1hbm5zY2hhZnQgaG9sZW4gdW5kIEVyZ2Vibmlzc2UgYmVyZWNobmVuICovCgkkZ2FtZXMgPSBEYXRhYmFzZU9wZXJhdGlvbnM6OmdldFRpbWVUYWJsZSgkc2Fpc29uLCAkdGVhbSk7CgkkdGFibGVpbmZvID0gYXJyYXkoKTsKCQoJLyogU2Nobml0dGJlcmVjaG51bmcgZsO8ciBkaWUgU3BpZWxlciBpbml0aWFsaXNpZXJlbiAqLwoJZm9yZWFjaCgkcGxheWVycyBhcyAkcGxheWVyKSB7CgkJJGNvbXByZXN1bHRbJ3AnLiRwbGF5ZXItPmdldElkKCldWydHZXMnXSA9IDA7CgkJJGNvbXByZXN1bHRbJ3AnLiRwbGF5ZXItPmdldElkKCldWydBYnInXSA9IDA7CgkJJGNvbXByZXN1bHRbJ3AnLiRwbGF5ZXItPmdldElkKCldWydGZWhsJ10gPSAwOwoJCSRjb21wcmVzdWx0WydwJy4kcGxheWVyLT5nZXRJZCgpXVsnVm9sbCddID0gMDsKCQkkY29tcHJlc3VsdFsncCcuJHBsYXllci0+Z2V0SWQoKV1bJ1NQJ10gPSAwOwoJCSRjb21wcmVzdWx0WydwJy4kcGxheWVyLT5nZXRJZCgpXVsnTVAnXSA9IDA7CgkJJGNvbXByZXN1bHRbJ3AnLiRwbGF5ZXItPmdldElkKCldWydDb3VudCddID0gMDsKCQkkY29tcHJlc3VsdFsncCcuJHBsYXllci0+Z2V0SWQoKV1bJ0dlc0hvbWUnXSA9IDA7CgkJJGNvbXByZXN1bHRbJ3AnLiRwbGF5ZXItPmdldElkKCldWydBYnJIb21lJ10gPSAwOwoJCSRjb21wcmVzdWx0WydwJy4kcGxheWVyLT5nZXRJZCgpXVsnRmVobEhvbWUnXSA9IDA7CgkJJGNvbXByZXN1bHRbJ3AnLiRwbGF5ZXItPmdldElkKCldWydWb2xsSG9tZSddID0gMDsKCQkkY29tcHJlc3VsdFsncCcuJHBsYXllci0+Z2V0SWQoKV1bJ1NQSG9tZSddID0gMDsKCQkkY29tcHJlc3VsdFsncCcuJHBsYXllci0+Z2V0SWQoKV1bJ01QSG9tZSddID0gMDsKCQkkY29tcHJlc3VsdFsncCcuJHBsYXllci0+Z2V0SWQoKV1bJ0NvdW50SG9tZSddID0gMDsKCQkkY29tcHJlc3VsdFsncCcuJHBsYXllci0+Z2V0SWQoKV1bJ0dlc0F3YXknXSA9IDA7CgkJJGNvbXByZXN1bHRbJ3AnLiRwbGF5ZXItPmdldElkKCldWydBYnJBd2F5J10gPSAwOwoJCSRjb21wcmVzdWx0WydwJy4kcGxheWVyLT5nZXRJZCgpXVsnRmVobEF3YXknXSA9IDA7CgkJJGNvbXByZXN1bHRbJ3AnLiRwbGF5ZXItPmdldElkKCldWydWb2xsQXdheSddID0gMDsKCQkkY29tcHJlc3VsdFsncCcuJHBsYXllci0+Z2V0SWQoKV1bJ1NQQXdheSddID0gMDsKCQkkY29tcHJlc3VsdFsncCcuJHBsYXllci0+Z2V0SWQoKV1bJ01QQXdheSddID0gMDsKCQkkY29tcHJlc3VsdFsncCcuJHBsYXllci0+Z2V0SWQoKV1bJ0NvdW50QXdheSddID0gMDsKCQkkY29tcHJlc3VsdFsncCcuJHBsYXllci0+Z2V0SWQoKV1bJ05hbWUnXSA9ICRwbGF5ZXItPmdldE5hbWUoKTsKCQkkY29tcHJlc3VsdFsncCcuJHBsYXllci0+Z2V0SWQoKV1bJ0lEJ10gPSAkcGxheWVyLT5nZXRJZCgpOwkKCX0KCQoJLyogU2Nobml0dGJlcmVjaG51bmcgZsO8ciBkaWUgTWFubnNjaGFmdCBpbml0aWFsaXNpZXJlbiAqLwoJJGNvbXByZXN1bHRbJ0hlaW0nXVsnR2VzJ10gPSAwOwoJJGNvbXByZXN1bHRbJ0hlaW0nXVsnQWJyJ10gPSAwOwoJJGNvbXByZXN1bHRbJ0hlaW0nXVsnRmVobCddID0gMDsKCSRjb21wcmVzdWx0WydIZWltJ11bJ1ZvbGwnXSA9IDA7CgkkY29tcHJlc3VsdFsnSGVpbSddWydTUCddID0gMDsKCSRjb21wcmVzdWx0WydIZWltJ11bJ01QJ10gPSAwOwoJJGNvbXByZXN1bHRbJ0hlaW0nXVsnQ291bnQnXSA9IDA7CgkkY29tcHJlc3VsdFsnSGVpbSddWydHZXNIb21lJ10gPSAwOwoJJGNvbXByZXN1bHRbJ0hlaW0nXVsnQWJySG9tZSddID0gMDsKCSRjb21wcmVzdWx0WydIZWltJ11bJ0ZlaGxIb21lJ10gPSAwOwoJJGNvbXByZXN1bHRbJ0hlaW0nXVsnVm9sbEhvbWUnXSA9IDA7CgkkY29tcHJlc3VsdFsnSGVpbSddWydTUEhvbWUnXSA9IDA7CgkkY29tcHJlc3VsdFsnSGVpbSddWydNUEhvbWUnXSA9IDA7CgkkY29tcHJlc3VsdFsnSGVpbSddWydDb3VudEhvbWUnXSA9IDA7CgkkY29tcHJlc3VsdFsnSGVpbSddWydHZXNBd2F5J10gPSAwOwoJJGNvbXByZXN1bHRbJ0hlaW0nXVsnQWJyQXdheSddID0gMDsKCSRjb21wcmVzdWx0WydIZWltJ11bJ0ZlaGxBd2F5J10gPSAwOwoJJGNvbXByZXN1bHRbJ0hlaW0nXVsnVm9sbEF3YXknXSA9IDA7CgkkY29tcHJlc3VsdFsnSGVpbSddWydTUEF3YXknXSA9IDA7CgkkY29tcHJlc3VsdFsnSGVpbSddWydNUEF3YXknXSA9IDA7CgkkY29tcHJlc3VsdFsnSGVpbSddWydDb3VudEF3YXknXSA9IDA7CgkkY29tcHJlc3VsdFsnSGVpbSddWydOYW1lJ10gPSAkdGVhbS0+Z2V0TmFtZSgpOwoJJGNvbXByZXN1bHRbJ0F1c3cnXVsnR2VzJ10gPSAwOwoJJGNvbXByZXN1bHRbJ0F1c3cnXVsnQWJyJ10gPSAwOwoJJGNvbXByZXN1bHRbJ0F1c3cnXVsnRmVobCddID0gMDsKCSRjb21wcmVzdWx0WydBdXN3J11bJ1ZvbGwnXSA9IDA7CgkkY29tcHJlc3VsdFsnQXVzdyddWydTUCddID0gMDsKCSRjb21wcmVzdWx0WydBdXN3J11bJ01QJ10gPSAwOwoJJGNvbXByZXN1bHRbJ0F1c3cnXVsnQ291bnQnXSA9IDA7CgkkY29tcHJlc3VsdFsnQXVzdyddWydHZXNIb21lJ10gPSAwOwoJJGNvbXByZXN1bHRbJ0F1c3cnXVsnQWJySG9tZSddID0gMDsKCSRjb21wcmVzdWx0WydBdXN3J11bJ0ZlaGxIb21lJ10gPSAwOwoJJGNvbXByZXN1bHRbJ0F1c3cnXVsnVm9sbEhvbWUnXSA9IDA7CgkkY29tcHJlc3VsdFsnQXVzdyddWydTUEhvbWUnXSA9IDA7CgkkY29tcHJlc3VsdFsnQXVzdyddWydNUEhvbWUnXSA9IDA7CgkkY29tcHJlc3VsdFsnQXVzdyddWydDb3VudEhvbWUnXSA9IDA7CgkkY29tcHJlc3VsdFsnQXVzdyddWydHZXNBd2F5J10gPSAwOwoJJGNvbXByZXN1bHRbJ0F1c3cnXVsnQWJyQXdheSddID0gMDsKCSRjb21wcmVzdWx0WydBdXN3J11bJ0ZlaGxBd2F5J10gPSAwOwoJJGNvbXByZXN1bHRbJ0F1c3cnXVsnVm9sbEF3YXknXSA9IDA7CgkkY29tcHJlc3VsdFsnQXVzdyddWydTUEF3YXknXSA9IDA7CgkkY29tcHJlc3VsdFsnQXVzdyddWydNUEF3YXknXSA9IDA7CgkkY29tcHJlc3VsdFsnQXVzdyddWydDb3VudEF3YXknXSA9IDA7CgkkY29tcHJlc3VsdFsnQXVzdyddWydOYW1lJ10gPSAkdGhpcy0+TGFuZygnb3Bwb25lbnQnKTsKCWZvcmVhY2ggKCRnYW1lcyBhcyAkdGVtcGdhbWUpIHsKCQlpZiAoJHRlbXBnYW1lLT5pczEyMCAoKSA9PSB0cnVlKSB7CgkJCSR0ZW1wcmVzdWx0cyA9IERhdGFiYXNlT3BlcmF0aW9uczo6Z2V0TWF0Y2gxMjBPZkdhbWUoICR0ZW1wZ2FtZSApOwoJCQkkdGVtcGNvbXByZXN1bHQgWydob21lZ2VzJ10gPSAwOwoJCQkkdGVtcGNvbXByZXN1bHQgWydvcHBvbmVudGdlcyddID0gMDsKCQkJJHRlbXBjb21wcmVzdWx0IFsnaG9tZXZvbGwnXSA9IDA7CgkJCSR0ZW1wY29tcHJlc3VsdCBbJ29wcG9uZW50dm9sbCddID0gMDsKCQkJJHRlbXBjb21wcmVzdWx0IFsnaG9tZWFiciddID0gMDsKCQkJJHRlbXBjb21wcmVzdWx0IFsnb3Bwb25lbnRhYnInXSA9IDA7CgkJCSR0ZW1wY29tcHJlc3VsdCBbJ2hvbWVmZWhsJ10gPSAwOwoJCQkkdGVtcGNvbXByZXN1bHQgWydvcHBvbmVudGZlaGwnXSA9IDA7CgkJCSR0ZW1wY29tcHJlc3VsdCBbJ2hvbWVzcCddID0gMDsKCQkJJHRlbXBjb21wcmVzdWx0IFsnb3Bwb25lbnRzcCddID0gMDsKCQkJJHRlbXBjb21wcmVzdWx0IFsnaG9tZW1wJ10gPSAwOwoJCQkkdGVtcGNvbXByZXN1bHQgWydvcHBvbmVudG1wJ10gPSAwOwoJCQlmb3JlYWNoICggJHRlbXByZXN1bHRzIGFzICR0ZW1wcmVzdWx0ICkgewoJCQkJJHRlbXBjb21wcmVzdWx0IFsnaG9tZWdlcyddICs9ICR0ZW1wcmVzdWx0LT5nZXRNYXRjaENvbXBsZXRlR2VzICgpOwoJCQkJJHRlbXBjb21wcmVzdWx0IFsnb3Bwb25lbnRnZXMnXSArPSAkdGVtcHJlc3VsdC0+Z2V0TWF0Y2hDb21wbGV0ZU9HZXMgKCk7CgkJCQkkdGVtcGNvbXByZXN1bHQgWydob21ldm9sbCddICs9ICR0ZW1wcmVzdWx0LT5nZXRNYXRjaENvbXBsZXRlVm9sbCAoKTsKCQkJCSR0ZW1wY29tcHJlc3VsdCBbJ29wcG9uZW50dm9sbCddICs9ICR0ZW1wcmVzdWx0LT5nZXRNYXRjaENvbXBsZXRlT1ZvbGwgKCk7CgkJCQkkdGVtcGNvbXByZXN1bHQgWydob21lYWJyJ10gKz0gJHRlbXByZXN1bHQtPmdldE1hdGNoQ29tcGxldGVBYnIgKCk7CgkJCQkkdGVtcGNvbXByZXN1bHQgWydvcHBvbmVudGFiciddICs9ICR0ZW1wcmVzdWx0LT5nZXRNYXRjaENvbXBsZXRlT0FiciAoKTsKCQkJCSR0ZW1wY29tcHJlc3VsdCBbJ2hvbWVmZWhsJ10gKz0gJHRlbXByZXN1bHQtPmdldE1hdGNoQ29tcGxldGVGZWhsICgpOwoJCQkJJHRlbXBjb21wcmVzdWx0IFsnb3Bwb25lbnRmZWhsJ10gKz0gJHRlbXByZXN1bHQtPmdldE1hdGNoQ29tcGxldGVPRmVobCAoKTsKCQkJCSR0ZW1wY29tcHJlc3VsdCBbJ2hvbWVzcCddICs9ICR0ZW1wcmVzdWx0LT5nZXRTZXRQb2ludHMgKCk7CgkJCQkkdGVtcGNvbXByZXN1bHQgWydvcHBvbmVudHNwJ10gKz0gJHRlbXByZXN1bHQtPmdldFNldE9Qb2ludHMgKCk7CgkJCQkkdGVtcGNvbXByZXN1bHQgWydob21lbXAnXSArPSAkdGVtcHJlc3VsdC0+Z2V0TWF0Y2hQb2ludHMgKCk7CgkJCQkkdGVtcGNvbXByZXN1bHQgWydvcHBvbmVudG1wJ10gKz0gJHRlbXByZXN1bHQtPmdldE1hdGNoT3BvaW50cyAoKTsKCQkJCWlmICgkdGVtcHJlc3VsdC0+Z2V0UENvdW50ICgpICYmIGlzc2V0ICggJGNvbXByZXN1bHQgWydwJyAuICR0ZW1wcmVzdWx0LT5nZXRTMSgpLT5nZXRQbGF5ZXIgKCktPmdldElkICgpXSApICYmCgkJCQkJCSgkdGVtcHJlc3VsdC0+Z2V0UzEoKS0+Z2V0UGxheWVyKCktPmdldElkKCkgPT0gJHRlbXByZXN1bHQtPmdldFMyKCktPmdldFBsYXllcigpLT5nZXRJZCgpKSAmJiAKCQkJCQkJKCR0ZW1wcmVzdWx0LT5nZXRTMigpLT5nZXRQbGF5ZXIoKS0+Z2V0SWQoKSA9PSAkdGVtcHJlc3VsdC0+Z2V0UzMoKS0+Z2V0UGxheWVyKCktPmdldElkKCkpICYmIAoJCQkJCQkoJHRlbXByZXN1bHQtPmdldFMzKCktPmdldFBsYXllcigpLT5nZXRJZCgpID09ICR0ZW1wcmVzdWx0LT5nZXRTNCgpLT5nZXRQbGF5ZXIoKS0+Z2V0SWQoKSkgKSB7CgkJCQkJJGNvbXByZXN1bHQgWydwJyAuICR0ZW1wcmVzdWx0LT5nZXRTMSgpLT5nZXRQbGF5ZXIgKCktPmdldElkICgpXSBbJ0dlcyddICs9ICR0ZW1wcmVzdWx0LT5nZXRNYXRjaENvbXBsZXRlR2VzICgpOwoJCQkJCSRjb21wcmVzdWx0IFsncCcgLiAkdGVtcHJlc3VsdC0+Z2V0UzEoKS0+Z2V0UGxheWVyICgpLT5nZXRJZCAoKV0gWydBYnInXSArPSAkdGVtcHJlc3VsdC0+Z2V0TWF0Y2hDb21wbGV0ZUFiciAoKTsKCQkJCQkkY29tcHJlc3VsdCBbJ3AnIC4gJHRlbXByZXN1bHQtPmdldFMxKCktPmdldFBsYXllciAoKS0+Z2V0SWQgKCldIFsnRmVobCddICs9ICR0ZW1wcmVzdWx0LT5nZXRNYXRjaENvbXBsZXRlRmVobCAoKTsKCQkJCQkkY29tcHJlc3VsdCBbJ3AnIC4gJHRlbXByZXN1bHQtPmdldFMxKCktPmdldFBsYXllciAoKS0+Z2V0SWQgKCldIFsnVm9sbCddICs9ICR0ZW1wcmVzdWx0LT5nZXRNYXRjaENvbXBsZXRlVm9sbCAoKTsKCQkJCQkkY29tcHJlc3VsdCBbJ3AnIC4gJHRlbXByZXN1bHQtPmdldFMxKCktPmdldFBsYXllciAoKS0+Z2V0SWQgKCldIFsnU1AnXSArPSAkdGVtcHJlc3VsdC0+Z2V0U2V0UG9pbnRzICgpOwoJCQkJCSRjb21wcmVzdWx0IFsncCcgLiAkdGVtcHJlc3VsdC0+Z2V0UzEoKS0+Z2V0UGxheWVyICgpLT5nZXRJZCAoKV0gWydNUCddICs9ICR0ZW1wcmVzdWx0LT5nZXRNYXRjaFBvaW50cyAoKTsKCQkJCQkkY29tcHJlc3VsdCBbJ3AnIC4gJHRlbXByZXN1bHQtPmdldFMxKCktPmdldFBsYXllciAoKS0+Z2V0SWQgKCldIFsnQ291bnQnXSArPSAxOwoJCQkJCWlmICgkdGVtcGdhbWUtPmdldEhvbWUgKCkgPT0gdHJ1ZSkgewoJCQkJCQkkY29tcHJlc3VsdCBbJ3AnIC4gJHRlbXByZXN1bHQtPmdldFMxKCktPmdldFBsYXllciAoKS0+Z2V0SWQgKCldIFsnR2VzSG9tZSddICs9ICR0ZW1wcmVzdWx0LT5nZXRNYXRjaENvbXBsZXRlR2VzICgpOwoJCQkJCQkkY29tcHJlc3VsdCBbJ3AnIC4gJHRlbXByZXN1bHQtPmdldFMxKCktPmdldFBsYXllciAoKS0+Z2V0SWQgKCldIFsnQWJySG9tZSddICs9ICR0ZW1wcmVzdWx0LT5nZXRNYXRjaENvbXBsZXRlQWJyICgpOwoJCQkJCQkkY29tcHJlc3VsdCBbJ3AnIC4gJHRlbXByZXN1bHQtPmdldFMxKCktPmdldFBsYXllciAoKS0+Z2V0SWQgKCldIFsnRmVobEhvbWUnXSArPSAkdGVtcHJlc3VsdC0+Z2V0TWF0Y2hDb21wbGV0ZUZlaGwgKCk7CgkJCQkJCSRjb21wcmVzdWx0IFsncCcgLiAkdGVtcHJlc3VsdC0+Z2V0UzEoKS0+Z2V0UGxheWVyICgpLT5nZXRJZCAoKV0gWydWb2xsSG9tZSddICs9ICR0ZW1wcmVzdWx0LT5nZXRNYXRjaENvbXBsZXRlVm9sbCAoKTsKCQkJCQkJJGNvbXByZXN1bHQgWydwJyAuICR0ZW1wcmVzdWx0LT5nZXRTMSgpLT5nZXRQbGF5ZXIgKCktPmdldElkICgpXSBbJ1NQSG9tZSddICs9ICR0ZW1wcmVzdWx0LT5nZXRTZXRQb2ludHMgKCk7CgkJCQkJCSRjb21wcmVzdWx0IFsncCcgLiAkdGVtcHJlc3VsdC0+Z2V0UzEoKS0+Z2V0UGxheWVyICgpLT5nZXRJZCAoKV0gWydNUEhvbWUnXSArPSAkdGVtcHJlc3VsdC0+Z2V0TWF0Y2hQb2ludHMgKCk7CgkJCQkJCSRjb21wcmVzdWx0IFsncCcgLiAkdGVtcHJlc3VsdC0+Z2V0UzEoKS0+Z2V0UGxheWVyICgpLT5nZXRJZCAoKV0gWydDb3VudEhvbWUnXSArPSAxOwoJCQkJCX0gZWxzZSB7CgkJCQkJCSRjb21wcmVzdWx0IFsncCcgLiAkdGVtcHJlc3VsdC0+Z2V0UzEoKS0+Z2V0UGxheWVyICgpLT5nZXRJZCAoKV0gWydHZXNBd2F5J10gKz0gJHRlbXByZXN1bHQtPmdldE1hdGNoQ29tcGxldGVHZXMgKCk7CgkJCQkJCSRjb21wcmVzdWx0IFsncCcgLiAkdGVtcHJlc3VsdC0+Z2V0UzEoKS0+Z2V0UGxheWVyICgpLT5nZXRJZCAoKV0gWydBYnJBd2F5J10gKz0gJHRlbXByZXN1bHQtPmdldE1hdGNoQ29tcGxldGVBYnIgKCk7CgkJCQkJCSRjb21wcmVzdWx0IFsncCcgLiAkdGVtcHJlc3VsdC0+Z2V0UzEoKS0+Z2V0UGxheWVyICgpLT5nZXRJZCAoKV0gWydGZWhsQXdheSddICs9ICR0ZW1wcmVzdWx0LT5nZXRNYXRjaENvbXBsZXRlRmVobCAoKTsKCQkJCQkJJGNvbXByZXN1bHQgWydwJyAuICR0ZW1wcmVzdWx0LT5nZXRTMSgpLT5nZXRQbGF5ZXIgKCktPmdldElkICgpXSBbJ1ZvbGxBd2F5J10gKz0gJHRlbXByZXN1bHQtPmdldE1hdGNoQ29tcGxldGVWb2xsICgpOwoJCQkJCQkkY29tcHJlc3VsdCBbJ3AnIC4gJHRlbXByZXN1bHQtPmdldFMxKCktPmdldFBsYXllciAoKS0+Z2V0SWQgKCldIFsnU1BBd2F5J10gKz0gJHRlbXByZXN1bHQtPmdldFNldFBvaW50cyAoKTsKCQkJCQkJJGNvbXByZXN1bHQgWydwJyAuICR0ZW1wcmVzdWx0LT5nZXRTMSgpLT5nZXRQbGF5ZXIgKCktPmdldElkICgpXSBbJ01QQXdheSddICs9ICR0ZW1wcmVzdWx0LT5nZXRNYXRjaFBvaW50cyAoKTsKCQkJCQkJJGNvbXByZXN1bHQgWydwJyAuICR0ZW1wcmVzdWx0LT5nZXRTMSgpLT5nZXRQbGF5ZXIgKCktPmdldElkICgpXSBbJ0NvdW50QXdheSddICs9IDE7CgkJCQkJfQoJCQkJfQoJCQl9CgkJCWlmICgoJHRlbXBjb21wcmVzdWx0IFsnaG9tZWdlcyddICE9IDApIHx8ICgkdGVtcGNvbXByZXN1bHQgWydvcHBvbmVudGdlcyddICE9IDApKSB7CgkJCQlpZiAoJHRlbXBjb21wcmVzdWx0Wydob21lZ2VzJ10gPiAkdGVtcGNvbXByZXN1bHRbJ29wcG9uZW50Z2VzJ10pIHsKCQkJCQkkY29tcHJlc3VsdFsnSGVpbSddWydNUCddICs9IDIwOwoJCQkJfSBlbHNlIGlmICgkdGVtcGNvbXByZXN1bHRbJ2hvbWVnZXMnXSA8ICR0ZW1wY29tcHJlc3VsdFsnb3Bwb25lbnRnZXMnXSkgewoJCQkJCSRjb21wcmVzdWx0WydBdXN3J11bJ01QJ10gKz0gMjA7CgkJCQl9IGVsc2UgewoJCQkJCSRjb21wcmVzdWx0WydIZWltJ11bJ01QJ10gKz0gMTA7CgkJCQkJJGNvbXByZXN1bHRbJ0F1c3cnXVsnTVAnXSArPSAxMDsKCQkJCX0KCQkJCSRjb21wcmVzdWx0IFsnSGVpbSddIFsnR2VzJ10gKz0gJHRlbXBjb21wcmVzdWx0IFsnaG9tZWdlcyddOwoJCQkJJGNvbXByZXN1bHQgWydIZWltJ10gWydBYnInXSArPSAkdGVtcGNvbXByZXN1bHQgWydob21lYWJyJ107CgkJCQkkY29tcHJlc3VsdCBbJ0hlaW0nXSBbJ0ZlaGwnXSArPSAkdGVtcGNvbXByZXN1bHQgWydob21lZmVobCddOwoJCQkJJGNvbXByZXN1bHQgWydIZWltJ10gWydWb2xsJ10gKz0gJHRlbXBjb21wcmVzdWx0IFsnaG9tZXZvbGwnXTsKCQkJCSRjb21wcmVzdWx0IFsnSGVpbSddIFsnU1AnXSArPSAkdGVtcGNvbXByZXN1bHQgWydob21lc3AnXTsKCQkJCSRjb21wcmVzdWx0IFsnSGVpbSddIFsnTVAnXSArPSAkdGVtcGNvbXByZXN1bHQgWydob21lbXAnXTsKCQkJCSRjb21wcmVzdWx0IFsnSGVpbSddIFsnQ291bnQnXSArPSAxOwoJCQkJJGNvbXByZXN1bHQgWydBdXN3J10gWydHZXMnXSArPSAkdGVtcGNvbXByZXN1bHQgWydvcHBvbmVudGdlcyddOwoJCQkJJGNvbXByZXN1bHQgWydBdXN3J10gWydBYnInXSArPSAkdGVtcGNvbXByZXN1bHQgWydvcHBvbmVudGFiciddOwoJCQkJJGNvbXByZXN1bHQgWydBdXN3J10gWydGZWhsJ10gKz0gJHRlbXBjb21wcmVzdWx0IFsnb3Bwb25lbnRmZWhsJ107CgkJCQkkY29tcHJlc3VsdCBbJ0F1c3cnXSBbJ1ZvbGwnXSArPSAkdGVtcGNvbXByZXN1bHQgWydvcHBvbmVudHZvbGwnXTsKCQkJCSRjb21wcmVzdWx0IFsnQXVzdyddIFsnU1AnXSArPSAkdGVtcGNvbXByZXN1bHQgWydvcHBvbmVudHNwJ107CgkJCQkkY29tcHJlc3VsdCBbJ0F1c3cnXSBbJ01QJ10gKz0gJHRlbXBjb21wcmVzdWx0IFsnb3Bwb25lbnRtcCddOwoJCQkJJGNvbXByZXN1bHQgWydBdXN3J10gWydDb3VudCddICs9IDE7CgkJCQlpZiAoJHRlbXBnYW1lLT5nZXRIb21lICgpID09IHRydWUpIHsKCQkJCQlpZiAoJHRlbXBjb21wcmVzdWx0Wydob21lZ2VzJ10gPiAkdGVtcGNvbXByZXN1bHRbJ29wcG9uZW50Z2VzJ10pIHsKCQkJCQkJJGNvbXByZXN1bHRbJ0hlaW0nXVsnTVBIb21lJ10gKz0gMjA7CgkJCQkJfSBlbHNlIGlmICgkdGVtcGNvbXByZXN1bHRbJ2hvbWVnZXMnXSA8ICR0ZW1wY29tcHJlc3VsdFsnb3Bwb25lbnRnZXMnXSkgewoJCQkJCQkkY29tcHJlc3VsdFsnQXVzdyddWydNUEhvbWUnXSArPSAyMDsKCQkJCQl9IGVsc2UgewoJCQkJCQkkY29tcHJlc3VsdFsnSGVpbSddWydNUEhvbWUnXSArPSAxMDsKCQkJCQkJJGNvbXByZXN1bHRbJ0F1c3cnXVsnTVBIb21lJ10gKz0gMTA7CgkJCQkJfQoJCQkJCSRjb21wcmVzdWx0IFsnSGVpbSddIFsnR2VzSG9tZSddICs9ICR0ZW1wY29tcHJlc3VsdCBbJ2hvbWVnZXMnXTsKCQkJCQkkY29tcHJlc3VsdCBbJ0hlaW0nXSBbJ0FickhvbWUnXSArPSAkdGVtcGNvbXByZXN1bHQgWydob21lYWJyJ107CgkJCQkJJGNvbXByZXN1bHQgWydIZWltJ10gWydGZWhsSG9tZSddICs9ICR0ZW1wY29tcHJlc3VsdCBbJ2hvbWVmZWhsJ107CgkJCQkJJGNvbXByZXN1bHQgWydIZWltJ10gWydWb2xsSG9tZSddICs9ICR0ZW1wY29tcHJlc3VsdCBbJ2hvbWV2b2xsJ107CgkJCQkJJGNvbXByZXN1bHQgWydIZWltJ10gWydTUEhvbWUnXSArPSAkdGVtcGNvbXByZXN1bHQgWydob21lc3AnXTsKCQkJCQkkY29tcHJlc3VsdCBbJ0hlaW0nXSBbJ01QSG9tZSddICs9ICR0ZW1wY29tcHJlc3VsdCBbJ2hvbWVtcCddOwoJCQkJCSRjb21wcmVzdWx0IFsnSGVpbSddIFsnQ291bnRIb21lJ10gKz0gMTsKCQkJCQkkY29tcHJlc3VsdCBbJ0F1c3cnXSBbJ0dlc0hvbWUnXSArPSAkdGVtcGNvbXByZXN1bHQgWydvcHBvbmVudGdlcyddOwoJCQkJCSRjb21wcmVzdWx0IFsnQXVzdyddIFsnQWJySG9tZSddICs9ICR0ZW1wY29tcHJlc3VsdCBbJ29wcG9uZW50YWJyJ107CgkJCQkJJGNvbXByZXN1bHQgWydBdXN3J10gWydGZWhsSG9tZSddICs9ICR0ZW1wY29tcHJlc3VsdCBbJ29wcG9uZW50ZmVobCddOwoJCQkJCSRjb21wcmVzdWx0IFsnQXVzdyddIFsnVm9sbEhvbWUnXSArPSAkdGVtcGNvbXByZXN1bHQgWydvcHBvbmVudHZvbGwnXTsKCQkJCQkkY29tcHJlc3VsdCBbJ0F1c3cnXSBbJ1NQSG9tZSddICs9ICR0ZW1wY29tcHJlc3VsdCBbJ29wcG9uZW50c3AnXTsKCQkJCQkkY29tcHJlc3VsdCBbJ0F1c3cnXSBbJ01QSG9tZSddICs9ICR0ZW1wY29tcHJlc3VsdCBbJ29wcG9uZW50bXAnXTsKCQkJCQkkY29tcHJlc3VsdCBbJ0F1c3cnXSBbJ0NvdW50SG9tZSddICs9IDE7CgkJCQl9IGVsc2UgewoJCQkJCWlmICgkdGVtcGNvbXByZXN1bHRbJ2hvbWVnZXMnXSA+ICR0ZW1wY29tcHJlc3VsdFsnb3Bwb25lbnRnZXMnXSkgewoJCQkJCQkkY29tcHJlc3VsdFsnSGVpbSddWydNUEF3YXknXSArPSAyMDsKCQkJCQl9IGVsc2UgaWYgKCR0ZW1wY29tcHJlc3VsdFsnaG9tZWdlcyddIDwgJHRlbXBjb21wcmVzdWx0WydvcHBvbmVudGdlcyddKSB7CgkJCQkJCSRjb21wcmVzdWx0WydBdXN3J11bJ01QQXdheSddICs9IDIwOwoJCQkJCX0gZWxzZSB7CgkJCQkJCSRjb21wcmVzdWx0WydIZWltJ11bJ01QQXdheSddICs9IDEwOwoJCQkJCQkkY29tcHJlc3VsdFsnQXVzdyddWydNUEF3YXknXSArPSAxMDsKCQkJCQl9CgkJCQkJJGNvbXByZXN1bHQgWydIZWltJ10gWydHZXNBd2F5J10gKz0gJHRlbXBjb21wcmVzdWx0IFsnaG9tZWdlcyddOwoJCQkJCSRjb21wcmVzdWx0IFsnSGVpbSddIFsnQWJyQXdheSddICs9ICR0ZW1wY29tcHJlc3VsdCBbJ2hvbWVhYnInXTsKCQkJCQkkY29tcHJlc3VsdCBbJ0hlaW0nXSBbJ0ZlaGxBd2F5J10gKz0gJHRlbXBjb21wcmVzdWx0IFsnaG9tZWZlaGwnXTsKCQkJCQkkY29tcHJlc3VsdCBbJ0hlaW0nXSBbJ1ZvbGxBd2F5J10gKz0gJHRlbXBjb21wcmVzdWx0IFsnaG9tZXZvbGwnXTsKCQkJCQkkY29tcHJlc3VsdCBbJ0hlaW0nXSBbJ1NQQXdheSddICs9ICR0ZW1wY29tcHJlc3VsdCBbJ2hvbWVzcCddOwoJCQkJCSRjb21wcmVzdWx0IFsnSGVpbSddIFsnTVBBd2F5J10gKz0gJHRlbXBjb21wcmVzdWx0IFsnaG9tZW1wJ107CgkJCQkJJGNvbXByZXN1bHQgWydIZWltJ10gWydDb3VudEF3YXknXSArPSAxOwoJCQkJCSRjb21wcmVzdWx0IFsnQXVzdyddIFsnR2VzQXdheSddICs9ICR0ZW1wY29tcHJlc3VsdCBbJ29wcG9uZW50Z2VzJ107CgkJCQkJJGNvbXByZXN1bHQgWydBdXN3J10gWydBYnJBd2F5J10gKz0gJHRlbXBjb21wcmVzdWx0IFsnb3Bwb25lbnRhYnInXTsKCQkJCQkkY29tcHJlc3VsdCBbJ0F1c3cnXSBbJ0ZlaGxBd2F5J10gKz0gJHRlbXBjb21wcmVzdWx0IFsnb3Bwb25lbnRmZWhsJ107CgkJCQkJJGNvbXByZXN1bHQgWydBdXN3J10gWydWb2xsQXdheSddICs9ICR0ZW1wY29tcHJlc3VsdCBbJ29wcG9uZW50dm9sbCddOwoJCQkJCSRjb21wcmVzdWx0IFsnQXVzdyddIFsnU1BBd2F5J10gKz0gJHRlbXBjb21wcmVzdWx0IFsnb3Bwb25lbnRzcCddOwoJCQkJCSRjb21wcmVzdWx0IFsnQXVzdyddIFsnTVBBd2F5J10gKz0gJHRlbXBjb21wcmVzdWx0IFsnb3Bwb25lbnRtcCddOwoJCQkJCSRjb21wcmVzdWx0IFsnQXVzdyddIFsnQ291bnRBd2F5J10gKz0gMTsKCQkJCX0KCQkJfQoJCX0KCX0KCSR0aGlzLT5zbWFydHktPmFzc2lnbignU2Fpc29uJywgJHNhaXNvbi0+Z2V0TmFtZSgpKTsKCSR0aGlzLT5zbWFydHktPmFzc2lnbignVGVhbScsICR0ZWFtLT5nZXROYW1lKCkpOwoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdSZXN1bHRzJywgJGNvbXByZXN1bHQpOwoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdUYWdWb2xsJywgJHRoaXMtPkxhbmcoJ1NCVm9sbCcpKTsKCSR0aGlzLT5zbWFydHktPmFzc2lnbignVGFnQWJyJywgJHRoaXMtPkxhbmcoJ1NCQWJyJykpOwoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdUYWdHZXMnLCAkdGhpcy0+TGFuZygnU0JHZXMnKSk7CgkkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ1RhZ0ZlaGwnLCAkdGhpcy0+TGFuZygnU0JGZWhsJykpOwoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdUYWdOYW1lJywgJHRoaXMtPkxhbmcoJ1NCTmFtZScpKTsKCSR0aGlzLT5zbWFydHktPmFzc2lnbignVGFnVHlwZScsICR0aGlzLT5MYW5nKCdTQlR5cGUnKSk7CgkkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ1RhZ0F3YXknLCAkdGhpcy0+TGFuZygnU0JBd2F5JykpOwoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdUYWdIb21lJywgJHRoaXMtPkxhbmcoJ1NCSG9tZScpKTsKCSR0aGlzLT5zbWFydHktPmFzc2lnbignVGFnU1AnLCAkdGhpcy0+TGFuZygnU1AnKSk7CgkkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ1RhZ01QJywgJHRoaXMtPkxhbmcoJ01QJykpOwoJZWNobyAkdGhpcy0+UHJvY2Vzc1RlbXBsYXRlKCdzaG93YXZlcmFnZXRlYW0xMjAudHBsJyk7Cn0gZWxzZSB7CgkkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3RpdGxlX2Vycm9yJywgJHRoaXMtPkxhbmcoJ2Vycm9ydGFnJykpOwoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdtZXNzYWdlJywgJHRoaXMtPkxhbmcoJ2Vycm9yX3RlYW0nKS4nPGJyLz4nLiRwYXJhbXNbJ3RlYW0nXS4kdGhpcy0+TGFuZygnZXJyb3Jfc2Fpc29uJykuJHBhcmFtc1snc2Fpc29uJ10pOwoJZWNobyAkdGhpcy0+UHJvY2Vzc1RlbXBsYXRlKCdlcnJvci50cGwnKTsKfQoKPz4=]]></data>
	</file>
	<file>
	  <filename>/action.showgame.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKaWYgKCFpc3NldCgkZ0NtcykpIGV4aXQ7CgovKiAtPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LQoKICAgQ29kZSBmb3Iga2VnZWxlcmdlYm5pc3NlICJzaG93Z2FtZSIgYWN0aW9uCgogICAtPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LQogICAKICAgVHlwaWNhbGx5LCB0aGlzIHdpbGwgZGlzcGxheSBzb21ldGhpbmcgZnJvbSBhIHRlbXBsYXRlCiAgIG9yIGRvIHNvbWUgb3RoZXIgdGFzay4KICAgCiovCi8qIHNlYXJjaCBmb3IgdGVhbSBpbnNpZGUgdGhlIGRhdGFiYXNlICovCiR0ZWFtcyA9IERhdGFiYXNlT3BlcmF0aW9uczo6Z2V0QWxsVGVhbXMoKTsKZm9yZWFjaCAoJHRlYW1zIGFzICR0ZW1wdGVhbSkgewoJaWYgKCR0ZW1wdGVhbS0+Z2V0TmFtZSgpID09ICRwYXJhbXNbJ3RlYW0nXSkgewoJCSR0ZWFtID0gJHRlbXB0ZWFtOwoJfQp9CgovKiBzZWFyY2ggZm9yIHNhaXNvbiBpbnNpZGUgdGhlIGRhdGFiYXNlICovCiRzYWlzb25zID0gRGF0YWJhc2VPcGVyYXRpb25zOjpnZXRBbGxTYWlzb25zKCk7CmZvcmVhY2ggKCRzYWlzb25zIGFzICR0ZW1wc2Fpc29uKSB7CglpZiAoJHRlbXBzYWlzb24tPmdldE5hbWUoKSA9PSAkcGFyYW1zWydzYWlzb24nXSkgewoJCSRzYWlzb24gPSAkdGVtcHNhaXNvbjsKCX0KfQoKaWYgKGlzc2V0KCRzYWlzb24pICYmIGlzc2V0KCR0ZWFtKSkgewoJLyogYWxsZSBTcGllbGUgZGVyIE1hbm5zY2hhZnQgaG9sZW4gdW5kIEVyZ2Vibmlzc2UgYmVyZWNobmVuICovCgkkZ2FtZXMgPSBEYXRhYmFzZU9wZXJhdGlvbnM6OmdldFRpbWVUYWJsZSgkc2Fpc29uLCAkdGVhbSk7CglpZiAoaXNzZXQgKCAkZ2FtZXMgWyRwYXJhbXMgWydudW1iZXInXSAtIDFdICkpIHsKCQkkdGVtcGdhbWUgPSAkZ2FtZXMgWyRwYXJhbXMgWydudW1iZXInXSAtIDFdOwoJCWlmICgkdGVtcGdhbWUtPmlzMTIwICgpID09IGZhbHNlKSB7CgkJCSR0ZW1wcmVzdWx0cyA9IERhdGFiYXNlT3BlcmF0aW9uczo6Z2V0UmVzdWx0T2ZHYW1lICggJHRlbXBnYW1lICk7CgkJCSR0ZW1wY29tcHJlc3VsdCBbJ2hvbWVnZXMnXSA9IDA7CgkJCSR0ZW1wY29tcHJlc3VsdCBbJ29wcG9uZW50Z2VzJ10gPSAwOwoJCQkkdGVtcGNvbXByZXN1bHQgWydob21lYWJyJ10gPSAwOwoJCQkkdGVtcGNvbXByZXN1bHQgWydvcHBvbmVudGFiciddID0gMDsKCQkJJHRlbXBjb21wcmVzdWx0IFsnaG9tZWZlaGwnXSA9IDA7CgkJCSR0ZW1wY29tcHJlc3VsdCBbJ29wcG9uZW50ZmVobCddID0gMDsKCQkJJHRlbXBjb21wcmVzdWx0IFsnaG9tZXZvbGwnXSA9IDA7CgkJCSR0ZW1wY29tcHJlc3VsdCBbJ29wcG9uZW50dm9sbCddID0gMDsKCQkJJGkgPSAwOwoJCQlmb3JlYWNoICggJHRlbXByZXN1bHRzIGFzICR0ZW1wcmVzdWx0ICkgewoJCQkJJHRlbXBjb21wcmVzdWx0IFsnaG9tZWdlcyddICs9ICR0ZW1wcmVzdWx0LT5nZXRHZXMgKCk7CgkJCQkkdGVtcGNvbXByZXN1bHQgWydvcHBvbmVudGdlcyddICs9ICR0ZW1wcmVzdWx0LT5nZXRPR2VzICgpOwoJCQkJJHRlbXBjb21wcmVzdWx0IFsnaG9tZXZvbGwnXSArPSAkdGVtcHJlc3VsdC0+Z2V0Vm9sbCAoKTsKCQkJCSR0ZW1wY29tcHJlc3VsdCBbJ29wcG9uZW50dm9sbCddICs9ICR0ZW1wcmVzdWx0LT5nZXRPVm9sbCAoKTsKCQkJCSR0ZW1wY29tcHJlc3VsdCBbJ2hvbWVhYnInXSArPSAkdGVtcHJlc3VsdC0+Z2V0QWJyICgpOwoJCQkJJHRlbXBjb21wcmVzdWx0IFsnb3Bwb25lbnRhYnInXSArPSAkdGVtcHJlc3VsdC0+Z2V0T0FiciAoKTsKCQkJCSR0ZW1wY29tcHJlc3VsdCBbJ2hvbWVmZWhsJ10gKz0gJHRlbXByZXN1bHQtPmdldEZlaGwgKCk7CgkJCQkkdGVtcGNvbXByZXN1bHQgWydvcHBvbmVudGZlaGwnXSArPSAkdGVtcHJlc3VsdC0+Z2V0T0ZlaGwgKCk7CgkJCQkkdGFibGVpbmZvIFskaV0gWydob21lbmFtZSddID0gJHRlbXByZXN1bHQtPmdldFBsYXllciAoKS0+Z2V0TmFtZSAoKTsKCQkJCSR0YWJsZWluZm8gWyRpXSBbJ29wcG9uZW50bmFtZSddID0gJHRlbXByZXN1bHQtPmdldE9wcG9uZW50ICgpOwoJCQkJJHRhYmxlaW5mbyBbJGldIFsnaG9tZWdlcyddID0gJHRlbXByZXN1bHQtPmdldEdlcyAoKTsKCQkJCSR0YWJsZWluZm8gWyRpXSBbJ29wcG9uZW50Z2VzJ10gPSAkdGVtcHJlc3VsdC0+Z2V0T0dlcyAoKTsKCQkJCSR0YWJsZWluZm8gWyRpXSBbJ2hvbWV2b2xsJ10gPSAkdGVtcHJlc3VsdC0+Z2V0Vm9sbCAoKTsKCQkJCSR0YWJsZWluZm8gWyRpXSBbJ29wcG9uZW50dm9sbCddID0gJHRlbXByZXN1bHQtPmdldE9Wb2xsICgpOwoJCQkJJHRhYmxlaW5mbyBbJGldIFsnaG9tZWFiciddID0gJHRlbXByZXN1bHQtPmdldEFiciAoKTsKCQkJCSR0YWJsZWluZm8gWyRpXSBbJ29wcG9uZW50YWJyJ10gPSAkdGVtcHJlc3VsdC0+Z2V0T0FiciAoKTsKCQkJCSR0YWJsZWluZm8gWyRpXSBbJ2hvbWVmZWhsJ10gPSAkdGVtcHJlc3VsdC0+Z2V0RmVobCAoKTsKCQkJCSR0YWJsZWluZm8gWyRpXSBbJ29wcG9uZW50ZmVobCddID0gJHRlbXByZXN1bHQtPmdldE9GZWhsICgpOwoJCQkJJGkgKz0gMTsKCQkJfQoJCQkkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCAnR2FtZU91clRlYW0nLCAkdGVtcGdhbWUtPmdldE91clRlYW0gKCktPmdldE5hbWUgKCkgKTsKCQkJJHRoaXMtPnNtYXJ0eS0+YXNzaWduICggJ0dhbWVPcHBvbmVudCcsICR0ZW1wZ2FtZS0+Z2V0T3Bwb25lbnQgKCkgKTsKCQkJJHRoaXMtPnNtYXJ0eS0+YXNzaWduICggJ0dhbWVEYXRlJywgJHRlbXBnYW1lLT5nZXREYXRlICgpLT5mb3JtYXQgKCAiZC5tLlkiICkgKTsKCQkJJHRoaXMtPnNtYXJ0eS0+YXNzaWduICggJ0dhbWVUaW1lJywgJHRlbXBnYW1lLT5nZXREYXRlICgpLT5mb3JtYXQgKCAiSDppIiApICk7CgkJCSR0aGlzLT5zbWFydHktPmFzc2lnbiAoICdHYW1lSG9tZScsICR0ZW1wZ2FtZS0+Z2V0SG9tZSAoKSApOwoJCQkkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCAnT3VyU2NvcmVHZXMnLCAkdGVtcGNvbXByZXN1bHQgWydob21lZ2VzJ10gKTsKCQkJJHRoaXMtPnNtYXJ0eS0+YXNzaWduICggJ09wcG9uZW50U2NvcmVHZXMnLCAkdGVtcGNvbXByZXN1bHQgWydvcHBvbmVudGdlcyddICk7CgkJCSR0aGlzLT5zbWFydHktPmFzc2lnbiAoICdPdXJTY29yZUFicicsICR0ZW1wY29tcHJlc3VsdCBbJ2hvbWVhYnInXSApOwoJCQkkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCAnT3Bwb25lbnRTY29yZUFicicsICR0ZW1wY29tcHJlc3VsdCBbJ29wcG9uZW50YWJyJ10gKTsKCQkJJHRoaXMtPnNtYXJ0eS0+YXNzaWduICggJ091clNjb3JlVm9sbCcsICR0ZW1wY29tcHJlc3VsdCBbJ2hvbWV2b2xsJ10gKTsKCQkJJHRoaXMtPnNtYXJ0eS0+YXNzaWduICggJ09wcG9uZW50U2NvcmVWb2xsJywgJHRlbXBjb21wcmVzdWx0IFsnb3Bwb25lbnR2b2xsJ10gKTsKCQkJJHRoaXMtPnNtYXJ0eS0+YXNzaWduICggJ091clNjb3JlRmVobCcsICR0ZW1wY29tcHJlc3VsdCBbJ2hvbWVmZWhsJ10gKTsKCQkJJHRoaXMtPnNtYXJ0eS0+YXNzaWduICggJ09wcG9uZW50U2NvcmVGZWhsJywgJHRlbXBjb21wcmVzdWx0IFsnb3Bwb25lbnRmZWhsJ10gKTsKCQkJJHRoaXMtPnNtYXJ0eS0+YXNzaWduICggJ1NhaXNvbicsICRzYWlzb24tPmdldE5hbWUgKCkgKTsKCQkJJHRoaXMtPnNtYXJ0eS0+YXNzaWduICggJ1RlYW0nLCAkdGVhbS0+Z2V0TmFtZSAoKSApOwoJCQkkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCAnUmVzdWx0cycsICR0YWJsZWluZm8gKTsKCQkJJHRoaXMtPnNtYXJ0eS0+YXNzaWduICggJ1RhZ05hbWUnLCAkdGhpcy0+TGFuZyAoICdTQk5hbWUnICkgKTsKCQkJJHRoaXMtPnNtYXJ0eS0+YXNzaWduICggJ1RhZ1ZvbGwnLCAkdGhpcy0+TGFuZyAoICdTQlZvbGwnICkgKTsKCQkJJHRoaXMtPnNtYXJ0eS0+YXNzaWduICggJ1RhZ0FicicsICR0aGlzLT5MYW5nICggJ1NCQWJyJyApICk7CgkJCSR0aGlzLT5zbWFydHktPmFzc2lnbiAoICdUYWdGZWhsJywgJHRoaXMtPkxhbmcgKCAnU0JGZWhsJyApICk7CgkJCSR0aGlzLT5zbWFydHktPmFzc2lnbiAoICdUYWdHZXMnLCAkdGhpcy0+TGFuZyAoICdTQkdlcycgKSApOwoJCQllY2hvICR0aGlzLT5Qcm9jZXNzVGVtcGxhdGUgKCAnc2hvd2dhbWUudHBsJyApOwoJCX0gZWxzZSB7CgkJCSR0ZW1wcmVzdWx0cyA9IERhdGFiYXNlT3BlcmF0aW9uczo6Z2V0TWF0Y2gxMjBPZkdhbWUoJHRlbXBnYW1lKTsKCQkJJHRlbXBjb21wcmVzdWx0IFsnaG9tZWdlcyddID0gMDsKCQkJJHRlbXBjb21wcmVzdWx0IFsnb3Bwb25lbnRnZXMnXSA9IDA7CgkJCSR0ZW1wY29tcHJlc3VsdCBbJ2hvbWVhYnInXSA9IDA7CgkJCSR0ZW1wY29tcHJlc3VsdCBbJ29wcG9uZW50YWJyJ10gPSAwOwoJCQkkdGVtcGNvbXByZXN1bHQgWydob21lZmVobCddID0gMDsKCQkJJHRlbXBjb21wcmVzdWx0IFsnb3Bwb25lbnRmZWhsJ10gPSAwOwoJCQkkdGVtcGNvbXByZXN1bHQgWydob21ldm9sbCddID0gMDsKCQkJJHRlbXBjb21wcmVzdWx0IFsnb3Bwb25lbnR2b2xsJ10gPSAwOwoJCQkkdGVtcGNvbXByZXN1bHQgWydob21lc3AnXSA9IDA7CgkJCSR0ZW1wY29tcHJlc3VsdCBbJ29wcG9uZW50c3AnXSA9IDA7CgkJCSR0ZW1wY29tcHJlc3VsdCBbJ2hvbWVtcCddID0gMDsKCQkJJHRlbXBjb21wcmVzdWx0IFsnb3Bwb25lbnRtcCddID0gMDsKCQkJJGkgPSAwOwoJCQlmb3JlYWNoICggJHRlbXByZXN1bHRzIGFzICR0ZW1wcmVzdWx0ICkgewoJCQkJJHRlbXBjb21wcmVzdWx0IFsnaG9tZWdlcyddICs9ICR0ZW1wcmVzdWx0LT5nZXRNYXRjaENvbXBsZXRlR2VzICgpOwoJCQkJJHRlbXBjb21wcmVzdWx0IFsnb3Bwb25lbnRnZXMnXSArPSAkdGVtcHJlc3VsdC0+Z2V0TWF0Y2hDb21wbGV0ZU9HZXMgKCk7CgkJCQkkdGVtcGNvbXByZXN1bHQgWydob21ldm9sbCddICs9ICR0ZW1wcmVzdWx0LT5nZXRNYXRjaENvbXBsZXRlVm9sbCAoKTsKCQkJCSR0ZW1wY29tcHJlc3VsdCBbJ29wcG9uZW50dm9sbCddICs9ICR0ZW1wcmVzdWx0LT5nZXRNYXRjaENvbXBsZXRlT1ZvbGwgKCk7CgkJCQkkdGVtcGNvbXByZXN1bHQgWydob21lYWJyJ10gKz0gJHRlbXByZXN1bHQtPmdldE1hdGNoQ29tcGxldGVBYnIgKCk7CgkJCQkkdGVtcGNvbXByZXN1bHQgWydvcHBvbmVudGFiciddICs9ICR0ZW1wcmVzdWx0LT5nZXRNYXRjaENvbXBsZXRlT0FiciAoKTsKCQkJCSR0ZW1wY29tcHJlc3VsdCBbJ2hvbWVmZWhsJ10gKz0gJHRlbXByZXN1bHQtPmdldE1hdGNoQ29tcGxldGVGZWhsICgpOwoJCQkJJHRlbXBjb21wcmVzdWx0IFsnb3Bwb25lbnRmZWhsJ10gKz0gJHRlbXByZXN1bHQtPmdldE1hdGNoQ29tcGxldGVPRmVobCAoKTsKCQkJCSR0ZW1wY29tcHJlc3VsdCBbJ2hvbWVzcCddICs9ICR0ZW1wcmVzdWx0LT5nZXRTZXRQb2ludHMoKTsKCQkJCSR0ZW1wY29tcHJlc3VsdCBbJ29wcG9uZW50c3AnXSArPSAkdGVtcHJlc3VsdC0+Z2V0U2V0T1BvaW50cygpOwoJCQkJJHRlbXBjb21wcmVzdWx0IFsnaG9tZW1wJ10gKz0gJHRlbXByZXN1bHQtPmdldE1hdGNoUG9pbnRzKCk7CgkJCQkkdGVtcGNvbXByZXN1bHQgWydvcHBvbmVudG1wJ10gKz0gJHRlbXByZXN1bHQtPmdldE1hdGNoT3BvaW50cygpOwoJCQkJJHRhYmxlaW5mbyBbJGldIFsnaG9tZWdlcyddID0gJHRlbXByZXN1bHQtPmdldE1hdGNoQ29tcGxldGVHZXMgKCk7CgkJCQkkdGFibGVpbmZvIFskaV0gWydvcHBvbmVudGdlcyddID0gJHRlbXByZXN1bHQtPmdldE1hdGNoQ29tcGxldGVPR2VzICgpOwoJCQkJJHRhYmxlaW5mbyBbJGldIFsnaG9tZXZvbGwnXSA9ICR0ZW1wcmVzdWx0LT5nZXRNYXRjaENvbXBsZXRlVm9sbCAoKTsKCQkJCSR0YWJsZWluZm8gWyRpXSBbJ29wcG9uZW50dm9sbCddID0gJHRlbXByZXN1bHQtPmdldE1hdGNoQ29tcGxldGVPVm9sbCAoKTsKCQkJCSR0YWJsZWluZm8gWyRpXSBbJ2hvbWVhYnInXSA9ICR0ZW1wcmVzdWx0LT5nZXRNYXRjaENvbXBsZXRlQWJyICgpOwoJCQkJJHRhYmxlaW5mbyBbJGldIFsnb3Bwb25lbnRhYnInXSA9ICR0ZW1wcmVzdWx0LT5nZXRNYXRjaENvbXBsZXRlT0FiciAoKTsKCQkJCSR0YWJsZWluZm8gWyRpXSBbJ2hvbWVmZWhsJ10gPSAkdGVtcHJlc3VsdC0+Z2V0TWF0Y2hDb21wbGV0ZUZlaGwgKCk7CgkJCQkkdGFibGVpbmZvIFskaV0gWydvcHBvbmVudGZlaGwnXSA9ICR0ZW1wcmVzdWx0LT5nZXRNYXRjaENvbXBsZXRlT0ZlaGwgKCk7CgkJCQkkdGFibGVpbmZvIFskaV0gWydob21lcG9pbnRzJ10gPSAoaW50KSgkdGVtcHJlc3VsdC0+Z2V0TWF0Y2hQb2ludHMoKS8xMCkuIi4iLihpbnQpKCR0ZW1wcmVzdWx0LT5nZXRNYXRjaFBvaW50cygpJTEwKTsKCQkJCSR0YWJsZWluZm8gWyRpXSBbJ29wcG9uZW50cG9pbnRzJ10gPSAoaW50KSgkdGVtcHJlc3VsdC0+Z2V0TWF0Y2hPcG9pbnRzKCkvMTApLiIuIi4oaW50KSgkdGVtcHJlc3VsdC0+Z2V0TWF0Y2hPcG9pbnRzKCklMTApOwoJCQkJJHRhYmxlaW5mbyBbJGldIFsnaG9tZXNwJ10gPSAoaW50KSgkdGVtcHJlc3VsdC0+Z2V0U2V0UG9pbnRzKCkvMTApLiIuIi4oaW50KSgkdGVtcHJlc3VsdC0+Z2V0U2V0UG9pbnRzKCklMTApOwoJCQkJJHRhYmxlaW5mbyBbJGldIFsnb3Bwb25lbnRzcCddID0gKGludCkoJHRlbXByZXN1bHQtPmdldFNldE9Qb2ludHMoKS8xMCkuIi4iLihpbnQpKCR0ZW1wcmVzdWx0LT5nZXRTZXRPUG9pbnRzKCklMTApOwoJCQkJJHRhYmxlaW5mbyBbJGldIFsnaG9tZW5hbWUxJ10gPSAkdGVtcHJlc3VsdC0+Z2V0UzEoKS0+Z2V0UGxheWVyKCktPmdldE5hbWUoKTsKCQkJCSR0YWJsZWluZm8gWyRpXSBbJ29wcG9uZW50bmFtZTEnXSA9ICR0ZW1wcmVzdWx0LT5nZXRTMSgpLT5nZXRPcHBvbmVudCgpOwoJCQkJJHRhYmxlaW5mbyBbJGldIFsnaG9tZWdlczEnXSA9ICR0ZW1wcmVzdWx0LT5nZXRTMSgpLT5nZXRHZXMoKTsKCQkJCSR0YWJsZWluZm8gWyRpXSBbJ29wcG9uZW50Z2VzMSddID0gJHRlbXByZXN1bHQtPmdldFMxKCktPmdldE9HZXMoKTsKCQkJCSR0YWJsZWluZm8gWyRpXSBbJ2hvbWV2b2xsMSddID0gJHRlbXByZXN1bHQtPmdldFMxKCktPmdldFZvbGwoKTsKCQkJCSR0YWJsZWluZm8gWyRpXSBbJ29wcG9uZW50dm9sbDEnXSA9ICR0ZW1wcmVzdWx0LT5nZXRTMSgpLT5nZXRPVm9sbCgpOwoJCQkJJHRhYmxlaW5mbyBbJGldIFsnaG9tZWFicjEnXSA9ICR0ZW1wcmVzdWx0LT5nZXRTMSgpLT5nZXRBYnIoKTsKCQkJCSR0YWJsZWluZm8gWyRpXSBbJ29wcG9uZW50YWJyMSddID0gJHRlbXByZXN1bHQtPmdldFMxKCktPmdldE9BYnIoKTsKCQkJCSR0YWJsZWluZm8gWyRpXSBbJ2hvbWVmZWhsMSddID0gJHRlbXByZXN1bHQtPmdldFMxKCktPmdldEZlaGwoKTsKCQkJCSR0YWJsZWluZm8gWyRpXSBbJ29wcG9uZW50ZmVobDEnXSA9ICR0ZW1wcmVzdWx0LT5nZXRTMSgpLT5nZXRPRmVobCgpOwoJCQkJJHRhYmxlaW5mbyBbJGldIFsnaG9tZXNwMSddID0gKGludCkoJHRlbXByZXN1bHQtPmdldFMxKCktPmdldFNldFBvaW50cygpLzEwKS4iLiIuKGludCkoJHRlbXByZXN1bHQtPmdldFMxKCktPmdldFNldFBvaW50cygpJTEwKTsKCQkJCSR0YWJsZWluZm8gWyRpXSBbJ29wcG9uZW50c3AxJ10gPSAoaW50KSgkdGVtcHJlc3VsdC0+Z2V0UzEoKS0+Z2V0U2V0T1BvaW50cygpLzEwKS4iLiIuKGludCkoJHRlbXByZXN1bHQtPmdldFMxKCktPmdldFNldE9Qb2ludHMoKSUxMCk7CgkJCQkkdGFibGVpbmZvIFskaV0gWydob21lbmFtZTInXSA9ICR0ZW1wcmVzdWx0LT5nZXRTMigpLT5nZXRQbGF5ZXIoKS0+Z2V0TmFtZSgpOwoJCQkJJHRhYmxlaW5mbyBbJGldIFsnb3Bwb25lbnRuYW1lMiddID0gJHRlbXByZXN1bHQtPmdldFMyKCktPmdldE9wcG9uZW50KCk7CgkJCQkkdGFibGVpbmZvIFskaV0gWydob21lZ2VzMiddID0gJHRlbXByZXN1bHQtPmdldFMyKCktPmdldEdlcygpOwoJCQkJJHRhYmxlaW5mbyBbJGldIFsnb3Bwb25lbnRnZXMyJ10gPSAkdGVtcHJlc3VsdC0+Z2V0UzIoKS0+Z2V0T0dlcygpOwoJCQkJJHRhYmxlaW5mbyBbJGldIFsnaG9tZXZvbGwyJ10gPSAkdGVtcHJlc3VsdC0+Z2V0UzIoKS0+Z2V0Vm9sbCgpOwoJCQkJJHRhYmxlaW5mbyBbJGldIFsnb3Bwb25lbnR2b2xsMiddID0gJHRlbXByZXN1bHQtPmdldFMyKCktPmdldE9Wb2xsKCk7CgkJCQkkdGFibGVpbmZvIFskaV0gWydob21lYWJyMiddID0gJHRlbXByZXN1bHQtPmdldFMyKCktPmdldEFicigpOwoJCQkJJHRhYmxlaW5mbyBbJGldIFsnb3Bwb25lbnRhYnIyJ10gPSAkdGVtcHJlc3VsdC0+Z2V0UzIoKS0+Z2V0T0FicigpOwoJCQkJJHRhYmxlaW5mbyBbJGldIFsnaG9tZWZlaGwyJ10gPSAkdGVtcHJlc3VsdC0+Z2V0UzIoKS0+Z2V0RmVobCgpOwoJCQkJJHRhYmxlaW5mbyBbJGldIFsnb3Bwb25lbnRmZWhsMiddID0gJHRlbXByZXN1bHQtPmdldFMyKCktPmdldE9GZWhsKCk7CgkJCQkkdGFibGVpbmZvIFskaV0gWydob21lc3AyJ10gPSAoaW50KSgkdGVtcHJlc3VsdC0+Z2V0UzIoKS0+Z2V0U2V0UG9pbnRzKCkvMTApLiIuIi4oaW50KSgkdGVtcHJlc3VsdC0+Z2V0UzIoKS0+Z2V0U2V0UG9pbnRzKCklMTApOwoJCQkJJHRhYmxlaW5mbyBbJGldIFsnb3Bwb25lbnRzcDInXSA9IChpbnQpKCR0ZW1wcmVzdWx0LT5nZXRTMigpLT5nZXRTZXRPUG9pbnRzKCkvMTApLiIuIi4oaW50KSgkdGVtcHJlc3VsdC0+Z2V0UzIoKS0+Z2V0U2V0T1BvaW50cygpJTEwKTsKCQkJCSR0YWJsZWluZm8gWyRpXSBbJ2hvbWVuYW1lMyddID0gJHRlbXByZXN1bHQtPmdldFMzKCktPmdldFBsYXllcigpLT5nZXROYW1lKCk7CgkJCQkkdGFibGVpbmZvIFskaV0gWydvcHBvbmVudG5hbWUzJ10gPSAkdGVtcHJlc3VsdC0+Z2V0UzMoKS0+Z2V0T3Bwb25lbnQoKTsKCQkJCSR0YWJsZWluZm8gWyRpXSBbJ2hvbWVnZXMzJ10gPSAkdGVtcHJlc3VsdC0+Z2V0UzMoKS0+Z2V0R2VzKCk7CgkJCQkkdGFibGVpbmZvIFskaV0gWydvcHBvbmVudGdlczMnXSA9ICR0ZW1wcmVzdWx0LT5nZXRTMygpLT5nZXRPR2VzKCk7CgkJCQkkdGFibGVpbmZvIFskaV0gWydob21ldm9sbDMnXSA9ICR0ZW1wcmVzdWx0LT5nZXRTMygpLT5nZXRWb2xsKCk7CgkJCQkkdGFibGVpbmZvIFskaV0gWydvcHBvbmVudHZvbGwzJ10gPSAkdGVtcHJlc3VsdC0+Z2V0UzMoKS0+Z2V0T1ZvbGwoKTsKCQkJCSR0YWJsZWluZm8gWyRpXSBbJ2hvbWVhYnIzJ10gPSAkdGVtcHJlc3VsdC0+Z2V0UzMoKS0+Z2V0QWJyKCk7CgkJCQkkdGFibGVpbmZvIFskaV0gWydvcHBvbmVudGFicjMnXSA9ICR0ZW1wcmVzdWx0LT5nZXRTMygpLT5nZXRPQWJyKCk7CgkJCQkkdGFibGVpbmZvIFskaV0gWydob21lZmVobDMnXSA9ICR0ZW1wcmVzdWx0LT5nZXRTMygpLT5nZXRGZWhsKCk7CgkJCQkkdGFibGVpbmZvIFskaV0gWydvcHBvbmVudGZlaGwzJ10gPSAkdGVtcHJlc3VsdC0+Z2V0UzMoKS0+Z2V0T0ZlaGwoKTsKCQkJCSR0YWJsZWluZm8gWyRpXSBbJ2hvbWVzcDMnXSA9IChpbnQpKCR0ZW1wcmVzdWx0LT5nZXRTMygpLT5nZXRTZXRQb2ludHMoKS8xMCkuIi4iLihpbnQpKCR0ZW1wcmVzdWx0LT5nZXRTMygpLT5nZXRTZXRQb2ludHMoKSUxMCk7CgkJCQkkdGFibGVpbmZvIFskaV0gWydvcHBvbmVudHNwMyddID0gKGludCkoJHRlbXByZXN1bHQtPmdldFMzKCktPmdldFNldE9Qb2ludHMoKS8xMCkuIi4iLihpbnQpKCR0ZW1wcmVzdWx0LT5nZXRTMygpLT5nZXRTZXRPUG9pbnRzKCklMTApOwoJCQkJJHRhYmxlaW5mbyBbJGldIFsnaG9tZW5hbWU0J10gPSAkdGVtcHJlc3VsdC0+Z2V0UzQoKS0+Z2V0UGxheWVyKCktPmdldE5hbWUoKTsKCQkJCSR0YWJsZWluZm8gWyRpXSBbJ29wcG9uZW50bmFtZTQnXSA9ICR0ZW1wcmVzdWx0LT5nZXRTNCgpLT5nZXRPcHBvbmVudCgpOwoJCQkJJHRhYmxlaW5mbyBbJGldIFsnaG9tZWdlczQnXSA9ICR0ZW1wcmVzdWx0LT5nZXRTNCgpLT5nZXRHZXMoKTsKCQkJCSR0YWJsZWluZm8gWyRpXSBbJ29wcG9uZW50Z2VzNCddID0gJHRlbXByZXN1bHQtPmdldFM0KCktPmdldE9HZXMoKTsKCQkJCSR0YWJsZWluZm8gWyRpXSBbJ2hvbWV2b2xsNCddID0gJHRlbXByZXN1bHQtPmdldFM0KCktPmdldFZvbGwoKTsKCQkJCSR0YWJsZWluZm8gWyRpXSBbJ29wcG9uZW50dm9sbDQnXSA9ICR0ZW1wcmVzdWx0LT5nZXRTNCgpLT5nZXRPVm9sbCgpOwoJCQkJJHRhYmxlaW5mbyBbJGldIFsnaG9tZWFicjQnXSA9ICR0ZW1wcmVzdWx0LT5nZXRTNCgpLT5nZXRBYnIoKTsKCQkJCSR0YWJsZWluZm8gWyRpXSBbJ29wcG9uZW50YWJyNCddID0gJHRlbXByZXN1bHQtPmdldFM0KCktPmdldE9BYnIoKTsKCQkJCSR0YWJsZWluZm8gWyRpXSBbJ2hvbWVmZWhsNCddID0gJHRlbXByZXN1bHQtPmdldFM0KCktPmdldEZlaGwoKTsKCQkJCSR0YWJsZWluZm8gWyRpXSBbJ29wcG9uZW50ZmVobDQnXSA9ICR0ZW1wcmVzdWx0LT5nZXRTNCgpLT5nZXRPRmVobCgpOwoJCQkJJHRhYmxlaW5mbyBbJGldIFsnaG9tZXNwNCddID0gKGludCkoJHRlbXByZXN1bHQtPmdldFM0KCktPmdldFNldFBvaW50cygpLzEwKS4iLiIuKGludCkoJHRlbXByZXN1bHQtPmdldFM0KCktPmdldFNldFBvaW50cygpJTEwKTsKCQkJCSR0YWJsZWluZm8gWyRpXSBbJ29wcG9uZW50c3A0J10gPSAoaW50KSgkdGVtcHJlc3VsdC0+Z2V0UzQoKS0+Z2V0U2V0T1BvaW50cygpLzEwKS4iLiIuKGludCkoJHRlbXByZXN1bHQtPmdldFM0KCktPmdldFNldE9Qb2ludHMoKSUxMCk7CgkJCQkkaSArPSAxOwoJCQl9CgkJCWlmICgkdGVtcGNvbXByZXN1bHRbJ2hvbWVnZXMnXSA+ICR0ZW1wY29tcHJlc3VsdFsnb3Bwb25lbnRnZXMnXSkgewoJCQkJJHRlbXBjb21wcmVzdWx0Wydob21lbXAnXSArPSAyMDsKCQkJfSBlbHNlaWYgKCR0ZW1wY29tcHJlc3VsdFsnaG9tZWdlcyddIDwgJHRlbXBjb21wcmVzdWx0WydvcHBvbmVudGdlcyddKSB7CgkJCQkkdGVtcGNvbXByZXN1bHRbJ29wcG9uZW50bXAnXSArPSAyMDsKCQkJfSBlbHNlIHsKCQkJCSR0ZW1wY29tcHJlc3VsdFsnaG9tZW1wJ10gKz0gMTA7CgkJCQkkdGVtcGNvbXByZXN1bHRbJ29wcG9uZW50bXAnXSArPSAxMDsKCQkJfQoJCQkkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCAnR2FtZU91clRlYW0nLCAkdGVtcGdhbWUtPmdldE91clRlYW0gKCktPmdldE5hbWUgKCkgKTsKCQkJJHRoaXMtPnNtYXJ0eS0+YXNzaWduICggJ0dhbWVPcHBvbmVudCcsICR0ZW1wZ2FtZS0+Z2V0T3Bwb25lbnQgKCkgKTsKCQkJJHRoaXMtPnNtYXJ0eS0+YXNzaWduICggJ0dhbWVEYXRlJywgJHRlbXBnYW1lLT5nZXREYXRlICgpLT5mb3JtYXQgKCAiZC5tLlkiICkgKTsKCQkJJHRoaXMtPnNtYXJ0eS0+YXNzaWduICggJ0dhbWVUaW1lJywgJHRlbXBnYW1lLT5nZXREYXRlICgpLT5mb3JtYXQgKCAiSDppIiApICk7CgkJCSR0aGlzLT5zbWFydHktPmFzc2lnbiAoICdHYW1lSG9tZScsICR0ZW1wZ2FtZS0+Z2V0SG9tZSAoKSApOwoJCQkkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCAnT3VyU2NvcmVHZXMnLCAkdGVtcGNvbXByZXN1bHQgWydob21lZ2VzJ10gKTsKCQkJJHRoaXMtPnNtYXJ0eS0+YXNzaWduICggJ09wcG9uZW50U2NvcmVHZXMnLCAkdGVtcGNvbXByZXN1bHQgWydvcHBvbmVudGdlcyddICk7CgkJCSR0aGlzLT5zbWFydHktPmFzc2lnbiAoICdPdXJTY29yZUFicicsICR0ZW1wY29tcHJlc3VsdCBbJ2hvbWVhYnInXSApOwoJCQkkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCAnT3Bwb25lbnRTY29yZUFicicsICR0ZW1wY29tcHJlc3VsdCBbJ29wcG9uZW50YWJyJ10gKTsKCQkJJHRoaXMtPnNtYXJ0eS0+YXNzaWduICggJ091clNjb3JlVm9sbCcsICR0ZW1wY29tcHJlc3VsdCBbJ2hvbWV2b2xsJ10gKTsKCQkJJHRoaXMtPnNtYXJ0eS0+YXNzaWduICggJ09wcG9uZW50U2NvcmVWb2xsJywgJHRlbXBjb21wcmVzdWx0IFsnb3Bwb25lbnR2b2xsJ10gKTsKCQkJJHRoaXMtPnNtYXJ0eS0+YXNzaWduICggJ091clNjb3JlRmVobCcsICR0ZW1wY29tcHJlc3VsdCBbJ2hvbWVmZWhsJ10gKTsKCQkJJHRoaXMtPnNtYXJ0eS0+YXNzaWduICggJ09wcG9uZW50U2NvcmVGZWhsJywgJHRlbXBjb21wcmVzdWx0IFsnb3Bwb25lbnRmZWhsJ10gKTsKCQkJJHRoaXMtPnNtYXJ0eS0+YXNzaWduICggJ091clNjb3JlU1AnLCAoaW50KSgkdGVtcGNvbXByZXN1bHRbJ2hvbWVzcCddLzEwKS4iLiIuKGludCkoJHRlbXBjb21wcmVzdWx0Wydob21lc3AnXSUxMCkgKTsKCQkJJHRoaXMtPnNtYXJ0eS0+YXNzaWduICggJ09wcG9uZW50U2NvcmVTUCcsIChpbnQpKCR0ZW1wY29tcHJlc3VsdFsnb3Bwb25lbnRzcCddLzEwKS4iLiIuKGludCkoJHRlbXBjb21wcmVzdWx0WydvcHBvbmVudHNwJ10lMTApICk7CgkJCSR0aGlzLT5zbWFydHktPmFzc2lnbiAoICdPdXJTY29yZU1QJywgKGludCkoJHRlbXBjb21wcmVzdWx0Wydob21lbXAnXS8xMCkuIi4iLihpbnQpKCR0ZW1wY29tcHJlc3VsdFsnaG9tZW1wJ10lMTApICk7CgkJCSR0aGlzLT5zbWFydHktPmFzc2lnbiAoICdPcHBvbmVudFNjb3JlTVAnLCAoaW50KSgkdGVtcGNvbXByZXN1bHRbJ29wcG9uZW50bXAnXS8xMCkuIi4iLihpbnQpKCR0ZW1wY29tcHJlc3VsdFsnb3Bwb25lbnRtcCddJTEwKSApOwoJCQkkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCAnU2Fpc29uJywgJHNhaXNvbi0+Z2V0TmFtZSAoKSApOwoJCQkkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCAnVGVhbScsICR0ZWFtLT5nZXROYW1lICgpICk7CgkJCSR0aGlzLT5zbWFydHktPmFzc2lnbiAoICdSZXN1bHRzJywgJHRhYmxlaW5mbyApOwoJCQkkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCAnVGFnTmFtZScsICR0aGlzLT5MYW5nICggJ1NCTmFtZScgKSApOwoJCQkkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCAnVGFnVm9sbCcsICR0aGlzLT5MYW5nICggJ1NCVm9sbCcgKSApOwoJCQkkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCAnVGFnQWJyJywgJHRoaXMtPkxhbmcgKCAnU0JBYnInICkgKTsKCQkJJHRoaXMtPnNtYXJ0eS0+YXNzaWduICggJ1RhZ0ZlaGwnLCAkdGhpcy0+TGFuZyAoICdTQkZlaGwnICkgKTsKCQkJJHRoaXMtPnNtYXJ0eS0+YXNzaWduICggJ1RhZ0dlcycsICR0aGlzLT5MYW5nICggJ1NCR2VzJyApICk7CgkJCSR0aGlzLT5zbWFydHktPmFzc2lnbiAoICdUYWdTUCcsICR0aGlzLT5MYW5nICggJ1NQJyApICk7CgkJCSR0aGlzLT5zbWFydHktPmFzc2lnbiAoICdUYWdNUCcsICR0aGlzLT5MYW5nICggJ01QJyApICk7CgkJCWVjaG8gJHRoaXMtPlByb2Nlc3NUZW1wbGF0ZSAoICdzaG93MTIwZ2FtZS50cGwnICk7CgkJCQoJCX0KCX0gZWxzZSB7CgkJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCd0aXRsZV9lcnJvcicsICR0aGlzLT5MYW5nKCdlcnJvcnRhZycpKTsKCQkkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ21lc3NhZ2UnLCAkdGhpcy0+TGFuZygnZXJyb3JfbnVtYmVyJykuJHBhcmFtc1snbnVtYmVyJ10pOwoJCWVjaG8gJHRoaXMtPlByb2Nlc3NUZW1wbGF0ZSgnZXJyb3IudHBsJyk7Cgl9Cn0gZWxzZSB7CgkkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3RpdGxlX2Vycm9yJywgJHRoaXMtPkxhbmcoJ2Vycm9ydGFnJykpOwoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdtZXNzYWdlJywgJHRoaXMtPkxhbmcoJ2Vycm9yX3RlYW0nKS4nPGJyLz4nLiRwYXJhbXNbJ3RlYW0nXS4kdGhpcy0+TGFuZygnZXJyb3Jfc2Fpc29uJykuJHBhcmFtc1snc2Fpc29uJ10pOwoJZWNobyAkdGhpcy0+UHJvY2Vzc1RlbXBsYXRlKCdlcnJvci50cGwnKTsKfQoKPz4=]]></data>
	</file>
	<file>
	  <filename>/action.showlatestresults.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKaWYgKCFpc3NldCgkZ0NtcykpIGV4aXQ7CgovKiAtPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LQoKICAgQ29kZSBmb3Iga2VnZWxlcmdlYm5pc3NlICJzaG93bGF0ZXN0cmVzdWx0cyIgYWN0aW9uCgogICAtPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LQogICAKICAgVHlwaWNhbGx5LCB0aGlzIHdpbGwgZGlzcGxheSBzb21ldGhpbmcgZnJvbSBhIHRlbXBsYXRlCiAgIG9yIGRvIHNvbWUgb3RoZXIgdGFzay4KICAgCiovCgovKiBjaGVjayBmb3IgZXhpc3RpbmcgdGVhbSBpbiBkYXRhYmFzZSAqLwppZiAoaXNzZXQoJHBhcmFtc1sndGVhbSddKSkgewoJJHRlYW1zID0gRGF0YWJhc2VPcGVyYXRpb25zOjpnZXRBbGxUZWFtcygpOwoJZm9yZWFjaCAoJHRlYW1zIGFzICR0ZW1wdGVhbSkgewoJCWlmICgkdGVtcHRlYW0tPmdldE5hbWUoKSA9PSAkcGFyYW1zWyd0ZWFtJ10pIHsKCQkJJHRlYW0gPSAkdGVtcHRlYW07CgkJfQoJfQp9IGVsc2UgewoJJHRlYW0gPSBOVUxMOwp9CgovKiBjaGVjayBpZiBwYXJhbWV0ZXIgZGF5cyBpcyBnaXZlbiBjb3JyZWN0bHkgKi8KaWYgKGlzc2V0KCRwYXJhbXNbJ2RheXMnXSkpIHsKCSRkYXlzID0gJHBhcmFtc1snZGF5cyddOwp9IGVsc2UgewoJJGRheXMgPSAwOwp9CgovKiBhbGxlIFNwaWVsZSBob2xlbiB1bmQgRXJnZWJuaXNzZSBiZXJlY2huZW4gKi8KJGdhbWVzID0gRGF0YWJhc2VPcGVyYXRpb25zOjpnZXRUaW1lVGFibGVUaW1lZGlmZigkZGF5cywgJHRlYW0pOwokdGFibGVpbmZvID0gYXJyYXkoKTsKJGkgPSAwOwpmb3JlYWNoICgkZ2FtZXMgYXMgJHRlbXBnYW1lKSB7CgkkdGVtcGNvbXByZXN1bHQgWydob21lJ10gPSAwOwoJJHRlbXBjb21wcmVzdWx0IFsnb3Bwb25lbnQnXSA9IDA7CgkkdGVtcGNvbXByZXN1bHQgWydob21lcG9pbnRzJ10gPSAwOwoJJHRlbXBjb21wcmVzdWx0IFsnb3Bwb25lbnRwb2ludHMnXSA9IDA7CglpZiAoJHRlbXBnYW1lLT5pczEyMCgpID09IGZhbHNlKSB7CgkJJHRlbXByZXN1bHRzID0gRGF0YWJhc2VPcGVyYXRpb25zOjpnZXRSZXN1bHRPZkdhbWUgKCAkdGVtcGdhbWUgKTsKCQlmb3JlYWNoICggJHRlbXByZXN1bHRzIGFzICR0ZW1wcmVzdWx0ICkgewoJCQkkdGVtcGNvbXByZXN1bHQgWydob21lJ10gKz0gJHRlbXByZXN1bHQtPmdldEdlcyAoKTsKCQkJJHRlbXBjb21wcmVzdWx0IFsnb3Bwb25lbnQnXSArPSAkdGVtcHJlc3VsdC0+Z2V0T0dlcyAoKTsKCQl9Cgl9IGVsc2UgewoJCSR0ZW1wcmVzdWx0cyA9IERhdGFiYXNlT3BlcmF0aW9uczo6Z2V0TWF0Y2gxMjBPZkdhbWUoICR0ZW1wZ2FtZSApOwoJCWZvcmVhY2ggKCAkdGVtcHJlc3VsdHMgYXMgJHRlbXByZXN1bHQgKSB7CgkJCSR0ZW1wY29tcHJlc3VsdCBbJ2hvbWUnXSArPSAkdGVtcHJlc3VsdC0+Z2V0TWF0Y2hDb21wbGV0ZUdlcygpOwoJCQkkdGVtcGNvbXByZXN1bHQgWydvcHBvbmVudCddICs9ICR0ZW1wcmVzdWx0LT5nZXRNYXRjaENvbXBsZXRlT0dlcygpOwoJCQkkdGVtcGNvbXByZXN1bHQgWydob21lcG9pbnRzJ10gKz0gJHRlbXByZXN1bHQtPmdldE1hdGNoUG9pbnRzKCk7CgkJCSR0ZW1wY29tcHJlc3VsdCBbJ29wcG9uZW50cG9pbnRzJ10gKz0gJHRlbXByZXN1bHQtPmdldE1hdGNoT3BvaW50cygpOwoJCX0KCQlpZiAoJHRlbXBjb21wcmVzdWx0IFsnaG9tZSddID4gJHRlbXBjb21wcmVzdWx0IFsnb3Bwb25lbnQnXSkgewoJCQkkdGVtcGNvbXByZXN1bHQgWydob21lcG9pbnRzJ10gKz0gMjA7CgkJfSBlbHNlaWYgKCR0ZW1wY29tcHJlc3VsdCBbJ2hvbWUnXSA8ICR0ZW1wY29tcHJlc3VsdCBbJ29wcG9uZW50J10pIHsKCQkJJHRlbXBjb21wcmVzdWx0IFsnb3Bwb25lbnRwb2ludHMnXSArPSAyMDsKCQl9IGVsc2UgewoJCQkkdGVtcGNvbXByZXN1bHQgWydob21lcG9pbnRzJ10gKz0gMTA7CgkJCSR0ZW1wY29tcHJlc3VsdCBbJ29wcG9uZW50cG9pbnRzJ10gKz0gMTA7CQkJCgkJfQoJCSR0ZW1wY29tcHJlc3VsdFsnaG9tZXBvaW50cyddID0gKGludCkoJHRlbXBjb21wcmVzdWx0Wydob21lcG9pbnRzJ10vMTApLiIuIi4oaW50KSgkdGVtcGNvbXByZXN1bHRbJ2hvbWVwb2ludHMnXSUxMCk7CgkJJHRlbXBjb21wcmVzdWx0WydvcHBvbmVudHBvaW50cyddID0gKGludCkoJHRlbXBjb21wcmVzdWx0WydvcHBvbmVudHBvaW50cyddLzEwKS4iLiIuKGludCkoJHRlbXBjb21wcmVzdWx0WydvcHBvbmVudHBvaW50cyddJTEwKTsKCX0KCSR0YWJsZWluZm9bJGldWydPdXJTY29yZSddID0gJHRlbXBjb21wcmVzdWx0Wydob21lJ107CgkkdGFibGVpbmZvWyRpXVsnT3Bwb25lbnRTY29yZSddID0gJHRlbXBjb21wcmVzdWx0WydvcHBvbmVudCddOwoJJHRhYmxlaW5mb1skaV1bJ091clBvaW50cyddID0gJHRlbXBjb21wcmVzdWx0Wydob21lcG9pbnRzJ107CgkkdGFibGVpbmZvWyRpXVsnT3Bwb25lbnRQb2ludHMnXSA9ICR0ZW1wY29tcHJlc3VsdFsnb3Bwb25lbnRwb2ludHMnXTsKCSR0YWJsZWluZm9bJGldWydHYW1lT3VyVGVhbSddID0gJHRlbXBnYW1lLT5nZXRPdXJUZWFtKCktPmdldE5hbWUoKTsKCSR0YWJsZWluZm9bJGldWydHYW1lT3Bwb25lbnQnXSA9ICR0ZW1wZ2FtZS0+Z2V0T3Bwb25lbnQoKTsKCSR0YWJsZWluZm9bJGldWydHYW1lRGF0ZSddID0gJHRlbXBnYW1lLT5nZXREYXRlKCktPmZvcm1hdCgiZC5tLlkiKTsKCSR0YWJsZWluZm9bJGldWydHYW1lVGltZSddID0gJHRlbXBnYW1lLT5nZXREYXRlKCktPmZvcm1hdCgiSDppIik7CgkkdGFibGVpbmZvWyRpXVsnR2FtZUhvbWUnXSA9ICR0ZW1wZ2FtZS0+Z2V0SG9tZSgpOwoJJHRhYmxlaW5mb1skaV1bJ0dhbWUxMjAnXSA9ICR0ZW1wZ2FtZS0+aXMxMjAoKTsKCSRpICs9IDE7Cn0KaWYgKCR0ZWFtID09IE5VTEwpIHsKCSR0aGlzLT5zbWFydHktPmFzc2lnbignVGVhbScsICR0aGlzLT5MYW5nKCdhbGx0ZWFtcycpKTsKfSBlbHNlIHsKCSR0aGlzLT5zbWFydHktPmFzc2lnbignVGVhbScsICR0ZWFtLT5nZXROYW1lKCkpOwp9CiR0aGlzLT5zbWFydHktPmFzc2lnbignTnVtYmVyT2ZHYW1lcycsICRpKTsKJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdSZXN1bHRzJywgJHRhYmxlaW5mbyk7CiR0aGlzLT5zbWFydHktPmFzc2lnbignVGFnRGF0ZScsICR0aGlzLT5MYW5nKCdkYXRlJykpOwokdGhpcy0+c21hcnR5LT5hc3NpZ24oJ1RhZ1RpbWUnLCAkdGhpcy0+TGFuZygndGltZScpKTsKJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdUYWdIb21lJywgJHRoaXMtPkxhbmcoJ2hvbWUnKSk7CiR0aGlzLT5zbWFydHktPmFzc2lnbignVGFnR3Vlc3QnLCAkdGhpcy0+TGFuZygnZ3Vlc3QnKSk7CiR0aGlzLT5zbWFydHktPmFzc2lnbignVGFnUmVzdWx0JywgJHRoaXMtPkxhbmcoJ3Jlc3VsdCcpKTsKJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdTaG93TGlua1RvR2FtZVRhZycsICR0aGlzLT5MYW5nKCdkaXNwbGF5JykpOwokdGhpcy0+c21hcnR5LT5hc3NpZ24oJ1Nob3dMaW5rVG9HYW1lJywgJHBhcmFtc1snc2hvd2xpbmsnXSk7CiR0aGlzLT5zbWFydHktPmFzc2lnbignTm9SZXN1bHQnLCAkdGhpcy0+TGFuZygnbm9yZXN1bHQnKSk7CiR0aGlzLT5zbWFydHktPmFzc2lnbignTm9HYW1lcycsICR0aGlzLT5MYW5nKCdub2dhbWVzJykpOwplY2hvICR0aGlzLT5Qcm9jZXNzVGVtcGxhdGUoJ3Nob3dsYXRlc3RyZXN1bHRzLnRwbCcpOwoKPz4=]]></data>
	</file>
	<file>
	  <filename>/action.showplayerresults.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKaWYgKCFpc3NldCgkZ0NtcykpIGV4aXQ7CgovKiAtPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LQoKICAgQ29kZSBmb3Iga2VnZWxlcmdlYm5pc3NlICJzaG93Z2FtZSIgYWN0aW9uCgogICAtPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LQogICAKICAgVHlwaWNhbGx5LCB0aGlzIHdpbGwgZGlzcGxheSBzb21ldGhpbmcgZnJvbSBhIHRlbXBsYXRlCiAgIG9yIGRvIHNvbWUgb3RoZXIgdGFzay4KICAgCiovCgovKiBzZWFyY2ggZm9yIHRlYW0gaW5zaWRlIHRoZSBkYXRhYmFzZSAqLwokdGVhbXMgPSBEYXRhYmFzZU9wZXJhdGlvbnM6OmdldEFsbFRlYW1zKCk7CiR0ZWFtID0gTlVMTDsKZm9yZWFjaCAoJHRlYW1zIGFzICR0ZW1wdGVhbSkgewoJaWYgKCR0ZW1wdGVhbS0+Z2V0TmFtZSgpID09ICRwYXJhbXNbJ3RlYW0nXSkgewoJCSR0ZWFtID0gJHRlbXB0ZWFtOwoJfQp9CgovKiBzZWFyY2ggZm9yIHNhaXNvbiBpbnNpZGUgdGhlIGRhdGFiYXNlICovCiRzYWlzb25zID0gRGF0YWJhc2VPcGVyYXRpb25zOjpnZXRBbGxTYWlzb25zKCk7CiRzYWlzb24gPSBOVUxMOwpmb3JlYWNoICgkc2Fpc29ucyBhcyAkdGVtcHNhaXNvbikgewoJaWYgKCR0ZW1wc2Fpc29uLT5nZXROYW1lKCkgPT0gJHBhcmFtc1snc2Fpc29uJ10pIHsKCQkkc2Fpc29uID0gJHRlbXBzYWlzb247Cgl9Cn0KCi8qIFNwaWVsZXIgc3VjaGVuICovCiRwbGF5ZXJzID0gRGF0YWJhc2VPcGVyYXRpb25zOjpnZXRBbGxQbGF5ZXJzKCk7CmlmIChpc19udW1lcmljKCRwYXJhbXNbJ3BsYXllciddKSkgewoJZm9yZWFjaCAoJHBsYXllcnMgYXMgJHRlbXBwbGF5ZXIpIHsKCQlpZiAoJHBhcmFtc1sncGxheWVyJ10gPT0gJHRlbXBwbGF5ZXItPmdldElkKCkpIHsKCQkJJHBsYXllciA9ICR0ZW1wcGxheWVyOwoJCX0KCX0KfSBlbHNlIHsKCWZvcmVhY2ggKCRwbGF5ZXJzIGFzICR0ZW1wcGxheWVyKSB7CgkJaWYgKCRwYXJhbXNbJ3BsYXllciddID09ICR0ZW1wcGxheWVyLT5nZXROYW1lKCkpIHsKCQkJJHBsYXllciA9ICR0ZW1wcGxheWVyOwoJCX0KCX0KfQoKaWYgKGlzc2V0KCRwbGF5ZXIpKSB7CgkvKiBhbGxlIEVpbnplbHJlc3VsdGF0ZSBkZXMgU3BpZWxlcnMgYmVzb3JnZW4gKi8KCSRyZXN1bHRzID0gRGF0YWJhc2VPcGVyYXRpb25zOjpnZXRQbGF5ZXJSZXN1bHRzKCRwbGF5ZXIsICR0ZWFtLCAkc2Fpc29uKTsKCSRpID0gMDsKCSR0ZW1wbGlzdCA9IGFycmF5KCJoZWltIiwgImF1c3ciLCAiZ2VzIik7Cglmb3JlYWNoICgkdGVtcGxpc3QgYXMgJHRlbXBpdGVtKSB7CgkJJHNjaG5pdHRbJHRlbXBpdGVtXVsiY291bnQiXSA9IDA7CgkJJHNjaG5pdHRbJHRlbXBpdGVtXVsiZ2VzIl0gPSAwOwoJCSRzY2huaXR0WyR0ZW1waXRlbV1bInZvbGwiXSA9IDA7CgkJJHNjaG5pdHRbJHRlbXBpdGVtXVsiYWJyIl0gPSAwOwoJCSRzY2huaXR0WyR0ZW1waXRlbV1bImZlaGwiXSA9IDA7CgkJJHNjaG5pdHRbJHRlbXBpdGVtXVsib2NvdW50Il0gPSAwOwoJCSRzY2huaXR0WyR0ZW1waXRlbV1bIm9nZXMiXSA9IDA7CgkJJHNjaG5pdHRbJHRlbXBpdGVtXVsib3ZvbGwiXSA9IDA7CgkJJHNjaG5pdHRbJHRlbXBpdGVtXVsib2FiciJdID0gMDsKCQkkc2Nobml0dFskdGVtcGl0ZW1dWyJvZmVobCJdID0gMDsKCX0KCWZvcmVhY2goJHJlc3VsdHMgYXMgJHJlc3VsdCkgewoJCS8qIEluZm9ybWF0aW9uZW4gZsO8ciBkaWUgQXVzZ2FiZSBlcnN0ZWxsZW4gKi8KCQkkdGFibGVpbmZvWyRpXVsiT3Bwb25lbnRUZWFtIl0gPSAkcmVzdWx0LT5nZXRHYW1lKCktPmdldE9wcG9uZW50KCk7CgkJJHRhYmxlaW5mb1skaV1bIk91clRlYW0iXSA9ICRyZXN1bHQtPmdldEdhbWUoKS0+Z2V0T3VyVGVhbSgpLT5nZXROYW1lKCk7CgkJJHRhYmxlaW5mb1skaV1bIkhvbWUiXSA9ICRyZXN1bHQtPmdldEdhbWUoKS0+Z2V0SG9tZSgpOwoJCSR0YWJsZWluZm9bJGldWyJEYXRlIl0gPSAkcmVzdWx0LT5nZXRHYW1lKCktPmdldERhdGUoKS0+Zm9ybWF0KCJkLm0uWSIpOwoJCSR0YWJsZWluZm9bJGldWyJPcHBvbmVudFBsYXllciJdID0gJHJlc3VsdC0+Z2V0T3Bwb25lbnQoKTsKCQkkdGFibGVpbmZvWyRpXVsiR2VzIl0gPSAkcmVzdWx0LT5nZXRHZXMoKTsKCQkkdGFibGVpbmZvWyRpXVsiQWJyIl0gPSAkcmVzdWx0LT5nZXRBYnIoKTsKCQkkdGFibGVpbmZvWyRpXVsiVm9sbCJdID0gJHJlc3VsdC0+Z2V0Vm9sbCgpOwoJCSR0YWJsZWluZm9bJGldWyJGZWhsIl0gPSAkcmVzdWx0LT5nZXRGZWhsKCk7CgkJJHRhYmxlaW5mb1skaV1bIlNjaG5pdHQiXSA9ICRyZXN1bHQtPmdldENvdW50KCk7CgkJJHRhYmxlaW5mb1skaV1bIk9HZXMiXSA9ICRyZXN1bHQtPmdldE9HZXMoKTsKCQkkdGFibGVpbmZvWyRpXVsiT0FiciJdID0gJHJlc3VsdC0+Z2V0T0FicigpOwoJCSR0YWJsZWluZm9bJGldWyJPVm9sbCJdID0gJHJlc3VsdC0+Z2V0T1ZvbGwoKTsKCQkkdGFibGVpbmZvWyRpXVsiT0ZlaGwiXSA9ICRyZXN1bHQtPmdldE9GZWhsKCk7CgkJJHRhYmxlaW5mb1skaV1bIk9TY2huaXR0Il0gPSAkcmVzdWx0LT5nZXRPQ291bnQoKTsKCQkkaSA9ICRpICsgMTsKCQkJCgkJLyogU2Nobml0dGJlcmVjaG51bmcgKi8KCQlpZiAoJHJlc3VsdC0+Z2V0R2FtZSgpLT5nZXRIb21lKCkgIT0gZmFsc2UpIHsKCQkJJHRlbXBpdGVtID0gImhlaW0iOwoJCX0gZWxzZSB7CgkJCSR0ZW1waXRlbSA9ICJhdXN3IjsKCQl9CgkJCgkJaWYgKCRyZXN1bHQtPmdldENvdW50KCkgIT0gZmFsc2UpIHsKCQkJJHNjaG5pdHRbJHRlbXBpdGVtXVsiY291bnQiXSArPSAxOwoJCQkkc2Nobml0dFskdGVtcGl0ZW1dWyJnZXMiXSArPSAkcmVzdWx0LT5nZXRHZXMoKTsKCQkJJHNjaG5pdHRbJHRlbXBpdGVtXVsidm9sbCJdICs9ICRyZXN1bHQtPmdldFZvbGwoKTsKCQkJJHNjaG5pdHRbJHRlbXBpdGVtXVsiYWJyIl0gKz0gJHJlc3VsdC0+Z2V0QWJyKCk7CgkJCSRzY2huaXR0WyR0ZW1waXRlbV1bImZlaGwiXSArPSAkcmVzdWx0LT5nZXRGZWhsKCk7CgkJCSRzY2huaXR0WyJnZXMiXVsiY291bnQiXSArPSAxOwoJCQkkc2Nobml0dFsiZ2VzIl1bImdlcyJdICs9ICRyZXN1bHQtPmdldEdlcygpOwoJCQkkc2Nobml0dFsiZ2VzIl1bInZvbGwiXSArPSAkcmVzdWx0LT5nZXRWb2xsKCk7CgkJCSRzY2huaXR0WyJnZXMiXVsiYWJyIl0gKz0gJHJlc3VsdC0+Z2V0QWJyKCk7CgkJCSRzY2huaXR0WyJnZXMiXVsiZmVobCJdICs9ICRyZXN1bHQtPmdldEZlaGwoKTsKCQl9CgkJaWYgKCRyZXN1bHQtPmdldE9Db3VudCgpICE9IGZhbHNlKSB7CgkJCSRzY2huaXR0WyR0ZW1waXRlbV1bIm9jb3VudCJdICs9IDE7CgkJCSRzY2huaXR0WyR0ZW1waXRlbV1bIm9nZXMiXSArPSAkcmVzdWx0LT5nZXRPR2VzKCk7CgkJCSRzY2huaXR0WyR0ZW1waXRlbV1bIm92b2xsIl0gKz0gJHJlc3VsdC0+Z2V0T1ZvbGwoKTsKCQkJJHNjaG5pdHRbJHRlbXBpdGVtXVsib2FiciJdICs9ICRyZXN1bHQtPmdldE9BYnIoKTsKCQkJJHNjaG5pdHRbJHRlbXBpdGVtXVsib2ZlaGwiXSArPSAkcmVzdWx0LT5nZXRPRmVobCgpOwoJCQkkc2Nobml0dFsiZ2VzIl1bIm9jb3VudCJdICs9IDE7CgkJCSRzY2huaXR0WyJnZXMiXVsib2dlcyJdICs9ICRyZXN1bHQtPmdldE9HZXMoKTsKCQkJJHNjaG5pdHRbImdlcyJdWyJvdm9sbCJdICs9ICRyZXN1bHQtPmdldE9Wb2xsKCk7CgkJCSRzY2huaXR0WyJnZXMiXVsib2FiciJdICs9ICRyZXN1bHQtPmdldE9BYnIoKTsKCQkJJHNjaG5pdHRbImdlcyJdWyJvZmVobCJdICs9ICRyZXN1bHQtPmdldE9GZWhsKCk7CgkJfQoJfQoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCJIZWFkZXJEYXRlIiwgJHRoaXMtPkxhbmcoJ2RhdGUnKSk7CgkkdGhpcy0+c21hcnR5LT5hc3NpZ24oIkhlYWRlck9wcG9uZW50VGVhbSIsICR0aGlzLT5MYW5nKCdhd2F5dGVhbScpKTsKCSR0aGlzLT5zbWFydHktPmFzc2lnbigiSGVhZGVyT3Bwb25lbnQiLCAkdGhpcy0+TGFuZygnb3Bwb25lbnQnKSk7CgkkdGhpcy0+c21hcnR5LT5hc3NpZ24oIkhlYWRlck5hbWUiLCAkdGhpcy0+TGFuZygncGxheWVybmFtZV9oZWFkZXInKSk7CgkkdGhpcy0+c21hcnR5LT5hc3NpZ24oIkhlYWRlckdhbWUiLCAkdGhpcy0+TGFuZygnZ2FtZScpKTsKCSR0aGlzLT5zbWFydHktPmFzc2lnbigiSGVhZGVyR2FtZXMiLCAkdGhpcy0+TGFuZygnZ2FtZXMnKSk7CgkkdGhpcy0+c21hcnR5LT5hc3NpZ24oIkhlYWRlclBsYXllciIsICRwbGF5ZXItPmdldE5hbWUoKSk7CgkkdGhpcy0+c21hcnR5LT5hc3NpZ24oIkhlYWRlckdlcyIsICR0aGlzLT5MYW5nKCdTQkdlcycpKTsKCSR0aGlzLT5zbWFydHktPmFzc2lnbigiSGVhZGVyVm9sbCIsICR0aGlzLT5MYW5nKCdTQlZvbGwnKSk7CgkkdGhpcy0+c21hcnR5LT5hc3NpZ24oIkhlYWRlckFiciIsICR0aGlzLT5MYW5nKCdTQkFicicpKTsKCSR0aGlzLT5zbWFydHktPmFzc2lnbigiSGVhZGVyRmVobCIsICR0aGlzLT5MYW5nKCdTQkZlaGwnKSk7CgkkdGhpcy0+c21hcnR5LT5hc3NpZ24oIkhlYWRlclNjaG5pdHQiLCAkdGhpcy0+TGFuZygnYXZlcmFnZScpKTsKCSR0aGlzLT5zbWFydHktPmFzc2lnbigiSGVhZGVyU2Nobml0dFR5cGUiLCAkdGhpcy0+TGFuZygnU0JUeXBlJykpOwoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCJIZWFkZXJTY2huaXR0SG9tZSIsICR0aGlzLT5MYW5nKCdTQkhvbWUnKSk7CgkkdGhpcy0+c21hcnR5LT5hc3NpZ24oIkhlYWRlclNjaG5pdHRBd2F5IiwgJHRoaXMtPkxhbmcoJ1NCQXdheScpKTsKCSR0aGlzLT5zbWFydHktPmFzc2lnbigiSGVhZGVyU2Nobml0dEdlcyIsICR0aGlzLT5MYW5nKCdTQkdlcycpKTsKCSR0aGlzLT5zbWFydHktPmFzc2lnbigiSGVhZGVyU2Nobml0dENvdW50IiwgJHRoaXMtPkxhbmcoJ2NvdW50JykpOwoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCJUZXh0Tm9HYW1lcyIsICR0aGlzLT5MYW5nKCdub2dhbWVzJykpOwoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCJHYW1lcyIsICR0YWJsZWluZm8pOwoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCJTY2huaXR0IiwgJHNjaG5pdHQpOwoJZWNobyAkdGhpcy0+UHJvY2Vzc1RlbXBsYXRlKCJzaG93cGxheWVycmVzdWx0cy50cGwiKTsKfSBlbHNlIHsKCSR0aGlzLT5zbWFydHktPmFzc2lnbigndGl0bGVfZXJyb3InLCAkdGhpcy0+TGFuZygnZXJyb3J0YWcnKSk7CgkkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ21lc3NhZ2UnLCAkdGhpcy0+TGFuZygnZXJyb3JfdGVhbScpLic8YnIvPicuJHBhcmFtc1sndGVhbSddLiR0aGlzLT5MYW5nKCdlcnJvcl9zYWlzb24nKS4kcGFyYW1zWydzYWlzb24nXSk7CgllY2hvICR0aGlzLT5Qcm9jZXNzVGVtcGxhdGUoJ2Vycm9yLnRwbCcpOwp9Cgo/Pg==]]></data>
	</file>
	<file>
	  <filename>/action.showplayerresults120.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKaWYgKCFpc3NldCgkZ0NtcykpIGV4aXQ7CgovKiAtPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LQoKICAgQ29kZSBmb3Iga2VnZWxlcmdlYm5pc3NlICJzaG93Z2FtZSIgYWN0aW9uCgogICAtPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LQogICAKICAgVHlwaWNhbGx5LCB0aGlzIHdpbGwgZGlzcGxheSBzb21ldGhpbmcgZnJvbSBhIHRlbXBsYXRlCiAgIG9yIGRvIHNvbWUgb3RoZXIgdGFzay4KICAgCiovCgovKiBzZWFyY2ggZm9yIHRlYW0gaW5zaWRlIHRoZSBkYXRhYmFzZSAqLwokdGVhbXMgPSBEYXRhYmFzZU9wZXJhdGlvbnM6OmdldEFsbFRlYW1zKCk7CiR0ZWFtID0gTlVMTDsKZm9yZWFjaCAoJHRlYW1zIGFzICR0ZW1wdGVhbSkgewoJaWYgKCR0ZW1wdGVhbS0+Z2V0TmFtZSgpID09ICRwYXJhbXNbJ3RlYW0nXSkgewoJCSR0ZWFtID0gJHRlbXB0ZWFtOwoJfQp9CgovKiBzZWFyY2ggZm9yIHNhaXNvbiBpbnNpZGUgdGhlIGRhdGFiYXNlICovCiRzYWlzb25zID0gRGF0YWJhc2VPcGVyYXRpb25zOjpnZXRBbGxTYWlzb25zKCk7CiRzYWlzb24gPSBOVUxMOwpmb3JlYWNoICgkc2Fpc29ucyBhcyAkdGVtcHNhaXNvbikgewoJaWYgKCR0ZW1wc2Fpc29uLT5nZXROYW1lKCkgPT0gJHBhcmFtc1snc2Fpc29uJ10pIHsKCQkkc2Fpc29uID0gJHRlbXBzYWlzb247Cgl9Cn0KCi8qIFNwaWVsZXIgc3VjaGVuICovCiRwbGF5ZXJzID0gRGF0YWJhc2VPcGVyYXRpb25zOjpnZXRBbGxQbGF5ZXJzKCk7CmlmIChpc19udW1lcmljKCRwYXJhbXNbJ3BsYXllciddKSkgewoJZm9yZWFjaCAoJHBsYXllcnMgYXMgJHRlbXBwbGF5ZXIpIHsKCQlpZiAoJHBhcmFtc1sncGxheWVyJ10gPT0gJHRlbXBwbGF5ZXItPmdldElkKCkpIHsKCQkJJHBsYXllciA9ICR0ZW1wcGxheWVyOwoJCX0KCX0KfSBlbHNlIHsKCWZvcmVhY2ggKCRwbGF5ZXJzIGFzICR0ZW1wcGxheWVyKSB7CgkJaWYgKCRwYXJhbXNbJ3BsYXllciddID09ICR0ZW1wcGxheWVyLT5nZXROYW1lKCkpIHsKCQkJJHBsYXllciA9ICR0ZW1wcGxheWVyOwoJCX0KCX0KfQoKaWYgKGlzc2V0KCRwbGF5ZXIpKSB7CgkJLyogYWxsZSBFaW56ZWxyZXN1bHRhdGUgZGVzIFNwaWVsZXJzIGJlc29yZ2VuICovCgkkZ2FtZXMgPSBEYXRhYmFzZU9wZXJhdGlvbnM6OmdldFRpbWVUYWJsZSAoICRzYWlzb24sICR0ZWFtICk7CgkkaSA9IDA7CgkkdGVtcGxpc3QgPSBhcnJheSAoCgkJCSJoZWltIiwKCQkJImF1c3ciLAoJCQkiZ2VzIiAKCSk7Cglmb3JlYWNoICggJHRlbXBsaXN0IGFzICR0ZW1waXRlbSApIHsKCQkkc2Nobml0dCBbJHRlbXBpdGVtXSBbImNvdW50Il0gPSAwOwoJCSRzY2huaXR0IFskdGVtcGl0ZW1dIFsiZ2VzIl0gPSAwOwoJCSRzY2huaXR0IFskdGVtcGl0ZW1dIFsidm9sbCJdID0gMDsKCQkkc2Nobml0dCBbJHRlbXBpdGVtXSBbImFiciJdID0gMDsKCQkkc2Nobml0dCBbJHRlbXBpdGVtXSBbImZlaGwiXSA9IDA7CgkJJHNjaG5pdHQgWyR0ZW1waXRlbV0gWyJzcCJdID0gMDsKCQkkc2Nobml0dCBbJHRlbXBpdGVtXSBbIm1wIl0gPSAwOwoJCSRzY2huaXR0IFskdGVtcGl0ZW1dIFsib2NvdW50Il0gPSAwOwoJCSRzY2huaXR0IFskdGVtcGl0ZW1dIFsib2dlcyJdID0gMDsKCQkkc2Nobml0dCBbJHRlbXBpdGVtXSBbIm92b2xsIl0gPSAwOwoJCSRzY2huaXR0IFskdGVtcGl0ZW1dIFsib2FiciJdID0gMDsKCQkkc2Nobml0dCBbJHRlbXBpdGVtXSBbIm9mZWhsIl0gPSAwOwoJCSRzY2huaXR0IFskdGVtcGl0ZW1dIFsib3NwIl0gPSAwOwoJCSRzY2huaXR0IFskdGVtcGl0ZW1dIFsib21wIl0gPSAwOwoJfQoJZm9yZWFjaCAoICRnYW1lcyBhcyAkdGVtcGdhbWUgKSB7CgkJJHJlc3VsdHMgPSBEYXRhYmFzZU9wZXJhdGlvbnM6OmdldE1hdGNoMTIwT2ZHYW1lKCR0ZW1wZ2FtZSk7CgkJZm9yZWFjaCAoICRyZXN1bHRzIGFzICRyZXN1bHQgKSB7CgkJCSRvY291bnQgPSBmYWxzZTsKCQkJJHBjb3VudCA9IGZhbHNlOwoJCQkvKiBoZXJhdXNmaW5kZW4sIG9iIEVyZ2VibmlzIHp1bSBTY2huaXR0IHrDpGhsdCBvZGVyIG5pY2h0ICovCgkJCWlmICgoJHJlc3VsdC0+Z2V0UENvdW50KCkgIT0gZmFsc2UpICYmCgkJCQkJKCRyZXN1bHQtPmdldFMxKCktPmdldFBsYXllcigpLT5nZXRJZCgpID09ICRyZXN1bHQtPmdldFMyKCktPmdldFBsYXllcigpLT5nZXRJZCgpKSAmJgoJCQkJCSgkcmVzdWx0LT5nZXRTMigpLT5nZXRQbGF5ZXIoKS0+Z2V0SWQoKSA9PSAkcmVzdWx0LT5nZXRTMygpLT5nZXRQbGF5ZXIoKS0+Z2V0SWQoKSkgJiYKCQkJCQkoJHJlc3VsdC0+Z2V0UzMoKS0+Z2V0UGxheWVyKCktPmdldElkKCkgPT0gJHJlc3VsdC0+Z2V0UzQoKS0+Z2V0UGxheWVyKCktPmdldElkKCkpKSB7CgkJCQkkcGNvdW50ID0gdHJ1ZTsKCQkJfQoJCQlpZiAoKCRyZXN1bHQtPmdldE9jb3VudCgpICE9IGZhbHNlKSAmJgoJCQkJCSgkcmVzdWx0LT5nZXRTMSgpLT5nZXRPcHBvbmVudCgpID09ICRyZXN1bHQtPmdldFMyKCktPmdldE9wcG9uZW50KCkpICYmCgkJCQkJKCRyZXN1bHQtPmdldFMyKCktPmdldE9wcG9uZW50KCkgPT0gJHJlc3VsdC0+Z2V0UzMoKS0+Z2V0T3Bwb25lbnQoKSkgJiYKCQkJCQkoJHJlc3VsdC0+Z2V0UzMoKS0+Z2V0T3Bwb25lbnQoKSA9PSAkcmVzdWx0LT5nZXRTNCgpLT5nZXRPcHBvbmVudCgpKSkgewoJCQkJJHBjb3VudCA9IHRydWU7CgkJCX0KCQkJCgkJCS8qIEluZm9ybWF0aW9uZW4gZsO8ciBkaWUgQXVzZ2FiZSBlcnN0ZWxsZW4gKi8KCQkJaWYgKCRyZXN1bHQtPmdldFMxICgpLT5nZXRQbGF5ZXIoKS0+Z2V0SWQgKCkgPT0gJHBsYXllci0+Z2V0SWQgKCkpIHsKCQkJCSR0YWJsZWluZm8gWyRpXSBbIk9wcG9uZW50VGVhbSJdID0gJHRlbXBnYW1lLT5nZXRPcHBvbmVudCAoKTsKCQkJCSR0YWJsZWluZm8gWyRpXSBbIk91clRlYW0iXSA9ICR0ZW1wZ2FtZS0+Z2V0T3VyVGVhbSAoKS0+Z2V0TmFtZSAoKTsKCQkJCSR0YWJsZWluZm8gWyRpXSBbIkhvbWUiXSA9ICR0ZW1wZ2FtZS0+Z2V0SG9tZSAoKTsKCQkJCSR0YWJsZWluZm8gWyRpXSBbIkRhdGUiXSA9ICR0ZW1wZ2FtZS0+Z2V0RGF0ZSAoKS0+Zm9ybWF0ICggImQubS5ZIiApOwoJCQkJJHRhYmxlaW5mbyBbJGldIFsiT3Bwb25lbnRQbGF5ZXIiXSA9ICRyZXN1bHQtPmdldFMxICgpLT5nZXRPcHBvbmVudCAoKTsKCQkJCSR0YWJsZWluZm8gWyRpXSBbIkdlcyJdID0gJHJlc3VsdC0+Z2V0TWF0Y2hDb21wbGV0ZUdlcyAoKTsKCQkJCSR0YWJsZWluZm8gWyRpXSBbIkFiciJdID0gJHJlc3VsdC0+Z2V0TWF0Y2hDb21wbGV0ZUFiciAoKTsKCQkJCSR0YWJsZWluZm8gWyRpXSBbIlZvbGwiXSA9ICRyZXN1bHQtPmdldE1hdGNoQ29tcGxldGVWb2xsICgpOwoJCQkJJHRhYmxlaW5mbyBbJGldIFsiRmVobCJdID0gJHJlc3VsdC0+Z2V0TWF0Y2hDb21wbGV0ZUZlaGwgKCk7CgkJCQkkdGFibGVpbmZvIFskaV0gWyJTUCJdID0gJHJlc3VsdC0+Z2V0U2V0UG9pbnRzICgpOwoJCQkJJHRhYmxlaW5mbyBbJGldIFsiTVAiXSA9ICRyZXN1bHQtPmdldE1hdGNoUG9pbnRzICgpOwoJCQkJJHRhYmxlaW5mbyBbJGldIFsiU2Nobml0dCJdID0gJHBjb3VudDsKCQkJCSR0YWJsZWluZm8gWyRpXSBbIk9HZXMiXSA9ICRyZXN1bHQtPmdldE1hdGNoQ29tcGxldGVPR2VzICgpOwoJCQkJJHRhYmxlaW5mbyBbJGldIFsiT0FiciJdID0gJHJlc3VsdC0+Z2V0TWF0Y2hDb21wbGV0ZU9BYnIgKCk7CgkJCQkkdGFibGVpbmZvIFskaV0gWyJPVm9sbCJdID0gJHJlc3VsdC0+Z2V0TWF0Y2hDb21wbGV0ZU9Wb2xsICgpOwoJCQkJJHRhYmxlaW5mbyBbJGldIFsiT0ZlaGwiXSA9ICRyZXN1bHQtPmdldE1hdGNoQ29tcGxldGVPRmVobCAoKTsKCQkJCSR0YWJsZWluZm8gWyRpXSBbIk9TUCJdID0gJHJlc3VsdC0+Z2V0U2V0T1BvaW50cyAoKTsKCQkJCSR0YWJsZWluZm8gWyRpXSBbIk9NUCJdID0gJHJlc3VsdC0+Z2V0TWF0Y2hPcG9pbnRzICgpOwoJCQkJJHRhYmxlaW5mbyBbJGldIFsiT1NjaG5pdHQiXSA9ICRvY291bnQ7CgkJCQkkaSA9ICRpICsgMTsKCQkJCQoJCQkJLyogU2Nobml0dGJlcmVjaG51bmcgKi8KCQkJCWlmICgkcmVzdWx0LT5nZXRHYW1lICgpLT5nZXRIb21lICgpICE9IGZhbHNlKSB7CgkJCQkJJHRlbXBpdGVtID0gImhlaW0iOwoJCQkJfSBlbHNlIHsKCQkJCQkkdGVtcGl0ZW0gPSAiYXVzdyI7CgkJCQl9CgkJCQkKCQkJCWlmICgkcGNvdW50ICE9IGZhbHNlKSB7CgkJCQkJJHNjaG5pdHQgWyR0ZW1waXRlbV0gWyJjb3VudCJdICs9IDE7CgkJCQkJJHNjaG5pdHQgWyR0ZW1waXRlbV0gWyJnZXMiXSArPSAkcmVzdWx0LT5nZXRNYXRjaENvbXBsZXRlR2VzICgpOwoJCQkJCSRzY2huaXR0IFskdGVtcGl0ZW1dIFsidm9sbCJdICs9ICRyZXN1bHQtPmdldE1hdGNoQ29tcGxldGVWb2xsICgpOwoJCQkJCSRzY2huaXR0IFskdGVtcGl0ZW1dIFsiYWJyIl0gKz0gJHJlc3VsdC0+Z2V0TWF0Y2hDb21wbGV0ZUFiciAoKTsKCQkJCQkkc2Nobml0dCBbJHRlbXBpdGVtXSBbImZlaGwiXSArPSAkcmVzdWx0LT5nZXRNYXRjaENvbXBsZXRlRmVobCAoKTsKCQkJCQkkc2Nobml0dCBbJHRlbXBpdGVtXSBbInNwIl0gKz0gJHJlc3VsdC0+Z2V0U2V0UG9pbnRzICgpOwoJCQkJCSRzY2huaXR0IFskdGVtcGl0ZW1dIFsibXAiXSArPSAkcmVzdWx0LT5nZXRNYXRjaFBvaW50cyAoKTsKCQkJCQkkc2Nobml0dCBbImdlcyJdIFsiY291bnQiXSArPSAxOwoJCQkJCSRzY2huaXR0IFsiZ2VzIl0gWyJnZXMiXSArPSAkcmVzdWx0LT5nZXRNYXRjaENvbXBsZXRlR2VzICgpOwoJCQkJCSRzY2huaXR0IFsiZ2VzIl0gWyJ2b2xsIl0gKz0gJHJlc3VsdC0+Z2V0TWF0Y2hDb21wbGV0ZVZvbGwgKCk7CgkJCQkJJHNjaG5pdHQgWyJnZXMiXSBbImFiciJdICs9ICRyZXN1bHQtPmdldE1hdGNoQ29tcGxldGVBYnIgKCk7CgkJCQkJJHNjaG5pdHQgWyJnZXMiXSBbImZlaGwiXSArPSAkcmVzdWx0LT5nZXRNYXRjaENvbXBsZXRlRmVobCAoKTsKCQkJCQkkc2Nobml0dCBbImdlcyJdIFsic3AiXSArPSAkcmVzdWx0LT5nZXRTZXRQb2ludHMgKCk7CgkJCQkJJHNjaG5pdHQgWyJnZXMiXSBbIm1wIl0gKz0gJHJlc3VsdC0+Z2V0TWF0Y2hQb2ludHMgKCk7CgkJCQl9CgkJCQlpZiAoJG9jb3VudCAhPSBmYWxzZSkgewoJCQkJCSRzY2huaXR0IFskdGVtcGl0ZW1dIFsib2NvdW50Il0gKz0gMTsKCQkJCQkkc2Nobml0dCBbJHRlbXBpdGVtXSBbIm9nZXMiXSArPSAkcmVzdWx0LT5nZXRNYXRjaENvbXBsZXRlT0dlcyAoKTsKCQkJCQkkc2Nobml0dCBbJHRlbXBpdGVtXSBbIm92b2xsIl0gKz0gJHJlc3VsdC0+Z2V0TWF0Y2hDb21wbGV0ZU9Wb2xsICgpOwoJCQkJCSRzY2huaXR0IFskdGVtcGl0ZW1dIFsib2FiciJdICs9ICRyZXN1bHQtPmdldE1hdGNoQ29tcGxldGVPQWJyICgpOwoJCQkJCSRzY2huaXR0IFskdGVtcGl0ZW1dIFsib2ZlaGwiXSArPSAkcmVzdWx0LT5nZXRNYXRjaENvbXBsZXRlT0ZlaGwgKCk7CgkJCQkJJHNjaG5pdHQgWyR0ZW1waXRlbV0gWyJvc3AiXSArPSAkcmVzdWx0LT5nZXRTZXRPUG9pbnRzICgpOwoJCQkJCSRzY2huaXR0IFskdGVtcGl0ZW1dIFsib21wIl0gKz0gJHJlc3VsdC0+Z2V0TWF0Y2hPcG9pbnRzICgpOwoJCQkJCSRzY2huaXR0IFsiZ2VzIl0gWyJvY291bnQiXSArPSAxOwoJCQkJCSRzY2huaXR0IFsiZ2VzIl0gWyJvZ2VzIl0gKz0gJHJlc3VsdC0+Z2V0TWF0Y2hDb21wbGV0ZU9HZXMgKCk7CgkJCQkJJHNjaG5pdHQgWyJnZXMiXSBbIm92b2xsIl0gKz0gJHJlc3VsdC0+Z2V0TWF0Y2hDb21wbGV0ZU9Wb2xsICgpOwoJCQkJCSRzY2huaXR0IFsiZ2VzIl0gWyJvYWJyIl0gKz0gJHJlc3VsdC0+Z2V0TWF0Y2hDb21wbGV0ZU9BYnIgKCk7CgkJCQkJJHNjaG5pdHQgWyJnZXMiXSBbIm9mZWhsIl0gKz0gJHJlc3VsdC0+Z2V0TWF0Y2hDb21wbGV0ZU9GZWhsICgpOwoJCQkJCSRzY2huaXR0IFsiZ2VzIl0gWyJvc3AiXSArPSAkcmVzdWx0LT5nZXRTZXRPUG9pbnRzICgpOwoJCQkJCSRzY2huaXR0IFsiZ2VzIl0gWyJvbXAiXSArPSAkcmVzdWx0LT5nZXRNYXRjaE9wb2ludHMgKCk7CgkJCQl9CgkJCX0KCQl9Cgl9CgkkdGhpcy0+c21hcnR5LT5hc3NpZ24oIkhlYWRlckRhdGUiLCAkdGhpcy0+TGFuZygnZGF0ZScpKTsKCSR0aGlzLT5zbWFydHktPmFzc2lnbigiSGVhZGVyT3Bwb25lbnRUZWFtIiwgJHRoaXMtPkxhbmcoJ2F3YXl0ZWFtJykpOwoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCJIZWFkZXJPcHBvbmVudCIsICR0aGlzLT5MYW5nKCdvcHBvbmVudCcpKTsKCSR0aGlzLT5zbWFydHktPmFzc2lnbigiSGVhZGVyTmFtZSIsICR0aGlzLT5MYW5nKCdwbGF5ZXJuYW1lX2hlYWRlcicpKTsKCSR0aGlzLT5zbWFydHktPmFzc2lnbigiSGVhZGVyR2FtZSIsICR0aGlzLT5MYW5nKCdnYW1lJykpOwoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCJIZWFkZXJHYW1lcyIsICR0aGlzLT5MYW5nKCdnYW1lcycpKTsKCSR0aGlzLT5zbWFydHktPmFzc2lnbigiSGVhZGVyUGxheWVyIiwgJHBsYXllci0+Z2V0TmFtZSgpKTsKCSR0aGlzLT5zbWFydHktPmFzc2lnbigiSGVhZGVyR2VzIiwgJHRoaXMtPkxhbmcoJ1NCR2VzJykpOwoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCJIZWFkZXJWb2xsIiwgJHRoaXMtPkxhbmcoJ1NCVm9sbCcpKTsKCSR0aGlzLT5zbWFydHktPmFzc2lnbigiSGVhZGVyQWJyIiwgJHRoaXMtPkxhbmcoJ1NCQWJyJykpOwoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCJIZWFkZXJGZWhsIiwgJHRoaXMtPkxhbmcoJ1NCRmVobCcpKTsKCSR0aGlzLT5zbWFydHktPmFzc2lnbigiSGVhZGVyU1AiLCAkdGhpcy0+TGFuZygnU1AnKSk7CgkkdGhpcy0+c21hcnR5LT5hc3NpZ24oIkhlYWRlck1QIiwgJHRoaXMtPkxhbmcoJ01QJykpOwoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCJIZWFkZXJTY2huaXR0IiwgJHRoaXMtPkxhbmcoJ2F2ZXJhZ2UnKSk7CgkkdGhpcy0+c21hcnR5LT5hc3NpZ24oIkhlYWRlclNjaG5pdHRUeXBlIiwgJHRoaXMtPkxhbmcoJ1NCVHlwZScpKTsKCSR0aGlzLT5zbWFydHktPmFzc2lnbigiSGVhZGVyU2Nobml0dEhvbWUiLCAkdGhpcy0+TGFuZygnU0JIb21lJykpOwoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCJIZWFkZXJTY2huaXR0QXdheSIsICR0aGlzLT5MYW5nKCdTQkF3YXknKSk7CgkkdGhpcy0+c21hcnR5LT5hc3NpZ24oIkhlYWRlclNjaG5pdHRHZXMiLCAkdGhpcy0+TGFuZygnU0JHZXMnKSk7CgkkdGhpcy0+c21hcnR5LT5hc3NpZ24oIkhlYWRlclNjaG5pdHRDb3VudCIsICR0aGlzLT5MYW5nKCdjb3VudCcpKTsKCSR0aGlzLT5zbWFydHktPmFzc2lnbigiVGV4dE5vR2FtZXMiLCAkdGhpcy0+TGFuZygnbm9nYW1lcycpKTsKCSR0aGlzLT5zbWFydHktPmFzc2lnbigiR2FtZXMiLCAkdGFibGVpbmZvKTsKCSR0aGlzLT5zbWFydHktPmFzc2lnbigiU2Nobml0dCIsICRzY2huaXR0KTsKCWVjaG8gJHRoaXMtPlByb2Nlc3NUZW1wbGF0ZSgic2hvd3BsYXllcnJlc3VsdHMxMjAudHBsIik7Cn0gZWxzZSB7CgkkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3RpdGxlX2Vycm9yJywgJHRoaXMtPkxhbmcoJ2Vycm9ydGFnJykpOwoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdtZXNzYWdlJywgJHRoaXMtPkxhbmcoJ2Vycm9yX3RlYW0nKS4nPGJyLz4nLiRwYXJhbXNbJ3RlYW0nXS4kdGhpcy0+TGFuZygnZXJyb3Jfc2Fpc29uJykuJHBhcmFtc1snc2Fpc29uJ10pOwoJZWNobyAkdGhpcy0+UHJvY2Vzc1RlbXBsYXRlKCdlcnJvci50cGwnKTsKfQoKPz4=]]></data>
	</file>
	<file>
	  <filename>/action.showteamtable.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKaWYgKCFpc3NldCgkZ0NtcykpIGV4aXQ7CgovKiAtPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LQoKICAgQ29kZSBmb3Iga2VnZWxlcmdlYm5pc3NlICJzaG93dGVhbXRhYmxlIiBhY3Rpb24KCiAgIC09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tCiAgIAogICBUeXBpY2FsbHksIHRoaXMgd2lsbCBkaXNwbGF5IHNvbWV0aGluZyBmcm9tIGEgdGVtcGxhdGUKICAgb3IgZG8gc29tZSBvdGhlciB0YXNrLgogICAKKi8KLyogc2VhcmNoIGZvciB0ZWFtIGluc2lkZSB0aGUgZGF0YWJhc2UgKi8KaWYgKCRwYXJhbXNbJ3RlYW0nXSA9PSAnYWxsJykgewogICAgICAgICR0ZWFtID0gJ2FsbCc7Cn0gZWxzZSB7CiAgICAgICAgJHRlYW1zID0gRGF0YWJhc2VPcGVyYXRpb25zOjpnZXRBbGxUZWFtcygpOwogICAgICAgIGZvcmVhY2ggKCR0ZWFtcyBhcyAkdGVtcHRlYW0pIHsKICAgICAgICAgICAgICAgIGlmICgkdGVtcHRlYW0tPmdldE5hbWUoKSA9PSAkcGFyYW1zWyd0ZWFtJ10pIHsKICAgICAgICAgICAgICAgICAgICAgICAgJHRlYW0gPSAkdGVtcHRlYW07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgfQp9CgovKiBzZWFyY2ggZm9yIHNhaXNvbiBpbnNpZGUgdGhlIGRhdGFiYXNlICovCiRzYWlzb25zID0gRGF0YWJhc2VPcGVyYXRpb25zOjpnZXRBbGxTYWlzb25zKCk7CmZvcmVhY2ggKCRzYWlzb25zIGFzICR0ZW1wc2Fpc29uKSB7CglpZiAoJHRlbXBzYWlzb24tPmdldE5hbWUoKSA9PSAkcGFyYW1zWydzYWlzb24nXSkgewoJCSRzYWlzb24gPSAkdGVtcHNhaXNvbjsKCX0KfQoKLyogYWxsIGxpbmtzIHVzZWQgYnkgdGhlIHhsc2xpbmsgcGFyYW1ldGVyICovCiRsaW5rcyA9IGFycmF5KCd4bHMnID0+IGZhbHNlLCAneGxzeCcgPT4gZmFsc2UsICdpY3MnID0+IGZhbHNlKTsKCi8qIGNoZWNrIGlmIGxpbmtzIHNob3VsZCBiZSBkaXNwbGF5ZWQgKi8KaWYgKHN0cnBvcygkcGFyYW1zWyd4bHNsaW5rJ10sICdub25lJykgPT0gZmFsc2UpIHsKCSR0ZW1wYXJyYXkgPSBzcGxpdCgnLCcsJHBhcmFtc1sneGxzbGluayddKTsKCWZvcmVhY2ggKCR0ZW1wYXJyYXkgYXMgJGtleSkgewoJCWlmIChpc3NldCgkbGlua3NbJGtleV0pKSB7CgkJCSRsaW5rc1ska2V5XSA9IHRydWU7CgkJfQoJfQp9CgoKaWYgKGlzc2V0KCRzYWlzb24pICYmIGlzc2V0KCR0ZWFtKSkgewoJLyogYWxsZSBTcGllbGUgZGVyIE1hbm5zY2hhZnQgaG9sZW4gdW5kIEVyZ2Vibmlzc2UgYmVyZWNobmVuICovCglpZiAoJHRlYW0gPT0gJ2FsbCcpIHsKICAgICAgICAgICAgICAgICRnYW1lcyA9IERhdGFiYXNlT3BlcmF0aW9uczo6Z2V0VGltZVRhYmxlKCRzYWlzb24pOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAkZ2FtZXMgPSBEYXRhYmFzZU9wZXJhdGlvbnM6OmdldFRpbWVUYWJsZSgkc2Fpc29uLCAkdGVhbSk7CiAgICAgICAgfQoJJHRhYmxlaW5mbyA9IGFycmF5KCk7CgkkaSA9IDA7Cglmb3JlYWNoICgkZ2FtZXMgYXMgJHRlbXBnYW1lKSB7CgkJaWYgKCR0ZW1wZ2FtZS0+aXMxMjAgKCkgPT0gZmFsc2UpIHsKCQkJJHRlbXByZXN1bHRzID0gRGF0YWJhc2VPcGVyYXRpb25zOjpnZXRSZXN1bHRPZkdhbWUgKCAkdGVtcGdhbWUgKTsKCQkJJHRlbXBjb21wcmVzdWx0IFsnaG9tZSddID0gMDsKCQkJJHRlbXBjb21wcmVzdWx0IFsnb3Bwb25lbnQnXSA9IDA7CgkJCWZvcmVhY2ggKCAkdGVtcHJlc3VsdHMgYXMgJHRlbXByZXN1bHQgKSB7CgkJCQkkdGVtcGNvbXByZXN1bHQgWydob21lJ10gKz0gJHRlbXByZXN1bHQtPmdldEdlcyAoKTsKCQkJCSR0ZW1wY29tcHJlc3VsdCBbJ29wcG9uZW50J10gKz0gJHRlbXByZXN1bHQtPmdldE9HZXMgKCk7CgkJCX0KCQl9IGVsc2UgewoJCQkkdGVtcHJlc3VsdHMgPSBEYXRhYmFzZU9wZXJhdGlvbnM6OmdldE1hdGNoMTIwT2ZHYW1lKCR0ZW1wZ2FtZSk7CgkJCSR0ZW1wY29tcHJlc3VsdFsnaG9tZSddID0gMDsKCQkJJHRlbXBjb21wcmVzdWx0WydvcHBvbmVudCddID0gMDsKCQkJJHRlbXBjb21wcmVzdWx0Wydob21lcG9pbnRzJ10gPSAwOwoJCQkkdGVtcGNvbXByZXN1bHRbJ29wcG9uZW50cG9pbnRzJ10gPSAwOwoJCQlmb3JlYWNoICgkdGVtcHJlc3VsdHMgYXMgJHRlbXByZXN1bHQpIHsKCQkJCSR0ZW1wY29tcHJlc3VsdFsnaG9tZSddICs9ICR0ZW1wcmVzdWx0LT5nZXRNYXRjaENvbXBsZXRlR2VzKCk7CgkJCQkkdGVtcGNvbXByZXN1bHRbJ29wcG9uZW50J10gKz0gJHRlbXByZXN1bHQtPmdldE1hdGNoQ29tcGxldGVPR2VzKCk7CgkJCQkkdGVtcGNvbXByZXN1bHRbJ2hvbWVwb2ludHMnXSArPSAkdGVtcHJlc3VsdC0+Z2V0TWF0Y2hQb2ludHMoKTsKCQkJCSR0ZW1wY29tcHJlc3VsdFsnb3Bwb25lbnRwb2ludHMnXSArPSAkdGVtcHJlc3VsdC0+Z2V0TWF0Y2hPcG9pbnRzKCk7CgkJCX0KCQkJaWYgKCgkdGVtcGNvbXByZXN1bHQgWydob21lJ10gPiAwKSAmJiAoJHRlbXBjb21wcmVzdWx0IFsnb3Bwb25lbnQnXSA+IDApKSB7CgkJCQlpZiAoJHRlbXBjb21wcmVzdWx0IFsnaG9tZSddID4gJHRlbXBjb21wcmVzdWx0IFsnb3Bwb25lbnQnXSkgewoJCQkJCSR0ZW1wY29tcHJlc3VsdCBbJ2hvbWVwb2ludHMnXSArPSAyMDsKCQkJCX0gZWxzZSBpZiAoJHRlbXBjb21wcmVzdWx0IFsnaG9tZSddIDwgJHRlbXBjb21wcmVzdWx0IFsnb3Bwb25lbnQnXSkgewoJCQkJCSR0ZW1wY29tcHJlc3VsdCBbJ29wcG9uZW50cG9pbnRzJ10gKz0gMjA7CgkJCQl9IGVsc2UgewoJCQkJCSR0ZW1wY29tcHJlc3VsdCBbJ2hvbWVwb2ludHMnXSArPSAxMDsKCQkJCQkkdGVtcGNvbXByZXN1bHQgWydvcHBvbmVudHBvaW50cyddICs9IDEwOwoJCQkJfQoJCQl9CgkJfQoJCSR0YWJsZWluZm9bJGldWydHYW1lSXMxMjAnXSA9ICR0ZW1wZ2FtZS0+aXMxMjAoKTsKCQkkdGFibGVpbmZvWyRpXVsnR2FtZU91clRlYW0nXSA9ICR0ZW1wZ2FtZS0+Z2V0T3VyVGVhbSgpLT5nZXROYW1lKCk7CgkJJHRhYmxlaW5mb1skaV1bJ0dhbWVPcHBvbmVudCddID0gJHRlbXBnYW1lLT5nZXRPcHBvbmVudCgpOwoJCSR0YWJsZWluZm9bJGldWydHYW1lRGF0ZSddID0gJHRlbXBnYW1lLT5nZXREYXRlKCktPmZvcm1hdCgiZC5tLlkiKTsKCQkkdGFibGVpbmZvWyRpXVsnR2FtZVRpbWUnXSA9ICR0ZW1wZ2FtZS0+Z2V0RGF0ZSgpLT5mb3JtYXQoIkg6aSIpOwoJCSR0YWJsZWluZm9bJGldWydHYW1lSG9tZSddID0gJHRlbXBnYW1lLT5nZXRIb21lKCk7CgkJJHRhYmxlaW5mb1skaV1bJ091clNjb3JlJ10gPSAkdGVtcGNvbXByZXN1bHRbJ2hvbWUnXTsKCQkkdGFibGVpbmZvWyRpXVsnT3Bwb25lbnRTY29yZSddID0gJHRlbXBjb21wcmVzdWx0WydvcHBvbmVudCddOwoJCSR0YWJsZWluZm9bJGldWydPdXJQb2ludHMnXSA9IChpbnQpKCR0ZW1wY29tcHJlc3VsdFsnaG9tZXBvaW50cyddLzEwKS4iLiIuKGludCkoJHRlbXBjb21wcmVzdWx0Wydob21lcG9pbnRzJ10lMTApOwoJCSR0YWJsZWluZm9bJGldWydPcHBvbmVudFBvaW50cyddID0gKGludCkoJHRlbXBjb21wcmVzdWx0WydvcHBvbmVudHBvaW50cyddLzEwKS4iLiIuKGludCkoJHRlbXBjb21wcmVzdWx0WydvcHBvbmVudHBvaW50cyddJTEwKTsKCQkkaSArPSAxOwoJfQoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdTYWlzb24nLCAkc2Fpc29uLT5nZXROYW1lKCkpOwoJaWYgKCR0ZWFtID09ICdhbGwnKSB7CgkgICR0aGlzLT5zbWFydHktPmFzc2lnbignVGVhbScsICR0aGlzLT5MYW5nKCdhbGx0ZWFtcycpKTsKCX0gZWxzZSB7CgkgICR0aGlzLT5zbWFydHktPmFzc2lnbignVGVhbScsICR0ZWFtLT5nZXROYW1lKCkpOwoJfQoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdSZXN1bHRzJywgJHRhYmxlaW5mbyk7CgkkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ1RhZ0RhdGUnLCAkdGhpcy0+TGFuZygnZGF0ZScpKTsKCSR0aGlzLT5zbWFydHktPmFzc2lnbignVGFnVGltZScsICR0aGlzLT5MYW5nKCd0aW1lJykpOwoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdUYWdIb21lJywgJHRoaXMtPkxhbmcoJ2hvbWUnKSk7CgkkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ1RhZ0d1ZXN0JywgJHRoaXMtPkxhbmcoJ2d1ZXN0JykpOwoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdUYWdSZXN1bHQnLCAkdGhpcy0+TGFuZygncmVzdWx0JykpOwoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdTaG93TGlua1RvR2FtZVRhZycsICR0aGlzLT5MYW5nKCdkaXNwbGF5JykpOwoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdTaG93TGlua1RvR2FtZScsICRwYXJhbXNbJ3Nob3dsaW5rJ10pOwoJZm9yZWFjaCAoJGxpbmtzIGFzICRrZXkgPT4gJHZhbHVlKSB7CgkJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCRrZXksICR2YWx1ZSk7Cgl9CgllY2hvICR0aGlzLT5Qcm9jZXNzVGVtcGxhdGUoJ3Nob3d0aW1ldGFibGUudHBsJyk7Cn0gZWxzZSB7CgkkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3RpdGxlX2Vycm9yJywgJHRoaXMtPkxhbmcoJ2Vycm9ydGFnJykpOwoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdtZXNzYWdlJywgJHRoaXMtPkxhbmcoJ2Vycm9yX3RlYW0nKS4nPGJyLz4nLiRwYXJhbXNbJ3RlYW0nXS4kdGhpcy0+TGFuZygnZXJyb3Jfc2Fpc29uJykuJHBhcmFtc1snc2Fpc29uJ10pOwoJZWNobyAkdGhpcy0+UHJvY2Vzc1RlbXBsYXRlKCdlcnJvci50cGwnKTsKfQoKPz4=]]></data>
	</file>
	<file>
	  <filename>/action.xlsteamtable.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKaWYgKCFpc3NldCgkZ0NtcykpIGV4aXQ7CnJlcXVpcmVfb25jZSgibGliL0NsYXNzZXMvUEhQRXhjZWwucGhwIik7CgovKiAtPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LQoKICAgQ29kZSBmb3Iga2VnZWxlcmdlYm5pc3NlICJ4bHN0ZWFtdGFibGUiIGFjdGlvbgoKICAgLT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS0KICAgCiAgIFR5cGljYWxseSwgdGhpcyB3aWxsIGRpc3BsYXkgc29tZXRoaW5nIGZyb20gYSB0ZW1wbGF0ZQogICBvciBkbyBzb21lIG90aGVyIHRhc2suCiAgIAoqLwoKCiRsaW5rdHlwZXMgPSBhcnJheSgneGxzJywgJ3hsc3gnLCAnaWNzJyk7CgovKiBXZWJhbmZyYWdlIHd1cmRlIGdlc3RhcnRldCwgZGFoZXIgenVyw7xja2dlYmVuIGRlcyBhbmdla2xpY2t0ZW4gTGlua3MgKi8KaWYgKGlzc2V0KCRfR0VUWyd4bHNsaW5rdHlwZSddKSkgewoJLyogc2VhcmNoIGZvciB0ZWFtIGluc2lkZSB0aGUgZGF0YWJhc2UgKi8KCSR0ZWFtcyA9IERhdGFiYXNlT3BlcmF0aW9uczo6Z2V0QWxsVGVhbXMoKTsKCWZvcmVhY2ggKCR0ZWFtcyBhcyAkdGVtcHRlYW0pIHsKCQlpZiAoJHRlbXB0ZWFtLT5nZXRJZCgpID09ICRfR0VUWyd4bHN0ZWFtaWQnXSkgewoJCQkkdGVhbSA9ICR0ZW1wdGVhbTsKCQl9Cgl9CgoJLyogc2VhcmNoIGZvciBzYWlzb24gaW5zaWRlIHRoZSBkYXRhYmFzZSAqLwoJJHNhaXNvbnMgPSBEYXRhYmFzZU9wZXJhdGlvbnM6OmdldEFsbFNhaXNvbnMoKTsKCWZvcmVhY2ggKCRzYWlzb25zIGFzICR0ZW1wc2Fpc29uKSB7CgkJaWYgKCR0ZW1wc2Fpc29uLT5nZXRJZCgpID09ICRfR0VUWyd4bHNzYWlzb25pZCddKSB7CgkJCSRzYWlzb24gPSAkdGVtcHNhaXNvbjsKCQl9Cgl9CgoJLyogc2VhcmNoIGZvciBsaW5rdHlwZSAqLwoJZm9yZWFjaCAoJGxpbmt0eXBlcyBhcyAkdGVtcGxpbmt0eXBlKSB7CgkJaWYgKCR0ZW1wbGlua3R5cGUgPT0gJF9HRVRbJ3hsc2xpbmt0eXBlJ10pIHsKCQkJJGxpbmt0eXBlID0gJHRlbXBsaW5rdHlwZTsKCQl9Cgl9CgoJLyogY29udGVudCB0eXBlcyBmw7xyIGxpbmt0eXBlIGRlZmluaWVyZW4gKi8KCSRjb250ZW50dHlwZVsneGxzJ10gPSAiYXBwbGljYXRpb24vdm5kLm1zLWV4Y2VsIjsKCSRjb250ZW50dHlwZVsneGxzeCddID0gImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5zcHJlYWRzaGVldG1sLnNoZWV0IjsKCSRjb250ZW50dHlwZVsnaWNzJ10gPSAidGV4dC9jYWxlbmRhciI7CgoJaWYgKGlzc2V0KCRzYWlzb24pICYmIGlzc2V0KCR0ZWFtKSAmJiBpc3NldCgkbGlua3R5cGUpKSB7CgkJLyogYWxsZSBTcGllbGUgZGVyIE1hbm5zY2hhZnQgaG9sZW4gdW5kIEVyZ2Vibmlzc2UgYmVyZWNobmVuICovCgkJJGdhbWVzID0gRGF0YWJhc2VPcGVyYXRpb25zOjpnZXRUaW1lVGFibGUoJHNhaXNvbiwgJHRlYW0pOwoJCSR0YWJsZWluZm8gPSBhcnJheSgpOwoJCSRpID0gMDsKCQlmb3JlYWNoICgkZ2FtZXMgYXMgJHRlbXBnYW1lKSB7CgkJCSR0ZW1wY29tcHJlc3VsdFsnaG9tZSddID0gMDsKCQkJJHRlbXBjb21wcmVzdWx0WydvcHBvbmVudCddID0gMDsKCQkJJHRlbXBjb21wcmVzdWx0Wydob21lcG9pbnRzJ10gPSAwOwoJCQkkdGVtcGNvbXByZXN1bHRbJ29wcG9uZW50cG9pbnRzJ10gPSAwOwoJCQlpZiAoJHRlbXBnYW1lLT5pczEyMCgpID09IGZhbHNlKSB7CgkJCQkkdGVtcHJlc3VsdHMgPSBEYXRhYmFzZU9wZXJhdGlvbnM6OmdldFJlc3VsdE9mR2FtZSgkdGVtcGdhbWUpOwoJCQkJZm9yZWFjaCAoJHRlbXByZXN1bHRzIGFzICR0ZW1wcmVzdWx0KSB7CgkJCQkJJHRlbXBjb21wcmVzdWx0Wydob21lJ10gKz0gJHRlbXByZXN1bHQtPmdldEdlcygpOwoJCQkJCSR0ZW1wY29tcHJlc3VsdFsnb3Bwb25lbnQnXSArPSAkdGVtcHJlc3VsdC0+Z2V0T0dlcygpOwoJCQkJfQoJCQl9IGVsc2UgewoJCQkJJHRlbXByZXN1bHRzID0gRGF0YWJhc2VPcGVyYXRpb25zOjpnZXRNYXRjaDEyME9mR2FtZSgkdGVtcGdhbWUpOwoJCQkJZm9yZWFjaCAoJHRlbXByZXN1bHRzIGFzICR0ZW1wcmVzdWx0KSB7CgkJCQkJJHRlbXBjb21wcmVzdWx0Wydob21lJ10gKz0gJHRlbXByZXN1bHQtPmdldE1hdGNoQ29tcGxldGVHZXMoKTsKCQkJCQkkdGVtcGNvbXByZXN1bHRbJ29wcG9uZW50J10gKz0gJHRlbXByZXN1bHQtPmdldE1hdGNoQ29tcGxldGVPR2VzKCk7CgkJCQkJJHRlbXBjb21wcmVzdWx0Wydob21lcG9pbnRzJ10gKz0gJHRlbXByZXN1bHQtPmdldE1hdGNoUG9pbnRzKCk7CgkJCQkJJHRlbXBjb21wcmVzdWx0WydvcHBvbmVudHBvaW50cyddICs9ICR0ZW1wcmVzdWx0LT5nZXRNYXRjaE9wb2ludHMoKTsKCQkJCX0KCQkJCWlmICgkdGVtcGNvbXByZXN1bHRbJ2hvbWUnXSA+ICR0ZW1wY29tcHJlc3VsdFsnb3Bwb25lbnQnXSkgewoJCQkJCSR0ZW1wY29tcHJlc3VsdFsnaG9tZXBvaW50cyddICs9IDIwOwoJCQkJfSBlbHNlaWYgKCR0ZW1wY29tcHJlc3VsdFsnaG9tZSddIDwgJHRlbXBjb21wcmVzdWx0WydvcHBvbmVudCddKSB7CgkJCQkJJHRlbXBjb21wcmVzdWx0WydvcHBvbmVudHBvaW50cyddICs9IDIwOwoJCQkJfSBlbHNlIHsKCQkJCQkkdGVtcGNvbXByZXN1bHRbJ2hvbWVwb2ludHMnXSArPSAxMDsKCQkJCQkkdGVtcGNvbXByZXN1bHRbJ29wcG9uZW50cG9pbnRzJ10gKz0gMTA7CgkJCQl9CgkJCX0KCQkJJHRhYmxlaW5mb1skaV1bJ091clNjb3JlJ10gPSAkdGVtcGNvbXByZXN1bHRbJ2hvbWUnXTsKCQkJJHRhYmxlaW5mb1skaV1bJ09wcG9uZW50U2NvcmUnXSA9ICR0ZW1wY29tcHJlc3VsdFsnb3Bwb25lbnQnXTsKCQkJJHRhYmxlaW5mb1skaV1bJ091clBvaW50cyddID0gKGludCkoJHRlbXBjb21wcmVzdWx0Wydob21lcG9pbnRzJ10vMTApLiIuIi4oaW50KSgkdGVtcGNvbXByZXN1bHRbJ2hvbWVwb2ludHMnXSUxMCk7CgkJCSR0YWJsZWluZm9bJGldWydPcHBvbmVudFBvaW50cyddID0gKGludCkoJHRlbXBjb21wcmVzdWx0WydvcHBvbmVudHBvaW50cyddLzEwKS4iLiIuKGludCkoJHRlbXBjb21wcmVzdWx0WydvcHBvbmVudHBvaW50cyddJTEwKTsKCQkJJHRhYmxlaW5mb1skaV1bJ0dhbWVPdXJUZWFtJ10gPSAkdGVtcGdhbWUtPmdldE91clRlYW0oKS0+Z2V0TmFtZSgpOwoJCQkkdGFibGVpbmZvWyRpXVsnR2FtZU9wcG9uZW50J10gPSAkdGVtcGdhbWUtPmdldE9wcG9uZW50KCk7CgkJCSR0YWJsZWluZm9bJGldWydHYW1lRGF0ZSddID0gJHRlbXBnYW1lLT5nZXREYXRlKCk7CgkJCSR0YWJsZWluZm9bJGldWydHYW1lSG9tZSddID0gJHRlbXBnYW1lLT5nZXRIb21lKCk7CgkJCSR0YWJsZWluZm9bJGldWydHYW1lMTIwJ10gPSAkdGVtcGdhbWUtPmlzMTIwKCk7CgkJCSRpICs9IDE7CgkJfQoKCQlpZiAoJGxpbmt0eXBlICE9ICdpY3MnKSB7CgkJCS8qIGRhdGEgQXJyYXkgZsO8ciBDTVMgRXhjZWwgZXJ6ZXVnZW4gKi8KCQkJZm9yICgkaSA9IDA7ICRpIDwgY291bnQoJHRhYmxlaW5mbyk7ICRpID0gJGkgKyAxKSB7CgkJCQkkZGF0YVskdGVhbS0+Z2V0TmFtZSgpXVskaV1bMF0gPSBQSFBFeGNlbF9TaGFyZWRfRGF0ZTo6UEhQVG9FeGNlbCgkdGFibGVpbmZvWyRpXVsnR2FtZURhdGUnXSk7CgkJCQkkZGF0YVskdGVhbS0+Z2V0TmFtZSgpXVskaV1bMV0gPSBQSFBFeGNlbF9TaGFyZWRfRGF0ZTo6UEhQVG9FeGNlbCgkdGFibGVpbmZvWyRpXVsnR2FtZURhdGUnXSk7CgkJCQlpZiAoJHRhYmxlaW5mb1skaV1bJ0dhbWVIb21lJ10gPT0gdHJ1ZSkgewoJCQkJCSRkYXRhWyR0ZWFtLT5nZXROYW1lKCldWyRpXVsyXSA9ICR0YWJsZWluZm9bJGldWydHYW1lT3VyVGVhbSddOwoJCQkJCSRkYXRhWyR0ZWFtLT5nZXROYW1lKCldWyRpXVszXSA9ICR0YWJsZWluZm9bJGldWydHYW1lT3Bwb25lbnQnXTsKCQkJCQlpZiAoJHRhYmxlaW5mbyBbJGldIFsnR2FtZTEyMCddID09IGZhbHNlKSB7CgkJCQkJCWlmICgkdGFibGVpbmZvIFskaV0gWydPdXJTY29yZSddID09IDApIHsKCQkJCQkJCSRkYXRhIFskdGVhbS0+Z2V0TmFtZSAoKV0gWyRpXSBbNF0gPSAiIjsKCQkJCQkJfSBlbHNlIHsKCQkJCQkJCSRkYXRhIFskdGVhbS0+Z2V0TmFtZSAoKV0gWyRpXSBbNF0gPSAkdGFibGVpbmZvIFskaV0gWydPdXJTY29yZSddOwoJCQkJCQl9CgkJCQkJCSRkYXRhIFskdGVhbS0+Z2V0TmFtZSAoKV0gWyRpXSBbNV0gPSAiOiI7CgkJCQkJCWlmICgkdGFibGVpbmZvIFskaV0gWydPcHBvbmVudFNjb3JlJ10gPT0gMCkgewoJCQkJCQkJJGRhdGEgWyR0ZWFtLT5nZXROYW1lICgpXSBbJGldIFs2XSA9ICIiOwoJCQkJCQl9IGVsc2UgewoJCQkJCQkJJGRhdGEgWyR0ZWFtLT5nZXROYW1lICgpXSBbJGldIFs2XSA9ICR0YWJsZWluZm8gWyRpXSBbJ09wcG9uZW50U2NvcmUnXTsKCQkJCQkJfQoJCQkJCX0gZWxzZSB7CgkJCQkJCSRkYXRhIFskdGVhbS0+Z2V0TmFtZSAoKV0gWyRpXSBbNF0gPSAiIjsKCQkJCQkJJGRhdGEgWyR0ZWFtLT5nZXROYW1lICgpXSBbJGldIFs1XSA9ICIiOwoJCQkJCQlpZiAoKCR0YWJsZWluZm9bJGldWydPcHBvbmVudFNjb3JlJ10gPiAwKSAmJiAoJHRhYmxlaW5mb1skaV1bJ091clNjb3JlJ10gPiAwKSkgewoJCQkJCQkJJGRhdGEgWyR0ZWFtLT5nZXROYW1lICgpXSBbJGldIFs2XSA9ICR0YWJsZWluZm8gWyRpXSBbJ091clBvaW50cyddLiI6Ii4kdGFibGVpbmZvIFskaV0gWydPcHBvbmVudFBvaW50cyddLiIgKCIuJHRhYmxlaW5mbyBbJGldIFsnT3VyU2NvcmUnXS4iOiIuJHRhYmxlaW5mbyBbJGldIFsnT3Bwb25lbnRTY29yZSddLiIpIjsKCQkJCQkJfSBlbHNlIHsKCQkJCQkJCSRkYXRhWyR0ZWFtLT5nZXROYW1lKCldWyRpXVs2XSA9ICIiOwoJCQkJCQl9CgkJCQkJfQoJCQkJfSBlbHNlIHsKCQkJCQkkZGF0YVskdGVhbS0+Z2V0TmFtZSgpXVskaV1bMl0gPSAkdGFibGVpbmZvWyRpXVsnR2FtZU9wcG9uZW50J107CgkJCQkJJGRhdGFbJHRlYW0tPmdldE5hbWUoKV1bJGldWzNdID0gJHRhYmxlaW5mb1skaV1bJ0dhbWVPdXJUZWFtJ107CgkJCQkJaWYgKCR0YWJsZWluZm8gWyRpXSBbJ0dhbWUxMjAnXSA9PSBmYWxzZSkgewoJCQkJCQlpZiAoJHRhYmxlaW5mbyBbJGldIFsnT3Bwb25lbnRTY29yZSddID09IDApIHsKCQkJCQkJCSRkYXRhIFskdGVhbS0+Z2V0TmFtZSAoKV0gWyRpXSBbNF0gPSAiIjsKCQkJCQkJfSBlbHNlIHsKCQkJCQkJCSRkYXRhIFskdGVhbS0+Z2V0TmFtZSAoKV0gWyRpXSBbNF0gPSAkdGFibGVpbmZvIFskaV0gWydPcHBvbmVudFNjb3JlJ107CgkJCQkJCX0KCQkJCQkJJGRhdGEgWyR0ZWFtLT5nZXROYW1lICgpXSBbJGldIFs1XSA9ICI6IjsKCQkJCQkJaWYgKCR0YWJsZWluZm8gWyRpXSBbJ091clNjb3JlJ10gPT0gMCkgewoJCQkJCQkJJGRhdGEgWyR0ZWFtLT5nZXROYW1lICgpXSBbJGldIFs2XSA9ICIiOwoJCQkJCQl9IGVsc2UgewoJCQkJCQkJJGRhdGEgWyR0ZWFtLT5nZXROYW1lICgpXSBbJGldIFs2XSA9ICR0YWJsZWluZm8gWyRpXSBbJ091clNjb3JlJ107CgkJCQkJCX0KCQkJCQl9IGVsc2UgewoJCQkJCQkkZGF0YSBbJHRlYW0tPmdldE5hbWUgKCldIFskaV0gWzRdID0gIiI7CgkJCQkJCSRkYXRhIFskdGVhbS0+Z2V0TmFtZSAoKV0gWyRpXSBbNV0gPSAiIjsKCQkJCQkJaWYgKCgkdGFibGVpbmZvWyRpXVsnT3Bwb25lbnRTY29yZSddID4gMCkgJiYgKCR0YWJsZWluZm9bJGldWydPdXJTY29yZSddID4gMCkpIHsKCQkJCQkJCSRkYXRhIFskdGVhbS0+Z2V0TmFtZSAoKV0gWyRpXSBbNl0gPSAkdGFibGVpbmZvIFskaV0gWydPcHBvbmVudFBvaW50cyddLiI6Ii4kdGFibGVpbmZvIFskaV0gWydPdXJQb2ludHMnXS4iICgiLiR0YWJsZWluZm8gWyRpXSBbJ09wcG9uZW50U2NvcmUnXS4iOiIuJHRhYmxlaW5mbyBbJGldIFsnT3VyU2NvcmUnXS4iKSI7CgkJCQkJCX0gZWxzZSB7CgkJCQkJCQkkZGF0YVskdGVhbS0+Z2V0TmFtZSgpXVskaV1bNl0gPSAiIjsKCQkJCQkJfQoJCQkJCX0KCQkJCX0KCQkJfQoKCQkJLyogTmV1ZSBFeGNlbGluc3RhbnogdW5kIGRpZSBzaGVldHMgZXJ6ZXVnZW4gKi8KCQkJJGV4Y2VsUmVhZGVyID0gUEhQRXhjZWxfSU9GYWN0b3J5OjpjcmVhdGVSZWFkZXJGb3JGaWxlKGRpcm5hbWUoX19GSUxFX18pLiIvdGVtcGxhdGVzL1NwaWVscGxhbi54bHMiKTsKCQkJJGV4Y2VsT2JqID0gJGV4Y2VsUmVhZGVyLT5sb2FkKGRpcm5hbWUoX19GSUxFX18pLiIvdGVtcGxhdGVzL1NwaWVscGxhbi54bHMiKTsKCQkJJGE1c2hlZXQgPSAkZXhjZWxPYmotPmdldFNoZWV0QnlOYW1lKCJBNSIpOwoJCQkkYTVzaGVldC0+c2V0VGl0bGUoJHRlYW0tPmdldE5hbWUoKS4iIC0gQTUiKTsKCQkJJHBvY2tldHNoZWV0ID0gJGV4Y2VsT2JqLT5nZXRTaGVldEJ5TmFtZSgiSUQxIik7CgkJCSRwb2NrZXRzaGVldC0+c2V0VGl0bGUoJHRlYW0tPmdldE5hbWUoKS4iIC0gSUQxIik7CgoJCQkvKiBEYXRlbiBpbiBFeGNlbCBTaGVldCBBNSBiZWbDvGxsZW4gKi8KCQkJJGE1c2hlZXQtPmdldENlbGxCeUNvbHVtbkFuZFJvdygwLDEpLT5zZXRWYWx1ZSgkdGhpcy0+TGFuZygnZGF0ZV9mcm9udGVuZCcpKTsKCQkJJGE1c2hlZXQtPmdldENlbGxCeUNvbHVtbkFuZFJvdygxLDEpLT5zZXRWYWx1ZSgkdGhpcy0+TGFuZygndGltZV9mcm9udGVuZCcpKTsKCQkJJGE1c2hlZXQtPmdldENlbGxCeUNvbHVtbkFuZFJvdygyLDEpLT5zZXRWYWx1ZSgkdGhpcy0+TGFuZygnaG9tZScpKTsKCQkJJGE1c2hlZXQtPmdldENlbGxCeUNvbHVtbkFuZFJvdygzLDEpLT5zZXRWYWx1ZSgkdGhpcy0+TGFuZygnZ3Vlc3QnKSk7CgkJCSRhNXNoZWV0LT5nZXRDZWxsQnlDb2x1bW5BbmRSb3coNCwxKS0+c2V0VmFsdWUoJHRoaXMtPkxhbmcoJ3Jlc3VsdCcpKTsKCQkJJGE1c2hlZXQtPmdldENlbGxCeUNvbHVtbkFuZFJvdygwLDIpLT5zZXRWYWx1ZSgkdGhpcy0+TGFuZygnZmlyc3Ryb3VuZCcpKTsKCQkJJGE1c2hlZXQtPmdldENlbGxCeUNvbHVtbkFuZFJvdygwLDE0KS0+c2V0VmFsdWUoJHRoaXMtPkxhbmcoJ3NlY29uZHJvdW5kJykpOwoJCQlmb3IgKCRqID0gMDsgJGogPCBjb3VudCgkZGF0YVskdGVhbS0+Z2V0TmFtZSgpXSkvMjsgJGogPSAkaiArIDEpIHsKCQkJCWZvciAoJGkgPSAwOyAkaSA8IDc7ICRpID0gJGkgKyAxKSB7CgkJCQkJJGE1c2hlZXQtPmdldENlbGxCeUNvbHVtbkFuZFJvdygkaSwkaiszKS0+c2V0VmFsdWUoJGRhdGFbJHRlYW0tPmdldE5hbWUoKV1bJGpdWyRpXSk7CgkJCQl9CgkJCX0KCQkJZm9yICgkaiA9IGNvdW50KCRkYXRhWyR0ZWFtLT5nZXROYW1lKCldKS8yOyAkaiA8IGNvdW50KCRkYXRhWyR0ZWFtLT5nZXROYW1lKCldKTsgJGogPSAkaiArIDEpIHsKCQkJCWZvciAoJGkgPSAwOyAkaSA8IDc7ICRpID0gJGkgKyAxKSB7CgkJCQkJJGE1c2hlZXQtPmdldENlbGxCeUNvbHVtbkFuZFJvdygkaSwoJGotY291bnQoJGRhdGFbJHRlYW0tPmdldE5hbWUoKV0pLzIpKzE1KS0+c2V0VmFsdWUoJGRhdGFbJHRlYW0tPmdldE5hbWUoKV1bJGpdWyRpXSk7CgkJCQl9CgkJCX0KCgkJCS8qIERhdGVuIGluIFBvY2tldHNoZWV0IGJlZsO8bGxlbiAqLwoJCQkkcG9ja2V0c2hlZXQtPmdldENlbGxCeUNvbHVtbkFuZFJvdygwLDEpLT5zZXRWYWx1ZSgkdGhpcy0+TGFuZygnZGF0ZV9mcm9udGVuZCcpKTsKCQkJJHBvY2tldHNoZWV0LT5nZXRDZWxsQnlDb2x1bW5BbmRSb3coMSwxKS0+c2V0VmFsdWUoJHRoaXMtPkxhbmcoJ3RpbWVfZnJvbnRlbmQnKSk7CgkJCSRwb2NrZXRzaGVldC0+Z2V0Q2VsbEJ5Q29sdW1uQW5kUm93KDIsMSktPnNldFZhbHVlKCR0aGlzLT5MYW5nKCdob21lJykpOwoJCQkkcG9ja2V0c2hlZXQtPmdldENlbGxCeUNvbHVtbkFuZFJvdygzLDEpLT5zZXRWYWx1ZSgkdGhpcy0+TGFuZygnZ3Vlc3QnKSk7CgkJCSRwb2NrZXRzaGVldC0+Z2V0Q2VsbEJ5Q29sdW1uQW5kUm93KDQsMSktPnNldFZhbHVlKCR0aGlzLT5MYW5nKCdyZXN1bHQnKSk7CgkJCSRwb2NrZXRzaGVldC0+Z2V0Q2VsbEJ5Q29sdW1uQW5kUm93KDAsMTMpLT5zZXRWYWx1ZSgkdGhpcy0+TGFuZygnZGF0ZV9mcm9udGVuZCcpKTsKCQkJJHBvY2tldHNoZWV0LT5nZXRDZWxsQnlDb2x1bW5BbmRSb3coMSwxMyktPnNldFZhbHVlKCR0aGlzLT5MYW5nKCd0aW1lX2Zyb250ZW5kJykpOwoJCQkkcG9ja2V0c2hlZXQtPmdldENlbGxCeUNvbHVtbkFuZFJvdygyLDEzKS0+c2V0VmFsdWUoJHRoaXMtPkxhbmcoJ2hvbWUnKSk7CgkJCSRwb2NrZXRzaGVldC0+Z2V0Q2VsbEJ5Q29sdW1uQW5kUm93KDMsMTMpLT5zZXRWYWx1ZSgkdGhpcy0+TGFuZygnZ3Vlc3QnKSk7CgkJCSRwb2NrZXRzaGVldC0+Z2V0Q2VsbEJ5Q29sdW1uQW5kUm93KDQsMTMpLT5zZXRWYWx1ZSgkdGhpcy0+TGFuZygncmVzdWx0JykpOwoJCQlmb3IgKCRqID0gMDsgJGogPCBjb3VudCgkZGF0YVskdGVhbS0+Z2V0TmFtZSgpXSkvMjsgJGogPSAkaiArIDEpIHsKCQkJCWZvciAoJGkgPSAwOyAkaSA8IDc7ICRpID0gJGkgKyAxKSB7CgkJCQkJJHBvY2tldHNoZWV0LT5nZXRDZWxsQnlDb2x1bW5BbmRSb3coJGksJGorMiktPnNldFZhbHVlKCRkYXRhWyR0ZWFtLT5nZXROYW1lKCldWyRqXVskaV0pOwoJCQkJfQoJCQl9CgkJCWZvciAoJGogPSBjb3VudCgkZGF0YVskdGVhbS0+Z2V0TmFtZSgpXSkvMjsgJGogPCBjb3VudCgkZGF0YVskdGVhbS0+Z2V0TmFtZSgpXSk7ICRqID0gJGogKyAxKSB7CgkJCQlmb3IgKCRpID0gMDsgJGkgPCA3OyAkaSA9ICRpICsgMSkgewoJCQkJCSRwb2NrZXRzaGVldC0+Z2V0Q2VsbEJ5Q29sdW1uQW5kUm93KCRpLCgkai1jb3VudCgkZGF0YVskdGVhbS0+Z2V0TmFtZSgpXSkvMikrMTQpLT5zZXRWYWx1ZSgkZGF0YVskdGVhbS0+Z2V0TmFtZSgpXVskal1bJGldKTsKCQkJCX0KCQkJfQoJCX0gZWxzZSB7CgkJCS8qIERhdGEgQXJyYXkgZsO8ciBpY3MgZXJ6ZXVnZW4gKi8KCQkJZm9yICgkaSA9IDA7ICRpIDwgY291bnQoJHRhYmxlaW5mbyk7ICRpID0gJGkgKyAxKSB7CgkJCQkkZGF0YVskdGVhbS0+Z2V0TmFtZSgpXVskaV1bJ2RhdGVzdGFydCddID0gJHRhYmxlaW5mb1skaV1bJ0dhbWVEYXRlJ10tPmZvcm1hdCgnWW1kXFRIaXMnKTsKCQkJCSR0ZW1wZGF0ZSA9ICR0YWJsZWluZm9bJGldWydHYW1lRGF0ZSddLT5hZGQobmV3IERhdGVJbnRlcnZhbCgnUFQzSCcpKTsKCQkJCSRkYXRhWyR0ZWFtLT5nZXROYW1lKCldWyRpXVsnZGF0ZWVuZCddID0gJHRlbXBkYXRlLT5mb3JtYXQoJ1ltZFxUSGlzJyk7CgkJCQkkdGVtcGRhdGUgPSBuZXcgRGF0ZVRpbWUoKTsKCQkJCSRkYXRhWyR0ZWFtLT5nZXROYW1lKCldWyRpXVsnZGF0ZXN0YW1wJ10gPSAkdGVtcGRhdGUtPmZvcm1hdCgnWW1kXFRIaXMnKTsKCQkJCSRkYXRhWyR0ZWFtLT5nZXROYW1lKCldWyRpXVsnbG9jYXRpb24nXSA9ICAiIjsKCQkJCSRkYXRhWyR0ZWFtLT5nZXROYW1lKCldWyRpXVsnZGVzY3JpcHRpb24nXSA9ICIiOwoJCQkJaWYgKCR0YWJsZWluZm9bJGldWydHYW1lSG9tZSddID09IGZhbHNlKSB7CgkJCQkJJGRhdGFbJHRlYW0tPmdldE5hbWUoKV1bJGldWydzdW1tYXJ5J10gPSAkdGFibGVpbmZvWyRpXVsnR2FtZU9wcG9uZW50J10uIiAtICIuJHRhYmxlaW5mb1skaV1bJ0dhbWVPdXJUZWFtJ107CgkJCQkJJGRhdGFbJHRlYW0tPmdldE5hbWUoKV1bJGldWydkZXNjcmlwdGlvbiddIC49ICR0aGlzLT5MYW5nKCdhd2F5Z2FtZScpOwoJCQkJfSBlbHNlIHsKCQkJCQkkZGF0YVskdGVhbS0+Z2V0TmFtZSgpXVskaV1bJ3N1bW1hcnknXSA9ICR0YWJsZWluZm9bJGldWydHYW1lT3VyVGVhbSddLiIgLSAiLiR0YWJsZWluZm9bJGldWydHYW1lT3Bwb25lbnQnXTsKCQkJCQkkZGF0YVskdGVhbS0+Z2V0TmFtZSgpXVskaV1bJ2Rlc2NyaXB0aW9uJ10gLj0gJHRoaXMtPkxhbmcoJ2hvbWVnYW1lJyk7CgkJCQl9CgkJCQkkZGF0YVskdGVhbS0+Z2V0TmFtZSgpXVskaV1bJ2Rlc2NyaXB0aW9uJ10gLj0gIjsgIi4kdGhpcy0+TGFuZygnaG9tZXRlYW0nKS4iOiAiLiR0YWJsZWluZm9bJGldWydHYW1lT3VyVGVhbSddOwoJCQkJJGRhdGFbJHRlYW0tPmdldE5hbWUoKV1bJGldWydkZXNjcmlwdGlvbiddIC49ICI7ICIuJHRoaXMtPkxhbmcoJ2F3YXl0ZWFtJykuIjogIi4kdGFibGVpbmZvWyRpXVsnR2FtZU9wcG9uZW50J107CgkJCQkkdGVtcHN0cmluZyA9ICRkYXRhWyR0ZWFtLT5nZXROYW1lKCldWyRpXVsnZGF0ZXN0YXJ0J107CgkJCQkkdGVtcHN0cmluZyAuPSAkdGFibGVpbmZvWyRpXVsnR2FtZU91clRlYW0nXTsJCQoJCQkJJHRlbXBzdHJpbmcgLj0gJHRhYmxlaW5mb1skaV1bJ0dhbWVPcHBvbmVudCddOwoJCQkJJGRhdGFbJHRlYW0tPmdldE5hbWUoKV1bJGldWydtZDVzdW0nXSA9IG1kNSgkdGVtcHN0cmluZyk7CgkJCX0KCQkJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdkYXRhJywgJGRhdGEpOwoJCX0KCQkKCQkvKiBYWFg6IERpcnR5IGhhY2sgLSBraWxsIGFsbCBwaHAgb3V0cHV0IGJ1ZmZlcnMgdG8gcHJldmVudCBvdXRwdXQgKi8KCQkkb3V0cHV0aGFuZGxlcnMgPSBvYl9saXN0X2hhbmRsZXJzKCk7CgkJZm9yICgkaSA9IDA7ICRpIDwgY291bnQoJG91dHB1dGhhbmRsZXJzKTsgJGkgPSAkaSArIDEpIHsKCQkJb2JfZW5kX2NsZWFuKCk7CgkJfQoJCQoJCS8qIEhUVFAgSGVhZGVyIGVyemV1Z2VuICovCgkJb2Jfc3RhcnQoKTsKCQloZWFkZXIoJ0NvbnRlbnQtVHlwZTogJy4kY29udGVudHR5cGVbJGxpbmt0eXBlXSk7CgkJaGVhZGVyKCdDb250ZW50LURpc3Bvc2l0aW9uOiBhdHRhY2htZW50O2ZpbGVuYW1lPSInLiR0ZWFtLT5nZXROYW1lKCkuJy4nLiRsaW5rdHlwZS4nIicpOwoJCWhlYWRlcignQ2FjaGUtQ29udHJvbDogbWF4LWFnZT0wJyk7CgoJCS8qIERhdGVuIGVpbmbDvGxsZW4gKi8KCQlpZiAoJGxpbmt0eXBlICE9ICdpY3MnKSB7CgkJCWlmICgkbGlua3R5cGUgPT0gJ3hscycpIHsKCQkJCSRleGNlbFdyaXRlciA9IFBIUEV4Y2VsX0lPRmFjdG9yeTo6Y3JlYXRlV3JpdGVyKCRleGNlbE9iaiwgIkV4Y2VsNSIpOwoJCQl9CgkJCWlmICgkbGlua3R5cGUgPT0gJ3hsc3gnKSB7CgkJCQkkZXhjZWxXcml0ZXIgPSBQSFBFeGNlbF9JT0ZhY3Rvcnk6OmNyZWF0ZVdyaXRlcigkZXhjZWxPYmosICJFeGNlbDIwMDciKTsKCQkJfQoJCQkkZXhjZWxXcml0ZXItPnNhdmUoInBocDovL291dHB1dCIpOwoJCX0gZWxzZSB7CgkJCSRpY3NTdHJpbmcgPSAgIkJFR0lOOlZDQUxFTkRBUlxuIjsKCQkJJGljc1N0cmluZyAuPSAiVkVSU0lPTjoyLjBcbiI7CgkJCSRpY3NTdHJpbmcgLj0gIk1FVEhPRDpQVUJMSVNIXG4iOwoJCQkkaWNzU3RyaW5nIC49ICJQUk9ESUQ6LS8vTW96aWxsYS5vcmcvTk9OU0dNTCBNb3ppbGxhIENhbGVuZGFyIFYxLjEvL0VOXG4iOwoJCQkkaWNzU3RyaW5nIC49ICJDQUxTQ0FMRTpHUkVHT1JJQU5cbiI7CgkJCWZvcmVhY2goJGRhdGFbJHRlYW0tPkdldE5hbWUoKV0gYXMgJGdhbWUpIHsKCQkJCSRpY3NTdHJpbmcgLj0gIkJFR0lOOlZFVkVOVFxuIjsKCQkJCSRpY3NTdHJpbmcgLj0gIkRUU1RBUlQ6Ii4kZ2FtZVsnZGF0ZXN0YXJ0J10uIlxuIjsKCQkJCSRpY3NTdHJpbmcgLj0gIkRURU5EOiIuJGdhbWVbJ2RhdGVlbmQnXS4iXG4iOwoJCQkJJGljc1N0cmluZyAuPSAiRFRTVEFNUDoiLiRnYW1lWydkYXRlc3RhbXAnXS4iXG4iOwoJCQkJJGljc1N0cmluZyAuPSAiTE9DQVRJT046Ii4kZ2FtZVsnbG9jYXRpb24nXS4iXG4iOwoJCQkJJGljc1N0cmluZyAuPSAiU1VNTUFSWToiLiRnYW1lWydzdW1tYXJ5J10uIlxuIjsKCQkJCSRpY3NTdHJpbmcgLj0gIlNFUVVFTkNFOjBcbiI7CgkJCQkkaWNzU3RyaW5nIC49ICJERVNDUklQVElPTjoiLiRnYW1lWydkZXNjcmlwdGlvbiddLiJcbiI7CgkJCQkkaWNzU3RyaW5nIC49ICJUUkFOU1A6T1BBUVVFIi4iXG4iOwoJCQkJJGljc1N0cmluZyAuPSAiVUlEOiIuJGdhbWVbJ21kNXN1bSddLiJcbiI7CgkJCQkkaWNzU3RyaW5nIC49ICJFTkQ6VkVWRU5UXG4iOwoJCQl9CgkJCSRpY3NTdHJpbmcuPSAiRU5EOlZDQUxFTkRBUiI7CgkJCSRmaWxlaGFuZGxlID0gZm9wZW4oInBocDovL291dHB1dCIsICJ3Iik7CgkJCWlmICgkZmlsZWhhbmRsZSAhPSBmYWxzZSkgewoJCQkJZndyaXRlKCRmaWxlaGFuZGxlLCRpY3NTdHJpbmcpOwoJCQl9CgkJfQoJCW9iX2VuZF9mbHVzaCgpOwoJCWV4aXQ7Cgl9CgoJLyogRXMgd3VyZGUga2VpbmUgV2ViYW5mcmFnZSBnZXN0ZWxsdCwgZGFoZXIgZWluZmFjaCBtaXQgQW56ZWlnZSBkZXMgTGlua3MgZm9ydGZhaHJlbiAqLwp9IGVsc2UgewoJLyogc2VhcmNoIGZvciB0ZWFtIGluc2lkZSB0aGUgZGF0YWJhc2UgKi8KCSR0ZWFtcyA9IERhdGFiYXNlT3BlcmF0aW9uczo6Z2V0QWxsVGVhbXMoKTsKCWZvcmVhY2ggKCR0ZWFtcyBhcyAkdGVtcHRlYW0pIHsKCQlpZiAoJHRlbXB0ZWFtLT5nZXROYW1lKCkgPT0gJHBhcmFtc1sndGVhbSddKSB7CgkJCSR0ZWFtID0gJHRlbXB0ZWFtOwoJCX0KCX0KCgkvKiBzZWFyY2ggZm9yIHNhaXNvbiBpbnNpZGUgdGhlIGRhdGFiYXNlICovCgkkc2Fpc29ucyA9IERhdGFiYXNlT3BlcmF0aW9uczo6Z2V0QWxsU2Fpc29ucygpOwoJZm9yZWFjaCAoJHNhaXNvbnMgYXMgJHRlbXBzYWlzb24pIHsKCQlpZiAoJHRlbXBzYWlzb24tPmdldE5hbWUoKSA9PSAkcGFyYW1zWydzYWlzb24nXSkgewoJCQkkc2Fpc29uID0gJHRlbXBzYWlzb247CgkJfQoJfQoKCS8qIHNlYXJjaCBmb3IgdGhlIHR5cGUgb2YgbGluayB0aGF0IHNob3VsZCBiZSBjcmVhdGVkICovCglmb3JlYWNoICgkbGlua3R5cGVzIGFzICR0ZW1wbGlua3R5cGUpIHsKCQlpZiAoJHRlbXBsaW5rdHlwZSA9PSAkcGFyYW1zWydsaW5rdHlwZSddKSB7CgkJCSRsaW5rdHlwZSA9ICR0ZW1wbGlua3R5cGU7CgkJfQoJfQoKCWlmIChpc3NldCgkc2Fpc29uKSAmJiBpc3NldCgkdGVhbSkgJiYgaXNzZXQoJGxpbmt0eXBlKSkgewoKCQkkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3hsc2Zvcm1zdGFydCcsICR0aGlzLT5DcmVhdGVGb3JtU3RhcnQoIiIsICJ4bHN0ZWFtdGFibGUiLCIiLCJnZXQiKSk7CgkJLyogWFhYOiBGaW5kIGEgYmV0dGVyIHdheSB0aGFuIGhpamFja2luZyAkdGhpcy0+c21hcnR5ICovCgkJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCd4bHNwYWdlaWQnLCAkdGhpcy0+Q3JlYXRlSW5wdXRIaWRkZW4oIiIsICJwYWdlIiwgJHRoaXMtPnNtYXJ0eS0+cGFyYW1zWydwYWdlJ10pKTsKCQkkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3hsc2Zvcm1saW5rdHlwZScsICR0aGlzLT5DcmVhdGVJbnB1dEhpZGRlbigiIiwgInhsc2xpbmt0eXBlIiwgJGxpbmt0eXBlKSk7CgkJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCd4bHNmb3JtdGVhbWlkJywgJHRoaXMtPkNyZWF0ZUlucHV0SGlkZGVuKCIiLCAieGxzdGVhbWlkIiwgJHRlYW0tPmdldElkKCkpKTsKCQkkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3hsc2Zvcm1zYWlzb25pZCcsICR0aGlzLT5DcmVhdGVJbnB1dEhpZGRlbigiIiwgInhsc3NhaXNvbmlkIiwgJHNhaXNvbi0+Z2V0SWQoKSkpOwoJCSR0aGlzLT5zbWFydHktPmFzc2lnbigneGxzZm9ybXN1Ym1pdCcsICR0aGlzLT5DcmVhdGVJbnB1dFN1Ym1pdCgiIiwgInhsc3N1Ym1pdCIsICR0ZWFtLT5nZXROYW1lKCkuIi4iLiRsaW5rdHlwZSkpOwoJCSR0aGlzLT5zbWFydHktPmFzc2lnbigneGxzZm9ybWVuZCcsICR0aGlzLT5DcmVhdGVGb3JtRW5kKCkpOwoKCQllY2hvICR0aGlzLT5Qcm9jZXNzVGVtcGxhdGUoJ3hsc2xpbmsudHBsJyk7Cgl9IGVsc2UgewoJCSR0aGlzLT5zbWFydHktPmFzc2lnbigndGl0bGVfZXJyb3InLCAkdGhpcy0+TGFuZygnZXJyb3J0YWcnKSk7CgkJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdtZXNzYWdlJywgJHRoaXMtPkxhbmcoJ2Vycm9yX3RlYW0nKS4kcGFyYW1zWyd0ZWFtJ10uIjxici8+Ii4kdGhpcy0+TGFuZygnZXJyb3Jfc2Fpc29uJykuJHBhcmFtc1snc2Fpc29uJ10uIjxici8+Ii4kdGhpcy0+TGFuZygnZXJyb3JfbGlua3R5cGUnKS4kcGFyYW1zWydsaW5rdHlwZSddKTsKCQllY2hvICR0aGlzLT5Qcm9jZXNzVGVtcGxhdGUoJ2Vycm9yLnRwbCcpOwoJfQp9Cgo/Pgo=]]></data>
	</file>
	<file>
	  <filename>/datamodel/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/datamodel/databaseoperations.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKcmVxdWlyZV9vbmNlKCdHYW1lLnBocCcpOwpyZXF1aXJlX29uY2UoJ1BsYXllci5waHAnKTsKcmVxdWlyZV9vbmNlKCdQbGF5ZXJUb1RlYW0ucGhwJyk7CnJlcXVpcmVfb25jZSgnUmVzdWx0LnBocCcpOwpyZXF1aXJlX29uY2UoJ1NhaXNvbi5waHAnKTsKcmVxdWlyZV9vbmNlKCdUZWFtLnBocCcpOwpyZXF1aXJlX29uY2UoJ1NldDEyMC5waHAnKTsKcmVxdWlyZV9vbmNlKCdNYXRjaDEyMC5waHAnKTsKCmNsYXNzIERhdGFiYXNlT3BlcmF0aW9ucwp7Cgljb25zdCBNYXRjaFRhYmxlMTIwID0gIm1hdGNoXzEyMCI7Cglwcml2YXRlIHN0YXRpYyAkTTEyMEZpZWxkcyA9IGFycmF5KCJpZCIsICJzcGllbHBsYW4iLCAib19jb3VudCIsICJwX2NvdW50IiwgInMxIiwgInMyIiwgInMzIiwgInM0Iik7Cglwcml2YXRlIHN0YXRpYyAkTTEyMEZpZWxkc1R5cGUgPSBhcnJheSAoCgkJImlkIiA9PiAiSTQgUFJJTUFSWSBBVVRPSU5DUkVNRU5UIE5PVE5VTEwiLAoJCSJzcGllbHBsYW4iID0+ICJJNCBOT1ROVUxMIiwKCQkib19jb3VudCIgPT4gIkkxIE5PVE5VTEwiLAoJCSJwX2NvdW50IiA9PiAiSTEgTk9UTlVMTCIsCgkJInMxIiA9PiAiSTQgTk9UTlVMTCIsCgkJInMyIiA9PiAiSTQgTk9UTlVMTCIsCgkJInMzIiA9PiAiSTQgTk9UTlVMTCIsCgkJInM0IiA9PiAiSTQgTk9UTlVMTCIsCgkpOwoJY29uc3QgU2V0VGFibGUxMjAgPSAic2FldHplXzEyMCI7Cglwcml2YXRlIHN0YXRpYyAkUzEyMEZpZWxkcyA9IGFycmF5KCJpZCIsICJzcGllbGVyIiwgInBfZ2VzIiwgInBfZmVobCIsICJwX2FiciIsICJvcHBvbmVudCIsICJvX2dlcyIsICJvX2FiciIsICJvX2ZlaGwiLCAicmVzY29uIik7Cglwcml2YXRlIHN0YXRpYyAkUzEyMEZpZWxkc1R5cGUgPSBhcnJheSgKCQkiaWQiID0+ICJJNCBQUklNQVJZIEFVVE9JTkNSRU1FTlQgTk9UTlVMTCIsIAoJCSJzcGllbGVyIiA9PiAiSTIgTk9UTlVMTCIsCgkJInBfZ2VzIiA9PiAiSTIgTk9UTlVMTCIsCgkJInBfZmVobCIgPT4gIkkyIE5PVE5VTEwiLAoJCSJwX2FiciIgPT4gIkkyIE5PVE5VTEwiLAoJCSJvcHBvbmVudCIgPT4gIkMoNTApIE5PVE5VTEwiLAoJCSJvX2dlcyIgPT4gIkkyIE5PVE5VTEwiLAoJCSJvX2FiciIgPT4gIkkyIE5PVE5VTEwiLAoJCSJvX2ZlaGwiID0+ICJJMiBOT1ROVUxMIiwKCQkicmVzY29uIiA9PiAiSTQiCgkpOwoJY29uc3QgR2FtZVRhYmxlID0gInNwaWVscGxhbiI7Cglwcml2YXRlIHN0YXRpYyAkR0ZpZWxkcyA9IGFycmF5KCJpZCIsICJvdXJfdGVhbSIsIm9wcG9uZW50IiwgImRhdGUiLCAiaG9tZSIsICJpc18xMjAiKTsKCXByaXZhdGUgc3RhdGljICRHRmllbGRzVHlwZSA9IGFycmF5KAoJCSJpZCIgPT4gIkk0IFBSSU1BUlkgQVVUT0lOQ1JFTUVOVCBOT1ROVUxMIiwKCQkib3VyX3RlYW0iID0+ICJJMiBOT1ROVUxMIiwKCQkib3Bwb25lbnQiID0+ICJDKDUwKSBOT1ROVUxMIiwKCQkiZGF0ZSIgPT4gImRhdGV0aW1lIE5PVE5VTEwiLAoJCSJob21lIiA9PiAiSTEgTk9UTlVMTCIsCgkJImlzXzEyMCIgPT4gIkkxIE5PVE5VTEwgREVGQVVMVCAwIgoJKTsKCWNvbnN0IFBsYXllclRhYmxlID0gInNwaWVsZXIiOwoJcHJpdmF0ZSBzdGF0aWMgJFBGaWVsZHMgPSBhcnJheSgiaWQiLCAibmFtZSIpOwoJcHJpdmF0ZSBzdGF0aWMgJFBGaWVsZHNUeXBlID0gYXJyYXkoCgkJImlkIiA9PiAiSTIgUFJJTUFSWSBBVVRPSU5DUkVNRU5UIE5PVE5VTEwiLAoJCSJuYW1lIiA9PiAiQyg1MCkgTk9UTlVMTCIKCSk7Cgljb25zdCBQbGF5ZXJUb1RlYW1UYWJsZSA9ICJzcGllbGVyX3p1X21hbm5zY2hhZnQiOwoJcHJpdmF0ZSBzdGF0aWMgJFBURmllbGRzID0gYXJyYXkoImlkIiwgInNwaWVsZXIiLCAic2Fpc29uIiwgIm1hbm5zY2hhZnQiKTsKCXByaXZhdGUgc3RhdGljICRQVEZpZWxkc1R5cGUgPSBhcnJheSgKCQkiaWQiID0+ICJJNCBQUklNQVJZIEFVVE9JTkNSRU1FTlQgTk9UTlVMTCIsIAoJCSJzcGllbGVyIiA9PiAiSTIgTk9UTlVMTCIsIAoJCSJzYWlzb24iID0+ICJJMiBOT1ROVUxMIiwgCgkJIm1hbm5zY2hhZnQiID0+ICJJMiBOT1ROVUxMIik7Cgljb25zdCBSZXN1bHRUYWJsZSA9ICJlaW56ZWxlcmdlYm5pc3NlIjsKCXByaXZhdGUgc3RhdGljICRSRmllbGRzID0gYXJyYXkoImlkIiwgInNwaWVsZXIiLCAic3BpZWxwbGFuIiwgInBfZ2VzIiwgInBfZmVobCIsICJwX2FiciIsICJwX2NvdW50IiwgIm9wcG9uZW50IiwgIm9fZ2VzIiwgIm9fYWJyIiwgIm9fZmVobCIsICJvX2NvdW50Iik7Cglwcml2YXRlIHN0YXRpYyAkUkZpZWxkc1R5cGUgPSBhcnJheSgKCQkiaWQiID0+ICJJNCBQUklNQVJZIEFVVE9JTkNSRU1FTlQgTk9UTlVMTCIsIAoJCSJzcGllbGVyIiA9PiAiSTIgTk9UTlVMTCIsCgkJInNwaWVscGxhbiIgPT4gIkk0IE5PVE5VTEwiLAoJCSJwX2dlcyIgPT4gIkkyIE5PVE5VTEwiLAoJCSJwX2ZlaGwiID0+ICJJMiBOT1ROVUxMIiwKCQkicF9hYnIiID0+ICJJMiBOT1ROVUxMIiwKCQkicF9jb3VudCIgPT4gIkkxIE5PVE5VTEwiLAoJCSJvcHBvbmVudCIgPT4gIkMoNTApIE5PVE5VTEwiLAoJCSJvX2dlcyIgPT4gIkkyIE5PVE5VTEwiLAoJCSJvX2FiciIgPT4gIkkyIE5PVE5VTEwiLAoJCSJvX2ZlaGwiID0+ICJJMiBOT1ROVUxMIiwKCQkib19jb3VudCIgPT4gIkkxIE5PVE5VTEwiCgkpOwoJY29uc3QgU2Fpc29uVGFibGUgPSAic2Fpc29uIjsKCXByaXZhdGUgc3RhdGljICRTRmllbGRzID0gYXJyYXkoImlkIiwgIm5hbWUiLCAiYmVnaW4iLCAiZW5kIik7Cglwcml2YXRlIHN0YXRpYyAkU0ZpZWxkc1R5cGUgPSBhcnJheSgKCQkiaWQiID0+ICJJMiBQUklNQVJZIEFVVE9JTkNSRU1FTlQgTk9UTlVMTCIsCgkJIm5hbWUiID0+ICJDKDUwKSBOT1ROVUxMIiwKCQkiYmVnaW4iID0+ICJkYXRldGltZSBOT1ROVUxMIiwKCQkiZW5kIiA9PiAiZGF0ZXRpbWUgTk9UTlVMTCIKCSk7Cgljb25zdCBUZWFtVGFibGUgPSAibWFubnNjaGFmdCI7Cglwcml2YXRlIHN0YXRpYyAkVEZpZWxkcyA9IGFycmF5KCJpZCIsICJuYW1lIik7Cglwcml2YXRlIHN0YXRpYyAkVEZpZWxkc1R5cGUgPSBhcnJheSgKCQkiaWQiID0+ICJJMiBQUklNQVJZIEFVVE9JTkNSRU1FTlQgTk9UTlVMTCIsCgkJIm5hbWUiID0+ICJDKDUwKSBOT1ROVUxMIgoJKTsKCQoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiB1cGRhdGVfbTBtMHAyX20wbTBwMygpCgl7CgkJJGdDbXMgPSAkR0xPQkFMU1snZ0NtcyddOwoJCWlmICgkZ0NtcykgewoJCQkkZGIgPSAkZ0Ntcy0+R2V0RGIoKTsKCQkJJGRiLT5FeGVjdXRlKCJSRU5BTUUgVEFCTEUgIi5zZWxmOjpSZXN1bHRUYWJsZS4iIFRPICIuY21zX2RiX3ByZWZpeCgpLnNlbGY6OlJlc3VsdFRhYmxlKTsKCQkJJGRiLT5FeGVjdXRlKCJSRU5BTUUgVEFCTEUgIi5zZWxmOjpHYW1lVGFibGUuIiBUTyAiLmNtc19kYl9wcmVmaXgoKS5zZWxmOjpHYW1lVGFibGUpOwoJCQkkZGItPkV4ZWN1dGUoIlJFTkFNRSBUQUJMRSAiLnNlbGY6OlBsYXllclRvVGVhbVRhYmxlLiIgVE8gIi5jbXNfZGJfcHJlZml4KCkuc2VsZjo6UGxheWVyVG9UZWFtVGFibGUpOwoJCQkkZGItPkV4ZWN1dGUoIlJFTkFNRSBUQUJMRSAiLnNlbGY6OlRlYW1UYWJsZS4iIFRPICIuY21zX2RiX3ByZWZpeCgpLnNlbGY6OlRlYW1UYWJsZSk7CgkJCSRkYi0+RXhlY3V0ZSgiUkVOQU1FIFRBQkxFICIuc2VsZjo6U2Fpc29uVGFibGUuIiBUTyAiLmNtc19kYl9wcmVmaXgoKS5zZWxmOjpTYWlzb25UYWJsZSk7CgkJCSRkYi0+RXhlY3V0ZSgiUkVOQU1FIFRBQkxFICIuc2VsZjo6UGxheWVyVGFibGUuIiBUTyAiLmNtc19kYl9wcmVmaXgoKS5zZWxmOjpQbGF5ZXJUYWJsZSk7CgkJfQoJfQoJCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHVwZGF0ZV9tMG0wcDdfbTBtMHA4KCkKCXsKCQkkZ0NtcyA9ICRHTE9CQUxTWydnQ21zJ107CgkJaWYgKCRnQ21zKSB7CgkJCSRkYiA9ICRnQ21zLT5HZXREYigpOwoJCQkKCQkJLyogdGhlcmUgd2FzIGEgZGF0YWJhc2UgYmVmb3JlIHRoaXMgcGx1Z2luIGhhcyBldmVyIGV4c2l0ZWQgYW5kIHRoZSBmaWVsZCBkZWZpbml0aW9uIHdhcwoJCQkgKiBzbGlnaHRseSBkaWZmZXJlbnQuIER1cmluZyBub3JtYWwgd29yayB0aGlzIG1ha2VzIG5vIGRpZmZlcmVuY2UgYnV0IGluc2VydGluZyB0aGUgZGVzY3JpcHRpb25zCgkJCSAqIGZvciAxMjAgYmFsbCBnYW1lIG1ha2VzIGl0IHZlcnkgaGFyZCB0byBkZWFsIHdpdGggdGhhdCBkYXRhYmFzZS4gVGhlcmVmb3JlIGl0IGlzIHRoZSBlYXNpZXN0IHdheQoJCQkgKiB0byBkdW1wIHRoZSBkYXRhIGludG8gYXJyYXlzIGFuZCBkcm9wIHRoZSBkYXRhYmFzZXRhYmxlcyBhbmQgY3JlYXRlIHRoZW0gbmV3LiAqLwoJCQkKCQkJLyogc2F2ZSBwbGF5ZXJzIHRvIGZpbGVzICovCgkJCSRwbGF5ZXIgPSAkZGItPkV4ZWN1dGUoIlNFTEVDVCAqIEZST00gIi5jbXNfZGJfcHJlZml4KCkuc2VsZjo6UGxheWVyVGFibGUpOwoJCQkkcGxheWVyX3ZhbHVlcyA9ICIiOwoJCQlmb3IgKCRpID0gMDsgJGkgPCAkcGxheWVyLT5SZWNvcmRDb3VudCgpOyAkaSA9ICRpICsgMSkgewoJCQkJJHBsYXllcl92YWx1ZXMgLj0gIigiOwoJCQkJJGxpbmV2YWx1ZSA9ICRwbGF5ZXItPkZldGNoUm93KCk7CgkJCQkkcGxheWVyX3ZhbHVlcyAuPSAkbGluZXZhbHVlW3NlbGY6OiRQRmllbGRzWzBdXS4iLCI7CgkJCQkkcGxheWVyX3ZhbHVlcyAuPSAiJyIuJGxpbmV2YWx1ZVtzZWxmOjokUEZpZWxkc1sxXV0uIiciOwoJCQkJJHBsYXllcl92YWx1ZXMgLj0gIiksIjsKCQkJfQoJCQkKCQkJLyogc2F2ZSBzYWlzb25zIHRvIGZpbGUgKi8KCQkJJHNhaXNvbiA9ICRkYi0+RXhlY3V0ZSgiU0VMRUNUICogRlJPTSAiLmNtc19kYl9wcmVmaXgoKS5zZWxmOjpTYWlzb25UYWJsZSk7CgkJCSRzYWlzb25fdmFsdWVzID0gIiI7CgkJCWZvciAoJGkgPSAwOyAkaSA8ICRzYWlzb24tPlJlY29yZENvdW50KCk7ICRpID0gJGkgKyAxKSB7CgkJCQkkc2Fpc29uX3ZhbHVlcyAuPSAiKCI7CgkJCQkkbGluZXZhbHVlID0gJHNhaXNvbi0+RmV0Y2hSb3coKTsKCQkJCSRzYWlzb25fdmFsdWVzIC49ICRsaW5ldmFsdWVbc2VsZjo6JFNGaWVsZHNbMF1dLiIsIjsKCQkJCSRzYWlzb25fdmFsdWVzIC49ICInIi4kbGluZXZhbHVlW3NlbGY6OiRTRmllbGRzWzFdXS4iJywgIjsKCQkJCSRzYWlzb25fdmFsdWVzIC49ICInIi4kbGluZXZhbHVlW3NlbGY6OiRTRmllbGRzWzJdXS4iJywgIjsKCQkJCSRzYWlzb25fdmFsdWVzIC49ICInIi4kbGluZXZhbHVlW3NlbGY6OiRTRmllbGRzWzNdXS4iJyI7CgkJCQkkc2Fpc29uX3ZhbHVlcyAuPSAiKSwiOwoJCQl9CgkJCQoJCQkvKiBzYXZlIHRlYW1zIHRvIGZpbGUgKi8KCQkJJHRlYW0gPSAkZGItPkV4ZWN1dGUoIlNFTEVDVCAqIEZST00gIi5jbXNfZGJfcHJlZml4KCkuc2VsZjo6VGVhbVRhYmxlKTsKCQkJJHRlYW1fdmFsdWVzID0gIiI7CgkJCWZvciAoJGkgPSAwOyAkaSA8ICR0ZWFtLT5SZWNvcmRDb3VudCgpOyAkaSA9ICRpICsgMSkgewoJCQkJJHRlYW1fdmFsdWVzIC49ICIoIjsKCQkJCSRsaW5ldmFsdWUgPSAkdGVhbS0+RmV0Y2hSb3coKTsKCQkJCSR0ZWFtX3ZhbHVlcyAuPSAkbGluZXZhbHVlW3NlbGY6OiRURmllbGRzWzBdXS4iLCI7CgkJCQkkdGVhbV92YWx1ZXMgLj0gIiciLiRsaW5ldmFsdWVbc2VsZjo6JFRGaWVsZHNbMV1dLiInIjsKCQkJCSR0ZWFtX3ZhbHVlcyAuPSAiKSwiOwoJCQl9CgkJCQoJCQkKCQkJLyogc2F2ZSBwbGF5ZXIgdG8gdGVhbXMgdG8gZmlsZSAqLwoJCQkkcGxheWVydG90ZWFtID0gJGRiLT5FeGVjdXRlKCJTRUxFQ1QgKiBGUk9NICIuY21zX2RiX3ByZWZpeCgpLnNlbGY6OlBsYXllclRvVGVhbVRhYmxlKTsKCQkJJHB0dF92YWx1ZXMgPSAiIjsKCQkJZm9yICgkaSA9IDA7ICRpIDwgJHBsYXllcnRvdGVhbS0+UmVjb3JkQ291bnQoKTsgJGkgPSAkaSArIDEpIHsKCQkJCSRwdHRfdmFsdWVzIC49ICIoIjsKCQkJCSRsaW5ldmFsdWUgPSAkcGxheWVydG90ZWFtLT5GZXRjaFJvdygpOwoJCQkJJHB0dF92YWx1ZXMgLj0gJGxpbmV2YWx1ZVtzZWxmOjokUFRGaWVsZHNbMF1dLiIsIjsKCQkJCSRwdHRfdmFsdWVzIC49ICRsaW5ldmFsdWVbc2VsZjo6JFBURmllbGRzWzFdXS4iLCI7CgkJCQkkcHR0X3ZhbHVlcyAuPSAkbGluZXZhbHVlW3NlbGY6OiRQVEZpZWxkc1syXV0uIiwiOwoJCQkJJHB0dF92YWx1ZXMgLj0gJGxpbmV2YWx1ZVtzZWxmOjokUFRGaWVsZHNbM11dOwoJCQkJJHB0dF92YWx1ZXMgLj0gIiksIjsKCQkJfQoJCQkKCQkJLyogc2F2ZSBnYW1lcyB0byBmaWxlICovCgkJCSRnYW1lID0gJGRiLT5FeGVjdXRlKCJTRUxFQ1QgKiBGUk9NICIuY21zX2RiX3ByZWZpeCgpLnNlbGY6OkdhbWVUYWJsZSk7CgkJCSRnYW1lX3ZhbHVlcyA9ICIiOwoJCQlmb3IgKCRpID0gMDsgJGkgPCAkZ2FtZS0+UmVjb3JkQ291bnQoKTsgJGkgPSAkaSArIDEpIHsKCQkJCSRnYW1lX3ZhbHVlcyAuPSAiKCI7CgkJCQkkbGluZXZhbHVlID0gJGdhbWUtPkZldGNoUm93KCk7CgkJCQkkZ2FtZV92YWx1ZXMgLj0gJGxpbmV2YWx1ZVtzZWxmOjokR0ZpZWxkc1swXV0uIiwiOwoJCQkJJGdhbWVfdmFsdWVzIC49ICRsaW5ldmFsdWVbc2VsZjo6JEdGaWVsZHNbMV1dLiIsIjsKCQkJCSRnYW1lX3ZhbHVlcyAuPSAiJyIuJGxpbmV2YWx1ZVtzZWxmOjokR0ZpZWxkc1syXV0uIicsIjsKCQkJCSRnYW1lX3ZhbHVlcyAuPSAiJyIuJGxpbmV2YWx1ZVtzZWxmOjokR0ZpZWxkc1szXV0uIicsIjsKCQkJCSRnYW1lX3ZhbHVlcyAuPSAkbGluZXZhbHVlW3NlbGY6OiRHRmllbGRzWzRdXS4iLCI7CgkJCQkkZ2FtZV92YWx1ZXMgLj0gIjAiOyAvKiBuZXcgdmFsdWUgZm9yIGdhbWVzIC0gaXQgbWF5IGJlIDEyMCBvciBub3JtYWwgZ2FtZSAtIG9sZCBnYW1lcyBhcmUgYWx3YXlzIG5vcm1hbCBnYW1lcyAqLwoJCQkJJGdhbWVfdmFsdWVzIC49ICIpLCI7CgkJCX0KCQkJCgkJCS8qIHNhdmUgcmVzdWx0cyB0byBmaWxlICovCgkJCSRyZXN1bHQgPSAkZGItPkV4ZWN1dGUoIlNFTEVDVCAqIEZST00gIi5jbXNfZGJfcHJlZml4KCkuc2VsZjo6UmVzdWx0VGFibGUpOwoJCQkkcmVzdWx0X3ZhbHVlcyA9ICIiOwoJCQlmb3IgKCRpID0gMDsgJGkgPCAkcmVzdWx0LT5SZWNvcmRDb3VudCgpOyAkaSA9ICRpICsgMSkgewoJCQkJJHJlc3VsdF92YWx1ZXMgLj0gIigiOwoJCQkJJGxpbmV2YWx1ZSA9ICRyZXN1bHQtPkZldGNoUm93KCk7CgkJCQkkcmVzdWx0X3ZhbHVlcyAuPSAkbGluZXZhbHVlW3NlbGY6OiRSRmllbGRzWzBdXS4iLCI7CgkJCQkkcmVzdWx0X3ZhbHVlcyAuPSAkbGluZXZhbHVlW3NlbGY6OiRSRmllbGRzWzFdXS4iLCI7CgkJCQkkcmVzdWx0X3ZhbHVlcyAuPSAkbGluZXZhbHVlW3NlbGY6OiRSRmllbGRzWzJdXS4iLCI7CgkJCQkkcmVzdWx0X3ZhbHVlcyAuPSAkbGluZXZhbHVlW3NlbGY6OiRSRmllbGRzWzNdXS4iLCI7CgkJCQkkcmVzdWx0X3ZhbHVlcyAuPSAkbGluZXZhbHVlW3NlbGY6OiRSRmllbGRzWzRdXS4iLCI7CgkJCQkkcmVzdWx0X3ZhbHVlcyAuPSAkbGluZXZhbHVlW3NlbGY6OiRSRmllbGRzWzVdXS4iLCI7CgkJCQkkcmVzdWx0X3ZhbHVlcyAuPSAkbGluZXZhbHVlW3NlbGY6OiRSRmllbGRzWzZdXS4iLCI7CgkJCQkkcmVzdWx0X3ZhbHVlcyAuPSAiJyIuJGxpbmV2YWx1ZVtzZWxmOjokUkZpZWxkc1s3XV0uIicsIjsKCQkJCSRyZXN1bHRfdmFsdWVzIC49ICRsaW5ldmFsdWVbc2VsZjo6JFJGaWVsZHNbOF1dLiIsIjsKCQkJCSRyZXN1bHRfdmFsdWVzIC49ICRsaW5ldmFsdWVbc2VsZjo6JFJGaWVsZHNbOV1dLiIsIjsKCQkJCSRyZXN1bHRfdmFsdWVzIC49ICRsaW5ldmFsdWVbc2VsZjo6JFJGaWVsZHNbMTBdXS4iLCI7CgkJCQkkcmVzdWx0X3ZhbHVlcyAuPSAkbGluZXZhbHVlW3NlbGY6OiRSRmllbGRzWzExXV07CgkJCQkkcmVzdWx0X3ZhbHVlcyAuPSAiKSwiOwoJCQl9CgkJCQoJCQkvKiBkcm9wIG9sZCB0YWJsZXMgKi8KCQkJRGF0YWJhc2VPcGVyYXRpb25zOjpkZWxldGVEYXRhYmFzZSgpOwoJCQkKCQkJLyogY3JlYXRlIG5ldyB0YWJsZXMgKi8KCQkJRGF0YWJhc2VPcGVyYXRpb25zOjpjcmVhdGVEYXRhYmFzZSgpOwoJCQkKCQkJLyogZmlsbCBpbiBwbGF5ZXJzICovCgkJCSRzcWxzdHJpbmcgPSAiSU5TRVJUIElOVE8gIi5jbXNfZGJfcHJlZml4KCkuc2VsZjo6UGxheWVyVGFibGUuIiAoIi5zZWxmOjokUEZpZWxkc1swXS4iLCAiLnNlbGY6OiRQRmllbGRzWzFdLiIpIFZBTFVFUyAiOwoJCQkkc3Fsc3RyaW5nIC49IHN1YnN0cigkcGxheWVyX3ZhbHVlcywgMCwgLTEpOwoJCQkkZGItPkV4ZWN1dGUoJHNxbHN0cmluZyk7CgkJCQoJCQkvKiBmaWxsIGluIHNhaXNvbnMgKi8KCQkJJHNxbHN0cmluZyA9ICJJTlNFUlQgSU5UTyAiLmNtc19kYl9wcmVmaXgoKS5zZWxmOjpTYWlzb25UYWJsZS4iICgiLnNlbGY6OiRTRmllbGRzWzBdLiIsICIuc2VsZjo6JFBGaWVsZHNbMV0uIiwgIi5zZWxmOjokU0ZpZWxkc1syXS4iLCAiLnNlbGY6OiRTRmllbGRzWzNdLiIpIFZBTFVFUyAiOwoJCQkkc3Fsc3RyaW5nIC49IHN1YnN0cigkc2Fpc29uX3ZhbHVlcywgMCwgLTEpOwoJCQkkZGItPkV4ZWN1dGUoJHNxbHN0cmluZyk7CgkJCQoJCQkvKiBmaWxsIGluIHRlYW1zICovCgkJCSRzcWxzdHJpbmcgPSAiSU5TRVJUIElOVE8gIi5jbXNfZGJfcHJlZml4KCkuc2VsZjo6VGVhbVRhYmxlLiIgKCIuc2VsZjo6JFRGaWVsZHNbMF0uIiwgIi5zZWxmOjokVEZpZWxkc1sxXS4iKSBWQUxVRVMgIjsKCQkJJHNxbHN0cmluZyAuPSBzdWJzdHIoJHRlYW1fdmFsdWVzLCAwLCAtMSk7CgkJCSRkYi0+RXhlY3V0ZSgkc3Fsc3RyaW5nKTsKCQkJCgkJCS8qIGZpbGwgaW4gcGxheWVyIHRvIHRlYW0gKi8KCQkJJHNxbHN0cmluZyA9ICJJTlNFUlQgSU5UTyAiLmNtc19kYl9wcmVmaXgoKS5zZWxmOjpQbGF5ZXJUb1RlYW1UYWJsZS4iICgiLnNlbGY6OiRQVEZpZWxkc1swXS4iLCAiLnNlbGY6OiRQVEZpZWxkc1sxXS4iLCAiLnNlbGY6OiRQVEZpZWxkc1syXS4iLCAiLnNlbGY6OiRQVEZpZWxkc1szXS4iKSBWQUxVRVMgIjsKCQkJJHNxbHN0cmluZyAuPSBzdWJzdHIoJHB0dF92YWx1ZXMsIDAsIC0xKTsKCQkJJGRiLT5FeGVjdXRlKCRzcWxzdHJpbmcpOwoJCQkKCQkJLyogZmlsbCBpbiBnYW1lcyAqLwoJCQkkc3Fsc3RyaW5nID0gIklOU0VSVCBJTlRPICIuY21zX2RiX3ByZWZpeCgpLnNlbGY6OkdhbWVUYWJsZS4iICgiLnNlbGY6OiRHRmllbGRzWzBdLiIsICIuc2VsZjo6JEdGaWVsZHNbMV0uIiwgIi5zZWxmOjokR0ZpZWxkc1syXS4iLCAiLnNlbGY6OiRHRmllbGRzWzNdLiIsICIuc2VsZjo6JEdGaWVsZHNbNF0uIiwgIi5zZWxmOjokR0ZpZWxkc1s1XS4iKSBWQUxVRVMgIjsKCQkJJHNxbHN0cmluZyAuPSBzdWJzdHIoJGdhbWVfdmFsdWVzLCAwLCAtMSk7CgkJCSRkYi0+RXhlY3V0ZSgkc3Fsc3RyaW5nKTsKCQkJCgkJCS8qIGZpbGwgaW4gcmVzdWx0cyAqLwoJCQkkc3Fsc3RyaW5nID0gIklOU0VSVCBJTlRPICIuY21zX2RiX3ByZWZpeCgpLnNlbGY6OlJlc3VsdFRhYmxlLiIgKCIuc2VsZjo6JFJGaWVsZHNbMF0uIiwgIi5zZWxmOjokUkZpZWxkc1sxXS4iLCAiLnNlbGY6OiRSRmllbGRzWzJdLiIsICIuc2VsZjo6JFJGaWVsZHNbM10uIiwgIi5zZWxmOjokUkZpZWxkc1s0XS4iLCAiLnNlbGY6OiRSRmllbGRzWzVdLiIsICIuc2VsZjo6JFJGaWVsZHNbNl0uIiwgIi5zZWxmOjokUkZpZWxkc1s3XS4iLCAiLnNlbGY6OiRSRmllbGRzWzhdLiIsICIuc2VsZjo6JFJGaWVsZHNbOV0uIiwgIi5zZWxmOjokUkZpZWxkc1sxMF0uIiwgIi5zZWxmOjokUkZpZWxkc1sxMV0uIikgVkFMVUVTICI7CgkJCSRzcWxzdHJpbmcgLj0gc3Vic3RyKCRyZXN1bHRfdmFsdWVzLCAwLCAtMSk7CgkJCSRkYi0+RXhlY3V0ZSgkc3Fsc3RyaW5nKTsKCQl9Cgl9CgkKCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gY3JlYXRlRGF0YWJhc2UoKQoJewoJCSRnQ21zID0gJEdMT0JBTFNbJ2dDbXMnXTsKCQlpZiAoJGdDbXMpIHsKCQkJJGRiID0gJGdDbXMtPkdldERiKCk7CgkJCQoJCQkvKiBjb25maWd1cmF0aW9uIHp1bSBhbmxlZ2VuIGVyemV1Z2VuICovCgkJCSRjb25maWdzID0gYXJyYXkoCgkJCQljbXNfZGJfcHJlZml4KCkuc2VsZjo6UGxheWVyVGFibGUgPT4gYXJyYXkoImZpZWxkcyIgPT4gc2VsZjo6JFBGaWVsZHMsICdkZXNjcycgPT4gc2VsZjo6JFBGaWVsZHNUeXBlKSwKCQkJCWNtc19kYl9wcmVmaXgoKS5zZWxmOjpTYWlzb25UYWJsZSA9PiBhcnJheSgiZmllbGRzIiA9PiBzZWxmOjokU0ZpZWxkcywgJ2Rlc2NzJyA9PiBzZWxmOjokU0ZpZWxkc1R5cGUpLAoJCQkJY21zX2RiX3ByZWZpeCgpLnNlbGY6OlRlYW1UYWJsZSA9PiBhcnJheSgiZmllbGRzIiA9PiBzZWxmOjokVEZpZWxkcywgJ2Rlc2NzJyA9PiBzZWxmOjokVEZpZWxkc1R5cGUpLAoJCQkJY21zX2RiX3ByZWZpeCgpLnNlbGY6OlBsYXllclRvVGVhbVRhYmxlID0+IGFycmF5KCJmaWVsZHMiID0+IHNlbGY6OiRQVEZpZWxkcywgJ2Rlc2NzJyA9PiBzZWxmOjokUFRGaWVsZHNUeXBlKSwKCQkJCWNtc19kYl9wcmVmaXgoKS5zZWxmOjpHYW1lVGFibGUgPT4gYXJyYXkoImZpZWxkcyIgPT4gc2VsZjo6JEdGaWVsZHMsICdkZXNjcycgPT4gc2VsZjo6JEdGaWVsZHNUeXBlKSwKCQkJCWNtc19kYl9wcmVmaXgoKS5zZWxmOjpSZXN1bHRUYWJsZSA9PiBhcnJheSgiZmllbGRzIiA9PiBzZWxmOjokUkZpZWxkcywgJ2Rlc2NzJyA9PiBzZWxmOjokUkZpZWxkc1R5cGUpLAoJCQkJY21zX2RiX3ByZWZpeCgpLnNlbGY6OlNldFRhYmxlMTIwID0+IGFycmF5KCJmaWVsZHMiID0+IHNlbGY6OiRTMTIwRmllbGRzLCAnZGVzY3MnID0+IHNlbGY6OiRTMTIwRmllbGRzVHlwZSksCgkJCQljbXNfZGJfcHJlZml4KCkuc2VsZjo6TWF0Y2hUYWJsZTEyMCA9PiBhcnJheSgiZmllbGRzIiA9PiBzZWxmOjokTTEyMEZpZWxkcywgJ2Rlc2NzJyA9PiBzZWxmOjokTTEyMEZpZWxkc1R5cGUpLAoJCQkpOwoJCQkKCQkJLyogZnJlbWRzY2hsw7xzc2VsaW5mb3JtYXRpb25lbiBlaW5icmluZ2VuICovCgkJCSRjb25maWdzW2Ntc19kYl9wcmVmaXgoKS5zZWxmOjpNYXRjaFRhYmxlMTIwXVsibXlzcWxfY29uc3RyYWludHMiXSA9IAoJCQkJJywgRk9SRUlHTiBLRVkoJy5zZWxmOjokTTEyMEZpZWxkc1sxXS4nKSBSRUZFUkVOQ0VTICcuY21zX2RiX3ByZWZpeCgpLnNlbGY6OkdhbWVUYWJsZS4nKCcuc2VsZjo6JEdGaWVsZHNbMF0uJykgT04gREVMRVRFIENBU0NBREUgT04gVVBEQVRFIENBU0NBREUnLgoJCQkJJywgRk9SRUlHTiBLRVkoJy5zZWxmOjokTTEyMEZpZWxkc1s0XS4nKSBSRUZFUkVOQ0VTICcuY21zX2RiX3ByZWZpeCgpLnNlbGY6OlNldFRhYmxlMTIwLicoJy5zZWxmOjokUzEyMEZpZWxkc1swXS4nKSBPTiBERUxFVEUgQ0FTQ0FERSBPTiBVUERBVEUgQ0FTQ0FERScuCgkJCQknLCBGT1JFSUdOIEtFWSgnLnNlbGY6OiRNMTIwRmllbGRzWzVdLicpIFJFRkVSRU5DRVMgJy5jbXNfZGJfcHJlZml4KCkuc2VsZjo6U2V0VGFibGUxMjAuJygnLnNlbGY6OiRTMTIwRmllbGRzWzBdLicpIE9OIERFTEVURSBDQVNDQURFIE9OIFVQREFURSBDQVNDQURFJy4KCQkJCScsIEZPUkVJR04gS0VZKCcuc2VsZjo6JE0xMjBGaWVsZHNbNl0uJykgUkVGRVJFTkNFUyAnLmNtc19kYl9wcmVmaXgoKS5zZWxmOjpTZXRUYWJsZTEyMC4nKCcuc2VsZjo6JFMxMjBGaWVsZHNbMF0uJykgT04gREVMRVRFIENBU0NBREUgT04gVVBEQVRFIENBU0NBREUnLgoJCQkJJywgRk9SRUlHTiBLRVkoJy5zZWxmOjokTTEyMEZpZWxkc1s3XS4nKSBSRUZFUkVOQ0VTICcuY21zX2RiX3ByZWZpeCgpLnNlbGY6OlNldFRhYmxlMTIwLicoJy5zZWxmOjokUzEyMEZpZWxkc1swXS4nKSBPTiBERUxFVEUgQ0FTQ0FERSBPTiBVUERBVEUgQ0FTQ0FERSc7CgkJCSRjb25maWdzW2Ntc19kYl9wcmVmaXgoKS5zZWxmOjpTZXRUYWJsZTEyMF1bIm15c3FsX2NvbnN0cmFpbnRzIl0gPSAKCQkJCScsIEZPUkVJR04gS0VZKCcuc2VsZjo6JFMxMjBGaWVsZHNbMV0uJykgUkVGRVJFTkNFUyAnLmNtc19kYl9wcmVmaXgoKS5zZWxmOjpQbGF5ZXJUYWJsZS4nKCcuc2VsZjo6JFBGaWVsZHNbMF0uJykgT04gREVMRVRFIENBU0NBREUgT04gVVBEQVRFIENBU0NBREUnOwoJCQkkY29uZmlnc1tjbXNfZGJfcHJlZml4KCkuc2VsZjo6R2FtZVRhYmxlXVsibXlzcWxfY29uc3RyYWludHMiXSA9ICcsIEZPUkVJR04gS0VZKCcuc2VsZjo6JEdGaWVsZHNbMV0uJykgUkVGRVJFTkNFUyAnLmNtc19kYl9wcmVmaXgoKS5zZWxmOjpUZWFtVGFibGUuJygnLnNlbGY6OiRURmllbGRzWzBdLicpIE9OIERFTEVURSBDQVNDQURFIE9OIFVQREFURSBDQVNDQURFJzsKCQkJJGNvbmZpZ3NbY21zX2RiX3ByZWZpeCgpLnNlbGY6OlBsYXllclRvVGVhbVRhYmxlXVsibXlzcWxfY29uc3RyYWludHMiXSA9IAoJCQkJJywgRk9SRUlHTiBLRVkoJy5zZWxmOjokUFRGaWVsZHNbMV0uJykgUkVGRVJFTkNFUyAnLmNtc19kYl9wcmVmaXgoKS5zZWxmOjpQbGF5ZXJUYWJsZS4nKCcuc2VsZjo6JFBGaWVsZHNbMF0uJykgT04gREVMRVRFIENBU0NBREUgT04gVVBEQVRFIENBU0NBREUnLgoJCQkJJywgRk9SRUlHTiBLRVkoJy5zZWxmOjokUFRGaWVsZHNbMl0uJykgUkVGRVJFTkNFUyAnLmNtc19kYl9wcmVmaXgoKS5zZWxmOjpTYWlzb25UYWJsZS4nKCcuc2VsZjo6JFNGaWVsZHNbMF0uJykgT04gREVMRVRFIENBU0NBREUgT04gVVBEQVRFIENBU0NBREUnLgoJCQkJJywgRk9SRUlHTiBLRVkoJy5zZWxmOjokUFRGaWVsZHNbM10uJykgUkVGRVJFTkNFUyAnLmNtc19kYl9wcmVmaXgoKS5zZWxmOjpUZWFtVGFibGUuJygnLnNlbGY6OiRURmllbGRzWzBdLicpIE9OIERFTEVURSBDQVNDQURFIE9OIFVQREFURSBDQVNDQURFJzsKCQkJJGNvbmZpZ3NbY21zX2RiX3ByZWZpeCgpLnNlbGY6OlJlc3VsdFRhYmxlXVsibXlzcWxfY29uc3RyYWludHMiXSA9IAoJCQkJJywgRk9SRUlHTiBLRVkoJy5zZWxmOjokUkZpZWxkc1sxXS4nKSBSRUZFUkVOQ0VTICcuY21zX2RiX3ByZWZpeCgpLnNlbGY6OlBsYXllclRhYmxlLicoJy5zZWxmOjokUEZpZWxkc1swXS4nKSBPTiBERUxFVEUgQ0FTQ0FERSBPTiBVUERBVEUgQ0FTQ0FERScuCgkJCQknLCBGT1JFSUdOIEtFWSgnLnNlbGY6OiRSRmllbGRzWzJdLicpIFJFRkVSRU5DRVMgJy5jbXNfZGJfcHJlZml4KCkuc2VsZjo6R2FtZVRhYmxlLicoJy5zZWxmOjokR0ZpZWxkc1swXS4nKSBPTiBERUxFVEUgQ0FTQ0FERSBPTiBVUERBVEUgQ0FTQ0FERSc7CgkJCQkKCQkJLyogdGFiZWxsZW4gYW5sZWdlbiAqLwoJCQlmb3JlYWNoICgkY29uZmlncyBhcyAkY29uZmlnID0+ICRkdW1teSkgewoJCQkJJHRhYiA9IE5ld0RhdGFEaWN0aW9uYXJ5KCRkYik7CgkJCQkkdGFib3B0ID0gYXJyYXkoJ215c3FsJyA9PiAnRU5HSU5FPUlubm9EQiBERUZBVUxUIENIQVJTRVQ9bGF0aW4xJyk7CgkJCQkkdGFiZmllbGRzID0gIiI7CgkJCQlmb3JlYWNoKCRjb25maWdzWyRjb25maWddWydmaWVsZHMnXSBhcyAkZmllbGQpIHsKCQkJCQkkdGFiZmllbGRzIC49ICRmaWVsZC4iICIuJGNvbmZpZ3NbJGNvbmZpZ11bJ2Rlc2NzJ11bJGZpZWxkXS4iLCI7CgkJCQl9CgkJCQlpZiAoaXNzZXQoJGNvbmZpZ3NbJGNvbmZpZ11bIm15c3FsX2NvbnN0cmFpbnRzIl0pKSB7CgkJCQkJJHRhYm9wdFsnY29uc3RyYWludHMnXSA9ICRjb25maWdzWyRjb25maWddWyJteXNxbF9jb25zdHJhaW50cyJdOwoJCQkJfQoJCQkJJHRhYmZpZWxkcyA9IHN1YnN0cigkdGFiZmllbGRzLDAsc3RybGVuKCR0YWJmaWVsZHMpLTEpOwoJCQkJJHNxbGFycmF5ID0gJHRhYi0+Q3JlYXRlVGFibGVTUUwoJGNvbmZpZywkdGFiZmllbGRzLCR0YWJvcHQpOwoJCQkJJHRhYi0+RXhlY3V0ZVNRTEFycmF5KCRzcWxhcnJheSk7CgkJCX0KCQl9Cgl9CgkKCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZGVsZXRlRGF0YWJhc2UoKQoJewoJCSRnQ21zID0gJEdMT0JBTFNbJ2dDbXMnXTsKCQlpZiAoJGdDbXMpIHsKCQkJJGRiID0gJGdDbXMtPkdldERiKCk7CgkJfQoJCQoJCS8qIGRlZmluZSB0YWJsZXMgdG8gZHJvcCAqLwoJCSRjb25maWdzID0gYXJyYXkoY21zX2RiX3ByZWZpeCgpLnNlbGY6OlBsYXllclRvVGVhbVRhYmxlLCBjbXNfZGJfcHJlZml4KCkuc2VsZjo6UmVzdWx0VGFibGUsIGNtc19kYl9wcmVmaXgoKS5zZWxmOjpTZXRUYWJsZTEyMCwgY21zX2RiX3ByZWZpeCgpLnNlbGY6Ok1hdGNoVGFibGUxMjAsIGNtc19kYl9wcmVmaXgoKS5zZWxmOjpHYW1lVGFibGUsIGNtc19kYl9wcmVmaXgoKS5zZWxmOjpTYWlzb25UYWJsZSwgY21zX2RiX3ByZWZpeCgpLnNlbGY6OlBsYXllclRhYmxlLCBjbXNfZGJfcHJlZml4KCkuc2VsZjo6VGVhbVRhYmxlKTsKCQkKCQlmb3JlYWNoICgkY29uZmlncyBhcyAkY29uZmlnKSB7CgkJCSRkaWN0ID0gTmV3RGF0YURpY3Rpb25hcnkoICRkYiApOwoJCQkkc3FsYXJyYXkgPSAkZGljdC0+RHJvcFRhYmxlU1FMKCAkY29uZmlnICk7CgkJCSRkaWN0LT5FeGVjdXRlU1FMQXJyYXkoJHNxbGFycmF5KTsKCQl9Cgl9CgkKCS8qKgoJKiBEaWVzZSBNZXRob2RlIGJlYXJiZWl0ZXQgZWluZW4gU3RyaW5nIHNvLCBkYXNzIGVyIG5pY2h0IGbDvHIgU1FMIEluamVjdGlvbnMKCSogdmVyd2VuZGV0IHdlcmRlbiBrYW5uLgoJKgoJKiBAcGFyYW0gc3RyaW5nICRzdHJpbmcKCSogQHBhcmFtIHN0cmluZyAkZGJ0eXBlCgkqIEByZXR1cm4gc3RyaW5nIERlciBTdHJpbmcgZGVyIGVuc3RwcmVjaGVuZCBkZXIgRGF0ZW5iYW5rc3ludGF4IGVzY2FwZWQgd3VyZGUuCgkqLwoJcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gZXNjYXBlU1FMU3RyaW5nKCRzdHJpbmcsICRkYnR5cGUgPSAibXlzcWwiKQoJewoJCWlmICgkZGJ0eXBlID09ICJteXNxbCIpIHsKCQkJcmV0dXJuIG15c3FsX2VzY2FwZV9zdHJpbmcoJHN0cmluZyk7CgkJfQoKCQlyZXR1cm4gIiI7Cgl9CgkKCS8qKgoJICogRGllc2UgTWV0aG9kZSBsaWVmZXJ0IGRlbiBTcGllbGVyIHp1csO8Y2ssIGRlciBpbiBkZXIgRGF0ZW5iYW5rIGRpZSBOdW1tZXIgaWQgYmVzaXR6dC4KCSAqCgkgKiBAcGFyYW0gaWQgRGllIE51bW1lciBkZXMgU3BpZWxlcnMKCSAqIEByZXR1cm4gUGxheWVyIERlciBnZXfDvG5zY2h0ZSBTcGllbGVyIG9kZXIgTlVMTCB3ZW5uIGRlciBTcGllbGVyIG5pY2h0IGV4aXN0aWVydAoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldFBsYXllcigkaWQpCgl7CgkJJGdDbXMgPSAkR0xPQkFMU1snZ0NtcyddOwoJCWlmICgkZ0NtcyAmJiBpc19udW1lcmljKCRpZCkpIHsKCgkJCSRkYiA9ICRnQ21zLT5HZXREYigpOwoJCQkkcmVzdWx0ID0gJGRiLT5FeGVjdXRlKCJTRUxFQ1QgKiBGUk9NICIuY21zX2RiX3ByZWZpeCgpLnNlbGY6OlBsYXllclRhYmxlLiIgd2hlcmUgaWQ9Ii4kaWQpOwoJCQlpZiAoJHJlc3VsdCkgewoJCQkJaWYgKCRyZXN1bHQtPlJlY29yZENvdW50KCkgPT0gMSkgewoJCQkJCSRyb3cgPSAkcmVzdWx0LT5GZXRjaFJvdygpOwoJCQkJCXJldHVybiBuZXcgUGxheWVyKCRyb3dbc2VsZjo6JFBGaWVsZHNbMF1dLCAkcm93W3NlbGY6OiRQRmllbGRzWzFdXSk7CgkJCQl9CgkJCX0KCQl9CgkJCgkJcmV0dXJuIE5VTEw7Cgl9CgkKCS8qKgoJICogRGllc2UgTWV0aG9kZSBsaWVmZXJ0IGFsbGUgaW4gZGVyIERhdGVuYmFua2dlc3BlaWNoZXJ0ZW4gQmVudXR6ZXIgenVyw7xjay4KCSAqCgkgKiBAcmV0dXJuIEVpbiBBcnJheSBhbGxlciBpbiBkZXIgRGF0ZW5iYW5rIHZvcmhhbmRlbmVuIFNwaWVsZXIKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRBbGxQbGF5ZXJzKCkKCXsKCQkkZ0NtcyA9ICRHTE9CQUxTWydnQ21zJ107CgkJaWYgKGlzc2V0KCRnQ21zKSkgewoJCQkkZGIgPSAkZ0Ntcy0+R2V0RGIoKTsKCQkJJHJlc3VsdCA9ICRkYi0+RXhlY3V0ZSgiU0VMRUNUICogRlJPTSAiLmNtc19kYl9wcmVmaXgoKS5zZWxmOjpQbGF5ZXJUYWJsZS4iIE9SREVSIEJZICIuc2VsZjo6JFBGaWVsZHNbMV0pOwoJCQlpZiAoJHJlc3VsdCkgewoJCQkJaWYgKCRyZXN1bHQtPlJlY29yZENvdW50KCkgPj0gMSkgewoJCQkJCSRwbGF5ZXJzID0gYXJyYXkoKTsKCQkJCQlmb3IgKCRpID0gMDsgJGkgPCAkcmVzdWx0LT5SZWNvcmRDb3VudCgpOyAkaSA9ICRpICsgMSkgewoJCQkJCQkkcm93ID0gJHJlc3VsdC0+RmV0Y2hSb3coKTsKCQkJCQkJJHBsYXllcnNbJGldID0gbmV3IFBsYXllcigkcm93W3NlbGY6OiRQRmllbGRzWzBdXSwgJHJvd1tzZWxmOjokUEZpZWxkc1sxXV0pOwoJCQkJCX0KCQkJCQlyZXR1cm4gJHBsYXllcnM7CgkJCQl9CgkJCX0KCQl9CgkJCgkJcmV0dXJuIE5VTEw7Cgl9CgkKCS8qKgoJICogRGllc2UgTWV0aG9kZSBsZWd0IGVpbmVuIG5ldWVuIFNwaWVsZXIgbWl0IHZvcmdlZ2ViZW5lbSBOYW1lbiBhbi4KCSAqCgkgKiBAcGFyYW0gc3RyaW5nIG5hbWUgRGVyIE5hbWUgZGVzIHp1IGVyc3RlbGxlbmRlbiBTcGllbGVycwoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGNyZWF0ZVBsYXllcigkbmFtZSkKCXsKCQkkZ0NtcyA9ICRHTE9CQUxTWydnQ21zJ107CgkJaWYgKCRnQ21zICYmIGlzX3N0cmluZygkbmFtZSkpIHsKCQkJJG5hbWUgPSBzZWxmOjplc2NhcGVTUUxTdHJpbmcoJG5hbWUpOwoJCQkkZGIgPSAkZ0Ntcy0+R2V0RGIoKTsKCQkJJHJlc3VsdCA9ICRkYi0+RXhlY3V0ZSgiSU5TRVJUIElOVE8gIi5jbXNfZGJfcHJlZml4KCkuc2VsZjo6UGxheWVyVGFibGUuIiAoIi5zZWxmOjokUEZpZWxkc1sxXS4iKSBWQUxVRVMgKCciLiRuYW1lLiInKSIpOwoJCX0KCX0KCQoJLyoqCgkgKiBEaWVzZSBNZXRob2RlIMOkbmRlcnQgZWluZW4gU3BpZWxlci4gR2XDpG5kZXJ0IHdlcmRlbiBkaWUgRGF0ZW4gbnVyLAoJICogd2VubiBkZXIgRGF0ZW5zYXR6IGRlcyBhbHRlbiBTcGllbGVycyBtaXQgZGVtIERhdGVuc2F0eiBpbiBkZXIKCSAqIERhdGVuYmFuayDDvGJlcmVpbnN0aW1tdCB1bmQgd2VubiBkZXIgYWx0ZSBTcGllbGVyIHVuZCBkZXIgbmV1ZQoJICogU3BpZWxlciBkaWUgZ2xlaWNoZSBpZCBiZXNpdHplbiAodmVyZ2xlaWNoIMO8YmVyIFBsYXllci0+Z2V0SWQoKSkuCgkgKgoJICogQHBhcmFtIFBsYXllciBvbGRwbGF5ZXIgRGllIGFsdGUgdmVyc2lvbiBkZXMgU3BpZWxlcnMKCSAqIEBwYXJhbSBQbGF5ZXIgbmV3cGxheWVyIERpZSBuZXVlIHZlcnNpb24gZGVzIFNwaWVsZXJzCgkgKiBAcmV0dXJuIGJvb2wgdHJ1ZSwgd2VubiBkZXIgc3BpZWxlciBnZcOkbmRlcnQgd3VyZGUsIGZhbHNlIHNvbnN0CgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gY2hhbmdlUGxheWVyKCRvbGRwbGF5ZXIsICRuZXdwbGF5ZXIpCgl7CgkJJGdDbXMgPSAkR0xPQkFMU1snZ0NtcyddOwoJCWlmICgkZ0NtcyAmJiAoJG9sZHBsYXllciBpbnN0YW5jZW9mIFBsYXllcikgJiYgKCRuZXdwbGF5ZXIgaW5zdGFuY2VvZiBQbGF5ZXIpKSB7CgkJCSRzYXZlZHBsYXllciA9IHNlbGY6OmdldFBsYXllcigkb2xkcGxheWVyLT5nZXRJZCgpKTsKCQkJaWYgKCgkc2F2ZWRwbGF5ZXIgIT0gTlVMTCkgJiYgKCRzYXZlZHBsYXllciA9PSAkb2xkcGxheWVyKSAmJiAoJG9sZHBsYXllci0+Z2V0SWQoKSA9PSAkbmV3cGxheWVyLT5nZXRJZCgpKSkgewoJCQkJJGRiID0gJGdDbXMtPkdldERiKCk7CgkJCQkkcmVzdWx0ID0gJGRiLT5FeGVjdXRlKAoJCQkJCSJVUERBVEUgIi5jbXNfZGJfcHJlZml4KCkuc2VsZjo6UGxheWVyVGFibGUuCgkJCQkJIiBTRVQgIi5zZWxmOjokUEZpZWxkc1sxXS4iPSciLnNlbGY6OmVzY2FwZVNRTFN0cmluZygkbmV3cGxheWVyLT5nZXROYW1lKCkpLgoJCQkJCSInIFdIRVJFICIuc2VsZjo6JFBGaWVsZHNbMF0uIj0iLiRvbGRwbGF5ZXItPmdldElkKCkpOwoJCQkJaWYgKCRyZXN1bHQpIHsKCQkJCQlyZXR1cm4gdHJ1ZTsKCQkJCX0KCQkJfQoJCX0KCQkKCQlyZXR1cm4gZmFsc2U7Cgl9CgkKCS8qKgoJICogRGllc2UgTWV0aG9kZSBsaWVmZXJ0IGRhcyBUZWFtIHp1csO8Y2ssIGRhcyBpbiBkZXIgRGF0ZW5iYW5rIGRpZSBOdW1tZXIgaWQgYmVzaXR6dC4KCSAqCgkgKiBAcGFyYW0gaWQgRGllIE51bW1lciBkZXMgVGVhbXMKCSAqIEByZXR1cm4gVGVhbSBEYXMgZ2V3w7xuc2NodGUgVGVhbSBvZGVyIE5VTEwgd2VubiBkYXMgVGVhbSBuaWNodCBleGlzdGllcnQKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRUZWFtKCRpZCkKCXsKCQkkZ0NtcyA9ICRHTE9CQUxTWydnQ21zJ107CgkJaWYgKCRnQ21zICYmIGlzX251bWVyaWMoJGlkKSkgewoKCQkJJGRiID0gJGdDbXMtPkdldERiKCk7CgkJCSRyZXN1bHQgPSAkZGItPkV4ZWN1dGUoIlNFTEVDVCAqIEZST00gIi5jbXNfZGJfcHJlZml4KCkuc2VsZjo6VGVhbVRhYmxlLiIgd2hlcmUgaWQ9Ii4kaWQpOwoJCQlpZiAoJHJlc3VsdCkgewoJCQkJaWYgKCRyZXN1bHQtPlJlY29yZENvdW50KCkgPT0gMSkgewoJCQkJCSRyb3cgPSAkcmVzdWx0LT5GZXRjaFJvdygpOwoJCQkJCXJldHVybiBuZXcgVGVhbSgkcm93W3NlbGY6OiRURmllbGRzWzBdXSwgJHJvd1tzZWxmOjokVEZpZWxkc1sxXV0pOwoJCQkJfQoJCQl9CgkJfQoJCQoJCXJldHVybiBOVUxMOwoJfQoJCgkvKioKCSAqIERpZXNlIE1ldGhvZGUgbGllZmVydCBhbGxlIGluIGRlciBEYXRlbmJhbmsgZ2VzcGVpY2hlcnRlbiBUZWFtcyB6dXLDvGNrLgoJICoKCSAqIEByZXR1cm4gRWluIEFycmF5IGFsbGVyIGluIGRlciBEYXRlbmJhbmsgdm9yaGFuZGVuZW4gVGVhbXMKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRBbGxUZWFtcygpCgl7CgkJJGdDbXMgPSAkR0xPQkFMU1snZ0NtcyddOwoJCWlmIChpc3NldCgkZ0NtcykpIHsKCQkJJGRiID0gJGdDbXMtPkdldERiKCk7CgkJCSRyZXN1bHQgPSAkZGItPkV4ZWN1dGUoIlNFTEVDVCAqIEZST00gIi5jbXNfZGJfcHJlZml4KCkuc2VsZjo6VGVhbVRhYmxlLiIgT1JERVIgQlkgIi5zZWxmOjokVEZpZWxkc1sxXSk7CgkJCWlmICgkcmVzdWx0KSB7CgkJCQlpZiAoJHJlc3VsdC0+UmVjb3JkQ291bnQoKSA+PSAxKSB7CgkJCQkJJHRlYW1zID0gYXJyYXkoKTsKCQkJCQlmb3IgKCRpID0gMDsgJGkgPCAkcmVzdWx0LT5SZWNvcmRDb3VudCgpOyAkaSA9ICRpICsgMSkgewoJCQkJCQkkcm93ID0gJHJlc3VsdC0+RmV0Y2hSb3coKTsKCQkJCQkJJHRlYW1zWyRpXSA9IG5ldyBUZWFtKCRyb3dbc2VsZjo6JFRGaWVsZHNbMF1dLCAkcm93W3NlbGY6OiRURmllbGRzWzFdXSk7CgkJCQkJfQoJCQkJCXJldHVybiAkdGVhbXM7CgkJCQl9CgkJCX0KCQl9CgkJCgkJcmV0dXJuIE5VTEw7Cgl9CgkKCS8qKgoJICogRGllc2UgTWV0aG9kZSBsZWd0IGVpbmUgbmV1ZXMgVGVhbSBtaXQgdm9yZ2VnZWJlbmVtIE5hbWVuIGFuLgoJICoKCSAqIEBwYXJhbSBzdHJpbmcgbmFtZSBEZXIgTmFtZSBkZXMgenUgZXJzdGVsbGVuZGVuIFRlYW1zCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gY3JlYXRlVGVhbSgkbmFtZSkKCXsKCQkkZ0NtcyA9ICRHTE9CQUxTWydnQ21zJ107CgkJaWYgKCRnQ21zICYmIGlzX3N0cmluZygkbmFtZSkpIHsKCQkJJG5hbWUgPSBzZWxmOjplc2NhcGVTUUxTdHJpbmcoJG5hbWUpOwoJCQkkZGIgPSAkZ0Ntcy0+R2V0RGIoKTsKCQkJJHJlc3VsdCA9ICRkYi0+RXhlY3V0ZSgiSU5TRVJUIElOVE8gIi5jbXNfZGJfcHJlZml4KCkuc2VsZjo6VGVhbVRhYmxlLiIgKCIuc2VsZjo6JFRGaWVsZHNbMV0uIikgVkFMVUVTICgnIi4kbmFtZS4iJykiKTsKCQl9Cgl9CgkKCS8qKgoJICogRGllc2UgTWV0aG9kZSDDpG5kZXJ0IGVpbiBUZWFtLiBHZcOkbmRlcnQgd2VyZGVuIGRpZSBEYXRlbiBudXIsCgkgKiB3ZW5uIGRlciBEYXRlbnNhdHogZGVzIGFsdGVuIFRlYW1zIG1pdCBkZW0gRGF0ZW5zYXR6IGluIGRlcgoJICogRGF0ZW5iYW5rIMO8YmVyZWluc3RpbW10IHVuZCB3ZW5uIGRhcyBhbHRlIFRlYW0gdW5kIGRhcyBuZXVlCgkgKiBUZWFtIGRpZSBnbGVpY2hlIGlkIGJlc2l0emVuICh2ZXJnbGVpY2ggw7xiZXIgVGVhbS0+Z2V0SWQoKSkuCgkgKgoJICogQHBhcmFtIFRlYW0gb2xkdGVhbSBEaWUgYWx0ZSB2ZXJzaW9uIGRlcyBUZWFtcwoJICogQHBhcmFtIFRlYW0gbmV3dGVhbSBEaWUgbmV1ZSB2ZXJzaW9uIGRlcyBUZWFtcwoJICogQHJldHVybiBib29sIHRydWUsIHdlbm4gZGFzIFRlYW0gZ2XDpG5kZXJ0IHd1cmRlLCBmYWxzZSBzb25zdAoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGNoYW5nZVRlYW0oJG9sZHRlYW0sICRuZXd0ZWFtKQoJewoJCSRnQ21zID0gJEdMT0JBTFNbJ2dDbXMnXTsKCQlpZiAoJGdDbXMgJiYgKCRvbGR0ZWFtIGluc3RhbmNlb2YgVGVhbSkgJiYgKCRuZXd0ZWFtIGluc3RhbmNlb2YgVGVhbSkpIHsKCQkJJHNhdmVkdGVhbSA9IHNlbGY6OmdldFRlYW0oJG9sZHRlYW0tPmdldElkKCkpOwoJCQlpZiAoKCRzYXZlZHRlYW0gIT0gTlVMTCkgJiYgKCRzYXZlZHRlYW0gPT0gJG9sZHRlYW0pICYmICgkb2xkdGVhbS0+Z2V0SWQoKSA9PSAkbmV3dGVhbS0+Z2V0SWQoKSkpIHsKCQkJCSRkYiA9ICRnQ21zLT5HZXREYigpOwoJCQkJJHJlc3VsdCA9ICRkYi0+RXhlY3V0ZSgKCQkJCQkiVVBEQVRFICIuY21zX2RiX3ByZWZpeCgpLnNlbGY6OlRlYW1UYWJsZS4KCQkJCQkiIFNFVCAiLnNlbGY6OiRURmllbGRzWzFdLiI9JyIuc2VsZjo6ZXNjYXBlU1FMU3RyaW5nKCRuZXd0ZWFtLT5nZXROYW1lKCkpLgoJCQkJCSInIFdIRVJFICIuc2VsZjo6JFRGaWVsZHNbMF0uIj0iLiRvbGR0ZWFtLT5nZXRJZCgpKTsKCQkJCWlmICgkcmVzdWx0KSB7CgkJCQkJcmV0dXJuIHRydWU7CgkJCQl9CgkJCX0KCQl9CgkJCgkJcmV0dXJuIGZhbHNlOwoJfQoJCgkvKioKCSAqIERpZXNlIE1ldGhvZGUgbGllZmVydCBkaWUgU2Fpc29uIHp1csO8Y2ssIGRpZSBpbiBkZXIgRGF0ZW5iYW5rIGRpZSBOdW1tZXIgaWQgYmVzaXR6dC4KCSAqCgkgKiBAcGFyYW0gaW50IGlkIERpZSBpZCBkZXIgZ2V3w7xuc2NodGVuIFNhaXNvbgoJICogQHJldHVybiBTYWlzb24gRGllIGdld8O8bnNjaHRlIFNhaXNvbgoJICogQHRocm93cyBTUUxFeGNlcHRpb24gV2VubiB3YXMgc2NoaWVmIGdlaHQgOy0pCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0U2Fpc29uKCRpZCkgCgl7CgkJJGdDbXMgPSAkR0xPQkFMU1snZ0NtcyddOwoJCWlmICgkZ0NtcyAmJiBpc19udW1lcmljKCRpZCkpIHsKCgkJCSRkYiA9ICRnQ21zLT5HZXREYigpOwoJCQkkcmVzdWx0ID0gJGRiLT5FeGVjdXRlKCJTRUxFQ1QgKiBGUk9NICIuY21zX2RiX3ByZWZpeCgpLnNlbGY6OlNhaXNvblRhYmxlLiIgd2hlcmUgaWQ9Ii4kaWQpOwoJCQlpZiAoJHJlc3VsdCkgewoJCQkJaWYgKCRyZXN1bHQtPlJlY29yZENvdW50KCkgPT0gMSkgewoJCQkJCSRyb3cgPSAkcmVzdWx0LT5GZXRjaFJvdygpOwoJCQkJCXJldHVybiBuZXcgU2Fpc29uKCRyb3dbc2VsZjo6JFNGaWVsZHNbMF1dLCAkcm93W3NlbGY6OiRTRmllbGRzWzFdXSwgbmV3IERhdGVUaW1lKCRyb3dbc2VsZjo6JFNGaWVsZHNbMl1dKSwgbmV3IERhdGVUaW1lKCRyb3dbc2VsZjo6JFNGaWVsZHNbM11dKSk7CgkJCQl9CgkJCX0KCQl9CgoJCXJldHVybiBOVUxMOwoJfQoJCgkvKioKCSAqIERpZXNlIE1ldGhvZGUgbGllZmVydCBhbGxlIFNhaXNvbiB6dXLDvGNrLCBkaWUgaW4gZGVyIERhdGVuYmFuayB2b3JoYW5kZW4gc2luZC4KCSAqCgkgKiBAcmV0dXJuIEVpbiBhcnJheSwgZGFzIGFsbGUgaW4gZGVyIERhdGVuYmFuayB2b3JoYW5kZW5lbiBTYWlzb25zIGVudGjDpGx0CgkgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbiBXZW5uIHdhcyBzY2hpZWYgZ2VodCA7LSkKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRBbGxTYWlzb25zKCkKCXsKCQkkZ0NtcyA9ICRHTE9CQUxTWydnQ21zJ107CgkJaWYgKCRnQ21zKSB7CgkJCSRzYWlzb25zID0gYXJyYXkoKTsKCQkJJGRiID0gJGdDbXMtPkdldERiKCk7CgkJCSRyZXN1bHQgPSAkZGItPkV4ZWN1dGUoIlNFTEVDVCAqIEZST00gIi5jbXNfZGJfcHJlZml4KCkuc2VsZjo6U2Fpc29uVGFibGUuIiBPUkRFUiBCWSAiLnNlbGY6OiRTRmllbGRzWzFdKTsKCQkJaWYgKCRyZXN1bHQpIHsKCQkJCWZvciAoJGkgPSAwOyAkaSA8ICRyZXN1bHQtPlJlY29yZENvdW50KCk7ICRpID0gJGkgKyAxKSB7CgkJCQkJJHJvdyA9ICRyZXN1bHQtPkZldGNoUm93KCk7CgkJCQkJYXJyYXlfcHVzaCgkc2Fpc29ucywgbmV3IFNhaXNvbigkcm93W3NlbGY6OiRTRmllbGRzWzBdXSwgJHJvd1tzZWxmOjokU0ZpZWxkc1sxXV0sIG5ldyBEYXRlVGltZSgkcm93W3NlbGY6OiRTRmllbGRzWzJdXSksIG5ldyBEYXRlVGltZSgkcm93W3NlbGY6OiRTRmllbGRzWzNdXSkpKTsKCQkJCX0KCQkJCXJldHVybiAkc2Fpc29uczsKCQkJfQoJCX0KCgkJcmV0dXJuIE5VTEw7Cgl9CgkKCS8qKgoJICogRGllc2UgTWV0aG9kZSBlcnpldWd0IGVpbmUgbmV1ZSBTYWlzb24gaW4gZGVyIERhdGVuYmFuay4KCSAqCgkgKiBAcGFyYW0gU2Fpc29uIHNhaXNvbiBEaWUgZWluenVmw7xnZW5kZSBTYWlzb24gKGRpZSBpZCBpbm5lcmhhbGIgZGllc2VyIFNhaXNvbiB3aXJkIGlnbm9yaWVydCkKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBjcmVhdGVTYWlzb24oJHNhaXNvbikKCXsKCQkkZ0NtcyA9ICRHTE9CQUxTWydnQ21zJ107CgkJaWYgKCRnQ21zICYmICgkc2Fpc29uIGluc3RhbmNlb2YgU2Fpc29uKSkgewoJCQkkbmFtZSA9IHNlbGY6OmVzY2FwZVNRTFN0cmluZygkc2Fpc29uLT5nZXROYW1lKCkpOwoJCQkkYmVnaW4gPSAkc2Fpc29uLT5nZXRCZWdpbigpLT5mb3JtYXQoIlktbS1kIEg6aTpzIik7CgkJCSRlbmQgPSAkc2Fpc29uLT5nZXRFbmQoKS0+Zm9ybWF0KCJZLW0tZCBIOmk6cyIpOwoJCQkkZGIgPSAkZ0Ntcy0+R2V0RGIoKTsKCQkJJHJlc3VsdCA9ICRkYi0+RXhlY3V0ZSgiSU5TRVJUIElOVE8gIi5jbXNfZGJfcHJlZml4KCkuc2VsZjo6U2Fpc29uVGFibGUuIiAoIi5zZWxmOjokU0ZpZWxkc1sxXS4iLCIuc2VsZjo6JFNGaWVsZHNbMl0uIiwiLnNlbGY6OiRTRmllbGRzWzNdLiIpIFZBTFVFUyAoJyIuJG5hbWUuIicsJyIuJGJlZ2luLiInLCciLiRlbmQuIicpIik7CgkJfQoJfQoJCgkvKioKCSAqIERpZXNlIE1ldGhvZGUgw6RuZGVydCBkaWUgU2Fpc29uIG9sZFNhaXNvbi0+Z2V0SWQoKSBhdWYgZGllIFdlcnRlLCBkaWUgaW4gbmV3U2Fpc29uIHN0ZWhlbiAoYmlzIGF1ZiBpZCwgZGllc2Ugd2lyZAoJICogYmVpIG5ld1NhaXNvbiBpZ25vcmllcnQpLgoJICoKCSAqIEBwYXJhbSBTYWlzb24gb2xkU2Fpc29uIERpZSBhbHRlIFNhaXNvbiAobnVyIGlkIGlzdCB3aWNodGlnLCBtdXNzIG1pdCBkZXIgYmlzaGVyaWdlbiBEYXRlbmJhbmt2ZXJzaW9uIMO8YmVyZWluc3RpbW1lbikKCSAqIEBwYXJhbSBTYWlzb24gbmV3U2Fpc29uIERpZSBuZXVlbiBXZXJ0ZSBkaWVzZXIgU2Fpc29uIChhbGxlIGJpcyBhdWYgaWQgaXQgd2ljaHRpZykKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBjaGFuZ2VTYWlzb24oJG9sZFNhaXNvbiwgJG5ld1NhaXNvbikKCXsKCQkkZ0NtcyA9ICRHTE9CQUxTWydnQ21zJ107CgkJaWYgKCRnQ21zICYmICgkb2xkU2Fpc29uIGluc3RhbmNlb2YgU2Fpc29uKSAmJiAoJG5ld1NhaXNvbiBpbnN0YW5jZW9mIFNhaXNvbikpIHsKCQkJJHNhdmVkc2Fpc29uID0gc2VsZjo6Z2V0U2Fpc29uKCRvbGRTYWlzb24tPmdldElkKCkpOwoJCQlpZiAoKCRzYXZlZHNhaXNvbiAhPSBOVUxMKSAmJiAoJHNhdmVkc2Fpc29uID09ICRvbGRTYWlzb24pICYmICgkb2xkU2Fpc29uLT5nZXRJZCgpID09ICRuZXdTYWlzb24tPmdldElkKCkpKSB7CgkJCQkkZGIgPSAkZ0Ntcy0+R2V0RGIoKTsKCQkJCSRyZXN1bHQgPSAkZGItPkV4ZWN1dGUoCgkJCQkJIlVQREFURSAiLmNtc19kYl9wcmVmaXgoKS5zZWxmOjpTYWlzb25UYWJsZS4KCQkJCQkiIFNFVCAiLnNlbGY6OiRTRmllbGRzWzFdLiI9JyIuc2VsZjo6ZXNjYXBlU1FMU3RyaW5nKCRuZXdTYWlzb24tPmdldE5hbWUoKSkuCgkJCQkJIicsICIuc2VsZjo6JFNGaWVsZHNbMl0uIj0nIi4kbmV3U2Fpc29uLT5nZXRCZWdpbigpLT5mb3JtYXQoIlktbS1kIEg6aTpzIikuCgkJCQkJIicsICIuc2VsZjo6JFNGaWVsZHNbM10uIj0nIi4kbmV3U2Fpc29uLT5nZXRFbmQoKS0+Zm9ybWF0KCJZLW0tZCBIOmk6cyIpLgoJCQkJCSInIFdIRVJFICIuc2VsZjo6JFNGaWVsZHNbMF0uIj0iLiRvbGRTYWlzb24tPmdldElkKCkpOwoJCQkJaWYgKCRyZXN1bHQpIHsKCQkJCQlyZXR1cm4gdHJ1ZTsKCQkJCX0KCQkJfQoJCX0KCQkKCQlyZXR1cm4gZmFsc2U7Cgl9CgkKCS8qKgoJICogRGllc2UgTWV0aG9kZSBlcnpldWd0IGVpbmVuIG5ldWVuIEVpbnRyYWcgaW0gU3BpZWxwbGFuLgoJICoKCSAqIEBwYXJhbSBHYW1lIGdhbWUgRGFzIGVpbnp1ZsO8Z2VuZGUgU3BpZWwgd2lyZCBpbm5lcmhhbGIgZGVyIAoJICogRGF0ZW5iYW5rIGVyemV1Z3QuIEhpZXJiZWkgd2lyZCBkZXIgSW5oYWx0IHZvbiAkZ2FtZS0+Z2V0SWQoKSBpZ25vcmllcnQKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBjcmVhdGVHYW1lKCRnYW1lKQoJewoJCSRnQ21zID0gJEdMT0JBTFNbJ2dDbXMnXTsKCQlpZiAoJGdDbXMgJiYgKCRnYW1lIGluc3RhbmNlb2YgR2FtZSkpIHsKCQkJJG9wcG9uZW50ID0gc2VsZjo6ZXNjYXBlU1FMU3RyaW5nKCRnYW1lLT5nZXRPcHBvbmVudCgpKTsKCQkJJGRhdGUgPSAkZ2FtZS0+Z2V0RGF0ZSgpLT5mb3JtYXQoIlktbS1kIEg6aTpzIik7CgkJCSRob21lID0gKCRnYW1lLT5nZXRIb21lKCkgPT0gZmFsc2UpID8gMDoxOwoJCQkkb3VydGVhbSA9ICRnYW1lLT5nZXRPdXJUZWFtKCktPmdldElkKCk7CgkJCSRpczEyMCA9ICgkZ2FtZS0+aXMxMjAoKSA9PSBmYWxzZSkgPyAwOjE7CgkJCSRkYiA9ICRnQ21zLT5HZXREYigpOwoJCQkkcmVzdWx0ID0gJGRiLT5FeGVjdXRlKCJJTlNFUlQgSU5UTyAiLmNtc19kYl9wcmVmaXgoKS5zZWxmOjpHYW1lVGFibGUuIiAoIi4KCQkJc2VsZjo6JEdGaWVsZHNbMV0uIiwiLnNlbGY6OiRHRmllbGRzWzJdLiIsIi5zZWxmOjokR0ZpZWxkc1szXS4iLCIuc2VsZjo6JEdGaWVsZHNbNF0uIiwiLnNlbGY6OiRHRmllbGRzWzVdLiIpIi4KCQkJIlZBTFVFUyAoIi4kb3VydGVhbS4iLCciLiRvcHBvbmVudC4iJywnIi4kZGF0ZS4iJywiLiRob21lLiIsIi4kaXMxMjAuIikiKTsKCQl9Cgl9CgkKCS8qKgoJICogRGllc2UgTGllZmVydCBkYXMgc3BpZWwgbWl0IGRlciBnZXfDvG5zY2h0ZW4gSWQgenVyw7xjawoJICoKCSAqIEBwYXJhbSBpbnQgZ2FtZSBEaWUgSWQgZGVyICRnYW1lIEluc3RhbnogaW5uZXJoYWxiIGRlciBEYXRlbmJhbmsKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRHYW1lKCRnYW1lKQoJewoJCSRnQ21zID0gJEdMT0JBTFNbJ2dDbXMnXTsKCQlpZiAoJGdDbXMgJiYgaXNfbnVtZXJpYygkZ2FtZSkpIHsKCQkJJGRiID0gJGdDbXMtPkdldERiKCk7CgkJCSRyZXN1bHQgPSAkZGItPkV4ZWN1dGUoIlNFTEVDVCAqIEZST00gIi5jbXNfZGJfcHJlZml4KCkuc2VsZjo6R2FtZVRhYmxlLiIgV0hFUkUgaWQ9Ii4kZ2FtZSk7CgkJCWlmICgkcmVzdWx0KSB7CgkJCQlpZiAoJHJlc3VsdC0+UmVjb3JkQ291bnQoKSA9PSAxKSB7CgkJCQkJJHJvdyA9ICRyZXN1bHQtPkZldGNoUm93KCk7CgkJCQkJJHRlYW0gPSBEYXRhYmFzZU9wZXJhdGlvbnM6OmdldFRlYW0oJHJvd1tzZWxmOjokR0ZpZWxkc1sxXV0pOwoJCQkJCXJldHVybiBuZXcgR2FtZSgkcm93W3NlbGY6OiRHRmllbGRzWzBdXSwgJHRlYW0sICRyb3dbc2VsZjo6JEdGaWVsZHNbMl1dLCBuZXcgRGF0ZVRpbWUoJHJvd1tzZWxmOjokR0ZpZWxkc1szXV0pLCRyb3dbc2VsZjo6JEdGaWVsZHNbNF1dLCAkcm93W3NlbGY6OiRHRmllbGRzWzVdXSk7CgkJCQl9CgkJCX0KCQl9CgkJCgkJcmV0dXJuIE5VTEw7Cgl9CgkKCS8qKgoJICogRGllc2UgTWV0aG9kZSDDpG5kZXJ0IGVpbiBiZXJlaXRzIGVyc3RlbGx0ZXMgU3BpZWwgaW5uZXJoYWxiIGRlciBEYXRlbmJhbmsuCgkgKgoJICogQHBhcmFtIEdhbWUgb2xkZ2FtZSBEYXMgdXJzcHLDvG5nbGljaGUgc3BpZWwuIERpZXNlcyBtdXNzIG1pdCBkZW0gaW4gZGVyCgkgKiBEYXRlbmJhbmsgaGludGVybGVndGVuIFNwaWVsIMO8YmVyZWluc3RpbW1lbgoJICogQHBhcmFtIEdhbWUgb2xkZ2FtZSBEaWUgbmV1ZW4gRGF0ZW4gZGVzIHNwaWVscywgZGllIMO8YmVybm9tbWVuIHdlcmRlbiBzb2xsZW4KCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBjaGFuZ2VHYW1lKCRvbGRnYW1lLCAkbmV3Z2FtZSkKCXsKCQkkZ0NtcyA9ICRHTE9CQUxTWydnQ21zJ107CgkJaWYgKCRnQ21zICYmICgkb2xkZ2FtZSBpbnN0YW5jZW9mIEdhbWUpICYmICgkbmV3Z2FtZSBpbnN0YW5jZW9mIEdhbWUpKSB7CgkJCSRzYXZlZGdhbWUgPSBzZWxmOjpnZXRHYW1lKCRvbGRnYW1lLT5nZXRJZCgpKTsKCQkJaWYgKCgkb2xkZ2FtZSA9PSAkc2F2ZWRnYW1lKSAmJiAoJG9sZGdhbWUtPmdldElkKCkgPT0gJG5ld2dhbWUtPmdldElkKCkpKSB7CgkJCQkkb3Bwb25lbnQgPSBzZWxmOjplc2NhcGVTUUxTdHJpbmcoJG5ld2dhbWUtPmdldE9wcG9uZW50KCkpOwoJCQkJJGRhdGUgPSAkbmV3Z2FtZS0+Z2V0RGF0ZSgpLT5mb3JtYXQoIlktbS1kIEg6aTpzIik7CgkJCQkkaG9tZSA9ICRuZXdnYW1lLT5nZXRIb21lKCkgPyAxOjA7CgkJCQkkb3VydGVhbSA9ICRuZXdnYW1lLT5nZXRPdXJUZWFtKCktPmdldElkKCk7CgkJCQkkaXMxMjAgPSAoJG5ld2dhbWUtPmlzMTIwKCkgPT0gZmFsc2UpID8gMDoxOwoJCQkJJGRiID0gJGdDbXMtPkdldERiKCk7CgkJCQkkcmVzdWx0ID0gJGRiLT5FeGVjdXRlKCJVUERBVEUgIi5jbXNfZGJfcHJlZml4KCkuc2VsZjo6R2FtZVRhYmxlLiIgU0VUICIuCgkJCQlzZWxmOjokR0ZpZWxkc1sxXS4iPSIuJG91cnRlYW0uIiwgIi4KCQkJCXNlbGY6OiRHRmllbGRzWzJdLiI9JyIuJG9wcG9uZW50LiInLCAiLgoJCQkJc2VsZjo6JEdGaWVsZHNbM10uIj0nIi4kZGF0ZS4iJywgIi4KCQkJCXNlbGY6OiRHRmllbGRzWzRdLiI9JyIuJGhvbWUuIicsICIuCgkJCQlzZWxmOjokR0ZpZWxkc1s1XS4iPSIuJGlzMTIwLiIgV0hFUkUgaWQ9Ii4kb2xkZ2FtZS0+Z2V0SWQoKSk7CgkJCQlpZiAoJHJlc3VsdCkgewoJCQkJCXJldHVybiB0cnVlOwoJCQkJfQoJCQl9CgkJfQoJCQoJCXJldHVybiBmYWxzZTsKCX0KCQoJLyoqCgkgKiBEaWVzZSBNZXRob2RlIGxpZWZlcnQgZGVuIFNwaWVscGxhbiAoYWxsZSBTcGllbGUgZWluZXIgTWFubnNjaGFmdCBhbHMgQXJyYXkpCgkgKiBlaW5lciBNYW5uc2NoYWZ0IHp1IGVpbmVyIFNhaXNvbiB6dXLDvGNrLiBTb2xsdGUga2VpbmUgTWFubnNjaGFmdCDDvGJlcmdlYmVuCgkgKiB3ZXJkZW4sIHdlcmRlbiBhbGxlIFNwaWVsZSBkZXIgU2Fpc29uIHp1csO8Y2tnZWxpZWZlcnQuCgkgKgoJICogQHBhcmFtIHNhaXNvbiBEaWUgU2Fpc29uLCBmw7xyIGRpZSBkZXIgU3BpZWxwbGFuIGVybWl0dGVsdCB3ZXJkZW4gc29sbAoJICogQHBhcmFtIHRlYW0gRGllIE1hbm5zY2hhZnQsIGbDvHIgZGllIGRlciBTcGllbHBsYW4gZXJtaXR0ZWx0IHdlcmRlbiBzb2xsCgkgKiBAcmV0dXJuIEVpbiBBcnJheSB2b24gU3BpZWxlbiwgZGllIG8uZy4gS3JpdGVyaWVuIGVyZsO8bGxlbgoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldFRpbWVUYWJsZSgkc2Fpc29uLCAkdGVhbT1OVUxMKQoJewoJCSRnQ21zID0gJEdMT0JBTFNbJ2dDbXMnXTsKCQkkZ2FtZXMgPSBhcnJheSgpOwoJCWlmICgkZ0NtcyAmJiAoJHNhaXNvbiBpbnN0YW5jZW9mIFNhaXNvbikgJiYgKCgkdGVhbSBpbnN0YW5jZW9mIFRlYW0pIHx8ICgkdGVhbSA9PSBOVUxMKSkpIHsKCQkJJHF1ZXJ5dGVhbSA9IHRydWU7CgkJCSRzYWlzb25zdGFydCA9ICRzYWlzb24tPmdldEJlZ2luKCktPmZvcm1hdCgiWS1tLWQgSDppOnMiKTsKCQkJJHNhaXNvbmVuZCA9ICRzYWlzb24tPmdldEVuZCgpLT5mb3JtYXQoIlktbS1kIEg6aTpzIik7CgkJCSRxdWVyeSA9ICJTRUxFQ1QgKiBGUk9NICIuY21zX2RiX3ByZWZpeCgpLnNlbGY6OkdhbWVUYWJsZS4iIFdIRVJFICIuCgkJCQlzZWxmOjokR0ZpZWxkc1szXS4iPj0nIi4kc2Fpc29uc3RhcnQuIicgQU5EICIuCgkJCQlzZWxmOjokR0ZpZWxkc1szXS4iPD0nIi4kc2Fpc29uZW5kLiInIjsKCQkJaWYgKCR0ZWFtICE9IE5VTEwpIHsKCQkJCSRxdWVyeSAuPSAiIEFORCAiLnNlbGY6OiRHRmllbGRzWzFdLiI9Ii4kdGVhbS0+Z2V0SWQoKTsKCQkJCSRxdWVyeXRlYW0gPSBmYWxzZTsKCQkJfQoJCQkkcXVlcnkgLj0gIiBPUkRFUiBCWSAiLnNlbGY6OiRHRmllbGRzWzNdOwoJCQkkZGIgPSAkZ0Ntcy0+R2V0RGIoKTsKCQkJJHJlc3VsdCA9ICRkYi0+RXhlY3V0ZSgkcXVlcnkpOwoJCQlmb3IgKCRpID0gMDsgJGkgPCAkcmVzdWx0LT5SZWNvcmRDb3VudCgpOyAkaSA9ICRpICsgMSkgewoJCQkJJHJvdyA9ICRyZXN1bHQtPkZldGNoUm93KCk7CgkJCQlpZiAoJHF1ZXJ5dGVhbSkgewoJCQkJCSR0ZWFtID0gc2VsZjo6Z2V0VGVhbSgkcm93W3NlbGY6OiRHRmllbGRzWzFdXSk7CgkJCQl9CgkJCQkkZ2FtZSA9IG5ldyBHYW1lKCRyb3dbc2VsZjo6JEdGaWVsZHNbMF1dLCAkdGVhbSwgJHJvd1tzZWxmOjokR0ZpZWxkc1syXV0sIG5ldyBEYXRlVGltZSgkcm93W3NlbGY6OiRHRmllbGRzWzNdXSksICRyb3dbc2VsZjo6JEdGaWVsZHNbNF1dLCAkcm93W3NlbGY6OiRHRmllbGRzWzVdXSk7CgkJCQlhcnJheV9wdXNoKCRnYW1lcywgJGdhbWUpOwkJCQkKCQkJfQoJCX0KCQkKCQlyZXR1cm4gJGdhbWVzOwoJfQoJCgkvKioKCSAqIERpZXNlIE1ldGhvZGUgbGllZmVydCBmw7xyIGRlbiBnZWdlYmVuZW4gU3BpZWxlciwgZGllIGdlZ2ViZW5lIE1hbm5zY2hhZnQgc293aWUKCSAqIGRpZSBnZWdlYmVuZSBTYWlzb24gYWxsZSBFcmdlYm5pc3NlIHp1csO8Y2suCgkgKiAKCSAqIEBwYXJhbSBwbGF5ZXIgZGVyIFNwaWVsZXIgZsO8ciBkZW4gZGllIEVyZ2Vibmlzc2UgYWJnZXJ1ZmVuIHdlcmRlbiBzb2xsZW4KCSAqIEBwYXJhbSB0ZWFtIGRpZSBNYW5uc2NoYWZ0IGbDvHIgZGllIGRpZSBFcmdlYm5pc3NlIGRlcyBTcGllbGVycyBhYmdlcnVmZW4gd2VyZGVuIHNvbGxlbiAoTlVMTCBmw7xyIGFsbGUgTWFubnNjaGFmdGVuKQoJICogQHBhcmFtIHNhaXNvbiBkaWUgU2Fpc29uLCBmw7xyIGRpZSBkaWUgRXJnZWJuaXNzZSBkZXMgU3BpZWxlcnMgYWJnZXJ1ZmVuIHdlcmRlbiBzb2xsZW4gKE5VTEwgZsO8ciBhbGxlIFNhaXNvbnMpCgkgKiBAcmV0dXJuIEVpbiBBcnJheSB2b24gRWluemVsZXJnZWJuaXNzZW4gZGVzIFNwaWVsZXJzIChtaXQgTMOkbmdlIDAsIHdlbm4ga2VpbmUgRWludHLDpGdlIGV4aXN0aWVyZW4sCgkgKiAgICAgICAgIG9kZXIgZmFsc2NoZSBQYXJhbWV0ZXIgw7xiZXJnZWJlbiB3dXJkZW4pLiBEaWVzZXMgQXJyYXkgaXN0IEFic3RlaWdlbmQgbmFjaCBEYXR1bSBkZXMgU3BpZWxzIGdlb3JkbmV0LgoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldFBsYXllclJlc3VsdHMoJHBsYXllciwgJHRlYW09TlVMTCwgJHNhaXNvbj1OVUxMKQoJewoJCSRnQ21zID0gJEdMT0JBTFNbJ2dDbXMnXTsKCQkkcmVzdWx0cyA9IGFycmF5KCk7CgkJCgkJCgkJaWYgKCRnQ21zICYmCgkJKCRwbGF5ZXIgaW5zdGFuY2VvZiBQbGF5ZXIpICYmCgkJKCgkdGVhbSA9PSBOVUxMKSB8fCAkdGVhbSBpbnN0YW5jZW9mIFRlYW0pICYmCgkJKCgkc2Fpc29uID09IE5VTEwpIHx8ICRzYWlzb24gaW5zdGFuY2VvZiBTYWlzb24pKSB7CgkJCSRxdWVyeXN0cmluZyA9ICJTRUxFQ1QgZS4qIEZST00gIi5jbXNfZGJfcHJlZml4KCkuc2VsZjo6UmVzdWx0VGFibGUuIiBlICI7CgkJCSRxdWVyeXN0cmluZyAuPSAiIElOTkVSIEpPSU4gIi5jbXNfZGJfcHJlZml4KCkuc2VsZjo6R2FtZVRhYmxlLiIgZyAiOwoJCQkkcXVlcnlzdHJpbmcgLj0gIiBPTiBlLiIuc2VsZjo6JFJGaWVsZHNbMl0uIj1nLiIuc2VsZjo6JEdGaWVsZHNbMF07CgkJCSRxdWVyeXN0cmluZyAuPSAiIFdIRVJFIGUuIi5zZWxmOjokUkZpZWxkc1sxXS4iPSIuJHBsYXllci0+Z2V0SWQoKTsKCQkKCQkJaWYgKCR0ZWFtIGluc3RhbmNlb2YgVGVhbSkgewoJCQkJJHF1ZXJ5c3RyaW5nIC49ICIgQU5EIGcuIi5zZWxmOjokR0ZpZWxkc1sxXS4iPSIuJHRlYW0tPmdldElkKCk7CQoJCQl9CgkJCQoJCQlpZiAoJHNhaXNvbiBpbnN0YW5jZW9mIFNhaXNvbikgewoJCQkJJHF1ZXJ5c3RyaW5nIC49ICIgQU5EIGcuIi5zZWxmOjokR0ZpZWxkc1szXS4iPj1cIiIuJHNhaXNvbi0+Z2V0QmVnaW4oKS0+Zm9ybWF0KCJZLW0tZCBIOmk6cyIpLiJcIiI7CgkJCQkkcXVlcnlzdHJpbmcgLj0gIiBBTkQgZy4iLnNlbGY6OiRHRmllbGRzWzNdLiI8PVwiIi4kc2Fpc29uLT5nZXRFbmQoKS0+Zm9ybWF0KCJZLW0tZCBIOmk6cyIpLiJcIiI7CgkJCX0KCQkJCgkJCSRxdWVyeXN0cmluZyAuPSAiIE9SREVSIEJZIGcuIi5zZWxmOjokR0ZpZWxkc1szXS4iIERFU0MiOwoJCQkKCQkJJGRiID0gJGdDbXMtPkdldERiKCk7CgkJCSRyZXN1bHQgPSAkZGItPkV4ZWN1dGUoJHF1ZXJ5c3RyaW5nKTsKCQkJZm9yICgkaSA9IDA7ICRpIDwgJHJlc3VsdC0+UmVjb3JkQ291bnQoKTsgJGkgPSAkaSArIDEpIHsKCQkJCSRyb3cgPSAkcmVzdWx0LT5GZXRjaFJvdygpOwoJCQkJJHRlbXBnYW1lID0gc2VsZjo6Z2V0R2FtZSgkcm93W3NlbGY6OiRSRmllbGRzWzJdXSk7CgkJCQkkdGVtcHJlc3VsdCA9IG5ldyBSZXN1bHQoCgkJCQkJJHJvd1tzZWxmOjokUkZpZWxkc1swXV0sCgkJCQkJJHBsYXllciwKCQkJCQkkdGVtcGdhbWUsCgkJCQkJJHJvd1tzZWxmOjokUkZpZWxkc1s3XV0sCgkJCQkJJHJvd1tzZWxmOjokUkZpZWxkc1szXV0sCgkJCQkJJHJvd1tzZWxmOjokUkZpZWxkc1s1XV0sCgkJCQkJJHJvd1tzZWxmOjokUkZpZWxkc1s0XV0sCgkJCQkJJHJvd1tzZWxmOjokUkZpZWxkc1s2XV0sCgkJCQkJJHJvd1tzZWxmOjokUkZpZWxkc1s4XV0sCgkJCQkJJHJvd1tzZWxmOjokUkZpZWxkc1s5XV0sCgkJCQkJJHJvd1tzZWxmOjokUkZpZWxkc1sxMF1dLAoJCQkJCSRyb3dbc2VsZjo6JFJGaWVsZHNbMTFdXSk7CgkJCQlhcnJheV9wdXNoKCRyZXN1bHRzLCAkdGVtcHJlc3VsdCk7CgkJCX0KCQl9CQoJCQkJCgkJcmV0dXJuICRyZXN1bHRzOwoJfQoJCgkvKioKCSAqIERpZXNlIE1ldGhvZGUgbGllZmVydCBkZW4gU3BpZWxwbGFuIChhbGxlIFNwaWVsZSBlaW5lciBNYW5uc2NoYWZ0IGFscyBBcnJheSkKCSAqIGVpbmVyIE1hbm5zY2hhZnQgenVyw7xjaywgZGllIGluIGRlciBadWt1bmZ0IGxpZWdlbiAoZGF5cyA+IDApIG9kZXIgaW4gZGVyIAoJICogVmVyZ2FuZ2VuaGVpdCBsaWVnZW4gKGRheXMgPCAwKS4gRGVyIGJldHJhZyBnaWJ0IHZvbiBkYXlzIGdpYnQgZGFiZWkgZGVuCgkgKiBnaWJ0IGRhYmVpIGRpZSBBbnphaGwgZGVyIFRhZ2UgaW4gZGVyIFp1a3VuZnQgb2RlciBpbiBkZXIgVmVyZ2FuZ2VuaGVpdCBhbi4KCSAqCgkgKiBAcGFyYW0gZGF5cyBBbnphaGwgZGVyIFRhZ2UgaW4gZGVyIFp1a3VuZnQgKGRheXMgPiAwKSBvZGVyIEFuemFobCBkZXIgVGFnZSBpbiBkZXIgVmVyZ2FuZ2VuaGVpdCAoZGF5cyA8IDApCgkgKiBAcGFyYW0gdGVhbSBEaWUgTWFubnNjaGFmdCwgZsO8ciBkaWUgZGVyIFNwaWVscGxhbiBlcm1pdHRlbHQgd2VyZGVuIHNvbGwgKE5VTEwgZsO8ciBhbGxlIFRlYW1zKQoJICogQHJldHVybiBFaW4gQXJyYXkgdm9uIFNwaWVsZW4sIGRpZSBvLmcuIEtyaXRlcmllbiBlcmbDvGxsZW4KCSAqLwogICAgICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0VGltZVRhYmxlVGltZWRpZmYoJGRheXMsICR0ZWFtPU5VTEwpCgl7CgkJJGdDbXMgPSAkR0xPQkFMU1snZ0NtcyddOwoJCSRnYW1lcyA9IGFycmF5KCk7CgkKCQlpZiAoJGdDbXMgJiYgKCRkYXlzICE9IDApICYmICgoJHRlYW0gaW5zdGFuY2VvZiBUZWFtKSB8fCAoJHRlYW0gPT0gTlVMTCkpKSB7CgkJCSRxdWVyeXRlYW0gPSB0cnVlOwoJCQkkZGF5cGVyaW9kZSA9IG5ldyBEYXRlSW50ZXJ2YWwoIlAiLmFicygkZGF5cykuIkQiKTsKCQkJJG5vdyA9IG5ldyBEYXRlVGltZTsKCQkJaWYgKCRkYXlzID4gMCkgewoJCQkJJHNhaXNvbnN0YXJ0ID0gJG5vdy0+Zm9ybWF0KCJZLW0tZCBIOmk6cyIpOwoJCQkJJG5vdy0+YWRkKCRkYXlwZXJpb2RlKTsKCQkJCSRzYWlzb25lbmQgPSAkbm93LT5mb3JtYXQoIlktbS1kIEg6aTpzIik7CgkJCX0gZWxzZSB7CgkJCQkkc2Fpc29uZW5kID0gJG5vdy0+Zm9ybWF0KCJZLW0tZCBIOmk6cyIpOwoJCQkJJG5vdy0+c3ViKCRkYXlwZXJpb2RlKTsKCQkJCSRzYWlzb25zdGFydCA9ICRub3ctPmZvcm1hdCgiWS1tLWQgSDppOnMiKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoJCQkkcXVlcnkgPSAiU0VMRUNUICogRlJPTSAiLmNtc19kYl9wcmVmaXgoKS5zZWxmOjpHYW1lVGFibGUuIiBXSEVSRSAiLgoJCQkJc2VsZjo6JEdGaWVsZHNbM10uIj49JyIuJHNhaXNvbnN0YXJ0LiInIEFORCAiLgoJCQkJc2VsZjo6JEdGaWVsZHNbM10uIjw9JyIuJHNhaXNvbmVuZC4iJyI7CgkJCWlmICgkdGVhbSAhPSBOVUxMKSB7CgkJCQkkcXVlcnkgLj0gIiBBTkQgIi5zZWxmOjokR0ZpZWxkc1sxXS4iPSIuJHRlYW0tPmdldElkKCk7CgkJCQkkcXVlcnl0ZWFtID0gZmFsc2U7CgkJCX0KCQkJJHF1ZXJ5IC49ICIgT1JERVIgQlkgIi5zZWxmOjokR0ZpZWxkc1szXTsKCQkJaWYgKCRkYXlzIDwgMCkgewoJCQkJJHF1ZXJ5IC49ICIgREVTQyI7CgkJCX0KCQkJJGRiID0gJGdDbXMtPkdldERiKCk7CgkJCSRyZXN1bHQgPSAkZGItPkV4ZWN1dGUoJHF1ZXJ5KTsKCQkJZm9yICgkaSA9IDA7ICRpIDwgJHJlc3VsdC0+UmVjb3JkQ291bnQoKTsgJGkgPSAkaSArIDEpIHsKCQkJCSRyb3cgPSAkcmVzdWx0LT5GZXRjaFJvdygpOwoJCQkJaWYgKCRxdWVyeXRlYW0pIHsKCQkJCQkkdGVhbSA9IHNlbGY6OmdldFRlYW0oJHJvd1tzZWxmOjokR0ZpZWxkc1sxXV0pOwoJCQkJfQoJCQkJJGdhbWUgPSBuZXcgR2FtZSgkcm93W3NlbGY6OiRHRmllbGRzWzBdXSwgJHRlYW0sICRyb3dbc2VsZjo6JEdGaWVsZHNbMl1dLCBuZXcgRGF0ZVRpbWUoJHJvd1tzZWxmOjokR0ZpZWxkc1szXV0pLCAkcm93W3NlbGY6OiRHRmllbGRzWzRdXSwgJHJvd1tzZWxmOjokR0ZpZWxkc1s1XV0pOwoJCQkJYXJyYXlfcHVzaCgkZ2FtZXMsICRnYW1lKTsJCQkJCgkJCX0KCQl9CgkKCQlyZXR1cm4gJGdhbWVzOwoJfQoJCgkvKioKCSAqIERpZXNlIE1ldGhvZGUgZXJ6ZXVndCBlaW5lbiBuZXVlbiBFaW50cmFnIGluIGRlciBFcmdlYm5pc2xpc3RlLgoJICoKCSAqIEBwYXJhbSBSZXN1bHQgcmVzdWx0IERhcyBlaW56dWbDvGdlbmRlIEVyZ2VibmlzIHdpcmQgaW5uZXJoYWxiIGRlciAKCSAqIERhdGVuYmFuayBlcnpldWd0LiBIaWVyYmVpIHdpcmQgZGVyIEluaGFsdCB2b24gJHJlc3VsdC0+Z2V0SWQoKSBpZ25vcmllcnQKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBjcmVhdGVSZXN1bHQoJHJlc3VsdCkKCXsKCQkkZ0NtcyA9ICRHTE9CQUxTWydnQ21zJ107CgkJaWYgKCRnQ21zICYmICgkcmVzdWx0IGluc3RhbmNlb2YgUmVzdWx0KSkgewoJCQkkb3Bwb25lbnQgPSBzZWxmOjplc2NhcGVTUUxTdHJpbmcoJHJlc3VsdC0+Z2V0T3Bwb25lbnQoKSk7CgkJCSRwbGF5ZXIgPSAkcmVzdWx0LT5nZXRQbGF5ZXIoKS0+Z2V0SWQoKTsKCQkJJHNwaWVscGxhbiA9ICRyZXN1bHQtPmdldEdhbWUoKS0+Z2V0SWQoKTsKCQkJJGdlcyA9ICRyZXN1bHQtPmdldEdlcygpOwoJCQkkYWJyID0gJHJlc3VsdC0+Z2V0QWJyKCk7CgkJCSRmZWhsID0gJHJlc3VsdC0+Z2V0RmVobCgpOwoJCQkkY291bnQgPSAkcmVzdWx0LT5nZXRDb3VudCgpID8gMTowOwoJCQkkb2dlcyA9ICRyZXN1bHQtPmdldE9HZXMoKTsKCQkJJG9hYnIgPSAkcmVzdWx0LT5nZXRPQWJyKCk7CgkJCSRvZmVobCA9ICRyZXN1bHQtPmdldE9GZWhsKCk7CgkJCSRvY291bnQgPSAkcmVzdWx0LT5nZXRPQ291bnQoKSA/IDE6MDsKCQkJJGRiID0gJGdDbXMtPkdldERiKCk7CgkJCSRyZXN1bHQgPSAkZGItPkV4ZWN1dGUoIklOU0VSVCBJTlRPICIuY21zX2RiX3ByZWZpeCgpLnNlbGY6OlJlc3VsdFRhYmxlLiIgKCIuCgkJCQlzZWxmOjokUkZpZWxkc1sxXS4iLCIuCgkJCQlzZWxmOjokUkZpZWxkc1syXS4iLCIuCgkJCQlzZWxmOjokUkZpZWxkc1szXS4iLCIuCgkJCQlzZWxmOjokUkZpZWxkc1s0XS4iLCIuCgkJCQlzZWxmOjokUkZpZWxkc1s1XS4iLCIuCgkJCQlzZWxmOjokUkZpZWxkc1s2XS4iLCIuCgkJCQlzZWxmOjokUkZpZWxkc1s3XS4iLCIuCgkJCQlzZWxmOjokUkZpZWxkc1s4XS4iLCIuCgkJCQlzZWxmOjokUkZpZWxkc1s5XS4iLCIuCgkJCQlzZWxmOjokUkZpZWxkc1sxMF0uIiwiLgoJCQkJc2VsZjo6JFJGaWVsZHNbMTFdLiIpIi4KCQkJIiBWQUxVRVMgKCIuCgkJCQkkcGxheWVyLiIsIi4KCQkJCSRzcGllbHBsYW4uIiwiLgoJCQkJJGdlcy4iLCIuCgkJCQkkZmVobC4iLCIuCgkJCQkkYWJyLiIsIi4KCQkJCSRjb3VudC4iLCciLgoJCQkJJG9wcG9uZW50LiInLCIuCgkJCQkkb2dlcy4iLCIuCgkJCQkkb2Fici4iLCIuCgkJCQkkb2ZlaGwuIiwiLgoJCQkJJG9jb3VudC4iKSIpOwoJCX0KCX0KCQoJLyoqCgkgKiBEaWVzZSBNZXRob2RlIGxpZXN0IGVpbmVuIGJlc3RlaGVuZGVuIEVpbnRyYWcgYXVzIGRlciBFcmdlYm5pc2xpc3RlLgoJICoKCSAqIEBwYXJhbSBpbnQgcmVzdWx0IERhcyB6dSBsZXNlbmRlIEVyZ2VibmlzIHdpcmQgaW5uZXJoYWxiIGRlciAKCSAqIERhdGVuYmFuayBhYmdlZnJhZ3QuIERlciBQYXJhbWV0ZXIgZW50c3ByaWNodCBkZXIgaWQgZGVzCgkgKiBFaW50cmFncwoJICogQHJldHVybiBSZXN1bHQgRGFzIFJlc3VsdGF0IGF1cyBkZXIgRGF0ZW5iYW5rIG9kZXIgTlVMTCB3ZW5uCgkgKiBkYXMgUmVzdWx0YXQgbmljaHQgZXhpc3RpZXJ0CgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0UmVzdWx0KCRyZXN1bHQpCgl7CgkJJGdDbXMgPSAkR0xPQkFMU1snZ0NtcyddOwoJCWlmICgkZ0NtcyAmJiBpc19udW1lcmljKCRyZXN1bHQpKSB7CgkJCSRkYiA9ICRnQ21zLT5HZXREYigpOwoJCQkkZGJyZXN1bHQgPSAkZGItPkV4ZWN1dGUoIlNFTEVDVCAqIEZST00gIi5jbXNfZGJfcHJlZml4KCkuc2VsZjo6UmVzdWx0VGFibGUuIiBXSEVSRSAiLgoJCQlzZWxmOjokUkZpZWxkc1swXS4iPSIuJHJlc3VsdCk7CgkJCWlmICgkZGJyZXN1bHQtPlJlY29yZENvdW50KCkgPT0gMSkgewoJCQkJJHJvdyA9ICRkYnJlc3VsdC0+RmV0Y2hSb3coKTsKCQkJCSRyZXN1bHQgPSBuZXcgUmVzdWx0KAoJCQkJCSRyb3dbc2VsZjo6JFJGaWVsZHNbMF1dLAoJCQkJCXNlbGY6OmdldFBsYXllcigkcm93W3NlbGY6OiRSRmllbGRzWzFdXSksCgkJCQkJc2VsZjo6Z2V0R2FtZSgkcm93W3NlbGY6OiRSRmllbGRzWzJdXSksCgkJCQkJJHJvd1tzZWxmOjokUkZpZWxkc1s3XV0sCgkJCQkJJHJvd1tzZWxmOjokUkZpZWxkc1szXV0sCgkJCQkJJHJvd1tzZWxmOjokUkZpZWxkc1s1XV0sCgkJCQkJJHJvd1tzZWxmOjokUkZpZWxkc1s0XV0sCgkJCQkJJHJvd1tzZWxmOjokUkZpZWxkc1s2XV0sCgkJCQkJJHJvd1tzZWxmOjokUkZpZWxkc1s4XV0sCgkJCQkJJHJvd1tzZWxmOjokUkZpZWxkc1s5XV0sCgkJCQkJJHJvd1tzZWxmOjokUkZpZWxkc1sxMF1dLAoJCQkJCSRyb3dbc2VsZjo6JFJGaWVsZHNbMTFdXSk7CgkJCQlyZXR1cm4gJHJlc3VsdDsKCQkJfQoJCX0KCQlyZXR1cm4gTlVMTDsKCX0KCQoJLyoqCgkgKiBEaWVzZSBNZXRob2RlIMOkbmRlcnQgZWluZW4gYmVzdGVoZW5kZW4gRWludHJhZyBhdXMgZGVyIEVyZ2VibmlzbGlzdGUuCgkgKgoJICogQHBhcmFtIFJlc3VsdCBvbGRyZXN1bHQgRGFzIHp1IMOkbmRlcm5kZSBFcmdlYm5pcyAoZXMgbXVzcyBkYWJlaSBnZWx0ZW4sCgkgKiBkYXNzICRvbGRyZXN1bHQgZGVtIGFsdGVuIEVpbnRyYWcgaW4gZXIgRGF0ZW5iYW5rIGVudHNwcmVjaGVuIG11c3MgdW5kCgkgKiAkbmV3cmVzdWx0LT5nZXRJZCgpID0gJG9sZHJlc3VsdC0+Z2V0SWQoKSBlcmbDvGxsdCBzZWluIG11c3MpCgkgKiBAcGFyYW0gUmVzdWx0IG5ld3Jlc3VsdCBEYXMgZ2XDpG5kZXJuZGUgRXJnZWJuaXMKCSAqIEByZXR1cm4gYm9vbGVhbiB0cnVlLCB3ZW5uIGRpZSDDhG5kZXJ1bmcgZXJmb2xncmVpY2ggd2FyLCBzb25zdCBmYWxzZQoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGNoYW5nZVJlc3VsdCgkb2xkcmVzdWx0LCAkbmV3cmVzdWx0KQoJewoJCSRnQ21zID0gJEdMT0JBTFNbJ2dDbXMnXTsKCQlpZiAoJGdDbXMgJiYgKCRvbGRyZXN1bHQgaW5zdGFuY2VvZiBSZXN1bHQpICYmICgkbmV3cmVzdWx0IGluc3RhbmNlb2YgUmVzdWx0KSkgewoJCQkkc2F2ZWRyZXN1bHQgPSBzZWxmOjpnZXRSZXN1bHQoJG9sZHJlc3VsdC0+Z2V0SWQoKSk7CgkJCWlmICgoJG9sZHJlc3VsdCA9PSAkc2F2ZWRyZXN1bHQpICYmICgkb2xkcmVzdWx0LT5nZXRJZCgpID09ICRuZXdyZXN1bHQtPmdldElkKCkpKSB7CgkJCQkkaWQgPSAkbmV3cmVzdWx0LT5nZXRJZCgpOwoJCQkJJG9wcG9uZW50ID0gc2VsZjo6ZXNjYXBlU1FMU3RyaW5nKCRuZXdyZXN1bHQtPmdldE9wcG9uZW50KCkpOwoJCQkJJHBsYXllciA9ICRuZXdyZXN1bHQtPmdldFBsYXllcigpLT5nZXRJZCgpOwoJCQkJJHNwaWVscGxhbiA9ICRuZXdyZXN1bHQtPmdldEdhbWUoKS0+Z2V0SWQoKTsKCQkJCSRnZXMgPSAkbmV3cmVzdWx0LT5nZXRHZXMoKTsKCQkJCSRhYnIgPSAkbmV3cmVzdWx0LT5nZXRBYnIoKTsKCQkJCSRmZWhsID0gJG5ld3Jlc3VsdC0+Z2V0RmVobCgpOwoJCQkJJGNvdW50ID0gJG5ld3Jlc3VsdC0+Z2V0Q291bnQoKSA/IDE6MDsKCQkJCSRvZ2VzID0gJG5ld3Jlc3VsdC0+Z2V0T0dlcygpOwoJCQkJJG9hYnIgPSAkbmV3cmVzdWx0LT5nZXRPQWJyKCk7CgkJCQkkb2ZlaGwgPSAkbmV3cmVzdWx0LT5nZXRPRmVobCgpOwoJCQkJJG9jb3VudCA9ICRuZXdyZXN1bHQtPmdldE9Db3VudCgpID8gMTowOwoJCQkJJGRiID0gJGdDbXMtPkdldERiKCk7CgkJCQkkcmVzdWx0ID0gJGRiLT5FeGVjdXRlKCJVUERBVEUgIi5jbXNfZGJfcHJlZml4KCkuc2VsZjo6UmVzdWx0VGFibGUuIiBTRVQgIi4KCQkJCQlzZWxmOjokUkZpZWxkc1sxXS4iPSIuJHBsYXllci4iLCAiLgoJCQkJCXNlbGY6OiRSRmllbGRzWzJdLiI9Ii4kc3BpZWxwbGFuLiIsICIuCgkJCQkJc2VsZjo6JFJGaWVsZHNbM10uIj0iLiRnZXMuIiwgIi4KCQkJCQlzZWxmOjokUkZpZWxkc1s0XS4iPSIuJGZlaGwuIiwgIi4KCQkJCQlzZWxmOjokUkZpZWxkc1s1XS4iPSIuJGFici4iLCAiLgoJCQkJCXNlbGY6OiRSRmllbGRzWzZdLiI9Ii4kY291bnQuIiwgIi4KCQkJCQlzZWxmOjokUkZpZWxkc1s3XS4iPSciLiRvcHBvbmVudC4iJywgIi4KCQkJCQlzZWxmOjokUkZpZWxkc1s4XS4iPSIuJG9nZXMuIiwgIi4KCQkJCQlzZWxmOjokUkZpZWxkc1s5XS4iPSIuJG9hYnIuIiwgIi4KCQkJCQlzZWxmOjokUkZpZWxkc1sxMF0uIj0iLiRvZmVobC4iLCAiLgoJCQkJCXNlbGY6OiRSRmllbGRzWzExXS4iPSIuJG9jb3VudC4iIFdIRVJFICIuCgkJCQkJc2VsZjo6JFJGaWVsZHNbMF0uIj0iLiRpZAoJCQkJKTsKCQkJCWlmICgkcmVzdWx0KSB7CgkJCQkJcmV0dXJuIHRydWU7CgkJCQl9CgkJCX0KCQl9CgkJcmV0dXJuIGZhbHNlOwoJfQoJCgkvKioKCSAqIERpZXNlIE1ldGhvZGUgbGllc3QgZGllIGJlc3RlaGVuZGVuIEVpbnRyw6RnZSBhdXMgZGVyIEVyZ2VibmlzbGlzdGUKCSAqIHVuZCBnaWJ0IGRpZXNlIGFscyBhcnJheSB6dXLDvGNrLgoJICoKCSAqIEBwYXJhbSBHYW1lIGdhbWUgRGFzIFNwaWVsIGlubmVyaGFsYiBkZXIgRGF0ZW5iYW5rLCB6dSBkZW0gZGllCgkgKiBFcmdlYm5pc3NlIGF1c2dlbGVzZW4gd2VyZGVuIHNvbGxlbi4gRXMga2FubiBudXIgZWluIHJlc3VsdGF0IGF1c2dlZ2ViZW4gd2VyZGVuLAoJICogd2VubiBnaWx0ICRnYW1lLT5pczEyMCgpID09IGZhbHNlLgoJICogQHJldHVybiBhcnJheSBvZiBSZXN1bHQgRGllIEVpbnplbGVyZ2Vibmlzc2UgYXVzIGRlciBEYXRlbmJhbmsuCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0UmVzdWx0T2ZHYW1lKCRnYW1lKQoJewoJCSRnQ21zID0gJEdMT0JBTFNbJ2dDbXMnXTsKCQkkcmVzdWx0cyA9IGFycmF5KCk7CgkJaWYgKCRnQ21zICYmICgkZ2FtZSBpbnN0YW5jZW9mIEdhbWUpICYmICgkZ2FtZS0+aXMxMjAoKSA9PSBmYWxzZSkpIHsKCQkJJGRiID0gJGdDbXMtPkdldERiKCk7CgkJCSRkYnJlc3VsdCA9ICRkYi0+RXhlY3V0ZSgiU0VMRUNUICogRlJPTSAiLmNtc19kYl9wcmVmaXgoKS5zZWxmOjpSZXN1bHRUYWJsZS4iIFdIRVJFICIuCgkJCXNlbGY6OiRSRmllbGRzWzJdLiI9Ii4kZ2FtZS0+Z2V0SWQoKSk7CgkJCWZvciAoJGkgPSAwOyAkaSA8ICRkYnJlc3VsdC0+UmVjb3JkQ291bnQoKTsgJGkgPSAkaSArIDEpIHsKCQkJCSRyb3cgPSAkZGJyZXN1bHQtPkZldGNoUm93KCk7CgkJCQkkcmVzdWx0ID0gbmV3IFJlc3VsdCgKCQkJCSRyb3dbc2VsZjo6JFJGaWVsZHNbMF1dLAoJCQkJc2VsZjo6Z2V0UGxheWVyKCRyb3dbc2VsZjo6JFJGaWVsZHNbMV1dKSwKCQkJCXNlbGY6OmdldEdhbWUoJHJvd1tzZWxmOjokUkZpZWxkc1syXV0pLAoJCQkJJHJvd1tzZWxmOjokUkZpZWxkc1s3XV0sCgkJCQkkcm93W3NlbGY6OiRSRmllbGRzWzNdXSwKCQkJCSRyb3dbc2VsZjo6JFJGaWVsZHNbNV1dLAoJCQkJJHJvd1tzZWxmOjokUkZpZWxkc1s0XV0sCgkJCQkkcm93W3NlbGY6OiRSRmllbGRzWzZdXSwKCQkJCSRyb3dbc2VsZjo6JFJGaWVsZHNbOF1dLAoJCQkJJHJvd1tzZWxmOjokUkZpZWxkc1s5XV0sCgkJCQkkcm93W3NlbGY6OiRSRmllbGRzWzEwXV0sCgkJCQkkcm93W3NlbGY6OiRSRmllbGRzWzExXV0pOwoJCQkJYXJyYXlfcHVzaCgkcmVzdWx0cywgJHJlc3VsdCk7CgkJCX0KCQl9CgkJcmV0dXJuICRyZXN1bHRzOwoJfQoKCS8qKgoJICogRGllc2UgZnVua3Rpb24gZ2VuZXJpZXJ0IGRhcyDDvGJlcmdlYmVuZSBNYXRjaCAxMjAgaW4gZGVyIERhdGVuYmFuay4gRGFiZWkgd2lyZCBkZXIgSW5oYWx0IHZvbiAkbWF0Y2gtPmdldElkKCkgaWdub3JpZXJ0LgoJICogRGllIGluICRtYXRjaCBhbmdlZ2ViZW5lbiBTw6R0emUgczEgYmlzIHM0IHdlcmRlbiB6dW7DpGNoc3QgaW4gZGVyIERhdGVuYmFuayBnZXN1Y2h0LCB3ZXJkZW4gc2llIG5pY2h0IGdlZnVuZGVuIHdlcmRlbiBzaWUKCSAqIGViZW5mYWxscyBhbmdlbGVndC4gRGllIMOcYmVycHLDvGZ1bmcgZGVyIFPDpHR6ZSB3aXJkIGViZW5mYWxscyDDvGJlciBkZXJlbiAkZ2V0SWQoKSBNZXRob2RlIGR1cmNoZ2Vmw7xocnQuCgkgKiAKCSAqIEBwYXJhbSBNYXRjaDEyMCAkbWF0Y2ggZWluZSBNYXRjaCAxMjAgaW5zdGFueiBkaWUgaW4gZGVyIERhdGVuYmFuayBhbmdlbGVndCB3ZXJkZW4gc29sbAoJICogQHJldHVybiBib29sZWFuIHRydWUsIGZhbGxzIGVzIG3DtmdsaWNoIHdhciBkYXMgTWF0Y2ggMTIwIGFuenVsZWdlbiwgZmFsc2Ugc29uc3QuCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gY3JlYXRlTWF0Y2gxMjAoJG1hdGNoKQoJewoJCSRyZXR2YWwgPSB0cnVlOwoJCSRnQ21zID0gJEdMT0JBTFNbJ2dDbXMnXTsKCQlpZiAoJGdDbXMgJiYgKCRtYXRjaCBpbnN0YW5jZW9mIE1hdGNoMTIwKSkgewoJCQkkczEgPSAkbWF0Y2gtPmdldFMxKCk7CgkJCSRzMiA9ICRtYXRjaC0+Z2V0UzIoKTsKCQkJJHMzID0gJG1hdGNoLT5nZXRTMygpOwoJCQkkczQgPSAkbWF0Y2gtPmdldFM0KCk7CgkJCSRzZXRhcnJheSA9IGFycmF5KCRzMSwgJHMyLCAkczMsICRzNCk7CgkJCQoJCQkvKiBjaGVjayBmb3IgZXZlcnkgc2V0IHRoYXQgaXQgZXhpc3RzIGFuZCBpZiBub3QgdGhlbiBjcmVhdGUgaXQgKi8KCQkJZm9yICgkaSA9IDA7ICRpIDwgNDsgJGkgPSAkaSArIDEpIHsKCQkJCS8qIGNoZWNrIGZvciBleGlzdGVuY2Ugb2YgdGhlIFNldDEyMCBpbnNpZGUgdGhlIGRhdGFiYXNlICovCgkJCQkkY3JlYXRlID0gdHJ1ZTsKCQkJCWlmICgoJHNldGFycmF5WyRpXSAhPSBOVUxMKSAmJiAoJHNldGFycmF5WyRpXSBpbnN0YW5jZW9mIFNldDEyMCkpIHsKCQkJCQkkc2V0ZnJvbWRiID0gc2VsZjo6Z2V0U2V0MTIwKCRzZXRhcnJheVskaV0tPmdldElkKCkpOwoJCQkJCWlmICgkc2V0ZnJvbWRiICE9IE5VTEwpIHsKCQkJCQkJJGNyZWF0ZSA9IGZhbHNlOwoJCQkJCX0KCQkJCX0KCQkJCQoJCQkJLyogY3JlYXRlIHRoZSBzZXQgaWYgbmVjZXNzYXJ5ICovCgkJCQlpZiAoJGNyZWF0ZSAhPSBmYWxzZSkgewoJCQkJCXNlbGY6OmNyZWF0ZVNldDEyMCgkc2V0YXJyYXlbJGldKTsKCQkJCQkvKiBzZWFyY2ggZm9yIHRoZSBjcmVhdGVkIHNldCAqLwoJCQkJCSRkYiA9ICRnQ21zLT5HZXREYigpOwoJCQkJCSRzcWxTdHJpbmcgPSAiU0VMRUNUICogRlJPTSAiIC4gY21zX2RiX3ByZWZpeCAoKSAuIHNlbGY6OlNldFRhYmxlMTIwIC4gIiBXSEVSRSAiOwoJCQkJCSRzcWxTdHJpbmcgLj0gc2VsZjo6JFMxMjBGaWVsZHMgWzFdIC4gIj0iIC4gJHNldGFycmF5WyRpXS0+Z2V0UGxheWVyKCktPmdldElkKCk7CgkJCQkJJHNxbFN0cmluZyAuPSAiIEFORCAiIC4gc2VsZjo6JFMxMjBGaWVsZHMgWzJdIC4gIj0iIC4gJHNldGFycmF5WyRpXS0+Z2V0R2VzKCk7CgkJCQkJJHNxbFN0cmluZyAuPSAiIEFORCAiIC4gc2VsZjo6JFMxMjBGaWVsZHMgWzNdIC4gIj0iIC4gJHNldGFycmF5WyRpXS0+Z2V0RmVobCgpOwoJCQkJCSRzcWxTdHJpbmcgLj0gIiBBTkQgIiAuIHNlbGY6OiRTMTIwRmllbGRzIFs0XSAuICI9IiAuICRzZXRhcnJheVskaV0tPmdldEFicigpOwoJCQkJCSRzcWxTdHJpbmcgLj0gIiBBTkQgIiAuIHNlbGY6OiRTMTIwRmllbGRzIFs1XSAuICI9XCIiIC4gc2VsZjo6ZXNjYXBlU1FMU3RyaW5nICggJHNldGFycmF5WyRpXS0+Z2V0T3Bwb25lbnQoKSkuIlwiIjsKCQkJCQkkc3FsU3RyaW5nIC49ICIgQU5EICIgLiBzZWxmOjokUzEyMEZpZWxkcyBbNl0gLiAiPSIgLiAkc2V0YXJyYXlbJGldLT5nZXRPR2VzKCk7CgkJCQkJJHNxbFN0cmluZyAuPSAiIEFORCAiIC4gc2VsZjo6JFMxMjBGaWVsZHMgWzddIC4gIj0iIC4gJHNldGFycmF5WyRpXS0+Z2V0T0FicigpOwoJCQkJCSRzcWxTdHJpbmcgLj0gIiBBTkQgIiAuIHNlbGY6OiRTMTIwRmllbGRzIFs4XSAuICI9IiAuICRzZXRhcnJheVskaV0tPmdldE9GZWhsKCk7CgkJCQkJaWYgKCRzZXRhcnJheVskaV0tPmdldENvbm5lY3QoKSAhPSBOVUxMKSB7CgkJCQkJCSRzcWxTdHJpbmcgLj0gIiBBTkQgIiAuIHNlbGY6OiRTMTIwRmllbGRzIFs5XSAuICI9IiAuICRzZXRhcnJheVskaV0tPmdldENvbm5lY3QoKTsKCQkJCQl9IGVsc2UgewoJCQkJCQkkc3FsU3RyaW5nIC49ICIgQU5EICIgLiBzZWxmOjokUzEyMEZpZWxkcyBbOV0gLiAiIElTIE5VTEwiOwoJCQkJCX0KCQkJCQkkZGJyZXN1bHQgPSAkZGItPkV4ZWN1dGUgKCAkc3FsU3RyaW5nICk7CgkJCQkJJG1heG1hdGNoID0gMDsKCQkJCQlpZiAoJGRicmVzdWx0LT5SZWNvcmRDb3VudCgpID49IDEpIHsKCQkJCQkJZm9yKCRqID0gMDsgJGogPCAkZGJyZXN1bHQtPlJlY29yZENvdW50ICgpOyAkaiArKykgewoJCQkJCQkJJHJvdyA9ICRkYnJlc3VsdC0+RmV0Y2hSb3cgKCk7CgkJCQkJCQlpZiAoJHJvdyBbc2VsZjo6JFMxMjBGaWVsZHMgWzBdXSA+ICRtYXhtYXRjaCkgewoJCQkJCQkJCSRtYXhtYXRjaCA9ICRyb3cgW3NlbGY6OiRTMTIwRmllbGRzIFswXV07CgkJCQkJCQl9CgkJCQkJCX0KCQkJCQl9CgkJCQkJaWYgKCRtYXhtYXRjaCA+IDApIHsKCQkJCQkJJHNldGFycmF5WyRpXSA9IHNlbGY6OmdldFNldDEyMCgkbWF4bWF0Y2gpOwoJCQkJCX0gZWxzZSB7CgkJCQkJCSRyZXR2YWwgPSBmYWxzZTsKCQkJCQl9CgkJCQl9CgkJCX0KCQkJCgkJCS8qIGZyb20gbm93IG9uIGFsbCBzZXRzIHNob3VsZCBleGlzdCBpbnNpZGUgdGhlIGRhdGFiYXNlIGFuZCB3ZSBjYW4gY3JlYXRlIHRoZSBtYXRjaCBpdHNlbGYgKi8KCQkJaWYgKCRyZXR2YWwgIT0gZmFsc2UpIHsKCQkJCSRzcWxzdHJpbmcgID0gIklOU0VSVCBJTlRPICIuY21zX2RiX3ByZWZpeCgpLnNlbGY6Ok1hdGNoVGFibGUxMjAuIiAoIjsKCQkJCSRzcWxzdHJpbmcgLj0gc2VsZjo6JE0xMjBGaWVsZHNbMV07CgkJCQkkc3Fsc3RyaW5nIC49ICIsICIuc2VsZjo6JE0xMjBGaWVsZHNbMl07CgkJCQkkc3Fsc3RyaW5nIC49ICIsICIuc2VsZjo6JE0xMjBGaWVsZHNbM107CgkJCQkkc3Fsc3RyaW5nIC49ICIsICIuc2VsZjo6JE0xMjBGaWVsZHNbNF07CgkJCQkkc3Fsc3RyaW5nIC49ICIsICIuc2VsZjo6JE0xMjBGaWVsZHNbNV07CgkJCQkkc3Fsc3RyaW5nIC49ICIsICIuc2VsZjo6JE0xMjBGaWVsZHNbNl07CgkJCQkkc3Fsc3RyaW5nIC49ICIsICIuc2VsZjo6JE0xMjBGaWVsZHNbN107CgkJCQkkc3Fsc3RyaW5nIC49ICIpIFZBTFVFUyAoIjsKCQkJCSRzcWxzdHJpbmcgLj0gJG1hdGNoLT5nZXRHYW1lKCktPmdldElkKCk7CgkJCQkkc3Fsc3RyaW5nIC49ICIsICIuKCRtYXRjaC0+Z2V0T2NvdW50KCkgPT0gZmFsc2UgPyAwOjEpOwoJCQkJJHNxbHN0cmluZyAuPSAiLCAiLigkbWF0Y2gtPmdldFBDb3VudCgpID09IGZhbHNlID8gMDoxKTsKCQkJCSRzcWxzdHJpbmcgLj0gIiwgIi4kc2V0YXJyYXlbMF0tPmdldElkKCk7CgkJCQkkc3Fsc3RyaW5nIC49ICIsICIuJHNldGFycmF5WzFdLT5nZXRJZCgpOwoJCQkJJHNxbHN0cmluZyAuPSAiLCAiLiRzZXRhcnJheVsyXS0+Z2V0SWQoKTsKCQkJCSRzcWxzdHJpbmcgLj0gIiwgIi4kc2V0YXJyYXlbM10tPmdldElkKCk7CgkJCQkkc3Fsc3RyaW5nIC49ICIpIjsKCQkJCSRkYiA9ICRnQ21zLT5HZXREYigpOwoJCQkJJHJlc3VsdCA9ICRkYi0+RXhlY3V0ZSgkc3Fsc3RyaW5nKTsKCQkJfQoJCX0KCQkKCQlyZXR1cm4gJHJldHZhbDsKCX0JCgoJLyoqCgkgKiBEaWVzZSBGdW5rdGlvbiDDpG5kZXJ0IGRhcyDDvGJlcmdlYmVuZSBNYXRjaC4gU8OkbXRsaWNoZSB0ZWlsZSBkZXMgTWF0Y2hlcyAod2llIHouQi4gZGFzIFNwaWVsIG9kZXIgZGllIFPDpHR6ZSkKCSAqIHdlcmRlbiBuaWNodCBnZcOkbmRlcnQuCgkgKiBAcGFyYW0gTWF0Y2gxMjAgJG1hdGNoCgkgKiBAcmV0dXJuIGJvb2xlYW4gdHJ1ZSwgZmFsbHMgZGVyIERhdGVuc2F0eiBnZcOkbmRlcnQgd2VyZGVuIGtvbm50ZSwgZmFsc2Ugc29uc3QKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBjaGFuZ2VNYXRjaDEyMCgkbWF0Y2gpCgl7CgkJJHJldHZhbCA9IHRydWU7CgkJJGdDbXMgPSAkR0xPQkFMU1snZ0NtcyddOwoJCWlmICgkZ0NtcyAmJiAoJG1hdGNoIGluc3RhbmNlb2YgTWF0Y2gxMjApKSB7CgkJCSRzcWxzdHJpbmcgID0gIlVQREFURSAiLmNtc19kYl9wcmVmaXgoKS5zZWxmOjpNYXRjaFRhYmxlMTIwLiIgU0VUICI7CgkJCSRzcWxzdHJpbmcgLj0gc2VsZjo6JE0xMjBGaWVsZHNbMV0uIj0iLiRtYXRjaC0+Z2V0R2FtZSgpLT5nZXRJZCgpOwoJCQkkc3Fsc3RyaW5nIC49ICIsICIuc2VsZjo6JE0xMjBGaWVsZHNbMl0uIj0iLigkbWF0Y2gtPmdldE9jb3VudCgpID09IGZhbHNlID8gMDoxKTsKCQkJJHNxbHN0cmluZyAuPSAiLCAiLnNlbGY6OiRNMTIwRmllbGRzWzNdLiI9Ii4oJG1hdGNoLT5nZXRQY291bnQoKSA9PSBmYWxzZSA/IDA6MSk7CgkJCSRzcWxzdHJpbmcgLj0gIiwgIi5zZWxmOjokTTEyMEZpZWxkc1s0XS4iPSIuJG1hdGNoLT5nZXRTMSgpLT5nZXRJZCgpOwoJCQkkc3Fsc3RyaW5nIC49ICIsICIuc2VsZjo6JE0xMjBGaWVsZHNbNV0uIj0iLiRtYXRjaC0+Z2V0UzIoKS0+Z2V0SWQoKTsKCQkJJHNxbHN0cmluZyAuPSAiLCAiLnNlbGY6OiRNMTIwRmllbGRzWzZdLiI9Ii4kbWF0Y2gtPmdldFMzKCktPmdldElkKCk7CgkJCSRzcWxzdHJpbmcgLj0gIiwgIi5zZWxmOjokTTEyMEZpZWxkc1s3XS4iPSIuJG1hdGNoLT5nZXRTNCgpLT5nZXRJZCgpOwoJCQkkc3Fsc3RyaW5nIC49ICIgV0hFUkUgIjsKCQkJJHNxbHN0cmluZyAuPSBzZWxmOjokTTEyMEZpZWxkc1swXS4iPSIuJG1hdGNoLT5nZXRJZCgpOwoJCQkkZGIgPSAkZ0Ntcy0+R2V0RGIoKTsKCQkJJHJlc3VsdCA9ICRkYi0+RXhlY3V0ZSgkc3Fsc3RyaW5nKTsKCQl9IGVsc2UgewoJCQkkcmV0dmFsID0gZmFsc2U7CgkJfQoKCQlyZXR1cm4gJHJldHZhbDsKCX0KCQoJLyoqCgkgKiBEaWVzZSBGdW5rdGlvbiBsaWVmZXJ0IHp1IGVpbmVtIGdlZ2ViZW5lbiBTcGllbCBzw6RtdGxpY2hlIE1hdGNoZXMgenVyw7xjay4gQmVkaW5ndW5nIGlzdCBhbGxlcmRpbmcsIGRhc3MKCSAqICRnYW1lLT5pczEyMCgpID09IHRydWUgZ2lsdCwgZGEgZXMgc2ljaCBiZWkgZGVtIFNwaWVsIHVtIGVpbiAxMjAgS3VnZWwgU3BpZWwgaGFuZGVsbiBtdXNzLgoJICogCgkgKiBAcGFyYW0gR2FtZSAkZ2FtZSBkYXMgU3BpZWwgenUgZGVtIGRpZSB6dWdlaMO2cmlnZW4gTWF0Y2hlcyBnZWZ1bmRlbiB3ZXJkZW4gc29sbGVuCgkgKiBAcmV0dXJuIGFycmF5IG9mIE1hdGNoMTIwIGluc3RhbmNlcwoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldE1hdGNoMTIwT2ZHYW1lKCRnYW1lKQoJewoJCSRyZXR2YWwgPSBhcnJheSgpOwoJCSRnQ21zID0gJEdMT0JBTFNbJ2dDbXMnXTsKCQlpZiAoJGdDbXMgJiYgKCRnYW1lIGluc3RhbmNlb2YgR2FtZSkpIHsKCQkJaWYgKCRnYW1lLT5pczEyMCgpICE9IGZhbHNlKSB7CgkJCQkkc3Fsc3RyaW5nID0gIlNFTEVDVCAqIEZST00gIi5jbXNfZGJfcHJlZml4KCkuc2VsZjo6TWF0Y2hUYWJsZTEyMC4iIFdIRVJFICI7CgkJCQkkc3Fsc3RyaW5nIC49IHNlbGY6OiRNMTIwRmllbGRzWzFdLiI9Ii4kZ2FtZS0+Z2V0SWQoKTsKCQkJCSRkYiA9ICRnQ21zLT5HZXREYigpOwoJCQkJJHJlc3VsdCA9ICRkYi0+RXhlY3V0ZSgkc3Fsc3RyaW5nKTsKCQkJCWZvcigkaSA9IDA7ICRpIDwgJHJlc3VsdC0+UmVjb3JkQ291bnQoKTsgJGkgPSAkaSArIDEpIHsKCQkJCQkkcm93ID0gJHJlc3VsdC0+RmV0Y2hSb3coKTsKCQkJCQkkbWF0Y2ggPSBzZWxmOjpnZXRNYXRjaDEyMCgkcm93W3NlbGY6OiRNMTIwRmllbGRzWzBdXSk7CgkJCQkJaWYgKCRtYXRjaCAhPSBOVUxMKSB7CgkJCQkJCWFycmF5X3B1c2goJHJldHZhbCwgJG1hdGNoKTsKCQkJCQl9CgkJCQl9CgkJCX0KCQl9CgkJcmV0dXJuICRyZXR2YWw7Cgl9CgkKCS8qKgoJICogRGllc2UgRnVua3Rpb24gZ2lidCBhdXMgZGVyIERhdGVuYmFuayBkYXMgMTIwIFd1cmYgTWF0Y2ggenVyw7xjaywgZGFzIG1pdCBkZXIgZ2VnZWJlbmVuIGlkIGFuZ2VsZWd0IGlzdC4KCSAqIEBwYXJhbSBJbnRlZ2VyICRpZCBkaWUgRGF0ZW5iYW5raWQgZGVzIE1hdGNoZXMKCSAqIEByZXR1cm4gTlVMTCwgZmFsbHMgZsO8ciBkaWUgZ2VnZWJlbmVuIERhdGVuYmFuayBpZCBrZWluIEVpbnRyYWcgZXhpc3RpZXJ0LCBlaW5lIE1hdGNoMTIwIEluc3Rhbnogc29uc3QKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRNYXRjaDEyMCgkaWQpCgl7CgkJJHJldHZhbCA9IE5VTEw7CgkJJGdDbXMgPSAkR0xPQkFMU1snZ0NtcyddOwoJCWlmICgkZ0NtcyAmJiBpc19udW1lcmljKCRpZCkpIHsKCQkJJHNxbHN0cmluZyAgPSAiU0VMRUNUICogRlJPTSAiLmNtc19kYl9wcmVmaXgoKS5zZWxmOjpNYXRjaFRhYmxlMTIwLiIgV0hFUkUgIjsKCQkJJHNxbHN0cmluZyAuPSBzZWxmOjokTTEyMEZpZWxkc1swXS4iPSIuJGlkOwoJCQkkZGIgPSAkZ0Ntcy0+R2V0RGIoKTsKCQkJJHJlc3VsdCA9ICRkYi0+RXhlY3V0ZSgkc3Fsc3RyaW5nKTsKCQkJaWYgKCRyZXN1bHQtPlJlY29yZENvdW50KCkgPT0gMSkgewoJCQkJJHJvdyA9ICRyZXN1bHQtPkZldGNoUm93KCk7CgkJCQkkcmV0dmFsID0gbmV3IE1hdGNoMTIwKAoJCQkJCQkkcm93W3NlbGY6OiRNMTIwRmllbGRzWzBdXSwgCgkJCQkJCXNlbGY6OmdldEdhbWUoJHJvd1tzZWxmOjokTTEyMEZpZWxkc1sxXV0pLCAKCQkJCQkJKCRyb3dbc2VsZjo6JE0xMjBGaWVsZHNbMl1dID09IDAgPyBmYWxzZTp0cnVlKSwgCgkJCQkJCSgkcm93W3NlbGY6OiRNMTIwRmllbGRzWzNdXSA9PSAwID8gZmFsc2U6dHJ1ZSksIAoJCQkJCQlzZWxmOjpnZXRTZXQxMjAoJHJvd1tzZWxmOjokTTEyMEZpZWxkc1s0XV0pLCAKCQkJCQkJc2VsZjo6Z2V0U2V0MTIwKCRyb3dbc2VsZjo6JE0xMjBGaWVsZHNbNV1dKSwgCgkJCQkJCXNlbGY6OmdldFNldDEyMCgkcm93W3NlbGY6OiRNMTIwRmllbGRzWzZdXSksIAoJCQkJCQlzZWxmOjpnZXRTZXQxMjAoJHJvd1tzZWxmOjokTTEyMEZpZWxkc1s3XV0pCgkJCQkpOwoJCQl9CgkJfQoJCQoJCXJldHVybiAkcmV0dmFsOwoJfQoJCgkvKioKCSAqIERpZXNlIE1ldGhvZGUgZXJzdGVsbHQgZWluZW4gbmV1ZW4gU2F0eiBmw7xyIGVpbiAxMjAgV3VyZiBTcGllbCBpbm5lcmhhbGIgZGVyIERhdGVuYmFuay4KCSAqIAoJICogQHBhcmFtIFNldDEyMCBzZXQgRGVyIFNhdHosIGRlciBpbm5lcmhhbGIgZGVyIERhdGVuYmFuayBlcnN0ZWxsdCB3ZXJkZW4gc29sbAoJICogICAgICAgIERlciBJbmhhbHQgdm9uICRzZXQtPmdldElkKCkgd2lyZCBoaWVyYmVpIGlnbm9yaWVydC4KCSAqIEByZXR1cm4gYm9vbGVhbiB0cnVlLCB3ZW5uIGVzIG3DtmdsaWNoIHdhciwgZGVuIFNhdHogenUgZXJzdGVsbGVuLCBmYWxzZSBzb25zdAoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGNyZWF0ZVNldDEyMCgkc2V0KQoJewoJCSRyZXR2YWwgPSB0cnVlOwoJCSRjb25uZWN0ID0gIk5VTEwiOwoJCSRnQ21zID0gJEdMT0JBTFNbJ2dDbXMnXTsKCQlpZiAoJGdDbXMgJiYgKCRzZXQgaW5zdGFuY2VvZiBTZXQxMjApKSB7CgkJCQoJCQkvKiBmaXJzdCBjcmVhdGUgY2hpbGRyZW4gKi8KCQkJaWYgKCRzZXQtPmdldENvbm5lY3QoKSAhPSBOVUxMKSB7CgkJCQkKCQkJCS8qIGNyZWF0ZSBjaGlsZCByZWN1cnNpdmVseSAqLwoJCQkJJHJldHZhbCA9IHNlbGY6OmNyZWF0ZVNldDEyMCgkc2V0LT5nZXRDb25uZWN0KCkpOwoJCQkJaWYgKCRyZXR2YWwgIT0gZmFsc2UpIHsKCQkJCQkKCQkJCQkvKiBmaW5kIGNoaWxkIHRoYXQgaGFzIGN1cnJlbnRseSBiZWVuIGNyZWF0ZWQgaW5zaWRlIHRoZSBkYXRhYmFzZSAqLwoJCQkJCSRkYiA9ICRnQ21zLT5HZXREYiAoKTsKCQkJCQkkc3FsU3RyaW5nID0gIlNFTEVDVCAqIEZST00gIiAuIGNtc19kYl9wcmVmaXggKCkgLiBzZWxmOjpTZXRUYWJsZTEyMCAuICIgV0hFUkUgIjsKCQkJCQkkc3FsU3RyaW5nIC49IHNlbGY6OiRTMTIwRmllbGRzIFsxXSAuICI9IiAuICRzZXQtPmdldENvbm5lY3QgKCktPmdldFBsYXllciAoKS0+Z2V0SWQgKCk7CgkJCQkJJHNxbFN0cmluZyAuPSAiIEFORCAiIC4gc2VsZjo6JFMxMjBGaWVsZHMgWzJdIC4gIj0iIC4gJHNldC0+Z2V0Q29ubmVjdCAoKS0+Z2V0R2VzICgpOwoJCQkJCSRzcWxTdHJpbmcgLj0gIiBBTkQgIiAuIHNlbGY6OiRTMTIwRmllbGRzIFszXSAuICI9IiAuICRzZXQtPmdldENvbm5lY3QgKCktPmdldEZlaGwgKCk7CgkJCQkJJHNxbFN0cmluZyAuPSAiIEFORCAiIC4gc2VsZjo6JFMxMjBGaWVsZHMgWzRdIC4gIj0iIC4gJHNldC0+Z2V0Q29ubmVjdCAoKS0+Z2V0QWJyICgpOwoJCQkJCSRzcWxTdHJpbmcgLj0gIiBBTkQgIiAuIHNlbGY6OiRTMTIwRmllbGRzIFs1XSAuICI9XCIiIC4gc2VsZjo6ZXNjYXBlU1FMU3RyaW5nICggJHNldC0+Z2V0Q29ubmVjdCAoKS0+Z2V0T3Bwb25lbnQgKCkgKS4iXCIiOwoJCQkJCSRzcWxTdHJpbmcgLj0gIiBBTkQgIiAuIHNlbGY6OiRTMTIwRmllbGRzIFs2XSAuICI9IiAuICRzZXQtPmdldENvbm5lY3QgKCktPmdldE9HZXMgKCk7CgkJCQkJJHNxbFN0cmluZyAuPSAiIEFORCAiIC4gc2VsZjo6JFMxMjBGaWVsZHMgWzddIC4gIj0iIC4gJHNldC0+Z2V0Q29ubmVjdCAoKS0+Z2V0T0FiciAoKTsKCQkJCQkkc3FsU3RyaW5nIC49ICIgQU5EICIgLiBzZWxmOjokUzEyMEZpZWxkcyBbOF0gLiAiPSIgLiAkc2V0LT5nZXRDb25uZWN0ICgpLT5nZXRPRmVobCAoKTsKCQkJCQlpZiAoJHNldC0+Z2V0Q29ubmVjdCAoKS0+Z2V0Q29ubmVjdCAoKSAhPSBOVUxMKSB7CgkJCQkJCSRzcWxTdHJpbmcgLj0gIiBBTkQgIiAuIHNlbGY6OiRTMTIwRmllbGRzIFs5XSAuICI9IiAuICRzZXQtPmdldENvbm5lY3QgKCktPmdldENvbm5lY3QgKCktPmdldElkICgpOwoJCQkJCX0gZWxzZSB7CgkJCQkJCSRzcWxTdHJpbmcgLj0gIiBBTkQgIiAuIHNlbGY6OiRTMTIwRmllbGRzIFs5XSAuICIgSVMgTlVMTCI7CgkJCQkJfQoJCQkJCSRkYnJlc3VsdCA9ICRkYi0+RXhlY3V0ZSAoICRzcWxTdHJpbmcgKTsKCQkJCQkKCQkJCQkvKiBpZiBtb3JlIHRoYW4gb25lIGNoaWxkIGhhcyBiZWVuIGZvdW5kLCB0aGVuIHRoZSBvbmUgd2l0aCB0aGUgaGlnaGVzdCBkYiBpZCB3aWxsIGJlIHRoZSBtb3N0IHByb2JhYmxlIGNhbmRpZGF0ZSAqLwoJCQkJCWlmICgkZGJyZXN1bHQtPlJlY29yZENvdW50ICgpID49IDEpIHsKCQkJCQkJJG1pbmNvbm5lY3QgPSAwOwoJCQkJCQlmb3IoJGkgPSAwOyAkaSA8ICRkYnJlc3VsdC0+UmVjb3JkQ291bnQgKCk7ICRpID0gJGkgKyAxKSB7CgkJCQkJCQkkcm93ID0gJGRicmVzdWx0LT5GZXRjaFJvdyAoKTsKCQkJCQkJCWlmICgkcm93IFtzZWxmOjokUzEyMEZpZWxkcyBbMF1dID4gJG1pbmNvbm5lY3QpIHsKCQkJCQkJCQkkbWluY29ubmVjdCA9ICRyb3cgW3NlbGY6OiRTMTIwRmllbGRzIFswXV07CgkJCQkJCQl9CgkJCQkJCX0KCQkJCQkJaWYgKCRtaW5jb25uZWN0ID4gMCkgewoJCQkJCQkJJGNvbm5lY3QgPSAkbWluY29ubmVjdDsKCQkJCQkJfQoJCQkJCQoJCQkJCS8qIG5vIGNoaWxkIGhhcyBiZWVuIGZvdW5kLCB0aGlzIGlzIG5vdCBwb3NzaWJsZSBiZWNhdXNlIGNoaWxkcmVuIGFyZSBjb250YWluZWQgaW5zaWRlIHRoZSBzdHJ1Y3R1cmUgKi8KCQkJCQl9IGVsc2UgewoJCQkJCQkkcmV0dmFsID0gZmFsc2U7CgkJCQkJfQoJCQkJfQoJCQl9CgkJCWlmICgkcmV0dmFsICE9IGZhbHNlKSB7CgkJCQkvKiBjcmVhdGUgdGhlIGdpdmVuIGVudHJ5IGl0c2VsZiAqLwoJCQkJJGRiID0gJGdDbXMtPkdldERiKCk7CgkJCQkkc3FsU3RyaW5nICA9ICJJTlNFUlQgSU5UTyAiLmNtc19kYl9wcmVmaXgoKS5zZWxmOjpTZXRUYWJsZTEyMC4iICgiOwoJCQkJJHNxbFN0cmluZyAuPSBzZWxmOjokUzEyMEZpZWxkc1sxXTsKCQkJCSRzcWxTdHJpbmcgLj0gIiwgIi5zZWxmOjokUzEyMEZpZWxkc1syXTsKCQkJCSRzcWxTdHJpbmcgLj0gIiwgIi5zZWxmOjokUzEyMEZpZWxkc1szXTsKCQkJCSRzcWxTdHJpbmcgLj0gIiwgIi5zZWxmOjokUzEyMEZpZWxkc1s0XTsKCQkJCSRzcWxTdHJpbmcgLj0gIiwgIi5zZWxmOjokUzEyMEZpZWxkc1s1XTsKCQkJCSRzcWxTdHJpbmcgLj0gIiwgIi5zZWxmOjokUzEyMEZpZWxkc1s2XTsKCQkJCSRzcWxTdHJpbmcgLj0gIiwgIi5zZWxmOjokUzEyMEZpZWxkc1s3XTsKCQkJCSRzcWxTdHJpbmcgLj0gIiwgIi5zZWxmOjokUzEyMEZpZWxkc1s4XTsKCQkJCSRzcWxTdHJpbmcgLj0gIiwgIi5zZWxmOjokUzEyMEZpZWxkc1s5XTsKCQkJCSRzcWxTdHJpbmcgLj0gIikgVkFMVUVTICI7CgkJCQkkc3FsU3RyaW5nIC49ICIoIjsKCQkJCSRzcWxTdHJpbmcgLj0gJHNldC0+Z2V0UGxheWVyKCktPmdldElkKCk7CgkJCQkkc3FsU3RyaW5nIC49ICIsICIuJHNldC0+Z2V0R2VzKCk7CgkJCQkkc3FsU3RyaW5nIC49ICIsICIuJHNldC0+Z2V0RmVobCgpOwoJCQkJJHNxbFN0cmluZyAuPSAiLCAiLiRzZXQtPmdldEFicigpOwoJCQkJJHNxbFN0cmluZyAuPSAiLCBcIiIuc2VsZjo6ZXNjYXBlU1FMU3RyaW5nKCRzZXQtPmdldE9wcG9uZW50KCkpLiJcIiI7CgkJCQkkc3FsU3RyaW5nIC49ICIsICIuJHNldC0+Z2V0T0dlcygpOwoJCQkJJHNxbFN0cmluZyAuPSAiLCAiLiRzZXQtPmdldE9BYnIoKTsKCQkJCSRzcWxTdHJpbmcgLj0gIiwgIi4kc2V0LT5nZXRPRmVobCgpOwoJCQkJJHNxbFN0cmluZyAuPSAiLCAiLiRjb25uZWN0OwoJCQkJJHNxbFN0cmluZyAuPSAiKSI7CgkJCQkkcmVzdWx0ID0gJGRiLT5FeGVjdXRlKCRzcWxTdHJpbmcpOwoJCQl9CgkJfQoJCXJldHVybiAkcmV0dmFsOwoJfQoJCgkvKioKCSAqIERpZXNlIGZ1bmt0aW9uIMOkbmRlcnQgZWluZW4gYmVzdGVoZW5kZW4gMTIwIFd1cmYgU2F0eiBhdXMgZGVyIERhdGVuYmFuay4gV2ljaHRpZyBkYWJlaSBpc3QsICRzZXQtPmdldElkKCkgYmVyZWl0cwoJICogaW4gZGVyIERhdGVuYmFuayBleGlzdGllcnQuIFNvbnN0IHdpcmQgZXMgd2FocnNjaGllbmxpY2ggbml4IHdlcmRlbi4KCSAqIAoJICogQHBhcmFtIFNldDEyMCAkc2V0CgkgKiBAcmV0dXJuIGJvb2xlYW4gdHJ1ZSB3ZW5uIGVzIG3DtmdsaWNoIHdhciBkZW4gU2F0eiB6dSDDpG5kZXJuLCBmYWxzZSBzb25zdAoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGNoYW5nZVNldDEyMCgkc2V0KQoJewoJCSRyZXR2YWwgPSB0cnVlOwoJCSRjb25uZWN0ID0gIk5VTEwiOwoJCSRnQ21zID0gJEdMT0JBTFNbJ2dDbXMnXTsKCQlpZiAoJGdDbXMgJiYgKCRzZXQgaW5zdGFuY2VvZiBTZXQxMjApKSB7CgoJCQkvKiBEZXIgMTIwIFd1cmYgU2F0eiBlbnRow6RsdCB3ZWl0ZXJlIFPDpHR6ZSAqLwoJCQlpZiAoKCRzZXQtPmdldENvbm5lY3QoKSAhPSBOVUxMKSAmJiAoJHNldC0+Z2V0Q29ubmVjdCgpIGluc3RhbmNlb2YgU2V0MTIwKSkgewoKCQkJCS8qIHN1Y2hlIGRlbiB1bnRlcnNhdHogKi8KCQkJCSRzcWxzdHJpbmcgPSAiU0VMRUNUICogRlJPTSAiLmNtc19kYl9wcmVmaXgoKS5zZWxmOjpTZXRUYWJsZTEyMC4iIFdIRVJFICIuc2VsZjo6JFMxMjBGaWVsZHNbMF0uIj0iLiRzZXQtPmdldENvbm5lY3QoKS0+Z2V0SWQoKTsKCQkJCSRkYiA9ICRnQ21zLT5HZXREYigpOwoJCQkJJHJlc3VsdCA9ICRkYi0+RXhlY3V0ZSgkc3Fsc3RyaW5nKTsKCQkJCSRtYXhjb25uZWN0ID0gMDsKCQkJCWlmICgkcmVzdWx0LT5SZWNvcmRDb3VudCgpID49IDEpIHsKCQkJCQlmb3IoJGkgPSAwOyAkaSA8ICRyZXN1bHQtPlJlY29yZENvdW50ICgpOyAkaSA9ICRpICsgMSkgewoJCQkJCQkkcm93ID0gJHJlc3VsdC0+RmV0Y2hSb3cgKCk7CgkJCQkJCWlmICgkcm93IFtzZWxmOjokUzEyMEZpZWxkcyBbMF1dID4gJG1heGNvbm5lY3QpIHsKCQkJCQkJCSRtYXhjb25uZWN0ID0gJHJvdyBbc2VsZjo6JFMxMjBGaWVsZHMgWzBdXTsKCQkJCQkJfQoJCQkJCX0KCQkJCX0KCQkJCQkKCQkJCS8qIGRlciB1bnRlcnNhdHogd3VyZGUgZ2VmdW5kZW4gKi8KCQkJCWlmICgkbWF4Y29ubmVjdCA+IDApIHsKCQkJCQkkY29ubmVjdCA9ICRtYXhjb25uZWN0OwoJCQkJCgkJCQkvKiBkZXIgdW50ZXJzYXR6IHd1cmRlIG5pY2h0IGdlZnVuZGVuLCBhbHNvIG11c3MgZXIgYW5nZWxlZ3QgdW5kIGFuc2NobGllw59lbmQgZ2VzdWNodCB3ZXJkZW4gKi8KCQkJCX0gZWxzZSB7CgkJCQkJc2VsZjo6Y3JlYXRlU2V0MTIwKCRzZXQtPmdldENvbm5lY3QoKSk7CgkJCQkJJHNxbFN0cmluZyA9ICJTRUxFQ1QgKiBGUk9NICIgLiBjbXNfZGJfcHJlZml4ICgpIC4gc2VsZjo6U2V0VGFibGUxMjAgLiAiIFdIRVJFICI7CgkJCQkJJHNxbFN0cmluZyAuPSBzZWxmOjokUzEyMEZpZWxkcyBbMV0gLiAiPSIgLiAkc2V0LT5nZXRDb25uZWN0ICgpLT5nZXRQbGF5ZXIgKCktPmdldElkICgpOwoJCQkJCSRzcWxTdHJpbmcgLj0gIiBBTkQgIiAuIHNlbGY6OiRTMTIwRmllbGRzIFsyXSAuICI9IiAuICRzZXQtPmdldENvbm5lY3QgKCktPmdldEdlcyAoKTsKCQkJCQkkc3FsU3RyaW5nIC49ICIgQU5EICIgLiBzZWxmOjokUzEyMEZpZWxkcyBbM10gLiAiPSIgLiAkc2V0LT5nZXRDb25uZWN0ICgpLT5nZXRGZWhsICgpOwoJCQkJCSRzcWxTdHJpbmcgLj0gIiBBTkQgIiAuIHNlbGY6OiRTMTIwRmllbGRzIFs0XSAuICI9IiAuICRzZXQtPmdldENvbm5lY3QgKCktPmdldEFiciAoKTsKCQkJCQkkc3FsU3RyaW5nIC49ICIgQU5EICIgLiBzZWxmOjokUzEyMEZpZWxkcyBbNV0gLiAiPSIgLiBzZWxmOjplc2NhcGVTUUxTdHJpbmcgKCAkc2V0LT5nZXRDb25uZWN0ICgpLT5nZXRPcHBvbmVudCAoKSApOwoJCQkJCSRzcWxTdHJpbmcgLj0gIiBBTkQgIiAuIHNlbGY6OiRTMTIwRmllbGRzIFs2XSAuICI9IiAuICRzZXQtPmdldENvbm5lY3QgKCktPmdldE9HZXMgKCk7CgkJCQkJJHNxbFN0cmluZyAuPSAiIEFORCAiIC4gc2VsZjo6JFMxMjBGaWVsZHMgWzddIC4gIj0iIC4gJHNldC0+Z2V0Q29ubmVjdCAoKS0+Z2V0T0FiciAoKTsKCQkJCQkkc3FsU3RyaW5nIC49ICIgQU5EICIgLiBzZWxmOjokUzEyMEZpZWxkcyBbOF0gLiAiPSIgLiAkc2V0LT5nZXRDb25uZWN0ICgpLT5nZXRPRmVobCAoKTsKCQkJCQlpZiAoJHNldC0+Z2V0Q29ubmVjdCAoKS0+Z2V0Q29ubmVjdCAoKSAhPSBOVUxMKSB7CgkJCQkJCSRzcWxTdHJpbmcgLj0gIiBBTkQgIiAuIHNlbGY6OiRTMTIwRmllbGRzIFs5XSAuICI9IiAuICRzZXQtPmdldENvbm5lY3QgKCktPmdldENvbm5lY3QgKCktPmdldElkICgpOwoJCQkJCX0gZWxzZSB7CgkJCQkJCSRzcWxTdHJpbmcgLj0gIiBBTkQgIiAuIHNlbGY6OiRTMTIwRmllbGRzIFs5XSAuICIgSVMgTlVMTCI7CgkJCQkJfQoJCQkJCSRkYnJlc3VsdCA9ICRkYi0+RXhlY3V0ZSgkc3FsU3RyaW5nKTsKCQkJCQkKCQkJCQkvKiBpZiBtb3JlIHRoYW4gb25lIGNoaWxkIGhhcyBiZWVuIGZvdW5kLCB0aGVuIHRoZSBvbmUgd2l0aCB0aGUgaGlnaGVzdCBkYiBpZCB3aWxsIGJlIHRoZSBtb3N0IHByb2JhYmxlIGNhbmRpZGF0ZSAqLwoJCQkJCWlmICgkZGJyZXN1bHQtPlJlY29yZENvdW50ICgpID49IDEpIHsKCQkJCQkJJG1pbmNvbm5lY3QgPSAwOwoJCQkJCQlmb3IoJGkgPSAwOyAkaSA8ICRkYnJlc3VsdC0+UmVjb3JkQ291bnQgKCk7ICRpID0gJGkgKyAxKSB7CgkJCQkJCQkkcm93ID0gJGRicmVzdWx0LT5GZXRjaFJvdyAoKTsKCQkJCQkJCWlmICgkcm93IFtzZWxmOjokUzEyMEZpZWxkcyBbMF1dID4gJG1pbmNvbm5lY3QpIHsKCQkJCQkJCQkkbWluY29ubmVjdCA9ICRyb3cgW3NlbGY6OiRTMTIwRmllbGRzIFswXV07CgkJCQkJCQl9CgkJCQkJCX0KCQkJCQkJaWYgKCRtaW5jb25uZWN0ID4gMCkgewoJCQkJCQkJJGNvbm5lY3QgPSAkbWluY29ubmVjdDsKCQkJCQkJfQoJCQkJCQoJCQkJCS8qIG5vIGNoaWxkIGhhcyBiZWVuIGZvdW5kLCB0aGlzIGlzIG5vdCBwb3NzaWJsZSBiZWNhdXNlIGNoaWxkcmVuIGFyZSBjb250YWluZWQgaW5zaWRlIHRoZSBzdHJ1Y3R1cmUgKi8KCQkJCQl9IGVsc2UgewoJCQkJCQkkcmV0dmFsID0gZmFsc2U7CgkJCQkJfQoJCQkJfQoJCQl9CgkJCQoJCQkvKiBub3Qgc3RlcHMgYmVmb3JlIGhhdmUgZmFpbGVkLCB0aGVyZWZvcmUgaXQgaXMgcG9zc2libGUgdG8gY2hhbmdlIHRoZSBnaXZlbiBzZXQgKi8KCQkJaWYgKCRyZXR2YWwgIT0gZmFsc2UpIHsKCQkJCSRkYiA9ICRnQ21zLT5HZXREYigpOwoJCQkJJHNxbHN0cmluZyA9ICJVUERBVEUgIiAuIGNtc19kYl9wcmVmaXggKCkgLiBzZWxmOjpTZXRUYWJsZTEyMCAuICIgU0VUICI7CgkJCQkkc3Fsc3RyaW5nIC49IHNlbGY6OiRTMTIwRmllbGRzIFsxXSAuICI9IiAuICRzZXQtPmdldFBsYXllciAoKS0+Z2V0SWQgKCk7CgkJCQkkc3Fsc3RyaW5nIC49ICIsICIgLiBzZWxmOjokUzEyMEZpZWxkcyBbMl0gLiAiPSIgLiAkc2V0LT5nZXRHZXMgKCk7CgkJCQkkc3Fsc3RyaW5nIC49ICIsICIgLiBzZWxmOjokUzEyMEZpZWxkcyBbM10gLiAiPSIgLiAkc2V0LT5nZXRGZWhsICgpOwoJCQkJJHNxbHN0cmluZyAuPSAiLCAiIC4gc2VsZjo6JFMxMjBGaWVsZHMgWzRdIC4gIj0iIC4gJHNldC0+Z2V0QWJyICgpOwoJCQkJJHNxbHN0cmluZyAuPSAiLCAiIC4gc2VsZjo6JFMxMjBGaWVsZHMgWzVdIC4gIj1cIiIgLiBzZWxmOjplc2NhcGVTUUxTdHJpbmcgKCAkc2V0LT5nZXRPcHBvbmVudCAoKSApIC4gIlwiIjsKCQkJCSRzcWxzdHJpbmcgLj0gIiwgIiAuIHNlbGY6OiRTMTIwRmllbGRzIFs2XSAuICI9IiAuICRzZXQtPmdldE9HZXMgKCk7CgkJCQkkc3Fsc3RyaW5nIC49ICIsICIgLiBzZWxmOjokUzEyMEZpZWxkcyBbN10gLiAiPSIgLiAkc2V0LT5nZXRPQWJyICgpOwoJCQkJJHNxbHN0cmluZyAuPSAiLCAiIC4gc2VsZjo6JFMxMjBGaWVsZHMgWzhdIC4gIj0iIC4gJHNldC0+Z2V0T0ZlaGwgKCk7CgkJCQkkc3Fsc3RyaW5nIC49ICIsICIgLiBzZWxmOjokUzEyMEZpZWxkcyBbOV0gLiAiPSIgLiAkY29ubmVjdDsKCQkJCSRzcWxzdHJpbmcgLj0gIiBXSEVSRSAiIC4gc2VsZjo6JFMxMjBGaWVsZHMgWzBdIC4gIj0iIC4gJHNldC0+Z2V0SWQgKCk7CgkJCQkkZGItPkV4ZWN1dGUoJHNxbHN0cmluZyk7CgkJCX0KCQl9IGVsc2UgewoJCQkkcmV0dmFsID0gZmFsc2U7CgkJfQoJCQoJCXJldHVybiAkcmV0dmFsOwoJfQoJCgkvKioKCSAqIERpZXNlIEZ1bmt0aW9uIGdpYnQgenUgZWluZXIgZXhpc3RpZXJlbmRlbiBEYXRlbmJhbmtpZCBkZW4gU2F0eiB1bmQgYWxsZSBkYXJpbiBnZXNwZWljaGVydGVuIFN1YnPDpHR6ZSB6dXLDvGNrLgoJICogS29ubnRlIGRlciDDvGJlcmdlYmVuZW4gaWQga2VpbiBTYXR6IHp1Z2VvcmRuZXQgd2VyZGVuLCBkYW5uIHdpcmQgTlVMTCB6dXLDvGNrZ2VnZWJlbgoJICogQHBhcmFtIGludGVnZXIgJGlkIERpZSBEYXRlbmJhbmsgSUQgZGVzIFNhdHplcy4KCSAqIEByZXR1cm4KCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRTZXQxMjAoJGlkKSAKCXsKCQkkcmV0dmFsID0gTlVMTDsKCQkkZ0NtcyA9ICRHTE9CQUxTWydnQ21zJ107CgkJaWYgKCRnQ21zICYmIGlzX251bWVyaWMoJGlkKSkgewoJCQkkc3Fsc3RyaW5nID0gIlNFTEVDVCAqIEZST00gIiAuIGNtc19kYl9wcmVmaXggKCkgLiBzZWxmOjpTZXRUYWJsZTEyMCAuICIgV0hFUkUgIiAuIHNlbGY6OiRTMTIwRmllbGRzWzBdIC4gIj0iIC4gJGlkOwoJCQkkZGIgPSAkZ0Ntcy0+R2V0RGIoKTsKCQkJJHJlc3VsdCA9ICRkYi0+RXhlY3V0ZSgkc3Fsc3RyaW5nKTsKCQkJaWYgKCRyZXN1bHQtPlJlY29yZENvdW50KCkgPT0gMSkgewoJCQkJJHJvdyA9ICRyZXN1bHQtPkZldGNoUm93KCk7CgkJCQkkY29ubmVjdCA9IE5VTEw7CgkJCQlpZiAoJHJvd1tzZWxmOjokUzEyMEZpZWxkc1s5XV0gIT0gIk5VTEwiKSB7CgkJCQkJJGNvbm5lY3QgPSBzZWxmOjpnZXRTZXQxMjAoJHJvd1tzZWxmOjokUzEyMEZpZWxkc1s5XV0pOwoJCQkJfQoJCQkJJHJldHZhbCA9IG5ldyBTZXQxMjAoCgkJCQkJJHJvd1tzZWxmOjokUzEyMEZpZWxkc1swXV0sCgkJCQkJc2VsZjo6Z2V0UGxheWVyKCRyb3dbc2VsZjo6JFMxMjBGaWVsZHNbMV1dKSwKCQkJCQkkcm93W3NlbGY6OiRTMTIwRmllbGRzWzVdXSwKCQkJCQkkcm93W3NlbGY6OiRTMTIwRmllbGRzWzJdXSwKCQkJCQkkcm93W3NlbGY6OiRTMTIwRmllbGRzWzRdXSwKCQkJCQkkcm93W3NlbGY6OiRTMTIwRmllbGRzWzNdXSwKCQkJCQkkcm93W3NlbGY6OiRTMTIwRmllbGRzWzZdXSwKCQkJCQkkcm93W3NlbGY6OiRTMTIwRmllbGRzWzddXSwKCQkJCQkkcm93W3NlbGY6OiRTMTIwRmllbGRzWzhdXSwKCQkJCQkkY29ubmVjdAoJCQkJKTsKCQkJfQoJCX0KCQkKCQlyZXR1cm4gJHJldHZhbDsKCX0gCgkKCS8qKgoJICogRGllc2UgTWV0aG9kZSBsZWd0IGluIGRlciBEYXRlbmJhbmsgZWluZSBuZXVlIFp1b3JkbnVuZyBmw7xyCgkgKiBkZW4gw7xiZXJnZWJlbmVuIFNwaWVsZXIsIGRpZSDDvGJlcmdlYmVuZSBNYW5uc2NoYWZ0IHVuZCBkaWUKCSAqIMO8YmVyZ2ViZW5lIFNhaXNvbiBhbi4KCSAqIAoJICogQHBhcmFtIFBsYXllciAkcGxheWVyCgkgKiBAcGFyYW0gVGVhbSAkdGVhbQoJICogQHBhcmFtIFNhaXNvbiAkc2Fpc29uCgkgKiBAcmV0dXJuIHRydWUsIGZhbGxzIGRpZSBadW9yZG51bmcgZXJmb2xncmVpY2ggd2FyLCBmYWxzZSBzb25zdAoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGNyZWF0ZVBsYXllclRvVGVhbSgkcGxheWVyLCAkdGVhbSwgJHNhaXNvbikKCXsKCQkkZ0NtcyA9ICRHTE9CQUxTWydnQ21zJ107CgkJaWYgKCRnQ21zICYmICgkcGxheWVyIGluc3RhbmNlb2YgUGxheWVyKSAmJiAoJHRlYW0gaW5zdGFuY2VvZiBUZWFtKSAmJiAoJHNhaXNvbiBpbnN0YW5jZW9mIFNhaXNvbikpIHsKCQkJJGRiID0gJGdDbXMtPkdldERiKCk7CgkJCSRyZXN1bHQgPSAkZGItPkV4ZWN1dGUoIklOU0VSVCBJTlRPICIuY21zX2RiX3ByZWZpeCgpLnNlbGY6OlBsYXllclRvVGVhbVRhYmxlLiIgKCIuCgkJCXNlbGY6OiRQVEZpZWxkc1sxXS4iLCAiLnNlbGY6OiRQVEZpZWxkc1syXS4iLCAiLnNlbGY6OiRQVEZpZWxkc1szXS4iKSBWQUxVRVMgKCIuCgkJCSRwbGF5ZXItPmdldElkKCkuIiwgIi4kc2Fpc29uLT5nZXRJZCgpLiIsICIuJHRlYW0tPmdldElkKCkuIikiKTsKCQkJaWYgKCRyZXN1bHQpIHsKCQkJCXJldHVybiB0cnVlOwoJCQl9CgkJfQoJCQoJCXJldHVybiBmYWxzZTsKCX0KCQoJLyoqCgkgKiBEaWVzZSBGdW5jdGlvbiBsaWVzdCBhdXMgZGVyIERhdGVuYmFuayBlaW5lIFp1cm9kbnVuZyBmw7xyIFNwaWVsZXIsCgkgKiBTYWlzb24gdW5kIE1hbm5zY2hhZnQsIGRlcmVuIGlkIGJla2FubnQgaXN0LgoJICogCgkgKiBAcGFyYW0gaW50ICRpZAoJICogQHJldHVybiBQbGF5ZXJUb1RlYW0gRGllIHp1Z2Vow7ZyaWdlIFp1b3JkbnVuZwoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldFBsYXllclRvVGVhbSgkaWQpCgl7CgkJJGdDbXMgPSAkR0xPQkFMU1snZ0NtcyddOwoJCWlmICgkZ0NtcyAmJiBpc19udW1lcmljKCRpZCkpIHsKCQkJJGRiID0gJGdDbXMtPkdldERiKCk7CgkJCSRyZXN1bHQgPSAkZGItPkV4ZWN1dGUoIlNFTEVDVCAqIEZST00gIi5jbXNfZGJfcHJlZml4KCkuc2VsZjo6UGxheWVyVG9UZWFtVGFibGUuIiBXSEVSRSAiLgoJCQlzZWxmOjokUFRGaWVsZHNbMF0uIj0iLiRpZCk7CgkJCWlmICgkcmVzdWx0LT5SZWNvcmRDb3VudCgpID09IDEpIHsKCQkJCSRyb3cgPSAkcmVzdWx0LT5GZXRjaFJvdygpOwoJCQkJJHBsYXllciA9IHNlbGY6OmdldFBsYXllcigkcm93W3NlbGY6OiRQVEZpZWxkc1sxXV0pOwoJCQkJJHNhaXNvbiA9IHNlbGY6OmdldFNhaXNvbigkcm93W3NlbGY6OiRQVEZpZWxkc1syXV0pOwoJCQkJJHRlYW0gPSBzZWxmOjpnZXRUZWFtKCRyb3dbc2VsZjo6JFBURmllbGRzWzNdXSk7CgkJCQlyZXR1cm4gbmV3IFBsYXllclRvVGVhbSgkaWQsJHBsYXllciwkc2Fpc29uLCR0ZWFtKTsKCQkJfQoJCX0KCQkKCQlyZXR1cm4gTlVMTDsKCX0KCQoJLyoqCgkgKiBEaWVzZSBNZXRob2RlIMOkbmRlcnQgZWluZSBleGl0aWVyZW5kZSB6dW9yZG51bmcgdm9uIFNwaWVsZXIsCgkgKiBTYWlzb24gdW5kIE1hbm5zY2hhZnQuCgkgKiAKCSAqIEBwYXJhbSBQbGF5ZXJUb1RlYW0gJG9sZCBEaWUgT3JpZ2luYWx2ZXJrbsO8cGZ1bmcuIFNpZSBtdXNzIG1pdCBkZW0KCSAqIEluaGFsdCBpbiBkZXIgRGF0ZW5iYW5rIMO8YmVyZWluc3RpbW1lbi4KCSAqIEBwYXJhbSBQbGF5ZXJUb1RlYW0gJG5ldyBEaWUgbmV1ZSBWZXJrbsO8cGZ1bmcuIEVzIG11c3MgZ2VsdGVuCgkgKiAkb2xkLT5nZXRJZCgpID09ICRuZXctPmdldElkKCkKCSAqIEByZXR1cm4gYm9vbGVhbiB0cnVlLCBpZiBkYXRhYmFzZSBjb3VsZCBiZSBjaGFuZ2VkLCBmYWxzZSBvdGhlcndpc2UKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBjaGFuZ2VQbGF5ZXJUb1RlYW0oJG9sZCwgJG5ldykKCXsKCQkkZ0NtcyA9ICRHTE9CQUxTWydnQ21zJ107CgkJaWYgKCRnQ21zICYmICgkb2xkIGluc3RhbmNlb2YgUGxheWVyVG9UZWFtKSAmJiAoJG5ldyBpbnN0YW5jZW9mIFBsYXllclRvVGVhbSkpIHsKCQkJJHNhdmVkID0gc2VsZjo6Z2V0UGxheWVyVG9UZWFtKCRvbGQtPmdldElkKCkpOwoJCQlpZiAoKCRzYXZlZCA9PSAkb2xkKSAmJiAoJG9sZC0+Z2V0SWQoKSA9PSAkbmV3LT5nZXRJZCgpKSkgewoJCQkJJGRiID0gJGdDbXMtPkdldERiKCk7CgkJCQkkcmVzdWx0ID0gJGRiLT5FeGVjdXRlKCJVUERBVEUgIi5jbXNfZGJfcHJlZml4KCkuc2VsZjo6UGxheWVyVG9UZWFtVGFibGUuIiBTRVQgIi4KCQkJCXNlbGY6OiRQVEZpZWxkc1sxXS4iPSIuJG5ldy0+Z2V0UGxheWVyKCktPmdldElkKCkuIiwgIi4KCQkJCXNlbGY6OiRQVEZpZWxkc1syXS4iPSIuJG5ldy0+Z2V0U2Fpc29uKCktPmdldElkKCkuIiwgIi4KCQkJCXNlbGY6OiRQVEZpZWxkc1szXS4iPSIuJG5ldy0+Z2V0VGVhbSgpLT5nZXRJZCgpLiIgIi4KCQkJCSIgV0hFUkUgIi5zZWxmOjokUFRGaWVsZHNbMF0uIj0iLiRvbGQtPmdldElkKCkpOwoJCQkJaWYgKCRyZXN1bHQpIHsKCQkJCQlyZXR1cm4gdHJ1ZTsKCQkJCX0KCQkJfQoJCX0KCQkKCQlyZXR1cm4gZmFsc2U7Cgl9CgkKCS8qKgoJICogRGllc2UgTWV0aG9kZSBsaWVmZXJ0IGF1cyBkZXIgRGF0ZW5iYW5rIGFsbGUgenUgZWluZXIgU2Fpc29uCgkgKiBnZWjDtnJlbmRlbiBadW9yZG51bmdlbiB6d2lzY2hlbiBTcGllbGVybiB1bmQgTWFubnNjaGFmdGVuLgoJICogCgkgKiBAcGFyYW0gU2Fpc29uICRzYWlzb24gRGllIFNhaXNvbiwgZsO8ciBkaWUgZGllIFp1b3JkbnVuZ2VuIGRlcgoJICogRGF0ZW5iYW5rIGVybWl0dGVsdCB3ZXJkZW4gc29sbGVuCgkgKiBAcmV0dXJuIGFycmF5IG9mIFBsYXllclRvVGVhbSwgZGllIGdlZnVuZGVuZW4gWnVvcmRudW5nZW4KCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRQbGF5ZXJzVG9UZWFtKCRzYWlzb24pCgl7CgkJJGdDbXMgPSAkR0xPQkFMU1snZ0NtcyddOwoJCSRwbGF5ZXJzdG9zYWlzb24gPSBhcnJheSgpOwoJCWlmICgkZ0NtcyAmJiAoJHNhaXNvbiBpbnN0YW5jZW9mIFNhaXNvbikpIHsKCQkJJGRiID0gJGdDbXMtPkdldERiKCk7CgkJCSRyZXN1bHQgPSAkZGItPkV4ZWN1dGUoIlNFTEVDVCAqIEZST00gIi5jbXNfZGJfcHJlZml4KCkuc2VsZjo6UGxheWVyVG9UZWFtVGFibGUuIiBXSEVSRSAiLgoJCQlzZWxmOjokUFRGaWVsZHNbMl0uIj0iLiRzYWlzb24tPmdldElkKCkpOwoJCQlmb3IgKCRpID0gMDsgJGkgPCAkcmVzdWx0LT5SZWNvcmRDb3VudCgpOyAkaSA9ICRpICsgMSkgewoJCQkJJHJvdyA9ICRyZXN1bHQtPkZldGNoUm93KCk7CgkJCQkkcGxheWVyID0gc2VsZjo6Z2V0UGxheWVyKCRyb3dbc2VsZjo6JFBURmllbGRzWzFdXSk7CgkJCQkkdGVhbSA9IHNlbGY6OmdldFRlYW0oJHJvd1tzZWxmOjokUFRGaWVsZHNbM11dKTsKCQkJCSRwdHQgPSBuZXcgUGxheWVyVG9UZWFtKCRyb3dbc2VsZjo6JFBURmllbGRzWzBdXSwkcGxheWVyLCRzYWlzb24sJHRlYW0pOwoJCQkJYXJyYXlfcHVzaCgkcGxheWVyc3Rvc2Fpc29uLCAkcHR0KTsKCQkJfQoJCX0KCQkKCQlyZXR1cm4gJHBsYXllcnN0b3NhaXNvbjsKCX0KfQo/Pgo=]]></data>
	</file>
	<file>
	  <filename>/datamodel/Game.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKcmVxdWlyZV9vbmNlKCdUZWFtLnBocCcpOwoKY2xhc3MgR2FtZQp7Cglwcml2YXRlICRpZDsKCXByaXZhdGUgJG91cl90ZWFtOwoJcHJpdmF0ZSAkb3Bwb25lbnQ7Cglwcml2YXRlICRkYXRlOwoJcHJpdmF0ZSAkaG9tZTsKCXByaXZhdGUgJGlzXzEyMDsKCQoJcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRpZCwgJG91cl90ZWFtLCAkb3Bwb25lbnQsICRkYXRlLCAkaG9tZSwgJGlzXzEyMCkKCXsKCQlpZiAoaXNfbnVtZXJpYygkaWQpICYmICgkb3VyX3RlYW0gaW5zdGFuY2VvZiBUZWFtKSAmJiBpc19zdHJpbmcoJG9wcG9uZW50KSAmJiAoJGRhdGUgaW5zdGFuY2VvZiBEYXRlVGltZSkgJiYgaXNfYm9vbCgoYm9vbGVhbikkaG9tZSkgJiYgaXNfYm9vbCgoYm9vbGVhbikkaXNfMTIwKSkgewoJCQkkdGhpcy0+aWQgPSAkaWQ7CgkJCSR0aGlzLT5vdXJfdGVhbSA9ICRvdXJfdGVhbTsKCQkJJHRoaXMtPmhvbWUgPSAoYm9vbGVhbikkaG9tZTsKCQkJJHRoaXMtPm9wcG9uZW50ID0gJG9wcG9uZW50OwoJCQkkdGhpcy0+ZGF0ZSA9ICRkYXRlOwoJCQkkdGhpcy0+aXNfMTIwID0gKGJvb2xlYW4pJGlzXzEyMDsKCQl9Cgl9CgkKCXB1YmxpYyBmdW5jdGlvbiBpczEyMCgpCgl7CgkJcmV0dXJuICR0aGlzLT5pc18xMjA7Cgl9CgkKCXB1YmxpYyBmdW5jdGlvbiBnZXRJZCgpCgl7CgkJcmV0dXJuICR0aGlzLT5pZDsKCX0KCQoJcHVibGljIGZ1bmN0aW9uIGdldE91clRlYW0oKQoJewoJCXJldHVybiAkdGhpcy0+b3VyX3RlYW07Cgl9CgkKCWZ1bmN0aW9uIGdldEhvbWUoKQoJewoJCXJldHVybiAkdGhpcy0+aG9tZTsKCX0KCQoJZnVuY3Rpb24gZ2V0RGF0ZSgpCgl7CgkJcmV0dXJuICR0aGlzLT5kYXRlOwoJfQoJCglmdW5jdGlvbiBnZXRPcHBvbmVudCgpCgl7CgkJcmV0dXJuICR0aGlzLT5vcHBvbmVudDsKCX0KfQo/Pg==]]></data>
	</file>
	<file>
	  <filename>/datamodel/Match120.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKcmVxdWlyZV9vbmNlKCJTZXQxMjAucGhwIik7CnJlcXVpcmVfb25jZSgiR2FtZS5waHAiKTsKCmNsYXNzIE1hdGNoMTIwIHsKCXByaXZhdGUgJGlkOwoJcHJpdmF0ZSAkc3BpZWxwbGFuOwoJcHJpdmF0ZSAkb2NvdW50OwoJcHJpdmF0ZSAkcGNvdW50OwoJcHJpdmF0ZSAkczE7Cglwcml2YXRlICRzMjsKCXByaXZhdGUgJHMzOwoJcHJpdmF0ZSAkczQ7CgkKCXB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkaWQsICRzcGllbHBsYW4sICRvY291bnQsICRwY291bnQsICRzMSwgJHMyLCAkczMsICRzNCkKCXsKCgkJaWYgKGlzX251bWVyaWMoJGlkKSAmJgoJCSgkc3BpZWxwbGFuIGluc3RhbmNlb2YgR2FtZSkgJiYKCQlpc19ib29sKChib29sZWFuKSRvY291bnQpICYmCgkJaXNfYm9vbCgoYm9vbGVhbikkcGNvdW50KSAmJgoJCSgkczEgaW5zdGFuY2VvZiBTZXQxMjApICYmCgkJKCRzMiBpbnN0YW5jZW9mIFNldDEyMCkgJiYKCQkoJHMzIGluc3RhbmNlb2YgU2V0MTIwKSAmJgoJCSgkczQgaW5zdGFuY2VvZiBTZXQxMjApKSB7CgkJCSR0aGlzLT5pZCA9ICRpZDsKCQkJJHRoaXMtPnNwaWVscGxhbiA9ICRzcGllbHBsYW47CgkJCSR0aGlzLT5vY291bnQgPSAoYm9vbGVhbikkb2NvdW50OwoJCQkkdGhpcy0+cGNvdW50ID0gKGJvb2xlYW4pJHBjb3VudDsKCQkJJHRoaXMtPnMxID0gJHMxOwoJCQkkdGhpcy0+czIgPSAkczI7CgkJCSR0aGlzLT5zMyA9ICRzMzsKCQkJJHRoaXMtPnM0ID0gJHM0OwoJCX0gZWxzZSB7CgkJCSR0aGlzLT5pZCA9IDA7CgkJCSR0aGlzLT5zcGllbHBsYW4gPSBuZXcgR2FtZSgwLCBuZXcgVGVhbSgwLCAiZGVmYXVsdCIpLCAiZGVmYXVsdF9vcCIsIG5ldyBEYXRlVGltZSgpLCBmYWxzZSk7CgkJCSR0aGlzLT5wY291bnQgPSBmYWxzZTsKCQkJJHRoaXMtPm9jb3VudCA9IGZhbHNlOwoJCQkkdGhpcy0+czEgPSBuZXcgU2V0MTIwKDAsIG5ldyBQbGF5ZXIoMCwgImRlZmF1bHQiKSwgImRlZmF1bHRfb3AiLCAwLCAwLCAwLCAwLCAwLCAwLCBOVUxMKTsKCQkJJHRoaXMtPnMyID0gbmV3IFNldDEyMCgwLCBuZXcgUGxheWVyKDAsICJkZWZhdWx0IiksICJkZWZhdWx0X29wIiwgMCwgMCwgMCwgMCwgMCwgMCwgTlVMTCk7CgkJCSR0aGlzLT5zMyA9IG5ldyBTZXQxMjAoMCwgbmV3IFBsYXllcigwLCAiZGVmYXVsdCIpLCAiZGVmYXVsdF9vcCIsIDAsIDAsIDAsIDAsIDAsIDAsIE5VTEwpOwoJCQkkdGhpcy0+czQgPSBuZXcgU2V0MTIwKDAsIG5ldyBQbGF5ZXIoMCwgImRlZmF1bHQiKSwgImRlZmF1bHRfb3AiLCAwLCAwLCAwLCAwLCAwLCAwLCBOVUxMKTsKCQl9Cgl9CgkKCXB1YmxpYyBmdW5jdGlvbiBnZXRJZCgpCgl7CgkJcmV0dXJuICR0aGlzLT5pZDsKCX0KCQoJcHVibGljIGZ1bmN0aW9uIGdldEdhbWUoKQoJewoJCXJldHVybiAkdGhpcy0+c3BpZWxwbGFuOwoJfQoJCglwdWJsaWMgZnVuY3Rpb24gZ2V0T2NvdW50KCkKCXsKCQlyZXR1cm4gJHRoaXMtPm9jb3VudDsKCX0KCQoJcHVibGljIGZ1bmN0aW9uIGdldFBDb3VudCgpCgl7CgkJcmV0dXJuICR0aGlzLT5wY291bnQ7Cgl9CgkKCXB1YmxpYyBmdW5jdGlvbiBnZXRTMSgpCgl7CgkJcmV0dXJuICR0aGlzLT5zMTsKCX0KCQoJcHVibGljIGZ1bmN0aW9uIGdldFMyKCkKCXsKCQlyZXR1cm4gJHRoaXMtPnMyOwoJfQoJCglwdWJsaWMgZnVuY3Rpb24gZ2V0UzMoKQoJewoJCXJldHVybiAkdGhpcy0+czM7Cgl9CgkKCXB1YmxpYyBmdW5jdGlvbiBnZXRTNCgpCgl7CgkJcmV0dXJuICR0aGlzLT5zNDsKCX0KCQoJcHVibGljIGZ1bmN0aW9uIGdldE1hdGNoQ29tcGxldGVHZXMoKQoJewoJCSRyZXR2YWwgPSAwOwoJCSRyZXR2YWwgKz0gJHRoaXMtPnMxLT5nZXRDb21wbGV0ZUdlcygpOwoJCSRyZXR2YWwgKz0gJHRoaXMtPnMyLT5nZXRDb21wbGV0ZUdlcygpOwoJCSRyZXR2YWwgKz0gJHRoaXMtPnMzLT5nZXRDb21wbGV0ZUdlcygpOwoJCSRyZXR2YWwgKz0gJHRoaXMtPnM0LT5nZXRDb21wbGV0ZUdlcygpOwoJCXJldHVybiAkcmV0dmFsOwoJfQoJCglwdWJsaWMgZnVuY3Rpb24gZ2V0TWF0Y2hDb21wbGV0ZUFicigpCgl7CgkJJHJldHZhbCA9IDA7CgkJJHJldHZhbCArPSAkdGhpcy0+czEtPmdldENvbXBsZXRlQWJyKCk7CgkJJHJldHZhbCArPSAkdGhpcy0+czItPmdldENvbXBsZXRlQWJyKCk7CgkJJHJldHZhbCArPSAkdGhpcy0+czMtPmdldENvbXBsZXRlQWJyKCk7CgkJJHJldHZhbCArPSAkdGhpcy0+czQtPmdldENvbXBsZXRlQWJyKCk7CgkJcmV0dXJuICRyZXR2YWw7Cgl9CgkKCXB1YmxpYyBmdW5jdGlvbiBnZXRNYXRjaENvbXBsZXRlRmVobCgpCgl7CgkJJHJldHZhbCA9IDA7CgkJJHJldHZhbCArPSAkdGhpcy0+czEtPmdldENvbXBsZXRlRmVobCgpOwoJCSRyZXR2YWwgKz0gJHRoaXMtPnMyLT5nZXRDb21wbGV0ZUZlaGwoKTsKCQkkcmV0dmFsICs9ICR0aGlzLT5zMy0+Z2V0Q29tcGxldGVGZWhsKCk7CgkJJHJldHZhbCArPSAkdGhpcy0+czQtPmdldENvbXBsZXRlRmVobCgpOwoJCXJldHVybiAkcmV0dmFsOwoJfQoJCglwdWJsaWMgZnVuY3Rpb24gZ2V0TWF0Y2hDb21wbGV0ZVZvbGwoKQoJewoJCSRyZXR2YWwgPSAwOwoJCSRyZXR2YWwgKz0gJHRoaXMtPnMxLT5nZXRDb21wbGV0ZVZvbGwoKTsKCQkkcmV0dmFsICs9ICR0aGlzLT5zMi0+Z2V0Q29tcGxldGVWb2xsKCk7CgkJJHJldHZhbCArPSAkdGhpcy0+czMtPmdldENvbXBsZXRlVm9sbCgpOwoJCSRyZXR2YWwgKz0gJHRoaXMtPnM0LT5nZXRDb21wbGV0ZVZvbGwoKTsKCQlyZXR1cm4gJHJldHZhbDsKCX0KCQoJcHVibGljIGZ1bmN0aW9uIGdldE1hdGNoQ29tcGxldGVPR2VzKCkKCXsKCQkkcmV0dmFsID0gMDsKCQkkcmV0dmFsICs9ICR0aGlzLT5zMS0+Z2V0Q29tcGxldGVPR2VzKCk7CgkJJHJldHZhbCArPSAkdGhpcy0+czItPmdldENvbXBsZXRlT0dlcygpOwoJCSRyZXR2YWwgKz0gJHRoaXMtPnMzLT5nZXRDb21wbGV0ZU9HZXMoKTsKCQkkcmV0dmFsICs9ICR0aGlzLT5zNC0+Z2V0Q29tcGxldGVPR2VzKCk7CgkJcmV0dXJuICRyZXR2YWw7Cgl9CgkKCXB1YmxpYyBmdW5jdGlvbiBnZXRNYXRjaENvbXBsZXRlT0FicigpCgl7CgkJJHJldHZhbCA9IDA7CgkJJHJldHZhbCArPSAkdGhpcy0+czEtPmdldENvbXBsZXRlT0FicigpOwoJCSRyZXR2YWwgKz0gJHRoaXMtPnMyLT5nZXRDb21wbGV0ZU9BYnIoKTsKCQkkcmV0dmFsICs9ICR0aGlzLT5zMy0+Z2V0Q29tcGxldGVPQWJyKCk7CgkJJHJldHZhbCArPSAkdGhpcy0+czQtPmdldENvbXBsZXRlT0FicigpOwoJCXJldHVybiAkcmV0dmFsOwoJfQoJCglwdWJsaWMgZnVuY3Rpb24gZ2V0TWF0Y2hDb21wbGV0ZU9GZWhsKCkKCXsKCQkkcmV0dmFsID0gMDsKCQkkcmV0dmFsICs9ICR0aGlzLT5zMS0+Z2V0Q29tcGxldGVPRmVobCgpOwoJCSRyZXR2YWwgKz0gJHRoaXMtPnMyLT5nZXRDb21wbGV0ZU9GZWhsKCk7CgkJJHJldHZhbCArPSAkdGhpcy0+czMtPmdldENvbXBsZXRlT0ZlaGwoKTsKCQkkcmV0dmFsICs9ICR0aGlzLT5zNC0+Z2V0Q29tcGxldGVPRmVobCgpOwoJCXJldHVybiAkcmV0dmFsOwoJfQoJCglwdWJsaWMgZnVuY3Rpb24gZ2V0TWF0Y2hDb21wbGV0ZU9Wb2xsKCkKCXsKCQkkcmV0dmFsID0gMDsKCQkkcmV0dmFsICs9ICR0aGlzLT5zMS0+Z2V0Q29tcGxldGVPVm9sbCgpOwoJCSRyZXR2YWwgKz0gJHRoaXMtPnMyLT5nZXRDb21wbGV0ZU9Wb2xsKCk7CgkJJHJldHZhbCArPSAkdGhpcy0+czMtPmdldENvbXBsZXRlT1ZvbGwoKTsKCQkkcmV0dmFsICs9ICR0aGlzLT5zNC0+Z2V0Q29tcGxldGVPVm9sbCgpOwoJCXJldHVybiAkcmV0dmFsOwoJfQoJCglwdWJsaWMgZnVuY3Rpb24gZ2V0TWF0Y2hPcG9pbnRzKCkKCXsKCQlyZXR1cm4gJHRoaXMtPmNhbGNNYXRjaFBvaW50cygpWzFdOwoJfQoJCglwdWJsaWMgZnVuY3Rpb24gZ2V0TWF0Y2hQb2ludHMoKQoJewoJCXJldHVybiAkdGhpcy0+Y2FsY01hdGNoUG9pbnRzKClbMF07CQkKCX0KCQoJcHVibGljIGZ1bmN0aW9uIGdldFNldFBvaW50cygpCgl7CgkJcmV0dXJuICR0aGlzLT5jYWxjU2V0UG9pbnRzKClbMF07Cgl9CgkKCXB1YmxpYyBmdW5jdGlvbiBnZXRTZXRPUG9pbnRzKCkKCXsKCQlyZXR1cm4gJHRoaXMtPmNhbGNTZXRQb2ludHMoKVsxXTsKCX0KCQoJcHJpdmF0ZSBmdW5jdGlvbiBjYWxjU2V0UG9pbnRzKCkKCXsKCQkkcmV0dXJucG9pbnRzID0gJHRoaXMtPnMxLT5nZXRTZXRQb2ludHMoKSArICR0aGlzLT5zMi0+Z2V0U2V0UG9pbnRzKCkgKyAkdGhpcy0+czMtPmdldFNldFBvaW50cygpICsgJHRoaXMtPnM0LT5nZXRTZXRQb2ludHMoKTsKCQkkcmV0dXJub3BvaW50cyA9ICR0aGlzLT5zMS0+Z2V0U2V0T1BvaW50cygpICsgJHRoaXMtPnMyLT5nZXRTZXRPUG9pbnRzKCkgKyAkdGhpcy0+czMtPmdldFNldE9Qb2ludHMoKSArICR0aGlzLT5zNC0+Z2V0U2V0T1BvaW50cygpOwoJCXJldHVybiBhcnJheSgkcmV0dXJucG9pbnRzLCAkcmV0dXJub3BvaW50cyk7Cgl9CgoJcHJpdmF0ZSBmdW5jdGlvbiBjYWxjTWF0Y2hQb2ludHMoKQoJewoJCSRyZXR1cm5wb2ludHMgPSAwOwoJCSRyZXR1cm5vcG9pbnRzID0gMDsKCQkkbXBvaW50cyA9ICR0aGlzLT5zMS0+Z2V0U2V0UG9pbnRzKCkgKyAkdGhpcy0+czItPmdldFNldFBvaW50cygpICsgJHRoaXMtPnMzLT5nZXRTZXRQb2ludHMoKSArICR0aGlzLT5zNC0+Z2V0U2V0UG9pbnRzKCk7CgkJJG9wb2ludHMgPSAkdGhpcy0+czEtPmdldFNldE9Qb2ludHMoKSArICR0aGlzLT5zMi0+Z2V0U2V0T1BvaW50cygpICsgJHRoaXMtPnMzLT5nZXRTZXRPUG9pbnRzKCkgKyAkdGhpcy0+czQtPmdldFNldE9Qb2ludHMoKTsKCQkkbWdlcyA9ICR0aGlzLT5zMS0+Z2V0Q29tcGxldGVHZXMoKSArICR0aGlzLT5zMi0+Z2V0Q29tcGxldGVHZXMoKSArICR0aGlzLT5zMy0+Z2V0Q29tcGxldGVHZXMoKSArICR0aGlzLT5zNC0+Z2V0Q29tcGxldGVHZXMoKTsKCQkkb2dlcyA9ICR0aGlzLT5zMS0+Z2V0Q29tcGxldGVPR2VzKCkgKyAkdGhpcy0+czItPmdldENvbXBsZXRlT0dlcygpICsgJHRoaXMtPnMzLT5nZXRDb21wbGV0ZU9HZXMoKSArICR0aGlzLT5zNC0+Z2V0Q29tcGxldGVPR2VzKCk7CgkJaWYgKCRtcG9pbnRzID4gJG9wb2ludHMpIHsKCQkJJHJldHVybnBvaW50cyA9IDEwOwoJCX0gZWxzZSBpZiAoJG1wb2ludHMgPT0gJG9wb2ludHMpIHsKCQkJaWYgKCRtZ2VzID4gJG9nZXMpIHsKCQkJCSRyZXR1cm5wb2ludHMgPSAgMTA7CgkJCX0gZWxzZSBpZiAoJG1nZXMgPT0gJG9nZXMpIHsKCQkJCSRyZXR1cm5wb2ludHMgPSA1OwoJCQkJJHJldHVybm9wb2ludHMgPSA1OwoJCQl9IGVsc2UgewoJCQkJJHJldHVybm9wb2ludHMgPSAxMDsKCQkJfQoJCX0gZWxzZSB7CgkJCSRyZXR1cm5vcG9pbnRzID0gMTA7CgkJfQoJCQoJCXJldHVybiBhcnJheSgkcmV0dXJucG9pbnRzLCAkcmV0dXJub3BvaW50cyk7Cgl9Cn0KPz4=]]></data>
	</file>
	<file>
	  <filename>/datamodel/Player.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKY2xhc3MgUGxheWVyCnsKCS8qKgoJICogVGhpcyBpcyB0aGUgaWQgb2YgdGhlIHBsYXllciAobmVjZXNzYXJ5IGZvciBkYXRhYmFzZSBzYXZpbmcpCgkgKi8KCXByaXZhdGUgJGlkOwoJCgkvKioKCSAqIFRoaXMgaXMgdGhlIG5hbWUgb2YgdGhlIHBsYXllcgoJICovCglwcml2YXRlICRuYW1lOwoJCgkvKioKCSAqIFRoaXMgaXMgdGhlIGNvbnN0cnVjdG9yIGZvciB0aGUgcGxheWVyIGNsYXNzLgoJICogCgkgKiBAcGFyYW0gaW50ZWdlciAkaWQgdGhlIGlkIG9mIHRoZSBwbGF5ZXIgKG5lY2Vzc2FyeSBmb3IgZGF0YWJhc2Ugc3RvcmFnZSkKCSAqIEBwYXJhbSBzdHJpbmcgJG5hbWUgdGhlIG5hbWUgb2YgdGhlIHBsYXllcgoJICovCglwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJGlkLCAkbmFtZSkgCgl7CgkJaWYgKGlzX251bWVyaWMoJGlkKSAmJiBpc19zdHJpbmcoJG5hbWUpKSB7CgkJCSR0aGlzLT5pZCA9ICRpZDsKCQkJJHRoaXMtPm5hbWUgPSAkbmFtZTsKCQl9IGVsc2UgewoJCQkkdGhpcy0+aWQgPSAwOwoJCQkkdGhpcy0+bmFtZSA9ICdkZWZhdWx0JzsKCQl9Cgl9CgkKCS8qKgoJICogUmV0dXJucyB0aGUgaWQgb2YgdGhlIHBsYXllcgoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0SWQoKQoJewoJCXJldHVybiAkdGhpcy0+aWQ7Cgl9CgkKCS8qKgoJICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgcGxheWVyCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXROYW1lKCkKCXsKCQlyZXR1cm4gJHRoaXMtPm5hbWU7Cgl9Cn0KPz4=]]></data>
	</file>
	<file>
	  <filename>/datamodel/PlayerToTeam.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKcmVxdWlyZV9vbmNlKCdUZWFtLnBocCcpOwpyZXF1aXJlX29uY2UoJ1NhaXNvbi5waHAnKTsKcmVxdWlyZV9vbmNlKCdQbGF5ZXIucGhwJyk7CgpjbGFzcyBQbGF5ZXJUb1RlYW0KewoJcHJpdmF0ZSAkaWQ7Cglwcml2YXRlICRwbGF5ZXI7Cglwcml2YXRlICRzYWlzb247Cglwcml2YXRlICR0ZWFtOwoJCglwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJGlkLCAkcGxheWVyLCAkc2Fpc29uLCAkdGVhbSkKCXsKCQlpZiAoaXNfbnVtZXJpYygkaWQpICYmICgkcGxheWVyIGluc3RhbmNlb2YgUGxheWVyKSAmJiAoJHNhaXNvbiBpbnN0YW5jZW9mIFNhaXNvbikgJiYgKCR0ZWFtIGluc3RhbmNlb2YgVGVhbSkpIHsKCQkJJHRoaXMtPmlkID0gJGlkOwoJCQkkdGhpcy0+cGxheWVyID0gJHBsYXllcjsKCQkJJHRoaXMtPnRlYW0gPSAkdGVhbTsKCQkJJHRoaXMtPnNhaXNvbiA9ICRzYWlzb247CgkJfSBlbHNlIHsKCQkJJHRoaXMtPmlkID0gMDsKCQkJJHRoaXMtPnBsYXllciA9IG5ldyBQbGF5ZXIoMCwgImRlZmF1bHQiKTsKCQkJJHRoaXMtPnRlYW0gPSBuZXcgVGVhbSgwLCAiZGVmYXVsdCIpOwoJCQkkdGhpcy0+c2Fpc29uID0gbmV3IFNhaXNvbigwLCAiZGVmYXVsdCIsIG5ldyBEYXRlVGltZSgpLCBuZXcgRGF0ZVRpbWUoKSk7CgkJfQoJfQoJCglwdWJsaWMgZnVuY3Rpb24gZ2V0SWQoKQoJewoJCXJldHVybiAkdGhpcy0+aWQ7Cgl9CgkKCXB1YmxpYyBmdW5jdGlvbiBnZXRTYWlzb24oKQoJewoJCXJldHVybiAkdGhpcy0+c2Fpc29uOwoJfQoJCglwdWJsaWMgZnVuY3Rpb24gZ2V0UGxheWVyKCkKCXsKCQlyZXR1cm4gJHRoaXMtPnBsYXllcjsKCX0KCQoJcHVibGljIGZ1bmN0aW9uIGdldFRlYW0oKQoJewoJCXJldHVybiAkdGhpcy0+dGVhbTsKCX0KfQo/Pg==]]></data>
	</file>
	<file>
	  <filename>/datamodel/Result.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKcmVxdWlyZV9vbmNlKCdQbGF5ZXIucGhwJyk7CnJlcXVpcmVfb25jZSgnR2FtZS5waHAnKTsKCmNsYXNzIFJlc3VsdAp7Cglwcml2YXRlICRpZDsKCXByaXZhdGUgJHBsYXllcjsKCXByaXZhdGUgJGdhbWU7Cglwcml2YXRlICRvcHBvbmVudDsKCXByaXZhdGUgJGdlczsKCXByaXZhdGUgJGFicjsKCXByaXZhdGUgJGZlaGw7Cglwcml2YXRlICRjb3VudDsKCXByaXZhdGUgJG9nZXM7Cglwcml2YXRlICRvYWJyOwoJcHJpdmF0ZSAkb2ZlaGw7Cglwcml2YXRlICRvY291bnQ7CgkKCXB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkaWQsICRwbGF5ZXIsICRnYW1lLCAkb3Bwb25lbnQsICRnZXMsICRhYnIsICRmZWhsLCAkY291bnQsICRvZ2VzLCAkb2FiciwgJG9mZWhsLCAkb2NvdW50KQoJewoJCWlmIChpc19udW1lcmljKCRpZCkgJiYKCQkoJHBsYXllciBpbnN0YW5jZW9mIFBsYXllcikgJiYKCQkoJGdhbWUgaW5zdGFuY2VvZiBHYW1lKSAmJgoJCWlzX3N0cmluZygkb3Bwb25lbnQpICYmCgkJaXNfbnVtZXJpYygkZ2VzKSAmJgoJCWlzX251bWVyaWMoJGFicikgJiYKCQlpc19udW1lcmljKCRmZWhsKSAmJgoJCWlzX2Jvb2woKGJvb2xlYW4pJGNvdW50KSAmJgoJCWlzX251bWVyaWMoJG9nZXMpICYmCgkJaXNfbnVtZXJpYygkb2FicikgJiYKCQlpc19udW1lcmljKCRvZmVobCkgJiYKCQlpc19ib29sKChib29sZWFuKSRvY291bnQpKSB7CgkJCSR0aGlzLT5pZCA9ICRpZDsKCQkJJHRoaXMtPnBsYXllciA9ICRwbGF5ZXI7CgkJCSR0aGlzLT5nYW1lID0gJGdhbWU7CgkJCSR0aGlzLT5vcHBvbmVudCA9ICRvcHBvbmVudDsKCQkJJHRoaXMtPmdlcyA9ICRnZXM7CgkJCSR0aGlzLT5hYnIgPSAkYWJyOwoJCQkkdGhpcy0+ZmVobCA9ICRmZWhsOwoJCQkkdGhpcy0+Y291bnQgPSAoYm9vbGVhbikkY291bnQ7CgkJCSR0aGlzLT5vZ2VzID0gJG9nZXM7CgkJCSR0aGlzLT5vYWJyID0gJG9hYnI7CgkJCSR0aGlzLT5vZmVobCA9ICRvZmVobDsKCQkJJHRoaXMtPm9jb3VudCA9IChib29sZWFuKSRvY291bnQ7CgkJfSBlbHNlIHsKCQkJJHRoaXMtPmlkID0gMDsKCQkJJHRoaXMtPnBsYXllciA9IG5ldyBQbGF5ZXIoMCwgImRlZmF1bHQiKTsKCQkJJHRoaXMtPmdhbWUgPSBuZXcgR2FtZSgwLCBuZXcgVGVhbSgwLCAiZGVmYXVsdCIpLCAiZGVmYXVsdF9vcCIsIG5ldyBEYXRlVGltZSgpLCBmYWxzZSk7CgkJCSR0aGlzLT5vcHBvbmVudCA9ICJkZWZhdWx0X29wIjsKCQkJJHRoaXMtPmdlcyA9IDA7CgkJCSR0aGlzLT5hYnIgPSAwOwoJCQkkdGhpcy0+ZmVobCA9IDA7CgkJCSR0aGlzLT5jb3VudCA9IGZhbHNlOwoJCQkkdGhpcy0+b2dlcyA9IDA7CgkJCSR0aGlzLT5vYWJyID0gMDsKCQkJJHRoaXMtPm9mZWhsID0gMDsKCQkJJHRoaXMtPm9jb3VudCA9IGZhbHNlOwoJCX0KCX0KCQoJcHVibGljIGZ1bmN0aW9uIGdldElkKCkKCXsKCQlyZXR1cm4gJHRoaXMtPmlkOwoJfQoJcHVibGljIGZ1bmN0aW9uIGdldFBsYXllcigpCgl7CgkJcmV0dXJuICR0aGlzLT5wbGF5ZXI7Cgl9CglwdWJsaWMgZnVuY3Rpb24gZ2V0R2FtZSgpCgl7CgkJcmV0dXJuICR0aGlzLT5nYW1lOwoJfQoJcHVibGljIGZ1bmN0aW9uIGdldE9wcG9uZW50KCkKCXsKCQlyZXR1cm4gJHRoaXMtPm9wcG9uZW50OwoJfQoJcHVibGljIGZ1bmN0aW9uIGdldEdlcygpCgl7CgkJcmV0dXJuICR0aGlzLT5nZXM7Cgl9CglwdWJsaWMgZnVuY3Rpb24gZ2V0QWJyKCkKCXsKCQlyZXR1cm4gJHRoaXMtPmFicjsKCX0KCXB1YmxpYyBmdW5jdGlvbiBnZXRGZWhsKCkKCXsKCQlyZXR1cm4gJHRoaXMtPmZlaGw7Cgl9CglwdWJsaWMgZnVuY3Rpb24gZ2V0Vm9sbCgpCgl7CgkJcmV0dXJuICR0aGlzLT5nZXMgLSAkdGhpcy0+YWJyOwoJfQoJcHVibGljIGZ1bmN0aW9uIGdldENvdW50KCkKCXsKCQlyZXR1cm4gJHRoaXMtPmNvdW50OwoJfQoJcHVibGljIGZ1bmN0aW9uIGdldE9HZXMoKQoJewoJCXJldHVybiAkdGhpcy0+b2dlczsKCX0KCXB1YmxpYyBmdW5jdGlvbiBnZXRPQWJyKCkKCXsKCQlyZXR1cm4gJHRoaXMtPm9hYnI7Cgl9CglwdWJsaWMgZnVuY3Rpb24gZ2V0T1ZvbGwoKQoJewoJCXJldHVybiAkdGhpcy0+b2dlcyAtICR0aGlzLT5vYWJyOwoJfQoJcHVibGljIGZ1bmN0aW9uIGdldE9GZWhsKCkKCXsKCQlyZXR1cm4gJHRoaXMtPm9mZWhsOwoJfQoJcHVibGljIGZ1bmN0aW9uIGdldE9Db3VudCgpCgl7CgkJcmV0dXJuICR0aGlzLT5vY291bnQ7Cgl9Cn0KPz4=]]></data>
	</file>
	<file>
	  <filename>/datamodel/Saison.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCmNsYXNzIFNhaXNvbgp7Cglwcml2YXRlICRpZDsKCXByaXZhdGUgJG5hbWU7Cglwcml2YXRlICRiZWdpbjsKCXByaXZhdGUgJGVuZDsKCQoJcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRpZCwgJG5hbWUsICRiZWdpbiwgJGVuZCkKCXsKCQlpZiAoaXNfbnVtZXJpYygkaWQpICYmIGlzX3N0cmluZygkbmFtZSkgJiYgKCRiZWdpbiBpbnN0YW5jZW9mIERhdGVUaW1lKSAmJiAoJGVuZCBpbnN0YW5jZW9mIERhdGVUaW1lKSkgewoJCQkkdGhpcy0+aWQgPSAkaWQ7CgkJCSR0aGlzLT5uYW1lID0gJG5hbWU7CgkJCSR0aGlzLT5iZWdpbiA9ICRiZWdpbjsKCQkJJHRoaXMtPmVuZCA9ICRlbmQ7CgkJfSBlbHNlIHsKCQkJJHRoaXMtPmlkID0gMDsKCQkJJHRoaXMtPm5hbWUgPSAiZGVmYXVsdCI7CgkJCSR0aGlzLT5iZWdpbiA9IG5ldyBEYXRlVGltZSgpOwoJCQkkdGhpcy0+ZW5kID0gbmV3IERhdGVUaW1lKCk7CgkJfQoJfQoJCglwdWJsaWMgZnVuY3Rpb24gZ2V0SWQoKQoJewoJCXJldHVybiAkdGhpcy0+aWQ7Cgl9CgkKCXB1YmxpYyBmdW5jdGlvbiBnZXROYW1lKCkKCXsKCQlyZXR1cm4gJHRoaXMtPm5hbWU7Cgl9CgkKCXB1YmxpYyBmdW5jdGlvbiBnZXRCZWdpbigpCgl7CgkJcmV0dXJuICR0aGlzLT5iZWdpbjsKCX0KCQoJcHVibGljIGZ1bmN0aW9uIGdldEVuZCgpCgl7CgkJcmV0dXJuICR0aGlzLT5lbmQ7Cgl9Cn0KCj8+]]></data>
	</file>
	<file>
	  <filename>/datamodel/Set120.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKcmVxdWlyZV9vbmNlKCdQbGF5ZXIucGhwJyk7CnJlcXVpcmVfb25jZSgnR2FtZS5waHAnKTsKCmNsYXNzIFNldDEyMAp7Cglwcml2YXRlICRpZDsKCXByaXZhdGUgJHBsYXllcjsKCXByaXZhdGUgJG9wcG9uZW50OwoJcHJpdmF0ZSAkZ2VzOwoJcHJpdmF0ZSAkYWJyOwoJcHJpdmF0ZSAkZmVobDsKCXByaXZhdGUgJG9nZXM7Cglwcml2YXRlICRvYWJyOwoJcHJpdmF0ZSAkb2ZlaGw7Cglwcml2YXRlICRjb25uZWN0OwoJCglwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJGlkLCAkcGxheWVyLCAkb3Bwb25lbnQsICRnZXMsICRhYnIsICRmZWhsLCAkb2dlcywgJG9hYnIsICRvZmVobCwgJGNvbm5lY3QpCgl7CgkJaWYgKGlzX251bWVyaWMoJGlkKSAmJgoJCSgkcGxheWVyIGluc3RhbmNlb2YgUGxheWVyKSAmJgoJCWlzX3N0cmluZygkb3Bwb25lbnQpICYmCgkJaXNfbnVtZXJpYygkZ2VzKSAmJgoJCWlzX251bWVyaWMoJGFicikgJiYKCQlpc19udW1lcmljKCRmZWhsKSAmJgoJCWlzX251bWVyaWMoJG9nZXMpICYmCgkJaXNfbnVtZXJpYygkb2FicikgJiYKCQlpc19udW1lcmljKCRvZmVobCkgJiYKCQkoKCRjb25uZWN0ID09IE5VTEwpIHx8ICgkY29ubmVjdCBpbnN0YW5jZW9mIFNldDEyMCkpKSB7CgkJCSR0aGlzLT5pZCA9ICRpZDsKCQkJJHRoaXMtPnBsYXllciA9ICRwbGF5ZXI7CgkJCSR0aGlzLT5vcHBvbmVudCA9ICRvcHBvbmVudDsKCQkJJHRoaXMtPmdlcyA9ICRnZXM7CgkJCSR0aGlzLT5hYnIgPSAkYWJyOwoJCQkkdGhpcy0+ZmVobCA9ICRmZWhsOwoJCQkkdGhpcy0+b2dlcyA9ICRvZ2VzOwoJCQkkdGhpcy0+b2FiciA9ICRvYWJyOwoJCQkkdGhpcy0+b2ZlaGwgPSAkb2ZlaGw7CgkJCSR0aGlzLT5jb25uZWN0ID0gJGNvbm5lY3Q7CgkJfSBlbHNlIHsKCQkJJHRoaXMtPmlkID0gMDsKCQkJJHRoaXMtPnBsYXllciA9IG5ldyBQbGF5ZXIoMCwgImRlZmF1bHQiKTsKCQkJJHRoaXMtPm9wcG9uZW50ID0gImRlZmF1bHRfb3AiOwoJCQkkdGhpcy0+Z2VzID0gMDsKCQkJJHRoaXMtPmFiciA9IDA7CgkJCSR0aGlzLT5mZWhsID0gMDsKCQkJJHRoaXMtPm9nZXMgPSAwOwoJCQkkdGhpcy0+b2FiciA9IDA7CgkJCSR0aGlzLT5vZmVobCA9IDA7CgkJCSR0aGlzLT5jb25uZWN0ID0gZmFsc2U7CgkJfQoJfQoJCglwdWJsaWMgZnVuY3Rpb24gZ2V0U2V0UG9pbnRzKCkKCXsKCQkkcmV0dmFsID0gMDsKCQlpZiAoJHRoaXMtPmdldENvbXBsZXRlR2VzKCkgPiAkdGhpcy0+Z2V0Q29tcGxldGVPR2VzKCkpIHsKCQkJJHJldHZhbCArPSAxMDsKCQl9IGVsc2UgaWYgKCR0aGlzLT5nZXRDb21wbGV0ZUdlcygpID09ICR0aGlzLT5nZXRDb21wbGV0ZU9HZXMoKSkgewoJCQkkcmV0dmFsICs9IDU7CgkJfQoJCXJldHVybiAkcmV0dmFsOwoJfQoJCglwdWJsaWMgZnVuY3Rpb24gZ2V0U2V0T1BvaW50cygpCgl7CgkJJHJldHZhbCA9IDA7CgkJaWYgKCR0aGlzLT5nZXRDb21wbGV0ZU9HZXMoKSA+ICR0aGlzLT5nZXRDb21wbGV0ZUdlcygpKSB7CgkJCSRyZXR2YWwgKz0gMTA7CgkJfSBlbHNlIGlmICgkdGhpcy0+Z2V0Q29tcGxldGVPR2VzKCkgPT0gJHRoaXMtPmdldENvbXBsZXRlR2VzKCkpIHsKCQkJJHJldHZhbCArPSA1OwoJCX0KCQlyZXR1cm4gJHJldHZhbDsKCX0KCQoJcHVibGljIGZ1bmN0aW9uIGdldElkKCkKCXsKCQlyZXR1cm4gJHRoaXMtPmlkOwoJfQoJcHVibGljIGZ1bmN0aW9uIGdldFBsYXllcigpCgl7CgkJcmV0dXJuICR0aGlzLT5wbGF5ZXI7Cgl9CglwdWJsaWMgZnVuY3Rpb24gZ2V0T3Bwb25lbnQoKQoJewoJCXJldHVybiAkdGhpcy0+b3Bwb25lbnQ7Cgl9CglwdWJsaWMgZnVuY3Rpb24gZ2V0R2VzKCkKCXsKCQlyZXR1cm4gJHRoaXMtPmdlczsKCX0KCXB1YmxpYyBmdW5jdGlvbiBnZXRBYnIoKQoJewoJCXJldHVybiAkdGhpcy0+YWJyOwoJfQoJcHVibGljIGZ1bmN0aW9uIGdldEZlaGwoKQoJewoJCXJldHVybiAkdGhpcy0+ZmVobDsKCX0KCXB1YmxpYyBmdW5jdGlvbiBnZXRWb2xsKCkKCXsKCQlyZXR1cm4gJHRoaXMtPmdlcyAtICR0aGlzLT5hYnI7Cgl9CglwdWJsaWMgZnVuY3Rpb24gZ2V0T0dlcygpCgl7CgkJcmV0dXJuICR0aGlzLT5vZ2VzOwoJfQoJcHVibGljIGZ1bmN0aW9uIGdldE9BYnIoKQoJewoJCXJldHVybiAkdGhpcy0+b2FicjsKCX0KCXB1YmxpYyBmdW5jdGlvbiBnZXRPVm9sbCgpCgl7CgkJcmV0dXJuICR0aGlzLT5vZ2VzIC0gJHRoaXMtPm9hYnI7Cgl9CglwdWJsaWMgZnVuY3Rpb24gZ2V0T0ZlaGwoKQoJewoJCXJldHVybiAkdGhpcy0+b2ZlaGw7Cgl9CglwdWJsaWMgZnVuY3Rpb24gZ2V0Q29ubmVjdCgpCgl7CgkJcmV0dXJuICR0aGlzLT5jb25uZWN0OwoJfQoJcHVibGljIGZ1bmN0aW9uIGdldENvbXBsZXRlR2VzKCkKCXsKCQkkcmV0dmFsID0gJHRoaXMtPmdldEdlcygpOwoJCWlmICgkdGhpcy0+Y29ubmVjdCAhPSBOVUxMKSB7CgkJCSRyZXR2YWwgKz0gJHRoaXMtPmNvbm5lY3QtPmdldENvbXBsZXRlR2VzKCk7CgkJfQoJCXJldHVybiAkcmV0dmFsOwoJfQoJcHVibGljIGZ1bmN0aW9uIGdldENvbXBsZXRlT0dlcygpCgl7CgkJJHJldHZhbCA9ICR0aGlzLT5nZXRPR2VzKCk7CgkJaWYgKCR0aGlzLT5jb25uZWN0ICE9IE5VTEwpIHsKCQkJJHJldHZhbCArPSAkdGhpcy0+Y29ubmVjdC0+Z2V0Q29tcGxldGVPR2VzKCk7CgkJfQoJCXJldHVybiAkcmV0dmFsOwoJfQoJcHVibGljIGZ1bmN0aW9uIGdldENvbXBsZXRlQWJyKCkKCXsKCQkkcmV0dmFsID0gJHRoaXMtPmdldEFicigpOwoJCWlmICgkdGhpcy0+Y29ubmVjdCAhPSBOVUxMKSB7CgkJCSRyZXR2YWwgKz0gJHRoaXMtPmNvbm5lY3QtPmdldENvbXBsZXRlQWJyKCk7CgkJfQoJCXJldHVybiAkcmV0dmFsOwoJfQoJcHVibGljIGZ1bmN0aW9uIGdldENvbXBsZXRlT0FicigpCgl7CgkJJHJldHZhbCA9ICR0aGlzLT5nZXRPQWJyKCk7CgkJaWYgKCR0aGlzLT5jb25uZWN0ICE9IE5VTEwpIHsKCQkJJHJldHZhbCArPSAkdGhpcy0+Y29ubmVjdC0+Z2V0Q29tcGxldGVPQWJyKCk7CgkJfQoJCXJldHVybiAkcmV0dmFsOwoJfQoJcHVibGljIGZ1bmN0aW9uIGdldENvbXBsZXRlRmVobCgpCgl7CgkJJHJldHZhbCA9ICR0aGlzLT5nZXRGZWhsKCk7CgkJaWYgKCR0aGlzLT5jb25uZWN0ICE9IE5VTEwpIHsKCQkJJHJldHZhbCArPSAkdGhpcy0+Y29ubmVjdC0+Z2V0Q29tcGxldGVGZWhsKCk7CgkJfQoJCXJldHVybiAkcmV0dmFsOwoJfQoJcHVibGljIGZ1bmN0aW9uIGdldENvbXBsZXRlT0ZlaGwoKQoJewoJCSRyZXR2YWwgPSAkdGhpcy0+Z2V0T0ZlaGwoKTsKCQlpZiAoJHRoaXMtPmNvbm5lY3QgIT0gTlVMTCkgewoJCQkkcmV0dmFsICs9ICR0aGlzLT5jb25uZWN0LT5nZXRDb21wbGV0ZU9GZWhsKCk7CgkJfQoJCXJldHVybiAkcmV0dmFsOwoJfQoJcHVibGljIGZ1bmN0aW9uIGdldENvbXBsZXRlVm9sbCgpCgl7CgkJJHJldHZhbCA9ICR0aGlzLT5nZXRWb2xsKCk7CgkJaWYgKCR0aGlzLT5jb25uZWN0ICE9IE5VTEwpIHsKCQkJJHJldHZhbCArPSAkdGhpcy0+Y29ubmVjdC0+Z2V0Q29tcGxldGVWb2xsKCk7CgkJfQoJCXJldHVybiAkcmV0dmFsOwoJfQoJcHVibGljIGZ1bmN0aW9uIGdldENvbXBsZXRlT1ZvbGwoKQoJewoJCSRyZXR2YWwgPSAkdGhpcy0+Z2V0T1ZvbGwoKTsKCQlpZiAoJHRoaXMtPmNvbm5lY3QgIT0gTlVMTCkgewoJCQkkcmV0dmFsICs9ICR0aGlzLT5jb25uZWN0LT5nZXRDb21wbGV0ZU9Wb2xsKCk7CgkJfQoJCXJldHVybiAkcmV0dmFsOwoJfQp9Cj8+]]></data>
	</file>
	<file>
	  <filename>/datamodel/Team.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKY2xhc3MgVGVhbQp7CgkvKioKCSAqIFRoaXMgaXMgdGhlIGlkIG9mIHRoZSBUZWFtIChuZWNlc3NhcnkgZm9yIGRhdGFiYXNlIHNhdmluZykKCSAqLwoJcHJpdmF0ZSAkaWQ7CgkKCS8qKgoJICogVGhpcyBpcyB0aGUgbmFtZSBvZiB0aGUgVGVhbQoJICovCglwcml2YXRlICRuYW1lOwoJCgkvKioKCSAqIFRoaXMgaXMgdGhlIGNvbnN0cnVjdG9yIGZvciB0aGUgVGVhbSBjbGFzcy4KCSAqIAoJICogQHBhcmFtIGludGVnZXIgJGlkIHRoZSBpZCBvZiB0aGUgdGVhbSAobmVjZXNzYXJ5IGZvciBkYXRhYmFzZSBzdG9yYWdlKQoJICogQHBhcmFtIHN0cmluZyAkbmFtZSB0aGUgbmFtZSBvZiB0aGUgdGVhbQoJICovCglwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJGlkLCAkbmFtZSkgCgl7CgkJaWYgKGlzX251bWVyaWMoJGlkKSAmJiBpc19zdHJpbmcoJG5hbWUpKSB7CgkJCSR0aGlzLT5pZCA9ICRpZDsKCQkJJHRoaXMtPm5hbWUgPSAkbmFtZTsKCQl9IGVsc2UgewoJCQkkdGhpcy0+aWQgPSAwOwoJCQkkdGhpcy0+bmFtZSA9ICdkZWZhdWx0JzsKCQl9Cgl9CgkKCS8qKgoJICogUmV0dXJucyB0aGUgaWQgb2YgdGhlIHRlYW0KCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldElkKCkKCXsKCQlyZXR1cm4gJHRoaXMtPmlkOwoJfQoJCgkvKioKCSAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIHRlYW0KCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldE5hbWUoKQoJewoJCXJldHVybiAkdGhpcy0+bmFtZTsKCX0KfQo/Pg==]]></data>
	</file>
	<file>
	  <filename>/img/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/img/kegelbahn.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhbgBuAOfLAAEBAQEBAgICAQICAgMDAgMDAwMDBAQDBAMEAwQEBAQEBQQFBAUFBQYGBgcGBgYHBgcHBwkICQkJCAkJCQoJCQoKCQoKCgsLCw0LDAwMDA0MDA0MDQ0NDQ4NDQ4ODg8ODxAPDxAQEBEQEBERERIRERISEhMSEhMSExQTFBUUFBUVFBYVFRYWFhcWFhcXFxkYGBoYGBoZGBoZGRoaGhsaGhwbGx0cHB0dHR4dHh8dHR8eHiAfHyEfHyAgHyEgICIhISMiIiQjIyQkJCUkJCYlJScmJigmJignJygnKCknKCkoKCopKSspKSwpKSoqKisqKSsqKiwrKy0sLC4tLS8tLS8uLjAuLjAvLjAvLzEvLzEwMDMxMTQxMTMyMjQyMjQzMzU0NDY0NDY1NTc1NTc2Njg2Njg3Nzk3Nzk3ODo3ODk4Nzk4ODo4ODo4OTo5OTs5OTw5OTs6Ojw6Oj06Ojw7Oj07Oz07PD47Oz08PD88PEA8PT49PT89PUA9PUA+PkE+PkE/P0I/P0NAQENBQURBQERBQURCQkVCQkVCQ0VDQ0ZEQ0ZEREdEREdFRUhFRUhFRklFRUhGRklGRklHR0pHR0pHSEpISEtISExISUxJSExJSU1JSU1JSk1KSk5KSU5KSk5LSk5LS09LS09LTE9MTFBMTFFMTE9NTFBNTVFNTVFOTlJOTlJOT1NOTlNPTlNPT1RPT1RPUFRQUFVQUFVRUVZRUVZRUlZSUldSUldTUldTU1hTVFhUVFlUVFpUVVpVVVtWVlxXV11XV11YV11YWF5YWV9YWF9aWmBaWmFcW2FcXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH+EUNyZWF0ZWQgd2l0aCBHSU1QACH5BAEKAP8ALAAAAABuAG4AAAj+AP8JHEiwoMGDCBMqXMiwocOHECNKnEixosWLGDNq3Mixo8ePIEOKNAhgwIAAAgYICDCyZccBBQwcSLBAQQIEBwoQcMnTYgIGDSaEkJEjRwwRFBwwSNCzKcQGDyisYKLnEyxYnvo0WVEBQgOnYBVCiIBhR55WwZAlU4YsGKw7PTRIgBC2LsEJFjT4EEQLWLBix44ZEwasliAfHCxMsGv3woYXcFjh+uV3GLFgwH7pejUHBocLjMNm0DCCySVZtXT1opzZ165btDI9IdFBQ2inHkC8YFPqFWpdvHr14pXL1qxXqNi8CPHhdtMQJXgEIrXKN61b2G/VkvVqVanDJkT+OO9ZAkWQQqBOpaoea9Ys7q5WkQplKEiKE+N5pmgxpJCmT6KYksp6q6iSCiqifNIJIUO0oEJ+LrHwwhB+VKJJJ5+MUsqGpYgSSieaXPLHEC+4AGFLL8zwgxqNUHKJJpt0ImMnnGByCSWOsPEDDTKcOBINNviAxSCOSEKJJZckmSQlkzwySBY+3FCDjyPh4AMSbRyyiCOQRCKJJJE4Egkjh7yRxA86UDmSD0AQYQUehiCiCCN0LrJIIobgYQURQPig5khBFLHEFnIAMkghhhhSyCCAyLGFE0YI8WdLRzwhRRdn1OHHpn7YgQYXU0ChxKQUlXRSSislFAUVWXhBRhv+csThRhlfaFFFFAiZipJKLJH6D0wy0WQTTjohdEUXYJTBRhxyuGFGGFxgcRCwM9V0U047/flTUEMVdVRSSyUkRhpy7MEHHWuMgdC2QhFlFFJKMUUlVFJRZRVWWnHl1UX0TlXVVVlt1dVXJ45V1llprdXWW3HNVZHBZqGlFltuwSUXXfnhpRdffgEmGGGGIabYRBrv1ddfgQ1W2GGJLTaeY5BJRlkwlmGmGWeegSYRzJFNVtllmW3W2WfjjVbaaamtBkxrr8U2W20RGW3ab0ozDZtstNl2W2679fZbcMMVd1xyyzUHEde8+ZYa2MQZh5xyzDkHnXTUWZeddtx5B57+eBDNPV11slyX3XbdfedDeM6Vd156673S3nuvxDdfffdFpDh66rHnHnzy0Wcffrft199/AQ64SoEHJrhggw9CJLp/AApIoIEIKsigg85JSKGFGGrIoYcgikiiiRDpXuGFGXLY4Ychjliicymu2OKLMc5Y44057tgjRNGz6CKMM9JoI4468ugckEISaSSSSt7Y5JNRTgkR+kMWeWT77jsJpZTjWYmlllzyEpjERCYzoWki/svSlrr0pTCNqUxnStN42OQmOMmJToywE570xCc/SYSCb4rTnOp0pzztqU8QCtSgCnWoRC2qUY+KVEVUSChDIUpRjHIUpCR1okpdKlP+nOrUp0I1Kov4EFOa4pSnQCUqNa2qVa+K1axqdauMPNFVsJIVrWyFq6boClW9OsixkrWsZj0rWgr5Iq8SMkZlMctZ0JJWrkyyq1RZhFrCulaxEDKucp0rXQrBo7WIla2D9NFc6FIXQgQ5LGxRhF3dehe45HURSLrrW/HCiCW9Ba9wRaRf9gJYvgbGr6j4614B0xfBKALKf+FLYPt6CMQQNrGFWcxhFJmlxBRWsYZhTCK6TBjFGHYxh5SMYyj72MpE5rKIHPNkHlNZyFomkWd2LGUgY9nIGMIzmf3MZkLL2US66TOaAe1mQ9MZRMg5s5oFDWdEW4jUkKYa1vzCNVf+e5rWHjJPqtkTn07LGkT6mbR/Ng1rUFMI2ry2NuG0bWxwM9tDFqo24DhUbG8r29l0k7avXdRtZIubQvxWt8DdjXB6OxzfHkJSwAkOOyg1HOJYGp2/2W1weZPpShFyOcZpDnKS81zlINLTzDluc5HrHOVA55CiNu5xnJvc5xbyOtLJ7nS0U93tWveQqsbOdKir3epw11X+wK50s0ud7Vi3EOPxLnm/Y57wnle8CR2vd8oDXvOGV9fdIc93G9LrXImXkO5ND3zWG1/2zMc9FXmPeuG7Hvm011jpfa96MpLsYreXEPqp737tY5L+4hcRz9qPfUoSLfz49xDTrg9/qt3+n/wUkkAAMnCADzSgBCNS2wUK0IEFjKBEehvABhIQggdkCAgtOMIMlpCDKPxgm0J4QRJu8IQehMhyRYhBDZqwgw6hIQtv+EIdypAi4rWhC3MYQx5KJL0txCEMdwiRIwJRiUNsohEthcQgLpGI+/1hEjf1X/1C5IpR1CIVu0gSOoJRVazCohS3WMWDqNGOBkFwFqfIRYq0sYxwRKNBGKnHQhbkw288oxwLQmJCihFZbjRjHC9yyD8q0iCblGQm+UguRALyIDnGpCcNUuNENqWVqBxlLCuCZFHCcpX5CWYte1nMXJIlYsK0pS8hZM1kSlObzYRIl6OZTWbmh53ffGf+Osf5mJ6185zhjOdtCFrPpd3zoPqMGmmmVlA7AxSh+2QMRT0aNpBGNCKDbmihIarR27T0pjDN6d4i8miT4rRwk76NU38aVaEytanmwdxTkRrUpTrHq2jFqlrHylWHoPqqYdUqW2/j1r/mVa7OI6xDao3XuAYv19Bz7GExKz7slY+zDjHsZSOr2GOfL0j1e21o3yfb0kL7s6hdErVJ6xzi3ha4yN0tRLz92+PqNj/bra5zrwte6VaQu9b9bnTHA1/yspe+6BVUDeNb3vb6yL4DFiITi1gRgPs3vwQ/kYYnvOCEXDiMBVm4gjv8JxTLWMQjjkm1GrnHE8MYxCr21T/AivxjIAOlXZycJI/9aGSRf9KUoXylKl3+ESnzkpi4pLlGxozNZVJT5xlBsznBCU91Ar0idK7anfMp0KNXJNEWXXRGRer0iVT6pXjDtEqrTpFNHxWoSp0q1yXyarBmda1kHXtf7wrXwOKar2qv7GMRm9lmUzburb32aWG7bdbi3SHkNm5uhfv3h6S7ud6FbnYL35B6r3e+52X8QwyO34FLXiIS53CFLx8Ri4d4xZyXCMlvHPrSm/70qE+96lfflIAAADs=]]></data>
	</file>
	<file>
	  <filename>/img/schatten.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAAZAAAADICAIAAABJdyC1AAAAAXNSR0IArs4c6QAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9wBBxQqAQrckO8AAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAgAElEQVR42u2d3Xbbug6EaVlJ9/s/bdv451xolYuHBIEBSMlONHPR5aapLcnSxwEIgpfn85nGNPgOl8vl4AOoPnH8CnxHxS77t75WrlM+513xkufX93GxL4ZfJ9W7KybewYHb7ODnhzr4C3IDC/l983f2u6t6H+39xOp9wgccJrvyibNGi5Fv4SXnpf9C751fcprfDhPHjw2x/44CS/y1l3ydl8vlmM8FP+W1QzpykNOPMHb9wcPovXnsTKec+8T7bXDgfJNYOHBVlf/ierdLYFgrf3IYs/DEU/lPxzujt7qx9oOXfleIn4J8tP62+MdVP3lbkzXoo/E4YLrD8lEGG0iQ9zSAVf1r/qvCrJ2MiQmskZHhzCm5GEfC11z8OO+g2P6kfNve63GX96ro6YXj0/P5HDdH4LeDvOEFvBcrVJV/IrfUXA8Z83rh0WxWXuyYqHBwJBhJCIhJdxAZva8y9hXjT8jx2Y/AbeManr3X33W+OGJ6n6u8QK7PxTzcHqpEcu3hsFy3uD72viprgL+nl6qx850YIoFPjtfaIF5eRGT1GJgIGwwUAgRBfsEkVOCyB6JCJe4239n8UnrflMFBxI23qNKxNfLlxQJv/aNHAoE3TL1POaTxcb6HEuVObX8uvqfytYq/336i8mAgQyByJ7/KYSnfgn7lXcBCHmGEjD1UtS9QDpp3YcWpSi3C9vhGlSHRZKVyCfRR6z2LgPS7ypXLHMnxgyMEciP2MKH/VTkj5E/9NHcFVvjK43EMYjO9H9QbFZAXIqd62NKZtZq0qqj0eDzE1+UvDzodF2vMj1a+LdAyDGYNjkFVgPj4cbpoFXhgFEKZnksElvIktDeVHlJMyTN4vyAzJ2NefMRpej9CieyUKK+FVKXqI8o0f5vyX/UbqNUGqcfjkV+InmvWENRjFphQwzMXg/OegXxNjFbKcXrnX8Sf4BN2AaeDDDy9rxV8nHqDuemzepScld9wDXJmWkYnae9SzIpXlPcXIZVfL8uSf1i+LsmlM2vVPUuFqpJTpfIvVGZnCrbMYVkBlmtgGXw+U2hCKpBZcIUDILDawSB8NVzhWM8pm/hQ/IU37lBCisDAMB49ICgXL4VOE/Bpwt+/NyoolmqD1LIsy7I8n8/8V3HgFA91NT1/RavH43G/36sXrdsaTx4jI7OYTUPuDHOGEZyCNCc7dnJYYCzm4hQYhCJJX5ARulkGyYUAS3yikPFP8ez6ZUTKAlwZDzye0D1me/zVw9478eoKi8BStEEqvyiZtb1Dha2SWSW8VuXBaGl1v983SN3/qcWWNzYMU6A3A+Cy7npZBpI6AdMEsyJB8zTBJwoJEAJJXzNYQAZ2kFbK42QmTUTEtBlbHQpmRmwwgdBDicsBieRqgaUPGGKWUAzreqFfhtT1es0v8ulstEKYtZogqGi16Xa73RtVPivBC2jMx0838C22kCdTCTGUKEyJN/FMwR7AArkZKMwJlG4GgBWjlfI45XEbAZZ+O7UzZfi0ozdyx2nlApbXYPZCFiXKq1DV+qkNUvf7/Xq9brTa/izfPxuuXsJkVR7ailklqm6F8g97Pgt8CF3M0sssYgksV3G/+XyOB8X4DA5SmBdzWKC9MqexXWmjgMMqb24kQmnTdq47ChmfvFEhEiwj4apuMHvMEt2lyGsRVWXE13JqQ1VWSYnr9drO+ZTldZXJWk1jXKarNmZ9fX3dbrfyz9JwlUcDOpfqqTDHsfbKbp9YvaF3Nl3BlnKcrnyNy2eF40GwdFjP7rmqKJHsleJwAw4LMVn6hFQbE7XFOr0ntj1TV1ToKoxCUALyWhlWexGxeHlLG5XV41Sm1bqu25/rupaIaN9cqbBflQe1dVjZVX19ff39+/frn0q3Vfks88HTL3377SKFrLjD0p9GfVRXJk3CtFKqCkxbkayCI9esvNcIuwiuJ3qVqMcsy+r5i94kenVHtWU6ZtQp3mZ4oVxgLgJ3f+W563dp7yNaB9BLoufkVGmpthclqjZErOsqBpulz2orG57P5yo+IRWqns9nmb3aaLUBK79wMcuc75gLLLwCSzeDyhGaOYIEl3eZVZqDeTS8CAgs+MbrCcMOC3d/LTTb9IqeYRBLC3UopBlrznsmV0GVeUPq4XDPY+qn36aoyjy6gqp1XT8+PsRagsvlcr/ft3d+PB7bC7HIfkUoW+WwNmZ9fX39+fPnb6GWWe1pmzeoK1+OXF/QYbkKYUxamQhInqWL4eLmAK28lASZNZhu95abiHn30mT1BmmXw1L87MhShGOApTusMsdS3fNtMFhBKivT6uPjY/uzIkOFvxJVPZO16kFBNUtY0mqD1J9/yhFizmdVzDLvUVdFAmKvFGbhi8XMWcLetHEswjJtF75aIg10bvCuY9eXH4/UXoGRslkuVIWEomEXaaVELq5SfgRVyBThYNJdAZb5WFVjQOuqKlplV3W73TKtykvaRpfbnxln0NIcpcY9Yysz68+fP79//66Ytf1OWVBq1rno5aaueHsusMxiAiSH5Z10wwNJc4JCSQOPdKFEmo2A5W+98cx1ZXpfjYgtfYpQHGXBeeGJzUhwZiEOS6zMaqkN5rB0YK2FPv7p8/Pzfr+X1qnN0D8ej0yrklnltVrNgb2Xdy8dVsUsJTA0L4q50FSf601qjyTvA6kUZJkZ9zIuCDQewPP0YBOVQJ8/E3MjvfqQbObIjiftUyrmsPQpQrPeLQwsVxGcXs7am1tXgJU8tY29WUJ9HnCj1efn5/ZnRkFlrLbKrK04K7uiaqJQc1hIpXuVes/M+v37d5mDz5UQT1UJaFCj5CPBdTl4mYz36UWSr8jTONgDt1fKEG7EipiywQbEZgWDcszm1TPLkZAiLHD1b9phkYM3cO4BqwcvMHBpo84qjVUBq/JWt9tt81YtrdrKLLH7S5XGsrs15HfJAKqKG/7+/fv7n6rAsKyAR5jlGlTB/+gqMnA1/ASrRgNtUmK08kZ5g32r8TZbZmkbjiolzkUKskaKkJEpjlkOqy3h1n2omEM0Vykj0yAmsEr0bA4rp9g/Pz+zcalQta7rxpCtJqsXiiWlW4OSr6m6yvSy7zkw1LPvI8DytpZHGhKEHQcCLLzfgDiJ62VHrG997DEL9/9z9b2Kebe2ilJ8XM0WlXgMvkd/IaSVBQLT3osErChEgNU6rJy0qrxVplWuySoRoWcP5bIGZeRplxNWgWEOD3OVQ/5lZQoGBBaybmbwaXQ9873abnCeEWxrFZuhGwx+vcl15BNdHelc0agZPOrmwlU0YIbhe2wv5l37nZxdq3STpU+/tstu8rRgJlHrrXKJQw9V5ZFUc4WredVEbJVRYdafQqXJ6lk+sPQmUIazH7MUBz4lgeXdsACpPzRPYRYcXVsn4ARP0a1fvDG7awpoZGOe5G/so9emudqoJ7U0H4laelHhBqNqwi17q3VdNyxkWinhV+/KrHrYnDotsTK2yiqHXOhQpd71qDA5O7R509V7bHsFZpFi6/Lwo8K7Vo6ksRAHEUNV8i+uxsN2sJbVTNz0xpKdjJU3DYK4PzzdBhYM96LCspx9e95LY1WamApqGW3mELviszm9mqzWavWAJS4rHaTVYfFgIOc9BVh4bju8t9jcvJVraw+v5Qx/ocoyr4Q1Gg2Y3D2mC5O/5SyyrRYybJhRYfmwp6LYqqTVprZfMWKv0JCwmjFsO/nd/l/Vomizw585dHjrcQZbFM19kmNh7E60CsyljuxtF3ZegbNGplzwJoKzbO8eJss1xQTuYOSNWipg5S5XYvlCSwOxgx5yM6zg9Wor66qOyVVvv0wusb0f7q1wm3A8sLwJb+92s+NbhLvQP7L80Mup2HetAMJV42ou3BtJjO4KrDTQ0XRwU9UesDKzsrHKv3C9XqvGeWKpk+tBWwMXrqpyUJhV9ibVgZVC20fP1X6YG6kRHX8wwhczEOzEULXH5Inr4GMx+/StandK2k4vuaiaYZS16bkUflkWkVO9DbfAy74iF6uXderltlqEKQ2UzWPdaXPWg98QfJJ3fQamx6H4p7iSknt74XELc4yxmnuhAhMXOq1S0Xa97RXT9k+vaJXgrYl8OSyFX0qcKO6yo+9SsR+wkBUqu2IrFtjOfSqm2LrYje7tWbjHt7krsPa7wcLXSoyUZ1G1dFh5C4ntJ1WCu3r88W1M7RwWctF7Td8TvI8hUuoy/bsfn5KbOOiNHMxhkbLi/sa90uBZDBbB73FsswaDPW4zcF7C5b7Les7y/avnvcwdhUsvfQ4Lb56pqD30FNqR5ZgHdVdv7zrHvQ/mgMfmgC93lic9cjCYbszDHxdrAVBVn+cihtaj4KvK5wAr9WccTI+N7EQSLmLYL7I74NNdnb/SD9Xgqe30zO9xwWc55bCPm3tSbSiWbZeYRO8tdYpVKa7ekxdXTopd/cvXbX59SruCN3l4fuSRxBjx2qD1R6L5TT60Ch6rdm9tFRX+jLvCiFVnp/mmIr96tArsC53edZbwhNrjwZtYcvHOp7lT7furLksVEiqtg/Xoz9XvwOGwej7LXASgfPbB2asfHFu91lK96rJPWYx52I3xDsZzbl1Yb1ebnU7BWEuo+ymz207y7OJNlDCW4bl8iysQ2HBTr48JkG4ZOfTA7mzgiiGKot4Qea7tplyzgeBvRoDVLv4GGw9RFHWefIK+8V1MExzW3q34KYpi3KoBa3BNf68MgqKoE1ImbGLaoHKZcsS9HWUD27pQFPXt8CQWWo5UtPf+4+Il5X7r8iiK+gE4A5vK6rzzhYRTPBe/PIqi5lq5JfZGsQ6TFEVRIzHcgrBJjEjFiirWWFEUNRKQ6cHZ4nVJyjJmcoqiqNc4LCRD1lv0OHE/PoqiTuWzUIc1hYgioQgpiqKQeNAk14K/i+K/xKYx5BRFUSJbwrvP+hyWuIW9knonsyiKwu2VWWHuAJaCIe/WEgQZRZ3TWIltivF2CQtuyfDmVmQTRVGDJktkzjJOKHyXecKLoigXbaqfL1Pe1DRZRBVFUaC9UjizjBDKrF0gpyiKcoWBuhbvW3vtFUVRlNfK9ProuQtH9X29KIqiepDq5bVxiwMBi2CiKOoYbzUBWEmt72o7ux9z6BRFfUdOjSSOljA+aLsoijJjwKpFQsWsXsE51CLZSygyi6Lom3qoQigmvo9iwRYTkLi3YjKeogivtgZTbwJa+S93Pyx9j682mcWNvCiKnEpScwTRNJmhogNYYMs9kVz88iiK8WDb11OXGUWiIaF5ZIQURVGK0WnZhGBLNF8asCauW2btAkWdgVbiJKBuuESi6ejw9cNy7TdBVFHUOfmFKzmbIyyBo0nsz0dRDACB2BBJZomYmwasMJVIMYr68VEh6LBMSEUKR3u0E3eg0INYfqMUdRJm9XikwwsEBbQvoeLTXNuvEl4UdYbwMFzQYOazgrvm6LtOkEoUdUJm6XvFi9BA/m8cWKL5Ej+e2KKoE9ors3Yh+TcDLH9hmXu4sd+hKOpHxoZJXaMT0BI7pl5+PTHRTlGkVZP4FjeH3xFYvQ9zzQaSYhR1BnjtlBp6Pp8Lry9FURPl3ZLZ1ax4NOlOURQ1kQ/xnZ+rdxH787FhA0VRXhiFueHe+Vn8pMAOFBRFnSEk1CFVoUP5nXhImLg7IUVRFh9ESlQbbimk8zks5D+LsaHyH4k2ijqDqwI9VwAL6EaqlcggiqIQ7uSgb0pYtiCc0kNCmimKoo7hAOuwKIqaSSglgSUizFxUOLqWsDoO3enRalEUDdS+DkvkjrkFIdlEUeTXCBbc+xIqb2S2W2YFPEVRAUMzfxMK0VsF+ojShVHUCSE168FfcFPXwxOyzSo5RVEnVNuQSmzp1+NJsOOouKeFt7UNmUVRlAsU0OJnnCwTGwlSFEWZcWVkI9W2xajOKXorimJUqPwEV3Cr+sAe0xRFnY1N44QKAquXPEsD3dzpvCjqRxLKG+7hk4mL67B6DmtKe3mKon4Gwnq7Opc/ia2KWbyHkvzbilEUdXLbVTqpXNTZ/mnCa/F+vLhzqrKlD0VRhJceEuJWy5fDEv+sjN/cSQGKon6SxI6jShvSeEjY4xctFUVRAWa1tDL/74LYMN0ugZaKOKOoc7JJ7ENVdn8xjdWowxIDw2o3anNzaiKMos7jpMCgby9gJS7HoShqLAxMszah0N9FLMhqfRZFUef0UGBmyuu2FvCYAjvziPEgQUZRZ0OYGAzGYsP5m1Ao3bJIK4qiRoDgBpbe55SLoinqtK5qbvt2N7CUbaYpiqKON1mL7p7MzejBxvIMDCnqzOZLCbxcQFgCH5x/QsNFUdS4scKTSMEcFrJkkTijqFN5KBetxBY0ZlHU4jqgFkliiX1rvriDDkVRabhjMuSw2q6AYjxIElEUBWKrbbm+Y0go+iwyi6Iol8ny7nYaLxxtfVYbFbqK9CmK+tmQ0mcJEZ+1hIPJmMMisyjqJBIf9rYJqItZS+w4lJqsXoaLoiiaLMRzjQLLDC97/CK5KIqaqMWMB0W31m7XoyeqSC6KOrmlmmK1Fv3zYkUTYAUpEUZRP5VKOC5ccFjCAafemIEwoiiqQkTVI0/fVxUFVm+ZT1tQ3x4HRVEUEq7FjM6CGKsE70tIflHUaaNCc2EgmK5yb6Sq7/ac1DIKooqiTu6kxCjNpJWY+65+uCDgbMnVNhclqijqtN5q5D+KC2aq1/nF4v0AtuKjKAoJy3qbaSEmyz1LaFKpjVf5nVEUaaUjqfdPyqLjMjZcwsfUoorMoqiTY6stYvBuVKqbLAewqvbMc2NaiqK+r6VCfgHBlrusofcWSPE6199QFJXgsgGxCZWCnQRu86UYthikyDWKOhW2wsEgVNbQ81P6PtQ9fJJTFMVocYqbWUBUpaanOwggZrUo6oScwucNXVpAe2V2j2H0R1FUYDYwefaWX8Kg0XNY5BRFUeMxIAos8R25NQ5FUT1XhWfZwwwJ7poT+zzmsyjqnKbJLITaXsQ3oUDWDIaT7iQXRZ3Bc03/L8uUDxPfhAsMKYoOq7VUrqx3xZDFpBXYnqEtuWLhO0WRU0nKfYfhoDXw6y1sFttEtK0F6bAo6mycagsUSlohs3a6Q3LsSxjb+JCiqNOCTKdVz2cpkFlMSJFWFEXhPkupPBdXO4PM2n6yJGmnCbFle++vFEVRrbcqHVb71+QpcO86LHPn1PxXMcXORDtFUWZgmKJV6HZICIJMNIcURZ3WW/VMVvtP+nuWqFnyj5AQD9+plVaLok5IK/EnLbaQdxOnC6FtvpiuoigqHAkqrfGmhYQu+8fYkKLObKZ6Hqp93abedwRWj1BMt1MU1WPCyLRgBFj42h8yi6LO7LPKFyKtBhGBbkLRKwbrbXcBco2Ao6hvzSlxEXFS0+34U99mz9eAxzO9lTJZ0B6B+MM3GTHCEs9oDzpXHxSYfzmbC3jzc2+/Qe+WMy/59sWcerivejU/WP7m6joO/fjwyxp7zL7vQ/JuH3RmYxvm16su2vTPHSS4gqHWRvWyVyateke19myO0iumTfu3FBMPXayS/3YjXmKdB4eWb3Uu+u06MuYpNaIiKMbTWKsrNOtNSfawlTqrdjabt31c+OgPC7vCnzJ4ggdrpK/sN5Vr4ImF2+9w9WIgQ2jV/lUBGZI7MsPJ1cSTXvTVq7NQKvFn3WdmqT34Je10S1Wx93s+9vjShYlnMc7xwbFKdPrHDGY/g/69pjH6+hvR1ngn5VYdb0qAqmtZlmVZdGDF0u0VCMbvjJE7bNYQPXgfDw6VB+dxxt9k8B0CGYnwbMbehHrJNEsFqe1Jz498++C3P+mBxRES4g8wru0cHo/HsizP53P7s2xG6vo6p0RYYTyV8azy+8joPbeEDST4oLc65mkJz5GF33AuUGYNk3M/t71D2kcp8B2JSDLhBUaLELCqvLgXTIq293w8HiWtvPfi3qlupILMPCrkIHcKFV3Xp/fLuEcIDDYB37fHNOjL50zAk5oLNaX1sGvM6wFLkUKupGbAZWCZoVkMUsuyXK/Xx+NxvV7LicJAu3cXFAI3q1kiG7sJkE8J3Cj66ZsXNkBYrzf8RrOo3gFmblQ4MUtgfgvivepqG9XSKqVUWqrrP+XXPX7pbkspP1jBwxL9XoWt6/9rXdcNTJfL5X6/Xy6X7LDwexq8ylMGJRe2endDD2HesrqJD154J6SJPjSFdgOOgc/VX2nK2w5ew1k2Fjllc5dmF7BK+1JyqlX+hQpbZqbbzmGJqKqC1Uwo8RDXdb3f7xue8jtsf308HsnfZNnsJjh4v/a2+sAdlnkf9IA1BVvIPYeMt4NYn5iOHJxG8N4A+vF47yg9TYbQauJUY+/ONIfYALDy4//x8bEWUsgllmj5ZgnFR6vKq4l+atPHx0dFq5x6b+NBMIGNb4Qh3hzI8wzW47bhM3If9Dg1ziw8Ju39Jj7ATulndECmcq7D6tEE9K0KrQKLcAdpJT5Hug9oUd7zMS0KMq0qbClBYrJK5Fc8aSWiKkNqY+pGq/v9ns/z/k+xjDtyoZFnCQ8nlS2JAndD7yOmtN3QB8lACsM1wB6QG94jk52ipQzmmgdzrFKuW6C0cpxW+hCrn0WZwCpDwgyEz8/Pj0Kt1er5LD0qXM0vrMpV9Wi1HWIGU/5fGVhbPIjTSt/LxxXWgb434H3Am6A1bj1mxZ46ZMw0QwDXAJveY65zHFgBK4RwIZBzQC5s4BzFm1MfYvFBvZwBrELCj4+PX79+fX5+iuTK8CpTTNtr/UzX1ui2xiy/aZm0aml1u92qSPB2u20/3OR1WO1Vxu8J0xCJN6vX+JRvBQKrt0FbGFh64AxSDJkwcj1ah9EKSfeEZ5nNE0SsSlJXsSijI9IBBb8rlBd4FNIOuiUcSjJsqPr161eLrSo8zNhCWpKuiLcqEZiD0sypr6+v2+1W5a223xGBNUKr9hLrtwJye/XsrrnXY+84e8ByrReN2StvqgJPew0yK1Ydolfhej/ONBGuwM2VEADTlzFyIcZKp5V3UkuscW+tTAbWf//9t2FLjBB7gSEUEpZrktuSq8ryba6qolXm2jZXmIFVTRGCtFKAVd3NegaqZ4WUu0q/h6q7H7xrx7c8CqQn9JhFMVZI7OydBVN6m+ixyZTMjivNND5c4bcWmI7A5xN0VIFbJitRgs6HEhG//l8ZWyKwyqhQnAaU28u0z1Vr+TKw2jnB6/W62a78r3o8qA9clarLqjsjMH+PJ8UDUaEyt4Lv3A3aq/D4Gat3Q5gVeOz1gHQkFDXfHPE44MVHgGUibMr8Tw9V4E2iA6uXL6qAlU1WCaw2k2Vm3+W1hGUmqyJoWbtQTv9lWm3/moElJrCSuhqgFwz2kIdQppcOQ8CHhJkmEMFF4+bcuc5fE1hglXzvhU4i8F9B5+sNSM0h0ARWoNZEsS3gQOiyXbpLjdEKTCAowGqrx1uTtQHrv//+U5hV1TeIX6hd1iDGgyWGSq7lo8z2qnJYvbtfjwer/BcSbfWApbt3sHl+SxOw8KK3il1JmemGCElS4PtLugrfEGDpD57+jCmzIrFCkECJHAIsPc3ay2Cm/rZXvfvBZVFbEuHA0i9UW9DQVpKXVZll9r2MChVaKWmsVZlSqeLBx+OxruujUNl0IR9om9sSgYVc/er65hSYGW0pthkfDF01B+bcNhgS4sXfojfRDX84gahklHovQGCFxxIXtlzfjisKE+MA8eAVSCnDbWAqCUm3I5YcTGuIK4hFZpXYqphVFZEqX+VqThFuJ9Myq0erMnsFVmCZsZtyQygDV2Aw1IGV/Ct19OkV776SIrPwGzEBzVXwSU8QWHo2MFC5gjPFFeTqiSQkHgQnhZTmdmY6wgwGB7GVPJXPZeJJXFNcMqu0WmVUWNY3IHmStZwWrIbQtsC9Mkp5TrCMFm//1MaDYKNIM3uFD1+mvfIWkZqT3OCXHZ4idGXcwexV5awHmaVHQO0ngg4rPIqYDmswbdTDVi/NkuDOnMhpgvYqRiszsG1pJZaX52UwG6cysNolO2afrLWHj7JaPffeW9e1GjrKZPzmrb6+vu6FxCWESIpU5JTpsPCQMFY4g0/SJ6vMPbBtt5I/9torMCRXYmcTWOYTCFbb6TQETyd5anoDaSPw4L3AwtdaIPMt45MzYk1Dr9lUBtb1es3MKqvN25AwvjSn8n7tQ1iZr9JelbQygQVmBxRPNJ7DAgMQE1uuEmHdLyAN9ryrLgLAMq+SaVJMh6Vn38BMk2sONwGLHHDj1osAkJCwBy8liK4iIdBbeb2YXjUqAguxWjlCbBs5VHVYUFlDu5NNSSvR1GzHVIWBFa2QKcL2mTcTyfrdIL4tkpaO1eboVktZmoM/cuOFo+bFN5NK4IyhHqTHPi68+zmy1g98TwUWZp7BTLojwxhYAKiUgyLAAmtf9c7IJbOqxFbZv8F0WEK3hjZ71bKpNFllMLgtb849sDKqcjColIyCGU19BFDG84B5BuMd77S6GTQlrH0d0tkGnxyMRRmps2JGL2QLfy+D8yFI8x9kdVdvhQNoD5HKhsB6eJNEyb8KOpCErco+FbfV6/CnNFA2QsKyarTMrG8bSaSiG18+pkyo7KpEWpk17i5mIVV5osPyBjvJv8LexawU6t/katXg6iDmegaQ2ivk8esN+Poz4yqRw+e/XPbZa9jBaiyXvcJp5TLjqbNVndJ7qme7qnLO6s+2pkF5vro7P1eXaUu6V4e7UWzD2TaHWFVpIR0avOnSwMrS5GlWY/Yb8a6kw/NiXlSlgWYM+IR94Cp5Vzghz0+so4ZCK6QqFQdWjxcK0MHyUZe9Am8JfQmha2mR0ukYSXK1Xdf1E1/FBFbembm1WlVp+8asklCitwLDLlcdDV6hE/iOQZMFOixvPylwa4BAAwZwxgPMhZnACk+6JWeTllm3EDgIuTp5uorU9LBUL8RLcE8+rx/X+yMleJOtCl5tOGkazO7SnJZZec+bHBJur02nXIIAAAJlSURBVMv2xwFaBZilz/Kk0Lq/5G+TFFhP7121i3RnT6Ge7q5gvPcpypqvcBGm+V2EV/ylSa0gzHgzMDWR4Dp7MxvgGsbwJRD6Ps+6VdRDSFdN4gVvpCvOhrRsQpYru4CV/J2MwlU5ePo8RRuAIL+MbxqY/Ds1IXJ10dJ9VmwuL4213vfeP/itGAg5E1ZnG+jNnUIdhAb3pnNV2+H86qUO6lsLHK71ktlePXp48wj8sYx1MhnMT4+03FQGcBenRv7J9SiaTDR9Fjjplpw7ubkmanFmeVun4neRadIDyc3Ytl3jvfwDvb3MAj0E1hfX+eCFs67GJuN7CMeanKXQblcjjZnCD8Mgj/BHFPFrYC4SvFC4HRjctgfvAT1uSGMm3XtSI0nMkb0U8aaD+gkGFode8PNRginvXOng/TGFCLM2QB7Z1yRN2s95v52WXbe72Xc80ItiMDs+8YsOcFy51fHOYgFQhsc50Dgnf33i4O4bNrCQb8UsqE2eVcFHMms87xPeziSWvToGT9M/aNyzzL3yx5N9D58ei9xdx28Ow4FkbniLRgewcGzFskLv47BGkrLhx9Js1PdyZs0CutcH7cfEvS9dLKkfoLC39mXiMxXbEg18cIx59jCDTS8aM/m78mtWYBXeHuYlNucln77Trl8j+yHveiWnAH1w6+/9ThY8WtcUeez0L4ETC6S9XqWRyOslj+i7XcBvocDeaN/3LAbPa1YKb3DwCP+XS+xbfFUO+Ic9QryAB1zw73Uxp6fkAnPfe9/kI0/HZWKRYfg39wsJZ53a2x4h9c63zcF+fA86z5pNmqX/AdCVvvsrw4wvAAAAAElFTkSuQmCC]]></data>
	</file>
	<file>
	  <filename>/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[]]></data>
	</file>
	<file>
	  <filename>/kegelergebnisse.module.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBNb2R1bGU6IGtlZ2VsZXJnZWJuaXNzZSAtIERpZXNlcyBNb2R1bCBrYW5uIGbDvHIgZGllIEVpbmdhYmUgdW5kIGVpbnplaWdlIGRlciBLZWdlbGVyZWdlYm5pc3NlIGVpbmVzIEtsdWJzIHZlcndlbmRldCB3ZXJkZW4uIEVzIHdlcmRlbiBzb3dvaGwgU2Fpc29ucyBhbHMgYXVjaCBNYW5uc2NoYWZ0ZW4gdmVyd2FsdGV0LiBadXPDpHR6bGljaCBrw7ZubmVuIG5vY2ggICB3ZWl0ZXJlIFN0YXRpc3Rpa2RhdGVuIGF1c2dlZ2ViZW4gd2VyZGVuLgojIFZlcnNpb246IDAuMC41LCBHZXJhbGQgTHV0dGVyCiMKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBDTVMgLSBDTVMgTWFkZSBTaW1wbGUgaXMgKGMpIDIwMTIgYnkgVGVkIEt1bHAgKHdpc2h5QGNtc21hZGVzaW1wbGUub3JnKQojIFRoaXMgcHJvamVjdCdzIGhvbWVwYWdlIGlzOiBodHRwOi8vd3d3LmNtc21hZGVzaW1wbGUub3JnCiMKIyBUaGlzIGZpbGUgb3JpZ2luYWxseSBjcmVhdGVkIGJ5IE1vZHVsZU1ha2VyIG1vZHVsZSwgdmVyc2lvbiAwLjMuMgojIENvcHlyaWdodCAoYykgMjAxMiBieSBTYW11ZWwgR29sZHN0ZWluIChzamdAY21zbWFkZXNpbXBsZS5vcmcpIAojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMKIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQojIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKIyBPciByZWFkIGl0IG9ubGluZTogaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2xpY2Vuc2VzLmh0bWwjR1BMCiMKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgRm9yIEhlbHAgYnVpbGRpbmcgbW9kdWxlczoKIyAtIFJlYWQgdGhlIERvY3VtZW50YXRpb24gYXMgaXQgYmVjb21lcyBhdmFpbGFibGUgYXQKIyAgIGh0dHA6Ly9kZXYuY21zbWFkZXNpbXBsZS5vcmcvCiMgLSBDaGVjayBvdXQgdGhlIFNrZWxldG9uIE1vZHVsZSBmb3IgYSBjb21tZW50ZWQgZXhhbXBsZQojIC0gTG9vayBhdCBvdGhlciBtb2R1bGVzLCBhbmQgbGVhcm4gZnJvbSB0aGUgc291cmNlCiMgLSBDaGVjayBvdXQgdGhlIGZvcnVtcyBhdCBodHRwOi8vZm9ydW1zLmNtc21hZGVzaW1wbGUub3JnCiMgLSBDaGF0IHdpdGggZGV2ZWxvcGVycyBvbiB0aGUgI2NtcyBJUkMgY2hhbm5lbAojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpyZXF1aXJlX29uY2UoJ2RhdGFtb2RlbC9kYXRhYmFzZW9wZXJhdGlvbnMucGhwJyk7CnJlcXVpcmVfb25jZSgndGlueW1jZV9tZW51LnBocCcpOwoKY2xhc3Mga2VnZWxlcmdlYm5pc3NlIGV4dGVuZHMgQ01TTW9kdWxlCnsJCglmdW5jdGlvbiBHZXROYW1lKCkKCXsKCQlyZXR1cm4gJ2tlZ2VsZXJnZWJuaXNzZSc7Cgl9CgoJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCSAgIEdldEZyaWVuZGx5TmFtZSgpCgkgICBUaGlzIGNhbiByZXR1cm4gYW55IHN0cmluZywgcHJlZmVyYWJseSBhIGxvY2FsaXplZCBuYW1lCgkgICBvZiB0aGUgbW9kdWxlLiBUaGlzIGlzIHRoZSBuYW1lIHRoYXQncyBzaG93biBpbiB0aGUKCSAgIEFkbWluIE1lbnVzIGFuZCBzZWN0aW9uIHBhZ2VzIChpZiB0aGUgbW9kdWxlIGhhcyBhbiBhZG1pbgoJICAgY29tcG9uZW50KS4KCSAgIAoJICAgU2VlIHRoZSBub3RlIG9uIGxvY2FsaXphdGlvbiBhdCB0aGUgdG9wIG9mIHRoaXMgZmlsZS4KCSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCWZ1bmN0aW9uIEdldEZyaWVuZGx5TmFtZSgpCgl7CgkJcmV0dXJuICR0aGlzLT5MYW5nKCdmcmllbmRseW5hbWUnKTsKCX0KCgkKCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgkgICBHZXRWZXJzaW9uKCkKCSAgIFRoaXMgY2FuIHJldHVybiBhbnkgc3RyaW5nLCBwcmVmZXJhYmx5IGEgbnVtYmVyIG9yCgkgICBzb21ldGhpbmcgdGhhdCBtYWtlcyBzZW5zZSBmb3IgZGVzaWduYXRpbmcgYSB2ZXJzaW9uLgoJICAgVGhlIENNUyB3aWxsIHVzZSB0aGlzIHRvIGlkZW50aWZ5IHdoZXRoZXIgb3Igbm90CgkgICB0aGUgaW5zdGFsbGVkIHZlcnNpb24gb2YgdGhlIG1vZHVsZSBpcyBjdXJyZW50LCBhbmQKCSAgIHRoZSBtb2R1bGUgd2lsbCB1c2UgaXQgdG8gZmlndXJlIG91dCBob3cgdG8gdXBncmFkZQoJICAgaXRzZWxmIGlmIHJlcXVlc3RlZC4JICAgCgkgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCglmdW5jdGlvbiBHZXRWZXJzaW9uKCkKCXsKCQlyZXR1cm4gJzAuMC45JzsKCX0KCgkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoJICAgR2V0SGVscCgpCgkgICBUaGlzIHJldHVybnMgSFRNTCBpbmZvcm1hdGlvbiBvbiB0aGUgbW9kdWxlLgoJICAgVHlwaWNhbGx5LCB5b3UnbGwgd2FudCB0byBpbmNsdWRlIGluZm9ybWF0aW9uIG9uIGhvdyB0bwoJICAgdXNlIHRoZSBtb2R1bGUuCgkgICAKCSAgIFNlZSB0aGUgbm90ZSBvbiBsb2NhbGl6YXRpb24gYXQgdGhlIHRvcCBvZiB0aGlzIGZpbGUuCgkgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCglmdW5jdGlvbiBHZXRIZWxwKCkKCXsKCQlyZXR1cm4gJHRoaXMtPkxhbmcoJ2hlbHAnKTsKCX0KCgkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoJICAgR2V0QXV0aG9yKCkKCSAgIFRoaXMgcmV0dXJucyBhIHN0cmluZyB0aGF0IGlzIHByZXNlbnRlZCBpbiB0aGUgTW9kdWxlCgkgICBBZG1pbiBpZiB5b3UgY2xpY2sgb24gdGhlICJBYm91dCIgbGluay4KCSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCWZ1bmN0aW9uIEdldEF1dGhvcigpCgl7CgkJcmV0dXJuICdHZXJhbGQgTHV0dGVyJzsKCX0KCgkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoJICAgR2V0QXV0aG9yRW1haWwoKQoJICAgVGhpcyByZXR1cm5zIGEgc3RyaW5nIHRoYXQgaXMgcHJlc2VudGVkIGluIHRoZSBNb2R1bGUKCSAgIEFkbWluIGlmIHlvdSBjbGljayBvbiB0aGUgIkFib3V0IiBsaW5rLiBJdCBoZWxwcyB1c2VycwoJICAgb2YgeW91ciBtb2R1bGUgZ2V0IGluIHRvdWNoIHdpdGggeW91IHRvIHNlbmQgYnVnIHJlcG9ydHMsCgkgICBxdWVzdGlvbnMsIGNhc2VzIG9mIGJlZXIsIGFuZC9vciBsYXJnZSBzdW1zIG9mIG1vbmV5LgoJICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoJZnVuY3Rpb24gR2V0QXV0aG9yRW1haWwoKQoJewoJCXJldHVybiAnZ2VyYWxkQGl0emdydW5kLm5ldCc7Cgl9CgoJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCSAgIEdldENoYW5nZUxvZygpCgkgICBUaGlzIHJldHVybnMgYSBzdHJpbmcgdGhhdCBpcyBwcmVzZW50ZWQgaW4gdGhlIG1vZHVsZQoJICAgQWRtaW4gaWYgeW91IGNsaWNrIG9uIHRoZSBBYm91dCBsaW5rLiBJdCBoZWxwcyB1c2VycwoJICAgZmlndXJlIG91dCB3aGF0J3MgY2hhbmdlZCBiZXR3ZWVuIHJlbGVhc2VzLgoJICAgU2VlIHRoZSBub3RlIG9uIGxvY2FsaXphdGlvbiBhdCB0aGUgdG9wIG9mIHRoaXMgZmlsZS4KCSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCWZ1bmN0aW9uIEdldENoYW5nZUxvZygpCgl7CgkJcmV0dXJuICR0aGlzLT5MYW5nKCdjaGFuZ2Vsb2cnKTsKCX0KCgkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoJICAgSXNQbHVnaW5Nb2R1bGUoKQoJICAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRydWUgb3IgZmFsc2UsIGRlcGVuZGluZyB1cG9uCgkgICB3aGV0aGVyIHVzZXJzIGNhbiBpbmNsdWRlIHRoZSBtb2R1bGUgaW4gYSBwYWdlIG9yCgkgICB0ZW1wbGF0ZSB1c2luZyBhIHNtYXJ0eSB0YWcgb2YgdGhlIGZvcm0KCSAgIHtjbXNfbW9kdWxlIG1vZHVsZT0na2VnZWxlcmdlYm5pc3NlJyBwYXJhbTE9dmFsIHBhcmFtMj12YWwuLi59CgkgICAKCSAgIElmIHlvdXIgbW9kdWxlIGRvZXMgbm90IGdldCBpbmNsdWRlZCBpbiBwYWdlcyBvcgoJICAgdGVtcGxhdGVzLCByZXR1cm4gImZhbHNlIiBoZXJlLgoJICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoJZnVuY3Rpb24gSXNQbHVnaW5Nb2R1bGUoKQoJewoJCXJldHVybiB0cnVlOwoJfQoKCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgkgICBIYXNBZG1pbigpCgkgICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYSBib29sZWFuIHZhbHVlLCBkZXBlbmRpbmcgb24KCSAgIHdoZXRoZXIgeW91ciBtb2R1bGUgYWRkcyBhbnl0aGluZyB0byB0aGUgQWRtaW4gYXJlYSBvZgoJICAgdGhlIHNpdGUuIEZvciB0aGUgcmVzdCBvZiB0aGVzZSBjb21tZW50cywgSSdsbCBiZSBjYWxsaW5nCgkgICB0aGUgYWRtaW4gcGFydCBvZiB5b3VyIG1vZHVsZSB0aGUgIkFkbWluIFBhbmVsIiBmb3IKCSAgIHdhbnQgb2YgYSBiZXR0ZXIgdGVybS4KCSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCWZ1bmN0aW9uIEhhc0FkbWluKCkKCXsKCQlyZXR1cm4gdHJ1ZTsKCX0KCgoJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCSAgIEdldEFkbWluU2VjdGlvbigpCgkgICBJZiB5b3VyIG1vZHVsZSBoYXMgYW4gQWRtaW4gUGFuZWwsIHlvdSBjYW4gc3BlY2lmeQoJICAgd2hpY2ggQWRtaW4gU2VjdGlvbiAob3IgdG9wLWxldmVsIEFkbWluIE1lbnUpIGl0IHNob3dzCgkgICB1cCBpbi4gVGhpcyBtZXRob2QgcmV0dXJucyBhIHN0cmluZyB0byBzcGVjaWZ5IHRoYXQKCSAgIHNlY3Rpb24uIFZhbGlkIHJldHVybiB2YWx1ZXMgYXJlOgoKCSAgIG1haW4gICAgICAgIC0gdGhlIE1haW4gbWVudSB0YWIuCgkgICBjb250ZW50ICAgICAtIHRoZSBDb250ZW50IG1lbnUKCSAgIGxheW91dCAgICAgIC0gdGhlIExheW91dCBtZW51CgkgICB1c2Vyc2dyb3VwcyAtIHRoZSBVc2VycyBhbmQgR3JvdXBzIG1lbnUKCSAgIGV4dGVuc2lvbnMgIC0gdGhlIEV4dGVuc2lvbnMgbWVudSAodGhpcyBpcyB0aGUgZGVmYXVsdCkKCSAgIHNpdGVhZG1pbiAgIC0gdGhlIFNpdGUgQWRtaW4gbWVudQoJICAgdmlld3NpdGUgICAgLSB0aGUgVmlldyBTaXRlIG1lbnUgdGFiCgkgICBsb2dvdXQgICAgICAtIHRoZSBMb2dvdXQgbWVudSB0YWIKCSAgIAoJICAgTm90ZSB0aGF0IGlmIHlvdSBwbGFjZSB5b3VyIG1vZHVsZSBpbiB0aGUgbWFpbiwKCSAgIHZpZXdzaXRlLCBvciBsb2dvdXQgc2VjdGlvbnMsIGl0IHdpbGwgc2hvdyB1cCBpbiB0aGUKCSAgIG1lbnVzLCBidXQgd2lsbCBub3QgYmUgdmlzaWJsZSBpbiBhbnkgdG9wLWxldmVsCgkgICBzZWN0aW9uIHBhZ2VzLgoJICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoJZnVuY3Rpb24gR2V0QWRtaW5TZWN0aW9uKCkKCXsKCQlyZXR1cm4gJ2NvbnRlbnQnOwoJfQoJCglmdW5jdGlvbiBHZXRIZWFkZXJIVE1MKCkKCXsKCQlyZXR1cm4gJzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9IicuJHRoaXMtPkdldE1vZHVsZVVSTFBhdGgoKS4nL3RlbXBsYXRlcy9rZWdlbGVyZ2Vibmlzc2UuanMiPjwvc2NyaXB0PicuCgkJCSc8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSInLiR0aGlzLT5HZXRNb2R1bGVVUkxQYXRoKCkuJy90ZW1wbGF0ZXMva2VnZWxlcmdlYm5pc3NlLmNzcyI+PC9saW5rPic7Cgl9CgoKCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgkgICBHZXRBZG1pbkRlc2NyaXB0aW9uKCkKCSAgIElmIHlvdXIgbW9kdWxlIGRvZXMgaGF2ZSBhbiBBZG1pbiBQYW5lbCwgeW91CgkgICBjYW4gaGF2ZSBpdCByZXR1cm4gYSBkZXNjcmlwdGlvbiBzdHJpbmcgdGhhdCBnZXRzIHNob3duCgkgICBpbiB0aGUgQWRtaW4gU2VjdGlvbiBwYWdlIHRoYXQgY29udGFpbnMgdGhlIG1vZHVsZS4KCSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCWZ1bmN0aW9uIEdldEFkbWluRGVzY3JpcHRpb24oKQoJewoJCXJldHVybiAkdGhpcy0+TGFuZygnYWRtaW5kZXNjcmlwdGlvbicpOwoJfQoKCgkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoJICAgVmlzaWJsZVRvQWRtaW5Vc2VyKCkKCSAgIElmIHlvdXIgbW9kdWxlIGRvZXMgaGF2ZSBhbiBBZG1pbiBQYW5lbCwgeW91CgkgICBjYW4gY29udHJvbCB3aGV0aGVyIG9yIG5vdCBpdCdzIGRpc3BsYXllZCBieSB0aGUgYm9vbGVhbgoJICAgdGhhdCBpcyByZXR1cm5lZCBieSB0aGlzIG1ldGhvZC4gVGhpcyBpcyBwcmltYXJpbHkgdXNlZAoJICAgdG8gaGlkZSBtb2R1bGVzIGZyb20gYWRtaW5zIHdobyBsYWNrIHBlcm1pc3Npb24gdG8gdXNlCgkgICB0aGVtLgoJICAgCgkgICBUeXBpY2FsbHksIHlvdSdsbCB1c2Ugc29tZSBwZXJtaXNzaW9uIHRvIHNldCB0aGlzCgkgICAoZS5nLiwgJHRoaXMtPkNoZWNrUGVybWlzc2lvbignU29tZSBQZXJtaXNzaW9uJyk7ICkKCSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCWZ1bmN0aW9uIFZpc2libGVUb0FkbWluVXNlcigpCgl7CiAgICAgICAgcmV0dXJuIHRydWU7Cgl9CgkKCgkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoJICAgQ2hlY2tBY2Nlc3MoKQoJICAgVGhpcyB3cmFwcGVyIGZ1bmN0aW9uIHdpbGwgY2hlY2sgYWdhaW5zdCB0aGUgc3BlY2lmaWVkIHBlcm1pc3Npb24sCgkgICBhbmQgZGlzcGxheSBhbiBlcnJvciBwYWdlIGlmIHRoZSB1c2VyIGRvZXNuJ3QgaGF2ZSBhZGVxdWF0ZSBwZXJtaXNzaW9ucy4KCSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCWZ1bmN0aW9uIENoZWNrQWNjZXNzKCRwZXJtID0gJ1FfQURNSU5fREVGQVVMVF9QRVJNJykKCQl7CgkJcmV0dXJuICR0aGlzLT5DaGVja1Blcm1pc3Npb24oJHBlcm0pOwoJCX0KCQoJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCSAgIERpc3BsYXlFcnJvclBhZ2UoKQoJICAgVGhpcyBpcyBhIHNpbXBsZSBmdW5jdGlvbiBmb3IgZ2VuZXJhdGluZyBlcnJvciBwYWdlcy4KCSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICAgIGZ1bmN0aW9uIERpc3BsYXlFcnJvclBhZ2UoJGlkLCAmJHBhcmFtcywgJHJldHVybl9pZCwgJG1lc3NhZ2U9JycpCiAgICB7CgkJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCd0aXRsZV9lcnJvcicsICR0aGlzLT5MYW5nKCdlcnJvcicpKTsKCQkkdGhpcy0+c21hcnR5LT5hc3NpZ25fYnlfcmVmKCdtZXNzYWdlJywgJG1lc3NhZ2UpOwoKICAgICAgICAvLyBEaXNwbGF5IHRoZSBwb3B1bGF0ZWQgdGVtcGxhdGUKICAgICAgICBlY2hvICR0aGlzLT5Qcm9jZXNzVGVtcGxhdGUoJ2Vycm9yLnRwbCcpOwogICAgfQoJCgoKCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgkgICBHZXREZXBlbmRlbmNpZXMoKQoJICAgWW91ciBtb2R1bGUgbWF5IG5lZWQgYW5vdGhlciBtb2R1bGUgdG8gYWxyZWFkeSBiZSBpbnN0YWxsZWQKCSAgIGJlZm9yZSB5b3UgY2FuIGluc3RhbGwgaXQuCgkgICBUaGlzIG1ldGhvZCByZXR1cm5zIGEgbGlzdCBvZiB0aG9zZSBkZXBlbmRlbmNpZXMgYW5kCgkgICBtaW5pbXVtIHZlcnNpb24gbnVtYmVycyB0aGF0IHRoaXMgbW9kdWxlIHJlcXVpcmVzLgoJICAgCgkgICBJdCBzaG91bGQgcmV0dXJuIGFuIGhhc2gsIGVnLgoJICAgcmV0dXJuIGFycmF5KCdzb21lbW9kdWxlJz0+JzEuMCcsICdvdGhlcm1vZHVsZSc9PicxLjEnKTsKCSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCWZ1bmN0aW9uIEdldERlcGVuZGVuY2llcygpCgl7CgkJcmV0dXJuIGFycmF5KCk7Cgl9CgoJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCSAgIE1pbmltdW1DTVNWZXJzaW9uKCkKCSAgIFlvdXIgbW9kdWxlIG1heSByZXF1aXJlIGZ1bmN0aW9ucyBvciBvYmplY3RzIGZyb20KCSAgIGEgc3BlY2lmaWMgdmVyc2lvbiBvZiBDTVMgTWFkZSBTaW1wbGUuCgkgICBFdmVyIHNpbmNlIHZlcnNpb24gMC4xMSwgeW91IGNhbiBzcGVjaWZ5IHdoaWNoIG1pbmltdW0KCSAgIENNUyBNUyB2ZXJzaW9uIGlzIHJlcXVpcmVkIGZvciB5b3VyIG1vZHVsZSwgd2hpY2ggd2lsbAoJICAgcHJldmVudCBpdCBmcm9tIGJlaW5nIGluc3RhbGxlZCBieSBhIHZlcnNpb24gb2YgQ01TIHRoYXQKCSAgIGNhbid0IHJ1biBpdC4KCSAgIAoJICAgVGhpcyBtZXRob2QgcmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRpbmcgdGhlCgkgICBtaW5pbXVtIHZlcnNpb24gdGhhdCB0aGlzIG1vZHVsZSByZXF1aXJlcy4KCSAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCglmdW5jdGlvbiBNaW5pbXVtQ01TVmVyc2lvbigpCgl7CgkJcmV0dXJuICIxLjEwLjIiOwoJfQoKCgkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoJICAgTWF4aW11bUNNU1ZlcnNpb24oKQoJICAgWW91IG1heSB3YW50IHRvIHByZXZlbnQgcGVvcGxlIGZyb20gdXNpbmcgeW91ciBtb2R1bGUgaW4KCSAgIGZ1dHVyZSB2ZXJzaW9ucyBvZiBDTVMgTWFkZSBTaW1wbGUsIGVzcGVjaWFsbHkgaWYgeW91CgkgICB0aGluayBBUEkgZmVhdHVyZXMgeW91IHVzZSBtYXkgY2hhbmdlIC0tIGFmdGVyIGFsbCwgeW91CgkgICBuZXZlciByZWFsbHkga25vdyBob3cgdGhlIENNUyBNUyBBUEkgY291bGQgZXZvbHZlLgoJICAgCgkgICBTbywgdG8gcHJldmVudCBwZW9wbGUgZnJvbSBmbG9vZGluZyB5b3Ugd2l0aCBidWcgcmVwb3J0cwoJICAgd2hlbiBhIG5ldyB2ZXJzaW9uIG9mIENNUyBNUyBpcyByZWxlYXNlZCwgeW91IGNhbiBzaW1wbHkKCSAgIHJlc3RyaWN0IHRoZSB2ZXJzaW9uLiBUaGVuLCBvZiBjb3Vyc2UsIHRoZSBvbnVzIGlzIG9uIHlvdQoJICAgdG8gcmVsZWFzZSBhIG5ldyB2ZXJzaW9uIG9mIHlvdXIgbW9kdWxlIHdoZW4gYSBuZXcgdmVyc2lvbgoJICAgb2YgdGhlIENNUyBpcyByZWxlYXNlZC4uLgoJICAgCgkgICBUaGlzIG1ldGhvZCByZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUKCSAgIG1heGltdW0gdmVyc2lvbiB0aGF0IHRoaXMgbW9kdWxlIHN1cHBvcnRzLgoJICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCWZ1bmN0aW9uIE1heGltdW1DTVNWZXJzaW9uKCkKCXsKCQlyZXR1cm4gIjEuMTIuOTkiOwoJfQoJCgkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoJICAgSW5pdGlhbGl6ZUFkbWluKCkgCgkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCglmdW5jdGlvbiBJbml0aWFsaXplQWRtaW4oKQoJewoJCSR0aGlzLT5DcmVhdGVQYXJhbWV0ZXIoJ2FjdGlvbicsJycsJHRoaXMtPkxhbmcoJ2hlbHBfYWN0aW9uJyksZmFsc2UpOwoJCSR0aGlzLT5DcmVhdGVQYXJhbWV0ZXIoJ3NhaXNvbicsJycsJHRoaXMtPkxhbmcoJ2hlbHBfc2Fpc29uJyksdHJ1ZSk7CgkJJHRoaXMtPkNyZWF0ZVBhcmFtZXRlcigndGVhbScsJycsJHRoaXMtPkxhbmcoJ2hlbHBfdGVhbScpLHRydWUpOwkJCgkJJHRoaXMtPkNyZWF0ZVBhcmFtZXRlcignbnVtYmVyJywnJywkdGhpcy0+TGFuZygnaGVscF9udW1iZXInKSx0cnVlKTsJCQoJCSR0aGlzLT5DcmVhdGVQYXJhbWV0ZXIoJ2RheXMnLCcnLCR0aGlzLT5MYW5nKCdoZWxwX2RheXMnKSx0cnVlKTsJCQoJCSR0aGlzLT5DcmVhdGVQYXJhbWV0ZXIoJ2xpbmt0eXBlJywnJywkdGhpcy0+TGFuZygnaGVscF9saW5rdHlwZScpLHRydWUpOwoJCSR0aGlzLT5DcmVhdGVQYXJhbWV0ZXIoJ3hsc2xpbmsnLCdub25lJywkdGhpcy0+TGFuZygnaGVscF94bHNsaW5rJyksdHJ1ZSk7CgkJJHRoaXMtPkNyZWF0ZVBhcmFtZXRlcigncGxheWVyJywnJywkdGhpcy0+TGFuZygnaGVscF9wbGF5ZXInKSx0cnVlKTsKCX0KCQoJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCSAgIEluaXRpYWxpemVGcm9udGVuZCgpIAoJIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoJZnVuY3Rpb24gSW5pdGlhbGl6ZUZyb250ZW5kKCkKCXsKCQkkdGhpcy0+UmVnaXN0ZXJNb2R1bGVQbHVnaW4oKTsKCQkkdGhpcy0+UmVzdHJpY3RVbmtub3duUGFyYW1zKCk7CgoJCSR0aGlzLT5TZXRQYXJhbWV0ZXJUeXBlKCdhY3Rpb24nLCBDTEVBTl9TVFJJTkcpOwoJCSR0aGlzLT5TZXRQYXJhbWV0ZXJUeXBlKCdzYWlzb24nLCBDTEVBTl9TVFJJTkcpOwoJCSR0aGlzLT5TZXRQYXJhbWV0ZXJUeXBlKCd0ZWFtJywgQ0xFQU5fU1RSSU5HKTsKCQkkdGhpcy0+U2V0UGFyYW1ldGVyVHlwZSgnbnVtYmVyJywgQ0xFQU5fU1RSSU5HKTsKCQkkdGhpcy0+U2V0UGFyYW1ldGVyVHlwZSgnZGF5cycsIENMRUFOX0lOVCk7CgkJJHRoaXMtPlNldFBhcmFtZXRlclR5cGUoJ2xpbmt0eXBlJywgQ0xFQU5fU1RSSU5HKTsKCQkkdGhpcy0+U2V0UGFyYW1ldGVyVHlwZSgneGxzbGluaycsIENMRUFOX1NUUklORyk7CgkJJHRoaXMtPlNldFBhcmFtZXRlclR5cGUoJ3BsYXllcicsIENMRUFOX1NUUklORyk7Cgl9CgkvKioKCSAqIFJlZ2lzdGVyIFRpbnlNQ0UgcGx1Z2luCgkgKi8KCWZ1bmN0aW9uIFJlZ2lzdGVyVGlueU1DRVBsdWdpbigpCgl7CgkJJGNvbmZpZyA9ICR0aGlzLT5HZXRDb25maWcoKTsKCQkkc2Fpc29ucyA9IERhdGFiYXNlT3BlcmF0aW9uczo6Z2V0QWxsU2Fpc29ucygpOwoJCSR0ZWFtcyA9IERhdGFiYXNlT3BlcmF0aW9uczo6Z2V0QWxsVGVhbXMoKTsKCgkJLyogc2hvdyBnZW5lcmFsIHN0cnVjdHVyZSAqLwoJCSRwbHVnaW4xID0gdGlueW1jZV9tZW51OjpidXR0b25fc3RhcnQoJHRoaXMtPkxhbmcoJ3RpbnltY2VfYnV0dG9uX3NraXR0bGVzJyksICRjb25maWdbInJvb3RfdXJsIl0uIi9tb2R1bGVzL2tlZ2VsZXJnZWJuaXNzZS9pbWcva2VnZWxiYWhuLmdpZiIpOwoJCSRwbHVnaW4xIC49IHRpbnltY2VfbWVudTo6c3VibWVudSgiY3RpIiwgJHRoaXMtPkxhbmcoJ3RpbnltY2VfY3RpJykpOwoJCSRwbHVnaW4xIC49IHRpbnltY2VfbWVudTo6c3VibWVudSgic3R0IiwgJHRoaXMtPkxhbmcoJ3RpbnltY2Vfc3R0JykpOwoJCSRwbHVnaW4xIC49IHRpbnltY2VfbWVudTo6c3VibWVudSgic2F0IiwgJHRoaXMtPkxhbmcoJ3RpbnltY2Vfc2F0JykpOwoJCSRwbHVnaW4xIC49IHRpbnltY2VfbWVudTo6c3VibWVudSgic2ciLCAkdGhpcy0+TGFuZygndGlueW1jZV9zZycpKTsKCQkkcGx1Z2luMSAuPSB0aW55bWNlX21lbnU6OnN1Ym1lbnUoInNsciIsICR0aGlzLT5MYW5nKCd0aW55bWNlX3NscicpKTsKCQkKCQkvKiBzaG93IGFsbCBzYWlzb25zIGZvciByZWxldmFudCBhY3Rpb24gdGFncyAqLwoJCSRzYWlzb25uciA9IDA7CgkJZm9yZWFjaCgkc2Fpc29ucyBhcyAkc2Fpc29uKSB7CgkJCSRwbHVnaW4xIC49IHRpbnltY2VfbWVudTo6c3VibWVudSgiY3Rpc2Fpc29uIi4kc2Fpc29ubnIsICRzYWlzb24tPmdldE5hbWUoKSwgImN0aSIpOwoJCQkkcGx1Z2luMSAuPSB0aW55bWNlX21lbnU6OnN1Ym1lbnUoInN0dHNhaXNvbiIuJHNhaXNvbm5yLCAkc2Fpc29uLT5nZXROYW1lKCksICJzdHQiKTsKCQkJJHBsdWdpbjEgLj0gdGlueW1jZV9tZW51OjpzdWJtZW51KCJzYXRzYWlzb24iLiRzYWlzb25uciwgJHNhaXNvbi0+Z2V0TmFtZSgpLCAic2F0Iik7CgkJCSRwbHVnaW4xIC49IHRpbnltY2VfbWVudTo6c3VibWVudSgic2dzYWlzb24iLiRzYWlzb25uciwgJHNhaXNvbi0+Z2V0TmFtZSgpLCAic2ciKTsKCQkJCgkJCS8qIHNob3cgYWxsIHRlYW1zIGZvciByZWxldmFudCBhY3Rpb24gdGFncyAqLwoJCQkkdGVhbW5yID0gMDsKCQkJZm9yZWFjaCAoJHRlYW1zIGFzICR0ZWFtKSB7CgkJCQkkcGx1Z2luMSAuPSB0aW55bWNlX21lbnU6Oml0ZW0oJHRlYW0tPmdldE5hbWUoKSwKCQkJCSAgICAib25jbGljayA6IGZ1bmN0aW9uKCkgewoJCQkJCSAgICB0aW55TUNFLmFjdGl2ZUVkaXRvci5leGVjQ29tbWFuZCgnbWNlSW5zZXJ0Q29udGVudCcsIGZhbHNlLCAne2tlZ2VsZXJnZWJuaXNzZSBhY3Rpb249XCJjb21wbGV0ZXRlYW1pbmZvcm1hdGlvblwiIHNhaXNvbj1cIiIuJHNhaXNvbnNbJHNhaXNvbm5yXS0+Z2V0TmFtZSgpLiJcIiB0ZWFtPVwiIi4kdGVhbXNbJHRlYW1ucl0tPmdldE5hbWUoKS4iXCJ9Jyl9IiwgImN0aXNhaXNvbiIuJHNhaXNvbm5yKTsKCQkJCSRwbHVnaW4xIC49IHRpbnltY2VfbWVudTo6aXRlbSgkdGVhbS0+Z2V0TmFtZSgpLAoJCQkJICAgICJvbmNsaWNrIDogZnVuY3Rpb24oKSB7CgkJCQkJICAgIHRpbnlNQ0UuYWN0aXZlRWRpdG9yLmV4ZWNDb21tYW5kKCdtY2VJbnNlcnRDb250ZW50JywgZmFsc2UsICd7a2VnZWxlcmdlYm5pc3NlIGFjdGlvbj1cInNob3d0ZWFtdGFibGVcIiBzYWlzb249XCIiLiRzYWlzb25zWyRzYWlzb25ucl0tPmdldE5hbWUoKS4iXCIgdGVhbT1cIiIuJHRlYW1zWyR0ZWFtbnJdLT5nZXROYW1lKCkuIlwifScpfSIsICJzdHRzYWlzb24iLiRzYWlzb25ucik7CgkJCQkkcGx1Z2luMSAuPSB0aW55bWNlX21lbnU6Oml0ZW0oJHRlYW0tPmdldE5hbWUoKSwKCQkJCSAgICAib25jbGljayA6IGZ1bmN0aW9uKCkgewoJCQkJCSAgICB0aW55TUNFLmFjdGl2ZUVkaXRvci5leGVjQ29tbWFuZCgnbWNlSW5zZXJ0Q29udGVudCcsIGZhbHNlLCAne2tlZ2VsZXJnZWJuaXNzZSBhY3Rpb249XCJzaG93YXZlcmFnZXRlYW1cIiBzYWlzb249XCIiLiRzYWlzb25zWyRzYWlzb25ucl0tPmdldE5hbWUoKS4iXCIgdGVhbT1cIiIuJHRlYW1zWyR0ZWFtbnJdLT5nZXROYW1lKCkuIlwifScpfSIsICJzYXRzYWlzb24iLiRzYWlzb25ucik7CgkJCQkkcGx1Z2luMSAuPSB0aW55bWNlX21lbnU6OnN1Ym1lbnUoInNndGVhbSIuJHRlYW1uciwgJHRlYW0tPmdldE5hbWUoKSwgInNnc2Fpc29uIi4kc2Fpc29ubnIpOwoJCQkJCgkJCQkvKiBzaG93IGdhbWVzIGZvciBhY3Rpb24gPSBzaG93Z2FtZSB0YWcgKi8KCQkJCSRnYW1lcyA9IERhdGFiYXNlT3BlcmF0aW9uczo6Z2V0VGltZVRhYmxlKCRzYWlzb24sICR0ZWFtKTsKCQkJCSRnYW1lbnIgPSAwOwoJCQkJZm9yZWFjaCAoJGdhbWVzIGFzICRnYW1lKSB7CgkJCQkJJHBsdWdpbjEgLj0gdGlueW1jZV9tZW51OjppdGVtKCRnYW1lLT5nZXRPcHBvbmVudCgpLiIgKCIuKCRnYW1lLT5nZXRIb21lKCkgPyAiSCI6IkEiKS4iKSIsCgkJCQkgICAgIm9uY2xpY2sgOiBmdW5jdGlvbigpIHsKCQkJCQkgICAgdGlueU1DRS5hY3RpdmVFZGl0b3IuZXhlY0NvbW1hbmQoJ21jZUluc2VydENvbnRlbnQnLCBmYWxzZSwgJ3trZWdlbGVyZ2Vibmlzc2UgYWN0aW9uPVwic2hvd2dhbWVcIiBzYWlzb249XCIiLiRzYWlzb25zWyRzYWlzb25ucl0tPmdldE5hbWUoKS4iXCIgdGVhbT1cIiIuJHRlYW1zWyR0ZWFtbnJdLT5nZXROYW1lKCkuIlwiIG51bWJlcj1cIiIuKCRnYW1lbnIrMSkuIlwifScpfSIsICJzZ3RlYW0iLiR0ZWFtbnIpOwoJCQkJCSRnYW1lbnIgPSAkZ2FtZW5yICsgMTsKCQkJCQkKCQkJCX0KCQkJCSR0ZWFtbnI9JHRlYW1ucisxOwoJCQkJCgkJCX0KCQkJJHNhaXNvbm5yPSRzYWlzb25ucisxOwoJCX0KCQkKCQkvKiBhZGQgc2hvdyBsYXRlc3QgcmVzdWx0IGJ1dHRvbnMgKi8KCQkkcGx1Z2luMSAuPSB0aW55bWNlX21lbnU6Oml0ZW0oJHRoaXMtPkxhbmcoJ2ZvdXJfd2Vla3NfYWdvJyksCgkJCQkJCSAgICAib25jbGljayA6IGZ1bmN0aW9uKCkgewoJCQkJCQkJICAgIHRpbnlNQ0UuYWN0aXZlRWRpdG9yLmV4ZWNDb21tYW5kKCdtY2VJbnNlcnRDb250ZW50JywgZmFsc2UsICd7a2VnZWxlcmdlYm5pc3NlIGFjdGlvbj1cInNob3dsYXRlc3RyZXN1bHRzXCIgZGF5cz1cIi0yOFwifScpfSIsICJzbHIiKTsKCQkkcGx1Z2luMSAuPSB0aW55bWNlX21lbnU6Oml0ZW0oJHRoaXMtPkxhbmcoJ3RocmVlX3dlZWtzX2FnbycpLAoJCQkJCQkgICAgIm9uY2xpY2sgOiBmdW5jdGlvbigpIHsKCQkJCQkJCSAgICB0aW55TUNFLmFjdGl2ZUVkaXRvci5leGVjQ29tbWFuZCgnbWNlSW5zZXJ0Q29udGVudCcsIGZhbHNlLCAne2tlZ2VsZXJnZWJuaXNzZSBhY3Rpb249XCJzaG93bGF0ZXN0cmVzdWx0c1wiIGRheXM9XCItMjFcIn0nKX0iLCAic2xyIik7CgkJJHBsdWdpbjEgLj0gdGlueW1jZV9tZW51OjppdGVtKCR0aGlzLT5MYW5nKCd0d29fd2Vla3NfYWdvJyksCgkJCQkJCSAgICAib25jbGljayA6IGZ1bmN0aW9uKCkgewoJCQkJCQkJICAgIHRpbnlNQ0UuYWN0aXZlRWRpdG9yLmV4ZWNDb21tYW5kKCdtY2VJbnNlcnRDb250ZW50JywgZmFsc2UsICd7a2VnZWxlcmdlYm5pc3NlIGFjdGlvbj1cInNob3dsYXRlc3RyZXN1bHRzXCIgZGF5cz1cIi0xNFwifScpfSIsICJzbHIiKTsKCQkkcGx1Z2luMSAuPSB0aW55bWNlX21lbnU6Oml0ZW0oJHRoaXMtPkxhbmcoJ29uZV93ZWVrX2FnbycpLAoJCQkJCQkgICAgIm9uY2xpY2sgOiBmdW5jdGlvbigpIHsKCQkJCQkJCSAgICB0aW55TUNFLmFjdGl2ZUVkaXRvci5leGVjQ29tbWFuZCgnbWNlSW5zZXJ0Q29udGVudCcsIGZhbHNlLCAne2tlZ2VsZXJnZWJuaXNzZSBhY3Rpb249XCJzaG93bGF0ZXN0cmVzdWx0c1wiIGRheXM9XCItN1wifScpfSIsICJzbHIiKTsKCQkkcGx1Z2luMSAuPSB0aW55bWNlX21lbnU6Oml0ZW0oJHRoaXMtPkxhbmcoJ25leHRfd2VlaycpLAoJCQkJCQkgICAgIm9uY2xpY2sgOiBmdW5jdGlvbigpIHsKCQkJCQkJCSAgICB0aW55TUNFLmFjdGl2ZUVkaXRvci5leGVjQ29tbWFuZCgnbWNlSW5zZXJ0Q29udGVudCcsIGZhbHNlLCAne2tlZ2VsZXJnZWJuaXNzZSBhY3Rpb249XCJzaG93bGF0ZXN0cmVzdWx0c1wiIGRheXM9XCI3XCJ9Jyl9IiwgInNsciIpOwoJCSRwbHVnaW4xIC49IHRpbnltY2VfbWVudTo6aXRlbSgkdGhpcy0+TGFuZygnbmV4dF90d29fd2Vla3MnKSwKCQkJCQkJICAgICJvbmNsaWNrIDogZnVuY3Rpb24oKSB7CgkJCQkJCQkgICAgdGlueU1DRS5hY3RpdmVFZGl0b3IuZXhlY0NvbW1hbmQoJ21jZUluc2VydENvbnRlbnQnLCBmYWxzZSwgJ3trZWdlbGVyZ2Vibmlzc2UgYWN0aW9uPVwic2hvd2xhdGVzdHJlc3VsdHNcIiBkYXlzPVwiMTRcIn0nKX0iLCAic2xyIik7CgkJJHBsdWdpbjEgLj0gdGlueW1jZV9tZW51OjppdGVtKCR0aGlzLT5MYW5nKCduZXh0X3RocmVlX3dlZWtzJyksCgkJCQkJCSAgICAib25jbGljayA6IGZ1bmN0aW9uKCkgewoJCQkJCQkJICAgIHRpbnlNQ0UuYWN0aXZlRWRpdG9yLmV4ZWNDb21tYW5kKCdtY2VJbnNlcnRDb250ZW50JywgZmFsc2UsICd7a2VnZWxlcmdlYm5pc3NlIGFjdGlvbj1cInNob3dsYXRlc3RyZXN1bHRzXCIgZGF5cz1cIjIxXCJ9Jyl9IiwgInNsciIpOwoJCSRwbHVnaW4xIC49IHRpbnltY2VfbWVudTo6aXRlbSgkdGhpcy0+TGFuZygnbmV4dF9mb3VyX3dlZWtzJyksCgkJCQkJCSAgICAib25jbGljayA6IGZ1bmN0aW9uKCkgewoJCQkJCQkJICAgIHRpbnlNQ0UuYWN0aXZlRWRpdG9yLmV4ZWNDb21tYW5kKCdtY2VJbnNlcnRDb250ZW50JywgZmFsc2UsICd7a2VnZWxlcmdlYm5pc3NlIGFjdGlvbj1cInNob3dsYXRlc3RyZXN1bHRzXCIgZGF5cz1cIjI4XCJ9Jyl9IiwgInNsciIpOwoKCQkkcGx1Z2luMSAuPSB0aW55bWNlX21lbnU6OmJ1dHRvbl9lbmQoKTsKCQkKCQlyZXR1cm4gYXJyYXkoYXJyYXkoJ2luc2VydCcsJHBsdWdpbjEsJHRoaXMtPkxhbmcoJ3RpbnltY2VfZGVzY3JpcHRpb25fcGlja2VyJykpKTsKCX0KCgkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoJICAgSW5zdGFsbFBvc3RNZXNzYWdlKCkKCSAgIEFmdGVyIGluc3RhbGxhdGlvbiwgdGhlcmUgbWF5IGJlIHRoaW5ncyB5b3Ugd2FudCB0bwoJICAgY29tbXVuaWNhdGUgdG8geW91ciBhZG1pbi4gVGhpcyBmdW5jdGlvbiByZXR1cm5zIGEKCSAgIHN0cmluZyB3aGljaCB3aWxsIGJlIGRpc3BsYXllZC4KCSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCWZ1bmN0aW9uIEluc3RhbGxQb3N0TWVzc2FnZSgpCgl7CgkJcmV0dXJuICR0aGlzLT5MYW5nKCdwb3N0aW5zdGFsbCcpOwoJfQoKCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgkgICBVbmluc3RhbGxQb3N0TWVzc2FnZSgpCgkgICBBZnRlciByZW1vdmluZyBhIG1vZHVsZSwgdGhlcmUgbWF5IGJlIHRoaW5ncyB5b3Ugd2FudCB0bwoJICAgY29tbXVuaWNhdGUgdG8geW91ciBhZG1pbi4gVGhpcyBmdW5jdGlvbiByZXR1cm5zIGEKCSAgIHN0cmluZyB3aGljaCB3aWxsIGJlIGRpc3BsYXllZC4KCSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCWZ1bmN0aW9uIFVuaW5zdGFsbFBvc3RNZXNzYWdlKCkKCXsKCQlyZXR1cm4gJHRoaXMtPkxhbmcoJ3Bvc3R1bmluc3RhbGwnKTsKCX0KCgoKCgkvKioKCSAqIFVuaW5zdGFsbFByZU1lc3NhZ2UoKQoJICogVGhpcyBhbGxvd3MgeW91IHRvIGRpc3BsYXkgYSBtZXNzYWdlIGFsb25nIHdpdGggYSBZZXMvTm8gZGlhbG9nIGJveC4gSWYgdGhlIHVzZXIgcmVzcG9uZHMKCSAqIGluIHRoZSBhZmZpcm1hdGl2ZSB0byB5b3VyIG1lc3NhZ2UsIHRoZSB1bmluc3RhbGwgd2lsbCBwcm9jZWVkLiBJZiB0aGV5IHJlc3BvbmQgaW4gdGhlCgkgKiBuZWdhdGl2ZSwgdGhlIHVuaW5zdGFsbCB3aWxsIGJlIGNhbmNlbGVkLiBUaHVzLCB5b3VyIG1lc3NhZ2Ugc2hvdWxkIGJlIG9mIHRoZSBmb3JtCgkgKiAiQWxsIG1vZHVsZSBkYXRhIHdpbGwgYmUgZGVsZXRlZC4gQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIHVuaW5zdGFsbCB0aGlzIG1vZHVsZT8iCgkgKgoJICogSWYgeW91IGRvbid0IHdhbnQgdGhlIGRpYWxvZywgaGF2ZSB0aGlzIG1ldGhvZCByZXR1cm4gYSBGQUxTRSwgd2hpY2ggd2lsbCBjYXVzZSB0aGUKCSAqIG1vZHVsZSB0byB1bmluc3RhbGwgaW1tZWRpYXRlbHkgaWYgdGhlIHVzZXIgY2xpY2tzIHRoZSAidW5pbnN0YWxsIiBsaW5rLgoJICovCglmdW5jdGlvbiBVbmluc3RhbGxQcmVNZXNzYWdlKCkKCXsKCQlyZXR1cm4gJHRoaXMtPkxhbmcoJ3JlYWxseV91bmluc3RhbGwnKTsKCX0KCQp9Cgo/Pgo=]]></data>
	</file>
	<file>
	  <filename>/lang/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lang/de_DE.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKJGxhbmdbJ2tlZ2VsZXJnZWJuaXNzZV9wZXJtZGVzYyddID0gIkJlcmVjaHRpZ3VuZyB1bSBJbmhhbHRlIGRlcyBNb2R1bHMga2VnZWxlcmdlYm5pc3NlIHp1IMOkbmRlcm4iOwokbGFuZ1snaG9tZXRlYW0nXSA9ICdVbnNlcmUgTWFubnNjaGFmdCc7CiRsYW5nWydhd2F5dGVhbSddID0gJ0dlZ25lcmlzY2hlIE1hbm5zY2hhZnQnOwokbGFuZ1snaG9tZWdhbWUnXSA9ICdIZWltc3BpZWwnOwokbGFuZ1snYXdheWdhbWUnXSA9ICdBdXN3w6RydHNzcGllbCc7CiRsYW5nWycxMjBCYWxscyddID0gJzEyMCBXdXJmJzsKJGxhbmdbJ1NQJ10gPSAnU1AnOwokbGFuZ1snTVAnXSA9ICdNUCc7CiRsYW5nWydnYW1lJ10gPSAnU3BpZWwnOwokbGFuZ1snZ2FtZXMnXSA9ICdTcGllbGUnOwokbGFuZ1snYWxsUGxheWVycyddID0gJ0FsbGUnOwokbGFuZ1snZnJpZW5kbHluYW1lJ10gPSAnS2VnZWxlcmdlYm5pc3NlJzsKJGxhbmdbJ3Bvc3RpbnN0YWxsJ10gPSAnRGFzIE1vZHVsIEtlZ2VsZXJnZWJuaXNzZSB3dXJkZSBpbnN0YWxsaWVydCEnOwokbGFuZ1sncG9zdHVuaW5zdGFsbCddID0gJ0RhcyBNb2R1bCBLZWdlbGVyZ2Vibmlzc2Ugd3VyZGUgZW50ZmVybnQhIic7CiRsYW5nWydyZWFsbHlfdW5pbnN0YWxsJ10gPSAnV29sbGVuIFNpZSBkYXMgTW9kdWwgS2VnZWxlcmdlYm5pc3NlIHdpcmtsaWNoIGzDtnNjaGVuPyBFcyB3ZXJkZW4gYXVjaCBhbGxlIGJpc2hlcmlnZSBFaW50csOkZ2UgaW4gZGVyIERhdGVuYmFuayB2ZXJuaWNodGV0ISc7CiRsYW5nWyd1bmluc3RhbGxlZCddID0gJ0tlZ2VsZXJnZWJuaXNzZSBlbnRmZXJudC4nOwokbGFuZ1snaW5zdGFsbGVkJ10gPSAnS2VnZWxlcmdlYm5pc3NlIHZlcnNpb24gJXMgaW5zdGFsbGVkLic7CiRsYW5nWyd1cGdyYWRlZCddID0gJ0tlZ2VsZXJnZWJuaXNzZSB1cGdyYWRlZCB0byB2ZXJzaW9uICVzLic7CiRsYW5nWydtb2RkZXNjcmlwdGlvbiddID0gJ0RpZXNlcyBNb2R1bCBrYW5uIGbDvHIgZGllIEVpbmdhYmUgdW5kIEFuemVpZ2UgZGVyIEtlZ2VsZXJlZ2Vibmlzc2UgZWluZXMgS2x1YnMgdmVyd2VuZGV0IHdlcmRlbi4gRXMgd2VyZGVuIHNvd29obCBTYWlzb25zIGFscyBhdWNoIE1hbm5zY2hhZnRlbiB2ZXJ3YWx0ZXQuIFp1c8OkdHpsaWNoIGvDtm5uZW4gbm9jaCB3ZWl0ZXJlIFN0YXRpc3Rpa2RhdGVuIGF1c2dlZ2ViZW4gd2VyZGVuLic7CiRsYW5nWydlcnJvcnRhZyddID0gIkZlaGxlciBpbiBlaW5lbSBzbWFydHkgdGFnIjsKJGxhbmdbJ2Vycm9ycGFyYW0nXSA9ICdGZWhsZXIhIEJpdHRlIFBhcmFtZXRlcsO8YmVyZ2FiZSBwcsO8ZmVuLic7CiRsYW5nWydhZG1pbl90aXRsZSddID0gJ0tlZ2VsZXJnZWJuaXNzZSBBZG1pbiBQYW5lbCc7CiRsYW5nWydhZG1pbmRlc2NyaXB0aW9uJ10gPSAnSGllciBrw7ZubmVuIFNpZSBkaWUgQWRtaW5pc3RyYXRpb24gZGVyIE1hbm5zY2hhZnRlbiB2b3JuZWhtZW4uIE1pdCBBYnNpY2h0IHd1cmRlIGhpZXIga2VpbmUgTcO2Z2xpY2hrZWl0IGdlc2NoYWZmZW4gRGF0ZW4genUgbMO2c2NoZW4uIEVzIGthbm4gbGVkaWdsaWNoIGhpbnp1Z2Vmw7xndCBhbHMgYXVjaCBnZcOkbmRlcnQgd2VyZGVuLic7CiRsYW5nWydhY2Nlc3NkZW5pZWQnXSA9ICdadWdyaWZmIHZlcndlaWdlcnQsIEJpdHRlIMO8YmVycHLDvGZlbiBTaWUgaWhyZSBCZXJlY2h0aWd1bmdlbi4nOwokbGFuZ1sncG9zdGluc3RhbGwnXSA9ICdJbnN0YWxsYXRpb24gRXJmb2xncmVpY2gsIGJpdHRlIHJpY2h0ZW4gU2llIGbDvHIgSWhyZSBCZW51dHplciBub2NoIGRpZSBCZXJlY2h0aWd1bmc6ICInLiRsYW5nWydrZWdlbGVyZ2Vibmlzc2VfcGVybWRlc2MnXS4nIiBlaW4uJzsKJGxhbmdbJ1NhaXNvbiddID0gJ1NhaXNvbic7CiRsYW5nWydTcGllbGVyJ10gPSAnU3BpZWxlcic7CiRsYW5nWydNYW5uc2NoYWZ0J10gPSAnTWFubnNjaGFmdCc7CiRsYW5nWydTcGllbHBsYW4nXSA9ICdTcGllbHBsYW4nOwokbGFuZ1sndGl0bGVfc2Fpc29uJ10gPSAnU2Fpc29uJzsKJGxhbmdbJ3RpdGxlX3NwaWVsZXInXSA9ICdTcGllbGVyJzsKJGxhbmdbJ3RpdGxlX21hbm5zY2hhZnQnXSA9ICdNYW5uc2NoYWZ0JzsKJGxhbmdbJ3RpdGxlX3NwaWVscGxhbiddID0gJ1NwaWVscGxhbic7CiRsYW5nWydkZWxldGUnXSA9ICdMw7ZzY2hlbic7CiRsYW5nWydwbGF5ZXJuYW1lX2hlYWRlciddID0gJ05hbWUnOwokbGFuZ1sncGxheWVyYWN0aW9uX2hlYWRlciddID0gJ0FrdGlvbic7CiRsYW5nWydjaGFuZ2UnXSA9ICfDhG5kZXJuJzsKJGxhbmdbJ2FkZCddID0gJ0hpbnp1ZsO8Z2VuJzsKJGxhbmdbJ3RlYW1uYW1lX2hlYWRlciddID0gJ05hbWUnOwokbGFuZ1snc2Fpc29ubmFtZV9oZWFkZXInXSA9ICdOYW1lLCBTdGFydChUVC5NTS5ZWVlZIFNTOk1NKSwgRW5kZShUVC5NTS5ZWVlZIFNTOk1NKSc7CiRsYW5nWydzYWlzb25sYWJlbCddID0gJ1NhaXNvbic7CiRsYW5nWyd0ZWFtbGFiZWwnXSA9ICdNYW5uc2NoYWZ0JzsKJGxhbmdbJ2xvYWQnXSA9ICdMYWRlbic7CiRsYW5nWydkYXRlJ10gPSAnRGF0dW0gKFRULk1NLllZWVkpJzsKJGxhbmdbJ3RpbWUnXSA9ICdVaHJ6ZWl0IChTUzpNTSknOwokbGFuZ1snZGF0ZV9mcm9udGVuZCddID0gJ0RhdHVtJzsKJGxhbmdbJ3RpbWVfZnJvbnRlbmQnXSA9ICdVaHJ6ZWl0JzsKJGxhbmdbJ2ZpcnN0cm91bmQnXSA9ICdWb3JydW5kZSc7CiRsYW5nWydzZWNvbmRyb3VuZCddID0gJ1LDvGNrcnVuZGUnOwokbGFuZ1snaG9tZWF3YXknXSA9ICdIZWltJzsKJGxhbmdbJ29wcG9uZW50J10gPSAnR2VnbmVyJzsKJGxhbmdbJ3Jlc3VsdCddID0gJ0VyZ2VibmlzJzsKJGxhbmdbJ2FjdGlvbiddID0gJ0FrdGlvbic7CiRsYW5nWydlZGl0Z2FtZSddID0gJ1NwaWVsYmVyaWNodCc7CiRsYW5nWydwbGF5ZXJ0b3RlYW0nXSA9ICdadW9yZG51bmc6IFNwaWVsZXIgPC0+IE1hbm5zY2hhZnQnOwokbGFuZ1snc29ydGJ5dGVhbSddID0gJ1NvcnRpZXJ1bmcgbmFjaCBNYW5uc2NoYWZ0JzsKJGxhbmdbJ3NvcnRieXBsYXllciddID0gJ1NvcnRpZXJ1bmcgbmFjaCBTcGllbGVyJzsKJGxhbmdbJ2dhbWVyZXN1bHQnXSA9ICdTcGllbGJlcmljaHQnOwokbGFuZ1snc2F2ZSddID0gJ1NwZWljaGVybic7CiRsYW5nWydob21lJ10gPSAnSGVpbSc7CiRsYW5nWydndWVzdCddID0gJ0dhc3QnOwokbGFuZ1snU0JWb2xsJ10gPSAnVm9sbCc7CiRsYW5nWydTQkFiciddID0gJ0Ficic7CiRsYW5nWydTQk5hbWUnXSA9ICdOYW1lJzsKJGxhbmdbJ1NCRmVobCddID0gJ0ZlaGwnOwokbGFuZ1snU0JHZXMnXSA9ICdHZXMnOwokbGFuZ1snU0JUeXBlJ10gPSAnQXJ0JzsKJGxhbmdbJ1NCQXdheSddID0gJ0F1c3cnOwokbGFuZ1snU0JIb21lJ10gPSAnSGVpbSc7CiRsYW5nWydjb3VudCddID0gJ0FuemFobCc7CiRsYW5nWyd0aW1ldGFibGUnXSA9ICdTcGllbHBsYW4nOwokbGFuZ1snYXZlcmFnZXRhYmxlJ10gPSAnU2Nobml0dGxpc3RlJzsKJGxhbmdbJ2F2ZXJhZ2UnXSA9ICdTY2huaXR0JzsKJGxhbmdbJ2Rpc3BsYXknXSA9ICdBbnplaWdlbic7CiRsYW5nWydhbGx0ZWFtcyddID0gJ0FsbGUgTWFuc2NoYWZ0ZW4nOwokbGFuZ1snbm9yZXN1bHQnXSA9ICdrZWluIEVyZ2VibmlzJzsKJGxhbmdbJ25vZ2FtZXMnXSA9ICdLZWluZSBTcGllbGUgdm9yaGFuZGVuJzsKJGxhbmdbJ2Vycm9yX251bWJlciddID0gJ0RpZXNlIFNwaWVsbnVtbWVyIHd1cmRlIMO8YmVyZ2ViZW46ICc7CiRsYW5nWydlcnJvcl90ZWFtJ10gPSAnRGllc2VzIFRlYW0gd3VyZGUgw7xiZXJnZWJlbjogJzsKJGxhbmdbJ2Vycm9yX3NhaXNvbiddID0gJ0RpZXNlIFNhaXNvbiB3dXJkZSDDvGJlcmdlYmVuOiAnOwokbGFuZ1snZXJyb3JfbGlua3R5cGUnXSA9ICdEaWVzZXIgTGlua3R5cCB3dXJkZSDDvGJlcmdlYmVuOiAnOwokbGFuZ1snaGVscF9hY3Rpb24nXSA9ICdEZXIgUGFyYW1ldGVyIDxjb2RlPmFjdGlvbjwvY29kZT4gZ2lidCBhbiwgd2FzIGRhcyBQbHVnaW4gYW56ZWlnZW4gc29sbC4gSmUgbmFjaCBJbmhhbHQgaGF0IGVyIG5vY2ggd2VpdGVyZSBTdWJwYXJhbWV0ZXIuCjx1bD4KPGxpPjxjb2RlPmNvbXBsZXRldGVhbWluZm9ybWF0aW9uPC9jb2RlPjogWmVpZ3Qgc8OkbXRsaWNoZSBEYXRlbiDDvGJlciBlaW5lIE1hbm5zY2hhZnQgYW4gKFNwaWVscGxhbiwgU3BpZWxlLCBTY2huaXR0bGlzdGUpPC9saT4KPGxpPjxjb2RlPnNob3d0ZWFtdGFibGU8L2NvZGU+OiBaZWlndCBkZW4gU3BpZWxwbGFuIGVpbmVyIE1hbm5zY2hhZnQgYW4uPC9saT4KPGxpPjxjb2RlPnNob3dnYW1lPC9jb2RlPjogWmVpZ3QgZWluZW4gU3BpZWxiZXJpY2h0IGbDvHIgZWluIGJlbGllYmlnZXMgU3BpZWwgYW4uPC9saT4KPGxpPjxjb2RlPnNob3dhdmVyYWdldGVhbTwvY29kZT46IFplaWd0IGRpZSBTY2huaXR0bGlzdGUgZGVyIE1hbm5zY2hhZnQgc293aWUgZGVyIGVpbnplbG5lbiBTcGllbGVyIGFuLjwvbGk+CjxsaT48Y29kZT5zaG93bGF0ZXN0cmVzdWx0czwvY29kZT46IFplaWd0IGVpbmVuIEF1c3NjaG5pdHQgZGVzIFNwaWVscGxhbnMgYWxsZXIgTWFubnNjaGFmdGVuIGFuPC9saT4KPGxpPjxjb2RlPnhsc3RlYW10YWJsZTwvY29kZT46IEdpYnQgZGVzIFNwaWVscGxhbiBlaW5lciBNYW5uc2NoYWZ0IGFscyBFeGNlbC1UYWJlbGxlIG9kZXIgaUNhbGVuZGFyIHp1csO8Y2s8L2xpPgo8bGk+PGNvZGU+c2hvd3BsYXllcnJlc3VsdHM8L2NvZGU+OiBHaWJ0IEluZm9ybWF0aW9uZW4gw7xiZXIgZWluZW4gU3BpZWxlciB6dXLDvGNrLiBFaW5zY2hyw6Rua3VuZyBhdWYgTWFubnNjaGFmdCB1bmQvb2RlciBTYWlzb24gbcO2Z2xpY2guPC9saT4KPGxpPjxjb2RlPnNob3dwbGF5ZXJyZXN1bHRzMTIwPC9jb2RlPjogR2lidCBJbmZvcm1hdGlvbmVuIMO8YmVyIGVpbmVuIFNwaWVsZXIgaW0gMTIwIFd1cmYgU3lzdGVtIHp1csO8Y2suIEVpbnNjaHLDpG5rdW5nIGF1ZiBNYW5uc2NoYWZ0IHVuZC9vZGVyIFNhaXNvbiBtw7ZnbGljaC48L2xpPgo8bGk+PGNvZGU+c2hvd2F2ZXJhZ2V0ZWFtMTIwPC9jb2RlPjogWmVpZ3QgZGllIFNjaG5pdHRsaXN0ZSBkZXIgTWFubnNjaGFmdCBzb3dpZSBkZXIgZWluemVsbmVuIFNwaWVsZXIgaW0gMTIwIFd1cmYgU3lzdGVtIGFuLjwvbGk+CjwvdWw+JzsKJGxhbmdbJ2hlbHBfc2Fpc29uJ10gPSAnRGVyIFBhcmFtZXRlciA8Y29kZT5zYWlzb248L2NvZGU+IGdpYnQgYW4sIGF1cyB3ZWxjaGVyIFNhaXNvbiBldHdhcyBhbmdlemVpZ3Qgd2VyZGVuIHNvbGwuIEVyIGlzdCBudXIgc2lubnZvbGwgYmVpIGZvbGdlbmRlbiBXZXJ0ZW4gZGVzIDxjb2RlPmFjdGlvbjwvY29kZT4gUGFyYW1ldGVyczoKPHVsPgo8bGk+PGNvZGU+Y29tcGxldGV0ZWFtaW5mb3JtYXRpb248L2NvZGU+IChub3R3ZW5kaWcpPC9saT4KPGxpPjxjb2RlPnNob3d0ZWFtdGFibGU8L2NvZGU+IChub3R3ZW5kaWcpPC9saT4KPGxpPjxjb2RlPnNob3dnYW1lPC9jb2RlPiAobm90d2VuZGlnKTwvbGk+CjxsaT48Y29kZT5zaG93YXZlcmFnZXRlYW08L2NvZGU+IChub3R3ZW5kaWcpPC9saT4KPGxpPjxjb2RlPnNob3dhdmVyYWdldGVhbTEyMDwvY29kZT4gKG5vdHdlbmRpZyk8L2xpPgo8bGk+PGNvZGU+eGxzdGVhbXRhYmxlPC9jb2RlPiAobm90d2VuZGlnKTwvbGk+CjxsaT48Y29kZT5zaG93cGxheWVycmVzdWx0czwvY29kZT4gKG9wdGlvbmFsKSAtIFNjaHLDpG5rdCBkaWUgU3BpZWxlcmdlYm5pc3NlIGF1ZiBkaWUgU2Fpc29uIGVpbi48L2xpPgo8bGk+PGNvZGU+c2hvd3BsYXllcnJlc3VsdHMxMjA8L2NvZGU+IChvcHRpb25hbCkgLSBTY2hyw6Rua3QgZGllIFNwaWVsZXJnZWJuaXNzZSBhdWYgZGllIFNhaXNvbiBlaW4uPC9saT4KPC91bD4nOwokbGFuZ1snaGVscF90ZWFtJ10gPSAnRGVyIFBhcmFtZXRlciA8Y29kZT50ZWFtPC9jb2RlPiBnaWJ0IGFuLCB2b24gd2VsY2hlciBNYW5uc2NoYWZ0IGV0d2FzIGFuZ2V6ZWlndCB3ZXJkZW4gc29sbC4gRXIgaXN0IG51ciBzaW5udm9sbCBiZWkgZm9sZ2VuZGVuIFdlcnRlbiBkZXMgPGNvZGU+YWN0aW9uPC9jb2RlPiBQYXJhbWV0ZXJzOgo8dWw+CjxsaT48Y29kZT5jb21wbGV0ZXRlYW1pbmZvcm1hdGlvbjwvY29kZT4gKG5vdHdlbmRpZyk8L2xpPgo8bGk+PGNvZGU+c2hvd3RlYW10YWJsZTwvY29kZT4gKG5vdHdlbmRpZyAtIGhpZXIgaXN0IGF1Y2ggZGVyIFdlcnQgImFsbCIgZsO8ciBhbGxlIE1hbm5zY2hhZnRlbiBtw7ZnbGljaCk8L2xpPgo8bGk+PGNvZGU+c2hvd2dhbWU8L2NvZGU+IChub3R3ZW5kaWcpPC9saT4KPGxpPjxjb2RlPnNob3dhdmVyYWdldGVhbTwvY29kZT4gKG5vdHdlbmRpZyk8L2xpPgo8bGk+PGNvZGU+c2hvd2F2ZXJhZ2V0ZWFtMTIwPC9jb2RlPiAobm90d2VuZGlnKTwvbGk+CjxsaT48Y29kZT54bHN0ZWFtdGFibGU8L2NvZGU+IChub3R3ZW5kaWcpPC9saT4KPGxpPjxjb2RlPnNob3dwbGF5ZXJyZXN1bHRzPC9jb2RlPiAob3B0aW9uYWwpIC0gU2NocsOkbmt0IGRpZSBTcGllbGVyZXJnZWJuaXNzZSBhdWYgZGFzIFRlYW0gZWluLjwvbGk+CjxsaT48Y29kZT5zaG93cGxheWVycmVzdWx0czEyMDwvY29kZT4gKG9wdGlvbmFsKSAtIFNjaHLDpG5rdCBkaWUgU3BpZWxlcmVyZ2Vibmlzc2UgYXVmIGRhcyBUZWFtIGVpbi48L2xpPgo8L3VsPic7CiRsYW5nWydoZWxwX251bWJlciddID0gJ0RlciBQYXJhbWV0ZXIgPGNvZGU+bnVtYmVyPC9jb2RlPiBnaWJ0IGFuLCB3ZWxjaGVzIFNwaWVsIChjaHJvbm9sb2dpc2NoIGdlb3JkbmV0KSBlaW5lciBNYW5uc2NoYWZ0IHfDpGhyZW5kIGVpbmVyIGdlZ2ViZW5lbiBTYWlzb24gYW5nZXplaWd0IHdlcmRlbiBzb2xsIHVuZCBpc3QgZGFoZXIgbnVyIGbDvHIgZWluZW4gV2VydCBkZXMgPGNvZGU+YWN0aW9uPC9jb2RlPiBQYXJhbWV0ZXJzIGfDvGx0aWc6Cjx1bD4KPGxpPjxjb2RlPnNob3dnYW1lPC9jb2RlPiAobm90d2VuZGlnKTwvbGk+CjwvdWw+JzsKJGxhbmdbJ2hlbHBfZGF5cyddID0gJ0RlciBQYXJhbWV0ZXIgPGNvZGU+ZGF5czwvY29kZT4gZ2lidCBhbiwgd2lldmllbGUgVGFnZSBpbiBkaWUgWnVrdW5mdCAoZGF5cyA+IDApIG9kZXIgaW4gZGllIFZlcmdhbmdlbmhlaXQgKGRheXMgPCAwKSBnZXNjaGF1dCB3ZXJkZW4gc29sbCwgdW0gZGllIEVyZ2Vibmlzc2UgYWxsZXIgTWFubnNjaGFmdGVuIGFienVydWZlbiB1bmQgaXN0IGRhaGVyIG51ciBmw7xyIGZvbGdlbmRlbiBXZXJ0IGRlcyA8Y29kZT5hY3Rpb248L2NvZGU+IFBhcmFtZXRlcnMgZ8O8bHRpZzoKPHVsPgo8bGk+PGNvZGU+c2hvd2xhdGVzdHJlc3VsdHM8L2NvZGU+IChub3R3ZW5kaWcpPC9saT4KPC91bD4nOwokbGFuZ1snaGVscF9saW5rdHlwZSddID0gJ0RlciBQYXJhbWV0ZXIgPGNvZGU+bGlua3R5cGU8L2NvZGU+IGVudHNjaGVpZGV0IGluIHdlbGNoZW0gRm9ybWF0IGRlciBTcGllbHBsYW4genVyw7xja2dlZ2ViZW4gd2VyZGVuIHNvbGwuIEZvbGdlbmRlIFdlcnRlIHNpbmQgdm9yZ2VzZWhlbjoKPHVsPgo8bGk+PGNvZGU+eGxzPC9jb2RlPjogUsO8Y2tnYWJlIGRlcyBTcGllbHBsYW5zIGVpbmVzIFRlYW1zIGltIEV4Y2VsLTIwMDMgRm9ybWF0Lgo8bGk+PGNvZGU+eGxzeDwvY29kZT46IFLDvGNrZ2FiZSBkZXMgU3BpZWxwbGFucyBlaW5lcyBUZWFtcyBpbSBFeGNlbC0yMDA3LzIwMTAgRm9ybWF0Lgo8bGk+PGNvZGU+aWNzPC9jb2RlPjogUsO8Y2tnYWJlIGRlcyBTcGllbHBsYW5zIGFscyBpY3MgS2FsZW5kZXIgRGF0ZWkuCjwvdWw+CkRlciBQYXJhbWV0ZXIgaXN0IG51ciBmw7xyIGRpZSBmb2xnZW5kZW4gV2VydGUgZGVzIDxjb2RlPmFjdGlvbjwvY29kZT4gUGFyYW1ldGVycyBnw7xsdGlnOgo8dWw+CjxsaT48Y29kZT54bHN0ZWFtdGFibGU8L2NvZGU+IChub3R3ZW5kaWcpPC9saT4KPC91bD4nOwokbGFuZ1snaGVscF9wbGF5ZXInXSA9ICdEZXIgUGFyYW1ldGVyIDxjb2RlPnBsYXllcjwvY29kZT4gZW50c2NoZWlkZXQsIGbDvHIgd2VsY2hlbiBTcGllbGVyIEluZm9ybWF0aW9uZW4gYW5nZXplaWd0IHdlcmRlbiBzb2xsZW4uIEZvbGdlbmRlIFdlcnRlIHNpbmQgdm9yZ2VzZWhlbjoKPHVsPgo8bGk+PGNvZGU+U3BpZWxlcm5hbWU8L2NvZGU+OiBEZXIgTmFtZSBkZXMgU3BpZWxlcnMgKHZvcnNpY2h0LCBrw7ZubnRlIG5pY2h0IGVpbmRldXRpZyBzZWluISk8L2xpPgo8bGk+PGNvZGU+U3BpZWxlcmlkPC9jb2RlPjogRGllIElkIGRlcyBTcGllbGVycyBpbm5lcmhhbGIgZGVyIERhdGVuYmFuayAoYXVmIGplZGVuIEZhbGwgZWluZGV1dGlnKTwvbGk+CjwvdWw+CkRlciBQYXJhbWV0ZXIgaXN0IG51ciBmw7xyIGRpZSBmb2xnZW5kZW4gV2VydGUgZGVzIDxjb2RlPmFjdGlvbjwvY29kZT4gUGFyYW1ldGVycyBnw7xsdGlnOgo8dWw+CjxsaT48Y29kZT5zaG93cGxheWVycmVzdWx0czwvY29kZT4gKG5vdHdlbmRpZyk8L2xpPgo8bGk+PGNvZGU+c2hvd3BsYXllcnJlc3VsdHMxMjA8L2NvZGU+IChub3R3ZW5kaWcpPC9saT4KPC91bD4nOwokbGFuZ1snaGVscF94bHNsaW5rJ10gPSAnRGVyIFBhcmFtZXRlciA8Y29kZT54bHNsaW5rPC9jb2RlPiBlbnRzY2hlaWRldCBpbiB3ZWxjaGVtIExpbmtzIGbDvHIgZWluIERhdHVtIGF1c2dlZ2ViZW4gd2VyZGVuIHNvbGxlbi4gRm9sZ2VuZGUgV2VydGUgc2luZCB2b3JnZXNlaGVuIHVuZCBrw7ZubmVuIGJlbGllYmlnIGtvbWJpbmllcnQgd2VyZGVuIChkdXJjaCAiLCIgZ2V0cmVubnQpOgo8dWw+CjxsaT48Y29kZT54bHM8L2NvZGU+OiBBdXNnYWJlIGVpbmVzIExpbmtzIGbDvHIgZWluIEV4Y2VsLTIwMDMgRmlsZTwvbGk+CjxsaT48Y29kZT54bHN4PC9jb2RlPjogQXVzZ2FiZSBlaW5lcyBMaW5rcyBmw7xyIGVpbiBFeGNlbC0yMDA3LzIwMTAgRmlsZTwvbGk+CjxsaT48Y29kZT5pY3M8L2NvZGU+OiBBdXNnYWJlIGVpbmVzIExpbmtzIGbDvHIgZWluIGljcyBLYWxlbmRlciBGaWxlPC9saT4KPGxpPjxjb2RlPm5vbmU8L2NvZGU+OiBEZWZhdWx0d2VydCwga2VpbiBMaW5rIHNvbGwgYXVzZ2VnZWJlbiB3ZXJkZW4uIFNvYmFsZCBkaWVzZXIgV2VydCBpbiBkZXIgTGlzdGUgdm9yaGFuZGVuIGlzdCwgd2lyZCBrZWluIExpbmsgYXVzZ2VnZWJlbi48L2xpPgo8L3VsPgpEZXIgUGFyYW1ldGVyIGlzdCBudXIgZsO8ciBkaWUgZm9sZ2VuZGVuIFdlcnRlIGRlcyA8Y29kZT5hY3Rpb248L2NvZGU+IFBhcmFtZXRlcnMgZ8O8bHRpZzoKPHVsPgo8bGk+PGNvZGU+Y29tcGxldGV0ZWFtaW5mb3JtYXRpb248L2NvZGU+IChvcHRpb25hbCk8L2xpPgo8bGk+PGNvZGU+c2hvd3RlYW10YWJsZTwvY29kZT4gbnVyIGfDvGx0aWcsIHdlbm4gbmljaHQgZGVyIFdlcnQgImFsbCIgZsO8ciBkZW4gUGFyYW1ldGVyIDxjb2RlPnRlYW08L2NvZGU+IGF1c2dld8OkaGx0IHd1cmRlLiAob3B0aW9uYWwpPC9saT4KPC91bD4nOwokbGFuZ1snY29tcGxldGV0ZWFtaW5mb3JtYXRpb25kZXNjJ10gPSAiWnVtIEFuc2VoZW4gZWluZXMgU3BpZWxiZXJpY2h0cyBvZGVyIGRlciBkZXRhaWxpZXJ0ZW4gClNwaWVsZXJpbmZvcm1hdGlvbmVuIGVpbmZhY2ggbWl0IGRlciBNYXVzIGF1ZiBkYXMgU3BpZWwvZGVuIFNwaWVsZXIgZHLDvGNrZW4uIFVtIGRlbgpTcGllbGJlcmljaHQvU3BpZWxlcmRldGFpbHMgenUgc2NobGllw59lbiBhbiBpcmdlbmRlaW5lIFN0ZWxsZSBpbm5lcmhhbGIgZGVzIFNwaWVsYmVyaWNodHMvZGVyIApTcGllbGVyaW5mb3JtYXRpb24gZHLDvGNrZW4uIERpZSBBbnNpY2h0IGthbm4gendpc2NoZW4gZGVyIFNjaG5pdHRsaXN0ZSB1bmQgZGVtIFNwaWVscGxhbiBtaXQKZGVuIGJlaWRlbiBvYmVuc3RlaGVuZGVuIFRhZ3MgZ2V3ZWNoc2VsdCB3ZXJkZW4uIjsKJGxhbmdbJ3RpbnltY2VfYnV0dG9uX3NraXR0bGVzJ10gPSAiS2VnZWxlcmdlYm5pc3NlIjsKJGxhbmdbJ3RpbnltY2VfZGVzY3JpcHRpb25fcGlja2VyJ10gPSAiRWluZmFjaGUgQXJ0IHVtIEtlZ2VsZXJnZWJuaXNzZSBlaW56dWbDvGdlbi4iOwokbGFuZ1sndGlueW1jZV9jdGknXSA9ICJBbGxlIE1hbm5zY2hhZnRzZGF0ZW4iOwokbGFuZ1sndGlueW1jZV9zdHQnXSA9ICJTcGllbHBsYW4iOwokbGFuZ1sndGlueW1jZV9zYXQnXSA9ICJTY2huaXR0bGlzdGUiOwokbGFuZ1sndGlueW1jZV9zZyddID0gIlNwaWVsIjsKJGxhbmdbJ3RpbnltY2Vfc2xyJ10gPSAiVmVyZWluc3NwaWVscGxhbiI7CiRsYW5nWydmb3VyX3dlZWtzX2FnbyddID0gIkRpZSBsZXR6dGVuIHZpZXIgV29jaGVuIjsKJGxhbmdbJ3RocmVlX3dlZWtzX2FnbyddID0gIkRpZSBsZXR6dGVuIGRyZWkgV29jaGVuIjsKJGxhbmdbJ3R3b193ZWVrc19hZ28nXSA9ICJEaWUgbGV0enRlbiB6d2VpIFdvY2hlbiI7CiRsYW5nWydvbmVfd2Vla19hZ28nXSA9ICJMZXR6dGUgV29jaGUiOwokbGFuZ1snbmV4dF93ZWVrJ10gPSAiTsOkY2hzdGUgV29jaGUiOwokbGFuZ1snbmV4dF90d29fd2Vla3MnXSA9ICJEaWUgbsOkY2hzdGVuIHp3ZWkgV29jaGVuIjsKJGxhbmdbJ25leHRfdGhyZWVfd2Vla3MnXSA9ICJEaWUgbsOkY2hzdGVuIGRyZWkgV29jaGVuIjsKJGxhbmdbJ25leHRfZm91cl93ZWVrcyddID0gIkRpZSBuw6RjaHN0ZW4gdmllciBXb2NoZW4iOwokbGFuZ1snY2hhbmdlbG9nJ10gPSAnPHVsPgo8bGk+VmVyc2lvbiAwLjAuMSAtIDIuIEphbnVhciAyMDEyLiBFcnN0ZXMgUmVsZWFzZS48L2xpPgo8bGk+VmVyc2lvbiAwLjAuMiAtIDE5LiBBcHJpbCAyMDEyLiBLZWluZSBuZXVlbiBGZWF0dXJlcyBhYmVyIFZlcnZvbGxzdMOkbmRpZ3VuZyBkZXIgRG9rdW1lbnRhdGlvbi48L2xpPgo8bGk+VmVyc2lvbiAwLjAuMyAtIDI3LiBBcHJpbCAyMDEyLiBEb2t1bWVudGF0aW9uIGdlw6RuZGVyLCBwYXJhbWV0ZXIgc2hvd2xhdGVzdHJlc3VsdHMgZWluZ2Vmw7xndCB1bmQgZGllIHp1Z2Vow7ZyaWdlbiB0ZW1wbGF0ZXM8L2xpPgo8bGk+VmVyc2lvbiAwLjAuNCAtIDI4LiBBcHJpbCAyMDEyLiBUaW55TUNFIEludGVncmF0aW9uIGhpbnp1Z2Vmw7xndDwvbGk+CjxsaT5WZXJzaW9uIDAuMC41IC0gMDIuIFNlcHRlbWJlciAyMDEyLiAKICAgICAgICAgICAgICAgICA8YnIvPlNwaWVscGzDpG5lIGFscyB4bHMvcGRmL2ljcyBhdXNnZWJlbiBoaW56dWdlZsO8Z3QuCiAgICAgICAgICAgICAgICAgPGJyLz5PbmVFbGV2ZW4ga29tcGF0aWJpbGl0w6R0IGhlcmdlc3RlbGx0LgogICAgICAgICAgICAgICAgIDxici8+SGluenVmw7xnZW4gdm9uIEphdmFza3JpcHQgY29kZSBpbSBUZW1wbGF0ZSBuaWNodCBtZWhyIG7DtnRpZy48L2xpPgo8bGk+VmVyc2lvbiAwLjAuNiAtIDA2LiBTZXB0ZW1iZXIgMjAxMi4gCiAgCQkJCSAgICA8YnIvPnBkZiBVbnRlcnN0w7x0enVuZyBlbnRmZXJudCAod2VnZW4gRGF0ZWlncsO2w59lIGRlcyBNb2R1bHMpCgkJCQkgICAgPGJyLz5Gb3JtYXQgZsO8ciBTcGllbHBsw6RuZWZvcm11bGFyIHZvbiBwb3N0IG5hY2ggZ2V0IGdlw6RuZGVydCwgZGEgc29uc3QgeGxze3h9L2ljcyBvbmx5IG51ciBhdWYgZGVyIEhhdXB0c2VpdGUgZnVua3Rpb25pZXJ0LjwvbGk+CjxsaT5WZXJzaW9uIDAuMC43IC0gMTAuIFNlcHRlbWJlciAyMDEyCgkJCQk8YnIvPlBhcmFtZXRlcndlcnQgZsO8ciBkZW4gYWN0aW9uIFBhcmFtZXRlciBoaW56dWdlZsO8Z3Q6IHNob3dwbGF5ZXJyZXN1bHRzCgkJCQk8YnIvPkRlbiBjb21wbGV0ZXRlYW1pbmZvcm1hdGlvbiBhY3Rpb24gV2VydCBnZcOkbmRlcnQgKHNob3dwbGF5ZXJyZXN1bHRzIGhpbnp1Z2Vmw7xndCk8L2xpPgo8bGk+VmVyc2lvbiAwLjAuOCAtIDMwLiBTZXB0ZW1iZXIgMjAxNC4KCQkJCTxici8+RXJzdGUgVmVyc2lvbiBkaWUgMTIwIFd1cmYgRWluZ2FiZSB1bnRlcnN0w7x0enQ8L2xpPgo8bGk+VmVyc2lvbiAwLjAuOSAtIDE2LiBBdWd1c3QgMjAxNS4KCQkJCTxici8+U3RhdGlzdGlrZW4gZsO8ciBTcGllbGVyIHVuZCBNYW5uc2NoYWZ0IGbDvHIgMTIwIFd1cmYgaGluenVnZWbDvGd0PC9saT4KPC91bD4nOwokbGFuZ1snaGVscCddID0gJzxoMz5XYXMgbWFjaHQgZGFzIE1vZHVsIEtlZ2VsZXJnZWJuaXNzZT88L2gzPgo8cD5EaWVzZXMgTW9kdWwga2FubiBmw7xyIGRpZSBFaW5nYWJlIHVuZCBBbnplaWdlIGRlciBLZWdlbGVyZWdlYm5pc3NlIGVpbmVzIEtsdWJzIHZlcndlbmRldCB3ZXJkZW4uIEVzIHdlcmRlbiBzb3dvaGwgU2Fpc29ucyBhbHMgYXVjaCBNYW5uc2NoYWZ0ZW4gdmVyd2FsdGV0LiBadXPDpHR6bGljaCBrw7ZubmVuIG5vY2ggd2VpdGVyZSBTdGF0aXN0aWtkYXRlbiBhdXNnZWdlYmVuIHdlcmRlbi48L3A+CjxwPkVzIGJlc3RlaHQgenVkZW0gZGllIE3DtmdsaWNoa2VpdCBlaW56ZWxuZSBTcGllbGJlcmljaHRlIGFuenV6ZWlnZW4uIERhbWl0IHN0ZWh0IGJlaXNwaWVsc3dlaXNlIGVpbmVtIE1hbm5zY2hhZnRzZsO8aHJlciBvZmZlbiwgQmVyaWNodGUgenUgZGVuIGpld2VpbGlnZW4gU3BpZWxlbiB2ZXJmYXNzZW4genUga8O2bm5lbiB1bmQgYXVmIGVpbmZhY2hlIEFydCB1bmQgV2Vpc2UgYXVjaCBlaW5lbiBTcGllbGJlcmljaHQgZWluenVmw7xnZW4uIEhpZXJmw7xyIG11c3MgbGVkaWdsaWNoIGRlciBTcGllbGJlcmljaHQgaW4gZGVyIERhdGVuYmFuayBoaW50ZXJsZWd0IHNlaW4uPC9wPgoKPGgzPkluZm9ybWF0aW9uIGbDvHIgQWRtaW5pc3RyYXRvcmVuIHp1ciBJbnRlZ3JhdGlvbiBkZXMgTW9kdWxlcyBLZWdlbGVyZ2Vibmlzc2UgaW4gQ01TTWFkZVNpbXBsZTwvaDM+CjxwPlZlcmFsdGV0OiBVbSBkYXMgTW9kdWwgS2VnZWxlcmdlYm5pc3NlIGluIHZvbGxlbSBVbWZhbmcgbnV0emVuIHp1IGvDtm5uZW4gKHZvciBhbGxlbSBkZXIgUGFyYW1ldGVyIGFjdGlvbj0iY29tcGxldGV0ZWFtaW5mb3JtYXRpb24iKSBpc3QgZXMgbsO2dGlnIGluIGRhcyBUZW1wbGF0ZSBmb2xnZW5kZW4gSmF2YXNrcmlwdCBDb2RlIGVpbnp1YmluZGVuOjxici8+Cjxjb2RlPgpmdW5jdGlvbiBzZXRWaXNpYmlsaXR5KGlkLCB2aXNpYmlsaXR5KSB7PGJyLz4KJm5ic3A7aWRlbnRpdHk9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpOzxici8+CiZuYnNwO2lkZW50aXR5LnN0eWxlLmRpc3BsYXk9dmlzaWJpbGl0eTs8YnIvPgp9PGJyLz4KPC9jb2RlPgpEaWVzZXIgQ29kZSBmaW5kZXQgc2ljaCBhdWNoIGltIDxjb2RlPnRlbXBsYXRlPC9jb2RlPiBWZXJ6ZWljaG5pcyBpbiBkZXIgRGF0ZWkgPGNvZGU+a2VnZWxlcmdlYm5pc3NlLmpzCjwvY29kZT4uPC9wPgo8cD5OYWNoIGVpbmVyIE5ldWluc3RhbGxhdGlvbiBpc3QgZXMgbnVuIG5pY2h0IG1laHIgbsO2dGlnLCBkaWVzZW4gSmF2YXNrcmlwdCBDb2RlIGluIGRpZSBTZWl0ZSBlaW56dWbDvGdlbi4gU29sbHRlIGRhcyBiZXJlaXRzIHBhc3NpZXJ0IHNlaW4sIGthbm4gZGVyIENvZGUgd2llZGVyIGF1cyBkZW0gVGVtcGxhdGUgZW50ZmVybnQgd2VyZGVuLjwvcD4KCjxwPgpVbSBzw6RtdGxpY2hlIEZvcm1hdGllcnVuZ2VuIGbDvHIgU3BpZWxiZXJpY2h0ZSwgVGFiZWxsZW4gdW5kIFNjaG5pdHRsaXN0ZW4gaW4gQ01TTWFkZVNpbXBsZSB6dSBpbnRlZ3JpZXJlbiwgbXVzcyBub2NoIGRhcyBTdHlsZXNoZWV0IDxjb2RlPmtlZ2VsZXJnZWJuaXNzZS5jc3M8L2NvZGU+LCB3ZWxjaGVzIHNpY2ggZWJlbmZhbGxzIGltIFRlbXBsYXRldmVyemVpY2huaXMgYmVmaW5kZXQsIGlubmVyaGFsYiBkZXMgU3R5bGVzaGVldCBNYW5hZ2VycyBpbXBvcnRpZXJ0IHdlcmRlbi4gQW5zY2hsaWXDn2VuZCBrYW5uIGRpZXNlcyBTdHlsZXNoZWV0IGlubmVyaGFsYiBkZXMgVGVtcGxhdGVtYW5hZ2VycyBtaXQgYWxsZW4gZsO8ciBkYXMgTW9kdWwgdmVyd2VuZGV0ZW4gVGVtcGxhdGVzIHZlcmtuw7xwZnQgd2VyZGVuLiA8L3A+Cgo8aDM+V2llIHdpcmQgZGFzIE1vZHVsIEtlZ2VsZXJnZWJuaXNzZSB2ZXJ3ZW5kZXQ/PC9oMz4KPHA+RGFzIE1vZHVsIHdpcmQgbWl0IGZvbGdlbmRlbiBQYXJhbWV0ZXJuIGF1ZmdlcnVmZW46IDxjb2RlPntjbXNfbW9kdWxlIG1vZHVsZT0ia2VnZWxlcmdlYm5pc3NlIn08L2NvZGU+IG9kZXIgYWx0ZXJuYXRpdiBtaXQge2tlZ2VsZXJnZWJuaXNzZX08L3A+Cgo8aDM+V2VsY2hlIFBhcmFtZXRlciBrw7ZubmVuIGRlbSBNb2R1bCDDvGJlcmdlYmVuIHdlcmRlbj88L2gzPgo8cD5EaWUgdmVyc2NoaWVkZW5lbiBBbnplaWdlbcO2Z2xpY2hrZWl0ZW4gYXVmIGRlciBIb21lcGFnZSBlcmdlYmVuIHNpY2ggYXVzIGRlbSBQYXJhbWV0ZXIgPGNvZGU+YWN0aW9uPC9jb2RlPi4gRsO8ciBqZWRlbiBXZXJ0IGRlcyBBY3Rpb24gUGFyYW1ldGVycyB3aXJkIGhpZXIgZWluIEJlaXNwaWVsIGdlZ2ViZW46Cjx1bD4KICA8bGk+PGNvZGU+YWN0aW9uPSJjb21wbGV0ZXRlYW1pbmZvcm1hdGlvbiI8L2NvZGU+OiBIaWVyIGVpbiBCZWlzcGllbCwgd2llIGRpZSBrb21wbGV0dGVuIE1hbm5zY2hhZnRzaW5mb3JtYXRpb25lbiBkZXIgTWFubnNjaGFmdCAiVFNWIExhaG0gSnVnZW5kIEEgMSIgaW4gZGVyIFNhaXNvbiAiMjAxMS8yMDEyIiBhbmdlemVpZ3Qgd2VyZGVuIGvDtm5uZW46CiAgPGJyLz48Y29kZT57a2VnZWxlcmdlYm5pc3NlIGFjdGlvbj0iY29tcGxldGV0ZWFtaW5mb3JtYXRpb24iIHNhaXNvbj0iMjAxMS8yMDEyIiB0ZWFtPSJUU1YgTGFobSBKdWdlbmQgQSAxIn08L2NvZGU+PC9saT4KICA8bGk+PGNvZGU+YWN0aW9uPSJzaG93dGVhbXRhYmxlIjwvY29kZT46IEhpZXIgZWluIEJlaXNwaWVsLCB3aWUgZGVyIFNwaWVscGxhbiBkZXIgTWFubnNjaGFmdCAiVFNWIExhaG0gSnVnZW5kIEEgMSIgaW4gZGVyIFNhaXNvbiAiMjAxMS8yMDEyIiBhbmdlemVpZ3Qgd2VyZGVuIGthbm46CiAgPGJyLz48Y29kZT57a2VnZWxlcmdlYm5pc3NlIGFjdGlvbj0ic2hvd3RlYW10YWJsZSIgc2Fpc29uPSIyMDExLzIwMTIiIHRlYW09IlRTViBMYWhtIEp1Z2VuZCBBIDEifTwvY29kZT48L2xpPgogIDxsaT48Y29kZT5hY3Rpb249InNob3dnYW1lIjwvY29kZT46IEhpZXIgZWluIEJlaXNwaWVsLCB3aWUgZGFzIDIuIFNwaWVsIGRlciBNYW5uc2NoYWZ0ICJUU1YgTGFobSBKdWdlbmQgQSAxIiBpbiBkZXIgU2Fpc29uICIyMDExLzIwMTIiIGFuZ2V6ZWlndCB3ZXJkZW4ga2FubjoKICA8YnIvPjxjb2RlPntrZWdlbGVyZ2Vibmlzc2UgYWN0aW9uPSJzaG93Z2FtZSIgc2Fpc29uPSIyMDExLzIwMTIiIHRlYW09IlRTViBMYWhtIEp1Z2VuZCBBIDEiIG51bWJlcj0iMiJ9PC9jb2RlPjwvbGk+CiAgPGxpPjxjb2RlPmFjdGlvbj0ic2hvd2F2ZXJhZ2V0ZWFtIjwvY29kZT4gSGllciBlaW4gQmVpc3BpZWwsIHdpZSBkaWUgU2Nobml0dGxpc3RlIGRlciBNYW5uc2NoYWZ0ICJUU1YgTGFobSBKdWdlbmQgQSAxIiBpbiBkZXIgU2Fpc29uICIyMDExLzIwMTIiIGFuZ2V6ZWlndCB3ZXJkZW4ga2FubjoKICA8YnIvPjxjb2RlPntrZWdlbGVyZ2Vibmlzc2UgYWN0aW9uPSJzaG93YXZlcmFnZXRlYW0iIHNhaXNvbj0iMjAxMS8yMDEyIiB0ZWFtPSJUU1YgTGFobSBKdWdlbmQgQSAxIn08L2NvZGU+PC9saT4KICA8bGk+PGNvZGU+YWN0aW9uPSJzaG93YXZlcmFnZXRlYW0xMjAiPC9jb2RlPiBIaWVyIGVpbiBCZWlzcGllbCwgd2llIGRpZSBTY2huaXR0bGlzdGUgZGVyIE1hbm5zY2hhZnQgIlRTViBMYWhtIEp1Z2VuZCBBIDEiIGluIGRlciBTYWlzb24gIjIwMTEvMjAxMiIgaW0gMTIwIFd1cmYgU3lzdGVtIGFuZ2V6ZWlndCB3ZXJkZW4ga2FubjoKICA8YnIvPjxjb2RlPntrZWdlbGVyZ2Vibmlzc2UgYWN0aW9uPSJzaG93YXZlcmFnZXRlYW0xMjAiIHNhaXNvbj0iMjAxMS8yMDEyIiB0ZWFtPSJUU1YgTGFobSBKdWdlbmQgQSAxIn08L2NvZGU+PC9saT4KICA8bGk+PGNvZGU+YWN0aW9uPSJzaG93bGF0ZXN0cmVzdWx0cyI8L2NvZGU+IEhpZXIgZWluIEJlaXNwaWVsLCBkYXNzIGRpZSBTcGllbGUgYWxsZXIgTWFubnNjaGFmdGVuIHfDpGhyZW5kIGRlciBsZXR6dGVuIDE0IFRhZ2UgemVpZ3Q6CiAgPGJyLz48Y29kZT57a2VnZWxlcmdlYm5pc3NlIGFjdGlvbj0ic2hvd2xhdGVzdHJlc3VsdHMiIGRheXM9Ii0xNCJ9PC9jb2RlPjwvbGk+CiAgPGxpPjxjb2RlPmFjdGlvbj0ieGxzdGVhbXRhYmxlIjwvY29kZT4gSGllciBlaW4gQmVpc3BpZWwsIGRhc3MgZGVuIFNwaWVscGxhbiBkZXIgTWFubnNjaGFmdCAiVFNWIExhaG0gSnVnZW5kIEEgMSIgaW4gZGVyIFNhaXNvbiAiMjAxMS8yMDEyIiBhbHMgRXhjZWwtMjAwNyBEb2t1bWVudCB6dXLDvGNrZ2lidAogIDxici8+PGNvZGU+e2tlZ2VsZXJnZWJuaXNzZSBhY3Rpb249Inhsc3RlYW10YWJsZSIgc2Fpc29uPSIyMDExLzIwMTIiIHRlYW09IlRTViBMYWhtIEp1Z2VuZCBBMSIgbGlua3R5cGU9Inhsc3gifTwvY29kZT48L2xpPgogIDxsaT48Y29kZT5hY3Rpb249InNob3dwbGF5ZXJyZXN1bHRzIjwvY29kZT4gSGllciBlaW4gQmVpc3BpZWwsIGRhc3MgZGllIEluZm9ybWF0aW9uZW4gw7xiZXIgZGVuIFNwaWVsZXIgIkdlcmFsZCBMdXR0ZXIiIGluIGRlciBTYWlzb24gIjIwMTEvMjAxMiIgaW4gZGVyIE1hbm5zY2hhZnQgIlRTViBMYWhtIEhlcnJlbiAxIiB6dXLDvGNrZ2lidAogIDxici8+PGNvZGU+e2tlZ2VsZXJnZWJuaXNzZSBhY3Rpb249InNob3dwbGF5ZXJyZXN1bHRzIiBzYWlzb249IjIwMTEvMjAxMiIgdGVhbT0iVFNWIExhaG0gSGVycmVuIDEifTwvY29kZT48L2xpPgogIDxsaT48Y29kZT5hY3Rpb249InNob3dwbGF5ZXJyZXN1bHRzMTIwIjwvY29kZT4gSGllciBlaW4gQmVpc3BpZWwsIGRhc3MgZGllIEluZm9ybWF0aW9uZW4gw7xiZXIgZGVuIFNwaWVsZXIgIkdlcmFsZCBMdXR0ZXIiIGluIGRlciBTYWlzb24gIjIwMTEvMjAxMiIgaW4gZGVyIE1hbm5zY2hhZnQgIlRTViBMYWhtIEhlcnJlbiAxIiBpbSAxMjAgV3VyZiBTeXN0ZW0genVyw7xja2dpYnQKICA8YnIvPjxjb2RlPntrZWdlbGVyZ2Vibmlzc2UgYWN0aW9uPSJzaG93cGxheWVycmVzdWx0czEyMCIgc2Fpc29uPSIyMDExLzIwMTIiIHRlYW09IlRTViBMYWhtIEhlcnJlbiAxIn08L2NvZGU+PC9saT4KPC91bD4KPC9wPgoKPC9wPgpXZW5uIGRlciBUaW55TUNFIEVkaXRvciBpbnN0YWxsaWVydCBpc3QsIG11c3MgZWluZmFjaCBkaWUgRXJ3ZWl0ZXJ1bmcgPGNvZGU+a2VnZWxlcmdlYm5pc3NlX2luc2VydDwvY29kZT4gYWt0aXZpZXJ0IHVuZCBkZXIgdGFnIGluIGRlciBMZWlzdGUgZGVzIFRpbnlNQ0UgcGFuZWxzIGVpbmdlZsO8Z3Qgd2VyZGVuLgpEYXJhdWZoaW4gZXJzY2hlaW50IGlubmVyaGFsYiBkZXMgRWRpdG9ycyBlaW4gQnV0dG9uLCBtaXQgZGVtIGRpZSBvYmVuIGJlc2NocmllYmVuZW4gRWludHLDpGdlIGJlcXVlbSBwZXIgTWVuw7wgZWluZ2Vmw7xndCB3ZXJkZW4ga8O2bm5lbi4KPC9wPgoKPGgzPlN1cHBvcnQ8L2gzPgo8cD5BcyBwZXIgdGhlIEdQTCwgdGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBhcy1pcy4gUGxlYXNlIHJlYWQgdGhlIHRleHQgb2YgdGhlIGxpY2Vuc2UgZm9yIHRoZSBmdWxsIGRpc2NsYWltZXIuPC9wPgoKPGgzPkNvcHlyaWdodCBhbmQgTGljZW5zZTwvaDM+CjxwPkNvcHlyaWdodCAmY29weTsgMjAxMiwgR2VyYWxkIEx1dHRlciA8YSBocmVmPSJtYWlsdG86Z2VyYWxkQGl0emdydW5kLm5ldCI+Jmx0O2dlcmFsZEBpdHpncnVuZC5uZXQmZ3Q7PC9hPi4gQWxsIFJpZ2h0cyBBcmUgUmVzZXJ2ZWQuPC9wPgo8cD5UaGlzIG1vZHVsZSBoYXMgYmVlbiByZWxlYXNlZCB1bmRlciB0aGUgPGEgaHJlZj0iaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2xpY2Vuc2VzLmh0bWwjR1BMIj5HTlUgUHVibGljIExpY2Vuc2U8L2E+LiBZb3UgbXVzdCBhZ3JlZSB0byB0aGlzIGxpY2Vuc2UgYmVmb3JlIHVzaW5nIHRoZSBtb2R1bGUuPC9wPgo8cD5UaGlzIG1vZHVsZSB1c2VzIHRoZSBQSFBFeGNlbCBsaWJyYXJ5IGF2YWlsYWJsZSBmcm9tIDxhIGhyZWY9Imh0dHA6Ly9waHBleGNlbC5jb2RlcGxleC5jb20iPmh0dHA6Ly9waHBleGNlbC5jb2RlcGxleC5jb208L2E+LiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlCjxhIGhyZWY9Imh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9vbGQtbGljZW5zZXMvbGdwbC0yLjEiPkxlc3NlciBHTlUgUHVibGljIExpY2Vuc2UgLSAyLjE8L2E+LiBZb3UgaGF2ZSB0byBhZ3JlZSB0byB0aGlzIGxpY2Vuc2UgaWYgeW91IHdhbnQgdG8gdXNlIHRoZSB4bHMgZXhwb3J0CmZ1bmN0aW9ucyBvZiB0aGlzIG1vZHVsZS48L3A+JzsKPz4K]]></data>
	</file>
	<file>
	  <filename>/lang/en_US.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKJGxhbmdbJ2tlZ2VsZXJnZWJuaXNzZV9wZXJtZGVzYyddID0gIlBlcm1pc3Npb24gdG8gY2hhbmdlIGNvbnRlbnRzIG9mIFNraXR0bGUgcmVzdWx0cyBtb2R1bGUiOwokbGFuZ1snaG9tZXRlYW0nXSA9ICdPdXIgdGVhbSc7CiRsYW5nWydhd2F5dGVhbSddID0gJ09wcG9uZW50IHRlYW0nOwokbGFuZ1snaG9tZWdhbWUnXSA9ICdIb21lIEdhbWUnOwokbGFuZ1snYXdheWdhbWUnXSA9ICdBd2F5IEdhbWUnOwokbGFuZ1snMTIwQmFsbHMnXSA9ICcxMjAgQmFsbHMnOwokbGFuZ1snU1AnXSA9ICdTUCc7CiRsYW5nWydNUCddID0gJ01QJzsKJGxhbmdbJ2dhbWUnXSA9ICdHYW1lJzsKJGxhbmdbJ2dhbWVzJ10gPSAnR2FtZXMnOwokbGFuZ1snYWxsUGxheWVycyddID0gJ0FsbCc7CiRsYW5nWydmcmllbmRseW5hbWUnXSA9ICdTa2l0dGxlIHJlc3VsdHMnOwokbGFuZ1sncG9zdGluc3RhbGwnXSA9ICdUaGUgbW9kdWxlIFNraXR0bGUgcmVzdWx0cyBoYXMgYmVlbiBpbnN0YWxsZWQhJzsKJGxhbmdbJ3Bvc3R1bmluc3RhbGwnXSA9ICdUaGUgbW9kdWxlIFNraXR0ZWwgcmVzdWx0cyBoYXMgYmVlbiB1bmluc3RhbGxlZCEiJzsKJGxhbmdbJ3JlYWxseV91bmluc3RhbGwnXSA9ICdEbyB5b3UgcmVhbGx5IHdhbnQgdG8gcmVtb3ZlIFNraXR0bGUgcmVzdWx0cz8gQWxsIHlvdXIgZGF0YWJhc2UgZW50cmllcyB5b3UgaGF2ZSBkb25lIHNvIGZhciB3aWxsIGJlIGRlc3Ryb3llZCEnOwokbGFuZ1sndW5pbnN0YWxsZWQnXSA9ICdTa2l0dGxlIHJlc3VsdHMgcmVtb3ZlZC4nOwokbGFuZ1snaW5zdGFsbGVkJ10gPSAnU2tpdHRsZSByZXN1bHRzIHZlcnNpb24gJXMgaW5zdGFsbGVkLic7CiRsYW5nWyd1cGdyYWRlZCddID0gJ1NraXR0bGUgcmVzdWx0cyB1cGdyYWRlZCB0byB2ZXJzaW9uICVzLic7CiRsYW5nWydtb2RkZXNjcmlwdGlvbiddID0gJ1RoaXMgTW9kdWxlIGNhbiBiZSB1c2VkIGZvciBtYW5hZ2luZyB5b3VyIHNraXR0bGVzIGNsdWIuIFlvdSBjYW4gbWFuYWdlIHlvdXIgcGxheWVycywgdGVhbXMsIHNhaXNvbnMgYW5kIGdhbWVzLiBBZGRpdGlvbmFsbHkgdGhlcmUgZXhpc3RzIGEgc3RhdGlzdGljcyB0b29sIHRoYXQgY3VycmVudGx5IHN1cHBvcnRzIGF2ZXJhZ2UgcmVzdWx0cy4nOwokbGFuZ1snZXJyb3J0YWcnXSA9ICJFcnJvciBpbnNpZGUgc21hcnR5IHRhZyI7CiRsYW5nWydlcnJvcnBhcmFtJ10gPSAnRXJyb3IgcGxlYXNlIHJldmlldyB5b3VyIHBhcmFtZXRlcnMuJzsKJGxhbmdbJ2FkbWluX3RpdGxlJ10gPSAnU2tpdHRsZSByZXN1bHRzIGFkbWluIMO8YW5lbCc7CiRsYW5nWydhZG1pbmRlc2NyaXB0aW9uJ10gPSAnSGVyZSB5b3UgY2FuIG1hbmFnZSB5b3VyIHRlYW1zLiBUaGVyZSBpcyBubyBvcHRpb24gdG8gZGVsZXRlIGRhdGEgeW91IGhhdmUgcHV0IGluLiBJdCBpcyBvbmx5IHBvc3NpYmxlIHRvIGFkZCBuZXcgZGF0YSBvciB0byBhbHRlciBleGlzdGluZyBkYXRhLic7CiRsYW5nWydhY2Nlc3NkZW5pZWQnXSA9ICdBY2Nlc3MgZGVuaWVkLCBwbGVhc2UgcmV2aWV3IHlvdXIgcGVybWlzc2lvbnMuJzsKJGxhbmdbJ3Bvc3RpbnN0YWxsJ10gPSAnSW5zdGFsbGF0aW9uIHN1Y2Nlc3NmdWxsIHBsZWFzZSBzZXQgdGhlICcuJGxhbmdbJ2tlZ2VsZXJnZWJuaXNzZV9wZXJtZGVzYyddLicgZm9yIHlvdXIgdXNlcnMuJzsKJGxhbmdbJ1NhaXNvbiddID0gJ1NlYXNvbic7CiRsYW5nWydTcGllbGVyJ10gPSAnUGxheWVyJzsKJGxhbmdbJ01hbm5zY2hhZnQnXSA9ICdUZWFtJzsKJGxhbmdbJ1NwaWVscGxhbiddID0gJ1NjaGVkdWxlJzsKJGxhbmdbJ3RpdGxlX3NhaXNvbiddID0gJ1NlYXNvbic7CiRsYW5nWyd0aXRsZV9zcGllbGVyJ10gPSAnUGxheWVyJzsKJGxhbmdbJ3RpdGxlX21hbm5zY2hhZnQnXSA9ICdUZWFtJzsKJGxhbmdbJ3RpdGxlX3NwaWVscGxhbiddID0gJ1NjaGVkdWxlJzsKJGxhbmdbJ2RlbGV0ZSddID0gJ2RlbGV0ZSc7CiRsYW5nWydwbGF5ZXJuYW1lX2hlYWRlciddID0gJ05hbWUnOwokbGFuZ1sncGxheWVyYWN0aW9uX2hlYWRlciddID0gJ0FjdGlvbic7CiRsYW5nWydjaGFuZ2UnXSA9ICdDaGFuZ2UnOwokbGFuZ1snYWRkJ10gPSAnQWRkJzsKJGxhbmdbJ3RlYW1uYW1lX2hlYWRlciddID0gJ05hbWUnOwokbGFuZ1snc2Fpc29ubmFtZV9oZWFkZXInXSA9ICdOYW1lLCBCZWdpbihERC5NTS5ZWVlZIEhIOk1NKSwgRW5kKERELk1NLllZWVkgSEg6TU0pJzsKJGxhbmdbJ3NhaXNvbmxhYmVsJ10gPSAnU2Vhc29uJzsKJGxhbmdbJ3RlYW1sYWJlbCddID0gJ1RlYW0nOwokbGFuZ1snbG9hZCddID0gJ0xvYWQnOwokbGFuZ1snZGF0ZSddID0gJ0RhdGUgKERELk1NLllZWVkpJzsKJGxhbmdbJ3RpbWUnXSA9ICdUaW1lIChISDpNTSknOwokbGFuZ1snZGF0ZV9mcm9udGVuZCddID0gJ0RhdGUnOwokbGFuZ1sndGltZV9mcm9udGVuZCddID0gJ1RpbWUnOwokbGFuZ1snZmlyc3Ryb3VuZCddID0gJ0ZpcnN0IFJvdW5kJzsKJGxhbmdbJ3NlY29uZHJvdW5kJ10gPSAnU2Vjb25kIFJvdW5kJzsKJGxhbmdbJ2hvbWVhd2F5J10gPSAnSG9tZSc7CiRsYW5nWydvcHBvbmVudCddID0gJ09wcG9uZW50JzsKJGxhbmdbJ3Jlc3VsdCddID0gJ1Jlc3VsdCc7CiRsYW5nWydhY3Rpb24nXSA9ICdBY3Rpb24nOwokbGFuZ1snZWRpdGdhbWUnXSA9ICdSZXN1bHQgc2hlZXQnOwokbGFuZ1sncGxheWVydG90ZWFtJ10gPSAnQXNzaWdubWVudDogUGxheWVyIDwtPiBUZWFtJzsKJGxhbmdbJ3NvcnRieXRlYW0nXSA9ICdTb3J0IGJ5IHRlYW0nOwokbGFuZ1snc29ydGJ5cGxheWVyJ10gPSAnU29ydCBieSBwbGF5ZXInOwokbGFuZ1snZ2FtZXJlc3VsdCddID0gJ1Jlc3VsdCBzaGVldCc7CiRsYW5nWydzYXZlJ10gPSAnU2F2ZSc7CiRsYW5nWydob21lJ10gPSAnSG9tZSc7CiRsYW5nWydndWVzdCddID0gJ0d1ZXN0JzsKJGxhbmdbJ1NCVm9sbCddID0gJ1ZvbGwnOwokbGFuZ1snU0JBYnInXSA9ICdBYnInOwokbGFuZ1snU0JOYW1lJ10gPSAnTmFtZSc7CiRsYW5nWydTQkZlaGwnXSA9ICdNaXNzJzsKJGxhbmdbJ1NCR2VzJ10gPSAnR2VzJzsKJGxhbmdbJ1NCVHlwZSddID0gJ1R5cGUnOwokbGFuZ1snU0JBd2F5J10gPSAnQXdheSc7CiRsYW5nWydTQkhvbWUnXSA9ICdIb21lJzsKJGxhbmdbJ2NvdW50J10gPSAnQ291bnQnOwokbGFuZ1sndGltZXRhYmxlJ10gPSAnU2NoZWR1bGUnOwokbGFuZ1snYXZlcmFnZXRhYmxlJ10gPSAnQXZlcmFnZSB0YWJsZSc7CiRsYW5nWydhdmVyYWdlJ10gPSAnQXZlcmFnZSc7CiRsYW5nWydkaXNwbGF5J10gPSAnRGlzcGxheSc7CiRsYW5nWydhbGx0ZWFtcyddID0gJ0FsbCB0ZWFtcyc7CiRsYW5nWydub3Jlc3VsdCddID0gJ25vIHJlc3VsdCc7CiRsYW5nWydub2dhbWVzJ10gPSAnTm8gZ2FtZXMgYXZhaWxhYmxlJzsKJGxhbmdbJ2Vycm9yX251bWJlciddID0gJ1RoaXMgZ2FtZSBudW1iZXIgd2FzIGdpdmVuOiAnOwokbGFuZ1snZXJyb3JfdGVhbSddID0gJ1RoaXMgdGVhbSB3YXMgZ2l2ZW46ICc7CiRsYW5nWydlcnJvcl9zYWlzb24nXSA9ICdUaGlzIHNlYXNvbiB3YXMgZ2l2ZW46ICc7CiRsYW5nWydlcnJvcl9saW5rdHlwZSddID0gJ1RoaXMgbGlua3R5cGUgd2FzIGdpdmVuOiAnOwokbGFuZ1snaGVscF9hY3Rpb24nXSA9ICdUaGUgcGFyYW1ldGVyIDxjb2RlPmFjdGlvbjwvY29kZT4gZGVjaWRlcyB3aGF0IHRoZSBwbHVnaW4gc2hvdWxkIHNob3cuIERlcGVuZGluZyBvbiBpdHMgY29udGVudHMgdGhlcmUgYXJlIGFkZGl0aW9uYWwgc3ViIHBhcmFtZXRlcnMuCjx1bD4KPGxpPjxjb2RlPmNvbXBsZXRldGVhbWluZm9ybWF0aW9uPC9jb2RlPjogU2hvdyBhbGwgaW5mb3JtYXRpb24gYWJvdXQgYSB0ZWFtIChzY2hlZHVsZSwgZ2FtZXMsIGF2ZXJhZ2Ugc3RhdGlzdGljcyk8L2xpPgo8bGk+PGNvZGU+c2hvd3RlYW10YWJsZTwvY29kZT46IFNob3cgdGhlIHNjaGVkdWxlIG9mIG9uZSB0ZWFtIChvciBhbGwgdGVhbXMpLjwvbGk+CjxsaT48Y29kZT5zaG93Z2FtZTwvY29kZT46IFNob3dzIG9ubHkgb25lIHNwZWNpZmljIGdhbWUuPC9saT4KPGxpPjxjb2RlPnNob3dhdmVyYWdldGVhbTwvY29kZT46IFNob3dzIHRoZSBhdmVyYWdlIHN0YXRpc3RpY3Mgb2Ygb25lIHRlYW0uPC9saT4KPGxpPjxjb2RlPnNob3dsYXRlc3RyZXN1bHRzPC9jb2RlPjogU2hvdyBwYXJ0IG9mIHRoZSBzY2hlZHVsZSBvZiBhbGwgdGVhbXMuPC9saT4KPGxpPjxjb2RlPnhsc3RlYW10YWJsZTwvY29kZT46IFJldHVybnMgdGhlIHNjaGVkdWxlIHRhYmxlIG9mIGEgdGVhbSBkdXJpbmcgYSBzZWFzb24gYXMgRXhjZWwtZmlsZSBvciBpQ2FsZW5kYXI8L2xpPgo8bGk+PGNvZGU+c2hvd3BsYXllcnJlc3VsdHM8L2NvZGU+OiBSZXR1cm5zIGluZm9ybWF0aW9uIGFib3V0IGEgcGxheWVyLiBJdCBtYXkgYmUgbGltaXRlZCB0byB0ZWFtcyBhbmQvb3Igc2Vhc29ucy48L2xpPgo8bGk+PGNvZGU+c2hvd3BsYXllcnJlc3VsdHMxMjA8L2NvZGU+OiBSZXR1cm5zIGluZm9ybWF0aW9uIGFib3V0IGEgcGxheWVyIGluIDEyMCBiYWxsIHN5c3RlbS4gSXQgbWF5IGJlIGxpbWl0ZWQgdG8gdGVhbXMgYW5kL29yIHNlYXNvbnMuPC9saT4KPGxpPjxjb2RlPnNob3dhdmVyYWdldGVhbTEyMDwvY29kZT46IFNob3dzIHRoZSBhdmVyYWdlIHN0YXRpc3RpY3Mgb2Ygb25lIHRlYW0gaW4gMTIwIGJhbGwgc3lzdGVtLjwvbGk+CjwvdWw+JzsKJGxhbmdbJ2hlbHBfcGxheWVyJ10gPSAnVGhlIHBhcmFtZXRlciA8Y29kZT5wbGF5ZXI8L2NvZGU+IGRlY2lkZXMgZm9yIHdoaWNoIHBsYXllciBzb21ldGhpbmcgaGFzIHRvIGJlIHNob3duLiBJdCBpcyBvbmx5IHVzYWJsZSB3aXRoIHRoZSBmb2xsb3dpbmcgdmFsdWVzIG9mIHRoZSA8Y29kZT5hY3Rpb24+IHBhcmFtZXRlcjoKPHVsPgo8bGk+PGNvZGU+cGxheWVybmFtZTwvY29kZT46IHRoZSBuYW1lIG9mIHRoZSBwbGF5ZXIgKHRoZSByZXN1bHRzIG1heSBub3QgYmUgZGlzdGluY3QhKTwvbGk+CjxsaT48Y29kZT5wbGF5ZXJpZDwvY29kZT46IHRoZSBpZCBvZiB0aGUgcGxheWVyIGluc2lkZSB0aGUgZGF0YWJhc2UgKHRoZSByZXN1bHRzIGFyZSBkZWZpbmVkKTwvbGk+CjwvdWw+ClRoZSBwYXJhbWV0ZXIgaXMgb25seSB2YWxpZCBmb3IgdGhlIGZvbGxvd2luZyB2YWx1ZXMgb2YgdGhlIHBhcmFtZXRlciA8Y29kZT5hY3Rpb248L2NvZGU+Ogo8dWw+CjxsaT48Y29kZT5zaG93cGxheWVycmVzdWx0czwvY29kZT4gKHJlcXVpcmVkKTwvbGk+CjxsaT48Y29kZT5zaG93cGxheWVycmVzdWx0czEyMDwvY29kZT4gKHJlcXVpcmVkKTwvbGk+CjwvdWw+JzsKJGxhbmdbJ2hlbHBfc2Fpc29uJ10gPSAnVGhlIHBhcmFtZXRlciA8Y29kZT5zYWlzb248L2NvZGU+IGRlY2lkZXMgZm9yIHdoaWNoIHNlYXNvbiBzb21ldGhpbmcgaGFzIHRvIGJlIHNob3duLiBJdCBpcyBvbmx5IHVzYWJsZSB3aXRoIHRoZSBmb2xsb3dpbmcgdmFsdWVzIG9mIHRoZSA8Y29kZT5hY3Rpb248L2NvZGU+IHBhcmFtZXRlcjoKPHVsPgo8bGk+PGNvZGU+Y29tcGxldGV0ZWFtaW5mb3JtYXRpb248L2NvZGU+IChyZXF1aXJlZCk8L2xpPgo8bGk+PGNvZGU+c2hvd3RlYW10YWJsZTwvY29kZT4gKHJlcXVpcmVkKTwvbGk+CjxsaT48Y29kZT5zaG93Z2FtZTwvY29kZT4gKHJlcXVpcmVkKTwvbGk+CjxsaT48Y29kZT5zaG93YXZlcmFnZXRlYW08L2NvZGU+IChyZXF1aXJlZCk8L2xpPgo8bGk+PGNvZGU+c2hvd2F2ZXJhZ2V0ZWFtMTIwPC9jb2RlPiAocmVxdWlyZWQpPC9saT4KPGxpPjxjb2RlPnhsc3RlYW10YWJsZTwvY29kZT4gKHJlcXVpcmVkKTwvbGk+CjxsaT48Y29kZT5zaG93cGxheWVycmVzdWx0czwvY29kZT4gKG9wdGlvbmFsKSAtIHJlZHVjZXMgdGhlIHBsYXllciByZXN1bHRzIHRvIHRoZSBnaXZlbiBzZWFzb24uPC9saT4KPGxpPjxjb2RlPnNob3dwbGF5ZXJyZXN1bHRzMTIwPC9jb2RlPiAob3B0aW9uYWwpIC0gcmVkdWNlcyB0aGUgcGxheWVyIHJlc3VsdHMgdG8gdGhlIGdpdmVuIHNlYXNvbi48L2xpPgo8L3VsPic7CiRsYW5nWydoZWxwX3RlYW0nXSA9ICdUaGUgcGFyYW1ldGVyIDxjb2RlPnRlYW08L2NvZGU+IGRlY2lkZXMgZm9yIHdoaWNoIHRlYW0gc29tZXRoaW5nIGhhcyB0byBiZSBzaG93bi4gSXQgaXMgb25seSB1c2FibGUgd2l0aCB0aGUgZm9sbG93aW5nIHZhbHVlcyBvZiB0aGUgPGNvZGU+YWN0aW9uPC9jb2RlPiBwYXJhbWV0ZXI6Cjx1bD4KPGxpPjxjb2RlPmNvbXBsZXRldGVhbWluZm9ybWF0aW9uPC9jb2RlPiAocmVxdWlyZWQpPC9saT4KPGxpPjxjb2RlPnNob3d0ZWFtdGFibGU8L2NvZGU+IChyZXF1aXJlZCAtIHZhbHVlICJhbGwiIGlzIGFsc28gcG9zc2libGUgdG8gc2hvdyBhbGwgdGVhbXMpPC9saT4KPGxpPjxjb2RlPnNob3dnYW1lPC9jb2RlPiAocmVxdWlyZWQpPC9saT4KPGxpPjxjb2RlPnNob3dhdmVyYWdldGVhbTwvY29kZT4gKHJlcXVpcmVkKTwvbGk+CjxsaT48Y29kZT5zaG93YXZlcmFnZXRlYW0xMjA8L2NvZGU+IChyZXF1aXJlZCk8L2xpPgo8bGk+PGNvZGU+eGxzdGVhbXRhYmxlPC9jb2RlPiAocmVxdWlyZWQpPC9saT4KPGxpPjxjb2RlPnNob3dwbGF5ZXJyZXN1bHRzPC9jb2RlPiAob3B0aW9uYWwpIC0gcmVkdWNlcyB0aGUgcGxheWVyIHJlc3VsdHMgdG8gdGhlIGdpdmVuIHRlYW0uPC9saT4KPGxpPjxjb2RlPnNob3dwbGF5ZXJyZXN1bHRzMTIwPC9jb2RlPiAob3B0aW9uYWwpIC0gcmVkdWNlcyB0aGUgcGxheWVyIHJlc3VsdHMgdG8gdGhlIGdpdmVuIHRlYW0uPC9saT4KPC91bD4nOwokbGFuZ1snaGVscF9udW1iZXInXSA9ICdUaGUgcGFyYW1ldGVyIDxjb2RlPm51bWJlcjwvY29kZT4gZGVjaWRlcyB3aGljaCByZXN1bHQgb2Ygb25lIGdhbWUgKGNocm9ub2xvZ2ljYWxseSBvcmRlcmVkKSBvZiB3aGljaCB0ZWFtIGR1cmluZyBvbmUgc2Vhc29uIHNob3VsZCBiZSBzaG93bi4gVGhlcmVmb3JlIGl0IGlzIG9ubHkgdmFsaWQgZm9yIHRoZSBmb2xsb3dpbmcgdmFsdWUgb2YgdGhlIDxjb2RlPmFjdGlvbjwvY29kZT4gcGFyYW1ldGVyOgo8dWw+CjxsaT48Y29kZT5zaG93Z2FtZTwvY29kZT4gKHJlcXVpcmVkKTwvbGk+CjwvdWw+JzsKJGxhbmdbJ2hlbHBfZGF5cyddID0gJ1RoZSBwYXJhbWV0ZXIgPGNvZGU+ZGF5czwvY29kZT4gZGVjaWRlcyBob3cgbWFueSBkYXlzIGluIHRoZSBmdXR1cmUgKGRheXMgPiAwKSBvciBpbiB0aGUgcGFzdCAoZGF5cyA8IDApIGEgc2NoZWR1bGUgZm9yIGFsbCB0ZWFtcyBzaG91bGQgYmUgYnVpbGRUaGVyZWZvcmUgaXQgaXMgb25seSB2YWxpZCBmb3IgdGhlIGZvbGxvd2luZyB2YWx1ZSBvZiB0aGUgPGNvZGU+YWN0aW9uPC9jb2RlPiBwYXJhbWV0ZXI6Cjx1bD4KPGxpPjxjb2RlPnNob3dsYXRlc3RyZXN1bHRzPC9jb2RlPiAocmVxdWlyZWQpPC9saT4KPC91bD4nOwokbGFuZ1snaGVscF9saW5rdHlwZSddID0gJ1RoZSBwYXJhbWV0ZXIgPGNvZGU+bGlua3R5cGU8L2NvZGU+IGRlY2lkZXMgd2hpY2ggZm9ybWF0IHNob3VsZCBiZSB1c2VkIHRvIHJldHVybiBhIHNjaGVkdWxlIHRhYmxlIG9mIGEgdGVhbS4gUG9zc2libGUgdmFsdWVzIGFyZToKPHVsPgo8bGk+PGNvZGU+eGxzPC9jb2RlPjogcmV0dXJuIHRoZSB0ZWFtIHNjaGVkdWxlIHRhYmxlIGFzIEV4Y2VsLTIwMDMgZG9jdW1lbnQuCjxsaT48Y29kZT54bHN4PC9jb2RlPjogcmV0dXJuIHRoZSB0ZWFtIHNjaGVkdWxlIHRhYmxlIGFzIEV4Y2VsLTIwMDcvMjAxMCBkb2N1bWVudC4KPGxpPjxjb2RlPmljczwvY29kZT46IHJldHVybiB0aGUgdGVhbSBzY2hlZHVsZSBhcyBpY3MgY2FsZW5kYXIgZmlsZS4KPC91bD4KVGhpcyBwYXJhbWV0ZXIgaXMgb25seSB2YWxpZCB0aGUgZm9sbG93aW5nIHZhbHVlIG9mIHRoZSA8Y29kZT5hY3Rpb248L2NvZGU+IHBhcmFtZXRlcjoKPHVsPgo8bGk+PGNvZGU+eGxzdGVhbXRhYmxlPC9jb2RlPiAocmVxdWlyZWQpPC9saT4KPC91bD4nOwokbGFuZ1snaGVscF94bHNsaW5rJ10gPSAnVGhlIHBhcmFtZXRlciA8Y29kZT54bHNsaW5rPC9jb2RlPiB3aGljaCBmb3JtYXQgc2hvdWxkIGJlIHVzZWQgZm9yIGEgbGluayB0byBkYXRhLiBUaGUgZm9sbG93aW5nIHZhbHVlcyBjYW4gYmUgdXNlZCBhbmQgZXZlbiBiZSBjb21iaW5lZCAoc2VwYXJhdGVkIGJ5ICIsIik6Cjx1bD4KPGxpPjxjb2RlPnhsczwvY29kZT46IGdlbmVyYXRlIGEgbGluayBmb3IgYSBFeGNlbC0yMDAzIGZpbGU8L2xpPgo8bGk+PGNvZGU+eGxzeDwvY29kZT46IGdlbmVyYXRlIGEgbGluayBmb3IgYSBFeGNlbC0yMDA3LzIwMTAgZmlsZTwvbGk+CjxsaT48Y29kZT5pY3M8L2NvZGU+OiBnZW5lcmF0ZSBhIGxpbmsgZm9yIGFuIGljcyBjYWxlbmRhciBmaWxlPC9saT4KPGxpPjxjb2RlPm5vbmU8L2NvZGU+OiBkZWZhdWx0dmFsdWUsIG5vIGxpbmsgc2hvdWxkIGJlIHVzZWQuIElmIHRoZSBsaXN0IGNvbnRhaW5zIHRoaXMgdmFsdWUgbm8gbGluayB3aWxsIGJlIHdyaXR0ZW4uPC9saT4KPC91bD4KVGhlIHBhcmFtZXRlciBpcyB2YWxpZCBmb3IgdGhlIGZvbGxvd2luZyA8Y29kZT5hY3Rpb248L2NvZGU+IHBhcmFtZXRlcnM6Cjx1bD4KPGxpPjxjb2RlPmNvbXBsZXRldGVhbWluZm9ybWF0aW9uPC9jb2RlPiAob3B0aW9uYWwpPC9saT4KPGxpPjxjb2RlPnNob3d0ZWFtdGFibGU8L2NvZGU+IG9ubHkgdmFsaWQgaWYgdGhlIHZhbHVlICJhbGwiIGlzIG5vdCB1c2VkIGZvciB0aGUgPGNvZGU+dGVhbTwvY29kZT4gcGFyYW1ldGVyLiAob3B0aW9uYWwpPC9saT4KPC91bD4nOwokbGFuZ1snY29tcGxldGV0ZWFtaW5mb3JtYXRpb25kZXNjJ10gPSAiQ2xpY2sgb24gdGhlIGdhbWUgb3IgdGhlIHBsYXllciB0byBzZWUgZGV0YWlsZWQgcmVzdWx0cy4KQ2xpY2sgb24gdGhlIGRldGFpbGVkIHJlc3VsdHMgdG8gbWFrZSB0aGVtIGRpc3NhcGVhciBhZ2Fpbi4gU3dpdGNoIGJldHdlZW4gc2NoZWR1bGUgYW5kIGF2ZXJhZ2UKYnkgY2xpY2tpbmcgb24gdGhlIHRvcCB0YWdzLiI7CiRsYW5nWyd0aW55bWNlX2J1dHRvbl9za2l0dGxlcyddID0gInNraXR0bGUgcmVzdWx0cyI7CiRsYW5nWyd0aW55bWNlX2Rlc2NyaXB0aW9uX3BpY2tlciddID0gJ0FsbG93cyBlYXN5IGluamVjdGlvbiBvZiBza2l0dGxlIHJlc3VsdHMuJzsKJGxhbmdbJ3RpbnltY2VfY3RpJ10gPSAiU2hvdyB0ZWFtIGluZm9ybWF0aW9uIjsKJGxhbmdbJ3RpbnltY2Vfc3R0J10gPSAiU2hvdyB0ZWFtIHNjaGVkdWxlIjsKJGxhbmdbJ3RpbnltY2Vfc2F0J10gPSAiU2hvdyB0ZWFtIGF2ZXJhZ2UiOwokbGFuZ1sndGlueW1jZV9zZyddID0gIlNob3cgb25lIGdhbWUiOwokbGFuZ1sndGlueW1jZV9zbHInXSA9ICJTaG93IGNsdWIgc2NoZWR1bGUiOwokbGFuZ1snZm91cl93ZWVrc19hZ28nXSA9ICJmb3VyIHdlZWtzIGFnbyI7CiRsYW5nWyd0aHJlZV93ZWVrc19hZ28nXSA9ICJ0aHJlZSB3ZWVrcyBhZ28iOwokbGFuZ1sndHdvX3dlZWtzX2FnbyddID0gInR3byB3ZWVrcyBhZ28iOwokbGFuZ1snb25lX3dlZWtfYWdvJ10gPSAib25lIHdlZWsgYWdvIjsKJGxhbmdbJ25leHRfd2VlayddID0gIm5leHQgd2VlayI7CiRsYW5nWyduZXh0X3R3b193ZWVrcyddID0gIm5leHQgdHdvIHdlZWtzIjsKJGxhbmdbJ25leHRfdGhyZWVfd2Vla3MnXSA9ICJuZXh0IHRocmVlIHdlZWtzIjsKJGxhbmdbJ25leHRfZm91cl93ZWVrcyddID0gIm5leHQgZm91ciB3ZWVrcyI7CiRsYW5nWydjaGFuZ2Vsb2cnXSA9ICc8dWw+CjxsaT5WZXJzaW9uIDAuMC4xIC0gMi4gSmFudWFyIDIwMTIuIEZpcnN0IFJlbGVhc2UuPC9saT4KPGxpPlZlcnNpb24gMC4wLjIgLSAxOS4gQXByaWwgMjAxMi4gTm8gbmV3IGZlYXR1cmVzIGJ1dCBhZGRlZCB1c2VmdWxsIGRvY3VtZW50YXRpb24uPC9saT4KPGxpPlZlcnNpb24gMC4wLjMgLSAyNy4gQXByaWwgMjAxMi4gQ2hhbmdlZCBkb2N1bWVudGF0aW9uIGFuZCBhZGRlZCBwYXJhbWV0ZXIgc2hvd2xhdGVzdHJlc3VsdHMgYW5kIHRoZSBuZWNlc3NhcnkgdGVtcGxhdGVzPC9saT4KPGxpPlZlcnNpb24gMC4wLjQgLSAyOC4gQXByaWwgMjAxMi4gYWRkZWQgVGlueU1DRSBpbnRlZ3JhdGlvbjwvbGk+CjxsaT5WZXJzaW9uIDAuMC41IC0gMi4gU2VwdGVtYmVyIDIwMTIuIAogICAgICAgICAgICAgICAgICAgIDxici8+YWRkZWQgdGVhbSBzY2hlZHVsZSBvdXRwdXQgdXNpbmcgeGxzL3BkZi9pY3MgZm9ybWF0LgogICAgICAgICAgICAgICAgICAgIDxici8+TWFkZSBpdCBPbmVFbGV2ZW4gY29tcGF0aWJsZQogICAgICAgICAgICAgICAgICAgIDxici8+QWRkaW5nIGphdmEgc2NyaXB0IGNvZGUgdG8geW91ciB0ZW1wbGF0ZSBpcyBub3QgbmVjZXNzYXJ5IGFueW1vcmU8L2xpPgo8bGk+VmVyc2lvbiAwLjAuNiAtIDYuIFNlcHRlbWJlciAyMDEyLgoJCQkJIDxici8+UmVtb3ZlZCBwZGYgc3VwcG9ydCAoYmVjYXVzZSBvZiBmaWxlc2l6ZSBvZiB0aGUgbW9kdWxlKQoJCQkJIDxici8+Y2hhbmdlZCBtZXRob2QgZnJvbSBwb3N0IHRvIG1ldGhvZCBnZXQsIG90aGVyd2lzZSB0ZWFtdGFibGVzIGluIHhsc3t4fS9pY3Mgb25seSB3b3JrIG9uIG1haW4gcGFnZTwvbGk+CjxsaT5WZXJzaW9uIDAuMC43IC0gMTAuIFNlcHRlbWJlciAyMDEyCgkJCQk8YnIvPkFkZGVkIGFjdGlvbiBwYXJhbWV0ZXIgc2hvd3BsYXllcnJlc3VsdHMKCQkJCTxici8+Q2hhbmdlZCBjb21wbGV0ZXRlYW1pbmZvcm1hdGlvbiB0YWcgKGFkZGVkIHNob3dwbGF5ZXJyZXN1bHRzKTwvbGk+CjxsaT5WZXJzaW9uIDAuMC44IC0gMzAuIFNlcHRlbWJlciAyMDE0LgoJCQkJPGJyLz5GaXJzdCB2ZXJzaW9uIHRoYXQgc3VwcG9ydHMgMTIwIEJhbGwgc3lzdGVtPC9saT4KPGxpPlZlcnNpb24gMC4wLjkgLSAxNi4gQXVndXN0IDIwMTUuCgkJCQk8YnIvPlN0YXRpc3RpY3MgZm9yIDEyMCBCYWxsIHN5c3RlbSBhZGRlZCBmb3IgVGVhbXMgYW5kIFBsYXllcnM8L2xpPgo8L3VsPic7CiRsYW5nWydoZWxwJ10gPSAnPGgzPldoYXQgaXMgdGhlIGludGVudGlvbiBvZiBTa2l0dGxlIHJlc3VsdHM/PC9oMz4KPHA+VGhpcyBtb2R1bGUgY2FuIGJlIHVzZWQgdG8gbWFuYWdlIHRoZSByZXN1bHRzIG9mIHlvdXIgc2tpdHRsZXMgY2x1YiBhbmQgc2hvdyB0aGVuIG9uIHlvdXIgd2VicGFnZS4gWW91IGNhbiBtYW5hZ2UgeW91ciBwbGF5ZXJzLCB0ZWFtcyBhbmQgc2Vhc29ucy4gQWRkaXRpb25hbGx5IHRoZXJlIGV4aXN0cyB0aGUgcG9zc2liaWxpdHkgZm9yIHNob3dpbmcgc29tZSBzdGF0aXN0aWMgZGF0YS48L3A+CjxwPkl0IGlzIGFsc28gcG9zc2libGUgdG8gc2hvdyBvbmx5IG9uZSBza2l0dGxlIHJlc3VsdCBzaGVldC4gVXNpbmcgc3RhbmRhcmQgY29udGVudCBjYW4gdGhlcmVmb3JlIGJlIHVzZWQgdG8gZG8gY29tbWVudHMgb24gYSBnYW1lLiBJdCBvbmx5IGhhcyB0byBiZSBpbnNpZGUgdGhlIGRhdGFiYXNlIGFuZCB5b3UgY2FuIHB1dCB0aGUgY29udGVudCB3aGVyZXZlciB5b3Ugd2FudC48L3A+Cgo8aDM+SW5mb3JtYXRpb24gZm9yIGFkbWluaXN0cmF0b3JzIHRvIGludGVncmF0ZSB0aGUgU2tpdHRsZSByZXN1bHQgbW9kdWxlIGludG8gQ01TTWFkZVNpbXBsZTwvaDM+CjxwPkRlcHJlY2F0ZWQ6IFRvIHVzZSBhbGwgdGhlIHBvc3NpYmlsaXRlcyBvZiB0aGlzIG1vZHVsZSAoZXNwZWNpYWxseSB0aGUgYWN0aW9uPSJjb21wbGV0ZXRlYW1pbmZvcm1hdGlvbiIgaXQgaXMgbmVjZXNzYXJ5IHRvIHB1dCB0aGUgZm9sbG93aW5nIGNvZGUgdG8gdGhlIGhlYWRlciBvZiB5b3VyIHRlbXBsYXRlOjxici8+Cjxjb2RlPgpmdW5jdGlvbiBzZXRWaXNpYmlsaXR5KGlkLCB2aXNpYmlsaXR5KSB7PGJyLz4KJm5ic3A7aWRlbnRpdHk9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpOzxici8+CiZuYnNwO2lkZW50aXR5LnN0eWxlLmRpc3BsYXk9dmlzaWJpbGl0eTs8YnIvPgp9PGJyLz4KPC9jb2RlPgpUaGlzIGNvZGUgaXMgYWxzbyBjb250YWluZWQgaW5zaWRlIDxjb2RlPnRlbXBsYXRlPC9jb2RlPiBkaXJlY3RvcnkgaW4gdGhlIGZpbGUgPGNvZGU+a2VnZWxlcmdlYm5pc3NlLmpzPC9jb2RlPi4KPC9wPgo8cD5BZnRlciBJbnN0YWxsYXRpb24gaXQgaXMgbm90IG5lY2Vzc2FyeSB0byBpbnNlcnQgdGhpcyBKYXZhc2NyaXB0IGNvZGUgdG8geW91ciB0ZW1wbGF0ZS4gWW91IG1heSByZW1vdmUgdGhpcyBjb2RlIGZyb20gdGhlIHRlbXBsYXRlIGlmIHlvdSBoYXZlIHVzZWQgaXQgaW5zaWRlIGFuIGVhcmxpZXIgdmVyc2lvbi48L3A+Cgo8cD4KVG8gaW50ZWdyYXRlIGFsbCBmb3JtYXRzIGZvciByZXN1bHQgc2hlZXRzLCB0YWJsZXMgYW5kIGF2ZXJhZ2Ugc3RhdGlzdGljcyBpbnRvIENNU01hZGVTaW1wbGUgeW91IGhhdmUgdG8gaW1wb3J0IHRoZSBzdHlsZXNoZWV0IDxjb2RlPmtlZ2VsZXJnZWJuaXNzZS5jc3M8L2NvZGU+IHdoaWNoIGNhbiBhbHNvIGJlIGZvdW5kIGluc2lkZSB0aGUgdGVtcGxhdGUgZGlyZWN0b3J5IHVzaW5nIHRoZSBzdHlsZXNoZWV0IG1hbmFnZXIuIEFmdGVyd2FyZHMgeW91IGhhdmUgdG8gY29ubmVjdCB0aGUgc3R5bGVzaGVldCB0byBhbGwgeW91ciB0ZW1wbGF0ZXMgdXNlZCBmb3Igc2tpdHRsZSByZXN1bHQgdGFncy48L3A+Cgo8aDM+SG93IHdpbGwgdGhlIFNraXR0bGUgcmVzdWx0cyBtb2R1bGUgYmUgdXNlZD88L2gzPgo8cD5UaGUgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHdpdGggdGhlIGZvbGxvd2luZyBzbWFydHkgdGFnOiA8Y29kZT57Y21zX21vZHVsZSBtb2R1bGU9ImtlZ2VsZXJnZWJuaXNzZSJ9PC9jb2RlPjwvcD4KCjxoMz5XaGljaCBwYXJhbWV0ZXJzIGNhbiBiZSBnaXZlbiB0byB0aGUgbW9kdWxlPzwvaDM+CjxwPlRoZSBkaWZmZXJlbnQgcG9zc2liaWxpdGllcyB0aGUgbW9kdWxlIGlzIGFibGUgdG8gc2hvdyBpcyBkZXRlcm1pbmVkIGJ5IHRoZSA8Y29kZT5hY3Rpb248L2NvZGU+IHBhcmFtdGVyLi4gVGhlIGZvbGxvd2luZyBleGFtcGxlcyBzaG93IHRoZSB1c2FnZSBvZiBldmVyeSBwb3NzaWJsZSBhY3Rpb24gcGFyYW1ldGVyIHZhbHVlOgo8dWw+CiAgPGxpPjxjb2RlPmFjdGlvbj0iY29tcGxldGV0ZWFtaW5mb3JtYXRpb24iPC9jb2RlPjogSGVyZSBpcyBhbiBleGFtcGxlIHRvIHNob3cgdGhlIGNvbXBsZXRlIHRlYW0gaW5mb3JtYXRpb24gdGhlIHRoZSB0ZWFtICJUU1YgTGFobSBKdWdlbmQgQSAxIiBkdXJpbmcgc2Vhc29uICIyMDExLzIwMTIiOgogIDxici8+PGNvZGU+e2tlZ2VsZXJnZWJuaXNzZSBhY3Rpb249ImNvbXBsZXRldGVhbWluZm9ybWF0aW9uIiBzYWlzb249IjIwMTEvMjAxMiIgdGVhbT0iVFNWIExhaG0gSnVnZW5kIEEgMSJ9PC9jb2RlPjwvbGk+CiAgPGxpPjxjb2RlPmFjdGlvbj0ic2hvd3RlYW10YWJsZSI8L2NvZGU+OiBIZXJlIGlzIGFuIGV4YW1wbGUgdG8gc2hvdyB0aGUgc2NoZWR1bGUgb2YgdGhlIHRlYW0gIlRTViBMYWhtIEp1Z2VuZCBBIDEiIGR1cmluZyBzZWFzb24gIjIwMTEvMjAxMiI6CiAgPGJyLz48Y29kZT57a2VnZWxlcmdlYm5pc3NlIGFjdGlvbj0ic2hvd3RlYW10YWJsZSIgc2Fpc29uPSIyMDExLzIwMTIiIHRlYW09IlRTViBMYWhtIEp1Z2VuZCBBIDEifTwvY29kZT48L2xpPgogIDxsaT48Y29kZT5hY3Rpb249InNob3dnYW1lIjwvY29kZT46IEhlcmUgaXMgYW4gZXhhbXBsZSB0byBzaG93IHRoZSBzZWNvbmQgZ2FtZSBvZiB0aGUgdGVhbSAiVFNWIExhaG0gSnVnZW5kIEEgMSIgZHVyaW5nIHNlYXNvbiAiMjAxMS8yMDEyIjoKICA8YnIvPjxjb2RlPntrZWdlbGVyZ2Vibmlzc2UgYWN0aW9uPSJzaG93Z2FtZSIgc2Fpc29uPSIyMDExLzIwMTIiIHRlYW09IlRTViBMYWhtIEp1Z2VuZCBBIDEiIG51bWJlcj0iMiJ9PC9jb2RlPjwvbGk+CiAgPGxpPjxjb2RlPmFjdGlvbj0ic2hvd2F2ZXJhZ2V0ZWFtIjwvY29kZT4gSGVyZSBpcyBhbiBleGFtcGxlIHRvIHNob3cgdGhlIGF2ZXJhZ2Ugc3RhdGlzdGljcyBvZiB0aGUgdGVhbSAiVFNWIExhaG0gSnVnZW5kIEEgMSIgZHVyaW5nIHNlYXNvbiAiMjAxMS8yMDEyIjoKICA8YnIvPjxjb2RlPntrZWdlbGVyZ2Vibmlzc2UgYWN0aW9uPSJzaG93YXZlcmFnZXRlYW0iIHNhaXNvbj0iMjAxMS8yMDEyIiB0ZWFtPSJUU1YgTGFobSBKdWdlbmQgQSAxIn08L2NvZGU+PC9saT4KICA8bGk+PGNvZGU+YWN0aW9uPSJzaG93YXZlcmFnZXRlYW0xMjAiPC9jb2RlPiBIZXJlIGlzIGFuIGV4YW1wbGUgdG8gc2hvdyB0aGUgYXZlcmFnZSBzdGF0aXN0aWNzIG9mIHRoZSB0ZWFtICJUU1YgTGFobSBKdWdlbmQgQSAxIiBkdXJpbmcgc2Vhc29uICIyMDExLzIwMTIiIGluIDEyMCBiYWxsIHN5c3RlbToKICA8YnIvPjxjb2RlPntrZWdlbGVyZ2Vibmlzc2UgYWN0aW9uPSJzaG93YXZlcmFnZXRlYW0xMjAiIHNhaXNvbj0iMjAxMS8yMDEyIiB0ZWFtPSJUU1YgTGFobSBKdWdlbmQgQSAxIn08L2NvZGU+PC9saT4KICA8bGk+PGNvZGU+YWN0aW9uPSJzaG93bGF0ZXN0cmVzdWx0cyI8L2NvZGU+IEhlcmUgaXMgYW4gZXhhbXBsZSB0byBzaG93IHRoZSBsYXRlc3QgcmVzdWx0cyBvZiBhbGwgdGVhbSBkdXJpbmcgdGhlIGxhc3QgMTQgZGF5czoKICA8YnIvPjxjb2RlPntrZWdlbGVyZ2Vibmlzc2UgYWN0aW9uPSJzaG93bGF0ZXN0cmVzdWx0cyIgZGF5cz0iLTE0In08L2NvZGU+PC9saT4KICA8bGk+PGNvZGU+YWN0aW9uPSJ4bHN0ZWFtdGFibGUiPC9jb2RlPiBIZXJlIGlzIGFuIGV4YW1wbGUgdG8gc2hvdyB0aGUgdGVhbSBzY2hlZHVsZSBvZiAiVFNWIExhaG0gSnVnZW5kIEEgMSIgZHVyaW5nIHNlYXNvbiAiMjAxMS8yMDEyIiB1c2luZyBFeGNlbC0yMDA3IGZvcm1hdAogIDxici8+PGNvZGU+e2tlZ2VsZXJnZWJuaXNzZSBhY3Rpb249Inhsc3RlYW10YWJsZSIgc2Fpc29uPSIyMDExLzIwMTIiIHRlYW09IlRTViBMYWhtIEp1Z2VuZCBBMSIgbGlua3R5cGU9Inhsc3gifTwvY29kZT48L2xpPgogIDxsaT48Y29kZT5hY3Rpb249InNob3dwbGF5ZXJyZXN1bHRzIjwvY29kZT4gSGVyZSBpcyBhbiBleGFtcGxlIHRvIHNob3cgdGhlIGluZm9ybWF0aW9uIG9mIHBsYXllciAiR2VyYWxkIEx1dHRlciIgZHVyaW5nIHNlYXNvbiAiMjAxMS8yMDEyIiBhcyBtZW1iZXIgb2YgdGVhbSAiVFNWIExhaG0gSGVycmVuIDEiCiAgPGJyLz48Y29kZT57a2VnZWxlcmdlYm5pc3NlIGFjdGlvbj0ic2hvd3BsYXllcnJlc3VsdHMiIHNhaXNvbj0iMjAxMS8yMDEyIiB0ZWFtPSJUU1YgTGFobSBIZXJyZW4gMSJ9PC9jb2RlPjwvbGk+CiAgPGxpPjxjb2RlPmFjdGlvbj0ic2hvd3BsYXllcnJlc3VsdHMxMjAiPC9jb2RlPiBIZXJlIGlzIGFuIGV4YW1wbGUgdG8gc2hvdyB0aGUgaW5mb3JtYXRpb24gb2YgcGxheWVyICJHZXJhbGQgTHV0dGVyIiBkdXJpbmcgc2Vhc29uICIyMDExLzIwMTIiIGFzIG1lbWJlciBvZiB0ZWFtICJUU1YgTGFobSBIZXJyZW4gMSIgaW4gMTIwIGJhbGwgc3lzdGVtCiAgPGJyLz48Y29kZT57a2VnZWxlcmdlYm5pc3NlIGFjdGlvbj0ic2hvd3BsYXllcnJlc3VsdHMxMjAiIHNhaXNvbj0iMjAxMS8yMDEyIiB0ZWFtPSJUU1YgTGFobSBIZXJyZW4gMSJ9PC9jb2RlPjwvbGk+CjwvdWw+CjwvcD4KCjwvcD4KSWYgeW91IGhhdmUgaW5zdGFsbGVkIHRoZSBUaW55TUNFIGVkaXRvciwgdGhlbiB5b3Ugb25seSBoYXZlIHRvIGFjdGl2YXRlIHRoZSA8Y29kZT5rZWdlbGVyZ2Vibmlzc2VfaW5zZXJ0PC9jb2RlPiBwbHVnaW4gYW5kIGFkZCB0aGlzIHRhZyB0byB0aGUgYWRtaW4gcGFuZWwuCk5vdyBhIGJ1dHRvbiBzaG91bGQgYXBwZWFyIGluc2lkZSB0aGUgVGlueU1DRSBFZGl0b3Igd2hlcmUgeW91IGNhbiBpbnNlcnQgdGhlIGNvbnRlbnQgZGVzY3JpYmVkIGFib3ZlIGJ5IHNpbXBseSBjbGlja2luZyB0aGUgaXRlbXMgb2YgdGhlIGJ1dHRvbm1lbnUuCjwvcD4KCjxoMz5TdXBwb3J0PC9oMz4KPHA+QXMgcGVyIHRoZSBHUEwsIHRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYXMtaXMuIFBsZWFzZSByZWFkIHRoZSB0ZXh0IG9mIHRoZSBsaWNlbnNlIGZvciB0aGUgZnVsbCBkaXNjbGFpbWVyLjwvcD4KCjxoMz5Db3B5cmlnaHQgYW5kIExpY2Vuc2U8L2gzPgo8cD5Db3B5cmlnaHQgJmNvcHk7IDIwMTIsIEdlcmFsZCBMdXR0ZXIgPGEgaHJlZj0ibWFpbHRvOmdlcmFsZEBpdHpncnVuZC5uZXQiPiZsdDtnZXJhbGRAaXR6Z3J1bmQubmV0Jmd0OzwvYT4uIEFsbCBSaWdodHMgQXJlIFJlc2VydmVkLjwvcD4KPHA+VGhpcyBtb2R1bGUgaGFzIGJlZW4gcmVsZWFzZWQgdW5kZXIgdGhlIDxhIGhyZWY9Imh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9saWNlbnNlcy5odG1sI0dQTCI+R05VIFB1YmxpYyBMaWNlbnNlPC9hPi4gWW91IG11c3QgYWdyZWUgdG8gdGhpcyBsaWNlbnNlIGJlZm9yZSB1c2luZyB0aGUgbW9kdWxlLjwvcD4KPHA+VGhpcyBtb2R1bGUgdXNlcyB0aGUgUEhQRXhjZWwgbGlicmFyeSBhdmFpbGFibGUgZnJvbSA8YSBocmVmPSJodHRwOi8vcGhwZXhjZWwuY29kZXBsZXguY29tIj5odHRwOi8vcGhwZXhjZWwuY29kZXBsZXguY29tPC9hPi4gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZQo8YSBocmVmPSJodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvb2xkLWxpY2Vuc2VzL2xncGwtMi4xIj5MZXNzZXIgR05VIFB1YmxpYyBMaWNlbnNlIC0gMi4xPC9hPi4gWW91IGhhdmUgdG8gYWdyZWUgdG8gdGhpcyBsaWNlbnNlIGlmIHlvdSB3YW50IHRvIHVzZSB0aGUgeGxzIGV4cG9ydApmdW5jdGlvbnMgb2YgdGhpcyBtb2R1bGUuPC9wPic7Cj8+Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/Classes/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIFBIUEV4Y2VsCiAqCiAqIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICoKICogQGNhdGVnb3J5ICAgUEhQRXhjZWwKICogQHBhY2thZ2UgICAgUEhQRXhjZWwKICogQGNvcHlyaWdodCAgQ29weXJpZ2h0IChjKSAyMDA2IC0gMjAxMiBQSFBFeGNlbCAoaHR0cDovL3d3dy5jb2RlcGxleC5jb20vUEhQRXhjZWwpCiAqIEBsaWNlbnNlICAgIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9vbGQtbGljZW5zZXMvbGdwbC0yLjEudHh0CUxHUEwKICogQHZlcnNpb24gICAgMS43LjcsIDIwMTItMDUtMTkKICovCgoKLyoqIFBIUEV4Y2VsIHJvb3QgZGlyZWN0b3J5ICovCmlmICghZGVmaW5lZCgnUEhQRVhDRUxfUk9PVCcpKSB7CglkZWZpbmUoJ1BIUEVYQ0VMX1JPT1QnLCBkaXJuYW1lKF9fRklMRV9fKSAuICcvJyk7CglyZXF1aXJlKFBIUEVYQ0VMX1JPT1QgLiAnUEhQRXhjZWwvQXV0b2xvYWRlci5waHAnKTsKfQoKCi8qKgogKiBQSFBFeGNlbAogKgogKiBAY2F0ZWdvcnkgICBQSFBFeGNlbAogKiBAcGFja2FnZSAgICBQSFBFeGNlbAogKiBAY29weXJpZ2h0ICBDb3B5cmlnaHQgKGMpIDIwMDYgLSAyMDEyIFBIUEV4Y2VsIChodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9QSFBFeGNlbCkKICovCmNsYXNzIFBIUEV4Y2VsCnsKCS8qKgoJICogRG9jdW1lbnQgcHJvcGVydGllcwoJICoKCSAqIEB2YXIgUEhQRXhjZWxfRG9jdW1lbnRQcm9wZXJ0aWVzCgkgKi8KCXByaXZhdGUgJF9wcm9wZXJ0aWVzOwoKCS8qKgoJICogRG9jdW1lbnQgc2VjdXJpdHkKCSAqCgkgKiBAdmFyIFBIUEV4Y2VsX0RvY3VtZW50U2VjdXJpdHkKCSAqLwoJcHJpdmF0ZSAkX3NlY3VyaXR5OwoKCS8qKgoJICogQ29sbGVjdGlvbiBvZiBXb3Jrc2hlZXQgb2JqZWN0cwoJICoKCSAqIEB2YXIgUEhQRXhjZWxfV29ya3NoZWV0W10KCSAqLwoJcHJpdmF0ZSAkX3dvcmtTaGVldENvbGxlY3Rpb24gPSBhcnJheSgpOwoKCS8qKgoJICogQWN0aXZlIHNoZWV0IGluZGV4CgkgKgoJICogQHZhciBpbnQKCSAqLwoJcHJpdmF0ZSAkX2FjdGl2ZVNoZWV0SW5kZXggPSAwOwoKCS8qKgoJICogTmFtZWQgcmFuZ2VzCgkgKgoJICogQHZhciBQSFBFeGNlbF9OYW1lZFJhbmdlW10KCSAqLwoJcHJpdmF0ZSAkX25hbWVkUmFuZ2VzID0gYXJyYXkoKTsKCgkvKioKCSAqIENlbGxYZiBzdXBlcnZpc29yCgkgKgoJICogQHZhciBQSFBFeGNlbF9TdHlsZQoJICovCglwcml2YXRlICRfY2VsbFhmU3VwZXJ2aXNvcjsKCgkvKioKCSAqIENlbGxYZiBjb2xsZWN0aW9uCgkgKgoJICogQHZhciBQSFBFeGNlbF9TdHlsZVtdCgkgKi8KCXByaXZhdGUgJF9jZWxsWGZDb2xsZWN0aW9uID0gYXJyYXkoKTsKCgkvKioKCSAqIENlbGxTdHlsZVhmIGNvbGxlY3Rpb24KCSAqCgkgKiBAdmFyIFBIUEV4Y2VsX1N0eWxlW10KCSAqLwoJcHJpdmF0ZSAkX2NlbGxTdHlsZVhmQ29sbGVjdGlvbiA9IGFycmF5KCk7CgoJLyoqCgkgKiBDcmVhdGUgYSBuZXcgUEhQRXhjZWwgd2l0aCBvbmUgV29ya3NoZWV0CgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgpCgl7CgkJLy8gSW5pdGlhbGlzZSB3b3Jrc2hlZXQgY29sbGVjdGlvbiBhbmQgYWRkIG9uZSB3b3Jrc2hlZXQKCQkkdGhpcy0+X3dvcmtTaGVldENvbGxlY3Rpb24gPSBhcnJheSgpOwoJCSR0aGlzLT5fd29ya1NoZWV0Q29sbGVjdGlvbltdID0gbmV3IFBIUEV4Y2VsX1dvcmtzaGVldCgkdGhpcyk7CgkJJHRoaXMtPl9hY3RpdmVTaGVldEluZGV4ID0gMDsKCgkJLy8gQ3JlYXRlIGRvY3VtZW50IHByb3BlcnRpZXMKCQkkdGhpcy0+X3Byb3BlcnRpZXMgPSBuZXcgUEhQRXhjZWxfRG9jdW1lbnRQcm9wZXJ0aWVzKCk7CgoJCS8vIENyZWF0ZSBkb2N1bWVudCBzZWN1cml0eQoJCSR0aGlzLT5fc2VjdXJpdHkgPSBuZXcgUEhQRXhjZWxfRG9jdW1lbnRTZWN1cml0eSgpOwoKCQkvLyBTZXQgbmFtZWQgcmFuZ2VzCgkJJHRoaXMtPl9uYW1lZFJhbmdlcyA9IGFycmF5KCk7CgoJCS8vIENyZWF0ZSB0aGUgY2VsbFhmIHN1cGVydmlzb3IKCQkkdGhpcy0+X2NlbGxYZlN1cGVydmlzb3IgPSBuZXcgUEhQRXhjZWxfU3R5bGUodHJ1ZSk7CgkJJHRoaXMtPl9jZWxsWGZTdXBlcnZpc29yLT5iaW5kUGFyZW50KCR0aGlzKTsKCgkJLy8gQ3JlYXRlIHRoZSBkZWZhdWx0IHN0eWxlCgkJJHRoaXMtPmFkZENlbGxYZihuZXcgUEhQRXhjZWxfU3R5bGUpOwoJCSR0aGlzLT5hZGRDZWxsU3R5bGVYZihuZXcgUEhQRXhjZWxfU3R5bGUpOwoJfQoKCgkvKioKCSAqIERpc2Nvbm5lY3QgYWxsIHdvcmtzaGVldHMgZnJvbSB0aGlzIFBIUEV4Y2VsIHdvcmtib29rIG9iamVjdCwKCSAqICAgIHR5cGljYWxseSBzbyB0aGF0IHRoZSBQSFBFeGNlbCBvYmplY3QgY2FuIGJlIHVuc2V0CgkgKgoJICovCglwdWJsaWMgZnVuY3Rpb24gZGlzY29ubmVjdFdvcmtzaGVldHMoKSB7CgkJZm9yZWFjaCgkdGhpcy0+X3dvcmtTaGVldENvbGxlY3Rpb24gYXMgJGsgPT4gJiR3b3Jrc2hlZXQpIHsKCQkJJHdvcmtzaGVldC0+ZGlzY29ubmVjdENlbGxzKCk7CgkJCSR0aGlzLT5fd29ya1NoZWV0Q29sbGVjdGlvblska10gPSBudWxsOwoJCX0KCQl1bnNldCgkd29ya3NoZWV0KTsKCQkkdGhpcy0+X3dvcmtTaGVldENvbGxlY3Rpb24gPSBhcnJheSgpOwoJfQoKCS8qKgoJICogR2V0IHByb3BlcnRpZXMKCSAqCgkgKiBAcmV0dXJuIFBIUEV4Y2VsX0RvY3VtZW50UHJvcGVydGllcwoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0UHJvcGVydGllcygpCgl7CgkJcmV0dXJuICR0aGlzLT5fcHJvcGVydGllczsKCX0KCgkvKioKCSAqIFNldCBwcm9wZXJ0aWVzCgkgKgoJICogQHBhcmFtIFBIUEV4Y2VsX0RvY3VtZW50UHJvcGVydGllcwkkcFZhbHVlCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBzZXRQcm9wZXJ0aWVzKFBIUEV4Y2VsX0RvY3VtZW50UHJvcGVydGllcyAkcFZhbHVlKQoJewoJCSR0aGlzLT5fcHJvcGVydGllcyA9ICRwVmFsdWU7Cgl9CgoJLyoqCgkgKiBHZXQgc2VjdXJpdHkKCSAqCgkgKiBAcmV0dXJuIFBIUEV4Y2VsX0RvY3VtZW50U2VjdXJpdHkKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldFNlY3VyaXR5KCkKCXsKCQlyZXR1cm4gJHRoaXMtPl9zZWN1cml0eTsKCX0KCgkvKioKCSAqIFNldCBzZWN1cml0eQoJICoKCSAqIEBwYXJhbSBQSFBFeGNlbF9Eb2N1bWVudFNlY3VyaXR5CSRwVmFsdWUKCSAqLwoJcHVibGljIGZ1bmN0aW9uIHNldFNlY3VyaXR5KFBIUEV4Y2VsX0RvY3VtZW50U2VjdXJpdHkgJHBWYWx1ZSkKCXsKCQkkdGhpcy0+X3NlY3VyaXR5ID0gJHBWYWx1ZTsKCX0KCgkvKioKCSAqIEdldCBhY3RpdmUgc2hlZXQKCSAqCgkgKiBAcmV0dXJuIFBIUEV4Y2VsX1dvcmtzaGVldAoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0QWN0aXZlU2hlZXQoKQoJewoJCXJldHVybiAkdGhpcy0+X3dvcmtTaGVldENvbGxlY3Rpb25bJHRoaXMtPl9hY3RpdmVTaGVldEluZGV4XTsKCX0KCiAgICAvKioKICAgICAqIENyZWF0ZSBzaGVldCBhbmQgYWRkIGl0IHRvIHRoaXMgd29ya2Jvb2sKICAgICAqCgkgKiBAcGFyYW0gaW50fG51bGwgJGlTaGVldEluZGV4IEluZGV4IHdoZXJlIHNoZWV0IHNob3VsZCBnbyAoMCwxLC4uLiwgb3IgbnVsbCBmb3IgbGFzdCkKICAgICAqIEByZXR1cm4gUEhQRXhjZWxfV29ya3NoZWV0CiAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gY3JlYXRlU2hlZXQoJGlTaGVldEluZGV4ID0gbnVsbCkKICAgIHsKICAgICAgICAkbmV3U2hlZXQgPSBuZXcgUEhQRXhjZWxfV29ya3NoZWV0KCR0aGlzKTsKICAgICAgICAkdGhpcy0+YWRkU2hlZXQoJG5ld1NoZWV0LCAkaVNoZWV0SW5kZXgpOwogICAgICAgIHJldHVybiAkbmV3U2hlZXQ7CiAgICB9CgogICAgLyoqCiAgICAgKiBBZGQgc2hlZXQKICAgICAqCiAgICAgKiBAcGFyYW0gUEhQRXhjZWxfV29ya3NoZWV0ICRwU2hlZXQKCSAqIEBwYXJhbSBpbnR8bnVsbCAkaVNoZWV0SW5kZXggSW5kZXggd2hlcmUgc2hlZXQgc2hvdWxkIGdvICgwLDEsLi4uLCBvciBudWxsIGZvciBsYXN0KQogICAgICogQHJldHVybiBQSFBFeGNlbF9Xb3Jrc2hlZXQKICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBhZGRTaGVldChQSFBFeGNlbF9Xb3Jrc2hlZXQgJHBTaGVldCA9IG51bGwsICRpU2hlZXRJbmRleCA9IG51bGwpCiAgICB7CiAgICAgICAgaWYoJGlTaGVldEluZGV4ID09PSBOVUxMKSB7CiAgICAgICAgICAgICR0aGlzLT5fd29ya1NoZWV0Q29sbGVjdGlvbltdID0gJHBTaGVldDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAvLyBJbnNlcnQgdGhlIHNoZWV0IGF0IHRoZSByZXF1ZXN0ZWQgaW5kZXgKICAgICAgICAgICAgYXJyYXlfc3BsaWNlKAogICAgICAgICAgICAgICAgJHRoaXMtPl93b3JrU2hlZXRDb2xsZWN0aW9uLAogICAgICAgICAgICAgICAgJGlTaGVldEluZGV4LAogICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgIGFycmF5KCRwU2hlZXQpCiAgICAgICAgICAgICAgICApOwoKCQkJLy8gQWRqdXN0IGFjdGl2ZSBzaGVldCBpbmRleCBpZiBuZWNlc3NhcnkKCQkJaWYgKCR0aGlzLT5fYWN0aXZlU2hlZXRJbmRleCA+PSAkaVNoZWV0SW5kZXgpIHsKCQkJCSsrJHRoaXMtPl9hY3RpdmVTaGVldEluZGV4OwoJCQl9CiAgICAgICAgfQoJCXJldHVybiAkcFNoZWV0OwogICAgfQoKCS8qKgoJICogUmVtb3ZlIHNoZWV0IGJ5IGluZGV4CgkgKgoJICogQHBhcmFtIGludCAkcEluZGV4IEFjdGl2ZSBzaGVldCBpbmRleAoJICogQHRocm93cyBFeGNlcHRpb24KCSAqLwoJcHVibGljIGZ1bmN0aW9uIHJlbW92ZVNoZWV0QnlJbmRleCgkcEluZGV4ID0gMCkKCXsKCQlpZiAoJHBJbmRleCA+IGNvdW50KCR0aGlzLT5fd29ya1NoZWV0Q29sbGVjdGlvbikgLSAxKSB7CgkJCXRocm93IG5ldyBFeGNlcHRpb24oIlNoZWV0IGluZGV4IGlzIG91dCBvZiBib3VuZHMuIik7CgkJfSBlbHNlIHsKCQkJYXJyYXlfc3BsaWNlKCR0aGlzLT5fd29ya1NoZWV0Q29sbGVjdGlvbiwgJHBJbmRleCwgMSk7CgkJfQoJCS8vIEFkanVzdCBhY3RpdmUgc2hlZXQgaW5kZXggaWYgbmVjZXNzYXJ5CgkJaWYgKCgkdGhpcy0+X2FjdGl2ZVNoZWV0SW5kZXggPj0gJHBJbmRleCkgJiYKCQkJKCRwSW5kZXggPiBjb3VudCgkdGhpcy0+X3dvcmtTaGVldENvbGxlY3Rpb24pIC0gMSkpIHsKCQkJLS0kdGhpcy0+X2FjdGl2ZVNoZWV0SW5kZXg7CgkJfQoKCX0KCgkvKioKCSAqIEdldCBzaGVldCBieSBpbmRleAoJICoKCSAqIEBwYXJhbSBpbnQgJHBJbmRleCBTaGVldCBpbmRleAoJICogQHJldHVybiBQSFBFeGNlbF9Xb3Jrc2hlZXQKCSAqIEB0aHJvd3MgRXhjZXB0aW9uCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRTaGVldCgkcEluZGV4ID0gMCkKCXsKCQlpZiAoJHBJbmRleCA+IGNvdW50KCR0aGlzLT5fd29ya1NoZWV0Q29sbGVjdGlvbikgLSAxKSB7CgkJCXRocm93IG5ldyBFeGNlcHRpb24oIlNoZWV0IGluZGV4IGlzIG91dCBvZiBib3VuZHMuIik7CgkJfSBlbHNlIHsKCQkJcmV0dXJuICR0aGlzLT5fd29ya1NoZWV0Q29sbGVjdGlvblskcEluZGV4XTsKCQl9Cgl9CgoJLyoqCgkgKiBHZXQgYWxsIHNoZWV0cwoJICoKCSAqIEByZXR1cm4gUEhQRXhjZWxfV29ya3NoZWV0W10KCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldEFsbFNoZWV0cygpCgl7CgkJcmV0dXJuICR0aGlzLT5fd29ya1NoZWV0Q29sbGVjdGlvbjsKCX0KCgkvKioKCSAqIEdldCBzaGVldCBieSBuYW1lCgkgKgoJICogQHBhcmFtIHN0cmluZyAkcE5hbWUgU2hlZXQgbmFtZQoJICogQHJldHVybiBQSFBFeGNlbF9Xb3Jrc2hlZXQKCSAqIEB0aHJvd3MgRXhjZXB0aW9uCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRTaGVldEJ5TmFtZSgkcE5hbWUgPSAnJykKCXsKCQkkd29ya3NoZWV0Q291bnQgPSBjb3VudCgkdGhpcy0+X3dvcmtTaGVldENvbGxlY3Rpb24pOwoJCWZvciAoJGkgPSAwOyAkaSA8ICR3b3Jrc2hlZXRDb3VudDsgKyskaSkgewoJCQlpZiAoJHRoaXMtPl93b3JrU2hlZXRDb2xsZWN0aW9uWyRpXS0+Z2V0VGl0bGUoKSA9PSAkcE5hbWUpIHsKCQkJCXJldHVybiAkdGhpcy0+X3dvcmtTaGVldENvbGxlY3Rpb25bJGldOwoJCQl9CgkJfQoKCQlyZXR1cm4gbnVsbDsKCX0KCgkvKioKCSAqIEdldCBpbmRleCBmb3Igc2hlZXQKCSAqCgkgKiBAcGFyYW0gUEhQRXhjZWxfV29ya3NoZWV0ICRwU2hlZXQKCSAqIEByZXR1cm4gU2hlZXQgaW5kZXgKCSAqIEB0aHJvd3MgRXhjZXB0aW9uCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRJbmRleChQSFBFeGNlbF9Xb3Jrc2hlZXQgJHBTaGVldCkKCXsKCQlmb3JlYWNoICgkdGhpcy0+X3dvcmtTaGVldENvbGxlY3Rpb24gYXMgJGtleSA9PiAkdmFsdWUpIHsKCQkJaWYgKCR2YWx1ZS0+Z2V0SGFzaENvZGUoKSA9PSAkcFNoZWV0LT5nZXRIYXNoQ29kZSgpKSB7CgkJCQlyZXR1cm4gJGtleTsKCQkJfQoJCX0KCX0KCiAgICAvKioKCSAqIFNldCBpbmRleCBmb3Igc2hlZXQgYnkgc2hlZXQgbmFtZS4KCSAqCgkgKiBAcGFyYW0gc3RyaW5nICRzaGVldE5hbWUgU2hlZXQgbmFtZSB0byBtb2RpZnkgaW5kZXggZm9yCgkgKiBAcGFyYW0gaW50ICRuZXdJbmRleCBOZXcgaW5kZXggZm9yIHRoZSBzaGVldAoJICogQHJldHVybiBOZXcgc2hlZXQgaW5kZXgKCSAqIEB0aHJvd3MgRXhjZXB0aW9uCgkgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBzZXRJbmRleEJ5TmFtZSgkc2hlZXROYW1lLCAkbmV3SW5kZXgpCiAgICB7CiAgICAgICAgJG9sZEluZGV4ID0gJHRoaXMtPmdldEluZGV4KCR0aGlzLT5nZXRTaGVldEJ5TmFtZSgkc2hlZXROYW1lKSk7CiAgICAgICAgJHBTaGVldCA9IGFycmF5X3NwbGljZSgKICAgICAgICAgICAgJHRoaXMtPl93b3JrU2hlZXRDb2xsZWN0aW9uLAogICAgICAgICAgICAkb2xkSW5kZXgsCiAgICAgICAgICAgIDEKICAgICAgICAgICAgKTsKICAgICAgICBhcnJheV9zcGxpY2UoCiAgICAgICAgICAgICR0aGlzLT5fd29ya1NoZWV0Q29sbGVjdGlvbiwKICAgICAgICAgICAgJG5ld0luZGV4LAogICAgICAgICAgICAwLAogICAgICAgICAgICAkcFNoZWV0CiAgICAgICAgICAgICk7CiAgICAgICAgcmV0dXJuICRuZXdJbmRleDsKICAgIH0KCgkvKioKCSAqIEdldCBzaGVldCBjb3VudAoJICoKCSAqIEByZXR1cm4gaW50CgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRTaGVldENvdW50KCkKCXsKCQlyZXR1cm4gY291bnQoJHRoaXMtPl93b3JrU2hlZXRDb2xsZWN0aW9uKTsKCX0KCgkvKioKCSAqIEdldCBhY3RpdmUgc2hlZXQgaW5kZXgKCSAqCgkgKiBAcmV0dXJuIGludCBBY3RpdmUgc2hlZXQgaW5kZXgKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldEFjdGl2ZVNoZWV0SW5kZXgoKQoJewoJCXJldHVybiAkdGhpcy0+X2FjdGl2ZVNoZWV0SW5kZXg7Cgl9CgoJLyoqCgkgKiBTZXQgYWN0aXZlIHNoZWV0IGluZGV4CgkgKgoJICogQHBhcmFtIGludCAkcEluZGV4IEFjdGl2ZSBzaGVldCBpbmRleAoJICogQHRocm93cyBFeGNlcHRpb24KCSAqIEByZXR1cm4gUEhQRXhjZWxfV29ya3NoZWV0CgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBzZXRBY3RpdmVTaGVldEluZGV4KCRwSW5kZXggPSAwKQoJewoJCWlmICgkcEluZGV4ID4gY291bnQoJHRoaXMtPl93b3JrU2hlZXRDb2xsZWN0aW9uKSAtIDEpIHsKCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbigiQWN0aXZlIHNoZWV0IGluZGV4IGlzIG91dCBvZiBib3VuZHMuIik7CgkJfSBlbHNlIHsKCQkJJHRoaXMtPl9hY3RpdmVTaGVldEluZGV4ID0gJHBJbmRleDsKCQl9CgkJcmV0dXJuICR0aGlzLT5nZXRBY3RpdmVTaGVldCgpOwoJfQoKCS8qKgoJICogU2V0IGFjdGl2ZSBzaGVldCBpbmRleCBieSBuYW1lCgkgKgoJICogQHBhcmFtIHN0cmluZyAkcFZhbHVlIFNoZWV0IHRpdGxlCgkgKiBAcmV0dXJuIFBIUEV4Y2VsX1dvcmtzaGVldAoJICogQHRocm93cyBFeGNlcHRpb24KCSAqLwoJcHVibGljIGZ1bmN0aW9uIHNldEFjdGl2ZVNoZWV0SW5kZXhCeU5hbWUoJHBWYWx1ZSA9ICcnKQoJewoJCWlmICgoJHdvcmtzaGVldCA9ICR0aGlzLT5nZXRTaGVldEJ5TmFtZSgkcFZhbHVlKSkgaW5zdGFuY2VvZiBQSFBFeGNlbF9Xb3Jrc2hlZXQpIHsKCQkJJHRoaXMtPnNldEFjdGl2ZVNoZWV0SW5kZXgoJHRoaXMtPmdldEluZGV4KCR3b3Jrc2hlZXQpKTsKCQkJcmV0dXJuICR3b3Jrc2hlZXQ7CgkJfQoKCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCdXb3JrYm9vayBkb2VzIG5vdCBjb250YWluIHNoZWV0OicgLiAkcFZhbHVlKTsKCX0KCgkvKioKCSAqIEdldCBzaGVldCBuYW1lcwoJICoKCSAqIEByZXR1cm4gc3RyaW5nW10KCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldFNoZWV0TmFtZXMoKQoJewoJCSRyZXR1cm5WYWx1ZSA9IGFycmF5KCk7CgkJJHdvcmtzaGVldENvdW50ID0gJHRoaXMtPmdldFNoZWV0Q291bnQoKTsKCQlmb3IgKCRpID0gMDsgJGkgPCAkd29ya3NoZWV0Q291bnQ7ICsrJGkpIHsKCQkJJHJldHVyblZhbHVlW10gPSAkdGhpcy0+Z2V0U2hlZXQoJGkpLT5nZXRUaXRsZSgpOwoJCX0KCgkJcmV0dXJuICRyZXR1cm5WYWx1ZTsKCX0KCgkvKioKCSAqIEFkZCBleHRlcm5hbCBzaGVldAoJICoKCSAqIEBwYXJhbSBQSFBFeGNlbF9Xb3Jrc2hlZXQgJHBTaGVldCBFeHRlcm5hbCBzaGVldCB0byBhZGQKCSAqIEBwYXJhbSBpbnR8bnVsbCAkaVNoZWV0SW5kZXggSW5kZXggd2hlcmUgc2hlZXQgc2hvdWxkIGdvICgwLDEsLi4uLCBvciBudWxsIGZvciBsYXN0KQoJICogQHRocm93cyBFeGNlcHRpb24KCSAqIEByZXR1cm4gUEhQRXhjZWxfV29ya3NoZWV0CgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBhZGRFeHRlcm5hbFNoZWV0KFBIUEV4Y2VsX1dvcmtzaGVldCAkcFNoZWV0LCAkaVNoZWV0SW5kZXggPSBudWxsKSB7CgkJaWYgKCR0aGlzLT5nZXRTaGVldEJ5TmFtZSgkcFNoZWV0LT5nZXRUaXRsZSgpKSAhPT0gTlVMTCkgewoJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCJXb3JrYm9vayBhbHJlYWR5IGNvbnRhaW5zIGEgd29ya3NoZWV0IG5hbWVkICd7JHBTaGVldC0+Z2V0VGl0bGUoKX0nLiBSZW5hbWUgdGhlIGV4dGVybmFsIHNoZWV0IGZpcnN0LiIpOwoJCX0KCgkJLy8gY291bnQgaG93IG1hbnkgY2VsbFhmcyB0aGVyZSBhcmUgaW4gdGhpcyB3b3JrYm9vayBjdXJyZW50bHksIHdlIHdpbGwgbmVlZCB0aGlzIGJlbG93CgkJJGNvdW50Q2VsbFhmcyA9IGNvdW50KCR0aGlzLT5fY2VsbFhmQ29sbGVjdGlvbik7CgoJCS8vIGNvcHkgYWxsIHRoZSBzaGFyZWQgY2VsbFhmcyBmcm9tIHRoZSBleHRlcm5hbCB3b3JrYm9vayBhbmQgYXBwZW5kIHRoZW0gdG8gdGhlIGN1cnJlbnQKCQlmb3JlYWNoICgkcFNoZWV0LT5nZXRQYXJlbnQoKS0+Z2V0Q2VsbFhmQ29sbGVjdGlvbigpIGFzICRjZWxsWGYpIHsKCQkJJHRoaXMtPmFkZENlbGxYZihjbG9uZSAkY2VsbFhmKTsKCQl9CgoJCS8vIG1vdmUgc2hlZXQgdG8gdGhpcyB3b3JrYm9vawoJCSRwU2hlZXQtPnJlYmluZFBhcmVudCgkdGhpcyk7CgoJCS8vIHVwZGF0ZSB0aGUgY2VsbFhmcwoJCWZvcmVhY2ggKCRwU2hlZXQtPmdldENlbGxDb2xsZWN0aW9uKGZhbHNlKSBhcyAkY2VsbElEKSB7CgkJCSRjZWxsID0gJHBTaGVldC0+Z2V0Q2VsbCgkY2VsbElEKTsKCQkJJGNlbGwtPnNldFhmSW5kZXgoICRjZWxsLT5nZXRYZkluZGV4KCkgKyAkY291bnRDZWxsWGZzICk7CgkJfQoKCQlyZXR1cm4gJHRoaXMtPmFkZFNoZWV0KCRwU2hlZXQsICRpU2hlZXRJbmRleCk7Cgl9CgoJLyoqCgkgKiBHZXQgbmFtZWQgcmFuZ2VzCgkgKgoJICogQHJldHVybiBQSFBFeGNlbF9OYW1lZFJhbmdlW10KCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldE5hbWVkUmFuZ2VzKCkgewoJCXJldHVybiAkdGhpcy0+X25hbWVkUmFuZ2VzOwoJfQoKCS8qKgoJICogQWRkIG5hbWVkIHJhbmdlCgkgKgoJICogQHBhcmFtIFBIUEV4Y2VsX05hbWVkUmFuZ2UgJG5hbWVkUmFuZ2UKCSAqIEByZXR1cm4gUEhQRXhjZWwKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGFkZE5hbWVkUmFuZ2UoUEhQRXhjZWxfTmFtZWRSYW5nZSAkbmFtZWRSYW5nZSkgewoJCWlmICgkbmFtZWRSYW5nZS0+Z2V0U2NvcGUoKSA9PSBudWxsKSB7CgkJCS8vIGdsb2JhbCBzY29wZQoJCQkkdGhpcy0+X25hbWVkUmFuZ2VzWyRuYW1lZFJhbmdlLT5nZXROYW1lKCldID0gJG5hbWVkUmFuZ2U7CgkJfSBlbHNlIHsKCQkJLy8gbG9jYWwgc2NvcGUKCQkJJHRoaXMtPl9uYW1lZFJhbmdlc1skbmFtZWRSYW5nZS0+Z2V0U2NvcGUoKS0+Z2V0VGl0bGUoKS4nIScuJG5hbWVkUmFuZ2UtPmdldE5hbWUoKV0gPSAkbmFtZWRSYW5nZTsKCQl9CgkJcmV0dXJuIHRydWU7Cgl9CgoJLyoqCgkgKiBHZXQgbmFtZWQgcmFuZ2UKCSAqCgkgKiBAcGFyYW0gc3RyaW5nICRuYW1lZFJhbmdlCgkgKiBAcGFyYW0gUEhQRXhjZWxfV29ya3NoZWV0fG51bGwgJHBTaGVldCBTY29wZS4gVXNlIG51bGwgZm9yIGdsb2JhbCBzY29wZQoJICogQHJldHVybiBQSFBFeGNlbF9OYW1lZFJhbmdlfG51bGwKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldE5hbWVkUmFuZ2UoJG5hbWVkUmFuZ2UsIFBIUEV4Y2VsX1dvcmtzaGVldCAkcFNoZWV0ID0gbnVsbCkgewoJCSRyZXR1cm5WYWx1ZSA9IG51bGw7CgoJCWlmICgkbmFtZWRSYW5nZSAhPSAnJyAmJiAoJG5hbWVkUmFuZ2UgIT09IE5VTEwpKSB7CgkJCS8vIGZpcnN0IGxvb2sgZm9yIGdsb2JhbCBkZWZpbmVkIG5hbWUKCQkJaWYgKGlzc2V0KCR0aGlzLT5fbmFtZWRSYW5nZXNbJG5hbWVkUmFuZ2VdKSkgewoJCQkJJHJldHVyblZhbHVlID0gJHRoaXMtPl9uYW1lZFJhbmdlc1skbmFtZWRSYW5nZV07CgkJCX0KCgkJCS8vIHRoZW4gbG9vayBmb3IgbG9jYWwgZGVmaW5lZCBuYW1lIChoYXMgcHJpb3JpdHkgb3ZlciBnbG9iYWwgZGVmaW5lZCBuYW1lIGlmIGJvdGggbmFtZXMgZXhpc3QpCgkJCWlmICgoJHBTaGVldCAhPT0gTlVMTCkgJiYgaXNzZXQoJHRoaXMtPl9uYW1lZFJhbmdlc1skcFNoZWV0LT5nZXRUaXRsZSgpIC4gJyEnIC4gJG5hbWVkUmFuZ2VdKSkgewoJCQkJJHJldHVyblZhbHVlID0gJHRoaXMtPl9uYW1lZFJhbmdlc1skcFNoZWV0LT5nZXRUaXRsZSgpIC4gJyEnIC4gJG5hbWVkUmFuZ2VdOwoJCQl9CgkJfQoKCQlyZXR1cm4gJHJldHVyblZhbHVlOwoJfQoKCS8qKgoJICogUmVtb3ZlIG5hbWVkIHJhbmdlCgkgKgoJICogQHBhcmFtICBzdHJpbmcgICRuYW1lZFJhbmdlCgkgKiBAcGFyYW0gIFBIUEV4Y2VsX1dvcmtzaGVldHxudWxsICAkcFNoZWV0ICBTY29wZTogdXNlIG51bGwgZm9yIGdsb2JhbCBzY29wZS4KCSAqIEByZXR1cm4gUEhQRXhjZWwKCSAqLwoJcHVibGljIGZ1bmN0aW9uIHJlbW92ZU5hbWVkUmFuZ2UoJG5hbWVkUmFuZ2UsIFBIUEV4Y2VsX1dvcmtzaGVldCAkcFNoZWV0ID0gbnVsbCkgewoJCWlmICgkcFNoZWV0ID09PSBOVUxMKSB7CgkJCWlmIChpc3NldCgkdGhpcy0+X25hbWVkUmFuZ2VzWyRuYW1lZFJhbmdlXSkpIHsKCQkJCXVuc2V0KCR0aGlzLT5fbmFtZWRSYW5nZXNbJG5hbWVkUmFuZ2VdKTsKCQkJfQoJCX0gZWxzZSB7CgkJCWlmIChpc3NldCgkdGhpcy0+X25hbWVkUmFuZ2VzWyRwU2hlZXQtPmdldFRpdGxlKCkgLiAnIScgLiAkbmFtZWRSYW5nZV0pKSB7CgkJCQl1bnNldCgkdGhpcy0+X25hbWVkUmFuZ2VzWyRwU2hlZXQtPmdldFRpdGxlKCkgLiAnIScgLiAkbmFtZWRSYW5nZV0pOwoJCQl9CgkJfQoJCXJldHVybiAkdGhpczsKCX0KCgkvKioKCSAqIEdldCB3b3Jrc2hlZXQgaXRlcmF0b3IKCSAqCgkgKiBAcmV0dXJuIFBIUEV4Y2VsX1dvcmtzaGVldEl0ZXJhdG9yCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRXb3Jrc2hlZXRJdGVyYXRvcigpIHsKCQlyZXR1cm4gbmV3IFBIUEV4Y2VsX1dvcmtzaGVldEl0ZXJhdG9yKCR0aGlzKTsKCX0KCgkvKioKCSAqIENvcHkgd29ya2Jvb2sgKCE9IGNsb25lISkKCSAqCgkgKiBAcmV0dXJuIFBIUEV4Y2VsCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBjb3B5KCkgewoJCSRjb3BpZWQgPSBjbG9uZSAkdGhpczsKCgkJJHdvcmtzaGVldENvdW50ID0gY291bnQoJHRoaXMtPl93b3JrU2hlZXRDb2xsZWN0aW9uKTsKCQlmb3IgKCRpID0gMDsgJGkgPCAkd29ya3NoZWV0Q291bnQ7ICsrJGkpIHsKCQkJJHRoaXMtPl93b3JrU2hlZXRDb2xsZWN0aW9uWyRpXSA9ICR0aGlzLT5fd29ya1NoZWV0Q29sbGVjdGlvblskaV0tPmNvcHkoKTsKCQkJJHRoaXMtPl93b3JrU2hlZXRDb2xsZWN0aW9uWyRpXS0+cmViaW5kUGFyZW50KCR0aGlzKTsKCQl9CgoJCXJldHVybiAkY29waWVkOwoJfQoKCS8qKgoJICogSW1wbGVtZW50IFBIUCBfX2Nsb25lIHRvIGNyZWF0ZSBhIGRlZXAgY2xvbmUsIG5vdCBqdXN0IGEgc2hhbGxvdyBjb3B5LgoJICovCglwdWJsaWMgZnVuY3Rpb24gX19jbG9uZSgpIHsKCQlmb3JlYWNoKCR0aGlzIGFzICRrZXkgPT4gJHZhbCkgewoJCQlpZiAoaXNfb2JqZWN0KCR2YWwpIHx8IChpc19hcnJheSgkdmFsKSkpIHsKCQkJCSR0aGlzLT57JGtleX0gPSB1bnNlcmlhbGl6ZShzZXJpYWxpemUoJHZhbCkpOwoJCQl9CgkJfQoJfQoKCS8qKgoJICogR2V0IHRoZSB3b3JrYm9vayBjb2xsZWN0aW9uIG9mIGNlbGxYZnMKCSAqCgkgKiBAcmV0dXJuIFBIUEV4Y2VsX1N0eWxlW10KCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldENlbGxYZkNvbGxlY3Rpb24oKQoJewoJCXJldHVybiAkdGhpcy0+X2NlbGxYZkNvbGxlY3Rpb247Cgl9CgoJLyoqCgkgKiBHZXQgY2VsbFhmIGJ5IGluZGV4CgkgKgoJICogQHBhcmFtIGludCAkcEluZGV4CgkgKiBAcmV0dXJuIFBIUEV4Y2VsX1N0eWxlCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRDZWxsWGZCeUluZGV4KCRwSW5kZXggPSAwKQoJewoJCXJldHVybiAkdGhpcy0+X2NlbGxYZkNvbGxlY3Rpb25bJHBJbmRleF07Cgl9CgoJLyoqCgkgKiBHZXQgY2VsbFhmIGJ5IGhhc2ggY29kZQoJICoKCSAqIEBwYXJhbSBzdHJpbmcgJHBWYWx1ZQoJICogQHJldHVybiBQSFBFeGNlbF9TdHlsZXxmYWxzZQoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0Q2VsbFhmQnlIYXNoQ29kZSgkcFZhbHVlID0gJycpCgl7CgkJZm9yZWFjaCAoJHRoaXMtPl9jZWxsWGZDb2xsZWN0aW9uIGFzICRjZWxsWGYpIHsKCQkJaWYgKCRjZWxsWGYtPmdldEhhc2hDb2RlKCkgPT0gJHBWYWx1ZSkgewoJCQkJcmV0dXJuICRjZWxsWGY7CgkJCX0KCQl9CgkJcmV0dXJuIGZhbHNlOwoJfQoKCS8qKgoJICogR2V0IGRlZmF1bHQgc3R5bGUKCSAqCgkgKiBAcmV0dXJuIFBIUEV4Y2VsX1N0eWxlCgkgKiBAdGhyb3dzIEV4Y2VwdGlvbgoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0RGVmYXVsdFN0eWxlKCkKCXsKCQlpZiAoaXNzZXQoJHRoaXMtPl9jZWxsWGZDb2xsZWN0aW9uWzBdKSkgewoJCQlyZXR1cm4gJHRoaXMtPl9jZWxsWGZDb2xsZWN0aW9uWzBdOwoJCX0KCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCdObyBkZWZhdWx0IHN0eWxlIGZvdW5kIGZvciB0aGlzIHdvcmtib29rJyk7Cgl9CgoJLyoqCgkgKiBBZGQgYSBjZWxsWGYgdG8gdGhlIHdvcmtib29rCgkgKgoJICogQHBhcmFtIFBIUEV4Y2VsX1N0eWxlICRzdHlsZQoJICovCglwdWJsaWMgZnVuY3Rpb24gYWRkQ2VsbFhmKFBIUEV4Y2VsX1N0eWxlICRzdHlsZSkKCXsKCQkkdGhpcy0+X2NlbGxYZkNvbGxlY3Rpb25bXSA9ICRzdHlsZTsKCQkkc3R5bGUtPnNldEluZGV4KGNvdW50KCR0aGlzLT5fY2VsbFhmQ29sbGVjdGlvbikgLSAxKTsKCX0KCgkvKioKCSAqIFJlbW92ZSBjZWxsWGYgYnkgaW5kZXguIEl0IGlzIGVuc3VyZWQgdGhhdCBhbGwgY2VsbHMgZ2V0IHRoZWlyIHhmIGluZGV4IHVwZGF0ZWQuCgkgKgoJICogQHBhcmFtIGludCAkcEluZGV4IEluZGV4IHRvIGNlbGxYZgoJICogQHRocm93cyBFeGNlcHRpb24KCSAqLwoJcHVibGljIGZ1bmN0aW9uIHJlbW92ZUNlbGxYZkJ5SW5kZXgoJHBJbmRleCA9IDApCgl7CgkJaWYgKCRwSW5kZXggPiBjb3VudCgkdGhpcy0+X2NlbGxYZkNvbGxlY3Rpb24pIC0gMSkgewoJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCJDZWxsWGYgaW5kZXggaXMgb3V0IG9mIGJvdW5kcy4iKTsKCQl9IGVsc2UgewoJCQkvLyBmaXJzdCByZW1vdmUgdGhlIGNlbGxYZgoJCQlhcnJheV9zcGxpY2UoJHRoaXMtPl9jZWxsWGZDb2xsZWN0aW9uLCAkcEluZGV4LCAxKTsKCgkJCS8vIHRoZW4gdXBkYXRlIGNlbGxYZiBpbmRleGVzIGZvciBjZWxscwoJCQlmb3JlYWNoICgkdGhpcy0+X3dvcmtTaGVldENvbGxlY3Rpb24gYXMgJHdvcmtzaGVldCkgewoJCQkJZm9yZWFjaCAoJHdvcmtzaGVldC0+Z2V0Q2VsbENvbGxlY3Rpb24oZmFsc2UpIGFzICRjZWxsSUQpIHsKCQkJCQkkY2VsbCA9ICR3b3Jrc2hlZXQtPmdldENlbGwoJGNlbGxJRCk7CgkJCQkJJHhmSW5kZXggPSAkY2VsbC0+Z2V0WGZJbmRleCgpOwoJCQkJCWlmICgkeGZJbmRleCA+ICRwSW5kZXggKSB7CgkJCQkJCS8vIGRlY3JlYXNlIHhmIGluZGV4IGJ5IDEKCQkJCQkJJGNlbGwtPnNldFhmSW5kZXgoJHhmSW5kZXggLSAxKTsKCQkJCQl9IGVsc2UgaWYgKCR4ZkluZGV4ID09ICRwSW5kZXgpIHsKCQkJCQkJLy8gc2V0IHRvIGRlZmF1bHQgeGYgaW5kZXggMAoJCQkJCQkkY2VsbC0+c2V0WGZJbmRleCgwKTsKCQkJCQl9CgkJCQl9CgkJCX0KCQl9Cgl9CgoJLyoqCgkgKiBHZXQgdGhlIGNlbGxYZiBzdXBlcnZpc29yCgkgKgoJICogQHJldHVybiBQSFBFeGNlbF9TdHlsZQoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0Q2VsbFhmU3VwZXJ2aXNvcigpCgl7CgkJcmV0dXJuICR0aGlzLT5fY2VsbFhmU3VwZXJ2aXNvcjsKCX0KCgkvKioKCSAqIEdldCB0aGUgd29ya2Jvb2sgY29sbGVjdGlvbiBvZiBjZWxsU3R5bGVYZnMKCSAqCgkgKiBAcmV0dXJuIFBIUEV4Y2VsX1N0eWxlW10KCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldENlbGxTdHlsZVhmQ29sbGVjdGlvbigpCgl7CgkJcmV0dXJuICR0aGlzLT5fY2VsbFN0eWxlWGZDb2xsZWN0aW9uOwoJfQoKCS8qKgoJICogR2V0IGNlbGxTdHlsZVhmIGJ5IGluZGV4CgkgKgoJICogQHBhcmFtIGludCAkcEluZGV4CgkgKiBAcmV0dXJuIFBIUEV4Y2VsX1N0eWxlCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRDZWxsU3R5bGVYZkJ5SW5kZXgoJHBJbmRleCA9IDApCgl7CgkJcmV0dXJuICR0aGlzLT5fY2VsbFN0eWxlWGZDb2xsZWN0aW9uWyRwSW5kZXhdOwoJfQoKCS8qKgoJICogR2V0IGNlbGxTdHlsZVhmIGJ5IGhhc2ggY29kZQoJICoKCSAqIEBwYXJhbSBzdHJpbmcgJHBWYWx1ZQoJICogQHJldHVybiBQSFBFeGNlbF9TdHlsZXxmYWxzZQoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0Q2VsbFN0eWxlWGZCeUhhc2hDb2RlKCRwVmFsdWUgPSAnJykKCXsKCQlmb3JlYWNoICgkdGhpcy0+X2NlbGxYZlN0eWxlQ29sbGVjdGlvbiBhcyAkY2VsbFN0eWxlWGYpIHsKCQkJaWYgKCRjZWxsU3R5bGVYZi0+Z2V0SGFzaENvZGUoKSA9PSAkcFZhbHVlKSB7CgkJCQlyZXR1cm4gJGNlbGxTdHlsZVhmOwoJCQl9CgkJfQoJCXJldHVybiBmYWxzZTsKCX0KCgkvKioKCSAqIEFkZCBhIGNlbGxTdHlsZVhmIHRvIHRoZSB3b3JrYm9vawoJICoKCSAqIEBwYXJhbSBQSFBFeGNlbF9TdHlsZSAkcFN0eWxlCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBhZGRDZWxsU3R5bGVYZihQSFBFeGNlbF9TdHlsZSAkcFN0eWxlKQoJewoJCSR0aGlzLT5fY2VsbFN0eWxlWGZDb2xsZWN0aW9uW10gPSAkcFN0eWxlOwoJCSRwU3R5bGUtPnNldEluZGV4KGNvdW50KCR0aGlzLT5fY2VsbFN0eWxlWGZDb2xsZWN0aW9uKSAtIDEpOwoJfQoKCS8qKgoJICogUmVtb3ZlIGNlbGxTdHlsZVhmIGJ5IGluZGV4CgkgKgoJICogQHBhcmFtIGludCAkcEluZGV4CgkgKiBAdGhyb3dzIEV4Y2VwdGlvbgoJICovCglwdWJsaWMgZnVuY3Rpb24gcmVtb3ZlQ2VsbFN0eWxlWGZCeUluZGV4KCRwSW5kZXggPSAwKQoJewoJCWlmICgkcEluZGV4ID4gY291bnQoJHRoaXMtPl9jZWxsU3R5bGVYZkNvbGxlY3Rpb24pIC0gMSkgewoJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCJDZWxsU3R5bGVYZiBpbmRleCBpcyBvdXQgb2YgYm91bmRzLiIpOwoJCX0gZWxzZSB7CgkJCWFycmF5X3NwbGljZSgkdGhpcy0+X2NlbGxTdHlsZVhmQ29sbGVjdGlvbiwgJHBJbmRleCwgMSk7CgkJfQoJfQoKCS8qKgoJICogRWxpbWluYXRlIGFsbCB1bm5lZWRlZCBjZWxsWGYgYW5kIGFmdGVyd2FyZHMgdXBkYXRlIHRoZSB4ZkluZGV4IGZvciBhbGwgY2VsbHMKCSAqIGFuZCBjb2x1bW5zIGluIHRoZSB3b3JrYm9vawoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2FyYmFnZUNvbGxlY3QoKQoJewogICAgCS8vIGhvdyBtYW55IHJlZmVyZW5jZXMgYXJlIHRoZXJlIHRvIGVhY2ggY2VsbFhmID8KCQkkY291bnRSZWZlcmVuY2VzQ2VsbFhmID0gYXJyYXkoKTsKCQlmb3JlYWNoICgkdGhpcy0+X2NlbGxYZkNvbGxlY3Rpb24gYXMgJGluZGV4ID0+ICRjZWxsWGYpIHsKCQkJJGNvdW50UmVmZXJlbmNlc0NlbGxYZlskaW5kZXhdID0gMDsKCQl9CgoJCWZvcmVhY2ggKCR0aGlzLT5nZXRXb3Jrc2hlZXRJdGVyYXRvcigpIGFzICRzaGVldCkgewoKCQkJLy8gZnJvbSBjZWxscwoJCQlmb3JlYWNoICgkc2hlZXQtPmdldENlbGxDb2xsZWN0aW9uKGZhbHNlKSBhcyAkY2VsbElEKSB7CgkJCQkkY2VsbCA9ICRzaGVldC0+Z2V0Q2VsbCgkY2VsbElEKTsKCQkJCSsrJGNvdW50UmVmZXJlbmNlc0NlbGxYZlskY2VsbC0+Z2V0WGZJbmRleCgpXTsKCQkJfQoKCQkJLy8gZnJvbSByb3cgZGltZW5zaW9ucwoJCQlmb3JlYWNoICgkc2hlZXQtPmdldFJvd0RpbWVuc2lvbnMoKSBhcyAkcm93RGltZW5zaW9uKSB7CgkJCQlpZiAoJHJvd0RpbWVuc2lvbi0+Z2V0WGZJbmRleCgpICE9PSBudWxsKSB7CgkJCQkJKyskY291bnRSZWZlcmVuY2VzQ2VsbFhmWyRyb3dEaW1lbnNpb24tPmdldFhmSW5kZXgoKV07CgkJCQl9CgkJCX0KCgkJCS8vIGZyb20gY29sdW1uIGRpbWVuc2lvbnMKCQkJZm9yZWFjaCAoJHNoZWV0LT5nZXRDb2x1bW5EaW1lbnNpb25zKCkgYXMgJGNvbHVtbkRpbWVuc2lvbikgewoJCQkJKyskY291bnRSZWZlcmVuY2VzQ2VsbFhmWyRjb2x1bW5EaW1lbnNpb24tPmdldFhmSW5kZXgoKV07CgkJCX0KCQl9CgoJCS8vIHJlbW92ZSBjZWxsWGZzIHdpdGhvdXQgcmVmZXJlbmNlcyBhbmQgY3JlYXRlIG1hcHBpbmcgc28gd2UgY2FuIHVwZGF0ZSB4ZkluZGV4CgkJLy8gZm9yIGFsbCBjZWxscyBhbmQgY29sdW1ucwoJCSRjb3VudE5lZWRlZENlbGxYZnMgPSAwOwoJCWZvcmVhY2ggKCR0aGlzLT5fY2VsbFhmQ29sbGVjdGlvbiBhcyAkaW5kZXggPT4gJGNlbGxYZikgewoJCQlpZiAoJGNvdW50UmVmZXJlbmNlc0NlbGxYZlskaW5kZXhdID4gMCB8fCAkaW5kZXggPT0gMCkgeyAvLyB3ZSBtdXN0IG5ldmVyIHJlbW92ZSB0aGUgZmlyc3QgY2VsbFhmCgkJCQkrKyRjb3VudE5lZWRlZENlbGxYZnM7CgkJCX0gZWxzZSB7CgkJCQl1bnNldCgkdGhpcy0+X2NlbGxYZkNvbGxlY3Rpb25bJGluZGV4XSk7CgkJCX0KCQkJJG1hcFskaW5kZXhdID0gJGNvdW50TmVlZGVkQ2VsbFhmcyAtIDE7CgkJfQoJCSR0aGlzLT5fY2VsbFhmQ29sbGVjdGlvbiA9IGFycmF5X3ZhbHVlcygkdGhpcy0+X2NlbGxYZkNvbGxlY3Rpb24pOwoKCQkvLyB1cGRhdGUgdGhlIGluZGV4IGZvciBhbGwgY2VsbFhmcwoJCWZvcmVhY2ggKCR0aGlzLT5fY2VsbFhmQ29sbGVjdGlvbiBhcyAkaSA9PiAkY2VsbFhmKSB7CgkJCSRjZWxsWGYtPnNldEluZGV4KCRpKTsKCQl9CgoJCS8vIG1ha2Ugc3VyZSB0aGVyZSBpcyBhbHdheXMgYXQgbGVhc3Qgb25lIGNlbGxYZiAodGhlcmUgc2hvdWxkIGJlKQoJCWlmIChlbXB0eSgkdGhpcy0+X2NlbGxYZkNvbGxlY3Rpb24pKSB7CgkJCSR0aGlzLT5fY2VsbFhmQ29sbGVjdGlvbltdID0gbmV3IFBIUEV4Y2VsX1N0eWxlKCk7CgkJfQoKCQkvLyB1cGRhdGUgdGhlIHhmSW5kZXggZm9yIGFsbCBjZWxscywgcm93IGRpbWVuc2lvbnMsIGNvbHVtbiBkaW1lbnNpb25zCgkJZm9yZWFjaCAoJHRoaXMtPmdldFdvcmtzaGVldEl0ZXJhdG9yKCkgYXMgJHNoZWV0KSB7CgoJCQkvLyBmb3IgYWxsIGNlbGxzCgkJCWZvcmVhY2ggKCRzaGVldC0+Z2V0Q2VsbENvbGxlY3Rpb24oZmFsc2UpIGFzICRjZWxsSUQpIHsKCQkJCSRjZWxsID0gJHNoZWV0LT5nZXRDZWxsKCRjZWxsSUQpOwoJCQkJJGNlbGwtPnNldFhmSW5kZXgoICRtYXBbJGNlbGwtPmdldFhmSW5kZXgoKV0gKTsKCQkJfQoKCQkJLy8gZm9yIGFsbCByb3cgZGltZW5zaW9ucwoJCQlmb3JlYWNoICgkc2hlZXQtPmdldFJvd0RpbWVuc2lvbnMoKSBhcyAkcm93RGltZW5zaW9uKSB7CgkJCQlpZiAoJHJvd0RpbWVuc2lvbi0+Z2V0WGZJbmRleCgpICE9PSBudWxsKSB7CgkJCQkJJHJvd0RpbWVuc2lvbi0+c2V0WGZJbmRleCggJG1hcFskcm93RGltZW5zaW9uLT5nZXRYZkluZGV4KCldICk7CgkJCQl9CgkJCX0KCgkJCS8vIGZvciBhbGwgY29sdW1uIGRpbWVuc2lvbnMKCQkJZm9yZWFjaCAoJHNoZWV0LT5nZXRDb2x1bW5EaW1lbnNpb25zKCkgYXMgJGNvbHVtbkRpbWVuc2lvbikgewoJCQkJJGNvbHVtbkRpbWVuc2lvbi0+c2V0WGZJbmRleCggJG1hcFskY29sdW1uRGltZW5zaW9uLT5nZXRYZkluZGV4KCldICk7CgkJCX0KCQl9CgoJCS8vIGFsc28gZG8gZ2FyYmFnZSBjb2xsZWN0aW9uIGZvciBhbGwgdGhlIHNoZWV0cwoJCWZvcmVhY2ggKCR0aGlzLT5nZXRXb3Jrc2hlZXRJdGVyYXRvcigpIGFzICRzaGVldCkgewoJCQkkc2hlZXQtPmdhcmJhZ2VDb2xsZWN0KCk7CgkJfQoJfQoKfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Autoloader.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIFBIUEV4Y2VsCiAqCiAqIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICoKICogQGNhdGVnb3J5ICAgUEhQRXhjZWwKICogQHBhY2thZ2UgICAgUEhQRXhjZWwKICogQGNvcHlyaWdodCAgQ29weXJpZ2h0IChjKSAyMDA2IC0gMjAxMiBQSFBFeGNlbCAoaHR0cDovL3d3dy5jb2RlcGxleC5jb20vUEhQRXhjZWwpCiAqIEBsaWNlbnNlICAgIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9vbGQtbGljZW5zZXMvbGdwbC0yLjEudHh0ICAgIExHUEwKICogQHZlcnNpb24gICAgMS43LjcsIDIwMTItMDUtMTkKICovCgpQSFBFeGNlbF9BdXRvbG9hZGVyOjpSZWdpc3RlcigpOwpQSFBFeGNlbF9TaGFyZWRfWmlwU3RyZWFtV3JhcHBlcjo6cmVnaXN0ZXIoKTsKLy8gY2hlY2sgbWJzdHJpbmcuZnVuY19vdmVybG9hZAppZiAoaW5pX2dldCgnbWJzdHJpbmcuZnVuY19vdmVybG9hZCcpICYgMikgewogICAgdGhyb3cgbmV3IEV4Y2VwdGlvbignTXVsdGlieXRlIGZ1bmN0aW9uIG92ZXJsb2FkaW5nIGluIFBIUCBtdXN0IGJlIGRpc2FibGVkIGZvciBzdHJpbmcgZnVuY3Rpb25zICgyKS4nKTsKfQpQSFBFeGNlbF9TaGFyZWRfU3RyaW5nOjpidWlsZENoYXJhY3RlclNldHMoKTsKCgovKioKICogUEhQRXhjZWxfQXV0b2xvYWRlcgogKgogKiBAY2F0ZWdvcnkJUEhQRXhjZWwKICogQHBhY2thZ2UJCVBIUEV4Y2VsCiAqIEBjb3B5cmlnaHQJQ29weXJpZ2h0IChjKSAyMDA2IC0gMjAxMiBQSFBFeGNlbCAoaHR0cDovL3d3dy5jb2RlcGxleC5jb20vUEhQRXhjZWwpCiAqLwpjbGFzcyBQSFBFeGNlbF9BdXRvbG9hZGVyCnsKCS8qKgoJICogUmVnaXN0ZXIgdGhlIEF1dG9sb2FkZXIgd2l0aCBTUEwKCSAqCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gUmVnaXN0ZXIoKSB7CgkJaWYgKGZ1bmN0aW9uX2V4aXN0cygnX19hdXRvbG9hZCcpKSB7CgkJCS8vCVJlZ2lzdGVyIGFueSBleGlzdGluZyBhdXRvbG9hZGVyIGZ1bmN0aW9uIHdpdGggU1BMLCBzbyB3ZSBkb24ndCBnZXQgYW55IGNsYXNoZXMKCQkJc3BsX2F1dG9sb2FkX3JlZ2lzdGVyKCdfX2F1dG9sb2FkJyk7CgkJfQoJCS8vCVJlZ2lzdGVyIG91cnNlbHZlcyB3aXRoIFNQTAoJCXJldHVybiBzcGxfYXV0b2xvYWRfcmVnaXN0ZXIoYXJyYXkoJ1BIUEV4Y2VsX0F1dG9sb2FkZXInLCAnTG9hZCcpKTsKCX0JLy8JZnVuY3Rpb24gUmVnaXN0ZXIoKQoKCgkvKioKCSAqIEF1dG9sb2FkIGEgY2xhc3MgaWRlbnRpZmllZCBieSBuYW1lCgkgKgoJICogQHBhcmFtCXN0cmluZwkkcENsYXNzTmFtZQkJTmFtZSBvZiB0aGUgb2JqZWN0IHRvIGxvYWQKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBMb2FkKCRwQ2xhc3NOYW1lKXsKCQlpZiAoKGNsYXNzX2V4aXN0cygkcENsYXNzTmFtZSkpIHx8IChzdHJwb3MoJHBDbGFzc05hbWUsICdQSFBFeGNlbCcpICE9PSAwKSkgewoJCQkvLwlFaXRoZXIgYWxyZWFkeSBsb2FkZWQsIG9yIG5vdCBhIFBIUEV4Y2VsIGNsYXNzIHJlcXVlc3QKCQkJcmV0dXJuIEZBTFNFOwoJCX0KCgkJJHBPYmplY3RGaWxlUGF0aCA9IFBIUEVYQ0VMX1JPT1QgLgoJCQkJCQkgICBzdHJfcmVwbGFjZSgnXycsRElSRUNUT1JZX1NFUEFSQVRPUiwkcENsYXNzTmFtZSkgLgoJCQkJCQkgICAnLnBocCc7CgoJCWlmICgoZmlsZV9leGlzdHMoJHBPYmplY3RGaWxlUGF0aCkgPT09IGZhbHNlKSB8fCAoaXNfcmVhZGFibGUoJHBPYmplY3RGaWxlUGF0aCkgPT09IGZhbHNlKSkgewoJCQkvLwlDYW4ndCBsb2FkCgkJCXJldHVybiBGQUxTRTsKCQl9CgoJCXJlcXVpcmUoJHBPYmplY3RGaWxlUGF0aCk7Cgl9CS8vCWZ1bmN0aW9uIExvYWQoKQoKfQ==]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/CachedObjectStorage/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/CachedObjectStorage/APC.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCi8qKg0KICogUEhQRXhjZWwNCiAqDQogKiBDb3B5cmlnaHQgKGMpIDIwMDYgLSAyMDEyIFBIUEV4Y2VsDQogKg0KICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcg0KICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYw0KICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyDQogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4NCiAqDQogKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwNCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mDQogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQ0KICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4NCiAqDQogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljDQogKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlDQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0ENCiAqDQogKiBAY2F0ZWdvcnkgICBQSFBFeGNlbA0KICogQHBhY2thZ2UgICAgUEhQRXhjZWxfQ2FjaGVkT2JqZWN0U3RvcmFnZQ0KICogQGNvcHlyaWdodCAgQ29weXJpZ2h0IChjKSAyMDA2IC0gMjAxMiBQSFBFeGNlbCAoaHR0cDovL3d3dy5jb2RlcGxleC5jb20vUEhQRXhjZWwpDQogKiBAbGljZW5zZSAgICBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvb2xkLWxpY2Vuc2VzL2xncGwtMi4xLnR4dAlMR1BMDQogKiBAdmVyc2lvbiAgICAxLjcuNywgMjAxMi0wNS0xOQ0KICovDQoNCg0KLyoqDQogKiBQSFBFeGNlbF9DYWNoZWRPYmplY3RTdG9yYWdlX0FQQw0KICoNCiAqIEBjYXRlZ29yeSAgIFBIUEV4Y2VsDQogKiBAcGFja2FnZSAgICBQSFBFeGNlbF9DYWNoZWRPYmplY3RTdG9yYWdlDQogKiBAY29weXJpZ2h0ICBDb3B5cmlnaHQgKGMpIDIwMDYgLSAyMDEyIFBIUEV4Y2VsIChodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9QSFBFeGNlbCkNCiAqLw0KY2xhc3MgUEhQRXhjZWxfQ2FjaGVkT2JqZWN0U3RvcmFnZV9BUEMgZXh0ZW5kcyBQSFBFeGNlbF9DYWNoZWRPYmplY3RTdG9yYWdlX0NhY2hlQmFzZSBpbXBsZW1lbnRzIFBIUEV4Y2VsX0NhY2hlZE9iamVjdFN0b3JhZ2VfSUNhY2hlIHsNCg0KCS8qKg0KCSAqIFByZWZpeCB1c2VkIHRvIHVuaXF1ZWx5IGlkZW50aWZ5IGNhY2hlIGRhdGEgZm9yIHRoaXMgd29ya3NoZWV0DQoJICoNCgkgKiBAYWNjZXNzCXByaXZhdGUNCgkgKiBAdmFyIHN0cmluZw0KCSAqLw0KCXByaXZhdGUgJF9jYWNoZVByZWZpeCA9IG51bGw7DQoNCgkvKioNCgkgKiBDYWNoZSB0aW1lb3V0DQoJICoNCgkgKiBAYWNjZXNzCXByaXZhdGUNCgkgKiBAdmFyIGludGVnZXINCgkgKi8NCglwcml2YXRlICRfY2FjaGVUaW1lID0gNjAwOw0KDQoNCiAgICAvKioNCiAgICAgKiBTdG9yZSBjZWxsIGRhdGEgaW4gY2FjaGUgZm9yIHRoZSBjdXJyZW50IGNlbGwgb2JqZWN0IGlmIGl0J3MgImRpcnR5IiwNCiAgICAgKiAgICAgYW5kIHRoZSAnbnVsbGlmeScgdGhlIGN1cnJlbnQgY2VsbCBvYmplY3QNCiAgICAgKg0KCSAqIEBhY2Nlc3MJcHJpdmF0ZQ0KCSAqIEByZXR1cm4Jdm9pZA0KICAgICAqIEB0aHJvd3MJRXhjZXB0aW9uDQogICAgICovDQoJcHJpdmF0ZSBmdW5jdGlvbiBfc3RvcmVEYXRhKCkgew0KCQlpZiAoJHRoaXMtPl9jdXJyZW50Q2VsbElzRGlydHkpIHsNCgkJCSR0aGlzLT5fY3VycmVudE9iamVjdC0+ZGV0YWNoKCk7DQoNCgkJCWlmICghYXBjX3N0b3JlKCR0aGlzLT5fY2FjaGVQcmVmaXguJHRoaXMtPl9jdXJyZW50T2JqZWN0SUQuJy5jYWNoZScsc2VyaWFsaXplKCR0aGlzLT5fY3VycmVudE9iamVjdCksJHRoaXMtPl9jYWNoZVRpbWUpKSB7DQoJCQkJJHRoaXMtPl9fZGVzdHJ1Y3QoKTsNCgkJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCdGYWlsZWQgdG8gc3RvcmUgY2VsbCAnLiR0aGlzLT5fY3VycmVudE9iamVjdElELicgaW4gQVBDJyk7DQoJCQl9DQoJCQkkdGhpcy0+X2N1cnJlbnRDZWxsSXNEaXJ0eSA9IGZhbHNlOw0KCQl9DQoJCSR0aGlzLT5fY3VycmVudE9iamVjdElEID0gJHRoaXMtPl9jdXJyZW50T2JqZWN0ID0gbnVsbDsNCgl9CS8vCWZ1bmN0aW9uIF9zdG9yZURhdGEoKQ0KDQoNCiAgICAvKioNCiAgICAgKiBBZGQgb3IgVXBkYXRlIGEgY2VsbCBpbiBjYWNoZSBpZGVudGlmaWVkIGJ5IGNvb3JkaW5hdGUgYWRkcmVzcw0KICAgICAqDQoJICogQGFjY2VzcwlwdWJsaWMNCiAgICAgKiBAcGFyYW0Jc3RyaW5nCQkJJHBDb29yZAkJQ29vcmRpbmF0ZSBhZGRyZXNzIG9mIHRoZSBjZWxsIHRvIHVwZGF0ZQ0KICAgICAqIEBwYXJhbQlQSFBFeGNlbF9DZWxsCSRjZWxsCQlDZWxsIHRvIHVwZGF0ZQ0KCSAqIEByZXR1cm4Jdm9pZA0KICAgICAqIEB0aHJvd3MJRXhjZXB0aW9uDQogICAgICovDQoJcHVibGljIGZ1bmN0aW9uIGFkZENhY2hlRGF0YSgkcENvb3JkLCBQSFBFeGNlbF9DZWxsICRjZWxsKSB7DQoJCWlmICgoJHBDb29yZCAhPT0gJHRoaXMtPl9jdXJyZW50T2JqZWN0SUQpICYmICgkdGhpcy0+X2N1cnJlbnRPYmplY3RJRCAhPT0gbnVsbCkpIHsNCgkJCSR0aGlzLT5fc3RvcmVEYXRhKCk7DQoJCX0NCgkJJHRoaXMtPl9jZWxsQ2FjaGVbJHBDb29yZF0gPSB0cnVlOw0KDQoJCSR0aGlzLT5fY3VycmVudE9iamVjdElEID0gJHBDb29yZDsNCgkJJHRoaXMtPl9jdXJyZW50T2JqZWN0ID0gJGNlbGw7DQoJCSR0aGlzLT5fY3VycmVudENlbGxJc0RpcnR5ID0gdHJ1ZTsNCg0KCQlyZXR1cm4gJGNlbGw7DQoJfQkvLwlmdW5jdGlvbiBhZGRDYWNoZURhdGEoKQ0KDQoNCgkvKioNCgkgKiBJcyBhIHZhbHVlIHNldCBpbiB0aGUgY3VycmVudCBQSFBFeGNlbF9DYWNoZWRPYmplY3RTdG9yYWdlX0lDYWNoZSBmb3IgYW4gaW5kZXhlZCBjZWxsPw0KCSAqDQoJICogQGFjY2VzcwlwdWJsaWMNCgkgKiBAcGFyYW0Jc3RyaW5nCQkkcENvb3JkCQlDb29yZGluYXRlIGFkZHJlc3Mgb2YgdGhlIGNlbGwgdG8gY2hlY2sNCgkgKiBAcmV0dXJuCXZvaWQNCgkgKiBAcmV0dXJuCWJvb2xlYW4NCgkgKi8NCglwdWJsaWMgZnVuY3Rpb24gaXNEYXRhU2V0KCRwQ29vcmQpIHsNCgkJLy8JQ2hlY2sgaWYgdGhlIHJlcXVlc3RlZCBlbnRyeSBpcyB0aGUgY3VycmVudCBvYmplY3QsIG9yIGV4aXN0cyBpbiB0aGUgY2FjaGUNCgkJaWYgKHBhcmVudDo6aXNEYXRhU2V0KCRwQ29vcmQpKSB7DQoJCQlpZiAoJHRoaXMtPl9jdXJyZW50T2JqZWN0SUQgPT0gJHBDb29yZCkgew0KCQkJCXJldHVybiB0cnVlOw0KCQkJfQ0KCQkJLy8JQ2hlY2sgaWYgdGhlIHJlcXVlc3RlZCBlbnRyeSBzdGlsbCBleGlzdHMgaW4gYXBjDQoJCQkkc3VjY2VzcyA9IGFwY19mZXRjaCgkdGhpcy0+X2NhY2hlUHJlZml4LiRwQ29vcmQuJy5jYWNoZScpOw0KCQkJaWYgKCRzdWNjZXNzID09PSBmYWxzZSkgew0KCQkJCS8vCUVudHJ5IG5vIGxvbmdlciBleGlzdHMgaW4gQVBDLCBzbyBjbGVhciBpdCBmcm9tIHRoZSBjYWNoZSBhcnJheQ0KCQkJCXBhcmVudDo6ZGVsZXRlQ2FjaGVEYXRhKCRwQ29vcmQpOw0KCQkJCXRocm93IG5ldyBFeGNlcHRpb24oJ0NlbGwgZW50cnkgJy4kcENvb3JkLicgbm8gbG9uZ2VyIGV4aXN0cyBpbiBBUEMnKTsNCgkJCX0NCgkJCXJldHVybiB0cnVlOw0KCQl9DQoJCXJldHVybiBmYWxzZTsNCgl9CS8vCWZ1bmN0aW9uIGlzRGF0YVNldCgpDQoNCg0KICAgIC8qKg0KICAgICAqIEdldCBjZWxsIGF0IGEgc3BlY2lmaWMgY29vcmRpbmF0ZQ0KICAgICAqDQoJICogQGFjY2VzcwlwdWJsaWMNCiAgICAgKiBAcGFyYW0gCXN0cmluZyAJCQkkcENvb3JkCQlDb29yZGluYXRlIG9mIHRoZSBjZWxsDQogICAgICogQHRocm93cyAJRXhjZXB0aW9uDQogICAgICogQHJldHVybiAJUEhQRXhjZWxfQ2VsbCAJQ2VsbCB0aGF0IHdhcyBmb3VuZCwgb3IgbnVsbCBpZiBub3QgZm91bmQNCiAgICAgKi8NCglwdWJsaWMgZnVuY3Rpb24gZ2V0Q2FjaGVEYXRhKCRwQ29vcmQpIHsNCgkJaWYgKCRwQ29vcmQgPT09ICR0aGlzLT5fY3VycmVudE9iamVjdElEKSB7DQoJCQlyZXR1cm4gJHRoaXMtPl9jdXJyZW50T2JqZWN0Ow0KCQl9DQoJCSR0aGlzLT5fc3RvcmVEYXRhKCk7DQoNCgkJLy8JQ2hlY2sgaWYgdGhlIGVudHJ5IHRoYXQgaGFzIGJlZW4gcmVxdWVzdGVkIGFjdHVhbGx5IGV4aXN0cw0KCQlpZiAocGFyZW50Ojppc0RhdGFTZXQoJHBDb29yZCkpIHsNCgkJCSRvYmogPSBhcGNfZmV0Y2goJHRoaXMtPl9jYWNoZVByZWZpeC4kcENvb3JkLicuY2FjaGUnKTsNCgkJCWlmICgkb2JqID09PSBmYWxzZSkgew0KCQkJCS8vCUVudHJ5IG5vIGxvbmdlciBleGlzdHMgaW4gQVBDLCBzbyBjbGVhciBpdCBmcm9tIHRoZSBjYWNoZSBhcnJheQ0KCQkJCXBhcmVudDo6ZGVsZXRlQ2FjaGVEYXRhKCRwQ29vcmQpOw0KCQkJCXRocm93IG5ldyBFeGNlcHRpb24oJ0NlbGwgZW50cnkgJy4kcENvb3JkLicgbm8gbG9uZ2VyIGV4aXN0cyBpbiBBUEMnKTsNCgkJCX0NCgkJfSBlbHNlIHsNCgkJCS8vCVJldHVybiBudWxsIGlmIHJlcXVlc3RlZCBlbnRyeSBkb2Vzbid0IGV4aXN0IGluIGNhY2hlDQoJCQlyZXR1cm4gbnVsbDsNCgkJfQ0KDQoJCS8vCVNldCBjdXJyZW50IGVudHJ5IHRvIHRoZSByZXF1ZXN0ZWQgZW50cnkNCgkJJHRoaXMtPl9jdXJyZW50T2JqZWN0SUQgPSAkcENvb3JkOw0KCQkkdGhpcy0+X2N1cnJlbnRPYmplY3QgPSB1bnNlcmlhbGl6ZSgkb2JqKTsNCgkJLy8JUmUtYXR0YWNoIHRoZSBwYXJlbnQgd29ya3NoZWV0DQoJCSR0aGlzLT5fY3VycmVudE9iamVjdC0+YXR0YWNoKCR0aGlzLT5fcGFyZW50KTsNCg0KCQkvLwlSZXR1cm4gcmVxdWVzdGVkIGVudHJ5DQoJCXJldHVybiAkdGhpcy0+X2N1cnJlbnRPYmplY3Q7DQoJfQkvLwlmdW5jdGlvbiBnZXRDYWNoZURhdGEoKQ0KDQoNCiAgICAvKioNCiAgICAgKiBEZWxldGUgYSBjZWxsIGluIGNhY2hlIGlkZW50aWZpZWQgYnkgY29vcmRpbmF0ZSBhZGRyZXNzDQogICAgICoNCgkgKiBAYWNjZXNzCXB1YmxpYw0KICAgICAqIEBwYXJhbQlzdHJpbmcJCQkkcENvb3JkCQlDb29yZGluYXRlIGFkZHJlc3Mgb2YgdGhlIGNlbGwgdG8gZGVsZXRlDQogICAgICogQHRocm93cwlFeGNlcHRpb24NCiAgICAgKi8NCglwdWJsaWMgZnVuY3Rpb24gZGVsZXRlQ2FjaGVEYXRhKCRwQ29vcmQpIHsNCgkJLy8JRGVsZXRlIHRoZSBlbnRyeSBmcm9tIEFQQw0KCQlhcGNfZGVsZXRlKCR0aGlzLT5fY2FjaGVQcmVmaXguJHBDb29yZC4nLmNhY2hlJyk7DQoNCgkJLy8JRGVsZXRlIHRoZSBlbnRyeSBmcm9tIG91ciBjZWxsIGFkZHJlc3MgYXJyYXkNCgkJcGFyZW50OjpkZWxldGVDYWNoZURhdGEoJHBDb29yZCk7DQoJfQkvLwlmdW5jdGlvbiBkZWxldGVDYWNoZURhdGEoKQ0KDQoNCgkvKioNCgkgKiBDbG9uZSB0aGUgY2VsbCBjb2xsZWN0aW9uDQoJICoNCgkgKiBAYWNjZXNzCXB1YmxpYw0KCSAqIEBwYXJhbQlQSFBFeGNlbF9Xb3Jrc2hlZXQJJHBhcmVudAkJVGhlIG5ldyB3b3Jrc2hlZXQNCgkgKiBAcmV0dXJuCXZvaWQNCgkgKi8NCglwdWJsaWMgZnVuY3Rpb24gY29weUNlbGxDb2xsZWN0aW9uKFBIUEV4Y2VsX1dvcmtzaGVldCAkcGFyZW50KSB7DQoJCXBhcmVudDo6Y29weUNlbGxDb2xsZWN0aW9uKCRwYXJlbnQpOw0KCQkvLwlHZXQgYSBuZXcgaWQgZm9yIHRoZSBuZXcgZmlsZSBuYW1lDQoJCSRiYXNlVW5pcXVlID0gJHRoaXMtPl9nZXRVbmlxdWVJRCgpOw0KCQkkbmV3Q2FjaGVQcmVmaXggPSBzdWJzdHIobWQ1KCRiYXNlVW5pcXVlKSwwLDgpLicuJzsNCgkJJGNhY2hlTGlzdCA9ICR0aGlzLT5nZXRDZWxsTGlzdCgpOw0KCQlmb3JlYWNoKCRjYWNoZUxpc3QgYXMgJGNlbGxJRCkgew0KCQkJaWYgKCRjZWxsSUQgIT0gJHRoaXMtPl9jdXJyZW50T2JqZWN0SUQpIHsNCgkJCQkkb2JqID0gYXBjX2ZldGNoKCR0aGlzLT5fY2FjaGVQcmVmaXguJGNlbGxJRC4nLmNhY2hlJyk7DQoJCQkJaWYgKCRvYmogPT09IGZhbHNlKSB7DQoJCQkJCS8vCUVudHJ5IG5vIGxvbmdlciBleGlzdHMgaW4gQVBDLCBzbyBjbGVhciBpdCBmcm9tIHRoZSBjYWNoZSBhcnJheQ0KCQkJCQlwYXJlbnQ6OmRlbGV0ZUNhY2hlRGF0YSgkY2VsbElEKTsNCgkJCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbignQ2VsbCBlbnRyeSAnLiRjZWxsSUQuJyBubyBsb25nZXIgZXhpc3RzIGluIEFQQycpOw0KCQkJCX0NCgkJCQlpZiAoIWFwY19zdG9yZSgkbmV3Q2FjaGVQcmVmaXguJGNlbGxJRC4nLmNhY2hlJywkb2JqLCR0aGlzLT5fY2FjaGVUaW1lKSkgew0KCQkJCQkkdGhpcy0+X19kZXN0cnVjdCgpOw0KCQkJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCdGYWlsZWQgdG8gc3RvcmUgY2VsbCAnLiRjZWxsSUQuJyBpbiBBUEMnKTsNCgkJCQl9DQoJCQl9DQoJCX0NCgkJJHRoaXMtPl9jYWNoZVByZWZpeCA9ICRuZXdDYWNoZVByZWZpeDsNCgl9CS8vCWZ1bmN0aW9uIGNvcHlDZWxsQ29sbGVjdGlvbigpDQoNCg0KCS8qKg0KCSAqIENsZWFyIHRoZSBjZWxsIGNvbGxlY3Rpb24gYW5kIGRpc2Nvbm5lY3QgZnJvbSBvdXIgcGFyZW50DQoJICoNCgkgKiBAYWNjZXNzCXB1YmxpYw0KCSAqIEByZXR1cm4Jdm9pZA0KCSAqLw0KCXB1YmxpYyBmdW5jdGlvbiB1bnNldFdvcmtzaGVldENlbGxzKCkgew0KCQlpZiAoJHRoaXMtPl9jdXJyZW50T2JqZWN0ICE9PSBOVUxMKSB7DQoJCQkkdGhpcy0+X2N1cnJlbnRPYmplY3QtPmRldGFjaCgpOw0KCQkJJHRoaXMtPl9jdXJyZW50T2JqZWN0ID0gJHRoaXMtPl9jdXJyZW50T2JqZWN0SUQgPSBudWxsOw0KCQl9DQoNCgkJLy8JRmx1c2ggdGhlIEFQQyBjYWNoZQ0KCQkkdGhpcy0+X19kZXN0cnVjdCgpOw0KDQoJCSR0aGlzLT5fY2VsbENhY2hlID0gYXJyYXkoKTsNCg0KCQkvLwlkZXRhY2ggb3Vyc2VsZiBmcm9tIHRoZSB3b3Jrc2hlZXQsIHNvIHRoYXQgaXQgY2FuIHRoZW4gZGVsZXRlIHRoaXMgb2JqZWN0IHN1Y2Nlc3NmdWxseQ0KCQkkdGhpcy0+X3BhcmVudCA9IG51bGw7DQoJfQkvLwlmdW5jdGlvbiB1bnNldFdvcmtzaGVldENlbGxzKCkNCg0KDQoJLyoqDQoJICogSW5pdGlhbGlzZSB0aGlzIG5ldyBjZWxsIGNvbGxlY3Rpb24NCgkgKg0KCSAqIEBhY2Nlc3MJcHVibGljDQoJICogQHBhcmFtCVBIUEV4Y2VsX1dvcmtzaGVldAkkcGFyZW50CQlUaGUgd29ya3NoZWV0IGZvciB0aGlzIGNlbGwgY29sbGVjdGlvbg0KCSAqIEBwYXJhbQlhcnJheSBvZiBtaXhlZAkJJGFyZ3VtZW50cwlBZGRpdGlvbmFsIGluaXRpYWxpc2F0aW9uIGFyZ3VtZW50cw0KCSAqLw0KCXB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChQSFBFeGNlbF9Xb3Jrc2hlZXQgJHBhcmVudCwgJGFyZ3VtZW50cykgew0KCQkkY2FjaGVUaW1lCT0gKGlzc2V0KCRhcmd1bWVudHNbJ2NhY2hlVGltZSddKSkJPyAkYXJndW1lbnRzWydjYWNoZVRpbWUnXQk6IDYwMDsNCg0KCQlpZiAoJHRoaXMtPl9jYWNoZVByZWZpeCA9PT0gTlVMTCkgew0KCQkJJGJhc2VVbmlxdWUgPSAkdGhpcy0+X2dldFVuaXF1ZUlEKCk7DQoJCQkkdGhpcy0+X2NhY2hlUHJlZml4ID0gc3Vic3RyKG1kNSgkYmFzZVVuaXF1ZSksMCw4KS4nLic7DQoJCQkkdGhpcy0+X2NhY2hlVGltZSA9ICRjYWNoZVRpbWU7DQoNCgkJCXBhcmVudDo6X19jb25zdHJ1Y3QoJHBhcmVudCk7DQoJCX0NCgl9CS8vCWZ1bmN0aW9uIF9fY29uc3RydWN0KCkNCg0KDQoJLyoqDQoJICogRGVzdHJveSB0aGlzIGNlbGwgY29sbGVjdGlvbg0KCSAqDQoJICogQGFjY2VzcwlwdWJsaWMNCgkgKi8NCglwdWJsaWMgZnVuY3Rpb24gX19kZXN0cnVjdCgpIHsNCgkJJGNhY2hlTGlzdCA9ICR0aGlzLT5nZXRDZWxsTGlzdCgpOw0KCQlmb3JlYWNoKCRjYWNoZUxpc3QgYXMgJGNlbGxJRCkgew0KCQkJYXBjX2RlbGV0ZSgkdGhpcy0+X2NhY2hlUHJlZml4LiRjZWxsSUQuJy5jYWNoZScpOw0KCQl9DQoJfQkvLwlmdW5jdGlvbiBfX2Rlc3RydWN0KCkNCg0KDQoJLyoqDQoJICogSWRlbnRpZnkgd2hldGhlciB0aGUgY2FjaGluZyBtZXRob2QgaXMgY3VycmVudGx5IGF2YWlsYWJsZQ0KCSAqIFNvbWUgbWV0aG9kcyBhcmUgZGVwZW5kZW50IG9uIHRoZSBhdmFpbGFiaWxpdHkgb2YgY2VydGFpbiBleHRlbnNpb25zIGJlaW5nIGVuYWJsZWQgaW4gdGhlIFBIUCBidWlsZA0KCSAqDQoJICogQGFjY2VzcwlwdWJsaWMNCgkgKiBAcmV0dXJuCWJvb2xlYW4NCgkgKi8NCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGNhY2hlTWV0aG9kSXNBdmFpbGFibGUoKSB7DQoJCWlmICghZnVuY3Rpb25fZXhpc3RzKCdhcGNfc3RvcmUnKSkgew0KCQkJcmV0dXJuIGZhbHNlOw0KCQl9DQoJCWlmIChhcGNfc21hX2luZm8oKSA9PT0gZmFsc2UpIHsNCgkJCXJldHVybiBmYWxzZTsNCgkJfQ0KDQoJCXJldHVybiB0cnVlOw0KCX0NCg0KfQ0K]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/CachedObjectStorage/CacheBase.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCi8qKg0KICogUEhQRXhjZWwNCiAqDQogKiBDb3B5cmlnaHQgKGMpIDIwMDYgLSAyMDEyIFBIUEV4Y2VsDQogKg0KICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcg0KICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYw0KICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyDQogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4NCiAqDQogKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwNCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mDQogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQ0KICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4NCiAqDQogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljDQogKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlDQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0ENCiAqDQogKiBAY2F0ZWdvcnkgICBQSFBFeGNlbA0KICogQHBhY2thZ2UgICAgUEhQRXhjZWxfQ2FjaGVkT2JqZWN0U3RvcmFnZQ0KICogQGNvcHlyaWdodCAgQ29weXJpZ2h0IChjKSAyMDA2IC0gMjAxMiBQSFBFeGNlbCAoaHR0cDovL3d3dy5jb2RlcGxleC5jb20vUEhQRXhjZWwpDQogKiBAbGljZW5zZSAgICBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvb2xkLWxpY2Vuc2VzL2xncGwtMi4xLnR4dAlMR1BMDQogKiBAdmVyc2lvbiAgICAxLjcuNywgMjAxMi0wNS0xOQ0KICovDQoNCg0KLyoqDQogKiBQSFBFeGNlbF9DYWNoZWRPYmplY3RTdG9yYWdlX0NhY2hlQmFzZQ0KICoNCiAqIEBjYXRlZ29yeSAgIFBIUEV4Y2VsDQogKiBAcGFja2FnZSAgICBQSFBFeGNlbF9DYWNoZWRPYmplY3RTdG9yYWdlDQogKiBAY29weXJpZ2h0ICBDb3B5cmlnaHQgKGMpIDIwMDYgLSAyMDEyIFBIUEV4Y2VsIChodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9QSFBFeGNlbCkNCiAqLw0KY2xhc3MgUEhQRXhjZWxfQ2FjaGVkT2JqZWN0U3RvcmFnZV9DYWNoZUJhc2Ugew0KDQoJLyoqDQoJICogUGFyZW50IHdvcmtzaGVldA0KCSAqDQoJICogQHZhciBQSFBFeGNlbF9Xb3Jrc2hlZXQNCgkgKi8NCglwcm90ZWN0ZWQgJF9wYXJlbnQ7DQoNCgkvKioNCgkgKiBUaGUgY3VycmVudGx5IGFjdGl2ZSBDZWxsDQoJICoNCgkgKiBAdmFyIFBIUEV4Y2VsX0NlbGwNCgkgKi8NCglwcm90ZWN0ZWQgJF9jdXJyZW50T2JqZWN0ID0gbnVsbDsNCg0KCS8qKg0KCSAqIENvb3JkaW5hdGUgYWRkcmVzcyBvZiB0aGUgY3VycmVudGx5IGFjdGl2ZSBDZWxsDQoJICoNCgkgKiBAdmFyIHN0cmluZw0KCSAqLw0KCXByb3RlY3RlZCAkX2N1cnJlbnRPYmplY3RJRCA9IG51bGw7DQoNCg0KCS8qKg0KCSAqIEZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBjdXJyZW50bHkgYWN0aXZlIENlbGwgcmVxdWlyZXMgc2F2aW5nDQoJICoNCgkgKiBAdmFyIGJvb2xlYW4NCgkgKi8NCglwcm90ZWN0ZWQgJF9jdXJyZW50Q2VsbElzRGlydHkgPSB0cnVlOw0KDQoJLyoqDQoJICogQW4gYXJyYXkgb2YgY2VsbHMgb3IgY2VsbCBwb2ludGVycyBmb3IgdGhlIHdvcmtzaGVldCBjZWxscyBoZWxkIGluIHRoaXMgY2FjaGUsDQoJICoJCWFuZCBpbmRleGVkIGJ5IHRoZWlyIGNvb3JkaW5hdGUgYWRkcmVzcyB3aXRoaW4gdGhlIHdvcmtzaGVldA0KCSAqDQoJICogQHZhciBhcnJheSBvZiBtaXhlZA0KCSAqLw0KCXByb3RlY3RlZCAkX2NlbGxDYWNoZSA9IGFycmF5KCk7DQoNCg0KCS8qKg0KCSAqIEluaXRpYWxpc2UgdGhpcyBuZXcgY2VsbCBjb2xsZWN0aW9uDQoJICoNCgkgKiBAcGFyYW0JUEhQRXhjZWxfV29ya3NoZWV0CSRwYXJlbnQJCVRoZSB3b3Jrc2hlZXQgZm9yIHRoaXMgY2VsbCBjb2xsZWN0aW9uDQoJICovDQoJcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KFBIUEV4Y2VsX1dvcmtzaGVldCAkcGFyZW50KSB7DQoJCS8vCVNldCBvdXIgcGFyZW50IHdvcmtzaGVldC4NCgkJLy8JVGhpcyBpcyBtYWludGFpbmVkIHdpdGhpbiB0aGUgY2FjaGUgY29udHJvbGxlciB0byBmYWNpbGl0YXRlIHJlLWF0dGFjaGluZyBpdCB0byBQSFBFeGNlbF9DZWxsIG9iamVjdHMgd2hlbg0KCQkvLwkJdGhleSBhcmUgd29rZW4gZnJvbSBhIHNlcmlhbGl6ZWQgc3RhdGUNCgkJJHRoaXMtPl9wYXJlbnQgPSAkcGFyZW50Ow0KCX0JLy8JZnVuY3Rpb24gX19jb25zdHJ1Y3QoKQ0KDQoNCgkvKioNCgkgKiBJcyBhIHZhbHVlIHNldCBpbiB0aGUgY3VycmVudCBQSFBFeGNlbF9DYWNoZWRPYmplY3RTdG9yYWdlX0lDYWNoZSBmb3IgYW4gaW5kZXhlZCBjZWxsPw0KCSAqDQoJICogQHBhcmFtCXN0cmluZwkJJHBDb29yZAkJQ29vcmRpbmF0ZSBhZGRyZXNzIG9mIHRoZSBjZWxsIHRvIGNoZWNrDQoJICogQHJldHVybglib29sZWFuDQoJICovDQoJcHVibGljIGZ1bmN0aW9uIGlzRGF0YVNldCgkcENvb3JkKSB7DQoJCWlmICgkcENvb3JkID09PSAkdGhpcy0+X2N1cnJlbnRPYmplY3RJRCkgew0KCQkJcmV0dXJuIHRydWU7DQoJCX0NCgkJLy8JQ2hlY2sgaWYgdGhlIHJlcXVlc3RlZCBlbnRyeSBleGlzdHMgaW4gdGhlIGNhY2hlDQoJCXJldHVybiBpc3NldCgkdGhpcy0+X2NlbGxDYWNoZVskcENvb3JkXSk7DQoJfQkvLwlmdW5jdGlvbiBpc0RhdGFTZXQoKQ0KDQoNCiAgICAvKioNCiAgICAgKiBBZGQgb3IgVXBkYXRlIGEgY2VsbCBpbiBjYWNoZQ0KICAgICAqDQogICAgICogQHBhcmFtCVBIUEV4Y2VsX0NlbGwJJGNlbGwJCUNlbGwgdG8gdXBkYXRlDQoJICogQHJldHVybgl2b2lkDQogICAgICogQHRocm93cwlFeGNlcHRpb24NCiAgICAgKi8NCglwdWJsaWMgZnVuY3Rpb24gdXBkYXRlQ2FjaGVEYXRhKFBIUEV4Y2VsX0NlbGwgJGNlbGwpIHsNCgkJcmV0dXJuICR0aGlzLT5hZGRDYWNoZURhdGEoJGNlbGwtPmdldENvb3JkaW5hdGUoKSwkY2VsbCk7DQoJfQkvLwlmdW5jdGlvbiB1cGRhdGVDYWNoZURhdGEoKQ0KDQoNCiAgICAvKioNCiAgICAgKiBEZWxldGUgYSBjZWxsIGluIGNhY2hlIGlkZW50aWZpZWQgYnkgY29vcmRpbmF0ZSBhZGRyZXNzDQogICAgICoNCiAgICAgKiBAcGFyYW0Jc3RyaW5nCQkJJHBDb29yZAkJQ29vcmRpbmF0ZSBhZGRyZXNzIG9mIHRoZSBjZWxsIHRvIGRlbGV0ZQ0KICAgICAqIEB0aHJvd3MJRXhjZXB0aW9uDQogICAgICovDQoJcHVibGljIGZ1bmN0aW9uIGRlbGV0ZUNhY2hlRGF0YSgkcENvb3JkKSB7DQoJCWlmICgkcENvb3JkID09PSAkdGhpcy0+X2N1cnJlbnRPYmplY3RJRCkgew0KCQkJJHRoaXMtPl9jdXJyZW50T2JqZWN0LT5kZXRhY2goKTsNCgkJCSR0aGlzLT5fY3VycmVudE9iamVjdElEID0gJHRoaXMtPl9jdXJyZW50T2JqZWN0ID0gbnVsbDsNCgkJfQ0KDQoJCWlmIChpc19vYmplY3QoJHRoaXMtPl9jZWxsQ2FjaGVbJHBDb29yZF0pKSB7DQoJCQkkdGhpcy0+X2NlbGxDYWNoZVskcENvb3JkXS0+ZGV0YWNoKCk7DQoJCQl1bnNldCgkdGhpcy0+X2NlbGxDYWNoZVskcENvb3JkXSk7DQoJCX0NCgkJJHRoaXMtPl9jdXJyZW50Q2VsbElzRGlydHkgPSBmYWxzZTsNCgl9CS8vCWZ1bmN0aW9uIGRlbGV0ZUNhY2hlRGF0YSgpDQoNCg0KCS8qKg0KCSAqIEdldCBhIGxpc3Qgb2YgYWxsIGNlbGwgYWRkcmVzc2VzIGN1cnJlbnRseSBoZWxkIGluIGNhY2hlDQoJICoNCgkgKiBAcmV0dXJuCWFycmF5IG9mIHN0cmluZw0KCSAqLw0KCXB1YmxpYyBmdW5jdGlvbiBnZXRDZWxsTGlzdCgpIHsNCgkJcmV0dXJuIGFycmF5X2tleXMoJHRoaXMtPl9jZWxsQ2FjaGUpOw0KCX0JLy8JZnVuY3Rpb24gZ2V0Q2VsbExpc3QoKQ0KDQoNCgkvKioNCgkgKiBTb3J0IHRoZSBsaXN0IG9mIGFsbCBjZWxsIGFkZHJlc3NlcyBjdXJyZW50bHkgaGVsZCBpbiBjYWNoZSBieSByb3cgYW5kIGNvbHVtbg0KCSAqDQoJICogQHJldHVybgl2b2lkDQoJICovDQoJcHVibGljIGZ1bmN0aW9uIGdldFNvcnRlZENlbGxMaXN0KCkgew0KCQkkc29ydEtleXMgPSBhcnJheSgpOw0KCQlmb3JlYWNoICgkdGhpcy0+Z2V0Q2VsbExpc3QoKSBhcyAkY29vcmQpIHsNCgkJCWxpc3QoJGNvbHVtbiwkcm93KSA9IHNzY2FuZigkY29vcmQsJyVbQS1aXSVkJyk7DQoJCQkkc29ydEtleXNbc3ByaW50ZignJTA5ZCUzcycsJHJvdywkY29sdW1uKV0gPSAkY29vcmQ7DQoJCX0NCgkJa3NvcnQoJHNvcnRLZXlzKTsNCg0KCQlyZXR1cm4gYXJyYXlfdmFsdWVzKCRzb3J0S2V5cyk7DQoJfQkvLwlmdW5jdGlvbiBzb3J0Q2VsbExpc3QoKQ0KDQoNCg0KCS8qKg0KCSAqIEdldCBoaWdoZXN0IHdvcmtzaGVldCBjb2x1bW4gYW5kIGhpZ2hlc3Qgcm93IHRoYXQgaGF2ZSBjZWxsIHJlY29yZHMNCgkgKg0KCSAqIEByZXR1cm4gYXJyYXkgSGlnaGVzdCBjb2x1bW4gbmFtZSBhbmQgaGlnaGVzdCByb3cgbnVtYmVyDQoJICovDQoJcHVibGljIGZ1bmN0aW9uIGdldEhpZ2hlc3RSb3dBbmRDb2x1bW4oKQ0KCXsNCgkJLy8gTG9va3VwIGhpZ2hlc3QgY29sdW1uIGFuZCBoaWdoZXN0IHJvdw0KCQkkY29sID0gYXJyYXkoJ0EnID0+ICcxQScpOw0KCQkkcm93ID0gYXJyYXkoMSk7DQoJCWZvcmVhY2ggKCR0aGlzLT5nZXRDZWxsTGlzdCgpIGFzICRjb29yZCkgew0KCQkJbGlzdCgkYywkcikgPSBzc2NhbmYoJGNvb3JkLCclW0EtWl0lZCcpOw0KCQkJJHJvd1skcl0gPSAkcjsNCgkJCSRjb2xbJGNdID0gc3RybGVuKCRjKS4kYzsNCgkJfQ0KCQlpZiAoIWVtcHR5KCRyb3cpKSB7DQoJCQkvLyBEZXRlcm1pbmUgaGlnaGVzdCBjb2x1bW4gYW5kIHJvdw0KCQkJJGhpZ2hlc3RSb3cgPSBtYXgoJHJvdyk7DQoJCQkkaGlnaGVzdENvbHVtbiA9IHN1YnN0cihtYXgoJGNvbCksMSk7DQoJCX0NCgkJcmV0dXJuIGFycmF5KCAncm93JwkgICA9PiAkaGlnaGVzdFJvdywNCgkJCQkJICAnY29sdW1uJyA9PiAkaGlnaGVzdENvbHVtbg0KCQkJCQkpOw0KCX0NCg0KDQoJLyoqDQoJICogR2V0IGhpZ2hlc3Qgd29ya3NoZWV0IGNvbHVtbg0KCSAqDQoJICogQHJldHVybiBzdHJpbmcgSGlnaGVzdCBjb2x1bW4gbmFtZQ0KCSAqLw0KCXB1YmxpYyBmdW5jdGlvbiBnZXRIaWdoZXN0Q29sdW1uKCkNCgl7DQoJCSRjb2xSb3cgPSAkdGhpcy0+Z2V0SGlnaGVzdFJvd0FuZENvbHVtbigpOw0KCQlyZXR1cm4gJGNvbFJvd1snY29sdW1uJ107DQoJfQ0KDQoJLyoqDQoJICogR2V0IGhpZ2hlc3Qgd29ya3NoZWV0IHJvdw0KCSAqDQoJICogQHJldHVybiBpbnQgSGlnaGVzdCByb3cgbnVtYmVyDQoJICovDQoJcHVibGljIGZ1bmN0aW9uIGdldEhpZ2hlc3RSb3coKQ0KCXsNCgkJJGNvbFJvdyA9ICR0aGlzLT5nZXRIaWdoZXN0Um93QW5kQ29sdW1uKCk7DQoJCXJldHVybiAkY29sUm93Wydyb3cnXTsNCgl9DQoNCg0KCS8qKg0KCSAqIEdlbmVyYXRlIGEgdW5pcXVlIElEIGZvciBjYWNoZSByZWZlcmVuY2luZw0KCSAqDQoJICogQHJldHVybiBzdHJpbmcgVW5pcXVlIFJlZmVyZW5jZQ0KCSAqLw0KCXByb3RlY3RlZCBmdW5jdGlvbiBfZ2V0VW5pcXVlSUQoKSB7DQoJCWlmIChmdW5jdGlvbl9leGlzdHMoJ3Bvc2l4X2dldHBpZCcpKSB7DQoJCQkkYmFzZVVuaXF1ZSA9IHBvc2l4X2dldHBpZCgpOw0KCQl9IGVsc2Ugew0KCQkJJGJhc2VVbmlxdWUgPSBtdF9yYW5kKCk7DQoJCX0NCgkJcmV0dXJuIHVuaXFpZCgkYmFzZVVuaXF1ZSx0cnVlKTsNCgl9DQoNCgkvKioNCgkgKiBDbG9uZSB0aGUgY2VsbCBjb2xsZWN0aW9uDQoJICoNCgkgKiBAcGFyYW0JUEhQRXhjZWxfV29ya3NoZWV0CSRwYXJlbnQJCVRoZSBuZXcgd29ya3NoZWV0DQoJICogQHJldHVybgl2b2lkDQoJICovDQoJcHVibGljIGZ1bmN0aW9uIGNvcHlDZWxsQ29sbGVjdGlvbihQSFBFeGNlbF9Xb3Jrc2hlZXQgJHBhcmVudCkgew0KCQkkdGhpcy0+X3BhcmVudCA9ICRwYXJlbnQ7DQoJCWlmICgoJHRoaXMtPl9jdXJyZW50T2JqZWN0ICE9PSBOVUxMKSAmJiAoaXNfb2JqZWN0KCR0aGlzLT5fY3VycmVudE9iamVjdCkpKSB7DQoJCQkkdGhpcy0+X2N1cnJlbnRPYmplY3QtPmF0dGFjaCgkcGFyZW50KTsNCgkJfQ0KCX0JLy8JZnVuY3Rpb24gY29weUNlbGxDb2xsZWN0aW9uKCkNCg0KDQoJLyoqDQoJICogSWRlbnRpZnkgd2hldGhlciB0aGUgY2FjaGluZyBtZXRob2QgaXMgY3VycmVudGx5IGF2YWlsYWJsZQ0KCSAqIFNvbWUgbWV0aG9kcyBhcmUgZGVwZW5kZW50IG9uIHRoZSBhdmFpbGFiaWxpdHkgb2YgY2VydGFpbiBleHRlbnNpb25zIGJlaW5nIGVuYWJsZWQgaW4gdGhlIFBIUCBidWlsZA0KCSAqDQoJICogQHJldHVybglib29sZWFuDQoJICovDQoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBjYWNoZU1ldGhvZElzQXZhaWxhYmxlKCkgew0KCQlyZXR1cm4gdHJ1ZTsNCgl9DQoNCn0NCg==]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/CachedObjectStorage/DiscISAM.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCi8qKg0KICogUEhQRXhjZWwNCiAqDQogKiBDb3B5cmlnaHQgKGMpIDIwMDYgLSAyMDEyIFBIUEV4Y2VsDQogKg0KICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcg0KICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYw0KICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyDQogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4NCiAqDQogKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwNCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mDQogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQ0KICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4NCiAqDQogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljDQogKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlDQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0ENCiAqDQogKiBAY2F0ZWdvcnkgICBQSFBFeGNlbA0KICogQHBhY2thZ2UgICAgUEhQRXhjZWxfQ2FjaGVkT2JqZWN0U3RvcmFnZQ0KICogQGNvcHlyaWdodCAgQ29weXJpZ2h0IChjKSAyMDA2IC0gMjAxMiBQSFBFeGNlbCAoaHR0cDovL3d3dy5jb2RlcGxleC5jb20vUEhQRXhjZWwpDQogKiBAbGljZW5zZSAgICBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvb2xkLWxpY2Vuc2VzL2xncGwtMi4xLnR4dAlMR1BMDQogKiBAdmVyc2lvbiAgICAxLjcuNywgMjAxMi0wNS0xOQ0KICovDQoNCg0KLyoqDQogKiBQSFBFeGNlbF9DYWNoZWRPYmplY3RTdG9yYWdlX0Rpc2NJU0FNDQogKg0KICogQGNhdGVnb3J5ICAgUEhQRXhjZWwNCiAqIEBwYWNrYWdlICAgIFBIUEV4Y2VsX0NhY2hlZE9iamVjdFN0b3JhZ2UNCiAqIEBjb3B5cmlnaHQgIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwgKGh0dHA6Ly93d3cuY29kZXBsZXguY29tL1BIUEV4Y2VsKQ0KICovDQpjbGFzcyBQSFBFeGNlbF9DYWNoZWRPYmplY3RTdG9yYWdlX0Rpc2NJU0FNIGV4dGVuZHMgUEhQRXhjZWxfQ2FjaGVkT2JqZWN0U3RvcmFnZV9DYWNoZUJhc2UgaW1wbGVtZW50cyBQSFBFeGNlbF9DYWNoZWRPYmplY3RTdG9yYWdlX0lDYWNoZSB7DQoNCgkvKioNCgkgKiBOYW1lIG9mIHRoZSBmaWxlIGZvciB0aGlzIGNhY2hlDQoJICoNCgkgKiBAdmFyIHN0cmluZw0KCSAqLw0KCXByaXZhdGUgJF9maWxlTmFtZSA9IG51bGw7DQoNCgkvKioNCgkgKiBGaWxlIGhhbmRsZSBmb3IgdGhpcyBjYWNoZSBmaWxlDQoJICoNCgkgKiBAdmFyIHJlc291cmNlDQoJICovDQoJcHJpdmF0ZSAkX2ZpbGVIYW5kbGUgPSBudWxsOw0KDQoJLyoqDQoJICogRGlyZWN0b3J5L0ZvbGRlciB3aGVyZSB0aGUgY2FjaGUgZmlsZSBpcyBsb2NhdGVkDQoJICoNCgkgKiBAdmFyIHN0cmluZw0KCSAqLw0KCXByaXZhdGUgJF9jYWNoZURpcmVjdG9yeSA9IE5VTEw7DQoNCg0KICAgIC8qKg0KICAgICAqIFN0b3JlIGNlbGwgZGF0YSBpbiBjYWNoZSBmb3IgdGhlIGN1cnJlbnQgY2VsbCBvYmplY3QgaWYgaXQncyAiZGlydHkiLA0KICAgICAqICAgICBhbmQgdGhlICdudWxsaWZ5JyB0aGUgY3VycmVudCBjZWxsIG9iamVjdA0KICAgICAqDQoJICogQHJldHVybgl2b2lkDQogICAgICogQHRocm93cwlFeGNlcHRpb24NCiAgICAgKi8NCglwcml2YXRlIGZ1bmN0aW9uIF9zdG9yZURhdGEoKSB7DQoJCWlmICgkdGhpcy0+X2N1cnJlbnRDZWxsSXNEaXJ0eSkgew0KCQkJJHRoaXMtPl9jdXJyZW50T2JqZWN0LT5kZXRhY2goKTsNCg0KCQkJZnNlZWsoJHRoaXMtPl9maWxlSGFuZGxlLDAsU0VFS19FTkQpOw0KCQkJJG9mZnNldCA9IGZ0ZWxsKCR0aGlzLT5fZmlsZUhhbmRsZSk7DQoJCQlmd3JpdGUoJHRoaXMtPl9maWxlSGFuZGxlLCBzZXJpYWxpemUoJHRoaXMtPl9jdXJyZW50T2JqZWN0KSk7DQoJCQkkdGhpcy0+X2NlbGxDYWNoZVskdGhpcy0+X2N1cnJlbnRPYmplY3RJRF0JPSBhcnJheSgncHRyJyA9PiAkb2Zmc2V0LA0KCQkJCQkJCQkJCQkJCQkJCSdzeicgID0+IGZ0ZWxsKCR0aGlzLT5fZmlsZUhhbmRsZSkgLSAkb2Zmc2V0DQoJCQkJCQkJCQkJCQkJCQkgICApOw0KCQkJJHRoaXMtPl9jdXJyZW50Q2VsbElzRGlydHkgPSBmYWxzZTsNCgkJfQ0KCQkkdGhpcy0+X2N1cnJlbnRPYmplY3RJRCA9ICR0aGlzLT5fY3VycmVudE9iamVjdCA9IG51bGw7DQoJfQkvLwlmdW5jdGlvbiBfc3RvcmVEYXRhKCkNCg0KDQogICAgLyoqDQogICAgICogQWRkIG9yIFVwZGF0ZSBhIGNlbGwgaW4gY2FjaGUgaWRlbnRpZmllZCBieSBjb29yZGluYXRlIGFkZHJlc3MNCiAgICAgKg0KICAgICAqIEBwYXJhbQlzdHJpbmcJCQkkcENvb3JkCQlDb29yZGluYXRlIGFkZHJlc3Mgb2YgdGhlIGNlbGwgdG8gdXBkYXRlDQogICAgICogQHBhcmFtCVBIUEV4Y2VsX0NlbGwJJGNlbGwJCUNlbGwgdG8gdXBkYXRlDQoJICogQHJldHVybgl2b2lkDQogICAgICogQHRocm93cwlFeGNlcHRpb24NCiAgICAgKi8NCglwdWJsaWMgZnVuY3Rpb24gYWRkQ2FjaGVEYXRhKCRwQ29vcmQsIFBIUEV4Y2VsX0NlbGwgJGNlbGwpIHsNCgkJaWYgKCgkcENvb3JkICE9PSAkdGhpcy0+X2N1cnJlbnRPYmplY3RJRCkgJiYgKCR0aGlzLT5fY3VycmVudE9iamVjdElEICE9PSBudWxsKSkgew0KCQkJJHRoaXMtPl9zdG9yZURhdGEoKTsNCgkJfQ0KDQoJCSR0aGlzLT5fY3VycmVudE9iamVjdElEID0gJHBDb29yZDsNCgkJJHRoaXMtPl9jdXJyZW50T2JqZWN0ID0gJGNlbGw7DQoJCSR0aGlzLT5fY3VycmVudENlbGxJc0RpcnR5ID0gdHJ1ZTsNCg0KCQlyZXR1cm4gJGNlbGw7DQoJfQkvLwlmdW5jdGlvbiBhZGRDYWNoZURhdGEoKQ0KDQoNCiAgICAvKioNCiAgICAgKiBHZXQgY2VsbCBhdCBhIHNwZWNpZmljIGNvb3JkaW5hdGUNCiAgICAgKg0KICAgICAqIEBwYXJhbSAJc3RyaW5nIAkJCSRwQ29vcmQJCUNvb3JkaW5hdGUgb2YgdGhlIGNlbGwNCiAgICAgKiBAdGhyb3dzIAlFeGNlcHRpb24NCiAgICAgKiBAcmV0dXJuIAlQSFBFeGNlbF9DZWxsIAlDZWxsIHRoYXQgd2FzIGZvdW5kLCBvciBudWxsIGlmIG5vdCBmb3VuZA0KICAgICAqLw0KCXB1YmxpYyBmdW5jdGlvbiBnZXRDYWNoZURhdGEoJHBDb29yZCkgew0KCQlpZiAoJHBDb29yZCA9PT0gJHRoaXMtPl9jdXJyZW50T2JqZWN0SUQpIHsNCgkJCXJldHVybiAkdGhpcy0+X2N1cnJlbnRPYmplY3Q7DQoJCX0NCgkJJHRoaXMtPl9zdG9yZURhdGEoKTsNCg0KCQkvLwlDaGVjayBpZiB0aGUgZW50cnkgdGhhdCBoYXMgYmVlbiByZXF1ZXN0ZWQgYWN0dWFsbHkgZXhpc3RzDQoJCWlmICghaXNzZXQoJHRoaXMtPl9jZWxsQ2FjaGVbJHBDb29yZF0pKSB7DQoJCQkvLwlSZXR1cm4gbnVsbCBpZiByZXF1ZXN0ZWQgZW50cnkgZG9lc24ndCBleGlzdCBpbiBjYWNoZQ0KCQkJcmV0dXJuIG51bGw7DQoJCX0NCg0KCQkvLwlTZXQgY3VycmVudCBlbnRyeSB0byB0aGUgcmVxdWVzdGVkIGVudHJ5DQoJCSR0aGlzLT5fY3VycmVudE9iamVjdElEID0gJHBDb29yZDsNCgkJZnNlZWsoJHRoaXMtPl9maWxlSGFuZGxlLCR0aGlzLT5fY2VsbENhY2hlWyRwQ29vcmRdWydwdHInXSk7DQoJCSR0aGlzLT5fY3VycmVudE9iamVjdCA9IHVuc2VyaWFsaXplKGZyZWFkKCR0aGlzLT5fZmlsZUhhbmRsZSwkdGhpcy0+X2NlbGxDYWNoZVskcENvb3JkXVsnc3onXSkpOw0KCQkvLwlSZS1hdHRhY2ggdGhlIHBhcmVudCB3b3Jrc2hlZXQNCgkJJHRoaXMtPl9jdXJyZW50T2JqZWN0LT5hdHRhY2goJHRoaXMtPl9wYXJlbnQpOw0KDQoJCS8vCVJldHVybiByZXF1ZXN0ZWQgZW50cnkNCgkJcmV0dXJuICR0aGlzLT5fY3VycmVudE9iamVjdDsNCgl9CS8vCWZ1bmN0aW9uIGdldENhY2hlRGF0YSgpDQoNCg0KCS8qKg0KCSAqIENsb25lIHRoZSBjZWxsIGNvbGxlY3Rpb24NCgkgKg0KCSAqIEBwYXJhbQlQSFBFeGNlbF9Xb3Jrc2hlZXQJJHBhcmVudAkJVGhlIG5ldyB3b3Jrc2hlZXQNCgkgKiBAcmV0dXJuCXZvaWQNCgkgKi8NCglwdWJsaWMgZnVuY3Rpb24gY29weUNlbGxDb2xsZWN0aW9uKFBIUEV4Y2VsX1dvcmtzaGVldCAkcGFyZW50KSB7DQoJCXBhcmVudDo6Y29weUNlbGxDb2xsZWN0aW9uKCRwYXJlbnQpOw0KCQkvLwlHZXQgYSBuZXcgaWQgZm9yIHRoZSBuZXcgZmlsZSBuYW1lDQoJCSRiYXNlVW5pcXVlID0gJHRoaXMtPl9nZXRVbmlxdWVJRCgpOw0KCQkkbmV3RmlsZU5hbWUgPSAkdGhpcy0+X2NhY2hlRGlyZWN0b3J5LicvUEhQRXhjZWwuJy4kYmFzZVVuaXF1ZS4nLmNhY2hlJzsNCgkJLy8JQ29weSB0aGUgZXhpc3RpbmcgY2VsbCBjYWNoZSBmaWxlDQoJCWNvcHkgKCR0aGlzLT5fZmlsZU5hbWUsJG5ld0ZpbGVOYW1lKTsNCgkJJHRoaXMtPl9maWxlTmFtZSA9ICRuZXdGaWxlTmFtZTsNCgkJLy8JT3BlbiB0aGUgY29waWVkIGNlbGwgY2FjaGUgZmlsZQ0KCQkkdGhpcy0+X2ZpbGVIYW5kbGUgPSBmb3BlbigkdGhpcy0+X2ZpbGVOYW1lLCdhKycpOw0KCX0JLy8JZnVuY3Rpb24gY29weUNlbGxDb2xsZWN0aW9uKCkNCg0KDQoJLyoqDQoJICogQ2xlYXIgdGhlIGNlbGwgY29sbGVjdGlvbiBhbmQgZGlzY29ubmVjdCBmcm9tIG91ciBwYXJlbnQNCgkgKg0KCSAqIEByZXR1cm4Jdm9pZA0KCSAqLw0KCXB1YmxpYyBmdW5jdGlvbiB1bnNldFdvcmtzaGVldENlbGxzKCkgew0KCQlpZighaXNfbnVsbCgkdGhpcy0+X2N1cnJlbnRPYmplY3QpKSB7DQoJCQkkdGhpcy0+X2N1cnJlbnRPYmplY3QtPmRldGFjaCgpOw0KCQkJJHRoaXMtPl9jdXJyZW50T2JqZWN0ID0gJHRoaXMtPl9jdXJyZW50T2JqZWN0SUQgPSBudWxsOw0KCQl9DQoJCSR0aGlzLT5fY2VsbENhY2hlID0gYXJyYXkoKTsNCg0KCQkvLwlkZXRhY2ggb3Vyc2VsZiBmcm9tIHRoZSB3b3Jrc2hlZXQsIHNvIHRoYXQgaXQgY2FuIHRoZW4gZGVsZXRlIHRoaXMgb2JqZWN0IHN1Y2Nlc3NmdWxseQ0KCQkkdGhpcy0+X3BhcmVudCA9IG51bGw7DQoNCgkJLy8JQ2xvc2UgZG93biB0aGUgdGVtcG9yYXJ5IGNhY2hlIGZpbGUNCgkJJHRoaXMtPl9fZGVzdHJ1Y3QoKTsNCgl9CS8vCWZ1bmN0aW9uIHVuc2V0V29ya3NoZWV0Q2VsbHMoKQ0KDQoNCgkvKioNCgkgKiBJbml0aWFsaXNlIHRoaXMgbmV3IGNlbGwgY29sbGVjdGlvbg0KCSAqDQoJICogQHBhcmFtCVBIUEV4Y2VsX1dvcmtzaGVldAkkcGFyZW50CQlUaGUgd29ya3NoZWV0IGZvciB0aGlzIGNlbGwgY29sbGVjdGlvbg0KCSAqIEBwYXJhbQlhcnJheSBvZiBtaXhlZAkJJGFyZ3VtZW50cwlBZGRpdGlvbmFsIGluaXRpYWxpc2F0aW9uIGFyZ3VtZW50cw0KCSAqLw0KCXB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChQSFBFeGNlbF9Xb3Jrc2hlZXQgJHBhcmVudCwgJGFyZ3VtZW50cykgew0KCQkkdGhpcy0+X2NhY2hlRGlyZWN0b3J5CT0gKChpc3NldCgkYXJndW1lbnRzWydkaXInXSkpICYmICgkYXJndW1lbnRzWydkaXInXSAhPT0gTlVMTCkpDQoJCQkJCQkJCQk/ICRhcmd1bWVudHNbJ2RpciddDQoJCQkJCQkJCQk6IFBIUEV4Y2VsX1NoYXJlZF9GaWxlOjpzeXNfZ2V0X3RlbXBfZGlyKCk7DQoNCgkJcGFyZW50OjpfX2NvbnN0cnVjdCgkcGFyZW50KTsNCgkJaWYgKGlzX251bGwoJHRoaXMtPl9maWxlSGFuZGxlKSkgew0KCQkJJGJhc2VVbmlxdWUgPSAkdGhpcy0+X2dldFVuaXF1ZUlEKCk7DQoJCQkkdGhpcy0+X2ZpbGVOYW1lID0gJHRoaXMtPl9jYWNoZURpcmVjdG9yeS4nL1BIUEV4Y2VsLicuJGJhc2VVbmlxdWUuJy5jYWNoZSc7DQoJCQkkdGhpcy0+X2ZpbGVIYW5kbGUgPSBmb3BlbigkdGhpcy0+X2ZpbGVOYW1lLCdhKycpOw0KCQl9DQoJfQkvLwlmdW5jdGlvbiBfX2NvbnN0cnVjdCgpDQoNCg0KCS8qKg0KCSAqIERlc3Ryb3kgdGhpcyBjZWxsIGNvbGxlY3Rpb24NCgkgKi8NCglwdWJsaWMgZnVuY3Rpb24gX19kZXN0cnVjdCgpIHsNCgkJaWYgKCFpc19udWxsKCR0aGlzLT5fZmlsZUhhbmRsZSkpIHsNCgkJCWZjbG9zZSgkdGhpcy0+X2ZpbGVIYW5kbGUpOw0KCQkJdW5saW5rKCR0aGlzLT5fZmlsZU5hbWUpOw0KCQl9DQoJCSR0aGlzLT5fZmlsZUhhbmRsZSA9IG51bGw7DQoJfQkvLwlmdW5jdGlvbiBfX2Rlc3RydWN0KCkNCg0KfQ0K]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/CachedObjectStorage/ICache.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIFBIUEV4Y2VsCiAqCiAqIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICoKICogQGNhdGVnb3J5ICAgUEhQRXhjZWwKICogQHBhY2thZ2UgICAgUEhQRXhjZWxfQ2FjaGVkT2JqZWN0U3RvcmFnZQogKiBAY29weXJpZ2h0ICBDb3B5cmlnaHQgKGMpIDIwMDYgLSAyMDEyIFBIUEV4Y2VsIChodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9QSFBFeGNlbCkKICogQGxpY2Vuc2UgICAgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL29sZC1saWNlbnNlcy9sZ3BsLTIuMS50eHQJTEdQTAogKiBAdmVyc2lvbiAgICAxLjcuNywgMjAxMi0wNS0xOQogKi8KCgovKioKICogUEhQRXhjZWxfQ2FjaGVkT2JqZWN0U3RvcmFnZV9JQ2FjaGUKICoKICogQGNhdGVnb3J5ICAgUEhQRXhjZWwKICogQHBhY2thZ2UgICAgUEhQRXhjZWxfQ2FjaGVkT2JqZWN0U3RvcmFnZQogKiBAY29weXJpZ2h0ICBDb3B5cmlnaHQgKGMpIDIwMDYgLSAyMDEyIFBIUEV4Y2VsIChodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9QSFBFeGNlbCkKICovCmludGVyZmFjZSBQSFBFeGNlbF9DYWNoZWRPYmplY3RTdG9yYWdlX0lDYWNoZQp7CiAgICAvKioKICAgICAqIEFkZCBvciBVcGRhdGUgYSBjZWxsIGluIGNhY2hlIGlkZW50aWZpZWQgYnkgY29vcmRpbmF0ZSBhZGRyZXNzCiAgICAgKgogICAgICogQHBhcmFtCXN0cmluZwkJCSRwQ29vcmQJCUNvb3JkaW5hdGUgYWRkcmVzcyBvZiB0aGUgY2VsbCB0byB1cGRhdGUKICAgICAqIEBwYXJhbQlQSFBFeGNlbF9DZWxsCSRjZWxsCQlDZWxsIHRvIHVwZGF0ZQoJICogQHJldHVybgl2b2lkCiAgICAgKiBAdGhyb3dzCUV4Y2VwdGlvbgogICAgICovCglwdWJsaWMgZnVuY3Rpb24gYWRkQ2FjaGVEYXRhKCRwQ29vcmQsIFBIUEV4Y2VsX0NlbGwgJGNlbGwpOwoKICAgIC8qKgogICAgICogQWRkIG9yIFVwZGF0ZSBhIGNlbGwgaW4gY2FjaGUKICAgICAqCiAgICAgKiBAcGFyYW0JUEhQRXhjZWxfQ2VsbAkkY2VsbAkJQ2VsbCB0byB1cGRhdGUKCSAqIEByZXR1cm4Jdm9pZAogICAgICogQHRocm93cwlFeGNlcHRpb24KICAgICAqLwoJcHVibGljIGZ1bmN0aW9uIHVwZGF0ZUNhY2hlRGF0YShQSFBFeGNlbF9DZWxsICRjZWxsKTsKCiAgICAvKioKICAgICAqIEZldGNoIGEgY2VsbCBmcm9tIGNhY2hlIGlkZW50aWZpZWQgYnkgY29vcmRpbmF0ZSBhZGRyZXNzCiAgICAgKgogICAgICogQHBhcmFtCXN0cmluZwkJCSRwQ29vcmQJCUNvb3JkaW5hdGUgYWRkcmVzcyBvZiB0aGUgY2VsbCB0byByZXRyaWV2ZQogICAgICogQHJldHVybiBQSFBFeGNlbF9DZWxsIAlDZWxsIHRoYXQgd2FzIGZvdW5kLCBvciBudWxsIGlmIG5vdCBmb3VuZAogICAgICogQHRocm93cwlFeGNlcHRpb24KICAgICAqLwoJcHVibGljIGZ1bmN0aW9uIGdldENhY2hlRGF0YSgkcENvb3JkKTsKCiAgICAvKioKICAgICAqIERlbGV0ZSBhIGNlbGwgaW4gY2FjaGUgaWRlbnRpZmllZCBieSBjb29yZGluYXRlIGFkZHJlc3MKICAgICAqCiAgICAgKiBAcGFyYW0Jc3RyaW5nCQkJJHBDb29yZAkJQ29vcmRpbmF0ZSBhZGRyZXNzIG9mIHRoZSBjZWxsIHRvIGRlbGV0ZQogICAgICogQHRocm93cwlFeGNlcHRpb24KICAgICAqLwoJcHVibGljIGZ1bmN0aW9uIGRlbGV0ZUNhY2hlRGF0YSgkcENvb3JkKTsKCgkvKioKCSAqIElzIGEgdmFsdWUgc2V0IGluIHRoZSBjdXJyZW50IFBIUEV4Y2VsX0NhY2hlZE9iamVjdFN0b3JhZ2VfSUNhY2hlIGZvciBhbiBpbmRleGVkIGNlbGw/CgkgKgoJICogQHBhcmFtCXN0cmluZwkJJHBDb29yZAkJQ29vcmRpbmF0ZSBhZGRyZXNzIG9mIHRoZSBjZWxsIHRvIGNoZWNrCgkgKiBAcmV0dXJuCWJvb2xlYW4KCSAqLwoJcHVibGljIGZ1bmN0aW9uIGlzRGF0YVNldCgkcENvb3JkKTsKCgkvKioKCSAqIEdldCBhIGxpc3Qgb2YgYWxsIGNlbGwgYWRkcmVzc2VzIGN1cnJlbnRseSBoZWxkIGluIGNhY2hlCgkgKgoJICogQHJldHVybglhcnJheSBvZiBzdHJpbmcKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldENlbGxMaXN0KCk7CgoJLyoqCgkgKiBHZXQgdGhlIGxpc3Qgb2YgYWxsIGNlbGwgYWRkcmVzc2VzIGN1cnJlbnRseSBoZWxkIGluIGNhY2hlIHNvcnRlZCBieSBjb2x1bW4gYW5kIHJvdwoJICoKCSAqIEByZXR1cm4Jdm9pZAoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0U29ydGVkQ2VsbExpc3QoKTsKCgkvKioKCSAqIENsb25lIHRoZSBjZWxsIGNvbGxlY3Rpb24KCSAqCgkgKiBAcGFyYW0JUEhQRXhjZWxfV29ya3NoZWV0CSRwYXJlbnQJCVRoZSBuZXcgd29ya3NoZWV0CgkgKiBAcmV0dXJuCXZvaWQKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGNvcHlDZWxsQ29sbGVjdGlvbihQSFBFeGNlbF9Xb3Jrc2hlZXQgJHBhcmVudCk7CgoJLyoqCgkgKiBJZGVudGlmeSB3aGV0aGVyIHRoZSBjYWNoaW5nIG1ldGhvZCBpcyBjdXJyZW50bHkgYXZhaWxhYmxlCgkgKiBTb21lIG1ldGhvZHMgYXJlIGRlcGVuZGVudCBvbiB0aGUgYXZhaWxhYmlsaXR5IG9mIGNlcnRhaW4gZXh0ZW5zaW9ucyBiZWluZyBlbmFibGVkIGluIHRoZSBQSFAgYnVpbGQKCSAqCgkgKiBAcmV0dXJuCWJvb2xlYW4KCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBjYWNoZU1ldGhvZElzQXZhaWxhYmxlKCk7Cgp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/CachedObjectStorage/Igbinary.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCi8qKg0KICogUEhQRXhjZWwNCiAqDQogKiBDb3B5cmlnaHQgKGMpIDIwMDYgLSAyMDEyIFBIUEV4Y2VsDQogKg0KICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcg0KICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYw0KICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyDQogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4NCiAqDQogKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwNCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mDQogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQ0KICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4NCiAqDQogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljDQogKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlDQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0ENCiAqDQogKiBAY2F0ZWdvcnkgICBQSFBFeGNlbA0KICogQHBhY2thZ2UgICAgUEhQRXhjZWxfQ2FjaGVkT2JqZWN0U3RvcmFnZQ0KICogQGNvcHlyaWdodCAgQ29weXJpZ2h0IChjKSAyMDA2IC0gMjAxMiBQSFBFeGNlbCAoaHR0cDovL3d3dy5jb2RlcGxleC5jb20vUEhQRXhjZWwpDQogKiBAbGljZW5zZSAgICBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvb2xkLWxpY2Vuc2VzL2xncGwtMi4xLnR4dAlMR1BMDQogKiBAdmVyc2lvbiAgICAxLjcuNywgMjAxMi0wNS0xOQ0KICovDQoNCg0KLyoqDQogKiBQSFBFeGNlbF9DYWNoZWRPYmplY3RTdG9yYWdlX0lnYmluYXJ5DQogKg0KICogQGNhdGVnb3J5ICAgUEhQRXhjZWwNCiAqIEBwYWNrYWdlICAgIFBIUEV4Y2VsX0NhY2hlZE9iamVjdFN0b3JhZ2UNCiAqIEBjb3B5cmlnaHQgIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwgKGh0dHA6Ly93d3cuY29kZXBsZXguY29tL1BIUEV4Y2VsKQ0KICovDQpjbGFzcyBQSFBFeGNlbF9DYWNoZWRPYmplY3RTdG9yYWdlX0lnYmluYXJ5IGV4dGVuZHMgUEhQRXhjZWxfQ2FjaGVkT2JqZWN0U3RvcmFnZV9DYWNoZUJhc2UgaW1wbGVtZW50cyBQSFBFeGNlbF9DYWNoZWRPYmplY3RTdG9yYWdlX0lDYWNoZSB7DQoNCiAgICAvKioNCiAgICAgKiBTdG9yZSBjZWxsIGRhdGEgaW4gY2FjaGUgZm9yIHRoZSBjdXJyZW50IGNlbGwgb2JqZWN0IGlmIGl0J3MgImRpcnR5IiwNCiAgICAgKiAgICAgYW5kIHRoZSAnbnVsbGlmeScgdGhlIGN1cnJlbnQgY2VsbCBvYmplY3QNCiAgICAgKg0KCSAqIEByZXR1cm4Jdm9pZA0KICAgICAqIEB0aHJvd3MJRXhjZXB0aW9uDQogICAgICovDQoJcHJpdmF0ZSBmdW5jdGlvbiBfc3RvcmVEYXRhKCkgew0KCQlpZiAoJHRoaXMtPl9jdXJyZW50Q2VsbElzRGlydHkpIHsNCgkJCSR0aGlzLT5fY3VycmVudE9iamVjdC0+ZGV0YWNoKCk7DQoNCgkJCSR0aGlzLT5fY2VsbENhY2hlWyR0aGlzLT5fY3VycmVudE9iamVjdElEXSA9IGlnYmluYXJ5X3NlcmlhbGl6ZSgkdGhpcy0+X2N1cnJlbnRPYmplY3QpOw0KCQkJJHRoaXMtPl9jdXJyZW50Q2VsbElzRGlydHkgPSBmYWxzZTsNCgkJfQ0KCQkkdGhpcy0+X2N1cnJlbnRPYmplY3RJRCA9ICR0aGlzLT5fY3VycmVudE9iamVjdCA9IG51bGw7DQoJfQkvLwlmdW5jdGlvbiBfc3RvcmVEYXRhKCkNCg0KDQogICAgLyoqDQogICAgICogQWRkIG9yIFVwZGF0ZSBhIGNlbGwgaW4gY2FjaGUgaWRlbnRpZmllZCBieSBjb29yZGluYXRlIGFkZHJlc3MNCiAgICAgKg0KICAgICAqIEBwYXJhbQlzdHJpbmcJCQkkcENvb3JkCQlDb29yZGluYXRlIGFkZHJlc3Mgb2YgdGhlIGNlbGwgdG8gdXBkYXRlDQogICAgICogQHBhcmFtCVBIUEV4Y2VsX0NlbGwJJGNlbGwJCUNlbGwgdG8gdXBkYXRlDQoJICogQHJldHVybgl2b2lkDQogICAgICogQHRocm93cwlFeGNlcHRpb24NCiAgICAgKi8NCglwdWJsaWMgZnVuY3Rpb24gYWRkQ2FjaGVEYXRhKCRwQ29vcmQsIFBIUEV4Y2VsX0NlbGwgJGNlbGwpIHsNCgkJaWYgKCgkcENvb3JkICE9PSAkdGhpcy0+X2N1cnJlbnRPYmplY3RJRCkgJiYgKCR0aGlzLT5fY3VycmVudE9iamVjdElEICE9PSBudWxsKSkgew0KCQkJJHRoaXMtPl9zdG9yZURhdGEoKTsNCgkJfQ0KDQoJCSR0aGlzLT5fY3VycmVudE9iamVjdElEID0gJHBDb29yZDsNCgkJJHRoaXMtPl9jdXJyZW50T2JqZWN0ID0gJGNlbGw7DQoJCSR0aGlzLT5fY3VycmVudENlbGxJc0RpcnR5ID0gdHJ1ZTsNCg0KCQlyZXR1cm4gJGNlbGw7DQoJfQkvLwlmdW5jdGlvbiBhZGRDYWNoZURhdGEoKQ0KDQoNCiAgICAvKioNCiAgICAgKiBHZXQgY2VsbCBhdCBhIHNwZWNpZmljIGNvb3JkaW5hdGUNCiAgICAgKg0KICAgICAqIEBwYXJhbSAJc3RyaW5nIAkJCSRwQ29vcmQJCUNvb3JkaW5hdGUgb2YgdGhlIGNlbGwNCiAgICAgKiBAdGhyb3dzIAlFeGNlcHRpb24NCiAgICAgKiBAcmV0dXJuIAlQSFBFeGNlbF9DZWxsIAlDZWxsIHRoYXQgd2FzIGZvdW5kLCBvciBudWxsIGlmIG5vdCBmb3VuZA0KICAgICAqLw0KCXB1YmxpYyBmdW5jdGlvbiBnZXRDYWNoZURhdGEoJHBDb29yZCkgew0KCQlpZiAoJHBDb29yZCA9PT0gJHRoaXMtPl9jdXJyZW50T2JqZWN0SUQpIHsNCgkJCXJldHVybiAkdGhpcy0+X2N1cnJlbnRPYmplY3Q7DQoJCX0NCgkJJHRoaXMtPl9zdG9yZURhdGEoKTsNCg0KCQkvLwlDaGVjayBpZiB0aGUgZW50cnkgdGhhdCBoYXMgYmVlbiByZXF1ZXN0ZWQgYWN0dWFsbHkgZXhpc3RzDQoJCWlmICghaXNzZXQoJHRoaXMtPl9jZWxsQ2FjaGVbJHBDb29yZF0pKSB7DQoJCQkvLwlSZXR1cm4gbnVsbCBpZiByZXF1ZXN0ZWQgZW50cnkgZG9lc24ndCBleGlzdCBpbiBjYWNoZQ0KCQkJcmV0dXJuIG51bGw7DQoJCX0NCg0KCQkvLwlTZXQgY3VycmVudCBlbnRyeSB0byB0aGUgcmVxdWVzdGVkIGVudHJ5DQoJCSR0aGlzLT5fY3VycmVudE9iamVjdElEID0gJHBDb29yZDsNCgkJJHRoaXMtPl9jdXJyZW50T2JqZWN0ID0gaWdiaW5hcnlfdW5zZXJpYWxpemUoJHRoaXMtPl9jZWxsQ2FjaGVbJHBDb29yZF0pOw0KCQkvLwlSZS1hdHRhY2ggdGhlIHBhcmVudCB3b3Jrc2hlZXQNCgkJJHRoaXMtPl9jdXJyZW50T2JqZWN0LT5hdHRhY2goJHRoaXMtPl9wYXJlbnQpOw0KDQoJCS8vCVJldHVybiByZXF1ZXN0ZWQgZW50cnkNCgkJcmV0dXJuICR0aGlzLT5fY3VycmVudE9iamVjdDsNCgl9CS8vCWZ1bmN0aW9uIGdldENhY2hlRGF0YSgpDQoNCg0KCS8qKg0KCSAqIENsZWFyIHRoZSBjZWxsIGNvbGxlY3Rpb24gYW5kIGRpc2Nvbm5lY3QgZnJvbSBvdXIgcGFyZW50DQoJICoNCgkgKiBAcmV0dXJuCXZvaWQNCgkgKi8NCglwdWJsaWMgZnVuY3Rpb24gdW5zZXRXb3Jrc2hlZXRDZWxscygpIHsNCgkJaWYoIWlzX251bGwoJHRoaXMtPl9jdXJyZW50T2JqZWN0KSkgew0KCQkJJHRoaXMtPl9jdXJyZW50T2JqZWN0LT5kZXRhY2goKTsNCgkJCSR0aGlzLT5fY3VycmVudE9iamVjdCA9ICR0aGlzLT5fY3VycmVudE9iamVjdElEID0gbnVsbDsNCgkJfQ0KCQkkdGhpcy0+X2NlbGxDYWNoZSA9IGFycmF5KCk7DQoNCgkJLy8JZGV0YWNoIG91cnNlbGYgZnJvbSB0aGUgd29ya3NoZWV0LCBzbyB0aGF0IGl0IGNhbiB0aGVuIGRlbGV0ZSB0aGlzIG9iamVjdCBzdWNjZXNzZnVsbHkNCgkJJHRoaXMtPl9wYXJlbnQgPSBudWxsOw0KCX0JLy8JZnVuY3Rpb24gdW5zZXRXb3Jrc2hlZXRDZWxscygpDQoNCg0KCS8qKg0KCSAqIElkZW50aWZ5IHdoZXRoZXIgdGhlIGNhY2hpbmcgbWV0aG9kIGlzIGN1cnJlbnRseSBhdmFpbGFibGUNCgkgKiBTb21lIG1ldGhvZHMgYXJlIGRlcGVuZGVudCBvbiB0aGUgYXZhaWxhYmlsaXR5IG9mIGNlcnRhaW4gZXh0ZW5zaW9ucyBiZWluZyBlbmFibGVkIGluIHRoZSBQSFAgYnVpbGQNCgkgKg0KCSAqIEByZXR1cm4JYm9vbGVhbg0KCSAqLw0KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gY2FjaGVNZXRob2RJc0F2YWlsYWJsZSgpIHsNCgkJaWYgKCFmdW5jdGlvbl9leGlzdHMoJ2lnYmluYXJ5X3NlcmlhbGl6ZScpKSB7DQoJCQlyZXR1cm4gZmFsc2U7DQoJCX0NCg0KCQlyZXR1cm4gdHJ1ZTsNCgl9DQoNCn0NCg==]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/CachedObjectStorage/Memcache.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCi8qKg0KICogUEhQRXhjZWwNCiAqDQogKiBDb3B5cmlnaHQgKGMpIDIwMDYgLSAyMDEyIFBIUEV4Y2VsDQogKg0KICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcg0KICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYw0KICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyDQogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4NCiAqDQogKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwNCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mDQogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQ0KICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4NCiAqDQogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljDQogKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlDQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0ENCiAqDQogKiBAY2F0ZWdvcnkgICBQSFBFeGNlbA0KICogQHBhY2thZ2UgICAgUEhQRXhjZWxfQ2FjaGVkT2JqZWN0U3RvcmFnZQ0KICogQGNvcHlyaWdodCAgQ29weXJpZ2h0IChjKSAyMDA2IC0gMjAxMiBQSFBFeGNlbCAoaHR0cDovL3d3dy5jb2RlcGxleC5jb20vUEhQRXhjZWwpDQogKiBAbGljZW5zZSAgICBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvb2xkLWxpY2Vuc2VzL2xncGwtMi4xLnR4dAlMR1BMDQogKiBAdmVyc2lvbiAgICAxLjcuNywgMjAxMi0wNS0xOQ0KICovDQoNCg0KLyoqDQogKiBQSFBFeGNlbF9DYWNoZWRPYmplY3RTdG9yYWdlX01lbWNhY2hlDQogKg0KICogQGNhdGVnb3J5ICAgUEhQRXhjZWwNCiAqIEBwYWNrYWdlICAgIFBIUEV4Y2VsX0NhY2hlZE9iamVjdFN0b3JhZ2UNCiAqIEBjb3B5cmlnaHQgIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwgKGh0dHA6Ly93d3cuY29kZXBsZXguY29tL1BIUEV4Y2VsKQ0KICovDQpjbGFzcyBQSFBFeGNlbF9DYWNoZWRPYmplY3RTdG9yYWdlX01lbWNhY2hlIGV4dGVuZHMgUEhQRXhjZWxfQ2FjaGVkT2JqZWN0U3RvcmFnZV9DYWNoZUJhc2UgaW1wbGVtZW50cyBQSFBFeGNlbF9DYWNoZWRPYmplY3RTdG9yYWdlX0lDYWNoZSB7DQoNCgkvKioNCgkgKiBQcmVmaXggdXNlZCB0byB1bmlxdWVseSBpZGVudGlmeSBjYWNoZSBkYXRhIGZvciB0aGlzIHdvcmtzaGVldA0KCSAqDQoJICogQHZhciBzdHJpbmcNCgkgKi8NCglwcml2YXRlICRfY2FjaGVQcmVmaXggPSBudWxsOw0KDQoJLyoqDQoJICogQ2FjaGUgdGltZW91dA0KCSAqDQoJICogQHZhciBpbnRlZ2VyDQoJICovDQoJcHJpdmF0ZSAkX2NhY2hlVGltZSA9IDYwMDsNCg0KCS8qKg0KCSAqIE1lbWNhY2hlIGludGVyZmFjZQ0KCSAqDQoJICogQHZhciByZXNvdXJjZQ0KCSAqLw0KCXByaXZhdGUgJF9tZW1jYWNoZSA9IG51bGw7DQoNCg0KICAgIC8qKg0KICAgICAqIFN0b3JlIGNlbGwgZGF0YSBpbiBjYWNoZSBmb3IgdGhlIGN1cnJlbnQgY2VsbCBvYmplY3QgaWYgaXQncyAiZGlydHkiLA0KICAgICAqICAgICBhbmQgdGhlICdudWxsaWZ5JyB0aGUgY3VycmVudCBjZWxsIG9iamVjdA0KICAgICAqDQoJICogQHJldHVybgl2b2lkDQogICAgICogQHRocm93cwlFeGNlcHRpb24NCiAgICAgKi8NCglwcml2YXRlIGZ1bmN0aW9uIF9zdG9yZURhdGEoKSB7DQoJCWlmICgkdGhpcy0+X2N1cnJlbnRDZWxsSXNEaXJ0eSkgew0KCQkJJHRoaXMtPl9jdXJyZW50T2JqZWN0LT5kZXRhY2goKTsNCg0KCQkJJG9iaiA9IHNlcmlhbGl6ZSgkdGhpcy0+X2N1cnJlbnRPYmplY3QpOw0KCQkJaWYgKCEkdGhpcy0+X21lbWNhY2hlLT5yZXBsYWNlKCR0aGlzLT5fY2FjaGVQcmVmaXguJHRoaXMtPl9jdXJyZW50T2JqZWN0SUQuJy5jYWNoZScsJG9iaixOVUxMLCR0aGlzLT5fY2FjaGVUaW1lKSkgew0KCQkJCWlmICghJHRoaXMtPl9tZW1jYWNoZS0+YWRkKCR0aGlzLT5fY2FjaGVQcmVmaXguJHRoaXMtPl9jdXJyZW50T2JqZWN0SUQuJy5jYWNoZScsJG9iaixOVUxMLCR0aGlzLT5fY2FjaGVUaW1lKSkgew0KCQkJCQkkdGhpcy0+X19kZXN0cnVjdCgpOw0KCQkJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCdGYWlsZWQgdG8gc3RvcmUgY2VsbCAnLiR0aGlzLT5fY3VycmVudE9iamVjdElELicgaW4gTWVtQ2FjaGUnKTsNCgkJCQl9DQoJCQl9DQoJCQkkdGhpcy0+X2N1cnJlbnRDZWxsSXNEaXJ0eSA9IGZhbHNlOw0KCQl9DQoJCSR0aGlzLT5fY3VycmVudE9iamVjdElEID0gJHRoaXMtPl9jdXJyZW50T2JqZWN0ID0gbnVsbDsNCgl9CS8vCWZ1bmN0aW9uIF9zdG9yZURhdGEoKQ0KDQoNCiAgICAvKioNCiAgICAgKiBBZGQgb3IgVXBkYXRlIGEgY2VsbCBpbiBjYWNoZSBpZGVudGlmaWVkIGJ5IGNvb3JkaW5hdGUgYWRkcmVzcw0KICAgICAqDQogICAgICogQHBhcmFtCXN0cmluZwkJCSRwQ29vcmQJCUNvb3JkaW5hdGUgYWRkcmVzcyBvZiB0aGUgY2VsbCB0byB1cGRhdGUNCiAgICAgKiBAcGFyYW0JUEhQRXhjZWxfQ2VsbAkkY2VsbAkJQ2VsbCB0byB1cGRhdGUNCgkgKiBAcmV0dXJuCXZvaWQNCiAgICAgKiBAdGhyb3dzCUV4Y2VwdGlvbg0KICAgICAqLw0KCXB1YmxpYyBmdW5jdGlvbiBhZGRDYWNoZURhdGEoJHBDb29yZCwgUEhQRXhjZWxfQ2VsbCAkY2VsbCkgew0KCQlpZiAoKCRwQ29vcmQgIT09ICR0aGlzLT5fY3VycmVudE9iamVjdElEKSAmJiAoJHRoaXMtPl9jdXJyZW50T2JqZWN0SUQgIT09IG51bGwpKSB7DQoJCQkkdGhpcy0+X3N0b3JlRGF0YSgpOw0KCQl9DQoJCSR0aGlzLT5fY2VsbENhY2hlWyRwQ29vcmRdID0gdHJ1ZTsNCg0KCQkkdGhpcy0+X2N1cnJlbnRPYmplY3RJRCA9ICRwQ29vcmQ7DQoJCSR0aGlzLT5fY3VycmVudE9iamVjdCA9ICRjZWxsOw0KCQkkdGhpcy0+X2N1cnJlbnRDZWxsSXNEaXJ0eSA9IHRydWU7DQoNCgkJcmV0dXJuICRjZWxsOw0KCX0JLy8JZnVuY3Rpb24gYWRkQ2FjaGVEYXRhKCkNCg0KDQoJLyoqDQoJICogSXMgYSB2YWx1ZSBzZXQgaW4gdGhlIGN1cnJlbnQgUEhQRXhjZWxfQ2FjaGVkT2JqZWN0U3RvcmFnZV9JQ2FjaGUgZm9yIGFuIGluZGV4ZWQgY2VsbD8NCgkgKg0KCSAqIEBwYXJhbQlzdHJpbmcJCSRwQ29vcmQJCUNvb3JkaW5hdGUgYWRkcmVzcyBvZiB0aGUgY2VsbCB0byBjaGVjaw0KCSAqIEByZXR1cm4Jdm9pZA0KCSAqIEByZXR1cm4JYm9vbGVhbg0KCSAqLw0KCXB1YmxpYyBmdW5jdGlvbiBpc0RhdGFTZXQoJHBDb29yZCkgew0KCQkvLwlDaGVjayBpZiB0aGUgcmVxdWVzdGVkIGVudHJ5IGlzIHRoZSBjdXJyZW50IG9iamVjdCwgb3IgZXhpc3RzIGluIHRoZSBjYWNoZQ0KCQlpZiAocGFyZW50Ojppc0RhdGFTZXQoJHBDb29yZCkpIHsNCgkJCWlmICgkdGhpcy0+X2N1cnJlbnRPYmplY3RJRCA9PSAkcENvb3JkKSB7DQoJCQkJcmV0dXJuIHRydWU7DQoJCQl9DQoJCQkvLwlDaGVjayBpZiB0aGUgcmVxdWVzdGVkIGVudHJ5IHN0aWxsIGV4aXN0cyBpbiBNZW1jYWNoZQ0KCQkJJHN1Y2Nlc3MgPSAkdGhpcy0+X21lbWNhY2hlLT5nZXQoJHRoaXMtPl9jYWNoZVByZWZpeC4kcENvb3JkLicuY2FjaGUnKTsNCgkJCWlmICgkc3VjY2VzcyA9PT0gZmFsc2UpIHsNCgkJCQkvLwlFbnRyeSBubyBsb25nZXIgZXhpc3RzIGluIE1lbWNhY2hlLCBzbyBjbGVhciBpdCBmcm9tIHRoZSBjYWNoZSBhcnJheQ0KCQkJCXBhcmVudDo6ZGVsZXRlQ2FjaGVEYXRhKCRwQ29vcmQpOw0KCQkJCXRocm93IG5ldyBFeGNlcHRpb24oJ0NlbGwgZW50cnkgJy4kcENvb3JkLicgbm8gbG9uZ2VyIGV4aXN0cyBpbiBNZW1DYWNoZScpOw0KCQkJfQ0KCQkJcmV0dXJuIHRydWU7DQoJCX0NCgkJcmV0dXJuIGZhbHNlOw0KCX0JLy8JZnVuY3Rpb24gaXNEYXRhU2V0KCkNCg0KDQoJLyoqDQogICAgICogR2V0IGNlbGwgYXQgYSBzcGVjaWZpYyBjb29yZGluYXRlDQogICAgICoNCiAgICAgKiBAcGFyYW0gCXN0cmluZyAJCQkkcENvb3JkCQlDb29yZGluYXRlIG9mIHRoZSBjZWxsDQogICAgICogQHRocm93cyAJRXhjZXB0aW9uDQogICAgICogQHJldHVybiAJUEhQRXhjZWxfQ2VsbCAJQ2VsbCB0aGF0IHdhcyBmb3VuZCwgb3IgbnVsbCBpZiBub3QgZm91bmQNCiAgICAgKi8NCglwdWJsaWMgZnVuY3Rpb24gZ2V0Q2FjaGVEYXRhKCRwQ29vcmQpIHsNCgkJaWYgKCRwQ29vcmQgPT09ICR0aGlzLT5fY3VycmVudE9iamVjdElEKSB7DQoJCQlyZXR1cm4gJHRoaXMtPl9jdXJyZW50T2JqZWN0Ow0KCQl9DQoJCSR0aGlzLT5fc3RvcmVEYXRhKCk7DQoNCgkJLy8JQ2hlY2sgaWYgdGhlIGVudHJ5IHRoYXQgaGFzIGJlZW4gcmVxdWVzdGVkIGFjdHVhbGx5IGV4aXN0cw0KCQlpZiAocGFyZW50Ojppc0RhdGFTZXQoJHBDb29yZCkpIHsNCgkJCSRvYmogPSAkdGhpcy0+X21lbWNhY2hlLT5nZXQoJHRoaXMtPl9jYWNoZVByZWZpeC4kcENvb3JkLicuY2FjaGUnKTsNCgkJCWlmICgkb2JqID09PSBmYWxzZSkgew0KCQkJCS8vCUVudHJ5IG5vIGxvbmdlciBleGlzdHMgaW4gTWVtY2FjaGUsIHNvIGNsZWFyIGl0IGZyb20gdGhlIGNhY2hlIGFycmF5DQoJCQkJcGFyZW50OjpkZWxldGVDYWNoZURhdGEoJHBDb29yZCk7DQoJCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbignQ2VsbCBlbnRyeSAnLiRwQ29vcmQuJyBubyBsb25nZXIgZXhpc3RzIGluIE1lbUNhY2hlJyk7DQoJCQl9DQoJCX0gZWxzZSB7DQoJCQkvLwlSZXR1cm4gbnVsbCBpZiByZXF1ZXN0ZWQgZW50cnkgZG9lc24ndCBleGlzdCBpbiBjYWNoZQ0KCQkJcmV0dXJuIG51bGw7DQoJCX0NCg0KCQkvLwlTZXQgY3VycmVudCBlbnRyeSB0byB0aGUgcmVxdWVzdGVkIGVudHJ5DQoJCSR0aGlzLT5fY3VycmVudE9iamVjdElEID0gJHBDb29yZDsNCgkJJHRoaXMtPl9jdXJyZW50T2JqZWN0ID0gdW5zZXJpYWxpemUoJG9iaik7DQoJCS8vCVJlLWF0dGFjaCB0aGUgcGFyZW50IHdvcmtzaGVldA0KCQkkdGhpcy0+X2N1cnJlbnRPYmplY3QtPmF0dGFjaCgkdGhpcy0+X3BhcmVudCk7DQoNCgkJLy8JUmV0dXJuIHJlcXVlc3RlZCBlbnRyeQ0KCQlyZXR1cm4gJHRoaXMtPl9jdXJyZW50T2JqZWN0Ow0KCX0JLy8JZnVuY3Rpb24gZ2V0Q2FjaGVEYXRhKCkNCg0KDQogICAgLyoqDQogICAgICogRGVsZXRlIGEgY2VsbCBpbiBjYWNoZSBpZGVudGlmaWVkIGJ5IGNvb3JkaW5hdGUgYWRkcmVzcw0KICAgICAqDQogICAgICogQHBhcmFtCXN0cmluZwkJCSRwQ29vcmQJCUNvb3JkaW5hdGUgYWRkcmVzcyBvZiB0aGUgY2VsbCB0byBkZWxldGUNCiAgICAgKiBAdGhyb3dzCUV4Y2VwdGlvbg0KICAgICAqLw0KCXB1YmxpYyBmdW5jdGlvbiBkZWxldGVDYWNoZURhdGEoJHBDb29yZCkgew0KCQkvLwlEZWxldGUgdGhlIGVudHJ5IGZyb20gTWVtY2FjaGUNCgkJJHRoaXMtPl9tZW1jYWNoZS0+ZGVsZXRlKCR0aGlzLT5fY2FjaGVQcmVmaXguJHBDb29yZC4nLmNhY2hlJyk7DQoNCgkJLy8JRGVsZXRlIHRoZSBlbnRyeSBmcm9tIG91ciBjZWxsIGFkZHJlc3MgYXJyYXkNCgkJcGFyZW50OjpkZWxldGVDYWNoZURhdGEoJHBDb29yZCk7DQoJfQkvLwlmdW5jdGlvbiBkZWxldGVDYWNoZURhdGEoKQ0KDQoNCgkvKioNCgkgKiBDbG9uZSB0aGUgY2VsbCBjb2xsZWN0aW9uDQoJICoNCgkgKiBAcGFyYW0JUEhQRXhjZWxfV29ya3NoZWV0CSRwYXJlbnQJCVRoZSBuZXcgd29ya3NoZWV0DQoJICogQHJldHVybgl2b2lkDQoJICovDQoJcHVibGljIGZ1bmN0aW9uIGNvcHlDZWxsQ29sbGVjdGlvbihQSFBFeGNlbF9Xb3Jrc2hlZXQgJHBhcmVudCkgew0KCQlwYXJlbnQ6OmNvcHlDZWxsQ29sbGVjdGlvbigkcGFyZW50KTsNCgkJLy8JR2V0IGEgbmV3IGlkIGZvciB0aGUgbmV3IGZpbGUgbmFtZQ0KCQkkYmFzZVVuaXF1ZSA9ICR0aGlzLT5fZ2V0VW5pcXVlSUQoKTsNCgkJJG5ld0NhY2hlUHJlZml4ID0gc3Vic3RyKG1kNSgkYmFzZVVuaXF1ZSksMCw4KS4nLic7DQoJCSRjYWNoZUxpc3QgPSAkdGhpcy0+Z2V0Q2VsbExpc3QoKTsNCgkJZm9yZWFjaCgkY2FjaGVMaXN0IGFzICRjZWxsSUQpIHsNCgkJCWlmICgkY2VsbElEICE9ICR0aGlzLT5fY3VycmVudE9iamVjdElEKSB7DQoJCQkJJG9iaiA9ICR0aGlzLT5fbWVtY2FjaGUtPmdldCgkdGhpcy0+X2NhY2hlUHJlZml4LiRjZWxsSUQuJy5jYWNoZScpOw0KCQkJCWlmICgkb2JqID09PSBmYWxzZSkgew0KCQkJCQkvLwlFbnRyeSBubyBsb25nZXIgZXhpc3RzIGluIE1lbWNhY2hlLCBzbyBjbGVhciBpdCBmcm9tIHRoZSBjYWNoZSBhcnJheQ0KCQkJCQlwYXJlbnQ6OmRlbGV0ZUNhY2hlRGF0YSgkY2VsbElEKTsNCgkJCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbignQ2VsbCBlbnRyeSAnLiRjZWxsSUQuJyBubyBsb25nZXIgZXhpc3RzIGluIE1lbUNhY2hlJyk7DQoJCQkJfQ0KCQkJCWlmICghJHRoaXMtPl9tZW1jYWNoZS0+YWRkKCRuZXdDYWNoZVByZWZpeC4kY2VsbElELicuY2FjaGUnLCRvYmosTlVMTCwkdGhpcy0+X2NhY2hlVGltZSkpIHsNCgkJCQkJJHRoaXMtPl9fZGVzdHJ1Y3QoKTsNCgkJCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbignRmFpbGVkIHRvIHN0b3JlIGNlbGwgJy4kY2VsbElELicgaW4gTWVtQ2FjaGUnKTsNCgkJCQl9DQoJCQl9DQoJCX0NCgkJJHRoaXMtPl9jYWNoZVByZWZpeCA9ICRuZXdDYWNoZVByZWZpeDsNCgl9CS8vCWZ1bmN0aW9uIGNvcHlDZWxsQ29sbGVjdGlvbigpDQoNCg0KCS8qKg0KCSAqIENsZWFyIHRoZSBjZWxsIGNvbGxlY3Rpb24gYW5kIGRpc2Nvbm5lY3QgZnJvbSBvdXIgcGFyZW50DQoJICoNCgkgKiBAcmV0dXJuCXZvaWQNCgkgKi8NCglwdWJsaWMgZnVuY3Rpb24gdW5zZXRXb3Jrc2hlZXRDZWxscygpIHsNCgkJaWYoIWlzX251bGwoJHRoaXMtPl9jdXJyZW50T2JqZWN0KSkgew0KCQkJJHRoaXMtPl9jdXJyZW50T2JqZWN0LT5kZXRhY2goKTsNCgkJCSR0aGlzLT5fY3VycmVudE9iamVjdCA9ICR0aGlzLT5fY3VycmVudE9iamVjdElEID0gbnVsbDsNCgkJfQ0KDQoJCS8vCUZsdXNoIHRoZSBNZW1jYWNoZSBjYWNoZQ0KCQkkdGhpcy0+X19kZXN0cnVjdCgpOw0KDQoJCSR0aGlzLT5fY2VsbENhY2hlID0gYXJyYXkoKTsNCg0KCQkvLwlkZXRhY2ggb3Vyc2VsZiBmcm9tIHRoZSB3b3Jrc2hlZXQsIHNvIHRoYXQgaXQgY2FuIHRoZW4gZGVsZXRlIHRoaXMgb2JqZWN0IHN1Y2Nlc3NmdWxseQ0KCQkkdGhpcy0+X3BhcmVudCA9IG51bGw7DQoJfQkvLwlmdW5jdGlvbiB1bnNldFdvcmtzaGVldENlbGxzKCkNCg0KDQoJLyoqDQoJICogSW5pdGlhbGlzZSB0aGlzIG5ldyBjZWxsIGNvbGxlY3Rpb24NCgkgKg0KCSAqIEBwYXJhbQlQSFBFeGNlbF9Xb3Jrc2hlZXQJJHBhcmVudAkJVGhlIHdvcmtzaGVldCBmb3IgdGhpcyBjZWxsIGNvbGxlY3Rpb24NCgkgKiBAcGFyYW0JYXJyYXkgb2YgbWl4ZWQJCSRhcmd1bWVudHMJQWRkaXRpb25hbCBpbml0aWFsaXNhdGlvbiBhcmd1bWVudHMNCgkgKi8NCglwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoUEhQRXhjZWxfV29ya3NoZWV0ICRwYXJlbnQsICRhcmd1bWVudHMpIHsNCgkJJG1lbWNhY2hlU2VydmVyCT0gKGlzc2V0KCRhcmd1bWVudHNbJ21lbWNhY2hlU2VydmVyJ10pKQk/ICRhcmd1bWVudHNbJ21lbWNhY2hlU2VydmVyJ10JOiAnbG9jYWxob3N0JzsNCgkJJG1lbWNhY2hlUG9ydAk9IChpc3NldCgkYXJndW1lbnRzWydtZW1jYWNoZVBvcnQnXSkpCT8gJGFyZ3VtZW50c1snbWVtY2FjaGVQb3J0J10JOiAxMTIxMTsNCgkJJGNhY2hlVGltZQkJPSAoaXNzZXQoJGFyZ3VtZW50c1snY2FjaGVUaW1lJ10pKQkJPyAkYXJndW1lbnRzWydjYWNoZVRpbWUnXQkJOiA2MDA7DQoNCgkJaWYgKGlzX251bGwoJHRoaXMtPl9jYWNoZVByZWZpeCkpIHsNCgkJCSRiYXNlVW5pcXVlID0gJHRoaXMtPl9nZXRVbmlxdWVJRCgpOw0KCQkJJHRoaXMtPl9jYWNoZVByZWZpeCA9IHN1YnN0cihtZDUoJGJhc2VVbmlxdWUpLDAsOCkuJy4nOw0KDQoJCQkvLwlTZXQgYSBuZXcgTWVtY2FjaGUgb2JqZWN0IGFuZCBjb25uZWN0IHRvIHRoZSBNZW1jYWNoZSBzZXJ2ZXINCgkJCSR0aGlzLT5fbWVtY2FjaGUgPSBuZXcgTWVtY2FjaGUoKTsNCgkJCWlmICghJHRoaXMtPl9tZW1jYWNoZS0+YWRkU2VydmVyKCRtZW1jYWNoZVNlcnZlciwgJG1lbWNhY2hlUG9ydCwgZmFsc2UsIDUwLCA1LCA1LCB0cnVlLCBhcnJheSgkdGhpcywgJ2ZhaWx1cmVDYWxsYmFjaycpKSkgew0KCQkJCXRocm93IG5ldyBFeGNlcHRpb24oJ0NvdWxkIG5vdCBjb25uZWN0IHRvIE1lbUNhY2hlIHNlcnZlciBhdCAnLiRtZW1jYWNoZVNlcnZlci4nOicuJG1lbWNhY2hlUG9ydCk7DQoJCQl9DQoJCQkkdGhpcy0+X2NhY2hlVGltZSA9ICRjYWNoZVRpbWU7DQoNCgkJCXBhcmVudDo6X19jb25zdHJ1Y3QoJHBhcmVudCk7DQoJCX0NCgl9CS8vCWZ1bmN0aW9uIF9fY29uc3RydWN0KCkNCg0KDQoJLyoqDQoJICogTWVtY2FjaGUgZXJyb3IgaGFuZGxlcg0KCSAqDQoJICogQHBhcmFtCXN0cmluZwkkaG9zdAkJTWVtY2FjaGUgc2VydmVyDQoJICogQHBhcmFtCWludGVnZXIJJHBvcnQJCU1lbWNhY2hlIHBvcnQNCiAgICAgKiBAdGhyb3dzCUV4Y2VwdGlvbg0KCSAqLw0KCXB1YmxpYyBmdW5jdGlvbiBmYWlsdXJlQ2FsbGJhY2soJGhvc3QsICRwb3J0KSB7DQoJCXRocm93IG5ldyBFeGNlcHRpb24oJ21lbWNhY2hlICcuJGhvc3QuJzonLiRwb3J0LicgZmFpbGVkJyk7DQoJfQ0KDQoNCgkvKioNCgkgKiBEZXN0cm95IHRoaXMgY2VsbCBjb2xsZWN0aW9uDQoJICovDQoJcHVibGljIGZ1bmN0aW9uIF9fZGVzdHJ1Y3QoKSB7DQoJCSRjYWNoZUxpc3QgPSAkdGhpcy0+Z2V0Q2VsbExpc3QoKTsNCgkJZm9yZWFjaCgkY2FjaGVMaXN0IGFzICRjZWxsSUQpIHsNCgkJCSR0aGlzLT5fbWVtY2FjaGUtPmRlbGV0ZSgkdGhpcy0+X2NhY2hlUHJlZml4LiRjZWxsSUQuJy5jYWNoZScpOw0KCQl9DQoJfQkvLwlmdW5jdGlvbiBfX2Rlc3RydWN0KCkNCg0KCS8qKg0KCSAqIElkZW50aWZ5IHdoZXRoZXIgdGhlIGNhY2hpbmcgbWV0aG9kIGlzIGN1cnJlbnRseSBhdmFpbGFibGUNCgkgKiBTb21lIG1ldGhvZHMgYXJlIGRlcGVuZGVudCBvbiB0aGUgYXZhaWxhYmlsaXR5IG9mIGNlcnRhaW4gZXh0ZW5zaW9ucyBiZWluZyBlbmFibGVkIGluIHRoZSBQSFAgYnVpbGQNCgkgKg0KCSAqIEByZXR1cm4JYm9vbGVhbg0KCSAqLw0KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gY2FjaGVNZXRob2RJc0F2YWlsYWJsZSgpIHsNCgkJaWYgKCFmdW5jdGlvbl9leGlzdHMoJ21lbWNhY2hlX2FkZCcpKSB7DQoJCQlyZXR1cm4gZmFsc2U7DQoJCX0NCg0KCQlyZXR1cm4gdHJ1ZTsNCgl9DQoNCn0NCg==]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/CachedObjectStorage/Memory.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCi8qKg0KICogUEhQRXhjZWwNCiAqDQogKiBDb3B5cmlnaHQgKGMpIDIwMDYgLSAyMDEyIFBIUEV4Y2VsDQogKg0KICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcg0KICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYw0KICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyDQogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4NCiAqDQogKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwNCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mDQogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQ0KICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4NCiAqDQogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljDQogKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlDQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0ENCiAqDQogKiBAY2F0ZWdvcnkgICBQSFBFeGNlbA0KICogQHBhY2thZ2UgICAgUEhQRXhjZWxfQ2FjaGVkT2JqZWN0U3RvcmFnZQ0KICogQGNvcHlyaWdodCAgQ29weXJpZ2h0IChjKSAyMDA2IC0gMjAxMiBQSFBFeGNlbCAoaHR0cDovL3d3dy5jb2RlcGxleC5jb20vUEhQRXhjZWwpDQogKiBAbGljZW5zZSAgICBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvb2xkLWxpY2Vuc2VzL2xncGwtMi4xLnR4dAlMR1BMDQogKiBAdmVyc2lvbiAgICAxLjcuNywgMjAxMi0wNS0xOQ0KICovDQoNCg0KLyoqDQogKiBQSFBFeGNlbF9DYWNoZWRPYmplY3RTdG9yYWdlX01lbW9yeQ0KICoNCiAqIEBjYXRlZ29yeSAgIFBIUEV4Y2VsDQogKiBAcGFja2FnZSAgICBQSFBFeGNlbF9DYWNoZWRPYmplY3RTdG9yYWdlDQogKiBAY29weXJpZ2h0ICBDb3B5cmlnaHQgKGMpIDIwMDYgLSAyMDEyIFBIUEV4Y2VsIChodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9QSFBFeGNlbCkNCiAqLw0KY2xhc3MgUEhQRXhjZWxfQ2FjaGVkT2JqZWN0U3RvcmFnZV9NZW1vcnkgZXh0ZW5kcyBQSFBFeGNlbF9DYWNoZWRPYmplY3RTdG9yYWdlX0NhY2hlQmFzZSBpbXBsZW1lbnRzIFBIUEV4Y2VsX0NhY2hlZE9iamVjdFN0b3JhZ2VfSUNhY2hlIHsNCg0KICAgIC8qKg0KICAgICAqIEFkZCBvciBVcGRhdGUgYSBjZWxsIGluIGNhY2hlIGlkZW50aWZpZWQgYnkgY29vcmRpbmF0ZSBhZGRyZXNzDQogICAgICoNCiAgICAgKiBAcGFyYW0Jc3RyaW5nCQkJJHBDb29yZAkJQ29vcmRpbmF0ZSBhZGRyZXNzIG9mIHRoZSBjZWxsIHRvIHVwZGF0ZQ0KICAgICAqIEBwYXJhbQlQSFBFeGNlbF9DZWxsCSRjZWxsCQlDZWxsIHRvIHVwZGF0ZQ0KCSAqIEByZXR1cm4Jdm9pZA0KICAgICAqIEB0aHJvd3MJRXhjZXB0aW9uDQogICAgICovDQoJcHVibGljIGZ1bmN0aW9uIGFkZENhY2hlRGF0YSgkcENvb3JkLCBQSFBFeGNlbF9DZWxsICRjZWxsKSB7DQoJCSR0aGlzLT5fY2VsbENhY2hlWyRwQ29vcmRdID0gJGNlbGw7DQoJCXJldHVybiAkY2VsbDsNCgl9CS8vCWZ1bmN0aW9uIGFkZENhY2hlRGF0YSgpDQoNCg0KICAgIC8qKg0KICAgICAqIEdldCBjZWxsIGF0IGEgc3BlY2lmaWMgY29vcmRpbmF0ZQ0KICAgICAqDQogICAgICogQHBhcmFtIAlzdHJpbmcgCQkJJHBDb29yZAkJQ29vcmRpbmF0ZSBvZiB0aGUgY2VsbA0KICAgICAqIEB0aHJvd3MgCUV4Y2VwdGlvbg0KICAgICAqIEByZXR1cm4gCVBIUEV4Y2VsX0NlbGwgCUNlbGwgdGhhdCB3YXMgZm91bmQsIG9yIG51bGwgaWYgbm90IGZvdW5kDQogICAgICovDQoJcHVibGljIGZ1bmN0aW9uIGdldENhY2hlRGF0YSgkcENvb3JkKSB7DQoJCS8vCUNoZWNrIGlmIHRoZSBlbnRyeSB0aGF0IGhhcyBiZWVuIHJlcXVlc3RlZCBhY3R1YWxseSBleGlzdHMNCgkJaWYgKCFpc3NldCgkdGhpcy0+X2NlbGxDYWNoZVskcENvb3JkXSkpIHsNCgkJCS8vCVJldHVybiBudWxsIGlmIHJlcXVlc3RlZCBlbnRyeSBkb2Vzbid0IGV4aXN0IGluIGNhY2hlDQoJCQlyZXR1cm4gbnVsbDsNCgkJfQ0KDQoJCS8vCVJldHVybiByZXF1ZXN0ZWQgZW50cnkNCgkJcmV0dXJuICR0aGlzLT5fY2VsbENhY2hlWyRwQ29vcmRdOw0KCX0JLy8JZnVuY3Rpb24gZ2V0Q2FjaGVEYXRhKCkNCg0KDQoJLyoqDQoJICogQ2xvbmUgdGhlIGNlbGwgY29sbGVjdGlvbg0KCSAqDQoJICogQHBhcmFtCVBIUEV4Y2VsX1dvcmtzaGVldAkkcGFyZW50CQlUaGUgbmV3IHdvcmtzaGVldA0KCSAqIEByZXR1cm4Jdm9pZA0KCSAqLw0KCXB1YmxpYyBmdW5jdGlvbiBjb3B5Q2VsbENvbGxlY3Rpb24oUEhQRXhjZWxfV29ya3NoZWV0ICRwYXJlbnQpIHsNCgkJcGFyZW50Ojpjb3B5Q2VsbENvbGxlY3Rpb24oJHBhcmVudCk7DQoNCgkJJG5ld0NvbGxlY3Rpb24gPSBhcnJheSgpOw0KCQlmb3JlYWNoKCR0aGlzLT5fY2VsbENhY2hlIGFzICRrID0+ICYkY2VsbCkgew0KCQkJJG5ld0NvbGxlY3Rpb25bJGtdID0gY2xvbmUgJGNlbGw7DQoJCQkkbmV3Q29sbGVjdGlvblska10tPmF0dGFjaCgkcGFyZW50KTsNCgkJfQ0KDQoJCSR0aGlzLT5fY2VsbENhY2hlID0gJG5ld0NvbGxlY3Rpb247DQoJfQ0KDQoNCgkvKioNCgkgKiBDbGVhciB0aGUgY2VsbCBjb2xsZWN0aW9uIGFuZCBkaXNjb25uZWN0IGZyb20gb3VyIHBhcmVudA0KCSAqDQoJICogQHJldHVybgl2b2lkDQoJICovDQoJcHVibGljIGZ1bmN0aW9uIHVuc2V0V29ya3NoZWV0Q2VsbHMoKSB7DQoJCS8vCUJlY2F1c2UgY2VsbHMgYXJlIGFsbCBzdG9yZWQgYXMgaW50YWN0IG9iamVjdHMgaW4gbWVtb3J5LCB3ZSBuZWVkIHRvIGRldGFjaCBlYWNoIG9uZSBmcm9tIHRoZSBwYXJlbnQNCgkJZm9yZWFjaCgkdGhpcy0+X2NlbGxDYWNoZSBhcyAkayA9PiAmJGNlbGwpIHsNCgkJCSRjZWxsLT5kZXRhY2goKTsNCgkJCSR0aGlzLT5fY2VsbENhY2hlWyRrXSA9IG51bGw7DQoJCX0NCgkJdW5zZXQoJGNlbGwpOw0KDQoJCSR0aGlzLT5fY2VsbENhY2hlID0gYXJyYXkoKTsNCg0KCQkvLwlkZXRhY2ggb3Vyc2VsZiBmcm9tIHRoZSB3b3Jrc2hlZXQsIHNvIHRoYXQgaXQgY2FuIHRoZW4gZGVsZXRlIHRoaXMgb2JqZWN0IHN1Y2Nlc3NmdWxseQ0KCQkkdGhpcy0+X3BhcmVudCA9IG51bGw7DQoJfQkvLwlmdW5jdGlvbiB1bnNldFdvcmtzaGVldENlbGxzKCkNCg0KfQ0K]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/CachedObjectStorage/MemoryGZip.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCi8qKg0KICogUEhQRXhjZWwNCiAqDQogKiBDb3B5cmlnaHQgKGMpIDIwMDYgLSAyMDEyIFBIUEV4Y2VsDQogKg0KICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcg0KICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYw0KICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyDQogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4NCiAqDQogKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwNCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mDQogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQ0KICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4NCiAqDQogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljDQogKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlDQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0ENCiAqDQogKiBAY2F0ZWdvcnkgICBQSFBFeGNlbA0KICogQHBhY2thZ2UgICAgUEhQRXhjZWxfQ2FjaGVkT2JqZWN0U3RvcmFnZQ0KICogQGNvcHlyaWdodCAgQ29weXJpZ2h0IChjKSAyMDA2IC0gMjAxMiBQSFBFeGNlbCAoaHR0cDovL3d3dy5jb2RlcGxleC5jb20vUEhQRXhjZWwpDQogKiBAbGljZW5zZSAgICBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvb2xkLWxpY2Vuc2VzL2xncGwtMi4xLnR4dAlMR1BMDQogKiBAdmVyc2lvbiAgICAxLjcuNywgMjAxMi0wNS0xOQ0KICovDQoNCg0KLyoqDQogKiBQSFBFeGNlbF9DYWNoZWRPYmplY3RTdG9yYWdlX01lbW9yeUdaaXANCiAqDQogKiBAY2F0ZWdvcnkgICBQSFBFeGNlbA0KICogQHBhY2thZ2UgICAgUEhQRXhjZWxfQ2FjaGVkT2JqZWN0U3RvcmFnZQ0KICogQGNvcHlyaWdodCAgQ29weXJpZ2h0IChjKSAyMDA2IC0gMjAxMiBQSFBFeGNlbCAoaHR0cDovL3d3dy5jb2RlcGxleC5jb20vUEhQRXhjZWwpDQogKi8NCmNsYXNzIFBIUEV4Y2VsX0NhY2hlZE9iamVjdFN0b3JhZ2VfTWVtb3J5R1ppcCBleHRlbmRzIFBIUEV4Y2VsX0NhY2hlZE9iamVjdFN0b3JhZ2VfQ2FjaGVCYXNlIGltcGxlbWVudHMgUEhQRXhjZWxfQ2FjaGVkT2JqZWN0U3RvcmFnZV9JQ2FjaGUgew0KDQogICAgLyoqDQogICAgICogU3RvcmUgY2VsbCBkYXRhIGluIGNhY2hlIGZvciB0aGUgY3VycmVudCBjZWxsIG9iamVjdCBpZiBpdCdzICJkaXJ0eSIsDQogICAgICogICAgIGFuZCB0aGUgJ251bGxpZnknIHRoZSBjdXJyZW50IGNlbGwgb2JqZWN0DQogICAgICoNCgkgKiBAcmV0dXJuCXZvaWQNCiAgICAgKiBAdGhyb3dzCUV4Y2VwdGlvbg0KICAgICAqLw0KCXByaXZhdGUgZnVuY3Rpb24gX3N0b3JlRGF0YSgpIHsNCgkJaWYgKCR0aGlzLT5fY3VycmVudENlbGxJc0RpcnR5KSB7DQoJCQkkdGhpcy0+X2N1cnJlbnRPYmplY3QtPmRldGFjaCgpOw0KDQoJCQkkdGhpcy0+X2NlbGxDYWNoZVskdGhpcy0+X2N1cnJlbnRPYmplY3RJRF0gPSBnemRlZmxhdGUoc2VyaWFsaXplKCR0aGlzLT5fY3VycmVudE9iamVjdCkpOw0KCQkJJHRoaXMtPl9jdXJyZW50Q2VsbElzRGlydHkgPSBmYWxzZTsNCgkJfQ0KCQkkdGhpcy0+X2N1cnJlbnRPYmplY3RJRCA9ICR0aGlzLT5fY3VycmVudE9iamVjdCA9IG51bGw7DQoJfQkvLwlmdW5jdGlvbiBfc3RvcmVEYXRhKCkNCg0KDQogICAgLyoqDQogICAgICogQWRkIG9yIFVwZGF0ZSBhIGNlbGwgaW4gY2FjaGUgaWRlbnRpZmllZCBieSBjb29yZGluYXRlIGFkZHJlc3MNCiAgICAgKg0KICAgICAqIEBwYXJhbQlzdHJpbmcJCQkkcENvb3JkCQlDb29yZGluYXRlIGFkZHJlc3Mgb2YgdGhlIGNlbGwgdG8gdXBkYXRlDQogICAgICogQHBhcmFtCVBIUEV4Y2VsX0NlbGwJJGNlbGwJCUNlbGwgdG8gdXBkYXRlDQoJICogQHJldHVybgl2b2lkDQogICAgICogQHRocm93cwlFeGNlcHRpb24NCiAgICAgKi8NCglwdWJsaWMgZnVuY3Rpb24gYWRkQ2FjaGVEYXRhKCRwQ29vcmQsIFBIUEV4Y2VsX0NlbGwgJGNlbGwpIHsNCgkJaWYgKCgkcENvb3JkICE9PSAkdGhpcy0+X2N1cnJlbnRPYmplY3RJRCkgJiYgKCR0aGlzLT5fY3VycmVudE9iamVjdElEICE9PSBudWxsKSkgew0KCQkJJHRoaXMtPl9zdG9yZURhdGEoKTsNCgkJfQ0KDQoJCSR0aGlzLT5fY3VycmVudE9iamVjdElEID0gJHBDb29yZDsNCgkJJHRoaXMtPl9jdXJyZW50T2JqZWN0ID0gJGNlbGw7DQoJCSR0aGlzLT5fY3VycmVudENlbGxJc0RpcnR5ID0gdHJ1ZTsNCg0KCQlyZXR1cm4gJGNlbGw7DQoJfQkvLwlmdW5jdGlvbiBhZGRDYWNoZURhdGEoKQ0KDQoNCiAgICAvKioNCiAgICAgKiBHZXQgY2VsbCBhdCBhIHNwZWNpZmljIGNvb3JkaW5hdGUNCiAgICAgKg0KICAgICAqIEBwYXJhbSAJc3RyaW5nIAkJCSRwQ29vcmQJCUNvb3JkaW5hdGUgb2YgdGhlIGNlbGwNCiAgICAgKiBAdGhyb3dzIAlFeGNlcHRpb24NCiAgICAgKiBAcmV0dXJuIAlQSFBFeGNlbF9DZWxsIAlDZWxsIHRoYXQgd2FzIGZvdW5kLCBvciBudWxsIGlmIG5vdCBmb3VuZA0KICAgICAqLw0KCXB1YmxpYyBmdW5jdGlvbiBnZXRDYWNoZURhdGEoJHBDb29yZCkgew0KCQlpZiAoJHBDb29yZCA9PT0gJHRoaXMtPl9jdXJyZW50T2JqZWN0SUQpIHsNCgkJCXJldHVybiAkdGhpcy0+X2N1cnJlbnRPYmplY3Q7DQoJCX0NCgkJJHRoaXMtPl9zdG9yZURhdGEoKTsNCg0KCQkvLwlDaGVjayBpZiB0aGUgZW50cnkgdGhhdCBoYXMgYmVlbiByZXF1ZXN0ZWQgYWN0dWFsbHkgZXhpc3RzDQoJCWlmICghaXNzZXQoJHRoaXMtPl9jZWxsQ2FjaGVbJHBDb29yZF0pKSB7DQoJCQkvLwlSZXR1cm4gbnVsbCBpZiByZXF1ZXN0ZWQgZW50cnkgZG9lc24ndCBleGlzdCBpbiBjYWNoZQ0KCQkJcmV0dXJuIG51bGw7DQoJCX0NCg0KCQkvLwlTZXQgY3VycmVudCBlbnRyeSB0byB0aGUgcmVxdWVzdGVkIGVudHJ5DQoJCSR0aGlzLT5fY3VycmVudE9iamVjdElEID0gJHBDb29yZDsNCgkJJHRoaXMtPl9jdXJyZW50T2JqZWN0ID0gdW5zZXJpYWxpemUoZ3ppbmZsYXRlKCR0aGlzLT5fY2VsbENhY2hlWyRwQ29vcmRdKSk7DQoJCS8vCVJlLWF0dGFjaCB0aGUgcGFyZW50IHdvcmtzaGVldA0KCQkkdGhpcy0+X2N1cnJlbnRPYmplY3QtPmF0dGFjaCgkdGhpcy0+X3BhcmVudCk7DQoNCgkJLy8JUmV0dXJuIHJlcXVlc3RlZCBlbnRyeQ0KCQlyZXR1cm4gJHRoaXMtPl9jdXJyZW50T2JqZWN0Ow0KCX0JLy8JZnVuY3Rpb24gZ2V0Q2FjaGVEYXRhKCkNCg0KDQoJLyoqDQoJICogQ2xlYXIgdGhlIGNlbGwgY29sbGVjdGlvbiBhbmQgZGlzY29ubmVjdCBmcm9tIG91ciBwYXJlbnQNCgkgKg0KCSAqIEByZXR1cm4Jdm9pZA0KCSAqLw0KCXB1YmxpYyBmdW5jdGlvbiB1bnNldFdvcmtzaGVldENlbGxzKCkgew0KCQlpZighaXNfbnVsbCgkdGhpcy0+X2N1cnJlbnRPYmplY3QpKSB7DQoJCQkkdGhpcy0+X2N1cnJlbnRPYmplY3QtPmRldGFjaCgpOw0KCQkJJHRoaXMtPl9jdXJyZW50T2JqZWN0ID0gJHRoaXMtPl9jdXJyZW50T2JqZWN0SUQgPSBudWxsOw0KCQl9DQoJCSR0aGlzLT5fY2VsbENhY2hlID0gYXJyYXkoKTsNCg0KCQkvLwlkZXRhY2ggb3Vyc2VsZiBmcm9tIHRoZSB3b3Jrc2hlZXQsIHNvIHRoYXQgaXQgY2FuIHRoZW4gZGVsZXRlIHRoaXMgb2JqZWN0IHN1Y2Nlc3NmdWxseQ0KCQkkdGhpcy0+X3BhcmVudCA9IG51bGw7DQoJfQkvLwlmdW5jdGlvbiB1bnNldFdvcmtzaGVldENlbGxzKCkNCg0KfQ0K]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/CachedObjectStorage/MemorySerialized.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCi8qKg0KICogUEhQRXhjZWwNCiAqDQogKiBDb3B5cmlnaHQgKGMpIDIwMDYgLSAyMDEyIFBIUEV4Y2VsDQogKg0KICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcg0KICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYw0KICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyDQogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4NCiAqDQogKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwNCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mDQogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQ0KICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4NCiAqDQogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljDQogKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlDQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0ENCiAqDQogKiBAY2F0ZWdvcnkgICBQSFBFeGNlbA0KICogQHBhY2thZ2UgICAgUEhQRXhjZWxfQ2FjaGVkT2JqZWN0U3RvcmFnZQ0KICogQGNvcHlyaWdodCAgQ29weXJpZ2h0IChjKSAyMDA2IC0gMjAxMiBQSFBFeGNlbCAoaHR0cDovL3d3dy5jb2RlcGxleC5jb20vUEhQRXhjZWwpDQogKiBAbGljZW5zZSAgICBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvb2xkLWxpY2Vuc2VzL2xncGwtMi4xLnR4dAlMR1BMDQogKiBAdmVyc2lvbiAgICAxLjcuNywgMjAxMi0wNS0xOQ0KICovDQoNCg0KLyoqDQogKiBQSFBFeGNlbF9DYWNoZWRPYmplY3RTdG9yYWdlX01lbW9yeVNlcmlhbGl6ZWQNCiAqDQogKiBAY2F0ZWdvcnkgICBQSFBFeGNlbA0KICogQHBhY2thZ2UgICAgUEhQRXhjZWxfQ2FjaGVkT2JqZWN0U3RvcmFnZQ0KICogQGNvcHlyaWdodCAgQ29weXJpZ2h0IChjKSAyMDA2IC0gMjAxMiBQSFBFeGNlbCAoaHR0cDovL3d3dy5jb2RlcGxleC5jb20vUEhQRXhjZWwpDQogKi8NCmNsYXNzIFBIUEV4Y2VsX0NhY2hlZE9iamVjdFN0b3JhZ2VfTWVtb3J5U2VyaWFsaXplZCBleHRlbmRzIFBIUEV4Y2VsX0NhY2hlZE9iamVjdFN0b3JhZ2VfQ2FjaGVCYXNlIGltcGxlbWVudHMgUEhQRXhjZWxfQ2FjaGVkT2JqZWN0U3RvcmFnZV9JQ2FjaGUgew0KDQogICAgLyoqDQogICAgICogU3RvcmUgY2VsbCBkYXRhIGluIGNhY2hlIGZvciB0aGUgY3VycmVudCBjZWxsIG9iamVjdCBpZiBpdCdzICJkaXJ0eSIsDQogICAgICogICAgIGFuZCB0aGUgJ251bGxpZnknIHRoZSBjdXJyZW50IGNlbGwgb2JqZWN0DQogICAgICoNCgkgKiBAcmV0dXJuCXZvaWQNCiAgICAgKiBAdGhyb3dzCUV4Y2VwdGlvbg0KICAgICAqLw0KCXByaXZhdGUgZnVuY3Rpb24gX3N0b3JlRGF0YSgpIHsNCgkJaWYgKCR0aGlzLT5fY3VycmVudENlbGxJc0RpcnR5KSB7DQoJCQkkdGhpcy0+X2N1cnJlbnRPYmplY3QtPmRldGFjaCgpOw0KDQoJCQkkdGhpcy0+X2NlbGxDYWNoZVskdGhpcy0+X2N1cnJlbnRPYmplY3RJRF0gPSBzZXJpYWxpemUoJHRoaXMtPl9jdXJyZW50T2JqZWN0KTsNCgkJCSR0aGlzLT5fY3VycmVudENlbGxJc0RpcnR5ID0gZmFsc2U7DQoJCX0NCgkJJHRoaXMtPl9jdXJyZW50T2JqZWN0SUQgPSAkdGhpcy0+X2N1cnJlbnRPYmplY3QgPSBudWxsOw0KCX0JLy8JZnVuY3Rpb24gX3N0b3JlRGF0YSgpDQoNCg0KICAgIC8qKg0KICAgICAqIEFkZCBvciBVcGRhdGUgYSBjZWxsIGluIGNhY2hlIGlkZW50aWZpZWQgYnkgY29vcmRpbmF0ZSBhZGRyZXNzDQogICAgICoNCiAgICAgKiBAcGFyYW0Jc3RyaW5nCQkJJHBDb29yZAkJQ29vcmRpbmF0ZSBhZGRyZXNzIG9mIHRoZSBjZWxsIHRvIHVwZGF0ZQ0KICAgICAqIEBwYXJhbQlQSFBFeGNlbF9DZWxsCSRjZWxsCQlDZWxsIHRvIHVwZGF0ZQ0KCSAqIEByZXR1cm4Jdm9pZA0KICAgICAqIEB0aHJvd3MJRXhjZXB0aW9uDQogICAgICovDQoJcHVibGljIGZ1bmN0aW9uIGFkZENhY2hlRGF0YSgkcENvb3JkLCBQSFBFeGNlbF9DZWxsICRjZWxsKSB7DQoJCWlmICgoJHBDb29yZCAhPT0gJHRoaXMtPl9jdXJyZW50T2JqZWN0SUQpICYmICgkdGhpcy0+X2N1cnJlbnRPYmplY3RJRCAhPT0gbnVsbCkpIHsNCgkJCSR0aGlzLT5fc3RvcmVEYXRhKCk7DQoJCX0NCg0KCQkkdGhpcy0+X2N1cnJlbnRPYmplY3RJRCA9ICRwQ29vcmQ7DQoJCSR0aGlzLT5fY3VycmVudE9iamVjdCA9ICRjZWxsOw0KCQkkdGhpcy0+X2N1cnJlbnRDZWxsSXNEaXJ0eSA9IHRydWU7DQoNCgkJcmV0dXJuICRjZWxsOw0KCX0JLy8JZnVuY3Rpb24gYWRkQ2FjaGVEYXRhKCkNCg0KDQogICAgLyoqDQogICAgICogR2V0IGNlbGwgYXQgYSBzcGVjaWZpYyBjb29yZGluYXRlDQogICAgICoNCiAgICAgKiBAcGFyYW0gCXN0cmluZyAJCQkkcENvb3JkCQlDb29yZGluYXRlIG9mIHRoZSBjZWxsDQogICAgICogQHRocm93cyAJRXhjZXB0aW9uDQogICAgICogQHJldHVybiAJUEhQRXhjZWxfQ2VsbCAJQ2VsbCB0aGF0IHdhcyBmb3VuZCwgb3IgbnVsbCBpZiBub3QgZm91bmQNCiAgICAgKi8NCglwdWJsaWMgZnVuY3Rpb24gZ2V0Q2FjaGVEYXRhKCRwQ29vcmQpIHsNCgkJaWYgKCRwQ29vcmQgPT09ICR0aGlzLT5fY3VycmVudE9iamVjdElEKSB7DQoJCQlyZXR1cm4gJHRoaXMtPl9jdXJyZW50T2JqZWN0Ow0KCQl9DQoJCSR0aGlzLT5fc3RvcmVEYXRhKCk7DQoNCgkJLy8JQ2hlY2sgaWYgdGhlIGVudHJ5IHRoYXQgaGFzIGJlZW4gcmVxdWVzdGVkIGFjdHVhbGx5IGV4aXN0cw0KCQlpZiAoIWlzc2V0KCR0aGlzLT5fY2VsbENhY2hlWyRwQ29vcmRdKSkgew0KCQkJLy8JUmV0dXJuIG51bGwgaWYgcmVxdWVzdGVkIGVudHJ5IGRvZXNuJ3QgZXhpc3QgaW4gY2FjaGUNCgkJCXJldHVybiBudWxsOw0KCQl9DQoNCgkJLy8JU2V0IGN1cnJlbnQgZW50cnkgdG8gdGhlIHJlcXVlc3RlZCBlbnRyeQ0KCQkkdGhpcy0+X2N1cnJlbnRPYmplY3RJRCA9ICRwQ29vcmQ7DQoJCSR0aGlzLT5fY3VycmVudE9iamVjdCA9IHVuc2VyaWFsaXplKCR0aGlzLT5fY2VsbENhY2hlWyRwQ29vcmRdKTsNCgkJLy8JUmUtYXR0YWNoIHRoZSBwYXJlbnQgd29ya3NoZWV0DQoJCSR0aGlzLT5fY3VycmVudE9iamVjdC0+YXR0YWNoKCR0aGlzLT5fcGFyZW50KTsNCg0KCQkvLwlSZXR1cm4gcmVxdWVzdGVkIGVudHJ5DQoJCXJldHVybiAkdGhpcy0+X2N1cnJlbnRPYmplY3Q7DQoJfQkvLwlmdW5jdGlvbiBnZXRDYWNoZURhdGEoKQ0KDQoNCgkvKioNCgkgKiBDbGVhciB0aGUgY2VsbCBjb2xsZWN0aW9uIGFuZCBkaXNjb25uZWN0IGZyb20gb3VyIHBhcmVudA0KCSAqDQoJICogQHJldHVybgl2b2lkDQoJICovDQoJcHVibGljIGZ1bmN0aW9uIHVuc2V0V29ya3NoZWV0Q2VsbHMoKSB7DQoJCWlmKCFpc19udWxsKCR0aGlzLT5fY3VycmVudE9iamVjdCkpIHsNCgkJCSR0aGlzLT5fY3VycmVudE9iamVjdC0+ZGV0YWNoKCk7DQoJCQkkdGhpcy0+X2N1cnJlbnRPYmplY3QgPSAkdGhpcy0+X2N1cnJlbnRPYmplY3RJRCA9IG51bGw7DQoJCX0NCgkJJHRoaXMtPl9jZWxsQ2FjaGUgPSBhcnJheSgpOw0KDQoJCS8vCWRldGFjaCBvdXJzZWxmIGZyb20gdGhlIHdvcmtzaGVldCwgc28gdGhhdCBpdCBjYW4gdGhlbiBkZWxldGUgdGhpcyBvYmplY3Qgc3VjY2Vzc2Z1bGx5DQoJCSR0aGlzLT5fcGFyZW50ID0gbnVsbDsNCgl9CS8vCWZ1bmN0aW9uIHVuc2V0V29ya3NoZWV0Q2VsbHMoKQ0KDQp9DQo=]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/CachedObjectStorage/PHPTemp.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCi8qKg0KICogUEhQRXhjZWwNCiAqDQogKiBDb3B5cmlnaHQgKGMpIDIwMDYgLSAyMDEyIFBIUEV4Y2VsDQogKg0KICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcg0KICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYw0KICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyDQogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4NCiAqDQogKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwNCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mDQogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQ0KICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4NCiAqDQogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljDQogKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlDQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0ENCiAqDQogKiBAY2F0ZWdvcnkgICBQSFBFeGNlbA0KICogQHBhY2thZ2UgICAgUEhQRXhjZWxfQ2FjaGVkT2JqZWN0U3RvcmFnZQ0KICogQGNvcHlyaWdodCAgQ29weXJpZ2h0IChjKSAyMDA2IC0gMjAxMiBQSFBFeGNlbCAoaHR0cDovL3d3dy5jb2RlcGxleC5jb20vUEhQRXhjZWwpDQogKiBAbGljZW5zZSAgICBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvb2xkLWxpY2Vuc2VzL2xncGwtMi4xLnR4dAlMR1BMDQogKiBAdmVyc2lvbiAgICAxLjcuNywgMjAxMi0wNS0xOQ0KICovDQoNCg0KLyoqDQogKiBQSFBFeGNlbF9DYWNoZWRPYmplY3RTdG9yYWdlX1BIUFRlbXANCiAqDQogKiBAY2F0ZWdvcnkgICBQSFBFeGNlbA0KICogQHBhY2thZ2UgICAgUEhQRXhjZWxfQ2FjaGVkT2JqZWN0U3RvcmFnZQ0KICogQGNvcHlyaWdodCAgQ29weXJpZ2h0IChjKSAyMDA2IC0gMjAxMiBQSFBFeGNlbCAoaHR0cDovL3d3dy5jb2RlcGxleC5jb20vUEhQRXhjZWwpDQogKi8NCmNsYXNzIFBIUEV4Y2VsX0NhY2hlZE9iamVjdFN0b3JhZ2VfUEhQVGVtcCBleHRlbmRzIFBIUEV4Y2VsX0NhY2hlZE9iamVjdFN0b3JhZ2VfQ2FjaGVCYXNlIGltcGxlbWVudHMgUEhQRXhjZWxfQ2FjaGVkT2JqZWN0U3RvcmFnZV9JQ2FjaGUgew0KDQoJLyoqDQoJICogTmFtZSBvZiB0aGUgZmlsZSBmb3IgdGhpcyBjYWNoZQ0KCSAqDQoJICogQHZhciBzdHJpbmcNCgkgKi8NCglwcml2YXRlICRfZmlsZUhhbmRsZSA9IG51bGw7DQoNCgkvKioNCgkgKiBNZW1vcnkgbGltaXQgdG8gdXNlIGJlZm9yZSByZXZlcnRpbmcgdG8gZmlsZSBjYWNoZQ0KCSAqDQoJICogQHZhciBpbnRlZ2VyDQoJICovDQoJcHJpdmF0ZSAkX21lbW9yeUNhY2hlU2l6ZSA9IG51bGw7DQoNCiAgICAvKioNCiAgICAgKiBTdG9yZSBjZWxsIGRhdGEgaW4gY2FjaGUgZm9yIHRoZSBjdXJyZW50IGNlbGwgb2JqZWN0IGlmIGl0J3MgImRpcnR5IiwNCiAgICAgKiAgICAgYW5kIHRoZSAnbnVsbGlmeScgdGhlIGN1cnJlbnQgY2VsbCBvYmplY3QNCiAgICAgKg0KCSAqIEByZXR1cm4Jdm9pZA0KICAgICAqIEB0aHJvd3MJRXhjZXB0aW9uDQogICAgICovDQoJcHJpdmF0ZSBmdW5jdGlvbiBfc3RvcmVEYXRhKCkgew0KCQlpZiAoJHRoaXMtPl9jdXJyZW50Q2VsbElzRGlydHkpIHsNCgkJCSR0aGlzLT5fY3VycmVudE9iamVjdC0+ZGV0YWNoKCk7DQoNCgkJCWZzZWVrKCR0aGlzLT5fZmlsZUhhbmRsZSwwLFNFRUtfRU5EKTsNCgkJCSRvZmZzZXQgPSBmdGVsbCgkdGhpcy0+X2ZpbGVIYW5kbGUpOw0KCQkJZndyaXRlKCR0aGlzLT5fZmlsZUhhbmRsZSwgc2VyaWFsaXplKCR0aGlzLT5fY3VycmVudE9iamVjdCkpOw0KCQkJJHRoaXMtPl9jZWxsQ2FjaGVbJHRoaXMtPl9jdXJyZW50T2JqZWN0SURdCT0gYXJyYXkoJ3B0cicgPT4gJG9mZnNldCwNCgkJCQkJCQkJCQkJCQkJCQknc3onICA9PiBmdGVsbCgkdGhpcy0+X2ZpbGVIYW5kbGUpIC0gJG9mZnNldA0KCQkJCQkJCQkJCQkJCQkJICAgKTsNCgkJCSR0aGlzLT5fY3VycmVudENlbGxJc0RpcnR5ID0gZmFsc2U7DQoJCX0NCgkJJHRoaXMtPl9jdXJyZW50T2JqZWN0SUQgPSAkdGhpcy0+X2N1cnJlbnRPYmplY3QgPSBudWxsOw0KCX0JLy8JZnVuY3Rpb24gX3N0b3JlRGF0YSgpDQoNCg0KICAgIC8qKg0KICAgICAqIEFkZCBvciBVcGRhdGUgYSBjZWxsIGluIGNhY2hlIGlkZW50aWZpZWQgYnkgY29vcmRpbmF0ZSBhZGRyZXNzDQogICAgICoNCiAgICAgKiBAcGFyYW0Jc3RyaW5nCQkJJHBDb29yZAkJQ29vcmRpbmF0ZSBhZGRyZXNzIG9mIHRoZSBjZWxsIHRvIHVwZGF0ZQ0KICAgICAqIEBwYXJhbQlQSFBFeGNlbF9DZWxsCSRjZWxsCQlDZWxsIHRvIHVwZGF0ZQ0KCSAqIEByZXR1cm4Jdm9pZA0KICAgICAqIEB0aHJvd3MJRXhjZXB0aW9uDQogICAgICovDQoJcHVibGljIGZ1bmN0aW9uIGFkZENhY2hlRGF0YSgkcENvb3JkLCBQSFBFeGNlbF9DZWxsICRjZWxsKSB7DQoJCWlmICgoJHBDb29yZCAhPT0gJHRoaXMtPl9jdXJyZW50T2JqZWN0SUQpICYmICgkdGhpcy0+X2N1cnJlbnRPYmplY3RJRCAhPT0gbnVsbCkpIHsNCgkJCSR0aGlzLT5fc3RvcmVEYXRhKCk7DQoJCX0NCg0KCQkkdGhpcy0+X2N1cnJlbnRPYmplY3RJRCA9ICRwQ29vcmQ7DQoJCSR0aGlzLT5fY3VycmVudE9iamVjdCA9ICRjZWxsOw0KCQkkdGhpcy0+X2N1cnJlbnRDZWxsSXNEaXJ0eSA9IHRydWU7DQoNCgkJcmV0dXJuICRjZWxsOw0KCX0JLy8JZnVuY3Rpb24gYWRkQ2FjaGVEYXRhKCkNCg0KDQogICAgLyoqDQogICAgICogR2V0IGNlbGwgYXQgYSBzcGVjaWZpYyBjb29yZGluYXRlDQogICAgICoNCiAgICAgKiBAcGFyYW0gCXN0cmluZyAJCQkkcENvb3JkCQlDb29yZGluYXRlIG9mIHRoZSBjZWxsDQogICAgICogQHRocm93cyAJRXhjZXB0aW9uDQogICAgICogQHJldHVybiAJUEhQRXhjZWxfQ2VsbCAJQ2VsbCB0aGF0IHdhcyBmb3VuZCwgb3IgbnVsbCBpZiBub3QgZm91bmQNCiAgICAgKi8NCglwdWJsaWMgZnVuY3Rpb24gZ2V0Q2FjaGVEYXRhKCRwQ29vcmQpIHsNCgkJaWYgKCRwQ29vcmQgPT09ICR0aGlzLT5fY3VycmVudE9iamVjdElEKSB7DQoJCQlyZXR1cm4gJHRoaXMtPl9jdXJyZW50T2JqZWN0Ow0KCQl9DQoJCSR0aGlzLT5fc3RvcmVEYXRhKCk7DQoNCgkJLy8JQ2hlY2sgaWYgdGhlIGVudHJ5IHRoYXQgaGFzIGJlZW4gcmVxdWVzdGVkIGFjdHVhbGx5IGV4aXN0cw0KCQlpZiAoIWlzc2V0KCR0aGlzLT5fY2VsbENhY2hlWyRwQ29vcmRdKSkgew0KCQkJLy8JUmV0dXJuIG51bGwgaWYgcmVxdWVzdGVkIGVudHJ5IGRvZXNuJ3QgZXhpc3QgaW4gY2FjaGUNCgkJCXJldHVybiBudWxsOw0KCQl9DQoNCgkJLy8JU2V0IGN1cnJlbnQgZW50cnkgdG8gdGhlIHJlcXVlc3RlZCBlbnRyeQ0KCQkkdGhpcy0+X2N1cnJlbnRPYmplY3RJRCA9ICRwQ29vcmQ7DQoJCWZzZWVrKCR0aGlzLT5fZmlsZUhhbmRsZSwkdGhpcy0+X2NlbGxDYWNoZVskcENvb3JkXVsncHRyJ10pOw0KCQkkdGhpcy0+X2N1cnJlbnRPYmplY3QgPSB1bnNlcmlhbGl6ZShmcmVhZCgkdGhpcy0+X2ZpbGVIYW5kbGUsJHRoaXMtPl9jZWxsQ2FjaGVbJHBDb29yZF1bJ3N6J10pKTsNCgkJLy8JUmUtYXR0YWNoIHRoZSBwYXJlbnQgd29ya3NoZWV0DQoJCSR0aGlzLT5fY3VycmVudE9iamVjdC0+YXR0YWNoKCR0aGlzLT5fcGFyZW50KTsNCg0KCQkvLwlSZXR1cm4gcmVxdWVzdGVkIGVudHJ5DQoJCXJldHVybiAkdGhpcy0+X2N1cnJlbnRPYmplY3Q7DQoJfQkvLwlmdW5jdGlvbiBnZXRDYWNoZURhdGEoKQ0KDQoNCgkvKioNCgkgKiBDbG9uZSB0aGUgY2VsbCBjb2xsZWN0aW9uDQoJICoNCgkgKiBAcGFyYW0JUEhQRXhjZWxfV29ya3NoZWV0CSRwYXJlbnQJCVRoZSBuZXcgd29ya3NoZWV0DQoJICogQHJldHVybgl2b2lkDQoJICovDQoJcHVibGljIGZ1bmN0aW9uIGNvcHlDZWxsQ29sbGVjdGlvbihQSFBFeGNlbF9Xb3Jrc2hlZXQgJHBhcmVudCkgew0KCQlwYXJlbnQ6OmNvcHlDZWxsQ29sbGVjdGlvbigkcGFyZW50KTsNCgkJLy8JT3BlbiBhIG5ldyBzdHJlYW0gZm9yIHRoZSBjZWxsIGNhY2hlIGRhdGENCgkJJG5ld0ZpbGVIYW5kbGUgPSBmb3BlbigncGhwOi8vdGVtcC9tYXhtZW1vcnk6Jy4kdGhpcy0+X21lbW9yeUNhY2hlU2l6ZSwnYSsnKTsNCgkJLy8JQ29weSB0aGUgZXhpc3RpbmcgY2VsbCBjYWNoZSBkYXRhIHRvIHRoZSBuZXcgc3RyZWFtDQoJCWZzZWVrKCR0aGlzLT5fZmlsZUhhbmRsZSwwKTsNCgkJd2hpbGUgKCFmZW9mKCR0aGlzLT5fZmlsZUhhbmRsZSkpIHsNCgkJCWZ3cml0ZSgkbmV3RmlsZUhhbmRsZSxmcmVhZCgkdGhpcy0+X2ZpbGVIYW5kbGUsIDEwMjQpKTsNCgkJfQ0KCQkkdGhpcy0+X2ZpbGVIYW5kbGUgPSAkbmV3RmlsZUhhbmRsZTsNCgl9CS8vCWZ1bmN0aW9uIGNvcHlDZWxsQ29sbGVjdGlvbigpDQoNCg0KCS8qKg0KCSAqIENsZWFyIHRoZSBjZWxsIGNvbGxlY3Rpb24gYW5kIGRpc2Nvbm5lY3QgZnJvbSBvdXIgcGFyZW50DQoJICoNCgkgKiBAcmV0dXJuCXZvaWQNCgkgKi8NCglwdWJsaWMgZnVuY3Rpb24gdW5zZXRXb3Jrc2hlZXRDZWxscygpIHsNCgkJaWYoIWlzX251bGwoJHRoaXMtPl9jdXJyZW50T2JqZWN0KSkgew0KCQkJJHRoaXMtPl9jdXJyZW50T2JqZWN0LT5kZXRhY2goKTsNCgkJCSR0aGlzLT5fY3VycmVudE9iamVjdCA9ICR0aGlzLT5fY3VycmVudE9iamVjdElEID0gbnVsbDsNCgkJfQ0KCQkkdGhpcy0+X2NlbGxDYWNoZSA9IGFycmF5KCk7DQoNCgkJLy8JZGV0YWNoIG91cnNlbGYgZnJvbSB0aGUgd29ya3NoZWV0LCBzbyB0aGF0IGl0IGNhbiB0aGVuIGRlbGV0ZSB0aGlzIG9iamVjdCBzdWNjZXNzZnVsbHkNCgkJJHRoaXMtPl9wYXJlbnQgPSBudWxsOw0KDQoJCS8vCUNsb3NlIGRvd24gdGhlIHBocDovL3RlbXAgZmlsZQ0KCQkkdGhpcy0+X19kZXN0cnVjdCgpOw0KCX0JLy8JZnVuY3Rpb24gdW5zZXRXb3Jrc2hlZXRDZWxscygpDQoNCg0KCS8qKg0KCSAqIEluaXRpYWxpc2UgdGhpcyBuZXcgY2VsbCBjb2xsZWN0aW9uDQoJICoNCgkgKiBAcGFyYW0JUEhQRXhjZWxfV29ya3NoZWV0CSRwYXJlbnQJCVRoZSB3b3Jrc2hlZXQgZm9yIHRoaXMgY2VsbCBjb2xsZWN0aW9uDQoJICogQHBhcmFtCWFycmF5IG9mIG1peGVkCQkkYXJndW1lbnRzCUFkZGl0aW9uYWwgaW5pdGlhbGlzYXRpb24gYXJndW1lbnRzDQoJICovDQoJcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KFBIUEV4Y2VsX1dvcmtzaGVldCAkcGFyZW50LCAkYXJndW1lbnRzKSB7DQoJCSR0aGlzLT5fbWVtb3J5Q2FjaGVTaXplCT0gKGlzc2V0KCRhcmd1bWVudHNbJ21lbW9yeUNhY2hlU2l6ZSddKSkJPyAkYXJndW1lbnRzWydtZW1vcnlDYWNoZVNpemUnXQk6ICcxTUInOw0KDQoJCXBhcmVudDo6X19jb25zdHJ1Y3QoJHBhcmVudCk7DQoJCWlmIChpc19udWxsKCR0aGlzLT5fZmlsZUhhbmRsZSkpIHsNCgkJCSR0aGlzLT5fZmlsZUhhbmRsZSA9IGZvcGVuKCdwaHA6Ly90ZW1wL21heG1lbW9yeTonLiR0aGlzLT5fbWVtb3J5Q2FjaGVTaXplLCdhKycpOw0KCQl9DQoJfQkvLwlmdW5jdGlvbiBfX2NvbnN0cnVjdCgpDQoNCg0KCS8qKg0KCSAqIERlc3Ryb3kgdGhpcyBjZWxsIGNvbGxlY3Rpb24NCgkgKi8NCglwdWJsaWMgZnVuY3Rpb24gX19kZXN0cnVjdCgpIHsNCgkJaWYgKCFpc19udWxsKCR0aGlzLT5fZmlsZUhhbmRsZSkpIHsNCgkJCWZjbG9zZSgkdGhpcy0+X2ZpbGVIYW5kbGUpOw0KCQl9DQoJCSR0aGlzLT5fZmlsZUhhbmRsZSA9IG51bGw7DQoJfQkvLwlmdW5jdGlvbiBfX2Rlc3RydWN0KCkNCg0KfQ0K]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/CachedObjectStorage/SQLite.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCi8qKg0KICogUEhQRXhjZWwNCiAqDQogKiBDb3B5cmlnaHQgKGMpIDIwMDYgLSAyMDEyIFBIUEV4Y2VsDQogKg0KICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcg0KICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYw0KICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyDQogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4NCiAqDQogKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwNCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mDQogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQ0KICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4NCiAqDQogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljDQogKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlDQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0ENCiAqDQogKiBAY2F0ZWdvcnkgICBQSFBFeGNlbA0KICogQHBhY2thZ2UgICAgUEhQRXhjZWxfQ2FjaGVkT2JqZWN0U3RvcmFnZQ0KICogQGNvcHlyaWdodCAgQ29weXJpZ2h0IChjKSAyMDA2IC0gMjAxMiBQSFBFeGNlbCAoaHR0cDovL3d3dy5jb2RlcGxleC5jb20vUEhQRXhjZWwpDQogKiBAbGljZW5zZSAgICBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvb2xkLWxpY2Vuc2VzL2xncGwtMi4xLnR4dAlMR1BMDQogKiBAdmVyc2lvbiAgICAxLjcuNywgMjAxMi0wNS0xOQ0KICovDQoNCg0KLyoqDQogKiBQSFBFeGNlbF9DYWNoZWRPYmplY3RTdG9yYWdlX1NRTGl0ZQ0KICoNCiAqIEBjYXRlZ29yeSAgIFBIUEV4Y2VsDQogKiBAcGFja2FnZSAgICBQSFBFeGNlbF9DYWNoZWRPYmplY3RTdG9yYWdlDQogKiBAY29weXJpZ2h0ICBDb3B5cmlnaHQgKGMpIDIwMDYgLSAyMDEyIFBIUEV4Y2VsIChodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9QSFBFeGNlbCkNCiAqLw0KY2xhc3MgUEhQRXhjZWxfQ2FjaGVkT2JqZWN0U3RvcmFnZV9TUUxpdGUgZXh0ZW5kcyBQSFBFeGNlbF9DYWNoZWRPYmplY3RTdG9yYWdlX0NhY2hlQmFzZSBpbXBsZW1lbnRzIFBIUEV4Y2VsX0NhY2hlZE9iamVjdFN0b3JhZ2VfSUNhY2hlIHsNCg0KCS8qKg0KCSAqIERhdGFiYXNlIHRhYmxlIG5hbWUNCgkgKg0KCSAqIEB2YXIgc3RyaW5nDQoJICovDQoJcHJpdmF0ZSAkX1RhYmxlTmFtZSA9IG51bGw7DQoNCgkvKioNCgkgKiBEYXRhYmFzZSBoYW5kbGUNCgkgKg0KCSAqIEB2YXIgcmVzb3VyY2UNCgkgKi8NCglwcml2YXRlICRfREJIYW5kbGUgPSBudWxsOw0KDQogICAgLyoqDQogICAgICogU3RvcmUgY2VsbCBkYXRhIGluIGNhY2hlIGZvciB0aGUgY3VycmVudCBjZWxsIG9iamVjdCBpZiBpdCdzICJkaXJ0eSIsDQogICAgICogICAgIGFuZCB0aGUgJ251bGxpZnknIHRoZSBjdXJyZW50IGNlbGwgb2JqZWN0DQogICAgICoNCgkgKiBAcmV0dXJuCXZvaWQNCiAgICAgKiBAdGhyb3dzCUV4Y2VwdGlvbg0KICAgICAqLw0KCXByaXZhdGUgZnVuY3Rpb24gX3N0b3JlRGF0YSgpIHsNCgkJaWYgKCR0aGlzLT5fY3VycmVudENlbGxJc0RpcnR5KSB7DQoJCQkkdGhpcy0+X2N1cnJlbnRPYmplY3QtPmRldGFjaCgpOw0KDQoJCQlpZiAoISR0aGlzLT5fREJIYW5kbGUtPnF1ZXJ5RXhlYygiSU5TRVJUIE9SIFJFUExBQ0UgSU5UTyBrdnBfIi4kdGhpcy0+X1RhYmxlTmFtZS4iIFZBTFVFUygnIi4kdGhpcy0+X2N1cnJlbnRPYmplY3RJRC4iJywnIi5zcWxpdGVfZXNjYXBlX3N0cmluZyhzZXJpYWxpemUoJHRoaXMtPl9jdXJyZW50T2JqZWN0KSkuIicpIikpDQoJCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbihzcWxpdGVfZXJyb3Jfc3RyaW5nKCR0aGlzLT5fREJIYW5kbGUtPmxhc3RFcnJvcigpKSk7DQoJCQkkdGhpcy0+X2N1cnJlbnRDZWxsSXNEaXJ0eSA9IGZhbHNlOw0KCQl9DQoJCSR0aGlzLT5fY3VycmVudE9iamVjdElEID0gJHRoaXMtPl9jdXJyZW50T2JqZWN0ID0gbnVsbDsNCgl9CS8vCWZ1bmN0aW9uIF9zdG9yZURhdGEoKQ0KDQoNCiAgICAvKioNCiAgICAgKiBBZGQgb3IgVXBkYXRlIGEgY2VsbCBpbiBjYWNoZSBpZGVudGlmaWVkIGJ5IGNvb3JkaW5hdGUgYWRkcmVzcw0KICAgICAqDQogICAgICogQHBhcmFtCXN0cmluZwkJCSRwQ29vcmQJCUNvb3JkaW5hdGUgYWRkcmVzcyBvZiB0aGUgY2VsbCB0byB1cGRhdGUNCiAgICAgKiBAcGFyYW0JUEhQRXhjZWxfQ2VsbAkkY2VsbAkJQ2VsbCB0byB1cGRhdGUNCgkgKiBAcmV0dXJuCXZvaWQNCiAgICAgKiBAdGhyb3dzCUV4Y2VwdGlvbg0KICAgICAqLw0KCXB1YmxpYyBmdW5jdGlvbiBhZGRDYWNoZURhdGEoJHBDb29yZCwgUEhQRXhjZWxfQ2VsbCAkY2VsbCkgew0KCQlpZiAoKCRwQ29vcmQgIT09ICR0aGlzLT5fY3VycmVudE9iamVjdElEKSAmJiAoJHRoaXMtPl9jdXJyZW50T2JqZWN0SUQgIT09IG51bGwpKSB7DQoJCQkkdGhpcy0+X3N0b3JlRGF0YSgpOw0KCQl9DQoNCgkJJHRoaXMtPl9jdXJyZW50T2JqZWN0SUQgPSAkcENvb3JkOw0KCQkkdGhpcy0+X2N1cnJlbnRPYmplY3QgPSAkY2VsbDsNCgkJJHRoaXMtPl9jdXJyZW50Q2VsbElzRGlydHkgPSB0cnVlOw0KDQoJCXJldHVybiAkY2VsbDsNCgl9CS8vCWZ1bmN0aW9uIGFkZENhY2hlRGF0YSgpDQoNCg0KICAgIC8qKg0KICAgICAqIEdldCBjZWxsIGF0IGEgc3BlY2lmaWMgY29vcmRpbmF0ZQ0KICAgICAqDQogICAgICogQHBhcmFtIAlzdHJpbmcgCQkJJHBDb29yZAkJQ29vcmRpbmF0ZSBvZiB0aGUgY2VsbA0KICAgICAqIEB0aHJvd3MgCUV4Y2VwdGlvbg0KICAgICAqIEByZXR1cm4gCVBIUEV4Y2VsX0NlbGwgCUNlbGwgdGhhdCB3YXMgZm91bmQsIG9yIG51bGwgaWYgbm90IGZvdW5kDQogICAgICovDQoJcHVibGljIGZ1bmN0aW9uIGdldENhY2hlRGF0YSgkcENvb3JkKSB7DQoJCWlmICgkcENvb3JkID09PSAkdGhpcy0+X2N1cnJlbnRPYmplY3RJRCkgew0KCQkJcmV0dXJuICR0aGlzLT5fY3VycmVudE9iamVjdDsNCgkJfQ0KCQkkdGhpcy0+X3N0b3JlRGF0YSgpOw0KDQoJCSRxdWVyeSA9ICJTRUxFQ1QgdmFsdWUgRlJPTSBrdnBfIi4kdGhpcy0+X1RhYmxlTmFtZS4iIFdIRVJFIGlkPSciLiRwQ29vcmQuIiciOw0KCQkkY2VsbFJlc3VsdFNldCA9ICR0aGlzLT5fREJIYW5kbGUtPnF1ZXJ5KCRxdWVyeSxTUUxJVEVfQVNTT0MpOw0KCQlpZiAoJGNlbGxSZXN1bHRTZXQgPT09IGZhbHNlKSB7DQoJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKHNxbGl0ZV9lcnJvcl9zdHJpbmcoJHRoaXMtPl9EQkhhbmRsZS0+bGFzdEVycm9yKCkpKTsNCgkJfSBlbHNlaWYgKCRjZWxsUmVzdWx0U2V0LT5udW1Sb3dzKCkgPT0gMCkgew0KCQkJLy8JUmV0dXJuIG51bGwgaWYgcmVxdWVzdGVkIGVudHJ5IGRvZXNuJ3QgZXhpc3QgaW4gY2FjaGUNCgkJCXJldHVybiBudWxsOw0KCQl9DQoNCgkJLy8JU2V0IGN1cnJlbnQgZW50cnkgdG8gdGhlIHJlcXVlc3RlZCBlbnRyeQ0KCQkkdGhpcy0+X2N1cnJlbnRPYmplY3RJRCA9ICRwQ29vcmQ7DQoNCgkJJGNlbGxSZXN1bHQgPSAkY2VsbFJlc3VsdFNldC0+ZmV0Y2hTaW5nbGUoKTsNCgkJJHRoaXMtPl9jdXJyZW50T2JqZWN0ID0gdW5zZXJpYWxpemUoJGNlbGxSZXN1bHQpOw0KCQkvLwlSZS1hdHRhY2ggdGhlIHBhcmVudCB3b3Jrc2hlZXQNCgkJJHRoaXMtPl9jdXJyZW50T2JqZWN0LT5hdHRhY2goJHRoaXMtPl9wYXJlbnQpOw0KDQoJCS8vCVJldHVybiByZXF1ZXN0ZWQgZW50cnkNCgkJcmV0dXJuICR0aGlzLT5fY3VycmVudE9iamVjdDsNCgl9CS8vCWZ1bmN0aW9uIGdldENhY2hlRGF0YSgpDQoNCg0KCS8qKg0KCSAqIElzIGEgdmFsdWUgc2V0IGZvciBhbiBpbmRleGVkIGNlbGw/DQoJICoNCgkgKiBAcGFyYW0Jc3RyaW5nCQkkcENvb3JkCQlDb29yZGluYXRlIGFkZHJlc3Mgb2YgdGhlIGNlbGwgdG8gY2hlY2sNCgkgKiBAcmV0dXJuCWJvb2xlYW4NCgkgKi8NCglwdWJsaWMgZnVuY3Rpb24gaXNEYXRhU2V0KCRwQ29vcmQpIHsNCgkJaWYgKCRwQ29vcmQgPT09ICR0aGlzLT5fY3VycmVudE9iamVjdElEKSB7DQoJCQlyZXR1cm4gdHJ1ZTsNCgkJfQ0KDQoJCS8vCUNoZWNrIGlmIHRoZSByZXF1ZXN0ZWQgZW50cnkgZXhpc3RzIGluIHRoZSBjYWNoZQ0KCQkkcXVlcnkgPSAiU0VMRUNUIGlkIEZST00ga3ZwXyIuJHRoaXMtPl9UYWJsZU5hbWUuIiBXSEVSRSBpZD0nIi4kcENvb3JkLiInIjsNCgkJJGNlbGxSZXN1bHRTZXQgPSAkdGhpcy0+X0RCSGFuZGxlLT5xdWVyeSgkcXVlcnksU1FMSVRFX0FTU09DKTsNCgkJaWYgKCRjZWxsUmVzdWx0U2V0ID09PSBmYWxzZSkgew0KCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbihzcWxpdGVfZXJyb3Jfc3RyaW5nKCR0aGlzLT5fREJIYW5kbGUtPmxhc3RFcnJvcigpKSk7DQoJCX0gZWxzZWlmICgkY2VsbFJlc3VsdFNldC0+bnVtUm93cygpID09IDApIHsNCgkJCS8vCVJldHVybiBudWxsIGlmIHJlcXVlc3RlZCBlbnRyeSBkb2Vzbid0IGV4aXN0IGluIGNhY2hlDQoJCQlyZXR1cm4gZmFsc2U7DQoJCX0NCgkJcmV0dXJuIHRydWU7DQoJfQkvLwlmdW5jdGlvbiBpc0RhdGFTZXQoKQ0KDQoNCiAgICAvKioNCiAgICAgKiBEZWxldGUgYSBjZWxsIGluIGNhY2hlIGlkZW50aWZpZWQgYnkgY29vcmRpbmF0ZSBhZGRyZXNzDQogICAgICoNCiAgICAgKiBAcGFyYW0Jc3RyaW5nCQkJJHBDb29yZAkJQ29vcmRpbmF0ZSBhZGRyZXNzIG9mIHRoZSBjZWxsIHRvIGRlbGV0ZQ0KICAgICAqIEB0aHJvd3MJRXhjZXB0aW9uDQogICAgICovDQoJcHVibGljIGZ1bmN0aW9uIGRlbGV0ZUNhY2hlRGF0YSgkcENvb3JkKSB7DQoJCWlmICgkcENvb3JkID09PSAkdGhpcy0+X2N1cnJlbnRPYmplY3RJRCkgew0KCQkJJHRoaXMtPl9jdXJyZW50T2JqZWN0LT5kZXRhY2goKTsNCgkJCSR0aGlzLT5fY3VycmVudE9iamVjdElEID0gJHRoaXMtPl9jdXJyZW50T2JqZWN0ID0gbnVsbDsNCgkJfQ0KDQoJCS8vCUNoZWNrIGlmIHRoZSByZXF1ZXN0ZWQgZW50cnkgZXhpc3RzIGluIHRoZSBjYWNoZQ0KCQkkcXVlcnkgPSAiREVMRVRFIEZST00ga3ZwXyIuJHRoaXMtPl9UYWJsZU5hbWUuIiBXSEVSRSBpZD0nIi4kcENvb3JkLiInIjsNCgkJaWYgKCEkdGhpcy0+X0RCSGFuZGxlLT5xdWVyeUV4ZWMoJHF1ZXJ5KSkNCgkJCXRocm93IG5ldyBFeGNlcHRpb24oc3FsaXRlX2Vycm9yX3N0cmluZygkdGhpcy0+X0RCSGFuZGxlLT5sYXN0RXJyb3IoKSkpOw0KDQoJCSR0aGlzLT5fY3VycmVudENlbGxJc0RpcnR5ID0gZmFsc2U7DQoJfQkvLwlmdW5jdGlvbiBkZWxldGVDYWNoZURhdGEoKQ0KDQoNCgkvKioNCgkgKiBHZXQgYSBsaXN0IG9mIGFsbCBjZWxsIGFkZHJlc3NlcyBjdXJyZW50bHkgaGVsZCBpbiBjYWNoZQ0KCSAqDQoJICogQHJldHVybglhcnJheSBvZiBzdHJpbmcNCgkgKi8NCglwdWJsaWMgZnVuY3Rpb24gZ2V0Q2VsbExpc3QoKSB7DQoJCSRxdWVyeSA9ICJTRUxFQ1QgaWQgRlJPTSBrdnBfIi4kdGhpcy0+X1RhYmxlTmFtZTsNCgkJJGNlbGxJZHNSZXN1bHQgPSAkdGhpcy0+X0RCSGFuZGxlLT51bmJ1ZmZlcmVkUXVlcnkoJHF1ZXJ5LFNRTElURV9BU1NPQyk7DQoJCWlmICgkY2VsbElkc1Jlc3VsdCA9PT0gZmFsc2UpDQoJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKHNxbGl0ZV9lcnJvcl9zdHJpbmcoJHRoaXMtPl9EQkhhbmRsZS0+bGFzdEVycm9yKCkpKTsNCg0KCQkkY2VsbEtleXMgPSBhcnJheSgpOw0KCQlmb3JlYWNoKCRjZWxsSWRzUmVzdWx0IGFzICRyb3cpIHsNCgkJCSRjZWxsS2V5c1tdID0gJHJvd1snaWQnXTsNCgkJfQ0KDQoJCXJldHVybiAkY2VsbEtleXM7DQoJfQkvLwlmdW5jdGlvbiBnZXRDZWxsTGlzdCgpDQoNCg0KCS8qKg0KCSAqIENsb25lIHRoZSBjZWxsIGNvbGxlY3Rpb24NCgkgKg0KCSAqIEBwYXJhbQlQSFBFeGNlbF9Xb3Jrc2hlZXQJJHBhcmVudAkJVGhlIG5ldyB3b3Jrc2hlZXQNCgkgKiBAcmV0dXJuCXZvaWQNCgkgKi8NCglwdWJsaWMgZnVuY3Rpb24gY29weUNlbGxDb2xsZWN0aW9uKFBIUEV4Y2VsX1dvcmtzaGVldCAkcGFyZW50KSB7DQoJCS8vCUdldCBhIG5ldyBpZCBmb3IgdGhlIG5ldyB0YWJsZSBuYW1lDQoJCSR0YWJsZU5hbWUgPSBzdHJfcmVwbGFjZSgnLicsJ18nLCR0aGlzLT5fZ2V0VW5pcXVlSUQoKSk7DQoJCWlmICghJHRoaXMtPl9EQkhhbmRsZS0+cXVlcnlFeGVjKCdDUkVBVEUgVEFCTEUga3ZwXycuJHRhYmxlTmFtZS4nIChpZCBWQVJDSEFSKDEyKSBQUklNQVJZIEtFWSwgdmFsdWUgQkxPQikNCgkJCQkJCQkJCQkJCQlBUyBTRUxFQ1QgKiBGUk9NIGt2cF8nLiR0aGlzLT5fVGFibGVOYW1lKSkNCgkJCXRocm93IG5ldyBFeGNlcHRpb24oc3FsaXRlX2Vycm9yX3N0cmluZygkdGhpcy0+X0RCSGFuZGxlLT5sYXN0RXJyb3IoKSkpOw0KDQoJCS8vCUNvcHkgdGhlIGV4aXN0aW5nIGNlbGwgY2FjaGUgZmlsZQ0KCQkkdGhpcy0+X1RhYmxlTmFtZSA9ICR0YWJsZU5hbWU7DQoJfQkvLwlmdW5jdGlvbiBjb3B5Q2VsbENvbGxlY3Rpb24oKQ0KDQoNCgkvKioNCgkgKiBDbGVhciB0aGUgY2VsbCBjb2xsZWN0aW9uIGFuZCBkaXNjb25uZWN0IGZyb20gb3VyIHBhcmVudA0KCSAqDQoJICogQHJldHVybgl2b2lkDQoJICovDQoJcHVibGljIGZ1bmN0aW9uIHVuc2V0V29ya3NoZWV0Q2VsbHMoKSB7DQoJCWlmKCFpc19udWxsKCR0aGlzLT5fY3VycmVudE9iamVjdCkpIHsNCgkJCSR0aGlzLT5fY3VycmVudE9iamVjdC0+ZGV0YWNoKCk7DQoJCQkkdGhpcy0+X2N1cnJlbnRPYmplY3QgPSAkdGhpcy0+X2N1cnJlbnRPYmplY3RJRCA9IG51bGw7DQoJCX0NCgkJLy8JZGV0YWNoIG91cnNlbGYgZnJvbSB0aGUgd29ya3NoZWV0LCBzbyB0aGF0IGl0IGNhbiB0aGVuIGRlbGV0ZSB0aGlzIG9iamVjdCBzdWNjZXNzZnVsbHkNCgkJJHRoaXMtPl9wYXJlbnQgPSBudWxsOw0KDQoJCS8vCUNsb3NlIGRvd24gdGhlIHRlbXBvcmFyeSBjYWNoZSBmaWxlDQoJCSR0aGlzLT5fX2Rlc3RydWN0KCk7DQoJfQkvLwlmdW5jdGlvbiB1bnNldFdvcmtzaGVldENlbGxzKCkNCg0KDQoJLyoqDQoJICogSW5pdGlhbGlzZSB0aGlzIG5ldyBjZWxsIGNvbGxlY3Rpb24NCgkgKg0KCSAqIEBwYXJhbQlQSFBFeGNlbF9Xb3Jrc2hlZXQJJHBhcmVudAkJVGhlIHdvcmtzaGVldCBmb3IgdGhpcyBjZWxsIGNvbGxlY3Rpb24NCgkgKi8NCglwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoUEhQRXhjZWxfV29ya3NoZWV0ICRwYXJlbnQpIHsNCgkJcGFyZW50OjpfX2NvbnN0cnVjdCgkcGFyZW50KTsNCgkJaWYgKGlzX251bGwoJHRoaXMtPl9EQkhhbmRsZSkpIHsNCgkJCSR0aGlzLT5fVGFibGVOYW1lID0gc3RyX3JlcGxhY2UoJy4nLCdfJywkdGhpcy0+X2dldFVuaXF1ZUlEKCkpOw0KCQkJJF9EQk5hbWUgPSAnOm1lbW9yeTonOw0KDQoJCQkkdGhpcy0+X0RCSGFuZGxlID0gbmV3IFNRTGl0ZURhdGFiYXNlKCRfREJOYW1lKTsNCgkJCWlmICgkdGhpcy0+X0RCSGFuZGxlID09PSBmYWxzZSkNCgkJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKHNxbGl0ZV9lcnJvcl9zdHJpbmcoJHRoaXMtPl9EQkhhbmRsZS0+bGFzdEVycm9yKCkpKTsNCgkJCWlmICghJHRoaXMtPl9EQkhhbmRsZS0+cXVlcnlFeGVjKCdDUkVBVEUgVEFCTEUga3ZwXycuJHRoaXMtPl9UYWJsZU5hbWUuJyAoaWQgVkFSQ0hBUigxMikgUFJJTUFSWSBLRVksIHZhbHVlIEJMT0IpJykpDQoJCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbihzcWxpdGVfZXJyb3Jfc3RyaW5nKCR0aGlzLT5fREJIYW5kbGUtPmxhc3RFcnJvcigpKSk7DQoJCX0NCgl9CS8vCWZ1bmN0aW9uIF9fY29uc3RydWN0KCkNCg0KDQoJLyoqDQoJICogRGVzdHJveSB0aGlzIGNlbGwgY29sbGVjdGlvbg0KCSAqLw0KCXB1YmxpYyBmdW5jdGlvbiBfX2Rlc3RydWN0KCkgew0KCQkkdGhpcy0+X0RCSGFuZGxlID0gbnVsbDsNCgl9CS8vCWZ1bmN0aW9uIF9fZGVzdHJ1Y3QoKQ0KDQoNCgkvKioNCgkgKiBJZGVudGlmeSB3aGV0aGVyIHRoZSBjYWNoaW5nIG1ldGhvZCBpcyBjdXJyZW50bHkgYXZhaWxhYmxlDQoJICogU29tZSBtZXRob2RzIGFyZSBkZXBlbmRlbnQgb24gdGhlIGF2YWlsYWJpbGl0eSBvZiBjZXJ0YWluIGV4dGVuc2lvbnMgYmVpbmcgZW5hYmxlZCBpbiB0aGUgUEhQIGJ1aWxkDQoJICoNCgkgKiBAcmV0dXJuCWJvb2xlYW4NCgkgKi8NCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGNhY2hlTWV0aG9kSXNBdmFpbGFibGUoKSB7DQoJCWlmICghZnVuY3Rpb25fZXhpc3RzKCdzcWxpdGVfb3BlbicpKSB7DQoJCQlyZXR1cm4gZmFsc2U7DQoJCX0NCg0KCQlyZXR1cm4gdHJ1ZTsNCgl9DQoNCn0NCg==]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/CachedObjectStorage/SQLite3.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCi8qKg0KICogUEhQRXhjZWwNCiAqDQogKiBDb3B5cmlnaHQgKGMpIDIwMDYgLSAyMDEyIFBIUEV4Y2VsDQogKg0KICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcg0KICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYw0KICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyDQogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4NCiAqDQogKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwNCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mDQogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQ0KICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4NCiAqDQogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljDQogKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlDQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0ENCiAqDQogKiBAY2F0ZWdvcnkgICBQSFBFeGNlbA0KICogQHBhY2thZ2UgICAgUEhQRXhjZWxfQ2FjaGVkT2JqZWN0U3RvcmFnZQ0KICogQGNvcHlyaWdodCAgQ29weXJpZ2h0IChjKSAyMDA2IC0gMjAxMiBQSFBFeGNlbCAoaHR0cDovL3d3dy5jb2RlcGxleC5jb20vUEhQRXhjZWwpDQogKiBAbGljZW5zZSAgICBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvb2xkLWxpY2Vuc2VzL2xncGwtMi4xLnR4dAlMR1BMDQogKiBAdmVyc2lvbiAgICAxLjcuNywgMjAxMi0wNS0xOQ0KICovDQoNCg0KLyoqDQogKiBQSFBFeGNlbF9DYWNoZWRPYmplY3RTdG9yYWdlX1NRTGl0ZTMNCiAqDQogKiBAY2F0ZWdvcnkgICBQSFBFeGNlbA0KICogQHBhY2thZ2UgICAgUEhQRXhjZWxfQ2FjaGVkT2JqZWN0U3RvcmFnZQ0KICogQGNvcHlyaWdodCAgQ29weXJpZ2h0IChjKSAyMDA2IC0gMjAxMiBQSFBFeGNlbCAoaHR0cDovL3d3dy5jb2RlcGxleC5jb20vUEhQRXhjZWwpDQogKi8NCmNsYXNzIFBIUEV4Y2VsX0NhY2hlZE9iamVjdFN0b3JhZ2VfU1FMaXRlMyBleHRlbmRzIFBIUEV4Y2VsX0NhY2hlZE9iamVjdFN0b3JhZ2VfQ2FjaGVCYXNlIGltcGxlbWVudHMgUEhQRXhjZWxfQ2FjaGVkT2JqZWN0U3RvcmFnZV9JQ2FjaGUgew0KDQoJLyoqDQoJICogRGF0YWJhc2UgdGFibGUgbmFtZQ0KCSAqDQoJICogQHZhciBzdHJpbmcNCgkgKi8NCglwcml2YXRlICRfVGFibGVOYW1lID0gbnVsbDsNCg0KCS8qKg0KCSAqIERhdGFiYXNlIGhhbmRsZQ0KCSAqDQoJICogQHZhciByZXNvdXJjZQ0KCSAqLw0KCXByaXZhdGUgJF9EQkhhbmRsZSA9IG51bGw7DQoNCiAgICAvKioNCiAgICAgKiBTdG9yZSBjZWxsIGRhdGEgaW4gY2FjaGUgZm9yIHRoZSBjdXJyZW50IGNlbGwgb2JqZWN0IGlmIGl0J3MgImRpcnR5IiwNCiAgICAgKiAgICAgYW5kIHRoZSAnbnVsbGlmeScgdGhlIGN1cnJlbnQgY2VsbCBvYmplY3QNCiAgICAgKg0KCSAqIEByZXR1cm4Jdm9pZA0KICAgICAqIEB0aHJvd3MJRXhjZXB0aW9uDQogICAgICovDQoJcHJpdmF0ZSBmdW5jdGlvbiBfc3RvcmVEYXRhKCkgew0KCQlpZiAoJHRoaXMtPl9jdXJyZW50Q2VsbElzRGlydHkpIHsNCgkJCSR0aGlzLT5fY3VycmVudE9iamVjdC0+ZGV0YWNoKCk7DQoNCgkJCSRxdWVyeSA9ICR0aGlzLT5fREJIYW5kbGUtPnByZXBhcmUoIklOU0VSVCBPUiBSRVBMQUNFIElOVE8ga3ZwXyIuJHRoaXMtPl9UYWJsZU5hbWUuIiBWQUxVRVMoOmlkLDpkYXRhKSIpOw0KCQkJJHF1ZXJ5LT5iaW5kVmFsdWUoJ2lkJywkdGhpcy0+X2N1cnJlbnRPYmplY3RJRCxTUUxJVEUzX1RFWFQpOw0KCQkJJHF1ZXJ5LT5iaW5kVmFsdWUoJ2RhdGEnLHNlcmlhbGl6ZSgkdGhpcy0+X2N1cnJlbnRPYmplY3QpLFNRTElURTNfQkxPQik7DQoJCQkkcmVzdWx0ID0gJHF1ZXJ5LT5leGVjdXRlKCk7DQoJCQlpZiAoJHJlc3VsdCA9PT0gZmFsc2UpDQoJCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbigkdGhpcy0+X0RCSGFuZGxlLT5sYXN0RXJyb3JNc2coKSk7DQoJCQkkdGhpcy0+X2N1cnJlbnRDZWxsSXNEaXJ0eSA9IGZhbHNlOw0KCQl9DQoJCSR0aGlzLT5fY3VycmVudE9iamVjdElEID0gJHRoaXMtPl9jdXJyZW50T2JqZWN0ID0gbnVsbDsNCgl9CS8vCWZ1bmN0aW9uIF9zdG9yZURhdGEoKQ0KDQoNCiAgICAvKioNCiAgICAgKiBBZGQgb3IgVXBkYXRlIGEgY2VsbCBpbiBjYWNoZSBpZGVudGlmaWVkIGJ5IGNvb3JkaW5hdGUgYWRkcmVzcw0KICAgICAqDQogICAgICogQHBhcmFtCXN0cmluZwkJCSRwQ29vcmQJCUNvb3JkaW5hdGUgYWRkcmVzcyBvZiB0aGUgY2VsbCB0byB1cGRhdGUNCiAgICAgKiBAcGFyYW0JUEhQRXhjZWxfQ2VsbAkkY2VsbAkJQ2VsbCB0byB1cGRhdGUNCgkgKiBAcmV0dXJuCXZvaWQNCiAgICAgKiBAdGhyb3dzCUV4Y2VwdGlvbg0KICAgICAqLw0KCXB1YmxpYyBmdW5jdGlvbiBhZGRDYWNoZURhdGEoJHBDb29yZCwgUEhQRXhjZWxfQ2VsbCAkY2VsbCkgew0KCQlpZiAoKCRwQ29vcmQgIT09ICR0aGlzLT5fY3VycmVudE9iamVjdElEKSAmJiAoJHRoaXMtPl9jdXJyZW50T2JqZWN0SUQgIT09IG51bGwpKSB7DQoJCQkkdGhpcy0+X3N0b3JlRGF0YSgpOw0KCQl9DQoNCgkJJHRoaXMtPl9jdXJyZW50T2JqZWN0SUQgPSAkcENvb3JkOw0KCQkkdGhpcy0+X2N1cnJlbnRPYmplY3QgPSAkY2VsbDsNCgkJJHRoaXMtPl9jdXJyZW50Q2VsbElzRGlydHkgPSB0cnVlOw0KDQoJCXJldHVybiAkY2VsbDsNCgl9CS8vCWZ1bmN0aW9uIGFkZENhY2hlRGF0YSgpDQoNCg0KICAgIC8qKg0KICAgICAqIEdldCBjZWxsIGF0IGEgc3BlY2lmaWMgY29vcmRpbmF0ZQ0KICAgICAqDQogICAgICogQHBhcmFtIAlzdHJpbmcgCQkJJHBDb29yZAkJQ29vcmRpbmF0ZSBvZiB0aGUgY2VsbA0KICAgICAqIEB0aHJvd3MgCUV4Y2VwdGlvbg0KICAgICAqIEByZXR1cm4gCVBIUEV4Y2VsX0NlbGwgCUNlbGwgdGhhdCB3YXMgZm91bmQsIG9yIG51bGwgaWYgbm90IGZvdW5kDQogICAgICovDQoJcHVibGljIGZ1bmN0aW9uIGdldENhY2hlRGF0YSgkcENvb3JkKSB7DQoJCWlmICgkcENvb3JkID09PSAkdGhpcy0+X2N1cnJlbnRPYmplY3RJRCkgew0KCQkJcmV0dXJuICR0aGlzLT5fY3VycmVudE9iamVjdDsNCgkJfQ0KCQkkdGhpcy0+X3N0b3JlRGF0YSgpOw0KDQoJCSRxdWVyeSA9ICJTRUxFQ1QgdmFsdWUgRlJPTSBrdnBfIi4kdGhpcy0+X1RhYmxlTmFtZS4iIFdIRVJFIGlkPSciLiRwQ29vcmQuIiciOw0KCQkkY2VsbFJlc3VsdCA9ICR0aGlzLT5fREJIYW5kbGUtPnF1ZXJ5U2luZ2xlKCRxdWVyeSk7DQoJCWlmICgkY2VsbFJlc3VsdCA9PT0gZmFsc2UpIHsNCgkJCXRocm93IG5ldyBFeGNlcHRpb24oJHRoaXMtPl9EQkhhbmRsZS0+bGFzdEVycm9yTXNnKCkpOw0KCQl9IGVsc2VpZiAoaXNfbnVsbCgkY2VsbFJlc3VsdCkpIHsNCgkJCS8vCVJldHVybiBudWxsIGlmIHJlcXVlc3RlZCBlbnRyeSBkb2Vzbid0IGV4aXN0IGluIGNhY2hlDQoJCQlyZXR1cm4gbnVsbDsNCgkJfQ0KDQoJCS8vCVNldCBjdXJyZW50IGVudHJ5IHRvIHRoZSByZXF1ZXN0ZWQgZW50cnkNCgkJJHRoaXMtPl9jdXJyZW50T2JqZWN0SUQgPSAkcENvb3JkOw0KDQoJCSR0aGlzLT5fY3VycmVudE9iamVjdCA9IHVuc2VyaWFsaXplKCRjZWxsUmVzdWx0KTsNCgkJLy8JUmUtYXR0YWNoIHRoZSBwYXJlbnQgd29ya3NoZWV0DQoJCSR0aGlzLT5fY3VycmVudE9iamVjdC0+YXR0YWNoKCR0aGlzLT5fcGFyZW50KTsNCg0KCQkvLwlSZXR1cm4gcmVxdWVzdGVkIGVudHJ5DQoJCXJldHVybiAkdGhpcy0+X2N1cnJlbnRPYmplY3Q7DQoJfQkvLwlmdW5jdGlvbiBnZXRDYWNoZURhdGEoKQ0KDQoNCgkvKioNCgkgKglJcyBhIHZhbHVlIHNldCBmb3IgYW4gaW5kZXhlZCBjZWxsPw0KCSAqDQoJICogQHBhcmFtCXN0cmluZwkJJHBDb29yZAkJQ29vcmRpbmF0ZSBhZGRyZXNzIG9mIHRoZSBjZWxsIHRvIGNoZWNrDQoJICogQHJldHVybglib29sZWFuDQoJICovDQoJcHVibGljIGZ1bmN0aW9uIGlzRGF0YVNldCgkcENvb3JkKSB7DQoJCWlmICgkcENvb3JkID09PSAkdGhpcy0+X2N1cnJlbnRPYmplY3RJRCkgew0KCQkJcmV0dXJuIHRydWU7DQoJCX0NCg0KCQkvLwlDaGVjayBpZiB0aGUgcmVxdWVzdGVkIGVudHJ5IGV4aXN0cyBpbiB0aGUgY2FjaGUNCgkJJHF1ZXJ5ID0gIlNFTEVDVCBpZCBGUk9NIGt2cF8iLiR0aGlzLT5fVGFibGVOYW1lLiIgV0hFUkUgaWQ9JyIuJHBDb29yZC4iJyI7DQoJCSRjZWxsUmVzdWx0ID0gJHRoaXMtPl9EQkhhbmRsZS0+cXVlcnlTaW5nbGUoJHF1ZXJ5KTsNCgkJaWYgKCRjZWxsUmVzdWx0ID09PSBmYWxzZSkgew0KCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbigkdGhpcy0+X0RCSGFuZGxlLT5sYXN0RXJyb3JNc2coKSk7DQoJCX0gZWxzZWlmIChpc19udWxsKCRjZWxsUmVzdWx0KSkgew0KCQkJLy8JUmV0dXJuIG51bGwgaWYgcmVxdWVzdGVkIGVudHJ5IGRvZXNuJ3QgZXhpc3QgaW4gY2FjaGUNCgkJCXJldHVybiBmYWxzZTsNCgkJfQ0KCQlyZXR1cm4gdHJ1ZTsNCgl9CS8vCWZ1bmN0aW9uIGlzRGF0YVNldCgpDQoNCg0KICAgIC8qKg0KICAgICAqCURlbGV0ZSBhIGNlbGwgaW4gY2FjaGUgaWRlbnRpZmllZCBieSBjb29yZGluYXRlIGFkZHJlc3MNCiAgICAgKg0KICAgICAqIEBwYXJhbQlzdHJpbmcJCQkkcENvb3JkCQlDb29yZGluYXRlIGFkZHJlc3Mgb2YgdGhlIGNlbGwgdG8gZGVsZXRlDQogICAgICogQHRocm93cwlFeGNlcHRpb24NCiAgICAgKi8NCglwdWJsaWMgZnVuY3Rpb24gZGVsZXRlQ2FjaGVEYXRhKCRwQ29vcmQpIHsNCgkJaWYgKCRwQ29vcmQgPT09ICR0aGlzLT5fY3VycmVudE9iamVjdElEKSB7DQoJCQkkdGhpcy0+X2N1cnJlbnRPYmplY3QtPmRldGFjaCgpOw0KCQkJJHRoaXMtPl9jdXJyZW50T2JqZWN0SUQgPSAkdGhpcy0+X2N1cnJlbnRPYmplY3QgPSBudWxsOw0KCQl9DQoNCgkJLy8JQ2hlY2sgaWYgdGhlIHJlcXVlc3RlZCBlbnRyeSBleGlzdHMgaW4gdGhlIGNhY2hlDQoJCSRxdWVyeSA9ICJERUxFVEUgRlJPTSBrdnBfIi4kdGhpcy0+X1RhYmxlTmFtZS4iIFdIRVJFIGlkPSciLiRwQ29vcmQuIiciOw0KCQkkcmVzdWx0ID0gJHRoaXMtPl9EQkhhbmRsZS0+ZXhlYygkcXVlcnkpOw0KCQlpZiAoJHJlc3VsdCA9PT0gZmFsc2UpDQoJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCR0aGlzLT5fREJIYW5kbGUtPmxhc3RFcnJvck1zZygpKTsNCg0KCQkkdGhpcy0+X2N1cnJlbnRDZWxsSXNEaXJ0eSA9IGZhbHNlOw0KCX0JLy8JZnVuY3Rpb24gZGVsZXRlQ2FjaGVEYXRhKCkNCg0KDQoJLyoqDQoJICogR2V0IGEgbGlzdCBvZiBhbGwgY2VsbCBhZGRyZXNzZXMgY3VycmVudGx5IGhlbGQgaW4gY2FjaGUNCgkgKg0KCSAqIEByZXR1cm4JYXJyYXkgb2Ygc3RyaW5nDQoJICovDQoJcHVibGljIGZ1bmN0aW9uIGdldENlbGxMaXN0KCkgew0KCQkkcXVlcnkgPSAiU0VMRUNUIGlkIEZST00ga3ZwXyIuJHRoaXMtPl9UYWJsZU5hbWU7DQoJCSRjZWxsSWRzUmVzdWx0ID0gJHRoaXMtPl9EQkhhbmRsZS0+cXVlcnkoJHF1ZXJ5KTsNCgkJaWYgKCRjZWxsSWRzUmVzdWx0ID09PSBmYWxzZSkNCgkJCXRocm93IG5ldyBFeGNlcHRpb24oJHRoaXMtPl9EQkhhbmRsZS0+bGFzdEVycm9yTXNnKCkpOw0KDQoJCSRjZWxsS2V5cyA9IGFycmF5KCk7DQoJCXdoaWxlICgkcm93ID0gJGNlbGxJZHNSZXN1bHQtPmZldGNoQXJyYXkoU1FMSVRFM19BU1NPQykpIHsNCgkJCSRjZWxsS2V5c1tdID0gJHJvd1snaWQnXTsNCgkJfQ0KDQoJCXJldHVybiAkY2VsbEtleXM7DQoJfQkvLwlmdW5jdGlvbiBnZXRDZWxsTGlzdCgpDQoNCg0KCS8qKg0KCSAqIENsb25lIHRoZSBjZWxsIGNvbGxlY3Rpb24NCgkgKg0KCSAqIEBwYXJhbQlQSFBFeGNlbF9Xb3Jrc2hlZXQJJHBhcmVudAkJVGhlIG5ldyB3b3Jrc2hlZXQNCgkgKiBAcmV0dXJuCXZvaWQNCgkgKi8NCglwdWJsaWMgZnVuY3Rpb24gY29weUNlbGxDb2xsZWN0aW9uKFBIUEV4Y2VsX1dvcmtzaGVldCAkcGFyZW50KSB7DQoJCS8vCUdldCBhIG5ldyBpZCBmb3IgdGhlIG5ldyB0YWJsZSBuYW1lDQoJCSR0YWJsZU5hbWUgPSBzdHJfcmVwbGFjZSgnLicsJ18nLCR0aGlzLT5fZ2V0VW5pcXVlSUQoKSk7DQoJCWlmICghJHRoaXMtPl9EQkhhbmRsZS0+ZXhlYygnQ1JFQVRFIFRBQkxFIGt2cF8nLiR0YWJsZU5hbWUuJyAoaWQgVkFSQ0hBUigxMikgUFJJTUFSWSBLRVksIHZhbHVlIEJMT0IpDQoJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFTIFNFTEVDVCAqIEZST00ga3ZwXycuJHRoaXMtPl9UYWJsZU5hbWUpKQ0KCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbigkdGhpcy0+X0RCSGFuZGxlLT5sYXN0RXJyb3JNc2coKSk7DQoNCgkJLy8JQ29weSB0aGUgZXhpc3RpbmcgY2VsbCBjYWNoZSBmaWxlDQoJCSR0aGlzLT5fVGFibGVOYW1lID0gJHRhYmxlTmFtZTsNCgl9CS8vCWZ1bmN0aW9uIGNvcHlDZWxsQ29sbGVjdGlvbigpDQoNCg0KCS8qKg0KCSAqIENsZWFyIHRoZSBjZWxsIGNvbGxlY3Rpb24gYW5kIGRpc2Nvbm5lY3QgZnJvbSBvdXIgcGFyZW50DQoJICoNCgkgKiBAcmV0dXJuCXZvaWQNCgkgKi8NCglwdWJsaWMgZnVuY3Rpb24gdW5zZXRXb3Jrc2hlZXRDZWxscygpIHsNCgkJaWYoIWlzX251bGwoJHRoaXMtPl9jdXJyZW50T2JqZWN0KSkgew0KCQkJJHRoaXMtPl9jdXJyZW50T2JqZWN0LT5kZXRhY2goKTsNCgkJCSR0aGlzLT5fY3VycmVudE9iamVjdCA9ICR0aGlzLT5fY3VycmVudE9iamVjdElEID0gbnVsbDsNCgkJfQ0KCQkvLwlkZXRhY2ggb3Vyc2VsZiBmcm9tIHRoZSB3b3Jrc2hlZXQsIHNvIHRoYXQgaXQgY2FuIHRoZW4gZGVsZXRlIHRoaXMgb2JqZWN0IHN1Y2Nlc3NmdWxseQ0KCQkkdGhpcy0+X3BhcmVudCA9IG51bGw7DQoNCgkJLy8JQ2xvc2UgZG93biB0aGUgdGVtcG9yYXJ5IGNhY2hlIGZpbGUNCgkJJHRoaXMtPl9fZGVzdHJ1Y3QoKTsNCgl9CS8vCWZ1bmN0aW9uIHVuc2V0V29ya3NoZWV0Q2VsbHMoKQ0KDQoNCgkvKioNCgkgKiBJbml0aWFsaXNlIHRoaXMgbmV3IGNlbGwgY29sbGVjdGlvbg0KCSAqDQoJICogQHBhcmFtCVBIUEV4Y2VsX1dvcmtzaGVldAkkcGFyZW50CQlUaGUgd29ya3NoZWV0IGZvciB0aGlzIGNlbGwgY29sbGVjdGlvbg0KCSAqLw0KCXB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChQSFBFeGNlbF9Xb3Jrc2hlZXQgJHBhcmVudCkgew0KCQlwYXJlbnQ6Ol9fY29uc3RydWN0KCRwYXJlbnQpOw0KCQlpZiAoaXNfbnVsbCgkdGhpcy0+X0RCSGFuZGxlKSkgew0KCQkJJHRoaXMtPl9UYWJsZU5hbWUgPSBzdHJfcmVwbGFjZSgnLicsJ18nLCR0aGlzLT5fZ2V0VW5pcXVlSUQoKSk7DQoJCQkkX0RCTmFtZSA9ICc6bWVtb3J5Oic7DQoNCgkJCSR0aGlzLT5fREJIYW5kbGUgPSBuZXcgU1FMaXRlMygkX0RCTmFtZSk7DQoJCQlpZiAoJHRoaXMtPl9EQkhhbmRsZSA9PT0gZmFsc2UpDQoJCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbigkdGhpcy0+X0RCSGFuZGxlLT5sYXN0RXJyb3JNc2coKSk7DQoJCQlpZiAoISR0aGlzLT5fREJIYW5kbGUtPmV4ZWMoJ0NSRUFURSBUQUJMRSBrdnBfJy4kdGhpcy0+X1RhYmxlTmFtZS4nIChpZCBWQVJDSEFSKDEyKSBQUklNQVJZIEtFWSwgdmFsdWUgQkxPQiknKSkNCgkJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCR0aGlzLT5fREJIYW5kbGUtPmxhc3RFcnJvck1zZygpKTsNCgkJfQ0KCX0JLy8JZnVuY3Rpb24gX19jb25zdHJ1Y3QoKQ0KDQoNCgkvKioNCgkgKiBEZXN0cm95IHRoaXMgY2VsbCBjb2xsZWN0aW9uDQoJICovDQoJcHVibGljIGZ1bmN0aW9uIF9fZGVzdHJ1Y3QoKSB7DQoJCWlmICghaXNfbnVsbCgkdGhpcy0+X0RCSGFuZGxlKSkgew0KCQkJJHRoaXMtPl9EQkhhbmRsZS0+Y2xvc2UoKTsNCgkJfQ0KCQkkdGhpcy0+X0RCSGFuZGxlID0gbnVsbDsNCgl9CS8vCWZ1bmN0aW9uIF9fZGVzdHJ1Y3QoKQ0KDQoNCgkvKioNCgkgKiBJZGVudGlmeSB3aGV0aGVyIHRoZSBjYWNoaW5nIG1ldGhvZCBpcyBjdXJyZW50bHkgYXZhaWxhYmxlDQoJICogU29tZSBtZXRob2RzIGFyZSBkZXBlbmRlbnQgb24gdGhlIGF2YWlsYWJpbGl0eSBvZiBjZXJ0YWluIGV4dGVuc2lvbnMgYmVpbmcgZW5hYmxlZCBpbiB0aGUgUEhQIGJ1aWxkDQoJICoNCgkgKiBAcmV0dXJuCWJvb2xlYW4NCgkgKi8NCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGNhY2hlTWV0aG9kSXNBdmFpbGFibGUoKSB7DQoJCWlmICghY2xhc3NfZXhpc3RzKCdTUUxpdGUzJykpIHsNCgkJCXJldHVybiBmYWxzZTsNCgkJfQ0KDQoJCXJldHVybiB0cnVlOw0KCX0NCg0KfQ0K]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/CachedObjectStorage/Wincache.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCi8qKg0KICogUEhQRXhjZWwNCiAqDQogKiBDb3B5cmlnaHQgKGMpIDIwMDYgLSAyMDEyIFBIUEV4Y2VsDQogKg0KICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcg0KICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYw0KICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyDQogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4NCiAqDQogKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwNCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mDQogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQ0KICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4NCiAqDQogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljDQogKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlDQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0ENCiAqDQogKiBAY2F0ZWdvcnkgICBQSFBFeGNlbA0KICogQHBhY2thZ2UJUEhQRXhjZWxfQ2FjaGVkT2JqZWN0U3RvcmFnZQ0KICogQGNvcHlyaWdodCAgQ29weXJpZ2h0IChjKSAyMDA2IC0gMjAxMiBQSFBFeGNlbCAoaHR0cDovL3d3dy5jb2RlcGxleC5jb20vUEhQRXhjZWwpDQogKiBAbGljZW5zZQlodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvb2xkLWxpY2Vuc2VzL2xncGwtMi4xLnR4dAlMR1BMDQogKiBAdmVyc2lvbgkxLjcuNywgMjAxMi0wNS0xOQ0KICovDQoNCg0KLyoqDQogKiBQSFBFeGNlbF9DYWNoZWRPYmplY3RTdG9yYWdlX1dpbmNhY2hlDQogKg0KICogQGNhdGVnb3J5ICAgUEhQRXhjZWwNCiAqIEBwYWNrYWdlCVBIUEV4Y2VsX0NhY2hlZE9iamVjdFN0b3JhZ2UNCiAqIEBjb3B5cmlnaHQgIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwgKGh0dHA6Ly93d3cuY29kZXBsZXguY29tL1BIUEV4Y2VsKQ0KICovDQpjbGFzcyBQSFBFeGNlbF9DYWNoZWRPYmplY3RTdG9yYWdlX1dpbmNhY2hlIGV4dGVuZHMgUEhQRXhjZWxfQ2FjaGVkT2JqZWN0U3RvcmFnZV9DYWNoZUJhc2UgaW1wbGVtZW50cyBQSFBFeGNlbF9DYWNoZWRPYmplY3RTdG9yYWdlX0lDYWNoZSB7DQoNCgkvKioNCgkgKiBQcmVmaXggdXNlZCB0byB1bmlxdWVseSBpZGVudGlmeSBjYWNoZSBkYXRhIGZvciB0aGlzIHdvcmtzaGVldA0KCSAqDQoJICogQHZhciBzdHJpbmcNCgkgKi8NCglwcml2YXRlICRfY2FjaGVQcmVmaXggPSBudWxsOw0KDQoJLyoqDQoJICogQ2FjaGUgdGltZW91dA0KCSAqDQoJICogQHZhciBpbnRlZ2VyDQoJICovDQoJcHJpdmF0ZSAkX2NhY2hlVGltZSA9IDYwMDsNCg0KDQogICAgLyoqDQogICAgICogU3RvcmUgY2VsbCBkYXRhIGluIGNhY2hlIGZvciB0aGUgY3VycmVudCBjZWxsIG9iamVjdCBpZiBpdCdzICJkaXJ0eSIsDQogICAgICogICAgIGFuZCB0aGUgJ251bGxpZnknIHRoZSBjdXJyZW50IGNlbGwgb2JqZWN0DQogICAgICoNCgkgKiBAcmV0dXJuCXZvaWQNCiAgICAgKiBAdGhyb3dzCUV4Y2VwdGlvbg0KICAgICAqLw0KCXByaXZhdGUgZnVuY3Rpb24gX3N0b3JlRGF0YSgpIHsNCgkJaWYgKCR0aGlzLT5fY3VycmVudENlbGxJc0RpcnR5KSB7DQoJCQkkdGhpcy0+X2N1cnJlbnRPYmplY3QtPmRldGFjaCgpOw0KDQoJCQkkb2JqID0gc2VyaWFsaXplKCR0aGlzLT5fY3VycmVudE9iamVjdCk7DQoJCQlpZiAod2luY2FjaGVfdWNhY2hlX2V4aXN0cygkdGhpcy0+X2NhY2hlUHJlZml4LiR0aGlzLT5fY3VycmVudE9iamVjdElELicuY2FjaGUnKSkgew0KCQkJCWlmICghd2luY2FjaGVfdWNhY2hlX3NldCgkdGhpcy0+X2NhY2hlUHJlZml4LiR0aGlzLT5fY3VycmVudE9iamVjdElELicuY2FjaGUnLCAkb2JqLCAkdGhpcy0+X2NhY2hlVGltZSkpIHsNCgkJCQkJJHRoaXMtPl9fZGVzdHJ1Y3QoKTsNCgkJCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbignRmFpbGVkIHRvIHN0b3JlIGNlbGwgJy4kdGhpcy0+X2N1cnJlbnRPYmplY3RJRC4nIGluIFdpbkNhY2hlJyk7DQoJCQkJfQ0KCQkJfSBlbHNlIHsNCgkJCQlpZiAoIXdpbmNhY2hlX3VjYWNoZV9hZGQoJHRoaXMtPl9jYWNoZVByZWZpeC4kdGhpcy0+X2N1cnJlbnRPYmplY3RJRC4nLmNhY2hlJywgJG9iaiwgJHRoaXMtPl9jYWNoZVRpbWUpKSB7DQoJCQkJCSR0aGlzLT5fX2Rlc3RydWN0KCk7DQoJCQkJCXRocm93IG5ldyBFeGNlcHRpb24oJ0ZhaWxlZCB0byBzdG9yZSBjZWxsICcuJHRoaXMtPl9jdXJyZW50T2JqZWN0SUQuJyBpbiBXaW5DYWNoZScpOw0KCQkJCX0NCgkJCX0NCgkJCSR0aGlzLT5fY3VycmVudENlbGxJc0RpcnR5ID0gZmFsc2U7DQoJCX0NCg0KCQkkdGhpcy0+X2N1cnJlbnRPYmplY3RJRCA9ICR0aGlzLT5fY3VycmVudE9iamVjdCA9IG51bGw7DQoJfQkvLwlmdW5jdGlvbiBfc3RvcmVEYXRhKCkNCg0KDQoJLyoqDQoJICogQWRkIG9yIFVwZGF0ZSBhIGNlbGwgaW4gY2FjaGUgaWRlbnRpZmllZCBieSBjb29yZGluYXRlIGFkZHJlc3MNCgkgKg0KCSAqIEBwYXJhbQlzdHJpbmcJCQkkcENvb3JkCQlDb29yZGluYXRlIGFkZHJlc3Mgb2YgdGhlIGNlbGwgdG8gdXBkYXRlDQoJICogQHBhcmFtCVBIUEV4Y2VsX0NlbGwJJGNlbGwJCUNlbGwgdG8gdXBkYXRlDQoJICogQHJldHVybgl2b2lkDQoJICogQHRocm93cwlFeGNlcHRpb24NCgkgKi8NCglwdWJsaWMgZnVuY3Rpb24gYWRkQ2FjaGVEYXRhKCRwQ29vcmQsIFBIUEV4Y2VsX0NlbGwgJGNlbGwpIHsNCgkJaWYgKCgkcENvb3JkICE9PSAkdGhpcy0+X2N1cnJlbnRPYmplY3RJRCkgJiYgKCR0aGlzLT5fY3VycmVudE9iamVjdElEICE9PSBudWxsKSkgew0KCQkJJHRoaXMtPl9zdG9yZURhdGEoKTsNCgkJfQ0KCQkkdGhpcy0+X2NlbGxDYWNoZVskcENvb3JkXSA9IHRydWU7DQoNCgkJJHRoaXMtPl9jdXJyZW50T2JqZWN0SUQgPSAkcENvb3JkOw0KCQkkdGhpcy0+X2N1cnJlbnRPYmplY3QgPSAkY2VsbDsNCgkJJHRoaXMtPl9jdXJyZW50Q2VsbElzRGlydHkgPSB0cnVlOw0KDQoJCXJldHVybiAkY2VsbDsNCgl9CS8vCWZ1bmN0aW9uIGFkZENhY2hlRGF0YSgpDQoNCg0KCS8qKg0KCSAqIElzIGEgdmFsdWUgc2V0IGluIHRoZSBjdXJyZW50IFBIUEV4Y2VsX0NhY2hlZE9iamVjdFN0b3JhZ2VfSUNhY2hlIGZvciBhbiBpbmRleGVkIGNlbGw/DQoJICoNCgkgKiBAcGFyYW0Jc3RyaW5nCQkkcENvb3JkCQlDb29yZGluYXRlIGFkZHJlc3Mgb2YgdGhlIGNlbGwgdG8gY2hlY2sNCgkgKiBAcmV0dXJuCWJvb2xlYW4NCgkgKi8NCglwdWJsaWMgZnVuY3Rpb24gaXNEYXRhU2V0KCRwQ29vcmQpIHsNCgkJLy8JQ2hlY2sgaWYgdGhlIHJlcXVlc3RlZCBlbnRyeSBpcyB0aGUgY3VycmVudCBvYmplY3QsIG9yIGV4aXN0cyBpbiB0aGUgY2FjaGUNCgkJaWYgKHBhcmVudDo6aXNEYXRhU2V0KCRwQ29vcmQpKSB7DQoJCQlpZiAoJHRoaXMtPl9jdXJyZW50T2JqZWN0SUQgPT0gJHBDb29yZCkgew0KCQkJCXJldHVybiB0cnVlOw0KCQkJfQ0KCQkJLy8JQ2hlY2sgaWYgdGhlIHJlcXVlc3RlZCBlbnRyeSBzdGlsbCBleGlzdHMgaW4gY2FjaGUNCgkJCSRzdWNjZXNzID0gd2luY2FjaGVfdWNhY2hlX2V4aXN0cygkdGhpcy0+X2NhY2hlUHJlZml4LiRwQ29vcmQuJy5jYWNoZScpOw0KCQkJaWYgKCRzdWNjZXNzID09PSBmYWxzZSkgew0KCQkJCS8vCUVudHJ5IG5vIGxvbmdlciBleGlzdHMgaW4gV2luY2FjaGUsIHNvIGNsZWFyIGl0IGZyb20gdGhlIGNhY2hlIGFycmF5DQoJCQkJcGFyZW50OjpkZWxldGVDYWNoZURhdGEoJHBDb29yZCk7DQoJCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbignQ2VsbCBlbnRyeSAnLiRwQ29vcmQuJyBubyBsb25nZXIgZXhpc3RzIGluIFdpbkNhY2hlJyk7DQoJCQl9DQoJCQlyZXR1cm4gdHJ1ZTsNCgkJfQ0KCQlyZXR1cm4gZmFsc2U7DQoJfQkvLwlmdW5jdGlvbiBpc0RhdGFTZXQoKQ0KDQoNCgkvKioNCgkgKiBHZXQgY2VsbCBhdCBhIHNwZWNpZmljIGNvb3JkaW5hdGUNCgkgKg0KCSAqIEBwYXJhbQlzdHJpbmcJCQkkcENvb3JkCQlDb29yZGluYXRlIG9mIHRoZSBjZWxsDQoJICogQHRocm93cwlFeGNlcHRpb24NCgkgKiBAcmV0dXJuCVBIUEV4Y2VsX0NlbGwJQ2VsbCB0aGF0IHdhcyBmb3VuZCwgb3IgbnVsbCBpZiBub3QgZm91bmQNCgkgKi8NCglwdWJsaWMgZnVuY3Rpb24gZ2V0Q2FjaGVEYXRhKCRwQ29vcmQpIHsNCgkJaWYgKCRwQ29vcmQgPT09ICR0aGlzLT5fY3VycmVudE9iamVjdElEKSB7DQoJCQlyZXR1cm4gJHRoaXMtPl9jdXJyZW50T2JqZWN0Ow0KCQl9DQoJCSR0aGlzLT5fc3RvcmVEYXRhKCk7DQoNCgkJLy8JQ2hlY2sgaWYgdGhlIGVudHJ5IHRoYXQgaGFzIGJlZW4gcmVxdWVzdGVkIGFjdHVhbGx5IGV4aXN0cw0KCQkkb2JqID0gbnVsbDsNCgkJaWYgKHBhcmVudDo6aXNEYXRhU2V0KCRwQ29vcmQpKSB7DQoJCQkkc3VjY2VzcyA9IGZhbHNlOw0KCQkJJG9iaiA9IHdpbmNhY2hlX3VjYWNoZV9nZXQoJHRoaXMtPl9jYWNoZVByZWZpeC4kcENvb3JkLicuY2FjaGUnLCAkc3VjY2Vzcyk7DQoJCQlpZiAoJHN1Y2Nlc3MgPT09IGZhbHNlKSB7DQoJCQkJLy8JRW50cnkgbm8gbG9uZ2VyIGV4aXN0cyBpbiBXaW5DYWNoZSwgc28gY2xlYXIgaXQgZnJvbSB0aGUgY2FjaGUgYXJyYXkNCgkJCQlwYXJlbnQ6OmRlbGV0ZUNhY2hlRGF0YSgkcENvb3JkKTsNCgkJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCdDZWxsIGVudHJ5ICcuJHBDb29yZC4nIG5vIGxvbmdlciBleGlzdHMgaW4gV2luQ2FjaGUnKTsNCgkJCX0NCgkJfSBlbHNlIHsNCgkJCS8vCVJldHVybiBudWxsIGlmIHJlcXVlc3RlZCBlbnRyeSBkb2Vzbid0IGV4aXN0IGluIGNhY2hlDQoJCQlyZXR1cm4gbnVsbDsNCgkJfQ0KDQoJCS8vCVNldCBjdXJyZW50IGVudHJ5IHRvIHRoZSByZXF1ZXN0ZWQgZW50cnkNCgkJJHRoaXMtPl9jdXJyZW50T2JqZWN0SUQgPSAkcENvb3JkOw0KCQkkdGhpcy0+X2N1cnJlbnRPYmplY3QgPSB1bnNlcmlhbGl6ZSgkb2JqKTsNCgkJLy8JUmUtYXR0YWNoIHRoZSBwYXJlbnQgd29ya3NoZWV0DQoJCSR0aGlzLT5fY3VycmVudE9iamVjdC0+YXR0YWNoKCR0aGlzLT5fcGFyZW50KTsNCg0KCQkvLwlSZXR1cm4gcmVxdWVzdGVkIGVudHJ5DQoJCXJldHVybiAkdGhpcy0+X2N1cnJlbnRPYmplY3Q7DQoJfQkvLwlmdW5jdGlvbiBnZXRDYWNoZURhdGEoKQ0KDQoNCgkvKioNCgkgKiBEZWxldGUgYSBjZWxsIGluIGNhY2hlIGlkZW50aWZpZWQgYnkgY29vcmRpbmF0ZSBhZGRyZXNzDQoJICoNCgkgKiBAcGFyYW0Jc3RyaW5nCQkJJHBDb29yZAkJQ29vcmRpbmF0ZSBhZGRyZXNzIG9mIHRoZSBjZWxsIHRvIGRlbGV0ZQ0KCSAqIEB0aHJvd3MJRXhjZXB0aW9uDQoJICovDQoJcHVibGljIGZ1bmN0aW9uIGRlbGV0ZUNhY2hlRGF0YSgkcENvb3JkKSB7DQoJCS8vCURlbGV0ZSB0aGUgZW50cnkgZnJvbSBXaW5jYWNoZQ0KCQl3aW5jYWNoZV91Y2FjaGVfZGVsZXRlKCR0aGlzLT5fY2FjaGVQcmVmaXguJHBDb29yZC4nLmNhY2hlJyk7DQoNCgkJLy8JRGVsZXRlIHRoZSBlbnRyeSBmcm9tIG91ciBjZWxsIGFkZHJlc3MgYXJyYXkNCgkJcGFyZW50OjpkZWxldGVDYWNoZURhdGEoJHBDb29yZCk7DQoJfQkvLwlmdW5jdGlvbiBkZWxldGVDYWNoZURhdGEoKQ0KDQoNCgkvKioNCgkgKiBDbG9uZSB0aGUgY2VsbCBjb2xsZWN0aW9uDQoJICoNCgkgKiBAcGFyYW0JUEhQRXhjZWxfV29ya3NoZWV0CSRwYXJlbnQJCVRoZSBuZXcgd29ya3NoZWV0DQoJICogQHJldHVybgl2b2lkDQoJICovDQoJcHVibGljIGZ1bmN0aW9uIGNvcHlDZWxsQ29sbGVjdGlvbihQSFBFeGNlbF9Xb3Jrc2hlZXQgJHBhcmVudCkgew0KCQlwYXJlbnQ6OmNvcHlDZWxsQ29sbGVjdGlvbigkcGFyZW50KTsNCgkJLy8JR2V0IGEgbmV3IGlkIGZvciB0aGUgbmV3IGZpbGUgbmFtZQ0KCQkkYmFzZVVuaXF1ZSA9ICR0aGlzLT5fZ2V0VW5pcXVlSUQoKTsNCgkJJG5ld0NhY2hlUHJlZml4ID0gc3Vic3RyKG1kNSgkYmFzZVVuaXF1ZSksMCw4KS4nLic7DQoJCSRjYWNoZUxpc3QgPSAkdGhpcy0+Z2V0Q2VsbExpc3QoKTsNCgkJZm9yZWFjaCgkY2FjaGVMaXN0IGFzICRjZWxsSUQpIHsNCgkJCWlmICgkY2VsbElEICE9ICR0aGlzLT5fY3VycmVudE9iamVjdElEKSB7DQoJCQkJJHN1Y2Nlc3MgPSBmYWxzZTsNCgkJCQkkb2JqID0gd2luY2FjaGVfdWNhY2hlX2dldCgkdGhpcy0+X2NhY2hlUHJlZml4LiRjZWxsSUQuJy5jYWNoZScsICRzdWNjZXNzKTsNCgkJCQlpZiAoJHN1Y2Nlc3MgPT09IGZhbHNlKSB7DQoJCQkJCS8vCUVudHJ5IG5vIGxvbmdlciBleGlzdHMgaW4gV2luQ2FjaGUsIHNvIGNsZWFyIGl0IGZyb20gdGhlIGNhY2hlIGFycmF5DQoJCQkJCXBhcmVudDo6ZGVsZXRlQ2FjaGVEYXRhKCRjZWxsSUQpOw0KCQkJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCdDZWxsIGVudHJ5ICcuJGNlbGxJRC4nIG5vIGxvbmdlciBleGlzdHMgaW4gV2luY2FjaGUnKTsNCgkJCQl9DQoJCQkJaWYgKCF3aW5jYWNoZV91Y2FjaGVfYWRkKCRuZXdDYWNoZVByZWZpeC4kY2VsbElELicuY2FjaGUnLCAkb2JqLCAkdGhpcy0+X2NhY2hlVGltZSkpIHsNCgkJCQkJJHRoaXMtPl9fZGVzdHJ1Y3QoKTsNCgkJCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbignRmFpbGVkIHRvIHN0b3JlIGNlbGwgJy4kY2VsbElELicgaW4gV2luY2FjaGUnKTsNCgkJCQl9DQoJCQl9DQoJCX0NCgkJJHRoaXMtPl9jYWNoZVByZWZpeCA9ICRuZXdDYWNoZVByZWZpeDsNCgl9CS8vCWZ1bmN0aW9uIGNvcHlDZWxsQ29sbGVjdGlvbigpDQoNCg0KCS8qKg0KCSAqIENsZWFyIHRoZSBjZWxsIGNvbGxlY3Rpb24gYW5kIGRpc2Nvbm5lY3QgZnJvbSBvdXIgcGFyZW50DQoJICoNCgkgKiBAcmV0dXJuCXZvaWQNCgkgKi8NCglwdWJsaWMgZnVuY3Rpb24gdW5zZXRXb3Jrc2hlZXRDZWxscygpIHsNCgkJaWYoIWlzX251bGwoJHRoaXMtPl9jdXJyZW50T2JqZWN0KSkgew0KCQkJJHRoaXMtPl9jdXJyZW50T2JqZWN0LT5kZXRhY2goKTsNCgkJCSR0aGlzLT5fY3VycmVudE9iamVjdCA9ICR0aGlzLT5fY3VycmVudE9iamVjdElEID0gbnVsbDsNCgkJfQ0KDQoJCS8vCUZsdXNoIHRoZSBXaW5DYWNoZSBjYWNoZQ0KCQkkdGhpcy0+X19kZXN0cnVjdCgpOw0KDQoJCSR0aGlzLT5fY2VsbENhY2hlID0gYXJyYXkoKTsNCg0KCQkvLwlkZXRhY2ggb3Vyc2VsZiBmcm9tIHRoZSB3b3Jrc2hlZXQsIHNvIHRoYXQgaXQgY2FuIHRoZW4gZGVsZXRlIHRoaXMgb2JqZWN0IHN1Y2Nlc3NmdWxseQ0KCQkkdGhpcy0+X3BhcmVudCA9IG51bGw7DQoJfQkvLwlmdW5jdGlvbiB1bnNldFdvcmtzaGVldENlbGxzKCkNCg0KDQoJLyoqDQoJICogSW5pdGlhbGlzZSB0aGlzIG5ldyBjZWxsIGNvbGxlY3Rpb24NCgkgKg0KCSAqIEBwYXJhbQlQSFBFeGNlbF9Xb3Jrc2hlZXQJJHBhcmVudAkJVGhlIHdvcmtzaGVldCBmb3IgdGhpcyBjZWxsIGNvbGxlY3Rpb24NCgkgKiBAcGFyYW0JYXJyYXkgb2YgbWl4ZWQJCSRhcmd1bWVudHMJQWRkaXRpb25hbCBpbml0aWFsaXNhdGlvbiBhcmd1bWVudHMNCgkgKi8NCglwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoUEhQRXhjZWxfV29ya3NoZWV0ICRwYXJlbnQsICRhcmd1bWVudHMpIHsNCgkJJGNhY2hlVGltZQk9IChpc3NldCgkYXJndW1lbnRzWydjYWNoZVRpbWUnXSkpCT8gJGFyZ3VtZW50c1snY2FjaGVUaW1lJ10JOiA2MDA7DQoNCgkJaWYgKGlzX251bGwoJHRoaXMtPl9jYWNoZVByZWZpeCkpIHsNCgkJCSRiYXNlVW5pcXVlID0gJHRoaXMtPl9nZXRVbmlxdWVJRCgpOw0KCQkJJHRoaXMtPl9jYWNoZVByZWZpeCA9IHN1YnN0cihtZDUoJGJhc2VVbmlxdWUpLDAsOCkuJy4nOw0KCQkJJHRoaXMtPl9jYWNoZVRpbWUgPSAkY2FjaGVUaW1lOw0KDQoJCQlwYXJlbnQ6Ol9fY29uc3RydWN0KCRwYXJlbnQpOw0KCQl9DQoJfQkvLwlmdW5jdGlvbiBfX2NvbnN0cnVjdCgpDQoNCg0KCS8qKg0KCSAqIERlc3Ryb3kgdGhpcyBjZWxsIGNvbGxlY3Rpb24NCgkgKi8NCglwdWJsaWMgZnVuY3Rpb24gX19kZXN0cnVjdCgpIHsNCgkJJGNhY2hlTGlzdCA9ICR0aGlzLT5nZXRDZWxsTGlzdCgpOw0KCQlmb3JlYWNoKCRjYWNoZUxpc3QgYXMgJGNlbGxJRCkgew0KCQkJd2luY2FjaGVfdWNhY2hlX2RlbGV0ZSgkdGhpcy0+X2NhY2hlUHJlZml4LiRjZWxsSUQuJy5jYWNoZScpOw0KCQl9DQoJfQkvLwlmdW5jdGlvbiBfX2Rlc3RydWN0KCkNCg0KDQoJLyoqDQoJICogSWRlbnRpZnkgd2hldGhlciB0aGUgY2FjaGluZyBtZXRob2QgaXMgY3VycmVudGx5IGF2YWlsYWJsZQ0KCSAqIFNvbWUgbWV0aG9kcyBhcmUgZGVwZW5kZW50IG9uIHRoZSBhdmFpbGFiaWxpdHkgb2YgY2VydGFpbiBleHRlbnNpb25zIGJlaW5nIGVuYWJsZWQgaW4gdGhlIFBIUCBidWlsZA0KCSAqDQoJICogQHJldHVybglib29sZWFuDQoJICovDQoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBjYWNoZU1ldGhvZElzQXZhaWxhYmxlKCkgew0KCQlpZiAoIWZ1bmN0aW9uX2V4aXN0cygnd2luY2FjaGVfdWNhY2hlX2FkZCcpKSB7DQoJCQlyZXR1cm4gZmFsc2U7DQoJCX0NCg0KCQlyZXR1cm4gdHJ1ZTsNCgl9DQoNCn0NCg==]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/CachedObjectStorageFactory.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCg0KLyoqDQogKiBQSFBFeGNlbA0KICoNCiAqIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwNCiAqDQogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yDQogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljDQogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXINCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLg0KICoNCiAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLA0KICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YNCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VDQogKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLg0KICoNCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMNCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUNCiAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQ0KICoNCiAqIEBjYXRlZ29yeSAgIFBIUEV4Y2VsDQogKiBAcGFja2FnZSAgICBQSFBFeGNlbA0KICogQGNvcHlyaWdodCAgQ29weXJpZ2h0IChjKSAyMDA2IC0gMjAxMiBQSFBFeGNlbCAoaHR0cDovL3d3dy5jb2RlcGxleC5jb20vUEhQRXhjZWwpDQogKiBAbGljZW5zZSAgICBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvb2xkLWxpY2Vuc2VzL2xncGwtMi4xLnR4dAlMR1BMDQogKiBAdmVyc2lvbiAgICAxLjcuNywgMjAxMi0wNS0xOQ0KICovDQoNCg0KLyoqDQogKiBQSFBFeGNlbF9DYWNoZWRPYmplY3RTdG9yYWdlRmFjdG9yeQ0KICoNCiAqIEBjYXRlZ29yeQlQSFBFeGNlbA0KICogQHBhY2thZ2UJCVBIUEV4Y2VsX0NhY2hlZE9iamVjdFN0b3JhZ2UNCiAqIEBjb3B5cmlnaHQJQ29weXJpZ2h0IChjKSAyMDA2IC0gMjAxMiBQSFBFeGNlbCAoaHR0cDovL3d3dy5jb2RlcGxleC5jb20vUEhQRXhjZWwpDQogKi8NCmNsYXNzIFBIUEV4Y2VsX0NhY2hlZE9iamVjdFN0b3JhZ2VGYWN0b3J5DQp7DQoJY29uc3QgY2FjaGVfaW5fbWVtb3J5CQkJCT0gJ01lbW9yeSc7DQoJY29uc3QgY2FjaGVfaW5fbWVtb3J5X2d6aXAJCQk9ICdNZW1vcnlHWmlwJzsNCgljb25zdCBjYWNoZV9pbl9tZW1vcnlfc2VyaWFsaXplZAk9ICdNZW1vcnlTZXJpYWxpemVkJzsNCgljb25zdCBjYWNoZV9pZ2JpbmFyeQkJCQk9ICdJZ2JpbmFyeSc7DQoJY29uc3QgY2FjaGVfdG9fZGlzY0lTQU0JCQkJPSAnRGlzY0lTQU0nOw0KCWNvbnN0IGNhY2hlX3RvX2FwYwkJCQkJPSAnQVBDJzsNCgljb25zdCBjYWNoZV90b19tZW1jYWNoZQkJCQk9ICdNZW1jYWNoZSc7DQoJY29uc3QgY2FjaGVfdG9fcGhwVGVtcAkJCQk9ICdQSFBUZW1wJzsNCgljb25zdCBjYWNoZV90b193aW5jYWNoZQkJCQk9ICdXaW5jYWNoZSc7DQoJY29uc3QgY2FjaGVfdG9fc3FsaXRlCQkJCT0gJ1NRTGl0ZSc7DQoJY29uc3QgY2FjaGVfdG9fc3FsaXRlMwkJCQk9ICdTUUxpdGUzJzsNCg0KDQoJLyoqDQoJICogTmFtZSBvZiB0aGUgbWV0aG9kIHVzZWQgZm9yIGNlbGwgY2FjaGVpbmcNCgkgKg0KCSAqIEB2YXIgc3RyaW5nDQoJICovDQoJcHJpdmF0ZSBzdGF0aWMgJF9jYWNoZVN0b3JhZ2VNZXRob2QgPSBOVUxMOw0KDQoJLyoqDQoJICogTmFtZSBvZiB0aGUgY2xhc3MgdXNlZCBmb3IgY2VsbCBjYWNoZWluZw0KCSAqDQoJICogQHZhciBzdHJpbmcNCgkgKi8NCglwcml2YXRlIHN0YXRpYyAkX2NhY2hlU3RvcmFnZUNsYXNzID0gTlVMTDsNCg0KDQoJLyoqDQoJICogTGlzdCBvZiBhbGwgcG9zc2libGUgY2FjaGUgc3RvcmFnZSBtZXRob2RzDQoJICoNCgkgKiBAdmFyIHN0cmluZ1tdDQoJICovDQoJcHJpdmF0ZSBzdGF0aWMgJF9zdG9yYWdlTWV0aG9kcyA9IGFycmF5KA0KCQlzZWxmOjpjYWNoZV9pbl9tZW1vcnksDQoJCXNlbGY6OmNhY2hlX2luX21lbW9yeV9nemlwLA0KCQlzZWxmOjpjYWNoZV9pbl9tZW1vcnlfc2VyaWFsaXplZCwNCgkJc2VsZjo6Y2FjaGVfaWdiaW5hcnksDQoJCXNlbGY6OmNhY2hlX3RvX3BocFRlbXAsDQoJCXNlbGY6OmNhY2hlX3RvX2Rpc2NJU0FNLA0KCQlzZWxmOjpjYWNoZV90b19hcGMsDQoJCXNlbGY6OmNhY2hlX3RvX21lbWNhY2hlLA0KCQlzZWxmOjpjYWNoZV90b193aW5jYWNoZSwNCgkJc2VsZjo6Y2FjaGVfdG9fc3FsaXRlLA0KCQlzZWxmOjpjYWNoZV90b19zcWxpdGUzLA0KCSk7DQoNCg0KCS8qKg0KCSAqIERlZmF1bHQgYXJndW1lbnRzIGZvciBlYWNoIGNhY2hlIHN0b3JhZ2UgbWV0aG9kDQoJICoNCgkgKiBAdmFyIGFycmF5IG9mIG1peGVkIGFycmF5DQoJICovDQoJcHJpdmF0ZSBzdGF0aWMgJF9zdG9yYWdlTWV0aG9kRGVmYXVsdFBhcmFtZXRlcnMgPSBhcnJheSgNCgkJc2VsZjo6Y2FjaGVfaW5fbWVtb3J5CQkJCT0+IGFycmF5KA0KCQkJCQkJCQkJCQkJCSksDQoJCXNlbGY6OmNhY2hlX2luX21lbW9yeV9nemlwCQkJPT4gYXJyYXkoDQoJCQkJCQkJCQkJCQkJKSwNCgkJc2VsZjo6Y2FjaGVfaW5fbWVtb3J5X3NlcmlhbGl6ZWQJPT4gYXJyYXkoDQoJCQkJCQkJCQkJCQkJKSwNCgkJc2VsZjo6Y2FjaGVfaWdiaW5hcnkJCQkJPT4gYXJyYXkoDQoJCQkJCQkJCQkJCQkJKSwNCgkJc2VsZjo6Y2FjaGVfdG9fcGhwVGVtcAkJCQk9PiBhcnJheSggJ21lbW9yeUNhY2hlU2l6ZScJPT4gJzFNQicNCgkJCQkJCQkJCQkJCQkpLA0KCQlzZWxmOjpjYWNoZV90b19kaXNjSVNBTQkJCQk9PiBhcnJheSggJ2RpcicJCQkJPT4gTlVMTA0KCQkJCQkJCQkJCQkJCSksDQoJCXNlbGY6OmNhY2hlX3RvX2FwYwkJCQkJPT4gYXJyYXkoICdjYWNoZVRpbWUnCQk9PiA2MDANCgkJCQkJCQkJCQkJCQkpLA0KCQlzZWxmOjpjYWNoZV90b19tZW1jYWNoZQkJCQk9PiBhcnJheSggJ21lbWNhY2hlU2VydmVyJwk9PiAnbG9jYWxob3N0JywNCgkJCQkJCQkJCQkJCQkgICdtZW1jYWNoZVBvcnQnCT0+IDExMjExLA0KCQkJCQkJCQkJCQkJCSAgJ2NhY2hlVGltZScJCT0+IDYwMA0KCQkJCQkJCQkJCQkJCSksDQoJCXNlbGY6OmNhY2hlX3RvX3dpbmNhY2hlCQkJCT0+IGFycmF5KCAnY2FjaGVUaW1lJwkJPT4gNjAwDQoJCQkJCQkJCQkJCQkJKSwNCgkJc2VsZjo6Y2FjaGVfdG9fc3FsaXRlCQkJCT0+IGFycmF5KA0KCQkJCQkJCQkJCQkJCSksDQoJCXNlbGY6OmNhY2hlX3RvX3NxbGl0ZTMJCQkJPT4gYXJyYXkoDQoJCQkJCQkJCQkJCQkJKSwNCgkpOw0KDQoNCgkvKioNCgkgKiBBcmd1bWVudHMgZm9yIHRoZSBhY3RpdmUgY2FjaGUgc3RvcmFnZSBtZXRob2QNCgkgKg0KCSAqIEB2YXIgYXJyYXkgb2YgbWl4ZWQgYXJyYXkNCgkgKi8NCglwcml2YXRlIHN0YXRpYyAkX3N0b3JhZ2VNZXRob2RQYXJhbWV0ZXJzID0gYXJyYXkoKTsNCg0KDQoJLyoqDQoJICogUmV0dXJuIHRoZSBjdXJyZW50IGNhY2hlIHN0b3JhZ2UgbWV0aG9kDQoJICoNCgkgKiBAcmV0dXJuIHN0cmluZ3xOVUxMDQoJICoqLw0KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0Q2FjaGVTdG9yYWdlTWV0aG9kKCkNCgl7DQoJCWlmIChzZWxmOjokX2NhY2hlU3RvcmFnZU1ldGhvZCAhPT0gTlVMTCkgew0KCQkJcmV0dXJuIHNlbGY6OiRfY2FjaGVTdG9yYWdlTWV0aG9kOw0KCQl9DQoJCXJldHVybiBOVUxMOw0KCX0JLy8JZnVuY3Rpb24gZ2V0Q2FjaGVTdG9yYWdlTWV0aG9kKCkNCg0KDQoJLyoqDQoJICogUmV0dXJuIHRoZSBjdXJyZW50IGNhY2hlIHN0b3JhZ2UgY2xhc3MNCgkgKg0KCSAqIEByZXR1cm4gUEhQRXhjZWxfQ2FjaGVkT2JqZWN0U3RvcmFnZV9JQ2FjaGV8TlVMTA0KCSAqKi8NCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldENhY2hlU3RvcmFnZUNsYXNzKCkNCgl7DQoJCWlmIChzZWxmOjokX2NhY2hlU3RvcmFnZUNsYXNzICE9PSBOVUxMKSB7DQoJCQlyZXR1cm4gc2VsZjo6JF9jYWNoZVN0b3JhZ2VDbGFzczsNCgkJfQ0KCQlyZXR1cm4gTlVMTDsNCgl9CS8vCWZ1bmN0aW9uIGdldENhY2hlU3RvcmFnZUNsYXNzKCkNCg0KDQoJLyoqDQoJICogUmV0dXJuIHRoZSBsaXN0IG9mIGFsbCBwb3NzaWJsZSBjYWNoZSBzdG9yYWdlIG1ldGhvZHMNCgkgKg0KCSAqIEByZXR1cm4gc3RyaW5nW10NCgkgKiovDQoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRBbGxDYWNoZVN0b3JhZ2VNZXRob2RzKCkNCgl7DQoJCXJldHVybiBzZWxmOjokX3N0b3JhZ2VNZXRob2RzOw0KCX0JLy8JZnVuY3Rpb24gZ2V0Q2FjaGVTdG9yYWdlTWV0aG9kcygpDQoNCg0KCS8qKg0KCSAqIFJldHVybiB0aGUgbGlzdCBvZiBhbGwgYXZhaWxhYmxlIGNhY2hlIHN0b3JhZ2UgbWV0aG9kcw0KCSAqDQoJICogQHJldHVybiBzdHJpbmdbXQ0KCSAqKi8NCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldENhY2hlU3RvcmFnZU1ldGhvZHMoKQ0KCXsNCgkJJGFjdGl2ZU1ldGhvZHMgPSBhcnJheSgpOw0KCQlmb3JlYWNoKHNlbGY6OiRfc3RvcmFnZU1ldGhvZHMgYXMgJHN0b3JhZ2VNZXRob2QpIHsNCgkJCSRjYWNoZVN0b3JhZ2VDbGFzcyA9ICdQSFBFeGNlbF9DYWNoZWRPYmplY3RTdG9yYWdlXycgLiAkc3RvcmFnZU1ldGhvZDsNCgkJCWlmIChjYWxsX3VzZXJfZnVuYyhhcnJheSgkY2FjaGVTdG9yYWdlQ2xhc3MsICdjYWNoZU1ldGhvZElzQXZhaWxhYmxlJykpKSB7DQoJCQkJJGFjdGl2ZU1ldGhvZHNbXSA9ICRzdG9yYWdlTWV0aG9kOw0KCQkJfQ0KCQl9DQoJCXJldHVybiAkYWN0aXZlTWV0aG9kczsNCgl9CS8vCWZ1bmN0aW9uIGdldENhY2hlU3RvcmFnZU1ldGhvZHMoKQ0KDQoNCgkvKioNCgkgKiBJZGVudGlmeSB0aGUgY2FjaGUgc3RvcmFnZSBtZXRob2QgdG8gdXNlDQoJICoNCgkgKiBAcGFyYW0Jc3RyaW5nCQkJJG1ldGhvZAkJTmFtZSBvZiB0aGUgbWV0aG9kIHRvIHVzZSBmb3IgY2VsbCBjYWNoZWluZw0KCSAqIEBwYXJhbQlhcnJheSBvZiBtaXhlZAkkYXJndW1lbnRzCUFkZGl0aW9uYWwgYXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIGNlbGwgY2FjaGluZyBjbGFzcw0KCSAqCQkJCQkJCQkJCXdoZW4gaW5zdGFudGlhdGluZw0KCSAqIEByZXR1cm4gYm9vbGVhbg0KCSAqKi8NCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGluaXRpYWxpemUoJG1ldGhvZCA9IHNlbGY6OmNhY2hlX2luX21lbW9yeSwgJGFyZ3VtZW50cyA9IGFycmF5KCkpDQoJew0KCQlpZiAoIWluX2FycmF5KCRtZXRob2Qsc2VsZjo6JF9zdG9yYWdlTWV0aG9kcykpIHsNCgkJCXJldHVybiBGQUxTRTsNCgkJfQ0KDQoJCSRjYWNoZVN0b3JhZ2VDbGFzcyA9ICdQSFBFeGNlbF9DYWNoZWRPYmplY3RTdG9yYWdlXycuJG1ldGhvZDsNCgkJaWYgKCFjYWxsX3VzZXJfZnVuYyhhcnJheSggJGNhY2hlU3RvcmFnZUNsYXNzLA0KCQkJCQkJCQkgICAnY2FjaGVNZXRob2RJc0F2YWlsYWJsZScpKSkgew0KCQkJcmV0dXJuIEZBTFNFOw0KCQl9DQoNCgkJc2VsZjo6JF9zdG9yYWdlTWV0aG9kUGFyYW1ldGVyc1skbWV0aG9kXSA9IHNlbGY6OiRfc3RvcmFnZU1ldGhvZERlZmF1bHRQYXJhbWV0ZXJzWyRtZXRob2RdOw0KCQlmb3JlYWNoKCRhcmd1bWVudHMgYXMgJGsgPT4gJHYpIHsNCgkJCWlmIChpc3NldChzZWxmOjokX3N0b3JhZ2VNZXRob2RQYXJhbWV0ZXJzWyRtZXRob2RdWyRrXSkpIHsNCgkJCQlzZWxmOjokX3N0b3JhZ2VNZXRob2RQYXJhbWV0ZXJzWyRtZXRob2RdWyRrXSA9ICR2Ow0KCQkJfQ0KCQl9DQoNCgkJaWYgKHNlbGY6OiRfY2FjaGVTdG9yYWdlTWV0aG9kID09PSBOVUxMKSB7DQoJCQlzZWxmOjokX2NhY2hlU3RvcmFnZUNsYXNzID0gJ1BIUEV4Y2VsX0NhY2hlZE9iamVjdFN0b3JhZ2VfJyAuICRtZXRob2Q7DQoJCQlzZWxmOjokX2NhY2hlU3RvcmFnZU1ldGhvZCA9ICRtZXRob2Q7DQoJCX0NCgkJcmV0dXJuIFRSVUU7DQoJfQkvLwlmdW5jdGlvbiBpbml0aWFsaXplKCkNCg0KDQoJLyoqDQoJICogSW5pdGlhbGlzZSB0aGUgY2FjaGUgc3RvcmFnZQ0KCSAqDQoJICogQHBhcmFtCVBIUEV4Y2VsX1dvcmtzaGVldCAJJHBhcmVudAkJRW5hYmxlIGNlbGwgY2FjaGluZyBmb3IgdGhpcyB3b3Jrc2hlZXQNCgkgKiBAcmV0dXJuCVBIUEV4Y2VsX0NhY2hlZE9iamVjdFN0b3JhZ2VfSUNhY2hlDQoJICoqLw0KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0SW5zdGFuY2UoUEhQRXhjZWxfV29ya3NoZWV0ICRwYXJlbnQpDQoJew0KCQkkY2FjaGVNZXRob2RJc0F2YWlsYWJsZSA9IFRSVUU7DQoJCWlmIChzZWxmOjokX2NhY2hlU3RvcmFnZU1ldGhvZCA9PT0gTlVMTCkgew0KCQkJJGNhY2hlTWV0aG9kSXNBdmFpbGFibGUgPSBzZWxmOjppbml0aWFsaXplKCk7DQoJCX0NCg0KCQlpZiAoJGNhY2hlTWV0aG9kSXNBdmFpbGFibGUpIHsNCgkJCSRpbnN0YW5jZSA9IG5ldyBzZWxmOjokX2NhY2hlU3RvcmFnZUNsYXNzKCAkcGFyZW50LA0KCQkJCQkJCQkJCQkJCSAgIHNlbGY6OiRfc3RvcmFnZU1ldGhvZFBhcmFtZXRlcnNbc2VsZjo6JF9jYWNoZVN0b3JhZ2VNZXRob2RdDQoJCQkJCQkJCQkJCQkJICk7DQoJCQlpZiAoJGluc3RhbmNlICE9PSBOVUxMKSB7DQoJCQkJcmV0dXJuICRpbnN0YW5jZTsNCgkJCX0NCgkJfQ0KDQoJCXJldHVybiBGQUxTRTsNCgl9CS8vCWZ1bmN0aW9uIGdldEluc3RhbmNlKCkNCg0KfQ==]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Calculation.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIFBIUEV4Y2VsCiAqCiAqIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICoKICogQGNhdGVnb3J5ICAgUEhQRXhjZWwKICogQHBhY2thZ2UgICAgUEhQRXhjZWxfQ2FsY3VsYXRpb24KICogQGNvcHlyaWdodCAgQ29weXJpZ2h0IChjKSAyMDA2IC0gMjAxMiBQSFBFeGNlbCAoaHR0cDovL3d3dy5jb2RlcGxleC5jb20vUEhQRXhjZWwpCiAqIEBsaWNlbnNlCWh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9vbGQtbGljZW5zZXMvbGdwbC0yLjEudHh0CUxHUEwKICogQHZlcnNpb24JMS43LjcsIDIwMTItMDUtMTkKICovCgoKLyoqIFBIUEV4Y2VsIHJvb3QgZGlyZWN0b3J5ICovCmlmICghZGVmaW5lZCgnUEhQRVhDRUxfUk9PVCcpKSB7CgkvKioKCSAqIEBpZ25vcmUKCSAqLwoJZGVmaW5lKCdQSFBFWENFTF9ST09UJywgZGlybmFtZShfX0ZJTEVfXykgLiAnLy4uLycpOwoJcmVxdWlyZShQSFBFWENFTF9ST09UIC4gJ1BIUEV4Y2VsL0F1dG9sb2FkZXIucGhwJyk7Cn0KCgppZiAoIWRlZmluZWQoJ0NBTENVTEFUSU9OX1JFR0VYUF9DRUxMUkVGJykpIHsKCS8vCVRlc3QgZm9yIHN1cHBvcnQgb2YgXFAgKG11bHRpYnl0ZSBvcHRpb25zKSBpbiBQQ1JFCglpZihkZWZpbmVkKCdQUkVHX0JBRF9VVEY4X0VSUk9SJykpIHsKCQkvLwlDZWxsIHJlZmVyZW5jZSAoY2VsbCBvciByYW5nZSBvZiBjZWxscywgd2l0aCBvciB3aXRob3V0IGEgc2hlZXQgcmVmZXJlbmNlKQoJCWRlZmluZSgnQ0FMQ1VMQVRJT05fUkVHRVhQX0NFTExSRUYnLCcoKChbXlxzLCEmJV5cL1wqXCs8Pj0tXSopfChcJ1teXCddKlwnKXwoXCJbXlwiXSpcIikpISk/XCQ/KFthLXpdezEsM30pXCQ/KFxkezEsN30pJyk7CgkJLy8JTmFtZWQgUmFuZ2Ugb2YgY2VsbHMKCQlkZWZpbmUoJ0NBTENVTEFUSU9OX1JFR0VYUF9OQU1FRFJBTkdFJywnKCgoW15ccywhJiVeXC9cKlwrPD49LV0qKXwoXCdbXlwnXSpcJyl8KFwiW15cIl0qXCIpKSEpPyhbX0EtWl1bX0EtWjAtOVwuXSopJyk7Cgl9IGVsc2UgewoJCS8vCUNlbGwgcmVmZXJlbmNlIChjZWxsIG9yIHJhbmdlIG9mIGNlbGxzLCB3aXRoIG9yIHdpdGhvdXQgYSBzaGVldCByZWZlcmVuY2UpCgkJZGVmaW5lKCdDQUxDVUxBVElPTl9SRUdFWFBfQ0VMTFJFRicsJygoKFx3Kil8KFwnW15cJ10qXCcpfChcIlteXCJdKlwiKSkhKT9cJD8oW2Etel17MSwzfSlcJD8oXGQrKScpOwoJCS8vCU5hbWVkIFJhbmdlIG9mIGNlbGxzCgkJZGVmaW5lKCdDQUxDVUxBVElPTl9SRUdFWFBfTkFNRURSQU5HRScsJygoKFx3Kil8KFwnLipcJyl8KFwiLipcIikpISk/KFtfQS1aXVtfQS1aMC05XC5dKiknKTsKCX0KfQoKCi8qKgogKiBQSFBFeGNlbF9DYWxjdWxhdGlvbiAoU2luZ2xldG9uKQogKgogKiBAY2F0ZWdvcnkJUEhQRXhjZWwKICogQHBhY2thZ2UJCVBIUEV4Y2VsX0NhbGN1bGF0aW9uCiAqIEBjb3B5cmlnaHQJQ29weXJpZ2h0IChjKSAyMDA2IC0gMjAxMiBQSFBFeGNlbCAoaHR0cDovL3d3dy5jb2RlcGxleC5jb20vUEhQRXhjZWwpCiAqLwpjbGFzcyBQSFBFeGNlbF9DYWxjdWxhdGlvbiB7CgoJLyoqIENvbnN0YW50cwkJCQkqLwoJLyoqIFJlZ3VsYXIgRXhwcmVzc2lvbnMJCSovCgkvLwlOdW1lcmljIG9wZXJhbmQKCWNvbnN0IENBTENVTEFUSU9OX1JFR0VYUF9OVU1CRVIJCT0gJ1stK10/XGQqXC4/XGQrKGVbLStdP1xkKyk/JzsKCS8vCVN0cmluZyBvcGVyYW5kCgljb25zdCBDQUxDVUxBVElPTl9SRUdFWFBfU1RSSU5HCQk9ICciKD86W14iXXwiIikqIic7CgkvLwlPcGVuaW5nIGJyYWNrZXQKCWNvbnN0IENBTENVTEFUSU9OX1JFR0VYUF9PUEVOQlJBQ0UJPSAnXCgnOwoJLy8JRnVuY3Rpb24gKGFsbG93IGZvciB0aGUgb2xkIEAgc3ltYm9sIHRoYXQgY291bGQgYmUgdXNlZCB0byBwcmVmaXggYSBmdW5jdGlvbiwgYnV0IHdlJ2xsIGlnbm9yZSBpdCkKCWNvbnN0IENBTENVTEFUSU9OX1JFR0VYUF9GVU5DVElPTgk9ICdAPyhbQS1aXVtBLVowLTlcLl0qKVtcc10qXCgnOwoJLy8JQ2VsbCByZWZlcmVuY2UgKGNlbGwgb3IgcmFuZ2Ugb2YgY2VsbHMsIHdpdGggb3Igd2l0aG91dCBhIHNoZWV0IHJlZmVyZW5jZSkKCWNvbnN0IENBTENVTEFUSU9OX1JFR0VYUF9DRUxMUkVGCT0gQ0FMQ1VMQVRJT05fUkVHRVhQX0NFTExSRUY7CgkvLwlOYW1lZCBSYW5nZSBvZiBjZWxscwoJY29uc3QgQ0FMQ1VMQVRJT05fUkVHRVhQX05BTUVEUkFOR0UJPSBDQUxDVUxBVElPTl9SRUdFWFBfTkFNRURSQU5HRTsKCS8vCUVycm9yCgljb25zdCBDQUxDVUxBVElPTl9SRUdFWFBfRVJST1IJCT0gJ1wjW0EtWl1bQS1aMF9cL10qWyFcP10/JzsKCgoJLyoqIGNvbnN0YW50cyAqLwoJY29uc3QgUkVUVVJOX0FSUkFZX0FTX0VSUk9SID0gJ2Vycm9yJzsKCWNvbnN0IFJFVFVSTl9BUlJBWV9BU19WQUxVRSA9ICd2YWx1ZSc7Cgljb25zdCBSRVRVUk5fQVJSQVlfQVNfQVJSQVkgPSAnYXJyYXknOwoKCXByaXZhdGUgc3RhdGljICRyZXR1cm5BcnJheUFzVHlwZQk9IHNlbGY6OlJFVFVSTl9BUlJBWV9BU19WQUxVRTsKCgoJLyoqCgkgKiBJbnN0YW5jZSBvZiB0aGlzIGNsYXNzCgkgKgoJICogQGFjY2Vzcwlwcml2YXRlCgkgKiBAdmFyIFBIUEV4Y2VsX0NhbGN1bGF0aW9uCgkgKi8KCXByaXZhdGUgc3RhdGljICRfaW5zdGFuY2U7CgoKCS8qKgoJICogQ2FsY3VsYXRpb24gY2FjaGUKCSAqCgkgKiBAYWNjZXNzCXByaXZhdGUKCSAqIEB2YXIgYXJyYXkKCSAqLwoJcHJpdmF0ZSBzdGF0aWMgJF9jYWxjdWxhdGlvbkNhY2hlID0gYXJyYXkgKCk7CgoKCS8qKgoJICogQ2FsY3VsYXRpb24gY2FjaGUgZW5hYmxlZAoJICoKCSAqIEBhY2Nlc3MJcHJpdmF0ZQoJICogQHZhciBib29sZWFuCgkgKi8KCXByaXZhdGUgc3RhdGljICRfY2FsY3VsYXRpb25DYWNoZUVuYWJsZWQgPSB0cnVlOwoKCgkvKioKCSAqIENhbGN1bGF0aW9uIGNhY2hlIGV4cGlyYXRpb24gdGltZQoJICoKCSAqIEBhY2Nlc3MJcHJpdmF0ZQoJICogQHZhciBmbG9hdAoJICovCglwcml2YXRlIHN0YXRpYyAkX2NhbGN1bGF0aW9uQ2FjaGVFeHBpcmF0aW9uVGltZSA9IDE1OwoKCgkvKioKCSAqIExpc3Qgb2Ygb3BlcmF0b3JzIHRoYXQgY2FuIGJlIHVzZWQgd2l0aGluIGZvcm11bGFlCgkgKiBUaGUgdHJ1ZS9mYWxzZSB2YWx1ZSBpbmRpY2F0ZXMgd2hldGhlciBpdCBpcyBhIGJpbmFyeSBvcGVyYXRvciBvciBhIHVuYXJ5IG9wZXJhdG9yCgkgKgoJICogQGFjY2Vzcwlwcml2YXRlCgkgKiBAdmFyIGFycmF5CgkgKi8KCXByaXZhdGUgc3RhdGljICRfb3BlcmF0b3JzCQkJPSBhcnJheSgnKycgPT4gdHJ1ZSwJJy0nID0+IHRydWUsCScqJyA9PiB0cnVlLAknLycgPT4gdHJ1ZSwKCQkJCQkJCQkJCQkJJ14nID0+IHRydWUsCScmJyA9PiB0cnVlLAknJScgPT4gZmFsc2UsCSd+JyA9PiBmYWxzZSwKCQkJCQkJCQkJCQkJJz4nID0+IHRydWUsCSc8JyA9PiB0cnVlLAknPScgPT4gdHJ1ZSwJJz49JyA9PiB0cnVlLAoJCQkJCQkJCQkJCQknPD0nID0+IHRydWUsCSc8PicgPT4gdHJ1ZSwJJ3wnID0+IHRydWUsCSc6JyA9PiB0cnVlCgkJCQkJCQkJCQkJICAgKTsKCgoJLyoqCgkgKiBMaXN0IG9mIGJpbmFyeSBvcGVyYXRvcnMgKHRob3NlIHRoYXQgZXhwZWN0IHR3byBvcGVyYW5kcykKCSAqCgkgKiBAYWNjZXNzCXByaXZhdGUKCSAqIEB2YXIgYXJyYXkKCSAqLwoJcHJpdmF0ZSBzdGF0aWMgJF9iaW5hcnlPcGVyYXRvcnMJPSBhcnJheSgnKycgPT4gdHJ1ZSwJJy0nID0+IHRydWUsCScqJyA9PiB0cnVlLAknLycgPT4gdHJ1ZSwKCQkJCQkJCQkJCQkJJ14nID0+IHRydWUsCScmJyA9PiB0cnVlLAknPicgPT4gdHJ1ZSwJJzwnID0+IHRydWUsCgkJCQkJCQkJCQkJCSc9JyA9PiB0cnVlLAknPj0nID0+IHRydWUsCSc8PScgPT4gdHJ1ZSwJJzw+JyA9PiB0cnVlLAoJCQkJCQkJCQkJCQknfCcgPT4gdHJ1ZSwJJzonID0+IHRydWUKCQkJCQkJCQkJCQkgICApOwoKCS8qKgoJICogRmxhZyB0byBkZXRlcm1pbmUgaG93IGZvcm11bGEgZXJyb3JzIHNob3VsZCBiZSBoYW5kbGVkCgkgKgkJSWYgdHJ1ZSwgdGhlbiBhIHVzZXIgZXJyb3Igd2lsbCBiZSB0cmlnZ2VyZWQKCSAqCQlJZiBmYWxzZSwgdGhlbiBhbiBleGNlcHRpb24gd2lsbCBiZSB0aHJvd24KCSAqCgkgKiBAYWNjZXNzCXB1YmxpYwoJICogQHZhciBib29sZWFuCgkgKgoJICovCglwdWJsaWMgJHN1cHByZXNzRm9ybXVsYUVycm9ycyA9IGZhbHNlOwoKCS8qKgoJICogRXJyb3IgbWVzc2FnZSBmb3IgYW55IGVycm9yIHRoYXQgd2FzIHJhaXNlZC90aHJvd24gYnkgdGhlIGNhbGN1bGF0aW9uIGVuZ2luZQoJICoKCSAqIEBhY2Nlc3MJcHVibGljCgkgKiBAdmFyIHN0cmluZwoJICoKCSAqLwoJcHVibGljICRmb3JtdWxhRXJyb3IgPSBudWxsOwoKCS8qKgoJICogRmxhZyB0byBkZXRlcm1pbmUgd2hldGhlciBhIGRlYnVnIGxvZyBzaG91bGQgYmUgZ2VuZXJhdGVkIGJ5IHRoZSBjYWxjdWxhdGlvbiBlbmdpbmUKCSAqCQlJZiB0cnVlLCB0aGVuIGEgZGVidWcgbG9nIHdpbGwgYmUgZ2VuZXJhdGVkCgkgKgkJSWYgZmFsc2UsIHRoZW4gYSBkZWJ1ZyBsb2cgd2lsbCBub3QgYmUgZ2VuZXJhdGVkCgkgKgoJICogQGFjY2VzcwlwdWJsaWMKCSAqIEB2YXIgYm9vbGVhbgoJICoKCSAqLwoJcHVibGljICR3cml0ZURlYnVnTG9nID0gZmFsc2U7CgoJLyoqCgkgKiBGbGFnIHRvIGRldGVybWluZSB3aGV0aGVyIGEgZGVidWcgbG9nIHNob3VsZCBiZSBlY2hvZWQgYnkgdGhlIGNhbGN1bGF0aW9uIGVuZ2luZQoJICoJCUlmIHRydWUsIHRoZW4gYSBkZWJ1ZyBsb2cgd2lsbCBiZSBlY2hvZWQKCSAqCQlJZiBmYWxzZSwgdGhlbiBhIGRlYnVnIGxvZyB3aWxsIG5vdCBiZSBlY2hvZWQKCSAqIEEgZGVidWcgbG9nIGNhbiBvbmx5IGJlIGVjaG9lZCBpZiBpdCBpcyBnZW5lcmF0ZWQKCSAqCgkgKiBAYWNjZXNzCXB1YmxpYwoJICogQHZhciBib29sZWFuCgkgKgoJICovCglwdWJsaWMgJGVjaG9EZWJ1Z0xvZyA9IGZhbHNlOwoKCgkvKioKCSAqIEFuIGFycmF5IG9mIHRoZSBuZXN0ZWQgY2VsbCByZWZlcmVuY2VzIGFjY2Vzc2VkIGJ5IHRoZSBjYWxjdWxhdGlvbiBlbmdpbmUsIHVzZWQgZm9yIHRoZSBkZWJ1ZyBsb2cKCSAqCgkgKiBAYWNjZXNzCXByaXZhdGUKCSAqIEB2YXIgYXJyYXkgb2Ygc3RyaW5nCgkgKgoJICovCglwcml2YXRlICRkZWJ1Z0xvZ1N0YWNrID0gYXJyYXkoKTsKCgkvKioKCSAqIFRoZSBkZWJ1ZyBsb2cgZ2VuZXJhdGVkIGJ5IHRoZSBjYWxjdWxhdGlvbiBlbmdpbmUKCSAqCgkgKiBAYWNjZXNzCXB1YmxpYwoJICogQHZhciBhcnJheSBvZiBzdHJpbmcKCSAqCgkgKi8KCXB1YmxpYyAkZGVidWdMb2cgPSBhcnJheSgpOwoJcHJpdmF0ZSAkX2N5Y2xpY0Zvcm11bGFDb3VudCA9IDA7Cglwcml2YXRlICRfY3ljbGljRm9ybXVsYUNlbGwgPSAnJzsKCXB1YmxpYyAkY3ljbGljRm9ybXVsYUNvdW50ID0gMDsKCgoJcHJpdmF0ZSAkX3NhdmVkUHJlY2lzaW9uCT0gMTI7CgoKCXByaXZhdGUgc3RhdGljICRfbG9jYWxlTGFuZ3VhZ2UgPSAnZW5fdXMnOwkJCQkJLy8JVVMgRW5nbGlzaAkoZGVmYXVsdCBsb2NhbGUpCglwcml2YXRlIHN0YXRpYyAkX3ZhbGlkTG9jYWxlTGFuZ3VhZ2VzID0gYXJyYXkoCSdlbicJCS8vCUVuZ2xpc2gJCShkZWZhdWx0IGxhbmd1YWdlKQoJCQkJCQkJCQkJCQkgKTsKCXByaXZhdGUgc3RhdGljICRfbG9jYWxlQXJndW1lbnRTZXBhcmF0b3IgPSAnLCc7Cglwcml2YXRlIHN0YXRpYyAkX2xvY2FsZUZ1bmN0aW9ucyA9IGFycmF5KCk7CglwdWJsaWMgc3RhdGljICRfbG9jYWxlQm9vbGVhbiA9IGFycmF5KAknVFJVRScJPT4gJ1RSVUUnLAoJCQkJCQkJCQkJCSdGQUxTRScJPT4gJ0ZBTFNFJywKCQkJCQkJCQkJCQknTlVMTCcJPT4gJ05VTEwnCgkJCQkJCQkJCQkgICk7CgoKCS8vCUNvbnN0YW50IGNvbnZlcnNpb24gZnJvbSB0ZXh0IG5hbWUvdmFsdWUgdG8gYWN0dWFsIChkYXRhdHlwZWQpIHZhbHVlCglwcml2YXRlIHN0YXRpYyAkX0V4Y2VsQ29uc3RhbnRzID0gYXJyYXkoJ1RSVUUnCT0+IHRydWUsCgkJCQkJCQkJCQkJJ0ZBTFNFJwk9PiBmYWxzZSwKCQkJCQkJCQkJCQknTlVMTCcJPT4gbnVsbAoJCQkJCQkJCQkJICAgKTsKCgkvLwlQSFBFeGNlbCBmdW5jdGlvbnMKCXByaXZhdGUgc3RhdGljICRfUEhQRXhjZWxGdW5jdGlvbnMgPSBhcnJheSgJLy8gUEhQRXhjZWwgZnVuY3Rpb25zCgkJCQknQUJTJwkJCQkJPT4gYXJyYXkoJ2NhdGVnb3J5JwkJCT0+CVBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uOjpDQVRFR09SWV9NQVRIX0FORF9UUklHLAoJCQkJCQkJCQkJCQkgJ2Z1bmN0aW9uQ2FsbCcJCT0+CSdhYnMnLAoJCQkJCQkJCQkJCQkgJ2FyZ3VtZW50Q291bnQnCT0+CScxJwoJCQkJCQkJCQkJCQkpLAoJCQkJJ0FDQ1JJTlQnCQkJCT0+IGFycmF5KCdjYXRlZ29yeScJCQk9PglQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbjo6Q0FURUdPUllfRklOQU5DSUFMLAoJCQkJCQkJCQkJCQkgJ2Z1bmN0aW9uQ2FsbCcJCT0+CSdQSFBFeGNlbF9DYWxjdWxhdGlvbl9GaW5hbmNpYWw6OkFDQ1JJTlQnLAoJCQkJCQkJCQkJCQkgJ2FyZ3VtZW50Q291bnQnCT0+CSc0LTcnCgkJCQkJCQkJCQkJCSksCgkJCQknQUNDUklOVE0nCQkJCT0+IGFycmF5KCdjYXRlZ29yeScJCQk9PglQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbjo6Q0FURUdPUllfRklOQU5DSUFMLAoJCQkJCQkJCQkJCQkgJ2Z1bmN0aW9uQ2FsbCcJCT0+CSdQSFBFeGNlbF9DYWxjdWxhdGlvbl9GaW5hbmNpYWw6OkFDQ1JJTlRNJywKCQkJCQkJCQkJCQkJICdhcmd1bWVudENvdW50Jwk9PgknMy01JwoJCQkJCQkJCQkJCQkpLAoJCQkJJ0FDT1MnCQkJCQk9PiBhcnJheSgnY2F0ZWdvcnknCQkJPT4JUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb246OkNBVEVHT1JZX01BVEhfQU5EX1RSSUcsCgkJCQkJCQkJCQkJCSAnZnVuY3Rpb25DYWxsJwkJPT4JJ2Fjb3MnLAoJCQkJCQkJCQkJCQkgJ2FyZ3VtZW50Q291bnQnCT0+CScxJwoJCQkJCQkJCQkJCQkpLAoJCQkJJ0FDT1NIJwkJCQkJPT4gYXJyYXkoJ2NhdGVnb3J5JwkJCT0+CVBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uOjpDQVRFR09SWV9NQVRIX0FORF9UUklHLAoJCQkJCQkJCQkJCQkgJ2Z1bmN0aW9uQ2FsbCcJCT0+CSdhY29zaCcsCgkJCQkJCQkJCQkJCSAnYXJndW1lbnRDb3VudCcJPT4JJzEnCgkJCQkJCQkJCQkJCSksCgkJCQknQUREUkVTUycJCQkJPT4gYXJyYXkoJ2NhdGVnb3J5JwkJCT0+CVBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uOjpDQVRFR09SWV9MT09LVVBfQU5EX1JFRkVSRU5DRSwKCQkJCQkJCQkJCQkJICdmdW5jdGlvbkNhbGwnCQk9PgknUEhQRXhjZWxfQ2FsY3VsYXRpb25fTG9va3VwUmVmOjpDRUxMX0FERFJFU1MnLAoJCQkJCQkJCQkJCQkgJ2FyZ3VtZW50Q291bnQnCT0+CScyLTUnCgkJCQkJCQkJCQkJCSksCgkJCQknQU1PUkRFR1JDJwkJCQk9PiBhcnJheSgnY2F0ZWdvcnknCQkJPT4JUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb246OkNBVEVHT1JZX0ZJTkFOQ0lBTCwKCQkJCQkJCQkJCQkJICdmdW5jdGlvbkNhbGwnCQk9PgknUEhQRXhjZWxfQ2FsY3VsYXRpb25fRmluYW5jaWFsOjpBTU9SREVHUkMnLAoJCQkJCQkJCQkJCQkgJ2FyZ3VtZW50Q291bnQnCT0+CSc2LDcnCgkJCQkJCQkJCQkJCSksCgkJCQknQU1PUkxJTkMnCQkJCT0+IGFycmF5KCdjYXRlZ29yeScJCQk9PglQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbjo6Q0FURUdPUllfRklOQU5DSUFMLAoJCQkJCQkJCQkJCQkgJ2Z1bmN0aW9uQ2FsbCcJCT0+CSdQSFBFeGNlbF9DYWxjdWxhdGlvbl9GaW5hbmNpYWw6OkFNT1JMSU5DJywKCQkJCQkJCQkJCQkJICdhcmd1bWVudENvdW50Jwk9PgknNiw3JwoJCQkJCQkJCQkJCQkpLAoJCQkJJ0FORCcJCQkJCT0+IGFycmF5KCdjYXRlZ29yeScJCQk9PglQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbjo6Q0FURUdPUllfTE9HSUNBTCwKCQkJCQkJCQkJCQkJICdmdW5jdGlvbkNhbGwnCQk9PgknUEhQRXhjZWxfQ2FsY3VsYXRpb25fTG9naWNhbDo6TE9HSUNBTF9BTkQnLAoJCQkJCQkJCQkJCQkgJ2FyZ3VtZW50Q291bnQnCT0+CScxKycKCQkJCQkJCQkJCQkJKSwKCQkJCSdBUkVBUycJCQkJCT0+IGFycmF5KCdjYXRlZ29yeScJCQk9PglQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbjo6Q0FURUdPUllfTE9PS1VQX0FORF9SRUZFUkVOQ0UsCgkJCQkJCQkJCQkJCSAnZnVuY3Rpb25DYWxsJwkJPT4JJ1BIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6RFVNTVknLAoJCQkJCQkJCQkJCQkgJ2FyZ3VtZW50Q291bnQnCT0+CScxJwoJCQkJCQkJCQkJCQkpLAoJCQkJJ0FTQycJCQkJCT0+IGFycmF5KCdjYXRlZ29yeScJCQk9PglQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbjo6Q0FURUdPUllfVEVYVF9BTkRfREFUQSwKCQkJCQkJCQkJCQkJICdmdW5jdGlvbkNhbGwnCQk9PgknUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpEVU1NWScsCgkJCQkJCQkJCQkJCSAnYXJndW1lbnRDb3VudCcJPT4JJzEnCgkJCQkJCQkJCQkJCSksCgkJCQknQVNJTicJCQkJCT0+IGFycmF5KCdjYXRlZ29yeScJCQk9PglQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbjo6Q0FURUdPUllfTUFUSF9BTkRfVFJJRywKCQkJCQkJCQkJCQkJICdmdW5jdGlvbkNhbGwnCQk9PgknYXNpbicsCgkJCQkJCQkJCQkJCSAnYXJndW1lbnRDb3VudCcJPT4JJzEnCgkJCQkJCQkJCQkJCSksCgkJCQknQVNJTkgnCQkJCQk9PiBhcnJheSgnY2F0ZWdvcnknCQkJPT4JUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb246OkNBVEVHT1JZX01BVEhfQU5EX1RSSUcsCgkJCQkJCQkJCQkJCSAnZnVuY3Rpb25DYWxsJwkJPT4JJ2FzaW5oJywKCQkJCQkJCQkJCQkJICdhcmd1bWVudENvdW50Jwk9PgknMScKCQkJCQkJCQkJCQkJKSwKCQkJCSdBVEFOJwkJCQkJPT4gYXJyYXkoJ2NhdGVnb3J5JwkJCT0+CVBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uOjpDQVRFR09SWV9NQVRIX0FORF9UUklHLAoJCQkJCQkJCQkJCQkgJ2Z1bmN0aW9uQ2FsbCcJCT0+CSdhdGFuJywKCQkJCQkJCQkJCQkJICdhcmd1bWVudENvdW50Jwk9PgknMScKCQkJCQkJCQkJCQkJKSwKCQkJCSdBVEFOMicJCQkJCT0+IGFycmF5KCdjYXRlZ29yeScJCQk9PglQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbjo6Q0FURUdPUllfTUFUSF9BTkRfVFJJRywKCQkJCQkJCQkJCQkJICdmdW5jdGlvbkNhbGwnCQk9PgknUEhQRXhjZWxfQ2FsY3VsYXRpb25fTWF0aFRyaWc6OkFUQU4yJywKCQkJCQkJCQkJCQkJICdhcmd1bWVudENvdW50Jwk9PgknMicKCQkJCQkJCQkJCQkJKSwKCQkJCSdBVEFOSCcJCQkJCT0+IGFycmF5KCdjYXRlZ29yeScJCQk9PglQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbjo6Q0FURUdPUllfTUFUSF9BTkRfVFJJRywKCQkJCQkJCQkJCQkJICdmdW5jdGlvbkNhbGwnCQk9PgknYXRhbmgnLAoJCQkJCQkJCQkJCQkgJ2FyZ3VtZW50Q291bnQnCT0+CScxJwoJCQkJCQkJCQkJCQkpLAoJCQkJJ0FWRURFVicJCQkJPT4gYXJyYXkoJ2NhdGVnb3J5JwkJCT0+CVBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uOjpDQVRFR09SWV9TVEFUSVNUSUNBTCwKCQkJCQkJCQkJCQkJICdmdW5jdGlvbkNhbGwnCQk9PgknUEhQRXhjZWxfQ2FsY3VsYXRpb25fU3RhdGlzdGljYWw6OkFWRURFVicsCgkJCQkJCQkJCQkJCSAnYXJndW1lbnRDb3VudCcJPT4JJzErJwoJCQkJCQkJCQkJCQkpLAoJCQkJJ0FWRVJBR0UnCQkJCT0+IGFycmF5KCdjYXRlZ29yeScJCQk9PglQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbjo6Q0FURUdPUllfU1RBVElTVElDQUwsCgkJCQkJCQkJCQkJCSAnZnVuY3Rpb25DYWxsJwkJPT4JJ1BIUEV4Y2VsX0NhbGN1bGF0aW9uX1N0YXRpc3RpY2FsOjpBVkVSQUdFJywKCQkJCQkJCQkJCQkJICdhcmd1bWVudENvdW50Jwk9PgknMSsnCgkJCQkJCQkJCQkJCSksCgkJCQknQVZFUkFHRUEnCQkJCT0+IGFycmF5KCdjYXRlZ29yeScJCQk9PglQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbjo6Q0FURUdPUllfU1RBVElTVElDQUwsCgkJCQkJCQkJCQkJCSAnZnVuY3Rpb25DYWxsJwkJPT4JJ1BIUEV4Y2VsX0NhbGN1bGF0aW9uX1N0YXRpc3RpY2FsOjpBVkVSQUdFQScsCgkJCQkJCQkJCQkJCSAnYXJndW1lbnRDb3VudCcJPT4JJzErJwoJCQkJCQkJCQkJCQkpLAoJCQkJJ0FWRVJBR0VJRicJCQkJPT4gYXJyYXkoJ2NhdGVnb3J5JwkJCT0+CVBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uOjpDQVRFR09SWV9TVEFUSVNUSUNBTCwKCQkJCQkJCQkJCQkJICdmdW5jdGlvbkNhbGwnCQk9PgknUEhQRXhjZWxfQ2FsY3VsYXRpb25fU3RhdGlzdGljYWw6OkFWRVJBR0VJRicsCgkJCQkJCQkJCQkJCSAnYXJndW1lbnRDb3VudCcJPT4JJzIsMycKCQkJCQkJCQkJCQkJKSwKCQkJCSdBVkVSQUdFSUZTJwkJCT0+IGFycmF5KCdjYXRlZ29yeScJCQk9PglQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbjo6Q0FURUdPUllfU1RBVElTVElDQUwsCgkJCQkJCQkJCQkJCSAnZnVuY3Rpb25DYWxsJwkJPT4JJ1BIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6RFVNTVknLAoJCQkJCQkJCQkJCQkgJ2FyZ3VtZW50Q291bnQnCT0+CSczKycKCQkJCQkJCQkJCQkJKSwKCQkJCSdCQUhUVEVYVCcJCQkJPT4gYXJyYXkoJ2NhdGVnb3J5JwkJCT0+CVBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uOjpDQVRFR09SWV9URVhUX0FORF9EQVRBLAoJCQkJCQkJCQkJCQkgJ2Z1bmN0aW9uQ2FsbCcJCT0+CSdQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OkRVTU1ZJywKCQkJCQkJCQkJCQkJICdhcmd1bWVudENvdW50Jwk9PgknMScKCQkJCQkJCQkJCQkJKSwKCQkJCSdCRVNTRUxJJwkJCQk9PiBhcnJheSgnY2F0ZWdvcnknCQkJPT4JUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb246OkNBVEVHT1JZX0VOR0lORUVSSU5HLAoJCQkJCQkJCQkJCQkgJ2Z1bmN0aW9uQ2FsbCcJCT0+CSdQSFBFeGNlbF9DYWxjdWxhdGlvbl9FbmdpbmVlcmluZzo6QkVTU0VMSScsCgkJCQkJCQkJCQkJCSAnYXJndW1lbnRDb3VudCcJPT4JJzInCgkJCQkJCQkJCQkJCSksCgkJCQknQkVTU0VMSicJCQkJPT4gYXJyYXkoJ2NhdGVnb3J5JwkJCT0+CVBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uOjpDQVRFR09SWV9FTkdJTkVFUklORywKCQkJCQkJCQkJCQkJICdmdW5jdGlvbkNhbGwnCQk9PgknUEhQRXhjZWxfQ2FsY3VsYXRpb25fRW5naW5lZXJpbmc6OkJFU1NFTEonLAoJCQkJCQkJCQkJCQkgJ2FyZ3VtZW50Q291bnQnCT0+CScyJwoJCQkJCQkJCQkJCQkpLAoJCQkJJ0JFU1NFTEsnCQkJCT0+IGFycmF5KCdjYXRlZ29yeScJCQk9PglQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbjo6Q0FURUdPUllfRU5HSU5FRVJJTkcsCgkJCQkJCQkJCQkJCSAnZnVuY3Rpb25DYWxsJwkJPT4JJ1BIUEV4Y2VsX0NhbGN1bGF0aW9uX0VuZ2luZWVyaW5nOjpCRVNTRUxLJywKCQkJCQkJCQkJCQkJICdhcmd1bWVudENvdW50Jwk9PgknMicKCQkJCQkJCQkJCQkJKSwKCQkJCSdCRVNTRUxZJwkJCQk9PiBhcnJheSgnY2F0ZWdvcnknCQkJPT4JUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb246OkNBVEVHT1JZX0VOR0lORUVSSU5HLAoJCQkJCQkJCQkJCQkgJ2Z1bmN0aW9uQ2FsbCcJCT0+CSdQSFBFeGNlbF9DYWxjdWxhdGlvbl9FbmdpbmVlcmluZzo6QkVTU0VMWScsCgkJCQkJCQkJCQkJCSAnYXJndW1lbnRDb3VudCcJPT4JJzInCgkJCQkJCQkJCQkJCSksCgkJCQknQkVUQURJU1QnCQkJCT0+IGFycmF5KCdjYXRlZ29yeScJCQk9PglQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbjo6Q0FURUdPUllfU1RBVElTVElDQUwsCgkJCQkJCQkJCQkJCSAnZnVuY3Rpb25DYWxsJwkJPT4JJ1BIUEV4Y2VsX0NhbGN1bGF0aW9uX1N0YXRpc3RpY2FsOjpCRVRBRElTVCcsCgkJCQkJCQkJCQkJCSAnYXJndW1lbnRDb3VudCcJPT4JJzMtNScKCQkJCQkJCQkJCQkJKSwKCQkJCSdCRVRBSU5WJwkJCQk9PiBhcnJheSgnY2F0ZWdvcnknCQkJPT4JUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb246OkNBVEVHT1JZX1NUQVRJU1RJQ0FMLAoJCQkJCQkJCQkJCQkgJ2Z1bmN0aW9uQ2FsbCcJCT0+CSdQSFBFeGNlbF9DYWxjdWxhdGlvbl9TdGF0aXN0aWNhbDo6QkVUQUlOVicsCgkJCQkJCQkJCQkJCSAnYXJndW1lbnRDb3VudCcJPT4JJzMtNScKCQkJCQkJCQkJCQkJKSwKCQkJCSdCSU4yREVDJwkJCQk9PiBhcnJheSgnY2F0ZWdvcnknCQkJPT4JUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb246OkNBVEVHT1JZX0VOR0lORUVSSU5HLAoJCQkJCQkJCQkJCQkgJ2Z1bmN0aW9uQ2FsbCcJCT0+CSdQSFBFeGNlbF9DYWxjdWxhdGlvbl9FbmdpbmVlcmluZzo6QklOVE9ERUMnLAoJCQkJCQkJCQkJCQkgJ2FyZ3VtZW50Q291bnQnCT0+CScxJwoJCQkJCQkJCQkJCQkpLAoJCQkJJ0JJTjJIRVgnCQkJCT0+IGFycmF5KCdjYXRlZ29yeScJCQk9PglQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbjo6Q0FURUdPUllfRU5HSU5FRVJJTkcsCgkJCQkJCQkJCQkJCSAnZnVuY3Rpb25DYWxsJwkJPT4JJ1BIUEV4Y2VsX0NhbGN1bGF0aW9uX0VuZ2luZWVyaW5nOjpCSU5UT0hFWCcsCgkJCQkJCQkJCQkJCSAnYXJndW1lbnRDb3VudCcJPT4JJzEsMicKCQkJCQkJCQkJCQkJKSwKCQkJCSdCSU4yT0NUJwkJCQk9PiBhcnJheSgnY2F0ZWdvcnknCQkJPT4JUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb246OkNBVEVHT1JZX0VOR0lORUVSSU5HLAoJCQkJCQkJCQkJCQkgJ2Z1bmN0aW9uQ2FsbCcJCT0+CSdQSFBFeGNlbF9DYWxjdWxhdGlvbl9FbmdpbmVlcmluZzo6QklOVE9PQ1QnLAoJCQkJCQkJCQkJCQkgJ2FyZ3VtZW50Q291bnQnCT0+CScxLDInCgkJCQkJCQkJCQkJCSksCgkJCQknQklOT01ESVNUJwkJCQk9PiBhcnJheSgnY2F0ZWdvcnknCQkJPT4JUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb246OkNBVEVHT1JZX1NUQVRJU1RJQ0FMLAoJCQkJCQkJCQkJCQkgJ2Z1bmN0aW9uQ2FsbCcJCT0+CSdQSFBFeGNlbF9DYWxjdWxhdGlvbl9TdGF0aXN0aWNhbDo6QklOT01ESVNUJywKCQkJCQkJCQkJCQkJICdhcmd1bWVudENvdW50Jwk9PgknNCcKCQkJCQkJCQkJCQkJKSwKCQkJCSdDRUlMSU5HJwkJCQk9PiBhcnJheSgnY2F0ZWdvcnknCQkJPT4JUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb246OkNBVEVHT1JZX01BVEhfQU5EX1RSSUcsCgkJCQkJCQkJCQkJCSAnZnVuY3Rpb25DYWxsJwkJPT4JJ1BIUEV4Y2VsX0NhbGN1bGF0aW9uX01hdGhUcmlnOjpDRUlMSU5HJywKCQkJCQkJCQkJCQkJICdhcmd1bWVudENvdW50Jwk9PgknMicKCQkJCQkJCQkJCQkJKSwKCQkJCSdDRUxMJwkJCQkJPT4gYXJyYXkoJ2NhdGVnb3J5JwkJCT0+CVBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uOjpDQVRFR09SWV9JTkZPUk1BVElPTiwKCQkJCQkJCQkJCQkJICdmdW5jdGlvbkNhbGwnCQk9PgknUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpEVU1NWScsCgkJCQkJCQkJCQkJCSAnYXJndW1lbnRDb3VudCcJPT4JJzEsMicKCQkJCQkJCQkJCQkJKSwKCQkJCSdDSEFSJwkJCQkJPT4gYXJyYXkoJ2NhdGVnb3J5JwkJCT0+CVBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uOjpDQVRFR09SWV9URVhUX0FORF9EQVRBLAoJCQkJCQkJCQkJCQkgJ2Z1bmN0aW9uQ2FsbCcJCT0+CSdQSFBFeGNlbF9DYWxjdWxhdGlvbl9UZXh0RGF0YTo6Q0hBUkFDVEVSJywKCQkJCQkJCQkJCQkJICdhcmd1bWVudENvdW50Jwk9PgknMScKCQkJCQkJCQkJCQkJKSwKCQkJCSdDSElESVNUJwkJCQk9PiBhcnJheSgnY2F0ZWdvcnknCQkJPT4JUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb246OkNBVEVHT1JZX1NUQVRJU1RJQ0FMLAoJCQkJCQkJCQkJCQkgJ2Z1bmN0aW9uQ2FsbCcJCT0+CSdQSFBFeGNlbF9DYWxjdWxhdGlvbl9TdGF0aXN0aWNhbDo6Q0hJRElTVCcsCgkJCQkJCQkJCQkJCSAnYXJndW1lbnRDb3VudCcJPT4JJzInCgkJCQkJCQkJCQkJCSksCgkJCQknQ0hJSU5WJwkJCQk9PiBhcnJheSgnY2F0ZWdvcnknCQkJPT4JUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb246OkNBVEVHT1JZX1NUQVRJU1RJQ0FMLAoJCQkJCQkJCQkJCQkgJ2Z1bmN0aW9uQ2FsbCcJCT0+CSdQSFBFeGNlbF9DYWxjdWxhdGlvbl9TdGF0aXN0aWNhbDo6Q0hJSU5WJywKCQkJCQkJCQkJCQkJICdhcmd1bWVudENvdW50Jwk9PgknMicKCQkJCQkJCQkJCQkJKSwKCQkJCSdDSElURVNUJwkJCQk9PiBhcnJheSgnY2F0ZWdvcnknCQkJPT4JUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb246OkNBVEVHT1JZX1NUQVRJU1RJQ0FMLAoJCQkJCQkJCQkJCQkgJ2Z1bmN0aW9uQ2FsbCcJCT0+CSdQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OkRVTU1ZJywKCQkJCQkJCQkJCQkJICdhcmd1bWVudENvdW50Jwk9PgknMicKCQkJCQkJCQkJCQkJKSwKCQkJCSdDSE9PU0UnCQkJCT0+IGFycmF5KCdjYXRlZ29yeScJCQk9PglQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbjo6Q0FURUdPUllfTE9PS1VQX0FORF9SRUZFUkVOQ0UsCgkJCQkJCQkJCQkJCSAnZnVuY3Rpb25DYWxsJwkJPT4JJ1BIUEV4Y2VsX0NhbGN1bGF0aW9uX0xvb2t1cFJlZjo6Q0hPT1NFJywKCQkJCQkJCQkJCQkJICdhcmd1bWVudENvdW50Jwk9PgknMisnCgkJCQkJCQkJCQkJCSksCgkJCQknQ0xFQU4nCQkJCQk9PiBhcnJheSgnY2F0ZWdvcnknCQkJPT4JUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb246OkNBVEVHT1JZX1RFWFRfQU5EX0RBVEEsCgkJCQkJCQkJCQkJCSAnZnVuY3Rpb25DYWxsJwkJPT4JJ1BIUEV4Y2VsX0NhbGN1bGF0aW9uX1RleHREYXRhOjpUUklNTk9OUFJJTlRBQkxFJywKCQkJCQkJCQkJCQkJICdhcmd1bWVudENvdW50Jwk9PgknMScKCQkJCQkJCQkJCQkJKSwKCQkJCSdDT0RFJwkJCQkJPT4gYXJyYXkoJ2NhdGVnb3J5JwkJCT0+CVBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uOjpDQVRFR09SWV9URVhUX0FORF9EQVRBLAoJCQkJCQkJCQkJCQkgJ2Z1bmN0aW9uQ2FsbCcJCT0+CSdQSFBFeGNlbF9DYWxjdWxhdGlvbl9UZXh0RGF0YTo6QVNDSUlDT0RFJywKCQkJCQkJCQkJCQkJICdhcmd1bWVudENvdW50Jwk9PgknMScKCQkJCQkJCQkJCQkJKSwKCQkJCSdDT0xVTU4nCQkJCT0+IGFycmF5KCdjYXRlZ29yeScJCQk9PglQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbjo6Q0FURUdPUllfTE9PS1VQX0FORF9SRUZFUkVOQ0UsCgkJCQkJCQkJCQkJCSAnZnVuY3Rpb25DYWxsJwkJPT4JJ1BIUEV4Y2VsX0NhbGN1bGF0aW9uX0xvb2t1cFJlZjo6Q09MVU1OJywKCQkJCQkJCQkJCQkJICdhcmd1bWVudENvdW50Jwk9PgknLTEnLAoJCQkJCQkJCQkJCQkgJ3Bhc3NCeVJlZmVyZW5jZScJPT4JYXJyYXkodHJ1ZSkKCQkJCQkJCQkJCQkJKSwKCQkJCSdDT0xVTU5TJwkJCQk9PiBhcnJheSgnY2F0ZWdvcnknCQkJPT4JUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb246OkNBVEVHT1JZX0xPT0tVUF9BTkRfUkVGRVJFTkNFLAoJCQkJCQkJCQkJCQkgJ2Z1bmN0aW9uQ2FsbCcJCT0+CSdQSFBFeGNlbF9DYWxjdWxhdGlvbl9Mb29rdXBSZWY6OkNPTFVNTlMnLAoJCQkJCQkJCQkJCQkgJ2FyZ3VtZW50Q291bnQnCT0+CScxJwoJCQkJCQkJCQkJCQkpLAoJCQkJJ0NPTUJJTicJCQkJPT4gYXJyYXkoJ2NhdGVnb3J5JwkJCT0+CVBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uOjpDQVRFR09SWV9NQVRIX0FORF9UUklHLAoJCQkJCQkJCQkJCQkgJ2Z1bmN0aW9uQ2FsbCcJCT0+CSdQSFBFeGNlbF9DYWxjdWxhdGlvbl9NYXRoVHJpZzo6Q09NQklOJywKCQkJCQkJCQkJCQkJICdhcmd1bWVudENvdW50Jwk9PgknMicKCQkJCQkJCQkJCQkJKSwKCQkJCSdDT01QTEVYJwkJCQk9PiBhcnJheSgnY2F0ZWdvcnknCQkJPT4JUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb246OkNBVEVHT1JZX0VOR0lORUVSSU5HLAoJCQkJCQkJCQkJCQkgJ2Z1bmN0aW9uQ2FsbCcJCT0+CSdQSFBFeGNlbF9DYWxjdWxhdGlvbl9FbmdpbmVlcmluZzo6Q09NUExFWCcsCgkJCQkJCQkJCQkJCSAnYXJndW1lbnRDb3VudCcJPT4JJzIsMycKCQkJCQkJCQkJCQkJKSwKCQkJCSdDT05DQVRFTkFURScJCQk9PiBhcnJheSgnY2F0ZWdvcnknCQkJPT4JUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb246OkNBVEVHT1JZX1RFWFRfQU5EX0RBVEEsCgkJCQkJCQkJCQkJCSAnZnVuY3Rpb25DYWxsJwkJPT4JJ1BIUEV4Y2VsX0NhbGN1bGF0aW9uX1RleHREYXRhOjpDT05DQVRFTkFURScsCgkJCQkJCQkJCQkJCSAnYXJndW1lbnRDb3VudCcJPT4JJzErJwoJCQkJCQkJCQkJCQkpLAoJCQkJJ0NPTkZJREVOQ0UnCQkJPT4gYXJyYXkoJ2NhdGVnb3J5JwkJCT0+CVBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uOjpDQVRFR09SWV9TVEFUSVNUSUNBTCwKCQkJCQkJCQkJCQkJICdmdW5jdGlvbkNhbGwnCQk9PgknUEhQRXhjZWxfQ2FsY3VsYXRpb25fU3RhdGlzdGljYWw6OkNPTkZJREVOQ0UnLAoJCQkJCQkJCQkJCQkgJ2FyZ3VtZW50Q291bnQnCT0+CSczJwoJCQkJCQkJCQkJCQkpLAoJCQkJJ0NPTlZFUlQnCQkJCT0+IGFycmF5KCdjYXRlZ29yeScJCQk9PglQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbjo6Q0FURUdPUllfRU5HSU5FRVJJTkcsCgkJCQkJCQkJCQkJCSAnZnVuY3Rpb25DYWxsJwkJPT4JJ1BIUEV4Y2VsX0NhbGN1bGF0aW9uX0VuZ2luZWVyaW5nOjpDT05WRVJUVU9NJywKCQkJCQkJCQkJCQkJICdhcmd1bWVudENvdW50Jwk9PgknMycKCQkJCQkJCQkJCQkJKSwKCQkJCSdDT1JSRUwnCQkJCT0+IGFycmF5KCdjYXRlZ29yeScJCQk9PglQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbjo6Q0FURUdPUllfU1RBVElTVElDQUwsCgkJCQkJCQkJCQkJCSAnZnVuY3Rpb25DYWxsJwkJPT4JJ1BIUEV4Y2VsX0NhbGN1bGF0aW9uX1N0YXRpc3RpY2FsOjpDT1JSRUwnLAoJCQkJCQkJCQkJCQkgJ2FyZ3VtZW50Q291bnQnCT0+CScyJwoJCQkJCQkJCQkJCQkpLAoJCQkJJ0NPUycJCQkJCT0+IGFycmF5KCdjYXRlZ29yeScJCQk9PglQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbjo6Q0FURUdPUllfTUFUSF9BTkRfVFJJRywKCQkJCQkJCQkJCQkJICdmdW5jdGlvbkNhbGwnCQk9PgknY29zJywKCQkJCQkJCQkJCQkJICdhcmd1bWVudENvdW50Jwk9PgknMScKCQkJCQkJCQkJCQkJKSwKCQkJCSdDT1NIJwkJCQkJPT4gYXJyYXkoJ2NhdGVnb3J5JwkJCT0+CVBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uOjpDQVRFR09SWV9NQVRIX0FORF9UUklHLAoJCQkJCQkJCQkJCQkgJ2Z1bmN0aW9uQ2FsbCcJCT0+CSdjb3NoJywKCQkJCQkJCQkJCQkJICdhcmd1bWVudENvdW50Jwk9PgknMScKCQkJCQkJCQkJCQkJKSwKCQkJCSdDT1VOVCcJCQkJCT0+IGFycmF5KCdjYXRlZ29yeScJCQk9PglQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbjo6Q0FURUdPUllfU1RBVElTVElDQUwsCgkJCQkJCQkJCQkJCSAnZnVuY3Rpb25DYWxsJwkJPT4JJ1BIUEV4Y2VsX0NhbGN1bGF0aW9uX1N0YXRpc3RpY2FsOjpDT1VOVCcsCgkJCQkJCQkJCQkJCSAnYXJndW1lbnRDb3VudCcJPT4JJzErJwoJCQkJCQkJCQkJCQkpLAoJCQkJJ0NPVU5UQScJCQkJPT4gYXJyYXkoJ2NhdGVnb3J5JwkJCT0+CVBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uOjpDQVRFR09SWV9TVEFUSVNUSUNBTCwKCQkJCQkJCQkJCQkJICdmdW5jdGlvbkNhbGwnCQk9PgknUEhQRXhjZWxfQ2FsY3VsYXRpb25fU3RhdGlzdGljYWw6OkNPVU5UQScsCgkJCQkJCQkJCQkJCSAnYXJndW1lbnRDb3VudCcJPT4JJzErJwoJCQkJCQkJCQkJCQkpLAoJCQkJJ0NPVU5UQkxBTksnCQkJPT4gYXJyYXkoJ2NhdGVnb3J5JwkJCT0+CVBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uOjpDQVRFR09SWV9TVEFUSVNUSUNBTCwKCQkJCQkJCQkJCQkJICdmdW5jdGlvbkNhbGwnCQk9PgknUEhQRXhjZWxfQ2FsY3VsYXRpb25fU3RhdGlzdGljYWw6OkNPVU5UQkxBTksnLAoJCQkJCQkJCQkJCQkgJ2FyZ3VtZW50Q291bnQnCT0+CScxJwoJCQkJCQkJCQkJCQkpLAoJCQkJJ0NPVU5USUYnCQkJCT0+IGFycmF5KCdjYXRlZ29yeScJCQk9PglQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbjo6Q0FURUdPUllfU1RBVElTVElDQUwsCgkJCQkJCQkJCQkJCSAnZnVuY3Rpb25DYWxsJwkJPT4JJ1BIUEV4Y2VsX0NhbGN1bGF0aW9uX1N0YXRpc3RpY2FsOjpDT1VOVElGJywKCQkJCQkJCQkJCQkJICdhcmd1bWVudENvdW50Jwk9PgknMicKCQkJCQkJCQkJCQkJKSwKCQkJCSdDT1VOVElGUycJCQkJPT4gYXJyYXkoJ2NhdGVnb3J5JwkJCT0+CVBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uOjpDQVRFR09SWV9TVEFUSVNUSUNBTCwKCQkJCQkJCQkJCQkJICdmdW5jdGlvbkNhbGwnCQk9PgknUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpEVU1NWScsCgkJCQkJCQkJCQkJCSAnYXJndW1lbnRDb3VudCcJPT4JJzInCgkJCQkJCQkJCQkJCSksCgkJCQknQ09VUERBWUJTJwkJCQk9PiBhcnJheSgnY2F0ZWdvcnknCQkJPT4JUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb246OkNBVEVHT1JZX0ZJTkFOQ0lBTCwKCQkJCQkJCQkJCQkJICdmdW5jdGlvbkNhbGwnCQk9PgknUEhQRXhjZWxfQ2FsY3VsYXRpb25fRmluYW5jaWFsOjpDT1VQREFZQlMnLAoJCQkJCQkJCQkJCQkgJ2FyZ3VtZW50Q291bnQnCT0+CSczLDQnCgkJCQkJCQkJCQkJCSksCgkJCQknQ09VUERBWVMnCQkJCT0+IGFycmF5KCdjYXRlZ29yeScJCQk9PglQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbjo6Q0FURUdPUllfRklOQU5DSUFMLAoJCQkJCQkJCQkJCQkgJ2Z1bmN0aW9uQ2FsbCcJCT0+CSdQSFBFeGNlbF9DYWxjdWxhdGlvbl9GaW5hbmNpYWw6OkNPVVBEQVlTJywKCQkJCQkJCQkJCQkJICdhcmd1bWVudENvdW50Jwk9PgknMyw0JwoJCQkJCQkJCQkJCQkpLAoJCQkJJ0NPVVBEQVlTTkMnCQkJPT4gYXJyYXkoJ2NhdGVnb3J5JwkJCT0+CVBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uOjpDQVRFR09SWV9GSU5BTkNJQUwsCgkJCQkJCQkJCQkJCSAnZnVuY3Rpb25DYWxsJwkJPT4JJ1BIUEV4Y2VsX0NhbGN1bGF0aW9uX0ZpbmFuY2lhbDo6Q09VUERBWVNOQycsCgkJCQkJCQkJCQkJCSAnYXJndW1lbnRDb3VudCcJPT4JJzMsNCcKCQkJCQkJCQkJCQkJKSwKCQkJCSdDT1VQTkNEJwkJCQk9PiBhcnJheSgnY2F0ZWdvcnknCQkJPT4JUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb246OkNBVEVHT1JZX0ZJTkFOQ0lBTCwKCQkJCQkJCQkJCQkJICdmdW5jdGlvbkNhbGwnCQk9PgknUEhQRXhjZWxfQ2FsY3VsYXRpb25fRmluYW5jaWFsOjpDT1VQTkNEJywKCQkJCQkJCQkJCQkJICdhcmd1bWVudENvdW50Jwk9PgknMyw0JwoJCQkJCQkJCQkJCQkpLAoJCQkJJ0NPVVBOVU0nCQkJCT0+IGFycmF5KCdjYXRlZ29yeScJCQk9PglQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbjo6Q0FURUdPUllfRklOQU5DSUFMLAoJCQkJCQkJCQkJCQkgJ2Z1bmN0aW9uQ2FsbCcJCT0+CSdQSFBFeGNlbF9DYWxjdWxhdGlvbl9GaW5hbmNpYWw6OkNPVVBOVU0nLAoJCQkJCQkJCQkJCQkgJ2FyZ3VtZW50Q291bnQnCT0+CSczLDQnCgkJCQkJCQkJCQkJCSksCgkJCQknQ09VUFBDRCcJCQkJPT4gYXJyYXkoJ2NhdGVnb3J5JwkJCT0+CVBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uOjpDQVRFR09SWV9GSU5BTkNJQUwsCgkJCQkJCQkJCQkJCSAnZnVuY3Rpb25DYWxsJwkJPT4JJ1BIUEV4Y2VsX0NhbGN1bGF0aW9uX0ZpbmFuY2lhbDo6Q09VUFBDRCcsCgkJCQkJCQkJCQkJCSAnYXJndW1lbnRDb3VudCcJPT4JJzMsNCcKCQkJCQkJCQkJCQkJKSwKCQkJCSdDT1ZBUicJCQkJCT0+IGFycmF5KCdjYXRlZ29yeScJCQk9PglQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbjo6Q0FURUdPUllfU1RBVElTVElDQUwsCgkJCQkJCQkJCQkJCSAnZnVuY3Rpb25DYWxsJwkJPT4JJ1BIUEV4Y2VsX0NhbGN1bGF0aW9uX1N0YXRpc3RpY2FsOjpDT1ZBUicsCgkJCQkJCQkJCQkJCSAnYXJndW1lbnRDb3VudCcJPT4JJzInCgkJCQkJCQkJCQkJCSksCgkJCQknQ1JJVEJJTk9NJwkJCQk9PiBhcnJheSgnY2F0ZWdvcnknCQkJPT4JUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb246OkNBVEVHT1JZX1NUQVRJU1RJQ0FMLAoJCQkJCQkJCQkJCQkgJ2Z1bmN0aW9uQ2FsbCcJCT0+CSdQSFBFeGNlbF9DYWxjdWxhdGlvbl9TdGF0aXN0aWNhbDo6Q1JJVEJJTk9NJywKCQkJCQkJCQkJCQkJICdhcmd1bWVudENvdW50Jwk9PgknMycKCQkJCQkJCQkJCQkJKSwKCQkJCSdDVUJFS1BJTUVNQkVSJwkJCT0+IGFycmF5KCdjYXRlZ29yeScJCQk9PglQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbjo6Q0FURUdPUllfQ1VCRSwKCQkJCQkJCQkJCQkJICdmdW5jdGlvbkNhbGwnCQk9PgknUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpEVU1NWScsCgkJCQkJCQkJCQkJCSAnYXJndW1lbnRDb3VudCcJPT4JJz8nCgkJCQkJCQkJCQkJCSksCgkJCQknQ1VCRU1FTUJFUicJCQk9PiBhcnJheSgnY2F0ZWdvcnknCQkJPT4JUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb246OkNBVEVHT1JZX0NVQkUsCgkJCQkJCQkJCQkJCSAnZnVuY3Rpb25DYWxsJwkJPT4JJ1BIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6RFVNTVknLAoJCQkJCQkJCQkJCQkgJ2FyZ3VtZW50Q291bnQnCT0+CSc/JwoJCQkJCQkJCQkJCQkpLAoJCQkJJ0NVQkVNRU1CRVJQUk9QRVJUWScJPT4gYXJyYXkoJ2NhdGVnb3J5JwkJCT0+CVBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uOjpDQVRFR09SWV9DVUJFLAoJCQkJCQkJCQkJCQkgJ2Z1bmN0aW9uQ2FsbCcJCT0+CSdQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OkRVTU1ZJywKCQkJCQkJCQkJCQkJICdhcmd1bWVudENvdW50Jwk9PgknPycKCQkJCQkJCQkJCQkJKSwKCQkJCSdDVUJFUkFOS0VETUVNQkVSJwkJPT4gYXJyYXkoJ2NhdGVnb3J5JwkJCT0+CVBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uOjpDQVRFR09SWV9DVUJFLAoJCQkJCQkJCQkJCQkgJ2Z1bmN0aW9uQ2FsbCcJCT0+CSdQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OkRVTU1ZJywKCQkJCQkJCQkJCQkJICdhcmd1bWVudENvdW50Jwk9PgknPycKCQkJCQkJCQkJCQkJKSwKCQkJCSdDVUJFU0VUJwkJCQk9PiBhcnJheSgnY2F0ZWdvcnknCQkJPT4JUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb246OkNBVEVHT1JZX0NVQkUsCgkJCQkJCQkJCQkJCSAnZnVuY3Rpb25DYWxsJwkJPT4JJ1BIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6RFVNTVknLAoJCQkJCQkJCQkJCQkgJ2FyZ3VtZW50Q291bnQnCT0+CSc/JwoJCQkJCQkJCQkJCQkpLAoJCQkJJ0NVQkVTRVRDT1VOVCcJCQk9PiBhcnJheSgnY2F0ZWdvcnknCQkJPT4JUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb246OkNBVEVHT1JZX0NVQkUsCgkJCQkJCQkJCQkJCSAnZnVuY3Rpb25DYWxsJwkJPT4JJ1BIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6RFVNTVknLAoJCQkJCQkJCQkJCQkgJ2FyZ3VtZW50Q291bnQnCT0+CSc/JwoJCQkJCQkJCQkJCQkpLAoJCQkJJ0NVQkVWQUxVRScJCQkJPT4gYXJyYXkoJ2NhdGVnb3J5JwkJCT0+CVBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uOjpDQVRFR09SWV9DVUJFLAoJCQkJCQkJCQkJCQkgJ2Z1bmN0aW9uQ2FsbCcJCT0+CSdQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OkRVTU1ZJywKCQkJCQkJCQkJCQkJICdhcmd1bWVudENvdW50Jwk9PgknPycKCQkJCQkJCQkJCQkJKSwKCQkJCSdDVU1JUE1UJwkJCQk9PiBhcnJheSgnY2F0ZWdvcnknCQkJPT4JUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb246OkNBVEVHT1JZX0ZJTkFOQ0lBTCwKCQkJCQkJCQkJCQkJICdmdW5jdGlvbkNhbGwnCQk9PgknUEhQRXhjZWxfQ2FsY3VsYXRpb25fRmluYW5jaWFsOjpDVU1JUE1UJywKCQkJCQkJCQkJCQkJICdhcmd1bWVudENvdW50Jwk9PgknNicKCQkJCQkJCQkJCQkJKSwKCQkJCSdDVU1QUklOQycJCQkJPT4gYXJyYXkoJ2NhdGVnb3J5JwkJCT0+CVBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uOjpDQVRFR09SWV9GSU5BTkNJQUwsCgkJCQkJCQkJCQkJCSAnZnVuY3Rpb25DYWxsJwkJPT4JJ1BIUEV4Y2VsX0NhbGN1bGF0aW9uX0ZpbmFuY2lhbDo6Q1VNUFJJTkMnLAoJCQkJCQkJCQkJCQkgJ2FyZ3VtZW50Q291bnQnCT0+CSc2JwoJCQkJCQkJCQkJCQkpLAoJCQkJJ0RBVEUnCQkJCQk9PiBhcnJheSgnY2F0ZWdvcnknCQkJPT4JUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb246OkNBVEVHT1JZX0RBVEVfQU5EX1RJTUUsCgkJCQkJCQkJCQkJCSAnZnVuY3Rpb25DYWxsJwkJPT4JJ1BIUEV4Y2VsX0NhbGN1bGF0aW9uX0RhdGVUaW1lOjpEQVRFJywKCQkJCQkJCQkJCQkJICdhcmd1bWVudENvdW50Jwk9PgknMycKCQkJCQkJCQkJCQkJKSwKCQkJCSdEQVRFRElGJwkJCQk9PiBhcnJheSgnY2F0ZWdvcnknCQkJPT4JUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb246OkNBVEVHT1JZX0RBVEVfQU5EX1RJTUUsCgkJCQkJCQkJCQkJCSAnZnVuY3Rpb25DYWxsJwkJPT4JJ1BIUEV4Y2VsX0NhbGN1bGF0aW9uX0RhdGVUaW1lOjpEQVRFRElGJywKCQkJCQkJCQkJCQkJICdhcmd1bWVudENvdW50Jwk9PgknMiwzJwoJCQkJCQkJCQkJCQkpLAoJCQkJJ0RBVEVWQUxVRScJCQkJPT4gYXJyYXkoJ2NhdGVnb3J5JwkJCT0+CVBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uOjpDQVRFR09SWV9EQVRFX0FORF9USU1FLAoJCQkJCQkJCQkJCQkgJ2Z1bmN0aW9uQ2FsbCcJCT0+CSdQSFBFeGNlbF9DYWxjdWxhdGlvbl9EYXRlVGltZTo6REFURVZBTFVFJywKCQkJCQkJCQkJCQkJICdhcmd1bWVudENvdW50Jwk9PgknMScKCQkJCQkJCQkJCQkJKSwKCQkJCSdEQVZFUkFHRScJCQkJPT4gYXJyYXkoJ2NhdGVnb3J5JwkJCT0+CVBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uOjpDQVRFR09SWV9EQVRBQkFTRSwKCQkJCQkJCQkJCQkJICdmdW5jdGlvbkNhbGwnCQk9PgknUEhQRXhjZWxfQ2FsY3VsYXRpb25fRGF0YWJhc2U6OkRBVkVSQUdFJywKCQkJCQkJCQkJCQkJICdhcmd1bWVudENvdW50Jwk9PgknMycKCQkJCQkJCQkJCQkJKSwKCQkJCSdEQVknCQkJCQk9PiBhcnJheSgnY2F0ZWdvcnknCQkJPT4JUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb246OkNBVEVHT1JZX0RBVEVfQU5EX1RJTUUsCgkJCQkJCQkJCQkJCSAnZnVuY3Rpb25DYWxsJwkJPT4JJ1BIUEV4Y2VsX0NhbGN1bGF0aW9uX0RhdGVUaW1lOjpEQVlPRk1PTlRIJywKCQkJCQkJCQkJCQkJICdhcmd1bWVudENvdW50Jwk9PgknMScKCQkJCQkJCQkJCQkJKSwKCQkJCSdEQVlTMzYwJwkJCQk9PiBhcnJheSgnY2F0ZWdvcnknCQkJPT4JUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb246OkNBVEVHT1JZX0RBVEVfQU5EX1RJTUUsCgkJCQkJCQkJCQkJCSAnZnVuY3Rpb25DYWxsJwkJPT4JJ1BIUEV4Y2VsX0NhbGN1bGF0aW9uX0RhdGVUaW1lOjpEQVlTMzYwJywKCQkJCQkJCQkJCQkJICdhcmd1bWVudENvdW50Jwk9PgknMiwzJwoJCQkJCQkJCQkJCQkpLAoJCQkJJ0RCJwkJCQkJPT4gYXJyYXkoJ2NhdGVnb3J5JwkJCT0+CVBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uOjpDQVRFR09SWV9GSU5BTkNJQUwsCgkJCQkJCQkJCQkJCSAnZnVuY3Rpb25DYWxsJwkJPT4JJ1BIUEV4Y2VsX0NhbGN1bGF0aW9uX0ZpbmFuY2lhbDo6REInLAoJCQkJCQkJCQkJCQkgJ2FyZ3VtZW50Q291bnQnCT0+CSc0LDUnCgkJCQkJCQkJCQkJCSksCgkJCQknRENPVU5UJwkJCQk9PiBhcnJheSgnY2F0ZWdvcnknCQkJPT4JUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb246OkNBVEVHT1JZX0RBVEFCQVNFLAoJCQkJCQkJCQkJCQkgJ2Z1bmN0aW9uQ2FsbCcJCT0+CSdQSFBFeGNlbF9DYWxjdWxhdGlvbl9EYXRhYmFzZTo6RENPVU5UJywKCQkJCQkJCQkJCQkJICdhcmd1bWVudENvdW50Jwk9PgknMycKCQkJCQkJCQkJCQkJKSwKCQkJCSdEQ09VTlRBJwkJCQk9PiBhcnJheSgnY2F0ZWdvcnknCQkJPT4JUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb246OkNBVEVHT1JZX0RBVEFCQVNFLAoJCQkJCQkJCQkJCQkgJ2Z1bmN0aW9uQ2FsbCcJCT0+CSdQSFBFeGNlbF9DYWxjdWxhdGlvbl9EYXRhYmFzZTo6RENPVU5UQScsCgkJCQkJCQkJCQkJCSAnYXJndW1lbnRDb3VudCcJPT4JJzMnCgkJCQkJCQkJCQkJCSksCgkJCQknRERCJwkJCQkJPT4gYXJyYXkoJ2NhdGVnb3J5JwkJCT0+CVBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uOjpDQVRFR09SWV9GSU5BTkNJQUwsCgkJCQkJCQkJCQkJCSAnZnVuY3Rpb25DYWxsJwkJPT4JJ1BIUEV4Y2VsX0NhbGN1bGF0aW9uX0ZpbmFuY2lhbDo6RERCJywKCQkJCQkJCQkJCQkJICdhcmd1bWVudENvdW50Jwk9PgknNCw1JwoJCQkJCQkJCQkJCQkpLAoJCQkJJ0RFQzJCSU4nCQkJCT0+IGFycmF5KCdjYXRlZ29yeScJCQk9PglQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbjo6Q0FURUdPUllfRU5HSU5FRVJJTkcsCgkJCQkJCQkJCQkJCSAnZnVuY3Rpb25DYWxsJwkJPT4JJ1BIUEV4Y2VsX0NhbGN1bGF0aW9uX0VuZ2luZWVyaW5nOjpERUNUT0JJTicsCgkJCQkJCQkJCQkJCSAnYXJndW1lbnRDb3VudCcJPT4JJzEsMicKCQkJCQkJCQkJCQkJKSwKCQkJCSdERUMySEVYJwkJCQk9PiBhcnJheSgnY2F0ZWdvcnknCQkJPT4JUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb246OkNBVEVHT1JZX0VOR0lORUVSSU5HLAoJCQkJCQkJCQkJCQkgJ2Z1bmN0aW9uQ2FsbCcJCT0+CSdQSFBFeGNlbF9DYWxjdWxhdGlvbl9FbmdpbmVlcmluZzo6REVDVE9IRVgnLAoJCQkJCQkJCQkJCQkgJ2FyZ3VtZW50Q291bnQnCT0+CScxLDInCgkJCQkJCQkJCQkJCSksCgkJCQknREVDMk9DVCcJCQkJPT4gYXJyYXkoJ2NhdGVnb3J5JwkJCT0+CVBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uOjpDQVRFR09SWV9FTkdJTkVFUklORywKCQkJCQkJCQkJCQkJICdmdW5jdGlvbkNhbGwnCQk9PgknUEhQRXhjZWxfQ2FsY3VsYXRpb25fRW5naW5lZXJpbmc6OkRFQ1RPT0NUJywKCQkJCQkJCQkJCQkJICdhcmd1bWVudENvdW50Jwk9PgknMSwyJwoJCQkJCQkJCQkJCQkpLAoJCQkJJ0RFR1JFRVMnCQkJCT0+IGFycmF5KCdjYXRlZ29yeScJCQk9PglQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbjo6Q0FURUdPUllfTUFUSF9BTkRfVFJJRywKCQkJCQkJCQkJCQkJICdmdW5jdGlvbkNhbGwnCQk9PgkncmFkMmRlZycsCgkJCQkJCQkJCQkJCSAnYXJndW1lbnRDb3VudCcJPT4JJzEnCgkJCQkJCQkJCQkJCSksCgkJCQknREVMVEEnCQkJCQk9PiBhcnJheSgnY2F0ZWdvcnknCQkJPT4JUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb246OkNBVEVHT1JZX0VOR0lORUVSSU5HLAoJCQkJCQkJCQkJCQkgJ2Z1bmN0aW9uQ2FsbCcJCT0+CSdQSFBFeGNlbF9DYWxjdWxhdGlvbl9FbmdpbmVlcmluZzo6REVMVEEnLAoJCQkJCQkJCQkJCQkgJ2FyZ3VtZW50Q291bnQnCT0+CScxLDInCgkJCQkJCQkJCQkJCSksCgkJCQknREVWU1EnCQkJCQk9PiBhcnJheSgnY2F0ZWdvcnknCQkJPT4JUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb246OkNBVEVHT1JZX1NUQVRJU1RJQ0FMLAoJCQkJCQkJCQkJCQkgJ2Z1bmN0aW9uQ2FsbCcJCT0+CSdQSFBFeGNlbF9DYWxjdWxhdGlvbl9TdGF0aXN0aWNhbDo6REVWU1EnLAoJCQkJCQkJCQkJCQkgJ2FyZ3VtZW50Q291bnQnCT0+CScxKycKCQkJCQkJCQkJCQkJKSwKCQkJCSdER0VUJwkJCQkJPT4gYXJyYXkoJ2NhdGVnb3J5JwkJCT0+CVBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uOjpDQVRFR09SWV9EQVRBQkFTRSwKCQkJCQkJCQkJCQkJICdmdW5jdGlvbkNhbGwnCQk9PgknUEhQRXhjZWxfQ2FsY3VsYXRpb25fRGF0YWJhc2U6OkRHRVQnLAoJCQkJCQkJCQkJCQkgJ2FyZ3VtZW50Q291bnQnCT0+CSczJwoJCQkJCQkJCQkJCQkpLAoJCQkJJ0RJU0MnCQkJCQk9PiBhcnJheSgnY2F0ZWdvcnknCQkJPT4JUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb246OkNBVEVHT1JZX0ZJTkFOQ0lBTCwKCQkJCQkJCQkJCQkJICdmdW5jdGlvbkNhbGwnCQk9PgknUEhQRXhjZWxfQ2FsY3VsYXRpb25fRmluYW5jaWFsOjpESVNDJywKCQkJCQkJCQkJCQkJICdhcmd1bWVudENvdW50Jwk9PgknNCw1JwoJCQkJCQkJCQkJCQkpLAoJCQkJJ0RNQVgnCQkJCQk9PiBhcnJheSgnY2F0ZWdvcnknCQkJPT4JUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb246OkNBVEVHT1JZX0RBVEFCQVNFLAoJCQkJCQkJCQkJCQkgJ2Z1bmN0aW9uQ2FsbCcJCT0+CSdQSFBFeGNlbF9DYWxjdWxhdGlvbl9EYXRhYmFzZTo6RE1BWCcsCgkJCQkJCQkJCQkJCSAnYXJndW1lbnRDb3VudCcJPT4JJzMnCgkJCQkJCQkJCQkJCSksCgkJCQknRE1JTicJCQkJCT0+IGFycmF5KCdjYXRlZ29yeScJCQk9PglQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbjo6Q0FURUdPUllfREFUQUJBU0UsCgkJCQkJCQkJCQkJCSAnZnVuY3Rpb25DYWxsJwkJPT4JJ1BIUEV4Y2VsX0NhbGN1bGF0aW9uX0RhdGFiYXNlOjpETUlOJywKCQkJCQkJCQkJCQkJICdhcmd1bWVudENvdW50Jwk9PgknMycKCQkJCQkJCQkJCQkJKSwKCQkJCSdET0xMQVInCQkJCT0+IGFycmF5KCdjYXRlZ29yeScJCQk9PglQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbjo6Q0FURUdPUllfVEVYVF9BTkRfREFUQSwKCQkJCQkJCQkJCQkJICdmdW5jdGlvbkNhbGwnCQk9PgknUEhQRXhjZWxfQ2FsY3VsYXRpb25fVGV4dERhdGE6OkRPTExBUicsCgkJCQkJCQkJCQkJCSAnYXJndW1lbnRDb3VudCcJPT4JJzEsMicKCQkJCQkJCQkJCQkJKSwKCQkJCSdET0xMQVJERScJCQkJPT4gYXJyYXkoJ2NhdGVnb3J5JwkJCT0+CVBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uOjpDQVRFR09SWV9GSU5BTkNJQUwsCgkJCQkJCQkJCQkJCSAnZnVuY3Rpb25DYWxsJwkJPT4JJ1BIUEV4Y2VsX0NhbGN1bGF0aW9uX0ZpbmFuY2lhbDo6RE9MTEFSREUnLAoJCQkJCQkJCQkJCQkgJ2FyZ3VtZW50Q291bnQnCT0+CScyJwoJCQkJCQkJCQkJCQkpLAoJCQkJJ0RPTExBUkZSJwkJCQk9PiBhcnJheSgnY2F0ZWdvcnknCQkJPT4JUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb246OkNBVEVHT1JZX0ZJTkFOQ0lBTCwKCQkJCQkJCQkJCQkJICdmdW5jdGlvbkNhbGwnCQk9PgknUEhQRXhjZWxfQ2FsY3VsYXRpb25fRmluYW5jaWFsOjpET0xMQVJGUicsCgkJCQkJCQkJCQkJCSAnYXJndW1lbnRDb3VudCcJPT4JJzInCgkJCQkJCQkJCQkJCSksCgkJCQknRFBST0RVQ1QnCQkJCT0+IGFycmF5KCdjYXRlZ29yeScJCQk9PglQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbjo6Q0FURUdPUllfREFUQUJBU0UsCgkJCQkJCQkJCQkJCSAnZnVuY3Rpb25DYWxsJwkJPT4JJ1BIUEV4Y2VsX0NhbGN1bGF0aW9uX0RhdGFiYXNlOjpEUFJPRFVDVCcsCgkJCQkJCQkJCQkJCSAnYXJndW1lbnRDb3VudCcJPT4JJzMnCgkJCQkJCQkJCQkJCSksCgkJCQknRFNUREVWJwkJCQk9PiBhcnJheSgnY2F0ZWdvcnknCQkJPT4JUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb246OkNBVEVHT1JZX0RBVEFCQVNFLAoJCQkJCQkJCQkJCQkgJ2Z1bmN0aW9uQ2FsbCcJCT0+CSdQSFBFeGNlbF9DYWxjdWxhdGlvbl9EYXRhYmFzZTo6RFNUREVWJywKCQkJCQkJCQkJCQkJICdhcmd1bWVudENvdW50Jwk9PgknMycKCQkJCQkJCQkJCQkJKSwKCQkJCSdEU1RERVZQJwkJCQk9PiBhcnJheSgnY2F0ZWdvcnknCQkJPT4JUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb246OkNBVEVHT1JZX0RBVEFCQVNFLAoJCQkJCQkJCQkJCQkgJ2Z1bmN0aW9uQ2FsbCcJCT0+CSdQSFBFeGNlbF9DYWxjdWxhdGlvbl9EYXRhYmFzZTo6RFNUREVWUCcsCgkJCQkJCQkJCQkJCSAnYXJndW1lbnRDb3VudCcJPT4JJzMnCgkJCQkJCQkJCQkJCSksCgkJCQknRFNVTScJCQkJCT0+IGFycmF5KCdjYXRlZ29yeScJCQk9PglQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbjo6Q0FURUdPUllfREFUQUJBU0UsCgkJCQkJCQkJCQkJCSAnZnVuY3Rpb25DYWxsJwkJPT4JJ1BIUEV4Y2VsX0NhbGN1bGF0aW9uX0RhdGFiYXNlOjpEU1VNJywKCQkJCQkJCQkJCQkJICdhcmd1bWVudENvdW50Jwk9PgknMycKCQkJCQkJCQkJCQkJKSwKCQkJCSdEVVJBVElPTicJCQkJPT4gYXJyYXkoJ2NhdGVnb3J5JwkJCT0+CVBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uOjpDQVRFR09SWV9GSU5BTkNJQUwsCgkJCQkJCQkJCQkJCSAnZnVuY3Rpb25DYWxsJwkJPT4JJ1BIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6RFVNTVknLAoJCQkJCQkJCQkJCQkgJ2FyZ3VtZW50Q291bnQnCT0+CSc1LDYnCgkJCQkJCQkJCQkJCSksCgkJCQknRFZBUicJCQkJCT0+IGFycmF5KCdjYXRlZ29yeScJCQk9PglQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbjo6Q0FURUdPUllfREFUQUJBU0UsCgkJCQkJCQkJCQkJCSAnZnVuY3Rpb25DYWxsJwkJPT4JJ1BIUEV4Y2VsX0NhbGN1bGF0aW9uX0RhdGFiYXNlOjpEVkFSJywKCQkJCQkJCQkJCQkJICdhcmd1bWVudENvdW50Jwk9PgknMycKCQkJCQkJCQkJCQkJKSwKCQkJCSdEVkFSUCcJCQkJCT0+IGFycmF5KCdjYXRlZ29yeScJCQk9PglQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbjo6Q0FURUdPUllfREFUQUJBU0UsCgkJCQkJCQkJCQkJCSAnZnVuY3Rpb25DYWxsJwkJPT4JJ1BIUEV4Y2VsX0NhbGN1bGF0aW9uX0RhdGFiYXNlOjpEVkFSUCcsCgkJCQkJCQkJCQkJCSAnYXJndW1lbnRDb3VudCcJPT4JJzMnCgkJCQkJCQkJCQkJCSksCgkJCQknRURBVEUnCQkJCQk9PiBhcnJheSgnY2F0ZWdvcnknCQkJPT4JUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb246OkNBVEVHT1JZX0RBVEVfQU5EX1RJTUUsCgkJCQkJCQkJCQkJCSAnZnVuY3Rpb25DYWxsJwkJPT4JJ1BIUEV4Y2VsX0NhbGN1bGF0aW9uX0RhdGVUaW1lOjpFREFURScsCgkJCQkJCQkJCQkJCSAnYXJndW1lbnRDb3VudCcJPT4JJzInCgkJCQkJCQkJCQkJCSksCgkJCQknRUZGRUNUJwkJCQk9PiBhcnJheSgnY2F0ZWdvcnknCQkJPT4JUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb246OkNBVEVHT1JZX0ZJTkFOQ0lBTCwKCQkJCQkJCQkJCQkJICdmdW5jdGlvbkNhbGwnCQk9PgknUEhQRXhjZWxfQ2FsY3VsYXRpb25fRmluYW5jaWFsOjpFRkZFQ1QnLAoJCQkJCQkJCQkJCQkgJ2FyZ3VtZW50Q291bnQnCT0+CScyJwoJCQkJCQkJCQkJCQkpLAoJCQkJJ0VPTU9OVEgnCQkJCT0+IGFycmF5KCdjYXRlZ29yeScJCQk9PglQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbjo6Q0FURUdPUllfREFURV9BTkRfVElNRSwKCQkJCQkJCQkJCQkJICdmdW5jdGlvbkNhbGwnCQk9PgknUEhQRXhjZWxfQ2FsY3VsYXRpb25fRGF0ZVRpbWU6OkVPTU9OVEgnLAoJCQkJCQkJCQkJCQkgJ2FyZ3VtZW50Q291bnQnCT0+CScyJwoJCQkJCQkJCQkJCQkpLAoJCQkJJ0VSRicJCQkJCT0+IGFycmF5KCdjYXRlZ29yeScJCQk9PglQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbjo6Q0FURUdPUllfRU5HSU5FRVJJTkcsCgkJCQkJCQkJCQkJCSAnZnVuY3Rpb25DYWxsJwkJPT4JJ1BIUEV4Y2VsX0NhbGN1bGF0aW9uX0VuZ2luZWVyaW5nOjpFUkYnLAoJCQkJCQkJCQkJCQkgJ2FyZ3VtZW50Q291bnQnCT0+CScxLDInCgkJCQkJCQkJCQkJCSksCgkJCQknRVJGQycJCQkJCT0+IGFycmF5KCdjYXRlZ29yeScJCQk9PglQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbjo6Q0FURUdPUllfRU5HSU5FRVJJTkcsCgkJCQkJCQkJCQkJCSAnZnVuY3Rpb25DYWxsJwkJPT4JJ1BIUEV4Y2VsX0NhbGN1bGF0aW9uX0VuZ2luZWVyaW5nOjpFUkZDJywKCQkJCQkJCQkJCQkJICdhcmd1bWVudENvdW50Jwk9PgknMScKCQkJCQkJCQkJCQkJKSwKCQkJCSdFUlJPUi5UWVBFJwkJCT0+IGFycmF5KCdjYXRlZ29yeScJCQk9PglQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbjo6Q0FURUdPUllfSU5GT1JNQVRJT04sCgkJCQkJCQkJCQkJCSAnZnVuY3Rpb25DYWxsJwkJPT4JJ1BIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6RVJST1JfVFlQRScsCgkJCQkJCQkJCQkJCSAnYXJndW1lbnRDb3VudCcJPT4JJzEnCgkJCQkJCQkJCQkJCSksCgkJCQknRVZFTicJCQkJCT0+IGFycmF5KCdjYXRlZ29yeScJCQk9PglQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbjo6Q0FURUdPUllfTUFUSF9BTkRfVFJJRywKCQkJCQkJCQkJCQkJICdmdW5jdGlvbkNhbGwnCQk9PgknUEhQRXhjZWxfQ2FsY3VsYXRpb25fTWF0aFRyaWc6OkVWRU4nLAoJCQkJCQkJCQkJCQkgJ2FyZ3VtZW50Q291bnQnCT0+CScxJwoJCQkJCQkJCQkJCQkpLAoJCQkJJ0VYQUNUJwkJCQkJPT4gYXJyYXkoJ2NhdGVnb3J5JwkJCT0+CVBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uOjpDQVRFR09SWV9URVhUX0FORF9EQVRBLAoJCQkJCQkJCQkJCQkgJ2Z1bmN0aW9uQ2FsbCcJCT0+CSdQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OkRVTU1ZJywKCQkJCQkJCQkJCQkJICdhcmd1bWVudENvdW50Jwk9PgknMicKCQkJCQkJCQkJCQkJKSwKCQkJCSdFWFAnCQkJCQk9PiBhcnJheSgnY2F0ZWdvcnknCQkJPT4JUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb246OkNBVEVHT1JZX01BVEhfQU5EX1RSSUcsCgkJCQkJCQkJCQkJCSAnZnVuY3Rpb25DYWxsJwkJPT4JJ2V4cCcsCgkJCQkJCQkJCQkJCSAnYXJndW1lbnRDb3VudCcJPT4JJzEnCgkJCQkJCQkJCQkJCSksCgkJCQknRVhQT05ESVNUJwkJCQk9PiBhcnJheSgnY2F0ZWdvcnknCQkJPT4JUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb246OkNBVEVHT1JZX1NUQVRJU1RJQ0FMLAoJCQkJCQkJCQkJCQkgJ2Z1bmN0aW9uQ2FsbCcJCT0+CSdQSFBFeGNlbF9DYWxjdWxhdGlvbl9TdGF0aXN0aWNhbDo6RVhQT05ESVNUJywKCQkJCQkJCQkJCQkJICdhcmd1bWVudENvdW50Jwk9PgknMycKCQkJCQkJCQkJCQkJKSwKCQkJCSdGQUNUJwkJCQkJPT4gYXJyYXkoJ2NhdGVnb3J5JwkJCT0+CVBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uOjpDQVRFR09SWV9NQVRIX0FORF9UUklHLAoJCQkJCQkJCQkJCQkgJ2Z1bmN0aW9uQ2FsbCcJCT0+CSdQSFBFeGNlbF9DYWxjdWxhdGlvbl9NYXRoVHJpZzo6RkFDVCcsCgkJCQkJCQkJCQkJCSAnYXJndW1lbnRDb3VudCcJPT4JJzEnCgkJCQkJCQkJCQkJCSksCgkJCQknRkFDVERPVUJMRScJCQk9PiBhcnJheSgnY2F0ZWdvcnknCQkJPT4JUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb246OkNBVEVHT1JZX01BVEhfQU5EX1RSSUcsCgkJCQkJCQkJCQkJCSAnZnVuY3Rpb25DYWxsJwkJPT4JJ1BIUEV4Y2VsX0NhbGN1bGF0aW9uX01hdGhUcmlnOjpGQUNURE9VQkxFJywKCQkJCQkJCQkJCQkJICdhcmd1bWVudENvdW50Jwk9PgknMScKCQkJCQkJCQkJCQkJKSwKCQkJCSdGQUxTRScJCQkJCT0+IGFycmF5KCdjYXRlZ29yeScJCQk9PglQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbjo6Q0FURUdPUllfTE9HSUNBTCwKCQkJCQkJCQkJCQkJICdmdW5jdGlvbkNhbGwnCQk9PgknUEhQRXhjZWxfQ2FsY3VsYXRpb25fTG9naWNhbDo6RkFMU0UnLAoJCQkJCQkJCQkJCQkgJ2FyZ3VtZW50Q291bnQnCT0+CScwJwoJCQkJCQkJCQkJCQkpLAoJCQkJJ0ZESVNUJwkJCQkJPT4gYXJyYXkoJ2NhdGVnb3J5JwkJCT0+CVBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uOjpDQVRFR09SWV9TVEFUSVNUSUNBTCwKCQkJCQkJCQkJCQkJICdmdW5jdGlvbkNhbGwnCQk9PgknUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpEVU1NWScsCgkJCQkJCQkJCQkJCSAnYXJndW1lbnRDb3VudCcJPT4JJzMnCgkJCQkJCQkJCQkJCSksCgkJCQknRklORCcJCQkJCT0+IGFycmF5KCdjYXRlZ29yeScJCQk9PglQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbjo6Q0FURUdPUllfVEVYVF9BTkRfREFUQSwKCQkJCQkJCQkJCQkJICdmdW5jdGlvbkNhbGwnCQk9PgknUEhQRXhjZWxfQ2FsY3VsYXRpb25fVGV4dERhdGE6OlNFQVJDSFNFTlNJVElWRScsCgkJCQkJCQkJCQkJCSAnYXJndW1lbnRDb3VudCcJPT4JJzIsMycKCQkJCQkJCQkJCQkJKSwKCQkJCSdGSU5EQicJCQkJCT0+IGFycmF5KCdjYXRlZ29yeScJCQk9PglQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbjo6Q0FURUdPUllfVEVYVF9BTkRfREFUQSwKCQkJCQkJCQkJCQkJICdmdW5jdGlvbkNhbGwnCQk9PgknUEhQRXhjZWxfQ2FsY3VsYXRpb25fVGV4dERhdGE6OlNFQVJDSFNFTlNJVElWRScsCgkJCQkJCQkJCQkJCSAnYXJndW1lbnRDb3VudCcJPT4JJzIsMycKCQkJCQkJCQkJCQkJKSwKCQkJCSdGSU5WJwkJCQkJPT4gYXJyYXkoJ2NhdGVnb3J5JwkJCT0+CVBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uOjpDQVRFR09SWV9TVEFUSVNUSUNBTCwKCQkJCQkJCQkJCQkJICdmdW5jdGlvbkNhbGwnCQk9PgknUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpEVU1NWScsCgkJCQkJCQkJCQkJCSAnYXJndW1lbnRDb3VudCcJPT4JJzMnCgkJCQkJCQkJCQkJCSksCgkJCQknRklTSEVSJwkJCQk9PiBhcnJheSgnY2F0ZWdvcnknCQkJPT4JUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb246OkNBVEVHT1JZX1NUQVRJU1RJQ0FMLAoJCQkJCQkJCQkJCQkgJ2Z1bmN0aW9uQ2FsbCcJCT0+CSdQSFBFeGNlbF9DYWxjdWxhdGlvbl9TdGF0aXN0aWNhbDo6RklTSEVSJywKCQkJCQkJCQkJCQkJICdhcmd1bWVudENvdW50Jwk9PgknMScKCQkJCQkJCQkJCQkJKSwKCQkJCSdGSVNIRVJJTlYnCQkJCT0+IGFycmF5KCdjYXRlZ29yeScJCQk9PglQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbjo6Q0FURUdPUllfU1RBVElTVElDQUwsCgkJCQkJCQkJCQkJCSAnZnVuY3Rpb25DYWxsJwkJPT4JJ1BIUEV4Y2VsX0NhbGN1bGF0aW9uX1N0YXRpc3RpY2FsOjpGSVNIRVJJTlYnLAoJCQkJCQkJCQkJCQkgJ2FyZ3VtZW50Q291bnQnCT0+CScxJwoJCQkJCQkJCQkJCQkpLAoJCQkJJ0ZJWEVEJwkJCQkJPT4gYXJyYXkoJ2NhdGVnb3J5JwkJCT0+CVBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uOjpDQVRFR09SWV9URVhUX0FORF9EQVRBLAoJCQkJCQkJCQkJCQkgJ2Z1bmN0aW9uQ2FsbCcJCT0+CSdQSFBFeGNlbF9DYWxjdWxhdGlvbl9UZXh0RGF0YTo6RklYRURGT1JNQVQnLAoJCQkJCQkJCQkJCQkgJ2FyZ3VtZW50Q291bnQnCT0+CScxLTMnCgkJCQkJCQkJCQkJCSksCgkJCQknRkxPT1InCQkJCQk9PiBhcnJheSgnY2F0ZWdvcnknCQkJPT4JUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb246OkNBVEVHT1JZX01BVEhfQU5EX1RSSUcsCgkJCQkJCQkJCQkJCSAnZnVuY3Rpb25DYWxsJwkJPT4JJ1BIUEV4Y2VsX0NhbGN1bGF0aW9uX01hdGhUcmlnOjpGTE9PUicsCgkJCQkJCQkJCQkJCSAnYXJndW1lbnRDb3VudCcJPT4JJzInCgkJCQkJCQkJCQkJCSksCgkJCQknRk9SRUNBU1QnCQkJCT0+IGFycmF5KCdjYXRlZ29yeScJCQk9PglQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbjo6Q0FURUdPUllfU1RBVElTVElDQUwsCgkJCQkJCQkJCQkJCSAnZnVuY3Rpb25DYWxsJwkJPT4JJ1BIUEV4Y2VsX0NhbGN1bGF0aW9uX1N0YXRpc3RpY2FsOjpGT1JFQ0FTVCcsCgkJCQkJCQkJCQkJCSAnYXJndW1lbnRDb3VudCcJPT4JJzMnCgkJCQkJCQkJCQkJCSksCgkJCQknRlJFUVVFTkNZJwkJCQk9PiBhcnJheSgnY2F0ZWdvcnknCQkJPT4JUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb246OkNBVEVHT1JZX1NUQVRJU1RJQ0FMLAoJCQkJCQkJCQkJCQkgJ2Z1bmN0aW9uQ2FsbCcJCT0+CSdQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OkRVTU1ZJywKCQkJCQkJCQkJCQkJICdhcmd1bWVudENvdW50Jwk9PgknMicKCQkJCQkJCQkJCQkJKSwKCQkJCSdGVEVTVCcJCQkJCT0+IGFycmF5KCdjYXRlZ29yeScJCQk9PglQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbjo6Q0FURUdPUllfU1RBVElTVElDQUwsCgkJCQkJCQkJCQkJCSAnZnVuY3Rpb25DYWxsJwkJPT4JJ1BIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6RFVNTVknLAoJCQkJCQkJCQkJCQkgJ2FyZ3VtZW50Q291bnQnCT0+CScyJwoJCQkJCQkJCQkJCQkpLAoJCQkJJ0ZWJwkJCQkJPT4gYXJyYXkoJ2NhdGVnb3J5JwkJCT0+CVBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uOjpDQVRFR09SWV9GSU5BTkNJQUwsCgkJCQkJCQkJCQkJCSAnZnVuY3Rpb25DYWxsJwkJPT4JJ1BIUEV4Y2VsX0NhbGN1bGF0aW9uX0ZpbmFuY2lhbDo6RlYnLAoJCQkJCQkJCQkJCQkgJ2FyZ3VtZW50Q291bnQnCT0+CSczLTUnCgkJCQkJCQkJCQkJCSksCgkJCQknRlZTQ0hFRFVMRScJCQk9PiBhcnJheSgnY2F0ZWdvcnknCQkJPT4JUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb246OkNBVEVHT1JZX0ZJTkFOQ0lBTCwKCQkJCQkJCQkJCQkJICdmdW5jdGlvbkNhbGwnCQk9PgknUEhQRXhjZWxfQ2FsY3VsYXRpb25fRmluYW5jaWFsOjpGVlNDSEVEVUxFJywKCQkJCQkJCQkJCQkJICdhcmd1bWVudENvdW50Jwk9PgknMicKCQkJCQkJCQkJCQkJKSwKCQkJCSdHQU1NQURJU1QnCQkJCT0+IGFycmF5KCdjYXRlZ29yeScJCQk9PglQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbjo6Q0FURUdPUllfU1RBVElTVElDQUwsCgkJCQkJCQkJCQkJCSAnZnVuY3Rpb25DYWxsJwkJPT4JJ1BIUEV4Y2VsX0NhbGN1bGF0aW9uX1N0YXRpc3RpY2FsOjpHQU1NQURJU1QnLAoJCQkJCQkJCQkJCQkgJ2FyZ3VtZW50Q291bnQnCT0+CSc0JwoJCQkJCQkJCQkJCQkpLAoJCQkJJ0dBTU1BSU5WJwkJCQk9PiBhcnJheSgnY2F0ZWdvcnknCQkJPT4JUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb246OkNBVEVHT1JZX1NUQVRJU1RJQ0FMLAoJCQkJCQkJCQkJCQkgJ2Z1bmN0aW9uQ2FsbCcJCT0+CSdQSFBFeGNlbF9DYWxjdWxhdGlvbl9TdGF0aXN0aWNhbDo6R0FNTUFJTlYnLAoJCQkJCQkJCQkJCQkgJ2FyZ3VtZW50Q291bnQnCT0+CSczJwoJCQkJCQkJCQkJCQkpLAoJCQkJJ0dBTU1BTE4nCQkJCT0+IGFycmF5KCdjYXRlZ29yeScJCQk9PglQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbjo6Q0FURUdPUllfU1RBVElTVElDQUwsCgkJCQkJCQkJCQkJCSAnZnVuY3Rpb25DYWxsJwkJPT4JJ1BIUEV4Y2VsX0NhbGN1bGF0aW9uX1N0YXRpc3RpY2FsOjpHQU1NQUxOJywKCQkJCQkJCQkJCQkJICdhcmd1bWVudENvdW50Jwk9PgknMScKCQkJCQkJCQkJCQkJKSwKCQkJCSdHQ0QnCQkJCQk9PiBhcnJheSgnY2F0ZWdvcnknCQkJPT4JUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb246OkNBVEVHT1JZX01BVEhfQU5EX1RSSUcsCgkJCQkJCQkJCQkJCSAnZnVuY3Rpb25DYWxsJwkJPT4JJ1BIUEV4Y2VsX0NhbGN1bGF0aW9uX01hdGhUcmlnOjpHQ0QnLAoJCQkJCQkJCQkJCQkgJ2FyZ3VtZW50Q291bnQnCT0+CScxKycKCQkJCQkJCQkJCQkJKSwKCQkJCSdHRU9NRUFOJwkJCQk9PiBhcnJheSgnY2F0ZWdvcnknCQkJPT4JUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb246OkNBVEVHT1JZX1NUQVRJU1RJQ0FMLAoJCQkJCQkJCQkJCQkgJ2Z1bmN0aW9uQ2FsbCcJCT0+CSdQSFBFeGNlbF9DYWxjdWxhdGlvbl9TdGF0aXN0aWNhbDo6R0VPTUVBTicsCgkJCQkJCQkJCQkJCSAnYXJndW1lbnRDb3VudCcJPT4JJzErJwoJCQkJCQkJCQkJCQkpLAoJCQkJJ0dFU1RFUCcJCQkJPT4gYXJyYXkoJ2NhdGVnb3J5JwkJCT0+CVBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uOjpDQVRFR09SWV9FTkdJTkVFUklORywKCQkJCQkJCQkJCQkJICdmdW5jdGlvbkNhbGwnCQk9PgknUEhQRXhjZWxfQ2FsY3VsYXRpb25fRW5naW5lZXJpbmc6OkdFU1RFUCcsCgkJCQkJCQkJCQkJCSAnYXJndW1lbnRDb3VudCcJPT4JJzEsMicKCQkJCQkJCQkJCQkJKSwKCQkJCSdHRVRQSVZPVERBVEEnCQkJPT4gYXJyYXkoJ2NhdGVnb3J5JwkJCT0+CVBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uOjpDQVRFR09SWV9MT09LVVBfQU5EX1JFRkVSRU5DRSwKCQkJCQkJCQkJCQkJICdmdW5jdGlvbkNhbGwnCQk9PgknUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpEVU1NWScsCgkJCQkJCQkJCQkJCSAnYXJndW1lbnRDb3VudCcJPT4JJzIrJwoJCQkJCQkJCQkJCQkpLAoJCQkJJ0dST1dUSCcJCQkJPT4gYXJyYXkoJ2NhdGVnb3J5JwkJCT0+CVBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uOjpDQVRFR09SWV9TVEFUSVNUSUNBTCwKCQkJCQkJCQkJCQkJICdmdW5jdGlvbkNhbGwnCQk9PgknUEhQRXhjZWxfQ2FsY3VsYXRpb25fU3RhdGlzdGljYWw6OkdST1dUSCcsCgkJCQkJCQkJCQkJCSAnYXJndW1lbnRDb3VudCcJPT4JJzEtNCcKCQkJCQkJCQkJCQkJKSwKCQkJCSdIQVJNRUFOJwkJCQk9PiBhcnJheSgnY2F0ZWdvcnknCQkJPT4JUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb246OkNBVEVHT1JZX1NUQVRJU1RJQ0FMLAoJCQkJCQkJCQkJCQkgJ2Z1bmN0aW9uQ2FsbCcJCT0+CSdQSFBFeGNlbF9DYWxjdWxhdGlvbl9TdGF0aXN0aWNhbDo6SEFSTUVBTicsCgkJCQkJCQkJCQkJCSAnYXJndW1lbnRDb3VudCcJPT4JJzErJwoJCQkJCQkJCQkJCQkpLAoJCQkJJ0hFWDJCSU4nCQkJCT0+IGFycmF5KCdjYXRlZ29yeScJCQk9PglQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbjo6Q0FURUdPUllfRU5HSU5FRVJJTkcsCgkJCQkJCQkJCQkJCSAnZnVuY3Rpb25DYWxsJwkJPT4JJ1BIUEV4Y2VsX0NhbGN1bGF0aW9uX0VuZ2luZWVyaW5nOjpIRVhUT0JJTicsCgkJCQkJCQkJCQkJCSAnYXJndW1lbnRDb3VudCcJPT4JJzEsMicKCQkJCQkJCQkJCQkJKSwKCQkJCSdIRVgyREVDJwkJCQk9PiBhcnJheSgnY2F0ZWdvcnknCQkJPT4JUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb246OkNBVEVHT1JZX0VOR0lORUVSSU5HLAoJCQkJCQkJCQkJCQkgJ2Z1bmN0aW9uQ2FsbCcJCT0+CSdQSFBFeGNlbF9DYWxjdWxhdGlvbl9FbmdpbmVlcmluZzo6SEVYVE9ERUMnLAoJCQkJCQkJCQkJCQkgJ2FyZ3VtZW50Q291bnQnCT0+CScxJwoJCQkJCQkJCQkJCQkpLAoJCQkJJ0hFWDJPQ1QnCQkJCT0+IGFycmF5KCdjYXRlZ29yeScJCQk9PglQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbjo6Q0FURUdPUllfRU5HSU5FRVJJTkcsCgkJCQkJCQkJCQkJCSAnZnVuY3Rpb25DYWxsJwkJPT4JJ1BIUEV4Y2VsX0NhbGN1bGF0aW9uX0VuZ2luZWVyaW5nOjpIRVhUT09DVCcsCgkJCQkJCQkJCQkJCSAnYXJndW1lbnRDb3VudCcJPT4JJzEsMicKCQkJCQkJCQkJCQkJKSwKCQkJCSdITE9PS1VQJwkJCQk9PiBhcnJheSgnY2F0ZWdvcnknCQkJPT4JUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb246OkNBVEVHT1JZX0xPT0tVUF9BTkRfUkVGRVJFTkNFLAoJCQkJCQkJCQkJCQkgJ2Z1bmN0aW9uQ2FsbCcJCT0+CSdQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OkRVTU1ZJywKCQkJCQkJCQkJCQkJICdhcmd1bWVudENvdW50Jwk9PgknMyw0JwoJCQkJCQkJCQkJCQkpLAoJCQkJJ0hPVVInCQkJCQk9PiBhcnJheSgnY2F0ZWdvcnknCQkJPT4JUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb246OkNBVEVHT1JZX0RBVEVfQU5EX1RJTUUsCgkJCQkJCQkJCQkJCSAnZnVuY3Rpb25DYWxsJwkJPT4JJ1BIUEV4Y2VsX0NhbGN1bGF0aW9uX0RhdGVUaW1lOjpIT1VST0ZEQVknLAoJCQkJCQkJCQkJCQkgJ2FyZ3VtZW50Q291bnQnCT0+CScxJwoJCQkJCQkJCQkJCQkpLAoJCQkJJ0hZUEVSTElOSycJCQkJPT4gYXJyYXkoJ2NhdGVnb3J5JwkJCT0+CVBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uOjpDQVRFR09SWV9MT09LVVBfQU5EX1JFRkVSRU5DRSwKCQkJCQkJCQkJCQkJICdmdW5jdGlvbkNhbGwnCQk9PgknUEhQRXhjZWxfQ2FsY3VsYXRpb25fTG9va3VwUmVmOjpIWVBFUkxJTksnLAoJCQkJCQkJCQkJCQkgJ2FyZ3VtZW50Q291bnQnCT0+CScxLDInLAoJCQkJCQkJCQkJCQkgJ3Bhc3NDZWxsUmVmZXJlbmNlJz0+CXRydWUKCQkJCQkJCQkJCQkJKSwKCQkJCSdIWVBHRU9NRElTVCcJCQk9PiBhcnJheSgnY2F0ZWdvcnknCQkJPT4JUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb246OkNBVEVHT1JZX1NUQVRJU1RJQ0FMLAoJCQkJCQkJCQkJCQkgJ2Z1bmN0aW9uQ2FsbCcJCT0+CSdQSFBFeGNlbF9DYWxjdWxhdGlvbl9TdGF0aXN0aWNhbDo6SFlQR0VPTURJU1QnLAoJCQkJCQkJCQkJCQkgJ2FyZ3VtZW50Q291bnQnCT0+CSc0JwoJCQkJCQkJCQkJCQkpLAoJCQkJJ0lGJwkJCQkJPT4gYXJyYXkoJ2NhdGVnb3J5JwkJCT0+CVBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uOjpDQVRFR09SWV9MT0dJQ0FMLAoJCQkJCQkJCQkJCQkgJ2Z1bmN0aW9uQ2FsbCcJCT0+CSdQSFBFeGNlbF9DYWxjdWxhdGlvbl9Mb2dpY2FsOjpTVEFURU1FTlRfSUYnLAoJCQkJCQkJCQkJCQkgJ2FyZ3VtZW50Q291bnQnCT0+CScxLTMnCgkJCQkJCQkJCQkJCSksCgkJCQknSUZFUlJPUicJCQkJPT4gYXJyYXkoJ2NhdGVnb3J5JwkJCT0+CVBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uOjpDQVRFR09SWV9MT0dJQ0FMLAoJCQkJCQkJCQkJCQkgJ2Z1bmN0aW9uQ2FsbCcJCT0+CSdQSFBFeGNlbF9DYWxjdWxhdGlvbl9Mb2dpY2FsOjpJRkVSUk9SJywKCQkJCQkJCQkJCQkJICdhcmd1bWVudENvdW50Jwk9PgknMicKCQkJCQkJCQkJCQkJKSwKCQkJCSdJTUFCUycJCQkJCT0+IGFycmF5KCdjYXRlZ29yeScJCQk9PglQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbjo6Q0FURUdPUllfRU5HSU5FRVJJTkcsCgkJCQkJCQkJCQkJCSAnZnVuY3Rpb25DYWxsJwkJPT4JJ1BIUEV4Y2VsX0NhbGN1bGF0aW9uX0VuZ2luZWVyaW5nOjpJTUFCUycsCgkJCQkJCQkJCQkJCSAnYXJndW1lbnRDb3VudCcJPT4JJzEnCgkJCQkJCQkJCQkJCSksCgkJCQknSU1BR0lOQVJZJwkJCQk9PiBhcnJheSgnY2F0ZWdvcnknCQkJPT4JUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb246OkNBVEVHT1JZX0VOR0lORUVSSU5HLAoJCQkJCQkJCQkJCQkgJ2Z1bmN0aW9uQ2FsbCcJCT0+CSdQSFBFeGNlbF9DYWxjdWxhdGlvbl9FbmdpbmVlcmluZzo6SU1BR0lOQVJZJywKCQkJCQkJCQkJCQkJICdhcmd1bWVudENvdW50Jwk9PgknMScKCQkJCQkJCQkJCQkJKSwKCQkJCSdJTUFSR1VNRU5UJwkJCT0+IGFycmF5KCdjYXRlZ29yeScJCQk9PglQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbjo6Q0FURUdPUllfRU5HSU5FRVJJTkcsCgkJCQkJCQkJCQkJCSAnZnVuY3Rpb25DYWxsJwkJPT4JJ1BIUEV4Y2VsX0NhbGN1bGF0aW9uX0VuZ2luZWVyaW5nOjpJTUFSR1VNRU5UJywKCQkJCQkJCQkJCQkJICdhcmd1bWVudENvdW50Jwk9PgknMScKCQkJCQkJCQkJCQkJKSwKCQkJCSdJTUNPTkpVR0FURScJCQk9PiBhcnJheSgnY2F0ZWdvcnknCQkJPT4JUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb246OkNBVEVHT1JZX0VOR0lORUVSSU5HLAoJCQkJCQkJCQkJCQkgJ2Z1bmN0aW9uQ2FsbCcJCT0+CSdQSFBFeGNlbF9DYWxjdWxhdGlvbl9FbmdpbmVlcmluZzo6SU1DT05KVUdBVEUnLAoJCQkJCQkJCQkJCQkgJ2FyZ3VtZW50Q291bnQnCT0+CScxJwoJCQkJCQkJCQkJCQkpLAoJCQkJJ0lNQ09TJwkJCQkJPT4gYXJyYXkoJ2NhdGVnb3J5JwkJCT0+CVBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uOjpDQVRFR09SWV9FTkdJTkVFUklORywKCQkJCQkJCQkJCQkJICdmdW5jdGlvbkNhbGwnCQk9PgknUEhQRXhjZWxfQ2FsY3VsYXRpb25fRW5naW5lZXJpbmc6OklNQ09TJywKCQkJCQkJCQkJCQkJICdhcmd1bWVudENvdW50Jwk9PgknMScKCQkJCQkJCQkJCQkJKSwKCQkJCSdJTURJVicJCQkJCT0+IGFycmF5KCdjYXRlZ29yeScJCQk9PglQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbjo6Q0FURUdPUllfRU5HSU5FRVJJTkcsCgkJCQkJCQkJCQkJCSAnZnVuY3Rpb25DYWxsJwkJPT4JJ1BIUEV4Y2VsX0NhbGN1bGF0aW9uX0VuZ2luZWVyaW5nOjpJTURJVicsCgkJCQkJCQkJCQkJCSAnYXJndW1lbnRDb3VudCcJPT4JJzInCgkJCQkJCQkJCQkJCSksCgkJCQknSU1FWFAnCQkJCQk9PiBhcnJheSgnY2F0ZWdvcnknCQkJPT4JUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb246OkNBVEVHT1JZX0VOR0lORUVSSU5HLAoJCQkJCQkJCQkJCQkgJ2Z1bmN0aW9uQ2FsbCcJCT0+CSdQSFBFeGNlbF9DYWxjdWxhdGlvbl9FbmdpbmVlcmluZzo6SU1FWFAnLAoJCQkJCQkJCQkJCQkgJ2FyZ3VtZW50Q291bnQnCT0+CScxJwoJCQkJCQkJCQkJCQkpLAoJCQkJJ0lNTE4nCQkJCQk9PiBhcnJheSgnY2F0ZWdvcnknCQkJPT4JUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb246OkNBVEVHT1JZX0VOR0lORUVSSU5HLAoJCQkJCQkJCQkJCQkgJ2Z1bmN0aW9uQ2FsbCcJCT0+CSdQSFBFeGNlbF9DYWxjdWxhdGlvbl9FbmdpbmVlcmluZzo6SU1MTicsCgkJCQkJCQkJCQkJCSAnYXJndW1lbnRDb3VudCcJPT4JJzEnCgkJCQkJCQkJCQkJCSksCgkJCQknSU1MT0cxMCcJCQkJPT4gYXJyYXkoJ2NhdGVnb3J5JwkJCT0+CVBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uOjpDQVRFR09SWV9FTkdJTkVFUklORywKCQkJCQkJCQkJCQkJICdmdW5jdGlvbkNhbGwnCQk9PgknUEhQRXhjZWxfQ2FsY3VsYXRpb25fRW5naW5lZXJpbmc6OklNTE9HMTAnLAoJCQkJCQkJCQkJCQkgJ2FyZ3VtZW50Q291bnQnCT0+CScxJwoJCQkJCQkJCQkJCQkpLAoJCQkJJ0lNTE9HMicJCQkJPT4gYXJyYXkoJ2NhdGVnb3J5JwkJCT0+CVBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uOjpDQVRFR09SWV9FTkdJTkVFUklORywKCQkJCQkJCQkJCQkJICdmdW5jdGlvbkNhbGwnCQk9PgknUEhQRXhjZWxfQ2FsY3VsYXRpb25fRW5naW5lZXJpbmc6OklNTE9HMicsCgkJCQkJCQkJCQkJCSAnYXJndW1lbnRDb3VudCcJPT4JJzEnCgkJCQkJCQkJCQkJCSksCgkJCQknSU1QT1dFUicJCQkJPT4gYXJyYXkoJ2NhdGVnb3J5JwkJCT0+CVBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uOjpDQVRFR09SWV9FTkdJTkVFUklORywKCQkJCQkJCQkJCQkJICdmdW5jdGlvbkNhbGwnCQk9PgknUEhQRXhjZWxfQ2FsY3VsYXRpb25fRW5naW5lZXJpbmc6OklNUE9XRVInLAoJCQkJCQkJCQkJCQkgJ2FyZ3VtZW50Q291bnQnCT0+CScyJwoJCQkJCQkJCQkJCQkpLAoJCQkJJ0lNUFJPRFVDVCcJCQkJPT4gYXJyYXkoJ2NhdGVnb3J5JwkJCT0+CVBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uOjpDQVRFR09SWV9FTkdJTkVFUklORywKCQkJCQkJCQkJCQkJICdmdW5jdGlvbkNhbGwnCQk9PgknUEhQRXhjZWxfQ2FsY3VsYXRpb25fRW5naW5lZXJpbmc6OklNUFJPRFVDVCcsCgkJCQkJCQkJCQkJCSAnYXJndW1lbnRDb3VudCcJPT4JJzErJwoJCQkJCQkJCQkJCQkpLAoJCQkJJ0lNUkVBTCcJCQkJPT4gYXJyYXkoJ2NhdGVnb3J5JwkJCT0+CVBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uOjpDQVRFR09SWV9FTkdJTkVFUklORywKCQkJCQkJCQkJCQkJICdmdW5jdGlvbkNhbGwnCQk9PgknUEhQRXhjZWxfQ2FsY3VsYXRpb25fRW5naW5lZXJpbmc6OklNUkVBTCcsCgkJCQkJCQkJCQkJCSAnYXJndW1lbnRDb3VudCcJPT4JJzEnCgkJCQkJCQkJCQkJCSksCgkJCQknSU1TSU4nCQkJCQk9PiBhcnJheSgnY2F0ZWdvcnknCQkJPT4JUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb246OkNBVEVHT1JZX0VOR0lORUVSSU5HLAoJCQkJCQkJCQkJCQkgJ2Z1bmN0aW9uQ2FsbCcJCT0+CSdQSFBFeGNlbF9DYWxjdWxhdGlvbl9FbmdpbmVlcmluZzo6SU1TSU4nLAoJCQkJCQkJCQkJCQkgJ2FyZ3VtZW50Q291bnQnCT0+CScxJwoJCQkJCQkJCQkJCQkpLAoJCQkJJ0lNU1FSVCcJCQkJPT4gYXJyYXkoJ2NhdGVnb3J5JwkJCT0+CVBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uOjpDQVRFR09SWV9FTkdJTkVFUklORywKCQkJCQkJCQkJCQkJICdmdW5jdGlvbkNhbGwnCQk9PgknUEhQRXhjZWxfQ2FsY3VsYXRpb25fRW5naW5lZXJpbmc6OklNU1FSVCcsCgkJCQkJCQkJCQkJCSAnYXJndW1lbnRDb3VudCcJPT4JJzEnCgkJCQkJCQkJCQkJCSksCgkJCQknSU1TVUInCQkJCQk9PiBhcnJheSgnY2F0ZWdvcnknCQkJPT4JUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb246OkNBVEVHT1JZX0VOR0lORUVSSU5HLAoJCQkJCQkJCQkJCQkgJ2Z1bmN0aW9uQ2FsbCcJCT0+CSdQSFBFeGNlbF9DYWxjdWxhdGlvbl9FbmdpbmVlcmluZzo6SU1TVUInLAoJCQkJCQkJCQkJCQkgJ2FyZ3VtZW50Q291bnQnCT0+CScyJwoJCQkJCQkJCQkJCQkpLAoJCQkJJ0lNU1VNJwkJCQkJPT4gYXJyYXkoJ2NhdGVnb3J5JwkJCT0+CVBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uOjpDQVRFR09SWV9FTkdJTkVFUklORywKCQkJCQkJCQkJCQkJICdmdW5jdGlvbkNhbGwnCQk9PgknUEhQRXhjZWxfQ2FsY3VsYXRpb25fRW5naW5lZXJpbmc6OklNU1VNJywKCQkJCQkJCQkJCQkJICdhcmd1bWVudENvdW50Jwk9PgknMSsnCgkJCQkJCQkJCQkJCSksCgkJCQknSU5ERVgnCQkJCQk9PiBhcnJheSgnY2F0ZWdvcnknCQkJPT4JUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb246OkNBVEVHT1JZX0xPT0tVUF9BTkRfUkVGRVJFTkNFLAoJCQkJCQkJCQkJCQkgJ2Z1bmN0aW9uQ2FsbCcJCT0+CSdQSFBFeGNlbF9DYWxjdWxhdGlvbl9Mb29rdXBSZWY6OklOREVYJywKCQkJCQkJCQkJCQkJICdhcmd1bWVudENvdW50Jwk9PgknMS00JwoJCQkJCQkJCQkJCQkpLAoJCQkJJ0lORElSRUNUJwkJCQk9PiBhcnJheSgnY2F0ZWdvcnknCQkJPT4JUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb246OkNBVEVHT1JZX0xPT0tVUF9BTkRfUkVGRVJFTkNFLAoJCQkJCQkJCQkJCQkgJ2Z1bmN0aW9uQ2FsbCcJCT0+CSdQSFBFeGNlbF9DYWxjdWxhdGlvbl9Mb29rdXBSZWY6OklORElSRUNUJywKCQkJCQkJCQkJCQkJICdhcmd1bWVudENvdW50Jwk9PgknMSwyJywKCQkJCQkJCQkJCQkJICdwYXNzQ2VsbFJlZmVyZW5jZSc9Pgl0cnVlCgkJCQkJCQkJCQkJCSksCgkJCQknSU5GTycJCQkJCT0+IGFycmF5KCdjYXRlZ29yeScJCQk9PglQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbjo6Q0FURUdPUllfSU5GT1JNQVRJT04sCgkJCQkJCQkJCQkJCSAnZnVuY3Rpb25DYWxsJwkJPT4JJ1BIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6RFVNTVknLAoJCQkJCQkJCQkJCQkgJ2FyZ3VtZW50Q291bnQnCT0+CScxJwoJCQkJCQkJCQkJCQkpLAoJCQkJJ0lOVCcJCQkJCT0+IGFycmF5KCdjYXRlZ29yeScJCQk9PglQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbjo6Q0FURUdPUllfTUFUSF9BTkRfVFJJRywKCQkJCQkJCQkJCQkJICdmdW5jdGlvbkNhbGwnCQk9PgknUEhQRXhjZWxfQ2FsY3VsYXRpb25fTWF0aFRyaWc6OklOVCcsCgkJCQkJCQkJCQkJCSAnYXJndW1lbnRDb3VudCcJPT4JJzEnCgkJCQkJCQkJCQkJCSksCgkJCQknSU5URVJDRVBUJwkJCQk9PiBhcnJheSgnY2F0ZWdvcnknCQkJPT4JUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb246OkNBVEVHT1JZX1NUQVRJU1RJQ0FMLAoJCQkJCQkJCQkJCQkgJ2Z1bmN0aW9uQ2FsbCcJCT0+CSdQSFBFeGNlbF9DYWxjdWxhdGlvbl9TdGF0aXN0aWNhbDo6SU5URVJDRVBUJywKCQkJCQkJCQkJCQkJICdhcmd1bWVudENvdW50Jwk9PgknMicKCQkJCQkJCQkJCQkJKSwKCQkJCSdJTlRSQVRFJwkJCQk9PiBhcnJheSgnY2F0ZWdvcnknCQkJPT4JUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb246OkNBVEVHT1JZX0ZJTkFOQ0lBTCwKCQkJCQkJCQkJCQkJICdmdW5jdGlvbkNhbGwnCQk9PgknUEhQRXhjZWxfQ2FsY3VsYXRpb25fRmluYW5jaWFsOjpJTlRSQVRFJywKCQkJCQkJCQkJCQkJICdhcmd1bWVudENvdW50Jwk9PgknNCw1JwoJCQkJCQkJCQkJCQkpLAoJCQkJJ0lQTVQnCQkJCQk9PiBhcnJheSgnY2F0ZWdvcnknCQkJPT4JUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb246OkNBVEVHT1JZX0ZJTkFOQ0lBTCwKCQkJCQkJCQkJCQkJICdmdW5jdGlvbkNhbGwnCQk9PgknUEhQRXhjZWxfQ2FsY3VsYXRpb25fRmluYW5jaWFsOjpJUE1UJywKCQkJCQkJCQkJCQkJICdhcmd1bWVudENvdW50Jwk9PgknNC02JwoJCQkJCQkJCQkJCQkpLAoJCQkJJ0lSUicJCQkJCT0+IGFycmF5KCdjYXRlZ29yeScJCQk9PglQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbjo6Q0FURUdPUllfRklOQU5DSUFMLAoJCQkJCQkJCQkJCQkgJ2Z1bmN0aW9uQ2FsbCcJCT0+CSdQSFBFeGNlbF9DYWxjdWxhdGlvbl9GaW5hbmNpYWw6OklSUicsCgkJCQkJCQkJCQkJCSAnYXJndW1lbnRDb3VudCcJPT4JJzEsMicKCQkJCQkJCQkJCQkJKSwKCQkJCSdJU0JMQU5LJwkJCQk9PiBhcnJheSgnY2F0ZWdvcnknCQkJPT4JUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb246OkNBVEVHT1JZX0lORk9STUFUSU9OLAoJCQkJCQkJCQkJCQkgJ2Z1bmN0aW9uQ2FsbCcJCT0+CSdQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OklTX0JMQU5LJywKCQkJCQkJCQkJCQkJICdhcmd1bWVudENvdW50Jwk9PgknMScKCQkJCQkJCQkJCQkJKSwKCQkJCSdJU0VSUicJCQkJCT0+IGFycmF5KCdjYXRlZ29yeScJCQk9PglQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbjo6Q0FURUdPUllfSU5GT1JNQVRJT04sCgkJCQkJCQkJCQkJCSAnZnVuY3Rpb25DYWxsJwkJPT4JJ1BIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6SVNfRVJSJywKCQkJCQkJCQkJCQkJICdhcmd1bWVudENvdW50Jwk9PgknMScKCQkJCQkJCQkJCQkJKSwKCQkJCSdJU0VSUk9SJwkJCQk9PiBhcnJheSgnY2F0ZWdvcnknCQkJPT4JUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb246OkNBVEVHT1JZX0lORk9STUFUSU9OLAoJCQkJCQkJCQkJCQkgJ2Z1bmN0aW9uQ2FsbCcJCT0+CSdQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OklTX0VSUk9SJywKCQkJCQkJCQkJCQkJICdhcmd1bWVudENvdW50Jwk9PgknMScKCQkJCQkJCQkJCQkJKSwKCQkJCSdJU0VWRU4nCQkJCT0+IGFycmF5KCdjYXRlZ29yeScJCQk9PglQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbjo6Q0FURUdPUllfSU5GT1JNQVRJT04sCgkJCQkJCQkJCQkJCSAnZnVuY3Rpb25DYWxsJwkJPT4JJ1BIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6SVNfRVZFTicsCgkJCQkJCQkJCQkJCSAnYXJndW1lbnRDb3VudCcJPT4JJzEnCgkJCQkJCQkJCQkJCSksCgkJCQknSVNMT0dJQ0FMJwkJCQk9PiBhcnJheSgnY2F0ZWdvcnknCQkJPT4JUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb246OkNBVEVHT1JZX0lORk9STUFUSU9OLAoJCQkJCQkJCQkJCQkgJ2Z1bmN0aW9uQ2FsbCcJCT0+CSdQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OklTX0xPR0lDQUwnLAoJCQkJCQkJCQkJCQkgJ2FyZ3VtZW50Q291bnQnCT0+CScxJwoJCQkJCQkJCQkJCQkpLAoJCQkJJ0lTTkEnCQkJCQk9PiBhcnJheSgnY2F0ZWdvcnknCQkJPT4JUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb246OkNBVEVHT1JZX0lORk9STUFUSU9OLAoJCQkJCQkJCQkJCQkgJ2Z1bmN0aW9uQ2FsbCcJCT0+CSdQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OklTX05BJywKCQkJCQkJCQkJCQkJICdhcmd1bWVudENvdW50Jwk9PgknMScKCQkJCQkJCQkJCQkJKSwKCQkJCSdJU05PTlRFWFQnCQkJCT0+IGFycmF5KCdjYXRlZ29yeScJCQk9PglQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbjo6Q0FURUdPUllfSU5GT1JNQVRJT04sCgkJCQkJCQkJCQkJCSAnZnVuY3Rpb25DYWxsJwkJPT4JJ1BIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6SVNfTk9OVEVYVCcsCgkJCQkJCQkJCQkJCSAnYXJndW1lbnRDb3VudCcJPT4JJzEnCgkJCQkJCQkJCQkJCSksCgkJCQknSVNOVU1CRVInCQkJCT0+IGFycmF5KCdjYXRlZ29yeScJCQk9PglQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbjo6Q0FURUdPUllfSU5GT1JNQVRJT04sCgkJCQkJCQkJCQkJCSAnZnVuY3Rpb25DYWxsJwkJPT4JJ1BIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6SVNfTlVNQkVSJywKCQkJCQkJCQkJCQkJICdhcmd1bWVudENvdW50Jwk9PgknMScKCQkJCQkJCQkJCQkJKSwKCQkJCSdJU09ERCcJCQkJCT0+IGFycmF5KCdjYXRlZ29yeScJCQk9PglQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbjo6Q0FURUdPUllfSU5GT1JNQVRJT04sCgkJCQkJCQkJCQkJCSAnZnVuY3Rpb25DYWxsJwkJPT4JJ1BIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6SVNfT0REJywKCQkJCQkJCQkJCQkJICdhcmd1bWVudENvdW50Jwk9PgknMScKCQkJCQkJCQkJCQkJKSwKCQkJCSdJU1BNVCcJCQkJCT0+IGFycmF5KCdjYXRlZ29yeScJCQk9PglQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbjo6Q0FURUdPUllfRklOQU5DSUFMLAoJCQkJCQkJCQkJCQkgJ2Z1bmN0aW9uQ2FsbCcJCT0+CSdQSFBFeGNlbF9DYWxjdWxhdGlvbl9GaW5hbmNpYWw6OklTUE1UJywKCQkJCQkJCQkJCQkJICdhcmd1bWVudENvdW50Jwk9PgknNCcKCQkJCQkJCQkJCQkJKSwKCQkJCSdJU1JFRicJCQkJCT0+IGFycmF5KCdjYXRlZ29yeScJCQk9PglQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbjo6Q0FURUdPUllfSU5GT1JNQVRJT04sCgkJCQkJCQkJCQkJCSAnZnVuY3Rpb25DYWxsJwkJPT4JJ1BIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6RFVNTVknLAoJCQkJCQkJCQkJCQkgJ2FyZ3VtZW50Q291bnQnCT0+CScxJwoJCQkJCQkJCQkJCQkpLAoJCQkJJ0lTVEVYVCcJCQkJPT4gYXJyYXkoJ2NhdGVnb3J5JwkJCT0+CVBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uOjpDQVRFR09SWV9JTkZPUk1BVElPTiwKCQkJCQkJCQkJCQkJICdmdW5jdGlvbkNhbGwnCQk9PgknUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpJU19URVhUJywKCQkJCQkJCQkJCQkJICdhcmd1bWVudENvdW50Jwk9PgknMScKCQkJCQkJCQkJCQkJKSwKCQkJCSdKSVMnCQkJCQk9PiBhcnJheSgnY2F0ZWdvcnknCQkJPT4JUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb246OkNBVEVHT1JZX1RFWFRfQU5EX0RBVEEsCgkJCQkJCQkJCQkJCSAnZnVuY3Rpb25DYWxsJwkJPT4JJ1BIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6RFVNTVknLAoJCQkJCQkJCQkJCQkgJ2FyZ3VtZW50Q291bnQnCT0+CScxJwoJCQkJCQkJCQkJCQkpLAoJCQkJJ0tVUlQnCQkJCQk9PiBhcnJheSgnY2F0ZWdvcnknCQkJPT4JUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb246OkNBVEVHT1JZX1NUQVRJU1RJQ0FMLAoJCQkJCQkJCQkJCQkgJ2Z1bmN0aW9uQ2FsbCcJCT0+CSdQSFBFeGNlbF9DYWxjdWxhdGlvbl9TdGF0aXN0aWNhbDo6S1VSVCcsCgkJCQkJCQkJCQkJCSAnYXJndW1lbnRDb3VudCcJPT4JJzErJwoJCQkJCQkJCQkJCQkpLAoJCQkJJ0xBUkdFJwkJCQkJPT4gYXJyYXkoJ2NhdGVnb3J5JwkJCT0+CVBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uOjpDQVRFR09SWV9TVEFUSVNUSUNBTCwKCQkJCQkJCQkJCQkJICdmdW5jdGlvbkNhbGwnCQk9PgknUEhQRXhjZWxfQ2FsY3VsYXRpb25fU3RhdGlzdGljYWw6OkxBUkdFJywKCQkJCQkJCQkJCQkJICdhcmd1bWVudENvdW50Jwk9PgknMicKCQkJCQkJCQkJCQkJKSwKCQkJCSdMQ00nCQkJCQk9PiBhcnJheSgnY2F0ZWdvcnknCQkJPT4JUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb246OkNBVEVHT1JZX01BVEhfQU5EX1RSSUcsCgkJCQkJCQkJCQkJCSAnZnVuY3Rpb25DYWxsJwkJPT4JJ1BIUEV4Y2VsX0NhbGN1bGF0aW9uX01hdGhUcmlnOjpMQ00nLAoJCQkJCQkJCQkJCQkgJ2FyZ3VtZW50Q291bnQnCT0+CScxKycKCQkJCQkJCQkJCQkJKSwKCQkJCSdMRUZUJwkJCQkJPT4gYXJyYXkoJ2NhdGVnb3J5JwkJCT0+CVBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uOjpDQVRFR09SWV9URVhUX0FORF9EQVRBLAoJCQkJCQkJCQkJCQkgJ2Z1bmN0aW9uQ2FsbCcJCT0+CSdQSFBFeGNlbF9DYWxjdWxhdGlvbl9UZXh0RGF0YTo6TEVGVCcsCgkJCQkJCQkJCQkJCSAnYXJndW1lbnRDb3VudCcJPT4JJzEsMicKCQkJCQkJCQkJCQkJKSwKCQkJCSdMRUZUQicJCQkJCT0+IGFycmF5KCdjYXRlZ29yeScJCQk9PglQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbjo6Q0FURUdPUllfVEVYVF9BTkRfREFUQSwKCQkJCQkJCQkJCQkJICdmdW5jdGlvbkNhbGwnCQk9PgknUEhQRXhjZWxfQ2FsY3VsYXRpb25fVGV4dERhdGE6OkxFRlQnLAoJCQkJCQkJCQkJCQkgJ2FyZ3VtZW50Q291bnQnCT0+CScxLDInCgkJCQkJCQkJCQkJCSksCgkJCQknTEVOJwkJCQkJPT4gYXJyYXkoJ2NhdGVnb3J5JwkJCT0+CVBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uOjpDQVRFR09SWV9URVhUX0FORF9EQVRBLAoJCQkJCQkJCQkJCQkgJ2Z1bmN0aW9uQ2FsbCcJCT0+CSdQSFBFeGNlbF9DYWxjdWxhdGlvbl9UZXh0RGF0YTo6U1RSSU5HTEVOR1RIJywKCQkJCQkJCQkJCQkJICdhcmd1bWVudENvdW50Jwk9PgknMScKCQkJCQkJCQkJCQkJKSwKCQkJCSdMRU5CJwkJCQkJPT4gYXJyYXkoJ2NhdGVnb3J5JwkJCT0+CVBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uOjpDQVRFR09SWV9URVhUX0FORF9EQVRBLAoJCQkJCQkJCQkJCQkgJ2Z1bmN0aW9uQ2FsbCcJCT0+CSdQSFBFeGNlbF9DYWxjdWxhdGlvbl9UZXh0RGF0YTo6U1RSSU5HTEVOR1RIJywKCQkJCQkJCQkJCQkJICdhcmd1bWVudENvdW50Jwk9PgknMScKCQkJCQkJCQkJCQkJKSwKCQkJCSdMSU5FU1QnCQkJCT0+IGFycmF5KCdjYXRlZ29yeScJCQk9PglQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbjo6Q0FURUdPUllfU1RBVElTVElDQUwsCgkJCQkJCQkJCQkJCSAnZnVuY3Rpb25DYWxsJwkJPT4JJ1BIUEV4Y2VsX0NhbGN1bGF0aW9uX1N0YXRpc3RpY2FsOjpMSU5FU1QnLAoJCQkJCQkJCQkJCQkgJ2FyZ3VtZW50Q291bnQnCT0+CScxLTQnCgkJCQkJCQkJCQkJCSksCgkJCQknTE4nCQkJCQk9PiBhcnJheSgnY2F0ZWdvcnknCQkJPT4JUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb246OkNBVEVHT1JZX01BVEhfQU5EX1RSSUcsCgkJCQkJCQkJCQkJCSAnZnVuY3Rpb25DYWxsJwkJPT4JJ2xvZycsCgkJCQkJCQkJCQkJCSAnYXJndW1lbnRDb3VudCcJPT4JJzEnCgkJCQkJCQkJCQkJCSksCgkJCQknTE9HJwkJCQkJPT4gYXJyYXkoJ2NhdGVnb3J5JwkJCT0+CVBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uOjpDQVRFR09SWV9NQVRIX0FORF9UUklHLAoJCQkJCQkJCQkJCQkgJ2Z1bmN0aW9uQ2FsbCcJCT0+CSdQSFBFeGNlbF9DYWxjdWxhdGlvbl9NYXRoVHJpZzo6TE9HX0JBU0UnLAoJCQkJCQkJCQkJCQkgJ2FyZ3VtZW50Q291bnQnCT0+CScxLDInCgkJCQkJCQkJCQkJCSksCgkJCQknTE9HMTAnCQkJCQk9PiBhcnJheSgnY2F0ZWdvcnknCQkJPT4JUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb246OkNBVEVHT1JZX01BVEhfQU5EX1RSSUcsCgkJCQkJCQkJCQkJCSAnZnVuY3Rpb25DYWxsJwkJPT4JJ2xvZzEwJywKCQkJCQkJCQkJCQkJICdhcmd1bWVudENvdW50Jwk9PgknMScKCQkJCQkJCQkJCQkJKSwKCQkJCSdMT0dFU1QnCQkJCT0+IGFycmF5KCdjYXRlZ29yeScJCQk9PglQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbjo6Q0FURUdPUllfU1RBVElTVElDQUwsCgkJCQkJCQkJCQkJCSAnZnVuY3Rpb25DYWxsJwkJPT4JJ1BIUEV4Y2VsX0NhbGN1bGF0aW9uX1N0YXRpc3RpY2FsOjpMT0dFU1QnLAoJCQkJCQkJCQkJCQkgJ2FyZ3VtZW50Q291bnQnCT0+CScxLTQnCgkJCQkJCQkJCQkJCSksCgkJCQknTE9HSU5WJwkJCQk9PiBhcnJheSgnY2F0ZWdvcnknCQkJPT4JUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb246OkNBVEVHT1JZX1NUQVRJU1RJQ0FMLAoJCQkJCQkJCQkJCQkgJ2Z1bmN0aW9uQ2FsbCcJCT0+CSdQSFBFeGNlbF9DYWxjdWxhdGlvbl9TdGF0aXN0aWNhbDo6TE9HSU5WJywKCQkJCQkJCQkJCQkJICdhcmd1bWVudENvdW50Jwk9PgknMycKCQkJCQkJCQkJCQkJKSwKCQkJCSdMT0dOT1JNRElTVCcJCQk9PiBhcnJheSgnY2F0ZWdvcnknCQkJPT4JUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb246OkNBVEVHT1JZX1NUQVRJU1RJQ0FMLAoJCQkJCQkJCQkJCQkgJ2Z1bmN0aW9uQ2FsbCcJCT0+CSdQSFBFeGNlbF9DYWxjdWxhdGlvbl9TdGF0aXN0aWNhbDo6TE9HTk9STURJU1QnLAoJCQkJCQkJCQkJCQkgJ2FyZ3VtZW50Q291bnQnCT0+CSczJwoJCQkJCQkJCQkJCQkpLAoJCQkJJ0xPT0tVUCcJCQkJPT4gYXJyYXkoJ2NhdGVnb3J5JwkJCT0+CVBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uOjpDQVRFR09SWV9MT09LVVBfQU5EX1JFRkVSRU5DRSwKCQkJCQkJCQkJCQkJICdmdW5jdGlvbkNhbGwnCQk9PgknUEhQRXhjZWxfQ2FsY3VsYXRpb25fTG9va3VwUmVmOjpMT09LVVAnLAoJCQkJCQkJCQkJCQkgJ2FyZ3VtZW50Q291bnQnCT0+CScyLDMnCgkJCQkJCQkJCQkJCSksCgkJCQknTE9XRVInCQkJCQk9PiBhcnJheSgnY2F0ZWdvcnknCQkJPT4JUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb246OkNBVEVHT1JZX1RFWFRfQU5EX0RBVEEsCgkJCQkJCQkJCQkJCSAnZnVuY3Rpb25DYWxsJwkJPT4JJ1BIUEV4Y2VsX0NhbGN1bGF0aW9uX1RleHREYXRhOjpMT1dFUkNBU0UnLAoJCQkJCQkJCQkJCQkgJ2FyZ3VtZW50Q291bnQnCT0+CScxJwoJCQkJCQkJCQkJCQkpLAoJCQkJJ01BVENIJwkJCQkJPT4gYXJyYXkoJ2NhdGVnb3J5JwkJCT0+CVBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uOjpDQVRFR09SWV9MT09LVVBfQU5EX1JFRkVSRU5DRSwKCQkJCQkJCQkJCQkJICdmdW5jdGlvbkNhbGwnCQk9PgknUEhQRXhjZWxfQ2FsY3VsYXRpb25fTG9va3VwUmVmOjpNQVRDSCcsCgkJCQkJCQkJCQkJCSAnYXJndW1lbnRDb3VudCcJPT4JJzIsMycKCQkJCQkJCQkJCQkJKSwKCQkJCSdNQVgnCQkJCQk9PiBhcnJheSgnY2F0ZWdvcnknCQkJPT4JUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb246OkNBVEVHT1JZX1NUQVRJU1RJQ0FMLAoJCQkJCQkJCQkJCQkgJ2Z1bmN0aW9uQ2FsbCcJCT0+CSdQSFBFeGNlbF9DYWxjdWxhdGlvbl9TdGF0aXN0aWNhbDo6TUFYJywKCQkJCQkJCQkJCQkJICdhcmd1bWVudENvdW50Jwk9PgknMSsnCgkJCQkJCQkJCQkJCSksCgkJCQknTUFYQScJCQkJCT0+IGFycmF5KCdjYXRlZ29yeScJCQk9PglQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbjo6Q0FURUdPUllfU1RBVElTVElDQUwsCgkJCQkJCQkJCQkJCSAnZnVuY3Rpb25DYWxsJwkJPT4JJ1BIUEV4Y2VsX0NhbGN1bGF0aW9uX1N0YXRpc3RpY2FsOjpNQVhBJywKCQkJCQkJCQkJCQkJICdhcmd1bWVudENvdW50Jwk9PgknMSsnCgkJCQkJCQkJCQkJCSksCgkJCQknTUFYSUYnCQkJCQk9PiBhcnJheSgnY2F0ZWdvcnknCQkJPT4JUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb246OkNBVEVHT1JZX1NUQVRJU1RJQ0FMLAoJCQkJCQkJCQkJCQkgJ2Z1bmN0aW9uQ2FsbCcJCT0+CSdQSFBFeGNlbF9DYWxjdWxhdGlvbl9TdGF0aXN0aWNhbDo6TUFYSUYnLAoJCQkJCQkJCQkJCQkgJ2FyZ3VtZW50Q291bnQnCT0+CScyKycKCQkJCQkJCQkJCQkJKSwKCQkJCSdNREVURVJNJwkJCQk9PiBhcnJheSgnY2F0ZWdvcnknCQkJPT4JUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb246OkNBVEVHT1JZX01BVEhfQU5EX1RSSUcsCgkJCQkJCQkJCQkJCSAnZnVuY3Rpb25DYWxsJwkJPT4JJ1BIUEV4Y2VsX0NhbGN1bGF0aW9uX01hdGhUcmlnOjpNREVURVJNJywKCQkJCQkJCQkJCQkJICdhcmd1bWVudENvdW50Jwk9PgknMScKCQkJCQkJCQkJCQkJKSwKCQkJCSdNRFVSQVRJT04nCQkJCT0+IGFycmF5KCdjYXRlZ29yeScJCQk9PglQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbjo6Q0FURUdPUllfRklOQU5DSUFMLAoJCQkJCQkJCQkJCQkgJ2Z1bmN0aW9uQ2FsbCcJCT0+CSdQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OkRVTU1ZJywKCQkJCQkJCQkJCQkJICdhcmd1bWVudENvdW50Jwk9PgknNSw2JwoJCQkJCQkJCQkJCQkpLAoJCQkJJ01FRElBTicJCQkJPT4gYXJyYXkoJ2NhdGVnb3J5JwkJCT0+CVBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uOjpDQVRFR09SWV9TVEFUSVNUSUNBTCwKCQkJCQkJCQkJCQkJICdmdW5jdGlvbkNhbGwnCQk9PgknUEhQRXhjZWxfQ2FsY3VsYXRpb25fU3RhdGlzdGljYWw6Ok1FRElBTicsCgkJCQkJCQkJCQkJCSAnYXJndW1lbnRDb3VudCcJPT4JJzErJwoJCQkJCQkJCQkJCQkpLAoJCQkJJ01FRElBTklGJwkJCQk9PiBhcnJheSgnY2F0ZWdvcnknCQkJPT4JUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb246OkNBVEVHT1JZX1NUQVRJU1RJQ0FMLAoJCQkJCQkJCQkJCQkgJ2Z1bmN0aW9uQ2FsbCcJCT0+CSdQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OkRVTU1ZJywKCQkJCQkJCQkJCQkJICdhcmd1bWVudENvdW50Jwk9PgknMisnCgkJCQkJCQkJCQkJCSksCgkJCQknTUlEJwkJCQkJPT4gYXJyYXkoJ2NhdGVnb3J5JwkJCT0+CVBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uOjpDQVRFR09SWV9URVhUX0FORF9EQVRBLAoJCQkJCQkJCQkJCQkgJ2Z1bmN0aW9uQ2FsbCcJCT0+CSdQSFBFeGNlbF9DYWxjdWxhdGlvbl9UZXh0RGF0YTo6TUlEJywKCQkJCQkJCQkJCQkJICdhcmd1bWVudENvdW50Jwk9PgknMycKCQkJCQkJCQkJCQkJKSwKCQkJCSdNSURCJwkJCQkJPT4gYXJyYXkoJ2NhdGVnb3J5JwkJCT0+CVBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uOjpDQVRFR09SWV9URVhUX0FORF9EQVRBLAoJCQkJCQkJCQkJCQkgJ2Z1bmN0aW9uQ2FsbCcJCT0+CSdQSFBFeGNlbF9DYWxjdWxhdGlvbl9UZXh0RGF0YTo6TUlEJywKCQkJCQkJCQkJCQkJICdhcmd1bWVudENvdW50Jwk9PgknMycKCQkJCQkJCQkJCQkJKSwKCQkJCSdNSU4nCQkJCQk9PiBhcnJheSgnY2F0ZWdvcnknCQkJPT4JUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb246OkNBVEVHT1JZX1NUQVRJU1RJQ0FMLAoJCQkJCQkJCQkJCQkgJ2Z1bmN0aW9uQ2FsbCcJCT0+CSdQSFBFeGNlbF9DYWxjdWxhdGlvbl9TdGF0aXN0aWNhbDo6TUlOJywKCQkJCQkJCQkJCQkJICdhcmd1bWVudENvdW50Jwk9PgknMSsnCgkJCQkJCQkJCQkJCSksCgkJCQknTUlOQScJCQkJCT0+IGFycmF5KCdjYXRlZ29yeScJCQk9PglQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbjo6Q0FURUdPUllfU1RBVElTVElDQUwsCgkJCQkJCQkJCQkJCSAnZnVuY3Rpb25DYWxsJwkJPT4JJ1BIUEV4Y2VsX0NhbGN1bGF0aW9uX1N0YXRpc3RpY2FsOjpNSU5BJywKCQkJCQkJCQkJCQkJICdhcmd1bWVudENvdW50Jwk9PgknMSsnCgkJCQkJCQkJCQkJCSksCgkJCQknTUlOSUYnCQkJCQk9PiBhcnJheSgnY2F0ZWdvcnknCQkJPT4JUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb246OkNBVEVHT1JZX1NUQVRJU1RJQ0FMLAoJCQkJCQkJCQkJCQkgJ2Z1bmN0aW9uQ2FsbCcJCT0+CSdQSFBFeGNlbF9DYWxjdWxhdGlvbl9TdGF0aXN0aWNhbDo6TUlOSUYnLAoJCQkJCQkJCQkJCQkgJ2FyZ3VtZW50Q291bnQnCT0+CScyKycKCQkJCQkJCQkJCQkJKSwKCQkJCSdNSU5VVEUnCQkJCT0+IGFycmF5KCdjYXRlZ29yeScJCQk9PglQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbjo6Q0FURUdPUllfREFURV9BTkRfVElNRSwKCQkJCQkJCQkJCQkJICdmdW5jdGlvbkNhbGwnCQk9PgknUEhQRXhjZWxfQ2FsY3VsYXRpb25fRGF0ZVRpbWU6Ok1JTlVURU9GSE9VUicsCgkJCQkJCQkJCQkJCSAnYXJndW1lbnRDb3VudCcJPT4JJzEnCgkJCQkJCQkJCQkJCSksCgkJCQknTUlOVkVSU0UnCQkJCT0+IGFycmF5KCdjYXRlZ29yeScJCQk9PglQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbjo6Q0FURUdPUllfTUFUSF9BTkRfVFJJRywKCQkJCQkJCQkJCQkJICdmdW5jdGlvbkNhbGwnCQk9PgknUEhQRXhjZWxfQ2FsY3VsYXRpb25fTWF0aFRyaWc6Ok1JTlZFUlNFJywKCQkJCQkJCQkJCQkJICdhcmd1bWVudENvdW50Jwk9PgknMScKCQkJCQkJCQkJCQkJKSwKCQkJCSdNSVJSJwkJCQkJPT4gYXJyYXkoJ2NhdGVnb3J5JwkJCT0+CVBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uOjpDQVRFR09SWV9GSU5BTkNJQUwsCgkJCQkJCQkJCQkJCSAnZnVuY3Rpb25DYWxsJwkJPT4JJ1BIUEV4Y2VsX0NhbGN1bGF0aW9uX0ZpbmFuY2lhbDo6TUlSUicsCgkJCQkJCQkJCQkJCSAnYXJndW1lbnRDb3VudCcJPT4JJzMnCgkJCQkJCQkJCQkJCSksCgkJCQknTU1VTFQnCQkJCQk9PiBhcnJheSgnY2F0ZWdvcnknCQkJPT4JUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb246OkNBVEVHT1JZX01BVEhfQU5EX1RSSUcsCgkJCQkJCQkJCQkJCSAnZnVuY3Rpb25DYWxsJwkJPT4JJ1BIUEV4Y2VsX0NhbGN1bGF0aW9uX01hdGhUcmlnOjpNTVVMVCcsCgkJCQkJCQkJCQkJCSAnYXJndW1lbnRDb3VudCcJPT4JJzInCgkJCQkJCQkJCQkJCSksCgkJCQknTU9EJwkJCQkJPT4gYXJyYXkoJ2NhdGVnb3J5JwkJCT0+CVBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uOjpDQVRFR09SWV9NQVRIX0FORF9UUklHLAoJCQkJCQkJCQkJCQkgJ2Z1bmN0aW9uQ2FsbCcJCT0+CSdQSFBFeGNlbF9DYWxjdWxhdGlvbl9NYXRoVHJpZzo6TU9EJywKCQkJCQkJCQkJCQkJICdhcmd1bWVudENvdW50Jwk9PgknMicKCQkJCQkJCQkJCQkJKSwKCQkJCSdNT0RFJwkJCQkJPT4gYXJyYXkoJ2NhdGVnb3J5JwkJCT0+CVBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uOjpDQVRFR09SWV9TVEFUSVNUSUNBTCwKCQkJCQkJCQkJCQkJICdmdW5jdGlvbkNhbGwnCQk9PgknUEhQRXhjZWxfQ2FsY3VsYXRpb25fU3RhdGlzdGljYWw6Ok1PREUnLAoJCQkJCQkJCQkJCQkgJ2FyZ3VtZW50Q291bnQnCT0+CScxKycKCQkJCQkJCQkJCQkJKSwKCQkJCSdNT05USCcJCQkJCT0+IGFycmF5KCdjYXRlZ29yeScJCQk9PglQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbjo6Q0FURUdPUllfREFURV9BTkRfVElNRSwKCQkJCQkJCQkJCQkJICdmdW5jdGlvbkNhbGwnCQk9PgknUEhQRXhjZWxfQ2FsY3VsYXRpb25fRGF0ZVRpbWU6Ok1PTlRIT0ZZRUFSJywKCQkJCQkJCQkJCQkJICdhcmd1bWVudENvdW50Jwk9PgknMScKCQkJCQkJCQkJCQkJKSwKCQkJCSdNUk9VTkQnCQkJCT0+IGFycmF5KCdjYXRlZ29yeScJCQk9PglQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbjo6Q0FURUdPUllfTUFUSF9BTkRfVFJJRywKCQkJCQkJCQkJCQkJICdmdW5jdGlvbkNhbGwnCQk9PgknUEhQRXhjZWxfQ2FsY3VsYXRpb25fTWF0aFRyaWc6Ok1ST1VORCcsCgkJCQkJCQkJCQkJCSAnYXJndW1lbnRDb3VudCcJPT4JJzInCgkJCQkJCQkJCQkJCSksCgkJCQknTVVMVElOT01JQUwnCQkJPT4gYXJyYXkoJ2NhdGVnb3J5JwkJCT0+CVBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uOjpDQVRFR09SWV9NQVRIX0FORF9UUklHLAoJCQkJCQkJCQkJCQkgJ2Z1bmN0aW9uQ2FsbCcJCT0+CSdQSFBFeGNlbF9DYWxjdWxhdGlvbl9NYXRoVHJpZzo6TVVMVElOT01JQUwnLAoJCQkJCQkJCQkJCQkgJ2FyZ3VtZW50Q291bnQnCT0+CScxKycKCQkJCQkJCQkJCQkJKSwKCQkJCSdOJwkJCQkJCT0+IGFycmF5KCdjYXRlZ29yeScJCQk9PglQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbjo6Q0FURUdPUllfSU5GT1JNQVRJT04sCgkJCQkJCQkJCQkJCSAnZnVuY3Rpb25DYWxsJwkJPT4JJ1BIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6TicsCgkJCQkJCQkJCQkJCSAnYXJndW1lbnRDb3VudCcJPT4JJzEnCgkJCQkJCQkJCQkJCSksCgkJCQknTkEnCQkJCQk9PiBhcnJheSgnY2F0ZWdvcnknCQkJPT4JUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb246OkNBVEVHT1JZX0lORk9STUFUSU9OLAoJCQkJCQkJCQkJCQkgJ2Z1bmN0aW9uQ2FsbCcJCT0+CSdQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6Ok5BJywKCQkJCQkJCQkJCQkJICdhcmd1bWVudENvdW50Jwk9PgknMCcKCQkJCQkJCQkJCQkJKSwKCQkJCSdORUdCSU5PTURJU1QnCQkJPT4gYXJyYXkoJ2NhdGVnb3J5JwkJCT0+CVBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uOjpDQVRFR09SWV9TVEFUSVNUSUNBTCwKCQkJCQkJCQkJCQkJICdmdW5jdGlvbkNhbGwnCQk9PgknUEhQRXhjZWxfQ2FsY3VsYXRpb25fU3RhdGlzdGljYWw6Ok5FR0JJTk9NRElTVCcsCgkJCQkJCQkJCQkJCSAnYXJndW1lbnRDb3VudCcJPT4JJzMnCgkJCQkJCQkJCQkJCSksCgkJCQknTkVUV09SS0RBWVMnCQkJPT4gYXJyYXkoJ2NhdGVnb3J5JwkJCT0+CVBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uOjpDQVRFR09SWV9EQVRFX0FORF9USU1FLAoJCQkJCQkJCQkJCQkgJ2Z1bmN0aW9uQ2FsbCcJCT0+CSdQSFBFeGNlbF9DYWxjdWxhdGlvbl9EYXRlVGltZTo6TkVUV09SS0RBWVMnLAoJCQkJCQkJCQkJCQkgJ2FyZ3VtZW50Q291bnQnCT0+CScyKycKCQkJCQkJCQkJCQkJKSwKCQkJCSdOT01JTkFMJwkJCQk9PiBhcnJheSgnY2F0ZWdvcnknCQkJPT4JUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb246OkNBVEVHT1JZX0ZJTkFOQ0lBTCwKCQkJCQkJCQkJCQkJICdmdW5jdGlvbkNhbGwnCQk9PgknUEhQRXhjZWxfQ2FsY3VsYXRpb25fRmluYW5jaWFsOjpOT01JTkFMJywKCQkJCQkJCQkJCQkJICdhcmd1bWVudENvdW50Jwk9PgknMicKCQkJCQkJCQkJCQkJKSwKCQkJCSdOT1JNRElTVCcJCQkJPT4gYXJyYXkoJ2NhdGVnb3J5JwkJCT0+CVBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uOjpDQVRFR09SWV9TVEFUSVNUSUNBTCwKCQkJCQkJCQkJCQkJICdmdW5jdGlvbkNhbGwnCQk9PgknUEhQRXhjZWxfQ2FsY3VsYXRpb25fU3RhdGlzdGljYWw6Ok5PUk1ESVNUJywKCQkJCQkJCQkJCQkJICdhcmd1bWVudENvdW50Jwk9PgknNCcKCQkJCQkJCQkJCQkJKSwKCQkJCSdOT1JNSU5WJwkJCQk9PiBhcnJheSgnY2F0ZWdvcnknCQkJPT4JUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb246OkNBVEVHT1JZX1NUQVRJU1RJQ0FMLAoJCQkJCQkJCQkJCQkgJ2Z1bmN0aW9uQ2FsbCcJCT0+CSdQSFBFeGNlbF9DYWxjdWxhdGlvbl9TdGF0aXN0aWNhbDo6Tk9STUlOVicsCgkJCQkJCQkJCQkJCSAnYXJndW1lbnRDb3VudCcJPT4JJzMnCgkJCQkJCQkJCQkJCSksCgkJCQknTk9STVNESVNUJwkJCQk9PiBhcnJheSgnY2F0ZWdvcnknCQkJPT4JUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb246OkNBVEVHT1JZX1NUQVRJU1RJQ0FMLAoJCQkJCQkJCQkJCQkgJ2Z1bmN0aW9uQ2FsbCcJCT0+CSdQSFBFeGNlbF9DYWxjdWxhdGlvbl9TdGF0aXN0aWNhbDo6Tk9STVNESVNUJywKCQkJCQkJCQkJCQkJICdhcmd1bWVudENvdW50Jwk9PgknMScKCQkJCQkJCQkJCQkJKSwKCQkJCSdOT1JNU0lOVicJCQkJPT4gYXJyYXkoJ2NhdGVnb3J5JwkJCT0+CVBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uOjpDQVRFR09SWV9TVEFUSVNUSUNBTCwKCQkJCQkJCQkJCQkJICdmdW5jdGlvbkNhbGwnCQk9PgknUEhQRXhjZWxfQ2FsY3VsYXRpb25fU3RhdGlzdGljYWw6Ok5PUk1TSU5WJywKCQkJCQkJCQkJCQkJICdhcmd1bWVudENvdW50Jwk9PgknMScKCQkJCQkJCQkJCQkJKSwKCQkJCSdOT1QnCQkJCQk9PiBhcnJheSgnY2F0ZWdvcnknCQkJPT4JUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb246OkNBVEVHT1JZX0xPR0lDQUwsCgkJCQkJCQkJCQkJCSAnZnVuY3Rpb25DYWxsJwkJPT4JJ1BIUEV4Y2VsX0NhbGN1bGF0aW9uX0xvZ2ljYWw6Ok5PVCcsCgkJCQkJCQkJCQkJCSAnYXJndW1lbnRDb3VudCcJPT4JJzEnCgkJCQkJCQkJCQkJCSksCgkJCQknTk9XJwkJCQkJPT4gYXJyYXkoJ2NhdGVnb3J5JwkJCT0+CVBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uOjpDQVRFR09SWV9EQVRFX0FORF9USU1FLAoJCQkJCQkJCQkJCQkgJ2Z1bmN0aW9uQ2FsbCcJCT0+CSdQSFBFeGNlbF9DYWxjdWxhdGlvbl9EYXRlVGltZTo6REFURVRJTUVOT1cnLAoJCQkJCQkJCQkJCQkgJ2FyZ3VtZW50Q291bnQnCT0+CScwJwoJCQkJCQkJCQkJCQkpLAoJCQkJJ05QRVInCQkJCQk9PiBhcnJheSgnY2F0ZWdvcnknCQkJPT4JUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb246OkNBVEVHT1JZX0ZJTkFOQ0lBTCwKCQkJCQkJCQkJCQkJICdmdW5jdGlvbkNhbGwnCQk9PgknUEhQRXhjZWxfQ2FsY3VsYXRpb25fRmluYW5jaWFsOjpOUEVSJywKCQkJCQkJCQkJCQkJICdhcmd1bWVudENvdW50Jwk9PgknMy01JwoJCQkJCQkJCQkJCQkpLAoJCQkJJ05QVicJCQkJCT0+IGFycmF5KCdjYXRlZ29yeScJCQk9PglQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbjo6Q0FURUdPUllfRklOQU5DSUFMLAoJCQkJCQkJCQkJCQkgJ2Z1bmN0aW9uQ2FsbCcJCT0+CSdQSFBFeGNlbF9DYWxjdWxhdGlvbl9GaW5hbmNpYWw6Ok5QVicsCgkJCQkJCQkJCQkJCSAnYXJndW1lbnRDb3VudCcJPT4JJzIrJwoJCQkJCQkJCQkJCQkpLAoJCQkJJ09DVDJCSU4nCQkJCT0+IGFycmF5KCdjYXRlZ29yeScJCQk9PglQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbjo6Q0FURUdPUllfRU5HSU5FRVJJTkcsCgkJCQkJCQkJCQkJCSAnZnVuY3Rpb25DYWxsJwkJPT4JJ1BIUEV4Y2VsX0NhbGN1bGF0aW9uX0VuZ2luZWVyaW5nOjpPQ1RUT0JJTicsCgkJCQkJCQkJCQkJCSAnYXJndW1lbnRDb3VudCcJPT4JJzEsMicKCQkJCQkJCQkJCQkJKSwKCQkJCSdPQ1QyREVDJwkJCQk9PiBhcnJheSgnY2F0ZWdvcnknCQkJPT4JUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb246OkNBVEVHT1JZX0VOR0lORUVSSU5HLAoJCQkJCQkJCQkJCQkgJ2Z1bmN0aW9uQ2FsbCcJCT0+CSdQSFBFeGNlbF9DYWxjdWxhdGlvbl9FbmdpbmVlcmluZzo6T0NUVE9ERUMnLAoJCQkJCQkJCQkJCQkgJ2FyZ3VtZW50Q291bnQnCT0+CScxJwoJCQkJCQkJCQkJCQkpLAoJCQkJJ09DVDJIRVgnCQkJCT0+IGFycmF5KCdjYXRlZ29yeScJCQk9PglQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbjo6Q0FURUdPUllfRU5HSU5FRVJJTkcsCgkJCQkJCQkJCQkJCSAnZnVuY3Rpb25DYWxsJwkJPT4JJ1BIUEV4Y2VsX0NhbGN1bGF0aW9uX0VuZ2luZWVyaW5nOjpPQ1RUT0hFWCcsCgkJCQkJCQkJCQkJCSAnYXJndW1lbnRDb3VudCcJPT4JJzEsMicKCQkJCQkJCQkJCQkJKSwKCQkJCSdPREQnCQkJCQk9PiBhcnJheSgnY2F0ZWdvcnknCQkJPT4JUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb246OkNBVEVHT1JZX01BVEhfQU5EX1RSSUcsCgkJCQkJCQkJCQkJCSAnZnVuY3Rpb25DYWxsJwkJPT4JJ1BIUEV4Y2VsX0NhbGN1bGF0aW9uX01hdGhUcmlnOjpPREQnLAoJCQkJCQkJCQkJCQkgJ2FyZ3VtZW50Q291bnQnCT0+CScxJwoJCQkJCQkJCQkJCQkpLAoJCQkJJ09EREZQUklDRScJCQkJPT4gYXJyYXkoJ2NhdGVnb3J5JwkJCT0+CVBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uOjpDQVRFR09SWV9GSU5BTkNJQUwsCgkJCQkJCQkJCQkJCSAnZnVuY3Rpb25DYWxsJwkJPT4JJ1BIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6RFVNTVknLAoJCQkJCQkJCQkJCQkgJ2FyZ3VtZW50Q291bnQnCT0+CSc4LDknCgkJCQkJCQkJCQkJCSksCgkJCQknT0RERllJRUxEJwkJCQk9PiBhcnJheSgnY2F0ZWdvcnknCQkJPT4JUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb246OkNBVEVHT1JZX0ZJTkFOQ0lBTCwKCQkJCQkJCQkJCQkJICdmdW5jdGlvbkNhbGwnCQk9PgknUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpEVU1NWScsCgkJCQkJCQkJCQkJCSAnYXJndW1lbnRDb3VudCcJPT4JJzgsOScKCQkJCQkJCQkJCQkJKSwKCQkJCSdPRERMUFJJQ0UnCQkJCT0+IGFycmF5KCdjYXRlZ29yeScJCQk9PglQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbjo6Q0FURUdPUllfRklOQU5DSUFMLAoJCQkJCQkJCQkJCQkgJ2Z1bmN0aW9uQ2FsbCcJCT0+CSdQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OkRVTU1ZJywKCQkJCQkJCQkJCQkJICdhcmd1bWVudENvdW50Jwk9PgknNyw4JwoJCQkJCQkJCQkJCQkpLAoJCQkJJ09ERExZSUVMRCcJCQkJPT4gYXJyYXkoJ2NhdGVnb3J5JwkJCT0+CVBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uOjpDQVRFR09SWV9GSU5BTkNJQUwsCgkJCQkJCQkJCQkJCSAnZnVuY3Rpb25DYWxsJwkJPT4JJ1BIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6RFVNTVknLAoJCQkJCQkJCQkJCQkgJ2FyZ3VtZW50Q291bnQnCT0+CSc3LDgnCgkJCQkJCQkJCQkJCSksCgkJCQknT0ZGU0VUJwkJCQk9PiBhcnJheSgnY2F0ZWdvcnknCQkJPT4JUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb246OkNBVEVHT1JZX0xPT0tVUF9BTkRfUkVGRVJFTkNFLAoJCQkJCQkJCQkJCQkgJ2Z1bmN0aW9uQ2FsbCcJCT0+CSdQSFBFeGNlbF9DYWxjdWxhdGlvbl9Mb29rdXBSZWY6Ok9GRlNFVCcsCgkJCQkJCQkJCQkJCSAnYXJndW1lbnRDb3VudCcJPT4JJzMsNScsCgkJCQkJCQkJCQkJCSAncGFzc0NlbGxSZWZlcmVuY2UnPT4JdHJ1ZSwKCQkJCQkJCQkJCQkJICdwYXNzQnlSZWZlcmVuY2UnCT0+CWFycmF5KHRydWUpCgkJCQkJCQkJCQkJCSksCgkJCQknT1InCQkJCQk9PiBhcnJheSgnY2F0ZWdvcnknCQkJPT4JUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb246OkNBVEVHT1JZX0xPR0lDQUwsCgkJCQkJCQkJCQkJCSAnZnVuY3Rpb25DYWxsJwkJPT4JJ1BIUEV4Y2VsX0NhbGN1bGF0aW9uX0xvZ2ljYWw6OkxPR0lDQUxfT1InLAoJCQkJCQkJCQkJCQkgJ2FyZ3VtZW50Q291bnQnCT0+CScxKycKCQkJCQkJCQkJCQkJKSwKCQkJCSdQRUFSU09OJwkJCQk9PiBhcnJheSgnY2F0ZWdvcnknCQkJPT4JUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb246OkNBVEVHT1JZX1NUQVRJU1RJQ0FMLAoJCQkJCQkJCQkJCQkgJ2Z1bmN0aW9uQ2FsbCcJCT0+CSdQSFBFeGNlbF9DYWxjdWxhdGlvbl9TdGF0aXN0aWNhbDo6Q09SUkVMJywKCQkJCQkJCQkJCQkJICdhcmd1bWVudENvdW50Jwk9PgknMicKCQkJCQkJCQkJCQkJKSwKCQkJCSdQRVJDRU5USUxFJwkJCT0+IGFycmF5KCdjYXRlZ29yeScJCQk9PglQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbjo6Q0FURUdPUllfU1RBVElTVElDQUwsCgkJCQkJCQkJCQkJCSAnZnVuY3Rpb25DYWxsJwkJPT4JJ1BIUEV4Y2VsX0NhbGN1bGF0aW9uX1N0YXRpc3RpY2FsOjpQRVJDRU5USUxFJywKCQkJCQkJCQkJCQkJICdhcmd1bWVudENvdW50Jwk9PgknMicKCQkJCQkJCQkJCQkJKSwKCQkJCSdQRVJDRU5UUkFOSycJCQk9PiBhcnJheSgnY2F0ZWdvcnknCQkJPT4JUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb246OkNBVEVHT1JZX1NUQVRJU1RJQ0FMLAoJCQkJCQkJCQkJCQkgJ2Z1bmN0aW9uQ2FsbCcJCT0+CSdQSFBFeGNlbF9DYWxjdWxhdGlvbl9TdGF0aXN0aWNhbDo6UEVSQ0VOVFJBTksnLAoJCQkJCQkJCQkJCQkgJ2FyZ3VtZW50Q291bnQnCT0+CScyLDMnCgkJCQkJCQkJCQkJCSksCgkJCQknUEVSTVVUJwkJCQk9PiBhcnJheSgnY2F0ZWdvcnknCQkJPT4JUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb246OkNBVEVHT1JZX1NUQVRJU1RJQ0FMLAoJCQkJCQkJCQkJCQkgJ2Z1bmN0aW9uQ2FsbCcJCT0+CSdQSFBFeGNlbF9DYWxjdWxhdGlvbl9TdGF0aXN0aWNhbDo6UEVSTVVUJywKCQkJCQkJCQkJCQkJICdhcmd1bWVudENvdW50Jwk9PgknMicKCQkJCQkJCQkJCQkJKSwKCQkJCSdQSE9ORVRJQycJCQkJPT4gYXJyYXkoJ2NhdGVnb3J5JwkJCT0+CVBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uOjpDQVRFR09SWV9URVhUX0FORF9EQVRBLAoJCQkJCQkJCQkJCQkgJ2Z1bmN0aW9uQ2FsbCcJCT0+CSdQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OkRVTU1ZJywKCQkJCQkJCQkJCQkJICdhcmd1bWVudENvdW50Jwk9PgknMScKCQkJCQkJCQkJCQkJKSwKCQkJCSdQSScJCQkJCT0+IGFycmF5KCdjYXRlZ29yeScJCQk9PglQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbjo6Q0FURUdPUllfTUFUSF9BTkRfVFJJRywKCQkJCQkJCQkJCQkJICdmdW5jdGlvbkNhbGwnCQk9PgkncGknLAoJCQkJCQkJCQkJCQkgJ2FyZ3VtZW50Q291bnQnCT0+CScwJwoJCQkJCQkJCQkJCQkpLAoJCQkJJ1BNVCcJCQkJCT0+IGFycmF5KCdjYXRlZ29yeScJCQk9PglQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbjo6Q0FURUdPUllfRklOQU5DSUFMLAoJCQkJCQkJCQkJCQkgJ2Z1bmN0aW9uQ2FsbCcJCT0+CSdQSFBFeGNlbF9DYWxjdWxhdGlvbl9GaW5hbmNpYWw6OlBNVCcsCgkJCQkJCQkJCQkJCSAnYXJndW1lbnRDb3VudCcJPT4JJzMtNScKCQkJCQkJCQkJCQkJKSwKCQkJCSdQT0lTU09OJwkJCQk9PiBhcnJheSgnY2F0ZWdvcnknCQkJPT4JUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb246OkNBVEVHT1JZX1NUQVRJU1RJQ0FMLAoJCQkJCQkJCQkJCQkgJ2Z1bmN0aW9uQ2FsbCcJCT0+CSdQSFBFeGNlbF9DYWxjdWxhdGlvbl9TdGF0aXN0aWNhbDo6UE9JU1NPTicsCgkJCQkJCQkJCQkJCSAnYXJndW1lbnRDb3VudCcJPT4JJzMnCgkJCQkJCQkJCQkJCSksCgkJCQknUE9XRVInCQkJCQk9PiBhcnJheSgnY2F0ZWdvcnknCQkJPT4JUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb246OkNBVEVHT1JZX01BVEhfQU5EX1RSSUcsCgkJCQkJCQkJCQkJCSAnZnVuY3Rpb25DYWxsJwkJPT4JJ1BIUEV4Y2VsX0NhbGN1bGF0aW9uX01hdGhUcmlnOjpQT1dFUicsCgkJCQkJCQkJCQkJCSAnYXJndW1lbnRDb3VudCcJPT4JJzInCgkJCQkJCQkJCQkJCSksCgkJCQknUFBNVCcJCQkJCT0+IGFycmF5KCdjYXRlZ29yeScJCQk9PglQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbjo6Q0FURUdPUllfRklOQU5DSUFMLAoJCQkJCQkJCQkJCQkgJ2Z1bmN0aW9uQ2FsbCcJCT0+CSdQSFBFeGNlbF9DYWxjdWxhdGlvbl9GaW5hbmNpYWw6OlBQTVQnLAoJCQkJCQkJCQkJCQkgJ2FyZ3VtZW50Q291bnQnCT0+CSc0LTYnCgkJCQkJCQkJCQkJCSksCgkJCQknUFJJQ0UnCQkJCQk9PiBhcnJheSgnY2F0ZWdvcnknCQkJPT4JUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb246OkNBVEVHT1JZX0ZJTkFOQ0lBTCwKCQkJCQkJCQkJCQkJICdmdW5jdGlvbkNhbGwnCQk9PgknUEhQRXhjZWxfQ2FsY3VsYXRpb25fRmluYW5jaWFsOjpQUklDRScsCgkJCQkJCQkJCQkJCSAnYXJndW1lbnRDb3VudCcJPT4JJzYsNycKCQkJCQkJCQkJCQkJKSwKCQkJCSdQUklDRURJU0MnCQkJCT0+IGFycmF5KCdjYXRlZ29yeScJCQk9PglQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbjo6Q0FURUdPUllfRklOQU5DSUFMLAoJCQkJCQkJCQkJCQkgJ2Z1bmN0aW9uQ2FsbCcJCT0+CSdQSFBFeGNlbF9DYWxjdWxhdGlvbl9GaW5hbmNpYWw6OlBSSUNFRElTQycsCgkJCQkJCQkJCQkJCSAnYXJndW1lbnRDb3VudCcJPT4JJzQsNScKCQkJCQkJCQkJCQkJKSwKCQkJCSdQUklDRU1BVCcJCQkJPT4gYXJyYXkoJ2NhdGVnb3J5JwkJCT0+CVBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uOjpDQVRFR09SWV9GSU5BTkNJQUwsCgkJCQkJCQkJCQkJCSAnZnVuY3Rpb25DYWxsJwkJPT4JJ1BIUEV4Y2VsX0NhbGN1bGF0aW9uX0ZpbmFuY2lhbDo6UFJJQ0VNQVQnLAoJCQkJCQkJCQkJCQkgJ2FyZ3VtZW50Q291bnQnCT0+CSc1LDYnCgkJCQkJCQkJCQkJCSksCgkJCQknUFJPQicJCQkJCT0+IGFycmF5KCdjYXRlZ29yeScJCQk9PglQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbjo6Q0FURUdPUllfU1RBVElTVElDQUwsCgkJCQkJCQkJCQkJCSAnZnVuY3Rpb25DYWxsJwkJPT4JJ1BIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6RFVNTVknLAoJCQkJCQkJCQkJCQkgJ2FyZ3VtZW50Q291bnQnCT0+CSczLDQnCgkJCQkJCQkJCQkJCSksCgkJCQknUFJPRFVDVCcJCQkJPT4gYXJyYXkoJ2NhdGVnb3J5JwkJCT0+CVBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uOjpDQVRFR09SWV9NQVRIX0FORF9UUklHLAoJCQkJCQkJCQkJCQkgJ2Z1bmN0aW9uQ2FsbCcJCT0+CSdQSFBFeGNlbF9DYWxjdWxhdGlvbl9NYXRoVHJpZzo6UFJPRFVDVCcsCgkJCQkJCQkJCQkJCSAnYXJndW1lbnRDb3VudCcJPT4JJzErJwoJCQkJCQkJCQkJCQkpLAoJCQkJJ1BST1BFUicJCQkJPT4gYXJyYXkoJ2NhdGVnb3J5JwkJCT0+CVBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uOjpDQVRFR09SWV9URVhUX0FORF9EQVRBLAoJCQkJCQkJCQkJCQkgJ2Z1bmN0aW9uQ2FsbCcJCT0+CSdQSFBFeGNlbF9DYWxjdWxhdGlvbl9UZXh0RGF0YTo6UFJPUEVSQ0FTRScsCgkJCQkJCQkJCQkJCSAnYXJndW1lbnRDb3VudCcJPT4JJzEnCgkJCQkJCQkJCQkJCSksCgkJCQknUFYnCQkJCQk9PiBhcnJheSgnY2F0ZWdvcnknCQkJPT4JUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb246OkNBVEVHT1JZX0ZJTkFOQ0lBTCwKCQkJCQkJCQkJCQkJICdmdW5jdGlvbkNhbGwnCQk9PgknUEhQRXhjZWxfQ2FsY3VsYXRpb25fRmluYW5jaWFsOjpQVicsCgkJCQkJCQkJCQkJCSAnYXJndW1lbnRDb3VudCcJPT4JJzMtNScKCQkJCQkJCQkJCQkJKSwKCQkJCSdRVUFSVElMRScJCQkJPT4gYXJyYXkoJ2NhdGVnb3J5JwkJCT0+CVBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uOjpDQVRFR09SWV9TVEFUSVNUSUNBTCwKCQkJCQkJCQkJCQkJICdmdW5jdGlvbkNhbGwnCQk9PgknUEhQRXhjZWxfQ2FsY3VsYXRpb25fU3RhdGlzdGljYWw6OlFVQVJUSUxFJywKCQkJCQkJCQkJCQkJICdhcmd1bWVudENvdW50Jwk9PgknMicKCQkJCQkJCQkJCQkJKSwKCQkJCSdRVU9USUVOVCcJCQkJPT4gYXJyYXkoJ2NhdGVnb3J5JwkJCT0+CVBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uOjpDQVRFR09SWV9NQVRIX0FORF9UUklHLAoJCQkJCQkJCQkJCQkgJ2Z1bmN0aW9uQ2FsbCcJCT0+CSdQSFBFeGNlbF9DYWxjdWxhdGlvbl9NYXRoVHJpZzo6UVVPVElFTlQnLAoJCQkJCQkJCQkJCQkgJ2FyZ3VtZW50Q291bnQnCT0+CScyJwoJCQkJCQkJCQkJCQkpLAoJCQkJJ1JBRElBTlMnCQkJCT0+IGFycmF5KCdjYXRlZ29yeScJCQk9PglQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbjo6Q0FURUdPUllfTUFUSF9BTkRfVFJJRywKCQkJCQkJCQkJCQkJICdmdW5jdGlvbkNhbGwnCQk9PgknZGVnMnJhZCcsCgkJCQkJCQkJCQkJCSAnYXJndW1lbnRDb3VudCcJPT4JJzEnCgkJCQkJCQkJCQkJCSksCgkJCQknUkFORCcJCQkJCT0+IGFycmF5KCdjYXRlZ29yeScJCQk9PglQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbjo6Q0FURUdPUllfTUFUSF9BTkRfVFJJRywKCQkJCQkJCQkJCQkJICdmdW5jdGlvbkNhbGwnCQk9PgknUEhQRXhjZWxfQ2FsY3VsYXRpb25fTWF0aFRyaWc6OlJBTkQnLAoJCQkJCQkJCQkJCQkgJ2FyZ3VtZW50Q291bnQnCT0+CScwJwoJCQkJCQkJCQkJCQkpLAoJCQkJJ1JBTkRCRVRXRUVOJwkJCT0+IGFycmF5KCdjYXRlZ29yeScJCQk9PglQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbjo6Q0FURUdPUllfTUFUSF9BTkRfVFJJRywKCQkJCQkJCQkJCQkJICdmdW5jdGlvbkNhbGwnCQk9PgknUEhQRXhjZWxfQ2FsY3VsYXRpb25fTWF0aFRyaWc6OlJBTkQnLAoJCQkJCQkJCQkJCQkgJ2FyZ3VtZW50Q291bnQnCT0+CScyJwoJCQkJCQkJCQkJCQkpLAoJCQkJJ1JBTksnCQkJCQk9PiBhcnJheSgnY2F0ZWdvcnknCQkJPT4JUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb246OkNBVEVHT1JZX1NUQVRJU1RJQ0FMLAoJCQkJCQkJCQkJCQkgJ2Z1bmN0aW9uQ2FsbCcJCT0+CSdQSFBFeGNlbF9DYWxjdWxhdGlvbl9TdGF0aXN0aWNhbDo6UkFOSycsCgkJCQkJCQkJCQkJCSAnYXJndW1lbnRDb3VudCcJPT4JJzIsMycKCQkJCQkJCQkJCQkJKSwKCQkJCSdSQVRFJwkJCQkJPT4gYXJyYXkoJ2NhdGVnb3J5JwkJCT0+CVBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uOjpDQVRFR09SWV9GSU5BTkNJQUwsCgkJCQkJCQkJCQkJCSAnZnVuY3Rpb25DYWxsJwkJPT4JJ1BIUEV4Y2VsX0NhbGN1bGF0aW9uX0ZpbmFuY2lhbDo6UkFURScsCgkJCQkJCQkJCQkJCSAnYXJndW1lbnRDb3VudCcJPT4JJzMtNicKCQkJCQkJCQkJCQkJKSwKCQkJCSdSRUNFSVZFRCcJCQkJPT4gYXJyYXkoJ2NhdGVnb3J5JwkJCT0+CVBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uOjpDQVRFR09SWV9GSU5BTkNJQUwsCgkJCQkJCQkJCQkJCSAnZnVuY3Rpb25DYWxsJwkJPT4JJ1BIUEV4Y2VsX0NhbGN1bGF0aW9uX0ZpbmFuY2lhbDo6UkVDRUlWRUQnLAoJCQkJCQkJCQkJCQkgJ2FyZ3VtZW50Q291bnQnCT0+CSc0LTUnCgkJCQkJCQkJCQkJCSksCgkJCQknUkVQTEFDRScJCQkJPT4gYXJyYXkoJ2NhdGVnb3J5JwkJCT0+CVBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uOjpDQVRFR09SWV9URVhUX0FORF9EQVRBLAoJCQkJCQkJCQkJCQkgJ2Z1bmN0aW9uQ2FsbCcJCT0+CSdQSFBFeGNlbF9DYWxjdWxhdGlvbl9UZXh0RGF0YTo6UkVQTEFDRScsCgkJCQkJCQkJCQkJCSAnYXJndW1lbnRDb3VudCcJPT4JJzQnCgkJCQkJCQkJCQkJCSksCgkJCQknUkVQTEFDRUInCQkJCT0+IGFycmF5KCdjYXRlZ29yeScJCQk9PglQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbjo6Q0FURUdPUllfVEVYVF9BTkRfREFUQSwKCQkJCQkJCQkJCQkJICdmdW5jdGlvbkNhbGwnCQk9PgknUEhQRXhjZWxfQ2FsY3VsYXRpb25fVGV4dERhdGE6OlJFUExBQ0UnLAoJCQkJCQkJCQkJCQkgJ2FyZ3VtZW50Q291bnQnCT0+CSc0JwoJCQkJCQkJCQkJCQkpLAoJCQkJJ1JFUFQnCQkJCQk9PiBhcnJheSgnY2F0ZWdvcnknCQkJPT4JUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb246OkNBVEVHT1JZX1RFWFRfQU5EX0RBVEEsCgkJCQkJCQkJCQkJCSAnZnVuY3Rpb25DYWxsJwkJPT4JJ3N0cl9yZXBlYXQnLAoJCQkJCQkJCQkJCQkgJ2FyZ3VtZW50Q291bnQnCT0+CScyJwoJCQkJCQkJCQkJCQkpLAoJCQkJJ1JJR0hUJwkJCQkJPT4gYXJyYXkoJ2NhdGVnb3J5JwkJCT0+CVBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uOjpDQVRFR09SWV9URVhUX0FORF9EQVRBLAoJCQkJCQkJCQkJCQkgJ2Z1bmN0aW9uQ2FsbCcJCT0+CSdQSFBFeGNlbF9DYWxjdWxhdGlvbl9UZXh0RGF0YTo6UklHSFQnLAoJCQkJCQkJCQkJCQkgJ2FyZ3VtZW50Q291bnQnCT0+CScxLDInCgkJCQkJCQkJCQkJCSksCgkJCQknUklHSFRCJwkJCQk9PiBhcnJheSgnY2F0ZWdvcnknCQkJPT4JUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb246OkNBVEVHT1JZX1RFWFRfQU5EX0RBVEEsCgkJCQkJCQkJCQkJCSAnZnVuY3Rpb25DYWxsJwkJPT4JJ1BIUEV4Y2VsX0NhbGN1bGF0aW9uX1RleHREYXRhOjpSSUdIVCcsCgkJCQkJCQkJCQkJCSAnYXJndW1lbnRDb3VudCcJPT4JJzEsMicKCQkJCQkJCQkJCQkJKSwKCQkJCSdST01BTicJCQkJCT0+IGFycmF5KCdjYXRlZ29yeScJCQk9PglQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbjo6Q0FURUdPUllfTUFUSF9BTkRfVFJJRywKCQkJCQkJCQkJCQkJICdmdW5jdGlvbkNhbGwnCQk9PgknUEhQRXhjZWxfQ2FsY3VsYXRpb25fTWF0aFRyaWc6OlJPTUFOJywKCQkJCQkJCQkJCQkJICdhcmd1bWVudENvdW50Jwk9PgknMSwyJwoJCQkJCQkJCQkJCQkpLAoJCQkJJ1JPVU5EJwkJCQkJPT4gYXJyYXkoJ2NhdGVnb3J5JwkJCT0+CVBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uOjpDQVRFR09SWV9NQVRIX0FORF9UUklHLAoJCQkJCQkJCQkJCQkgJ2Z1bmN0aW9uQ2FsbCcJCT0+CSdyb3VuZCcsCgkJCQkJCQkJCQkJCSAnYXJndW1lbnRDb3VudCcJPT4JJzInCgkJCQkJCQkJCQkJCSksCgkJCQknUk9VTkRET1dOJwkJCQk9PiBhcnJheSgnY2F0ZWdvcnknCQkJPT4JUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb246OkNBVEVHT1JZX01BVEhfQU5EX1RSSUcsCgkJCQkJCQkJCQkJCSAnZnVuY3Rpb25DYWxsJwkJPT4JJ1BIUEV4Y2VsX0NhbGN1bGF0aW9uX01hdGhUcmlnOjpST1VORERPV04nLAoJCQkJCQkJCQkJCQkgJ2FyZ3VtZW50Q291bnQnCT0+CScyJwoJCQkJCQkJCQkJCQkpLAoJCQkJJ1JPVU5EVVAnCQkJCT0+IGFycmF5KCdjYXRlZ29yeScJCQk9PglQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbjo6Q0FURUdPUllfTUFUSF9BTkRfVFJJRywKCQkJCQkJCQkJCQkJICdmdW5jdGlvbkNhbGwnCQk9PgknUEhQRXhjZWxfQ2FsY3VsYXRpb25fTWF0aFRyaWc6OlJPVU5EVVAnLAoJCQkJCQkJCQkJCQkgJ2FyZ3VtZW50Q291bnQnCT0+CScyJwoJCQkJCQkJCQkJCQkpLAoJCQkJJ1JPVycJCQkJCT0+IGFycmF5KCdjYXRlZ29yeScJCQk9PglQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbjo6Q0FURUdPUllfTE9PS1VQX0FORF9SRUZFUkVOQ0UsCgkJCQkJCQkJCQkJCSAnZnVuY3Rpb25DYWxsJwkJPT4JJ1BIUEV4Y2VsX0NhbGN1bGF0aW9uX0xvb2t1cFJlZjo6Uk9XJywKCQkJCQkJCQkJCQkJICdhcmd1bWVudENvdW50Jwk9PgknLTEnLAoJCQkJCQkJCQkJCQkgJ3Bhc3NCeVJlZmVyZW5jZScJPT4JYXJyYXkodHJ1ZSkKCQkJCQkJCQkJCQkJKSwKCQkJCSdST1dTJwkJCQkJPT4gYXJyYXkoJ2NhdGVnb3J5JwkJCT0+CVBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uOjpDQVRFR09SWV9MT09LVVBfQU5EX1JFRkVSRU5DRSwKCQkJCQkJCQkJCQkJICdmdW5jdGlvbkNhbGwnCQk9PgknUEhQRXhjZWxfQ2FsY3VsYXRpb25fTG9va3VwUmVmOjpST1dTJywKCQkJCQkJCQkJCQkJICdhcmd1bWVudENvdW50Jwk9PgknMScKCQkJCQkJCQkJCQkJKSwKCQkJCSdSU1EnCQkJCQk9PiBhcnJheSgnY2F0ZWdvcnknCQkJPT4JUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb246OkNBVEVHT1JZX1NUQVRJU1RJQ0FMLAoJCQkJCQkJCQkJCQkgJ2Z1bmN0aW9uQ2FsbCcJCT0+CSdQSFBFeGNlbF9DYWxjdWxhdGlvbl9TdGF0aXN0aWNhbDo6UlNRJywKCQkJCQkJCQkJCQkJICdhcmd1bWVudENvdW50Jwk9PgknMicKCQkJCQkJCQkJCQkJKSwKCQkJCSdSVEQnCQkJCQk9PiBhcnJheSgnY2F0ZWdvcnknCQkJPT4JUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb246OkNBVEVHT1JZX0xPT0tVUF9BTkRfUkVGRVJFTkNFLAoJCQkJCQkJCQkJCQkgJ2Z1bmN0aW9uQ2FsbCcJCT0+CSdQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OkRVTU1ZJywKCQkJCQkJCQkJCQkJICdhcmd1bWVudENvdW50Jwk9PgknMSsnCgkJCQkJCQkJCQkJCSksCgkJCQknU0VBUkNIJwkJCQk9PiBhcnJheSgnY2F0ZWdvcnknCQkJPT4JUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb246OkNBVEVHT1JZX1RFWFRfQU5EX0RBVEEsCgkJCQkJCQkJCQkJCSAnZnVuY3Rpb25DYWxsJwkJPT4JJ1BIUEV4Y2VsX0NhbGN1bGF0aW9uX1RleHREYXRhOjpTRUFSQ0hJTlNFTlNJVElWRScsCgkJCQkJCQkJCQkJCSAnYXJndW1lbnRDb3VudCcJPT4JJzIsMycKCQkJCQkJCQkJCQkJKSwKCQkJCSdTRUFSQ0hCJwkJCQk9PiBhcnJheSgnY2F0ZWdvcnknCQkJPT4JUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb246OkNBVEVHT1JZX1RFWFRfQU5EX0RBVEEsCgkJCQkJCQkJCQkJCSAnZnVuY3Rpb25DYWxsJwkJPT4JJ1BIUEV4Y2VsX0NhbGN1bGF0aW9uX1RleHREYXRhOjpTRUFSQ0hJTlNFTlNJVElWRScsCgkJCQkJCQkJCQkJCSAnYXJndW1lbnRDb3VudCcJPT4JJzIsMycKCQkJCQkJCQkJCQkJKSwKCQkJCSdTRUNPTkQnCQkJCT0+IGFycmF5KCdjYXRlZ29yeScJCQk9PglQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbjo6Q0FURUdPUllfREFURV9BTkRfVElNRSwKCQkJCQkJCQkJCQkJICdmdW5jdGlvbkNhbGwnCQk9PgknUEhQRXhjZWxfQ2FsY3VsYXRpb25fRGF0ZVRpbWU6OlNFQ09ORE9GTUlOVVRFJywKCQkJCQkJCQkJCQkJICdhcmd1bWVudENvdW50Jwk9PgknMScKCQkJCQkJCQkJCQkJKSwKCQkJCSdTRVJJRVNTVU0nCQkJCT0+IGFycmF5KCdjYXRlZ29yeScJCQk9PglQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbjo6Q0FURUdPUllfTUFUSF9BTkRfVFJJRywKCQkJCQkJCQkJCQkJICdmdW5jdGlvbkNhbGwnCQk9PgknUEhQRXhjZWxfQ2FsY3VsYXRpb25fTWF0aFRyaWc6OlNFUklFU1NVTScsCgkJCQkJCQkJCQkJCSAnYXJndW1lbnRDb3VudCcJPT4JJzQnCgkJCQkJCQkJCQkJCSksCgkJCQknU0lHTicJCQkJCT0+IGFycmF5KCdjYXRlZ29yeScJCQk9PglQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbjo6Q0FURUdPUllfTUFUSF9BTkRfVFJJRywKCQkJCQkJCQkJCQkJICdmdW5jdGlvbkNhbGwnCQk9PgknUEhQRXhjZWxfQ2FsY3VsYXRpb25fTWF0aFRyaWc6OlNJR04nLAoJCQkJCQkJCQkJCQkgJ2FyZ3VtZW50Q291bnQnCT0+CScxJwoJCQkJCQkJCQkJCQkpLAoJCQkJJ1NJTicJCQkJCT0+IGFycmF5KCdjYXRlZ29yeScJCQk9PglQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbjo6Q0FURUdPUllfTUFUSF9BTkRfVFJJRywKCQkJCQkJCQkJCQkJICdmdW5jdGlvbkNhbGwnCQk9Pgknc2luJywKCQkJCQkJCQkJCQkJICdhcmd1bWVudENvdW50Jwk9PgknMScKCQkJCQkJCQkJCQkJKSwKCQkJCSdTSU5IJwkJCQkJPT4gYXJyYXkoJ2NhdGVnb3J5JwkJCT0+CVBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uOjpDQVRFR09SWV9NQVRIX0FORF9UUklHLAoJCQkJCQkJCQkJCQkgJ2Z1bmN0aW9uQ2FsbCcJCT0+CSdzaW5oJywKCQkJCQkJCQkJCQkJICdhcmd1bWVudENvdW50Jwk9PgknMScKCQkJCQkJCQkJCQkJKSwKCQkJCSdTS0VXJwkJCQkJPT4gYXJyYXkoJ2NhdGVnb3J5JwkJCT0+CVBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uOjpDQVRFR09SWV9TVEFUSVNUSUNBTCwKCQkJCQkJCQkJCQkJICdmdW5jdGlvbkNhbGwnCQk9PgknUEhQRXhjZWxfQ2FsY3VsYXRpb25fU3RhdGlzdGljYWw6OlNLRVcnLAoJCQkJCQkJCQkJCQkgJ2FyZ3VtZW50Q291bnQnCT0+CScxKycKCQkJCQkJCQkJCQkJKSwKCQkJCSdTTE4nCQkJCQk9PiBhcnJheSgnY2F0ZWdvcnknCQkJPT4JUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb246OkNBVEVHT1JZX0ZJTkFOQ0lBTCwKCQkJCQkJCQkJCQkJICdmdW5jdGlvbkNhbGwnCQk9PgknUEhQRXhjZWxfQ2FsY3VsYXRpb25fRmluYW5jaWFsOjpTTE4nLAoJCQkJCQkJCQkJCQkgJ2FyZ3VtZW50Q291bnQnCT0+CSczJwoJCQkJCQkJCQkJCQkpLAoJCQkJJ1NMT1BFJwkJCQkJPT4gYXJyYXkoJ2NhdGVnb3J5JwkJCT0+CVBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uOjpDQVRFR09SWV9TVEFUSVNUSUNBTCwKCQkJCQkJCQkJCQkJICdmdW5jdGlvbkNhbGwnCQk9PgknUEhQRXhjZWxfQ2FsY3VsYXRpb25fU3RhdGlzdGljYWw6OlNMT1BFJywKCQkJCQkJCQkJCQkJICdhcmd1bWVudENvdW50Jwk9PgknMicKCQkJCQkJCQkJCQkJKSwKCQkJCSdTTUFMTCcJCQkJCT0+IGFycmF5KCdjYXRlZ29yeScJCQk9PglQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbjo6Q0FURUdPUllfU1RBVElTVElDQUwsCgkJCQkJCQkJCQkJCSAnZnVuY3Rpb25DYWxsJwkJPT4JJ1BIUEV4Y2VsX0NhbGN1bGF0aW9uX1N0YXRpc3RpY2FsOjpTTUFMTCcsCgkJCQkJCQkJCQkJCSAnYXJndW1lbnRDb3VudCcJPT4JJzInCgkJCQkJCQkJCQkJCSksCgkJCQknU1FSVCcJCQkJCT0+IGFycmF5KCdjYXRlZ29yeScJCQk9PglQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbjo6Q0FURUdPUllfTUFUSF9BTkRfVFJJRywKCQkJCQkJCQkJCQkJICdmdW5jdGlvbkNhbGwnCQk9Pgknc3FydCcsCgkJCQkJCQkJCQkJCSAnYXJndW1lbnRDb3VudCcJPT4JJzEnCgkJCQkJCQkJCQkJCSksCgkJCQknU1FSVFBJJwkJCQk9PiBhcnJheSgnY2F0ZWdvcnknCQkJPT4JUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb246OkNBVEVHT1JZX01BVEhfQU5EX1RSSUcsCgkJCQkJCQkJCQkJCSAnZnVuY3Rpb25DYWxsJwkJPT4JJ1BIUEV4Y2VsX0NhbGN1bGF0aW9uX01hdGhUcmlnOjpTUVJUUEknLAoJCQkJCQkJCQkJCQkgJ2FyZ3VtZW50Q291bnQnCT0+CScxJwoJCQkJCQkJCQkJCQkpLAoJCQkJJ1NUQU5EQVJESVpFJwkJCT0+IGFycmF5KCdjYXRlZ29yeScJCQk9PglQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbjo6Q0FURUdPUllfU1RBVElTVElDQUwsCgkJCQkJCQkJCQkJCSAnZnVuY3Rpb25DYWxsJwkJPT4JJ1BIUEV4Y2VsX0NhbGN1bGF0aW9uX1N0YXRpc3RpY2FsOjpTVEFOREFSRElaRScsCgkJCQkJCQkJCQkJCSAnYXJndW1lbnRDb3VudCcJPT4JJzMnCgkJCQkJCQkJCQkJCSksCgkJCQknU1RERVYnCQkJCQk9PiBhcnJheSgnY2F0ZWdvcnknCQkJPT4JUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb246OkNBVEVHT1JZX1NUQVRJU1RJQ0FMLAoJCQkJCQkJCQkJCQkgJ2Z1bmN0aW9uQ2FsbCcJCT0+CSdQSFBFeGNlbF9DYWxjdWxhdGlvbl9TdGF0aXN0aWNhbDo6U1RERVYnLAoJCQkJCQkJCQkJCQkgJ2FyZ3VtZW50Q291bnQnCT0+CScxKycKCQkJCQkJCQkJCQkJKSwKCQkJCSdTVERFVkEnCQkJCT0+IGFycmF5KCdjYXRlZ29yeScJCQk9PglQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbjo6Q0FURUdPUllfU1RBVElTVElDQUwsCgkJCQkJCQkJCQkJCSAnZnVuY3Rpb25DYWxsJwkJPT4JJ1BIUEV4Y2VsX0NhbGN1bGF0aW9uX1N0YXRpc3RpY2FsOjpTVERFVkEnLAoJCQkJCQkJCQkJCQkgJ2FyZ3VtZW50Q291bnQnCT0+CScxKycKCQkJCQkJCQkJCQkJKSwKCQkJCSdTVERFVlAnCQkJCT0+IGFycmF5KCdjYXRlZ29yeScJCQk9PglQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbjo6Q0FURUdPUllfU1RBVElTVElDQUwsCgkJCQkJCQkJCQkJCSAnZnVuY3Rpb25DYWxsJwkJPT4JJ1BIUEV4Y2VsX0NhbGN1bGF0aW9uX1N0YXRpc3RpY2FsOjpTVERFVlAnLAoJCQkJCQkJCQkJCQkgJ2FyZ3VtZW50Q291bnQnCT0+CScxKycKCQkJCQkJCQkJCQkJKSwKCQkJCSdTVERFVlBBJwkJCQk9PiBhcnJheSgnY2F0ZWdvcnknCQkJPT4JUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb246OkNBVEVHT1JZX1NUQVRJU1RJQ0FMLAoJCQkJCQkJCQkJCQkgJ2Z1bmN0aW9uQ2FsbCcJCT0+CSdQSFBFeGNlbF9DYWxjdWxhdGlvbl9TdGF0aXN0aWNhbDo6U1RERVZQQScsCgkJCQkJCQkJCQkJCSAnYXJndW1lbnRDb3VudCcJPT4JJzErJwoJCQkJCQkJCQkJCQkpLAoJCQkJJ1NURVlYJwkJCQkJPT4gYXJyYXkoJ2NhdGVnb3J5JwkJCT0+CVBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uOjpDQVRFR09SWV9TVEFUSVNUSUNBTCwKCQkJCQkJCQkJCQkJICdmdW5jdGlvbkNhbGwnCQk9PgknUEhQRXhjZWxfQ2FsY3VsYXRpb25fU3RhdGlzdGljYWw6OlNURVlYJywKCQkJCQkJCQkJCQkJICdhcmd1bWVudENvdW50Jwk9PgknMicKCQkJCQkJCQkJCQkJKSwKCQkJCSdTVUJTVElUVVRFJwkJCT0+IGFycmF5KCdjYXRlZ29yeScJCQk9PglQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbjo6Q0FURUdPUllfVEVYVF9BTkRfREFUQSwKCQkJCQkJCQkJCQkJICdmdW5jdGlvbkNhbGwnCQk9PgknUEhQRXhjZWxfQ2FsY3VsYXRpb25fVGV4dERhdGE6OlNVQlNUSVRVVEUnLAoJCQkJCQkJCQkJCQkgJ2FyZ3VtZW50Q291bnQnCT0+CSczLDQnCgkJCQkJCQkJCQkJCSksCgkJCQknU1VCVE9UQUwnCQkJCT0+IGFycmF5KCdjYXRlZ29yeScJCQk9PglQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbjo6Q0FURUdPUllfTUFUSF9BTkRfVFJJRywKCQkJCQkJCQkJCQkJICdmdW5jdGlvbkNhbGwnCQk9PgknUEhQRXhjZWxfQ2FsY3VsYXRpb25fTWF0aFRyaWc6OlNVQlRPVEFMJywKCQkJCQkJCQkJCQkJICdhcmd1bWVudENvdW50Jwk9PgknMisnCgkJCQkJCQkJCQkJCSksCgkJCQknU1VNJwkJCQkJPT4gYXJyYXkoJ2NhdGVnb3J5JwkJCT0+CVBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uOjpDQVRFR09SWV9NQVRIX0FORF9UUklHLAoJCQkJCQkJCQkJCQkgJ2Z1bmN0aW9uQ2FsbCcJCT0+CSdQSFBFeGNlbF9DYWxjdWxhdGlvbl9NYXRoVHJpZzo6U1VNJywKCQkJCQkJCQkJCQkJICdhcmd1bWVudENvdW50Jwk9PgknMSsnCgkJCQkJCQkJCQkJCSksCgkJCQknU1VNSUYnCQkJCQk9PiBhcnJheSgnY2F0ZWdvcnknCQkJPT4JUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb246OkNBVEVHT1JZX01BVEhfQU5EX1RSSUcsCgkJCQkJCQkJCQkJCSAnZnVuY3Rpb25DYWxsJwkJPT4JJ1BIUEV4Y2VsX0NhbGN1bGF0aW9uX01hdGhUcmlnOjpTVU1JRicsCgkJCQkJCQkJCQkJCSAnYXJndW1lbnRDb3VudCcJPT4JJzIsMycKCQkJCQkJCQkJCQkJKSwKCQkJCSdTVU1JRlMnCQkJCT0+IGFycmF5KCdjYXRlZ29yeScJCQk9PglQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbjo6Q0FURUdPUllfTUFUSF9BTkRfVFJJRywKCQkJCQkJCQkJCQkJICdmdW5jdGlvbkNhbGwnCQk9PgknUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpEVU1NWScsCgkJCQkJCQkJCQkJCSAnYXJndW1lbnRDb3VudCcJPT4JJz8nCgkJCQkJCQkJCQkJCSksCgkJCQknU1VNUFJPRFVDVCcJCQk9PiBhcnJheSgnY2F0ZWdvcnknCQkJPT4JUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb246OkNBVEVHT1JZX01BVEhfQU5EX1RSSUcsCgkJCQkJCQkJCQkJCSAnZnVuY3Rpb25DYWxsJwkJPT4JJ1BIUEV4Y2VsX0NhbGN1bGF0aW9uX01hdGhUcmlnOjpTVU1QUk9EVUNUJywKCQkJCQkJCQkJCQkJICdhcmd1bWVudENvdW50Jwk9PgknMSsnCgkJCQkJCQkJCQkJCSksCgkJCQknU1VNU1EnCQkJCQk9PiBhcnJheSgnY2F0ZWdvcnknCQkJPT4JUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb246OkNBVEVHT1JZX01BVEhfQU5EX1RSSUcsCgkJCQkJCQkJCQkJCSAnZnVuY3Rpb25DYWxsJwkJPT4JJ1BIUEV4Y2VsX0NhbGN1bGF0aW9uX01hdGhUcmlnOjpTVU1TUScsCgkJCQkJCQkJCQkJCSAnYXJndW1lbnRDb3VudCcJPT4JJzErJwoJCQkJCQkJCQkJCQkpLAoJCQkJJ1NVTVgyTVkyJwkJCQk9PiBhcnJheSgnY2F0ZWdvcnknCQkJPT4JUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb246OkNBVEVHT1JZX01BVEhfQU5EX1RSSUcsCgkJCQkJCQkJCQkJCSAnZnVuY3Rpb25DYWxsJwkJPT4JJ1BIUEV4Y2VsX0NhbGN1bGF0aW9uX01hdGhUcmlnOjpTVU1YMk1ZMicsCgkJCQkJCQkJCQkJCSAnYXJndW1lbnRDb3VudCcJPT4JJzInCgkJCQkJCQkJCQkJCSksCgkJCQknU1VNWDJQWTInCQkJCT0+IGFycmF5KCdjYXRlZ29yeScJCQk9PglQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbjo6Q0FURUdPUllfTUFUSF9BTkRfVFJJRywKCQkJCQkJCQkJCQkJICdmdW5jdGlvbkNhbGwnCQk9PgknUEhQRXhjZWxfQ2FsY3VsYXRpb25fTWF0aFRyaWc6OlNVTVgyUFkyJywKCQkJCQkJCQkJCQkJICdhcmd1bWVudENvdW50Jwk9PgknMicKCQkJCQkJCQkJCQkJKSwKCQkJCSdTVU1YTVkyJwkJCQk9PiBhcnJheSgnY2F0ZWdvcnknCQkJPT4JUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb246OkNBVEVHT1JZX01BVEhfQU5EX1RSSUcsCgkJCQkJCQkJCQkJCSAnZnVuY3Rpb25DYWxsJwkJPT4JJ1BIUEV4Y2VsX0NhbGN1bGF0aW9uX01hdGhUcmlnOjpTVU1YTVkyJywKCQkJCQkJCQkJCQkJICdhcmd1bWVudENvdW50Jwk9PgknMicKCQkJCQkJCQkJCQkJKSwKCQkJCSdTWUQnCQkJCQk9PiBhcnJheSgnY2F0ZWdvcnknCQkJPT4JUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb246OkNBVEVHT1JZX0ZJTkFOQ0lBTCwKCQkJCQkJCQkJCQkJICdmdW5jdGlvbkNhbGwnCQk9PgknUEhQRXhjZWxfQ2FsY3VsYXRpb25fRmluYW5jaWFsOjpTWUQnLAoJCQkJCQkJCQkJCQkgJ2FyZ3VtZW50Q291bnQnCT0+CSc0JwoJCQkJCQkJCQkJCQkpLAoJCQkJJ1QnCQkJCQkJPT4gYXJyYXkoJ2NhdGVnb3J5JwkJCT0+CVBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uOjpDQVRFR09SWV9URVhUX0FORF9EQVRBLAoJCQkJCQkJCQkJCQkgJ2Z1bmN0aW9uQ2FsbCcJCT0+CSdQSFBFeGNlbF9DYWxjdWxhdGlvbl9UZXh0RGF0YTo6UkVUVVJOU1RSSU5HJywKCQkJCQkJCQkJCQkJICdhcmd1bWVudENvdW50Jwk9PgknMScKCQkJCQkJCQkJCQkJKSwKCQkJCSdUQU4nCQkJCQk9PiBhcnJheSgnY2F0ZWdvcnknCQkJPT4JUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb246OkNBVEVHT1JZX01BVEhfQU5EX1RSSUcsCgkJCQkJCQkJCQkJCSAnZnVuY3Rpb25DYWxsJwkJPT4JJ3RhbicsCgkJCQkJCQkJCQkJCSAnYXJndW1lbnRDb3VudCcJPT4JJzEnCgkJCQkJCQkJCQkJCSksCgkJCQknVEFOSCcJCQkJCT0+IGFycmF5KCdjYXRlZ29yeScJCQk9PglQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbjo6Q0FURUdPUllfTUFUSF9BTkRfVFJJRywKCQkJCQkJCQkJCQkJICdmdW5jdGlvbkNhbGwnCQk9PgkndGFuaCcsCgkJCQkJCQkJCQkJCSAnYXJndW1lbnRDb3VudCcJPT4JJzEnCgkJCQkJCQkJCQkJCSksCgkJCQknVEJJTExFUScJCQkJPT4gYXJyYXkoJ2NhdGVnb3J5JwkJCT0+CVBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uOjpDQVRFR09SWV9GSU5BTkNJQUwsCgkJCQkJCQkJCQkJCSAnZnVuY3Rpb25DYWxsJwkJPT4JJ1BIUEV4Y2VsX0NhbGN1bGF0aW9uX0ZpbmFuY2lhbDo6VEJJTExFUScsCgkJCQkJCQkJCQkJCSAnYXJndW1lbnRDb3VudCcJPT4JJzMnCgkJCQkJCQkJCQkJCSksCgkJCQknVEJJTExQUklDRScJCQk9PiBhcnJheSgnY2F0ZWdvcnknCQkJPT4JUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb246OkNBVEVHT1JZX0ZJTkFOQ0lBTCwKCQkJCQkJCQkJCQkJICdmdW5jdGlvbkNhbGwnCQk9PgknUEhQRXhjZWxfQ2FsY3VsYXRpb25fRmluYW5jaWFsOjpUQklMTFBSSUNFJywKCQkJCQkJCQkJCQkJICdhcmd1bWVudENvdW50Jwk9PgknMycKCQkJCQkJCQkJCQkJKSwKCQkJCSdUQklMTFlJRUxEJwkJCT0+IGFycmF5KCdjYXRlZ29yeScJCQk9PglQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbjo6Q0FURUdPUllfRklOQU5DSUFMLAoJCQkJCQkJCQkJCQkgJ2Z1bmN0aW9uQ2FsbCcJCT0+CSdQSFBFeGNlbF9DYWxjdWxhdGlvbl9GaW5hbmNpYWw6OlRCSUxMWUlFTEQnLAoJCQkJCQkJCQkJCQkgJ2FyZ3VtZW50Q291bnQnCT0+CSczJwoJCQkJCQkJCQkJCQkpLAoJCQkJJ1RESVNUJwkJCQkJPT4gYXJyYXkoJ2NhdGVnb3J5JwkJCT0+CVBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uOjpDQVRFR09SWV9TVEFUSVNUSUNBTCwKCQkJCQkJCQkJCQkJICdmdW5jdGlvbkNhbGwnCQk9PgknUEhQRXhjZWxfQ2FsY3VsYXRpb25fU3RhdGlzdGljYWw6OlRESVNUJywKCQkJCQkJCQkJCQkJICdhcmd1bWVudENvdW50Jwk9PgknMycKCQkJCQkJCQkJCQkJKSwKCQkJCSdURVhUJwkJCQkJPT4gYXJyYXkoJ2NhdGVnb3J5JwkJCT0+CVBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uOjpDQVRFR09SWV9URVhUX0FORF9EQVRBLAoJCQkJCQkJCQkJCQkgJ2Z1bmN0aW9uQ2FsbCcJCT0+CSdQSFBFeGNlbF9DYWxjdWxhdGlvbl9UZXh0RGF0YTo6VEVYVEZPUk1BVCcsCgkJCQkJCQkJCQkJCSAnYXJndW1lbnRDb3VudCcJPT4JJzInCgkJCQkJCQkJCQkJCSksCgkJCQknVElNRScJCQkJCT0+IGFycmF5KCdjYXRlZ29yeScJCQk9PglQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbjo6Q0FURUdPUllfREFURV9BTkRfVElNRSwKCQkJCQkJCQkJCQkJICdmdW5jdGlvbkNhbGwnCQk9PgknUEhQRXhjZWxfQ2FsY3VsYXRpb25fRGF0ZVRpbWU6OlRJTUUnLAoJCQkJCQkJCQkJCQkgJ2FyZ3VtZW50Q291bnQnCT0+CSczJwoJCQkJCQkJCQkJCQkpLAoJCQkJJ1RJTUVWQUxVRScJCQkJPT4gYXJyYXkoJ2NhdGVnb3J5JwkJCT0+CVBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uOjpDQVRFR09SWV9EQVRFX0FORF9USU1FLAoJCQkJCQkJCQkJCQkgJ2Z1bmN0aW9uQ2FsbCcJCT0+CSdQSFBFeGNlbF9DYWxjdWxhdGlvbl9EYXRlVGltZTo6VElNRVZBTFVFJywKCQkJCQkJCQkJCQkJICdhcmd1bWVudENvdW50Jwk9PgknMScKCQkJCQkJCQkJCQkJKSwKCQkJCSdUSU5WJwkJCQkJPT4gYXJyYXkoJ2NhdGVnb3J5JwkJCT0+CVBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uOjpDQVRFR09SWV9TVEFUSVNUSUNBTCwKCQkJCQkJCQkJCQkJICdmdW5jdGlvbkNhbGwnCQk9PgknUEhQRXhjZWxfQ2FsY3VsYXRpb25fU3RhdGlzdGljYWw6OlRJTlYnLAoJCQkJCQkJCQkJCQkgJ2FyZ3VtZW50Q291bnQnCT0+CScyJwoJCQkJCQkJCQkJCQkpLAoJCQkJJ1RPREFZJwkJCQkJPT4gYXJyYXkoJ2NhdGVnb3J5JwkJCT0+CVBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uOjpDQVRFR09SWV9EQVRFX0FORF9USU1FLAoJCQkJCQkJCQkJCQkgJ2Z1bmN0aW9uQ2FsbCcJCT0+CSdQSFBFeGNlbF9DYWxjdWxhdGlvbl9EYXRlVGltZTo6REFURU5PVycsCgkJCQkJCQkJCQkJCSAnYXJndW1lbnRDb3VudCcJPT4JJzAnCgkJCQkJCQkJCQkJCSksCgkJCQknVFJBTlNQT1NFJwkJCQk9PiBhcnJheSgnY2F0ZWdvcnknCQkJPT4JUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb246OkNBVEVHT1JZX0xPT0tVUF9BTkRfUkVGRVJFTkNFLAoJCQkJCQkJCQkJCQkgJ2Z1bmN0aW9uQ2FsbCcJCT0+CSdQSFBFeGNlbF9DYWxjdWxhdGlvbl9Mb29rdXBSZWY6OlRSQU5TUE9TRScsCgkJCQkJCQkJCQkJCSAnYXJndW1lbnRDb3VudCcJPT4JJzEnCgkJCQkJCQkJCQkJCSksCgkJCQknVFJFTkQnCQkJCQk9PiBhcnJheSgnY2F0ZWdvcnknCQkJPT4JUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb246OkNBVEVHT1JZX1NUQVRJU1RJQ0FMLAoJCQkJCQkJCQkJCQkgJ2Z1bmN0aW9uQ2FsbCcJCT0+CSdQSFBFeGNlbF9DYWxjdWxhdGlvbl9TdGF0aXN0aWNhbDo6VFJFTkQnLAoJCQkJCQkJCQkJCQkgJ2FyZ3VtZW50Q291bnQnCT0+CScxLTQnCgkJCQkJCQkJCQkJCSksCgkJCQknVFJJTScJCQkJCT0+IGFycmF5KCdjYXRlZ29yeScJCQk9PglQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbjo6Q0FURUdPUllfVEVYVF9BTkRfREFUQSwKCQkJCQkJCQkJCQkJICdmdW5jdGlvbkNhbGwnCQk9PgknUEhQRXhjZWxfQ2FsY3VsYXRpb25fVGV4dERhdGE6OlRSSU1TUEFDRVMnLAoJCQkJCQkJCQkJCQkgJ2FyZ3VtZW50Q291bnQnCT0+CScxJwoJCQkJCQkJCQkJCQkpLAoJCQkJJ1RSSU1NRUFOJwkJCQk9PiBhcnJheSgnY2F0ZWdvcnknCQkJPT4JUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb246OkNBVEVHT1JZX1NUQVRJU1RJQ0FMLAoJCQkJCQkJCQkJCQkgJ2Z1bmN0aW9uQ2FsbCcJCT0+CSdQSFBFeGNlbF9DYWxjdWxhdGlvbl9TdGF0aXN0aWNhbDo6VFJJTU1FQU4nLAoJCQkJCQkJCQkJCQkgJ2FyZ3VtZW50Q291bnQnCT0+CScyJwoJCQkJCQkJCQkJCQkpLAoJCQkJJ1RSVUUnCQkJCQk9PiBhcnJheSgnY2F0ZWdvcnknCQkJPT4JUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb246OkNBVEVHT1JZX0xPR0lDQUwsCgkJCQkJCQkJCQkJCSAnZnVuY3Rpb25DYWxsJwkJPT4JJ1BIUEV4Y2VsX0NhbGN1bGF0aW9uX0xvZ2ljYWw6OlRSVUUnLAoJCQkJCQkJCQkJCQkgJ2FyZ3VtZW50Q291bnQnCT0+CScwJwoJCQkJCQkJCQkJCQkpLAoJCQkJJ1RSVU5DJwkJCQkJPT4gYXJyYXkoJ2NhdGVnb3J5JwkJCT0+CVBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uOjpDQVRFR09SWV9NQVRIX0FORF9UUklHLAoJCQkJCQkJCQkJCQkgJ2Z1bmN0aW9uQ2FsbCcJCT0+CSdQSFBFeGNlbF9DYWxjdWxhdGlvbl9NYXRoVHJpZzo6VFJVTkMnLAoJCQkJCQkJCQkJCQkgJ2FyZ3VtZW50Q291bnQnCT0+CScxLDInCgkJCQkJCQkJCQkJCSksCgkJCQknVFRFU1QnCQkJCQk9PiBhcnJheSgnY2F0ZWdvcnknCQkJPT4JUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb246OkNBVEVHT1JZX1NUQVRJU1RJQ0FMLAoJCQkJCQkJCQkJCQkgJ2Z1bmN0aW9uQ2FsbCcJCT0+CSdQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OkRVTU1ZJywKCQkJCQkJCQkJCQkJICdhcmd1bWVudENvdW50Jwk9PgknNCcKCQkJCQkJCQkJCQkJKSwKCQkJCSdUWVBFJwkJCQkJPT4gYXJyYXkoJ2NhdGVnb3J5JwkJCT0+CVBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uOjpDQVRFR09SWV9JTkZPUk1BVElPTiwKCQkJCQkJCQkJCQkJICdmdW5jdGlvbkNhbGwnCQk9PgknUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpUWVBFJywKCQkJCQkJCQkJCQkJICdhcmd1bWVudENvdW50Jwk9PgknMScKCQkJCQkJCQkJCQkJKSwKCQkJCSdVUFBFUicJCQkJCT0+IGFycmF5KCdjYXRlZ29yeScJCQk9PglQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbjo6Q0FURUdPUllfVEVYVF9BTkRfREFUQSwKCQkJCQkJCQkJCQkJICdmdW5jdGlvbkNhbGwnCQk9PgknUEhQRXhjZWxfQ2FsY3VsYXRpb25fVGV4dERhdGE6OlVQUEVSQ0FTRScsCgkJCQkJCQkJCQkJCSAnYXJndW1lbnRDb3VudCcJPT4JJzEnCgkJCQkJCQkJCQkJCSksCgkJCQknVVNET0xMQVInCQkJCT0+IGFycmF5KCdjYXRlZ29yeScJCQk9PglQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbjo6Q0FURUdPUllfRklOQU5DSUFMLAoJCQkJCQkJCQkJCQkgJ2Z1bmN0aW9uQ2FsbCcJCT0+CSdQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OkRVTU1ZJywKCQkJCQkJCQkJCQkJICdhcmd1bWVudENvdW50Jwk9PgknMicKCQkJCQkJCQkJCQkJKSwKCQkJCSdWQUxVRScJCQkJCT0+IGFycmF5KCdjYXRlZ29yeScJCQk9PglQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbjo6Q0FURUdPUllfVEVYVF9BTkRfREFUQSwKCQkJCQkJCQkJCQkJICdmdW5jdGlvbkNhbGwnCQk9PgknUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpEVU1NWScsCgkJCQkJCQkJCQkJCSAnYXJndW1lbnRDb3VudCcJPT4JJzEnCgkJCQkJCQkJCQkJCSksCgkJCQknVkFSJwkJCQkJPT4gYXJyYXkoJ2NhdGVnb3J5JwkJCT0+CVBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uOjpDQVRFR09SWV9TVEFUSVNUSUNBTCwKCQkJCQkJCQkJCQkJICdmdW5jdGlvbkNhbGwnCQk9PgknUEhQRXhjZWxfQ2FsY3VsYXRpb25fU3RhdGlzdGljYWw6OlZBUkZ1bmMnLAoJCQkJCQkJCQkJCQkgJ2FyZ3VtZW50Q291bnQnCT0+CScxKycKCQkJCQkJCQkJCQkJKSwKCQkJCSdWQVJBJwkJCQkJPT4gYXJyYXkoJ2NhdGVnb3J5JwkJCT0+CVBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uOjpDQVRFR09SWV9TVEFUSVNUSUNBTCwKCQkJCQkJCQkJCQkJICdmdW5jdGlvbkNhbGwnCQk9PgknUEhQRXhjZWxfQ2FsY3VsYXRpb25fU3RhdGlzdGljYWw6OlZBUkEnLAoJCQkJCQkJCQkJCQkgJ2FyZ3VtZW50Q291bnQnCT0+CScxKycKCQkJCQkJCQkJCQkJKSwKCQkJCSdWQVJQJwkJCQkJPT4gYXJyYXkoJ2NhdGVnb3J5JwkJCT0+CVBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uOjpDQVRFR09SWV9TVEFUSVNUSUNBTCwKCQkJCQkJCQkJCQkJICdmdW5jdGlvbkNhbGwnCQk9PgknUEhQRXhjZWxfQ2FsY3VsYXRpb25fU3RhdGlzdGljYWw6OlZBUlAnLAoJCQkJCQkJCQkJCQkgJ2FyZ3VtZW50Q291bnQnCT0+CScxKycKCQkJCQkJCQkJCQkJKSwKCQkJCSdWQVJQQScJCQkJCT0+IGFycmF5KCdjYXRlZ29yeScJCQk9PglQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbjo6Q0FURUdPUllfU1RBVElTVElDQUwsCgkJCQkJCQkJCQkJCSAnZnVuY3Rpb25DYWxsJwkJPT4JJ1BIUEV4Y2VsX0NhbGN1bGF0aW9uX1N0YXRpc3RpY2FsOjpWQVJQQScsCgkJCQkJCQkJCQkJCSAnYXJndW1lbnRDb3VudCcJPT4JJzErJwoJCQkJCQkJCQkJCQkpLAoJCQkJJ1ZEQicJCQkJCT0+IGFycmF5KCdjYXRlZ29yeScJCQk9PglQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbjo6Q0FURUdPUllfRklOQU5DSUFMLAoJCQkJCQkJCQkJCQkgJ2Z1bmN0aW9uQ2FsbCcJCT0+CSdQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OkRVTU1ZJywKCQkJCQkJCQkJCQkJICdhcmd1bWVudENvdW50Jwk9PgknNS03JwoJCQkJCQkJCQkJCQkpLAoJCQkJJ1ZFUlNJT04nCQkJCT0+IGFycmF5KCdjYXRlZ29yeScJCQk9PglQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbjo6Q0FURUdPUllfSU5GT1JNQVRJT04sCgkJCQkJCQkJCQkJCSAnZnVuY3Rpb25DYWxsJwkJPT4JJ1BIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6VkVSU0lPTicsCgkJCQkJCQkJCQkJCSAnYXJndW1lbnRDb3VudCcJPT4JJzAnCgkJCQkJCQkJCQkJCSksCgkJCQknVkxPT0tVUCcJCQkJPT4gYXJyYXkoJ2NhdGVnb3J5JwkJCT0+CVBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uOjpDQVRFR09SWV9MT09LVVBfQU5EX1JFRkVSRU5DRSwKCQkJCQkJCQkJCQkJICdmdW5jdGlvbkNhbGwnCQk9PgknUEhQRXhjZWxfQ2FsY3VsYXRpb25fTG9va3VwUmVmOjpWTE9PS1VQJywKCQkJCQkJCQkJCQkJICdhcmd1bWVudENvdW50Jwk9PgknMyw0JwoJCQkJCQkJCQkJCQkpLAoJCQkJJ1dFRUtEQVknCQkJCT0+IGFycmF5KCdjYXRlZ29yeScJCQk9PglQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbjo6Q0FURUdPUllfREFURV9BTkRfVElNRSwKCQkJCQkJCQkJCQkJICdmdW5jdGlvbkNhbGwnCQk9PgknUEhQRXhjZWxfQ2FsY3VsYXRpb25fRGF0ZVRpbWU6OkRBWU9GV0VFSycsCgkJCQkJCQkJCQkJCSAnYXJndW1lbnRDb3VudCcJPT4JJzEsMicKCQkJCQkJCQkJCQkJKSwKCQkJCSdXRUVLTlVNJwkJCQk9PiBhcnJheSgnY2F0ZWdvcnknCQkJPT4JUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb246OkNBVEVHT1JZX0RBVEVfQU5EX1RJTUUsCgkJCQkJCQkJCQkJCSAnZnVuY3Rpb25DYWxsJwkJPT4JJ1BIUEV4Y2VsX0NhbGN1bGF0aW9uX0RhdGVUaW1lOjpXRUVLT0ZZRUFSJywKCQkJCQkJCQkJCQkJICdhcmd1bWVudENvdW50Jwk9PgknMSwyJwoJCQkJCQkJCQkJCQkpLAoJCQkJJ1dFSUJVTEwnCQkJCT0+IGFycmF5KCdjYXRlZ29yeScJCQk9PglQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbjo6Q0FURUdPUllfU1RBVElTVElDQUwsCgkJCQkJCQkJCQkJCSAnZnVuY3Rpb25DYWxsJwkJPT4JJ1BIUEV4Y2VsX0NhbGN1bGF0aW9uX1N0YXRpc3RpY2FsOjpXRUlCVUxMJywKCQkJCQkJCQkJCQkJICdhcmd1bWVudENvdW50Jwk9PgknNCcKCQkJCQkJCQkJCQkJKSwKCQkJCSdXT1JLREFZJwkJCQk9PiBhcnJheSgnY2F0ZWdvcnknCQkJPT4JUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb246OkNBVEVHT1JZX0RBVEVfQU5EX1RJTUUsCgkJCQkJCQkJCQkJCSAnZnVuY3Rpb25DYWxsJwkJPT4JJ1BIUEV4Y2VsX0NhbGN1bGF0aW9uX0RhdGVUaW1lOjpXT1JLREFZJywKCQkJCQkJCQkJCQkJICdhcmd1bWVudENvdW50Jwk9PgknMisnCgkJCQkJCQkJCQkJCSksCgkJCQknWElSUicJCQkJCT0+IGFycmF5KCdjYXRlZ29yeScJCQk9PglQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbjo6Q0FURUdPUllfRklOQU5DSUFMLAoJCQkJCQkJCQkJCQkgJ2Z1bmN0aW9uQ2FsbCcJCT0+CSdQSFBFeGNlbF9DYWxjdWxhdGlvbl9GaW5hbmNpYWw6OlhJUlInLAoJCQkJCQkJCQkJCQkgJ2FyZ3VtZW50Q291bnQnCT0+CScyLDMnCgkJCQkJCQkJCQkJCSksCgkJCQknWE5QVicJCQkJCT0+IGFycmF5KCdjYXRlZ29yeScJCQk9PglQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbjo6Q0FURUdPUllfRklOQU5DSUFMLAoJCQkJCQkJCQkJCQkgJ2Z1bmN0aW9uQ2FsbCcJCT0+CSdQSFBFeGNlbF9DYWxjdWxhdGlvbl9GaW5hbmNpYWw6OlhOUFYnLAoJCQkJCQkJCQkJCQkgJ2FyZ3VtZW50Q291bnQnCT0+CSczJwoJCQkJCQkJCQkJCQkpLAoJCQkJJ1lFQVInCQkJCQk9PiBhcnJheSgnY2F0ZWdvcnknCQkJPT4JUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb246OkNBVEVHT1JZX0RBVEVfQU5EX1RJTUUsCgkJCQkJCQkJCQkJCSAnZnVuY3Rpb25DYWxsJwkJPT4JJ1BIUEV4Y2VsX0NhbGN1bGF0aW9uX0RhdGVUaW1lOjpZRUFSJywKCQkJCQkJCQkJCQkJICdhcmd1bWVudENvdW50Jwk9PgknMScKCQkJCQkJCQkJCQkJKSwKCQkJCSdZRUFSRlJBQycJCQkJPT4gYXJyYXkoJ2NhdGVnb3J5JwkJCT0+CVBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uOjpDQVRFR09SWV9EQVRFX0FORF9USU1FLAoJCQkJCQkJCQkJCQkgJ2Z1bmN0aW9uQ2FsbCcJCT0+CSdQSFBFeGNlbF9DYWxjdWxhdGlvbl9EYXRlVGltZTo6WUVBUkZSQUMnLAoJCQkJCQkJCQkJCQkgJ2FyZ3VtZW50Q291bnQnCT0+CScyLDMnCgkJCQkJCQkJCQkJCSksCgkJCQknWUlFTEQnCQkJCQk9PiBhcnJheSgnY2F0ZWdvcnknCQkJPT4JUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb246OkNBVEVHT1JZX0ZJTkFOQ0lBTCwKCQkJCQkJCQkJCQkJICdmdW5jdGlvbkNhbGwnCQk9PgknUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpEVU1NWScsCgkJCQkJCQkJCQkJCSAnYXJndW1lbnRDb3VudCcJPT4JJzYsNycKCQkJCQkJCQkJCQkJKSwKCQkJCSdZSUVMRERJU0MnCQkJCT0+IGFycmF5KCdjYXRlZ29yeScJCQk9PglQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbjo6Q0FURUdPUllfRklOQU5DSUFMLAoJCQkJCQkJCQkJCQkgJ2Z1bmN0aW9uQ2FsbCcJCT0+CSdQSFBFeGNlbF9DYWxjdWxhdGlvbl9GaW5hbmNpYWw6OllJRUxERElTQycsCgkJCQkJCQkJCQkJCSAnYXJndW1lbnRDb3VudCcJPT4JJzQsNScKCQkJCQkJCQkJCQkJKSwKCQkJCSdZSUVMRE1BVCcJCQkJPT4gYXJyYXkoJ2NhdGVnb3J5JwkJCT0+CVBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uOjpDQVRFR09SWV9GSU5BTkNJQUwsCgkJCQkJCQkJCQkJCSAnZnVuY3Rpb25DYWxsJwkJPT4JJ1BIUEV4Y2VsX0NhbGN1bGF0aW9uX0ZpbmFuY2lhbDo6WUlFTERNQVQnLAoJCQkJCQkJCQkJCQkgJ2FyZ3VtZW50Q291bnQnCT0+CSc1LDYnCgkJCQkJCQkJCQkJCSksCgkJCQknWlRFU1QnCQkJCQk9PiBhcnJheSgnY2F0ZWdvcnknCQkJPT4JUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb246OkNBVEVHT1JZX1NUQVRJU1RJQ0FMLAoJCQkJCQkJCQkJCQkgJ2Z1bmN0aW9uQ2FsbCcJCT0+CSdQSFBFeGNlbF9DYWxjdWxhdGlvbl9TdGF0aXN0aWNhbDo6WlRFU1QnLAoJCQkJCQkJCQkJCQkgJ2FyZ3VtZW50Q291bnQnCT0+CScyLTMnCgkJCQkJCQkJCQkJCSkKCQkJKTsKCgoJLy8JSW50ZXJuYWwgZnVuY3Rpb25zIHVzZWQgZm9yIHNwZWNpYWwgY29udHJvbCBwdXJwb3NlcwoJcHJpdmF0ZSBzdGF0aWMgJF9jb250cm9sRnVuY3Rpb25zID0gYXJyYXkoCgkJCQknTUtNQVRSSVgnCT0+IGFycmF5KCdhcmd1bWVudENvdW50Jwk9PgknKicsCgkJCQkJCQkJCSAnZnVuY3Rpb25DYWxsJwkJPT4JJ3NlbGY6Ol9ta01hdHJpeCcKCQkJCQkJCQkJKQoJCQkpOwoKCgoKCXByaXZhdGUgZnVuY3Rpb24gX19jb25zdHJ1Y3QoKSB7CgkJJGxvY2FsZUZpbGVEaXJlY3RvcnkgPSBQSFBFWENFTF9ST09ULidQSFBFeGNlbC9sb2NhbGUvJzsKCQlmb3JlYWNoIChnbG9iKCRsb2NhbGVGaWxlRGlyZWN0b3J5LicvKicsR0xPQl9PTkxZRElSKSBhcyAkZmlsZW5hbWUpIHsKCQkJJGZpbGVuYW1lID0gc3Vic3RyKCRmaWxlbmFtZSxzdHJsZW4oJGxvY2FsZUZpbGVEaXJlY3RvcnkpKzEpOwoJCQlpZiAoJGZpbGVuYW1lICE9ICdlbicpIHsKCQkJCXNlbGY6OiRfdmFsaWRMb2NhbGVMYW5ndWFnZXNbXSA9ICRmaWxlbmFtZTsKCQkJfQoJCX0KCgkJJHNldFByZWNpc2lvbiA9IChQSFBfSU5UX1NJWkUgPT0gNCkgPyAxMiA6IDE2OwoJCSR0aGlzLT5fc2F2ZWRQcmVjaXNpb24gPSBpbmlfZ2V0KCdwcmVjaXNpb24nKTsKCQlpZiAoJHRoaXMtPl9zYXZlZFByZWNpc2lvbiA8ICRzZXRQcmVjaXNpb24pIHsKCQkJaW5pX3NldCgncHJlY2lzaW9uJywkc2V0UHJlY2lzaW9uKTsKCQl9Cgl9CS8vCWZ1bmN0aW9uIF9fY29uc3RydWN0KCkKCgoJcHVibGljIGZ1bmN0aW9uIF9fZGVzdHJ1Y3QoKSB7CgkJaWYgKCR0aGlzLT5fc2F2ZWRQcmVjaXNpb24gIT0gaW5pX2dldCgncHJlY2lzaW9uJykpIHsKCQkJaW5pX3NldCgncHJlY2lzaW9uJywkdGhpcy0+X3NhdmVkUHJlY2lzaW9uKTsKCQl9Cgl9CgoJLyoqCgkgKiBHZXQgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcwoJICoKCSAqIEBhY2Nlc3MJcHVibGljCgkgKiBAcmV0dXJuIFBIUEV4Y2VsX0NhbGN1bGF0aW9uCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0SW5zdGFuY2UoKSB7CgkJaWYgKCFpc3NldChzZWxmOjokX2luc3RhbmNlKSB8fCAoc2VsZjo6JF9pbnN0YW5jZSA9PT0gTlVMTCkpIHsKCQkJc2VsZjo6JF9pbnN0YW5jZSA9IG5ldyBQSFBFeGNlbF9DYWxjdWxhdGlvbigpOwoJCX0KCgkJcmV0dXJuIHNlbGY6OiRfaW5zdGFuY2U7Cgl9CS8vCWZ1bmN0aW9uIGdldEluc3RhbmNlKCkKCgoJLyoqCgkgKiBGbHVzaCB0aGUgY2FsY3VsYXRpb24gY2FjaGUgZm9yIGFueSBleGlzdGluZyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzCgkgKgkJYnV0IG9ubHkgaWYgYSBQSFBFeGNlbF9DYWxjdWxhdGlvbiBpbnN0YW5jZSBleGlzdHMKCSAqCgkgKiBAYWNjZXNzCXB1YmxpYwoJICogQHJldHVybiBudWxsCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZmx1c2hJbnN0YW5jZSgpIHsKCQlpZiAoaXNzZXQoc2VsZjo6JF9pbnN0YW5jZSkgJiYgKHNlbGY6OiRfaW5zdGFuY2UgIT09IE5VTEwpKSB7CgkJCXNlbGY6OiRfaW5zdGFuY2UtPmNsZWFyQ2FsY3VsYXRpb25DYWNoZSgpOwoJCX0KCX0JLy8JZnVuY3Rpb24gZmx1c2hJbnN0YW5jZSgpCgoKCS8qKgoJICogX19jbG9uZSBpbXBsZW1lbnRhdGlvbi4gQ2xvbmluZyBzaG91bGQgbm90IGJlIGFsbG93ZWQgaW4gYSBTaW5nbGV0b24hCgkgKgoJICogQGFjY2VzcwlwdWJsaWMKCSAqIEB0aHJvd3MJRXhjZXB0aW9uCgkgKi8KCXB1YmxpYyBmaW5hbCBmdW5jdGlvbiBfX2Nsb25lKCkgewoJCXRocm93IG5ldyBFeGNlcHRpb24gKCdDbG9uaW5nIGEgU2luZ2xldG9uIGlzIG5vdCBhbGxvd2VkIScpOwoJfQkvLwlmdW5jdGlvbiBfX2Nsb25lKCkKCgoJLyoqCgkgKiBSZXR1cm4gdGhlIGxvY2FsZS1zcGVjaWZpYyB0cmFuc2xhdGlvbiBvZiBUUlVFCgkgKgoJICogQGFjY2VzcwlwdWJsaWMKCSAqIEByZXR1cm4JIHN0cmluZwkJbG9jYWxlLXNwZWNpZmljIHRyYW5zbGF0aW9uIG9mIFRSVUUKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRUUlVFKCkgewoJCXJldHVybiBzZWxmOjokX2xvY2FsZUJvb2xlYW5bJ1RSVUUnXTsKCX0KCgkvKioKCSAqIFJldHVybiB0aGUgbG9jYWxlLXNwZWNpZmljIHRyYW5zbGF0aW9uIG9mIEZBTFNFCgkgKgoJICogQGFjY2VzcwlwdWJsaWMKCSAqIEByZXR1cm4JIHN0cmluZwkJbG9jYWxlLXNwZWNpZmljIHRyYW5zbGF0aW9uIG9mIEZBTFNFCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0RkFMU0UoKSB7CgkJcmV0dXJuIHNlbGY6OiRfbG9jYWxlQm9vbGVhblsnRkFMU0UnXTsKCX0KCgkvKioKCSAqIFNldCB0aGUgQXJyYXkgUmV0dXJuIFR5cGUgKEFycmF5IG9yIFZhbHVlIG9mIGZpcnN0IGVsZW1lbnQgaW4gdGhlIGFycmF5KQoJICoKCSAqIEBhY2Nlc3MJcHVibGljCgkgKiBAcGFyYW0JIHN0cmluZwkkcmV0dXJuVHlwZQkJCUFycmF5IHJldHVybiB0eXBlCgkgKiBAcmV0dXJuCSBib29sZWFuCQkJCQlTdWNjZXNzIG9yIGZhaWx1cmUKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBzZXRBcnJheVJldHVyblR5cGUoJHJldHVyblR5cGUpIHsKCQlpZiAoKCRyZXR1cm5UeXBlID09IHNlbGY6OlJFVFVSTl9BUlJBWV9BU19WQUxVRSkgfHwKCQkJKCRyZXR1cm5UeXBlID09IHNlbGY6OlJFVFVSTl9BUlJBWV9BU19FUlJPUikgfHwKCQkJKCRyZXR1cm5UeXBlID09IHNlbGY6OlJFVFVSTl9BUlJBWV9BU19BUlJBWSkpIHsKCQkJc2VsZjo6JHJldHVybkFycmF5QXNUeXBlID0gJHJldHVyblR5cGU7CgkJCXJldHVybiB0cnVlOwoJCX0KCQlyZXR1cm4gZmFsc2U7Cgl9CS8vCWZ1bmN0aW9uIHNldEV4Y2VsQ2FsZW5kYXIoKQoKCgkvKioKCSAqIFJldHVybiB0aGUgQXJyYXkgUmV0dXJuIFR5cGUgKEFycmF5IG9yIFZhbHVlIG9mIGZpcnN0IGVsZW1lbnQgaW4gdGhlIGFycmF5KQoJICoKCSAqIEBhY2Nlc3MJcHVibGljCgkgKiBAcmV0dXJuCSBzdHJpbmcJCSRyZXR1cm5UeXBlCQkJQXJyYXkgcmV0dXJuIHR5cGUKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRBcnJheVJldHVyblR5cGUoKSB7CgkJcmV0dXJuIHNlbGY6OiRyZXR1cm5BcnJheUFzVHlwZTsKCX0JLy8JZnVuY3Rpb24gZ2V0RXhjZWxDYWxlbmRhcigpCgoKCS8qKgoJICogSXMgY2FsY3VsYXRpb24gY2FjaGluZyBlbmFibGVkPwoJICoKCSAqIEBhY2Nlc3MJcHVibGljCgkgKiBAcmV0dXJuIGJvb2xlYW4KCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldENhbGN1bGF0aW9uQ2FjaGVFbmFibGVkKCkgewoJCXJldHVybiBzZWxmOjokX2NhbGN1bGF0aW9uQ2FjaGVFbmFibGVkOwoJfQkvLwlmdW5jdGlvbiBnZXRDYWxjdWxhdGlvbkNhY2hlRW5hYmxlZCgpCgoKCS8qKgoJICogRW5hYmxlL2Rpc2FibGUgY2FsY3VsYXRpb24gY2FjaGUKCSAqCgkgKiBAYWNjZXNzCXB1YmxpYwoJICogQHBhcmFtIGJvb2xlYW4gJHBWYWx1ZQoJICovCglwdWJsaWMgZnVuY3Rpb24gc2V0Q2FsY3VsYXRpb25DYWNoZUVuYWJsZWQoJHBWYWx1ZSA9IHRydWUpIHsKCQlzZWxmOjokX2NhbGN1bGF0aW9uQ2FjaGVFbmFibGVkID0gJHBWYWx1ZTsKCQkkdGhpcy0+Y2xlYXJDYWxjdWxhdGlvbkNhY2hlKCk7Cgl9CS8vCWZ1bmN0aW9uIHNldENhbGN1bGF0aW9uQ2FjaGVFbmFibGVkKCkKCgoJLyoqCgkgKiBFbmFibGUgY2FsY3VsYXRpb24gY2FjaGUKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGVuYWJsZUNhbGN1bGF0aW9uQ2FjaGUoKSB7CgkJJHRoaXMtPnNldENhbGN1bGF0aW9uQ2FjaGVFbmFibGVkKHRydWUpOwoJfQkvLwlmdW5jdGlvbiBlbmFibGVDYWxjdWxhdGlvbkNhY2hlKCkKCgoJLyoqCgkgKiBEaXNhYmxlIGNhbGN1bGF0aW9uIGNhY2hlCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBkaXNhYmxlQ2FsY3VsYXRpb25DYWNoZSgpIHsKCQkkdGhpcy0+c2V0Q2FsY3VsYXRpb25DYWNoZUVuYWJsZWQoZmFsc2UpOwoJfQkvLwlmdW5jdGlvbiBkaXNhYmxlQ2FsY3VsYXRpb25DYWNoZSgpCgoKCS8qKgoJICogQ2xlYXIgY2FsY3VsYXRpb24gY2FjaGUKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGNsZWFyQ2FsY3VsYXRpb25DYWNoZSgpIHsKCQlzZWxmOjokX2NhbGN1bGF0aW9uQ2FjaGUgPSBhcnJheSgpOwoJfQkvLwlmdW5jdGlvbiBjbGVhckNhbGN1bGF0aW9uQ2FjaGUoKQoKCgkvKioKCSAqIEdldCBjYWxjdWxhdGlvbiBjYWNoZSBleHBpcmF0aW9uIHRpbWUKCSAqCgkgKiBAcmV0dXJuIGZsb2F0CgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRDYWxjdWxhdGlvbkNhY2hlRXhwaXJhdGlvblRpbWUoKSB7CgkJcmV0dXJuIHNlbGY6OiRfY2FsY3VsYXRpb25DYWNoZUV4cGlyYXRpb25UaW1lOwoJfQkvLwlnZXRDYWxjdWxhdGlvbkNhY2hlRXhwaXJhdGlvblRpbWUoKQoKCgkvKioKCSAqIFNldCBjYWxjdWxhdGlvbiBjYWNoZSBleHBpcmF0aW9uIHRpbWUKCSAqCgkgKiBAcGFyYW0gZmxvYXQgJHBWYWx1ZQoJICovCglwdWJsaWMgZnVuY3Rpb24gc2V0Q2FsY3VsYXRpb25DYWNoZUV4cGlyYXRpb25UaW1lKCRwVmFsdWUgPSAxNSkgewoJCXNlbGY6OiRfY2FsY3VsYXRpb25DYWNoZUV4cGlyYXRpb25UaW1lID0gJHBWYWx1ZTsKCX0JLy8JZnVuY3Rpb24gc2V0Q2FsY3VsYXRpb25DYWNoZUV4cGlyYXRpb25UaW1lKCkKCgoKCgkvKioKCSAqIEdldCB0aGUgY3VycmVudGx5IGRlZmluZWQgbG9jYWxlIGNvZGUKCSAqCgkgKiBAcmV0dXJuIHN0cmluZwoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0TG9jYWxlKCkgewoJCXJldHVybiBzZWxmOjokX2xvY2FsZUxhbmd1YWdlOwoJfQkvLwlmdW5jdGlvbiBnZXRMb2NhbGUoKQoKCgkvKioKCSAqIFNldCB0aGUgbG9jYWxlIGNvZGUKCSAqCgkgKiBAcmV0dXJuIGJvb2xlYW4KCSAqLwoJcHVibGljIGZ1bmN0aW9uIHNldExvY2FsZSgkbG9jYWxlPSdlbl91cycpIHsKCQkvLwlJZGVudGlmeSBvdXIgbG9jYWxlIGFuZCBsYW5ndWFnZQoJCSRsYW5ndWFnZSA9ICRsb2NhbGUgPSBzdHJ0b2xvd2VyKCRsb2NhbGUpOwoJCWlmIChzdHJwb3MoJGxvY2FsZSwnXycpICE9PSBmYWxzZSkgewoJCQlsaXN0KCRsYW5ndWFnZSkgPSBleHBsb2RlKCdfJywkbG9jYWxlKTsKCQl9CgoJCS8vCVRlc3Qgd2hldGhlciB3ZSBoYXZlIGFueSBsYW5ndWFnZSBkYXRhIGZvciB0aGlzIGxhbmd1YWdlIChhbnkgbG9jYWxlKQoJCWlmIChpbl9hcnJheSgkbGFuZ3VhZ2Usc2VsZjo6JF92YWxpZExvY2FsZUxhbmd1YWdlcykpIHsKCQkJLy8JaW5pdGlhbGlzZSBsYW5ndWFnZS9sb2NhbGUgc2V0dGluZ3MKCQkJc2VsZjo6JF9sb2NhbGVGdW5jdGlvbnMgPSBhcnJheSgpOwoJCQlzZWxmOjokX2xvY2FsZUFyZ3VtZW50U2VwYXJhdG9yID0gJywnOwoJCQlzZWxmOjokX2xvY2FsZUJvb2xlYW4gPSBhcnJheSgnVFJVRScgPT4gJ1RSVUUnLCAnRkFMU0UnID0+ICdGQUxTRScsICdOVUxMJyA9PiAnTlVMTCcpOwoJCQkvLwlEZWZhdWx0IGlzIEVuZ2xpc2gsIGlmIHVzZXIgaXNuJ3QgcmVxdWVzdGluZyBlbmdsaXNoLCB0aGVuIHJlYWQgdGhlIG5lY2Vzc2FyeSBkYXRhIGZyb20gdGhlIGxvY2FsZSBmaWxlcwoJCQlpZiAoJGxvY2FsZSAhPSAnZW5fdXMnKSB7CgkJCQkvLwlTZWFyY2ggZm9yIGEgZmlsZSB3aXRoIGEgbGlzdCBvZiBmdW5jdGlvbiBuYW1lcyBmb3IgbG9jYWxlCgkJCQkkZnVuY3Rpb25OYW1lc0ZpbGUgPSBQSFBFWENFTF9ST09UIC4gJ1BIUEV4Y2VsJy5ESVJFQ1RPUllfU0VQQVJBVE9SLidsb2NhbGUnLkRJUkVDVE9SWV9TRVBBUkFUT1Iuc3RyX3JlcGxhY2UoJ18nLERJUkVDVE9SWV9TRVBBUkFUT1IsJGxvY2FsZSkuRElSRUNUT1JZX1NFUEFSQVRPUi4nZnVuY3Rpb25zJzsKCQkJCWlmICghZmlsZV9leGlzdHMoJGZ1bmN0aW9uTmFtZXNGaWxlKSkgewoJCQkJCS8vCUlmIHRoZXJlIGlzbid0IGEgbG9jYWxlIHNwZWNpZmljIGZ1bmN0aW9uIGZpbGUsIGxvb2sgZm9yIGEgbGFuZ3VhZ2Ugc3BlY2lmaWMgZnVuY3Rpb24gZmlsZQoJCQkJCSRmdW5jdGlvbk5hbWVzRmlsZSA9IFBIUEVYQ0VMX1JPT1QgLiAnUEhQRXhjZWwnLkRJUkVDVE9SWV9TRVBBUkFUT1IuJ2xvY2FsZScuRElSRUNUT1JZX1NFUEFSQVRPUi4kbGFuZ3VhZ2UuRElSRUNUT1JZX1NFUEFSQVRPUi4nZnVuY3Rpb25zJzsKCQkJCQlpZiAoIWZpbGVfZXhpc3RzKCRmdW5jdGlvbk5hbWVzRmlsZSkpIHsKCQkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJCX0KCQkJCX0KCQkJCS8vCVJldHJpZXZlIHRoZSBsaXN0IG9mIGxvY2FsZSBvciBsYW5ndWFnZSBzcGVjaWZpYyBmdW5jdGlvbiBuYW1lcwoJCQkJJGxvY2FsZUZ1bmN0aW9ucyA9IGZpbGUoJGZ1bmN0aW9uTmFtZXNGaWxlLEZJTEVfSUdOT1JFX05FV19MSU5FUyB8IEZJTEVfU0tJUF9FTVBUWV9MSU5FUyk7CgkJCQlmb3JlYWNoICgkbG9jYWxlRnVuY3Rpb25zIGFzICRsb2NhbGVGdW5jdGlvbikgewoJCQkJCWxpc3QoJGxvY2FsZUZ1bmN0aW9uKSA9IGV4cGxvZGUoJyMjJywkbG9jYWxlRnVuY3Rpb24pOwkvLwlTdHJpcCBvdXQgY29tbWVudHMKCQkJCQlpZiAoc3RycG9zKCRsb2NhbGVGdW5jdGlvbiwnPScpICE9PSBmYWxzZSkgewoJCQkJCQlsaXN0KCRmTmFtZSwkbGZOYW1lKSA9IGV4cGxvZGUoJz0nLCRsb2NhbGVGdW5jdGlvbik7CgkJCQkJCSRmTmFtZSA9IHRyaW0oJGZOYW1lKTsKCQkJCQkJJGxmTmFtZSA9IHRyaW0oJGxmTmFtZSk7CgkJCQkJCWlmICgoaXNzZXQoc2VsZjo6JF9QSFBFeGNlbEZ1bmN0aW9uc1skZk5hbWVdKSkgJiYgKCRsZk5hbWUgIT0gJycpICYmICgkZk5hbWUgIT0gJGxmTmFtZSkpIHsKCQkJCQkJCXNlbGY6OiRfbG9jYWxlRnVuY3Rpb25zWyRmTmFtZV0gPSAkbGZOYW1lOwoJCQkJCQl9CgkJCQkJfQoJCQkJfQoJCQkJLy8JRGVmYXVsdCB0aGUgVFJVRSBhbmQgRkFMU0UgY29uc3RhbnRzIHRvIHRoZSBsb2NhbGUgbmFtZXMgb2YgdGhlIFRSVUUoKSBhbmQgRkFMU0UoKSBmdW5jdGlvbnMKCQkJCWlmIChpc3NldChzZWxmOjokX2xvY2FsZUZ1bmN0aW9uc1snVFJVRSddKSkgeyBzZWxmOjokX2xvY2FsZUJvb2xlYW5bJ1RSVUUnXSA9IHNlbGY6OiRfbG9jYWxlRnVuY3Rpb25zWydUUlVFJ107IH0KCQkJCWlmIChpc3NldChzZWxmOjokX2xvY2FsZUZ1bmN0aW9uc1snRkFMU0UnXSkpIHsgc2VsZjo6JF9sb2NhbGVCb29sZWFuWydGQUxTRSddID0gc2VsZjo6JF9sb2NhbGVGdW5jdGlvbnNbJ0ZBTFNFJ107IH0KCgkJCQkkY29uZmlnRmlsZSA9IFBIUEVYQ0VMX1JPT1QgLiAnUEhQRXhjZWwnLkRJUkVDVE9SWV9TRVBBUkFUT1IuJ2xvY2FsZScuRElSRUNUT1JZX1NFUEFSQVRPUi5zdHJfcmVwbGFjZSgnXycsRElSRUNUT1JZX1NFUEFSQVRPUiwkbG9jYWxlKS5ESVJFQ1RPUllfU0VQQVJBVE9SLidjb25maWcnOwoJCQkJaWYgKCFmaWxlX2V4aXN0cygkY29uZmlnRmlsZSkpIHsKCQkJCQkkY29uZmlnRmlsZSA9IFBIUEVYQ0VMX1JPT1QgLiAnUEhQRXhjZWwnLkRJUkVDVE9SWV9TRVBBUkFUT1IuJ2xvY2FsZScuRElSRUNUT1JZX1NFUEFSQVRPUi4kbGFuZ3VhZ2UuRElSRUNUT1JZX1NFUEFSQVRPUi4nY29uZmlnJzsKCQkJCX0KCQkJCWlmIChmaWxlX2V4aXN0cygkY29uZmlnRmlsZSkpIHsKCQkJCQkkbG9jYWxlU2V0dGluZ3MgPSBmaWxlKCRjb25maWdGaWxlLEZJTEVfSUdOT1JFX05FV19MSU5FUyB8IEZJTEVfU0tJUF9FTVBUWV9MSU5FUyk7CgkJCQkJZm9yZWFjaCAoJGxvY2FsZVNldHRpbmdzIGFzICRsb2NhbGVTZXR0aW5nKSB7CgkJCQkJCWxpc3QoJGxvY2FsZVNldHRpbmcpID0gZXhwbG9kZSgnIyMnLCRsb2NhbGVTZXR0aW5nKTsJLy8JU3RyaXAgb3V0IGNvbW1lbnRzCgkJCQkJCWlmIChzdHJwb3MoJGxvY2FsZVNldHRpbmcsJz0nKSAhPT0gZmFsc2UpIHsKCQkJCQkJCWxpc3QoJHNldHRpbmdOYW1lLCRzZXR0aW5nVmFsdWUpID0gZXhwbG9kZSgnPScsJGxvY2FsZVNldHRpbmcpOwoJCQkJCQkJJHNldHRpbmdOYW1lID0gc3RydG91cHBlcih0cmltKCRzZXR0aW5nTmFtZSkpOwoJCQkJCQkJc3dpdGNoICgkc2V0dGluZ05hbWUpIHsKCQkJCQkJCQljYXNlICdBUkdVTUVOVFNFUEFSQVRPUicgOgoJCQkJCQkJCQlzZWxmOjokX2xvY2FsZUFyZ3VtZW50U2VwYXJhdG9yID0gdHJpbSgkc2V0dGluZ1ZhbHVlKTsKCQkJCQkJCQkJYnJlYWs7CgkJCQkJCQl9CgkJCQkJCX0KCQkJCQl9CgkJCQl9CgkJCX0KCgkJCXNlbGY6OiRmdW5jdGlvblJlcGxhY2VGcm9tRXhjZWwgPSBzZWxmOjokZnVuY3Rpb25SZXBsYWNlVG9FeGNlbCA9CgkJCXNlbGY6OiRmdW5jdGlvblJlcGxhY2VGcm9tTG9jYWxlID0gc2VsZjo6JGZ1bmN0aW9uUmVwbGFjZVRvTG9jYWxlID0gbnVsbDsKCQkJc2VsZjo6JF9sb2NhbGVMYW5ndWFnZSA9ICRsb2NhbGU7CgkJCXJldHVybiB0cnVlOwoJCX0KCQlyZXR1cm4gZmFsc2U7Cgl9CS8vCWZ1bmN0aW9uIHNldExvY2FsZSgpCgoKCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIF90cmFuc2xhdGVTZXBhcmF0b3IoJGZyb21TZXBhcmF0b3IsJHRvU2VwYXJhdG9yLCRmb3JtdWxhLCYkaW5CcmFjZXMpIHsKCQkkc3RybGVuID0gbWJfc3RybGVuKCRmb3JtdWxhKTsKCQlmb3IgKCRpID0gMDsgJGkgPCAkc3RybGVuOyArKyRpKSB7CgkJCSRjaHIgPSBtYl9zdWJzdHIoJGZvcm11bGEsJGksMSk7CgkJCXN3aXRjaCAoJGNocikgewoJCQkJY2FzZSAneycgOgkkaW5CcmFjZXMgPSB0cnVlOwoJCQkJCQkJYnJlYWs7CgkJCQljYXNlICd9JyA6CSRpbkJyYWNlcyA9IGZhbHNlOwoJCQkJCQkJYnJlYWs7CgkJCQljYXNlICRmcm9tU2VwYXJhdG9yIDoKCQkJCQkJCWlmICghJGluQnJhY2VzKSB7CgkJCQkJCQkJJGZvcm11bGEgPSBtYl9zdWJzdHIoJGZvcm11bGEsMCwkaSkuJHRvU2VwYXJhdG9yLm1iX3N1YnN0cigkZm9ybXVsYSwkaSsxKTsKCQkJCQkJCX0KCQkJfQoJCX0KCQlyZXR1cm4gJGZvcm11bGE7Cgl9CgoJcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gX3RyYW5zbGF0ZUZvcm11bGEoJGZyb20sJHRvLCRmb3JtdWxhLCRmcm9tU2VwYXJhdG9yLCR0b1NlcGFyYXRvcikgewoJCS8vCUNvbnZlcnQgYW55IEV4Y2VsIGZ1bmN0aW9uIG5hbWVzIHRvIHRoZSByZXF1aXJlZCBsYW5ndWFnZQoJCWlmIChzZWxmOjokX2xvY2FsZUxhbmd1YWdlICE9PSAnZW5fdXMnKSB7CgkJCSRpbkJyYWNlcyA9IGZhbHNlOwoJCQkvLwlJZiB0aGVyZSBpcyB0aGUgcG9zc2liaWxpdHkgb2YgYnJhY2VzIHdpdGhpbiBhIHF1b3RlZCBzdHJpbmcsIHRoZW4gd2UgZG9uJ3QgdHJlYXQgdGhvc2UgYXMgbWF0cml4IGluZGljYXRvcnMKCQkJaWYgKHN0cnBvcygkZm9ybXVsYSwnIicpICE9PSBmYWxzZSkgewoJCQkJLy8JU28gaW5zdGVhZCB3ZSBza2lwIHJlcGxhY2luZyBpbiBhbnkgcXVvdGVkIHN0cmluZ3MgYnkgb25seSByZXBsYWNpbmcgaW4gZXZlcnkgb3RoZXIgYXJyYXkgZWxlbWVudCBhZnRlciB3ZSd2ZSBleHBsb2RlZAoJCQkJLy8JCXRoZSBmb3JtdWxhCgkJCQkkdGVtcCA9IGV4cGxvZGUoJyInLCRmb3JtdWxhKTsKCQkJCSRpID0gZmFsc2U7CgkJCQlmb3JlYWNoKCR0ZW1wIGFzICYkdmFsdWUpIHsKCQkJCQkvLwlPbmx5IGNvdW50L3JlcGxhY2UgaW4gYWx0ZXJuYXRpbmcgYXJyYXkgZW50cmllcwoJCQkJCWlmICgkaSA9ICEkaSkgewoJCQkJCQkkdmFsdWUgPSBwcmVnX3JlcGxhY2UoJGZyb20sJHRvLCR2YWx1ZSk7CgkJCQkJCSR2YWx1ZSA9IHNlbGY6Ol90cmFuc2xhdGVTZXBhcmF0b3IoJGZyb21TZXBhcmF0b3IsJHRvU2VwYXJhdG9yLCR2YWx1ZSwkaW5CcmFjZXMpOwoJCQkJCX0KCQkJCX0KCQkJCXVuc2V0KCR2YWx1ZSk7CgkJCQkvLwlUaGVuIHJlYnVpbGQgdGhlIGZvcm11bGEgc3RyaW5nCgkJCQkkZm9ybXVsYSA9IGltcGxvZGUoJyInLCR0ZW1wKTsKCQkJfSBlbHNlIHsKCQkJCS8vCUlmIHRoZXJlJ3Mgbm8gcXVvdGVkIHN0cmluZ3MsIHRoZW4gd2UgZG8gYSBzaW1wbGUgY291bnQvcmVwbGFjZQoJCQkJJGZvcm11bGEgPSBwcmVnX3JlcGxhY2UoJGZyb20sJHRvLCRmb3JtdWxhKTsKCQkJCSRmb3JtdWxhID0gc2VsZjo6X3RyYW5zbGF0ZVNlcGFyYXRvcigkZnJvbVNlcGFyYXRvciwkdG9TZXBhcmF0b3IsJGZvcm11bGEsJGluQnJhY2VzKTsKCQkJfQoJCX0KCgkJcmV0dXJuICRmb3JtdWxhOwoJfQoKCXByaXZhdGUgc3RhdGljICRmdW5jdGlvblJlcGxhY2VGcm9tRXhjZWwJPSBudWxsOwoJcHJpdmF0ZSBzdGF0aWMgJGZ1bmN0aW9uUmVwbGFjZVRvTG9jYWxlCQk9IG51bGw7CgoJcHVibGljIGZ1bmN0aW9uIF90cmFuc2xhdGVGb3JtdWxhVG9Mb2NhbGUoJGZvcm11bGEpIHsKCQlpZiAoc2VsZjo6JGZ1bmN0aW9uUmVwbGFjZUZyb21FeGNlbCA9PT0gTlVMTCkgewoJCQlzZWxmOjokZnVuY3Rpb25SZXBsYWNlRnJvbUV4Y2VsID0gYXJyYXkoKTsKCQkJZm9yZWFjaChhcnJheV9rZXlzKHNlbGY6OiRfbG9jYWxlRnVuY3Rpb25zKSBhcyAkZXhjZWxGdW5jdGlvbk5hbWUpIHsKCQkJCXNlbGY6OiRmdW5jdGlvblJlcGxhY2VGcm9tRXhjZWxbXSA9ICcvKEA/W15cd1wuXSknLnByZWdfcXVvdGUoJGV4Y2VsRnVuY3Rpb25OYW1lKS4nKFtcc10qXCgpL1VpJzsKCQkJfQoJCQlmb3JlYWNoKGFycmF5X2tleXMoc2VsZjo6JF9sb2NhbGVCb29sZWFuKSBhcyAkZXhjZWxCb29sZWFuKSB7CgkJCQlzZWxmOjokZnVuY3Rpb25SZXBsYWNlRnJvbUV4Y2VsW10gPSAnLyhAP1teXHdcLl0pJy5wcmVnX3F1b3RlKCRleGNlbEJvb2xlYW4pLicoW15cd1wuXSkvVWknOwoJCQl9CgoJCX0KCgkJaWYgKHNlbGY6OiRmdW5jdGlvblJlcGxhY2VUb0xvY2FsZSA9PT0gTlVMTCkgewoJCQlzZWxmOjokZnVuY3Rpb25SZXBsYWNlVG9Mb2NhbGUgPSBhcnJheSgpOwoJCQlmb3JlYWNoKGFycmF5X3ZhbHVlcyhzZWxmOjokX2xvY2FsZUZ1bmN0aW9ucykgYXMgJGxvY2FsZUZ1bmN0aW9uTmFtZSkgewoJCQkJc2VsZjo6JGZ1bmN0aW9uUmVwbGFjZVRvTG9jYWxlW10gPSAnJDEnLnRyaW0oJGxvY2FsZUZ1bmN0aW9uTmFtZSkuJyQyJzsKCQkJfQoJCQlmb3JlYWNoKGFycmF5X3ZhbHVlcyhzZWxmOjokX2xvY2FsZUJvb2xlYW4pIGFzICRsb2NhbGVCb29sZWFuKSB7CgkJCQlzZWxmOjokZnVuY3Rpb25SZXBsYWNlVG9Mb2NhbGVbXSA9ICckMScudHJpbSgkbG9jYWxlQm9vbGVhbikuJyQyJzsKCQkJfQoJCX0KCgkJcmV0dXJuIHNlbGY6Ol90cmFuc2xhdGVGb3JtdWxhKHNlbGY6OiRmdW5jdGlvblJlcGxhY2VGcm9tRXhjZWwsc2VsZjo6JGZ1bmN0aW9uUmVwbGFjZVRvTG9jYWxlLCRmb3JtdWxhLCcsJyxzZWxmOjokX2xvY2FsZUFyZ3VtZW50U2VwYXJhdG9yKTsKCX0JLy8JZnVuY3Rpb24gX3RyYW5zbGF0ZUZvcm11bGFUb0xvY2FsZSgpCgoKCXByaXZhdGUgc3RhdGljICRmdW5jdGlvblJlcGxhY2VGcm9tTG9jYWxlCT0gbnVsbDsKCXByaXZhdGUgc3RhdGljICRmdW5jdGlvblJlcGxhY2VUb0V4Y2VsCQk9IG51bGw7CgoJcHVibGljIGZ1bmN0aW9uIF90cmFuc2xhdGVGb3JtdWxhVG9FbmdsaXNoKCRmb3JtdWxhKSB7CgkJaWYgKHNlbGY6OiRmdW5jdGlvblJlcGxhY2VGcm9tTG9jYWxlID09PSBOVUxMKSB7CgkJCXNlbGY6OiRmdW5jdGlvblJlcGxhY2VGcm9tTG9jYWxlID0gYXJyYXkoKTsKCQkJZm9yZWFjaChhcnJheV92YWx1ZXMoc2VsZjo6JF9sb2NhbGVGdW5jdGlvbnMpIGFzICRsb2NhbGVGdW5jdGlvbk5hbWUpIHsKCQkJCXNlbGY6OiRmdW5jdGlvblJlcGxhY2VGcm9tTG9jYWxlW10gPSAnLyhAP1teXHdcLl0pJy5wcmVnX3F1b3RlKCRsb2NhbGVGdW5jdGlvbk5hbWUpLicoW1xzXSpcKCkvVWknOwoJCQl9CgkJCWZvcmVhY2goYXJyYXlfdmFsdWVzKHNlbGY6OiRfbG9jYWxlQm9vbGVhbikgYXMgJGV4Y2VsQm9vbGVhbikgewoJCQkJc2VsZjo6JGZ1bmN0aW9uUmVwbGFjZUZyb21Mb2NhbGVbXSA9ICcvKEA/W15cd1wuXSknLnByZWdfcXVvdGUoJGV4Y2VsQm9vbGVhbikuJyhbXlx3XC5dKS9VaSc7CgkJCX0KCQl9CgoJCWlmIChzZWxmOjokZnVuY3Rpb25SZXBsYWNlVG9FeGNlbCA9PT0gTlVMTCkgewoJCQlzZWxmOjokZnVuY3Rpb25SZXBsYWNlVG9FeGNlbCA9IGFycmF5KCk7CgkJCWZvcmVhY2goYXJyYXlfa2V5cyhzZWxmOjokX2xvY2FsZUZ1bmN0aW9ucykgYXMgJGV4Y2VsRnVuY3Rpb25OYW1lKSB7CgkJCQlzZWxmOjokZnVuY3Rpb25SZXBsYWNlVG9FeGNlbFtdID0gJyQxJy50cmltKCRleGNlbEZ1bmN0aW9uTmFtZSkuJyQyJzsKCQkJfQoJCQlmb3JlYWNoKGFycmF5X2tleXMoc2VsZjo6JF9sb2NhbGVCb29sZWFuKSBhcyAkZXhjZWxCb29sZWFuKSB7CgkJCQlzZWxmOjokZnVuY3Rpb25SZXBsYWNlVG9FeGNlbFtdID0gJyQxJy50cmltKCRleGNlbEJvb2xlYW4pLickMic7CgkJCX0KCQl9CgoJCXJldHVybiBzZWxmOjpfdHJhbnNsYXRlRm9ybXVsYShzZWxmOjokZnVuY3Rpb25SZXBsYWNlRnJvbUxvY2FsZSxzZWxmOjokZnVuY3Rpb25SZXBsYWNlVG9FeGNlbCwkZm9ybXVsYSxzZWxmOjokX2xvY2FsZUFyZ3VtZW50U2VwYXJhdG9yLCcsJyk7Cgl9CS8vCWZ1bmN0aW9uIF90cmFuc2xhdGVGb3JtdWxhVG9FbmdsaXNoKCkKCgoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBfbG9jYWxlRnVuYygkZnVuY3Rpb24pIHsKCQlpZiAoc2VsZjo6JF9sb2NhbGVMYW5ndWFnZSAhPT0gJ2VuX3VzJykgewoJCQkkZnVuY3Rpb25OYW1lID0gdHJpbSgkZnVuY3Rpb24sJygnKTsKCQkJaWYgKGlzc2V0KHNlbGY6OiRfbG9jYWxlRnVuY3Rpb25zWyRmdW5jdGlvbk5hbWVdKSkgewoJCQkJJGJyYWNlID0gKCRmdW5jdGlvbk5hbWUgIT0gJGZ1bmN0aW9uKTsKCQkJCSRmdW5jdGlvbiA9IHNlbGY6OiRfbG9jYWxlRnVuY3Rpb25zWyRmdW5jdGlvbk5hbWVdOwoJCQkJaWYgKCRicmFjZSkgeyAkZnVuY3Rpb24gLj0gJygnOyB9CgkJCX0KCQl9CgkJcmV0dXJuICRmdW5jdGlvbjsKCX0KCgoKCgkvKioKCSAqIFdyYXAgc3RyaW5nIHZhbHVlcyBpbiBxdW90ZXMKCSAqCgkgKiBAcGFyYW0gbWl4ZWQgJHZhbHVlCgkgKiBAcmV0dXJuIG1peGVkCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gX3dyYXBSZXN1bHQoJHZhbHVlKSB7CgkJaWYgKGlzX3N0cmluZygkdmFsdWUpKSB7CgkJCS8vCUVycm9yIHZhbHVlcyBjYW5ub3QgYmUgIndyYXBwZWQiCgkJCWlmIChwcmVnX21hdGNoKCcvXicuc2VsZjo6Q0FMQ1VMQVRJT05fUkVHRVhQX0VSUk9SLickL2knLCAkdmFsdWUsICRtYXRjaCkpIHsKCQkJCS8vCVJldHVybiBFeGNlbCBlcnJvcnMgImFzIGlzIgoJCQkJcmV0dXJuICR2YWx1ZTsKCQkJfQoJCQkvLwlSZXR1cm4gc3RyaW5ncyB3cmFwcGVkIGluIHF1b3RlcwoJCQlyZXR1cm4gJyInLiR2YWx1ZS4nIic7CgkJLy8JQ29udmVydCBudW1lcmljIGVycm9ycyB0byBOYU4gZXJyb3IKCQl9IGVsc2UgaWYoKGlzX2Zsb2F0KCR2YWx1ZSkpICYmICgoaXNfbmFuKCR2YWx1ZSkpIHx8IChpc19pbmZpbml0ZSgkdmFsdWUpKSkpIHsKCQkJcmV0dXJuIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6TmFOKCk7CgkJfQoKCQlyZXR1cm4gJHZhbHVlOwoJfQkvLwlmdW5jdGlvbiBfd3JhcFJlc3VsdCgpCgoKCS8qKgoJICogUmVtb3ZlIHF1b3RlcyB1c2VkIGFzIGEgd3JhcHBlciB0byBpZGVudGlmeSBzdHJpbmcgdmFsdWVzCgkgKgoJICogQHBhcmFtIG1peGVkICR2YWx1ZQoJICogQHJldHVybiBtaXhlZAoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIF91bndyYXBSZXN1bHQoJHZhbHVlKSB7CgkJaWYgKGlzX3N0cmluZygkdmFsdWUpKSB7CgkJCWlmICgoaXNzZXQoJHZhbHVlezB9KSkgJiYgKCR2YWx1ZXswfSA9PSAnIicpICYmIChzdWJzdHIoJHZhbHVlLC0xKSA9PSAnIicpKSB7CgkJCQlyZXR1cm4gc3Vic3RyKCR2YWx1ZSwxLC0xKTsKCQkJfQoJCS8vCUNvbnZlcnQgbnVtZXJpYyBlcnJvcnMgdG8gTmFOIGVycm9yCgkJfSBlbHNlIGlmKChpc19mbG9hdCgkdmFsdWUpKSAmJiAoKGlzX25hbigkdmFsdWUpKSB8fCAoaXNfaW5maW5pdGUoJHZhbHVlKSkpKSB7CgkJCXJldHVybiBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6Ok5hTigpOwoJCX0KCQlyZXR1cm4gJHZhbHVlOwoJfQkvLwlmdW5jdGlvbiBfdW53cmFwUmVzdWx0KCkKCgoKCgkvKioKCSAqIENhbGN1bGF0ZSBjZWxsIHZhbHVlICh1c2luZyBmb3JtdWxhIGZyb20gYSBjZWxsIElEKQoJICogUmV0YWluZWQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkKCSAqCgkgKiBAYWNjZXNzCXB1YmxpYwoJICogQHBhcmFtCVBIUEV4Y2VsX0NlbGwJJHBDZWxsCUNlbGwgdG8gY2FsY3VsYXRlCgkgKiBAcmV0dXJuCW1peGVkCgkgKiBAdGhyb3dzCUV4Y2VwdGlvbgoJICovCglwdWJsaWMgZnVuY3Rpb24gY2FsY3VsYXRlKFBIUEV4Y2VsX0NlbGwgJHBDZWxsID0gbnVsbCkgewoJCXRyeSB7CgkJCXJldHVybiAkdGhpcy0+Y2FsY3VsYXRlQ2VsbFZhbHVlKCRwQ2VsbCk7CgkJfSBjYXRjaCAoRXhjZXB0aW9uICRlKSB7CgkJCXRocm93KG5ldyBFeGNlcHRpb24oJGUtPmdldE1lc3NhZ2UoKSkpOwoJCX0KCX0JLy8JZnVuY3Rpb24gY2FsY3VsYXRlKCkKCgoJLyoqCgkgKiBDYWxjdWxhdGUgdGhlIHZhbHVlIG9mIGEgY2VsbCBmb3JtdWxhCgkgKgoJICogQGFjY2VzcwlwdWJsaWMKCSAqIEBwYXJhbQlQSFBFeGNlbF9DZWxsCSRwQ2VsbAkJQ2VsbCB0byBjYWxjdWxhdGUKCSAqIEBwYXJhbQlCb29sZWFuCQkJJHJlc2V0TG9nCUZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBkZWJ1ZyBsb2cgc2hvdWxkIGJlIHJlc2V0IG9yIG5vdAoJICogQHJldHVybgltaXhlZAoJICogQHRocm93cwlFeGNlcHRpb24KCSAqLwoJcHVibGljIGZ1bmN0aW9uIGNhbGN1bGF0ZUNlbGxWYWx1ZShQSFBFeGNlbF9DZWxsICRwQ2VsbCA9IG51bGwsICRyZXNldExvZyA9IHRydWUpIHsKCQlpZiAoJHJlc2V0TG9nKSB7CgkJCS8vCUluaXRpYWxpc2UgdGhlIGxvZ2dpbmcgc2V0dGluZ3MgaWYgcmVxdWVzdGVkCgkJCSR0aGlzLT5mb3JtdWxhRXJyb3IgPSBudWxsOwoJCQkkdGhpcy0+ZGVidWdMb2cgPSAkdGhpcy0+ZGVidWdMb2dTdGFjayA9IGFycmF5KCk7CgkJCSR0aGlzLT5fY3ljbGljRm9ybXVsYUNvdW50ID0gMTsKCgkJCSRyZXR1cm5BcnJheUFzVHlwZSA9IHNlbGY6OiRyZXR1cm5BcnJheUFzVHlwZTsKCQkJc2VsZjo6JHJldHVybkFycmF5QXNUeXBlID0gc2VsZjo6UkVUVVJOX0FSUkFZX0FTX0FSUkFZOwoJCX0KCgkJLy8JUmVhZCB0aGUgZm9ybXVsYSBmcm9tIHRoZSBjZWxsCgkJaWYgKCRwQ2VsbCA9PT0gTlVMTCkgewoJCQlyZXR1cm4gTlVMTDsKCQl9CgoJCWlmICgkcmVzZXRMb2cpIHsKCQkJc2VsZjo6JHJldHVybkFycmF5QXNUeXBlID0gJHJldHVybkFycmF5QXNUeXBlOwoJCX0KCQkvLwlFeGVjdXRlIHRoZSBjYWxjdWxhdGlvbiBmb3IgdGhlIGNlbGwgZm9ybXVsYQoJCXRyeSB7CgkJCSRyZXN1bHQgPSBzZWxmOjpfdW53cmFwUmVzdWx0KCR0aGlzLT5fY2FsY3VsYXRlRm9ybXVsYVZhbHVlKCRwQ2VsbC0+Z2V0VmFsdWUoKSwgJHBDZWxsLT5nZXRDb29yZGluYXRlKCksICRwQ2VsbCkpOwoJCX0gY2F0Y2ggKEV4Y2VwdGlvbiAkZSkgewoJCQl0aHJvdyhuZXcgRXhjZXB0aW9uKCRlLT5nZXRNZXNzYWdlKCkpKTsKCQl9CgoJCWlmICgoaXNfYXJyYXkoJHJlc3VsdCkpICYmIChzZWxmOjokcmV0dXJuQXJyYXlBc1R5cGUgIT0gc2VsZjo6UkVUVVJOX0FSUkFZX0FTX0FSUkFZKSkgewoJCQkkdGVzdFJlc3VsdCA9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlbkFycmF5KCRyZXN1bHQpOwoJCQlpZiAoc2VsZjo6JHJldHVybkFycmF5QXNUeXBlID09IHNlbGY6OlJFVFVSTl9BUlJBWV9BU19FUlJPUikgewoJCQkJcmV0dXJuIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6VkFMVUUoKTsKCQkJfQoJCQkvLwlJZiB0aGVyZSdzIG9ubHkgYSBzaW5nbGUgY2VsbCBpbiB0aGUgYXJyYXksIHRoZW4gd2UgYWxsb3cgaXQKCQkJaWYgKGNvdW50KCR0ZXN0UmVzdWx0KSAhPSAxKSB7CgkJCQkvLwlJZiBrZXlzIGFyZSBudW1lcmljLCB0aGVuIGl0J3MgYSBtYXRyaXggcmVzdWx0IHJhdGhlciB0aGFuIGEgY2VsbCByYW5nZSByZXN1bHQsIHNvIHdlIHBlcm1pdCBpdAoJCQkJJHIgPSBhcnJheV9rZXlzKCRyZXN1bHQpOwoJCQkJJHIgPSBhcnJheV9zaGlmdCgkcik7CgkJCQlpZiAoIWlzX251bWVyaWMoJHIpKSB7IHJldHVybiBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OlZBTFVFKCk7IH0KCQkJCWlmIChpc19hcnJheSgkcmVzdWx0WyRyXSkpIHsKCQkJCQkkYyA9IGFycmF5X2tleXMoJHJlc3VsdFskcl0pOwoJCQkJCSRjID0gYXJyYXlfc2hpZnQoJGMpOwoJCQkJCWlmICghaXNfbnVtZXJpYygkYykpIHsKCQkJCQkJcmV0dXJuIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6VkFMVUUoKTsKCQkJCQl9CgkJCQl9CgkJCX0KCQkJJHJlc3VsdCA9IGFycmF5X3NoaWZ0KCR0ZXN0UmVzdWx0KTsKCQl9CgoJCWlmICgkcmVzdWx0ID09PSBOVUxMKSB7CgkJCXJldHVybiAwOwoJCX0gZWxzZWlmKChpc19mbG9hdCgkcmVzdWx0KSkgJiYgKChpc19uYW4oJHJlc3VsdCkpIHx8IChpc19pbmZpbml0ZSgkcmVzdWx0KSkpKSB7CgkJCXJldHVybiBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6Ok5hTigpOwoJCX0KCQlyZXR1cm4gJHJlc3VsdDsKCX0JLy8JZnVuY3Rpb24gY2FsY3VsYXRlQ2VsbFZhbHVlKAoKCgkvKioKCSAqIFZhbGlkYXRlIGFuZCBwYXJzZSBhIGZvcm11bGEgc3RyaW5nCgkgKgoJICogQHBhcmFtCXN0cmluZwkJJGZvcm11bGEJCUZvcm11bGEgdG8gcGFyc2UKCSAqIEByZXR1cm4JYXJyYXkKCSAqIEB0aHJvd3MJRXhjZXB0aW9uCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBwYXJzZUZvcm11bGEoJGZvcm11bGEpIHsKCQkvLwlCYXNpYyB2YWxpZGF0aW9uIHRoYXQgdGhpcyBpcyBpbmRlZWQgYSBmb3JtdWxhCgkJLy8JV2UgcmV0dXJuIGFuIGVtcHR5IGFycmF5IGlmIG5vdAoJCSRmb3JtdWxhID0gdHJpbSgkZm9ybXVsYSk7CgkJaWYgKCghaXNzZXQoJGZvcm11bGF7MH0pKSB8fCAoJGZvcm11bGF7MH0gIT0gJz0nKSkgcmV0dXJuIGFycmF5KCk7CgkJJGZvcm11bGEgPSBsdHJpbShzdWJzdHIoJGZvcm11bGEsMSkpOwoJCWlmICghaXNzZXQoJGZvcm11bGF7MH0pKSByZXR1cm4gYXJyYXkoKTsKCgkJLy8JUGFyc2UgdGhlIGZvcm11bGEgYW5kIHJldHVybiB0aGUgdG9rZW4gc3RhY2sKCQlyZXR1cm4gJHRoaXMtPl9wYXJzZUZvcm11bGEoJGZvcm11bGEpOwoJfQkvLwlmdW5jdGlvbiBwYXJzZUZvcm11bGEoKQoKCgkvKioKCSAqIENhbGN1bGF0ZSB0aGUgdmFsdWUgb2YgYSBmb3JtdWxhCgkgKgoJICogQHBhcmFtCXN0cmluZwkJJGZvcm11bGEJCUZvcm11bGEgdG8gcGFyc2UKCSAqIEByZXR1cm4JbWl4ZWQKCSAqIEB0aHJvd3MJRXhjZXB0aW9uCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBjYWxjdWxhdGVGb3JtdWxhKCRmb3JtdWxhLCAkY2VsbElEPW51bGwsIFBIUEV4Y2VsX0NlbGwgJHBDZWxsID0gbnVsbCkgewoJCS8vCUluaXRpYWxpc2UgdGhlIGxvZ2dpbmcgc2V0dGluZ3MKCQkkdGhpcy0+Zm9ybXVsYUVycm9yID0gbnVsbDsKCQkkdGhpcy0+ZGVidWdMb2cgPSAkdGhpcy0+ZGVidWdMb2dTdGFjayA9IGFycmF5KCk7CgoJCS8vCURpc2FibGUgY2FsY3VsYXRpb24gY2FjaGVpbmcgYmVjYXVzZSBpdCBvbmx5IGFwcGxpZXMgdG8gY2VsbCBjYWxjdWxhdGlvbnMsIG5vdCBzdHJhaWdodCBmb3JtdWxhZQoJCS8vCUJ1dCBkb24ndCBhY3R1YWxseSBmbHVzaCBhbnkgY2FjaGUKCQkkcmVzZXRDYWNoZSA9ICR0aGlzLT5nZXRDYWxjdWxhdGlvbkNhY2hlRW5hYmxlZCgpOwoJCXNlbGY6OiRfY2FsY3VsYXRpb25DYWNoZUVuYWJsZWQgPSBmYWxzZTsKCQkvLwlFeGVjdXRlIHRoZSBjYWxjdWxhdGlvbgoJCXRyeSB7CgkJCSRyZXN1bHQgPSBzZWxmOjpfdW53cmFwUmVzdWx0KCR0aGlzLT5fY2FsY3VsYXRlRm9ybXVsYVZhbHVlKCRmb3JtdWxhLCAkY2VsbElELCAkcENlbGwpKTsKCQl9IGNhdGNoIChFeGNlcHRpb24gJGUpIHsKCQkJdGhyb3cobmV3IEV4Y2VwdGlvbigkZS0+Z2V0TWVzc2FnZSgpKSk7CgkJfQoKCQkvLwlSZXNldCBjYWxjdWxhdGlvbiBjYWNoZWluZyB0byBpdHMgcHJldmlvdXMgc3RhdGUKCQlzZWxmOjokX2NhbGN1bGF0aW9uQ2FjaGVFbmFibGVkID0gJHJlc2V0Q2FjaGU7CgoJCXJldHVybiAkcmVzdWx0OwoJfQkvLwlmdW5jdGlvbiBjYWxjdWxhdGVGb3JtdWxhKCkKCgoJLyoqCgkgKiBQYXJzZSBhIGNlbGwgZm9ybXVsYSBhbmQgY2FsY3VsYXRlIGl0cyB2YWx1ZQoJICoKCSAqIEBwYXJhbQlzdHJpbmcJCQkkZm9ybXVsYQlUaGUgZm9ybXVsYSB0byBwYXJzZSBhbmQgY2FsY3VsYXRlCgkgKiBAcGFyYW0Jc3RyaW5nCQkJJGNlbGxJRAkJVGhlIElEIChlLmcuIEEzKSBvZiB0aGUgY2VsbCB0aGF0IHdlIGFyZSBjYWxjdWxhdGluZwoJICogQHBhcmFtCVBIUEV4Y2VsX0NlbGwJJHBDZWxsCQlDZWxsIHRvIGNhbGN1bGF0ZQoJICogQHJldHVybgltaXhlZAoJICogQHRocm93cwlFeGNlcHRpb24KCSAqLwoJcHVibGljIGZ1bmN0aW9uIF9jYWxjdWxhdGVGb3JtdWxhVmFsdWUoJGZvcm11bGEsICRjZWxsSUQ9bnVsbCwgUEhQRXhjZWxfQ2VsbCAkcENlbGwgPSBudWxsKSB7Ci8vCQllY2hvICc8Yj4nLiRjZWxsSUQuJzwvYj48YnIgLz4nOwoJCSRjZWxsVmFsdWUgPSAnJzsKCgkJLy8JQmFzaWMgdmFsaWRhdGlvbiB0aGF0IHRoaXMgaXMgaW5kZWVkIGEgZm9ybXVsYQoJCS8vCVdlIHNpbXBseSByZXR1cm4gdGhlICJjZWxsIHZhbHVlIiAoZm9ybXVsYSkgaWYgbm90CgkJJGZvcm11bGEgPSB0cmltKCRmb3JtdWxhKTsKCQlpZiAoJGZvcm11bGF7MH0gIT0gJz0nKSByZXR1cm4gc2VsZjo6X3dyYXBSZXN1bHQoJGZvcm11bGEpOwoJCSRmb3JtdWxhID0gbHRyaW0oc3Vic3RyKCRmb3JtdWxhLDEpKTsKCQlpZiAoIWlzc2V0KCRmb3JtdWxhezB9KSkgcmV0dXJuIHNlbGY6Ol93cmFwUmVzdWx0KCRmb3JtdWxhKTsKCgkJJHdzVGl0bGUgPSAiXHgwMFdyayI7CgkJaWYgKCRwQ2VsbCAhPT0gTlVMTCkgewoJCQkkcENlbGxQYXJlbnQgPSAkcENlbGwtPmdldFBhcmVudCgpOwoJCQlpZiAoJHBDZWxsUGFyZW50ICE9PSBOVUxMKSB7CgkJCQkkd3NUaXRsZSA9ICRwQ2VsbFBhcmVudC0+Z2V0VGl0bGUoKTsKCQkJfQoJCX0KCQkvLyBJcyBjYWxjdWxhdGlvbiBjYWNoZWluZyBlbmFibGVkPwoJCWlmICgkY2VsbElEICE9PSBOVUxMKSB7CgkJCWlmIChzZWxmOjokX2NhbGN1bGF0aW9uQ2FjaGVFbmFibGVkKSB7CgkJCQkvLyBJcyB0aGUgdmFsdWUgcHJlc2VudCBpbiBjYWxjdWxhdGlvbiBjYWNoZT8KLy8JCQkJZWNobyAnVGVzdGluZyBjYWNoZSB2YWx1ZTxiciAvPic7CgkJCQlpZiAoaXNzZXQoc2VsZjo6JF9jYWxjdWxhdGlvbkNhY2hlWyR3c1RpdGxlXVskY2VsbElEXSkpIHsKLy8JCQkJCWVjaG8gJ1ZhbHVlIGlzIGluIGNhY2hlPGJyIC8+JzsKCQkJCQkkdGhpcy0+X3dyaXRlRGVidWcoJ1Rlc3RpbmcgY2FjaGUgdmFsdWUgZm9yIGNlbGwgJy4kY2VsbElEKTsKCQkJCQkvLwlJcyBjYWNoZSBzdGlsbCB2YWxpZD8KCQkJCQlpZiAoKG1pY3JvdGltZSh0cnVlKSAtIHNlbGY6OiRfY2FsY3VsYXRpb25DYWNoZVskd3NUaXRsZV1bJGNlbGxJRF1bJ3RpbWUnXSkgPCBzZWxmOjokX2NhbGN1bGF0aW9uQ2FjaGVFeHBpcmF0aW9uVGltZSkgewovLwkJCQkJCWVjaG8gJ0NhY2hlIHRpbWUgaXMgc3RpbGwgdmFsaWQ8YnIgLz4nOwoJCQkJCQkkdGhpcy0+X3dyaXRlRGVidWcoJ1JldHJpZXZpbmcgdmFsdWUgZm9yICcuJGNlbGxJRC4nIGZyb20gY2FjaGUnKTsKCQkJCQkJLy8gUmV0dXJuIHRoZSBjYWNoZWQgcmVzdWx0CgkJCQkJCSRyZXR1cm5WYWx1ZSA9IHNlbGY6OiRfY2FsY3VsYXRpb25DYWNoZVskd3NUaXRsZV1bJGNlbGxJRF1bJ2RhdGEnXTsKLy8JCQkJCQllY2hvICdSZXRyaWV2aW5nIGRhdGEgdmFsdWUgb2YgJy4kcmV0dXJuVmFsdWUuJyBmb3IgJy4kY2VsbElELicgZnJvbSBjYWNoZTxiciAvPic7CgkJCQkJCWlmIChpc19hcnJheSgkcmV0dXJuVmFsdWUpKSB7CgkJCQkJCQkkcmV0dXJuVmFsdWUgPSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5BcnJheSgkcmV0dXJuVmFsdWUpOwoJCQkJCQkJcmV0dXJuIGFycmF5X3NoaWZ0KCRyZXR1cm5WYWx1ZSk7CgkJCQkJCX0KCQkJCQkJcmV0dXJuICRyZXR1cm5WYWx1ZTsKCQkJCQl9IGVsc2UgewovLwkJCQkJCWVjaG8gJ0NhY2hlIGhhcyBleHBpcmVkPGJyIC8+JzsKCQkJCQkJJHRoaXMtPl93cml0ZURlYnVnKCdDYWNoZSB2YWx1ZSBmb3IgJy4kY2VsbElELicgaGFzIGV4cGlyZWQnKTsKCQkJCQkJLy8JQ2xlYXIgdGhlIGNhY2hlIGlmIGl0J3Mgbm8gbG9uZ2VyIHZhbGlkCgkJCQkJCXVuc2V0KHNlbGY6OiRfY2FsY3VsYXRpb25DYWNoZVskd3NUaXRsZV1bJGNlbGxJRF0pOwoJCQkJCX0KCQkJCX0KCQkJfQoJCX0KCgkJaWYgKChpbl9hcnJheSgkd3NUaXRsZS4nIScuJGNlbGxJRCwkdGhpcy0+ZGVidWdMb2dTdGFjaykpICYmICgkd3NUaXRsZSAhPSAiXHgwMFdyayIpKSB7CgkJCWlmICgkdGhpcy0+Y3ljbGljRm9ybXVsYUNvdW50IDw9IDApIHsKCQkJCXJldHVybiAkdGhpcy0+X3JhaXNlRm9ybXVsYUVycm9yKCdDeWNsaWMgUmVmZXJlbmNlIGluIEZvcm11bGEnKTsKCQkJfSBlbHNlaWYgKCgkdGhpcy0+X2N5Y2xpY0Zvcm11bGFDb3VudCA+PSAkdGhpcy0+Y3ljbGljRm9ybXVsYUNvdW50KSAmJgoJCQkJCSAgKCR0aGlzLT5fY3ljbGljRm9ybXVsYUNlbGwgPT0gJHdzVGl0bGUuJyEnLiRjZWxsSUQpKSB7CgkJCQlyZXR1cm4gJGNlbGxWYWx1ZTsKCQkJfSBlbHNlaWYgKCR0aGlzLT5fY3ljbGljRm9ybXVsYUNlbGwgPT0gJHdzVGl0bGUuJyEnLiRjZWxsSUQpIHsKCQkJCSsrJHRoaXMtPl9jeWNsaWNGb3JtdWxhQ291bnQ7CgkJCQlpZiAoJHRoaXMtPl9jeWNsaWNGb3JtdWxhQ291bnQgPj0gJHRoaXMtPmN5Y2xpY0Zvcm11bGFDb3VudCkgewoJCQkJCXJldHVybiAkY2VsbFZhbHVlOwoJCQkJfQoJCQl9IGVsc2VpZiAoJHRoaXMtPl9jeWNsaWNGb3JtdWxhQ2VsbCA9PSAnJykgewoJCQkJJHRoaXMtPl9jeWNsaWNGb3JtdWxhQ2VsbCA9ICR3c1RpdGxlLichJy4kY2VsbElEOwoJCQkJaWYgKCR0aGlzLT5fY3ljbGljRm9ybXVsYUNvdW50ID49ICR0aGlzLT5jeWNsaWNGb3JtdWxhQ291bnQpIHsKCQkJCQlyZXR1cm4gJGNlbGxWYWx1ZTsKCQkJCX0KCQkJfQoJCX0KCQkkdGhpcy0+ZGVidWdMb2dTdGFja1tdID0gJHdzVGl0bGUuJyEnLiRjZWxsSUQ7CgkJLy8JUGFyc2UgdGhlIGZvcm11bGEgb250byB0aGUgdG9rZW4gc3RhY2sgYW5kIGNhbGN1bGF0ZSB0aGUgdmFsdWUKCQkkY2VsbFZhbHVlID0gJHRoaXMtPl9wcm9jZXNzVG9rZW5TdGFjaygkdGhpcy0+X3BhcnNlRm9ybXVsYSgkZm9ybXVsYSwgJHBDZWxsKSwgJGNlbGxJRCwgJHBDZWxsKTsKCQlhcnJheV9wb3AoJHRoaXMtPmRlYnVnTG9nU3RhY2spOwoKCQkvLyBTYXZlIHRvIGNhbGN1bGF0aW9uIGNhY2hlCgkJaWYgKCRjZWxsSUQgIT09IE5VTEwpIHsKCQkJaWYgKHNlbGY6OiRfY2FsY3VsYXRpb25DYWNoZUVuYWJsZWQpIHsKCQkJCXNlbGY6OiRfY2FsY3VsYXRpb25DYWNoZVskd3NUaXRsZV1bJGNlbGxJRF1bJ3RpbWUnXSA9IG1pY3JvdGltZSh0cnVlKTsKCQkJCXNlbGY6OiRfY2FsY3VsYXRpb25DYWNoZVskd3NUaXRsZV1bJGNlbGxJRF1bJ2RhdGEnXSA9ICRjZWxsVmFsdWU7CgkJCX0KCQl9CgoJCS8vCVJldHVybiB0aGUgY2FsY3VsYXRlZCB2YWx1ZQoJCXJldHVybiAkY2VsbFZhbHVlOwoJfQkvLwlmdW5jdGlvbiBfY2FsY3VsYXRlRm9ybXVsYVZhbHVlKCkKCgoJLyoqCgkgKiBFbnN1cmUgdGhhdCBwYWlyZWQgbWF0cml4IG9wZXJhbmRzIGFyZSBib3RoIG1hdHJpY2VzIGFuZCBvZiB0aGUgc2FtZSBzaXplCgkgKgoJICogQHBhcmFtCW1peGVkCQkmJG9wZXJhbmQxCUZpcnN0IG1hdHJpeCBvcGVyYW5kCgkgKiBAcGFyYW0JbWl4ZWQJCSYkb3BlcmFuZDIJU2Vjb25kIG1hdHJpeCBvcGVyYW5kCgkgKiBAcGFyYW0JaW50ZWdlcgkJJHJlc2l6ZQkJRmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIG1hdHJpY2VzIHNob3VsZCBiZSByZXNpemVkIHRvIG1hdGNoCgkgKgkJCQkJCQkJCQlhbmQgKGlmIHNvKSwgd2hldGhlciB0aGUgc21hbGxlciBkaW1lbnNpb24gc2hvdWxkIGdyb3cgb3IgdGhlCgkgKgkJCQkJCQkJCQlsYXJnZXIgc2hvdWxkIHNocmluay4KCSAqCQkJCQkJCQkJCQkwID0gbm8gcmVzaXplCgkgKgkJCQkJCQkJCQkJMSA9IHNocmluayB0byBmaXQKCSAqCQkJCQkJCQkJCQkyID0gZXh0ZW5kIHRvIGZpdAoJICovCglwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBfY2hlY2tNYXRyaXhPcGVyYW5kcygmJG9wZXJhbmQxLCYkb3BlcmFuZDIsJHJlc2l6ZSA9IDEpIHsKCQkvLwlFeGFtaW5lIGVhY2ggb2YgdGhlIHR3byBvcGVyYW5kcywgYW5kIHR1cm4gdGhlbSBpbnRvIGFuIGFycmF5IGlmIHRoZXkgYXJlbid0IG9uZSBhbHJlYWR5CgkJLy8JTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGlmIG9uZSBvciBib3RoIG9mIHRoZSBvcGVyYW5kIGlzIGFscmVhZHkgYW4gYXJyYXkKCQlpZiAoIWlzX2FycmF5KCRvcGVyYW5kMSkpIHsKCQkJbGlzdCgkbWF0cml4Um93cywkbWF0cml4Q29sdW1ucykgPSBzZWxmOjpfZ2V0TWF0cml4RGltZW5zaW9ucygkb3BlcmFuZDIpOwoJCQkkb3BlcmFuZDEgPSBhcnJheV9maWxsKDAsJG1hdHJpeFJvd3MsYXJyYXlfZmlsbCgwLCRtYXRyaXhDb2x1bW5zLCRvcGVyYW5kMSkpOwoJCQkkcmVzaXplID0gMDsKCQl9IGVsc2VpZiAoIWlzX2FycmF5KCRvcGVyYW5kMikpIHsKCQkJbGlzdCgkbWF0cml4Um93cywkbWF0cml4Q29sdW1ucykgPSBzZWxmOjpfZ2V0TWF0cml4RGltZW5zaW9ucygkb3BlcmFuZDEpOwoJCQkkb3BlcmFuZDIgPSBhcnJheV9maWxsKDAsJG1hdHJpeFJvd3MsYXJyYXlfZmlsbCgwLCRtYXRyaXhDb2x1bW5zLCRvcGVyYW5kMikpOwoJCQkkcmVzaXplID0gMDsKCQl9CgoJCWxpc3QoJG1hdHJpeDFSb3dzLCRtYXRyaXgxQ29sdW1ucykgPSBzZWxmOjpfZ2V0TWF0cml4RGltZW5zaW9ucygkb3BlcmFuZDEpOwoJCWxpc3QoJG1hdHJpeDJSb3dzLCRtYXRyaXgyQ29sdW1ucykgPSBzZWxmOjpfZ2V0TWF0cml4RGltZW5zaW9ucygkb3BlcmFuZDIpOwoJCWlmICgoJG1hdHJpeDFSb3dzID09ICRtYXRyaXgyQ29sdW1ucykgJiYgKCRtYXRyaXgyUm93cyA9PSAkbWF0cml4MUNvbHVtbnMpKSB7CgkJCSRyZXNpemUgPSAxOwoJCX0KCgkJaWYgKCRyZXNpemUgPT0gMikgewoJCQkvLwlHaXZlbiB0d28gbWF0cmljZXMgb2YgKHBvdGVudGlhbGx5KSB1bmVxdWFsIHNpemUsIGNvbnZlcnQgdGhlIHNtYWxsZXIgaW4gZWFjaCBkaW1lbnNpb24gdG8gbWF0Y2ggdGhlIGxhcmdlcgoJCQlzZWxmOjpfcmVzaXplTWF0cmljZXNFeHRlbmQoJG9wZXJhbmQxLCRvcGVyYW5kMiwkbWF0cml4MVJvd3MsJG1hdHJpeDFDb2x1bW5zLCRtYXRyaXgyUm93cywkbWF0cml4MkNvbHVtbnMpOwoJCX0gZWxzZWlmICgkcmVzaXplID09IDEpIHsKCQkJLy8JR2l2ZW4gdHdvIG1hdHJpY2VzIG9mIChwb3RlbnRpYWxseSkgdW5lcXVhbCBzaXplLCBjb252ZXJ0IHRoZSBsYXJnZXIgaW4gZWFjaCBkaW1lbnNpb24gdG8gbWF0Y2ggdGhlIHNtYWxsZXIKCQkJc2VsZjo6X3Jlc2l6ZU1hdHJpY2VzU2hyaW5rKCRvcGVyYW5kMSwkb3BlcmFuZDIsJG1hdHJpeDFSb3dzLCRtYXRyaXgxQ29sdW1ucywkbWF0cml4MlJvd3MsJG1hdHJpeDJDb2x1bW5zKTsKCQl9CgkJcmV0dXJuIGFycmF5KCAkbWF0cml4MVJvd3MsJG1hdHJpeDFDb2x1bW5zLCRtYXRyaXgyUm93cywkbWF0cml4MkNvbHVtbnMpOwoJfQkvLwlmdW5jdGlvbiBfY2hlY2tNYXRyaXhPcGVyYW5kcygpCgoKCS8qKgoJICogUmVhZCB0aGUgZGltZW5zaW9ucyBvZiBhIG1hdHJpeCwgYW5kIHJlLWluZGV4IGl0IHdpdGggc3RyYWlnaHQgbnVtZXJpYyBrZXlzIHN0YXJ0aW5nIGZyb20gcm93IDAsIGNvbHVtbiAwCgkgKgoJICogQHBhcmFtCW1peGVkCQkmJG1hdHJpeAkJbWF0cml4IG9wZXJhbmQKCSAqIEByZXR1cm4JYXJyYXkJCUFuIGFycmF5IGNvbXByaXNpbmcgdGhlIG51bWJlciBvZiByb3dzLCBhbmQgbnVtYmVyIG9mIGNvbHVtbnMKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBfZ2V0TWF0cml4RGltZW5zaW9ucygmJG1hdHJpeCkgewoJCSRtYXRyaXhSb3dzID0gY291bnQoJG1hdHJpeCk7CgkJJG1hdHJpeENvbHVtbnMgPSAwOwoJCWZvcmVhY2goJG1hdHJpeCBhcyAkcm93S2V5ID0+ICRyb3dWYWx1ZSkgewoJCQkkbWF0cml4Q29sdW1ucyA9IG1heChjb3VudCgkcm93VmFsdWUpLCRtYXRyaXhDb2x1bW5zKTsKCQkJaWYgKCFpc19hcnJheSgkcm93VmFsdWUpKSB7CgkJCQkkbWF0cml4WyRyb3dLZXldID0gYXJyYXkoJHJvd1ZhbHVlKTsKCQkJfSBlbHNlIHsKCQkJCSRtYXRyaXhbJHJvd0tleV0gPSBhcnJheV92YWx1ZXMoJHJvd1ZhbHVlKTsKCQkJfQoJCX0KCQkkbWF0cml4ID0gYXJyYXlfdmFsdWVzKCRtYXRyaXgpOwoJCXJldHVybiBhcnJheSgkbWF0cml4Um93cywkbWF0cml4Q29sdW1ucyk7Cgl9CS8vCWZ1bmN0aW9uIF9nZXRNYXRyaXhEaW1lbnNpb25zKCkKCgoJLyoqCgkgKiBFbnN1cmUgdGhhdCBwYWlyZWQgbWF0cml4IG9wZXJhbmRzIGFyZSBib3RoIG1hdHJpY2VzIG9mIHRoZSBzYW1lIHNpemUKCSAqCgkgKiBAcGFyYW0JbWl4ZWQJCSYkbWF0cml4MQlGaXJzdCBtYXRyaXggb3BlcmFuZAoJICogQHBhcmFtCW1peGVkCQkmJG1hdHJpeDIJU2Vjb25kIG1hdHJpeCBvcGVyYW5kCgkgKi8KCXByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIF9yZXNpemVNYXRyaWNlc1NocmluaygmJG1hdHJpeDEsJiRtYXRyaXgyLCRtYXRyaXgxUm93cywkbWF0cml4MUNvbHVtbnMsJG1hdHJpeDJSb3dzLCRtYXRyaXgyQ29sdW1ucykgewoJCWlmICgoJG1hdHJpeDJDb2x1bW5zIDwgJG1hdHJpeDFDb2x1bW5zKSB8fCAoJG1hdHJpeDJSb3dzIDwgJG1hdHJpeDFSb3dzKSkgewoJCQlpZiAoJG1hdHJpeDJDb2x1bW5zIDwgJG1hdHJpeDFDb2x1bW5zKSB7CgkJCQlmb3IgKCRpID0gMDsgJGkgPCAkbWF0cml4MVJvd3M7ICsrJGkpIHsKCQkJCQlmb3IgKCRqID0gJG1hdHJpeDJDb2x1bW5zOyAkaiA8ICRtYXRyaXgxQ29sdW1uczsgKyskaikgewoJCQkJCQl1bnNldCgkbWF0cml4MVskaV1bJGpdKTsKCQkJCQl9CgkJCQl9CgkJCX0KCQkJaWYgKCRtYXRyaXgyUm93cyA8ICRtYXRyaXgxUm93cykgewoJCQkJZm9yICgkaSA9ICRtYXRyaXgyUm93czsgJGkgPCAkbWF0cml4MVJvd3M7ICsrJGkpIHsKCQkJCQl1bnNldCgkbWF0cml4MVskaV0pOwoJCQkJfQoJCQl9CgkJfQoKCQlpZiAoKCRtYXRyaXgxQ29sdW1ucyA8ICRtYXRyaXgyQ29sdW1ucykgfHwgKCRtYXRyaXgxUm93cyA8ICRtYXRyaXgyUm93cykpIHsKCQkJaWYgKCRtYXRyaXgxQ29sdW1ucyA8ICRtYXRyaXgyQ29sdW1ucykgewoJCQkJZm9yICgkaSA9IDA7ICRpIDwgJG1hdHJpeDJSb3dzOyArKyRpKSB7CgkJCQkJZm9yICgkaiA9ICRtYXRyaXgxQ29sdW1uczsgJGogPCAkbWF0cml4MkNvbHVtbnM7ICsrJGopIHsKCQkJCQkJdW5zZXQoJG1hdHJpeDJbJGldWyRqXSk7CgkJCQkJfQoJCQkJfQoJCQl9CgkJCWlmICgkbWF0cml4MVJvd3MgPCAkbWF0cml4MlJvd3MpIHsKCQkJCWZvciAoJGkgPSAkbWF0cml4MVJvd3M7ICRpIDwgJG1hdHJpeDJSb3dzOyArKyRpKSB7CgkJCQkJdW5zZXQoJG1hdHJpeDJbJGldKTsKCQkJCX0KCQkJfQoJCX0KCX0JLy8JZnVuY3Rpb24gX3Jlc2l6ZU1hdHJpY2VzU2hyaW5rKCkKCgoJLyoqCgkgKiBFbnN1cmUgdGhhdCBwYWlyZWQgbWF0cml4IG9wZXJhbmRzIGFyZSBib3RoIG1hdHJpY2VzIG9mIHRoZSBzYW1lIHNpemUKCSAqCgkgKiBAcGFyYW0JbWl4ZWQJCSYkbWF0cml4MQlGaXJzdCBtYXRyaXggb3BlcmFuZAoJICogQHBhcmFtCW1peGVkCQkmJG1hdHJpeDIJU2Vjb25kIG1hdHJpeCBvcGVyYW5kCgkgKi8KCXByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIF9yZXNpemVNYXRyaWNlc0V4dGVuZCgmJG1hdHJpeDEsJiRtYXRyaXgyLCRtYXRyaXgxUm93cywkbWF0cml4MUNvbHVtbnMsJG1hdHJpeDJSb3dzLCRtYXRyaXgyQ29sdW1ucykgewoJCWlmICgoJG1hdHJpeDJDb2x1bW5zIDwgJG1hdHJpeDFDb2x1bW5zKSB8fCAoJG1hdHJpeDJSb3dzIDwgJG1hdHJpeDFSb3dzKSkgewoJCQlpZiAoJG1hdHJpeDJDb2x1bW5zIDwgJG1hdHJpeDFDb2x1bW5zKSB7CgkJCQlmb3IgKCRpID0gMDsgJGkgPCAkbWF0cml4MlJvd3M7ICsrJGkpIHsKCQkJCQkkeCA9ICRtYXRyaXgyWyRpXVskbWF0cml4MkNvbHVtbnMtMV07CgkJCQkJZm9yICgkaiA9ICRtYXRyaXgyQ29sdW1uczsgJGogPCAkbWF0cml4MUNvbHVtbnM7ICsrJGopIHsKCQkJCQkJJG1hdHJpeDJbJGldWyRqXSA9ICR4OwoJCQkJCX0KCQkJCX0KCQkJfQoJCQlpZiAoJG1hdHJpeDJSb3dzIDwgJG1hdHJpeDFSb3dzKSB7CgkJCQkkeCA9ICRtYXRyaXgyWyRtYXRyaXgyUm93cy0xXTsKCQkJCWZvciAoJGkgPSAwOyAkaSA8ICRtYXRyaXgxUm93czsgKyskaSkgewoJCQkJCSRtYXRyaXgyWyRpXSA9ICR4OwoJCQkJfQoJCQl9CgkJfQoKCQlpZiAoKCRtYXRyaXgxQ29sdW1ucyA8ICRtYXRyaXgyQ29sdW1ucykgfHwgKCRtYXRyaXgxUm93cyA8ICRtYXRyaXgyUm93cykpIHsKCQkJaWYgKCRtYXRyaXgxQ29sdW1ucyA8ICRtYXRyaXgyQ29sdW1ucykgewoJCQkJZm9yICgkaSA9IDA7ICRpIDwgJG1hdHJpeDFSb3dzOyArKyRpKSB7CgkJCQkJJHggPSAkbWF0cml4MVskaV1bJG1hdHJpeDFDb2x1bW5zLTFdOwoJCQkJCWZvciAoJGogPSAkbWF0cml4MUNvbHVtbnM7ICRqIDwgJG1hdHJpeDJDb2x1bW5zOyArKyRqKSB7CgkJCQkJCSRtYXRyaXgxWyRpXVskal0gPSAkeDsKCQkJCQl9CgkJCQl9CgkJCX0KCQkJaWYgKCRtYXRyaXgxUm93cyA8ICRtYXRyaXgyUm93cykgewoJCQkJJHggPSAkbWF0cml4MVskbWF0cml4MVJvd3MtMV07CgkJCQlmb3IgKCRpID0gMDsgJGkgPCAkbWF0cml4MlJvd3M7ICsrJGkpIHsKCQkJCQkkbWF0cml4MVskaV0gPSAkeDsKCQkJCX0KCQkJfQoJCX0KCX0JLy8JZnVuY3Rpb24gX3Jlc2l6ZU1hdHJpY2VzRXh0ZW5kKCkKCgoJLyoqCgkgKiBGb3JtYXQgZGV0YWlscyBvZiBhbiBvcGVyYW5kIGZvciBkaXNwbGF5IGluIHRoZSBsb2cgKGJhc2VkIG9uIG9wZXJhbmQgdHlwZSkKCSAqCgkgKiBAcGFyYW0JbWl4ZWQJCSR2YWx1ZQlGaXJzdCBtYXRyaXggb3BlcmFuZAoJICogQHJldHVybgltaXhlZAoJICovCglwcml2YXRlIGZ1bmN0aW9uIF9zaG93VmFsdWUoJHZhbHVlKSB7CgkJaWYgKCR0aGlzLT53cml0ZURlYnVnTG9nKSB7CgkJCSR0ZXN0QXJyYXkgPSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5BcnJheSgkdmFsdWUpOwoJCQlpZiAoY291bnQoJHRlc3RBcnJheSkgPT0gMSkgewoJCQkJJHZhbHVlID0gYXJyYXlfcG9wKCR0ZXN0QXJyYXkpOwoJCQl9CgoJCQlpZiAoaXNfYXJyYXkoJHZhbHVlKSkgewoJCQkJJHJldHVybk1hdHJpeCA9IGFycmF5KCk7CgkJCQkkcGFkID0gJHJwYWQgPSAnLCAnOwoJCQkJZm9yZWFjaCgkdmFsdWUgYXMgJHJvdykgewoJCQkJCWlmIChpc19hcnJheSgkcm93KSkgewoJCQkJCQkkcmV0dXJuTWF0cml4W10gPSBpbXBsb2RlKCRwYWQsYXJyYXlfbWFwKGFycmF5KCR0aGlzLCdfc2hvd1ZhbHVlJyksJHJvdykpOwoJCQkJCQkkcnBhZCA9ICc7ICc7CgkJCQkJfSBlbHNlIHsKCQkJCQkJJHJldHVybk1hdHJpeFtdID0gJHRoaXMtPl9zaG93VmFsdWUoJHJvdyk7CgkJCQkJfQoJCQkJfQoJCQkJcmV0dXJuICd7ICcuaW1wbG9kZSgkcnBhZCwkcmV0dXJuTWF0cml4KS4nIH0nOwoJCQl9IGVsc2VpZihpc19zdHJpbmcoJHZhbHVlKSAmJiAodHJpbSgkdmFsdWUsJyInKSA9PSAkdmFsdWUpKSB7CgkJCQlyZXR1cm4gJyInLiR2YWx1ZS4nIic7CgkJCX0gZWxzZWlmKGlzX2Jvb2woJHZhbHVlKSkgewoJCQkJcmV0dXJuICgkdmFsdWUpID8gc2VsZjo6JF9sb2NhbGVCb29sZWFuWydUUlVFJ10gOiBzZWxmOjokX2xvY2FsZUJvb2xlYW5bJ0ZBTFNFJ107CgkJCX0KCQl9CgkJcmV0dXJuIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlblNpbmdsZVZhbHVlKCR2YWx1ZSk7Cgl9CS8vCWZ1bmN0aW9uIF9zaG93VmFsdWUoKQoKCgkvKioKCSAqIEZvcm1hdCB0eXBlIGFuZCBkZXRhaWxzIG9mIGFuIG9wZXJhbmQgZm9yIGRpc3BsYXkgaW4gdGhlIGxvZyAoYmFzZWQgb24gb3BlcmFuZCB0eXBlKQoJICoKCSAqIEBwYXJhbQltaXhlZAkJJHZhbHVlCUZpcnN0IG1hdHJpeCBvcGVyYW5kCgkgKiBAcmV0dXJuCW1peGVkCgkgKi8KCXByaXZhdGUgZnVuY3Rpb24gX3Nob3dUeXBlRGV0YWlscygkdmFsdWUpIHsKCQlpZiAoJHRoaXMtPndyaXRlRGVidWdMb2cpIHsKCQkJJHRlc3RBcnJheSA9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlbkFycmF5KCR2YWx1ZSk7CgkJCWlmIChjb3VudCgkdGVzdEFycmF5KSA9PSAxKSB7CgkJCQkkdmFsdWUgPSBhcnJheV9wb3AoJHRlc3RBcnJheSk7CgkJCX0KCgkJCWlmICgkdmFsdWUgPT09IE5VTEwpIHsKCQkJCXJldHVybiAnYSBOVUxMIHZhbHVlJzsKCQkJfSBlbHNlaWYgKGlzX2Zsb2F0KCR2YWx1ZSkpIHsKCQkJCSR0eXBlU3RyaW5nID0gJ2EgZmxvYXRpbmcgcG9pbnQgbnVtYmVyJzsKCQkJfSBlbHNlaWYoaXNfaW50KCR2YWx1ZSkpIHsKCQkJCSR0eXBlU3RyaW5nID0gJ2FuIGludGVnZXIgbnVtYmVyJzsKCQkJfSBlbHNlaWYoaXNfYm9vbCgkdmFsdWUpKSB7CgkJCQkkdHlwZVN0cmluZyA9ICdhIGJvb2xlYW4nOwoJCQl9IGVsc2VpZihpc19hcnJheSgkdmFsdWUpKSB7CgkJCQkkdHlwZVN0cmluZyA9ICdhIG1hdHJpeCc7CgkJCX0gZWxzZSB7CgkJCQlpZiAoJHZhbHVlID09ICcnKSB7CgkJCQkJcmV0dXJuICdhbiBlbXB0eSBzdHJpbmcnOwoJCQkJfSBlbHNlaWYgKCR2YWx1ZXswfSA9PSAnIycpIHsKCQkJCQlyZXR1cm4gJ2EgJy4kdmFsdWUuJyBlcnJvcic7CgkJCQl9IGVsc2UgewoJCQkJCSR0eXBlU3RyaW5nID0gJ2Egc3RyaW5nJzsKCQkJCX0KCQkJfQoJCQlyZXR1cm4gJHR5cGVTdHJpbmcuJyB3aXRoIGEgdmFsdWUgb2YgJy4kdGhpcy0+X3Nob3dWYWx1ZSgkdmFsdWUpOwoJCX0KCX0JLy8JZnVuY3Rpb24gX3Nob3dUeXBlRGV0YWlscygpCgoKCXByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIF9jb252ZXJ0TWF0cml4UmVmZXJlbmNlcygkZm9ybXVsYSkgewoJCXN0YXRpYyAkbWF0cml4UmVwbGFjZUZyb20gPSBhcnJheSgneycsJzsnLCd9Jyk7CgkJc3RhdGljICRtYXRyaXhSZXBsYWNlVG8gPSBhcnJheSgnTUtNQVRSSVgoTUtNQVRSSVgoJywnKSxNS01BVFJJWCgnLCcpKScpOwoKCQkvLwlDb252ZXJ0IGFueSBFeGNlbCBtYXRyaXggcmVmZXJlbmNlcyB0byB0aGUgTUtNQVRSSVgoKSBmdW5jdGlvbgoJCWlmIChzdHJwb3MoJGZvcm11bGEsJ3snKSAhPT0gZmFsc2UpIHsKCQkJLy8JSWYgdGhlcmUgaXMgdGhlIHBvc3NpYmlsaXR5IG9mIGJyYWNlcyB3aXRoaW4gYSBxdW90ZWQgc3RyaW5nLCB0aGVuIHdlIGRvbid0IHRyZWF0IHRob3NlIGFzIG1hdHJpeCBpbmRpY2F0b3JzCgkJCWlmIChzdHJwb3MoJGZvcm11bGEsJyInKSAhPT0gZmFsc2UpIHsKCQkJCS8vCVNvIGluc3RlYWQgd2Ugc2tpcCByZXBsYWNpbmcgaW4gYW55IHF1b3RlZCBzdHJpbmdzIGJ5IG9ubHkgcmVwbGFjaW5nIGluIGV2ZXJ5IG90aGVyIGFycmF5IGVsZW1lbnQgYWZ0ZXIgd2UndmUgZXhwbG9kZWQKCQkJCS8vCQl0aGUgZm9ybXVsYQoJCQkJJHRlbXAgPSBleHBsb2RlKCciJywkZm9ybXVsYSk7CgkJCQkvLwlPcGVuIGFuZCBDbG9zZWQgY291bnRzIHVzZWQgZm9yIHRyYXBwaW5nIG1pc21hdGNoZWQgYnJhY2VzIGluIHRoZSBmb3JtdWxhCgkJCQkkb3BlbkNvdW50ID0gJGNsb3NlQ291bnQgPSAwOwoJCQkJJGkgPSBmYWxzZTsKCQkJCWZvcmVhY2goJHRlbXAgYXMgJiR2YWx1ZSkgewoJCQkJCS8vCU9ubHkgY291bnQvcmVwbGFjZSBpbiBhbHRlcm5hdGluZyBhcnJheSBlbnRyaWVzCgkJCQkJaWYgKCRpID0gISRpKSB7CgkJCQkJCSRvcGVuQ291bnQgKz0gc3Vic3RyX2NvdW50KCR2YWx1ZSwneycpOwoJCQkJCQkkY2xvc2VDb3VudCArPSBzdWJzdHJfY291bnQoJHZhbHVlLCd9Jyk7CgkJCQkJCSR2YWx1ZSA9IHN0cl9yZXBsYWNlKCRtYXRyaXhSZXBsYWNlRnJvbSwkbWF0cml4UmVwbGFjZVRvLCR2YWx1ZSk7CgkJCQkJfQoJCQkJfQoJCQkJdW5zZXQoJHZhbHVlKTsKCQkJCS8vCVRoZW4gcmVidWlsZCB0aGUgZm9ybXVsYSBzdHJpbmcKCQkJCSRmb3JtdWxhID0gaW1wbG9kZSgnIicsJHRlbXApOwoJCQl9IGVsc2UgewoJCQkJLy8JSWYgdGhlcmUncyBubyBxdW90ZWQgc3RyaW5ncywgdGhlbiB3ZSBkbyBhIHNpbXBsZSBjb3VudC9yZXBsYWNlCgkJCQkkb3BlbkNvdW50ID0gc3Vic3RyX2NvdW50KCRmb3JtdWxhLCd7Jyk7CgkJCQkkY2xvc2VDb3VudCA9IHN1YnN0cl9jb3VudCgkZm9ybXVsYSwnfScpOwoJCQkJJGZvcm11bGEgPSBzdHJfcmVwbGFjZSgkbWF0cml4UmVwbGFjZUZyb20sJG1hdHJpeFJlcGxhY2VUbywkZm9ybXVsYSk7CgkJCX0KCQkJLy8JVHJhcCBmb3IgbWlzbWF0Y2hlZCBicmFjZXMgYW5kIHRyaWdnZXIgYW4gYXBwcm9wcmlhdGUgZXJyb3IKCQkJaWYgKCRvcGVuQ291bnQgPCAkY2xvc2VDb3VudCkgewoJCQkJaWYgKCRvcGVuQ291bnQgPiAwKSB7CgkJCQkJcmV0dXJuICR0aGlzLT5fcmFpc2VGb3JtdWxhRXJyb3IoIkZvcm11bGEgRXJyb3I6IE1pc21hdGNoZWQgbWF0cml4IGJyYWNlcyAnfSciKTsKCQkJCX0gZWxzZSB7CgkJCQkJcmV0dXJuICR0aGlzLT5fcmFpc2VGb3JtdWxhRXJyb3IoIkZvcm11bGEgRXJyb3I6IFVuZXhwZWN0ZWQgJ30nIGVuY291bnRlcmVkIik7CgkJCQl9CgkJCX0gZWxzZWlmICgkb3BlbkNvdW50ID4gJGNsb3NlQ291bnQpIHsKCQkJCWlmICgkY2xvc2VDb3VudCA+IDApIHsKCQkJCQlyZXR1cm4gJHRoaXMtPl9yYWlzZUZvcm11bGFFcnJvcigiRm9ybXVsYSBFcnJvcjogTWlzbWF0Y2hlZCBtYXRyaXggYnJhY2VzICd7JyIpOwoJCQkJfSBlbHNlIHsKCQkJCQlyZXR1cm4gJHRoaXMtPl9yYWlzZUZvcm11bGFFcnJvcigiRm9ybXVsYSBFcnJvcjogVW5leHBlY3RlZCAneycgZW5jb3VudGVyZWQiKTsKCQkJCX0KCQkJfQoJCX0KCgkJcmV0dXJuICRmb3JtdWxhOwoJfQkvLwlmdW5jdGlvbiBfY29udmVydE1hdHJpeFJlZmVyZW5jZXMoKQoKCglwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBfbWtNYXRyaXgoKSB7CgkJcmV0dXJuIGZ1bmNfZ2V0X2FyZ3MoKTsKCX0JLy8JZnVuY3Rpb24gX21rTWF0cml4KCkKCgoJLy8gQ29udmVydCBpbmZpeCB0byBwb3N0Zml4IG5vdGF0aW9uCglwcml2YXRlIGZ1bmN0aW9uIF9wYXJzZUZvcm11bGEoJGZvcm11bGEsIFBIUEV4Y2VsX0NlbGwgJHBDZWxsID0gbnVsbCkgewoJCWlmICgoJGZvcm11bGEgPSBzZWxmOjpfY29udmVydE1hdHJpeFJlZmVyZW5jZXModHJpbSgkZm9ybXVsYSkpKSA9PT0gZmFsc2UpIHsKCQkJcmV0dXJuIEZBTFNFOwoJCX0KCgkJLy8JSWYgd2UncmUgdXNpbmcgY2VsbCBjYWNoaW5nLCB0aGVuICRwQ2VsbCBtYXkgd2VsbCBiZSBmbHVzaGVkIGJhY2sgdG8gdGhlIGNhY2hlICh3aGljaCBkZXRhY2hlcyB0aGUgcGFyZW50IHdvcmtzaGVldCksCgkJLy8JCXNvIHdlIHN0b3JlIHRoZSBwYXJlbnQgd29ya3NoZWV0IHNvIHRoYXQgd2UgY2FuIHJlLWF0dGFjaCBpdCB3aGVuIG5lY2Vzc2FyeQoJCSRwQ2VsbFBhcmVudCA9ICgkcENlbGwgIT09IE5VTEwpID8gJHBDZWxsLT5nZXRQYXJlbnQoKSA6IE5VTEw7CgoJCS8vCUJpbmFyeSBPcGVyYXRvcnMKCQkvLwlUaGVzZSBvcGVyYXRvcnMgYWx3YXlzIHdvcmsgb24gdHdvIHZhbHVlcwoJCS8vCUFycmF5IGtleSBpcyB0aGUgb3BlcmF0b3IsIHRoZSB2YWx1ZSBpbmRpY2F0ZXMgd2hldGhlciB0aGlzIGlzIGEgbGVmdCBvciByaWdodCBhc3NvY2lhdGl2ZSBvcGVyYXRvcgoJCSRvcGVyYXRvckFzc29jaWF0aXZpdHkJPSBhcnJheSgnXicgPT4gMCwJCQkJCQkJCQkJCQkJCQkvLwlFeHBvbmVudGlhdGlvbgoJCQkJCQkJCQkJJyonID0+IDAsICcvJyA9PiAwLCAJCQkJCQkJCQkJCQkvLwlNdWx0aXBsaWNhdGlvbiBhbmQgRGl2aXNpb24KCQkJCQkJCQkJCScrJyA9PiAwLCAnLScgPT4gMCwJCQkJCQkJCQkJCQkJLy8JQWRkaXRpb24gYW5kIFN1YnRyYWN0aW9uCgkJCQkJCQkJCQknJicgPT4gMCwJCQkJCQkJCQkJCQkJCQkvLwlDb25jYXRlbmF0aW9uCgkJCQkJCQkJCQknfCcgPT4gMCwgJzonID0+IDAsCQkJCQkJCQkJCQkJCS8vCUludGVyc2VjdCBhbmQgUmFuZ2UKCQkJCQkJCQkJCSc+JyA9PiAwLCAnPCcgPT4gMCwgJz0nID0+IDAsICc+PScgPT4gMCwgJzw9JyA9PiAwLCAnPD4nID0+IDAJCS8vCUNvbXBhcmlzb24KCQkJCQkJCQkgCSAgKTsKCQkvLwlDb21wYXJpc29uIChCb29sZWFuKSBPcGVyYXRvcnMKCQkvLwlUaGVzZSBvcGVyYXRvcnMgd29yayBvbiB0d28gdmFsdWVzLCBidXQgYWx3YXlzIHJldHVybiBhIGJvb2xlYW4gcmVzdWx0CgkJJGNvbXBhcmlzb25PcGVyYXRvcnMJPSBhcnJheSgnPicgPT4gdHJ1ZSwgJzwnID0+IHRydWUsICc9JyA9PiB0cnVlLCAnPj0nID0+IHRydWUsICc8PScgPT4gdHJ1ZSwgJzw+JyA9PiB0cnVlKTsKCgkJLy8JT3BlcmF0b3IgUHJlY2VkZW5jZQoJCS8vCVRoaXMgbGlzdCBpbmNsdWRlcyBhbGwgdmFsaWQgb3BlcmF0b3JzLCB3aGV0aGVyIGJpbmFyeSAoaW5jbHVkaW5nIGJvb2xlYW4pIG9yIHVuYXJ5IChzdWNoIGFzICUpCgkJLy8JQXJyYXkga2V5IGlzIHRoZSBvcGVyYXRvciwgdGhlIHZhbHVlIGlzIGl0cyBwcmVjZWRlbmNlCgkJJG9wZXJhdG9yUHJlY2VkZW5jZQk9IGFycmF5KCc6JyA9PiA4LAkJCQkJCQkJCQkJCQkJCQkvLwlSYW5nZQoJCQkJCQkJCQknfCcgPT4gNywJCQkJCQkJCQkJCQkJCQkJLy8JSW50ZXJzZWN0CgkJCQkJCQkJCSd+JyA9PiA2LAkJCQkJCQkJCQkJCQkJCQkvLwlOZWdhdGlvbgoJCQkJCQkJCQknJScgPT4gNSwJCQkJCQkJCQkJCQkJCQkJLy8JUGVyY2VudGFnZQoJCQkJCQkJCQknXicgPT4gNCwJCQkJCQkJCQkJCQkJCQkJLy8JRXhwb25lbnRpYXRpb24KCQkJCQkJCQkJJyonID0+IDMsICcvJyA9PiAzLCAJCQkJCQkJCQkJCQkJLy8JTXVsdGlwbGljYXRpb24gYW5kIERpdmlzaW9uCgkJCQkJCQkJCScrJyA9PiAyLCAnLScgPT4gMiwJCQkJCQkJCQkJCQkJCS8vCUFkZGl0aW9uIGFuZCBTdWJ0cmFjdGlvbgoJCQkJCQkJCQknJicgPT4gMSwJCQkJCQkJCQkJCQkJCQkJLy8JQ29uY2F0ZW5hdGlvbgoJCQkJCQkJCQknPicgPT4gMCwgJzwnID0+IDAsICc9JyA9PiAwLCAnPj0nID0+IDAsICc8PScgPT4gMCwgJzw+JyA9PiAwCQkJLy8JQ29tcGFyaXNvbgoJCQkJCQkJCSAgICk7CgoJCSRyZWdleHBNYXRjaFN0cmluZyA9ICcvXignLnNlbGY6OkNBTENVTEFUSU9OX1JFR0VYUF9GVU5DVElPTi4KCQkJCQkJCSAgICd8Jy5zZWxmOjpDQUxDVUxBVElPTl9SRUdFWFBfTlVNQkVSLgoJCQkJCQkJICAgJ3wnLnNlbGY6OkNBTENVTEFUSU9OX1JFR0VYUF9TVFJJTkcuCgkJCQkJCQkgICAnfCcuc2VsZjo6Q0FMQ1VMQVRJT05fUkVHRVhQX09QRU5CUkFDRS4KCQkJCQkJCSAgICd8Jy5zZWxmOjpDQUxDVUxBVElPTl9SRUdFWFBfQ0VMTFJFRi4KCQkJCQkJCSAgICd8Jy5zZWxmOjpDQUxDVUxBVElPTl9SRUdFWFBfTkFNRURSQU5HRS4KCQkJCQkJCSAgICd8Jy5zZWxmOjpDQUxDVUxBVElPTl9SRUdFWFBfRVJST1IuCgkJCQkJCQkgJykvc2knOwoKCQkvLwlTdGFydCB3aXRoIGluaXRpYWxpc2F0aW9uCgkJJGluZGV4ID0gMDsKCQkkc3RhY2sgPSBuZXcgUEhQRXhjZWxfVG9rZW5fU3RhY2s7CgkJJG91dHB1dCA9IGFycmF5KCk7CgkJJGV4cGVjdGluZ09wZXJhdG9yID0gZmFsc2U7CQkJCQkvLwlXZSB1c2UgdGhpcyB0ZXN0IGluIHN5bnRheC1jaGVja2luZyB0aGUgZXhwcmVzc2lvbiB0byBkZXRlcm1pbmUgd2hlbiBhCgkJCQkJCQkJCQkJCQkvLwkJLSBpcyBhIG5lZ2F0aW9uIG9yICsgaXMgYSBwb3NpdGl2ZSBvcGVyYXRvciByYXRoZXIgdGhhbiBhbiBvcGVyYXRpb24KCQkkZXhwZWN0aW5nT3BlcmFuZCA9IGZhbHNlOwkJCQkJLy8JV2UgdXNlIHRoaXMgdGVzdCBpbiBzeW50YXgtY2hlY2tpbmcgdGhlIGV4cHJlc3Npb24gdG8gZGV0ZXJtaW5lIHdoZXRoZXIgYW4gb3BlcmFuZAoJCQkJCQkJCQkJCQkJLy8JCXNob3VsZCBiZSBudWxsIGluIGEgZnVuY3Rpb24gY2FsbAoJCS8vCVRoZSBndXRzIG9mIHRoZSBsZXhpY2FsIHBhcnNlcgoJCS8vCUxvb3AgdGhyb3VnaCB0aGUgZm9ybXVsYSBleHRyYWN0aW5nIGVhY2ggb3BlcmF0b3IgYW5kIG9wZXJhbmQgaW4gdHVybgoJCXdoaWxlKHRydWUpIHsKLy8JCQllY2hvICdBc3Nlc3NpbmcgRXhwcmVzc2lvbiA8Yj4nLnN1YnN0cigkZm9ybXVsYSwgJGluZGV4KS4nPC9iPjxiciAvPic7CgkJCSRvcENoYXJhY3RlciA9ICRmb3JtdWxheyRpbmRleH07CS8vCUdldCB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIHRoZSB2YWx1ZSBhdCB0aGUgY3VycmVudCBpbmRleCBwb3NpdGlvbgovLwkJCWVjaG8gJ0luaXRpYWwgY2hhcmFjdGVyIG9mIGV4cHJlc3Npb24gYmxvY2sgaXMgJy4kb3BDaGFyYWN0ZXIuJzxiciAvPic7CgkJCWlmICgoaXNzZXQoJGNvbXBhcmlzb25PcGVyYXRvcnNbJG9wQ2hhcmFjdGVyXSkpICYmIChzdHJsZW4oJGZvcm11bGEpID4gJGluZGV4KSAmJiAoaXNzZXQoJGNvbXBhcmlzb25PcGVyYXRvcnNbJGZvcm11bGF7JGluZGV4KzF9XSkpKSB7CgkJCQkkb3BDaGFyYWN0ZXIgLj0gJGZvcm11bGF7KyskaW5kZXh9OwovLwkJCQllY2hvICdJbml0aWFsIGNoYXJhY3RlciBvZiBleHByZXNzaW9uIGJsb2NrIGlzIGNvbXBhcmlzb24gb3BlcmF0b3IgJy4kb3BDaGFyYWN0ZXIuJzxiciAvPic7CgkJCX0KCgkJCS8vCUZpbmQgb3V0IGlmIHdlJ3JlIGN1cnJlbnRseSBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgbnVtYmVyLCB2YXJpYWJsZSwgY2VsbCByZWZlcmVuY2UsIGZ1bmN0aW9uLCBwYXJlbnRoZXNpcyBvciBvcGVyYW5kCgkJCSRpc09wZXJhbmRPckZ1bmN0aW9uID0gcHJlZ19tYXRjaCgkcmVnZXhwTWF0Y2hTdHJpbmcsIHN1YnN0cigkZm9ybXVsYSwgJGluZGV4KSwgJG1hdGNoKTsKLy8JCQllY2hvICckaXNPcGVyYW5kT3JGdW5jdGlvbiBpcyAnLigoJGlzT3BlcmFuZE9yRnVuY3Rpb24pID8gJ1RydWUnIDogJ0ZhbHNlJykuJzxiciAvPic7Ci8vCQkJdmFyX2R1bXAoJG1hdGNoKTsKCgkJCWlmICgkb3BDaGFyYWN0ZXIgPT0gJy0nICYmICEkZXhwZWN0aW5nT3BlcmF0b3IpIHsJCQkJLy8JSXMgaXQgYSBuZWdhdGlvbiBpbnN0ZWFkIG9mIGEgbWludXM/Ci8vCQkJCWVjaG8gJ0VsZW1lbnQgaXMgYSBOZWdhdGlvbiBvcGVyYXRvcjxiciAvPic7CgkJCQkkc3RhY2stPnB1c2goJ1VuYXJ5IE9wZXJhdG9yJywnficpOwkJCQkJCQkvLwlQdXQgYSBuZWdhdGlvbiBvbiB0aGUgc3RhY2sKCQkJCSsrJGluZGV4OwkJCQkJCQkJCQkJCQkvLwkJYW5kIGRyb3AgdGhlIG5lZ2F0aW9uIHN5bWJvbAoJCQl9IGVsc2VpZiAoJG9wQ2hhcmFjdGVyID09ICclJyAmJiAkZXhwZWN0aW5nT3BlcmF0b3IpIHsKLy8JCQkJZWNobyAnRWxlbWVudCBpcyBhIFBlcmNlbnRhZ2Ugb3BlcmF0b3I8YnIgLz4nOwoJCQkJJHN0YWNrLT5wdXNoKCdVbmFyeSBPcGVyYXRvcicsJyUnKTsJCQkJCQkJLy8JUHV0IGEgcGVyY2VudGFnZSBvbiB0aGUgc3RhY2sKCQkJCSsrJGluZGV4OwoJCQl9IGVsc2VpZiAoJG9wQ2hhcmFjdGVyID09ICcrJyAmJiAhJGV4cGVjdGluZ09wZXJhdG9yKSB7CQkJLy8JUG9zaXRpdmUgKHVuYXJ5IHBsdXMgcmF0aGVyIHRoYW4gYmluYXJ5IG9wZXJhdG9yIHBsdXMpIGNhbiBiZSBkaXNjYXJkZWQ/Ci8vCQkJCWVjaG8gJ0VsZW1lbnQgaXMgYSBQb3NpdGl2ZSBudW1iZXIsIG5vdCBQbHVzIG9wZXJhdG9yPGJyIC8+JzsKCQkJCSsrJGluZGV4OwkJCQkJCQkJCQkJCQkvLwlEcm9wIHRoZSByZWR1bmRhbnQgcGx1cyBzeW1ib2wKCQkJfSBlbHNlaWYgKCgoJG9wQ2hhcmFjdGVyID09ICd+JykgfHwgKCRvcENoYXJhY3RlciA9PSAnfCcpKSAmJiAoISRpc09wZXJhbmRPckZ1bmN0aW9uKSkgewkvLwlXZSBoYXZlIHRvIGV4cGxpY2l0bHkgZGVueSBhIHRpbGRlIG9yIHBpcGUsIGJlY2F1c2UgdGhleSBhcmUgbGVnYWwKCQkJCXJldHVybiAkdGhpcy0+X3JhaXNlRm9ybXVsYUVycm9yKCJGb3JtdWxhIEVycm9yOiBJbGxlZ2FsIGNoYXJhY3RlciAnficiKTsJCQkJLy8JCW9uIHRoZSBzdGFjayBidXQgbm90IGluIHRoZSBpbnB1dCBleHByZXNzaW9uCgoJCQl9IGVsc2VpZiAoKGlzc2V0KHNlbGY6OiRfb3BlcmF0b3JzWyRvcENoYXJhY3Rlcl0pIG9yICRpc09wZXJhbmRPckZ1bmN0aW9uKSAmJiAkZXhwZWN0aW5nT3BlcmF0b3IpIHsJLy8JQXJlIHdlIHB1dHRpbmcgYW4gb3BlcmF0b3Igb24gdGhlIHN0YWNrPwovLwkJCQllY2hvICdFbGVtZW50IHdpdGggdmFsdWUgJy4kb3BDaGFyYWN0ZXIuJyBpcyBhbiBPcGVyYXRvcjxiciAvPic7CgkJCQl3aGlsZSgkc3RhY2stPmNvdW50KCkgPiAwICYmCgkJCQkJKCRvMiA9ICRzdGFjay0+bGFzdCgpKSAmJgoJCQkJCWlzc2V0KHNlbGY6OiRfb3BlcmF0b3JzWyRvMlsndmFsdWUnXV0pICYmCgkJCQkJQCgkb3BlcmF0b3JBc3NvY2lhdGl2aXR5WyRvcENoYXJhY3Rlcl0gPyAkb3BlcmF0b3JQcmVjZWRlbmNlWyRvcENoYXJhY3Rlcl0gPCAkb3BlcmF0b3JQcmVjZWRlbmNlWyRvMlsndmFsdWUnXV0gOiAkb3BlcmF0b3JQcmVjZWRlbmNlWyRvcENoYXJhY3Rlcl0gPD0gJG9wZXJhdG9yUHJlY2VkZW5jZVskbzJbJ3ZhbHVlJ11dKSkgewoJCQkJCSRvdXRwdXRbXSA9ICRzdGFjay0+cG9wKCk7CQkJCQkJCQkvLwlTd2FwIG9wZXJhbmRzIGFuZCBoaWdoZXIgcHJlY2VkZW5jZSBvcGVyYXRvcnMgZnJvbSB0aGUgc3RhY2sgdG8gdGhlIG91dHB1dAoJCQkJfQoJCQkJJHN0YWNrLT5wdXNoKCdCaW5hcnkgT3BlcmF0b3InLCRvcENoYXJhY3Rlcik7CS8vCUZpbmFsbHkgcHV0IG91ciBjdXJyZW50IG9wZXJhdG9yIG9udG8gdGhlIHN0YWNrCgkJCQkrKyRpbmRleDsKCQkJCSRleHBlY3RpbmdPcGVyYXRvciA9IGZhbHNlOwoKCQkJfSBlbHNlaWYgKCRvcENoYXJhY3RlciA9PSAnKScgJiYgJGV4cGVjdGluZ09wZXJhdG9yKSB7CQkJLy8JQXJlIHdlIGV4cGVjdGluZyB0byBjbG9zZSBhIHBhcmVudGhlc2lzPwovLwkJCQllY2hvICdFbGVtZW50IGlzIGEgQ2xvc2luZyBicmFja2V0PGJyIC8+JzsKCQkJCSRleHBlY3RpbmdPcGVyYW5kID0gZmFsc2U7CgkJCQl3aGlsZSAoKCRvMiA9ICRzdGFjay0+cG9wKCkpICYmICRvMlsndmFsdWUnXSAhPSAnKCcpIHsJCS8vCVBvcCBvZmYgdGhlIHN0YWNrIGJhY2sgdG8gdGhlIGxhc3QgKAoJCQkJCWlmICgkbzIgPT09IE5VTEwpIHJldHVybiAkdGhpcy0+X3JhaXNlRm9ybXVsYUVycm9yKCdGb3JtdWxhIEVycm9yOiBVbmV4cGVjdGVkIGNsb3NpbmcgYnJhY2UgIikiJyk7CgkJCQkJZWxzZSAkb3V0cHV0W10gPSAkbzI7CgkJCQl9CgkJCQkkZCA9ICRzdGFjay0+bGFzdCgyKTsKCQkJCWlmIChwcmVnX21hdGNoKCcvXicuc2VsZjo6Q0FMQ1VMQVRJT05fUkVHRVhQX0ZVTkNUSU9OLickL2knLCAkZFsndmFsdWUnXSwgJG1hdGNoZXMpKSB7CS8vCURpZCB0aGlzIHBhcmVudGhlc2lzIGp1c3QgY2xvc2UgYSBmdW5jdGlvbj8KCQkJCQkkZnVuY3Rpb25OYW1lID0gJG1hdGNoZXNbMV07CQkJCQkJCQkJCS8vCUdldCB0aGUgZnVuY3Rpb24gbmFtZQovLwkJCQkJZWNobyAnQ2xvc2VkIEZ1bmN0aW9uIGlzICcuJGZ1bmN0aW9uTmFtZS4nPGJyIC8+JzsKCQkJCQkkZCA9ICRzdGFjay0+cG9wKCk7CgkJCQkJJGFyZ3VtZW50Q291bnQgPSAkZFsndmFsdWUnXTsJCS8vCVNlZSBob3cgbWFueSBhcmd1bWVudHMgdGhlcmUgd2VyZSAoYXJndW1lbnQgY291bnQgaXMgdGhlIG5leHQgdmFsdWUgc3RvcmVkIG9uIHRoZSBzdGFjaykKLy8JCQkJCWlmICgkYXJndW1lbnRDb3VudCA9PSAwKSB7Ci8vCQkJCQkJZWNobyAnV2l0aCBubyBhcmd1bWVudHM8YnIgLz4nOwovLwkJCQkJfSBlbHNlaWYgKCRhcmd1bWVudENvdW50ID09IDEpIHsKLy8JCQkJCQllY2hvICdXaXRoIDEgYXJndW1lbnQ8YnIgLz4nOwovLwkJCQkJfSBlbHNlIHsKLy8JCQkJCQllY2hvICdXaXRoICcuJGFyZ3VtZW50Q291bnQuJyBhcmd1bWVudHM8YnIgLz4nOwovLwkJCQkJfQoJCQkJCSRvdXRwdXRbXSA9ICRkOwkJCQkJCS8vCUR1bXAgdGhlIGFyZ3VtZW50IGNvdW50IG9uIHRoZSBvdXRwdXQKCQkJCQkkb3V0cHV0W10gPSAkc3RhY2stPnBvcCgpOwkJCS8vCVBvcCB0aGUgZnVuY3Rpb24gYW5kIHB1c2ggb250byB0aGUgb3V0cHV0CgkJCQkJaWYgKGlzc2V0KHNlbGY6OiRfY29udHJvbEZ1bmN0aW9uc1skZnVuY3Rpb25OYW1lXSkpIHsKLy8JCQkJCQllY2hvICdCdWlsdC1pbiBmdW5jdGlvbiAnLiRmdW5jdGlvbk5hbWUuJzxiciAvPic7CgkJCQkJCSRleHBlY3RlZEFyZ3VtZW50Q291bnQgPSBzZWxmOjokX2NvbnRyb2xGdW5jdGlvbnNbJGZ1bmN0aW9uTmFtZV1bJ2FyZ3VtZW50Q291bnQnXTsKCQkJCQkJJGZ1bmN0aW9uQ2FsbCA9IHNlbGY6OiRfY29udHJvbEZ1bmN0aW9uc1skZnVuY3Rpb25OYW1lXVsnZnVuY3Rpb25DYWxsJ107CgkJCQkJfSBlbHNlaWYgKGlzc2V0KHNlbGY6OiRfUEhQRXhjZWxGdW5jdGlvbnNbJGZ1bmN0aW9uTmFtZV0pKSB7Ci8vCQkJCQkJZWNobyAnUEhQRXhjZWwgZnVuY3Rpb24gJy4kZnVuY3Rpb25OYW1lLic8YnIgLz4nOwoJCQkJCQkkZXhwZWN0ZWRBcmd1bWVudENvdW50ID0gc2VsZjo6JF9QSFBFeGNlbEZ1bmN0aW9uc1skZnVuY3Rpb25OYW1lXVsnYXJndW1lbnRDb3VudCddOwoJCQkJCQkkZnVuY3Rpb25DYWxsID0gc2VsZjo6JF9QSFBFeGNlbEZ1bmN0aW9uc1skZnVuY3Rpb25OYW1lXVsnZnVuY3Rpb25DYWxsJ107CgkJCQkJfSBlbHNlIHsJLy8gZGlkIHdlIHNvbWVob3cgcHVzaCBhIG5vbi1mdW5jdGlvbiBvbiB0aGUgc3RhY2s/IHRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbgoJCQkJCQlyZXR1cm4gJHRoaXMtPl9yYWlzZUZvcm11bGFFcnJvcigiRm9ybXVsYSBFcnJvcjogSW50ZXJuYWwgZXJyb3IsIG5vbi1mdW5jdGlvbiBvbiBzdGFjayIpOwoJCQkJCX0KCQkJCQkvLwlDaGVjayB0aGUgYXJndW1lbnQgY291bnQKCQkJCQkkYXJndW1lbnRDb3VudEVycm9yID0gZmFsc2U7CgkJCQkJaWYgKGlzX251bWVyaWMoJGV4cGVjdGVkQXJndW1lbnRDb3VudCkpIHsKCQkJCQkJaWYgKCRleHBlY3RlZEFyZ3VtZW50Q291bnQgPCAwKSB7Ci8vCQkJCQkJCWVjaG8gJyRleHBlY3RlZEFyZ3VtZW50Q291bnQgaXMgYmV0d2VlbiAwIGFuZCAnLmFicygkZXhwZWN0ZWRBcmd1bWVudENvdW50KS4nPGJyIC8+JzsKCQkJCQkJCWlmICgkYXJndW1lbnRDb3VudCA+IGFicygkZXhwZWN0ZWRBcmd1bWVudENvdW50KSkgewoJCQkJCQkJCSRhcmd1bWVudENvdW50RXJyb3IgPSB0cnVlOwoJCQkJCQkJCSRleHBlY3RlZEFyZ3VtZW50Q291bnRTdHJpbmcgPSAnbm8gbW9yZSB0aGFuICcuYWJzKCRleHBlY3RlZEFyZ3VtZW50Q291bnQpOwoJCQkJCQkJfQoJCQkJCQl9IGVsc2UgewovLwkJCQkJCQllY2hvICckZXhwZWN0ZWRBcmd1bWVudENvdW50IGlzIG51bWVyaWMgJy4kZXhwZWN0ZWRBcmd1bWVudENvdW50Lic8YnIgLz4nOwoJCQkJCQkJaWYgKCRhcmd1bWVudENvdW50ICE9ICRleHBlY3RlZEFyZ3VtZW50Q291bnQpIHsKCQkJCQkJCQkkYXJndW1lbnRDb3VudEVycm9yID0gdHJ1ZTsKCQkJCQkJCQkkZXhwZWN0ZWRBcmd1bWVudENvdW50U3RyaW5nID0gJGV4cGVjdGVkQXJndW1lbnRDb3VudDsKCQkJCQkJCX0KCQkJCQkJfQoJCQkJCX0gZWxzZWlmICgkZXhwZWN0ZWRBcmd1bWVudENvdW50ICE9ICcqJykgewoJCQkJCQkkaXNPcGVyYW5kT3JGdW5jdGlvbiA9IHByZWdfbWF0Y2goJy8oXGQqKShbLSssXSkoXGQqKS8nLCRleHBlY3RlZEFyZ3VtZW50Q291bnQsJGFyZ01hdGNoKTsKLy8JCQkJCQlwcmludF9yKCRhcmdNYXRjaCk7Ci8vCQkJCQkJZWNobyAnPGJyIC8+JzsKCQkJCQkJc3dpdGNoICgkYXJnTWF0Y2hbMl0pIHsKCQkJCQkJCWNhc2UgJysnIDoKCQkJCQkJCQlpZiAoJGFyZ3VtZW50Q291bnQgPCAkYXJnTWF0Y2hbMV0pIHsKCQkJCQkJCQkJJGFyZ3VtZW50Q291bnRFcnJvciA9IHRydWU7CgkJCQkJCQkJCSRleHBlY3RlZEFyZ3VtZW50Q291bnRTdHJpbmcgPSAkYXJnTWF0Y2hbMV0uJyBvciBtb3JlICc7CgkJCQkJCQkJfQoJCQkJCQkJCWJyZWFrOwoJCQkJCQkJY2FzZSAnLScgOgoJCQkJCQkJCWlmICgoJGFyZ3VtZW50Q291bnQgPCAkYXJnTWF0Y2hbMV0pIHx8ICgkYXJndW1lbnRDb3VudCA+ICRhcmdNYXRjaFszXSkpIHsKCQkJCQkJCQkJJGFyZ3VtZW50Q291bnRFcnJvciA9IHRydWU7CgkJCQkJCQkJCSRleHBlY3RlZEFyZ3VtZW50Q291bnRTdHJpbmcgPSAnYmV0d2VlbiAnLiRhcmdNYXRjaFsxXS4nIGFuZCAnLiRhcmdNYXRjaFszXTsKCQkJCQkJCQl9CgkJCQkJCQkJYnJlYWs7CgkJCQkJCQljYXNlICcsJyA6CgkJCQkJCQkJaWYgKCgkYXJndW1lbnRDb3VudCAhPSAkYXJnTWF0Y2hbMV0pICYmICgkYXJndW1lbnRDb3VudCAhPSAkYXJnTWF0Y2hbM10pKSB7CgkJCQkJCQkJCSRhcmd1bWVudENvdW50RXJyb3IgPSB0cnVlOwoJCQkJCQkJCQkkZXhwZWN0ZWRBcmd1bWVudENvdW50U3RyaW5nID0gJ2VpdGhlciAnLiRhcmdNYXRjaFsxXS4nIG9yICcuJGFyZ01hdGNoWzNdOwoJCQkJCQkJCX0KCQkJCQkJCQlicmVhazsKCQkJCQkJfQoJCQkJCX0KCQkJCQlpZiAoJGFyZ3VtZW50Q291bnRFcnJvcikgewoJCQkJCQlyZXR1cm4gJHRoaXMtPl9yYWlzZUZvcm11bGFFcnJvcigiRm9ybXVsYSBFcnJvcjogV3JvbmcgbnVtYmVyIG9mIGFyZ3VtZW50cyBmb3IgJGZ1bmN0aW9uTmFtZSgpIGZ1bmN0aW9uOiAkYXJndW1lbnRDb3VudCBnaXZlbiwgIi4kZXhwZWN0ZWRBcmd1bWVudENvdW50U3RyaW5nLiIgZXhwZWN0ZWQiKTsKCQkJCQl9CgkJCQl9CgkJCQkrKyRpbmRleDsKCgkJCX0gZWxzZWlmICgkb3BDaGFyYWN0ZXIgPT0gJywnKSB7CQkJLy8JSXMgdGhpcyB0aGUgc2VwYXJhdG9yIGZvciBmdW5jdGlvbiBhcmd1bWVudHM/Ci8vCQkJCWVjaG8gJ0VsZW1lbnQgaXMgYSBGdW5jdGlvbiBhcmd1bWVudCBzZXBhcmF0b3I8YnIgLz4nOwoJCQkJd2hpbGUgKCgkbzIgPSAkc3RhY2stPnBvcCgpKSAmJiAkbzJbJ3ZhbHVlJ10gIT0gJygnKSB7CQkvLwlQb3Agb2ZmIHRoZSBzdGFjayBiYWNrIHRvIHRoZSBsYXN0ICgKCQkJCQlpZiAoJG8yID09PSBOVUxMKSByZXR1cm4gJHRoaXMtPl9yYWlzZUZvcm11bGFFcnJvcigiRm9ybXVsYSBFcnJvcjogVW5leHBlY3RlZCAsIik7CgkJCQkJZWxzZSAkb3V0cHV0W10gPSAkbzI7CS8vIHBvcCB0aGUgYXJndW1lbnQgZXhwcmVzc2lvbiBzdHVmZiBhbmQgcHVzaCBvbnRvIHRoZSBvdXRwdXQKCQkJCX0KCQkJCS8vCUlmIHdlJ3ZlIGEgY29tbWEgd2hlbiB3ZSdyZSBleHBlY3RpbmcgYW4gb3BlcmFuZCwgdGhlbiB3aGF0IHdlIGFjdHVhbGx5IGhhdmUgaXMgYSBudWxsIG9wZXJhbmQ7CgkJCQkvLwkJc28gcHVzaCBhIG51bGwgb250byB0aGUgc3RhY2sKCQkJCWlmICgoJGV4cGVjdGluZ09wZXJhbmQpIHx8ICghJGV4cGVjdGluZ09wZXJhdG9yKSkgewoJCQkJCSRvdXRwdXRbXSA9IGFycmF5KCd0eXBlJyA9PiAnTlVMTCBWYWx1ZScsICd2YWx1ZScgPT4gc2VsZjo6JF9FeGNlbENvbnN0YW50c1snTlVMTCddLCAncmVmZXJlbmNlJyA9PiBudWxsKTsKCQkJCX0KCQkJCS8vIG1ha2Ugc3VyZSB0aGVyZSB3YXMgYSBmdW5jdGlvbgoJCQkJJGQgPSAkc3RhY2stPmxhc3QoMik7CgkJCQlpZiAoIXByZWdfbWF0Y2goJy9eJy5zZWxmOjpDQUxDVUxBVElPTl9SRUdFWFBfRlVOQ1RJT04uJyQvaScsICRkWyd2YWx1ZSddLCAkbWF0Y2hlcykpCgkJCQkJcmV0dXJuICR0aGlzLT5fcmFpc2VGb3JtdWxhRXJyb3IoIkZvcm11bGEgRXJyb3I6IFVuZXhwZWN0ZWQgLCIpOwoJCQkJJGQgPSAkc3RhY2stPnBvcCgpOwoJCQkJJHN0YWNrLT5wdXNoKCRkWyd0eXBlJ10sKyskZFsndmFsdWUnXSwkZFsncmVmZXJlbmNlJ10pOwkvLyBpbmNyZW1lbnQgdGhlIGFyZ3VtZW50IGNvdW50CgkJCQkkc3RhY2stPnB1c2goJ0JyYWNlJywgJygnKTsJLy8gcHV0IHRoZSAoIGJhY2sgb24sIHdlJ2xsIG5lZWQgdG8gcG9wIGJhY2sgdG8gaXQgYWdhaW4KCQkJCSRleHBlY3RpbmdPcGVyYXRvciA9IGZhbHNlOwoJCQkJJGV4cGVjdGluZ09wZXJhbmQgPSB0cnVlOwoJCQkJKyskaW5kZXg7CgoJCQl9IGVsc2VpZiAoJG9wQ2hhcmFjdGVyID09ICcoJyAmJiAhJGV4cGVjdGluZ09wZXJhdG9yKSB7Ci8vCQkJCWVjaG8gJ0VsZW1lbnQgaXMgYW4gT3BlbmluZyBCcmFja2V0PGJyIC8+JzsKCQkJCSRzdGFjay0+cHVzaCgnQnJhY2UnLCAnKCcpOwoJCQkJKyskaW5kZXg7CgoJCQl9IGVsc2VpZiAoJGlzT3BlcmFuZE9yRnVuY3Rpb24gJiYgISRleHBlY3RpbmdPcGVyYXRvcikgewkvLyBkbyB3ZSBub3cgaGF2ZSBhIGZ1bmN0aW9uL3ZhcmlhYmxlL251bWJlcj8KCQkJCSRleHBlY3RpbmdPcGVyYXRvciA9IHRydWU7CgkJCQkkZXhwZWN0aW5nT3BlcmFuZCA9IGZhbHNlOwoJCQkJJHZhbCA9ICRtYXRjaFsxXTsKCQkJCSRsZW5ndGggPSBzdHJsZW4oJHZhbCk7Ci8vCQkJCWVjaG8gJ0VsZW1lbnQgd2l0aCB2YWx1ZSAnLiR2YWwuJyBpcyBhbiBPcGVyYW5kLCBWYXJpYWJsZSwgQ29uc3RhbnQsIFN0cmluZywgTnVtYmVyLCBDZWxsIFJlZmVyZW5jZSBvciBGdW5jdGlvbjxiciAvPic7CgoJCQkJaWYgKHByZWdfbWF0Y2goJy9eJy5zZWxmOjpDQUxDVUxBVElPTl9SRUdFWFBfRlVOQ1RJT04uJyQvaScsICR2YWwsICRtYXRjaGVzKSkgewoJCQkJCSR2YWwgPSBwcmVnX3JlcGxhY2UoJy9ccy8nLCcnLCR2YWwpOwovLwkJCQkJZWNobyAnRWxlbWVudCAnLiR2YWwuJyBpcyBhIEZ1bmN0aW9uPGJyIC8+JzsKCQkJCQlpZiAoaXNzZXQoc2VsZjo6JF9QSFBFeGNlbEZ1bmN0aW9uc1tzdHJ0b3VwcGVyKCRtYXRjaGVzWzFdKV0pIHx8IGlzc2V0KHNlbGY6OiRfY29udHJvbEZ1bmN0aW9uc1tzdHJ0b3VwcGVyKCRtYXRjaGVzWzFdKV0pKSB7CS8vIGl0J3MgYSBmdW5jdGlvbgoJCQkJCQkkc3RhY2stPnB1c2goJ0Z1bmN0aW9uJywgc3RydG91cHBlcigkdmFsKSk7CgkJCQkJCSRheCA9IHByZWdfbWF0Y2goJy9eXHMqKFxzKlwpKS9pJywgc3Vic3RyKCRmb3JtdWxhLCAkaW5kZXgrJGxlbmd0aCksICRhbWF0Y2gpOwoJCQkJCQlpZiAoJGF4KSB7CgkJCQkJCQkkc3RhY2stPnB1c2goJ09wZXJhbmQgQ291bnQgZm9yIEZ1bmN0aW9uICcuc3RydG91cHBlcigkdmFsKS4nKScsIDApOwoJCQkJCQkJJGV4cGVjdGluZ09wZXJhdG9yID0gdHJ1ZTsKCQkJCQkJfSBlbHNlIHsKCQkJCQkJCSRzdGFjay0+cHVzaCgnT3BlcmFuZCBDb3VudCBmb3IgRnVuY3Rpb24gJy5zdHJ0b3VwcGVyKCR2YWwpLicpJywgMSk7CgkJCQkJCQkkZXhwZWN0aW5nT3BlcmF0b3IgPSBmYWxzZTsKCQkJCQkJfQoJCQkJCQkkc3RhY2stPnB1c2goJ0JyYWNlJywgJygnKTsKCQkJCQl9IGVsc2UgewkvLyBpdCdzIGEgdmFyIHcvIGltcGxpY2l0IG11bHRpcGxpY2F0aW9uCgkJCQkJCSRvdXRwdXRbXSA9IGFycmF5KCd0eXBlJyA9PiAnVmFsdWUnLCAndmFsdWUnID0+ICRtYXRjaGVzWzFdLCAncmVmZXJlbmNlJyA9PiBudWxsKTsKCQkJCQl9CgkJCQl9IGVsc2VpZiAocHJlZ19tYXRjaCgnL14nLnNlbGY6OkNBTENVTEFUSU9OX1JFR0VYUF9DRUxMUkVGLickL2knLCAkdmFsLCAkbWF0Y2hlcykpIHsKLy8JCQkJCWVjaG8gJ0VsZW1lbnQgJy4kdmFsLicgaXMgYSBDZWxsIHJlZmVyZW5jZTxiciAvPic7CgkJCQkJLy8JV2F0Y2ggZm9yIHRoaXMgY2FzZS1jaGFuZ2Ugd2hlbiBtb2RpZnlpbmcgdG8gYWxsb3cgY2VsbCByZWZlcmVuY2VzIGluIGRpZmZlcmVudCB3b3Jrc2hlZXRzLi4uCgkJCQkJLy8JU2hvdWxkIG9ubHkgYmUgYXBwbGllZCB0byB0aGUgYWN0dWFsIGNlbGwgY29sdW1uLCBub3QgdGhlIHdvcmtzaGVldCBuYW1lCgoJCQkJCS8vCUlmIHRoZSBsYXN0IGVudHJ5IG9uIHRoZSBzdGFjayB3YXMgYSA6IG9wZXJhdG9yLCB0aGVuIHdlIGhhdmUgYSBjZWxsIHJhbmdlIHJlZmVyZW5jZQoJCQkJCSR0ZXN0UHJldk9wID0gJHN0YWNrLT5sYXN0KDEpOwoJCQkJCWlmICgkdGVzdFByZXZPcFsndmFsdWUnXSA9PSAnOicpIHsKCQkJCQkJLy8JSWYgd2UgaGF2ZSBhIHdvcmtzaGVldCByZWZlcmVuY2UsIHRoZW4gd2UncmUgcGxheWluZyB3aXRoIGEgM0QgcmVmZXJlbmNlCgkJCQkJCWlmICgkbWF0Y2hlc1syXSA9PSAnJykgewoJCQkJCQkJLy8JT3RoZXJ3aXNlLCB3ZSAnaW5oZXJpdCcgdGhlIHdvcmtzaGVldCByZWZlcmVuY2UgZnJvbSB0aGUgc3RhcnQgY2VsbCByZWZlcmVuY2UKCQkJCQkJCS8vCVRoZSBzdGFydCBvZiB0aGUgY2VsbCByYW5nZSByZWZlcmVuY2Ugc2hvdWxkIGJlIHRoZSBsYXN0IGVudHJ5IGluICRvdXRwdXQKCQkJCQkJCSRzdGFydENlbGxSZWYgPSAkb3V0cHV0W2NvdW50KCRvdXRwdXQpLTFdWyd2YWx1ZSddOwoJCQkJCQkJcHJlZ19tYXRjaCgnL14nLnNlbGY6OkNBTENVTEFUSU9OX1JFR0VYUF9DRUxMUkVGLickL2knLCAkc3RhcnRDZWxsUmVmLCAkc3RhcnRNYXRjaGVzKTsKCQkJCQkJCWlmICgkc3RhcnRNYXRjaGVzWzJdID4gJycpIHsKCQkJCQkJCQkkdmFsID0gJHN0YXJ0TWF0Y2hlc1syXS4nIScuJHZhbDsKCQkJCQkJCX0KCQkJCQkJfSBlbHNlIHsKCQkJCQkJCXJldHVybiAkdGhpcy0+X3JhaXNlRm9ybXVsYUVycm9yKCIzRCBSYW5nZSByZWZlcmVuY2VzIGFyZSBub3QgeWV0IHN1cHBvcnRlZCIpOwoJCQkJCQl9CgkJCQkJfQoKCQkJCQkkb3V0cHV0W10gPSBhcnJheSgndHlwZScgPT4gJ0NlbGwgUmVmZXJlbmNlJywgJ3ZhbHVlJyA9PiAkdmFsLCAncmVmZXJlbmNlJyA9PiAkdmFsKTsKLy8JCQkJCSRleHBlY3RpbmdPcGVyYXRvciA9IGZhbHNlOwoJCQkJfSBlbHNlIHsJLy8gaXQncyBhIHZhcmlhYmxlLCBjb25zdGFudCwgc3RyaW5nLCBudW1iZXIgb3IgYm9vbGVhbgovLwkJCQkJZWNobyAnRWxlbWVudCBpcyBhIFZhcmlhYmxlLCBDb25zdGFudCwgU3RyaW5nLCBOdW1iZXIgb3IgQm9vbGVhbjxiciAvPic7CgkJCQkJLy8JSWYgdGhlIGxhc3QgZW50cnkgb24gdGhlIHN0YWNrIHdhcyBhIDogb3BlcmF0b3IsIHRoZW4gd2UgbWF5IGhhdmUgYSByb3cgb3IgY29sdW1uIHJhbmdlIHJlZmVyZW5jZQoJCQkJCSR0ZXN0UHJldk9wID0gJHN0YWNrLT5sYXN0KDEpOwoJCQkJCWlmICgkdGVzdFByZXZPcFsndmFsdWUnXSA9PSAnOicpIHsKCQkJCQkJJHN0YXJ0Um93Q29sUmVmID0gJG91dHB1dFtjb3VudCgkb3V0cHV0KS0xXVsndmFsdWUnXTsKCQkJCQkJJHJhbmdlV1MxID0gJyc7CgkJCQkJCWlmIChzdHJwb3MoJyEnLCRzdGFydFJvd0NvbFJlZikgIT09IGZhbHNlKSB7CgkJCQkJCQlsaXN0KCRyYW5nZVdTMSwkc3RhcnRSb3dDb2xSZWYpID0gZXhwbG9kZSgnIScsJHN0YXJ0Um93Q29sUmVmKTsKCQkJCQkJfQoJCQkJCQlpZiAoJHJhbmdlV1MxICE9ICcnKSAkcmFuZ2VXUzEgLj0gJyEnOwoJCQkJCQkkcmFuZ2VXUzIgPSAkcmFuZ2VXUzE7CgkJCQkJCWlmIChzdHJwb3MoJyEnLCR2YWwpICE9PSBmYWxzZSkgewoJCQkJCQkJbGlzdCgkcmFuZ2VXUzIsJHZhbCkgPSBleHBsb2RlKCchJywkdmFsKTsKCQkJCQkJfQoJCQkJCQlpZiAoJHJhbmdlV1MyICE9ICcnKSAkcmFuZ2VXUzIgLj0gJyEnOwoJCQkJCQlpZiAoKGlzX2ludGVnZXIoJHN0YXJ0Um93Q29sUmVmKSkgJiYgKGN0eXBlX2RpZ2l0KCR2YWwpKSAmJgoJCQkJCQkJKCRzdGFydFJvd0NvbFJlZiA8PSAxMDQ4NTc2KSAmJiAoJHZhbCA8PSAxMDQ4NTc2KSkgewoJCQkJCQkJLy8JUm93IHJhbmdlCgkJCQkJCQkkZW5kUm93Q29sUmVmID0gKCRwQ2VsbFBhcmVudCAhPT0gTlVMTCkgPyAkcENlbGxQYXJlbnQtPmdldEhpZ2hlc3RDb2x1bW4oKSA6ICdYRkQnOwkvLwlNYXggMTYsMzg0IGNvbHVtbnMgZm9yIEV4Y2VsMjAwNwoJCQkJCQkJJG91dHB1dFtjb3VudCgkb3V0cHV0KS0xXVsndmFsdWUnXSA9ICRyYW5nZVdTMS4nQScuJHN0YXJ0Um93Q29sUmVmOwoJCQkJCQkJJHZhbCA9ICRyYW5nZVdTMi4kZW5kUm93Q29sUmVmLiR2YWw7CgkJCQkJCX0gZWxzZWlmICgoY3R5cGVfYWxwaGEoJHN0YXJ0Um93Q29sUmVmKSkgJiYgKGN0eXBlX2FscGhhKCR2YWwpKSAmJgoJCQkJCQkJKHN0cmxlbigkc3RhcnRSb3dDb2xSZWYpIDw9IDMpICYmIChzdHJsZW4oJHZhbCkgPD0gMykpIHsKCQkJCQkJCS8vCUNvbHVtbiByYW5nZQoJCQkJCQkJJGVuZFJvd0NvbFJlZiA9ICgkcENlbGxQYXJlbnQgIT09IE5VTEwpID8gJHBDZWxsUGFyZW50LT5nZXRIaWdoZXN0Um93KCkgOiAxMDQ4NTc2OwkJLy8JTWF4IDEsMDQ4LDU3NiByb3dzIGZvciBFeGNlbDIwMDcKCQkJCQkJCSRvdXRwdXRbY291bnQoJG91dHB1dCktMV1bJ3ZhbHVlJ10gPSAkcmFuZ2VXUzEuc3RydG91cHBlcigkc3RhcnRSb3dDb2xSZWYpLicxJzsKCQkJCQkJCSR2YWwgPSAkcmFuZ2VXUzIuJHZhbC4kZW5kUm93Q29sUmVmOwoJCQkJCQl9CgkJCQkJfQoKCQkJCQkkbG9jYWxlQ29uc3RhbnQgPSBmYWxzZTsKCQkJCQlpZiAoJG9wQ2hhcmFjdGVyID09ICciJykgewovLwkJCQkJCWVjaG8gJ0VsZW1lbnQgaXMgYSBTdHJpbmc8YnIgLz4nOwoJCQkJCQkvLwlVbkVzY2FwZSBhbnkgcXVvdGVzIHdpdGhpbiB0aGUgc3RyaW5nCgkJCQkJCSR2YWwgPSBzZWxmOjpfd3JhcFJlc3VsdChzdHJfcmVwbGFjZSgnIiInLCciJyxzZWxmOjpfdW53cmFwUmVzdWx0KCR2YWwpKSk7CgkJCQkJfSBlbHNlaWYgKGlzX251bWVyaWMoJHZhbCkpIHsKLy8JCQkJCQllY2hvICdFbGVtZW50IGlzIGEgTnVtYmVyPGJyIC8+JzsKCQkJCQkJaWYgKChzdHJwb3MoJHZhbCwnLicpICE9PSBmYWxzZSkgfHwgKHN0cmlwb3MoJHZhbCwnZScpICE9PSBmYWxzZSkgfHwgKCR2YWwgPiBQSFBfSU5UX01BWCkgfHwgKCR2YWwgPCAtUEhQX0lOVF9NQVgpKSB7Ci8vCQkJCQkJCWVjaG8gJ0Nhc3RpbmcgJy4kdmFsLicgdG8gZmxvYXQ8YnIgLz4nOwoJCQkJCQkJJHZhbCA9IChmbG9hdCkgJHZhbDsKCQkJCQkJfSBlbHNlIHsKLy8JCQkJCQkJZWNobyAnQ2FzdGluZyAnLiR2YWwuJyB0byBpbnRlZ2VyPGJyIC8+JzsKCQkJCQkJCSR2YWwgPSAoaW50ZWdlcikgJHZhbDsKCQkJCQkJfQoJCQkJCX0gZWxzZWlmIChpc3NldChzZWxmOjokX0V4Y2VsQ29uc3RhbnRzW3RyaW0oc3RydG91cHBlcigkdmFsKSldKSkgewoJCQkJCQkkZXhjZWxDb25zdGFudCA9IHRyaW0oc3RydG91cHBlcigkdmFsKSk7Ci8vCQkJCQkJZWNobyAnRWxlbWVudCAnLiRleGNlbENvbnN0YW50LicgaXMgYW4gRXhjZWwgQ29uc3RhbnQ8YnIgLz4nOwoJCQkJCQkkdmFsID0gc2VsZjo6JF9FeGNlbENvbnN0YW50c1skZXhjZWxDb25zdGFudF07CgkJCQkJfSBlbHNlaWYgKCgkbG9jYWxlQ29uc3RhbnQgPSBhcnJheV9zZWFyY2godHJpbShzdHJ0b3VwcGVyKCR2YWwpKSwgc2VsZjo6JF9sb2NhbGVCb29sZWFuKSkgIT09IGZhbHNlKSB7Ci8vCQkJCQkJZWNobyAnRWxlbWVudCAnLiRsb2NhbGVDb25zdGFudC4nIGlzIGFuIEV4Y2VsIENvbnN0YW50PGJyIC8+JzsKCQkJCQkJJHZhbCA9IHNlbGY6OiRfRXhjZWxDb25zdGFudHNbJGxvY2FsZUNvbnN0YW50XTsKCQkJCQl9CgkJCQkJJGRldGFpbHMgPSBhcnJheSgndHlwZScgPT4gJ1ZhbHVlJywgJ3ZhbHVlJyA9PiAkdmFsLCAncmVmZXJlbmNlJyA9PiBudWxsKTsKCQkJCQlpZiAoJGxvY2FsZUNvbnN0YW50KSB7ICRkZXRhaWxzWydsb2NhbGVWYWx1ZSddID0gJGxvY2FsZUNvbnN0YW50OyB9CgkJCQkJJG91dHB1dFtdID0gJGRldGFpbHM7CgkJCQl9CgkJCQkkaW5kZXggKz0gJGxlbmd0aDsKCgkJCX0gZWxzZWlmICgkb3BDaGFyYWN0ZXIgPT0gJyQnKSB7CS8vIGFic29sdXRlIHJvdyBvciBjb2x1bW4gcmFuZ2UKCQkJCSsrJGluZGV4OwoJCQl9IGVsc2VpZiAoJG9wQ2hhcmFjdGVyID09ICcpJykgewkvLyBtaXNjZWxsYW5lb3VzIGVycm9yIGNoZWNraW5nCgkJCQlpZiAoJGV4cGVjdGluZ09wZXJhbmQpIHsKCQkJCQkkb3V0cHV0W10gPSBhcnJheSgndHlwZScgPT4gJ05VTEwgVmFsdWUnLCAndmFsdWUnID0+IHNlbGY6OiRfRXhjZWxDb25zdGFudHNbJ05VTEwnXSwgJ3JlZmVyZW5jZScgPT4gbnVsbCk7CgkJCQkJJGV4cGVjdGluZ09wZXJhbmQgPSBmYWxzZTsKCQkJCQkkZXhwZWN0aW5nT3BlcmF0b3IgPSB0cnVlOwoJCQkJfSBlbHNlIHsKCQkJCQlyZXR1cm4gJHRoaXMtPl9yYWlzZUZvcm11bGFFcnJvcigiRm9ybXVsYSBFcnJvcjogVW5leHBlY3RlZCAnKSciKTsKCQkJCX0KCQkJfSBlbHNlaWYgKGlzc2V0KHNlbGY6OiRfb3BlcmF0b3JzWyRvcENoYXJhY3Rlcl0pICYmICEkZXhwZWN0aW5nT3BlcmF0b3IpIHsKCQkJCXJldHVybiAkdGhpcy0+X3JhaXNlRm9ybXVsYUVycm9yKCJGb3JtdWxhIEVycm9yOiBVbmV4cGVjdGVkIG9wZXJhdG9yICckb3BDaGFyYWN0ZXInIik7CgkJCX0gZWxzZSB7CS8vIEkgZG9uJ3QgZXZlbiB3YW50IHRvIGtub3cgd2hhdCB5b3UgZGlkIHRvIGdldCBoZXJlCgkJCQlyZXR1cm4gJHRoaXMtPl9yYWlzZUZvcm11bGFFcnJvcigiRm9ybXVsYSBFcnJvcjogQW4gdW5leHBlY3RlZCBlcnJvciBvY2N1cmVkIik7CgkJCX0KCQkJLy8JVGVzdCBmb3IgZW5kIG9mIGZvcm11bGEgc3RyaW5nCgkJCWlmICgkaW5kZXggPT0gc3RybGVuKCRmb3JtdWxhKSkgewoJCQkJLy8JRGlkIHdlIGVuZCB3aXRoIGFuIG9wZXJhdG9yPy4KCQkJCS8vCU9ubHkgdmFsaWQgZm9yIHRoZSAlIHVuYXJ5IG9wZXJhdG9yCgkJCQlpZiAoKGlzc2V0KHNlbGY6OiRfb3BlcmF0b3JzWyRvcENoYXJhY3Rlcl0pKSAmJiAoJG9wQ2hhcmFjdGVyICE9ICclJykpIHsKCQkJCQlyZXR1cm4gJHRoaXMtPl9yYWlzZUZvcm11bGFFcnJvcigiRm9ybXVsYSBFcnJvcjogT3BlcmF0b3IgJyRvcENoYXJhY3RlcicgaGFzIG5vIG9wZXJhbmRzIik7CgkJCQl9IGVsc2UgewoJCQkJCWJyZWFrOwoJCQkJfQoJCQl9CgkJCS8vCUlnbm9yZSB3aGl0ZSBzcGFjZQoJCQl3aGlsZSAoKCRmb3JtdWxheyRpbmRleH0gPT0gIlxuIikgfHwgKCRmb3JtdWxheyRpbmRleH0gPT0gIlxyIikpIHsKCQkJCSsrJGluZGV4OwoJCQl9CgkJCWlmICgkZm9ybXVsYXskaW5kZXh9ID09ICcgJykgewoJCQkJd2hpbGUgKCRmb3JtdWxheyRpbmRleH0gPT0gJyAnKSB7CgkJCQkJKyskaW5kZXg7CgkJCQl9CgkJCQkvLwlJZiB3ZSdyZSBleHBlY3RpbmcgYW4gb3BlcmF0b3IsIGJ1dCBvbmx5IGhhdmUgYSBzcGFjZSBiZXR3ZWVuIHRoZSBwcmV2aW91cyBhbmQgbmV4dCBvcGVyYW5kcyAoYW5kIGJvdGggYXJlCgkJCQkvLwkJQ2VsbCBSZWZlcmVuY2VzKSB0aGVuIHdlIGhhdmUgYW4gSU5URVJTRUNUSU9OIG9wZXJhdG9yCi8vCQkJCWVjaG8gJ1Bvc3NpYmxlIEludGVyc2VjdCBPcGVyYXRvcjxiciAvPic7CgkJCQlpZiAoKCRleHBlY3RpbmdPcGVyYXRvcikgJiYgKHByZWdfbWF0Y2goJy9eJy5zZWxmOjpDQUxDVUxBVElPTl9SRUdFWFBfQ0VMTFJFRi4nLiovVWknLCBzdWJzdHIoJGZvcm11bGEsICRpbmRleCksICRtYXRjaCkpICYmCgkJCQkJKCRvdXRwdXRbY291bnQoJG91dHB1dCktMV1bJ3R5cGUnXSA9PSAnQ2VsbCBSZWZlcmVuY2UnKSkgewovLwkJCQkJZWNobyAnRWxlbWVudCBpcyBhbiBJbnRlcnNlY3QgT3BlcmF0b3I8YnIgLz4nOwoJCQkJCXdoaWxlKCRzdGFjay0+Y291bnQoKSA+IDAgJiYKCQkJCQkJKCRvMiA9ICRzdGFjay0+bGFzdCgpKSAmJgoJCQkJCQlpc3NldChzZWxmOjokX29wZXJhdG9yc1skbzJbJ3ZhbHVlJ11dKSAmJgoJCQkJCQlAKCRvcGVyYXRvckFzc29jaWF0aXZpdHlbJG9wQ2hhcmFjdGVyXSA/ICRvcGVyYXRvclByZWNlZGVuY2VbJG9wQ2hhcmFjdGVyXSA8ICRvcGVyYXRvclByZWNlZGVuY2VbJG8yWyd2YWx1ZSddXSA6ICRvcGVyYXRvclByZWNlZGVuY2VbJG9wQ2hhcmFjdGVyXSA8PSAkb3BlcmF0b3JQcmVjZWRlbmNlWyRvMlsndmFsdWUnXV0pKSB7CgkJCQkJCSRvdXRwdXRbXSA9ICRzdGFjay0+cG9wKCk7CQkJCQkJCQkvLwlTd2FwIG9wZXJhbmRzIGFuZCBoaWdoZXIgcHJlY2VkZW5jZSBvcGVyYXRvcnMgZnJvbSB0aGUgc3RhY2sgdG8gdGhlIG91dHB1dAoJCQkJCX0KCQkJCQkkc3RhY2stPnB1c2goJ0JpbmFyeSBPcGVyYXRvcicsJ3wnKTsJLy8JUHV0IGFuIEludGVyc2VjdCBPcGVyYXRvciBvbiB0aGUgc3RhY2sKCQkJCQkkZXhwZWN0aW5nT3BlcmF0b3IgPSBmYWxzZTsKCQkJCX0KCQkJfQoJCX0KCgkJd2hpbGUgKCgkb3AgPSAkc3RhY2stPnBvcCgpKSAhPT0gTlVMTCkgewkvLyBwb3AgZXZlcnl0aGluZyBvZmYgdGhlIHN0YWNrIGFuZCBwdXNoIG9udG8gb3V0cHV0CgkJCWlmICgoaXNfYXJyYXkoJG9wQ2hhcmFjdGVyKSAmJiAkb3BDaGFyYWN0ZXJbJ3ZhbHVlJ10gPT0gJygnKSB8fCAoJG9wQ2hhcmFjdGVyID09PSAnKCcpKQoJCQkJcmV0dXJuICR0aGlzLT5fcmFpc2VGb3JtdWxhRXJyb3IoIkZvcm11bGEgRXJyb3I6IEV4cGVjdGluZyAnKSciKTsJLy8gaWYgdGhlcmUgYXJlIGFueSBvcGVuaW5nIGJyYWNlcyBvbiB0aGUgc3RhY2ssIHRoZW4gYnJhY2VzIHdlcmUgdW5iYWxhbmNlZAoJCQkkb3V0cHV0W10gPSAkb3A7CgkJfQoJCXJldHVybiAkb3V0cHV0OwoJfQkvLwlmdW5jdGlvbiBfcGFyc2VGb3JtdWxhKCkKCgoJcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gX2RhdGFUZXN0UmVmZXJlbmNlKCYkb3BlcmFuZERhdGEpCgl7CgkJJG9wZXJhbmQgPSAkb3BlcmFuZERhdGFbJ3ZhbHVlJ107CgkJaWYgKCgkb3BlcmFuZERhdGFbJ3JlZmVyZW5jZSddID09PSBOVUxMKSAmJiAoaXNfYXJyYXkoJG9wZXJhbmQpKSkgewoJCQkkcktleXMgPSBhcnJheV9rZXlzKCRvcGVyYW5kKTsKCQkJJHJvd0tleSA9IGFycmF5X3NoaWZ0KCRyS2V5cyk7CgkJCSRjS2V5cyA9IGFycmF5X2tleXMoYXJyYXlfa2V5cygkb3BlcmFuZFskcm93S2V5XSkpOwoJCQkkY29sS2V5ID0gYXJyYXlfc2hpZnQoJGNLZXlzKTsKCQkJaWYgKGN0eXBlX3VwcGVyKCRjb2xLZXkpKSB7CgkJCQkkb3BlcmFuZERhdGFbJ3JlZmVyZW5jZSddID0gJGNvbEtleS4kcm93S2V5OwoJCQl9CgkJfQoJCXJldHVybiAkb3BlcmFuZDsKCX0KCgkvLyBldmFsdWF0ZSBwb3N0Zml4IG5vdGF0aW9uCglwcml2YXRlIGZ1bmN0aW9uIF9wcm9jZXNzVG9rZW5TdGFjaygkdG9rZW5zLCAkY2VsbElEID0gbnVsbCwgUEhQRXhjZWxfQ2VsbCAkcENlbGwgPSBudWxsKSB7CgkJaWYgKCR0b2tlbnMgPT0gZmFsc2UpIHJldHVybiBmYWxzZTsKCgkJLy8JSWYgd2UncmUgdXNpbmcgY2VsbCBjYWNoaW5nLCB0aGVuICRwQ2VsbCBtYXkgd2VsbCBiZSBmbHVzaGVkIGJhY2sgdG8gdGhlIGNhY2hlICh3aGljaCBkZXRhY2hlcyB0aGUgcGFyZW50IHdvcmtzaGVldCksCgkJLy8JCXNvIHdlIHN0b3JlIHRoZSBwYXJlbnQgd29ya3NoZWV0IHNvIHRoYXQgd2UgY2FuIHJlLWF0dGFjaCBpdCB3aGVuIG5lY2Vzc2FyeQoJCSRwQ2VsbFBhcmVudCA9ICgkcENlbGwgIT09IE5VTEwpID8gJHBDZWxsLT5nZXRQYXJlbnQoKSA6IG51bGw7CgkJJHN0YWNrID0gbmV3IFBIUEV4Y2VsX1Rva2VuX1N0YWNrOwoKCQkvLwlMb29wIHRocm91Z2ggZWFjaCB0b2tlbiBpbiB0dXJuCgkJZm9yZWFjaCAoJHRva2VucyBhcyAkdG9rZW5EYXRhKSB7Ci8vCQkJcHJpbnRfcigkdG9rZW5EYXRhKTsKLy8JCQllY2hvICc8YnIgLz4nOwoJCQkkdG9rZW4gPSAkdG9rZW5EYXRhWyd2YWx1ZSddOwovLwkJCWVjaG8gJzxiPlRva2VuIGlzICcuJHRva2VuLic8L2I+PGJyIC8+JzsKCQkJLy8gaWYgdGhlIHRva2VuIGlzIGEgYmluYXJ5IG9wZXJhdG9yLCBwb3AgdGhlIHRvcCB0d28gdmFsdWVzIG9mZiB0aGUgc3RhY2ssIGRvIHRoZSBvcGVyYXRpb24sIGFuZCBwdXNoIHRoZSByZXN1bHQgYmFjayBvbiB0aGUgc3RhY2sKCQkJaWYgKGlzc2V0KHNlbGY6OiRfYmluYXJ5T3BlcmF0b3JzWyR0b2tlbl0pKSB7Ci8vCQkJCWVjaG8gJ1Rva2VuIGlzIGEgYmluYXJ5IG9wZXJhdG9yPGJyIC8+JzsKCQkJCS8vCVdlIG11c3QgaGF2ZSB0d28gb3BlcmFuZHMsIGVycm9yIGlmIHdlIGRvbid0CgkJCQlpZiAoKCRvcGVyYW5kMkRhdGEgPSAkc3RhY2stPnBvcCgpKSA9PT0gTlVMTCkgcmV0dXJuICR0aGlzLT5fcmFpc2VGb3JtdWxhRXJyb3IoJ0ludGVybmFsIGVycm9yIC0gT3BlcmFuZCB2YWx1ZSBtaXNzaW5nIGZyb20gc3RhY2snKTsKCQkJCWlmICgoJG9wZXJhbmQxRGF0YSA9ICRzdGFjay0+cG9wKCkpID09PSBOVUxMKSByZXR1cm4gJHRoaXMtPl9yYWlzZUZvcm11bGFFcnJvcignSW50ZXJuYWwgZXJyb3IgLSBPcGVyYW5kIHZhbHVlIG1pc3NpbmcgZnJvbSBzdGFjaycpOwoKCQkJCSRvcGVyYW5kMSA9IHNlbGY6Ol9kYXRhVGVzdFJlZmVyZW5jZSgkb3BlcmFuZDFEYXRhKTsKCQkJCSRvcGVyYW5kMiA9IHNlbGY6Ol9kYXRhVGVzdFJlZmVyZW5jZSgkb3BlcmFuZDJEYXRhKTsKCgkJCQkvLwlMb2cgd2hhdCB3ZSdyZSBkb2luZwoJCQkJaWYgKCR0b2tlbiA9PSAnOicpIHsKCQkJCQkkdGhpcy0+X3dyaXRlRGVidWcoJ0V2YWx1YXRpbmcgUmFuZ2UgJy4kdGhpcy0+X3Nob3dWYWx1ZSgkb3BlcmFuZDFEYXRhWydyZWZlcmVuY2UnXSkuJHRva2VuLiR0aGlzLT5fc2hvd1ZhbHVlKCRvcGVyYW5kMkRhdGFbJ3JlZmVyZW5jZSddKSk7CgkJCQl9IGVsc2UgewoJCQkJCSR0aGlzLT5fd3JpdGVEZWJ1ZygnRXZhbHVhdGluZyAnLiR0aGlzLT5fc2hvd1ZhbHVlKCRvcGVyYW5kMSkuJyAnLiR0b2tlbi4nICcuJHRoaXMtPl9zaG93VmFsdWUoJG9wZXJhbmQyKSk7CgkJCQl9CgoJCQkJLy8JUHJvY2VzcyB0aGUgb3BlcmF0aW9uIGluIHRoZSBhcHByb3ByaWF0ZSBtYW5uZXIKCQkJCXN3aXRjaCAoJHRva2VuKSB7CgkJCQkJLy8JQ29tcGFyaXNvbiAoQm9vbGVhbikgT3BlcmF0b3JzCgkJCQkJY2FzZSAnPicJOgkJCS8vCUdyZWF0ZXIgdGhhbgoJCQkJCWNhc2UgJzwnCToJCQkvLwlMZXNzIHRoYW4KCQkJCQljYXNlICc+PScJOgkJCS8vCUdyZWF0ZXIgdGhhbiBvciBFcXVhbCB0bwoJCQkJCWNhc2UgJzw9Jwk6CQkJLy8JTGVzcyB0aGFuIG9yIEVxdWFsIHRvCgkJCQkJY2FzZSAnPScJOgkJCS8vCUVxdWFsaXR5CgkJCQkJY2FzZSAnPD4nCToJCQkvLwlJbmVxdWFsaXR5CgkJCQkJCSR0aGlzLT5fZXhlY3V0ZUJpbmFyeUNvbXBhcmlzb25PcGVyYXRpb24oJGNlbGxJRCwkb3BlcmFuZDEsJG9wZXJhbmQyLCR0b2tlbiwkc3RhY2spOwoJCQkJCQlicmVhazsKCQkJCQkvLwlCaW5hcnkgT3BlcmF0b3JzCgkJCQkJY2FzZSAnOicJOgkJCS8vCVJhbmdlCgkJCQkJCSRzaGVldDEgPSAkc2hlZXQyID0gJyc7CgkJCQkJCWlmIChzdHJwb3MoJG9wZXJhbmQxRGF0YVsncmVmZXJlbmNlJ10sJyEnKSAhPT0gZmFsc2UpIHsKCQkJCQkJCWxpc3QoJHNoZWV0MSwkb3BlcmFuZDFEYXRhWydyZWZlcmVuY2UnXSkgPSBleHBsb2RlKCchJywkb3BlcmFuZDFEYXRhWydyZWZlcmVuY2UnXSk7CgkJCQkJCX0gZWxzZSB7CgkJCQkJCQkkc2hlZXQxID0gKCRwQ2VsbFBhcmVudCAhPT0gTlVMTCkgPyAkcENlbGxQYXJlbnQtPmdldFRpdGxlKCkgOiAnJzsKCQkJCQkJfQoJCQkJCQlpZiAoc3RycG9zKCRvcGVyYW5kMkRhdGFbJ3JlZmVyZW5jZSddLCchJykgIT09IGZhbHNlKSB7CgkJCQkJCQlsaXN0KCRzaGVldDIsJG9wZXJhbmQyRGF0YVsncmVmZXJlbmNlJ10pID0gZXhwbG9kZSgnIScsJG9wZXJhbmQyRGF0YVsncmVmZXJlbmNlJ10pOwoJCQkJCQl9IGVsc2UgewoJCQkJCQkJJHNoZWV0MiA9ICRzaGVldDE7CgkJCQkJCX0KCQkJCQkJaWYgKCRzaGVldDEgPT0gJHNoZWV0MikgewoJCQkJCQkJaWYgKCRvcGVyYW5kMURhdGFbJ3JlZmVyZW5jZSddID09PSBOVUxMKSB7CgkJCQkJCQkJaWYgKCh0cmltKCRvcGVyYW5kMURhdGFbJ3ZhbHVlJ10pICE9ICcnKSAmJiAoaXNfbnVtZXJpYygkb3BlcmFuZDFEYXRhWyd2YWx1ZSddKSkpIHsKCQkJCQkJCQkJJG9wZXJhbmQxRGF0YVsncmVmZXJlbmNlJ10gPSAkcENlbGwtPmdldENvbHVtbigpLiRvcGVyYW5kMURhdGFbJ3ZhbHVlJ107CgkJCQkJCQkJfSBlbHNlaWYgKHRyaW0oJG9wZXJhbmQxRGF0YVsncmVmZXJlbmNlJ10pID09ICcnKSB7CgkJCQkJCQkJCSRvcGVyYW5kMURhdGFbJ3JlZmVyZW5jZSddID0gJHBDZWxsLT5nZXRDb29yZGluYXRlKCk7CgkJCQkJCQkJfSBlbHNlIHsKCQkJCQkJCQkJJG9wZXJhbmQxRGF0YVsncmVmZXJlbmNlJ10gPSAkb3BlcmFuZDFEYXRhWyd2YWx1ZSddLiRwQ2VsbC0+Z2V0Um93KCk7CgkJCQkJCQkJfQoJCQkJCQkJfQoJCQkJCQkJaWYgKCRvcGVyYW5kMkRhdGFbJ3JlZmVyZW5jZSddID09PSBOVUxMKSB7CgkJCQkJCQkJaWYgKCh0cmltKCRvcGVyYW5kMkRhdGFbJ3ZhbHVlJ10pICE9ICcnKSAmJiAoaXNfbnVtZXJpYygkb3BlcmFuZDJEYXRhWyd2YWx1ZSddKSkpIHsKCQkJCQkJCQkJJG9wZXJhbmQyRGF0YVsncmVmZXJlbmNlJ10gPSAkcENlbGwtPmdldENvbHVtbigpLiRvcGVyYW5kMkRhdGFbJ3ZhbHVlJ107CgkJCQkJCQkJfSBlbHNlaWYgKHRyaW0oJG9wZXJhbmQyRGF0YVsncmVmZXJlbmNlJ10pID09ICcnKSB7CgkJCQkJCQkJCSRvcGVyYW5kMkRhdGFbJ3JlZmVyZW5jZSddID0gJHBDZWxsLT5nZXRDb29yZGluYXRlKCk7CgkJCQkJCQkJfSBlbHNlIHsKCQkJCQkJCQkJJG9wZXJhbmQyRGF0YVsncmVmZXJlbmNlJ10gPSAkb3BlcmFuZDJEYXRhWyd2YWx1ZSddLiRwQ2VsbC0+Z2V0Um93KCk7CgkJCQkJCQkJfQoJCQkJCQkJfQoKCQkJCQkJCSRvRGF0YSA9IGFycmF5X21lcmdlKGV4cGxvZGUoJzonLCRvcGVyYW5kMURhdGFbJ3JlZmVyZW5jZSddKSxleHBsb2RlKCc6Jywkb3BlcmFuZDJEYXRhWydyZWZlcmVuY2UnXSkpOwoJCQkJCQkJJG9Db2wgPSAkb1JvdyA9IGFycmF5KCk7CgkJCQkJCQlmb3JlYWNoKCRvRGF0YSBhcyAkb0RhdHVtKSB7CgkJCQkJCQkJJG9DUiA9IFBIUEV4Y2VsX0NlbGw6OmNvb3JkaW5hdGVGcm9tU3RyaW5nKCRvRGF0dW0pOwoJCQkJCQkJCSRvQ29sW10gPSBQSFBFeGNlbF9DZWxsOjpjb2x1bW5JbmRleEZyb21TdHJpbmcoJG9DUlswXSkgLSAxOwoJCQkJCQkJCSRvUm93W10gPSAkb0NSWzFdOwoJCQkJCQkJfQoJCQkJCQkJJGNlbGxSZWYgPSBQSFBFeGNlbF9DZWxsOjpzdHJpbmdGcm9tQ29sdW1uSW5kZXgobWluKCRvQ29sKSkubWluKCRvUm93KS4nOicuUEhQRXhjZWxfQ2VsbDo6c3RyaW5nRnJvbUNvbHVtbkluZGV4KG1heCgkb0NvbCkpLm1heCgkb1Jvdyk7CgkJCQkJCQlpZiAoJHBDZWxsUGFyZW50ICE9PSBOVUxMKSB7CgkJCQkJCQkJJGNlbGxWYWx1ZSA9ICR0aGlzLT5leHRyYWN0Q2VsbFJhbmdlKCRjZWxsUmVmLCAkcENlbGxQYXJlbnQtPmdldFBhcmVudCgpLT5nZXRTaGVldEJ5TmFtZSgkc2hlZXQxKSwgZmFsc2UpOwoJCQkJCQkJfSBlbHNlIHsKCQkJCQkJCQlyZXR1cm4gJHRoaXMtPl9yYWlzZUZvcm11bGFFcnJvcignVW5hYmxlIHRvIGFjY2VzcyBDZWxsIFJlZmVyZW5jZScpOwoJCQkJCQkJfQoJCQkJCQkJJHN0YWNrLT5wdXNoKCdDZWxsIFJlZmVyZW5jZScsJGNlbGxWYWx1ZSwkY2VsbFJlZik7CgkJCQkJCX0gZWxzZSB7CgkJCQkJCQkkc3RhY2stPnB1c2goJ0Vycm9yJyxQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OlJFRigpLG51bGwpOwoJCQkJCQl9CgoJCQkJCQlicmVhazsKCQkJCQljYXNlICcrJwk6CQkJLy8JQWRkaXRpb24KCQkJCQkJJHRoaXMtPl9leGVjdXRlTnVtZXJpY0JpbmFyeU9wZXJhdGlvbigkY2VsbElELCRvcGVyYW5kMSwkb3BlcmFuZDIsJHRva2VuLCdwbHVzRXF1YWxzJywkc3RhY2spOwoJCQkJCQlicmVhazsKCQkJCQljYXNlICctJwk6CQkJLy8JU3VidHJhY3Rpb24KCQkJCQkJJHRoaXMtPl9leGVjdXRlTnVtZXJpY0JpbmFyeU9wZXJhdGlvbigkY2VsbElELCRvcGVyYW5kMSwkb3BlcmFuZDIsJHRva2VuLCdtaW51c0VxdWFscycsJHN0YWNrKTsKCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSAnKicJOgkJCS8vCU11bHRpcGxpY2F0aW9uCgkJCQkJCSR0aGlzLT5fZXhlY3V0ZU51bWVyaWNCaW5hcnlPcGVyYXRpb24oJGNlbGxJRCwkb3BlcmFuZDEsJG9wZXJhbmQyLCR0b2tlbiwnYXJyYXlUaW1lc0VxdWFscycsJHN0YWNrKTsKCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSAnLycJOgkJCS8vCURpdmlzaW9uCgkJCQkJCSR0aGlzLT5fZXhlY3V0ZU51bWVyaWNCaW5hcnlPcGVyYXRpb24oJGNlbGxJRCwkb3BlcmFuZDEsJG9wZXJhbmQyLCR0b2tlbiwnYXJyYXlSaWdodERpdmlkZScsJHN0YWNrKTsKCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSAnXicJOgkJCS8vCUV4cG9uZW50aWFsCgkJCQkJCSR0aGlzLT5fZXhlY3V0ZU51bWVyaWNCaW5hcnlPcGVyYXRpb24oJGNlbGxJRCwkb3BlcmFuZDEsJG9wZXJhbmQyLCR0b2tlbiwncG93ZXInLCRzdGFjayk7CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgJyYnCToJCQkvLwlDb25jYXRlbmF0aW9uCgkJCQkJCS8vCUlmIGVpdGhlciBvZiB0aGUgb3BlcmFuZHMgaXMgYSBtYXRyaXgsIHdlIG5lZWQgdG8gdHJlYXQgdGhlbSBib3RoIGFzIG1hdHJpY2VzCgkJCQkJCS8vCQkoY29udmVydGluZyB0aGUgb3RoZXIgb3BlcmFuZCB0byBhIG1hdHJpeCBpZiBuZWVkIGJlKTsgdGhlbiBwZXJmb3JtIHRoZSByZXF1aXJlZAoJCQkJCQkvLwkJbWF0cml4IG9wZXJhdGlvbgoJCQkJCQlpZiAoaXNfYm9vbCgkb3BlcmFuZDEpKSB7CgkJCQkJCQkkb3BlcmFuZDEgPSAoJG9wZXJhbmQxKSA/IHNlbGY6OiRfbG9jYWxlQm9vbGVhblsnVFJVRSddIDogc2VsZjo6JF9sb2NhbGVCb29sZWFuWydGQUxTRSddOwoJCQkJCQl9CgkJCQkJCWlmIChpc19ib29sKCRvcGVyYW5kMikpIHsKCQkJCQkJCSRvcGVyYW5kMiA9ICgkb3BlcmFuZDIpID8gc2VsZjo6JF9sb2NhbGVCb29sZWFuWydUUlVFJ10gOiBzZWxmOjokX2xvY2FsZUJvb2xlYW5bJ0ZBTFNFJ107CgkJCQkJCX0KCQkJCQkJaWYgKChpc19hcnJheSgkb3BlcmFuZDEpKSB8fCAoaXNfYXJyYXkoJG9wZXJhbmQyKSkpIHsKCQkJCQkJCS8vCUVuc3VyZSB0aGF0IGJvdGggb3BlcmFuZHMgYXJlIGFycmF5cy9tYXRyaWNlcwoJCQkJCQkJc2VsZjo6X2NoZWNrTWF0cml4T3BlcmFuZHMoJG9wZXJhbmQxLCRvcGVyYW5kMiwyKTsKCQkJCQkJCXRyeSB7CgkJCQkJCQkJLy8JQ29udmVydCBvcGVyYW5kIDEgZnJvbSBhIFBIUCBhcnJheSB0byBhIG1hdHJpeAoJCQkJCQkJCSRtYXRyaXggPSBuZXcgUEhQRXhjZWxfU2hhcmVkX0pBTUFfTWF0cml4KCRvcGVyYW5kMSk7CgkJCQkJCQkJLy8JUGVyZm9ybSB0aGUgcmVxdWlyZWQgb3BlcmF0aW9uIGFnYWluc3QgdGhlIG9wZXJhbmQgMSBtYXRyaXgsIHBhc3NpbmcgaW4gb3BlcmFuZCAyCgkJCQkJCQkJJG1hdHJpeFJlc3VsdCA9ICRtYXRyaXgtPmNvbmNhdCgkb3BlcmFuZDIpOwoJCQkJCQkJCSRyZXN1bHQgPSAkbWF0cml4UmVzdWx0LT5nZXRBcnJheSgpOwoJCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uICRleCkgewoJCQkJCQkJCSR0aGlzLT5fd3JpdGVEZWJ1ZygnSkFNQSBNYXRyaXggRXhjZXB0aW9uOiAnLiRleC0+Z2V0TWVzc2FnZSgpKTsKCQkJCQkJCQkkcmVzdWx0ID0gJyNWQUxVRSEnOwoJCQkJCQkJfQoJCQkJCQl9IGVsc2UgewoJCQkJCQkJJHJlc3VsdCA9ICciJy5zdHJfcmVwbGFjZSgnIiInLCciJyxzZWxmOjpfdW53cmFwUmVzdWx0KCRvcGVyYW5kMSwnIicpLnNlbGY6Ol91bndyYXBSZXN1bHQoJG9wZXJhbmQyLCciJykpLiciJzsKCQkJCQkJfQoJCQkJCQkkdGhpcy0+X3dyaXRlRGVidWcoJ0V2YWx1YXRpb24gUmVzdWx0IGlzICcuJHRoaXMtPl9zaG93VHlwZURldGFpbHMoJHJlc3VsdCkpOwoJCQkJCQkkc3RhY2stPnB1c2goJ1ZhbHVlJywkcmVzdWx0KTsKCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSAnfCcJOgkJCS8vCUludGVyc2VjdAoJCQkJCQkkcm93SW50ZXJzZWN0ID0gYXJyYXlfaW50ZXJzZWN0X2tleSgkb3BlcmFuZDEsJG9wZXJhbmQyKTsKCQkJCQkJJGNlbGxJbnRlcnNlY3QgPSAkb0NvbCA9ICRvUm93ID0gYXJyYXkoKTsKCQkJCQkJZm9yZWFjaChhcnJheV9rZXlzKCRyb3dJbnRlcnNlY3QpIGFzICRyb3cpIHsKCQkJCQkJCSRvUm93W10gPSAkcm93OwoJCQkJCQkJZm9yZWFjaCgkcm93SW50ZXJzZWN0WyRyb3ddIGFzICRjb2wgPT4gJGRhdGEpIHsKCQkJCQkJCQkkb0NvbFtdID0gUEhQRXhjZWxfQ2VsbDo6Y29sdW1uSW5kZXhGcm9tU3RyaW5nKCRjb2wpIC0gMTsKCQkJCQkJCQkkY2VsbEludGVyc2VjdFskcm93XSA9IGFycmF5X2ludGVyc2VjdF9rZXkoJG9wZXJhbmQxWyRyb3ddLCRvcGVyYW5kMlskcm93XSk7CgkJCQkJCQl9CgkJCQkJCX0KCQkJCQkJJGNlbGxSZWYgPSBQSFBFeGNlbF9DZWxsOjpzdHJpbmdGcm9tQ29sdW1uSW5kZXgobWluKCRvQ29sKSkubWluKCRvUm93KS4nOicuUEhQRXhjZWxfQ2VsbDo6c3RyaW5nRnJvbUNvbHVtbkluZGV4KG1heCgkb0NvbCkpLm1heCgkb1Jvdyk7CgkJCQkJCSR0aGlzLT5fd3JpdGVEZWJ1ZygnRXZhbHVhdGlvbiBSZXN1bHQgaXMgJy4kdGhpcy0+X3Nob3dUeXBlRGV0YWlscygkY2VsbEludGVyc2VjdCkpOwoJCQkJCQkkc3RhY2stPnB1c2goJ1ZhbHVlJywkY2VsbEludGVyc2VjdCwkY2VsbFJlZik7CgkJCQkJCWJyZWFrOwoJCQkJfQoKCQkJLy8gaWYgdGhlIHRva2VuIGlzIGEgdW5hcnkgb3BlcmF0b3IsIHBvcCBvbmUgdmFsdWUgb2ZmIHRoZSBzdGFjaywgZG8gdGhlIG9wZXJhdGlvbiwgYW5kIHB1c2ggaXQgYmFjayBvbgoJCQl9IGVsc2VpZiAoKCR0b2tlbiA9PT0gJ34nKSB8fCAoJHRva2VuID09PSAnJScpKSB7Ci8vCQkJCWVjaG8gJ1Rva2VuIGlzIGEgdW5hcnkgb3BlcmF0b3I8YnIgLz4nOwoJCQkJaWYgKCgkYXJnID0gJHN0YWNrLT5wb3AoKSkgPT09IE5VTEwpIHJldHVybiAkdGhpcy0+X3JhaXNlRm9ybXVsYUVycm9yKCdJbnRlcm5hbCBlcnJvciAtIE9wZXJhbmQgdmFsdWUgbWlzc2luZyBmcm9tIHN0YWNrJyk7CgkJCQkkYXJnID0gJGFyZ1sndmFsdWUnXTsKCQkJCWlmICgkdG9rZW4gPT09ICd+JykgewovLwkJCQkJZWNobyAnVG9rZW4gaXMgYSBuZWdhdGlvbiBvcGVyYXRvcjxiciAvPic7CgkJCQkJJHRoaXMtPl93cml0ZURlYnVnKCdFdmFsdWF0aW5nIE5lZ2F0aW9uIG9mICcuJHRoaXMtPl9zaG93VmFsdWUoJGFyZykpOwoJCQkJCSRtdWx0aXBsaWVyID0gLTE7CgkJCQl9IGVsc2UgewovLwkJCQkJZWNobyAnVG9rZW4gaXMgYSBwZXJjZW50aWxlIG9wZXJhdG9yPGJyIC8+JzsKCQkJCQkkdGhpcy0+X3dyaXRlRGVidWcoJ0V2YWx1YXRpbmcgUGVyY2VudGlsZSBvZiAnLiR0aGlzLT5fc2hvd1ZhbHVlKCRhcmcpKTsKCQkJCQkkbXVsdGlwbGllciA9IDAuMDE7CgkJCQl9CgkJCQlpZiAoaXNfYXJyYXkoJGFyZykpIHsKCQkJCQlzZWxmOjpfY2hlY2tNYXRyaXhPcGVyYW5kcygkYXJnLCRtdWx0aXBsaWVyLDIpOwoJCQkJCXRyeSB7CgkJCQkJCSRtYXRyaXgxID0gbmV3IFBIUEV4Y2VsX1NoYXJlZF9KQU1BX01hdHJpeCgkYXJnKTsKCQkJCQkJJG1hdHJpeFJlc3VsdCA9ICRtYXRyaXgxLT5hcnJheVRpbWVzRXF1YWxzKCRtdWx0aXBsaWVyKTsKCQkJCQkJJHJlc3VsdCA9ICRtYXRyaXhSZXN1bHQtPmdldEFycmF5KCk7CgkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uICRleCkgewoJCQkJCQkkdGhpcy0+X3dyaXRlRGVidWcoJ0pBTUEgTWF0cml4IEV4Y2VwdGlvbjogJy4kZXgtPmdldE1lc3NhZ2UoKSk7CgkJCQkJCSRyZXN1bHQgPSAnI1ZBTFVFISc7CgkJCQkJfQoJCQkJCSR0aGlzLT5fd3JpdGVEZWJ1ZygnRXZhbHVhdGlvbiBSZXN1bHQgaXMgJy4kdGhpcy0+X3Nob3dUeXBlRGV0YWlscygkcmVzdWx0KSk7CgkJCQkJJHN0YWNrLT5wdXNoKCdWYWx1ZScsJHJlc3VsdCk7CgkJCQl9IGVsc2UgewoJCQkJCSR0aGlzLT5fZXhlY3V0ZU51bWVyaWNCaW5hcnlPcGVyYXRpb24oJGNlbGxJRCwkbXVsdGlwbGllciwkYXJnLCcqJywnYXJyYXlUaW1lc0VxdWFscycsJHN0YWNrKTsKCQkJCX0KCgkJCX0gZWxzZWlmIChwcmVnX21hdGNoKCcvXicuc2VsZjo6Q0FMQ1VMQVRJT05fUkVHRVhQX0NFTExSRUYuJyQvaScsICR0b2tlbiwgJG1hdGNoZXMpKSB7CgkJCQkkY2VsbFJlZiA9IG51bGw7Ci8vCQkJCWVjaG8gJ0VsZW1lbnQgJy4kdG9rZW4uJyBpcyBhIENlbGwgcmVmZXJlbmNlPGJyIC8+JzsKCQkJCWlmIChpc3NldCgkbWF0Y2hlc1s4XSkpIHsKLy8JCQkJCWVjaG8gJ1JlZmVyZW5jZSBpcyBhIFJhbmdlIG9mIGNlbGxzPGJyIC8+JzsKCQkJCQlpZiAoJHBDZWxsID09PSBOVUxMKSB7Ci8vCQkJCQkJV2UgY2FuJ3QgYWNjZXNzIHRoZSByYW5nZSwgc28gcmV0dXJuIGEgUkVGIGVycm9yCgkJCQkJCSRjZWxsVmFsdWUgPSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OlJFRigpOwoJCQkJCX0gZWxzZSB7CgkJCQkJCSRjZWxsUmVmID0gJG1hdGNoZXNbNl0uJG1hdGNoZXNbN10uJzonLiRtYXRjaGVzWzldLiRtYXRjaGVzWzEwXTsKCQkJCQkJaWYgKCRtYXRjaGVzWzJdID4gJycpIHsKCQkJCQkJCSRtYXRjaGVzWzJdID0gdHJpbSgkbWF0Y2hlc1syXSwiXCInIik7CgkJCQkJCQlpZiAoKHN0cnBvcygkbWF0Y2hlc1syXSwnWycpICE9PSBmYWxzZSkgfHwgKHN0cnBvcygkbWF0Y2hlc1syXSwnXScpICE9PSBmYWxzZSkpIHsKCQkJCQkJCQkvLwlJdCdzIGEgUmVmZXJlbmNlIHRvIGFuIGV4dGVybmFsIHdvcmtib29rIChub3QgY3VycmVudGx5IHN1cHBvcnRlZCkKCQkJCQkJCQlyZXR1cm4gJHRoaXMtPl9yYWlzZUZvcm11bGFFcnJvcignVW5hYmxlIHRvIGFjY2VzcyBFeHRlcm5hbCBXb3JrYm9vaycpOwoJCQkJCQkJfQoJCQkJCQkJJG1hdGNoZXNbMl0gPSB0cmltKCRtYXRjaGVzWzJdLCJcIiciKTsKLy8JCQkJCQkJZWNobyAnJGNlbGxSZWY9Jy4kY2VsbFJlZi4nIGluIHdvcmtzaGVldCAnLiRtYXRjaGVzWzJdLic8YnIgLz4nOwoJCQkJCQkJJHRoaXMtPl93cml0ZURlYnVnKCdFdmFsdWF0aW5nIENlbGwgUmFuZ2UgJy4kY2VsbFJlZi4nIGluIHdvcmtzaGVldCAnLiRtYXRjaGVzWzJdKTsKCQkJCQkJCWlmICgkcENlbGxQYXJlbnQgIT09IE5VTEwpIHsKCQkJCQkJCQkkY2VsbFZhbHVlID0gJHRoaXMtPmV4dHJhY3RDZWxsUmFuZ2UoJGNlbGxSZWYsICRwQ2VsbFBhcmVudC0+Z2V0UGFyZW50KCktPmdldFNoZWV0QnlOYW1lKCRtYXRjaGVzWzJdKSwgZmFsc2UpOwoJCQkJCQkJfSBlbHNlIHsKCQkJCQkJCQlyZXR1cm4gJHRoaXMtPl9yYWlzZUZvcm11bGFFcnJvcignVW5hYmxlIHRvIGFjY2VzcyBDZWxsIFJlZmVyZW5jZScpOwoJCQkJCQkJfQoJCQkJCQkJJHRoaXMtPl93cml0ZURlYnVnKCdFdmFsdWF0aW9uIFJlc3VsdCBmb3IgY2VsbHMgJy4kY2VsbFJlZi4nIGluIHdvcmtzaGVldCAnLiRtYXRjaGVzWzJdLicgaXMgJy4kdGhpcy0+X3Nob3dUeXBlRGV0YWlscygkY2VsbFZhbHVlKSk7Ci8vCQkJCQkJCSRjZWxsUmVmID0gJG1hdGNoZXNbMl0uJyEnLiRjZWxsUmVmOwoJCQkJCQl9IGVsc2UgewovLwkJCQkJCQllY2hvICckY2VsbFJlZj0nLiRjZWxsUmVmLicgaW4gY3VycmVudCB3b3Jrc2hlZXQ8YnIgLz4nOwoJCQkJCQkJJHRoaXMtPl93cml0ZURlYnVnKCdFdmFsdWF0aW5nIENlbGwgUmFuZ2UgJy4kY2VsbFJlZi4nIGluIGN1cnJlbnQgd29ya3NoZWV0Jyk7CgkJCQkJCQlpZiAoJHBDZWxsUGFyZW50ICE9PSBOVUxMKSB7CgkJCQkJCQkJJGNlbGxWYWx1ZSA9ICR0aGlzLT5leHRyYWN0Q2VsbFJhbmdlKCRjZWxsUmVmLCAkcENlbGxQYXJlbnQsIGZhbHNlKTsKCQkJCQkJCX0gZWxzZSB7CgkJCQkJCQkJcmV0dXJuICR0aGlzLT5fcmFpc2VGb3JtdWxhRXJyb3IoJ1VuYWJsZSB0byBhY2Nlc3MgQ2VsbCBSZWZlcmVuY2UnKTsKCQkJCQkJCX0KCQkJCQkJCSR0aGlzLT5fd3JpdGVEZWJ1ZygnRXZhbHVhdGlvbiBSZXN1bHQgZm9yIGNlbGxzICcuJGNlbGxSZWYuJyBpcyAnLiR0aGlzLT5fc2hvd1R5cGVEZXRhaWxzKCRjZWxsVmFsdWUpKTsKCQkJCQkJfQoJCQkJCX0KCQkJCX0gZWxzZSB7Ci8vCQkJCQllY2hvICdSZWZlcmVuY2UgaXMgYSBzaW5nbGUgQ2VsbDxiciAvPic7CgkJCQkJaWYgKCRwQ2VsbCA9PT0gTlVMTCkgewovLwkJCQkJCVdlIGNhbid0IGFjY2VzcyB0aGUgY2VsbCwgc28gcmV0dXJuIGEgUkVGIGVycm9yCgkJCQkJCSRjZWxsVmFsdWUgPSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OlJFRigpOwoJCQkJCX0gZWxzZSB7CgkJCQkJCSRjZWxsUmVmID0gJG1hdGNoZXNbNl0uJG1hdGNoZXNbN107CgkJCQkJCWlmICgkbWF0Y2hlc1syXSA+ICcnKSB7CgkJCQkJCQkkbWF0Y2hlc1syXSA9IHRyaW0oJG1hdGNoZXNbMl0sIlwiJyIpOwoJCQkJCQkJaWYgKChzdHJwb3MoJG1hdGNoZXNbMl0sJ1snKSAhPT0gZmFsc2UpIHx8IChzdHJwb3MoJG1hdGNoZXNbMl0sJ10nKSAhPT0gZmFsc2UpKSB7CgkJCQkJCQkJLy8JSXQncyBhIFJlZmVyZW5jZSB0byBhbiBleHRlcm5hbCB3b3JrYm9vayAobm90IGN1cnJlbnRseSBzdXBwb3J0ZWQpCgkJCQkJCQkJcmV0dXJuICR0aGlzLT5fcmFpc2VGb3JtdWxhRXJyb3IoJ1VuYWJsZSB0byBhY2Nlc3MgRXh0ZXJuYWwgV29ya2Jvb2snKTsKCQkJCQkJCX0KLy8JCQkJCQkJZWNobyAnJGNlbGxSZWY9Jy4kY2VsbFJlZi4nIGluIHdvcmtzaGVldCAnLiRtYXRjaGVzWzJdLic8YnIgLz4nOwoJCQkJCQkJJHRoaXMtPl93cml0ZURlYnVnKCdFdmFsdWF0aW5nIENlbGwgJy4kY2VsbFJlZi4nIGluIHdvcmtzaGVldCAnLiRtYXRjaGVzWzJdKTsKCQkJCQkJCWlmICgkcENlbGxQYXJlbnQgIT09IE5VTEwpIHsKCQkJCQkJCQlpZiAoJHBDZWxsUGFyZW50LT5nZXRQYXJlbnQoKS0+Z2V0U2hlZXRCeU5hbWUoJG1hdGNoZXNbMl0pLT5jZWxsRXhpc3RzKCRjZWxsUmVmKSkgewoJCQkJCQkJCQkkY2VsbFZhbHVlID0gJHRoaXMtPmV4dHJhY3RDZWxsUmFuZ2UoJGNlbGxSZWYsICRwQ2VsbFBhcmVudC0+Z2V0UGFyZW50KCktPmdldFNoZWV0QnlOYW1lKCRtYXRjaGVzWzJdKSwgZmFsc2UpOwoJCQkJCQkJCQkkcENlbGwtPmF0dGFjaCgkcENlbGxQYXJlbnQpOwoJCQkJCQkJCX0gZWxzZSB7CgkJCQkJCQkJCSRjZWxsVmFsdWUgPSBudWxsOwoJCQkJCQkJCX0KCQkJCQkJCX0gZWxzZSB7CgkJCQkJCQkJcmV0dXJuICR0aGlzLT5fcmFpc2VGb3JtdWxhRXJyb3IoJ1VuYWJsZSB0byBhY2Nlc3MgQ2VsbCBSZWZlcmVuY2UnKTsKCQkJCQkJCX0KCQkJCQkJCSR0aGlzLT5fd3JpdGVEZWJ1ZygnRXZhbHVhdGlvbiBSZXN1bHQgZm9yIGNlbGwgJy4kY2VsbFJlZi4nIGluIHdvcmtzaGVldCAnLiRtYXRjaGVzWzJdLicgaXMgJy4kdGhpcy0+X3Nob3dUeXBlRGV0YWlscygkY2VsbFZhbHVlKSk7Ci8vCQkJCQkJCSRjZWxsUmVmID0gJG1hdGNoZXNbMl0uJyEnLiRjZWxsUmVmOwoJCQkJCQl9IGVsc2UgewovLwkJCQkJCQllY2hvICckY2VsbFJlZj0nLiRjZWxsUmVmLicgaW4gY3VycmVudCB3b3Jrc2hlZXQ8YnIgLz4nOwoJCQkJCQkJJHRoaXMtPl93cml0ZURlYnVnKCdFdmFsdWF0aW5nIENlbGwgJy4kY2VsbFJlZi4nIGluIGN1cnJlbnQgd29ya3NoZWV0Jyk7CgkJCQkJCQlpZiAoJHBDZWxsUGFyZW50LT5jZWxsRXhpc3RzKCRjZWxsUmVmKSkgewoJCQkJCQkJCSRjZWxsVmFsdWUgPSAkdGhpcy0+ZXh0cmFjdENlbGxSYW5nZSgkY2VsbFJlZiwgJHBDZWxsUGFyZW50LCBmYWxzZSk7CgkJCQkJCQkJJHBDZWxsLT5hdHRhY2goJHBDZWxsUGFyZW50KTsKCQkJCQkJCX0gZWxzZSB7CgkJCQkJCQkJJGNlbGxWYWx1ZSA9IG51bGw7CgkJCQkJCQl9CgkJCQkJCQkkdGhpcy0+X3dyaXRlRGVidWcoJ0V2YWx1YXRpb24gUmVzdWx0IGZvciBjZWxsICcuJGNlbGxSZWYuJyBpcyAnLiR0aGlzLT5fc2hvd1R5cGVEZXRhaWxzKCRjZWxsVmFsdWUpKTsKCQkJCQkJfQoJCQkJCX0KCQkJCX0KCQkJCSRzdGFjay0+cHVzaCgnVmFsdWUnLCRjZWxsVmFsdWUsJGNlbGxSZWYpOwoKCQkJLy8gaWYgdGhlIHRva2VuIGlzIGEgZnVuY3Rpb24sIHBvcCBhcmd1bWVudHMgb2ZmIHRoZSBzdGFjaywgaGFuZCB0aGVtIHRvIHRoZSBmdW5jdGlvbiwgYW5kIHB1c2ggdGhlIHJlc3VsdCBiYWNrIG9uCgkJCX0gZWxzZWlmIChwcmVnX21hdGNoKCcvXicuc2VsZjo6Q0FMQ1VMQVRJT05fUkVHRVhQX0ZVTkNUSU9OLickL2knLCAkdG9rZW4sICRtYXRjaGVzKSkgewovLwkJCQllY2hvICdUb2tlbiBpcyBhIGZ1bmN0aW9uPGJyIC8+JzsKCQkJCSRmdW5jdGlvbk5hbWUgPSAkbWF0Y2hlc1sxXTsKCQkJCSRhcmdDb3VudCA9ICRzdGFjay0+cG9wKCk7CgkJCQkkYXJnQ291bnQgPSAkYXJnQ291bnRbJ3ZhbHVlJ107CgkJCQlpZiAoJGZ1bmN0aW9uTmFtZSAhPSAnTUtNQVRSSVgnKSB7CgkJCQkJJHRoaXMtPl93cml0ZURlYnVnKCdFdmFsdWF0aW5nIEZ1bmN0aW9uICcuc2VsZjo6X2xvY2FsZUZ1bmMoJGZ1bmN0aW9uTmFtZSkuJygpIHdpdGggJy4oKCRhcmdDb3VudCA9PSAwKSA/ICdubycgOiAkYXJnQ291bnQpLicgYXJndW1lbnQnLigoJGFyZ0NvdW50ID09IDEpID8gJycgOiAncycpKTsKCQkJCX0KCQkJCWlmICgoaXNzZXQoc2VsZjo6JF9QSFBFeGNlbEZ1bmN0aW9uc1skZnVuY3Rpb25OYW1lXSkpIHx8IChpc3NldChzZWxmOjokX2NvbnRyb2xGdW5jdGlvbnNbJGZ1bmN0aW9uTmFtZV0pKSkgewkvLyBmdW5jdGlvbgoJCQkJCWlmIChpc3NldChzZWxmOjokX1BIUEV4Y2VsRnVuY3Rpb25zWyRmdW5jdGlvbk5hbWVdKSkgewoJCQkJCQkkZnVuY3Rpb25DYWxsID0gc2VsZjo6JF9QSFBFeGNlbEZ1bmN0aW9uc1skZnVuY3Rpb25OYW1lXVsnZnVuY3Rpb25DYWxsJ107CgkJCQkJCSRwYXNzQnlSZWZlcmVuY2UgPSBpc3NldChzZWxmOjokX1BIUEV4Y2VsRnVuY3Rpb25zWyRmdW5jdGlvbk5hbWVdWydwYXNzQnlSZWZlcmVuY2UnXSk7CgkJCQkJCSRwYXNzQ2VsbFJlZmVyZW5jZSA9IGlzc2V0KHNlbGY6OiRfUEhQRXhjZWxGdW5jdGlvbnNbJGZ1bmN0aW9uTmFtZV1bJ3Bhc3NDZWxsUmVmZXJlbmNlJ10pOwoJCQkJCX0gZWxzZWlmIChpc3NldChzZWxmOjokX2NvbnRyb2xGdW5jdGlvbnNbJGZ1bmN0aW9uTmFtZV0pKSB7CgkJCQkJCSRmdW5jdGlvbkNhbGwgPSBzZWxmOjokX2NvbnRyb2xGdW5jdGlvbnNbJGZ1bmN0aW9uTmFtZV1bJ2Z1bmN0aW9uQ2FsbCddOwoJCQkJCQkkcGFzc0J5UmVmZXJlbmNlID0gaXNzZXQoc2VsZjo6JF9jb250cm9sRnVuY3Rpb25zWyRmdW5jdGlvbk5hbWVdWydwYXNzQnlSZWZlcmVuY2UnXSk7CgkJCQkJCSRwYXNzQ2VsbFJlZmVyZW5jZSA9IGlzc2V0KHNlbGY6OiRfY29udHJvbEZ1bmN0aW9uc1skZnVuY3Rpb25OYW1lXVsncGFzc0NlbGxSZWZlcmVuY2UnXSk7CgkJCQkJfQoJCQkJCS8vIGdldCB0aGUgYXJndW1lbnRzIGZvciB0aGlzIGZ1bmN0aW9uCi8vCQkJCQllY2hvICdGdW5jdGlvbiAnLiRmdW5jdGlvbk5hbWUuJyBleHBlY3RzICcuJGFyZ0NvdW50LicgYXJndW1lbnRzPGJyIC8+JzsKCQkJCQkkYXJncyA9ICRhcmdBcnJheVZhbHMgPSBhcnJheSgpOwoJCQkJCWZvciAoJGkgPSAwOyAkaSA8ICRhcmdDb3VudDsgKyskaSkgewoJCQkJCQkkYXJnID0gJHN0YWNrLT5wb3AoKTsKCQkJCQkJJGEgPSAkYXJnQ291bnQgLSAkaSAtIDE7CgkJCQkJCWlmICgoJHBhc3NCeVJlZmVyZW5jZSkgJiYKCQkJCQkJCShpc3NldChzZWxmOjokX1BIUEV4Y2VsRnVuY3Rpb25zWyRmdW5jdGlvbk5hbWVdWydwYXNzQnlSZWZlcmVuY2UnXVskYV0pKSAmJgoJCQkJCQkJKHNlbGY6OiRfUEhQRXhjZWxGdW5jdGlvbnNbJGZ1bmN0aW9uTmFtZV1bJ3Bhc3NCeVJlZmVyZW5jZSddWyRhXSkpIHsKCQkJCQkJCWlmICgkYXJnWydyZWZlcmVuY2UnXSA9PT0gTlVMTCkgewoJCQkJCQkJCSRhcmdzW10gPSAkY2VsbElEOwoJCQkJCQkJCWlmICgkZnVuY3Rpb25OYW1lICE9ICdNS01BVFJJWCcpIHsgJGFyZ0FycmF5VmFsc1tdID0gJHRoaXMtPl9zaG93VmFsdWUoJGNlbGxJRCk7IH0KCQkJCQkJCX0gZWxzZSB7CgkJCQkJCQkJJGFyZ3NbXSA9ICRhcmdbJ3JlZmVyZW5jZSddOwoJCQkJCQkJCWlmICgkZnVuY3Rpb25OYW1lICE9ICdNS01BVFJJWCcpIHsgJGFyZ0FycmF5VmFsc1tdID0gJHRoaXMtPl9zaG93VmFsdWUoJGFyZ1sncmVmZXJlbmNlJ10pOyB9CgkJCQkJCQl9CgkJCQkJCX0gZWxzZSB7CgkJCQkJCQkkYXJnc1tdID0gc2VsZjo6X3Vud3JhcFJlc3VsdCgkYXJnWyd2YWx1ZSddKTsKCQkJCQkJCWlmICgkZnVuY3Rpb25OYW1lICE9ICdNS01BVFJJWCcpIHsgJGFyZ0FycmF5VmFsc1tdID0gJHRoaXMtPl9zaG93VmFsdWUoJGFyZ1sndmFsdWUnXSk7IH0KCQkJCQkJfQoJCQkJCX0KCQkJCQkvLwlSZXZlcnNlIHRoZSBvcmRlciBvZiB0aGUgYXJndW1lbnRzCgkJCQkJa3Jzb3J0KCRhcmdzKTsKCQkJCQlpZiAoKCRwYXNzQnlSZWZlcmVuY2UpICYmICgkYXJnQ291bnQgPT0gMCkpIHsKCQkJCQkJJGFyZ3NbXSA9ICRjZWxsSUQ7CgkJCQkJCSRhcmdBcnJheVZhbHNbXSA9ICR0aGlzLT5fc2hvd1ZhbHVlKCRjZWxsSUQpOwoJCQkJCX0KLy8JCQkJCWVjaG8gJ0FyZ3VtZW50cyBhcmU6ICc7Ci8vCQkJCQlwcmludF9yKCRhcmdzKTsKLy8JCQkJCWVjaG8gJzxiciAvPic7CgkJCQkJaWYgKCRmdW5jdGlvbk5hbWUgIT0gJ01LTUFUUklYJykgewoJCQkJCQlpZiAoJHRoaXMtPndyaXRlRGVidWdMb2cpIHsKCQkJCQkJCWtyc29ydCgkYXJnQXJyYXlWYWxzKTsKCQkJCQkJCSR0aGlzLT5fd3JpdGVEZWJ1ZygnRXZhbHVhdGluZyAnLiBzZWxmOjpfbG9jYWxlRnVuYygkZnVuY3Rpb25OYW1lKS4nKCAnLmltcGxvZGUoc2VsZjo6JF9sb2NhbGVBcmd1bWVudFNlcGFyYXRvci4nICcsUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuQXJyYXkoJGFyZ0FycmF5VmFscykpLicgKScpOwoJCQkJCQl9CgkJCQkJfQoJCQkJCS8vCVByb2Nlc3MgZWFjaCBhcmd1bWVudCBpbiB0dXJuLCBidWlsZGluZyB0aGUgcmV0dXJuIHZhbHVlIGFzIGFuIGFycmF5Ci8vCQkJCQlpZiAoKCRhcmdDb3VudCA9PSAxKSAmJiAoaXNfYXJyYXkoJGFyZ3NbMV0pKSAmJiAoJGZ1bmN0aW9uTmFtZSAhPSAnTUtNQVRSSVgnKSkgewovLwkJCQkJCSRvcGVyYW5kMSA9ICRhcmdzWzFdOwovLwkJCQkJCSR0aGlzLT5fd3JpdGVEZWJ1ZygnQXJndW1lbnQgaXMgYSBtYXRyaXg6ICcuJHRoaXMtPl9zaG93VmFsdWUoJG9wZXJhbmQxKSk7Ci8vCQkJCQkJJHJlc3VsdCA9IGFycmF5KCk7Ci8vCQkJCQkJJHJvdyA9IDA7Ci8vCQkJCQkJZm9yZWFjaCgkb3BlcmFuZDEgYXMgJGFyZ3MpIHsKLy8JCQkJCQkJaWYgKGlzX2FycmF5KCRhcmdzKSkgewovLwkJCQkJCQkJZm9yZWFjaCgkYXJncyBhcyAkYXJnKSB7Ci8vCQkJCQkJCQkJJHRoaXMtPl93cml0ZURlYnVnKCdFdmFsdWF0aW5nICcuc2VsZjo6X2xvY2FsZUZ1bmMoJGZ1bmN0aW9uTmFtZSkuJyggJy4kdGhpcy0+X3Nob3dWYWx1ZSgkYXJnKS4nICknKTsKLy8JCQkJCQkJCQkkciA9IGNhbGxfdXNlcl9mdW5jX2FycmF5KCRmdW5jdGlvbkNhbGwsJGFyZyk7Ci8vCQkJCQkJCQkJJHRoaXMtPl93cml0ZURlYnVnKCdFdmFsdWF0aW9uIFJlc3VsdCBmb3IgJy5zZWxmOjpfbG9jYWxlRnVuYygkZnVuY3Rpb25OYW1lKS4nKCkgZnVuY3Rpb24gY2FsbCBpcyAnLiR0aGlzLT5fc2hvd1R5cGVEZXRhaWxzKCRyKSk7Ci8vCQkJCQkJCQkJJHJlc3VsdFskcm93XVtdID0gJHI7Ci8vCQkJCQkJCQl9Ci8vCQkJCQkJCQkrKyRyb3c7Ci8vCQkJCQkJCX0gZWxzZSB7Ci8vCQkJCQkJCQkkdGhpcy0+X3dyaXRlRGVidWcoJ0V2YWx1YXRpbmcgJy5zZWxmOjpfbG9jYWxlRnVuYygkZnVuY3Rpb25OYW1lKS4nKCAnLiR0aGlzLT5fc2hvd1ZhbHVlKCRhcmdzKS4nICknKTsKLy8JCQkJCQkJCSRyID0gY2FsbF91c2VyX2Z1bmNfYXJyYXkoJGZ1bmN0aW9uQ2FsbCwkYXJncyk7Ci8vCQkJCQkJCQkkdGhpcy0+X3dyaXRlRGVidWcoJ0V2YWx1YXRpb24gUmVzdWx0IGZvciAnLnNlbGY6Ol9sb2NhbGVGdW5jKCRmdW5jdGlvbk5hbWUpLicoKSBmdW5jdGlvbiBjYWxsIGlzICcuJHRoaXMtPl9zaG93VHlwZURldGFpbHMoJHIpKTsKLy8JCQkJCQkJCSRyZXN1bHRbXSA9ICRyOwovLwkJCQkJCQl9Ci8vCQkJCQkJfQovLwkJCQkJfSBlbHNlIHsKCQkJCQkvLwlQcm9jZXNzIHRoZSBhcmd1bWVudCB3aXRoIHRoZSBhcHByb3ByaWF0ZSBmdW5jdGlvbiBjYWxsCgkJCQkJCWlmICgkcGFzc0NlbGxSZWZlcmVuY2UpIHsKCQkJCQkJCSRhcmdzW10gPSAkcENlbGw7CgkJCQkJCX0KCQkJCQkJaWYgKHN0cnBvcygkZnVuY3Rpb25DYWxsLCc6OicpICE9PSBmYWxzZSkgewoJCQkJCQkJJHJlc3VsdCA9IGNhbGxfdXNlcl9mdW5jX2FycmF5KGV4cGxvZGUoJzo6JywkZnVuY3Rpb25DYWxsKSwkYXJncyk7CgkJCQkJCX0gZWxzZSB7CgkJCQkJCQlmb3JlYWNoKCRhcmdzIGFzICYkYXJnKSB7CgkJCQkJCQkJJGFyZyA9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlblNpbmdsZVZhbHVlKCRhcmcpOwoJCQkJCQkJfQoJCQkJCQkJdW5zZXQoJGFyZyk7CgkJCQkJCQkkcmVzdWx0ID0gY2FsbF91c2VyX2Z1bmNfYXJyYXkoJGZ1bmN0aW9uQ2FsbCwkYXJncyk7CgkJCQkJCX0KLy8JCQkJCX0KCQkJCQlpZiAoJGZ1bmN0aW9uTmFtZSAhPSAnTUtNQVRSSVgnKSB7CgkJCQkJCSR0aGlzLT5fd3JpdGVEZWJ1ZygnRXZhbHVhdGlvbiBSZXN1bHQgZm9yICcuc2VsZjo6X2xvY2FsZUZ1bmMoJGZ1bmN0aW9uTmFtZSkuJygpIGZ1bmN0aW9uIGNhbGwgaXMgJy4kdGhpcy0+X3Nob3dUeXBlRGV0YWlscygkcmVzdWx0KSk7CgkJCQkJfQoJCQkJCSRzdGFjay0+cHVzaCgnVmFsdWUnLHNlbGY6Ol93cmFwUmVzdWx0KCRyZXN1bHQpKTsKCQkJCX0KCgkJCX0gZWxzZSB7CgkJCQkvLyBpZiB0aGUgdG9rZW4gaXMgYSBudW1iZXIsIGJvb2xlYW4sIHN0cmluZyBvciBhbiBFeGNlbCBlcnJvciwgcHVzaCBpdCBvbnRvIHRoZSBzdGFjawoJCQkJaWYgKGlzc2V0KHNlbGY6OiRfRXhjZWxDb25zdGFudHNbc3RydG91cHBlcigkdG9rZW4pXSkpIHsKCQkJCQkkZXhjZWxDb25zdGFudCA9IHN0cnRvdXBwZXIoJHRva2VuKTsKLy8JCQkJCWVjaG8gJ1Rva2VuIGlzIGEgUEhQRXhjZWwgY29uc3RhbnQ6ICcuJGV4Y2VsQ29uc3RhbnQuJzxiciAvPic7CgkJCQkJJHN0YWNrLT5wdXNoKCdDb25zdGFudCBWYWx1ZScsc2VsZjo6JF9FeGNlbENvbnN0YW50c1skZXhjZWxDb25zdGFudF0pOwoJCQkJCSR0aGlzLT5fd3JpdGVEZWJ1ZygnRXZhbHVhdGluZyBDb25zdGFudCAnLiRleGNlbENvbnN0YW50LicgYXMgJy4kdGhpcy0+X3Nob3dUeXBlRGV0YWlscyhzZWxmOjokX0V4Y2VsQ29uc3RhbnRzWyRleGNlbENvbnN0YW50XSkpOwoJCQkJfSBlbHNlaWYgKChpc19udW1lcmljKCR0b2tlbikpIHx8ICgkdG9rZW4gPT09IE5VTEwpIHx8IChpc19ib29sKCR0b2tlbikpIHx8ICgkdG9rZW4gPT0gJycpIHx8ICgkdG9rZW57MH0gPT0gJyInKSB8fCAoJHRva2VuezB9ID09ICcjJykpIHsKLy8JCQkJCWVjaG8gJ1Rva2VuIGlzIGEgbnVtYmVyLCBib29sZWFuLCBzdHJpbmcsIG51bGwgb3IgYW4gRXhjZWwgZXJyb3I8YnIgLz4nOwoJCQkJCSRzdGFjay0+cHVzaCgnVmFsdWUnLCR0b2tlbik7CgkJCQkvLyBpZiB0aGUgdG9rZW4gaXMgYSBuYW1lZCByYW5nZSwgcHVzaCB0aGUgbmFtZWQgcmFuZ2UgbmFtZSBvbnRvIHRoZSBzdGFjawoJCQkJfSBlbHNlaWYgKHByZWdfbWF0Y2goJy9eJy5zZWxmOjpDQUxDVUxBVElPTl9SRUdFWFBfTkFNRURSQU5HRS4nJC9pJywgJHRva2VuLCAkbWF0Y2hlcykpIHsKLy8JCQkJCWVjaG8gJ1Rva2VuIGlzIGEgbmFtZWQgcmFuZ2U8YnIgLz4nOwoJCQkJCSRuYW1lZFJhbmdlID0gJG1hdGNoZXNbNl07Ci8vCQkJCQllY2hvICdOYW1lZCBSYW5nZSBpcyAnLiRuYW1lZFJhbmdlLic8YnIgLz4nOwoJCQkJCSR0aGlzLT5fd3JpdGVEZWJ1ZygnRXZhbHVhdGluZyBOYW1lZCBSYW5nZSAnLiRuYW1lZFJhbmdlKTsKCQkJCQkkY2VsbFZhbHVlID0gJHRoaXMtPmV4dHJhY3ROYW1lZFJhbmdlKCRuYW1lZFJhbmdlLCAoKG51bGwgIT09ICRwQ2VsbCkgPyAkcENlbGxQYXJlbnQgOiBudWxsKSwgZmFsc2UpOwoJCQkJCSRwQ2VsbC0+YXR0YWNoKCRwQ2VsbFBhcmVudCk7CgkJCQkJJHRoaXMtPl93cml0ZURlYnVnKCdFdmFsdWF0aW9uIFJlc3VsdCBmb3IgbmFtZWQgcmFuZ2UgJy4kbmFtZWRSYW5nZS4nIGlzICcuJHRoaXMtPl9zaG93VHlwZURldGFpbHMoJGNlbGxWYWx1ZSkpOwoJCQkJCSRzdGFjay0+cHVzaCgnTmFtZWQgUmFuZ2UnLCRjZWxsVmFsdWUsJG5hbWVkUmFuZ2UpOwoJCQkJfSBlbHNlIHsKCQkJCQlyZXR1cm4gJHRoaXMtPl9yYWlzZUZvcm11bGFFcnJvcigidW5kZWZpbmVkIHZhcmlhYmxlICckdG9rZW4nIik7CgkJCQl9CgkJCX0KCQl9CgkJLy8gd2hlbiB3ZSdyZSBvdXQgb2YgdG9rZW5zLCB0aGUgc3RhY2sgc2hvdWxkIGhhdmUgYSBzaW5nbGUgZWxlbWVudCwgdGhlIGZpbmFsIHJlc3VsdAoJCWlmICgkc3RhY2stPmNvdW50KCkgIT0gMSkgcmV0dXJuICR0aGlzLT5fcmFpc2VGb3JtdWxhRXJyb3IoImludGVybmFsIGVycm9yIik7CgkJJG91dHB1dCA9ICRzdGFjay0+cG9wKCk7CgkJJG91dHB1dCA9ICRvdXRwdXRbJ3ZhbHVlJ107CgovLwkJaWYgKChpc19hcnJheSgkb3V0cHV0KSkgJiYgKHNlbGY6OiRyZXR1cm5BcnJheUFzVHlwZSAhPSBzZWxmOjpSRVRVUk5fQVJSQVlfQVNfQVJSQVkpKSB7Ci8vCQkJcmV0dXJuIGFycmF5X3NoaWZ0KFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlbkFycmF5KCRvdXRwdXQpKTsKLy8JCX0KCQlyZXR1cm4gJG91dHB1dDsKCX0JLy8JZnVuY3Rpb24gX3Byb2Nlc3NUb2tlblN0YWNrKCkKCgoJcHJpdmF0ZSBmdW5jdGlvbiBfdmFsaWRhdGVCaW5hcnlPcGVyYW5kKCRjZWxsSUQsJiRvcGVyYW5kLCYkc3RhY2spIHsKCQkvLwlOdW1iZXJzLCBtYXRyaWNlcyBhbmQgYm9vbGVhbnMgY2FuIHBhc3Mgc3RyYWlnaHQgdGhyb3VnaCwgYXMgdGhleSdyZSBhbHJlYWR5IHZhbGlkCgkJaWYgKGlzX3N0cmluZygkb3BlcmFuZCkpIHsKCQkJLy8JV2Ugb25seSBuZWVkIHNwZWNpYWwgdmFsaWRhdGlvbnMgZm9yIHRoZSBvcGVyYW5kIGlmIGl0IGlzIGEgc3RyaW5nCgkJCS8vCVN0YXJ0IGJ5IHN0cmlwcGluZyBvZmYgdGhlIHF1b3RhdGlvbiBtYXJrcyB3ZSB1c2UgdG8gaWRlbnRpZnkgdHJ1ZSBleGNlbCBzdHJpbmcgdmFsdWVzIGludGVybmFsbHkKCQkJaWYgKCRvcGVyYW5kID4gJycgJiYgJG9wZXJhbmR7MH0gPT0gJyInKSB7ICRvcGVyYW5kID0gc2VsZjo6X3Vud3JhcFJlc3VsdCgkb3BlcmFuZCk7IH0KCQkJLy8JSWYgdGhlIHN0cmluZyBpcyBhIG51bWVyaWMgdmFsdWUsIHdlIHRyZWF0IGl0IGFzIGEgbnVtZXJpYywgc28gbm8gZnVydGhlciB0ZXN0aW5nCgkJCWlmICghaXNfbnVtZXJpYygkb3BlcmFuZCkpIHsKCQkJCS8vCUlmIG5vdCBhIG51bWVyaWMsIHRlc3QgdG8gc2VlIGlmIHRoZSB2YWx1ZSBpcyBhbiBFeGNlbCBlcnJvciwgYW5kIHNvIGNhbid0IGJlIHVzZWQgaW4gbm9ybWFsIGJpbmFyeSBvcGVyYXRpb25zCgkJCQlpZiAoJG9wZXJhbmQgPiAnJyAmJiAkb3BlcmFuZHswfSA9PSAnIycpIHsKCQkJCQkkc3RhY2stPnB1c2goJ1ZhbHVlJywgJG9wZXJhbmQpOwoJCQkJCSR0aGlzLT5fd3JpdGVEZWJ1ZygnRXZhbHVhdGlvbiBSZXN1bHQgaXMgJy4kdGhpcy0+X3Nob3dUeXBlRGV0YWlscygkb3BlcmFuZCkpOwoJCQkJCXJldHVybiBmYWxzZTsKCQkJCX0gZWxzZWlmICghUEhQRXhjZWxfU2hhcmVkX1N0cmluZzo6Y29udmVydFRvTnVtYmVySWZGcmFjdGlvbigkb3BlcmFuZCkpIHsKCQkJCQkvLwlJZiBub3QgYSBudW1lcmljIG9yIGEgZnJhY3Rpb24sIHRoZW4gaXQncyBhIHRleHQgc3RyaW5nLCBhbmQgc28gY2FuJ3QgYmUgdXNlZCBpbiBtYXRoZW1hdGljYWwgYmluYXJ5IG9wZXJhdGlvbnMKCQkJCQkkc3RhY2stPnB1c2goJ1ZhbHVlJywgJyNWQUxVRSEnKTsKCQkJCQkkdGhpcy0+X3dyaXRlRGVidWcoJ0V2YWx1YXRpb24gUmVzdWx0IGlzIGEgJy4kdGhpcy0+X3Nob3dUeXBlRGV0YWlscygnI1ZBTFVFIScpKTsKCQkJCQlyZXR1cm4gZmFsc2U7CgkJCQl9CgkJCX0KCQl9CgoJCS8vCXJldHVybiBhIHRydWUgaWYgdGhlIHZhbHVlIG9mIHRoZSBvcGVyYW5kIGlzIG9uZSB0aGF0IHdlIGNhbiB1c2UgaW4gbm9ybWFsIGJpbmFyeSBvcGVyYXRpb25zCgkJcmV0dXJuIHRydWU7Cgl9CS8vCWZ1bmN0aW9uIF92YWxpZGF0ZUJpbmFyeU9wZXJhbmQoKQoKCglwcml2YXRlIGZ1bmN0aW9uIF9leGVjdXRlQmluYXJ5Q29tcGFyaXNvbk9wZXJhdGlvbigkY2VsbElELCRvcGVyYW5kMSwkb3BlcmFuZDIsJG9wZXJhdGlvbiwmJHN0YWNrLCRyZWN1cnNpbmdBcnJheXM9ZmFsc2UpIHsKCQkvLwlJZiB3ZSdyZSBkZWFsaW5nIHdpdGggbWF0cml4IG9wZXJhdGlvbnMsIHdlIHdhbnQgYSBtYXRyaXggcmVzdWx0CgkJaWYgKChpc19hcnJheSgkb3BlcmFuZDEpKSB8fCAoaXNfYXJyYXkoJG9wZXJhbmQyKSkpIHsKCQkJJHJlc3VsdCA9IGFycmF5KCk7CgkJCWlmICgoaXNfYXJyYXkoJG9wZXJhbmQxKSkgJiYgKCFpc19hcnJheSgkb3BlcmFuZDIpKSkgewoJCQkJZm9yZWFjaCgkb3BlcmFuZDEgYXMgJHggPT4gJG9wZXJhbmREYXRhKSB7CgkJCQkJJHRoaXMtPl93cml0ZURlYnVnKCdFdmFsdWF0aW5nIENvbXBhcmlzb24gJy4kdGhpcy0+X3Nob3dWYWx1ZSgkb3BlcmFuZERhdGEpLicgJy4kb3BlcmF0aW9uLicgJy4kdGhpcy0+X3Nob3dWYWx1ZSgkb3BlcmFuZDIpKTsKCQkJCQkkdGhpcy0+X2V4ZWN1dGVCaW5hcnlDb21wYXJpc29uT3BlcmF0aW9uKCRjZWxsSUQsJG9wZXJhbmREYXRhLCRvcGVyYW5kMiwkb3BlcmF0aW9uLCRzdGFjayk7CgkJCQkJJHIgPSAkc3RhY2stPnBvcCgpOwoJCQkJCSRyZXN1bHRbJHhdID0gJHJbJ3ZhbHVlJ107CgkJCQl9CgkJCX0gZWxzZWlmICgoIWlzX2FycmF5KCRvcGVyYW5kMSkpICYmIChpc19hcnJheSgkb3BlcmFuZDIpKSkgewoJCQkJZm9yZWFjaCgkb3BlcmFuZDIgYXMgJHggPT4gJG9wZXJhbmREYXRhKSB7CgkJCQkJJHRoaXMtPl93cml0ZURlYnVnKCdFdmFsdWF0aW5nIENvbXBhcmlzb24gJy4kdGhpcy0+X3Nob3dWYWx1ZSgkb3BlcmFuZDEpLicgJy4kb3BlcmF0aW9uLicgJy4kdGhpcy0+X3Nob3dWYWx1ZSgkb3BlcmFuZERhdGEpKTsKCQkJCQkkdGhpcy0+X2V4ZWN1dGVCaW5hcnlDb21wYXJpc29uT3BlcmF0aW9uKCRjZWxsSUQsJG9wZXJhbmQxLCRvcGVyYW5kRGF0YSwkb3BlcmF0aW9uLCRzdGFjayk7CgkJCQkJJHIgPSAkc3RhY2stPnBvcCgpOwoJCQkJCSRyZXN1bHRbJHhdID0gJHJbJ3ZhbHVlJ107CgkJCQl9CgkJCX0gZWxzZSB7CgkJCQlpZiAoISRyZWN1cnNpbmdBcnJheXMpIHsgc2VsZjo6X2NoZWNrTWF0cml4T3BlcmFuZHMoJG9wZXJhbmQxLCRvcGVyYW5kMiwyKTsgfQoJCQkJZm9yZWFjaCgkb3BlcmFuZDEgYXMgJHggPT4gJG9wZXJhbmREYXRhKSB7CgkJCQkJJHRoaXMtPl93cml0ZURlYnVnKCdFdmFsdWF0aW5nIENvbXBhcmlzb24gJy4kdGhpcy0+X3Nob3dWYWx1ZSgkb3BlcmFuZERhdGEpLicgJy4kb3BlcmF0aW9uLicgJy4kdGhpcy0+X3Nob3dWYWx1ZSgkb3BlcmFuZDJbJHhdKSk7CgkJCQkJJHRoaXMtPl9leGVjdXRlQmluYXJ5Q29tcGFyaXNvbk9wZXJhdGlvbigkY2VsbElELCRvcGVyYW5kRGF0YSwkb3BlcmFuZDJbJHhdLCRvcGVyYXRpb24sJHN0YWNrLHRydWUpOwoJCQkJCSRyID0gJHN0YWNrLT5wb3AoKTsKCQkJCQkkcmVzdWx0WyR4XSA9ICRyWyd2YWx1ZSddOwoJCQkJfQoJCQl9CgkJCS8vCUxvZyB0aGUgcmVzdWx0IGRldGFpbHMKCQkJJHRoaXMtPl93cml0ZURlYnVnKCdDb21wYXJpc29uIEV2YWx1YXRpb24gUmVzdWx0IGlzICcuJHRoaXMtPl9zaG93VHlwZURldGFpbHMoJHJlc3VsdCkpOwoJCQkvLwlBbmQgcHVzaCB0aGUgcmVzdWx0IG9udG8gdGhlIHN0YWNrCgkJCSRzdGFjay0+cHVzaCgnQXJyYXknLCRyZXN1bHQpOwoJCQlyZXR1cm4gdHJ1ZTsKCQl9CgoJCS8vCVNpbXBsZSB2YWxpZGF0ZSB0aGUgdHdvIG9wZXJhbmRzIGlmIHRoZXkgYXJlIHN0cmluZyB2YWx1ZXMKCQlpZiAoaXNfc3RyaW5nKCRvcGVyYW5kMSkgJiYgJG9wZXJhbmQxID4gJycgJiYgJG9wZXJhbmQxezB9ID09ICciJykgeyAkb3BlcmFuZDEgPSBzZWxmOjpfdW53cmFwUmVzdWx0KCRvcGVyYW5kMSk7IH0KCQlpZiAoaXNfc3RyaW5nKCRvcGVyYW5kMikgJiYgJG9wZXJhbmQyID4gJycgJiYgJG9wZXJhbmQyezB9ID09ICciJykgeyAkb3BlcmFuZDIgPSBzZWxmOjpfdW53cmFwUmVzdWx0KCRvcGVyYW5kMik7IH0KCgkJLy8JZXhlY3V0ZSB0aGUgbmVjZXNzYXJ5IG9wZXJhdGlvbgoJCXN3aXRjaCAoJG9wZXJhdGlvbikgewoJCQkvLwlHcmVhdGVyIHRoYW4KCQkJY2FzZSAnPic6CgkJCQkkcmVzdWx0ID0gKCRvcGVyYW5kMSA+ICRvcGVyYW5kMik7CgkJCQlicmVhazsKCQkJLy8JTGVzcyB0aGFuCgkJCWNhc2UgJzwnOgoJCQkJJHJlc3VsdCA9ICgkb3BlcmFuZDEgPCAkb3BlcmFuZDIpOwoJCQkJYnJlYWs7CgkJCS8vCUVxdWFsaXR5CgkJCWNhc2UgJz0nOgoJCQkJJHJlc3VsdCA9ICgkb3BlcmFuZDEgPT0gJG9wZXJhbmQyKTsKCQkJCWJyZWFrOwoJCQkvLwlHcmVhdGVyIHRoYW4gb3IgZXF1YWwKCQkJY2FzZSAnPj0nOgoJCQkJJHJlc3VsdCA9ICgkb3BlcmFuZDEgPj0gJG9wZXJhbmQyKTsKCQkJCWJyZWFrOwoJCQkvLwlMZXNzIHRoYW4gb3IgZXF1YWwKCQkJY2FzZSAnPD0nOgoJCQkJJHJlc3VsdCA9ICgkb3BlcmFuZDEgPD0gJG9wZXJhbmQyKTsKCQkJCWJyZWFrOwoJCQkvLwlJbmVxdWFsaXR5CgkJCWNhc2UgJzw+JzoKCQkJCSRyZXN1bHQgPSAoJG9wZXJhbmQxICE9ICRvcGVyYW5kMik7CgkJCQlicmVhazsKCQl9CgoJCS8vCUxvZyB0aGUgcmVzdWx0IGRldGFpbHMKCQkkdGhpcy0+X3dyaXRlRGVidWcoJ0V2YWx1YXRpb24gUmVzdWx0IGlzICcuJHRoaXMtPl9zaG93VHlwZURldGFpbHMoJHJlc3VsdCkpOwoJCS8vCUFuZCBwdXNoIHRoZSByZXN1bHQgb250byB0aGUgc3RhY2sKCQkkc3RhY2stPnB1c2goJ1ZhbHVlJywkcmVzdWx0KTsKCQlyZXR1cm4gdHJ1ZTsKCX0JLy8JZnVuY3Rpb24gX2V4ZWN1dGVCaW5hcnlDb21wYXJpc29uT3BlcmF0aW9uKCkKCgoJcHJpdmF0ZSBmdW5jdGlvbiBfZXhlY3V0ZU51bWVyaWNCaW5hcnlPcGVyYXRpb24oJGNlbGxJRCwkb3BlcmFuZDEsJG9wZXJhbmQyLCRvcGVyYXRpb24sJG1hdHJpeEZ1bmN0aW9uLCYkc3RhY2spIHsKCQkvLwlWYWxpZGF0ZSB0aGUgdHdvIG9wZXJhbmRzCgkJaWYgKCEkdGhpcy0+X3ZhbGlkYXRlQmluYXJ5T3BlcmFuZCgkY2VsbElELCRvcGVyYW5kMSwkc3RhY2spKSByZXR1cm4gZmFsc2U7CgkJaWYgKCEkdGhpcy0+X3ZhbGlkYXRlQmluYXJ5T3BlcmFuZCgkY2VsbElELCRvcGVyYW5kMiwkc3RhY2spKSByZXR1cm4gZmFsc2U7CgoJCSRleGVjdXRlTWF0cml4T3BlcmF0aW9uID0gZmFsc2U7CgkJLy8JSWYgZWl0aGVyIG9mIHRoZSBvcGVyYW5kcyBpcyBhIG1hdHJpeCwgd2UgbmVlZCB0byB0cmVhdCB0aGVtIGJvdGggYXMgbWF0cmljZXMKCQkvLwkJKGNvbnZlcnRpbmcgdGhlIG90aGVyIG9wZXJhbmQgdG8gYSBtYXRyaXggaWYgbmVlZCBiZSk7IHRoZW4gcGVyZm9ybSB0aGUgcmVxdWlyZWQKCQkvLwkJbWF0cml4IG9wZXJhdGlvbgoJCWlmICgoaXNfYXJyYXkoJG9wZXJhbmQxKSkgfHwgKGlzX2FycmF5KCRvcGVyYW5kMikpKSB7CgkJCS8vCUVuc3VyZSB0aGF0IGJvdGggb3BlcmFuZHMgYXJlIGFycmF5cy9tYXRyaWNlcwoJCQkkZXhlY3V0ZU1hdHJpeE9wZXJhdGlvbiA9IHRydWU7CgkJCSRtU2l6ZSA9IGFycmF5KCk7CgkJCWxpc3QoJG1TaXplW10sJG1TaXplW10sJG1TaXplW10sJG1TaXplW10pID0gc2VsZjo6X2NoZWNrTWF0cml4T3BlcmFuZHMoJG9wZXJhbmQxLCRvcGVyYW5kMiwyKTsKCgkJCS8vCUJ1dCBpZiB0aGV5J3JlIGJvdGggc2luZ2xlIGNlbGwgbWF0cmljZXMsIHRoZW4gd2UgY2FuIHRyZWF0IHRoZW0gYXMgc2ltcGxlIHZhbHVlcwoJCQlpZiAoYXJyYXlfc3VtKCRtU2l6ZSkgPT0gNCkgewoJCQkJJGV4ZWN1dGVNYXRyaXhPcGVyYXRpb24gPSBmYWxzZTsKCQkJCSRvcGVyYW5kMSA9ICRvcGVyYW5kMVswXVswXTsKCQkJCSRvcGVyYW5kMiA9ICRvcGVyYW5kMlswXVswXTsKCQkJfQoJCX0KCgkJaWYgKCRleGVjdXRlTWF0cml4T3BlcmF0aW9uKSB7CgkJCXRyeSB7CgkJCQkvLwlDb252ZXJ0IG9wZXJhbmQgMSBmcm9tIGEgUEhQIGFycmF5IHRvIGEgbWF0cml4CgkJCQkkbWF0cml4ID0gbmV3IFBIUEV4Y2VsX1NoYXJlZF9KQU1BX01hdHJpeCgkb3BlcmFuZDEpOwoJCQkJLy8JUGVyZm9ybSB0aGUgcmVxdWlyZWQgb3BlcmF0aW9uIGFnYWluc3QgdGhlIG9wZXJhbmQgMSBtYXRyaXgsIHBhc3NpbmcgaW4gb3BlcmFuZCAyCgkJCQkkbWF0cml4UmVzdWx0ID0gJG1hdHJpeC0+JG1hdHJpeEZ1bmN0aW9uKCRvcGVyYW5kMik7CgkJCQkkcmVzdWx0ID0gJG1hdHJpeFJlc3VsdC0+Z2V0QXJyYXkoKTsKCQkJfSBjYXRjaCAoRXhjZXB0aW9uICRleCkgewoJCQkJJHRoaXMtPl93cml0ZURlYnVnKCdKQU1BIE1hdHJpeCBFeGNlcHRpb246ICcuJGV4LT5nZXRNZXNzYWdlKCkpOwoJCQkJJHJlc3VsdCA9ICcjVkFMVUUhJzsKCQkJfQoJCX0gZWxzZSB7CgkJCWlmICgoUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpnZXRDb21wYXRpYmlsaXR5TW9kZSgpICE9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6Q09NUEFUSUJJTElUWV9PUEVOT0ZGSUNFKSAmJgoJCQkJKChpc19zdHJpbmcoJG9wZXJhbmQxKSAmJiAhaXNfbnVtZXJpYygkb3BlcmFuZDEpKSB8fCAoaXNfc3RyaW5nKCRvcGVyYW5kMikgJiYgIWlzX251bWVyaWMoJG9wZXJhbmQyKSkpKSB7CgkJCQkkcmVzdWx0ID0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpWQUxVRSgpOwoJCQl9IGVsc2UgewoJCQkJLy8JSWYgd2UncmUgZGVhbGluZyB3aXRoIG5vbi1tYXRyaXggb3BlcmF0aW9ucywgZXhlY3V0ZSB0aGUgbmVjZXNzYXJ5IG9wZXJhdGlvbgoJCQkJc3dpdGNoICgkb3BlcmF0aW9uKSB7CgkJCQkJLy8JQWRkaXRpb24KCQkJCQljYXNlICcrJzoKCQkJCQkJJHJlc3VsdCA9ICRvcGVyYW5kMSskb3BlcmFuZDI7CgkJCQkJCWJyZWFrOwoJCQkJCS8vCVN1YnRyYWN0aW9uCgkJCQkJY2FzZSAnLSc6CgkJCQkJCSRyZXN1bHQgPSAkb3BlcmFuZDEtJG9wZXJhbmQyOwoJCQkJCQlicmVhazsKCQkJCQkvLwlNdWx0aXBsaWNhdGlvbgoJCQkJCWNhc2UgJyonOgoJCQkJCQkkcmVzdWx0ID0gJG9wZXJhbmQxKiRvcGVyYW5kMjsKCQkJCQkJYnJlYWs7CgkJCQkJLy8JRGl2aXNpb24KCQkJCQljYXNlICcvJzoKCQkJCQkJaWYgKCRvcGVyYW5kMiA9PSAwKSB7CgkJCQkJCQkvLwlUcmFwIGZvciBEaXZpZGUgYnkgWmVybyBlcnJvcgoJCQkJCQkJJHN0YWNrLT5wdXNoKCdWYWx1ZScsJyNESVYvMCEnKTsKCQkJCQkJCSR0aGlzLT5fd3JpdGVEZWJ1ZygnRXZhbHVhdGlvbiBSZXN1bHQgaXMgJy4kdGhpcy0+X3Nob3dUeXBlRGV0YWlscygnI0RJVi8wIScpKTsKCQkJCQkJCXJldHVybiBmYWxzZTsKCQkJCQkJfSBlbHNlIHsKCQkJCQkJCSRyZXN1bHQgPSAkb3BlcmFuZDEvJG9wZXJhbmQyOwoJCQkJCQl9CgkJCQkJCWJyZWFrOwoJCQkJCS8vCVBvd2VyCgkJCQkJY2FzZSAnXic6CgkJCQkJCSRyZXN1bHQgPSBwb3coJG9wZXJhbmQxLCRvcGVyYW5kMik7CgkJCQkJCWJyZWFrOwoJCQkJfQoJCQl9CgkJfQoKCQkvLwlMb2cgdGhlIHJlc3VsdCBkZXRhaWxzCgkJJHRoaXMtPl93cml0ZURlYnVnKCdFdmFsdWF0aW9uIFJlc3VsdCBpcyAnLiR0aGlzLT5fc2hvd1R5cGVEZXRhaWxzKCRyZXN1bHQpKTsKCQkvLwlBbmQgcHVzaCB0aGUgcmVzdWx0IG9udG8gdGhlIHN0YWNrCgkJJHN0YWNrLT5wdXNoKCdWYWx1ZScsJHJlc3VsdCk7CgkJcmV0dXJuIHRydWU7Cgl9CS8vCWZ1bmN0aW9uIF9leGVjdXRlTnVtZXJpY0JpbmFyeU9wZXJhdGlvbigpCgoKCXByaXZhdGUgZnVuY3Rpb24gX3dyaXRlRGVidWcoJG1lc3NhZ2UpIHsKCQkvLwlPbmx5IHdyaXRlIHRoZSBkZWJ1ZyBsb2cgaWYgbG9nZ2luZyBpcyBlbmFibGVkCgkJaWYgKCR0aGlzLT53cml0ZURlYnVnTG9nKSB7CgkJCWlmICgkdGhpcy0+ZWNob0RlYnVnTG9nKSB7CgkJCQllY2hvIGltcGxvZGUoJyAtPiAnLCR0aGlzLT5kZWJ1Z0xvZ1N0YWNrKS4nIC0+ICcuJG1lc3NhZ2UsJzxiciAvPic7CgkJCX0KCQkJJHRoaXMtPmRlYnVnTG9nW10gPSBpbXBsb2RlKCcgLT4gJywkdGhpcy0+ZGVidWdMb2dTdGFjaykuJyAtPiAnLiRtZXNzYWdlOwoJCX0KCX0JLy8JZnVuY3Rpb24gX3dyaXRlRGVidWcoKQoKCgkvLyB0cmlnZ2VyIGFuIGVycm9yLCBidXQgbmljZWx5LCBpZiBuZWVkIGJlCglwcm90ZWN0ZWQgZnVuY3Rpb24gX3JhaXNlRm9ybXVsYUVycm9yKCRlcnJvck1lc3NhZ2UpIHsKCQkkdGhpcy0+Zm9ybXVsYUVycm9yID0gJGVycm9yTWVzc2FnZTsKCQkkdGhpcy0+ZGVidWdMb2dTdGFjayA9IGFycmF5KCk7CgkJaWYgKCEkdGhpcy0+c3VwcHJlc3NGb3JtdWxhRXJyb3JzKSB0aHJvdyBuZXcgRXhjZXB0aW9uKCRlcnJvck1lc3NhZ2UpOwoJCXRyaWdnZXJfZXJyb3IoJGVycm9yTWVzc2FnZSwgRV9VU0VSX0VSUk9SKTsKCX0JLy8JZnVuY3Rpb24gX3JhaXNlRm9ybXVsYUVycm9yKCkKCgoJLyoqCgkgKiBFeHRyYWN0IHJhbmdlIHZhbHVlcwoJICoKCSAqIEBwYXJhbQlzdHJpbmcJCQkJJiRwUmFuZ2UJCVN0cmluZyBiYXNlZCByYW5nZSByZXByZXNlbnRhdGlvbgoJICogQHBhcmFtCVBIUEV4Y2VsX1dvcmtzaGVldAkkcFNoZWV0CQlXb3Jrc2hlZXQKCSAqIEByZXR1cm4gIG1peGVkCQkJCUFycmF5IG9mIHZhbHVlcyBpbiByYW5nZSBpZiByYW5nZSBjb250YWlucyBtb3JlIHRoYW4gb25lIGVsZW1lbnQuIE90aGVyd2lzZSwgYSBzaW5nbGUgdmFsdWUgaXMgcmV0dXJuZWQuCgkgKiBAdGhyb3dzCUV4Y2VwdGlvbgoJICovCglwdWJsaWMgZnVuY3Rpb24gZXh0cmFjdENlbGxSYW5nZSgmJHBSYW5nZSA9ICdBMScsIFBIUEV4Y2VsX1dvcmtzaGVldCAkcFNoZWV0ID0gbnVsbCwgJHJlc2V0TG9nPXRydWUpIHsKCQkvLyBSZXR1cm4gdmFsdWUKCQkkcmV0dXJuVmFsdWUgPSBhcnJheSAoKTsKCi8vCQllY2hvICdleHRyYWN0Q2VsbFJhbmdlKCcuJHBSYW5nZS4nKTxiciAvPic7CgkJaWYgKCRwU2hlZXQgIT09IE5VTEwpIHsKLy8JCQllY2hvICdQYXNzZWQgc2hlZXQgbmFtZSBpcyAnLiRwU2hlZXQtPmdldFRpdGxlKCkuJzxiciAvPic7Ci8vCQkJZWNobyAnUmFuZ2UgcmVmZXJlbmNlIGlzICcuJHBSYW5nZS4nPGJyIC8+JzsKCQkJaWYgKHN0cnBvcyAoJHBSYW5nZSwgJyEnKSAhPT0gZmFsc2UpIHsKLy8JCQkJZWNobyAnJHBSYW5nZSByZWZlcmVuY2UgaW5jbHVkZXMgc2hlZXQgcmVmZXJlbmNlPGJyIC8+JzsKCQkJCSR3b3Jrc2hlZXRSZWZlcmVuY2UgPSBQSFBFeGNlbF9Xb3Jrc2hlZXQ6OmV4dHJhY3RTaGVldFRpdGxlKCRwUmFuZ2UsIHRydWUpOwoJCQkJJHBTaGVldCA9ICRwU2hlZXQtPmdldFBhcmVudCgpLT5nZXRTaGVldEJ5TmFtZSgkd29ya3NoZWV0UmVmZXJlbmNlWzBdKTsKLy8JCQkJZWNobyAnTmV3IHNoZWV0IG5hbWUgaXMgJy4kcFNoZWV0LT5nZXRUaXRsZSgpLic8YnIgLz4nOwoJCQkJJHBSYW5nZSA9ICR3b3Jrc2hlZXRSZWZlcmVuY2VbMV07Ci8vCQkJCWVjaG8gJ0FkanVzdGVkIFJhbmdlIHJlZmVyZW5jZSBpcyAnLiRwUmFuZ2UuJzxiciAvPic7CgkJCX0KCgkJCS8vIEV4dHJhY3QgcmFuZ2UKCQkJJGFSZWZlcmVuY2VzID0gUEhQRXhjZWxfQ2VsbDo6ZXh0cmFjdEFsbENlbGxSZWZlcmVuY2VzSW5SYW5nZSgkcFJhbmdlKTsKCQkJJHBSYW5nZSA9ICRwU2hlZXQtPmdldFRpdGxlKCkuJyEnLiRwUmFuZ2U7CgkJCWlmICghaXNzZXQoJGFSZWZlcmVuY2VzWzFdKSkgewoJCQkJLy8JU2luZ2xlIGNlbGwgaW4gcmFuZ2UKCQkJCWxpc3QoJGN1cnJlbnRDb2wsJGN1cnJlbnRSb3cpID0gc3NjYW5mKCRhUmVmZXJlbmNlc1swXSwnJVtBLVpdJWQnKTsKCQkJCWlmICgkcFNoZWV0LT5jZWxsRXhpc3RzKCRhUmVmZXJlbmNlc1swXSkpIHsKCQkJCQkkcmV0dXJuVmFsdWVbJGN1cnJlbnRSb3ddWyRjdXJyZW50Q29sXSA9ICRwU2hlZXQtPmdldENlbGwoJGFSZWZlcmVuY2VzWzBdKS0+Z2V0Q2FsY3VsYXRlZFZhbHVlKCRyZXNldExvZyk7CgkJCQl9IGVsc2UgewoJCQkJCSRyZXR1cm5WYWx1ZVskY3VycmVudFJvd11bJGN1cnJlbnRDb2xdID0gbnVsbDsKCQkJCX0KCQkJfSBlbHNlIHsKCQkJCS8vIEV4dHJhY3QgY2VsbCBkYXRhIGZvciBhbGwgY2VsbHMgaW4gdGhlIHJhbmdlCgkJCQlmb3JlYWNoICgkYVJlZmVyZW5jZXMgYXMgJHJlZmVyZW5jZSkgewoJCQkJCS8vIEV4dHJhY3QgcmFuZ2UKCQkJCQlsaXN0KCRjdXJyZW50Q29sLCRjdXJyZW50Um93KSA9IHNzY2FuZigkcmVmZXJlbmNlLCclW0EtWl0lZCcpOwoKCQkJCQlpZiAoJHBTaGVldC0+Y2VsbEV4aXN0cygkcmVmZXJlbmNlKSkgewoJCQkJCQkkcmV0dXJuVmFsdWVbJGN1cnJlbnRSb3ddWyRjdXJyZW50Q29sXSA9ICRwU2hlZXQtPmdldENlbGwoJHJlZmVyZW5jZSktPmdldENhbGN1bGF0ZWRWYWx1ZSgkcmVzZXRMb2cpOwoJCQkJCX0gZWxzZSB7CgkJCQkJCSRyZXR1cm5WYWx1ZVskY3VycmVudFJvd11bJGN1cnJlbnRDb2xdID0gbnVsbDsKCQkJCQl9CgkJCQl9CgkJCX0KCQl9CgoJCS8vIFJldHVybgoJCXJldHVybiAkcmV0dXJuVmFsdWU7Cgl9CS8vCWZ1bmN0aW9uIGV4dHJhY3RDZWxsUmFuZ2UoKQoKCgkvKioKCSAqIEV4dHJhY3QgcmFuZ2UgdmFsdWVzCgkgKgoJICogQHBhcmFtCXN0cmluZwkJCQkmJHBSYW5nZQlTdHJpbmcgYmFzZWQgcmFuZ2UgcmVwcmVzZW50YXRpb24KCSAqIEBwYXJhbQlQSFBFeGNlbF9Xb3Jrc2hlZXQJJHBTaGVldAkJV29ya3NoZWV0CgkgKiBAcmV0dXJuICBtaXhlZAkJCQlBcnJheSBvZiB2YWx1ZXMgaW4gcmFuZ2UgaWYgcmFuZ2UgY29udGFpbnMgbW9yZSB0aGFuIG9uZSBlbGVtZW50LiBPdGhlcndpc2UsIGEgc2luZ2xlIHZhbHVlIGlzIHJldHVybmVkLgoJICogQHRocm93cwlFeGNlcHRpb24KCSAqLwoJcHVibGljIGZ1bmN0aW9uIGV4dHJhY3ROYW1lZFJhbmdlKCYkcFJhbmdlID0gJ0ExJywgUEhQRXhjZWxfV29ya3NoZWV0ICRwU2hlZXQgPSBudWxsLCAkcmVzZXRMb2c9dHJ1ZSkgewoJCS8vIFJldHVybiB2YWx1ZQoJCSRyZXR1cm5WYWx1ZSA9IGFycmF5ICgpOwoKLy8JCWVjaG8gJ2V4dHJhY3ROYW1lZFJhbmdlKCcuJHBSYW5nZS4nKTxiciAvPic7CgkJaWYgKCRwU2hlZXQgIT09IE5VTEwpIHsKLy8JCQllY2hvICdDdXJyZW50IHNoZWV0IG5hbWUgaXMgJy4kcFNoZWV0LT5nZXRUaXRsZSgpLic8YnIgLz4nOwovLwkJCWVjaG8gJ1JhbmdlIHJlZmVyZW5jZSBpcyAnLiRwUmFuZ2UuJzxiciAvPic7CgkJCWlmIChzdHJwb3MgKCRwUmFuZ2UsICchJykgIT09IGZhbHNlKSB7Ci8vCQkJCWVjaG8gJyRwUmFuZ2UgcmVmZXJlbmNlIGluY2x1ZGVzIHNoZWV0IHJlZmVyZW5jZTxiciAvPic7CgkJCQkkd29ya3NoZWV0UmVmZXJlbmNlID0gUEhQRXhjZWxfV29ya3NoZWV0OjpleHRyYWN0U2hlZXRUaXRsZSgkcFJhbmdlLCB0cnVlKTsKCQkJCSRwU2hlZXQgPSAkcFNoZWV0LT5nZXRQYXJlbnQoKS0+Z2V0U2hlZXRCeU5hbWUoJHdvcmtzaGVldFJlZmVyZW5jZVswXSk7Ci8vCQkJCWVjaG8gJ05ldyBzaGVldCBuYW1lIGlzICcuJHBTaGVldC0+Z2V0VGl0bGUoKS4nPGJyIC8+JzsKCQkJCSRwUmFuZ2UgPSAkd29ya3NoZWV0UmVmZXJlbmNlWzFdOwovLwkJCQllY2hvICdBZGp1c3RlZCBSYW5nZSByZWZlcmVuY2UgaXMgJy4kcFJhbmdlLic8YnIgLz4nOwoJCQl9CgoJCQkvLyBOYW1lZCByYW5nZT8KCQkJJG5hbWVkUmFuZ2UgPSBQSFBFeGNlbF9OYW1lZFJhbmdlOjpyZXNvbHZlUmFuZ2UoJHBSYW5nZSwgJHBTaGVldCk7CgkJCWlmICgkbmFtZWRSYW5nZSAhPT0gTlVMTCkgewoJCQkJJHBTaGVldCA9ICRuYW1lZFJhbmdlLT5nZXRXb3Jrc2hlZXQoKTsKLy8JCQkJZWNobyAnTmFtZWQgUmFuZ2UgJy4kcFJhbmdlLicgKCc7CgkJCQkkcFJhbmdlID0gJG5hbWVkUmFuZ2UtPmdldFJhbmdlKCk7CgkJCQkkc3BsaXRSYW5nZSA9IFBIUEV4Y2VsX0NlbGw6OnNwbGl0UmFuZ2UoJHBSYW5nZSk7CgkJCQkvLwlDb252ZXJ0IHJvdyBhbmQgY29sdW1uIHJlZmVyZW5jZXMKCQkJCWlmIChjdHlwZV9hbHBoYSgkc3BsaXRSYW5nZVswXVswXSkpIHsKCQkJCQkkcFJhbmdlID0gJHNwbGl0UmFuZ2VbMF1bMF0gLiAnMTonIC4gJHNwbGl0UmFuZ2VbMF1bMV0gLiAkbmFtZWRSYW5nZS0+Z2V0V29ya3NoZWV0KCktPmdldEhpZ2hlc3RSb3coKTsKCQkJCX0gZWxzZWlmKGN0eXBlX2RpZ2l0KCRzcGxpdFJhbmdlWzBdWzBdKSkgewoJCQkJCSRwUmFuZ2UgPSAnQScgLiAkc3BsaXRSYW5nZVswXVswXSAuICc6JyAuICRuYW1lZFJhbmdlLT5nZXRXb3Jrc2hlZXQoKS0+Z2V0SGlnaGVzdENvbHVtbigpIC4gJHNwbGl0UmFuZ2VbMF1bMV07CgkJCQl9Ci8vCQkJCWVjaG8gJHBSYW5nZS4nKSBpcyBpbiBzaGVldCAnLiRuYW1lZFJhbmdlLT5nZXRXb3Jrc2hlZXQoKS0+Z2V0VGl0bGUoKS4nPGJyIC8+JzsKCi8vCQkJCWlmICgkcFNoZWV0LT5nZXRUaXRsZSgpICE9ICRuYW1lZFJhbmdlLT5nZXRXb3Jrc2hlZXQoKS0+Z2V0VGl0bGUoKSkgewovLwkJCQkJaWYgKCEkbmFtZWRSYW5nZS0+Z2V0TG9jYWxPbmx5KCkpIHsKLy8JCQkJCQkkcFNoZWV0ID0gJG5hbWVkUmFuZ2UtPmdldFdvcmtzaGVldCgpOwovLwkJCQkJfSBlbHNlIHsKLy8JCQkJCQlyZXR1cm4gJHJldHVyblZhbHVlOwovLwkJCQkJfQovLwkJCQl9CgkJCX0gZWxzZSB7CgkJCQlyZXR1cm4gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpSRUYoKTsKCQkJfQoKCQkJLy8gRXh0cmFjdCByYW5nZQoJCQkkYVJlZmVyZW5jZXMgPSBQSFBFeGNlbF9DZWxsOjpleHRyYWN0QWxsQ2VsbFJlZmVyZW5jZXNJblJhbmdlKCRwUmFuZ2UpOwovLwkJCXZhcl9kdW1wKCRhUmVmZXJlbmNlcyk7CgkJCWlmICghaXNzZXQoJGFSZWZlcmVuY2VzWzFdKSkgewoJCQkJLy8JU2luZ2xlIGNlbGwgKG9yIHNpbmdsZSBjb2x1bW4gb3Igcm93KSBpbiByYW5nZQoJCQkJbGlzdCgkY3VycmVudENvbCwkY3VycmVudFJvdykgPSBQSFBFeGNlbF9DZWxsOjpjb29yZGluYXRlRnJvbVN0cmluZygkYVJlZmVyZW5jZXNbMF0pOwoJCQkJaWYgKCRwU2hlZXQtPmNlbGxFeGlzdHMoJGFSZWZlcmVuY2VzWzBdKSkgewoJCQkJCSRyZXR1cm5WYWx1ZVskY3VycmVudFJvd11bJGN1cnJlbnRDb2xdID0gJHBTaGVldC0+Z2V0Q2VsbCgkYVJlZmVyZW5jZXNbMF0pLT5nZXRDYWxjdWxhdGVkVmFsdWUoJHJlc2V0TG9nKTsKCQkJCX0gZWxzZSB7CgkJCQkJJHJldHVyblZhbHVlWyRjdXJyZW50Um93XVskY3VycmVudENvbF0gPSBudWxsOwoJCQkJfQoJCQl9IGVsc2UgewoJCQkJLy8gRXh0cmFjdCBjZWxsIGRhdGEgZm9yIGFsbCBjZWxscyBpbiB0aGUgcmFuZ2UKCQkJCWZvcmVhY2ggKCRhUmVmZXJlbmNlcyBhcyAkcmVmZXJlbmNlKSB7CgkJCQkJLy8gRXh0cmFjdCByYW5nZQoJCQkJCWxpc3QoJGN1cnJlbnRDb2wsJGN1cnJlbnRSb3cpID0gUEhQRXhjZWxfQ2VsbDo6Y29vcmRpbmF0ZUZyb21TdHJpbmcoJHJlZmVyZW5jZSk7Ci8vCQkJCQllY2hvICdOQU1FRCBSQU5HRTogJGN1cnJlbnRDb2w9Jy4kY3VycmVudENvbC4nICRjdXJyZW50Um93PScuJGN1cnJlbnRSb3cuJzxiciAvPic7CgkJCQkJaWYgKCRwU2hlZXQtPmNlbGxFeGlzdHMoJHJlZmVyZW5jZSkpIHsKCQkJCQkJJHJldHVyblZhbHVlWyRjdXJyZW50Um93XVskY3VycmVudENvbF0gPSAkcFNoZWV0LT5nZXRDZWxsKCRyZWZlcmVuY2UpLT5nZXRDYWxjdWxhdGVkVmFsdWUoJHJlc2V0TG9nKTsKCQkJCQl9IGVsc2UgewoJCQkJCQkkcmV0dXJuVmFsdWVbJGN1cnJlbnRSb3ddWyRjdXJyZW50Q29sXSA9IG51bGw7CgkJCQkJfQoJCQkJfQoJCQl9Ci8vCQkJCXByaW50X3IoJHJldHVyblZhbHVlKTsKLy8JCQllY2hvICc8YnIgLz4nOwoJCX0KCgkJLy8gUmV0dXJuCgkJcmV0dXJuICRyZXR1cm5WYWx1ZTsKCX0JLy8JZnVuY3Rpb24gZXh0cmFjdE5hbWVkUmFuZ2UoKQoKCgkvKioKCSAqIElzIGEgc3BlY2lmaWMgZnVuY3Rpb24gaW1wbGVtZW50ZWQ/CgkgKgoJICogQHBhcmFtCXN0cmluZwkkcEZ1bmN0aW9uCUZ1bmN0aW9uIE5hbWUKCSAqIEByZXR1cm4JYm9vbGVhbgoJICovCglwdWJsaWMgZnVuY3Rpb24gaXNJbXBsZW1lbnRlZCgkcEZ1bmN0aW9uID0gJycpIHsKCQkkcEZ1bmN0aW9uID0gc3RydG91cHBlciAoJHBGdW5jdGlvbik7CgkJaWYgKGlzc2V0KHNlbGY6OiRfUEhQRXhjZWxGdW5jdGlvbnNbJHBGdW5jdGlvbl0pKSB7CgkJCXJldHVybiAoc2VsZjo6JF9QSFBFeGNlbEZ1bmN0aW9uc1skcEZ1bmN0aW9uXVsnZnVuY3Rpb25DYWxsJ10gIT0gJ1BIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6RFVNTVknKTsKCQl9IGVsc2UgewoJCQlyZXR1cm4gZmFsc2U7CgkJfQoJfQkvLwlmdW5jdGlvbiBpc0ltcGxlbWVudGVkKCkKCgoJLyoqCgkgKiBHZXQgYSBsaXN0IG9mIGFsbCBpbXBsZW1lbnRlZCBmdW5jdGlvbnMgYXMgYW4gYXJyYXkgb2YgZnVuY3Rpb24gb2JqZWN0cwoJICoKCSAqIEByZXR1cm4JYXJyYXkgb2YgUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb24KCSAqLwoJcHVibGljIGZ1bmN0aW9uIGxpc3RGdW5jdGlvbnMoKSB7CgkJLy8gUmV0dXJuIHZhbHVlCgkJJHJldHVyblZhbHVlID0gYXJyYXkoKTsKCQkvLyBMb29wIGZ1bmN0aW9ucwoJCWZvcmVhY2goc2VsZjo6JF9QSFBFeGNlbEZ1bmN0aW9ucyBhcyAkZnVuY3Rpb25OYW1lID0+ICRmdW5jdGlvbikgewoJCQlpZiAoJGZ1bmN0aW9uWydmdW5jdGlvbkNhbGwnXSAhPSAnUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpEVU1NWScpIHsKCQkJCSRyZXR1cm5WYWx1ZVskZnVuY3Rpb25OYW1lXSA9IG5ldyBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbigkZnVuY3Rpb25bJ2NhdGVnb3J5J10sCgkJCQkJCQkJCQkJCQkJCQkJCQkJJGZ1bmN0aW9uTmFtZSwKCQkJCQkJCQkJCQkJCQkJCQkJCQkkZnVuY3Rpb25bJ2Z1bmN0aW9uQ2FsbCddCgkJCQkJCQkJCQkJCQkJCQkJCQkgICApOwoJCQl9CgkJfQoKCQkvLyBSZXR1cm4KCQlyZXR1cm4gJHJldHVyblZhbHVlOwoJfQkvLwlmdW5jdGlvbiBsaXN0RnVuY3Rpb25zKCkKCgoJLyoqCgkgKiBHZXQgYSBsaXN0IG9mIGFsbCBFeGNlbCBmdW5jdGlvbiBuYW1lcwoJICoKCSAqIEByZXR1cm4JYXJyYXkKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGxpc3RBbGxGdW5jdGlvbk5hbWVzKCkgewoJCXJldHVybiBhcnJheV9rZXlzKHNlbGY6OiRfUEhQRXhjZWxGdW5jdGlvbnMpOwoJfQkvLwlmdW5jdGlvbiBsaXN0QWxsRnVuY3Rpb25OYW1lcygpCgoJLyoqCgkgKiBHZXQgYSBsaXN0IG9mIGltcGxlbWVudGVkIEV4Y2VsIGZ1bmN0aW9uIG5hbWVzCgkgKgoJICogQHJldHVybglhcnJheQoJICovCglwdWJsaWMgZnVuY3Rpb24gbGlzdEZ1bmN0aW9uTmFtZXMoKSB7CgkJLy8gUmV0dXJuIHZhbHVlCgkJJHJldHVyblZhbHVlID0gYXJyYXkoKTsKCQkvLyBMb29wIGZ1bmN0aW9ucwoJCWZvcmVhY2goc2VsZjo6JF9QSFBFeGNlbEZ1bmN0aW9ucyBhcyAkZnVuY3Rpb25OYW1lID0+ICRmdW5jdGlvbikgewoJCQlpZiAoJGZ1bmN0aW9uWydmdW5jdGlvbkNhbGwnXSAhPSAnUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpEVU1NWScpIHsKCQkJCSRyZXR1cm5WYWx1ZVtdID0gJGZ1bmN0aW9uTmFtZTsKCQkJfQoJCX0KCgkJLy8gUmV0dXJuCgkJcmV0dXJuICRyZXR1cm5WYWx1ZTsKCX0JLy8JZnVuY3Rpb24gbGlzdEZ1bmN0aW9uTmFtZXMoKQoKfQkvLwljbGFzcyBQSFBFeGNlbF9DYWxjdWxhdGlvbgoKCgoKLy8gZm9yIGludGVybmFsIHVzZQpjbGFzcyBQSFBFeGNlbF9Ub2tlbl9TdGFjayB7CgoJcHJpdmF0ZSAkX3N0YWNrID0gYXJyYXkoKTsKCXByaXZhdGUgJF9jb3VudCA9IDA7CgoKCXB1YmxpYyBmdW5jdGlvbiBjb3VudCgpIHsKCQlyZXR1cm4gJHRoaXMtPl9jb3VudDsKCX0JLy8JZnVuY3Rpb24gY291bnQoKQoKCglwdWJsaWMgZnVuY3Rpb24gcHVzaCgkdHlwZSwkdmFsdWUsJHJlZmVyZW5jZT1udWxsKSB7CgkJJHRoaXMtPl9zdGFja1skdGhpcy0+X2NvdW50KytdID0gYXJyYXkoJ3R5cGUnCQk9PiAkdHlwZSwKCQkJCQkJCQkJCQkgICAndmFsdWUnCQk9PiAkdmFsdWUsCgkJCQkJCQkJCQkJICAgJ3JlZmVyZW5jZScJPT4gJHJlZmVyZW5jZQoJCQkJCQkJCQkJCSAgKTsKCQlpZiAoJHR5cGUgPT0gJ0Z1bmN0aW9uJykgewoJCQkkbG9jYWxlRnVuY3Rpb24gPSBQSFBFeGNlbF9DYWxjdWxhdGlvbjo6X2xvY2FsZUZ1bmMoJHZhbHVlKTsKCQkJaWYgKCRsb2NhbGVGdW5jdGlvbiAhPSAkdmFsdWUpIHsKCQkJCSR0aGlzLT5fc3RhY2tbKCR0aGlzLT5fY291bnQgLSAxKV1bJ2xvY2FsZVZhbHVlJ10gPSAkbG9jYWxlRnVuY3Rpb247CgkJCX0KCQl9Cgl9CS8vCWZ1bmN0aW9uIHB1c2goKQoKCglwdWJsaWMgZnVuY3Rpb24gcG9wKCkgewoJCWlmICgkdGhpcy0+X2NvdW50ID4gMCkgewoJCQlyZXR1cm4gJHRoaXMtPl9zdGFja1stLSR0aGlzLT5fY291bnRdOwoJCX0KCQlyZXR1cm4gbnVsbDsKCX0JLy8JZnVuY3Rpb24gcG9wKCkKCgoJcHVibGljIGZ1bmN0aW9uIGxhc3QoJG49MSkgewoJCWlmICgkdGhpcy0+X2NvdW50LSRuIDwgMCkgewoJCQlyZXR1cm4gbnVsbDsKCQl9CgkJcmV0dXJuICR0aGlzLT5fc3RhY2tbJHRoaXMtPl9jb3VudC0kbl07Cgl9CS8vCWZ1bmN0aW9uIGxhc3QoKQoKCglmdW5jdGlvbiBfX2NvbnN0cnVjdCgpIHsKCX0KCn0JLy8JY2xhc3MgUEhQRXhjZWxfVG9rZW5fU3RhY2sK]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Calculation/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Calculation/Database.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIFBIUEV4Y2VsCiAqCiAqIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKICoKICogQGNhdGVnb3J5CVBIUEV4Y2VsCiAqIEBwYWNrYWdlCQlQSFBFeGNlbF9DYWxjdWxhdGlvbgogKiBAY29weXJpZ2h0CUNvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwgKGh0dHA6Ly93d3cuY29kZXBsZXguY29tL1BIUEV4Y2VsKQogKiBAbGljZW5zZQkJaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL29sZC1saWNlbnNlcy9sZ3BsLTIuMS50eHQJTEdQTAogKiBAdmVyc2lvbgkJMS43LjcsIDIwMTItMDUtMTkKICovCgoKLyoqIFBIUEV4Y2VsIHJvb3QgZGlyZWN0b3J5ICovCmlmICghZGVmaW5lZCgnUEhQRVhDRUxfUk9PVCcpKSB7CgkvKioKCSAqIEBpZ25vcmUKCSAqLwoJZGVmaW5lKCdQSFBFWENFTF9ST09UJywgZGlybmFtZShfX0ZJTEVfXykgLiAnLy4uLy4uLycpOwoJcmVxdWlyZShQSFBFWENFTF9ST09UIC4gJ1BIUEV4Y2VsL0F1dG9sb2FkZXIucGhwJyk7Cn0KCgovKioKICogUEhQRXhjZWxfQ2FsY3VsYXRpb25fRGF0YWJhc2UKICoKICogQGNhdGVnb3J5CVBIUEV4Y2VsCiAqIEBwYWNrYWdlCQlQSFBFeGNlbF9DYWxjdWxhdGlvbgogKiBAY29weXJpZ2h0CUNvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwgKGh0dHA6Ly93d3cuY29kZXBsZXguY29tL1BIUEV4Y2VsKQogKi8KY2xhc3MgUEhQRXhjZWxfQ2FsY3VsYXRpb25fRGF0YWJhc2UgewoKCgkvKioKCSAqIF9fZmllbGRFeHRyYWN0CgkgKgoJICogRXh0cmFjdHMgdGhlIGNvbHVtbiBJRCB0byB1c2UgZm9yIHRoZSBkYXRhIGZpZWxkLgoJICoKCSAqIEBhY2Nlc3MJcHJpdmF0ZQoJICogQHBhcmFtCW1peGVkW10JCSRkYXRhYmFzZQkJVGhlIHJhbmdlIG9mIGNlbGxzIHRoYXQgbWFrZXMgdXAgdGhlIGxpc3Qgb3IgZGF0YWJhc2UuCgkgKgkJCQkJCQkJCQlBIGRhdGFiYXNlIGlzIGEgbGlzdCBvZiByZWxhdGVkIGRhdGEgaW4gd2hpY2ggcm93cyBvZiByZWxhdGVkCgkgKgkJCQkJCQkJCQlpbmZvcm1hdGlvbiBhcmUgcmVjb3JkcywgYW5kIGNvbHVtbnMgb2YgZGF0YSBhcmUgZmllbGRzLiBUaGUKCSAqCQkJCQkJCQkJCWZpcnN0IHJvdyBvZiB0aGUgbGlzdCBjb250YWlucyBsYWJlbHMgZm9yIGVhY2ggY29sdW1uLgoJICogQHBhcmFtCW1peGVkCQkkZmllbGQJCQlJbmRpY2F0ZXMgd2hpY2ggY29sdW1uIGlzIHVzZWQgaW4gdGhlIGZ1bmN0aW9uLiBFbnRlciB0aGUKCSAqCQkJCQkJCQkJCWNvbHVtbiBsYWJlbCBlbmNsb3NlZCBiZXR3ZWVuIGRvdWJsZSBxdW90YXRpb24gbWFya3MsIHN1Y2ggYXMKCSAqCQkJCQkJCQkJCSJBZ2UiIG9yICJZaWVsZCwiIG9yIGEgbnVtYmVyICh3aXRob3V0IHF1b3RhdGlvbiBtYXJrcykgdGhhdAoJICoJCQkJCQkJCQkJcmVwcmVzZW50cyB0aGUgcG9zaXRpb24gb2YgdGhlIGNvbHVtbiB3aXRoaW4gdGhlIGxpc3Q6IDEgZm9yCgkgKgkJCQkJCQkJCQl0aGUgZmlyc3QgY29sdW1uLCAyIGZvciB0aGUgc2Vjb25kIGNvbHVtbiwgYW5kIHNvIG9uLgoJICogQHJldHVybglzdHJpbmd8TlVMTAoJICoKCSAqLwoJcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gX19maWVsZEV4dHJhY3QoJGRhdGFiYXNlLCRmaWVsZCkgewoJCSRmaWVsZCA9IHN0cnRvdXBwZXIoUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuU2luZ2xlVmFsdWUoJGZpZWxkKSk7CgkJJGZpZWxkTmFtZXMgPSBhcnJheV9tYXAoJ3N0cnRvdXBwZXInLGFycmF5X3NoaWZ0KCRkYXRhYmFzZSkpOwoKCQlpZiAoaXNfbnVtZXJpYygkZmllbGQpKSB7CgkJCSRrZXlzID0gYXJyYXlfa2V5cygkZmllbGROYW1lcyk7CgkJCXJldHVybiAka2V5c1skZmllbGQtMV07CgkJfQoJCSRrZXkgPSBhcnJheV9zZWFyY2goJGZpZWxkLCRmaWVsZE5hbWVzKTsKCQlyZXR1cm4gKCRrZXkpID8gJGtleSA6IE5VTEw7Cgl9CgoJLyoqCgkgKiBfX2ZpbHRlcgoJICoKCSAqIFBhcnNlcyB0aGUgc2VsZWN0aW9uIGNyaXRlcmlhLCBleHRyYWN0cyB0aGUgZGF0YWJhc2Ugcm93cyB0aGF0IG1hdGNoIHRob3NlIGNyaXRlcmlhLCBhbmQKCSAqIHJldHVybnMgdGhhdCBzdWJzZXQgb2Ygcm93cy4KCSAqCgkgKiBAYWNjZXNzCXByaXZhdGUKCSAqIEBwYXJhbQltaXhlZFtdCQkkZGF0YWJhc2UJCVRoZSByYW5nZSBvZiBjZWxscyB0aGF0IG1ha2VzIHVwIHRoZSBsaXN0IG9yIGRhdGFiYXNlLgoJICoJCQkJCQkJCQkJQSBkYXRhYmFzZSBpcyBhIGxpc3Qgb2YgcmVsYXRlZCBkYXRhIGluIHdoaWNoIHJvd3Mgb2YgcmVsYXRlZAoJICoJCQkJCQkJCQkJaW5mb3JtYXRpb24gYXJlIHJlY29yZHMsIGFuZCBjb2x1bW5zIG9mIGRhdGEgYXJlIGZpZWxkcy4gVGhlCgkgKgkJCQkJCQkJCQlmaXJzdCByb3cgb2YgdGhlIGxpc3QgY29udGFpbnMgbGFiZWxzIGZvciBlYWNoIGNvbHVtbi4KCSAqIEBwYXJhbQltaXhlZFtdCQkkY3JpdGVyaWEJCVRoZSByYW5nZSBvZiBjZWxscyB0aGF0IGNvbnRhaW5zIHRoZSBjb25kaXRpb25zIHlvdSBzcGVjaWZ5LgoJICoJCQkJCQkJCQkJWW91IGNhbiB1c2UgYW55IHJhbmdlIGZvciB0aGUgY3JpdGVyaWEgYXJndW1lbnQsIGFzIGxvbmcgYXMgaXQKCSAqCQkJCQkJCQkJCWluY2x1ZGVzIGF0IGxlYXN0IG9uZSBjb2x1bW4gbGFiZWwgYW5kIGF0IGxlYXN0IG9uZSBjZWxsIGJlbG93CgkgKgkJCQkJCQkJCQl0aGUgY29sdW1uIGxhYmVsIGluIHdoaWNoIHlvdSBzcGVjaWZ5IGEgY29uZGl0aW9uIGZvciB0aGUKCSAqCQkJCQkJCQkJCWNvbHVtbi4KCSAqIEByZXR1cm4JYXJyYXkgb2YgbWl4ZWQKCSAqCgkgKi8KCXByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIF9fZmlsdGVyKCRkYXRhYmFzZSwkY3JpdGVyaWEpIHsKCQkkZmllbGROYW1lcyA9IGFycmF5X3NoaWZ0KCRkYXRhYmFzZSk7CgkJJGNyaXRlcmlhTmFtZXMgPSBhcnJheV9zaGlmdCgkY3JpdGVyaWEpOwoKCQkvLwlDb252ZXJ0IHRoZSBjcml0ZXJpYSBpbnRvIGEgc2V0IG9mIEFORC9PUiBjb25kaXRpb25zIHdpdGggWzpwbGFjZWhvbGRlcnNdCgkJJHRlc3RDb25kaXRpb25zID0gJHRlc3RWYWx1ZXMgPSBhcnJheSgpOwoJCSR0ZXN0Q29uZGl0aW9uc0NvdW50ID0gMDsKCQlmb3JlYWNoKCRjcml0ZXJpYU5hbWVzIGFzICRrZXkgPT4gJGNyaXRlcmlhTmFtZSkgewoJCQkkdGVzdENvbmRpdGlvbiA9IGFycmF5KCk7CgkJCSR0ZXN0Q29uZGl0aW9uQ291bnQgPSAwOwoJCQlmb3JlYWNoKCRjcml0ZXJpYSBhcyAkcm93ID0+ICRjcml0ZXJpb24pIHsKCQkJCWlmICgkY3JpdGVyaW9uWyRrZXldID4gJycpIHsKCQkJCQkkdGVzdENvbmRpdGlvbltdID0gJ1s6Jy4kY3JpdGVyaWFOYW1lLiddJy5QSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6Ol9pZkNvbmRpdGlvbigkY3JpdGVyaW9uWyRrZXldKTsKCQkJCQkkdGVzdENvbmRpdGlvbkNvdW50Kys7CgkJCQl9CgkJCX0KCQkJaWYgKCR0ZXN0Q29uZGl0aW9uQ291bnQgPiAxKSB7CgkJCQkkdGVzdENvbmRpdGlvbnNbXSA9ICdPUignLmltcGxvZGUoJywnLCR0ZXN0Q29uZGl0aW9uKS4nKSc7CgkJCQkkdGVzdENvbmRpdGlvbnNDb3VudCsrOwoJCQl9IGVsc2VpZigkdGVzdENvbmRpdGlvbkNvdW50ID09IDEpIHsKCQkJCSR0ZXN0Q29uZGl0aW9uc1tdID0gJHRlc3RDb25kaXRpb25bMF07CgkJCQkkdGVzdENvbmRpdGlvbnNDb3VudCsrOwoJCQl9CgkJfQoKCQlpZiAoJHRlc3RDb25kaXRpb25zQ291bnQgPiAxKSB7CgkJCSR0ZXN0Q29uZGl0aW9uU2V0ID0gJ0FORCgnLmltcGxvZGUoJywnLCR0ZXN0Q29uZGl0aW9ucykuJyknOwoJCX0gZWxzZWlmKCR0ZXN0Q29uZGl0aW9uc0NvdW50ID09IDEpIHsKCQkJJHRlc3RDb25kaXRpb25TZXQgPSAkdGVzdENvbmRpdGlvbnNbMF07CgkJfQoKCQkvLwlMb29wIHRocm91Z2ggZWFjaCByb3cgb2YgdGhlIGRhdGFiYXNlCgkJZm9yZWFjaCgkZGF0YWJhc2UgYXMgJGRhdGFSb3cgPT4gJGRhdGFWYWx1ZXMpIHsKCQkJLy8JU3Vic3RpdHV0ZSBhY3R1YWwgdmFsdWVzIGZyb20gdGhlIGRhdGFiYXNlIHJvdyBmb3Igb3VyIFs6cGxhY2Vob2xkZXJzXQoJCQkkdGVzdENvbmRpdGlvbkxpc3QgPSAkdGVzdENvbmRpdGlvblNldDsKCQkJZm9yZWFjaCgkY3JpdGVyaWFOYW1lcyBhcyAka2V5ID0+ICRjcml0ZXJpYU5hbWUpIHsKCQkJCSRrID0gYXJyYXlfc2VhcmNoKCRjcml0ZXJpYU5hbWUsJGZpZWxkTmFtZXMpOwoJCQkJaWYgKGlzc2V0KCRkYXRhVmFsdWVzWyRrXSkpIHsKCQkJCQkkZGF0YVZhbHVlID0gJGRhdGFWYWx1ZXNbJGtdOwoJCQkJCSRkYXRhVmFsdWUgPSAoaXNfc3RyaW5nKCRkYXRhVmFsdWUpKSA/IFBIUEV4Y2VsX0NhbGN1bGF0aW9uOjpfd3JhcFJlc3VsdChzdHJ0b3VwcGVyKCRkYXRhVmFsdWUpKSA6ICRkYXRhVmFsdWU7CgkJCQkJJHRlc3RDb25kaXRpb25MaXN0ID0gc3RyX3JlcGxhY2UoJ1s6Jy4kY3JpdGVyaWFOYW1lLiddJywkZGF0YVZhbHVlLCR0ZXN0Q29uZGl0aW9uTGlzdCk7CgkJCQl9CgkJCX0KCQkJLy8JZXZhbHVhdGUgdGhlIGNyaXRlcmlhIGFnYWluc3QgdGhlIHJvdyBkYXRhCgkJCSRyZXN1bHQgPSBQSFBFeGNlbF9DYWxjdWxhdGlvbjo6Z2V0SW5zdGFuY2UoKS0+X2NhbGN1bGF0ZUZvcm11bGFWYWx1ZSgnPScuJHRlc3RDb25kaXRpb25MaXN0KTsKCQkJLy8JSWYgdGhlIHJvdyBmYWlsZWQgdG8gbWVldCB0aGUgY3JpdGVyaWEsIHJlbW92ZSBpdCBmcm9tIHRoZSBkYXRhYmFzZQoJCQlpZiAoISRyZXN1bHQpIHsKCQkJCXVuc2V0KCRkYXRhYmFzZVskZGF0YVJvd10pOwoJCQl9CgkJfQoKCQlyZXR1cm4gJGRhdGFiYXNlOwoJfQoKCgkvKioKCSAqIERBVkVSQUdFCgkgKgoJICogQXZlcmFnZXMgdGhlIHZhbHVlcyBpbiBhIGNvbHVtbiBvZiBhIGxpc3Qgb3IgZGF0YWJhc2UgdGhhdCBtYXRjaCBjb25kaXRpb25zIHlvdSBzcGVjaWZ5LgoJICoKCSAqIEV4Y2VsIEZ1bmN0aW9uOgoJICoJCURBVkVSQUdFKGRhdGFiYXNlLGZpZWxkLGNyaXRlcmlhKQoJICoKCSAqIEBhY2Nlc3MJcHVibGljCgkgKiBAY2F0ZWdvcnkgRGF0YWJhc2UgRnVuY3Rpb25zCgkgKiBAcGFyYW0JbWl4ZWRbXQkJCSRkYXRhYmFzZQlUaGUgcmFuZ2Ugb2YgY2VsbHMgdGhhdCBtYWtlcyB1cCB0aGUgbGlzdCBvciBkYXRhYmFzZS4KCSAqCQkJCQkJCQkJCUEgZGF0YWJhc2UgaXMgYSBsaXN0IG9mIHJlbGF0ZWQgZGF0YSBpbiB3aGljaCByb3dzIG9mIHJlbGF0ZWQKCSAqCQkJCQkJCQkJCWluZm9ybWF0aW9uIGFyZSByZWNvcmRzLCBhbmQgY29sdW1ucyBvZiBkYXRhIGFyZSBmaWVsZHMuIFRoZQoJICoJCQkJCQkJCQkJZmlyc3Qgcm93IG9mIHRoZSBsaXN0IGNvbnRhaW5zIGxhYmVscyBmb3IgZWFjaCBjb2x1bW4uCgkgKiBAcGFyYW0Jc3RyaW5nfGludGVnZXIJJGZpZWxkCQlJbmRpY2F0ZXMgd2hpY2ggY29sdW1uIGlzIHVzZWQgaW4gdGhlIGZ1bmN0aW9uLiBFbnRlciB0aGUKCSAqCQkJCQkJCQkJCWNvbHVtbiBsYWJlbCBlbmNsb3NlZCBiZXR3ZWVuIGRvdWJsZSBxdW90YXRpb24gbWFya3MsIHN1Y2ggYXMKCSAqCQkJCQkJCQkJCSJBZ2UiIG9yICJZaWVsZCwiIG9yIGEgbnVtYmVyICh3aXRob3V0IHF1b3RhdGlvbiBtYXJrcykgdGhhdAoJICoJCQkJCQkJCQkJcmVwcmVzZW50cyB0aGUgcG9zaXRpb24gb2YgdGhlIGNvbHVtbiB3aXRoaW4gdGhlIGxpc3Q6IDEgZm9yCgkgKgkJCQkJCQkJCQl0aGUgZmlyc3QgY29sdW1uLCAyIGZvciB0aGUgc2Vjb25kIGNvbHVtbiwgYW5kIHNvIG9uLgoJICogQHBhcmFtCW1peGVkW10JCQkkY3JpdGVyaWEJVGhlIHJhbmdlIG9mIGNlbGxzIHRoYXQgY29udGFpbnMgdGhlIGNvbmRpdGlvbnMgeW91IHNwZWNpZnkuCgkgKgkJCQkJCQkJCQlZb3UgY2FuIHVzZSBhbnkgcmFuZ2UgZm9yIHRoZSBjcml0ZXJpYSBhcmd1bWVudCwgYXMgbG9uZyBhcyBpdAoJICoJCQkJCQkJCQkJaW5jbHVkZXMgYXQgbGVhc3Qgb25lIGNvbHVtbiBsYWJlbCBhbmQgYXQgbGVhc3Qgb25lIGNlbGwgYmVsb3cKCSAqCQkJCQkJCQkJCXRoZSBjb2x1bW4gbGFiZWwgaW4gd2hpY2ggeW91IHNwZWNpZnkgYSBjb25kaXRpb24gZm9yIHRoZQoJICoJCQkJCQkJCQkJY29sdW1uLgoJICogQHJldHVybglmbG9hdAoJICoKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBEQVZFUkFHRSgkZGF0YWJhc2UsJGZpZWxkLCRjcml0ZXJpYSkgewoJCSRmaWVsZCA9IHNlbGY6Ol9fZmllbGRFeHRyYWN0KCRkYXRhYmFzZSwkZmllbGQpOwoJCWlmIChpc19udWxsKCRmaWVsZCkpIHsKCQkJcmV0dXJuIE5VTEw7CgkJfQoJCS8vCXJlZHVjZSB0aGUgZGF0YWJhc2UgdG8gYSBzZXQgb2Ygcm93cyB0aGF0IG1hdGNoIGFsbCB0aGUgY3JpdGVyaWEKCQkkZGF0YWJhc2UgPSBzZWxmOjpfX2ZpbHRlcigkZGF0YWJhc2UsJGNyaXRlcmlhKTsKCQkvLwlleHRyYWN0IGFuIGFycmF5IG9mIHZhbHVlcyBmb3IgdGhlIHJlcXVlc3RlZCBjb2x1bW4KCQkkY29sRGF0YSA9IGFycmF5KCk7CgkJZm9yZWFjaCgkZGF0YWJhc2UgYXMgJHJvdykgewoJCQkkY29sRGF0YVtdID0gJHJvd1skZmllbGRdOwoJCX0KCgkJLy8gUmV0dXJuCgkJcmV0dXJuIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX1N0YXRpc3RpY2FsOjpBVkVSQUdFKCRjb2xEYXRhKTsKCX0JLy8JZnVuY3Rpb24gREFWRVJBR0UoKQoKCgkvKioKCSAqIERDT1VOVAoJICoKCSAqIENvdW50cyB0aGUgY2VsbHMgdGhhdCBjb250YWluIG51bWJlcnMgaW4gYSBjb2x1bW4gb2YgYSBsaXN0IG9yIGRhdGFiYXNlIHRoYXQgbWF0Y2ggY29uZGl0aW9ucwoJICogdGhhdCB5b3Ugc3BlY2lmeS4KCSAqCgkgKiBFeGNlbCBGdW5jdGlvbjoKCSAqCQlEQ09VTlQoZGF0YWJhc2UsW2ZpZWxkXSxjcml0ZXJpYSkKCSAqCgkgKiBFeGNlbCBGdW5jdGlvbjoKCSAqCQlEQVZFUkFHRShkYXRhYmFzZSxmaWVsZCxjcml0ZXJpYSkKCSAqCgkgKiBAYWNjZXNzCXB1YmxpYwoJICogQGNhdGVnb3J5IERhdGFiYXNlIEZ1bmN0aW9ucwoJICogQHBhcmFtCW1peGVkW10JCQkkZGF0YWJhc2UJVGhlIHJhbmdlIG9mIGNlbGxzIHRoYXQgbWFrZXMgdXAgdGhlIGxpc3Qgb3IgZGF0YWJhc2UuCgkgKgkJCQkJCQkJCQlBIGRhdGFiYXNlIGlzIGEgbGlzdCBvZiByZWxhdGVkIGRhdGEgaW4gd2hpY2ggcm93cyBvZiByZWxhdGVkCgkgKgkJCQkJCQkJCQlpbmZvcm1hdGlvbiBhcmUgcmVjb3JkcywgYW5kIGNvbHVtbnMgb2YgZGF0YSBhcmUgZmllbGRzLiBUaGUKCSAqCQkJCQkJCQkJCWZpcnN0IHJvdyBvZiB0aGUgbGlzdCBjb250YWlucyBsYWJlbHMgZm9yIGVhY2ggY29sdW1uLgoJICogQHBhcmFtCXN0cmluZ3xpbnRlZ2VyCSRmaWVsZAkJSW5kaWNhdGVzIHdoaWNoIGNvbHVtbiBpcyB1c2VkIGluIHRoZSBmdW5jdGlvbi4gRW50ZXIgdGhlCgkgKgkJCQkJCQkJCQljb2x1bW4gbGFiZWwgZW5jbG9zZWQgYmV0d2VlbiBkb3VibGUgcXVvdGF0aW9uIG1hcmtzLCBzdWNoIGFzCgkgKgkJCQkJCQkJCQkiQWdlIiBvciAiWWllbGQsIiBvciBhIG51bWJlciAod2l0aG91dCBxdW90YXRpb24gbWFya3MpIHRoYXQKCSAqCQkJCQkJCQkJCXJlcHJlc2VudHMgdGhlIHBvc2l0aW9uIG9mIHRoZSBjb2x1bW4gd2l0aGluIHRoZSBsaXN0OiAxIGZvcgoJICoJCQkJCQkJCQkJdGhlIGZpcnN0IGNvbHVtbiwgMiBmb3IgdGhlIHNlY29uZCBjb2x1bW4sIGFuZCBzbyBvbi4KCSAqIEBwYXJhbQltaXhlZFtdCQkJJGNyaXRlcmlhCVRoZSByYW5nZSBvZiBjZWxscyB0aGF0IGNvbnRhaW5zIHRoZSBjb25kaXRpb25zIHlvdSBzcGVjaWZ5LgoJICoJCQkJCQkJCQkJWW91IGNhbiB1c2UgYW55IHJhbmdlIGZvciB0aGUgY3JpdGVyaWEgYXJndW1lbnQsIGFzIGxvbmcgYXMgaXQKCSAqCQkJCQkJCQkJCWluY2x1ZGVzIGF0IGxlYXN0IG9uZSBjb2x1bW4gbGFiZWwgYW5kIGF0IGxlYXN0IG9uZSBjZWxsIGJlbG93CgkgKgkJCQkJCQkJCQl0aGUgY29sdW1uIGxhYmVsIGluIHdoaWNoIHlvdSBzcGVjaWZ5IGEgY29uZGl0aW9uIGZvciB0aGUKCSAqCQkJCQkJCQkJCWNvbHVtbi4KCSAqIEByZXR1cm4JaW50ZWdlcgoJICoKCSAqIEBUT0RPCVRoZSBmaWVsZCBhcmd1bWVudCBpcyBvcHRpb25hbC4gSWYgZmllbGQgaXMgb21pdHRlZCwgRENPVU5UIGNvdW50cyBhbGwgcmVjb3JkcyBpbiB0aGUKCSAqCQkJZGF0YWJhc2UgdGhhdCBtYXRjaCB0aGUgY3JpdGVyaWEuCgkgKgoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIERDT1VOVCgkZGF0YWJhc2UsJGZpZWxkLCRjcml0ZXJpYSkgewoJCSRmaWVsZCA9IHNlbGY6Ol9fZmllbGRFeHRyYWN0KCRkYXRhYmFzZSwkZmllbGQpOwoJCWlmIChpc19udWxsKCRmaWVsZCkpIHsKCQkJcmV0dXJuIE5VTEw7CgkJfQoKCQkvLwlyZWR1Y2UgdGhlIGRhdGFiYXNlIHRvIGEgc2V0IG9mIHJvd3MgdGhhdCBtYXRjaCBhbGwgdGhlIGNyaXRlcmlhCgkJJGRhdGFiYXNlID0gc2VsZjo6X19maWx0ZXIoJGRhdGFiYXNlLCRjcml0ZXJpYSk7CgkJLy8JZXh0cmFjdCBhbiBhcnJheSBvZiB2YWx1ZXMgZm9yIHRoZSByZXF1ZXN0ZWQgY29sdW1uCgkJJGNvbERhdGEgPSBhcnJheSgpOwoJCWZvcmVhY2goJGRhdGFiYXNlIGFzICRyb3cpIHsKCQkJJGNvbERhdGFbXSA9ICRyb3dbJGZpZWxkXTsKCQl9CgoJCS8vIFJldHVybgoJCXJldHVybiBQSFBFeGNlbF9DYWxjdWxhdGlvbl9TdGF0aXN0aWNhbDo6Q09VTlQoJGNvbERhdGEpOwoJfQkvLwlmdW5jdGlvbiBEQ09VTlQoKQoKCgkvKioKCSAqIERDT1VOVEEKCSAqCgkgKiBDb3VudHMgdGhlIG5vbmJsYW5rIGNlbGxzIGluIGEgY29sdW1uIG9mIGEgbGlzdCBvciBkYXRhYmFzZSB0aGF0IG1hdGNoIGNvbmRpdGlvbnMgdGhhdCB5b3Ugc3BlY2lmeS4KCSAqCgkgKiBFeGNlbCBGdW5jdGlvbjoKCSAqCQlEQ09VTlRBKGRhdGFiYXNlLFtmaWVsZF0sY3JpdGVyaWEpCgkgKgoJICogQGFjY2VzcwlwdWJsaWMKCSAqIEBjYXRlZ29yeSBEYXRhYmFzZSBGdW5jdGlvbnMKCSAqIEBwYXJhbQltaXhlZFtdCQkJJGRhdGFiYXNlCVRoZSByYW5nZSBvZiBjZWxscyB0aGF0IG1ha2VzIHVwIHRoZSBsaXN0IG9yIGRhdGFiYXNlLgoJICoJCQkJCQkJCQkJQSBkYXRhYmFzZSBpcyBhIGxpc3Qgb2YgcmVsYXRlZCBkYXRhIGluIHdoaWNoIHJvd3Mgb2YgcmVsYXRlZAoJICoJCQkJCQkJCQkJaW5mb3JtYXRpb24gYXJlIHJlY29yZHMsIGFuZCBjb2x1bW5zIG9mIGRhdGEgYXJlIGZpZWxkcy4gVGhlCgkgKgkJCQkJCQkJCQlmaXJzdCByb3cgb2YgdGhlIGxpc3QgY29udGFpbnMgbGFiZWxzIGZvciBlYWNoIGNvbHVtbi4KCSAqIEBwYXJhbQlzdHJpbmd8aW50ZWdlcgkkZmllbGQJCUluZGljYXRlcyB3aGljaCBjb2x1bW4gaXMgdXNlZCBpbiB0aGUgZnVuY3Rpb24uIEVudGVyIHRoZQoJICoJCQkJCQkJCQkJY29sdW1uIGxhYmVsIGVuY2xvc2VkIGJldHdlZW4gZG91YmxlIHF1b3RhdGlvbiBtYXJrcywgc3VjaCBhcwoJICoJCQkJCQkJCQkJIkFnZSIgb3IgIllpZWxkLCIgb3IgYSBudW1iZXIgKHdpdGhvdXQgcXVvdGF0aW9uIG1hcmtzKSB0aGF0CgkgKgkJCQkJCQkJCQlyZXByZXNlbnRzIHRoZSBwb3NpdGlvbiBvZiB0aGUgY29sdW1uIHdpdGhpbiB0aGUgbGlzdDogMSBmb3IKCSAqCQkJCQkJCQkJCXRoZSBmaXJzdCBjb2x1bW4sIDIgZm9yIHRoZSBzZWNvbmQgY29sdW1uLCBhbmQgc28gb24uCgkgKiBAcGFyYW0JbWl4ZWRbXQkJCSRjcml0ZXJpYQlUaGUgcmFuZ2Ugb2YgY2VsbHMgdGhhdCBjb250YWlucyB0aGUgY29uZGl0aW9ucyB5b3Ugc3BlY2lmeS4KCSAqCQkJCQkJCQkJCVlvdSBjYW4gdXNlIGFueSByYW5nZSBmb3IgdGhlIGNyaXRlcmlhIGFyZ3VtZW50LCBhcyBsb25nIGFzIGl0CgkgKgkJCQkJCQkJCQlpbmNsdWRlcyBhdCBsZWFzdCBvbmUgY29sdW1uIGxhYmVsIGFuZCBhdCBsZWFzdCBvbmUgY2VsbCBiZWxvdwoJICoJCQkJCQkJCQkJdGhlIGNvbHVtbiBsYWJlbCBpbiB3aGljaCB5b3Ugc3BlY2lmeSBhIGNvbmRpdGlvbiBmb3IgdGhlCgkgKgkJCQkJCQkJCQljb2x1bW4uCgkgKiBAcmV0dXJuCWludGVnZXIKCSAqCgkgKiBAVE9ETwlUaGUgZmllbGQgYXJndW1lbnQgaXMgb3B0aW9uYWwuIElmIGZpZWxkIGlzIG9taXR0ZWQsIERDT1VOVEEgY291bnRzIGFsbCByZWNvcmRzIGluIHRoZQoJICoJCQlkYXRhYmFzZSB0aGF0IG1hdGNoIHRoZSBjcml0ZXJpYS4KCSAqCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gRENPVU5UQSgkZGF0YWJhc2UsJGZpZWxkLCRjcml0ZXJpYSkgewoJCSRmaWVsZCA9IHNlbGY6Ol9fZmllbGRFeHRyYWN0KCRkYXRhYmFzZSwkZmllbGQpOwoJCWlmIChpc19udWxsKCRmaWVsZCkpIHsKCQkJcmV0dXJuIE5VTEw7CgkJfQoKCQkvLwlyZWR1Y2UgdGhlIGRhdGFiYXNlIHRvIGEgc2V0IG9mIHJvd3MgdGhhdCBtYXRjaCBhbGwgdGhlIGNyaXRlcmlhCgkJJGRhdGFiYXNlID0gc2VsZjo6X19maWx0ZXIoJGRhdGFiYXNlLCRjcml0ZXJpYSk7CgkJLy8JZXh0cmFjdCBhbiBhcnJheSBvZiB2YWx1ZXMgZm9yIHRoZSByZXF1ZXN0ZWQgY29sdW1uCgkJJGNvbERhdGEgPSBhcnJheSgpOwoJCWZvcmVhY2goJGRhdGFiYXNlIGFzICRyb3cpIHsKCQkJJGNvbERhdGFbXSA9ICRyb3dbJGZpZWxkXTsKCQl9CgoJCS8vIFJldHVybgoJCXJldHVybiBQSFBFeGNlbF9DYWxjdWxhdGlvbl9TdGF0aXN0aWNhbDo6Q09VTlRBKCRjb2xEYXRhKTsKCX0JLy8JZnVuY3Rpb24gRENPVU5UQSgpCgoKCS8qKgoJICogREdFVAoJICoKCSAqIEV4dHJhY3RzIGEgc2luZ2xlIHZhbHVlIGZyb20gYSBjb2x1bW4gb2YgYSBsaXN0IG9yIGRhdGFiYXNlIHRoYXQgbWF0Y2hlcyBjb25kaXRpb25zIHRoYXQgeW91CgkgKiBzcGVjaWZ5LgoJICoKCSAqIEV4Y2VsIEZ1bmN0aW9uOgoJICoJCURHRVQoZGF0YWJhc2UsZmllbGQsY3JpdGVyaWEpCgkgKgoJICogQGFjY2VzcwlwdWJsaWMKCSAqIEBjYXRlZ29yeSBEYXRhYmFzZSBGdW5jdGlvbnMKCSAqIEBwYXJhbQltaXhlZFtdCQkJJGRhdGFiYXNlCVRoZSByYW5nZSBvZiBjZWxscyB0aGF0IG1ha2VzIHVwIHRoZSBsaXN0IG9yIGRhdGFiYXNlLgoJICoJCQkJCQkJCQkJQSBkYXRhYmFzZSBpcyBhIGxpc3Qgb2YgcmVsYXRlZCBkYXRhIGluIHdoaWNoIHJvd3Mgb2YgcmVsYXRlZAoJICoJCQkJCQkJCQkJaW5mb3JtYXRpb24gYXJlIHJlY29yZHMsIGFuZCBjb2x1bW5zIG9mIGRhdGEgYXJlIGZpZWxkcy4gVGhlCgkgKgkJCQkJCQkJCQlmaXJzdCByb3cgb2YgdGhlIGxpc3QgY29udGFpbnMgbGFiZWxzIGZvciBlYWNoIGNvbHVtbi4KCSAqIEBwYXJhbQlzdHJpbmd8aW50ZWdlcgkkZmllbGQJCUluZGljYXRlcyB3aGljaCBjb2x1bW4gaXMgdXNlZCBpbiB0aGUgZnVuY3Rpb24uIEVudGVyIHRoZQoJICoJCQkJCQkJCQkJY29sdW1uIGxhYmVsIGVuY2xvc2VkIGJldHdlZW4gZG91YmxlIHF1b3RhdGlvbiBtYXJrcywgc3VjaCBhcwoJICoJCQkJCQkJCQkJIkFnZSIgb3IgIllpZWxkLCIgb3IgYSBudW1iZXIgKHdpdGhvdXQgcXVvdGF0aW9uIG1hcmtzKSB0aGF0CgkgKgkJCQkJCQkJCQlyZXByZXNlbnRzIHRoZSBwb3NpdGlvbiBvZiB0aGUgY29sdW1uIHdpdGhpbiB0aGUgbGlzdDogMSBmb3IKCSAqCQkJCQkJCQkJCXRoZSBmaXJzdCBjb2x1bW4sIDIgZm9yIHRoZSBzZWNvbmQgY29sdW1uLCBhbmQgc28gb24uCgkgKiBAcGFyYW0JbWl4ZWRbXQkJCSRjcml0ZXJpYQlUaGUgcmFuZ2Ugb2YgY2VsbHMgdGhhdCBjb250YWlucyB0aGUgY29uZGl0aW9ucyB5b3Ugc3BlY2lmeS4KCSAqCQkJCQkJCQkJCVlvdSBjYW4gdXNlIGFueSByYW5nZSBmb3IgdGhlIGNyaXRlcmlhIGFyZ3VtZW50LCBhcyBsb25nIGFzIGl0CgkgKgkJCQkJCQkJCQlpbmNsdWRlcyBhdCBsZWFzdCBvbmUgY29sdW1uIGxhYmVsIGFuZCBhdCBsZWFzdCBvbmUgY2VsbCBiZWxvdwoJICoJCQkJCQkJCQkJdGhlIGNvbHVtbiBsYWJlbCBpbiB3aGljaCB5b3Ugc3BlY2lmeSBhIGNvbmRpdGlvbiBmb3IgdGhlCgkgKgkJCQkJCQkJCQljb2x1bW4uCgkgKiBAcmV0dXJuCW1peGVkCgkgKgoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIERHRVQoJGRhdGFiYXNlLCRmaWVsZCwkY3JpdGVyaWEpIHsKCQkkZmllbGQgPSBzZWxmOjpfX2ZpZWxkRXh0cmFjdCgkZGF0YWJhc2UsJGZpZWxkKTsKCQlpZiAoaXNfbnVsbCgkZmllbGQpKSB7CgkJCXJldHVybiBOVUxMOwoJCX0KCgkJLy8JcmVkdWNlIHRoZSBkYXRhYmFzZSB0byBhIHNldCBvZiByb3dzIHRoYXQgbWF0Y2ggYWxsIHRoZSBjcml0ZXJpYQoJCSRkYXRhYmFzZSA9IHNlbGY6Ol9fZmlsdGVyKCRkYXRhYmFzZSwkY3JpdGVyaWEpOwoJCS8vCWV4dHJhY3QgYW4gYXJyYXkgb2YgdmFsdWVzIGZvciB0aGUgcmVxdWVzdGVkIGNvbHVtbgoJCSRjb2xEYXRhID0gYXJyYXkoKTsKCQlmb3JlYWNoKCRkYXRhYmFzZSBhcyAkcm93KSB7CgkJCSRjb2xEYXRhW10gPSAkcm93WyRmaWVsZF07CgkJfQoKCQkvLyBSZXR1cm4KCQlpZiAoY291bnQoJGNvbERhdGEpID4gMSkgewoJCQlyZXR1cm4gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpOYU4oKTsKCQl9CgoJCXJldHVybiAkY29sRGF0YVswXTsKCX0JLy8JZnVuY3Rpb24gREdFVCgpCgoKCS8qKgoJICogRE1BWAoJICoKCSAqIFJldHVybnMgdGhlIGxhcmdlc3QgbnVtYmVyIGluIGEgY29sdW1uIG9mIGEgbGlzdCBvciBkYXRhYmFzZSB0aGF0IG1hdGNoZXMgY29uZGl0aW9ucyB5b3UgdGhhdAoJICogc3BlY2lmeS4KCSAqCgkgKiBFeGNlbCBGdW5jdGlvbjoKCSAqCQlETUFYKGRhdGFiYXNlLGZpZWxkLGNyaXRlcmlhKQoJICoKCSAqIEBhY2Nlc3MJcHVibGljCgkgKiBAY2F0ZWdvcnkgRGF0YWJhc2UgRnVuY3Rpb25zCgkgKiBAcGFyYW0JbWl4ZWRbXQkJCSRkYXRhYmFzZQlUaGUgcmFuZ2Ugb2YgY2VsbHMgdGhhdCBtYWtlcyB1cCB0aGUgbGlzdCBvciBkYXRhYmFzZS4KCSAqCQkJCQkJCQkJCUEgZGF0YWJhc2UgaXMgYSBsaXN0IG9mIHJlbGF0ZWQgZGF0YSBpbiB3aGljaCByb3dzIG9mIHJlbGF0ZWQKCSAqCQkJCQkJCQkJCWluZm9ybWF0aW9uIGFyZSByZWNvcmRzLCBhbmQgY29sdW1ucyBvZiBkYXRhIGFyZSBmaWVsZHMuIFRoZQoJICoJCQkJCQkJCQkJZmlyc3Qgcm93IG9mIHRoZSBsaXN0IGNvbnRhaW5zIGxhYmVscyBmb3IgZWFjaCBjb2x1bW4uCgkgKiBAcGFyYW0Jc3RyaW5nfGludGVnZXIJJGZpZWxkCQlJbmRpY2F0ZXMgd2hpY2ggY29sdW1uIGlzIHVzZWQgaW4gdGhlIGZ1bmN0aW9uLiBFbnRlciB0aGUKCSAqCQkJCQkJCQkJCWNvbHVtbiBsYWJlbCBlbmNsb3NlZCBiZXR3ZWVuIGRvdWJsZSBxdW90YXRpb24gbWFya3MsIHN1Y2ggYXMKCSAqCQkJCQkJCQkJCSJBZ2UiIG9yICJZaWVsZCwiIG9yIGEgbnVtYmVyICh3aXRob3V0IHF1b3RhdGlvbiBtYXJrcykgdGhhdAoJICoJCQkJCQkJCQkJcmVwcmVzZW50cyB0aGUgcG9zaXRpb24gb2YgdGhlIGNvbHVtbiB3aXRoaW4gdGhlIGxpc3Q6IDEgZm9yCgkgKgkJCQkJCQkJCQl0aGUgZmlyc3QgY29sdW1uLCAyIGZvciB0aGUgc2Vjb25kIGNvbHVtbiwgYW5kIHNvIG9uLgoJICogQHBhcmFtCW1peGVkW10JCQkkY3JpdGVyaWEJVGhlIHJhbmdlIG9mIGNlbGxzIHRoYXQgY29udGFpbnMgdGhlIGNvbmRpdGlvbnMgeW91IHNwZWNpZnkuCgkgKgkJCQkJCQkJCQlZb3UgY2FuIHVzZSBhbnkgcmFuZ2UgZm9yIHRoZSBjcml0ZXJpYSBhcmd1bWVudCwgYXMgbG9uZyBhcyBpdAoJICoJCQkJCQkJCQkJaW5jbHVkZXMgYXQgbGVhc3Qgb25lIGNvbHVtbiBsYWJlbCBhbmQgYXQgbGVhc3Qgb25lIGNlbGwgYmVsb3cKCSAqCQkJCQkJCQkJCXRoZSBjb2x1bW4gbGFiZWwgaW4gd2hpY2ggeW91IHNwZWNpZnkgYSBjb25kaXRpb24gZm9yIHRoZQoJICoJCQkJCQkJCQkJY29sdW1uLgoJICogQHJldHVybglmbG9hdAoJICoKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBETUFYKCRkYXRhYmFzZSwkZmllbGQsJGNyaXRlcmlhKSB7CgkJJGZpZWxkID0gc2VsZjo6X19maWVsZEV4dHJhY3QoJGRhdGFiYXNlLCRmaWVsZCk7CgkJaWYgKGlzX251bGwoJGZpZWxkKSkgewoJCQlyZXR1cm4gTlVMTDsKCQl9CgoJCS8vCXJlZHVjZSB0aGUgZGF0YWJhc2UgdG8gYSBzZXQgb2Ygcm93cyB0aGF0IG1hdGNoIGFsbCB0aGUgY3JpdGVyaWEKCQkkZGF0YWJhc2UgPSBzZWxmOjpfX2ZpbHRlcigkZGF0YWJhc2UsJGNyaXRlcmlhKTsKCQkvLwlleHRyYWN0IGFuIGFycmF5IG9mIHZhbHVlcyBmb3IgdGhlIHJlcXVlc3RlZCBjb2x1bW4KCQkkY29sRGF0YSA9IGFycmF5KCk7CgkJZm9yZWFjaCgkZGF0YWJhc2UgYXMgJHJvdykgewoJCQkkY29sRGF0YVtdID0gJHJvd1skZmllbGRdOwoJCX0KCgkJLy8gUmV0dXJuCgkJcmV0dXJuIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX1N0YXRpc3RpY2FsOjpNQVgoJGNvbERhdGEpOwoJfQkvLwlmdW5jdGlvbiBETUFYKCkKCgoJLyoqCgkgKiBETUlOCgkgKgoJICogUmV0dXJucyB0aGUgc21hbGxlc3QgbnVtYmVyIGluIGEgY29sdW1uIG9mIGEgbGlzdCBvciBkYXRhYmFzZSB0aGF0IG1hdGNoZXMgY29uZGl0aW9ucyB5b3UgdGhhdAoJICogc3BlY2lmeS4KCSAqCgkgKiBFeGNlbCBGdW5jdGlvbjoKCSAqCQlETUlOKGRhdGFiYXNlLGZpZWxkLGNyaXRlcmlhKQoJICoKCSAqIEBhY2Nlc3MJcHVibGljCgkgKiBAY2F0ZWdvcnkgRGF0YWJhc2UgRnVuY3Rpb25zCgkgKiBAcGFyYW0JbWl4ZWRbXQkJCSRkYXRhYmFzZQlUaGUgcmFuZ2Ugb2YgY2VsbHMgdGhhdCBtYWtlcyB1cCB0aGUgbGlzdCBvciBkYXRhYmFzZS4KCSAqCQkJCQkJCQkJCUEgZGF0YWJhc2UgaXMgYSBsaXN0IG9mIHJlbGF0ZWQgZGF0YSBpbiB3aGljaCByb3dzIG9mIHJlbGF0ZWQKCSAqCQkJCQkJCQkJCWluZm9ybWF0aW9uIGFyZSByZWNvcmRzLCBhbmQgY29sdW1ucyBvZiBkYXRhIGFyZSBmaWVsZHMuIFRoZQoJICoJCQkJCQkJCQkJZmlyc3Qgcm93IG9mIHRoZSBsaXN0IGNvbnRhaW5zIGxhYmVscyBmb3IgZWFjaCBjb2x1bW4uCgkgKiBAcGFyYW0Jc3RyaW5nfGludGVnZXIJJGZpZWxkCQlJbmRpY2F0ZXMgd2hpY2ggY29sdW1uIGlzIHVzZWQgaW4gdGhlIGZ1bmN0aW9uLiBFbnRlciB0aGUKCSAqCQkJCQkJCQkJCWNvbHVtbiBsYWJlbCBlbmNsb3NlZCBiZXR3ZWVuIGRvdWJsZSBxdW90YXRpb24gbWFya3MsIHN1Y2ggYXMKCSAqCQkJCQkJCQkJCSJBZ2UiIG9yICJZaWVsZCwiIG9yIGEgbnVtYmVyICh3aXRob3V0IHF1b3RhdGlvbiBtYXJrcykgdGhhdAoJICoJCQkJCQkJCQkJcmVwcmVzZW50cyB0aGUgcG9zaXRpb24gb2YgdGhlIGNvbHVtbiB3aXRoaW4gdGhlIGxpc3Q6IDEgZm9yCgkgKgkJCQkJCQkJCQl0aGUgZmlyc3QgY29sdW1uLCAyIGZvciB0aGUgc2Vjb25kIGNvbHVtbiwgYW5kIHNvIG9uLgoJICogQHBhcmFtCW1peGVkW10JCQkkY3JpdGVyaWEJVGhlIHJhbmdlIG9mIGNlbGxzIHRoYXQgY29udGFpbnMgdGhlIGNvbmRpdGlvbnMgeW91IHNwZWNpZnkuCgkgKgkJCQkJCQkJCQlZb3UgY2FuIHVzZSBhbnkgcmFuZ2UgZm9yIHRoZSBjcml0ZXJpYSBhcmd1bWVudCwgYXMgbG9uZyBhcyBpdAoJICoJCQkJCQkJCQkJaW5jbHVkZXMgYXQgbGVhc3Qgb25lIGNvbHVtbiBsYWJlbCBhbmQgYXQgbGVhc3Qgb25lIGNlbGwgYmVsb3cKCSAqCQkJCQkJCQkJCXRoZSBjb2x1bW4gbGFiZWwgaW4gd2hpY2ggeW91IHNwZWNpZnkgYSBjb25kaXRpb24gZm9yIHRoZQoJICoJCQkJCQkJCQkJY29sdW1uLgoJICogQHJldHVybglmbG9hdAoJICoKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBETUlOKCRkYXRhYmFzZSwkZmllbGQsJGNyaXRlcmlhKSB7CgkJJGZpZWxkID0gc2VsZjo6X19maWVsZEV4dHJhY3QoJGRhdGFiYXNlLCRmaWVsZCk7CgkJaWYgKGlzX251bGwoJGZpZWxkKSkgewoJCQlyZXR1cm4gTlVMTDsKCQl9CgoJCS8vCXJlZHVjZSB0aGUgZGF0YWJhc2UgdG8gYSBzZXQgb2Ygcm93cyB0aGF0IG1hdGNoIGFsbCB0aGUgY3JpdGVyaWEKCQkkZGF0YWJhc2UgPSBzZWxmOjpfX2ZpbHRlcigkZGF0YWJhc2UsJGNyaXRlcmlhKTsKCQkvLwlleHRyYWN0IGFuIGFycmF5IG9mIHZhbHVlcyBmb3IgdGhlIHJlcXVlc3RlZCBjb2x1bW4KCQkkY29sRGF0YSA9IGFycmF5KCk7CgkJZm9yZWFjaCgkZGF0YWJhc2UgYXMgJHJvdykgewoJCQkkY29sRGF0YVtdID0gJHJvd1skZmllbGRdOwoJCX0KCgkJLy8gUmV0dXJuCgkJcmV0dXJuIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX1N0YXRpc3RpY2FsOjpNSU4oJGNvbERhdGEpOwoJfQkvLwlmdW5jdGlvbiBETUlOKCkKCgoJLyoqCgkgKiBEUFJPRFVDVAoJICoKCSAqIE11bHRpcGxpZXMgdGhlIHZhbHVlcyBpbiBhIGNvbHVtbiBvZiBhIGxpc3Qgb3IgZGF0YWJhc2UgdGhhdCBtYXRjaCBjb25kaXRpb25zIHRoYXQgeW91IHNwZWNpZnkuCgkgKgoJICogRXhjZWwgRnVuY3Rpb246CgkgKgkJRFBST0RVQ1QoZGF0YWJhc2UsZmllbGQsY3JpdGVyaWEpCgkgKgoJICogQGFjY2VzcwlwdWJsaWMKCSAqIEBjYXRlZ29yeSBEYXRhYmFzZSBGdW5jdGlvbnMKCSAqIEBwYXJhbQltaXhlZFtdCQkJJGRhdGFiYXNlCVRoZSByYW5nZSBvZiBjZWxscyB0aGF0IG1ha2VzIHVwIHRoZSBsaXN0IG9yIGRhdGFiYXNlLgoJICoJCQkJCQkJCQkJQSBkYXRhYmFzZSBpcyBhIGxpc3Qgb2YgcmVsYXRlZCBkYXRhIGluIHdoaWNoIHJvd3Mgb2YgcmVsYXRlZAoJICoJCQkJCQkJCQkJaW5mb3JtYXRpb24gYXJlIHJlY29yZHMsIGFuZCBjb2x1bW5zIG9mIGRhdGEgYXJlIGZpZWxkcy4gVGhlCgkgKgkJCQkJCQkJCQlmaXJzdCByb3cgb2YgdGhlIGxpc3QgY29udGFpbnMgbGFiZWxzIGZvciBlYWNoIGNvbHVtbi4KCSAqIEBwYXJhbQlzdHJpbmd8aW50ZWdlcgkkZmllbGQJCUluZGljYXRlcyB3aGljaCBjb2x1bW4gaXMgdXNlZCBpbiB0aGUgZnVuY3Rpb24uIEVudGVyIHRoZQoJICoJCQkJCQkJCQkJY29sdW1uIGxhYmVsIGVuY2xvc2VkIGJldHdlZW4gZG91YmxlIHF1b3RhdGlvbiBtYXJrcywgc3VjaCBhcwoJICoJCQkJCQkJCQkJIkFnZSIgb3IgIllpZWxkLCIgb3IgYSBudW1iZXIgKHdpdGhvdXQgcXVvdGF0aW9uIG1hcmtzKSB0aGF0CgkgKgkJCQkJCQkJCQlyZXByZXNlbnRzIHRoZSBwb3NpdGlvbiBvZiB0aGUgY29sdW1uIHdpdGhpbiB0aGUgbGlzdDogMSBmb3IKCSAqCQkJCQkJCQkJCXRoZSBmaXJzdCBjb2x1bW4sIDIgZm9yIHRoZSBzZWNvbmQgY29sdW1uLCBhbmQgc28gb24uCgkgKiBAcGFyYW0JbWl4ZWRbXQkJCSRjcml0ZXJpYQlUaGUgcmFuZ2Ugb2YgY2VsbHMgdGhhdCBjb250YWlucyB0aGUgY29uZGl0aW9ucyB5b3Ugc3BlY2lmeS4KCSAqCQkJCQkJCQkJCVlvdSBjYW4gdXNlIGFueSByYW5nZSBmb3IgdGhlIGNyaXRlcmlhIGFyZ3VtZW50LCBhcyBsb25nIGFzIGl0CgkgKgkJCQkJCQkJCQlpbmNsdWRlcyBhdCBsZWFzdCBvbmUgY29sdW1uIGxhYmVsIGFuZCBhdCBsZWFzdCBvbmUgY2VsbCBiZWxvdwoJICoJCQkJCQkJCQkJdGhlIGNvbHVtbiBsYWJlbCBpbiB3aGljaCB5b3Ugc3BlY2lmeSBhIGNvbmRpdGlvbiBmb3IgdGhlCgkgKgkJCQkJCQkJCQljb2x1bW4uCgkgKiBAcmV0dXJuCWZsb2F0CgkgKgoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIERQUk9EVUNUKCRkYXRhYmFzZSwkZmllbGQsJGNyaXRlcmlhKSB7CgkJJGZpZWxkID0gc2VsZjo6X19maWVsZEV4dHJhY3QoJGRhdGFiYXNlLCRmaWVsZCk7CgkJaWYgKGlzX251bGwoJGZpZWxkKSkgewoJCQlyZXR1cm4gTlVMTDsKCQl9CgoJCS8vCXJlZHVjZSB0aGUgZGF0YWJhc2UgdG8gYSBzZXQgb2Ygcm93cyB0aGF0IG1hdGNoIGFsbCB0aGUgY3JpdGVyaWEKCQkkZGF0YWJhc2UgPSBzZWxmOjpfX2ZpbHRlcigkZGF0YWJhc2UsJGNyaXRlcmlhKTsKCQkvLwlleHRyYWN0IGFuIGFycmF5IG9mIHZhbHVlcyBmb3IgdGhlIHJlcXVlc3RlZCBjb2x1bW4KCQkkY29sRGF0YSA9IGFycmF5KCk7CgkJZm9yZWFjaCgkZGF0YWJhc2UgYXMgJHJvdykgewoJCQkkY29sRGF0YVtdID0gJHJvd1skZmllbGRdOwoJCX0KCgkJLy8gUmV0dXJuCgkJcmV0dXJuIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX01hdGhUcmlnOjpQUk9EVUNUKCRjb2xEYXRhKTsKCX0JLy8JZnVuY3Rpb24gRFBST0RVQ1QoKQoKCgkvKioKCSAqIERTVERFVgoJICoKCSAqIEVzdGltYXRlcyB0aGUgc3RhbmRhcmQgZGV2aWF0aW9uIG9mIGEgcG9wdWxhdGlvbiBiYXNlZCBvbiBhIHNhbXBsZSBieSB1c2luZyB0aGUgbnVtYmVycyBpbiBhCgkgKiBjb2x1bW4gb2YgYSBsaXN0IG9yIGRhdGFiYXNlIHRoYXQgbWF0Y2ggY29uZGl0aW9ucyB0aGF0IHlvdSBzcGVjaWZ5LgoJICoKCSAqIEV4Y2VsIEZ1bmN0aW9uOgoJICoJCURTVERFVihkYXRhYmFzZSxmaWVsZCxjcml0ZXJpYSkKCSAqCgkgKiBAYWNjZXNzCXB1YmxpYwoJICogQGNhdGVnb3J5IERhdGFiYXNlIEZ1bmN0aW9ucwoJICogQHBhcmFtCW1peGVkW10JCQkkZGF0YWJhc2UJVGhlIHJhbmdlIG9mIGNlbGxzIHRoYXQgbWFrZXMgdXAgdGhlIGxpc3Qgb3IgZGF0YWJhc2UuCgkgKgkJCQkJCQkJCQlBIGRhdGFiYXNlIGlzIGEgbGlzdCBvZiByZWxhdGVkIGRhdGEgaW4gd2hpY2ggcm93cyBvZiByZWxhdGVkCgkgKgkJCQkJCQkJCQlpbmZvcm1hdGlvbiBhcmUgcmVjb3JkcywgYW5kIGNvbHVtbnMgb2YgZGF0YSBhcmUgZmllbGRzLiBUaGUKCSAqCQkJCQkJCQkJCWZpcnN0IHJvdyBvZiB0aGUgbGlzdCBjb250YWlucyBsYWJlbHMgZm9yIGVhY2ggY29sdW1uLgoJICogQHBhcmFtCXN0cmluZ3xpbnRlZ2VyCSRmaWVsZAkJSW5kaWNhdGVzIHdoaWNoIGNvbHVtbiBpcyB1c2VkIGluIHRoZSBmdW5jdGlvbi4gRW50ZXIgdGhlCgkgKgkJCQkJCQkJCQljb2x1bW4gbGFiZWwgZW5jbG9zZWQgYmV0d2VlbiBkb3VibGUgcXVvdGF0aW9uIG1hcmtzLCBzdWNoIGFzCgkgKgkJCQkJCQkJCQkiQWdlIiBvciAiWWllbGQsIiBvciBhIG51bWJlciAod2l0aG91dCBxdW90YXRpb24gbWFya3MpIHRoYXQKCSAqCQkJCQkJCQkJCXJlcHJlc2VudHMgdGhlIHBvc2l0aW9uIG9mIHRoZSBjb2x1bW4gd2l0aGluIHRoZSBsaXN0OiAxIGZvcgoJICoJCQkJCQkJCQkJdGhlIGZpcnN0IGNvbHVtbiwgMiBmb3IgdGhlIHNlY29uZCBjb2x1bW4sIGFuZCBzbyBvbi4KCSAqIEBwYXJhbQltaXhlZFtdCQkJJGNyaXRlcmlhCVRoZSByYW5nZSBvZiBjZWxscyB0aGF0IGNvbnRhaW5zIHRoZSBjb25kaXRpb25zIHlvdSBzcGVjaWZ5LgoJICoJCQkJCQkJCQkJWW91IGNhbiB1c2UgYW55IHJhbmdlIGZvciB0aGUgY3JpdGVyaWEgYXJndW1lbnQsIGFzIGxvbmcgYXMgaXQKCSAqCQkJCQkJCQkJCWluY2x1ZGVzIGF0IGxlYXN0IG9uZSBjb2x1bW4gbGFiZWwgYW5kIGF0IGxlYXN0IG9uZSBjZWxsIGJlbG93CgkgKgkJCQkJCQkJCQl0aGUgY29sdW1uIGxhYmVsIGluIHdoaWNoIHlvdSBzcGVjaWZ5IGEgY29uZGl0aW9uIGZvciB0aGUKCSAqCQkJCQkJCQkJCWNvbHVtbi4KCSAqIEByZXR1cm4JZmxvYXQKCSAqCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gRFNUREVWKCRkYXRhYmFzZSwkZmllbGQsJGNyaXRlcmlhKSB7CgkJJGZpZWxkID0gc2VsZjo6X19maWVsZEV4dHJhY3QoJGRhdGFiYXNlLCRmaWVsZCk7CgkJaWYgKGlzX251bGwoJGZpZWxkKSkgewoJCQlyZXR1cm4gTlVMTDsKCQl9CgoJCS8vCXJlZHVjZSB0aGUgZGF0YWJhc2UgdG8gYSBzZXQgb2Ygcm93cyB0aGF0IG1hdGNoIGFsbCB0aGUgY3JpdGVyaWEKCQkkZGF0YWJhc2UgPSBzZWxmOjpfX2ZpbHRlcigkZGF0YWJhc2UsJGNyaXRlcmlhKTsKCQkvLwlleHRyYWN0IGFuIGFycmF5IG9mIHZhbHVlcyBmb3IgdGhlIHJlcXVlc3RlZCBjb2x1bW4KCQkkY29sRGF0YSA9IGFycmF5KCk7CgkJZm9yZWFjaCgkZGF0YWJhc2UgYXMgJHJvdykgewoJCQkkY29sRGF0YVtdID0gJHJvd1skZmllbGRdOwoJCX0KCgkJLy8gUmV0dXJuCgkJcmV0dXJuIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX1N0YXRpc3RpY2FsOjpTVERFVigkY29sRGF0YSk7Cgl9CS8vCWZ1bmN0aW9uIERTVERFVigpCgoKCS8qKgoJICogRFNUREVWUAoJICoKCSAqIENhbGN1bGF0ZXMgdGhlIHN0YW5kYXJkIGRldmlhdGlvbiBvZiBhIHBvcHVsYXRpb24gYmFzZWQgb24gdGhlIGVudGlyZSBwb3B1bGF0aW9uIGJ5IHVzaW5nIHRoZQoJICogbnVtYmVycyBpbiBhIGNvbHVtbiBvZiBhIGxpc3Qgb3IgZGF0YWJhc2UgdGhhdCBtYXRjaCBjb25kaXRpb25zIHRoYXQgeW91IHNwZWNpZnkuCgkgKgoJICogRXhjZWwgRnVuY3Rpb246CgkgKgkJRFNUREVWUChkYXRhYmFzZSxmaWVsZCxjcml0ZXJpYSkKCSAqCgkgKiBAYWNjZXNzCXB1YmxpYwoJICogQGNhdGVnb3J5IERhdGFiYXNlIEZ1bmN0aW9ucwoJICogQHBhcmFtCW1peGVkW10JCQkkZGF0YWJhc2UJVGhlIHJhbmdlIG9mIGNlbGxzIHRoYXQgbWFrZXMgdXAgdGhlIGxpc3Qgb3IgZGF0YWJhc2UuCgkgKgkJCQkJCQkJCQlBIGRhdGFiYXNlIGlzIGEgbGlzdCBvZiByZWxhdGVkIGRhdGEgaW4gd2hpY2ggcm93cyBvZiByZWxhdGVkCgkgKgkJCQkJCQkJCQlpbmZvcm1hdGlvbiBhcmUgcmVjb3JkcywgYW5kIGNvbHVtbnMgb2YgZGF0YSBhcmUgZmllbGRzLiBUaGUKCSAqCQkJCQkJCQkJCWZpcnN0IHJvdyBvZiB0aGUgbGlzdCBjb250YWlucyBsYWJlbHMgZm9yIGVhY2ggY29sdW1uLgoJICogQHBhcmFtCXN0cmluZ3xpbnRlZ2VyCSRmaWVsZAkJSW5kaWNhdGVzIHdoaWNoIGNvbHVtbiBpcyB1c2VkIGluIHRoZSBmdW5jdGlvbi4gRW50ZXIgdGhlCgkgKgkJCQkJCQkJCQljb2x1bW4gbGFiZWwgZW5jbG9zZWQgYmV0d2VlbiBkb3VibGUgcXVvdGF0aW9uIG1hcmtzLCBzdWNoIGFzCgkgKgkJCQkJCQkJCQkiQWdlIiBvciAiWWllbGQsIiBvciBhIG51bWJlciAod2l0aG91dCBxdW90YXRpb24gbWFya3MpIHRoYXQKCSAqCQkJCQkJCQkJCXJlcHJlc2VudHMgdGhlIHBvc2l0aW9uIG9mIHRoZSBjb2x1bW4gd2l0aGluIHRoZSBsaXN0OiAxIGZvcgoJICoJCQkJCQkJCQkJdGhlIGZpcnN0IGNvbHVtbiwgMiBmb3IgdGhlIHNlY29uZCBjb2x1bW4sIGFuZCBzbyBvbi4KCSAqIEBwYXJhbQltaXhlZFtdCQkJJGNyaXRlcmlhCVRoZSByYW5nZSBvZiBjZWxscyB0aGF0IGNvbnRhaW5zIHRoZSBjb25kaXRpb25zIHlvdSBzcGVjaWZ5LgoJICoJCQkJCQkJCQkJWW91IGNhbiB1c2UgYW55IHJhbmdlIGZvciB0aGUgY3JpdGVyaWEgYXJndW1lbnQsIGFzIGxvbmcgYXMgaXQKCSAqCQkJCQkJCQkJCWluY2x1ZGVzIGF0IGxlYXN0IG9uZSBjb2x1bW4gbGFiZWwgYW5kIGF0IGxlYXN0IG9uZSBjZWxsIGJlbG93CgkgKgkJCQkJCQkJCQl0aGUgY29sdW1uIGxhYmVsIGluIHdoaWNoIHlvdSBzcGVjaWZ5IGEgY29uZGl0aW9uIGZvciB0aGUKCSAqCQkJCQkJCQkJCWNvbHVtbi4KCSAqIEByZXR1cm4JZmxvYXQKCSAqCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gRFNUREVWUCgkZGF0YWJhc2UsJGZpZWxkLCRjcml0ZXJpYSkgewoJCSRmaWVsZCA9IHNlbGY6Ol9fZmllbGRFeHRyYWN0KCRkYXRhYmFzZSwkZmllbGQpOwoJCWlmIChpc19udWxsKCRmaWVsZCkpIHsKCQkJcmV0dXJuIE5VTEw7CgkJfQoKCQkvLwlyZWR1Y2UgdGhlIGRhdGFiYXNlIHRvIGEgc2V0IG9mIHJvd3MgdGhhdCBtYXRjaCBhbGwgdGhlIGNyaXRlcmlhCgkJJGRhdGFiYXNlID0gc2VsZjo6X19maWx0ZXIoJGRhdGFiYXNlLCRjcml0ZXJpYSk7CgkJLy8JZXh0cmFjdCBhbiBhcnJheSBvZiB2YWx1ZXMgZm9yIHRoZSByZXF1ZXN0ZWQgY29sdW1uCgkJJGNvbERhdGEgPSBhcnJheSgpOwoJCWZvcmVhY2goJGRhdGFiYXNlIGFzICRyb3cpIHsKCQkJJGNvbERhdGFbXSA9ICRyb3dbJGZpZWxkXTsKCQl9CgoJCS8vIFJldHVybgoJCXJldHVybiBQSFBFeGNlbF9DYWxjdWxhdGlvbl9TdGF0aXN0aWNhbDo6U1RERVZQKCRjb2xEYXRhKTsKCX0JLy8JZnVuY3Rpb24gRFNUREVWUCgpCgoKCS8qKgoJICogRFNVTQoJICoKCSAqIEFkZHMgdGhlIG51bWJlcnMgaW4gYSBjb2x1bW4gb2YgYSBsaXN0IG9yIGRhdGFiYXNlIHRoYXQgbWF0Y2ggY29uZGl0aW9ucyB0aGF0IHlvdSBzcGVjaWZ5LgoJICoKCSAqIEV4Y2VsIEZ1bmN0aW9uOgoJICoJCURTVU0oZGF0YWJhc2UsZmllbGQsY3JpdGVyaWEpCgkgKgoJICogQGFjY2VzcwlwdWJsaWMKCSAqIEBjYXRlZ29yeSBEYXRhYmFzZSBGdW5jdGlvbnMKCSAqIEBwYXJhbQltaXhlZFtdCQkJJGRhdGFiYXNlCVRoZSByYW5nZSBvZiBjZWxscyB0aGF0IG1ha2VzIHVwIHRoZSBsaXN0IG9yIGRhdGFiYXNlLgoJICoJCQkJCQkJCQkJQSBkYXRhYmFzZSBpcyBhIGxpc3Qgb2YgcmVsYXRlZCBkYXRhIGluIHdoaWNoIHJvd3Mgb2YgcmVsYXRlZAoJICoJCQkJCQkJCQkJaW5mb3JtYXRpb24gYXJlIHJlY29yZHMsIGFuZCBjb2x1bW5zIG9mIGRhdGEgYXJlIGZpZWxkcy4gVGhlCgkgKgkJCQkJCQkJCQlmaXJzdCByb3cgb2YgdGhlIGxpc3QgY29udGFpbnMgbGFiZWxzIGZvciBlYWNoIGNvbHVtbi4KCSAqIEBwYXJhbQlzdHJpbmd8aW50ZWdlcgkkZmllbGQJCUluZGljYXRlcyB3aGljaCBjb2x1bW4gaXMgdXNlZCBpbiB0aGUgZnVuY3Rpb24uIEVudGVyIHRoZQoJICoJCQkJCQkJCQkJY29sdW1uIGxhYmVsIGVuY2xvc2VkIGJldHdlZW4gZG91YmxlIHF1b3RhdGlvbiBtYXJrcywgc3VjaCBhcwoJICoJCQkJCQkJCQkJIkFnZSIgb3IgIllpZWxkLCIgb3IgYSBudW1iZXIgKHdpdGhvdXQgcXVvdGF0aW9uIG1hcmtzKSB0aGF0CgkgKgkJCQkJCQkJCQlyZXByZXNlbnRzIHRoZSBwb3NpdGlvbiBvZiB0aGUgY29sdW1uIHdpdGhpbiB0aGUgbGlzdDogMSBmb3IKCSAqCQkJCQkJCQkJCXRoZSBmaXJzdCBjb2x1bW4sIDIgZm9yIHRoZSBzZWNvbmQgY29sdW1uLCBhbmQgc28gb24uCgkgKiBAcGFyYW0JbWl4ZWRbXQkJCSRjcml0ZXJpYQlUaGUgcmFuZ2Ugb2YgY2VsbHMgdGhhdCBjb250YWlucyB0aGUgY29uZGl0aW9ucyB5b3Ugc3BlY2lmeS4KCSAqCQkJCQkJCQkJCVlvdSBjYW4gdXNlIGFueSByYW5nZSBmb3IgdGhlIGNyaXRlcmlhIGFyZ3VtZW50LCBhcyBsb25nIGFzIGl0CgkgKgkJCQkJCQkJCQlpbmNsdWRlcyBhdCBsZWFzdCBvbmUgY29sdW1uIGxhYmVsIGFuZCBhdCBsZWFzdCBvbmUgY2VsbCBiZWxvdwoJICoJCQkJCQkJCQkJdGhlIGNvbHVtbiBsYWJlbCBpbiB3aGljaCB5b3Ugc3BlY2lmeSBhIGNvbmRpdGlvbiBmb3IgdGhlCgkgKgkJCQkJCQkJCQljb2x1bW4uCgkgKiBAcmV0dXJuCWZsb2F0CgkgKgoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIERTVU0oJGRhdGFiYXNlLCRmaWVsZCwkY3JpdGVyaWEpIHsKCQkkZmllbGQgPSBzZWxmOjpfX2ZpZWxkRXh0cmFjdCgkZGF0YWJhc2UsJGZpZWxkKTsKCQlpZiAoaXNfbnVsbCgkZmllbGQpKSB7CgkJCXJldHVybiBOVUxMOwoJCX0KCgkJLy8JcmVkdWNlIHRoZSBkYXRhYmFzZSB0byBhIHNldCBvZiByb3dzIHRoYXQgbWF0Y2ggYWxsIHRoZSBjcml0ZXJpYQoJCSRkYXRhYmFzZSA9IHNlbGY6Ol9fZmlsdGVyKCRkYXRhYmFzZSwkY3JpdGVyaWEpOwoJCS8vCWV4dHJhY3QgYW4gYXJyYXkgb2YgdmFsdWVzIGZvciB0aGUgcmVxdWVzdGVkIGNvbHVtbgoJCSRjb2xEYXRhID0gYXJyYXkoKTsKCQlmb3JlYWNoKCRkYXRhYmFzZSBhcyAkcm93KSB7CgkJCSRjb2xEYXRhW10gPSAkcm93WyRmaWVsZF07CgkJfQoKCQkvLyBSZXR1cm4KCQlyZXR1cm4gUEhQRXhjZWxfQ2FsY3VsYXRpb25fTWF0aFRyaWc6OlNVTSgkY29sRGF0YSk7Cgl9CS8vCWZ1bmN0aW9uIERTVU0oKQoKCgkvKioKCSAqIERWQVIKCSAqCgkgKiBFc3RpbWF0ZXMgdGhlIHZhcmlhbmNlIG9mIGEgcG9wdWxhdGlvbiBiYXNlZCBvbiBhIHNhbXBsZSBieSB1c2luZyB0aGUgbnVtYmVycyBpbiBhIGNvbHVtbgoJICogb2YgYSBsaXN0IG9yIGRhdGFiYXNlIHRoYXQgbWF0Y2ggY29uZGl0aW9ucyB0aGF0IHlvdSBzcGVjaWZ5LgoJICoKCSAqIEV4Y2VsIEZ1bmN0aW9uOgoJICoJCURWQVIoZGF0YWJhc2UsZmllbGQsY3JpdGVyaWEpCgkgKgoJICogQGFjY2VzcwlwdWJsaWMKCSAqIEBjYXRlZ29yeSBEYXRhYmFzZSBGdW5jdGlvbnMKCSAqIEBwYXJhbQltaXhlZFtdCQkJJGRhdGFiYXNlCVRoZSByYW5nZSBvZiBjZWxscyB0aGF0IG1ha2VzIHVwIHRoZSBsaXN0IG9yIGRhdGFiYXNlLgoJICoJCQkJCQkJCQkJQSBkYXRhYmFzZSBpcyBhIGxpc3Qgb2YgcmVsYXRlZCBkYXRhIGluIHdoaWNoIHJvd3Mgb2YgcmVsYXRlZAoJICoJCQkJCQkJCQkJaW5mb3JtYXRpb24gYXJlIHJlY29yZHMsIGFuZCBjb2x1bW5zIG9mIGRhdGEgYXJlIGZpZWxkcy4gVGhlCgkgKgkJCQkJCQkJCQlmaXJzdCByb3cgb2YgdGhlIGxpc3QgY29udGFpbnMgbGFiZWxzIGZvciBlYWNoIGNvbHVtbi4KCSAqIEBwYXJhbQlzdHJpbmd8aW50ZWdlcgkkZmllbGQJCUluZGljYXRlcyB3aGljaCBjb2x1bW4gaXMgdXNlZCBpbiB0aGUgZnVuY3Rpb24uIEVudGVyIHRoZQoJICoJCQkJCQkJCQkJY29sdW1uIGxhYmVsIGVuY2xvc2VkIGJldHdlZW4gZG91YmxlIHF1b3RhdGlvbiBtYXJrcywgc3VjaCBhcwoJICoJCQkJCQkJCQkJIkFnZSIgb3IgIllpZWxkLCIgb3IgYSBudW1iZXIgKHdpdGhvdXQgcXVvdGF0aW9uIG1hcmtzKSB0aGF0CgkgKgkJCQkJCQkJCQlyZXByZXNlbnRzIHRoZSBwb3NpdGlvbiBvZiB0aGUgY29sdW1uIHdpdGhpbiB0aGUgbGlzdDogMSBmb3IKCSAqCQkJCQkJCQkJCXRoZSBmaXJzdCBjb2x1bW4sIDIgZm9yIHRoZSBzZWNvbmQgY29sdW1uLCBhbmQgc28gb24uCgkgKiBAcGFyYW0JbWl4ZWRbXQkJCSRjcml0ZXJpYQlUaGUgcmFuZ2Ugb2YgY2VsbHMgdGhhdCBjb250YWlucyB0aGUgY29uZGl0aW9ucyB5b3Ugc3BlY2lmeS4KCSAqCQkJCQkJCQkJCVlvdSBjYW4gdXNlIGFueSByYW5nZSBmb3IgdGhlIGNyaXRlcmlhIGFyZ3VtZW50LCBhcyBsb25nIGFzIGl0CgkgKgkJCQkJCQkJCQlpbmNsdWRlcyBhdCBsZWFzdCBvbmUgY29sdW1uIGxhYmVsIGFuZCBhdCBsZWFzdCBvbmUgY2VsbCBiZWxvdwoJICoJCQkJCQkJCQkJdGhlIGNvbHVtbiBsYWJlbCBpbiB3aGljaCB5b3Ugc3BlY2lmeSBhIGNvbmRpdGlvbiBmb3IgdGhlCgkgKgkJCQkJCQkJCQljb2x1bW4uCgkgKiBAcmV0dXJuCWZsb2F0CgkgKgoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIERWQVIoJGRhdGFiYXNlLCRmaWVsZCwkY3JpdGVyaWEpIHsKCQkkZmllbGQgPSBzZWxmOjpfX2ZpZWxkRXh0cmFjdCgkZGF0YWJhc2UsJGZpZWxkKTsKCQlpZiAoaXNfbnVsbCgkZmllbGQpKSB7CgkJCXJldHVybiBOVUxMOwoJCX0KCgkJLy8JcmVkdWNlIHRoZSBkYXRhYmFzZSB0byBhIHNldCBvZiByb3dzIHRoYXQgbWF0Y2ggYWxsIHRoZSBjcml0ZXJpYQoJCSRkYXRhYmFzZSA9IHNlbGY6Ol9fZmlsdGVyKCRkYXRhYmFzZSwkY3JpdGVyaWEpOwoJCS8vCWV4dHJhY3QgYW4gYXJyYXkgb2YgdmFsdWVzIGZvciB0aGUgcmVxdWVzdGVkIGNvbHVtbgoJCSRjb2xEYXRhID0gYXJyYXkoKTsKCQlmb3JlYWNoKCRkYXRhYmFzZSBhcyAkcm93KSB7CgkJCSRjb2xEYXRhW10gPSAkcm93WyRmaWVsZF07CgkJfQoKCQkvLyBSZXR1cm4KCQlyZXR1cm4gUEhQRXhjZWxfQ2FsY3VsYXRpb25fU3RhdGlzdGljYWw6OlZBUkZ1bmMoJGNvbERhdGEpOwoJfQkvLwlmdW5jdGlvbiBEVkFSKCkKCgoJLyoqCgkgKiBEVkFSUAoJICoKCSAqIENhbGN1bGF0ZXMgdGhlIHZhcmlhbmNlIG9mIGEgcG9wdWxhdGlvbiBiYXNlZCBvbiB0aGUgZW50aXJlIHBvcHVsYXRpb24gYnkgdXNpbmcgdGhlIG51bWJlcnMKCSAqIGluIGEgY29sdW1uIG9mIGEgbGlzdCBvciBkYXRhYmFzZSB0aGF0IG1hdGNoIGNvbmRpdGlvbnMgdGhhdCB5b3Ugc3BlY2lmeS4KCSAqCgkgKiBFeGNlbCBGdW5jdGlvbjoKCSAqCQlEVkFSUChkYXRhYmFzZSxmaWVsZCxjcml0ZXJpYSkKCSAqCgkgKiBAYWNjZXNzCXB1YmxpYwoJICogQGNhdGVnb3J5IERhdGFiYXNlIEZ1bmN0aW9ucwoJICogQHBhcmFtCW1peGVkW10JCQkkZGF0YWJhc2UJVGhlIHJhbmdlIG9mIGNlbGxzIHRoYXQgbWFrZXMgdXAgdGhlIGxpc3Qgb3IgZGF0YWJhc2UuCgkgKgkJCQkJCQkJCQlBIGRhdGFiYXNlIGlzIGEgbGlzdCBvZiByZWxhdGVkIGRhdGEgaW4gd2hpY2ggcm93cyBvZiByZWxhdGVkCgkgKgkJCQkJCQkJCQlpbmZvcm1hdGlvbiBhcmUgcmVjb3JkcywgYW5kIGNvbHVtbnMgb2YgZGF0YSBhcmUgZmllbGRzLiBUaGUKCSAqCQkJCQkJCQkJCWZpcnN0IHJvdyBvZiB0aGUgbGlzdCBjb250YWlucyBsYWJlbHMgZm9yIGVhY2ggY29sdW1uLgoJICogQHBhcmFtCXN0cmluZ3xpbnRlZ2VyCSRmaWVsZAkJSW5kaWNhdGVzIHdoaWNoIGNvbHVtbiBpcyB1c2VkIGluIHRoZSBmdW5jdGlvbi4gRW50ZXIgdGhlCgkgKgkJCQkJCQkJCQljb2x1bW4gbGFiZWwgZW5jbG9zZWQgYmV0d2VlbiBkb3VibGUgcXVvdGF0aW9uIG1hcmtzLCBzdWNoIGFzCgkgKgkJCQkJCQkJCQkiQWdlIiBvciAiWWllbGQsIiBvciBhIG51bWJlciAod2l0aG91dCBxdW90YXRpb24gbWFya3MpIHRoYXQKCSAqCQkJCQkJCQkJCXJlcHJlc2VudHMgdGhlIHBvc2l0aW9uIG9mIHRoZSBjb2x1bW4gd2l0aGluIHRoZSBsaXN0OiAxIGZvcgoJICoJCQkJCQkJCQkJdGhlIGZpcnN0IGNvbHVtbiwgMiBmb3IgdGhlIHNlY29uZCBjb2x1bW4sIGFuZCBzbyBvbi4KCSAqIEBwYXJhbQltaXhlZFtdCQkJJGNyaXRlcmlhCVRoZSByYW5nZSBvZiBjZWxscyB0aGF0IGNvbnRhaW5zIHRoZSBjb25kaXRpb25zIHlvdSBzcGVjaWZ5LgoJICoJCQkJCQkJCQkJWW91IGNhbiB1c2UgYW55IHJhbmdlIGZvciB0aGUgY3JpdGVyaWEgYXJndW1lbnQsIGFzIGxvbmcgYXMgaXQKCSAqCQkJCQkJCQkJCWluY2x1ZGVzIGF0IGxlYXN0IG9uZSBjb2x1bW4gbGFiZWwgYW5kIGF0IGxlYXN0IG9uZSBjZWxsIGJlbG93CgkgKgkJCQkJCQkJCQl0aGUgY29sdW1uIGxhYmVsIGluIHdoaWNoIHlvdSBzcGVjaWZ5IGEgY29uZGl0aW9uIGZvciB0aGUKCSAqCQkJCQkJCQkJCWNvbHVtbi4KCSAqIEByZXR1cm4JZmxvYXQKCSAqCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gRFZBUlAoJGRhdGFiYXNlLCRmaWVsZCwkY3JpdGVyaWEpIHsKCQkkZmllbGQgPSBzZWxmOjpfX2ZpZWxkRXh0cmFjdCgkZGF0YWJhc2UsJGZpZWxkKTsKCQlpZiAoaXNfbnVsbCgkZmllbGQpKSB7CgkJCXJldHVybiBOVUxMOwoJCX0KCgkJLy8JcmVkdWNlIHRoZSBkYXRhYmFzZSB0byBhIHNldCBvZiByb3dzIHRoYXQgbWF0Y2ggYWxsIHRoZSBjcml0ZXJpYQoJCSRkYXRhYmFzZSA9IHNlbGY6Ol9fZmlsdGVyKCRkYXRhYmFzZSwkY3JpdGVyaWEpOwoJCS8vCWV4dHJhY3QgYW4gYXJyYXkgb2YgdmFsdWVzIGZvciB0aGUgcmVxdWVzdGVkIGNvbHVtbgoJCSRjb2xEYXRhID0gYXJyYXkoKTsKCQlmb3JlYWNoKCRkYXRhYmFzZSBhcyAkcm93KSB7CgkJCSRjb2xEYXRhW10gPSAkcm93WyRmaWVsZF07CgkJfQoKCQkvLyBSZXR1cm4KCQlyZXR1cm4gUEhQRXhjZWxfQ2FsY3VsYXRpb25fU3RhdGlzdGljYWw6OlZBUlAoJGNvbERhdGEpOwoJfQkvLwlmdW5jdGlvbiBEVkFSUCgpCgoKfQkvLwljbGFzcyBQSFBFeGNlbF9DYWxjdWxhdGlvbl9EYXRhYmFzZQo=]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Calculation/DateTime.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIFBIUEV4Y2VsCiAqCiAqIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKICoKICogQGNhdGVnb3J5CVBIUEV4Y2VsCiAqIEBwYWNrYWdlCQlQSFBFeGNlbF9DYWxjdWxhdGlvbgogKiBAY29weXJpZ2h0CUNvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwgKGh0dHA6Ly93d3cuY29kZXBsZXguY29tL1BIUEV4Y2VsKQogKiBAbGljZW5zZQkJaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL29sZC1saWNlbnNlcy9sZ3BsLTIuMS50eHQJTEdQTAogKiBAdmVyc2lvbgkJMS43LjcsIDIwMTItMDUtMTkKICovCgoKLyoqIFBIUEV4Y2VsIHJvb3QgZGlyZWN0b3J5ICovCmlmICghZGVmaW5lZCgnUEhQRVhDRUxfUk9PVCcpKSB7CgkvKioKCSAqIEBpZ25vcmUKCSAqLwoJZGVmaW5lKCdQSFBFWENFTF9ST09UJywgZGlybmFtZShfX0ZJTEVfXykgLiAnLy4uLy4uLycpOwoJcmVxdWlyZShQSFBFWENFTF9ST09UIC4gJ1BIUEV4Y2VsL0F1dG9sb2FkZXIucGhwJyk7Cn0KCgovKioKICogUEhQRXhjZWxfQ2FsY3VsYXRpb25fRGF0ZVRpbWUKICoKICogQGNhdGVnb3J5CVBIUEV4Y2VsCiAqIEBwYWNrYWdlCQlQSFBFeGNlbF9DYWxjdWxhdGlvbgogKiBAY29weXJpZ2h0CUNvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwgKGh0dHA6Ly93d3cuY29kZXBsZXguY29tL1BIUEV4Y2VsKQogKi8KY2xhc3MgUEhQRXhjZWxfQ2FsY3VsYXRpb25fRGF0ZVRpbWUgewoKCS8qKgoJICogSWRlbnRpZnkgaWYgYSB5ZWFyIGlzIGEgbGVhcCB5ZWFyIG9yIG5vdAoJICoKCSAqIEBwYXJhbQlpbnRlZ2VyCSR5ZWFyCVRoZSB5ZWFyIHRvIHRlc3QKCSAqIEByZXR1cm4JYm9vbGVhbgkJCVRSVUUgaWYgdGhlIHllYXIgaXMgYSBsZWFwIHllYXIsIG90aGVyd2lzZSBGQUxTRQoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIF9pc0xlYXBZZWFyKCR5ZWFyKSB7CgkJcmV0dXJuICgoKCR5ZWFyICUgNCkgPT0gMCkgJiYgKCgkeWVhciAlIDEwMCkgIT0gMCkgfHwgKCgkeWVhciAlIDQwMCkgPT0gMCkpOwoJfQkvLwlmdW5jdGlvbiBfaXNMZWFwWWVhcigpCgoKCXByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIF9kYXRlRGlmZjM2MCgkc3RhcnREYXksICRzdGFydE1vbnRoLCAkc3RhcnRZZWFyLCAkZW5kRGF5LCAkZW5kTW9udGgsICRlbmRZZWFyLCAkbWV0aG9kVVMpIHsKCQlpZiAoJHN0YXJ0RGF5ID09IDMxKSB7CgkJCS0tJHN0YXJ0RGF5OwoJCX0gZWxzZWlmICgkbWV0aG9kVVMgJiYgKCRzdGFydE1vbnRoID09IDIgJiYgKCRzdGFydERheSA9PSAyOSB8fCAoJHN0YXJ0RGF5ID09IDI4ICYmICFzZWxmOjpfaXNMZWFwWWVhcigkc3RhcnRZZWFyKSkpKSkgewoJCQkkc3RhcnREYXkgPSAzMDsKCQl9CgkJaWYgKCRlbmREYXkgPT0gMzEpIHsKCQkJaWYgKCRtZXRob2RVUyAmJiAkc3RhcnREYXkgIT0gMzApIHsKCQkJCSRlbmREYXkgPSAxOwoJCQkJaWYgKCRlbmRNb250aCA9PSAxMikgewoJCQkJCSsrJGVuZFllYXI7CgkJCQkJJGVuZE1vbnRoID0gMTsKCQkJCX0gZWxzZSB7CgkJCQkJKyskZW5kTW9udGg7CgkJCQl9CgkJCX0gZWxzZSB7CgkJCQkkZW5kRGF5ID0gMzA7CgkJCX0KCQl9CgoJCXJldHVybiAkZW5kRGF5ICsgJGVuZE1vbnRoICogMzAgKyAkZW5kWWVhciAqIDM2MCAtICRzdGFydERheSAtICRzdGFydE1vbnRoICogMzAgLSAkc3RhcnRZZWFyICogMzYwOwoJfQkvLwlmdW5jdGlvbiBfZGF0ZURpZmYzNjAoKQoKCgkvKioKCSAqIF9nZXREYXRlVmFsdWUKCSAqCgkgKiBAcGFyYW0Jc3RyaW5nCSRkYXRlVmFsdWUKCSAqIEByZXR1cm4JbWl4ZWQJRXhjZWwgZGF0ZS90aW1lIHNlcmlhbCB2YWx1ZSwgb3Igc3RyaW5nIGlmIGVycm9yCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gX2dldERhdGVWYWx1ZSgkZGF0ZVZhbHVlKSB7CgkJaWYgKCFpc19udW1lcmljKCRkYXRlVmFsdWUpKSB7CgkJCWlmICgoaXNfc3RyaW5nKCRkYXRlVmFsdWUpKSAmJgoJCQkJKFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6Z2V0Q29tcGF0aWJpbGl0eU1vZGUoKSA9PSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OkNPTVBBVElCSUxJVFlfR05VTUVSSUMpKSB7CgkJCQlyZXR1cm4gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpWQUxVRSgpOwoJCQl9CgkJCWlmICgoaXNfb2JqZWN0KCRkYXRlVmFsdWUpKSAmJiAoJGRhdGVWYWx1ZSBpbnN0YW5jZW9mIFBIUEV4Y2VsX1NoYXJlZF9EYXRlOjokZGF0ZVRpbWVPYmplY3RUeXBlKSkgewoJCQkJJGRhdGVWYWx1ZSA9IFBIUEV4Y2VsX1NoYXJlZF9EYXRlOjpQSFBUb0V4Y2VsKCRkYXRlVmFsdWUpOwoJCQl9IGVsc2UgewoJCQkJJHNhdmVSZXR1cm5EYXRlVHlwZSA9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6Z2V0UmV0dXJuRGF0ZVR5cGUoKTsKCQkJCVBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6c2V0UmV0dXJuRGF0ZVR5cGUoUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpSRVRVUk5EQVRFX0VYQ0VMKTsKCQkJCSRkYXRlVmFsdWUgPSBzZWxmOjpEQVRFVkFMVUUoJGRhdGVWYWx1ZSk7CgkJCQlQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OnNldFJldHVybkRhdGVUeXBlKCRzYXZlUmV0dXJuRGF0ZVR5cGUpOwoJCQl9CgkJfQoJCXJldHVybiAkZGF0ZVZhbHVlOwoJfQkvLwlmdW5jdGlvbiBfZ2V0RGF0ZVZhbHVlKCkKCgoJLyoqCgkgKiBfZ2V0VGltZVZhbHVlCgkgKgoJICogQHBhcmFtCXN0cmluZwkkdGltZVZhbHVlCgkgKiBAcmV0dXJuCW1peGVkCUV4Y2VsIGRhdGUvdGltZSBzZXJpYWwgdmFsdWUsIG9yIHN0cmluZyBpZiBlcnJvcgoJICovCglwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBfZ2V0VGltZVZhbHVlKCR0aW1lVmFsdWUpIHsKCQkkc2F2ZVJldHVybkRhdGVUeXBlID0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpnZXRSZXR1cm5EYXRlVHlwZSgpOwoJCVBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6c2V0UmV0dXJuRGF0ZVR5cGUoUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpSRVRVUk5EQVRFX0VYQ0VMKTsKCQkkdGltZVZhbHVlID0gc2VsZjo6VElNRVZBTFVFKCR0aW1lVmFsdWUpOwoJCVBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6c2V0UmV0dXJuRGF0ZVR5cGUoJHNhdmVSZXR1cm5EYXRlVHlwZSk7CgkJcmV0dXJuICR0aW1lVmFsdWU7Cgl9CS8vCWZ1bmN0aW9uIF9nZXRUaW1lVmFsdWUoKQoKCglwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBfYWRqdXN0RGF0ZUJ5TW9udGhzKCRkYXRlVmFsdWUgPSAwLCAkYWRqdXN0bWVudE1vbnRocyA9IDApIHsKCQkvLyBFeGVjdXRlIGZ1bmN0aW9uCgkJJFBIUERhdGVPYmplY3QgPSBQSFBFeGNlbF9TaGFyZWRfRGF0ZTo6RXhjZWxUb1BIUE9iamVjdCgkZGF0ZVZhbHVlKTsKCQkkb01vbnRoID0gKGludCkgJFBIUERhdGVPYmplY3QtPmZvcm1hdCgnbScpOwoJCSRvWWVhciA9IChpbnQpICRQSFBEYXRlT2JqZWN0LT5mb3JtYXQoJ1knKTsKCgkJJGFkanVzdG1lbnRNb250aHNTdHJpbmcgPSAoc3RyaW5nKSAkYWRqdXN0bWVudE1vbnRoczsKCQlpZiAoJGFkanVzdG1lbnRNb250aHMgPiAwKSB7CgkJCSRhZGp1c3RtZW50TW9udGhzU3RyaW5nID0gJysnLiRhZGp1c3RtZW50TW9udGhzOwoJCX0KCQlpZiAoJGFkanVzdG1lbnRNb250aHMgIT0gMCkgewoJCQkkUEhQRGF0ZU9iamVjdC0+bW9kaWZ5KCRhZGp1c3RtZW50TW9udGhzU3RyaW5nLicgbW9udGhzJyk7CgkJfQoJCSRuTW9udGggPSAoaW50KSAkUEhQRGF0ZU9iamVjdC0+Zm9ybWF0KCdtJyk7CgkJJG5ZZWFyID0gKGludCkgJFBIUERhdGVPYmplY3QtPmZvcm1hdCgnWScpOwoKCQkkbW9udGhEaWZmID0gKCRuTW9udGggLSAkb01vbnRoKSArICgoJG5ZZWFyIC0gJG9ZZWFyKSAqIDEyKTsKCQlpZiAoJG1vbnRoRGlmZiAhPSAkYWRqdXN0bWVudE1vbnRocykgewoJCQkkYWRqdXN0RGF5cyA9IChpbnQpICRQSFBEYXRlT2JqZWN0LT5mb3JtYXQoJ2QnKTsKCQkJJGFkanVzdERheXNTdHJpbmcgPSAnLScuJGFkanVzdERheXMuJyBkYXlzJzsKCQkJJFBIUERhdGVPYmplY3QtPm1vZGlmeSgkYWRqdXN0RGF5c1N0cmluZyk7CgkJfQoJCXJldHVybiAkUEhQRGF0ZU9iamVjdDsKCX0JLy8JZnVuY3Rpb24gX2FkanVzdERhdGVCeU1vbnRocygpCgoKCS8qKgoJICogREFURVRJTUVOT1cKCSAqCgkgKiBSZXR1cm5zIHRoZSBjdXJyZW50IGRhdGUgYW5kIHRpbWUuCgkgKiBUaGUgTk9XIGZ1bmN0aW9uIGlzIHVzZWZ1bCB3aGVuIHlvdSBuZWVkIHRvIGRpc3BsYXkgdGhlIGN1cnJlbnQgZGF0ZSBhbmQgdGltZSBvbiBhIHdvcmtzaGVldCBvcgoJICogY2FsY3VsYXRlIGEgdmFsdWUgYmFzZWQgb24gdGhlIGN1cnJlbnQgZGF0ZSBhbmQgdGltZSwgYW5kIGhhdmUgdGhhdCB2YWx1ZSB1cGRhdGVkIGVhY2ggdGltZSB5b3UKCSAqIG9wZW4gdGhlIHdvcmtzaGVldC4KCSAqCgkgKiBOT1RFOiBXaGVuIHVzZWQgaW4gYSBDZWxsIEZvcm11bGEsIE1TIEV4Y2VsIGNoYW5nZXMgdGhlIGNlbGwgZm9ybWF0IHNvIHRoYXQgaXQgbWF0Y2hlcyB0aGUgZGF0ZQoJICogYW5kIHRpbWUgZm9ybWF0IG9mIHlvdXIgcmVnaW9uYWwgc2V0dGluZ3MuIFBIUEV4Y2VsIGRvZXMgbm90IGNoYW5nZSBjZWxsIGZvcm1hdHRpbmcgaW4gdGhpcyB3YXkuCgkgKgoJICogRXhjZWwgRnVuY3Rpb246CgkgKgkJTk9XKCkKCSAqCgkgKiBAYWNjZXNzCXB1YmxpYwoJICogQGNhdGVnb3J5IERhdGUvVGltZSBGdW5jdGlvbnMKCSAqIEByZXR1cm4JbWl4ZWQJRXhjZWwgZGF0ZS90aW1lIHNlcmlhbCB2YWx1ZSwgUEhQIGRhdGUvdGltZSBzZXJpYWwgdmFsdWUgb3IgUEhQIGRhdGUvdGltZSBvYmplY3QsCgkgKgkJCQkJCWRlcGVuZGluZyBvbiB0aGUgdmFsdWUgb2YgdGhlIFJldHVybkRhdGVUeXBlIGZsYWcKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBEQVRFVElNRU5PVygpIHsKCQkkc2F2ZVRpbWVab25lID0gZGF0ZV9kZWZhdWx0X3RpbWV6b25lX2dldCgpOwoJCWRhdGVfZGVmYXVsdF90aW1lem9uZV9zZXQoJ1VUQycpOwoJCSRyZXRWYWx1ZSA9IEZhbHNlOwoJCXN3aXRjaCAoUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpnZXRSZXR1cm5EYXRlVHlwZSgpKSB7CgkJCWNhc2UgUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpSRVRVUk5EQVRFX0VYQ0VMIDoKCQkJCQkkcmV0VmFsdWUgPSAoZmxvYXQpIFBIUEV4Y2VsX1NoYXJlZF9EYXRlOjpQSFBUb0V4Y2VsKHRpbWUoKSk7CgkJCQkJYnJlYWs7CgkJCWNhc2UgUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpSRVRVUk5EQVRFX1BIUF9OVU1FUklDIDoKCQkJCQkkcmV0VmFsdWUgPSAoaW50ZWdlcikgdGltZSgpOwoJCQkJCWJyZWFrOwoJCQljYXNlIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6UkVUVVJOREFURV9QSFBfT0JKRUNUIDoKCQkJCQkkcmV0VmFsdWUgPSBuZXcgRGF0ZVRpbWUoKTsKCQkJCQlicmVhazsKCQl9CgkJZGF0ZV9kZWZhdWx0X3RpbWV6b25lX3NldCgkc2F2ZVRpbWVab25lKTsKCgkJcmV0dXJuICRyZXRWYWx1ZTsKCX0JLy8JZnVuY3Rpb24gREFURVRJTUVOT1coKQoKCgkvKioKCSAqIERBVEVOT1cKCSAqCgkgKiBSZXR1cm5zIHRoZSBjdXJyZW50IGRhdGUuCgkgKiBUaGUgTk9XIGZ1bmN0aW9uIGlzIHVzZWZ1bCB3aGVuIHlvdSBuZWVkIHRvIGRpc3BsYXkgdGhlIGN1cnJlbnQgZGF0ZSBhbmQgdGltZSBvbiBhIHdvcmtzaGVldCBvcgoJICogY2FsY3VsYXRlIGEgdmFsdWUgYmFzZWQgb24gdGhlIGN1cnJlbnQgZGF0ZSBhbmQgdGltZSwgYW5kIGhhdmUgdGhhdCB2YWx1ZSB1cGRhdGVkIGVhY2ggdGltZSB5b3UKCSAqIG9wZW4gdGhlIHdvcmtzaGVldC4KCSAqCgkgKiBOT1RFOiBXaGVuIHVzZWQgaW4gYSBDZWxsIEZvcm11bGEsIE1TIEV4Y2VsIGNoYW5nZXMgdGhlIGNlbGwgZm9ybWF0IHNvIHRoYXQgaXQgbWF0Y2hlcyB0aGUgZGF0ZQoJICogYW5kIHRpbWUgZm9ybWF0IG9mIHlvdXIgcmVnaW9uYWwgc2V0dGluZ3MuIFBIUEV4Y2VsIGRvZXMgbm90IGNoYW5nZSBjZWxsIGZvcm1hdHRpbmcgaW4gdGhpcyB3YXkuCgkgKgoJICogRXhjZWwgRnVuY3Rpb246CgkgKgkJVE9EQVkoKQoJICoKCSAqIEBhY2Nlc3MJcHVibGljCgkgKiBAY2F0ZWdvcnkgRGF0ZS9UaW1lIEZ1bmN0aW9ucwoJICogQHJldHVybgltaXhlZAlFeGNlbCBkYXRlL3RpbWUgc2VyaWFsIHZhbHVlLCBQSFAgZGF0ZS90aW1lIHNlcmlhbCB2YWx1ZSBvciBQSFAgZGF0ZS90aW1lIG9iamVjdCwKCSAqCQkJCQkJZGVwZW5kaW5nIG9uIHRoZSB2YWx1ZSBvZiB0aGUgUmV0dXJuRGF0ZVR5cGUgZmxhZwoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIERBVEVOT1coKSB7CgkJJHNhdmVUaW1lWm9uZSA9IGRhdGVfZGVmYXVsdF90aW1lem9uZV9nZXQoKTsKCQlkYXRlX2RlZmF1bHRfdGltZXpvbmVfc2V0KCdVVEMnKTsKCQkkcmV0VmFsdWUgPSBGYWxzZTsKCQkkZXhjZWxEYXRlVGltZSA9IGZsb29yKFBIUEV4Y2VsX1NoYXJlZF9EYXRlOjpQSFBUb0V4Y2VsKHRpbWUoKSkpOwoJCXN3aXRjaCAoUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpnZXRSZXR1cm5EYXRlVHlwZSgpKSB7CgkJCWNhc2UgUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpSRVRVUk5EQVRFX0VYQ0VMIDoKCQkJCQkkcmV0VmFsdWUgPSAoZmxvYXQpICRleGNlbERhdGVUaW1lOwoJCQkJCWJyZWFrOwoJCQljYXNlIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6UkVUVVJOREFURV9QSFBfTlVNRVJJQyA6CgkJCQkJJHJldFZhbHVlID0gKGludGVnZXIpIFBIUEV4Y2VsX1NoYXJlZF9EYXRlOjpFeGNlbFRvUEhQKCRleGNlbERhdGVUaW1lKTsKCQkJCQlicmVhazsKCQkJY2FzZSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OlJFVFVSTkRBVEVfUEhQX09CSkVDVCA6CgkJCQkJJHJldFZhbHVlID0gUEhQRXhjZWxfU2hhcmVkX0RhdGU6OkV4Y2VsVG9QSFBPYmplY3QoJGV4Y2VsRGF0ZVRpbWUpOwoJCQkJCWJyZWFrOwoJCX0KCQlkYXRlX2RlZmF1bHRfdGltZXpvbmVfc2V0KCRzYXZlVGltZVpvbmUpOwoKCQlyZXR1cm4gJHJldFZhbHVlOwoJfQkvLwlmdW5jdGlvbiBEQVRFTk9XKCkKCgoJLyoqCgkgKiBEQVRFCgkgKgoJICogVGhlIERBVEUgZnVuY3Rpb24gcmV0dXJucyBhIHZhbHVlIHRoYXQgcmVwcmVzZW50cyBhIHBhcnRpY3VsYXIgZGF0ZS4KCSAqCgkgKiBOT1RFOiBXaGVuIHVzZWQgaW4gYSBDZWxsIEZvcm11bGEsIE1TIEV4Y2VsIGNoYW5nZXMgdGhlIGNlbGwgZm9ybWF0IHNvIHRoYXQgaXQgbWF0Y2hlcyB0aGUgZGF0ZQoJICogZm9ybWF0IG9mIHlvdXIgcmVnaW9uYWwgc2V0dGluZ3MuIFBIUEV4Y2VsIGRvZXMgbm90IGNoYW5nZSBjZWxsIGZvcm1hdHRpbmcgaW4gdGhpcyB3YXkuCgkgKgoJICogRXhjZWwgRnVuY3Rpb246CgkgKgkJREFURSh5ZWFyLG1vbnRoLGRheSkKCSAqCgkgKiBAYWNjZXNzCXB1YmxpYwoJICogQGNhdGVnb3J5IERhdGUvVGltZSBGdW5jdGlvbnMKCSAqIEBwYXJhbQlpbnRlZ2VyCQkkeWVhcglUaGUgdmFsdWUgb2YgdGhlIHllYXIgYXJndW1lbnQgY2FuIGluY2x1ZGUgb25lIHRvIGZvdXIgZGlnaXRzLgoJICoJCQkJCQkJCUV4Y2VsIGludGVycHJldHMgdGhlIHllYXIgYXJndW1lbnQgYWNjb3JkaW5nIHRvIHRoZSBjb25maWd1cmVkCgkgKgkJCQkJCQkJZGF0ZSBzeXN0ZW06IDE5MDAgb3IgMTkwNC4KCSAqCQkJCQkJCQlJZiB5ZWFyIGlzIGJldHdlZW4gMCAoemVybykgYW5kIDE4OTkgKGluY2x1c2l2ZSksIEV4Y2VsIGFkZHMgdGhhdAoJICoJCQkJCQkJCXZhbHVlIHRvIDE5MDAgdG8gY2FsY3VsYXRlIHRoZSB5ZWFyLiBGb3IgZXhhbXBsZSwgREFURSgxMDgsMSwyKQoJICoJCQkJCQkJCXJldHVybnMgSmFudWFyeSAyLCAyMDA4ICgxOTAwKzEwOCkuCgkgKgkJCQkJCQkJSWYgeWVhciBpcyBiZXR3ZWVuIDE5MDAgYW5kIDk5OTkgKGluY2x1c2l2ZSksIEV4Y2VsIHVzZXMgdGhhdAoJICoJCQkJCQkJCXZhbHVlIGFzIHRoZSB5ZWFyLiBGb3IgZXhhbXBsZSwgREFURSgyMDA4LDEsMikgcmV0dXJucyBKYW51YXJ5IDIsCgkgKgkJCQkJCQkJMjAwOC4KCSAqCQkJCQkJCQlJZiB5ZWFyIGlzIGxlc3MgdGhhbiAwIG9yIGlzIDEwMDAwIG9yIGdyZWF0ZXIsIEV4Y2VsIHJldHVybnMgdGhlCgkgKgkJCQkJCQkJI05VTSEgZXJyb3IgdmFsdWUuCgkgKiBAcGFyYW0JaW50ZWdlcgkJJG1vbnRoCUEgcG9zaXRpdmUgb3IgbmVnYXRpdmUgaW50ZWdlciByZXByZXNlbnRpbmcgdGhlIG1vbnRoIG9mIHRoZSB5ZWFyCgkgKgkJCQkJCQkJZnJvbSAxIHRvIDEyIChKYW51YXJ5IHRvIERlY2VtYmVyKS4KCSAqCQkJCQkJCQlJZiBtb250aCBpcyBncmVhdGVyIHRoYW4gMTIsIG1vbnRoIGFkZHMgdGhhdCBudW1iZXIgb2YgbW9udGhzIHRvCgkgKgkJCQkJCQkJdGhlIGZpcnN0IG1vbnRoIGluIHRoZSB5ZWFyIHNwZWNpZmllZC4gRm9yIGV4YW1wbGUsIERBVEUoMjAwOCwxNCwyKQoJICoJCQkJCQkJCXJldHVybnMgdGhlIHNlcmlhbCBudW1iZXIgcmVwcmVzZW50aW5nIEZlYnJ1YXJ5IDIsIDIwMDkuCgkgKgkJCQkJCQkJSWYgbW9udGggaXMgbGVzcyB0aGFuIDEsIG1vbnRoIHN1YnRyYWN0cyB0aGUgbWFnbml0dWRlIG9mIHRoYXQKCSAqCQkJCQkJCQludW1iZXIgb2YgbW9udGhzLCBwbHVzIDEsIGZyb20gdGhlIGZpcnN0IG1vbnRoIGluIHRoZSB5ZWFyCgkgKgkJCQkJCQkJc3BlY2lmaWVkLiBGb3IgZXhhbXBsZSwgREFURSgyMDA4LC0zLDIpIHJldHVybnMgdGhlIHNlcmlhbCBudW1iZXIKCSAqCQkJCQkJCQlyZXByZXNlbnRpbmcgU2VwdGVtYmVyIDIsIDIwMDcuCgkgKiBAcGFyYW0JaW50ZWdlcgkJJGRheQlBIHBvc2l0aXZlIG9yIG5lZ2F0aXZlIGludGVnZXIgcmVwcmVzZW50aW5nIHRoZSBkYXkgb2YgdGhlIG1vbnRoCgkgKgkJCQkJCQkJZnJvbSAxIHRvIDMxLgoJICoJCQkJCQkJCUlmIGRheSBpcyBncmVhdGVyIHRoYW4gdGhlIG51bWJlciBvZiBkYXlzIGluIHRoZSBtb250aCBzcGVjaWZpZWQsCgkgKgkJCQkJCQkJZGF5IGFkZHMgdGhhdCBudW1iZXIgb2YgZGF5cyB0byB0aGUgZmlyc3QgZGF5IGluIHRoZSBtb250aC4gRm9yCgkgKgkJCQkJCQkJZXhhbXBsZSwgREFURSgyMDA4LDEsMzUpIHJldHVybnMgdGhlIHNlcmlhbCBudW1iZXIgcmVwcmVzZW50aW5nCgkgKgkJCQkJCQkJRmVicnVhcnkgNCwgMjAwOC4KCSAqCQkJCQkJCQlJZiBkYXkgaXMgbGVzcyB0aGFuIDEsIGRheSBzdWJ0cmFjdHMgdGhlIG1hZ25pdHVkZSB0aGF0IG51bWJlciBvZgoJICoJCQkJCQkJCWRheXMsIHBsdXMgb25lLCBmcm9tIHRoZSBmaXJzdCBkYXkgb2YgdGhlIG1vbnRoIHNwZWNpZmllZC4gRm9yCgkgKgkJCQkJCQkJZXhhbXBsZSwgREFURSgyMDA4LDEsLTE1KSByZXR1cm5zIHRoZSBzZXJpYWwgbnVtYmVyIHJlcHJlc2VudGluZwoJICoJCQkJCQkJCURlY2VtYmVyIDE2LCAyMDA3LgoJICogQHJldHVybgltaXhlZAlFeGNlbCBkYXRlL3RpbWUgc2VyaWFsIHZhbHVlLCBQSFAgZGF0ZS90aW1lIHNlcmlhbCB2YWx1ZSBvciBQSFAgZGF0ZS90aW1lIG9iamVjdCwKCSAqCQkJCQkJZGVwZW5kaW5nIG9uIHRoZSB2YWx1ZSBvZiB0aGUgUmV0dXJuRGF0ZVR5cGUgZmxhZwoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIERBVEUoJHllYXIgPSAwLCAkbW9udGggPSAxLCAkZGF5ID0gMSkgewoJCSR5ZWFyCT0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuU2luZ2xlVmFsdWUoJHllYXIpOwoJCSRtb250aAk9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlblNpbmdsZVZhbHVlKCRtb250aCk7CgkJJGRheQk9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlblNpbmdsZVZhbHVlKCRkYXkpOwoKCQkkeWVhcgk9ICgkeWVhciAhPT0gTlVMTCkJPyBQSFBFeGNlbF9TaGFyZWRfU3RyaW5nOjp0ZXN0U3RyaW5nQXNOdW1lcmljKCR5ZWFyKSA6IDA7CgkJJG1vbnRoCT0gKCRtb250aCAhPT0gTlVMTCkJPyBQSFBFeGNlbF9TaGFyZWRfU3RyaW5nOjp0ZXN0U3RyaW5nQXNOdW1lcmljKCRtb250aCkgOiAwOwoJCSRkYXkJPSAoJGRheSAhPT0gTlVMTCkJPyBQSFBFeGNlbF9TaGFyZWRfU3RyaW5nOjp0ZXN0U3RyaW5nQXNOdW1lcmljKCRkYXkpIDogMDsKCQlpZiAoKCFpc19udW1lcmljKCR5ZWFyKSkgfHwKCQkJKCFpc19udW1lcmljKCRtb250aCkpIHx8CgkJCSghaXNfbnVtZXJpYygkZGF5KSkpIHsKCQkJcmV0dXJuIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6VkFMVUUoKTsKCQl9CgkJJHllYXIJPSAoaW50ZWdlcikgJHllYXI7CgkJJG1vbnRoCT0gKGludGVnZXIpICRtb250aDsKCQkkZGF5CT0gKGludGVnZXIpICRkYXk7CgoJCSRiYXNlWWVhciA9IFBIUEV4Y2VsX1NoYXJlZF9EYXRlOjpnZXRFeGNlbENhbGVuZGFyKCk7CgkJLy8gVmFsaWRhdGUgcGFyYW1ldGVycwoJCWlmICgkeWVhciA8ICgkYmFzZVllYXItMTkwMCkpIHsKCQkJcmV0dXJuIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6TmFOKCk7CgkJfQoJCWlmICgoKCRiYXNlWWVhci0xOTAwKSAhPSAwKSAmJiAoJHllYXIgPCAkYmFzZVllYXIpICYmICgkeWVhciA+PSAxOTAwKSkgewoJCQlyZXR1cm4gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpOYU4oKTsKCQl9CgoJCWlmICgoJHllYXIgPCAkYmFzZVllYXIpICYmICgkeWVhciA+PSAoJGJhc2VZZWFyLTE5MDApKSkgewoJCQkkeWVhciArPSAxOTAwOwoJCX0KCgkJaWYgKCRtb250aCA8IDEpIHsKCQkJLy8JSGFuZGxlIHllYXIvbW9udGggYWRqdXN0bWVudCBpZiBtb250aCA8IDEKCQkJLS0kbW9udGg7CgkJCSR5ZWFyICs9IGNlaWwoJG1vbnRoIC8gMTIpIC0gMTsKCQkJJG1vbnRoID0gMTMgLSBhYnMoJG1vbnRoICUgMTIpOwoJCX0gZWxzZWlmICgkbW9udGggPiAxMikgewoJCQkvLwlIYW5kbGUgeWVhci9tb250aCBhZGp1c3RtZW50IGlmIG1vbnRoID4gMTIKCQkJJHllYXIgKz0gZmxvb3IoJG1vbnRoIC8gMTIpOwoJCQkkbW9udGggPSAoJG1vbnRoICUgMTIpOwoJCX0KCgkJLy8gUmUtdmFsaWRhdGUgdGhlIHllYXIgcGFyYW1ldGVyIGFmdGVyIGFkanVzdG1lbnRzCgkJaWYgKCgkeWVhciA8ICRiYXNlWWVhcikgfHwgKCR5ZWFyID49IDEwMDAwKSkgewoJCQlyZXR1cm4gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpOYU4oKTsKCQl9CgoJCS8vIEV4ZWN1dGUgZnVuY3Rpb24KCQkkZXhjZWxEYXRlVmFsdWUgPSBQSFBFeGNlbF9TaGFyZWRfRGF0ZTo6Rm9ybWF0dGVkUEhQVG9FeGNlbCgkeWVhciwgJG1vbnRoLCAkZGF5KTsKCQlzd2l0Y2ggKFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6Z2V0UmV0dXJuRGF0ZVR5cGUoKSkgewoJCQljYXNlIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6UkVUVVJOREFURV9FWENFTCA6CgkJCQkJcmV0dXJuIChmbG9hdCkgJGV4Y2VsRGF0ZVZhbHVlOwoJCQljYXNlIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6UkVUVVJOREFURV9QSFBfTlVNRVJJQyA6CgkJCQkJcmV0dXJuIChpbnRlZ2VyKSBQSFBFeGNlbF9TaGFyZWRfRGF0ZTo6RXhjZWxUb1BIUCgkZXhjZWxEYXRlVmFsdWUpOwoJCQljYXNlIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6UkVUVVJOREFURV9QSFBfT0JKRUNUIDoKCQkJCQlyZXR1cm4gUEhQRXhjZWxfU2hhcmVkX0RhdGU6OkV4Y2VsVG9QSFBPYmplY3QoJGV4Y2VsRGF0ZVZhbHVlKTsKCQl9Cgl9CS8vCWZ1bmN0aW9uIERBVEUoKQoKCgkvKioKCSAqIFRJTUUKCSAqCgkgKiBUaGUgVElNRSBmdW5jdGlvbiByZXR1cm5zIGEgdmFsdWUgdGhhdCByZXByZXNlbnRzIGEgcGFydGljdWxhciB0aW1lLgoJICoKCSAqIE5PVEU6IFdoZW4gdXNlZCBpbiBhIENlbGwgRm9ybXVsYSwgTVMgRXhjZWwgY2hhbmdlcyB0aGUgY2VsbCBmb3JtYXQgc28gdGhhdCBpdCBtYXRjaGVzIHRoZSB0aW1lCgkgKiBmb3JtYXQgb2YgeW91ciByZWdpb25hbCBzZXR0aW5ncy4gUEhQRXhjZWwgZG9lcyBub3QgY2hhbmdlIGNlbGwgZm9ybWF0dGluZyBpbiB0aGlzIHdheS4KCSAqCgkgKiBFeGNlbCBGdW5jdGlvbjoKCSAqCQlUSU1FKGhvdXIsbWludXRlLHNlY29uZCkKCSAqCgkgKiBAYWNjZXNzCXB1YmxpYwoJICogQGNhdGVnb3J5IERhdGUvVGltZSBGdW5jdGlvbnMKCSAqIEBwYXJhbQlpbnRlZ2VyCQkkaG91cgkJQSBudW1iZXIgZnJvbSAwICh6ZXJvKSB0byAzMjc2NyByZXByZXNlbnRpbmcgdGhlIGhvdXIuCgkgKgkJCQkJCQkJCUFueSB2YWx1ZSBncmVhdGVyIHRoYW4gMjMgd2lsbCBiZSBkaXZpZGVkIGJ5IDI0IGFuZCB0aGUgcmVtYWluZGVyCgkgKgkJCQkJCQkJCXdpbGwgYmUgdHJlYXRlZCBhcyB0aGUgaG91ciB2YWx1ZS4gRm9yIGV4YW1wbGUsIFRJTUUoMjcsMCwwKSA9CgkgKgkJCQkJCQkJCVRJTUUoMywwLDApID0gLjEyNSBvciAzOjAwIEFNLgoJICogQHBhcmFtCWludGVnZXIJCSRtaW51dGUJCUEgbnVtYmVyIGZyb20gMCB0byAzMjc2NyByZXByZXNlbnRpbmcgdGhlIG1pbnV0ZS4KCSAqCQkJCQkJCQkJQW55IHZhbHVlIGdyZWF0ZXIgdGhhbiA1OSB3aWxsIGJlIGNvbnZlcnRlZCB0byBob3VycyBhbmQgbWludXRlcy4KCSAqCQkJCQkJCQkJRm9yIGV4YW1wbGUsIFRJTUUoMCw3NTAsMCkgPSBUSU1FKDEyLDMwLDApID0gLjUyMDgzMyBvciAxMjozMCBQTS4KCSAqIEBwYXJhbQlpbnRlZ2VyCQkkc2Vjb25kCQlBIG51bWJlciBmcm9tIDAgdG8gMzI3NjcgcmVwcmVzZW50aW5nIHRoZSBzZWNvbmQuCgkgKgkJCQkJCQkJCUFueSB2YWx1ZSBncmVhdGVyIHRoYW4gNTkgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gaG91cnMsIG1pbnV0ZXMsCgkgKgkJCQkJCQkJCWFuZCBzZWNvbmRzLiBGb3IgZXhhbXBsZSwgVElNRSgwLDAsMjAwMCkgPSBUSU1FKDAsMzMsMjIpID0gLjAyMzE0OAoJICoJCQkJCQkJCQlvciAxMjozMzoyMCBBTQoJICogQHJldHVybgltaXhlZAlFeGNlbCBkYXRlL3RpbWUgc2VyaWFsIHZhbHVlLCBQSFAgZGF0ZS90aW1lIHNlcmlhbCB2YWx1ZSBvciBQSFAgZGF0ZS90aW1lIG9iamVjdCwKCSAqCQkJCQkJZGVwZW5kaW5nIG9uIHRoZSB2YWx1ZSBvZiB0aGUgUmV0dXJuRGF0ZVR5cGUgZmxhZwoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIFRJTUUoJGhvdXIgPSAwLCAkbWludXRlID0gMCwgJHNlY29uZCA9IDApIHsKCQkkaG91cgk9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlblNpbmdsZVZhbHVlKCRob3VyKTsKCQkkbWludXRlCT0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuU2luZ2xlVmFsdWUoJG1pbnV0ZSk7CgkJJHNlY29uZAk9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlblNpbmdsZVZhbHVlKCRzZWNvbmQpOwoKCQlpZiAoJGhvdXIgPT0gJycpIHsgJGhvdXIgPSAwOyB9CgkJaWYgKCRtaW51dGUgPT0gJycpIHsgJG1pbnV0ZSA9IDA7IH0KCQlpZiAoJHNlY29uZCA9PSAnJykgeyAkc2Vjb25kID0gMDsgfQoKCQlpZiAoKCFpc19udW1lcmljKCRob3VyKSkgfHwgKCFpc19udW1lcmljKCRtaW51dGUpKSB8fCAoIWlzX251bWVyaWMoJHNlY29uZCkpKSB7CgkJCXJldHVybiBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OlZBTFVFKCk7CgkJfQoJCSRob3VyCT0gKGludGVnZXIpICRob3VyOwoJCSRtaW51dGUJPSAoaW50ZWdlcikgJG1pbnV0ZTsKCQkkc2Vjb25kCT0gKGludGVnZXIpICRzZWNvbmQ7CgoJCWlmICgkc2Vjb25kIDwgMCkgewoJCQkkbWludXRlICs9IGZsb29yKCRzZWNvbmQgLyA2MCk7CgkJCSRzZWNvbmQgPSA2MCAtIGFicygkc2Vjb25kICUgNjApOwoJCQlpZiAoJHNlY29uZCA9PSA2MCkgeyAkc2Vjb25kID0gMDsgfQoJCX0gZWxzZWlmICgkc2Vjb25kID49IDYwKSB7CgkJCSRtaW51dGUgKz0gZmxvb3IoJHNlY29uZCAvIDYwKTsKCQkJJHNlY29uZCA9ICRzZWNvbmQgJSA2MDsKCQl9CgkJaWYgKCRtaW51dGUgPCAwKSB7CgkJCSRob3VyICs9IGZsb29yKCRtaW51dGUgLyA2MCk7CgkJCSRtaW51dGUgPSA2MCAtIGFicygkbWludXRlICUgNjApOwoJCQlpZiAoJG1pbnV0ZSA9PSA2MCkgeyAkbWludXRlID0gMDsgfQoJCX0gZWxzZWlmICgkbWludXRlID49IDYwKSB7CgkJCSRob3VyICs9IGZsb29yKCRtaW51dGUgLyA2MCk7CgkJCSRtaW51dGUgPSAkbWludXRlICUgNjA7CgkJfQoKCQlpZiAoJGhvdXIgPiAyMykgewoJCQkkaG91ciA9ICRob3VyICUgMjQ7CgkJfSBlbHNlaWYgKCRob3VyIDwgMCkgewoJCQlyZXR1cm4gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpOYU4oKTsKCQl9CgoJCS8vIEV4ZWN1dGUgZnVuY3Rpb24KCQlzd2l0Y2ggKFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6Z2V0UmV0dXJuRGF0ZVR5cGUoKSkgewoJCQljYXNlIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6UkVUVVJOREFURV9FWENFTCA6CgkJCQkJJGRhdGUgPSAwOwoJCQkJCSRjYWxlbmRhciA9IFBIUEV4Y2VsX1NoYXJlZF9EYXRlOjpnZXRFeGNlbENhbGVuZGFyKCk7CgkJCQkJaWYgKCRjYWxlbmRhciAhPSBQSFBFeGNlbF9TaGFyZWRfRGF0ZTo6Q0FMRU5EQVJfV0lORE9XU18xOTAwKSB7CgkJCQkJCSRkYXRlID0gMTsKCQkJCQl9CgkJCQkJcmV0dXJuIChmbG9hdCkgUEhQRXhjZWxfU2hhcmVkX0RhdGU6OkZvcm1hdHRlZFBIUFRvRXhjZWwoJGNhbGVuZGFyLCAxLCAkZGF0ZSwgJGhvdXIsICRtaW51dGUsICRzZWNvbmQpOwoJCQljYXNlIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6UkVUVVJOREFURV9QSFBfTlVNRVJJQyA6CgkJCQkJcmV0dXJuIChpbnRlZ2VyKSBQSFBFeGNlbF9TaGFyZWRfRGF0ZTo6RXhjZWxUb1BIUChQSFBFeGNlbF9TaGFyZWRfRGF0ZTo6Rm9ybWF0dGVkUEhQVG9FeGNlbCgxOTcwLCAxLCAxLCAkaG91ciwgJG1pbnV0ZSwgJHNlY29uZCkpOwkvLyAtMjE0NzQ2ODQwMDsgLy8JLTIxNDc0NzIwMDAgKyAzNjAwCgkJCWNhc2UgUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpSRVRVUk5EQVRFX1BIUF9PQkpFQ1QgOgoJCQkJCSRkYXlBZGp1c3QgPSAwOwoJCQkJCWlmICgkaG91ciA8IDApIHsKCQkJCQkJJGRheUFkanVzdCA9IGZsb29yKCRob3VyIC8gMjQpOwoJCQkJCQkkaG91ciA9IDI0IC0gYWJzKCRob3VyICUgMjQpOwoJCQkJCQlpZiAoJGhvdXIgPT0gMjQpIHsgJGhvdXIgPSAwOyB9CgkJCQkJfSBlbHNlaWYgKCRob3VyID49IDI0KSB7CgkJCQkJCSRkYXlBZGp1c3QgPSBmbG9vcigkaG91ciAvIDI0KTsKCQkJCQkJJGhvdXIgPSAkaG91ciAlIDI0OwoJCQkJCX0KCQkJCQkkcGhwRGF0ZU9iamVjdCA9IG5ldyBEYXRlVGltZSgnMTkwMC0wMS0wMSAnLiRob3VyLic6Jy4kbWludXRlLic6Jy4kc2Vjb25kKTsKCQkJCQlpZiAoJGRheUFkanVzdCAhPSAwKSB7CgkJCQkJCSRwaHBEYXRlT2JqZWN0LT5tb2RpZnkoJGRheUFkanVzdC4nIGRheXMnKTsKCQkJCQl9CgkJCQkJcmV0dXJuICRwaHBEYXRlT2JqZWN0OwoJCX0KCX0JLy8JZnVuY3Rpb24gVElNRSgpCgoKCS8qKgoJICogREFURVZBTFVFCgkgKgoJICogUmV0dXJucyBhIHZhbHVlIHRoYXQgcmVwcmVzZW50cyBhIHBhcnRpY3VsYXIgZGF0ZS4KCSAqIFVzZSBEQVRFVkFMVUUgdG8gY29udmVydCBhIGRhdGUgcmVwcmVzZW50ZWQgYnkgYSB0ZXh0IHN0cmluZyB0byBhbiBFeGNlbCBvciBQSFAgZGF0ZS90aW1lIHN0YW1wCgkgKiB2YWx1ZS4KCSAqCgkgKiBOT1RFOiBXaGVuIHVzZWQgaW4gYSBDZWxsIEZvcm11bGEsIE1TIEV4Y2VsIGNoYW5nZXMgdGhlIGNlbGwgZm9ybWF0IHNvIHRoYXQgaXQgbWF0Y2hlcyB0aGUgZGF0ZQoJICogZm9ybWF0IG9mIHlvdXIgcmVnaW9uYWwgc2V0dGluZ3MuIFBIUEV4Y2VsIGRvZXMgbm90IGNoYW5nZSBjZWxsIGZvcm1hdHRpbmcgaW4gdGhpcyB3YXkuCgkgKgoJICogRXhjZWwgRnVuY3Rpb246CgkgKgkJREFURVZBTFVFKGRhdGVWYWx1ZSkKCSAqCgkgKiBAYWNjZXNzCXB1YmxpYwoJICogQGNhdGVnb3J5IERhdGUvVGltZSBGdW5jdGlvbnMKCSAqIEBwYXJhbQlzdHJpbmcJJGRhdGVWYWx1ZQkJVGV4dCB0aGF0IHJlcHJlc2VudHMgYSBkYXRlIGluIGEgTWljcm9zb2Z0IEV4Y2VsIGRhdGUgZm9ybWF0LgoJICoJCQkJCQkJCQlGb3IgZXhhbXBsZSwgIjEvMzAvMjAwOCIgb3IgIjMwLUphbi0yMDA4IiBhcmUgdGV4dCBzdHJpbmdzIHdpdGhpbgoJICoJCQkJCQkJCQlxdW90YXRpb24gbWFya3MgdGhhdCByZXByZXNlbnQgZGF0ZXMuIFVzaW5nIHRoZSBkZWZhdWx0IGRhdGUKCSAqCQkJCQkJCQkJc3lzdGVtIGluIEV4Y2VsIGZvciBXaW5kb3dzLCBkYXRlX3RleHQgbXVzdCByZXByZXNlbnQgYSBkYXRlIGZyb20KCSAqCQkJCQkJCQkJSmFudWFyeSAxLCAxOTAwLCB0byBEZWNlbWJlciAzMSwgOTk5OS4gVXNpbmcgdGhlIGRlZmF1bHQgZGF0ZQoJICoJCQkJCQkJCQlzeXN0ZW0gaW4gRXhjZWwgZm9yIHRoZSBNYWNpbnRvc2gsIGRhdGVfdGV4dCBtdXN0IHJlcHJlc2VudCBhIGRhdGUKCSAqCQkJCQkJCQkJZnJvbSBKYW51YXJ5IDEsIDE5MDQsIHRvIERlY2VtYmVyIDMxLCA5OTk5LiBEQVRFVkFMVUUgcmV0dXJucyB0aGUKCSAqCQkJCQkJCQkJI1ZBTFVFISBlcnJvciB2YWx1ZSBpZiBkYXRlX3RleHQgaXMgb3V0IG9mIHRoaXMgcmFuZ2UuCgkgKiBAcmV0dXJuCW1peGVkCUV4Y2VsIGRhdGUvdGltZSBzZXJpYWwgdmFsdWUsIFBIUCBkYXRlL3RpbWUgc2VyaWFsIHZhbHVlIG9yIFBIUCBkYXRlL3RpbWUgb2JqZWN0LAoJICoJCQkJCQlkZXBlbmRpbmcgb24gdGhlIHZhbHVlIG9mIHRoZSBSZXR1cm5EYXRlVHlwZSBmbGFnCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gREFURVZBTFVFKCRkYXRlVmFsdWUgPSAxKSB7CgkJJGRhdGVWYWx1ZSA9IHRyaW0oUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuU2luZ2xlVmFsdWUoJGRhdGVWYWx1ZSksJyInKTsKCQkvLwlTdHJpcCBhbnkgb3JkaW5hbHMgYmVjYXVzZSB0aGV5J3JlIGFsbG93ZWQgaW4gRXhjZWwgKEVuZ2xpc2ggb25seSkKCQkkZGF0ZVZhbHVlID0gcHJlZ19yZXBsYWNlKCcvKFxkKShzdHxuZHxyZHx0aCkoWyAtXC9dKS9VaScsJyQxJDMnLCRkYXRlVmFsdWUpOwoJCS8vCUNvbnZlcnQgc2VwYXJhdG9ycyAoLyAuIG9yIHNwYWNlKSB0byBoeXBoZW5zIChzaG91bGQgYWxzbyBoYW5kbGUgZG90IHVzZWQgZm9yIG9yZGluYWxzIGluIHNvbWUgY291bnRyaWVzLCBlLmcuIERlbm1hcmssIEdlcm1hbnkpCgkJJGRhdGVWYWx1ZQk9IHN0cl9yZXBsYWNlKGFycmF5KCcvJywnLicsJy0nLCcgICcpLGFycmF5KCcgJywnICcsJyAnLCcgJyksJGRhdGVWYWx1ZSk7CgoJCSR5ZWFyRm91bmQgPSBmYWxzZTsKCQkkdDEgPSBleHBsb2RlKCcgJywkZGF0ZVZhbHVlKTsKCQlmb3JlYWNoKCR0MSBhcyAmJHQpIHsKCQkJaWYgKChpc19udW1lcmljKCR0KSkgJiYgKCR0ID4gMzEpKSB7CgkJCQlpZiAoJHllYXJGb3VuZCkgewoJCQkJCXJldHVybiBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OlZBTFVFKCk7CgkJCQl9IGVsc2UgewoJCQkJCWlmICgkdCA8IDEwMCkgeyAkdCArPSAxOTAwOyB9CgkJCQkJJHllYXJGb3VuZCA9IHRydWU7CgkJCQl9CgkJCX0KCQl9CgkJaWYgKChjb3VudCgkdDEpID09IDEpICYmIChzdHJwb3MoJHQsJzonKSAhPSBmYWxzZSkpIHsKCQkJLy8JV2UndmUgYmVlbiBmZWQgYSB0aW1lIHZhbHVlIHdpdGhvdXQgYW55IGRhdGUKCQkJcmV0dXJuIDAuMDsKCQl9IGVsc2VpZiAoY291bnQoJHQxKSA9PSAyKSB7CgkJCS8vCVdlIG9ubHkgaGF2ZSB0d28gcGFydHMgb2YgdGhlIGRhdGU6IGVpdGhlciBkYXkvbW9udGggb3IgbW9udGgveWVhcgoJCQlpZiAoJHllYXJGb3VuZCkgewoJCQkJYXJyYXlfdW5zaGlmdCgkdDEsMSk7CgkJCX0gZWxzZSB7CgkJCQlhcnJheV9wdXNoKCR0MSxkYXRlKCdZJykpOwoJCQl9CgkJfQoJCXVuc2V0KCR0KTsKCQkkZGF0ZVZhbHVlID0gaW1wbG9kZSgnICcsJHQxKTsKCgkJJFBIUERhdGVBcnJheSA9IGRhdGVfcGFyc2UoJGRhdGVWYWx1ZSk7CgkJaWYgKCgkUEhQRGF0ZUFycmF5ID09PSBGYWxzZSkgfHwgKCRQSFBEYXRlQXJyYXlbJ2Vycm9yX2NvdW50J10gPiAwKSkgewoJCQkkdGVzdFZhbDEgPSBzdHJ0b2soJGRhdGVWYWx1ZSwnLSAnKTsKCQkJaWYgKCR0ZXN0VmFsMSAhPT0gRmFsc2UpIHsKCQkJCSR0ZXN0VmFsMiA9IHN0cnRvaygnLSAnKTsKCQkJCWlmICgkdGVzdFZhbDIgIT09IEZhbHNlKSB7CgkJCQkJJHRlc3RWYWwzID0gc3RydG9rKCctICcpOwoJCQkJCWlmICgkdGVzdFZhbDMgPT09IEZhbHNlKSB7CgkJCQkJCSR0ZXN0VmFsMyA9IHN0cmZ0aW1lKCclWScpOwoJCQkJCX0KCQkJCX0gZWxzZSB7CgkJCQkJcmV0dXJuIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6VkFMVUUoKTsKCQkJCX0KCQkJfSBlbHNlIHsKCQkJCXJldHVybiBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OlZBTFVFKCk7CgkJCX0KCQkJJFBIUERhdGVBcnJheSA9IGRhdGVfcGFyc2UoJHRlc3RWYWwxLictJy4kdGVzdFZhbDIuJy0nLiR0ZXN0VmFsMyk7CgkJCWlmICgoJFBIUERhdGVBcnJheSA9PT0gRmFsc2UpIHx8ICgkUEhQRGF0ZUFycmF5WydlcnJvcl9jb3VudCddID4gMCkpIHsKCQkJCSRQSFBEYXRlQXJyYXkgPSBkYXRlX3BhcnNlKCR0ZXN0VmFsMi4nLScuJHRlc3RWYWwxLictJy4kdGVzdFZhbDMpOwoJCQkJaWYgKCgkUEhQRGF0ZUFycmF5ID09PSBGYWxzZSkgfHwgKCRQSFBEYXRlQXJyYXlbJ2Vycm9yX2NvdW50J10gPiAwKSkgewoJCQkJCXJldHVybiBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OlZBTFVFKCk7CgkJCQl9CgkJCX0KCQl9CgoJCWlmICgoJFBIUERhdGVBcnJheSAhPT0gRmFsc2UpICYmICgkUEhQRGF0ZUFycmF5WydlcnJvcl9jb3VudCddID09IDApKSB7CgkJCS8vIEV4ZWN1dGUgZnVuY3Rpb24KCQkJaWYgKCRQSFBEYXRlQXJyYXlbJ3llYXInXSA9PSAnJykJeyAkUEhQRGF0ZUFycmF5Wyd5ZWFyJ10gPSBzdHJmdGltZSgnJVknKTsgfQoJCQlpZiAoJFBIUERhdGVBcnJheVsneWVhciddIDwgMTkwMCkKCQkJCXJldHVybiBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OlZBTFVFKCk7CgkJCWlmICgkUEhQRGF0ZUFycmF5Wydtb250aCddID09ICcnKQl7ICRQSFBEYXRlQXJyYXlbJ21vbnRoJ10gPSBzdHJmdGltZSgnJW0nKTsgfQoJCQlpZiAoJFBIUERhdGVBcnJheVsnZGF5J10gPT0gJycpCQl7ICRQSFBEYXRlQXJyYXlbJ2RheSddID0gc3RyZnRpbWUoJyVkJyk7IH0KCQkJJGV4Y2VsRGF0ZVZhbHVlID0gZmxvb3IoUEhQRXhjZWxfU2hhcmVkX0RhdGU6OkZvcm1hdHRlZFBIUFRvRXhjZWwoJFBIUERhdGVBcnJheVsneWVhciddLCRQSFBEYXRlQXJyYXlbJ21vbnRoJ10sJFBIUERhdGVBcnJheVsnZGF5J10sJFBIUERhdGVBcnJheVsnaG91ciddLCRQSFBEYXRlQXJyYXlbJ21pbnV0ZSddLCRQSFBEYXRlQXJyYXlbJ3NlY29uZCddKSk7CgoJCQlzd2l0Y2ggKFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6Z2V0UmV0dXJuRGF0ZVR5cGUoKSkgewoJCQkJY2FzZSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OlJFVFVSTkRBVEVfRVhDRUwgOgoJCQkJCQlyZXR1cm4gKGZsb2F0KSAkZXhjZWxEYXRlVmFsdWU7CgkJCQljYXNlIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6UkVUVVJOREFURV9QSFBfTlVNRVJJQyA6CgkJCQkJCXJldHVybiAoaW50ZWdlcikgUEhQRXhjZWxfU2hhcmVkX0RhdGU6OkV4Y2VsVG9QSFAoJGV4Y2VsRGF0ZVZhbHVlKTsKCQkJCWNhc2UgUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpSRVRVUk5EQVRFX1BIUF9PQkpFQ1QgOgoJCQkJCQlyZXR1cm4gbmV3IERhdGVUaW1lKCRQSFBEYXRlQXJyYXlbJ3llYXInXS4nLScuJFBIUERhdGVBcnJheVsnbW9udGgnXS4nLScuJFBIUERhdGVBcnJheVsnZGF5J10uJyAwMDowMDowMCcpOwoJCQl9CgkJfQoJCXJldHVybiBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OlZBTFVFKCk7Cgl9CS8vCWZ1bmN0aW9uIERBVEVWQUxVRSgpCgoKCS8qKgoJICogVElNRVZBTFVFCgkgKgoJICogUmV0dXJucyBhIHZhbHVlIHRoYXQgcmVwcmVzZW50cyBhIHBhcnRpY3VsYXIgdGltZS4KCSAqIFVzZSBUSU1FVkFMVUUgdG8gY29udmVydCBhIHRpbWUgcmVwcmVzZW50ZWQgYnkgYSB0ZXh0IHN0cmluZyB0byBhbiBFeGNlbCBvciBQSFAgZGF0ZS90aW1lIHN0YW1wCgkgKiB2YWx1ZS4KCSAqCgkgKiBOT1RFOiBXaGVuIHVzZWQgaW4gYSBDZWxsIEZvcm11bGEsIE1TIEV4Y2VsIGNoYW5nZXMgdGhlIGNlbGwgZm9ybWF0IHNvIHRoYXQgaXQgbWF0Y2hlcyB0aGUgdGltZQoJICogZm9ybWF0IG9mIHlvdXIgcmVnaW9uYWwgc2V0dGluZ3MuIFBIUEV4Y2VsIGRvZXMgbm90IGNoYW5nZSBjZWxsIGZvcm1hdHRpbmcgaW4gdGhpcyB3YXkuCgkgKgoJICogRXhjZWwgRnVuY3Rpb246CgkgKgkJVElNRVZBTFVFKHRpbWVWYWx1ZSkKCSAqCgkgKiBAYWNjZXNzCXB1YmxpYwoJICogQGNhdGVnb3J5IERhdGUvVGltZSBGdW5jdGlvbnMKCSAqIEBwYXJhbQlzdHJpbmcJJHRpbWVWYWx1ZQkJQSB0ZXh0IHN0cmluZyB0aGF0IHJlcHJlc2VudHMgYSB0aW1lIGluIGFueSBvbmUgb2YgdGhlIE1pY3Jvc29mdAoJICoJCQkJCQkJCQlFeGNlbCB0aW1lIGZvcm1hdHM7IGZvciBleGFtcGxlLCAiNjo0NSBQTSIgYW5kICIxODo0NSIgdGV4dCBzdHJpbmdzCgkgKgkJCQkJCQkJCXdpdGhpbiBxdW90YXRpb24gbWFya3MgdGhhdCByZXByZXNlbnQgdGltZS4KCSAqCQkJCQkJCQkJRGF0ZSBpbmZvcm1hdGlvbiBpbiB0aW1lX3RleHQgaXMgaWdub3JlZC4KCSAqIEByZXR1cm4JbWl4ZWQJRXhjZWwgZGF0ZS90aW1lIHNlcmlhbCB2YWx1ZSwgUEhQIGRhdGUvdGltZSBzZXJpYWwgdmFsdWUgb3IgUEhQIGRhdGUvdGltZSBvYmplY3QsCgkgKgkJCQkJCWRlcGVuZGluZyBvbiB0aGUgdmFsdWUgb2YgdGhlIFJldHVybkRhdGVUeXBlIGZsYWcKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBUSU1FVkFMVUUoJHRpbWVWYWx1ZSkgewoJCSR0aW1lVmFsdWUgPSB0cmltKFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlblNpbmdsZVZhbHVlKCR0aW1lVmFsdWUpLCciJyk7CgkJJHRpbWVWYWx1ZQk9IHN0cl9yZXBsYWNlKGFycmF5KCcvJywnLicpLGFycmF5KCctJywnLScpLCR0aW1lVmFsdWUpOwoKCQkkUEhQRGF0ZUFycmF5ID0gZGF0ZV9wYXJzZSgkdGltZVZhbHVlKTsKCQlpZiAoKCRQSFBEYXRlQXJyYXkgIT09IEZhbHNlKSAmJiAoJFBIUERhdGVBcnJheVsnZXJyb3JfY291bnQnXSA9PSAwKSkgewoJCQlpZiAoUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpnZXRDb21wYXRpYmlsaXR5TW9kZSgpID09IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6Q09NUEFUSUJJTElUWV9PUEVOT0ZGSUNFKSB7CgkJCQkkZXhjZWxEYXRlVmFsdWUgPSBQSFBFeGNlbF9TaGFyZWRfRGF0ZTo6Rm9ybWF0dGVkUEhQVG9FeGNlbCgkUEhQRGF0ZUFycmF5Wyd5ZWFyJ10sJFBIUERhdGVBcnJheVsnbW9udGgnXSwkUEhQRGF0ZUFycmF5WydkYXknXSwkUEhQRGF0ZUFycmF5Wydob3VyJ10sJFBIUERhdGVBcnJheVsnbWludXRlJ10sJFBIUERhdGVBcnJheVsnc2Vjb25kJ10pOwoJCQl9IGVsc2UgewoJCQkJJGV4Y2VsRGF0ZVZhbHVlID0gUEhQRXhjZWxfU2hhcmVkX0RhdGU6OkZvcm1hdHRlZFBIUFRvRXhjZWwoMTkwMCwxLDEsJFBIUERhdGVBcnJheVsnaG91ciddLCRQSFBEYXRlQXJyYXlbJ21pbnV0ZSddLCRQSFBEYXRlQXJyYXlbJ3NlY29uZCddKSAtIDE7CgkJCX0KCgkJCXN3aXRjaCAoUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpnZXRSZXR1cm5EYXRlVHlwZSgpKSB7CgkJCQljYXNlIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6UkVUVVJOREFURV9FWENFTCA6CgkJCQkJCXJldHVybiAoZmxvYXQpICRleGNlbERhdGVWYWx1ZTsKCQkJCWNhc2UgUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpSRVRVUk5EQVRFX1BIUF9OVU1FUklDIDoKCQkJCQkJcmV0dXJuIChpbnRlZ2VyKSAkcGhwRGF0ZVZhbHVlID0gUEhQRXhjZWxfU2hhcmVkX0RhdGU6OkV4Y2VsVG9QSFAoJGV4Y2VsRGF0ZVZhbHVlKzI1NTY5KSAtIDM2MDA7OwoJCQkJY2FzZSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OlJFVFVSTkRBVEVfUEhQX09CSkVDVCA6CgkJCQkJCXJldHVybiBuZXcgRGF0ZVRpbWUoJzE5MDAtMDEtMDEgJy4kUEhQRGF0ZUFycmF5Wydob3VyJ10uJzonLiRQSFBEYXRlQXJyYXlbJ21pbnV0ZSddLic6Jy4kUEhQRGF0ZUFycmF5WydzZWNvbmQnXSk7CgkJCX0KCQl9CgkJcmV0dXJuIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6VkFMVUUoKTsKCX0JLy8JZnVuY3Rpb24gVElNRVZBTFVFKCkKCgoJLyoqCgkgKiBEQVRFRElGCgkgKgoJICogQHBhcmFtCW1peGVkCSRzdGFydERhdGUJCUV4Y2VsIGRhdGUgc2VyaWFsIHZhbHVlLCBQSFAgZGF0ZS90aW1lIHN0YW1wLCBQSFAgRGF0ZVRpbWUgb2JqZWN0CgkgKgkJCQkJCQkJCW9yIGEgc3RhbmRhcmQgZGF0ZSBzdHJpbmcKCSAqIEBwYXJhbQltaXhlZAkkZW5kRGF0ZQkJRXhjZWwgZGF0ZSBzZXJpYWwgdmFsdWUsIFBIUCBkYXRlL3RpbWUgc3RhbXAsIFBIUCBEYXRlVGltZSBvYmplY3QKCSAqCQkJCQkJCQkJb3IgYSBzdGFuZGFyZCBkYXRlIHN0cmluZwoJICogQHBhcmFtCXN0cmluZwkkdW5pdAoJICogQHJldHVybglpbnRlZ2VyCUludGVydmFsIGJldHdlZW4gdGhlIGRhdGVzCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gREFURURJRigkc3RhcnREYXRlID0gMCwgJGVuZERhdGUgPSAwLCAkdW5pdCA9ICdEJykgewoJCSRzdGFydERhdGUJPSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5TaW5nbGVWYWx1ZSgkc3RhcnREYXRlKTsKCQkkZW5kRGF0ZQk9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlblNpbmdsZVZhbHVlKCRlbmREYXRlKTsKCQkkdW5pdAkJPSBzdHJ0b3VwcGVyKFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlblNpbmdsZVZhbHVlKCR1bml0KSk7CgoJCWlmIChpc19zdHJpbmcoJHN0YXJ0RGF0ZSA9IHNlbGY6Ol9nZXREYXRlVmFsdWUoJHN0YXJ0RGF0ZSkpKSB7CgkJCXJldHVybiBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OlZBTFVFKCk7CgkJfQoJCWlmIChpc19zdHJpbmcoJGVuZERhdGUgPSBzZWxmOjpfZ2V0RGF0ZVZhbHVlKCRlbmREYXRlKSkpIHsKCQkJcmV0dXJuIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6VkFMVUUoKTsKCQl9CgoJCS8vIFZhbGlkYXRlIHBhcmFtZXRlcnMKCQlpZiAoJHN0YXJ0RGF0ZSA+PSAkZW5kRGF0ZSkgewoJCQlyZXR1cm4gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpOYU4oKTsKCQl9CgoJCS8vIEV4ZWN1dGUgZnVuY3Rpb24KCQkkZGlmZmVyZW5jZSA9ICRlbmREYXRlIC0gJHN0YXJ0RGF0ZTsKCgkJJFBIUFN0YXJ0RGF0ZU9iamVjdCA9IFBIUEV4Y2VsX1NoYXJlZF9EYXRlOjpFeGNlbFRvUEhQT2JqZWN0KCRzdGFydERhdGUpOwoJCSRzdGFydERheXMgPSAkUEhQU3RhcnREYXRlT2JqZWN0LT5mb3JtYXQoJ2onKTsKCQkkc3RhcnRNb250aHMgPSAkUEhQU3RhcnREYXRlT2JqZWN0LT5mb3JtYXQoJ24nKTsKCQkkc3RhcnRZZWFycyA9ICRQSFBTdGFydERhdGVPYmplY3QtPmZvcm1hdCgnWScpOwoKCQkkUEhQRW5kRGF0ZU9iamVjdCA9IFBIUEV4Y2VsX1NoYXJlZF9EYXRlOjpFeGNlbFRvUEhQT2JqZWN0KCRlbmREYXRlKTsKCQkkZW5kRGF5cyA9ICRQSFBFbmREYXRlT2JqZWN0LT5mb3JtYXQoJ2onKTsKCQkkZW5kTW9udGhzID0gJFBIUEVuZERhdGVPYmplY3QtPmZvcm1hdCgnbicpOwoJCSRlbmRZZWFycyA9ICRQSFBFbmREYXRlT2JqZWN0LT5mb3JtYXQoJ1knKTsKCgkJJHJldFZhbCA9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6TmFOKCk7CgkJc3dpdGNoICgkdW5pdCkgewoJCQljYXNlICdEJzoKCQkJCSRyZXRWYWwgPSBpbnR2YWwoJGRpZmZlcmVuY2UpOwoJCQkJYnJlYWs7CgkJCWNhc2UgJ00nOgoJCQkJJHJldFZhbCA9IGludHZhbCgkZW5kTW9udGhzIC0gJHN0YXJ0TW9udGhzKSArIChpbnR2YWwoJGVuZFllYXJzIC0gJHN0YXJ0WWVhcnMpICogMTIpOwoJCQkJLy8JV2UncmUgb25seSBpbnRlcmVzdGVkIGluIGZ1bGwgbW9udGhzCgkJCQlpZiAoJGVuZERheXMgPCAkc3RhcnREYXlzKSB7CgkJCQkJLS0kcmV0VmFsOwoJCQkJfQoJCQkJYnJlYWs7CgkJCWNhc2UgJ1knOgoJCQkJJHJldFZhbCA9IGludHZhbCgkZW5kWWVhcnMgLSAkc3RhcnRZZWFycyk7CgkJCQkvLwlXZSdyZSBvbmx5IGludGVyZXN0ZWQgaW4gZnVsbCBtb250aHMKCQkJCWlmICgkZW5kTW9udGhzIDwgJHN0YXJ0TW9udGhzKSB7CgkJCQkJLS0kcmV0VmFsOwoJCQkJfSBlbHNlaWYgKCgkZW5kTW9udGhzID09ICRzdGFydE1vbnRocykgJiYgKCRlbmREYXlzIDwgJHN0YXJ0RGF5cykpIHsKCQkJCQktLSRyZXRWYWw7CgkJCQl9CgkJCQlicmVhazsKCQkJY2FzZSAnTUQnOgoJCQkJaWYgKCRlbmREYXlzIDwgJHN0YXJ0RGF5cykgewoJCQkJCSRyZXRWYWwgPSAkZW5kRGF5czsKCQkJCQkkUEhQRW5kRGF0ZU9iamVjdC0+bW9kaWZ5KCctJy4kZW5kRGF5cy4nIGRheXMnKTsKCQkJCQkkYWRqdXN0RGF5cyA9ICRQSFBFbmREYXRlT2JqZWN0LT5mb3JtYXQoJ2onKTsKCQkJCQlpZiAoJGFkanVzdERheXMgPiAkc3RhcnREYXlzKSB7CgkJCQkJCSRyZXRWYWwgKz0gKCRhZGp1c3REYXlzIC0gJHN0YXJ0RGF5cyk7CgkJCQkJfQoJCQkJfSBlbHNlIHsKCQkJCQkkcmV0VmFsID0gJGVuZERheXMgLSAkc3RhcnREYXlzOwoJCQkJfQoJCQkJYnJlYWs7CgkJCWNhc2UgJ1lNJzoKCQkJCSRyZXRWYWwgPSBpbnR2YWwoJGVuZE1vbnRocyAtICRzdGFydE1vbnRocyk7CgkJCQlpZiAoJHJldFZhbCA8IDApICRyZXRWYWwgPSAxMiArICRyZXRWYWw7CgkJCQkvLwlXZSdyZSBvbmx5IGludGVyZXN0ZWQgaW4gZnVsbCBtb250aHMKCQkJCWlmICgkZW5kRGF5cyA8ICRzdGFydERheXMpIHsKCQkJCQktLSRyZXRWYWw7CgkJCQl9CgkJCQlicmVhazsKCQkJY2FzZSAnWUQnOgoJCQkJJHJldFZhbCA9IGludHZhbCgkZGlmZmVyZW5jZSk7CgkJCQlpZiAoJGVuZFllYXJzID4gJHN0YXJ0WWVhcnMpIHsKCQkJCQl3aGlsZSAoJGVuZFllYXJzID4gJHN0YXJ0WWVhcnMpIHsKCQkJCQkJJFBIUEVuZERhdGVPYmplY3QtPm1vZGlmeSgnLTEgeWVhcicpOwoJCQkJCQkkZW5kWWVhcnMgPSAkUEhQRW5kRGF0ZU9iamVjdC0+Zm9ybWF0KCdZJyk7CgkJCQkJfQoJCQkJCSRyZXRWYWwgPSAkUEhQRW5kRGF0ZU9iamVjdC0+Zm9ybWF0KCd6JykgLSAkUEhQU3RhcnREYXRlT2JqZWN0LT5mb3JtYXQoJ3onKTsKCQkJCQlpZiAoJHJldFZhbCA8IDApIHsgJHJldFZhbCArPSAzNjU7IH0KCQkJCX0KCQkJCWJyZWFrOwoJCQlkZWZhdWx0OgoJCQkJJHJldFZhbCA9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6TmFOKCk7CgkJfQoJCXJldHVybiAkcmV0VmFsOwoJfQkvLwlmdW5jdGlvbiBEQVRFRElGKCkKCgoJLyoqCgkgKiBEQVlTMzYwCgkgKgoJICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGRheXMgYmV0d2VlbiB0d28gZGF0ZXMgYmFzZWQgb24gYSAzNjAtZGF5IHllYXIgKHR3ZWx2ZSAzMC1kYXkgbW9udGhzKSwKCSAqIHdoaWNoIGlzIHVzZWQgaW4gc29tZSBhY2NvdW50aW5nIGNhbGN1bGF0aW9ucy4gVXNlIHRoaXMgZnVuY3Rpb24gdG8gaGVscCBjb21wdXRlIHBheW1lbnRzIGlmCgkgKiB5b3VyIGFjY291bnRpbmcgc3lzdGVtIGlzIGJhc2VkIG9uIHR3ZWx2ZSAzMC1kYXkgbW9udGhzLgoJICoKCSAqIEV4Y2VsIEZ1bmN0aW9uOgoJICoJCURBWVMzNjAoc3RhcnREYXRlLGVuZERhdGVbLG1ldGhvZF0pCgkgKgoJICogQGFjY2VzcwlwdWJsaWMKCSAqIEBjYXRlZ29yeSBEYXRlL1RpbWUgRnVuY3Rpb25zCgkgKiBAcGFyYW0JbWl4ZWQJCSRzdGFydERhdGUJCUV4Y2VsIGRhdGUgc2VyaWFsIHZhbHVlIChmbG9hdCksIFBIUCBkYXRlIHRpbWVzdGFtcCAoaW50ZWdlciksCgkgKgkJCQkJCQkJCQlQSFAgRGF0ZVRpbWUgb2JqZWN0LCBvciBhIHN0YW5kYXJkIGRhdGUgc3RyaW5nCgkgKiBAcGFyYW0JbWl4ZWQJCSRlbmREYXRlCQlFeGNlbCBkYXRlIHNlcmlhbCB2YWx1ZSAoZmxvYXQpLCBQSFAgZGF0ZSB0aW1lc3RhbXAgKGludGVnZXIpLAoJICoJCQkJCQkJCQkJUEhQIERhdGVUaW1lIG9iamVjdCwgb3IgYSBzdGFuZGFyZCBkYXRlIHN0cmluZwoJICogQHBhcmFtCWJvb2xlYW4JCSRtZXRob2QJCQlVUyBvciBFdXJvcGVhbiBNZXRob2QKCSAqCQkJCQkJCQkJCUZBTFNFIG9yIG9taXR0ZWQ6IFUuUy4gKE5BU0QpIG1ldGhvZC4gSWYgdGhlIHN0YXJ0aW5nIGRhdGUgaXMKCSAqCQkJCQkJCQkJCXRoZSBsYXN0IGRheSBvZiBhIG1vbnRoLCBpdCBiZWNvbWVzIGVxdWFsIHRvIHRoZSAzMHRoIG9mIHRoZQoJICoJCQkJCQkJCQkJc2FtZSBtb250aC4gSWYgdGhlIGVuZGluZyBkYXRlIGlzIHRoZSBsYXN0IGRheSBvZiBhIG1vbnRoIGFuZAoJICoJCQkJCQkJCQkJdGhlIHN0YXJ0aW5nIGRhdGUgaXMgZWFybGllciB0aGFuIHRoZSAzMHRoIG9mIGEgbW9udGgsIHRoZQoJICoJCQkJCQkJCQkJZW5kaW5nIGRhdGUgYmVjb21lcyBlcXVhbCB0byB0aGUgMXN0IG9mIHRoZSBuZXh0IG1vbnRoOwoJICoJCQkJCQkJCQkJb3RoZXJ3aXNlIHRoZSBlbmRpbmcgZGF0ZSBiZWNvbWVzIGVxdWFsIHRvIHRoZSAzMHRoIG9mIHRoZQoJICoJCQkJCQkJCQkJc2FtZSBtb250aC4KCSAqCQkJCQkJCQkJCVRSVUU6IEV1cm9wZWFuIG1ldGhvZC4gU3RhcnRpbmcgZGF0ZXMgYW5kIGVuZGluZyBkYXRlcyB0aGF0CgkgKgkJCQkJCQkJCQlvY2N1ciBvbiB0aGUgMzFzdCBvZiBhIG1vbnRoIGJlY29tZSBlcXVhbCB0byB0aGUgMzB0aCBvZiB0aGUKCSAqCQkJCQkJCQkJCXNhbWUgbW9udGguCgkgKiBAcmV0dXJuCWludGVnZXIJCU51bWJlciBvZiBkYXlzIGJldHdlZW4gc3RhcnQgZGF0ZSBhbmQgZW5kIGRhdGUKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBEQVlTMzYwKCRzdGFydERhdGUgPSAwLCAkZW5kRGF0ZSA9IDAsICRtZXRob2QgPSBmYWxzZSkgewoJCSRzdGFydERhdGUJPSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5TaW5nbGVWYWx1ZSgkc3RhcnREYXRlKTsKCQkkZW5kRGF0ZQk9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlblNpbmdsZVZhbHVlKCRlbmREYXRlKTsKCgkJaWYgKGlzX3N0cmluZygkc3RhcnREYXRlID0gc2VsZjo6X2dldERhdGVWYWx1ZSgkc3RhcnREYXRlKSkpIHsKCQkJcmV0dXJuIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6VkFMVUUoKTsKCQl9CgkJaWYgKGlzX3N0cmluZygkZW5kRGF0ZSA9IHNlbGY6Ol9nZXREYXRlVmFsdWUoJGVuZERhdGUpKSkgewoJCQlyZXR1cm4gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpWQUxVRSgpOwoJCX0KCgkJLy8gRXhlY3V0ZSBmdW5jdGlvbgoJCSRQSFBTdGFydERhdGVPYmplY3QgPSBQSFBFeGNlbF9TaGFyZWRfRGF0ZTo6RXhjZWxUb1BIUE9iamVjdCgkc3RhcnREYXRlKTsKCQkkc3RhcnREYXkgPSAkUEhQU3RhcnREYXRlT2JqZWN0LT5mb3JtYXQoJ2onKTsKCQkkc3RhcnRNb250aCA9ICRQSFBTdGFydERhdGVPYmplY3QtPmZvcm1hdCgnbicpOwoJCSRzdGFydFllYXIgPSAkUEhQU3RhcnREYXRlT2JqZWN0LT5mb3JtYXQoJ1knKTsKCgkJJFBIUEVuZERhdGVPYmplY3QgPSBQSFBFeGNlbF9TaGFyZWRfRGF0ZTo6RXhjZWxUb1BIUE9iamVjdCgkZW5kRGF0ZSk7CgkJJGVuZERheSA9ICRQSFBFbmREYXRlT2JqZWN0LT5mb3JtYXQoJ2onKTsKCQkkZW5kTW9udGggPSAkUEhQRW5kRGF0ZU9iamVjdC0+Zm9ybWF0KCduJyk7CgkJJGVuZFllYXIgPSAkUEhQRW5kRGF0ZU9iamVjdC0+Zm9ybWF0KCdZJyk7CgoJCXJldHVybiBzZWxmOjpfZGF0ZURpZmYzNjAoJHN0YXJ0RGF5LCAkc3RhcnRNb250aCwgJHN0YXJ0WWVhciwgJGVuZERheSwgJGVuZE1vbnRoLCAkZW5kWWVhciwgISRtZXRob2QpOwoJfQkvLwlmdW5jdGlvbiBEQVlTMzYwKCkKCgoJLyoqCgkgKiBZRUFSRlJBQwoJICoKCSAqIENhbGN1bGF0ZXMgdGhlIGZyYWN0aW9uIG9mIHRoZSB5ZWFyIHJlcHJlc2VudGVkIGJ5IHRoZSBudW1iZXIgb2Ygd2hvbGUgZGF5cyBiZXR3ZWVuIHR3byBkYXRlcwoJICogKHRoZSBzdGFydF9kYXRlIGFuZCB0aGUgZW5kX2RhdGUpLgoJICogVXNlIHRoZSBZRUFSRlJBQyB3b3Jrc2hlZXQgZnVuY3Rpb24gdG8gaWRlbnRpZnkgdGhlIHByb3BvcnRpb24gb2YgYSB3aG9sZSB5ZWFyJ3MgYmVuZWZpdHMgb3IKCSAqIG9ibGlnYXRpb25zIHRvIGFzc2lnbiB0byBhIHNwZWNpZmljIHRlcm0uCgkgKgoJICogRXhjZWwgRnVuY3Rpb246CgkgKgkJWUVBUkZSQUMoc3RhcnREYXRlLGVuZERhdGVbLG1ldGhvZF0pCgkgKgoJICogQGFjY2VzcwlwdWJsaWMKCSAqIEBjYXRlZ29yeSBEYXRlL1RpbWUgRnVuY3Rpb25zCgkgKiBAcGFyYW0JbWl4ZWQJJHN0YXJ0RGF0ZQkJRXhjZWwgZGF0ZSBzZXJpYWwgdmFsdWUgKGZsb2F0KSwgUEhQIGRhdGUgdGltZXN0YW1wIChpbnRlZ2VyKSwKCSAqCQkJCQkJCQkJUEhQIERhdGVUaW1lIG9iamVjdCwgb3IgYSBzdGFuZGFyZCBkYXRlIHN0cmluZwoJICogQHBhcmFtCW1peGVkCSRlbmREYXRlCQlFeGNlbCBkYXRlIHNlcmlhbCB2YWx1ZSAoZmxvYXQpLCBQSFAgZGF0ZSB0aW1lc3RhbXAgKGludGVnZXIpLAoJICoJCQkJCQkJCQlQSFAgRGF0ZVRpbWUgb2JqZWN0LCBvciBhIHN0YW5kYXJkIGRhdGUgc3RyaW5nCgkgKiBAcGFyYW0JaW50ZWdlcgkkbWV0aG9kCQkJTWV0aG9kIHVzZWQgZm9yIHRoZSBjYWxjdWxhdGlvbgoJICoJCQkJCQkJCQkJMCBvciBvbWl0dGVkCVVTIChOQVNEKSAzMC8zNjAKCSAqCQkJCQkJCQkJCTEJCQkJQWN0dWFsL2FjdHVhbAoJICoJCQkJCQkJCQkJMgkJCQlBY3R1YWwvMzYwCgkgKgkJCQkJCQkJCQkzCQkJCUFjdHVhbC8zNjUKCSAqCQkJCQkJCQkJCTQJCQkJRXVyb3BlYW4gMzAvMzYwCgkgKiBAcmV0dXJuCWZsb2F0CWZyYWN0aW9uIG9mIHRoZSB5ZWFyCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gWUVBUkZSQUMoJHN0YXJ0RGF0ZSA9IDAsICRlbmREYXRlID0gMCwgJG1ldGhvZCA9IDApIHsKCQkkc3RhcnREYXRlCT0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuU2luZ2xlVmFsdWUoJHN0YXJ0RGF0ZSk7CgkJJGVuZERhdGUJPSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5TaW5nbGVWYWx1ZSgkZW5kRGF0ZSk7CgkJJG1ldGhvZAkJPSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5TaW5nbGVWYWx1ZSgkbWV0aG9kKTsKCgkJaWYgKGlzX3N0cmluZygkc3RhcnREYXRlID0gc2VsZjo6X2dldERhdGVWYWx1ZSgkc3RhcnREYXRlKSkpIHsKCQkJcmV0dXJuIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6VkFMVUUoKTsKCQl9CgkJaWYgKGlzX3N0cmluZygkZW5kRGF0ZSA9IHNlbGY6Ol9nZXREYXRlVmFsdWUoJGVuZERhdGUpKSkgewoJCQlyZXR1cm4gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpWQUxVRSgpOwoJCX0KCgkJaWYgKCgoaXNfbnVtZXJpYygkbWV0aG9kKSkgJiYgKCFpc19zdHJpbmcoJG1ldGhvZCkpKSB8fCAoJG1ldGhvZCA9PSAnJykpIHsKCQkJc3dpdGNoKCRtZXRob2QpIHsKCQkJCWNhc2UgMAk6CgkJCQkJcmV0dXJuIHNlbGY6OkRBWVMzNjAoJHN0YXJ0RGF0ZSwkZW5kRGF0ZSkgLyAzNjA7CgkJCQljYXNlIDEJOgoJCQkJCSRkYXlzID0gc2VsZjo6REFURURJRigkc3RhcnREYXRlLCRlbmREYXRlKTsKCQkJCQkkc3RhcnRZZWFyID0gc2VsZjo6WUVBUigkc3RhcnREYXRlKTsKCQkJCQkkZW5kWWVhciA9IHNlbGY6OllFQVIoJGVuZERhdGUpOwoJCQkJCSR5ZWFycyA9ICRlbmRZZWFyIC0gJHN0YXJ0WWVhciArIDE7CgkJCQkJJGxlYXBEYXlzID0gMDsKCQkJCQlpZiAoJHllYXJzID09IDEpIHsKCQkJCQkJaWYgKHNlbGY6Ol9pc0xlYXBZZWFyKCRlbmRZZWFyKSkgewoJCQkJCQkJJHN0YXJ0TW9udGggPSBzZWxmOjpNT05USE9GWUVBUigkc3RhcnREYXRlKTsKCQkJCQkJCSRlbmRNb250aCA9IHNlbGY6Ok1PTlRIT0ZZRUFSKCRlbmREYXRlKTsKCQkJCQkJCSRlbmREYXkgPSBzZWxmOjpEQVlPRk1PTlRIKCRlbmREYXRlKTsKCQkJCQkJCWlmICgoJHN0YXJ0TW9udGggPCAzKSB8fAoJCQkJCQkJCSgoJGVuZE1vbnRoICogMTAwICsgJGVuZERheSkgPj0gKDIgKiAxMDAgKyAyOSkpKSB7CgkJCQkgICAgIAkJCSRsZWFwRGF5cyArPSAxOwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJfSBlbHNlIHsKCQkJCQkJZm9yKCR5ZWFyID0gJHN0YXJ0WWVhcjsgJHllYXIgPD0gJGVuZFllYXI7ICsrJHllYXIpIHsKCQkJCQkJCWlmICgkeWVhciA9PSAkc3RhcnRZZWFyKSB7CgkJCQkJCQkJJHN0YXJ0TW9udGggPSBzZWxmOjpNT05USE9GWUVBUigkc3RhcnREYXRlKTsKCQkJCQkJCQkkc3RhcnREYXkgPSBzZWxmOjpEQVlPRk1PTlRIKCRzdGFydERhdGUpOwoJCQkJCQkJCWlmICgkc3RhcnRNb250aCA8IDMpIHsKCQkJCQkJCQkJJGxlYXBEYXlzICs9IChzZWxmOjpfaXNMZWFwWWVhcigkeWVhcikpID8gMSA6IDA7CgkJCQkJCQkJfQoJCQkJCQkJfSBlbHNlaWYoJHllYXIgPT0gJGVuZFllYXIpIHsKCQkJCQkJCQkkZW5kTW9udGggPSBzZWxmOjpNT05USE9GWUVBUigkZW5kRGF0ZSk7CgkJCQkJCQkJJGVuZERheSA9IHNlbGY6OkRBWU9GTU9OVEgoJGVuZERhdGUpOwoJCQkJCQkJCWlmICgoJGVuZE1vbnRoICogMTAwICsgJGVuZERheSkgPj0gKDIgKiAxMDAgKyAyOSkpIHsKCQkJCQkJCQkJJGxlYXBEYXlzICs9IChzZWxmOjpfaXNMZWFwWWVhcigkeWVhcikpID8gMSA6IDA7CgkJCQkJCQkJfQoJCQkJCQkJfSBlbHNlIHsKCQkJCQkJCQkkbGVhcERheXMgKz0gKHNlbGY6Ol9pc0xlYXBZZWFyKCR5ZWFyKSkgPyAxIDogMDsKCQkJCQkJCX0KCQkJCQkJfQoJCQkJCQlpZiAoJHllYXJzID09IDIpIHsKCQkJCQkJCWlmICgoJGxlYXBEYXlzID09IDApICYmIChzZWxmOjpfaXNMZWFwWWVhcigkc3RhcnRZZWFyKSkgJiYgKCRkYXlzID4gMzY1KSkgewoJCQkJCQkJCSRsZWFwRGF5cyA9IDE7CgkJCQkJCQl9IGVsc2VpZiAoJGRheXMgPCAzNjYpIHsKCQkJCQkJCQkkeWVhcnMgPSAxOwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJCSRsZWFwRGF5cyAvPSAkeWVhcnM7CgkJCQkJfQoJCQkJCXJldHVybiAkZGF5cyAvICgzNjUgKyAkbGVhcERheXMpOwoJCQkJY2FzZSAyCToKCQkJCQlyZXR1cm4gc2VsZjo6REFURURJRigkc3RhcnREYXRlLCRlbmREYXRlKSAvIDM2MDsKCQkJCWNhc2UgMwk6CgkJCQkJcmV0dXJuIHNlbGY6OkRBVEVESUYoJHN0YXJ0RGF0ZSwkZW5kRGF0ZSkgLyAzNjU7CgkJCQljYXNlIDQJOgoJCQkJCXJldHVybiBzZWxmOjpEQVlTMzYwKCRzdGFydERhdGUsJGVuZERhdGUsVHJ1ZSkgLyAzNjA7CgkJCX0KCQl9CgkJcmV0dXJuIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6VkFMVUUoKTsKCX0JLy8JZnVuY3Rpb24gWUVBUkZSQUMoKQoKCgkvKioKCSAqIE5FVFdPUktEQVlTCgkgKgoJICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIHdob2xlIHdvcmtpbmcgZGF5cyBiZXR3ZWVuIHN0YXJ0X2RhdGUgYW5kIGVuZF9kYXRlLiBXb3JraW5nIGRheXMKCSAqIGV4Y2x1ZGUgd2Vla2VuZHMgYW5kIGFueSBkYXRlcyBpZGVudGlmaWVkIGluIGhvbGlkYXlzLgoJICogVXNlIE5FVFdPUktEQVlTIHRvIGNhbGN1bGF0ZSBlbXBsb3llZSBiZW5lZml0cyB0aGF0IGFjY3J1ZSBiYXNlZCBvbiB0aGUgbnVtYmVyIG9mIGRheXMKCSAqIHdvcmtlZCBkdXJpbmcgYSBzcGVjaWZpYyB0ZXJtLgoJICoKCSAqIEV4Y2VsIEZ1bmN0aW9uOgoJICoJCU5FVFdPUktEQVlTKHN0YXJ0RGF0ZSxlbmREYXRlWyxob2xpZGF5c1ssaG9saWRheVssLi4uXV1dKQoJICoKCSAqIEBhY2Nlc3MJcHVibGljCgkgKiBAY2F0ZWdvcnkgRGF0ZS9UaW1lIEZ1bmN0aW9ucwoJICogQHBhcmFtCW1peGVkCQkJJHN0YXJ0RGF0ZQkJRXhjZWwgZGF0ZSBzZXJpYWwgdmFsdWUgKGZsb2F0KSwgUEhQIGRhdGUgdGltZXN0YW1wIChpbnRlZ2VyKSwKCSAqCQkJCQkJCQkJCQlQSFAgRGF0ZVRpbWUgb2JqZWN0LCBvciBhIHN0YW5kYXJkIGRhdGUgc3RyaW5nCgkgKiBAcGFyYW0JbWl4ZWQJCQkkZW5kRGF0ZQkJRXhjZWwgZGF0ZSBzZXJpYWwgdmFsdWUgKGZsb2F0KSwgUEhQIGRhdGUgdGltZXN0YW1wIChpbnRlZ2VyKSwKCSAqCQkJCQkJCQkJCQlQSFAgRGF0ZVRpbWUgb2JqZWN0LCBvciBhIHN0YW5kYXJkIGRhdGUgc3RyaW5nCgkgKiBAcGFyYW0JbWl4ZWQJCQkkaG9saWRheXMsLi4uCU9wdGlvbmFsIHNlcmllcyBvZiBFeGNlbCBkYXRlIHNlcmlhbCB2YWx1ZSAoZmxvYXQpLCBQSFAgZGF0ZQoJICoJCQkJCQkJCQkJCXRpbWVzdGFtcCAoaW50ZWdlciksIFBIUCBEYXRlVGltZSBvYmplY3QsIG9yIGEgc3RhbmRhcmQgZGF0ZQoJICoJCQkJCQkJCQkJCXN0cmluZ3MgdGhhdCB3aWxsIGJlIGV4Y2x1ZGVkIGZyb20gdGhlIHdvcmtpbmcgY2FsZW5kYXIsIHN1Y2gKCSAqCQkJCQkJCQkJCQlhcyBzdGF0ZSBhbmQgZmVkZXJhbCBob2xpZGF5cyBhbmQgZmxvYXRpbmcgaG9saWRheXMuCgkgKiBAcmV0dXJuCWludGVnZXIJCQlJbnRlcnZhbCBiZXR3ZWVuIHRoZSBkYXRlcwoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIE5FVFdPUktEQVlTKCRzdGFydERhdGUsJGVuZERhdGUpIHsKCQkvLwlSZXRyaWV2ZSB0aGUgbWFuZGF0b3J5IHN0YXJ0IGFuZCBlbmQgZGF0ZSB0aGF0IGFyZSByZWZlcmVuY2VkIGluIHRoZSBmdW5jdGlvbiBkZWZpbml0aW9uCgkJJHN0YXJ0RGF0ZQk9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlblNpbmdsZVZhbHVlKCRzdGFydERhdGUpOwoJCSRlbmREYXRlCT0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuU2luZ2xlVmFsdWUoJGVuZERhdGUpOwoJCS8vCUZsdXNoIHRoZSBtYW5kYXRvcnkgc3RhcnQgYW5kIGVuZCBkYXRlIHRoYXQgYXJlIHJlZmVyZW5jZWQgaW4gdGhlIGZ1bmN0aW9uIGRlZmluaXRpb24sIGFuZCBnZXQgdGhlIG9wdGlvbmFsIGRheXMKCQkkZGF0ZUFyZ3MgPSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5BcnJheShmdW5jX2dldF9hcmdzKCkpOwoJCWFycmF5X3NoaWZ0KCRkYXRlQXJncyk7CgkJYXJyYXlfc2hpZnQoJGRhdGVBcmdzKTsKCgkJLy8JVmFsaWRhdGUgdGhlIHN0YXJ0IGFuZCBlbmQgZGF0ZXMKCQlpZiAoaXNfc3RyaW5nKCRzdGFydERhdGUgPSAkc0RhdGUgPSBzZWxmOjpfZ2V0RGF0ZVZhbHVlKCRzdGFydERhdGUpKSkgewoJCQlyZXR1cm4gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpWQUxVRSgpOwoJCX0KCQkkc3RhcnREYXRlID0gKGZsb2F0KSBmbG9vcigkc3RhcnREYXRlKTsKCQlpZiAoaXNfc3RyaW5nKCRlbmREYXRlID0gJGVEYXRlID0gc2VsZjo6X2dldERhdGVWYWx1ZSgkZW5kRGF0ZSkpKSB7CgkJCXJldHVybiBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OlZBTFVFKCk7CgkJfQoJCSRlbmREYXRlID0gKGZsb2F0KSBmbG9vcigkZW5kRGF0ZSk7CgoJCWlmICgkc0RhdGUgPiAkZURhdGUpIHsKCQkJJHN0YXJ0RGF0ZSA9ICRlRGF0ZTsKCQkJJGVuZERhdGUgPSAkc0RhdGU7CgkJfQoKCQkvLyBFeGVjdXRlIGZ1bmN0aW9uCgkJJHN0YXJ0RG9XID0gNiAtIHNlbGY6OkRBWU9GV0VFSygkc3RhcnREYXRlLDIpOwoJCWlmICgkc3RhcnREb1cgPCAwKSB7ICRzdGFydERvVyA9IDA7IH0KCQkkZW5kRG9XID0gc2VsZjo6REFZT0ZXRUVLKCRlbmREYXRlLDIpOwoJCWlmICgkZW5kRG9XID49IDYpIHsgJGVuZERvVyA9IDA7IH0KCgkJJHdob2xlV2Vla0RheXMgPSBmbG9vcigoJGVuZERhdGUgLSAkc3RhcnREYXRlKSAvIDcpICogNTsKCQkkcGFydFdlZWtEYXlzID0gJGVuZERvVyArICRzdGFydERvVzsKCQlpZiAoJHBhcnRXZWVrRGF5cyA+IDUpIHsKCQkJJHBhcnRXZWVrRGF5cyAtPSA1OwoJCX0KCgkJLy8JVGVzdCBhbnkgZXh0cmEgaG9saWRheSBwYXJhbWV0ZXJzCgkJJGhvbGlkYXlDb3VudGVkQXJyYXkgPSBhcnJheSgpOwoJCWZvcmVhY2ggKCRkYXRlQXJncyBhcyAkaG9saWRheURhdGUpIHsKCQkJaWYgKGlzX3N0cmluZygkaG9saWRheURhdGUgPSBzZWxmOjpfZ2V0RGF0ZVZhbHVlKCRob2xpZGF5RGF0ZSkpKSB7CgkJCQlyZXR1cm4gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpWQUxVRSgpOwoJCQl9CgkJCWlmICgoJGhvbGlkYXlEYXRlID49ICRzdGFydERhdGUpICYmICgkaG9saWRheURhdGUgPD0gJGVuZERhdGUpKSB7CgkJCQlpZiAoKHNlbGY6OkRBWU9GV0VFSygkaG9saWRheURhdGUsMikgPCA2KSAmJiAoIWluX2FycmF5KCRob2xpZGF5RGF0ZSwkaG9saWRheUNvdW50ZWRBcnJheSkpKSB7CgkJCQkJLS0kcGFydFdlZWtEYXlzOwoJCQkJCSRob2xpZGF5Q291bnRlZEFycmF5W10gPSAkaG9saWRheURhdGU7CgkJCQl9CgkJCX0KCQl9CgoJCWlmICgkc0RhdGUgPiAkZURhdGUpIHsKCQkJcmV0dXJuIDAgLSAoJHdob2xlV2Vla0RheXMgKyAkcGFydFdlZWtEYXlzKTsKCQl9CgkJcmV0dXJuICR3aG9sZVdlZWtEYXlzICsgJHBhcnRXZWVrRGF5czsKCX0JLy8JZnVuY3Rpb24gTkVUV09SS0RBWVMoKQoKCgkvKioKCSAqIFdPUktEQVkKCSAqCgkgKiBSZXR1cm5zIHRoZSBkYXRlIHRoYXQgaXMgdGhlIGluZGljYXRlZCBudW1iZXIgb2Ygd29ya2luZyBkYXlzIGJlZm9yZSBvciBhZnRlciBhIGRhdGUgKHRoZQoJICogc3RhcnRpbmcgZGF0ZSkuIFdvcmtpbmcgZGF5cyBleGNsdWRlIHdlZWtlbmRzIGFuZCBhbnkgZGF0ZXMgaWRlbnRpZmllZCBhcyBob2xpZGF5cy4KCSAqIFVzZSBXT1JLREFZIHRvIGV4Y2x1ZGUgd2Vla2VuZHMgb3IgaG9saWRheXMgd2hlbiB5b3UgY2FsY3VsYXRlIGludm9pY2UgZHVlIGRhdGVzLCBleHBlY3RlZAoJICogZGVsaXZlcnkgdGltZXMsIG9yIHRoZSBudW1iZXIgb2YgZGF5cyBvZiB3b3JrIHBlcmZvcm1lZC4KCSAqCgkgKiBFeGNlbCBGdW5jdGlvbjoKCSAqCQlXT1JLREFZKHN0YXJ0RGF0ZSxlbmREYXlzWyxob2xpZGF5c1ssaG9saWRheVssLi4uXV1dKQoJICoKCSAqIEBhY2Nlc3MJcHVibGljCgkgKiBAY2F0ZWdvcnkgRGF0ZS9UaW1lIEZ1bmN0aW9ucwoJICogQHBhcmFtCW1peGVkCQkkc3RhcnREYXRlCQlFeGNlbCBkYXRlIHNlcmlhbCB2YWx1ZSAoZmxvYXQpLCBQSFAgZGF0ZSB0aW1lc3RhbXAgKGludGVnZXIpLAoJICoJCQkJCQkJCQkJUEhQIERhdGVUaW1lIG9iamVjdCwgb3IgYSBzdGFuZGFyZCBkYXRlIHN0cmluZwoJICogQHBhcmFtCWludGVnZXIJCSRlbmREYXlzCQlUaGUgbnVtYmVyIG9mIG5vbndlZWtlbmQgYW5kIG5vbmhvbGlkYXkgZGF5cyBiZWZvcmUgb3IgYWZ0ZXIKCSAqCQkJCQkJCQkJCXN0YXJ0RGF0ZS4gQSBwb3NpdGl2ZSB2YWx1ZSBmb3IgZGF5cyB5aWVsZHMgYSBmdXR1cmUgZGF0ZTsgYQoJICoJCQkJCQkJCQkJbmVnYXRpdmUgdmFsdWUgeWllbGRzIGEgcGFzdCBkYXRlLgoJICogQHBhcmFtCW1peGVkCQkkaG9saWRheXMsLi4uCU9wdGlvbmFsIHNlcmllcyBvZiBFeGNlbCBkYXRlIHNlcmlhbCB2YWx1ZSAoZmxvYXQpLCBQSFAgZGF0ZQoJICoJCQkJCQkJCQkJdGltZXN0YW1wIChpbnRlZ2VyKSwgUEhQIERhdGVUaW1lIG9iamVjdCwgb3IgYSBzdGFuZGFyZCBkYXRlCgkgKgkJCQkJCQkJCQlzdHJpbmdzIHRoYXQgd2lsbCBiZSBleGNsdWRlZCBmcm9tIHRoZSB3b3JraW5nIGNhbGVuZGFyLCBzdWNoCgkgKgkJCQkJCQkJCQlhcyBzdGF0ZSBhbmQgZmVkZXJhbCBob2xpZGF5cyBhbmQgZmxvYXRpbmcgaG9saWRheXMuCgkgKiBAcmV0dXJuCW1peGVkCUV4Y2VsIGRhdGUvdGltZSBzZXJpYWwgdmFsdWUsIFBIUCBkYXRlL3RpbWUgc2VyaWFsIHZhbHVlIG9yIFBIUCBkYXRlL3RpbWUgb2JqZWN0LAoJICoJCQkJCQlkZXBlbmRpbmcgb24gdGhlIHZhbHVlIG9mIHRoZSBSZXR1cm5EYXRlVHlwZSBmbGFnCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gV09SS0RBWSgkc3RhcnREYXRlLCRlbmREYXlzKSB7CgkJLy8JUmV0cmlldmUgdGhlIG1hbmRhdG9yeSBzdGFydCBkYXRlIGFuZCBkYXlzIHRoYXQgYXJlIHJlZmVyZW5jZWQgaW4gdGhlIGZ1bmN0aW9uIGRlZmluaXRpb24KCQkkc3RhcnREYXRlCT0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuU2luZ2xlVmFsdWUoJHN0YXJ0RGF0ZSk7CgkJJGVuZERheXMJPSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5TaW5nbGVWYWx1ZSgkZW5kRGF5cyk7CgkJLy8JRmx1c2ggdGhlIG1hbmRhdG9yeSBzdGFydCBkYXRlIGFuZCBkYXlzIHRoYXQgYXJlIHJlZmVyZW5jZWQgaW4gdGhlIGZ1bmN0aW9uIGRlZmluaXRpb24sIGFuZCBnZXQgdGhlIG9wdGlvbmFsIGRheXMKCQkkZGF0ZUFyZ3MgPSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5BcnJheShmdW5jX2dldF9hcmdzKCkpOwoJCWFycmF5X3NoaWZ0KCRkYXRlQXJncyk7CgkJYXJyYXlfc2hpZnQoJGRhdGVBcmdzKTsKCgkJaWYgKChpc19zdHJpbmcoJHN0YXJ0RGF0ZSA9IHNlbGY6Ol9nZXREYXRlVmFsdWUoJHN0YXJ0RGF0ZSkpKSB8fCAoIWlzX251bWVyaWMoJGVuZERheXMpKSkgewoJCQlyZXR1cm4gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpWQUxVRSgpOwoJCX0KCQkkc3RhcnREYXRlID0gKGZsb2F0KSBmbG9vcigkc3RhcnREYXRlKTsKCQkkZW5kRGF5cyA9IChpbnQpIGZsb29yKCRlbmREYXlzKTsKCQkvLwlJZiBlbmREYXlzIGlzIDAsIHdlIGFsd2F5cyByZXR1cm4gc3RhcnREYXRlCgkJaWYgKCRlbmREYXlzID09IDApIHsgcmV0dXJuICRzdGFydERhdGU7IH0KCgkJJGRlY3JlbWVudGluZyA9ICgkZW5kRGF5cyA8IDApID8gVHJ1ZSA6IEZhbHNlOwoKCQkvLwlBZGp1c3QgdGhlIHN0YXJ0IGRhdGUgaWYgaXQgZmFsbHMgb3ZlciBhIHdlZWtlbmQKCgkJJHN0YXJ0RG9XID0gc2VsZjo6REFZT0ZXRUVLKCRzdGFydERhdGUsMyk7CgkJaWYgKHNlbGY6OkRBWU9GV0VFSygkc3RhcnREYXRlLDMpID49IDUpIHsKCQkJJHN0YXJ0RGF0ZSArPSAoJGRlY3JlbWVudGluZykgPyAtJHN0YXJ0RG9XICsgNDogNyAtICRzdGFydERvVzsKCQkJKCRkZWNyZW1lbnRpbmcpID8gJGVuZERheXMrKyA6ICRlbmREYXlzLS07CgkJfQoKCQkvLwlBZGQgZW5kRGF5cwoJCSRlbmREYXRlID0gKGZsb2F0KSAkc3RhcnREYXRlICsgKGludHZhbCgkZW5kRGF5cyAvIDUpICogNykgKyAoJGVuZERheXMgJSA1KTsKCgkJLy8JQWRqdXN0IHRoZSBjYWxjdWxhdGVkIGVuZCBkYXRlIGlmIGl0IGZhbGxzIG92ZXIgYSB3ZWVrZW5kCgkJJGVuZERvVyA9IHNlbGY6OkRBWU9GV0VFSygkZW5kRGF0ZSwzKTsKCQlpZiAoJGVuZERvVyA+PSA1KSB7CgkJCSRlbmREYXRlICs9ICgkZGVjcmVtZW50aW5nKSA/IC0kZW5kRG9XICsgNDogNyAtICRlbmREb1c7CgkJfQoKCQkvLwlUZXN0IGFueSBleHRyYSBob2xpZGF5IHBhcmFtZXRlcnMKCQlpZiAoIWVtcHR5KCRkYXRlQXJncykpIHsKCQkJJGhvbGlkYXlDb3VudGVkQXJyYXkgPSAkaG9saWRheURhdGVzID0gYXJyYXkoKTsKCQkJZm9yZWFjaCAoJGRhdGVBcmdzIGFzICRob2xpZGF5RGF0ZSkgewoJCQkJaWYgKCgkaG9saWRheURhdGUgIT09IE5VTEwpICYmICh0cmltKCRob2xpZGF5RGF0ZSkgPiAnJykpIHsKCQkJCQlpZiAoaXNfc3RyaW5nKCRob2xpZGF5RGF0ZSA9IHNlbGY6Ol9nZXREYXRlVmFsdWUoJGhvbGlkYXlEYXRlKSkpIHsKCQkJCQkJcmV0dXJuIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6VkFMVUUoKTsKCQkJCQl9CgkJCQkJaWYgKHNlbGY6OkRBWU9GV0VFSygkaG9saWRheURhdGUsMykgPCA1KSB7CgkJCQkJCSRob2xpZGF5RGF0ZXNbXSA9ICRob2xpZGF5RGF0ZTsKCQkJCQl9CgkJCQl9CgkJCX0KCQkJaWYgKCRkZWNyZW1lbnRpbmcpIHsKCQkJCXJzb3J0KCRob2xpZGF5RGF0ZXMsIFNPUlRfTlVNRVJJQyk7CgkJCX0gZWxzZSB7CgkJCQlzb3J0KCRob2xpZGF5RGF0ZXMsIFNPUlRfTlVNRVJJQyk7CgkJCX0KCQkJZm9yZWFjaCAoJGhvbGlkYXlEYXRlcyBhcyAkaG9saWRheURhdGUpIHsKCQkJCWlmICgkZGVjcmVtZW50aW5nKSB7CgkJCQkJaWYgKCgkaG9saWRheURhdGUgPD0gJHN0YXJ0RGF0ZSkgJiYgKCRob2xpZGF5RGF0ZSA+PSAkZW5kRGF0ZSkpIHsKCQkJCQkJaWYgKCFpbl9hcnJheSgkaG9saWRheURhdGUsJGhvbGlkYXlDb3VudGVkQXJyYXkpKSB7CgkJCQkJCQktLSRlbmREYXRlOwoJCQkJCQkJJGhvbGlkYXlDb3VudGVkQXJyYXlbXSA9ICRob2xpZGF5RGF0ZTsKCQkJCQkJfQoJCQkJCX0KCQkJCX0gZWxzZSB7CgkJCQkJaWYgKCgkaG9saWRheURhdGUgPj0gJHN0YXJ0RGF0ZSkgJiYgKCRob2xpZGF5RGF0ZSA8PSAkZW5kRGF0ZSkpIHsKCQkJCQkJaWYgKCFpbl9hcnJheSgkaG9saWRheURhdGUsJGhvbGlkYXlDb3VudGVkQXJyYXkpKSB7CgkJCQkJCQkrKyRlbmREYXRlOwoJCQkJCQkJJGhvbGlkYXlDb3VudGVkQXJyYXlbXSA9ICRob2xpZGF5RGF0ZTsKCQkJCQkJfQoJCQkJCX0KCQkJCX0KCQkJCS8vCUFkanVzdCB0aGUgY2FsY3VsYXRlZCBlbmQgZGF0ZSBpZiBpdCBmYWxscyBvdmVyIGEgd2Vla2VuZAoJCQkJJGVuZERvVyA9IHNlbGY6OkRBWU9GV0VFSygkZW5kRGF0ZSwzKTsKCQkJCWlmICgkZW5kRG9XID49IDUpIHsKCQkJCQkkZW5kRGF0ZSArPSAoJGRlY3JlbWVudGluZykgPyAtJGVuZERvVyArIDQ6IDcgLSAkZW5kRG9XOwoJCQkJfQoKCQkJfQoJCX0KCgkJc3dpdGNoIChQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmdldFJldHVybkRhdGVUeXBlKCkpIHsKCQkJY2FzZSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OlJFVFVSTkRBVEVfRVhDRUwgOgoJCQkJCXJldHVybiAoZmxvYXQpICRlbmREYXRlOwoJCQljYXNlIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6UkVUVVJOREFURV9QSFBfTlVNRVJJQyA6CgkJCQkJcmV0dXJuIChpbnRlZ2VyKSBQSFBFeGNlbF9TaGFyZWRfRGF0ZTo6RXhjZWxUb1BIUCgkZW5kRGF0ZSk7CgkJCWNhc2UgUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpSRVRVUk5EQVRFX1BIUF9PQkpFQ1QgOgoJCQkJCXJldHVybiBQSFBFeGNlbF9TaGFyZWRfRGF0ZTo6RXhjZWxUb1BIUE9iamVjdCgkZW5kRGF0ZSk7CgkJfQoJfQkvLwlmdW5jdGlvbiBXT1JLREFZKCkKCgoJLyoqCgkgKiBEQVlPRk1PTlRICgkgKgoJICogUmV0dXJucyB0aGUgZGF5IG9mIHRoZSBtb250aCwgZm9yIGEgc3BlY2lmaWVkIGRhdGUuIFRoZSBkYXkgaXMgZ2l2ZW4gYXMgYW4gaW50ZWdlcgoJICogcmFuZ2luZyBmcm9tIDEgdG8gMzEuCgkgKgoJICogRXhjZWwgRnVuY3Rpb246CgkgKgkJREFZKGRhdGVWYWx1ZSkKCSAqCgkgKiBAcGFyYW0JbWl4ZWQJJGRhdGVWYWx1ZQkJRXhjZWwgZGF0ZSBzZXJpYWwgdmFsdWUgKGZsb2F0KSwgUEhQIGRhdGUgdGltZXN0YW1wIChpbnRlZ2VyKSwKCSAqCQkJCQkJCQkJUEhQIERhdGVUaW1lIG9iamVjdCwgb3IgYSBzdGFuZGFyZCBkYXRlIHN0cmluZwoJICogQHJldHVybglpbnQJCURheSBvZiB0aGUgbW9udGgKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBEQVlPRk1PTlRIKCRkYXRlVmFsdWUgPSAxKSB7CgkJJGRhdGVWYWx1ZQk9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlblNpbmdsZVZhbHVlKCRkYXRlVmFsdWUpOwoKCQlpZiAoaXNfc3RyaW5nKCRkYXRlVmFsdWUgPSBzZWxmOjpfZ2V0RGF0ZVZhbHVlKCRkYXRlVmFsdWUpKSkgewoJCQlyZXR1cm4gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpWQUxVRSgpOwoJCX0gZWxzZWlmICgkZGF0ZVZhbHVlID09IDAuMCkgewoJCQlyZXR1cm4gMDsKCQl9IGVsc2VpZiAoJGRhdGVWYWx1ZSA8IDAuMCkgewoJCQlyZXR1cm4gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpOYU4oKTsKCQl9CgoJCS8vIEV4ZWN1dGUgZnVuY3Rpb24KCQkkUEhQRGF0ZU9iamVjdCA9IFBIUEV4Y2VsX1NoYXJlZF9EYXRlOjpFeGNlbFRvUEhQT2JqZWN0KCRkYXRlVmFsdWUpOwoKCQlyZXR1cm4gKGludCkgJFBIUERhdGVPYmplY3QtPmZvcm1hdCgnaicpOwoJfQkvLwlmdW5jdGlvbiBEQVlPRk1PTlRIKCkKCgoJLyoqCgkgKiBEQVlPRldFRUsKCSAqCgkgKiBSZXR1cm5zIHRoZSBkYXkgb2YgdGhlIHdlZWsgZm9yIGEgc3BlY2lmaWVkIGRhdGUuIFRoZSBkYXkgaXMgZ2l2ZW4gYXMgYW4gaW50ZWdlcgoJICogcmFuZ2luZyBmcm9tIDAgdG8gNyAoZGVwZW5kZW50IG9uIHRoZSByZXF1ZXN0ZWQgc3R5bGUpLgoJICoKCSAqIEV4Y2VsIEZ1bmN0aW9uOgoJICoJCVdFRUtEQVkoZGF0ZVZhbHVlWyxzdHlsZV0pCgkgKgoJICogQHBhcmFtCW1peGVkCSRkYXRlVmFsdWUJCUV4Y2VsIGRhdGUgc2VyaWFsIHZhbHVlIChmbG9hdCksIFBIUCBkYXRlIHRpbWVzdGFtcCAoaW50ZWdlciksCgkgKgkJCQkJCQkJCVBIUCBEYXRlVGltZSBvYmplY3QsIG9yIGEgc3RhbmRhcmQgZGF0ZSBzdHJpbmcKCSAqIEBwYXJhbQlpbnQJCSRzdHlsZQkJCUEgbnVtYmVyIHRoYXQgZGV0ZXJtaW5lcyB0aGUgdHlwZSBvZiByZXR1cm4gdmFsdWUKCSAqCQkJCQkJCQkJCTEgb3Igb21pdHRlZAlOdW1iZXJzIDEgKFN1bmRheSkgdGhyb3VnaCA3IChTYXR1cmRheSkuCgkgKgkJCQkJCQkJCQkyCQkJCU51bWJlcnMgMSAoTW9uZGF5KSB0aHJvdWdoIDcgKFN1bmRheSkuCgkgKgkJCQkJCQkJCQkzCQkJCU51bWJlcnMgMCAoTW9uZGF5KSB0aHJvdWdoIDYgKFN1bmRheSkuCgkgKiBAcmV0dXJuCWludAkJRGF5IG9mIHRoZSB3ZWVrIHZhbHVlCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gREFZT0ZXRUVLKCRkYXRlVmFsdWUgPSAxLCAkc3R5bGUgPSAxKSB7CgkJJGRhdGVWYWx1ZQk9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlblNpbmdsZVZhbHVlKCRkYXRlVmFsdWUpOwoJCSRzdHlsZQkJPSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5TaW5nbGVWYWx1ZSgkc3R5bGUpOwoKCQlpZiAoIWlzX251bWVyaWMoJHN0eWxlKSkgewoJCQlyZXR1cm4gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpWQUxVRSgpOwoJCX0gZWxzZWlmICgoJHN0eWxlIDwgMSkgfHwgKCRzdHlsZSA+IDMpKSB7CgkJCXJldHVybiBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6Ok5hTigpOwoJCX0KCQkkc3R5bGUgPSBmbG9vcigkc3R5bGUpOwoKCQlpZiAoaXNfc3RyaW5nKCRkYXRlVmFsdWUgPSBzZWxmOjpfZ2V0RGF0ZVZhbHVlKCRkYXRlVmFsdWUpKSkgewoJCQlyZXR1cm4gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpWQUxVRSgpOwoJCX0gZWxzZWlmICgkZGF0ZVZhbHVlIDwgMC4wKSB7CgkJCXJldHVybiBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6Ok5hTigpOwoJCX0KCgkJLy8gRXhlY3V0ZSBmdW5jdGlvbgoJCSRQSFBEYXRlT2JqZWN0ID0gUEhQRXhjZWxfU2hhcmVkX0RhdGU6OkV4Y2VsVG9QSFBPYmplY3QoJGRhdGVWYWx1ZSk7CgkJJERvVyA9ICRQSFBEYXRlT2JqZWN0LT5mb3JtYXQoJ3cnKTsKCgkJJGZpcnN0RGF5ID0gMTsKCQlzd2l0Y2ggKCRzdHlsZSkgewoJCQljYXNlIDE6ICsrJERvVzsKCQkJCQlicmVhazsKCQkJY2FzZSAyOiBpZiAoJERvVyA9PSAwKSB7ICREb1cgPSA3OyB9CgkJCQkJYnJlYWs7CgkJCWNhc2UgMzogaWYgKCREb1cgPT0gMCkgeyAkRG9XID0gNzsgfQoJCQkJCSRmaXJzdERheSA9IDA7CgkJCQkJLS0kRG9XOwoJCQkJCWJyZWFrOwoJCX0KCQlpZiAoUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpnZXRDb21wYXRpYmlsaXR5TW9kZSgpID09IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6Q09NUEFUSUJJTElUWV9FWENFTCkgewoJCQkvLwlUZXN0IGZvciBFeGNlbCdzIDE5MDAgbGVhcCB5ZWFyLCBhbmQgaW50cm9kdWNlIHRoZSBlcnJvciBhcyByZXF1aXJlZAoJCQlpZiAoKCRQSFBEYXRlT2JqZWN0LT5mb3JtYXQoJ1knKSA9PSAxOTAwKSAmJiAoJFBIUERhdGVPYmplY3QtPmZvcm1hdCgnbicpIDw9IDIpKSB7CgkJCQktLSREb1c7CgkJCQlpZiAoJERvVyA8ICRmaXJzdERheSkgewoJCQkJCSREb1cgKz0gNzsKCQkJCX0KCQkJfQoJCX0KCgkJcmV0dXJuIChpbnQpICREb1c7Cgl9CS8vCWZ1bmN0aW9uIERBWU9GV0VFSygpCgoKCS8qKgoJICogV0VFS09GWUVBUgoJICoKCSAqIFJldHVybnMgdGhlIHdlZWsgb2YgdGhlIHllYXIgZm9yIGEgc3BlY2lmaWVkIGRhdGUuCgkgKiBUaGUgV0VFS05VTSBmdW5jdGlvbiBjb25zaWRlcnMgdGhlIHdlZWsgY29udGFpbmluZyBKYW51YXJ5IDEgdG8gYmUgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuCgkgKiBIb3dldmVyLCB0aGVyZSBpcyBhIEV1cm9wZWFuIHN0YW5kYXJkIHRoYXQgZGVmaW5lcyB0aGUgZmlyc3Qgd2VlayBhcyB0aGUgb25lIHdpdGggdGhlIG1ham9yaXR5CgkgKiBvZiBkYXlzIChmb3VyIG9yIG1vcmUpIGZhbGxpbmcgaW4gdGhlIG5ldyB5ZWFyLiBUaGlzIG1lYW5zIHRoYXQgZm9yIHllYXJzIGluIHdoaWNoIHRoZXJlIGFyZQoJICogdGhyZWUgZGF5cyBvciBsZXNzIGluIHRoZSBmaXJzdCB3ZWVrIG9mIEphbnVhcnksIHRoZSBXRUVLTlVNIGZ1bmN0aW9uIHJldHVybnMgd2VlayBudW1iZXJzCgkgKiB0aGF0IGFyZSBpbmNvcnJlY3QgYWNjb3JkaW5nIHRvIHRoZSBFdXJvcGVhbiBzdGFuZGFyZC4KCSAqCgkgKiBFeGNlbCBGdW5jdGlvbjoKCSAqCQlXRUVLTlVNKGRhdGVWYWx1ZVssc3R5bGVdKQoJICoKCSAqIEBwYXJhbQltaXhlZAkkZGF0ZVZhbHVlCQlFeGNlbCBkYXRlIHNlcmlhbCB2YWx1ZSAoZmxvYXQpLCBQSFAgZGF0ZSB0aW1lc3RhbXAgKGludGVnZXIpLAoJICoJCQkJCQkJCQlQSFAgRGF0ZVRpbWUgb2JqZWN0LCBvciBhIHN0YW5kYXJkIGRhdGUgc3RyaW5nCgkgKiBAcGFyYW0JYm9vbGVhbgkkbWV0aG9kCQkJV2VlayBiZWdpbnMgb24gU3VuZGF5IG9yIE1vbmRheQoJICoJCQkJCQkJCQkJMSBvciBvbWl0dGVkCVdlZWsgYmVnaW5zIG9uIFN1bmRheS4KCSAqCQkJCQkJCQkJCTIJCQkJV2VlayBiZWdpbnMgb24gTW9uZGF5LgoJICogQHJldHVybglpbnQJCVdlZWsgTnVtYmVyCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gV0VFS09GWUVBUigkZGF0ZVZhbHVlID0gMSwgJG1ldGhvZCA9IDEpIHsKCQkkZGF0ZVZhbHVlCT0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuU2luZ2xlVmFsdWUoJGRhdGVWYWx1ZSk7CgkJJG1ldGhvZAkJPSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5TaW5nbGVWYWx1ZSgkbWV0aG9kKTsKCgkJaWYgKCFpc19udW1lcmljKCRtZXRob2QpKSB7CgkJCXJldHVybiBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OlZBTFVFKCk7CgkJfSBlbHNlaWYgKCgkbWV0aG9kIDwgMSkgfHwgKCRtZXRob2QgPiAyKSkgewoJCQlyZXR1cm4gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpOYU4oKTsKCQl9CgkJJG1ldGhvZCA9IGZsb29yKCRtZXRob2QpOwoKCQlpZiAoaXNfc3RyaW5nKCRkYXRlVmFsdWUgPSBzZWxmOjpfZ2V0RGF0ZVZhbHVlKCRkYXRlVmFsdWUpKSkgewoJCQlyZXR1cm4gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpWQUxVRSgpOwoJCX0gZWxzZWlmICgkZGF0ZVZhbHVlIDwgMC4wKSB7CgkJCXJldHVybiBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6Ok5hTigpOwoJCX0KCgkJLy8gRXhlY3V0ZSBmdW5jdGlvbgoJCSRQSFBEYXRlT2JqZWN0ID0gUEhQRXhjZWxfU2hhcmVkX0RhdGU6OkV4Y2VsVG9QSFBPYmplY3QoJGRhdGVWYWx1ZSk7CgkJJGRheU9mWWVhciA9ICRQSFBEYXRlT2JqZWN0LT5mb3JtYXQoJ3onKTsKCQkkZG93ID0gJFBIUERhdGVPYmplY3QtPmZvcm1hdCgndycpOwoJCSRQSFBEYXRlT2JqZWN0LT5tb2RpZnkoJy0nLiRkYXlPZlllYXIuJyBkYXlzJyk7CgkJJGRvdyA9ICRQSFBEYXRlT2JqZWN0LT5mb3JtYXQoJ3cnKTsKCQkkZGF5c0luRmlyc3RXZWVrID0gNyAtICgoJGRvdyArICgyIC0gJG1ldGhvZCkpICUgNyk7CgkJJGRheU9mWWVhciAtPSAkZGF5c0luRmlyc3RXZWVrOwoJCSR3ZWVrT2ZZZWFyID0gY2VpbCgkZGF5T2ZZZWFyIC8gNykgKyAxOwoKCQlyZXR1cm4gKGludCkgJHdlZWtPZlllYXI7Cgl9CS8vCWZ1bmN0aW9uIFdFRUtPRllFQVIoKQoKCgkvKioKCSAqIE1PTlRIT0ZZRUFSCgkgKgoJICogUmV0dXJucyB0aGUgbW9udGggb2YgYSBkYXRlIHJlcHJlc2VudGVkIGJ5IGEgc2VyaWFsIG51bWJlci4KCSAqIFRoZSBtb250aCBpcyBnaXZlbiBhcyBhbiBpbnRlZ2VyLCByYW5naW5nIGZyb20gMSAoSmFudWFyeSkgdG8gMTIgKERlY2VtYmVyKS4KCSAqCgkgKiBFeGNlbCBGdW5jdGlvbjoKCSAqCQlNT05USChkYXRlVmFsdWUpCgkgKgoJICogQHBhcmFtCW1peGVkCSRkYXRlVmFsdWUJCUV4Y2VsIGRhdGUgc2VyaWFsIHZhbHVlIChmbG9hdCksIFBIUCBkYXRlIHRpbWVzdGFtcCAoaW50ZWdlciksCgkgKgkJCQkJCQkJCVBIUCBEYXRlVGltZSBvYmplY3QsIG9yIGEgc3RhbmRhcmQgZGF0ZSBzdHJpbmcKCSAqIEByZXR1cm4JaW50CQlNb250aCBvZiB0aGUgeWVhcgoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIE1PTlRIT0ZZRUFSKCRkYXRlVmFsdWUgPSAxKSB7CgkJJGRhdGVWYWx1ZQk9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlblNpbmdsZVZhbHVlKCRkYXRlVmFsdWUpOwoKCQlpZiAoaXNfc3RyaW5nKCRkYXRlVmFsdWUgPSBzZWxmOjpfZ2V0RGF0ZVZhbHVlKCRkYXRlVmFsdWUpKSkgewoJCQlyZXR1cm4gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpWQUxVRSgpOwoJCX0gZWxzZWlmICgkZGF0ZVZhbHVlIDwgMC4wKSB7CgkJCXJldHVybiBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6Ok5hTigpOwoJCX0KCgkJLy8gRXhlY3V0ZSBmdW5jdGlvbgoJCSRQSFBEYXRlT2JqZWN0ID0gUEhQRXhjZWxfU2hhcmVkX0RhdGU6OkV4Y2VsVG9QSFBPYmplY3QoJGRhdGVWYWx1ZSk7CgoJCXJldHVybiAoaW50KSAkUEhQRGF0ZU9iamVjdC0+Zm9ybWF0KCduJyk7Cgl9CS8vCWZ1bmN0aW9uIE1PTlRIT0ZZRUFSKCkKCgoJLyoqCgkgKiBZRUFSCgkgKgoJICogUmV0dXJucyB0aGUgeWVhciBjb3JyZXNwb25kaW5nIHRvIGEgZGF0ZS4KCSAqIFRoZSB5ZWFyIGlzIHJldHVybmVkIGFzIGFuIGludGVnZXIgaW4gdGhlIHJhbmdlIDE5MDAtOTk5OS4KCSAqCgkgKiBFeGNlbCBGdW5jdGlvbjoKCSAqCQlZRUFSKGRhdGVWYWx1ZSkKCSAqCgkgKiBAcGFyYW0JbWl4ZWQJJGRhdGVWYWx1ZQkJRXhjZWwgZGF0ZSBzZXJpYWwgdmFsdWUgKGZsb2F0KSwgUEhQIGRhdGUgdGltZXN0YW1wIChpbnRlZ2VyKSwKCSAqCQkJCQkJCQkJUEhQIERhdGVUaW1lIG9iamVjdCwgb3IgYSBzdGFuZGFyZCBkYXRlIHN0cmluZwoJICogQHJldHVybglpbnQJCVllYXIKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBZRUFSKCRkYXRlVmFsdWUgPSAxKSB7CgkJJGRhdGVWYWx1ZQk9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlblNpbmdsZVZhbHVlKCRkYXRlVmFsdWUpOwoKCQlpZiAoaXNfc3RyaW5nKCRkYXRlVmFsdWUgPSBzZWxmOjpfZ2V0RGF0ZVZhbHVlKCRkYXRlVmFsdWUpKSkgewoJCQlyZXR1cm4gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpWQUxVRSgpOwoJCX0gZWxzZWlmICgkZGF0ZVZhbHVlIDwgMC4wKSB7CgkJCXJldHVybiBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6Ok5hTigpOwoJCX0KCgkJLy8gRXhlY3V0ZSBmdW5jdGlvbgoJCSRQSFBEYXRlT2JqZWN0ID0gUEhQRXhjZWxfU2hhcmVkX0RhdGU6OkV4Y2VsVG9QSFBPYmplY3QoJGRhdGVWYWx1ZSk7CgoJCXJldHVybiAoaW50KSAkUEhQRGF0ZU9iamVjdC0+Zm9ybWF0KCdZJyk7Cgl9CS8vCWZ1bmN0aW9uIFlFQVIoKQoKCgkvKioKCSAqIEhPVVJPRkRBWQoJICoKCSAqIFJldHVybnMgdGhlIGhvdXIgb2YgYSB0aW1lIHZhbHVlLgoJICogVGhlIGhvdXIgaXMgZ2l2ZW4gYXMgYW4gaW50ZWdlciwgcmFuZ2luZyBmcm9tIDAgKDEyOjAwIEEuTS4pIHRvIDIzICgxMTowMCBQLk0uKS4KCSAqCgkgKiBFeGNlbCBGdW5jdGlvbjoKCSAqCQlIT1VSKHRpbWVWYWx1ZSkKCSAqCgkgKiBAcGFyYW0JbWl4ZWQJJHRpbWVWYWx1ZQkJRXhjZWwgZGF0ZSBzZXJpYWwgdmFsdWUgKGZsb2F0KSwgUEhQIGRhdGUgdGltZXN0YW1wIChpbnRlZ2VyKSwKCSAqCQkJCQkJCQkJUEhQIERhdGVUaW1lIG9iamVjdCwgb3IgYSBzdGFuZGFyZCB0aW1lIHN0cmluZwoJICogQHJldHVybglpbnQJCUhvdXIKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBIT1VST0ZEQVkoJHRpbWVWYWx1ZSA9IDApIHsKCQkkdGltZVZhbHVlCT0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuU2luZ2xlVmFsdWUoJHRpbWVWYWx1ZSk7CgoJCWlmICghaXNfbnVtZXJpYygkdGltZVZhbHVlKSkgewoJCQlpZiAoUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpnZXRDb21wYXRpYmlsaXR5TW9kZSgpID09IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6Q09NUEFUSUJJTElUWV9HTlVNRVJJQykgewoJCQkJJHRlc3RWYWwgPSBzdHJ0b2soJHRpbWVWYWx1ZSwnLy06ICcpOwoJCQkJaWYgKHN0cmxlbigkdGVzdFZhbCkgPCBzdHJsZW4oJHRpbWVWYWx1ZSkpIHsKCQkJCQlyZXR1cm4gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpWQUxVRSgpOwoJCQkJfQoJCQl9CgkJCSR0aW1lVmFsdWUgPSBzZWxmOjpfZ2V0VGltZVZhbHVlKCR0aW1lVmFsdWUpOwoJCQlpZiAoaXNfc3RyaW5nKCR0aW1lVmFsdWUpKSB7CgkJCQlyZXR1cm4gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpWQUxVRSgpOwoJCQl9CgkJfQoJCS8vIEV4ZWN1dGUgZnVuY3Rpb24KCQlpZiAoJHRpbWVWYWx1ZSA+PSAxKSB7CgkJCSR0aW1lVmFsdWUgPSBmbW9kKCR0aW1lVmFsdWUsMSk7CgkJfSBlbHNlaWYgKCR0aW1lVmFsdWUgPCAwLjApIHsKCQkJcmV0dXJuIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6TmFOKCk7CgkJfQoJCSR0aW1lVmFsdWUgPSBQSFBFeGNlbF9TaGFyZWRfRGF0ZTo6RXhjZWxUb1BIUCgkdGltZVZhbHVlKTsKCgkJcmV0dXJuIChpbnQpIGdtZGF0ZSgnRycsJHRpbWVWYWx1ZSk7Cgl9CS8vCWZ1bmN0aW9uIEhPVVJPRkRBWSgpCgoKCS8qKgoJICogTUlOVVRFT0ZIT1VSCgkgKgoJICogUmV0dXJucyB0aGUgbWludXRlcyBvZiBhIHRpbWUgdmFsdWUuCgkgKiBUaGUgbWludXRlIGlzIGdpdmVuIGFzIGFuIGludGVnZXIsIHJhbmdpbmcgZnJvbSAwIHRvIDU5LgoJICoKCSAqIEV4Y2VsIEZ1bmN0aW9uOgoJICoJCU1JTlVURSh0aW1lVmFsdWUpCgkgKgoJICogQHBhcmFtCW1peGVkCSR0aW1lVmFsdWUJCUV4Y2VsIGRhdGUgc2VyaWFsIHZhbHVlIChmbG9hdCksIFBIUCBkYXRlIHRpbWVzdGFtcCAoaW50ZWdlciksCgkgKgkJCQkJCQkJCVBIUCBEYXRlVGltZSBvYmplY3QsIG9yIGEgc3RhbmRhcmQgdGltZSBzdHJpbmcKCSAqIEByZXR1cm4JaW50CQlNaW51dGUKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBNSU5VVEVPRkhPVVIoJHRpbWVWYWx1ZSA9IDApIHsKCQkkdGltZVZhbHVlID0gJHRpbWVUZXN0ZXIJPSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5TaW5nbGVWYWx1ZSgkdGltZVZhbHVlKTsKCgkJaWYgKCFpc19udW1lcmljKCR0aW1lVmFsdWUpKSB7CgkJCWlmIChQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmdldENvbXBhdGliaWxpdHlNb2RlKCkgPT0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpDT01QQVRJQklMSVRZX0dOVU1FUklDKSB7CgkJCQkkdGVzdFZhbCA9IHN0cnRvaygkdGltZVZhbHVlLCcvLTogJyk7CgkJCQlpZiAoc3RybGVuKCR0ZXN0VmFsKSA8IHN0cmxlbigkdGltZVZhbHVlKSkgewoJCQkJCXJldHVybiBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OlZBTFVFKCk7CgkJCQl9CgkJCX0KCQkJJHRpbWVWYWx1ZSA9IHNlbGY6Ol9nZXRUaW1lVmFsdWUoJHRpbWVWYWx1ZSk7CgkJCWlmIChpc19zdHJpbmcoJHRpbWVWYWx1ZSkpIHsKCQkJCXJldHVybiBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OlZBTFVFKCk7CgkJCX0KCQl9CgkJLy8gRXhlY3V0ZSBmdW5jdGlvbgoJCWlmICgkdGltZVZhbHVlID49IDEpIHsKCQkJJHRpbWVWYWx1ZSA9IGZtb2QoJHRpbWVWYWx1ZSwxKTsKCQl9IGVsc2VpZiAoJHRpbWVWYWx1ZSA8IDAuMCkgewoJCQlyZXR1cm4gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpOYU4oKTsKCQl9CgkJJHRpbWVWYWx1ZSA9IFBIUEV4Y2VsX1NoYXJlZF9EYXRlOjpFeGNlbFRvUEhQKCR0aW1lVmFsdWUpOwoKCQlyZXR1cm4gKGludCkgZ21kYXRlKCdpJywkdGltZVZhbHVlKTsKCX0JLy8JZnVuY3Rpb24gTUlOVVRFT0ZIT1VSKCkKCgoJLyoqCgkgKiBTRUNPTkRPRk1JTlVURQoJICoKCSAqIFJldHVybnMgdGhlIHNlY29uZHMgb2YgYSB0aW1lIHZhbHVlLgoJICogVGhlIHNlY29uZCBpcyBnaXZlbiBhcyBhbiBpbnRlZ2VyIGluIHRoZSByYW5nZSAwICh6ZXJvKSB0byA1OS4KCSAqCgkgKiBFeGNlbCBGdW5jdGlvbjoKCSAqCQlTRUNPTkQodGltZVZhbHVlKQoJICoKCSAqIEBwYXJhbQltaXhlZAkkdGltZVZhbHVlCQlFeGNlbCBkYXRlIHNlcmlhbCB2YWx1ZSAoZmxvYXQpLCBQSFAgZGF0ZSB0aW1lc3RhbXAgKGludGVnZXIpLAoJICoJCQkJCQkJCQlQSFAgRGF0ZVRpbWUgb2JqZWN0LCBvciBhIHN0YW5kYXJkIHRpbWUgc3RyaW5nCgkgKiBAcmV0dXJuCWludAkJU2Vjb25kCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gU0VDT05ET0ZNSU5VVEUoJHRpbWVWYWx1ZSA9IDApIHsKCQkkdGltZVZhbHVlCT0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuU2luZ2xlVmFsdWUoJHRpbWVWYWx1ZSk7CgoJCWlmICghaXNfbnVtZXJpYygkdGltZVZhbHVlKSkgewoJCQlpZiAoUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpnZXRDb21wYXRpYmlsaXR5TW9kZSgpID09IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6Q09NUEFUSUJJTElUWV9HTlVNRVJJQykgewoJCQkJJHRlc3RWYWwgPSBzdHJ0b2soJHRpbWVWYWx1ZSwnLy06ICcpOwoJCQkJaWYgKHN0cmxlbigkdGVzdFZhbCkgPCBzdHJsZW4oJHRpbWVWYWx1ZSkpIHsKCQkJCQlyZXR1cm4gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpWQUxVRSgpOwoJCQkJfQoJCQl9CgkJCSR0aW1lVmFsdWUgPSBzZWxmOjpfZ2V0VGltZVZhbHVlKCR0aW1lVmFsdWUpOwoJCQlpZiAoaXNfc3RyaW5nKCR0aW1lVmFsdWUpKSB7CgkJCQlyZXR1cm4gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpWQUxVRSgpOwoJCQl9CgkJfQoJCS8vIEV4ZWN1dGUgZnVuY3Rpb24KCQlpZiAoJHRpbWVWYWx1ZSA+PSAxKSB7CgkJCSR0aW1lVmFsdWUgPSBmbW9kKCR0aW1lVmFsdWUsMSk7CgkJfSBlbHNlaWYgKCR0aW1lVmFsdWUgPCAwLjApIHsKCQkJcmV0dXJuIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6TmFOKCk7CgkJfQoJCSR0aW1lVmFsdWUgPSBQSFBFeGNlbF9TaGFyZWRfRGF0ZTo6RXhjZWxUb1BIUCgkdGltZVZhbHVlKTsKCgkJcmV0dXJuIChpbnQpIGdtZGF0ZSgncycsJHRpbWVWYWx1ZSk7Cgl9CS8vCWZ1bmN0aW9uIFNFQ09ORE9GTUlOVVRFKCkKCgoJLyoqCgkgKiBFREFURQoJICoKCSAqIFJldHVybnMgdGhlIHNlcmlhbCBudW1iZXIgdGhhdCByZXByZXNlbnRzIHRoZSBkYXRlIHRoYXQgaXMgdGhlIGluZGljYXRlZCBudW1iZXIgb2YgbW9udGhzCgkgKiBiZWZvcmUgb3IgYWZ0ZXIgYSBzcGVjaWZpZWQgZGF0ZSAodGhlIHN0YXJ0X2RhdGUpLgoJICogVXNlIEVEQVRFIHRvIGNhbGN1bGF0ZSBtYXR1cml0eSBkYXRlcyBvciBkdWUgZGF0ZXMgdGhhdCBmYWxsIG9uIHRoZSBzYW1lIGRheSBvZiB0aGUgbW9udGgKCSAqIGFzIHRoZSBkYXRlIG9mIGlzc3VlLgoJICoKCSAqIEV4Y2VsIEZ1bmN0aW9uOgoJICoJCUVEQVRFKGRhdGVWYWx1ZSxhZGp1c3RtZW50TW9udGhzKQoJICoKCSAqIEBwYXJhbQltaXhlZAkkZGF0ZVZhbHVlCQkJRXhjZWwgZGF0ZSBzZXJpYWwgdmFsdWUgKGZsb2F0KSwgUEhQIGRhdGUgdGltZXN0YW1wIChpbnRlZ2VyKSwKCSAqCQkJCQkJCQkJCVBIUCBEYXRlVGltZSBvYmplY3QsIG9yIGEgc3RhbmRhcmQgZGF0ZSBzdHJpbmcKCSAqIEBwYXJhbQlpbnQJCSRhZGp1c3RtZW50TW9udGhzCVRoZSBudW1iZXIgb2YgbW9udGhzIGJlZm9yZSBvciBhZnRlciBzdGFydF9kYXRlLgoJICoJCQkJCQkJCQkJQSBwb3NpdGl2ZSB2YWx1ZSBmb3IgbW9udGhzIHlpZWxkcyBhIGZ1dHVyZSBkYXRlOwoJICoJCQkJCQkJCQkJYSBuZWdhdGl2ZSB2YWx1ZSB5aWVsZHMgYSBwYXN0IGRhdGUuCgkgKiBAcmV0dXJuCW1peGVkCUV4Y2VsIGRhdGUvdGltZSBzZXJpYWwgdmFsdWUsIFBIUCBkYXRlL3RpbWUgc2VyaWFsIHZhbHVlIG9yIFBIUCBkYXRlL3RpbWUgb2JqZWN0LAoJICoJCQkJCQlkZXBlbmRpbmcgb24gdGhlIHZhbHVlIG9mIHRoZSBSZXR1cm5EYXRlVHlwZSBmbGFnCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gRURBVEUoJGRhdGVWYWx1ZSA9IDEsICRhZGp1c3RtZW50TW9udGhzID0gMCkgewoJCSRkYXRlVmFsdWUJCQk9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlblNpbmdsZVZhbHVlKCRkYXRlVmFsdWUpOwoJCSRhZGp1c3RtZW50TW9udGhzCT0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuU2luZ2xlVmFsdWUoJGFkanVzdG1lbnRNb250aHMpOwoKCQlpZiAoIWlzX251bWVyaWMoJGFkanVzdG1lbnRNb250aHMpKSB7CgkJCXJldHVybiBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OlZBTFVFKCk7CgkJfQoJCSRhZGp1c3RtZW50TW9udGhzID0gZmxvb3IoJGFkanVzdG1lbnRNb250aHMpOwoKCQlpZiAoaXNfc3RyaW5nKCRkYXRlVmFsdWUgPSBzZWxmOjpfZ2V0RGF0ZVZhbHVlKCRkYXRlVmFsdWUpKSkgewoJCQlyZXR1cm4gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpWQUxVRSgpOwoJCX0KCgkJLy8gRXhlY3V0ZSBmdW5jdGlvbgoJCSRQSFBEYXRlT2JqZWN0ID0gc2VsZjo6X2FkanVzdERhdGVCeU1vbnRocygkZGF0ZVZhbHVlLCRhZGp1c3RtZW50TW9udGhzKTsKCgkJc3dpdGNoIChQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmdldFJldHVybkRhdGVUeXBlKCkpIHsKCQkJY2FzZSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OlJFVFVSTkRBVEVfRVhDRUwgOgoJCQkJCXJldHVybiAoZmxvYXQpIFBIUEV4Y2VsX1NoYXJlZF9EYXRlOjpQSFBUb0V4Y2VsKCRQSFBEYXRlT2JqZWN0KTsKCQkJY2FzZSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OlJFVFVSTkRBVEVfUEhQX05VTUVSSUMgOgoJCQkJCXJldHVybiAoaW50ZWdlcikgUEhQRXhjZWxfU2hhcmVkX0RhdGU6OkV4Y2VsVG9QSFAoUEhQRXhjZWxfU2hhcmVkX0RhdGU6OlBIUFRvRXhjZWwoJFBIUERhdGVPYmplY3QpKTsKCQkJY2FzZSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OlJFVFVSTkRBVEVfUEhQX09CSkVDVCA6CgkJCQkJcmV0dXJuICRQSFBEYXRlT2JqZWN0OwoJCX0KCX0JLy8JZnVuY3Rpb24gRURBVEUoKQoKCgkvKioKCSAqIEVPTU9OVEgKCSAqCgkgKiBSZXR1cm5zIHRoZSBkYXRlIHZhbHVlIGZvciB0aGUgbGFzdCBkYXkgb2YgdGhlIG1vbnRoIHRoYXQgaXMgdGhlIGluZGljYXRlZCBudW1iZXIgb2YgbW9udGhzCgkgKiBiZWZvcmUgb3IgYWZ0ZXIgc3RhcnRfZGF0ZS4KCSAqIFVzZSBFT01PTlRIIHRvIGNhbGN1bGF0ZSBtYXR1cml0eSBkYXRlcyBvciBkdWUgZGF0ZXMgdGhhdCBmYWxsIG9uIHRoZSBsYXN0IGRheSBvZiB0aGUgbW9udGguCgkgKgoJICogRXhjZWwgRnVuY3Rpb246CgkgKgkJRU9NT05USChkYXRlVmFsdWUsYWRqdXN0bWVudE1vbnRocykKCSAqCgkgKiBAcGFyYW0JbWl4ZWQJJGRhdGVWYWx1ZQkJCUV4Y2VsIGRhdGUgc2VyaWFsIHZhbHVlIChmbG9hdCksIFBIUCBkYXRlIHRpbWVzdGFtcCAoaW50ZWdlciksCgkgKgkJCQkJCQkJCQlQSFAgRGF0ZVRpbWUgb2JqZWN0LCBvciBhIHN0YW5kYXJkIGRhdGUgc3RyaW5nCgkgKiBAcGFyYW0JaW50CQkkYWRqdXN0bWVudE1vbnRocwlUaGUgbnVtYmVyIG9mIG1vbnRocyBiZWZvcmUgb3IgYWZ0ZXIgc3RhcnRfZGF0ZS4KCSAqCQkJCQkJCQkJCUEgcG9zaXRpdmUgdmFsdWUgZm9yIG1vbnRocyB5aWVsZHMgYSBmdXR1cmUgZGF0ZTsKCSAqCQkJCQkJCQkJCWEgbmVnYXRpdmUgdmFsdWUgeWllbGRzIGEgcGFzdCBkYXRlLgoJICogQHJldHVybgltaXhlZAlFeGNlbCBkYXRlL3RpbWUgc2VyaWFsIHZhbHVlLCBQSFAgZGF0ZS90aW1lIHNlcmlhbCB2YWx1ZSBvciBQSFAgZGF0ZS90aW1lIG9iamVjdCwKCSAqCQkJCQkJZGVwZW5kaW5nIG9uIHRoZSB2YWx1ZSBvZiB0aGUgUmV0dXJuRGF0ZVR5cGUgZmxhZwoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIEVPTU9OVEgoJGRhdGVWYWx1ZSA9IDEsICRhZGp1c3RtZW50TW9udGhzID0gMCkgewoJCSRkYXRlVmFsdWUJCQk9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlblNpbmdsZVZhbHVlKCRkYXRlVmFsdWUpOwoJCSRhZGp1c3RtZW50TW9udGhzCT0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuU2luZ2xlVmFsdWUoJGFkanVzdG1lbnRNb250aHMpOwoKCQlpZiAoIWlzX251bWVyaWMoJGFkanVzdG1lbnRNb250aHMpKSB7CgkJCXJldHVybiBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OlZBTFVFKCk7CgkJfQoJCSRhZGp1c3RtZW50TW9udGhzID0gZmxvb3IoJGFkanVzdG1lbnRNb250aHMpOwoKCQlpZiAoaXNfc3RyaW5nKCRkYXRlVmFsdWUgPSBzZWxmOjpfZ2V0RGF0ZVZhbHVlKCRkYXRlVmFsdWUpKSkgewoJCQlyZXR1cm4gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpWQUxVRSgpOwoJCX0KCgkJLy8gRXhlY3V0ZSBmdW5jdGlvbgoJCSRQSFBEYXRlT2JqZWN0ID0gc2VsZjo6X2FkanVzdERhdGVCeU1vbnRocygkZGF0ZVZhbHVlLCRhZGp1c3RtZW50TW9udGhzKzEpOwoJCSRhZGp1c3REYXlzID0gKGludCkgJFBIUERhdGVPYmplY3QtPmZvcm1hdCgnZCcpOwoJCSRhZGp1c3REYXlzU3RyaW5nID0gJy0nLiRhZGp1c3REYXlzLicgZGF5cyc7CgkJJFBIUERhdGVPYmplY3QtPm1vZGlmeSgkYWRqdXN0RGF5c1N0cmluZyk7CgoJCXN3aXRjaCAoUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpnZXRSZXR1cm5EYXRlVHlwZSgpKSB7CgkJCWNhc2UgUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpSRVRVUk5EQVRFX0VYQ0VMIDoKCQkJCQlyZXR1cm4gKGZsb2F0KSBQSFBFeGNlbF9TaGFyZWRfRGF0ZTo6UEhQVG9FeGNlbCgkUEhQRGF0ZU9iamVjdCk7CgkJCWNhc2UgUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpSRVRVUk5EQVRFX1BIUF9OVU1FUklDIDoKCQkJCQlyZXR1cm4gKGludGVnZXIpIFBIUEV4Y2VsX1NoYXJlZF9EYXRlOjpFeGNlbFRvUEhQKFBIUEV4Y2VsX1NoYXJlZF9EYXRlOjpQSFBUb0V4Y2VsKCRQSFBEYXRlT2JqZWN0KSk7CgkJCWNhc2UgUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpSRVRVUk5EQVRFX1BIUF9PQkpFQ1QgOgoJCQkJCXJldHVybiAkUEhQRGF0ZU9iamVjdDsKCQl9Cgl9CS8vCWZ1bmN0aW9uIEVPTU9OVEgoKQoKfQkvLwljbGFzcyBQSFBFeGNlbF9DYWxjdWxhdGlvbl9EYXRlVGltZQoK]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Calculation/Engineering.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIFBIUEV4Y2VsCiAqCiAqIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKICoKICogQGNhdGVnb3J5CVBIUEV4Y2VsCiAqIEBwYWNrYWdlCQlQSFBFeGNlbF9DYWxjdWxhdGlvbgogKiBAY29weXJpZ2h0CUNvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwgKGh0dHA6Ly93d3cuY29kZXBsZXguY29tL1BIUEV4Y2VsKQogKiBAbGljZW5zZQkJaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL29sZC1saWNlbnNlcy9sZ3BsLTIuMS50eHQJTEdQTAogKiBAdmVyc2lvbgkJMS43LjcsIDIwMTItMDUtMTkKICovCgoKLyoqIFBIUEV4Y2VsIHJvb3QgZGlyZWN0b3J5ICovCmlmICghZGVmaW5lZCgnUEhQRVhDRUxfUk9PVCcpKSB7CgkvKioKCSAqIEBpZ25vcmUKCSAqLwoJZGVmaW5lKCdQSFBFWENFTF9ST09UJywgZGlybmFtZShfX0ZJTEVfXykgLiAnLy4uLy4uLycpOwoJcmVxdWlyZShQSFBFWENFTF9ST09UIC4gJ1BIUEV4Y2VsL0F1dG9sb2FkZXIucGhwJyk7Cn0KCgovKiogRVVMRVIgKi8KZGVmaW5lKCdFVUxFUicsIDIuNzE4MjgxODI4NDU5MDQ1MjM1MzYpOwoKCi8qKgogKiBQSFBFeGNlbF9DYWxjdWxhdGlvbl9FbmdpbmVlcmluZwogKgogKiBAY2F0ZWdvcnkJUEhQRXhjZWwKICogQHBhY2thZ2UJCVBIUEV4Y2VsX0NhbGN1bGF0aW9uCiAqIEBjb3B5cmlnaHQJQ29weXJpZ2h0IChjKSAyMDA2IC0gMjAxMiBQSFBFeGNlbCAoaHR0cDovL3d3dy5jb2RlcGxleC5jb20vUEhQRXhjZWwpCiAqLwpjbGFzcyBQSFBFeGNlbF9DYWxjdWxhdGlvbl9FbmdpbmVlcmluZyB7CgoJLyoqCgkgKiBEZXRhaWxzIG9mIHRoZSBVbml0cyBvZiBtZWFzdXJlIHRoYXQgY2FuIGJlIHVzZWQgaW4gQ09OVkVSVFVPTSgpCgkgKgoJICogQHZhciBtaXhlZFtdCgkgKi8KCXByaXZhdGUgc3RhdGljICRfY29udmVyc2lvblVuaXRzID0gYXJyYXkoICdnJwkJPT4gYXJyYXkoCSdHcm91cCcJPT4gJ01hc3MnLAkJCSdVbml0IE5hbWUnCT0+ICdHcmFtJywJCQkJCQknQWxsb3dQcmVmaXgnCT0+IFRydWUJCSksCgkJCQkJCQkJCQkJICAnc2cnCQk9PiBhcnJheSgJJ0dyb3VwJwk9PiAnTWFzcycsCQkJJ1VuaXQgTmFtZScJPT4gJ1NsdWcnLAkJCQkJCSdBbGxvd1ByZWZpeCcJPT4gRmFsc2UJKSwKCQkJCQkJCQkJCQkgICdsYm0nCQk9PiBhcnJheSgJJ0dyb3VwJwk9PiAnTWFzcycsCQkJJ1VuaXQgTmFtZScJPT4gJ1BvdW5kIG1hc3MgKGF2b2lyZHVwb2lzKScsCSdBbGxvd1ByZWZpeCcJPT4gRmFsc2UJKSwKCQkJCQkJCQkJCQkgICd1JwkJPT4gYXJyYXkoCSdHcm91cCcJPT4gJ01hc3MnLAkJCSdVbml0IE5hbWUnCT0+ICdVIChhdG9taWMgbWFzcyB1bml0KScsCQknQWxsb3dQcmVmaXgnCT0+IFRydWUJCSksCgkJCQkJCQkJCQkJICAnb3ptJwkJPT4gYXJyYXkoCSdHcm91cCcJPT4gJ01hc3MnLAkJCSdVbml0IE5hbWUnCT0+ICdPdW5jZSBtYXNzIChhdm9pcmR1cG9pcyknLAknQWxsb3dQcmVmaXgnCT0+IEZhbHNlCSksCgkJCQkJCQkJCQkJICAnbScJCT0+IGFycmF5KAknR3JvdXAnCT0+ICdEaXN0YW5jZScsCQknVW5pdCBOYW1lJwk9PiAnTWV0ZXInLAkJCQkJCSdBbGxvd1ByZWZpeCcJPT4gVHJ1ZQkJKSwKCQkJCQkJCQkJCQkgICdtaScJCT0+IGFycmF5KAknR3JvdXAnCT0+ICdEaXN0YW5jZScsCQknVW5pdCBOYW1lJwk9PiAnU3RhdHV0ZSBtaWxlJywJCQkJJ0FsbG93UHJlZml4Jwk9PiBGYWxzZQkpLAoJCQkJCQkJCQkJCSAgJ05taScJCT0+IGFycmF5KAknR3JvdXAnCT0+ICdEaXN0YW5jZScsCQknVW5pdCBOYW1lJwk9PiAnTmF1dGljYWwgbWlsZScsCQkJCSdBbGxvd1ByZWZpeCcJPT4gRmFsc2UJKSwKCQkJCQkJCQkJCQkgICdpbicJCT0+IGFycmF5KAknR3JvdXAnCT0+ICdEaXN0YW5jZScsCQknVW5pdCBOYW1lJwk9PiAnSW5jaCcsCQkJCQkJJ0FsbG93UHJlZml4Jwk9PiBGYWxzZQkpLAoJCQkJCQkJCQkJCSAgJ2Z0JwkJPT4gYXJyYXkoCSdHcm91cCcJPT4gJ0Rpc3RhbmNlJywJCSdVbml0IE5hbWUnCT0+ICdGb290JywJCQkJCQknQWxsb3dQcmVmaXgnCT0+IEZhbHNlCSksCgkJCQkJCQkJCQkJICAneWQnCQk9PiBhcnJheSgJJ0dyb3VwJwk9PiAnRGlzdGFuY2UnLAkJJ1VuaXQgTmFtZScJPT4gJ1lhcmQnLAkJCQkJCSdBbGxvd1ByZWZpeCcJPT4gRmFsc2UJKSwKCQkJCQkJCQkJCQkgICdhbmcnCQk9PiBhcnJheSgJJ0dyb3VwJwk9PiAnRGlzdGFuY2UnLAkJJ1VuaXQgTmFtZScJPT4gJ0FuZ3N0cm9tJywJCQkJCSdBbGxvd1ByZWZpeCcJPT4gVHJ1ZQkJKSwKCQkJCQkJCQkJCQkgICdQaWNhJwk9PiBhcnJheSgJJ0dyb3VwJwk9PiAnRGlzdGFuY2UnLAkJJ1VuaXQgTmFtZScJPT4gJ1BpY2EgKDEvNzIgaW4pJywJCQknQWxsb3dQcmVmaXgnCT0+IEZhbHNlCSksCgkJCQkJCQkJCQkJICAneXInCQk9PiBhcnJheSgJJ0dyb3VwJwk9PiAnVGltZScsCQkJJ1VuaXQgTmFtZScJPT4gJ1llYXInLAkJCQkJCSdBbGxvd1ByZWZpeCcJPT4gRmFsc2UJKSwKCQkJCQkJCQkJCQkgICdkYXknCQk9PiBhcnJheSgJJ0dyb3VwJwk9PiAnVGltZScsCQkJJ1VuaXQgTmFtZScJPT4gJ0RheScsCQkJCQkJJ0FsbG93UHJlZml4Jwk9PiBGYWxzZQkpLAoJCQkJCQkJCQkJCSAgJ2hyJwkJPT4gYXJyYXkoCSdHcm91cCcJPT4gJ1RpbWUnLAkJCSdVbml0IE5hbWUnCT0+ICdIb3VyJywJCQkJCQknQWxsb3dQcmVmaXgnCT0+IEZhbHNlCSksCgkJCQkJCQkJCQkJICAnbW4nCQk9PiBhcnJheSgJJ0dyb3VwJwk9PiAnVGltZScsCQkJJ1VuaXQgTmFtZScJPT4gJ01pbnV0ZScsCQkJCQknQWxsb3dQcmVmaXgnCT0+IEZhbHNlCSksCgkJCQkJCQkJCQkJICAnc2VjJwkJPT4gYXJyYXkoCSdHcm91cCcJPT4gJ1RpbWUnLAkJCSdVbml0IE5hbWUnCT0+ICdTZWNvbmQnLAkJCQkJJ0FsbG93UHJlZml4Jwk9PiBUcnVlCQkpLAoJCQkJCQkJCQkJCSAgJ1BhJwkJPT4gYXJyYXkoCSdHcm91cCcJPT4gJ1ByZXNzdXJlJywJCSdVbml0IE5hbWUnCT0+ICdQYXNjYWwnLAkJCQkJJ0FsbG93UHJlZml4Jwk9PiBUcnVlCQkpLAoJCQkJCQkJCQkJCSAgJ3AnCQk9PiBhcnJheSgJJ0dyb3VwJwk9PiAnUHJlc3N1cmUnLAkJJ1VuaXQgTmFtZScJPT4gJ1Bhc2NhbCcsCQkJCQknQWxsb3dQcmVmaXgnCT0+IFRydWUJCSksCgkJCQkJCQkJCQkJICAnYXRtJwkJPT4gYXJyYXkoCSdHcm91cCcJPT4gJ1ByZXNzdXJlJywJCSdVbml0IE5hbWUnCT0+ICdBdG1vc3BoZXJlJywJCQkJJ0FsbG93UHJlZml4Jwk9PiBUcnVlCQkpLAoJCQkJCQkJCQkJCSAgJ2F0JwkJPT4gYXJyYXkoCSdHcm91cCcJPT4gJ1ByZXNzdXJlJywJCSdVbml0IE5hbWUnCT0+ICdBdG1vc3BoZXJlJywJCQkJJ0FsbG93UHJlZml4Jwk9PiBUcnVlCQkpLAoJCQkJCQkJCQkJCSAgJ21tSGcnCT0+IGFycmF5KAknR3JvdXAnCT0+ICdQcmVzc3VyZScsCQknVW5pdCBOYW1lJwk9PiAnbW0gb2YgTWVyY3VyeScsCQkJCSdBbGxvd1ByZWZpeCcJPT4gVHJ1ZQkJKSwKCQkJCQkJCQkJCQkgICdOJwkJPT4gYXJyYXkoCSdHcm91cCcJPT4gJ0ZvcmNlJywJCQknVW5pdCBOYW1lJwk9PiAnTmV3dG9uJywJCQkJCSdBbGxvd1ByZWZpeCcJPT4gVHJ1ZQkJKSwKCQkJCQkJCQkJCQkgICdkeW4nCQk9PiBhcnJheSgJJ0dyb3VwJwk9PiAnRm9yY2UnLAkJCSdVbml0IE5hbWUnCT0+ICdEeW5lJywJCQkJCQknQWxsb3dQcmVmaXgnCT0+IFRydWUJCSksCgkJCQkJCQkJCQkJICAnZHknCQk9PiBhcnJheSgJJ0dyb3VwJwk9PiAnRm9yY2UnLAkJCSdVbml0IE5hbWUnCT0+ICdEeW5lJywJCQkJCQknQWxsb3dQcmVmaXgnCT0+IFRydWUJCSksCgkJCQkJCQkJCQkJICAnbGJmJwkJPT4gYXJyYXkoCSdHcm91cCcJPT4gJ0ZvcmNlJywJCQknVW5pdCBOYW1lJwk9PiAnUG91bmQgZm9yY2UnLAkJCQknQWxsb3dQcmVmaXgnCT0+IEZhbHNlCSksCgkJCQkJCQkJCQkJICAnSicJCT0+IGFycmF5KAknR3JvdXAnCT0+ICdFbmVyZ3knLAkJJ1VuaXQgTmFtZScJPT4gJ0pvdWxlJywJCQkJCQknQWxsb3dQcmVmaXgnCT0+IFRydWUJCSksCgkJCQkJCQkJCQkJICAnZScJCT0+IGFycmF5KAknR3JvdXAnCT0+ICdFbmVyZ3knLAkJJ1VuaXQgTmFtZScJPT4gJ0VyZycsCQkJCQkJJ0FsbG93UHJlZml4Jwk9PiBUcnVlCQkpLAoJCQkJCQkJCQkJCSAgJ2MnCQk9PiBhcnJheSgJJ0dyb3VwJwk9PiAnRW5lcmd5JywJCSdVbml0IE5hbWUnCT0+ICdUaGVybW9keW5hbWljIGNhbG9yaWUnLAkJJ0FsbG93UHJlZml4Jwk9PiBUcnVlCQkpLAoJCQkJCQkJCQkJCSAgJ2NhbCcJCT0+IGFycmF5KAknR3JvdXAnCT0+ICdFbmVyZ3knLAkJJ1VuaXQgTmFtZScJPT4gJ0lUIGNhbG9yaWUnLAkJCQknQWxsb3dQcmVmaXgnCT0+IFRydWUJCSksCgkJCQkJCQkJCQkJICAnZVYnCQk9PiBhcnJheSgJJ0dyb3VwJwk9PiAnRW5lcmd5JywJCSdVbml0IE5hbWUnCT0+ICdFbGVjdHJvbiB2b2x0JywJCQkJJ0FsbG93UHJlZml4Jwk9PiBUcnVlCQkpLAoJCQkJCQkJCQkJCSAgJ2V2JwkJPT4gYXJyYXkoCSdHcm91cCcJPT4gJ0VuZXJneScsCQknVW5pdCBOYW1lJwk9PiAnRWxlY3Ryb24gdm9sdCcsCQkJCSdBbGxvd1ByZWZpeCcJPT4gVHJ1ZQkJKSwKCQkJCQkJCQkJCQkgICdIUGgnCQk9PiBhcnJheSgJJ0dyb3VwJwk9PiAnRW5lcmd5JywJCSdVbml0IE5hbWUnCT0+ICdIb3JzZXBvd2VyLWhvdXInLAkJCSdBbGxvd1ByZWZpeCcJPT4gRmFsc2UJKSwKCQkJCQkJCQkJCQkgICdoaCcJCT0+IGFycmF5KAknR3JvdXAnCT0+ICdFbmVyZ3knLAkJJ1VuaXQgTmFtZScJPT4gJ0hvcnNlcG93ZXItaG91cicsCQkJJ0FsbG93UHJlZml4Jwk9PiBGYWxzZQkpLAoJCQkJCQkJCQkJCSAgJ1doJwkJPT4gYXJyYXkoCSdHcm91cCcJPT4gJ0VuZXJneScsCQknVW5pdCBOYW1lJwk9PiAnV2F0dC1ob3VyJywJCQkJCSdBbGxvd1ByZWZpeCcJPT4gVHJ1ZQkJKSwKCQkJCQkJCQkJCQkgICd3aCcJCT0+IGFycmF5KAknR3JvdXAnCT0+ICdFbmVyZ3knLAkJJ1VuaXQgTmFtZScJPT4gJ1dhdHQtaG91cicsCQkJCQknQWxsb3dQcmVmaXgnCT0+IFRydWUJCSksCgkJCQkJCQkJCQkJICAnZmxiJwkJPT4gYXJyYXkoCSdHcm91cCcJPT4gJ0VuZXJneScsCQknVW5pdCBOYW1lJwk9PiAnRm9vdC1wb3VuZCcsCQkJCSdBbGxvd1ByZWZpeCcJPT4gRmFsc2UJKSwKCQkJCQkJCQkJCQkgICdCVFUnCQk9PiBhcnJheSgJJ0dyb3VwJwk9PiAnRW5lcmd5JywJCSdVbml0IE5hbWUnCT0+ICdCVFUnLAkJCQkJCSdBbGxvd1ByZWZpeCcJPT4gRmFsc2UJKSwKCQkJCQkJCQkJCQkgICdidHUnCQk9PiBhcnJheSgJJ0dyb3VwJwk9PiAnRW5lcmd5JywJCSdVbml0IE5hbWUnCT0+ICdCVFUnLAkJCQkJCSdBbGxvd1ByZWZpeCcJPT4gRmFsc2UJKSwKCQkJCQkJCQkJCQkgICdIUCcJCT0+IGFycmF5KAknR3JvdXAnCT0+ICdQb3dlcicsCQkJJ1VuaXQgTmFtZScJPT4gJ0hvcnNlcG93ZXInLAkJCQknQWxsb3dQcmVmaXgnCT0+IEZhbHNlCSksCgkJCQkJCQkJCQkJICAnaCcJCT0+IGFycmF5KAknR3JvdXAnCT0+ICdQb3dlcicsCQkJJ1VuaXQgTmFtZScJPT4gJ0hvcnNlcG93ZXInLAkJCQknQWxsb3dQcmVmaXgnCT0+IEZhbHNlCSksCgkJCQkJCQkJCQkJICAnVycJCT0+IGFycmF5KAknR3JvdXAnCT0+ICdQb3dlcicsCQkJJ1VuaXQgTmFtZScJPT4gJ1dhdHQnLAkJCQkJCSdBbGxvd1ByZWZpeCcJPT4gVHJ1ZQkJKSwKCQkJCQkJCQkJCQkgICd3JwkJPT4gYXJyYXkoCSdHcm91cCcJPT4gJ1Bvd2VyJywJCQknVW5pdCBOYW1lJwk9PiAnV2F0dCcsCQkJCQkJJ0FsbG93UHJlZml4Jwk9PiBUcnVlCQkpLAoJCQkJCQkJCQkJCSAgJ1QnCQk9PiBhcnJheSgJJ0dyb3VwJwk9PiAnTWFnbmV0aXNtJywJCSdVbml0IE5hbWUnCT0+ICdUZXNsYScsCQkJCQkJJ0FsbG93UHJlZml4Jwk9PiBUcnVlCQkpLAoJCQkJCQkJCQkJCSAgJ2dhJwkJPT4gYXJyYXkoCSdHcm91cCcJPT4gJ01hZ25ldGlzbScsCQknVW5pdCBOYW1lJwk9PiAnR2F1c3MnLAkJCQkJCSdBbGxvd1ByZWZpeCcJPT4gVHJ1ZQkJKSwKCQkJCQkJCQkJCQkgICdDJwkJPT4gYXJyYXkoCSdHcm91cCcJPT4gJ1RlbXBlcmF0dXJlJywJJ1VuaXQgTmFtZScJPT4gJ0NlbHNpdXMnLAkJCQkJJ0FsbG93UHJlZml4Jwk9PiBGYWxzZQkpLAoJCQkJCQkJCQkJCSAgJ2NlbCcJCT0+IGFycmF5KAknR3JvdXAnCT0+ICdUZW1wZXJhdHVyZScsCSdVbml0IE5hbWUnCT0+ICdDZWxzaXVzJywJCQkJCSdBbGxvd1ByZWZpeCcJPT4gRmFsc2UJKSwKCQkJCQkJCQkJCQkgICdGJwkJPT4gYXJyYXkoCSdHcm91cCcJPT4gJ1RlbXBlcmF0dXJlJywJJ1VuaXQgTmFtZScJPT4gJ0ZhaHJlbmhlaXQnLAkJCQknQWxsb3dQcmVmaXgnCT0+IEZhbHNlCSksCgkJCQkJCQkJCQkJICAnZmFoJwkJPT4gYXJyYXkoCSdHcm91cCcJPT4gJ1RlbXBlcmF0dXJlJywJJ1VuaXQgTmFtZScJPT4gJ0ZhaHJlbmhlaXQnLAkJCQknQWxsb3dQcmVmaXgnCT0+IEZhbHNlCSksCgkJCQkJCQkJCQkJICAnSycJCT0+IGFycmF5KAknR3JvdXAnCT0+ICdUZW1wZXJhdHVyZScsCSdVbml0IE5hbWUnCT0+ICdLZWx2aW4nLAkJCQkJJ0FsbG93UHJlZml4Jwk9PiBGYWxzZQkpLAoJCQkJCQkJCQkJCSAgJ2tlbCcJCT0+IGFycmF5KAknR3JvdXAnCT0+ICdUZW1wZXJhdHVyZScsCSdVbml0IE5hbWUnCT0+ICdLZWx2aW4nLAkJCQkJJ0FsbG93UHJlZml4Jwk9PiBGYWxzZQkpLAoJCQkJCQkJCQkJCSAgJ3RzcCcJCT0+IGFycmF5KAknR3JvdXAnCT0+ICdMaXF1aWQnLAkJJ1VuaXQgTmFtZScJPT4gJ1RlYXNwb29uJywJCQkJCSdBbGxvd1ByZWZpeCcJPT4gRmFsc2UJKSwKCQkJCQkJCQkJCQkgICd0YnMnCQk9PiBhcnJheSgJJ0dyb3VwJwk9PiAnTGlxdWlkJywJCSdVbml0IE5hbWUnCT0+ICdUYWJsZXNwb29uJywJCQkJJ0FsbG93UHJlZml4Jwk9PiBGYWxzZQkpLAoJCQkJCQkJCQkJCSAgJ296JwkJPT4gYXJyYXkoCSdHcm91cCcJPT4gJ0xpcXVpZCcsCQknVW5pdCBOYW1lJwk9PiAnRmx1aWQgT3VuY2UnLAkJCQknQWxsb3dQcmVmaXgnCT0+IEZhbHNlCSksCgkJCQkJCQkJCQkJICAnY3VwJwkJPT4gYXJyYXkoCSdHcm91cCcJPT4gJ0xpcXVpZCcsCQknVW5pdCBOYW1lJwk9PiAnQ3VwJywJCQkJCQknQWxsb3dQcmVmaXgnCT0+IEZhbHNlCSksCgkJCQkJCQkJCQkJICAncHQnCQk9PiBhcnJheSgJJ0dyb3VwJwk9PiAnTGlxdWlkJywJCSdVbml0IE5hbWUnCT0+ICdVLlMuIFBpbnQnLAkJCQkJJ0FsbG93UHJlZml4Jwk9PiBGYWxzZQkpLAoJCQkJCQkJCQkJCSAgJ3VzX3B0Jwk9PiBhcnJheSgJJ0dyb3VwJwk9PiAnTGlxdWlkJywJCSdVbml0IE5hbWUnCT0+ICdVLlMuIFBpbnQnLAkJCQkJJ0FsbG93UHJlZml4Jwk9PiBGYWxzZQkpLAoJCQkJCQkJCQkJCSAgJ3VrX3B0Jwk9PiBhcnJheSgJJ0dyb3VwJwk9PiAnTGlxdWlkJywJCSdVbml0IE5hbWUnCT0+ICdVLksuIFBpbnQnLAkJCQkJJ0FsbG93UHJlZml4Jwk9PiBGYWxzZQkpLAoJCQkJCQkJCQkJCSAgJ3F0JwkJPT4gYXJyYXkoCSdHcm91cCcJPT4gJ0xpcXVpZCcsCQknVW5pdCBOYW1lJwk9PiAnUXVhcnQnLAkJCQkJCSdBbGxvd1ByZWZpeCcJPT4gRmFsc2UJKSwKCQkJCQkJCQkJCQkgICdnYWwnCQk9PiBhcnJheSgJJ0dyb3VwJwk9PiAnTGlxdWlkJywJCSdVbml0IE5hbWUnCT0+ICdHYWxsb24nLAkJCQkJJ0FsbG93UHJlZml4Jwk9PiBGYWxzZQkpLAoJCQkJCQkJCQkJCSAgJ2wnCQk9PiBhcnJheSgJJ0dyb3VwJwk9PiAnTGlxdWlkJywJCSdVbml0IE5hbWUnCT0+ICdMaXRyZScsCQkJCQkJJ0FsbG93UHJlZml4Jwk9PiBUcnVlCQkpLAoJCQkJCQkJCQkJCSAgJ2x0JwkJPT4gYXJyYXkoCSdHcm91cCcJPT4gJ0xpcXVpZCcsCQknVW5pdCBOYW1lJwk9PiAnTGl0cmUnLAkJCQkJCSdBbGxvd1ByZWZpeCcJPT4gVHJ1ZQkJKQoJCQkJCQkJCQkJCSk7CgoJLyoqCgkgKiBEZXRhaWxzIG9mIHRoZSBNdWx0aXBsaWVyIHByZWZpeGVzIHRoYXQgY2FuIGJlIHVzZWQgd2l0aCBVbml0cyBvZiBNZWFzdXJlIGluIENPTlZFUlRVT00oKQoJICoKCSAqIEB2YXIgbWl4ZWRbXQoJICovCglwcml2YXRlIHN0YXRpYyAkX2NvbnZlcnNpb25NdWx0aXBsaWVycyA9IGFycmF5KAknWScJPT4gYXJyYXkoCSdtdWx0aXBsaWVyJwk9PiAxRTI0LAknbmFtZScJPT4gJ3lvdHRhJwkpLAoJCQkJCQkJCQkJCQkJJ1onCT0+IGFycmF5KAknbXVsdGlwbGllcicJPT4gMUUyMSwJJ25hbWUnCT0+ICd6ZXR0YScJKSwKCQkJCQkJCQkJCQkJCSdFJwk9PiBhcnJheSgJJ211bHRpcGxpZXInCT0+IDFFMTgsCSduYW1lJwk9PiAnZXhhJwkpLAoJCQkJCQkJCQkJCQkJJ1AnCT0+IGFycmF5KAknbXVsdGlwbGllcicJPT4gMUUxNSwJJ25hbWUnCT0+ICdwZXRhJwkpLAoJCQkJCQkJCQkJCQkJJ1QnCT0+IGFycmF5KAknbXVsdGlwbGllcicJPT4gMUUxMiwJJ25hbWUnCT0+ICd0ZXJhJwkpLAoJCQkJCQkJCQkJCQkJJ0cnCT0+IGFycmF5KAknbXVsdGlwbGllcicJPT4gMUU5LAkJJ25hbWUnCT0+ICdnaWdhJwkpLAoJCQkJCQkJCQkJCQkJJ00nCT0+IGFycmF5KAknbXVsdGlwbGllcicJPT4gMUU2LAkJJ25hbWUnCT0+ICdtZWdhJwkpLAoJCQkJCQkJCQkJCQkJJ2snCT0+IGFycmF5KAknbXVsdGlwbGllcicJPT4gMUUzLAkJJ25hbWUnCT0+ICdraWxvJwkpLAoJCQkJCQkJCQkJCQkJJ2gnCT0+IGFycmF5KAknbXVsdGlwbGllcicJPT4gMUUyLAkJJ25hbWUnCT0+ICdoZWN0bycJKSwKCQkJCQkJCQkJCQkJCSdlJwk9PiBhcnJheSgJJ211bHRpcGxpZXInCT0+IDFFMSwJCSduYW1lJwk9PiAnZGVrYScJKSwKCQkJCQkJCQkJCQkJCSdkJwk9PiBhcnJheSgJJ211bHRpcGxpZXInCT0+IDFFLTEsCSduYW1lJwk9PiAnZGVjaScJKSwKCQkJCQkJCQkJCQkJCSdjJwk9PiBhcnJheSgJJ211bHRpcGxpZXInCT0+IDFFLTIsCSduYW1lJwk9PiAnY2VudGknCSksCgkJCQkJCQkJCQkJCQknbScJPT4gYXJyYXkoCSdtdWx0aXBsaWVyJwk9PiAxRS0zLAknbmFtZScJPT4gJ21pbGxpJwkpLAoJCQkJCQkJCQkJCQkJJ3UnCT0+IGFycmF5KAknbXVsdGlwbGllcicJPT4gMUUtNiwJJ25hbWUnCT0+ICdtaWNybycJKSwKCQkJCQkJCQkJCQkJCSduJwk9PiBhcnJheSgJJ211bHRpcGxpZXInCT0+IDFFLTksCSduYW1lJwk9PiAnbmFubycJKSwKCQkJCQkJCQkJCQkJCSdwJwk9PiBhcnJheSgJJ211bHRpcGxpZXInCT0+IDFFLTEyLAknbmFtZScJPT4gJ3BpY28nCSksCgkJCQkJCQkJCQkJCQknZicJPT4gYXJyYXkoCSdtdWx0aXBsaWVyJwk9PiAxRS0xNSwJJ25hbWUnCT0+ICdmZW10bycJKSwKCQkJCQkJCQkJCQkJCSdhJwk9PiBhcnJheSgJJ211bHRpcGxpZXInCT0+IDFFLTE4LAknbmFtZScJPT4gJ2F0dG8nCSksCgkJCQkJCQkJCQkJCQkneicJPT4gYXJyYXkoCSdtdWx0aXBsaWVyJwk9PiAxRS0yMSwJJ25hbWUnCT0+ICd6ZXB0bycJKSwKCQkJCQkJCQkJCQkJCSd5Jwk9PiBhcnJheSgJJ211bHRpcGxpZXInCT0+IDFFLTI0LAknbmFtZScJPT4gJ3lvY3RvJwkpCgkJCQkJCQkJCQkJCSApOwoKCS8qKgoJICogRGV0YWlscyBvZiB0aGUgVW5pdHMgb2YgbWVhc3VyZSBjb252ZXJzaW9uIGZhY3RvcnMsIG9yZ2FuaXNlZCBieSBncm91cAoJICoKCSAqIEB2YXIgbWl4ZWRbXQoJICovCglwcml2YXRlIHN0YXRpYyAkX3VuaXRDb252ZXJzaW9ucyA9IGFycmF5KAknTWFzcycJCT0+IGFycmF5KAknZycJCT0+IGFycmF5KAknZycJCT0+IDEuMCwKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQknc2cnCT0+IDYuODUyMjA1MDAwNTM0NzhFLTA1LAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSdsYm0nCT0+IDIuMjA0NjIyOTE0NjkxMzRFLTAzLAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSd1JwkJPT4gNi4wMjIxNzAwMDAwMDAwMEUrMjMsCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJ296bScJPT4gMy41MjczOTcxODAwMzYyN0UtMDIKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSksCgkJCQkJCQkJCQkJCQkJCQkJCSdzZycJPT4gYXJyYXkoCSdnJwkJPT4gMS40NTkzODQyNDE4OTI4N0UrMDQsCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJ3NnJwk9PiAxLjAsCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJ2xibScJPT4gMy4yMTczOTE5NDEwMTY0N0UrMDEsCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJ3UnCQk9PiA4Ljc4ODY2MDAwMDAwMDAwRSsyNywKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQknb3ptJwk9PiA1LjE0NzgyNzg1OTQ0MjI5RSswMgoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJKSwKCQkJCQkJCQkJCQkJCQkJCQkJJ2xibScJPT4gYXJyYXkoCSdnJwkJPT4gNC41MzU5MjMwOTc0ODgxMTQ4RSswMiwKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQknc2cnCT0+IDMuMTA4MTA3NDkzMDY0OTNFLTAyLAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSdsYm0nCT0+IDEuMCwKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkndScJCT0+IDIuNzMxNjEwMDAwMDAwMDBFKzI2LAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSdvem0nCT0+IDEuNjAwMDAwMjM0Mjk0MTBFKzAxCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkpLAoJCQkJCQkJCQkJCQkJCQkJCQkndScJCT0+IGFycmF5KAknZycJCT0+IDEuNjYwNTMxMDA0NjA0NjVFLTI0LAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSdzZycJPT4gMS4xMzc4Mjk4ODUzMjk1MEUtMjgsCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJ2xibScJPT4gMy42NjA4NDQ3MDMzMDY4NEUtMjcsCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJ3UnCQk9PiAxLjAsCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJ296bScJPT4gNS44NTczNTIzODMwMDUyNEUtMjYKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSksCgkJCQkJCQkJCQkJCQkJCQkJCSdvem0nCT0+IGFycmF5KAknZycJCT0+IDIuODM0OTUxNTIwNzk3MzJFKzAxLAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSdzZycJPT4gMS45NDI1NjY4OTg3MDgxMUUtMDMsCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJ2xibScJPT4gNi4yNDk5OTkwODQ3ODg4MkUtMDIsCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJ3UnCQk9PiAxLjcwNzI1NjAwMDAwMDAwRSsyNSwKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQknb3ptJwk9PiAxLjAKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSkKCQkJCQkJCQkJCQkJCQkJCQkpLAoJCQkJCQkJCQkJCQknRGlzdGFuY2UnCT0+IGFycmF5KAknbScJCT0+IGFycmF5KAknbScJCT0+IDEuMCwKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQknbWknCT0+IDYuMjEzNzExOTIyMzczMzRFLTA0LAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSdObWknCT0+IDUuMzk5NTY4MDM0NTU3MjRFLTA0LAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSdpbicJPT4gMy45MzcwMDc4NzQwMTU3NUUrMDEsCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJ2Z0Jwk9PiAzLjI4MDgzOTg5NTAxMzEyRSswMCwKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkneWQnCT0+IDEuMDkzNjEzMjk3OTc4OTFFKzAwLAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSdhbmcnCT0+IDEuMDAwMDAwMDAwMDAwMDBFKzEwLAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSdQaWNhJwk9PiAyLjgzNDY0NTY2OTI5MTE2RSswMwoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJKSwKCQkJCQkJCQkJCQkJCQkJCQkJJ21pJwk9PiBhcnJheSgJJ20nCQk9PiAxLjYwOTM0NDAwMDAwMDAwRSswMywKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQknbWknCT0+IDEuMCwKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQknTm1pJwk9PiA4LjY4OTc2MjQxOTAwNjQ4RS0wMSwKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQknaW4nCT0+IDYuMzM2MDAwMDAwMDAwMDBFKzA0LAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSdmdCcJPT4gNS4yODAwMDAwMDAwMDAwMEUrMDMsCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJ3lkJwk9PiAxLjc2MDAwMDAwMDAwMDAwRSswMywKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQknYW5nJwk9PiAxLjYwOTM0NDAwMDAwMDAwRSsxMywKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQknUGljYScJPT4gNC41NjE5MTk5OTk5OTk3MUUrMDYKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSksCgkJCQkJCQkJCQkJCQkJCQkJCSdObWknCT0+IGFycmF5KAknbScJCT0+IDEuODUyMDAwMDAwMDAwMDBFKzAzLAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSdtaScJPT4gMS4xNTA3Nzk0NDgwMjM1NEUrMDAsCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJ05taScJPT4gMS4wLAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSdpbicJPT4gNy4yOTEzMzg1ODI2NzcxN0UrMDQsCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJ2Z0Jwk9PiA2LjA3NjExNTQ4NTU2NDMwRSswMywKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkneWQnCT0+IDIuMDI1MzcxODI3ODU2OTRFKzAzLAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSdhbmcnCT0+IDEuODUyMDAwMDAwMDAwMDBFKzEzLAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSdQaWNhJwk9PiA1LjI0OTc2Mzc3OTUyNzIzRSswNgoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJKSwKCQkJCQkJCQkJCQkJCQkJCQkJJ2luJwk9PiBhcnJheSgJJ20nCQk9PiAyLjU0MDAwMDAwMDAwMDAwRS0wMiwKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQknbWknCT0+IDEuNTc4MjgyODI4MjgyODNFLTA1LAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSdObWknCT0+IDEuMzcxNDkwMjgwNzc3NTRFLTA1LAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSdpbicJPT4gMS4wLAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSdmdCcJPT4gOC4zMzMzMzMzMzMzMzMzM0UtMDIsCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJ3lkJwk9PiAyLjc3Nzc3Nzc3Njg2NjQzRS0wMiwKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQknYW5nJwk9PiAyLjU0MDAwMDAwMDAwMDAwRSswOCwKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQknUGljYScJPT4gNy4xOTk5OTk5OTk5OTk1NUUrMDEKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSksCgkJCQkJCQkJCQkJCQkJCQkJCSdmdCcJPT4gYXJyYXkoCSdtJwkJPT4gMy4wNDgwMDAwMDAwMDAwMEUtMDEsCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJ21pJwk9PiAxLjg5MzkzOTM5MzkzOTM5RS0wNCwKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQknTm1pJwk9PiAxLjY0NTc4ODMzNjkzMzA1RS0wNCwKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQknaW4nCT0+IDEuMjAwMDAwMDAwMDAwMDBFKzAxLAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSdmdCcJPT4gMS4wLAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSd5ZCcJPT4gMy4zMzMzMzMzMzIyMzk3MkUtMDEsCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJ2FuZycJPT4gMy4wNDgwMDAwMDAwMDAwMEUrMDksCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJ1BpY2EnCT0+IDguNjM5OTk5OTk5OTk5NDZFKzAyCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkpLAoJCQkJCQkJCQkJCQkJCQkJCQkneWQnCT0+IGFycmF5KAknbScJCT0+IDkuMTQ0MDAwMDAzMDAwMDBFLTAxLAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSdtaScJPT4gNS42ODE4MTgxODM2ODIzMEUtMDQsCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJ05taScJPT4gNC45MzczNjUwMTI0MTkwMUUtMDQsCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJ2luJwk9PiAzLjYwMDAwMDAwMTE4MTEwRSswMSwKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQknZnQnCT0+IDMuMDAwMDAwMDAwMDAwMDBFKzAwLAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSd5ZCcJPT4gMS4wLAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSdhbmcnCT0+IDkuMTQ0MDAwMDAzMDAwMDBFKzA5LAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSdQaWNhJwk9PiAyLjU5MjAwMDAwMDg1MDIzRSswMwoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJKSwKCQkJCQkJCQkJCQkJCQkJCQkJJ2FuZycJPT4gYXJyYXkoCSdtJwkJPT4gMS4wMDAwMDAwMDAwMDAwMEUtMTAsCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJ21pJwk9PiA2LjIxMzcxMTkyMjM3MzM0RS0xNCwKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQknTm1pJwk9PiA1LjM5OTU2ODAzNDU1NzI0RS0xNCwKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQknaW4nCT0+IDMuOTM3MDA3ODc0MDE1NzVFLTA5LAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSdmdCcJPT4gMy4yODA4Mzk4OTUwMTMxMkUtMTAsCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJ3lkJwk9PiAxLjA5MzYxMzI5Nzk3ODkxRS0xMCwKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQknYW5nJwk9PiAxLjAsCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJ1BpY2EnCT0+IDIuODM0NjQ1NjY5MjkxMTZFLTA3CgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkpLAoJCQkJCQkJCQkJCQkJCQkJCQknUGljYScJPT4gYXJyYXkoCSdtJwkJPT4gMy41Mjc3Nzc3Nzc3NzgwMEUtMDQsCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJ21pJwk9PiAyLjE5MjA1OTQ4MzcyNjI5RS0wNywKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQknTm1pJwk9PiAxLjkwNDg0NzYxMjE5MTE0RS0wNywKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQknaW4nCT0+IDEuMzg4ODg4ODg4ODg4OThFLTAyLAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSdmdCcJPT4gMS4xNTc0MDc0MDc0MDc0OEUtMDMsCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJ3lkJwk9PiAzLjg1ODAyNDY5MDA5MjUxRS0wNCwKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQknYW5nJwk9PiAzLjUyNzc3Nzc3Nzc3ODAwRSswNiwKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQknUGljYScJPT4gMS4wCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkpCgkJCQkJCQkJCQkJCQkJCQkJKSwKCQkJCQkJCQkJCQkJJ1RpbWUnCQk9PiBhcnJheSgJJ3lyJwk9PiBhcnJheSgJJ3lyJwkJPT4gMS4wLAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSdkYXknCQk9PiAzNjUuMjUsCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJ2hyJwkJPT4gODc2Ni4wLAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSdtbicJCT0+IDUyNTk2MC4wLAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSdzZWMnCQk9PiAzMTU1NzYwMC4wCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkpLAoJCQkJCQkJCQkJCQkJCQkJCQknZGF5Jwk9PiBhcnJheSgJJ3lyJwkJPT4gMi43Mzc4NTA3ODcxMzIxMEUtMDMsCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJ2RheScJCT0+IDEuMCwKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQknaHInCQk9PiAyNC4wLAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSdtbicJCT0+IDE0NDAuMCwKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQknc2VjJwkJPT4gODY0MDAuMAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJKSwKCQkJCQkJCQkJCQkJCQkJCQkJJ2hyJwk9PiBhcnJheSgJJ3lyJwkJPT4gMS4xNDA3NzExNjEzMDUwNEUtMDQsCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJ2RheScJCT0+IDQuMTY2NjY2NjY2NjY2NjdFLTAyLAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSdocicJCT0+IDEuMCwKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQknbW4nCQk9PiA2MC4wLAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSdzZWMnCQk9PiAzNjAwLjAKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSksCgkJCQkJCQkJCQkJCQkJCQkJCSdtbicJPT4gYXJyYXkoCSd5cicJCT0+IDEuOTAxMjg1MjY4ODQxNzRFLTA2LAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSdkYXknCQk9PiA2Ljk0NDQ0NDQ0NDQ0NDQ0RS0wNCwKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQknaHInCQk9PiAxLjY2NjY2NjY2NjY2NjY3RS0wMiwKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQknbW4nCQk9PiAxLjAsCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJ3NlYycJCT0+IDYwLjAKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSksCgkJCQkJCQkJCQkJCQkJCQkJCSdzZWMnCT0+IGFycmF5KAkneXInCQk9PiAzLjE2ODgwODc4MTQwMjg5RS0wOCwKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQknZGF5JwkJPT4gMS4xNTc0MDc0MDc0MDc0MUUtMDUsCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJ2hyJwkJPT4gMi43Nzc3Nzc3Nzc3Nzc3OEUtMDQsCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJ21uJwkJPT4gMS42NjY2NjY2NjY2NjY2N0UtMDIsCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJ3NlYycJCT0+IDEuMAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJKQoJCQkJCQkJCQkJCQkJCQkJCSksCgkJCQkJCQkJCQkJCSdQcmVzc3VyZScJPT4gYXJyYXkoCSdQYScJPT4gYXJyYXkoCSdQYScJCT0+IDEuMCwKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkncCcJCQk9PiAxLjAsCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJ2F0bScJCT0+IDkuODY5MjMyOTk5OTgxOTNFLTA2LAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSdhdCcJCT0+IDkuODY5MjMyOTk5OTgxOTNFLTA2LAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSdtbUhnJwkJPT4gNy41MDA2MTcwNzk5ODYyN0UtMDMKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSksCgkJCQkJCQkJCQkJCQkJCQkJCSdwJwkJPT4gYXJyYXkoCSdQYScJCT0+IDEuMCwKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkncCcJCQk9PiAxLjAsCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJ2F0bScJCT0+IDkuODY5MjMyOTk5OTgxOTNFLTA2LAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSdhdCcJCT0+IDkuODY5MjMyOTk5OTgxOTNFLTA2LAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSdtbUhnJwkJPT4gNy41MDA2MTcwNzk5ODYyN0UtMDMKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSksCgkJCQkJCQkJCQkJCQkJCQkJCSdhdG0nCT0+IGFycmF5KAknUGEnCQk9PiAxLjAxMzI0OTk2NTgzMDAwRSswNSwKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkncCcJCQk9PiAxLjAxMzI0OTk2NTgzMDAwRSswNSwKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQknYXRtJwkJPT4gMS4wLAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSdhdCcJCT0+IDEuMCwKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQknbW1IZycJCT0+IDc2MC4wCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkpLAoJCQkJCQkJCQkJCQkJCQkJCQknYXQnCT0+IGFycmF5KAknUGEnCQk9PiAxLjAxMzI0OTk2NTgzMDAwRSswNSwKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkncCcJCQk9PiAxLjAxMzI0OTk2NTgzMDAwRSswNSwKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQknYXRtJwkJPT4gMS4wLAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSdhdCcJCT0+IDEuMCwKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQknbW1IZycJCT0+IDc2MC4wCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkpLAoJCQkJCQkJCQkJCQkJCQkJCQknbW1IZycJPT4gYXJyYXkoCSdQYScJCT0+IDEuMzMzMjIzNjM5MjUwMDBFKzAyLAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSdwJwkJCT0+IDEuMzMzMjIzNjM5MjUwMDBFKzAyLAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSdhdG0nCQk9PiAxLjMxNTc4OTQ3MzY4NDIxRS0wMywKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQknYXQnCQk9PiAxLjMxNTc4OTQ3MzY4NDIxRS0wMywKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQknbW1IZycJCT0+IDEuMAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJKQoJCQkJCQkJCQkJCQkJCQkJCSksCgkJCQkJCQkJCQkJCSdGb3JjZScJCT0+IGFycmF5KAknTicJCT0+IGFycmF5KAknTicJCQk9PiAxLjAsCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJ2R5bicJCT0+IDEuMEUrNSwKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQknZHknCQk9PiAxLjBFKzUsCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJ2xiZicJCT0+IDIuMjQ4MDg5MjM2NTUzMzlFLTAxCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkpLAoJCQkJCQkJCQkJCQkJCQkJCQknZHluJwk9PiBhcnJheSgJJ04nCQkJPT4gMS4wRS01LAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSdkeW4nCQk9PiAxLjAsCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJ2R5JwkJPT4gMS4wLAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSdsYmYnCQk9PiAyLjI0ODA4OTIzNjU1MzM5RS0wNgoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJKSwKCQkJCQkJCQkJCQkJCQkJCQkJJ2R5Jwk9PiBhcnJheSgJJ04nCQkJPT4gMS4wRS01LAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSdkeW4nCQk9PiAxLjAsCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJ2R5JwkJPT4gMS4wLAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSdsYmYnCQk9PiAyLjI0ODA4OTIzNjU1MzM5RS0wNgoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJKSwKCQkJCQkJCQkJCQkJCQkJCQkJJ2xiZicJPT4gYXJyYXkoCSdOJwkJCT0+IDQuNDQ4MjIyLAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSdkeW4nCQk9PiA0LjQ0ODIyMkUrNSwKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQknZHknCQk9PiA0LjQ0ODIyMkUrNSwKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQknbGJmJwkJPT4gMS4wCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkpCgkJCQkJCQkJCQkJCQkJCQkJKSwKCQkJCQkJCQkJCQkJJ0VuZXJneScJPT4gYXJyYXkoCSdKJwkJPT4gYXJyYXkoCSdKJwkJCT0+IDEuMCwKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQknZScJCQk9PiA5Ljk5OTk5NTE5MzQzMjMxRSswNiwKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQknYycJCQk9PiAyLjM5MDA2MjQ5NDczNDY3RS0wMSwKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQknY2FsJwkJPT4gMi4zODg0NjE5MDY0MjAxN0UtMDEsCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJ2VWJwkJPT4gNi4yNDE0NTcwMDAwMDAwMEUrMTgsCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJ2V2JwkJPT4gNi4yNDE0NTcwMDAwMDAwMEUrMTgsCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJ0hQaCcJCT0+IDMuNzI1MDY0MzA4MDEwMDBFLTA3LAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSdoaCcJCT0+IDMuNzI1MDY0MzA4MDEwMDBFLTA3LAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSdXaCcJCT0+IDIuNzc3Nzc5MTYyMzg3MTFFLTA0LAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSd3aCcJCT0+IDIuNzc3Nzc5MTYyMzg3MTFFLTA0LAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSdmbGInCQk9PiAyLjM3MzA0MjIyMTkyNjUxRSswMSwKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQknQlRVJwkJPT4gOS40NzgxNTA2NzM0OTAxNUUtMDQsCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJ2J0dScJCT0+IDkuNDc4MTUwNjczNDkwMTVFLTA0CgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkpLAoJCQkJCQkJCQkJCQkJCQkJCQknZScJCT0+IGFycmF5KAknSicJCQk9PiAxLjAwMDAwMDQ4MDY1NzAwRS0wNywKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQknZScJCQk9PiAxLjAsCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJ2MnCQkJPT4gMi4zOTAwNjM2NDM1MzQ5NEUtMDgsCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJ2NhbCcJCT0+IDIuMzg4NDYzMDU0NDUxMTFFLTA4LAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSdlVicJCT0+IDYuMjQxNDYwMDAwMDAwMDBFKzExLAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSdldicJCT0+IDYuMjQxNDYwMDAwMDAwMDBFKzExLAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSdIUGgnCQk9PiAzLjcyNTA2NjA5ODQ4ODI0RS0xNCwKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQknaGgnCQk9PiAzLjcyNTA2NjA5ODQ4ODI0RS0xNCwKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQknV2gnCQk9PiAyLjc3Nzc4MDQ5NzU0NjExRS0xMSwKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQknd2gnCQk9PiAyLjc3Nzc4MDQ5NzU0NjExRS0xMSwKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQknZmxiJwkJPT4gMi4zNzMwNDMzNjI1NDU4NkUtMDYsCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJ0JUVScJCT0+IDkuNDc4MTU1MjI5MjI5NjJFLTExLAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSdidHUnCQk9PiA5LjQ3ODE1NTIyOTIyOTYyRS0xMQoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJKSwKCQkJCQkJCQkJCQkJCQkJCQkJJ2MnCQk9PiBhcnJheSgJJ0onCQkJPT4gNC4xODM5OTEwMTM2MzY3MkUrMDAsCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJ2UnCQkJPT4gNC4xODM5ODkwMDI1NzMxMkUrMDcsCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJ2MnCQkJPT4gMS4wLAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSdjYWwnCQk9PiA5Ljk5MzMwMzE1Mjg3NTYzRS0wMSwKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQknZVYnCQk9PiAyLjYxMTQyMDAwMDAwMDAwRSsxOSwKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQknZXYnCQk9PiAyLjYxMTQyMDAwMDAwMDAwRSsxOSwKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQknSFBoJwkJPT4gMS41NTg1NjM1NTg5OTMyN0UtMDYsCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJ2hoJwkJPT4gMS41NTg1NjM1NTg5OTMyN0UtMDYsCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJ1doJwkJPT4gMS4xNjIyMjAzMDUzMjk1MEUtMDMsCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJ3doJwkJPT4gMS4xNjIyMjAzMDUzMjk1MEUtMDMsCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJ2ZsYicJCT0+IDkuOTI4Nzg3MzMxNTIxMDJFKzAxLAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSdCVFUnCQk9PiAzLjk2NTY0OTcyNDM3Nzc2RS0wMywKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQknYnR1JwkJPT4gMy45NjU2NDk3MjQzNzc3NkUtMDMKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSksCgkJCQkJCQkJCQkJCQkJCQkJCSdjYWwnCT0+IGFycmF5KAknSicJCQk9PiA0LjE4Njc5NDg0NjEzOTI5RSswMCwKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQknZScJCQk9PiA0LjE4Njc5MjgzMzcyODAxRSswNywKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQknYycJCQk9PiAxLjAwMDY3MDEzMzQ5MDU5RSswMCwKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQknY2FsJwkJPT4gMS4wLAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSdlVicJCT0+IDIuNjEzMTcwMDAwMDAwMDBFKzE5LAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSdldicJCT0+IDIuNjEzMTcwMDAwMDAwMDBFKzE5LAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSdIUGgnCQk9PiAxLjU1OTYwODAwNDYzMTM3RS0wNiwKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQknaGgnCQk9PiAxLjU1OTYwODAwNDYzMTM3RS0wNiwKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQknV2gnCQk9PiAxLjE2Mjk5OTE0ODA3OTU1RS0wMywKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQknd2gnCQk9PiAxLjE2Mjk5OTE0ODA3OTU1RS0wMywKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQknZmxiJwkJPT4gOS45MzU0NDA5NDQ0MzI4M0UrMDEsCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJ0JUVScJCT0+IDMuOTY4MzA3MjM5MDcwMDJFLTAzLAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSdidHUnCQk9PiAzLjk2ODMwNzIzOTA3MDAyRS0wMwoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJKSwKCQkJCQkJCQkJCQkJCQkJCQkJJ2VWJwk9PiBhcnJheSgJJ0onCQkJPT4gMS42MDIxOTAwMDE0NjkyMUUtMTksCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJ2UnCQkJPT4gMS42MDIxODkyMzEzNjU3NEUtMTIsCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJ2MnCQkJPT4gMy44MjkzMzQyMzE5NTA0M0UtMjAsCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJ2NhbCcJCT0+IDMuODI2NzY5Nzg1MzU2NDhFLTIwLAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSdlVicJCT0+IDEuMCwKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQknZXYnCQk9PiAxLjAsCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJ0hQaCcJCT0+IDUuOTY4MjYwNzg5MTIzNDRFLTI2LAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSdoaCcJCT0+IDUuOTY4MjYwNzg5MTIzNDRFLTI2LAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSdXaCcJCT0+IDQuNDUwNTMwMDAwMjY2MTRFLTIzLAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSd3aCcJCT0+IDQuNDUwNTMwMDAwMjY2MTRFLTIzLAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSdmbGInCQk9PiAzLjgwMjA2NDUyMTAzNDkyRS0xOCwKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQknQlRVJwkJPT4gMS41MTg1Nzk4MjQxNDg0NkUtMjIsCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJ2J0dScJCT0+IDEuNTE4NTc5ODI0MTQ4NDZFLTIyCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkpLAoJCQkJCQkJCQkJCQkJCQkJCQknZXYnCT0+IGFycmF5KAknSicJCQk9PiAxLjYwMjE5MDAwMTQ2OTIxRS0xOSwKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQknZScJCQk9PiAxLjYwMjE4OTIzMTM2NTc0RS0xMiwKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQknYycJCQk9PiAzLjgyOTMzNDIzMTk1MDQzRS0yMCwKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQknY2FsJwkJPT4gMy44MjY3Njk3ODUzNTY0OEUtMjAsCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJ2VWJwkJPT4gMS4wLAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSdldicJCT0+IDEuMCwKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQknSFBoJwkJPT4gNS45NjgyNjA3ODkxMjM0NEUtMjYsCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJ2hoJwkJPT4gNS45NjgyNjA3ODkxMjM0NEUtMjYsCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJ1doJwkJPT4gNC40NTA1MzAwMDAyNjYxNEUtMjMsCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJ3doJwkJPT4gNC40NTA1MzAwMDAyNjYxNEUtMjMsCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJ2ZsYicJCT0+IDMuODAyMDY0NTIxMDM0OTJFLTE4LAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSdCVFUnCQk9PiAxLjUxODU3OTgyNDE0ODQ2RS0yMiwKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQknYnR1JwkJPT4gMS41MTg1Nzk4MjQxNDg0NkUtMjIKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSksCgkJCQkJCQkJCQkJCQkJCQkJCSdIUGgnCT0+IGFycmF5KAknSicJCQk9PiAyLjY4NDUxNzQxMzE2MTcwRSswNiwKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQknZScJCQk9PiAyLjY4NDUxNjEyMjgzMDI0RSsxMywKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQknYycJCQk9PiA2LjQxNjE2NDM4NTY1OTkxRSswNSwKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQknY2FsJwkJPT4gNi40MTE4Njc1Nzg0NTgzNUUrMDUsCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJ2VWJwkJPT4gMS42NzU1MzAwMDAwMDAwMEUrMjUsCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJ2V2JwkJPT4gMS42NzU1MzAwMDAwMDAwMEUrMjUsCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJ0hQaCcJCT0+IDEuMCwKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQknaGgnCQk9PiAxLjAsCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJ1doJwkJPT4gNy40NTY5OTY1MzEzNDU5M0UrMDIsCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJ3doJwkJPT4gNy40NTY5OTY1MzEzNDU5M0UrMDIsCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJ2ZsYicJCT0+IDYuMzcwNDczMTY2OTI5NjRFKzA3LAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSdCVFUnCQk9PiAyLjU0NDQyNjA1Mjc1NTQ2RSswMywKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQknYnR1JwkJPT4gMi41NDQ0MjYwNTI3NTU0NkUrMDMKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSksCgkJCQkJCQkJCQkJCQkJCQkJCSdoaCcJPT4gYXJyYXkoCSdKJwkJCT0+IDIuNjg0NTE3NDEzMTYxNzBFKzA2LAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSdlJwkJCT0+IDIuNjg0NTE2MTIyODMwMjRFKzEzLAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSdjJwkJCT0+IDYuNDE2MTY0Mzg1NjU5OTFFKzA1LAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSdjYWwnCQk9PiA2LjQxMTg2NzU3ODQ1ODM1RSswNSwKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQknZVYnCQk9PiAxLjY3NTUzMDAwMDAwMDAwRSsyNSwKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQknZXYnCQk9PiAxLjY3NTUzMDAwMDAwMDAwRSsyNSwKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQknSFBoJwkJPT4gMS4wLAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSdoaCcJCT0+IDEuMCwKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQknV2gnCQk9PiA3LjQ1Njk5NjUzMTM0NTkzRSswMiwKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQknd2gnCQk9PiA3LjQ1Njk5NjUzMTM0NTkzRSswMiwKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQknZmxiJwkJPT4gNi4zNzA0NzMxNjY5Mjk2NEUrMDcsCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJ0JUVScJCT0+IDIuNTQ0NDI2MDUyNzU1NDZFKzAzLAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSdidHUnCQk9PiAyLjU0NDQyNjA1Mjc1NTQ2RSswMwoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJKSwKCQkJCQkJCQkJCQkJCQkJCQkJJ1doJwk9PiBhcnJheSgJJ0onCQkJPT4gMy41OTk5OTgyMDU1NDcyMEUrMDMsCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJ2UnCQkJPT4gMy41OTk5OTY0NzUxODM2OUUrMTAsCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJ2MnCQkJPT4gOC42MDQyMjA2OTIxOTA0NkUrMDIsCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJ2NhbCcJCT0+IDguNTk4NDU4NTc3MTMwNDZFKzAyLAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSdlVicJCT0+IDIuMjQ2OTIzNDAwMDAwMDBFKzIyLAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSdldicJCT0+IDIuMjQ2OTIzNDAwMDAwMDBFKzIyLAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSdIUGgnCQk9PiAxLjM0MTAyMjQ4MjQzODM5RS0wMywKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQknaGgnCQk9PiAxLjM0MTAyMjQ4MjQzODM5RS0wMywKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQknV2gnCQk9PiAxLjAsCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJ3doJwkJPT4gMS4wLAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSdmbGInCQk9PiA4LjU0Mjk0Nzc0MDYyMzE2RSswNCwKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQknQlRVJwkJPT4gMy40MTIxMzI1NDE2NDcwNUUrMDAsCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJ2J0dScJCT0+IDMuNDEyMTMyNTQxNjQ3MDVFKzAwCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkpLAoJCQkJCQkJCQkJCQkJCQkJCQknd2gnCT0+IGFycmF5KAknSicJCQk9PiAzLjU5OTk5ODIwNTU0NzIwRSswMywKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQknZScJCQk9PiAzLjU5OTk5NjQ3NTE4MzY5RSsxMCwKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQknYycJCQk9PiA4LjYwNDIyMDY5MjE5MDQ2RSswMiwKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQknY2FsJwkJPT4gOC41OTg0NTg1NzcxMzA0NkUrMDIsCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJ2VWJwkJPT4gMi4yNDY5MjM0MDAwMDAwMEUrMjIsCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJ2V2JwkJPT4gMi4yNDY5MjM0MDAwMDAwMEUrMjIsCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJ0hQaCcJCT0+IDEuMzQxMDIyNDgyNDM4MzlFLTAzLAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSdoaCcJCT0+IDEuMzQxMDIyNDgyNDM4MzlFLTAzLAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSdXaCcJCT0+IDEuMCwKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQknd2gnCQk9PiAxLjAsCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJ2ZsYicJCT0+IDguNTQyOTQ3NzQwNjIzMTZFKzA0LAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSdCVFUnCQk9PiAzLjQxMjEzMjU0MTY0NzA1RSswMCwKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQknYnR1JwkJPT4gMy40MTIxMzI1NDE2NDcwNUUrMDAKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSksCgkJCQkJCQkJCQkJCQkJCQkJCSdmbGInCT0+IGFycmF5KAknSicJCQk9PiA0LjIxNDAwMDAzMjM2NDI0RS0wMiwKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQknZScJCQk9PiA0LjIxMzk5ODAwNjg3NjYwRSswNSwKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQknYycJCQk9PiAxLjAwNzE3MjM0MzAxNjQ0RS0wMiwKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQknY2FsJwkJPT4gMS4wMDY0OTc4NTUwOTU1NEUtMDIsCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJ2VWJwkJPT4gMi42MzAxNTAwMDAwMDAwMEUrMTcsCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJ2V2JwkJPT4gMi42MzAxNTAwMDAwMDAwMEUrMTcsCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJ0hQaCcJCT0+IDEuNTY5NzQyMTExNDUxMzBFLTA4LAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSdoaCcJCT0+IDEuNTY5NzQyMTExNDUxMzBFLTA4LAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSdXaCcJCT0+IDEuMTcwNTU2MTQ4MDIwMDBFLTA1LAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSd3aCcJCT0+IDEuMTcwNTU2MTQ4MDIwMDBFLTA1LAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSdmbGInCQk9PiAxLjAsCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJ0JUVScJCT0+IDMuOTk0MDkyNzI0NDg0MDZFLTA1LAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSdidHUnCQk9PiAzLjk5NDA5MjcyNDQ4NDA2RS0wNQoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJKSwKCQkJCQkJCQkJCQkJCQkJCQkJJ0JUVScJPT4gYXJyYXkoCSdKJwkJCT0+IDEuMDU1MDU4MTM3ODY3NDlFKzAzLAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSdlJwkJCT0+IDEuMDU1MDU3NjMwNzQ2NjVFKzEwLAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSdjJwkJCT0+IDIuNTIxNjU0ODg1MDgxNjhFKzAyLAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSdjYWwnCQk9PiAyLjUxOTk2NjE3MTM1NTEwRSswMiwKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQknZVYnCQk9PiA2LjU4NTEwMDAwMDAwMDAwRSsyMSwKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQknZXYnCQk9PiA2LjU4NTEwMDAwMDAwMDAwRSsyMSwKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQknSFBoJwkJPT4gMy45MzAxNTk0MTIyNDU2OEUtMDQsCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJ2hoJwkJPT4gMy45MzAxNTk0MTIyNDU2OEUtMDQsCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJ1doJwkJPT4gMi45MzA3MTg1MTA0NzUyNkUtMDEsCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJ3doJwkJPT4gMi45MzA3MTg1MTA0NzUyNkUtMDEsCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJ2ZsYicJCT0+IDIuNTAzNjk3NTA3NzQ2NzFFKzA0LAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSdCVFUnCQk9PiAxLjAsCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJ2J0dScJCT0+IDEuMCwKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSksCgkJCQkJCQkJCQkJCQkJCQkJCSdidHUnCT0+IGFycmF5KAknSicJCQk9PiAxLjA1NTA1ODEzNzg2NzQ5RSswMywKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQknZScJCQk9PiAxLjA1NTA1NzYzMDc0NjY1RSsxMCwKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQknYycJCQk9PiAyLjUyMTY1NDg4NTA4MTY4RSswMiwKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQknY2FsJwkJPT4gMi41MTk5NjYxNzEzNTUxMEUrMDIsCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJ2VWJwkJPT4gNi41ODUxMDAwMDAwMDAwMEUrMjEsCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJ2V2JwkJPT4gNi41ODUxMDAwMDAwMDAwMEUrMjEsCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJ0hQaCcJCT0+IDMuOTMwMTU5NDEyMjQ1NjhFLTA0LAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSdoaCcJCT0+IDMuOTMwMTU5NDEyMjQ1NjhFLTA0LAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSdXaCcJCT0+IDIuOTMwNzE4NTEwNDc1MjZFLTAxLAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSd3aCcJCT0+IDIuOTMwNzE4NTEwNDc1MjZFLTAxLAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSdmbGInCQk9PiAyLjUwMzY5NzUwNzc0NjcxRSswNCwKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQknQlRVJwkJPT4gMS4wLAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSdidHUnCQk9PiAxLjAsCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkpCgkJCQkJCQkJCQkJCQkJCQkJKSwKCQkJCQkJCQkJCQkJJ1Bvd2VyJwkJPT4gYXJyYXkoCSdIUCcJPT4gYXJyYXkoCSdIUCcJCT0+IDEuMCwKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQknaCcJCQk9PiAxLjAsCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJ1cnCQkJPT4gNy40NTcwMTAwMDAwMDAwMEUrMDIsCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJ3cnCQkJPT4gNy40NTcwMTAwMDAwMDAwMEUrMDIKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSksCgkJCQkJCQkJCQkJCQkJCQkJCSdoJwkJPT4gYXJyYXkoCSdIUCcJCT0+IDEuMCwKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQknaCcJCQk9PiAxLjAsCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJ1cnCQkJPT4gNy40NTcwMTAwMDAwMDAwMEUrMDIsCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJ3cnCQkJPT4gNy40NTcwMTAwMDAwMDAwMEUrMDIKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSksCgkJCQkJCQkJCQkJCQkJCQkJCSdXJwkJPT4gYXJyYXkoCSdIUCcJCT0+IDEuMzQxMDIwMDYwMzE5MDhFLTAzLAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSdoJwkJCT0+IDEuMzQxMDIwMDYwMzE5MDhFLTAzLAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSdXJwkJCT0+IDEuMCwKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkndycJCQk9PiAxLjAKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSksCgkJCQkJCQkJCQkJCQkJCQkJCSd3JwkJPT4gYXJyYXkoCSdIUCcJCT0+IDEuMzQxMDIwMDYwMzE5MDhFLTAzLAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSdoJwkJCT0+IDEuMzQxMDIwMDYwMzE5MDhFLTAzLAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSdXJwkJCT0+IDEuMCwKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkndycJCQk9PiAxLjAKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSkKCQkJCQkJCQkJCQkJCQkJCQkpLAoJCQkJCQkJCQkJCQknTWFnbmV0aXNtJwk9PiBhcnJheSgJJ1QnCQk9PiBhcnJheSgJJ1QnCQkJPT4gMS4wLAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSdnYScJCT0+IDEwMDAwLjAKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSksCgkJCQkJCQkJCQkJCQkJCQkJCSdnYScJPT4gYXJyYXkoCSdUJwkJCT0+IDAuMDAwMSwKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQknZ2EnCQk9PiAxLjAKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSkKCQkJCQkJCQkJCQkJCQkJCQkpLAoJCQkJCQkJCQkJCQknTGlxdWlkJwk9PiBhcnJheSgJJ3RzcCcJPT4gYXJyYXkoCSd0c3AnCQk9PiAxLjAsCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJ3RicycJCT0+IDMuMzMzMzMzMzMzMzMzMzNFLTAxLAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSdveicJCT0+IDEuNjY2NjY2NjY2NjY2NjdFLTAxLAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSdjdXAnCQk9PiAyLjA4MzMzMzMzMzMzMzMzRS0wMiwKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkncHQnCQk9PiAxLjA0MTY2NjY2NjY2NjY3RS0wMiwKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkndXNfcHQnCQk9PiAxLjA0MTY2NjY2NjY2NjY3RS0wMiwKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkndWtfcHQnCQk9PiA4LjY3NTU4NTE2ODIxOTYwRS0wMywKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkncXQnCQk9PiA1LjIwODMzMzMzMzMzMzMzRS0wMywKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQknZ2FsJwkJPT4gMS4zMDIwODMzMzMzMzMzM0UtMDMsCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJ2wnCQkJPT4gNC45Mjk5OTQwODQwMDcxMEUtMDMsCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJ2x0JwkJPT4gNC45Mjk5OTQwODQwMDcxMEUtMDMKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSksCgkJCQkJCQkJCQkJCQkJCQkJCSd0YnMnCT0+IGFycmF5KAkndHNwJwkJPT4gMy4wMDAwMDAwMDAwMDAwMEUrMDAsCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJ3RicycJCT0+IDEuMCwKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQknb3onCQk9PiA1LjAwMDAwMDAwMDAwMDAwRS0wMSwKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQknY3VwJwkJPT4gNi4yNTAwMDAwMDAwMDAwMEUtMDIsCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJ3B0JwkJPT4gMy4xMjUwMDAwMDAwMDAwMEUtMDIsCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJ3VzX3B0JwkJPT4gMy4xMjUwMDAwMDAwMDAwMEUtMDIsCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJ3VrX3B0JwkJPT4gMi42MDI2NzU1NTA0NjU4OEUtMDIsCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJ3F0JwkJPT4gMS41NjI1MDAwMDAwMDAwMEUtMDIsCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJ2dhbCcJCT0+IDMuOTA2MjUwMDAwMDAwMDBFLTAzLAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSdsJwkJCT0+IDEuNDc4OTk4MjI1MjAyMTNFLTAyLAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSdsdCcJCT0+IDEuNDc4OTk4MjI1MjAyMTNFLTAyCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkpLAoJCQkJCQkJCQkJCQkJCQkJCQknb3onCT0+IGFycmF5KAkndHNwJwkJPT4gNi4wMDAwMDAwMDAwMDAwMEUrMDAsCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJ3RicycJCT0+IDIuMDAwMDAwMDAwMDAwMDBFKzAwLAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSdveicJCT0+IDEuMCwKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQknY3VwJwkJPT4gMS4yNTAwMDAwMDAwMDAwMEUtMDEsCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJ3B0JwkJPT4gNi4yNTAwMDAwMDAwMDAwMEUtMDIsCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJ3VzX3B0JwkJPT4gNi4yNTAwMDAwMDAwMDAwMEUtMDIsCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJ3VrX3B0JwkJPT4gNS4yMDUzNTExMDA5MzE3NkUtMDIsCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJ3F0JwkJPT4gMy4xMjUwMDAwMDAwMDAwMEUtMDIsCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJ2dhbCcJCT0+IDcuODEyNTAwMDAwMDAwMDBFLTAzLAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSdsJwkJCT0+IDIuOTU3OTk2NDUwNDA0MjZFLTAyLAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSdsdCcJCT0+IDIuOTU3OTk2NDUwNDA0MjZFLTAyCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkpLAoJCQkJCQkJCQkJCQkJCQkJCQknY3VwJwk9PiBhcnJheSgJJ3RzcCcJCT0+IDQuODAwMDAwMDAwMDAwMDBFKzAxLAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSd0YnMnCQk9PiAxLjYwMDAwMDAwMDAwMDAwRSswMSwKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQknb3onCQk9PiA4LjAwMDAwMDAwMDAwMDAwRSswMCwKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQknY3VwJwkJPT4gMS4wLAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSdwdCcJCT0+IDUuMDAwMDAwMDAwMDAwMDBFLTAxLAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSd1c19wdCcJCT0+IDUuMDAwMDAwMDAwMDAwMDBFLTAxLAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSd1a19wdCcJCT0+IDQuMTY0MjgwODgwNzQ1NDFFLTAxLAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSdxdCcJCT0+IDIuNTAwMDAwMDAwMDAwMDBFLTAxLAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSdnYWwnCQk9PiA2LjI1MDAwMDAwMDAwMDAwRS0wMiwKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQknbCcJCQk9PiAyLjM2NjM5NzE2MDMyMzQxRS0wMSwKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQknbHQnCQk9PiAyLjM2NjM5NzE2MDMyMzQxRS0wMQoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJKSwKCQkJCQkJCQkJCQkJCQkJCQkJJ3B0Jwk9PiBhcnJheSgJJ3RzcCcJCT0+IDkuNjAwMDAwMDAwMDAwMDBFKzAxLAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSd0YnMnCQk9PiAzLjIwMDAwMDAwMDAwMDAwRSswMSwKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQknb3onCQk9PiAxLjYwMDAwMDAwMDAwMDAwRSswMSwKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQknY3VwJwkJPT4gMi4wMDAwMDAwMDAwMDAwMEUrMDAsCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJ3B0JwkJPT4gMS4wLAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSd1c19wdCcJCT0+IDEuMCwKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkndWtfcHQnCQk9PiA4LjMyODU2MTc2MTQ5MDgxRS0wMSwKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkncXQnCQk9PiA1LjAwMDAwMDAwMDAwMDAwRS0wMSwKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQknZ2FsJwkJPT4gMS4yNTAwMDAwMDAwMDAwMEUtMDEsCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJ2wnCQkJPT4gNC43MzI3OTQzMjA2NDY4MkUtMDEsCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJ2x0JwkJPT4gNC43MzI3OTQzMjA2NDY4MkUtMDEKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSksCgkJCQkJCQkJCQkJCQkJCQkJCSd1c19wdCcJPT4gYXJyYXkoCSd0c3AnCQk9PiA5LjYwMDAwMDAwMDAwMDAwRSswMSwKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkndGJzJwkJPT4gMy4yMDAwMDAwMDAwMDAwMEUrMDEsCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJ296JwkJPT4gMS42MDAwMDAwMDAwMDAwMEUrMDEsCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJ2N1cCcJCT0+IDIuMDAwMDAwMDAwMDAwMDBFKzAwLAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSdwdCcJCT0+IDEuMCwKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkndXNfcHQnCQk9PiAxLjAsCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJ3VrX3B0JwkJPT4gOC4zMjg1NjE3NjE0OTA4MUUtMDEsCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJ3F0JwkJPT4gNS4wMDAwMDAwMDAwMDAwMEUtMDEsCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJ2dhbCcJCT0+IDEuMjUwMDAwMDAwMDAwMDBFLTAxLAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSdsJwkJCT0+IDQuNzMyNzk0MzIwNjQ2ODJFLTAxLAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSdsdCcJCT0+IDQuNzMyNzk0MzIwNjQ2ODJFLTAxCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkpLAoJCQkJCQkJCQkJCQkJCQkJCQkndWtfcHQnCT0+IGFycmF5KAkndHNwJwkJPT4gMS4xNTI2NjAwMDAwMDAwMEUrMDIsCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJ3RicycJCT0+IDMuODQyMjAwMDAwMDAwMDBFKzAxLAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSdveicJCT0+IDEuOTIxMTAwMDAwMDAwMDBFKzAxLAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSdjdXAnCQk9PiAyLjQwMTM3NTAwMDAwMDAwRSswMCwKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkncHQnCQk9PiAxLjIwMDY4NzUwMDAwMDAwRSswMCwKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkndXNfcHQnCQk9PiAxLjIwMDY4NzUwMDAwMDAwRSswMCwKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkndWtfcHQnCQk9PiAxLjAsCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJ3F0JwkJPT4gNi4wMDM0Mzc1MDAwMDAwMEUtMDEsCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJ2dhbCcJCT0+IDEuNTAwODU5Mzc1MDAwMDBFLTAxLAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSdsJwkJCT0+IDUuNjgyNjA2OTgwODcxNjJFLTAxLAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSdsdCcJCT0+IDUuNjgyNjA2OTgwODcxNjJFLTAxCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkpLAoJCQkJCQkJCQkJCQkJCQkJCQkncXQnCT0+IGFycmF5KAkndHNwJwkJPT4gMS45MjAwMDAwMDAwMDAwMEUrMDIsCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJ3RicycJCT0+IDYuNDAwMDAwMDAwMDAwMDBFKzAxLAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSdveicJCT0+IDMuMjAwMDAwMDAwMDAwMDBFKzAxLAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSdjdXAnCQk9PiA0LjAwMDAwMDAwMDAwMDAwRSswMCwKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkncHQnCQk9PiAyLjAwMDAwMDAwMDAwMDAwRSswMCwKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkndXNfcHQnCQk9PiAyLjAwMDAwMDAwMDAwMDAwRSswMCwKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkndWtfcHQnCQk9PiAxLjY2NTcxMjM1MjI5ODE2RSswMCwKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkncXQnCQk9PiAxLjAsCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJ2dhbCcJCT0+IDIuNTAwMDAwMDAwMDAwMDBFLTAxLAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSdsJwkJCT0+IDkuNDY1NTg4NjQxMjkzNjNFLTAxLAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSdsdCcJCT0+IDkuNDY1NTg4NjQxMjkzNjNFLTAxCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkpLAoJCQkJCQkJCQkJCQkJCQkJCQknZ2FsJwk9PiBhcnJheSgJJ3RzcCcJCT0+IDcuNjgwMDAwMDAwMDAwMDBFKzAyLAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSd0YnMnCQk9PiAyLjU2MDAwMDAwMDAwMDAwRSswMiwKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQknb3onCQk9PiAxLjI4MDAwMDAwMDAwMDAwRSswMiwKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQknY3VwJwkJPT4gMS42MDAwMDAwMDAwMDAwMEUrMDEsCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJ3B0JwkJPT4gOC4wMDAwMDAwMDAwMDAwMEUrMDAsCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJ3VzX3B0JwkJPT4gOC4wMDAwMDAwMDAwMDAwMEUrMDAsCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJ3VrX3B0JwkJPT4gNi42NjI4NDk0MDkxOTI2NUUrMDAsCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJ3F0JwkJPT4gNC4wMDAwMDAwMDAwMDAwMEUrMDAsCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJ2dhbCcJCT0+IDEuMCwKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQknbCcJCQk9PiAzLjc4NjIzNTQ1NjUxNzQ1RSswMCwKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQknbHQnCQk9PiAzLjc4NjIzNTQ1NjUxNzQ1RSswMAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJKSwKCQkJCQkJCQkJCQkJCQkJCQkJJ2wnCQk9PiBhcnJheSgJJ3RzcCcJCT0+IDIuMDI4NDAwMDAwMDAwMDBFKzAyLAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSd0YnMnCQk9PiA2Ljc2MTMzMzMzMzMzMzMzRSswMSwKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQknb3onCQk9PiAzLjM4MDY2NjY2NjY2NjY3RSswMSwKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQknY3VwJwkJPT4gNC4yMjU4MzMzMzMzMzMzM0UrMDAsCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJ3B0JwkJPT4gMi4xMTI5MTY2NjY2NjY2N0UrMDAsCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJ3VzX3B0JwkJPT4gMi4xMTI5MTY2NjY2NjY2N0UrMDAsCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJ3VrX3B0JwkJPT4gMS43NTk3NTU2OTU1MjE2NkUrMDAsCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJ3F0JwkJPT4gMS4wNTY0NTgzMzMzMzMzM0UrMDAsCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJ2dhbCcJCT0+IDIuNjQxMTQ1ODMzMzMzMzNFLTAxLAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSdsJwkJCT0+IDEuMCwKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQknbHQnCQk9PiAxLjAKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSksCgkJCQkJCQkJCQkJCQkJCQkJCSdsdCcJPT4gYXJyYXkoCSd0c3AnCQk9PiAyLjAyODQwMDAwMDAwMDAwRSswMiwKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkndGJzJwkJPT4gNi43NjEzMzMzMzMzMzMzM0UrMDEsCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJ296JwkJPT4gMy4zODA2NjY2NjY2NjY2N0UrMDEsCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJ2N1cCcJCT0+IDQuMjI1ODMzMzMzMzMzMzNFKzAwLAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSdwdCcJCT0+IDIuMTEyOTE2NjY2NjY2NjdFKzAwLAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSd1c19wdCcJCT0+IDIuMTEyOTE2NjY2NjY2NjdFKzAwLAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSd1a19wdCcJCT0+IDEuNzU5NzU1Njk1NTIxNjZFKzAwLAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSdxdCcJCT0+IDEuMDU2NDU4MzMzMzMzMzNFKzAwLAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSdnYWwnCQk9PiAyLjY0MTE0NTgzMzMzMzMzRS0wMSwKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQknbCcJCQk9PiAxLjAsCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJ2x0JwkJPT4gMS4wCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkpCgkJCQkJCQkJCQkJCQkJCQkJKQoJCQkJCQkJCQkJCSk7CgoKCS8qKgoJICogX3BhcnNlQ29tcGxleAoJICoKCSAqIFBhcnNlcyBhIGNvbXBsZXggbnVtYmVyIGludG8gaXRzIHJlYWwgYW5kIGltYWdpbmFyeSBwYXJ0cywgYW5kIGFuIEkgb3IgSiBzdWZmaXgKCSAqCgkgKiBAcGFyYW0Jc3RyaW5nCQkkY29tcGxleE51bWJlcglUaGUgY29tcGxleCBudW1iZXIKCSAqIEByZXR1cm4Jc3RyaW5nW10JSW5kZXhlZCBvbiAicmVhbCIsICJpbWFnaW5hcnkiIGFuZCAic3VmZml4IgoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIF9wYXJzZUNvbXBsZXgoJGNvbXBsZXhOdW1iZXIpIHsKCQkkd29ya1N0cmluZyA9IChzdHJpbmcpICRjb21wbGV4TnVtYmVyOwoKCQkkcmVhbE51bWJlciA9ICRpbWFnaW5hcnkgPSAwOwoJCS8vCUV4dHJhY3QgdGhlIHN1ZmZpeCwgaWYgdGhlcmUgaXMgb25lCgkJJHN1ZmZpeCA9IHN1YnN0cigkd29ya1N0cmluZywtMSk7CgkJaWYgKCFpc19udW1lcmljKCRzdWZmaXgpKSB7CgkJCSR3b3JrU3RyaW5nID0gc3Vic3RyKCR3b3JrU3RyaW5nLDAsLTEpOwoJCX0gZWxzZSB7CgkJCSRzdWZmaXggPSAnJzsKCQl9CgoJCS8vCVNwbGl0IHRoZSBpbnB1dCBpbnRvIGl0cyBSZWFsIGFuZCBJbWFnaW5hcnkgY29tcG9uZW50cwoJCSRsZWFkaW5nU2lnbiA9IDA7CgkJaWYgKHN0cmxlbigkd29ya1N0cmluZykgPiAwKSB7CgkJCSRsZWFkaW5nU2lnbiA9ICgoJHdvcmtTdHJpbmd7MH0gPT0gJysnKSB8fCAoJHdvcmtTdHJpbmd7MH0gPT0gJy0nKSkgPyAxIDogMDsKCQl9CgkJJHBvd2VyID0gJyc7CgkJJHJlYWxOdW1iZXIgPSBzdHJ0b2soJHdvcmtTdHJpbmcsICcrLScpOwoJCWlmIChzdHJ0b3VwcGVyKHN1YnN0cigkcmVhbE51bWJlciwtMSkpID09ICdFJykgewoJCQkkcG93ZXIgPSBzdHJ0b2soJystJyk7CgkJCSsrJGxlYWRpbmdTaWduOwoJCX0KCgkJJHJlYWxOdW1iZXIgPSBzdWJzdHIoJHdvcmtTdHJpbmcsMCxzdHJsZW4oJHJlYWxOdW1iZXIpK3N0cmxlbigkcG93ZXIpKyRsZWFkaW5nU2lnbik7CgoJCWlmICgkc3VmZml4ICE9ICcnKSB7CgkJCSRpbWFnaW5hcnkgPSBzdWJzdHIoJHdvcmtTdHJpbmcsc3RybGVuKCRyZWFsTnVtYmVyKSk7CgoJCQlpZiAoKCRpbWFnaW5hcnkgPT0gJycpICYmICgoJHJlYWxOdW1iZXIgPT0gJycpIHx8ICgkcmVhbE51bWJlciA9PSAnKycpIHx8ICgkcmVhbE51bWJlciA9PSAnLScpKSkgewoJCQkJJGltYWdpbmFyeSA9ICRyZWFsTnVtYmVyLicxJzsKCQkJCSRyZWFsTnVtYmVyID0gJzAnOwoJCQl9IGVsc2UgaWYgKCRpbWFnaW5hcnkgPT0gJycpIHsKCQkJCSRpbWFnaW5hcnkgPSAkcmVhbE51bWJlcjsKCQkJCSRyZWFsTnVtYmVyID0gJzAnOwoJCQl9IGVsc2VpZiAoKCRpbWFnaW5hcnkgPT0gJysnKSB8fCAoJGltYWdpbmFyeSA9PSAnLScpKSB7CgkJCQkkaW1hZ2luYXJ5IC49ICcxJzsKCQkJfQoJCX0KCgkJcmV0dXJuIGFycmF5KCAncmVhbCcJCT0+ICRyZWFsTnVtYmVyLAoJCQkJCSAgJ2ltYWdpbmFyeScJPT4gJGltYWdpbmFyeSwKCQkJCQkgICdzdWZmaXgnCQk9PiAkc3VmZml4CgkJCQkJKTsKCX0JLy8JZnVuY3Rpb24gX3BhcnNlQ29tcGxleCgpCgoKCS8qKgoJICogX2NsZWFuQ29tcGxleAoJICoKCSAqIENsZWFucyB0aGUgbGVhZGluZyBjaGFyYWN0ZXJzIGluIGEgY29tcGxleCBudW1iZXIgc3RyaW5nCgkgKgoJICogQHBhcmFtCXN0cmluZwkJJGNvbXBsZXhOdW1iZXIJVGhlIGNvbXBsZXggbnVtYmVyIHRvIGNsZWFuCgkgKiBAcmV0dXJuCXN0cmluZwkJVGhlICJjbGVhbmVkIiBjb21wbGV4IG51bWJlcgoJICovCglwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBfY2xlYW5Db21wbGV4KCRjb21wbGV4TnVtYmVyKSB7CgkJaWYgKCRjb21wbGV4TnVtYmVyezB9ID09ICcrJykgJGNvbXBsZXhOdW1iZXIgPSBzdWJzdHIoJGNvbXBsZXhOdW1iZXIsMSk7CgkJaWYgKCRjb21wbGV4TnVtYmVyezB9ID09ICcwJykgJGNvbXBsZXhOdW1iZXIgPSBzdWJzdHIoJGNvbXBsZXhOdW1iZXIsMSk7CgkJaWYgKCRjb21wbGV4TnVtYmVyezB9ID09ICcuJykgJGNvbXBsZXhOdW1iZXIgPSAnMCcuJGNvbXBsZXhOdW1iZXI7CgkJaWYgKCRjb21wbGV4TnVtYmVyezB9ID09ICcrJykgJGNvbXBsZXhOdW1iZXIgPSBzdWJzdHIoJGNvbXBsZXhOdW1iZXIsMSk7CgkJcmV0dXJuICRjb21wbGV4TnVtYmVyOwoJfQoKCglwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBfbmJyQ29udmVyc2lvbkZvcm1hdCgkeFZhbCwkcGxhY2VzKSB7CgkJaWYgKCFpc19udWxsKCRwbGFjZXMpKSB7CgkJCWlmIChzdHJsZW4oJHhWYWwpIDw9ICRwbGFjZXMpIHsKCQkJCXJldHVybiBzdWJzdHIoc3RyX3BhZCgkeFZhbCwkcGxhY2VzLCcwJyxTVFJfUEFEX0xFRlQpLC0xMCk7CgkJCX0gZWxzZSB7CgkJCQlyZXR1cm4gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpOYU4oKTsKCQkJfQoJCX0KCgkJcmV0dXJuIHN1YnN0cigkeFZhbCwtMTApOwoJfQkvLwlmdW5jdGlvbiBfbmJyQ29udmVyc2lvbkZvcm1hdCgpCgoKCS8qKgoJICogQkVTU0VMSQoJICoKCSAqIFJldHVybnMgdGhlIG1vZGlmaWVkIEJlc3NlbCBmdW5jdGlvbiwgd2hpY2ggaXMgZXF1aXZhbGVudCB0byB0aGUgQmVzc2VsIGZ1bmN0aW9uIGV2YWx1YXRlZCBmb3IKCSAqIHB1cmVseSBpbWFnaW5hcnkgYXJndW1lbnRzCgkgKgoJICogRXhjZWwgRnVuY3Rpb246CgkgKgkJQkVTU0VMSSh4LG9yZCkKCSAqCgkgKiBAYWNjZXNzCXB1YmxpYwoJICogQGNhdGVnb3J5IEVuZ2luZWVyaW5nIEZ1bmN0aW9ucwoJICogQHBhcmFtCWZsb2F0CQkkeAkJVGhlIHZhbHVlIGF0IHdoaWNoIHRvIGV2YWx1YXRlIHRoZSBmdW5jdGlvbi4KCSAqCQkJCQkJCQlJZiB4IGlzIG5vbm51bWVyaWMsIEJFU1NFTEkgcmV0dXJucyB0aGUgI1ZBTFVFISBlcnJvciB2YWx1ZS4KCSAqIEBwYXJhbQlpbnRlZ2VyCQkkb3JkCVRoZSBvcmRlciBvZiB0aGUgQmVzc2VsIGZ1bmN0aW9uLiBJZiBuIGlzIG5vdCBhbiBpbnRlZ2VyLCBpdCBpcyB0cnVuY2F0ZWQuCgkgKgkJCQkJCQkJSWYgJG9yZCBpcyBub25udW1lcmljLCBCRVNTRUxJIHJldHVybnMgdGhlICNWQUxVRSEgZXJyb3IgdmFsdWUuCgkgKgkJCQkJCQkJSWYgJG9yZCA8IDAsIEJFU1NFTEkgcmV0dXJucyB0aGUgI05VTSEgZXJyb3IgdmFsdWUuCgkgKiBAcmV0dXJuCWZsb2F0CgkgKgoJICogQFRPRE8gQmV0dGVyIGhhbmRsaW5nIG9mIHRoZSBhcHByb3hpbWF0aW9uIG1ldGhvZCB0byBzdXBwb3J0IHRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIEV4Y2VsL0dudW1lcmljIGFuZCBPcGVuL0xpYnJlIE9mZmljZQoJICoKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBCRVNTRUxJKCR4LCAkb3JkKSB7CgkJJHgJPSAoaXNfbnVsbCgkeCkpCT8gMC4wIDoJUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuU2luZ2xlVmFsdWUoJHgpOwoJCSRvcmQJPSAoaXNfbnVsbCgkb3JkKSkJPyAwLjAgOglQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5TaW5nbGVWYWx1ZSgkb3JkKTsKCgkJaWYgKChpc19udW1lcmljKCR4KSkgJiYgKGlzX251bWVyaWMoJG9yZCkpKSB7CgkJCSRvcmQJPSBmbG9vcigkb3JkKTsKCQkJaWYgKCRvcmQgPCAwKSB7CgkJCQlyZXR1cm4gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpOYU4oKTsKCQkJfQoKCQkJaWYgKGFicygkeCkgPD0gMzApIHsKCQkJCSRmUmVzdWx0ID0gJGZUZXJtID0gcG93KCR4IC8gMiwgJG9yZCkgLyBQSFBFeGNlbF9DYWxjdWxhdGlvbl9NYXRoVHJpZzo6RkFDVCgkb3JkKTsKCQkJCSRvcmRLID0gMTsKCQkJCSRmU3FyWCA9ICgkeCAqICR4KSAvIDQ7CgkJCQlkbyB7CgkJCQkJJGZUZXJtICo9ICRmU3FyWDsKCQkJCQkkZlRlcm0gLz0gKCRvcmRLICogKCRvcmRLICsgJG9yZCkpOwoJCQkJCSRmUmVzdWx0ICs9ICRmVGVybTsKCQkJCX0gd2hpbGUgKChhYnMoJGZUZXJtKSA+IDFlLTEyKSAmJiAoKyskb3JkSyA8IDEwMCkpOwoJCQl9IGVsc2UgewoJCQkJJGZfMl9QSSA9IDIgKiBNX1BJOwoKCQkJCSRmWEFicyA9IGFicygkeCk7CgkJCQkkZlJlc3VsdCA9IGV4cCgkZlhBYnMpIC8gc3FydCgkZl8yX1BJICogJGZYQWJzKTsKCQkJCWlmICgoJG9yZCAmIDEpICYmICgkeCA8IDApKSB7CgkJCQkJJGZSZXN1bHQgPSAtJGZSZXN1bHQ7CgkJCQl9CgkJCX0KCQkJcmV0dXJuIChpc19uYW4oJGZSZXN1bHQpKSA/IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6TmFOKCkgOiAkZlJlc3VsdDsKCQl9CgkJcmV0dXJuIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6VkFMVUUoKTsKCX0JLy8JZnVuY3Rpb24gQkVTU0VMSSgpCgoKCS8qKgoJICogQkVTU0VMSgoJICoKCSAqIFJldHVybnMgdGhlIEJlc3NlbCBmdW5jdGlvbgoJICoKCSAqIEV4Y2VsIEZ1bmN0aW9uOgoJICoJCUJFU1NFTEooeCxvcmQpCgkgKgoJICogQGFjY2VzcwlwdWJsaWMKCSAqIEBjYXRlZ29yeSBFbmdpbmVlcmluZyBGdW5jdGlvbnMKCSAqIEBwYXJhbQlmbG9hdAkJJHgJCVRoZSB2YWx1ZSBhdCB3aGljaCB0byBldmFsdWF0ZSB0aGUgZnVuY3Rpb24uCgkgKgkJCQkJCQkJSWYgeCBpcyBub25udW1lcmljLCBCRVNTRUxKIHJldHVybnMgdGhlICNWQUxVRSEgZXJyb3IgdmFsdWUuCgkgKiBAcGFyYW0JaW50ZWdlcgkJJG9yZAlUaGUgb3JkZXIgb2YgdGhlIEJlc3NlbCBmdW5jdGlvbi4gSWYgbiBpcyBub3QgYW4gaW50ZWdlciwgaXQgaXMgdHJ1bmNhdGVkLgoJICoJCQkJCQkJCUlmICRvcmQgaXMgbm9ubnVtZXJpYywgQkVTU0VMSiByZXR1cm5zIHRoZSAjVkFMVUUhIGVycm9yIHZhbHVlLgoJICoJCQkJCQkJCUlmICRvcmQgPCAwLCBCRVNTRUxKIHJldHVybnMgdGhlICNOVU0hIGVycm9yIHZhbHVlLgoJICogQHJldHVybglmbG9hdAoJICoKCSAqIEBUT0RPIEJldHRlciBoYW5kbGluZyBvZiB0aGUgYXBwcm94aW1hdGlvbiBtZXRob2QgdG8gc3VwcG9ydCB0aGUgZGlmZmVyZW5jZXMgYmV0d2VlbiBFeGNlbC9HbnVtZXJpYyBhbmQgT3Blbi9MaWJyZSBPZmZpY2UKCSAqCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gQkVTU0VMSigkeCwgJG9yZCkgewoJCSR4CT0gKGlzX251bGwoJHgpKQk/IDAuMCA6CVBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlblNpbmdsZVZhbHVlKCR4KTsKCQkkb3JkCT0gKGlzX251bGwoJG9yZCkpCT8gMC4wIDoJUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuU2luZ2xlVmFsdWUoJG9yZCk7CgoJCWlmICgoaXNfbnVtZXJpYygkeCkpICYmIChpc19udW1lcmljKCRvcmQpKSkgewoJCQkkb3JkCT0gZmxvb3IoJG9yZCk7CgkJCWlmICgkb3JkIDwgMCkgewoJCQkJcmV0dXJuIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6TmFOKCk7CgkJCX0KCgkJCSRmUmVzdWx0ID0gMDsKCQkJaWYgKGFicygkeCkgPD0gMzApIHsKCQkJCSRmUmVzdWx0ID0gJGZUZXJtID0gcG93KCR4IC8gMiwgJG9yZCkgLyBQSFBFeGNlbF9DYWxjdWxhdGlvbl9NYXRoVHJpZzo6RkFDVCgkb3JkKTsKCQkJCSRvcmRLID0gMTsKCQkJCSRmU3FyWCA9ICgkeCAqICR4KSAvIC00OwoJCQkJZG8gewoJCQkJCSRmVGVybSAqPSAkZlNxclg7CgkJCQkJJGZUZXJtIC89ICgkb3JkSyAqICgkb3JkSyArICRvcmQpKTsKCQkJCQkkZlJlc3VsdCArPSAkZlRlcm07CgkJCQl9IHdoaWxlICgoYWJzKCRmVGVybSkgPiAxZS0xMikgJiYgKCsrJG9yZEsgPCAxMDApKTsKCQkJfSBlbHNlIHsKCQkJCSRmX1BJX0RJVl8yID0gTV9QSSAvIDI7CgkJCQkkZl9QSV9ESVZfNCA9IE1fUEkgLyA0OwoKCQkJCSRmWEFicyA9IGFicygkeCk7CgkJCQkkZlJlc3VsdCA9IHNxcnQoTV8yRElWUEkgLyAkZlhBYnMpICogY29zKCRmWEFicyAtICRvcmQgKiAkZl9QSV9ESVZfMiAtICRmX1BJX0RJVl80KTsKCQkJCWlmICgoJG9yZCAmIDEpICYmICgkeCA8IDApKSB7CgkJCQkJJGZSZXN1bHQgPSAtJGZSZXN1bHQ7CgkJCQl9CgkJCX0KCQkJcmV0dXJuIChpc19uYW4oJGZSZXN1bHQpKSA/IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6TmFOKCkgOiAkZlJlc3VsdDsKCQl9CgkJcmV0dXJuIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6VkFMVUUoKTsKCX0JLy8JZnVuY3Rpb24gQkVTU0VMSigpCgoKCXByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIF9CZXNzZWxrMCgkZk51bSkgewoJCWlmICgkZk51bSA8PSAyKSB7CgkJCSRmTnVtMiA9ICRmTnVtICogMC41OwoJCQkkeSA9ICgkZk51bTIgKiAkZk51bTIpOwoJCQkkZlJldCA9IC1sb2coJGZOdW0yKSAqIHNlbGY6OkJFU1NFTEkoJGZOdW0sIDApICsKCQkJCQkoLTAuNTc3MjE1NjYgKyAkeSAqICgwLjQyMjc4NDIwICsgJHkgKiAoMC4yMzA2OTc1NiArICR5ICogKDAuMzQ4ODU5MGUtMSArICR5ICogKDAuMjYyNjk4ZS0yICsgJHkgKgoJCQkJCSgwLjEwNzUwZS0zICsgJHkgKiAwLjc0ZS01KSkpKSkpOwoJCX0gZWxzZSB7CgkJCSR5ID0gMiAvICRmTnVtOwoJCQkkZlJldCA9IGV4cCgtJGZOdW0pIC8gc3FydCgkZk51bSkgKgoJCQkJCSgxLjI1MzMxNDE0ICsgJHkgKiAoLTAuNzgzMjM1OGUtMSArICR5ICogKDAuMjE4OTU2OGUtMSArICR5ICogKC0wLjEwNjI0NDZlLTEgKyAkeSAqCgkJCQkJKDAuNTg3ODcyZS0yICsgJHkgKiAoLTAuMjUxNTQwZS0yICsgJHkgKiAwLjUzMjA4ZS0zKSkpKSkpOwoJCX0KCQlyZXR1cm4gJGZSZXQ7Cgl9CS8vCWZ1bmN0aW9uIF9CZXNzZWxrMCgpCgoKCXByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIF9CZXNzZWxrMSgkZk51bSkgewoJCWlmICgkZk51bSA8PSAyKSB7CgkJCSRmTnVtMiA9ICRmTnVtICogMC41OwoJCQkkeSA9ICgkZk51bTIgKiAkZk51bTIpOwoJCQkkZlJldCA9IGxvZygkZk51bTIpICogc2VsZjo6QkVTU0VMSSgkZk51bSwgMSkgKwoJCQkJCSgxICsgJHkgKiAoMC4xNTQ0MzE0NCArICR5ICogKC0wLjY3Mjc4NTc5ICsgJHkgKiAoLTAuMTgxNTY4OTcgKyAkeSAqICgtMC4xOTE5NDAyZS0xICsgJHkgKgoJCQkJCSgtMC4xMTA0MDRlLTIgKyAkeSAqICgtMC40Njg2ZS00KSkpKSkpKSAvICRmTnVtOwoJCX0gZWxzZSB7CgkJCSR5ID0gMiAvICRmTnVtOwoJCQkkZlJldCA9IGV4cCgtJGZOdW0pIC8gc3FydCgkZk51bSkgKgoJCQkJCSgxLjI1MzMxNDE0ICsgJHkgKiAoMC4yMzQ5ODYxOSArICR5ICogKC0wLjM2NTU2MjBlLTEgKyAkeSAqICgwLjE1MDQyNjhlLTEgKyAkeSAqICgtMC43ODAzNTNlLTIgKyAkeSAqCgkJCQkJKDAuMzI1NjE0ZS0yICsgJHkgKiAoLTAuNjgyNDVlLTMpKSkpKSkpOwoJCX0KCQlyZXR1cm4gJGZSZXQ7Cgl9CS8vCWZ1bmN0aW9uIF9CZXNzZWxrMSgpCgoKCS8qKgoJICogQkVTU0VMSwoJICoKCSAqIFJldHVybnMgdGhlIG1vZGlmaWVkIEJlc3NlbCBmdW5jdGlvbiwgd2hpY2ggaXMgZXF1aXZhbGVudCB0byB0aGUgQmVzc2VsIGZ1bmN0aW9ucyBldmFsdWF0ZWQKCSAqIGZvciBwdXJlbHkgaW1hZ2luYXJ5IGFyZ3VtZW50cy4KCSAqCgkgKiBFeGNlbCBGdW5jdGlvbjoKCSAqCQlCRVNTRUxLKHgsb3JkKQoJICoKCSAqIEBhY2Nlc3MJcHVibGljCgkgKiBAY2F0ZWdvcnkgRW5naW5lZXJpbmcgRnVuY3Rpb25zCgkgKiBAcGFyYW0JZmxvYXQJCSR4CQlUaGUgdmFsdWUgYXQgd2hpY2ggdG8gZXZhbHVhdGUgdGhlIGZ1bmN0aW9uLgoJICoJCQkJCQkJCUlmIHggaXMgbm9ubnVtZXJpYywgQkVTU0VMSyByZXR1cm5zIHRoZSAjVkFMVUUhIGVycm9yIHZhbHVlLgoJICogQHBhcmFtCWludGVnZXIJCSRvcmQJVGhlIG9yZGVyIG9mIHRoZSBCZXNzZWwgZnVuY3Rpb24uIElmIG4gaXMgbm90IGFuIGludGVnZXIsIGl0IGlzIHRydW5jYXRlZC4KCSAqCQkJCQkJCQlJZiAkb3JkIGlzIG5vbm51bWVyaWMsIEJFU1NFTEsgcmV0dXJucyB0aGUgI1ZBTFVFISBlcnJvciB2YWx1ZS4KCSAqCQkJCQkJCQlJZiAkb3JkIDwgMCwgQkVTU0VMSyByZXR1cm5zIHRoZSAjTlVNISBlcnJvciB2YWx1ZS4KCSAqIEByZXR1cm4JZmxvYXQKCSAqCgkgKiBAVE9ETyBCZXR0ZXIgaGFuZGxpbmcgb2YgdGhlIGFwcHJveGltYXRpb24gbWV0aG9kIHRvIHN1cHBvcnQgdGhlIGRpZmZlcmVuY2VzIGJldHdlZW4gRXhjZWwvR251bWVyaWMgYW5kIE9wZW4vTGlicmUgT2ZmaWNlCgkgKgoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIEJFU1NFTEsoJHgsICRvcmQpIHsKCQkkeAkJPSAoaXNfbnVsbCgkeCkpCQk/IDAuMCA6CVBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlblNpbmdsZVZhbHVlKCR4KTsKCQkkb3JkCT0gKGlzX251bGwoJG9yZCkpCT8gMC4wIDoJUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuU2luZ2xlVmFsdWUoJG9yZCk7CgoJCWlmICgoaXNfbnVtZXJpYygkeCkpICYmIChpc19udW1lcmljKCRvcmQpKSkgewoJCQlpZiAoKCRvcmQgPCAwKSB8fCAoJHggPT0gMC4wKSkgewoJCQkJcmV0dXJuIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6TmFOKCk7CgkJCX0KCgkJCXN3aXRjaChmbG9vcigkb3JkKSkgewoJCQkJY2FzZSAwIDoJcmV0dXJuIHNlbGY6Ol9CZXNzZWxrMCgkeCk7CgkJCQkJCQlicmVhazsKCQkJCWNhc2UgMSA6CXJldHVybiBzZWxmOjpfQmVzc2VsazEoJHgpOwoJCQkJCQkJYnJlYWs7CgkJCQlkZWZhdWx0IDoJJGZUb3gJPSAyIC8gJHg7CgkJCQkJCQkkZkJrbQk9IHNlbGY6Ol9CZXNzZWxrMCgkeCk7CgkJCQkJCQkkZkJrCT0gc2VsZjo6X0Jlc3NlbGsxKCR4KTsKCQkJCQkJCWZvciAoJG4gPSAxOyAkbiA8ICRvcmQ7ICsrJG4pIHsKCQkJCQkJCQkkZkJrcAk9ICRmQmttICsgJG4gKiAkZlRveCAqICRmQms7CgkJCQkJCQkJJGZCa20JPSAkZkJrOwoJCQkJCQkJCSRmQmsJPSAkZkJrcDsKCQkJCQkJCX0KCQkJfQoJCQlyZXR1cm4gKGlzX25hbigkZkJrKSkgPyBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6Ok5hTigpIDogJGZCazsKCQl9CgkJcmV0dXJuIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6VkFMVUUoKTsKCX0JLy8JZnVuY3Rpb24gQkVTU0VMSygpCgoKCXByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIF9CZXNzZWx5MCgkZk51bSkgewoJCWlmICgkZk51bSA8IDguMCkgewoJCQkkeSA9ICgkZk51bSAqICRmTnVtKTsKCQkJJGYxID0gLTI5NTc4MjEzODkuMCArICR5ICogKDcwNjI4MzQwNjUuMCArICR5ICogKC01MTIzNTk4MDMuNiArICR5ICogKDEwODc5ODgxLjI5ICsgJHkgKiAoLTg2MzI3LjkyNzU3ICsgJHkgKiAyMjguNDYyMjczMykpKSk7CgkJCSRmMiA9IDQwMDc2NTQ0MjY5LjAgKyAkeSAqICg3NDUyNDk5NjQuOCArICR5ICogKDcxODk0NjYuNDM4ICsgJHkgKiAoNDc0NDcuMjY0NzAgKyAkeSAqICgyMjYuMTAzMDI0NCArICR5KSkpKTsKCQkJJGZSZXQgPSAkZjEgLyAkZjIgKyAwLjYzNjYxOTc3MiAqIHNlbGY6OkJFU1NFTEooJGZOdW0sIDApICogbG9nKCRmTnVtKTsKCQl9IGVsc2UgewoJCQkkeiA9IDguMCAvICRmTnVtOwoJCQkkeSA9ICgkeiAqICR6KTsKCQkJJHh4ID0gJGZOdW0gLSAwLjc4NTM5ODE2NDsKCQkJJGYxID0gMSArICR5ICogKC0wLjEwOTg2Mjg2MjdlLTIgKyAkeSAqICgwLjI3MzQ1MTA0MDdlLTQgKyAkeSAqICgtMC4yMDczMzcwNjM5ZS01ICsgJHkgKiAwLjIwOTM4ODcyMTFlLTYpKSk7CgkJCSRmMiA9IC0wLjE1NjI0OTk5OTVlLTEgKyAkeSAqICgwLjE0MzA0ODg3NjVlLTMgKyAkeSAqICgtMC42OTExMTQ3NjUxZS01ICsgJHkgKiAoMC43NjIxMDk1MTYxZS02ICsgJHkgKiAoLTAuOTM0OTQ1MTUyZS03KSkpKTsKCQkJJGZSZXQgPSBzcXJ0KDAuNjM2NjE5NzcyIC8gJGZOdW0pICogKHNpbigkeHgpICogJGYxICsgJHogKiBjb3MoJHh4KSAqICRmMik7CgkJfQoJCXJldHVybiAkZlJldDsKCX0JLy8JZnVuY3Rpb24gX0Jlc3NlbHkwKCkKCgoJcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gX0Jlc3NlbHkxKCRmTnVtKSB7CgkJaWYgKCRmTnVtIDwgOC4wKSB7CgkJCSR5ID0gKCRmTnVtICogJGZOdW0pOwoJCQkkZjEgPSAkZk51bSAqICgtMC40OTAwNjA0OTQzZTEzICsgJHkgKiAoMC4xMjc1Mjc0MzkwZTEzICsgJHkgKiAoLTAuNTE1MzQzODEzOWUxMSArICR5ICogKDAuNzM0OTI2NDU1MWU5ICsgJHkgKgoJCQkJKC0wLjQyMzc5MjI3MjZlNyArICR5ICogMC44NTExOTM3OTM1ZTQpKSkpKTsKCQkJJGYyID0gMC4yNDk5NTgwNTcwZTE0ICsgJHkgKiAoMC40MjQ0NDE5NjY0ZTEyICsgJHkgKiAoMC4zNzMzNjUwMzY3ZTEwICsgJHkgKiAoMC4yMjQ1OTA0MDAyZTggKyAkeSAqCgkJCQkoMC4xMDIwNDI2MDUwZTYgKyAkeSAqICgwLjM1NDk2MzI4ODVlMyArICR5KSkpKSk7CgkJCSRmUmV0ID0gJGYxIC8gJGYyICsgMC42MzY2MTk3NzIgKiAoIHNlbGY6OkJFU1NFTEooJGZOdW0sIDEpICogbG9nKCRmTnVtKSAtIDEgLyAkZk51bSk7CgkJfSBlbHNlIHsKLy8JCQkkeiA9IDguMCAvICRmTnVtOwovLwkJCSR5ID0gKCR6ICogJHopOwovLwkJCSR4eCA9ICRmTnVtIC0gMi4zNTYxOTQ0OTE7Ci8vCQkJJGYxID0gMSArICR5ICogKDAuMTgzMTA1ZS0yICsgJHkgKiAoLTAuMzUxNjM5NjQ5NmUtNCArICR5ICogKDAuMjQ1NzUyMDE3NGUtNSArICR5ICogKC0wLjI0MDMzNzAxOWU2KSkpKTsKLy8JCQkkZjIgPSAwLjA0Njg3NDk5OTk1ICsgJHkgKiAoLTAuMjAwMjY5MDg3M2UtMyArICR5ICogKDAuODQ0OTE5OTA5NmUtNSArICR5ICogKC0wLjg4MjI4OTg3ZS02ICsgJHkgKiAwLjEwNTc4NzQxMmUtNikpKTsKLy8JCQkkZlJldCA9IHNxcnQoMC42MzY2MTk3NzIgLyAkZk51bSkgKiAoc2luKCR4eCkgKiAkZjEgKyAkeiAqIGNvcygkeHgpICogJGYyKTsKCQkJI2kxMjQzMCMgLi4uYnV0IHRoaXMgc2VlbXMgdG8gd29yayBtdWNoIGJldHRlci4KCQkJJGZSZXQgPSBzcXJ0KDAuNjM2NjE5NzcyIC8gJGZOdW0pICogc2luKCRmTnVtIC0gMi4zNTYxOTQ0OTEpOwoJCX0KCQlyZXR1cm4gJGZSZXQ7Cgl9CS8vCWZ1bmN0aW9uIF9CZXNzZWx5MSgpCgoKCS8qKgoJICogQkVTU0VMWQoJICoKCSAqIFJldHVybnMgdGhlIEJlc3NlbCBmdW5jdGlvbiwgd2hpY2ggaXMgYWxzbyBjYWxsZWQgdGhlIFdlYmVyIGZ1bmN0aW9uIG9yIHRoZSBOZXVtYW5uIGZ1bmN0aW9uLgoJICoKCSAqIEV4Y2VsIEZ1bmN0aW9uOgoJICoJCUJFU1NFTFkoeCxvcmQpCgkgKgoJICogQGFjY2VzcwlwdWJsaWMKCSAqIEBjYXRlZ29yeSBFbmdpbmVlcmluZyBGdW5jdGlvbnMKCSAqIEBwYXJhbQlmbG9hdAkJJHgJCVRoZSB2YWx1ZSBhdCB3aGljaCB0byBldmFsdWF0ZSB0aGUgZnVuY3Rpb24uCgkgKgkJCQkJCQkJSWYgeCBpcyBub25udW1lcmljLCBCRVNTRUxLIHJldHVybnMgdGhlICNWQUxVRSEgZXJyb3IgdmFsdWUuCgkgKiBAcGFyYW0JaW50ZWdlcgkJJG9yZAlUaGUgb3JkZXIgb2YgdGhlIEJlc3NlbCBmdW5jdGlvbi4gSWYgbiBpcyBub3QgYW4gaW50ZWdlciwgaXQgaXMgdHJ1bmNhdGVkLgoJICoJCQkJCQkJCUlmICRvcmQgaXMgbm9ubnVtZXJpYywgQkVTU0VMSyByZXR1cm5zIHRoZSAjVkFMVUUhIGVycm9yIHZhbHVlLgoJICoJCQkJCQkJCUlmICRvcmQgPCAwLCBCRVNTRUxLIHJldHVybnMgdGhlICNOVU0hIGVycm9yIHZhbHVlLgoJICoKCSAqIEBUT0RPIEJldHRlciBoYW5kbGluZyBvZiB0aGUgYXBwcm94aW1hdGlvbiBtZXRob2QgdG8gc3VwcG9ydCB0aGUgZGlmZmVyZW5jZXMgYmV0d2VlbiBFeGNlbC9HbnVtZXJpYyBhbmQgT3Blbi9MaWJyZSBPZmZpY2UKCSAqCgkgKiBAcmV0dXJuCWZsb2F0CgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gQkVTU0VMWSgkeCwgJG9yZCkgewoJCSR4CQk9IChpc19udWxsKCR4KSkJCT8gMC4wIDoJUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuU2luZ2xlVmFsdWUoJHgpOwoJCSRvcmQJPSAoaXNfbnVsbCgkb3JkKSkJPyAwLjAgOglQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5TaW5nbGVWYWx1ZSgkb3JkKTsKCgkJaWYgKChpc19udW1lcmljKCR4KSkgJiYgKGlzX251bWVyaWMoJG9yZCkpKSB7CgkJCWlmICgoJG9yZCA8IDApIHx8ICgkeCA9PSAwLjApKSB7CgkJCQlyZXR1cm4gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpOYU4oKTsKCQkJfQoKCQkJc3dpdGNoKGZsb29yKCRvcmQpKSB7CgkJCQljYXNlIDAgOglyZXR1cm4gc2VsZjo6X0Jlc3NlbHkwKCR4KTsKCQkJCQkJCWJyZWFrOwoJCQkJY2FzZSAxIDoJcmV0dXJuIHNlbGY6Ol9CZXNzZWx5MSgkeCk7CgkJCQkJCQlicmVhazsKCQkJCWRlZmF1bHQ6CSRmVG94CT0gMiAvICR4OwoJCQkJCQkJJGZCeW0JPSBzZWxmOjpfQmVzc2VseTAoJHgpOwoJCQkJCQkJJGZCeQk9IHNlbGY6Ol9CZXNzZWx5MSgkeCk7CgkJCQkJCQlmb3IgKCRuID0gMTsgJG4gPCAkb3JkOyArKyRuKSB7CgkJCQkJCQkJJGZCeXAJPSAkbiAqICRmVG94ICogJGZCeSAtICRmQnltOwoJCQkJCQkJCSRmQnltCT0gJGZCeTsKCQkJCQkJCQkkZkJ5CT0gJGZCeXA7CgkJCQkJCQl9CgkJCX0KCQkJcmV0dXJuIChpc19uYW4oJGZCeSkpID8gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpOYU4oKSA6ICRmQnk7CgkJfQoJCXJldHVybiBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OlZBTFVFKCk7Cgl9CS8vCWZ1bmN0aW9uIEJFU1NFTFkoKQoKCgkvKioKCSAqIEJJTlRPREVDCgkgKgoJICogUmV0dXJuIGEgYmluYXJ5IHZhbHVlIGFzIGRlY2ltYWwuCgkgKgoJICogRXhjZWwgRnVuY3Rpb246CgkgKgkJQklOMkRFQyh4KQoJICoKCSAqIEBhY2Nlc3MJcHVibGljCgkgKiBAY2F0ZWdvcnkgRW5naW5lZXJpbmcgRnVuY3Rpb25zCgkgKiBAcGFyYW0Jc3RyaW5nCQkkeAkJVGhlIGJpbmFyeSBudW1iZXIgKGFzIGEgc3RyaW5nKSB0aGF0IHlvdSB3YW50IHRvIGNvbnZlcnQuIFRoZSBudW1iZXIKCSAqCQkJCQkJCQljYW5ub3QgY29udGFpbiBtb3JlIHRoYW4gMTAgY2hhcmFjdGVycyAoMTAgYml0cykuIFRoZSBtb3N0IHNpZ25pZmljYW50CgkgKgkJCQkJCQkJYml0IG9mIG51bWJlciBpcyB0aGUgc2lnbiBiaXQuIFRoZSByZW1haW5pbmcgOSBiaXRzIGFyZSBtYWduaXR1ZGUgYml0cy4KCSAqCQkJCQkJCQlOZWdhdGl2ZSBudW1iZXJzIGFyZSByZXByZXNlbnRlZCB1c2luZyB0d28ncy1jb21wbGVtZW50IG5vdGF0aW9uLgoJICoJCQkJCQkJCUlmIG51bWJlciBpcyBub3QgYSB2YWxpZCBiaW5hcnkgbnVtYmVyLCBvciBpZiBudW1iZXIgY29udGFpbnMgbW9yZSB0aGFuCgkgKgkJCQkJCQkJMTAgY2hhcmFjdGVycyAoMTAgYml0cyksIEJJTjJERUMgcmV0dXJucyB0aGUgI05VTSEgZXJyb3IgdmFsdWUuCgkgKiBAcmV0dXJuCXN0cmluZwoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIEJJTlRPREVDKCR4KSB7CgkJJHgJPSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5TaW5nbGVWYWx1ZSgkeCk7CgoJCWlmIChpc19ib29sKCR4KSkgewoJCQlpZiAoUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpnZXRDb21wYXRpYmlsaXR5TW9kZSgpID09IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6Q09NUEFUSUJJTElUWV9PUEVOT0ZGSUNFKSB7CgkJCQkkeCA9IChpbnQpICR4OwoJCQl9IGVsc2UgewoJCQkJcmV0dXJuIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6VkFMVUUoKTsKCQkJfQoJCX0KCQlpZiAoUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpnZXRDb21wYXRpYmlsaXR5TW9kZSgpID09IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6Q09NUEFUSUJJTElUWV9HTlVNRVJJQykgewoJCQkkeCA9IGZsb29yKCR4KTsKCQl9CgkJJHggPSAoc3RyaW5nKSAkeDsKCQlpZiAoc3RybGVuKCR4KSA+IHByZWdfbWF0Y2hfYWxsKCcvWzAxXS8nLCR4LCRvdXQpKSB7CgkJCXJldHVybiBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6Ok5hTigpOwoJCX0KCQlpZiAoc3RybGVuKCR4KSA+IDEwKSB7CgkJCXJldHVybiBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6Ok5hTigpOwoJCX0gZWxzZWlmIChzdHJsZW4oJHgpID09IDEwKSB7CgkJCS8vCVR3bydzIENvbXBsZW1lbnQKCQkJJHggPSBzdWJzdHIoJHgsLTkpOwoJCQlyZXR1cm4gJy0nLig1MTItYmluZGVjKCR4KSk7CgkJfQoJCXJldHVybiBiaW5kZWMoJHgpOwoJfQkvLwlmdW5jdGlvbiBCSU5UT0RFQygpCgoKCS8qKgoJICogQklOVE9IRVgKCSAqCgkgKiBSZXR1cm4gYSBiaW5hcnkgdmFsdWUgYXMgaGV4LgoJICoKCSAqIEV4Y2VsIEZ1bmN0aW9uOgoJICoJCUJJTjJIRVgoeFsscGxhY2VzXSkKCSAqCgkgKiBAYWNjZXNzCXB1YmxpYwoJICogQGNhdGVnb3J5IEVuZ2luZWVyaW5nIEZ1bmN0aW9ucwoJICogQHBhcmFtCXN0cmluZwkJJHgJCVRoZSBiaW5hcnkgbnVtYmVyIChhcyBhIHN0cmluZykgdGhhdCB5b3Ugd2FudCB0byBjb252ZXJ0LiBUaGUgbnVtYmVyCgkgKgkJCQkJCQkJY2Fubm90IGNvbnRhaW4gbW9yZSB0aGFuIDEwIGNoYXJhY3RlcnMgKDEwIGJpdHMpLiBUaGUgbW9zdCBzaWduaWZpY2FudAoJICoJCQkJCQkJCWJpdCBvZiBudW1iZXIgaXMgdGhlIHNpZ24gYml0LiBUaGUgcmVtYWluaW5nIDkgYml0cyBhcmUgbWFnbml0dWRlIGJpdHMuCgkgKgkJCQkJCQkJTmVnYXRpdmUgbnVtYmVycyBhcmUgcmVwcmVzZW50ZWQgdXNpbmcgdHdvJ3MtY29tcGxlbWVudCBub3RhdGlvbi4KCSAqCQkJCQkJCQlJZiBudW1iZXIgaXMgbm90IGEgdmFsaWQgYmluYXJ5IG51bWJlciwgb3IgaWYgbnVtYmVyIGNvbnRhaW5zIG1vcmUgdGhhbgoJICoJCQkJCQkJCTEwIGNoYXJhY3RlcnMgKDEwIGJpdHMpLCBCSU4ySEVYIHJldHVybnMgdGhlICNOVU0hIGVycm9yIHZhbHVlLgoJICogQHBhcmFtCWludGVnZXIJCSRwbGFjZXMJVGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIHVzZS4gSWYgcGxhY2VzIGlzIG9taXR0ZWQsIEJJTjJIRVggdXNlcyB0aGUKCSAqCQkJCQkJCQltaW5pbXVtIG51bWJlciBvZiBjaGFyYWN0ZXJzIG5lY2Vzc2FyeS4gUGxhY2VzIGlzIHVzZWZ1bCBmb3IgcGFkZGluZyB0aGUKCSAqCQkJCQkJCQlyZXR1cm4gdmFsdWUgd2l0aCBsZWFkaW5nIDBzICh6ZXJvcykuCgkgKgkJCQkJCQkJSWYgcGxhY2VzIGlzIG5vdCBhbiBpbnRlZ2VyLCBpdCBpcyB0cnVuY2F0ZWQuCgkgKgkJCQkJCQkJSWYgcGxhY2VzIGlzIG5vbm51bWVyaWMsIEJJTjJIRVggcmV0dXJucyB0aGUgI1ZBTFVFISBlcnJvciB2YWx1ZS4KCSAqCQkJCQkJCQlJZiBwbGFjZXMgaXMgbmVnYXRpdmUsIEJJTjJIRVggcmV0dXJucyB0aGUgI05VTSEgZXJyb3IgdmFsdWUuCgkgKiBAcmV0dXJuCXN0cmluZwoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIEJJTlRPSEVYKCR4LCAkcGxhY2VzPU5VTEwpIHsKCQkkeAk9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlblNpbmdsZVZhbHVlKCR4KTsKCQkkcGxhY2VzCT0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuU2luZ2xlVmFsdWUoJHBsYWNlcyk7CgoJCWlmIChpc19ib29sKCR4KSkgewoJCQlpZiAoUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpnZXRDb21wYXRpYmlsaXR5TW9kZSgpID09IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6Q09NUEFUSUJJTElUWV9PUEVOT0ZGSUNFKSB7CgkJCQkkeCA9IChpbnQpICR4OwoJCQl9IGVsc2UgewoJCQkJcmV0dXJuIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6VkFMVUUoKTsKCQkJfQoJCX0KCQlpZiAoUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpnZXRDb21wYXRpYmlsaXR5TW9kZSgpID09IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6Q09NUEFUSUJJTElUWV9HTlVNRVJJQykgewoJCQkkeCA9IGZsb29yKCR4KTsKCQl9CgkJJHggPSAoc3RyaW5nKSAkeDsKCQlpZiAoc3RybGVuKCR4KSA+IHByZWdfbWF0Y2hfYWxsKCcvWzAxXS8nLCR4LCRvdXQpKSB7CgkJCXJldHVybiBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6Ok5hTigpOwoJCX0KCQlpZiAoc3RybGVuKCR4KSA+IDEwKSB7CgkJCXJldHVybiBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6Ok5hTigpOwoJCX0gZWxzZWlmIChzdHJsZW4oJHgpID09IDEwKSB7CgkJCS8vCVR3bydzIENvbXBsZW1lbnQKCQkJcmV0dXJuIHN0cl9yZXBlYXQoJ0YnLDgpLnN1YnN0cihzdHJ0b3VwcGVyKGRlY2hleChiaW5kZWMoc3Vic3RyKCR4LC05KSkpKSwtMik7CgkJfQoJCSRoZXhWYWwgPSAoc3RyaW5nKSBzdHJ0b3VwcGVyKGRlY2hleChiaW5kZWMoJHgpKSk7CgoJCXJldHVybiBzZWxmOjpfbmJyQ29udmVyc2lvbkZvcm1hdCgkaGV4VmFsLCRwbGFjZXMpOwoJfQkvLwlmdW5jdGlvbiBCSU5UT0hFWCgpCgoKCS8qKgoJICogQklOVE9PQ1QKCSAqCgkgKiBSZXR1cm4gYSBiaW5hcnkgdmFsdWUgYXMgb2N0YWwuCgkgKgoJICogRXhjZWwgRnVuY3Rpb246CgkgKgkJQklOMk9DVCh4WyxwbGFjZXNdKQoJICoKCSAqIEBhY2Nlc3MJcHVibGljCgkgKiBAY2F0ZWdvcnkgRW5naW5lZXJpbmcgRnVuY3Rpb25zCgkgKiBAcGFyYW0Jc3RyaW5nCQkkeAkJVGhlIGJpbmFyeSBudW1iZXIgKGFzIGEgc3RyaW5nKSB0aGF0IHlvdSB3YW50IHRvIGNvbnZlcnQuIFRoZSBudW1iZXIKCSAqCQkJCQkJCQljYW5ub3QgY29udGFpbiBtb3JlIHRoYW4gMTAgY2hhcmFjdGVycyAoMTAgYml0cykuIFRoZSBtb3N0IHNpZ25pZmljYW50CgkgKgkJCQkJCQkJYml0IG9mIG51bWJlciBpcyB0aGUgc2lnbiBiaXQuIFRoZSByZW1haW5pbmcgOSBiaXRzIGFyZSBtYWduaXR1ZGUgYml0cy4KCSAqCQkJCQkJCQlOZWdhdGl2ZSBudW1iZXJzIGFyZSByZXByZXNlbnRlZCB1c2luZyB0d28ncy1jb21wbGVtZW50IG5vdGF0aW9uLgoJICoJCQkJCQkJCUlmIG51bWJlciBpcyBub3QgYSB2YWxpZCBiaW5hcnkgbnVtYmVyLCBvciBpZiBudW1iZXIgY29udGFpbnMgbW9yZSB0aGFuCgkgKgkJCQkJCQkJMTAgY2hhcmFjdGVycyAoMTAgYml0cyksIEJJTjJPQ1QgcmV0dXJucyB0aGUgI05VTSEgZXJyb3IgdmFsdWUuCgkgKiBAcGFyYW0JaW50ZWdlcgkJJHBsYWNlcwlUaGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gdXNlLiBJZiBwbGFjZXMgaXMgb21pdHRlZCwgQklOMk9DVCB1c2VzIHRoZQoJICoJCQkJCQkJCW1pbmltdW0gbnVtYmVyIG9mIGNoYXJhY3RlcnMgbmVjZXNzYXJ5LiBQbGFjZXMgaXMgdXNlZnVsIGZvciBwYWRkaW5nIHRoZQoJICoJCQkJCQkJCXJldHVybiB2YWx1ZSB3aXRoIGxlYWRpbmcgMHMgKHplcm9zKS4KCSAqCQkJCQkJCQlJZiBwbGFjZXMgaXMgbm90IGFuIGludGVnZXIsIGl0IGlzIHRydW5jYXRlZC4KCSAqCQkJCQkJCQlJZiBwbGFjZXMgaXMgbm9ubnVtZXJpYywgQklOMk9DVCByZXR1cm5zIHRoZSAjVkFMVUUhIGVycm9yIHZhbHVlLgoJICoJCQkJCQkJCUlmIHBsYWNlcyBpcyBuZWdhdGl2ZSwgQklOMk9DVCByZXR1cm5zIHRoZSAjTlVNISBlcnJvciB2YWx1ZS4KCSAqIEByZXR1cm4Jc3RyaW5nCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gQklOVE9PQ1QoJHgsICRwbGFjZXM9TlVMTCkgewoJCSR4CT0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuU2luZ2xlVmFsdWUoJHgpOwoJCSRwbGFjZXMJPSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5TaW5nbGVWYWx1ZSgkcGxhY2VzKTsKCgkJaWYgKGlzX2Jvb2woJHgpKSB7CgkJCWlmIChQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmdldENvbXBhdGliaWxpdHlNb2RlKCkgPT0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpDT01QQVRJQklMSVRZX09QRU5PRkZJQ0UpIHsKCQkJCSR4ID0gKGludCkgJHg7CgkJCX0gZWxzZSB7CgkJCQlyZXR1cm4gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpWQUxVRSgpOwoJCQl9CgkJfQoJCWlmIChQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmdldENvbXBhdGliaWxpdHlNb2RlKCkgPT0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpDT01QQVRJQklMSVRZX0dOVU1FUklDKSB7CgkJCSR4ID0gZmxvb3IoJHgpOwoJCX0KCQkkeCA9IChzdHJpbmcpICR4OwoJCWlmIChzdHJsZW4oJHgpID4gcHJlZ19tYXRjaF9hbGwoJy9bMDFdLycsJHgsJG91dCkpIHsKCQkJcmV0dXJuIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6TmFOKCk7CgkJfQoJCWlmIChzdHJsZW4oJHgpID4gMTApIHsKCQkJcmV0dXJuIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6TmFOKCk7CgkJfSBlbHNlaWYgKHN0cmxlbigkeCkgPT0gMTApIHsKCQkJLy8JVHdvJ3MgQ29tcGxlbWVudAoJCQlyZXR1cm4gc3RyX3JlcGVhdCgnNycsNykuc3Vic3RyKHN0cnRvdXBwZXIoZGVjb2N0KGJpbmRlYyhzdWJzdHIoJHgsLTkpKSkpLC0zKTsKCQl9CgkJJG9jdFZhbCA9IChzdHJpbmcpIGRlY29jdChiaW5kZWMoJHgpKTsKCgkJcmV0dXJuIHNlbGY6Ol9uYnJDb252ZXJzaW9uRm9ybWF0KCRvY3RWYWwsJHBsYWNlcyk7Cgl9CS8vCWZ1bmN0aW9uIEJJTlRPT0NUKCkKCgoJLyoqCgkgKiBERUNUT0JJTgoJICoKCSAqIFJldHVybiBhIGRlY2ltYWwgdmFsdWUgYXMgYmluYXJ5LgoJICoKCSAqIEV4Y2VsIEZ1bmN0aW9uOgoJICoJCURFQzJCSU4oeFsscGxhY2VzXSkKCSAqCgkgKiBAYWNjZXNzCXB1YmxpYwoJICogQGNhdGVnb3J5IEVuZ2luZWVyaW5nIEZ1bmN0aW9ucwoJICogQHBhcmFtCXN0cmluZwkJJHgJCVRoZSBkZWNpbWFsIGludGVnZXIgeW91IHdhbnQgdG8gY29udmVydC4gSWYgbnVtYmVyIGlzIG5lZ2F0aXZlLAoJICoJCQkJCQkJCXZhbGlkIHBsYWNlIHZhbHVlcyBhcmUgaWdub3JlZCBhbmQgREVDMkJJTiByZXR1cm5zIGEgMTAtY2hhcmFjdGVyCgkgKgkJCQkJCQkJKDEwLWJpdCkgYmluYXJ5IG51bWJlciBpbiB3aGljaCB0aGUgbW9zdCBzaWduaWZpY2FudCBiaXQgaXMgdGhlIHNpZ24KCSAqCQkJCQkJCQliaXQuIFRoZSByZW1haW5pbmcgOSBiaXRzIGFyZSBtYWduaXR1ZGUgYml0cy4gTmVnYXRpdmUgbnVtYmVycyBhcmUKCSAqCQkJCQkJCQlyZXByZXNlbnRlZCB1c2luZyB0d28ncy1jb21wbGVtZW50IG5vdGF0aW9uLgoJICoJCQkJCQkJCUlmIG51bWJlciA8IC01MTIgb3IgaWYgbnVtYmVyID4gNTExLCBERUMyQklOIHJldHVybnMgdGhlICNOVU0hIGVycm9yCgkgKgkJCQkJCQkJdmFsdWUuCgkgKgkJCQkJCQkJSWYgbnVtYmVyIGlzIG5vbm51bWVyaWMsIERFQzJCSU4gcmV0dXJucyB0aGUgI1ZBTFVFISBlcnJvciB2YWx1ZS4KCSAqCQkJCQkJCQlJZiBERUMyQklOIHJlcXVpcmVzIG1vcmUgdGhhbiBwbGFjZXMgY2hhcmFjdGVycywgaXQgcmV0dXJucyB0aGUgI05VTSEKCSAqCQkJCQkJCQllcnJvciB2YWx1ZS4KCSAqIEBwYXJhbQlpbnRlZ2VyCQkkcGxhY2VzCVRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byB1c2UuIElmIHBsYWNlcyBpcyBvbWl0dGVkLCBERUMyQklOIHVzZXMKCSAqCQkJCQkJCQl0aGUgbWluaW11bSBudW1iZXIgb2YgY2hhcmFjdGVycyBuZWNlc3NhcnkuIFBsYWNlcyBpcyB1c2VmdWwgZm9yCgkgKgkJCQkJCQkJcGFkZGluZyB0aGUgcmV0dXJuIHZhbHVlIHdpdGggbGVhZGluZyAwcyAoemVyb3MpLgoJICoJCQkJCQkJCUlmIHBsYWNlcyBpcyBub3QgYW4gaW50ZWdlciwgaXQgaXMgdHJ1bmNhdGVkLgoJICoJCQkJCQkJCUlmIHBsYWNlcyBpcyBub25udW1lcmljLCBERUMyQklOIHJldHVybnMgdGhlICNWQUxVRSEgZXJyb3IgdmFsdWUuCgkgKgkJCQkJCQkJSWYgcGxhY2VzIGlzIHplcm8gb3IgbmVnYXRpdmUsIERFQzJCSU4gcmV0dXJucyB0aGUgI05VTSEgZXJyb3IgdmFsdWUuCgkgKiBAcmV0dXJuCXN0cmluZwoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIERFQ1RPQklOKCR4LCAkcGxhY2VzPU5VTEwpIHsKCQkkeAk9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlblNpbmdsZVZhbHVlKCR4KTsKCQkkcGxhY2VzCT0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuU2luZ2xlVmFsdWUoJHBsYWNlcyk7CgoJCWlmIChpc19ib29sKCR4KSkgewoJCQlpZiAoUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpnZXRDb21wYXRpYmlsaXR5TW9kZSgpID09IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6Q09NUEFUSUJJTElUWV9PUEVOT0ZGSUNFKSB7CgkJCQkkeCA9IChpbnQpICR4OwoJCQl9IGVsc2UgewoJCQkJcmV0dXJuIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6VkFMVUUoKTsKCQkJfQoJCX0KCQkkeCA9IChzdHJpbmcpICR4OwoJCWlmIChzdHJsZW4oJHgpID4gcHJlZ19tYXRjaF9hbGwoJy9bLTAxMjM0NTY3ODkuXS8nLCR4LCRvdXQpKSB7CgkJCXJldHVybiBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OlZBTFVFKCk7CgkJfQoJCSR4ID0gKHN0cmluZykgZmxvb3IoJHgpOwoJCSRyID0gZGVjYmluKCR4KTsKCQlpZiAoc3RybGVuKCRyKSA9PSAzMikgewoJCQkvLwlUd28ncyBDb21wbGVtZW50CgkJCSRyID0gc3Vic3RyKCRyLC0xMCk7CgkJfSBlbHNlaWYgKHN0cmxlbigkcikgPiAxMSkgewoJCQlyZXR1cm4gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpOYU4oKTsKCQl9CgoJCXJldHVybiBzZWxmOjpfbmJyQ29udmVyc2lvbkZvcm1hdCgkciwkcGxhY2VzKTsKCX0JLy8JZnVuY3Rpb24gREVDVE9CSU4oKQoKCgkvKioKCSAqIERFQ1RPSEVYCgkgKgoJICogUmV0dXJuIGEgZGVjaW1hbCB2YWx1ZSBhcyBoZXguCgkgKgoJICogRXhjZWwgRnVuY3Rpb246CgkgKgkJREVDMkhFWCh4WyxwbGFjZXNdKQoJICoKCSAqIEBhY2Nlc3MJcHVibGljCgkgKiBAY2F0ZWdvcnkgRW5naW5lZXJpbmcgRnVuY3Rpb25zCgkgKiBAcGFyYW0Jc3RyaW5nCQkkeAkJVGhlIGRlY2ltYWwgaW50ZWdlciB5b3Ugd2FudCB0byBjb252ZXJ0LiBJZiBudW1iZXIgaXMgbmVnYXRpdmUsCgkgKgkJCQkJCQkJcGxhY2VzIGlzIGlnbm9yZWQgYW5kIERFQzJIRVggcmV0dXJucyBhIDEwLWNoYXJhY3RlciAoNDAtYml0KQoJICoJCQkJCQkJCWhleGFkZWNpbWFsIG51bWJlciBpbiB3aGljaCB0aGUgbW9zdCBzaWduaWZpY2FudCBiaXQgaXMgdGhlIHNpZ24KCSAqCQkJCQkJCQliaXQuIFRoZSByZW1haW5pbmcgMzkgYml0cyBhcmUgbWFnbml0dWRlIGJpdHMuIE5lZ2F0aXZlIG51bWJlcnMKCSAqCQkJCQkJCQlhcmUgcmVwcmVzZW50ZWQgdXNpbmcgdHdvJ3MtY29tcGxlbWVudCBub3RhdGlvbi4KCSAqCQkJCQkJCQlJZiBudW1iZXIgPCAtNTQ5LDc1NSw4MTMsODg4IG9yIGlmIG51bWJlciA+IDU0OSw3NTUsODEzLDg4NywKCSAqCQkJCQkJCQlERUMySEVYIHJldHVybnMgdGhlICNOVU0hIGVycm9yIHZhbHVlLgoJICoJCQkJCQkJCUlmIG51bWJlciBpcyBub25udW1lcmljLCBERUMySEVYIHJldHVybnMgdGhlICNWQUxVRSEgZXJyb3IgdmFsdWUuCgkgKgkJCQkJCQkJSWYgREVDMkhFWCByZXF1aXJlcyBtb3JlIHRoYW4gcGxhY2VzIGNoYXJhY3RlcnMsIGl0IHJldHVybnMgdGhlCgkgKgkJCQkJCQkJI05VTSEgZXJyb3IgdmFsdWUuCgkgKiBAcGFyYW0JaW50ZWdlcgkJJHBsYWNlcwlUaGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gdXNlLiBJZiBwbGFjZXMgaXMgb21pdHRlZCwgREVDMkhFWCB1c2VzCgkgKgkJCQkJCQkJdGhlIG1pbmltdW0gbnVtYmVyIG9mIGNoYXJhY3RlcnMgbmVjZXNzYXJ5LiBQbGFjZXMgaXMgdXNlZnVsIGZvcgoJICoJCQkJCQkJCXBhZGRpbmcgdGhlIHJldHVybiB2YWx1ZSB3aXRoIGxlYWRpbmcgMHMgKHplcm9zKS4KCSAqCQkJCQkJCQlJZiBwbGFjZXMgaXMgbm90IGFuIGludGVnZXIsIGl0IGlzIHRydW5jYXRlZC4KCSAqCQkJCQkJCQlJZiBwbGFjZXMgaXMgbm9ubnVtZXJpYywgREVDMkhFWCByZXR1cm5zIHRoZSAjVkFMVUUhIGVycm9yIHZhbHVlLgoJICoJCQkJCQkJCUlmIHBsYWNlcyBpcyB6ZXJvIG9yIG5lZ2F0aXZlLCBERUMySEVYIHJldHVybnMgdGhlICNOVU0hIGVycm9yIHZhbHVlLgoJICogQHJldHVybglzdHJpbmcKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBERUNUT0hFWCgkeCwgJHBsYWNlcz1udWxsKSB7CgkJJHgJPSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5TaW5nbGVWYWx1ZSgkeCk7CgkJJHBsYWNlcwk9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlblNpbmdsZVZhbHVlKCRwbGFjZXMpOwoKCQlpZiAoaXNfYm9vbCgkeCkpIHsKCQkJaWYgKFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6Z2V0Q29tcGF0aWJpbGl0eU1vZGUoKSA9PSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OkNPTVBBVElCSUxJVFlfT1BFTk9GRklDRSkgewoJCQkJJHggPSAoaW50KSAkeDsKCQkJfSBlbHNlIHsKCQkJCXJldHVybiBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OlZBTFVFKCk7CgkJCX0KCQl9CgkJJHggPSAoc3RyaW5nKSAkeDsKCQlpZiAoc3RybGVuKCR4KSA+IHByZWdfbWF0Y2hfYWxsKCcvWy0wMTIzNDU2Nzg5Ll0vJywkeCwkb3V0KSkgewoJCQlyZXR1cm4gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpWQUxVRSgpOwoJCX0KCQkkeCA9IChzdHJpbmcpIGZsb29yKCR4KTsKCQkkciA9IHN0cnRvdXBwZXIoZGVjaGV4KCR4KSk7CgkJaWYgKHN0cmxlbigkcikgPT0gOCkgewoJCQkvLwlUd28ncyBDb21wbGVtZW50CgkJCSRyID0gJ0ZGJy4kcjsKCQl9CgoJCXJldHVybiBzZWxmOjpfbmJyQ29udmVyc2lvbkZvcm1hdCgkciwkcGxhY2VzKTsKCX0JLy8JZnVuY3Rpb24gREVDVE9IRVgoKQoKCgkvKioKCSAqIERFQ1RPT0NUCgkgKgoJICogUmV0dXJuIGFuIGRlY2ltYWwgdmFsdWUgYXMgb2N0YWwuCgkgKgoJICogRXhjZWwgRnVuY3Rpb246CgkgKgkJREVDMk9DVCh4WyxwbGFjZXNdKQoJICoKCSAqIEBhY2Nlc3MJcHVibGljCgkgKiBAY2F0ZWdvcnkgRW5naW5lZXJpbmcgRnVuY3Rpb25zCgkgKiBAcGFyYW0Jc3RyaW5nCQkkeAkJVGhlIGRlY2ltYWwgaW50ZWdlciB5b3Ugd2FudCB0byBjb252ZXJ0LiBJZiBudW1iZXIgaXMgbmVnYXRpdmUsCgkgKgkJCQkJCQkJcGxhY2VzIGlzIGlnbm9yZWQgYW5kIERFQzJPQ1QgcmV0dXJucyBhIDEwLWNoYXJhY3RlciAoMzAtYml0KQoJICoJCQkJCQkJCW9jdGFsIG51bWJlciBpbiB3aGljaCB0aGUgbW9zdCBzaWduaWZpY2FudCBiaXQgaXMgdGhlIHNpZ24gYml0LgoJICoJCQkJCQkJCVRoZSByZW1haW5pbmcgMjkgYml0cyBhcmUgbWFnbml0dWRlIGJpdHMuIE5lZ2F0aXZlIG51bWJlcnMgYXJlCgkgKgkJCQkJCQkJcmVwcmVzZW50ZWQgdXNpbmcgdHdvJ3MtY29tcGxlbWVudCBub3RhdGlvbi4KCSAqCQkJCQkJCQlJZiBudW1iZXIgPCAtNTM2LDg3MCw5MTIgb3IgaWYgbnVtYmVyID4gNTM2LDg3MCw5MTEsIERFQzJPQ1QKCSAqCQkJCQkJCQlyZXR1cm5zIHRoZSAjTlVNISBlcnJvciB2YWx1ZS4KCSAqCQkJCQkJCQlJZiBudW1iZXIgaXMgbm9ubnVtZXJpYywgREVDMk9DVCByZXR1cm5zIHRoZSAjVkFMVUUhIGVycm9yIHZhbHVlLgoJICoJCQkJCQkJCUlmIERFQzJPQ1QgcmVxdWlyZXMgbW9yZSB0aGFuIHBsYWNlcyBjaGFyYWN0ZXJzLCBpdCByZXR1cm5zIHRoZQoJICoJCQkJCQkJCSNOVU0hIGVycm9yIHZhbHVlLgoJICogQHBhcmFtCWludGVnZXIJCSRwbGFjZXMJVGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIHVzZS4gSWYgcGxhY2VzIGlzIG9taXR0ZWQsIERFQzJPQ1QgdXNlcwoJICoJCQkJCQkJCXRoZSBtaW5pbXVtIG51bWJlciBvZiBjaGFyYWN0ZXJzIG5lY2Vzc2FyeS4gUGxhY2VzIGlzIHVzZWZ1bCBmb3IKCSAqCQkJCQkJCQlwYWRkaW5nIHRoZSByZXR1cm4gdmFsdWUgd2l0aCBsZWFkaW5nIDBzICh6ZXJvcykuCgkgKgkJCQkJCQkJSWYgcGxhY2VzIGlzIG5vdCBhbiBpbnRlZ2VyLCBpdCBpcyB0cnVuY2F0ZWQuCgkgKgkJCQkJCQkJSWYgcGxhY2VzIGlzIG5vbm51bWVyaWMsIERFQzJPQ1QgcmV0dXJucyB0aGUgI1ZBTFVFISBlcnJvciB2YWx1ZS4KCSAqCQkJCQkJCQlJZiBwbGFjZXMgaXMgemVybyBvciBuZWdhdGl2ZSwgREVDMk9DVCByZXR1cm5zIHRoZSAjTlVNISBlcnJvciB2YWx1ZS4KCSAqIEByZXR1cm4Jc3RyaW5nCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gREVDVE9PQ1QoJHgsICRwbGFjZXM9bnVsbCkgewoJCSR4CT0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuU2luZ2xlVmFsdWUoJHgpOwoJCSRwbGFjZXMJPSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5TaW5nbGVWYWx1ZSgkcGxhY2VzKTsKCgkJaWYgKGlzX2Jvb2woJHgpKSB7CgkJCWlmIChQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmdldENvbXBhdGliaWxpdHlNb2RlKCkgPT0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpDT01QQVRJQklMSVRZX09QRU5PRkZJQ0UpIHsKCQkJCSR4ID0gKGludCkgJHg7CgkJCX0gZWxzZSB7CgkJCQlyZXR1cm4gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpWQUxVRSgpOwoJCQl9CgkJfQoJCSR4ID0gKHN0cmluZykgJHg7CgkJaWYgKHN0cmxlbigkeCkgPiBwcmVnX21hdGNoX2FsbCgnL1stMDEyMzQ1Njc4OS5dLycsJHgsJG91dCkpIHsKCQkJcmV0dXJuIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6VkFMVUUoKTsKCQl9CgkJJHggPSAoc3RyaW5nKSBmbG9vcigkeCk7CgkJJHIgPSBkZWNvY3QoJHgpOwoJCWlmIChzdHJsZW4oJHIpID09IDExKSB7CgkJCS8vCVR3bydzIENvbXBsZW1lbnQKCQkJJHIgPSBzdWJzdHIoJHIsLTEwKTsKCQl9CgoJCXJldHVybiBzZWxmOjpfbmJyQ29udmVyc2lvbkZvcm1hdCgkciwkcGxhY2VzKTsKCX0JLy8JZnVuY3Rpb24gREVDVE9PQ1QoKQoKCgkvKioKCSAqIEhFWFRPQklOCgkgKgoJICogUmV0dXJuIGEgaGV4IHZhbHVlIGFzIGJpbmFyeS4KCSAqCgkgKiBFeGNlbCBGdW5jdGlvbjoKCSAqCQlIRVgyQklOKHhbLHBsYWNlc10pCgkgKgoJICogQGFjY2VzcwlwdWJsaWMKCSAqIEBjYXRlZ29yeSBFbmdpbmVlcmluZyBGdW5jdGlvbnMKCSAqIEBwYXJhbQlzdHJpbmcJCSR4CQkJdGhlIGhleGFkZWNpbWFsIG51bWJlciB5b3Ugd2FudCB0byBjb252ZXJ0LiBOdW1iZXIgY2Fubm90CgkgKgkJCQkJCQkJCWNvbnRhaW4gbW9yZSB0aGFuIDEwIGNoYXJhY3RlcnMuIFRoZSBtb3N0IHNpZ25pZmljYW50IGJpdCBvZgoJICoJCQkJCQkJCQludW1iZXIgaXMgdGhlIHNpZ24gYml0ICg0MHRoIGJpdCBmcm9tIHRoZSByaWdodCkuIFRoZSByZW1haW5pbmcKCSAqCQkJCQkJCQkJOSBiaXRzIGFyZSBtYWduaXR1ZGUgYml0cy4gTmVnYXRpdmUgbnVtYmVycyBhcmUgcmVwcmVzZW50ZWQKCSAqCQkJCQkJCQkJdXNpbmcgdHdvJ3MtY29tcGxlbWVudCBub3RhdGlvbi4KCSAqCQkJCQkJCQkJSWYgbnVtYmVyIGlzIG5lZ2F0aXZlLCBIRVgyQklOIGlnbm9yZXMgcGxhY2VzIGFuZCByZXR1cm5zIGEKCSAqCQkJCQkJCQkJMTAtY2hhcmFjdGVyIGJpbmFyeSBudW1iZXIuCgkgKgkJCQkJCQkJCUlmIG51bWJlciBpcyBuZWdhdGl2ZSwgaXQgY2Fubm90IGJlIGxlc3MgdGhhbiBGRkZGRkZGRTAwLCBhbmQKCSAqCQkJCQkJCQkJaWYgbnVtYmVyIGlzIHBvc2l0aXZlLCBpdCBjYW5ub3QgYmUgZ3JlYXRlciB0aGFuIDFGRi4KCSAqCQkJCQkJCQkJSWYgbnVtYmVyIGlzIG5vdCBhIHZhbGlkIGhleGFkZWNpbWFsIG51bWJlciwgSEVYMkJJTiByZXR1cm5zCgkgKgkJCQkJCQkJCXRoZSAjTlVNISBlcnJvciB2YWx1ZS4KCSAqCQkJCQkJCQkJSWYgSEVYMkJJTiByZXF1aXJlcyBtb3JlIHRoYW4gcGxhY2VzIGNoYXJhY3RlcnMsIGl0IHJldHVybnMKCSAqCQkJCQkJCQkJdGhlICNOVU0hIGVycm9yIHZhbHVlLgoJICogQHBhcmFtCWludGVnZXIJCSRwbGFjZXMJCVRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byB1c2UuIElmIHBsYWNlcyBpcyBvbWl0dGVkLAoJICoJCQkJCQkJCQlIRVgyQklOIHVzZXMgdGhlIG1pbmltdW0gbnVtYmVyIG9mIGNoYXJhY3RlcnMgbmVjZXNzYXJ5LiBQbGFjZXMKCSAqCQkJCQkJCQkJaXMgdXNlZnVsIGZvciBwYWRkaW5nIHRoZSByZXR1cm4gdmFsdWUgd2l0aCBsZWFkaW5nIDBzICh6ZXJvcykuCgkgKgkJCQkJCQkJCUlmIHBsYWNlcyBpcyBub3QgYW4gaW50ZWdlciwgaXQgaXMgdHJ1bmNhdGVkLgoJICoJCQkJCQkJCQlJZiBwbGFjZXMgaXMgbm9ubnVtZXJpYywgSEVYMkJJTiByZXR1cm5zIHRoZSAjVkFMVUUhIGVycm9yIHZhbHVlLgoJICoJCQkJCQkJCQlJZiBwbGFjZXMgaXMgbmVnYXRpdmUsIEhFWDJCSU4gcmV0dXJucyB0aGUgI05VTSEgZXJyb3IgdmFsdWUuCgkgKiBAcmV0dXJuCXN0cmluZwoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIEhFWFRPQklOKCR4LCAkcGxhY2VzPW51bGwpIHsKCQkkeAk9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlblNpbmdsZVZhbHVlKCR4KTsKCQkkcGxhY2VzCT0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuU2luZ2xlVmFsdWUoJHBsYWNlcyk7CgoJCWlmIChpc19ib29sKCR4KSkgewoJCQlyZXR1cm4gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpWQUxVRSgpOwoJCX0KCQkkeCA9IChzdHJpbmcpICR4OwoJCWlmIChzdHJsZW4oJHgpID4gcHJlZ19tYXRjaF9hbGwoJy9bMDEyMzQ1Njc4OUFCQ0RFRl0vJyxzdHJ0b3VwcGVyKCR4KSwkb3V0KSkgewoJCQlyZXR1cm4gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpOYU4oKTsKCQl9CgkJJGJpblZhbCA9IGRlY2JpbihoZXhkZWMoJHgpKTsKCgkJcmV0dXJuIHN1YnN0cihzZWxmOjpfbmJyQ29udmVyc2lvbkZvcm1hdCgkYmluVmFsLCRwbGFjZXMpLC0xMCk7Cgl9CS8vCWZ1bmN0aW9uIEhFWFRPQklOKCkKCgoJLyoqCgkgKiBIRVhUT0RFQwoJICoKCSAqIFJldHVybiBhIGhleCB2YWx1ZSBhcyBkZWNpbWFsLgoJICoKCSAqIEV4Y2VsIEZ1bmN0aW9uOgoJICoJCUhFWDJERUMoeCkKCSAqCgkgKiBAYWNjZXNzCXB1YmxpYwoJICogQGNhdGVnb3J5IEVuZ2luZWVyaW5nIEZ1bmN0aW9ucwoJICogQHBhcmFtCXN0cmluZwkJJHgJCVRoZSBoZXhhZGVjaW1hbCBudW1iZXIgeW91IHdhbnQgdG8gY29udmVydC4gVGhpcyBudW1iZXIgY2Fubm90CgkgKgkJCQkJCQkJY29udGFpbiBtb3JlIHRoYW4gMTAgY2hhcmFjdGVycyAoNDAgYml0cykuIFRoZSBtb3N0IHNpZ25pZmljYW50CgkgKgkJCQkJCQkJYml0IG9mIG51bWJlciBpcyB0aGUgc2lnbiBiaXQuIFRoZSByZW1haW5pbmcgMzkgYml0cyBhcmUgbWFnbml0dWRlCgkgKgkJCQkJCQkJYml0cy4gTmVnYXRpdmUgbnVtYmVycyBhcmUgcmVwcmVzZW50ZWQgdXNpbmcgdHdvJ3MtY29tcGxlbWVudAoJICoJCQkJCQkJCW5vdGF0aW9uLgoJICoJCQkJCQkJCUlmIG51bWJlciBpcyBub3QgYSB2YWxpZCBoZXhhZGVjaW1hbCBudW1iZXIsIEhFWDJERUMgcmV0dXJucyB0aGUKCSAqCQkJCQkJCQkjTlVNISBlcnJvciB2YWx1ZS4KCSAqIEByZXR1cm4Jc3RyaW5nCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gSEVYVE9ERUMoJHgpIHsKCQkkeAk9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlblNpbmdsZVZhbHVlKCR4KTsKCgkJaWYgKGlzX2Jvb2woJHgpKSB7CgkJCXJldHVybiBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OlZBTFVFKCk7CgkJfQoJCSR4ID0gKHN0cmluZykgJHg7CgkJaWYgKHN0cmxlbigkeCkgPiBwcmVnX21hdGNoX2FsbCgnL1swMTIzNDU2Nzg5QUJDREVGXS8nLHN0cnRvdXBwZXIoJHgpLCRvdXQpKSB7CgkJCXJldHVybiBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6Ok5hTigpOwoJCX0KCQlyZXR1cm4gaGV4ZGVjKCR4KTsKCX0JLy8JZnVuY3Rpb24gSEVYVE9ERUMoKQoKCgkvKioKCSAqIEhFWFRPT0NUCgkgKgoJICogUmV0dXJuIGEgaGV4IHZhbHVlIGFzIG9jdGFsLgoJICoKCSAqIEV4Y2VsIEZ1bmN0aW9uOgoJICoJCUhFWDJPQ1QoeFsscGxhY2VzXSkKCSAqCgkgKiBAYWNjZXNzCXB1YmxpYwoJICogQGNhdGVnb3J5IEVuZ2luZWVyaW5nIEZ1bmN0aW9ucwoJICogQHBhcmFtCXN0cmluZwkJJHgJCQlUaGUgaGV4YWRlY2ltYWwgbnVtYmVyIHlvdSB3YW50IHRvIGNvbnZlcnQuIE51bWJlciBjYW5ub3QKCSAqCQkJCQkJCQkJY29udGFpbiBtb3JlIHRoYW4gMTAgY2hhcmFjdGVycy4gVGhlIG1vc3Qgc2lnbmlmaWNhbnQgYml0IG9mCgkgKgkJCQkJCQkJCW51bWJlciBpcyB0aGUgc2lnbiBiaXQuIFRoZSByZW1haW5pbmcgMzkgYml0cyBhcmUgbWFnbml0dWRlCgkgKgkJCQkJCQkJCWJpdHMuIE5lZ2F0aXZlIG51bWJlcnMgYXJlIHJlcHJlc2VudGVkIHVzaW5nIHR3bydzLWNvbXBsZW1lbnQKCSAqCQkJCQkJCQkJbm90YXRpb24uCgkgKgkJCQkJCQkJCUlmIG51bWJlciBpcyBuZWdhdGl2ZSwgSEVYMk9DVCBpZ25vcmVzIHBsYWNlcyBhbmQgcmV0dXJucyBhCgkgKgkJCQkJCQkJCTEwLWNoYXJhY3RlciBvY3RhbCBudW1iZXIuCgkgKgkJCQkJCQkJCUlmIG51bWJlciBpcyBuZWdhdGl2ZSwgaXQgY2Fubm90IGJlIGxlc3MgdGhhbiBGRkUwMDAwMDAwLCBhbmQKCSAqCQkJCQkJCQkJaWYgbnVtYmVyIGlzIHBvc2l0aXZlLCBpdCBjYW5ub3QgYmUgZ3JlYXRlciB0aGFuIDFGRkZGRkZGLgoJICoJCQkJCQkJCQlJZiBudW1iZXIgaXMgbm90IGEgdmFsaWQgaGV4YWRlY2ltYWwgbnVtYmVyLCBIRVgyT0NUIHJldHVybnMKCSAqCQkJCQkJCQkJdGhlICNOVU0hIGVycm9yIHZhbHVlLgoJICoJCQkJCQkJCQlJZiBIRVgyT0NUIHJlcXVpcmVzIG1vcmUgdGhhbiBwbGFjZXMgY2hhcmFjdGVycywgaXQgcmV0dXJucwoJICoJCQkJCQkJCQl0aGUgI05VTSEgZXJyb3IgdmFsdWUuCgkgKiBAcGFyYW0JaW50ZWdlcgkJJHBsYWNlcwkJVGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIHVzZS4gSWYgcGxhY2VzIGlzIG9taXR0ZWQsIEhFWDJPQ1QKCSAqCQkJCQkJCQkJdXNlcyB0aGUgbWluaW11bSBudW1iZXIgb2YgY2hhcmFjdGVycyBuZWNlc3NhcnkuIFBsYWNlcyBpcwoJICoJCQkJCQkJCQl1c2VmdWwgZm9yIHBhZGRpbmcgdGhlIHJldHVybiB2YWx1ZSB3aXRoIGxlYWRpbmcgMHMgKHplcm9zKS4KCSAqCQkJCQkJCQkJSWYgcGxhY2VzIGlzIG5vdCBhbiBpbnRlZ2VyLCBpdCBpcyB0cnVuY2F0ZWQuCgkgKgkJCQkJCQkJCUlmIHBsYWNlcyBpcyBub25udW1lcmljLCBIRVgyT0NUIHJldHVybnMgdGhlICNWQUxVRSEgZXJyb3IKCSAqCQkJCQkJCQkJdmFsdWUuCgkgKgkJCQkJCQkJCUlmIHBsYWNlcyBpcyBuZWdhdGl2ZSwgSEVYMk9DVCByZXR1cm5zIHRoZSAjTlVNISBlcnJvciB2YWx1ZS4KCSAqIEByZXR1cm4Jc3RyaW5nCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gSEVYVE9PQ1QoJHgsICRwbGFjZXM9bnVsbCkgewoJCSR4CT0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuU2luZ2xlVmFsdWUoJHgpOwoJCSRwbGFjZXMJPSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5TaW5nbGVWYWx1ZSgkcGxhY2VzKTsKCgkJaWYgKGlzX2Jvb2woJHgpKSB7CgkJCXJldHVybiBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OlZBTFVFKCk7CgkJfQoJCSR4ID0gKHN0cmluZykgJHg7CgkJaWYgKHN0cmxlbigkeCkgPiBwcmVnX21hdGNoX2FsbCgnL1swMTIzNDU2Nzg5QUJDREVGXS8nLHN0cnRvdXBwZXIoJHgpLCRvdXQpKSB7CgkJCXJldHVybiBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6Ok5hTigpOwoJCX0KCQkkb2N0VmFsID0gZGVjb2N0KGhleGRlYygkeCkpOwoKCQlyZXR1cm4gc2VsZjo6X25ickNvbnZlcnNpb25Gb3JtYXQoJG9jdFZhbCwkcGxhY2VzKTsKCX0JLy8JZnVuY3Rpb24gSEVYVE9PQ1QoKQoKCgkvKioKCSAqIE9DVFRPQklOCgkgKgoJICogUmV0dXJuIGFuIG9jdGFsIHZhbHVlIGFzIGJpbmFyeS4KCSAqCgkgKiBFeGNlbCBGdW5jdGlvbjoKCSAqCQlPQ1QyQklOKHhbLHBsYWNlc10pCgkgKgoJICogQGFjY2VzcwlwdWJsaWMKCSAqIEBjYXRlZ29yeSBFbmdpbmVlcmluZyBGdW5jdGlvbnMKCSAqIEBwYXJhbQlzdHJpbmcJCSR4CQkJVGhlIG9jdGFsIG51bWJlciB5b3Ugd2FudCB0byBjb252ZXJ0LiBOdW1iZXIgbWF5IG5vdAoJICoJCQkJCQkJCQljb250YWluIG1vcmUgdGhhbiAxMCBjaGFyYWN0ZXJzLiBUaGUgbW9zdCBzaWduaWZpY2FudAoJICoJCQkJCQkJCQliaXQgb2YgbnVtYmVyIGlzIHRoZSBzaWduIGJpdC4gVGhlIHJlbWFpbmluZyAyOSBiaXRzCgkgKgkJCQkJCQkJCWFyZSBtYWduaXR1ZGUgYml0cy4gTmVnYXRpdmUgbnVtYmVycyBhcmUgcmVwcmVzZW50ZWQKCSAqCQkJCQkJCQkJdXNpbmcgdHdvJ3MtY29tcGxlbWVudCBub3RhdGlvbi4KCSAqCQkJCQkJCQkJSWYgbnVtYmVyIGlzIG5lZ2F0aXZlLCBPQ1QyQklOIGlnbm9yZXMgcGxhY2VzIGFuZCByZXR1cm5zCgkgKgkJCQkJCQkJCWEgMTAtY2hhcmFjdGVyIGJpbmFyeSBudW1iZXIuCgkgKgkJCQkJCQkJCUlmIG51bWJlciBpcyBuZWdhdGl2ZSwgaXQgY2Fubm90IGJlIGxlc3MgdGhhbiA3Nzc3Nzc3MDAwLAoJICoJCQkJCQkJCQlhbmQgaWYgbnVtYmVyIGlzIHBvc2l0aXZlLCBpdCBjYW5ub3QgYmUgZ3JlYXRlciB0aGFuIDc3Ny4KCSAqCQkJCQkJCQkJSWYgbnVtYmVyIGlzIG5vdCBhIHZhbGlkIG9jdGFsIG51bWJlciwgT0NUMkJJTiByZXR1cm5zCgkgKgkJCQkJCQkJCXRoZSAjTlVNISBlcnJvciB2YWx1ZS4KCSAqCQkJCQkJCQkJSWYgT0NUMkJJTiByZXF1aXJlcyBtb3JlIHRoYW4gcGxhY2VzIGNoYXJhY3RlcnMsIGl0CgkgKgkJCQkJCQkJCXJldHVybnMgdGhlICNOVU0hIGVycm9yIHZhbHVlLgoJICogQHBhcmFtCWludGVnZXIJCSRwbGFjZXMJCVRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byB1c2UuIElmIHBsYWNlcyBpcyBvbWl0dGVkLAoJICoJCQkJCQkJCQlPQ1QyQklOIHVzZXMgdGhlIG1pbmltdW0gbnVtYmVyIG9mIGNoYXJhY3RlcnMgbmVjZXNzYXJ5LgoJICoJCQkJCQkJCQlQbGFjZXMgaXMgdXNlZnVsIGZvciBwYWRkaW5nIHRoZSByZXR1cm4gdmFsdWUgd2l0aAoJICoJCQkJCQkJCQlsZWFkaW5nIDBzICh6ZXJvcykuCgkgKgkJCQkJCQkJCUlmIHBsYWNlcyBpcyBub3QgYW4gaW50ZWdlciwgaXQgaXMgdHJ1bmNhdGVkLgoJICoJCQkJCQkJCQlJZiBwbGFjZXMgaXMgbm9ubnVtZXJpYywgT0NUMkJJTiByZXR1cm5zIHRoZSAjVkFMVUUhCgkgKgkJCQkJCQkJCWVycm9yIHZhbHVlLgoJICoJCQkJCQkJCQlJZiBwbGFjZXMgaXMgbmVnYXRpdmUsIE9DVDJCSU4gcmV0dXJucyB0aGUgI05VTSEgZXJyb3IKCSAqCQkJCQkJCQkJdmFsdWUuCgkgKiBAcmV0dXJuCXN0cmluZwoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIE9DVFRPQklOKCR4LCAkcGxhY2VzPW51bGwpIHsKCQkkeAk9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlblNpbmdsZVZhbHVlKCR4KTsKCQkkcGxhY2VzCT0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuU2luZ2xlVmFsdWUoJHBsYWNlcyk7CgoJCWlmIChpc19ib29sKCR4KSkgewoJCQlyZXR1cm4gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpWQUxVRSgpOwoJCX0KCQkkeCA9IChzdHJpbmcpICR4OwoJCWlmIChwcmVnX21hdGNoX2FsbCgnL1swMTIzNDU2N10vJywkeCwkb3V0KSAhPSBzdHJsZW4oJHgpKSB7CgkJCXJldHVybiBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6Ok5hTigpOwoJCX0KCQkkciA9IGRlY2JpbihvY3RkZWMoJHgpKTsKCgkJcmV0dXJuIHNlbGY6Ol9uYnJDb252ZXJzaW9uRm9ybWF0KCRyLCRwbGFjZXMpOwoJfQkvLwlmdW5jdGlvbiBPQ1RUT0JJTigpCgoKCS8qKgoJICogT0NUVE9ERUMKCSAqCgkgKiBSZXR1cm4gYW4gb2N0YWwgdmFsdWUgYXMgZGVjaW1hbC4KCSAqCgkgKiBFeGNlbCBGdW5jdGlvbjoKCSAqCQlPQ1QyREVDKHgpCgkgKgoJICogQGFjY2VzcwlwdWJsaWMKCSAqIEBjYXRlZ29yeSBFbmdpbmVlcmluZyBGdW5jdGlvbnMKCSAqIEBwYXJhbQlzdHJpbmcJCSR4CQlUaGUgb2N0YWwgbnVtYmVyIHlvdSB3YW50IHRvIGNvbnZlcnQuIE51bWJlciBtYXkgbm90IGNvbnRhaW4KCSAqCQkJCQkJCQltb3JlIHRoYW4gMTAgb2N0YWwgY2hhcmFjdGVycyAoMzAgYml0cykuIFRoZSBtb3N0IHNpZ25pZmljYW50CgkgKgkJCQkJCQkJYml0IG9mIG51bWJlciBpcyB0aGUgc2lnbiBiaXQuIFRoZSByZW1haW5pbmcgMjkgYml0cyBhcmUKCSAqCQkJCQkJCQltYWduaXR1ZGUgYml0cy4gTmVnYXRpdmUgbnVtYmVycyBhcmUgcmVwcmVzZW50ZWQgdXNpbmcKCSAqCQkJCQkJCQl0d28ncy1jb21wbGVtZW50IG5vdGF0aW9uLgoJICoJCQkJCQkJCUlmIG51bWJlciBpcyBub3QgYSB2YWxpZCBvY3RhbCBudW1iZXIsIE9DVDJERUMgcmV0dXJucyB0aGUKCSAqCQkJCQkJCQkjTlVNISBlcnJvciB2YWx1ZS4KCSAqIEByZXR1cm4Jc3RyaW5nCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gT0NUVE9ERUMoJHgpIHsKCQkkeAk9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlblNpbmdsZVZhbHVlKCR4KTsKCgkJaWYgKGlzX2Jvb2woJHgpKSB7CgkJCXJldHVybiBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OlZBTFVFKCk7CgkJfQoJCSR4ID0gKHN0cmluZykgJHg7CgkJaWYgKHByZWdfbWF0Y2hfYWxsKCcvWzAxMjM0NTY3XS8nLCR4LCRvdXQpICE9IHN0cmxlbigkeCkpIHsKCQkJcmV0dXJuIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6TmFOKCk7CgkJfQoJCXJldHVybiBvY3RkZWMoJHgpOwoJfQkvLwlmdW5jdGlvbiBPQ1RUT0RFQygpCgoKCS8qKgoJICogT0NUVE9IRVgKCSAqCgkgKiBSZXR1cm4gYW4gb2N0YWwgdmFsdWUgYXMgaGV4LgoJICoKCSAqIEV4Y2VsIEZ1bmN0aW9uOgoJICoJCU9DVDJIRVgoeFsscGxhY2VzXSkKCSAqCgkgKiBAYWNjZXNzCXB1YmxpYwoJICogQGNhdGVnb3J5IEVuZ2luZWVyaW5nIEZ1bmN0aW9ucwoJICogQHBhcmFtCXN0cmluZwkJJHgJCQlUaGUgb2N0YWwgbnVtYmVyIHlvdSB3YW50IHRvIGNvbnZlcnQuIE51bWJlciBtYXkgbm90IGNvbnRhaW4KCSAqCQkJCQkJCQkJbW9yZSB0aGFuIDEwIG9jdGFsIGNoYXJhY3RlcnMgKDMwIGJpdHMpLiBUaGUgbW9zdCBzaWduaWZpY2FudAoJICoJCQkJCQkJCQliaXQgb2YgbnVtYmVyIGlzIHRoZSBzaWduIGJpdC4gVGhlIHJlbWFpbmluZyAyOSBiaXRzIGFyZQoJICoJCQkJCQkJCQltYWduaXR1ZGUgYml0cy4gTmVnYXRpdmUgbnVtYmVycyBhcmUgcmVwcmVzZW50ZWQgdXNpbmcKCSAqCQkJCQkJCQkJdHdvJ3MtY29tcGxlbWVudCBub3RhdGlvbi4KCSAqCQkJCQkJCQkJSWYgbnVtYmVyIGlzIG5lZ2F0aXZlLCBPQ1QySEVYIGlnbm9yZXMgcGxhY2VzIGFuZCByZXR1cm5zIGEKCSAqCQkJCQkJCQkJMTAtY2hhcmFjdGVyIGhleGFkZWNpbWFsIG51bWJlci4KCSAqCQkJCQkJCQkJSWYgbnVtYmVyIGlzIG5vdCBhIHZhbGlkIG9jdGFsIG51bWJlciwgT0NUMkhFWCByZXR1cm5zIHRoZQoJICoJCQkJCQkJCQkjTlVNISBlcnJvciB2YWx1ZS4KCSAqCQkJCQkJCQkJSWYgT0NUMkhFWCByZXF1aXJlcyBtb3JlIHRoYW4gcGxhY2VzIGNoYXJhY3RlcnMsIGl0IHJldHVybnMKCSAqCQkJCQkJCQkJdGhlICNOVU0hIGVycm9yIHZhbHVlLgoJICogQHBhcmFtCWludGVnZXIJCSRwbGFjZXMJCVRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byB1c2UuIElmIHBsYWNlcyBpcyBvbWl0dGVkLCBPQ1QySEVYCgkgKgkJCQkJCQkJCXVzZXMgdGhlIG1pbmltdW0gbnVtYmVyIG9mIGNoYXJhY3RlcnMgbmVjZXNzYXJ5LiBQbGFjZXMgaXMgdXNlZnVsCgkgKgkJCQkJCQkJCWZvciBwYWRkaW5nIHRoZSByZXR1cm4gdmFsdWUgd2l0aCBsZWFkaW5nIDBzICh6ZXJvcykuCgkgKgkJCQkJCQkJCUlmIHBsYWNlcyBpcyBub3QgYW4gaW50ZWdlciwgaXQgaXMgdHJ1bmNhdGVkLgoJICoJCQkJCQkJCQlJZiBwbGFjZXMgaXMgbm9ubnVtZXJpYywgT0NUMkhFWCByZXR1cm5zIHRoZSAjVkFMVUUhIGVycm9yIHZhbHVlLgoJICoJCQkJCQkJCQlJZiBwbGFjZXMgaXMgbmVnYXRpdmUsIE9DVDJIRVggcmV0dXJucyB0aGUgI05VTSEgZXJyb3IgdmFsdWUuCgkgKiBAcmV0dXJuCXN0cmluZwoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIE9DVFRPSEVYKCR4LCAkcGxhY2VzPW51bGwpIHsKCQkkeAk9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlblNpbmdsZVZhbHVlKCR4KTsKCQkkcGxhY2VzCT0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuU2luZ2xlVmFsdWUoJHBsYWNlcyk7CgoJCWlmIChpc19ib29sKCR4KSkgewoJCQlyZXR1cm4gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpWQUxVRSgpOwoJCX0KCQkkeCA9IChzdHJpbmcpICR4OwoJCWlmIChwcmVnX21hdGNoX2FsbCgnL1swMTIzNDU2N10vJywkeCwkb3V0KSAhPSBzdHJsZW4oJHgpKSB7CgkJCXJldHVybiBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6Ok5hTigpOwoJCX0KCQkkaGV4VmFsID0gc3RydG91cHBlcihkZWNoZXgob2N0ZGVjKCR4KSkpOwoKCQlyZXR1cm4gc2VsZjo6X25ickNvbnZlcnNpb25Gb3JtYXQoJGhleFZhbCwkcGxhY2VzKTsKCX0JLy8JZnVuY3Rpb24gT0NUVE9IRVgoKQoKCgkvKioKCSAqIENPTVBMRVgKCSAqCgkgKiBDb252ZXJ0cyByZWFsIGFuZCBpbWFnaW5hcnkgY29lZmZpY2llbnRzIGludG8gYSBjb21wbGV4IG51bWJlciBvZiB0aGUgZm9ybSB4ICsgeWkgb3IgeCArIHlqLgoJICoKCSAqIEV4Y2VsIEZ1bmN0aW9uOgoJICoJCUNPTVBMRVgocmVhbE51bWJlcixpbWFnaW5hcnlbLHBsYWNlc10pCgkgKgoJICogQGFjY2VzcwlwdWJsaWMKCSAqIEBjYXRlZ29yeSBFbmdpbmVlcmluZyBGdW5jdGlvbnMKCSAqIEBwYXJhbQlmbG9hdAkJJHJlYWxOdW1iZXIJCVRoZSByZWFsIGNvZWZmaWNpZW50IG9mIHRoZSBjb21wbGV4IG51bWJlci4KCSAqIEBwYXJhbQlmbG9hdAkJJGltYWdpbmFyeQkJVGhlIGltYWdpbmFyeSBjb2VmZmljaWVudCBvZiB0aGUgY29tcGxleCBudW1iZXIuCgkgKiBAcGFyYW0Jc3RyaW5nCQkkc3VmZml4CQkJVGhlIHN1ZmZpeCBmb3IgdGhlIGltYWdpbmFyeSBjb21wb25lbnQgb2YgdGhlIGNvbXBsZXggbnVtYmVyLgoJICoJCQkJCQkJCQkJSWYgb21pdHRlZCwgdGhlIHN1ZmZpeCBpcyBhc3N1bWVkIHRvIGJlICJpIi4KCSAqIEByZXR1cm4Jc3RyaW5nCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gQ09NUExFWCgkcmVhbE51bWJlcj0wLjAsICRpbWFnaW5hcnk9MC4wLCAkc3VmZml4PSdpJykgewoJCSRyZWFsTnVtYmVyCT0gKGlzX251bGwoJHJlYWxOdW1iZXIpKQk/IDAuMCA6CVBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlblNpbmdsZVZhbHVlKCRyZWFsTnVtYmVyKTsKCQkkaW1hZ2luYXJ5CT0gKGlzX251bGwoJGltYWdpbmFyeSkpCQk/IDAuMCA6CVBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlblNpbmdsZVZhbHVlKCRpbWFnaW5hcnkpOwoJCSRzdWZmaXgJCT0gKGlzX251bGwoJHN1ZmZpeCkpCQk/ICdpJyA6CVBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlblNpbmdsZVZhbHVlKCRzdWZmaXgpOwoKCQlpZiAoKChpc19udW1lcmljKCRyZWFsTnVtYmVyKSkgJiYgKGlzX251bWVyaWMoJGltYWdpbmFyeSkpKSAmJgoJCQkoKCRzdWZmaXggPT0gJ2knKSB8fCAoJHN1ZmZpeCA9PSAnaicpIHx8ICgkc3VmZml4ID09ICcnKSkpIHsKCQkJJHJlYWxOdW1iZXIJPSAoZmxvYXQpICRyZWFsTnVtYmVyOwoJCQkkaW1hZ2luYXJ5CT0gKGZsb2F0KSAkaW1hZ2luYXJ5OwoKCQkJaWYgKCRzdWZmaXggPT0gJycpICRzdWZmaXggPSAnaSc7CgkJCWlmICgkcmVhbE51bWJlciA9PSAwLjApIHsKCQkJCWlmICgkaW1hZ2luYXJ5ID09IDAuMCkgewoJCQkJCXJldHVybiAoc3RyaW5nKSAnMCc7CgkJCQl9IGVsc2VpZiAoJGltYWdpbmFyeSA9PSAxLjApIHsKCQkJCQlyZXR1cm4gKHN0cmluZykgJHN1ZmZpeDsKCQkJCX0gZWxzZWlmICgkaW1hZ2luYXJ5ID09IC0xLjApIHsKCQkJCQlyZXR1cm4gKHN0cmluZykgJy0nLiRzdWZmaXg7CgkJCQl9CgkJCQlyZXR1cm4gKHN0cmluZykgJGltYWdpbmFyeS4kc3VmZml4OwoJCQl9IGVsc2VpZiAoJGltYWdpbmFyeSA9PSAwLjApIHsKCQkJCXJldHVybiAoc3RyaW5nKSAkcmVhbE51bWJlcjsKCQkJfSBlbHNlaWYgKCRpbWFnaW5hcnkgPT0gMS4wKSB7CgkJCQlyZXR1cm4gKHN0cmluZykgJHJlYWxOdW1iZXIuJysnLiRzdWZmaXg7CgkJCX0gZWxzZWlmICgkaW1hZ2luYXJ5ID09IC0xLjApIHsKCQkJCXJldHVybiAoc3RyaW5nKSAkcmVhbE51bWJlci4nLScuJHN1ZmZpeDsKCQkJfQoJCQlpZiAoJGltYWdpbmFyeSA+IDApIHsgJGltYWdpbmFyeSA9IChzdHJpbmcpICcrJy4kaW1hZ2luYXJ5OyB9CgkJCXJldHVybiAoc3RyaW5nKSAkcmVhbE51bWJlci4kaW1hZ2luYXJ5LiRzdWZmaXg7CgkJfQoKCQlyZXR1cm4gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpWQUxVRSgpOwoJfQkvLwlmdW5jdGlvbiBDT01QTEVYKCkKCgoJLyoqCgkgKiBJTUFHSU5BUlkKCSAqCgkgKiBSZXR1cm5zIHRoZSBpbWFnaW5hcnkgY29lZmZpY2llbnQgb2YgYSBjb21wbGV4IG51bWJlciBpbiB4ICsgeWkgb3IgeCArIHlqIHRleHQgZm9ybWF0LgoJICoKCSAqIEV4Y2VsIEZ1bmN0aW9uOgoJICoJCUlNQUdJTkFSWShjb21wbGV4TnVtYmVyKQoJICoKCSAqIEBhY2Nlc3MJcHVibGljCgkgKiBAY2F0ZWdvcnkgRW5naW5lZXJpbmcgRnVuY3Rpb25zCgkgKiBAcGFyYW0Jc3RyaW5nCQkkY29tcGxleE51bWJlcglUaGUgY29tcGxleCBudW1iZXIgZm9yIHdoaWNoIHlvdSB3YW50IHRoZSBpbWFnaW5hcnkKCSAqIAkJCQkJCQkJCQljb2VmZmljaWVudC4KCSAqIEByZXR1cm4JZmxvYXQKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBJTUFHSU5BUlkoJGNvbXBsZXhOdW1iZXIpIHsKCQkkY29tcGxleE51bWJlcgk9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlblNpbmdsZVZhbHVlKCRjb21wbGV4TnVtYmVyKTsKCgkJJHBhcnNlZENvbXBsZXggPSBzZWxmOjpfcGFyc2VDb21wbGV4KCRjb21wbGV4TnVtYmVyKTsKCQlyZXR1cm4gJHBhcnNlZENvbXBsZXhbJ2ltYWdpbmFyeSddOwoJfQkvLwlmdW5jdGlvbiBJTUFHSU5BUlkoKQoKCgkvKioKCSAqIElNUkVBTAoJICoKCSAqIFJldHVybnMgdGhlIHJlYWwgY29lZmZpY2llbnQgb2YgYSBjb21wbGV4IG51bWJlciBpbiB4ICsgeWkgb3IgeCArIHlqIHRleHQgZm9ybWF0LgoJICoKCSAqIEV4Y2VsIEZ1bmN0aW9uOgoJICoJCUlNUkVBTChjb21wbGV4TnVtYmVyKQoJICoKCSAqIEBhY2Nlc3MJcHVibGljCgkgKiBAY2F0ZWdvcnkgRW5naW5lZXJpbmcgRnVuY3Rpb25zCgkgKiBAcGFyYW0Jc3RyaW5nCQkkY29tcGxleE51bWJlcglUaGUgY29tcGxleCBudW1iZXIgZm9yIHdoaWNoIHlvdSB3YW50IHRoZSByZWFsIGNvZWZmaWNpZW50LgoJICogQHJldHVybglmbG9hdAoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIElNUkVBTCgkY29tcGxleE51bWJlcikgewoJCSRjb21wbGV4TnVtYmVyCT0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuU2luZ2xlVmFsdWUoJGNvbXBsZXhOdW1iZXIpOwoKCQkkcGFyc2VkQ29tcGxleCA9IHNlbGY6Ol9wYXJzZUNvbXBsZXgoJGNvbXBsZXhOdW1iZXIpOwoJCXJldHVybiAkcGFyc2VkQ29tcGxleFsncmVhbCddOwoJfQkvLwlmdW5jdGlvbiBJTVJFQUwoKQoKCgkvKioKCSAqIElNQUJTCgkgKgoJICogUmV0dXJucyB0aGUgYWJzb2x1dGUgdmFsdWUgKG1vZHVsdXMpIG9mIGEgY29tcGxleCBudW1iZXIgaW4geCArIHlpIG9yIHggKyB5aiB0ZXh0IGZvcm1hdC4KCSAqCgkgKiBFeGNlbCBGdW5jdGlvbjoKCSAqCQlJTUFCUyhjb21wbGV4TnVtYmVyKQoJICoKCSAqIEBwYXJhbQlzdHJpbmcJCSRjb21wbGV4TnVtYmVyCVRoZSBjb21wbGV4IG51bWJlciBmb3Igd2hpY2ggeW91IHdhbnQgdGhlIGFic29sdXRlIHZhbHVlLgoJICogQHJldHVybglmbG9hdAoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIElNQUJTKCRjb21wbGV4TnVtYmVyKSB7CgkJJGNvbXBsZXhOdW1iZXIJPSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5TaW5nbGVWYWx1ZSgkY29tcGxleE51bWJlcik7CgoJCSRwYXJzZWRDb21wbGV4ID0gc2VsZjo6X3BhcnNlQ29tcGxleCgkY29tcGxleE51bWJlcik7CgoJCXJldHVybiBzcXJ0KCgkcGFyc2VkQ29tcGxleFsncmVhbCddICogJHBhcnNlZENvbXBsZXhbJ3JlYWwnXSkgKyAoJHBhcnNlZENvbXBsZXhbJ2ltYWdpbmFyeSddICogJHBhcnNlZENvbXBsZXhbJ2ltYWdpbmFyeSddKSk7Cgl9CS8vCWZ1bmN0aW9uIElNQUJTKCkKCgoJLyoqCgkgKiBJTUFSR1VNRU5UCgkgKgoJICogUmV0dXJucyB0aGUgYXJndW1lbnQgdGhldGEgb2YgYSBjb21wbGV4IG51bWJlciwgaS5lLiB0aGUgYW5nbGUgaW4gcmFkaWFucyBmcm9tIHRoZSByZWFsCgkgKiBheGlzIHRvIHRoZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbnVtYmVyIGluIHBvbGFyIGNvb3JkaW5hdGVzLgoJICoKCSAqIEV4Y2VsIEZ1bmN0aW9uOgoJICoJCUlNQVJHVU1FTlQoY29tcGxleE51bWJlcikKCSAqCgkgKiBAcGFyYW0Jc3RyaW5nCQkkY29tcGxleE51bWJlcglUaGUgY29tcGxleCBudW1iZXIgZm9yIHdoaWNoIHlvdSB3YW50IHRoZSBhcmd1bWVudCB0aGV0YS4KCSAqIEByZXR1cm4JZmxvYXQKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBJTUFSR1VNRU5UKCRjb21wbGV4TnVtYmVyKSB7CgkJJGNvbXBsZXhOdW1iZXIJPSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5TaW5nbGVWYWx1ZSgkY29tcGxleE51bWJlcik7CgoJCSRwYXJzZWRDb21wbGV4ID0gc2VsZjo6X3BhcnNlQ29tcGxleCgkY29tcGxleE51bWJlcik7CgoJCWlmICgkcGFyc2VkQ29tcGxleFsncmVhbCddID09IDAuMCkgewoJCQlpZiAoJHBhcnNlZENvbXBsZXhbJ2ltYWdpbmFyeSddID09IDAuMCkgewoJCQkJcmV0dXJuIDAuMDsKCQkJfSBlbHNlaWYoJHBhcnNlZENvbXBsZXhbJ2ltYWdpbmFyeSddIDwgMC4wKSB7CgkJCQlyZXR1cm4gTV9QSSAvIC0yOwoJCQl9IGVsc2UgewoJCQkJcmV0dXJuIE1fUEkgLyAyOwoJCQl9CgkJfSBlbHNlaWYgKCRwYXJzZWRDb21wbGV4WydyZWFsJ10gPiAwLjApIHsKCQkJcmV0dXJuIGF0YW4oJHBhcnNlZENvbXBsZXhbJ2ltYWdpbmFyeSddIC8gJHBhcnNlZENvbXBsZXhbJ3JlYWwnXSk7CgkJfSBlbHNlaWYgKCRwYXJzZWRDb21wbGV4WydpbWFnaW5hcnknXSA8IDAuMCkgewoJCQlyZXR1cm4gMCAtIChNX1BJIC0gYXRhbihhYnMoJHBhcnNlZENvbXBsZXhbJ2ltYWdpbmFyeSddKSAvIGFicygkcGFyc2VkQ29tcGxleFsncmVhbCddKSkpOwoJCX0gZWxzZSB7CgkJCXJldHVybiBNX1BJIC0gYXRhbigkcGFyc2VkQ29tcGxleFsnaW1hZ2luYXJ5J10gLyBhYnMoJHBhcnNlZENvbXBsZXhbJ3JlYWwnXSkpOwoJCX0KCX0JLy8JZnVuY3Rpb24gSU1BUkdVTUVOVCgpCgoKCS8qKgoJICogSU1DT05KVUdBVEUKCSAqCgkgKiBSZXR1cm5zIHRoZSBjb21wbGV4IGNvbmp1Z2F0ZSBvZiBhIGNvbXBsZXggbnVtYmVyIGluIHggKyB5aSBvciB4ICsgeWogdGV4dCBmb3JtYXQuCgkgKgoJICogRXhjZWwgRnVuY3Rpb246CgkgKgkJSU1DT05KVUdBVEUoY29tcGxleE51bWJlcikKCSAqCgkgKiBAcGFyYW0Jc3RyaW5nCQkkY29tcGxleE51bWJlcglUaGUgY29tcGxleCBudW1iZXIgZm9yIHdoaWNoIHlvdSB3YW50IHRoZSBjb25qdWdhdGUuCgkgKiBAcmV0dXJuCXN0cmluZwoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIElNQ09OSlVHQVRFKCRjb21wbGV4TnVtYmVyKSB7CgkJJGNvbXBsZXhOdW1iZXIJPSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5TaW5nbGVWYWx1ZSgkY29tcGxleE51bWJlcik7CgoJCSRwYXJzZWRDb21wbGV4ID0gc2VsZjo6X3BhcnNlQ29tcGxleCgkY29tcGxleE51bWJlcik7CgoJCWlmICgkcGFyc2VkQ29tcGxleFsnaW1hZ2luYXJ5J10gPT0gMC4wKSB7CgkJCXJldHVybiAkcGFyc2VkQ29tcGxleFsncmVhbCddOwoJCX0gZWxzZSB7CgkJCXJldHVybiBzZWxmOjpfY2xlYW5Db21wbGV4KCBzZWxmOjpDT01QTEVYKCAkcGFyc2VkQ29tcGxleFsncmVhbCddLAoJCQkJCQkJCQkJCQkJICAgMCAtICRwYXJzZWRDb21wbGV4WydpbWFnaW5hcnknXSwKCQkJCQkJCQkJCQkJCSAgICRwYXJzZWRDb21wbGV4WydzdWZmaXgnXQoJCQkJCQkJCQkJCQkJICkKCQkJCQkJCQkJICApOwoJCX0KCX0JLy8JZnVuY3Rpb24gSU1DT05KVUdBVEUoKQoKCgkvKioKCSAqIElNQ09TCgkgKgoJICogUmV0dXJucyB0aGUgY29zaW5lIG9mIGEgY29tcGxleCBudW1iZXIgaW4geCArIHlpIG9yIHggKyB5aiB0ZXh0IGZvcm1hdC4KCSAqCgkgKiBFeGNlbCBGdW5jdGlvbjoKCSAqCQlJTUNPUyhjb21wbGV4TnVtYmVyKQoJICoKCSAqIEBwYXJhbQlzdHJpbmcJCSRjb21wbGV4TnVtYmVyCVRoZSBjb21wbGV4IG51bWJlciBmb3Igd2hpY2ggeW91IHdhbnQgdGhlIGNvc2luZS4KCSAqIEByZXR1cm4Jc3RyaW5nfGZsb2F0CgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gSU1DT1MoJGNvbXBsZXhOdW1iZXIpIHsKCQkkY29tcGxleE51bWJlcgk9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlblNpbmdsZVZhbHVlKCRjb21wbGV4TnVtYmVyKTsKCgkJJHBhcnNlZENvbXBsZXggPSBzZWxmOjpfcGFyc2VDb21wbGV4KCRjb21wbGV4TnVtYmVyKTsKCgkJaWYgKCRwYXJzZWRDb21wbGV4WydpbWFnaW5hcnknXSA9PSAwLjApIHsKCQkJcmV0dXJuIGNvcygkcGFyc2VkQ29tcGxleFsncmVhbCddKTsKCQl9IGVsc2UgewoJCQlyZXR1cm4gc2VsZjo6SU1DT05KVUdBVEUoc2VsZjo6Q09NUExFWChjb3MoJHBhcnNlZENvbXBsZXhbJ3JlYWwnXSkgKiBjb3NoKCRwYXJzZWRDb21wbGV4WydpbWFnaW5hcnknXSksc2luKCRwYXJzZWRDb21wbGV4WydyZWFsJ10pICogc2luaCgkcGFyc2VkQ29tcGxleFsnaW1hZ2luYXJ5J10pLCRwYXJzZWRDb21wbGV4WydzdWZmaXgnXSkpOwoJCX0KCX0JLy8JZnVuY3Rpb24gSU1DT1MoKQoKCgkvKioKCSAqIElNU0lOCgkgKgoJICogUmV0dXJucyB0aGUgc2luZSBvZiBhIGNvbXBsZXggbnVtYmVyIGluIHggKyB5aSBvciB4ICsgeWogdGV4dCBmb3JtYXQuCgkgKgoJICogRXhjZWwgRnVuY3Rpb246CgkgKgkJSU1TSU4oY29tcGxleE51bWJlcikKCSAqCgkgKiBAcGFyYW0Jc3RyaW5nCQkkY29tcGxleE51bWJlcglUaGUgY29tcGxleCBudW1iZXIgZm9yIHdoaWNoIHlvdSB3YW50IHRoZSBzaW5lLgoJICogQHJldHVybglzdHJpbmd8ZmxvYXQKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBJTVNJTigkY29tcGxleE51bWJlcikgewoJCSRjb21wbGV4TnVtYmVyCT0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuU2luZ2xlVmFsdWUoJGNvbXBsZXhOdW1iZXIpOwoKCQkkcGFyc2VkQ29tcGxleCA9IHNlbGY6Ol9wYXJzZUNvbXBsZXgoJGNvbXBsZXhOdW1iZXIpOwoKCQlpZiAoJHBhcnNlZENvbXBsZXhbJ2ltYWdpbmFyeSddID09IDAuMCkgewoJCQlyZXR1cm4gc2luKCRwYXJzZWRDb21wbGV4WydyZWFsJ10pOwoJCX0gZWxzZSB7CgkJCXJldHVybiBzZWxmOjpDT01QTEVYKHNpbigkcGFyc2VkQ29tcGxleFsncmVhbCddKSAqIGNvc2goJHBhcnNlZENvbXBsZXhbJ2ltYWdpbmFyeSddKSxjb3MoJHBhcnNlZENvbXBsZXhbJ3JlYWwnXSkgKiBzaW5oKCRwYXJzZWRDb21wbGV4WydpbWFnaW5hcnknXSksJHBhcnNlZENvbXBsZXhbJ3N1ZmZpeCddKTsKCQl9Cgl9CS8vCWZ1bmN0aW9uIElNU0lOKCkKCgoJLyoqCgkgKiBJTVNRUlQKCSAqCgkgKiBSZXR1cm5zIHRoZSBzcXVhcmUgcm9vdCBvZiBhIGNvbXBsZXggbnVtYmVyIGluIHggKyB5aSBvciB4ICsgeWogdGV4dCBmb3JtYXQuCgkgKgoJICogRXhjZWwgRnVuY3Rpb246CgkgKgkJSU1TUVJUKGNvbXBsZXhOdW1iZXIpCgkgKgoJICogQHBhcmFtCXN0cmluZwkJJGNvbXBsZXhOdW1iZXIJVGhlIGNvbXBsZXggbnVtYmVyIGZvciB3aGljaCB5b3Ugd2FudCB0aGUgc3F1YXJlIHJvb3QuCgkgKiBAcmV0dXJuCXN0cmluZwoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIElNU1FSVCgkY29tcGxleE51bWJlcikgewoJCSRjb21wbGV4TnVtYmVyCT0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuU2luZ2xlVmFsdWUoJGNvbXBsZXhOdW1iZXIpOwoKCQkkcGFyc2VkQ29tcGxleCA9IHNlbGY6Ol9wYXJzZUNvbXBsZXgoJGNvbXBsZXhOdW1iZXIpOwoKCQkkdGhldGEgPSBzZWxmOjpJTUFSR1VNRU5UKCRjb21wbGV4TnVtYmVyKTsKCQkkZDEgPSBjb3MoJHRoZXRhIC8gMik7CgkJJGQyID0gc2luKCR0aGV0YSAvIDIpOwoJCSRyID0gc3FydChzcXJ0KCgkcGFyc2VkQ29tcGxleFsncmVhbCddICogJHBhcnNlZENvbXBsZXhbJ3JlYWwnXSkgKyAoJHBhcnNlZENvbXBsZXhbJ2ltYWdpbmFyeSddICogJHBhcnNlZENvbXBsZXhbJ2ltYWdpbmFyeSddKSkpOwoKCQlpZiAoJHBhcnNlZENvbXBsZXhbJ3N1ZmZpeCddID09ICcnKSB7CgkJCXJldHVybiBzZWxmOjpDT01QTEVYKCRkMSAqICRyLCRkMiAqICRyKTsKCQl9IGVsc2UgewoJCQlyZXR1cm4gc2VsZjo6Q09NUExFWCgkZDEgKiAkciwkZDIgKiAkciwkcGFyc2VkQ29tcGxleFsnc3VmZml4J10pOwoJCX0KCX0JLy8JZnVuY3Rpb24gSU1TUVJUKCkKCgoJLyoqCgkgKiBJTUxOCgkgKgoJICogUmV0dXJucyB0aGUgbmF0dXJhbCBsb2dhcml0aG0gb2YgYSBjb21wbGV4IG51bWJlciBpbiB4ICsgeWkgb3IgeCArIHlqIHRleHQgZm9ybWF0LgoJICoKCSAqIEV4Y2VsIEZ1bmN0aW9uOgoJICoJCUlNTE4oY29tcGxleE51bWJlcikKCSAqCgkgKiBAcGFyYW0Jc3RyaW5nCQkkY29tcGxleE51bWJlcglUaGUgY29tcGxleCBudW1iZXIgZm9yIHdoaWNoIHlvdSB3YW50IHRoZSBuYXR1cmFsIGxvZ2FyaXRobS4KCSAqIEByZXR1cm4Jc3RyaW5nCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gSU1MTigkY29tcGxleE51bWJlcikgewoJCSRjb21wbGV4TnVtYmVyCT0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuU2luZ2xlVmFsdWUoJGNvbXBsZXhOdW1iZXIpOwoKCQkkcGFyc2VkQ29tcGxleCA9IHNlbGY6Ol9wYXJzZUNvbXBsZXgoJGNvbXBsZXhOdW1iZXIpOwoKCQlpZiAoKCRwYXJzZWRDb21wbGV4WydyZWFsJ10gPT0gMC4wKSAmJiAoJHBhcnNlZENvbXBsZXhbJ2ltYWdpbmFyeSddID09IDAuMCkpIHsKCQkJcmV0dXJuIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6TmFOKCk7CgkJfQoKCQkkbG9nUiA9IGxvZyhzcXJ0KCgkcGFyc2VkQ29tcGxleFsncmVhbCddICogJHBhcnNlZENvbXBsZXhbJ3JlYWwnXSkgKyAoJHBhcnNlZENvbXBsZXhbJ2ltYWdpbmFyeSddICogJHBhcnNlZENvbXBsZXhbJ2ltYWdpbmFyeSddKSkpOwoJCSR0ID0gc2VsZjo6SU1BUkdVTUVOVCgkY29tcGxleE51bWJlcik7CgoJCWlmICgkcGFyc2VkQ29tcGxleFsnc3VmZml4J10gPT0gJycpIHsKCQkJcmV0dXJuIHNlbGY6OkNPTVBMRVgoJGxvZ1IsJHQpOwoJCX0gZWxzZSB7CgkJCXJldHVybiBzZWxmOjpDT01QTEVYKCRsb2dSLCR0LCRwYXJzZWRDb21wbGV4WydzdWZmaXgnXSk7CgkJfQoJfQkvLwlmdW5jdGlvbiBJTUxOKCkKCgoJLyoqCgkgKiBJTUxPRzEwCgkgKgoJICogUmV0dXJucyB0aGUgY29tbW9uIGxvZ2FyaXRobSAoYmFzZSAxMCkgb2YgYSBjb21wbGV4IG51bWJlciBpbiB4ICsgeWkgb3IgeCArIHlqIHRleHQgZm9ybWF0LgoJICoKCSAqIEV4Y2VsIEZ1bmN0aW9uOgoJICoJCUlNTE9HMTAoY29tcGxleE51bWJlcikKCSAqCgkgKiBAcGFyYW0Jc3RyaW5nCQkkY29tcGxleE51bWJlcglUaGUgY29tcGxleCBudW1iZXIgZm9yIHdoaWNoIHlvdSB3YW50IHRoZSBjb21tb24gbG9nYXJpdGhtLgoJICogQHJldHVybglzdHJpbmcKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBJTUxPRzEwKCRjb21wbGV4TnVtYmVyKSB7CgkJJGNvbXBsZXhOdW1iZXIJPSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5TaW5nbGVWYWx1ZSgkY29tcGxleE51bWJlcik7CgoJCSRwYXJzZWRDb21wbGV4ID0gc2VsZjo6X3BhcnNlQ29tcGxleCgkY29tcGxleE51bWJlcik7CgoJCWlmICgoJHBhcnNlZENvbXBsZXhbJ3JlYWwnXSA9PSAwLjApICYmICgkcGFyc2VkQ29tcGxleFsnaW1hZ2luYXJ5J10gPT0gMC4wKSkgewoJCQlyZXR1cm4gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpOYU4oKTsKCQl9IGVsc2VpZiAoKCRwYXJzZWRDb21wbGV4WydyZWFsJ10gPiAwLjApICYmICgkcGFyc2VkQ29tcGxleFsnaW1hZ2luYXJ5J10gPT0gMC4wKSkgewoJCQlyZXR1cm4gbG9nMTAoJHBhcnNlZENvbXBsZXhbJ3JlYWwnXSk7CgkJfQoKCQlyZXR1cm4gc2VsZjo6SU1QUk9EVUNUKGxvZzEwKEVVTEVSKSxzZWxmOjpJTUxOKCRjb21wbGV4TnVtYmVyKSk7Cgl9CS8vCWZ1bmN0aW9uIElNTE9HMTAoKQoKCgkvKioKCSAqIElNTE9HMgoJICoKCSAqIFJldHVybnMgdGhlIGNvbW1vbiBsb2dhcml0aG0gKGJhc2UgMTApIG9mIGEgY29tcGxleCBudW1iZXIgaW4geCArIHlpIG9yIHggKyB5aiB0ZXh0IGZvcm1hdC4KCSAqCgkgKiBFeGNlbCBGdW5jdGlvbjoKCSAqCQlJTUxPRzIoY29tcGxleE51bWJlcikKCSAqCgkgKiBAcGFyYW0Jc3RyaW5nCQkkY29tcGxleE51bWJlcglUaGUgY29tcGxleCBudW1iZXIgZm9yIHdoaWNoIHlvdSB3YW50IHRoZSBiYXNlLTIgbG9nYXJpdGhtLgoJICogQHJldHVybglzdHJpbmcKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBJTUxPRzIoJGNvbXBsZXhOdW1iZXIpIHsKCQkkY29tcGxleE51bWJlcgk9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlblNpbmdsZVZhbHVlKCRjb21wbGV4TnVtYmVyKTsKCgkJJHBhcnNlZENvbXBsZXggPSBzZWxmOjpfcGFyc2VDb21wbGV4KCRjb21wbGV4TnVtYmVyKTsKCgkJaWYgKCgkcGFyc2VkQ29tcGxleFsncmVhbCddID09IDAuMCkgJiYgKCRwYXJzZWRDb21wbGV4WydpbWFnaW5hcnknXSA9PSAwLjApKSB7CgkJCXJldHVybiBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6Ok5hTigpOwoJCX0gZWxzZWlmICgoJHBhcnNlZENvbXBsZXhbJ3JlYWwnXSA+IDAuMCkgJiYgKCRwYXJzZWRDb21wbGV4WydpbWFnaW5hcnknXSA9PSAwLjApKSB7CgkJCXJldHVybiBsb2coJHBhcnNlZENvbXBsZXhbJ3JlYWwnXSwyKTsKCQl9CgoJCXJldHVybiBzZWxmOjpJTVBST0RVQ1QobG9nKEVVTEVSLDIpLHNlbGY6OklNTE4oJGNvbXBsZXhOdW1iZXIpKTsKCX0JLy8JZnVuY3Rpb24gSU1MT0cyKCkKCgoJLyoqCgkgKiBJTUVYUAoJICoKCSAqIFJldHVybnMgdGhlIGV4cG9uZW50aWFsIG9mIGEgY29tcGxleCBudW1iZXIgaW4geCArIHlpIG9yIHggKyB5aiB0ZXh0IGZvcm1hdC4KCSAqCgkgKiBFeGNlbCBGdW5jdGlvbjoKCSAqCQlJTUVYUChjb21wbGV4TnVtYmVyKQoJICoKCSAqIEBwYXJhbQlzdHJpbmcJCSRjb21wbGV4TnVtYmVyCVRoZSBjb21wbGV4IG51bWJlciBmb3Igd2hpY2ggeW91IHdhbnQgdGhlIGV4cG9uZW50aWFsLgoJICogQHJldHVybglzdHJpbmcKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBJTUVYUCgkY29tcGxleE51bWJlcikgewoJCSRjb21wbGV4TnVtYmVyCT0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuU2luZ2xlVmFsdWUoJGNvbXBsZXhOdW1iZXIpOwoKCQkkcGFyc2VkQ29tcGxleCA9IHNlbGY6Ol9wYXJzZUNvbXBsZXgoJGNvbXBsZXhOdW1iZXIpOwoKCQlpZiAoKCRwYXJzZWRDb21wbGV4WydyZWFsJ10gPT0gMC4wKSAmJiAoJHBhcnNlZENvbXBsZXhbJ2ltYWdpbmFyeSddID09IDAuMCkpIHsKCQkJcmV0dXJuICcxJzsKCQl9CgoJCSRlID0gZXhwKCRwYXJzZWRDb21wbGV4WydyZWFsJ10pOwoJCSRlWCA9ICRlICogY29zKCRwYXJzZWRDb21wbGV4WydpbWFnaW5hcnknXSk7CgkJJGVZID0gJGUgKiBzaW4oJHBhcnNlZENvbXBsZXhbJ2ltYWdpbmFyeSddKTsKCgkJaWYgKCRwYXJzZWRDb21wbGV4WydzdWZmaXgnXSA9PSAnJykgewoJCQlyZXR1cm4gc2VsZjo6Q09NUExFWCgkZVgsJGVZKTsKCQl9IGVsc2UgewoJCQlyZXR1cm4gc2VsZjo6Q09NUExFWCgkZVgsJGVZLCRwYXJzZWRDb21wbGV4WydzdWZmaXgnXSk7CgkJfQoJfQkvLwlmdW5jdGlvbiBJTUVYUCgpCgoKCS8qKgoJICogSU1QT1dFUgoJICoKCSAqIFJldHVybnMgYSBjb21wbGV4IG51bWJlciBpbiB4ICsgeWkgb3IgeCArIHlqIHRleHQgZm9ybWF0IHJhaXNlZCB0byBhIHBvd2VyLgoJICoKCSAqIEV4Y2VsIEZ1bmN0aW9uOgoJICoJCUlNUE9XRVIoY29tcGxleE51bWJlcixyZWFsTnVtYmVyKQoJICoKCSAqIEBwYXJhbQlzdHJpbmcJCSRjb21wbGV4TnVtYmVyCVRoZSBjb21wbGV4IG51bWJlciB5b3Ugd2FudCB0byByYWlzZSB0byBhIHBvd2VyLgoJICogQHBhcmFtCWZsb2F0CQkkcmVhbE51bWJlcgkJVGhlIHBvd2VyIHRvIHdoaWNoIHlvdSB3YW50IHRvIHJhaXNlIHRoZSBjb21wbGV4IG51bWJlci4KCSAqIEByZXR1cm4Jc3RyaW5nCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gSU1QT1dFUigkY29tcGxleE51bWJlciwkcmVhbE51bWJlcikgewoJCSRjb21wbGV4TnVtYmVyCT0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuU2luZ2xlVmFsdWUoJGNvbXBsZXhOdW1iZXIpOwoJCSRyZWFsTnVtYmVyCQk9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlblNpbmdsZVZhbHVlKCRyZWFsTnVtYmVyKTsKCgkJaWYgKCFpc19udW1lcmljKCRyZWFsTnVtYmVyKSkgewoJCQlyZXR1cm4gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpWQUxVRSgpOwoJCX0KCgkJJHBhcnNlZENvbXBsZXggPSBzZWxmOjpfcGFyc2VDb21wbGV4KCRjb21wbGV4TnVtYmVyKTsKCgkJJHIgPSBzcXJ0KCgkcGFyc2VkQ29tcGxleFsncmVhbCddICogJHBhcnNlZENvbXBsZXhbJ3JlYWwnXSkgKyAoJHBhcnNlZENvbXBsZXhbJ2ltYWdpbmFyeSddICogJHBhcnNlZENvbXBsZXhbJ2ltYWdpbmFyeSddKSk7CgkJJHJQb3dlciA9IHBvdygkciwkcmVhbE51bWJlcik7CgkJJHRoZXRhID0gc2VsZjo6SU1BUkdVTUVOVCgkY29tcGxleE51bWJlcikgKiAkcmVhbE51bWJlcjsKCQlpZiAoJHRoZXRhID09IDApIHsKCQkJcmV0dXJuIDE7CgkJfSBlbHNlaWYgKCRwYXJzZWRDb21wbGV4WydpbWFnaW5hcnknXSA9PSAwLjApIHsKCQkJcmV0dXJuIHNlbGY6OkNPTVBMRVgoJHJQb3dlciAqIGNvcygkdGhldGEpLCRyUG93ZXIgKiBzaW4oJHRoZXRhKSwkcGFyc2VkQ29tcGxleFsnc3VmZml4J10pOwoJCX0gZWxzZSB7CgkJCXJldHVybiBzZWxmOjpDT01QTEVYKCRyUG93ZXIgKiBjb3MoJHRoZXRhKSwkclBvd2VyICogc2luKCR0aGV0YSksJHBhcnNlZENvbXBsZXhbJ3N1ZmZpeCddKTsKCQl9Cgl9CS8vCWZ1bmN0aW9uIElNUE9XRVIoKQoKCgkvKioKCSAqIElNRElWCgkgKgoJICogUmV0dXJucyB0aGUgcXVvdGllbnQgb2YgdHdvIGNvbXBsZXggbnVtYmVycyBpbiB4ICsgeWkgb3IgeCArIHlqIHRleHQgZm9ybWF0LgoJICoKCSAqIEV4Y2VsIEZ1bmN0aW9uOgoJICoJCUlNRElWKGNvbXBsZXhEaXZpZGVuZCxjb21wbGV4RGl2aXNvcikKCSAqCgkgKiBAcGFyYW0Jc3RyaW5nCQkkY29tcGxleERpdmlkZW5kCVRoZSBjb21wbGV4IG51bWVyYXRvciBvciBkaXZpZGVuZC4KCSAqIEBwYXJhbQlzdHJpbmcJCSRjb21wbGV4RGl2aXNvcgkJVGhlIGNvbXBsZXggZGVub21pbmF0b3Igb3IgZGl2aXNvci4KCSAqIEByZXR1cm4Jc3RyaW5nCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gSU1ESVYoJGNvbXBsZXhEaXZpZGVuZCwkY29tcGxleERpdmlzb3IpIHsKCQkkY29tcGxleERpdmlkZW5kCT0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuU2luZ2xlVmFsdWUoJGNvbXBsZXhEaXZpZGVuZCk7CgkJJGNvbXBsZXhEaXZpc29yCT0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuU2luZ2xlVmFsdWUoJGNvbXBsZXhEaXZpc29yKTsKCgkJJHBhcnNlZENvbXBsZXhEaXZpZGVuZCA9IHNlbGY6Ol9wYXJzZUNvbXBsZXgoJGNvbXBsZXhEaXZpZGVuZCk7CgkJJHBhcnNlZENvbXBsZXhEaXZpc29yID0gc2VsZjo6X3BhcnNlQ29tcGxleCgkY29tcGxleERpdmlzb3IpOwoKCQlpZiAoKCRwYXJzZWRDb21wbGV4RGl2aWRlbmRbJ3N1ZmZpeCddICE9ICcnKSAmJiAoJHBhcnNlZENvbXBsZXhEaXZpc29yWydzdWZmaXgnXSAhPSAnJykgJiYKCQkJKCRwYXJzZWRDb21wbGV4RGl2aWRlbmRbJ3N1ZmZpeCddICE9ICRwYXJzZWRDb21wbGV4RGl2aXNvclsnc3VmZml4J10pKSB7CgkJCXJldHVybiBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6Ok5hTigpOwoJCX0KCQlpZiAoKCRwYXJzZWRDb21wbGV4RGl2aWRlbmRbJ3N1ZmZpeCddICE9ICcnKSAmJiAoJHBhcnNlZENvbXBsZXhEaXZpc29yWydzdWZmaXgnXSA9PSAnJykpIHsKCQkJJHBhcnNlZENvbXBsZXhEaXZpc29yWydzdWZmaXgnXSA9ICRwYXJzZWRDb21wbGV4RGl2aWRlbmRbJ3N1ZmZpeCddOwoJCX0KCgkJJGQxID0gKCRwYXJzZWRDb21wbGV4RGl2aWRlbmRbJ3JlYWwnXSAqICRwYXJzZWRDb21wbGV4RGl2aXNvclsncmVhbCddKSArICgkcGFyc2VkQ29tcGxleERpdmlkZW5kWydpbWFnaW5hcnknXSAqICRwYXJzZWRDb21wbGV4RGl2aXNvclsnaW1hZ2luYXJ5J10pOwoJCSRkMiA9ICgkcGFyc2VkQ29tcGxleERpdmlkZW5kWydpbWFnaW5hcnknXSAqICRwYXJzZWRDb21wbGV4RGl2aXNvclsncmVhbCddKSAtICgkcGFyc2VkQ29tcGxleERpdmlkZW5kWydyZWFsJ10gKiAkcGFyc2VkQ29tcGxleERpdmlzb3JbJ2ltYWdpbmFyeSddKTsKCQkkZDMgPSAoJHBhcnNlZENvbXBsZXhEaXZpc29yWydyZWFsJ10gKiAkcGFyc2VkQ29tcGxleERpdmlzb3JbJ3JlYWwnXSkgKyAoJHBhcnNlZENvbXBsZXhEaXZpc29yWydpbWFnaW5hcnknXSAqICRwYXJzZWRDb21wbGV4RGl2aXNvclsnaW1hZ2luYXJ5J10pOwoKCQkkciA9ICRkMS8kZDM7CgkJJGkgPSAkZDIvJGQzOwoKCQlpZiAoJGkgPiAwLjApIHsKCQkJcmV0dXJuIHNlbGY6Ol9jbGVhbkNvbXBsZXgoJHIuJysnLiRpLiRwYXJzZWRDb21wbGV4RGl2aXNvclsnc3VmZml4J10pOwoJCX0gZWxzZWlmICgkaSA8IDAuMCkgewoJCQlyZXR1cm4gc2VsZjo6X2NsZWFuQ29tcGxleCgkci4kaS4kcGFyc2VkQ29tcGxleERpdmlzb3JbJ3N1ZmZpeCddKTsKCQl9IGVsc2UgewoJCQlyZXR1cm4gJHI7CgkJfQoJfQkvLwlmdW5jdGlvbiBJTURJVigpCgoKCS8qKgoJICogSU1TVUIKCSAqCgkgKiBSZXR1cm5zIHRoZSBkaWZmZXJlbmNlIG9mIHR3byBjb21wbGV4IG51bWJlcnMgaW4geCArIHlpIG9yIHggKyB5aiB0ZXh0IGZvcm1hdC4KCSAqCgkgKiBFeGNlbCBGdW5jdGlvbjoKCSAqCQlJTVNVQihjb21wbGV4TnVtYmVyMSxjb21wbGV4TnVtYmVyMikKCSAqCgkgKiBAcGFyYW0Jc3RyaW5nCQkkY29tcGxleE51bWJlcjEJCVRoZSBjb21wbGV4IG51bWJlciBmcm9tIHdoaWNoIHRvIHN1YnRyYWN0IGNvbXBsZXhOdW1iZXIyLgoJICogQHBhcmFtCXN0cmluZwkJJGNvbXBsZXhOdW1iZXIyCQlUaGUgY29tcGxleCBudW1iZXIgdG8gc3VidHJhY3QgZnJvbSBjb21wbGV4TnVtYmVyMS4KCSAqIEByZXR1cm4Jc3RyaW5nCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gSU1TVUIoJGNvbXBsZXhOdW1iZXIxLCRjb21wbGV4TnVtYmVyMikgewoJCSRjb21wbGV4TnVtYmVyMQk9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlblNpbmdsZVZhbHVlKCRjb21wbGV4TnVtYmVyMSk7CgkJJGNvbXBsZXhOdW1iZXIyCT0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuU2luZ2xlVmFsdWUoJGNvbXBsZXhOdW1iZXIyKTsKCgkJJHBhcnNlZENvbXBsZXgxID0gc2VsZjo6X3BhcnNlQ29tcGxleCgkY29tcGxleE51bWJlcjEpOwoJCSRwYXJzZWRDb21wbGV4MiA9IHNlbGY6Ol9wYXJzZUNvbXBsZXgoJGNvbXBsZXhOdW1iZXIyKTsKCgkJaWYgKCgoJHBhcnNlZENvbXBsZXgxWydzdWZmaXgnXSAhPSAnJykgJiYgKCRwYXJzZWRDb21wbGV4Mlsnc3VmZml4J10gIT0gJycpKSAmJgoJCQkoJHBhcnNlZENvbXBsZXgxWydzdWZmaXgnXSAhPSAkcGFyc2VkQ29tcGxleDJbJ3N1ZmZpeCddKSkgewoJCQlyZXR1cm4gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpOYU4oKTsKCQl9IGVsc2VpZiAoKCRwYXJzZWRDb21wbGV4MVsnc3VmZml4J10gPT0gJycpICYmICgkcGFyc2VkQ29tcGxleDJbJ3N1ZmZpeCddICE9ICcnKSkgewoJCQkkcGFyc2VkQ29tcGxleDFbJ3N1ZmZpeCddID0gJHBhcnNlZENvbXBsZXgyWydzdWZmaXgnXTsKCQl9CgoJCSRkMSA9ICRwYXJzZWRDb21wbGV4MVsncmVhbCddIC0gJHBhcnNlZENvbXBsZXgyWydyZWFsJ107CgkJJGQyID0gJHBhcnNlZENvbXBsZXgxWydpbWFnaW5hcnknXSAtICRwYXJzZWRDb21wbGV4MlsnaW1hZ2luYXJ5J107CgoJCXJldHVybiBzZWxmOjpDT01QTEVYKCRkMSwkZDIsJHBhcnNlZENvbXBsZXgxWydzdWZmaXgnXSk7Cgl9CS8vCWZ1bmN0aW9uIElNU1VCKCkKCgoJLyoqCgkgKiBJTVNVTQoJICoKCSAqIFJldHVybnMgdGhlIHN1bSBvZiB0d28gb3IgbW9yZSBjb21wbGV4IG51bWJlcnMgaW4geCArIHlpIG9yIHggKyB5aiB0ZXh0IGZvcm1hdC4KCSAqCgkgKiBFeGNlbCBGdW5jdGlvbjoKCSAqCQlJTVNVTShjb21wbGV4TnVtYmVyWyxjb21wbGV4TnVtYmVyWywuLi5dXSkKCSAqCgkgKiBAcGFyYW0Jc3RyaW5nCQkkY29tcGxleE51bWJlciwuLi4JU2VyaWVzIG9mIGNvbXBsZXggbnVtYmVycyB0byBhZGQKCSAqIEByZXR1cm4Jc3RyaW5nCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gSU1TVU0oKSB7CgkJLy8gUmV0dXJuIHZhbHVlCgkJJHJldHVyblZhbHVlID0gc2VsZjo6X3BhcnNlQ29tcGxleCgnMCcpOwoJCSRhY3RpdmVTdWZmaXggPSAnJzsKCgkJLy8gTG9vcCB0aHJvdWdoIHRoZSBhcmd1bWVudHMKCQkkYUFyZ3MgPSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5BcnJheShmdW5jX2dldF9hcmdzKCkpOwoJCWZvcmVhY2ggKCRhQXJncyBhcyAkYXJnKSB7CgkJCSRwYXJzZWRDb21wbGV4ID0gc2VsZjo6X3BhcnNlQ29tcGxleCgkYXJnKTsKCgkJCWlmICgkYWN0aXZlU3VmZml4ID09ICcnKSB7CgkJCQkkYWN0aXZlU3VmZml4ID0gJHBhcnNlZENvbXBsZXhbJ3N1ZmZpeCddOwoJCQl9IGVsc2VpZiAoKCRwYXJzZWRDb21wbGV4WydzdWZmaXgnXSAhPSAnJykgJiYgKCRhY3RpdmVTdWZmaXggIT0gJHBhcnNlZENvbXBsZXhbJ3N1ZmZpeCddKSkgewoJCQkJcmV0dXJuIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6VkFMVUUoKTsKCQkJfQoKCQkJJHJldHVyblZhbHVlWydyZWFsJ10gKz0gJHBhcnNlZENvbXBsZXhbJ3JlYWwnXTsKCQkJJHJldHVyblZhbHVlWydpbWFnaW5hcnknXSArPSAkcGFyc2VkQ29tcGxleFsnaW1hZ2luYXJ5J107CgkJfQoKCQlpZiAoJHJldHVyblZhbHVlWydpbWFnaW5hcnknXSA9PSAwLjApIHsgJGFjdGl2ZVN1ZmZpeCA9ICcnOyB9CgkJcmV0dXJuIHNlbGY6OkNPTVBMRVgoJHJldHVyblZhbHVlWydyZWFsJ10sJHJldHVyblZhbHVlWydpbWFnaW5hcnknXSwkYWN0aXZlU3VmZml4KTsKCX0JLy8JZnVuY3Rpb24gSU1TVU0oKQoKCgkvKioKCSAqIElNUFJPRFVDVAoJICoKCSAqIFJldHVybnMgdGhlIHByb2R1Y3Qgb2YgdHdvIG9yIG1vcmUgY29tcGxleCBudW1iZXJzIGluIHggKyB5aSBvciB4ICsgeWogdGV4dCBmb3JtYXQuCgkgKgoJICogRXhjZWwgRnVuY3Rpb246CgkgKgkJSU1QUk9EVUNUKGNvbXBsZXhOdW1iZXJbLGNvbXBsZXhOdW1iZXJbLC4uLl1dKQoJICoKCSAqIEBwYXJhbQlzdHJpbmcJCSRjb21wbGV4TnVtYmVyLC4uLglTZXJpZXMgb2YgY29tcGxleCBudW1iZXJzIHRvIG11bHRpcGx5CgkgKiBAcmV0dXJuCXN0cmluZwoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIElNUFJPRFVDVCgpIHsKCQkvLyBSZXR1cm4gdmFsdWUKCQkkcmV0dXJuVmFsdWUgPSBzZWxmOjpfcGFyc2VDb21wbGV4KCcxJyk7CgkJJGFjdGl2ZVN1ZmZpeCA9ICcnOwoKCQkvLyBMb29wIHRocm91Z2ggdGhlIGFyZ3VtZW50cwoJCSRhQXJncyA9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlbkFycmF5KGZ1bmNfZ2V0X2FyZ3MoKSk7CgkJZm9yZWFjaCAoJGFBcmdzIGFzICRhcmcpIHsKCQkJJHBhcnNlZENvbXBsZXggPSBzZWxmOjpfcGFyc2VDb21wbGV4KCRhcmcpOwoKCQkJJHdvcmtWYWx1ZSA9ICRyZXR1cm5WYWx1ZTsKCQkJaWYgKCgkcGFyc2VkQ29tcGxleFsnc3VmZml4J10gIT0gJycpICYmICgkYWN0aXZlU3VmZml4ID09ICcnKSkgewoJCQkJJGFjdGl2ZVN1ZmZpeCA9ICRwYXJzZWRDb21wbGV4WydzdWZmaXgnXTsKCQkJfSBlbHNlaWYgKCgkcGFyc2VkQ29tcGxleFsnc3VmZml4J10gIT0gJycpICYmICgkYWN0aXZlU3VmZml4ICE9ICRwYXJzZWRDb21wbGV4WydzdWZmaXgnXSkpIHsKCQkJCXJldHVybiBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6Ok5hTigpOwoJCQl9CgkJCSRyZXR1cm5WYWx1ZVsncmVhbCddID0gKCR3b3JrVmFsdWVbJ3JlYWwnXSAqICRwYXJzZWRDb21wbGV4WydyZWFsJ10pIC0gKCR3b3JrVmFsdWVbJ2ltYWdpbmFyeSddICogJHBhcnNlZENvbXBsZXhbJ2ltYWdpbmFyeSddKTsKCQkJJHJldHVyblZhbHVlWydpbWFnaW5hcnknXSA9ICgkd29ya1ZhbHVlWydyZWFsJ10gKiAkcGFyc2VkQ29tcGxleFsnaW1hZ2luYXJ5J10pICsgKCR3b3JrVmFsdWVbJ2ltYWdpbmFyeSddICogJHBhcnNlZENvbXBsZXhbJ3JlYWwnXSk7CgkJfQoKCQlpZiAoJHJldHVyblZhbHVlWydpbWFnaW5hcnknXSA9PSAwLjApIHsgJGFjdGl2ZVN1ZmZpeCA9ICcnOyB9CgkJcmV0dXJuIHNlbGY6OkNPTVBMRVgoJHJldHVyblZhbHVlWydyZWFsJ10sJHJldHVyblZhbHVlWydpbWFnaW5hcnknXSwkYWN0aXZlU3VmZml4KTsKCX0JLy8JZnVuY3Rpb24gSU1QUk9EVUNUKCkKCgoJLyoqCgkgKiBERUxUQQoJICoKCSAqIFRlc3RzIHdoZXRoZXIgdHdvIHZhbHVlcyBhcmUgZXF1YWwuIFJldHVybnMgMSBpZiBudW1iZXIxID0gbnVtYmVyMjsgcmV0dXJucyAwIG90aGVyd2lzZS4KCSAqIFVzZSB0aGlzIGZ1bmN0aW9uIHRvIGZpbHRlciBhIHNldCBvZiB2YWx1ZXMuIEZvciBleGFtcGxlLCBieSBzdW1taW5nIHNldmVyYWwgREVMVEEKCSAqIGZ1bmN0aW9ucyB5b3UgY2FsY3VsYXRlIHRoZSBjb3VudCBvZiBlcXVhbCBwYWlycy4gVGhpcyBmdW5jdGlvbiBpcyBhbHNvIGtub3duIGFzIHRoZQoJICogS3JvbmVja2VyIERlbHRhIGZ1bmN0aW9uLgoJICoKCSAqIEV4Y2VsIEZ1bmN0aW9uOgoJICoJCURFTFRBKGFbLGJdKQoJICoKCSAqIEBwYXJhbQlmbG9hdAkJJGEJVGhlIGZpcnN0IG51bWJlci4KCSAqIEBwYXJhbQlmbG9hdAkJJGIJVGhlIHNlY29uZCBudW1iZXIuIElmIG9taXR0ZWQsIGIgaXMgYXNzdW1lZCB0byBiZSB6ZXJvLgoJICogQHJldHVybglpbnQKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBERUxUQSgkYSwgJGI9MCkgewoJCSRhCT0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuU2luZ2xlVmFsdWUoJGEpOwoJCSRiCT0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuU2luZ2xlVmFsdWUoJGIpOwoKCQlyZXR1cm4gKGludCkgKCRhID09ICRiKTsKCX0JLy8JZnVuY3Rpb24gREVMVEEoKQoKCgkvKioKCSAqIEdFU1RFUAoJICoKCSAqIEV4Y2VsIEZ1bmN0aW9uOgoJICoJCUdFU1RFUChudW1iZXJbLHN0ZXBdKQoJICoKCSAqIFJldHVybnMgMSBpZiBudW1iZXIgPj0gc3RlcDsgcmV0dXJucyAwICh6ZXJvKSBvdGhlcndpc2UKCSAqIFVzZSB0aGlzIGZ1bmN0aW9uIHRvIGZpbHRlciBhIHNldCBvZiB2YWx1ZXMuIEZvciBleGFtcGxlLCBieSBzdW1taW5nIHNldmVyYWwgR0VTVEVQCgkgKiBmdW5jdGlvbnMgeW91IGNhbGN1bGF0ZSB0aGUgY291bnQgb2YgdmFsdWVzIHRoYXQgZXhjZWVkIGEgdGhyZXNob2xkLgoJICoKCSAqIEBwYXJhbQlmbG9hdAkJJG51bWJlcgkJVGhlIHZhbHVlIHRvIHRlc3QgYWdhaW5zdCBzdGVwLgoJICogQHBhcmFtCWZsb2F0CQkkc3RlcAkJVGhlIHRocmVzaG9sZCB2YWx1ZS4KCSAqCQkJCQkJCQkJSWYgeW91IG9taXQgYSB2YWx1ZSBmb3Igc3RlcCwgR0VTVEVQIHVzZXMgemVyby4KCSAqIEByZXR1cm4JaW50CgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gR0VTVEVQKCRudW1iZXIsICRzdGVwPTApIHsKCQkkbnVtYmVyCT0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuU2luZ2xlVmFsdWUoJG51bWJlcik7CgkJJHN0ZXAJPSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5TaW5nbGVWYWx1ZSgkc3RlcCk7CgoJCXJldHVybiAoaW50KSAoJG51bWJlciA+PSAkc3RlcCk7Cgl9CS8vCWZ1bmN0aW9uIEdFU1RFUCgpCgoKCS8vCgkvLwlQcml2YXRlIG1ldGhvZCB0byBjYWxjdWxhdGUgdGhlIGVyZiB2YWx1ZQoJLy8KCXByaXZhdGUgc3RhdGljICRfdHdvX3NxcnRwaSA9IDEuMTI4Mzc5MTY3MDk1NTEyNTc0OwoKCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gX2VyZlZhbCgkeCkgewoJCWlmIChhYnMoJHgpID4gMi4yKSB7CgkJCXJldHVybiAxIC0gc2VsZjo6X2VyZmNWYWwoJHgpOwoJCX0KCQkkc3VtID0gJHRlcm0gPSAkeDsKCQkkeHNxciA9ICgkeCAqICR4KTsKCQkkaiA9IDE7CgkJZG8gewoJCQkkdGVybSAqPSAkeHNxciAvICRqOwoJCQkkc3VtIC09ICR0ZXJtIC8gKDIgKiAkaiArIDEpOwoJCQkrKyRqOwoJCQkkdGVybSAqPSAkeHNxciAvICRqOwoJCQkkc3VtICs9ICR0ZXJtIC8gKDIgKiAkaiArIDEpOwoJCQkrKyRqOwoJCQlpZiAoJHN1bSA9PSAwLjApIHsKCQkJCWJyZWFrOwoJCQl9CgkJfSB3aGlsZSAoYWJzKCR0ZXJtIC8gJHN1bSkgPiBQUkVDSVNJT04pOwoJCXJldHVybiBzZWxmOjokX3R3b19zcXJ0cGkgKiAkc3VtOwoJfQkvLwlmdW5jdGlvbiBfZXJmVmFsKCkKCgoJLyoqCgkgKiBFUkYKCSAqCgkgKiBSZXR1cm5zIHRoZSBlcnJvciBmdW5jdGlvbiBpbnRlZ3JhdGVkIGJldHdlZW4gbG93ZXJfbGltaXQgYW5kIHVwcGVyX2xpbWl0CgkgKgoJICogRXhjZWwgRnVuY3Rpb246CgkgKgkJRVJGKGxvd2VyWyx1cHBlcl0pCgkgKgoJICogQHBhcmFtCWZsb2F0CQkkbG93ZXIJbG93ZXIgYm91bmQgZm9yIGludGVncmF0aW5nIEVSRgoJICogQHBhcmFtCWZsb2F0CQkkdXBwZXIJdXBwZXIgYm91bmQgZm9yIGludGVncmF0aW5nIEVSRi4KCSAqCQkJCQkJCQlJZiBvbWl0dGVkLCBFUkYgaW50ZWdyYXRlcyBiZXR3ZWVuIHplcm8gYW5kIGxvd2VyX2xpbWl0CgkgKiBAcmV0dXJuCWludAoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIEVSRigkbG93ZXIsICR1cHBlciA9IG51bGwpIHsKCQkkbG93ZXIJPSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5TaW5nbGVWYWx1ZSgkbG93ZXIpOwoJCSR1cHBlcgk9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlblNpbmdsZVZhbHVlKCR1cHBlcik7CgoJCWlmIChpc19udW1lcmljKCRsb3dlcikpIHsKCQkJaWYgKCRsb3dlciA8IDApIHsKCQkJCXJldHVybiBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6Ok5hTigpOwoJCQl9CgkJCWlmIChpc19udWxsKCR1cHBlcikpIHsKCQkJCXJldHVybiBzZWxmOjpfZXJmVmFsKCRsb3dlcik7CgkJCX0KCQkJaWYgKGlzX251bWVyaWMoJHVwcGVyKSkgewoJCQkJaWYgKCR1cHBlciA8IDApIHsKCQkJCQlyZXR1cm4gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpOYU4oKTsKCQkJCX0KCQkJCXJldHVybiBzZWxmOjpfZXJmVmFsKCR1cHBlcikgLSBzZWxmOjpfZXJmVmFsKCRsb3dlcik7CgkJCX0KCQl9CgkJcmV0dXJuIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6VkFMVUUoKTsKCX0JLy8JZnVuY3Rpb24gRVJGKCkKCgoJLy8KCS8vCVByaXZhdGUgbWV0aG9kIHRvIGNhbGN1bGF0ZSB0aGUgZXJmYyB2YWx1ZQoJLy8KCXByaXZhdGUgc3RhdGljICRfb25lX3NxcnRwaSA9IDAuNTY0MTg5NTgzNTQ3NzU2Mjg3OwoKCXByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIF9lcmZjVmFsKCR4KSB7CgkJaWYgKGFicygkeCkgPCAyLjIpIHsKCQkJcmV0dXJuIDEgLSBzZWxmOjpfZXJmVmFsKCR4KTsKCQl9CgkJaWYgKCR4IDwgMCkgewoJCQlyZXR1cm4gMiAtIHNlbGY6OkVSRkMoLSR4KTsKCQl9CgkJJGEgPSAkbiA9IDE7CgkJJGIgPSAkYyA9ICR4OwoJCSRkID0gKCR4ICogJHgpICsgMC41OwoJCSRxMSA9ICRxMiA9ICRiIC8gJGQ7CgkJJHQgPSAwOwoJCWRvIHsKCQkJJHQgPSAkYSAqICRuICsgJGIgKiAkeDsKCQkJJGEgPSAkYjsKCQkJJGIgPSAkdDsKCQkJJHQgPSAkYyAqICRuICsgJGQgKiAkeDsKCQkJJGMgPSAkZDsKCQkJJGQgPSAkdDsKCQkJJG4gKz0gMC41OwoJCQkkcTEgPSAkcTI7CgkJCSRxMiA9ICRiIC8gJGQ7CgkJfSB3aGlsZSAoKGFicygkcTEgLSAkcTIpIC8gJHEyKSA+IFBSRUNJU0lPTik7CgkJcmV0dXJuIHNlbGY6OiRfb25lX3NxcnRwaSAqIGV4cCgtJHggKiAkeCkgKiAkcTI7Cgl9CS8vCWZ1bmN0aW9uIF9lcmZjVmFsKCkKCgoJLyoqCgkgKiBFUkZDCgkgKgoJICogUmV0dXJucyB0aGUgY29tcGxlbWVudGFyeSBFUkYgZnVuY3Rpb24gaW50ZWdyYXRlZCBiZXR3ZWVuIHggYW5kIGluZmluaXR5CgkgKgoJICogRXhjZWwgRnVuY3Rpb246CgkgKgkJRVJGKHgpCgkgKgoJICogQHBhcmFtCWZsb2F0CQkkeAkJVGhlIGxvd2VyIGJvdW5kIGZvciBpbnRlZ3JhdGluZyBFUkYKCSAqIEByZXR1cm4JaW50CgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gRVJGQygkeCkgewoJCSR4CT0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuU2luZ2xlVmFsdWUoJHgpOwoKCQlpZiAoaXNfbnVtZXJpYygkeCkpIHsKCQkJaWYgKCR4IDwgMCkgewoJCQkJcmV0dXJuIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6TmFOKCk7CgkJCX0KCQkJcmV0dXJuIHNlbGY6Ol9lcmZjVmFsKCR4KTsKCQl9CgkJcmV0dXJuIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6VkFMVUUoKTsKCX0JLy8JZnVuY3Rpb24gRVJGQygpCgoKCS8qKgoJICogZ2V0Q29udmVyc2lvbkdyb3VwcwoJICoKCSAqIEByZXR1cm4JYXJyYXkKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRDb252ZXJzaW9uR3JvdXBzKCkgewoJCSRjb252ZXJzaW9uR3JvdXBzID0gYXJyYXkoKTsKCQlmb3JlYWNoKHNlbGY6OiRfY29udmVyc2lvblVuaXRzIGFzICRjb252ZXJzaW9uVW5pdCkgewoJCQkkY29udmVyc2lvbkdyb3Vwc1tdID0gJGNvbnZlcnNpb25Vbml0WydHcm91cCddOwoJCX0KCQlyZXR1cm4gYXJyYXlfbWVyZ2UoYXJyYXlfdW5pcXVlKCRjb252ZXJzaW9uR3JvdXBzKSk7Cgl9CS8vCWZ1bmN0aW9uIGdldENvbnZlcnNpb25Hcm91cHMoKQoKCgkvKioKCSAqIGdldENvbnZlcnNpb25Hcm91cFVuaXRzCgkgKgoJICogQHJldHVybglhcnJheQoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldENvbnZlcnNpb25Hcm91cFVuaXRzKCRncm91cCA9IE5VTEwpIHsKCQkkY29udmVyc2lvbkdyb3VwcyA9IGFycmF5KCk7CgkJZm9yZWFjaChzZWxmOjokX2NvbnZlcnNpb25Vbml0cyBhcyAkY29udmVyc2lvblVuaXQgPT4gJGNvbnZlcnNpb25Hcm91cCkgewoJCQlpZiAoKGlzX251bGwoJGdyb3VwKSkgfHwgKCRjb252ZXJzaW9uR3JvdXBbJ0dyb3VwJ10gPT0gJGdyb3VwKSkgewoJCQkJJGNvbnZlcnNpb25Hcm91cHNbJGNvbnZlcnNpb25Hcm91cFsnR3JvdXAnXV1bXSA9ICRjb252ZXJzaW9uVW5pdDsKCQkJfQoJCX0KCQlyZXR1cm4gJGNvbnZlcnNpb25Hcm91cHM7Cgl9CS8vCWZ1bmN0aW9uIGdldENvbnZlcnNpb25Hcm91cFVuaXRzKCkKCgoJLyoqCgkgKiBnZXRDb252ZXJzaW9uR3JvdXBVbml0RGV0YWlscwoJICoKCSAqIEByZXR1cm4JYXJyYXkKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRDb252ZXJzaW9uR3JvdXBVbml0RGV0YWlscygkZ3JvdXAgPSBOVUxMKSB7CgkJJGNvbnZlcnNpb25Hcm91cHMgPSBhcnJheSgpOwoJCWZvcmVhY2goc2VsZjo6JF9jb252ZXJzaW9uVW5pdHMgYXMgJGNvbnZlcnNpb25Vbml0ID0+ICRjb252ZXJzaW9uR3JvdXApIHsKCQkJaWYgKChpc19udWxsKCRncm91cCkpIHx8ICgkY29udmVyc2lvbkdyb3VwWydHcm91cCddID09ICRncm91cCkpIHsKCQkJCSRjb252ZXJzaW9uR3JvdXBzWyRjb252ZXJzaW9uR3JvdXBbJ0dyb3VwJ11dW10gPSBhcnJheSgJJ3VuaXQnCQkJPT4gJGNvbnZlcnNpb25Vbml0LAoJCQkJCQkJCQkJCQkJCQkJCQknZGVzY3JpcHRpb24nCT0+ICRjb252ZXJzaW9uR3JvdXBbJ1VuaXQgTmFtZSddCgkJCQkJCQkJCQkJCQkJCQkJICApOwoJCQl9CgkJfQoJCXJldHVybiAkY29udmVyc2lvbkdyb3VwczsKCX0JLy8JZnVuY3Rpb24gZ2V0Q29udmVyc2lvbkdyb3VwVW5pdERldGFpbHMoKQoKCgkvKioKCSAqIGdldENvbnZlcnNpb25Hcm91cHMKCSAqCgkgKiBAcmV0dXJuCWFycmF5CgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0Q29udmVyc2lvbk11bHRpcGxpZXJzKCkgewoJCXJldHVybiBzZWxmOjokX2NvbnZlcnNpb25NdWx0aXBsaWVyczsKCX0JLy8JZnVuY3Rpb24gZ2V0Q29udmVyc2lvbkdyb3VwcygpCgoKCS8qKgoJICogQ09OVkVSVFVPTQoJICoKCSAqIENvbnZlcnRzIGEgbnVtYmVyIGZyb20gb25lIG1lYXN1cmVtZW50IHN5c3RlbSB0byBhbm90aGVyLgoJICogRm9yIGV4YW1wbGUsIENPTlZFUlQgY2FuIHRyYW5zbGF0ZSBhIHRhYmxlIG9mIGRpc3RhbmNlcyBpbiBtaWxlcyB0byBhIHRhYmxlIG9mIGRpc3RhbmNlcwoJICogaW4ga2lsb21ldGVycy4KCSAqCgkgKiBFeGNlbCBGdW5jdGlvbjoKCSAqCQlDT05WRVJUKHZhbHVlLGZyb21VT00sdG9VT00pCgkgKgoJICogQHBhcmFtCWZsb2F0CQkkdmFsdWUJCVRoZSB2YWx1ZSBpbiBmcm9tVU9NIHRvIGNvbnZlcnQuCgkgKiBAcGFyYW0Jc3RyaW5nCQkkZnJvbVVPTQlUaGUgdW5pdHMgZm9yIHZhbHVlLgoJICogQHBhcmFtCXN0cmluZwkJJHRvVU9NCQlUaGUgdW5pdHMgZm9yIHRoZSByZXN1bHQuCgkgKiBAcmV0dXJuCWZsb2F0CgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gQ09OVkVSVFVPTSgkdmFsdWUsICRmcm9tVU9NLCAkdG9VT00pIHsKCQkkdmFsdWUJCT0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuU2luZ2xlVmFsdWUoJHZhbHVlKTsKCQkkZnJvbVVPTQk9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlblNpbmdsZVZhbHVlKCRmcm9tVU9NKTsKCQkkdG9VT00JCT0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuU2luZ2xlVmFsdWUoJHRvVU9NKTsKCgkJaWYgKCFpc19udW1lcmljKCR2YWx1ZSkpIHsKCQkJcmV0dXJuIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6VkFMVUUoKTsKCQl9CgkJJGZyb21NdWx0aXBsaWVyID0gMS4wOwoJCWlmIChpc3NldChzZWxmOjokX2NvbnZlcnNpb25Vbml0c1skZnJvbVVPTV0pKSB7CgkJCSR1bml0R3JvdXAxID0gc2VsZjo6JF9jb252ZXJzaW9uVW5pdHNbJGZyb21VT01dWydHcm91cCddOwoJCX0gZWxzZSB7CgkJCSRmcm9tTXVsdGlwbGllciA9IHN1YnN0cigkZnJvbVVPTSwwLDEpOwoJCQkkZnJvbVVPTSA9IHN1YnN0cigkZnJvbVVPTSwxKTsKCQkJaWYgKGlzc2V0KHNlbGY6OiRfY29udmVyc2lvbk11bHRpcGxpZXJzWyRmcm9tTXVsdGlwbGllcl0pKSB7CgkJCQkkZnJvbU11bHRpcGxpZXIgPSBzZWxmOjokX2NvbnZlcnNpb25NdWx0aXBsaWVyc1skZnJvbU11bHRpcGxpZXJdWydtdWx0aXBsaWVyJ107CgkJCX0gZWxzZSB7CgkJCQlyZXR1cm4gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpOQSgpOwoJCQl9CgkJCWlmICgoaXNzZXQoc2VsZjo6JF9jb252ZXJzaW9uVW5pdHNbJGZyb21VT01dKSkgJiYgKHNlbGY6OiRfY29udmVyc2lvblVuaXRzWyRmcm9tVU9NXVsnQWxsb3dQcmVmaXgnXSkpIHsKCQkJCSR1bml0R3JvdXAxID0gc2VsZjo6JF9jb252ZXJzaW9uVW5pdHNbJGZyb21VT01dWydHcm91cCddOwoJCQl9IGVsc2UgewoJCQkJcmV0dXJuIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6TkEoKTsKCQkJfQoJCX0KCQkkdmFsdWUgKj0gJGZyb21NdWx0aXBsaWVyOwoKCQkkdG9NdWx0aXBsaWVyID0gMS4wOwoJCWlmIChpc3NldChzZWxmOjokX2NvbnZlcnNpb25Vbml0c1skdG9VT01dKSkgewoJCQkkdW5pdEdyb3VwMiA9IHNlbGY6OiRfY29udmVyc2lvblVuaXRzWyR0b1VPTV1bJ0dyb3VwJ107CgkJfSBlbHNlIHsKCQkJJHRvTXVsdGlwbGllciA9IHN1YnN0cigkdG9VT00sMCwxKTsKCQkJJHRvVU9NID0gc3Vic3RyKCR0b1VPTSwxKTsKCQkJaWYgKGlzc2V0KHNlbGY6OiRfY29udmVyc2lvbk11bHRpcGxpZXJzWyR0b011bHRpcGxpZXJdKSkgewoJCQkJJHRvTXVsdGlwbGllciA9IHNlbGY6OiRfY29udmVyc2lvbk11bHRpcGxpZXJzWyR0b011bHRpcGxpZXJdWydtdWx0aXBsaWVyJ107CgkJCX0gZWxzZSB7CgkJCQlyZXR1cm4gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpOQSgpOwoJCQl9CgkJCWlmICgoaXNzZXQoc2VsZjo6JF9jb252ZXJzaW9uVW5pdHNbJHRvVU9NXSkpICYmIChzZWxmOjokX2NvbnZlcnNpb25Vbml0c1skdG9VT01dWydBbGxvd1ByZWZpeCddKSkgewoJCQkJJHVuaXRHcm91cDIgPSBzZWxmOjokX2NvbnZlcnNpb25Vbml0c1skdG9VT01dWydHcm91cCddOwoJCQl9IGVsc2UgewoJCQkJcmV0dXJuIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6TkEoKTsKCQkJfQoJCX0KCQlpZiAoJHVuaXRHcm91cDEgIT0gJHVuaXRHcm91cDIpIHsKCQkJcmV0dXJuIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6TkEoKTsKCQl9CgoJCWlmICgoJGZyb21VT00gPT0gJHRvVU9NKSAmJiAoJGZyb21NdWx0aXBsaWVyID09ICR0b011bHRpcGxpZXIpKSB7CgkJCS8vCVdlJ3ZlIGFscmVhZHkgZmFjdG9yZWQgJGZyb21NdWx0aXBsaWVyIGludG8gdGhlIHZhbHVlLCBzbyB3ZSBuZWVkCgkJCS8vCQl0byByZXZlcnNlIGl0IGFnYWluCgkJCXJldHVybiAkdmFsdWUgLyAkZnJvbU11bHRpcGxpZXI7CgkJfSBlbHNlaWYgKCR1bml0R3JvdXAxID09ICdUZW1wZXJhdHVyZScpIHsKCQkJaWYgKCgkZnJvbVVPTSA9PSAnRicpIHx8ICgkZnJvbVVPTSA9PSAnZmFoJykpIHsKCQkJCWlmICgoJHRvVU9NID09ICdGJykgfHwgKCR0b1VPTSA9PSAnZmFoJykpIHsKCQkJCQlyZXR1cm4gJHZhbHVlOwoJCQkJfSBlbHNlIHsKCQkJCQkkdmFsdWUgPSAoKCR2YWx1ZSAtIDMyKSAvIDEuOCk7CgkJCQkJaWYgKCgkdG9VT00gPT0gJ0snKSB8fCAoJHRvVU9NID09ICdrZWwnKSkgewoJCQkJCQkkdmFsdWUgKz0gMjczLjE1OwoJCQkJCX0KCQkJCQlyZXR1cm4gJHZhbHVlOwoJCQkJfQoJCQl9IGVsc2VpZiAoKCgkZnJvbVVPTSA9PSAnSycpIHx8ICgkZnJvbVVPTSA9PSAna2VsJykpICYmCgkJCQkJICAoKCR0b1VPTSA9PSAnSycpIHx8ICgkdG9VT00gPT0gJ2tlbCcpKSkgewoJCQkJCQlyZXR1cm4gJHZhbHVlOwoJCQl9IGVsc2VpZiAoKCgkZnJvbVVPTSA9PSAnQycpIHx8ICgkZnJvbVVPTSA9PSAnY2VsJykpICYmCgkJCQkJICAoKCR0b1VPTSA9PSAnQycpIHx8ICgkdG9VT00gPT0gJ2NlbCcpKSkgewoJCQkJCXJldHVybiAkdmFsdWU7CgkJCX0KCQkJaWYgKCgkdG9VT00gPT0gJ0YnKSB8fCAoJHRvVU9NID09ICdmYWgnKSkgewoJCQkJaWYgKCgkZnJvbVVPTSA9PSAnSycpIHx8ICgkZnJvbVVPTSA9PSAna2VsJykpIHsKCQkJCQkkdmFsdWUgLT0gMjczLjE1OwoJCQkJfQoJCQkJcmV0dXJuICgkdmFsdWUgKiAxLjgpICsgMzI7CgkJCX0KCQkJaWYgKCgkdG9VT00gPT0gJ0MnKSB8fCAoJHRvVU9NID09ICdjZWwnKSkgewoJCQkJcmV0dXJuICR2YWx1ZSAtIDI3My4xNTsKCQkJfQoJCQlyZXR1cm4gJHZhbHVlICsgMjczLjE1OwoJCX0KCQlyZXR1cm4gKCR2YWx1ZSAqIHNlbGY6OiRfdW5pdENvbnZlcnNpb25zWyR1bml0R3JvdXAxXVskZnJvbVVPTV1bJHRvVU9NXSkgLyAkdG9NdWx0aXBsaWVyOwoJfQkvLwlmdW5jdGlvbiBDT05WRVJUVU9NKCkKCn0JLy8JY2xhc3MgUEhQRXhjZWxfQ2FsY3VsYXRpb25fRW5naW5lZXJpbmcK]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Calculation/Exception.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIFBIUEV4Y2VsCiAqCiAqIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICoKICogQGNhdGVnb3J5ICAgUEhQRXhjZWwKICogQHBhY2thZ2UgICAgUEhQRXhjZWxfQ2FsY3VsYXRpb24KICogQGNvcHlyaWdodCAgQ29weXJpZ2h0IChjKSAyMDA2IC0gMjAxMiBQSFBFeGNlbCAoaHR0cDovL3d3dy5jb2RlcGxleC5jb20vUEhQRXhjZWwpCiAqIEBsaWNlbnNlCWh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9vbGQtbGljZW5zZXMvbGdwbC0yLjEudHh0CUxHUEwKICogQHZlcnNpb24JMS43LjcsIDIwMTItMDUtMTkKICovCgoKLyoqCiAqIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0V4Y2VwdGlvbgogKgogKiBAY2F0ZWdvcnkgICBQSFBFeGNlbAogKiBAcGFja2FnZSAgICBQSFBFeGNlbF9DYWxjdWxhdGlvbgogKiBAY29weXJpZ2h0ICBDb3B5cmlnaHQgKGMpIDIwMDYgLSAyMDEyIFBIUEV4Y2VsIChodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9QSFBFeGNlbCkKICovCmNsYXNzIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0V4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiB7CgkvKioKCSAqIEVycm9yIGhhbmRsZXIgY2FsbGJhY2sKCSAqCgkgKiBAcGFyYW0gbWl4ZWQgJGNvZGUKCSAqIEBwYXJhbSBtaXhlZCAkc3RyaW5nCgkgKiBAcGFyYW0gbWl4ZWQgJGZpbGUKCSAqIEBwYXJhbSBtaXhlZCAkbGluZQoJICogQHBhcmFtIG1peGVkICRjb250ZXh0CgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZXJyb3JIYW5kbGVyQ2FsbGJhY2soJGNvZGUsICRzdHJpbmcsICRmaWxlLCAkbGluZSwgJGNvbnRleHQpIHsKCQkkZSA9IG5ldyBzZWxmKCRzdHJpbmcsICRjb2RlKTsKCQkkZS0+bGluZSA9ICRsaW5lOwoJCSRlLT5maWxlID0gJGZpbGU7CgkJdGhyb3cgJGU7Cgl9Cn0K]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Calculation/ExceptionHandler.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIFBIUEV4Y2VsCiAqCiAqIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICoKICogQGNhdGVnb3J5ICAgUEhQRXhjZWwKICogQHBhY2thZ2UgICAgUEhQRXhjZWxfQ2FsY3VsYXRpb24KICogQGNvcHlyaWdodCAgQ29weXJpZ2h0IChjKSAyMDA2IC0gMjAxMiBQSFBFeGNlbCAoaHR0cDovL3d3dy5jb2RlcGxleC5jb20vUEhQRXhjZWwpCiAqIEBsaWNlbnNlCWh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9vbGQtbGljZW5zZXMvbGdwbC0yLjEudHh0CUxHUEwKICogQHZlcnNpb24JMS43LjcsIDIwMTItMDUtMTkKICovCgovKioKICogUEhQRXhjZWxfQ2FsY3VsYXRpb25fRXhjZXB0aW9uSGFuZGxlcgogKgogKiBAY2F0ZWdvcnkgICBQSFBFeGNlbAogKiBAcGFja2FnZSAgICBQSFBFeGNlbF9DYWxjdWxhdGlvbgogKiBAY29weXJpZ2h0ICBDb3B5cmlnaHQgKGMpIDIwMDYgLSAyMDEyIFBIUEV4Y2VsIChodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9QSFBFeGNlbCkKICovCmNsYXNzIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0V4Y2VwdGlvbkhhbmRsZXIgewoJLyoqCgkgKiBSZWdpc3RlciBlcnJvcmhhbmRsZXIKCSAqLwoJcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCkgewoJCXNldF9lcnJvcl9oYW5kbGVyKGFycmF5KCdQSFBFeGNlbF9DYWxjdWxhdGlvbl9FeGNlcHRpb24nLCAnZXJyb3JIYW5kbGVyQ2FsbGJhY2snKSwgRV9BTEwpOwoJfQoKCS8qKgoJICogVW5yZWdpc3RlciBlcnJvcmhhbmRsZXIKCSAqLwoJcHVibGljIGZ1bmN0aW9uIF9fZGVzdHJ1Y3QoKSB7CgkJcmVzdG9yZV9lcnJvcl9oYW5kbGVyKCk7Cgl9Cn0K]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Calculation/Financial.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIFBIUEV4Y2VsCiAqCiAqIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKICoKICogQGNhdGVnb3J5CVBIUEV4Y2VsCiAqIEBwYWNrYWdlCQlQSFBFeGNlbF9DYWxjdWxhdGlvbgogKiBAY29weXJpZ2h0CUNvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwgKGh0dHA6Ly93d3cuY29kZXBsZXguY29tL1BIUEV4Y2VsKQogKiBAbGljZW5zZQkJaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL29sZC1saWNlbnNlcy9sZ3BsLTIuMS50eHQJTEdQTAogKiBAdmVyc2lvbgkJMS43LjcsIDIwMTItMDUtMTkKICovCgoKLyoqIFBIUEV4Y2VsIHJvb3QgZGlyZWN0b3J5ICovCmlmICghZGVmaW5lZCgnUEhQRVhDRUxfUk9PVCcpKSB7CgkvKioKCSAqIEBpZ25vcmUKCSAqLwoJZGVmaW5lKCdQSFBFWENFTF9ST09UJywgZGlybmFtZShfX0ZJTEVfXykgLiAnLy4uLy4uLycpOwoJcmVxdWlyZShQSFBFWENFTF9ST09UIC4gJ1BIUEV4Y2VsL0F1dG9sb2FkZXIucGhwJyk7Cn0KCgovKiogRklOQU5DSUFMX01BWF9JVEVSQVRJT05TICovCmRlZmluZSgnRklOQU5DSUFMX01BWF9JVEVSQVRJT05TJywgMTI4KTsKCi8qKiBGSU5BTkNJQUxfUFJFQ0lTSU9OICovCmRlZmluZSgnRklOQU5DSUFMX1BSRUNJU0lPTicsIDEuMGUtMDgpOwoKCi8qKgogKiBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GaW5hbmNpYWwKICoKICogQGNhdGVnb3J5CVBIUEV4Y2VsCiAqIEBwYWNrYWdlCQlQSFBFeGNlbF9DYWxjdWxhdGlvbgogKiBAY29weXJpZ2h0CUNvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwgKGh0dHA6Ly93d3cuY29kZXBsZXguY29tL1BIUEV4Y2VsKQogKi8KY2xhc3MgUEhQRXhjZWxfQ2FsY3VsYXRpb25fRmluYW5jaWFsIHsKCgkvKioKCSAqIF9sYXN0RGF5T2ZNb250aAoJICoKCSAqIFJldHVybnMgYSBib29sZWFuIFRSVUUvRkFMU0UgaW5kaWNhdGluZyBpZiB0aGlzIGRhdGUgaXMgdGhlIGxhc3QgZGF0ZSBvZiB0aGUgbW9udGgKCSAqCgkgKiBAcGFyYW0JRGF0ZVRpbWUJJHRlc3REYXRlCVRoZSBkYXRlIGZvciB0ZXN0aW5nCgkgKiBAcmV0dXJuCWJvb2xlYW4KCSAqLwoJcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gX2xhc3REYXlPZk1vbnRoKCR0ZXN0RGF0ZSkKCXsKCQlyZXR1cm4gKCR0ZXN0RGF0ZS0+Zm9ybWF0KCdkJykgPT0gJHRlc3REYXRlLT5mb3JtYXQoJ3QnKSk7Cgl9CS8vCWZ1bmN0aW9uIF9sYXN0RGF5T2ZNb250aCgpCgoKCS8qKgoJICogX2ZpcnN0RGF5T2ZNb250aAoJICoKCSAqIFJldHVybnMgYSBib29sZWFuIFRSVUUvRkFMU0UgaW5kaWNhdGluZyBpZiB0aGlzIGRhdGUgaXMgdGhlIGZpcnN0IGRhdGUgb2YgdGhlIG1vbnRoCgkgKgoJICogQHBhcmFtCURhdGVUaW1lCSR0ZXN0RGF0ZQlUaGUgZGF0ZSBmb3IgdGVzdGluZwoJICogQHJldHVybglib29sZWFuCgkgKi8KCXByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIF9maXJzdERheU9mTW9udGgoJHRlc3REYXRlKQoJewoJCXJldHVybiAoJHRlc3REYXRlLT5mb3JtYXQoJ2QnKSA9PSAxKTsKCX0JLy8JZnVuY3Rpb24gX2ZpcnN0RGF5T2ZNb250aCgpCgoKCXByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIF9jb3VwRmlyc3RQZXJpb2REYXRlKCRzZXR0bGVtZW50LCAkbWF0dXJpdHksICRmcmVxdWVuY3ksICRuZXh0KQoJewoJCSRtb250aHMgPSAxMiAvICRmcmVxdWVuY3k7CgoJCSRyZXN1bHQgPSBQSFBFeGNlbF9TaGFyZWRfRGF0ZTo6RXhjZWxUb1BIUE9iamVjdCgkbWF0dXJpdHkpOwoJCSRlb20gPSBzZWxmOjpfbGFzdERheU9mTW9udGgoJHJlc3VsdCk7CgoJCXdoaWxlICgkc2V0dGxlbWVudCA8IFBIUEV4Y2VsX1NoYXJlZF9EYXRlOjpQSFBUb0V4Y2VsKCRyZXN1bHQpKSB7CgkJCSRyZXN1bHQtPm1vZGlmeSgnLScuJG1vbnRocy4nIG1vbnRocycpOwoJCX0KCQlpZiAoJG5leHQpIHsKCQkJJHJlc3VsdC0+bW9kaWZ5KCcrJy4kbW9udGhzLicgbW9udGhzJyk7CgkJfQoKCQlpZiAoJGVvbSkgewoJCQkkcmVzdWx0LT5tb2RpZnkoJy0xIGRheScpOwoJCX0KCgkJcmV0dXJuIFBIUEV4Y2VsX1NoYXJlZF9EYXRlOjpQSFBUb0V4Y2VsKCRyZXN1bHQpOwoJfQkvLwlmdW5jdGlvbiBfY291cEZpcnN0UGVyaW9kRGF0ZSgpCgoKCXByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIF92YWxpZEZyZXF1ZW5jeSgkZnJlcXVlbmN5KQoJewoJCWlmICgoJGZyZXF1ZW5jeSA9PSAxKSB8fCAoJGZyZXF1ZW5jeSA9PSAyKSB8fCAoJGZyZXF1ZW5jeSA9PSA0KSkgewoJCQlyZXR1cm4gdHJ1ZTsKCQl9CgkJaWYgKChQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmdldENvbXBhdGliaWxpdHlNb2RlKCkgPT0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpDT01QQVRJQklMSVRZX0dOVU1FUklDKSAmJgoJCQkoKCRmcmVxdWVuY3kgPT0gNikgfHwgKCRmcmVxdWVuY3kgPT0gMTIpKSkgewoJCQlyZXR1cm4gdHJ1ZTsKCQl9CgkJcmV0dXJuIGZhbHNlOwoJfQkvLwlmdW5jdGlvbiBfdmFsaWRGcmVxdWVuY3koKQoKCgkvKioKCSAqIF9kYXlzUGVyWWVhcgoJICoKCSAqIFJldHVybnMgdGhlIG51bWJlciBvZiBkYXlzIGluIGEgc3BlY2lmaWVkIHllYXIsIGFzIGRlZmluZWQgYnkgdGhlICJiYXNpcyIgdmFsdWUKCSAqCgkgKiBAcGFyYW0JaW50ZWdlcgkJJHllYXIJVGhlIHllYXIgYWdhaW5zdCB3aGljaCB3ZSdyZSB0ZXN0aW5nCgkgKiBAcGFyYW0gICBpbnRlZ2VyCQkkYmFzaXMJVGhlIHR5cGUgb2YgZGF5IGNvdW50OgoJICoJCQkJCQkJCQkwIG9yIG9taXR0ZWQgVVMgKE5BU0QpCTM2MAoJICoJCQkJCQkJCQkxCQkJCQkJQWN0dWFsICgzNjUgb3IgMzY2IGluIGEgbGVhcCB5ZWFyKQoJICoJCQkJCQkJCQkyCQkJCQkJMzYwCgkgKgkJCQkJCQkJCTMJCQkJCQkzNjUKCSAqCQkJCQkJCQkJNAkJCQkJCUV1cm9wZWFuIDM2MAoJICogQHJldHVybglpbnRlZ2VyCgkgKi8KCXByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIF9kYXlzUGVyWWVhcigkeWVhciwgJGJhc2lzPTApCgl7CgkJc3dpdGNoICgkYmFzaXMpIHsKCQkJY2FzZSAwIDoKCQkJY2FzZSAyIDoKCQkJY2FzZSA0IDoKCQkJCSRkYXlzUGVyWWVhciA9IDM2MDsKCQkJCWJyZWFrOwoJCQljYXNlIDMgOgoJCQkJJGRheXNQZXJZZWFyID0gMzY1OwoJCQkJYnJlYWs7CgkJCWNhc2UgMSA6CgkJCQkkZGF5c1BlclllYXIgPSAoUEhQRXhjZWxfQ2FsY3VsYXRpb25fRGF0ZVRpbWU6Ol9pc0xlYXBZZWFyKCR5ZWFyKSkgPyAzNjYgOiAzNjU7CgkJCQlicmVhazsKCQkJZGVmYXVsdAk6CgkJCQlyZXR1cm4gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpOYU4oKTsKCQl9CgkJcmV0dXJuICRkYXlzUGVyWWVhcjsKCX0JLy8JZnVuY3Rpb24gX2RheXNQZXJZZWFyKCkKCgoJcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gX2ludGVyZXN0QW5kUHJpbmNpcGFsKCRyYXRlPTAsICRwZXI9MCwgJG5wZXI9MCwgJHB2PTAsICRmdj0wLCAkdHlwZT0wKQoJewoJCSRwbXQgPSBzZWxmOjpQTVQoJHJhdGUsICRucGVyLCAkcHYsICRmdiwgJHR5cGUpOwoJCSRjYXBpdGFsID0gJHB2OwoJCWZvciAoJGkgPSAxOyAkaTw9ICRwZXI7ICsrJGkpIHsKCQkJJGludGVyZXN0ID0gKCR0eXBlICYmICRpID09IDEpID8gMCA6IC0kY2FwaXRhbCAqICRyYXRlOwoJCQkkcHJpbmNpcGFsID0gJHBtdCAtICRpbnRlcmVzdDsKCQkJJGNhcGl0YWwgKz0gJHByaW5jaXBhbDsKCQl9CgkJcmV0dXJuIGFycmF5KCRpbnRlcmVzdCwgJHByaW5jaXBhbCk7Cgl9CS8vCWZ1bmN0aW9uIF9pbnRlcmVzdEFuZFByaW5jaXBhbCgpCgoKCS8qKgoJICogQUNDUklOVAoJICoKCSAqIFJldHVybnMgdGhlIGFjY3J1ZWQgaW50ZXJlc3QgZm9yIGEgc2VjdXJpdHkgdGhhdCBwYXlzIHBlcmlvZGljIGludGVyZXN0LgoJICoKCSAqIEV4Y2VsIEZ1bmN0aW9uOgoJICoJCUFDQ1JJTlQoaXNzdWUsZmlyc3RpbnRlcmVzdCxzZXR0bGVtZW50LHJhdGUscGFyLGZyZXF1ZW5jeVssYmFzaXNdKQoJICoKCSAqIEBhY2Nlc3MJcHVibGljCgkgKiBAY2F0ZWdvcnkgRmluYW5jaWFsIEZ1bmN0aW9ucwoJICogQHBhcmFtCW1peGVkCSRpc3N1ZQkJCVRoZSBzZWN1cml0eSdzIGlzc3VlIGRhdGUuCgkgKiBAcGFyYW0JbWl4ZWQJJGZpcnN0aW50ZXJlc3QJVGhlIHNlY3VyaXR5J3MgZmlyc3QgaW50ZXJlc3QgZGF0ZS4KCSAqIEBwYXJhbQltaXhlZAkkc2V0dGxlbWVudAkJVGhlIHNlY3VyaXR5J3Mgc2V0dGxlbWVudCBkYXRlLgoJICoJCQkJCQkJCQlUaGUgc2VjdXJpdHkgc2V0dGxlbWVudCBkYXRlIGlzIHRoZSBkYXRlIGFmdGVyIHRoZSBpc3N1ZSBkYXRlCgkgKgkJCQkJCQkJCXdoZW4gdGhlIHNlY3VyaXR5IGlzIHRyYWRlZCB0byB0aGUgYnV5ZXIuCgkgKiBAcGFyYW0JZmxvYXQJJHJhdGUJCQlUaGUgc2VjdXJpdHkncyBhbm51YWwgY291cG9uIHJhdGUuCgkgKiBAcGFyYW0JZmxvYXQJJHBhcgkJCVRoZSBzZWN1cml0eSdzIHBhciB2YWx1ZS4KCSAqCQkJCQkJCQkJSWYgeW91IG9taXQgcGFyLCBBQ0NSSU5UIHVzZXMgJDEsMDAwLgoJICogQHBhcmFtCWludGVnZXIJJGZyZXF1ZW5jeQkJdGhlIG51bWJlciBvZiBjb3Vwb24gcGF5bWVudHMgcGVyIHllYXIuCgkgKgkJCQkJCQkJCVZhbGlkIGZyZXF1ZW5jeSB2YWx1ZXMgYXJlOgoJICoJCQkJCQkJCQkJMQlBbm51YWwKCSAqCQkJCQkJCQkJCTIJU2VtaS1Bbm51YWwKCSAqCQkJCQkJCQkJCTQJUXVhcnRlcmx5CgkgKgkJCQkJCQkJCUlmIHdvcmtpbmcgaW4gR251bWVyaWMgTW9kZSwgdGhlIGZvbGxvd2luZyBmcmVxdWVuY3kgb3B0aW9ucyBhcmUKCSAqCQkJCQkJCQkJYWxzbyBhdmFpbGFibGUKCSAqCQkJCQkJCQkJCTYJQmltb250aGx5CgkgKgkJCQkJCQkJCQkxMglNb250aGx5CgkgKiBAcGFyYW0JaW50ZWdlcgkkYmFzaXMJCQlUaGUgdHlwZSBvZiBkYXkgY291bnQgdG8gdXNlLgoJICoJCQkJCQkJCQkJMCBvciBvbWl0dGVkCVVTIChOQVNEKSAzMC8zNjAKCSAqCQkJCQkJCQkJCTEJCQkJQWN0dWFsL2FjdHVhbAoJICoJCQkJCQkJCQkJMgkJCQlBY3R1YWwvMzYwCgkgKgkJCQkJCQkJCQkzCQkJCUFjdHVhbC8zNjUKCSAqCQkJCQkJCQkJCTQJCQkJRXVyb3BlYW4gMzAvMzYwCgkgKiBAcmV0dXJuCWZsb2F0CgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gQUNDUklOVCgkaXNzdWUsICRmaXJzdGludGVyZXN0LCAkc2V0dGxlbWVudCwgJHJhdGUsICRwYXI9MTAwMCwgJGZyZXF1ZW5jeT0xLCAkYmFzaXM9MCkKCXsKCQkkaXNzdWUJCT0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuU2luZ2xlVmFsdWUoJGlzc3VlKTsKCQkkZmlyc3RpbnRlcmVzdAk9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlblNpbmdsZVZhbHVlKCRmaXJzdGludGVyZXN0KTsKCQkkc2V0dGxlbWVudAk9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlblNpbmdsZVZhbHVlKCRzZXR0bGVtZW50KTsKCQkkcmF0ZQkJPSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5TaW5nbGVWYWx1ZSgkcmF0ZSk7CgkJJHBhcgkJPSAoaXNfbnVsbCgkcGFyKSkJCT8gMTAwMCA6CVBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlblNpbmdsZVZhbHVlKCRwYXIpOwoJCSRmcmVxdWVuY3kJPSAoaXNfbnVsbCgkZnJlcXVlbmN5KSkJPyAxCTogCQlQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5TaW5nbGVWYWx1ZSgkZnJlcXVlbmN5KTsKCQkkYmFzaXMJCT0gKGlzX251bGwoJGJhc2lzKSkJCT8gMAk6CQlQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5TaW5nbGVWYWx1ZSgkYmFzaXMpOwoKCQkvLwlWYWxpZGF0ZQoJCWlmICgoaXNfbnVtZXJpYygkcmF0ZSkpICYmIChpc19udW1lcmljKCRwYXIpKSkgewoJCQkkcmF0ZQk9IChmbG9hdCkgJHJhdGU7CgkJCSRwYXIJPSAoZmxvYXQpICRwYXI7CgkJCWlmICgoJHJhdGUgPD0gMCkgfHwgKCRwYXIgPD0gMCkpIHsKCQkJCXJldHVybiBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6Ok5hTigpOwoJCQl9CgkJCSRkYXlzQmV0d2Vlbklzc3VlQW5kU2V0dGxlbWVudCA9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0RhdGVUaW1lOjpZRUFSRlJBQygkaXNzdWUsICRzZXR0bGVtZW50LCAkYmFzaXMpOwoJCQlpZiAoIWlzX251bWVyaWMoJGRheXNCZXR3ZWVuSXNzdWVBbmRTZXR0bGVtZW50KSkgewoJCQkJLy8JcmV0dXJuIGRhdGUgZXJyb3IKCQkJCXJldHVybiAkZGF5c0JldHdlZW5Jc3N1ZUFuZFNldHRsZW1lbnQ7CgkJCX0KCgkJCXJldHVybiAkcGFyICogJHJhdGUgKiAkZGF5c0JldHdlZW5Jc3N1ZUFuZFNldHRsZW1lbnQ7CgkJfQoJCXJldHVybiBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OlZBTFVFKCk7Cgl9CS8vCWZ1bmN0aW9uIEFDQ1JJTlQoKQoKCgkvKioKCSAqIEFDQ1JJTlRNCgkgKgoJICogUmV0dXJucyB0aGUgYWNjcnVlZCBpbnRlcmVzdCBmb3IgYSBzZWN1cml0eSB0aGF0IHBheXMgaW50ZXJlc3QgYXQgbWF0dXJpdHkuCgkgKgoJICogRXhjZWwgRnVuY3Rpb246CgkgKgkJQUNDUklOVE0oaXNzdWUsc2V0dGxlbWVudCxyYXRlWyxwYXJbLGJhc2lzXV0pCgkgKgoJICogQGFjY2VzcwlwdWJsaWMKCSAqIEBjYXRlZ29yeSBGaW5hbmNpYWwgRnVuY3Rpb25zCgkgKiBAcGFyYW0JbWl4ZWQJaXNzdWUJCVRoZSBzZWN1cml0eSdzIGlzc3VlIGRhdGUuCgkgKiBAcGFyYW0JbWl4ZWQJc2V0dGxlbWVudAlUaGUgc2VjdXJpdHkncyBzZXR0bGVtZW50IChvciBtYXR1cml0eSkgZGF0ZS4KCSAqIEBwYXJhbQlmbG9hdAlyYXRlCQlUaGUgc2VjdXJpdHkncyBhbm51YWwgY291cG9uIHJhdGUuCgkgKiBAcGFyYW0JZmxvYXQJcGFyCQkJVGhlIHNlY3VyaXR5J3MgcGFyIHZhbHVlLgoJICoJCQkJCQkJCQlJZiB5b3Ugb21pdCBwYXIsIEFDQ1JJTlQgdXNlcyAkMSwwMDAuCgkgKiBAcGFyYW0JaW50ZWdlcgliYXNpcwkJVGhlIHR5cGUgb2YgZGF5IGNvdW50IHRvIHVzZS4KCSAqCQkJCQkJCQkJCTAgb3Igb21pdHRlZAlVUyAoTkFTRCkgMzAvMzYwCgkgKgkJCQkJCQkJCQkxCQkJCUFjdHVhbC9hY3R1YWwKCSAqCQkJCQkJCQkJCTIJCQkJQWN0dWFsLzM2MAoJICoJCQkJCQkJCQkJMwkJCQlBY3R1YWwvMzY1CgkgKgkJCQkJCQkJCQk0CQkJCUV1cm9wZWFuIDMwLzM2MAoJICogQHJldHVybglmbG9hdAoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIEFDQ1JJTlRNKCRpc3N1ZSwgJHNldHRsZW1lbnQsICRyYXRlLCAkcGFyPTEwMDAsICRiYXNpcz0wKSB7CgkJJGlzc3VlCQk9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlblNpbmdsZVZhbHVlKCRpc3N1ZSk7CgkJJHNldHRsZW1lbnQJPSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5TaW5nbGVWYWx1ZSgkc2V0dGxlbWVudCk7CgkJJHJhdGUJCT0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuU2luZ2xlVmFsdWUoJHJhdGUpOwoJCSRwYXIJCT0gKGlzX251bGwoJHBhcikpCT8gMTAwMCA6CVBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlblNpbmdsZVZhbHVlKCRwYXIpOwoJCSRiYXNpcwkJPSAoaXNfbnVsbCgkYmFzaXMpKQk/IDAgOgkJUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuU2luZ2xlVmFsdWUoJGJhc2lzKTsKCgkJLy8JVmFsaWRhdGUKCQlpZiAoKGlzX251bWVyaWMoJHJhdGUpKSAmJiAoaXNfbnVtZXJpYygkcGFyKSkpIHsKCQkJJHJhdGUJPSAoZmxvYXQpICRyYXRlOwoJCQkkcGFyCT0gKGZsb2F0KSAkcGFyOwoJCQlpZiAoKCRyYXRlIDw9IDApIHx8ICgkcGFyIDw9IDApKSB7CgkJCQlyZXR1cm4gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpOYU4oKTsKCQkJfQoJCQkkZGF5c0JldHdlZW5Jc3N1ZUFuZFNldHRsZW1lbnQgPSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9EYXRlVGltZTo6WUVBUkZSQUMoJGlzc3VlLCAkc2V0dGxlbWVudCwgJGJhc2lzKTsKCQkJaWYgKCFpc19udW1lcmljKCRkYXlzQmV0d2Vlbklzc3VlQW5kU2V0dGxlbWVudCkpIHsKCQkJCS8vCXJldHVybiBkYXRlIGVycm9yCgkJCQlyZXR1cm4gJGRheXNCZXR3ZWVuSXNzdWVBbmRTZXR0bGVtZW50OwoJCQl9CgkJCXJldHVybiAkcGFyICogJHJhdGUgKiAkZGF5c0JldHdlZW5Jc3N1ZUFuZFNldHRsZW1lbnQ7CgkJfQoJCXJldHVybiBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OlZBTFVFKCk7Cgl9CS8vCWZ1bmN0aW9uIEFDQ1JJTlRNKCkKCgoJLyoqCgkgKiBBTU9SREVHUkMKCSAqCgkgKiBSZXR1cm5zIHRoZSBkZXByZWNpYXRpb24gZm9yIGVhY2ggYWNjb3VudGluZyBwZXJpb2QuCgkgKiBUaGlzIGZ1bmN0aW9uIGlzIHByb3ZpZGVkIGZvciB0aGUgRnJlbmNoIGFjY291bnRpbmcgc3lzdGVtLiBJZiBhbiBhc3NldCBpcyBwdXJjaGFzZWQgaW4KCSAqIHRoZSBtaWRkbGUgb2YgdGhlIGFjY291bnRpbmcgcGVyaW9kLCB0aGUgcHJvcmF0ZWQgZGVwcmVjaWF0aW9uIGlzIHRha2VuIGludG8gYWNjb3VudC4KCSAqIFRoZSBmdW5jdGlvbiBpcyBzaW1pbGFyIHRvIEFNT1JMSU5DLCBleGNlcHQgdGhhdCBhIGRlcHJlY2lhdGlvbiBjb2VmZmljaWVudCBpcyBhcHBsaWVkIGluCgkgKiB0aGUgY2FsY3VsYXRpb24gZGVwZW5kaW5nIG9uIHRoZSBsaWZlIG9mIHRoZSBhc3NldHMuCgkgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIHRoZSBkZXByZWNpYXRpb24gdW50aWwgdGhlIGxhc3QgcGVyaW9kIG9mIHRoZSBsaWZlIG9mIHRoZSBhc3NldHMKCSAqIG9yIHVudGlsIHRoZSBjdW11bGF0ZWQgdmFsdWUgb2YgZGVwcmVjaWF0aW9uIGlzIGdyZWF0ZXIgdGhhbiB0aGUgY29zdCBvZiB0aGUgYXNzZXRzIG1pbnVzCgkgKiB0aGUgc2FsdmFnZSB2YWx1ZS4KCSAqCgkgKiBFeGNlbCBGdW5jdGlvbjoKCSAqCQlBTU9SREVHUkMoY29zdCxwdXJjaGFzZWQsZmlyc3RQZXJpb2Qsc2FsdmFnZSxwZXJpb2QscmF0ZVssYmFzaXNdKQoJICoKCSAqIEBhY2Nlc3MJcHVibGljCgkgKiBAY2F0ZWdvcnkgRmluYW5jaWFsIEZ1bmN0aW9ucwoJICogQHBhcmFtCWZsb2F0CWNvc3QJCVRoZSBjb3N0IG9mIHRoZSBhc3NldC4KCSAqIEBwYXJhbQltaXhlZAlwdXJjaGFzZWQJRGF0ZSBvZiB0aGUgcHVyY2hhc2Ugb2YgdGhlIGFzc2V0LgoJICogQHBhcmFtCW1peGVkCWZpcnN0UGVyaW9kCURhdGUgb2YgdGhlIGVuZCBvZiB0aGUgZmlyc3QgcGVyaW9kLgoJICogQHBhcmFtCW1peGVkCXNhbHZhZ2UJCVRoZSBzYWx2YWdlIHZhbHVlIGF0IHRoZSBlbmQgb2YgdGhlIGxpZmUgb2YgdGhlIGFzc2V0LgoJICogQHBhcmFtCWZsb2F0CXBlcmlvZAkJVGhlIHBlcmlvZC4KCSAqIEBwYXJhbQlmbG9hdAlyYXRlCQlSYXRlIG9mIGRlcHJlY2lhdGlvbi4KCSAqIEBwYXJhbQlpbnRlZ2VyCWJhc2lzCQlUaGUgdHlwZSBvZiBkYXkgY291bnQgdG8gdXNlLgoJICoJCQkJCQkJCQkJMCBvciBvbWl0dGVkCVVTIChOQVNEKSAzMC8zNjAKCSAqCQkJCQkJCQkJCTEJCQkJQWN0dWFsL2FjdHVhbAoJICoJCQkJCQkJCQkJMgkJCQlBY3R1YWwvMzYwCgkgKgkJCQkJCQkJCQkzCQkJCUFjdHVhbC8zNjUKCSAqCQkJCQkJCQkJCTQJCQkJRXVyb3BlYW4gMzAvMzYwCgkgKiBAcmV0dXJuCWZsb2F0CgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gQU1PUkRFR1JDKCRjb3N0LCAkcHVyY2hhc2VkLCAkZmlyc3RQZXJpb2QsICRzYWx2YWdlLCAkcGVyaW9kLCAkcmF0ZSwgJGJhc2lzPTApIHsKCQkkY29zdAkJCT0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuU2luZ2xlVmFsdWUoJGNvc3QpOwoJCSRwdXJjaGFzZWQJCT0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuU2luZ2xlVmFsdWUoJHB1cmNoYXNlZCk7CgkJJGZpcnN0UGVyaW9kCT0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuU2luZ2xlVmFsdWUoJGZpcnN0UGVyaW9kKTsKCQkkc2FsdmFnZQkJPSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5TaW5nbGVWYWx1ZSgkc2FsdmFnZSk7CgkJJHBlcmlvZAkJCT0gZmxvb3IoUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuU2luZ2xlVmFsdWUoJHBlcmlvZCkpOwoJCSRyYXRlCQkJPSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5TaW5nbGVWYWx1ZSgkcmF0ZSk7CgkJJGJhc2lzCQkJPSAoaXNfbnVsbCgkYmFzaXMpKQk/IDAgOgkoaW50KSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5TaW5nbGVWYWx1ZSgkYmFzaXMpOwoKCQkvLwlUaGUgZGVwcmVjaWF0aW9uIGNvZWZmaWNpZW50cyBhcmU6CgkJLy8JTGlmZSBvZiBhc3NldHMgKDEvcmF0ZSkJCURlcHJlY2lhdGlvbiBjb2VmZmljaWVudAoJCS8vCUxlc3MgdGhhbiAzIHllYXJzCQkJMQoJCS8vCUJldHdlZW4gMyBhbmQgNCB5ZWFycwkJMS41CgkJLy8JQmV0d2VlbiA1IGFuZCA2IHllYXJzCQkyCgkJLy8JTW9yZSB0aGFuIDYgeWVhcnMJCQkyLjUKCQkkZlVzZVBlciA9IDEuMCAvICRyYXRlOwoJCWlmICgkZlVzZVBlciA8IDMuMCkgewoJCQkkYW1vcnRpc2VDb2VmZiA9IDEuMDsKCQl9IGVsc2VpZiAoJGZVc2VQZXIgPCA1LjApIHsKCQkJJGFtb3J0aXNlQ29lZmYgPSAxLjU7CgkJfSBlbHNlaWYgKCRmVXNlUGVyIDw9IDYuMCkgewoJCQkkYW1vcnRpc2VDb2VmZiA9IDIuMDsKCQl9IGVsc2UgewoJCQkkYW1vcnRpc2VDb2VmZiA9IDIuNTsKCQl9CgoJCSRyYXRlICo9ICRhbW9ydGlzZUNvZWZmOwoJCSRmTlJhdGUgPSByb3VuZChQSFBFeGNlbF9DYWxjdWxhdGlvbl9EYXRlVGltZTo6WUVBUkZSQUMoJHB1cmNoYXNlZCwgJGZpcnN0UGVyaW9kLCAkYmFzaXMpICogJHJhdGUgKiAkY29zdCwwKTsKCQkkY29zdCAtPSAkZk5SYXRlOwoJCSRmUmVzdCA9ICRjb3N0IC0gJHNhbHZhZ2U7CgoJCWZvciAoJG4gPSAwOyAkbiA8ICRwZXJpb2Q7ICsrJG4pIHsKCQkJJGZOUmF0ZSA9IHJvdW5kKCRyYXRlICogJGNvc3QsMCk7CgkJCSRmUmVzdCAtPSAkZk5SYXRlOwoKCQkJaWYgKCRmUmVzdCA8IDAuMCkgewoJCQkJc3dpdGNoICgkcGVyaW9kIC0gJG4pIHsKCQkJCQljYXNlIDAJOgoJCQkJCWNhc2UgMQk6IHJldHVybiByb3VuZCgkY29zdCAqIDAuNSwgMCk7CgkJCQkJCQkgIGJyZWFrOwoJCQkJCWRlZmF1bHQJOiByZXR1cm4gMC4wOwoJCQkJCQkJICBicmVhazsKCQkJCX0KCQkJfQoJCQkkY29zdCAtPSAkZk5SYXRlOwoJCX0KCQlyZXR1cm4gJGZOUmF0ZTsKCX0JLy8JZnVuY3Rpb24gQU1PUkRFR1JDKCkKCgoJLyoqCgkgKiBBTU9STElOQwoJICoKCSAqIFJldHVybnMgdGhlIGRlcHJlY2lhdGlvbiBmb3IgZWFjaCBhY2NvdW50aW5nIHBlcmlvZC4KCSAqIFRoaXMgZnVuY3Rpb24gaXMgcHJvdmlkZWQgZm9yIHRoZSBGcmVuY2ggYWNjb3VudGluZyBzeXN0ZW0uIElmIGFuIGFzc2V0IGlzIHB1cmNoYXNlZCBpbgoJICogdGhlIG1pZGRsZSBvZiB0aGUgYWNjb3VudGluZyBwZXJpb2QsIHRoZSBwcm9yYXRlZCBkZXByZWNpYXRpb24gaXMgdGFrZW4gaW50byBhY2NvdW50LgoJICoKCSAqIEV4Y2VsIEZ1bmN0aW9uOgoJICoJCUFNT1JMSU5DKGNvc3QscHVyY2hhc2VkLGZpcnN0UGVyaW9kLHNhbHZhZ2UscGVyaW9kLHJhdGVbLGJhc2lzXSkKCSAqCgkgKiBAYWNjZXNzCXB1YmxpYwoJICogQGNhdGVnb3J5IEZpbmFuY2lhbCBGdW5jdGlvbnMKCSAqIEBwYXJhbQlmbG9hdAljb3N0CQlUaGUgY29zdCBvZiB0aGUgYXNzZXQuCgkgKiBAcGFyYW0JbWl4ZWQJcHVyY2hhc2VkCURhdGUgb2YgdGhlIHB1cmNoYXNlIG9mIHRoZSBhc3NldC4KCSAqIEBwYXJhbQltaXhlZAlmaXJzdFBlcmlvZAlEYXRlIG9mIHRoZSBlbmQgb2YgdGhlIGZpcnN0IHBlcmlvZC4KCSAqIEBwYXJhbQltaXhlZAlzYWx2YWdlCQlUaGUgc2FsdmFnZSB2YWx1ZSBhdCB0aGUgZW5kIG9mIHRoZSBsaWZlIG9mIHRoZSBhc3NldC4KCSAqIEBwYXJhbQlmbG9hdAlwZXJpb2QJCVRoZSBwZXJpb2QuCgkgKiBAcGFyYW0JZmxvYXQJcmF0ZQkJUmF0ZSBvZiBkZXByZWNpYXRpb24uCgkgKiBAcGFyYW0JaW50ZWdlcgliYXNpcwkJVGhlIHR5cGUgb2YgZGF5IGNvdW50IHRvIHVzZS4KCSAqCQkJCQkJCQkJCTAgb3Igb21pdHRlZAlVUyAoTkFTRCkgMzAvMzYwCgkgKgkJCQkJCQkJCQkxCQkJCUFjdHVhbC9hY3R1YWwKCSAqCQkJCQkJCQkJCTIJCQkJQWN0dWFsLzM2MAoJICoJCQkJCQkJCQkJMwkJCQlBY3R1YWwvMzY1CgkgKgkJCQkJCQkJCQk0CQkJCUV1cm9wZWFuIDMwLzM2MAoJICogQHJldHVybglmbG9hdAoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIEFNT1JMSU5DKCRjb3N0LCAkcHVyY2hhc2VkLCAkZmlyc3RQZXJpb2QsICRzYWx2YWdlLCAkcGVyaW9kLCAkcmF0ZSwgJGJhc2lzPTApIHsKCQkkY29zdAkJCT0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuU2luZ2xlVmFsdWUoJGNvc3QpOwoJCSRwdXJjaGFzZWQJCT0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuU2luZ2xlVmFsdWUoJHB1cmNoYXNlZCk7CgkJJGZpcnN0UGVyaW9kCT0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuU2luZ2xlVmFsdWUoJGZpcnN0UGVyaW9kKTsKCQkkc2FsdmFnZQkJPSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5TaW5nbGVWYWx1ZSgkc2FsdmFnZSk7CgkJJHBlcmlvZAkJCT0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuU2luZ2xlVmFsdWUoJHBlcmlvZCk7CgkJJHJhdGUJCQk9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlblNpbmdsZVZhbHVlKCRyYXRlKTsKCQkkYmFzaXMJCQk9IChpc19udWxsKCRiYXNpcykpCT8gMCA6CShpbnQpIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlblNpbmdsZVZhbHVlKCRiYXNpcyk7CgoJCSRmT25lUmF0ZSA9ICRjb3N0ICogJHJhdGU7CgkJJGZDb3N0RGVsdGEgPSAkY29zdCAtICRzYWx2YWdlOwoJCS8vCU5vdGUsIHF1aXJreSB2YXJpYXRpb24gZm9yIGxlYXAgeWVhcnMgb24gdGhlIFlFQVJGUkFDIGZvciB0aGlzIGZ1bmN0aW9uCgkJJHB1cmNoYXNlZFllYXIgPSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9EYXRlVGltZTo6WUVBUigkcHVyY2hhc2VkKTsKCQkkeWVhckZyYWMgPSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9EYXRlVGltZTo6WUVBUkZSQUMoJHB1cmNoYXNlZCwgJGZpcnN0UGVyaW9kLCAkYmFzaXMpOwoKCQlpZiAoKCRiYXNpcyA9PSAxKSAmJiAoJHllYXJGcmFjIDwgMSkgJiYgKFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0RhdGVUaW1lOjpfaXNMZWFwWWVhcigkcHVyY2hhc2VkWWVhcikpKSB7CgkJCSR5ZWFyRnJhYyAqPSAzNjUgLyAzNjY7CgkJfQoKCQkkZjBSYXRlID0gJHllYXJGcmFjICogJHJhdGUgKiAkY29zdDsKCQkkbk51bU9mRnVsbFBlcmlvZHMgPSBpbnR2YWwoKCRjb3N0IC0gJHNhbHZhZ2UgLSAkZjBSYXRlKSAvICRmT25lUmF0ZSk7CgoJCWlmICgkcGVyaW9kID09IDApIHsKCQkJcmV0dXJuICRmMFJhdGU7CgkJfSBlbHNlaWYgKCRwZXJpb2QgPD0gJG5OdW1PZkZ1bGxQZXJpb2RzKSB7CgkJCXJldHVybiAkZk9uZVJhdGU7CgkJfSBlbHNlaWYgKCRwZXJpb2QgPT0gKCRuTnVtT2ZGdWxsUGVyaW9kcyArIDEpKSB7CiAgICAgICAgICAgIHJldHVybiAoJGZDb3N0RGVsdGEgLSAkZk9uZVJhdGUgKiAkbk51bU9mRnVsbFBlcmlvZHMgLSAkZjBSYXRlKTsKCQl9IGVsc2UgewoJCQlyZXR1cm4gMC4wOwoJCX0KCX0JLy8JZnVuY3Rpb24gQU1PUkxJTkMoKQoKCgkvKioKCSAqIENPVVBEQVlCUwoJICoKCSAqIFJldHVybnMgdGhlIG51bWJlciBvZiBkYXlzIGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgY291cG9uIHBlcmlvZCB0byB0aGUgc2V0dGxlbWVudCBkYXRlLgoJICoKCSAqIEV4Y2VsIEZ1bmN0aW9uOgoJICoJCUNPVVBEQVlCUyhzZXR0bGVtZW50LG1hdHVyaXR5LGZyZXF1ZW5jeVssYmFzaXNdKQoJICoKCSAqIEBhY2Nlc3MJcHVibGljCgkgKiBAY2F0ZWdvcnkgRmluYW5jaWFsIEZ1bmN0aW9ucwoJICogQHBhcmFtCW1peGVkCXNldHRsZW1lbnQJVGhlIHNlY3VyaXR5J3Mgc2V0dGxlbWVudCBkYXRlLgoJICoJCQkJCQkJCVRoZSBzZWN1cml0eSBzZXR0bGVtZW50IGRhdGUgaXMgdGhlIGRhdGUgYWZ0ZXIgdGhlIGlzc3VlCgkgKgkJCQkJCQkJZGF0ZSB3aGVuIHRoZSBzZWN1cml0eSBpcyB0cmFkZWQgdG8gdGhlIGJ1eWVyLgoJICogQHBhcmFtCW1peGVkCW1hdHVyaXR5CVRoZSBzZWN1cml0eSdzIG1hdHVyaXR5IGRhdGUuCgkgKgkJCQkJCQkJVGhlIG1hdHVyaXR5IGRhdGUgaXMgdGhlIGRhdGUgd2hlbiB0aGUgc2VjdXJpdHkgZXhwaXJlcy4KCSAqIEBwYXJhbQltaXhlZAlmcmVxdWVuY3kJdGhlIG51bWJlciBvZiBjb3Vwb24gcGF5bWVudHMgcGVyIHllYXIuCgkgKgkJCQkJCQkJCVZhbGlkIGZyZXF1ZW5jeSB2YWx1ZXMgYXJlOgoJICoJCQkJCQkJCQkJMQlBbm51YWwKCSAqCQkJCQkJCQkJCTIJU2VtaS1Bbm51YWwKCSAqCQkJCQkJCQkJCTQJUXVhcnRlcmx5CgkgKgkJCQkJCQkJCUlmIHdvcmtpbmcgaW4gR251bWVyaWMgTW9kZSwgdGhlIGZvbGxvd2luZyBmcmVxdWVuY3kgb3B0aW9ucyBhcmUKCSAqCQkJCQkJCQkJYWxzbyBhdmFpbGFibGUKCSAqCQkJCQkJCQkJCTYJQmltb250aGx5CgkgKgkJCQkJCQkJCQkxMglNb250aGx5CgkgKiBAcGFyYW0JaW50ZWdlcgkJYmFzaXMJCVRoZSB0eXBlIG9mIGRheSBjb3VudCB0byB1c2UuCgkgKgkJCQkJCQkJCQkwIG9yIG9taXR0ZWQJVVMgKE5BU0QpIDMwLzM2MAoJICoJCQkJCQkJCQkJMQkJCQlBY3R1YWwvYWN0dWFsCgkgKgkJCQkJCQkJCQkyCQkJCUFjdHVhbC8zNjAKCSAqCQkJCQkJCQkJCTMJCQkJQWN0dWFsLzM2NQoJICoJCQkJCQkJCQkJNAkJCQlFdXJvcGVhbiAzMC8zNjAKCSAqIEByZXR1cm4JZmxvYXQKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBDT1VQREFZQlMoJHNldHRsZW1lbnQsICRtYXR1cml0eSwgJGZyZXF1ZW5jeSwgJGJhc2lzPTApIHsKCQkkc2V0dGxlbWVudAk9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlblNpbmdsZVZhbHVlKCRzZXR0bGVtZW50KTsKCQkkbWF0dXJpdHkJPSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5TaW5nbGVWYWx1ZSgkbWF0dXJpdHkpOwoJCSRmcmVxdWVuY3kJPSAoaW50KSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5TaW5nbGVWYWx1ZSgkZnJlcXVlbmN5KTsKCQkkYmFzaXMJCT0gKGlzX251bGwoJGJhc2lzKSkJPyAwIDoJKGludCkgUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuU2luZ2xlVmFsdWUoJGJhc2lzKTsKCgkJaWYgKGlzX3N0cmluZygkc2V0dGxlbWVudCA9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0RhdGVUaW1lOjpfZ2V0RGF0ZVZhbHVlKCRzZXR0bGVtZW50KSkpIHsKCQkJcmV0dXJuIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6VkFMVUUoKTsKCQl9CgkJaWYgKGlzX3N0cmluZygkbWF0dXJpdHkgPSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9EYXRlVGltZTo6X2dldERhdGVWYWx1ZSgkbWF0dXJpdHkpKSkgewoJCQlyZXR1cm4gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpWQUxVRSgpOwoJCX0KCgkJaWYgKCgkc2V0dGxlbWVudCA+ICRtYXR1cml0eSkgfHwKCQkJKCFzZWxmOjpfdmFsaWRGcmVxdWVuY3koJGZyZXF1ZW5jeSkpIHx8CgkJCSgoJGJhc2lzIDwgMCkgfHwgKCRiYXNpcyA+IDQpKSkgewoJCQlyZXR1cm4gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpOYU4oKTsKCQl9CgoJCSRkYXlzUGVyWWVhciA9IHNlbGY6Ol9kYXlzUGVyWWVhcihQSFBFeGNlbF9DYWxjdWxhdGlvbl9EYXRlVGltZTo6WUVBUigkc2V0dGxlbWVudCksJGJhc2lzKTsKCQkkcHJldiA9IHNlbGY6Ol9jb3VwRmlyc3RQZXJpb2REYXRlKCRzZXR0bGVtZW50LCAkbWF0dXJpdHksICRmcmVxdWVuY3ksIEZhbHNlKTsKCgkJcmV0dXJuIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0RhdGVUaW1lOjpZRUFSRlJBQygkcHJldiwgJHNldHRsZW1lbnQsICRiYXNpcykgKiAkZGF5c1BlclllYXI7Cgl9CS8vCWZ1bmN0aW9uIENPVVBEQVlCUygpCgoKCS8qKgoJICogQ09VUERBWVMKCSAqCgkgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZGF5cyBpbiB0aGUgY291cG9uIHBlcmlvZCB0aGF0IGNvbnRhaW5zIHRoZSBzZXR0bGVtZW50IGRhdGUuCgkgKgoJICogRXhjZWwgRnVuY3Rpb246CgkgKgkJQ09VUERBWVMoc2V0dGxlbWVudCxtYXR1cml0eSxmcmVxdWVuY3lbLGJhc2lzXSkKCSAqCgkgKiBAYWNjZXNzCXB1YmxpYwoJICogQGNhdGVnb3J5IEZpbmFuY2lhbCBGdW5jdGlvbnMKCSAqIEBwYXJhbQltaXhlZAlzZXR0bGVtZW50CVRoZSBzZWN1cml0eSdzIHNldHRsZW1lbnQgZGF0ZS4KCSAqCQkJCQkJCQlUaGUgc2VjdXJpdHkgc2V0dGxlbWVudCBkYXRlIGlzIHRoZSBkYXRlIGFmdGVyIHRoZSBpc3N1ZQoJICoJCQkJCQkJCWRhdGUgd2hlbiB0aGUgc2VjdXJpdHkgaXMgdHJhZGVkIHRvIHRoZSBidXllci4KCSAqIEBwYXJhbQltaXhlZAltYXR1cml0eQlUaGUgc2VjdXJpdHkncyBtYXR1cml0eSBkYXRlLgoJICoJCQkJCQkJCVRoZSBtYXR1cml0eSBkYXRlIGlzIHRoZSBkYXRlIHdoZW4gdGhlIHNlY3VyaXR5IGV4cGlyZXMuCgkgKiBAcGFyYW0JbWl4ZWQJZnJlcXVlbmN5CXRoZSBudW1iZXIgb2YgY291cG9uIHBheW1lbnRzIHBlciB5ZWFyLgoJICoJCQkJCQkJCQlWYWxpZCBmcmVxdWVuY3kgdmFsdWVzIGFyZToKCSAqCQkJCQkJCQkJCTEJQW5udWFsCgkgKgkJCQkJCQkJCQkyCVNlbWktQW5udWFsCgkgKgkJCQkJCQkJCQk0CVF1YXJ0ZXJseQoJICoJCQkJCQkJCQlJZiB3b3JraW5nIGluIEdudW1lcmljIE1vZGUsIHRoZSBmb2xsb3dpbmcgZnJlcXVlbmN5IG9wdGlvbnMgYXJlCgkgKgkJCQkJCQkJCWFsc28gYXZhaWxhYmxlCgkgKgkJCQkJCQkJCQk2CUJpbW9udGhseQoJICoJCQkJCQkJCQkJMTIJTW9udGhseQoJICogQHBhcmFtCWludGVnZXIJCWJhc2lzCQlUaGUgdHlwZSBvZiBkYXkgY291bnQgdG8gdXNlLgoJICoJCQkJCQkJCQkJMCBvciBvbWl0dGVkCVVTIChOQVNEKSAzMC8zNjAKCSAqCQkJCQkJCQkJCTEJCQkJQWN0dWFsL2FjdHVhbAoJICoJCQkJCQkJCQkJMgkJCQlBY3R1YWwvMzYwCgkgKgkJCQkJCQkJCQkzCQkJCUFjdHVhbC8zNjUKCSAqCQkJCQkJCQkJCTQJCQkJRXVyb3BlYW4gMzAvMzYwCgkgKiBAcmV0dXJuCWZsb2F0CgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gQ09VUERBWVMoJHNldHRsZW1lbnQsICRtYXR1cml0eSwgJGZyZXF1ZW5jeSwgJGJhc2lzPTApIHsKCQkkc2V0dGxlbWVudAk9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlblNpbmdsZVZhbHVlKCRzZXR0bGVtZW50KTsKCQkkbWF0dXJpdHkJPSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5TaW5nbGVWYWx1ZSgkbWF0dXJpdHkpOwoJCSRmcmVxdWVuY3kJPSAoaW50KSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5TaW5nbGVWYWx1ZSgkZnJlcXVlbmN5KTsKCQkkYmFzaXMJCT0gKGlzX251bGwoJGJhc2lzKSkJPyAwIDoJKGludCkgUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuU2luZ2xlVmFsdWUoJGJhc2lzKTsKCgkJaWYgKGlzX3N0cmluZygkc2V0dGxlbWVudCA9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0RhdGVUaW1lOjpfZ2V0RGF0ZVZhbHVlKCRzZXR0bGVtZW50KSkpIHsKCQkJcmV0dXJuIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6VkFMVUUoKTsKCQl9CgkJaWYgKGlzX3N0cmluZygkbWF0dXJpdHkgPSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9EYXRlVGltZTo6X2dldERhdGVWYWx1ZSgkbWF0dXJpdHkpKSkgewoJCQlyZXR1cm4gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpWQUxVRSgpOwoJCX0KCgkJaWYgKCgkc2V0dGxlbWVudCA+ICRtYXR1cml0eSkgfHwKCQkJKCFzZWxmOjpfdmFsaWRGcmVxdWVuY3koJGZyZXF1ZW5jeSkpIHx8CgkJCSgoJGJhc2lzIDwgMCkgfHwgKCRiYXNpcyA+IDQpKSkgewoJCQlyZXR1cm4gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpOYU4oKTsKCQl9CgoJCXN3aXRjaCAoJGJhc2lzKSB7CgkJCWNhc2UgMzogLy8gQWN0dWFsLzM2NQoJCQkJCXJldHVybiAzNjUgLyAkZnJlcXVlbmN5OwoJCQljYXNlIDE6IC8vIEFjdHVhbC9hY3R1YWwKCQkJCQlpZiAoJGZyZXF1ZW5jeSA9PSAxKSB7CgkJCQkJCSRkYXlzUGVyWWVhciA9IHNlbGY6Ol9kYXlzUGVyWWVhcihQSFBFeGNlbF9DYWxjdWxhdGlvbl9EYXRlVGltZTo6WUVBUigkbWF0dXJpdHkpLCRiYXNpcyk7CgkJCQkJCXJldHVybiAoJGRheXNQZXJZZWFyIC8gJGZyZXF1ZW5jeSk7CgkJCQkJfSBlbHNlIHsKCQkJCQkJJHByZXYgPSBzZWxmOjpfY291cEZpcnN0UGVyaW9kRGF0ZSgkc2V0dGxlbWVudCwgJG1hdHVyaXR5LCAkZnJlcXVlbmN5LCBGYWxzZSk7CgkJCQkJCSRuZXh0ID0gc2VsZjo6X2NvdXBGaXJzdFBlcmlvZERhdGUoJHNldHRsZW1lbnQsICRtYXR1cml0eSwgJGZyZXF1ZW5jeSwgVHJ1ZSk7CgkJCQkJCXJldHVybiAoJG5leHQgLSAkcHJldik7CgkJCQkJfQoJCQlkZWZhdWx0OiAvLyBVUyAoTkFTRCkgMzAvMzYwLCBBY3R1YWwvMzYwIG9yIEV1cm9wZWFuIDMwLzM2MAoJCQkJCXJldHVybiAzNjAgLyAkZnJlcXVlbmN5OwoJCX0KCQlyZXR1cm4gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpWQUxVRSgpOwoJfQkvLwlmdW5jdGlvbiBDT1VQREFZUygpCgoKCS8qKgoJICogQ09VUERBWVNOQwoJICoKCSAqIFJldHVybnMgdGhlIG51bWJlciBvZiBkYXlzIGZyb20gdGhlIHNldHRsZW1lbnQgZGF0ZSB0byB0aGUgbmV4dCBjb3Vwb24gZGF0ZS4KCSAqCgkgKiBFeGNlbCBGdW5jdGlvbjoKCSAqCQlDT1VQREFZU05DKHNldHRsZW1lbnQsbWF0dXJpdHksZnJlcXVlbmN5WyxiYXNpc10pCgkgKgoJICogQGFjY2VzcwlwdWJsaWMKCSAqIEBjYXRlZ29yeSBGaW5hbmNpYWwgRnVuY3Rpb25zCgkgKiBAcGFyYW0JbWl4ZWQJc2V0dGxlbWVudAlUaGUgc2VjdXJpdHkncyBzZXR0bGVtZW50IGRhdGUuCgkgKgkJCQkJCQkJVGhlIHNlY3VyaXR5IHNldHRsZW1lbnQgZGF0ZSBpcyB0aGUgZGF0ZSBhZnRlciB0aGUgaXNzdWUKCSAqCQkJCQkJCQlkYXRlIHdoZW4gdGhlIHNlY3VyaXR5IGlzIHRyYWRlZCB0byB0aGUgYnV5ZXIuCgkgKiBAcGFyYW0JbWl4ZWQJbWF0dXJpdHkJVGhlIHNlY3VyaXR5J3MgbWF0dXJpdHkgZGF0ZS4KCSAqCQkJCQkJCQlUaGUgbWF0dXJpdHkgZGF0ZSBpcyB0aGUgZGF0ZSB3aGVuIHRoZSBzZWN1cml0eSBleHBpcmVzLgoJICogQHBhcmFtCW1peGVkCWZyZXF1ZW5jeQl0aGUgbnVtYmVyIG9mIGNvdXBvbiBwYXltZW50cyBwZXIgeWVhci4KCSAqCQkJCQkJCQkJVmFsaWQgZnJlcXVlbmN5IHZhbHVlcyBhcmU6CgkgKgkJCQkJCQkJCQkxCUFubnVhbAoJICoJCQkJCQkJCQkJMglTZW1pLUFubnVhbAoJICoJCQkJCQkJCQkJNAlRdWFydGVybHkKCSAqCQkJCQkJCQkJSWYgd29ya2luZyBpbiBHbnVtZXJpYyBNb2RlLCB0aGUgZm9sbG93aW5nIGZyZXF1ZW5jeSBvcHRpb25zIGFyZQoJICoJCQkJCQkJCQlhbHNvIGF2YWlsYWJsZQoJICoJCQkJCQkJCQkJNglCaW1vbnRobHkKCSAqCQkJCQkJCQkJCTEyCU1vbnRobHkKCSAqIEBwYXJhbQlpbnRlZ2VyCQliYXNpcwkJVGhlIHR5cGUgb2YgZGF5IGNvdW50IHRvIHVzZS4KCSAqCQkJCQkJCQkJCTAgb3Igb21pdHRlZAlVUyAoTkFTRCkgMzAvMzYwCgkgKgkJCQkJCQkJCQkxCQkJCUFjdHVhbC9hY3R1YWwKCSAqCQkJCQkJCQkJCTIJCQkJQWN0dWFsLzM2MAoJICoJCQkJCQkJCQkJMwkJCQlBY3R1YWwvMzY1CgkgKgkJCQkJCQkJCQk0CQkJCUV1cm9wZWFuIDMwLzM2MAoJICogQHJldHVybglmbG9hdAoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIENPVVBEQVlTTkMoJHNldHRsZW1lbnQsICRtYXR1cml0eSwgJGZyZXF1ZW5jeSwgJGJhc2lzPTApIHsKCQkkc2V0dGxlbWVudAk9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlblNpbmdsZVZhbHVlKCRzZXR0bGVtZW50KTsKCQkkbWF0dXJpdHkJPSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5TaW5nbGVWYWx1ZSgkbWF0dXJpdHkpOwoJCSRmcmVxdWVuY3kJPSAoaW50KSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5TaW5nbGVWYWx1ZSgkZnJlcXVlbmN5KTsKCQkkYmFzaXMJCT0gKGlzX251bGwoJGJhc2lzKSkJPyAwIDoJKGludCkgUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuU2luZ2xlVmFsdWUoJGJhc2lzKTsKCgkJaWYgKGlzX3N0cmluZygkc2V0dGxlbWVudCA9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0RhdGVUaW1lOjpfZ2V0RGF0ZVZhbHVlKCRzZXR0bGVtZW50KSkpIHsKCQkJcmV0dXJuIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6VkFMVUUoKTsKCQl9CgkJaWYgKGlzX3N0cmluZygkbWF0dXJpdHkgPSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9EYXRlVGltZTo6X2dldERhdGVWYWx1ZSgkbWF0dXJpdHkpKSkgewoJCQlyZXR1cm4gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpWQUxVRSgpOwoJCX0KCgkJaWYgKCgkc2V0dGxlbWVudCA+ICRtYXR1cml0eSkgfHwKCQkJKCFzZWxmOjpfdmFsaWRGcmVxdWVuY3koJGZyZXF1ZW5jeSkpIHx8CgkJCSgoJGJhc2lzIDwgMCkgfHwgKCRiYXNpcyA+IDQpKSkgewoJCQlyZXR1cm4gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpOYU4oKTsKCQl9CgoJCSRkYXlzUGVyWWVhciA9IHNlbGY6Ol9kYXlzUGVyWWVhcihQSFBFeGNlbF9DYWxjdWxhdGlvbl9EYXRlVGltZTo6WUVBUigkc2V0dGxlbWVudCksJGJhc2lzKTsKCQkkbmV4dCA9IHNlbGY6Ol9jb3VwRmlyc3RQZXJpb2REYXRlKCRzZXR0bGVtZW50LCAkbWF0dXJpdHksICRmcmVxdWVuY3ksIFRydWUpOwoKCQlyZXR1cm4gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRGF0ZVRpbWU6OllFQVJGUkFDKCRzZXR0bGVtZW50LCAkbmV4dCwgJGJhc2lzKSAqICRkYXlzUGVyWWVhcjsKCX0JLy8JZnVuY3Rpb24gQ09VUERBWVNOQygpCgoKCS8qKgoJICogQ09VUE5DRAoJICoKCSAqIFJldHVybnMgdGhlIG5leHQgY291cG9uIGRhdGUgYWZ0ZXIgdGhlIHNldHRsZW1lbnQgZGF0ZS4KCSAqCgkgKiBFeGNlbCBGdW5jdGlvbjoKCSAqCQlDT1VQTkNEKHNldHRsZW1lbnQsbWF0dXJpdHksZnJlcXVlbmN5WyxiYXNpc10pCgkgKgoJICogQGFjY2VzcwlwdWJsaWMKCSAqIEBjYXRlZ29yeSBGaW5hbmNpYWwgRnVuY3Rpb25zCgkgKiBAcGFyYW0JbWl4ZWQJc2V0dGxlbWVudAlUaGUgc2VjdXJpdHkncyBzZXR0bGVtZW50IGRhdGUuCgkgKgkJCQkJCQkJVGhlIHNlY3VyaXR5IHNldHRsZW1lbnQgZGF0ZSBpcyB0aGUgZGF0ZSBhZnRlciB0aGUgaXNzdWUKCSAqCQkJCQkJCQlkYXRlIHdoZW4gdGhlIHNlY3VyaXR5IGlzIHRyYWRlZCB0byB0aGUgYnV5ZXIuCgkgKiBAcGFyYW0JbWl4ZWQJbWF0dXJpdHkJVGhlIHNlY3VyaXR5J3MgbWF0dXJpdHkgZGF0ZS4KCSAqCQkJCQkJCQlUaGUgbWF0dXJpdHkgZGF0ZSBpcyB0aGUgZGF0ZSB3aGVuIHRoZSBzZWN1cml0eSBleHBpcmVzLgoJICogQHBhcmFtCW1peGVkCWZyZXF1ZW5jeQl0aGUgbnVtYmVyIG9mIGNvdXBvbiBwYXltZW50cyBwZXIgeWVhci4KCSAqCQkJCQkJCQkJVmFsaWQgZnJlcXVlbmN5IHZhbHVlcyBhcmU6CgkgKgkJCQkJCQkJCQkxCUFubnVhbAoJICoJCQkJCQkJCQkJMglTZW1pLUFubnVhbAoJICoJCQkJCQkJCQkJNAlRdWFydGVybHkKCSAqCQkJCQkJCQkJSWYgd29ya2luZyBpbiBHbnVtZXJpYyBNb2RlLCB0aGUgZm9sbG93aW5nIGZyZXF1ZW5jeSBvcHRpb25zIGFyZQoJICoJCQkJCQkJCQlhbHNvIGF2YWlsYWJsZQoJICoJCQkJCQkJCQkJNglCaW1vbnRobHkKCSAqCQkJCQkJCQkJCTEyCU1vbnRobHkKCSAqIEBwYXJhbQlpbnRlZ2VyCQliYXNpcwkJVGhlIHR5cGUgb2YgZGF5IGNvdW50IHRvIHVzZS4KCSAqCQkJCQkJCQkJCTAgb3Igb21pdHRlZAlVUyAoTkFTRCkgMzAvMzYwCgkgKgkJCQkJCQkJCQkxCQkJCUFjdHVhbC9hY3R1YWwKCSAqCQkJCQkJCQkJCTIJCQkJQWN0dWFsLzM2MAoJICoJCQkJCQkJCQkJMwkJCQlBY3R1YWwvMzY1CgkgKgkJCQkJCQkJCQk0CQkJCUV1cm9wZWFuIDMwLzM2MAoJICogQHJldHVybgltaXhlZAlFeGNlbCBkYXRlL3RpbWUgc2VyaWFsIHZhbHVlLCBQSFAgZGF0ZS90aW1lIHNlcmlhbCB2YWx1ZSBvciBQSFAgZGF0ZS90aW1lIG9iamVjdCwKCSAqCQkJCQkJZGVwZW5kaW5nIG9uIHRoZSB2YWx1ZSBvZiB0aGUgUmV0dXJuRGF0ZVR5cGUgZmxhZwoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIENPVVBOQ0QoJHNldHRsZW1lbnQsICRtYXR1cml0eSwgJGZyZXF1ZW5jeSwgJGJhc2lzPTApIHsKCQkkc2V0dGxlbWVudAk9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlblNpbmdsZVZhbHVlKCRzZXR0bGVtZW50KTsKCQkkbWF0dXJpdHkJPSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5TaW5nbGVWYWx1ZSgkbWF0dXJpdHkpOwoJCSRmcmVxdWVuY3kJPSAoaW50KSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5TaW5nbGVWYWx1ZSgkZnJlcXVlbmN5KTsKCQkkYmFzaXMJCT0gKGlzX251bGwoJGJhc2lzKSkJPyAwIDoJKGludCkgUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuU2luZ2xlVmFsdWUoJGJhc2lzKTsKCgkJaWYgKGlzX3N0cmluZygkc2V0dGxlbWVudCA9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0RhdGVUaW1lOjpfZ2V0RGF0ZVZhbHVlKCRzZXR0bGVtZW50KSkpIHsKCQkJcmV0dXJuIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6VkFMVUUoKTsKCQl9CgkJaWYgKGlzX3N0cmluZygkbWF0dXJpdHkgPSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9EYXRlVGltZTo6X2dldERhdGVWYWx1ZSgkbWF0dXJpdHkpKSkgewoJCQlyZXR1cm4gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpWQUxVRSgpOwoJCX0KCgkJaWYgKCgkc2V0dGxlbWVudCA+ICRtYXR1cml0eSkgfHwKCQkJKCFzZWxmOjpfdmFsaWRGcmVxdWVuY3koJGZyZXF1ZW5jeSkpIHx8CgkJCSgoJGJhc2lzIDwgMCkgfHwgKCRiYXNpcyA+IDQpKSkgewoJCQlyZXR1cm4gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpOYU4oKTsKCQl9CgoJCXJldHVybiBzZWxmOjpfY291cEZpcnN0UGVyaW9kRGF0ZSgkc2V0dGxlbWVudCwgJG1hdHVyaXR5LCAkZnJlcXVlbmN5LCBUcnVlKTsKCX0JLy8JZnVuY3Rpb24gQ09VUE5DRCgpCgoKCS8qKgoJICogQ09VUE5VTQoJICoKCSAqIFJldHVybnMgdGhlIG51bWJlciBvZiBjb3Vwb25zIHBheWFibGUgYmV0d2VlbiB0aGUgc2V0dGxlbWVudCBkYXRlIGFuZCBtYXR1cml0eSBkYXRlLAoJICogcm91bmRlZCB1cCB0byB0aGUgbmVhcmVzdCB3aG9sZSBjb3Vwb24uCgkgKgoJICogRXhjZWwgRnVuY3Rpb246CgkgKgkJQ09VUE5VTShzZXR0bGVtZW50LG1hdHVyaXR5LGZyZXF1ZW5jeVssYmFzaXNdKQoJICoKCSAqIEBhY2Nlc3MJcHVibGljCgkgKiBAY2F0ZWdvcnkgRmluYW5jaWFsIEZ1bmN0aW9ucwoJICogQHBhcmFtCW1peGVkCXNldHRsZW1lbnQJVGhlIHNlY3VyaXR5J3Mgc2V0dGxlbWVudCBkYXRlLgoJICoJCQkJCQkJCVRoZSBzZWN1cml0eSBzZXR0bGVtZW50IGRhdGUgaXMgdGhlIGRhdGUgYWZ0ZXIgdGhlIGlzc3VlCgkgKgkJCQkJCQkJZGF0ZSB3aGVuIHRoZSBzZWN1cml0eSBpcyB0cmFkZWQgdG8gdGhlIGJ1eWVyLgoJICogQHBhcmFtCW1peGVkCW1hdHVyaXR5CVRoZSBzZWN1cml0eSdzIG1hdHVyaXR5IGRhdGUuCgkgKgkJCQkJCQkJVGhlIG1hdHVyaXR5IGRhdGUgaXMgdGhlIGRhdGUgd2hlbiB0aGUgc2VjdXJpdHkgZXhwaXJlcy4KCSAqIEBwYXJhbQltaXhlZAlmcmVxdWVuY3kJdGhlIG51bWJlciBvZiBjb3Vwb24gcGF5bWVudHMgcGVyIHllYXIuCgkgKgkJCQkJCQkJCVZhbGlkIGZyZXF1ZW5jeSB2YWx1ZXMgYXJlOgoJICoJCQkJCQkJCQkJMQlBbm51YWwKCSAqCQkJCQkJCQkJCTIJU2VtaS1Bbm51YWwKCSAqCQkJCQkJCQkJCTQJUXVhcnRlcmx5CgkgKgkJCQkJCQkJCUlmIHdvcmtpbmcgaW4gR251bWVyaWMgTW9kZSwgdGhlIGZvbGxvd2luZyBmcmVxdWVuY3kgb3B0aW9ucyBhcmUKCSAqCQkJCQkJCQkJYWxzbyBhdmFpbGFibGUKCSAqCQkJCQkJCQkJCTYJQmltb250aGx5CgkgKgkJCQkJCQkJCQkxMglNb250aGx5CgkgKiBAcGFyYW0JaW50ZWdlcgkJYmFzaXMJCVRoZSB0eXBlIG9mIGRheSBjb3VudCB0byB1c2UuCgkgKgkJCQkJCQkJCQkwIG9yIG9taXR0ZWQJVVMgKE5BU0QpIDMwLzM2MAoJICoJCQkJCQkJCQkJMQkJCQlBY3R1YWwvYWN0dWFsCgkgKgkJCQkJCQkJCQkyCQkJCUFjdHVhbC8zNjAKCSAqCQkJCQkJCQkJCTMJCQkJQWN0dWFsLzM2NQoJICoJCQkJCQkJCQkJNAkJCQlFdXJvcGVhbiAzMC8zNjAKCSAqIEByZXR1cm4JaW50ZWdlcgoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIENPVVBOVU0oJHNldHRsZW1lbnQsICRtYXR1cml0eSwgJGZyZXF1ZW5jeSwgJGJhc2lzPTApIHsKCQkkc2V0dGxlbWVudAk9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlblNpbmdsZVZhbHVlKCRzZXR0bGVtZW50KTsKCQkkbWF0dXJpdHkJPSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5TaW5nbGVWYWx1ZSgkbWF0dXJpdHkpOwoJCSRmcmVxdWVuY3kJPSAoaW50KSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5TaW5nbGVWYWx1ZSgkZnJlcXVlbmN5KTsKCQkkYmFzaXMJCT0gKGlzX251bGwoJGJhc2lzKSkJPyAwIDoJKGludCkgUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuU2luZ2xlVmFsdWUoJGJhc2lzKTsKCgkJaWYgKGlzX3N0cmluZygkc2V0dGxlbWVudCA9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0RhdGVUaW1lOjpfZ2V0RGF0ZVZhbHVlKCRzZXR0bGVtZW50KSkpIHsKCQkJcmV0dXJuIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6VkFMVUUoKTsKCQl9CgkJaWYgKGlzX3N0cmluZygkbWF0dXJpdHkgPSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9EYXRlVGltZTo6X2dldERhdGVWYWx1ZSgkbWF0dXJpdHkpKSkgewoJCQlyZXR1cm4gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpWQUxVRSgpOwoJCX0KCgkJaWYgKCgkc2V0dGxlbWVudCA+ICRtYXR1cml0eSkgfHwKCQkJKCFzZWxmOjpfdmFsaWRGcmVxdWVuY3koJGZyZXF1ZW5jeSkpIHx8CgkJCSgoJGJhc2lzIDwgMCkgfHwgKCRiYXNpcyA+IDQpKSkgewoJCQlyZXR1cm4gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpOYU4oKTsKCQl9CgoJCSRzZXR0bGVtZW50ID0gc2VsZjo6X2NvdXBGaXJzdFBlcmlvZERhdGUoJHNldHRsZW1lbnQsICRtYXR1cml0eSwgJGZyZXF1ZW5jeSwgVHJ1ZSk7CgkJJGRheXNCZXR3ZWVuU2V0dGxlbWVudEFuZE1hdHVyaXR5ID0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRGF0ZVRpbWU6OllFQVJGUkFDKCRzZXR0bGVtZW50LCAkbWF0dXJpdHksICRiYXNpcykgKiAzNjU7CgoJCXN3aXRjaCAoJGZyZXF1ZW5jeSkgewoJCQljYXNlIDE6IC8vIGFubnVhbCBwYXltZW50cwoJCQkJCXJldHVybiBjZWlsKCRkYXlzQmV0d2VlblNldHRsZW1lbnRBbmRNYXR1cml0eSAvIDM2MCk7CgkJCWNhc2UgMjogLy8gaGFsZi15ZWFybHkKCQkJCQlyZXR1cm4gY2VpbCgkZGF5c0JldHdlZW5TZXR0bGVtZW50QW5kTWF0dXJpdHkgLyAxODApOwoJCQljYXNlIDQ6IC8vIHF1YXJ0ZXJseQoJCQkJCXJldHVybiBjZWlsKCRkYXlzQmV0d2VlblNldHRsZW1lbnRBbmRNYXR1cml0eSAvIDkwKTsKCQkJY2FzZSA2OiAvLyBiaW1vbnRobHkKCQkJCQlyZXR1cm4gY2VpbCgkZGF5c0JldHdlZW5TZXR0bGVtZW50QW5kTWF0dXJpdHkgLyA2MCk7CgkJCWNhc2UgMTI6IC8vIG1vbnRobHkKCQkJCQlyZXR1cm4gY2VpbCgkZGF5c0JldHdlZW5TZXR0bGVtZW50QW5kTWF0dXJpdHkgLyAzMCk7CgkJfQoJCXJldHVybiBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OlZBTFVFKCk7Cgl9CS8vCWZ1bmN0aW9uIENPVVBOVU0oKQoKCgkvKioKCSAqIENPVVBQQ0QKCSAqCgkgKiBSZXR1cm5zIHRoZSBwcmV2aW91cyBjb3Vwb24gZGF0ZSBiZWZvcmUgdGhlIHNldHRsZW1lbnQgZGF0ZS4KCSAqCgkgKiBFeGNlbCBGdW5jdGlvbjoKCSAqCQlDT1VQUENEKHNldHRsZW1lbnQsbWF0dXJpdHksZnJlcXVlbmN5WyxiYXNpc10pCgkgKgoJICogQGFjY2VzcwlwdWJsaWMKCSAqIEBjYXRlZ29yeSBGaW5hbmNpYWwgRnVuY3Rpb25zCgkgKiBAcGFyYW0JbWl4ZWQJc2V0dGxlbWVudAlUaGUgc2VjdXJpdHkncyBzZXR0bGVtZW50IGRhdGUuCgkgKgkJCQkJCQkJVGhlIHNlY3VyaXR5IHNldHRsZW1lbnQgZGF0ZSBpcyB0aGUgZGF0ZSBhZnRlciB0aGUgaXNzdWUKCSAqCQkJCQkJCQlkYXRlIHdoZW4gdGhlIHNlY3VyaXR5IGlzIHRyYWRlZCB0byB0aGUgYnV5ZXIuCgkgKiBAcGFyYW0JbWl4ZWQJbWF0dXJpdHkJVGhlIHNlY3VyaXR5J3MgbWF0dXJpdHkgZGF0ZS4KCSAqCQkJCQkJCQlUaGUgbWF0dXJpdHkgZGF0ZSBpcyB0aGUgZGF0ZSB3aGVuIHRoZSBzZWN1cml0eSBleHBpcmVzLgoJICogQHBhcmFtCW1peGVkCWZyZXF1ZW5jeQl0aGUgbnVtYmVyIG9mIGNvdXBvbiBwYXltZW50cyBwZXIgeWVhci4KCSAqCQkJCQkJCQkJVmFsaWQgZnJlcXVlbmN5IHZhbHVlcyBhcmU6CgkgKgkJCQkJCQkJCQkxCUFubnVhbAoJICoJCQkJCQkJCQkJMglTZW1pLUFubnVhbAoJICoJCQkJCQkJCQkJNAlRdWFydGVybHkKCSAqCQkJCQkJCQkJSWYgd29ya2luZyBpbiBHbnVtZXJpYyBNb2RlLCB0aGUgZm9sbG93aW5nIGZyZXF1ZW5jeSBvcHRpb25zIGFyZQoJICoJCQkJCQkJCQlhbHNvIGF2YWlsYWJsZQoJICoJCQkJCQkJCQkJNglCaW1vbnRobHkKCSAqCQkJCQkJCQkJCTEyCU1vbnRobHkKCSAqIEBwYXJhbQlpbnRlZ2VyCQliYXNpcwkJVGhlIHR5cGUgb2YgZGF5IGNvdW50IHRvIHVzZS4KCSAqCQkJCQkJCQkJCTAgb3Igb21pdHRlZAlVUyAoTkFTRCkgMzAvMzYwCgkgKgkJCQkJCQkJCQkxCQkJCUFjdHVhbC9hY3R1YWwKCSAqCQkJCQkJCQkJCTIJCQkJQWN0dWFsLzM2MAoJICoJCQkJCQkJCQkJMwkJCQlBY3R1YWwvMzY1CgkgKgkJCQkJCQkJCQk0CQkJCUV1cm9wZWFuIDMwLzM2MAoJICogQHJldHVybgltaXhlZAlFeGNlbCBkYXRlL3RpbWUgc2VyaWFsIHZhbHVlLCBQSFAgZGF0ZS90aW1lIHNlcmlhbCB2YWx1ZSBvciBQSFAgZGF0ZS90aW1lIG9iamVjdCwKCSAqCQkJCQkJZGVwZW5kaW5nIG9uIHRoZSB2YWx1ZSBvZiB0aGUgUmV0dXJuRGF0ZVR5cGUgZmxhZwoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIENPVVBQQ0QoJHNldHRsZW1lbnQsICRtYXR1cml0eSwgJGZyZXF1ZW5jeSwgJGJhc2lzPTApIHsKCQkkc2V0dGxlbWVudAk9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlblNpbmdsZVZhbHVlKCRzZXR0bGVtZW50KTsKCQkkbWF0dXJpdHkJPSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5TaW5nbGVWYWx1ZSgkbWF0dXJpdHkpOwoJCSRmcmVxdWVuY3kJPSAoaW50KSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5TaW5nbGVWYWx1ZSgkZnJlcXVlbmN5KTsKCQkkYmFzaXMJCT0gKGlzX251bGwoJGJhc2lzKSkJPyAwIDoJKGludCkgUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuU2luZ2xlVmFsdWUoJGJhc2lzKTsKCgkJaWYgKGlzX3N0cmluZygkc2V0dGxlbWVudCA9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0RhdGVUaW1lOjpfZ2V0RGF0ZVZhbHVlKCRzZXR0bGVtZW50KSkpIHsKCQkJcmV0dXJuIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6VkFMVUUoKTsKCQl9CgkJaWYgKGlzX3N0cmluZygkbWF0dXJpdHkgPSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9EYXRlVGltZTo6X2dldERhdGVWYWx1ZSgkbWF0dXJpdHkpKSkgewoJCQlyZXR1cm4gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpWQUxVRSgpOwoJCX0KCgkJaWYgKCgkc2V0dGxlbWVudCA+ICRtYXR1cml0eSkgfHwKCQkJKCFzZWxmOjpfdmFsaWRGcmVxdWVuY3koJGZyZXF1ZW5jeSkpIHx8CgkJCSgoJGJhc2lzIDwgMCkgfHwgKCRiYXNpcyA+IDQpKSkgewoJCQlyZXR1cm4gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpOYU4oKTsKCQl9CgoJCXJldHVybiBzZWxmOjpfY291cEZpcnN0UGVyaW9kRGF0ZSgkc2V0dGxlbWVudCwgJG1hdHVyaXR5LCAkZnJlcXVlbmN5LCBGYWxzZSk7Cgl9CS8vCWZ1bmN0aW9uIENPVVBQQ0QoKQoKCgkvKioKCSAqIENVTUlQTVQKCSAqCgkgKiBSZXR1cm5zIHRoZSBjdW11bGF0aXZlIGludGVyZXN0IHBhaWQgb24gYSBsb2FuIGJldHdlZW4gdGhlIHN0YXJ0IGFuZCBlbmQgcGVyaW9kcy4KCSAqCgkgKiBFeGNlbCBGdW5jdGlvbjoKCSAqCQlDVU1JUE1UKHJhdGUsbnBlcixwdixzdGFydCxlbmRbLHR5cGVdKQoJICoKCSAqIEBhY2Nlc3MJcHVibGljCgkgKiBAY2F0ZWdvcnkgRmluYW5jaWFsIEZ1bmN0aW9ucwoJICogQHBhcmFtCWZsb2F0CSRyYXRlCVRoZSBJbnRlcmVzdCByYXRlCgkgKiBAcGFyYW0JaW50ZWdlcgkkbnBlcglUaGUgdG90YWwgbnVtYmVyIG9mIHBheW1lbnQgcGVyaW9kcwoJICogQHBhcmFtCWZsb2F0CSRwdgkJUHJlc2VudCBWYWx1ZQoJICogQHBhcmFtCWludGVnZXIJJHN0YXJ0CVRoZSBmaXJzdCBwZXJpb2QgaW4gdGhlIGNhbGN1bGF0aW9uLgoJICoJCQkJCQkJUGF5bWVudCBwZXJpb2RzIGFyZSBudW1iZXJlZCBiZWdpbm5pbmcgd2l0aCAxLgoJICogQHBhcmFtCWludGVnZXIJJGVuZAlUaGUgbGFzdCBwZXJpb2QgaW4gdGhlIGNhbGN1bGF0aW9uLgoJICogQHBhcmFtCWludGVnZXIJJHR5cGUJQSBudW1iZXIgMCBvciAxIGFuZCBpbmRpY2F0ZXMgd2hlbiBwYXltZW50cyBhcmUgZHVlOgoJICoJCQkJCQkJCTAgb3Igb21pdHRlZAlBdCB0aGUgZW5kIG9mIHRoZSBwZXJpb2QuCgkgKgkJCQkJCQkJMQkJCQlBdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBwZXJpb2QuCgkgKiBAcmV0dXJuCWZsb2F0CgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gQ1VNSVBNVCgkcmF0ZSwgJG5wZXIsICRwdiwgJHN0YXJ0LCAkZW5kLCAkdHlwZSA9IDApIHsKCQkkcmF0ZQk9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlblNpbmdsZVZhbHVlKCRyYXRlKTsKCQkkbnBlcgk9IChpbnQpIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlblNpbmdsZVZhbHVlKCRucGVyKTsKCQkkcHYJCT0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuU2luZ2xlVmFsdWUoJHB2KTsKCQkkc3RhcnQJPSAoaW50KSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5TaW5nbGVWYWx1ZSgkc3RhcnQpOwoJCSRlbmQJPSAoaW50KSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5TaW5nbGVWYWx1ZSgkZW5kKTsKCQkkdHlwZQk9IChpbnQpIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlblNpbmdsZVZhbHVlKCR0eXBlKTsKCgkJLy8gVmFsaWRhdGUgcGFyYW1ldGVycwoJCWlmICgkdHlwZSAhPSAwICYmICR0eXBlICE9IDEpIHsKCQkJcmV0dXJuIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6TmFOKCk7CgkJfQoJCWlmICgkc3RhcnQgPCAxIHx8ICRzdGFydCA+ICRlbmQpIHsKCQkJcmV0dXJuIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6VkFMVUUoKTsKCQl9CgoJCS8vIENhbGN1bGF0ZQoJCSRpbnRlcmVzdCA9IDA7CgkJZm9yICgkcGVyID0gJHN0YXJ0OyAkcGVyIDw9ICRlbmQ7ICsrJHBlcikgewoJCQkkaW50ZXJlc3QgKz0gc2VsZjo6SVBNVCgkcmF0ZSwgJHBlciwgJG5wZXIsICRwdiwgMCwgJHR5cGUpOwoJCX0KCgkJcmV0dXJuICRpbnRlcmVzdDsKCX0JLy8JZnVuY3Rpb24gQ1VNSVBNVCgpCgoKCS8qKgoJICogQ1VNUFJJTkMKCSAqCgkgKiBSZXR1cm5zIHRoZSBjdW11bGF0aXZlIHByaW5jaXBhbCBwYWlkIG9uIGEgbG9hbiBiZXR3ZWVuIHRoZSBzdGFydCBhbmQgZW5kIHBlcmlvZHMuCgkgKgoJICogRXhjZWwgRnVuY3Rpb246CgkgKgkJQ1VNUFJJTkMocmF0ZSxucGVyLHB2LHN0YXJ0LGVuZFssdHlwZV0pCgkgKgoJICogQGFjY2VzcwlwdWJsaWMKCSAqIEBjYXRlZ29yeSBGaW5hbmNpYWwgRnVuY3Rpb25zCgkgKiBAcGFyYW0JZmxvYXQJJHJhdGUJVGhlIEludGVyZXN0IHJhdGUKCSAqIEBwYXJhbQlpbnRlZ2VyCSRucGVyCVRoZSB0b3RhbCBudW1iZXIgb2YgcGF5bWVudCBwZXJpb2RzCgkgKiBAcGFyYW0JZmxvYXQJJHB2CQlQcmVzZW50IFZhbHVlCgkgKiBAcGFyYW0JaW50ZWdlcgkkc3RhcnQJVGhlIGZpcnN0IHBlcmlvZCBpbiB0aGUgY2FsY3VsYXRpb24uCgkgKgkJCQkJCQlQYXltZW50IHBlcmlvZHMgYXJlIG51bWJlcmVkIGJlZ2lubmluZyB3aXRoIDEuCgkgKiBAcGFyYW0JaW50ZWdlcgkkZW5kCVRoZSBsYXN0IHBlcmlvZCBpbiB0aGUgY2FsY3VsYXRpb24uCgkgKiBAcGFyYW0JaW50ZWdlcgkkdHlwZQlBIG51bWJlciAwIG9yIDEgYW5kIGluZGljYXRlcyB3aGVuIHBheW1lbnRzIGFyZSBkdWU6CgkgKgkJCQkJCQkJMCBvciBvbWl0dGVkCUF0IHRoZSBlbmQgb2YgdGhlIHBlcmlvZC4KCSAqCQkJCQkJCQkxCQkJCUF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHBlcmlvZC4KCSAqIEByZXR1cm4JZmxvYXQKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBDVU1QUklOQygkcmF0ZSwgJG5wZXIsICRwdiwgJHN0YXJ0LCAkZW5kLCAkdHlwZSA9IDApIHsKCQkkcmF0ZQk9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlblNpbmdsZVZhbHVlKCRyYXRlKTsKCQkkbnBlcgk9IChpbnQpIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlblNpbmdsZVZhbHVlKCRucGVyKTsKCQkkcHYJCT0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuU2luZ2xlVmFsdWUoJHB2KTsKCQkkc3RhcnQJPSAoaW50KSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5TaW5nbGVWYWx1ZSgkc3RhcnQpOwoJCSRlbmQJPSAoaW50KSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5TaW5nbGVWYWx1ZSgkZW5kKTsKCQkkdHlwZQk9IChpbnQpIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlblNpbmdsZVZhbHVlKCR0eXBlKTsKCgkJLy8gVmFsaWRhdGUgcGFyYW1ldGVycwoJCWlmICgkdHlwZSAhPSAwICYmICR0eXBlICE9IDEpIHsKCQkJcmV0dXJuIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6TmFOKCk7CgkJfQoJCWlmICgkc3RhcnQgPCAxIHx8ICRzdGFydCA+ICRlbmQpIHsKCQkJcmV0dXJuIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6VkFMVUUoKTsKCQl9CgoJCS8vIENhbGN1bGF0ZQoJCSRwcmluY2lwYWwgPSAwOwoJCWZvciAoJHBlciA9ICRzdGFydDsgJHBlciA8PSAkZW5kOyArKyRwZXIpIHsKCQkJJHByaW5jaXBhbCArPSBzZWxmOjpQUE1UKCRyYXRlLCAkcGVyLCAkbnBlciwgJHB2LCAwLCAkdHlwZSk7CgkJfQoKCQlyZXR1cm4gJHByaW5jaXBhbDsKCX0JLy8JZnVuY3Rpb24gQ1VNUFJJTkMoKQoKCgkvKioKCSAqIERCCgkgKgoJICogUmV0dXJucyB0aGUgZGVwcmVjaWF0aW9uIG9mIGFuIGFzc2V0IGZvciBhIHNwZWNpZmllZCBwZXJpb2QgdXNpbmcgdGhlCgkgKiBmaXhlZC1kZWNsaW5pbmcgYmFsYW5jZSBtZXRob2QuCgkgKiBUaGlzIGZvcm0gb2YgZGVwcmVjaWF0aW9uIGlzIHVzZWQgaWYgeW91IHdhbnQgdG8gZ2V0IGEgaGlnaGVyIGRlcHJlY2lhdGlvbiB2YWx1ZQoJICogYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgZGVwcmVjaWF0aW9uIChhcyBvcHBvc2VkIHRvIGxpbmVhciBkZXByZWNpYXRpb24pLiBUaGUKCSAqIGRlcHJlY2lhdGlvbiB2YWx1ZSBpcyByZWR1Y2VkIHdpdGggZXZlcnkgZGVwcmVjaWF0aW9uIHBlcmlvZCBieSB0aGUgZGVwcmVjaWF0aW9uCgkgKiBhbHJlYWR5IGRlZHVjdGVkIGZyb20gdGhlIGluaXRpYWwgY29zdC4KCSAqCgkgKiBFeGNlbCBGdW5jdGlvbjoKCSAqCQlEQihjb3N0LHNhbHZhZ2UsbGlmZSxwZXJpb2RbLG1vbnRoXSkKCSAqCgkgKiBAYWNjZXNzCXB1YmxpYwoJICogQGNhdGVnb3J5IEZpbmFuY2lhbCBGdW5jdGlvbnMKCSAqIEBwYXJhbQlmbG9hdAljb3N0CQlJbml0aWFsIGNvc3Qgb2YgdGhlIGFzc2V0LgoJICogQHBhcmFtCWZsb2F0CXNhbHZhZ2UJCVZhbHVlIGF0IHRoZSBlbmQgb2YgdGhlIGRlcHJlY2lhdGlvbi4KCSAqCQkJCQkJCQkoU29tZXRpbWVzIGNhbGxlZCB0aGUgc2FsdmFnZSB2YWx1ZSBvZiB0aGUgYXNzZXQpCgkgKiBAcGFyYW0JaW50ZWdlcglsaWZlCQlOdW1iZXIgb2YgcGVyaW9kcyBvdmVyIHdoaWNoIHRoZSBhc3NldCBpcyBkZXByZWNpYXRlZC4KCSAqCQkJCQkJCQkoU29tZXRpbWVzIGNhbGxlZCB0aGUgdXNlZnVsIGxpZmUgb2YgdGhlIGFzc2V0KQoJICogQHBhcmFtCWludGVnZXIJcGVyaW9kCQlUaGUgcGVyaW9kIGZvciB3aGljaCB5b3Ugd2FudCB0byBjYWxjdWxhdGUgdGhlCgkgKgkJCQkJCQkJZGVwcmVjaWF0aW9uLiBQZXJpb2QgbXVzdCB1c2UgdGhlIHNhbWUgdW5pdHMgYXMgbGlmZS4KCSAqIEBwYXJhbQlpbnRlZ2VyCW1vbnRoCQlOdW1iZXIgb2YgbW9udGhzIGluIHRoZSBmaXJzdCB5ZWFyLiBJZiBtb250aCBpcyBvbWl0dGVkLAoJICoJCQkJCQkJCWl0IGRlZmF1bHRzIHRvIDEyLgoJICogQHJldHVybglmbG9hdAoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIERCKCRjb3N0LCAkc2FsdmFnZSwgJGxpZmUsICRwZXJpb2QsICRtb250aD0xMikgewoJCSRjb3N0CQk9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlblNpbmdsZVZhbHVlKCRjb3N0KTsKCQkkc2FsdmFnZQk9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlblNpbmdsZVZhbHVlKCRzYWx2YWdlKTsKCQkkbGlmZQkJPSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5TaW5nbGVWYWx1ZSgkbGlmZSk7CgkJJHBlcmlvZAkJPSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5TaW5nbGVWYWx1ZSgkcGVyaW9kKTsKCQkkbW9udGgJCT0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuU2luZ2xlVmFsdWUoJG1vbnRoKTsKCgkJLy8JVmFsaWRhdGUKCQlpZiAoKGlzX251bWVyaWMoJGNvc3QpKSAmJiAoaXNfbnVtZXJpYygkc2FsdmFnZSkpICYmIChpc19udW1lcmljKCRsaWZlKSkgJiYgKGlzX251bWVyaWMoJHBlcmlvZCkpICYmIChpc19udW1lcmljKCRtb250aCkpKSB7CgkJCSRjb3N0CQk9IChmbG9hdCkgJGNvc3Q7CgkJCSRzYWx2YWdlCT0gKGZsb2F0KSAkc2FsdmFnZTsKCQkJJGxpZmUJCT0gKGludCkgJGxpZmU7CgkJCSRwZXJpb2QJCT0gKGludCkgJHBlcmlvZDsKCQkJJG1vbnRoCQk9IChpbnQpICRtb250aDsKCQkJaWYgKCRjb3N0ID09IDApIHsKCQkJCXJldHVybiAwLjA7CgkJCX0gZWxzZWlmICgoJGNvc3QgPCAwKSB8fCAoKCRzYWx2YWdlIC8gJGNvc3QpIDwgMCkgfHwgKCRsaWZlIDw9IDApIHx8ICgkcGVyaW9kIDwgMSkgfHwgKCRtb250aCA8IDEpKSB7CgkJCQlyZXR1cm4gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpOYU4oKTsKCQkJfQoJCQkvLwlTZXQgRml4ZWQgRGVwcmVjaWF0aW9uIFJhdGUKCQkJJGZpeGVkRGVwcmVjaWF0aW9uUmF0ZSA9IDEgLSBwb3coKCRzYWx2YWdlIC8gJGNvc3QpLCAoMSAvICRsaWZlKSk7CgkJCSRmaXhlZERlcHJlY2lhdGlvblJhdGUgPSByb3VuZCgkZml4ZWREZXByZWNpYXRpb25SYXRlLCAzKTsKCgkJCS8vCUxvb3AgdGhyb3VnaCBlYWNoIHBlcmlvZCBjYWxjdWxhdGluZyB0aGUgZGVwcmVjaWF0aW9uCgkJCSRwcmV2aW91c0RlcHJlY2lhdGlvbiA9IDA7CgkJCWZvciAoJHBlciA9IDE7ICRwZXIgPD0gJHBlcmlvZDsgKyskcGVyKSB7CgkJCQlpZiAoJHBlciA9PSAxKSB7CgkJCQkJJGRlcHJlY2lhdGlvbiA9ICRjb3N0ICogJGZpeGVkRGVwcmVjaWF0aW9uUmF0ZSAqICRtb250aCAvIDEyOwoJCQkJfSBlbHNlaWYgKCRwZXIgPT0gKCRsaWZlICsgMSkpIHsKCQkJCQkkZGVwcmVjaWF0aW9uID0gKCRjb3N0IC0gJHByZXZpb3VzRGVwcmVjaWF0aW9uKSAqICRmaXhlZERlcHJlY2lhdGlvblJhdGUgKiAoMTIgLSAkbW9udGgpIC8gMTI7CgkJCQl9IGVsc2UgewoJCQkJCSRkZXByZWNpYXRpb24gPSAoJGNvc3QgLSAkcHJldmlvdXNEZXByZWNpYXRpb24pICogJGZpeGVkRGVwcmVjaWF0aW9uUmF0ZTsKCQkJCX0KCQkJCSRwcmV2aW91c0RlcHJlY2lhdGlvbiArPSAkZGVwcmVjaWF0aW9uOwoJCQl9CgkJCWlmIChQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmdldENvbXBhdGliaWxpdHlNb2RlKCkgPT0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpDT01QQVRJQklMSVRZX0dOVU1FUklDKSB7CgkJCQkkZGVwcmVjaWF0aW9uID0gcm91bmQoJGRlcHJlY2lhdGlvbiwyKTsKCQkJfQoJCQlyZXR1cm4gJGRlcHJlY2lhdGlvbjsKCQl9CgkJcmV0dXJuIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6VkFMVUUoKTsKCX0JLy8JZnVuY3Rpb24gREIoKQoKCgkvKioKCSAqIEREQgoJICoKCSAqIFJldHVybnMgdGhlIGRlcHJlY2lhdGlvbiBvZiBhbiBhc3NldCBmb3IgYSBzcGVjaWZpZWQgcGVyaW9kIHVzaW5nIHRoZQoJICogZG91YmxlLWRlY2xpbmluZyBiYWxhbmNlIG1ldGhvZCBvciBzb21lIG90aGVyIG1ldGhvZCB5b3Ugc3BlY2lmeS4KCSAqCgkgKiBFeGNlbCBGdW5jdGlvbjoKCSAqCQlEREIoY29zdCxzYWx2YWdlLGxpZmUscGVyaW9kWyxmYWN0b3JdKQoJICoKCSAqIEBhY2Nlc3MJcHVibGljCgkgKiBAY2F0ZWdvcnkgRmluYW5jaWFsIEZ1bmN0aW9ucwoJICogQHBhcmFtCWZsb2F0CWNvc3QJCUluaXRpYWwgY29zdCBvZiB0aGUgYXNzZXQuCgkgKiBAcGFyYW0JZmxvYXQJc2FsdmFnZQkJVmFsdWUgYXQgdGhlIGVuZCBvZiB0aGUgZGVwcmVjaWF0aW9uLgoJICoJCQkJCQkJCShTb21ldGltZXMgY2FsbGVkIHRoZSBzYWx2YWdlIHZhbHVlIG9mIHRoZSBhc3NldCkKCSAqIEBwYXJhbQlpbnRlZ2VyCWxpZmUJCU51bWJlciBvZiBwZXJpb2RzIG92ZXIgd2hpY2ggdGhlIGFzc2V0IGlzIGRlcHJlY2lhdGVkLgoJICoJCQkJCQkJCShTb21ldGltZXMgY2FsbGVkIHRoZSB1c2VmdWwgbGlmZSBvZiB0aGUgYXNzZXQpCgkgKiBAcGFyYW0JaW50ZWdlcglwZXJpb2QJCVRoZSBwZXJpb2QgZm9yIHdoaWNoIHlvdSB3YW50IHRvIGNhbGN1bGF0ZSB0aGUKCSAqCQkJCQkJCQlkZXByZWNpYXRpb24uIFBlcmlvZCBtdXN0IHVzZSB0aGUgc2FtZSB1bml0cyBhcyBsaWZlLgoJICogQHBhcmFtCWZsb2F0CWZhY3RvcgkJVGhlIHJhdGUgYXQgd2hpY2ggdGhlIGJhbGFuY2UgZGVjbGluZXMuCgkgKgkJCQkJCQkJSWYgZmFjdG9yIGlzIG9taXR0ZWQsIGl0IGlzIGFzc3VtZWQgdG8gYmUgMiAodGhlCgkgKgkJCQkJCQkJZG91YmxlLWRlY2xpbmluZyBiYWxhbmNlIG1ldGhvZCkuCgkgKiBAcmV0dXJuCWZsb2F0CgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gRERCKCRjb3N0LCAkc2FsdmFnZSwgJGxpZmUsICRwZXJpb2QsICRmYWN0b3I9Mi4wKSB7CgkJJGNvc3QJCT0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuU2luZ2xlVmFsdWUoJGNvc3QpOwoJCSRzYWx2YWdlCT0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuU2luZ2xlVmFsdWUoJHNhbHZhZ2UpOwoJCSRsaWZlCQk9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlblNpbmdsZVZhbHVlKCRsaWZlKTsKCQkkcGVyaW9kCQk9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlblNpbmdsZVZhbHVlKCRwZXJpb2QpOwoJCSRmYWN0b3IJCT0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuU2luZ2xlVmFsdWUoJGZhY3Rvcik7CgoJCS8vCVZhbGlkYXRlCgkJaWYgKChpc19udW1lcmljKCRjb3N0KSkgJiYgKGlzX251bWVyaWMoJHNhbHZhZ2UpKSAmJiAoaXNfbnVtZXJpYygkbGlmZSkpICYmIChpc19udW1lcmljKCRwZXJpb2QpKSAmJiAoaXNfbnVtZXJpYygkZmFjdG9yKSkpIHsKCQkJJGNvc3QJCT0gKGZsb2F0KSAkY29zdDsKCQkJJHNhbHZhZ2UJPSAoZmxvYXQpICRzYWx2YWdlOwoJCQkkbGlmZQkJPSAoaW50KSAkbGlmZTsKCQkJJHBlcmlvZAkJPSAoaW50KSAkcGVyaW9kOwoJCQkkZmFjdG9yCQk9IChmbG9hdCkgJGZhY3RvcjsKCQkJaWYgKCgkY29zdCA8PSAwKSB8fCAoKCRzYWx2YWdlIC8gJGNvc3QpIDwgMCkgfHwgKCRsaWZlIDw9IDApIHx8ICgkcGVyaW9kIDwgMSkgfHwgKCRmYWN0b3IgPD0gMC4wKSB8fCAoJHBlcmlvZCA+ICRsaWZlKSkgewoJCQkJcmV0dXJuIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6TmFOKCk7CgkJCX0KCQkJLy8JU2V0IEZpeGVkIERlcHJlY2lhdGlvbiBSYXRlCgkJCSRmaXhlZERlcHJlY2lhdGlvblJhdGUgPSAxIC0gcG93KCgkc2FsdmFnZSAvICRjb3N0KSwgKDEgLyAkbGlmZSkpOwoJCQkkZml4ZWREZXByZWNpYXRpb25SYXRlID0gcm91bmQoJGZpeGVkRGVwcmVjaWF0aW9uUmF0ZSwgMyk7CgoJCQkvLwlMb29wIHRocm91Z2ggZWFjaCBwZXJpb2QgY2FsY3VsYXRpbmcgdGhlIGRlcHJlY2lhdGlvbgoJCQkkcHJldmlvdXNEZXByZWNpYXRpb24gPSAwOwoJCQlmb3IgKCRwZXIgPSAxOyAkcGVyIDw9ICRwZXJpb2Q7ICsrJHBlcikgewoJCQkJJGRlcHJlY2lhdGlvbiA9IG1pbiggKCRjb3N0IC0gJHByZXZpb3VzRGVwcmVjaWF0aW9uKSAqICgkZmFjdG9yIC8gJGxpZmUpLCAoJGNvc3QgLSAkc2FsdmFnZSAtICRwcmV2aW91c0RlcHJlY2lhdGlvbikgKTsKCQkJCSRwcmV2aW91c0RlcHJlY2lhdGlvbiArPSAkZGVwcmVjaWF0aW9uOwoJCQl9CgkJCWlmIChQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmdldENvbXBhdGliaWxpdHlNb2RlKCkgPT0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpDT01QQVRJQklMSVRZX0dOVU1FUklDKSB7CgkJCQkkZGVwcmVjaWF0aW9uID0gcm91bmQoJGRlcHJlY2lhdGlvbiwyKTsKCQkJfQoJCQlyZXR1cm4gJGRlcHJlY2lhdGlvbjsKCQl9CgkJcmV0dXJuIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6VkFMVUUoKTsKCX0JLy8JZnVuY3Rpb24gRERCKCkKCgoJLyoqCgkgKiBESVNDCgkgKgoJICogUmV0dXJucyB0aGUgZGlzY291bnQgcmF0ZSBmb3IgYSBzZWN1cml0eS4KCSAqCgkgKiBFeGNlbCBGdW5jdGlvbjoKCSAqCQlESVNDKHNldHRsZW1lbnQsbWF0dXJpdHkscHJpY2UscmVkZW1wdGlvblssYmFzaXNdKQoJICoKCSAqIEBhY2Nlc3MJcHVibGljCgkgKiBAY2F0ZWdvcnkgRmluYW5jaWFsIEZ1bmN0aW9ucwoJICogQHBhcmFtCW1peGVkCXNldHRsZW1lbnQJVGhlIHNlY3VyaXR5J3Mgc2V0dGxlbWVudCBkYXRlLgoJICoJCQkJCQkJCVRoZSBzZWN1cml0eSBzZXR0bGVtZW50IGRhdGUgaXMgdGhlIGRhdGUgYWZ0ZXIgdGhlIGlzc3VlCgkgKgkJCQkJCQkJZGF0ZSB3aGVuIHRoZSBzZWN1cml0eSBpcyB0cmFkZWQgdG8gdGhlIGJ1eWVyLgoJICogQHBhcmFtCW1peGVkCW1hdHVyaXR5CVRoZSBzZWN1cml0eSdzIG1hdHVyaXR5IGRhdGUuCgkgKgkJCQkJCQkJVGhlIG1hdHVyaXR5IGRhdGUgaXMgdGhlIGRhdGUgd2hlbiB0aGUgc2VjdXJpdHkgZXhwaXJlcy4KCSAqIEBwYXJhbQlpbnRlZ2VyCXByaWNlCQlUaGUgc2VjdXJpdHkncyBwcmljZSBwZXIgJDEwMCBmYWNlIHZhbHVlLgoJICogQHBhcmFtCWludGVnZXIJcmVkZW1wdGlvbglUaGUgc2VjdXJpdHkncyByZWRlbXB0aW9uIHZhbHVlIHBlciAkMTAwIGZhY2UgdmFsdWUuCgkgKiBAcGFyYW0JaW50ZWdlcgliYXNpcwkJVGhlIHR5cGUgb2YgZGF5IGNvdW50IHRvIHVzZS4KCSAqCQkJCQkJCQkJCTAgb3Igb21pdHRlZAlVUyAoTkFTRCkgMzAvMzYwCgkgKgkJCQkJCQkJCQkxCQkJCUFjdHVhbC9hY3R1YWwKCSAqCQkJCQkJCQkJCTIJCQkJQWN0dWFsLzM2MAoJICoJCQkJCQkJCQkJMwkJCQlBY3R1YWwvMzY1CgkgKgkJCQkJCQkJCQk0CQkJCUV1cm9wZWFuIDMwLzM2MAoJICogQHJldHVybglmbG9hdAoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIERJU0MoJHNldHRsZW1lbnQsICRtYXR1cml0eSwgJHByaWNlLCAkcmVkZW1wdGlvbiwgJGJhc2lzPTApIHsKCQkkc2V0dGxlbWVudAk9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlblNpbmdsZVZhbHVlKCRzZXR0bGVtZW50KTsKCQkkbWF0dXJpdHkJPSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5TaW5nbGVWYWx1ZSgkbWF0dXJpdHkpOwoJCSRwcmljZQkJPSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5TaW5nbGVWYWx1ZSgkcHJpY2UpOwoJCSRyZWRlbXB0aW9uCT0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuU2luZ2xlVmFsdWUoJHJlZGVtcHRpb24pOwoJCSRiYXNpcwkJPSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5TaW5nbGVWYWx1ZSgkYmFzaXMpOwoKCQkvLwlWYWxpZGF0ZQoJCWlmICgoaXNfbnVtZXJpYygkcHJpY2UpKSAmJiAoaXNfbnVtZXJpYygkcmVkZW1wdGlvbikpICYmIChpc19udW1lcmljKCRiYXNpcykpKSB7CgkJCSRwcmljZQkJPSAoZmxvYXQpICRwcmljZTsKCQkJJHJlZGVtcHRpb24JPSAoZmxvYXQpICRyZWRlbXB0aW9uOwoJCQkkYmFzaXMJCT0gKGludCkgJGJhc2lzOwoJCQlpZiAoKCRwcmljZSA8PSAwKSB8fCAoJHJlZGVtcHRpb24gPD0gMCkpIHsKCQkJCXJldHVybiBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6Ok5hTigpOwoJCQl9CgkJCSRkYXlzQmV0d2VlblNldHRsZW1lbnRBbmRNYXR1cml0eSA9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0RhdGVUaW1lOjpZRUFSRlJBQygkc2V0dGxlbWVudCwgJG1hdHVyaXR5LCAkYmFzaXMpOwoJCQlpZiAoIWlzX251bWVyaWMoJGRheXNCZXR3ZWVuU2V0dGxlbWVudEFuZE1hdHVyaXR5KSkgewoJCQkJLy8JcmV0dXJuIGRhdGUgZXJyb3IKCQkJCXJldHVybiAkZGF5c0JldHdlZW5TZXR0bGVtZW50QW5kTWF0dXJpdHk7CgkJCX0KCgkJCXJldHVybiAoKDEgLSAkcHJpY2UgLyAkcmVkZW1wdGlvbikgLyAkZGF5c0JldHdlZW5TZXR0bGVtZW50QW5kTWF0dXJpdHkpOwoJCX0KCQlyZXR1cm4gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpWQUxVRSgpOwoJfQkvLwlmdW5jdGlvbiBESVNDKCkKCgoJLyoqCgkgKiBET0xMQVJERQoJICoKCSAqIENvbnZlcnRzIGEgZG9sbGFyIHByaWNlIGV4cHJlc3NlZCBhcyBhbiBpbnRlZ2VyIHBhcnQgYW5kIGEgZnJhY3Rpb24KCSAqCQlwYXJ0IGludG8gYSBkb2xsYXIgcHJpY2UgZXhwcmVzc2VkIGFzIGEgZGVjaW1hbCBudW1iZXIuCgkgKiBGcmFjdGlvbmFsIGRvbGxhciBudW1iZXJzIGFyZSBzb21ldGltZXMgdXNlZCBmb3Igc2VjdXJpdHkgcHJpY2VzLgoJICoKCSAqIEV4Y2VsIEZ1bmN0aW9uOgoJICoJCURPTExBUkRFKGZyYWN0aW9uYWxfZG9sbGFyLGZyYWN0aW9uKQoJICoKCSAqIEBhY2Nlc3MJcHVibGljCgkgKiBAY2F0ZWdvcnkgRmluYW5jaWFsIEZ1bmN0aW9ucwoJICogQHBhcmFtCWZsb2F0CSRmcmFjdGlvbmFsX2RvbGxhcglGcmFjdGlvbmFsIERvbGxhcgoJICogQHBhcmFtCWludGVnZXIJJGZyYWN0aW9uCQkJRnJhY3Rpb24KCSAqIEByZXR1cm4JZmxvYXQKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBET0xMQVJERSgkZnJhY3Rpb25hbF9kb2xsYXIgPSBOdWxsLCAkZnJhY3Rpb24gPSAwKSB7CgkJJGZyYWN0aW9uYWxfZG9sbGFyCT0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuU2luZ2xlVmFsdWUoJGZyYWN0aW9uYWxfZG9sbGFyKTsKCQkkZnJhY3Rpb24JCQk9IChpbnQpUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuU2luZ2xlVmFsdWUoJGZyYWN0aW9uKTsKCgkJLy8gVmFsaWRhdGUgcGFyYW1ldGVycwoJCWlmIChpc19udWxsKCRmcmFjdGlvbmFsX2RvbGxhcikgfHwgJGZyYWN0aW9uIDwgMCkgewoJCQlyZXR1cm4gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpOYU4oKTsKCQl9CgkJaWYgKCRmcmFjdGlvbiA9PSAwKSB7CgkJCXJldHVybiBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OkRJVjAoKTsKCQl9CgoJCSRkb2xsYXJzID0gZmxvb3IoJGZyYWN0aW9uYWxfZG9sbGFyKTsKCQkkY2VudHMgPSBmbW9kKCRmcmFjdGlvbmFsX2RvbGxhciwxKTsKCQkkY2VudHMgLz0gJGZyYWN0aW9uOwoJCSRjZW50cyAqPSBwb3coMTAsY2VpbChsb2cxMCgkZnJhY3Rpb24pKSk7CgkJcmV0dXJuICRkb2xsYXJzICsgJGNlbnRzOwoJfQkvLwlmdW5jdGlvbiBET0xMQVJERSgpCgoKCS8qKgoJICogRE9MTEFSRlIKCSAqCgkgKiBDb252ZXJ0cyBhIGRvbGxhciBwcmljZSBleHByZXNzZWQgYXMgYSBkZWNpbWFsIG51bWJlciBpbnRvIGEgZG9sbGFyIHByaWNlCgkgKgkJZXhwcmVzc2VkIGFzIGEgZnJhY3Rpb24uCgkgKiBGcmFjdGlvbmFsIGRvbGxhciBudW1iZXJzIGFyZSBzb21ldGltZXMgdXNlZCBmb3Igc2VjdXJpdHkgcHJpY2VzLgoJICoKCSAqIEV4Y2VsIEZ1bmN0aW9uOgoJICoJCURPTExBUkZSKGRlY2ltYWxfZG9sbGFyLGZyYWN0aW9uKQoJICoKCSAqIEBhY2Nlc3MJcHVibGljCgkgKiBAY2F0ZWdvcnkgRmluYW5jaWFsIEZ1bmN0aW9ucwoJICogQHBhcmFtCWZsb2F0CSRkZWNpbWFsX2RvbGxhcgkJRGVjaW1hbCBEb2xsYXIKCSAqIEBwYXJhbQlpbnRlZ2VyCSRmcmFjdGlvbgkJCUZyYWN0aW9uCgkgKiBAcmV0dXJuCWZsb2F0CgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gRE9MTEFSRlIoJGRlY2ltYWxfZG9sbGFyID0gTnVsbCwgJGZyYWN0aW9uID0gMCkgewoJCSRkZWNpbWFsX2RvbGxhcgk9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlblNpbmdsZVZhbHVlKCRkZWNpbWFsX2RvbGxhcik7CgkJJGZyYWN0aW9uCQk9IChpbnQpUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuU2luZ2xlVmFsdWUoJGZyYWN0aW9uKTsKCgkJLy8gVmFsaWRhdGUgcGFyYW1ldGVycwoJCWlmIChpc19udWxsKCRkZWNpbWFsX2RvbGxhcikgfHwgJGZyYWN0aW9uIDwgMCkgewoJCQlyZXR1cm4gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpOYU4oKTsKCQl9CgkJaWYgKCRmcmFjdGlvbiA9PSAwKSB7CgkJCXJldHVybiBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OkRJVjAoKTsKCQl9CgoJCSRkb2xsYXJzID0gZmxvb3IoJGRlY2ltYWxfZG9sbGFyKTsKCQkkY2VudHMgPSBmbW9kKCRkZWNpbWFsX2RvbGxhciwxKTsKCQkkY2VudHMgKj0gJGZyYWN0aW9uOwoJCSRjZW50cyAqPSBwb3coMTAsLWNlaWwobG9nMTAoJGZyYWN0aW9uKSkpOwoJCXJldHVybiAkZG9sbGFycyArICRjZW50czsKCX0JLy8JZnVuY3Rpb24gRE9MTEFSRlIoKQoKCgkvKioKCSAqIEVGRkVDVAoJICoKCSAqIFJldHVybnMgdGhlIGVmZmVjdGl2ZSBpbnRlcmVzdCByYXRlIGdpdmVuIHRoZSBub21pbmFsIHJhdGUgYW5kIHRoZSBudW1iZXIgb2YKCSAqCQljb21wb3VuZGluZyBwYXltZW50cyBwZXIgeWVhci4KCSAqCgkgKiBFeGNlbCBGdW5jdGlvbjoKCSAqCQlFRkZFQ1Qobm9taW5hbF9yYXRlLG5wZXJ5KQoJICoKCSAqIEBhY2Nlc3MJcHVibGljCgkgKiBAY2F0ZWdvcnkgRmluYW5jaWFsIEZ1bmN0aW9ucwoJICogQHBhcmFtCWZsb2F0CSRub21pbmFsX3JhdGUJCU5vbWluYWwgaW50ZXJlc3QgcmF0ZQoJICogQHBhcmFtCWludGVnZXIJJG5wZXJ5CQkJCU51bWJlciBvZiBjb21wb3VuZGluZyBwYXltZW50cyBwZXIgeWVhcgoJICogQHJldHVybglmbG9hdAoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIEVGRkVDVCgkbm9taW5hbF9yYXRlID0gMCwgJG5wZXJ5ID0gMCkgewoJCSRub21pbmFsX3JhdGUJPSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5TaW5nbGVWYWx1ZSgkbm9taW5hbF9yYXRlKTsKCQkkbnBlcnkJCQk9IChpbnQpUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuU2luZ2xlVmFsdWUoJG5wZXJ5KTsKCgkJLy8gVmFsaWRhdGUgcGFyYW1ldGVycwoJCWlmICgkbm9taW5hbF9yYXRlIDw9IDAgfHwgJG5wZXJ5IDwgMSkgewoJCQlyZXR1cm4gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpOYU4oKTsKCQl9CgoJCXJldHVybiBwb3coKDEgKyAkbm9taW5hbF9yYXRlIC8gJG5wZXJ5KSwgJG5wZXJ5KSAtIDE7Cgl9CS8vCWZ1bmN0aW9uIEVGRkVDVCgpCgoKCS8qKgoJICogRlYKCSAqCgkgKiBSZXR1cm5zIHRoZSBGdXR1cmUgVmFsdWUgb2YgYSBjYXNoIGZsb3cgd2l0aCBjb25zdGFudCBwYXltZW50cyBhbmQgaW50ZXJlc3QgcmF0ZSAoYW5udWl0aWVzKS4KCSAqCgkgKiBFeGNlbCBGdW5jdGlvbjoKCSAqCQlGVihyYXRlLG5wZXIscG10WyxwdlssdHlwZV1dKQoJICoKCSAqIEBhY2Nlc3MJcHVibGljCgkgKiBAY2F0ZWdvcnkgRmluYW5jaWFsIEZ1bmN0aW9ucwoJICogQHBhcmFtCWZsb2F0CSRyYXRlCVRoZSBpbnRlcmVzdCByYXRlIHBlciBwZXJpb2QKCSAqIEBwYXJhbQlpbnQJCSRucGVyCVRvdGFsIG51bWJlciBvZiBwYXltZW50IHBlcmlvZHMgaW4gYW4gYW5udWl0eQoJICogQHBhcmFtCWZsb2F0CSRwbXQJVGhlIHBheW1lbnQgbWFkZSBlYWNoIHBlcmlvZDogaXQgY2Fubm90IGNoYW5nZSBvdmVyIHRoZQoJICoJCQkJCQkJbGlmZSBvZiB0aGUgYW5udWl0eS4gVHlwaWNhbGx5LCBwbXQgY29udGFpbnMgcHJpbmNpcGFsCgkgKgkJCQkJCQlhbmQgaW50ZXJlc3QgYnV0IG5vIG90aGVyIGZlZXMgb3IgdGF4ZXMuCgkgKiBAcGFyYW0JZmxvYXQJJHB2CQlQcmVzZW50IFZhbHVlLCBvciB0aGUgbHVtcC1zdW0gYW1vdW50IHRoYXQgYSBzZXJpZXMgb2YKCSAqCQkJCQkJCWZ1dHVyZSBwYXltZW50cyBpcyB3b3J0aCByaWdodCBub3cuCgkgKiBAcGFyYW0JaW50ZWdlcgkkdHlwZQlBIG51bWJlciAwIG9yIDEgYW5kIGluZGljYXRlcyB3aGVuIHBheW1lbnRzIGFyZSBkdWU6CgkgKgkJCQkJCQkJMCBvciBvbWl0dGVkCUF0IHRoZSBlbmQgb2YgdGhlIHBlcmlvZC4KCSAqCQkJCQkJCQkxCQkJCUF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHBlcmlvZC4KCSAqIEByZXR1cm4JZmxvYXQKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBGVigkcmF0ZSA9IDAsICRucGVyID0gMCwgJHBtdCA9IDAsICRwdiA9IDAsICR0eXBlID0gMCkgewoJCSRyYXRlCT0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuU2luZ2xlVmFsdWUoJHJhdGUpOwoJCSRucGVyCT0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuU2luZ2xlVmFsdWUoJG5wZXIpOwoJCSRwbXQJPSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5TaW5nbGVWYWx1ZSgkcG10KTsKCQkkcHYJCT0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuU2luZ2xlVmFsdWUoJHB2KTsKCQkkdHlwZQk9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlblNpbmdsZVZhbHVlKCR0eXBlKTsKCgkJLy8gVmFsaWRhdGUgcGFyYW1ldGVycwoJCWlmICgkdHlwZSAhPSAwICYmICR0eXBlICE9IDEpIHsKCQkJcmV0dXJuIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6TmFOKCk7CgkJfQoKCQkvLyBDYWxjdWxhdGUKCQlpZiAoIWlzX251bGwoJHJhdGUpICYmICRyYXRlICE9IDApIHsKCQkJcmV0dXJuIC0kcHYgKiBwb3coMSArICRyYXRlLCAkbnBlcikgLSAkcG10ICogKDEgKyAkcmF0ZSAqICR0eXBlKSAqIChwb3coMSArICRyYXRlLCAkbnBlcikgLSAxKSAvICRyYXRlOwoJCX0gZWxzZSB7CgkJCXJldHVybiAtJHB2IC0gJHBtdCAqICRucGVyOwoJCX0KCX0JLy8JZnVuY3Rpb24gRlYoKQoKCgkvKioKCSAqIEZWU0NIRURVTEUKCSAqCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gRlZTQ0hFRFVMRSgkcHJpbmNpcGFsLCAkc2NoZWR1bGUpIHsKCQkkcHJpbmNpcGFsCT0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuU2luZ2xlVmFsdWUoJHByaW5jaXBhbCk7CgkJJHNjaGVkdWxlCT0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuQXJyYXkoJHNjaGVkdWxlKTsKCgkJZm9yZWFjaCgkc2NoZWR1bGUgYXMgJG4pIHsKCQkJJHByaW5jaXBhbCAqPSAxICsgJG47CgkJfQoKCQlyZXR1cm4gJHByaW5jaXBhbDsKCX0JLy8JZnVuY3Rpb24gRlZTQ0hFRFVMRSgpCgoKCS8qKgoJICogSU5UUkFURQoJICoKCSAqIFJldHVybnMgdGhlIGludGVyZXN0IHJhdGUgZm9yIGEgZnVsbHkgaW52ZXN0ZWQgc2VjdXJpdHkuCgkgKgoJICogRXhjZWwgRnVuY3Rpb246CgkgKgkJSU5UUkFURShzZXR0bGVtZW50LG1hdHVyaXR5LGludmVzdG1lbnQscmVkZW1wdGlvblssYmFzaXNdKQoJICoKCSAqIEBwYXJhbQltaXhlZAlzZXR0bGVtZW50CVRoZSBzZWN1cml0eSdzIHNldHRsZW1lbnQgZGF0ZS4KCSAqCQkJCQkJCQlUaGUgc2VjdXJpdHkgc2V0dGxlbWVudCBkYXRlIGlzIHRoZSBkYXRlIGFmdGVyIHRoZSBpc3N1ZSBkYXRlIHdoZW4gdGhlIHNlY3VyaXR5IGlzIHRyYWRlZCB0byB0aGUgYnV5ZXIuCgkgKiBAcGFyYW0JbWl4ZWQJbWF0dXJpdHkJVGhlIHNlY3VyaXR5J3MgbWF0dXJpdHkgZGF0ZS4KCSAqCQkJCQkJCQlUaGUgbWF0dXJpdHkgZGF0ZSBpcyB0aGUgZGF0ZSB3aGVuIHRoZSBzZWN1cml0eSBleHBpcmVzLgoJICogQHBhcmFtCWludGVnZXIJaW52ZXN0bWVudAlUaGUgYW1vdW50IGludmVzdGVkIGluIHRoZSBzZWN1cml0eS4KCSAqIEBwYXJhbQlpbnRlZ2VyCXJlZGVtcHRpb24JVGhlIGFtb3VudCB0byBiZSByZWNlaXZlZCBhdCBtYXR1cml0eS4KCSAqIEBwYXJhbQlpbnRlZ2VyCWJhc2lzCQlUaGUgdHlwZSBvZiBkYXkgY291bnQgdG8gdXNlLgoJICoJCQkJCQkJCQkJMCBvciBvbWl0dGVkCVVTIChOQVNEKSAzMC8zNjAKCSAqCQkJCQkJCQkJCTEJCQkJQWN0dWFsL2FjdHVhbAoJICoJCQkJCQkJCQkJMgkJCQlBY3R1YWwvMzYwCgkgKgkJCQkJCQkJCQkzCQkJCUFjdHVhbC8zNjUKCSAqCQkJCQkJCQkJCTQJCQkJRXVyb3BlYW4gMzAvMzYwCgkgKiBAcmV0dXJuCWZsb2F0CgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gSU5UUkFURSgkc2V0dGxlbWVudCwgJG1hdHVyaXR5LCAkaW52ZXN0bWVudCwgJHJlZGVtcHRpb24sICRiYXNpcz0wKSB7CgkJJHNldHRsZW1lbnQJPSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5TaW5nbGVWYWx1ZSgkc2V0dGxlbWVudCk7CgkJJG1hdHVyaXR5CT0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuU2luZ2xlVmFsdWUoJG1hdHVyaXR5KTsKCQkkaW52ZXN0bWVudAk9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlblNpbmdsZVZhbHVlKCRpbnZlc3RtZW50KTsKCQkkcmVkZW1wdGlvbgk9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlblNpbmdsZVZhbHVlKCRyZWRlbXB0aW9uKTsKCQkkYmFzaXMJCT0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuU2luZ2xlVmFsdWUoJGJhc2lzKTsKCgkJLy8JVmFsaWRhdGUKCQlpZiAoKGlzX251bWVyaWMoJGludmVzdG1lbnQpKSAmJiAoaXNfbnVtZXJpYygkcmVkZW1wdGlvbikpICYmIChpc19udW1lcmljKCRiYXNpcykpKSB7CgkJCSRpbnZlc3RtZW50CT0gKGZsb2F0KSAkaW52ZXN0bWVudDsKCQkJJHJlZGVtcHRpb24JPSAoZmxvYXQpICRyZWRlbXB0aW9uOwoJCQkkYmFzaXMJCT0gKGludCkgJGJhc2lzOwoJCQlpZiAoKCRpbnZlc3RtZW50IDw9IDApIHx8ICgkcmVkZW1wdGlvbiA8PSAwKSkgewoJCQkJcmV0dXJuIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6TmFOKCk7CgkJCX0KCQkJJGRheXNCZXR3ZWVuU2V0dGxlbWVudEFuZE1hdHVyaXR5ID0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRGF0ZVRpbWU6OllFQVJGUkFDKCRzZXR0bGVtZW50LCAkbWF0dXJpdHksICRiYXNpcyk7CgkJCWlmICghaXNfbnVtZXJpYygkZGF5c0JldHdlZW5TZXR0bGVtZW50QW5kTWF0dXJpdHkpKSB7CgkJCQkvLwlyZXR1cm4gZGF0ZSBlcnJvcgoJCQkJcmV0dXJuICRkYXlzQmV0d2VlblNldHRsZW1lbnRBbmRNYXR1cml0eTsKCQkJfQoKCQkJcmV0dXJuICgoJHJlZGVtcHRpb24gLyAkaW52ZXN0bWVudCkgLSAxKSAvICgkZGF5c0JldHdlZW5TZXR0bGVtZW50QW5kTWF0dXJpdHkpOwoJCX0KCQlyZXR1cm4gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpWQUxVRSgpOwoJfQkvLwlmdW5jdGlvbiBJTlRSQVRFKCkKCgoJLyoqCgkgKiBJUE1UCgkgKgoJICogUmV0dXJucyB0aGUgaW50ZXJlc3QgcGF5bWVudCBmb3IgYSBnaXZlbiBwZXJpb2QgZm9yIGFuIGludmVzdG1lbnQgYmFzZWQgb24gcGVyaW9kaWMsIGNvbnN0YW50IHBheW1lbnRzIGFuZCBhIGNvbnN0YW50IGludGVyZXN0IHJhdGUuCgkgKgoJICogQHBhcmFtCWZsb2F0CSRyYXRlCUludGVyZXN0IHJhdGUgcGVyIHBlcmlvZAoJICogQHBhcmFtCWludAkJJHBlcglQZXJpb2QgZm9yIHdoaWNoIHdlIHdhbnQgdG8gZmluZCB0aGUgaW50ZXJlc3QKCSAqIEBwYXJhbQlpbnQJCSRucGVyCU51bWJlciBvZiBwZXJpb2RzCgkgKiBAcGFyYW0JZmxvYXQJJHB2CQlQcmVzZW50IFZhbHVlCgkgKiBAcGFyYW0JZmxvYXQJJGZ2CQlGdXR1cmUgVmFsdWUKCSAqIEBwYXJhbQlpbnQJCSR0eXBlCVBheW1lbnQgdHlwZTogMCA9IGF0IHRoZSBlbmQgb2YgZWFjaCBwZXJpb2QsIDEgPSBhdCB0aGUgYmVnaW5uaW5nIG9mIGVhY2ggcGVyaW9kCgkgKiBAcmV0dXJuCWZsb2F0CgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gSVBNVCgkcmF0ZSwgJHBlciwgJG5wZXIsICRwdiwgJGZ2ID0gMCwgJHR5cGUgPSAwKSB7CgkJJHJhdGUJPSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5TaW5nbGVWYWx1ZSgkcmF0ZSk7CgkJJHBlcgk9IChpbnQpIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlblNpbmdsZVZhbHVlKCRwZXIpOwoJCSRucGVyCT0gKGludCkgUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuU2luZ2xlVmFsdWUoJG5wZXIpOwoJCSRwdgkJPSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5TaW5nbGVWYWx1ZSgkcHYpOwoJCSRmdgkJPSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5TaW5nbGVWYWx1ZSgkZnYpOwoJCSR0eXBlCT0gKGludCkgUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuU2luZ2xlVmFsdWUoJHR5cGUpOwoKCQkvLyBWYWxpZGF0ZSBwYXJhbWV0ZXJzCgkJaWYgKCR0eXBlICE9IDAgJiYgJHR5cGUgIT0gMSkgewoJCQlyZXR1cm4gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpOYU4oKTsKCQl9CgkJaWYgKCRwZXIgPD0gMCB8fCAkcGVyID4gJG5wZXIpIHsKCQkJcmV0dXJuIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6VkFMVUUoKTsKCQl9CgoJCS8vIENhbGN1bGF0ZQoJCSRpbnRlcmVzdEFuZFByaW5jaXBhbCA9IHNlbGY6Ol9pbnRlcmVzdEFuZFByaW5jaXBhbCgkcmF0ZSwgJHBlciwgJG5wZXIsICRwdiwgJGZ2LCAkdHlwZSk7CgkJcmV0dXJuICRpbnRlcmVzdEFuZFByaW5jaXBhbFswXTsKCX0JLy8JZnVuY3Rpb24gSVBNVCgpCgoKCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gSVJSKCR2YWx1ZXMsICRndWVzcyA9IDAuMSkgewoJCWlmICghaXNfYXJyYXkoJHZhbHVlcykpIHJldHVybiBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OlZBTFVFKCk7CgkJJHZhbHVlcyA9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlbkFycmF5KCR2YWx1ZXMpOwoJCSRndWVzcyA9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlblNpbmdsZVZhbHVlKCRndWVzcyk7CgoJCS8vIGNyZWF0ZSBhbiBpbml0aWFsIHJhbmdlLCB3aXRoIGEgcm9vdCBzb21ld2hlcmUgYmV0d2VlbiAwIGFuZCBndWVzcwoJCSR4MSA9IDAuMDsKCQkkeDIgPSAkZ3Vlc3M7CgkJJGYxID0gc2VsZjo6TlBWKCR4MSwgJHZhbHVlcyk7CgkJJGYyID0gc2VsZjo6TlBWKCR4MiwgJHZhbHVlcyk7CgkJZm9yICgkaSA9IDA7ICRpIDwgRklOQU5DSUFMX01BWF9JVEVSQVRJT05TOyArKyRpKSB7CgkJCWlmICgoJGYxICogJGYyKSA8IDAuMCkgYnJlYWs7CgkJCWlmIChhYnMoJGYxKSA8IGFicygkZjIpKSB7CgkJCQkkZjEgPSBzZWxmOjpOUFYoJHgxICs9IDEuNiAqICgkeDEgLSAkeDIpLCAkdmFsdWVzKTsKCQkJfSBlbHNlIHsKCQkJCSRmMiA9IHNlbGY6Ok5QVigkeDIgKz0gMS42ICogKCR4MiAtICR4MSksICR2YWx1ZXMpOwoJCQl9CgkJfQoJCWlmICgoJGYxICogJGYyKSA+IDAuMCkgcmV0dXJuIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6VkFMVUUoKTsKCgkJJGYgPSBzZWxmOjpOUFYoJHgxLCAkdmFsdWVzKTsKCQlpZiAoJGYgPCAwLjApIHsKCQkJJHJ0YiA9ICR4MTsKCQkJJGR4ID0gJHgyIC0gJHgxOwoJCX0gZWxzZSB7CgkJCSRydGIgPSAkeDI7CgkJCSRkeCA9ICR4MSAtICR4MjsKCQl9CgoJCWZvciAoJGkgPSAwOyAgJGkgPCBGSU5BTkNJQUxfTUFYX0lURVJBVElPTlM7ICsrJGkpIHsKCQkJJGR4ICo9IDAuNTsKCQkJJHhfbWlkID0gJHJ0YiArICRkeDsKCQkJJGZfbWlkID0gc2VsZjo6TlBWKCR4X21pZCwgJHZhbHVlcyk7CgkJCWlmICgkZl9taWQgPD0gMC4wKSAkcnRiID0gJHhfbWlkOwoJCQlpZiAoKGFicygkZl9taWQpIDwgRklOQU5DSUFMX1BSRUNJU0lPTikgfHwgKGFicygkZHgpIDwgRklOQU5DSUFMX1BSRUNJU0lPTikpIHJldHVybiAkeF9taWQ7CgkJfQoJCXJldHVybiBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OlZBTFVFKCk7Cgl9CS8vCWZ1bmN0aW9uIElSUigpCgoKCS8qKgoJICogICAgICBJU1BNVAoJICoKCSAqICAgICAgUmV0dXJucyB0aGUgaW50ZXJlc3QgcGF5bWVudCBmb3IgYW4gaW52ZXN0bWVudCBiYXNlZCBvbiBhbiBpbnRlcmVzdCByYXRlIGFuZCBhIGNvbnN0YW50IHBheW1lbnQgc2NoZWR1bGUuCgkgKgoJICogICAgICBFeGNlbCBGdW5jdGlvbjoKCSAqICAgICAgICAgID1JU1BNVChpbnRlcmVzdF9yYXRlLCBwZXJpb2QsIG51bWJlcl9wYXltZW50cywgUFYpCgkgKgoJICogICAgICBpbnRlcmVzdF9yYXRlIGlzIHRoZSBpbnRlcmVzdCByYXRlIGZvciB0aGUgaW52ZXN0bWVudAoJICoKCSAqICAgICAgcGVyaW9kIGlzIHRoZSBwZXJpb2QgdG8gY2FsY3VsYXRlIHRoZSBpbnRlcmVzdCByYXRlLiAgSXQgbXVzdCBiZSBiZXR3ZWVlbiAxIGFuZCBudW1iZXJfcGF5bWVudHMuCgkgKgoJICogICAgICBudW1iZXJfcGF5bWVudHMgaXMgdGhlIG51bWJlciBvZiBwYXltZW50cyBmb3IgdGhlIGFubnVpdHkKCSAqCgkgKiAgICAgIFBWIGlzIHRoZSBsb2FuIGFtb3VudCBvciBwcmVzZW50IHZhbHVlIG9mIHRoZSBwYXltZW50cwoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIElTUE1UKCkgewoJCS8vIFJldHVybiB2YWx1ZQoJCSRyZXR1cm5WYWx1ZSA9IDA7CgoJCS8vIEdldCB0aGUgcGFyYW1ldGVycwoJCSRhQXJncyA9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlbkFycmF5KGZ1bmNfZ2V0X2FyZ3MoKSk7CgkJJGludGVyZXN0UmF0ZSA9IGFycmF5X3NoaWZ0KCRhQXJncyk7CgkJJHBlcmlvZCA9IGFycmF5X3NoaWZ0KCRhQXJncyk7CgkJJG51bWJlclBlcmlvZHMgPSBhcnJheV9zaGlmdCgkYUFyZ3MpOwoJCSRwcmluY2lwbGVSZW1haW5pbmcgPSBhcnJheV9zaGlmdCgkYUFyZ3MpOwoKCQkvLyBDYWxjdWxhdGUKCQkkcHJpbmNpcGxlUGF5bWVudCA9ICgkcHJpbmNpcGxlUmVtYWluaW5nICogMS4wKSAvICgkbnVtYmVyUGVyaW9kcyAqIDEuMCk7CgkJZm9yKCRpPTA7ICRpIDw9ICRwZXJpb2Q7ICsrJGkpIHsKCQkJJHJldHVyblZhbHVlID0gJGludGVyZXN0UmF0ZSAqICRwcmluY2lwbGVSZW1haW5pbmcgKiAtMTsKCQkJJHByaW5jaXBsZVJlbWFpbmluZyAtPSAkcHJpbmNpcGxlUGF5bWVudDsKCQkJLy8gcHJpbmNpcGxlIG5lZWRzIHRvIGJlIDAgYWZ0ZXIgdGhlIGxhc3QgcGF5bWVudCwgZG9uJ3QgbGV0IGZsb2F0aW5nIHBvaW50IHNjcmV3IGl0IHVwCgkJCWlmKCRpID09ICRudW1iZXJQZXJpb2RzKSB7CgkJCQkkcmV0dXJuVmFsdWUgPSAwOwoJCQl9CgkJfQoJCXJldHVybigkcmV0dXJuVmFsdWUpOwoJfQkvLwlmdW5jdGlvbiBJU1BNVCgpCgoKCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gTUlSUigkdmFsdWVzLCAkZmluYW5jZV9yYXRlLCAkcmVpbnZlc3RtZW50X3JhdGUpIHsKCQlpZiAoIWlzX2FycmF5KCR2YWx1ZXMpKSByZXR1cm4gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpWQUxVRSgpOwoJCSR2YWx1ZXMJCQkJPSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5BcnJheSgkdmFsdWVzKTsKCQkkZmluYW5jZV9yYXRlCQk9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlblNpbmdsZVZhbHVlKCRmaW5hbmNlX3JhdGUpOwoJCSRyZWludmVzdG1lbnRfcmF0ZQk9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlblNpbmdsZVZhbHVlKCRyZWludmVzdG1lbnRfcmF0ZSk7CgkJJG4gPSBjb3VudCgkdmFsdWVzKTsKCgkJJHJyID0gMS4wICsgJHJlaW52ZXN0bWVudF9yYXRlOwoJCSRmciA9IDEuMCArICRmaW5hbmNlX3JhdGU7CgoJCSRucHZfcG9zID0gJG5wdl9uZWcgPSAwLjA7CgkJZm9yZWFjaCgkdmFsdWVzIGFzICRpID0+ICR2KSB7CgkJCWlmICgkdiA+PSAwKSB7CgkJCQkkbnB2X3BvcyArPSAkdiAvIHBvdygkcnIsICRpKTsKCQkJfSBlbHNlIHsKCQkJCSRucHZfbmVnICs9ICR2IC8gcG93KCRmciwgJGkpOwoJCQl9CgkJfQoKCQlpZiAoKCRucHZfbmVnID09IDApIHx8ICgkbnB2X3BvcyA9PSAwKSB8fCAoJHJlaW52ZXN0bWVudF9yYXRlIDw9IC0xKSkgewoJCQlyZXR1cm4gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpWQUxVRSgpOwoJCX0KCgkJJG1pcnIgPSBwb3coKC0kbnB2X3BvcyAqIHBvdygkcnIsICRuKSkKCQkJCS8gKCRucHZfbmVnICogKCRycikpLCAoMS4wIC8gKCRuIC0gMSkpKSAtIDEuMDsKCgkJcmV0dXJuIChpc19maW5pdGUoJG1pcnIpID8gJG1pcnIgOiBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OlZBTFVFKCkpOwoJfQkvLwlmdW5jdGlvbiBNSVJSKCkKCgoJLyoqCgkgKiBOT01JTkFMCgkgKgoJICogUmV0dXJucyB0aGUgbm9taW5hbCBpbnRlcmVzdCByYXRlIGdpdmVuIHRoZSBlZmZlY3RpdmUgcmF0ZSBhbmQgdGhlIG51bWJlciBvZiBjb21wb3VuZGluZyBwYXltZW50cyBwZXIgeWVhci4KCSAqCgkgKiBAcGFyYW0JZmxvYXQJJGVmZmVjdF9yYXRlCUVmZmVjdGl2ZSBpbnRlcmVzdCByYXRlCgkgKiBAcGFyYW0JaW50CQkkbnBlcnkJCQlOdW1iZXIgb2YgY29tcG91bmRpbmcgcGF5bWVudHMgcGVyIHllYXIKCSAqIEByZXR1cm4JZmxvYXQKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBOT01JTkFMKCRlZmZlY3RfcmF0ZSA9IDAsICRucGVyeSA9IDApIHsKCQkkZWZmZWN0X3JhdGUJPSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5TaW5nbGVWYWx1ZSgkZWZmZWN0X3JhdGUpOwoJCSRucGVyeQkJCT0gKGludClQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5TaW5nbGVWYWx1ZSgkbnBlcnkpOwoKCQkvLyBWYWxpZGF0ZSBwYXJhbWV0ZXJzCgkJaWYgKCRlZmZlY3RfcmF0ZSA8PSAwIHx8ICRucGVyeSA8IDEpIHsKCQkJcmV0dXJuIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6TmFOKCk7CgkJfQoKCQkvLyBDYWxjdWxhdGUKCQlyZXR1cm4gJG5wZXJ5ICogKHBvdygkZWZmZWN0X3JhdGUgKyAxLCAxIC8gJG5wZXJ5KSAtIDEpOwoJfQkvLwlmdW5jdGlvbiBOT01JTkFMKCkKCgoJLyoqCgkgKiBOUEVSCgkgKgoJICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIHBlcmlvZHMgZm9yIGEgY2FzaCBmbG93IHdpdGggY29uc3RhbnQgcGVyaW9kaWMgcGF5bWVudHMgKGFubnVpdGllcyksIGFuZCBpbnRlcmVzdCByYXRlLgoJICoKCSAqIEBwYXJhbQlmbG9hdAkkcmF0ZQlJbnRlcmVzdCByYXRlIHBlciBwZXJpb2QKCSAqIEBwYXJhbQlpbnQJCSRwbXQJUGVyaW9kaWMgcGF5bWVudCAoYW5udWl0eSkKCSAqIEBwYXJhbQlmbG9hdAkkcHYJCVByZXNlbnQgVmFsdWUKCSAqIEBwYXJhbQlmbG9hdAkkZnYJCUZ1dHVyZSBWYWx1ZQoJICogQHBhcmFtCWludAkJJHR5cGUJUGF5bWVudCB0eXBlOiAwID0gYXQgdGhlIGVuZCBvZiBlYWNoIHBlcmlvZCwgMSA9IGF0IHRoZSBiZWdpbm5pbmcgb2YgZWFjaCBwZXJpb2QKCSAqIEByZXR1cm4JZmxvYXQKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBOUEVSKCRyYXRlID0gMCwgJHBtdCA9IDAsICRwdiA9IDAsICRmdiA9IDAsICR0eXBlID0gMCkgewoJCSRyYXRlCT0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuU2luZ2xlVmFsdWUoJHJhdGUpOwoJCSRwbXQJPSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5TaW5nbGVWYWx1ZSgkcG10KTsKCQkkcHYJCT0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuU2luZ2xlVmFsdWUoJHB2KTsKCQkkZnYJCT0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuU2luZ2xlVmFsdWUoJGZ2KTsKCQkkdHlwZQk9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlblNpbmdsZVZhbHVlKCR0eXBlKTsKCgkJLy8gVmFsaWRhdGUgcGFyYW1ldGVycwoJCWlmICgkdHlwZSAhPSAwICYmICR0eXBlICE9IDEpIHsKCQkJcmV0dXJuIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6TmFOKCk7CgkJfQoKCQkvLyBDYWxjdWxhdGUKCQlpZiAoIWlzX251bGwoJHJhdGUpICYmICRyYXRlICE9IDApIHsKCQkJaWYgKCRwbXQgPT0gMCAmJiAkcHYgPT0gMCkgewoJCQkJcmV0dXJuIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6TmFOKCk7CgkJCX0KCQkJcmV0dXJuIGxvZygoJHBtdCAqICgxICsgJHJhdGUgKiAkdHlwZSkgLyAkcmF0ZSAtICRmdikgLyAoJHB2ICsgJHBtdCAqICgxICsgJHJhdGUgKiAkdHlwZSkgLyAkcmF0ZSkpIC8gbG9nKDEgKyAkcmF0ZSk7CgkJfSBlbHNlIHsKCQkJaWYgKCRwbXQgPT0gMCkgewoJCQkJcmV0dXJuIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6TmFOKCk7CgkJCX0KCQkJcmV0dXJuICgtJHB2IC0kZnYpIC8gJHBtdDsKCQl9Cgl9CS8vCWZ1bmN0aW9uIE5QRVIoKQoKCgkvKioKCSAqIE5QVgoJICoKCSAqIFJldHVybnMgdGhlIE5ldCBQcmVzZW50IFZhbHVlIG9mIGEgY2FzaCBmbG93IHNlcmllcyBnaXZlbiBhIGRpc2NvdW50IHJhdGUuCgkgKgoJICogQHBhcmFtCWZsb2F0CURpc2NvdW50IGludGVyZXN0IHJhdGUKCSAqIEBwYXJhbQlhcnJheQlDYXNoIGZsb3cgc2VyaWVzCgkgKiBAcmV0dXJuCWZsb2F0CgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gTlBWKCkgewoJCS8vIFJldHVybiB2YWx1ZQoJCSRyZXR1cm5WYWx1ZSA9IDA7CgoJCS8vIExvb3AgdGhyb3VnaCBhcmd1bWVudHMKCQkkYUFyZ3MgPSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5BcnJheShmdW5jX2dldF9hcmdzKCkpOwoKCQkvLyBDYWxjdWxhdGUKCQkkcmF0ZSA9IGFycmF5X3NoaWZ0KCRhQXJncyk7CgkJZm9yICgkaSA9IDE7ICRpIDw9IGNvdW50KCRhQXJncyk7ICsrJGkpIHsKCQkJLy8gSXMgaXQgYSBudW1lcmljIHZhbHVlPwoJCQlpZiAoaXNfbnVtZXJpYygkYUFyZ3NbJGkgLSAxXSkpIHsKCQkJCSRyZXR1cm5WYWx1ZSArPSAkYUFyZ3NbJGkgLSAxXSAvIHBvdygxICsgJHJhdGUsICRpKTsKCQkJfQoJCX0KCgkJLy8gUmV0dXJuCgkJcmV0dXJuICRyZXR1cm5WYWx1ZTsKCX0JLy8JZnVuY3Rpb24gTlBWKCkKCgoJLyoqCgkgKiBQTVQKCSAqCgkgKiBSZXR1cm5zIHRoZSBjb25zdGFudCBwYXltZW50IChhbm51aXR5KSBmb3IgYSBjYXNoIGZsb3cgd2l0aCBhIGNvbnN0YW50IGludGVyZXN0IHJhdGUuCgkgKgoJICogQHBhcmFtCWZsb2F0CSRyYXRlCUludGVyZXN0IHJhdGUgcGVyIHBlcmlvZAoJICogQHBhcmFtCWludAkJJG5wZXIJTnVtYmVyIG9mIHBlcmlvZHMKCSAqIEBwYXJhbQlmbG9hdAkkcHYJCVByZXNlbnQgVmFsdWUKCSAqIEBwYXJhbQlmbG9hdAkkZnYJCUZ1dHVyZSBWYWx1ZQoJICogQHBhcmFtCWludAkJJHR5cGUJUGF5bWVudCB0eXBlOiAwID0gYXQgdGhlIGVuZCBvZiBlYWNoIHBlcmlvZCwgMSA9IGF0IHRoZSBiZWdpbm5pbmcgb2YgZWFjaCBwZXJpb2QKCSAqIEByZXR1cm4JZmxvYXQKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBQTVQoJHJhdGUgPSAwLCAkbnBlciA9IDAsICRwdiA9IDAsICRmdiA9IDAsICR0eXBlID0gMCkgewoJCSRyYXRlCT0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuU2luZ2xlVmFsdWUoJHJhdGUpOwoJCSRucGVyCT0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuU2luZ2xlVmFsdWUoJG5wZXIpOwoJCSRwdgkJPSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5TaW5nbGVWYWx1ZSgkcHYpOwoJCSRmdgkJPSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5TaW5nbGVWYWx1ZSgkZnYpOwoJCSR0eXBlCT0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuU2luZ2xlVmFsdWUoJHR5cGUpOwoKCQkvLyBWYWxpZGF0ZSBwYXJhbWV0ZXJzCgkJaWYgKCR0eXBlICE9IDAgJiYgJHR5cGUgIT0gMSkgewoJCQlyZXR1cm4gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpOYU4oKTsKCQl9CgoJCS8vIENhbGN1bGF0ZQoJCWlmICghaXNfbnVsbCgkcmF0ZSkgJiYgJHJhdGUgIT0gMCkgewoJCQlyZXR1cm4gKC0kZnYgLSAkcHYgKiBwb3coMSArICRyYXRlLCAkbnBlcikpIC8gKDEgKyAkcmF0ZSAqICR0eXBlKSAvICgocG93KDEgKyAkcmF0ZSwgJG5wZXIpIC0gMSkgLyAkcmF0ZSk7CgkJfSBlbHNlIHsKCQkJcmV0dXJuICgtJHB2IC0gJGZ2KSAvICRucGVyOwoJCX0KCX0JLy8JZnVuY3Rpb24gUE1UKCkKCgoJLyoqCgkgKiBQUE1UCgkgKgoJICogUmV0dXJucyB0aGUgaW50ZXJlc3QgcGF5bWVudCBmb3IgYSBnaXZlbiBwZXJpb2QgZm9yIGFuIGludmVzdG1lbnQgYmFzZWQgb24gcGVyaW9kaWMsIGNvbnN0YW50IHBheW1lbnRzIGFuZCBhIGNvbnN0YW50IGludGVyZXN0IHJhdGUuCgkgKgoJICogQHBhcmFtCWZsb2F0CSRyYXRlCUludGVyZXN0IHJhdGUgcGVyIHBlcmlvZAoJICogQHBhcmFtCWludAkJJHBlcglQZXJpb2QgZm9yIHdoaWNoIHdlIHdhbnQgdG8gZmluZCB0aGUgaW50ZXJlc3QKCSAqIEBwYXJhbQlpbnQJCSRucGVyCU51bWJlciBvZiBwZXJpb2RzCgkgKiBAcGFyYW0JZmxvYXQJJHB2CQlQcmVzZW50IFZhbHVlCgkgKiBAcGFyYW0JZmxvYXQJJGZ2CQlGdXR1cmUgVmFsdWUKCSAqIEBwYXJhbQlpbnQJCSR0eXBlCVBheW1lbnQgdHlwZTogMCA9IGF0IHRoZSBlbmQgb2YgZWFjaCBwZXJpb2QsIDEgPSBhdCB0aGUgYmVnaW5uaW5nIG9mIGVhY2ggcGVyaW9kCgkgKiBAcmV0dXJuCWZsb2F0CgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gUFBNVCgkcmF0ZSwgJHBlciwgJG5wZXIsICRwdiwgJGZ2ID0gMCwgJHR5cGUgPSAwKSB7CgkJJHJhdGUJPSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5TaW5nbGVWYWx1ZSgkcmF0ZSk7CgkJJHBlcgk9IChpbnQpIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlblNpbmdsZVZhbHVlKCRwZXIpOwoJCSRucGVyCT0gKGludCkgUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuU2luZ2xlVmFsdWUoJG5wZXIpOwoJCSRwdgkJPSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5TaW5nbGVWYWx1ZSgkcHYpOwoJCSRmdgkJPSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5TaW5nbGVWYWx1ZSgkZnYpOwoJCSR0eXBlCT0gKGludCkgUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuU2luZ2xlVmFsdWUoJHR5cGUpOwoKCQkvLyBWYWxpZGF0ZSBwYXJhbWV0ZXJzCgkJaWYgKCR0eXBlICE9IDAgJiYgJHR5cGUgIT0gMSkgewoJCQlyZXR1cm4gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpOYU4oKTsKCQl9CgkJaWYgKCRwZXIgPD0gMCB8fCAkcGVyID4gJG5wZXIpIHsKCQkJcmV0dXJuIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6VkFMVUUoKTsKCQl9CgoJCS8vIENhbGN1bGF0ZQoJCSRpbnRlcmVzdEFuZFByaW5jaXBhbCA9IHNlbGY6Ol9pbnRlcmVzdEFuZFByaW5jaXBhbCgkcmF0ZSwgJHBlciwgJG5wZXIsICRwdiwgJGZ2LCAkdHlwZSk7CgkJcmV0dXJuICRpbnRlcmVzdEFuZFByaW5jaXBhbFsxXTsKCX0JLy8JZnVuY3Rpb24gUFBNVCgpCgoKCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gUFJJQ0UoJHNldHRsZW1lbnQsICRtYXR1cml0eSwgJHJhdGUsICR5aWVsZCwgJHJlZGVtcHRpb24sICRmcmVxdWVuY3ksICRiYXNpcz0wKSB7CgkJJHNldHRsZW1lbnQJPSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5TaW5nbGVWYWx1ZSgkc2V0dGxlbWVudCk7CgkJJG1hdHVyaXR5CT0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuU2luZ2xlVmFsdWUoJG1hdHVyaXR5KTsKCQkkcmF0ZQkJPSAoZmxvYXQpIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlblNpbmdsZVZhbHVlKCRyYXRlKTsKCQkkeWllbGQJCT0gKGZsb2F0KSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5TaW5nbGVWYWx1ZSgkeWllbGQpOwoJCSRyZWRlbXB0aW9uCT0gKGZsb2F0KSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5TaW5nbGVWYWx1ZSgkcmVkZW1wdGlvbik7CgkJJGZyZXF1ZW5jeQk9IChpbnQpIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlblNpbmdsZVZhbHVlKCRmcmVxdWVuY3kpOwoJCSRiYXNpcwkJPSAoaXNfbnVsbCgkYmFzaXMpKQk/IDAgOgkoaW50KSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5TaW5nbGVWYWx1ZSgkYmFzaXMpOwoKCQlpZiAoaXNfc3RyaW5nKCRzZXR0bGVtZW50ID0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRGF0ZVRpbWU6Ol9nZXREYXRlVmFsdWUoJHNldHRsZW1lbnQpKSkgewoJCQlyZXR1cm4gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpWQUxVRSgpOwoJCX0KCQlpZiAoaXNfc3RyaW5nKCRtYXR1cml0eSA9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0RhdGVUaW1lOjpfZ2V0RGF0ZVZhbHVlKCRtYXR1cml0eSkpKSB7CgkJCXJldHVybiBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OlZBTFVFKCk7CgkJfQoKCQlpZiAoKCRzZXR0bGVtZW50ID4gJG1hdHVyaXR5KSB8fAoJCQkoIXNlbGY6Ol92YWxpZEZyZXF1ZW5jeSgkZnJlcXVlbmN5KSkgfHwKCQkJKCgkYmFzaXMgPCAwKSB8fCAoJGJhc2lzID4gNCkpKSB7CgkJCXJldHVybiBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6Ok5hTigpOwoJCX0KCgkJJGRzYyA9IHNlbGY6OkNPVVBEQVlTTkMoJHNldHRsZW1lbnQsICRtYXR1cml0eSwgJGZyZXF1ZW5jeSwgJGJhc2lzKTsKCQkkZSA9IHNlbGY6OkNPVVBEQVlTKCRzZXR0bGVtZW50LCAkbWF0dXJpdHksICRmcmVxdWVuY3ksICRiYXNpcyk7CgkJJG4gPSBzZWxmOjpDT1VQTlVNKCRzZXR0bGVtZW50LCAkbWF0dXJpdHksICRmcmVxdWVuY3ksICRiYXNpcyk7CgkJJGEgPSBzZWxmOjpDT1VQREFZQlMoJHNldHRsZW1lbnQsICRtYXR1cml0eSwgJGZyZXF1ZW5jeSwgJGJhc2lzKTsKCgkJJGJhc2VZRgk9IDEuMCArICgkeWllbGQgLyAkZnJlcXVlbmN5KTsKCQkkcmZwCT0gMTAwICogKCRyYXRlIC8gJGZyZXF1ZW5jeSk7CgkJJGRlCT0gJGRzYyAvICRlOwoKCQkkcmVzdWx0ID0gJHJlZGVtcHRpb24gLyBwb3coJGJhc2VZRiwgKC0tJG4gKyAkZGUpKTsKCQlmb3IoJGsgPSAwOyAkayA8PSAkbjsgKyskaykgewoJCQkkcmVzdWx0ICs9ICRyZnAgLyAocG93KCRiYXNlWUYsICgkayArICRkZSkpKTsKCQl9CgkJJHJlc3VsdCAtPSAkcmZwICogKCRhIC8gJGUpOwoKCQlyZXR1cm4gJHJlc3VsdDsKCX0JLy8JZnVuY3Rpb24gUFJJQ0UoKQoKCgkvKioKCSAqIFBSSUNFRElTQwoJICoKCSAqIFJldHVybnMgdGhlIHByaWNlIHBlciAkMTAwIGZhY2UgdmFsdWUgb2YgYSBkaXNjb3VudGVkIHNlY3VyaXR5LgoJICoKCSAqIEBwYXJhbQltaXhlZAlzZXR0bGVtZW50CVRoZSBzZWN1cml0eSdzIHNldHRsZW1lbnQgZGF0ZS4KCSAqCQkJCQkJCQlUaGUgc2VjdXJpdHkgc2V0dGxlbWVudCBkYXRlIGlzIHRoZSBkYXRlIGFmdGVyIHRoZSBpc3N1ZSBkYXRlIHdoZW4gdGhlIHNlY3VyaXR5IGlzIHRyYWRlZCB0byB0aGUgYnV5ZXIuCgkgKiBAcGFyYW0JbWl4ZWQJbWF0dXJpdHkJVGhlIHNlY3VyaXR5J3MgbWF0dXJpdHkgZGF0ZS4KCSAqCQkJCQkJCQlUaGUgbWF0dXJpdHkgZGF0ZSBpcyB0aGUgZGF0ZSB3aGVuIHRoZSBzZWN1cml0eSBleHBpcmVzLgoJICogQHBhcmFtCWludAkJZGlzY291bnQJVGhlIHNlY3VyaXR5J3MgZGlzY291bnQgcmF0ZS4KCSAqIEBwYXJhbQlpbnQJCXJlZGVtcHRpb24JVGhlIHNlY3VyaXR5J3MgcmVkZW1wdGlvbiB2YWx1ZSBwZXIgJDEwMCBmYWNlIHZhbHVlLgoJICogQHBhcmFtCWludAkJYmFzaXMJCVRoZSB0eXBlIG9mIGRheSBjb3VudCB0byB1c2UuCgkgKgkJCQkJCQkJCQkwIG9yIG9taXR0ZWQJVVMgKE5BU0QpIDMwLzM2MAoJICoJCQkJCQkJCQkJMQkJCQlBY3R1YWwvYWN0dWFsCgkgKgkJCQkJCQkJCQkyCQkJCUFjdHVhbC8zNjAKCSAqCQkJCQkJCQkJCTMJCQkJQWN0dWFsLzM2NQoJICoJCQkJCQkJCQkJNAkJCQlFdXJvcGVhbiAzMC8zNjAKCSAqIEByZXR1cm4JZmxvYXQKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBQUklDRURJU0MoJHNldHRsZW1lbnQsICRtYXR1cml0eSwgJGRpc2NvdW50LCAkcmVkZW1wdGlvbiwgJGJhc2lzPTApIHsKCQkkc2V0dGxlbWVudAk9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlblNpbmdsZVZhbHVlKCRzZXR0bGVtZW50KTsKCQkkbWF0dXJpdHkJPSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5TaW5nbGVWYWx1ZSgkbWF0dXJpdHkpOwoJCSRkaXNjb3VudAk9IChmbG9hdCkgUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuU2luZ2xlVmFsdWUoJGRpc2NvdW50KTsKCQkkcmVkZW1wdGlvbgk9IChmbG9hdCkgUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuU2luZ2xlVmFsdWUoJHJlZGVtcHRpb24pOwoJCSRiYXNpcwkJPSAoaW50KSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5TaW5nbGVWYWx1ZSgkYmFzaXMpOwoKCQkvLwlWYWxpZGF0ZQoJCWlmICgoaXNfbnVtZXJpYygkZGlzY291bnQpKSAmJiAoaXNfbnVtZXJpYygkcmVkZW1wdGlvbikpICYmIChpc19udW1lcmljKCRiYXNpcykpKSB7CgkJCWlmICgoJGRpc2NvdW50IDw9IDApIHx8ICgkcmVkZW1wdGlvbiA8PSAwKSkgewoJCQkJcmV0dXJuIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6TmFOKCk7CgkJCX0KCQkJJGRheXNCZXR3ZWVuU2V0dGxlbWVudEFuZE1hdHVyaXR5ID0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRGF0ZVRpbWU6OllFQVJGUkFDKCRzZXR0bGVtZW50LCAkbWF0dXJpdHksICRiYXNpcyk7CgkJCWlmICghaXNfbnVtZXJpYygkZGF5c0JldHdlZW5TZXR0bGVtZW50QW5kTWF0dXJpdHkpKSB7CgkJCQkvLwlyZXR1cm4gZGF0ZSBlcnJvcgoJCQkJcmV0dXJuICRkYXlzQmV0d2VlblNldHRsZW1lbnRBbmRNYXR1cml0eTsKCQkJfQoKCQkJcmV0dXJuICRyZWRlbXB0aW9uICogKDEgLSAkZGlzY291bnQgKiAkZGF5c0JldHdlZW5TZXR0bGVtZW50QW5kTWF0dXJpdHkpOwoJCX0KCQlyZXR1cm4gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpWQUxVRSgpOwoJfQkvLwlmdW5jdGlvbiBQUklDRURJU0MoKQoKCgkvKioKCSAqIFBSSUNFTUFUCgkgKgoJICogUmV0dXJucyB0aGUgcHJpY2UgcGVyICQxMDAgZmFjZSB2YWx1ZSBvZiBhIHNlY3VyaXR5IHRoYXQgcGF5cyBpbnRlcmVzdCBhdCBtYXR1cml0eS4KCSAqCgkgKiBAcGFyYW0JbWl4ZWQJc2V0dGxlbWVudAlUaGUgc2VjdXJpdHkncyBzZXR0bGVtZW50IGRhdGUuCgkgKgkJCQkJCQkJVGhlIHNlY3VyaXR5J3Mgc2V0dGxlbWVudCBkYXRlIGlzIHRoZSBkYXRlIGFmdGVyIHRoZSBpc3N1ZSBkYXRlIHdoZW4gdGhlIHNlY3VyaXR5IGlzIHRyYWRlZCB0byB0aGUgYnV5ZXIuCgkgKiBAcGFyYW0JbWl4ZWQJbWF0dXJpdHkJVGhlIHNlY3VyaXR5J3MgbWF0dXJpdHkgZGF0ZS4KCSAqCQkJCQkJCQlUaGUgbWF0dXJpdHkgZGF0ZSBpcyB0aGUgZGF0ZSB3aGVuIHRoZSBzZWN1cml0eSBleHBpcmVzLgoJICogQHBhcmFtCW1peGVkCWlzc3VlCQlUaGUgc2VjdXJpdHkncyBpc3N1ZSBkYXRlLgoJICogQHBhcmFtCWludAkJcmF0ZQkJVGhlIHNlY3VyaXR5J3MgaW50ZXJlc3QgcmF0ZSBhdCBkYXRlIG9mIGlzc3VlLgoJICogQHBhcmFtCWludAkJeWllbGQJCVRoZSBzZWN1cml0eSdzIGFubnVhbCB5aWVsZC4KCSAqIEBwYXJhbQlpbnQJCWJhc2lzCQlUaGUgdHlwZSBvZiBkYXkgY291bnQgdG8gdXNlLgoJICoJCQkJCQkJCQkJMCBvciBvbWl0dGVkCVVTIChOQVNEKSAzMC8zNjAKCSAqCQkJCQkJCQkJCTEJCQkJQWN0dWFsL2FjdHVhbAoJICoJCQkJCQkJCQkJMgkJCQlBY3R1YWwvMzYwCgkgKgkJCQkJCQkJCQkzCQkJCUFjdHVhbC8zNjUKCSAqCQkJCQkJCQkJCTQJCQkJRXVyb3BlYW4gMzAvMzYwCgkgKiBAcmV0dXJuCWZsb2F0CgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gUFJJQ0VNQVQoJHNldHRsZW1lbnQsICRtYXR1cml0eSwgJGlzc3VlLCAkcmF0ZSwgJHlpZWxkLCAkYmFzaXM9MCkgewoJCSRzZXR0bGVtZW50CT0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuU2luZ2xlVmFsdWUoJHNldHRsZW1lbnQpOwoJCSRtYXR1cml0eQk9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlblNpbmdsZVZhbHVlKCRtYXR1cml0eSk7CgkJJGlzc3VlCQk9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlblNpbmdsZVZhbHVlKCRpc3N1ZSk7CgkJJHJhdGUJCT0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuU2luZ2xlVmFsdWUoJHJhdGUpOwoJCSR5aWVsZAkJPSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5TaW5nbGVWYWx1ZSgkeWllbGQpOwoJCSRiYXNpcwkJPSAoaW50KSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5TaW5nbGVWYWx1ZSgkYmFzaXMpOwoKCQkvLwlWYWxpZGF0ZQoJCWlmIChpc19udW1lcmljKCRyYXRlKSAmJiBpc19udW1lcmljKCR5aWVsZCkpIHsKCQkJaWYgKCgkcmF0ZSA8PSAwKSB8fCAoJHlpZWxkIDw9IDApKSB7CgkJCQlyZXR1cm4gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpOYU4oKTsKCQkJfQoJCQkkZGF5c1BlclllYXIgPSBzZWxmOjpfZGF5c1BlclllYXIoUEhQRXhjZWxfQ2FsY3VsYXRpb25fRGF0ZVRpbWU6OllFQVIoJHNldHRsZW1lbnQpLCRiYXNpcyk7CgkJCWlmICghaXNfbnVtZXJpYygkZGF5c1BlclllYXIpKSB7CgkJCQlyZXR1cm4gJGRheXNQZXJZZWFyOwoJCQl9CgkJCSRkYXlzQmV0d2Vlbklzc3VlQW5kU2V0dGxlbWVudCA9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0RhdGVUaW1lOjpZRUFSRlJBQygkaXNzdWUsICRzZXR0bGVtZW50LCAkYmFzaXMpOwoJCQlpZiAoIWlzX251bWVyaWMoJGRheXNCZXR3ZWVuSXNzdWVBbmRTZXR0bGVtZW50KSkgewoJCQkJLy8JcmV0dXJuIGRhdGUgZXJyb3IKCQkJCXJldHVybiAkZGF5c0JldHdlZW5Jc3N1ZUFuZFNldHRsZW1lbnQ7CgkJCX0KCQkJJGRheXNCZXR3ZWVuSXNzdWVBbmRTZXR0bGVtZW50ICo9ICRkYXlzUGVyWWVhcjsKCQkJJGRheXNCZXR3ZWVuSXNzdWVBbmRNYXR1cml0eSA9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0RhdGVUaW1lOjpZRUFSRlJBQygkaXNzdWUsICRtYXR1cml0eSwgJGJhc2lzKTsKCQkJaWYgKCFpc19udW1lcmljKCRkYXlzQmV0d2Vlbklzc3VlQW5kTWF0dXJpdHkpKSB7CgkJCQkvLwlyZXR1cm4gZGF0ZSBlcnJvcgoJCQkJcmV0dXJuICRkYXlzQmV0d2Vlbklzc3VlQW5kTWF0dXJpdHk7CgkJCX0KCQkJJGRheXNCZXR3ZWVuSXNzdWVBbmRNYXR1cml0eSAqPSAkZGF5c1BlclllYXI7CgkJCSRkYXlzQmV0d2VlblNldHRsZW1lbnRBbmRNYXR1cml0eSA9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0RhdGVUaW1lOjpZRUFSRlJBQygkc2V0dGxlbWVudCwgJG1hdHVyaXR5LCAkYmFzaXMpOwoJCQlpZiAoIWlzX251bWVyaWMoJGRheXNCZXR3ZWVuU2V0dGxlbWVudEFuZE1hdHVyaXR5KSkgewoJCQkJLy8JcmV0dXJuIGRhdGUgZXJyb3IKCQkJCXJldHVybiAkZGF5c0JldHdlZW5TZXR0bGVtZW50QW5kTWF0dXJpdHk7CgkJCX0KCQkJJGRheXNCZXR3ZWVuU2V0dGxlbWVudEFuZE1hdHVyaXR5ICo9ICRkYXlzUGVyWWVhcjsKCgkJCXJldHVybiAoKDEwMCArICgoJGRheXNCZXR3ZWVuSXNzdWVBbmRNYXR1cml0eSAvICRkYXlzUGVyWWVhcikgKiAkcmF0ZSAqIDEwMCkpIC8KCQkJCSAgICgxICsgKCgkZGF5c0JldHdlZW5TZXR0bGVtZW50QW5kTWF0dXJpdHkgLyAkZGF5c1BlclllYXIpICogJHlpZWxkKSkgLQoJCQkJICAgKCgkZGF5c0JldHdlZW5Jc3N1ZUFuZFNldHRsZW1lbnQgLyAkZGF5c1BlclllYXIpICogJHJhdGUgKiAxMDApKTsKCQl9CgkJcmV0dXJuIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6VkFMVUUoKTsKCX0JLy8JZnVuY3Rpb24gUFJJQ0VNQVQoKQoKCgkvKioKCSAqIFBWCgkgKgoJICogUmV0dXJucyB0aGUgUHJlc2VudCBWYWx1ZSBvZiBhIGNhc2ggZmxvdyB3aXRoIGNvbnN0YW50IHBheW1lbnRzIGFuZCBpbnRlcmVzdCByYXRlIChhbm51aXRpZXMpLgoJICoKCSAqIEBwYXJhbQlmbG9hdAkkcmF0ZQlJbnRlcmVzdCByYXRlIHBlciBwZXJpb2QKCSAqIEBwYXJhbQlpbnQJCSRucGVyCU51bWJlciBvZiBwZXJpb2RzCgkgKiBAcGFyYW0JZmxvYXQJJHBtdAlQZXJpb2RpYyBwYXltZW50IChhbm51aXR5KQoJICogQHBhcmFtCWZsb2F0CSRmdgkJRnV0dXJlIFZhbHVlCgkgKiBAcGFyYW0JaW50CQkkdHlwZQlQYXltZW50IHR5cGU6IDAgPSBhdCB0aGUgZW5kIG9mIGVhY2ggcGVyaW9kLCAxID0gYXQgdGhlIGJlZ2lubmluZyBvZiBlYWNoIHBlcmlvZAoJICogQHJldHVybglmbG9hdAoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIFBWKCRyYXRlID0gMCwgJG5wZXIgPSAwLCAkcG10ID0gMCwgJGZ2ID0gMCwgJHR5cGUgPSAwKSB7CgkJJHJhdGUJPSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5TaW5nbGVWYWx1ZSgkcmF0ZSk7CgkJJG5wZXIJPSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5TaW5nbGVWYWx1ZSgkbnBlcik7CgkJJHBtdAk9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlblNpbmdsZVZhbHVlKCRwbXQpOwoJCSRmdgkJPSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5TaW5nbGVWYWx1ZSgkZnYpOwoJCSR0eXBlCT0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuU2luZ2xlVmFsdWUoJHR5cGUpOwoKCQkvLyBWYWxpZGF0ZSBwYXJhbWV0ZXJzCgkJaWYgKCR0eXBlICE9IDAgJiYgJHR5cGUgIT0gMSkgewoJCQlyZXR1cm4gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpOYU4oKTsKCQl9CgoJCS8vIENhbGN1bGF0ZQoJCWlmICghaXNfbnVsbCgkcmF0ZSkgJiYgJHJhdGUgIT0gMCkgewoJCQlyZXR1cm4gKC0kcG10ICogKDEgKyAkcmF0ZSAqICR0eXBlKSAqICgocG93KDEgKyAkcmF0ZSwgJG5wZXIpIC0gMSkgLyAkcmF0ZSkgLSAkZnYpIC8gcG93KDEgKyAkcmF0ZSwgJG5wZXIpOwoJCX0gZWxzZSB7CgkJCXJldHVybiAtJGZ2IC0gJHBtdCAqICRucGVyOwoJCX0KCX0JLy8JZnVuY3Rpb24gUFYoKQoKCgkvKioKCSAqIFJBVEUKCSAqCgkgKiBSZXR1cm5zIHRoZSBpbnRlcmVzdCByYXRlIHBlciBwZXJpb2Qgb2YgYW4gYW5udWl0eS4KCSAqIFJBVEUgaXMgY2FsY3VsYXRlZCBieSBpdGVyYXRpb24gYW5kIGNhbiBoYXZlIHplcm8gb3IgbW9yZSBzb2x1dGlvbnMuCgkgKiBJZiB0aGUgc3VjY2Vzc2l2ZSByZXN1bHRzIG9mIFJBVEUgZG8gbm90IGNvbnZlcmdlIHRvIHdpdGhpbiAwLjAwMDAwMDEgYWZ0ZXIgMjAgaXRlcmF0aW9ucywKCSAqIFJBVEUgcmV0dXJucyB0aGUgI05VTSEgZXJyb3IgdmFsdWUuCgkgKgoJICogRXhjZWwgRnVuY3Rpb246CgkgKgkJUkFURShucGVyLHBtdCxwdlssZnZbLHR5cGVbLGd1ZXNzXV1dKQoJICoKCSAqIEBhY2Nlc3MJcHVibGljCgkgKiBAY2F0ZWdvcnkgRmluYW5jaWFsIEZ1bmN0aW9ucwoJICogQHBhcmFtCWZsb2F0CW5wZXIJCVRoZSB0b3RhbCBudW1iZXIgb2YgcGF5bWVudCBwZXJpb2RzIGluIGFuIGFubnVpdHkuCgkgKiBAcGFyYW0JZmxvYXQJcG10CQkJVGhlIHBheW1lbnQgbWFkZSBlYWNoIHBlcmlvZCBhbmQgY2Fubm90IGNoYW5nZSBvdmVyIHRoZSBsaWZlCgkgKgkJCQkJCQkJCW9mIHRoZSBhbm51aXR5LgoJICoJCQkJCQkJCVR5cGljYWxseSwgcG10IGluY2x1ZGVzIHByaW5jaXBhbCBhbmQgaW50ZXJlc3QgYnV0IG5vIG90aGVyCgkgKgkJCQkJCQkJCWZlZXMgb3IgdGF4ZXMuCgkgKiBAcGFyYW0JZmxvYXQJcHYJCQlUaGUgcHJlc2VudCB2YWx1ZSAtIHRoZSB0b3RhbCBhbW91bnQgdGhhdCBhIHNlcmllcyBvZiBmdXR1cmUKCSAqCQkJCQkJCQkJcGF5bWVudHMgaXMgd29ydGggbm93LgoJICogQHBhcmFtCWZsb2F0CWZ2CQkJVGhlIGZ1dHVyZSB2YWx1ZSwgb3IgYSBjYXNoIGJhbGFuY2UgeW91IHdhbnQgdG8gYXR0YWluIGFmdGVyCgkgKgkJCQkJCQkJCXRoZSBsYXN0IHBheW1lbnQgaXMgbWFkZS4gSWYgZnYgaXMgb21pdHRlZCwgaXQgaXMgYXNzdW1lZAoJICoJCQkJCQkJCQl0byBiZSAwICh0aGUgZnV0dXJlIHZhbHVlIG9mIGEgbG9hbiwgZm9yIGV4YW1wbGUsIGlzIDApLgoJICogQHBhcmFtCWludGVnZXIJdHlwZQkJQSBudW1iZXIgMCBvciAxIGFuZCBpbmRpY2F0ZXMgd2hlbiBwYXltZW50cyBhcmUgZHVlOgoJICoJCQkJCQkJCQkJMCBvciBvbWl0dGVkCUF0IHRoZSBlbmQgb2YgdGhlIHBlcmlvZC4KCSAqCQkJCQkJCQkJCTEJCQkJQXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgcGVyaW9kLgoJICogQHBhcmFtCWZsb2F0CWd1ZXNzCQlZb3VyIGd1ZXNzIGZvciB3aGF0IHRoZSByYXRlIHdpbGwgYmUuCgkgKgkJCQkJCQkJCUlmIHlvdSBvbWl0IGd1ZXNzLCBpdCBpcyBhc3N1bWVkIHRvIGJlIDEwIHBlcmNlbnQuCgkgKiBAcmV0dXJuCWZsb2F0CgkgKiovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIFJBVEUoJG5wZXIsICRwbXQsICRwdiwgJGZ2ID0gMC4wLCAkdHlwZSA9IDAsICRndWVzcyA9IDAuMSkgewoJCSRucGVyCT0gKGludCkgUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuU2luZ2xlVmFsdWUoJG5wZXIpOwoJCSRwbXQJPSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5TaW5nbGVWYWx1ZSgkcG10KTsKCQkkcHYJCT0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuU2luZ2xlVmFsdWUoJHB2KTsKCQkkZnYJCT0gKGlzX251bGwoJGZ2KSkJPyAwLjAJOglQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5TaW5nbGVWYWx1ZSgkZnYpOwoJCSR0eXBlCT0gKGlzX251bGwoJHR5cGUpKQk/IDAJCToJKGludCkgUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuU2luZ2xlVmFsdWUoJHR5cGUpOwoJCSRndWVzcwk9IChpc19udWxsKCRndWVzcykpCT8gMC4xCToJUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuU2luZ2xlVmFsdWUoJGd1ZXNzKTsKCgkJJHJhdGUgPSAkZ3Vlc3M7CgkJaWYgKGFicygkcmF0ZSkgPCBGSU5BTkNJQUxfUFJFQ0lTSU9OKSB7CgkJCSR5ID0gJHB2ICogKDEgKyAkbnBlciAqICRyYXRlKSArICRwbXQgKiAoMSArICRyYXRlICogJHR5cGUpICogJG5wZXIgKyAkZnY7CgkJfSBlbHNlIHsKCQkJJGYgPSBleHAoJG5wZXIgKiBsb2coMSArICRyYXRlKSk7CgkJCSR5ID0gJHB2ICogJGYgKyAkcG10ICogKDEgLyAkcmF0ZSArICR0eXBlKSAqICgkZiAtIDEpICsgJGZ2OwoJCX0KCQkkeTAgPSAkcHYgKyAkcG10ICogJG5wZXIgKyAkZnY7CgkJJHkxID0gJHB2ICogJGYgKyAkcG10ICogKDEgLyAkcmF0ZSArICR0eXBlKSAqICgkZiAtIDEpICsgJGZ2OwoKCQkvLyBmaW5kIHJvb3QgYnkgc2VjYW50IG1ldGhvZAoJCSRpICA9ICR4MCA9IDAuMDsKCQkkeDEgPSAkcmF0ZTsKCQl3aGlsZSAoKGFicygkeTAgLSAkeTEpID4gRklOQU5DSUFMX1BSRUNJU0lPTikgJiYgKCRpIDwgRklOQU5DSUFMX01BWF9JVEVSQVRJT05TKSkgewoJCQkkcmF0ZSA9ICgkeTEgKiAkeDAgLSAkeTAgKiAkeDEpIC8gKCR5MSAtICR5MCk7CgkJCSR4MCA9ICR4MTsKCQkJJHgxID0gJHJhdGU7CgkJCWlmICgoJG5wZXIgKiBhYnMoJHBtdCkpID4gKCRwdiAtICRmdikpCgkJCQkkeDEgPSBhYnMoJHgxKTsKCgkJCWlmIChhYnMoJHJhdGUpIDwgRklOQU5DSUFMX1BSRUNJU0lPTikgewoJCQkJJHkgPSAkcHYgKiAoMSArICRucGVyICogJHJhdGUpICsgJHBtdCAqICgxICsgJHJhdGUgKiAkdHlwZSkgKiAkbnBlciArICRmdjsKCQkJfSBlbHNlIHsKCQkJCSRmID0gZXhwKCRucGVyICogbG9nKDEgKyAkcmF0ZSkpOwoJCQkJJHkgPSAkcHYgKiAkZiArICRwbXQgKiAoMSAvICRyYXRlICsgJHR5cGUpICogKCRmIC0gMSkgKyAkZnY7CgkJCX0KCgkJCSR5MCA9ICR5MTsKCQkJJHkxID0gJHk7CgkJCSsrJGk7CgkJfQoJCXJldHVybiAkcmF0ZTsKCX0JLy8JZnVuY3Rpb24gUkFURSgpCgoKCS8qKgoJICogUkVDRUlWRUQKCSAqCgkgKiBSZXR1cm5zIHRoZSBwcmljZSBwZXIgJDEwMCBmYWNlIHZhbHVlIG9mIGEgZGlzY291bnRlZCBzZWN1cml0eS4KCSAqCgkgKiBAcGFyYW0JbWl4ZWQJc2V0dGxlbWVudAlUaGUgc2VjdXJpdHkncyBzZXR0bGVtZW50IGRhdGUuCgkgKgkJCQkJCQkJVGhlIHNlY3VyaXR5IHNldHRsZW1lbnQgZGF0ZSBpcyB0aGUgZGF0ZSBhZnRlciB0aGUgaXNzdWUgZGF0ZSB3aGVuIHRoZSBzZWN1cml0eSBpcyB0cmFkZWQgdG8gdGhlIGJ1eWVyLgoJICogQHBhcmFtCW1peGVkCW1hdHVyaXR5CVRoZSBzZWN1cml0eSdzIG1hdHVyaXR5IGRhdGUuCgkgKgkJCQkJCQkJVGhlIG1hdHVyaXR5IGRhdGUgaXMgdGhlIGRhdGUgd2hlbiB0aGUgc2VjdXJpdHkgZXhwaXJlcy4KCSAqIEBwYXJhbQlpbnQJCWludmVzdG1lbnQJVGhlIGFtb3VudCBpbnZlc3RlZCBpbiB0aGUgc2VjdXJpdHkuCgkgKiBAcGFyYW0JaW50CQlkaXNjb3VudAlUaGUgc2VjdXJpdHkncyBkaXNjb3VudCByYXRlLgoJICogQHBhcmFtCWludAkJYmFzaXMJCVRoZSB0eXBlIG9mIGRheSBjb3VudCB0byB1c2UuCgkgKgkJCQkJCQkJCQkwIG9yIG9taXR0ZWQJVVMgKE5BU0QpIDMwLzM2MAoJICoJCQkJCQkJCQkJMQkJCQlBY3R1YWwvYWN0dWFsCgkgKgkJCQkJCQkJCQkyCQkJCUFjdHVhbC8zNjAKCSAqCQkJCQkJCQkJCTMJCQkJQWN0dWFsLzM2NQoJICoJCQkJCQkJCQkJNAkJCQlFdXJvcGVhbiAzMC8zNjAKCSAqIEByZXR1cm4JZmxvYXQKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBSRUNFSVZFRCgkc2V0dGxlbWVudCwgJG1hdHVyaXR5LCAkaW52ZXN0bWVudCwgJGRpc2NvdW50LCAkYmFzaXM9MCkgewoJCSRzZXR0bGVtZW50CT0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuU2luZ2xlVmFsdWUoJHNldHRsZW1lbnQpOwoJCSRtYXR1cml0eQk9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlblNpbmdsZVZhbHVlKCRtYXR1cml0eSk7CgkJJGludmVzdG1lbnQJPSAoZmxvYXQpIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlblNpbmdsZVZhbHVlKCRpbnZlc3RtZW50KTsKCQkkZGlzY291bnQJPSAoZmxvYXQpIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlblNpbmdsZVZhbHVlKCRkaXNjb3VudCk7CgkJJGJhc2lzCQk9IChpbnQpIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlblNpbmdsZVZhbHVlKCRiYXNpcyk7CgoJCS8vCVZhbGlkYXRlCgkJaWYgKChpc19udW1lcmljKCRpbnZlc3RtZW50KSkgJiYgKGlzX251bWVyaWMoJGRpc2NvdW50KSkgJiYgKGlzX251bWVyaWMoJGJhc2lzKSkpIHsKCQkJaWYgKCgkaW52ZXN0bWVudCA8PSAwKSB8fCAoJGRpc2NvdW50IDw9IDApKSB7CgkJCQlyZXR1cm4gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpOYU4oKTsKCQkJfQoJCQkkZGF5c0JldHdlZW5TZXR0bGVtZW50QW5kTWF0dXJpdHkgPSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9EYXRlVGltZTo6WUVBUkZSQUMoJHNldHRsZW1lbnQsICRtYXR1cml0eSwgJGJhc2lzKTsKCQkJaWYgKCFpc19udW1lcmljKCRkYXlzQmV0d2VlblNldHRsZW1lbnRBbmRNYXR1cml0eSkpIHsKCQkJCS8vCXJldHVybiBkYXRlIGVycm9yCgkJCQlyZXR1cm4gJGRheXNCZXR3ZWVuU2V0dGxlbWVudEFuZE1hdHVyaXR5OwoJCQl9CgoJCQlyZXR1cm4gJGludmVzdG1lbnQgLyAoIDEgLSAoJGRpc2NvdW50ICogJGRheXNCZXR3ZWVuU2V0dGxlbWVudEFuZE1hdHVyaXR5KSk7CgkJfQoJCXJldHVybiBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OlZBTFVFKCk7Cgl9CS8vCWZ1bmN0aW9uIFJFQ0VJVkVEKCkKCgoJLyoqCgkgKiBTTE4KCSAqCgkgKiBSZXR1cm5zIHRoZSBzdHJhaWdodC1saW5lIGRlcHJlY2lhdGlvbiBvZiBhbiBhc3NldCBmb3Igb25lIHBlcmlvZAoJICoKCSAqIEBwYXJhbQljb3N0CQlJbml0aWFsIGNvc3Qgb2YgdGhlIGFzc2V0CgkgKiBAcGFyYW0Jc2FsdmFnZQkJVmFsdWUgYXQgdGhlIGVuZCBvZiB0aGUgZGVwcmVjaWF0aW9uCgkgKiBAcGFyYW0JbGlmZQkJTnVtYmVyIG9mIHBlcmlvZHMgb3ZlciB3aGljaCB0aGUgYXNzZXQgaXMgZGVwcmVjaWF0ZWQKCSAqIEByZXR1cm4JZmxvYXQKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBTTE4oJGNvc3QsICRzYWx2YWdlLCAkbGlmZSkgewoJCSRjb3N0CQk9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlblNpbmdsZVZhbHVlKCRjb3N0KTsKCQkkc2FsdmFnZQk9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlblNpbmdsZVZhbHVlKCRzYWx2YWdlKTsKCQkkbGlmZQkJPSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5TaW5nbGVWYWx1ZSgkbGlmZSk7CgoJCS8vIENhbGN1bGF0ZQoJCWlmICgoaXNfbnVtZXJpYygkY29zdCkpICYmIChpc19udW1lcmljKCRzYWx2YWdlKSkgJiYgKGlzX251bWVyaWMoJGxpZmUpKSkgewoJCQlpZiAoJGxpZmUgPCAwKSB7CgkJCQlyZXR1cm4gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpOYU4oKTsKCQkJfQoJCQlyZXR1cm4gKCRjb3N0IC0gJHNhbHZhZ2UpIC8gJGxpZmU7CgkJfQoJCXJldHVybiBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OlZBTFVFKCk7Cgl9CS8vCWZ1bmN0aW9uIFNMTigpCgoKCS8qKgoJICogU1lECgkgKgoJICogUmV0dXJucyB0aGUgc3VtLW9mLXllYXJzJyBkaWdpdHMgZGVwcmVjaWF0aW9uIG9mIGFuIGFzc2V0IGZvciBhIHNwZWNpZmllZCBwZXJpb2QuCgkgKgoJICogQHBhcmFtCWNvc3QJCUluaXRpYWwgY29zdCBvZiB0aGUgYXNzZXQKCSAqIEBwYXJhbQlzYWx2YWdlCQlWYWx1ZSBhdCB0aGUgZW5kIG9mIHRoZSBkZXByZWNpYXRpb24KCSAqIEBwYXJhbQlsaWZlCQlOdW1iZXIgb2YgcGVyaW9kcyBvdmVyIHdoaWNoIHRoZSBhc3NldCBpcyBkZXByZWNpYXRlZAoJICogQHBhcmFtCXBlcmlvZAkJUGVyaW9kCgkgKiBAcmV0dXJuCWZsb2F0CgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gU1lEKCRjb3N0LCAkc2FsdmFnZSwgJGxpZmUsICRwZXJpb2QpIHsKCQkkY29zdAkJPSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5TaW5nbGVWYWx1ZSgkY29zdCk7CgkJJHNhbHZhZ2UJPSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5TaW5nbGVWYWx1ZSgkc2FsdmFnZSk7CgkJJGxpZmUJCT0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuU2luZ2xlVmFsdWUoJGxpZmUpOwoJCSRwZXJpb2QJCT0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuU2luZ2xlVmFsdWUoJHBlcmlvZCk7CgoJCS8vIENhbGN1bGF0ZQoJCWlmICgoaXNfbnVtZXJpYygkY29zdCkpICYmIChpc19udW1lcmljKCRzYWx2YWdlKSkgJiYgKGlzX251bWVyaWMoJGxpZmUpKSAmJiAoaXNfbnVtZXJpYygkcGVyaW9kKSkpIHsKCQkJaWYgKCgkbGlmZSA8IDEpIHx8ICgkcGVyaW9kID4gJGxpZmUpKSB7CgkJCQlyZXR1cm4gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpOYU4oKTsKCQkJfQoJCQlyZXR1cm4gKCgkY29zdCAtICRzYWx2YWdlKSAqICgkbGlmZSAtICRwZXJpb2QgKyAxKSAqIDIpIC8gKCRsaWZlICogKCRsaWZlICsgMSkpOwoJCX0KCQlyZXR1cm4gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpWQUxVRSgpOwoJfQkvLwlmdW5jdGlvbiBTWUQoKQoKCgkvKioKCSAqIFRCSUxMRVEKCSAqCgkgKiBSZXR1cm5zIHRoZSBib25kLWVxdWl2YWxlbnQgeWllbGQgZm9yIGEgVHJlYXN1cnkgYmlsbC4KCSAqCgkgKiBAcGFyYW0JbWl4ZWQJc2V0dGxlbWVudAlUaGUgVHJlYXN1cnkgYmlsbCdzIHNldHRsZW1lbnQgZGF0ZS4KCSAqCQkJCQkJCQlUaGUgVHJlYXN1cnkgYmlsbCdzIHNldHRsZW1lbnQgZGF0ZSBpcyB0aGUgZGF0ZSBhZnRlciB0aGUgaXNzdWUgZGF0ZSB3aGVuIHRoZSBUcmVhc3VyeSBiaWxsIGlzIHRyYWRlZCB0byB0aGUgYnV5ZXIuCgkgKiBAcGFyYW0JbWl4ZWQJbWF0dXJpdHkJVGhlIFRyZWFzdXJ5IGJpbGwncyBtYXR1cml0eSBkYXRlLgoJICoJCQkJCQkJCVRoZSBtYXR1cml0eSBkYXRlIGlzIHRoZSBkYXRlIHdoZW4gdGhlIFRyZWFzdXJ5IGJpbGwgZXhwaXJlcy4KCSAqIEBwYXJhbQlpbnQJCWRpc2NvdW50CVRoZSBUcmVhc3VyeSBiaWxsJ3MgZGlzY291bnQgcmF0ZS4KCSAqIEByZXR1cm4JZmxvYXQKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBUQklMTEVRKCRzZXR0bGVtZW50LCAkbWF0dXJpdHksICRkaXNjb3VudCkgewoJCSRzZXR0bGVtZW50CT0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuU2luZ2xlVmFsdWUoJHNldHRsZW1lbnQpOwoJCSRtYXR1cml0eQk9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlblNpbmdsZVZhbHVlKCRtYXR1cml0eSk7CgkJJGRpc2NvdW50CT0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuU2luZ2xlVmFsdWUoJGRpc2NvdW50KTsKCgkJLy8JVXNlIFRCSUxMUFJJQ0UgZm9yIHZhbGlkYXRpb24KCQkkdGVzdFZhbHVlID0gc2VsZjo6VEJJTExQUklDRSgkc2V0dGxlbWVudCwgJG1hdHVyaXR5LCAkZGlzY291bnQpOwoJCWlmIChpc19zdHJpbmcoJHRlc3RWYWx1ZSkpIHsKCQkJcmV0dXJuICR0ZXN0VmFsdWU7CgkJfQoKCQlpZiAoaXNfc3RyaW5nKCRtYXR1cml0eSA9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0RhdGVUaW1lOjpfZ2V0RGF0ZVZhbHVlKCRtYXR1cml0eSkpKSB7CgkJCXJldHVybiBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OlZBTFVFKCk7CgkJfQoKCQlpZiAoUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpnZXRDb21wYXRpYmlsaXR5TW9kZSgpID09IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6Q09NUEFUSUJJTElUWV9PUEVOT0ZGSUNFKSB7CgkJCSsrJG1hdHVyaXR5OwoJCQkkZGF5c0JldHdlZW5TZXR0bGVtZW50QW5kTWF0dXJpdHkgPSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9EYXRlVGltZTo6WUVBUkZSQUMoJHNldHRsZW1lbnQsICRtYXR1cml0eSkgKiAzNjA7CgkJfSBlbHNlIHsKCQkJJGRheXNCZXR3ZWVuU2V0dGxlbWVudEFuZE1hdHVyaXR5ID0gKFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0RhdGVUaW1lOjpfZ2V0RGF0ZVZhbHVlKCRtYXR1cml0eSkgLSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9EYXRlVGltZTo6X2dldERhdGVWYWx1ZSgkc2V0dGxlbWVudCkpOwoJCX0KCgkJcmV0dXJuICgzNjUgKiAkZGlzY291bnQpIC8gKDM2MCAtICRkaXNjb3VudCAqICRkYXlzQmV0d2VlblNldHRsZW1lbnRBbmRNYXR1cml0eSk7Cgl9CS8vCWZ1bmN0aW9uIFRCSUxMRVEoKQoKCgkvKioKCSAqIFRCSUxMUFJJQ0UKCSAqCgkgKiBSZXR1cm5zIHRoZSB5aWVsZCBmb3IgYSBUcmVhc3VyeSBiaWxsLgoJICoKCSAqIEBwYXJhbQltaXhlZAlzZXR0bGVtZW50CVRoZSBUcmVhc3VyeSBiaWxsJ3Mgc2V0dGxlbWVudCBkYXRlLgoJICoJCQkJCQkJCVRoZSBUcmVhc3VyeSBiaWxsJ3Mgc2V0dGxlbWVudCBkYXRlIGlzIHRoZSBkYXRlIGFmdGVyIHRoZSBpc3N1ZSBkYXRlIHdoZW4gdGhlIFRyZWFzdXJ5IGJpbGwgaXMgdHJhZGVkIHRvIHRoZSBidXllci4KCSAqIEBwYXJhbQltaXhlZAltYXR1cml0eQlUaGUgVHJlYXN1cnkgYmlsbCdzIG1hdHVyaXR5IGRhdGUuCgkgKgkJCQkJCQkJVGhlIG1hdHVyaXR5IGRhdGUgaXMgdGhlIGRhdGUgd2hlbiB0aGUgVHJlYXN1cnkgYmlsbCBleHBpcmVzLgoJICogQHBhcmFtCWludAkJZGlzY291bnQJVGhlIFRyZWFzdXJ5IGJpbGwncyBkaXNjb3VudCByYXRlLgoJICogQHJldHVybglmbG9hdAoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIFRCSUxMUFJJQ0UoJHNldHRsZW1lbnQsICRtYXR1cml0eSwgJGRpc2NvdW50KSB7CgkJJHNldHRsZW1lbnQJPSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5TaW5nbGVWYWx1ZSgkc2V0dGxlbWVudCk7CgkJJG1hdHVyaXR5CT0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuU2luZ2xlVmFsdWUoJG1hdHVyaXR5KTsKCQkkZGlzY291bnQJPSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5TaW5nbGVWYWx1ZSgkZGlzY291bnQpOwoKCQlpZiAoaXNfc3RyaW5nKCRtYXR1cml0eSA9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0RhdGVUaW1lOjpfZ2V0RGF0ZVZhbHVlKCRtYXR1cml0eSkpKSB7CgkJCXJldHVybiBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OlZBTFVFKCk7CgkJfQoKCQkvLwlWYWxpZGF0ZQoJCWlmIChpc19udW1lcmljKCRkaXNjb3VudCkpIHsKCQkJaWYgKCRkaXNjb3VudCA8PSAwKSB7CgkJCQlyZXR1cm4gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpOYU4oKTsKCQkJfQoKCQkJaWYgKFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6Z2V0Q29tcGF0aWJpbGl0eU1vZGUoKSA9PSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OkNPTVBBVElCSUxJVFlfT1BFTk9GRklDRSkgewoJCQkJKyskbWF0dXJpdHk7CgkJCQkkZGF5c0JldHdlZW5TZXR0bGVtZW50QW5kTWF0dXJpdHkgPSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9EYXRlVGltZTo6WUVBUkZSQUMoJHNldHRsZW1lbnQsICRtYXR1cml0eSkgKiAzNjA7CgkJCQlpZiAoIWlzX251bWVyaWMoJGRheXNCZXR3ZWVuU2V0dGxlbWVudEFuZE1hdHVyaXR5KSkgewoJCQkJCS8vCXJldHVybiBkYXRlIGVycm9yCgkJCQkJcmV0dXJuICRkYXlzQmV0d2VlblNldHRsZW1lbnRBbmRNYXR1cml0eTsKCQkJCX0KCQkJfSBlbHNlIHsKCQkJCSRkYXlzQmV0d2VlblNldHRsZW1lbnRBbmRNYXR1cml0eSA9IChQSFBFeGNlbF9DYWxjdWxhdGlvbl9EYXRlVGltZTo6X2dldERhdGVWYWx1ZSgkbWF0dXJpdHkpIC0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRGF0ZVRpbWU6Ol9nZXREYXRlVmFsdWUoJHNldHRsZW1lbnQpKTsKCQkJfQoKCQkJaWYgKCRkYXlzQmV0d2VlblNldHRsZW1lbnRBbmRNYXR1cml0eSA+IDM2MCkgewoJCQkJcmV0dXJuIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6TmFOKCk7CgkJCX0KCgkJCSRwcmljZSA9IDEwMCAqICgxIC0gKCgkZGlzY291bnQgKiAkZGF5c0JldHdlZW5TZXR0bGVtZW50QW5kTWF0dXJpdHkpIC8gMzYwKSk7CgkJCWlmICgkcHJpY2UgPD0gMCkgewoJCQkJcmV0dXJuIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6TmFOKCk7CgkJCX0KCQkJcmV0dXJuICRwcmljZTsKCQl9CgkJcmV0dXJuIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6VkFMVUUoKTsKCX0JLy8JZnVuY3Rpb24gVEJJTExQUklDRSgpCgoKCS8qKgoJICogVEJJTExZSUVMRAoJICoKCSAqIFJldHVybnMgdGhlIHlpZWxkIGZvciBhIFRyZWFzdXJ5IGJpbGwuCgkgKgoJICogQHBhcmFtCW1peGVkCXNldHRsZW1lbnQJVGhlIFRyZWFzdXJ5IGJpbGwncyBzZXR0bGVtZW50IGRhdGUuCgkgKgkJCQkJCQkJVGhlIFRyZWFzdXJ5IGJpbGwncyBzZXR0bGVtZW50IGRhdGUgaXMgdGhlIGRhdGUgYWZ0ZXIgdGhlIGlzc3VlIGRhdGUgd2hlbiB0aGUgVHJlYXN1cnkgYmlsbCBpcyB0cmFkZWQgdG8gdGhlIGJ1eWVyLgoJICogQHBhcmFtCW1peGVkCW1hdHVyaXR5CVRoZSBUcmVhc3VyeSBiaWxsJ3MgbWF0dXJpdHkgZGF0ZS4KCSAqCQkJCQkJCQlUaGUgbWF0dXJpdHkgZGF0ZSBpcyB0aGUgZGF0ZSB3aGVuIHRoZSBUcmVhc3VyeSBiaWxsIGV4cGlyZXMuCgkgKiBAcGFyYW0JaW50CQlwcmljZQkJVGhlIFRyZWFzdXJ5IGJpbGwncyBwcmljZSBwZXIgJDEwMCBmYWNlIHZhbHVlLgoJICogQHJldHVybglmbG9hdAoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIFRCSUxMWUlFTEQoJHNldHRsZW1lbnQsICRtYXR1cml0eSwgJHByaWNlKSB7CgkJJHNldHRsZW1lbnQJPSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5TaW5nbGVWYWx1ZSgkc2V0dGxlbWVudCk7CgkJJG1hdHVyaXR5CT0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuU2luZ2xlVmFsdWUoJG1hdHVyaXR5KTsKCQkkcHJpY2UJCT0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuU2luZ2xlVmFsdWUoJHByaWNlKTsKCgkJLy8JVmFsaWRhdGUKCQlpZiAoaXNfbnVtZXJpYygkcHJpY2UpKSB7CgkJCWlmICgkcHJpY2UgPD0gMCkgewoJCQkJcmV0dXJuIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6TmFOKCk7CgkJCX0KCgkJCWlmIChQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmdldENvbXBhdGliaWxpdHlNb2RlKCkgPT0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpDT01QQVRJQklMSVRZX09QRU5PRkZJQ0UpIHsKCQkJCSsrJG1hdHVyaXR5OwoJCQkJJGRheXNCZXR3ZWVuU2V0dGxlbWVudEFuZE1hdHVyaXR5ID0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRGF0ZVRpbWU6OllFQVJGUkFDKCRzZXR0bGVtZW50LCAkbWF0dXJpdHkpICogMzYwOwoJCQkJaWYgKCFpc19udW1lcmljKCRkYXlzQmV0d2VlblNldHRsZW1lbnRBbmRNYXR1cml0eSkpIHsKCQkJCQkvLwlyZXR1cm4gZGF0ZSBlcnJvcgoJCQkJCXJldHVybiAkZGF5c0JldHdlZW5TZXR0bGVtZW50QW5kTWF0dXJpdHk7CgkJCQl9CgkJCX0gZWxzZSB7CgkJCQkkZGF5c0JldHdlZW5TZXR0bGVtZW50QW5kTWF0dXJpdHkgPSAoUEhQRXhjZWxfQ2FsY3VsYXRpb25fRGF0ZVRpbWU6Ol9nZXREYXRlVmFsdWUoJG1hdHVyaXR5KSAtIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0RhdGVUaW1lOjpfZ2V0RGF0ZVZhbHVlKCRzZXR0bGVtZW50KSk7CgkJCX0KCgkJCWlmICgkZGF5c0JldHdlZW5TZXR0bGVtZW50QW5kTWF0dXJpdHkgPiAzNjApIHsKCQkJCXJldHVybiBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6Ok5hTigpOwoJCQl9CgoJCQlyZXR1cm4gKCgxMDAgLSAkcHJpY2UpIC8gJHByaWNlKSAqICgzNjAgLyAkZGF5c0JldHdlZW5TZXR0bGVtZW50QW5kTWF0dXJpdHkpOwoJCX0KCQlyZXR1cm4gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpWQUxVRSgpOwoJfQkvLwlmdW5jdGlvbiBUQklMTFlJRUxEKCkKCgoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBYSVJSKCR2YWx1ZXMsICRkYXRlcywgJGd1ZXNzID0gMC4xKSB7CgkJaWYgKCghaXNfYXJyYXkoJHZhbHVlcykpICYmICghaXNfYXJyYXkoJGRhdGVzKSkpIHJldHVybiBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OlZBTFVFKCk7CgkJJHZhbHVlcwk9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlbkFycmF5KCR2YWx1ZXMpOwoJCSRkYXRlcwk9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlbkFycmF5KCRkYXRlcyk7CgkJJGd1ZXNzID0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuU2luZ2xlVmFsdWUoJGd1ZXNzKTsKCQlpZiAoY291bnQoJHZhbHVlcykgIT0gY291bnQoJGRhdGVzKSkgcmV0dXJuIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6TmFOKCk7CgoJCS8vIGNyZWF0ZSBhbiBpbml0aWFsIHJhbmdlLCB3aXRoIGEgcm9vdCBzb21ld2hlcmUgYmV0d2VlbiAwIGFuZCBndWVzcwoJCSR4MSA9IDAuMDsKCQkkeDIgPSAkZ3Vlc3M7CgkJJGYxID0gc2VsZjo6WE5QVigkeDEsICR2YWx1ZXMsICRkYXRlcyk7CgkJJGYyID0gc2VsZjo6WE5QVigkeDIsICR2YWx1ZXMsICRkYXRlcyk7CgkJZm9yICgkaSA9IDA7ICRpIDwgRklOQU5DSUFMX01BWF9JVEVSQVRJT05TOyArKyRpKSB7CgkJCWlmICgoJGYxICogJGYyKSA8IDAuMCkgYnJlYWs7CgkJCWlmIChhYnMoJGYxKSA8IGFicygkZjIpKSB7CgkJCQkkZjEgPSBzZWxmOjpYTlBWKCR4MSArPSAxLjYgKiAoJHgxIC0gJHgyKSwgJHZhbHVlcywgJGRhdGVzKTsKCQkJfSBlbHNlIHsKCQkJCSRmMiA9IHNlbGY6OlhOUFYoJHgyICs9IDEuNiAqICgkeDIgLSAkeDEpLCAkdmFsdWVzLCAkZGF0ZXMpOwoJCQl9CgkJfQoJCWlmICgoJGYxICogJGYyKSA+IDAuMCkgcmV0dXJuIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6VkFMVUUoKTsKCgkJJGYgPSBzZWxmOjpYTlBWKCR4MSwgJHZhbHVlcywgJGRhdGVzKTsKCQlpZiAoJGYgPCAwLjApIHsKCQkJJHJ0YiA9ICR4MTsKCQkJJGR4ID0gJHgyIC0gJHgxOwoJCX0gZWxzZSB7CgkJCSRydGIgPSAkeDI7CgkJCSRkeCA9ICR4MSAtICR4MjsKCQl9CgoJCWZvciAoJGkgPSAwOyAgJGkgPCBGSU5BTkNJQUxfTUFYX0lURVJBVElPTlM7ICsrJGkpIHsKCQkJJGR4ICo9IDAuNTsKCQkJJHhfbWlkID0gJHJ0YiArICRkeDsKCQkJJGZfbWlkID0gc2VsZjo6WE5QVigkeF9taWQsICR2YWx1ZXMsICRkYXRlcyk7CgkJCWlmICgkZl9taWQgPD0gMC4wKSAkcnRiID0gJHhfbWlkOwoJCQlpZiAoKGFicygkZl9taWQpIDwgRklOQU5DSUFMX1BSRUNJU0lPTikgfHwgKGFicygkZHgpIDwgRklOQU5DSUFMX1BSRUNJU0lPTikpIHJldHVybiAkeF9taWQ7CgkJfQoJCXJldHVybiBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OlZBTFVFKCk7Cgl9CgoKCS8qKgoJICogWE5QVgoJICoKCSAqIFJldHVybnMgdGhlIG5ldCBwcmVzZW50IHZhbHVlIGZvciBhIHNjaGVkdWxlIG9mIGNhc2ggZmxvd3MgdGhhdCBpcyBub3QgbmVjZXNzYXJpbHkgcGVyaW9kaWMuCgkgKiBUbyBjYWxjdWxhdGUgdGhlIG5ldCBwcmVzZW50IHZhbHVlIGZvciBhIHNlcmllcyBvZiBjYXNoIGZsb3dzIHRoYXQgaXMgcGVyaW9kaWMsIHVzZSB0aGUgTlBWIGZ1bmN0aW9uLgoJICoKCSAqIEV4Y2VsIEZ1bmN0aW9uOgoJICoJCT1YTlBWKHJhdGUsdmFsdWVzLGRhdGVzKQoJICoKCSAqIEBwYXJhbQlmbG9hdAkJCSRyYXRlCQlUaGUgZGlzY291bnQgcmF0ZSB0byBhcHBseSB0byB0aGUgY2FzaCBmbG93cy4KCSAqIEBwYXJhbQlhcnJheSBvZiBmbG9hdAkkdmFsdWVzCQlBIHNlcmllcyBvZiBjYXNoIGZsb3dzIHRoYXQgY29ycmVzcG9uZHMgdG8gYSBzY2hlZHVsZSBvZiBwYXltZW50cyBpbiBkYXRlcy4gVGhlIGZpcnN0IHBheW1lbnQgaXMgb3B0aW9uYWwgYW5kIGNvcnJlc3BvbmRzIHRvIGEgY29zdCBvciBwYXltZW50IHRoYXQgb2NjdXJzIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGludmVzdG1lbnQuIElmIHRoZSBmaXJzdCB2YWx1ZSBpcyBhIGNvc3Qgb3IgcGF5bWVudCwgaXQgbXVzdCBiZSBhIG5lZ2F0aXZlIHZhbHVlLiBBbGwgc3VjY2VlZGluZyBwYXltZW50cyBhcmUgZGlzY291bnRlZCBiYXNlZCBvbiBhIDM2NS1kYXkgeWVhci4gVGhlIHNlcmllcyBvZiB2YWx1ZXMgbXVzdCBjb250YWluIGF0IGxlYXN0IG9uZSBwb3NpdGl2ZSB2YWx1ZSBhbmQgb25lIG5lZ2F0aXZlIHZhbHVlLgoJICogQHBhcmFtCWFycmF5IG9mIG1peGVkCSRkYXRlcwkJQSBzY2hlZHVsZSBvZiBwYXltZW50IGRhdGVzIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGNhc2ggZmxvdyBwYXltZW50cy4gVGhlIGZpcnN0IHBheW1lbnQgZGF0ZSBpbmRpY2F0ZXMgdGhlIGJlZ2lubmluZyBvZiB0aGUgc2NoZWR1bGUgb2YgcGF5bWVudHMuIEFsbCBvdGhlciBkYXRlcyBtdXN0IGJlIGxhdGVyIHRoYW4gdGhpcyBkYXRlLCBidXQgdGhleSBtYXkgb2NjdXIgaW4gYW55IG9yZGVyLgoJICogQHJldHVybglmbG9hdAoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIFhOUFYoJHJhdGUsICR2YWx1ZXMsICRkYXRlcykgewoJCSRyYXRlID0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuU2luZ2xlVmFsdWUoJHJhdGUpOwoJCWlmICghaXNfbnVtZXJpYygkcmF0ZSkpIHJldHVybiBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OlZBTFVFKCk7CgkJaWYgKCghaXNfYXJyYXkoJHZhbHVlcykpIHx8ICghaXNfYXJyYXkoJGRhdGVzKSkpIHJldHVybiBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OlZBTFVFKCk7CgkJJHZhbHVlcwk9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlbkFycmF5KCR2YWx1ZXMpOwoJCSRkYXRlcwk9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlbkFycmF5KCRkYXRlcyk7CgkJJHZhbENvdW50ID0gY291bnQoJHZhbHVlcyk7CgkJaWYgKCR2YWxDb3VudCAhPSBjb3VudCgkZGF0ZXMpKSByZXR1cm4gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpOYU4oKTsKCQlpZiAoKG1pbigkdmFsdWVzKSA+IDApIHx8IChtYXgoJHZhbHVlcykgPCAwKSkgcmV0dXJuIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6VkFMVUUoKTsKCgkJJHhucHYgPSAwLjA7CgkJZm9yICgkaSA9IDA7ICRpIDwgJHZhbENvdW50OyArKyRpKSB7CgkJCWlmICghaXNfbnVtZXJpYygkdmFsdWVzWyRpXSkpIHJldHVybiBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OlZBTFVFKCk7CgkJCSR4bnB2ICs9ICR2YWx1ZXNbJGldIC8gcG93KDEgKyAkcmF0ZSwgUEhQRXhjZWxfQ2FsY3VsYXRpb25fRGF0ZVRpbWU6OkRBVEVESUYoJGRhdGVzWzBdLCRkYXRlc1skaV0sJ2QnKSAvIDM2NSk7CgkJfQoJCXJldHVybiAoaXNfZmluaXRlKCR4bnB2KSkgPyAkeG5wdiA6IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6VkFMVUUoKTsKCX0JLy8JZnVuY3Rpb24gWE5QVigpCgoKCS8qKgoJICogWUlFTERESVNDCgkgKgoJICogUmV0dXJucyB0aGUgYW5udWFsIHlpZWxkIG9mIGEgc2VjdXJpdHkgdGhhdCBwYXlzIGludGVyZXN0IGF0IG1hdHVyaXR5LgoJICoKCSAqIEBwYXJhbQltaXhlZAlzZXR0bGVtZW50CVRoZSBzZWN1cml0eSdzIHNldHRsZW1lbnQgZGF0ZS4KCSAqCQkJCQkJCQlUaGUgc2VjdXJpdHkncyBzZXR0bGVtZW50IGRhdGUgaXMgdGhlIGRhdGUgYWZ0ZXIgdGhlIGlzc3VlIGRhdGUgd2hlbiB0aGUgc2VjdXJpdHkgaXMgdHJhZGVkIHRvIHRoZSBidXllci4KCSAqIEBwYXJhbQltaXhlZAltYXR1cml0eQlUaGUgc2VjdXJpdHkncyBtYXR1cml0eSBkYXRlLgoJICoJCQkJCQkJCVRoZSBtYXR1cml0eSBkYXRlIGlzIHRoZSBkYXRlIHdoZW4gdGhlIHNlY3VyaXR5IGV4cGlyZXMuCgkgKiBAcGFyYW0JaW50CQlwcmljZQkJVGhlIHNlY3VyaXR5J3MgcHJpY2UgcGVyICQxMDAgZmFjZSB2YWx1ZS4KCSAqIEBwYXJhbQlpbnQJCXJlZGVtcHRpb24JVGhlIHNlY3VyaXR5J3MgcmVkZW1wdGlvbiB2YWx1ZSBwZXIgJDEwMCBmYWNlIHZhbHVlLgoJICogQHBhcmFtCWludAkJYmFzaXMJCVRoZSB0eXBlIG9mIGRheSBjb3VudCB0byB1c2UuCgkgKgkJCQkJCQkJCQkwIG9yIG9taXR0ZWQJVVMgKE5BU0QpIDMwLzM2MAoJICoJCQkJCQkJCQkJMQkJCQlBY3R1YWwvYWN0dWFsCgkgKgkJCQkJCQkJCQkyCQkJCUFjdHVhbC8zNjAKCSAqCQkJCQkJCQkJCTMJCQkJQWN0dWFsLzM2NQoJICoJCQkJCQkJCQkJNAkJCQlFdXJvcGVhbiAzMC8zNjAKCSAqIEByZXR1cm4JZmxvYXQKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBZSUVMRERJU0MoJHNldHRsZW1lbnQsICRtYXR1cml0eSwgJHByaWNlLCAkcmVkZW1wdGlvbiwgJGJhc2lzPTApIHsKCQkkc2V0dGxlbWVudAk9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlblNpbmdsZVZhbHVlKCRzZXR0bGVtZW50KTsKCQkkbWF0dXJpdHkJPSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5TaW5nbGVWYWx1ZSgkbWF0dXJpdHkpOwoJCSRwcmljZQkJPSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5TaW5nbGVWYWx1ZSgkcHJpY2UpOwoJCSRyZWRlbXB0aW9uCT0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuU2luZ2xlVmFsdWUoJHJlZGVtcHRpb24pOwoJCSRiYXNpcwkJPSAoaW50KSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5TaW5nbGVWYWx1ZSgkYmFzaXMpOwoKCQkvLwlWYWxpZGF0ZQoJCWlmIChpc19udW1lcmljKCRwcmljZSkgJiYgaXNfbnVtZXJpYygkcmVkZW1wdGlvbikpIHsKCQkJaWYgKCgkcHJpY2UgPD0gMCkgfHwgKCRyZWRlbXB0aW9uIDw9IDApKSB7CgkJCQlyZXR1cm4gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpOYU4oKTsKCQkJfQoJCQkkZGF5c1BlclllYXIgPSBzZWxmOjpfZGF5c1BlclllYXIoUEhQRXhjZWxfQ2FsY3VsYXRpb25fRGF0ZVRpbWU6OllFQVIoJHNldHRsZW1lbnQpLCRiYXNpcyk7CgkJCWlmICghaXNfbnVtZXJpYygkZGF5c1BlclllYXIpKSB7CgkJCQlyZXR1cm4gJGRheXNQZXJZZWFyOwoJCQl9CgkJCSRkYXlzQmV0d2VlblNldHRsZW1lbnRBbmRNYXR1cml0eSA9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0RhdGVUaW1lOjpZRUFSRlJBQygkc2V0dGxlbWVudCwgJG1hdHVyaXR5LCRiYXNpcyk7CgkJCWlmICghaXNfbnVtZXJpYygkZGF5c0JldHdlZW5TZXR0bGVtZW50QW5kTWF0dXJpdHkpKSB7CgkJCQkvLwlyZXR1cm4gZGF0ZSBlcnJvcgoJCQkJcmV0dXJuICRkYXlzQmV0d2VlblNldHRsZW1lbnRBbmRNYXR1cml0eTsKCQkJfQoJCQkkZGF5c0JldHdlZW5TZXR0bGVtZW50QW5kTWF0dXJpdHkgKj0gJGRheXNQZXJZZWFyOwoKCQkJcmV0dXJuICgoJHJlZGVtcHRpb24gLSAkcHJpY2UpIC8gJHByaWNlKSAqICgkZGF5c1BlclllYXIgLyAkZGF5c0JldHdlZW5TZXR0bGVtZW50QW5kTWF0dXJpdHkpOwoJCX0KCQlyZXR1cm4gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpWQUxVRSgpOwoJfQkvLwlmdW5jdGlvbiBZSUVMRERJU0MoKQoKCgkvKioKCSAqIFlJRUxETUFUCgkgKgoJICogUmV0dXJucyB0aGUgYW5udWFsIHlpZWxkIG9mIGEgc2VjdXJpdHkgdGhhdCBwYXlzIGludGVyZXN0IGF0IG1hdHVyaXR5LgoJICoKCSAqIEBwYXJhbQltaXhlZAlzZXR0bGVtZW50CVRoZSBzZWN1cml0eSdzIHNldHRsZW1lbnQgZGF0ZS4KCSAqCQkJCQkJCQlUaGUgc2VjdXJpdHkncyBzZXR0bGVtZW50IGRhdGUgaXMgdGhlIGRhdGUgYWZ0ZXIgdGhlIGlzc3VlIGRhdGUgd2hlbiB0aGUgc2VjdXJpdHkgaXMgdHJhZGVkIHRvIHRoZSBidXllci4KCSAqIEBwYXJhbQltaXhlZAltYXR1cml0eQlUaGUgc2VjdXJpdHkncyBtYXR1cml0eSBkYXRlLgoJICoJCQkJCQkJCVRoZSBtYXR1cml0eSBkYXRlIGlzIHRoZSBkYXRlIHdoZW4gdGhlIHNlY3VyaXR5IGV4cGlyZXMuCgkgKiBAcGFyYW0JbWl4ZWQJaXNzdWUJCVRoZSBzZWN1cml0eSdzIGlzc3VlIGRhdGUuCgkgKiBAcGFyYW0JaW50CQlyYXRlCQlUaGUgc2VjdXJpdHkncyBpbnRlcmVzdCByYXRlIGF0IGRhdGUgb2YgaXNzdWUuCgkgKiBAcGFyYW0JaW50CQlwcmljZQkJVGhlIHNlY3VyaXR5J3MgcHJpY2UgcGVyICQxMDAgZmFjZSB2YWx1ZS4KCSAqIEBwYXJhbQlpbnQJCWJhc2lzCQlUaGUgdHlwZSBvZiBkYXkgY291bnQgdG8gdXNlLgoJICoJCQkJCQkJCQkJMCBvciBvbWl0dGVkCVVTIChOQVNEKSAzMC8zNjAKCSAqCQkJCQkJCQkJCTEJCQkJQWN0dWFsL2FjdHVhbAoJICoJCQkJCQkJCQkJMgkJCQlBY3R1YWwvMzYwCgkgKgkJCQkJCQkJCQkzCQkJCUFjdHVhbC8zNjUKCSAqCQkJCQkJCQkJCTQJCQkJRXVyb3BlYW4gMzAvMzYwCgkgKiBAcmV0dXJuCWZsb2F0CgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gWUlFTERNQVQoJHNldHRsZW1lbnQsICRtYXR1cml0eSwgJGlzc3VlLCAkcmF0ZSwgJHByaWNlLCAkYmFzaXM9MCkgewoJCSRzZXR0bGVtZW50CT0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuU2luZ2xlVmFsdWUoJHNldHRsZW1lbnQpOwoJCSRtYXR1cml0eQk9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlblNpbmdsZVZhbHVlKCRtYXR1cml0eSk7CgkJJGlzc3VlCQk9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlblNpbmdsZVZhbHVlKCRpc3N1ZSk7CgkJJHJhdGUJCT0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuU2luZ2xlVmFsdWUoJHJhdGUpOwoJCSRwcmljZQkJPSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5TaW5nbGVWYWx1ZSgkcHJpY2UpOwoJCSRiYXNpcwkJPSAoaW50KSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5TaW5nbGVWYWx1ZSgkYmFzaXMpOwoKCQkvLwlWYWxpZGF0ZQoJCWlmIChpc19udW1lcmljKCRyYXRlKSAmJiBpc19udW1lcmljKCRwcmljZSkpIHsKCQkJaWYgKCgkcmF0ZSA8PSAwKSB8fCAoJHByaWNlIDw9IDApKSB7CgkJCQlyZXR1cm4gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpOYU4oKTsKCQkJfQoJCQkkZGF5c1BlclllYXIgPSBzZWxmOjpfZGF5c1BlclllYXIoUEhQRXhjZWxfQ2FsY3VsYXRpb25fRGF0ZVRpbWU6OllFQVIoJHNldHRsZW1lbnQpLCRiYXNpcyk7CgkJCWlmICghaXNfbnVtZXJpYygkZGF5c1BlclllYXIpKSB7CgkJCQlyZXR1cm4gJGRheXNQZXJZZWFyOwoJCQl9CgkJCSRkYXlzQmV0d2Vlbklzc3VlQW5kU2V0dGxlbWVudCA9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0RhdGVUaW1lOjpZRUFSRlJBQygkaXNzdWUsICRzZXR0bGVtZW50LCAkYmFzaXMpOwoJCQlpZiAoIWlzX251bWVyaWMoJGRheXNCZXR3ZWVuSXNzdWVBbmRTZXR0bGVtZW50KSkgewoJCQkJLy8JcmV0dXJuIGRhdGUgZXJyb3IKCQkJCXJldHVybiAkZGF5c0JldHdlZW5Jc3N1ZUFuZFNldHRsZW1lbnQ7CgkJCX0KCQkJJGRheXNCZXR3ZWVuSXNzdWVBbmRTZXR0bGVtZW50ICo9ICRkYXlzUGVyWWVhcjsKCQkJJGRheXNCZXR3ZWVuSXNzdWVBbmRNYXR1cml0eSA9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0RhdGVUaW1lOjpZRUFSRlJBQygkaXNzdWUsICRtYXR1cml0eSwgJGJhc2lzKTsKCQkJaWYgKCFpc19udW1lcmljKCRkYXlzQmV0d2Vlbklzc3VlQW5kTWF0dXJpdHkpKSB7CgkJCQkvLwlyZXR1cm4gZGF0ZSBlcnJvcgoJCQkJcmV0dXJuICRkYXlzQmV0d2Vlbklzc3VlQW5kTWF0dXJpdHk7CgkJCX0KCQkJJGRheXNCZXR3ZWVuSXNzdWVBbmRNYXR1cml0eSAqPSAkZGF5c1BlclllYXI7CgkJCSRkYXlzQmV0d2VlblNldHRsZW1lbnRBbmRNYXR1cml0eSA9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0RhdGVUaW1lOjpZRUFSRlJBQygkc2V0dGxlbWVudCwgJG1hdHVyaXR5LCAkYmFzaXMpOwoJCQlpZiAoIWlzX251bWVyaWMoJGRheXNCZXR3ZWVuU2V0dGxlbWVudEFuZE1hdHVyaXR5KSkgewoJCQkJLy8JcmV0dXJuIGRhdGUgZXJyb3IKCQkJCXJldHVybiAkZGF5c0JldHdlZW5TZXR0bGVtZW50QW5kTWF0dXJpdHk7CgkJCX0KCQkJJGRheXNCZXR3ZWVuU2V0dGxlbWVudEFuZE1hdHVyaXR5ICo9ICRkYXlzUGVyWWVhcjsKCgkJCXJldHVybiAoKDEgKyAoKCRkYXlzQmV0d2Vlbklzc3VlQW5kTWF0dXJpdHkgLyAkZGF5c1BlclllYXIpICogJHJhdGUpIC0gKCgkcHJpY2UgLyAxMDApICsgKCgkZGF5c0JldHdlZW5Jc3N1ZUFuZFNldHRsZW1lbnQgLyAkZGF5c1BlclllYXIpICogJHJhdGUpKSkgLwoJCQkJICAgKCgkcHJpY2UgLyAxMDApICsgKCgkZGF5c0JldHdlZW5Jc3N1ZUFuZFNldHRsZW1lbnQgLyAkZGF5c1BlclllYXIpICogJHJhdGUpKSkgKgoJCQkJICAgKCRkYXlzUGVyWWVhciAvICRkYXlzQmV0d2VlblNldHRsZW1lbnRBbmRNYXR1cml0eSk7CgkJfQoJCXJldHVybiBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OlZBTFVFKCk7Cgl9CS8vCWZ1bmN0aW9uIFlJRUxETUFUKCkKCn0JLy8JY2xhc3MgUEhQRXhjZWxfQ2FsY3VsYXRpb25fRmluYW5jaWFsCg==]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Calculation/FormulaParser.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIFBIUEV4Y2VsCiAqCiAqIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICoKICogQGNhdGVnb3J5ICAgUEhQRXhjZWwKICogQHBhY2thZ2UgICAgUEhQRXhjZWxfQ2FsY3VsYXRpb24KICogQGNvcHlyaWdodCAgQ29weXJpZ2h0IChjKSAyMDA2IC0gMjAxMiBQSFBFeGNlbCAoaHR0cDovL3d3dy5jb2RlcGxleC5jb20vUEhQRXhjZWwpCiAqIEBsaWNlbnNlICAgIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9vbGQtbGljZW5zZXMvbGdwbC0yLjEudHh0CUxHUEwKICogQHZlcnNpb24gICAgMS43LjcsIDIwMTItMDUtMTkKICovCgoKLyoKUEFSVExZIEJBU0VEIE9OOgoJQ29weXJpZ2h0IChjKSAyMDA3IEUuIFcuIEJhY2h0YWwsIEluYy4KCglQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUKCWFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwKCWluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCglhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLAoJc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CgoJICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsCgkgIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KCglUaGUgc29mdHdhcmUgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aG91dCB3YXJyYW50eSBvZiBhbnkga2luZCwgZXhwcmVzcyBvciBpbXBsaWVkLCBpbmNsdWRpbmcgYnV0IG5vdAoJbGltaXRlZCB0byB0aGUgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHksIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlIGFuZCBub25pbmZyaW5nZW1lbnQuIEluCglubyBldmVudCBzaGFsbCB0aGUgYXV0aG9ycyBvciBjb3B5cmlnaHQgaG9sZGVycyBiZSBsaWFibGUgZm9yIGFueSBjbGFpbSwgZGFtYWdlcyBvciBvdGhlciBsaWFiaWxpdHksCgl3aGV0aGVyIGluIGFuIGFjdGlvbiBvZiBjb250cmFjdCwgdG9ydCBvciBvdGhlcndpc2UsIGFyaXNpbmcgZnJvbSwgb3V0IG9mIG9yIGluIGNvbm5lY3Rpb24gd2l0aCB0aGUKCXNvZnR3YXJlIG9yIHRoZSB1c2Ugb3Igb3RoZXIgZGVhbGluZ3MgaW4gdGhlIHNvZnR3YXJlLgoKCWh0dHA6Ly9ld2JpLmJsb2dzLmNvbS9kZXZlbG9wcy8yMDA3LzAzL2V4Y2VsX2Zvcm11bGFfcC5odG1sCglodHRwOi8vZXdiaS5ibG9ncy5jb20vZGV2ZWxvcHMvMjAwNC8xMi9leGNlbF9mb3JtdWxhX3AuaHRtbAoqLwoKLyoqCiAqIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Zvcm11bGFQYXJzZXIKICoKICogQGNhdGVnb3J5ICAgUEhQRXhjZWwKICogQHBhY2thZ2UgICAgUEhQRXhjZWxfQ2FsY3VsYXRpb24KICogQGNvcHlyaWdodCAgQ29weXJpZ2h0IChjKSAyMDA2IC0gMjAxMiBQSFBFeGNlbCAoaHR0cDovL3d3dy5jb2RlcGxleC5jb20vUEhQRXhjZWwpCiAqLwpjbGFzcyBQSFBFeGNlbF9DYWxjdWxhdGlvbl9Gb3JtdWxhUGFyc2VyIHsKCS8qIENoYXJhY3RlciBjb25zdGFudHMgKi8KCWNvbnN0IFFVT1RFX0RPVUJMRSAgPSAnIic7Cgljb25zdCBRVU9URV9TSU5HTEUgID0gJ1wnJzsKCWNvbnN0IEJSQUNLRVRfQ0xPU0UgPSAnXSc7Cgljb25zdCBCUkFDS0VUX09QRU4gID0gJ1snOwoJY29uc3QgQlJBQ0VfT1BFTiAgICA9ICd7JzsKCWNvbnN0IEJSQUNFX0NMT1NFICAgPSAnfSc7Cgljb25zdCBQQVJFTl9PUEVOICAgID0gJygnOwoJY29uc3QgUEFSRU5fQ0xPU0UgICA9ICcpJzsKCWNvbnN0IFNFTUlDT0xPTiAgICAgPSAnOyc7Cgljb25zdCBXSElURVNQQUNFICAgID0gJyAnOwoJY29uc3QgQ09NTUEgICAgICAgICA9ICcsJzsKCWNvbnN0IEVSUk9SX1NUQVJUICAgPSAnIyc7CgoJY29uc3QgT1BFUkFUT1JTX1NOIAkJCT0gIistIjsKCWNvbnN0IE9QRVJBVE9SU19JTkZJWCAJCT0gIistKi9eJj0+PCI7Cgljb25zdCBPUEVSQVRPUlNfUE9TVEZJWCAJPSAiJSI7CgoJLyoqCgkgKiBGb3JtdWxhCgkgKgoJICogQHZhciBzdHJpbmcKCSAqLwoJcHJpdmF0ZSAkX2Zvcm11bGE7CgoJLyoqCgkgKiBUb2tlbnMKCSAqCgkgKiBAdmFyIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Zvcm11bGFUb2tlbltdCgkgKi8KCXByaXZhdGUgJF90b2tlbnMgPSBhcnJheSgpOwoKICAgIC8qKgogICAgICogQ3JlYXRlIGEgbmV3IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Zvcm11bGFQYXJzZXIKICAgICAqCiAgICAgKiBAcGFyYW0gCXN0cmluZwkJJHBGb3JtdWxhCUZvcm11bGEgdG8gcGFyc2UKICAgICAqIEB0aHJvd3MgCUV4Y2VwdGlvbgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJHBGb3JtdWxhID0gJycpCiAgICB7CiAgICAJLy8gQ2hlY2sgcGFyYW1ldGVycwogICAgCWlmIChpc19udWxsKCRwRm9ybXVsYSkpIHsKICAgIAkJdGhyb3cgbmV3IEV4Y2VwdGlvbigiSW52YWxpZCBwYXJhbWV0ZXIgcGFzc2VkOiBmb3JtdWxhIik7CiAgICAJfQoKICAgIAkvLyBJbml0aWFsaXNlIHZhbHVlcwogICAgCSR0aGlzLT5fZm9ybXVsYSA9IHRyaW0oJHBGb3JtdWxhKTsKICAgIAkvLyBQYXJzZSEKICAgIAkkdGhpcy0+X3BhcnNlVG9Ub2tlbnMoKTsKICAgIH0KCiAgICAvKioKICAgICAqIEdldCBGb3JtdWxhCiAgICAgKgogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldEZvcm11bGEoKSB7CiAgICAJcmV0dXJuICR0aGlzLT5fZm9ybXVsYTsKICAgIH0KCiAgICAvKioKICAgICAqIEdldCBUb2tlbgogICAgICoKICAgICAqIEBwYXJhbSAJaW50CQkkcElkCVRva2VuIGlkCiAgICAgKiBAcmV0dXJuCXN0cmluZwogICAgICogQHRocm93cyAgRXhjZXB0aW9uCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRUb2tlbigkcElkID0gMCkgewogICAgCWlmIChpc3NldCgkdGhpcy0+X3Rva2Vuc1skcElkXSkpIHsKICAgIAkJcmV0dXJuICR0aGlzLT5fdG9rZW5zWyRwSWRdOwogICAgCX0gZWxzZSB7CiAgICAJCXRocm93IG5ldyBFeGNlcHRpb24oIlRva2VuIHdpdGggaWQgJHBJZCBkb2VzIG5vdCBleGlzdC4iKTsKICAgIAl9CiAgICB9CgogICAgLyoqCiAgICAgKiBHZXQgVG9rZW4gY291bnQKICAgICAqCiAgICAgKiBAcmV0dXJuIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0VG9rZW5Db3VudCgpIHsKICAgIAlyZXR1cm4gY291bnQoJHRoaXMtPl90b2tlbnMpOwogICAgfQoKICAgIC8qKgogICAgICogR2V0IFRva2VucwogICAgICoKICAgICAqIEByZXR1cm4gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRm9ybXVsYVRva2VuW10KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldFRva2VucygpIHsKICAgIAlyZXR1cm4gJHRoaXMtPl90b2tlbnM7CiAgICB9CgogICAgLyoqCiAgICAgKiBQYXJzZSB0byB0b2tlbnMKICAgICAqLwogICAgcHJpdmF0ZSBmdW5jdGlvbiBfcGFyc2VUb1Rva2VucygpIHsKCQkvLyBObyBhdHRlbXB0IGlzIG1hZGUgdG8gdmVyaWZ5IGZvcm11bGFzOyBhc3N1bWVzIGZvcm11bGFzIGFyZSBkZXJpdmVkIGZyb20gRXhjZWwsIHdoZXJlCgkJLy8gdGhleSBjYW4gb25seSBleGlzdCBpZiB2YWxpZDsgc3RhY2sgb3ZlcmZsb3dzL3VuZGVyZmxvd3Mgc3VuayBhcyBudWxscyB3aXRob3V0IGV4Y2VwdGlvbnMuCgoJCS8vIENoZWNrIGlmIHRoZSBmb3JtdWxhIGhhcyBhIHZhbGlkIHN0YXJ0aW5nID0KCQkkZm9ybXVsYUxlbmd0aCA9IHN0cmxlbigkdGhpcy0+X2Zvcm11bGEpOwoJCWlmICgkZm9ybXVsYUxlbmd0aCA8IDIgfHwgJHRoaXMtPl9mb3JtdWxhezB9ICE9ICc9JykgcmV0dXJuOwoKCQkvLyBIZWxwZXIgdmFyaWFibGVzCgkJJHRva2VuczEJPSAkdG9rZW5zMiAJPSAkc3RhY2sgPSBhcnJheSgpOwoJCSRpblN0cmluZwk9ICRpblBhdGggCT0gJGluUmFuZ2UgCT0gJGluRXJyb3IgPSBmYWxzZTsKCQkkdG9rZW4JCT0gJHByZXZpb3VzVG9rZW4JPSAkbmV4dFRva2VuCT0gbnVsbDsKCgkJJGluZGV4CT0gMTsKCQkkdmFsdWUJPSAnJzsKCgkJJEVSUk9SUyAJCQk9IGFycmF5KCIjTlVMTCEiLCAiI0RJVi8wISIsICIjVkFMVUUhIiwgIiNSRUYhIiwgIiNOQU1FPyIsICIjTlVNISIsICIjTi9BIik7CgkJJENPTVBBUkFUT1JTX01VTFRJIAk9IGFycmF5KCI+PSIsICI8PSIsICI8PiIpOwoKCQl3aGlsZSAoJGluZGV4IDwgJGZvcm11bGFMZW5ndGgpIHsKCQkJLy8gc3RhdGUtZGVwZW5kZW50IGNoYXJhY3RlciBldmFsdWF0aW9uIChvcmRlciBpcyBpbXBvcnRhbnQpCgoJCQkvLyBkb3VibGUtcXVvdGVkIHN0cmluZ3MKCQkJLy8gZW1iZWRzIGFyZSBkb3VibGVkCgkJCS8vIGVuZCBtYXJrcyB0b2tlbgoJCQlpZiAoJGluU3RyaW5nKSB7CgkJCQlpZiAoJHRoaXMtPl9mb3JtdWxheyRpbmRleH0gPT0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRm9ybXVsYVBhcnNlcjo6UVVPVEVfRE9VQkxFKSB7CgkJCQkJaWYgKCgoJGluZGV4ICsgMikgPD0gJGZvcm11bGFMZW5ndGgpICYmICgkdGhpcy0+X2Zvcm11bGF7JGluZGV4ICsgMX0gPT0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRm9ybXVsYVBhcnNlcjo6UVVPVEVfRE9VQkxFKSkgewoJCQkJCQkkdmFsdWUgLj0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRm9ybXVsYVBhcnNlcjo6UVVPVEVfRE9VQkxFOwoJCQkJCQkrKyRpbmRleDsKCQkJCQl9IGVsc2UgewoJCQkJCQkkaW5TdHJpbmcgPSBmYWxzZTsKCQkJCQkJJHRva2VuczFbXSA9IG5ldyBQSFBFeGNlbF9DYWxjdWxhdGlvbl9Gb3JtdWxhVG9rZW4oJHZhbHVlLCBQSFBFeGNlbF9DYWxjdWxhdGlvbl9Gb3JtdWxhVG9rZW46OlRPS0VOX1RZUEVfT1BFUkFORCwgUEhQRXhjZWxfQ2FsY3VsYXRpb25fRm9ybXVsYVRva2VuOjpUT0tFTl9TVUJUWVBFX1RFWFQpOwoJCQkJCQkkdmFsdWUgPSAiIjsKCQkJCQl9CgkJCQl9IGVsc2UgewoJCQkJCSR2YWx1ZSAuPSAkdGhpcy0+X2Zvcm11bGF7JGluZGV4fTsKCQkJCX0KCQkJCSsrJGluZGV4OwoJCQkJY29udGludWU7CgkJCX0KCgkJCS8vIHNpbmdsZS1xdW90ZWQgc3RyaW5ncyAobGlua3MpCgkJCS8vIGVtYmVkcyBhcmUgZG91YmxlCgkJCS8vIGVuZCBkb2VzIG5vdCBtYXJrIGEgdG9rZW4KCQkJaWYgKCRpblBhdGgpIHsKCQkJCWlmICgkdGhpcy0+X2Zvcm11bGF7JGluZGV4fSA9PSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9Gb3JtdWxhUGFyc2VyOjpRVU9URV9TSU5HTEUpIHsKCQkJCQlpZiAoKCgkaW5kZXggKyAyKSA8PSAkZm9ybXVsYUxlbmd0aCkgJiYgKCR0aGlzLT5fZm9ybXVsYXskaW5kZXggKyAxfSA9PSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9Gb3JtdWxhUGFyc2VyOjpRVU9URV9TSU5HTEUpKSB7CgkJCQkJCSR2YWx1ZSAuPSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9Gb3JtdWxhUGFyc2VyOjpRVU9URV9TSU5HTEU7CgkJCQkJCSsrJGluZGV4OwoJCQkJCX0gZWxzZSB7CgkJCQkJCSRpblBhdGggPSBmYWxzZTsKCQkJCQl9CgkJCQl9IGVsc2UgewoJCQkJCSR2YWx1ZSAuPSAkdGhpcy0+X2Zvcm11bGF7JGluZGV4fTsKCQkJCX0KCQkJCSsrJGluZGV4OwoJCQkJY29udGludWU7CgkJCX0KCgkJCS8vIGJyYWNrZWQgc3RyaW5ncyAoUjFDMSByYW5nZSBpbmRleCBvciBsaW5rZWQgd29ya2Jvb2sgbmFtZSkKCQkJLy8gbm8gZW1iZWRzIChjaGFuZ2VkIHRvICIoKSIgYnkgRXhjZWwpCgkJCS8vIGVuZCBkb2VzIG5vdCBtYXJrIGEgdG9rZW4KCQkJaWYgKCRpblJhbmdlKSB7CgkJCQlpZiAoJHRoaXMtPl9mb3JtdWxheyRpbmRleH0gPT0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRm9ybXVsYVBhcnNlcjo6QlJBQ0tFVF9DTE9TRSkgewoJCQkJCSRpblJhbmdlID0gZmFsc2U7CgkJCQl9CgkJCQkkdmFsdWUgLj0gJHRoaXMtPl9mb3JtdWxheyRpbmRleH07CgkJCQkrKyRpbmRleDsKCQkJCWNvbnRpbnVlOwoJCQl9CgoJCQkvLyBlcnJvciB2YWx1ZXMKCQkJLy8gZW5kIG1hcmtzIGEgdG9rZW4sIGRldGVybWluZWQgZnJvbSBhYnNvbHV0ZSBsaXN0IG9mIHZhbHVlcwoJCQlpZiAoJGluRXJyb3IpIHsKCQkJCSR2YWx1ZSAuPSAkdGhpcy0+X2Zvcm11bGF7JGluZGV4fTsKCQkJCSsrJGluZGV4OwoJCQkJaWYgKGluX2FycmF5KCR2YWx1ZSwgJEVSUk9SUykpIHsKCQkJCQkkaW5FcnJvciA9IGZhbHNlOwoJCQkJCSR0b2tlbnMxW10gPSBuZXcgUEhQRXhjZWxfQ2FsY3VsYXRpb25fRm9ybXVsYVRva2VuKCR2YWx1ZSwgUEhQRXhjZWxfQ2FsY3VsYXRpb25fRm9ybXVsYVRva2VuOjpUT0tFTl9UWVBFX09QRVJBTkQsIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Zvcm11bGFUb2tlbjo6VE9LRU5fU1VCVFlQRV9FUlJPUik7CgkJCQkJJHZhbHVlID0gIiI7CgkJCQl9CgkJCQljb250aW51ZTsKCQkJfQoKCQkJLy8gc2NpZW50aWZpYyBub3RhdGlvbiBjaGVjawoJCQlpZiAoc3RycG9zKFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Zvcm11bGFQYXJzZXI6Ok9QRVJBVE9SU19TTiwgJHRoaXMtPl9mb3JtdWxheyRpbmRleH0pICE9PSBmYWxzZSkgewoJCQkJaWYgKHN0cmxlbigkdmFsdWUpID4gMSkgewoJCQkJCWlmIChwcmVnX21hdGNoKCIvXlsxLTldezF9KFwuWzAtOV0rKT9FezF9JC8iLCAkdGhpcy0+X2Zvcm11bGF7JGluZGV4fSkgIT0gMCkgewoJCQkJCQkkdmFsdWUgLj0gJHRoaXMtPl9mb3JtdWxheyRpbmRleH07CgkJCQkJCSsrJGluZGV4OwoJCQkJCQljb250aW51ZTsKCQkJCQl9CgkJCQl9CgkJCX0KCgkJCS8vIGluZGVwZW5kZW50IGNoYXJhY3RlciBldmFsdWF0aW9uIChvcmRlciBub3QgaW1wb3J0YW50KQoKCQkJLy8gZXN0YWJsaXNoIHN0YXRlLWRlcGVuZGVudCBjaGFyYWN0ZXIgZXZhbHVhdGlvbnMKCQkJaWYgKCR0aGlzLT5fZm9ybXVsYXskaW5kZXh9ID09IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Zvcm11bGFQYXJzZXI6OlFVT1RFX0RPVUJMRSkgewoJCQkJaWYgKHN0cmxlbigkdmFsdWUgPiAwKSkgeyAgLy8gdW5leHBlY3RlZAoJCQkJCSR0b2tlbnMxW10gPSBuZXcgUEhQRXhjZWxfQ2FsY3VsYXRpb25fRm9ybXVsYVRva2VuKCR2YWx1ZSwgUEhQRXhjZWxfQ2FsY3VsYXRpb25fRm9ybXVsYVRva2VuOjpUT0tFTl9UWVBFX1VOS05PV04pOwoJCQkJCSR2YWx1ZSA9ICIiOwoJCQkJfQoJCQkJJGluU3RyaW5nID0gdHJ1ZTsKCQkJCSsrJGluZGV4OwoJCQkJY29udGludWU7CiAJCQl9CgoJCQlpZiAoJHRoaXMtPl9mb3JtdWxheyRpbmRleH0gPT0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRm9ybXVsYVBhcnNlcjo6UVVPVEVfU0lOR0xFKSB7CgkJCQlpZiAoc3RybGVuKCR2YWx1ZSkgPiAwKSB7IC8vIHVuZXhwZWN0ZWQKCQkJCQkkdG9rZW5zMVtdID0gbmV3IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Zvcm11bGFUb2tlbigkdmFsdWUsIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Zvcm11bGFUb2tlbjo6VE9LRU5fVFlQRV9VTktOT1dOKTsKCQkJCQkkdmFsdWUgPSAiIjsKCQkJCX0KCQkJCSRpblBhdGggPSB0cnVlOwoJCQkJKyskaW5kZXg7CgkJCQljb250aW51ZTsKCQkJfQoKCQkJaWYgKCR0aGlzLT5fZm9ybXVsYXskaW5kZXh9ID09IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Zvcm11bGFQYXJzZXI6OkJSQUNLRVRfT1BFTikgewoJCQkJJGluUmFuZ2UgPSB0cnVlOwoJCQkJJHZhbHVlIC49IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Zvcm11bGFQYXJzZXI6OkJSQUNLRVRfT1BFTjsKCQkJCSsrJGluZGV4OwoJCQkJY29udGludWU7CgkJCX0KCgkJCWlmICgkdGhpcy0+X2Zvcm11bGF7JGluZGV4fSA9PSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9Gb3JtdWxhUGFyc2VyOjpFUlJPUl9TVEFSVCkgewoJCQkJaWYgKHN0cmxlbigkdmFsdWUpID4gMCkgeyAvLyB1bmV4cGVjdGVkCgkJCQkJJHRva2VuczFbXSA9IG5ldyBQSFBFeGNlbF9DYWxjdWxhdGlvbl9Gb3JtdWxhVG9rZW4oJHZhbHVlLCBQSFBFeGNlbF9DYWxjdWxhdGlvbl9Gb3JtdWxhVG9rZW46OlRPS0VOX1RZUEVfVU5LTk9XTik7CgkJCQkJJHZhbHVlID0gIiI7CgkJCQl9CgkJCQkkaW5FcnJvciA9IHRydWU7CgkJCQkkdmFsdWUgLj0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRm9ybXVsYVBhcnNlcjo6RVJST1JfU1RBUlQ7CgkJCQkrKyRpbmRleDsKCQkJCWNvbnRpbnVlOwoJCQl9CgoJCQkvLyBtYXJrIHN0YXJ0IGFuZCBlbmQgb2YgYXJyYXlzIGFuZCBhcnJheSByb3dzCgkJCWlmICgkdGhpcy0+X2Zvcm11bGF7JGluZGV4fSA9PSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9Gb3JtdWxhUGFyc2VyOjpCUkFDRV9PUEVOKSB7CgkJCQlpZiAoc3RybGVuKCR2YWx1ZSkgPiAwKSB7IC8vIHVuZXhwZWN0ZWQKCQkJCQkkdG9rZW5zMVtdID0gbmV3IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Zvcm11bGFUb2tlbigkdmFsdWUsIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Zvcm11bGFUb2tlbjo6VE9LRU5fVFlQRV9VTktOT1dOKTsKCQkJCQkkdmFsdWUgPSAiIjsKCQkJCX0KCgkJCQkkdG1wID0gbmV3IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Zvcm11bGFUb2tlbigiQVJSQVkiLCBQSFBFeGNlbF9DYWxjdWxhdGlvbl9Gb3JtdWxhVG9rZW46OlRPS0VOX1RZUEVfRlVOQ1RJT04sIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Zvcm11bGFUb2tlbjo6VE9LRU5fU1VCVFlQRV9TVEFSVCk7CgkJCQkkdG9rZW5zMVtdID0gJHRtcDsKCQkJCSRzdGFja1tdID0gY2xvbmUgJHRtcDsKCgkJCQkkdG1wID0gbmV3IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Zvcm11bGFUb2tlbigiQVJSQVlST1ciLCBQSFBFeGNlbF9DYWxjdWxhdGlvbl9Gb3JtdWxhVG9rZW46OlRPS0VOX1RZUEVfRlVOQ1RJT04sIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Zvcm11bGFUb2tlbjo6VE9LRU5fU1VCVFlQRV9TVEFSVCk7CgkJCQkkdG9rZW5zMVtdID0gJHRtcDsKCQkJCSRzdGFja1tdID0gY2xvbmUgJHRtcDsKCgkJCQkrKyRpbmRleDsKCQkJCWNvbnRpbnVlOwoJCQl9CgoJCQlpZiAoJHRoaXMtPl9mb3JtdWxheyRpbmRleH0gPT0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRm9ybXVsYVBhcnNlcjo6U0VNSUNPTE9OKSB7CgkJCQlpZiAoc3RybGVuKCR2YWx1ZSkgPiAwKSB7CgkJCQkJJHRva2VuczFbXSA9IG5ldyBQSFBFeGNlbF9DYWxjdWxhdGlvbl9Gb3JtdWxhVG9rZW4oJHZhbHVlLCBQSFBFeGNlbF9DYWxjdWxhdGlvbl9Gb3JtdWxhVG9rZW46OlRPS0VOX1RZUEVfT1BFUkFORCk7CgkJCQkJJHZhbHVlID0gIiI7CgkJCQl9CgoJCQkJJHRtcCA9IGFycmF5X3BvcCgkc3RhY2spOwoJCQkJJHRtcC0+c2V0VmFsdWUoIiIpOwoJCQkJJHRtcC0+c2V0VG9rZW5TdWJUeXBlKFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Zvcm11bGFUb2tlbjo6VE9LRU5fU1VCVFlQRV9TVE9QKTsKCQkJCSR0b2tlbnMxW10gPSAkdG1wOwoKCQkJCSR0bXAgPSBuZXcgUEhQRXhjZWxfQ2FsY3VsYXRpb25fRm9ybXVsYVRva2VuKCIsIiwgUEhQRXhjZWxfQ2FsY3VsYXRpb25fRm9ybXVsYVRva2VuOjpUT0tFTl9UWVBFX0FSR1VNRU5UKTsKCQkJCSR0b2tlbnMxW10gPSAkdG1wOwoKCQkJCSR0bXAgPSBuZXcgUEhQRXhjZWxfQ2FsY3VsYXRpb25fRm9ybXVsYVRva2VuKCJBUlJBWVJPVyIsIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Zvcm11bGFUb2tlbjo6VE9LRU5fVFlQRV9GVU5DVElPTiwgUEhQRXhjZWxfQ2FsY3VsYXRpb25fRm9ybXVsYVRva2VuOjpUT0tFTl9TVUJUWVBFX1NUQVJUKTsKCQkJCSR0b2tlbnMxW10gPSAkdG1wOwoJCQkJJHN0YWNrW10gPSBjbG9uZSAkdG1wOwoKCQkJCSsrJGluZGV4OwoJCQkJY29udGludWU7CgkJCX0KCgkJCWlmICgkdGhpcy0+X2Zvcm11bGF7JGluZGV4fSA9PSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9Gb3JtdWxhUGFyc2VyOjpCUkFDRV9DTE9TRSkgewoJCQkJaWYgKHN0cmxlbigkdmFsdWUpID4gMCkgewoJCQkJCSR0b2tlbnMxW10gPSBuZXcgUEhQRXhjZWxfQ2FsY3VsYXRpb25fRm9ybXVsYVRva2VuKCR2YWx1ZSwgUEhQRXhjZWxfQ2FsY3VsYXRpb25fRm9ybXVsYVRva2VuOjpUT0tFTl9UWVBFX09QRVJBTkQpOwoJCQkJCSR2YWx1ZSA9ICIiOwoJCQkJfQoKCQkJCSR0bXAgPSBhcnJheV9wb3AoJHN0YWNrKTsKCQkJCSR0bXAtPnNldFZhbHVlKCIiKTsKCQkJCSR0bXAtPnNldFRva2VuU3ViVHlwZShQSFBFeGNlbF9DYWxjdWxhdGlvbl9Gb3JtdWxhVG9rZW46OlRPS0VOX1NVQlRZUEVfU1RPUCk7CgkJCQkkdG9rZW5zMVtdID0gJHRtcDsKCgkJCQkkdG1wID0gYXJyYXlfcG9wKCRzdGFjayk7CgkJCQkkdG1wLT5zZXRWYWx1ZSgiIik7CgkJCQkkdG1wLT5zZXRUb2tlblN1YlR5cGUoUEhQRXhjZWxfQ2FsY3VsYXRpb25fRm9ybXVsYVRva2VuOjpUT0tFTl9TVUJUWVBFX1NUT1ApOwoJCQkJJHRva2VuczFbXSA9ICR0bXA7CgoJCQkJKyskaW5kZXg7CgkJCQljb250aW51ZTsKCQkJfQoKCQkJLy8gdHJpbSB3aGl0ZS1zcGFjZQoJCQlpZiAoJHRoaXMtPl9mb3JtdWxheyRpbmRleH0gPT0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRm9ybXVsYVBhcnNlcjo6V0hJVEVTUEFDRSkgewoJCQkJaWYgKHN0cmxlbigkdmFsdWUpID4gMCkgewoJCQkJCSR0b2tlbnMxW10gPSBuZXcgUEhQRXhjZWxfQ2FsY3VsYXRpb25fRm9ybXVsYVRva2VuKCR2YWx1ZSwgUEhQRXhjZWxfQ2FsY3VsYXRpb25fRm9ybXVsYVRva2VuOjpUT0tFTl9UWVBFX09QRVJBTkQpOwoJCQkJCSR2YWx1ZSA9ICIiOwoJCQkJfQoJCQkJJHRva2VuczFbXSA9IG5ldyBQSFBFeGNlbF9DYWxjdWxhdGlvbl9Gb3JtdWxhVG9rZW4oIiIsIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Zvcm11bGFUb2tlbjo6VE9LRU5fVFlQRV9XSElURVNQQUNFKTsKCQkJCSsrJGluZGV4OwoJCQkJd2hpbGUgKCgkdGhpcy0+X2Zvcm11bGF7JGluZGV4fSA9PSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9Gb3JtdWxhUGFyc2VyOjpXSElURVNQQUNFKSAmJiAoJGluZGV4IDwgJGZvcm11bGFMZW5ndGgpKSB7CgkJCQkJKyskaW5kZXg7CgkJCQl9CgkJCQljb250aW51ZTsKCQkJfQoKCQkJLy8gbXVsdGktY2hhcmFjdGVyIGNvbXBhcmF0b3JzCgkJCWlmICgoJGluZGV4ICsgMikgPD0gJGZvcm11bGFMZW5ndGgpIHsKCQkJCWlmIChpbl9hcnJheShzdWJzdHIoJHRoaXMtPl9mb3JtdWxhLCAkaW5kZXgsIDIpLCAkQ09NUEFSQVRPUlNfTVVMVEkpKSB7CgkJCQkJaWYgKHN0cmxlbigkdmFsdWUpID4gMCkgewoJCQkJCQkkdG9rZW5zMVtdID0gbmV3IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Zvcm11bGFUb2tlbigkdmFsdWUsIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Zvcm11bGFUb2tlbjo6VE9LRU5fVFlQRV9PUEVSQU5EKTsKCQkJCQkJJHZhbHVlID0gIiI7CgkJCQkJfQoJCQkJCSR0b2tlbnMxW10gPSBuZXcgUEhQRXhjZWxfQ2FsY3VsYXRpb25fRm9ybXVsYVRva2VuKHN1YnN0cigkdGhpcy0+X2Zvcm11bGEsICRpbmRleCwgMiksIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Zvcm11bGFUb2tlbjo6VE9LRU5fVFlQRV9PUEVSQVRPUklORklYLCBQSFBFeGNlbF9DYWxjdWxhdGlvbl9Gb3JtdWxhVG9rZW46OlRPS0VOX1NVQlRZUEVfTE9HSUNBTCk7CgkJCQkJJGluZGV4ICs9IDI7CgkJCQkJY29udGludWU7CgkJCQl9CgkJCX0KCgkJCS8vIHN0YW5kYXJkIGluZml4IG9wZXJhdG9ycwoJCQlpZiAoc3RycG9zKFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Zvcm11bGFQYXJzZXI6Ok9QRVJBVE9SU19JTkZJWCwgJHRoaXMtPl9mb3JtdWxheyRpbmRleH0pICE9PSBmYWxzZSkgewoJCQkJaWYgKHN0cmxlbigkdmFsdWUpID4gMCkgewoJCQkJCSR0b2tlbnMxW10gPW5ldyBQSFBFeGNlbF9DYWxjdWxhdGlvbl9Gb3JtdWxhVG9rZW4oJHZhbHVlLCBQSFBFeGNlbF9DYWxjdWxhdGlvbl9Gb3JtdWxhVG9rZW46OlRPS0VOX1RZUEVfT1BFUkFORCk7CgkJCQkJJHZhbHVlID0gIiI7CgkJCQl9CgkJCQkkdG9rZW5zMVtdID0gbmV3IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Zvcm11bGFUb2tlbigkdGhpcy0+X2Zvcm11bGF7JGluZGV4fSwgUEhQRXhjZWxfQ2FsY3VsYXRpb25fRm9ybXVsYVRva2VuOjpUT0tFTl9UWVBFX09QRVJBVE9SSU5GSVgpOwoJCQkJKyskaW5kZXg7CgkJCQljb250aW51ZTsKCQkJfQoKCQkJLy8gc3RhbmRhcmQgcG9zdGZpeCBvcGVyYXRvcnMgKG9ubHkgb25lKQoJCQlpZiAoc3RycG9zKFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Zvcm11bGFQYXJzZXI6Ok9QRVJBVE9SU19QT1NURklYLCAkdGhpcy0+X2Zvcm11bGF7JGluZGV4fSkgIT09IGZhbHNlKSB7CgkJCQlpZiAoc3RybGVuKCR2YWx1ZSkgPiAwKSB7CgkJCQkJJHRva2VuczFbXSA9IG5ldyBQSFBFeGNlbF9DYWxjdWxhdGlvbl9Gb3JtdWxhVG9rZW4oJHZhbHVlLCBQSFBFeGNlbF9DYWxjdWxhdGlvbl9Gb3JtdWxhVG9rZW46OlRPS0VOX1RZUEVfT1BFUkFORCk7CgkJCQkJJHZhbHVlID0gIiI7CgkJCQl9CgkJCQkkdG9rZW5zMVtdID0gbmV3IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Zvcm11bGFUb2tlbigkdGhpcy0+X2Zvcm11bGF7JGluZGV4fSwgUEhQRXhjZWxfQ2FsY3VsYXRpb25fRm9ybXVsYVRva2VuOjpUT0tFTl9UWVBFX09QRVJBVE9SUE9TVEZJWCk7CgkJCQkrKyRpbmRleDsKCQkJCWNvbnRpbnVlOwoJCQl9CgoJCQkvLyBzdGFydCBzdWJleHByZXNzaW9uIG9yIGZ1bmN0aW9uCgkJCWlmICgkdGhpcy0+X2Zvcm11bGF7JGluZGV4fSA9PSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9Gb3JtdWxhUGFyc2VyOjpQQVJFTl9PUEVOKSB7CgkJCQlpZiAoc3RybGVuKCR2YWx1ZSkgPiAwKSB7CgkJCQkJJHRtcCA9IG5ldyBQSFBFeGNlbF9DYWxjdWxhdGlvbl9Gb3JtdWxhVG9rZW4oJHZhbHVlLCBQSFBFeGNlbF9DYWxjdWxhdGlvbl9Gb3JtdWxhVG9rZW46OlRPS0VOX1RZUEVfRlVOQ1RJT04sIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Zvcm11bGFUb2tlbjo6VE9LRU5fU1VCVFlQRV9TVEFSVCk7CgkJCQkJJHRva2VuczFbXSA9ICR0bXA7CgkJCQkJJHN0YWNrW10gPSBjbG9uZSAkdG1wOwoJCQkJCSR2YWx1ZSA9ICIiOwoJCQkJfSBlbHNlIHsKCQkJCQkkdG1wID0gbmV3IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Zvcm11bGFUb2tlbigiIiwgUEhQRXhjZWxfQ2FsY3VsYXRpb25fRm9ybXVsYVRva2VuOjpUT0tFTl9UWVBFX1NVQkVYUFJFU1NJT04sIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Zvcm11bGFUb2tlbjo6VE9LRU5fU1VCVFlQRV9TVEFSVCk7CgkJCQkJJHRva2VuczFbXSA9ICR0bXA7CgkJCQkJJHN0YWNrW10gPSBjbG9uZSAkdG1wOwoJCQkJfQoJCQkJKyskaW5kZXg7CgkJCQljb250aW51ZTsKCQkJfQoKCQkJLy8gZnVuY3Rpb24sIHN1YmV4cHJlc3Npb24sIG9yIGFycmF5IHBhcmFtZXRlcnMsIG9yIG9wZXJhbmQgdW5pb25zCgkJCWlmICgkdGhpcy0+X2Zvcm11bGF7JGluZGV4fSA9PSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9Gb3JtdWxhUGFyc2VyOjpDT01NQSkgewoJCQkJaWYgKHN0cmxlbigkdmFsdWUpID4gMCkgewoJCQkJCSR0b2tlbnMxW10gPSBuZXcgUEhQRXhjZWxfQ2FsY3VsYXRpb25fRm9ybXVsYVRva2VuKCR2YWx1ZSwgUEhQRXhjZWxfQ2FsY3VsYXRpb25fRm9ybXVsYVRva2VuOjpUT0tFTl9UWVBFX09QRVJBTkQpOwoJCQkJCSR2YWx1ZSA9ICIiOwoJCQkJfQoKCQkJCSR0bXAgPSBhcnJheV9wb3AoJHN0YWNrKTsKCQkJCSR0bXAtPnNldFZhbHVlKCIiKTsKCQkJCSR0bXAtPnNldFRva2VuU3ViVHlwZShQSFBFeGNlbF9DYWxjdWxhdGlvbl9Gb3JtdWxhVG9rZW46OlRPS0VOX1NVQlRZUEVfU1RPUCk7CgkJCQkkc3RhY2tbXSA9ICR0bXA7CgoJCQkJaWYgKCR0bXAtPmdldFRva2VuVHlwZSgpID09IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Zvcm11bGFUb2tlbjo6VE9LRU5fVFlQRV9GVU5DVElPTikgewoJCQkJCSR0b2tlbnMxW10gPSBuZXcgUEhQRXhjZWxfQ2FsY3VsYXRpb25fRm9ybXVsYVRva2VuKCIsIiwgUEhQRXhjZWxfQ2FsY3VsYXRpb25fRm9ybXVsYVRva2VuOjpUT0tFTl9UWVBFX09QRVJBVE9SSU5GSVgsIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Zvcm11bGFUb2tlbjo6VE9LRU5fU1VCVFlQRV9VTklPTik7CgkJCQl9IGVsc2UgewoJCQkJCSR0b2tlbnMxW10gPSBuZXcgUEhQRXhjZWxfQ2FsY3VsYXRpb25fRm9ybXVsYVRva2VuKCIsIiwgUEhQRXhjZWxfQ2FsY3VsYXRpb25fRm9ybXVsYVRva2VuOjpUT0tFTl9UWVBFX0FSR1VNRU5UKTsKCQkJCX0KCQkJCSsrJGluZGV4OwoJCQkJY29udGludWU7CgkJCX0KCgkJCS8vIHN0b3Agc3ViZXhwcmVzc2lvbgoJCQlpZiAoJHRoaXMtPl9mb3JtdWxheyRpbmRleH0gPT0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRm9ybXVsYVBhcnNlcjo6UEFSRU5fQ0xPU0UpIHsKCQkJCWlmIChzdHJsZW4oJHZhbHVlKSA+IDApIHsKCQkJCQkkdG9rZW5zMVtdID0gbmV3IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Zvcm11bGFUb2tlbigkdmFsdWUsIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Zvcm11bGFUb2tlbjo6VE9LRU5fVFlQRV9PUEVSQU5EKTsKCQkJCQkkdmFsdWUgPSAiIjsKCQkJCX0KCgkJCQkkdG1wID0gYXJyYXlfcG9wKCRzdGFjayk7CgkJCQkkdG1wLT5zZXRWYWx1ZSgiIik7CgkJCQkkdG1wLT5zZXRUb2tlblN1YlR5cGUoUEhQRXhjZWxfQ2FsY3VsYXRpb25fRm9ybXVsYVRva2VuOjpUT0tFTl9TVUJUWVBFX1NUT1ApOwoJCQkJJHRva2VuczFbXSA9ICR0bXA7CgoJCQkJKyskaW5kZXg7CgkJCQljb250aW51ZTsKCQkJfQoKICAgICAgICAJLy8gdG9rZW4gYWNjdW11bGF0aW9uCgkJCSR2YWx1ZSAuPSAkdGhpcy0+X2Zvcm11bGF7JGluZGV4fTsKCQkJKyskaW5kZXg7CgkJfQoKCQkvLyBkdW1wIHJlbWFpbmluZyBhY2N1bXVsYXRpb24KCQlpZiAoc3RybGVuKCR2YWx1ZSkgPiAwKSB7CgkJCSR0b2tlbnMxW10gPSBuZXcgUEhQRXhjZWxfQ2FsY3VsYXRpb25fRm9ybXVsYVRva2VuKCR2YWx1ZSwgUEhQRXhjZWxfQ2FsY3VsYXRpb25fRm9ybXVsYVRva2VuOjpUT0tFTl9UWVBFX09QRVJBTkQpOwoJCX0KCgkJLy8gbW92ZSB0b2tlbkxpc3QgdG8gbmV3IHNldCwgZXhjbHVkaW5nIHVubmVjZXNzYXJ5IHdoaXRlLXNwYWNlIHRva2VucyBhbmQgY29udmVydGluZyBuZWNlc3Nhcnkgb25lcyB0byBpbnRlcnNlY3Rpb25zCgkJJHRva2VuQ291bnQgPSBjb3VudCgkdG9rZW5zMSk7CgkJZm9yICgkaSA9IDA7ICRpIDwgJHRva2VuQ291bnQ7ICsrJGkpIHsKCQkJJHRva2VuID0gJHRva2VuczFbJGldOwoJCQlpZiAoaXNzZXQoJHRva2VuczFbJGkgLSAxXSkpIHsKCQkJCSRwcmV2aW91c1Rva2VuID0gJHRva2VuczFbJGkgLSAxXTsKCQkJfSBlbHNlIHsKCQkJCSRwcmV2aW91c1Rva2VuID0gbnVsbDsKCQkJfQoJCQlpZiAoaXNzZXQoJHRva2VuczFbJGkgKyAxXSkpIHsKCQkJCSRuZXh0VG9rZW4gPSAkdG9rZW5zMVskaSArIDFdOwoJCQl9IGVsc2UgewoJCQkJJG5leHRUb2tlbiA9IG51bGw7CgkJCX0KCgkJCWlmIChpc19udWxsKCR0b2tlbikpIHsKCQkJCWNvbnRpbnVlOwoJCQl9CgoJCQlpZiAoJHRva2VuLT5nZXRUb2tlblR5cGUoKSAhPSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9Gb3JtdWxhVG9rZW46OlRPS0VOX1RZUEVfV0hJVEVTUEFDRSkgewoJCQkJJHRva2VuczJbXSA9ICR0b2tlbjsKCQkJCWNvbnRpbnVlOwoJCQl9CgoJCQlpZiAoaXNfbnVsbCgkcHJldmlvdXNUb2tlbikpIHsKCQkJCWNvbnRpbnVlOwoJCQl9CgoJCQlpZiAoISAoCgkJCQkJKCgkcHJldmlvdXNUb2tlbi0+Z2V0VG9rZW5UeXBlKCkgPT0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRm9ybXVsYVRva2VuOjpUT0tFTl9UWVBFX0ZVTkNUSU9OKSAmJiAoJHByZXZpb3VzVG9rZW4tPmdldFRva2VuU3ViVHlwZSgpID09IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Zvcm11bGFUb2tlbjo6VE9LRU5fU1VCVFlQRV9TVE9QKSkgfHwKCQkJCQkoKCRwcmV2aW91c1Rva2VuLT5nZXRUb2tlblR5cGUoKSA9PSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9Gb3JtdWxhVG9rZW46OlRPS0VOX1RZUEVfU1VCRVhQUkVTU0lPTikgJiYgKCRwcmV2aW91c1Rva2VuLT5nZXRUb2tlblN1YlR5cGUoKSA9PSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9Gb3JtdWxhVG9rZW46OlRPS0VOX1NVQlRZUEVfU1RPUCkpIHx8CgkJCQkJKCRwcmV2aW91c1Rva2VuLT5nZXRUb2tlblR5cGUoKSA9PSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9Gb3JtdWxhVG9rZW46OlRPS0VOX1RZUEVfT1BFUkFORCkKCQkJCSAgKSApIHsKCQkJCWNvbnRpbnVlOwoJCQl9CgoJCQlpZiAoaXNfbnVsbCgkbmV4dFRva2VuKSkgewoJCQkJY29udGludWU7CgkJCX0KCgkJCWlmICghICgKCQkJCQkoKCRuZXh0VG9rZW4tPmdldFRva2VuVHlwZSgpID09IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Zvcm11bGFUb2tlbjo6VE9LRU5fVFlQRV9GVU5DVElPTikgJiYgKCRuZXh0VG9rZW4tPmdldFRva2VuU3ViVHlwZSgpID09IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Zvcm11bGFUb2tlbjo6VE9LRU5fU1VCVFlQRV9TVEFSVCkpIHx8CgkJCQkJKCgkbmV4dFRva2VuLT5nZXRUb2tlblR5cGUoKSA9PSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9Gb3JtdWxhVG9rZW46OlRPS0VOX1RZUEVfU1VCRVhQUkVTU0lPTikgJiYgKCRuZXh0VG9rZW4tPmdldFRva2VuU3ViVHlwZSgpID09IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Zvcm11bGFUb2tlbjo6VE9LRU5fU1VCVFlQRV9TVEFSVCkpIHx8CgkJCQkJKCRuZXh0VG9rZW4tPmdldFRva2VuVHlwZSgpID09IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Zvcm11bGFUb2tlbjo6VE9LRU5fVFlQRV9PUEVSQU5EKQoJCQkJICApICkgewoJCQkJY29udGludWU7CgkJCX0KCgkJCSR0b2tlbnMyW10gPSBuZXcgUEhQRXhjZWxfQ2FsY3VsYXRpb25fRm9ybXVsYVRva2VuKCR2YWx1ZSwgUEhQRXhjZWxfQ2FsY3VsYXRpb25fRm9ybXVsYVRva2VuOjpUT0tFTl9UWVBFX09QRVJBVE9SSU5GSVgsIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Zvcm11bGFUb2tlbjo6VE9LRU5fU1VCVFlQRV9JTlRFUlNFQ1RJT04pOwoJCX0KCgkJLy8gbW92ZSB0b2tlbnMgdG8gZmluYWwgbGlzdCwgc3dpdGNoaW5nIGluZml4ICItIiBvcGVyYXRvcnMgdG8gcHJlZml4IHdoZW4gYXBwcm9wcmlhdGUsIHN3aXRjaGluZyBpbmZpeCAiKyIgb3BlcmF0b3JzCgkJLy8gdG8gbm9vcCB3aGVuIGFwcHJvcHJpYXRlLCBpZGVudGlmeWluZyBvcGVyYW5kIGFuZCBpbmZpeC1vcGVyYXRvciBzdWJ0eXBlcywgYW5kIHB1bGxpbmcgIkAiIGZyb20gZnVuY3Rpb24gbmFtZXMKCQkkdGhpcy0+X3Rva2VucyA9IGFycmF5KCk7CgoJCSR0b2tlbkNvdW50ID0gY291bnQoJHRva2VuczIpOwoJCWZvciAoJGkgPSAwOyAkaSA8ICR0b2tlbkNvdW50OyArKyRpKSB7CgkJCSR0b2tlbiA9ICR0b2tlbnMyWyRpXTsKCQkJaWYgKGlzc2V0KCR0b2tlbnMyWyRpIC0gMV0pKSB7CgkJCQkkcHJldmlvdXNUb2tlbiA9ICR0b2tlbnMyWyRpIC0gMV07CgkJCX0gZWxzZSB7CgkJCQkkcHJldmlvdXNUb2tlbiA9IG51bGw7CgkJCX0KCQkJaWYgKGlzc2V0KCR0b2tlbnMyWyRpICsgMV0pKSB7CgkJCQkkbmV4dFRva2VuID0gJHRva2VuczJbJGkgKyAxXTsKCQkJfSBlbHNlIHsKCQkJCSRuZXh0VG9rZW4gPSBudWxsOwoJCQl9CgoJCQlpZiAoaXNfbnVsbCgkdG9rZW4pKSB7CgkJCQljb250aW51ZTsKCQkJfQoKCQkJaWYgKCR0b2tlbi0+Z2V0VG9rZW5UeXBlKCkgPT0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRm9ybXVsYVRva2VuOjpUT0tFTl9UWVBFX09QRVJBVE9SSU5GSVggJiYgJHRva2VuLT5nZXRWYWx1ZSgpID09ICItIikgewoJCQkJaWYgKCRpID09IDApIHsKCQkJCQkkdG9rZW4tPnNldFRva2VuVHlwZShQSFBFeGNlbF9DYWxjdWxhdGlvbl9Gb3JtdWxhVG9rZW46OlRPS0VOX1RZUEVfT1BFUkFUT1JQUkVGSVgpOwoJCQkJfSBlbHNlIGlmICgKCQkJCQkJCSgoJHByZXZpb3VzVG9rZW4tPmdldFRva2VuVHlwZSgpID09IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Zvcm11bGFUb2tlbjo6VE9LRU5fVFlQRV9GVU5DVElPTikgJiYgKCRwcmV2aW91c1Rva2VuLT5nZXRUb2tlblN1YlR5cGUoKSA9PSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9Gb3JtdWxhVG9rZW46OlRPS0VOX1NVQlRZUEVfU1RPUCkpIHx8CgkJCQkJCQkoKCRwcmV2aW91c1Rva2VuLT5nZXRUb2tlblR5cGUoKSA9PSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9Gb3JtdWxhVG9rZW46OlRPS0VOX1RZUEVfU1VCRVhQUkVTU0lPTikgJiYgKCRwcmV2aW91c1Rva2VuLT5nZXRUb2tlblN1YlR5cGUoKSA9PSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9Gb3JtdWxhVG9rZW46OlRPS0VOX1NVQlRZUEVfU1RPUCkpIHx8CgkJCQkJCQkoJHByZXZpb3VzVG9rZW4tPmdldFRva2VuVHlwZSgpID09IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Zvcm11bGFUb2tlbjo6VE9LRU5fVFlQRV9PUEVSQVRPUlBPU1RGSVgpIHx8CgkJCQkJCQkoJHByZXZpb3VzVG9rZW4tPmdldFRva2VuVHlwZSgpID09IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Zvcm11bGFUb2tlbjo6VE9LRU5fVFlQRV9PUEVSQU5EKQoJCQkJCQkpIHsKCQkJCQkkdG9rZW4tPnNldFRva2VuU3ViVHlwZShQSFBFeGNlbF9DYWxjdWxhdGlvbl9Gb3JtdWxhVG9rZW46OlRPS0VOX1NVQlRZUEVfTUFUSCk7CgkJCQl9IGVsc2UgewoJCQkJCSR0b2tlbi0+c2V0VG9rZW5UeXBlKFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Zvcm11bGFUb2tlbjo6VE9LRU5fVFlQRV9PUEVSQVRPUlBSRUZJWCk7CgkJCQl9CgoJCQkJJHRoaXMtPl90b2tlbnNbXSA9ICR0b2tlbjsKCQkJCWNvbnRpbnVlOwoJCQl9CgoJCQlpZiAoJHRva2VuLT5nZXRUb2tlblR5cGUoKSA9PSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9Gb3JtdWxhVG9rZW46OlRPS0VOX1RZUEVfT1BFUkFUT1JJTkZJWCAmJiAkdG9rZW4tPmdldFZhbHVlKCkgPT0gIisiKSB7CgkJCQlpZiAoJGkgPT0gMCkgewoJCQkJCWNvbnRpbnVlOwoJCQkJfSBlbHNlIGlmICgKCQkJCQkJCSgoJHByZXZpb3VzVG9rZW4tPmdldFRva2VuVHlwZSgpID09IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Zvcm11bGFUb2tlbjo6VE9LRU5fVFlQRV9GVU5DVElPTikgJiYgKCRwcmV2aW91c1Rva2VuLT5nZXRUb2tlblN1YlR5cGUoKSA9PSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9Gb3JtdWxhVG9rZW46OlRPS0VOX1NVQlRZUEVfU1RPUCkpIHx8CgkJCQkJCQkoKCRwcmV2aW91c1Rva2VuLT5nZXRUb2tlblR5cGUoKSA9PSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9Gb3JtdWxhVG9rZW46OlRPS0VOX1RZUEVfU1VCRVhQUkVTU0lPTikgJiYgKCRwcmV2aW91c1Rva2VuLT5nZXRUb2tlblN1YlR5cGUoKSA9PSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9Gb3JtdWxhVG9rZW46OlRPS0VOX1NVQlRZUEVfU1RPUCkpIHx8CgkJCQkJCQkoJHByZXZpb3VzVG9rZW4tPmdldFRva2VuVHlwZSgpID09IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Zvcm11bGFUb2tlbjo6VE9LRU5fVFlQRV9PUEVSQVRPUlBPU1RGSVgpIHx8CgkJCQkJCQkoJHByZXZpb3VzVG9rZW4tPmdldFRva2VuVHlwZSgpID09IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Zvcm11bGFUb2tlbjo6VE9LRU5fVFlQRV9PUEVSQU5EKQoJCQkJCQkpIHsKCQkJCQkkdG9rZW4tPnNldFRva2VuU3ViVHlwZShQSFBFeGNlbF9DYWxjdWxhdGlvbl9Gb3JtdWxhVG9rZW46OlRPS0VOX1NVQlRZUEVfTUFUSCk7CgkJCQl9IGVsc2UgewoJCQkJCWNvbnRpbnVlOwoJCQkJfQoKCQkJCSR0aGlzLT5fdG9rZW5zW10gPSAkdG9rZW47CgkJCQljb250aW51ZTsKCQkJfQoKCQkJaWYgKCR0b2tlbi0+Z2V0VG9rZW5UeXBlKCkgPT0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRm9ybXVsYVRva2VuOjpUT0tFTl9UWVBFX09QRVJBVE9SSU5GSVggJiYgJHRva2VuLT5nZXRUb2tlblN1YlR5cGUoKSA9PSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9Gb3JtdWxhVG9rZW46OlRPS0VOX1NVQlRZUEVfTk9USElORykgewoJCQkJaWYgKHN0cnBvcygiPD49Iiwgc3Vic3RyKCR0b2tlbi0+Z2V0VmFsdWUoKSwgMCwgMSkpICE9PSBmYWxzZSkgewoJCQkJCSR0b2tlbi0+c2V0VG9rZW5TdWJUeXBlKFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Zvcm11bGFUb2tlbjo6VE9LRU5fU1VCVFlQRV9MT0dJQ0FMKTsKCQkJCX0gZWxzZSBpZiAoJHRva2VuLT5nZXRWYWx1ZSgpID09ICImIikgewoJCQkJCSR0b2tlbi0+c2V0VG9rZW5TdWJUeXBlKFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Zvcm11bGFUb2tlbjo6VE9LRU5fU1VCVFlQRV9DT05DQVRFTkFUSU9OKTsKCQkJCX0gZWxzZSB7CgkJCQkJJHRva2VuLT5zZXRUb2tlblN1YlR5cGUoUEhQRXhjZWxfQ2FsY3VsYXRpb25fRm9ybXVsYVRva2VuOjpUT0tFTl9TVUJUWVBFX01BVEgpOwoJCQkJfQoKCQkJCSR0aGlzLT5fdG9rZW5zW10gPSAkdG9rZW47CgkJCQljb250aW51ZTsKCQkJfQoKCQkJaWYgKCR0b2tlbi0+Z2V0VG9rZW5UeXBlKCkgPT0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRm9ybXVsYVRva2VuOjpUT0tFTl9UWVBFX09QRVJBTkQgJiYgJHRva2VuLT5nZXRUb2tlblN1YlR5cGUoKSA9PSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9Gb3JtdWxhVG9rZW46OlRPS0VOX1NVQlRZUEVfTk9USElORykgewoJCQkJaWYgKCFpc19udW1lcmljKCR0b2tlbi0+Z2V0VmFsdWUoKSkpIHsKCQkJCQlpZiAoc3RydG91cHBlcigkdG9rZW4tPmdldFZhbHVlKCkpID09ICJUUlVFIiB8fCBzdHJ0b3VwcGVyKCR0b2tlbi0+Z2V0VmFsdWUoKSA9PSAiRkFMU0UiKSkgewoJCQkJCQkkdG9rZW4tPnNldFRva2VuU3ViVHlwZShQSFBFeGNlbF9DYWxjdWxhdGlvbl9Gb3JtdWxhVG9rZW46OlRPS0VOX1NVQlRZUEVfTE9HSUNBTCk7CgkJCQkJfSBlbHNlIHsKCQkJCQkJJHRva2VuLT5zZXRUb2tlblN1YlR5cGUoUEhQRXhjZWxfQ2FsY3VsYXRpb25fRm9ybXVsYVRva2VuOjpUT0tFTl9TVUJUWVBFX1JBTkdFKTsKCQkJCQl9CgkJCQl9IGVsc2UgewoJCQkJCSR0b2tlbi0+c2V0VG9rZW5TdWJUeXBlKFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Zvcm11bGFUb2tlbjo6VE9LRU5fU1VCVFlQRV9OVU1CRVIpOwoJCQkJfQoKCQkJCSR0aGlzLT5fdG9rZW5zW10gPSAkdG9rZW47CgkJCQljb250aW51ZTsKCQkJfQoKCQkJaWYgKCR0b2tlbi0+Z2V0VG9rZW5UeXBlKCkgPT0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRm9ybXVsYVRva2VuOjpUT0tFTl9UWVBFX0ZVTkNUSU9OKSB7CgkJCQlpZiAoc3RybGVuKCR0b2tlbi0+Z2V0VmFsdWUoKSA+IDApKSB7CgkJCQkJaWYgKHN1YnN0cigkdG9rZW4tPmdldFZhbHVlKCksIDAsIDEpID09ICJAIikgewoJCQkJCQkkdG9rZW4tPnNldFZhbHVlKHN1YnN0cigkdG9rZW4tPmdldFZhbHVlKCksIDEpKTsKCQkJCQl9CgkJCQl9CgkJCX0KCiAgICAgICAgCSR0aGlzLT5fdG9rZW5zW10gPSAkdG9rZW47CgkJfQogICAgfQp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Calculation/FormulaToken.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIFBIUEV4Y2VsCiAqCiAqIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICoKICogQGNhdGVnb3J5ICAgUEhQRXhjZWwKICogQHBhY2thZ2UgICAgUEhQRXhjZWxfQ2FsY3VsYXRpb24KICogQGNvcHlyaWdodCAgQ29weXJpZ2h0IChjKSAyMDA2IC0gMjAxMiBQSFBFeGNlbCAoaHR0cDovL3d3dy5jb2RlcGxleC5jb20vUEhQRXhjZWwpCiAqIEBsaWNlbnNlICAgIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9vbGQtbGljZW5zZXMvbGdwbC0yLjEudHh0CUxHUEwKICogQHZlcnNpb24gICAgMS43LjcsIDIwMTItMDUtMTkKICovCgoKLyoKUEFSVExZIEJBU0VEIE9OOgoJQ29weXJpZ2h0IChjKSAyMDA3IEUuIFcuIEJhY2h0YWwsIEluYy4KCglQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUKCWFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwKCWluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCglhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLAoJc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CgoJICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsCgkgIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KCglUaGUgc29mdHdhcmUgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aG91dCB3YXJyYW50eSBvZiBhbnkga2luZCwgZXhwcmVzcyBvciBpbXBsaWVkLCBpbmNsdWRpbmcgYnV0IG5vdAoJbGltaXRlZCB0byB0aGUgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHksIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlIGFuZCBub25pbmZyaW5nZW1lbnQuIEluCglubyBldmVudCBzaGFsbCB0aGUgYXV0aG9ycyBvciBjb3B5cmlnaHQgaG9sZGVycyBiZSBsaWFibGUgZm9yIGFueSBjbGFpbSwgZGFtYWdlcyBvciBvdGhlciBsaWFiaWxpdHksCgl3aGV0aGVyIGluIGFuIGFjdGlvbiBvZiBjb250cmFjdCwgdG9ydCBvciBvdGhlcndpc2UsIGFyaXNpbmcgZnJvbSwgb3V0IG9mIG9yIGluIGNvbm5lY3Rpb24gd2l0aCB0aGUKCXNvZnR3YXJlIG9yIHRoZSB1c2Ugb3Igb3RoZXIgZGVhbGluZ3MgaW4gdGhlIHNvZnR3YXJlLgoKCWh0dHA6Ly9ld2JpLmJsb2dzLmNvbS9kZXZlbG9wcy8yMDA3LzAzL2V4Y2VsX2Zvcm11bGFfcC5odG1sCglodHRwOi8vZXdiaS5ibG9ncy5jb20vZGV2ZWxvcHMvMjAwNC8xMi9leGNlbF9mb3JtdWxhX3AuaHRtbAoqLwoKCi8qKgogKiBQSFBFeGNlbF9DYWxjdWxhdGlvbl9Gb3JtdWxhVG9rZW4KICoKICogQGNhdGVnb3J5ICAgUEhQRXhjZWwKICogQHBhY2thZ2UgICAgUEhQRXhjZWxfQ2FsY3VsYXRpb24KICogQGNvcHlyaWdodCAgQ29weXJpZ2h0IChjKSAyMDA2IC0gMjAxMiBQSFBFeGNlbCAoaHR0cDovL3d3dy5jb2RlcGxleC5jb20vUEhQRXhjZWwpCiAqLwpjbGFzcyBQSFBFeGNlbF9DYWxjdWxhdGlvbl9Gb3JtdWxhVG9rZW4gewoJLyogVG9rZW4gdHlwZXMgKi8KCWNvbnN0IFRPS0VOX1RZUEVfTk9PUAkJCQkJPSAnTm9vcCc7Cgljb25zdCBUT0tFTl9UWVBFX09QRVJBTkQJCQkJPSAnT3BlcmFuZCc7Cgljb25zdCBUT0tFTl9UWVBFX0ZVTkNUSU9OCQkJCT0gJ0Z1bmN0aW9uJzsKCWNvbnN0IFRPS0VOX1RZUEVfU1VCRVhQUkVTU0lPTgkJCT0gJ1N1YmV4cHJlc3Npb24nOwoJY29uc3QgVE9LRU5fVFlQRV9BUkdVTUVOVAkJCQk9ICdBcmd1bWVudCc7Cgljb25zdCBUT0tFTl9UWVBFX09QRVJBVE9SUFJFRklYCQkJPSAnT3BlcmF0b3JQcmVmaXgnOwoJY29uc3QgVE9LRU5fVFlQRV9PUEVSQVRPUklORklYCQkJPSAnT3BlcmF0b3JJbmZpeCc7Cgljb25zdCBUT0tFTl9UWVBFX09QRVJBVE9SUE9TVEZJWAkJPSAnT3BlcmF0b3JQb3N0Zml4JzsKCWNvbnN0IFRPS0VOX1RZUEVfV0hJVEVTUEFDRQkJCQk9ICdXaGl0ZXNwYWNlJzsKCWNvbnN0IFRPS0VOX1RZUEVfVU5LTk9XTgkJCQk9ICdVbmtub3duJzsKCgkvKiBUb2tlbiBzdWJ0eXBlcyAqLwoJY29uc3QgVE9LRU5fU1VCVFlQRV9OT1RISU5HCQkJCT0gJ05vdGhpbmcnOwoJY29uc3QgVE9LRU5fU1VCVFlQRV9TVEFSVAkJCQk9ICdTdGFydCc7Cgljb25zdCBUT0tFTl9TVUJUWVBFX1NUT1AJCQkJPSAnU3RvcCc7Cgljb25zdCBUT0tFTl9TVUJUWVBFX1RFWFQJCQkJPSAnVGV4dCc7Cgljb25zdCBUT0tFTl9TVUJUWVBFX05VTUJFUgkJCQk9ICdOdW1iZXInOwoJY29uc3QgVE9LRU5fU1VCVFlQRV9MT0dJQ0FMCQkJCT0gJ0xvZ2ljYWwnOwoJY29uc3QgVE9LRU5fU1VCVFlQRV9FUlJPUgkJCQk9ICdFcnJvcic7Cgljb25zdCBUT0tFTl9TVUJUWVBFX1JBTkdFCQkJCT0gJ1JhbmdlJzsKCWNvbnN0IFRPS0VOX1NVQlRZUEVfTUFUSAkJCQk9ICdNYXRoJzsKCWNvbnN0IFRPS0VOX1NVQlRZUEVfQ09OQ0FURU5BVElPTgkJPSAnQ29uY2F0ZW5hdGlvbic7Cgljb25zdCBUT0tFTl9TVUJUWVBFX0lOVEVSU0VDVElPTgkJPSAnSW50ZXJzZWN0aW9uJzsKCWNvbnN0IFRPS0VOX1NVQlRZUEVfVU5JT04JCQkJPSAnVW5pb24nOwoKCS8qKgoJICogVmFsdWUKCSAqCgkgKiBAdmFyIHN0cmluZwoJICovCglwcml2YXRlICRfdmFsdWU7CgoJLyoqCgkgKiBUb2tlbiBUeXBlIChyZXByZXNlbnRlZCBieSBUT0tFTl9UWVBFXyopCgkgKgoJICogQHZhciBzdHJpbmcKCSAqLwoJcHJpdmF0ZSAkX3Rva2VuVHlwZTsKCgkvKioKCSAqIFRva2VuIFN1YlR5cGUgKHJlcHJlc2VudGVkIGJ5IFRPS0VOX1NVQlRZUEVfKikKCSAqCgkgKiBAdmFyIHN0cmluZwoJICovCglwcml2YXRlICRfdG9rZW5TdWJUeXBlOwoKICAgIC8qKgogICAgICogQ3JlYXRlIGEgbmV3IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Zvcm11bGFUb2tlbgogICAgICoKICAgICAqIEBwYXJhbSBzdHJpbmcJJHBWYWx1ZQogICAgICogQHBhcmFtIHN0cmluZwkkcFRva2VuVHlwZSAJVG9rZW4gdHlwZSAocmVwcmVzZW50ZWQgYnkgVE9LRU5fVFlQRV8qKQogICAgICogQHBhcmFtIHN0cmluZwkkcFRva2VuU3ViVHlwZSAJVG9rZW4gU3VidHlwZSAocmVwcmVzZW50ZWQgYnkgVE9LRU5fU1VCVFlQRV8qKQogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJHBWYWx1ZSwgJHBUb2tlblR5cGUgPSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9Gb3JtdWxhVG9rZW46OlRPS0VOX1RZUEVfVU5LTk9XTiwgJHBUb2tlblN1YlR5cGUgPSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9Gb3JtdWxhVG9rZW46OlRPS0VOX1NVQlRZUEVfTk9USElORykKICAgIHsKICAgIAkvLyBJbml0aWFsaXNlIHZhbHVlcwogICAgCSR0aGlzLT5fdmFsdWUJCQkJPSAkcFZhbHVlOwogICAgCSR0aGlzLT5fdG9rZW5UeXBlCQkJPSAkcFRva2VuVHlwZTsKICAgIAkkdGhpcy0+X3Rva2VuU3ViVHlwZSAJCT0gJHBUb2tlblN1YlR5cGU7CiAgICB9CgogICAgLyoqCiAgICAgKiBHZXQgVmFsdWUKICAgICAqCiAgICAgKiBAcmV0dXJuIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0VmFsdWUoKSB7CiAgICAJcmV0dXJuICR0aGlzLT5fdmFsdWU7CiAgICB9CgogICAgLyoqCiAgICAgKiBTZXQgVmFsdWUKICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nCSR2YWx1ZQogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gc2V0VmFsdWUoJHZhbHVlKSB7CiAgICAJJHRoaXMtPl92YWx1ZSA9ICR2YWx1ZTsKICAgIH0KCiAgICAvKioKICAgICAqIEdldCBUb2tlbiBUeXBlIChyZXByZXNlbnRlZCBieSBUT0tFTl9UWVBFXyopCiAgICAgKgogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldFRva2VuVHlwZSgpIHsKICAgIAlyZXR1cm4gJHRoaXMtPl90b2tlblR5cGU7CiAgICB9CgogICAgLyoqCiAgICAgKiBTZXQgVG9rZW4gVHlwZQogICAgICoKICAgICAqIEBwYXJhbSBzdHJpbmcJJHZhbHVlCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBzZXRUb2tlblR5cGUoJHZhbHVlID0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRm9ybXVsYVRva2VuOjpUT0tFTl9UWVBFX1VOS05PV04pIHsKICAgIAkkdGhpcy0+X3Rva2VuVHlwZSA9ICR2YWx1ZTsKICAgIH0KCiAgICAvKioKICAgICAqIEdldCBUb2tlbiBTdWJUeXBlIChyZXByZXNlbnRlZCBieSBUT0tFTl9TVUJUWVBFXyopCiAgICAgKgogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldFRva2VuU3ViVHlwZSgpIHsKICAgIAlyZXR1cm4gJHRoaXMtPl90b2tlblN1YlR5cGU7CiAgICB9CgogICAgLyoqCiAgICAgKiBTZXQgVG9rZW4gU3ViVHlwZQogICAgICoKICAgICAqIEBwYXJhbSBzdHJpbmcJJHZhbHVlCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBzZXRUb2tlblN1YlR5cGUoJHZhbHVlID0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRm9ybXVsYVRva2VuOjpUT0tFTl9TVUJUWVBFX05PVEhJTkcpIHsKICAgIAkkdGhpcy0+X3Rva2VuU3ViVHlwZSA9ICR2YWx1ZTsKICAgIH0KfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Calculation/Function.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIFBIUEV4Y2VsCiAqCiAqIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICoKICogQGNhdGVnb3J5ICAgUEhQRXhjZWwKICogQHBhY2thZ2UgICAgUEhQRXhjZWxfQ2FsY3VsYXRpb24KICogQGNvcHlyaWdodCAgQ29weXJpZ2h0IChjKSAyMDA2IC0gMjAxMiBQSFBFeGNlbCAoaHR0cDovL3d3dy5jb2RlcGxleC5jb20vUEhQRXhjZWwpCiAqIEBsaWNlbnNlICAgIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9vbGQtbGljZW5zZXMvbGdwbC0yLjEudHh0CUxHUEwKICogQHZlcnNpb24gICAgMS43LjcsIDIwMTItMDUtMTkKICovCgoKLyoqCiAqIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uCiAqCiAqIEBjYXRlZ29yeSAgIFBIUEV4Y2VsCiAqIEBwYWNrYWdlICAgIFBIUEV4Y2VsX0NhbGN1bGF0aW9uCiAqIEBjb3B5cmlnaHQgIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwgKGh0dHA6Ly93d3cuY29kZXBsZXguY29tL1BIUEV4Y2VsKQogKi8KY2xhc3MgUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb24gewoJLyogRnVuY3Rpb24gY2F0ZWdvcmllcyAqLwoJY29uc3QgQ0FURUdPUllfQ1VCRQkJCQkJCT0gJ0N1YmUnOwoJY29uc3QgQ0FURUdPUllfREFUQUJBU0UJCQkJCT0gJ0RhdGFiYXNlJzsKCWNvbnN0IENBVEVHT1JZX0RBVEVfQU5EX1RJTUUJCQk9ICdEYXRlIGFuZCBUaW1lJzsKCWNvbnN0IENBVEVHT1JZX0VOR0lORUVSSU5HCQkJCT0gJ0VuZ2luZWVyaW5nJzsKCWNvbnN0IENBVEVHT1JZX0ZJTkFOQ0lBTAkJCQk9ICdGaW5hbmNpYWwnOwoJY29uc3QgQ0FURUdPUllfSU5GT1JNQVRJT04JCQkJPSAnSW5mb3JtYXRpb24nOwoJY29uc3QgQ0FURUdPUllfTE9HSUNBTAkJCQkJPSAnTG9naWNhbCc7Cgljb25zdCBDQVRFR09SWV9MT09LVVBfQU5EX1JFRkVSRU5DRQkJPSAnTG9va3VwIGFuZCBSZWZlcmVuY2UnOwoJY29uc3QgQ0FURUdPUllfTUFUSF9BTkRfVFJJRwkJCT0gJ01hdGggYW5kIFRyaWcnOwoJY29uc3QgQ0FURUdPUllfU1RBVElTVElDQUwJCQkJPSAnU3RhdGlzdGljYWwnOwoJY29uc3QgQ0FURUdPUllfVEVYVF9BTkRfREFUQQkJCT0gJ1RleHQgYW5kIERhdGEnOwoKCS8qKgoJICogQ2F0ZWdvcnkgKHJlcHJlc2VudGVkIGJ5IENBVEVHT1JZXyopCgkgKgoJICogQHZhciBzdHJpbmcKCSAqLwoJcHJpdmF0ZSAkX2NhdGVnb3J5OwoKCS8qKgoJICogRXhjZWwgbmFtZQoJICoKCSAqIEB2YXIgc3RyaW5nCgkgKi8KCXByaXZhdGUgJF9leGNlbE5hbWU7CgoJLyoqCgkgKiBQSFBFeGNlbCBuYW1lCgkgKgoJICogQHZhciBzdHJpbmcKCSAqLwoJcHJpdmF0ZSAkX3BocEV4Y2VsTmFtZTsKCiAgICAvKioKICAgICAqIENyZWF0ZSBhIG5ldyBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbgogICAgICoKICAgICAqIEBwYXJhbSAJc3RyaW5nCQkkcENhdGVnb3J5IAkJQ2F0ZWdvcnkgKHJlcHJlc2VudGVkIGJ5IENBVEVHT1JZXyopCiAgICAgKiBAcGFyYW0gCXN0cmluZwkJJHBFeGNlbE5hbWUJCUV4Y2VsIGZ1bmN0aW9uIG5hbWUKICAgICAqIEBwYXJhbSAJc3RyaW5nCQkkcFBIUEV4Y2VsTmFtZQlQSFBFeGNlbCBmdW5jdGlvbiBtYXBwaW5nCiAgICAgKiBAdGhyb3dzIAlFeGNlcHRpb24KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRwQ2F0ZWdvcnkgPSBOVUxMLCAkcEV4Y2VsTmFtZSA9IE5VTEwsICRwUEhQRXhjZWxOYW1lID0gTlVMTCkKICAgIHsKICAgIAlpZiAoKCRwQ2F0ZWdvcnkgIT09IE5VTEwpICYmICgkcEV4Y2VsTmFtZSAhPT0gTlVMTCkgJiYgKCRwUEhQRXhjZWxOYW1lICE9PSBOVUxMKSkgewogICAgCQkvLyBJbml0aWFsaXNlIHZhbHVlcwogICAgCQkkdGhpcy0+X2NhdGVnb3J5IAkJPSAkcENhdGVnb3J5OwogICAgCQkkdGhpcy0+X2V4Y2VsTmFtZSAJCT0gJHBFeGNlbE5hbWU7CiAgICAJCSR0aGlzLT5fcGhwRXhjZWxOYW1lIAk9ICRwUEhQRXhjZWxOYW1lOwogICAgCX0gZWxzZSB7CiAgICAJCXRocm93IG5ldyBFeGNlcHRpb24oIkludmFsaWQgcGFyYW1ldGVycyBwYXNzZWQuIik7CiAgICAJfQogICAgfQoKICAgIC8qKgogICAgICogR2V0IENhdGVnb3J5IChyZXByZXNlbnRlZCBieSBDQVRFR09SWV8qKQogICAgICoKICAgICAqIEByZXR1cm4gc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRDYXRlZ29yeSgpIHsKICAgIAlyZXR1cm4gJHRoaXMtPl9jYXRlZ29yeTsKICAgIH0KCiAgICAvKioKICAgICAqIFNldCBDYXRlZ29yeSAocmVwcmVzZW50ZWQgYnkgQ0FURUdPUllfKikKICAgICAqCiAgICAgKiBAcGFyYW0gCXN0cmluZwkJJHZhbHVlCiAgICAgKiBAdGhyb3dzIAlFeGNlcHRpb24KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHNldENhdGVnb3J5KCR2YWx1ZSA9IG51bGwpIHsKICAgIAlpZiAoIWlzX251bGwoJHZhbHVlKSkgewogICAgCQkkdGhpcy0+X2NhdGVnb3J5ID0gJHZhbHVlOwogICAgCX0gZWxzZSB7CiAgICAJCXRocm93IG5ldyBFeGNlcHRpb24oIkludmFsaWQgcGFyYW1ldGVyIHBhc3NlZC4iKTsKICAgIAl9CiAgICB9CgogICAgLyoqCiAgICAgKiBHZXQgRXhjZWwgbmFtZQogICAgICoKICAgICAqIEByZXR1cm4gc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRFeGNlbE5hbWUoKSB7CiAgICAJcmV0dXJuICR0aGlzLT5fZXhjZWxOYW1lOwogICAgfQoKICAgIC8qKgogICAgICogU2V0IEV4Y2VsIG5hbWUKICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nCSR2YWx1ZQogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gc2V0RXhjZWxOYW1lKCR2YWx1ZSkgewogICAgCSR0aGlzLT5fZXhjZWxOYW1lID0gJHZhbHVlOwogICAgfQoKICAgIC8qKgogICAgICogR2V0IFBIUEV4Y2VsIG5hbWUKICAgICAqCiAgICAgKiBAcmV0dXJuIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0UEhQRXhjZWxOYW1lKCkgewogICAgCXJldHVybiAkdGhpcy0+X3BocEV4Y2VsTmFtZTsKICAgIH0KCiAgICAvKioKICAgICAqIFNldCBQSFBFeGNlbCBuYW1lCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZwkkdmFsdWUKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHNldFBIUEV4Y2VsTmFtZSgkdmFsdWUpIHsKICAgIAkkdGhpcy0+X3BocEV4Y2VsTmFtZSA9ICR2YWx1ZTsKICAgIH0KfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Calculation/functionlist.txt</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[QUJTCkFDQ1JJTlQKQUNDUklOVE0KQUNPUwpBQ09TSApBRERSRVNTCkFNT1JERUdSQwpBTU9STElOQwpBTkQKQVJFQVMKQVNDCkFTSU4KQVNJTkgKQVRBTgpBVEFOMgpBVEFOSApBVkVERVYKQVZFUkFHRQpBVkVSQUdFQQpBVkVSQUdFSUYKQVZFUkFHRUlGUwpCQUhUVEVYVApCRVNTRUxJCkJFU1NFTEoKQkVTU0VMSwpCRVNTRUxZCkJFVEFESVNUCkJFVEFJTlYKQklOMkRFQwpCSU4ySEVYCkJJTjJPQ1QKQklOT01ESVNUCkNFSUxJTkcKQ0VMTApDSEFSCkNISURJU1QKQ0hJSU5WCkNISVRFU1QKQ0hPT1NFCkNMRUFOCkNPREUKQ09MVU1OCkNPTFVNTlMKQ09NQklOCkNPTVBMRVgKQ09OQ0FURU5BVEUKQ09ORklERU5DRQpDT05WRVJUCkNPUlJFTApDT1MKQ09TSApDT1VOVApDT1VOVEEKQ09VTlRCTEFOSwpDT1VOVElGCkNPVU5USUZTCkNPVVBEQVlCUwpDT1VQREFZQlMKQ09VUERBWVNOQwpDT1VQTkNECkNPVVBOVU0KQ09VUFBDRApDT1ZBUgpDUklUQklOT00KQ1VCRUtQSU1FTUJFUgpDVUJFTUVNQkVSCkNVQkVNRU1CRVJQUk9QRVJUWQpDVUJFUkFOS0VETUVNQkVSCkNVQkVTRVQKQ1VCRVNFVENPVU5UCkNVQkVWQUxVRQpDVU1JUE1UCkNVTVBSSU5DCkRBVEUKREFURURJRgpEQVRFVkFMVUUKREFWRVJBR0UKREFZCkRBWVMzNjAKREIKRENPVU5UCkRDT1VOVEEKRERCCkRFQzJCSU4KREVDMkhFWApERUMyT0NUCkRFR1JFRVMKREVMVEEKREVWU1EKREdFVApESVNDCkRNQVgKRE1JTgpET0xMQVIKRE9MTEFSREUKRE9MTEFSRlIKRFBST0RVQ1QKRFNUREVWCkRTVERFVlAKRFNVTQpEVVJBVElPTgpEVkFSCkRWQVJQCkVEQVRFCkVGRkVDVApFT01PTlRICkVSRgpFUkZDCkVSUk9SLlRZUEUKRVZFTgpFWEFDVApFWFAKRVhQT05ESVNUCkZBQ1QKRkFDVERPVUJMRQpGQUxTRQpGRElTVApGSU5ECkZJTkRCCkZJTlYKRklTSEVSCkZJU0hFUklOVgpGSVhFRApGTE9PUgpGT1JFQ0FTVApGUkVRVUVOQ1kKRlRFU1QKRlYKRlZTQ0hFRFVMRQpHQU1BTURJU1QKR0FNTUFJTlYKR0FNTUFMTgpHQ0QKR0VPTUVBTgpHRVNURVAKR0VUUElWT1REQVRBCkdST1dUSApIQVJNRUFOCkhFWDJCSU4KSEVYMk9DVApITE9PS1VQCkhPVVIKSFlQRVJMSU5LCkhZUEdFT01ESVNUCklGCklGRVJST1IKSU1BQlMKSU1BR0lOQVJZCklNQVJHVU1FTlQKSU1DT05KVUdBVEUKSU1DT1MKSU1FWFAKSU1MTgpJTUxPRzEwCklNTE9HMgpJTVBPV0VSCklNUFJPRFVDVApJTVJFQUwKSU1TSU4KSU1TUVJUCklNU1VCCklNU1VNCklOREVYCklORElSRUNUCklORk8KSU5UCklOVEVSQ0VQVApJTlRSQVRFCklQTVQKSVJSCklTQkxBTksKSVNFUlIKSVNFUlJPUgpJU0VWRU4KSVNMT0dJQ0FMCklTTkEKSVNOT05URVhUCklTTlVNQkVSCklTT0RECklTUE1UCklTUkVGCklTVEVYVApKSVMKS1VSVApMQVJHRQpMQ00KTEVGVApMRUZUQgpMRU4KTEVOQgpMSU5FU1QKTE4KTE9HCkxPRzEwCkxPR0VTVApMT0dJTlYKTE9HTk9STURJU1QKTE9PS1VQCkxPV0VSCk1BVENICk1BWApNQVhBCk1ERVRFUk0KTURVUkFUSU9OCk1FRElBTgpNSUQKTUlEQgpNSU4KTUlOQQpNSU5VVEUKTUlOVkVSU0UKTUlSUgpNTVVMVApNT0QKTU9ERQpNT05USApNUk9VTkQKTVVMVElOT01JQUwKTgpOQQpORUdCSU5PTURJU1QKTkVUV09SS0RBWVMKTk9NSU5BTApOT1JNRElTVApOT1JNSU5WCk5PUk1TRElTVApOT1JNU0lOVgpOT1QKTk9XCk5QRVIKTlBWCk9DVDJCSU4KT0NUMkRFQwpPQ1QySEVYCk9ERApPRERGUFJJQ0UKT0RERllJRUxECk9ERExQUklDRQpPRERMWUlFTEQKT0ZGU0VUCk9SClBFQVJTT04KUEVSQ0VOVElMRQpQRVJDRU5UUkFOSwpQRVJNVVQKUEhPTkVUSUMKUEkKUE1UClBPSVNTT04KUE9XRVIKUFBNVApQUklDRQpQUklDRURJU0MKUFJJQ0VNQVQKUFJPQgpQUk9EVUNUClBST1BFUgpQVgpRVUFSVElMRQpRVU9USUVOVApSQURJQU5TClJBTkQKUkFOREJFVFdFRU4KUkFOSwpSQVRFClJFQ0VJVkVEClJFUExBQ0UKUkVQTEFDRUIKUkVQVApSSUdIVApSSUdIVEIKUk9NQU4KUk9VTkQKUk9VTkRET1dOClJPVU5EVVAKUk9XClJPV1MKUlNRClJURApTRUFSQ0gKU0VBUkNIQgpTRUNPTkQKU0VSSUVTU1VNClNJR04KU0lOClNJTkgKU0tFVwpTTE4KU0xPUEUKU01BTEwKU1FSVApTUVJUUEkKU1RBTkRBUkRJWkUKU1RERVYKU1RERVZBClNUREVWUApTVERFVlBBClNURVlYClNVQlNUSVRVVEUKU1VCVE9UQUwKU1VNClNVTUlGClNVTUlGUwpTVU1QUk9EVUNUClNVTVNRClNVTVgyTVkyClNVTVgyUFkyClNVTVhNWTIKU1lEClQKVEFOClRBTkgKVEJJTExFUQpUQklMTFBSSUNFClRCSUxMWUlFTEQKVERJU1QKVEVYVApUSU1FClRJTUVWQUxVRQpUSU5WClRPREFZClRSQU5TUE9TRQpUUkVORApUUklNClRSSU1NRUFOClRSVUUKVFJVTkMKVFRFU1QKVFlQRQpVUFBFUgpVU0RPTExBUgpWQUxVRQpWQVIKVkFSQQpWQVJQClZBUlBBClZEQgpWRVJTSU9OClZMT09LVVAKV0VFS0RBWQpXRUVLTlVNCldFSUJVTEwKV09SS0RBWQpYSVJSClhOUFYKWUVBUgpZRUFSRlJBQwpZSUVMRApZSUVMRERJU0MKWUlFTERNQVQKWlRFU1QK]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Calculation/Functions.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIFBIUEV4Y2VsCiAqCiAqIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKICoKICogQGNhdGVnb3J5CVBIUEV4Y2VsCiAqIEBwYWNrYWdlCQlQSFBFeGNlbF9DYWxjdWxhdGlvbgogKiBAY29weXJpZ2h0CUNvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwgKGh0dHA6Ly93d3cuY29kZXBsZXguY29tL1BIUEV4Y2VsKQogKiBAbGljZW5zZQkJaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL29sZC1saWNlbnNlcy9sZ3BsLTIuMS50eHQJTEdQTAogKiBAdmVyc2lvbgkJMS43LjcsIDIwMTItMDUtMTkKICovCgoKLyoqIFBIUEV4Y2VsIHJvb3QgZGlyZWN0b3J5ICovCmlmICghZGVmaW5lZCgnUEhQRVhDRUxfUk9PVCcpKSB7CgkvKioKCSAqIEBpZ25vcmUKCSAqLwoJZGVmaW5lKCdQSFBFWENFTF9ST09UJywgZGlybmFtZShfX0ZJTEVfXykgLiAnLy4uLy4uLycpOwoJcmVxdWlyZShQSFBFWENFTF9ST09UIC4gJ1BIUEV4Y2VsL0F1dG9sb2FkZXIucGhwJyk7Cn0KCgovKiogTUFYX1ZBTFVFICovCmRlZmluZSgnTUFYX1ZBTFVFJywgMS4yZTMwOCk7CgovKiogMiAvIFBJICovCmRlZmluZSgnTV8yRElWUEknLCAwLjYzNjYxOTc3MjM2NzU4MTM0MzA3NTUzNTA1MzQ5MDA2KTsKCi8qKiBNQVhfSVRFUkFUSU9OUyAqLwpkZWZpbmUoJ01BWF9JVEVSQVRJT05TJywgMjU2KTsKCi8qKiBQUkVDSVNJT04gKi8KZGVmaW5lKCdQUkVDSVNJT04nLCA4Ljg4RS0wMTYpOwoKCi8qKgogKiBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnMKICoKICogQGNhdGVnb3J5CVBIUEV4Y2VsCiAqIEBwYWNrYWdlCQlQSFBFeGNlbF9DYWxjdWxhdGlvbgogKiBAY29weXJpZ2h0CUNvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwgKGh0dHA6Ly93d3cuY29kZXBsZXguY29tL1BIUEV4Y2VsKQogKi8KY2xhc3MgUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zIHsKCgkvKiogY29uc3RhbnRzICovCgljb25zdCBDT01QQVRJQklMSVRZX0VYQ0VMCQk9ICdFeGNlbCc7Cgljb25zdCBDT01QQVRJQklMSVRZX0dOVU1FUklDCT0gJ0dudW1lcmljJzsKCWNvbnN0IENPTVBBVElCSUxJVFlfT1BFTk9GRklDRQk9ICdPcGVuT2ZmaWNlQ2FsYyc7CgoJY29uc3QgUkVUVVJOREFURV9QSFBfTlVNRVJJQwk9ICdQJzsKCWNvbnN0IFJFVFVSTkRBVEVfUEhQX09CSkVDVAkJPSAnTyc7Cgljb25zdCBSRVRVUk5EQVRFX0VYQ0VMCQkJPSAnRSc7CgoKCS8qKgoJICogQ29tcGF0aWJpbGl0eSBtb2RlIHRvIHVzZSBmb3IgZXJyb3IgY2hlY2tpbmcgYW5kIHJlc3BvbnNlcwoJICoKCSAqIEBhY2Nlc3MJcHJpdmF0ZQoJICogQHZhciBzdHJpbmcKCSAqLwoJcHJvdGVjdGVkIHN0YXRpYyAkY29tcGF0aWJpbGl0eU1vZGUJPSBzZWxmOjpDT01QQVRJQklMSVRZX0VYQ0VMOwoKCS8qKgoJICogRGF0YSBUeXBlIHRvIHVzZSB3aGVuIHJldHVybmluZyBkYXRlIHZhbHVlcwoJICoKCSAqIEBhY2Nlc3MJcHJpdmF0ZQoJICogQHZhciBzdHJpbmcKCSAqLwoJcHJvdGVjdGVkIHN0YXRpYyAkUmV0dXJuRGF0ZVR5cGUJPSBzZWxmOjpSRVRVUk5EQVRFX0VYQ0VMOwoKCS8qKgoJICogTGlzdCBvZiBlcnJvciBjb2RlcwoJICoKCSAqIEBhY2Nlc3MJcHJpdmF0ZQoJICogQHZhciBhcnJheQoJICovCglwcm90ZWN0ZWQgc3RhdGljICRfZXJyb3JDb2Rlcwk9IGFycmF5KCAnbnVsbCcJCQkJPT4gJyNOVUxMIScsCgkJCQkJCQkJCQkJICdkaXZpc2lvbmJ5emVybycJPT4gJyNESVYvMCEnLAoJCQkJCQkJCQkJCSAndmFsdWUnCQkJPT4gJyNWQUxVRSEnLAoJCQkJCQkJCQkJCSAncmVmZXJlbmNlJwkJPT4gJyNSRUYhJywKCQkJCQkJCQkJCQkgJ25hbWUnCQkJCT0+ICcjTkFNRT8nLAoJCQkJCQkJCQkJCSAnbnVtJwkJCQk9PiAnI05VTSEnLAoJCQkJCQkJCQkJCSAnbmEnCQkJCT0+ICcjTi9BJywKCQkJCQkJCQkJCQkgJ2dldHRpbmdkYXRhJwkJPT4gJyNHRVRUSU5HX0RBVEEnCgkJCQkJCQkJCQkgICApOwoKCgkvKioKCSAqIFNldCB0aGUgQ29tcGF0aWJpbGl0eSBNb2RlCgkgKgoJICogQGFjY2VzcwlwdWJsaWMKCSAqIEBjYXRlZ29yeSBGdW5jdGlvbiBDb25maWd1cmF0aW9uCgkgKiBAcGFyYW0JIHN0cmluZwkJJGNvbXBhdGliaWxpdHlNb2RlCQlDb21wYXRpYmlsaXR5IE1vZGUKCSAqCQkJCQkJCQkJCQkJUGVybWl0dGVkIHZhbHVlcyBhcmU6CgkgKgkJCQkJCQkJCQkJCQlQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OkNPTVBBVElCSUxJVFlfRVhDRUwJCQknRXhjZWwnCgkgKgkJCQkJCQkJCQkJCQlQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OkNPTVBBVElCSUxJVFlfR05VTUVSSUMJCSdHbnVtZXJpYycKCSAqCQkJCQkJCQkJCQkJCVBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6Q09NUEFUSUJJTElUWV9PUEVOT0ZGSUNFCSdPcGVuT2ZmaWNlQ2FsYycKCSAqIEByZXR1cm4JIGJvb2xlYW4JKFN1Y2Nlc3Mgb3IgRmFpbHVyZSkKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBzZXRDb21wYXRpYmlsaXR5TW9kZSgkY29tcGF0aWJpbGl0eU1vZGUpIHsKCQlpZiAoKCRjb21wYXRpYmlsaXR5TW9kZSA9PSBzZWxmOjpDT01QQVRJQklMSVRZX0VYQ0VMKSB8fAoJCQkoJGNvbXBhdGliaWxpdHlNb2RlID09IHNlbGY6OkNPTVBBVElCSUxJVFlfR05VTUVSSUMpIHx8CgkJCSgkY29tcGF0aWJpbGl0eU1vZGUgPT0gc2VsZjo6Q09NUEFUSUJJTElUWV9PUEVOT0ZGSUNFKSkgewoJCQlzZWxmOjokY29tcGF0aWJpbGl0eU1vZGUgPSAkY29tcGF0aWJpbGl0eU1vZGU7CgkJCXJldHVybiBUcnVlOwoJCX0KCQlyZXR1cm4gRmFsc2U7Cgl9CS8vCWZ1bmN0aW9uIHNldENvbXBhdGliaWxpdHlNb2RlKCkKCgoJLyoqCgkgKiBSZXR1cm4gdGhlIGN1cnJlbnQgQ29tcGF0aWJpbGl0eSBNb2RlCgkgKgoJICogQGFjY2VzcwlwdWJsaWMKCSAqIEBjYXRlZ29yeSBGdW5jdGlvbiBDb25maWd1cmF0aW9uCgkgKiBAcmV0dXJuCSBzdHJpbmcJCUNvbXBhdGliaWxpdHkgTW9kZQoJICoJCQkJCQkJUG9zc2libGUgUmV0dXJuIHZhbHVlcyBhcmU6CgkgKgkJCQkJCQkJUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpDT01QQVRJQklMSVRZX0VYQ0VMCQkJJ0V4Y2VsJwoJICoJCQkJCQkJCVBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6Q09NUEFUSUJJTElUWV9HTlVNRVJJQwkJJ0dudW1lcmljJwoJICoJCQkJCQkJCVBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6Q09NUEFUSUJJTElUWV9PUEVOT0ZGSUNFCSdPcGVuT2ZmaWNlQ2FsYycKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRDb21wYXRpYmlsaXR5TW9kZSgpIHsKCQlyZXR1cm4gc2VsZjo6JGNvbXBhdGliaWxpdHlNb2RlOwoJfQkvLwlmdW5jdGlvbiBnZXRDb21wYXRpYmlsaXR5TW9kZSgpCgoKCS8qKgoJICogU2V0IHRoZSBSZXR1cm4gRGF0ZSBGb3JtYXQgdXNlZCBieSBmdW5jdGlvbnMgdGhhdCByZXR1cm4gYSBkYXRlL3RpbWUgKEV4Y2VsLCBQSFAgU2VyaWFsaXplZCBOdW1lcmljIG9yIFBIUCBPYmplY3QpCgkgKgoJICogQGFjY2VzcwlwdWJsaWMKCSAqIEBjYXRlZ29yeSBGdW5jdGlvbiBDb25maWd1cmF0aW9uCgkgKiBAcGFyYW0JIHN0cmluZwkkcmV0dXJuRGF0ZVR5cGUJCQlSZXR1cm4gRGF0ZSBGb3JtYXQKCSAqCQkJCQkJCQkJCQkJUGVybWl0dGVkIHZhbHVlcyBhcmU6CgkgKgkJCQkJCQkJCQkJCQlQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OlJFVFVSTkRBVEVfUEhQX05VTUVSSUMJCSdQJwoJICoJCQkJCQkJCQkJCQkJUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpSRVRVUk5EQVRFX1BIUF9PQkpFQ1QJCSdPJwoJICoJCQkJCQkJCQkJCQkJUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpSRVRVUk5EQVRFX0VYQ0VMCQkJJ0UnCgkgKiBAcmV0dXJuCSBib29sZWFuCQkJCQkJCVN1Y2Nlc3Mgb3IgZmFpbHVyZQoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHNldFJldHVybkRhdGVUeXBlKCRyZXR1cm5EYXRlVHlwZSkgewoJCWlmICgoJHJldHVybkRhdGVUeXBlID09IHNlbGY6OlJFVFVSTkRBVEVfUEhQX05VTUVSSUMpIHx8CgkJCSgkcmV0dXJuRGF0ZVR5cGUgPT0gc2VsZjo6UkVUVVJOREFURV9QSFBfT0JKRUNUKSB8fAoJCQkoJHJldHVybkRhdGVUeXBlID09IHNlbGY6OlJFVFVSTkRBVEVfRVhDRUwpKSB7CgkJCXNlbGY6OiRSZXR1cm5EYXRlVHlwZSA9ICRyZXR1cm5EYXRlVHlwZTsKCQkJcmV0dXJuIFRydWU7CgkJfQoJCXJldHVybiBGYWxzZTsKCX0JLy8JZnVuY3Rpb24gc2V0UmV0dXJuRGF0ZVR5cGUoKQoKCgkvKioKCSAqIFJldHVybiB0aGUgY3VycmVudCBSZXR1cm4gRGF0ZSBGb3JtYXQgZm9yIGZ1bmN0aW9ucyB0aGF0IHJldHVybiBhIGRhdGUvdGltZSAoRXhjZWwsIFBIUCBTZXJpYWxpemVkIE51bWVyaWMgb3IgUEhQIE9iamVjdCkKCSAqCgkgKiBAYWNjZXNzCXB1YmxpYwoJICogQGNhdGVnb3J5IEZ1bmN0aW9uIENvbmZpZ3VyYXRpb24KCSAqIEByZXR1cm4JIHN0cmluZwkJUmV0dXJuIERhdGUgRm9ybWF0CgkgKgkJCQkJCQlQb3NzaWJsZSBSZXR1cm4gdmFsdWVzIGFyZToKCSAqCQkJCQkJCQlQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OlJFVFVSTkRBVEVfUEhQX05VTUVSSUMJCSdQJwoJICoJCQkJCQkJCVBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6UkVUVVJOREFURV9QSFBfT0JKRUNUCQknTycKCSAqCQkJCQkJCQlQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OlJFVFVSTkRBVEVfRVhDRUwJCQknRScKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRSZXR1cm5EYXRlVHlwZSgpIHsKCQlyZXR1cm4gc2VsZjo6JFJldHVybkRhdGVUeXBlOwoJfQkvLwlmdW5jdGlvbiBnZXRSZXR1cm5EYXRlVHlwZSgpCgoKCS8qKgoJICogRFVNTVkKCSAqCgkgKiBAYWNjZXNzCXB1YmxpYwoJICogQGNhdGVnb3J5IEVycm9yIFJldHVybnMKCSAqIEByZXR1cm4Jc3RyaW5nCSNOb3QgWWV0IEltcGxlbWVudGVkCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gRFVNTVkoKSB7CgkJcmV0dXJuICcjTm90IFlldCBJbXBsZW1lbnRlZCc7Cgl9CS8vCWZ1bmN0aW9uIERVTU1ZKCkKCgoJLyoqCgkgKiBESVYwCgkgKgoJICogQGFjY2VzcwlwdWJsaWMKCSAqIEBjYXRlZ29yeSBFcnJvciBSZXR1cm5zCgkgKiBAcmV0dXJuCXN0cmluZwkjTm90IFlldCBJbXBsZW1lbnRlZAoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIERJVjAoKSB7CgkJcmV0dXJuIHNlbGY6OiRfZXJyb3JDb2Rlc1snZGl2aXNpb25ieXplcm8nXTsKCX0JLy8JZnVuY3Rpb24gRElWMCgpCgoKCS8qKgoJICogTkEKCSAqCgkgKiBFeGNlbCBGdW5jdGlvbjoKCSAqCQk9TkEoKQoJICoKCSAqIFJldHVybnMgdGhlIGVycm9yIHZhbHVlICNOL0EKCSAqCQkjTi9BIGlzIHRoZSBlcnJvciB2YWx1ZSB0aGF0IG1lYW5zICJubyB2YWx1ZSBpcyBhdmFpbGFibGUuIgoJICoKCSAqIEBhY2Nlc3MJcHVibGljCgkgKiBAY2F0ZWdvcnkgTG9naWNhbCBGdW5jdGlvbnMKCSAqIEByZXR1cm4Jc3RyaW5nCSNOL0EhCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gTkEoKSB7CgkJcmV0dXJuIHNlbGY6OiRfZXJyb3JDb2Rlc1snbmEnXTsKCX0JLy8JZnVuY3Rpb24gTkEoKQoKCgkvKioKCSAqIE5hTgoJICoKCSAqIFJldHVybnMgdGhlIGVycm9yIHZhbHVlICNOVU0hCgkgKgoJICogQGFjY2VzcwlwdWJsaWMKCSAqIEBjYXRlZ29yeSBFcnJvciBSZXR1cm5zCgkgKiBAcmV0dXJuCXN0cmluZwkjTlVNIQoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIE5hTigpIHsKCQlyZXR1cm4gc2VsZjo6JF9lcnJvckNvZGVzWydudW0nXTsKCX0JLy8JZnVuY3Rpb24gTmFOKCkKCgoJLyoqCgkgKiBOQU1FCgkgKgoJICogUmV0dXJucyB0aGUgZXJyb3IgdmFsdWUgI05BTUU/CgkgKgoJICogQGFjY2VzcwlwdWJsaWMKCSAqIEBjYXRlZ29yeSBFcnJvciBSZXR1cm5zCgkgKiBAcmV0dXJuCXN0cmluZwkjTkFNRT8KCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBOQU1FKCkgewoJCXJldHVybiBzZWxmOjokX2Vycm9yQ29kZXNbJ25hbWUnXTsKCX0JLy8JZnVuY3Rpb24gTkFNRSgpCgoKCS8qKgoJICogUkVGCgkgKgoJICogUmV0dXJucyB0aGUgZXJyb3IgdmFsdWUgI1JFRiEKCSAqCgkgKiBAYWNjZXNzCXB1YmxpYwoJICogQGNhdGVnb3J5IEVycm9yIFJldHVybnMKCSAqIEByZXR1cm4Jc3RyaW5nCSNSRUYhCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gUkVGKCkgewoJCXJldHVybiBzZWxmOjokX2Vycm9yQ29kZXNbJ3JlZmVyZW5jZSddOwoJfQkvLwlmdW5jdGlvbiBSRUYoKQoKCgkvKioKCSAqIE5VTEwKCSAqCgkgKiBSZXR1cm5zIHRoZSBlcnJvciB2YWx1ZSAjTlVMTCEKCSAqCgkgKiBAYWNjZXNzCXB1YmxpYwoJICogQGNhdGVnb3J5IEVycm9yIFJldHVybnMKCSAqIEByZXR1cm4Jc3RyaW5nCSNSRUYhCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gTlVMTCgpIHsKCQlyZXR1cm4gc2VsZjo6JF9lcnJvckNvZGVzWydudWxsJ107Cgl9CS8vCWZ1bmN0aW9uIE5VTEwoKQoKCgkvKioKCSAqIFZBTFVFCgkgKgoJICogUmV0dXJucyB0aGUgZXJyb3IgdmFsdWUgI1ZBTFVFIQoJICoKCSAqIEBhY2Nlc3MJcHVibGljCgkgKiBAY2F0ZWdvcnkgRXJyb3IgUmV0dXJucwoJICogQHJldHVybglzdHJpbmcJI1ZBTFVFIQoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIFZBTFVFKCkgewoJCXJldHVybiBzZWxmOjokX2Vycm9yQ29kZXNbJ3ZhbHVlJ107Cgl9CS8vCWZ1bmN0aW9uIFZBTFVFKCkKCgoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBpc01hdHJpeFZhbHVlKCRpZHgpIHsKCQlyZXR1cm4gKChzdWJzdHJfY291bnQoJGlkeCwnLicpIDw9IDEpIHx8IChwcmVnX21hdGNoKCcvXC5bQS1aXS8nLCRpZHgpID4gMCkpOwoJfQoKCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGlzVmFsdWUoJGlkeCkgewoJCXJldHVybiAoc3Vic3RyX2NvdW50KCRpZHgsJy4nKSA9PSAwKTsKCX0KCgoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBpc0NlbGxWYWx1ZSgkaWR4KSB7CgkJcmV0dXJuIChzdWJzdHJfY291bnQoJGlkeCwnLicpID4gMSk7Cgl9CgoKCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gX2lmQ29uZGl0aW9uKCRjb25kaXRpb24pIHsKCQkkY29uZGl0aW9uCT0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuU2luZ2xlVmFsdWUoJGNvbmRpdGlvbik7CgkJaWYgKCFpbl9hcnJheSgkY29uZGl0aW9uezB9LGFycmF5KCc+JywgJzwnLCAnPScpKSkgewoJCQlpZiAoIWlzX251bWVyaWMoJGNvbmRpdGlvbikpIHsgJGNvbmRpdGlvbiA9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uOjpfd3JhcFJlc3VsdChzdHJ0b3VwcGVyKCRjb25kaXRpb24pKTsgfQoJCQlyZXR1cm4gJz0nLiRjb25kaXRpb247CgkJfSBlbHNlIHsKCQkJcHJlZ19tYXRjaCgnLyhbPD49XSspKC4qKS8nLCRjb25kaXRpb24sJG1hdGNoZXMpOwoJCQlsaXN0KCwkb3BlcmF0b3IsJG9wZXJhbmQpID0gJG1hdGNoZXM7CgkJCWlmICghaXNfbnVtZXJpYygkb3BlcmFuZCkpIHsgJG9wZXJhbmQgPSBQSFBFeGNlbF9DYWxjdWxhdGlvbjo6X3dyYXBSZXN1bHQoc3RydG91cHBlcigkb3BlcmFuZCkpOyB9CgkJCXJldHVybiAkb3BlcmF0b3IuJG9wZXJhbmQ7CgkJfQoJfQkvLwlmdW5jdGlvbiBfaWZDb25kaXRpb24oKQoKCgkvKioKCSAqIEVSUk9SX1RZUEUKCSAqCgkgKiBAcGFyYW0JbWl4ZWQJJHZhbHVlCVZhbHVlIHRvIGNoZWNrCgkgKiBAcmV0dXJuCWJvb2xlYW4KCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBFUlJPUl9UWVBFKCR2YWx1ZSA9ICcnKSB7CgkJJHZhbHVlCT0gc2VsZjo6ZmxhdHRlblNpbmdsZVZhbHVlKCR2YWx1ZSk7CgoJCSRpID0gMTsKCQlmb3JlYWNoKHNlbGY6OiRfZXJyb3JDb2RlcyBhcyAkZXJyb3JDb2RlKSB7CgkJCWlmICgkdmFsdWUgPT09ICRlcnJvckNvZGUpIHsKCQkJCXJldHVybiAkaTsKCQkJfQoJCQkrKyRpOwoJCX0KCQlyZXR1cm4gc2VsZjo6TkEoKTsKCX0JLy8JZnVuY3Rpb24gRVJST1JfVFlQRSgpCgoKCS8qKgoJICogSVNfQkxBTksKCSAqCgkgKiBAcGFyYW0JbWl4ZWQJJHZhbHVlCVZhbHVlIHRvIGNoZWNrCgkgKiBAcmV0dXJuCWJvb2xlYW4KCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBJU19CTEFOSygkdmFsdWUgPSBOVUxMKSB7CgkJaWYgKCFpc19udWxsKCR2YWx1ZSkpIHsKCQkJJHZhbHVlCT0gc2VsZjo6ZmxhdHRlblNpbmdsZVZhbHVlKCR2YWx1ZSk7CgkJfQoKCQlyZXR1cm4gaXNfbnVsbCgkdmFsdWUpOwoJfQkvLwlmdW5jdGlvbiBJU19CTEFOSygpCgoKCS8qKgoJICogSVNfRVJSCgkgKgoJICogQHBhcmFtCW1peGVkCSR2YWx1ZQlWYWx1ZSB0byBjaGVjawoJICogQHJldHVybglib29sZWFuCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gSVNfRVJSKCR2YWx1ZSA9ICcnKSB7CgkJJHZhbHVlCQk9IHNlbGY6OmZsYXR0ZW5TaW5nbGVWYWx1ZSgkdmFsdWUpOwoKCQlyZXR1cm4gc2VsZjo6SVNfRVJST1IoJHZhbHVlKSAmJiAoIXNlbGY6OklTX05BKCR2YWx1ZSkpOwoJfQkvLwlmdW5jdGlvbiBJU19FUlIoKQoKCgkvKioKCSAqIElTX0VSUk9SCgkgKgoJICogQHBhcmFtCW1peGVkCSR2YWx1ZQlWYWx1ZSB0byBjaGVjawoJICogQHJldHVybglib29sZWFuCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gSVNfRVJST1IoJHZhbHVlID0gJycpIHsKCQkkdmFsdWUJCT0gc2VsZjo6ZmxhdHRlblNpbmdsZVZhbHVlKCR2YWx1ZSk7CgoJCWlmICghaXNfc3RyaW5nKCR2YWx1ZSkpCgkJCXJldHVybiBmYWxzZTsKCQlyZXR1cm4gaW5fYXJyYXkoJHZhbHVlLCBhcnJheV92YWx1ZXMoc2VsZjo6JF9lcnJvckNvZGVzKSk7Cgl9CS8vCWZ1bmN0aW9uIElTX0VSUk9SKCkKCgoJLyoqCgkgKiBJU19OQQoJICoKCSAqIEBwYXJhbQltaXhlZAkkdmFsdWUJVmFsdWUgdG8gY2hlY2sKCSAqIEByZXR1cm4JYm9vbGVhbgoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIElTX05BKCR2YWx1ZSA9ICcnKSB7CgkJJHZhbHVlCQk9IHNlbGY6OmZsYXR0ZW5TaW5nbGVWYWx1ZSgkdmFsdWUpOwoKCQlyZXR1cm4gKCR2YWx1ZSA9PT0gc2VsZjo6TkEoKSk7Cgl9CS8vCWZ1bmN0aW9uIElTX05BKCkKCgoJLyoqCgkgKiBJU19FVkVOCgkgKgoJICogQHBhcmFtCW1peGVkCSR2YWx1ZQlWYWx1ZSB0byBjaGVjawoJICogQHJldHVybglib29sZWFuCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gSVNfRVZFTigkdmFsdWUgPSBOVUxMKSB7CgkJJHZhbHVlID0gc2VsZjo6ZmxhdHRlblNpbmdsZVZhbHVlKCR2YWx1ZSk7CgoJCWlmICgkdmFsdWUgPT09IE5VTEwpCgkJCXJldHVybiBzZWxmOjpOQU1FKCk7CgkJaWYgKChpc19ib29sKCR2YWx1ZSkpIHx8ICgoaXNfc3RyaW5nKCR2YWx1ZSkpICYmICghaXNfbnVtZXJpYygkdmFsdWUpKSkpCgkJCXJldHVybiBzZWxmOjpWQUxVRSgpOwoJCXJldHVybiAoJHZhbHVlICUgMiA9PSAwKTsKCX0JLy8JZnVuY3Rpb24gSVNfRVZFTigpCgoKCS8qKgoJICogSVNfT0RECgkgKgoJICogQHBhcmFtCW1peGVkCSR2YWx1ZQlWYWx1ZSB0byBjaGVjawoJICogQHJldHVybglib29sZWFuCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gSVNfT0REKCR2YWx1ZSA9IE5VTEwpIHsKCQkkdmFsdWUgPSBzZWxmOjpmbGF0dGVuU2luZ2xlVmFsdWUoJHZhbHVlKTsKCgkJaWYgKCR2YWx1ZSA9PT0gTlVMTCkKCQkJcmV0dXJuIHNlbGY6Ok5BTUUoKTsKCQlpZiAoKGlzX2Jvb2woJHZhbHVlKSkgfHwgKChpc19zdHJpbmcoJHZhbHVlKSkgJiYgKCFpc19udW1lcmljKCR2YWx1ZSkpKSkKCQkJcmV0dXJuIHNlbGY6OlZBTFVFKCk7CgkJcmV0dXJuIChhYnMoJHZhbHVlKSAlIDIgPT0gMSk7Cgl9CS8vCWZ1bmN0aW9uIElTX09ERCgpCgoKCS8qKgoJICogSVNfTlVNQkVSCgkgKgoJICogQHBhcmFtCW1peGVkCSR2YWx1ZQkJVmFsdWUgdG8gY2hlY2sKCSAqIEByZXR1cm4JYm9vbGVhbgoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIElTX05VTUJFUigkdmFsdWUgPSBOVUxMKSB7CgkJJHZhbHVlCQk9IHNlbGY6OmZsYXR0ZW5TaW5nbGVWYWx1ZSgkdmFsdWUpOwoKCQlpZiAoaXNfc3RyaW5nKCR2YWx1ZSkpIHsKCQkJcmV0dXJuIEZhbHNlOwoJCX0KCQlyZXR1cm4gaXNfbnVtZXJpYygkdmFsdWUpOwoJfQkvLwlmdW5jdGlvbiBJU19OVU1CRVIoKQoKCgkvKioKCSAqIElTX0xPR0lDQUwKCSAqCgkgKiBAcGFyYW0JbWl4ZWQJJHZhbHVlCQlWYWx1ZSB0byBjaGVjawoJICogQHJldHVybglib29sZWFuCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gSVNfTE9HSUNBTCgkdmFsdWUgPSBOVUxMKSB7CgkJJHZhbHVlCQk9IHNlbGY6OmZsYXR0ZW5TaW5nbGVWYWx1ZSgkdmFsdWUpOwoKCQlyZXR1cm4gaXNfYm9vbCgkdmFsdWUpOwoJfQkvLwlmdW5jdGlvbiBJU19MT0dJQ0FMKCkKCgoJLyoqCgkgKiBJU19URVhUCgkgKgoJICogQHBhcmFtCW1peGVkCSR2YWx1ZQkJVmFsdWUgdG8gY2hlY2sKCSAqIEByZXR1cm4JYm9vbGVhbgoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIElTX1RFWFQoJHZhbHVlID0gTlVMTCkgewoJCSR2YWx1ZQkJPSBzZWxmOjpmbGF0dGVuU2luZ2xlVmFsdWUoJHZhbHVlKTsKCgkJcmV0dXJuIChpc19zdHJpbmcoJHZhbHVlKSAmJiAhc2VsZjo6SVNfRVJST1IoJHZhbHVlKSk7Cgl9CS8vCWZ1bmN0aW9uIElTX1RFWFQoKQoKCgkvKioKCSAqIElTX05PTlRFWFQKCSAqCgkgKiBAcGFyYW0JbWl4ZWQJJHZhbHVlCQlWYWx1ZSB0byBjaGVjawoJICogQHJldHVybglib29sZWFuCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gSVNfTk9OVEVYVCgkdmFsdWUgPSBOVUxMKSB7CgkJcmV0dXJuICFzZWxmOjpJU19URVhUKCR2YWx1ZSk7Cgl9CS8vCWZ1bmN0aW9uIElTX05PTlRFWFQoKQoKCgkvKioKCSAqIFZFUlNJT04KCSAqCgkgKiBAcmV0dXJuCXN0cmluZwlWZXJzaW9uIGluZm9ybWF0aW9uCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gVkVSU0lPTigpIHsKCQlyZXR1cm4gJ1BIUEV4Y2VsIDEuNy43LCAyMDEyLTA1LTE5JzsKCX0JLy8JZnVuY3Rpb24gVkVSU0lPTigpCgoKCS8qKgoJICogTgoJICoKCSAqIFJldHVybnMgYSB2YWx1ZSBjb252ZXJ0ZWQgdG8gYSBudW1iZXIKCSAqCgkgKiBAcGFyYW0JdmFsdWUJCVRoZSB2YWx1ZSB5b3Ugd2FudCBjb252ZXJ0ZWQKCSAqIEByZXR1cm4JbnVtYmVyCQlOIGNvbnZlcnRzIHZhbHVlcyBsaXN0ZWQgaW4gdGhlIGZvbGxvd2luZyB0YWJsZQoJICoJCUlmIHZhbHVlIGlzIG9yIHJlZmVycyB0byBOIHJldHVybnMKCSAqCQlBIG51bWJlcgkJCVRoYXQgbnVtYmVyCgkgKgkJQSBkYXRlCQkJCVRoZSBzZXJpYWwgbnVtYmVyIG9mIHRoYXQgZGF0ZQoJICoJCVRSVUUJCQkJMQoJICoJCUZBTFNFCQkJCTAKCSAqCQlBbiBlcnJvciB2YWx1ZQkJVGhlIGVycm9yIHZhbHVlCgkgKgkJQW55dGhpbmcgZWxzZQkJMAoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIE4oJHZhbHVlID0gTlVMTCkgewoJCXdoaWxlIChpc19hcnJheSgkdmFsdWUpKSB7CgkJCSR2YWx1ZSA9IGFycmF5X3NoaWZ0KCR2YWx1ZSk7CgkJfQoKCQlzd2l0Y2ggKGdldHR5cGUoJHZhbHVlKSkgewoJCQljYXNlICdkb3VibGUnCToKCQkJY2FzZSAnZmxvYXQnCToKCQkJY2FzZSAnaW50ZWdlcicJOgoJCQkJcmV0dXJuICR2YWx1ZTsKCQkJCWJyZWFrOwoJCQljYXNlICdib29sZWFuJwk6CgkJCQlyZXR1cm4gKGludGVnZXIpICR2YWx1ZTsKCQkJCWJyZWFrOwoJCQljYXNlICdzdHJpbmcnCToKCQkJCS8vCUVycm9ycwoJCQkJaWYgKChzdHJsZW4oJHZhbHVlKSA+IDApICYmICgkdmFsdWV7MH0gPT0gJyMnKSkgewoJCQkJCXJldHVybiAkdmFsdWU7CgkJCQl9CgkJCQlicmVhazsKCQl9CgkJcmV0dXJuIDA7Cgl9CS8vCWZ1bmN0aW9uIE4oKQoKCgkvKioKCSAqIFRZUEUKCSAqCgkgKiBSZXR1cm5zIGEgbnVtYmVyIHRoYXQgaWRlbnRpZmllcyB0aGUgdHlwZSBvZiBhIHZhbHVlCgkgKgoJICogQHBhcmFtCXZhbHVlCQlUaGUgdmFsdWUgeW91IHdhbnQgdGVzdGVkCgkgKiBAcmV0dXJuCW51bWJlcgkJTiBjb252ZXJ0cyB2YWx1ZXMgbGlzdGVkIGluIHRoZSBmb2xsb3dpbmcgdGFibGUKCSAqCQlJZiB2YWx1ZSBpcyBvciByZWZlcnMgdG8gTiByZXR1cm5zCgkgKgkJQSBudW1iZXIJCQkxCgkgKgkJVGV4dAkJCQkyCgkgKgkJTG9naWNhbCBWYWx1ZQkJNAoJICoJCUFuIGVycm9yIHZhbHVlCQkxNgoJICoJCUFycmF5IG9yIE1hdHJpeAkJNjQKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBUWVBFKCR2YWx1ZSA9IE5VTEwpIHsKCQkkdmFsdWUJPSBzZWxmOjpmbGF0dGVuQXJyYXlJbmRleGVkKCR2YWx1ZSk7CgkJaWYgKGlzX2FycmF5KCR2YWx1ZSkgJiYgKGNvdW50KCR2YWx1ZSkgPiAxKSkgewoJCQkkYSA9IGFycmF5X2tleXMoJHZhbHVlKTsKCQkJJGEgPSBhcnJheV9wb3AoJGEpOwoJCQkvLwlSYW5nZSBvZiBjZWxscyBpcyBhbiBlcnJvcgoJCQlpZiAoc2VsZjo6aXNDZWxsVmFsdWUoJGEpKSB7CgkJCQlyZXR1cm4gMTY7CgkJCS8vCVRlc3QgZm9yIE1hdHJpeAoJCQl9IGVsc2VpZiAoc2VsZjo6aXNNYXRyaXhWYWx1ZSgkYSkpIHsKCQkJCXJldHVybiA2NDsKCQkJfQoJCX0gZWxzZWlmKGVtcHR5KCR2YWx1ZSkpIHsKCQkJLy8JRW1wdHkgQ2VsbAoJCQlyZXR1cm4gMTsKCQl9CgkJJHZhbHVlCT0gc2VsZjo6ZmxhdHRlblNpbmdsZVZhbHVlKCR2YWx1ZSk7CgoJCWlmICgoJHZhbHVlID09PSBOVUxMKSB8fCAoaXNfZmxvYXQoJHZhbHVlKSkgfHwgKGlzX2ludCgkdmFsdWUpKSkgewoJCQkJcmV0dXJuIDE7CgkJfSBlbHNlaWYoaXNfYm9vbCgkdmFsdWUpKSB7CgkJCQlyZXR1cm4gNDsKCQl9IGVsc2VpZihpc19hcnJheSgkdmFsdWUpKSB7CgkJCQlyZXR1cm4gNjQ7CgkJCQlicmVhazsKCQl9IGVsc2VpZihpc19zdHJpbmcoJHZhbHVlKSkgewoJCQkvLwlFcnJvcnMKCQkJaWYgKChzdHJsZW4oJHZhbHVlKSA+IDApICYmICgkdmFsdWV7MH0gPT0gJyMnKSkgewoJCQkJcmV0dXJuIDE2OwoJCQl9CgkJCXJldHVybiAyOwoJCX0KCQlyZXR1cm4gMDsKCX0JLy8JZnVuY3Rpb24gVFlQRSgpCgoKCS8qKgoJICogQ29udmVydCBhIG11bHRpLWRpbWVuc2lvbmFsIGFycmF5IHRvIGEgc2ltcGxlIDEtZGltZW5zaW9uYWwgYXJyYXkKCSAqCgkgKiBAcGFyYW0JYXJyYXkJJGFycmF5CUFycmF5IHRvIGJlIGZsYXR0ZW5lZAoJICogQHJldHVybglhcnJheQlGbGF0dGVuZWQgYXJyYXkKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBmbGF0dGVuQXJyYXkoJGFycmF5KSB7CgkJaWYgKCFpc19hcnJheSgkYXJyYXkpKSB7CgkJCXJldHVybiAoYXJyYXkpICRhcnJheTsKCQl9CgoJCSRhcnJheVZhbHVlcyA9IGFycmF5KCk7CgkJZm9yZWFjaCAoJGFycmF5IGFzICR2YWx1ZSkgewoJCQlpZiAoaXNfYXJyYXkoJHZhbHVlKSkgewoJCQkJZm9yZWFjaCAoJHZhbHVlIGFzICR2YWwpIHsKCQkJCQlpZiAoaXNfYXJyYXkoJHZhbCkpIHsKCQkJCQkJZm9yZWFjaCAoJHZhbCBhcyAkdikgewoJCQkJCQkJJGFycmF5VmFsdWVzW10gPSAkdjsKCQkJCQkJfQoJCQkJCX0gZWxzZSB7CgkJCQkJCSRhcnJheVZhbHVlc1tdID0gJHZhbDsKCQkJCQl9CgkJCQl9CgkJCX0gZWxzZSB7CgkJCQkkYXJyYXlWYWx1ZXNbXSA9ICR2YWx1ZTsKCQkJfQoJCX0KCgkJcmV0dXJuICRhcnJheVZhbHVlczsKCX0JLy8JZnVuY3Rpb24gZmxhdHRlbkFycmF5KCkKCgoJLyoqCgkgKiBDb252ZXJ0IGEgbXVsdGktZGltZW5zaW9uYWwgYXJyYXkgdG8gYSBzaW1wbGUgMS1kaW1lbnNpb25hbCBhcnJheSwgYnV0IHJldGFpbiBhbiBlbGVtZW50IG9mIGluZGV4aW5nCgkgKgoJICogQHBhcmFtCWFycmF5CSRhcnJheQlBcnJheSB0byBiZSBmbGF0dGVuZWQKCSAqIEByZXR1cm4JYXJyYXkJRmxhdHRlbmVkIGFycmF5CgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZmxhdHRlbkFycmF5SW5kZXhlZCgkYXJyYXkpIHsKCQlpZiAoIWlzX2FycmF5KCRhcnJheSkpIHsKCQkJcmV0dXJuIChhcnJheSkgJGFycmF5OwoJCX0KCgkJJGFycmF5VmFsdWVzID0gYXJyYXkoKTsKCQlmb3JlYWNoICgkYXJyYXkgYXMgJGsxID0+ICR2YWx1ZSkgewoJCQlpZiAoaXNfYXJyYXkoJHZhbHVlKSkgewoJCQkJZm9yZWFjaCAoJHZhbHVlIGFzICRrMiA9PiAkdmFsKSB7CgkJCQkJaWYgKGlzX2FycmF5KCR2YWwpKSB7CgkJCQkJCWZvcmVhY2ggKCR2YWwgYXMgJGszID0+ICR2KSB7CgkJCQkJCQkkYXJyYXlWYWx1ZXNbJGsxLicuJy4kazIuJy4nLiRrM10gPSAkdjsKCQkJCQkJfQoJCQkJCX0gZWxzZSB7CgkJCQkJCSRhcnJheVZhbHVlc1skazEuJy4nLiRrMl0gPSAkdmFsOwoJCQkJCX0KCQkJCX0KCQkJfSBlbHNlIHsKCQkJCSRhcnJheVZhbHVlc1skazFdID0gJHZhbHVlOwoJCQl9CgkJfQoKCQlyZXR1cm4gJGFycmF5VmFsdWVzOwoJfQkvLwlmdW5jdGlvbiBmbGF0dGVuQXJyYXlJbmRleGVkKCkKCgoJLyoqCgkgKiBDb252ZXJ0IGFuIGFycmF5IHRvIGEgc2luZ2xlIHNjYWxhciB2YWx1ZSBieSBleHRyYWN0aW5nIHRoZSBmaXJzdCBlbGVtZW50CgkgKgoJICogQHBhcmFtCW1peGVkCQkkdmFsdWUJCUFycmF5IG9yIHNjYWxhciB2YWx1ZQoJICogQHJldHVybgltaXhlZAoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGZsYXR0ZW5TaW5nbGVWYWx1ZSgkdmFsdWUgPSAnJykgewoJCXdoaWxlIChpc19hcnJheSgkdmFsdWUpKSB7CgkJCSR2YWx1ZSA9IGFycmF5X3BvcCgkdmFsdWUpOwoJCX0KCgkJcmV0dXJuICR2YWx1ZTsKCX0JLy8JZnVuY3Rpb24gZmxhdHRlblNpbmdsZVZhbHVlKCkKCn0JLy8JY2xhc3MgUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zCgoKLy8KLy8JVGhlcmUgYXJlIGEgZmV3IG1hdGhlbWF0aWNhbCBmdW5jdGlvbnMgdGhhdCBhcmVuJ3QgYXZhaWxhYmxlIG9uIGFsbCB2ZXJzaW9ucyBvZiBQSFAgZm9yIGFsbCBwbGF0Zm9ybXMKLy8JVGhlc2UgZnVuY3Rpb25zIGFyZW4ndCBhdmFpbGFibGUgaW4gV2luZG93cyBpbXBsZW1lbnRhdGlvbnMgb2YgUEhQIHByaW9yIHRvIHZlcnNpb24gNS4zLjAKLy8JU28gd2UgdGVzdCBpZiB0aGV5IGRvIGV4aXN0IGZvciB0aGlzIHZlcnNpb24gb2YgUEhQL29wZXJhdGluZyBwbGF0Zm9ybTsgYW5kIGlmIG5vdCB3ZSBjcmVhdGUgdGhlbQovLwppZiAoIWZ1bmN0aW9uX2V4aXN0cygnYWNvc2gnKSkgewoJZnVuY3Rpb24gYWNvc2goJHgpIHsKCQlyZXR1cm4gMiAqIGxvZyhzcXJ0KCgkeCArIDEpIC8gMikgKyBzcXJ0KCgkeCAtIDEpIC8gMikpOwoJfQkvLwlmdW5jdGlvbiBhY29zaCgpCn0KCmlmICghZnVuY3Rpb25fZXhpc3RzKCdhc2luaCcpKSB7CglmdW5jdGlvbiBhc2luaCgkeCkgewoJCXJldHVybiBsb2coJHggKyBzcXJ0KDEgKyAkeCAqICR4KSk7Cgl9CS8vCWZ1bmN0aW9uIGFzaW5oKCkKfQoKaWYgKCFmdW5jdGlvbl9leGlzdHMoJ2F0YW5oJykpIHsKCWZ1bmN0aW9uIGF0YW5oKCR4KSB7CgkJcmV0dXJuIChsb2coMSArICR4KSAtIGxvZygxIC0gJHgpKSAvIDI7Cgl9CS8vCWZ1bmN0aW9uIGF0YW5oKCkKfQoKaWYgKCFmdW5jdGlvbl9leGlzdHMoJ21vbmV5X2Zvcm1hdCcpKSB7CglmdW5jdGlvbiBtb25leV9mb3JtYXQoJGZvcm1hdCwgJG51bWJlcikgewoJCSRyZWdleCA9IGFycmF5KCAnLyUoKD86W1xeIVwtXXxcK3xcKHxcPS4pKikoWzAtOV0rKT8oPzojKFswLTldKykpPycsCgkJCQkJCSAnKD86XC4oWzAtOV0rKSk/KFtpbiVdKS8nCgkJCQkJICApOwoJCSRyZWdleCA9IGltcGxvZGUoJycsICRyZWdleCk7CgkJaWYgKHNldGxvY2FsZShMQ19NT05FVEFSWSwgbnVsbCkgPT0gJycpIHsKCQkJc2V0bG9jYWxlKExDX01PTkVUQVJZLCAnJyk7CgkJfQoJCSRsb2NhbGUgPSBsb2NhbGVjb252KCk7CgkJJG51bWJlciA9IGZsb2F0dmFsKCRudW1iZXIpOwoJCWlmICghcHJlZ19tYXRjaCgkcmVnZXgsICRmb3JtYXQsICRmbWF0Y2gpKSB7CgkJCXRyaWdnZXJfZXJyb3IoIk5vIGZvcm1hdCBzcGVjaWZpZWQgb3IgaW52YWxpZCBmb3JtYXQiLCBFX1VTRVJfV0FSTklORyk7CgkJCXJldHVybiAkbnVtYmVyOwoJCX0KCQkkZmxhZ3MgPSBhcnJheSggJ2ZpbGxjaGFyJwk9PiBwcmVnX21hdGNoKCcvXD0oLikvJywgJGZtYXRjaFsxXSwgJG1hdGNoKSA/ICRtYXRjaFsxXSA6ICcgJywKCQkJCQkJJ25vZ3JvdXAnCT0+IHByZWdfbWF0Y2goJy9cXi8nLCAkZm1hdGNoWzFdKSA+IDAsCgkJCQkJCSd1c2VzaWduYWwnCT0+IHByZWdfbWF0Y2goJy9cK3xcKC8nLCAkZm1hdGNoWzFdLCAkbWF0Y2gpID8gJG1hdGNoWzBdIDogJysnLAoJCQkJCQknbm9zaW1ib2wnCT0+IHByZWdfbWF0Y2goJy9cIS8nLCAkZm1hdGNoWzFdKSA+IDAsCgkJCQkJCSdpc2xlZnQnCT0+IHByZWdfbWF0Y2goJy9cLS8nLCAkZm1hdGNoWzFdKSA+IDAKCQkJCQkgICk7CgkJJHdpZHRoCT0gdHJpbSgkZm1hdGNoWzJdKSA/IChpbnQpJGZtYXRjaFsyXSA6IDA7CgkJJGxlZnQJPSB0cmltKCRmbWF0Y2hbM10pID8gKGludCkkZm1hdGNoWzNdIDogMDsKCQkkcmlnaHQJPSB0cmltKCRmbWF0Y2hbNF0pID8gKGludCkkZm1hdGNoWzRdIDogJGxvY2FsZVsnaW50X2ZyYWNfZGlnaXRzJ107CgkJJGNvbnZlcnNpb24gPSAkZm1hdGNoWzVdOwoJCSRwb3NpdGl2ZSA9IHRydWU7CgkJaWYgKCRudW1iZXIgPCAwKSB7CgkJCSRwb3NpdGl2ZSA9IGZhbHNlOwoJCQkkbnVtYmVyICo9IC0xOwoJCX0KCQkkbGV0dGVyID0gJHBvc2l0aXZlID8gJ3AnIDogJ24nOwoJCSRwcmVmaXggPSAkc3VmZml4ID0gJGNwcmVmaXggPSAkY3N1ZmZpeCA9ICRzaWduYWwgPSAnJzsKCQlpZiAoISRwb3NpdGl2ZSkgewoJCQkkc2lnbmFsID0gJGxvY2FsZVsnbmVnYXRpdmVfc2lnbiddOwoJCQlzd2l0Y2ggKHRydWUpIHsKCQkJCWNhc2UgJGxvY2FsZVsnbl9zaWduX3Bvc24nXSA9PSAwIHx8ICRmbGFnc1sndXNlc2lnbmFsJ10gPT0gJygnOgoJCQkJCSRwcmVmaXggPSAnKCc7CgkJCQkJJHN1ZmZpeCA9ICcpJzsKCQkJCQlicmVhazsKCQkJCWNhc2UgJGxvY2FsZVsnbl9zaWduX3Bvc24nXSA9PSAxOgoJCQkJCSRwcmVmaXggPSAkc2lnbmFsOwoJCQkJCWJyZWFrOwoJCQkJY2FzZSAkbG9jYWxlWyduX3NpZ25fcG9zbiddID09IDI6CgkJCQkJJHN1ZmZpeCA9ICRzaWduYWw7CgkJCQkJYnJlYWs7CgkJCQljYXNlICRsb2NhbGVbJ25fc2lnbl9wb3NuJ10gPT0gMzoKCQkJCQkkY3ByZWZpeCA9ICRzaWduYWw7CgkJCQkJYnJlYWs7CgkJCQljYXNlICRsb2NhbGVbJ25fc2lnbl9wb3NuJ10gPT0gNDoKCQkJCQkkY3N1ZmZpeCA9ICRzaWduYWw7CgkJCQkJYnJlYWs7CgkJCX0KCQl9CgkJaWYgKCEkZmxhZ3NbJ25vc2ltYm9sJ10pIHsKCQkJJGN1cnJlbmN5ID0gJGNwcmVmaXg7CgkJCSRjdXJyZW5jeSAuPSAoJGNvbnZlcnNpb24gPT0gJ2knID8gJGxvY2FsZVsnaW50X2N1cnJfc3ltYm9sJ10gOiAkbG9jYWxlWydjdXJyZW5jeV9zeW1ib2wnXSk7CgkJCSRjdXJyZW5jeSAuPSAkY3N1ZmZpeDsKCQkJJGN1cnJlbmN5ID0gaWNvbnYoJ0lTTy04ODU5LTEnLCdVVEYtOCcsJGN1cnJlbmN5KTsKCQl9IGVsc2UgewoJCQkkY3VycmVuY3kgPSAnJzsKCQl9CgkJJHNwYWNlID0gJGxvY2FsZVsieyRsZXR0ZXJ9X3NlcF9ieV9zcGFjZSJdID8gJyAnIDogJyc7CgoJCWlmICghaXNzZXQoJGxvY2FsZVsnbW9uX2RlY2ltYWxfcG9pbnQnXSkgfHwgZW1wdHkoJGxvY2FsZVsnbW9uX2RlY2ltYWxfcG9pbnQnXSkpIHsKCQkJJGxvY2FsZVsnbW9uX2RlY2ltYWxfcG9pbnQnXSA9ICghaXNzZXQoJGxvY2FsZVsnZGVjaW1hbF9wb2ludCddKSB8fCBlbXB0eSgkbG9jYWxlWydkZWNpbWFsX3BvaW50J10pKSA/CgkJCQkJCQkJCQkJJGxvY2FsZVsnZGVjaW1hbF9wb2ludCddIDoKCQkJCQkJCQkJCQknLic7CgkJfQoKCQkkbnVtYmVyID0gbnVtYmVyX2Zvcm1hdCgkbnVtYmVyLCAkcmlnaHQsICRsb2NhbGVbJ21vbl9kZWNpbWFsX3BvaW50J10sICRmbGFnc1snbm9ncm91cCddID8gJycgOiAkbG9jYWxlWydtb25fdGhvdXNhbmRzX3NlcCddICk7CgkJJG51bWJlciA9IGV4cGxvZGUoJGxvY2FsZVsnbW9uX2RlY2ltYWxfcG9pbnQnXSwgJG51bWJlcik7CgoJCSRuID0gc3RybGVuKCRwcmVmaXgpICsgc3RybGVuKCRjdXJyZW5jeSk7CgkJaWYgKCRsZWZ0ID4gMCAmJiAkbGVmdCA+ICRuKSB7CgkJCWlmICgkZmxhZ3NbJ2lzbGVmdCddKSB7CgkJCQkkbnVtYmVyWzBdIC49IHN0cl9yZXBlYXQoJGZsYWdzWydmaWxsY2hhciddLCAkbGVmdCAtICRuKTsKCQkJfSBlbHNlIHsKCQkJCSRudW1iZXJbMF0gPSBzdHJfcmVwZWF0KCRmbGFnc1snZmlsbGNoYXInXSwgJGxlZnQgLSAkbikgLiAkbnVtYmVyWzBdOwoJCQl9CgkJfQoJCSRudW1iZXIgPSBpbXBsb2RlKCRsb2NhbGVbJ21vbl9kZWNpbWFsX3BvaW50J10sICRudW1iZXIpOwoJCWlmICgkbG9jYWxlWyJ7JGxldHRlcn1fY3NfcHJlY2VkZXMiXSkgewoJCQkkbnVtYmVyID0gJHByZWZpeCAuICRjdXJyZW5jeSAuICRzcGFjZSAuICRudW1iZXIgLiAkc3VmZml4OwoJCX0gZWxzZSB7CgkJCSRudW1iZXIgPSAkcHJlZml4IC4gJG51bWJlciAuICRzcGFjZSAuICRjdXJyZW5jeSAuICRzdWZmaXg7CgkJfQoJCWlmICgkd2lkdGggPiAwKSB7CgkJCSRudW1iZXIgPSBzdHJfcGFkKCRudW1iZXIsICR3aWR0aCwgJGZsYWdzWydmaWxsY2hhciddLCAkZmxhZ3NbJ2lzbGVmdCddID8gU1RSX1BBRF9SSUdIVCA6IFNUUl9QQURfTEVGVCk7CgkJfQoJCSRmb3JtYXQgPSBzdHJfcmVwbGFjZSgkZm1hdGNoWzBdLCAkbnVtYmVyLCAkZm9ybWF0KTsKCQlyZXR1cm4gJGZvcm1hdDsKCX0JLy8JZnVuY3Rpb24gbW9uZXlfZm9ybWF0KCkKfQoKCi8vCi8vCVN0cmFuZ2VseSwgUEhQIGRvZXNuJ3QgaGF2ZSBhIG1iX3N0cl9yZXBsYWNlIG11bHRpYnl0ZSBmdW5jdGlvbgovLwlBcyB3ZSdsbCBvbmx5IGV2ZXIgdXNlIHRoaXMgZnVuY3Rpb24gd2l0aCBVVEYtOCBjaGFyYWN0ZXJzLCB3ZSBjYW4gc2ltcGx5ICJoYXJkLWNvZGUiIHRoZSBjaGFyYWN0ZXIgc2V0Ci8vCmlmICgoIWZ1bmN0aW9uX2V4aXN0cygnbWJfc3RyX3JlcGxhY2UnKSkgJiYKCShmdW5jdGlvbl9leGlzdHMoJ21iX3N1YnN0cicpKSAmJiAoZnVuY3Rpb25fZXhpc3RzKCdtYl9zdHJsZW4nKSkgJiYgKGZ1bmN0aW9uX2V4aXN0cygnbWJfc3RycG9zJykpKSB7CglmdW5jdGlvbiBtYl9zdHJfcmVwbGFjZSgkc2VhcmNoLCAkcmVwbGFjZSwgJHN1YmplY3QpIHsKCQlpZihpc19hcnJheSgkc3ViamVjdCkpIHsKCQkJJHJldCA9IGFycmF5KCk7CgkJCWZvcmVhY2goJHN1YmplY3QgYXMgJGtleSA9PiAkdmFsKSB7CgkJCQkkcmV0WyRrZXldID0gbWJfc3RyX3JlcGxhY2UoJHNlYXJjaCwgJHJlcGxhY2UsICR2YWwpOwoJCQl9CgkJCXJldHVybiAkcmV0OwoJCX0KCgkJZm9yZWFjaCgoYXJyYXkpICRzZWFyY2ggYXMgJGtleSA9PiAkcykgewoJCQlpZigkcyA9PSAnJykgewoJCQkJY29udGludWU7CgkJCX0KCQkJJHIgPSAhaXNfYXJyYXkoJHJlcGxhY2UpID8gJHJlcGxhY2UgOiAoYXJyYXlfa2V5X2V4aXN0cygka2V5LCAkcmVwbGFjZSkgPyAkcmVwbGFjZVska2V5XSA6ICcnKTsKCQkJJHBvcyA9IG1iX3N0cnBvcygkc3ViamVjdCwgJHMsIDAsICdVVEYtOCcpOwoJCQl3aGlsZSgkcG9zICE9PSBmYWxzZSkgewoJCQkJJHN1YmplY3QgPSBtYl9zdWJzdHIoJHN1YmplY3QsIDAsICRwb3MsICdVVEYtOCcpIC4gJHIgLiBtYl9zdWJzdHIoJHN1YmplY3QsICRwb3MgKyBtYl9zdHJsZW4oJHMsICdVVEYtOCcpLCA2NTUzNSwgJ1VURi04Jyk7CgkJCQkkcG9zID0gbWJfc3RycG9zKCRzdWJqZWN0LCAkcywgJHBvcyArIG1iX3N0cmxlbigkciwgJ1VURi04JyksICdVVEYtOCcpOwoJCQl9CgkJfQoJCXJldHVybiAkc3ViamVjdDsKCX0KfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Calculation/Logical.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIFBIUEV4Y2VsCiAqCiAqIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKICoKICogQGNhdGVnb3J5CVBIUEV4Y2VsCiAqIEBwYWNrYWdlCQlQSFBFeGNlbF9DYWxjdWxhdGlvbgogKiBAY29weXJpZ2h0CUNvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwgKGh0dHA6Ly93d3cuY29kZXBsZXguY29tL1BIUEV4Y2VsKQogKiBAbGljZW5zZQkJaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL29sZC1saWNlbnNlcy9sZ3BsLTIuMS50eHQJTEdQTAogKiBAdmVyc2lvbgkJMS43LjcsIDIwMTItMDUtMTkKICovCgoKLyoqIFBIUEV4Y2VsIHJvb3QgZGlyZWN0b3J5ICovCmlmICghZGVmaW5lZCgnUEhQRVhDRUxfUk9PVCcpKSB7CgkvKioKCSAqIEBpZ25vcmUKCSAqLwoJZGVmaW5lKCdQSFBFWENFTF9ST09UJywgZGlybmFtZShfX0ZJTEVfXykgLiAnLy4uLy4uLycpOwoJcmVxdWlyZShQSFBFWENFTF9ST09UIC4gJ1BIUEV4Y2VsL0F1dG9sb2FkZXIucGhwJyk7Cn0KCgovKioKICogUEhQRXhjZWxfQ2FsY3VsYXRpb25fTG9naWNhbAogKgogKiBAY2F0ZWdvcnkJUEhQRXhjZWwKICogQHBhY2thZ2UJCVBIUEV4Y2VsX0NhbGN1bGF0aW9uCiAqIEBjb3B5cmlnaHQJQ29weXJpZ2h0IChjKSAyMDA2IC0gMjAxMiBQSFBFeGNlbCAoaHR0cDovL3d3dy5jb2RlcGxleC5jb20vUEhQRXhjZWwpCiAqLwpjbGFzcyBQSFBFeGNlbF9DYWxjdWxhdGlvbl9Mb2dpY2FsIHsKCgkvKioKCSAqIFRSVUUKCSAqCgkgKiBSZXR1cm5zIHRoZSBib29sZWFuIFRSVUUuCgkgKgoJICogRXhjZWwgRnVuY3Rpb246CgkgKgkJPVRSVUUoKQoJICoKCSAqIEBhY2Nlc3MJcHVibGljCgkgKiBAY2F0ZWdvcnkgTG9naWNhbCBGdW5jdGlvbnMKCSAqIEByZXR1cm4JYm9vbGVhbgkJVHJ1ZQoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIFRSVUUoKSB7CgkJcmV0dXJuIFRSVUU7Cgl9CS8vCWZ1bmN0aW9uIFRSVUUoKQoKCgkvKioKCSAqIEZBTFNFCgkgKgoJICogUmV0dXJucyB0aGUgYm9vbGVhbiBGQUxTRS4KCSAqCgkgKiBFeGNlbCBGdW5jdGlvbjoKCSAqCQk9RkFMU0UoKQoJICoKCSAqIEBhY2Nlc3MJcHVibGljCgkgKiBAY2F0ZWdvcnkgTG9naWNhbCBGdW5jdGlvbnMKCSAqIEByZXR1cm4JYm9vbGVhbgkJRmFsc2UKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBGQUxTRSgpIHsKCQlyZXR1cm4gRkFMU0U7Cgl9CS8vCWZ1bmN0aW9uIEZBTFNFKCkKCgoJLyoqCgkgKiBMT0dJQ0FMX0FORAoJICoKCSAqIFJldHVybnMgYm9vbGVhbiBUUlVFIGlmIGFsbCBpdHMgYXJndW1lbnRzIGFyZSBUUlVFOyByZXR1cm5zIEZBTFNFIGlmIG9uZSBvciBtb3JlIGFyZ3VtZW50IGlzIEZBTFNFLgoJICoKCSAqIEV4Y2VsIEZ1bmN0aW9uOgoJICoJCT1BTkQobG9naWNhbDFbLGxvZ2ljYWwyWywgLi4uXV0pCgkgKgoJICoJCVRoZSBhcmd1bWVudHMgbXVzdCBldmFsdWF0ZSB0byBsb2dpY2FsIHZhbHVlcyBzdWNoIGFzIFRSVUUgb3IgRkFMU0UsIG9yIHRoZSBhcmd1bWVudHMgbXVzdCBiZSBhcnJheXMKCSAqCQkJb3IgcmVmZXJlbmNlcyB0aGF0IGNvbnRhaW4gbG9naWNhbCB2YWx1ZXMuCgkgKgoJICoJCUJvb2xlYW4gYXJndW1lbnRzIGFyZSB0cmVhdGVkIGFzIFRydWUgb3IgRmFsc2UgYXMgYXBwcm9wcmlhdGUKCSAqCQlJbnRlZ2VyIG9yIGZsb2F0aW5nIHBvaW50IGFyZ3VtZW50cyBhcmUgdHJlYXRlZCBhcyBUcnVlLCBleGNlcHQgZm9yIDAgb3IgMC4wIHdoaWNoIGFyZSBGYWxzZQoJICoJCUlmIGFueSBhcmd1bWVudCB2YWx1ZSBpcyBhIHN0cmluZywgb3IgYSBOdWxsLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBhICNWQUxVRSEgZXJyb3IsIHVubGVzcyB0aGUgc3RyaW5nIGhvbGRzCgkgKgkJCXRoZSB2YWx1ZSBUUlVFIG9yIEZBTFNFLCBpbiB3aGljaCBjYXNlIGl0IGlzIGV2YWx1YXRlZCBhcyB0aGUgY29ycmVzcG9uZGluZyBib29sZWFuIHZhbHVlCgkgKgoJICogQGFjY2VzcwlwdWJsaWMKCSAqIEBjYXRlZ29yeSBMb2dpY2FsIEZ1bmN0aW9ucwoJICogQHBhcmFtCW1peGVkCQkkYXJnLC4uLgkJRGF0YSB2YWx1ZXMKCSAqIEByZXR1cm4JYm9vbGVhbgkJVGhlIGxvZ2ljYWwgQU5EIG9mIHRoZSBhcmd1bWVudHMuCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gTE9HSUNBTF9BTkQoKSB7CgkJLy8gUmV0dXJuIHZhbHVlCgkJJHJldHVyblZhbHVlID0gVFJVRTsKCgkJLy8gTG9vcCB0aHJvdWdoIHRoZSBhcmd1bWVudHMKCQkkYUFyZ3MgPSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5BcnJheShmdW5jX2dldF9hcmdzKCkpOwoJCSRhcmdDb3VudCA9IC0xOwoJCWZvcmVhY2ggKCRhQXJncyBhcyAkYXJnQ291bnQgPT4gJGFyZykgewoJCQkvLyBJcyBpdCBhIGJvb2xlYW4gdmFsdWU/CgkJCWlmIChpc19ib29sKCRhcmcpKSB7CgkJCQkkcmV0dXJuVmFsdWUgPSAkcmV0dXJuVmFsdWUgJiYgJGFyZzsKCQkJfSBlbHNlaWYgKChpc19udW1lcmljKCRhcmcpKSAmJiAoIWlzX3N0cmluZygkYXJnKSkpIHsKCQkJCSRyZXR1cm5WYWx1ZSA9ICRyZXR1cm5WYWx1ZSAmJiAoJGFyZyAhPSAwKTsKCQkJfSBlbHNlaWYgKGlzX3N0cmluZygkYXJnKSkgewoJCQkJJGFyZyA9IHN0cnRvdXBwZXIoJGFyZyk7CgkJCQlpZiAoKCRhcmcgPT0gJ1RSVUUnKSB8fCAoJGFyZyA9PSBQSFBFeGNlbF9DYWxjdWxhdGlvbjo6Z2V0VFJVRSgpKSkgewoJCQkJCSRhcmcgPSBUUlVFOwoJCQkJfSBlbHNlaWYgKCgkYXJnID09ICdGQUxTRScpIHx8ICgkYXJnID09IFBIUEV4Y2VsX0NhbGN1bGF0aW9uOjpnZXRGQUxTRSgpKSkgewoJCQkJCSRhcmcgPSBGQUxTRTsKCQkJCX0gZWxzZSB7CgkJCQkJcmV0dXJuIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6VkFMVUUoKTsKCQkJCX0KCQkJCSRyZXR1cm5WYWx1ZSA9ICRyZXR1cm5WYWx1ZSAmJiAoJGFyZyAhPSAwKTsKCQkJfQoJCX0KCgkJLy8gUmV0dXJuCgkJaWYgKCRhcmdDb3VudCA8IDApIHsKCQkJcmV0dXJuIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6VkFMVUUoKTsKCQl9CgkJcmV0dXJuICRyZXR1cm5WYWx1ZTsKCX0JLy8JZnVuY3Rpb24gTE9HSUNBTF9BTkQoKQoKCgkvKioKCSAqIExPR0lDQUxfT1IKCSAqCgkgKiBSZXR1cm5zIGJvb2xlYW4gVFJVRSBpZiBhbnkgYXJndW1lbnQgaXMgVFJVRTsgcmV0dXJucyBGQUxTRSBpZiBhbGwgYXJndW1lbnRzIGFyZSBGQUxTRS4KCSAqCgkgKiBFeGNlbCBGdW5jdGlvbjoKCSAqCQk9T1IobG9naWNhbDFbLGxvZ2ljYWwyWywgLi4uXV0pCgkgKgoJICoJCVRoZSBhcmd1bWVudHMgbXVzdCBldmFsdWF0ZSB0byBsb2dpY2FsIHZhbHVlcyBzdWNoIGFzIFRSVUUgb3IgRkFMU0UsIG9yIHRoZSBhcmd1bWVudHMgbXVzdCBiZSBhcnJheXMKCSAqCQkJb3IgcmVmZXJlbmNlcyB0aGF0IGNvbnRhaW4gbG9naWNhbCB2YWx1ZXMuCgkgKgoJICoJCUJvb2xlYW4gYXJndW1lbnRzIGFyZSB0cmVhdGVkIGFzIFRydWUgb3IgRmFsc2UgYXMgYXBwcm9wcmlhdGUKCSAqCQlJbnRlZ2VyIG9yIGZsb2F0aW5nIHBvaW50IGFyZ3VtZW50cyBhcmUgdHJlYXRlZCBhcyBUcnVlLCBleGNlcHQgZm9yIDAgb3IgMC4wIHdoaWNoIGFyZSBGYWxzZQoJICoJCUlmIGFueSBhcmd1bWVudCB2YWx1ZSBpcyBhIHN0cmluZywgb3IgYSBOdWxsLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBhICNWQUxVRSEgZXJyb3IsIHVubGVzcyB0aGUgc3RyaW5nIGhvbGRzCgkgKgkJCXRoZSB2YWx1ZSBUUlVFIG9yIEZBTFNFLCBpbiB3aGljaCBjYXNlIGl0IGlzIGV2YWx1YXRlZCBhcyB0aGUgY29ycmVzcG9uZGluZyBib29sZWFuIHZhbHVlCgkgKgoJICogQGFjY2VzcwlwdWJsaWMKCSAqIEBjYXRlZ29yeSBMb2dpY2FsIEZ1bmN0aW9ucwoJICogQHBhcmFtCW1peGVkCQkkYXJnLC4uLgkJRGF0YSB2YWx1ZXMKCSAqIEByZXR1cm4JYm9vbGVhbgkJVGhlIGxvZ2ljYWwgT1Igb2YgdGhlIGFyZ3VtZW50cy4KCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBMT0dJQ0FMX09SKCkgewoJCS8vIFJldHVybiB2YWx1ZQoJCSRyZXR1cm5WYWx1ZSA9IEZBTFNFOwoKCQkvLyBMb29wIHRocm91Z2ggdGhlIGFyZ3VtZW50cwoJCSRhQXJncyA9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlbkFycmF5KGZ1bmNfZ2V0X2FyZ3MoKSk7CgkJJGFyZ0NvdW50ID0gLTE7CgkJZm9yZWFjaCAoJGFBcmdzIGFzICRhcmdDb3VudCA9PiAkYXJnKSB7CgkJCS8vIElzIGl0IGEgYm9vbGVhbiB2YWx1ZT8KCQkJaWYgKGlzX2Jvb2woJGFyZykpIHsKCQkJCSRyZXR1cm5WYWx1ZSA9ICRyZXR1cm5WYWx1ZSB8fCAkYXJnOwoJCQl9IGVsc2VpZiAoKGlzX251bWVyaWMoJGFyZykpICYmICghaXNfc3RyaW5nKCRhcmcpKSkgewoJCQkJJHJldHVyblZhbHVlID0gJHJldHVyblZhbHVlIHx8ICgkYXJnICE9IDApOwoJCQl9IGVsc2VpZiAoaXNfc3RyaW5nKCRhcmcpKSB7CgkJCQkkYXJnID0gc3RydG91cHBlcigkYXJnKTsKCQkJCWlmICgoJGFyZyA9PSAnVFJVRScpIHx8ICgkYXJnID09IFBIUEV4Y2VsX0NhbGN1bGF0aW9uOjpnZXRUUlVFKCkpKSB7CgkJCQkJJGFyZyA9IFRSVUU7CgkJCQl9IGVsc2VpZiAoKCRhcmcgPT0gJ0ZBTFNFJykgfHwgKCRhcmcgPT0gUEhQRXhjZWxfQ2FsY3VsYXRpb246OmdldEZBTFNFKCkpKSB7CgkJCQkJJGFyZyA9IEZBTFNFOwoJCQkJfSBlbHNlIHsKCQkJCQlyZXR1cm4gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpWQUxVRSgpOwoJCQkJfQoJCQkJJHJldHVyblZhbHVlID0gJHJldHVyblZhbHVlIHx8ICgkYXJnICE9IDApOwoJCQl9CgkJfQoKCQkvLyBSZXR1cm4KCQlpZiAoJGFyZ0NvdW50IDwgMCkgewoJCQlyZXR1cm4gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpWQUxVRSgpOwoJCX0KCQlyZXR1cm4gJHJldHVyblZhbHVlOwoJfQkvLwlmdW5jdGlvbiBMT0dJQ0FMX09SKCkKCgoJLyoqCgkgKiBOT1QKCSAqCgkgKiBSZXR1cm5zIHRoZSBib29sZWFuIGludmVyc2Ugb2YgdGhlIGFyZ3VtZW50LgoJICoKCSAqIEV4Y2VsIEZ1bmN0aW9uOgoJICoJCT1OT1QobG9naWNhbCkKCSAqCgkgKgkJVGhlIGFyZ3VtZW50IG11c3QgZXZhbHVhdGUgdG8gYSBsb2dpY2FsIHZhbHVlIHN1Y2ggYXMgVFJVRSBvciBGQUxTRQoJICoKCSAqCQlCb29sZWFuIGFyZ3VtZW50cyBhcmUgdHJlYXRlZCBhcyBUcnVlIG9yIEZhbHNlIGFzIGFwcHJvcHJpYXRlCgkgKgkJSW50ZWdlciBvciBmbG9hdGluZyBwb2ludCBhcmd1bWVudHMgYXJlIHRyZWF0ZWQgYXMgVHJ1ZSwgZXhjZXB0IGZvciAwIG9yIDAuMCB3aGljaCBhcmUgRmFsc2UKCSAqCQlJZiBhbnkgYXJndW1lbnQgdmFsdWUgaXMgYSBzdHJpbmcsIG9yIGEgTnVsbCwgdGhlIGZ1bmN0aW9uIHJldHVybnMgYSAjVkFMVUUhIGVycm9yLCB1bmxlc3MgdGhlIHN0cmluZyBob2xkcwoJICoJCQl0aGUgdmFsdWUgVFJVRSBvciBGQUxTRSwgaW4gd2hpY2ggY2FzZSBpdCBpcyBldmFsdWF0ZWQgYXMgdGhlIGNvcnJlc3BvbmRpbmcgYm9vbGVhbiB2YWx1ZQoJICoKCSAqIEBhY2Nlc3MJcHVibGljCgkgKiBAY2F0ZWdvcnkgTG9naWNhbCBGdW5jdGlvbnMKCSAqIEBwYXJhbQltaXhlZAkJJGxvZ2ljYWwJQSB2YWx1ZSBvciBleHByZXNzaW9uIHRoYXQgY2FuIGJlIGV2YWx1YXRlZCB0byBUUlVFIG9yIEZBTFNFCgkgKiBAcmV0dXJuCWJvb2xlYW4JCVRoZSBib29sZWFuIGludmVyc2Ugb2YgdGhlIGFyZ3VtZW50LgoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIE5PVCgkbG9naWNhbD1GQUxTRSkgewoJCSRsb2dpY2FsID0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuU2luZ2xlVmFsdWUoJGxvZ2ljYWwpOwoJCWlmIChpc19zdHJpbmcoJGxvZ2ljYWwpKSB7CgkJCSRsb2dpY2FsID0gc3RydG91cHBlcigkbG9naWNhbCk7CgkJCWlmICgoJGxvZ2ljYWwgPT0gJ1RSVUUnKSB8fCAoJGxvZ2ljYWwgPT0gUEhQRXhjZWxfQ2FsY3VsYXRpb246OmdldFRSVUUoKSkpIHsKCQkJCXJldHVybiBGQUxTRTsKCQkJfSBlbHNlaWYgKCgkbG9naWNhbCA9PSAnRkFMU0UnKSB8fCAoJGxvZ2ljYWwgPT0gUEhQRXhjZWxfQ2FsY3VsYXRpb246OmdldEZBTFNFKCkpKSB7CgkJCQlyZXR1cm4gVFJVRTsKCQkJfSBlbHNlIHsKCQkJCXJldHVybiBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OlZBTFVFKCk7CgkJCX0KCQl9CgoJCXJldHVybiAhJGxvZ2ljYWw7Cgl9CS8vCWZ1bmN0aW9uIE5PVCgpCgoJLyoqCgkgKiBTVEFURU1FTlRfSUYKCSAqCgkgKiBSZXR1cm5zIG9uZSB2YWx1ZSBpZiBhIGNvbmRpdGlvbiB5b3Ugc3BlY2lmeSBldmFsdWF0ZXMgdG8gVFJVRSBhbmQgYW5vdGhlciB2YWx1ZSBpZiBpdCBldmFsdWF0ZXMgdG8gRkFMU0UuCgkgKgoJICogRXhjZWwgRnVuY3Rpb246CgkgKgkJPUlGKGNvbmRpdGlvblsscmV0dXJuSWZUcnVlWyxyZXR1cm5JZkZhbHNlXV0pCgkgKgoJICoJCUNvbmRpdGlvbiBpcyBhbnkgdmFsdWUgb3IgZXhwcmVzc2lvbiB0aGF0IGNhbiBiZSBldmFsdWF0ZWQgdG8gVFJVRSBvciBGQUxTRS4KCSAqCQkJRm9yIGV4YW1wbGUsIEExMD0xMDAgaXMgYSBsb2dpY2FsIGV4cHJlc3Npb247IGlmIHRoZSB2YWx1ZSBpbiBjZWxsIEExMCBpcyBlcXVhbCB0byAxMDAsCgkgKgkJCXRoZSBleHByZXNzaW9uIGV2YWx1YXRlcyB0byBUUlVFLiBPdGhlcndpc2UsIHRoZSBleHByZXNzaW9uIGV2YWx1YXRlcyB0byBGQUxTRS4KCSAqCQkJVGhpcyBhcmd1bWVudCBjYW4gdXNlIGFueSBjb21wYXJpc29uIGNhbGN1bGF0aW9uIG9wZXJhdG9yLgoJICoJCVJldHVybklmVHJ1ZSBpcyB0aGUgdmFsdWUgdGhhdCBpcyByZXR1cm5lZCBpZiBjb25kaXRpb24gZXZhbHVhdGVzIHRvIFRSVUUuCgkgKgkJCUZvciBleGFtcGxlLCBpZiB0aGlzIGFyZ3VtZW50IGlzIHRoZSB0ZXh0IHN0cmluZyAiV2l0aGluIGJ1ZGdldCIgYW5kIHRoZSBjb25kaXRpb24gYXJndW1lbnQgZXZhbHVhdGVzIHRvIFRSVUUsCgkgKgkJCXRoZW4gdGhlIElGIGZ1bmN0aW9uIHJldHVybnMgdGhlIHRleHQgIldpdGhpbiBidWRnZXQiCgkgKgkJCUlmIGNvbmRpdGlvbiBpcyBUUlVFIGFuZCBSZXR1cm5JZlRydWUgaXMgYmxhbmssIHRoaXMgYXJndW1lbnQgcmV0dXJucyAwICh6ZXJvKS4gVG8gZGlzcGxheSB0aGUgd29yZCBUUlVFLCB1c2UKCSAqCQkJdGhlIGxvZ2ljYWwgdmFsdWUgVFJVRSBmb3IgdGhpcyBhcmd1bWVudC4KCSAqCQkJUmV0dXJuSWZUcnVlIGNhbiBiZSBhbm90aGVyIGZvcm11bGEuCgkgKgkJUmV0dXJuSWZGYWxzZSBpcyB0aGUgdmFsdWUgdGhhdCBpcyByZXR1cm5lZCBpZiBjb25kaXRpb24gZXZhbHVhdGVzIHRvIEZBTFNFLgoJICoJCQlGb3IgZXhhbXBsZSwgaWYgdGhpcyBhcmd1bWVudCBpcyB0aGUgdGV4dCBzdHJpbmcgIk92ZXIgYnVkZ2V0IiBhbmQgdGhlIGNvbmRpdGlvbiBhcmd1bWVudCBldmFsdWF0ZXMgdG8gRkFMU0UsCgkgKgkJCXRoZW4gdGhlIElGIGZ1bmN0aW9uIHJldHVybnMgdGhlIHRleHQgIk92ZXIgYnVkZ2V0Ii4KCSAqCQkJSWYgY29uZGl0aW9uIGlzIEZBTFNFIGFuZCBSZXR1cm5JZkZhbHNlIGlzIG9taXR0ZWQsIHRoZW4gdGhlIGxvZ2ljYWwgdmFsdWUgRkFMU0UgaXMgcmV0dXJuZWQuCgkgKgkJCUlmIGNvbmRpdGlvbiBpcyBGQUxTRSBhbmQgUmV0dXJuSWZGYWxzZSBpcyBibGFuaywgdGhlbiB0aGUgdmFsdWUgMCAoemVybykgaXMgcmV0dXJuZWQuCgkgKgkJCVJldHVybklmRmFsc2UgY2FuIGJlIGFub3RoZXIgZm9ybXVsYS4KCSAqCgkgKiBAYWNjZXNzCXB1YmxpYwoJICogQGNhdGVnb3J5IExvZ2ljYWwgRnVuY3Rpb25zCgkgKiBAcGFyYW0JbWl4ZWQJJGNvbmRpdGlvbgkJQ29uZGl0aW9uIHRvIGV2YWx1YXRlCgkgKiBAcGFyYW0JbWl4ZWQJJHJldHVybklmVHJ1ZQlWYWx1ZSB0byByZXR1cm4gd2hlbiBjb25kaXRpb24gaXMgdHJ1ZQoJICogQHBhcmFtCW1peGVkCSRyZXR1cm5JZkZhbHNlCU9wdGlvbmFsIHZhbHVlIHRvIHJldHVybiB3aGVuIGNvbmRpdGlvbiBpcyBmYWxzZQoJICogQHJldHVybgltaXhlZAlUaGUgdmFsdWUgb2YgcmV0dXJuSWZUcnVlIG9yIHJldHVybklmRmFsc2UgZGV0ZXJtaW5lZCBieSBjb25kaXRpb24KCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBTVEFURU1FTlRfSUYoJGNvbmRpdGlvbiA9IFRSVUUsICRyZXR1cm5JZlRydWUgPSAwLCAkcmV0dXJuSWZGYWxzZSA9IEZBTFNFKSB7CgkJJGNvbmRpdGlvbgkJPSAoaXNfbnVsbCgkY29uZGl0aW9uKSkJCT8gVFJVRSA6CShib29sZWFuKSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5TaW5nbGVWYWx1ZSgkY29uZGl0aW9uKTsKCQkkcmV0dXJuSWZUcnVlCT0gKGlzX251bGwoJHJldHVybklmVHJ1ZSkpCT8gMCA6CQlQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5TaW5nbGVWYWx1ZSgkcmV0dXJuSWZUcnVlKTsKCQkkcmV0dXJuSWZGYWxzZQk9IChpc19udWxsKCRyZXR1cm5JZkZhbHNlKSkJPyBGQUxTRSA6CVBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlblNpbmdsZVZhbHVlKCRyZXR1cm5JZkZhbHNlKTsKCgkJcmV0dXJuICgkY29uZGl0aW9uKSA/ICRyZXR1cm5JZlRydWUgOiAkcmV0dXJuSWZGYWxzZTsKCX0JLy8JZnVuY3Rpb24gU1RBVEVNRU5UX0lGKCkKCgoJLyoqCgkgKiBJRkVSUk9SCgkgKgoJICogRXhjZWwgRnVuY3Rpb246CgkgKgkJPUlGRVJST1IodGVzdFZhbHVlLGVycm9ycGFydCkKCSAqCgkgKiBAYWNjZXNzCXB1YmxpYwoJICogQGNhdGVnb3J5IExvZ2ljYWwgRnVuY3Rpb25zCgkgKiBAcGFyYW0JbWl4ZWQJJHRlc3RWYWx1ZQlWYWx1ZSB0byBjaGVjaywgaXMgYWxzbyB0aGUgdmFsdWUgcmV0dXJuZWQgd2hlbiBubyBlcnJvcgoJICogQHBhcmFtCW1peGVkCSRlcnJvcnBhcnQJVmFsdWUgdG8gcmV0dXJuIHdoZW4gdGVzdFZhbHVlIGlzIGFuIGVycm9yIGNvbmRpdGlvbgoJICogQHJldHVybgltaXhlZAlUaGUgdmFsdWUgb2YgZXJyb3JwYXJ0IG9yIHRlc3RWYWx1ZSBkZXRlcm1pbmVkIGJ5IGVycm9yIGNvbmRpdGlvbgoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIElGRVJST1IoJHRlc3RWYWx1ZSA9ICcnLCAkZXJyb3JwYXJ0ID0gJycpIHsKCQkkdGVzdFZhbHVlCT0gKGlzX251bGwoJHRlc3RWYWx1ZSkpCT8gJycgOglQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5TaW5nbGVWYWx1ZSgkdGVzdFZhbHVlKTsKCQkkZXJyb3JwYXJ0CT0gKGlzX251bGwoJGVycm9ycGFydCkpCT8gJycgOglQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5TaW5nbGVWYWx1ZSgkZXJyb3JwYXJ0KTsKCgkJcmV0dXJuIHNlbGY6OlNUQVRFTUVOVF9JRihQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OklTX0VSUk9SKCR0ZXN0VmFsdWUpLCAkZXJyb3JwYXJ0LCAkdGVzdFZhbHVlKTsKCX0JLy8JZnVuY3Rpb24gSUZFUlJPUigpCgp9CS8vCWNsYXNzIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0xvZ2ljYWwK]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Calculation/LookupRef.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIFBIUEV4Y2VsCiAqCiAqIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKICoKICogQGNhdGVnb3J5CVBIUEV4Y2VsCiAqIEBwYWNrYWdlCQlQSFBFeGNlbF9DYWxjdWxhdGlvbgogKiBAY29weXJpZ2h0CUNvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwgKGh0dHA6Ly93d3cuY29kZXBsZXguY29tL1BIUEV4Y2VsKQogKiBAbGljZW5zZQkJaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL29sZC1saWNlbnNlcy9sZ3BsLTIuMS50eHQJTEdQTAogKiBAdmVyc2lvbgkJMS43LjcsIDIwMTItMDUtMTkKICovCgoKLyoqIFBIUEV4Y2VsIHJvb3QgZGlyZWN0b3J5ICovCmlmICghZGVmaW5lZCgnUEhQRVhDRUxfUk9PVCcpKSB7CgkvKioKCSAqIEBpZ25vcmUKCSAqLwoJZGVmaW5lKCdQSFBFWENFTF9ST09UJywgZGlybmFtZShfX0ZJTEVfXykgLiAnLy4uLy4uLycpOwoJcmVxdWlyZShQSFBFWENFTF9ST09UIC4gJ1BIUEV4Y2VsL0F1dG9sb2FkZXIucGhwJyk7Cn0KCgovKioKICogUEhQRXhjZWxfQ2FsY3VsYXRpb25fTG9va3VwUmVmCiAqCiAqIEBjYXRlZ29yeQlQSFBFeGNlbAogKiBAcGFja2FnZQkJUEhQRXhjZWxfQ2FsY3VsYXRpb24KICogQGNvcHlyaWdodAlDb3B5cmlnaHQgKGMpIDIwMDYgLSAyMDEyIFBIUEV4Y2VsIChodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9QSFBFeGNlbCkKICovCmNsYXNzIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0xvb2t1cFJlZiB7CgoKCS8qKgoJICogQ0VMTF9BRERSRVNTCgkgKgoJICogQ3JlYXRlcyBhIGNlbGwgYWRkcmVzcyBhcyB0ZXh0LCBnaXZlbiBzcGVjaWZpZWQgcm93IGFuZCBjb2x1bW4gbnVtYmVycy4KCSAqCgkgKiBFeGNlbCBGdW5jdGlvbjoKCSAqCQk9QUREUkVTUyhyb3csIGNvbHVtbiwgW3JlbGF0aXZpdHldLCBbcmVmZXJlbmNlU3R5bGVdLCBbc2hlZXRUZXh0XSkKCSAqCgkgKiBAcGFyYW0Jcm93CQkJCVJvdyBudW1iZXIgdG8gdXNlIGluIHRoZSBjZWxsIHJlZmVyZW5jZQoJICogQHBhcmFtCWNvbHVtbgkJCUNvbHVtbiBudW1iZXIgdG8gdXNlIGluIHRoZSBjZWxsIHJlZmVyZW5jZQoJICogQHBhcmFtCXJlbGF0aXZpdHkJCUZsYWcgaW5kaWNhdGluZyB0aGUgdHlwZSBvZiByZWZlcmVuY2UgdG8gcmV0dXJuCgkgKgkJCQkJCQkJMSBvciBvbWl0dGVkCUFic29sdXRlCgkgKgkJCQkJCQkJMgkJCQlBYnNvbHV0ZSByb3c7IHJlbGF0aXZlIGNvbHVtbgoJICoJCQkJCQkJCTMJCQkJUmVsYXRpdmUgcm93OyBhYnNvbHV0ZSBjb2x1bW4KCSAqCQkJCQkJCQk0CQkJCVJlbGF0aXZlCgkgKiBAcGFyYW0JcmVmZXJlbmNlU3R5bGUJQSBsb2dpY2FsIHZhbHVlIHRoYXQgc3BlY2lmaWVzIHRoZSBBMSBvciBSMUMxIHJlZmVyZW5jZSBzdHlsZS4KCSAqCQkJCQkJCQlUUlVFIG9yIG9taXR0ZWQJCUNFTExfQUREUkVTUyByZXR1cm5zIGFuIEExLXN0eWxlIHJlZmVyZW5jZQoJICoJCQkJCQkJCUZBTFNFCQkJCUNFTExfQUREUkVTUyByZXR1cm5zIGFuIFIxQzEtc3R5bGUgcmVmZXJlbmNlCgkgKiBAcGFyYW0Jc2hlZXRUZXh0CQlPcHRpb25hbCBOYW1lIG9mIHdvcmtzaGVldCB0byB1c2UKCSAqIEByZXR1cm4Jc3RyaW5nCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gQ0VMTF9BRERSRVNTKCRyb3csICRjb2x1bW4sICRyZWxhdGl2aXR5PTEsICRyZWZlcmVuY2VTdHlsZT1UcnVlLCAkc2hlZXRUZXh0PScnKSB7CgkJJHJvdwkJPSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5TaW5nbGVWYWx1ZSgkcm93KTsKCQkkY29sdW1uCQk9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlblNpbmdsZVZhbHVlKCRjb2x1bW4pOwoJCSRyZWxhdGl2aXR5CT0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuU2luZ2xlVmFsdWUoJHJlbGF0aXZpdHkpOwoJCSRzaGVldFRleHQJPSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5TaW5nbGVWYWx1ZSgkc2hlZXRUZXh0KTsKCgkJaWYgKCgkcm93IDwgMSkgfHwgKCRjb2x1bW4gPCAxKSkgewoJCQlyZXR1cm4gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpWQUxVRSgpOwoJCX0KCgkJaWYgKCRzaGVldFRleHQgPiAnJykgewoJCQlpZiAoc3RycG9zKCRzaGVldFRleHQsJyAnKSAhPT0gRmFsc2UpIHsgJHNoZWV0VGV4dCA9ICInIi4kc2hlZXRUZXh0LiInIjsgfQoJCQkkc2hlZXRUZXh0IC49JyEnOwoJCX0KCQlpZiAoKCFpc19ib29sKCRyZWZlcmVuY2VTdHlsZSkpIHx8ICRyZWZlcmVuY2VTdHlsZSkgewoJCQkkcm93UmVsYXRpdmUgPSAkY29sdW1uUmVsYXRpdmUgPSAnJCc7CgkJCSRjb2x1bW4gPSBQSFBFeGNlbF9DZWxsOjpzdHJpbmdGcm9tQ29sdW1uSW5kZXgoJGNvbHVtbi0xKTsKCQkJaWYgKCgkcmVsYXRpdml0eSA9PSAyKSB8fCAoJHJlbGF0aXZpdHkgPT0gNCkpIHsgJGNvbHVtblJlbGF0aXZlID0gJyc7IH0KCQkJaWYgKCgkcmVsYXRpdml0eSA9PSAzKSB8fCAoJHJlbGF0aXZpdHkgPT0gNCkpIHsgJHJvd1JlbGF0aXZlID0gJyc7IH0KCQkJcmV0dXJuICRzaGVldFRleHQuJGNvbHVtblJlbGF0aXZlLiRjb2x1bW4uJHJvd1JlbGF0aXZlLiRyb3c7CgkJfSBlbHNlIHsKCQkJaWYgKCgkcmVsYXRpdml0eSA9PSAyKSB8fCAoJHJlbGF0aXZpdHkgPT0gNCkpIHsgJGNvbHVtbiA9ICdbJy4kY29sdW1uLiddJzsgfQoJCQlpZiAoKCRyZWxhdGl2aXR5ID09IDMpIHx8ICgkcmVsYXRpdml0eSA9PSA0KSkgeyAkcm93ID0gJ1snLiRyb3cuJ10nOyB9CgkJCXJldHVybiAkc2hlZXRUZXh0LidSJy4kcm93LidDJy4kY29sdW1uOwoJCX0KCX0JLy8JZnVuY3Rpb24gQ0VMTF9BRERSRVNTKCkKCgoJLyoqCgkgKiBDT0xVTU4KCSAqCgkgKiBSZXR1cm5zIHRoZSBjb2x1bW4gbnVtYmVyIG9mIHRoZSBnaXZlbiBjZWxsIHJlZmVyZW5jZQoJICogSWYgdGhlIGNlbGwgcmVmZXJlbmNlIGlzIGEgcmFuZ2Ugb2YgY2VsbHMsIENPTFVNTiByZXR1cm5zIHRoZSBjb2x1bW4gbnVtYmVycyBvZiBlYWNoIGNvbHVtbiBpbiB0aGUgcmVmZXJlbmNlIGFzIGEgaG9yaXpvbnRhbCBhcnJheS4KCSAqIElmIGNlbGwgcmVmZXJlbmNlIGlzIG9taXR0ZWQsIGFuZCB0aGUgZnVuY3Rpb24gaXMgYmVpbmcgY2FsbGVkIHRocm91Z2ggdGhlIGNhbGN1bGF0aW9uIGVuZ2luZSwgdGhlbiBpdCBpcyBhc3N1bWVkIHRvIGJlIHRoZQoJICoJCXJlZmVyZW5jZSBvZiB0aGUgY2VsbCBpbiB3aGljaCB0aGUgQ09MVU1OIGZ1bmN0aW9uIGFwcGVhcnM7IG90aGVyd2lzZSB0aGlzIGZ1bmN0aW9uIHJldHVybnMgMC4KCSAqCgkgKiBFeGNlbCBGdW5jdGlvbjoKCSAqCQk9Q09MVU1OKFtjZWxsQWRkcmVzc10pCgkgKgoJICogQHBhcmFtCWNlbGxBZGRyZXNzCQlBIHJlZmVyZW5jZSB0byBhIHJhbmdlIG9mIGNlbGxzIGZvciB3aGljaCB5b3Ugd2FudCB0aGUgY29sdW1uIG51bWJlcnMKCSAqIEByZXR1cm4JaW50ZWdlciBvciBhcnJheSBvZiBpbnRlZ2VyCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gQ09MVU1OKCRjZWxsQWRkcmVzcz1OdWxsKSB7CgkJaWYgKGlzX251bGwoJGNlbGxBZGRyZXNzKSB8fCB0cmltKCRjZWxsQWRkcmVzcykgPT09ICcnKSB7IHJldHVybiAwOyB9CgoJCWlmIChpc19hcnJheSgkY2VsbEFkZHJlc3MpKSB7CgkJCWZvcmVhY2goJGNlbGxBZGRyZXNzIGFzICRjb2x1bW5LZXkgPT4gJHZhbHVlKSB7CgkJCQkkY29sdW1uS2V5ID0gcHJlZ19yZXBsYWNlKCcvW15hLXpdL2knLCcnLCRjb2x1bW5LZXkpOwoJCQkJcmV0dXJuIChpbnRlZ2VyKSBQSFBFeGNlbF9DZWxsOjpjb2x1bW5JbmRleEZyb21TdHJpbmcoJGNvbHVtbktleSk7CgkJCX0KCQl9IGVsc2UgewoJCQlpZiAoc3RycG9zKCRjZWxsQWRkcmVzcywnIScpICE9PSBmYWxzZSkgewoJCQkJbGlzdCgkc2hlZXQsJGNlbGxBZGRyZXNzKSA9IGV4cGxvZGUoJyEnLCRjZWxsQWRkcmVzcyk7CgkJCX0KCQkJaWYgKHN0cnBvcygkY2VsbEFkZHJlc3MsJzonKSAhPT0gZmFsc2UpIHsKCQkJCWxpc3QoJHN0YXJ0QWRkcmVzcywkZW5kQWRkcmVzcykgPSBleHBsb2RlKCc6JywkY2VsbEFkZHJlc3MpOwoJCQkJJHN0YXJ0QWRkcmVzcyA9IHByZWdfcmVwbGFjZSgnL1teYS16XS9pJywnJywkc3RhcnRBZGRyZXNzKTsKCQkJCSRlbmRBZGRyZXNzID0gcHJlZ19yZXBsYWNlKCcvW15hLXpdL2knLCcnLCRlbmRBZGRyZXNzKTsKCQkJCSRyZXR1cm5WYWx1ZSA9IGFycmF5KCk7CgkJCQlkbyB7CgkJCQkJJHJldHVyblZhbHVlW10gPSAoaW50ZWdlcikgUEhQRXhjZWxfQ2VsbDo6Y29sdW1uSW5kZXhGcm9tU3RyaW5nKCRzdGFydEFkZHJlc3MpOwoJCQkJfSB3aGlsZSAoJHN0YXJ0QWRkcmVzcysrICE9ICRlbmRBZGRyZXNzKTsKCQkJCXJldHVybiAkcmV0dXJuVmFsdWU7CgkJCX0gZWxzZSB7CgkJCQkkY2VsbEFkZHJlc3MgPSBwcmVnX3JlcGxhY2UoJy9bXmEtel0vaScsJycsJGNlbGxBZGRyZXNzKTsKCQkJCXJldHVybiAoaW50ZWdlcikgUEhQRXhjZWxfQ2VsbDo6Y29sdW1uSW5kZXhGcm9tU3RyaW5nKCRjZWxsQWRkcmVzcyk7CgkJCX0KCQl9Cgl9CS8vCWZ1bmN0aW9uIENPTFVNTigpCgoKCS8qKgoJICogQ09MVU1OUwoJICoKCSAqIFJldHVybnMgdGhlIG51bWJlciBvZiBjb2x1bW5zIGluIGFuIGFycmF5IG9yIHJlZmVyZW5jZS4KCSAqCgkgKiBFeGNlbCBGdW5jdGlvbjoKCSAqCQk9Q09MVU1OUyhjZWxsQWRkcmVzcykKCSAqCgkgKiBAcGFyYW0JY2VsbEFkZHJlc3MJCUFuIGFycmF5IG9yIGFycmF5IGZvcm11bGEsIG9yIGEgcmVmZXJlbmNlIHRvIGEgcmFuZ2Ugb2YgY2VsbHMgZm9yIHdoaWNoIHlvdSB3YW50IHRoZSBudW1iZXIgb2YgY29sdW1ucwoJICogQHJldHVybglpbnRlZ2VyCQkJVGhlIG51bWJlciBvZiBjb2x1bW5zIGluIGNlbGxBZGRyZXNzCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gQ09MVU1OUygkY2VsbEFkZHJlc3M9TnVsbCkgewoJCWlmIChpc19udWxsKCRjZWxsQWRkcmVzcykgfHwgJGNlbGxBZGRyZXNzID09PSAnJykgewoJCQlyZXR1cm4gMTsKCQl9IGVsc2VpZiAoIWlzX2FycmF5KCRjZWxsQWRkcmVzcykpIHsKCQkJcmV0dXJuIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6VkFMVUUoKTsKCQl9CgoJCSR4ID0gYXJyYXlfa2V5cygkY2VsbEFkZHJlc3MpOwoJCSR4ID0gYXJyYXlfc2hpZnQoJHgpOwoJCSRpc01hdHJpeCA9IChpc19udW1lcmljKCR4KSk7CgkJbGlzdCgkY29sdW1ucywkcm93cykgPSBQSFBFeGNlbF9DYWxjdWxhdGlvbjo6X2dldE1hdHJpeERpbWVuc2lvbnMoJGNlbGxBZGRyZXNzKTsKCgkJaWYgKCRpc01hdHJpeCkgewoJCQlyZXR1cm4gJHJvd3M7CgkJfSBlbHNlIHsKCQkJcmV0dXJuICRjb2x1bW5zOwoJCX0KCX0JLy8JZnVuY3Rpb24gQ09MVU1OUygpCgoKCS8qKgoJICogUk9XCgkgKgoJICogUmV0dXJucyB0aGUgcm93IG51bWJlciBvZiB0aGUgZ2l2ZW4gY2VsbCByZWZlcmVuY2UKCSAqIElmIHRoZSBjZWxsIHJlZmVyZW5jZSBpcyBhIHJhbmdlIG9mIGNlbGxzLCBST1cgcmV0dXJucyB0aGUgcm93IG51bWJlcnMgb2YgZWFjaCByb3cgaW4gdGhlIHJlZmVyZW5jZSBhcyBhIHZlcnRpY2FsIGFycmF5LgoJICogSWYgY2VsbCByZWZlcmVuY2UgaXMgb21pdHRlZCwgYW5kIHRoZSBmdW5jdGlvbiBpcyBiZWluZyBjYWxsZWQgdGhyb3VnaCB0aGUgY2FsY3VsYXRpb24gZW5naW5lLCB0aGVuIGl0IGlzIGFzc3VtZWQgdG8gYmUgdGhlCgkgKgkJcmVmZXJlbmNlIG9mIHRoZSBjZWxsIGluIHdoaWNoIHRoZSBST1cgZnVuY3Rpb24gYXBwZWFyczsgb3RoZXJ3aXNlIHRoaXMgZnVuY3Rpb24gcmV0dXJucyAwLgoJICoKCSAqIEV4Y2VsIEZ1bmN0aW9uOgoJICoJCT1ST1coW2NlbGxBZGRyZXNzXSkKCSAqCgkgKiBAcGFyYW0JY2VsbEFkZHJlc3MJCUEgcmVmZXJlbmNlIHRvIGEgcmFuZ2Ugb2YgY2VsbHMgZm9yIHdoaWNoIHlvdSB3YW50IHRoZSByb3cgbnVtYmVycwoJICogQHJldHVybglpbnRlZ2VyIG9yIGFycmF5IG9mIGludGVnZXIKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBST1coJGNlbGxBZGRyZXNzPU51bGwpIHsKCQlpZiAoaXNfbnVsbCgkY2VsbEFkZHJlc3MpIHx8IHRyaW0oJGNlbGxBZGRyZXNzKSA9PT0gJycpIHsgcmV0dXJuIDA7IH0KCgkJaWYgKGlzX2FycmF5KCRjZWxsQWRkcmVzcykpIHsKCQkJZm9yZWFjaCgkY2VsbEFkZHJlc3MgYXMgJGNvbHVtbktleSA9PiAkcm93VmFsdWUpIHsKCQkJCWZvcmVhY2goJHJvd1ZhbHVlIGFzICRyb3dLZXkgPT4gJGNlbGxWYWx1ZSkgewoJCQkJCXJldHVybiAoaW50ZWdlcikgcHJlZ19yZXBsYWNlKCcvW14wLTldL2knLCcnLCRyb3dLZXkpOwoJCQkJfQoJCQl9CgkJfSBlbHNlIHsKCQkJaWYgKHN0cnBvcygkY2VsbEFkZHJlc3MsJyEnKSAhPT0gZmFsc2UpIHsKCQkJCWxpc3QoJHNoZWV0LCRjZWxsQWRkcmVzcykgPSBleHBsb2RlKCchJywkY2VsbEFkZHJlc3MpOwoJCQl9CgkJCWlmIChzdHJwb3MoJGNlbGxBZGRyZXNzLCc6JykgIT09IGZhbHNlKSB7CgkJCQlsaXN0KCRzdGFydEFkZHJlc3MsJGVuZEFkZHJlc3MpID0gZXhwbG9kZSgnOicsJGNlbGxBZGRyZXNzKTsKCQkJCSRzdGFydEFkZHJlc3MgPSBwcmVnX3JlcGxhY2UoJy9bXjAtOV0vJywnJywkc3RhcnRBZGRyZXNzKTsKCQkJCSRlbmRBZGRyZXNzID0gcHJlZ19yZXBsYWNlKCcvW14wLTldLycsJycsJGVuZEFkZHJlc3MpOwoJCQkJJHJldHVyblZhbHVlID0gYXJyYXkoKTsKCQkJCWRvIHsKCQkJCQkkcmV0dXJuVmFsdWVbXVtdID0gKGludGVnZXIpICRzdGFydEFkZHJlc3M7CgkJCQl9IHdoaWxlICgkc3RhcnRBZGRyZXNzKysgIT0gJGVuZEFkZHJlc3MpOwoJCQkJcmV0dXJuICRyZXR1cm5WYWx1ZTsKCQkJfSBlbHNlIHsKCQkJCWxpc3QoJGNlbGxBZGRyZXNzKSA9IGV4cGxvZGUoJzonLCRjZWxsQWRkcmVzcyk7CgkJCQlyZXR1cm4gKGludGVnZXIpIHByZWdfcmVwbGFjZSgnL1teMC05XS8nLCcnLCRjZWxsQWRkcmVzcyk7CgkJCX0KCQl9Cgl9CS8vCWZ1bmN0aW9uIFJPVygpCgoKCS8qKgoJICogUk9XUwoJICoKCSAqIFJldHVybnMgdGhlIG51bWJlciBvZiByb3dzIGluIGFuIGFycmF5IG9yIHJlZmVyZW5jZS4KCSAqCgkgKiBFeGNlbCBGdW5jdGlvbjoKCSAqCQk9Uk9XUyhjZWxsQWRkcmVzcykKCSAqCgkgKiBAcGFyYW0JY2VsbEFkZHJlc3MJCUFuIGFycmF5IG9yIGFycmF5IGZvcm11bGEsIG9yIGEgcmVmZXJlbmNlIHRvIGEgcmFuZ2Ugb2YgY2VsbHMgZm9yIHdoaWNoIHlvdSB3YW50IHRoZSBudW1iZXIgb2Ygcm93cwoJICogQHJldHVybglpbnRlZ2VyCQkJVGhlIG51bWJlciBvZiByb3dzIGluIGNlbGxBZGRyZXNzCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gUk9XUygkY2VsbEFkZHJlc3M9TnVsbCkgewoJCWlmIChpc19udWxsKCRjZWxsQWRkcmVzcykgfHwgJGNlbGxBZGRyZXNzID09PSAnJykgewoJCQlyZXR1cm4gMTsKCQl9IGVsc2VpZiAoIWlzX2FycmF5KCRjZWxsQWRkcmVzcykpIHsKCQkJcmV0dXJuIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6VkFMVUUoKTsKCQl9CgoJCSRpID0gYXJyYXlfa2V5cygkY2VsbEFkZHJlc3MpOwoJCSRpc01hdHJpeCA9IChpc19udW1lcmljKGFycmF5X3NoaWZ0KCRpKSkpOwoJCWxpc3QoJGNvbHVtbnMsJHJvd3MpID0gUEhQRXhjZWxfQ2FsY3VsYXRpb246Ol9nZXRNYXRyaXhEaW1lbnNpb25zKCRjZWxsQWRkcmVzcyk7CgoJCWlmICgkaXNNYXRyaXgpIHsKCQkJcmV0dXJuICRjb2x1bW5zOwoJCX0gZWxzZSB7CgkJCXJldHVybiAkcm93czsKCQl9Cgl9CS8vCWZ1bmN0aW9uIFJPV1MoKQoKCgkvKioKCSAqIEhZUEVSTElOSwoJICoKCSAqIEV4Y2VsIEZ1bmN0aW9uOgoJICoJCT1IWVBFUkxJTksobGlua1VSTCxkaXNwbGF5TmFtZSkKCSAqCgkgKiBAYWNjZXNzCXB1YmxpYwoJICogQGNhdGVnb3J5IExvZ2ljYWwgRnVuY3Rpb25zCgkgKiBAcGFyYW0Jc3RyaW5nCSRsaW5rVVJMCQlWYWx1ZSB0byBjaGVjaywgaXMgYWxzbyB0aGUgdmFsdWUgcmV0dXJuZWQgd2hlbiBubyBlcnJvcgoJICogQHBhcmFtCXN0cmluZwkkZGlzcGxheU5hbWUJVmFsdWUgdG8gcmV0dXJuIHdoZW4gdGVzdFZhbHVlIGlzIGFuIGVycm9yIGNvbmRpdGlvbgoJICogQHJldHVybgltaXhlZAlUaGUgdmFsdWUgb2YgJGRpc3BsYXlOYW1lIChvciAkbGlua1VSTCBpZiAkZGlzcGxheU5hbWUgd2FzIGJsYW5rKQoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIEhZUEVSTElOSygkbGlua1VSTCA9ICcnLCAkZGlzcGxheU5hbWUgPSBudWxsLCBQSFBFeGNlbF9DZWxsICRwQ2VsbCA9IG51bGwpIHsKCQkkYXJncyA9IGZ1bmNfZ2V0X2FyZ3MoKTsKCQkkcENlbGwgPSBhcnJheV9wb3AoJGFyZ3MpOwoKCQkkbGlua1VSTAkJPSAoaXNfbnVsbCgkbGlua1VSTCkpCQk/ICcnIDoJUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuU2luZ2xlVmFsdWUoJGxpbmtVUkwpOwoJCSRkaXNwbGF5TmFtZQk9IChpc19udWxsKCRkaXNwbGF5TmFtZSkpCT8gJycgOglQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5TaW5nbGVWYWx1ZSgkZGlzcGxheU5hbWUpOwoKCQlpZiAoKCFpc19vYmplY3QoJHBDZWxsKSkgfHwgKHRyaW0oJGxpbmtVUkwpID09ICcnKSkgewoJCQlyZXR1cm4gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpSRUYoKTsKCQl9CgoJCWlmICgoaXNfb2JqZWN0KCRkaXNwbGF5TmFtZSkpIHx8IHRyaW0oJGRpc3BsYXlOYW1lKSA9PSAnJykgewoJCQkkZGlzcGxheU5hbWUgPSAkbGlua1VSTDsKCQl9CgoJCSRwQ2VsbC0+Z2V0SHlwZXJsaW5rKCktPnNldFVybCgkbGlua1VSTCk7CgoJCXJldHVybiAkZGlzcGxheU5hbWU7Cgl9CS8vCWZ1bmN0aW9uIEhZUEVSTElOSygpCgoKCS8qKgoJICogSU5ESVJFQ1QKCSAqCgkgKiBSZXR1cm5zIHRoZSByZWZlcmVuY2Ugc3BlY2lmaWVkIGJ5IGEgdGV4dCBzdHJpbmcuCgkgKiBSZWZlcmVuY2VzIGFyZSBpbW1lZGlhdGVseSBldmFsdWF0ZWQgdG8gZGlzcGxheSB0aGVpciBjb250ZW50cy4KCSAqCgkgKiBFeGNlbCBGdW5jdGlvbjoKCSAqCQk9SU5ESVJFQ1QoY2VsbEFkZHJlc3MpCgkgKgoJICogTk9URSAtIElORElSRUNUKCkgZG9lcyBub3QgeWV0IHN1cHBvcnQgdGhlIG9wdGlvbmFsIGExIHBhcmFtZXRlciBpbnRyb2R1Y2VkIGluIEV4Y2VsIDIwMTAKCSAqCgkgKiBAcGFyYW0JY2VsbEFkZHJlc3MJCUFuIGFycmF5IG9yIGFycmF5IGZvcm11bGEsIG9yIGEgcmVmZXJlbmNlIHRvIGEgcmFuZ2Ugb2YgY2VsbHMgZm9yIHdoaWNoIHlvdSB3YW50IHRoZSBudW1iZXIgb2Ygcm93cwoJICogQHJldHVybgltaXhlZAkJCVRoZSBjZWxscyByZWZlcmVuY2VkIGJ5IGNlbGxBZGRyZXNzCgkgKgoJICogQHRvZG8JU3VwcG9ydCBmb3IgdGhlIG9wdGlvbmFsIGExIHBhcmFtZXRlciBpbnRyb2R1Y2VkIGluIEV4Y2VsIDIwMTAKCSAqCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gSU5ESVJFQ1QoJGNlbGxBZGRyZXNzPU51bGwsIFBIUEV4Y2VsX0NlbGwgJHBDZWxsID0gbnVsbCkgewoJCSRjZWxsQWRkcmVzcwk9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlblNpbmdsZVZhbHVlKCRjZWxsQWRkcmVzcyk7CgkJaWYgKGlzX251bGwoJGNlbGxBZGRyZXNzKSB8fCAkY2VsbEFkZHJlc3MgPT09ICcnKSB7CgkJCXJldHVybiBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OlJFRigpOwoJCX0KCgkJJGNlbGxBZGRyZXNzMSA9ICRjZWxsQWRkcmVzczsKCQkkY2VsbEFkZHJlc3MyID0gTlVMTDsKCQlpZiAoc3RycG9zKCRjZWxsQWRkcmVzcywnOicpICE9PSBmYWxzZSkgewoJCQlsaXN0KCRjZWxsQWRkcmVzczEsJGNlbGxBZGRyZXNzMikgPSBleHBsb2RlKCc6JywkY2VsbEFkZHJlc3MpOwoJCX0KCgkJaWYgKCghcHJlZ19tYXRjaCgnL14nLlBIUEV4Y2VsX0NhbGN1bGF0aW9uOjpDQUxDVUxBVElPTl9SRUdFWFBfQ0VMTFJFRi4nJC9pJywgJGNlbGxBZGRyZXNzMSwgJG1hdGNoZXMpKSB8fAoJCQkoKCFpc19udWxsKCRjZWxsQWRkcmVzczIpKSAmJiAoIXByZWdfbWF0Y2goJy9eJy5QSFBFeGNlbF9DYWxjdWxhdGlvbjo6Q0FMQ1VMQVRJT05fUkVHRVhQX0NFTExSRUYuJyQvaScsICRjZWxsQWRkcmVzczIsICRtYXRjaGVzKSkpKSB7CgoJCQlpZiAoIXByZWdfbWF0Y2goJy9eJy5QSFBFeGNlbF9DYWxjdWxhdGlvbjo6Q0FMQ1VMQVRJT05fUkVHRVhQX05BTUVEUkFOR0UuJyQvaScsICRjZWxsQWRkcmVzczEsICRtYXRjaGVzKSkgewoJCQkJcmV0dXJuIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6UkVGKCk7CgkJCX0KCgkJCWlmIChzdHJwb3MoJGNlbGxBZGRyZXNzLCchJykgIT09IGZhbHNlKSB7CgkJCQlsaXN0KCRzaGVldE5hbWUsJGNlbGxBZGRyZXNzKSA9IGV4cGxvZGUoJyEnLCRjZWxsQWRkcmVzcyk7CgkJCQkkcFNoZWV0ID0gJHBDZWxsLT5nZXRQYXJlbnQoKS0+Z2V0UGFyZW50KCktPmdldFNoZWV0QnlOYW1lKCRzaGVldE5hbWUpOwoJCQl9IGVsc2UgewoJCQkJJHBTaGVldCA9ICRwQ2VsbC0+Z2V0UGFyZW50KCk7CgkJCX0KCgkJCXJldHVybiBQSFBFeGNlbF9DYWxjdWxhdGlvbjo6Z2V0SW5zdGFuY2UoKS0+ZXh0cmFjdE5hbWVkUmFuZ2UoJGNlbGxBZGRyZXNzLCAkcFNoZWV0LCBGYWxzZSk7CgkJfQoKCQlpZiAoc3RycG9zKCRjZWxsQWRkcmVzcywnIScpICE9PSBmYWxzZSkgewoJCQlsaXN0KCRzaGVldE5hbWUsJGNlbGxBZGRyZXNzKSA9IGV4cGxvZGUoJyEnLCRjZWxsQWRkcmVzcyk7CgkJCSRwU2hlZXQgPSAkcENlbGwtPmdldFBhcmVudCgpLT5nZXRQYXJlbnQoKS0+Z2V0U2hlZXRCeU5hbWUoJHNoZWV0TmFtZSk7CgkJfSBlbHNlIHsKCQkJJHBTaGVldCA9ICRwQ2VsbC0+Z2V0UGFyZW50KCk7CgkJfQoKCQlyZXR1cm4gUEhQRXhjZWxfQ2FsY3VsYXRpb246OmdldEluc3RhbmNlKCktPmV4dHJhY3RDZWxsUmFuZ2UoJGNlbGxBZGRyZXNzLCAkcFNoZWV0LCBGYWxzZSk7Cgl9CS8vCWZ1bmN0aW9uIElORElSRUNUKCkKCgoJLyoqCgkgKiBPRkZTRVQKCSAqCgkgKiBSZXR1cm5zIGEgcmVmZXJlbmNlIHRvIGEgcmFuZ2UgdGhhdCBpcyBhIHNwZWNpZmllZCBudW1iZXIgb2Ygcm93cyBhbmQgY29sdW1ucyBmcm9tIGEgY2VsbCBvciByYW5nZSBvZiBjZWxscy4KCSAqIFRoZSByZWZlcmVuY2UgdGhhdCBpcyByZXR1cm5lZCBjYW4gYmUgYSBzaW5nbGUgY2VsbCBvciBhIHJhbmdlIG9mIGNlbGxzLiBZb3UgY2FuIHNwZWNpZnkgdGhlIG51bWJlciBvZiByb3dzIGFuZAoJICogdGhlIG51bWJlciBvZiBjb2x1bW5zIHRvIGJlIHJldHVybmVkLgoJICoKCSAqIEV4Y2VsIEZ1bmN0aW9uOgoJICoJCT1PRkZTRVQoY2VsbEFkZHJlc3MsIHJvd3MsIGNvbHMsIFtoZWlnaHRdLCBbd2lkdGhdKQoJICoKCSAqIEBwYXJhbQljZWxsQWRkcmVzcwkJVGhlIHJlZmVyZW5jZSBmcm9tIHdoaWNoIHlvdSB3YW50IHRvIGJhc2UgdGhlIG9mZnNldC4gUmVmZXJlbmNlIG11c3QgcmVmZXIgdG8gYSBjZWxsIG9yCgkgKgkJCQkJCQkJcmFuZ2Ugb2YgYWRqYWNlbnQgY2VsbHM7IG90aGVyd2lzZSwgT0ZGU0VUIHJldHVybnMgdGhlICNWQUxVRSEgZXJyb3IgdmFsdWUuCgkgKiBAcGFyYW0Jcm93cwkJCVRoZSBudW1iZXIgb2Ygcm93cywgdXAgb3IgZG93biwgdGhhdCB5b3Ugd2FudCB0aGUgdXBwZXItbGVmdCBjZWxsIHRvIHJlZmVyIHRvLgoJICoJCQkJCQkJCVVzaW5nIDUgYXMgdGhlIHJvd3MgYXJndW1lbnQgc3BlY2lmaWVzIHRoYXQgdGhlIHVwcGVyLWxlZnQgY2VsbCBpbiB0aGUgcmVmZXJlbmNlIGlzCgkgKgkJCQkJCQkJZml2ZSByb3dzIGJlbG93IHJlZmVyZW5jZS4gUm93cyBjYW4gYmUgcG9zaXRpdmUgKHdoaWNoIG1lYW5zIGJlbG93IHRoZSBzdGFydGluZyByZWZlcmVuY2UpCgkgKgkJCQkJCQkJb3IgbmVnYXRpdmUgKHdoaWNoIG1lYW5zIGFib3ZlIHRoZSBzdGFydGluZyByZWZlcmVuY2UpLgoJICogQHBhcmFtCWNvbHMJCQlUaGUgbnVtYmVyIG9mIGNvbHVtbnMsIHRvIHRoZSBsZWZ0IG9yIHJpZ2h0LCB0aGF0IHlvdSB3YW50IHRoZSB1cHBlci1sZWZ0IGNlbGwgb2YgdGhlIHJlc3VsdAoJICoJCQkJCQkJCXRvIHJlZmVyIHRvLiBVc2luZyA1IGFzIHRoZSBjb2xzIGFyZ3VtZW50IHNwZWNpZmllcyB0aGF0IHRoZSB1cHBlci1sZWZ0IGNlbGwgaW4gdGhlCgkgKgkJCQkJCQkJcmVmZXJlbmNlIGlzIGZpdmUgY29sdW1ucyB0byB0aGUgcmlnaHQgb2YgcmVmZXJlbmNlLiBDb2xzIGNhbiBiZSBwb3NpdGl2ZSAod2hpY2ggbWVhbnMKCSAqCQkJCQkJCQl0byB0aGUgcmlnaHQgb2YgdGhlIHN0YXJ0aW5nIHJlZmVyZW5jZSkgb3IgbmVnYXRpdmUgKHdoaWNoIG1lYW5zIHRvIHRoZSBsZWZ0IG9mIHRoZQoJICoJCQkJCQkJCXN0YXJ0aW5nIHJlZmVyZW5jZSkuCgkgKiBAcGFyYW0JaGVpZ2h0CQkJVGhlIGhlaWdodCwgaW4gbnVtYmVyIG9mIHJvd3MsIHRoYXQgeW91IHdhbnQgdGhlIHJldHVybmVkIHJlZmVyZW5jZSB0byBiZS4gSGVpZ2h0IG11c3QgYmUgYSBwb3NpdGl2ZSBudW1iZXIuCgkgKiBAcGFyYW0Jd2lkdGgJCQlUaGUgd2lkdGgsIGluIG51bWJlciBvZiBjb2x1bW5zLCB0aGF0IHlvdSB3YW50IHRoZSByZXR1cm5lZCByZWZlcmVuY2UgdG8gYmUuIFdpZHRoIG11c3QgYmUgYSBwb3NpdGl2ZSBudW1iZXIuCgkgKiBAcmV0dXJuCXN0cmluZwkJCUEgcmVmZXJlbmNlIHRvIGEgY2VsbCBvciByYW5nZSBvZiBjZWxscwoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIE9GRlNFVCgkY2VsbEFkZHJlc3M9TnVsbCwkcm93cz0wLCRjb2x1bW5zPTAsJGhlaWdodD1udWxsLCR3aWR0aD1udWxsKSB7CgkJJHJvd3MJCT0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuU2luZ2xlVmFsdWUoJHJvd3MpOwoJCSRjb2x1bW5zCT0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuU2luZ2xlVmFsdWUoJGNvbHVtbnMpOwoJCSRoZWlnaHQJCT0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuU2luZ2xlVmFsdWUoJGhlaWdodCk7CgkJJHdpZHRoCQk9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlblNpbmdsZVZhbHVlKCR3aWR0aCk7CgkJaWYgKCRjZWxsQWRkcmVzcyA9PSBOdWxsKSB7CgkJCXJldHVybiAwOwoJCX0KCgkJJGFyZ3MgPSBmdW5jX2dldF9hcmdzKCk7CgkJJHBDZWxsID0gYXJyYXlfcG9wKCRhcmdzKTsKCQlpZiAoIWlzX29iamVjdCgkcENlbGwpKSB7CgkJCXJldHVybiBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OlJFRigpOwoJCX0KCgkJJHNoZWV0TmFtZSA9IG51bGw7CgkJaWYgKHN0cnBvcygkY2VsbEFkZHJlc3MsIiEiKSkgewoJCQlsaXN0KCRzaGVldE5hbWUsJGNlbGxBZGRyZXNzKSA9IGV4cGxvZGUoIiEiLCRjZWxsQWRkcmVzcyk7CgkJfQoJCWlmIChzdHJwb3MoJGNlbGxBZGRyZXNzLCI6IikpIHsKCQkJbGlzdCgkc3RhcnRDZWxsLCRlbmRDZWxsKSA9IGV4cGxvZGUoIjoiLCRjZWxsQWRkcmVzcyk7CgkJfSBlbHNlIHsKCQkJJHN0YXJ0Q2VsbCA9ICRlbmRDZWxsID0gJGNlbGxBZGRyZXNzOwoJCX0KCQlsaXN0KCRzdGFydENlbGxDb2x1bW4sJHN0YXJ0Q2VsbFJvdykgPSBQSFBFeGNlbF9DZWxsOjpjb29yZGluYXRlRnJvbVN0cmluZygkc3RhcnRDZWxsKTsKCQlsaXN0KCRlbmRDZWxsQ29sdW1uLCRlbmRDZWxsUm93KSA9IFBIUEV4Y2VsX0NlbGw6OmNvb3JkaW5hdGVGcm9tU3RyaW5nKCRlbmRDZWxsKTsKCgkJJHN0YXJ0Q2VsbFJvdyArPSAkcm93czsKCQkkc3RhcnRDZWxsQ29sdW1uID0gUEhQRXhjZWxfQ2VsbDo6Y29sdW1uSW5kZXhGcm9tU3RyaW5nKCRzdGFydENlbGxDb2x1bW4pIC0gMTsKCQkkc3RhcnRDZWxsQ29sdW1uICs9ICRjb2x1bW5zOwoKCQlpZiAoKCRzdGFydENlbGxSb3cgPD0gMCkgfHwgKCRzdGFydENlbGxDb2x1bW4gPCAwKSkgewoJCQlyZXR1cm4gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpSRUYoKTsKCQl9CgkJJGVuZENlbGxDb2x1bW4gPSBQSFBFeGNlbF9DZWxsOjpjb2x1bW5JbmRleEZyb21TdHJpbmcoJGVuZENlbGxDb2x1bW4pIC0gMTsKCQlpZiAoKCR3aWR0aCAhPSBudWxsKSAmJiAoIWlzX29iamVjdCgkd2lkdGgpKSkgewoJCQkkZW5kQ2VsbENvbHVtbiA9ICRzdGFydENlbGxDb2x1bW4gKyAkd2lkdGggLSAxOwoJCX0gZWxzZSB7CgkJCSRlbmRDZWxsQ29sdW1uICs9ICRjb2x1bW5zOwoJCX0KCQkkc3RhcnRDZWxsQ29sdW1uID0gUEhQRXhjZWxfQ2VsbDo6c3RyaW5nRnJvbUNvbHVtbkluZGV4KCRzdGFydENlbGxDb2x1bW4pOwoKCQlpZiAoKCRoZWlnaHQgIT0gbnVsbCkgJiYgKCFpc19vYmplY3QoJGhlaWdodCkpKSB7CgkJCSRlbmRDZWxsUm93ID0gJHN0YXJ0Q2VsbFJvdyArICRoZWlnaHQgLSAxOwoJCX0gZWxzZSB7CgkJCSRlbmRDZWxsUm93ICs9ICRyb3dzOwoJCX0KCgkJaWYgKCgkZW5kQ2VsbFJvdyA8PSAwKSB8fCAoJGVuZENlbGxDb2x1bW4gPCAwKSkgewoJCQlyZXR1cm4gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpSRUYoKTsKCQl9CgkJJGVuZENlbGxDb2x1bW4gPSBQSFBFeGNlbF9DZWxsOjpzdHJpbmdGcm9tQ29sdW1uSW5kZXgoJGVuZENlbGxDb2x1bW4pOwoKCQkkY2VsbEFkZHJlc3MgPSAkc3RhcnRDZWxsQ29sdW1uLiRzdGFydENlbGxSb3c7CgkJaWYgKCgkc3RhcnRDZWxsQ29sdW1uICE9ICRlbmRDZWxsQ29sdW1uKSB8fCAoJHN0YXJ0Q2VsbFJvdyAhPSAkZW5kQ2VsbFJvdykpIHsKCQkJJGNlbGxBZGRyZXNzIC49ICc6Jy4kZW5kQ2VsbENvbHVtbi4kZW5kQ2VsbFJvdzsKCQl9CgoJCWlmICgkc2hlZXROYW1lICE9PSBudWxsKSB7CgkJCSRwU2hlZXQgPSAkcENlbGwtPmdldFBhcmVudCgpLT5nZXRQYXJlbnQoKS0+Z2V0U2hlZXRCeU5hbWUoJHNoZWV0TmFtZSk7CgkJfSBlbHNlIHsKCQkJJHBTaGVldCA9ICRwQ2VsbC0+Z2V0UGFyZW50KCk7CgkJfQoKCQlyZXR1cm4gUEhQRXhjZWxfQ2FsY3VsYXRpb246OmdldEluc3RhbmNlKCktPmV4dHJhY3RDZWxsUmFuZ2UoJGNlbGxBZGRyZXNzLCAkcFNoZWV0LCBGYWxzZSk7Cgl9CS8vCWZ1bmN0aW9uIE9GRlNFVCgpCgoKCS8qKgoJICogQ0hPT1NFCgkgKgoJICogVXNlcyBsb29rdXBfdmFsdWUgdG8gcmV0dXJuIGEgdmFsdWUgZnJvbSB0aGUgbGlzdCBvZiB2YWx1ZSBhcmd1bWVudHMuCgkgKiBVc2UgQ0hPT1NFIHRvIHNlbGVjdCBvbmUgb2YgdXAgdG8gMjU0IHZhbHVlcyBiYXNlZCBvbiB0aGUgbG9va3VwX3ZhbHVlLgoJICoKCSAqIEV4Y2VsIEZ1bmN0aW9uOgoJICoJCT1DSE9PU0UoaW5kZXhfbnVtLCB2YWx1ZTEsIFt2YWx1ZTJdLCAuLi4pCgkgKgoJICogQHBhcmFtCWluZGV4X251bQkJU3BlY2lmaWVzIHdoaWNoIHZhbHVlIGFyZ3VtZW50IGlzIHNlbGVjdGVkLgoJICoJCQkJCQkJSW5kZXhfbnVtIG11c3QgYmUgYSBudW1iZXIgYmV0d2VlbiAxIGFuZCAyNTQsIG9yIGEgZm9ybXVsYSBvciByZWZlcmVuY2UgdG8gYSBjZWxsIGNvbnRhaW5pbmcgYSBudW1iZXIKCSAqCQkJCQkJCQliZXR3ZWVuIDEgYW5kIDI1NC4KCSAqIEBwYXJhbQl2YWx1ZTEuLi4JCVZhbHVlMSBpcyByZXF1aXJlZCwgc3Vic2VxdWVudCB2YWx1ZXMgYXJlIG9wdGlvbmFsLgoJICoJCQkJCQkJQmV0d2VlbiAxIHRvIDI1NCB2YWx1ZSBhcmd1bWVudHMgZnJvbSB3aGljaCBDSE9PU0Ugc2VsZWN0cyBhIHZhbHVlIG9yIGFuIGFjdGlvbiB0byBwZXJmb3JtIGJhc2VkIG9uCgkgKgkJCQkJCQkJaW5kZXhfbnVtLiBUaGUgYXJndW1lbnRzIGNhbiBiZSBudW1iZXJzLCBjZWxsIHJlZmVyZW5jZXMsIGRlZmluZWQgbmFtZXMsIGZvcm11bGFzLCBmdW5jdGlvbnMsIG9yCgkgKgkJCQkJCQkJdGV4dC4KCSAqIEByZXR1cm4JbWl4ZWQJCQlUaGUgc2VsZWN0ZWQgdmFsdWUKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBDSE9PU0UoKSB7CgkJJGNob29zZUFyZ3MgPSBmdW5jX2dldF9hcmdzKCk7CgkJJGNob3NlbkVudHJ5ID0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuQXJyYXkoYXJyYXlfc2hpZnQoJGNob29zZUFyZ3MpKTsKCQkkZW50cnlDb3VudCA9IGNvdW50KCRjaG9vc2VBcmdzKSAtIDE7CgoJCWlmKGlzX2FycmF5KCRjaG9zZW5FbnRyeSkpIHsKCQkJJGNob3NlbkVudHJ5ID0gYXJyYXlfc2hpZnQoJGNob3NlbkVudHJ5KTsKCQl9CgkJaWYgKChpc19udW1lcmljKCRjaG9zZW5FbnRyeSkpICYmICghaXNfYm9vbCgkY2hvc2VuRW50cnkpKSkgewoJCQktLSRjaG9zZW5FbnRyeTsKCQl9IGVsc2UgewoJCQlyZXR1cm4gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpWQUxVRSgpOwoJCX0KCQkkY2hvc2VuRW50cnkgPSBmbG9vcigkY2hvc2VuRW50cnkpOwoJCWlmICgoJGNob3NlbkVudHJ5IDw9IDApIHx8ICgkY2hvc2VuRW50cnkgPiAkZW50cnlDb3VudCkpIHsKCQkJcmV0dXJuIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6VkFMVUUoKTsKCQl9CgoJCWlmIChpc19hcnJheSgkY2hvb3NlQXJnc1skY2hvc2VuRW50cnldKSkgewoJCQlyZXR1cm4gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuQXJyYXkoJGNob29zZUFyZ3NbJGNob3NlbkVudHJ5XSk7CgkJfSBlbHNlIHsKCQkJcmV0dXJuICRjaG9vc2VBcmdzWyRjaG9zZW5FbnRyeV07CgkJfQoJfQkvLwlmdW5jdGlvbiBDSE9PU0UoKQoKCgkvKioKCSAqIE1BVENICgkgKgoJICogVGhlIE1BVENIIGZ1bmN0aW9uIHNlYXJjaGVzIGZvciBhIHNwZWNpZmllZCBpdGVtIGluIGEgcmFuZ2Ugb2YgY2VsbHMKCSAqCgkgKiBFeGNlbCBGdW5jdGlvbjoKCSAqCQk9TUFUQ0gobG9va3VwX3ZhbHVlLCBsb29rdXBfYXJyYXksIFttYXRjaF90eXBlXSkKCSAqCgkgKiBAcGFyYW0JbG9va3VwX3ZhbHVlCVRoZSB2YWx1ZSB0aGF0IHlvdSB3YW50IHRvIG1hdGNoIGluIGxvb2t1cF9hcnJheQoJICogQHBhcmFtCWxvb2t1cF9hcnJheQlUaGUgcmFuZ2Ugb2YgY2VsbHMgYmVpbmcgc2VhcmNoZWQKCSAqIEBwYXJhbQltYXRjaF90eXBlCQlUaGUgbnVtYmVyIC0xLCAwLCBvciAxLiAtMSBtZWFucyBhYm92ZSwgMCBtZWFucyBleGFjdCBtYXRjaCwgMSBtZWFucyBiZWxvdy4gSWYgbWF0Y2hfdHlwZSBpcyAxIG9yIC0xLCB0aGUgbGlzdCBoYXMgdG8gYmUgb3JkZXJlZC4KCSAqIEByZXR1cm4JaW50ZWdlcgkJCVRoZSByZWxhdGl2ZSBwb3NpdGlvbiBvZiB0aGUgZm91bmQgaXRlbQoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIE1BVENIKCRsb29rdXBfdmFsdWUsICRsb29rdXBfYXJyYXksICRtYXRjaF90eXBlPTEpIHsKCQkkbG9va3VwX2FycmF5ID0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuQXJyYXkoJGxvb2t1cF9hcnJheSk7CgkJJGxvb2t1cF92YWx1ZSA9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlblNpbmdsZVZhbHVlKCRsb29rdXBfdmFsdWUpOwoJCSRtYXRjaF90eXBlCT0gKGlzX251bGwoJG1hdGNoX3R5cGUpKSA/IDEgOiAoaW50KSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5TaW5nbGVWYWx1ZSgkbWF0Y2hfdHlwZSk7CgkJLy8JTUFUQ0ggaXMgbm90IGNhc2Ugc2Vuc2l0aXZlCgkJJGxvb2t1cF92YWx1ZSA9IHN0cnRvbG93ZXIoJGxvb2t1cF92YWx1ZSk7CgoJCS8vCWxvb2t1cF92YWx1ZSB0eXBlIGhhcyB0byBiZSBudW1iZXIsIHRleHQsIG9yIGxvZ2ljYWwgdmFsdWVzCgkJaWYgKCghaXNfbnVtZXJpYygkbG9va3VwX3ZhbHVlKSkgJiYgKCFpc19zdHJpbmcoJGxvb2t1cF92YWx1ZSkpICYmICghaXNfYm9vbCgkbG9va3VwX3ZhbHVlKSkpIHsKCQkJcmV0dXJuIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6TkEoKTsKCQl9CgoJCS8vCW1hdGNoX3R5cGUgaXMgMCwgMSBvciAtMQoJCWlmICgoJG1hdGNoX3R5cGUgIT09IDApICYmICgkbWF0Y2hfdHlwZSAhPT0gLTEpICYmICgkbWF0Y2hfdHlwZSAhPT0gMSkpIHsKCQkJcmV0dXJuIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6TkEoKTsKCQl9CgoJCS8vCWxvb2t1cF9hcnJheSBzaG91bGQgbm90IGJlIGVtcHR5CgkJJGxvb2t1cEFycmF5U2l6ZSA9IGNvdW50KCRsb29rdXBfYXJyYXkpOwoJCWlmICgkbG9va3VwQXJyYXlTaXplIDw9IDApIHsKCQkJcmV0dXJuIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6TkEoKTsKCQl9CgoJCS8vCWxvb2t1cF9hcnJheSBzaG91bGQgY29udGFpbiBvbmx5IG51bWJlciwgdGV4dCwgb3IgbG9naWNhbCB2YWx1ZXMsIG9yIGVtcHR5IChudWxsKSBjZWxscwoJCWZvcmVhY2goJGxvb2t1cF9hcnJheSBhcyAkaSA9PiAkbG9va3VwQXJyYXlWYWx1ZSkgewoJCQkvLwljaGVjayB0aGUgdHlwZSBvZiB0aGUgdmFsdWUKCQkJaWYgKCghaXNfbnVtZXJpYygkbG9va3VwQXJyYXlWYWx1ZSkpICYmICghaXNfc3RyaW5nKCRsb29rdXBBcnJheVZhbHVlKSkgJiYKCQkJCSghaXNfYm9vbCgkbG9va3VwQXJyYXlWYWx1ZSkpICYmICghaXNfbnVsbCgkbG9va3VwQXJyYXlWYWx1ZSkpKSB7CgkJCQlyZXR1cm4gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpOQSgpOwoJCQl9CgkJCS8vCWNvbnZlcnQgc3RyaW5ncyB0byBsb3dlcmNhc2UgZm9yIGNhc2UtaW5zZW5zaXRpdmUgdGVzdGluZwoJCQlpZiAoaXNfc3RyaW5nKCRsb29rdXBBcnJheVZhbHVlKSkgewoJCQkJJGxvb2t1cF9hcnJheVskaV0gPSBzdHJ0b2xvd2VyKCRsb29rdXBBcnJheVZhbHVlKTsKCQkJfQoJCQlpZiAoKGlzX251bGwoJGxvb2t1cEFycmF5VmFsdWUpKSAmJiAoKCRtYXRjaF90eXBlID09IDEpIHx8ICgkbWF0Y2hfdHlwZSA9PSAtMSkpKSB7CgkJCQkkbG9va3VwX2FycmF5ID0gYXJyYXlfc2xpY2UoJGxvb2t1cF9hcnJheSwwLCRpLTEpOwoJCQl9CgkJfQoKCQkvLyBpZiBtYXRjaF90eXBlIGlzIDEgb3IgLTEsIHRoZSBsaXN0IGhhcyB0byBiZSBvcmRlcmVkCgkJaWYgKCRtYXRjaF90eXBlID09IDEpIHsKCQkJYXNvcnQoJGxvb2t1cF9hcnJheSk7CgkJCSRrZXlTZXQgPSBhcnJheV9rZXlzKCRsb29rdXBfYXJyYXkpOwoJCX0gZWxzZWlmKCRtYXRjaF90eXBlID09IC0xKSB7CgkJCWFyc29ydCgkbG9va3VwX2FycmF5KTsKCQkJJGtleVNldCA9IGFycmF5X2tleXMoJGxvb2t1cF9hcnJheSk7CgkJfQoKCQkvLyAqKgoJCS8vIGZpbmQgdGhlIG1hdGNoCgkJLy8gKioKCQkvLyBsb29wIG9uIHRoZSBjZWxscwovLwkJdmFyX2R1bXAoJGxvb2t1cF9hcnJheSk7Ci8vCQllY2hvICc8YnIgLz4nOwoJCWZvcmVhY2goJGxvb2t1cF9hcnJheSBhcyAkaSA9PiAkbG9va3VwQXJyYXlWYWx1ZSkgewoJCQlpZiAoKCRtYXRjaF90eXBlID09IDApICYmICgkbG9va3VwQXJyYXlWYWx1ZSA9PSAkbG9va3VwX3ZhbHVlKSkgewoJCQkJLy8JZXhhY3QgbWF0Y2gKCQkJCXJldHVybiArKyRpOwoJCQl9IGVsc2VpZiAoKCRtYXRjaF90eXBlID09IC0xKSAmJiAoJGxvb2t1cEFycmF5VmFsdWUgPD0gJGxvb2t1cF92YWx1ZSkpIHsKLy8JCQkJZWNobyAnJGkgPSAnLiRpLicgPT4gJzsKLy8JCQkJdmFyX2R1bXAoJGxvb2t1cEFycmF5VmFsdWUpOwovLwkJCQllY2hvICc8YnIgLz4nOwovLwkJCQllY2hvICdLZXlzZXQgPSAnOwovLwkJCQl2YXJfZHVtcCgka2V5U2V0KTsKLy8JCQkJZWNobyAnPGJyIC8+JzsKCQkJCSRpID0gYXJyYXlfc2VhcmNoKCRpLCRrZXlTZXQpOwovLwkJCQllY2hvICckaT0nLiRpLic8YnIgLz4nOwoJCQkJLy8gaWYgbWF0Y2hfdHlwZSBpcyAtMSA8PT4gZmluZCB0aGUgc21hbGxlc3QgdmFsdWUgdGhhdCBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gbG9va3VwX3ZhbHVlCgkJCQlpZiAoJGkgPCAxKXsKCQkJCQkvLyAxc3QgY2VsbCB3YXMgYWxscmVhZHkgc21hbGxlciB0aGFuIHRoZSBsb29rdXBfdmFsdWUKCQkJCQlicmVhazsKCQkJCX0gZWxzZSB7CgkJCQkJLy8gdGhlIHByZXZpb3VzIGNlbGwgd2FzIHRoZSBtYXRjaAoJCQkJCXJldHVybiAka2V5U2V0WyRpLTFdKzE7CgkJCQl9CgkJCX0gZWxzZWlmICgoJG1hdGNoX3R5cGUgPT0gMSkgJiYgKCRsb29rdXBBcnJheVZhbHVlID49ICRsb29rdXBfdmFsdWUpKSB7Ci8vCQkJCWVjaG8gJyRpID0gJy4kaS4nID0+ICc7Ci8vCQkJCXZhcl9kdW1wKCRsb29rdXBBcnJheVZhbHVlKTsKLy8JCQkJZWNobyAnPGJyIC8+JzsKLy8JCQkJZWNobyAnS2V5c2V0ID0gJzsKLy8JCQkJdmFyX2R1bXAoJGtleVNldCk7Ci8vCQkJCWVjaG8gJzxiciAvPic7CgkJCQkkaSA9IGFycmF5X3NlYXJjaCgkaSwka2V5U2V0KTsKLy8JCQkJZWNobyAnJGk9Jy4kaS4nPGJyIC8+JzsKCQkJCS8vIGlmIG1hdGNoX3R5cGUgaXMgMSA8PT4gZmluZCB0aGUgbGFyZ2VzdCB2YWx1ZSB0aGF0IGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byBsb29rdXBfdmFsdWUKCQkJCWlmICgkaSA8IDEpewoJCQkJCS8vIDFzdCBjZWxsIHdhcyBhbGxyZWFkeSBiaWdnZXIgdGhhbiB0aGUgbG9va3VwX3ZhbHVlCgkJCQkJYnJlYWs7CgkJCQl9IGVsc2UgewoJCQkJCS8vIHRoZSBwcmV2aW91cyBjZWxsIHdhcyB0aGUgbWF0Y2gKCQkJCQlyZXR1cm4gJGtleVNldFskaS0xXSsxOwoJCQkJfQoJCQl9CgkJfQoKCQkvLwl1bnN1Y2Nlc3NmdWwgaW4gZmluZGluZyBhIG1hdGNoLCByZXR1cm4gI04vQSBlcnJvciB2YWx1ZQoJCXJldHVybiBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6Ok5BKCk7Cgl9CS8vCWZ1bmN0aW9uIE1BVENIKCkKCgoJLyoqCgkgKiBJTkRFWAoJICoKCSAqIFVzZXMgYW4gaW5kZXggdG8gY2hvb3NlIGEgdmFsdWUgZnJvbSBhIHJlZmVyZW5jZSBvciBhcnJheQoJICoKCSAqIEV4Y2VsIEZ1bmN0aW9uOgoJICoJCT1JTkRFWChyYW5nZV9hcnJheSwgcm93X251bSwgW2NvbHVtbl9udW1dKQoJICoKCSAqIEBwYXJhbQlyYW5nZV9hcnJheQkJQSByYW5nZSBvZiBjZWxscyBvciBhbiBhcnJheSBjb25zdGFudAoJICogQHBhcmFtCXJvd19udW0JCQlUaGUgcm93IGluIGFycmF5IGZyb20gd2hpY2ggdG8gcmV0dXJuIGEgdmFsdWUuIElmIHJvd19udW0gaXMgb21pdHRlZCwgY29sdW1uX251bSBpcyByZXF1aXJlZC4KCSAqIEBwYXJhbQljb2x1bW5fbnVtCQlUaGUgY29sdW1uIGluIGFycmF5IGZyb20gd2hpY2ggdG8gcmV0dXJuIGEgdmFsdWUuIElmIGNvbHVtbl9udW0gaXMgb21pdHRlZCwgcm93X251bSBpcyByZXF1aXJlZC4KCSAqIEByZXR1cm4JbWl4ZWQJCQl0aGUgdmFsdWUgb2YgYSBzcGVjaWZpZWQgY2VsbCBvciBhcnJheSBvZiBjZWxscwoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIElOREVYKCRhcnJheVZhbHVlcywkcm93TnVtID0gMCwkY29sdW1uTnVtID0gMCkgewoKCQlpZiAoKCRyb3dOdW0gPCAwKSB8fCAoJGNvbHVtbk51bSA8IDApKSB7CgkJCXJldHVybiBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OlZBTFVFKCk7CgkJfQoKCQlpZiAoIWlzX2FycmF5KCRhcnJheVZhbHVlcykpIHsKCQkJcmV0dXJuIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6UkVGKCk7CgkJfQoKCQkkcm93S2V5cyA9IGFycmF5X2tleXMoJGFycmF5VmFsdWVzKTsKCQkkY29sdW1uS2V5cyA9IEBhcnJheV9rZXlzKCRhcnJheVZhbHVlc1skcm93S2V5c1swXV0pOwoKCQlpZiAoJGNvbHVtbk51bSA+IGNvdW50KCRjb2x1bW5LZXlzKSkgewoJCQlyZXR1cm4gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpWQUxVRSgpOwoJCX0gZWxzZWlmICgkY29sdW1uTnVtID09IDApIHsKCQkJaWYgKCRyb3dOdW0gPT0gMCkgewoJCQkJcmV0dXJuICRhcnJheVZhbHVlczsKCQkJfQoJCQkkcm93TnVtID0gJHJvd0tleXNbLS0kcm93TnVtXTsKCQkJJHJldHVybkFycmF5ID0gYXJyYXkoKTsKCQkJZm9yZWFjaCgkYXJyYXlWYWx1ZXMgYXMgJGFycmF5Q29sdW1uKSB7CgkJCQlpZiAoaXNfYXJyYXkoJGFycmF5Q29sdW1uKSkgewoJCQkJCWlmIChpc3NldCgkYXJyYXlDb2x1bW5bJHJvd051bV0pKSB7CgkJCQkJCSRyZXR1cm5BcnJheVtdID0gJGFycmF5Q29sdW1uWyRyb3dOdW1dOwoJCQkJCX0gZWxzZSB7CgkJCQkJCXJldHVybiAkYXJyYXlWYWx1ZXNbJHJvd051bV07CgkJCQkJfQoJCQkJfSBlbHNlIHsKCQkJCQlyZXR1cm4gJGFycmF5VmFsdWVzWyRyb3dOdW1dOwoJCQkJfQoJCQl9CgkJCXJldHVybiAkcmV0dXJuQXJyYXk7CgkJfQoJCSRjb2x1bW5OdW0gPSAkY29sdW1uS2V5c1stLSRjb2x1bW5OdW1dOwoJCWlmICgkcm93TnVtID4gY291bnQoJHJvd0tleXMpKSB7CgkJCXJldHVybiBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OlZBTFVFKCk7CgkJfSBlbHNlaWYgKCRyb3dOdW0gPT0gMCkgewoJCQlyZXR1cm4gJGFycmF5VmFsdWVzWyRjb2x1bW5OdW1dOwoJCX0KCQkkcm93TnVtID0gJHJvd0tleXNbLS0kcm93TnVtXTsKCgkJcmV0dXJuICRhcnJheVZhbHVlc1skcm93TnVtXVskY29sdW1uTnVtXTsKCX0JLy8JZnVuY3Rpb24gSU5ERVgoKQoKCgkvKioKCSAqIFRSQU5TUE9TRQoJICoKCSAqIEBwYXJhbQlhcnJheQkkbWF0cml4RGF0YQlBIG1hdHJpeCBvZiB2YWx1ZXMKCSAqIEByZXR1cm4JYXJyYXkKCSAqCgkgKiBVbmxpa2UgdGhlIEV4Y2VsIFRSQU5TUE9TRSBmdW5jdGlvbiwgd2hpY2ggd2lsbCBvbmx5IHdvcmsgb24gYSBzaW5nbGUgcm93IG9yIGNvbHVtbiwgdGhpcyBmdW5jdGlvbiB3aWxsIHRyYW5zcG9zZSBhIGZ1bGwgbWF0cml4LgoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIFRSQU5TUE9TRSgkbWF0cml4RGF0YSkgewoJCSRyZXR1cm5NYXRyaXggPSBhcnJheSgpOwoJCWlmICghaXNfYXJyYXkoJG1hdHJpeERhdGEpKSB7ICRtYXRyaXhEYXRhID0gYXJyYXkoYXJyYXkoJG1hdHJpeERhdGEpKTsgfQoKCQkkY29sdW1uID0gMDsKCQlmb3JlYWNoKCRtYXRyaXhEYXRhIGFzICRtYXRyaXhSb3cpIHsKCQkJJHJvdyA9IDA7CgkJCWZvcmVhY2goJG1hdHJpeFJvdyBhcyAkbWF0cml4Q2VsbCkgewoJCQkJJHJldHVybk1hdHJpeFskcm93XVskY29sdW1uXSA9ICRtYXRyaXhDZWxsOwoJCQkJKyskcm93OwoJCQl9CgkJCSsrJGNvbHVtbjsKCQl9CgkJcmV0dXJuICRyZXR1cm5NYXRyaXg7Cgl9CS8vCWZ1bmN0aW9uIFRSQU5TUE9TRSgpCgoKCXByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIF92bG9va3VwU29ydCgkYSwkYikgewoJCSRmID0gYXJyYXlfa2V5cygkYSk7CgkJJGZpcnN0Q29sdW1uID0gYXJyYXlfc2hpZnQoJGYpOwoJCWlmIChzdHJ0b2xvd2VyKCRhWyRmaXJzdENvbHVtbl0pID09IHN0cnRvbG93ZXIoJGJbJGZpcnN0Q29sdW1uXSkpIHsKCQkJcmV0dXJuIDA7CgkJfQoJCXJldHVybiAoc3RydG9sb3dlcigkYVskZmlyc3RDb2x1bW5dKSA8IHN0cnRvbG93ZXIoJGJbJGZpcnN0Q29sdW1uXSkpID8gLTEgOiAxOwoJfQkvLwlmdW5jdGlvbiBfdmxvb2t1cFNvcnQoKQoKCgkvKioKCSogVkxPT0tVUAoJKiBUaGUgVkxPT0tVUCBmdW5jdGlvbiBzZWFyY2hlcyBmb3IgdmFsdWUgaW4gdGhlIGxlZnQtbW9zdCBjb2x1bW4gb2YgbG9va3VwX2FycmF5IGFuZCByZXR1cm5zIHRoZSB2YWx1ZSBpbiB0aGUgc2FtZSByb3cgYmFzZWQgb24gdGhlIGluZGV4X251bWJlci4KCSogQHBhcmFtCWxvb2t1cF92YWx1ZQlUaGUgdmFsdWUgdGhhdCB5b3Ugd2FudCB0byBtYXRjaCBpbiBsb29rdXBfYXJyYXkKCSogQHBhcmFtCWxvb2t1cF9hcnJheQlUaGUgcmFuZ2Ugb2YgY2VsbHMgYmVpbmcgc2VhcmNoZWQKCSogQHBhcmFtCWluZGV4X251bWJlcglUaGUgY29sdW1uIG51bWJlciBpbiB0YWJsZV9hcnJheSBmcm9tIHdoaWNoIHRoZSBtYXRjaGluZyB2YWx1ZSBtdXN0IGJlIHJldHVybmVkLiBUaGUgZmlyc3QgY29sdW1uIGlzIDEuCgkqIEBwYXJhbQlub3RfZXhhY3RfbWF0Y2gJRGV0ZXJtaW5lcyBpZiB5b3UgYXJlIGxvb2tpbmcgZm9yIGFuIGV4YWN0IG1hdGNoIGJhc2VkIG9uIGxvb2t1cF92YWx1ZS4KCSogQHJldHVybgltaXhlZAkJCVRoZSB2YWx1ZSBvZiB0aGUgZm91bmQgY2VsbAoJKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gVkxPT0tVUCgkbG9va3VwX3ZhbHVlLCAkbG9va3VwX2FycmF5LCAkaW5kZXhfbnVtYmVyLCAkbm90X2V4YWN0X21hdGNoPXRydWUpIHsKCQkkbG9va3VwX3ZhbHVlCT0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuU2luZ2xlVmFsdWUoJGxvb2t1cF92YWx1ZSk7CgkJJGluZGV4X251bWJlcgk9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlblNpbmdsZVZhbHVlKCRpbmRleF9udW1iZXIpOwoJCSRub3RfZXhhY3RfbWF0Y2gJPSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5TaW5nbGVWYWx1ZSgkbm90X2V4YWN0X21hdGNoKTsKCgkJLy8gaW5kZXhfbnVtYmVyIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDEKCQlpZiAoJGluZGV4X251bWJlciA8IDEpIHsKCQkJcmV0dXJuIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6VkFMVUUoKTsKCQl9CgoJCS8vIGluZGV4X251bWJlciBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgbnVtYmVyIG9mIGNvbHVtbnMgaW4gbG9va3VwX2FycmF5CgkJaWYgKCghaXNfYXJyYXkoJGxvb2t1cF9hcnJheSkpIHx8IChlbXB0eSgkbG9va3VwX2FycmF5KSkpIHsKCQkJcmV0dXJuIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6UkVGKCk7CgkJfSBlbHNlIHsKCQkJJGYgPSBhcnJheV9rZXlzKCRsb29rdXBfYXJyYXkpOwoJCQkkZmlyc3RSb3cgPSBhcnJheV9wb3AoJGYpOwoJCQlpZiAoKCFpc19hcnJheSgkbG9va3VwX2FycmF5WyRmaXJzdFJvd10pKSB8fCAoJGluZGV4X251bWJlciA+IGNvdW50KCRsb29rdXBfYXJyYXlbJGZpcnN0Um93XSkpKSB7CgkJCQlyZXR1cm4gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpSRUYoKTsKCQkJfSBlbHNlIHsKCQkJCSRjb2x1bW5LZXlzID0gYXJyYXlfa2V5cygkbG9va3VwX2FycmF5WyRmaXJzdFJvd10pOwoJCQkJJHJldHVybkNvbHVtbiA9ICRjb2x1bW5LZXlzWy0tJGluZGV4X251bWJlcl07CgkJCQkkZmlyc3RDb2x1bW4gPSBhcnJheV9zaGlmdCgkY29sdW1uS2V5cyk7CgkJCX0KCQl9CgoJCWlmICghJG5vdF9leGFjdF9tYXRjaCkgewoJCQl1YXNvcnQoJGxvb2t1cF9hcnJheSxhcnJheSgnc2VsZicsJ192bG9va3VwU29ydCcpKTsKCQl9CgoJCSRyb3dOdW1iZXIgPSAkcm93VmFsdWUgPSBGYWxzZTsKCQlmb3JlYWNoKCRsb29rdXBfYXJyYXkgYXMgJHJvd0tleSA9PiAkcm93RGF0YSkgewoJCQlpZiAoc3RydG9sb3dlcigkcm93RGF0YVskZmlyc3RDb2x1bW5dKSA+IHN0cnRvbG93ZXIoJGxvb2t1cF92YWx1ZSkpIHsKCQkJCWJyZWFrOwoJCQl9CgkJCSRyb3dOdW1iZXIgPSAkcm93S2V5OwoJCQkkcm93VmFsdWUgPSAkcm93RGF0YVskZmlyc3RDb2x1bW5dOwoJCX0KCgkJaWYgKCRyb3dOdW1iZXIgIT09IGZhbHNlKSB7CgkJCWlmICgoISRub3RfZXhhY3RfbWF0Y2gpICYmICgkcm93VmFsdWUgIT0gJGxvb2t1cF92YWx1ZSkpIHsKCQkJCS8vCWlmIGFuIGV4YWN0IG1hdGNoIGlzIHJlcXVpcmVkLCB3ZSBoYXZlIHdoYXQgd2UgbmVlZCB0byByZXR1cm4gYW4gYXBwcm9wcmlhdGUgcmVzcG9uc2UKCQkJCXJldHVybiBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6Ok5BKCk7CgkJCX0gZWxzZSB7CgkJCQkvLwlvdGhlcndpc2UgcmV0dXJuIHRoZSBhcHByb3ByaWF0ZSB2YWx1ZQoJCQkJcmV0dXJuICRsb29rdXBfYXJyYXlbJHJvd051bWJlcl1bJHJldHVybkNvbHVtbl07CgkJCX0KCQl9CgoJCXJldHVybiBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6Ok5BKCk7Cgl9CS8vCWZ1bmN0aW9uIFZMT09LVVAoKQoKCgkvKioKCSAqIExPT0tVUAoJICogVGhlIExPT0tVUCBmdW5jdGlvbiBzZWFyY2hlcyBmb3IgdmFsdWUgZWl0aGVyIGZyb20gYSBvbmUtcm93IG9yIG9uZS1jb2x1bW4gcmFuZ2Ugb3IgZnJvbSBhbiBhcnJheS4KCSAqIEBwYXJhbQlsb29rdXBfdmFsdWUJVGhlIHZhbHVlIHRoYXQgeW91IHdhbnQgdG8gbWF0Y2ggaW4gbG9va3VwX2FycmF5CgkgKiBAcGFyYW0JbG9va3VwX3ZlY3RvcglUaGUgcmFuZ2Ugb2YgY2VsbHMgYmVpbmcgc2VhcmNoZWQKCSAqIEBwYXJhbQlyZXN1bHRfdmVjdG9yCVRoZSBjb2x1bW4gZnJvbSB3aGljaCB0aGUgbWF0Y2hpbmcgdmFsdWUgbXVzdCBiZSByZXR1cm5lZAoJICogQHJldHVybgltaXhlZAkJCVRoZSB2YWx1ZSBvZiB0aGUgZm91bmQgY2VsbAoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIExPT0tVUCgkbG9va3VwX3ZhbHVlLCAkbG9va3VwX3ZlY3RvciwgJHJlc3VsdF92ZWN0b3I9bnVsbCkgewoJCSRsb29rdXBfdmFsdWUJPSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5TaW5nbGVWYWx1ZSgkbG9va3VwX3ZhbHVlKTsKCgkJaWYgKCFpc19hcnJheSgkbG9va3VwX3ZlY3RvcikpIHsKCQkJcmV0dXJuIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6TkEoKTsKCQl9CgkJJGxvb2t1cFJvd3MgPSBjb3VudCgkbG9va3VwX3ZlY3Rvcik7CgkJJGwgPSBhcnJheV9rZXlzKCRsb29rdXBfdmVjdG9yKTsKCQkkbCA9IGFycmF5X3NoaWZ0KCRsKTsKCQkkbG9va3VwQ29sdW1ucyA9IGNvdW50KCRsb29rdXBfdmVjdG9yWyRsXSk7CgkJaWYgKCgoJGxvb2t1cFJvd3MgPT0gMSkgJiYgKCRsb29rdXBDb2x1bW5zID4gMSkpIHx8ICgoJGxvb2t1cFJvd3MgPT0gMikgJiYgKCRsb29rdXBDb2x1bW5zICE9IDIpKSkgewoJCQkkbG9va3VwX3ZlY3RvciA9IHNlbGY6OlRSQU5TUE9TRSgkbG9va3VwX3ZlY3Rvcik7CgkJCSRsb29rdXBSb3dzID0gY291bnQoJGxvb2t1cF92ZWN0b3IpOwoJCQkkbCA9IGFycmF5X2tleXMoJGxvb2t1cF92ZWN0b3IpOwoJCQkkbG9va3VwQ29sdW1ucyA9IGNvdW50KCRsb29rdXBfdmVjdG9yW2FycmF5X3NoaWZ0KCRsKV0pOwoJCX0KCgkJaWYgKGlzX251bGwoJHJlc3VsdF92ZWN0b3IpKSB7CgkJCSRyZXN1bHRfdmVjdG9yID0gJGxvb2t1cF92ZWN0b3I7CgkJfQoJCSRyZXN1bHRSb3dzID0gY291bnQoJHJlc3VsdF92ZWN0b3IpOwoJCSRsID0gYXJyYXlfa2V5cygkcmVzdWx0X3ZlY3Rvcik7CgkJJGwgPSBhcnJheV9zaGlmdCgkbCk7CgkJJHJlc3VsdENvbHVtbnMgPSBjb3VudCgkcmVzdWx0X3ZlY3RvclskbF0pOwoJCWlmICgoKCRyZXN1bHRSb3dzID09IDEpICYmICgkcmVzdWx0Q29sdW1ucyA+IDEpKSB8fCAoKCRyZXN1bHRSb3dzID09IDIpICYmICgkcmVzdWx0Q29sdW1ucyAhPSAyKSkpIHsKCQkJJHJlc3VsdF92ZWN0b3IgPSBzZWxmOjpUUkFOU1BPU0UoJHJlc3VsdF92ZWN0b3IpOwoJCQkkcmVzdWx0Um93cyA9IGNvdW50KCRyZXN1bHRfdmVjdG9yKTsKCQkJJHIgPSBhcnJheV9rZXlzKCRyZXN1bHRfdmVjdG9yKTsKCQkJJHJlc3VsdENvbHVtbnMgPSBjb3VudCgkcmVzdWx0X3ZlY3RvclthcnJheV9zaGlmdCgkcildKTsKCQl9CgoJCWlmICgkbG9va3VwUm93cyA9PSAyKSB7CgkJCSRyZXN1bHRfdmVjdG9yID0gYXJyYXlfcG9wKCRsb29rdXBfdmVjdG9yKTsKCQkJJGxvb2t1cF92ZWN0b3IgPSBhcnJheV9zaGlmdCgkbG9va3VwX3ZlY3Rvcik7CgkJfQoJCWlmICgkbG9va3VwQ29sdW1ucyAhPSAyKSB7CgkJCWZvcmVhY2goJGxvb2t1cF92ZWN0b3IgYXMgJiR2YWx1ZSkgewoJCQkJaWYgKGlzX2FycmF5KCR2YWx1ZSkpIHsKCQkJCQkkayA9IGFycmF5X2tleXMoJHZhbHVlKTsKCQkJCQkka2V5MSA9ICRrZXkyID0gYXJyYXlfc2hpZnQoJGspOwoJCQkJCSRrZXkyKys7CgkJCQkJJGRhdGFWYWx1ZTEgPSAkdmFsdWVbJGtleTFdOwoJCQkJfSBlbHNlIHsKCQkJCQkka2V5MSA9IDA7CgkJCQkJJGtleTIgPSAxOwoJCQkJCSRkYXRhVmFsdWUxID0gJHZhbHVlOwoJCQkJfQoJCQkJJGRhdGFWYWx1ZTIgPSBhcnJheV9zaGlmdCgkcmVzdWx0X3ZlY3Rvcik7CgkJCQlpZiAoaXNfYXJyYXkoJGRhdGFWYWx1ZTIpKSB7CgkJCQkJJGRhdGFWYWx1ZTIgPSBhcnJheV9zaGlmdCgkZGF0YVZhbHVlMik7CgkJCQl9CgkJCQkkdmFsdWUgPSBhcnJheSgka2V5MSA9PiAkZGF0YVZhbHVlMSwgJGtleTIgPT4gJGRhdGFWYWx1ZTIpOwoJCQl9CgkJCXVuc2V0KCR2YWx1ZSk7CgkJfQoKCQlyZXR1cm4gc2VsZjo6VkxPT0tVUCgkbG9va3VwX3ZhbHVlLCRsb29rdXBfdmVjdG9yLDIpOwogCX0JLy8JZnVuY3Rpb24gTE9PS1VQKCkKCn0JLy8JY2xhc3MgUEhQRXhjZWxfQ2FsY3VsYXRpb25fTG9va3VwUmVmCg==]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Calculation/MathTrig.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIFBIUEV4Y2VsCiAqCiAqIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKICoKICogQGNhdGVnb3J5CVBIUEV4Y2VsCiAqIEBwYWNrYWdlCQlQSFBFeGNlbF9DYWxjdWxhdGlvbgogKiBAY29weXJpZ2h0CUNvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwgKGh0dHA6Ly93d3cuY29kZXBsZXguY29tL1BIUEV4Y2VsKQogKiBAbGljZW5zZQkJaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL29sZC1saWNlbnNlcy9sZ3BsLTIuMS50eHQJTEdQTAogKiBAdmVyc2lvbgkJMS43LjcsIDIwMTItMDUtMTkKICovCgoKLyoqIFBIUEV4Y2VsIHJvb3QgZGlyZWN0b3J5ICovCmlmICghZGVmaW5lZCgnUEhQRVhDRUxfUk9PVCcpKSB7CgkvKioKCSAqIEBpZ25vcmUKCSAqLwoJZGVmaW5lKCdQSFBFWENFTF9ST09UJywgZGlybmFtZShfX0ZJTEVfXykgLiAnLy4uLy4uLycpOwoJcmVxdWlyZShQSFBFWENFTF9ST09UIC4gJ1BIUEV4Y2VsL0F1dG9sb2FkZXIucGhwJyk7Cn0KCgovKioKICogUEhQRXhjZWxfQ2FsY3VsYXRpb25fTWF0aFRyaWcKICoKICogQGNhdGVnb3J5CVBIUEV4Y2VsCiAqIEBwYWNrYWdlCQlQSFBFeGNlbF9DYWxjdWxhdGlvbgogKiBAY29weXJpZ2h0CUNvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwgKGh0dHA6Ly93d3cuY29kZXBsZXguY29tL1BIUEV4Y2VsKQogKi8KY2xhc3MgUEhQRXhjZWxfQ2FsY3VsYXRpb25fTWF0aFRyaWcgewoKCS8vCgkvLwlQcml2YXRlIG1ldGhvZCB0byByZXR1cm4gYW4gYXJyYXkgb2YgdGhlIGZhY3RvcnMgb2YgdGhlIGlucHV0IHZhbHVlCgkvLwoJcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gX2ZhY3RvcnMoJHZhbHVlKSB7CgkJJHN0YXJ0VmFsID0gZmxvb3Ioc3FydCgkdmFsdWUpKTsKCgkJJGZhY3RvckFycmF5ID0gYXJyYXkoKTsKCQlmb3IgKCRpID0gJHN0YXJ0VmFsOyAkaSA+IDE7IC0tJGkpIHsKCQkJaWYgKCgkdmFsdWUgJSAkaSkgPT0gMCkgewoJCQkJJGZhY3RvckFycmF5ID0gYXJyYXlfbWVyZ2UoJGZhY3RvckFycmF5LHNlbGY6Ol9mYWN0b3JzKCR2YWx1ZSAvICRpKSk7CgkJCQkkZmFjdG9yQXJyYXkgPSBhcnJheV9tZXJnZSgkZmFjdG9yQXJyYXksc2VsZjo6X2ZhY3RvcnMoJGkpKTsKCQkJCWlmICgkaSA8PSBzcXJ0KCR2YWx1ZSkpIHsKCQkJCQlicmVhazsKCQkJCX0KCQkJfQoJCX0KCQlpZiAoIWVtcHR5KCRmYWN0b3JBcnJheSkpIHsKCQkJcnNvcnQoJGZhY3RvckFycmF5KTsKCQkJcmV0dXJuICRmYWN0b3JBcnJheTsKCQl9IGVsc2UgewoJCQlyZXR1cm4gYXJyYXkoKGludGVnZXIpICR2YWx1ZSk7CgkJfQoJfQkvLwlmdW5jdGlvbiBfZmFjdG9ycygpCgoKCXByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIF9yb21hbkN1dCgkbnVtLCAkbikgewoJCXJldHVybiAoJG51bSAtICgkbnVtICUgJG4gKSApIC8gJG47Cgl9CS8vCWZ1bmN0aW9uIF9yb21hbkN1dCgpCgoKCS8qKgoJICogQVRBTjIKCSAqCgkgKiBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIGFyYyB0YW5nZW50IG9mIHRoZSB0d28gdmFyaWFibGVzIHggYW5kIHkuIEl0IGlzIHNpbWlsYXIgdG8KCSAqCQljYWxjdWxhdGluZyB0aGUgYXJjIHRhbmdlbnQgb2YgeSD3IHgsIGV4Y2VwdCB0aGF0IHRoZSBzaWducyBvZiBib3RoIGFyZ3VtZW50cyBhcmUgdXNlZAoJICoJCXRvIGRldGVybWluZSB0aGUgcXVhZHJhbnQgb2YgdGhlIHJlc3VsdC4KCSAqIFRoZSBhcmN0YW5nZW50IGlzIHRoZSBhbmdsZSBmcm9tIHRoZSB4LWF4aXMgdG8gYSBsaW5lIGNvbnRhaW5pbmcgdGhlIG9yaWdpbiAoMCwgMCkgYW5kIGEKCSAqCQlwb2ludCB3aXRoIGNvb3JkaW5hdGVzICh4Q29vcmRpbmF0ZSwgeUNvb3JkaW5hdGUpLiBUaGUgYW5nbGUgaXMgZ2l2ZW4gaW4gcmFkaWFucyBiZXR3ZWVuCgkgKgkJLXBpIGFuZCBwaSwgZXhjbHVkaW5nIC1waS4KCSAqCgkgKiBOb3RlIHRoYXQgdGhlIEV4Y2VsIEFUQU4yKCkgZnVuY3Rpb24gYWNjZXB0cyBpdHMgYXJndW1lbnRzIGluIHRoZSByZXZlcnNlIG9yZGVyIHRvIHRoZSBzdGFuZGFyZAoJICoJCVBIUCBhdGFuMigpIGZ1bmN0aW9uLCBzbyB3ZSBuZWVkIHRvIHJldmVyc2UgdGhlbSBoZXJlIGJlZm9yZSBjYWxsaW5nIHRoZSBQSFAgYXRhbigpIGZ1bmN0aW9uLgoJICoKCSAqIEV4Y2VsIEZ1bmN0aW9uOgoJICoJCUFUQU4yKHhDb29yZGluYXRlLHlDb29yZGluYXRlKQoJICoKCSAqIEBhY2Nlc3MJcHVibGljCgkgKiBAY2F0ZWdvcnkgTWF0aGVtYXRpY2FsIGFuZCBUcmlnb25vbWV0cmljIEZ1bmN0aW9ucwoJICogQHBhcmFtCWZsb2F0CSR4Q29vcmRpbmF0ZQkJVGhlIHgtY29vcmRpbmF0ZSBvZiB0aGUgcG9pbnQuCgkgKiBAcGFyYW0JZmxvYXQJJHlDb29yZGluYXRlCQlUaGUgeS1jb29yZGluYXRlIG9mIHRoZSBwb2ludC4KCSAqIEByZXR1cm4JZmxvYXQJVGhlIGludmVyc2UgdGFuZ2VudCBvZiB0aGUgc3BlY2lmaWVkIHgtIGFuZCB5LWNvb3JkaW5hdGVzLgoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIEFUQU4yKCR4Q29vcmRpbmF0ZSwgJHlDb29yZGluYXRlKSB7CgkJJHhDb29yZGluYXRlCT0gKGZsb2F0KSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5TaW5nbGVWYWx1ZSgkeENvb3JkaW5hdGUpOwoJCSR5Q29vcmRpbmF0ZQk9IChmbG9hdCkgUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuU2luZ2xlVmFsdWUoJHlDb29yZGluYXRlKTsKCgkJaWYgKCgkeENvb3JkaW5hdGUgPT0gMCkgJiYgKCR5Q29vcmRpbmF0ZSA9PSAwKSkgewoJCQlyZXR1cm4gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpESVYwKCk7CgkJfQoKCQlyZXR1cm4gYXRhbjIoJHlDb29yZGluYXRlLCAkeENvb3JkaW5hdGUpOwoJfQkvLwlmdW5jdGlvbiBSRVZFUlNFX0FUQU4yKCkKCgoJLyoqCgkgKiBDRUlMSU5HCgkgKgoJICogUmV0dXJucyBudW1iZXIgcm91bmRlZCB1cCwgYXdheSBmcm9tIHplcm8sIHRvIHRoZSBuZWFyZXN0IG11bHRpcGxlIG9mIHNpZ25pZmljYW5jZS4KCSAqCgkgKiBAcGFyYW0JZmxvYXQJJG51bWJlcgkJCU51bWJlciB0byByb3VuZAoJICogQHBhcmFtCWZsb2F0CSRzaWduaWZpY2FuY2UJU2lnbmlmaWNhbmNlCgkgKiBAcmV0dXJuCWZsb2F0CVJvdW5kZWQgTnVtYmVyCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gQ0VJTElORygkbnVtYmVyLCRzaWduaWZpY2FuY2U9bnVsbCkgewoJCSRudW1iZXIJCQk9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlblNpbmdsZVZhbHVlKCRudW1iZXIpOwoJCSRzaWduaWZpY2FuY2UJPSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5TaW5nbGVWYWx1ZSgkc2lnbmlmaWNhbmNlKTsKCgkJaWYgKChpc19udWxsKCRzaWduaWZpY2FuY2UpKSAmJiAoUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpnZXRDb21wYXRpYmlsaXR5TW9kZSgpID09IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6Q09NUEFUSUJJTElUWV9HTlVNRVJJQykpIHsKCQkJJHNpZ25pZmljYW5jZSA9ICRudW1iZXIvYWJzKCRudW1iZXIpOwoJCX0KCgkJaWYgKChpc19udW1lcmljKCRudW1iZXIpKSAmJiAoaXNfbnVtZXJpYygkc2lnbmlmaWNhbmNlKSkpIHsKCQkJaWYgKHNlbGY6OlNJR04oJG51bWJlcikgPT0gc2VsZjo6U0lHTigkc2lnbmlmaWNhbmNlKSkgewoJCQkJaWYgKCRzaWduaWZpY2FuY2UgPT0gMC4wKSB7CgkJCQkJcmV0dXJuIDA7CgkJCQl9CgkJCQlyZXR1cm4gY2VpbCgkbnVtYmVyIC8gJHNpZ25pZmljYW5jZSkgKiAkc2lnbmlmaWNhbmNlOwoJCQl9IGVsc2UgewoJCQkJcmV0dXJuIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6TmFOKCk7CgkJCX0KCQl9CgkJcmV0dXJuIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6VkFMVUUoKTsKCX0JLy8JZnVuY3Rpb24gQ0VJTElORygpCgoKCS8qKgoJICogQ09NQklOCgkgKgoJICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGNvbWJpbmF0aW9ucyBmb3IgYSBnaXZlbiBudW1iZXIgb2YgaXRlbXMuIFVzZSBDT01CSU4gdG8KCSAqCQlkZXRlcm1pbmUgdGhlIHRvdGFsIHBvc3NpYmxlIG51bWJlciBvZiBncm91cHMgZm9yIGEgZ2l2ZW4gbnVtYmVyIG9mIGl0ZW1zLgoJICoKCSAqIEBwYXJhbQlpbnQJCSRudW1PYmpzCU51bWJlciBvZiBkaWZmZXJlbnQgb2JqZWN0cwoJICogQHBhcmFtCWludAkJJG51bUluU2V0CU51bWJlciBvZiBvYmplY3RzIGluIGVhY2ggY29tYmluYXRpb24KCSAqIEByZXR1cm4JaW50CQlOdW1iZXIgb2YgY29tYmluYXRpb25zCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gQ09NQklOKCRudW1PYmpzLCRudW1JblNldCkgewoJCSRudW1PYmpzCT0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuU2luZ2xlVmFsdWUoJG51bU9ianMpOwoJCSRudW1JblNldAk9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlblNpbmdsZVZhbHVlKCRudW1JblNldCk7CgoJCWlmICgoaXNfbnVtZXJpYygkbnVtT2JqcykpICYmIChpc19udW1lcmljKCRudW1JblNldCkpKSB7CgkJCWlmICgkbnVtT2JqcyA8ICRudW1JblNldCkgewoJCQkJcmV0dXJuIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6TmFOKCk7CgkJCX0gZWxzZWlmICgkbnVtSW5TZXQgPCAwKSB7CgkJCQlyZXR1cm4gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpOYU4oKTsKCQkJfQoJCQlyZXR1cm4gcm91bmQoc2VsZjo6RkFDVCgkbnVtT2JqcykgLyBzZWxmOjpGQUNUKCRudW1PYmpzIC0gJG51bUluU2V0KSkgLyBzZWxmOjpGQUNUKCRudW1JblNldCk7CgkJfQoJCXJldHVybiBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OlZBTFVFKCk7Cgl9CS8vCWZ1bmN0aW9uIENPTUJJTigpCgoKCS8qKgoJICogRVZFTgoJICoKCSAqIFJldHVybnMgbnVtYmVyIHJvdW5kZWQgdXAgdG8gdGhlIG5lYXJlc3QgZXZlbiBpbnRlZ2VyLgoJICoKCSAqIEBwYXJhbQlmbG9hdAkkbnVtYmVyCQkJTnVtYmVyIHRvIHJvdW5kCgkgKiBAcmV0dXJuCWludAkJUm91bmRlZCBOdW1iZXIKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBFVkVOKCRudW1iZXIpIHsKCQkkbnVtYmVyCT0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuU2luZ2xlVmFsdWUoJG51bWJlcik7CgoJCWlmIChpc19udWxsKCRudW1iZXIpKSB7CgkJCXJldHVybiAwOwoJCX0gZWxzZWlmIChpc19ib29sKCRudW1iZXIpKSB7CgkJCSRudW1iZXIgPSAoaW50KSAkbnVtYmVyOwoJCX0KCgkJaWYgKGlzX251bWVyaWMoJG51bWJlcikpIHsKCQkJJHNpZ25pZmljYW5jZSA9IDIgKiBzZWxmOjpTSUdOKCRudW1iZXIpOwoJCQlyZXR1cm4gKGludCkgc2VsZjo6Q0VJTElORygkbnVtYmVyLCRzaWduaWZpY2FuY2UpOwoJCX0KCQlyZXR1cm4gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpWQUxVRSgpOwoJfQkvLwlmdW5jdGlvbiBFVkVOKCkKCgoJLyoqCgkgKiBGQUNUCgkgKgoJICogUmV0dXJucyB0aGUgZmFjdG9yaWFsIG9mIGEgbnVtYmVyLgoJICoKCSAqIEBwYXJhbQlmbG9hdAkkZmFjdFZhbAlGYWN0b3JpYWwgVmFsdWUKCSAqIEByZXR1cm4JaW50CQlGYWN0b3JpYWwKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBGQUNUKCRmYWN0VmFsKSB7CgkJJGZhY3RWYWwJPSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5TaW5nbGVWYWx1ZSgkZmFjdFZhbCk7CgoJCWlmIChpc19udW1lcmljKCRmYWN0VmFsKSkgewoJCQlpZiAoJGZhY3RWYWwgPCAwKSB7CgkJCQlyZXR1cm4gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpOYU4oKTsKCQkJfQoJCQkkZmFjdExvb3AgPSBmbG9vcigkZmFjdFZhbCk7CgkJCWlmIChQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmdldENvbXBhdGliaWxpdHlNb2RlKCkgPT0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpDT01QQVRJQklMSVRZX0dOVU1FUklDKSB7CgkJCQlpZiAoJGZhY3RWYWwgPiAkZmFjdExvb3ApIHsKCQkJCQlyZXR1cm4gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpOYU4oKTsKCQkJCX0KCQkJfQoKCQkJJGZhY3RvcmlhbCA9IDE7CgkJCXdoaWxlICgkZmFjdExvb3AgPiAxKSB7CgkJCQkkZmFjdG9yaWFsICo9ICRmYWN0TG9vcC0tOwoJCQl9CgkJCXJldHVybiAkZmFjdG9yaWFsIDsKCQl9CgkJcmV0dXJuIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6VkFMVUUoKTsKCX0JLy8JZnVuY3Rpb24gRkFDVCgpCgoKCS8qKgoJICogRkFDVERPVUJMRQoJICoKCSAqIFJldHVybnMgdGhlIGRvdWJsZSBmYWN0b3JpYWwgb2YgYSBudW1iZXIuCgkgKgoJICogQHBhcmFtCWZsb2F0CSRmYWN0VmFsCUZhY3RvcmlhbCBWYWx1ZQoJICogQHJldHVybglpbnQJCURvdWJsZSBGYWN0b3JpYWwKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBGQUNURE9VQkxFKCRmYWN0VmFsKSB7CgkJJGZhY3RMb29wCT0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuU2luZ2xlVmFsdWUoJGZhY3RWYWwpOwoKCQlpZiAoaXNfbnVtZXJpYygkZmFjdExvb3ApKSB7CgkJCSRmYWN0TG9vcAk9IGZsb29yKCRmYWN0TG9vcCk7CgkJCWlmICgkZmFjdFZhbCA8IDApIHsKCQkJCXJldHVybiBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6Ok5hTigpOwoJCQl9CgkJCSRmYWN0b3JpYWwgPSAxOwoJCQl3aGlsZSAoJGZhY3RMb29wID4gMSkgewoJCQkJJGZhY3RvcmlhbCAqPSAkZmFjdExvb3AtLTsKCQkJCS0tJGZhY3RMb29wOwoJCQl9CgkJCXJldHVybiAkZmFjdG9yaWFsIDsKCQl9CgkJcmV0dXJuIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6VkFMVUUoKTsKCX0JLy8JZnVuY3Rpb24gRkFDVERPVUJMRSgpCgoKCS8qKgoJICogRkxPT1IKCSAqCgkgKiBSb3VuZHMgbnVtYmVyIGRvd24sIHRvd2FyZCB6ZXJvLCB0byB0aGUgbmVhcmVzdCBtdWx0aXBsZSBvZiBzaWduaWZpY2FuY2UuCgkgKgoJICogQHBhcmFtCWZsb2F0CSRudW1iZXIJCQlOdW1iZXIgdG8gcm91bmQKCSAqIEBwYXJhbQlmbG9hdAkkc2lnbmlmaWNhbmNlCVNpZ25pZmljYW5jZQoJICogQHJldHVybglmbG9hdAlSb3VuZGVkIE51bWJlcgoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIEZMT09SKCRudW1iZXIsJHNpZ25pZmljYW5jZT1udWxsKSB7CgkJJG51bWJlcgkJCT0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuU2luZ2xlVmFsdWUoJG51bWJlcik7CgkJJHNpZ25pZmljYW5jZQk9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlblNpbmdsZVZhbHVlKCRzaWduaWZpY2FuY2UpOwoKCQlpZiAoKGlzX251bGwoJHNpZ25pZmljYW5jZSkpICYmIChQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmdldENvbXBhdGliaWxpdHlNb2RlKCkgPT0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpDT01QQVRJQklMSVRZX0dOVU1FUklDKSkgewoJCQkkc2lnbmlmaWNhbmNlID0gJG51bWJlci9hYnMoJG51bWJlcik7CgkJfQoKCQlpZiAoKGlzX251bWVyaWMoJG51bWJlcikpICYmIChpc19udW1lcmljKCRzaWduaWZpY2FuY2UpKSkgewoJCQlpZiAoKGZsb2F0KSAkc2lnbmlmaWNhbmNlID09IDAuMCkgewoJCQkJcmV0dXJuIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6RElWMCgpOwoJCQl9CgkJCWlmIChzZWxmOjpTSUdOKCRudW1iZXIpID09IHNlbGY6OlNJR04oJHNpZ25pZmljYW5jZSkpIHsKCQkJCXJldHVybiBmbG9vcigkbnVtYmVyIC8gJHNpZ25pZmljYW5jZSkgKiAkc2lnbmlmaWNhbmNlOwoJCQl9IGVsc2UgewoJCQkJcmV0dXJuIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6TmFOKCk7CgkJCX0KCQl9CgkJcmV0dXJuIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6VkFMVUUoKTsKCX0JLy8JZnVuY3Rpb24gRkxPT1IoKQoKCgkvKioKCSAqIEdDRAoJICoKCSAqIFJldHVybnMgdGhlIGdyZWF0ZXN0IGNvbW1vbiBkaXZpc29yIG9mIGEgc2VyaWVzIG9mIG51bWJlcnMKCSAqCgkgKiBAcGFyYW0JJGFycmF5CVZhbHVlcyB0byBjYWxjdWxhdGUgdGhlIEdyZWF0ZXN0IENvbW1vbiBEaXZpc29yCgkgKiBAcmV0dXJuCWludAkJR3JlYXRlc3QgQ29tbW9uIERpdmlzb3IKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBHQ0QoKSB7CgkJJHJldHVyblZhbHVlID0gMTsKCQkkYWxsUG93ZXJlZEZhY3RvcnMgPSBhcnJheSgpOwoJCS8vIExvb3AgdGhyb3VnaCBhcmd1bWVudHMKCQlmb3JlYWNoKFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlbkFycmF5KGZ1bmNfZ2V0X2FyZ3MoKSkgYXMgJHZhbHVlKSB7CgkJCWlmICghaXNfbnVtZXJpYygkdmFsdWUpKSB7CgkJCQlyZXR1cm4gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpWQUxVRSgpOwoJCQl9IGVsc2VpZiAoJHZhbHVlID09IDApIHsKCQkJCWJyZWFrOwoJCQl9IGVsc2VpZigkdmFsdWUgPCAwKSB7CgkJCQlyZXR1cm4gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpOYU4oKTsKCQkJfQoJCQkkbXlGYWN0b3JzID0gc2VsZjo6X2ZhY3RvcnMoJHZhbHVlKTsKCQkJJG15Q291bnRlZEZhY3RvcnMgPSBhcnJheV9jb3VudF92YWx1ZXMoJG15RmFjdG9ycyk7CgkJCSRhbGxWYWx1ZXNGYWN0b3JzW10gPSAkbXlDb3VudGVkRmFjdG9yczsKCQl9CgkJJGFsbFZhbHVlc0NvdW50ID0gY291bnQoJGFsbFZhbHVlc0ZhY3RvcnMpOwoJCSRtZXJnZWRBcnJheSA9ICRhbGxWYWx1ZXNGYWN0b3JzWzBdOwoJCWZvciAoJGk9MTskaSA8ICRhbGxWYWx1ZXNDb3VudDsgKyskaSkgewoJCQkkbWVyZ2VkQXJyYXkgPSBhcnJheV9pbnRlcnNlY3Rfa2V5KCRtZXJnZWRBcnJheSwkYWxsVmFsdWVzRmFjdG9yc1skaV0pOwoJCX0KCQkkbWVyZ2VkQXJyYXlWYWx1ZXMgPSBjb3VudCgkbWVyZ2VkQXJyYXkpOwoJCWlmICgkbWVyZ2VkQXJyYXlWYWx1ZXMgPT0gMCkgewoJCQlyZXR1cm4gJHJldHVyblZhbHVlOwoJCX0gZWxzZWlmICgkbWVyZ2VkQXJyYXlWYWx1ZXMgPiAxKSB7CgkJCWZvcmVhY2goJG1lcmdlZEFycmF5IGFzICRtZXJnZWRLZXkgPT4gJG1lcmdlZFZhbHVlKSB7CgkJCQlmb3JlYWNoKCRhbGxWYWx1ZXNGYWN0b3JzIGFzICRoaWdoZXN0UG93ZXJUZXN0KSB7CgkJCQkJZm9yZWFjaCgkaGlnaGVzdFBvd2VyVGVzdCBhcyAkdGVzdEtleSA9PiAkdGVzdFZhbHVlKSB7CgkJCQkJCWlmICgoJHRlc3RLZXkgPT0gJG1lcmdlZEtleSkgJiYgKCR0ZXN0VmFsdWUgPCAkbWVyZ2VkVmFsdWUpKSB7CgkJCQkJCQkkbWVyZ2VkQXJyYXlbJG1lcmdlZEtleV0gPSAkdGVzdFZhbHVlOwoJCQkJCQkJJG1lcmdlZFZhbHVlID0gJHRlc3RWYWx1ZTsKCQkJCQkJfQoJCQkJCX0KCQkJCX0KCQkJfQoKCQkJJHJldHVyblZhbHVlID0gMTsKCQkJZm9yZWFjaCgkbWVyZ2VkQXJyYXkgYXMgJGtleSA9PiAkdmFsdWUpIHsKCQkJCSRyZXR1cm5WYWx1ZSAqPSBwb3coJGtleSwkdmFsdWUpOwoJCQl9CgkJCXJldHVybiAkcmV0dXJuVmFsdWU7CgkJfSBlbHNlIHsKCQkJJGtleXMgPSBhcnJheV9rZXlzKCRtZXJnZWRBcnJheSk7CgkJCSRrZXkgPSAka2V5c1swXTsKCQkJJHZhbHVlID0gJG1lcmdlZEFycmF5WyRrZXldOwoJCQlmb3JlYWNoKCRhbGxWYWx1ZXNGYWN0b3JzIGFzICR0ZXN0VmFsdWUpIHsKCQkJCWZvcmVhY2goJHRlc3RWYWx1ZSBhcyAkbWVyZ2VkS2V5ID0+ICRtZXJnZWRWYWx1ZSkgewoJCQkJCWlmICgoJG1lcmdlZEtleSA9PSAka2V5KSAmJiAoJG1lcmdlZFZhbHVlIDwgJHZhbHVlKSkgewoJCQkJCQkkdmFsdWUgPSAkbWVyZ2VkVmFsdWU7CgkJCQkJfQoJCQkJfQoJCQl9CgkJCXJldHVybiBwb3coJGtleSwkdmFsdWUpOwoJCX0KCX0JLy8JZnVuY3Rpb24gR0NEKCkKCgoJLyoqCgkgKiBJTlQKCSAqCgkgKiBDYXN0cyBhIGZsb2F0aW5nIHBvaW50IHZhbHVlIHRvIGFuIGludGVnZXIKCSAqCgkgKiBAcGFyYW0JZmxvYXQJJG51bWJlcgkJCU51bWJlciB0byBjYXN0IHRvIGFuIGludGVnZXIKCSAqIEByZXR1cm4JaW50ZWdlcglJbnRlZ2VyIHZhbHVlCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gSU5UKCRudW1iZXIpIHsKCQkkbnVtYmVyCT0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuU2luZ2xlVmFsdWUoJG51bWJlcik7CgoJCWlmIChpc19udWxsKCRudW1iZXIpKSB7CgkJCXJldHVybiAwOwoJCX0gZWxzZWlmIChpc19ib29sKCRudW1iZXIpKSB7CgkJCXJldHVybiAoaW50KSAkbnVtYmVyOwoJCX0KCQlpZiAoaXNfbnVtZXJpYygkbnVtYmVyKSkgewoJCQlyZXR1cm4gKGludCkgZmxvb3IoJG51bWJlcik7CgkJfQoJCXJldHVybiBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OlZBTFVFKCk7Cgl9CS8vCWZ1bmN0aW9uIElOVCgpCgoKCS8qKgoJICogTENNCgkgKgoJICogUmV0dXJucyB0aGUgbG93ZXN0IGNvbW1vbiBtdWx0aXBsaWVyIG9mIGEgc2VyaWVzIG9mIG51bWJlcnMKCSAqCgkgKiBAcGFyYW0JJGFycmF5CVZhbHVlcyB0byBjYWxjdWxhdGUgdGhlIExvd2VzdCBDb21tb24gTXVsdGlwbGllcgoJICogQHJldHVybglpbnQJCUxvd2VzdCBDb21tb24gTXVsdGlwbGllcgoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIExDTSgpIHsKCQkkcmV0dXJuVmFsdWUgPSAxOwoJCSRhbGxQb3dlcmVkRmFjdG9ycyA9IGFycmF5KCk7CgkJLy8gTG9vcCB0aHJvdWdoIGFyZ3VtZW50cwoJCWZvcmVhY2goUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuQXJyYXkoZnVuY19nZXRfYXJncygpKSBhcyAkdmFsdWUpIHsKCQkJaWYgKCFpc19udW1lcmljKCR2YWx1ZSkpIHsKCQkJCXJldHVybiBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OlZBTFVFKCk7CgkJCX0KCQkJaWYgKCR2YWx1ZSA9PSAwKSB7CgkJCQlyZXR1cm4gMDsKCQkJfSBlbHNlaWYgKCR2YWx1ZSA8IDApIHsKCQkJCXJldHVybiBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6Ok5hTigpOwoJCQl9CgkJCSRteUZhY3RvcnMgPSBzZWxmOjpfZmFjdG9ycyhmbG9vcigkdmFsdWUpKTsKCQkJJG15Q291bnRlZEZhY3RvcnMgPSBhcnJheV9jb3VudF92YWx1ZXMoJG15RmFjdG9ycyk7CgkJCSRteVBvd2VyZWRGYWN0b3JzID0gYXJyYXkoKTsKCQkJZm9yZWFjaCgkbXlDb3VudGVkRmFjdG9ycyBhcyAkbXlDb3VudGVkRmFjdG9yID0+ICRteUNvdW50ZWRQb3dlcikgewoJCQkJJG15UG93ZXJlZEZhY3RvcnNbJG15Q291bnRlZEZhY3Rvcl0gPSBwb3coJG15Q291bnRlZEZhY3RvciwkbXlDb3VudGVkUG93ZXIpOwoJCQl9CgkJCWZvcmVhY2goJG15UG93ZXJlZEZhY3RvcnMgYXMgJG15UG93ZXJlZFZhbHVlID0+ICRteVBvd2VyZWRGYWN0b3IpIHsKCQkJCWlmIChhcnJheV9rZXlfZXhpc3RzKCRteVBvd2VyZWRWYWx1ZSwkYWxsUG93ZXJlZEZhY3RvcnMpKSB7CgkJCQkJaWYgKCRhbGxQb3dlcmVkRmFjdG9yc1skbXlQb3dlcmVkVmFsdWVdIDwgJG15UG93ZXJlZEZhY3RvcikgewoJCQkJCQkkYWxsUG93ZXJlZEZhY3RvcnNbJG15UG93ZXJlZFZhbHVlXSA9ICRteVBvd2VyZWRGYWN0b3I7CgkJCQkJfQoJCQkJfSBlbHNlIHsKCQkJCQkkYWxsUG93ZXJlZEZhY3RvcnNbJG15UG93ZXJlZFZhbHVlXSA9ICRteVBvd2VyZWRGYWN0b3I7CgkJCQl9CgkJCX0KCQl9CgkJZm9yZWFjaCgkYWxsUG93ZXJlZEZhY3RvcnMgYXMgJGFsbFBvd2VyZWRGYWN0b3IpIHsKCQkJJHJldHVyblZhbHVlICo9IChpbnRlZ2VyKSAkYWxsUG93ZXJlZEZhY3RvcjsKCQl9CgkJcmV0dXJuICRyZXR1cm5WYWx1ZTsKCX0JLy8JZnVuY3Rpb24gTENNKCkKCgoJLyoqCgkgKiBMT0dfQkFTRQoJICoKCSAqIFJldHVybnMgdGhlIGxvZ2FyaXRobSBvZiBhIG51bWJlciB0byBhIHNwZWNpZmllZCBiYXNlLiBUaGUgZGVmYXVsdCBiYXNlIGlzIDEwLgoJICoKCSAqIEV4Y2VsIEZ1bmN0aW9uOgoJICoJCUxPRyhudW1iZXJbLGJhc2VdKQoJICoKCSAqIEBhY2Nlc3MJcHVibGljCgkgKiBAY2F0ZWdvcnkgTWF0aGVtYXRpY2FsIGFuZCBUcmlnb25vbWV0cmljIEZ1bmN0aW9ucwoJICogQHBhcmFtCWZsb2F0CSR2YWx1ZQkJVGhlIHBvc2l0aXZlIHJlYWwgbnVtYmVyIGZvciB3aGljaCB5b3Ugd2FudCB0aGUgbG9nYXJpdGhtCgkgKiBAcGFyYW0JZmxvYXQJJGJhc2UJCVRoZSBiYXNlIG9mIHRoZSBsb2dhcml0aG0uIElmIGJhc2UgaXMgb21pdHRlZCwgaXQgaXMgYXNzdW1lZCB0byBiZSAxMC4KCSAqIEByZXR1cm4JZmxvYXQKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBMT0dfQkFTRSgkbnVtYmVyID0gTlVMTCwgJGJhc2U9MTApIHsKCQkkbnVtYmVyCT0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuU2luZ2xlVmFsdWUoJG51bWJlcik7CgkJJGJhc2UJPSAoaXNfbnVsbCgkYmFzZSkpCT8gMTAgOgkoZmxvYXQpIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlblNpbmdsZVZhbHVlKCRiYXNlKTsKCgkJaWYgKCghaXNfbnVtZXJpYygkYmFzZSkpIHx8ICghaXNfbnVtZXJpYygkbnVtYmVyKSkpCgkJCXJldHVybiBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OlZBTFVFKCk7CgkJaWYgKCgkYmFzZSA8PSAwKSB8fCAoJG51bWJlciA8PSAwKSkKCQkJcmV0dXJuIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6TmFOKCk7CgkJcmV0dXJuIGxvZygkbnVtYmVyLCAkYmFzZSk7Cgl9CS8vCWZ1bmN0aW9uIExPR19CQVNFKCkKCgoJLyoqCgkgKiBNREVURVJNCgkgKgoJICogQHBhcmFtCWFycmF5CSRtYXRyaXhWYWx1ZXMJQSBtYXRyaXggb2YgdmFsdWVzCgkgKiBAcmV0dXJuCWZsb2F0CgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gTURFVEVSTSgkbWF0cml4VmFsdWVzKSB7CgkJJG1hdHJpeERhdGEgPSBhcnJheSgpOwoJCWlmICghaXNfYXJyYXkoJG1hdHJpeFZhbHVlcykpIHsgJG1hdHJpeFZhbHVlcyA9IGFycmF5KGFycmF5KCRtYXRyaXhWYWx1ZXMpKTsgfQoKCQkkcm93ID0gJG1heENvbHVtbiA9IDA7CgkJZm9yZWFjaCgkbWF0cml4VmFsdWVzIGFzICRtYXRyaXhSb3cpIHsKCQkJJGNvbHVtbiA9IDA7CgkJCWZvcmVhY2goJG1hdHJpeFJvdyBhcyAkbWF0cml4Q2VsbCkgewoJCQkJaWYgKChpc19zdHJpbmcoJG1hdHJpeENlbGwpKSB8fCAoJG1hdHJpeENlbGwgPT09IG51bGwpKSB7CgkJCQkJcmV0dXJuIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6VkFMVUUoKTsKCQkJCX0KCQkJCSRtYXRyaXhEYXRhWyRjb2x1bW5dWyRyb3ddID0gJG1hdHJpeENlbGw7CgkJCQkrKyRjb2x1bW47CgkJCX0KCQkJaWYgKCRjb2x1bW4gPiAkbWF4Q29sdW1uKSB7ICRtYXhDb2x1bW4gPSAkY29sdW1uOyB9CgkJCSsrJHJvdzsKCQl9CgkJaWYgKCRyb3cgIT0gJG1heENvbHVtbikgeyByZXR1cm4gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpWQUxVRSgpOyB9CgoJCXRyeSB7CgkJCSRtYXRyaXggPSBuZXcgUEhQRXhjZWxfU2hhcmVkX0pBTUFfTWF0cml4KCRtYXRyaXhEYXRhKTsKCQkJcmV0dXJuICRtYXRyaXgtPmRldCgpOwoJCX0gY2F0Y2ggKEV4Y2VwdGlvbiAkZXgpIHsKCQkJcmV0dXJuIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6VkFMVUUoKTsKCQl9Cgl9CS8vCWZ1bmN0aW9uIE1ERVRFUk0oKQoKCgkvKioKCSAqIE1JTlZFUlNFCgkgKgoJICogQHBhcmFtCWFycmF5CSRtYXRyaXhWYWx1ZXMJQSBtYXRyaXggb2YgdmFsdWVzCgkgKiBAcmV0dXJuCWFycmF5CgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gTUlOVkVSU0UoJG1hdHJpeFZhbHVlcykgewoJCSRtYXRyaXhEYXRhID0gYXJyYXkoKTsKCQlpZiAoIWlzX2FycmF5KCRtYXRyaXhWYWx1ZXMpKSB7ICRtYXRyaXhWYWx1ZXMgPSBhcnJheShhcnJheSgkbWF0cml4VmFsdWVzKSk7IH0KCgkJJHJvdyA9ICRtYXhDb2x1bW4gPSAwOwoJCWZvcmVhY2goJG1hdHJpeFZhbHVlcyBhcyAkbWF0cml4Um93KSB7CgkJCSRjb2x1bW4gPSAwOwoJCQlmb3JlYWNoKCRtYXRyaXhSb3cgYXMgJG1hdHJpeENlbGwpIHsKCQkJCWlmICgoaXNfc3RyaW5nKCRtYXRyaXhDZWxsKSkgfHwgKCRtYXRyaXhDZWxsID09PSBudWxsKSkgewoJCQkJCXJldHVybiBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OlZBTFVFKCk7CgkJCQl9CgkJCQkkbWF0cml4RGF0YVskY29sdW1uXVskcm93XSA9ICRtYXRyaXhDZWxsOwoJCQkJKyskY29sdW1uOwoJCQl9CgkJCWlmICgkY29sdW1uID4gJG1heENvbHVtbikgeyAkbWF4Q29sdW1uID0gJGNvbHVtbjsgfQoJCQkrKyRyb3c7CgkJfQoJCWlmICgkcm93ICE9ICRtYXhDb2x1bW4pIHsgcmV0dXJuIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6VkFMVUUoKTsgfQoKCQl0cnkgewoJCQkkbWF0cml4ID0gbmV3IFBIUEV4Y2VsX1NoYXJlZF9KQU1BX01hdHJpeCgkbWF0cml4RGF0YSk7CgkJCXJldHVybiAkbWF0cml4LT5pbnZlcnNlKCktPmdldEFycmF5KCk7CgkJfSBjYXRjaCAoRXhjZXB0aW9uICRleCkgewoJCQlyZXR1cm4gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpWQUxVRSgpOwoJCX0KCX0JLy8JZnVuY3Rpb24gTUlOVkVSU0UoKQoKCgkvKioKCSAqIE1NVUxUCgkgKgoJICogQHBhcmFtCWFycmF5CSRtYXRyaXhEYXRhMQlBIG1hdHJpeCBvZiB2YWx1ZXMKCSAqIEBwYXJhbQlhcnJheQkkbWF0cml4RGF0YTIJQSBtYXRyaXggb2YgdmFsdWVzCgkgKiBAcmV0dXJuCWFycmF5CgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gTU1VTFQoJG1hdHJpeERhdGExLCRtYXRyaXhEYXRhMikgewoJCSRtYXRyaXhBRGF0YSA9ICRtYXRyaXhCRGF0YSA9IGFycmF5KCk7CgkJaWYgKCFpc19hcnJheSgkbWF0cml4RGF0YTEpKSB7ICRtYXRyaXhEYXRhMSA9IGFycmF5KGFycmF5KCRtYXRyaXhEYXRhMSkpOyB9CgkJaWYgKCFpc19hcnJheSgkbWF0cml4RGF0YTIpKSB7ICRtYXRyaXhEYXRhMiA9IGFycmF5KGFycmF5KCRtYXRyaXhEYXRhMikpOyB9CgoJCSRyb3dBID0gMDsKCQlmb3JlYWNoKCRtYXRyaXhEYXRhMSBhcyAkbWF0cml4Um93KSB7CgkJCSRjb2x1bW5BID0gMDsKCQkJZm9yZWFjaCgkbWF0cml4Um93IGFzICRtYXRyaXhDZWxsKSB7CgkJCQlpZiAoKGlzX3N0cmluZygkbWF0cml4Q2VsbCkpIHx8ICgkbWF0cml4Q2VsbCA9PT0gbnVsbCkpIHsKCQkJCQlyZXR1cm4gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpWQUxVRSgpOwoJCQkJfQoJCQkJJG1hdHJpeEFEYXRhWyRyb3dBXVskY29sdW1uQV0gPSAkbWF0cml4Q2VsbDsKCQkJCSsrJGNvbHVtbkE7CgkJCX0KCQkJKyskcm93QTsKCQl9CgkJdHJ5IHsKCQkJJG1hdHJpeEEgPSBuZXcgUEhQRXhjZWxfU2hhcmVkX0pBTUFfTWF0cml4KCRtYXRyaXhBRGF0YSk7CgkJCSRyb3dCID0gMDsKCQkJZm9yZWFjaCgkbWF0cml4RGF0YTIgYXMgJG1hdHJpeFJvdykgewoJCQkJJGNvbHVtbkIgPSAwOwoJCQkJZm9yZWFjaCgkbWF0cml4Um93IGFzICRtYXRyaXhDZWxsKSB7CgkJCQkJaWYgKChpc19zdHJpbmcoJG1hdHJpeENlbGwpKSB8fCAoJG1hdHJpeENlbGwgPT09IG51bGwpKSB7CgkJCQkJCXJldHVybiBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OlZBTFVFKCk7CgkJCQkJfQoJCQkJCSRtYXRyaXhCRGF0YVskcm93Ql1bJGNvbHVtbkJdID0gJG1hdHJpeENlbGw7CgkJCQkJKyskY29sdW1uQjsKCQkJCX0KCQkJCSsrJHJvd0I7CgkJCX0KCQkJJG1hdHJpeEIgPSBuZXcgUEhQRXhjZWxfU2hhcmVkX0pBTUFfTWF0cml4KCRtYXRyaXhCRGF0YSk7CgoJCQlpZiAoKCRyb3dBICE9ICRjb2x1bW5CKSB8fCAoJHJvd0IgIT0gJGNvbHVtbkEpKSB7CgkJCQlyZXR1cm4gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpWQUxVRSgpOwoJCQl9CgoJCQlyZXR1cm4gJG1hdHJpeEEtPnRpbWVzKCRtYXRyaXhCKS0+Z2V0QXJyYXkoKTsKCQl9IGNhdGNoIChFeGNlcHRpb24gJGV4KSB7CgkJCXJldHVybiBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OlZBTFVFKCk7CgkJfQoJfQkvLwlmdW5jdGlvbiBNTVVMVCgpCgoKCS8qKgoJICogTU9ECgkgKgoJICogQHBhcmFtCWludAkJJGEJCURpdmlkZW5kCgkgKiBAcGFyYW0JaW50CQkkYgkJRGl2aXNvcgoJICogQHJldHVybglpbnQJCVJlbWFpbmRlcgoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIE1PRCgkYSA9IDEsICRiID0gMSkgewoJCSRhCQk9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlblNpbmdsZVZhbHVlKCRhKTsKCQkkYgkJPSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5TaW5nbGVWYWx1ZSgkYik7CgoJCWlmICgkYiA9PSAwLjApIHsKCQkJcmV0dXJuIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6RElWMCgpOwoJCX0gZWxzZWlmICgoJGEgPCAwLjApICYmICgkYiA+IDAuMCkpIHsKCQkJcmV0dXJuICRiIC0gZm1vZChhYnMoJGEpLCRiKTsKCQl9IGVsc2VpZiAoKCRhID4gMC4wKSAmJiAoJGIgPCAwLjApKSB7CgkJCXJldHVybiAkYiArIGZtb2QoJGEsYWJzKCRiKSk7CgkJfQoKCQlyZXR1cm4gZm1vZCgkYSwkYik7Cgl9CS8vCWZ1bmN0aW9uIE1PRCgpCgoKCS8qKgoJICogTVJPVU5ECgkgKgoJICogUm91bmRzIGEgbnVtYmVyIHRvIHRoZSBuZWFyZXN0IG11bHRpcGxlIG9mIGEgc3BlY2lmaWVkIHZhbHVlCgkgKgoJICogQHBhcmFtCWZsb2F0CSRudW1iZXIJCQlOdW1iZXIgdG8gcm91bmQKCSAqIEBwYXJhbQlpbnQJCSRtdWx0aXBsZQkJTXVsdGlwbGUgdG8gd2hpY2ggeW91IHdhbnQgdG8gcm91bmQgJG51bWJlcgoJICogQHJldHVybglmbG9hdAlSb3VuZGVkIE51bWJlcgoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIE1ST1VORCgkbnVtYmVyLCRtdWx0aXBsZSkgewoJCSRudW1iZXIJCT0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuU2luZ2xlVmFsdWUoJG51bWJlcik7CgkJJG11bHRpcGxlCT0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuU2luZ2xlVmFsdWUoJG11bHRpcGxlKTsKCgkJaWYgKChpc19udW1lcmljKCRudW1iZXIpKSAmJiAoaXNfbnVtZXJpYygkbXVsdGlwbGUpKSkgewoJCQlpZiAoJG11bHRpcGxlID09IDApIHsKCQkJCXJldHVybiAwOwoJCQl9CgkJCWlmICgoc2VsZjo6U0lHTigkbnVtYmVyKSkgPT0gKHNlbGY6OlNJR04oJG11bHRpcGxlKSkpIHsKCQkJCSRtdWx0aXBsaWVyID0gMSAvICRtdWx0aXBsZTsKCQkJCXJldHVybiByb3VuZCgkbnVtYmVyICogJG11bHRpcGxpZXIpIC8gJG11bHRpcGxpZXI7CgkJCX0KCQkJcmV0dXJuIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6TmFOKCk7CgkJfQoJCXJldHVybiBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OlZBTFVFKCk7Cgl9CS8vCWZ1bmN0aW9uIE1ST1VORCgpCgoKCS8qKgoJICogTVVMVElOT01JQUwKCSAqCgkgKiBSZXR1cm5zIHRoZSByYXRpbyBvZiB0aGUgZmFjdG9yaWFsIG9mIGEgc3VtIG9mIHZhbHVlcyB0byB0aGUgcHJvZHVjdCBvZiBmYWN0b3JpYWxzLgoJICoKCSAqIEBwYXJhbQlhcnJheSBvZiBtaXhlZAkJRGF0YSBTZXJpZXMKCSAqIEByZXR1cm4JZmxvYXQKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBNVUxUSU5PTUlBTCgpIHsKCQkkc3VtbWVyID0gMDsKCQkkZGl2aXNvciA9IDE7CgkJLy8gTG9vcCB0aHJvdWdoIGFyZ3VtZW50cwoJCWZvcmVhY2ggKFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlbkFycmF5KGZ1bmNfZ2V0X2FyZ3MoKSkgYXMgJGFyZykgewoJCQkvLyBJcyBpdCBhIG51bWVyaWMgdmFsdWU/CgkJCWlmIChpc19udW1lcmljKCRhcmcpKSB7CgkJCQlpZiAoJGFyZyA8IDEpIHsKCQkJCQlyZXR1cm4gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpOYU4oKTsKCQkJCX0KCQkJCSRzdW1tZXIgKz0gZmxvb3IoJGFyZyk7CgkJCQkkZGl2aXNvciAqPSBzZWxmOjpGQUNUKCRhcmcpOwoJCQl9IGVsc2UgewoJCQkJcmV0dXJuIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6VkFMVUUoKTsKCQkJfQoJCX0KCgkJLy8gUmV0dXJuCgkJaWYgKCRzdW1tZXIgPiAwKSB7CgkJCSRzdW1tZXIgPSBzZWxmOjpGQUNUKCRzdW1tZXIpOwoJCQlyZXR1cm4gJHN1bW1lciAvICRkaXZpc29yOwoJCX0KCQlyZXR1cm4gMDsKCX0JLy8JZnVuY3Rpb24gTVVMVElOT01JQUwoKQoKCgkvKioKCSAqIE9ERAoJICoKCSAqIFJldHVybnMgbnVtYmVyIHJvdW5kZWQgdXAgdG8gdGhlIG5lYXJlc3Qgb2RkIGludGVnZXIuCgkgKgoJICogQHBhcmFtCWZsb2F0CSRudW1iZXIJCQlOdW1iZXIgdG8gcm91bmQKCSAqIEByZXR1cm4JaW50CQlSb3VuZGVkIE51bWJlcgoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIE9ERCgkbnVtYmVyKSB7CgkJJG51bWJlcgk9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlblNpbmdsZVZhbHVlKCRudW1iZXIpOwoKCQlpZiAoaXNfbnVsbCgkbnVtYmVyKSkgewoJCQlyZXR1cm4gMTsKCQl9IGVsc2VpZiAoaXNfYm9vbCgkbnVtYmVyKSkgewoJCQkkbnVtYmVyID0gKGludCkgJG51bWJlcjsKCQl9CgoJCWlmIChpc19udW1lcmljKCRudW1iZXIpKSB7CgkJCSRzaWduaWZpY2FuY2UgPSBzZWxmOjpTSUdOKCRudW1iZXIpOwoJCQlpZiAoJHNpZ25pZmljYW5jZSA9PSAwKSB7CgkJCQlyZXR1cm4gMTsKCQkJfQoKCQkJJHJlc3VsdCA9IHNlbGY6OkNFSUxJTkcoJG51bWJlciwkc2lnbmlmaWNhbmNlKTsKCQkJaWYgKCRyZXN1bHQgPT0gc2VsZjo6RVZFTigkcmVzdWx0KSkgewoJCQkJJHJlc3VsdCArPSAkc2lnbmlmaWNhbmNlOwoJCQl9CgoJCQlyZXR1cm4gKGludCkgJHJlc3VsdDsKCQl9CgkJcmV0dXJuIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6VkFMVUUoKTsKCX0JLy8JZnVuY3Rpb24gT0REKCkKCgoJLyoqCgkgKiBQT1dFUgoJICoKCSAqIENvbXB1dGVzIHggcmFpc2VkIHRvIHRoZSBwb3dlciB5LgoJICoKCSAqIEBwYXJhbQlmbG9hdAkJJHgKCSAqIEBwYXJhbQlmbG9hdAkJJHkKCSAqIEByZXR1cm4JZmxvYXQKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBQT1dFUigkeCA9IDAsICR5ID0gMikgewoJCSR4CT0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuU2luZ2xlVmFsdWUoJHgpOwoJCSR5CT0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuU2luZ2xlVmFsdWUoJHkpOwoKCQkvLyBWYWxpZGF0ZSBwYXJhbWV0ZXJzCgkJaWYgKCR4ID09IDAuMCAmJiAkeSA9PSAwLjApIHsKCQkJcmV0dXJuIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6TmFOKCk7CgkJfSBlbHNlaWYgKCR4ID09IDAuMCAmJiAkeSA8IDAuMCkgewoJCQlyZXR1cm4gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpESVYwKCk7CgkJfQoKCQkvLyBSZXR1cm4KCQkkcmVzdWx0ID0gcG93KCR4LCAkeSk7CgkJcmV0dXJuICghaXNfbmFuKCRyZXN1bHQpICYmICFpc19pbmZpbml0ZSgkcmVzdWx0KSkgPyAkcmVzdWx0IDogUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpOYU4oKTsKCX0JLy8JZnVuY3Rpb24gUE9XRVIoKQoKCgkvKioKCSAqIFBST0RVQ1QKCSAqCgkgKiBQUk9EVUNUIHJldHVybnMgdGhlIHByb2R1Y3Qgb2YgYWxsIHRoZSB2YWx1ZXMgYW5kIGNlbGxzIHJlZmVyZW5jZWQgaW4gdGhlIGFyZ3VtZW50IGxpc3QuCgkgKgoJICogRXhjZWwgRnVuY3Rpb246CgkgKgkJUFJPRFVDVCh2YWx1ZTFbLHZhbHVlMlssIC4uLl1dKQoJICoKCSAqIEBhY2Nlc3MJcHVibGljCgkgKiBAY2F0ZWdvcnkgTWF0aGVtYXRpY2FsIGFuZCBUcmlnb25vbWV0cmljIEZ1bmN0aW9ucwoJICogQHBhcmFtCW1peGVkCQkkYXJnLC4uLgkJRGF0YSB2YWx1ZXMKCSAqIEByZXR1cm4JZmxvYXQKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBQUk9EVUNUKCkgewoJCS8vIFJldHVybiB2YWx1ZQoJCSRyZXR1cm5WYWx1ZSA9IG51bGw7CgoJCS8vIExvb3AgdGhyb3VnaCBhcmd1bWVudHMKCQlmb3JlYWNoIChQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5BcnJheShmdW5jX2dldF9hcmdzKCkpIGFzICRhcmcpIHsKCQkJLy8gSXMgaXQgYSBudW1lcmljIHZhbHVlPwoJCQlpZiAoKGlzX251bWVyaWMoJGFyZykpICYmICghaXNfc3RyaW5nKCRhcmcpKSkgewoJCQkJaWYgKGlzX251bGwoJHJldHVyblZhbHVlKSkgewoJCQkJCSRyZXR1cm5WYWx1ZSA9ICRhcmc7CgkJCQl9IGVsc2UgewoJCQkJCSRyZXR1cm5WYWx1ZSAqPSAkYXJnOwoJCQkJfQoJCQl9CgkJfQoKCQkvLyBSZXR1cm4KCQlpZiAoaXNfbnVsbCgkcmV0dXJuVmFsdWUpKSB7CgkJCXJldHVybiAwOwoJCX0KCQlyZXR1cm4gJHJldHVyblZhbHVlOwoJfQkvLwlmdW5jdGlvbiBQUk9EVUNUKCkKCgoJLyoqCgkgKiBRVU9USUVOVAoJICoKCSAqIFFVT1RJRU5UIGZ1bmN0aW9uIHJldHVybnMgdGhlIGludGVnZXIgcG9ydGlvbiBvZiBhIGRpdmlzaW9uLiBOdW1lcmF0b3IgaXMgdGhlIGRpdmlkZWQgbnVtYmVyCgkgKgkJYW5kIGRlbm9taW5hdG9yIGlzIHRoZSBkaXZpc29yLgoJICoKCSAqIEV4Y2VsIEZ1bmN0aW9uOgoJICoJCVFVT1RJRU5UKHZhbHVlMVssdmFsdWUyWywgLi4uXV0pCgkgKgoJICogQGFjY2VzcwlwdWJsaWMKCSAqIEBjYXRlZ29yeSBNYXRoZW1hdGljYWwgYW5kIFRyaWdvbm9tZXRyaWMgRnVuY3Rpb25zCgkgKiBAcGFyYW0JbWl4ZWQJCSRhcmcsLi4uCQlEYXRhIHZhbHVlcwoJICogQHJldHVybglmbG9hdAoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIFFVT1RJRU5UKCkgewoJCS8vIFJldHVybiB2YWx1ZQoJCSRyZXR1cm5WYWx1ZSA9IG51bGw7CgoJCS8vIExvb3AgdGhyb3VnaCBhcmd1bWVudHMKCQlmb3JlYWNoIChQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5BcnJheShmdW5jX2dldF9hcmdzKCkpIGFzICRhcmcpIHsKCQkJLy8gSXMgaXQgYSBudW1lcmljIHZhbHVlPwoJCQlpZiAoKGlzX251bWVyaWMoJGFyZykpICYmICghaXNfc3RyaW5nKCRhcmcpKSkgewoJCQkJaWYgKGlzX251bGwoJHJldHVyblZhbHVlKSkgewoJCQkJCSRyZXR1cm5WYWx1ZSA9ICgkYXJnID09IDApID8gMCA6ICRhcmc7CgkJCQl9IGVsc2UgewoJCQkJCWlmICgoJHJldHVyblZhbHVlID09IDApIHx8ICgkYXJnID09IDApKSB7CgkJCQkJCSRyZXR1cm5WYWx1ZSA9IDA7CgkJCQkJfSBlbHNlIHsKCQkJCQkJJHJldHVyblZhbHVlIC89ICRhcmc7CgkJCQkJfQoJCQkJfQoJCQl9CgkJfQoKCQkvLyBSZXR1cm4KCQlyZXR1cm4gaW50dmFsKCRyZXR1cm5WYWx1ZSk7Cgl9CS8vCWZ1bmN0aW9uIFFVT1RJRU5UKCkKCgoJLyoqCgkgKiBSQU5ECgkgKgoJICogQHBhcmFtCWludAkJJG1pbglNaW5pbWFsIHZhbHVlCgkgKiBAcGFyYW0JaW50CQkkbWF4CU1heGltYWwgdmFsdWUKCSAqIEByZXR1cm4JaW50CQlSYW5kb20gbnVtYmVyCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gUkFORCgkbWluID0gMCwgJG1heCA9IDApIHsKCQkkbWluCQk9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlblNpbmdsZVZhbHVlKCRtaW4pOwoJCSRtYXgJCT0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuU2luZ2xlVmFsdWUoJG1heCk7CgoJCWlmICgkbWluID09IDAgJiYgJG1heCA9PSAwKSB7CgkJCXJldHVybiAocmFuZCgwLDEwMDAwMDAwKSkgLyAxMDAwMDAwMDsKCQl9IGVsc2UgewoJCQlyZXR1cm4gcmFuZCgkbWluLCAkbWF4KTsKCQl9Cgl9CS8vCWZ1bmN0aW9uIFJBTkQoKQoKCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIFJPTUFOKCRhVmFsdWUsICRzdHlsZT0wKSB7CgkJJGFWYWx1ZQk9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlblNpbmdsZVZhbHVlKCRhVmFsdWUpOwoJCSRzdHlsZQk9IChpc19udWxsKCRzdHlsZSkpCT8gMCA6CShpbnRlZ2VyKSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5TaW5nbGVWYWx1ZSgkc3R5bGUpOwoJCWlmICgoIWlzX251bWVyaWMoJGFWYWx1ZSkpIHx8ICgkYVZhbHVlIDwgMCkgfHwgKCRhVmFsdWUgPj0gNDAwMCkpIHsKCQkJcmV0dXJuIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6VkFMVUUoKTsKCQl9CgkJJGFWYWx1ZSA9IChpbnRlZ2VyKSAkYVZhbHVlOwoJCWlmICgkYVZhbHVlID09IDApIHsKCQkJcmV0dXJuICcnOwoJCX0KCgkJJG1pbGwgPSBBcnJheSgnJywgJ00nLCAnTU0nLCAnTU1NJywgJ01NTU0nLCAnTU1NTU0nKTsKCQkkY2VudCA9IEFycmF5KCcnLCAnQycsICdDQycsICdDQ0MnLCAnQ0QnLCAnRCcsICdEQycsICdEQ0MnLCAnRENDQycsICdDTScpOwoJCSR0ZW5zID0gQXJyYXkoJycsICdYJywgJ1hYJywgJ1hYWCcsICdYTCcsICdMJywgJ0xYJywgJ0xYWCcsICdMWFhYJywgJ1hDJyk7CgkJJG9uZXMgPSBBcnJheSgnJywgJ0knLCAnSUknLCAnSUlJJywgJ0lWJywgJ1YnLCAnVkknLCAnVklJJywgJ1ZJSUknLCAnSVgnKTsKCgkJJHJvbWFuID0gJyc7CgkJd2hpbGUgKCRhVmFsdWUgPiA1OTk5KSB7CgkJCSRyb21hbiAuPSAnTSc7CgkJCSRhVmFsdWUgLT0gMTAwMDsKCQl9CgkJJG0gPSBzZWxmOjpfcm9tYW5DdXQoJGFWYWx1ZSwgMTAwMCk7CSRhVmFsdWUgJT0gMTAwMDsKCQkkYyA9IHNlbGY6Ol9yb21hbkN1dCgkYVZhbHVlLCAxMDApOwkJJGFWYWx1ZSAlPSAxMDA7CgkJJHQgPSBzZWxmOjpfcm9tYW5DdXQoJGFWYWx1ZSwgMTApOwkJJGFWYWx1ZSAlPSAxMDsKCgkJcmV0dXJuICRyb21hbi4kbWlsbFskbV0uJGNlbnRbJGNdLiR0ZW5zWyR0XS4kb25lc1skYVZhbHVlXTsKCX0JLy8JZnVuY3Rpb24gUk9NQU4oKQoKCgkvKioKCSAqIFJPVU5EVVAKCSAqCgkgKiBSb3VuZHMgYSBudW1iZXIgdXAgdG8gYSBzcGVjaWZpZWQgbnVtYmVyIG9mIGRlY2ltYWwgcGxhY2VzCgkgKgoJICogQHBhcmFtCWZsb2F0CSRudW1iZXIJCQlOdW1iZXIgdG8gcm91bmQKCSAqIEBwYXJhbQlpbnQJCSRkaWdpdHMJCQlOdW1iZXIgb2YgZGlnaXRzIHRvIHdoaWNoIHlvdSB3YW50IHRvIHJvdW5kICRudW1iZXIKCSAqIEByZXR1cm4JZmxvYXQJUm91bmRlZCBOdW1iZXIKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBST1VORFVQKCRudW1iZXIsJGRpZ2l0cykgewoJCSRudW1iZXIJPSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5TaW5nbGVWYWx1ZSgkbnVtYmVyKTsKCQkkZGlnaXRzCT0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuU2luZ2xlVmFsdWUoJGRpZ2l0cyk7CgoJCWlmICgoaXNfbnVtZXJpYygkbnVtYmVyKSkgJiYgKGlzX251bWVyaWMoJGRpZ2l0cykpKSB7CgkJCSRzaWduaWZpY2FuY2UgPSBwb3coMTAsKGludCkgJGRpZ2l0cyk7CgkJCWlmICgkbnVtYmVyIDwgMC4wKSB7CgkJCQlyZXR1cm4gZmxvb3IoJG51bWJlciAqICRzaWduaWZpY2FuY2UpIC8gJHNpZ25pZmljYW5jZTsKCQkJfSBlbHNlIHsKCQkJCXJldHVybiBjZWlsKCRudW1iZXIgKiAkc2lnbmlmaWNhbmNlKSAvICRzaWduaWZpY2FuY2U7CgkJCX0KCQl9CgkJcmV0dXJuIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6VkFMVUUoKTsKCX0JLy8JZnVuY3Rpb24gUk9VTkRVUCgpCgoKCS8qKgoJICogUk9VTkRET1dOCgkgKgoJICogUm91bmRzIGEgbnVtYmVyIGRvd24gdG8gYSBzcGVjaWZpZWQgbnVtYmVyIG9mIGRlY2ltYWwgcGxhY2VzCgkgKgoJICogQHBhcmFtCWZsb2F0CSRudW1iZXIJCQlOdW1iZXIgdG8gcm91bmQKCSAqIEBwYXJhbQlpbnQJCSRkaWdpdHMJCQlOdW1iZXIgb2YgZGlnaXRzIHRvIHdoaWNoIHlvdSB3YW50IHRvIHJvdW5kICRudW1iZXIKCSAqIEByZXR1cm4JZmxvYXQJUm91bmRlZCBOdW1iZXIKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBST1VORERPV04oJG51bWJlciwkZGlnaXRzKSB7CgkJJG51bWJlcgk9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlblNpbmdsZVZhbHVlKCRudW1iZXIpOwoJCSRkaWdpdHMJPSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5TaW5nbGVWYWx1ZSgkZGlnaXRzKTsKCgkJaWYgKChpc19udW1lcmljKCRudW1iZXIpKSAmJiAoaXNfbnVtZXJpYygkZGlnaXRzKSkpIHsKCQkJJHNpZ25pZmljYW5jZSA9IHBvdygxMCwoaW50KSAkZGlnaXRzKTsKCQkJaWYgKCRudW1iZXIgPCAwLjApIHsKCQkJCXJldHVybiBjZWlsKCRudW1iZXIgKiAkc2lnbmlmaWNhbmNlKSAvICRzaWduaWZpY2FuY2U7CgkJCX0gZWxzZSB7CgkJCQlyZXR1cm4gZmxvb3IoJG51bWJlciAqICRzaWduaWZpY2FuY2UpIC8gJHNpZ25pZmljYW5jZTsKCQkJfQoJCX0KCQlyZXR1cm4gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpWQUxVRSgpOwoJfQkvLwlmdW5jdGlvbiBST1VORERPV04oKQoKCgkvKioKCSAqIFNFUklFU1NVTQoJICoKCSAqIFJldHVybnMgdGhlIHN1bSBvZiBhIHBvd2VyIHNlcmllcwoJICoKCSAqIEBwYXJhbQlmbG9hdAkJCSR4CUlucHV0IHZhbHVlIHRvIHRoZSBwb3dlciBzZXJpZXMKCSAqIEBwYXJhbQlmbG9hdAkJCSRuCUluaXRpYWwgcG93ZXIgdG8gd2hpY2ggeW91IHdhbnQgdG8gcmFpc2UgJHgKCSAqIEBwYXJhbQlmbG9hdAkJCSRtCVN0ZXAgYnkgd2hpY2ggdG8gaW5jcmVhc2UgJG4gZm9yIGVhY2ggdGVybSBpbiB0aGUgc2VyaWVzCgkgKiBAcGFyYW0JYXJyYXkgb2YgbWl4ZWQJCURhdGEgU2VyaWVzCgkgKiBAcmV0dXJuCWZsb2F0CgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gU0VSSUVTU1VNKCkgewoJCS8vIFJldHVybiB2YWx1ZQoJCSRyZXR1cm5WYWx1ZSA9IDA7CgoJCS8vIExvb3AgdGhyb3VnaCBhcmd1bWVudHMKCQkkYUFyZ3MgPSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5BcnJheShmdW5jX2dldF9hcmdzKCkpOwoKCQkkeCA9IGFycmF5X3NoaWZ0KCRhQXJncyk7CgkJJG4gPSBhcnJheV9zaGlmdCgkYUFyZ3MpOwoJCSRtID0gYXJyYXlfc2hpZnQoJGFBcmdzKTsKCgkJaWYgKChpc19udW1lcmljKCR4KSkgJiYgKGlzX251bWVyaWMoJG4pKSAmJiAoaXNfbnVtZXJpYygkbSkpKSB7CgkJCS8vIENhbGN1bGF0ZQoJCQkkaSA9IDA7CgkJCWZvcmVhY2goJGFBcmdzIGFzICRhcmcpIHsKCQkJCS8vIElzIGl0IGEgbnVtZXJpYyB2YWx1ZT8KCQkJCWlmICgoaXNfbnVtZXJpYygkYXJnKSkgJiYgKCFpc19zdHJpbmcoJGFyZykpKSB7CgkJCQkJJHJldHVyblZhbHVlICs9ICRhcmcgKiBwb3coJHgsJG4gKyAoJG0gKiAkaSsrKSk7CgkJCQl9IGVsc2UgewoJCQkJCXJldHVybiBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OlZBTFVFKCk7CgkJCQl9CgkJCX0KCQkJLy8gUmV0dXJuCgkJCXJldHVybiAkcmV0dXJuVmFsdWU7CgkJfQoJCXJldHVybiBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OlZBTFVFKCk7Cgl9CS8vCWZ1bmN0aW9uIFNFUklFU1NVTSgpCgoKCS8qKgoJICogU0lHTgoJICoKCSAqIERldGVybWluZXMgdGhlIHNpZ24gb2YgYSBudW1iZXIuIFJldHVybnMgMSBpZiB0aGUgbnVtYmVyIGlzIHBvc2l0aXZlLCB6ZXJvICgwKQoJICoJCWlmIHRoZSBudW1iZXIgaXMgMCwgYW5kIC0xIGlmIHRoZSBudW1iZXIgaXMgbmVnYXRpdmUuCgkgKgoJICogQHBhcmFtCWZsb2F0CSRudW1iZXIJCQlOdW1iZXIgdG8gcm91bmQKCSAqIEByZXR1cm4JaW50CQlzaWduIHZhbHVlCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gU0lHTigkbnVtYmVyKSB7CgkJJG51bWJlcgk9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlblNpbmdsZVZhbHVlKCRudW1iZXIpOwoKCQlpZiAoaXNfYm9vbCgkbnVtYmVyKSkKCQkJcmV0dXJuIChpbnQpICRudW1iZXI7CgkJaWYgKGlzX251bWVyaWMoJG51bWJlcikpIHsKCQkJaWYgKCRudW1iZXIgPT0gMC4wKSB7CgkJCQlyZXR1cm4gMDsKCQkJfQoJCQlyZXR1cm4gJG51bWJlciAvIGFicygkbnVtYmVyKTsKCQl9CgkJcmV0dXJuIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6VkFMVUUoKTsKCX0JLy8JZnVuY3Rpb24gU0lHTigpCgoKCS8qKgoJICogU1FSVFBJCgkgKgoJICogUmV0dXJucyB0aGUgc3F1YXJlIHJvb3Qgb2YgKG51bWJlciAqIHBpKS4KCSAqCgkgKiBAcGFyYW0JZmxvYXQJJG51bWJlcgkJTnVtYmVyCgkgKiBAcmV0dXJuCWZsb2F0CVNxdWFyZSBSb290IG9mIE51bWJlciAqIFBpCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gU1FSVFBJKCRudW1iZXIpIHsKCQkkbnVtYmVyCT0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuU2luZ2xlVmFsdWUoJG51bWJlcik7CgoJCWlmIChpc19udW1lcmljKCRudW1iZXIpKSB7CgkJCWlmICgkbnVtYmVyIDwgMCkgewoJCQkJcmV0dXJuIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6TmFOKCk7CgkJCX0KCQkJcmV0dXJuIHNxcnQoJG51bWJlciAqIE1fUEkpIDsKCQl9CgkJcmV0dXJuIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6VkFMVUUoKTsKCX0JLy8JZnVuY3Rpb24gU1FSVFBJKCkKCgoJLyoqCgkgKiBTVUJUT1RBTAoJICoKCSAqIFJldHVybnMgYSBzdWJ0b3RhbCBpbiBhIGxpc3Qgb3IgZGF0YWJhc2UuCgkgKgoJICogQHBhcmFtCWludAkJdGhlIG51bWJlciAxIHRvIDExIHRoYXQgc3BlY2lmaWVzIHdoaWNoIGZ1bmN0aW9uIHRvCgkgKgkJCQkJdXNlIGluIGNhbGN1bGF0aW5nIHN1YnRvdGFscyB3aXRoaW4gYSBsaXN0LgoJICogQHBhcmFtCWFycmF5IG9mIG1peGVkCQlEYXRhIFNlcmllcwoJICogQHJldHVybglmbG9hdAoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIFNVQlRPVEFMKCkgewoJCSRhQXJncyA9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlbkFycmF5KGZ1bmNfZ2V0X2FyZ3MoKSk7CgoJCS8vIENhbGN1bGF0ZQoJCSRzdWJ0b3RhbCA9IGFycmF5X3NoaWZ0KCRhQXJncyk7CgoJCWlmICgoaXNfbnVtZXJpYygkc3VidG90YWwpKSAmJiAoIWlzX3N0cmluZygkc3VidG90YWwpKSkgewoJCQlzd2l0Y2goJHN1YnRvdGFsKSB7CgkJCQljYXNlIDEJOgoJCQkJCXJldHVybiBQSFBFeGNlbF9DYWxjdWxhdGlvbl9TdGF0aXN0aWNhbDo6QVZFUkFHRSgkYUFyZ3MpOwoJCQkJCWJyZWFrOwoJCQkJY2FzZSAyCToKCQkJCQlyZXR1cm4gUEhQRXhjZWxfQ2FsY3VsYXRpb25fU3RhdGlzdGljYWw6OkNPVU5UKCRhQXJncyk7CgkJCQkJYnJlYWs7CgkJCQljYXNlIDMJOgoJCQkJCXJldHVybiBQSFBFeGNlbF9DYWxjdWxhdGlvbl9TdGF0aXN0aWNhbDo6Q09VTlRBKCRhQXJncyk7CgkJCQkJYnJlYWs7CgkJCQljYXNlIDQJOgoJCQkJCXJldHVybiBQSFBFeGNlbF9DYWxjdWxhdGlvbl9TdGF0aXN0aWNhbDo6TUFYKCRhQXJncyk7CgkJCQkJYnJlYWs7CgkJCQljYXNlIDUJOgoJCQkJCXJldHVybiBQSFBFeGNlbF9DYWxjdWxhdGlvbl9TdGF0aXN0aWNhbDo6TUlOKCRhQXJncyk7CgkJCQkJYnJlYWs7CgkJCQljYXNlIDYJOgoJCQkJCXJldHVybiBzZWxmOjpQUk9EVUNUKCRhQXJncyk7CgkJCQkJYnJlYWs7CgkJCQljYXNlIDcJOgoJCQkJCXJldHVybiBQSFBFeGNlbF9DYWxjdWxhdGlvbl9TdGF0aXN0aWNhbDo6U1RERVYoJGFBcmdzKTsKCQkJCQlicmVhazsKCQkJCWNhc2UgOAk6CgkJCQkJcmV0dXJuIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX1N0YXRpc3RpY2FsOjpTVERFVlAoJGFBcmdzKTsKCQkJCQlicmVhazsKCQkJCWNhc2UgOQk6CgkJCQkJcmV0dXJuIHNlbGY6OlNVTSgkYUFyZ3MpOwoJCQkJCWJyZWFrOwoJCQkJY2FzZSAxMAk6CgkJCQkJcmV0dXJuIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX1N0YXRpc3RpY2FsOjpWQVJGdW5jKCRhQXJncyk7CgkJCQkJYnJlYWs7CgkJCQljYXNlIDExCToKCQkJCQlyZXR1cm4gUEhQRXhjZWxfQ2FsY3VsYXRpb25fU3RhdGlzdGljYWw6OlZBUlAoJGFBcmdzKTsKCQkJCQlicmVhazsKCQkJfQoJCX0KCQlyZXR1cm4gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpWQUxVRSgpOwoJfQkvLwlmdW5jdGlvbiBTVUJUT1RBTCgpCgoKCS8qKgoJICogU1VNCgkgKgoJICogU1VNIGNvbXB1dGVzIHRoZSBzdW0gb2YgYWxsIHRoZSB2YWx1ZXMgYW5kIGNlbGxzIHJlZmVyZW5jZWQgaW4gdGhlIGFyZ3VtZW50IGxpc3QuCgkgKgoJICogRXhjZWwgRnVuY3Rpb246CgkgKgkJU1VNKHZhbHVlMVssdmFsdWUyWywgLi4uXV0pCgkgKgoJICogQGFjY2VzcwlwdWJsaWMKCSAqIEBjYXRlZ29yeSBNYXRoZW1hdGljYWwgYW5kIFRyaWdvbm9tZXRyaWMgRnVuY3Rpb25zCgkgKiBAcGFyYW0JbWl4ZWQJCSRhcmcsLi4uCQlEYXRhIHZhbHVlcwoJICogQHJldHVybglmbG9hdAoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIFNVTSgpIHsKCQkvLyBSZXR1cm4gdmFsdWUKCQkkcmV0dXJuVmFsdWUgPSAwOwoKCQkvLyBMb29wIHRocm91Z2ggdGhlIGFyZ3VtZW50cwoJCWZvcmVhY2ggKFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlbkFycmF5KGZ1bmNfZ2V0X2FyZ3MoKSkgYXMgJGFyZykgewoJCQkvLyBJcyBpdCBhIG51bWVyaWMgdmFsdWU/CgkJCWlmICgoaXNfbnVtZXJpYygkYXJnKSkgJiYgKCFpc19zdHJpbmcoJGFyZykpKSB7CgkJCQkkcmV0dXJuVmFsdWUgKz0gJGFyZzsKCQkJfQoJCX0KCgkJLy8gUmV0dXJuCgkJcmV0dXJuICRyZXR1cm5WYWx1ZTsKCX0JLy8JZnVuY3Rpb24gU1VNKCkKCgoJLyoqCgkgKiBTVU1JRgoJICoKCSAqIENvdW50cyB0aGUgbnVtYmVyIG9mIGNlbGxzIHRoYXQgY29udGFpbiBudW1iZXJzIHdpdGhpbiB0aGUgbGlzdCBvZiBhcmd1bWVudHMKCSAqCgkgKiBFeGNlbCBGdW5jdGlvbjoKCSAqCQlTVU1JRih2YWx1ZTFbLHZhbHVlMlssIC4uLl1dLGNvbmRpdGlvbikKCSAqCgkgKiBAYWNjZXNzCXB1YmxpYwoJICogQGNhdGVnb3J5IE1hdGhlbWF0aWNhbCBhbmQgVHJpZ29ub21ldHJpYyBGdW5jdGlvbnMKCSAqIEBwYXJhbQltaXhlZAkJJGFyZywuLi4JCURhdGEgdmFsdWVzCgkgKiBAcGFyYW0Jc3RyaW5nCQkkY29uZGl0aW9uCQlUaGUgY3JpdGVyaWEgdGhhdCBkZWZpbmVzIHdoaWNoIGNlbGxzIHdpbGwgYmUgc3VtbWVkLgoJICogQHJldHVybglmbG9hdAoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIFNVTUlGKCRhQXJncywkY29uZGl0aW9uLCRzdW1BcmdzID0gYXJyYXkoKSkgewoJCS8vIFJldHVybiB2YWx1ZQoJCSRyZXR1cm5WYWx1ZSA9IDA7CgoJCSRhQXJncyA9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlbkFycmF5KCRhQXJncyk7CgkJJHN1bUFyZ3MgPSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5BcnJheSgkc3VtQXJncyk7CgkJaWYgKGVtcHR5KCRzdW1BcmdzKSkgewoJCQkkc3VtQXJncyA9ICRhQXJnczsKCQl9CgkJJGNvbmRpdGlvbiA9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6X2lmQ29uZGl0aW9uKCRjb25kaXRpb24pOwoJCS8vIExvb3AgdGhyb3VnaCBhcmd1bWVudHMKCQlmb3JlYWNoICgkYUFyZ3MgYXMgJGtleSA9PiAkYXJnKSB7CgkJCWlmICghaXNfbnVtZXJpYygkYXJnKSkgeyAkYXJnID0gUEhQRXhjZWxfQ2FsY3VsYXRpb246Ol93cmFwUmVzdWx0KHN0cnRvdXBwZXIoJGFyZykpOyB9CgkJCSR0ZXN0Q29uZGl0aW9uID0gJz0nLiRhcmcuJGNvbmRpdGlvbjsKCQkJaWYgKFBIUEV4Y2VsX0NhbGN1bGF0aW9uOjpnZXRJbnN0YW5jZSgpLT5fY2FsY3VsYXRlRm9ybXVsYVZhbHVlKCR0ZXN0Q29uZGl0aW9uKSkgewoJCQkJLy8gSXMgaXQgYSB2YWx1ZSB3aXRoaW4gb3VyIGNyaXRlcmlhCgkJCQkkcmV0dXJuVmFsdWUgKz0gJHN1bUFyZ3NbJGtleV07CgkJCX0KCQl9CgoJCS8vIFJldHVybgoJCXJldHVybiAkcmV0dXJuVmFsdWU7Cgl9CS8vCWZ1bmN0aW9uIFNVTUlGKCkKCgoJLyoqCgkgKiBTVU1QUk9EVUNUCgkgKgoJICogRXhjZWwgRnVuY3Rpb246CgkgKgkJU1VNUFJPRFVDVCh2YWx1ZTFbLHZhbHVlMlssIC4uLl1dKQoJICoKCSAqIEBhY2Nlc3MJcHVibGljCgkgKiBAY2F0ZWdvcnkgTWF0aGVtYXRpY2FsIGFuZCBUcmlnb25vbWV0cmljIEZ1bmN0aW9ucwoJICogQHBhcmFtCW1peGVkCQkkYXJnLC4uLgkJRGF0YSB2YWx1ZXMKCSAqIEByZXR1cm4JZmxvYXQKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBTVU1QUk9EVUNUKCkgewoJCSRhcnJheUxpc3QgPSBmdW5jX2dldF9hcmdzKCk7CgoJCSR3cmtBcnJheSA9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlbkFycmF5KGFycmF5X3NoaWZ0KCRhcnJheUxpc3QpKTsKCQkkd3JrQ2VsbENvdW50ID0gY291bnQoJHdya0FycmF5KTsKCgkJZm9yICgkaT0wOyAkaTwgJHdya0NlbGxDb3VudDsgKyskaSkgewoJCQlpZiAoKCFpc19udW1lcmljKCR3cmtBcnJheVskaV0pKSB8fCAoaXNfc3RyaW5nKCR3cmtBcnJheVskaV0pKSkgewoJCQkJJHdya0FycmF5WyRpXSA9IDA7CgkJCX0KCQl9CgoJCWZvcmVhY2goJGFycmF5TGlzdCBhcyAkbWF0cml4RGF0YSkgewoJCQkkYXJyYXkyID0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuQXJyYXkoJG1hdHJpeERhdGEpOwoJCQkkY291bnQgPSBjb3VudCgkYXJyYXkyKTsKCQkJaWYgKCR3cmtDZWxsQ291bnQgIT0gJGNvdW50KSB7CgkJCQlyZXR1cm4gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpWQUxVRSgpOwoJCQl9CgoJCQlmb3JlYWNoICgkYXJyYXkyIGFzICRpID0+ICR2YWwpIHsKCQkJCWlmICgoIWlzX251bWVyaWMoJHZhbCkpIHx8IChpc19zdHJpbmcoJHZhbCkpKSB7CgkJCQkJJHZhbCA9IDA7CgkJCQl9CgkJCQkkd3JrQXJyYXlbJGldICo9ICR2YWw7CgkJCX0KCQl9CgoJCXJldHVybiBhcnJheV9zdW0oJHdya0FycmF5KTsKCX0JLy8JZnVuY3Rpb24gU1VNUFJPRFVDVCgpCgoKCS8qKgoJICogU1VNU1EKCSAqCgkgKiBTVU1TUSByZXR1cm5zIHRoZSBzdW0gb2YgdGhlIHNxdWFyZXMgb2YgdGhlIGFyZ3VtZW50cwoJICoKCSAqIEV4Y2VsIEZ1bmN0aW9uOgoJICoJCVNVTVNRKHZhbHVlMVssdmFsdWUyWywgLi4uXV0pCgkgKgoJICogQGFjY2VzcwlwdWJsaWMKCSAqIEBjYXRlZ29yeSBNYXRoZW1hdGljYWwgYW5kIFRyaWdvbm9tZXRyaWMgRnVuY3Rpb25zCgkgKiBAcGFyYW0JbWl4ZWQJCSRhcmcsLi4uCQlEYXRhIHZhbHVlcwoJICogQHJldHVybglmbG9hdAoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIFNVTVNRKCkgewoJCS8vIFJldHVybiB2YWx1ZQoJCSRyZXR1cm5WYWx1ZSA9IDA7CgoJCS8vIExvb3AgdGhyb3VnaCBhcmd1bWVudHMKCQlmb3JlYWNoIChQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5BcnJheShmdW5jX2dldF9hcmdzKCkpIGFzICRhcmcpIHsKCQkJLy8gSXMgaXQgYSBudW1lcmljIHZhbHVlPwoJCQlpZiAoKGlzX251bWVyaWMoJGFyZykpICYmICghaXNfc3RyaW5nKCRhcmcpKSkgewoJCQkJJHJldHVyblZhbHVlICs9ICgkYXJnICogJGFyZyk7CgkJCX0KCQl9CgoJCS8vIFJldHVybgoJCXJldHVybiAkcmV0dXJuVmFsdWU7Cgl9CS8vCWZ1bmN0aW9uIFNVTVNRKCkKCgoJLyoqCgkgKiBTVU1YMk1ZMgoJICoKCSAqIEBwYXJhbQltaXhlZAkkdmFsdWUJVmFsdWUgdG8gY2hlY2sKCSAqIEByZXR1cm4JZmxvYXQKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBTVU1YMk1ZMigkbWF0cml4RGF0YTEsJG1hdHJpeERhdGEyKSB7CgkJJGFycmF5MSA9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlbkFycmF5KCRtYXRyaXhEYXRhMSk7CgkJJGFycmF5MiA9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlbkFycmF5KCRtYXRyaXhEYXRhMik7CgkJJGNvdW50MSA9IGNvdW50KCRhcnJheTEpOwoJCSRjb3VudDIgPSBjb3VudCgkYXJyYXkyKTsKCQlpZiAoJGNvdW50MSA8ICRjb3VudDIpIHsKCQkJJGNvdW50ID0gJGNvdW50MTsKCQl9IGVsc2UgewoJCQkkY291bnQgPSAkY291bnQyOwoJCX0KCgkJJHJlc3VsdCA9IDA7CgkJZm9yICgkaSA9IDA7ICRpIDwgJGNvdW50OyArKyRpKSB7CgkJCWlmICgoKGlzX251bWVyaWMoJGFycmF5MVskaV0pKSAmJiAoIWlzX3N0cmluZygkYXJyYXkxWyRpXSkpKSAmJgoJCQkJKChpc19udW1lcmljKCRhcnJheTJbJGldKSkgJiYgKCFpc19zdHJpbmcoJGFycmF5MlskaV0pKSkpIHsKCQkJCSRyZXN1bHQgKz0gKCRhcnJheTFbJGldICogJGFycmF5MVskaV0pIC0gKCRhcnJheTJbJGldICogJGFycmF5MlskaV0pOwoJCQl9CgkJfQoKCQlyZXR1cm4gJHJlc3VsdDsKCX0JLy8JZnVuY3Rpb24gU1VNWDJNWTIoKQoKCgkvKioKCSAqIFNVTVgyUFkyCgkgKgoJICogQHBhcmFtCW1peGVkCSR2YWx1ZQlWYWx1ZSB0byBjaGVjawoJICogQHJldHVybglmbG9hdAoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIFNVTVgyUFkyKCRtYXRyaXhEYXRhMSwkbWF0cml4RGF0YTIpIHsKCQkkYXJyYXkxID0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuQXJyYXkoJG1hdHJpeERhdGExKTsKCQkkYXJyYXkyID0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuQXJyYXkoJG1hdHJpeERhdGEyKTsKCQkkY291bnQxID0gY291bnQoJGFycmF5MSk7CgkJJGNvdW50MiA9IGNvdW50KCRhcnJheTIpOwoJCWlmICgkY291bnQxIDwgJGNvdW50MikgewoJCQkkY291bnQgPSAkY291bnQxOwoJCX0gZWxzZSB7CgkJCSRjb3VudCA9ICRjb3VudDI7CgkJfQoKCQkkcmVzdWx0ID0gMDsKCQlmb3IgKCRpID0gMDsgJGkgPCAkY291bnQ7ICsrJGkpIHsKCQkJaWYgKCgoaXNfbnVtZXJpYygkYXJyYXkxWyRpXSkpICYmICghaXNfc3RyaW5nKCRhcnJheTFbJGldKSkpICYmCgkJCQkoKGlzX251bWVyaWMoJGFycmF5MlskaV0pKSAmJiAoIWlzX3N0cmluZygkYXJyYXkyWyRpXSkpKSkgewoJCQkJJHJlc3VsdCArPSAoJGFycmF5MVskaV0gKiAkYXJyYXkxWyRpXSkgKyAoJGFycmF5MlskaV0gKiAkYXJyYXkyWyRpXSk7CgkJCX0KCQl9CgoJCXJldHVybiAkcmVzdWx0OwoJfQkvLwlmdW5jdGlvbiBTVU1YMlBZMigpCgoKCS8qKgoJICogU1VNWE1ZMgoJICoKCSAqIEBwYXJhbQltaXhlZAkkdmFsdWUJVmFsdWUgdG8gY2hlY2sKCSAqIEByZXR1cm4JZmxvYXQKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBTVU1YTVkyKCRtYXRyaXhEYXRhMSwkbWF0cml4RGF0YTIpIHsKCQkkYXJyYXkxID0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuQXJyYXkoJG1hdHJpeERhdGExKTsKCQkkYXJyYXkyID0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuQXJyYXkoJG1hdHJpeERhdGEyKTsKCQkkY291bnQxID0gY291bnQoJGFycmF5MSk7CgkJJGNvdW50MiA9IGNvdW50KCRhcnJheTIpOwoJCWlmICgkY291bnQxIDwgJGNvdW50MikgewoJCQkkY291bnQgPSAkY291bnQxOwoJCX0gZWxzZSB7CgkJCSRjb3VudCA9ICRjb3VudDI7CgkJfQoKCQkkcmVzdWx0ID0gMDsKCQlmb3IgKCRpID0gMDsgJGkgPCAkY291bnQ7ICsrJGkpIHsKCQkJaWYgKCgoaXNfbnVtZXJpYygkYXJyYXkxWyRpXSkpICYmICghaXNfc3RyaW5nKCRhcnJheTFbJGldKSkpICYmCgkJCQkoKGlzX251bWVyaWMoJGFycmF5MlskaV0pKSAmJiAoIWlzX3N0cmluZygkYXJyYXkyWyRpXSkpKSkgewoJCQkJJHJlc3VsdCArPSAoJGFycmF5MVskaV0gLSAkYXJyYXkyWyRpXSkgKiAoJGFycmF5MVskaV0gLSAkYXJyYXkyWyRpXSk7CgkJCX0KCQl9CgoJCXJldHVybiAkcmVzdWx0OwoJfQkvLwlmdW5jdGlvbiBTVU1YTVkyKCkKCgoJLyoqCgkgKiBUUlVOQwoJICoKCSAqIFRydW5jYXRlcyB2YWx1ZSB0byB0aGUgbnVtYmVyIG9mIGZyYWN0aW9uYWwgZGlnaXRzIGJ5IG51bWJlcl9kaWdpdHMuCgkgKgoJICogQHBhcmFtCWZsb2F0CQkkdmFsdWUKCSAqIEBwYXJhbQlpbnQJCQkkZGlnaXRzCgkgKiBAcmV0dXJuCWZsb2F0CQlUcnVuY2F0ZWQgdmFsdWUKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBUUlVOQygkdmFsdWUgPSAwLCAkZGlnaXRzID0gMCkgewoJCSR2YWx1ZQk9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlblNpbmdsZVZhbHVlKCR2YWx1ZSk7CgkJJGRpZ2l0cwk9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlblNpbmdsZVZhbHVlKCRkaWdpdHMpOwoKCQkvLyBWYWxpZGF0ZSBwYXJhbWV0ZXJzCgkJaWYgKCghaXNfbnVtZXJpYygkdmFsdWUpKSB8fCAoIWlzX251bWVyaWMoJGRpZ2l0cykpKQoJCQlyZXR1cm4gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpWQUxVRSgpOwoJCSRkaWdpdHMJPSBmbG9vcigkZGlnaXRzKTsKCgkJLy8gVHJ1bmNhdGUKCQkkYWRqdXN0ID0gcG93KDEwLCAkZGlnaXRzKTsKCgkJaWYgKCgkZGlnaXRzID4gMCkgJiYgKHJ0cmltKGludHZhbCgoYWJzKCR2YWx1ZSkgLSBhYnMoaW50dmFsKCR2YWx1ZSkpKSAqICRhZGp1c3QpLCcwJykgPCAkYWRqdXN0LzEwKSkKCQkJcmV0dXJuICR2YWx1ZTsKCgkJcmV0dXJuIChpbnR2YWwoJHZhbHVlICogJGFkanVzdCkpIC8gJGFkanVzdDsKCX0JLy8JZnVuY3Rpb24gVFJVTkMoKQoKfQkvLwljbGFzcyBQSFBFeGNlbF9DYWxjdWxhdGlvbl9NYXRoVHJpZwo=]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Calculation/Statistical.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIFBIUEV4Y2VsCiAqCiAqIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKICoKICogQGNhdGVnb3J5CVBIUEV4Y2VsCiAqIEBwYWNrYWdlCQlQSFBFeGNlbF9DYWxjdWxhdGlvbgogKiBAY29weXJpZ2h0CUNvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwgKGh0dHA6Ly93d3cuY29kZXBsZXguY29tL1BIUEV4Y2VsKQogKiBAbGljZW5zZQkJaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL29sZC1saWNlbnNlcy9sZ3BsLTIuMS50eHQJTEdQTAogKiBAdmVyc2lvbgkJMS43LjcsIDIwMTItMDUtMTkKICovCgoKLyoqIFBIUEV4Y2VsIHJvb3QgZGlyZWN0b3J5ICovCmlmICghZGVmaW5lZCgnUEhQRVhDRUxfUk9PVCcpKSB7CgkvKioKCSAqIEBpZ25vcmUKCSAqLwoJZGVmaW5lKCdQSFBFWENFTF9ST09UJywgZGlybmFtZShfX0ZJTEVfXykgLiAnLy4uLy4uLycpOwoJcmVxdWlyZShQSFBFWENFTF9ST09UIC4gJ1BIUEV4Y2VsL0F1dG9sb2FkZXIucGhwJyk7Cn0KCgpyZXF1aXJlX29uY2UgUEhQRVhDRUxfUk9PVCAuICdQSFBFeGNlbC9TaGFyZWQvdHJlbmQvdHJlbmRDbGFzcy5waHAnOwoKCi8qKiBMT0dfR0FNTUFfWF9NQVhfVkFMVUUgKi8KZGVmaW5lKCdMT0dfR0FNTUFfWF9NQVhfVkFMVUUnLCAyLjU1ZTMwNSk7CgovKiogWE1JTklOICovCmRlZmluZSgnWE1JTklOJywgMi4yM2UtMzA4KTsKCi8qKiBFUFMgKi8KZGVmaW5lKCdFUFMnLCAyLjIyZS0xNik7CgovKiogU1FSVDJQSSAqLwpkZWZpbmUoJ1NRUlQyUEknLCAyLjUwNjYyODI3NDYzMTAwMDUwMjQxNTc2NTI4NDgxMTA0NTI1MzAwNjk4Njc0MDYwOTkpOwoKCi8qKgogKiBQSFBFeGNlbF9DYWxjdWxhdGlvbl9TdGF0aXN0aWNhbAogKgogKiBAY2F0ZWdvcnkJUEhQRXhjZWwKICogQHBhY2thZ2UJCVBIUEV4Y2VsX0NhbGN1bGF0aW9uCiAqIEBjb3B5cmlnaHQJQ29weXJpZ2h0IChjKSAyMDA2IC0gMjAxMiBQSFBFeGNlbCAoaHR0cDovL3d3dy5jb2RlcGxleC5jb20vUEhQRXhjZWwpCiAqLwpjbGFzcyBQSFBFeGNlbF9DYWxjdWxhdGlvbl9TdGF0aXN0aWNhbCB7CgoKCXByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIF9jaGVja1RyZW5kQXJyYXlzKCYkYXJyYXkxLCYkYXJyYXkyKSB7CgkJaWYgKCFpc19hcnJheSgkYXJyYXkxKSkgeyAkYXJyYXkxID0gYXJyYXkoJGFycmF5MSk7IH0KCQlpZiAoIWlzX2FycmF5KCRhcnJheTIpKSB7ICRhcnJheTIgPSBhcnJheSgkYXJyYXkyKTsgfQoKCQkkYXJyYXkxID0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuQXJyYXkoJGFycmF5MSk7CgkJJGFycmF5MiA9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlbkFycmF5KCRhcnJheTIpOwoJCWZvcmVhY2goJGFycmF5MSBhcyAka2V5ID0+ICR2YWx1ZSkgewoJCQlpZiAoKGlzX2Jvb2woJHZhbHVlKSkgfHwgKGlzX3N0cmluZygkdmFsdWUpKSB8fCAoaXNfbnVsbCgkdmFsdWUpKSkgewoJCQkJdW5zZXQoJGFycmF5MVska2V5XSk7CgkJCQl1bnNldCgkYXJyYXkyWyRrZXldKTsKCQkJfQoJCX0KCQlmb3JlYWNoKCRhcnJheTIgYXMgJGtleSA9PiAkdmFsdWUpIHsKCQkJaWYgKChpc19ib29sKCR2YWx1ZSkpIHx8IChpc19zdHJpbmcoJHZhbHVlKSkgfHwgKGlzX251bGwoJHZhbHVlKSkpIHsKCQkJCXVuc2V0KCRhcnJheTFbJGtleV0pOwoJCQkJdW5zZXQoJGFycmF5Mlska2V5XSk7CgkJCX0KCQl9CgkJJGFycmF5MSA9IGFycmF5X21lcmdlKCRhcnJheTEpOwoJCSRhcnJheTIgPSBhcnJheV9tZXJnZSgkYXJyYXkyKTsKCgkJcmV0dXJuIFRydWU7Cgl9CS8vCWZ1bmN0aW9uIF9jaGVja1RyZW5kQXJyYXlzKCkKCgoJLyoqCgkgKiBCZXRhIGZ1bmN0aW9uLgoJICoKCSAqIEBhdXRob3IgSmFjbyB2YW4gS29vdGVuCgkgKgoJICogQHBhcmFtIHAgcmVxdWlyZSBwPjAKCSAqIEBwYXJhbSBxIHJlcXVpcmUgcT4wCgkgKiBAcmV0dXJuIDAgaWYgcDw9MCwgcTw9MCBvciBwK3E+Mi41NUUzMDUgdG8gYXZvaWQgZXJyb3JzIGFuZCBvdmVyL3VuZGVyZmxvdwoJICovCglwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBfYmV0YSgkcCwgJHEpIHsKCQlpZiAoJHAgPD0gMC4wIHx8ICRxIDw9IDAuMCB8fCAoJHAgKyAkcSkgPiBMT0dfR0FNTUFfWF9NQVhfVkFMVUUpIHsKCQkJcmV0dXJuIDAuMDsKCQl9IGVsc2UgewoJCQlyZXR1cm4gZXhwKHNlbGY6Ol9sb2dCZXRhKCRwLCAkcSkpOwoJCX0KCX0JLy8JZnVuY3Rpb24gX2JldGEoKQoKCgkvKioKCSAqIEluY29tcGxldGUgYmV0YSBmdW5jdGlvbgoJICoKCSAqIEBhdXRob3IgSmFjbyB2YW4gS29vdGVuCgkgKiBAYXV0aG9yIFBhdWwgTWVhZ2hlcgoJICoKCSAqIFRoZSBjb21wdXRhdGlvbiBpcyBiYXNlZCBvbiBmb3JtdWxhcyBmcm9tIE51bWVyaWNhbCBSZWNpcGVzLCBDaGFwdGVyIDYuNCAoVy5ILiBQcmVzcyBldCBhbCwgMTk5MikuCgkgKiBAcGFyYW0geCByZXF1aXJlIDA8PXg8PTEKCSAqIEBwYXJhbSBwIHJlcXVpcmUgcD4wCgkgKiBAcGFyYW0gcSByZXF1aXJlIHE+MAoJICogQHJldHVybiAwIGlmIHg8MCwgcDw9MCwgcTw9MCBvciBwK3E+Mi41NUUzMDUgYW5kIDEgaWYgeD4xIHRvIGF2b2lkIGVycm9ycyBhbmQgb3Zlci91bmRlcmZsb3cKCSAqLwoJcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gX2luY29tcGxldGVCZXRhKCR4LCAkcCwgJHEpIHsKCQlpZiAoJHggPD0gMC4wKSB7CgkJCXJldHVybiAwLjA7CgkJfSBlbHNlaWYgKCR4ID49IDEuMCkgewoJCQlyZXR1cm4gMS4wOwoJCX0gZWxzZWlmICgoJHAgPD0gMC4wKSB8fCAoJHEgPD0gMC4wKSB8fCAoKCRwICsgJHEpID4gTE9HX0dBTU1BX1hfTUFYX1ZBTFVFKSkgewoJCQlyZXR1cm4gMC4wOwoJCX0KCQkkYmV0YV9nYW0gPSBleHAoKDAgLSBzZWxmOjpfbG9nQmV0YSgkcCwgJHEpKSArICRwICogbG9nKCR4KSArICRxICogbG9nKDEuMCAtICR4KSk7CgkJaWYgKCR4IDwgKCRwICsgMS4wKSAvICgkcCArICRxICsgMi4wKSkgewoJCQlyZXR1cm4gJGJldGFfZ2FtICogc2VsZjo6X2JldGFGcmFjdGlvbigkeCwgJHAsICRxKSAvICRwOwoJCX0gZWxzZSB7CgkJCXJldHVybiAxLjAgLSAoJGJldGFfZ2FtICogc2VsZjo6X2JldGFGcmFjdGlvbigxIC0gJHgsICRxLCAkcCkgLyAkcSk7CgkJfQoJfQkvLwlmdW5jdGlvbiBfaW5jb21wbGV0ZUJldGEoKQoKCgkvLyBGdW5jdGlvbiBjYWNoZSBmb3IgX2xvZ0JldGEgZnVuY3Rpb24KCXByaXZhdGUgc3RhdGljICRfbG9nQmV0YUNhY2hlX3AJCQk9IDAuMDsKCXByaXZhdGUgc3RhdGljICRfbG9nQmV0YUNhY2hlX3EJCQk9IDAuMDsKCXByaXZhdGUgc3RhdGljICRfbG9nQmV0YUNhY2hlX3Jlc3VsdAk9IDAuMDsKCgkvKioKCSAqIFRoZSBuYXR1cmFsIGxvZ2FyaXRobSBvZiB0aGUgYmV0YSBmdW5jdGlvbi4KCSAqCgkgKiBAcGFyYW0gcCByZXF1aXJlIHA+MAoJICogQHBhcmFtIHEgcmVxdWlyZSBxPjAKCSAqIEByZXR1cm4gMCBpZiBwPD0wLCBxPD0wIG9yIHArcT4yLjU1RTMwNSB0byBhdm9pZCBlcnJvcnMgYW5kIG92ZXIvdW5kZXJmbG93CgkgKiBAYXV0aG9yIEphY28gdmFuIEtvb3RlbgoJICovCglwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBfbG9nQmV0YSgkcCwgJHEpIHsKCQlpZiAoJHAgIT0gc2VsZjo6JF9sb2dCZXRhQ2FjaGVfcCB8fCAkcSAhPSBzZWxmOjokX2xvZ0JldGFDYWNoZV9xKSB7CgkJCXNlbGY6OiRfbG9nQmV0YUNhY2hlX3AgPSAkcDsKCQkJc2VsZjo6JF9sb2dCZXRhQ2FjaGVfcSA9ICRxOwoJCQlpZiAoKCRwIDw9IDAuMCkgfHwgKCRxIDw9IDAuMCkgfHwgKCgkcCArICRxKSA+IExPR19HQU1NQV9YX01BWF9WQUxVRSkpIHsKCQkJCXNlbGY6OiRfbG9nQmV0YUNhY2hlX3Jlc3VsdCA9IDAuMDsKCQkJfSBlbHNlIHsKCQkJCXNlbGY6OiRfbG9nQmV0YUNhY2hlX3Jlc3VsdCA9IHNlbGY6Ol9sb2dHYW1tYSgkcCkgKyBzZWxmOjpfbG9nR2FtbWEoJHEpIC0gc2VsZjo6X2xvZ0dhbW1hKCRwICsgJHEpOwoJCQl9CgkJfQoJCXJldHVybiBzZWxmOjokX2xvZ0JldGFDYWNoZV9yZXN1bHQ7Cgl9CS8vCWZ1bmN0aW9uIF9sb2dCZXRhKCkKCgoJLyoqCgkgKiBFdmFsdWF0ZXMgb2YgY29udGludWVkIGZyYWN0aW9uIHBhcnQgb2YgaW5jb21wbGV0ZSBiZXRhIGZ1bmN0aW9uLgoJICogQmFzZWQgb24gYW4gaWRlYSBmcm9tIE51bWVyaWNhbCBSZWNpcGVzIChXLkguIFByZXNzIGV0IGFsLCAxOTkyKS4KCSAqIEBhdXRob3IgSmFjbyB2YW4gS29vdGVuCgkgKi8KCXByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIF9iZXRhRnJhY3Rpb24oJHgsICRwLCAkcSkgewoJCSRjID0gMS4wOwoJCSRzdW1fcHEgPSAkcCArICRxOwoJCSRwX3BsdXMgPSAkcCArIDEuMDsKCQkkcF9taW51cyA9ICRwIC0gMS4wOwoJCSRoID0gMS4wIC0gJHN1bV9wcSAqICR4IC8gJHBfcGx1czsKCQlpZiAoYWJzKCRoKSA8IFhNSU5JTikgewoJCQkkaCA9IFhNSU5JTjsKCQl9CgkJJGggPSAxLjAgLyAkaDsKCQkkZnJhYyA9ICRoOwoJCSRtCSA9IDE7CgkJJGRlbHRhID0gMC4wOwoJCXdoaWxlICgkbSA8PSBNQVhfSVRFUkFUSU9OUyAmJiBhYnMoJGRlbHRhLTEuMCkgPiBQUkVDSVNJT04gKSB7CgkJCSRtMiA9IDIgKiAkbTsKCQkJLy8gZXZlbiBpbmRleCBmb3IgZAoJCQkkZCA9ICRtICogKCRxIC0gJG0pICogJHggLyAoICgkcF9taW51cyArICRtMikgKiAoJHAgKyAkbTIpKTsKCQkJJGggPSAxLjAgKyAkZCAqICRoOwoJCQlpZiAoYWJzKCRoKSA8IFhNSU5JTikgewoJCQkJJGggPSBYTUlOSU47CgkJCX0KCQkJJGggPSAxLjAgLyAkaDsKCQkJJGMgPSAxLjAgKyAkZCAvICRjOwoJCQlpZiAoYWJzKCRjKSA8IFhNSU5JTikgewoJCQkJJGMgPSBYTUlOSU47CgkJCX0KCQkJJGZyYWMgKj0gJGggKiAkYzsKCQkJLy8gb2RkIGluZGV4IGZvciBkCgkJCSRkID0gLSgkcCArICRtKSAqICgkc3VtX3BxICsgJG0pICogJHggLyAoKCRwICsgJG0yKSAqICgkcF9wbHVzICsgJG0yKSk7CgkJCSRoID0gMS4wICsgJGQgKiAkaDsKCQkJaWYgKGFicygkaCkgPCBYTUlOSU4pIHsKCQkJCSRoID0gWE1JTklOOwoJCQl9CgkJCSRoID0gMS4wIC8gJGg7CgkJCSRjID0gMS4wICsgJGQgLyAkYzsKCQkJaWYgKGFicygkYykgPCBYTUlOSU4pIHsKCQkJCSRjID0gWE1JTklOOwoJCQl9CgkJCSRkZWx0YSA9ICRoICogJGM7CgkJCSRmcmFjICo9ICRkZWx0YTsKCQkJKyskbTsKCQl9CgkJcmV0dXJuICRmcmFjOwoJfQkvLwlmdW5jdGlvbiBfYmV0YUZyYWN0aW9uKCkKCgoJLyoqCgkgKiBsb2dHYW1tYSBmdW5jdGlvbgoJICoKCSAqIEB2ZXJzaW9uIDEuMQoJICogQGF1dGhvciBKYWNvIHZhbiBLb290ZW4KCSAqCgkgKiBPcmlnaW5hbCBhdXRob3Igd2FzIEphY28gdmFuIEtvb3Rlbi4gUG9ydGVkIHRvIFBIUCBieSBQYXVsIE1lYWdoZXIuCgkgKgoJICogVGhlIG5hdHVyYWwgbG9nYXJpdGhtIG9mIHRoZSBnYW1tYSBmdW5jdGlvbi4gPGJyIC8+CgkgKiBCYXNlZCBvbiBwdWJsaWMgZG9tYWluIE5FVExJQiAoRm9ydHJhbikgY29kZSBieSBXLiBKLiBDb2R5IGFuZCBMLiBTdG9sdHogPGJyIC8+CgkgKiBBcHBsaWVkIE1hdGhlbWF0aWNzIERpdmlzaW9uIDxiciAvPgoJICogQXJnb25uZSBOYXRpb25hbCBMYWJvcmF0b3J5IDxiciAvPgoJICogQXJnb25uZSwgSUwgNjA0MzkgPGJyIC8+CgkgKiA8cD4KCSAqIFJlZmVyZW5jZXM6CgkgKiA8b2w+CgkgKiA8bGk+Vy4gSi4gQ29keSBhbmQgSy4gRS4gSGlsbHN0cm9tLCAnQ2hlYnlzaGV2IEFwcHJveGltYXRpb25zIGZvciB0aGUgTmF0dXJhbAoJICoJIExvZ2FyaXRobSBvZiB0aGUgR2FtbWEgRnVuY3Rpb24sJyBNYXRoLiBDb21wLiAyMSwgMTk2NywgcHAuIDE5OC0yMDMuPC9saT4KCSAqIDxsaT5LLiBFLiBIaWxsc3Ryb20sIEFOTC9BTUQgUHJvZ3JhbSBBTkxDMzY2UywgREdBTU1BL0RMR0FNQSwgTWF5LCAxOTY5LjwvbGk+CgkgKiA8bGk+SGFydCwgRXQuIEFsLiwgQ29tcHV0ZXIgQXBwcm94aW1hdGlvbnMsIFdpbGV5IGFuZCBzb25zLCBOZXcgWW9yaywgMTk2OC48L2xpPgoJICogPC9vbD4KCSAqIDwvcD4KCSAqIDxwPgoJICogRnJvbSB0aGUgb3JpZ2luYWwgZG9jdW1lbnRhdGlvbjoKCSAqIDwvcD4KCSAqIDxwPgoJICogVGhpcyByb3V0aW5lIGNhbGN1bGF0ZXMgdGhlIExPRyhHQU1NQSkgZnVuY3Rpb24gZm9yIGEgcG9zaXRpdmUgcmVhbCBhcmd1bWVudCBYLgoJICogQ29tcHV0YXRpb24gaXMgYmFzZWQgb24gYW4gYWxnb3JpdGhtIG91dGxpbmVkIGluIHJlZmVyZW5jZXMgMSBhbmQgMi4KCSAqIFRoZSBwcm9ncmFtIHVzZXMgcmF0aW9uYWwgZnVuY3Rpb25zIHRoYXQgdGhlb3JldGljYWxseSBhcHByb3hpbWF0ZSBMT0coR0FNTUEpCgkgKiB0byBhdCBsZWFzdCAxOCBzaWduaWZpY2FudCBkZWNpbWFsIGRpZ2l0cy4gVGhlIGFwcHJveGltYXRpb24gZm9yIFggPiAxMiBpcyBmcm9tCgkgKiByZWZlcmVuY2UgMywgd2hpbGUgYXBwcm94aW1hdGlvbnMgZm9yIFggPCAxMi4wIGFyZSBzaW1pbGFyIHRvIHRob3NlIGluIHJlZmVyZW5jZQoJICogMSwgYnV0IGFyZSB1bnB1Ymxpc2hlZC4gVGhlIGFjY3VyYWN5IGFjaGlldmVkIGRlcGVuZHMgb24gdGhlIGFyaXRobWV0aWMgc3lzdGVtLAoJICogdGhlIGNvbXBpbGVyLCB0aGUgaW50cmluc2ljIGZ1bmN0aW9ucywgYW5kIHByb3BlciBzZWxlY3Rpb24gb2YgdGhlCgkgKiBtYWNoaW5lLWRlcGVuZGVudCBjb25zdGFudHMuCgkgKiA8L3A+CgkgKiA8cD4KCSAqIEVycm9yIHJldHVybnM6IDxiciAvPgoJICogVGhlIHByb2dyYW0gcmV0dXJucyB0aGUgdmFsdWUgWElORiBmb3IgWCAuTEUuIDAuMCBvciB3aGVuIG92ZXJmbG93IHdvdWxkIG9jY3VyLgoJICogVGhlIGNvbXB1dGF0aW9uIGlzIGJlbGlldmVkIHRvIGJlIGZyZWUgb2YgdW5kZXJmbG93IGFuZCBvdmVyZmxvdy4KCSAqIDwvcD4KCSAqIEByZXR1cm4gTUFYX1ZBTFVFIGZvciB4IDwgMC4wIG9yIHdoZW4gb3ZlcmZsb3cgd291bGQgb2NjdXIsIGkuZS4geCA+IDIuNTVFMzA1CgkgKi8KCgkvLyBGdW5jdGlvbiBjYWNoZSBmb3IgbG9nR2FtbWEKCXByaXZhdGUgc3RhdGljICRfbG9nR2FtbWFDYWNoZV9yZXN1bHQJPSAwLjA7Cglwcml2YXRlIHN0YXRpYyAkX2xvZ0dhbW1hQ2FjaGVfeAkJPSAwLjA7CgoJcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gX2xvZ0dhbW1hKCR4KSB7CgkJLy8gTG9nIEdhbW1hIHJlbGF0ZWQgY29uc3RhbnRzCgkJc3RhdGljICRsZ19kMSA9IC0wLjU3NzIxNTY2NDkwMTUzMjg2MDUxOTUxNzQ7CgkJc3RhdGljICRsZ19kMiA9IDAuNDIyNzg0MzM1MDk4NDY3MTM5Mzk5Mzc3NzsKCQlzdGF0aWMgJGxnX2Q0ID0gMS43OTE3NTk0NjkyMjgwNTUwMDAwOTQwMjM7CgoJCXN0YXRpYyAkbGdfcDEgPSBhcnJheSgJNC45NDUyMzUzNTkyOTY3MjcwNDY3MzQ4ODgsCgkJCQkJCQkJMjAxLjgxMTI2MjA4NTY3NzUwODM5MTU1NjUsCgkJCQkJCQkJMjI5MC44MzgzNzM4MzEzNDYzOTMwMjY3MzksCgkJCQkJCQkJMTEzMTkuNjcyMDU5MDMzODA4Mjg2ODUwNDUsCgkJCQkJCQkJMjg1NTcuMjQ2MzU2NzE2MzUzMzU3MzYzODksCgkJCQkJCQkJMzg0ODQuOTYyMjg0NDM3OTMzNTk5OTAyNjksCgkJCQkJCQkJMjYzNzcuNDg3ODc2MjQxOTU0Mzc5NjM1MzQsCgkJCQkJCQkJNzIyNS44MTM5Nzk3MDAyODgxOTc2OTg5NjEgKTsKCQlzdGF0aWMgJGxnX3AyID0gYXJyYXkoCTQuOTc0NjA3ODQ1NTY4OTMyMDM1MDEyMDY0LAoJCQkJCQkJCTU0Mi40MTM4NTk5ODkxMDcwNDk0MTAxOTg2LAoJCQkJCQkJCTE1NTA2LjkzODY0OTc4MzY0OTQ3NjY1MDc3LAoJCQkJCQkJCTE4NDc5My4yOTA0NDQ1NjMyNDI1NDE3MjIzLAoJCQkJCQkJCTEwODgyMDQuNzY5NDY4ODI4NzY3NDk4NDcsCgkJCQkJCQkJMzMzODE1Mi45Njc5ODcwMjk3MzU5MTcyMjMsCgkJCQkJCQkJNTEwNjY2MS42Nzg5MjczNTI0NTYyNzUyNTUsCgkJCQkJCQkJMzA3NDEwOS4wNTQ4NTA1Mzk1NTYyNTA5MjcgKTsKCQlzdGF0aWMgJGxnX3A0ID0gYXJyYXkoCTE0NzQ1LjAyMTY2MDU5OTM5OTQ4OTA1MDYyLAoJCQkJCQkJCTI0MjY4MTMuMzY5NDg2NzA0NTAyODM2MzEyLAoJCQkJCQkJCTEyMTQ3NTU1Ny40MDQ1MDkzMjI3OTM5NTkyLAoJCQkJCQkJCTI2NjM0MzI0NDkuNjMwOTc2OTQ5ODk4MDc4LAoJCQkJCQkJCTI5NDAzNzg5NTY2LjM0NTUzODk5OTA2ODc2LAoJCQkJCQkJCTE3MDI2NjU3Mzc3Ni41Mzk4ODY4MzkyOTk4LAoJCQkJCQkJCTQ5MjYxMjU3OTMzNy43NDMwODg3NTg4MTIsCgkJCQkJCQkJNTYwNjI1MTg1NjIyLjM5NTE0NjUwNzgyNDIgKTsKCgkJc3RhdGljICRsZ19xMSA9IGFycmF5KAk2Ny40ODIxMjU1MDMwMzc3NzE5NjA3MzAzNiwKCQkJCQkJCQkxMTEzLjMzMjM5Mzg1NzE5OTMyMzUxMzAwOCwKCQkJCQkJCQk3NzM4Ljc1NzA1NjkzNTM5ODczMzIzMzgzNCwKCQkJCQkJCQkyNzYzOS44NzA3NDQwMzM0MDcwODg5ODU4NSwKCQkJCQkJCQk1NDk5My4xMDIwNjIyNjE1NzMyOTc5NDQxNCwKCQkJCQkJCQk2MTYxMS4yMjE4MDA2NjAwMjEyNzgzMzM1MiwKCQkJCQkJCQkzNjM1MS4yNzU5MTUwMTk0MDUwNzI3NjI4NywKCQkJCQkJCQk4Nzg1LjUzNjMwMjQzMTAxMzE3MDg3MDgzNSApOwoJCXN0YXRpYyAkbGdfcTIgPSBhcnJheSgJMTgzLjAzMjgzOTkzNzA1OTI2MDQwNTU5NDIsCgkJCQkJCQkJNzc2NS4wNDkzMjE0NDUwMDU4NzEzMjMwNDcsCgkJCQkJCQkJMTMzMTkwLjM4Mjc5NjYwNzQxOTQ0MDI0NDgsCgkJCQkJCQkJMTEzNjcwNS44MjEzMjE5Njk2MDg5Mzg3NTUsCgkJCQkJCQkJNTI2Nzk2NC4xMTc0Mzc5NDY5MTc1Nzc1MzgsCgkJCQkJCQkJMTM0NjcwMTQuNTQzMTExMDE2OTIyOTAwNTIsCgkJCQkJCQkJMTc4MjczNjUuMzAzNTMyNzQyMTM5NzU5MzIsCgkJCQkJCQkJOTUzMzA5NS41OTE4NDQzNTM2MTMzOTU3NDcgKTsKCQlzdGF0aWMgJGxnX3E0ID0gYXJyYXkoCTI2OTAuNTMwMTc1ODcwODk5MzMzMzc5ODQzLAoJCQkJCQkJCTYzOTM4OC41NjU0MzAwMDkyMzk4OTg0MjM4LAoJCQkJCQkJCTQxMzU1OTk5LjMwMjQxMzg4MDUyMDQyODQyLAoJCQkJCQkJCTExMjA4NzIxMDkuNjE2MTQ3OTQxMzc2NTcsCgkJCQkJCQkJMTQ4ODYxMzcyODYuNzg4MTM4MTE1NDIzOTgsCgkJCQkJCQkJMTAxNjgwMzU4NjI3LjI0MzgyMjgwNzczMDQsCgkJCQkJCQkJMzQxNzQ3NjM0NTUwLjczNzcxMzI3OTg1OTcsCgkJCQkJCQkJNDQ2MzE1ODE4NzQxLjk3MTMyODY0NjIwODEgKTsKCgkJc3RhdGljICRsZ19jICA9IGFycmF5KAktMC4wMDE5MTA0NDQwNzc3MjgsCgkJCQkJCQkJOC40MTcxMzg3NzgxMjk1ZS00LAoJCQkJCQkJCS01Ljk1MjM3OTkxMzA0MzAxMmUtNCwKCQkJCQkJCQk3LjkzNjUwNzkzNTAwMzUwMjQ4ZS00LAoJCQkJCQkJCS0wLjAwMjc3Nzc3Nzc3Nzc3NzY4MTYyMjU1MywKCQkJCQkJCQkwLjA4MzMzMzMzMzMzMzMzMzMzMzMxNTU0MjQ3LAoJCQkJCQkJCTAuMDA1NzA4MzgzNTI2MSApOwoKCS8vIFJvdWdoIGVzdGltYXRlIG9mIHRoZSBmb3VydGggcm9vdCBvZiBsb2dHYW1tYV94QmlnCglzdGF0aWMgJGxnX2ZydGJpZyA9IDIuMjVlNzY7CglzdGF0aWMgJHBudDY4CSA9IDAuNjc5Njg3NTsKCgoJaWYgKCR4ID09IHNlbGY6OiRfbG9nR2FtbWFDYWNoZV94KSB7CgkJcmV0dXJuIHNlbGY6OiRfbG9nR2FtbWFDYWNoZV9yZXN1bHQ7Cgl9CgkkeSA9ICR4OwoJaWYgKCR5ID4gMC4wICYmICR5IDw9IExPR19HQU1NQV9YX01BWF9WQUxVRSkgewoJCWlmICgkeSA8PSBFUFMpIHsKCQkJJHJlcyA9IC1sb2coeSk7CgkJfSBlbHNlaWYgKCR5IDw9IDEuNSkgewoJCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0KCQkJLy8JRVBTIC5MVC4gWCAuTEUuIDEuNQoJCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0KCQkJaWYgKCR5IDwgJHBudDY4KSB7CgkJCQkkY29yciA9IC1sb2coJHkpOwoJCQkJJHhtMSA9ICR5OwoJCQl9IGVsc2UgewoJCQkJJGNvcnIgPSAwLjA7CgkJCQkkeG0xID0gJHkgLSAxLjA7CgkJCX0KCQkJaWYgKCR5IDw9IDAuNSB8fCAkeSA+PSAkcG50NjgpIHsKCQkJCSR4ZGVuID0gMS4wOwoJCQkJJHhudW0gPSAwLjA7CgkJCQlmb3IgKCRpID0gMDsgJGkgPCA4OyArKyRpKSB7CgkJCQkJJHhudW0gPSAkeG51bSAqICR4bTEgKyAkbGdfcDFbJGldOwoJCQkJCSR4ZGVuID0gJHhkZW4gKiAkeG0xICsgJGxnX3ExWyRpXTsKCQkJCX0KCQkJCSRyZXMgPSAkY29yciArICR4bTEgKiAoJGxnX2QxICsgJHhtMSAqICgkeG51bSAvICR4ZGVuKSk7CgkJCX0gZWxzZSB7CgkJCQkkeG0yID0gJHkgLSAxLjA7CgkJCQkkeGRlbiA9IDEuMDsKCQkJCSR4bnVtID0gMC4wOwoJCQkJZm9yICgkaSA9IDA7ICRpIDwgODsgKyskaSkgewoJCQkJCSR4bnVtID0gJHhudW0gKiAkeG0yICsgJGxnX3AyWyRpXTsKCQkJCQkkeGRlbiA9ICR4ZGVuICogJHhtMiArICRsZ19xMlskaV07CgkJCQl9CgkJCQkkcmVzID0gJGNvcnIgKyAkeG0yICogKCRsZ19kMiArICR4bTIgKiAoJHhudW0gLyAkeGRlbikpOwoJCQl9CgkJfSBlbHNlaWYgKCR5IDw9IDQuMCkgewoJCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0KCQkJLy8JMS41IC5MVC4gWCAuTEUuIDQuMAoJCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0KCQkJJHhtMiA9ICR5IC0gMi4wOwoJCQkkeGRlbiA9IDEuMDsKCQkJJHhudW0gPSAwLjA7CgkJCWZvciAoJGkgPSAwOyAkaSA8IDg7ICsrJGkpIHsKCQkJCSR4bnVtID0gJHhudW0gKiAkeG0yICsgJGxnX3AyWyRpXTsKCQkJCSR4ZGVuID0gJHhkZW4gKiAkeG0yICsgJGxnX3EyWyRpXTsKCQkJfQoJCQkkcmVzID0gJHhtMiAqICgkbGdfZDIgKyAkeG0yICogKCR4bnVtIC8gJHhkZW4pKTsKCQl9IGVsc2VpZiAoJHkgPD0gMTIuMCkgewoJCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgkJCS8vCTQuMCAuTFQuIFggLkxFLiAxMi4wCgkJCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCQkJJHhtNCA9ICR5IC0gNC4wOwoJCQkkeGRlbiA9IC0xLjA7CgkJCSR4bnVtID0gMC4wOwoJCQlmb3IgKCRpID0gMDsgJGkgPCA4OyArKyRpKSB7CgkJCQkkeG51bSA9ICR4bnVtICogJHhtNCArICRsZ19wNFskaV07CgkJCQkkeGRlbiA9ICR4ZGVuICogJHhtNCArICRsZ19xNFskaV07CgkJCX0KCQkJJHJlcyA9ICRsZ19kNCArICR4bTQgKiAoJHhudW0gLyAkeGRlbik7CgkJfSBlbHNlIHsKCQkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgkJCS8vCUV2YWx1YXRlIGZvciBhcmd1bWVudCAuR0UuIDEyLjAKCQkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgkJCSRyZXMgPSAwLjA7CgkJCWlmICgkeSA8PSAkbGdfZnJ0YmlnKSB7CgkJCQkkcmVzID0gJGxnX2NbNl07CgkJCQkkeXNxID0gJHkgKiAkeTsKCQkJCWZvciAoJGkgPSAwOyAkaSA8IDY7ICsrJGkpCgkJCQkJJHJlcyA9ICRyZXMgLyAkeXNxICsgJGxnX2NbJGldOwoJCQkJfQoJCQkJJHJlcyAvPSAkeTsKCQkJCSRjb3JyID0gbG9nKCR5KTsKCQkJCSRyZXMgPSAkcmVzICsgbG9nKFNRUlQyUEkpIC0gMC41ICogJGNvcnI7CgkJCQkkcmVzICs9ICR5ICogKCRjb3JyIC0gMS4wKTsKCQkJfQoJCX0gZWxzZSB7CgkJCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgkJCS8vCVJldHVybiBmb3IgYmFkIGFyZ3VtZW50cwoJCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoJCQkkcmVzID0gTUFYX1ZBTFVFOwoJCX0KCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCQkvLwlGaW5hbCBhZGp1c3RtZW50cyBhbmQgcmV0dXJuCgkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgkJc2VsZjo6JF9sb2dHYW1tYUNhY2hlX3ggPSAkeDsKCQlzZWxmOjokX2xvZ0dhbW1hQ2FjaGVfcmVzdWx0ID0gJHJlczsKCQlyZXR1cm4gJHJlczsKCX0JLy8JZnVuY3Rpb24gX2xvZ0dhbW1hKCkKCgoJLy8KCS8vCVByaXZhdGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIGluY29tcGxldGUgR2FtbWEgZnVuY3Rpb24KCS8vCglwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBfaW5jb21wbGV0ZUdhbW1hKCRhLCR4KSB7CgkJc3RhdGljICRtYXggPSAzMjsKCQkkc3VtbWVyID0gMDsKCQlmb3IgKCRuPTA7ICRuPD0kbWF4OyArKyRuKSB7CgkJCSRkaXZpc29yID0gJGE7CgkJCWZvciAoJGk9MTsgJGk8PSRuOyArKyRpKSB7CgkJCQkkZGl2aXNvciAqPSAoJGEgKyAkaSk7CgkJCX0KCQkJJHN1bW1lciArPSAocG93KCR4LCRuKSAvICRkaXZpc29yKTsKCQl9CgkJcmV0dXJuIHBvdygkeCwkYSkgKiBleHAoMC0keCkgKiAkc3VtbWVyOwoJfQkvLwlmdW5jdGlvbiBfaW5jb21wbGV0ZUdhbW1hKCkKCgoJLy8KCS8vCVByaXZhdGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIEdhbW1hIGZ1bmN0aW9uCgkvLwoJcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gX2dhbW1hKCRkYXRhKSB7CgkJaWYgKCRkYXRhID09IDAuMCkgcmV0dXJuIDA7CgoJCXN0YXRpYyAkcDAgPSAxLjAwMDAwMDAwMDE5MDAxNTsKCQlzdGF0aWMgJHAgPSBhcnJheSAoIDEgPT4gNzYuMTgwMDkxNzI5NDcxNDYsCgkJCQkJCQkyID0+IC04Ni41MDUzMjAzMjk0MTY3NywKCQkJCQkJCTMgPT4gMjQuMDE0MDk4MjQwODMwOTEsCgkJCQkJCQk0ID0+IC0xLjIzMTczOTU3MjQ1MDE1NSwKCQkJCQkJCTUgPT4gMS4yMDg2NTA5NzM4NjYxNzllLTMsCgkJCQkJCQk2ID0+IC01LjM5NTIzOTM4NDk1M2UtNgoJCQkJCQkgICk7CgoJCSR5ID0gJHggPSAkZGF0YTsKCQkkdG1wID0gJHggKyA1LjU7CgkJJHRtcCAtPSAoJHggKyAwLjUpICogbG9nKCR0bXApOwoKCQkkc3VtbWVyID0gJHAwOwoJCWZvciAoJGo9MTskajw9NjsrKyRqKSB7CgkJCSRzdW1tZXIgKz0gKCRwWyRqXSAvICsrJHkpOwoJCX0KCQlyZXR1cm4gZXhwKDAgLSAkdG1wICsgbG9nKFNRUlQyUEkgKiAkc3VtbWVyIC8gJHgpKTsKCX0JLy8JZnVuY3Rpb24gX2dhbW1hKCkKCgoJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoJICoJCQkJCQkJCWludmVyc2VfbmNkZi5waHAKCSAqCQkJCQkJCS0tLS0tLS0tLS0tLS0tLS0tLS0KCSAqCWJlZ2luCQkJCTogRnJpZGF5LCBKYW51YXJ5IDE2LCAyMDA0CgkgKgljb3B5cmlnaHQJCQk6IChDKSAyMDA0IE1pY2hhZWwgTmlja2Vyc29uCgkgKgllbWFpbAkJCQk6IG5pY2tlcnNvbm1AeWFob28uY29tCgkgKgoJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCXByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIF9pbnZlcnNlX25jZGYoJHApIHsKCQkvLwlJbnZlcnNlIG5jZGYgYXBwcm94aW1hdGlvbiBieSBQZXRlciBKLiBBY2tsYW0sIGltcGxlbWVudGF0aW9uIGFkYXB0ZWQgdG8KCQkvLwlQSFAgYnkgTWljaGFlbCBOaWNrZXJzb24sIHVzaW5nIERyLiBUaG9tYXMgWmllZ2xlcidzIEMgaW1wbGVtZW50YXRpb24gYXMKCQkvLwlhIGd1aWRlLiBodHRwOi8vaG9tZS5vbmxpbmUubm8vfnBqYWNrbGFtL25vdGVzL2ludm5vcm0vaW5kZXguaHRtbAoJCS8vCUkgaGF2ZSBub3QgY2hlY2tlZCB0aGUgYWNjdXJhY3kgb2YgdGhpcyBpbXBsZW1lbnRhdGlvbi4gQmUgYXdhcmUgdGhhdCBQSFAKCQkvLwl3aWxsIHRydW5jYXRlIHRoZSBjb2VmaWNjaWVudHMgdG8gMTQgZGlnaXRzLgoKCQkvLwlZb3UgaGF2ZSBwZXJtaXNzaW9uIHRvIHVzZSBhbmQgZGlzdHJpYnV0ZSB0aGlzIGZ1bmN0aW9uIGZyZWVseSBmb3IKCQkvLwl3aGF0ZXZlciBwdXJwb3NlIHlvdSB3YW50LCBidXQgcGxlYXNlIHNob3cgY29tbW9uIGNvdXJ0ZXN5IGFuZCBnaXZlIGNyZWRpdAoJCS8vCXdoZXJlIGNyZWRpdCBpcyBkdWUuCgoJCS8vCUlucHV0IHBhcmFtYXRlciBpcyAkcCAtIHByb2JhYmlsaXR5IC0gd2hlcmUgMCA8IHAgPCAxLgoKCQkvLwlDb2VmZmljaWVudHMgaW4gcmF0aW9uYWwgYXBwcm94aW1hdGlvbnMKCQlzdGF0aWMgJGEgPSBhcnJheSgJMSA9PiAtMy45Njk2ODMwMjg2NjUzNzZlKzAxLAoJCQkJCQkJMiA9PiAyLjIwOTQ2MDk4NDI0NTIwNWUrMDIsCgkJCQkJCQkzID0+IC0yLjc1OTI4NTEwNDQ2OTY4N2UrMDIsCgkJCQkJCQk0ID0+IDEuMzgzNTc3NTE4NjcyNjkwZSswMiwKCQkJCQkJCTUgPT4gLTMuMDY2NDc5ODA2NjE0NzE2ZSswMSwKCQkJCQkJCTYgPT4gMi41MDY2MjgyNzc0NTkyMzllKzAwCgkJCQkJCSApOwoKCQlzdGF0aWMgJGIgPSBhcnJheSgJMSA9PiAtNS40NDc2MDk4Nzk4MjI0MDZlKzAxLAoJCQkJCQkJMiA9PiAxLjYxNTg1ODM2ODU4MDQwOWUrMDIsCgkJCQkJCQkzID0+IC0xLjU1Njk4OTc5ODU5ODg2NmUrMDIsCgkJCQkJCQk0ID0+IDYuNjgwMTMxMTg4NzcxOTcyZSswMSwKCQkJCQkJCTUgPT4gLTEuMzI4MDY4MTU1Mjg4NTcyZSswMQoJCQkJCQkgKTsKCgkJc3RhdGljICRjID0gYXJyYXkoCTEgPT4gLTcuNzg0ODk0MDAyNDMwMjkzZS0wMywKCQkJCQkJCTIgPT4gLTMuMjIzOTY0NTgwNDExMzY1ZS0wMSwKCQkJCQkJCTMgPT4gLTIuNDAwNzU4Mjc3MTYxODM4ZSswMCwKCQkJCQkJCTQgPT4gLTIuNTQ5NzMyNTM5MzQzNzM0ZSswMCwKCQkJCQkJCTUgPT4gNC4zNzQ2NjQxNDE0NjQ5NjhlKzAwLAoJCQkJCQkJNiA9PiAyLjkzODE2Mzk4MjY5ODc4M2UrMDAKCQkJCQkJICk7CgoJCXN0YXRpYyAkZCA9IGFycmF5KAkxID0+IDcuNzg0Njk1NzA5MDQxNDYyZS0wMywKCQkJCQkJCTIgPT4gMy4yMjQ2NzEyOTA3MDAzOThlLTAxLAoJCQkJCQkJMyA9PiAyLjQ0NTEzNDEzNzE0Mjk5NmUrMDAsCgkJCQkJCQk0ID0+IDMuNzU0NDA4NjYxOTA3NDE2ZSswMAoJCQkJCQkgKTsKCgkJLy8JRGVmaW5lIGxvd2VyIGFuZCB1cHBlciByZWdpb24gYnJlYWstcG9pbnRzLgoJCSRwX2xvdyA9IDAuMDI0MjU7CQkJLy9Vc2UgbG93ZXIgcmVnaW9uIGFwcHJveC4gYmVsb3cgdGhpcwoJCSRwX2hpZ2ggPSAxIC0gJHBfbG93OwkJLy9Vc2UgdXBwZXIgcmVnaW9uIGFwcHJveC4gYWJvdmUgdGhpcwoKCQlpZiAoMCA8ICRwICYmICRwIDwgJHBfbG93KSB7CgkJCS8vCVJhdGlvbmFsIGFwcHJveGltYXRpb24gZm9yIGxvd2VyIHJlZ2lvbi4KCQkJJHEgPSBzcXJ0KC0yICogbG9nKCRwKSk7CgkJCXJldHVybiAoKCgoKCRjWzFdICogJHEgKyAkY1syXSkgKiAkcSArICRjWzNdKSAqICRxICsgJGNbNF0pICogJHEgKyAkY1s1XSkgKiAkcSArICRjWzZdKSAvCgkJCQkJKCgoKCRkWzFdICogJHEgKyAkZFsyXSkgKiAkcSArICRkWzNdKSAqICRxICsgJGRbNF0pICogJHEgKyAxKTsKCQl9IGVsc2VpZiAoJHBfbG93IDw9ICRwICYmICRwIDw9ICRwX2hpZ2gpIHsKCQkJLy8JUmF0aW9uYWwgYXBwcm94aW1hdGlvbiBmb3IgY2VudHJhbCByZWdpb24uCgkJCSRxID0gJHAgLSAwLjU7CgkJCSRyID0gJHEgKiAkcTsKCQkJcmV0dXJuICgoKCgoJGFbMV0gKiAkciArICRhWzJdKSAqICRyICsgJGFbM10pICogJHIgKyAkYVs0XSkgKiAkciArICRhWzVdKSAqICRyICsgJGFbNl0pICogJHEgLwoJCQkJICAgKCgoKCgkYlsxXSAqICRyICsgJGJbMl0pICogJHIgKyAkYlszXSkgKiAkciArICRiWzRdKSAqICRyICsgJGJbNV0pICogJHIgKyAxKTsKCQl9IGVsc2VpZiAoJHBfaGlnaCA8ICRwICYmICRwIDwgMSkgewoJCQkvLwlSYXRpb25hbCBhcHByb3hpbWF0aW9uIGZvciB1cHBlciByZWdpb24uCgkJCSRxID0gc3FydCgtMiAqIGxvZygxIC0gJHApKTsKCQkJcmV0dXJuIC0oKCgoKCRjWzFdICogJHEgKyAkY1syXSkgKiAkcSArICRjWzNdKSAqICRxICsgJGNbNF0pICogJHEgKyAkY1s1XSkgKiAkcSArICRjWzZdKSAvCgkJCQkJICgoKCgkZFsxXSAqICRxICsgJGRbMl0pICogJHEgKyAkZFszXSkgKiAkcSArICRkWzRdKSAqICRxICsgMSk7CgkJfQoJCS8vCUlmIDAgPCBwIDwgMSwgcmV0dXJuIGEgbnVsbCB2YWx1ZQoJCXJldHVybiBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6Ok5VTEwoKTsKCX0JLy8JZnVuY3Rpb24gX2ludmVyc2VfbmNkZigpCgoKCXByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIF9pbnZlcnNlX25jZGYyKCRwcm9iKSB7CgkJLy8JQXBwcm94aW1hdGlvbiBvZiBpbnZlcnNlIHN0YW5kYXJkIG5vcm1hbCBDREYgZGV2ZWxvcGVkIGJ5CgkJLy8JQi4gTW9ybywgIlRoZSBGdWxsIE1vbnRlLCIgUmlzayA4KDIpLCBGZWIgMTk5NSwgNTctNTguCgoJCSRhMSA9IDIuNTA2NjI4MjM4ODQ7CgkJJGEyID0gLTE4LjYxNTAwMDYyNTI5OwoJCSRhMyA9IDQxLjM5MTE5NzczNTM0OwoJCSRhNCA9IC0yNS40NDEwNjA0OTYzNzsKCgkJJGIxID0gLTguNDczNTEwOTMwOTsKCQkkYjIgPSAyMy4wODMzNjc0Mzc0MzsKCQkkYjMgPSAtMjEuMDYyMjQxMDE4MjY7CgkJJGI0ID0gMy4xMzA4MjkwOTgzMzsKCgkJJGMxID0gMC4zMzc0NzU0ODIyNzI2MTU7CgkJJGMyID0gMC45NzYxNjkwMTkwOTE3MTk7CgkJJGMzID0gMC4xNjA3OTc5NzE0OTE4MjE7CgkJJGM0ID0gMi43NjQzODgxMDMzMzg2M0UtMDI7CgkJJGM1ID0gMy44NDA1NzI5MzczNjA5RS0wMzsKCQkkYzYgPSAzLjk1MTg5NjUxMTkxOUUtMDQ7CgkJJGM3ID0gMy4yMTc2Nzg4MTc2OEUtMDU7CgkJJGM4ID0gMi44ODgxNjczNjRFLTA3OwoJCSRjOSA9IDMuOTYwMzE1MTg3RS0wNzsKCgkJJHkgPSAkcHJvYiAtIDAuNTsKCQlpZiAoYWJzKCR5KSA8IDAuNDIpIHsKCQkJJHogPSAoJHkgKiAkeSk7CgkJCSR6ID0gJHkgKiAoKCgkYTQgKiAkeiArICRhMykgKiAkeiArICRhMikgKiAkeiArICRhMSkgLyAoKCgoJGI0ICogJHogKyAkYjMpICogJHogKyAkYjIpICogJHogKyAkYjEpICogJHogKyAxKTsKCQl9IGVsc2UgewoJCQlpZiAoJHkgPiAwKSB7CgkJCQkkeiA9IGxvZygtbG9nKDEgLSAkcHJvYikpOwoJCQl9IGVsc2UgewoJCQkJJHogPSBsb2coLWxvZygkcHJvYikpOwoJCQl9CgkJCSR6ID0gJGMxICsgJHogKiAoJGMyICsgJHogKiAoJGMzICsgJHogKiAoJGM0ICsgJHogKiAoJGM1ICsgJHogKiAoJGM2ICsgJHogKiAoJGM3ICsgJHogKiAoJGM4ICsgJHogKiAkYzkpKSkpKSkpOwoJCQlpZiAoJHkgPCAwKSB7CgkJCQkkeiA9IC0kejsKCQkJfQoJCX0KCQlyZXR1cm4gJHo7Cgl9CS8vCWZ1bmN0aW9uIF9pbnZlcnNlX25jZGYyKCkKCgoJcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gX2ludmVyc2VfbmNkZjMoJHApIHsKCQkvLwlBTEdPUklUSE0gQVMyNDEgQVBQTC4gU1RBVElTVC4gKDE5ODgpIFZPTC4gMzcsIE5PLiAzLgoJCS8vCVByb2R1Y2VzIHRoZSBub3JtYWwgZGV2aWF0ZSBaIGNvcnJlc3BvbmRpbmcgdG8gYSBnaXZlbiBsb3dlcgoJCS8vCXRhaWwgYXJlYSBvZiBQOyBaIGlzIGFjY3VyYXRlIHRvIGFib3V0IDEgcGFydCBpbiAxMCoqMTYuCgkJLy8KCQkvLwlUaGlzIGlzIGEgUEhQIHZlcnNpb24gb2YgdGhlIG9yaWdpbmFsIEZPUlRSQU4gY29kZSB0aGF0IGNhbgoJCS8vCWJlIGZvdW5kIGF0IGh0dHA6Ly9saWIuc3RhdC5jbXUuZWR1L2Fwc3RhdC8KCQkkc3BsaXQxID0gMC40MjU7CgkJJHNwbGl0MiA9IDU7CgkJJGNvbnN0MSA9IDAuMTgwNjI1OwoJCSRjb25zdDIgPSAxLjY7CgoJCS8vCWNvZWZmaWNpZW50cyBmb3IgcCBjbG9zZSB0byAwLjUKCQkkYTAgPSAzLjM4NzEzMjg3Mjc5NjM2NjYwODA7CgkJJGExID0gMS4zMzE0MTY2Nzg5MTc4NDM3NzQ1RSsyOwoJCSRhMiA9IDEuOTcxNTkwOTUwMzA2NTUxNDQyN0UrMzsKCQkkYTMgPSAxLjM3MzE2OTM3NjU1MDk0NjExMjVFKzQ7CgkJJGE0ID0gNC41OTIxOTUzOTMxNTQ5ODcxNDU3RSs0OwoJCSRhNSA9IDYuNzI2NTc3MDkyNzAwODcwMDg1M0UrNDsKCQkkYTYgPSAzLjM0MzA1NzU1ODM1ODgxMjgxMDVFKzQ7CgkJJGE3ID0gMi41MDkwODA5Mjg3MzAxMjI2NzI3RSszOwoKCQkkYjEgPSA0LjIzMTMzMzA3MDE2MDA5MTEyNTJFKzE7CgkJJGIyID0gNi44NzE4NzAwNzQ5MjA1NzkwODMwRSsyOwoJCSRiMyA9IDUuMzk0MTk2MDIxNDI0NzUxMTA3N0UrMzsKCQkkYjQgPSAyLjEyMTM3OTQzMDE1ODY1OTU4NjdFKzQ7CgkJJGI1ID0gMy45MzA3ODk1ODAwMDkyNzEwNjEwRSs0OwoJCSRiNiA9IDIuODcyOTA4NTczNTcyMTk0MjY3NEUrNDsKCQkkYjcgPSA1LjIyNjQ5NTI3ODg1Mjg1NDU2MTBFKzM7CgoJCS8vCWNvZWZmaWNpZW50cyBmb3IgcCBub3QgY2xvc2UgdG8gMCwgMC41IG9yIDEuCgkJJGMwID0gMS40MjM0MzcxMTA3NDk2ODM1NzczNDsKCQkkYzEgPSA0LjYzMDMzNzg0NjE1NjU0NTI5NTkwOwoJCSRjMiA9IDUuNzY5NDk3MjIxNDYwNjkxNDA1NTA7CgkJJGMzID0gMy42NDc4NDgzMjQ3NjMyMDQ2MDUwNDsKCQkkYzQgPSAxLjI3MDQ1ODI1MjQ1MjM2ODM4MjU4OwoJCSRjNSA9IDIuNDE3ODA3MjUxNzc0NTA2MTE3NzBFLTE7CgkJJGM2ID0gMi4yNzIzODQ0OTg5MjY5MTg0NTgzM0UtMjsKCQkkYzcgPSA3Ljc0NTQ1MDE0Mjc4MzQxNDA3NjQwRS00OwoKCQkkZDEgPSAyLjA1MzE5MTYyNjYzNzc1ODgyMTg3OwoJCSRkMiA9IDEuNjc2Mzg0ODMwMTgzODAzODQ5NDA7CgkJJGQzID0gNi44OTc2NzMzNDk4NTEwMDAwNDU1MEUtMTsKCQkkZDQgPSAxLjQ4MTAzOTc2NDI3NDgwMDc0NTkwRS0xOwoJCSRkNSA9IDEuNTE5ODY2NjU2MzYxNjQ1NzE5NjZFLTI7CgkJJGQ2ID0gNS40NzU5MzgwODQ5OTUzNDQ5NDYwMEUtNDsKCQkkZDcgPSAxLjA1MDc1MDA3MTY0NDQxNjg0MzI0RS05OwoKCQkvLwljb2VmZmljaWVudHMgZm9yIHAgbmVhciAwIG9yIDEuCgkJJGUwID0gNi42NTc5MDQ2NDM1MDExMDM3NzcyMDsKCQkkZTEgPSA1LjQ2Mzc4NDkxMTE2NDExNDM2OTkwOwoJCSRlMiA9IDEuNzg0ODI2NTM5OTE3MjkxMzM1ODA7CgkJJGUzID0gMi45NjU2MDU3MTgyODUwNDg5MTIzMEUtMTsKCQkkZTQgPSAyLjY1MzIxODk1MjY1NzYxMjMwOTMwRS0yOwoJCSRlNSA9IDEuMjQyNjYwOTQ3Mzg4MDc4NDM4NjBFLTM7CgkJJGU2ID0gMi43MTE1NTU1Njg3NDM0ODc1NzgxNUUtNTsKCQkkZTcgPSAyLjAxMDMzNDM5OTI5MjI4ODEzMjY1RS03OwoKCQkkZjEgPSA1Ljk5ODMyMjA2NTU1ODg3OTM3NjkwRS0xOwoJCSRmMiA9IDEuMzY5Mjk4ODA5MjI3MzU4MDUzMTBFLTE7CgkJJGYzID0gMS40ODc1MzYxMjkwODUwNjE0ODUyNUUtMjsKCQkkZjQgPSA3Ljg2ODY5MTMxMTQ1NjEzMjU5MTAwRS00OwoJCSRmNSA9IDEuODQ2MzE4MzE3NTEwMDU0NjgxODBFLTU7CgkJJGY2ID0gMS40MjE1MTE3NTgzMTY0NDU4ODg3MEUtNzsKCQkkZjcgPSAyLjA0NDI2MzEwMzM4OTkzOTc4NTY0RS0xNTsKCgkJJHEgPSAkcCAtIDAuNTsKCgkJLy8JY29tcHV0YXRpb24gZm9yIHAgY2xvc2UgdG8gMC41CgkJaWYgKGFicygkcSkgPD0gc3BsaXQxKSB7CgkJCSRSID0gJGNvbnN0MSAtICRxICogJHE7CgkJCSR6ID0gJHEgKiAoKCgoKCgoJGE3ICogJFIgKyAkYTYpICogJFIgKyAkYTUpICogJFIgKyAkYTQpICogJFIgKyAkYTMpICogJFIgKyAkYTIpICogJFIgKyAkYTEpICogJFIgKyAkYTApIC8KCQkJCQkgICgoKCgoKCgkYjcgKiAkUiArICRiNikgKiAkUiArICRiNSkgKiAkUiArICRiNCkgKiAkUiArICRiMykgKiAkUiArICRiMikgKiAkUiArICRiMSkgKiAkUiArIDEpOwoJCX0gZWxzZSB7CgkJCWlmICgkcSA8IDApIHsKCQkJCSRSID0gJHA7CgkJCX0gZWxzZSB7CgkJCQkkUiA9IDEgLSAkcDsKCQkJfQoJCQkkUiA9IHBvdygtbG9nKCRSKSwyKTsKCgkJCS8vCWNvbXB1dGF0aW9uIGZvciBwIG5vdCBjbG9zZSB0byAwLCAwLjUgb3IgMS4KCQkJSWYgKCRSIDw9ICRzcGxpdDIpIHsKCQkJCSRSID0gJFIgLSAkY29uc3QyOwoJCQkJJHogPSAoKCgoKCgoJGM3ICogJFIgKyAkYzYpICogJFIgKyAkYzUpICogJFIgKyAkYzQpICogJFIgKyAkYzMpICogJFIgKyAkYzIpICogJFIgKyAkYzEpICogJFIgKyAkYzApIC8KCQkJCQkgKCgoKCgoKCRkNyAqICRSICsgJGQ2KSAqICRSICsgJGQ1KSAqICRSICsgJGQ0KSAqICRSICsgJGQzKSAqICRSICsgJGQyKSAqICRSICsgJGQxKSAqICRSICsgMSk7CgkJCX0gZWxzZSB7CgkJCS8vCWNvbXB1dGF0aW9uIGZvciBwIG5lYXIgMCBvciAxLgoJCQkJJFIgPSAkUiAtICRzcGxpdDI7CgkJCQkkeiA9ICgoKCgoKCgkZTcgKiAkUiArICRlNikgKiAkUiArICRlNSkgKiAkUiArICRlNCkgKiAkUiArICRlMykgKiAkUiArICRlMikgKiAkUiArICRlMSkgKiAkUiArICRlMCkgLwoJCQkJCSAoKCgoKCgoJGY3ICogJFIgKyAkZjYpICogJFIgKyAkZjUpICogJFIgKyAkZjQpICogJFIgKyAkZjMpICogJFIgKyAkZjIpICogJFIgKyAkZjEpICogJFIgKyAxKTsKCQkJfQoJCQlpZiAoJHEgPCAwKSB7CgkJCQkkeiA9IC0kejsKCQkJfQoJCX0KCQlyZXR1cm4gJHo7Cgl9CS8vCWZ1bmN0aW9uIF9pbnZlcnNlX25jZGYzKCkKCgoJLyoqCgkgKiBBVkVERVYKCSAqCgkgKiBSZXR1cm5zIHRoZSBhdmVyYWdlIG9mIHRoZSBhYnNvbHV0ZSBkZXZpYXRpb25zIG9mIGRhdGEgcG9pbnRzIGZyb20gdGhlaXIgbWVhbi4KCSAqIEFWRURFViBpcyBhIG1lYXN1cmUgb2YgdGhlIHZhcmlhYmlsaXR5IGluIGEgZGF0YSBzZXQuCgkgKgoJICogRXhjZWwgRnVuY3Rpb246CgkgKgkJQVZFREVWKHZhbHVlMVssdmFsdWUyWywgLi4uXV0pCgkgKgoJICogQGFjY2VzcwlwdWJsaWMKCSAqIEBjYXRlZ29yeSBTdGF0aXN0aWNhbCBGdW5jdGlvbnMKCSAqIEBwYXJhbQltaXhlZAkJJGFyZywuLi4JCURhdGEgdmFsdWVzCgkgKiBAcmV0dXJuCWZsb2F0CgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gQVZFREVWKCkgewoJCSRhQXJncyA9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlbkFycmF5SW5kZXhlZChmdW5jX2dldF9hcmdzKCkpOwoKCQkvLyBSZXR1cm4gdmFsdWUKCQkkcmV0dXJuVmFsdWUgPSBudWxsOwoKCQkkYU1lYW4gPSBzZWxmOjpBVkVSQUdFKCRhQXJncyk7CgkJaWYgKCRhTWVhbiAhPSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OkRJVjAoKSkgewoJCQkkYUNvdW50ID0gMDsKCQkJZm9yZWFjaCAoJGFBcmdzIGFzICRrID0+ICRhcmcpIHsKCQkJCWlmICgoaXNfYm9vbCgkYXJnKSkgJiYKCQkJCQkoKCFQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmlzQ2VsbFZhbHVlKCRrKSkgfHwgKFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6Z2V0Q29tcGF0aWJpbGl0eU1vZGUoKSA9PSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OkNPTVBBVElCSUxJVFlfT1BFTk9GRklDRSkpKSB7CgkJCQkJJGFyZyA9IChpbnRlZ2VyKSAkYXJnOwoJCQkJfQoJCQkJLy8gSXMgaXQgYSBudW1lcmljIHZhbHVlPwoJCQkJaWYgKChpc19udW1lcmljKCRhcmcpKSAmJiAoIWlzX3N0cmluZygkYXJnKSkpIHsKCQkJCQlpZiAoaXNfbnVsbCgkcmV0dXJuVmFsdWUpKSB7CgkJCQkJCSRyZXR1cm5WYWx1ZSA9IGFicygkYXJnIC0gJGFNZWFuKTsKCQkJCQl9IGVsc2UgewoJCQkJCQkkcmV0dXJuVmFsdWUgKz0gYWJzKCRhcmcgLSAkYU1lYW4pOwoJCQkJCX0KCQkJCQkrKyRhQ291bnQ7CgkJCQl9CgkJCX0KCgkJCS8vIFJldHVybgoJCQlpZiAoJGFDb3VudCA9PSAwKSB7CgkJCQlyZXR1cm4gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpESVYwKCk7CgkJCX0KCQkJcmV0dXJuICRyZXR1cm5WYWx1ZSAvICRhQ291bnQ7CgkJfQoJCXJldHVybiBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6Ok5hTigpOwoJfQkvLwlmdW5jdGlvbiBBVkVERVYoKQoKCgkvKioKCSAqIEFWRVJBR0UKCSAqCgkgKiBSZXR1cm5zIHRoZSBhdmVyYWdlIChhcml0aG1ldGljIG1lYW4pIG9mIHRoZSBhcmd1bWVudHMKCSAqCgkgKiBFeGNlbCBGdW5jdGlvbjoKCSAqCQlBVkVSQUdFKHZhbHVlMVssdmFsdWUyWywgLi4uXV0pCgkgKgoJICogQGFjY2VzcwlwdWJsaWMKCSAqIEBjYXRlZ29yeSBTdGF0aXN0aWNhbCBGdW5jdGlvbnMKCSAqIEBwYXJhbQltaXhlZAkJJGFyZywuLi4JCURhdGEgdmFsdWVzCgkgKiBAcmV0dXJuCWZsb2F0CgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gQVZFUkFHRSgpIHsKCQkkcmV0dXJuVmFsdWUgPSAkYUNvdW50ID0gMDsKCgkJLy8gTG9vcCB0aHJvdWdoIGFyZ3VtZW50cwoJCWZvcmVhY2ggKFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlbkFycmF5SW5kZXhlZChmdW5jX2dldF9hcmdzKCkpIGFzICRrID0+ICRhcmcpIHsKCQkJaWYgKChpc19ib29sKCRhcmcpKSAmJgoJCQkJKCghUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjppc0NlbGxWYWx1ZSgkaykpIHx8IChQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmdldENvbXBhdGliaWxpdHlNb2RlKCkgPT0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpDT01QQVRJQklMSVRZX09QRU5PRkZJQ0UpKSkgewoJCQkJJGFyZyA9IChpbnRlZ2VyKSAkYXJnOwoJCQl9CgkJCS8vIElzIGl0IGEgbnVtZXJpYyB2YWx1ZT8KCQkJaWYgKChpc19udW1lcmljKCRhcmcpKSAmJiAoIWlzX3N0cmluZygkYXJnKSkpIHsKCQkJCWlmIChpc19udWxsKCRyZXR1cm5WYWx1ZSkpIHsKCQkJCQkkcmV0dXJuVmFsdWUgPSAkYXJnOwoJCQkJfSBlbHNlIHsKCQkJCQkkcmV0dXJuVmFsdWUgKz0gJGFyZzsKCQkJCX0KCQkJCSsrJGFDb3VudDsKCQkJfQoJCX0KCgkJLy8gUmV0dXJuCgkJaWYgKCRhQ291bnQgPiAwKSB7CgkJCXJldHVybiAkcmV0dXJuVmFsdWUgLyAkYUNvdW50OwoJCX0gZWxzZSB7CgkJCXJldHVybiBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OkRJVjAoKTsKCQl9Cgl9CS8vCWZ1bmN0aW9uIEFWRVJBR0UoKQoKCgkvKioKCSAqIEFWRVJBR0VBCgkgKgoJICogUmV0dXJucyB0aGUgYXZlcmFnZSBvZiBpdHMgYXJndW1lbnRzLCBpbmNsdWRpbmcgbnVtYmVycywgdGV4dCwgYW5kIGxvZ2ljYWwgdmFsdWVzCgkgKgoJICogRXhjZWwgRnVuY3Rpb246CgkgKgkJQVZFUkFHRUEodmFsdWUxWyx2YWx1ZTJbLCAuLi5dXSkKCSAqCgkgKiBAYWNjZXNzCXB1YmxpYwoJICogQGNhdGVnb3J5IFN0YXRpc3RpY2FsIEZ1bmN0aW9ucwoJICogQHBhcmFtCW1peGVkCQkkYXJnLC4uLgkJRGF0YSB2YWx1ZXMKCSAqIEByZXR1cm4JZmxvYXQKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBBVkVSQUdFQSgpIHsKCQkvLyBSZXR1cm4gdmFsdWUKCQkkcmV0dXJuVmFsdWUgPSBudWxsOwoKCQkkYUNvdW50ID0gMDsKCQkvLyBMb29wIHRocm91Z2ggYXJndW1lbnRzCgkJZm9yZWFjaCAoUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuQXJyYXlJbmRleGVkKGZ1bmNfZ2V0X2FyZ3MoKSkgYXMgJGsgPT4gJGFyZykgewoJCQlpZiAoKGlzX2Jvb2woJGFyZykpICYmCgkJCQkoIVBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6aXNNYXRyaXhWYWx1ZSgkaykpKSB7CgkJCX0gZWxzZSB7CgkJCQlpZiAoKGlzX251bWVyaWMoJGFyZykpIHx8IChpc19ib29sKCRhcmcpKSB8fCAoKGlzX3N0cmluZygkYXJnKSAmJiAoJGFyZyAhPSAnJykpKSkgewoJCQkJCWlmIChpc19ib29sKCRhcmcpKSB7CgkJCQkJCSRhcmcgPSAoaW50ZWdlcikgJGFyZzsKCQkJCQl9IGVsc2VpZiAoaXNfc3RyaW5nKCRhcmcpKSB7CgkJCQkJCSRhcmcgPSAwOwoJCQkJCX0KCQkJCQlpZiAoaXNfbnVsbCgkcmV0dXJuVmFsdWUpKSB7CgkJCQkJCSRyZXR1cm5WYWx1ZSA9ICRhcmc7CgkJCQkJfSBlbHNlIHsKCQkJCQkJJHJldHVyblZhbHVlICs9ICRhcmc7CgkJCQkJfQoJCQkJCSsrJGFDb3VudDsKCQkJCX0KCQkJfQoJCX0KCgkJLy8gUmV0dXJuCgkJaWYgKCRhQ291bnQgPiAwKSB7CgkJCXJldHVybiAkcmV0dXJuVmFsdWUgLyAkYUNvdW50OwoJCX0gZWxzZSB7CgkJCXJldHVybiBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OkRJVjAoKTsKCQl9Cgl9CS8vCWZ1bmN0aW9uIEFWRVJBR0VBKCkKCgoJLyoqCgkgKiBBVkVSQUdFSUYKCSAqCgkgKiBSZXR1cm5zIHRoZSBhdmVyYWdlIHZhbHVlIGZyb20gYSByYW5nZSBvZiBjZWxscyB0aGF0IGNvbnRhaW4gbnVtYmVycyB3aXRoaW4gdGhlIGxpc3Qgb2YgYXJndW1lbnRzCgkgKgoJICogRXhjZWwgRnVuY3Rpb246CgkgKgkJQVZFUkFHRUlGKHZhbHVlMVssdmFsdWUyWywgLi4uXV0sY29uZGl0aW9uKQoJICoKCSAqIEBhY2Nlc3MJcHVibGljCgkgKiBAY2F0ZWdvcnkgTWF0aGVtYXRpY2FsIGFuZCBUcmlnb25vbWV0cmljIEZ1bmN0aW9ucwoJICogQHBhcmFtCW1peGVkCQkkYXJnLC4uLgkJRGF0YSB2YWx1ZXMKCSAqIEBwYXJhbQlzdHJpbmcJCSRjb25kaXRpb24JCVRoZSBjcml0ZXJpYSB0aGF0IGRlZmluZXMgd2hpY2ggY2VsbHMgd2lsbCBiZSBjaGVja2VkLgoJICogQHJldHVybglmbG9hdAoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIEFWRVJBR0VJRigkYUFyZ3MsJGNvbmRpdGlvbiwkYXZlcmFnZUFyZ3MgPSBhcnJheSgpKSB7CgkJLy8gUmV0dXJuIHZhbHVlCgkJJHJldHVyblZhbHVlID0gMDsKCgkJJGFBcmdzID0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuQXJyYXkoJGFBcmdzKTsKCQkkYXZlcmFnZUFyZ3MgPSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5BcnJheSgkYXZlcmFnZUFyZ3MpOwoJCWlmIChlbXB0eSgkYXZlcmFnZUFyZ3MpKSB7CgkJCSRhdmVyYWdlQXJncyA9ICRhQXJnczsKCQl9CgkJJGNvbmRpdGlvbiA9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6X2lmQ29uZGl0aW9uKCRjb25kaXRpb24pOwoJCS8vIExvb3AgdGhyb3VnaCBhcmd1bWVudHMKCQkkYUNvdW50ID0gMDsKCQlmb3JlYWNoICgkYUFyZ3MgYXMgJGtleSA9PiAkYXJnKSB7CgkJCWlmICghaXNfbnVtZXJpYygkYXJnKSkgeyAkYXJnID0gUEhQRXhjZWxfQ2FsY3VsYXRpb246Ol93cmFwUmVzdWx0KHN0cnRvdXBwZXIoJGFyZykpOyB9CgkJCSR0ZXN0Q29uZGl0aW9uID0gJz0nLiRhcmcuJGNvbmRpdGlvbjsKCQkJaWYgKFBIUEV4Y2VsX0NhbGN1bGF0aW9uOjpnZXRJbnN0YW5jZSgpLT5fY2FsY3VsYXRlRm9ybXVsYVZhbHVlKCR0ZXN0Q29uZGl0aW9uKSkgewoJCQkJaWYgKChpc19udWxsKCRyZXR1cm5WYWx1ZSkpIHx8ICgkYXJnID4gJHJldHVyblZhbHVlKSkgewoJCQkJCSRyZXR1cm5WYWx1ZSArPSAkYXJnOwoJCQkJCSsrJGFDb3VudDsKCQkJCX0KCQkJfQoJCX0KCgkJLy8gUmV0dXJuCgkJaWYgKCRhQ291bnQgPiAwKSB7CgkJCXJldHVybiAkcmV0dXJuVmFsdWUgLyAkYUNvdW50OwoJCX0gZWxzZSB7CgkJCXJldHVybiBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OkRJVjAoKTsKCQl9Cgl9CS8vCWZ1bmN0aW9uIEFWRVJBR0VJRigpCgoKCS8qKgoJICogQkVUQURJU1QKCSAqCgkgKiBSZXR1cm5zIHRoZSBiZXRhIGRpc3RyaWJ1dGlvbi4KCSAqCgkgKiBAcGFyYW0JZmxvYXQJCSR2YWx1ZQkJCVZhbHVlIGF0IHdoaWNoIHlvdSB3YW50IHRvIGV2YWx1YXRlIHRoZSBkaXN0cmlidXRpb24KCSAqIEBwYXJhbQlmbG9hdAkJJGFscGhhCQkJUGFyYW1ldGVyIHRvIHRoZSBkaXN0cmlidXRpb24KCSAqIEBwYXJhbQlmbG9hdAkJJGJldGEJCQlQYXJhbWV0ZXIgdG8gdGhlIGRpc3RyaWJ1dGlvbgoJICogQHBhcmFtCWJvb2xlYW4JCSRjdW11bGF0aXZlCgkgKiBAcmV0dXJuCWZsb2F0CgkgKgoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIEJFVEFESVNUKCR2YWx1ZSwkYWxwaGEsJGJldGEsJHJNaW49MCwkck1heD0xKSB7CgkJJHZhbHVlCT0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuU2luZ2xlVmFsdWUoJHZhbHVlKTsKCQkkYWxwaGEJPSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5TaW5nbGVWYWx1ZSgkYWxwaGEpOwoJCSRiZXRhCT0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuU2luZ2xlVmFsdWUoJGJldGEpOwoJCSRyTWluCT0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuU2luZ2xlVmFsdWUoJHJNaW4pOwoJCSRyTWF4CT0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuU2luZ2xlVmFsdWUoJHJNYXgpOwoKCQlpZiAoKGlzX251bWVyaWMoJHZhbHVlKSkgJiYgKGlzX251bWVyaWMoJGFscGhhKSkgJiYgKGlzX251bWVyaWMoJGJldGEpKSAmJiAoaXNfbnVtZXJpYygkck1pbikpICYmIChpc19udW1lcmljKCRyTWF4KSkpIHsKCQkJaWYgKCgkdmFsdWUgPCAkck1pbikgfHwgKCR2YWx1ZSA+ICRyTWF4KSB8fCAoJGFscGhhIDw9IDApIHx8ICgkYmV0YSA8PSAwKSB8fCAoJHJNaW4gPT0gJHJNYXgpKSB7CgkJCQlyZXR1cm4gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpOYU4oKTsKCQkJfQoJCQlpZiAoJHJNaW4gPiAkck1heCkgewoJCQkJJHRtcCA9ICRyTWluOwoJCQkJJHJNaW4gPSAkck1heDsKCQkJCSRyTWF4ID0gJHRtcDsKCQkJfQoJCQkkdmFsdWUgLT0gJHJNaW47CgkJCSR2YWx1ZSAvPSAoJHJNYXggLSAkck1pbik7CgkJCXJldHVybiBzZWxmOjpfaW5jb21wbGV0ZUJldGEoJHZhbHVlLCRhbHBoYSwkYmV0YSk7CgkJfQoJCXJldHVybiBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OlZBTFVFKCk7Cgl9CS8vCWZ1bmN0aW9uIEJFVEFESVNUKCkKCgoJLyoqCgkgKiBCRVRBSU5WCgkgKgoJICogUmV0dXJucyB0aGUgaW52ZXJzZSBvZiB0aGUgYmV0YSBkaXN0cmlidXRpb24uCgkgKgoJICogQHBhcmFtCWZsb2F0CQkkcHJvYmFiaWxpdHkJUHJvYmFiaWxpdHkgYXQgd2hpY2ggeW91IHdhbnQgdG8gZXZhbHVhdGUgdGhlIGRpc3RyaWJ1dGlvbgoJICogQHBhcmFtCWZsb2F0CQkkYWxwaGEJCQlQYXJhbWV0ZXIgdG8gdGhlIGRpc3RyaWJ1dGlvbgoJICogQHBhcmFtCWZsb2F0CQkkYmV0YQkJCVBhcmFtZXRlciB0byB0aGUgZGlzdHJpYnV0aW9uCgkgKiBAcGFyYW0JYm9vbGVhbgkJJGN1bXVsYXRpdmUKCSAqIEByZXR1cm4JZmxvYXQKCSAqCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gQkVUQUlOVigkcHJvYmFiaWxpdHksJGFscGhhLCRiZXRhLCRyTWluPTAsJHJNYXg9MSkgewoJCSRwcm9iYWJpbGl0eQk9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlblNpbmdsZVZhbHVlKCRwcm9iYWJpbGl0eSk7CgkJJGFscGhhCQkJPSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5TaW5nbGVWYWx1ZSgkYWxwaGEpOwoJCSRiZXRhCQkJPSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5TaW5nbGVWYWx1ZSgkYmV0YSk7CgkJJHJNaW4JCQk9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlblNpbmdsZVZhbHVlKCRyTWluKTsKCQkkck1heAkJCT0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuU2luZ2xlVmFsdWUoJHJNYXgpOwoKCQlpZiAoKGlzX251bWVyaWMoJHByb2JhYmlsaXR5KSkgJiYgKGlzX251bWVyaWMoJGFscGhhKSkgJiYgKGlzX251bWVyaWMoJGJldGEpKSAmJiAoaXNfbnVtZXJpYygkck1pbikpICYmIChpc19udW1lcmljKCRyTWF4KSkpIHsKCQkJaWYgKCgkYWxwaGEgPD0gMCkgfHwgKCRiZXRhIDw9IDApIHx8ICgkck1pbiA9PSAkck1heCkgfHwgKCRwcm9iYWJpbGl0eSA8PSAwKSB8fCAoJHByb2JhYmlsaXR5ID4gMSkpIHsKCQkJCXJldHVybiBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6Ok5hTigpOwoJCQl9CgkJCWlmICgkck1pbiA+ICRyTWF4KSB7CgkJCQkkdG1wID0gJHJNaW47CgkJCQkkck1pbiA9ICRyTWF4OwoJCQkJJHJNYXggPSAkdG1wOwoJCQl9CgkJCSRhID0gMDsKCQkJJGIgPSAyOwoKCQkJJGkgPSAwOwoJCQl3aGlsZSAoKCgkYiAtICRhKSA+IFBSRUNJU0lPTikgJiYgKCRpKysgPCBNQVhfSVRFUkFUSU9OUykpIHsKCQkJCSRndWVzcyA9ICgkYSArICRiKSAvIDI7CgkJCQkkcmVzdWx0ID0gc2VsZjo6QkVUQURJU1QoJGd1ZXNzLCAkYWxwaGEsICRiZXRhKTsKCQkJCWlmICgoJHJlc3VsdCA9PSAkcHJvYmFiaWxpdHkpIHx8ICgkcmVzdWx0ID09IDApKSB7CgkJCQkJJGIgPSAkYTsKCQkJCX0gZWxzZWlmICgkcmVzdWx0ID4gJHByb2JhYmlsaXR5KSB7CgkJCQkJJGIgPSAkZ3Vlc3M7CgkJCQl9IGVsc2UgewoJCQkJCSRhID0gJGd1ZXNzOwoJCQkJfQoJCQl9CgkJCWlmICgkaSA9PSBNQVhfSVRFUkFUSU9OUykgewoJCQkJcmV0dXJuIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6TkEoKTsKCQkJfQoJCQlyZXR1cm4gcm91bmQoJHJNaW4gKyAkZ3Vlc3MgKiAoJHJNYXggLSAkck1pbiksMTIpOwoJCX0KCQlyZXR1cm4gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpWQUxVRSgpOwoJfQkvLwlmdW5jdGlvbiBCRVRBSU5WKCkKCgoJLyoqCgkgKiBCSU5PTURJU1QKCSAqCgkgKiBSZXR1cm5zIHRoZSBpbmRpdmlkdWFsIHRlcm0gYmlub21pYWwgZGlzdHJpYnV0aW9uIHByb2JhYmlsaXR5LiBVc2UgQklOT01ESVNUIGluIHByb2JsZW1zIHdpdGgKCSAqCQlhIGZpeGVkIG51bWJlciBvZiB0ZXN0cyBvciB0cmlhbHMsIHdoZW4gdGhlIG91dGNvbWVzIG9mIGFueSB0cmlhbCBhcmUgb25seSBzdWNjZXNzIG9yIGZhaWx1cmUsCgkgKgkJd2hlbiB0cmlhbHMgYXJlIGluZGVwZW5kZW50LCBhbmQgd2hlbiB0aGUgcHJvYmFiaWxpdHkgb2Ygc3VjY2VzcyBpcyBjb25zdGFudCB0aHJvdWdob3V0IHRoZQoJICoJCWV4cGVyaW1lbnQuIEZvciBleGFtcGxlLCBCSU5PTURJU1QgY2FuIGNhbGN1bGF0ZSB0aGUgcHJvYmFiaWxpdHkgdGhhdCB0d28gb2YgdGhlIG5leHQgdGhyZWUKCSAqCQliYWJpZXMgYm9ybiBhcmUgbWFsZS4KCSAqCgkgKiBAcGFyYW0JZmxvYXQJCSR2YWx1ZQkJCU51bWJlciBvZiBzdWNjZXNzZXMgaW4gdHJpYWxzCgkgKiBAcGFyYW0JZmxvYXQJCSR0cmlhbHMJCQlOdW1iZXIgb2YgdHJpYWxzCgkgKiBAcGFyYW0JZmxvYXQJCSRwcm9iYWJpbGl0eQlQcm9iYWJpbGl0eSBvZiBzdWNjZXNzIG9uIGVhY2ggdHJpYWwKCSAqIEBwYXJhbQlib29sZWFuCQkkY3VtdWxhdGl2ZQoJICogQHJldHVybglmbG9hdAoJICoKCSAqIEB0b2RvCUN1bXVsYXRpdmUgZGlzdHJpYnV0aW9uIGZ1bmN0aW9uCgkgKgoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIEJJTk9NRElTVCgkdmFsdWUsICR0cmlhbHMsICRwcm9iYWJpbGl0eSwgJGN1bXVsYXRpdmUpIHsKCQkkdmFsdWUJCQk9IGZsb29yKFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlblNpbmdsZVZhbHVlKCR2YWx1ZSkpOwoJCSR0cmlhbHMJCQk9IGZsb29yKFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlblNpbmdsZVZhbHVlKCR0cmlhbHMpKTsKCQkkcHJvYmFiaWxpdHkJPSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5TaW5nbGVWYWx1ZSgkcHJvYmFiaWxpdHkpOwoKCQlpZiAoKGlzX251bWVyaWMoJHZhbHVlKSkgJiYgKGlzX251bWVyaWMoJHRyaWFscykpICYmIChpc19udW1lcmljKCRwcm9iYWJpbGl0eSkpKSB7CgkJCWlmICgoJHZhbHVlIDwgMCkgfHwgKCR2YWx1ZSA+ICR0cmlhbHMpKSB7CgkJCQlyZXR1cm4gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpOYU4oKTsKCQkJfQoJCQlpZiAoKCRwcm9iYWJpbGl0eSA8IDApIHx8ICgkcHJvYmFiaWxpdHkgPiAxKSkgewoJCQkJcmV0dXJuIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6TmFOKCk7CgkJCX0KCQkJaWYgKChpc19udW1lcmljKCRjdW11bGF0aXZlKSkgfHwgKGlzX2Jvb2woJGN1bXVsYXRpdmUpKSkgewoJCQkJaWYgKCRjdW11bGF0aXZlKSB7CgkJCQkJJHN1bW1lciA9IDA7CgkJCQkJZm9yICgkaSA9IDA7ICRpIDw9ICR2YWx1ZTsgKyskaSkgewoJCQkJCQkkc3VtbWVyICs9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX01hdGhUcmlnOjpDT01CSU4oJHRyaWFscywkaSkgKiBwb3coJHByb2JhYmlsaXR5LCRpKSAqIHBvdygxIC0gJHByb2JhYmlsaXR5LCR0cmlhbHMgLSAkaSk7CgkJCQkJfQoJCQkJCXJldHVybiAkc3VtbWVyOwoJCQkJfSBlbHNlIHsKCQkJCQlyZXR1cm4gUEhQRXhjZWxfQ2FsY3VsYXRpb25fTWF0aFRyaWc6OkNPTUJJTigkdHJpYWxzLCR2YWx1ZSkgKiBwb3coJHByb2JhYmlsaXR5LCR2YWx1ZSkgKiBwb3coMSAtICRwcm9iYWJpbGl0eSwkdHJpYWxzIC0gJHZhbHVlKSA7CgkJCQl9CgkJCX0KCQl9CgkJcmV0dXJuIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6VkFMVUUoKTsKCX0JLy8JZnVuY3Rpb24gQklOT01ESVNUKCkKCgoJLyoqCgkgKiBDSElESVNUCgkgKgoJICogUmV0dXJucyB0aGUgb25lLXRhaWxlZCBwcm9iYWJpbGl0eSBvZiB0aGUgY2hpLXNxdWFyZWQgZGlzdHJpYnV0aW9uLgoJICoKCSAqIEBwYXJhbQlmbG9hdAkJJHZhbHVlCQkJVmFsdWUgZm9yIHRoZSBmdW5jdGlvbgoJICogQHBhcmFtCWZsb2F0CQkkZGVncmVlcwkJZGVncmVlcyBvZiBmcmVlZG9tCgkgKiBAcmV0dXJuCWZsb2F0CgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gQ0hJRElTVCgkdmFsdWUsICRkZWdyZWVzKSB7CgkJJHZhbHVlCQk9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlblNpbmdsZVZhbHVlKCR2YWx1ZSk7CgkJJGRlZ3JlZXMJPSBmbG9vcihQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5TaW5nbGVWYWx1ZSgkZGVncmVlcykpOwoKCQlpZiAoKGlzX251bWVyaWMoJHZhbHVlKSkgJiYgKGlzX251bWVyaWMoJGRlZ3JlZXMpKSkgewoJCQlpZiAoJGRlZ3JlZXMgPCAxKSB7CgkJCQlyZXR1cm4gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpOYU4oKTsKCQkJfQoJCQlpZiAoJHZhbHVlIDwgMCkgewoJCQkJaWYgKFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6Z2V0Q29tcGF0aWJpbGl0eU1vZGUoKSA9PSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OkNPTVBBVElCSUxJVFlfR05VTUVSSUMpIHsKCQkJCQlyZXR1cm4gMTsKCQkJCX0KCQkJCXJldHVybiBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6Ok5hTigpOwoJCQl9CgkJCXJldHVybiAxIC0gKHNlbGY6Ol9pbmNvbXBsZXRlR2FtbWEoJGRlZ3JlZXMvMiwkdmFsdWUvMikgLyBzZWxmOjpfZ2FtbWEoJGRlZ3JlZXMvMikpOwoJCX0KCQlyZXR1cm4gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpWQUxVRSgpOwoJfQkvLwlmdW5jdGlvbiBDSElESVNUKCkKCgoJLyoqCgkgKiBDSElJTlYKCSAqCgkgKiBSZXR1cm5zIHRoZSBvbmUtdGFpbGVkIHByb2JhYmlsaXR5IG9mIHRoZSBjaGktc3F1YXJlZCBkaXN0cmlidXRpb24uCgkgKgoJICogQHBhcmFtCWZsb2F0CQkkcHJvYmFiaWxpdHkJUHJvYmFiaWxpdHkgZm9yIHRoZSBmdW5jdGlvbgoJICogQHBhcmFtCWZsb2F0CQkkZGVncmVlcwkJZGVncmVlcyBvZiBmcmVlZG9tCgkgKiBAcmV0dXJuCWZsb2F0CgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gQ0hJSU5WKCRwcm9iYWJpbGl0eSwgJGRlZ3JlZXMpIHsKCQkkcHJvYmFiaWxpdHkJPSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5TaW5nbGVWYWx1ZSgkcHJvYmFiaWxpdHkpOwoJCSRkZWdyZWVzCQk9IGZsb29yKFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlblNpbmdsZVZhbHVlKCRkZWdyZWVzKSk7CgoJCWlmICgoaXNfbnVtZXJpYygkcHJvYmFiaWxpdHkpKSAmJiAoaXNfbnVtZXJpYygkZGVncmVlcykpKSB7CgoJCQkkeExvID0gMTAwOwoJCQkkeEhpID0gMDsKCgkJCSR4ID0gJHhOZXcgPSAxOwoJCQkkZHgJPSAxOwoJCQkkaSA9IDA7CgoJCQl3aGlsZSAoKGFicygkZHgpID4gUFJFQ0lTSU9OKSAmJiAoJGkrKyA8IE1BWF9JVEVSQVRJT05TKSkgewoJCQkJLy8gQXBwbHkgTmV3dG9uLVJhcGhzb24gc3RlcAoJCQkJJHJlc3VsdCA9IHNlbGY6OkNISURJU1QoJHgsICRkZWdyZWVzKTsKCQkJCSRlcnJvciA9ICRyZXN1bHQgLSAkcHJvYmFiaWxpdHk7CgkJCQlpZiAoJGVycm9yID09IDAuMCkgewoJCQkJCSRkeCA9IDA7CgkJCQl9IGVsc2VpZiAoJGVycm9yIDwgMC4wKSB7CgkJCQkJJHhMbyA9ICR4OwoJCQkJfSBlbHNlIHsKCQkJCQkkeEhpID0gJHg7CgkJCQl9CgkJCQkvLyBBdm9pZCBkaXZpc2lvbiBieSB6ZXJvCgkJCQlpZiAoJHJlc3VsdCAhPSAwLjApIHsKCQkJCQkkZHggPSAkZXJyb3IgLyAkcmVzdWx0OwoJCQkJCSR4TmV3ID0gJHggLSAkZHg7CgkJCQl9CgkJCQkvLyBJZiB0aGUgTlIgZmFpbHMgdG8gY29udmVyZ2UgKHdoaWNoIGZvciBleGFtcGxlIG1heSBiZSB0aGUKCQkJCS8vIGNhc2UgaWYgdGhlIGluaXRpYWwgZ3Vlc3MgaXMgdG9vIHJvdWdoKSB3ZSBhcHBseSBhIGJpc2VjdGlvbgoJCQkJLy8gc3RlcCB0byBkZXRlcm1pbmUgYSBtb3JlIG5hcnJvdyBpbnRlcnZhbCBhcm91bmQgdGhlIHJvb3QuCgkJCQlpZiAoKCR4TmV3IDwgJHhMbykgfHwgKCR4TmV3ID4gJHhIaSkgfHwgKCRyZXN1bHQgPT0gMC4wKSkgewoJCQkJCSR4TmV3ID0gKCR4TG8gKyAkeEhpKSAvIDI7CgkJCQkJJGR4ID0gJHhOZXcgLSAkeDsKCQkJCX0KCQkJCSR4ID0gJHhOZXc7CgkJCX0KCQkJaWYgKCRpID09IE1BWF9JVEVSQVRJT05TKSB7CgkJCQlyZXR1cm4gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpOQSgpOwoJCQl9CgkJCXJldHVybiByb3VuZCgkeCwxMik7CgkJfQoJCXJldHVybiBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OlZBTFVFKCk7Cgl9CS8vCWZ1bmN0aW9uIENISUlOVigpCgoKCS8qKgoJICogQ09ORklERU5DRQoJICoKCSAqIFJldHVybnMgdGhlIGNvbmZpZGVuY2UgaW50ZXJ2YWwgZm9yIGEgcG9wdWxhdGlvbiBtZWFuCgkgKgoJICogQHBhcmFtCWZsb2F0CQkkYWxwaGEKCSAqIEBwYXJhbQlmbG9hdAkJJHN0ZERldgkJU3RhbmRhcmQgRGV2aWF0aW9uCgkgKiBAcGFyYW0JZmxvYXQJCSRzaXplCgkgKiBAcmV0dXJuCWZsb2F0CgkgKgoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIENPTkZJREVOQ0UoJGFscGhhLCRzdGREZXYsJHNpemUpIHsKCQkkYWxwaGEJPSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5TaW5nbGVWYWx1ZSgkYWxwaGEpOwoJCSRzdGREZXYJPSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5TaW5nbGVWYWx1ZSgkc3RkRGV2KTsKCQkkc2l6ZQk9IGZsb29yKFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlblNpbmdsZVZhbHVlKCRzaXplKSk7CgoJCWlmICgoaXNfbnVtZXJpYygkYWxwaGEpKSAmJiAoaXNfbnVtZXJpYygkc3RkRGV2KSkgJiYgKGlzX251bWVyaWMoJHNpemUpKSkgewoJCQlpZiAoKCRhbHBoYSA8PSAwKSB8fCAoJGFscGhhID49IDEpKSB7CgkJCQlyZXR1cm4gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpOYU4oKTsKCQkJfQoJCQlpZiAoKCRzdGREZXYgPD0gMCkgfHwgKCRzaXplIDwgMSkpIHsKCQkJCXJldHVybiBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6Ok5hTigpOwoJCQl9CgkJCXJldHVybiBzZWxmOjpOT1JNU0lOVigxIC0gJGFscGhhIC8gMikgKiAkc3RkRGV2IC8gc3FydCgkc2l6ZSk7CgkJfQoJCXJldHVybiBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OlZBTFVFKCk7Cgl9CS8vCWZ1bmN0aW9uIENPTkZJREVOQ0UoKQoKCgkvKioKCSAqIENPUlJFTAoJICoKCSAqIFJldHVybnMgY292YXJpYW5jZSwgdGhlIGF2ZXJhZ2Ugb2YgdGhlIHByb2R1Y3RzIG9mIGRldmlhdGlvbnMgZm9yIGVhY2ggZGF0YSBwb2ludCBwYWlyLgoJICoKCSAqIEBwYXJhbQlhcnJheSBvZiBtaXhlZAkJRGF0YSBTZXJpZXMgWQoJICogQHBhcmFtCWFycmF5IG9mIG1peGVkCQlEYXRhIFNlcmllcyBYCgkgKiBAcmV0dXJuCWZsb2F0CgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gQ09SUkVMKCR5VmFsdWVzLCR4VmFsdWVzPW51bGwpIHsKCQlpZiAoKGlzX251bGwoJHhWYWx1ZXMpKSB8fCAoIWlzX2FycmF5KCR5VmFsdWVzKSkgfHwgKCFpc19hcnJheSgkeFZhbHVlcykpKSB7CgkJCXJldHVybiBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OlZBTFVFKCk7CgkJfQoJCWlmICghc2VsZjo6X2NoZWNrVHJlbmRBcnJheXMoJHlWYWx1ZXMsJHhWYWx1ZXMpKSB7CgkJCXJldHVybiBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OlZBTFVFKCk7CgkJfQoJCSR5VmFsdWVDb3VudCA9IGNvdW50KCR5VmFsdWVzKTsKCQkkeFZhbHVlQ291bnQgPSBjb3VudCgkeFZhbHVlcyk7CgoJCWlmICgoJHlWYWx1ZUNvdW50ID09IDApIHx8ICgkeVZhbHVlQ291bnQgIT0gJHhWYWx1ZUNvdW50KSkgewoJCQlyZXR1cm4gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpOQSgpOwoJCX0gZWxzZWlmICgkeVZhbHVlQ291bnQgPT0gMSkgewoJCQlyZXR1cm4gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpESVYwKCk7CgkJfQoKCQkkYmVzdEZpdExpbmVhciA9IHRyZW5kQ2xhc3M6OmNhbGN1bGF0ZSh0cmVuZENsYXNzOjpUUkVORF9MSU5FQVIsJHlWYWx1ZXMsJHhWYWx1ZXMpOwoJCXJldHVybiAkYmVzdEZpdExpbmVhci0+Z2V0Q29ycmVsYXRpb24oKTsKCX0JLy8JZnVuY3Rpb24gQ09SUkVMKCkKCgoJLyoqCgkgKiBDT1VOVAoJICoKCSAqIENvdW50cyB0aGUgbnVtYmVyIG9mIGNlbGxzIHRoYXQgY29udGFpbiBudW1iZXJzIHdpdGhpbiB0aGUgbGlzdCBvZiBhcmd1bWVudHMKCSAqCgkgKiBFeGNlbCBGdW5jdGlvbjoKCSAqCQlDT1VOVCh2YWx1ZTFbLHZhbHVlMlssIC4uLl1dKQoJICoKCSAqIEBhY2Nlc3MJcHVibGljCgkgKiBAY2F0ZWdvcnkgU3RhdGlzdGljYWwgRnVuY3Rpb25zCgkgKiBAcGFyYW0JbWl4ZWQJCSRhcmcsLi4uCQlEYXRhIHZhbHVlcwoJICogQHJldHVybglpbnQKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBDT1VOVCgpIHsKCQkvLyBSZXR1cm4gdmFsdWUKCQkkcmV0dXJuVmFsdWUgPSAwOwoKCQkvLyBMb29wIHRocm91Z2ggYXJndW1lbnRzCgkJJGFBcmdzID0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuQXJyYXlJbmRleGVkKGZ1bmNfZ2V0X2FyZ3MoKSk7CgkJZm9yZWFjaCAoJGFBcmdzIGFzICRrID0+ICRhcmcpIHsKCQkJaWYgKChpc19ib29sKCRhcmcpKSAmJgoJCQkJKCghUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjppc0NlbGxWYWx1ZSgkaykpIHx8IChQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmdldENvbXBhdGliaWxpdHlNb2RlKCkgPT0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpDT01QQVRJQklMSVRZX09QRU5PRkZJQ0UpKSkgewoJCQkJJGFyZyA9IChpbnRlZ2VyKSAkYXJnOwoJCQl9CgkJCS8vIElzIGl0IGEgbnVtZXJpYyB2YWx1ZT8KCQkJaWYgKChpc19udW1lcmljKCRhcmcpKSAmJiAoIWlzX3N0cmluZygkYXJnKSkpIHsKCQkJCSsrJHJldHVyblZhbHVlOwoJCQl9CgkJfQoKCQkvLyBSZXR1cm4KCQlyZXR1cm4gJHJldHVyblZhbHVlOwoJfQkvLwlmdW5jdGlvbiBDT1VOVCgpCgoKCS8qKgoJICogQ09VTlRBCgkgKgoJICogQ291bnRzIHRoZSBudW1iZXIgb2YgY2VsbHMgdGhhdCBhcmUgbm90IGVtcHR5IHdpdGhpbiB0aGUgbGlzdCBvZiBhcmd1bWVudHMKCSAqCgkgKiBFeGNlbCBGdW5jdGlvbjoKCSAqCQlDT1VOVEEodmFsdWUxWyx2YWx1ZTJbLCAuLi5dXSkKCSAqCgkgKiBAYWNjZXNzCXB1YmxpYwoJICogQGNhdGVnb3J5IFN0YXRpc3RpY2FsIEZ1bmN0aW9ucwoJICogQHBhcmFtCW1peGVkCQkkYXJnLC4uLgkJRGF0YSB2YWx1ZXMKCSAqIEByZXR1cm4JaW50CgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gQ09VTlRBKCkgewoJCS8vIFJldHVybiB2YWx1ZQoJCSRyZXR1cm5WYWx1ZSA9IDA7CgoJCS8vIExvb3AgdGhyb3VnaCBhcmd1bWVudHMKCQkkYUFyZ3MgPSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5BcnJheShmdW5jX2dldF9hcmdzKCkpOwoJCWZvcmVhY2ggKCRhQXJncyBhcyAkYXJnKSB7CgkJCS8vIElzIGl0IGEgbnVtZXJpYywgYm9vbGVhbiBvciBzdHJpbmcgdmFsdWU/CgkJCWlmICgoaXNfbnVtZXJpYygkYXJnKSkgfHwgKGlzX2Jvb2woJGFyZykpIHx8ICgoaXNfc3RyaW5nKCRhcmcpICYmICgkYXJnICE9ICcnKSkpKSB7CgkJCQkrKyRyZXR1cm5WYWx1ZTsKCQkJfQoJCX0KCgkJLy8gUmV0dXJuCgkJcmV0dXJuICRyZXR1cm5WYWx1ZTsKCX0JLy8JZnVuY3Rpb24gQ09VTlRBKCkKCgoJLyoqCgkgKiBDT1VOVEJMQU5LCgkgKgoJICogQ291bnRzIHRoZSBudW1iZXIgb2YgZW1wdHkgY2VsbHMgd2l0aGluIHRoZSBsaXN0IG9mIGFyZ3VtZW50cwoJICoKCSAqIEV4Y2VsIEZ1bmN0aW9uOgoJICoJCUNPVU5UQkxBTksodmFsdWUxWyx2YWx1ZTJbLCAuLi5dXSkKCSAqCgkgKiBAYWNjZXNzCXB1YmxpYwoJICogQGNhdGVnb3J5IFN0YXRpc3RpY2FsIEZ1bmN0aW9ucwoJICogQHBhcmFtCW1peGVkCQkkYXJnLC4uLgkJRGF0YSB2YWx1ZXMKCSAqIEByZXR1cm4JaW50CgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gQ09VTlRCTEFOSygpIHsKCQkvLyBSZXR1cm4gdmFsdWUKCQkkcmV0dXJuVmFsdWUgPSAwOwoKCQkvLyBMb29wIHRocm91Z2ggYXJndW1lbnRzCgkJJGFBcmdzID0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuQXJyYXkoZnVuY19nZXRfYXJncygpKTsKCQlmb3JlYWNoICgkYUFyZ3MgYXMgJGFyZykgewoJCQkvLyBJcyBpdCBhIGJsYW5rIGNlbGw/CgkJCWlmICgoaXNfbnVsbCgkYXJnKSkgfHwgKChpc19zdHJpbmcoJGFyZykpICYmICgkYXJnID09ICcnKSkpIHsKCQkJCSsrJHJldHVyblZhbHVlOwoJCQl9CgkJfQoKCQkvLyBSZXR1cm4KCQlyZXR1cm4gJHJldHVyblZhbHVlOwoJfQkvLwlmdW5jdGlvbiBDT1VOVEJMQU5LKCkKCgoJLyoqCgkgKiBDT1VOVElGCgkgKgoJICogQ291bnRzIHRoZSBudW1iZXIgb2YgY2VsbHMgdGhhdCBjb250YWluIG51bWJlcnMgd2l0aGluIHRoZSBsaXN0IG9mIGFyZ3VtZW50cwoJICoKCSAqIEV4Y2VsIEZ1bmN0aW9uOgoJICoJCUNPVU5USUYodmFsdWUxWyx2YWx1ZTJbLCAuLi5dXSxjb25kaXRpb24pCgkgKgoJICogQGFjY2VzcwlwdWJsaWMKCSAqIEBjYXRlZ29yeSBTdGF0aXN0aWNhbCBGdW5jdGlvbnMKCSAqIEBwYXJhbQltaXhlZAkJJGFyZywuLi4JCURhdGEgdmFsdWVzCgkgKiBAcGFyYW0Jc3RyaW5nCQkkY29uZGl0aW9uCQlUaGUgY3JpdGVyaWEgdGhhdCBkZWZpbmVzIHdoaWNoIGNlbGxzIHdpbGwgYmUgY291bnRlZC4KCSAqIEByZXR1cm4JaW50CgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gQ09VTlRJRigkYUFyZ3MsJGNvbmRpdGlvbikgewoJCS8vIFJldHVybiB2YWx1ZQoJCSRyZXR1cm5WYWx1ZSA9IDA7CgoJCSRhQXJncyA9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlbkFycmF5KCRhQXJncyk7CgkJJGNvbmRpdGlvbiA9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6X2lmQ29uZGl0aW9uKCRjb25kaXRpb24pOwoJCS8vIExvb3AgdGhyb3VnaCBhcmd1bWVudHMKCQlmb3JlYWNoICgkYUFyZ3MgYXMgJGFyZykgewoJCQlpZiAoIWlzX251bWVyaWMoJGFyZykpIHsgJGFyZyA9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uOjpfd3JhcFJlc3VsdChzdHJ0b3VwcGVyKCRhcmcpKTsgfQoJCQkkdGVzdENvbmRpdGlvbiA9ICc9Jy4kYXJnLiRjb25kaXRpb247CgkJCWlmIChQSFBFeGNlbF9DYWxjdWxhdGlvbjo6Z2V0SW5zdGFuY2UoKS0+X2NhbGN1bGF0ZUZvcm11bGFWYWx1ZSgkdGVzdENvbmRpdGlvbikpIHsKCQkJCS8vIElzIGl0IGEgdmFsdWUgd2l0aGluIG91ciBjcml0ZXJpYQoJCQkJKyskcmV0dXJuVmFsdWU7CgkJCX0KCQl9CgoJCS8vIFJldHVybgoJCXJldHVybiAkcmV0dXJuVmFsdWU7Cgl9CS8vCWZ1bmN0aW9uIENPVU5USUYoKQoKCgkvKioKCSAqIENPVkFSCgkgKgoJICogUmV0dXJucyBjb3ZhcmlhbmNlLCB0aGUgYXZlcmFnZSBvZiB0aGUgcHJvZHVjdHMgb2YgZGV2aWF0aW9ucyBmb3IgZWFjaCBkYXRhIHBvaW50IHBhaXIuCgkgKgoJICogQHBhcmFtCWFycmF5IG9mIG1peGVkCQlEYXRhIFNlcmllcyBZCgkgKiBAcGFyYW0JYXJyYXkgb2YgbWl4ZWQJCURhdGEgU2VyaWVzIFgKCSAqIEByZXR1cm4JZmxvYXQKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBDT1ZBUigkeVZhbHVlcywkeFZhbHVlcykgewoJCWlmICghc2VsZjo6X2NoZWNrVHJlbmRBcnJheXMoJHlWYWx1ZXMsJHhWYWx1ZXMpKSB7CgkJCXJldHVybiBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OlZBTFVFKCk7CgkJfQoJCSR5VmFsdWVDb3VudCA9IGNvdW50KCR5VmFsdWVzKTsKCQkkeFZhbHVlQ291bnQgPSBjb3VudCgkeFZhbHVlcyk7CgoJCWlmICgoJHlWYWx1ZUNvdW50ID09IDApIHx8ICgkeVZhbHVlQ291bnQgIT0gJHhWYWx1ZUNvdW50KSkgewoJCQlyZXR1cm4gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpOQSgpOwoJCX0gZWxzZWlmICgkeVZhbHVlQ291bnQgPT0gMSkgewoJCQlyZXR1cm4gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpESVYwKCk7CgkJfQoKCQkkYmVzdEZpdExpbmVhciA9IHRyZW5kQ2xhc3M6OmNhbGN1bGF0ZSh0cmVuZENsYXNzOjpUUkVORF9MSU5FQVIsJHlWYWx1ZXMsJHhWYWx1ZXMpOwoJCXJldHVybiAkYmVzdEZpdExpbmVhci0+Z2V0Q292YXJpYW5jZSgpOwoJfQkvLwlmdW5jdGlvbiBDT1ZBUigpCgoKCS8qKgoJICogQ1JJVEJJTk9NCgkgKgoJICogUmV0dXJucyB0aGUgc21hbGxlc3QgdmFsdWUgZm9yIHdoaWNoIHRoZSBjdW11bGF0aXZlIGJpbm9taWFsIGRpc3RyaWJ1dGlvbiBpcyBncmVhdGVyCgkgKgkJdGhhbiBvciBlcXVhbCB0byBhIGNyaXRlcmlvbiB2YWx1ZQoJICoKCSAqIFNlZSBodHRwOi8vc3VwcG9ydC5taWNyb3NvZnQuY29tL2tiLzgyODExNy8gZm9yIGRldGFpbHMgb2YgdGhlIGFsZ29yaXRobSB1c2VkCgkgKgoJICogQHBhcmFtCWZsb2F0CQkkdHJpYWxzCQkJbnVtYmVyIG9mIEJlcm5vdWxsaSB0cmlhbHMKCSAqIEBwYXJhbQlmbG9hdAkJJHByb2JhYmlsaXR5CXByb2JhYmlsaXR5IG9mIGEgc3VjY2VzcyBvbiBlYWNoIHRyaWFsCgkgKiBAcGFyYW0JZmxvYXQJCSRhbHBoYQkJCWNyaXRlcmlvbiB2YWx1ZQoJICogQHJldHVybglpbnQKCSAqCgkgKiBAdG9kbwlXYXJuaW5nLiBUaGlzIGltcGxlbWVudGF0aW9uIGRpZmZlcnMgZnJvbSB0aGUgYWxnb3JpdGhtIGRldGFpbGVkIG9uIHRoZSBNUwoJICoJCQl3ZWIgc2l0ZSBpbiB0aGF0ICRDdW1QR3Vlc3NNaW51czEgPSAkQ3VtUEd1ZXNzIC0gMSByYXRoZXIgdGhhbiAkQ3VtUEd1ZXNzIC0gJFBHdWVzcwoJICoJCQlUaGlzIGVsaW1pbmF0ZXMgYSBwb3RlbnRpYWwgZW5kbGVzcyBsb29wIGVycm9yLCBidXQgbWF5IGhhdmUgYW4gYWR2ZXJzZSBhZmZlY3Qgb24gdGhlCgkgKgkJCWFjY3VyYWN5IG9mIHRoZSBmdW5jdGlvbiAoYWx0aG91Z2ggYWxsIG15IHRlc3RzIGhhdmUgc28gZmFyIHJldHVybmVkIGNvcnJlY3QgcmVzdWx0cykuCgkgKgoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIENSSVRCSU5PTSgkdHJpYWxzLCAkcHJvYmFiaWxpdHksICRhbHBoYSkgewoJCSR0cmlhbHMJCQk9IGZsb29yKFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlblNpbmdsZVZhbHVlKCR0cmlhbHMpKTsKCQkkcHJvYmFiaWxpdHkJPSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5TaW5nbGVWYWx1ZSgkcHJvYmFiaWxpdHkpOwoJCSRhbHBoYQkJCT0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuU2luZ2xlVmFsdWUoJGFscGhhKTsKCgkJaWYgKChpc19udW1lcmljKCR0cmlhbHMpKSAmJiAoaXNfbnVtZXJpYygkcHJvYmFiaWxpdHkpKSAmJiAoaXNfbnVtZXJpYygkYWxwaGEpKSkgewoJCQlpZiAoJHRyaWFscyA8IDApIHsKCQkJCXJldHVybiBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6Ok5hTigpOwoJCQl9CgkJCWlmICgoJHByb2JhYmlsaXR5IDwgMCkgfHwgKCRwcm9iYWJpbGl0eSA+IDEpKSB7CgkJCQlyZXR1cm4gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpOYU4oKTsKCQkJfQoJCQlpZiAoKCRhbHBoYSA8IDApIHx8ICgkYWxwaGEgPiAxKSkgewoJCQkJcmV0dXJuIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6TmFOKCk7CgkJCX0KCQkJaWYgKCRhbHBoYSA8PSAwLjUpIHsKCQkJCSR0ID0gc3FydChsb2coMSAvICgkYWxwaGEgKiAkYWxwaGEpKSk7CgkJCQkkdHJpYWxzQXBwcm94ID0gMCAtICgkdCArICgyLjUxNTUxNyArIDAuODAyODUzICogJHQgKyAwLjAxMDMyOCAqICR0ICogJHQpIC8gKDEgKyAxLjQzMjc4OCAqICR0ICsgMC4xODkyNjkgKiAkdCAqICR0ICsgMC4wMDEzMDggKiAkdCAqICR0ICogJHQpKTsKCQkJfSBlbHNlIHsKCQkJCSR0ID0gc3FydChsb2coMSAvIHBvdygxIC0gJGFscGhhLDIpKSk7CgkJCQkkdHJpYWxzQXBwcm94ID0gJHQgLSAoMi41MTU1MTcgKyAwLjgwMjg1MyAqICR0ICsgMC4wMTAzMjggKiAkdCAqICR0KSAvICgxICsgMS40MzI3ODggKiAkdCArIDAuMTg5MjY5ICogJHQgKiAkdCArIDAuMDAxMzA4ICogJHQgKiAkdCAqICR0KTsKCQkJfQoJCQkkR3Vlc3MgPSBmbG9vcigkdHJpYWxzICogJHByb2JhYmlsaXR5ICsgJHRyaWFsc0FwcHJveCAqIHNxcnQoJHRyaWFscyAqICRwcm9iYWJpbGl0eSAqICgxIC0gJHByb2JhYmlsaXR5KSkpOwoJCQlpZiAoJEd1ZXNzIDwgMCkgewoJCQkJJEd1ZXNzID0gMDsKCQkJfSBlbHNlaWYgKCRHdWVzcyA+ICR0cmlhbHMpIHsKCQkJCSRHdWVzcyA9ICR0cmlhbHM7CgkJCX0KCgkJCSRUb3RhbFVuc2NhbGVkUHJvYmFiaWxpdHkgPSAkVW5zY2FsZWRQR3Vlc3MgPSAkVW5zY2FsZWRDdW1QR3Vlc3MgPSAwLjA7CgkJCSRFc3NlbnRpYWxseVplcm8gPSAxMGUtMTI7CgoJCQkkbSA9IGZsb29yKCR0cmlhbHMgKiAkcHJvYmFiaWxpdHkpOwoJCQkrKyRUb3RhbFVuc2NhbGVkUHJvYmFiaWxpdHk7CgkJCWlmICgkbSA9PSAkR3Vlc3MpIHsgKyskVW5zY2FsZWRQR3Vlc3M7IH0KCQkJaWYgKCRtIDw9ICRHdWVzcykgeyArKyRVbnNjYWxlZEN1bVBHdWVzczsgfQoKCQkJJFByZXZpb3VzVmFsdWUgPSAxOwoJCQkkRG9uZSA9IEZhbHNlOwoJCQkkayA9ICRtICsgMTsKCQkJd2hpbGUgKCghJERvbmUpICYmICgkayA8PSAkdHJpYWxzKSkgewoJCQkJJEN1cnJlbnRWYWx1ZSA9ICRQcmV2aW91c1ZhbHVlICogKCR0cmlhbHMgLSAkayArIDEpICogJHByb2JhYmlsaXR5IC8gKCRrICogKDEgLSAkcHJvYmFiaWxpdHkpKTsKCQkJCSRUb3RhbFVuc2NhbGVkUHJvYmFiaWxpdHkgKz0gJEN1cnJlbnRWYWx1ZTsKCQkJCWlmICgkayA9PSAkR3Vlc3MpIHsgJFVuc2NhbGVkUEd1ZXNzICs9ICRDdXJyZW50VmFsdWU7IH0KCQkJCWlmICgkayA8PSAkR3Vlc3MpIHsgJFVuc2NhbGVkQ3VtUEd1ZXNzICs9ICRDdXJyZW50VmFsdWU7IH0KCQkJCWlmICgkQ3VycmVudFZhbHVlIDw9ICRFc3NlbnRpYWxseVplcm8pIHsgJERvbmUgPSBUcnVlOyB9CgkJCQkkUHJldmlvdXNWYWx1ZSA9ICRDdXJyZW50VmFsdWU7CgkJCQkrKyRrOwoJCQl9CgoJCQkkUHJldmlvdXNWYWx1ZSA9IDE7CgkJCSREb25lID0gRmFsc2U7CgkJCSRrID0gJG0gLSAxOwoJCQl3aGlsZSAoKCEkRG9uZSkgJiYgKCRrID49IDApKSB7CgkJCQkkQ3VycmVudFZhbHVlID0gJFByZXZpb3VzVmFsdWUgKiAkayArIDEgKiAoMSAtICRwcm9iYWJpbGl0eSkgLyAoKCR0cmlhbHMgLSAkaykgKiAkcHJvYmFiaWxpdHkpOwoJCQkJJFRvdGFsVW5zY2FsZWRQcm9iYWJpbGl0eSArPSAkQ3VycmVudFZhbHVlOwoJCQkJaWYgKCRrID09ICRHdWVzcykgeyAkVW5zY2FsZWRQR3Vlc3MgKz0gJEN1cnJlbnRWYWx1ZTsgfQoJCQkJaWYgKCRrIDw9ICRHdWVzcykgeyAkVW5zY2FsZWRDdW1QR3Vlc3MgKz0gJEN1cnJlbnRWYWx1ZTsgfQoJCQkJaWYgKCRDdXJyZW50VmFsdWUgPD0gJEVzc2VudGlhbGx5WmVybykgeyAkRG9uZSA9IFRydWU7IH0KCQkJCSRQcmV2aW91c1ZhbHVlID0gJEN1cnJlbnRWYWx1ZTsKCQkJCS0tJGs7CgkJCX0KCgkJCSRQR3Vlc3MgPSAkVW5zY2FsZWRQR3Vlc3MgLyAkVG90YWxVbnNjYWxlZFByb2JhYmlsaXR5OwoJCQkkQ3VtUEd1ZXNzID0gJFVuc2NhbGVkQ3VtUEd1ZXNzIC8gJFRvdGFsVW5zY2FsZWRQcm9iYWJpbGl0eTsKCi8vCQkJJEN1bVBHdWVzc01pbnVzMSA9ICRDdW1QR3Vlc3MgLSAkUEd1ZXNzOwoJCQkkQ3VtUEd1ZXNzTWludXMxID0gJEN1bVBHdWVzcyAtIDE7CgoJCQl3aGlsZSAoVHJ1ZSkgewoJCQkJaWYgKCgkQ3VtUEd1ZXNzTWludXMxIDwgJGFscGhhKSAmJiAoJEN1bVBHdWVzcyA+PSAkYWxwaGEpKSB7CgkJCQkJcmV0dXJuICRHdWVzczsKCQkJCX0gZWxzZWlmICgoJEN1bVBHdWVzc01pbnVzMSA8ICRhbHBoYSkgJiYgKCRDdW1QR3Vlc3MgPCAkYWxwaGEpKSB7CgkJCQkJJFBHdWVzc1BsdXMxID0gJFBHdWVzcyAqICgkdHJpYWxzIC0gJEd1ZXNzKSAqICRwcm9iYWJpbGl0eSAvICRHdWVzcyAvICgxIC0gJHByb2JhYmlsaXR5KTsKCQkJCQkkQ3VtUEd1ZXNzTWludXMxID0gJEN1bVBHdWVzczsKCQkJCQkkQ3VtUEd1ZXNzID0gJEN1bVBHdWVzcyArICRQR3Vlc3NQbHVzMTsKCQkJCQkkUEd1ZXNzID0gJFBHdWVzc1BsdXMxOwoJCQkJCSsrJEd1ZXNzOwoJCQkJfSBlbHNlaWYgKCgkQ3VtUEd1ZXNzTWludXMxID49ICRhbHBoYSkgJiYgKCRDdW1QR3Vlc3MgPj0gJGFscGhhKSkgewoJCQkJCSRQR3Vlc3NNaW51czEgPSAkUEd1ZXNzICogJEd1ZXNzICogKDEgLSAkcHJvYmFiaWxpdHkpIC8gKCR0cmlhbHMgLSAkR3Vlc3MgKyAxKSAvICRwcm9iYWJpbGl0eTsKCQkJCQkkQ3VtUEd1ZXNzID0gJEN1bVBHdWVzc01pbnVzMTsKCQkJCQkkQ3VtUEd1ZXNzTWludXMxID0gJEN1bVBHdWVzc01pbnVzMSAtICRQR3Vlc3M7CgkJCQkJJFBHdWVzcyA9ICRQR3Vlc3NNaW51czE7CgkJCQkJLS0kR3Vlc3M7CgkJCQl9CgkJCX0KCQl9CgkJcmV0dXJuIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6VkFMVUUoKTsKCX0JLy8JZnVuY3Rpb24gQ1JJVEJJTk9NKCkKCgoJLyoqCgkgKiBERVZTUQoJICoKCSAqIFJldHVybnMgdGhlIHN1bSBvZiBzcXVhcmVzIG9mIGRldmlhdGlvbnMgb2YgZGF0YSBwb2ludHMgZnJvbSB0aGVpciBzYW1wbGUgbWVhbi4KCSAqCgkgKiBFeGNlbCBGdW5jdGlvbjoKCSAqCQlERVZTUSh2YWx1ZTFbLHZhbHVlMlssIC4uLl1dKQoJICoKCSAqIEBhY2Nlc3MJcHVibGljCgkgKiBAY2F0ZWdvcnkgU3RhdGlzdGljYWwgRnVuY3Rpb25zCgkgKiBAcGFyYW0JbWl4ZWQJCSRhcmcsLi4uCQlEYXRhIHZhbHVlcwoJICogQHJldHVybglmbG9hdAoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIERFVlNRKCkgewoJCSRhQXJncyA9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlbkFycmF5SW5kZXhlZChmdW5jX2dldF9hcmdzKCkpOwoKCQkvLyBSZXR1cm4gdmFsdWUKCQkkcmV0dXJuVmFsdWUgPSBudWxsOwoKCQkkYU1lYW4gPSBzZWxmOjpBVkVSQUdFKCRhQXJncyk7CgkJaWYgKCRhTWVhbiAhPSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OkRJVjAoKSkgewoJCQkkYUNvdW50ID0gLTE7CgkJCWZvcmVhY2ggKCRhQXJncyBhcyAkayA9PiAkYXJnKSB7CgkJCQkvLyBJcyBpdCBhIG51bWVyaWMgdmFsdWU/CgkJCQlpZiAoKGlzX2Jvb2woJGFyZykpICYmCgkJCQkJKCghUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjppc0NlbGxWYWx1ZSgkaykpIHx8IChQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmdldENvbXBhdGliaWxpdHlNb2RlKCkgPT0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpDT01QQVRJQklMSVRZX09QRU5PRkZJQ0UpKSkgewoJCQkJCSRhcmcgPSAoaW50ZWdlcikgJGFyZzsKCQkJCX0KCQkJCWlmICgoaXNfbnVtZXJpYygkYXJnKSkgJiYgKCFpc19zdHJpbmcoJGFyZykpKSB7CgkJCQkJaWYgKGlzX251bGwoJHJldHVyblZhbHVlKSkgewoJCQkJCQkkcmV0dXJuVmFsdWUgPSBwb3coKCRhcmcgLSAkYU1lYW4pLDIpOwoJCQkJCX0gZWxzZSB7CgkJCQkJCSRyZXR1cm5WYWx1ZSArPSBwb3coKCRhcmcgLSAkYU1lYW4pLDIpOwoJCQkJCX0KCQkJCQkrKyRhQ291bnQ7CgkJCQl9CgkJCX0KCgkJCS8vIFJldHVybgoJCQlpZiAoaXNfbnVsbCgkcmV0dXJuVmFsdWUpKSB7CgkJCQlyZXR1cm4gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpOYU4oKTsKCQkJfSBlbHNlIHsKCQkJCXJldHVybiAkcmV0dXJuVmFsdWU7CgkJCX0KCQl9CgkJcmV0dXJuIHNlbGY6Ok5BKCk7Cgl9CS8vCWZ1bmN0aW9uIERFVlNRKCkKCgoJLyoqCgkgKiBFWFBPTkRJU1QKCSAqCgkgKglSZXR1cm5zIHRoZSBleHBvbmVudGlhbCBkaXN0cmlidXRpb24uIFVzZSBFWFBPTkRJU1QgdG8gbW9kZWwgdGhlIHRpbWUgYmV0d2VlbiBldmVudHMsCgkgKgkJc3VjaCBhcyBob3cgbG9uZyBhbiBhdXRvbWF0ZWQgYmFuayB0ZWxsZXIgdGFrZXMgdG8gZGVsaXZlciBjYXNoLiBGb3IgZXhhbXBsZSwgeW91IGNhbgoJICoJCXVzZSBFWFBPTkRJU1QgdG8gZGV0ZXJtaW5lIHRoZSBwcm9iYWJpbGl0eSB0aGF0IHRoZSBwcm9jZXNzIHRha2VzIGF0IG1vc3QgMSBtaW51dGUuCgkgKgoJICogQHBhcmFtCWZsb2F0CQkkdmFsdWUJCQlWYWx1ZSBvZiB0aGUgZnVuY3Rpb24KCSAqIEBwYXJhbQlmbG9hdAkJJGxhbWJkYQkJCVRoZSBwYXJhbWV0ZXIgdmFsdWUKCSAqIEBwYXJhbQlib29sZWFuCQkkY3VtdWxhdGl2ZQoJICogQHJldHVybglmbG9hdAoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIEVYUE9ORElTVCgkdmFsdWUsICRsYW1iZGEsICRjdW11bGF0aXZlKSB7CgkJJHZhbHVlCT0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuU2luZ2xlVmFsdWUoJHZhbHVlKTsKCQkkbGFtYmRhCT0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuU2luZ2xlVmFsdWUoJGxhbWJkYSk7CgkJJGN1bXVsYXRpdmUJPSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5TaW5nbGVWYWx1ZSgkY3VtdWxhdGl2ZSk7CgoJCWlmICgoaXNfbnVtZXJpYygkdmFsdWUpKSAmJiAoaXNfbnVtZXJpYygkbGFtYmRhKSkpIHsKCQkJaWYgKCgkdmFsdWUgPCAwKSB8fCAoJGxhbWJkYSA8IDApKSB7CgkJCQlyZXR1cm4gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpOYU4oKTsKCQkJfQoJCQlpZiAoKGlzX251bWVyaWMoJGN1bXVsYXRpdmUpKSB8fCAoaXNfYm9vbCgkY3VtdWxhdGl2ZSkpKSB7CgkJCQlpZiAoJGN1bXVsYXRpdmUpIHsKCQkJCQlyZXR1cm4gMSAtIGV4cCgwLSR2YWx1ZSokbGFtYmRhKTsKCQkJCX0gZWxzZSB7CgkJCQkJcmV0dXJuICRsYW1iZGEgKiBleHAoMC0kdmFsdWUqJGxhbWJkYSk7CgkJCQl9CgkJCX0KCQl9CgkJcmV0dXJuIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6VkFMVUUoKTsKCX0JLy8JZnVuY3Rpb24gRVhQT05ESVNUKCkKCgoJLyoqCgkgKiBGSVNIRVIKCSAqCgkgKiBSZXR1cm5zIHRoZSBGaXNoZXIgdHJhbnNmb3JtYXRpb24gYXQgeC4gVGhpcyB0cmFuc2Zvcm1hdGlvbiBwcm9kdWNlcyBhIGZ1bmN0aW9uIHRoYXQKCSAqCQlpcyBub3JtYWxseSBkaXN0cmlidXRlZCByYXRoZXIgdGhhbiBza2V3ZWQuIFVzZSB0aGlzIGZ1bmN0aW9uIHRvIHBlcmZvcm0gaHlwb3RoZXNpcwoJICoJCXRlc3Rpbmcgb24gdGhlIGNvcnJlbGF0aW9uIGNvZWZmaWNpZW50LgoJICoKCSAqIEBwYXJhbQlmbG9hdAkJJHZhbHVlCgkgKiBAcmV0dXJuCWZsb2F0CgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gRklTSEVSKCR2YWx1ZSkgewoJCSR2YWx1ZQk9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlblNpbmdsZVZhbHVlKCR2YWx1ZSk7CgoJCWlmIChpc19udW1lcmljKCR2YWx1ZSkpIHsKCQkJaWYgKCgkdmFsdWUgPD0gLTEpIHx8ICgkdmFsdWUgPj0gMSkpIHsKCQkJCXJldHVybiBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6Ok5hTigpOwoJCQl9CgkJCXJldHVybiAwLjUgKiBsb2coKDErJHZhbHVlKS8oMS0kdmFsdWUpKTsKCQl9CgkJcmV0dXJuIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6VkFMVUUoKTsKCX0JLy8JZnVuY3Rpb24gRklTSEVSKCkKCgoJLyoqCgkgKiBGSVNIRVJJTlYKCSAqCgkgKiBSZXR1cm5zIHRoZSBpbnZlcnNlIG9mIHRoZSBGaXNoZXIgdHJhbnNmb3JtYXRpb24uIFVzZSB0aGlzIHRyYW5zZm9ybWF0aW9uIHdoZW4KCSAqCQlhbmFseXppbmcgY29ycmVsYXRpb25zIGJldHdlZW4gcmFuZ2VzIG9yIGFycmF5cyBvZiBkYXRhLiBJZiB5ID0gRklTSEVSKHgpLCB0aGVuCgkgKgkJRklTSEVSSU5WKHkpID0geC4KCSAqCgkgKiBAcGFyYW0JZmxvYXQJCSR2YWx1ZQoJICogQHJldHVybglmbG9hdAoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIEZJU0hFUklOVigkdmFsdWUpIHsKCQkkdmFsdWUJPSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5TaW5nbGVWYWx1ZSgkdmFsdWUpOwoKCQlpZiAoaXNfbnVtZXJpYygkdmFsdWUpKSB7CgkJCXJldHVybiAoZXhwKDIgKiAkdmFsdWUpIC0gMSkgLyAoZXhwKDIgKiAkdmFsdWUpICsgMSk7CgkJfQoJCXJldHVybiBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OlZBTFVFKCk7Cgl9CS8vCWZ1bmN0aW9uIEZJU0hFUklOVigpCgoKCS8qKgoJICogRk9SRUNBU1QKCSAqCgkgKiBDYWxjdWxhdGVzLCBvciBwcmVkaWN0cywgYSBmdXR1cmUgdmFsdWUgYnkgdXNpbmcgZXhpc3RpbmcgdmFsdWVzLiBUaGUgcHJlZGljdGVkIHZhbHVlIGlzIGEgeS12YWx1ZSBmb3IgYSBnaXZlbiB4LXZhbHVlLgoJICoKCSAqIEBwYXJhbQlmbG9hdAkJCQlWYWx1ZSBvZiBYIGZvciB3aGljaCB3ZSB3YW50IHRvIGZpbmQgWQoJICogQHBhcmFtCWFycmF5IG9mIG1peGVkCQlEYXRhIFNlcmllcyBZCgkgKiBAcGFyYW0JYXJyYXkgb2YgbWl4ZWQJCURhdGEgU2VyaWVzIFgKCSAqIEByZXR1cm4JZmxvYXQKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBGT1JFQ0FTVCgkeFZhbHVlLCR5VmFsdWVzLCR4VmFsdWVzKSB7CgkJJHhWYWx1ZQk9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlblNpbmdsZVZhbHVlKCR4VmFsdWUpOwoJCWlmICghaXNfbnVtZXJpYygkeFZhbHVlKSkgewoJCQlyZXR1cm4gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpWQUxVRSgpOwoJCX0KCgkJaWYgKCFzZWxmOjpfY2hlY2tUcmVuZEFycmF5cygkeVZhbHVlcywkeFZhbHVlcykpIHsKCQkJcmV0dXJuIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6VkFMVUUoKTsKCQl9CgkJJHlWYWx1ZUNvdW50ID0gY291bnQoJHlWYWx1ZXMpOwoJCSR4VmFsdWVDb3VudCA9IGNvdW50KCR4VmFsdWVzKTsKCgkJaWYgKCgkeVZhbHVlQ291bnQgPT0gMCkgfHwgKCR5VmFsdWVDb3VudCAhPSAkeFZhbHVlQ291bnQpKSB7CgkJCXJldHVybiBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6Ok5BKCk7CgkJfSBlbHNlaWYgKCR5VmFsdWVDb3VudCA9PSAxKSB7CgkJCXJldHVybiBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OkRJVjAoKTsKCQl9CgoJCSRiZXN0Rml0TGluZWFyID0gdHJlbmRDbGFzczo6Y2FsY3VsYXRlKHRyZW5kQ2xhc3M6OlRSRU5EX0xJTkVBUiwkeVZhbHVlcywkeFZhbHVlcyk7CgkJcmV0dXJuICRiZXN0Rml0TGluZWFyLT5nZXRWYWx1ZU9mWUZvclgoJHhWYWx1ZSk7Cgl9CS8vCWZ1bmN0aW9uIEZPUkVDQVNUKCkKCgoJLyoqCgkgKiBHQU1NQURJU1QKCSAqCgkgKiBSZXR1cm5zIHRoZSBnYW1tYSBkaXN0cmlidXRpb24uCgkgKgoJICogQHBhcmFtCWZsb2F0CQkkdmFsdWUJCQlWYWx1ZSBhdCB3aGljaCB5b3Ugd2FudCB0byBldmFsdWF0ZSB0aGUgZGlzdHJpYnV0aW9uCgkgKiBAcGFyYW0JZmxvYXQJCSRhCQkJCVBhcmFtZXRlciB0byB0aGUgZGlzdHJpYnV0aW9uCgkgKiBAcGFyYW0JZmxvYXQJCSRiCQkJCVBhcmFtZXRlciB0byB0aGUgZGlzdHJpYnV0aW9uCgkgKiBAcGFyYW0JYm9vbGVhbgkJJGN1bXVsYXRpdmUKCSAqIEByZXR1cm4JZmxvYXQKCSAqCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gR0FNTUFESVNUKCR2YWx1ZSwkYSwkYiwkY3VtdWxhdGl2ZSkgewoJCSR2YWx1ZQk9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlblNpbmdsZVZhbHVlKCR2YWx1ZSk7CgkJJGEJCT0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuU2luZ2xlVmFsdWUoJGEpOwoJCSRiCQk9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlblNpbmdsZVZhbHVlKCRiKTsKCgkJaWYgKChpc19udW1lcmljKCR2YWx1ZSkpICYmIChpc19udW1lcmljKCRhKSkgJiYgKGlzX251bWVyaWMoJGIpKSkgewoJCQlpZiAoKCR2YWx1ZSA8IDApIHx8ICgkYSA8PSAwKSB8fCAoJGIgPD0gMCkpIHsKCQkJCXJldHVybiBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6Ok5hTigpOwoJCQl9CgkJCWlmICgoaXNfbnVtZXJpYygkY3VtdWxhdGl2ZSkpIHx8IChpc19ib29sKCRjdW11bGF0aXZlKSkpIHsKCQkJCWlmICgkY3VtdWxhdGl2ZSkgewoJCQkJCXJldHVybiBzZWxmOjpfaW5jb21wbGV0ZUdhbW1hKCRhLCR2YWx1ZSAvICRiKSAvIHNlbGY6Ol9nYW1tYSgkYSk7CgkJCQl9IGVsc2UgewoJCQkJCXJldHVybiAoMSAvIChwb3coJGIsJGEpICogc2VsZjo6X2dhbW1hKCRhKSkpICogcG93KCR2YWx1ZSwkYS0xKSAqIGV4cCgwLSgkdmFsdWUgLyAkYikpOwoJCQkJfQoJCQl9CgkJfQoJCXJldHVybiBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OlZBTFVFKCk7Cgl9CS8vCWZ1bmN0aW9uIEdBTU1BRElTVCgpCgoKCS8qKgoJICogR0FNTUFJTlYKCSAqCgkgKiBSZXR1cm5zIHRoZSBpbnZlcnNlIG9mIHRoZSBiZXRhIGRpc3RyaWJ1dGlvbi4KCSAqCgkgKiBAcGFyYW0JZmxvYXQJCSRwcm9iYWJpbGl0eQlQcm9iYWJpbGl0eSBhdCB3aGljaCB5b3Ugd2FudCB0byBldmFsdWF0ZSB0aGUgZGlzdHJpYnV0aW9uCgkgKiBAcGFyYW0JZmxvYXQJCSRhbHBoYQkJCVBhcmFtZXRlciB0byB0aGUgZGlzdHJpYnV0aW9uCgkgKiBAcGFyYW0JZmxvYXQJCSRiZXRhCQkJUGFyYW1ldGVyIHRvIHRoZSBkaXN0cmlidXRpb24KCSAqIEByZXR1cm4JZmxvYXQKCSAqCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gR0FNTUFJTlYoJHByb2JhYmlsaXR5LCRhbHBoYSwkYmV0YSkgewoJCSRwcm9iYWJpbGl0eQk9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlblNpbmdsZVZhbHVlKCRwcm9iYWJpbGl0eSk7CgkJJGFscGhhCQkJPSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5TaW5nbGVWYWx1ZSgkYWxwaGEpOwoJCSRiZXRhCQkJPSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5TaW5nbGVWYWx1ZSgkYmV0YSk7CgoJCWlmICgoaXNfbnVtZXJpYygkcHJvYmFiaWxpdHkpKSAmJiAoaXNfbnVtZXJpYygkYWxwaGEpKSAmJiAoaXNfbnVtZXJpYygkYmV0YSkpKSB7CgkJCWlmICgoJGFscGhhIDw9IDApIHx8ICgkYmV0YSA8PSAwKSB8fCAoJHByb2JhYmlsaXR5IDwgMCkgfHwgKCRwcm9iYWJpbGl0eSA+IDEpKSB7CgkJCQlyZXR1cm4gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpOYU4oKTsKCQkJfQoKCQkJJHhMbyA9IDA7CgkJCSR4SGkgPSAkYWxwaGEgKiAkYmV0YSAqIDU7CgoJCQkkeCA9ICR4TmV3ID0gMTsKCQkJJGVycm9yID0gJHBkZiA9IDA7CgkJCSRkeAk9IDEwMjQ7CgkJCSRpID0gMDsKCgkJCXdoaWxlICgoYWJzKCRkeCkgPiBQUkVDSVNJT04pICYmICgkaSsrIDwgTUFYX0lURVJBVElPTlMpKSB7CgkJCQkvLyBBcHBseSBOZXd0b24tUmFwaHNvbiBzdGVwCgkJCQkkZXJyb3IgPSBzZWxmOjpHQU1NQURJU1QoJHgsICRhbHBoYSwgJGJldGEsIFRydWUpIC0gJHByb2JhYmlsaXR5OwoJCQkJaWYgKCRlcnJvciA8IDAuMCkgewoJCQkJCSR4TG8gPSAkeDsKCQkJCX0gZWxzZSB7CgkJCQkJJHhIaSA9ICR4OwoJCQkJfQoJCQkJJHBkZiA9IHNlbGY6OkdBTU1BRElTVCgkeCwgJGFscGhhLCAkYmV0YSwgRmFsc2UpOwoJCQkJLy8gQXZvaWQgZGl2aXNpb24gYnkgemVybwoJCQkJaWYgKCRwZGYgIT0gMC4wKSB7CgkJCQkJJGR4ID0gJGVycm9yIC8gJHBkZjsKCQkJCQkkeE5ldyA9ICR4IC0gJGR4OwoJCQkJfQoJCQkJLy8gSWYgdGhlIE5SIGZhaWxzIHRvIGNvbnZlcmdlICh3aGljaCBmb3IgZXhhbXBsZSBtYXkgYmUgdGhlCgkJCQkvLyBjYXNlIGlmIHRoZSBpbml0aWFsIGd1ZXNzIGlzIHRvbyByb3VnaCkgd2UgYXBwbHkgYSBiaXNlY3Rpb24KCQkJCS8vIHN0ZXAgdG8gZGV0ZXJtaW5lIGEgbW9yZSBuYXJyb3cgaW50ZXJ2YWwgYXJvdW5kIHRoZSByb290LgoJCQkJaWYgKCgkeE5ldyA8ICR4TG8pIHx8ICgkeE5ldyA+ICR4SGkpIHx8ICgkcGRmID09IDAuMCkpIHsKCQkJCQkkeE5ldyA9ICgkeExvICsgJHhIaSkgLyAyOwoJCQkJCSRkeCA9ICR4TmV3IC0gJHg7CgkJCQl9CgkJCQkkeCA9ICR4TmV3OwoJCQl9CgkJCWlmICgkaSA9PSBNQVhfSVRFUkFUSU9OUykgewoJCQkJcmV0dXJuIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6TkEoKTsKCQkJfQoJCQlyZXR1cm4gJHg7CgkJfQoJCXJldHVybiBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OlZBTFVFKCk7Cgl9CS8vCWZ1bmN0aW9uIEdBTU1BSU5WKCkKCgoJLyoqCgkgKiBHQU1NQUxOCgkgKgoJICogUmV0dXJucyB0aGUgbmF0dXJhbCBsb2dhcml0aG0gb2YgdGhlIGdhbW1hIGZ1bmN0aW9uLgoJICoKCSAqIEBwYXJhbQlmbG9hdAkJJHZhbHVlCgkgKiBAcmV0dXJuCWZsb2F0CgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gR0FNTUFMTigkdmFsdWUpIHsKCQkkdmFsdWUJPSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5TaW5nbGVWYWx1ZSgkdmFsdWUpOwoKCQlpZiAoaXNfbnVtZXJpYygkdmFsdWUpKSB7CgkJCWlmICgkdmFsdWUgPD0gMCkgewoJCQkJcmV0dXJuIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6TmFOKCk7CgkJCX0KCQkJcmV0dXJuIGxvZyhzZWxmOjpfZ2FtbWEoJHZhbHVlKSk7CgkJfQoJCXJldHVybiBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OlZBTFVFKCk7Cgl9CS8vCWZ1bmN0aW9uIEdBTU1BTE4oKQoKCgkvKioKCSAqIEdFT01FQU4KCSAqCgkgKiBSZXR1cm5zIHRoZSBnZW9tZXRyaWMgbWVhbiBvZiBhbiBhcnJheSBvciByYW5nZSBvZiBwb3NpdGl2ZSBkYXRhLiBGb3IgZXhhbXBsZSwgeW91CgkgKgkJY2FuIHVzZSBHRU9NRUFOIHRvIGNhbGN1bGF0ZSBhdmVyYWdlIGdyb3d0aCByYXRlIGdpdmVuIGNvbXBvdW5kIGludGVyZXN0IHdpdGgKCSAqCQl2YXJpYWJsZSByYXRlcy4KCSAqCgkgKiBFeGNlbCBGdW5jdGlvbjoKCSAqCQlHRU9NRUFOKHZhbHVlMVssdmFsdWUyWywgLi4uXV0pCgkgKgoJICogQGFjY2VzcwlwdWJsaWMKCSAqIEBjYXRlZ29yeSBTdGF0aXN0aWNhbCBGdW5jdGlvbnMKCSAqIEBwYXJhbQltaXhlZAkJJGFyZywuLi4JCURhdGEgdmFsdWVzCgkgKiBAcmV0dXJuCWZsb2F0CgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gR0VPTUVBTigpIHsKCQkkYUFyZ3MgPSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5BcnJheShmdW5jX2dldF9hcmdzKCkpOwoKCQkkYU1lYW4gPSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9NYXRoVHJpZzo6UFJPRFVDVCgkYUFyZ3MpOwoJCWlmIChpc19udW1lcmljKCRhTWVhbikgJiYgKCRhTWVhbiA+IDApKSB7CgkJCSRhQ291bnQgPSBzZWxmOjpDT1VOVCgkYUFyZ3MpIDsKCQkJaWYgKHNlbGY6Ok1JTigkYUFyZ3MpID4gMCkgewoJCQkJcmV0dXJuIHBvdygkYU1lYW4sICgxIC8gJGFDb3VudCkpOwoJCQl9CgkJfQoJCXJldHVybiBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6Ok5hTigpOwoJfQkvLwlHRU9NRUFOKCkKCgoJLyoqCgkgKiBHUk9XVEgKCSAqCgkgKiBSZXR1cm5zIHZhbHVlcyBhbG9uZyBhIHByZWRpY3RlZCBlbXBvbmVudGlhbCB0cmVuZAoJICoKCSAqIEBwYXJhbQlhcnJheSBvZiBtaXhlZAkJRGF0YSBTZXJpZXMgWQoJICogQHBhcmFtCWFycmF5IG9mIG1peGVkCQlEYXRhIFNlcmllcyBYCgkgKiBAcGFyYW0JYXJyYXkgb2YgbWl4ZWQJCVZhbHVlcyBvZiBYIGZvciB3aGljaCB3ZSB3YW50IHRvIGZpbmQgWQoJICogQHBhcmFtCWJvb2xlYW4JCQkJQSBsb2dpY2FsIHZhbHVlIHNwZWNpZnlpbmcgd2hldGhlciB0byBmb3JjZSB0aGUgaW50ZXJzZWN0IHRvIGVxdWFsIDAuCgkgKiBAcmV0dXJuCWFycmF5IG9mIGZsb2F0CgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gR1JPV1RIKCR5VmFsdWVzLCR4VmFsdWVzPWFycmF5KCksJG5ld1ZhbHVlcz1hcnJheSgpLCRjb25zdD1UcnVlKSB7CgkJJHlWYWx1ZXMgPSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5BcnJheSgkeVZhbHVlcyk7CgkJJHhWYWx1ZXMgPSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5BcnJheSgkeFZhbHVlcyk7CgkJJG5ld1ZhbHVlcyA9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlbkFycmF5KCRuZXdWYWx1ZXMpOwoJCSRjb25zdAk9IChpc19udWxsKCRjb25zdCkpCT8gVHJ1ZSA6CShib29sZWFuKSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5TaW5nbGVWYWx1ZSgkY29uc3QpOwoKCQkkYmVzdEZpdEV4cG9uZW50aWFsID0gdHJlbmRDbGFzczo6Y2FsY3VsYXRlKHRyZW5kQ2xhc3M6OlRSRU5EX0VYUE9ORU5USUFMLCR5VmFsdWVzLCR4VmFsdWVzLCRjb25zdCk7CgkJaWYgKGVtcHR5KCRuZXdWYWx1ZXMpKSB7CgkJCSRuZXdWYWx1ZXMgPSAkYmVzdEZpdEV4cG9uZW50aWFsLT5nZXRYVmFsdWVzKCk7CgkJfQoKCQkkcmV0dXJuQXJyYXkgPSBhcnJheSgpOwoJCWZvcmVhY2goJG5ld1ZhbHVlcyBhcyAkeFZhbHVlKSB7CgkJCSRyZXR1cm5BcnJheVswXVtdID0gJGJlc3RGaXRFeHBvbmVudGlhbC0+Z2V0VmFsdWVPZllGb3JYKCR4VmFsdWUpOwoJCX0KCgkJcmV0dXJuICRyZXR1cm5BcnJheTsKCX0JLy8JZnVuY3Rpb24gR1JPV1RIKCkKCgoJLyoqCgkgKiBIQVJNRUFOCgkgKgoJICogUmV0dXJucyB0aGUgaGFybW9uaWMgbWVhbiBvZiBhIGRhdGEgc2V0LiBUaGUgaGFybW9uaWMgbWVhbiBpcyB0aGUgcmVjaXByb2NhbCBvZiB0aGUKCSAqCQlhcml0aG1ldGljIG1lYW4gb2YgcmVjaXByb2NhbHMuCgkgKgoJICogRXhjZWwgRnVuY3Rpb246CgkgKgkJSEFSTUVBTih2YWx1ZTFbLHZhbHVlMlssIC4uLl1dKQoJICoKCSAqIEBhY2Nlc3MJcHVibGljCgkgKiBAY2F0ZWdvcnkgU3RhdGlzdGljYWwgRnVuY3Rpb25zCgkgKiBAcGFyYW0JbWl4ZWQJCSRhcmcsLi4uCQlEYXRhIHZhbHVlcwoJICogQHJldHVybglmbG9hdAoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIEhBUk1FQU4oKSB7CgkJLy8gUmV0dXJuIHZhbHVlCgkJJHJldHVyblZhbHVlID0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpOQSgpOwoKCQkvLyBMb29wIHRocm91Z2ggYXJndW1lbnRzCgkJJGFBcmdzID0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuQXJyYXkoZnVuY19nZXRfYXJncygpKTsKCQlpZiAoc2VsZjo6TUlOKCRhQXJncykgPCAwKSB7CgkJCXJldHVybiBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6Ok5hTigpOwoJCX0KCQkkYUNvdW50ID0gMDsKCQlmb3JlYWNoICgkYUFyZ3MgYXMgJGFyZykgewoJCQkvLyBJcyBpdCBhIG51bWVyaWMgdmFsdWU/CgkJCWlmICgoaXNfbnVtZXJpYygkYXJnKSkgJiYgKCFpc19zdHJpbmcoJGFyZykpKSB7CgkJCQlpZiAoJGFyZyA8PSAwKSB7CgkJCQkJcmV0dXJuIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6TmFOKCk7CgkJCQl9CgkJCQlpZiAoaXNfbnVsbCgkcmV0dXJuVmFsdWUpKSB7CgkJCQkJJHJldHVyblZhbHVlID0gKDEgLyAkYXJnKTsKCQkJCX0gZWxzZSB7CgkJCQkJJHJldHVyblZhbHVlICs9ICgxIC8gJGFyZyk7CgkJCQl9CgkJCQkrKyRhQ291bnQ7CgkJCX0KCQl9CgoJCS8vIFJldHVybgoJCWlmICgkYUNvdW50ID4gMCkgewoJCQlyZXR1cm4gMSAvICgkcmV0dXJuVmFsdWUgLyAkYUNvdW50KTsKCQl9IGVsc2UgewoJCQlyZXR1cm4gJHJldHVyblZhbHVlOwoJCX0KCX0JLy8JZnVuY3Rpb24gSEFSTUVBTigpCgoKCS8qKgoJICogSFlQR0VPTURJU1QKCSAqCgkgKiBSZXR1cm5zIHRoZSBoeXBlcmdlb21ldHJpYyBkaXN0cmlidXRpb24uIEhZUEdFT01ESVNUIHJldHVybnMgdGhlIHByb2JhYmlsaXR5IG9mIGEgZ2l2ZW4gbnVtYmVyIG9mCgkgKiBzYW1wbGUgc3VjY2Vzc2VzLCBnaXZlbiB0aGUgc2FtcGxlIHNpemUsIHBvcHVsYXRpb24gc3VjY2Vzc2VzLCBhbmQgcG9wdWxhdGlvbiBzaXplLgoJICoKCSAqIEBwYXJhbQlmbG9hdAkJJHNhbXBsZVN1Y2Nlc3NlcwkJTnVtYmVyIG9mIHN1Y2Nlc3NlcyBpbiB0aGUgc2FtcGxlCgkgKiBAcGFyYW0JZmxvYXQJCSRzYW1wbGVOdW1iZXIJCQlTaXplIG9mIHRoZSBzYW1wbGUKCSAqIEBwYXJhbQlmbG9hdAkJJHBvcHVsYXRpb25TdWNjZXNzZXMJTnVtYmVyIG9mIHN1Y2Nlc3NlcyBpbiB0aGUgcG9wdWxhdGlvbgoJICogQHBhcmFtCWZsb2F0CQkkcG9wdWxhdGlvbk51bWJlcgkJUG9wdWxhdGlvbiBzaXplCgkgKiBAcmV0dXJuCWZsb2F0CgkgKgoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIEhZUEdFT01ESVNUKCRzYW1wbGVTdWNjZXNzZXMsICRzYW1wbGVOdW1iZXIsICRwb3B1bGF0aW9uU3VjY2Vzc2VzLCAkcG9wdWxhdGlvbk51bWJlcikgewoJCSRzYW1wbGVTdWNjZXNzZXMJCT0gZmxvb3IoUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuU2luZ2xlVmFsdWUoJHNhbXBsZVN1Y2Nlc3NlcykpOwoJCSRzYW1wbGVOdW1iZXIJCQk9IGZsb29yKFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlblNpbmdsZVZhbHVlKCRzYW1wbGVOdW1iZXIpKTsKCQkkcG9wdWxhdGlvblN1Y2Nlc3Nlcwk9IGZsb29yKFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlblNpbmdsZVZhbHVlKCRwb3B1bGF0aW9uU3VjY2Vzc2VzKSk7CgkJJHBvcHVsYXRpb25OdW1iZXIJCT0gZmxvb3IoUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuU2luZ2xlVmFsdWUoJHBvcHVsYXRpb25OdW1iZXIpKTsKCgkJaWYgKChpc19udW1lcmljKCRzYW1wbGVTdWNjZXNzZXMpKSAmJiAoaXNfbnVtZXJpYygkc2FtcGxlTnVtYmVyKSkgJiYgKGlzX251bWVyaWMoJHBvcHVsYXRpb25TdWNjZXNzZXMpKSAmJiAoaXNfbnVtZXJpYygkcG9wdWxhdGlvbk51bWJlcikpKSB7CgkJCWlmICgoJHNhbXBsZVN1Y2Nlc3NlcyA8IDApIHx8ICgkc2FtcGxlU3VjY2Vzc2VzID4gJHNhbXBsZU51bWJlcikgfHwgKCRzYW1wbGVTdWNjZXNzZXMgPiAkcG9wdWxhdGlvblN1Y2Nlc3NlcykpIHsKCQkJCXJldHVybiBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6Ok5hTigpOwoJCQl9CgkJCWlmICgoJHNhbXBsZU51bWJlciA8PSAwKSB8fCAoJHNhbXBsZU51bWJlciA+ICRwb3B1bGF0aW9uTnVtYmVyKSkgewoJCQkJcmV0dXJuIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6TmFOKCk7CgkJCX0KCQkJaWYgKCgkcG9wdWxhdGlvblN1Y2Nlc3NlcyA8PSAwKSB8fCAoJHBvcHVsYXRpb25TdWNjZXNzZXMgPiAkcG9wdWxhdGlvbk51bWJlcikpIHsKCQkJCXJldHVybiBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6Ok5hTigpOwoJCQl9CgkJCXJldHVybiBQSFBFeGNlbF9DYWxjdWxhdGlvbl9NYXRoVHJpZzo6Q09NQklOKCRwb3B1bGF0aW9uU3VjY2Vzc2VzLCRzYW1wbGVTdWNjZXNzZXMpICoKCQkJCSAgIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX01hdGhUcmlnOjpDT01CSU4oJHBvcHVsYXRpb25OdW1iZXIgLSAkcG9wdWxhdGlvblN1Y2Nlc3Nlcywkc2FtcGxlTnVtYmVyIC0gJHNhbXBsZVN1Y2Nlc3NlcykgLwoJCQkJICAgUEhQRXhjZWxfQ2FsY3VsYXRpb25fTWF0aFRyaWc6OkNPTUJJTigkcG9wdWxhdGlvbk51bWJlciwkc2FtcGxlTnVtYmVyKTsKCQl9CgkJcmV0dXJuIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6VkFMVUUoKTsKCX0JLy8JZnVuY3Rpb24gSFlQR0VPTURJU1QoKQoKCgkvKioKCSAqIElOVEVSQ0VQVAoJICoKCSAqIENhbGN1bGF0ZXMgdGhlIHBvaW50IGF0IHdoaWNoIGEgbGluZSB3aWxsIGludGVyc2VjdCB0aGUgeS1heGlzIGJ5IHVzaW5nIGV4aXN0aW5nIHgtdmFsdWVzIGFuZCB5LXZhbHVlcy4KCSAqCgkgKiBAcGFyYW0JYXJyYXkgb2YgbWl4ZWQJCURhdGEgU2VyaWVzIFkKCSAqIEBwYXJhbQlhcnJheSBvZiBtaXhlZAkJRGF0YSBTZXJpZXMgWAoJICogQHJldHVybglmbG9hdAoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIElOVEVSQ0VQVCgkeVZhbHVlcywkeFZhbHVlcykgewoJCWlmICghc2VsZjo6X2NoZWNrVHJlbmRBcnJheXMoJHlWYWx1ZXMsJHhWYWx1ZXMpKSB7CgkJCXJldHVybiBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OlZBTFVFKCk7CgkJfQoJCSR5VmFsdWVDb3VudCA9IGNvdW50KCR5VmFsdWVzKTsKCQkkeFZhbHVlQ291bnQgPSBjb3VudCgkeFZhbHVlcyk7CgoJCWlmICgoJHlWYWx1ZUNvdW50ID09IDApIHx8ICgkeVZhbHVlQ291bnQgIT0gJHhWYWx1ZUNvdW50KSkgewoJCQlyZXR1cm4gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpOQSgpOwoJCX0gZWxzZWlmICgkeVZhbHVlQ291bnQgPT0gMSkgewoJCQlyZXR1cm4gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpESVYwKCk7CgkJfQoKCQkkYmVzdEZpdExpbmVhciA9IHRyZW5kQ2xhc3M6OmNhbGN1bGF0ZSh0cmVuZENsYXNzOjpUUkVORF9MSU5FQVIsJHlWYWx1ZXMsJHhWYWx1ZXMpOwoJCXJldHVybiAkYmVzdEZpdExpbmVhci0+Z2V0SW50ZXJzZWN0KCk7Cgl9CS8vCWZ1bmN0aW9uIElOVEVSQ0VQVCgpCgoKCS8qKgoJICogS1VSVAoJICoKCSAqIFJldHVybnMgdGhlIGt1cnRvc2lzIG9mIGEgZGF0YSBzZXQuIEt1cnRvc2lzIGNoYXJhY3Rlcml6ZXMgdGhlIHJlbGF0aXZlIHBlYWtlZG5lc3MKCSAqIG9yIGZsYXRuZXNzIG9mIGEgZGlzdHJpYnV0aW9uIGNvbXBhcmVkIHdpdGggdGhlIG5vcm1hbCBkaXN0cmlidXRpb24uIFBvc2l0aXZlCgkgKiBrdXJ0b3NpcyBpbmRpY2F0ZXMgYSByZWxhdGl2ZWx5IHBlYWtlZCBkaXN0cmlidXRpb24uIE5lZ2F0aXZlIGt1cnRvc2lzIGluZGljYXRlcyBhCgkgKiByZWxhdGl2ZWx5IGZsYXQgZGlzdHJpYnV0aW9uLgoJICoKCSAqIEBwYXJhbQlhcnJheQlEYXRhIFNlcmllcwoJICogQHJldHVybglmbG9hdAoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIEtVUlQoKSB7CgkJJGFBcmdzID0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuQXJyYXlJbmRleGVkKGZ1bmNfZ2V0X2FyZ3MoKSk7CgkJJG1lYW4gPSBzZWxmOjpBVkVSQUdFKCRhQXJncyk7CgkJJHN0ZERldiA9IHNlbGY6OlNUREVWKCRhQXJncyk7CgoJCWlmICgkc3RkRGV2ID4gMCkgewoJCQkkY291bnQgPSAkc3VtbWVyID0gMDsKCQkJLy8gTG9vcCB0aHJvdWdoIGFyZ3VtZW50cwoJCQlmb3JlYWNoICgkYUFyZ3MgYXMgJGsgPT4gJGFyZykgewoJCQkJaWYgKChpc19ib29sKCRhcmcpKSAmJgoJCQkJCSghUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjppc01hdHJpeFZhbHVlKCRrKSkpIHsKCQkJCX0gZWxzZSB7CgkJCQkJLy8gSXMgaXQgYSBudW1lcmljIHZhbHVlPwoJCQkJCWlmICgoaXNfbnVtZXJpYygkYXJnKSkgJiYgKCFpc19zdHJpbmcoJGFyZykpKSB7CgkJCQkJCSRzdW1tZXIgKz0gcG93KCgoJGFyZyAtICRtZWFuKSAvICRzdGREZXYpLDQpIDsKCQkJCQkJKyskY291bnQ7CgkJCQkJfQoJCQkJfQoJCQl9CgoJCQkvLyBSZXR1cm4KCQkJaWYgKCRjb3VudCA+IDMpIHsKCQkJCXJldHVybiAkc3VtbWVyICogKCRjb3VudCAqICgkY291bnQrMSkgLyAoKCRjb3VudC0xKSAqICgkY291bnQtMikgKiAoJGNvdW50LTMpKSkgLSAoMyAqIHBvdygkY291bnQtMSwyKSAvICgoJGNvdW50LTIpICogKCRjb3VudC0zKSkpOwoJCQl9CgkJfQoJCXJldHVybiBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OkRJVjAoKTsKCX0JLy8JZnVuY3Rpb24gS1VSVCgpCgoKCS8qKgoJICogTEFSR0UKCSAqCgkgKiBSZXR1cm5zIHRoZSBudGggbGFyZ2VzdCB2YWx1ZSBpbiBhIGRhdGEgc2V0LiBZb3UgY2FuIHVzZSB0aGlzIGZ1bmN0aW9uIHRvCgkgKgkJc2VsZWN0IGEgdmFsdWUgYmFzZWQgb24gaXRzIHJlbGF0aXZlIHN0YW5kaW5nLgoJICoKCSAqIEV4Y2VsIEZ1bmN0aW9uOgoJICoJCUxBUkdFKHZhbHVlMVssdmFsdWUyWywgLi4uXV0sZW50cnkpCgkgKgoJICogQGFjY2VzcwlwdWJsaWMKCSAqIEBjYXRlZ29yeSBTdGF0aXN0aWNhbCBGdW5jdGlvbnMKCSAqIEBwYXJhbQltaXhlZAkJJGFyZywuLi4JCURhdGEgdmFsdWVzCgkgKiBAcGFyYW0JaW50CQkJJGVudHJ5CQkJUG9zaXRpb24gKG9yZGVyZWQgZnJvbSB0aGUgbGFyZ2VzdCkgaW4gdGhlIGFycmF5IG9yIHJhbmdlIG9mIGRhdGEgdG8gcmV0dXJuCgkgKiBAcmV0dXJuCWZsb2F0CgkgKgoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIExBUkdFKCkgewoJCSRhQXJncyA9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlbkFycmF5KGZ1bmNfZ2V0X2FyZ3MoKSk7CgoJCS8vIENhbGN1bGF0ZQoJCSRlbnRyeSA9IGZsb29yKGFycmF5X3BvcCgkYUFyZ3MpKTsKCgkJaWYgKChpc19udW1lcmljKCRlbnRyeSkpICYmICghaXNfc3RyaW5nKCRlbnRyeSkpKSB7CgkJCSRtQXJncyA9IGFycmF5KCk7CgkJCWZvcmVhY2ggKCRhQXJncyBhcyAkYXJnKSB7CgkJCQkvLyBJcyBpdCBhIG51bWVyaWMgdmFsdWU/CgkJCQlpZiAoKGlzX251bWVyaWMoJGFyZykpICYmICghaXNfc3RyaW5nKCRhcmcpKSkgewoJCQkJCSRtQXJnc1tdID0gJGFyZzsKCQkJCX0KCQkJfQoJCQkkY291bnQgPSBzZWxmOjpDT1VOVCgkbUFyZ3MpOwoJCQkkZW50cnkgPSBmbG9vcigtLSRlbnRyeSk7CgkJCWlmICgoJGVudHJ5IDwgMCkgfHwgKCRlbnRyeSA+PSAkY291bnQpIHx8ICgkY291bnQgPT0gMCkpIHsKCQkJCXJldHVybiBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6Ok5hTigpOwoJCQl9CgkJCXJzb3J0KCRtQXJncyk7CgkJCXJldHVybiAkbUFyZ3NbJGVudHJ5XTsKCQl9CgkJcmV0dXJuIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6VkFMVUUoKTsKCX0JLy8JZnVuY3Rpb24gTEFSR0UoKQoKCgkvKioKCSAqIExJTkVTVAoJICoKCSAqIENhbGN1bGF0ZXMgdGhlIHN0YXRpc3RpY3MgZm9yIGEgbGluZSBieSB1c2luZyB0aGUgImxlYXN0IHNxdWFyZXMiIG1ldGhvZCB0byBjYWxjdWxhdGUgYSBzdHJhaWdodCBsaW5lIHRoYXQgYmVzdCBmaXRzIHlvdXIgZGF0YSwKCSAqCQlhbmQgdGhlbiByZXR1cm5zIGFuIGFycmF5IHRoYXQgZGVzY3JpYmVzIHRoZSBsaW5lLgoJICoKCSAqIEBwYXJhbQlhcnJheSBvZiBtaXhlZAkJRGF0YSBTZXJpZXMgWQoJICogQHBhcmFtCWFycmF5IG9mIG1peGVkCQlEYXRhIFNlcmllcyBYCgkgKiBAcGFyYW0JYm9vbGVhbgkJCQlBIGxvZ2ljYWwgdmFsdWUgc3BlY2lmeWluZyB3aGV0aGVyIHRvIGZvcmNlIHRoZSBpbnRlcnNlY3QgdG8gZXF1YWwgMC4KCSAqIEBwYXJhbQlib29sZWFuCQkJCUEgbG9naWNhbCB2YWx1ZSBzcGVjaWZ5aW5nIHdoZXRoZXIgdG8gcmV0dXJuIGFkZGl0aW9uYWwgcmVncmVzc2lvbiBzdGF0aXN0aWNzLgoJICogQHJldHVybglhcnJheQoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIExJTkVTVCgkeVZhbHVlcywkeFZhbHVlcz1udWxsLCRjb25zdD1UcnVlLCRzdGF0cz1GYWxzZSkgewoJCSRjb25zdAk9IChpc19udWxsKCRjb25zdCkpCT8gVHJ1ZSA6CShib29sZWFuKSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5TaW5nbGVWYWx1ZSgkY29uc3QpOwoJCSRzdGF0cwk9IChpc19udWxsKCRzdGF0cykpCT8gRmFsc2UgOgkoYm9vbGVhbikgUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuU2luZ2xlVmFsdWUoJHN0YXRzKTsKCQlpZiAoaXNfbnVsbCgkeFZhbHVlcykpICR4VmFsdWVzID0gcmFuZ2UoMSxjb3VudChQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5BcnJheSgkeVZhbHVlcykpKTsKCgkJaWYgKCFzZWxmOjpfY2hlY2tUcmVuZEFycmF5cygkeVZhbHVlcywkeFZhbHVlcykpIHsKCQkJcmV0dXJuIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6VkFMVUUoKTsKCQl9CgkJJHlWYWx1ZUNvdW50ID0gY291bnQoJHlWYWx1ZXMpOwoJCSR4VmFsdWVDb3VudCA9IGNvdW50KCR4VmFsdWVzKTsKCgoJCWlmICgoJHlWYWx1ZUNvdW50ID09IDApIHx8ICgkeVZhbHVlQ291bnQgIT0gJHhWYWx1ZUNvdW50KSkgewoJCQlyZXR1cm4gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpOQSgpOwoJCX0gZWxzZWlmICgkeVZhbHVlQ291bnQgPT0gMSkgewoJCQlyZXR1cm4gMDsKCQl9CgoJCSRiZXN0Rml0TGluZWFyID0gdHJlbmRDbGFzczo6Y2FsY3VsYXRlKHRyZW5kQ2xhc3M6OlRSRU5EX0xJTkVBUiwkeVZhbHVlcywkeFZhbHVlcywkY29uc3QpOwoJCWlmICgkc3RhdHMpIHsKCQkJcmV0dXJuIGFycmF5KCBhcnJheSggJGJlc3RGaXRMaW5lYXItPmdldFNsb3BlKCksCgkJCQkJCSAJCSAkYmVzdEZpdExpbmVhci0+Z2V0U2xvcGVTRSgpLAoJCQkJCQkgCQkgJGJlc3RGaXRMaW5lYXItPmdldEdvb2RuZXNzT2ZGaXQoKSwKCQkJCQkJIAkJICRiZXN0Rml0TGluZWFyLT5nZXRGKCksCgkJCQkJCSAJCSAkYmVzdEZpdExpbmVhci0+Z2V0U1NSZWdyZXNzaW9uKCksCgkJCQkJCQkgICApLAoJCQkJCQkgIGFycmF5KCAkYmVzdEZpdExpbmVhci0+Z2V0SW50ZXJzZWN0KCksCgkJCQkJCQkJICRiZXN0Rml0TGluZWFyLT5nZXRJbnRlcnNlY3RTRSgpLAoJCQkJCQkJCSAkYmVzdEZpdExpbmVhci0+Z2V0U3RkZXZPZlJlc2lkdWFscygpLAoJCQkJCQkJCSAkYmVzdEZpdExpbmVhci0+Z2V0REZSZXNpZHVhbHMoKSwKCQkJCQkJCQkgJGJlc3RGaXRMaW5lYXItPmdldFNTUmVzaWR1YWxzKCkKCQkJCQkJCSAgICkKCQkJCQkJKTsKCQl9IGVsc2UgewoJCQlyZXR1cm4gYXJyYXkoICRiZXN0Rml0TGluZWFyLT5nZXRTbG9wZSgpLAoJCQkJCQkgICRiZXN0Rml0TGluZWFyLT5nZXRJbnRlcnNlY3QoKQoJCQkJCQkpOwoJCX0KCX0JLy8JZnVuY3Rpb24gTElORVNUKCkKCgoJLyoqCgkgKiBMT0dFU1QKCSAqCgkgKiBDYWxjdWxhdGVzIGFuIGV4cG9uZW50aWFsIGN1cnZlIHRoYXQgYmVzdCBmaXRzIHRoZSBYIGFuZCBZIGRhdGEgc2VyaWVzLAoJICoJCWFuZCB0aGVuIHJldHVybnMgYW4gYXJyYXkgdGhhdCBkZXNjcmliZXMgdGhlIGxpbmUuCgkgKgoJICogQHBhcmFtCWFycmF5IG9mIG1peGVkCQlEYXRhIFNlcmllcyBZCgkgKiBAcGFyYW0JYXJyYXkgb2YgbWl4ZWQJCURhdGEgU2VyaWVzIFgKCSAqIEBwYXJhbQlib29sZWFuCQkJCUEgbG9naWNhbCB2YWx1ZSBzcGVjaWZ5aW5nIHdoZXRoZXIgdG8gZm9yY2UgdGhlIGludGVyc2VjdCB0byBlcXVhbCAwLgoJICogQHBhcmFtCWJvb2xlYW4JCQkJQSBsb2dpY2FsIHZhbHVlIHNwZWNpZnlpbmcgd2hldGhlciB0byByZXR1cm4gYWRkaXRpb25hbCByZWdyZXNzaW9uIHN0YXRpc3RpY3MuCgkgKiBAcmV0dXJuCWFycmF5CgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gTE9HRVNUKCR5VmFsdWVzLCR4VmFsdWVzPW51bGwsJGNvbnN0PVRydWUsJHN0YXRzPUZhbHNlKSB7CgkJJGNvbnN0CT0gKGlzX251bGwoJGNvbnN0KSkJPyBUcnVlIDoJKGJvb2xlYW4pIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlblNpbmdsZVZhbHVlKCRjb25zdCk7CgkJJHN0YXRzCT0gKGlzX251bGwoJHN0YXRzKSkJPyBGYWxzZSA6CShib29sZWFuKSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5TaW5nbGVWYWx1ZSgkc3RhdHMpOwoJCWlmIChpc19udWxsKCR4VmFsdWVzKSkgJHhWYWx1ZXMgPSByYW5nZSgxLGNvdW50KFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlbkFycmF5KCR5VmFsdWVzKSkpOwoKCQlpZiAoIXNlbGY6Ol9jaGVja1RyZW5kQXJyYXlzKCR5VmFsdWVzLCR4VmFsdWVzKSkgewoJCQlyZXR1cm4gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpWQUxVRSgpOwoJCX0KCQkkeVZhbHVlQ291bnQgPSBjb3VudCgkeVZhbHVlcyk7CgkJJHhWYWx1ZUNvdW50ID0gY291bnQoJHhWYWx1ZXMpOwoKCQlmb3JlYWNoKCR5VmFsdWVzIGFzICR2YWx1ZSkgewoJCQlpZiAoJHZhbHVlIDw9IDAuMCkgewoJCQkJcmV0dXJuIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6TmFOKCk7CgkJCX0KCQl9CgoKCQlpZiAoKCR5VmFsdWVDb3VudCA9PSAwKSB8fCAoJHlWYWx1ZUNvdW50ICE9ICR4VmFsdWVDb3VudCkpIHsKCQkJcmV0dXJuIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6TkEoKTsKCQl9IGVsc2VpZiAoJHlWYWx1ZUNvdW50ID09IDEpIHsKCQkJcmV0dXJuIDE7CgkJfQoKCQkkYmVzdEZpdEV4cG9uZW50aWFsID0gdHJlbmRDbGFzczo6Y2FsY3VsYXRlKHRyZW5kQ2xhc3M6OlRSRU5EX0VYUE9ORU5USUFMLCR5VmFsdWVzLCR4VmFsdWVzLCRjb25zdCk7CgkJaWYgKCRzdGF0cykgewoJCQlyZXR1cm4gYXJyYXkoIGFycmF5KCAkYmVzdEZpdEV4cG9uZW50aWFsLT5nZXRTbG9wZSgpLAoJCQkJCQkgCQkgJGJlc3RGaXRFeHBvbmVudGlhbC0+Z2V0U2xvcGVTRSgpLAoJCQkJCQkgCQkgJGJlc3RGaXRFeHBvbmVudGlhbC0+Z2V0R29vZG5lc3NPZkZpdCgpLAoJCQkJCQkgCQkgJGJlc3RGaXRFeHBvbmVudGlhbC0+Z2V0RigpLAoJCQkJCQkgCQkgJGJlc3RGaXRFeHBvbmVudGlhbC0+Z2V0U1NSZWdyZXNzaW9uKCksCgkJCQkJCQkgICApLAoJCQkJCQkgIGFycmF5KCAkYmVzdEZpdEV4cG9uZW50aWFsLT5nZXRJbnRlcnNlY3QoKSwKCQkJCQkJCQkgJGJlc3RGaXRFeHBvbmVudGlhbC0+Z2V0SW50ZXJzZWN0U0UoKSwKCQkJCQkJCQkgJGJlc3RGaXRFeHBvbmVudGlhbC0+Z2V0U3RkZXZPZlJlc2lkdWFscygpLAoJCQkJCQkJCSAkYmVzdEZpdEV4cG9uZW50aWFsLT5nZXRERlJlc2lkdWFscygpLAoJCQkJCQkJCSAkYmVzdEZpdEV4cG9uZW50aWFsLT5nZXRTU1Jlc2lkdWFscygpCgkJCQkJCQkgICApCgkJCQkJCSk7CgkJfSBlbHNlIHsKCQkJcmV0dXJuIGFycmF5KCAkYmVzdEZpdEV4cG9uZW50aWFsLT5nZXRTbG9wZSgpLAoJCQkJCQkgICRiZXN0Rml0RXhwb25lbnRpYWwtPmdldEludGVyc2VjdCgpCgkJCQkJCSk7CgkJfQoJfQkvLwlmdW5jdGlvbiBMT0dFU1QoKQoKCgkvKioKCSAqIExPR0lOVgoJICoKCSAqIFJldHVybnMgdGhlIGludmVyc2Ugb2YgdGhlIG5vcm1hbCBjdW11bGF0aXZlIGRpc3RyaWJ1dGlvbgoJICoKCSAqIEBwYXJhbQlmbG9hdAkJJHZhbHVlCgkgKiBAcmV0dXJuCWZsb2F0CgkgKgoJICogQHRvZG8JVHJ5IGltcGxlbWVudGluZyBQIEogQWNrbGFtJ3MgcmVmaW5lbWVudCBhbGdvcml0aG0gZm9yIGdyZWF0ZXIKCSAqCQkJYWNjdXJhY3kgaWYgSSBjYW4gZ2V0IG15IGhlYWQgcm91bmQgdGhlIG1hdGhlbWF0aWNzCgkgKgkJCShhcyBkZXNjcmliZWQgYXQpIGh0dHA6Ly9ob21lLm9ubGluZS5uby9+cGphY2tsYW0vbm90ZXMvaW52bm9ybS8KCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBMT0dJTlYoJHByb2JhYmlsaXR5LCAkbWVhbiwgJHN0ZERldikgewoJCSRwcm9iYWJpbGl0eQk9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlblNpbmdsZVZhbHVlKCRwcm9iYWJpbGl0eSk7CgkJJG1lYW4JCQk9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlblNpbmdsZVZhbHVlKCRtZWFuKTsKCQkkc3RkRGV2CQkJPSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5TaW5nbGVWYWx1ZSgkc3RkRGV2KTsKCgkJaWYgKChpc19udW1lcmljKCRwcm9iYWJpbGl0eSkpICYmIChpc19udW1lcmljKCRtZWFuKSkgJiYgKGlzX251bWVyaWMoJHN0ZERldikpKSB7CgkJCWlmICgoJHByb2JhYmlsaXR5IDwgMCkgfHwgKCRwcm9iYWJpbGl0eSA+IDEpIHx8ICgkc3RkRGV2IDw9IDApKSB7CgkJCQlyZXR1cm4gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpOYU4oKTsKCQkJfQoJCQlyZXR1cm4gZXhwKCRtZWFuICsgJHN0ZERldiAqIHNlbGY6Ok5PUk1TSU5WKCRwcm9iYWJpbGl0eSkpOwoJCX0KCQlyZXR1cm4gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpWQUxVRSgpOwoJfQkvLwlmdW5jdGlvbiBMT0dJTlYoKQoKCgkvKioKCSAqIExPR05PUk1ESVNUCgkgKgoJICogUmV0dXJucyB0aGUgY3VtdWxhdGl2ZSBsb2dub3JtYWwgZGlzdHJpYnV0aW9uIG9mIHgsIHdoZXJlIGxuKHgpIGlzIG5vcm1hbGx5IGRpc3RyaWJ1dGVkCgkgKiB3aXRoIHBhcmFtZXRlcnMgbWVhbiBhbmQgc3RhbmRhcmRfZGV2LgoJICoKCSAqIEBwYXJhbQlmbG9hdAkJJHZhbHVlCgkgKiBAcmV0dXJuCWZsb2F0CgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gTE9HTk9STURJU1QoJHZhbHVlLCAkbWVhbiwgJHN0ZERldikgewoJCSR2YWx1ZQk9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlblNpbmdsZVZhbHVlKCR2YWx1ZSk7CgkJJG1lYW4JPSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5TaW5nbGVWYWx1ZSgkbWVhbik7CgkJJHN0ZERldgk9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlblNpbmdsZVZhbHVlKCRzdGREZXYpOwoKCQlpZiAoKGlzX251bWVyaWMoJHZhbHVlKSkgJiYgKGlzX251bWVyaWMoJG1lYW4pKSAmJiAoaXNfbnVtZXJpYygkc3RkRGV2KSkpIHsKCQkJaWYgKCgkdmFsdWUgPD0gMCkgfHwgKCRzdGREZXYgPD0gMCkpIHsKCQkJCXJldHVybiBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6Ok5hTigpOwoJCQl9CgkJCXJldHVybiBzZWxmOjpOT1JNU0RJU1QoKGxvZygkdmFsdWUpIC0gJG1lYW4pIC8gJHN0ZERldik7CgkJfQoJCXJldHVybiBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OlZBTFVFKCk7Cgl9CS8vCWZ1bmN0aW9uIExPR05PUk1ESVNUKCkKCgoJLyoqCgkgKiBNQVgKCSAqCgkgKiBNQVggcmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIGVsZW1lbnQgb2YgdGhlIHZhbHVlcyBwYXNzZWQgdGhhdCBoYXMgdGhlIGhpZ2hlc3QgdmFsdWUsCgkgKgkJd2l0aCBuZWdhdGl2ZSBudW1iZXJzIGNvbnNpZGVyZWQgc21hbGxlciB0aGFuIHBvc2l0aXZlIG51bWJlcnMuCgkgKgoJICogRXhjZWwgRnVuY3Rpb246CgkgKgkJTUFYKHZhbHVlMVssdmFsdWUyWywgLi4uXV0pCgkgKgoJICogQGFjY2VzcwlwdWJsaWMKCSAqIEBjYXRlZ29yeSBTdGF0aXN0aWNhbCBGdW5jdGlvbnMKCSAqIEBwYXJhbQltaXhlZAkJJGFyZywuLi4JCURhdGEgdmFsdWVzCgkgKiBAcmV0dXJuCWZsb2F0CgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gTUFYKCkgewoJCS8vIFJldHVybiB2YWx1ZQoJCSRyZXR1cm5WYWx1ZSA9IG51bGw7CgoJCS8vIExvb3AgdGhyb3VnaCBhcmd1bWVudHMKCQkkYUFyZ3MgPSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5BcnJheShmdW5jX2dldF9hcmdzKCkpOwoJCWZvcmVhY2ggKCRhQXJncyBhcyAkYXJnKSB7CgkJCS8vIElzIGl0IGEgbnVtZXJpYyB2YWx1ZT8KCQkJaWYgKChpc19udW1lcmljKCRhcmcpKSAmJiAoIWlzX3N0cmluZygkYXJnKSkpIHsKCQkJCWlmICgoaXNfbnVsbCgkcmV0dXJuVmFsdWUpKSB8fCAoJGFyZyA+ICRyZXR1cm5WYWx1ZSkpIHsKCQkJCQkkcmV0dXJuVmFsdWUgPSAkYXJnOwoJCQkJfQoJCQl9CgkJfQoKCQkvLyBSZXR1cm4KCQlpZihpc19udWxsKCRyZXR1cm5WYWx1ZSkpIHsKCQkJcmV0dXJuIDA7CgkJfQoJCXJldHVybiAkcmV0dXJuVmFsdWU7Cgl9CS8vCWZ1bmN0aW9uIE1BWCgpCgoKCS8qKgoJICogTUFYQQoJICoKCSAqIFJldHVybnMgdGhlIGdyZWF0ZXN0IHZhbHVlIGluIGEgbGlzdCBvZiBhcmd1bWVudHMsIGluY2x1ZGluZyBudW1iZXJzLCB0ZXh0LCBhbmQgbG9naWNhbCB2YWx1ZXMKCSAqCgkgKiBFeGNlbCBGdW5jdGlvbjoKCSAqCQlNQVhBKHZhbHVlMVssdmFsdWUyWywgLi4uXV0pCgkgKgoJICogQGFjY2VzcwlwdWJsaWMKCSAqIEBjYXRlZ29yeSBTdGF0aXN0aWNhbCBGdW5jdGlvbnMKCSAqIEBwYXJhbQltaXhlZAkJJGFyZywuLi4JCURhdGEgdmFsdWVzCgkgKiBAcmV0dXJuCWZsb2F0CgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gTUFYQSgpIHsKCQkvLyBSZXR1cm4gdmFsdWUKCQkkcmV0dXJuVmFsdWUgPSBudWxsOwoKCQkvLyBMb29wIHRocm91Z2ggYXJndW1lbnRzCgkJJGFBcmdzID0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuQXJyYXkoZnVuY19nZXRfYXJncygpKTsKCQlmb3JlYWNoICgkYUFyZ3MgYXMgJGFyZykgewoJCQkvLyBJcyBpdCBhIG51bWVyaWMgdmFsdWU/CgkJCWlmICgoaXNfbnVtZXJpYygkYXJnKSkgfHwgKGlzX2Jvb2woJGFyZykpIHx8ICgoaXNfc3RyaW5nKCRhcmcpICYmICgkYXJnICE9ICcnKSkpKSB7CgkJCQlpZiAoaXNfYm9vbCgkYXJnKSkgewoJCQkJCSRhcmcgPSAoaW50ZWdlcikgJGFyZzsKCQkJCX0gZWxzZWlmIChpc19zdHJpbmcoJGFyZykpIHsKCQkJCQkkYXJnID0gMDsKCQkJCX0KCQkJCWlmICgoaXNfbnVsbCgkcmV0dXJuVmFsdWUpKSB8fCAoJGFyZyA+ICRyZXR1cm5WYWx1ZSkpIHsKCQkJCQkkcmV0dXJuVmFsdWUgPSAkYXJnOwoJCQkJfQoJCQl9CgkJfQoKCQkvLyBSZXR1cm4KCQlpZihpc19udWxsKCRyZXR1cm5WYWx1ZSkpIHsKCQkJcmV0dXJuIDA7CgkJfQoJCXJldHVybiAkcmV0dXJuVmFsdWU7Cgl9CS8vCWZ1bmN0aW9uIE1BWEEoKQoKCgkvKioKCSAqIE1BWElGCgkgKgoJICogQ291bnRzIHRoZSBtYXhpbXVtIHZhbHVlIHdpdGhpbiBhIHJhbmdlIG9mIGNlbGxzIHRoYXQgY29udGFpbiBudW1iZXJzIHdpdGhpbiB0aGUgbGlzdCBvZiBhcmd1bWVudHMKCSAqCgkgKiBFeGNlbCBGdW5jdGlvbjoKCSAqCQlNQVhJRih2YWx1ZTFbLHZhbHVlMlssIC4uLl1dLGNvbmRpdGlvbikKCSAqCgkgKiBAYWNjZXNzCXB1YmxpYwoJICogQGNhdGVnb3J5IE1hdGhlbWF0aWNhbCBhbmQgVHJpZ29ub21ldHJpYyBGdW5jdGlvbnMKCSAqIEBwYXJhbQltaXhlZAkJJGFyZywuLi4JCURhdGEgdmFsdWVzCgkgKiBAcGFyYW0Jc3RyaW5nCQkkY29uZGl0aW9uCQlUaGUgY3JpdGVyaWEgdGhhdCBkZWZpbmVzIHdoaWNoIGNlbGxzIHdpbGwgYmUgY2hlY2tlZC4KCSAqIEByZXR1cm4JZmxvYXQKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBNQVhJRigkYUFyZ3MsJGNvbmRpdGlvbiwkc3VtQXJncyA9IGFycmF5KCkpIHsKCQkvLyBSZXR1cm4gdmFsdWUKCQkkcmV0dXJuVmFsdWUgPSBudWxsOwoKCQkkYUFyZ3MgPSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5BcnJheSgkYUFyZ3MpOwoJCSRzdW1BcmdzID0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuQXJyYXkoJHN1bUFyZ3MpOwoJCWlmIChlbXB0eSgkc3VtQXJncykpIHsKCQkJJHN1bUFyZ3MgPSAkYUFyZ3M7CgkJfQoJCSRjb25kaXRpb24gPSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6Ol9pZkNvbmRpdGlvbigkY29uZGl0aW9uKTsKCQkvLyBMb29wIHRocm91Z2ggYXJndW1lbnRzCgkJZm9yZWFjaCAoJGFBcmdzIGFzICRrZXkgPT4gJGFyZykgewoJCQlpZiAoIWlzX251bWVyaWMoJGFyZykpIHsgJGFyZyA9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uOjpfd3JhcFJlc3VsdChzdHJ0b3VwcGVyKCRhcmcpKTsgfQoJCQkkdGVzdENvbmRpdGlvbiA9ICc9Jy4kYXJnLiRjb25kaXRpb247CgkJCWlmIChQSFBFeGNlbF9DYWxjdWxhdGlvbjo6Z2V0SW5zdGFuY2UoKS0+X2NhbGN1bGF0ZUZvcm11bGFWYWx1ZSgkdGVzdENvbmRpdGlvbikpIHsKCQkJCWlmICgoaXNfbnVsbCgkcmV0dXJuVmFsdWUpKSB8fCAoJGFyZyA+ICRyZXR1cm5WYWx1ZSkpIHsKCQkJCQkkcmV0dXJuVmFsdWUgPSAkYXJnOwoJCQkJfQoJCQl9CgkJfQoKCQkvLyBSZXR1cm4KCQlyZXR1cm4gJHJldHVyblZhbHVlOwoJfQkvLwlmdW5jdGlvbiBNQVhJRigpCgoKCS8qKgoJICogTUVESUFOCgkgKgoJICogUmV0dXJucyB0aGUgbWVkaWFuIG9mIHRoZSBnaXZlbiBudW1iZXJzLiBUaGUgbWVkaWFuIGlzIHRoZSBudW1iZXIgaW4gdGhlIG1pZGRsZSBvZiBhIHNldCBvZiBudW1iZXJzLgoJICoKCSAqIEV4Y2VsIEZ1bmN0aW9uOgoJICoJCU1FRElBTih2YWx1ZTFbLHZhbHVlMlssIC4uLl1dKQoJICoKCSAqIEBhY2Nlc3MJcHVibGljCgkgKiBAY2F0ZWdvcnkgU3RhdGlzdGljYWwgRnVuY3Rpb25zCgkgKiBAcGFyYW0JbWl4ZWQJCSRhcmcsLi4uCQlEYXRhIHZhbHVlcwoJICogQHJldHVybglmbG9hdAoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIE1FRElBTigpIHsKCQkvLyBSZXR1cm4gdmFsdWUKCQkkcmV0dXJuVmFsdWUgPSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6Ok5hTigpOwoKCQkkbUFyZ3MgPSBhcnJheSgpOwoJCS8vIExvb3AgdGhyb3VnaCBhcmd1bWVudHMKCQkkYUFyZ3MgPSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5BcnJheShmdW5jX2dldF9hcmdzKCkpOwoJCWZvcmVhY2ggKCRhQXJncyBhcyAkYXJnKSB7CgkJCS8vIElzIGl0IGEgbnVtZXJpYyB2YWx1ZT8KCQkJaWYgKChpc19udW1lcmljKCRhcmcpKSAmJiAoIWlzX3N0cmluZygkYXJnKSkpIHsKCQkJCSRtQXJnc1tdID0gJGFyZzsKCQkJfQoJCX0KCgkJJG1WYWx1ZUNvdW50ID0gY291bnQoJG1BcmdzKTsKCQlpZiAoJG1WYWx1ZUNvdW50ID4gMCkgewoJCQlzb3J0KCRtQXJncyxTT1JUX05VTUVSSUMpOwoJCQkkbVZhbHVlQ291bnQgPSAkbVZhbHVlQ291bnQgLyAyOwoJCQlpZiAoJG1WYWx1ZUNvdW50ID09IGZsb29yKCRtVmFsdWVDb3VudCkpIHsKCQkJCSRyZXR1cm5WYWx1ZSA9ICgkbUFyZ3NbJG1WYWx1ZUNvdW50LS1dICsgJG1BcmdzWyRtVmFsdWVDb3VudF0pIC8gMjsKCQkJfSBlbHNlIHsKCQkJCSRtVmFsdWVDb3VudCA9PSBmbG9vcigkbVZhbHVlQ291bnQpOwoJCQkJJHJldHVyblZhbHVlID0gJG1BcmdzWyRtVmFsdWVDb3VudF07CgkJCX0KCQl9CgoJCS8vIFJldHVybgoJCXJldHVybiAkcmV0dXJuVmFsdWU7Cgl9CS8vCWZ1bmN0aW9uIE1FRElBTigpCgoKCS8qKgoJICogTUlOCgkgKgoJICogTUlOIHJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBlbGVtZW50IG9mIHRoZSB2YWx1ZXMgcGFzc2VkIHRoYXQgaGFzIHRoZSBzbWFsbGVzdCB2YWx1ZSwKCSAqCQl3aXRoIG5lZ2F0aXZlIG51bWJlcnMgY29uc2lkZXJlZCBzbWFsbGVyIHRoYW4gcG9zaXRpdmUgbnVtYmVycy4KCSAqCgkgKiBFeGNlbCBGdW5jdGlvbjoKCSAqCQlNSU4odmFsdWUxWyx2YWx1ZTJbLCAuLi5dXSkKCSAqCgkgKiBAYWNjZXNzCXB1YmxpYwoJICogQGNhdGVnb3J5IFN0YXRpc3RpY2FsIEZ1bmN0aW9ucwoJICogQHBhcmFtCW1peGVkCQkkYXJnLC4uLgkJRGF0YSB2YWx1ZXMKCSAqIEByZXR1cm4JZmxvYXQKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBNSU4oKSB7CgkJLy8gUmV0dXJuIHZhbHVlCgkJJHJldHVyblZhbHVlID0gbnVsbDsKCgkJLy8gTG9vcCB0aHJvdWdoIGFyZ3VtZW50cwoJCSRhQXJncyA9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlbkFycmF5KGZ1bmNfZ2V0X2FyZ3MoKSk7CgkJZm9yZWFjaCAoJGFBcmdzIGFzICRhcmcpIHsKCQkJLy8gSXMgaXQgYSBudW1lcmljIHZhbHVlPwoJCQlpZiAoKGlzX251bWVyaWMoJGFyZykpICYmICghaXNfc3RyaW5nKCRhcmcpKSkgewoJCQkJaWYgKChpc19udWxsKCRyZXR1cm5WYWx1ZSkpIHx8ICgkYXJnIDwgJHJldHVyblZhbHVlKSkgewoJCQkJCSRyZXR1cm5WYWx1ZSA9ICRhcmc7CgkJCQl9CgkJCX0KCQl9CgoJCS8vIFJldHVybgoJCWlmKGlzX251bGwoJHJldHVyblZhbHVlKSkgewoJCQlyZXR1cm4gMDsKCQl9CgkJcmV0dXJuICRyZXR1cm5WYWx1ZTsKCX0JLy8JZnVuY3Rpb24gTUlOKCkKCgoJLyoqCgkgKiBNSU5BCgkgKgoJICogUmV0dXJucyB0aGUgc21hbGxlc3QgdmFsdWUgaW4gYSBsaXN0IG9mIGFyZ3VtZW50cywgaW5jbHVkaW5nIG51bWJlcnMsIHRleHQsIGFuZCBsb2dpY2FsIHZhbHVlcwoJICoKCSAqIEV4Y2VsIEZ1bmN0aW9uOgoJICoJCU1JTkEodmFsdWUxWyx2YWx1ZTJbLCAuLi5dXSkKCSAqCgkgKiBAYWNjZXNzCXB1YmxpYwoJICogQGNhdGVnb3J5IFN0YXRpc3RpY2FsIEZ1bmN0aW9ucwoJICogQHBhcmFtCW1peGVkCQkkYXJnLC4uLgkJRGF0YSB2YWx1ZXMKCSAqIEByZXR1cm4JZmxvYXQKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBNSU5BKCkgewoJCS8vIFJldHVybiB2YWx1ZQoJCSRyZXR1cm5WYWx1ZSA9IG51bGw7CgoJCS8vIExvb3AgdGhyb3VnaCBhcmd1bWVudHMKCQkkYUFyZ3MgPSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5BcnJheShmdW5jX2dldF9hcmdzKCkpOwoJCWZvcmVhY2ggKCRhQXJncyBhcyAkYXJnKSB7CgkJCS8vIElzIGl0IGEgbnVtZXJpYyB2YWx1ZT8KCQkJaWYgKChpc19udW1lcmljKCRhcmcpKSB8fCAoaXNfYm9vbCgkYXJnKSkgfHwgKChpc19zdHJpbmcoJGFyZykgJiYgKCRhcmcgIT0gJycpKSkpIHsKCQkJCWlmIChpc19ib29sKCRhcmcpKSB7CgkJCQkJJGFyZyA9IChpbnRlZ2VyKSAkYXJnOwoJCQkJfSBlbHNlaWYgKGlzX3N0cmluZygkYXJnKSkgewoJCQkJCSRhcmcgPSAwOwoJCQkJfQoJCQkJaWYgKChpc19udWxsKCRyZXR1cm5WYWx1ZSkpIHx8ICgkYXJnIDwgJHJldHVyblZhbHVlKSkgewoJCQkJCSRyZXR1cm5WYWx1ZSA9ICRhcmc7CgkJCQl9CgkJCX0KCQl9CgoJCS8vIFJldHVybgoJCWlmKGlzX251bGwoJHJldHVyblZhbHVlKSkgewoJCQlyZXR1cm4gMDsKCQl9CgkJcmV0dXJuICRyZXR1cm5WYWx1ZTsKCX0JLy8JZnVuY3Rpb24gTUlOQSgpCgoKCS8qKgoJICogTUlOSUYKCSAqCgkgKiBSZXR1cm5zIHRoZSBtaW5pbXVtIHZhbHVlIHdpdGhpbiBhIHJhbmdlIG9mIGNlbGxzIHRoYXQgY29udGFpbiBudW1iZXJzIHdpdGhpbiB0aGUgbGlzdCBvZiBhcmd1bWVudHMKCSAqCgkgKiBFeGNlbCBGdW5jdGlvbjoKCSAqCQlNSU5JRih2YWx1ZTFbLHZhbHVlMlssIC4uLl1dLGNvbmRpdGlvbikKCSAqCgkgKiBAYWNjZXNzCXB1YmxpYwoJICogQGNhdGVnb3J5IE1hdGhlbWF0aWNhbCBhbmQgVHJpZ29ub21ldHJpYyBGdW5jdGlvbnMKCSAqIEBwYXJhbQltaXhlZAkJJGFyZywuLi4JCURhdGEgdmFsdWVzCgkgKiBAcGFyYW0Jc3RyaW5nCQkkY29uZGl0aW9uCQlUaGUgY3JpdGVyaWEgdGhhdCBkZWZpbmVzIHdoaWNoIGNlbGxzIHdpbGwgYmUgY2hlY2tlZC4KCSAqIEByZXR1cm4JZmxvYXQKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBNSU5JRigkYUFyZ3MsJGNvbmRpdGlvbiwkc3VtQXJncyA9IGFycmF5KCkpIHsKCQkvLyBSZXR1cm4gdmFsdWUKCQkkcmV0dXJuVmFsdWUgPSBudWxsOwoKCQkkYUFyZ3MgPSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5BcnJheSgkYUFyZ3MpOwoJCSRzdW1BcmdzID0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuQXJyYXkoJHN1bUFyZ3MpOwoJCWlmIChlbXB0eSgkc3VtQXJncykpIHsKCQkJJHN1bUFyZ3MgPSAkYUFyZ3M7CgkJfQoJCSRjb25kaXRpb24gPSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6Ol9pZkNvbmRpdGlvbigkY29uZGl0aW9uKTsKCQkvLyBMb29wIHRocm91Z2ggYXJndW1lbnRzCgkJZm9yZWFjaCAoJGFBcmdzIGFzICRrZXkgPT4gJGFyZykgewoJCQlpZiAoIWlzX251bWVyaWMoJGFyZykpIHsgJGFyZyA9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uOjpfd3JhcFJlc3VsdChzdHJ0b3VwcGVyKCRhcmcpKTsgfQoJCQkkdGVzdENvbmRpdGlvbiA9ICc9Jy4kYXJnLiRjb25kaXRpb247CgkJCWlmIChQSFBFeGNlbF9DYWxjdWxhdGlvbjo6Z2V0SW5zdGFuY2UoKS0+X2NhbGN1bGF0ZUZvcm11bGFWYWx1ZSgkdGVzdENvbmRpdGlvbikpIHsKCQkJCWlmICgoaXNfbnVsbCgkcmV0dXJuVmFsdWUpKSB8fCAoJGFyZyA8ICRyZXR1cm5WYWx1ZSkpIHsKCQkJCQkkcmV0dXJuVmFsdWUgPSAkYXJnOwoJCQkJfQoJCQl9CgkJfQoKCQkvLyBSZXR1cm4KCQlyZXR1cm4gJHJldHVyblZhbHVlOwoJfQkvLwlmdW5jdGlvbiBNSU5JRigpCgoKCS8vCgkvLwlTcGVjaWFsIHZhcmlhbnQgb2YgYXJyYXlfY291bnRfdmFsdWVzIHRoYXQgaXNuJ3QgbGltaXRlZCB0byBzdHJpbmdzIGFuZCBpbnRlZ2VycywKCS8vCQlidXQgY2FuIHdvcmsgd2l0aCBmbG9hdGluZyBwb2ludCBudW1iZXJzIGFzIHZhbHVlcwoJLy8KCXByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIF9tb2RlQ2FsYygkZGF0YSkgewoJCSRmcmVxdWVuY3lBcnJheSA9IGFycmF5KCk7CgkJZm9yZWFjaCgkZGF0YSBhcyAkZGF0dW0pIHsKCQkJJGZvdW5kID0gRmFsc2U7CgkJCWZvcmVhY2goJGZyZXF1ZW5jeUFycmF5IGFzICRrZXkgPT4gJHZhbHVlKSB7CgkJCQlpZiAoKHN0cmluZykgJHZhbHVlWyd2YWx1ZSddID09IChzdHJpbmcpICRkYXR1bSkgewoJCQkJCSsrJGZyZXF1ZW5jeUFycmF5WyRrZXldWydmcmVxdWVuY3knXTsKCQkJCQkkZm91bmQgPSBUcnVlOwoJCQkJCWJyZWFrOwoJCQkJfQoJCQl9CgkJCWlmICghJGZvdW5kKSB7CgkJCQkkZnJlcXVlbmN5QXJyYXlbXSA9IGFycmF5KCd2YWx1ZScJCT0+ICRkYXR1bSwKCQkJCQkJCQkJCSAgJ2ZyZXF1ZW5jeScJPT4JMSApOwoJCQl9CgkJfQoKCQlmb3JlYWNoKCRmcmVxdWVuY3lBcnJheSBhcyAka2V5ID0+ICR2YWx1ZSkgewoJCQkkZnJlcXVlbmN5TGlzdFska2V5XSA9ICR2YWx1ZVsnZnJlcXVlbmN5J107CgkJCSR2YWx1ZUxpc3RbJGtleV0gPSAkdmFsdWVbJ3ZhbHVlJ107CgkJfQoJCWFycmF5X211bHRpc29ydCgkZnJlcXVlbmN5TGlzdCwgU09SVF9ERVNDLCAkdmFsdWVMaXN0LCBTT1JUX0FTQywgU09SVF9OVU1FUklDLCAkZnJlcXVlbmN5QXJyYXkpOwoKCQlpZiAoJGZyZXF1ZW5jeUFycmF5WzBdWydmcmVxdWVuY3knXSA9PSAxKSB7CgkJCXJldHVybiBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6Ok5BKCk7CgkJfQoJCXJldHVybiAkZnJlcXVlbmN5QXJyYXlbMF1bJ3ZhbHVlJ107Cgl9CS8vCWZ1bmN0aW9uIF9tb2RlQ2FsYygpCgoKCS8qKgoJICogTU9ERQoJICoKCSAqIFJldHVybnMgdGhlIG1vc3QgZnJlcXVlbnRseSBvY2N1cnJpbmcsIG9yIHJlcGV0aXRpdmUsIHZhbHVlIGluIGFuIGFycmF5IG9yIHJhbmdlIG9mIGRhdGEKCSAqCgkgKiBFeGNlbCBGdW5jdGlvbjoKCSAqCQlNT0RFKHZhbHVlMVssdmFsdWUyWywgLi4uXV0pCgkgKgoJICogQGFjY2VzcwlwdWJsaWMKCSAqIEBjYXRlZ29yeSBTdGF0aXN0aWNhbCBGdW5jdGlvbnMKCSAqIEBwYXJhbQltaXhlZAkJJGFyZywuLi4JCURhdGEgdmFsdWVzCgkgKiBAcmV0dXJuCWZsb2F0CgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gTU9ERSgpIHsKCQkvLyBSZXR1cm4gdmFsdWUKCQkkcmV0dXJuVmFsdWUgPSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6Ok5BKCk7CgoJCS8vIExvb3AgdGhyb3VnaCBhcmd1bWVudHMKCQkkYUFyZ3MgPSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5BcnJheShmdW5jX2dldF9hcmdzKCkpOwoKCQkkbUFyZ3MgPSBhcnJheSgpOwoJCWZvcmVhY2ggKCRhQXJncyBhcyAkYXJnKSB7CgkJCS8vIElzIGl0IGEgbnVtZXJpYyB2YWx1ZT8KCQkJaWYgKChpc19udW1lcmljKCRhcmcpKSAmJiAoIWlzX3N0cmluZygkYXJnKSkpIHsKCQkJCSRtQXJnc1tdID0gJGFyZzsKCQkJfQoJCX0KCgkJaWYgKCFlbXB0eSgkbUFyZ3MpKSB7CgkJCXJldHVybiBzZWxmOjpfbW9kZUNhbGMoJG1BcmdzKTsKCQl9CgoJCS8vIFJldHVybgoJCXJldHVybiAkcmV0dXJuVmFsdWU7Cgl9CS8vCWZ1bmN0aW9uIE1PREUoKQoKCgkvKioKCSAqIE5FR0JJTk9NRElTVAoJICoKCSAqIFJldHVybnMgdGhlIG5lZ2F0aXZlIGJpbm9taWFsIGRpc3RyaWJ1dGlvbi4gTkVHQklOT01ESVNUIHJldHVybnMgdGhlIHByb2JhYmlsaXR5IHRoYXQKCSAqCQl0aGVyZSB3aWxsIGJlIG51bWJlcl9mIGZhaWx1cmVzIGJlZm9yZSB0aGUgbnVtYmVyX3MtdGggc3VjY2Vzcywgd2hlbiB0aGUgY29uc3RhbnQKCSAqCQlwcm9iYWJpbGl0eSBvZiBhIHN1Y2Nlc3MgaXMgcHJvYmFiaWxpdHlfcy4gVGhpcyBmdW5jdGlvbiBpcyBzaW1pbGFyIHRvIHRoZSBiaW5vbWlhbAoJICoJCWRpc3RyaWJ1dGlvbiwgZXhjZXB0IHRoYXQgdGhlIG51bWJlciBvZiBzdWNjZXNzZXMgaXMgZml4ZWQsIGFuZCB0aGUgbnVtYmVyIG9mIHRyaWFscyBpcwoJICoJCXZhcmlhYmxlLiBMaWtlIHRoZSBiaW5vbWlhbCwgdHJpYWxzIGFyZSBhc3N1bWVkIHRvIGJlIGluZGVwZW5kZW50LgoJICoKCSAqIEBwYXJhbQlmbG9hdAkJJGZhaWx1cmVzCQlOdW1iZXIgb2YgRmFpbHVyZXMKCSAqIEBwYXJhbQlmbG9hdAkJJHN1Y2Nlc3NlcwkJVGhyZXNob2xkIG51bWJlciBvZiBTdWNjZXNzZXMKCSAqIEBwYXJhbQlmbG9hdAkJJHByb2JhYmlsaXR5CVByb2JhYmlsaXR5IG9mIHN1Y2Nlc3Mgb24gZWFjaCB0cmlhbAoJICogQHJldHVybglmbG9hdAoJICoKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBORUdCSU5PTURJU1QoJGZhaWx1cmVzLCAkc3VjY2Vzc2VzLCAkcHJvYmFiaWxpdHkpIHsKCQkkZmFpbHVyZXMJCT0gZmxvb3IoUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuU2luZ2xlVmFsdWUoJGZhaWx1cmVzKSk7CgkJJHN1Y2Nlc3NlcwkJPSBmbG9vcihQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5TaW5nbGVWYWx1ZSgkc3VjY2Vzc2VzKSk7CgkJJHByb2JhYmlsaXR5CT0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuU2luZ2xlVmFsdWUoJHByb2JhYmlsaXR5KTsKCgkJaWYgKChpc19udW1lcmljKCRmYWlsdXJlcykpICYmIChpc19udW1lcmljKCRzdWNjZXNzZXMpKSAmJiAoaXNfbnVtZXJpYygkcHJvYmFiaWxpdHkpKSkgewoJCQlpZiAoKCRmYWlsdXJlcyA8IDApIHx8ICgkc3VjY2Vzc2VzIDwgMSkpIHsKCQkJCXJldHVybiBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6Ok5hTigpOwoJCQl9CgkJCWlmICgoJHByb2JhYmlsaXR5IDwgMCkgfHwgKCRwcm9iYWJpbGl0eSA+IDEpKSB7CgkJCQlyZXR1cm4gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpOYU4oKTsKCQkJfQoJCQlpZiAoUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpnZXRDb21wYXRpYmlsaXR5TW9kZSgpID09IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6Q09NUEFUSUJJTElUWV9HTlVNRVJJQykgewoJCQkJaWYgKCgkZmFpbHVyZXMgKyAkc3VjY2Vzc2VzIC0gMSkgPD0gMCkgewoJCQkJCXJldHVybiBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6Ok5hTigpOwoJCQkJfQoJCQl9CgkJCXJldHVybiAoUEhQRXhjZWxfQ2FsY3VsYXRpb25fTWF0aFRyaWc6OkNPTUJJTigkZmFpbHVyZXMgKyAkc3VjY2Vzc2VzIC0gMSwkc3VjY2Vzc2VzIC0gMSkpICogKHBvdygkcHJvYmFiaWxpdHksJHN1Y2Nlc3NlcykpICogKHBvdygxIC0gJHByb2JhYmlsaXR5LCRmYWlsdXJlcykpIDsKCQl9CgkJcmV0dXJuIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6VkFMVUUoKTsKCX0JLy8JZnVuY3Rpb24gTkVHQklOT01ESVNUKCkKCgoJLyoqCgkgKiBOT1JNRElTVAoJICoKCSAqIFJldHVybnMgdGhlIG5vcm1hbCBkaXN0cmlidXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgbWVhbiBhbmQgc3RhbmRhcmQgZGV2aWF0aW9uLiBUaGlzCgkgKiBmdW5jdGlvbiBoYXMgYSB2ZXJ5IHdpZGUgcmFuZ2Ugb2YgYXBwbGljYXRpb25zIGluIHN0YXRpc3RpY3MsIGluY2x1ZGluZyBoeXBvdGhlc2lzCgkgKiB0ZXN0aW5nLgoJICoKCSAqIEBwYXJhbQlmbG9hdAkJJHZhbHVlCgkgKiBAcGFyYW0JZmxvYXQJCSRtZWFuCQlNZWFuIFZhbHVlCgkgKiBAcGFyYW0JZmxvYXQJCSRzdGREZXYJCVN0YW5kYXJkIERldmlhdGlvbgoJICogQHBhcmFtCWJvb2xlYW4JCSRjdW11bGF0aXZlCgkgKiBAcmV0dXJuCWZsb2F0CgkgKgoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIE5PUk1ESVNUKCR2YWx1ZSwgJG1lYW4sICRzdGREZXYsICRjdW11bGF0aXZlKSB7CgkJJHZhbHVlCT0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuU2luZ2xlVmFsdWUoJHZhbHVlKTsKCQkkbWVhbgk9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlblNpbmdsZVZhbHVlKCRtZWFuKTsKCQkkc3RkRGV2CT0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuU2luZ2xlVmFsdWUoJHN0ZERldik7CgoJCWlmICgoaXNfbnVtZXJpYygkdmFsdWUpKSAmJiAoaXNfbnVtZXJpYygkbWVhbikpICYmIChpc19udW1lcmljKCRzdGREZXYpKSkgewoJCQlpZiAoJHN0ZERldiA8IDApIHsKCQkJCXJldHVybiBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6Ok5hTigpOwoJCQl9CgkJCWlmICgoaXNfbnVtZXJpYygkY3VtdWxhdGl2ZSkpIHx8IChpc19ib29sKCRjdW11bGF0aXZlKSkpIHsKCQkJCWlmICgkY3VtdWxhdGl2ZSkgewoJCQkJCXJldHVybiAwLjUgKiAoMSArIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0VuZ2luZWVyaW5nOjpfZXJmVmFsKCgkdmFsdWUgLSAkbWVhbikgLyAoJHN0ZERldiAqIHNxcnQoMikpKSk7CgkJCQl9IGVsc2UgewoJCQkJCXJldHVybiAoMSAvIChTUVJUMlBJICogJHN0ZERldikpICogZXhwKDAgLSAocG93KCR2YWx1ZSAtICRtZWFuLDIpIC8gKDIgKiAoJHN0ZERldiAqICRzdGREZXYpKSkpOwoJCQkJfQoJCQl9CgkJfQoJCXJldHVybiBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OlZBTFVFKCk7Cgl9CS8vCWZ1bmN0aW9uIE5PUk1ESVNUKCkKCgoJLyoqCgkgKiBOT1JNSU5WCgkgKgoJICogUmV0dXJucyB0aGUgaW52ZXJzZSBvZiB0aGUgbm9ybWFsIGN1bXVsYXRpdmUgZGlzdHJpYnV0aW9uIGZvciB0aGUgc3BlY2lmaWVkIG1lYW4gYW5kIHN0YW5kYXJkIGRldmlhdGlvbi4KCSAqCgkgKiBAcGFyYW0JZmxvYXQJCSR2YWx1ZQoJICogQHBhcmFtCWZsb2F0CQkkbWVhbgkJTWVhbiBWYWx1ZQoJICogQHBhcmFtCWZsb2F0CQkkc3RkRGV2CQlTdGFuZGFyZCBEZXZpYXRpb24KCSAqIEByZXR1cm4JZmxvYXQKCSAqCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gTk9STUlOVigkcHJvYmFiaWxpdHksJG1lYW4sJHN0ZERldikgewoJCSRwcm9iYWJpbGl0eQk9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlblNpbmdsZVZhbHVlKCRwcm9iYWJpbGl0eSk7CgkJJG1lYW4JCQk9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlblNpbmdsZVZhbHVlKCRtZWFuKTsKCQkkc3RkRGV2CQkJPSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5TaW5nbGVWYWx1ZSgkc3RkRGV2KTsKCgkJaWYgKChpc19udW1lcmljKCRwcm9iYWJpbGl0eSkpICYmIChpc19udW1lcmljKCRtZWFuKSkgJiYgKGlzX251bWVyaWMoJHN0ZERldikpKSB7CgkJCWlmICgoJHByb2JhYmlsaXR5IDwgMCkgfHwgKCRwcm9iYWJpbGl0eSA+IDEpKSB7CgkJCQlyZXR1cm4gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpOYU4oKTsKCQkJfQoJCQlpZiAoJHN0ZERldiA8IDApIHsKCQkJCXJldHVybiBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6Ok5hTigpOwoJCQl9CgkJCXJldHVybiAoc2VsZjo6X2ludmVyc2VfbmNkZigkcHJvYmFiaWxpdHkpICogJHN0ZERldikgKyAkbWVhbjsKCQl9CgkJcmV0dXJuIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6VkFMVUUoKTsKCX0JLy8JZnVuY3Rpb24gTk9STUlOVigpCgoKCS8qKgoJICogTk9STVNESVNUCgkgKgoJICogUmV0dXJucyB0aGUgc3RhbmRhcmQgbm9ybWFsIGN1bXVsYXRpdmUgZGlzdHJpYnV0aW9uIGZ1bmN0aW9uLiBUaGUgZGlzdHJpYnV0aW9uIGhhcwoJICogYSBtZWFuIG9mIDAgKHplcm8pIGFuZCBhIHN0YW5kYXJkIGRldmlhdGlvbiBvZiBvbmUuIFVzZSB0aGlzIGZ1bmN0aW9uIGluIHBsYWNlIG9mIGEKCSAqIHRhYmxlIG9mIHN0YW5kYXJkIG5vcm1hbCBjdXJ2ZSBhcmVhcy4KCSAqCgkgKiBAcGFyYW0JZmxvYXQJCSR2YWx1ZQoJICogQHJldHVybglmbG9hdAoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIE5PUk1TRElTVCgkdmFsdWUpIHsKCQkkdmFsdWUJPSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5TaW5nbGVWYWx1ZSgkdmFsdWUpOwoKCQlyZXR1cm4gc2VsZjo6Tk9STURJU1QoJHZhbHVlLCAwLCAxLCBUcnVlKTsKCX0JLy8JZnVuY3Rpb24gTk9STVNESVNUKCkKCgoJLyoqCgkgKiBOT1JNU0lOVgoJICoKCSAqIFJldHVybnMgdGhlIGludmVyc2Ugb2YgdGhlIHN0YW5kYXJkIG5vcm1hbCBjdW11bGF0aXZlIGRpc3RyaWJ1dGlvbgoJICoKCSAqIEBwYXJhbQlmbG9hdAkJJHZhbHVlCgkgKiBAcmV0dXJuCWZsb2F0CgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gTk9STVNJTlYoJHZhbHVlKSB7CgkJcmV0dXJuIHNlbGY6Ok5PUk1JTlYoJHZhbHVlLCAwLCAxKTsKCX0JLy8JZnVuY3Rpb24gTk9STVNJTlYoKQoKCgkvKioKCSAqIFBFUkNFTlRJTEUKCSAqCgkgKiBSZXR1cm5zIHRoZSBudGggcGVyY2VudGlsZSBvZiB2YWx1ZXMgaW4gYSByYW5nZS4uCgkgKgoJICogRXhjZWwgRnVuY3Rpb246CgkgKgkJUEVSQ0VOVElMRSh2YWx1ZTFbLHZhbHVlMlssIC4uLl1dLGVudHJ5KQoJICoKCSAqIEBhY2Nlc3MJcHVibGljCgkgKiBAY2F0ZWdvcnkgU3RhdGlzdGljYWwgRnVuY3Rpb25zCgkgKiBAcGFyYW0JbWl4ZWQJCSRhcmcsLi4uCQlEYXRhIHZhbHVlcwoJICogQHBhcmFtCWZsb2F0CQkkZW50cnkJCQlQZXJjZW50aWxlIHZhbHVlIGluIHRoZSByYW5nZSAwLi4xLCBpbmNsdXNpdmUuCgkgKiBAcmV0dXJuCWZsb2F0CgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gUEVSQ0VOVElMRSgpIHsKCQkkYUFyZ3MgPSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5BcnJheShmdW5jX2dldF9hcmdzKCkpOwoKCQkvLyBDYWxjdWxhdGUKCQkkZW50cnkgPSBhcnJheV9wb3AoJGFBcmdzKTsKCgkJaWYgKChpc19udW1lcmljKCRlbnRyeSkpICYmICghaXNfc3RyaW5nKCRlbnRyeSkpKSB7CgkJCWlmICgoJGVudHJ5IDwgMCkgfHwgKCRlbnRyeSA+IDEpKSB7CgkJCQlyZXR1cm4gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpOYU4oKTsKCQkJfQoJCQkkbUFyZ3MgPSBhcnJheSgpOwoJCQlmb3JlYWNoICgkYUFyZ3MgYXMgJGFyZykgewoJCQkJLy8gSXMgaXQgYSBudW1lcmljIHZhbHVlPwoJCQkJaWYgKChpc19udW1lcmljKCRhcmcpKSAmJiAoIWlzX3N0cmluZygkYXJnKSkpIHsKCQkJCQkkbUFyZ3NbXSA9ICRhcmc7CgkJCQl9CgkJCX0KCQkJJG1WYWx1ZUNvdW50ID0gY291bnQoJG1BcmdzKTsKCQkJaWYgKCRtVmFsdWVDb3VudCA+IDApIHsKCQkJCXNvcnQoJG1BcmdzKTsKCQkJCSRjb3VudCA9IHNlbGY6OkNPVU5UKCRtQXJncyk7CgkJCQkkaW5kZXggPSAkZW50cnkgKiAoJGNvdW50LTEpOwoJCQkJJGlCYXNlID0gZmxvb3IoJGluZGV4KTsKCQkJCWlmICgkaW5kZXggPT0gJGlCYXNlKSB7CgkJCQkJcmV0dXJuICRtQXJnc1skaW5kZXhdOwoJCQkJfSBlbHNlIHsKCQkJCQkkaU5leHQgPSAkaUJhc2UgKyAxOwoJCQkJCSRpUHJvcG9ydGlvbiA9ICRpbmRleCAtICRpQmFzZTsKCQkJCQlyZXR1cm4gJG1BcmdzWyRpQmFzZV0gKyAoKCRtQXJnc1skaU5leHRdIC0gJG1BcmdzWyRpQmFzZV0pICogJGlQcm9wb3J0aW9uKSA7CgkJCQl9CgkJCX0KCQl9CgkJcmV0dXJuIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6VkFMVUUoKTsKCX0JLy8JZnVuY3Rpb24gUEVSQ0VOVElMRSgpCgoKCS8qKgoJICogUEVSQ0VOVFJBTksKCSAqCgkgKiBSZXR1cm5zIHRoZSByYW5rIG9mIGEgdmFsdWUgaW4gYSBkYXRhIHNldCBhcyBhIHBlcmNlbnRhZ2Ugb2YgdGhlIGRhdGEgc2V0LgoJICoKCSAqIEBwYXJhbQlhcnJheSBvZiBudW1iZXIJCUFuIGFycmF5IG9mLCBvciBhIHJlZmVyZW5jZSB0bywgYSBsaXN0IG9mIG51bWJlcnMuCgkgKiBAcGFyYW0JbnVtYmVyCQkJCVRoZSBudW1iZXIgd2hvc2UgcmFuayB5b3Ugd2FudCB0byBmaW5kLgoJICogQHBhcmFtCW51bWJlcgkJCQlUaGUgbnVtYmVyIG9mIHNpZ25pZmljYW50IGRpZ2l0cyBmb3IgdGhlIHJldHVybmVkIHBlcmNlbnRhZ2UgdmFsdWUuCgkgKiBAcmV0dXJuCWZsb2F0CgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gUEVSQ0VOVFJBTksoJHZhbHVlU2V0LCR2YWx1ZSwkc2lnbmlmaWNhbmNlPTMpIHsKCQkkdmFsdWVTZXQJPSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5BcnJheSgkdmFsdWVTZXQpOwoJCSR2YWx1ZQkJPSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5TaW5nbGVWYWx1ZSgkdmFsdWUpOwoJCSRzaWduaWZpY2FuY2UJPSAoaXNfbnVsbCgkc2lnbmlmaWNhbmNlKSkJPyAzIDoJKGludGVnZXIpIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlblNpbmdsZVZhbHVlKCRzaWduaWZpY2FuY2UpOwoKCQlmb3JlYWNoKCR2YWx1ZVNldCBhcyAka2V5ID0+ICR2YWx1ZUVudHJ5KSB7CgkJCWlmICghaXNfbnVtZXJpYygkdmFsdWVFbnRyeSkpIHsKCQkJCXVuc2V0KCR2YWx1ZVNldFska2V5XSk7CgkJCX0KCQl9CgkJc29ydCgkdmFsdWVTZXQsU09SVF9OVU1FUklDKTsKCQkkdmFsdWVDb3VudCA9IGNvdW50KCR2YWx1ZVNldCk7CgkJaWYgKCR2YWx1ZUNvdW50ID09IDApIHsKCQkJcmV0dXJuIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6TmFOKCk7CgkJfQoKCQkkdmFsdWVBZGp1c3RvciA9ICR2YWx1ZUNvdW50IC0gMTsKCQlpZiAoKCR2YWx1ZSA8ICR2YWx1ZVNldFswXSkgfHwgKCR2YWx1ZSA+ICR2YWx1ZVNldFskdmFsdWVBZGp1c3Rvcl0pKSB7CgkJCXJldHVybiBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6Ok5BKCk7CgkJfQoKCQkkcG9zID0gYXJyYXlfc2VhcmNoKCR2YWx1ZSwkdmFsdWVTZXQpOwoJCWlmICgkcG9zID09PSBGYWxzZSkgewoJCQkkcG9zID0gMDsKCQkJJHRlc3RWYWx1ZSA9ICR2YWx1ZVNldFswXTsKCQkJd2hpbGUgKCR0ZXN0VmFsdWUgPCAkdmFsdWUpIHsKCQkJCSR0ZXN0VmFsdWUgPSAkdmFsdWVTZXRbKyskcG9zXTsKCQkJfQoJCQktLSRwb3M7CgkJCSRwb3MgKz0gKCgkdmFsdWUgLSAkdmFsdWVTZXRbJHBvc10pIC8gKCR0ZXN0VmFsdWUgLSAkdmFsdWVTZXRbJHBvc10pKTsKCQl9CgoJCXJldHVybiByb3VuZCgkcG9zIC8gJHZhbHVlQWRqdXN0b3IsJHNpZ25pZmljYW5jZSk7Cgl9CS8vCWZ1bmN0aW9uIFBFUkNFTlRSQU5LKCkKCgoJLyoqCgkgKiBQRVJNVVQKCSAqCgkgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgcGVybXV0YXRpb25zIGZvciBhIGdpdmVuIG51bWJlciBvZiBvYmplY3RzIHRoYXQgY2FuIGJlCgkgKgkJc2VsZWN0ZWQgZnJvbSBudW1iZXIgb2JqZWN0cy4gQSBwZXJtdXRhdGlvbiBpcyBhbnkgc2V0IG9yIHN1YnNldCBvZiBvYmplY3RzIG9yCgkgKgkJZXZlbnRzIHdoZXJlIGludGVybmFsIG9yZGVyIGlzIHNpZ25pZmljYW50LiBQZXJtdXRhdGlvbnMgYXJlIGRpZmZlcmVudCBmcm9tCgkgKgkJY29tYmluYXRpb25zLCBmb3Igd2hpY2ggdGhlIGludGVybmFsIG9yZGVyIGlzIG5vdCBzaWduaWZpY2FudC4gVXNlIHRoaXMgZnVuY3Rpb24KCSAqCQlmb3IgbG90dGVyeS1zdHlsZSBwcm9iYWJpbGl0eSBjYWxjdWxhdGlvbnMuCgkgKgoJICogQHBhcmFtCWludAkJJG51bU9ianMJTnVtYmVyIG9mIGRpZmZlcmVudCBvYmplY3RzCgkgKiBAcGFyYW0JaW50CQkkbnVtSW5TZXQJTnVtYmVyIG9mIG9iamVjdHMgaW4gZWFjaCBwZXJtdXRhdGlvbgoJICogQHJldHVybglpbnQJCU51bWJlciBvZiBwZXJtdXRhdGlvbnMKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBQRVJNVVQoJG51bU9ianMsJG51bUluU2V0KSB7CgkJJG51bU9ianMJPSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5TaW5nbGVWYWx1ZSgkbnVtT2Jqcyk7CgkJJG51bUluU2V0CT0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuU2luZ2xlVmFsdWUoJG51bUluU2V0KTsKCgkJaWYgKChpc19udW1lcmljKCRudW1PYmpzKSkgJiYgKGlzX251bWVyaWMoJG51bUluU2V0KSkpIHsKCQkJJG51bUluU2V0ID0gZmxvb3IoJG51bUluU2V0KTsKCQkJaWYgKCRudW1PYmpzIDwgJG51bUluU2V0KSB7CgkJCQlyZXR1cm4gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpOYU4oKTsKCQkJfQoJCQlyZXR1cm4gcm91bmQoUEhQRXhjZWxfQ2FsY3VsYXRpb25fTWF0aFRyaWc6OkZBQ1QoJG51bU9ianMpIC8gUEhQRXhjZWxfQ2FsY3VsYXRpb25fTWF0aFRyaWc6OkZBQ1QoJG51bU9ianMgLSAkbnVtSW5TZXQpKTsKCQl9CgkJcmV0dXJuIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6VkFMVUUoKTsKCX0JLy8JZnVuY3Rpb24gUEVSTVVUKCkKCgoJLyoqCgkgKiBQT0lTU09OCgkgKgoJICogUmV0dXJucyB0aGUgUG9pc3NvbiBkaXN0cmlidXRpb24uIEEgY29tbW9uIGFwcGxpY2F0aW9uIG9mIHRoZSBQb2lzc29uIGRpc3RyaWJ1dGlvbgoJICogaXMgcHJlZGljdGluZyB0aGUgbnVtYmVyIG9mIGV2ZW50cyBvdmVyIGEgc3BlY2lmaWMgdGltZSwgc3VjaCBhcyB0aGUgbnVtYmVyIG9mCgkgKiBjYXJzIGFycml2aW5nIGF0IGEgdG9sbCBwbGF6YSBpbiAxIG1pbnV0ZS4KCSAqCgkgKiBAcGFyYW0JZmxvYXQJCSR2YWx1ZQoJICogQHBhcmFtCWZsb2F0CQkkbWVhbgkJTWVhbiBWYWx1ZQoJICogQHBhcmFtCWJvb2xlYW4JCSRjdW11bGF0aXZlCgkgKiBAcmV0dXJuCWZsb2F0CgkgKgoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIFBPSVNTT04oJHZhbHVlLCAkbWVhbiwgJGN1bXVsYXRpdmUpIHsKCQkkdmFsdWUJPSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5TaW5nbGVWYWx1ZSgkdmFsdWUpOwoJCSRtZWFuCT0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuU2luZ2xlVmFsdWUoJG1lYW4pOwoKCQlpZiAoKGlzX251bWVyaWMoJHZhbHVlKSkgJiYgKGlzX251bWVyaWMoJG1lYW4pKSkgewoJCQlpZiAoKCR2YWx1ZSA8PSAwKSB8fCAoJG1lYW4gPD0gMCkpIHsKCQkJCXJldHVybiBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6Ok5hTigpOwoJCQl9CgkJCWlmICgoaXNfbnVtZXJpYygkY3VtdWxhdGl2ZSkpIHx8IChpc19ib29sKCRjdW11bGF0aXZlKSkpIHsKCQkJCWlmICgkY3VtdWxhdGl2ZSkgewoJCQkJCSRzdW1tZXIgPSAwOwoJCQkJCWZvciAoJGkgPSAwOyAkaSA8PSBmbG9vcigkdmFsdWUpOyArKyRpKSB7CgkJCQkJCSRzdW1tZXIgKz0gcG93KCRtZWFuLCRpKSAvIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX01hdGhUcmlnOjpGQUNUKCRpKTsKCQkJCQl9CgkJCQkJcmV0dXJuIGV4cCgwLSRtZWFuKSAqICRzdW1tZXI7CgkJCQl9IGVsc2UgewoJCQkJCXJldHVybiAoZXhwKDAtJG1lYW4pICogcG93KCRtZWFuLCR2YWx1ZSkpIC8gUEhQRXhjZWxfQ2FsY3VsYXRpb25fTWF0aFRyaWc6OkZBQ1QoJHZhbHVlKTsKCQkJCX0KCQkJfQoJCX0KCQlyZXR1cm4gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpWQUxVRSgpOwoJfQkvLwlmdW5jdGlvbiBQT0lTU09OKCkKCgoJLyoqCgkgKiBRVUFSVElMRQoJICoKCSAqIFJldHVybnMgdGhlIHF1YXJ0aWxlIG9mIGEgZGF0YSBzZXQuCgkgKgoJICogRXhjZWwgRnVuY3Rpb246CgkgKgkJUVVBUlRJTEUodmFsdWUxWyx2YWx1ZTJbLCAuLi5dXSxlbnRyeSkKCSAqCgkgKiBAYWNjZXNzCXB1YmxpYwoJICogQGNhdGVnb3J5IFN0YXRpc3RpY2FsIEZ1bmN0aW9ucwoJICogQHBhcmFtCW1peGVkCQkkYXJnLC4uLgkJRGF0YSB2YWx1ZXMKCSAqIEBwYXJhbQlpbnQJCQkkZW50cnkJCQlRdWFydGlsZSB2YWx1ZSBpbiB0aGUgcmFuZ2UgMS4uMywgaW5jbHVzaXZlLgoJICogQHJldHVybglmbG9hdAoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIFFVQVJUSUxFKCkgewoJCSRhQXJncyA9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlbkFycmF5KGZ1bmNfZ2V0X2FyZ3MoKSk7CgoJCS8vIENhbGN1bGF0ZQoJCSRlbnRyeSA9IGZsb29yKGFycmF5X3BvcCgkYUFyZ3MpKTsKCgkJaWYgKChpc19udW1lcmljKCRlbnRyeSkpICYmICghaXNfc3RyaW5nKCRlbnRyeSkpKSB7CgkJCSRlbnRyeSAvPSA0OwoJCQlpZiAoKCRlbnRyeSA8IDApIHx8ICgkZW50cnkgPiAxKSkgewoJCQkJcmV0dXJuIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6TmFOKCk7CgkJCX0KCQkJcmV0dXJuIHNlbGY6OlBFUkNFTlRJTEUoJGFBcmdzLCRlbnRyeSk7CgkJfQoJCXJldHVybiBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OlZBTFVFKCk7Cgl9CS8vCWZ1bmN0aW9uIFFVQVJUSUxFKCkKCgoJLyoqCgkgKiBSQU5LCgkgKgoJICogUmV0dXJucyB0aGUgcmFuayBvZiBhIG51bWJlciBpbiBhIGxpc3Qgb2YgbnVtYmVycy4KCSAqCgkgKiBAcGFyYW0JbnVtYmVyCQkJCVRoZSBudW1iZXIgd2hvc2UgcmFuayB5b3Ugd2FudCB0byBmaW5kLgoJICogQHBhcmFtCWFycmF5IG9mIG51bWJlcgkJQW4gYXJyYXkgb2YsIG9yIGEgcmVmZXJlbmNlIHRvLCBhIGxpc3Qgb2YgbnVtYmVycy4KCSAqIEBwYXJhbQltaXhlZAkJCQlPcmRlciB0byBzb3J0IHRoZSB2YWx1ZXMgaW4gdGhlIHZhbHVlIHNldAoJICogQHJldHVybglmbG9hdAoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIFJBTksoJHZhbHVlLCR2YWx1ZVNldCwkb3JkZXI9MCkgewoJCSR2YWx1ZSA9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlblNpbmdsZVZhbHVlKCR2YWx1ZSk7CgkJJHZhbHVlU2V0ID0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuQXJyYXkoJHZhbHVlU2V0KTsKCQkkb3JkZXIJPSAoaXNfbnVsbCgkb3JkZXIpKQk/IDAgOgkoaW50ZWdlcikgUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuU2luZ2xlVmFsdWUoJG9yZGVyKTsKCgkJZm9yZWFjaCgkdmFsdWVTZXQgYXMgJGtleSA9PiAkdmFsdWVFbnRyeSkgewoJCQlpZiAoIWlzX251bWVyaWMoJHZhbHVlRW50cnkpKSB7CgkJCQl1bnNldCgkdmFsdWVTZXRbJGtleV0pOwoJCQl9CgkJfQoKCQlpZiAoJG9yZGVyID09IDApIHsKCQkJcnNvcnQoJHZhbHVlU2V0LFNPUlRfTlVNRVJJQyk7CgkJfSBlbHNlIHsKCQkJc29ydCgkdmFsdWVTZXQsU09SVF9OVU1FUklDKTsKCQl9CgkJJHBvcyA9IGFycmF5X3NlYXJjaCgkdmFsdWUsJHZhbHVlU2V0KTsKCQlpZiAoJHBvcyA9PT0gRmFsc2UpIHsKCQkJcmV0dXJuIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6TkEoKTsKCQl9CgoJCXJldHVybiArKyRwb3M7Cgl9CS8vCWZ1bmN0aW9uIFJBTksoKQoKCgkvKioKCSAqIFJTUQoJICoKCSAqIFJldHVybnMgdGhlIHNxdWFyZSBvZiB0aGUgUGVhcnNvbiBwcm9kdWN0IG1vbWVudCBjb3JyZWxhdGlvbiBjb2VmZmljaWVudCB0aHJvdWdoIGRhdGEgcG9pbnRzIGluIGtub3duX3kncyBhbmQga25vd25feCdzLgoJICoKCSAqIEBwYXJhbQlhcnJheSBvZiBtaXhlZAkJRGF0YSBTZXJpZXMgWQoJICogQHBhcmFtCWFycmF5IG9mIG1peGVkCQlEYXRhIFNlcmllcyBYCgkgKiBAcmV0dXJuCWZsb2F0CgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gUlNRKCR5VmFsdWVzLCR4VmFsdWVzKSB7CgkJaWYgKCFzZWxmOjpfY2hlY2tUcmVuZEFycmF5cygkeVZhbHVlcywkeFZhbHVlcykpIHsKCQkJcmV0dXJuIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6VkFMVUUoKTsKCQl9CgkJJHlWYWx1ZUNvdW50ID0gY291bnQoJHlWYWx1ZXMpOwoJCSR4VmFsdWVDb3VudCA9IGNvdW50KCR4VmFsdWVzKTsKCgkJaWYgKCgkeVZhbHVlQ291bnQgPT0gMCkgfHwgKCR5VmFsdWVDb3VudCAhPSAkeFZhbHVlQ291bnQpKSB7CgkJCXJldHVybiBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6Ok5BKCk7CgkJfSBlbHNlaWYgKCR5VmFsdWVDb3VudCA9PSAxKSB7CgkJCXJldHVybiBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OkRJVjAoKTsKCQl9CgoJCSRiZXN0Rml0TGluZWFyID0gdHJlbmRDbGFzczo6Y2FsY3VsYXRlKHRyZW5kQ2xhc3M6OlRSRU5EX0xJTkVBUiwkeVZhbHVlcywkeFZhbHVlcyk7CgkJcmV0dXJuICRiZXN0Rml0TGluZWFyLT5nZXRHb29kbmVzc09mRml0KCk7Cgl9CS8vCWZ1bmN0aW9uIFJTUSgpCgoKCS8qKgoJICogU0tFVwoJICoKCSAqIFJldHVybnMgdGhlIHNrZXduZXNzIG9mIGEgZGlzdHJpYnV0aW9uLiBTa2V3bmVzcyBjaGFyYWN0ZXJpemVzIHRoZSBkZWdyZWUgb2YgYXN5bW1ldHJ5CgkgKiBvZiBhIGRpc3RyaWJ1dGlvbiBhcm91bmQgaXRzIG1lYW4uIFBvc2l0aXZlIHNrZXduZXNzIGluZGljYXRlcyBhIGRpc3RyaWJ1dGlvbiB3aXRoIGFuCgkgKiBhc3ltbWV0cmljIHRhaWwgZXh0ZW5kaW5nIHRvd2FyZCBtb3JlIHBvc2l0aXZlIHZhbHVlcy4gTmVnYXRpdmUgc2tld25lc3MgaW5kaWNhdGVzIGEKCSAqIGRpc3RyaWJ1dGlvbiB3aXRoIGFuIGFzeW1tZXRyaWMgdGFpbCBleHRlbmRpbmcgdG93YXJkIG1vcmUgbmVnYXRpdmUgdmFsdWVzLgoJICoKCSAqIEBwYXJhbQlhcnJheQlEYXRhIFNlcmllcwoJICogQHJldHVybglmbG9hdAoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIFNLRVcoKSB7CgkJJGFBcmdzID0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuQXJyYXlJbmRleGVkKGZ1bmNfZ2V0X2FyZ3MoKSk7CgkJJG1lYW4gPSBzZWxmOjpBVkVSQUdFKCRhQXJncyk7CgkJJHN0ZERldiA9IHNlbGY6OlNUREVWKCRhQXJncyk7CgoJCSRjb3VudCA9ICRzdW1tZXIgPSAwOwoJCS8vIExvb3AgdGhyb3VnaCBhcmd1bWVudHMKCQlmb3JlYWNoICgkYUFyZ3MgYXMgJGsgPT4gJGFyZykgewoJCQlpZiAoKGlzX2Jvb2woJGFyZykpICYmCgkJCQkoIVBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6aXNNYXRyaXhWYWx1ZSgkaykpKSB7CgkJCX0gZWxzZSB7CgkJCQkvLyBJcyBpdCBhIG51bWVyaWMgdmFsdWU/CgkJCQlpZiAoKGlzX251bWVyaWMoJGFyZykpICYmICghaXNfc3RyaW5nKCRhcmcpKSkgewoJCQkJCSRzdW1tZXIgKz0gcG93KCgoJGFyZyAtICRtZWFuKSAvICRzdGREZXYpLDMpIDsKCQkJCQkrKyRjb3VudDsKCQkJCX0KCQkJfQoJCX0KCgkJLy8gUmV0dXJuCgkJaWYgKCRjb3VudCA+IDIpIHsKCQkJcmV0dXJuICRzdW1tZXIgKiAoJGNvdW50IC8gKCgkY291bnQtMSkgKiAoJGNvdW50LTIpKSk7CgkJfQoJCXJldHVybiBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OkRJVjAoKTsKCX0JLy8JZnVuY3Rpb24gU0tFVygpCgoKCS8qKgoJICogU0xPUEUKCSAqCgkgKiBSZXR1cm5zIHRoZSBzbG9wZSBvZiB0aGUgbGluZWFyIHJlZ3Jlc3Npb24gbGluZSB0aHJvdWdoIGRhdGEgcG9pbnRzIGluIGtub3duX3kncyBhbmQga25vd25feCdzLgoJICoKCSAqIEBwYXJhbQlhcnJheSBvZiBtaXhlZAkJRGF0YSBTZXJpZXMgWQoJICogQHBhcmFtCWFycmF5IG9mIG1peGVkCQlEYXRhIFNlcmllcyBYCgkgKiBAcmV0dXJuCWZsb2F0CgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gU0xPUEUoJHlWYWx1ZXMsJHhWYWx1ZXMpIHsKCQlpZiAoIXNlbGY6Ol9jaGVja1RyZW5kQXJyYXlzKCR5VmFsdWVzLCR4VmFsdWVzKSkgewoJCQlyZXR1cm4gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpWQUxVRSgpOwoJCX0KCQkkeVZhbHVlQ291bnQgPSBjb3VudCgkeVZhbHVlcyk7CgkJJHhWYWx1ZUNvdW50ID0gY291bnQoJHhWYWx1ZXMpOwoKCQlpZiAoKCR5VmFsdWVDb3VudCA9PSAwKSB8fCAoJHlWYWx1ZUNvdW50ICE9ICR4VmFsdWVDb3VudCkpIHsKCQkJcmV0dXJuIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6TkEoKTsKCQl9IGVsc2VpZiAoJHlWYWx1ZUNvdW50ID09IDEpIHsKCQkJcmV0dXJuIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6RElWMCgpOwoJCX0KCgkJJGJlc3RGaXRMaW5lYXIgPSB0cmVuZENsYXNzOjpjYWxjdWxhdGUodHJlbmRDbGFzczo6VFJFTkRfTElORUFSLCR5VmFsdWVzLCR4VmFsdWVzKTsKCQlyZXR1cm4gJGJlc3RGaXRMaW5lYXItPmdldFNsb3BlKCk7Cgl9CS8vCWZ1bmN0aW9uIFNMT1BFKCkKCgoJLyoqCgkgKiBTTUFMTAoJICoKCSAqIFJldHVybnMgdGhlIG50aCBzbWFsbGVzdCB2YWx1ZSBpbiBhIGRhdGEgc2V0LiBZb3UgY2FuIHVzZSB0aGlzIGZ1bmN0aW9uIHRvCgkgKgkJc2VsZWN0IGEgdmFsdWUgYmFzZWQgb24gaXRzIHJlbGF0aXZlIHN0YW5kaW5nLgoJICoKCSAqIEV4Y2VsIEZ1bmN0aW9uOgoJICoJCVNNQUxMKHZhbHVlMVssdmFsdWUyWywgLi4uXV0sZW50cnkpCgkgKgoJICogQGFjY2VzcwlwdWJsaWMKCSAqIEBjYXRlZ29yeSBTdGF0aXN0aWNhbCBGdW5jdGlvbnMKCSAqIEBwYXJhbQltaXhlZAkJJGFyZywuLi4JCURhdGEgdmFsdWVzCgkgKiBAcGFyYW0JaW50CQkJJGVudHJ5CQkJUG9zaXRpb24gKG9yZGVyZWQgZnJvbSB0aGUgc21hbGxlc3QpIGluIHRoZSBhcnJheSBvciByYW5nZSBvZiBkYXRhIHRvIHJldHVybgoJICogQHJldHVybglmbG9hdAoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIFNNQUxMKCkgewoJCSRhQXJncyA9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlbkFycmF5KGZ1bmNfZ2V0X2FyZ3MoKSk7CgoJCS8vIENhbGN1bGF0ZQoJCSRlbnRyeSA9IGFycmF5X3BvcCgkYUFyZ3MpOwoKCQlpZiAoKGlzX251bWVyaWMoJGVudHJ5KSkgJiYgKCFpc19zdHJpbmcoJGVudHJ5KSkpIHsKCQkJJG1BcmdzID0gYXJyYXkoKTsKCQkJZm9yZWFjaCAoJGFBcmdzIGFzICRhcmcpIHsKCQkJCS8vIElzIGl0IGEgbnVtZXJpYyB2YWx1ZT8KCQkJCWlmICgoaXNfbnVtZXJpYygkYXJnKSkgJiYgKCFpc19zdHJpbmcoJGFyZykpKSB7CgkJCQkJJG1BcmdzW10gPSAkYXJnOwoJCQkJfQoJCQl9CgkJCSRjb3VudCA9IHNlbGY6OkNPVU5UKCRtQXJncyk7CgkJCSRlbnRyeSA9IGZsb29yKC0tJGVudHJ5KTsKCQkJaWYgKCgkZW50cnkgPCAwKSB8fCAoJGVudHJ5ID49ICRjb3VudCkgfHwgKCRjb3VudCA9PSAwKSkgewoJCQkJcmV0dXJuIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6TmFOKCk7CgkJCX0KCQkJc29ydCgkbUFyZ3MpOwoJCQlyZXR1cm4gJG1BcmdzWyRlbnRyeV07CgkJfQoJCXJldHVybiBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OlZBTFVFKCk7Cgl9CS8vCWZ1bmN0aW9uIFNNQUxMKCkKCgoJLyoqCgkgKiBTVEFOREFSRElaRQoJICoKCSAqIFJldHVybnMgYSBub3JtYWxpemVkIHZhbHVlIGZyb20gYSBkaXN0cmlidXRpb24gY2hhcmFjdGVyaXplZCBieSBtZWFuIGFuZCBzdGFuZGFyZF9kZXYuCgkgKgoJICogQHBhcmFtCWZsb2F0CSR2YWx1ZQkJVmFsdWUgdG8gbm9ybWFsaXplCgkgKiBAcGFyYW0JZmxvYXQJJG1lYW4JCU1lYW4gVmFsdWUKCSAqIEBwYXJhbQlmbG9hdAkkc3RkRGV2CQlTdGFuZGFyZCBEZXZpYXRpb24KCSAqIEByZXR1cm4JZmxvYXQJU3RhbmRhcmRpemVkIHZhbHVlCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gU1RBTkRBUkRJWkUoJHZhbHVlLCRtZWFuLCRzdGREZXYpIHsKCQkkdmFsdWUJPSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5TaW5nbGVWYWx1ZSgkdmFsdWUpOwoJCSRtZWFuCT0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuU2luZ2xlVmFsdWUoJG1lYW4pOwoJCSRzdGREZXYJPSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5TaW5nbGVWYWx1ZSgkc3RkRGV2KTsKCgkJaWYgKChpc19udW1lcmljKCR2YWx1ZSkpICYmIChpc19udW1lcmljKCRtZWFuKSkgJiYgKGlzX251bWVyaWMoJHN0ZERldikpKSB7CgkJCWlmICgkc3RkRGV2IDw9IDApIHsKCQkJCXJldHVybiBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6Ok5hTigpOwoJCQl9CgkJCXJldHVybiAoJHZhbHVlIC0gJG1lYW4pIC8gJHN0ZERldiA7CgkJfQoJCXJldHVybiBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OlZBTFVFKCk7Cgl9CS8vCWZ1bmN0aW9uIFNUQU5EQVJESVpFKCkKCgoJLyoqCgkgKiBTVERFVgoJICoKCSAqIEVzdGltYXRlcyBzdGFuZGFyZCBkZXZpYXRpb24gYmFzZWQgb24gYSBzYW1wbGUuIFRoZSBzdGFuZGFyZCBkZXZpYXRpb24gaXMgYSBtZWFzdXJlIG9mIGhvdwoJICoJCXdpZGVseSB2YWx1ZXMgYXJlIGRpc3BlcnNlZCBmcm9tIHRoZSBhdmVyYWdlIHZhbHVlICh0aGUgbWVhbikuCgkgKgoJICogRXhjZWwgRnVuY3Rpb246CgkgKgkJU1RERVYodmFsdWUxWyx2YWx1ZTJbLCAuLi5dXSkKCSAqCgkgKiBAYWNjZXNzCXB1YmxpYwoJICogQGNhdGVnb3J5IFN0YXRpc3RpY2FsIEZ1bmN0aW9ucwoJICogQHBhcmFtCW1peGVkCQkkYXJnLC4uLgkJRGF0YSB2YWx1ZXMKCSAqIEByZXR1cm4JZmxvYXQKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBTVERFVigpIHsKCQkkYUFyZ3MgPSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5BcnJheUluZGV4ZWQoZnVuY19nZXRfYXJncygpKTsKCgkJLy8gUmV0dXJuIHZhbHVlCgkJJHJldHVyblZhbHVlID0gbnVsbDsKCgkJJGFNZWFuID0gc2VsZjo6QVZFUkFHRSgkYUFyZ3MpOwoJCWlmICghaXNfbnVsbCgkYU1lYW4pKSB7CgkJCSRhQ291bnQgPSAtMTsKCQkJZm9yZWFjaCAoJGFBcmdzIGFzICRrID0+ICRhcmcpIHsKCQkJCWlmICgoaXNfYm9vbCgkYXJnKSkgJiYKCQkJCQkoKCFQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmlzQ2VsbFZhbHVlKCRrKSkgfHwgKFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6Z2V0Q29tcGF0aWJpbGl0eU1vZGUoKSA9PSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OkNPTVBBVElCSUxJVFlfT1BFTk9GRklDRSkpKSB7CgkJCQkJJGFyZyA9IChpbnRlZ2VyKSAkYXJnOwoJCQkJfQoJCQkJLy8gSXMgaXQgYSBudW1lcmljIHZhbHVlPwoJCQkJaWYgKChpc19udW1lcmljKCRhcmcpKSAmJiAoIWlzX3N0cmluZygkYXJnKSkpIHsKCQkJCQlpZiAoaXNfbnVsbCgkcmV0dXJuVmFsdWUpKSB7CgkJCQkJCSRyZXR1cm5WYWx1ZSA9IHBvdygoJGFyZyAtICRhTWVhbiksMik7CgkJCQkJfSBlbHNlIHsKCQkJCQkJJHJldHVyblZhbHVlICs9IHBvdygoJGFyZyAtICRhTWVhbiksMik7CgkJCQkJfQoJCQkJCSsrJGFDb3VudDsKCQkJCX0KCQkJfQoKCQkJLy8gUmV0dXJuCgkJCWlmICgoJGFDb3VudCA+IDApICYmICgkcmV0dXJuVmFsdWUgPj0gMCkpIHsKCQkJCXJldHVybiBzcXJ0KCRyZXR1cm5WYWx1ZSAvICRhQ291bnQpOwoJCQl9CgkJfQoJCXJldHVybiBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OkRJVjAoKTsKCX0JLy8JZnVuY3Rpb24gU1RERVYoKQoKCgkvKioKCSAqIFNUREVWQQoJICoKCSAqIEVzdGltYXRlcyBzdGFuZGFyZCBkZXZpYXRpb24gYmFzZWQgb24gYSBzYW1wbGUsIGluY2x1ZGluZyBudW1iZXJzLCB0ZXh0LCBhbmQgbG9naWNhbCB2YWx1ZXMKCSAqCgkgKiBFeGNlbCBGdW5jdGlvbjoKCSAqCQlTVERFVkEodmFsdWUxWyx2YWx1ZTJbLCAuLi5dXSkKCSAqCgkgKiBAYWNjZXNzCXB1YmxpYwoJICogQGNhdGVnb3J5IFN0YXRpc3RpY2FsIEZ1bmN0aW9ucwoJICogQHBhcmFtCW1peGVkCQkkYXJnLC4uLgkJRGF0YSB2YWx1ZXMKCSAqIEByZXR1cm4JZmxvYXQKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBTVERFVkEoKSB7CgkJJGFBcmdzID0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuQXJyYXlJbmRleGVkKGZ1bmNfZ2V0X2FyZ3MoKSk7CgoJCS8vIFJldHVybiB2YWx1ZQoJCSRyZXR1cm5WYWx1ZSA9IG51bGw7CgoJCSRhTWVhbiA9IHNlbGY6OkFWRVJBR0VBKCRhQXJncyk7CgkJaWYgKCFpc19udWxsKCRhTWVhbikpIHsKCQkJJGFDb3VudCA9IC0xOwoJCQlmb3JlYWNoICgkYUFyZ3MgYXMgJGsgPT4gJGFyZykgewoJCQkJaWYgKChpc19ib29sKCRhcmcpKSAmJgoJCQkJCSghUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjppc01hdHJpeFZhbHVlKCRrKSkpIHsKCQkJCX0gZWxzZSB7CgkJCQkJLy8gSXMgaXQgYSBudW1lcmljIHZhbHVlPwoJCQkJCWlmICgoaXNfbnVtZXJpYygkYXJnKSkgfHwgKGlzX2Jvb2woJGFyZykpIHx8ICgoaXNfc3RyaW5nKCRhcmcpICYgKCRhcmcgIT0gJycpKSkpIHsKCQkJCQkJaWYgKGlzX2Jvb2woJGFyZykpIHsKCQkJCQkJCSRhcmcgPSAoaW50ZWdlcikgJGFyZzsKCQkJCQkJfSBlbHNlaWYgKGlzX3N0cmluZygkYXJnKSkgewoJCQkJCQkJJGFyZyA9IDA7CgkJCQkJCX0KCQkJCQkJaWYgKGlzX251bGwoJHJldHVyblZhbHVlKSkgewoJCQkJCQkJJHJldHVyblZhbHVlID0gcG93KCgkYXJnIC0gJGFNZWFuKSwyKTsKCQkJCQkJfSBlbHNlIHsKCQkJCQkJCSRyZXR1cm5WYWx1ZSArPSBwb3coKCRhcmcgLSAkYU1lYW4pLDIpOwoJCQkJCQl9CgkJCQkJCSsrJGFDb3VudDsKCQkJCQl9CgkJCQl9CgkJCX0KCgkJCS8vIFJldHVybgoJCQlpZiAoKCRhQ291bnQgPiAwKSAmJiAoJHJldHVyblZhbHVlID49IDApKSB7CgkJCQlyZXR1cm4gc3FydCgkcmV0dXJuVmFsdWUgLyAkYUNvdW50KTsKCQkJfQoJCX0KCQlyZXR1cm4gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpESVYwKCk7Cgl9CS8vCWZ1bmN0aW9uIFNUREVWQSgpCgoKCS8qKgoJICogU1RERVZQCgkgKgoJICogQ2FsY3VsYXRlcyBzdGFuZGFyZCBkZXZpYXRpb24gYmFzZWQgb24gdGhlIGVudGlyZSBwb3B1bGF0aW9uCgkgKgoJICogRXhjZWwgRnVuY3Rpb246CgkgKgkJU1RERVZQKHZhbHVlMVssdmFsdWUyWywgLi4uXV0pCgkgKgoJICogQGFjY2VzcwlwdWJsaWMKCSAqIEBjYXRlZ29yeSBTdGF0aXN0aWNhbCBGdW5jdGlvbnMKCSAqIEBwYXJhbQltaXhlZAkJJGFyZywuLi4JCURhdGEgdmFsdWVzCgkgKiBAcmV0dXJuCWZsb2F0CgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gU1RERVZQKCkgewoJCSRhQXJncyA9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlbkFycmF5SW5kZXhlZChmdW5jX2dldF9hcmdzKCkpOwoKCQkvLyBSZXR1cm4gdmFsdWUKCQkkcmV0dXJuVmFsdWUgPSBudWxsOwoKCQkkYU1lYW4gPSBzZWxmOjpBVkVSQUdFKCRhQXJncyk7CgkJaWYgKCFpc19udWxsKCRhTWVhbikpIHsKCQkJJGFDb3VudCA9IDA7CgkJCWZvcmVhY2ggKCRhQXJncyBhcyAkayA9PiAkYXJnKSB7CgkJCQlpZiAoKGlzX2Jvb2woJGFyZykpICYmCgkJCQkJKCghUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjppc0NlbGxWYWx1ZSgkaykpIHx8IChQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmdldENvbXBhdGliaWxpdHlNb2RlKCkgPT0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpDT01QQVRJQklMSVRZX09QRU5PRkZJQ0UpKSkgewoJCQkJCSRhcmcgPSAoaW50ZWdlcikgJGFyZzsKCQkJCX0KCQkJCS8vIElzIGl0IGEgbnVtZXJpYyB2YWx1ZT8KCQkJCWlmICgoaXNfbnVtZXJpYygkYXJnKSkgJiYgKCFpc19zdHJpbmcoJGFyZykpKSB7CgkJCQkJaWYgKGlzX251bGwoJHJldHVyblZhbHVlKSkgewoJCQkJCQkkcmV0dXJuVmFsdWUgPSBwb3coKCRhcmcgLSAkYU1lYW4pLDIpOwoJCQkJCX0gZWxzZSB7CgkJCQkJCSRyZXR1cm5WYWx1ZSArPSBwb3coKCRhcmcgLSAkYU1lYW4pLDIpOwoJCQkJCX0KCQkJCQkrKyRhQ291bnQ7CgkJCQl9CgkJCX0KCgkJCS8vIFJldHVybgoJCQlpZiAoKCRhQ291bnQgPiAwKSAmJiAoJHJldHVyblZhbHVlID49IDApKSB7CgkJCQlyZXR1cm4gc3FydCgkcmV0dXJuVmFsdWUgLyAkYUNvdW50KTsKCQkJfQoJCX0KCQlyZXR1cm4gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpESVYwKCk7Cgl9CS8vCWZ1bmN0aW9uIFNUREVWUCgpCgoKCS8qKgoJICogU1RERVZQQQoJICoKCSAqIENhbGN1bGF0ZXMgc3RhbmRhcmQgZGV2aWF0aW9uIGJhc2VkIG9uIHRoZSBlbnRpcmUgcG9wdWxhdGlvbiwgaW5jbHVkaW5nIG51bWJlcnMsIHRleHQsIGFuZCBsb2dpY2FsIHZhbHVlcwoJICoKCSAqIEV4Y2VsIEZ1bmN0aW9uOgoJICoJCVNUREVWUEEodmFsdWUxWyx2YWx1ZTJbLCAuLi5dXSkKCSAqCgkgKiBAYWNjZXNzCXB1YmxpYwoJICogQGNhdGVnb3J5IFN0YXRpc3RpY2FsIEZ1bmN0aW9ucwoJICogQHBhcmFtCW1peGVkCQkkYXJnLC4uLgkJRGF0YSB2YWx1ZXMKCSAqIEByZXR1cm4JZmxvYXQKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBTVERFVlBBKCkgewoJCSRhQXJncyA9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlbkFycmF5SW5kZXhlZChmdW5jX2dldF9hcmdzKCkpOwoKCQkvLyBSZXR1cm4gdmFsdWUKCQkkcmV0dXJuVmFsdWUgPSBudWxsOwoKCQkkYU1lYW4gPSBzZWxmOjpBVkVSQUdFQSgkYUFyZ3MpOwoJCWlmICghaXNfbnVsbCgkYU1lYW4pKSB7CgkJCSRhQ291bnQgPSAwOwoJCQlmb3JlYWNoICgkYUFyZ3MgYXMgJGsgPT4gJGFyZykgewoJCQkJaWYgKChpc19ib29sKCRhcmcpKSAmJgoJCQkJCSghUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjppc01hdHJpeFZhbHVlKCRrKSkpIHsKCQkJCX0gZWxzZSB7CgkJCQkJLy8gSXMgaXQgYSBudW1lcmljIHZhbHVlPwoJCQkJCWlmICgoaXNfbnVtZXJpYygkYXJnKSkgfHwgKGlzX2Jvb2woJGFyZykpIHx8ICgoaXNfc3RyaW5nKCRhcmcpICYgKCRhcmcgIT0gJycpKSkpIHsKCQkJCQkJaWYgKGlzX2Jvb2woJGFyZykpIHsKCQkJCQkJCSRhcmcgPSAoaW50ZWdlcikgJGFyZzsKCQkJCQkJfSBlbHNlaWYgKGlzX3N0cmluZygkYXJnKSkgewoJCQkJCQkJJGFyZyA9IDA7CgkJCQkJCX0KCQkJCQkJaWYgKGlzX251bGwoJHJldHVyblZhbHVlKSkgewoJCQkJCQkJJHJldHVyblZhbHVlID0gcG93KCgkYXJnIC0gJGFNZWFuKSwyKTsKCQkJCQkJfSBlbHNlIHsKCQkJCQkJCSRyZXR1cm5WYWx1ZSArPSBwb3coKCRhcmcgLSAkYU1lYW4pLDIpOwoJCQkJCQl9CgkJCQkJCSsrJGFDb3VudDsKCQkJCQl9CgkJCQl9CgkJCX0KCgkJCS8vIFJldHVybgoJCQlpZiAoKCRhQ291bnQgPiAwKSAmJiAoJHJldHVyblZhbHVlID49IDApKSB7CgkJCQlyZXR1cm4gc3FydCgkcmV0dXJuVmFsdWUgLyAkYUNvdW50KTsKCQkJfQoJCX0KCQlyZXR1cm4gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpESVYwKCk7Cgl9CS8vCWZ1bmN0aW9uIFNUREVWUEEoKQoKCgkvKioKCSAqIFNURVlYCgkgKgoJICogUmV0dXJucyB0aGUgc3RhbmRhcmQgZXJyb3Igb2YgdGhlIHByZWRpY3RlZCB5LXZhbHVlIGZvciBlYWNoIHggaW4gdGhlIHJlZ3Jlc3Npb24uCgkgKgoJICogQHBhcmFtCWFycmF5IG9mIG1peGVkCQlEYXRhIFNlcmllcyBZCgkgKiBAcGFyYW0JYXJyYXkgb2YgbWl4ZWQJCURhdGEgU2VyaWVzIFgKCSAqIEByZXR1cm4JZmxvYXQKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBTVEVZWCgkeVZhbHVlcywkeFZhbHVlcykgewoJCWlmICghc2VsZjo6X2NoZWNrVHJlbmRBcnJheXMoJHlWYWx1ZXMsJHhWYWx1ZXMpKSB7CgkJCXJldHVybiBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OlZBTFVFKCk7CgkJfQoJCSR5VmFsdWVDb3VudCA9IGNvdW50KCR5VmFsdWVzKTsKCQkkeFZhbHVlQ291bnQgPSBjb3VudCgkeFZhbHVlcyk7CgoJCWlmICgoJHlWYWx1ZUNvdW50ID09IDApIHx8ICgkeVZhbHVlQ291bnQgIT0gJHhWYWx1ZUNvdW50KSkgewoJCQlyZXR1cm4gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpOQSgpOwoJCX0gZWxzZWlmICgkeVZhbHVlQ291bnQgPT0gMSkgewoJCQlyZXR1cm4gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpESVYwKCk7CgkJfQoKCQkkYmVzdEZpdExpbmVhciA9IHRyZW5kQ2xhc3M6OmNhbGN1bGF0ZSh0cmVuZENsYXNzOjpUUkVORF9MSU5FQVIsJHlWYWx1ZXMsJHhWYWx1ZXMpOwoJCXJldHVybiAkYmVzdEZpdExpbmVhci0+Z2V0U3RkZXZPZlJlc2lkdWFscygpOwoJfQkvLwlmdW5jdGlvbiBTVEVZWCgpCgoKCS8qKgoJICogVERJU1QKCSAqCgkgKiBSZXR1cm5zIHRoZSBwcm9iYWJpbGl0eSBvZiBTdHVkZW50J3MgVCBkaXN0cmlidXRpb24uCgkgKgoJICogQHBhcmFtCWZsb2F0CQkkdmFsdWUJCQlWYWx1ZSBmb3IgdGhlIGZ1bmN0aW9uCgkgKiBAcGFyYW0JZmxvYXQJCSRkZWdyZWVzCQlkZWdyZWVzIG9mIGZyZWVkb20KCSAqIEBwYXJhbQlmbG9hdAkJJHRhaWxzCQkJbnVtYmVyIG9mIHRhaWxzICgxIG9yIDIpCgkgKiBAcmV0dXJuCWZsb2F0CgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gVERJU1QoJHZhbHVlLCAkZGVncmVlcywgJHRhaWxzKSB7CgkJJHZhbHVlCQk9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlblNpbmdsZVZhbHVlKCR2YWx1ZSk7CgkJJGRlZ3JlZXMJPSBmbG9vcihQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5TaW5nbGVWYWx1ZSgkZGVncmVlcykpOwoJCSR0YWlscwkJPSBmbG9vcihQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5TaW5nbGVWYWx1ZSgkdGFpbHMpKTsKCgkJaWYgKChpc19udW1lcmljKCR2YWx1ZSkpICYmIChpc19udW1lcmljKCRkZWdyZWVzKSkgJiYgKGlzX251bWVyaWMoJHRhaWxzKSkpIHsKCQkJaWYgKCgkdmFsdWUgPCAwKSB8fCAoJGRlZ3JlZXMgPCAxKSB8fCAoJHRhaWxzIDwgMSkgfHwgKCR0YWlscyA+IDIpKSB7CgkJCQlyZXR1cm4gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpOYU4oKTsKCQkJfQoJCQkvLwl0ZGlzdCwgd2hpY2ggZmluZHMgdGhlIHByb2JhYmlsaXR5IHRoYXQgY29ycmVzcG9uZHMgdG8gYSBnaXZlbiB2YWx1ZQoJCQkvLwlvZiB0IHdpdGggayBkZWdyZWVzIG9mIGZyZWVkb20uIFRoaXMgYWxnb3JpdGhtIGlzIHRyYW5zbGF0ZWQgZnJvbSBhCgkJCS8vCXBhc2NhbCBmdW5jdGlvbiBvbiBwODEgb2YgIlN0YXRpc3RpY2FsIENvbXB1dGluZyBpbiBQYXNjYWwiIGJ5IEQKCQkJLy8JQ29va2UsIEEgSCBDcmF2ZW4gJiBHIE0gQ2xhcmsgKDE5ODU6IEVkd2FyZCBBcm5vbGQgKFB1YnMuKSBMdGQ6CgkJCS8vCUxvbmRvbikuIFRoZSBhYm92ZSBQYXNjYWwgYWxnb3JpdGhtIGlzIGl0c2VsZiBhIHRyYW5zbGF0aW9uIG9mIHRoZQoJCQkvLwlmb3J0cmFuIGFsZ29yaXRtICJBUyAzIiBieSBCIEUgQ29vcGVyIG9mIHRoZSBBdGxhcyBDb21wdXRlcgoJCQkvLwlMYWJvcmF0b3J5IGFzIHJlcG9ydGVkIGluIChhbW9uZyBvdGhlciBwbGFjZXMpICJBcHBsaWVkIFN0YXRpc3RpY3MKCQkJLy8JQWxnb3JpdGhtcyIsIGVkaXRpZWQgYnkgUCBHcmlmZml0aHMgYW5kIEkgRCBIaWxsICgxOTg1OyBFbGxpcwoJCQkvLwlIb3J3b29kIEx0ZC47IFcuIFN1c3NleCwgRW5nbGFuZCkuCgkJCSR0dGVybSA9ICRkZWdyZWVzOwoJCQkkdHRoZXRhID0gYXRhbjIoJHZhbHVlLHNxcnQoJHR0ZXJtKSk7CgkJCSR0YyA9IGNvcygkdHRoZXRhKTsKCQkJJHRzID0gc2luKCR0dGhldGEpOwoJCQkkdHN1bSA9IDA7CgoJCQlpZiAoKCRkZWdyZWVzICUgMikgPT0gMSkgewoJCQkJJHRpID0gMzsKCQkJCSR0dGVybSA9ICR0YzsKCQkJfSBlbHNlIHsKCQkJCSR0aSA9IDI7CgkJCQkkdHRlcm0gPSAxOwoJCQl9CgoJCQkkdHN1bSA9ICR0dGVybTsKCQkJd2hpbGUgKCR0aSA8ICRkZWdyZWVzKSB7CgkJCQkkdHRlcm0gKj0gJHRjICogJHRjICogKCR0aSAtIDEpIC8gJHRpOwoJCQkJJHRzdW0gKz0gJHR0ZXJtOwoJCQkJJHRpICs9IDI7CgkJCX0KCQkJJHRzdW0gKj0gJHRzOwoJCQlpZiAoKCRkZWdyZWVzICUgMikgPT0gMSkgeyAkdHN1bSA9IE1fMkRJVlBJICogKCR0c3VtICsgJHR0aGV0YSk7IH0KCQkJJHRWYWx1ZSA9IDAuNSAqICgxICsgJHRzdW0pOwoJCQlpZiAoJHRhaWxzID09IDEpIHsKCQkJCXJldHVybiAxIC0gYWJzKCR0VmFsdWUpOwoJCQl9IGVsc2UgewoJCQkJcmV0dXJuIDEgLSBhYnMoKDEgLSAkdFZhbHVlKSAtICR0VmFsdWUpOwoJCQl9CgkJfQoJCXJldHVybiBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OlZBTFVFKCk7Cgl9CS8vCWZ1bmN0aW9uIFRESVNUKCkKCgoJLyoqCgkgKiBUSU5WCgkgKgoJICogUmV0dXJucyB0aGUgb25lLXRhaWxlZCBwcm9iYWJpbGl0eSBvZiB0aGUgY2hpLXNxdWFyZWQgZGlzdHJpYnV0aW9uLgoJICoKCSAqIEBwYXJhbQlmbG9hdAkJJHByb2JhYmlsaXR5CVByb2JhYmlsaXR5IGZvciB0aGUgZnVuY3Rpb24KCSAqIEBwYXJhbQlmbG9hdAkJJGRlZ3JlZXMJCWRlZ3JlZXMgb2YgZnJlZWRvbQoJICogQHJldHVybglmbG9hdAoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIFRJTlYoJHByb2JhYmlsaXR5LCAkZGVncmVlcykgewoJCSRwcm9iYWJpbGl0eQk9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlblNpbmdsZVZhbHVlKCRwcm9iYWJpbGl0eSk7CgkJJGRlZ3JlZXMJCT0gZmxvb3IoUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuU2luZ2xlVmFsdWUoJGRlZ3JlZXMpKTsKCgkJaWYgKChpc19udW1lcmljKCRwcm9iYWJpbGl0eSkpICYmIChpc19udW1lcmljKCRkZWdyZWVzKSkpIHsKCQkJJHhMbyA9IDEwMDsKCQkJJHhIaSA9IDA7CgoJCQkkeCA9ICR4TmV3ID0gMTsKCQkJJGR4CT0gMTsKCQkJJGkgPSAwOwoKCQkJd2hpbGUgKChhYnMoJGR4KSA+IFBSRUNJU0lPTikgJiYgKCRpKysgPCBNQVhfSVRFUkFUSU9OUykpIHsKCQkJCS8vIEFwcGx5IE5ld3Rvbi1SYXBoc29uIHN0ZXAKCQkJCSRyZXN1bHQgPSBzZWxmOjpURElTVCgkeCwgJGRlZ3JlZXMsIDIpOwoJCQkJJGVycm9yID0gJHJlc3VsdCAtICRwcm9iYWJpbGl0eTsKCQkJCWlmICgkZXJyb3IgPT0gMC4wKSB7CgkJCQkJJGR4ID0gMDsKCQkJCX0gZWxzZWlmICgkZXJyb3IgPCAwLjApIHsKCQkJCQkkeExvID0gJHg7CgkJCQl9IGVsc2UgewoJCQkJCSR4SGkgPSAkeDsKCQkJCX0KCQkJCS8vIEF2b2lkIGRpdmlzaW9uIGJ5IHplcm8KCQkJCWlmICgkcmVzdWx0ICE9IDAuMCkgewoJCQkJCSRkeCA9ICRlcnJvciAvICRyZXN1bHQ7CgkJCQkJJHhOZXcgPSAkeCAtICRkeDsKCQkJCX0KCQkJCS8vIElmIHRoZSBOUiBmYWlscyB0byBjb252ZXJnZSAod2hpY2ggZm9yIGV4YW1wbGUgbWF5IGJlIHRoZQoJCQkJLy8gY2FzZSBpZiB0aGUgaW5pdGlhbCBndWVzcyBpcyB0b28gcm91Z2gpIHdlIGFwcGx5IGEgYmlzZWN0aW9uCgkJCQkvLyBzdGVwIHRvIGRldGVybWluZSBhIG1vcmUgbmFycm93IGludGVydmFsIGFyb3VuZCB0aGUgcm9vdC4KCQkJCWlmICgoJHhOZXcgPCAkeExvKSB8fCAoJHhOZXcgPiAkeEhpKSB8fCAoJHJlc3VsdCA9PSAwLjApKSB7CgkJCQkJJHhOZXcgPSAoJHhMbyArICR4SGkpIC8gMjsKCQkJCQkkZHggPSAkeE5ldyAtICR4OwoJCQkJfQoJCQkJJHggPSAkeE5ldzsKCQkJfQoJCQlpZiAoJGkgPT0gTUFYX0lURVJBVElPTlMpIHsKCQkJCXJldHVybiBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6Ok5BKCk7CgkJCX0KCQkJcmV0dXJuIHJvdW5kKCR4LDEyKTsKCQl9CgkJcmV0dXJuIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6VkFMVUUoKTsKCX0JLy8JZnVuY3Rpb24gVElOVigpCgoKCS8qKgoJICogVFJFTkQKCSAqCgkgKiBSZXR1cm5zIHZhbHVlcyBhbG9uZyBhIGxpbmVhciB0cmVuZAoJICoKCSAqIEBwYXJhbQlhcnJheSBvZiBtaXhlZAkJRGF0YSBTZXJpZXMgWQoJICogQHBhcmFtCWFycmF5IG9mIG1peGVkCQlEYXRhIFNlcmllcyBYCgkgKiBAcGFyYW0JYXJyYXkgb2YgbWl4ZWQJCVZhbHVlcyBvZiBYIGZvciB3aGljaCB3ZSB3YW50IHRvIGZpbmQgWQoJICogQHBhcmFtCWJvb2xlYW4JCQkJQSBsb2dpY2FsIHZhbHVlIHNwZWNpZnlpbmcgd2hldGhlciB0byBmb3JjZSB0aGUgaW50ZXJzZWN0IHRvIGVxdWFsIDAuCgkgKiBAcmV0dXJuCWFycmF5IG9mIGZsb2F0CgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gVFJFTkQoJHlWYWx1ZXMsJHhWYWx1ZXM9YXJyYXkoKSwkbmV3VmFsdWVzPWFycmF5KCksJGNvbnN0PVRydWUpIHsKCQkkeVZhbHVlcyA9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlbkFycmF5KCR5VmFsdWVzKTsKCQkkeFZhbHVlcyA9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlbkFycmF5KCR4VmFsdWVzKTsKCQkkbmV3VmFsdWVzID0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuQXJyYXkoJG5ld1ZhbHVlcyk7CgkJJGNvbnN0CT0gKGlzX251bGwoJGNvbnN0KSkJPyBUcnVlIDoJKGJvb2xlYW4pIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlblNpbmdsZVZhbHVlKCRjb25zdCk7CgoJCSRiZXN0Rml0TGluZWFyID0gdHJlbmRDbGFzczo6Y2FsY3VsYXRlKHRyZW5kQ2xhc3M6OlRSRU5EX0xJTkVBUiwkeVZhbHVlcywkeFZhbHVlcywkY29uc3QpOwoJCWlmIChlbXB0eSgkbmV3VmFsdWVzKSkgewoJCQkkbmV3VmFsdWVzID0gJGJlc3RGaXRMaW5lYXItPmdldFhWYWx1ZXMoKTsKCQl9CgoJCSRyZXR1cm5BcnJheSA9IGFycmF5KCk7CgkJZm9yZWFjaCgkbmV3VmFsdWVzIGFzICR4VmFsdWUpIHsKCQkJJHJldHVybkFycmF5WzBdW10gPSAkYmVzdEZpdExpbmVhci0+Z2V0VmFsdWVPZllGb3JYKCR4VmFsdWUpOwoJCX0KCgkJcmV0dXJuICRyZXR1cm5BcnJheTsKCX0JLy8JZnVuY3Rpb24gVFJFTkQoKQoKCgkvKioKCSAqIFRSSU1NRUFOCgkgKgoJICogUmV0dXJucyB0aGUgbWVhbiBvZiB0aGUgaW50ZXJpb3Igb2YgYSBkYXRhIHNldC4gVFJJTU1FQU4gY2FsY3VsYXRlcyB0aGUgbWVhbgoJICoJCXRha2VuIGJ5IGV4Y2x1ZGluZyBhIHBlcmNlbnRhZ2Ugb2YgZGF0YSBwb2ludHMgZnJvbSB0aGUgdG9wIGFuZCBib3R0b20gdGFpbHMKCSAqCQlvZiBhIGRhdGEgc2V0LgoJICoKCSAqIEV4Y2VsIEZ1bmN0aW9uOgoJICoJCVRSSU1FQU4odmFsdWUxWyx2YWx1ZTJbLCAuLi5dXSwkZGlzY2FyZCkKCSAqCgkgKiBAYWNjZXNzCXB1YmxpYwoJICogQGNhdGVnb3J5IFN0YXRpc3RpY2FsIEZ1bmN0aW9ucwoJICogQHBhcmFtCW1peGVkCQkkYXJnLC4uLgkJRGF0YSB2YWx1ZXMKCSAqIEBwYXJhbQlmbG9hdAkJJGRpc2NhcmQJCVBlcmNlbnRhZ2UgdG8gZGlzY2FyZAoJICogQHJldHVybglmbG9hdAoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIFRSSU1NRUFOKCkgewoJCSRhQXJncyA9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlbkFycmF5KGZ1bmNfZ2V0X2FyZ3MoKSk7CgoJCS8vIENhbGN1bGF0ZQoJCSRwZXJjZW50ID0gYXJyYXlfcG9wKCRhQXJncyk7CgoJCWlmICgoaXNfbnVtZXJpYygkcGVyY2VudCkpICYmICghaXNfc3RyaW5nKCRwZXJjZW50KSkpIHsKCQkJaWYgKCgkcGVyY2VudCA8IDApIHx8ICgkcGVyY2VudCA+IDEpKSB7CgkJCQlyZXR1cm4gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpOYU4oKTsKCQkJfQoJCQkkbUFyZ3MgPSBhcnJheSgpOwoJCQlmb3JlYWNoICgkYUFyZ3MgYXMgJGFyZykgewoJCQkJLy8gSXMgaXQgYSBudW1lcmljIHZhbHVlPwoJCQkJaWYgKChpc19udW1lcmljKCRhcmcpKSAmJiAoIWlzX3N0cmluZygkYXJnKSkpIHsKCQkJCQkkbUFyZ3NbXSA9ICRhcmc7CgkJCQl9CgkJCX0KCQkJJGRpc2NhcmQgPSBmbG9vcihzZWxmOjpDT1VOVCgkbUFyZ3MpICogJHBlcmNlbnQgLyAyKTsKCQkJc29ydCgkbUFyZ3MpOwoJCQlmb3IgKCRpPTA7ICRpIDwgJGRpc2NhcmQ7ICsrJGkpIHsKCQkJCWFycmF5X3BvcCgkbUFyZ3MpOwoJCQkJYXJyYXlfc2hpZnQoJG1BcmdzKTsKCQkJfQoJCQlyZXR1cm4gc2VsZjo6QVZFUkFHRSgkbUFyZ3MpOwoJCX0KCQlyZXR1cm4gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpWQUxVRSgpOwoJfQkvLwlmdW5jdGlvbiBUUklNTUVBTigpCgoKCS8qKgoJICogVkFSRnVuYwoJICoKCSAqIEVzdGltYXRlcyB2YXJpYW5jZSBiYXNlZCBvbiBhIHNhbXBsZS4KCSAqCgkgKiBFeGNlbCBGdW5jdGlvbjoKCSAqCQlWQVIodmFsdWUxWyx2YWx1ZTJbLCAuLi5dXSkKCSAqCgkgKiBAYWNjZXNzCXB1YmxpYwoJICogQGNhdGVnb3J5IFN0YXRpc3RpY2FsIEZ1bmN0aW9ucwoJICogQHBhcmFtCW1peGVkCQkkYXJnLC4uLgkJRGF0YSB2YWx1ZXMKCSAqIEByZXR1cm4JZmxvYXQKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBWQVJGdW5jKCkgewoJCS8vIFJldHVybiB2YWx1ZQoJCSRyZXR1cm5WYWx1ZSA9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6RElWMCgpOwoKCQkkc3VtbWVyQSA9ICRzdW1tZXJCID0gMDsKCgkJLy8gTG9vcCB0aHJvdWdoIGFyZ3VtZW50cwoJCSRhQXJncyA9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlbkFycmF5KGZ1bmNfZ2V0X2FyZ3MoKSk7CgkJJGFDb3VudCA9IDA7CgkJZm9yZWFjaCAoJGFBcmdzIGFzICRhcmcpIHsKCQkJaWYgKGlzX2Jvb2woJGFyZykpIHsgJGFyZyA9IChpbnRlZ2VyKSAkYXJnOyB9CgkJCS8vIElzIGl0IGEgbnVtZXJpYyB2YWx1ZT8KCQkJaWYgKChpc19udW1lcmljKCRhcmcpKSAmJiAoIWlzX3N0cmluZygkYXJnKSkpIHsKCQkJCSRzdW1tZXJBICs9ICgkYXJnICogJGFyZyk7CgkJCQkkc3VtbWVyQiArPSAkYXJnOwoJCQkJKyskYUNvdW50OwoJCQl9CgkJfQoKCQkvLyBSZXR1cm4KCQlpZiAoJGFDb3VudCA+IDEpIHsKCQkJJHN1bW1lckEgKj0gJGFDb3VudDsKCQkJJHN1bW1lckIgKj0gJHN1bW1lckI7CgkJCSRyZXR1cm5WYWx1ZSA9ICgkc3VtbWVyQSAtICRzdW1tZXJCKSAvICgkYUNvdW50ICogKCRhQ291bnQgLSAxKSk7CgkJfQoJCXJldHVybiAkcmV0dXJuVmFsdWU7Cgl9CS8vCWZ1bmN0aW9uIFZBUkZ1bmMoKQoKCgkvKioKCSAqIFZBUkEKCSAqCgkgKiBFc3RpbWF0ZXMgdmFyaWFuY2UgYmFzZWQgb24gYSBzYW1wbGUsIGluY2x1ZGluZyBudW1iZXJzLCB0ZXh0LCBhbmQgbG9naWNhbCB2YWx1ZXMKCSAqCgkgKiBFeGNlbCBGdW5jdGlvbjoKCSAqCQlWQVJBKHZhbHVlMVssdmFsdWUyWywgLi4uXV0pCgkgKgoJICogQGFjY2VzcwlwdWJsaWMKCSAqIEBjYXRlZ29yeSBTdGF0aXN0aWNhbCBGdW5jdGlvbnMKCSAqIEBwYXJhbQltaXhlZAkJJGFyZywuLi4JCURhdGEgdmFsdWVzCgkgKiBAcmV0dXJuCWZsb2F0CgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gVkFSQSgpIHsKCQkvLyBSZXR1cm4gdmFsdWUKCQkkcmV0dXJuVmFsdWUgPSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OkRJVjAoKTsKCgkJJHN1bW1lckEgPSAkc3VtbWVyQiA9IDA7CgoJCS8vIExvb3AgdGhyb3VnaCBhcmd1bWVudHMKCQkkYUFyZ3MgPSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5BcnJheUluZGV4ZWQoZnVuY19nZXRfYXJncygpKTsKCQkkYUNvdW50ID0gMDsKCQlmb3JlYWNoICgkYUFyZ3MgYXMgJGsgPT4gJGFyZykgewoJCQlpZiAoKGlzX3N0cmluZygkYXJnKSkgJiYKCQkJCShQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmlzVmFsdWUoJGspKSkgewoJCQkJcmV0dXJuIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6VkFMVUUoKTsKCQkJfSBlbHNlaWYgKChpc19zdHJpbmcoJGFyZykpICYmCgkJCQkoIVBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6aXNNYXRyaXhWYWx1ZSgkaykpKSB7CgkJCX0gZWxzZSB7CgkJCQkvLyBJcyBpdCBhIG51bWVyaWMgdmFsdWU/CgkJCQlpZiAoKGlzX251bWVyaWMoJGFyZykpIHx8IChpc19ib29sKCRhcmcpKSB8fCAoKGlzX3N0cmluZygkYXJnKSAmICgkYXJnICE9ICcnKSkpKSB7CgkJCQkJaWYgKGlzX2Jvb2woJGFyZykpIHsKCQkJCQkJJGFyZyA9IChpbnRlZ2VyKSAkYXJnOwoJCQkJCX0gZWxzZWlmIChpc19zdHJpbmcoJGFyZykpIHsKCQkJCQkJJGFyZyA9IDA7CgkJCQkJfQoJCQkJCSRzdW1tZXJBICs9ICgkYXJnICogJGFyZyk7CgkJCQkJJHN1bW1lckIgKz0gJGFyZzsKCQkJCQkrKyRhQ291bnQ7CgkJCQl9CgkJCX0KCQl9CgoJCS8vIFJldHVybgoJCWlmICgkYUNvdW50ID4gMSkgewoJCQkkc3VtbWVyQSAqPSAkYUNvdW50OwoJCQkkc3VtbWVyQiAqPSAkc3VtbWVyQjsKCQkJJHJldHVyblZhbHVlID0gKCRzdW1tZXJBIC0gJHN1bW1lckIpIC8gKCRhQ291bnQgKiAoJGFDb3VudCAtIDEpKTsKCQl9CgkJcmV0dXJuICRyZXR1cm5WYWx1ZTsKCX0JLy8JZnVuY3Rpb24gVkFSQSgpCgoKCS8qKgoJICogVkFSUAoJICoKCSAqIENhbGN1bGF0ZXMgdmFyaWFuY2UgYmFzZWQgb24gdGhlIGVudGlyZSBwb3B1bGF0aW9uCgkgKgoJICogRXhjZWwgRnVuY3Rpb246CgkgKgkJVkFSUCh2YWx1ZTFbLHZhbHVlMlssIC4uLl1dKQoJICoKCSAqIEBhY2Nlc3MJcHVibGljCgkgKiBAY2F0ZWdvcnkgU3RhdGlzdGljYWwgRnVuY3Rpb25zCgkgKiBAcGFyYW0JbWl4ZWQJCSRhcmcsLi4uCQlEYXRhIHZhbHVlcwoJICogQHJldHVybglmbG9hdAoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIFZBUlAoKSB7CgkJLy8gUmV0dXJuIHZhbHVlCgkJJHJldHVyblZhbHVlID0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpESVYwKCk7CgoJCSRzdW1tZXJBID0gJHN1bW1lckIgPSAwOwoKCQkvLyBMb29wIHRocm91Z2ggYXJndW1lbnRzCgkJJGFBcmdzID0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuQXJyYXkoZnVuY19nZXRfYXJncygpKTsKCQkkYUNvdW50ID0gMDsKCQlmb3JlYWNoICgkYUFyZ3MgYXMgJGFyZykgewoJCQlpZiAoaXNfYm9vbCgkYXJnKSkgeyAkYXJnID0gKGludGVnZXIpICRhcmc7IH0KCQkJLy8gSXMgaXQgYSBudW1lcmljIHZhbHVlPwoJCQlpZiAoKGlzX251bWVyaWMoJGFyZykpICYmICghaXNfc3RyaW5nKCRhcmcpKSkgewoJCQkJJHN1bW1lckEgKz0gKCRhcmcgKiAkYXJnKTsKCQkJCSRzdW1tZXJCICs9ICRhcmc7CgkJCQkrKyRhQ291bnQ7CgkJCX0KCQl9CgoJCS8vIFJldHVybgoJCWlmICgkYUNvdW50ID4gMCkgewoJCQkkc3VtbWVyQSAqPSAkYUNvdW50OwoJCQkkc3VtbWVyQiAqPSAkc3VtbWVyQjsKCQkJJHJldHVyblZhbHVlID0gKCRzdW1tZXJBIC0gJHN1bW1lckIpIC8gKCRhQ291bnQgKiAkYUNvdW50KTsKCQl9CgkJcmV0dXJuICRyZXR1cm5WYWx1ZTsKCX0JLy8JZnVuY3Rpb24gVkFSUCgpCgoKCS8qKgoJICogVkFSUEEKCSAqCgkgKiBDYWxjdWxhdGVzIHZhcmlhbmNlIGJhc2VkIG9uIHRoZSBlbnRpcmUgcG9wdWxhdGlvbiwgaW5jbHVkaW5nIG51bWJlcnMsIHRleHQsIGFuZCBsb2dpY2FsIHZhbHVlcwoJICoKCSAqIEV4Y2VsIEZ1bmN0aW9uOgoJICoJCVZBUlBBKHZhbHVlMVssdmFsdWUyWywgLi4uXV0pCgkgKgoJICogQGFjY2VzcwlwdWJsaWMKCSAqIEBjYXRlZ29yeSBTdGF0aXN0aWNhbCBGdW5jdGlvbnMKCSAqIEBwYXJhbQltaXhlZAkJJGFyZywuLi4JCURhdGEgdmFsdWVzCgkgKiBAcmV0dXJuCWZsb2F0CgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gVkFSUEEoKSB7CgkJLy8gUmV0dXJuIHZhbHVlCgkJJHJldHVyblZhbHVlID0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpESVYwKCk7CgoJCSRzdW1tZXJBID0gJHN1bW1lckIgPSAwOwoKCQkvLyBMb29wIHRocm91Z2ggYXJndW1lbnRzCgkJJGFBcmdzID0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuQXJyYXlJbmRleGVkKGZ1bmNfZ2V0X2FyZ3MoKSk7CgkJJGFDb3VudCA9IDA7CgkJZm9yZWFjaCAoJGFBcmdzIGFzICRrID0+ICRhcmcpIHsKCQkJaWYgKChpc19zdHJpbmcoJGFyZykpICYmCgkJCQkoUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjppc1ZhbHVlKCRrKSkpIHsKCQkJCXJldHVybiBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OlZBTFVFKCk7CgkJCX0gZWxzZWlmICgoaXNfc3RyaW5nKCRhcmcpKSAmJgoJCQkJKCFQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmlzTWF0cml4VmFsdWUoJGspKSkgewoJCQl9IGVsc2UgewoJCQkJLy8gSXMgaXQgYSBudW1lcmljIHZhbHVlPwoJCQkJaWYgKChpc19udW1lcmljKCRhcmcpKSB8fCAoaXNfYm9vbCgkYXJnKSkgfHwgKChpc19zdHJpbmcoJGFyZykgJiAoJGFyZyAhPSAnJykpKSkgewoJCQkJCWlmIChpc19ib29sKCRhcmcpKSB7CgkJCQkJCSRhcmcgPSAoaW50ZWdlcikgJGFyZzsKCQkJCQl9IGVsc2VpZiAoaXNfc3RyaW5nKCRhcmcpKSB7CgkJCQkJCSRhcmcgPSAwOwoJCQkJCX0KCQkJCQkkc3VtbWVyQSArPSAoJGFyZyAqICRhcmcpOwoJCQkJCSRzdW1tZXJCICs9ICRhcmc7CgkJCQkJKyskYUNvdW50OwoJCQkJfQoJCQl9CgkJfQoKCQkvLyBSZXR1cm4KCQlpZiAoJGFDb3VudCA+IDApIHsKCQkJJHN1bW1lckEgKj0gJGFDb3VudDsKCQkJJHN1bW1lckIgKj0gJHN1bW1lckI7CgkJCSRyZXR1cm5WYWx1ZSA9ICgkc3VtbWVyQSAtICRzdW1tZXJCKSAvICgkYUNvdW50ICogJGFDb3VudCk7CgkJfQoJCXJldHVybiAkcmV0dXJuVmFsdWU7Cgl9CS8vCWZ1bmN0aW9uIFZBUlBBKCkKCgoJLyoqCgkgKiBXRUlCVUxMCgkgKgoJICogUmV0dXJucyB0aGUgV2VpYnVsbCBkaXN0cmlidXRpb24uIFVzZSB0aGlzIGRpc3RyaWJ1dGlvbiBpbiByZWxpYWJpbGl0eQoJICogYW5hbHlzaXMsIHN1Y2ggYXMgY2FsY3VsYXRpbmcgYSBkZXZpY2UncyBtZWFuIHRpbWUgdG8gZmFpbHVyZS4KCSAqCgkgKiBAcGFyYW0JZmxvYXQJCSR2YWx1ZQoJICogQHBhcmFtCWZsb2F0CQkkYWxwaGEJCUFscGhhIFBhcmFtZXRlcgoJICogQHBhcmFtCWZsb2F0CQkkYmV0YQkJQmV0YSBQYXJhbWV0ZXIKCSAqIEBwYXJhbQlib29sZWFuCQkkY3VtdWxhdGl2ZQoJICogQHJldHVybglmbG9hdAoJICoKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBXRUlCVUxMKCR2YWx1ZSwgJGFscGhhLCAkYmV0YSwgJGN1bXVsYXRpdmUpIHsKCQkkdmFsdWUJPSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5TaW5nbGVWYWx1ZSgkdmFsdWUpOwoJCSRhbHBoYQk9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlblNpbmdsZVZhbHVlKCRhbHBoYSk7CgkJJGJldGEJPSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5TaW5nbGVWYWx1ZSgkYmV0YSk7CgoJCWlmICgoaXNfbnVtZXJpYygkdmFsdWUpKSAmJiAoaXNfbnVtZXJpYygkYWxwaGEpKSAmJiAoaXNfbnVtZXJpYygkYmV0YSkpKSB7CgkJCWlmICgoJHZhbHVlIDwgMCkgfHwgKCRhbHBoYSA8PSAwKSB8fCAoJGJldGEgPD0gMCkpIHsKCQkJCXJldHVybiBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6Ok5hTigpOwoJCQl9CgkJCWlmICgoaXNfbnVtZXJpYygkY3VtdWxhdGl2ZSkpIHx8IChpc19ib29sKCRjdW11bGF0aXZlKSkpIHsKCQkJCWlmICgkY3VtdWxhdGl2ZSkgewoJCQkJCXJldHVybiAxIC0gZXhwKDAgLSBwb3coJHZhbHVlIC8gJGJldGEsJGFscGhhKSk7CgkJCQl9IGVsc2UgewoJCQkJCXJldHVybiAoJGFscGhhIC8gcG93KCRiZXRhLCRhbHBoYSkpICogcG93KCR2YWx1ZSwkYWxwaGEgLSAxKSAqIGV4cCgwIC0gcG93KCR2YWx1ZSAvICRiZXRhLCRhbHBoYSkpOwoJCQkJfQoJCQl9CgkJfQoJCXJldHVybiBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OlZBTFVFKCk7Cgl9CS8vCWZ1bmN0aW9uIFdFSUJVTEwoKQoKCgkvKioKCSAqIFpURVNUCgkgKgoJICogUmV0dXJucyB0aGUgV2VpYnVsbCBkaXN0cmlidXRpb24uIFVzZSB0aGlzIGRpc3RyaWJ1dGlvbiBpbiByZWxpYWJpbGl0eQoJICogYW5hbHlzaXMsIHN1Y2ggYXMgY2FsY3VsYXRpbmcgYSBkZXZpY2UncyBtZWFuIHRpbWUgdG8gZmFpbHVyZS4KCSAqCgkgKiBAcGFyYW0JZmxvYXQJCSR2YWx1ZQoJICogQHBhcmFtCWZsb2F0CQkkYWxwaGEJCUFscGhhIFBhcmFtZXRlcgoJICogQHBhcmFtCWZsb2F0CQkkYmV0YQkJQmV0YSBQYXJhbWV0ZXIKCSAqIEBwYXJhbQlib29sZWFuCQkkY3VtdWxhdGl2ZQoJICogQHJldHVybglmbG9hdAoJICoKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBaVEVTVCgkZGF0YVNldCwgJG0wLCAkc2lnbWE9bnVsbCkgewoJCSRkYXRhU2V0CT0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuQXJyYXlJbmRleGVkKCRkYXRhU2V0KTsKCQkkbTAJCQk9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlblNpbmdsZVZhbHVlKCRtMCk7CgkJJHNpZ21hCQk9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlblNpbmdsZVZhbHVlKCRzaWdtYSk7CgoJCWlmIChpc19udWxsKCRzaWdtYSkpIHsKCQkJJHNpZ21hID0gc2VsZjo6U1RERVYoJGRhdGFTZXQpOwoJCX0KCQkkbiA9IGNvdW50KCRkYXRhU2V0KTsKCgkJcmV0dXJuIDEgLSBzZWxmOjpOT1JNU0RJU1QoKHNlbGY6OkFWRVJBR0UoJGRhdGFTZXQpIC0gJG0wKS8oJHNpZ21hL1NRUlQoJG4pKSk7Cgl9CS8vCWZ1bmN0aW9uIFpURVNUKCkKCn0JLy8JY2xhc3MgUEhQRXhjZWxfQ2FsY3VsYXRpb25fU3RhdGlzdGljYWwK]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Calculation/TextData.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIFBIUEV4Y2VsCiAqCiAqIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKICoKICogQGNhdGVnb3J5CVBIUEV4Y2VsCiAqIEBwYWNrYWdlCQlQSFBFeGNlbF9DYWxjdWxhdGlvbgogKiBAY29weXJpZ2h0CUNvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwgKGh0dHA6Ly93d3cuY29kZXBsZXguY29tL1BIUEV4Y2VsKQogKiBAbGljZW5zZQkJaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL29sZC1saWNlbnNlcy9sZ3BsLTIuMS50eHQJTEdQTAogKiBAdmVyc2lvbgkJMS43LjcsIDIwMTItMDUtMTkKICovCgoKLyoqIFBIUEV4Y2VsIHJvb3QgZGlyZWN0b3J5ICovCmlmICghZGVmaW5lZCgnUEhQRVhDRUxfUk9PVCcpKSB7CgkvKioKCSAqIEBpZ25vcmUKCSAqLwoJZGVmaW5lKCdQSFBFWENFTF9ST09UJywgZGlybmFtZShfX0ZJTEVfXykgLiAnLy4uLy4uLycpOwoJcmVxdWlyZShQSFBFWENFTF9ST09UIC4gJ1BIUEV4Y2VsL0F1dG9sb2FkZXIucGhwJyk7Cn0KCgovKioKICogUEhQRXhjZWxfQ2FsY3VsYXRpb25fVGV4dERhdGEKICoKICogQGNhdGVnb3J5CVBIUEV4Y2VsCiAqIEBwYWNrYWdlCQlQSFBFeGNlbF9DYWxjdWxhdGlvbgogKiBAY29weXJpZ2h0CUNvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwgKGh0dHA6Ly93d3cuY29kZXBsZXguY29tL1BIUEV4Y2VsKQogKi8KY2xhc3MgUEhQRXhjZWxfQ2FsY3VsYXRpb25fVGV4dERhdGEgewoKCXByaXZhdGUgc3RhdGljICRfaW52YWxpZENoYXJzID0gTnVsbDsKCglwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBfdW5pb3JkKCRjKSB7CgkJaWYgKG9yZCgkY3swfSkgPj0wICYmIG9yZCgkY3swfSkgPD0gMTI3KQoJCQlyZXR1cm4gb3JkKCRjezB9KTsKCQlpZiAob3JkKCRjezB9KSA+PSAxOTIgJiYgb3JkKCRjezB9KSA8PSAyMjMpCgkJCXJldHVybiAob3JkKCRjezB9KS0xOTIpKjY0ICsgKG9yZCgkY3sxfSktMTI4KTsKCQlpZiAob3JkKCRjezB9KSA+PSAyMjQgJiYgb3JkKCRjezB9KSA8PSAyMzkpCgkJCXJldHVybiAob3JkKCRjezB9KS0yMjQpKjQwOTYgKyAob3JkKCRjezF9KS0xMjgpKjY0ICsgKG9yZCgkY3syfSktMTI4KTsKCQlpZiAob3JkKCRjezB9KSA+PSAyNDAgJiYgb3JkKCRjezB9KSA8PSAyNDcpCgkJCXJldHVybiAob3JkKCRjezB9KS0yNDApKjI2MjE0NCArIChvcmQoJGN7MX0pLTEyOCkqNDA5NiArIChvcmQoJGN7Mn0pLTEyOCkqNjQgKyAob3JkKCRjezN9KS0xMjgpOwoJCWlmIChvcmQoJGN7MH0pID49IDI0OCAmJiBvcmQoJGN7MH0pIDw9IDI1MSkKCQkJcmV0dXJuIChvcmQoJGN7MH0pLTI0OCkqMTY3NzcyMTYgKyAob3JkKCRjezF9KS0xMjgpKjI2MjE0NCArIChvcmQoJGN7Mn0pLTEyOCkqNDA5NiArIChvcmQoJGN7M30pLTEyOCkqNjQgKyAob3JkKCRjezR9KS0xMjgpOwoJCWlmIChvcmQoJGN7MH0pID49IDI1MiAmJiBvcmQoJGN7MH0pIDw9IDI1MykKCQkJcmV0dXJuIChvcmQoJGN7MH0pLTI1MikqMTA3Mzc0MTgyNCArIChvcmQoJGN7MX0pLTEyOCkqMTY3NzcyMTYgKyAob3JkKCRjezJ9KS0xMjgpKjI2MjE0NCArIChvcmQoJGN7M30pLTEyOCkqNDA5NiArIChvcmQoJGN7NH0pLTEyOCkqNjQgKyAob3JkKCRjezV9KS0xMjgpOwoJCWlmIChvcmQoJGN7MH0pID49IDI1NCAmJiBvcmQoJGN7MH0pIDw9IDI1NSkgLy9lcnJvcgoJCQlyZXR1cm4gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpWQUxVRSgpOwoJCXJldHVybiAwOwoJfQkvLwlmdW5jdGlvbiBfdW5pb3JkKCkKCgkvKioKCSAqIENIQVJBQ1RFUgoJICoKCSAqIEBwYXJhbQlzdHJpbmcJJGNoYXJhY3RlcglWYWx1ZQoJICogQHJldHVybglpbnQKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBDSEFSQUNURVIoJGNoYXJhY3RlcikgewoJCSRjaGFyYWN0ZXIJPSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5TaW5nbGVWYWx1ZSgkY2hhcmFjdGVyKTsKCgkJaWYgKCghaXNfbnVtZXJpYygkY2hhcmFjdGVyKSkgfHwgKCRjaGFyYWN0ZXIgPCAwKSkgewoJCQlyZXR1cm4gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpWQUxVRSgpOwoJCX0KCgkJaWYgKGZ1bmN0aW9uX2V4aXN0cygnbWJfY29udmVydF9lbmNvZGluZycpKSB7CgkJCXJldHVybiBtYl9jb252ZXJ0X2VuY29kaW5nKCcmIycuaW50dmFsKCRjaGFyYWN0ZXIpLic7JywgJ1VURi04JywgJ0hUTUwtRU5USVRJRVMnKTsKCQl9IGVsc2UgewoJCQlyZXR1cm4gY2hyKGludHZhbCgkY2hhcmFjdGVyKSk7CgkJfQoJfQoKCgkvKioKCSAqIFRSSU1OT05QUklOVEFCTEUKCSAqCgkgKiBAcGFyYW0JbWl4ZWQJJHZhbHVlCVZhbHVlIHRvIGNoZWNrCgkgKiBAcmV0dXJuCXN0cmluZwoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIFRSSU1OT05QUklOVEFCTEUoJHN0cmluZ1ZhbHVlID0gJycpIHsKCQkkc3RyaW5nVmFsdWUJPSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5TaW5nbGVWYWx1ZSgkc3RyaW5nVmFsdWUpOwoKCQlpZiAoaXNfYm9vbCgkc3RyaW5nVmFsdWUpKSB7CgkJCXJldHVybiAoJHN0cmluZ1ZhbHVlKSA/IFBIUEV4Y2VsX0NhbGN1bGF0aW9uOjpnZXRUUlVFKCkgOiBQSFBFeGNlbF9DYWxjdWxhdGlvbjo6Z2V0RkFMU0UoKTsKCQl9CgoJCWlmIChzZWxmOjokX2ludmFsaWRDaGFycyA9PSBOdWxsKSB7CgkJCXNlbGY6OiRfaW52YWxpZENoYXJzID0gcmFuZ2UoY2hyKDApLGNocigzMSkpOwoJCX0KCgkJaWYgKGlzX3N0cmluZygkc3RyaW5nVmFsdWUpIHx8IGlzX251bWVyaWMoJHN0cmluZ1ZhbHVlKSkgewoJCQlyZXR1cm4gc3RyX3JlcGxhY2Uoc2VsZjo6JF9pbnZhbGlkQ2hhcnMsJycsdHJpbSgkc3RyaW5nVmFsdWUsIlx4MDAuLlx4MUYiKSk7CgkJfQoJCXJldHVybiBOVUxMOwoJfQkvLwlmdW5jdGlvbiBUUklNTk9OUFJJTlRBQkxFKCkKCgoJLyoqCgkgKiBUUklNU1BBQ0VTCgkgKgoJICogQHBhcmFtCW1peGVkCSR2YWx1ZQlWYWx1ZSB0byBjaGVjawoJICogQHJldHVybglzdHJpbmcKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBUUklNU1BBQ0VTKCRzdHJpbmdWYWx1ZSA9ICcnKSB7CgkJJHN0cmluZ1ZhbHVlCT0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuU2luZ2xlVmFsdWUoJHN0cmluZ1ZhbHVlKTsKCgkJaWYgKGlzX2Jvb2woJHN0cmluZ1ZhbHVlKSkgewoJCQlyZXR1cm4gKCRzdHJpbmdWYWx1ZSkgPyBQSFBFeGNlbF9DYWxjdWxhdGlvbjo6Z2V0VFJVRSgpIDogUEhQRXhjZWxfQ2FsY3VsYXRpb246OmdldEZBTFNFKCk7CgkJfQoKCQlpZiAoaXNfc3RyaW5nKCRzdHJpbmdWYWx1ZSkgfHwgaXNfbnVtZXJpYygkc3RyaW5nVmFsdWUpKSB7CgkJCXJldHVybiB0cmltKHByZWdfcmVwbGFjZSgnLyArLycsJyAnLHRyaW0oJHN0cmluZ1ZhbHVlLCcgJykpKTsKCQl9CgkJcmV0dXJuIE5VTEw7Cgl9CS8vCWZ1bmN0aW9uIFRSSU1TUEFDRVMoKQoKCgkvKioKCSAqIEFTQ0lJQ09ERQoJICoKCSAqIEBwYXJhbQlzdHJpbmcJJGNoYXJhY3RlcglWYWx1ZQoJICogQHJldHVybglpbnQKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBBU0NJSUNPREUoJGNoYXJhY3RlcnMpIHsKCQlpZiAoKCRjaGFyYWN0ZXJzID09PSBOVUxMKSB8fCAoJGNoYXJhY3RlcnMgPT09ICcnKSkKCQkJcmV0dXJuIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6VkFMVUUoKTsKCQkkY2hhcmFjdGVycwk9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlblNpbmdsZVZhbHVlKCRjaGFyYWN0ZXJzKTsKCQlpZiAoaXNfYm9vbCgkY2hhcmFjdGVycykpIHsKCQkJaWYgKFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6Z2V0Q29tcGF0aWJpbGl0eU1vZGUoKSA9PSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OkNPTVBBVElCSUxJVFlfT1BFTk9GRklDRSkgewoJCQkJJGNoYXJhY3RlcnMgPSAoaW50KSAkY2hhcmFjdGVyczsKCQkJfSBlbHNlIHsKCQkJCSRjaGFyYWN0ZXJzID0gKCRjaGFyYWN0ZXJzKSA/IFBIUEV4Y2VsX0NhbGN1bGF0aW9uOjpnZXRUUlVFKCkgOiBQSFBFeGNlbF9DYWxjdWxhdGlvbjo6Z2V0RkFMU0UoKTsKCQkJfQoJCX0KCgkJJGNoYXJhY3RlciA9ICRjaGFyYWN0ZXJzOwoJCWlmICgoZnVuY3Rpb25fZXhpc3RzKCdtYl9zdHJsZW4nKSkgJiYgKGZ1bmN0aW9uX2V4aXN0cygnbWJfc3Vic3RyJykpKSB7CgkJCWlmIChtYl9zdHJsZW4oJGNoYXJhY3RlcnMsICdVVEYtOCcpID4gMSkgeyAkY2hhcmFjdGVyID0gbWJfc3Vic3RyKCRjaGFyYWN0ZXJzLCAwLCAxLCAnVVRGLTgnKTsgfQoJCQlyZXR1cm4gc2VsZjo6X3VuaW9yZCgkY2hhcmFjdGVyKTsKCQl9IGVsc2UgewoJCQlpZiAoc3RybGVuKCRjaGFyYWN0ZXJzKSA+IDApIHsgJGNoYXJhY3RlciA9IHN1YnN0cigkY2hhcmFjdGVycywgMCwgMSk7IH0KCQkJcmV0dXJuIG9yZCgkY2hhcmFjdGVyKTsKCQl9Cgl9CS8vCWZ1bmN0aW9uIEFTQ0lJQ09ERSgpCgoKCS8qKgoJICogQ09OQ0FURU5BVEUKCSAqCgkgKiBAcmV0dXJuCXN0cmluZwoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIENPTkNBVEVOQVRFKCkgewoJCS8vIFJldHVybiB2YWx1ZQoJCSRyZXR1cm5WYWx1ZSA9ICcnOwoKCQkvLyBMb29wIHRocm91Z2ggYXJndW1lbnRzCgkJJGFBcmdzID0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuQXJyYXkoZnVuY19nZXRfYXJncygpKTsKCQlmb3JlYWNoICgkYUFyZ3MgYXMgJGFyZykgewoJCQlpZiAoaXNfYm9vbCgkYXJnKSkgewoJCQkJaWYgKFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6Z2V0Q29tcGF0aWJpbGl0eU1vZGUoKSA9PSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OkNPTVBBVElCSUxJVFlfT1BFTk9GRklDRSkgewoJCQkJCSRhcmcgPSAoaW50KSAkYXJnOwoJCQkJfSBlbHNlIHsKCQkJCQkkYXJnID0gKCRhcmcpID8gUEhQRXhjZWxfQ2FsY3VsYXRpb246OmdldFRSVUUoKSA6IFBIUEV4Y2VsX0NhbGN1bGF0aW9uOjpnZXRGQUxTRSgpOwoJCQkJfQoJCQl9CgkJCSRyZXR1cm5WYWx1ZSAuPSAkYXJnOwoJCX0KCgkJLy8gUmV0dXJuCgkJcmV0dXJuICRyZXR1cm5WYWx1ZTsKCX0JLy8JZnVuY3Rpb24gQ09OQ0FURU5BVEUoKQoKCgkvKioKCSAqIERPTExBUgoJICoKCSAqIFRoaXMgZnVuY3Rpb24gY29udmVydHMgYSBudW1iZXIgdG8gdGV4dCB1c2luZyBjdXJyZW5jeSBmb3JtYXQsIHdpdGggdGhlIGRlY2ltYWxzIHJvdW5kZWQgdG8gdGhlIHNwZWNpZmllZCBwbGFjZS4KCSAqIFRoZSBmb3JtYXQgdXNlZCBpcyAkIywjIzAuMDBfKTsoJCMsIyMwLjAwKS4uCgkgKgoJICogQHBhcmFtCWZsb2F0CSR2YWx1ZQkJCVRoZSB2YWx1ZSB0byBmb3JtYXQKCSAqIEBwYXJhbQlpbnQJCSRkZWNpbWFscwkJVGhlIG51bWJlciBvZiBkaWdpdHMgdG8gZGlzcGxheSB0byB0aGUgcmlnaHQgb2YgdGhlIGRlY2ltYWwgcG9pbnQuCgkgKgkJCQkJCQkJCUlmIGRlY2ltYWxzIGlzIG5lZ2F0aXZlLCBudW1iZXIgaXMgcm91bmRlZCB0byB0aGUgbGVmdCBvZiB0aGUgZGVjaW1hbCBwb2ludC4KCSAqCQkJCQkJCQkJSWYgeW91IG9taXQgZGVjaW1hbHMsIGl0IGlzIGFzc3VtZWQgdG8gYmUgMgoJICogQHJldHVybglzdHJpbmcKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBET0xMQVIoJHZhbHVlID0gMCwgJGRlY2ltYWxzID0gMikgewoJCSR2YWx1ZQkJPSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5TaW5nbGVWYWx1ZSgkdmFsdWUpOwoJCSRkZWNpbWFscwk9IGlzX251bGwoJGRlY2ltYWxzKSA/IDAgOiBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5TaW5nbGVWYWx1ZSgkZGVjaW1hbHMpOwoKCQkvLyBWYWxpZGF0ZSBwYXJhbWV0ZXJzCgkJaWYgKCFpc19udW1lcmljKCR2YWx1ZSkgfHwgIWlzX251bWVyaWMoJGRlY2ltYWxzKSkgewoJCQlyZXR1cm4gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpOYU4oKTsKCQl9CgkJJGRlY2ltYWxzID0gZmxvb3IoJGRlY2ltYWxzKTsKCgkJaWYgKCRkZWNpbWFscyA+IDApIHsKCQkJcmV0dXJuIG1vbmV5X2Zvcm1hdCgnJS4nLiRkZWNpbWFscy4nbicsJHZhbHVlKTsKCQl9IGVsc2UgewoJCQkkcm91bmQgPSBwb3coMTAsYWJzKCRkZWNpbWFscykpOwoJCQlpZiAoJHZhbHVlIDwgMCkgeyAkcm91bmQgPSAwLSRyb3VuZDsgfQoJCQkkdmFsdWUgPSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9NYXRoVHJpZzo6TVJPVU5EKCR2YWx1ZSwkcm91bmQpOwoJCQkvLwlUaGUgaW1wbGVtZW50YXRpb24gb2YgbW9uZXlfZm9ybWF0IHVzZWQgaWYgdGhlIHN0YW5kYXJkIFBIUCBmdW5jdGlvbiBpcyBub3QgYXZhaWxhYmxlIGNhbid0IGhhbmRsZSBkZWNpbWFsIHBsYWNlcyBvZiAwLAoJCQkvLwkJc28gd2UgZGlzcGxheSB0byAxIGRwIGFuZCBjaG9wIG9mZiB0aGF0IGNoYXJhY3RlciBhbmQgdGhlIGRlY2ltYWwgc2VwYXJhdG9yIHVzaW5nIHN1YnN0cgoJCQlyZXR1cm4gc3Vic3RyKG1vbmV5X2Zvcm1hdCgnJS4xbicsJHZhbHVlKSwwLC0yKTsKCQl9Cgl9CS8vCWZ1bmN0aW9uIERPTExBUigpCgoKCS8qKgoJICogU0VBUkNIU0VOU0lUSVZFCgkgKgoJICogQHBhcmFtCXN0cmluZwkkbmVlZGxlCQlUaGUgc3RyaW5nIHRvIGxvb2sgZm9yCgkgKiBAcGFyYW0Jc3RyaW5nCSRoYXlzdGFjawlUaGUgc3RyaW5nIGluIHdoaWNoIHRvIGxvb2sKCSAqIEBwYXJhbQlpbnQJCSRvZmZzZXQJCU9mZnNldCB3aXRoaW4gJGhheXN0YWNrCgkgKiBAcmV0dXJuCXN0cmluZwoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIFNFQVJDSFNFTlNJVElWRSgkbmVlZGxlLCRoYXlzdGFjaywkb2Zmc2V0PTEpIHsKCQkkbmVlZGxlCQk9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlblNpbmdsZVZhbHVlKCRuZWVkbGUpOwoJCSRoYXlzdGFjawk9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlblNpbmdsZVZhbHVlKCRoYXlzdGFjayk7CgkJJG9mZnNldAkJPSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5TaW5nbGVWYWx1ZSgkb2Zmc2V0KTsKCgkJaWYgKCFpc19ib29sKCRuZWVkbGUpKSB7CgkJCWlmIChpc19ib29sKCRoYXlzdGFjaykpIHsKCQkJCSRoYXlzdGFjayA9ICgkaGF5c3RhY2spID8gUEhQRXhjZWxfQ2FsY3VsYXRpb246OmdldFRSVUUoKSA6IFBIUEV4Y2VsX0NhbGN1bGF0aW9uOjpnZXRGQUxTRSgpOwoJCQl9CgoJCQlpZiAoKCRvZmZzZXQgPiAwKSAmJiAoc3RybGVuKCRoYXlzdGFjaykgPiAkb2Zmc2V0KSkgewoJCQkJaWYgKGZ1bmN0aW9uX2V4aXN0cygnbWJfc3RycG9zJykpIHsKCQkJCQkkcG9zID0gbWJfc3RycG9zKCRoYXlzdGFjaywgJG5lZWRsZSwgLS0kb2Zmc2V0LCdVVEYtOCcpOwoJCQkJfSBlbHNlIHsKCQkJCQkkcG9zID0gc3RycG9zKCRoYXlzdGFjaywgJG5lZWRsZSwgLS0kb2Zmc2V0KTsKCQkJCX0KCQkJCWlmICgkcG9zICE9PSBmYWxzZSkgewoJCQkJCXJldHVybiArKyRwb3M7CgkJCQl9CgkJCX0KCQl9CgkJcmV0dXJuIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6VkFMVUUoKTsKCX0JLy8JZnVuY3Rpb24gU0VBUkNIU0VOU0lUSVZFKCkKCgoJLyoqCgkgKiBTRUFSQ0hJTlNFTlNJVElWRQoJICoKCSAqIEBwYXJhbQlzdHJpbmcJJG5lZWRsZQkJVGhlIHN0cmluZyB0byBsb29rIGZvcgoJICogQHBhcmFtCXN0cmluZwkkaGF5c3RhY2sJVGhlIHN0cmluZyBpbiB3aGljaCB0byBsb29rCgkgKiBAcGFyYW0JaW50CQkkb2Zmc2V0CQlPZmZzZXQgd2l0aGluICRoYXlzdGFjawoJICogQHJldHVybglzdHJpbmcKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBTRUFSQ0hJTlNFTlNJVElWRSgkbmVlZGxlLCRoYXlzdGFjaywkb2Zmc2V0PTEpIHsKCQkkbmVlZGxlCQk9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlblNpbmdsZVZhbHVlKCRuZWVkbGUpOwoJCSRoYXlzdGFjawk9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlblNpbmdsZVZhbHVlKCRoYXlzdGFjayk7CgkJJG9mZnNldAkJPSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5TaW5nbGVWYWx1ZSgkb2Zmc2V0KTsKCgkJaWYgKCFpc19ib29sKCRuZWVkbGUpKSB7CgkJCWlmIChpc19ib29sKCRoYXlzdGFjaykpIHsKCQkJCSRoYXlzdGFjayA9ICgkaGF5c3RhY2spID8gUEhQRXhjZWxfQ2FsY3VsYXRpb246OmdldFRSVUUoKSA6IFBIUEV4Y2VsX0NhbGN1bGF0aW9uOjpnZXRGQUxTRSgpOwoJCQl9CgoJCQlpZiAoKCRvZmZzZXQgPiAwKSAmJiAoc3RybGVuKCRoYXlzdGFjaykgPiAkb2Zmc2V0KSkgewoJCQkJaWYgKGZ1bmN0aW9uX2V4aXN0cygnbWJfc3RyaXBvcycpKSB7CgkJCQkJJHBvcyA9IG1iX3N0cmlwb3MoJGhheXN0YWNrLCAkbmVlZGxlLCAtLSRvZmZzZXQsJ1VURi04Jyk7CgkJCQl9IGVsc2UgewoJCQkJCSRwb3MgPSBzdHJpcG9zKCRoYXlzdGFjaywgJG5lZWRsZSwgLS0kb2Zmc2V0KTsKCQkJCX0KCQkJCWlmICgkcG9zICE9PSBmYWxzZSkgewoJCQkJCXJldHVybiArKyRwb3M7CgkJCQl9CgkJCX0KCQl9CgkJcmV0dXJuIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6VkFMVUUoKTsKCX0JLy8JZnVuY3Rpb24gU0VBUkNISU5TRU5TSVRJVkUoKQoKCgkvKioKCSAqIEZJWEVERk9STUFUCgkgKgoJICogQHBhcmFtCW1peGVkCSR2YWx1ZQlWYWx1ZSB0byBjaGVjawoJICogQHJldHVybglib29sZWFuCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gRklYRURGT1JNQVQoJHZhbHVlLCAkZGVjaW1hbHMgPSAyLCAkbm9fY29tbWFzID0gRkFMU0UpIHsKCQkkdmFsdWUJCT0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuU2luZ2xlVmFsdWUoJHZhbHVlKTsKCQkkZGVjaW1hbHMJPSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5TaW5nbGVWYWx1ZSgkZGVjaW1hbHMpOwoJCSRub19jb21tYXMJPSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5TaW5nbGVWYWx1ZSgkbm9fY29tbWFzKTsKCgkJLy8gVmFsaWRhdGUgcGFyYW1ldGVycwoJCWlmICghaXNfbnVtZXJpYygkdmFsdWUpIHx8ICFpc19udW1lcmljKCRkZWNpbWFscykpIHsKCQkJcmV0dXJuIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6TmFOKCk7CgkJfQoJCSRkZWNpbWFscyA9IGZsb29yKCRkZWNpbWFscyk7CgoJCSR2YWx1ZVJlc3VsdCA9IHJvdW5kKCR2YWx1ZSwkZGVjaW1hbHMpOwoJCWlmICgkZGVjaW1hbHMgPCAwKSB7ICRkZWNpbWFscyA9IDA7IH0KCQlpZiAoISRub19jb21tYXMpIHsKCQkJJHZhbHVlUmVzdWx0ID0gbnVtYmVyX2Zvcm1hdCgkdmFsdWVSZXN1bHQsJGRlY2ltYWxzKTsKCQl9CgoJCXJldHVybiAoc3RyaW5nKSAkdmFsdWVSZXN1bHQ7Cgl9CS8vCWZ1bmN0aW9uIEZJWEVERk9STUFUKCkKCgoJLyoqCgkgKiBMRUZUCgkgKgoJICogQHBhcmFtCXN0cmluZwkkdmFsdWUJVmFsdWUKCSAqIEBwYXJhbQlpbnQJCSRjaGFycwlOdW1iZXIgb2YgY2hhcmFjdGVycwoJICogQHJldHVybglzdHJpbmcKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBMRUZUKCR2YWx1ZSA9ICcnLCAkY2hhcnMgPSAxKSB7CgkJJHZhbHVlCQk9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlblNpbmdsZVZhbHVlKCR2YWx1ZSk7CgkJJGNoYXJzCQk9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlblNpbmdsZVZhbHVlKCRjaGFycyk7CgoJCWlmICgkY2hhcnMgPCAwKSB7CgkJCXJldHVybiBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OlZBTFVFKCk7CgkJfQoKCQlpZiAoaXNfYm9vbCgkdmFsdWUpKSB7CgkJCSR2YWx1ZSA9ICgkdmFsdWUpID8gUEhQRXhjZWxfQ2FsY3VsYXRpb246OmdldFRSVUUoKSA6IFBIUEV4Y2VsX0NhbGN1bGF0aW9uOjpnZXRGQUxTRSgpOwoJCX0KCgkJaWYgKGZ1bmN0aW9uX2V4aXN0cygnbWJfc3Vic3RyJykpIHsKCQkJcmV0dXJuIG1iX3N1YnN0cigkdmFsdWUsIDAsICRjaGFycywgJ1VURi04Jyk7CgkJfSBlbHNlIHsKCQkJcmV0dXJuIHN1YnN0cigkdmFsdWUsIDAsICRjaGFycyk7CgkJfQoJfQkvLwlmdW5jdGlvbiBMRUZUKCkKCgoJLyoqCgkgKiBNSUQKCSAqCgkgKiBAcGFyYW0Jc3RyaW5nCSR2YWx1ZQlWYWx1ZQoJICogQHBhcmFtCWludAkJJHN0YXJ0CVN0YXJ0IGNoYXJhY3RlcgoJICogQHBhcmFtCWludAkJJGNoYXJzCU51bWJlciBvZiBjaGFyYWN0ZXJzCgkgKiBAcmV0dXJuCXN0cmluZwoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIE1JRCgkdmFsdWUgPSAnJywgJHN0YXJ0ID0gMSwgJGNoYXJzID0gbnVsbCkgewoJCSR2YWx1ZQkJPSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5TaW5nbGVWYWx1ZSgkdmFsdWUpOwoJCSRzdGFydAkJPSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5TaW5nbGVWYWx1ZSgkc3RhcnQpOwoJCSRjaGFycwkJPSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5TaW5nbGVWYWx1ZSgkY2hhcnMpOwoKCQlpZiAoKCRzdGFydCA8IDEpIHx8ICgkY2hhcnMgPCAwKSkgewoJCQlyZXR1cm4gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpWQUxVRSgpOwoJCX0KCgkJaWYgKGlzX2Jvb2woJHZhbHVlKSkgewoJCQkkdmFsdWUgPSAoJHZhbHVlKSA/IFBIUEV4Y2VsX0NhbGN1bGF0aW9uOjpnZXRUUlVFKCkgOiBQSFBFeGNlbF9DYWxjdWxhdGlvbjo6Z2V0RkFMU0UoKTsKCQl9CgoJCWlmIChmdW5jdGlvbl9leGlzdHMoJ21iX3N1YnN0cicpKSB7CgkJCXJldHVybiBtYl9zdWJzdHIoJHZhbHVlLCAtLSRzdGFydCwgJGNoYXJzLCAnVVRGLTgnKTsKCQl9IGVsc2UgewoJCQlyZXR1cm4gc3Vic3RyKCR2YWx1ZSwgLS0kc3RhcnQsICRjaGFycyk7CgkJfQoJfQkvLwlmdW5jdGlvbiBNSUQoKQoKCgkvKioKCSAqIFJJR0hUCgkgKgoJICogQHBhcmFtCXN0cmluZwkkdmFsdWUJVmFsdWUKCSAqIEBwYXJhbQlpbnQJCSRjaGFycwlOdW1iZXIgb2YgY2hhcmFjdGVycwoJICogQHJldHVybglzdHJpbmcKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBSSUdIVCgkdmFsdWUgPSAnJywgJGNoYXJzID0gMSkgewoJCSR2YWx1ZQkJPSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5TaW5nbGVWYWx1ZSgkdmFsdWUpOwoJCSRjaGFycwkJPSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5TaW5nbGVWYWx1ZSgkY2hhcnMpOwoKCQlpZiAoJGNoYXJzIDwgMCkgewoJCQlyZXR1cm4gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpWQUxVRSgpOwoJCX0KCgkJaWYgKGlzX2Jvb2woJHZhbHVlKSkgewoJCQkkdmFsdWUgPSAoJHZhbHVlKSA/IFBIUEV4Y2VsX0NhbGN1bGF0aW9uOjpnZXRUUlVFKCkgOiBQSFBFeGNlbF9DYWxjdWxhdGlvbjo6Z2V0RkFMU0UoKTsKCQl9CgoJCWlmICgoZnVuY3Rpb25fZXhpc3RzKCdtYl9zdWJzdHInKSkgJiYgKGZ1bmN0aW9uX2V4aXN0cygnbWJfc3RybGVuJykpKSB7CgkJCXJldHVybiBtYl9zdWJzdHIoJHZhbHVlLCBtYl9zdHJsZW4oJHZhbHVlLCAnVVRGLTgnKSAtICRjaGFycywgJGNoYXJzLCAnVVRGLTgnKTsKCQl9IGVsc2UgewoJCQlyZXR1cm4gc3Vic3RyKCR2YWx1ZSwgc3RybGVuKCR2YWx1ZSkgLSAkY2hhcnMpOwoJCX0KCX0JLy8JZnVuY3Rpb24gUklHSFQoKQoKCgkvKioKCSAqIFNUUklOR0xFTkdUSAoJICoKCSAqIEBwYXJhbQlzdHJpbmcJJHZhbHVlCVZhbHVlCgkgKiBAcGFyYW0JaW50CQkkY2hhcnMJTnVtYmVyIG9mIGNoYXJhY3RlcnMKCSAqIEByZXR1cm4Jc3RyaW5nCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gU1RSSU5HTEVOR1RIKCR2YWx1ZSA9ICcnKSB7CgkJJHZhbHVlCQk9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlblNpbmdsZVZhbHVlKCR2YWx1ZSk7CgoJCWlmIChpc19ib29sKCR2YWx1ZSkpIHsKCQkJJHZhbHVlID0gKCR2YWx1ZSkgPyBQSFBFeGNlbF9DYWxjdWxhdGlvbjo6Z2V0VFJVRSgpIDogUEhQRXhjZWxfQ2FsY3VsYXRpb246OmdldEZBTFNFKCk7CgkJfQoKCQlpZiAoZnVuY3Rpb25fZXhpc3RzKCdtYl9zdHJsZW4nKSkgewoJCQlyZXR1cm4gbWJfc3RybGVuKCR2YWx1ZSwgJ1VURi04Jyk7CgkJfSBlbHNlIHsKCQkJcmV0dXJuIHN0cmxlbigkdmFsdWUpOwoJCX0KCX0JLy8JZnVuY3Rpb24gU1RSSU5HTEVOR1RIKCkKCgoJLyoqCgkgKiBMT1dFUkNBU0UKCSAqCgkgKiBDb252ZXJ0cyBhIHN0cmluZyB2YWx1ZSB0byB1cHBlciBjYXNlLgoJICoKCSAqIEBwYXJhbQlzdHJpbmcJCSRtaXhlZENhc2VTdHJpbmcKCSAqIEByZXR1cm4Jc3RyaW5nCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gTE9XRVJDQVNFKCRtaXhlZENhc2VTdHJpbmcpIHsKCQkkbWl4ZWRDYXNlU3RyaW5nCT0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuU2luZ2xlVmFsdWUoJG1peGVkQ2FzZVN0cmluZyk7CgoJCWlmIChpc19ib29sKCRtaXhlZENhc2VTdHJpbmcpKSB7CgkJCSRtaXhlZENhc2VTdHJpbmcgPSAoJG1peGVkQ2FzZVN0cmluZykgPyBQSFBFeGNlbF9DYWxjdWxhdGlvbjo6Z2V0VFJVRSgpIDogUEhQRXhjZWxfQ2FsY3VsYXRpb246OmdldEZBTFNFKCk7CgkJfQoKCQlpZiAoZnVuY3Rpb25fZXhpc3RzKCdtYl9jb252ZXJ0X2Nhc2UnKSkgewoJCQlyZXR1cm4gbWJfY29udmVydF9jYXNlKCRtaXhlZENhc2VTdHJpbmcsIE1CX0NBU0VfTE9XRVIsICdVVEYtOCcpOwoJCX0gZWxzZSB7CgkJCXJldHVybiBzdHJ0b3VwcGVyKCRtaXhlZENhc2VTdHJpbmcpOwoJCX0KCX0JLy8JZnVuY3Rpb24gTE9XRVJDQVNFKCkKCgoJLyoqCgkgKiBVUFBFUkNBU0UKCSAqCgkgKiBDb252ZXJ0cyBhIHN0cmluZyB2YWx1ZSB0byB1cHBlciBjYXNlLgoJICoKCSAqIEBwYXJhbQlzdHJpbmcJCSRtaXhlZENhc2VTdHJpbmcKCSAqIEByZXR1cm4Jc3RyaW5nCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gVVBQRVJDQVNFKCRtaXhlZENhc2VTdHJpbmcpIHsKCQkkbWl4ZWRDYXNlU3RyaW5nCT0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuU2luZ2xlVmFsdWUoJG1peGVkQ2FzZVN0cmluZyk7CgoJCWlmIChpc19ib29sKCRtaXhlZENhc2VTdHJpbmcpKSB7CgkJCSRtaXhlZENhc2VTdHJpbmcgPSAoJG1peGVkQ2FzZVN0cmluZykgPyBQSFBFeGNlbF9DYWxjdWxhdGlvbjo6Z2V0VFJVRSgpIDogUEhQRXhjZWxfQ2FsY3VsYXRpb246OmdldEZBTFNFKCk7CgkJfQoKCQlpZiAoZnVuY3Rpb25fZXhpc3RzKCdtYl9jb252ZXJ0X2Nhc2UnKSkgewoJCQlyZXR1cm4gbWJfY29udmVydF9jYXNlKCRtaXhlZENhc2VTdHJpbmcsIE1CX0NBU0VfVVBQRVIsICdVVEYtOCcpOwoJCX0gZWxzZSB7CgkJCXJldHVybiBzdHJ0b3VwcGVyKCRtaXhlZENhc2VTdHJpbmcpOwoJCX0KCX0JLy8JZnVuY3Rpb24gVVBQRVJDQVNFKCkKCgoJLyoqCgkgKiBQUk9QRVJDQVNFCgkgKgoJICogQ29udmVydHMgYSBzdHJpbmcgdmFsdWUgdG8gdXBwZXIgY2FzZS4KCSAqCgkgKiBAcGFyYW0Jc3RyaW5nCQkkbWl4ZWRDYXNlU3RyaW5nCgkgKiBAcmV0dXJuCXN0cmluZwoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIFBST1BFUkNBU0UoJG1peGVkQ2FzZVN0cmluZykgewoJCSRtaXhlZENhc2VTdHJpbmcJPSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5TaW5nbGVWYWx1ZSgkbWl4ZWRDYXNlU3RyaW5nKTsKCgkJaWYgKGlzX2Jvb2woJG1peGVkQ2FzZVN0cmluZykpIHsKCQkJJG1peGVkQ2FzZVN0cmluZyA9ICgkbWl4ZWRDYXNlU3RyaW5nKSA/IFBIUEV4Y2VsX0NhbGN1bGF0aW9uOjpnZXRUUlVFKCkgOiBQSFBFeGNlbF9DYWxjdWxhdGlvbjo6Z2V0RkFMU0UoKTsKCQl9CgoJCWlmIChmdW5jdGlvbl9leGlzdHMoJ21iX2NvbnZlcnRfY2FzZScpKSB7CgkJCXJldHVybiBtYl9jb252ZXJ0X2Nhc2UoJG1peGVkQ2FzZVN0cmluZywgTUJfQ0FTRV9USVRMRSwgJ1VURi04Jyk7CgkJfSBlbHNlIHsKCQkJcmV0dXJuIHVjd29yZHMoJG1peGVkQ2FzZVN0cmluZyk7CgkJfQoJfQkvLwlmdW5jdGlvbiBQUk9QRVJDQVNFKCkKCgoJLyoqCgkgKiBSRVBMQUNFCgkgKgoJICogQHBhcmFtCXN0cmluZwkkdmFsdWUJVmFsdWUKCSAqIEBwYXJhbQlpbnQJCSRzdGFydAlTdGFydCBjaGFyYWN0ZXIKCSAqIEBwYXJhbQlpbnQJCSRjaGFycwlOdW1iZXIgb2YgY2hhcmFjdGVycwoJICogQHJldHVybglzdHJpbmcKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBSRVBMQUNFKCRvbGRUZXh0ID0gJycsICRzdGFydCA9IDEsICRjaGFycyA9IG51bGwsICRuZXdUZXh0KSB7CgkJJG9sZFRleHQJPSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5TaW5nbGVWYWx1ZSgkb2xkVGV4dCk7CgkJJHN0YXJ0CQk9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlblNpbmdsZVZhbHVlKCRzdGFydCk7CgkJJGNoYXJzCQk9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlblNpbmdsZVZhbHVlKCRjaGFycyk7CgkJJG5ld1RleHQJPSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5TaW5nbGVWYWx1ZSgkbmV3VGV4dCk7CgoJCSRsZWZ0ID0gc2VsZjo6TEVGVCgkb2xkVGV4dCwkc3RhcnQtMSk7CgkJJHJpZ2h0ID0gc2VsZjo6UklHSFQoJG9sZFRleHQsc2VsZjo6U1RSSU5HTEVOR1RIKCRvbGRUZXh0KS0oJHN0YXJ0KyRjaGFycykrMSk7CgoJCXJldHVybiAkbGVmdC4kbmV3VGV4dC4kcmlnaHQ7Cgl9CS8vCWZ1bmN0aW9uIFJFUExBQ0UoKQoKCgkvKioKCSAqIFNVQlNUSVRVVEUKCSAqCgkgKiBAcGFyYW0Jc3RyaW5nCSR0ZXh0CQlWYWx1ZQoJICogQHBhcmFtCXN0cmluZwkkZnJvbVRleHQJRnJvbSBWYWx1ZQoJICogQHBhcmFtCXN0cmluZwkkdG9UZXh0CQlUbyBWYWx1ZQoJICogQHBhcmFtCWludGVnZXIJJGluc3RhbmNlCUluc3RhbmNlIE51bWJlcgoJICogQHJldHVybglzdHJpbmcKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBTVUJTVElUVVRFKCR0ZXh0ID0gJycsICRmcm9tVGV4dCA9ICcnLCAkdG9UZXh0ID0gJycsICRpbnN0YW5jZSA9IDApIHsKCQkkdGV4dAkJPSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmZsYXR0ZW5TaW5nbGVWYWx1ZSgkdGV4dCk7CgkJJGZyb21UZXh0CT0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuU2luZ2xlVmFsdWUoJGZyb21UZXh0KTsKCQkkdG9UZXh0CQk9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlblNpbmdsZVZhbHVlKCR0b1RleHQpOwoJCSRpbnN0YW5jZQk9IGZsb29yKFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlblNpbmdsZVZhbHVlKCRpbnN0YW5jZSkpOwoKCQlpZiAoJGluc3RhbmNlID09IDApIHsKCQkJaWYoZnVuY3Rpb25fZXhpc3RzKCdtYl9zdHJfcmVwbGFjZScpKSB7CgkJCQlyZXR1cm4gbWJfc3RyX3JlcGxhY2UoJGZyb21UZXh0LCR0b1RleHQsJHRleHQpOwoJCQl9IGVsc2UgewoJCQkJcmV0dXJuIHN0cl9yZXBsYWNlKCRmcm9tVGV4dCwkdG9UZXh0LCR0ZXh0KTsKCQkJfQoJCX0gZWxzZSB7CgkJCSRwb3MgPSAtMTsKCQkJd2hpbGUoJGluc3RhbmNlID4gMCkgewoJCQkJaWYgKGZ1bmN0aW9uX2V4aXN0cygnbWJfc3RycG9zJykpIHsKCQkJCQkkcG9zID0gbWJfc3RycG9zKCR0ZXh0LCAkZnJvbVRleHQsICRwb3MrMSwgJ1VURi04Jyk7CgkJCQl9IGVsc2UgewoJCQkJCSRwb3MgPSBzdHJwb3MoJHRleHQsICRmcm9tVGV4dCwgJHBvcysxKTsKCQkJCX0KCQkJCWlmICgkcG9zID09PSBmYWxzZSkgewoJCQkJCWJyZWFrOwoJCQkJfQoJCQkJLS0kaW5zdGFuY2U7CgkJCX0KCQkJaWYgKCRwb3MgIT09IGZhbHNlKSB7CgkJCQlpZiAoZnVuY3Rpb25fZXhpc3RzKCdtYl9zdHJsZW4nKSkgewoJCQkJCXJldHVybiBzZWxmOjpSRVBMQUNFKCR0ZXh0LCsrJHBvcyxtYl9zdHJsZW4oJGZyb21UZXh0LCAnVVRGLTgnKSwkdG9UZXh0KTsKCQkJCX0gZWxzZSB7CgkJCQkJcmV0dXJuIHNlbGY6OlJFUExBQ0UoJHRleHQsKyskcG9zLHN0cmxlbigkZnJvbVRleHQpLCR0b1RleHQpOwoJCQkJfQoJCQl9CgkJfQoKCQlyZXR1cm4gJHRleHQ7Cgl9CS8vCWZ1bmN0aW9uIFNVQlNUSVRVVEUoKQoKCgkvKioKCSAqIFJFVFVSTlNUUklORwoJICoKCSAqIEBwYXJhbQltaXhlZAkkdmFsdWUJVmFsdWUgdG8gY2hlY2sKCSAqIEByZXR1cm4JYm9vbGVhbgoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIFJFVFVSTlNUUklORygkdGVzdFZhbHVlID0gJycpIHsKCQkkdGVzdFZhbHVlCT0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuU2luZ2xlVmFsdWUoJHRlc3RWYWx1ZSk7CgoJCWlmIChpc19zdHJpbmcoJHRlc3RWYWx1ZSkpIHsKCQkJcmV0dXJuICR0ZXN0VmFsdWU7CgkJfQoJCXJldHVybiBOdWxsOwoJfQkvLwlmdW5jdGlvbiBSRVRVUk5TVFJJTkcoKQoKCgkvKioKCSAqIFRFWFRGT1JNQVQKCSAqCgkgKiBAcGFyYW0JbWl4ZWQJJHZhbHVlCVZhbHVlIHRvIGNoZWNrCgkgKiBAcmV0dXJuCWJvb2xlYW4KCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBURVhURk9STUFUKCR2YWx1ZSwkZm9ybWF0KSB7CgkJJHZhbHVlCT0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuU2luZ2xlVmFsdWUoJHZhbHVlKTsKCQkkZm9ybWF0CT0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpmbGF0dGVuU2luZ2xlVmFsdWUoJGZvcm1hdCk7CgoJCWlmICgoaXNfc3RyaW5nKCR2YWx1ZSkpICYmICghaXNfbnVtZXJpYygkdmFsdWUpKSAmJiBQSFBFeGNlbF9TaGFyZWRfRGF0ZTo6aXNEYXRlVGltZUZvcm1hdENvZGUoJGZvcm1hdCkpIHsKCQkJJHZhbHVlID0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRGF0ZVRpbWU6OkRBVEVWQUxVRSgkdmFsdWUpOwoJCX0KCgkJcmV0dXJuIChzdHJpbmcpIFBIUEV4Y2VsX1N0eWxlX051bWJlckZvcm1hdDo6dG9Gb3JtYXR0ZWRTdHJpbmcoJHZhbHVlLCRmb3JtYXQpOwoJfQkvLwlmdW5jdGlvbiBURVhURk9STUFUKCkKCn0JLy8JY2xhc3MgUEhQRXhjZWxfQ2FsY3VsYXRpb25fVGV4dERhdGEK]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Cell.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIFBIUEV4Y2VsCiAqCiAqIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICoKICogQGNhdGVnb3J5CVBIUEV4Y2VsCiAqIEBwYWNrYWdlCQlQSFBFeGNlbF9DZWxsCiAqIEBjb3B5cmlnaHQJQ29weXJpZ2h0IChjKSAyMDA2IC0gMjAxMiBQSFBFeGNlbCAoaHR0cDovL3d3dy5jb2RlcGxleC5jb20vUEhQRXhjZWwpCiAqIEBsaWNlbnNlCQlodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvb2xkLWxpY2Vuc2VzL2xncGwtMi4xLnR4dAlMR1BMCiAqIEB2ZXJzaW9uCQkxLjcuNywgMjAxMi0wNS0xOQogKi8KCgovKioKICogUEhQRXhjZWxfQ2VsbAogKgogKiBAY2F0ZWdvcnkgICBQSFBFeGNlbAogKiBAcGFja2FnZQlQSFBFeGNlbF9DZWxsCiAqIEBjb3B5cmlnaHQgIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwgKGh0dHA6Ly93d3cuY29kZXBsZXguY29tL1BIUEV4Y2VsKQogKi8KY2xhc3MgUEhQRXhjZWxfQ2VsbAp7CgkvKioKCSAqIFZhbHVlIGJpbmRlciB0byB1c2UKCSAqCgkgKiBAdmFyIFBIUEV4Y2VsX0NlbGxfSVZhbHVlQmluZGVyCgkgKi8KCXByaXZhdGUgc3RhdGljICRfdmFsdWVCaW5kZXIgPSBudWxsOwoKCS8qKgoJICogQ29sdW1uIG9mIHRoZSBjZWxsCgkgKgoJICogQHZhciBzdHJpbmcKCSAqLwoJcHJpdmF0ZSAkX2NvbHVtbjsKCgkvKioKCSAqIFJvdyBvZiB0aGUgY2VsbAoJICoKCSAqIEB2YXIgaW50CgkgKi8KCXByaXZhdGUgJF9yb3c7CgoJLyoqCgkgKiBWYWx1ZSBvZiB0aGUgY2VsbAoJICoKCSAqIEB2YXIgbWl4ZWQKCSAqLwoJcHJpdmF0ZSAkX3ZhbHVlOwoKCS8qKgoJICogQ2FsY3VsYXRlZCB2YWx1ZSBvZiB0aGUgY2VsbCAodXNlZCBmb3IgY2FjaGluZykKCSAqCgkgKiBAdmFyIG1peGVkCgkgKi8KCXByaXZhdGUgJF9jYWxjdWxhdGVkVmFsdWUgPSBudWxsOwoKCS8qKgoJICogVHlwZSBvZiB0aGUgY2VsbCBkYXRhCgkgKgoJICogQHZhciBzdHJpbmcKCSAqLwoJcHJpdmF0ZSAkX2RhdGFUeXBlOwoKCS8qKgoJICogUGFyZW50IHdvcmtzaGVldAoJICoKCSAqIEB2YXIgUEhQRXhjZWxfV29ya3NoZWV0CgkgKi8KCXByaXZhdGUgJF9wYXJlbnQ7CgoJLyoqCgkgKiBJbmRleCB0byBjZWxsWGYKCSAqCgkgKiBAdmFyIGludAoJICovCglwcml2YXRlICRfeGZJbmRleDsKCgkvKioKCSAqIEF0dHJpYnV0ZXMgb2YgdGhlIGZvcm11bGEKCSAqCgkgKgoJICovCglwcml2YXRlICRfZm9ybXVsYUF0dHJpYnV0ZXM7CgoKCS8qKgoJICogU2VuZCBub3RpZmljYXRpb24gdG8gdGhlIGNhY2hlIGNvbnRyb2xsZXIKCSAqCgkgKiBAcmV0dXJuIHZvaWQKCSAqKi8KCXB1YmxpYyBmdW5jdGlvbiBub3RpZnlDYWNoZUNvbnRyb2xsZXIoKSB7CgkJJHRoaXMtPl9wYXJlbnQtPmdldENlbGxDYWNoZUNvbnRyb2xsZXIoKS0+dXBkYXRlQ2FjaGVEYXRhKCR0aGlzKTsKCQlyZXR1cm4gJHRoaXM7Cgl9CgoJcHVibGljIGZ1bmN0aW9uIGRldGFjaCgpIHsKCQkkdGhpcy0+X3BhcmVudCA9IG51bGw7Cgl9CgoJcHVibGljIGZ1bmN0aW9uIGF0dGFjaCgkcGFyZW50KSB7CgkJJHRoaXMtPl9wYXJlbnQgPSAkcGFyZW50OwoJfQoKCgkvKioKCSAqIENyZWF0ZSBhIG5ldyBDZWxsCgkgKgoJICogQHBhcmFtCXN0cmluZwkJCQkkcENvbHVtbgoJICogQHBhcmFtCWludAkJCQkJJHBSb3cKCSAqIEBwYXJhbQltaXhlZAkJCQkkcFZhbHVlCgkgKiBAcGFyYW0Jc3RyaW5nCQkJCSRwRGF0YVR5cGUKCSAqIEBwYXJhbQlQSFBFeGNlbF9Xb3Jrc2hlZXQJJHBTaGVldAoJICogQHRocm93cwlFeGNlcHRpb24KCSAqLwoJcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRwQ29sdW1uID0gJ0EnLCAkcFJvdyA9IDEsICRwVmFsdWUgPSBudWxsLCAkcERhdGFUeXBlID0gbnVsbCwgUEhQRXhjZWxfV29ya3NoZWV0ICRwU2hlZXQgPSBudWxsKQoJewoJCS8vIEluaXRpYWxpc2UgY2VsbCBjb29yZGluYXRlCgkJJHRoaXMtPl9jb2x1bW4gPSBzdHJ0b3VwcGVyKCRwQ29sdW1uKTsKCQkkdGhpcy0+X3JvdyA9ICRwUm93OwoKCQkvLyBJbml0aWFsaXNlIGNlbGwgdmFsdWUKCQkkdGhpcy0+X3ZhbHVlID0gJHBWYWx1ZTsKCgkJLy8gU2V0IHdvcmtzaGVldAoJCSR0aGlzLT5fcGFyZW50ID0gJHBTaGVldDsKCgkJLy8gU2V0IGRhdGF0eXBlPwoJCWlmICgkcERhdGFUeXBlICE9PSBudWxsKSB7CgkJCWlmICgkcERhdGFUeXBlID09IFBIUEV4Y2VsX0NlbGxfRGF0YVR5cGU6OlRZUEVfU1RSSU5HMikKCQkJCSRwRGF0YVR5cGUgPSBQSFBFeGNlbF9DZWxsX0RhdGFUeXBlOjpUWVBFX1NUUklORzsKCQkJJHRoaXMtPl9kYXRhVHlwZSA9ICRwRGF0YVR5cGU7CgkJfSBlbHNlIHsKCQkJaWYgKCFzZWxmOjpnZXRWYWx1ZUJpbmRlcigpLT5iaW5kVmFsdWUoJHRoaXMsICRwVmFsdWUpKSB7CgkJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCJWYWx1ZSBjb3VsZCBub3QgYmUgYm91bmQgdG8gY2VsbC4iKTsKCQkJfQoJCX0KCgkJLy8gc2V0IGRlZmF1bHQgaW5kZXggdG8gY2VsbFhmCgkJJHRoaXMtPl94ZkluZGV4ID0gMDsKCX0KCgkvKioKCSAqIEdldCBjZWxsIGNvb3JkaW5hdGUgY29sdW1uCgkgKgoJICogQHJldHVybiBzdHJpbmcKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldENvbHVtbigpCgl7CgkJcmV0dXJuICR0aGlzLT5fY29sdW1uOwoJfQoKCS8qKgoJICogR2V0IGNlbGwgY29vcmRpbmF0ZSByb3cKCSAqCgkgKiBAcmV0dXJuIGludAoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0Um93KCkKCXsKCQlyZXR1cm4gJHRoaXMtPl9yb3c7Cgl9CgoJLyoqCgkgKiBHZXQgY2VsbCBjb29yZGluYXRlCgkgKgoJICogQHJldHVybiBzdHJpbmcKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldENvb3JkaW5hdGUoKQoJewoJCXJldHVybiAkdGhpcy0+X2NvbHVtbiAuICR0aGlzLT5fcm93OwoJfQoKCS8qKgoJICogR2V0IGNlbGwgdmFsdWUKCSAqCgkgKiBAcmV0dXJuIG1peGVkCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRWYWx1ZSgpCgl7CgkJcmV0dXJuICR0aGlzLT5fdmFsdWU7Cgl9CgoJLyoqCgkgKiBHZXQgY2VsbCB2YWx1ZSB3aXRoIGZvcm1hdHRpbmcKCSAqCgkgKiBAcmV0dXJuIHN0cmluZwoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0Rm9ybWF0dGVkVmFsdWUoKQoJewoJCXJldHVybiAoc3RyaW5nKSBQSFBFeGNlbF9TdHlsZV9OdW1iZXJGb3JtYXQ6OnRvRm9ybWF0dGVkU3RyaW5nKCAkdGhpcy0+Z2V0Q2FsY3VsYXRlZFZhbHVlKCksCgkJCQkJCSAgICAgICAgICR0aGlzLT5fcGFyZW50LT5nZXRQYXJlbnQoKS0+Z2V0Q2VsbFhmQnlJbmRleCgkdGhpcy0+Z2V0WGZJbmRleCgpKS0+Z2V0TnVtYmVyRm9ybWF0KCktPmdldEZvcm1hdENvZGUoKQoJCQkgICAgICAgICAgICApOwoJfQoKCS8qKgoJICogU2V0IGNlbGwgdmFsdWUKCSAqCgkgKiBTZXRzIHRoZSB2YWx1ZSBmb3IgYSBjZWxsLCBhdXRvbWF0aWNhbGx5IGRldGVybWluaW5nIHRoZSBkYXRhdHlwZSB1c2luZyB0aGUgdmFsdWUgYmluZGVyCgkgKgoJICogQHBhcmFtIG1peGVkCSRwVmFsdWUJCQkJCVZhbHVlCgkgKiBAcmV0dXJuIFBIUEV4Y2VsX0NlbGwKCSAqLwoJcHVibGljIGZ1bmN0aW9uIHNldFZhbHVlKCRwVmFsdWUgPSBudWxsKQoJewoJCWlmICghc2VsZjo6Z2V0VmFsdWVCaW5kZXIoKS0+YmluZFZhbHVlKCR0aGlzLCAkcFZhbHVlKSkgewoJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCJWYWx1ZSBjb3VsZCBub3QgYmUgYm91bmQgdG8gY2VsbC4iKTsKCQl9CgkJcmV0dXJuICR0aGlzOwoJfQoKCS8qKgoJICogU2V0IHRoZSB2YWx1ZSBmb3IgYSBjZWxsLCB3aXRoIHRoZSBleHBsaWNpdCBkYXRhIHR5cGUgcGFzc2VkIHRvIHRoZSBtZXRob2QgKGJ5cGFzc2luZyBhbnkgdXNlIG9mIHRoZSB2YWx1ZSBiaW5kZXIpCgkgKgoJICogQHBhcmFtIG1peGVkCSRwVmFsdWUJCQlWYWx1ZQoJICogQHBhcmFtIHN0cmluZwkkcERhdGFUeXBlCQlFeHBsaWNpdCBkYXRhIHR5cGUKCSAqIEByZXR1cm4gUEhQRXhjZWxfQ2VsbAoJICogQHRocm93cyBFeGNlcHRpb24KCSAqLwoJcHVibGljIGZ1bmN0aW9uIHNldFZhbHVlRXhwbGljaXQoJHBWYWx1ZSA9IG51bGwsICRwRGF0YVR5cGUgPSBQSFBFeGNlbF9DZWxsX0RhdGFUeXBlOjpUWVBFX1NUUklORykKCXsKCQkvLyBzZXQgdGhlIHZhbHVlIGFjY29yZGluZyB0byBkYXRhIHR5cGUKCQlzd2l0Y2ggKCRwRGF0YVR5cGUpIHsKCQkJY2FzZSBQSFBFeGNlbF9DZWxsX0RhdGFUeXBlOjpUWVBFX1NUUklORzI6CgkJCQkkcERhdGFUeXBlID0gUEhQRXhjZWxfQ2VsbF9EYXRhVHlwZTo6VFlQRV9TVFJJTkc7CgkJCWNhc2UgUEhQRXhjZWxfQ2VsbF9EYXRhVHlwZTo6VFlQRV9TVFJJTkc6CgkJCWNhc2UgUEhQRXhjZWxfQ2VsbF9EYXRhVHlwZTo6VFlQRV9OVUxMOgoJCQljYXNlIFBIUEV4Y2VsX0NlbGxfRGF0YVR5cGU6OlRZUEVfSU5MSU5FOgoJCQkJJHRoaXMtPl92YWx1ZSA9IFBIUEV4Y2VsX0NlbGxfRGF0YVR5cGU6OmNoZWNrU3RyaW5nKCRwVmFsdWUpOwoJCQkJYnJlYWs7CgoJCQljYXNlIFBIUEV4Y2VsX0NlbGxfRGF0YVR5cGU6OlRZUEVfTlVNRVJJQzoKCQkJCSR0aGlzLT5fdmFsdWUgPSAoZmxvYXQpJHBWYWx1ZTsKCQkJCWJyZWFrOwoKCQkJY2FzZSBQSFBFeGNlbF9DZWxsX0RhdGFUeXBlOjpUWVBFX0ZPUk1VTEE6CgkJCQkkdGhpcy0+X3ZhbHVlID0gKHN0cmluZykkcFZhbHVlOwoJCQkJYnJlYWs7CgoJCQljYXNlIFBIUEV4Y2VsX0NlbGxfRGF0YVR5cGU6OlRZUEVfQk9PTDoKCQkJCSR0aGlzLT5fdmFsdWUgPSAoYm9vbCkkcFZhbHVlOwoJCQkJYnJlYWs7CgoJCQljYXNlIFBIUEV4Y2VsX0NlbGxfRGF0YVR5cGU6OlRZUEVfRVJST1I6CgkJCQkkdGhpcy0+X3ZhbHVlID0gUEhQRXhjZWxfQ2VsbF9EYXRhVHlwZTo6Y2hlY2tFcnJvckNvZGUoJHBWYWx1ZSk7CgkJCQlicmVhazsKCgkJCWRlZmF1bHQ6CgkJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCdJbnZhbGlkIGRhdGF0eXBlOiAnIC4gJHBEYXRhVHlwZSk7CgkJCQlicmVhazsKCQl9CgoJCS8vIHNldCB0aGUgZGF0YXR5cGUKCQkkdGhpcy0+X2RhdGFUeXBlID0gJHBEYXRhVHlwZTsKCgkJcmV0dXJuICR0aGlzLT5ub3RpZnlDYWNoZUNvbnRyb2xsZXIoKTsKCX0KCgkvKioKCSAqIEdldCBjYWxjdWxhdGVkIGNlbGwgdmFsdWUKCSAqCgkgKiBAcmV0dXJuIG1peGVkCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRDYWxjdWxhdGVkVmFsdWUoJHJlc2V0TG9nPXRydWUpCgl7Ci8vCQllY2hvICdDZWxsICcuJHRoaXMtPmdldENvb3JkaW5hdGUoKS4nIHZhbHVlIGlzIGEgJy4kdGhpcy0+X2RhdGFUeXBlLicgd2l0aCBhIHZhbHVlIG9mICcuJHRoaXMtPmdldFZhbHVlKCkuJzxiciAvPic7CgkJaWYgKCR0aGlzLT5fZGF0YVR5cGUgPT0gUEhQRXhjZWxfQ2VsbF9EYXRhVHlwZTo6VFlQRV9GT1JNVUxBKSB7CgkJCXRyeSB7Ci8vCQkJCWVjaG8gJ0NlbGwgdmFsdWUgZm9yICcuJHRoaXMtPmdldENvb3JkaW5hdGUoKS4nIGlzIGEgZm9ybXVsYTogQ2FsY3VsYXRpbmcgdmFsdWU8YnIgLz4nOwoJCQkJJHJlc3VsdCA9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uOjpnZXRJbnN0YW5jZSgpLT5jYWxjdWxhdGVDZWxsVmFsdWUoJHRoaXMsJHJlc2V0TG9nKTsKLy8JCQkJZWNobyAkdGhpcy0+Z2V0Q29vcmRpbmF0ZSgpLicgY2FsY3VsYXRpb24gcmVzdWx0IGlzICcuJHJlc3VsdC4nPGJyIC8+JzsKCQkJfSBjYXRjaCAoIEV4Y2VwdGlvbiAkZXggKSB7CgkJCQlpZiAoKCRleC0+Z2V0TWVzc2FnZSgpID09PSAnVW5hYmxlIHRvIGFjY2VzcyBFeHRlcm5hbCBXb3JrYm9vaycpICYmICgkdGhpcy0+X2NhbGN1bGF0ZWRWYWx1ZSAhPT0gTlVMTCkpIHsKLy8JCQkJCWVjaG8gJ1JldHVybmluZyBmYWxsYmFjayB2YWx1ZSBvZiAnLiR0aGlzLT5fY2FsY3VsYXRlZFZhbHVlLicgZm9yIGNlbGwgJy4kdGhpcy0+Z2V0Q29vcmRpbmF0ZSgpLic8YnIgLz4nOwoJCQkJCXJldHVybiAkdGhpcy0+X2NhbGN1bGF0ZWRWYWx1ZTsgLy8gRmFsbGJhY2sgZm9yIGNhbGN1bGF0aW9ucyByZWZlcmVuY2luZyBleHRlcm5hbCBmaWxlcy4KCQkJCX0KLy8JCQkJZWNobyAnQ2FsY3VsYXRpb24gRXhjZXB0aW9uOiAnLiRleC0+Z2V0TWVzc2FnZSgpLic8YnIgLz4nOwoJCQkJJHJlc3VsdCA9ICcjTi9BJzsKCQkJCXRocm93KG5ldyBFeGNlcHRpb24oJHRoaXMtPmdldFBhcmVudCgpLT5nZXRUaXRsZSgpLichJy4kdGhpcy0+Z2V0Q29vcmRpbmF0ZSgpLicgLT4gJy4kZXgtPmdldE1lc3NhZ2UoKSkpOwoJCQl9CgoJCQlpZiAoJHJlc3VsdCA9PT0gJyNOb3QgWWV0IEltcGxlbWVudGVkJykgewovLwkJCQllY2hvICdSZXR1cm5pbmcgZmFsbGJhY2sgdmFsdWUgb2YgJy4kdGhpcy0+X2NhbGN1bGF0ZWRWYWx1ZS4nIGZvciBjZWxsICcuJHRoaXMtPmdldENvb3JkaW5hdGUoKS4nPGJyIC8+JzsKCQkJCXJldHVybiAkdGhpcy0+X2NhbGN1bGF0ZWRWYWx1ZTsgLy8gRmFsbGJhY2sgaWYgY2FsY3VsYXRpb24gZW5naW5lIGRvZXMgbm90IHN1cHBvcnQgdGhlIGZvcm11bGEuCgkJCX0KLy8JCQllY2hvICdSZXR1cm5pbmcgY2FsY3VsYXRlZCB2YWx1ZSBvZiAnLiRyZXN1bHQuJyBmb3IgY2VsbCAnLiR0aGlzLT5nZXRDb29yZGluYXRlKCkuJzxiciAvPic7CgkJCXJldHVybiAkcmVzdWx0OwoJCX0KCi8vCQlpZiAoJHRoaXMtPl92YWx1ZSA9PT0gTlVMTCkgewovLwkJCWVjaG8gJ0NlbGwgJy4kdGhpcy0+Z2V0Q29vcmRpbmF0ZSgpLicgaGFzIG5vIHZhbHVlLCBmb3JtdWxhIG9yIG90aGVyd2lzZTxiciAvPic7Ci8vCQkJcmV0dXJuIG51bGw7Ci8vCQl9Ci8vCQllY2hvICdDZWxsIHZhbHVlIGZvciAnLiR0aGlzLT5nZXRDb29yZGluYXRlKCkuJyBpcyBub3QgYSBmb3JtdWxhOiBSZXR1cm5pbmcgZGF0YSB2YWx1ZSBvZiAnLiR0aGlzLT5fdmFsdWUuJzxiciAvPic7CgkJcmV0dXJuICR0aGlzLT5fdmFsdWU7Cgl9CgoJLyoqCgkgKiBTZXQgY2FsY3VsYXRlZCB2YWx1ZSAodXNlZCBmb3IgY2FjaGluZykKCSAqCgkgKiBAcGFyYW0gbWl4ZWQgJHBWYWx1ZQlWYWx1ZQoJICogQHJldHVybiBQSFBFeGNlbF9DZWxsCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBzZXRDYWxjdWxhdGVkVmFsdWUoJHBWYWx1ZSA9IG51bGwpCgl7CgkJaWYgKCRwVmFsdWUgIT09IE5VTEwpIHsKCQkJJHRoaXMtPl9jYWxjdWxhdGVkVmFsdWUgPSAoaXNfbnVtZXJpYygkcFZhbHVlKSkgPyAoZmxvYXQpICRwVmFsdWUgOiAkcFZhbHVlOwoJCX0KCgkJcmV0dXJuICR0aGlzLT5ub3RpZnlDYWNoZUNvbnRyb2xsZXIoKTsKCX0KCgkvKioKCSAqIEdldCBvbGQgY2FsY3VsYXRlZCB2YWx1ZSAoY2FjaGVkKQoJICoKCSAqIEByZXR1cm4gbWl4ZWQKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldE9sZENhbGN1bGF0ZWRWYWx1ZSgpCgl7CgkJcmV0dXJuICR0aGlzLT5fY2FsY3VsYXRlZFZhbHVlOwoJfQoKCS8qKgoJICogR2V0IGNlbGwgZGF0YSB0eXBlCgkgKgoJICogQHJldHVybiBzdHJpbmcKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldERhdGFUeXBlKCkKCXsKCQlyZXR1cm4gJHRoaXMtPl9kYXRhVHlwZTsKCX0KCgkvKioKCSAqIFNldCBjZWxsIGRhdGEgdHlwZQoJICoKCSAqIEBwYXJhbSBzdHJpbmcgJHBEYXRhVHlwZQoJICogQHJldHVybiBQSFBFeGNlbF9DZWxsCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBzZXREYXRhVHlwZSgkcERhdGFUeXBlID0gUEhQRXhjZWxfQ2VsbF9EYXRhVHlwZTo6VFlQRV9TVFJJTkcpCgl7CgkJaWYgKCRwRGF0YVR5cGUgPT0gUEhQRXhjZWxfQ2VsbF9EYXRhVHlwZTo6VFlQRV9TVFJJTkcyKQoJCQkkcERhdGFUeXBlID0gUEhQRXhjZWxfQ2VsbF9EYXRhVHlwZTo6VFlQRV9TVFJJTkc7CgoJCSR0aGlzLT5fZGF0YVR5cGUgPSAkcERhdGFUeXBlOwoKCQlyZXR1cm4gJHRoaXMtPm5vdGlmeUNhY2hlQ29udHJvbGxlcigpOwoJfQoKCS8qKgoJICogSGFzIERhdGEgdmFsaWRhdGlvbj8KCSAqCgkgKiBAcmV0dXJuIGJvb2xlYW4KCSAqLwoJcHVibGljIGZ1bmN0aW9uIGhhc0RhdGFWYWxpZGF0aW9uKCkKCXsKCQlpZiAoIWlzc2V0KCR0aGlzLT5fcGFyZW50KSkgewoJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCdDYW5ub3QgY2hlY2sgZm9yIGRhdGEgdmFsaWRhdGlvbiB3aGVuIGNlbGwgaXMgbm90IGJvdW5kIHRvIGEgd29ya3NoZWV0Jyk7CgkJfQoKCQlyZXR1cm4gJHRoaXMtPl9wYXJlbnQtPmRhdGFWYWxpZGF0aW9uRXhpc3RzKCR0aGlzLT5nZXRDb29yZGluYXRlKCkpOwoJfQoKCS8qKgoJICogR2V0IERhdGEgdmFsaWRhdGlvbgoJICoKCSAqIEByZXR1cm4gUEhQRXhjZWxfQ2VsbF9EYXRhVmFsaWRhdGlvbgoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0RGF0YVZhbGlkYXRpb24oKQoJewoJCWlmICghaXNzZXQoJHRoaXMtPl9wYXJlbnQpKSB7CgkJCXRocm93IG5ldyBFeGNlcHRpb24oJ0Nhbm5vdCBnZXQgZGF0YSB2YWxpZGF0aW9uIGZvciBjZWxsIHRoYXQgaXMgbm90IGJvdW5kIHRvIGEgd29ya3NoZWV0Jyk7CgkJfQoKCQlyZXR1cm4gJHRoaXMtPl9wYXJlbnQtPmdldERhdGFWYWxpZGF0aW9uKCR0aGlzLT5nZXRDb29yZGluYXRlKCkpOwoJfQoKCS8qKgoJICogU2V0IERhdGEgdmFsaWRhdGlvbgoJICoKCSAqIEBwYXJhbQlQSFBFeGNlbF9DZWxsX0RhdGFWYWxpZGF0aW9uCSRwRGF0YVZhbGlkYXRpb24KCSAqIEB0aHJvd3MJRXhjZXB0aW9uCgkgKiBAcmV0dXJuIFBIUEV4Y2VsX0NlbGwKCSAqLwoJcHVibGljIGZ1bmN0aW9uIHNldERhdGFWYWxpZGF0aW9uKFBIUEV4Y2VsX0NlbGxfRGF0YVZhbGlkYXRpb24gJHBEYXRhVmFsaWRhdGlvbiA9IG51bGwpCgl7CgkJaWYgKCFpc3NldCgkdGhpcy0+X3BhcmVudCkpIHsKCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbignQ2Fubm90IHNldCBkYXRhIHZhbGlkYXRpb24gZm9yIGNlbGwgdGhhdCBpcyBub3QgYm91bmQgdG8gYSB3b3Jrc2hlZXQnKTsKCQl9CgoJCSR0aGlzLT5fcGFyZW50LT5zZXREYXRhVmFsaWRhdGlvbigkdGhpcy0+Z2V0Q29vcmRpbmF0ZSgpLCAkcERhdGFWYWxpZGF0aW9uKTsKCgkJcmV0dXJuICR0aGlzLT5ub3RpZnlDYWNoZUNvbnRyb2xsZXIoKTsKCX0KCgkvKioKCSAqIEhhcyBIeXBlcmxpbmsKCSAqCgkgKiBAcmV0dXJuIGJvb2xlYW4KCSAqLwoJcHVibGljIGZ1bmN0aW9uIGhhc0h5cGVybGluaygpCgl7CgkJaWYgKCFpc3NldCgkdGhpcy0+X3BhcmVudCkpIHsKCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbignQ2Fubm90IGNoZWNrIGZvciBoeXBlcmxpbmsgd2hlbiBjZWxsIGlzIG5vdCBib3VuZCB0byBhIHdvcmtzaGVldCcpOwoJCX0KCgkJcmV0dXJuICR0aGlzLT5fcGFyZW50LT5oeXBlcmxpbmtFeGlzdHMoJHRoaXMtPmdldENvb3JkaW5hdGUoKSk7Cgl9CgoJLyoqCgkgKiBHZXQgSHlwZXJsaW5rCgkgKgoJICogQHRocm93cyBFeGNlcHRpb24KCSAqIEByZXR1cm4gUEhQRXhjZWxfQ2VsbF9IeXBlcmxpbmsKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldEh5cGVybGluaygpCgl7CgkJaWYgKCFpc3NldCgkdGhpcy0+X3BhcmVudCkpIHsKCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbignQ2Fubm90IGdldCBoeXBlcmxpbmsgZm9yIGNlbGwgdGhhdCBpcyBub3QgYm91bmQgdG8gYSB3b3Jrc2hlZXQnKTsKCQl9CgoJCXJldHVybiAkdGhpcy0+X3BhcmVudC0+Z2V0SHlwZXJsaW5rKCR0aGlzLT5nZXRDb29yZGluYXRlKCkpOwoJfQoKCS8qKgoJICogU2V0IEh5cGVybGluawoJICoKCSAqIEBwYXJhbQlQSFBFeGNlbF9DZWxsX0h5cGVybGluawkkcEh5cGVybGluawoJICogQHRocm93cwlFeGNlcHRpb24KCSAqIEByZXR1cm4gUEhQRXhjZWxfQ2VsbAoJICovCglwdWJsaWMgZnVuY3Rpb24gc2V0SHlwZXJsaW5rKFBIUEV4Y2VsX0NlbGxfSHlwZXJsaW5rICRwSHlwZXJsaW5rID0gbnVsbCkKCXsKCQlpZiAoIWlzc2V0KCR0aGlzLT5fcGFyZW50KSkgewoJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCdDYW5ub3Qgc2V0IGh5cGVybGluayBmb3IgY2VsbCB0aGF0IGlzIG5vdCBib3VuZCB0byBhIHdvcmtzaGVldCcpOwoJCX0KCgkJJHRoaXMtPl9wYXJlbnQtPnNldEh5cGVybGluaygkdGhpcy0+Z2V0Q29vcmRpbmF0ZSgpLCAkcEh5cGVybGluayk7CgoJCXJldHVybiAkdGhpcy0+bm90aWZ5Q2FjaGVDb250cm9sbGVyKCk7Cgl9CgoJLyoqCgkgKiBHZXQgcGFyZW50CgkgKgoJICogQHJldHVybiBQSFBFeGNlbF9Xb3Jrc2hlZXQKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldFBhcmVudCgpIHsKCQlyZXR1cm4gJHRoaXMtPl9wYXJlbnQ7Cgl9CgoJLyoqCgkgKiBSZS1iaW5kIHBhcmVudAoJICoKCSAqIEBwYXJhbSBQSFBFeGNlbF9Xb3Jrc2hlZXQgJHBhcmVudAoJICogQHJldHVybiBQSFBFeGNlbF9DZWxsCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiByZWJpbmRQYXJlbnQoUEhQRXhjZWxfV29ya3NoZWV0ICRwYXJlbnQpIHsKCQkkdGhpcy0+X3BhcmVudCA9ICRwYXJlbnQ7CgoJCXJldHVybiAkdGhpcy0+bm90aWZ5Q2FjaGVDb250cm9sbGVyKCk7Cgl9CgoJLyoqCgkgKiBJcyBjZWxsIGluIGEgc3BlY2lmaWMgcmFuZ2U/CgkgKgoJICogQHBhcmFtCXN0cmluZwkkcFJhbmdlCQlDZWxsIHJhbmdlIChlLmcuIEExOkExKQoJICogQHJldHVybglib29sZWFuCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBpc0luUmFuZ2UoJHBSYW5nZSA9ICdBMTpBMScpCgl7CgkJbGlzdCgkcmFuZ2VTdGFydCwkcmFuZ2VFbmQpID0gUEhQRXhjZWxfQ2VsbDo6cmFuZ2VCb3VuZGFyaWVzKCRwUmFuZ2UpOwoKCQkvLyBUcmFuc2xhdGUgcHJvcGVydGllcwoJCSRteUNvbHVtbgk9IFBIUEV4Y2VsX0NlbGw6OmNvbHVtbkluZGV4RnJvbVN0cmluZygkdGhpcy0+Z2V0Q29sdW1uKCkpOwoJCSRteVJvdwkJPSAkdGhpcy0+Z2V0Um93KCk7CgoJCS8vIFZlcmlmeSBpZiBjZWxsIGlzIGluIHJhbmdlCgkJcmV0dXJuICgoJHJhbmdlU3RhcnRbMF0gPD0gJG15Q29sdW1uKSAmJiAoJHJhbmdlRW5kWzBdID49ICRteUNvbHVtbikgJiYKCQkJCSgkcmFuZ2VTdGFydFsxXSA8PSAkbXlSb3cpICYmICgkcmFuZ2VFbmRbMV0gPj0gJG15Um93KQoJCQkgICApOwoJfQoKCS8qKgoJICogQ29vcmRpbmF0ZSBmcm9tIHN0cmluZwoJICoKCSAqIEBwYXJhbQlzdHJpbmcJJHBDb29yZGluYXRlU3RyaW5nCgkgKiBAcmV0dXJuCWFycmF5CUFycmF5IGNvbnRhaW5pbmcgY29sdW1uIGFuZCByb3cgKGluZGV4ZXMgMCBhbmQgMSkKCSAqIEB0aHJvd3MJRXhjZXB0aW9uCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gY29vcmRpbmF0ZUZyb21TdHJpbmcoJHBDb29yZGluYXRlU3RyaW5nID0gJ0ExJykKCXsKCQlpZiAocHJlZ19tYXRjaCgiL14oWyRdP1tBLVpdezEsM30pKFskXT9cZHsxLDd9KSQvIiwgJHBDb29yZGluYXRlU3RyaW5nLCAkbWF0Y2hlcykpIHsKCQkJcmV0dXJuIGFycmF5KCRtYXRjaGVzWzFdLCRtYXRjaGVzWzJdKTsKCQl9IGVsc2VpZiAoKHN0cnBvcygkcENvb3JkaW5hdGVTdHJpbmcsJzonKSAhPT0gZmFsc2UpIHx8IChzdHJwb3MoJHBDb29yZGluYXRlU3RyaW5nLCcsJykgIT09IGZhbHNlKSkgewoJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCdDZWxsIGNvb3JkaW5hdGUgc3RyaW5nIGNhbiBub3QgYmUgYSByYW5nZSBvZiBjZWxscy4nKTsKCQl9IGVsc2VpZiAoJHBDb29yZGluYXRlU3RyaW5nID09ICcnKSB7CgkJCXRocm93IG5ldyBFeGNlcHRpb24oJ0NlbGwgY29vcmRpbmF0ZSBjYW4gbm90IGJlIHplcm8tbGVuZ3RoIHN0cmluZy4nKTsKCQl9IGVsc2UgewoJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCdJbnZhbGlkIGNlbGwgY29vcmRpbmF0ZSAnLiRwQ29vcmRpbmF0ZVN0cmluZyk7CgkJfQoJfQoKCS8qKgoJICogTWFrZSBzdHJpbmcgcm93LCBjb2x1bW4gb3IgY2VsbCBjb29yZGluYXRlIGFic29sdXRlCgkgKgoJICogQHBhcmFtCXN0cmluZwkkcENvb3JkaW5hdGVTdHJpbmcJCWUuZy4gJ0EnIG9yICcxJyBvciAnQTEnCgkgKiBAcmV0dXJuCXN0cmluZwlBYnNvbHV0ZSBjb29yZGluYXRlCQllLmcuICckQScgb3IgJyQxJyBvciAnJEEkMScKCSAqIEB0aHJvd3MJRXhjZXB0aW9uCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gYWJzb2x1dGVSZWZlcmVuY2UoJHBDb29yZGluYXRlU3RyaW5nID0gJ0ExJykKCXsKCQlpZiAoc3RycG9zKCRwQ29vcmRpbmF0ZVN0cmluZywnOicpID09PSBmYWxzZSAmJiBzdHJwb3MoJHBDb29yZGluYXRlU3RyaW5nLCcsJykgPT09IGZhbHNlKSB7CgkJCS8vIENyZWF0ZSBhYnNvbHV0ZSBjb29yZGluYXRlCgkJCWlmIChjdHlwZV9kaWdpdCgkcENvb3JkaW5hdGVTdHJpbmcpKSB7CgkJCQlyZXR1cm4gJyQnLiRwQ29vcmRpbmF0ZVN0cmluZzsKCQkJfSBlbHNlaWYgKGN0eXBlX2FscGhhKCRwQ29vcmRpbmF0ZVN0cmluZykpIHsKCQkJCXJldHVybiAnJCcuc3RydG91cHBlcigkcENvb3JkaW5hdGVTdHJpbmcpOwoJCQl9CgkJCXJldHVybiBzZWxmOjphYnNvbHV0ZUNvb3JkaW5hdGUoJHBDb29yZGluYXRlU3RyaW5nKTsKCQl9IGVsc2UgewoJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCJDb29yZGluYXRlIHN0cmluZyBzaG91bGQgbm90IGJlIGEgY2VsbCByYW5nZS4iKTsKCQl9Cgl9CgoJLyoqCgkgKiBNYWtlIHN0cmluZyBjb29yZGluYXRlIGFic29sdXRlCgkgKgoJICogQHBhcmFtCXN0cmluZwkkcENvb3JkaW5hdGVTdHJpbmcJCWUuZy4gJ0ExJwoJICogQHJldHVybglzdHJpbmcJQWJzb2x1dGUgY29vcmRpbmF0ZQkJZS5nLiAnJEEkMScKCSAqIEB0aHJvd3MJRXhjZXB0aW9uCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gYWJzb2x1dGVDb29yZGluYXRlKCRwQ29vcmRpbmF0ZVN0cmluZyA9ICdBMScpCgl7CgkJaWYgKHN0cnBvcygkcENvb3JkaW5hdGVTdHJpbmcsJzonKSA9PT0gZmFsc2UgJiYgc3RycG9zKCRwQ29vcmRpbmF0ZVN0cmluZywnLCcpID09PSBmYWxzZSkgewoJCQkvLyBDcmVhdGUgYWJzb2x1dGUgY29vcmRpbmF0ZQoJCQkkd29ya3NoZWV0ID0gJyc7CgkJCSRjZWxsQWRkcmVzcyA9IGV4cGxvZGUoJyEnLCRwQ29vcmRpbmF0ZVN0cmluZyk7CgkJCWlmIChjb3VudCgkY2VsbEFkZHJlc3MpID09IDIpIHsKCQkJCWxpc3QoJHdvcmtzaGVldCwkcENvb3JkaW5hdGVTdHJpbmcpID0gJGNlbGxBZGRyZXNzOwoJCQl9CgoJCQlsaXN0KCRjb2x1bW4sICRyb3cpID0gUEhQRXhjZWxfQ2VsbDo6Y29vcmRpbmF0ZUZyb21TdHJpbmcoJHBDb29yZGluYXRlU3RyaW5nKTsKCQkJaWYgKCRjb2x1bW5bMF0gPT0gJyQnKQkkY29sdW1uID0gc3Vic3RyKCRjb2x1bW4sMSk7CgkJCWlmICgkcm93WzBdID09ICckJykJCSRyb3cgPSBzdWJzdHIoJHJvdywxKTsKCQkJaWYgKCR3b3Jrc2hlZXQgPiAnJykKCQkJCSR3b3Jrc2hlZXQgLj0gJyEnOwoJCQlyZXR1cm4gJHdvcmtzaGVldCAuICckJyAuICRjb2x1bW4gLiAnJCcgLiAkcm93OwoJCX0gZWxzZSB7CgkJCXRocm93IG5ldyBFeGNlcHRpb24oIkNvb3JkaW5hdGUgc3RyaW5nIHNob3VsZCBub3QgYmUgYSBjZWxsIHJhbmdlLiIpOwoJCX0KCX0KCgkvKioKCSAqIFNwbGl0IHJhbmdlIGludG8gY29vcmRpbmF0ZSBzdHJpbmdzCgkgKgoJICogQHBhcmFtCXN0cmluZwkkcFJhbmdlCgkgKiBAcmV0dXJuCWFycmF5CUFycmF5IGNvbnRhaW5nIG9uZSBvciBtb3JlIGFycmF5cyBjb250YWluaW5nIG9uZSBvciB0d28gY29vcmRpbmF0ZSBzdHJpbmdzCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gc3BsaXRSYW5nZSgkcFJhbmdlID0gJ0ExOkExJykKCXsKCQkkZXhwbG9kZWQgPSBleHBsb2RlKCcsJywgJHBSYW5nZSk7CgkJJGNvdW50ZXIgPSBjb3VudCgkZXhwbG9kZWQpOwoJCWZvciAoJGkgPSAwOyAkaSA8ICRjb3VudGVyOyArKyRpKSB7CgkJCSRleHBsb2RlZFskaV0gPSBleHBsb2RlKCc6JywgJGV4cGxvZGVkWyRpXSk7CgkJfQoJCXJldHVybiAkZXhwbG9kZWQ7Cgl9CgoJLyoqCgkgKiBCdWlsZCByYW5nZSBmcm9tIGNvb3JkaW5hdGUgc3RyaW5ncwoJICoKCSAqIEBwYXJhbQlhcnJheQkkcFJhbmdlCUFycmF5IGNvbnRhaW5nIG9uZSBvciBtb3JlIGFycmF5cyBjb250YWluaW5nIG9uZSBvciB0d28gY29vcmRpbmF0ZSBzdHJpbmdzCgkgKiBAcmV0dXJuICBzdHJpbmcJU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mICRwUmFuZ2UKCSAqIEB0aHJvd3MJRXhjZXB0aW9uCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gYnVpbGRSYW5nZSgkcFJhbmdlKQoJewoJCS8vIFZlcmlmeSByYW5nZQoJCWlmICghaXNfYXJyYXkoJHBSYW5nZSkgfHwgZW1wdHkoJHBSYW5nZSkgfHwgIWlzX2FycmF5KCRwUmFuZ2VbMF0pKSB7CgkJCXRocm93IG5ldyBFeGNlcHRpb24oJ1JhbmdlIGRvZXMgbm90IGNvbnRhaW4gYW55IGluZm9ybWF0aW9uLicpOwoJCX0KCgkJLy8gQnVpbGQgcmFuZ2UKCQkkaW1wbG9kZWQgPSBhcnJheSgpOwoJCSRjb3VudGVyID0gY291bnQoJHBSYW5nZSk7CgkJZm9yICgkaSA9IDA7ICRpIDwgJGNvdW50ZXI7ICsrJGkpIHsKCQkJJHBSYW5nZVskaV0gPSBpbXBsb2RlKCc6JywgJHBSYW5nZVskaV0pOwoJCX0KCQkkaW1wbG9kZWQgPSBpbXBsb2RlKCcsJywgJHBSYW5nZSk7CgoJCXJldHVybiAkaW1wbG9kZWQ7Cgl9CgoJLyoqCgkgKiBDYWxjdWxhdGUgcmFuZ2UgYm91bmRhcmllcwoJICoKCSAqIEBwYXJhbQlzdHJpbmcJJHBSYW5nZQkJQ2VsbCByYW5nZSAoZS5nLiBBMTpBMSkKCSAqIEByZXR1cm4JYXJyYXkJUmFuZ2UgY29vcmRpbmF0ZXMgKFN0YXJ0IENlbGwsIEVuZCBDZWxsKSB3aGVyZSBTdGFydCBDZWxsIGFuZCBFbmQgQ2VsbCBhcmUgYXJyYXlzIChDb2x1bW4gTnVtYmVyLCBSb3cgTnVtYmVyKQoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHJhbmdlQm91bmRhcmllcygkcFJhbmdlID0gJ0ExOkExJykKCXsKCQkvLyBVcHBlcmNhc2UgY29vcmRpbmF0ZQoJCSRwUmFuZ2UgPSBzdHJ0b3VwcGVyKCRwUmFuZ2UpOwoKCQkvLyBFeHRyYWN0IHJhbmdlCgkJaWYgKHN0cnBvcygkcFJhbmdlLCAnOicpID09PSBmYWxzZSkgewoJCQkkcmFuZ2VBID0gJHJhbmdlQiA9ICRwUmFuZ2U7CgkJfSBlbHNlIHsKCQkJbGlzdCgkcmFuZ2VBLCAkcmFuZ2VCKSA9IGV4cGxvZGUoJzonLCAkcFJhbmdlKTsKCQl9CgoJCS8vIENhbGN1bGF0ZSByYW5nZSBvdXRlciBib3JkZXJzCgkJJHJhbmdlU3RhcnQgPSBQSFBFeGNlbF9DZWxsOjpjb29yZGluYXRlRnJvbVN0cmluZygkcmFuZ2VBKTsKCQkkcmFuZ2VFbmQJPSBQSFBFeGNlbF9DZWxsOjpjb29yZGluYXRlRnJvbVN0cmluZygkcmFuZ2VCKTsKCgkJLy8gVHJhbnNsYXRlIGNvbHVtbiBpbnRvIGluZGV4CgkJJHJhbmdlU3RhcnRbMF0JPSBQSFBFeGNlbF9DZWxsOjpjb2x1bW5JbmRleEZyb21TdHJpbmcoJHJhbmdlU3RhcnRbMF0pOwoJCSRyYW5nZUVuZFswXQk9IFBIUEV4Y2VsX0NlbGw6OmNvbHVtbkluZGV4RnJvbVN0cmluZygkcmFuZ2VFbmRbMF0pOwoKCQlyZXR1cm4gYXJyYXkoJHJhbmdlU3RhcnQsICRyYW5nZUVuZCk7Cgl9CgoJLyoqCgkgKiBDYWxjdWxhdGUgcmFuZ2UgZGltZW5zaW9uCgkgKgoJICogQHBhcmFtCXN0cmluZwkkcFJhbmdlCQlDZWxsIHJhbmdlIChlLmcuIEExOkExKQoJICogQHJldHVybglhcnJheQlSYW5nZSBkaW1lbnNpb24gKHdpZHRoLCBoZWlnaHQpCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gcmFuZ2VEaW1lbnNpb24oJHBSYW5nZSA9ICdBMTpBMScpCgl7CgkJLy8gQ2FsY3VsYXRlIHJhbmdlIG91dGVyIGJvcmRlcnMKCQlsaXN0KCRyYW5nZVN0YXJ0LCRyYW5nZUVuZCkgPSBQSFBFeGNlbF9DZWxsOjpyYW5nZUJvdW5kYXJpZXMoJHBSYW5nZSk7CgoJCXJldHVybiBhcnJheSggKCRyYW5nZUVuZFswXSAtICRyYW5nZVN0YXJ0WzBdICsgMSksICgkcmFuZ2VFbmRbMV0gLSAkcmFuZ2VTdGFydFsxXSArIDEpICk7Cgl9CgoJLyoqCgkgKiBDYWxjdWxhdGUgcmFuZ2UgYm91bmRhcmllcwoJICoKCSAqIEBwYXJhbQlzdHJpbmcJJHBSYW5nZQkJQ2VsbCByYW5nZSAoZS5nLiBBMTpBMSkKCSAqIEByZXR1cm4JYXJyYXkJUmFuZ2UgYm91bmRhcmllcyAoc3RhcmluZyBDb2x1bW4sIHN0YXJ0aW5nIFJvdywgRmluYWwgQ29sdW1uLCBGaW5hbCBSb3cpCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0UmFuZ2VCb3VuZGFyaWVzKCRwUmFuZ2UgPSAnQTE6QTEnKQoJewoJCS8vIFVwcGVyY2FzZSBjb29yZGluYXRlCgkJJHBSYW5nZSA9IHN0cnRvdXBwZXIoJHBSYW5nZSk7CgoJCS8vIEV4dHJhY3QgcmFuZ2UKCQlpZiAoc3RycG9zKCRwUmFuZ2UsICc6JykgPT09IGZhbHNlKSB7CgkJCSRyYW5nZUEgPSAkcmFuZ2VCID0gJHBSYW5nZTsKCQl9IGVsc2UgewoJCQlsaXN0KCRyYW5nZUEsICRyYW5nZUIpID0gZXhwbG9kZSgnOicsICRwUmFuZ2UpOwoJCX0KCgkJcmV0dXJuIGFycmF5KCBzZWxmOjpjb29yZGluYXRlRnJvbVN0cmluZygkcmFuZ2VBKSwgc2VsZjo6Y29vcmRpbmF0ZUZyb21TdHJpbmcoJHJhbmdlQikpOwoJfQoKCS8qKgoJICogQ29sdW1uIGluZGV4IGZyb20gc3RyaW5nCgkgKgoJICogQHBhcmFtCXN0cmluZyAkcFN0cmluZwoJICogQHJldHVybglpbnQgQ29sdW1uIGluZGV4IChiYXNlIDEgISEhKQoJICogQHRocm93cwlFeGNlcHRpb24KCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBjb2x1bW5JbmRleEZyb21TdHJpbmcoJHBTdHJpbmcgPSAnQScpCgl7CgkJLy8JVXNpbmcgYSBsb29rdXAgY2FjaGUgYWRkcyBhIHNsaWdodCBtZW1vcnkgb3ZlcmhlYWQsIGJ1dCBib29zdHMgc3BlZWQKCQkvLwljYWNoaW5nIHVzaW5nIGEgc3RhdGljIHdpdGhpbiB0aGUgbWV0aG9kIGlzIGZhc3RlciB0aGFuIGEgY2xhc3Mgc3RhdGljLAoJCS8vCQl0aG91Z2ggaXQncyBhZGRpdGlvbmFsIG1lbW9yeSBvdmVyaGVhZAoJCXN0YXRpYyAkX2luZGV4Q2FjaGUgPSBhcnJheSgpOwoKCQlpZiAoaXNzZXQoJF9pbmRleENhY2hlWyRwU3RyaW5nXSkpCgkJCXJldHVybiAkX2luZGV4Q2FjaGVbJHBTdHJpbmddOwoKCQkvLwlJdCdzIHN1cnByaXNpbmcgaG93IGNvc3RseSB0aGUgc3RydG91cHBlcigpIGFuZCBvcmQoKSBjYWxscyBhY3R1YWxseSBhcmUsIHNvIHdlIHVzZSBhIGxvb2t1cCBhcnJheSByYXRoZXIgdGhhbiB1c2Ugb3JkKCkKCQkvLwkJYW5kIG1ha2UgaXQgY2FzZSBpbnNlbnNpdGl2ZSB0byBnZXQgcmlkIG9mIHRoZSBzdHJ0b3VwcGVyKCkgYXMgd2VsbC4gQmVjYXVzZSBpdCdzIGEgc3RhdGljLCB0aGVyZSdzIG5vIHNpZ25pZmljYW50CgkJLy8JCW1lbW9yeSBvdmVyaGVhZCBlaXRoZXIKCQlzdGF0aWMgJF9jb2x1bW5Mb29rdXAgPSBhcnJheSgKCQkJJ0EnID0+IDEsICdCJyA9PiAyLCAnQycgPT4gMywgJ0QnID0+IDQsICdFJyA9PiA1LCAnRicgPT4gNiwgJ0cnID0+IDcsICdIJyA9PiA4LCAnSScgPT4gOSwgJ0onID0+IDEwLCAnSycgPT4gMTEsICdMJyA9PiAxMiwgJ00nID0+IDEzLAoJCQknTicgPT4gMTQsICdPJyA9PiAxNSwgJ1AnID0+IDE2LCAnUScgPT4gMTcsICdSJyA9PiAxOCwgJ1MnID0+IDE5LCAnVCcgPT4gMjAsICdVJyA9PiAyMSwgJ1YnID0+IDIyLCAnVycgPT4gMjMsICdYJyA9PiAyNCwgJ1knID0+IDI1LCAnWicgPT4gMjYsCgkJCSdhJyA9PiAxLCAnYicgPT4gMiwgJ2MnID0+IDMsICdkJyA9PiA0LCAnZScgPT4gNSwgJ2YnID0+IDYsICdnJyA9PiA3LCAnaCcgPT4gOCwgJ2knID0+IDksICdqJyA9PiAxMCwgJ2snID0+IDExLCAnbCcgPT4gMTIsICdtJyA9PiAxMywKCQkJJ24nID0+IDE0LCAnbycgPT4gMTUsICdwJyA9PiAxNiwgJ3EnID0+IDE3LCAncicgPT4gMTgsICdzJyA9PiAxOSwgJ3QnID0+IDIwLCAndScgPT4gMjEsICd2JyA9PiAyMiwgJ3cnID0+IDIzLCAneCcgPT4gMjQsICd5JyA9PiAyNSwgJ3onID0+IDI2CgkJKTsKCgkJLy8JV2UgYWxzbyB1c2UgdGhlIGxhbmd1YWdlIGNvbnN0cnVjdCBpc3NldCgpIHJhdGhlciB0aGFuIHRoZSBtb3JlIGNvc3RseSBzdHJsZW4oKSBmdW5jdGlvbiB0byBtYXRjaCB0aGUgbGVuZ3RoIG9mICRwU3RyaW5nCgkJLy8JCWZvciBpbXByb3ZlZCBwZXJmb3JtYW5jZQoJCWlmIChpc3NldCgkcFN0cmluZ3swfSkpIHsKCQkJaWYgKCFpc3NldCgkcFN0cmluZ3sxfSkpIHsKCQkJCSRfaW5kZXhDYWNoZVskcFN0cmluZ10gPSAkX2NvbHVtbkxvb2t1cFskcFN0cmluZ107CgkJCQlyZXR1cm4gJF9pbmRleENhY2hlWyRwU3RyaW5nXTsKCQkJfSBlbHNlaWYoIWlzc2V0KCRwU3RyaW5nezJ9KSkgewoJCQkJJF9pbmRleENhY2hlWyRwU3RyaW5nXSA9ICRfY29sdW1uTG9va3VwWyRwU3RyaW5nezB9XSAqIDI2ICsgJF9jb2x1bW5Mb29rdXBbJHBTdHJpbmd7MX1dOwoJCQkJcmV0dXJuICRfaW5kZXhDYWNoZVskcFN0cmluZ107CgkJCX0gZWxzZWlmKCFpc3NldCgkcFN0cmluZ3szfSkpIHsKCQkJCSRfaW5kZXhDYWNoZVskcFN0cmluZ10gPSAkX2NvbHVtbkxvb2t1cFskcFN0cmluZ3swfV0gKiA2NzYgKyAkX2NvbHVtbkxvb2t1cFskcFN0cmluZ3sxfV0gKiAyNiArICRfY29sdW1uTG9va3VwWyRwU3RyaW5nezJ9XTsKCQkJCXJldHVybiAkX2luZGV4Q2FjaGVbJHBTdHJpbmddOwoJCQl9CgkJfQoJCXRocm93IG5ldyBFeGNlcHRpb24oIkNvbHVtbiBzdHJpbmcgaW5kZXggY2FuIG5vdCBiZSAiIC4gKChpc3NldCgkcFN0cmluZ3swfSkpID8gImxvbmdlciB0aGFuIDMgY2hhcmFjdGVycyIgOiAiZW1wdHkiKSAuICIuIik7Cgl9CgoJLyoqCgkgKiBTdHJpbmcgZnJvbSBjb2x1bW5pbmRleAoJICoKCSAqIEBwYXJhbSBpbnQgJHBDb2x1bW5JbmRleCBDb2x1bW4gaW5kZXggKGJhc2UgMCAhISEpCgkgKiBAcmV0dXJuIHN0cmluZwoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHN0cmluZ0Zyb21Db2x1bW5JbmRleCgkcENvbHVtbkluZGV4ID0gMCkKCXsKCQkvLwlVc2luZyBhIGxvb2t1cCBjYWNoZSBhZGRzIGEgc2xpZ2h0IG1lbW9yeSBvdmVyaGVhZCwgYnV0IGJvb3N0cyBzcGVlZAoJCS8vCWNhY2hpbmcgdXNpbmcgYSBzdGF0aWMgd2l0aGluIHRoZSBtZXRob2QgaXMgZmFzdGVyIHRoYW4gYSBjbGFzcyBzdGF0aWMsCgkJLy8JCXRob3VnaCBpdCdzIGFkZGl0aW9uYWwgbWVtb3J5IG92ZXJoZWFkCgkJc3RhdGljICRfaW5kZXhDYWNoZSA9IGFycmF5KCk7CgoJCWlmICghaXNzZXQoJF9pbmRleENhY2hlWyRwQ29sdW1uSW5kZXhdKSkgewoJCQkvLyBEZXRlcm1pbmUgY29sdW1uIHN0cmluZwoJCQlpZiAoJHBDb2x1bW5JbmRleCA8IDI2KSB7CgkJCQkkX2luZGV4Q2FjaGVbJHBDb2x1bW5JbmRleF0gPSBjaHIoNjUgKyAkcENvbHVtbkluZGV4KTsKCQkJfSBlbHNlaWYgKCRwQ29sdW1uSW5kZXggPCA3MDIpIHsKCQkJCSRfaW5kZXhDYWNoZVskcENvbHVtbkluZGV4XSA9IGNocig2NCArICgkcENvbHVtbkluZGV4IC8gMjYpKSAuCgkJCQkJCQkJCQkJICBjaHIoNjUgKyAkcENvbHVtbkluZGV4ICUgMjYpOwoJCQl9IGVsc2UgewoJCQkJJF9pbmRleENhY2hlWyRwQ29sdW1uSW5kZXhdID0gY2hyKDY0ICsgKCgkcENvbHVtbkluZGV4IC0gMjYpIC8gNjc2KSkgLgoJCQkJCQkJCQkJCSAgY2hyKDY1ICsgKCgoJHBDb2x1bW5JbmRleCAtIDI2KSAlIDY3NikgLyAyNikpIC4KCQkJCQkJCQkJCQkgIGNocig2NSArICRwQ29sdW1uSW5kZXggJSAyNik7CgkJCX0KCQl9CgkJcmV0dXJuICRfaW5kZXhDYWNoZVskcENvbHVtbkluZGV4XTsKCX0KCgkvKioKCSAqIEV4dHJhY3QgYWxsIGNlbGwgcmVmZXJlbmNlcyBpbiByYW5nZQoJICoKCSAqIEBwYXJhbQlzdHJpbmcJJHBSYW5nZQkJUmFuZ2UgKGUuZy4gQTEgb3IgQTE6QTEwIG9yIEExOkExMCBBMTAwOkExMDAwKQoJICogQHJldHVybglhcnJheQlBcnJheSBjb250YWluaW5nIHNpbmdsZSBjZWxsIHJlZmVyZW5jZXMKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBleHRyYWN0QWxsQ2VsbFJlZmVyZW5jZXNJblJhbmdlKCRwUmFuZ2UgPSAnQTEnKSB7CgkJLy8gUmV0dXJudmFsdWUKCQkkcmV0dXJuVmFsdWUgPSBhcnJheSgpOwoKCQkvLyBFeHBsb2RlIHNwYWNlcwoJCSRjZWxsQmxvY2tzID0gZXhwbG9kZSgnICcsIHN0cl9yZXBsYWNlKCckJywgJycsIHN0cnRvdXBwZXIoJHBSYW5nZSkpKTsKCQlmb3JlYWNoICgkY2VsbEJsb2NrcyBhcyAkY2VsbEJsb2NrKSB7CgkJCS8vIFNpbmdsZSBjZWxsPwoJCQlpZiAoc3RycG9zKCRjZWxsQmxvY2ssJzonKSA9PT0gZmFsc2UgJiYgc3RycG9zKCRjZWxsQmxvY2ssJywnKSA9PT0gZmFsc2UpIHsKCQkJCSRyZXR1cm5WYWx1ZVtdID0gJGNlbGxCbG9jazsKCQkJCWNvbnRpbnVlOwoJCQl9CgoJCQkvLyBSYW5nZS4uLgoJCQkkcmFuZ2VzID0gUEhQRXhjZWxfQ2VsbDo6c3BsaXRSYW5nZSgkY2VsbEJsb2NrKTsKCQkJZm9yZWFjaCgkcmFuZ2VzIGFzICRyYW5nZSkgewoJCQkJLy8gU2luZ2xlIGNlbGw/CgkJCQlpZiAoIWlzc2V0KCRyYW5nZVsxXSkpIHsKCQkJCQkkcmV0dXJuVmFsdWVbXSA9ICRyYW5nZVswXTsKCQkJCQljb250aW51ZTsKCQkJCX0KCgkJCQkvLyBSYW5nZS4uLgoJCQkJbGlzdCgkcmFuZ2VTdGFydCwgJHJhbmdlRW5kKQk9ICRyYW5nZTsKCQkJCWxpc3QoJHN0YXJ0Q29sLCAkc3RhcnRSb3cpCT0gc3NjYW5mKCRyYW5nZVN0YXJ0LCclW0EtWl0lZCcpOwoJCQkJbGlzdCgkZW5kQ29sLCAkZW5kUm93KQkJPSBzc2NhbmYoJHJhbmdlRW5kLCclW0EtWl0lZCcpOwoJCQkJJGVuZENvbCsrOwoKCQkJCS8vIEN1cnJlbnQgZGF0YQoJCQkJJGN1cnJlbnRDb2wJPSAkc3RhcnRDb2w7CgkJCQkkY3VycmVudFJvdwk9ICRzdGFydFJvdzsKCgkJCQkvLyBMb29wIGNlbGxzCgkJCQl3aGlsZSAoJGN1cnJlbnRDb2wgIT0gJGVuZENvbCkgewoJCQkJCXdoaWxlICgkY3VycmVudFJvdyA8PSAkZW5kUm93KSB7CgkJCQkJCSRyZXR1cm5WYWx1ZVtdID0gJGN1cnJlbnRDb2wuJGN1cnJlbnRSb3c7CgkJCQkJCSsrJGN1cnJlbnRSb3c7CgkJCQkJfQoJCQkJCSsrJGN1cnJlbnRDb2w7CgkJCQkJJGN1cnJlbnRSb3cgPSAkc3RhcnRSb3c7CgkJCQl9CgkJCX0KCQl9CgoJCS8vIFJldHVybiB2YWx1ZQoJCXJldHVybiAkcmV0dXJuVmFsdWU7Cgl9CgoJLyoqCgkgKiBDb21wYXJlIDIgY2VsbHMKCSAqCgkgKiBAcGFyYW0JUEhQRXhjZWxfQ2VsbAkkYQlDZWxsIGEKCSAqIEBwYXJhbQlQSFBFeGNlbF9DZWxsCSRhCUNlbGwgYgoJICogQHJldHVybglpbnQJCVJlc3VsdCBvZiBjb21wYXJpc29uIChhbHdheXMgLTEgb3IgMSwgbmV2ZXIgemVybyEpCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gY29tcGFyZUNlbGxzKFBIUEV4Y2VsX0NlbGwgJGEsIFBIUEV4Y2VsX0NlbGwgJGIpCgl7CgkJaWYgKCRhLT5fcm93IDwgJGItPl9yb3cpIHsKCQkJcmV0dXJuIC0xOwoJCX0gZWxzZWlmICgkYS0+X3JvdyA+ICRiLT5fcm93KSB7CgkJCXJldHVybiAxOwoJCX0gZWxzZWlmIChQSFBFeGNlbF9DZWxsOjpjb2x1bW5JbmRleEZyb21TdHJpbmcoJGEtPl9jb2x1bW4pIDwgUEhQRXhjZWxfQ2VsbDo6Y29sdW1uSW5kZXhGcm9tU3RyaW5nKCRiLT5fY29sdW1uKSkgewoJCQlyZXR1cm4gLTE7CgkJfSBlbHNlIHsKCQkJcmV0dXJuIDE7CgkJfQoJfQoKCS8qKgoJICogR2V0IHZhbHVlIGJpbmRlciB0byB1c2UKCSAqCgkgKiBAcmV0dXJuIFBIUEV4Y2VsX0NlbGxfSVZhbHVlQmluZGVyCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0VmFsdWVCaW5kZXIoKSB7CgkJaWYgKHNlbGY6OiRfdmFsdWVCaW5kZXIgPT09IE5VTEwpIHsKCQkJc2VsZjo6JF92YWx1ZUJpbmRlciA9IG5ldyBQSFBFeGNlbF9DZWxsX0RlZmF1bHRWYWx1ZUJpbmRlcigpOwoJCX0KCgkJcmV0dXJuIHNlbGY6OiRfdmFsdWVCaW5kZXI7Cgl9CgoJLyoqCgkgKiBTZXQgdmFsdWUgYmluZGVyIHRvIHVzZQoJICoKCSAqIEBwYXJhbSBQSFBFeGNlbF9DZWxsX0lWYWx1ZUJpbmRlciAkYmluZGVyCgkgKiBAdGhyb3dzIEV4Y2VwdGlvbgoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHNldFZhbHVlQmluZGVyKFBIUEV4Y2VsX0NlbGxfSVZhbHVlQmluZGVyICRiaW5kZXIgPSBudWxsKSB7CgkJaWYgKCRiaW5kZXIgPT09IE5VTEwpIHsKCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbigiQSBQSFBFeGNlbF9DZWxsX0lWYWx1ZUJpbmRlciBpcyByZXF1aXJlZCBmb3IgUEhQRXhjZWwgdG8gZnVuY3Rpb24gY29ycmVjdGx5LiIpOwoJCX0KCgkJc2VsZjo6JF92YWx1ZUJpbmRlciA9ICRiaW5kZXI7Cgl9CgoJLyoqCgkgKiBJbXBsZW1lbnQgUEhQIF9fY2xvbmUgdG8gY3JlYXRlIGEgZGVlcCBjbG9uZSwgbm90IGp1c3QgYSBzaGFsbG93IGNvcHkuCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBfX2Nsb25lKCkgewoJCSR2YXJzID0gZ2V0X29iamVjdF92YXJzKCR0aGlzKTsKCQlmb3JlYWNoICgkdmFycyBhcyAka2V5ID0+ICR2YWx1ZSkgewoJCQlpZiAoKGlzX29iamVjdCgkdmFsdWUpKSAmJiAoJGtleSAhPSAnX3BhcmVudCcpKSB7CgkJCQkkdGhpcy0+JGtleSA9IGNsb25lICR2YWx1ZTsKCQkJfSBlbHNlIHsKCQkJCSR0aGlzLT4ka2V5ID0gJHZhbHVlOwoJCQl9CgkJfQoJfQoKCS8qKgoJICogR2V0IGluZGV4IHRvIGNlbGxYZgoJICoKCSAqIEByZXR1cm4gaW50CgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRYZkluZGV4KCkKCXsKCQlyZXR1cm4gJHRoaXMtPl94ZkluZGV4OwoJfQoKCS8qKgoJICogU2V0IGluZGV4IHRvIGNlbGxYZgoJICoKCSAqIEBwYXJhbSBpbnQgJHBWYWx1ZQoJICogQHJldHVybiBQSFBFeGNlbF9DZWxsCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBzZXRYZkluZGV4KCRwVmFsdWUgPSAwKQoJewoJCSR0aGlzLT5feGZJbmRleCA9ICRwVmFsdWU7CgoJCXJldHVybiAkdGhpcy0+bm90aWZ5Q2FjaGVDb250cm9sbGVyKCk7Cgl9CgoKCXB1YmxpYyBmdW5jdGlvbiBzZXRGb3JtdWxhQXR0cmlidXRlcygkcEF0dHJpYnV0ZXMpCgl7CgkJJHRoaXMtPl9mb3JtdWxhQXR0cmlidXRlcyA9ICRwQXR0cmlidXRlczsKCQlyZXR1cm4gJHRoaXM7Cgl9CgoJcHVibGljIGZ1bmN0aW9uIGdldEZvcm11bGFBdHRyaWJ1dGVzKCkKCXsKCQlyZXR1cm4gJHRoaXMtPl9mb3JtdWxhQXR0cmlidXRlczsKCX0KCn0KCg==]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Cell/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Cell/AdvancedValueBinder.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIFBIUEV4Y2VsCiAqCiAqIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICoKICogQGNhdGVnb3J5ICAgUEhQRXhjZWwKICogQHBhY2thZ2UgICAgUEhQRXhjZWxfQ2VsbAogKiBAY29weXJpZ2h0ICBDb3B5cmlnaHQgKGMpIDIwMDYgLSAyMDEyIFBIUEV4Y2VsIChodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9QSFBFeGNlbCkKICogQGxpY2Vuc2UgICAgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL29sZC1saWNlbnNlcy9sZ3BsLTIuMS50eHQJTEdQTAogKiBAdmVyc2lvbiAgICAxLjcuNywgMjAxMi0wNS0xOQogKi8KCgovKiogUEhQRXhjZWwgcm9vdCBkaXJlY3RvcnkgKi8KaWYgKCFkZWZpbmVkKCdQSFBFWENFTF9ST09UJykpIHsKCS8qKgoJICogQGlnbm9yZQoJICovCglkZWZpbmUoJ1BIUEVYQ0VMX1JPT1QnLCBkaXJuYW1lKF9fRklMRV9fKSAuICcvLi4vLi4vJyk7CglyZXF1aXJlKFBIUEVYQ0VMX1JPT1QgLiAnUEhQRXhjZWwvQXV0b2xvYWRlci5waHAnKTsKfQoKCi8qKgogKiBQSFBFeGNlbF9DZWxsX0FkdmFuY2VkVmFsdWVCaW5kZXIKICoKICogQGNhdGVnb3J5ICAgUEhQRXhjZWwKICogQHBhY2thZ2UgICAgUEhQRXhjZWxfQ2VsbAogKiBAY29weXJpZ2h0ICBDb3B5cmlnaHQgKGMpIDIwMDYgLSAyMDEyIFBIUEV4Y2VsIChodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9QSFBFeGNlbCkKICovCmNsYXNzIFBIUEV4Y2VsX0NlbGxfQWR2YW5jZWRWYWx1ZUJpbmRlciBleHRlbmRzIFBIUEV4Y2VsX0NlbGxfRGVmYXVsdFZhbHVlQmluZGVyIGltcGxlbWVudHMgUEhQRXhjZWxfQ2VsbF9JVmFsdWVCaW5kZXIKewoJLyoqCgkgKiBCaW5kIHZhbHVlIHRvIGEgY2VsbAoJICoKCSAqIEBwYXJhbSBQSFBFeGNlbF9DZWxsICRjZWxsCUNlbGwgdG8gYmluZCB2YWx1ZSB0bwoJICogQHBhcmFtIG1peGVkICR2YWx1ZQkJCVZhbHVlIHRvIGJpbmQgaW4gY2VsbAoJICogQHJldHVybiBib29sZWFuCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBiaW5kVmFsdWUoUEhQRXhjZWxfQ2VsbCAkY2VsbCwgJHZhbHVlID0gbnVsbCkKCXsKCQkvLyBzYW5pdGl6ZSBVVEYtOCBzdHJpbmdzCgkJaWYgKGlzX3N0cmluZygkdmFsdWUpKSB7CgkJCSR2YWx1ZSA9IFBIUEV4Y2VsX1NoYXJlZF9TdHJpbmc6OlNhbml0aXplVVRGOCgkdmFsdWUpOwoJCX0KCgkJLy8gRmluZCBvdXQgZGF0YSB0eXBlCgkJJGRhdGFUeXBlID0gcGFyZW50OjpkYXRhVHlwZUZvclZhbHVlKCR2YWx1ZSk7CgoJCS8vIFN0eWxlIGxvZ2ljIC0gc3RyaW5ncwoJCWlmICgkZGF0YVR5cGUgPT09IFBIUEV4Y2VsX0NlbGxfRGF0YVR5cGU6OlRZUEVfU1RSSU5HICYmICEkdmFsdWUgaW5zdGFuY2VvZiBQSFBFeGNlbF9SaWNoVGV4dCkgewoJCQkvLwlUZXN0IGZvciBib29sZWFucyB1c2luZyBsb2NhbGUtc2V0dGluZwoJCQlpZiAoJHZhbHVlID09IFBIUEV4Y2VsX0NhbGN1bGF0aW9uOjpnZXRUUlVFKCkpIHsKCQkJCSRjZWxsLT5zZXRWYWx1ZUV4cGxpY2l0KCBUcnVlLCBQSFBFeGNlbF9DZWxsX0RhdGFUeXBlOjpUWVBFX0JPT0wpOwoJCQkJcmV0dXJuIHRydWU7CgkJCX0gZWxzZWlmKCR2YWx1ZSA9PSBQSFBFeGNlbF9DYWxjdWxhdGlvbjo6Z2V0RkFMU0UoKSkgewoJCQkJJGNlbGwtPnNldFZhbHVlRXhwbGljaXQoIEZhbHNlLCBQSFBFeGNlbF9DZWxsX0RhdGFUeXBlOjpUWVBFX0JPT0wpOwoJCQkJcmV0dXJuIHRydWU7CgkJCX0KCgkJCS8vIENoZWNrIGZvciBudW1iZXIgaW4gc2NpZW50aWZpYyBmb3JtYXQKCQkJaWYgKHByZWdfbWF0Y2goJy9eJy5QSFBFeGNlbF9DYWxjdWxhdGlvbjo6Q0FMQ1VMQVRJT05fUkVHRVhQX05VTUJFUi4nJC8nLCAkdmFsdWUpKSB7CgkJCQkkY2VsbC0+c2V0VmFsdWVFeHBsaWNpdCggKGZsb2F0KSAkdmFsdWUsIFBIUEV4Y2VsX0NlbGxfRGF0YVR5cGU6OlRZUEVfTlVNRVJJQyk7CgkJCQlyZXR1cm4gdHJ1ZTsKCQkJfQoKCQkJLy8gQ2hlY2sgZm9yIHBlcmNlbnRhZ2UKCQkJaWYgKHByZWdfbWF0Y2goJy9eXC0/WzAtOV0qXC4/WzAtOV0qXHM/XCUkLycsICR2YWx1ZSkpIHsKCQkJCS8vIENvbnZlcnQgdmFsdWUgdG8gbnVtYmVyCgkJCQkkY2VsbC0+c2V0VmFsdWVFeHBsaWNpdCggKGZsb2F0KXN0cl9yZXBsYWNlKCclJywgJycsICR2YWx1ZSkgLyAxMDAsIFBIUEV4Y2VsX0NlbGxfRGF0YVR5cGU6OlRZUEVfTlVNRVJJQyk7CgkJCQkvLyBTZXQgc3R5bGUKCQkJCSRjZWxsLT5nZXRQYXJlbnQoKS0+Z2V0U3R5bGUoICRjZWxsLT5nZXRDb29yZGluYXRlKCkgKS0+Z2V0TnVtYmVyRm9ybWF0KCktPnNldEZvcm1hdENvZGUoIFBIUEV4Y2VsX1N0eWxlX051bWJlckZvcm1hdDo6Rk9STUFUX1BFUkNFTlRBR0UgKTsKCQkJCXJldHVybiB0cnVlOwoJCQl9CgoJCQkvLyBDaGVjayBmb3IgdGltZSB3aXRob3V0IHNlY29uZHMgZS5nLiAnOTo0NScsICcwOTo0NScKCQkJaWYgKHByZWdfbWF0Y2goJy9eKFxkfFswLTFdXGR8MlswLTNdKTpbMC01XVxkJC8nLCAkdmFsdWUpKSB7CgkJCQlsaXN0KCRoLCAkbSkgPSBleHBsb2RlKCc6JywgJHZhbHVlKTsKCQkJCSRkYXlzID0gJGggLyAyNCArICRtIC8gMTQ0MDsKCQkJCS8vIENvbnZlcnQgdmFsdWUgdG8gbnVtYmVyCgkJCQkkY2VsbC0+c2V0VmFsdWVFeHBsaWNpdCgkZGF5cywgUEhQRXhjZWxfQ2VsbF9EYXRhVHlwZTo6VFlQRV9OVU1FUklDKTsKCQkJCS8vIFNldCBzdHlsZQoJCQkJJGNlbGwtPmdldFBhcmVudCgpLT5nZXRTdHlsZSggJGNlbGwtPmdldENvb3JkaW5hdGUoKSApLT5nZXROdW1iZXJGb3JtYXQoKS0+c2V0Rm9ybWF0Q29kZSggUEhQRXhjZWxfU3R5bGVfTnVtYmVyRm9ybWF0OjpGT1JNQVRfREFURV9USU1FMyApOwoJCQkJcmV0dXJuIHRydWU7CgkJCX0KCgkJCS8vIENoZWNrIGZvciB0aW1lIHdpdGggc2Vjb25kcyAnOTo0NTo1OScsICcwOTo0NTo1OScKCQkJaWYgKHByZWdfbWF0Y2goJy9eKFxkfFswLTFdXGR8MlswLTNdKTpbMC01XVxkOlswLTVdXGQkLycsICR2YWx1ZSkpIHsKCQkJCWxpc3QoJGgsICRtLCAkcykgPSBleHBsb2RlKCc6JywgJHZhbHVlKTsKCQkJCSRkYXlzID0gJGggLyAyNCArICRtIC8gMTQ0MCArICRzIC8gODY0MDA7CgkJCQkvLyBDb252ZXJ0IHZhbHVlIHRvIG51bWJlcgoJCQkJJGNlbGwtPnNldFZhbHVlRXhwbGljaXQoJGRheXMsIFBIUEV4Y2VsX0NlbGxfRGF0YVR5cGU6OlRZUEVfTlVNRVJJQyk7CgkJCQkvLyBTZXQgc3R5bGUKCQkJCSRjZWxsLT5nZXRQYXJlbnQoKS0+Z2V0U3R5bGUoICRjZWxsLT5nZXRDb29yZGluYXRlKCkgKS0+Z2V0TnVtYmVyRm9ybWF0KCktPnNldEZvcm1hdENvZGUoIFBIUEV4Y2VsX1N0eWxlX051bWJlckZvcm1hdDo6Rk9STUFUX0RBVEVfVElNRTQgKTsKCQkJCXJldHVybiB0cnVlOwoJCQl9CgoJCQkvLyBDaGVjayBmb3IgZGF0ZXRpbWUsIGUuZy4gJzIwMDgtMTItMzEnLCAnMjAwOC0xMi0zMSAxNTo1OScsICcyMDA4LTEyLTMxIDE1OjU5OjEwJwoJCQlpZiAoKCRkID0gUEhQRXhjZWxfU2hhcmVkX0RhdGU6OnN0cmluZ1RvRXhjZWwoJHZhbHVlKSkgIT09IGZhbHNlKSB7CgkJCQkvLyBDb252ZXJ0IHZhbHVlIHRvIG51bWJlcgoJCQkJJGNlbGwtPnNldFZhbHVlRXhwbGljaXQoJGQsIFBIUEV4Y2VsX0NlbGxfRGF0YVR5cGU6OlRZUEVfTlVNRVJJQyk7CgkJCQkvLyBEZXRlcm1pbmUgc3R5bGUuIEVpdGhlciB0aGVyZSBpcyBhIHRpbWUgcGFydCBvciBub3QuIExvb2sgZm9yICc6JwoJCQkJaWYgKHN0cnBvcygkdmFsdWUsICc6JykgIT09IGZhbHNlKSB7CgkJCQkJJGZvcm1hdENvZGUgPSAneXl5eS1tbS1kZCBoOm1tJzsKCQkJCX0gZWxzZSB7CgkJCQkJJGZvcm1hdENvZGUgPSAneXl5eS1tbS1kZCc7CgkJCQl9CgkJCQkkY2VsbC0+Z2V0UGFyZW50KCktPmdldFN0eWxlKCAkY2VsbC0+Z2V0Q29vcmRpbmF0ZSgpICktPmdldE51bWJlckZvcm1hdCgpLT5zZXRGb3JtYXRDb2RlKCRmb3JtYXRDb2RlKTsKCQkJCXJldHVybiB0cnVlOwoJCQl9CgoJCQkvLyBDaGVjayBmb3IgbmV3bGluZSBjaGFyYWN0ZXIgIlxuIgoJCQlpZiAoc3RycG9zKCR2YWx1ZSwgIlxuIikgIT09IGZhbHNlKSB7CgkJCQkkdmFsdWUgPSBQSFBFeGNlbF9TaGFyZWRfU3RyaW5nOjpTYW5pdGl6ZVVURjgoJHZhbHVlKTsKCQkJCSRjZWxsLT5zZXRWYWx1ZUV4cGxpY2l0KCR2YWx1ZSwgUEhQRXhjZWxfQ2VsbF9EYXRhVHlwZTo6VFlQRV9TVFJJTkcpOwoJCQkJLy8gU2V0IHN0eWxlCgkJCQkkY2VsbC0+Z2V0UGFyZW50KCktPmdldFN0eWxlKCAkY2VsbC0+Z2V0Q29vcmRpbmF0ZSgpICktPmdldEFsaWdubWVudCgpLT5zZXRXcmFwVGV4dCh0cnVlKTsKCQkJCXJldHVybiB0cnVlOwoJCQl9CgkJfQoKCQkvLyBOb3QgYm91bmQgeWV0PyBVc2UgcGFyZW50Li4uCgkJcmV0dXJuIHBhcmVudDo6YmluZFZhbHVlKCRjZWxsLCAkdmFsdWUpOwoJfQp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Cell/DataType.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIFBIUEV4Y2VsCiAqCiAqIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICoKICogQGNhdGVnb3J5ICAgUEhQRXhjZWwKICogQHBhY2thZ2UgICAgUEhQRXhjZWxfQ2VsbAogKiBAY29weXJpZ2h0ICBDb3B5cmlnaHQgKGMpIDIwMDYgLSAyMDEyIFBIUEV4Y2VsIChodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9QSFBFeGNlbCkKICogQGxpY2Vuc2UgICAgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL29sZC1saWNlbnNlcy9sZ3BsLTIuMS50eHQJTEdQTAogKiBAdmVyc2lvbiAgICAxLjcuNywgMjAxMi0wNS0xOQogKi8KCgovKioKICogUEhQRXhjZWxfQ2VsbF9EYXRhVHlwZQogKgogKiBAY2F0ZWdvcnkgICBQSFBFeGNlbAogKiBAcGFja2FnZSAgICBQSFBFeGNlbF9DZWxsCiAqIEBjb3B5cmlnaHQgIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwgKGh0dHA6Ly93d3cuY29kZXBsZXguY29tL1BIUEV4Y2VsKQogKi8KY2xhc3MgUEhQRXhjZWxfQ2VsbF9EYXRhVHlwZQp7CgkvKiBEYXRhIHR5cGVzICovCgljb25zdCBUWVBFX1NUUklORzIJCT0gJ3N0cic7Cgljb25zdCBUWVBFX1NUUklORwkJPSAncyc7Cgljb25zdCBUWVBFX0ZPUk1VTEEJCT0gJ2YnOwoJY29uc3QgVFlQRV9OVU1FUklDCQk9ICduJzsKCWNvbnN0IFRZUEVfQk9PTAkJCT0gJ2InOwogICAgY29uc3QgVFlQRV9OVUxMCQkJPSAnbnVsbCc7CiAgICBjb25zdCBUWVBFX0lOTElORQkJPSAnaW5saW5lU3RyJzsKCWNvbnN0IFRZUEVfRVJST1IJCT0gJ2UnOwoKCS8qKgoJICogTGlzdCBvZiBlcnJvciBjb2RlcwoJICoKCSAqIEB2YXIgYXJyYXkKCSAqLwoJcHJpdmF0ZSBzdGF0aWMgJF9lcnJvckNvZGVzCT0gYXJyYXkoJyNOVUxMIScgPT4gMCwgJyNESVYvMCEnID0+IDEsICcjVkFMVUUhJyA9PiAyLCAnI1JFRiEnID0+IDMsICcjTkFNRT8nID0+IDQsICcjTlVNIScgPT4gNSwgJyNOL0EnID0+IDYpOwoKCS8qKgoJICogR2V0IGxpc3Qgb2YgZXJyb3IgY29kZXMKCSAqCgkgKiBAcmV0dXJuIGFycmF5CgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0RXJyb3JDb2RlcygpIHsKCQlyZXR1cm4gc2VsZjo6JF9lcnJvckNvZGVzOwoJfQoKCS8qKgoJICogRGF0YVR5cGUgZm9yIHZhbHVlCgkgKgoJICogQGRlcHJlY2F0ZWQgUmVwbGFjZWQgYnkgUEhQRXhjZWxfQ2VsbF9JVmFsdWVCaW5kZXIgaW5mcmFzdHJ1Y3R1cmUKCSAqIEBwYXJhbQltaXhlZCAJJHBWYWx1ZQoJICogQHJldHVybiAJaW50CgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZGF0YVR5cGVGb3JWYWx1ZSgkcFZhbHVlID0gbnVsbCkgewoJCXJldHVybiBQSFBFeGNlbF9DZWxsX0RlZmF1bHRWYWx1ZUJpbmRlcjo6ZGF0YVR5cGVGb3JWYWx1ZSgkcFZhbHVlKTsKCX0KCgkvKioKCSAqIENoZWNrIGEgc3RyaW5nIHRoYXQgaXQgc2F0aXNmaWVzIEV4Y2VsIHJlcXVpcmVtZW50cwoJICoKCSAqIEBwYXJhbSBtaXhlZCBWYWx1ZSB0byBzYW5pdGl6ZSB0byBhbiBFeGNlbCBzdHJpbmcKCSAqIEByZXR1cm4gbWl4ZWQgU2FuaXRpemVkIHZhbHVlCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gY2hlY2tTdHJpbmcoJHBWYWx1ZSA9IG51bGwpCgl7CgkJaWYgKCRwVmFsdWUgaW5zdGFuY2VvZiBQSFBFeGNlbF9SaWNoVGV4dCkgewoJCQkvLyBUT0RPOiBTYW5pdGl6ZSBSaWNoLVRleHQgc3RyaW5nIChtYXguIGNoYXJhY3RlciBjb3VudCBpcyAzMiw3NjcpCgkJCXJldHVybiAkcFZhbHVlOwoJCX0KCgkJLy8gc3RyaW5nIG11c3QgbmV2ZXIgYmUgbG9uZ2VyIHRoYW4gMzIsNzY3IGNoYXJhY3RlcnMsIHRydW5jYXRlIGlmIG5lY2Vzc2FyeQoJCSRwVmFsdWUgPSBQSFBFeGNlbF9TaGFyZWRfU3RyaW5nOjpTdWJzdHJpbmcoJHBWYWx1ZSwgMCwgMzI3NjcpOwoKCQkvLyB3ZSByZXF1aXJlIHRoYXQgbmV3bGluZSBpcyByZXByZXNlbnRlZCBhcyAiXG4iIGluIGNvcmUsIG5vdCBhcyAiXHJcbiIgb3IgIlxyIgoJCSRwVmFsdWUgPSBzdHJfcmVwbGFjZShhcnJheSgiXHJcbiIsICJcciIpLCAiXG4iLCAkcFZhbHVlKTsKCgkJcmV0dXJuICRwVmFsdWU7Cgl9CgoJLyoqCgkgKiBDaGVjayBhIHZhbHVlIHRoYXQgaXQgaXMgYSB2YWxpZCBlcnJvciBjb2RlCgkgKgoJICogQHBhcmFtIG1peGVkIFZhbHVlIHRvIHNhbml0aXplIHRvIGFuIEV4Y2VsIGVycm9yIGNvZGUKCSAqIEByZXR1cm4gc3RyaW5nIFNhbml0aXplZCB2YWx1ZQoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGNoZWNrRXJyb3JDb2RlKCRwVmFsdWUgPSBudWxsKQoJewoJCSRwVmFsdWUgPSAoc3RyaW5nKSRwVmFsdWU7CgoJCWlmICggIWFycmF5X2tleV9leGlzdHMoJHBWYWx1ZSwgc2VsZjo6JF9lcnJvckNvZGVzKSApIHsKCQkJJHBWYWx1ZSA9ICcjTlVMTCEnOwoJCX0KCgkJcmV0dXJuICRwVmFsdWU7Cgl9Cgp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Cell/DataValidation.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIFBIUEV4Y2VsCiAqCiAqIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICoKICogQGNhdGVnb3J5ICAgUEhQRXhjZWwKICogQHBhY2thZ2UgICAgUEhQRXhjZWxfQ2VsbAogKiBAY29weXJpZ2h0ICBDb3B5cmlnaHQgKGMpIDIwMDYgLSAyMDEyIFBIUEV4Y2VsIChodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9QSFBFeGNlbCkKICogQGxpY2Vuc2UgICAgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL29sZC1saWNlbnNlcy9sZ3BsLTIuMS50eHQJTEdQTAogKiBAdmVyc2lvbiAgICAxLjcuNywgMjAxMi0wNS0xOQogKi8KCgovKioKICogUEhQRXhjZWxfQ2VsbF9EYXRhVmFsaWRhdGlvbgogKgogKiBAY2F0ZWdvcnkgICBQSFBFeGNlbAogKiBAcGFja2FnZSAgICBQSFBFeGNlbF9DZWxsCiAqIEBjb3B5cmlnaHQgIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwgKGh0dHA6Ly93d3cuY29kZXBsZXguY29tL1BIUEV4Y2VsKQogKi8KY2xhc3MgUEhQRXhjZWxfQ2VsbF9EYXRhVmFsaWRhdGlvbgp7CgkvKiBEYXRhIHZhbGlkYXRpb24gdHlwZXMgKi8KCWNvbnN0IFRZUEVfTk9ORQkJCT0gJ25vbmUnOwoJY29uc3QgVFlQRV9DVVNUT00JCT0gJ2N1c3RvbSc7Cgljb25zdCBUWVBFX0RBVEUJCQk9ICdkYXRlJzsKCWNvbnN0IFRZUEVfREVDSU1BTAkJPSAnZGVjaW1hbCc7Cgljb25zdCBUWVBFX0xJU1QJCQk9ICdsaXN0JzsKCWNvbnN0IFRZUEVfVEVYVExFTkdUSAk9ICd0ZXh0TGVuZ3RoJzsKCWNvbnN0IFRZUEVfVElNRQkJCT0gJ3RpbWUnOwoJY29uc3QgVFlQRV9XSE9MRQkJPSAnd2hvbGUnOwoKCS8qIERhdGEgdmFsaWRhdGlvbiBlcnJvciBzdHlsZXMgKi8KCWNvbnN0IFNUWUxFX1NUT1AJCT0gJ3N0b3AnOwoJY29uc3QgU1RZTEVfV0FSTklORwkJPSAnd2FybmluZyc7Cgljb25zdCBTVFlMRV9JTkZPUk1BVElPTgk9ICdpbmZvcm1hdGlvbic7CgoJLyogRGF0YSB2YWxpZGF0aW9uIG9wZXJhdG9ycyAqLwoJY29uc3QgT1BFUkFUT1JfQkVUV0VFTgkJCQk9ICdiZXR3ZWVuJzsKCWNvbnN0IE9QRVJBVE9SX0VRVUFMCQkJCT0gJ2VxdWFsJzsKCWNvbnN0IE9QRVJBVE9SX0dSRUFURVJUSEFOCQkJPSAnZ3JlYXRlclRoYW4nOwoJY29uc3QgT1BFUkFUT1JfR1JFQVRFUlRIQU5PUkVRVUFMCT0gJ2dyZWF0ZXJUaGFuT3JFcXVhbCc7Cgljb25zdCBPUEVSQVRPUl9MRVNTVEhBTgkJCQk9ICdsZXNzVGhhbic7Cgljb25zdCBPUEVSQVRPUl9MRVNTVEhBTk9SRVFVQUwJCT0gJ2xlc3NUaGFuT3JFcXVhbCc7Cgljb25zdCBPUEVSQVRPUl9OT1RCRVRXRUVOCQkJPSAnbm90QmV0d2Vlbic7Cgljb25zdCBPUEVSQVRPUl9OT1RFUVVBTAkJCQk9ICdub3RFcXVhbCc7CgogICAgLyoqCiAgICAgKiBGb3JtdWxhIDEKICAgICAqCiAgICAgKiBAdmFyIHN0cmluZwogICAgICovCiAgICBwcml2YXRlICRfZm9ybXVsYTE7CgogICAgLyoqCiAgICAgKiBGb3JtdWxhIDIKICAgICAqCiAgICAgKiBAdmFyIHN0cmluZwogICAgICovCiAgICBwcml2YXRlICRfZm9ybXVsYTI7CgogICAgLyoqCiAgICAgKiBUeXBlCiAgICAgKgogICAgICogQHZhciBzdHJpbmcKICAgICAqLwogICAgcHJpdmF0ZSAkX3R5cGUgPSBQSFBFeGNlbF9DZWxsX0RhdGFWYWxpZGF0aW9uOjpUWVBFX05PTkU7CgogICAgLyoqCiAgICAgKiBFcnJvciBzdHlsZQogICAgICoKICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKi8KICAgIHByaXZhdGUgJF9lcnJvclN0eWxlID0gUEhQRXhjZWxfQ2VsbF9EYXRhVmFsaWRhdGlvbjo6U1RZTEVfU1RPUDsKCiAgICAvKioKICAgICAqIE9wZXJhdG9yCiAgICAgKgogICAgICogQHZhciBzdHJpbmcKICAgICAqLwogICAgcHJpdmF0ZSAkX29wZXJhdG9yOwoKICAgIC8qKgogICAgICogQWxsb3cgQmxhbmsKICAgICAqCiAgICAgKiBAdmFyIGJvb2xlYW4KICAgICAqLwogICAgcHJpdmF0ZSAkX2FsbG93Qmxhbms7CgogICAgLyoqCiAgICAgKiBTaG93IERyb3BEb3duCiAgICAgKgogICAgICogQHZhciBib29sZWFuCiAgICAgKi8KICAgIHByaXZhdGUgJF9zaG93RHJvcERvd247CgogICAgLyoqCiAgICAgKiBTaG93IElucHV0TWVzc2FnZQogICAgICoKICAgICAqIEB2YXIgYm9vbGVhbgogICAgICovCiAgICBwcml2YXRlICRfc2hvd0lucHV0TWVzc2FnZTsKCiAgICAvKioKICAgICAqIFNob3cgRXJyb3JNZXNzYWdlCiAgICAgKgogICAgICogQHZhciBib29sZWFuCiAgICAgKi8KICAgIHByaXZhdGUgJF9zaG93RXJyb3JNZXNzYWdlOwoKICAgIC8qKgogICAgICogRXJyb3IgdGl0bGUKICAgICAqCiAgICAgKiBAdmFyIHN0cmluZwogICAgICovCiAgICBwcml2YXRlICRfZXJyb3JUaXRsZTsKCiAgICAvKioKICAgICAqIEVycm9yCiAgICAgKgogICAgICogQHZhciBzdHJpbmcKICAgICAqLwogICAgcHJpdmF0ZSAkX2Vycm9yOwoKICAgIC8qKgogICAgICogUHJvbXB0IHRpdGxlCiAgICAgKgogICAgICogQHZhciBzdHJpbmcKICAgICAqLwogICAgcHJpdmF0ZSAkX3Byb21wdFRpdGxlOwoKICAgIC8qKgogICAgICogUHJvbXB0CiAgICAgKgogICAgICogQHZhciBzdHJpbmcKICAgICAqLwogICAgcHJpdmF0ZSAkX3Byb21wdDsKCiAgICAvKioKICAgICAqIENyZWF0ZSBhIG5ldyBQSFBFeGNlbF9DZWxsX0RhdGFWYWxpZGF0aW9uCiAgICAgKgogICAgICogQHRocm93cwlFeGNlcHRpb24KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCkKICAgIHsKICAgIAkvLyBJbml0aWFsaXNlIG1lbWJlciB2YXJpYWJsZXMKCQkkdGhpcy0+X2Zvcm11bGExIAkJCT0gJyc7CgkJJHRoaXMtPl9mb3JtdWxhMiAJCQk9ICcnOwoJCSR0aGlzLT5fdHlwZSAJCQkJPSBQSFBFeGNlbF9DZWxsX0RhdGFWYWxpZGF0aW9uOjpUWVBFX05PTkU7CgkJJHRoaXMtPl9lcnJvclN0eWxlIAkJCT0gUEhQRXhjZWxfQ2VsbF9EYXRhVmFsaWRhdGlvbjo6U1RZTEVfU1RPUDsKCQkkdGhpcy0+X29wZXJhdG9yIAkJCT0gJyc7CgkJJHRoaXMtPl9hbGxvd0JsYW5rIAkJCT0gZmFsc2U7CgkJJHRoaXMtPl9zaG93RHJvcERvd24gCQk9IGZhbHNlOwoJCSR0aGlzLT5fc2hvd0lucHV0TWVzc2FnZSAJPSBmYWxzZTsKCQkkdGhpcy0+X3Nob3dFcnJvck1lc3NhZ2UgCT0gZmFsc2U7CgkJJHRoaXMtPl9lcnJvclRpdGxlIAkJCT0gJyc7CgkJJHRoaXMtPl9lcnJvciAJCQkJPSAnJzsKCQkkdGhpcy0+X3Byb21wdFRpdGxlIAkJPSAnJzsKCQkkdGhpcy0+X3Byb21wdCAJCQkJPSAnJzsKICAgIH0KCgkvKioKCSAqIEdldCBGb3JtdWxhIDEKCSAqCgkgKiBAcmV0dXJuIHN0cmluZwoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0Rm9ybXVsYTEoKSB7CgkJcmV0dXJuICR0aGlzLT5fZm9ybXVsYTE7Cgl9CgoJLyoqCgkgKiBTZXQgRm9ybXVsYSAxCgkgKgoJICogQHBhcmFtCXN0cmluZwkkdmFsdWUKCSAqIEByZXR1cm4gUEhQRXhjZWxfQ2VsbF9EYXRhVmFsaWRhdGlvbgoJICovCglwdWJsaWMgZnVuY3Rpb24gc2V0Rm9ybXVsYTEoJHZhbHVlID0gJycpIHsKCQkkdGhpcy0+X2Zvcm11bGExID0gJHZhbHVlOwoJCXJldHVybiAkdGhpczsKCX0KCgkvKioKCSAqIEdldCBGb3JtdWxhIDIKCSAqCgkgKiBAcmV0dXJuIHN0cmluZwoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0Rm9ybXVsYTIoKSB7CgkJcmV0dXJuICR0aGlzLT5fZm9ybXVsYTI7Cgl9CgoJLyoqCgkgKiBTZXQgRm9ybXVsYSAyCgkgKgoJICogQHBhcmFtCXN0cmluZwkkdmFsdWUKCSAqIEByZXR1cm4gUEhQRXhjZWxfQ2VsbF9EYXRhVmFsaWRhdGlvbgoJICovCglwdWJsaWMgZnVuY3Rpb24gc2V0Rm9ybXVsYTIoJHZhbHVlID0gJycpIHsKCQkkdGhpcy0+X2Zvcm11bGEyID0gJHZhbHVlOwoJCXJldHVybiAkdGhpczsKCX0KCgkvKioKCSAqIEdldCBUeXBlCgkgKgoJICogQHJldHVybiBzdHJpbmcKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldFR5cGUoKSB7CgkJcmV0dXJuICR0aGlzLT5fdHlwZTsKCX0KCgkvKioKCSAqIFNldCBUeXBlCgkgKgoJICogQHBhcmFtCXN0cmluZwkkdmFsdWUKCSAqIEByZXR1cm4gUEhQRXhjZWxfQ2VsbF9EYXRhVmFsaWRhdGlvbgoJICovCglwdWJsaWMgZnVuY3Rpb24gc2V0VHlwZSgkdmFsdWUgPSBQSFBFeGNlbF9DZWxsX0RhdGFWYWxpZGF0aW9uOjpUWVBFX05PTkUpIHsKCQkkdGhpcy0+X3R5cGUgPSAkdmFsdWU7CgkJcmV0dXJuICR0aGlzOwoJfQoKCS8qKgoJICogR2V0IEVycm9yIHN0eWxlCgkgKgoJICogQHJldHVybiBzdHJpbmcKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldEVycm9yU3R5bGUoKSB7CgkJcmV0dXJuICR0aGlzLT5fZXJyb3JTdHlsZTsKCX0KCgkvKioKCSAqIFNldCBFcnJvciBzdHlsZQoJICoKCSAqIEBwYXJhbQlzdHJpbmcJJHZhbHVlCgkgKiBAcmV0dXJuIFBIUEV4Y2VsX0NlbGxfRGF0YVZhbGlkYXRpb24KCSAqLwoJcHVibGljIGZ1bmN0aW9uIHNldEVycm9yU3R5bGUoJHZhbHVlID0gUEhQRXhjZWxfQ2VsbF9EYXRhVmFsaWRhdGlvbjo6U1RZTEVfU1RPUCkgewoJCSR0aGlzLT5fZXJyb3JTdHlsZSA9ICR2YWx1ZTsKCQlyZXR1cm4gJHRoaXM7Cgl9CgoJLyoqCgkgKiBHZXQgT3BlcmF0b3IKCSAqCgkgKiBAcmV0dXJuIHN0cmluZwoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0T3BlcmF0b3IoKSB7CgkJcmV0dXJuICR0aGlzLT5fb3BlcmF0b3I7Cgl9CgoJLyoqCgkgKiBTZXQgT3BlcmF0b3IKCSAqCgkgKiBAcGFyYW0Jc3RyaW5nCSR2YWx1ZQoJICogQHJldHVybiBQSFBFeGNlbF9DZWxsX0RhdGFWYWxpZGF0aW9uCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBzZXRPcGVyYXRvcigkdmFsdWUgPSAnJykgewoJCSR0aGlzLT5fb3BlcmF0b3IgPSAkdmFsdWU7CgkJcmV0dXJuICR0aGlzOwoJfQoKCS8qKgoJICogR2V0IEFsbG93IEJsYW5rCgkgKgoJICogQHJldHVybiBib29sZWFuCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRBbGxvd0JsYW5rKCkgewoJCXJldHVybiAkdGhpcy0+X2FsbG93Qmxhbms7Cgl9CgoJLyoqCgkgKiBTZXQgQWxsb3cgQmxhbmsKCSAqCgkgKiBAcGFyYW0JYm9vbGVhbgkkdmFsdWUKCSAqIEByZXR1cm4gUEhQRXhjZWxfQ2VsbF9EYXRhVmFsaWRhdGlvbgoJICovCglwdWJsaWMgZnVuY3Rpb24gc2V0QWxsb3dCbGFuaygkdmFsdWUgPSBmYWxzZSkgewoJCSR0aGlzLT5fYWxsb3dCbGFuayA9ICR2YWx1ZTsKCQlyZXR1cm4gJHRoaXM7Cgl9CgoJLyoqCgkgKiBHZXQgU2hvdyBEcm9wRG93bgoJICoKCSAqIEByZXR1cm4gYm9vbGVhbgoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0U2hvd0Ryb3BEb3duKCkgewoJCXJldHVybiAkdGhpcy0+X3Nob3dEcm9wRG93bjsKCX0KCgkvKioKCSAqIFNldCBTaG93IERyb3BEb3duCgkgKgoJICogQHBhcmFtCWJvb2xlYW4JJHZhbHVlCgkgKiBAcmV0dXJuIFBIUEV4Y2VsX0NlbGxfRGF0YVZhbGlkYXRpb24KCSAqLwoJcHVibGljIGZ1bmN0aW9uIHNldFNob3dEcm9wRG93bigkdmFsdWUgPSBmYWxzZSkgewoJCSR0aGlzLT5fc2hvd0Ryb3BEb3duID0gJHZhbHVlOwoJCXJldHVybiAkdGhpczsKCX0KCgkvKioKCSAqIEdldCBTaG93IElucHV0TWVzc2FnZQoJICoKCSAqIEByZXR1cm4gYm9vbGVhbgoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0U2hvd0lucHV0TWVzc2FnZSgpIHsKCQlyZXR1cm4gJHRoaXMtPl9zaG93SW5wdXRNZXNzYWdlOwoJfQoKCS8qKgoJICogU2V0IFNob3cgSW5wdXRNZXNzYWdlCgkgKgoJICogQHBhcmFtCWJvb2xlYW4JJHZhbHVlCgkgKiBAcmV0dXJuIFBIUEV4Y2VsX0NlbGxfRGF0YVZhbGlkYXRpb24KCSAqLwoJcHVibGljIGZ1bmN0aW9uIHNldFNob3dJbnB1dE1lc3NhZ2UoJHZhbHVlID0gZmFsc2UpIHsKCQkkdGhpcy0+X3Nob3dJbnB1dE1lc3NhZ2UgPSAkdmFsdWU7CgkJcmV0dXJuICR0aGlzOwoJfQoKCS8qKgoJICogR2V0IFNob3cgRXJyb3JNZXNzYWdlCgkgKgoJICogQHJldHVybiBib29sZWFuCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRTaG93RXJyb3JNZXNzYWdlKCkgewoJCXJldHVybiAkdGhpcy0+X3Nob3dFcnJvck1lc3NhZ2U7Cgl9CgoJLyoqCgkgKiBTZXQgU2hvdyBFcnJvck1lc3NhZ2UKCSAqCgkgKiBAcGFyYW0JYm9vbGVhbgkkdmFsdWUKCSAqIEByZXR1cm4gUEhQRXhjZWxfQ2VsbF9EYXRhVmFsaWRhdGlvbgoJICovCglwdWJsaWMgZnVuY3Rpb24gc2V0U2hvd0Vycm9yTWVzc2FnZSgkdmFsdWUgPSBmYWxzZSkgewoJCSR0aGlzLT5fc2hvd0Vycm9yTWVzc2FnZSA9ICR2YWx1ZTsKCQlyZXR1cm4gJHRoaXM7Cgl9CgoJLyoqCgkgKiBHZXQgRXJyb3IgdGl0bGUKCSAqCgkgKiBAcmV0dXJuIHN0cmluZwoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0RXJyb3JUaXRsZSgpIHsKCQlyZXR1cm4gJHRoaXMtPl9lcnJvclRpdGxlOwoJfQoKCS8qKgoJICogU2V0IEVycm9yIHRpdGxlCgkgKgoJICogQHBhcmFtCXN0cmluZwkkdmFsdWUKCSAqIEByZXR1cm4gUEhQRXhjZWxfQ2VsbF9EYXRhVmFsaWRhdGlvbgoJICovCglwdWJsaWMgZnVuY3Rpb24gc2V0RXJyb3JUaXRsZSgkdmFsdWUgPSAnJykgewoJCSR0aGlzLT5fZXJyb3JUaXRsZSA9ICR2YWx1ZTsKCQlyZXR1cm4gJHRoaXM7Cgl9CgoJLyoqCgkgKiBHZXQgRXJyb3IKCSAqCgkgKiBAcmV0dXJuIHN0cmluZwoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0RXJyb3IoKSB7CgkJcmV0dXJuICR0aGlzLT5fZXJyb3I7Cgl9CgoJLyoqCgkgKiBTZXQgRXJyb3IKCSAqCgkgKiBAcGFyYW0Jc3RyaW5nCSR2YWx1ZQoJICogQHJldHVybiBQSFBFeGNlbF9DZWxsX0RhdGFWYWxpZGF0aW9uCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBzZXRFcnJvcigkdmFsdWUgPSAnJykgewoJCSR0aGlzLT5fZXJyb3IgPSAkdmFsdWU7CgkJcmV0dXJuICR0aGlzOwoJfQoKCS8qKgoJICogR2V0IFByb21wdCB0aXRsZQoJICoKCSAqIEByZXR1cm4gc3RyaW5nCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRQcm9tcHRUaXRsZSgpIHsKCQlyZXR1cm4gJHRoaXMtPl9wcm9tcHRUaXRsZTsKCX0KCgkvKioKCSAqIFNldCBQcm9tcHQgdGl0bGUKCSAqCgkgKiBAcGFyYW0Jc3RyaW5nCSR2YWx1ZQoJICogQHJldHVybiBQSFBFeGNlbF9DZWxsX0RhdGFWYWxpZGF0aW9uCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBzZXRQcm9tcHRUaXRsZSgkdmFsdWUgPSAnJykgewoJCSR0aGlzLT5fcHJvbXB0VGl0bGUgPSAkdmFsdWU7CgkJcmV0dXJuICR0aGlzOwoJfQoKCS8qKgoJICogR2V0IFByb21wdAoJICoKCSAqIEByZXR1cm4gc3RyaW5nCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRQcm9tcHQoKSB7CgkJcmV0dXJuICR0aGlzLT5fcHJvbXB0OwoJfQoKCS8qKgoJICogU2V0IFByb21wdAoJICoKCSAqIEBwYXJhbQlzdHJpbmcJJHZhbHVlCgkgKiBAcmV0dXJuIFBIUEV4Y2VsX0NlbGxfRGF0YVZhbGlkYXRpb24KCSAqLwoJcHVibGljIGZ1bmN0aW9uIHNldFByb21wdCgkdmFsdWUgPSAnJykgewoJCSR0aGlzLT5fcHJvbXB0ID0gJHZhbHVlOwoJCXJldHVybiAkdGhpczsKCX0KCgkvKioKCSAqIEdldCBoYXNoIGNvZGUKCSAqCgkgKiBAcmV0dXJuIHN0cmluZwlIYXNoIGNvZGUKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldEhhc2hDb2RlKCkgewogICAgCXJldHVybiBtZDUoCiAgICAJCSAgJHRoaXMtPl9mb3JtdWxhMQogICAgCQkuICR0aGlzLT5fZm9ybXVsYTIKICAgIAkJLiAkdGhpcy0+X3R5cGUgPSBQSFBFeGNlbF9DZWxsX0RhdGFWYWxpZGF0aW9uOjpUWVBFX05PTkUKICAgIAkJLiAkdGhpcy0+X2Vycm9yU3R5bGUgPSBQSFBFeGNlbF9DZWxsX0RhdGFWYWxpZGF0aW9uOjpTVFlMRV9TVE9QCiAgICAJCS4gJHRoaXMtPl9vcGVyYXRvcgogICAgCQkuICgkdGhpcy0+X2FsbG93QmxhbmsgPyAndCcgOiAnZicpCiAgICAJCS4gKCR0aGlzLT5fc2hvd0Ryb3BEb3duID8gJ3QnIDogJ2YnKQogICAgCQkuICgkdGhpcy0+X3Nob3dJbnB1dE1lc3NhZ2UgPyAndCcgOiAnZicpCiAgICAJCS4gKCR0aGlzLT5fc2hvd0Vycm9yTWVzc2FnZSA/ICd0JyA6ICdmJykKICAgIAkJLiAkdGhpcy0+X2Vycm9yVGl0bGUKICAgIAkJLiAkdGhpcy0+X2Vycm9yCiAgICAJCS4gJHRoaXMtPl9wcm9tcHRUaXRsZQogICAgCQkuICR0aGlzLT5fcHJvbXB0CiAgICAJCS4gX19DTEFTU19fCiAgICAJKTsKICAgIH0KCgkvKioKCSAqIEltcGxlbWVudCBQSFAgX19jbG9uZSB0byBjcmVhdGUgYSBkZWVwIGNsb25lLCBub3QganVzdCBhIHNoYWxsb3cgY29weS4KCSAqLwoJcHVibGljIGZ1bmN0aW9uIF9fY2xvbmUoKSB7CgkJJHZhcnMgPSBnZXRfb2JqZWN0X3ZhcnMoJHRoaXMpOwoJCWZvcmVhY2ggKCR2YXJzIGFzICRrZXkgPT4gJHZhbHVlKSB7CgkJCWlmIChpc19vYmplY3QoJHZhbHVlKSkgewoJCQkJJHRoaXMtPiRrZXkgPSBjbG9uZSAkdmFsdWU7CgkJCX0gZWxzZSB7CgkJCQkkdGhpcy0+JGtleSA9ICR2YWx1ZTsKCQkJfQoJCX0KCX0KfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Cell/DefaultValueBinder.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIFBIUEV4Y2VsCiAqCiAqIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICoKICogQGNhdGVnb3J5ICAgUEhQRXhjZWwKICogQHBhY2thZ2UgICAgUEhQRXhjZWxfQ2VsbAogKiBAY29weXJpZ2h0ICBDb3B5cmlnaHQgKGMpIDIwMDYgLSAyMDEyIFBIUEV4Y2VsIChodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9QSFBFeGNlbCkKICogQGxpY2Vuc2UgICAgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL29sZC1saWNlbnNlcy9sZ3BsLTIuMS50eHQJTEdQTAogKiBAdmVyc2lvbiAgICAxLjcuNywgMjAxMi0wNS0xOQogKi8KCgovKiogUEhQRXhjZWwgcm9vdCBkaXJlY3RvcnkgKi8KaWYgKCFkZWZpbmVkKCdQSFBFWENFTF9ST09UJykpIHsKCS8qKgoJICogQGlnbm9yZQoJICovCglkZWZpbmUoJ1BIUEVYQ0VMX1JPT1QnLCBkaXJuYW1lKF9fRklMRV9fKSAuICcvLi4vLi4vJyk7CglyZXF1aXJlKFBIUEVYQ0VMX1JPT1QgLiAnUEhQRXhjZWwvQXV0b2xvYWRlci5waHAnKTsKfQoKCi8qKgogKiBQSFBFeGNlbF9DZWxsX0RlZmF1bHRWYWx1ZUJpbmRlcgogKgogKiBAY2F0ZWdvcnkgICBQSFBFeGNlbAogKiBAcGFja2FnZSAgICBQSFBFeGNlbF9DZWxsCiAqIEBjb3B5cmlnaHQgIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwgKGh0dHA6Ly93d3cuY29kZXBsZXguY29tL1BIUEV4Y2VsKQogKi8KY2xhc3MgUEhQRXhjZWxfQ2VsbF9EZWZhdWx0VmFsdWVCaW5kZXIgaW1wbGVtZW50cyBQSFBFeGNlbF9DZWxsX0lWYWx1ZUJpbmRlcgp7CgkvKioKCSAqIEJpbmQgdmFsdWUgdG8gYSBjZWxsCgkgKgoJICogQHBhcmFtIFBIUEV4Y2VsX0NlbGwgJGNlbGwJQ2VsbCB0byBiaW5kIHZhbHVlIHRvCgkgKiBAcGFyYW0gbWl4ZWQgJHZhbHVlCQkJVmFsdWUgdG8gYmluZCBpbiBjZWxsCgkgKiBAcmV0dXJuIGJvb2xlYW4KCSAqLwoJcHVibGljIGZ1bmN0aW9uIGJpbmRWYWx1ZShQSFBFeGNlbF9DZWxsICRjZWxsLCAkdmFsdWUgPSBudWxsKQoJewoJCS8vIHNhbml0aXplIFVURi04IHN0cmluZ3MKCQlpZiAoaXNfc3RyaW5nKCR2YWx1ZSkpIHsKCQkJJHZhbHVlID0gUEhQRXhjZWxfU2hhcmVkX1N0cmluZzo6U2FuaXRpemVVVEY4KCR2YWx1ZSk7CgkJfQoKCQkvLyBTZXQgdmFsdWUgZXhwbGljaXQKCQkkY2VsbC0+c2V0VmFsdWVFeHBsaWNpdCggJHZhbHVlLCBzZWxmOjpkYXRhVHlwZUZvclZhbHVlKCR2YWx1ZSkgKTsKCgkJLy8gRG9uZSEKCQlyZXR1cm4gdHJ1ZTsKCX0KCgkvKioKCSAqIERhdGFUeXBlIGZvciB2YWx1ZQoJICoKCSAqIEBwYXJhbQltaXhlZCAJJHBWYWx1ZQoJICogQHJldHVybiAJaW50CgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZGF0YVR5cGVGb3JWYWx1ZSgkcFZhbHVlID0gbnVsbCkgewoJCS8vIE1hdGNoIHRoZSB2YWx1ZSBhZ2FpbnN0IGEgZmV3IGRhdGEgdHlwZXMKCQlpZiAoaXNfbnVsbCgkcFZhbHVlKSkgewoJCQlyZXR1cm4gUEhQRXhjZWxfQ2VsbF9EYXRhVHlwZTo6VFlQRV9OVUxMOwoKCQl9IGVsc2VpZiAoJHBWYWx1ZSA9PT0gJycpIHsKCQkJcmV0dXJuIFBIUEV4Y2VsX0NlbGxfRGF0YVR5cGU6OlRZUEVfU1RSSU5HOwoKCQl9IGVsc2VpZiAoJHBWYWx1ZSBpbnN0YW5jZW9mIFBIUEV4Y2VsX1JpY2hUZXh0KSB7CgkJCXJldHVybiBQSFBFeGNlbF9DZWxsX0RhdGFUeXBlOjpUWVBFX0lOTElORTsKCgkJfSBlbHNlaWYgKCRwVmFsdWV7MH0gPT09ICc9JyAmJiBzdHJsZW4oJHBWYWx1ZSkgPiAxKSB7CgkJCXJldHVybiBQSFBFeGNlbF9DZWxsX0RhdGFUeXBlOjpUWVBFX0ZPUk1VTEE7CgoJCX0gZWxzZWlmIChpc19ib29sKCRwVmFsdWUpKSB7CgkJCXJldHVybiBQSFBFeGNlbF9DZWxsX0RhdGFUeXBlOjpUWVBFX0JPT0w7CgoJCX0gZWxzZWlmIChpc19mbG9hdCgkcFZhbHVlKSB8fCBpc19pbnQoJHBWYWx1ZSkpIHsKCQkJcmV0dXJuIFBIUEV4Y2VsX0NlbGxfRGF0YVR5cGU6OlRZUEVfTlVNRVJJQzsKCgkJfSBlbHNlaWYgKHByZWdfbWF0Y2goJy9eXC0/KFswLTldK1xcLj9bMC05XSp8WzAtOV0qXFwuP1swLTldKykkLycsICRwVmFsdWUpKSB7CgkJCXJldHVybiBQSFBFeGNlbF9DZWxsX0RhdGFUeXBlOjpUWVBFX05VTUVSSUM7CgoJCX0gZWxzZWlmIChpc19zdHJpbmcoJHBWYWx1ZSkgJiYgYXJyYXlfa2V5X2V4aXN0cygkcFZhbHVlLCBQSFBFeGNlbF9DZWxsX0RhdGFUeXBlOjpnZXRFcnJvckNvZGVzKCkpKSB7CgkJCXJldHVybiBQSFBFeGNlbF9DZWxsX0RhdGFUeXBlOjpUWVBFX0VSUk9SOwoKCQl9IGVsc2UgewoJCQlyZXR1cm4gUEhQRXhjZWxfQ2VsbF9EYXRhVHlwZTo6VFlQRV9TVFJJTkc7CgoJCX0KCX0KfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Cell/Hyperlink.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIFBIUEV4Y2VsCiAqCiAqIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICoKICogQGNhdGVnb3J5ICAgUEhQRXhjZWwKICogQHBhY2thZ2UgICAgUEhQRXhjZWxfQ2VsbAogKiBAY29weXJpZ2h0ICBDb3B5cmlnaHQgKGMpIDIwMDYgLSAyMDEyIFBIUEV4Y2VsIChodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9QSFBFeGNlbCkKICogQGxpY2Vuc2UgICAgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL29sZC1saWNlbnNlcy9sZ3BsLTIuMS50eHQJTEdQTAogKiBAdmVyc2lvbiAgICAxLjcuNywgMjAxMi0wNS0xOQogKi8KCgovKioKICogUEhQRXhjZWxfQ2VsbF9IeXBlcmxpbmsKICoKICogQGNhdGVnb3J5ICAgUEhQRXhjZWwKICogQHBhY2thZ2UgICAgUEhQRXhjZWxfQ2VsbAogKiBAY29weXJpZ2h0ICBDb3B5cmlnaHQgKGMpIDIwMDYgLSAyMDEyIFBIUEV4Y2VsIChodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9QSFBFeGNlbCkKICovCmNsYXNzIFBIUEV4Y2VsX0NlbGxfSHlwZXJsaW5rCnsKCS8qKgoJICogVVJMIHRvIGxpbmsgdGhlIGNlbGwgdG8KCSAqCgkgKiBAdmFyIHN0cmluZwoJICovCglwcml2YXRlICRfdXJsOwoKCS8qKgoJICogVG9vbHRpcCB0byBkaXNwbGF5IG9uIHRoZSBoeXBlcmxpbmsKCSAqCgkgKiBAdmFyIHN0cmluZwoJICovCglwcml2YXRlICRfdG9vbHRpcDsKCiAgICAvKioKICAgICAqIENyZWF0ZSBhIG5ldyBQSFBFeGNlbF9DZWxsX0h5cGVybGluawogICAgICoKICAgICAqIEBwYXJhbSAJc3RyaW5nCQkJCSRwVXJsCQlVcmwgdG8gbGluayB0aGUgY2VsbCB0bwogICAgICogQHBhcmFtCXN0cmluZwkJCQkkcFRvb2x0aXAJVG9vbHRpcCB0byBkaXNwbGF5IG9uIHRoZSBoeXBlcmxpbmsKICAgICAqIEB0aHJvd3MJRXhjZXB0aW9uCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkcFVybCA9ICcnLCAkcFRvb2x0aXAgPSAnJykKICAgIHsKICAgIAkvLyBJbml0aWFsaXNlIG1lbWJlciB2YXJpYWJsZXMKCQkkdGhpcy0+X3VybCAJCT0gJHBVcmw7CgkJJHRoaXMtPl90b29sdGlwIAk9ICRwVG9vbHRpcDsKICAgIH0KCgkvKioKCSAqIEdldCBVUkwKCSAqCgkgKiBAcmV0dXJuIHN0cmluZwoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0VXJsKCkgewoJCXJldHVybiAkdGhpcy0+X3VybDsKCX0KCgkvKioKCSAqIFNldCBVUkwKCSAqCgkgKiBAcGFyYW0Jc3RyaW5nCSR2YWx1ZQoJICogQHJldHVybiBQSFBFeGNlbF9DZWxsX0h5cGVybGluawoJICovCglwdWJsaWMgZnVuY3Rpb24gc2V0VXJsKCR2YWx1ZSA9ICcnKSB7CgkJJHRoaXMtPl91cmwgPSAkdmFsdWU7CgkJcmV0dXJuICR0aGlzOwoJfQoKCS8qKgoJICogR2V0IHRvb2x0aXAKCSAqCgkgKiBAcmV0dXJuIHN0cmluZwoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0VG9vbHRpcCgpIHsKCQlyZXR1cm4gJHRoaXMtPl90b29sdGlwOwoJfQoKCS8qKgoJICogU2V0IHRvb2x0aXAKCSAqCgkgKiBAcGFyYW0Jc3RyaW5nCSR2YWx1ZQoJICogQHJldHVybiBQSFBFeGNlbF9DZWxsX0h5cGVybGluawoJICovCglwdWJsaWMgZnVuY3Rpb24gc2V0VG9vbHRpcCgkdmFsdWUgPSAnJykgewoJCSR0aGlzLT5fdG9vbHRpcCA9ICR2YWx1ZTsKCQlyZXR1cm4gJHRoaXM7Cgl9CgoJLyoqCgkgKiBJcyB0aGlzIGh5cGVybGluayBpbnRlcm5hbD8gKHRvIGFub3RoZXIgc2hlZXQpCgkgKgoJICogQHJldHVybiBib29sZWFuCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBpc0ludGVybmFsKCkgewoJCXJldHVybiBzdHJwb3MoJHRoaXMtPl91cmwsICdzaGVldDovLycpICE9PSBmYWxzZTsKCX0KCgkvKioKCSAqIEdldCBoYXNoIGNvZGUKCSAqCgkgKiBAcmV0dXJuIHN0cmluZwlIYXNoIGNvZGUKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldEhhc2hDb2RlKCkgewogICAgCXJldHVybiBtZDUoCiAgICAJCSAgJHRoaXMtPl91cmwKICAgIAkJLiAkdGhpcy0+X3Rvb2x0aXAKICAgIAkJLiBfX0NMQVNTX18KICAgIAkpOwogICAgfQp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Cell/IValueBinder.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIFBIUEV4Y2VsCiAqCiAqIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICoKICogQGNhdGVnb3J5ICAgUEhQRXhjZWwKICogQHBhY2thZ2UgICAgUEhQRXhjZWxfQ2VsbAogKiBAY29weXJpZ2h0ICBDb3B5cmlnaHQgKGMpIDIwMDYgLSAyMDEyIFBIUEV4Y2VsIChodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9QSFBFeGNlbCkKICogQGxpY2Vuc2UgICAgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL29sZC1saWNlbnNlcy9sZ3BsLTIuMS50eHQJTEdQTAogKiBAdmVyc2lvbiAgICAxLjcuNywgMjAxMi0wNS0xOQogKi8KCgovKioKICogUEhQRXhjZWxfQ2VsbF9JVmFsdWVCaW5kZXIKICoKICogQGNhdGVnb3J5ICAgUEhQRXhjZWwKICogQHBhY2thZ2UgICAgUEhQRXhjZWxfQ2VsbAogKiBAY29weXJpZ2h0ICBDb3B5cmlnaHQgKGMpIDIwMDYgLSAyMDEyIFBIUEV4Y2VsIChodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9QSFBFeGNlbCkKICovCmludGVyZmFjZSBQSFBFeGNlbF9DZWxsX0lWYWx1ZUJpbmRlcgp7CgkvKioKCSAqIEJpbmQgdmFsdWUgdG8gYSBjZWxsCgkgKgoJICogQHBhcmFtIFBIUEV4Y2VsX0NlbGwgJGNlbGwJQ2VsbCB0byBiaW5kIHZhbHVlIHRvCgkgKiBAcGFyYW0gbWl4ZWQgJHZhbHVlCQkJVmFsdWUgdG8gYmluZCBpbiBjZWxsCgkgKiBAcmV0dXJuIGJvb2xlYW4KCSAqLwoJcHVibGljIGZ1bmN0aW9uIGJpbmRWYWx1ZShQSFBFeGNlbF9DZWxsICRjZWxsLCAkdmFsdWUgPSBudWxsKTsKfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Chart.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIFBIUEV4Y2VsCiAqCiAqIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICoKICogQGNhdGVnb3J5CVBIUEV4Y2VsCiAqIEBwYWNrYWdlCQlQSFBFeGNlbF9DaGFydAogKiBAY29weXJpZ2h0CUNvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwgKGh0dHA6Ly93d3cuY29kZXBsZXguY29tL1BIUEV4Y2VsKQogKiBAbGljZW5zZQkJaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL29sZC1saWNlbnNlcy9sZ3BsLTIuMS50eHQJTEdQTAogKiBAdmVyc2lvbgkJMS43LjcsIDIwMTItMDUtMTkKICovCgoKLyoqCiAqIFBIUEV4Y2VsX0NoYXJ0CiAqCiAqIEBjYXRlZ29yeQlQSFBFeGNlbAogKiBAcGFja2FnZQkJUEhQRXhjZWxfQ2hhcnQKICogQGNvcHlyaWdodAlDb3B5cmlnaHQgKGMpIDIwMDYgLSAyMDEyIFBIUEV4Y2VsIChodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9QSFBFeGNlbCkKICovCmNsYXNzIFBIUEV4Y2VsX0NoYXJ0CnsKCS8qKgoJICogQ2hhcnQgTmFtZQoJICoKCSAqIEB2YXIgc3RyaW5nCgkgKi8KCXByaXZhdGUgJF9uYW1lID0gJyc7CgoJLyoqCgkgKiBXb3Jrc2hlZXQKCSAqCgkgKiBAdmFyIFBIUEV4Y2VsX1dvcmtzaGVldAoJICovCglwcml2YXRlICRfd29ya3NoZWV0ID0gbnVsbDsKCgkvKioKCSAqIENoYXJ0IFRpdGxlCgkgKgoJICogQHZhciBQSFBFeGNlbF9DaGFydF9UaXRsZQoJICovCglwcml2YXRlICRfdGl0bGUgPSBudWxsOwoKCS8qKgoJICogQ2hhcnQgTGVnZW5kCgkgKgoJICogQHZhciBQSFBFeGNlbF9DaGFydF9MZWdlbmQKCSAqLwoJcHJpdmF0ZSAkX2xlZ2VuZCA9IG51bGw7CgoJLyoqCgkgKiBYLUF4aXMgTGFiZWwKCSAqCgkgKiBAdmFyIFBIUEV4Y2VsX0NoYXJ0X1RpdGxlCgkgKi8KCXByaXZhdGUgJF94QXhpc0xhYmVsID0gbnVsbDsKCgkvKioKCSAqIFktQXhpcyBMYWJlbAoJICoKCSAqIEB2YXIgUEhQRXhjZWxfQ2hhcnRfVGl0bGUKCSAqLwoJcHJpdmF0ZSAkX3lBeGlzTGFiZWwgPSBudWxsOwoKCS8qKgoJICogQ2hhcnQgUGxvdCBBcmVhCgkgKgoJICogQHZhciBQSFBFeGNlbF9DaGFydF9QbG90QXJlYQoJICovCglwcml2YXRlICRfcGxvdEFyZWEgPSBudWxsOwoKCS8qKgoJICogUGxvdCBWaXNpYmxlIE9ubHkKCSAqCgkgKiBAdmFyIGJvb2xlYW4KCSAqLwoJcHJpdmF0ZSAkX3Bsb3RWaXNpYmxlT25seSA9IHRydWU7CgoJLyoqCgkgKiBEaXNwbGF5IEJsYW5rcyBhcwoJICoKCSAqIEB2YXIgc3RyaW5nCgkgKi8KCXByaXZhdGUgJF9kaXNwbGF5QmxhbmtzQXMgPSAnMCc7CgoKCS8qKgoJICogVG9wLUxlZnQgQ2VsbCBQb3NpdGlvbgoJICoKCSAqIEB2YXIgc3RyaW5nCgkgKi8KCXByaXZhdGUgJF90b3BMZWZ0Q2VsbFJlZiA9ICdBMSc7CgoKCS8qKgoJICogVG9wLUxlZnQgWC1PZmZzZXQKCSAqCgkgKiBAdmFyIGludGVnZXIKCSAqLwoJcHJpdmF0ZSAkX3RvcExlZnRYT2Zmc2V0ID0gMDsKCgoJLyoqCgkgKiBUb3AtTGVmdCBZLU9mZnNldAoJICoKCSAqIEB2YXIgaW50ZWdlcgoJICovCglwcml2YXRlICRfdG9wTGVmdFlPZmZzZXQgPSAwOwoKCgkvKioKCSAqIEJvdHRvbS1SaWdodCBDZWxsIFBvc2l0aW9uCgkgKgoJICogQHZhciBzdHJpbmcKCSAqLwoJcHJpdmF0ZSAkX2JvdHRvbVJpZ2h0Q2VsbFJlZiA9ICdBMSc7CgoKCS8qKgoJICogQm90dG9tLVJpZ2h0IFgtT2Zmc2V0CgkgKgoJICogQHZhciBpbnRlZ2VyCgkgKi8KCXByaXZhdGUgJF9ib3R0b21SaWdodFhPZmZzZXQgPSAxMDsKCgoJLyoqCgkgKiBCb3R0b20tUmlnaHQgWS1PZmZzZXQKCSAqCgkgKiBAdmFyIGludGVnZXIKCSAqLwoJcHJpdmF0ZSAkX2JvdHRvbVJpZ2h0WU9mZnNldCA9IDEwOwoKCgkvKioKCSAqIENyZWF0ZSBhIG5ldyBQSFBFeGNlbF9DaGFydAoJICovCglwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJG5hbWUsIFBIUEV4Y2VsX0NoYXJ0X1RpdGxlICR0aXRsZSA9IG51bGwsIFBIUEV4Y2VsX0NoYXJ0X0xlZ2VuZCAkbGVnZW5kID0gbnVsbCwgUEhQRXhjZWxfQ2hhcnRfUGxvdEFyZWEgJHBsb3RBcmVhID0gbnVsbCwgJHBsb3RWaXNpYmxlT25seSA9IHRydWUsICRkaXNwbGF5QmxhbmtzQXMgPSAnMCcsIFBIUEV4Y2VsX0NoYXJ0X1RpdGxlICR4QXhpc0xhYmVsID0gbnVsbCwgUEhQRXhjZWxfQ2hhcnRfVGl0bGUgJHlBeGlzTGFiZWwgPSBudWxsKQoJewoJCSR0aGlzLT5fbmFtZSA9ICRuYW1lOwoJCSR0aGlzLT5fdGl0bGUgPSAkdGl0bGU7CgkJJHRoaXMtPl9sZWdlbmQgPSAkbGVnZW5kOwoJCSR0aGlzLT5feEF4aXNMYWJlbCA9ICR4QXhpc0xhYmVsOwoJCSR0aGlzLT5feUF4aXNMYWJlbCA9ICR5QXhpc0xhYmVsOwoJCSR0aGlzLT5fcGxvdEFyZWEgPSAkcGxvdEFyZWE7CgkJJHRoaXMtPl9wbG90VmlzaWJsZU9ubHkgPSAkcGxvdFZpc2libGVPbmx5OwoJCSR0aGlzLT5fZGlzcGxheUJsYW5rc0FzID0gJGRpc3BsYXlCbGFua3NBczsKCX0KCgkvKioKCSAqIEdldCBOYW1lCgkgKgoJICogQHJldHVybiBzdHJpbmcKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldE5hbWUoKSB7CgkJcmV0dXJuICR0aGlzLT5fbmFtZTsKCX0KCgkvKioKCSAqIEdldCBXb3Jrc2hlZXQKCSAqCgkgKiBAcmV0dXJuIFBIUEV4Y2VsX1dvcmtzaGVldAoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0V29ya3NoZWV0KCkgewoJCXJldHVybiAkdGhpcy0+X3dvcmtzaGVldDsKCX0KCgkvKioKCSAqIFNldCBXb3Jrc2hlZXQKCSAqCgkgKiBAcGFyYW0JUEhQRXhjZWxfV29ya3NoZWV0CSRwVmFsdWUKCSAqIEB0aHJvd3MJRXhjZXB0aW9uCgkgKiBAcmV0dXJuIFBIUEV4Y2VsX0NoYXJ0CgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBzZXRXb3Jrc2hlZXQoUEhQRXhjZWxfV29ya3NoZWV0ICRwVmFsdWUgPSBudWxsKSB7CgkJJHRoaXMtPl93b3Jrc2hlZXQgPSAkcFZhbHVlOwoKCQlyZXR1cm4gJHRoaXM7Cgl9CgoJLyoqCgkgKiBHZXQgVGl0bGUKCSAqCgkgKiBAcmV0dXJuIFBIUEV4Y2VsX0NoYXJ0X1RpdGxlCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRUaXRsZSgpIHsKCQlyZXR1cm4gJHRoaXMtPl90aXRsZTsKCX0KCgkvKioKCSAqIEdldCBMZWdlbmQKCSAqCgkgKiBAcmV0dXJuIFBIUEV4Y2VsX0NoYXJ0X0xlZ2VuZAoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0TGVnZW5kKCkgewoJCXJldHVybiAkdGhpcy0+X2xlZ2VuZDsKCX0KCgkvKioKCSAqIEdldCBYLUF4aXMgTGFiZWwKCSAqCgkgKiBAcmV0dXJuIFBIUEV4Y2VsX0NoYXJ0X1RpdGxlCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRYQXhpc0xhYmVsKCkgewoJCXJldHVybiAkdGhpcy0+X3hBeGlzTGFiZWw7Cgl9CgoJLyoqCgkgKiBHZXQgWS1BeGlzIExhYmVsCgkgKgoJICogQHJldHVybiBQSFBFeGNlbF9DaGFydF9UaXRsZQoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0WUF4aXNMYWJlbCgpIHsKCQlyZXR1cm4gJHRoaXMtPl95QXhpc0xhYmVsOwoJfQoKCS8qKgoJICogR2V0IFBsb3QgQXJlYQoJICoKCSAqIEByZXR1cm4gUEhQRXhjZWxfQ2hhcnRfUGxvdEFyZWEKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldFBsb3RBcmVhKCkgewoJCXJldHVybiAkdGhpcy0+X3Bsb3RBcmVhOwoJfQoKCS8qKgoJICogR2V0IFBsb3QgVmlzaWJsZSBPbmx5CgkgKgoJICogQHJldHVybiBib29sZWFuCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRQbG90VmlzaWJsZU9ubHkoKSB7CgkJcmV0dXJuICR0aGlzLT5fcGxvdFZpc2libGVPbmx5OwoJfQoKCS8qKgoJICogU2V0IFBsb3QgVmlzaWJsZSBPbmx5CgkgKgoJICogQHBhcmFtIGJvb2xlYW4gJHBsb3RWaXNpYmxlT25seQoJICogQHJldHVybiBQSFBFeGNlbF9DaGFydAoJICovCglwdWJsaWMgZnVuY3Rpb24gc2V0UGxvdFZpc2libGVPbmx5KCRwbG90VmlzaWJsZU9ubHkgPSB0cnVlKSB7CgkJJHRoaXMtPl9wbG90VmlzaWJsZU9ubHkgPSAkcGxvdFZpc2libGVPbmx5OwoKCQlyZXR1cm4gJHRoaXM7Cgl9CgoJLyoqCgkgKiBHZXQgRGlzcGxheSBCbGFua3MgYXMKCSAqCgkgKiBAcmV0dXJuIHN0cmluZwoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0RGlzcGxheUJsYW5rc0FzKCkgewoJCXJldHVybiAkdGhpcy0+X2Rpc3BsYXlCbGFua3NBczsKCX0KCgkvKioKCSAqIFNldCBEaXNwbGF5IEJsYW5rcyBhcwoJICoKCSAqIEBwYXJhbSBzdHJpbmcgJGRpc3BsYXlCbGFua3NBcwoJICogQHJldHVybiBQSFBFeGNlbF9DaGFydAoJICovCglwdWJsaWMgZnVuY3Rpb24gc2V0RGlzcGxheUJsYW5rc0FzKCRkaXNwbGF5QmxhbmtzQXMgPSAnMCcpIHsKCQkkdGhpcy0+X2Rpc3BsYXlCbGFua3NBcyA9ICRkaXNwbGF5QmxhbmtzQXM7Cgl9CgoKCS8qKgoJICogU2V0IHRoZSBUb3AgTGVmdCBwb3NpdGlvbiBmb3IgdGhlIGNoYXJ0CgkgKgoJICogQHBhcmFtCXN0cmluZwkkY2VsbAoJICogQHBhcmFtCWludGVnZXIJJHhPZmZzZXQKCSAqIEBwYXJhbQlpbnRlZ2VyCSR5T2Zmc2V0CgkgKiBAcmV0dXJuIFBIUEV4Y2VsX0NoYXJ0CgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBzZXRUb3BMZWZ0UG9zaXRpb24oJGNlbGwsICR4T2Zmc2V0PW51bGwsICR5T2Zmc2V0PW51bGwpIHsKCQkkdGhpcy0+X3RvcExlZnRDZWxsUmVmID0gJGNlbGw7CgkJaWYgKCFpc19udWxsKCR4T2Zmc2V0KSkKCQkJJHRoaXMtPnNldFRvcExlZnRYT2Zmc2V0KCR4T2Zmc2V0KTsKCQlpZiAoIWlzX251bGwoJHlPZmZzZXQpKQoJCQkkdGhpcy0+c2V0VG9wTGVmdFlPZmZzZXQoJHlPZmZzZXQpOwoKCQlyZXR1cm4gJHRoaXM7Cgl9CgoJLyoqCgkgKiBHZXQgdGhlIHRvcCBsZWZ0IHBvc2l0aW9uIG9mIHRoZSBjaGFydAoJICoKCSAqIEByZXR1cm4gYXJyYXkJYW4gYXNzb2NpYXRpdmUgYXJyYXkgY29udGFpbmluZyB0aGUgY2VsbCBhZGRyZXNzLCBYLU9mZnNldCBhbmQgWS1PZmZzZXQgZnJvbSB0aGUgdG9wIGxlZnQgb2YgdGhhdCBjZWxsCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRUb3BMZWZ0UG9zaXRpb24oKSB7CgkJcmV0dXJuIGFycmF5KCAnY2VsbCcJPT4gJHRoaXMtPl90b3BMZWZ0Q2VsbFJlZiwKCQkJCQkgICd4T2Zmc2V0Jwk9PiAkdGhpcy0+X3RvcExlZnRYT2Zmc2V0LAoJCQkJCSAgJ3lPZmZzZXQnCT0+ICR0aGlzLT5fdG9wTGVmdFlPZmZzZXQKCQkJCQkpOwoJfQoKCS8qKgoJICogR2V0IHRoZSBjZWxsIGFkZHJlc3Mgd2hlcmUgdGhlIHRvcCBsZWZ0IG9mIHRoZSBjaGFydCBpcyBmaXhlZAoJICoKCSAqIEByZXR1cm4gc3RyaW5nCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRUb3BMZWZ0Q2VsbCgpIHsKCQlyZXR1cm4gJHRoaXMtPl90b3BMZWZ0Q2VsbFJlZjsKCX0KCgkvKioKCSAqIFNldCB0aGUgVG9wIExlZnQgY2VsbCBwb3NpdGlvbiBmb3IgdGhlIGNoYXJ0CgkgKgoJICogQHBhcmFtCXN0cmluZwkkY2VsbAoJICogQHJldHVybiBQSFBFeGNlbF9DaGFydAoJICovCglwdWJsaWMgZnVuY3Rpb24gc2V0VG9wTGVmdENlbGwoJGNlbGwpIHsKCQkkdGhpcy0+X3RvcExlZnRDZWxsUmVmID0gJGNlbGw7CgoJCXJldHVybiAkdGhpczsKCX0KCglwdWJsaWMgZnVuY3Rpb24gc2V0VG9wTGVmdE9mZnNldCgkeE9mZnNldD1udWxsLCR5T2Zmc2V0PW51bGwpIHsKCQlpZiAoIWlzX251bGwoJHhPZmZzZXQpKQoJCQkkdGhpcy0+c2V0VG9wTGVmdFhPZmZzZXQoJHhPZmZzZXQpOwoJCWlmICghaXNfbnVsbCgkeU9mZnNldCkpCgkJCSR0aGlzLT5zZXRUb3BMZWZ0WU9mZnNldCgkeU9mZnNldCk7CgoJCXJldHVybiAkdGhpczsKCX0KCglwdWJsaWMgZnVuY3Rpb24gZ2V0VG9wTGVmdE9mZnNldCgpIHsKCQlyZXR1cm4gYXJyYXkoICdYJyA9PiAkdGhpcy0+X3RvcExlZnRYT2Zmc2V0LAoJCQkJCSAgJ1knID0+ICR0aGlzLT5fdG9wTGVmdFlPZmZzZXQKCQkJCQkpOwoJfQoKCXB1YmxpYyBmdW5jdGlvbiBzZXRUb3BMZWZ0WE9mZnNldCgkeE9mZnNldCkgewoJCSR0aGlzLT5fdG9wTGVmdFhPZmZzZXQgPSAkeE9mZnNldDsKCgkJcmV0dXJuICR0aGlzOwoJfQoKCXB1YmxpYyBmdW5jdGlvbiBnZXRUb3BMZWZ0WE9mZnNldCgpIHsKCQlyZXR1cm4gJHRoaXMtPl90b3BMZWZ0WE9mZnNldDsKCX0KCglwdWJsaWMgZnVuY3Rpb24gc2V0VG9wTGVmdFlPZmZzZXQoJHlPZmZzZXQpIHsKCQkkdGhpcy0+X3RvcExlZnRZT2Zmc2V0ID0gJHlPZmZzZXQ7CgoJCXJldHVybiAkdGhpczsKCX0KCglwdWJsaWMgZnVuY3Rpb24gZ2V0VG9wTGVmdFlPZmZzZXQoKSB7CgkJcmV0dXJuICR0aGlzLT5fdG9wTGVmdFlPZmZzZXQ7Cgl9CgoJLyoqCgkgKiBTZXQgdGhlIEJvdHRvbSBSaWdodCBwb3NpdGlvbiBvZiB0aGUgY2hhcnQKCSAqCgkgKiBAcGFyYW0Jc3RyaW5nCSRjZWxsCgkgKiBAcGFyYW0JaW50ZWdlcgkkeE9mZnNldAoJICogQHBhcmFtCWludGVnZXIJJHlPZmZzZXQKCSAqIEByZXR1cm4gUEhQRXhjZWxfQ2hhcnQKCSAqLwoJcHVibGljIGZ1bmN0aW9uIHNldEJvdHRvbVJpZ2h0UG9zaXRpb24oJGNlbGwsICR4T2Zmc2V0PW51bGwsICR5T2Zmc2V0PW51bGwpIHsKCQkkdGhpcy0+X2JvdHRvbVJpZ2h0Q2VsbFJlZiA9ICRjZWxsOwoJCWlmICghaXNfbnVsbCgkeE9mZnNldCkpCgkJCSR0aGlzLT5zZXRCb3R0b21SaWdodFhPZmZzZXQoJHhPZmZzZXQpOwoJCWlmICghaXNfbnVsbCgkeU9mZnNldCkpCgkJCSR0aGlzLT5zZXRCb3R0b21SaWdodFlPZmZzZXQoJHlPZmZzZXQpOwoKCQlyZXR1cm4gJHRoaXM7Cgl9CgoJLyoqCgkgKiBHZXQgdGhlIGJvdHRvbSByaWdodCBwb3NpdGlvbiBvZiB0aGUgY2hhcnQKCSAqCgkgKiBAcmV0dXJuIGFycmF5CWFuIGFzc29jaWF0aXZlIGFycmF5IGNvbnRhaW5pbmcgdGhlIGNlbGwgYWRkcmVzcywgWC1PZmZzZXQgYW5kIFktT2Zmc2V0IGZyb20gdGhlIHRvcCBsZWZ0IG9mIHRoYXQgY2VsbAoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0Qm90dG9tUmlnaHRQb3NpdGlvbigpIHsKCQlyZXR1cm4gYXJyYXkoICdjZWxsJwk9PiAkdGhpcy0+X2JvdHRvbVJpZ2h0Q2VsbFJlZiwKCQkJCQkgICd4T2Zmc2V0Jwk9PiAkdGhpcy0+X2JvdHRvbVJpZ2h0WE9mZnNldCwKCQkJCQkgICd5T2Zmc2V0Jwk9PiAkdGhpcy0+X2JvdHRvbVJpZ2h0WU9mZnNldAoJCQkJCSk7Cgl9CgoJcHVibGljIGZ1bmN0aW9uIHNldEJvdHRvbVJpZ2h0Q2VsbCgkY2VsbCkgewoJCSR0aGlzLT5fYm90dG9tUmlnaHRDZWxsUmVmID0gJGNlbGw7CgoJCXJldHVybiAkdGhpczsKCX0KCgkvKioKCSAqIEdldCB0aGUgY2VsbCBhZGRyZXNzIHdoZXJlIHRoZSBib3R0b20gcmlnaHQgb2YgdGhlIGNoYXJ0IGlzIGZpeGVkCgkgKgoJICogQHJldHVybiBzdHJpbmcKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldEJvdHRvbVJpZ2h0Q2VsbCgpIHsKCQlyZXR1cm4gJHRoaXMtPl9ib3R0b21SaWdodENlbGxSZWY7Cgl9CgoJcHVibGljIGZ1bmN0aW9uIHNldEJvdHRvbVJpZ2h0T2Zmc2V0KCR4T2Zmc2V0PW51bGwsJHlPZmZzZXQ9bnVsbCkgewoJCWlmICghaXNfbnVsbCgkeE9mZnNldCkpCgkJCSR0aGlzLT5zZXRCb3R0b21SaWdodFhPZmZzZXQoJHhPZmZzZXQpOwoJCWlmICghaXNfbnVsbCgkeU9mZnNldCkpCgkJCSR0aGlzLT5zZXRCb3R0b21SaWdodFlPZmZzZXQoJHlPZmZzZXQpOwoKCQlyZXR1cm4gJHRoaXM7Cgl9CgoJcHVibGljIGZ1bmN0aW9uIGdldEJvdHRvbVJpZ2h0T2Zmc2V0KCkgewoJCXJldHVybiBhcnJheSggJ1gnID0+ICR0aGlzLT5fYm90dG9tUmlnaHRYT2Zmc2V0LAoJCQkJCSAgJ1knID0+ICR0aGlzLT5fYm90dG9tUmlnaHRZT2Zmc2V0CgkJCQkJKTsKCX0KCglwdWJsaWMgZnVuY3Rpb24gc2V0Qm90dG9tUmlnaHRYT2Zmc2V0KCR4T2Zmc2V0KSB7CgkJJHRoaXMtPl9ib3R0b21SaWdodFhPZmZzZXQgPSAkeE9mZnNldDsKCgkJcmV0dXJuICR0aGlzOwoJfQoKCXB1YmxpYyBmdW5jdGlvbiBnZXRCb3R0b21SaWdodFhPZmZzZXQoKSB7CgkJcmV0dXJuICR0aGlzLT5fYm90dG9tUmlnaHRYT2Zmc2V0OwoJfQoKCXB1YmxpYyBmdW5jdGlvbiBzZXRCb3R0b21SaWdodFlPZmZzZXQoJHlPZmZzZXQpIHsKCQkkdGhpcy0+X2JvdHRvbVJpZ2h0WU9mZnNldCA9ICR5T2Zmc2V0OwoKCQlyZXR1cm4gJHRoaXM7Cgl9CgoJcHVibGljIGZ1bmN0aW9uIGdldEJvdHRvbVJpZ2h0WU9mZnNldCgpIHsKCQlyZXR1cm4gJHRoaXMtPl9ib3R0b21SaWdodFlPZmZzZXQ7Cgl9CgoKCXB1YmxpYyBmdW5jdGlvbiByZWZyZXNoKCkgewoJCWlmICgkdGhpcy0+X3dvcmtzaGVldCAhPT0gTlVMTCkgewoJCQkkdGhpcy0+X3Bsb3RBcmVhLT5yZWZyZXNoKCR0aGlzLT5fd29ya3NoZWV0KTsKCQl9Cgl9CgoJcHVibGljIGZ1bmN0aW9uIHJlbmRlcigkb3V0cHV0RGVzdGluYXRpb24gPSBudWxsKSB7CgkJJGxpYnJhcnlOYW1lID0gUEhQRXhjZWxfU2V0dGluZ3M6OmdldENoYXJ0UmVuZGVyZXJOYW1lKCk7CgkJaWYgKGlzX251bGwoJGxpYnJhcnlOYW1lKSkgewoJCQlyZXR1cm4gZmFsc2U7CgkJfQoJCS8vCUVuc3VyZSB0aGF0IGRhdGEgc2VyaWVzIHZhbHVlcyBhcmUgdXAtdG8tZGF0ZSBiZWZvcmUgd2UgcmVuZGVyCgkJJHRoaXMtPnJlZnJlc2goKTsKCgkJJGxpYnJhcnlQYXRoID0gUEhQRXhjZWxfU2V0dGluZ3M6OmdldENoYXJ0UmVuZGVyZXJQYXRoKCk7CgkJJGluY2x1ZGVQYXRoID0gc3RyX3JlcGxhY2UoJ1xcJywnLycsZ2V0X2luY2x1ZGVfcGF0aCgpKTsKCQkkcmVuZGVyZXJQYXRoID0gc3RyX3JlcGxhY2UoJ1xcJywnLycsJGxpYnJhcnlQYXRoKTsKCQlpZiAoc3RycG9zKCRyZW5kZXJlclBhdGgsJGluY2x1ZGVQYXRoKSA9PT0gZmFsc2UpIHsKCQkJc2V0X2luY2x1ZGVfcGF0aChnZXRfaW5jbHVkZV9wYXRoKCkgLiBQQVRIX1NFUEFSQVRPUiAuICRsaWJyYXJ5UGF0aCk7CgkJfQoKCQkkcmVuZGVyZXJOYW1lID0gJ1BIUEV4Y2VsX0NoYXJ0X1JlbmRlcmVyXycuJGxpYnJhcnlOYW1lOwoJCSRyZW5kZXJlciA9IG5ldyAkcmVuZGVyZXJOYW1lKCR0aGlzKTsKCgkJaWYgKCRvdXRwdXREZXN0aW5hdGlvbiA9PSAncGhwOi8vb3V0cHV0JykgewoJCQkkb3V0cHV0RGVzdGluYXRpb24gPSBudWxsOwoJCX0KCQlyZXR1cm4gJHJlbmRlcmVyLT5yZW5kZXIoJG91dHB1dERlc3RpbmF0aW9uKTsKCX0KCn0K]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Chart/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Chart/DataSeries.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIFBIUEV4Y2VsCiAqCiAqIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICoKICogQGNhdGVnb3J5CVBIUEV4Y2VsCiAqIEBwYWNrYWdlCQlQSFBFeGNlbF9DaGFydAogKiBAY29weXJpZ2h0CUNvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwgKGh0dHA6Ly93d3cuY29kZXBsZXguY29tL1BIUEV4Y2VsKQogKiBAbGljZW5zZQkJaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL29sZC1saWNlbnNlcy9sZ3BsLTIuMS50eHQJTEdQTAogKiBAdmVyc2lvbgkxLjcuNywgMjAxMi0wNS0xOQogKi8KCgovKioKICogUEhQRXhjZWxfQ2hhcnRfRGF0YVNlcmllcwogKgogKiBAY2F0ZWdvcnkJUEhQRXhjZWwKICogQHBhY2thZ2UJCVBIUEV4Y2VsX0NoYXJ0CiAqIEBjb3B5cmlnaHQJQ29weXJpZ2h0IChjKSAyMDA2IC0gMjAxMiBQSFBFeGNlbCAoaHR0cDovL3d3dy5jb2RlcGxleC5jb20vUEhQRXhjZWwpCiAqLwpjbGFzcyBQSFBFeGNlbF9DaGFydF9EYXRhU2VyaWVzCnsKCgljb25zdCBUWVBFX0JBUkNIQVJUCQkJPSAnYmFyQ2hhcnQnOwoJY29uc3QgVFlQRV9CQVJDSEFSVF8zRAkJPSAnYmFyM0RDaGFydCc7Cgljb25zdCBUWVBFX0xJTkVDSEFSVAkJPSAnbGluZUNoYXJ0JzsKCWNvbnN0IFRZUEVfTElORUNIQVJUXzNECQk9ICdsaW5lM0RDaGFydCc7Cgljb25zdCBUWVBFX0FSRUFDSEFSVAkJPSAnYXJlYUNoYXJ0JzsKCWNvbnN0IFRZUEVfQVJFQUNIQVJUXzNECQk9ICdhcmVhM0RDaGFydCc7Cgljb25zdCBUWVBFX1BJRUNIQVJUCQkJPSAncGllQ2hhcnQnOwoJY29uc3QgVFlQRV9QSUVDSEFSVF8zRAkJPSAncGllM0RDaGFydCc7Cgljb25zdCBUWVBFX0RPVUdIVE5VVENIQVJUCT0gJ2RvdWdobnV0Q2hhcnQnOwoJY29uc3QgVFlQRV9ET05VVENIQVJUCQk9IHNlbGY6OlRZUEVfRE9VR0hUTlVUQ0hBUlQ7CS8vCVN5bm9ueW0KCWNvbnN0IFRZUEVfU0NBVFRFUkNIQVJUCQk9ICdzY2F0dGVyQ2hhcnQnOwoJY29uc3QgVFlQRV9TVVJGQUNFQ0hBUlQJCT0gJ3N1cmZhY2VDaGFydCc7Cgljb25zdCBUWVBFX1NVUkZBQ0VDSEFSVF8zRAk9ICdzdXJmYWNlM0RDaGFydCc7Cgljb25zdCBUWVBFX1JBREFSQ0hBUlQJCT0gJ3JhZGFyQ2hhcnQnOwoJY29uc3QgVFlQRV9CVUJCTEVDSEFSVAkJPSAnYnViYmxlQ2hhcnQnOwoJY29uc3QgVFlQRV9TVE9DS0NIQVJUCQk9ICdzdG9ja0NoYXJ0JzsKCgljb25zdCBHUk9VUElOR19DTFVTVEVSRUQJCQk9ICdjbHVzdGVyZWQnOwoJY29uc3QgR1JPVVBJTkdfU1RBQ0tFRAkJCQk9ICdzdGFja2VkJzsKCWNvbnN0IEdST1VQSU5HX1BFUkNFTlRfU1RBQ0tFRAkJPSAncGVyY2VudFN0YWNrZWQnOwoJY29uc3QgR1JPVVBJTkdfU1RBTkRBUkQJCQkJPSAnc3RhbmRhcmQnOwoKCWNvbnN0IERJUkVDVElPTl9CQVIJCQk9ICdiYXInOwoJY29uc3QgRElSRUNUSU9OX0hPUklaT05UQUwJPSBzZWxmOjpESVJFQ1RJT05fQkFSOwoJY29uc3QgRElSRUNUSU9OX0NPTAkJCT0gJ2NvbCc7Cgljb25zdCBESVJFQ1RJT05fQ09MVU1OCQk9IHNlbGY6OkRJUkVDVElPTl9DT0w7Cgljb25zdCBESVJFQ1RJT05fVkVSVElDQUwJPSBzZWxmOjpESVJFQ1RJT05fQ09MOwoKCWNvbnN0IFNUWUxFX0xJTkVNQVJLRVIJCT0gJ2xpbmVNYXJrZXInOwoJY29uc3QgU1RZTEVfU01PT1RITUFSS0VSCT0gJ3Ntb290aE1hcmtlcic7Cgljb25zdCBTVFlMRV9NQVJLRVIJCQk9ICdtYXJrZXInOwoJY29uc3QgU1RZTEVfRklMTEVECQkJPSAnZmlsbGVkJzsKCgoJLyoqCgkgKiBTZXJpZXMgUGxvdCBUeXBlCgkgKgoJICogQHZhciBzdHJpbmcKCSAqLwoJcHJpdmF0ZSAkX3Bsb3RUeXBlID0gbnVsbDsKCgkvKioKCSAqIFBsb3QgR3JvdXBpbmcgVHlwZQoJICoKCSAqIEB2YXIgYm9vbGVhbgoJICovCglwcml2YXRlICRfcGxvdEdyb3VwaW5nID0gbnVsbDsKCgkvKioKCSAqIFBsb3QgRGlyZWN0aW9uCgkgKgoJICogQHZhciBib29sZWFuCgkgKi8KCXByaXZhdGUgJF9wbG90RGlyZWN0aW9uID0gbnVsbDsKCgkvKioKCSAqIFBsb3QgU3R5bGUKCSAqCgkgKiBAdmFyIHN0cmluZwoJICovCglwcml2YXRlICRfcGxvdFN0eWxlID0gbnVsbDsKCgkvKioKCSAqIE9yZGVyIG9mIHBsb3RzIGluIFNlcmllcwoJICoKCSAqIEB2YXIgYXJyYXkgb2YgaW50ZWdlcgoJICovCglwcml2YXRlICRfcGxvdE9yZGVyID0gYXJyYXkoKTsKCgkvKioKCSAqIFBsb3QgTGFiZWwKCSAqCgkgKiBAdmFyIGFycmF5IG9mIFBIUEV4Y2VsX0NoYXJ0X0RhdGFTZXJpZXNWYWx1ZXMKCSAqLwoJcHJpdmF0ZSAkX3Bsb3RMYWJlbCA9IGFycmF5KCk7CgoJLyoqCgkgKiBQbG90IENhdGVnb3J5CgkgKgoJICogQHZhciBhcnJheSBvZiBQSFBFeGNlbF9DaGFydF9EYXRhU2VyaWVzVmFsdWVzCgkgKi8KCXByaXZhdGUgJF9wbG90Q2F0ZWdvcnkgPSBhcnJheSgpOwoKCS8qKgoJICogU21vb3RoIExpbmUKCSAqCgkgKiBAdmFyIHN0cmluZwoJICovCglwcml2YXRlICRfc21vb3RoTGluZSA9IG51bGw7CgoJLyoqCgkgKiBQbG90IFZhbHVlcwoJICoKCSAqIEB2YXIgYXJyYXkgb2YgUEhQRXhjZWxfQ2hhcnRfRGF0YVNlcmllc1ZhbHVlcwoJICovCglwcml2YXRlICRfcGxvdFZhbHVlcyA9IGFycmF5KCk7CgoJLyoqCgkgKiBDcmVhdGUgYSBuZXcgUEhQRXhjZWxfQ2hhcnRfRGF0YVNlcmllcwoJICovCglwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJHBsb3RUeXBlID0gbnVsbCwgJHBsb3RHcm91cGluZyA9IG51bGwsICRwbG90T3JkZXIgPSBhcnJheSgpLCAkcGxvdExhYmVsID0gYXJyYXkoKSwgJHBsb3RDYXRlZ29yeSA9IGFycmF5KCksICRwbG90VmFsdWVzID0gYXJyYXkoKSwgJHNtb290aExpbmUgPSBudWxsLCAkcGxvdFN0eWxlID0gbnVsbCkKCXsKCQkkdGhpcy0+X3Bsb3RUeXBlID0gJHBsb3RUeXBlOwoJCSR0aGlzLT5fcGxvdEdyb3VwaW5nID0gJHBsb3RHcm91cGluZzsKCQkkdGhpcy0+X3Bsb3RPcmRlciA9ICRwbG90T3JkZXI7CgkJJGtleXMgPSBhcnJheV9rZXlzKCRwbG90VmFsdWVzKTsKCQkkdGhpcy0+X3Bsb3RWYWx1ZXMgPSAkcGxvdFZhbHVlczsKCQlpZiAoKGNvdW50KCRwbG90TGFiZWwpID09IDApIHx8IChpc19udWxsKCRwbG90TGFiZWxbJGtleXNbMF1dKSkpIHsKCQkJJHBsb3RMYWJlbFska2V5c1swXV0gPSBuZXcgUEhQRXhjZWxfQ2hhcnRfRGF0YVNlcmllc1ZhbHVlcygpOwoJCX0KCQkkdGhpcy0+X3Bsb3RMYWJlbCA9ICRwbG90TGFiZWw7CgkJaWYgKChjb3VudCgkcGxvdENhdGVnb3J5KSA9PSAwKSB8fCAoaXNfbnVsbCgkcGxvdENhdGVnb3J5WyRrZXlzWzBdXSkpKSB7CgkJCSRwbG90Q2F0ZWdvcnlbJGtleXNbMF1dID0gbmV3IFBIUEV4Y2VsX0NoYXJ0X0RhdGFTZXJpZXNWYWx1ZXMoKTsKCQl9CgkJJHRoaXMtPl9wbG90Q2F0ZWdvcnkgPSAkcGxvdENhdGVnb3J5OwoJCSR0aGlzLT5fc21vb3RoTGluZSA9ICRzbW9vdGhMaW5lOwoJCSR0aGlzLT5fcGxvdFN0eWxlID0gJHBsb3RTdHlsZTsKCX0KCgkvKioKCSAqIEdldCBQbG90IFR5cGUKCSAqCgkgKiBAcmV0dXJuIHN0cmluZwoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0UGxvdFR5cGUoKSB7CgkJcmV0dXJuICR0aGlzLT5fcGxvdFR5cGU7Cgl9CgoJLyoqCgkgKiBTZXQgUGxvdCBUeXBlCgkgKgoJICogQHBhcmFtIHN0cmluZyAkcGxvdFR5cGUKCSAqLwoJcHVibGljIGZ1bmN0aW9uIHNldFBsb3RUeXBlKCRwbG90VHlwZSA9ICcnKSB7CgkJJHRoaXMtPl9wbG90VHlwZSA9ICRwbG90VHlwZTsKCX0KCgkvKioKCSAqIEdldCBQbG90IEdyb3VwaW5nIFR5cGUKCSAqCgkgKiBAcmV0dXJuIHN0cmluZwoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0UGxvdEdyb3VwaW5nKCkgewoJCXJldHVybiAkdGhpcy0+X3Bsb3RHcm91cGluZzsKCX0KCgkvKioKCSAqIFNldCBQbG90IEdyb3VwaW5nIFR5cGUKCSAqCgkgKiBAcGFyYW0gc3RyaW5nICRncm91cGluZ1R5cGUKCSAqLwoJcHVibGljIGZ1bmN0aW9uIHNldFBsb3RHcm91cGluZygkZ3JvdXBpbmdUeXBlID0gbnVsbCkgewoJCSR0aGlzLT5fcGxvdEdyb3VwaW5nID0gJGdyb3VwaW5nVHlwZTsKCX0KCgkvKioKCSAqIEdldCBQbG90IERpcmVjdGlvbgoJICoKCSAqIEByZXR1cm4gc3RyaW5nCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRQbG90RGlyZWN0aW9uKCkgewoJCXJldHVybiAkdGhpcy0+X3Bsb3REaXJlY3Rpb247Cgl9CgoJLyoqCgkgKiBTZXQgUGxvdCBEaXJlY3Rpb24KCSAqCgkgKiBAcGFyYW0gc3RyaW5nICRwbG90RGlyZWN0aW9uCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBzZXRQbG90RGlyZWN0aW9uKCRwbG90RGlyZWN0aW9uID0gbnVsbCkgewoJCSR0aGlzLT5fcGxvdERpcmVjdGlvbiA9ICRwbG90RGlyZWN0aW9uOwoJfQoKCS8qKgoJICogR2V0IFBsb3QgT3JkZXIKCSAqCgkgKiBAcmV0dXJuIHN0cmluZwoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0UGxvdE9yZGVyKCkgewoJCXJldHVybiAkdGhpcy0+X3Bsb3RPcmRlcjsKCX0KCgkvKioKCSAqIEdldCBQbG90IExhYmVscwoJICoKCSAqIEByZXR1cm4gYXJyYXkgb2YgUEhQRXhjZWxfQ2hhcnRfRGF0YVNlcmllc1ZhbHVlcwoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0UGxvdExhYmVscygpIHsKCQlyZXR1cm4gJHRoaXMtPl9wbG90TGFiZWw7Cgl9CgoJLyoqCgkgKiBHZXQgUGxvdCBMYWJlbCBieSBJbmRleAoJICoKCSAqIEByZXR1cm4gUEhQRXhjZWxfQ2hhcnRfRGF0YVNlcmllc1ZhbHVlcwoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0UGxvdExhYmVsQnlJbmRleCgkaW5kZXgpIHsKCQkka2V5cyA9IGFycmF5X2tleXMoJHRoaXMtPl9wbG90TGFiZWwpOwoJCWlmIChpbl9hcnJheSgkaW5kZXgsJGtleXMpKSB7CgkJCXJldHVybiAkdGhpcy0+X3Bsb3RMYWJlbFskaW5kZXhdOwoJCX0gZWxzZWlmKGlzc2V0KCRrZXlzWyRpbmRleF0pKSB7CgkJCXJldHVybiAkdGhpcy0+X3Bsb3RMYWJlbFska2V5c1skaW5kZXhdXTsKCQl9CgkJcmV0dXJuIGZhbHNlOwoJfQoKCS8qKgoJICogR2V0IFBsb3QgQ2F0ZWdvcmllcwoJICoKCSAqIEByZXR1cm4gYXJyYXkgb2YgUEhQRXhjZWxfQ2hhcnRfRGF0YVNlcmllc1ZhbHVlcwoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0UGxvdENhdGVnb3JpZXMoKSB7CgkJcmV0dXJuICR0aGlzLT5fcGxvdENhdGVnb3J5OwoJfQoKCS8qKgoJICogR2V0IFBsb3QgQ2F0ZWdvcnkgYnkgSW5kZXgKCSAqCgkgKiBAcmV0dXJuIFBIUEV4Y2VsX0NoYXJ0X0RhdGFTZXJpZXNWYWx1ZXMKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldFBsb3RDYXRlZ29yeUJ5SW5kZXgoJGluZGV4KSB7CgkJJGtleXMgPSBhcnJheV9rZXlzKCR0aGlzLT5fcGxvdENhdGVnb3J5KTsKCQlpZiAoaW5fYXJyYXkoJGluZGV4LCRrZXlzKSkgewoJCQlyZXR1cm4gJHRoaXMtPl9wbG90Q2F0ZWdvcnlbJGluZGV4XTsKCQl9IGVsc2VpZihpc3NldCgka2V5c1skaW5kZXhdKSkgewoJCQlyZXR1cm4gJHRoaXMtPl9wbG90Q2F0ZWdvcnlbJGtleXNbJGluZGV4XV07CgkJfQoJCXJldHVybiBmYWxzZTsKCX0KCgkvKioKCSAqIEdldCBQbG90IFN0eWxlCgkgKgoJICogQHJldHVybiBzdHJpbmcKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldFBsb3RTdHlsZSgpIHsKCQlyZXR1cm4gJHRoaXMtPl9wbG90U3R5bGU7Cgl9CgoJLyoqCgkgKiBTZXQgUGxvdCBTdHlsZQoJICoKCSAqIEBwYXJhbSBzdHJpbmcgJHBsb3RTdHlsZQoJICovCglwdWJsaWMgZnVuY3Rpb24gc2V0UGxvdFN0eWxlKCRwbG90U3R5bGUgPSBudWxsKSB7CgkJJHRoaXMtPl9wbG90U3R5bGUgPSAkcGxvdFN0eWxlOwoJfQoKCS8qKgoJICogR2V0IFBsb3QgVmFsdWVzCgkgKgoJICogQHJldHVybiBhcnJheSBvZiBQSFBFeGNlbF9DaGFydF9EYXRhU2VyaWVzVmFsdWVzCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRQbG90VmFsdWVzKCkgewoJCXJldHVybiAkdGhpcy0+X3Bsb3RWYWx1ZXM7Cgl9CgoJLyoqCgkgKiBHZXQgUGxvdCBWYWx1ZXMgYnkgSW5kZXgKCSAqCgkgKiBAcmV0dXJuIFBIUEV4Y2VsX0NoYXJ0X0RhdGFTZXJpZXNWYWx1ZXMKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldFBsb3RWYWx1ZXNCeUluZGV4KCRpbmRleCkgewoJCSRrZXlzID0gYXJyYXlfa2V5cygkdGhpcy0+X3Bsb3RWYWx1ZXMpOwoJCWlmIChpbl9hcnJheSgkaW5kZXgsJGtleXMpKSB7CgkJCXJldHVybiAkdGhpcy0+X3Bsb3RWYWx1ZXNbJGluZGV4XTsKCQl9IGVsc2VpZihpc3NldCgka2V5c1skaW5kZXhdKSkgewoJCQlyZXR1cm4gJHRoaXMtPl9wbG90VmFsdWVzWyRrZXlzWyRpbmRleF1dOwoJCX0KCQlyZXR1cm4gZmFsc2U7Cgl9CgoJLyoqCgkgKiBHZXQgTnVtYmVyIG9mIFBsb3QgU2VyaWVzCgkgKgoJICogQHJldHVybiBpbnRlZ2VyCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRQbG90U2VyaWVzQ291bnQoKSB7CgkJcmV0dXJuIGNvdW50KCR0aGlzLT5fcGxvdFZhbHVlcyk7Cgl9CgoJLyoqCgkgKiBHZXQgU21vb3RoIExpbmUKCSAqCgkgKiBAcmV0dXJuIGJvb2xlYW4KCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldFNtb290aExpbmUoKSB7CgkJcmV0dXJuICR0aGlzLT5fc21vb3RoTGluZTsKCX0KCgkvKioKCSAqIFNldCBTbW9vdGggTGluZQoJICoKCSAqIEBwYXJhbSBib29sZWFuICRzbW9vdGhMaW5lCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBzZXRTbW9vdGhMaW5lKCRzbW9vdGhMaW5lID0gVFJVRSkgewoJCSR0aGlzLT5fc21vb3RoTGluZSA9ICRzbW9vdGhMaW5lOwoJfQoKCXB1YmxpYyBmdW5jdGlvbiByZWZyZXNoKFBIUEV4Y2VsX1dvcmtzaGVldCAkd29ya3NoZWV0KSB7CgkgICAgZm9yZWFjaCgkdGhpcy0+X3Bsb3RWYWx1ZXMgYXMgJHBsb3RWYWx1ZXMpIHsKCQkJJHBsb3RWYWx1ZXMtPnJlZnJlc2goJHdvcmtzaGVldCk7CgkJfQoJfQoKfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Chart/DataSeriesValues.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIFBIUEV4Y2VsCiAqCiAqIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICoKICogQGNhdGVnb3J5CVBIUEV4Y2VsCiAqIEBwYWNrYWdlCQlQSFBFeGNlbF9DaGFydAogKiBAY29weXJpZ2h0CUNvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwgKGh0dHA6Ly93d3cuY29kZXBsZXguY29tL1BIUEV4Y2VsKQogKiBAbGljZW5zZQkJaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL29sZC1saWNlbnNlcy9sZ3BsLTIuMS50eHQJTEdQTAogKiBAdmVyc2lvbgkJMS43LjcsIDIwMTItMDUtMTkKICovCgoKLyoqCiAqIFBIUEV4Y2VsX0NoYXJ0X0RhdGFTZXJpZXNWYWx1ZXMKICoKICogQGNhdGVnb3J5CVBIUEV4Y2VsCiAqIEBwYWNrYWdlCQlQSFBFeGNlbF9DaGFydAogKiBAY29weXJpZ2h0CUNvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwgKGh0dHA6Ly93d3cuY29kZXBsZXguY29tL1BIUEV4Y2VsKQogKi8KY2xhc3MgUEhQRXhjZWxfQ2hhcnRfRGF0YVNlcmllc1ZhbHVlcwp7CgoJLyoqCgkgKiBTZXJpZXMgRGF0YSBUeXBlCgkgKgoJICogQHZhcglzdHJpbmcKCSAqLwoJcHJpdmF0ZSAkX2RhdGFUeXBlID0gbnVsbDsKCgkvKioKCSAqIFNlcmllcyBEYXRhIFNvdXJjZQoJICoKCSAqIEB2YXIJc3RyaW5nCgkgKi8KCXByaXZhdGUgJF9kYXRhU291cmNlID0gbnVsbDsKCgkvKioKCSAqIEZvcm1hdCBDb2RlCgkgKgoJICogQHZhcglzdHJpbmcKCSAqLwoJcHJpdmF0ZSAkX2Zvcm1hdENvZGUgPSBudWxsOwoKCS8qKgoJICogU2VyaWVzIFBvaW50IE1hcmtlcgoJICoKCSAqIEB2YXIJc3RyaW5nCgkgKi8KCXByaXZhdGUgJF9tYXJrZXIgPSBudWxsOwoKCS8qKgoJICogUG9pbnQgQ291bnQgKFRoZSBudW1iZXIgb2YgZGF0YXBvaW50cyBpbiB0aGUgZGF0YXNlcmllcykKCSAqCgkgKiBAdmFyCWludGVnZXIKCSAqLwoJcHJpdmF0ZSAkX3BvaW50Q291bnQgPSAwOwoKCS8qKgoJICogRGF0YSBWYWx1ZXMKCSAqCgkgKiBAdmFyCWFycmF5IG9mIG1peGVkCgkgKi8KCXByaXZhdGUgJF9kYXRhVmFsdWVzID0gYXJyYXkoKTsKCgkvKioKCSAqIENyZWF0ZSBhIG5ldyBQSFBFeGNlbF9DaGFydF9EYXRhU2VyaWVzVmFsdWVzIG9iamVjdAoJICovCglwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJGRhdGFUeXBlID0gbnVsbCwgJGRhdGFTb3VyY2UgPSBudWxsLCAkZm9ybWF0Q29kZSA9IG51bGwsICRwb2ludENvdW50ID0gMCwgJGRhdGFWYWx1ZXMgPSBhcnJheSgpLCAkbWFya2VyID0gbnVsbCkKCXsKCQkkdGhpcy0+X2RhdGFUeXBlID0gJGRhdGFUeXBlOwoJCSR0aGlzLT5fZGF0YVNvdXJjZSA9ICRkYXRhU291cmNlOwoJCSR0aGlzLT5fZm9ybWF0Q29kZSA9ICRmb3JtYXRDb2RlOwoJCSR0aGlzLT5fcG9pbnRDb3VudCA9ICRwb2ludENvdW50OwoJCSR0aGlzLT5fZGF0YVZhbHVlcyA9ICRkYXRhVmFsdWVzOwoJCSR0aGlzLT5fbWFya2VyID0gJG1hcmtlcjsKCX0KCgkvKioKCSAqIEdldCBTZXJpZXMgRGF0YSBUeXBlCgkgKgoJICogQHJldHVybglzdHJpbmcKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldERhdGFUeXBlKCkgewoJCXJldHVybiAkdGhpcy0+X2RhdGFUeXBlOwoJfQoKCS8qKgoJICogU2V0IFNlcmllcyBEYXRhIFR5cGUKCSAqCgkgKiBAcGFyYW0Jc3RyaW5nCSRkYXRhVHlwZQoJICogQHJldHVybglQSFBFeGNlbF9DaGFydF9EYXRhU2VyaWVzVmFsdWVzCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBzZXREYXRhVHlwZSgkZGF0YVR5cGUgPSAnTnVtYmVyJykgewoJCSR0aGlzLT5fZGF0YVR5cGUgPSAkZGF0YVR5cGU7CgoJCXJldHVybiAkdGhpczsKCX0KCgkvKioKCSAqIEdldCBTZXJpZXMgRGF0YSBTb3VyY2UgKGZvcm11bGEpCgkgKgoJICogQHJldHVybglzdHJpbmcKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldERhdGFTb3VyY2UoKSB7CgkJcmV0dXJuICR0aGlzLT5fZGF0YVNvdXJjZTsKCX0KCgkvKioKCSAqIFNldCBTZXJpZXMgRGF0YSBTb3VyY2UgKGZvcm11bGEpCgkgKgoJICogQHBhcmFtCXN0cmluZwkkZGF0YVNvdXJjZQoJICogQHJldHVybglQSFBFeGNlbF9DaGFydF9EYXRhU2VyaWVzVmFsdWVzCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBzZXREYXRhU291cmNlKCRkYXRhU291cmNlID0gbnVsbCwgJHJlZnJlc2hEYXRhVmFsdWVzID0gdHJ1ZSkgewoJCSR0aGlzLT5fZGF0YVNvdXJjZSA9ICRkYXRhU291cmNlOwoKCQlpZiAoJHJlZnJlc2hEYXRhVmFsdWVzKSB7CgkJCS8vCVRPIERPCgkJfQoKCQlyZXR1cm4gJHRoaXM7Cgl9CgoJLyoqCgkgKiBHZXQgUG9pbnQgTWFya2VyCgkgKgoJICogQHJldHVybiBzdHJpbmcKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldFBvaW50TWFya2VyKCkgewoJCXJldHVybiAkdGhpcy0+X21hcmtlcjsKCX0KCgkvKioKCSAqIFNldCBQb2ludCBNYXJrZXIKCSAqCgkgKiBAcGFyYW0Jc3RyaW5nCSRtYXJrZXIKCSAqIEByZXR1cm4JUEhQRXhjZWxfQ2hhcnRfRGF0YVNlcmllc1ZhbHVlcwoJICovCglwdWJsaWMgZnVuY3Rpb24gc2V0UG9pbnRNYXJrZXIoJG1hcmtlciA9IG51bGwpIHsKCQkkdGhpcy0+X21hcmtlciA9ICRtYXJrZXI7CgoJCXJldHVybiAkdGhpczsKCX0KCgkvKioKCSAqIEdldCBTZXJpZXMgRm9ybWF0IENvZGUKCSAqCgkgKiBAcmV0dXJuCXN0cmluZwoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0Rm9ybWF0Q29kZSgpIHsKCQlyZXR1cm4gJHRoaXMtPl9mb3JtYXRDb2RlOwoJfQoKCS8qKgoJICogU2V0IFNlcmllcyBGb3JtYXQgQ29kZQoJICoKCSAqIEBwYXJhbQlzdHJpbmcJJGZvcm1hdENvZGUKCSAqIEByZXR1cm4JUEhQRXhjZWxfQ2hhcnRfRGF0YVNlcmllc1ZhbHVlcwoJICovCglwdWJsaWMgZnVuY3Rpb24gc2V0Rm9ybWF0Q29kZSgkZm9ybWF0Q29kZSA9IG51bGwpIHsKCQkkdGhpcy0+X2Zvcm1hdENvZGUgPSAkZm9ybWF0Q29kZTsKCgkJcmV0dXJuICR0aGlzOwoJfQoKCS8qKgoJICogR2V0IFNlcmllcyBQb2ludCBDb3VudAoJICoKCSAqIEByZXR1cm4JaW50ZWdlcgoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0UG9pbnRDb3VudCgpIHsKCQlyZXR1cm4gJHRoaXMtPl9wb2ludENvdW50OwoJfQoKCS8qKgoJICogSWRlbnRpZnkgaWYgdGhlIERhdGEgU2VyaWVzIGlzIGEgbXVsdGktbGV2ZWwgb3IgYSBzaW1wbGUgc2VyaWVzCgkgKgoJICogQHJldHVybglib29sZWFuCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBpc011bHRpTGV2ZWxTZXJpZXMoKSB7CgkJaWYgKGNvdW50KCR0aGlzLT5fZGF0YVZhbHVlcykgPiAwKSB7CgkJCXJldHVybiBpc19hcnJheSgkdGhpcy0+X2RhdGFWYWx1ZXNbMF0pOwoJCX0KCQlyZXR1cm4gbnVsbDsKCX0KCgkvKioKCSAqIFJldHVybiB0aGUgbGV2ZWwgY291bnQgb2YgYSBtdWx0aS1sZXZlbCBEYXRhIFNlcmllcwoJICoKCSAqIEByZXR1cm4JYm9vbGVhbgoJICovCglwdWJsaWMgZnVuY3Rpb24gbXVsdGlMZXZlbENvdW50KCkgewoJCSRsZXZlbENvdW50ID0gMDsKCQlmb3JlYWNoKCR0aGlzLT5fZGF0YVZhbHVlcyBhcyAkZGF0YVZhbHVlU2V0KSB7CgkJCSRsZXZlbENvdW50ID0gbWF4KCRsZXZlbENvdW50LGNvdW50KCRkYXRhVmFsdWVTZXQpKTsKCQl9CgkJcmV0dXJuICRsZXZlbENvdW50OwoJfQoKCS8qKgoJICogR2V0IFNlcmllcyBEYXRhIFZhbHVlcwoJICoKCSAqIEByZXR1cm4JYXJyYXkgb2YgbWl4ZWQKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldERhdGFWYWx1ZXMoKSB7CgkJcmV0dXJuICR0aGlzLT5fZGF0YVZhbHVlczsKCX0KCgkvKioKCSAqIEdldCB0aGUgZmlyc3QgU2VyaWVzIERhdGEgdmFsdWUKCSAqCgkgKiBAcmV0dXJuCW1peGVkCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXREYXRhVmFsdWUoKSB7CgkJJGNvdW50ID0gY291bnQoJHRoaXMtPl9kYXRhVmFsdWVzKTsKCQlpZiAoJGNvdW50ID09IDApIHsKCQkJcmV0dXJuIG51bGw7CgkJfSBlbHNlaWYgKCRjb3VudCA9PSAxKSB7CgkJCXJldHVybiAkdGhpcy0+X2RhdGFWYWx1ZXNbMF07CgkJfQoJCXJldHVybiAkdGhpcy0+X2RhdGFWYWx1ZXM7Cgl9CgoJLyoqCgkgKiBTZXQgU2VyaWVzIERhdGEgVmFsdWVzCgkgKgoJICogQHBhcmFtCWFycmF5CSRkYXRhVmFsdWVzCgkgKiBAcGFyYW0JYm9vbGVhbgkkcmVmcmVzaERhdGFTb3VyY2UKCSAqCQkJCQlUUlVFIC0gcmVmcmVzaCB0aGUgdmFsdWUgb2YgX2RhdGFTb3VyY2UgYmFzZWQgb24gdGhlIHZhbHVlcyBvZiAkZGF0YVZhbHVlcwoJICoJCQkJCUZBTFNFIC0gZG9uJ3QgY2hhbmdlIHRoZSB2YWx1ZSBvZiBfZGF0YVNvdXJjZQoJICogQHJldHVybglQSFBFeGNlbF9DaGFydF9EYXRhU2VyaWVzVmFsdWVzCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBzZXREYXRhVmFsdWVzKCRkYXRhVmFsdWVzID0gYXJyYXkoKSwgJHJlZnJlc2hEYXRhU291cmNlID0gdHJ1ZSkgewoJCSR0aGlzLT5fZGF0YVZhbHVlcyA9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6ZmxhdHRlbkFycmF5KCRkYXRhVmFsdWVzKTsKCQkkdGhpcy0+X3BvaW50Q291bnQgPSBjb3VudCgkZGF0YVZhbHVlcyk7CgoJCWlmICgkcmVmcmVzaERhdGFTb3VyY2UpIHsKCQkJLy8JVE8gRE8KCQl9CgoJCXJldHVybiAkdGhpczsKCX0KCglwdWJsaWMgZnVuY3Rpb24gcmVmcmVzaChQSFBFeGNlbF9Xb3Jrc2hlZXQgJHdvcmtzaGVldCkgewogICAgICAgIGlmICgkdGhpcy0+X2RhdGFTb3VyY2UgIT09IE5VTEwpIHsKICAgICAgICAJJGNhbGNFbmdpbmUgPSBQSFBFeGNlbF9DYWxjdWxhdGlvbjo6Z2V0SW5zdGFuY2UoKTsKCQkJJHRoaXMtPl9kYXRhVmFsdWVzID0gUEhQRXhjZWxfQ2FsY3VsYXRpb246Ol91bndyYXBSZXN1bHQoCgkJCSAgICAkY2FsY0VuZ2luZS0+X2NhbGN1bGF0ZUZvcm11bGFWYWx1ZSgKCQkJICAgICAgICAkdGhpcy0+X2RhdGFTb3VyY2UKCQkJICAgICkKCQkJKTsKCQl9Cgl9Cgp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Chart/Layout.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIFBIUEV4Y2VsCiAqCiAqIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICoKICogQGNhdGVnb3J5CVBIUEV4Y2VsCiAqIEBwYWNrYWdlCQlQSFBFeGNlbF9DaGFydAogKiBAY29weXJpZ2h0CUNvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwgKGh0dHA6Ly93d3cuY29kZXBsZXguY29tL1BIUEV4Y2VsKQogKiBAbGljZW5zZQkJaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL29sZC1saWNlbnNlcy9sZ3BsLTIuMS50eHQJTEdQTAogKiBAdmVyc2lvbgkJMS43LjcsIDIwMTItMDUtMTkKICovCgoKLyoqCiAqIFBIUEV4Y2VsX0NoYXJ0X0xheW91dAogKgogKiBAY2F0ZWdvcnkJUEhQRXhjZWwKICogQHBhY2thZ2UJCVBIUEV4Y2VsX0NoYXJ0CiAqIEBjb3B5cmlnaHQJQ29weXJpZ2h0IChjKSAyMDA2IC0gMjAxMiBQSFBFeGNlbCAoaHR0cDovL3d3dy5jb2RlcGxleC5jb20vUEhQRXhjZWwpCiAqLwpjbGFzcyBQSFBFeGNlbF9DaGFydF9MYXlvdXQKewoJLyoqCgkgKiBsYXlvdXRUYXJnZXQKCSAqCgkgKiBAdmFyIHN0cmluZwoJICovCglwcml2YXRlICRfbGF5b3V0VGFyZ2V0ID0gbnVsbDsKCgkvKioKCSAqIFggTW9kZQoJICoKCSAqIEB2YXIgc3RyaW5nCgkgKi8KCXByaXZhdGUgJF94TW9kZQkJPSBudWxsOwoKCS8qKgoJICogWSBNb2RlCgkgKgoJICogQHZhciBzdHJpbmcKCSAqLwoJcHJpdmF0ZSAkX3lNb2RlCQk9IG51bGw7CgoJLyoqCgkgKiBYLVBvc2l0aW9uCgkgKgoJICogQHZhciBmbG9hdAoJICovCglwcml2YXRlICRfeFBvcwkJPSBudWxsOwoKCS8qKgoJICogWS1Qb3NpdGlvbgoJICoKCSAqIEB2YXIgZmxvYXQKCSAqLwoJcHJpdmF0ZSAkX3lQb3MJCT0gbnVsbDsKCgkvKioKCSAqIHdpZHRoCgkgKgoJICogQHZhciBmbG9hdAoJICovCglwcml2YXRlICRfd2lkdGgJCT0gbnVsbDsKCgkvKioKCSAqIGhlaWdodAoJICoKCSAqIEB2YXIgZmxvYXQKCSAqLwoJcHJpdmF0ZSAkX2hlaWdodAk9IG51bGw7CgoKCS8qKgoJICogQ3JlYXRlIGEgbmV3IFBIUEV4Y2VsX0NoYXJ0X0xheW91dAoJICovCglwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJGxheW91dD1hcnJheSgpKQoJewoJCWlmIChpc3NldCgkbGF5b3V0WydsYXlvdXRUYXJnZXQnXSkpCXsgJHRoaXMtPl9sYXlvdXRUYXJnZXQJPSAkbGF5b3V0WydsYXlvdXRUYXJnZXQnXTsJfQoJCWlmIChpc3NldCgkbGF5b3V0Wyd4TW9kZSddKSkJCXsgJHRoaXMtPl94TW9kZQkJCT0gJGxheW91dFsneE1vZGUnXTsJCQl9CgkJaWYgKGlzc2V0KCRsYXlvdXRbJ3lNb2RlJ10pKQkJeyAkdGhpcy0+X3lNb2RlCQkJPSAkbGF5b3V0Wyd5TW9kZSddOwkJCX0KCQlpZiAoaXNzZXQoJGxheW91dFsneCddKSkJCQl7ICR0aGlzLT5feFBvcwkJCT0gKGZsb2F0KSAkbGF5b3V0Wyd4J107CQl9CgkJaWYgKGlzc2V0KCRsYXlvdXRbJ3knXSkpCQkJeyAkdGhpcy0+X3lQb3MJCQk9IChmbG9hdCkgJGxheW91dFsneSddOwkJfQoJCWlmIChpc3NldCgkbGF5b3V0Wyd3J10pKQkJCXsgJHRoaXMtPl93aWR0aAkJCT0gKGZsb2F0KSAkbGF5b3V0Wyd3J107CQl9CgkJaWYgKGlzc2V0KCRsYXlvdXRbJ2gnXSkpCQkJeyAkdGhpcy0+X2hlaWdodAkJPSAoZmxvYXQpICRsYXlvdXRbJ2gnXTsJCX0KCX0KCgkvKioKCSAqIEdldCBMYXlvdXQgVGFyZ2V0CgkgKgoJICogQHJldHVybiBzdHJpbmcKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldExheW91dFRhcmdldCgpIHsKCQlyZXR1cm4gJHRoaXMtPl9sYXlvdXRUYXJnZXQ7Cgl9CgoJLyoqCgkgKiBTZXQgTGF5b3V0IFRhcmdldAoJICoKCSAqIEBwYXJhbSBMYXlvdXQgVGFyZ2V0ICR2YWx1ZQoJICovCglwdWJsaWMgZnVuY3Rpb24gc2V0TGF5b3V0VGFyZ2V0KCR2YWx1ZSkgewoJCSR0aGlzLT5fbGF5b3V0VGFyZ2V0ID0gJHZhbHVlOwoJfQoKCS8qKgoJICogR2V0IFgtTW9kZQoJICoKCSAqIEByZXR1cm4gc3RyaW5nCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRYTW9kZSgpIHsKCQlyZXR1cm4gJHRoaXMtPl94TW9kZTsKCX0KCgkvKioKCSAqIFNldCBYLU1vZGUKCSAqCgkgKiBAcGFyYW0gWC1Nb2RlICR2YWx1ZQoJICovCglwdWJsaWMgZnVuY3Rpb24gc2V0WE1vZGUoJHZhbHVlKSB7CgkJJHRoaXMtPl94TW9kZSA9ICR2YWx1ZTsKCX0KCgkvKioKCSAqIEdldCBZLU1vZGUKCSAqCgkgKiBAcmV0dXJuIHN0cmluZwoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0WU1vZGUoKSB7CgkJcmV0dXJuICR0aGlzLT5feE1vZGU7Cgl9CgoJLyoqCgkgKiBTZXQgWS1Nb2RlCgkgKgoJICogQHBhcmFtIFktTW9kZSAkdmFsdWUKCSAqLwoJcHVibGljIGZ1bmN0aW9uIHNldFlNb2RlKCR2YWx1ZSkgewoJCSR0aGlzLT5feE1vZGUgPSAkdmFsdWU7Cgl9CgoJLyoqCgkgKiBHZXQgWC1Qb3NpdGlvbgoJICoKCSAqIEByZXR1cm4gbnVtYmVyCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRYUG9zaXRpb24oKSB7CgkJcmV0dXJuICR0aGlzLT5feFBvczsKCX0KCgkvKioKCSAqIFNldCBYLVBvc2l0aW9uCgkgKgoJICogQHBhcmFtIFgtUG9zaXRpb24gJHZhbHVlCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBzZXRYUG9zaXRpb24oJHZhbHVlKSB7CgkJJHRoaXMtPl94UG9zID0gJHZhbHVlOwoJfQoKCS8qKgoJICogR2V0IFktUG9zaXRpb24KCSAqCgkgKiBAcmV0dXJuIG51bWJlcgoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0WVBvc2l0aW9uKCkgewoJCXJldHVybiAkdGhpcy0+X3lQb3M7Cgl9CgoJLyoqCgkgKiBTZXQgWS1Qb3NpdGlvbgoJICoKCSAqIEBwYXJhbSBZLVBvc2l0aW9uICR2YWx1ZQoJICovCglwdWJsaWMgZnVuY3Rpb24gc2V0WVBvc2l0aW9uKCR2YWx1ZSkgewoJCSR0aGlzLT5feVBvcyA9ICR2YWx1ZTsKCX0KCgkvKioKCSAqIEdldCBXaWR0aAoJICoKCSAqIEByZXR1cm4gbnVtYmVyCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRXaWR0aCgpIHsKCQlyZXR1cm4gJHRoaXMtPl93aWR0aDsKCX0KCgkvKioKCSAqIFNldCBXaWR0aAoJICoKCSAqIEBwYXJhbSBXaWR0aCAkdmFsdWUKCSAqLwoJcHVibGljIGZ1bmN0aW9uIHNldFdpZHRoKCR2YWx1ZSkgewoJCSR0aGlzLT5fd2lkdGggPSAkdmFsdWU7Cgl9CgoJLyoqCgkgKiBHZXQgSGVpZ2h0CgkgKgoJICogQHJldHVybiBudW1iZXIKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldEhlaWdodCgpIHsKCQlyZXR1cm4gJHRoaXMtPl9oZWlnaHQ7Cgl9CgoJLyoqCgkgKiBTZXQgSGVpZ2h0CgkgKgoJICogQHBhcmFtIEhlaWdodCAkdmFsdWUKCSAqLwoJcHVibGljIGZ1bmN0aW9uIHNldEhlaWdodCgkdmFsdWUpIHsKCQkkdGhpcy0+X2hlaWdodCA9ICR2YWx1ZTsKCX0KCn0K]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Chart/Legend.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIFBIUEV4Y2VsCiAqCiAqIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICoKICogQGNhdGVnb3J5CVBIUEV4Y2VsCiAqIEBwYWNrYWdlCQlQSFBFeGNlbF9DaGFydAogKiBAY29weXJpZ2h0CUNvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwgKGh0dHA6Ly93d3cuY29kZXBsZXguY29tL1BIUEV4Y2VsKQogKiBAbGljZW5zZQkJaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL29sZC1saWNlbnNlcy9sZ3BsLTIuMS50eHQJTEdQTAogKiBAdmVyc2lvbgkJMS43LjcsIDIwMTItMDUtMTkKICovCgoKLyoqCiAqIFBIUEV4Y2VsX0NoYXJ0X0xlZ2VuZAogKgogKiBAY2F0ZWdvcnkJUEhQRXhjZWwKICogQHBhY2thZ2UJCVBIUEV4Y2VsX0NoYXJ0CiAqIEBjb3B5cmlnaHQJQ29weXJpZ2h0IChjKSAyMDA2IC0gMjAxMiBQSFBFeGNlbCAoaHR0cDovL3d3dy5jb2RlcGxleC5jb20vUEhQRXhjZWwpCiAqLwpjbGFzcyBQSFBFeGNlbF9DaGFydF9MZWdlbmQKewoJLyoqIExlZ2VuZCBwb3NpdGlvbnMgKi8KCWNvbnN0IHhsTGVnZW5kUG9zaXRpb25Cb3R0b20JPSAtNDEwNzsJLy8JQmVsb3cgdGhlIGNoYXJ0LgoJY29uc3QgeGxMZWdlbmRQb3NpdGlvbkNvcm5lcgk9IDI7CQkvLwlJbiB0aGUgdXBwZXIgcmlnaHQtaGFuZCBjb3JuZXIgb2YgdGhlIGNoYXJ0IGJvcmRlci4KCWNvbnN0IHhsTGVnZW5kUG9zaXRpb25DdXN0b20JPSAtNDE2MTsJLy8JQSBjdXN0b20gcG9zaXRpb24uCgljb25zdCB4bExlZ2VuZFBvc2l0aW9uTGVmdAkJPSAtNDEzMTsJLy8JTGVmdCBvZiB0aGUgY2hhcnQuCgljb25zdCB4bExlZ2VuZFBvc2l0aW9uUmlnaHQJCT0gLTQxNTI7CS8vCVJpZ2h0IG9mIHRoZSBjaGFydC4KCWNvbnN0IHhsTGVnZW5kUG9zaXRpb25Ub3AJCT0gLTQxNjA7CS8vCUFib3ZlIHRoZSBjaGFydC4KCgljb25zdCBQT1NJVElPTl9SSUdIVAk9ICdyJzsKCWNvbnN0IFBPU0lUSU9OX0xFRlQJCT0gJ2wnOwoJY29uc3QgUE9TSVRJT05fQk9UVE9NCT0gJ2InOwoJY29uc3QgUE9TSVRJT05fVE9QCQk9ICd0JzsKCWNvbnN0IFBPU0lUSU9OX1RPUFJJR0hUCT0gJ3RyJzsKCglwcml2YXRlIHN0YXRpYyAkX3Bvc2l0aW9uWHJlZiA9IGFycmF5KCBzZWxmOjp4bExlZ2VuZFBvc2l0aW9uQm90dG9tCT0+IHNlbGY6OlBPU0lUSU9OX0JPVFRPTSwKCQkJCQkJCQkJCSAgIHNlbGY6OnhsTGVnZW5kUG9zaXRpb25Db3JuZXIJPT4gc2VsZjo6UE9TSVRJT05fVE9QUklHSFQsCgkJCQkJCQkJCQkgICBzZWxmOjp4bExlZ2VuZFBvc2l0aW9uQ3VzdG9tCT0+ICc/PycsCgkJCQkJCQkJCQkgICBzZWxmOjp4bExlZ2VuZFBvc2l0aW9uTGVmdAk9PiBzZWxmOjpQT1NJVElPTl9MRUZULAoJCQkJCQkJCQkJICAgc2VsZjo6eGxMZWdlbmRQb3NpdGlvblJpZ2h0CT0+IHNlbGY6OlBPU0lUSU9OX1JJR0hULAoJCQkJCQkJCQkJICAgc2VsZjo6eGxMZWdlbmRQb3NpdGlvblRvcAk9PiBzZWxmOjpQT1NJVElPTl9UT1AKCQkJCQkJCQkJICAgICApOwoKCS8qKgoJICogTGVnZW5kIHBvc2l0aW9uCgkgKgoJICogQHZhcglzdHJpbmcKCSAqLwoJcHJpdmF0ZSAkX3Bvc2l0aW9uID0gc2VsZjo6UE9TSVRJT05fUklHSFQ7CgoJLyoqCgkgKiBBbGxvdyBvdmVybGF5IG9mIG90aGVyIGVsZW1lbnRzPwoJICoKCSAqIEB2YXIJYm9vbGVhbgoJICovCglwcml2YXRlICRfb3ZlcmxheSA9IHRydWU7CgoJLyoqCgkgKiBMZWdlbmQgTGF5b3V0CgkgKgoJICogQHZhcglQSFBFeGNlbF9DaGFydF9MYXlvdXQKCSAqLwoJcHJpdmF0ZSAkX2xheW91dCA9IG51bGw7CgoKCS8qKgoJICoJQ3JlYXRlIGEgbmV3IFBIUEV4Y2VsX0NoYXJ0X0xlZ2VuZAoJICovCglwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJHBvc2l0aW9uID0gbnVsbCwgUEhQRXhjZWxfQ2hhcnRfTGF5b3V0ICRsYXlvdXQgPSBudWxsLCAkb3ZlcmxheT0gZmFsc2UpCgl7CgkJJHRoaXMtPl9wb3NpdGlvbiA9ICRwb3NpdGlvbjsKCQkkdGhpcy0+X2xheW91dCA9ICRsYXlvdXQ7CgkJJHRoaXMtPl9vdmVybGF5ID0gJG92ZXJsYXk7Cgl9CgoJLyoqCgkgKiBHZXQgbGVnZW5kIHBvc2l0aW9uIGFzIGFuIGV4Y2VsIHN0cmluZyB2YWx1ZQoJICoKCSAqIEByZXR1cm4Jc3RyaW5nCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRQb3NpdGlvbigpIHsKCQlyZXR1cm4gJHRoaXMtPl9wb3NpdGlvbjsKCX0KCgkvKioKCSAqIEdldCBsZWdlbmQgcG9zaXRpb24gdXNpbmcgYW4gZXhjZWwgc3RyaW5nIHZhbHVlCgkgKgoJICogQHBhcmFtCXN0cmluZwkkcG9zaXRpb24KCSAqLwoJcHVibGljIGZ1bmN0aW9uIHNldFBvc2l0aW9uKCRwb3NpdGlvbiA9IHNlbGY6OlBPU0lUSU9OX1JJR0hUKSB7CgkJaWYgKCFpbl9hcnJheSgkcG9zaXRpb24sc2VsZjo6JHBvc2l0aW9uWHJlZikpIHsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCgkJJHRoaXMtPl9wb3NpdGlvbiA9ICRwb3NpdGlvbjsKCgkJcmV0dXJuIHRydWU7Cgl9CgoJLyoqCgkgKiBHZXQgbGVnZW5kIHBvc2l0aW9uIGFzIGFuIEV4Y2VsIGludGVybmFsIG51bWVyaWMgdmFsdWUKCSAqCgkgKiBAcmV0dXJuCW51bWJlcgoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0UG9zaXRpb25YTCgpIHsKCQlyZXR1cm4gYXJyYXlfc2VhcmNoKCR0aGlzLT5fcG9zaXRpb24sc2VsZjo6JHBvc2l0aW9uWHJlZik7Cgl9CgoJLyoqCgkgKiBTZXQgbGVnZW5kIHBvc2l0aW9uIHVzaW5nIGFuIEV4Y2VsIGludGVybmFsIG51bWVyaWMgdmFsdWUKCSAqCgkgKiBAcGFyYW0JbnVtYmVyCSRwb3NpdGlvblhMCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBzZXRQb3NpdGlvblhMKCRwb3NpdGlvblhMID0gc2VsZjo6eGxMZWdlbmRQb3NpdGlvblJpZ2h0KSB7CgkJaWYgKCFhcnJheV9rZXlfZXhpc3RzKCRwb3NpdGlvblhMLHNlbGY6OiRwb3NpdGlvblhyZWYpKSB7CgkJCXJldHVybiBmYWxzZTsKCQl9CgoJCSR0aGlzLT5fcG9zaXRpb24gPSBzZWxmOjokcG9zaXRpb25YcmVmWyRwb3NpdGlvblhMXTsKCQlyZXR1cm4gdHJ1ZTsKCX0KCgkvKioKCSAqIEdldCBhbGxvdyBvdmVybGF5IG9mIG90aGVyIGVsZW1lbnRzPwoJICoKCSAqIEByZXR1cm4JYm9vbGVhbgoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0T3ZlcmxheSgpIHsKCQlyZXR1cm4gJHRoaXMtPl9vdmVybGF5OwoJfQoKCS8qKgoJICogU2V0IGFsbG93IG92ZXJsYXkgb2Ygb3RoZXIgZWxlbWVudHM/CgkgKgoJICogQHBhcmFtCWJvb2xlYW4JJHZhbHVlCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBzZXRPdmVybGF5KCR2YWx1ZT1mYWxzZSkgewoJCSR0aGlzLT5fb3ZlcmxheSA9ICR2YWx1ZTsKCX0KCgkvKioKCSAqIEdldCBMYXlvdXQKCSAqCgkgKiBAcmV0dXJuIFBIUEV4Y2VsX0NoYXJ0X0xheW91dAoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0TGF5b3V0KCkgewoJCXJldHVybiAkdGhpcy0+X2xheW91dDsKCX0KCn0K]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Chart/PlotArea.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIFBIUEV4Y2VsCiAqCiAqIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICoKICogQGNhdGVnb3J5CVBIUEV4Y2VsCiAqIEBwYWNrYWdlCQlQSFBFeGNlbF9DaGFydAogKiBAY29weXJpZ2h0CUNvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwgKGh0dHA6Ly93d3cuY29kZXBsZXguY29tL1BIUEV4Y2VsKQogKiBAbGljZW5zZQkJaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL29sZC1saWNlbnNlcy9sZ3BsLTIuMS50eHQJTEdQTAogKiBAdmVyc2lvbgkJMS43LjcsIDIwMTItMDUtMTkKICovCgoKLyoqCiAqIFBIUEV4Y2VsX0NoYXJ0X1Bsb3RBcmVhCiAqCiAqIEBjYXRlZ29yeQlQSFBFeGNlbAogKiBAcGFja2FnZQkJUEhQRXhjZWxfQ2hhcnQKICogQGNvcHlyaWdodAlDb3B5cmlnaHQgKGMpIDIwMDYgLSAyMDEyIFBIUEV4Y2VsIChodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9QSFBFeGNlbCkKICovCmNsYXNzIFBIUEV4Y2VsX0NoYXJ0X1Bsb3RBcmVhCnsKCS8qKgoJICogUGxvdEFyZWEgTGF5b3V0CgkgKgoJICogQHZhciBQSFBFeGNlbF9DaGFydF9MYXlvdXQKCSAqLwoJcHJpdmF0ZSAkX2xheW91dCA9IG51bGw7CgoJLyoqCgkgKiBQbG90IFNlcmllcwoJICoKCSAqIEB2YXIgYXJyYXkgb2YgUEhQRXhjZWxfQ2hhcnRfRGF0YVNlcmllcwoJICovCglwcml2YXRlICRfcGxvdFNlcmllcyA9IGFycmF5KCk7CgoJLyoqCgkgKiBDcmVhdGUgYSBuZXcgUEhQRXhjZWxfQ2hhcnRfUGxvdEFyZWEKCSAqLwoJcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KFBIUEV4Y2VsX0NoYXJ0X0xheW91dCAkbGF5b3V0ID0gbnVsbCwgJHBsb3RTZXJpZXMgPSBhcnJheSgpKQoJewoJCSR0aGlzLT5fbGF5b3V0ID0gJGxheW91dDsKCQkkdGhpcy0+X3Bsb3RTZXJpZXMgPSAkcGxvdFNlcmllczsKCX0KCgkvKioKCSAqIEdldCBMYXlvdXQKCSAqCgkgKiBAcmV0dXJuIFBIUEV4Y2VsX0NoYXJ0X0xheW91dAoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0TGF5b3V0KCkgewoJCXJldHVybiAkdGhpcy0+X2xheW91dDsKCX0KCgkvKioKCSAqIEdldCBOdW1iZXIgb2YgUGxvdCBHcm91cHMKCSAqCgkgKiBAcmV0dXJuIGFycmF5IG9mIFBIUEV4Y2VsX0NoYXJ0X0RhdGFTZXJpZXMKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldFBsb3RHcm91cENvdW50KCkgewoJCXJldHVybiBjb3VudCgkdGhpcy0+X3Bsb3RTZXJpZXMpOwoJfQoKCS8qKgoJICogR2V0IE51bWJlciBvZiBQbG90IFNlcmllcwoJICoKCSAqIEByZXR1cm4gaW50ZWdlcgoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0UGxvdFNlcmllc0NvdW50KCkgewoJCSRzZXJpZXNDb3VudCA9IDA7CgkJZm9yZWFjaCgkdGhpcy0+X3Bsb3RTZXJpZXMgYXMgJHBsb3QpIHsKCQkJJHNlcmllc0NvdW50ICs9ICRwbG90LT5nZXRQbG90U2VyaWVzQ291bnQoKTsKCQl9CgkJcmV0dXJuICRzZXJpZXNDb3VudDsKCX0KCgkvKioKCSAqIEdldCBQbG90IFNlcmllcwoJICoKCSAqIEByZXR1cm4gYXJyYXkgb2YgUEhQRXhjZWxfQ2hhcnRfRGF0YVNlcmllcwoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0UGxvdEdyb3VwKCkgewoJCXJldHVybiAkdGhpcy0+X3Bsb3RTZXJpZXM7Cgl9CgoJLyoqCgkgKiBHZXQgUGxvdCBTZXJpZXMgYnkgSW5kZXgKCSAqCgkgKiBAcmV0dXJuIFBIUEV4Y2VsX0NoYXJ0X0RhdGFTZXJpZXMKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldFBsb3RHcm91cEJ5SW5kZXgoJGluZGV4KSB7CgkJcmV0dXJuICR0aGlzLT5fcGxvdFNlcmllc1skaW5kZXhdOwoJfQoKCS8qKgoJICogU2V0IFBsb3QgU2VyaWVzCgkgKgoJICogQHBhcmFtIGFycmF5IG9mIFBIUEV4Y2VsX0NoYXJ0X0RhdGFTZXJpZXMKCSAqLwoJcHVibGljIGZ1bmN0aW9uIHNldFBsb3RTZXJpZXMoJHBsb3RTZXJpZXMgPSBhcnJheSgpKSB7CgkJJHRoaXMtPl9wbG90U2VyaWVzID0gJHBsb3RTZXJpZXM7Cgl9CgoJcHVibGljIGZ1bmN0aW9uIHJlZnJlc2goUEhQRXhjZWxfV29ya3NoZWV0ICR3b3Jrc2hlZXQpIHsKCSAgICBmb3JlYWNoKCR0aGlzLT5fcGxvdFNlcmllcyBhcyAkcGxvdFNlcmllcykgewoJCQkkcGxvdFNlcmllcy0+cmVmcmVzaCgkd29ya3NoZWV0KTsKCQl9Cgl9Cgp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Chart/Renderer/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Chart/Renderer/jpgraph.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCg0KLyoqDQogKiBQSFBFeGNlbA0KICoNCiAqIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwNCiAqDQogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yDQogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljDQogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXINCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLg0KICoNCiAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLA0KICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YNCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VDQogKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLg0KICoNCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMNCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUNCiAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQ0KICoNCiAqIEBjYXRlZ29yeQlQSFBFeGNlbA0KICogQHBhY2thZ2UJCVBIUEV4Y2VsX0NoYXJ0DQogKiBAY29weXJpZ2h0CUNvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwgKGh0dHA6Ly93d3cuY29kZXBsZXguY29tL1BIUEV4Y2VsKQ0KICogQGxpY2Vuc2UJCWh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9vbGQtbGljZW5zZXMvbGdwbC0yLjEudHh0CUxHUEwNCiAqIEB2ZXJzaW9uCQkxLjcuNywgMjAxMi0wNS0xOQ0KICovDQoNCg0KcmVxdWlyZV9vbmNlKFBIUEV4Y2VsX1NldHRpbmdzOjpnZXRDaGFydFJlbmRlcmVyUGF0aCgpLicvanBncmFwaC5waHAnKTsNCg0KDQovKioNCiAqIFBIUEV4Y2VsX0NoYXJ0X1JlbmRlcmVyX2pwZ3JhcGgNCiAqDQogKiBAY2F0ZWdvcnkJUEhQRXhjZWwNCiAqIEBwYWNrYWdlCQlQSFBFeGNlbF9DaGFydF9SZW5kZXJlcg0KICogQGNvcHlyaWdodAlDb3B5cmlnaHQgKGMpIDIwMDYgLSAyMDEyIFBIUEV4Y2VsIChodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9QSFBFeGNlbCkNCiAqLw0KY2xhc3MgUEhQRXhjZWxfQ2hhcnRfUmVuZGVyZXJfanBncmFwaA0Kew0KCXByaXZhdGUgc3RhdGljICRfd2lkdGgJPSA2NDA7DQoNCglwcml2YXRlIHN0YXRpYyAkX2hlaWdodAk9IDQ4MDsNCg0KCXByaXZhdGUgc3RhdGljICRfY29sb3VyU2V0ID0gYXJyYXkoICdtZWRpdW1wdXJwbGUxJywJJ3BhbGVncmVlbjMnLAknZ29sZDEnLAkJJ2NhZGV0Ymx1ZTEnLA0KCQkJCQkJCQkJCSdkYXJrbWFnZW50YScsCQknY29yYWwnLAkJJ2RvZGdlcmJsdWUzJywJJ2VnZ3BsYW50JywNCgkJCQkJCQkJCQknbWVkaXVtYmx1ZScsCQknbWFnZW50YScsCQknc2FuZHlicm93bicsCSdjeWFuJywNCgkJCQkJCQkJCQknZmlyZWJyaWNrMScsCQknZm9yZXN0Z3JlZW4nLAknZGVlcHBpbms0JywJJ2RhcmtvbGl2ZWdyZWVuJywNCgkJCQkJCQkJCQknZ29sZGVucm9kMicNCgkJCQkJCQkJCSAgKTsNCg0KCXByaXZhdGUgc3RhdGljICRfbWFya1NldCA9IGFycmF5KAknZGlhbW9uZCcJPT4gTUFSS19ESUFNT05ELA0KCQkJCQkJCQkJCSdzcXVhcmUnCT0+IE1BUktfU1FVQVJFLA0KCQkJCQkJCQkJCSd0cmlhbmdsZScJPT4gTUFSS19VVFJJQU5HTEUsDQoJCQkJCQkJCQkJJ3gnCQkJPT4gTUFSS19YLA0KCQkJCQkJCQkJCSdzdGFyJwkJPT4gTUFSS19TVEFSLA0KCQkJCQkJCQkJCSdkb3QnCQk9PiBNQVJLX0ZJTExFRENJUkNMRSwNCgkJCQkJCQkJCQknZGFzaCcJCT0+IE1BUktfRFRSSUFOR0xFLA0KCQkJCQkJCQkJCSdjaXJjbGUnCT0+IE1BUktfQ0lSQ0xFLA0KCQkJCQkJCQkJCSdwbHVzJwkJPT4gTUFSS19DUk9TUw0KCQkJCQkJCQkJKTsNCg0KDQoJcHJpdmF0ZSAkX2NoYXJ0CT0gbnVsbDsNCg0KCXByaXZhdGUgJF9ncmFwaAk9IG51bGw7DQoNCglwcml2YXRlIHN0YXRpYyAkX3Bsb3RDb2xvdXIJPSAwOw0KDQoJcHJpdmF0ZSBzdGF0aWMgJF9wbG90TWFyawk9IDA7DQoNCg0KCXByaXZhdGUgZnVuY3Rpb24gX2Zvcm1hdFBvaW50TWFya2VyKCRzZXJpZXNQbG90LCRtYXJrZXJJRCkgew0KCQkkcGxvdE1hcmtLZXlzID0gYXJyYXlfa2V5cyhzZWxmOjokX21hcmtTZXQpOw0KCQlpZiAoaXNfbnVsbCgkbWFya2VySUQpKSB7DQoJCQkvLwlVc2UgZGVmYXVsdCBwbG90IG1hcmtlciAobmV4dCBtYXJrZXIgaW4gdGhlIHNlcmllcykNCgkJCXNlbGY6OiRfcGxvdE1hcmsgJT0gY291bnQoc2VsZjo6JF9tYXJrU2V0KTsNCgkJCSRzZXJpZXNQbG90LT5tYXJrLT5TZXRUeXBlKHNlbGY6OiRfbWFya1NldFskcGxvdE1hcmtLZXlzW3NlbGY6OiRfcGxvdE1hcmsrK11dKTsNCgkJfSBlbHNlaWYgKCRtYXJrZXJJRCAhPT0gJ25vbmUnKSB7DQoJCQkvLwlVc2Ugc3BlY2lmaWVkIHBsb3QgbWFya2VyIChpZiBpdCBleGlzdHMpDQoJCQlpZiAoaXNzZXQoc2VsZjo6JF9tYXJrU2V0WyRtYXJrZXJJRF0pKSB7DQoJCQkJJHNlcmllc1Bsb3QtPm1hcmstPlNldFR5cGUoc2VsZjo6JF9tYXJrU2V0WyRtYXJrZXJJRF0pOw0KCQkJfSBlbHNlIHsNCgkJCQkvLwlJZiB0aGUgc3BlY2lmaWVkIHBsb3QgbWFya2VyIGRvZXNuJ3QgZXhpc3QsIHVzZSBkZWZhdWx0IHBsb3QgbWFya2VyIChuZXh0IG1hcmtlciBpbiB0aGUgc2VyaWVzKQ0KCQkJCXNlbGY6OiRfcGxvdE1hcmsgJT0gY291bnQoc2VsZjo6JF9tYXJrU2V0KTsNCgkJCQkkc2VyaWVzUGxvdC0+bWFyay0+U2V0VHlwZShzZWxmOjokX21hcmtTZXRbJHBsb3RNYXJrS2V5c1tzZWxmOjokX3Bsb3RNYXJrKytdXSk7DQoJCQl9DQoJCX0gZWxzZSB7DQoJCQkvLwlIaWRlIHBsb3QgbWFya2VyDQoJCQkkc2VyaWVzUGxvdC0+bWFyay0+SGlkZSgpOw0KCQl9DQoJCSRzZXJpZXNQbG90LT5tYXJrLT5TZXRDb2xvcihzZWxmOjokX2NvbG91clNldFtzZWxmOjokX3Bsb3RDb2xvdXJdKTsNCgkJJHNlcmllc1Bsb3QtPm1hcmstPlNldEZpbGxDb2xvcihzZWxmOjokX2NvbG91clNldFtzZWxmOjokX3Bsb3RDb2xvdXJdKTsNCgkJJHNlcmllc1Bsb3QtPlNldENvbG9yKHNlbGY6OiRfY29sb3VyU2V0W3NlbGY6OiRfcGxvdENvbG91cisrXSk7DQoNCgkJcmV0dXJuICRzZXJpZXNQbG90Ow0KCX0JLy8JZnVuY3Rpb24gX2Zvcm1hdFBvaW50TWFya2VyKCkNCg0KDQoJcHJpdmF0ZSBmdW5jdGlvbiBfZm9ybWF0RGF0YVNldExhYmVscygkZ3JvdXBJRCwkZGF0YXNldExhYmVscywkcm90YXRpb24gPSAnJykgew0KCQkkZGF0YXNldExhYmVsRm9ybWF0Q29kZSA9ICR0aGlzLT5fY2hhcnQtPmdldFBsb3RBcmVhKCktPmdldFBsb3RHcm91cEJ5SW5kZXgoJGdyb3VwSUQpLT5nZXRQbG90Q2F0ZWdvcnlCeUluZGV4KDApLT5nZXRGb3JtYXRDb2RlKCk7DQoJCWlmICghaXNfbnVsbCgkZGF0YXNldExhYmVsRm9ybWF0Q29kZSkpIHsNCgkJCS8vCVJldHJpZXZlIGFueSBsYWJlbCBmb3JtYXR0aW5nIGNvZGUNCgkJCSRkYXRhc2V0TGFiZWxGb3JtYXRDb2RlID0gc3RyaXBzbGFzaGVzKCRkYXRhc2V0TGFiZWxGb3JtYXRDb2RlKTsNCgkJfQ0KDQoJCSR0ZXN0Q3VycmVudEluZGV4ID0gMDsNCgkJZm9yZWFjaCgkZGF0YXNldExhYmVscyBhcyAkaSA9PiAkZGF0YXNldExhYmVsKSB7DQoJCQkvLwlGaWxsIGluIGFueSBtaXNzaW5nIHZhbHVlcyBpbiB0aGUgJGRhdGFzZXRMYWJlbHMgYXJyYXkNCgkJCXdoaWxlICgkaSAhPSAkdGVzdEN1cnJlbnRJbmRleCkgew0KCQkJCSRkYXRhc2V0TGFiZWxzWyR0ZXN0Q3VycmVudEluZGV4XSA9ICcnOw0KCQkJCSsrJHRlc3RDdXJyZW50SW5kZXg7DQoJCQl9DQoJCQlpZiAoaXNfYXJyYXkoJGRhdGFzZXRMYWJlbCkpIHsNCgkJCQlpZiAoJHJvdGF0aW9uID09ICdiYXInKSB7DQoJCQkJCSRkYXRhc2V0TGFiZWwgPSBhcnJheV9yZXZlcnNlKCRkYXRhc2V0TGFiZWwpOw0KCQkJCQkkZGF0YXNldExhYmVsc1skaV0gPSBpbXBsb2RlKCIgIiwkZGF0YXNldExhYmVsKTsNCgkJCQl9IGVsc2Ugew0KCQkJCQkkZGF0YXNldExhYmVsc1skaV0gPSBpbXBsb2RlKCJcbiIsJGRhdGFzZXRMYWJlbCk7DQoJCQkJfQ0KCQkJfSBlbHNlIHsNCgkJCQkvLwlGb3JtYXQgbGFiZWxzIGFjY29yZGluZyB0byBhbnkgZm9ybWF0dGluZyBjb2RlDQoJCQkJaWYgKCFpc19udWxsKCRkYXRhc2V0TGFiZWxGb3JtYXRDb2RlKSkgew0KCQkJCQkkZGF0YXNldExhYmVsc1skaV0gPSBQSFBFeGNlbF9TdHlsZV9OdW1iZXJGb3JtYXQ6OnRvRm9ybWF0dGVkU3RyaW5nKCRkYXRhc2V0TGFiZWwsJGRhdGFzZXRMYWJlbEZvcm1hdENvZGUpOw0KCQkJCX0NCgkJCX0NCgkJCSsrJHRlc3RDdXJyZW50SW5kZXg7DQoJCX0NCg0KCQlyZXR1cm4gJGRhdGFzZXRMYWJlbHM7DQoJfQkvLwlmdW5jdGlvbiBfZm9ybWF0RGF0YVNldExhYmVscygpDQoNCg0KCXByaXZhdGUgZnVuY3Rpb24gX3BlcmNlbnRhZ2VTdW1DYWxjdWxhdGlvbigkZ3JvdXBJRCwkc2VyaWVzQ291bnQpIHsNCgkJLy8JQWRqdXN0IG91ciB2YWx1ZXMgdG8gYSBwZXJjZW50YWdlIHZhbHVlIGFjcm9zcyBhbGwgc2VyaWVzIGluIHRoZSBncm91cA0KCQlmb3IoJGkgPSAwOyAkaSA8ICRzZXJpZXNDb3VudDsgKyskaSkgew0KCQkJaWYgKCRpID09IDApIHsNCgkJCQkkc3VtVmFsdWVzID0gJHRoaXMtPl9jaGFydC0+Z2V0UGxvdEFyZWEoKS0+Z2V0UGxvdEdyb3VwQnlJbmRleCgkZ3JvdXBJRCktPmdldFBsb3RWYWx1ZXNCeUluZGV4KCRpKS0+Z2V0RGF0YVZhbHVlcygpOw0KCQkJfSBlbHNlIHsNCgkJCQkkbmV4dFZhbHVlcyA9ICR0aGlzLT5fY2hhcnQtPmdldFBsb3RBcmVhKCktPmdldFBsb3RHcm91cEJ5SW5kZXgoJGdyb3VwSUQpLT5nZXRQbG90VmFsdWVzQnlJbmRleCgkaSktPmdldERhdGFWYWx1ZXMoKTsNCgkJCQlmb3JlYWNoKCRuZXh0VmFsdWVzIGFzICRrID0+ICR2YWx1ZSkgew0KCQkJCQlpZiAoaXNzZXQoJHN1bVZhbHVlc1ska10pKSB7DQoJCQkJCQkkc3VtVmFsdWVzWyRrXSArPSAkdmFsdWU7DQoJCQkJCX0gZWxzZSB7DQoJCQkJCQkkc3VtVmFsdWVzWyRrXSA9ICR2YWx1ZTsNCgkJCQkJfQ0KCQkJCX0NCgkJCX0NCgkJfQ0KDQoJCXJldHVybiAkc3VtVmFsdWVzOw0KCX0JLy8JZnVuY3Rpb24gX3BlcmNlbnRhZ2VTdW1DYWxjdWxhdGlvbigpDQoNCg0KCXByaXZhdGUgZnVuY3Rpb24gX3BlcmNlbnRhZ2VBZGp1c3RWYWx1ZXMoJGRhdGFWYWx1ZXMsJHN1bVZhbHVlcykgew0KCQlmb3JlYWNoKCRkYXRhVmFsdWVzIGFzICRrID0+ICRkYXRhVmFsdWUpIHsNCgkJCSRkYXRhVmFsdWVzWyRrXSA9ICRkYXRhVmFsdWUgLyAkc3VtVmFsdWVzWyRrXSAqIDEwMDsNCgkJfQ0KDQoJCXJldHVybiAkZGF0YVZhbHVlczsNCgl9CS8vCWZ1bmN0aW9uIF9wZXJjZW50YWdlQWRqdXN0VmFsdWVzKCkNCg0KDQoJcHJpdmF0ZSBmdW5jdGlvbiBfZ2V0Q2FwdGlvbigkY2FwdGlvbkVsZW1lbnQpIHsNCgkJLy8JUmVhZCBhbnkgY2FwdGlvbg0KCQkkY2FwdGlvbiA9ICghaXNfbnVsbCgkY2FwdGlvbkVsZW1lbnQpKSA/ICRjYXB0aW9uRWxlbWVudC0+Z2V0Q2FwdGlvbigpIDogTlVMTDsNCgkJLy8JVGVzdCBpZiB3ZSBoYXZlIGEgdGl0bGUgY2FwdGlvbiB0byBkaXNwbGF5DQoJCWlmICghaXNfbnVsbCgkY2FwdGlvbikpIHsNCgkJCS8vCUlmIHdlIGRvLCBpdCBjb3VsZCBiZSBhIHBsYWluIHN0cmluZyBvciBhbiBhcnJheQ0KCQkJaWYgKGlzX2FycmF5KCRjYXB0aW9uKSkgew0KCQkJCS8vCUltcGxvZGUgYW4gYXJyYXkgdG8gYSBwbGFpbiBzdHJpbmcNCgkJCQkkY2FwdGlvbiA9IGltcGxvZGUoJycsJGNhcHRpb24pOw0KCQkJfQ0KCQl9DQoJCXJldHVybiAkY2FwdGlvbjsNCgl9CS8vCWZ1bmN0aW9uIF9nZXRDYXB0aW9uKCkNCg0KDQoJcHJpdmF0ZSBmdW5jdGlvbiBfcmVuZGVyVGl0bGUoKSB7DQoJCSR0aXRsZSA9ICR0aGlzLT5fZ2V0Q2FwdGlvbigkdGhpcy0+X2NoYXJ0LT5nZXRUaXRsZSgpKTsNCgkJaWYgKCFpc19udWxsKCR0aXRsZSkpIHsNCgkJCSR0aGlzLT5fZ3JhcGgtPnRpdGxlLT5TZXQoJHRpdGxlKTsNCgkJfQ0KCX0JLy8JZnVuY3Rpb24gX3JlbmRlclRpdGxlKCkNCg0KDQoJcHJpdmF0ZSBmdW5jdGlvbiBfcmVuZGVyTGVnZW5kKCkgew0KCQkkbGVnZW5kID0gJHRoaXMtPl9jaGFydC0+Z2V0TGVnZW5kKCk7DQoJCWlmICghaXNfbnVsbCgkbGVnZW5kKSkgew0KCQkJJGxlZ2VuZFBvc2l0aW9uID0gJGxlZ2VuZC0+Z2V0UG9zaXRpb24oKTsNCgkJCSRsZWdlbmRPdmVybGF5ID0gJGxlZ2VuZC0+Z2V0T3ZlcmxheSgpOw0KCQkJc3dpdGNoICgkbGVnZW5kUG9zaXRpb24pIHsNCgkJCQljYXNlICdyJwk6DQoJCQkJCSR0aGlzLT5fZ3JhcGgtPmxlZ2VuZC0+U2V0UG9zKDAuMDEsMC41LCdyaWdodCcsJ2NlbnRlcicpOwkvLwlyaWdodA0KCQkJCQlicmVhazsNCgkJCQljYXNlICdsJwk6DQoJCQkJCSR0aGlzLT5fZ3JhcGgtPmxlZ2VuZC0+U2V0UG9zKDAuMDEsMC41LCdsZWZ0JywnY2VudGVyJyk7CS8vCWxlZnQNCgkJCQkJYnJlYWs7DQoJCQkJY2FzZSAndCcJOg0KCQkJCQkkdGhpcy0+X2dyYXBoLT5sZWdlbmQtPlNldFBvcygwLjUsMC4wMSwnY2VudGVyJywndG9wJyk7CS8vCXRvcA0KCQkJCQlicmVhazsNCgkJCQljYXNlICdiJwk6DQoJCQkJCSR0aGlzLT5fZ3JhcGgtPmxlZ2VuZC0+U2V0UG9zKDAuNSwwLjk5LCdjZW50ZXInLCdib3R0b20nKTsJLy8JYm90dG9tDQoJCQkJCWJyZWFrOw0KCQkJCWRlZmF1bHQJCToNCgkJCQkJJHRoaXMtPl9ncmFwaC0+bGVnZW5kLT5TZXRQb3MoMC4wMSwwLjAxLCdyaWdodCcsJ3RvcCcpOwkvLwl0b3AtcmlnaHQNCgkJCQkJYnJlYWs7DQoJCQl9DQoJCX0NCgl9CS8vCWZ1bmN0aW9uIF9yZW5kZXJMZWdlbmQoKQ0KDQoNCglwcml2YXRlIGZ1bmN0aW9uIF9yZW5kZXJDYXJ0ZXNpYW5QbG90QXJlYSgkdHlwZT0ndGV4dGxpbicpIHsNCgkJJHRoaXMtPl9ncmFwaCA9IG5ldyBHcmFwaChzZWxmOjokX3dpZHRoLHNlbGY6OiRfaGVpZ2h0KTsNCgkJJHRoaXMtPl9ncmFwaC0+U2V0U2NhbGUoJHR5cGUpOw0KDQoJCSR0aGlzLT5fcmVuZGVyVGl0bGUoKTsNCg0KCQkvLwlSb3RhdGUgZm9yIGJhciByYXRoZXIgdGhhbiBjb2x1bW4gY2hhcnQNCgkJJHJvdGF0aW9uID0gJHRoaXMtPl9jaGFydC0+Z2V0UGxvdEFyZWEoKS0+Z2V0UGxvdEdyb3VwQnlJbmRleCgwKS0+Z2V0UGxvdERpcmVjdGlvbigpOw0KCQkkcmV2ZXJzZSA9ICgkcm90YXRpb24gPT0gJ2JhcicpID8gdHJ1ZSA6IGZhbHNlOw0KDQoJCSR4QXhpc0xhYmVsID0gJHRoaXMtPl9jaGFydC0+Z2V0WEF4aXNMYWJlbCgpOw0KCQlpZiAoIWlzX251bGwoJHhBeGlzTGFiZWwpKSB7DQoJCQkkdGl0bGUgPSAkdGhpcy0+X2dldENhcHRpb24oJHhBeGlzTGFiZWwpOw0KCQkJaWYgKCFpc19udWxsKCR0aXRsZSkpIHsNCgkJCQkkdGhpcy0+X2dyYXBoLT54YXhpcy0+U2V0VGl0bGUoJHRpdGxlLCdjZW50ZXInKTsNCgkJCQkkdGhpcy0+X2dyYXBoLT54YXhpcy0+dGl0bGUtPlNldE1hcmdpbigzNSk7DQoJCQkJaWYgKCRyZXZlcnNlKSB7DQoJCQkJCSR0aGlzLT5fZ3JhcGgtPnhheGlzLT50aXRsZS0+U2V0QW5nbGUoOTApOw0KCQkJCQkkdGhpcy0+X2dyYXBoLT54YXhpcy0+dGl0bGUtPlNldE1hcmdpbig5MCk7DQoJCQkJfQ0KCQkJfQ0KCQl9DQoNCgkJJHlBeGlzTGFiZWwgPSAkdGhpcy0+X2NoYXJ0LT5nZXRZQXhpc0xhYmVsKCk7DQoJCWlmICghaXNfbnVsbCgkeUF4aXNMYWJlbCkpIHsNCgkJCSR0aXRsZSA9ICR0aGlzLT5fZ2V0Q2FwdGlvbigkeUF4aXNMYWJlbCk7DQoJCQlpZiAoIWlzX251bGwoJHRpdGxlKSkgew0KCQkJCSR0aGlzLT5fZ3JhcGgtPnlheGlzLT5TZXRUaXRsZSgkdGl0bGUsJ2NlbnRlcicpOw0KCQkJCWlmICgkcmV2ZXJzZSkgew0KCQkJCQkkdGhpcy0+X2dyYXBoLT55YXhpcy0+dGl0bGUtPlNldEFuZ2xlKDApOw0KCQkJCQkkdGhpcy0+X2dyYXBoLT55YXhpcy0+dGl0bGUtPlNldE1hcmdpbigtNTUpOw0KCQkJCX0NCgkJCX0NCgkJfQ0KCX0JLy8JZnVuY3Rpb24gX3JlbmRlckNhcnRlc2lhblBsb3RBcmVhKCkNCg0KDQoJcHJpdmF0ZSBmdW5jdGlvbiBfcmVuZGVyUGllUGxvdEFyZWEoJGRvdWdobnV0ID0gRmFsc2UpIHsNCgkJJHRoaXMtPl9ncmFwaCA9IG5ldyBQaWVHcmFwaChzZWxmOjokX3dpZHRoLHNlbGY6OiRfaGVpZ2h0KTsNCg0KCQkkdGhpcy0+X3JlbmRlclRpdGxlKCk7DQoJfQkvLwlmdW5jdGlvbiBfcmVuZGVyUGllUGxvdEFyZWEoKQ0KDQoNCglwcml2YXRlIGZ1bmN0aW9uIF9yZW5kZXJSYWRhclBsb3RBcmVhKCkgew0KCQkkdGhpcy0+X2dyYXBoID0gbmV3IFJhZGFyR3JhcGgoc2VsZjo6JF93aWR0aCxzZWxmOjokX2hlaWdodCk7DQoJCSR0aGlzLT5fZ3JhcGgtPlNldFNjYWxlKCdsaW4nKTsNCg0KCQkkdGhpcy0+X3JlbmRlclRpdGxlKCk7DQoJfQkvLwlmdW5jdGlvbiBfcmVuZGVyUmFkYXJQbG90QXJlYSgpDQoNCg0KCXByaXZhdGUgZnVuY3Rpb24gX3JlbmRlclBsb3RMaW5lKCRncm91cElELCAkZmlsbGVkID0gZmFsc2UsICRjb21iaW5hdGlvbiA9IGZhbHNlLCAkZGltZW5zaW9ucyA9ICcyZCcpIHsNCgkJJGdyb3VwaW5nID0gJHRoaXMtPl9jaGFydC0+Z2V0UGxvdEFyZWEoKS0+Z2V0UGxvdEdyb3VwQnlJbmRleCgkZ3JvdXBJRCktPmdldFBsb3RHcm91cGluZygpOw0KDQoJCSRkYXRhc2V0TGFiZWxzID0gJHRoaXMtPl9jaGFydC0+Z2V0UGxvdEFyZWEoKS0+Z2V0UGxvdEdyb3VwQnlJbmRleCgkZ3JvdXBJRCktPmdldFBsb3RDYXRlZ29yeUJ5SW5kZXgoMCktPmdldERhdGFWYWx1ZXMoKTsNCgkJaWYgKGNvdW50KCRkYXRhc2V0TGFiZWxzKSA+IDApIHsNCgkJCSRkYXRhc2V0TGFiZWxzID0gJHRoaXMtPl9mb3JtYXREYXRhU2V0TGFiZWxzKCRncm91cElELCRkYXRhc2V0TGFiZWxzKTsNCgkJCSR0aGlzLT5fZ3JhcGgtPnhheGlzLT5TZXRUaWNrTGFiZWxzKCRkYXRhc2V0TGFiZWxzKTsNCgkJfQ0KDQoJCSRzZXJpZXNDb3VudCA9ICR0aGlzLT5fY2hhcnQtPmdldFBsb3RBcmVhKCktPmdldFBsb3RHcm91cEJ5SW5kZXgoJGdyb3VwSUQpLT5nZXRQbG90U2VyaWVzQ291bnQoKTsNCgkJJHNlcmllc1Bsb3RzID0gYXJyYXkoKTsNCgkJaWYgKCRncm91cGluZyA9PSAncGVyY2VudFN0YWNrZWQnKSB7DQoJCQkkc3VtVmFsdWVzID0gJHRoaXMtPl9wZXJjZW50YWdlU3VtQ2FsY3VsYXRpb24oJGdyb3VwSUQsJHNlcmllc0NvdW50KTsNCgkJfQ0KDQoJCS8vCUxvb3AgdGhyb3VnaCBlYWNoIGRhdGEgc2VyaWVzIGluIHR1cm4NCgkJZm9yKCRpID0gMDsgJGkgPCAkc2VyaWVzQ291bnQ7ICsrJGkpIHsNCgkJCSRkYXRhVmFsdWVzID0gJHRoaXMtPl9jaGFydC0+Z2V0UGxvdEFyZWEoKS0+Z2V0UGxvdEdyb3VwQnlJbmRleCgkZ3JvdXBJRCktPmdldFBsb3RWYWx1ZXNCeUluZGV4KCRpKS0+Z2V0RGF0YVZhbHVlcygpOw0KCQkJJG1hcmtlciA9ICR0aGlzLT5fY2hhcnQtPmdldFBsb3RBcmVhKCktPmdldFBsb3RHcm91cEJ5SW5kZXgoJGdyb3VwSUQpLT5nZXRQbG90VmFsdWVzQnlJbmRleCgkaSktPmdldFBvaW50TWFya2VyKCk7DQoNCgkJCWlmICgkZ3JvdXBpbmcgPT0gJ3BlcmNlbnRTdGFja2VkJykgew0KCQkJCSRkYXRhVmFsdWVzID0gJHRoaXMtPl9wZXJjZW50YWdlQWRqdXN0VmFsdWVzKCRkYXRhVmFsdWVzLCRzdW1WYWx1ZXMpOw0KCQkJfQ0KDQoJCQkvLwlGaWxsIGluIGFueSBtaXNzaW5nIHZhbHVlcyBpbiB0aGUgJGRhdGFWYWx1ZXMgYXJyYXkNCgkJCSR0ZXN0Q3VycmVudEluZGV4ID0gMDsNCgkJCWZvcmVhY2goJGRhdGFWYWx1ZXMgYXMgJGsgPT4gJGRhdGFWYWx1ZSkgew0KCQkJCXdoaWxlKCRrICE9ICR0ZXN0Q3VycmVudEluZGV4KSB7DQoJCQkJCSRkYXRhVmFsdWVzWyR0ZXN0Q3VycmVudEluZGV4XSA9IG51bGw7DQoJCQkJCSsrJHRlc3RDdXJyZW50SW5kZXg7DQoJCQkJfQ0KCQkJCSsrJHRlc3RDdXJyZW50SW5kZXg7DQoJCQl9DQoNCgkJCSRzZXJpZXNQbG90ID0gbmV3IExpbmVQbG90KCRkYXRhVmFsdWVzKTsNCgkJCWlmICgkY29tYmluYXRpb24pIHsNCgkJCQkkc2VyaWVzUGxvdC0+U2V0QmFyQ2VudGVyKCk7DQoJCQl9DQoNCgkJCWlmICgkZmlsbGVkKSB7DQoJCQkJJHNlcmllc1Bsb3QtPlNldEZpbGxlZCh0cnVlKTsNCgkJCQkkc2VyaWVzUGxvdC0+U2V0Q29sb3IoJ2JsYWNrJyk7DQoJCQkJJHNlcmllc1Bsb3QtPlNldEZpbGxDb2xvcihzZWxmOjokX2NvbG91clNldFtzZWxmOjokX3Bsb3RDb2xvdXIrK10pOw0KCQkJfSBlbHNlIHsNCgkJCQkvLwlTZXQgdGhlIGFwcHJvcHJpYXRlIHBsb3QgbWFya2VyDQoJCQkJJHRoaXMtPl9mb3JtYXRQb2ludE1hcmtlcigkc2VyaWVzUGxvdCwkbWFya2VyKTsNCgkJCX0NCgkJCSRkYXRhTGFiZWwgPSAkdGhpcy0+X2NoYXJ0LT5nZXRQbG90QXJlYSgpLT5nZXRQbG90R3JvdXBCeUluZGV4KCRncm91cElEKS0+Z2V0UGxvdExhYmVsQnlJbmRleCgkaSktPmdldERhdGFWYWx1ZSgpOw0KCQkJJHNlcmllc1Bsb3QtPlNldExlZ2VuZCgkZGF0YUxhYmVsKTsNCg0KCQkJJHNlcmllc1Bsb3RzW10gPSAkc2VyaWVzUGxvdDsNCgkJfQ0KDQoJCWlmICgkZ3JvdXBpbmcgPT0gJ3N0YW5kYXJkJykgew0KCQkJJGdyb3VwUGxvdCA9ICRzZXJpZXNQbG90czsNCgkJfSBlbHNlIHsNCgkJCSRncm91cFBsb3QgPSBuZXcgQWNjTGluZVBsb3QoJHNlcmllc1Bsb3RzKTsNCgkJfQ0KCQkkdGhpcy0+X2dyYXBoLT5BZGQoJGdyb3VwUGxvdCk7DQoJfQkvLwlmdW5jdGlvbiBfcmVuZGVyUGxvdExpbmUoKQ0KDQoNCglwcml2YXRlIGZ1bmN0aW9uIF9yZW5kZXJQbG90QmFyKCRncm91cElELCAkZGltZW5zaW9ucyA9ICcyZCcpIHsNCgkJJHJvdGF0aW9uID0gJHRoaXMtPl9jaGFydC0+Z2V0UGxvdEFyZWEoKS0+Z2V0UGxvdEdyb3VwQnlJbmRleCgkZ3JvdXBJRCktPmdldFBsb3REaXJlY3Rpb24oKTsNCgkJLy8JUm90YXRlIGZvciBiYXIgcmF0aGVyIHRoYW4gY29sdW1uIGNoYXJ0DQoJCWlmICgoJGdyb3VwSUQgPT0gMCkgJiYgKCRyb3RhdGlvbiA9PSAnYmFyJykpIHsNCgkJCSR0aGlzLT5fZ3JhcGgtPlNldDkwQW5kTWFyZ2luKCk7DQoJCX0NCgkJJGdyb3VwaW5nID0gJHRoaXMtPl9jaGFydC0+Z2V0UGxvdEFyZWEoKS0+Z2V0UGxvdEdyb3VwQnlJbmRleCgkZ3JvdXBJRCktPmdldFBsb3RHcm91cGluZygpOw0KDQoJCSRkYXRhc2V0TGFiZWxzID0gJHRoaXMtPl9jaGFydC0+Z2V0UGxvdEFyZWEoKS0+Z2V0UGxvdEdyb3VwQnlJbmRleCgkZ3JvdXBJRCktPmdldFBsb3RDYXRlZ29yeUJ5SW5kZXgoMCktPmdldERhdGFWYWx1ZXMoKTsNCgkJaWYgKGNvdW50KCRkYXRhc2V0TGFiZWxzKSA+IDApIHsNCgkJCSRkYXRhc2V0TGFiZWxzID0gJHRoaXMtPl9mb3JtYXREYXRhU2V0TGFiZWxzKCRncm91cElELCRkYXRhc2V0TGFiZWxzLCRyb3RhdGlvbik7DQoJCQkvLwlSb3RhdGUgZm9yIGJhciByYXRoZXIgdGhhbiBjb2x1bW4gY2hhcnQNCgkJCWlmICgkcm90YXRpb24gPT0gJ2JhcicpIHsNCgkJCQkkZGF0YXNldExhYmVscyA9IGFycmF5X3JldmVyc2UoJGRhdGFzZXRMYWJlbHMpOw0KCQkJCSR0aGlzLT5fZ3JhcGgtPnlheGlzLT5TZXRQb3MoJ21heCcpOw0KCQkJCSR0aGlzLT5fZ3JhcGgtPnlheGlzLT5TZXRMYWJlbEFsaWduKCdjZW50ZXInLCd0b3AnKTsNCgkJCQkkdGhpcy0+X2dyYXBoLT55YXhpcy0+U2V0TGFiZWxTaWRlKFNJREVfUklHSFQpOw0KCQkJfQ0KCQkJJHRoaXMtPl9ncmFwaC0+eGF4aXMtPlNldFRpY2tMYWJlbHMoJGRhdGFzZXRMYWJlbHMpOw0KCQl9DQoNCg0KCQkkc2VyaWVzQ291bnQgPSAkdGhpcy0+X2NoYXJ0LT5nZXRQbG90QXJlYSgpLT5nZXRQbG90R3JvdXBCeUluZGV4KCRncm91cElEKS0+Z2V0UGxvdFNlcmllc0NvdW50KCk7DQoJCSRzZXJpZXNQbG90cyA9IGFycmF5KCk7DQoJCWlmICgkZ3JvdXBpbmcgPT0gJ3BlcmNlbnRTdGFja2VkJykgew0KCQkJJHN1bVZhbHVlcyA9ICR0aGlzLT5fcGVyY2VudGFnZVN1bUNhbGN1bGF0aW9uKCRncm91cElELCRzZXJpZXNDb3VudCk7DQoJCX0NCg0KCQkvLwlMb29wIHRocm91Z2ggZWFjaCBkYXRhIHNlcmllcyBpbiB0dXJuDQoJCWZvcigkaiA9IDA7ICRqIDwgJHNlcmllc0NvdW50OyArKyRqKSB7DQoJCQkkZGF0YVZhbHVlcyA9ICR0aGlzLT5fY2hhcnQtPmdldFBsb3RBcmVhKCktPmdldFBsb3RHcm91cEJ5SW5kZXgoJGdyb3VwSUQpLT5nZXRQbG90VmFsdWVzQnlJbmRleCgkaiktPmdldERhdGFWYWx1ZXMoKTsNCgkJCWlmICgkZ3JvdXBpbmcgPT0gJ3BlcmNlbnRTdGFja2VkJykgew0KCQkJCSRkYXRhVmFsdWVzID0gJHRoaXMtPl9wZXJjZW50YWdlQWRqdXN0VmFsdWVzKCRkYXRhVmFsdWVzLCRzdW1WYWx1ZXMpOw0KCQkJfQ0KDQoJCQkvLwlGaWxsIGluIGFueSBtaXNzaW5nIHZhbHVlcyBpbiB0aGUgJGRhdGFWYWx1ZXMgYXJyYXkNCgkJCSR0ZXN0Q3VycmVudEluZGV4ID0gMDsNCgkJCWZvcmVhY2goJGRhdGFWYWx1ZXMgYXMgJGsgPT4gJGRhdGFWYWx1ZSkgew0KCQkJCXdoaWxlKCRrICE9ICR0ZXN0Q3VycmVudEluZGV4KSB7DQoJCQkJCSRkYXRhVmFsdWVzWyR0ZXN0Q3VycmVudEluZGV4XSA9IG51bGw7DQoJCQkJCSsrJHRlc3RDdXJyZW50SW5kZXg7DQoJCQkJfQ0KCQkJCSsrJHRlc3RDdXJyZW50SW5kZXg7DQoJCQl9DQoNCgkJCS8vCVJldmVyc2UgdGhlICRkYXRhVmFsdWVzIG9yZGVyIGZvciBiYXIgcmF0aGVyIHRoYW4gY29sdW1uIGNoYXJ0DQoJCQlpZiAoJHJvdGF0aW9uID09ICdiYXInKSB7DQoJCQkJJGRhdGFWYWx1ZXMgPSBhcnJheV9yZXZlcnNlKCRkYXRhVmFsdWVzKTsNCgkJCX0NCgkJCSRzZXJpZXNQbG90ID0gbmV3IEJhclBsb3QoJGRhdGFWYWx1ZXMpOw0KCQkJJHNlcmllc1Bsb3QtPlNldENvbG9yKCdibGFjaycpOw0KCQkJJHNlcmllc1Bsb3QtPlNldEZpbGxDb2xvcihzZWxmOjokX2NvbG91clNldFtzZWxmOjokX3Bsb3RDb2xvdXIrK10pOw0KCQkJaWYgKCRkaW1lbnNpb25zID09ICczZCcpIHsNCgkJCQkkc2VyaWVzUGxvdC0+U2V0U2hhZG93KCk7DQoJCQl9DQoJCQlpZiAoISR0aGlzLT5fY2hhcnQtPmdldFBsb3RBcmVhKCktPmdldFBsb3RHcm91cEJ5SW5kZXgoJGdyb3VwSUQpLT5nZXRQbG90TGFiZWxCeUluZGV4KCRqKSkgew0KCQkJCSRkYXRhTGFiZWwgPSAnJzsNCgkJCX0gZWxzZSB7DQoJCQkJJGRhdGFMYWJlbCA9ICR0aGlzLT5fY2hhcnQtPmdldFBsb3RBcmVhKCktPmdldFBsb3RHcm91cEJ5SW5kZXgoJGdyb3VwSUQpLT5nZXRQbG90TGFiZWxCeUluZGV4KCRqKS0+Z2V0RGF0YVZhbHVlKCk7DQoJCQl9DQoJCQkkc2VyaWVzUGxvdC0+U2V0TGVnZW5kKCRkYXRhTGFiZWwpOw0KDQoJCQkkc2VyaWVzUGxvdHNbXSA9ICRzZXJpZXNQbG90Ow0KCQl9DQoJCS8vCVJldmVyc2UgdGhlIHBsb3Qgb3JkZXIgZm9yIGJhciByYXRoZXIgdGhhbiBjb2x1bW4gY2hhcnQNCgkJaWYgKCgkcm90YXRpb24gPT0gJ2JhcicpICYmICghKCRncm91cGluZyA9PSAncGVyY2VudFN0YWNrZWQnKSkpIHsNCgkJCSRzZXJpZXNQbG90cyA9IGFycmF5X3JldmVyc2UoJHNlcmllc1Bsb3RzKTsNCgkJfQ0KDQoJCWlmICgkZ3JvdXBpbmcgPT0gJ2NsdXN0ZXJlZCcpIHsNCgkJCSRncm91cFBsb3QgPSBuZXcgR3JvdXBCYXJQbG90KCRzZXJpZXNQbG90cyk7DQoJCX0gZWxzZWlmICgkZ3JvdXBpbmcgPT0gJ3N0YW5kYXJkJykgew0KCQkJJGdyb3VwUGxvdCA9IG5ldyBHcm91cEJhclBsb3QoJHNlcmllc1Bsb3RzKTsNCgkJfSBlbHNlIHsNCgkJCSRncm91cFBsb3QgPSBuZXcgQWNjQmFyUGxvdCgkc2VyaWVzUGxvdHMpOw0KCQkJaWYgKCRkaW1lbnNpb25zID09ICczZCcpIHsNCgkJCQkkZ3JvdXBQbG90LT5TZXRTaGFkb3coKTsNCgkJCX0NCgkJfQ0KDQoJCSR0aGlzLT5fZ3JhcGgtPkFkZCgkZ3JvdXBQbG90KTsNCgl9CS8vCWZ1bmN0aW9uIF9yZW5kZXJQbG90QmFyKCkNCg0KDQoJcHJpdmF0ZSBmdW5jdGlvbiBfcmVuZGVyUGxvdFNjYXR0ZXIoJGdyb3VwSUQsJGJ1YmJsZSkgew0KCQkkZ3JvdXBpbmcgPSAkdGhpcy0+X2NoYXJ0LT5nZXRQbG90QXJlYSgpLT5nZXRQbG90R3JvdXBCeUluZGV4KCRncm91cElEKS0+Z2V0UGxvdEdyb3VwaW5nKCk7DQoJCSRzY2F0dGVyU3R5bGUgPSAkYnViYmxlU2l6ZSA9ICR0aGlzLT5fY2hhcnQtPmdldFBsb3RBcmVhKCktPmdldFBsb3RHcm91cEJ5SW5kZXgoJGdyb3VwSUQpLT5nZXRQbG90U3R5bGUoKTsNCg0KCQkkc2VyaWVzQ291bnQgPSAkdGhpcy0+X2NoYXJ0LT5nZXRQbG90QXJlYSgpLT5nZXRQbG90R3JvdXBCeUluZGV4KCRncm91cElEKS0+Z2V0UGxvdFNlcmllc0NvdW50KCk7DQoJCSRzZXJpZXNQbG90cyA9IGFycmF5KCk7DQoNCgkJLy8JTG9vcCB0aHJvdWdoIGVhY2ggZGF0YSBzZXJpZXMgaW4gdHVybg0KCQlmb3IoJGkgPSAwOyAkaSA8ICRzZXJpZXNDb3VudDsgKyskaSkgew0KCQkJJGRhdGFWYWx1ZXNZID0gJHRoaXMtPl9jaGFydC0+Z2V0UGxvdEFyZWEoKS0+Z2V0UGxvdEdyb3VwQnlJbmRleCgkZ3JvdXBJRCktPmdldFBsb3RDYXRlZ29yeUJ5SW5kZXgoJGkpLT5nZXREYXRhVmFsdWVzKCk7DQoJCQkkZGF0YVZhbHVlc1ggPSAkdGhpcy0+X2NoYXJ0LT5nZXRQbG90QXJlYSgpLT5nZXRQbG90R3JvdXBCeUluZGV4KCRncm91cElEKS0+Z2V0UGxvdFZhbHVlc0J5SW5kZXgoJGkpLT5nZXREYXRhVmFsdWVzKCk7DQoNCgkJCWZvcmVhY2goJGRhdGFWYWx1ZXNZIGFzICRrID0+ICRkYXRhVmFsdWVZKSB7DQoJCQkJJGRhdGFWYWx1ZXNZWyRrXSA9ICRrOw0KCQkJfQ0KDQoJCQkkc2VyaWVzUGxvdCA9IG5ldyBTY2F0dGVyUGxvdCgkZGF0YVZhbHVlc1gsJGRhdGFWYWx1ZXNZKTsNCgkJCWlmICgkc2NhdHRlclN0eWxlID09ICdsaW5lTWFya2VyJykgew0KCQkJCSRzZXJpZXNQbG90LT5TZXRMaW5rUG9pbnRzKCk7DQoJCQkJJHNlcmllc1Bsb3QtPmxpbmstPlNldENvbG9yKHNlbGY6OiRfY29sb3VyU2V0W3NlbGY6OiRfcGxvdENvbG91cl0pOw0KCQkJfSBlbHNlaWYgKCRzY2F0dGVyU3R5bGUgPT0gJ3Ntb290aE1hcmtlcicpIHsNCgkJCQkkc3BsaW5lID0gbmV3IFNwbGluZSgkZGF0YVZhbHVlc1ksJGRhdGFWYWx1ZXNYKTsNCgkJCQlsaXN0KCRzcGxpbmVEYXRhWSwkc3BsaW5lRGF0YVgpID0gJHNwbGluZS0+R2V0KGNvdW50KCRkYXRhVmFsdWVzWCkgKiBzZWxmOjokX3dpZHRoIC8gMjApOw0KCQkJCSRscGxvdCA9IG5ldyBMaW5lUGxvdCgkc3BsaW5lRGF0YVgsJHNwbGluZURhdGFZKTsNCgkJCQkkbHBsb3QtPlNldENvbG9yKHNlbGY6OiRfY29sb3VyU2V0W3NlbGY6OiRfcGxvdENvbG91cl0pOw0KDQoJCQkJJHRoaXMtPl9ncmFwaC0+QWRkKCRscGxvdCk7DQoJCQl9DQoNCgkJCWlmICgkYnViYmxlKSB7DQoJCQkJJHRoaXMtPl9mb3JtYXRQb2ludE1hcmtlcigkc2VyaWVzUGxvdCwnZG90Jyk7DQoJCQkJJHNlcmllc1Bsb3QtPm1hcmstPlNldENvbG9yKCdibGFjaycpOw0KCQkJCSRzZXJpZXNQbG90LT5tYXJrLT5TZXRTaXplKCRidWJibGVTaXplKTsNCgkJCX0gZWxzZSB7DQoJCQkJJG1hcmtlciA9ICR0aGlzLT5fY2hhcnQtPmdldFBsb3RBcmVhKCktPmdldFBsb3RHcm91cEJ5SW5kZXgoJGdyb3VwSUQpLT5nZXRQbG90VmFsdWVzQnlJbmRleCgkaSktPmdldFBvaW50TWFya2VyKCk7DQoJCQkJJHRoaXMtPl9mb3JtYXRQb2ludE1hcmtlcigkc2VyaWVzUGxvdCwkbWFya2VyKTsNCgkJCX0NCgkJCSRkYXRhTGFiZWwgPSAkdGhpcy0+X2NoYXJ0LT5nZXRQbG90QXJlYSgpLT5nZXRQbG90R3JvdXBCeUluZGV4KCRncm91cElEKS0+Z2V0UGxvdExhYmVsQnlJbmRleCgkaSktPmdldERhdGFWYWx1ZSgpOw0KCQkJJHNlcmllc1Bsb3QtPlNldExlZ2VuZCgkZGF0YUxhYmVsKTsNCg0KCQkJJHRoaXMtPl9ncmFwaC0+QWRkKCRzZXJpZXNQbG90KTsNCgkJfQ0KCX0JLy8JZnVuY3Rpb24gX3JlbmRlclBsb3RTY2F0dGVyKCkNCg0KDQoJcHJpdmF0ZSBmdW5jdGlvbiBfcmVuZGVyUGxvdFJhZGFyKCRncm91cElEKSB7DQoJCSRyYWRhclN0eWxlID0gJHRoaXMtPl9jaGFydC0+Z2V0UGxvdEFyZWEoKS0+Z2V0UGxvdEdyb3VwQnlJbmRleCgkZ3JvdXBJRCktPmdldFBsb3RTdHlsZSgpOw0KDQoJCSRzZXJpZXNDb3VudCA9ICR0aGlzLT5fY2hhcnQtPmdldFBsb3RBcmVhKCktPmdldFBsb3RHcm91cEJ5SW5kZXgoJGdyb3VwSUQpLT5nZXRQbG90U2VyaWVzQ291bnQoKTsNCgkJJHNlcmllc1Bsb3RzID0gYXJyYXkoKTsNCg0KCQkvLwlMb29wIHRocm91Z2ggZWFjaCBkYXRhIHNlcmllcyBpbiB0dXJuDQoJCWZvcigkaSA9IDA7ICRpIDwgJHNlcmllc0NvdW50OyArKyRpKSB7DQoJCQkkZGF0YVZhbHVlc1kgPSAkdGhpcy0+X2NoYXJ0LT5nZXRQbG90QXJlYSgpLT5nZXRQbG90R3JvdXBCeUluZGV4KCRncm91cElEKS0+Z2V0UGxvdENhdGVnb3J5QnlJbmRleCgkaSktPmdldERhdGFWYWx1ZXMoKTsNCgkJCSRkYXRhVmFsdWVzWCA9ICR0aGlzLT5fY2hhcnQtPmdldFBsb3RBcmVhKCktPmdldFBsb3RHcm91cEJ5SW5kZXgoJGdyb3VwSUQpLT5nZXRQbG90VmFsdWVzQnlJbmRleCgkaSktPmdldERhdGFWYWx1ZXMoKTsNCgkJCSRtYXJrZXIgPSAkdGhpcy0+X2NoYXJ0LT5nZXRQbG90QXJlYSgpLT5nZXRQbG90R3JvdXBCeUluZGV4KCRncm91cElEKS0+Z2V0UGxvdFZhbHVlc0J5SW5kZXgoJGkpLT5nZXRQb2ludE1hcmtlcigpOw0KDQoJCQkkZGF0YVZhbHVlcyA9IGFycmF5KCk7DQoJCQlmb3JlYWNoKCRkYXRhVmFsdWVzWSBhcyAkayA9PiAkZGF0YVZhbHVlWSkgew0KCQkJCSRkYXRhVmFsdWVzWyRrXSA9IGltcGxvZGUoJyAnLGFycmF5X3JldmVyc2UoJGRhdGFWYWx1ZVkpKTsNCgkJCX0NCgkJCSR0bXAgPSBhcnJheV9zaGlmdCgkZGF0YVZhbHVlcyk7DQoJCQkkZGF0YVZhbHVlc1tdID0gJHRtcDsNCgkJCSR0bXAgPSBhcnJheV9zaGlmdCgkZGF0YVZhbHVlc1gpOw0KCQkJJGRhdGFWYWx1ZXNYW10gPSAkdG1wOw0KDQoJCQkkdGhpcy0+X2dyYXBoLT5TZXRUaXRsZXMoYXJyYXlfcmV2ZXJzZSgkZGF0YVZhbHVlcykpOw0KDQoJCQkkc2VyaWVzUGxvdCA9IG5ldyBSYWRhclBsb3QoYXJyYXlfcmV2ZXJzZSgkZGF0YVZhbHVlc1gpKTsNCg0KCQkJJGRhdGFMYWJlbCA9ICR0aGlzLT5fY2hhcnQtPmdldFBsb3RBcmVhKCktPmdldFBsb3RHcm91cEJ5SW5kZXgoJGdyb3VwSUQpLT5nZXRQbG90TGFiZWxCeUluZGV4KCRpKS0+Z2V0RGF0YVZhbHVlKCk7DQoJCQkkc2VyaWVzUGxvdC0+U2V0Q29sb3Ioc2VsZjo6JF9jb2xvdXJTZXRbc2VsZjo6JF9wbG90Q29sb3VyKytdKTsNCgkJCWlmICgkcmFkYXJTdHlsZSA9PSAnZmlsbGVkJykgew0KCQkJCSRzZXJpZXNQbG90LT5TZXRGaWxsQ29sb3Ioc2VsZjo6JF9jb2xvdXJTZXRbc2VsZjo6JF9wbG90Q29sb3VyXSk7DQoJCQl9DQoJCQkkdGhpcy0+X2Zvcm1hdFBvaW50TWFya2VyKCRzZXJpZXNQbG90LCRtYXJrZXIpOw0KCQkJJHNlcmllc1Bsb3QtPlNldExlZ2VuZCgkZGF0YUxhYmVsKTsNCg0KCQkJJHRoaXMtPl9ncmFwaC0+QWRkKCRzZXJpZXNQbG90KTsNCgkJfQ0KCX0JLy8JZnVuY3Rpb24gX3JlbmRlclBsb3RSYWRhcigpDQoNCg0KCXByaXZhdGUgZnVuY3Rpb24gX3JlbmRlclBsb3RDb250b3VyKCRncm91cElEKSB7DQoJCSRjb250b3VyU3R5bGUgPSAkdGhpcy0+X2NoYXJ0LT5nZXRQbG90QXJlYSgpLT5nZXRQbG90R3JvdXBCeUluZGV4KCRncm91cElEKS0+Z2V0UGxvdFN0eWxlKCk7DQoNCgkJJHNlcmllc0NvdW50ID0gJHRoaXMtPl9jaGFydC0+Z2V0UGxvdEFyZWEoKS0+Z2V0UGxvdEdyb3VwQnlJbmRleCgkZ3JvdXBJRCktPmdldFBsb3RTZXJpZXNDb3VudCgpOw0KCQkkc2VyaWVzUGxvdHMgPSBhcnJheSgpOw0KDQoJCSRkYXRhVmFsdWVzID0gYXJyYXkoKTsNCgkJLy8JTG9vcCB0aHJvdWdoIGVhY2ggZGF0YSBzZXJpZXMgaW4gdHVybg0KCQlmb3IoJGkgPSAwOyAkaSA8ICRzZXJpZXNDb3VudDsgKyskaSkgew0KCQkJJGRhdGFWYWx1ZXNZID0gJHRoaXMtPl9jaGFydC0+Z2V0UGxvdEFyZWEoKS0+Z2V0UGxvdEdyb3VwQnlJbmRleCgkZ3JvdXBJRCktPmdldFBsb3RDYXRlZ29yeUJ5SW5kZXgoJGkpLT5nZXREYXRhVmFsdWVzKCk7DQoJCQkkZGF0YVZhbHVlc1ggPSAkdGhpcy0+X2NoYXJ0LT5nZXRQbG90QXJlYSgpLT5nZXRQbG90R3JvdXBCeUluZGV4KCRncm91cElEKS0+Z2V0UGxvdFZhbHVlc0J5SW5kZXgoJGkpLT5nZXREYXRhVmFsdWVzKCk7DQoNCgkJCSRkYXRhVmFsdWVzWyRpXSA9ICRkYXRhVmFsdWVzWDsNCgkJfQ0KCQkkc2VyaWVzUGxvdCA9IG5ldyBDb250b3VyUGxvdCgkZGF0YVZhbHVlcyk7DQoNCgkJJHRoaXMtPl9ncmFwaC0+QWRkKCRzZXJpZXNQbG90KTsNCgl9CS8vCWZ1bmN0aW9uIF9yZW5kZXJQbG90Q29udG91cigpDQoNCg0KCXByaXZhdGUgZnVuY3Rpb24gX3JlbmRlclBsb3RTdG9jaygkZ3JvdXBJRCkgew0KCQkkc2VyaWVzQ291bnQgPSAkdGhpcy0+X2NoYXJ0LT5nZXRQbG90QXJlYSgpLT5nZXRQbG90R3JvdXBCeUluZGV4KCRncm91cElEKS0+Z2V0UGxvdFNlcmllc0NvdW50KCk7DQoJCSRwbG90T3JkZXIgPSAkdGhpcy0+X2NoYXJ0LT5nZXRQbG90QXJlYSgpLT5nZXRQbG90R3JvdXBCeUluZGV4KCRncm91cElEKS0+Z2V0UGxvdE9yZGVyKCk7DQoJCSRzZXJpZXNQbG90cyA9IGFycmF5KCk7DQoNCgkJJGRhdGFWYWx1ZXMgPSBhcnJheSgpOw0KCQkvLwlMb29wIHRocm91Z2ggZWFjaCBkYXRhIHNlcmllcyBpbiB0dXJuDQoJCWZvcigkaSA9IDA7ICRpIDwgJHNlcmllc0NvdW50OyArKyRpKSB7DQoJCQkkZGF0YVZhbHVlc1kgPSAkdGhpcy0+X2NoYXJ0LT5nZXRQbG90QXJlYSgpLT5nZXRQbG90R3JvdXBCeUluZGV4KCRncm91cElEKS0+Z2V0UGxvdENhdGVnb3J5QnlJbmRleCgkaSktPmdldERhdGFWYWx1ZXMoKTsNCgkJCSRkYXRhVmFsdWVzWCA9ICR0aGlzLT5fY2hhcnQtPmdldFBsb3RBcmVhKCktPmdldFBsb3RHcm91cEJ5SW5kZXgoJGdyb3VwSUQpLT5nZXRQbG90VmFsdWVzQnlJbmRleCgkaSktPmdldERhdGFWYWx1ZXMoKTsNCg0KCQkJZm9yZWFjaCgkZGF0YVZhbHVlc1ggYXMgJGogPT4gJGRhdGFWYWx1ZVgpDQoJCQkkZGF0YVZhbHVlc1skal1bJHBsb3RPcmRlclskaV1dID0gJGRhdGFWYWx1ZVg7DQoJCX0NCg0KCQkkc2VyaWVzUGxvdCA9IG5ldyBTdG9ja1Bsb3QoJGRhdGFWYWx1ZXMpOw0KDQoJCSR0aGlzLT5fZ3JhcGgtPkFkZCgkc2VyaWVzUGxvdCk7DQoJfQkvLwlmdW5jdGlvbiBfcmVuZGVyUGxvdFN0b2NrKCkNCg0KDQoJcHJpdmF0ZSBmdW5jdGlvbiBfcmVuZGVyQXJlYUNoYXJ0KCRncm91cENvdW50LCAkZGltZW5zaW9ucyA9ICcyZCcpIHsNCgkJcmVxdWlyZV9vbmNlKCdqcGdyYXBoX2xpbmUucGhwJyk7DQoNCgkJJHRoaXMtPl9yZW5kZXJDYXJ0ZXNpYW5QbG90QXJlYSgpOw0KDQoJCWZvcigkaSA9IDA7ICRpIDwgJGdyb3VwQ291bnQ7ICsrJGkpIHsNCgkJCSR0aGlzLT5fcmVuZGVyUGxvdExpbmUoJGksVHJ1ZSxGYWxzZSwkZGltZW5zaW9ucyk7DQoJCX0NCgl9CS8vCWZ1bmN0aW9uIF9yZW5kZXJBcmVhQ2hhcnQoKQ0KDQoNCglwcml2YXRlIGZ1bmN0aW9uIF9yZW5kZXJMaW5lQ2hhcnQoJGdyb3VwQ291bnQsICRkaW1lbnNpb25zID0gJzJkJykgew0KCQlyZXF1aXJlX29uY2UoJ2pwZ3JhcGhfbGluZS5waHAnKTsNCg0KCQkkdGhpcy0+X3JlbmRlckNhcnRlc2lhblBsb3RBcmVhKCk7DQoNCgkJZm9yKCRpID0gMDsgJGkgPCAkZ3JvdXBDb3VudDsgKyskaSkgew0KCQkJJHRoaXMtPl9yZW5kZXJQbG90TGluZSgkaSxGYWxzZSxGYWxzZSwkZGltZW5zaW9ucyk7DQoJCX0NCgl9CS8vCWZ1bmN0aW9uIF9yZW5kZXJMaW5lQ2hhcnQoKQ0KDQoNCglwcml2YXRlIGZ1bmN0aW9uIF9yZW5kZXJCYXJDaGFydCgkZ3JvdXBDb3VudCwgJGRpbWVuc2lvbnMgPSAnMmQnKSB7DQoJCXJlcXVpcmVfb25jZSgnanBncmFwaF9iYXIucGhwJyk7DQoNCgkJJHRoaXMtPl9yZW5kZXJDYXJ0ZXNpYW5QbG90QXJlYSgpOw0KDQoJCWZvcigkaSA9IDA7ICRpIDwgJGdyb3VwQ291bnQ7ICsrJGkpIHsNCgkJCSR0aGlzLT5fcmVuZGVyUGxvdEJhcigkaSwkZGltZW5zaW9ucyk7DQoJCX0NCgl9CS8vCWZ1bmN0aW9uIF9yZW5kZXJCYXJDaGFydCgpDQoNCg0KCXByaXZhdGUgZnVuY3Rpb24gX3JlbmRlclNjYXR0ZXJDaGFydCgkZ3JvdXBDb3VudCkgew0KCQlyZXF1aXJlX29uY2UoJ2pwZ3JhcGhfc2NhdHRlci5waHAnKTsNCgkJcmVxdWlyZV9vbmNlKCdqcGdyYXBoX3JlZ3N0YXQucGhwJyk7DQoJCXJlcXVpcmVfb25jZSgnanBncmFwaF9saW5lLnBocCcpOw0KDQoJCSR0aGlzLT5fcmVuZGVyQ2FydGVzaWFuUGxvdEFyZWEoJ2xpbmxpbicpOw0KDQoJCWZvcigkaSA9IDA7ICRpIDwgJGdyb3VwQ291bnQ7ICsrJGkpIHsNCgkJCSR0aGlzLT5fcmVuZGVyUGxvdFNjYXR0ZXIoJGksZmFsc2UpOw0KCQl9DQoJfQkvLwlmdW5jdGlvbiBfcmVuZGVyU2NhdHRlckNoYXJ0KCkNCg0KDQoJcHJpdmF0ZSBmdW5jdGlvbiBfcmVuZGVyQnViYmxlQ2hhcnQoJGdyb3VwQ291bnQpIHsNCgkJcmVxdWlyZV9vbmNlKCdqcGdyYXBoX3NjYXR0ZXIucGhwJyk7DQoNCgkJJHRoaXMtPl9yZW5kZXJDYXJ0ZXNpYW5QbG90QXJlYSgnbGlubGluJyk7DQoNCgkJZm9yKCRpID0gMDsgJGkgPCAkZ3JvdXBDb3VudDsgKyskaSkgew0KCQkJJHRoaXMtPl9yZW5kZXJQbG90U2NhdHRlcigkaSx0cnVlKTsNCgkJfQ0KCX0JLy8JZnVuY3Rpb24gX3JlbmRlckJ1YmJsZUNoYXJ0KCkNCg0KDQoJcHJpdmF0ZSBmdW5jdGlvbiBfcmVuZGVyUGllQ2hhcnQoJGdyb3VwQ291bnQsICRkaW1lbnNpb25zID0gJzJkJywgJGRvdWdobnV0ID0gRmFsc2UsICRtdWx0aXBsZVBsb3RzID0gRmFsc2UpIHsNCgkJcmVxdWlyZV9vbmNlKCdqcGdyYXBoX3BpZS5waHAnKTsNCgkJaWYgKCRkaW1lbnNpb25zID09ICczZCcpIHsNCgkJCXJlcXVpcmVfb25jZSgnanBncmFwaF9waWUzZC5waHAnKTsNCgkJfQ0KDQoJCSR0aGlzLT5fcmVuZGVyUGllUGxvdEFyZWEoJGRvdWdobnV0KTsNCg0KCQkkaUxpbWl0ID0gKCRtdWx0aXBsZVBsb3RzKSA/ICRncm91cENvdW50IDogMTsNCgkJZm9yKCRpID0gMDsgJGkgPCAkaUxpbWl0OyArKyRpKSB7DQoJCQkkZ3JvdXBpbmcgPSAkdGhpcy0+X2NoYXJ0LT5nZXRQbG90QXJlYSgpLT5nZXRQbG90R3JvdXBCeUluZGV4KCRpKS0+Z2V0UGxvdEdyb3VwaW5nKCk7DQoJCQkkZXhwbG9kZWQgPSAkdGhpcy0+X2NoYXJ0LT5nZXRQbG90QXJlYSgpLT5nZXRQbG90R3JvdXBCeUluZGV4KCRpKS0+Z2V0UGxvdFN0eWxlKCk7DQoJCQlpZiAoJGkgPT0gMCkgew0KCQkJCSRkYXRhc2V0TGFiZWxzID0gJHRoaXMtPl9jaGFydC0+Z2V0UGxvdEFyZWEoKS0+Z2V0UGxvdEdyb3VwQnlJbmRleCgkaSktPmdldFBsb3RDYXRlZ29yeUJ5SW5kZXgoMCktPmdldERhdGFWYWx1ZXMoKTsNCgkJCQlpZiAoY291bnQoJGRhdGFzZXRMYWJlbHMpID4gMCkgew0KCQkJCQkkZGF0YXNldExhYmVscyA9ICR0aGlzLT5fZm9ybWF0RGF0YVNldExhYmVscygkaSwkZGF0YXNldExhYmVscyk7DQoJCQkJfQ0KCQkJfQ0KDQoJCQkkc2VyaWVzQ291bnQgPSAkdGhpcy0+X2NoYXJ0LT5nZXRQbG90QXJlYSgpLT5nZXRQbG90R3JvdXBCeUluZGV4KCRpKS0+Z2V0UGxvdFNlcmllc0NvdW50KCk7DQoJCQkkc2VyaWVzUGxvdHMgPSBhcnJheSgpOw0KCQkJLy8JRm9yIHBpZSBjaGFydHMsIHdlIG9ubHkgZGlzcGxheSB0aGUgZmlyc3Qgc2VyaWVzOiBkb3VnaG51dCBjaGFydHMgZ2VuZXJhbGx5IGRpc3BsYXkgYWxsIHNlcmllcw0KCQkJJGpMaW1pdCA9ICgkbXVsdGlwbGVQbG90cykgPyAkc2VyaWVzQ291bnQgOiAxOw0KCQkJLy8JTG9vcCB0aHJvdWdoIGVhY2ggZGF0YSBzZXJpZXMgaW4gdHVybg0KCQkJZm9yKCRqID0gMDsgJGogPCAkakxpbWl0OyArKyRqKSB7DQoJCQkJJGRhdGFWYWx1ZXMgPSAkdGhpcy0+X2NoYXJ0LT5nZXRQbG90QXJlYSgpLT5nZXRQbG90R3JvdXBCeUluZGV4KCRpKS0+Z2V0UGxvdFZhbHVlc0J5SW5kZXgoJGopLT5nZXREYXRhVmFsdWVzKCk7DQoNCgkJCQkvLwlGaWxsIGluIGFueSBtaXNzaW5nIHZhbHVlcyBpbiB0aGUgJGRhdGFWYWx1ZXMgYXJyYXkNCgkJCQkkdGVzdEN1cnJlbnRJbmRleCA9IDA7DQoJCQkJZm9yZWFjaCgkZGF0YVZhbHVlcyBhcyAkayA9PiAkZGF0YVZhbHVlKSB7DQoJCQkJCXdoaWxlKCRrICE9ICR0ZXN0Q3VycmVudEluZGV4KSB7DQoJCQkJCQkkZGF0YVZhbHVlc1skdGVzdEN1cnJlbnRJbmRleF0gPSBudWxsOw0KCQkJCQkJKyskdGVzdEN1cnJlbnRJbmRleDsNCgkJCQkJfQ0KCQkJCQkrKyR0ZXN0Q3VycmVudEluZGV4Ow0KCQkJCX0NCg0KCQkJCWlmICgkZGltZW5zaW9ucyA9PSAnM2QnKSB7DQoJCQkJCSRzZXJpZXNQbG90ID0gbmV3IFBpZVBsb3QzRCgkZGF0YVZhbHVlcyk7DQoJCQkJfSBlbHNlIHsNCgkJCQkJaWYgKCRkb3VnaG51dCkgew0KCQkJCQkJJHNlcmllc1Bsb3QgPSBuZXcgUGllUGxvdEMoJGRhdGFWYWx1ZXMpOw0KCQkJCQl9IGVsc2Ugew0KCQkJCQkJJHNlcmllc1Bsb3QgPSBuZXcgUGllUGxvdCgkZGF0YVZhbHVlcyk7DQoJCQkJCX0NCgkJCQl9DQoNCgkJCQlpZiAoJG11bHRpcGxlUGxvdHMpIHsNCgkJCQkJJHNlcmllc1Bsb3QtPlNldFNpemUoKCRqTGltaXQtJGopIC8gKCRqTGltaXQgKiA0KSk7DQoJCQkJfQ0KDQoJCQkJaWYgKCRkb3VnaG51dCkgew0KCQkJCQkkc2VyaWVzUGxvdC0+U2V0TWlkQ29sb3IoJ3doaXRlJyk7DQoJCQkJfQ0KDQoJCQkJJHNlcmllc1Bsb3QtPlNldENvbG9yKHNlbGY6OiRfY29sb3VyU2V0W3NlbGY6OiRfcGxvdENvbG91cisrXSk7DQoJCQkJJHNlcmllc1Bsb3QtPlNldExhYmVscyhhcnJheV9maWxsKDAsY291bnQoJGRhdGFzZXRMYWJlbHMpLCcnKSk7DQoJCQkJaWYgKCRkaW1lbnNpb25zICE9ICczZCcpIHsNCgkJCQkJJHNlcmllc1Bsb3QtPlNldEd1aWRlTGluZXMoZmFsc2UpOw0KCQkJCX0NCgkJCQlpZiAoJGogPT0gMCkgew0KCQkJCQlpZiAoJGV4cGxvZGVkKSB7DQoJCQkJCQkkc2VyaWVzUGxvdC0+RXhwbG9kZUFsbCgpOw0KCQkJCQl9DQoJCQkJCSRzZXJpZXNQbG90LT5TZXRMZWdlbmRzKCRkYXRhc2V0TGFiZWxzKTsNCgkJCQl9DQoNCgkJCQkkdGhpcy0+X2dyYXBoLT5BZGQoJHNlcmllc1Bsb3QpOw0KCQkJfQ0KCQl9DQoJfQkvLwlmdW5jdGlvbiBfcmVuZGVyUGllQ2hhcnQoKQ0KDQoNCglwcml2YXRlIGZ1bmN0aW9uIF9yZW5kZXJSYWRhckNoYXJ0KCRncm91cENvdW50KSB7DQoJCXJlcXVpcmVfb25jZSgnanBncmFwaF9yYWRhci5waHAnKTsNCg0KCQkkdGhpcy0+X3JlbmRlclJhZGFyUGxvdEFyZWEoKTsNCg0KCQlmb3IoJGkgPSAwOyAkaSA8ICRncm91cENvdW50OyArKyRpKSB7DQoJCQkkdGhpcy0+X3JlbmRlclBsb3RSYWRhcigkaSk7DQoJCX0NCgl9CS8vCWZ1bmN0aW9uIF9yZW5kZXJSYWRhckNoYXJ0KCkNCg0KDQoJcHJpdmF0ZSBmdW5jdGlvbiBfcmVuZGVyU3RvY2tDaGFydCgkZ3JvdXBDb3VudCkgew0KCQlyZXF1aXJlX29uY2UoJ2pwZ3JhcGhfc3RvY2sucGhwJyk7DQoNCgkJJHRoaXMtPl9yZW5kZXJDYXJ0ZXNpYW5QbG90QXJlYSgpOw0KDQoJCWZvcigkaSA9IDA7ICRpIDwgJGdyb3VwQ291bnQ7ICsrJGkpIHsNCgkJCSR0aGlzLT5fcmVuZGVyUGxvdFN0b2NrKCRpKTsNCgkJfQ0KCX0JLy8JZnVuY3Rpb24gX3JlbmRlclN0b2NrQ2hhcnQoKQ0KDQoNCglwcml2YXRlIGZ1bmN0aW9uIF9yZW5kZXJDb250b3VyQ2hhcnQoJGdyb3VwQ291bnQsJGRpbWVuc2lvbnMpIHsNCgkJcmVxdWlyZV9vbmNlKCdqcGdyYXBoX2NvbnRvdXIucGhwJyk7DQoNCgkJJHRoaXMtPl9yZW5kZXJDYXJ0ZXNpYW5QbG90QXJlYSgnaW50aW50Jyk7DQoNCgkJZm9yKCRpID0gMDsgJGkgPCAkZ3JvdXBDb3VudDsgKyskaSkgew0KCQkJJHRoaXMtPl9yZW5kZXJQbG90Q29udG91cigkaSk7DQoJCX0NCgl9CS8vCWZ1bmN0aW9uIF9yZW5kZXJDb250b3VyQ2hhcnQoKQ0KDQoNCglwcml2YXRlIGZ1bmN0aW9uIF9yZW5kZXJDb21iaW5hdGlvbkNoYXJ0KCRncm91cENvdW50LCRkaW1lbnNpb25zLCRvdXRwdXREZXN0aW5hdGlvbikgew0KCQlyZXF1aXJlX29uY2UoJ2pwZ3JhcGhfbGluZS5waHAnKTsNCgkJcmVxdWlyZV9vbmNlKCdqcGdyYXBoX2Jhci5waHAnKTsNCgkJcmVxdWlyZV9vbmNlKCdqcGdyYXBoX3NjYXR0ZXIucGhwJyk7DQoJCXJlcXVpcmVfb25jZSgnanBncmFwaF9yZWdzdGF0LnBocCcpOw0KCQlyZXF1aXJlX29uY2UoJ2pwZ3JhcGhfbGluZS5waHAnKTsNCg0KCQkkdGhpcy0+X3JlbmRlckNhcnRlc2lhblBsb3RBcmVhKCk7DQoNCgkJZm9yKCRpID0gMDsgJGkgPCAkZ3JvdXBDb3VudDsgKyskaSkgew0KCQkJJGRpbWVuc2lvbnMgPSBudWxsOw0KCQkJJGNoYXJ0VHlwZSA9ICR0aGlzLT5fY2hhcnQtPmdldFBsb3RBcmVhKCktPmdldFBsb3RHcm91cEJ5SW5kZXgoJGkpLT5nZXRQbG90VHlwZSgpOw0KCQkJc3dpdGNoICgkY2hhcnRUeXBlKSB7DQoJCQkJY2FzZSAnYXJlYTNEQ2hhcnQnIDoNCgkJCQkJJGRpbWVuc2lvbnMgPSAnM2QnOw0KCQkJCWNhc2UgJ2FyZWFDaGFydCcgOg0KCQkJCQkkdGhpcy0+X3JlbmRlclBsb3RMaW5lKCRpLFRydWUsVHJ1ZSwkZGltZW5zaW9ucyk7DQoJCQkJCWJyZWFrOw0KCQkJCWNhc2UgJ2JhcjNEQ2hhcnQnIDoNCgkJCQkJJGRpbWVuc2lvbnMgPSAnM2QnOw0KCQkJCWNhc2UgJ2JhckNoYXJ0JyA6DQoJCQkJCSR0aGlzLT5fcmVuZGVyUGxvdEJhcigkaSwkZGltZW5zaW9ucyk7DQoJCQkJCWJyZWFrOw0KCQkJCWNhc2UgJ2xpbmUzRENoYXJ0JyA6DQoJCQkJCSRkaW1lbnNpb25zID0gJzNkJzsNCgkJCQljYXNlICdsaW5lQ2hhcnQnIDoNCgkJCQkJJHRoaXMtPl9yZW5kZXJQbG90TGluZSgkaSxGYWxzZSxUcnVlLCRkaW1lbnNpb25zKTsNCgkJCQkJYnJlYWs7DQoJCQkJY2FzZSAnc2NhdHRlckNoYXJ0JyA6DQoJCQkJCSR0aGlzLT5fcmVuZGVyUGxvdFNjYXR0ZXIoJGksZmFsc2UpOw0KCQkJCQlicmVhazsNCgkJCQljYXNlICdidWJibGVDaGFydCcgOg0KCQkJCQkkdGhpcy0+X3JlbmRlclBsb3RTY2F0dGVyKCRpLHRydWUpOw0KCQkJCQlicmVhazsNCgkJCQlkZWZhdWx0CToNCgkJCQkJJHRoaXMtPl9ncmFwaCA9IG51bGw7DQoJCQkJCXJldHVybiBmYWxzZTsNCgkJCX0NCgkJfQ0KDQoJCSR0aGlzLT5fcmVuZGVyTGVnZW5kKCk7DQoNCgkJJHRoaXMtPl9ncmFwaC0+U3Ryb2tlKCRvdXRwdXREZXN0aW5hdGlvbik7DQoJCXJldHVybiB0cnVlOw0KCX0JLy8JZnVuY3Rpb24gX3JlbmRlckNvbWJpbmF0aW9uQ2hhcnQoKQ0KDQoNCglwdWJsaWMgZnVuY3Rpb24gcmVuZGVyKCRvdXRwdXREZXN0aW5hdGlvbikgew0KCQkkZ3JvdXBDb3VudCA9ICR0aGlzLT5fY2hhcnQtPmdldFBsb3RBcmVhKCktPmdldFBsb3RHcm91cENvdW50KCk7DQoNCgkJJGRpbWVuc2lvbnMgPSBudWxsOw0KCQlpZiAoJGdyb3VwQ291bnQgPT0gMSkgew0KCQkJJGNoYXJ0VHlwZSA9ICR0aGlzLT5fY2hhcnQtPmdldFBsb3RBcmVhKCktPmdldFBsb3RHcm91cEJ5SW5kZXgoMCktPmdldFBsb3RUeXBlKCk7DQoJCX0gZWxzZSB7DQoJCQkkY2hhcnRUeXBlcyA9IGFycmF5KCk7DQoJCQlmb3IoJGkgPSAwOyAkaSA8ICRncm91cENvdW50OyArKyRpKSB7DQoJCQkJJGNoYXJ0VHlwZXNbXSA9ICR0aGlzLT5fY2hhcnQtPmdldFBsb3RBcmVhKCktPmdldFBsb3RHcm91cEJ5SW5kZXgoJGkpLT5nZXRQbG90VHlwZSgpOw0KCQkJfQ0KCQkJJGNoYXJ0VHlwZXMgPSBhcnJheV91bmlxdWUoJGNoYXJ0VHlwZXMpOw0KCQkJaWYgKGNvdW50KCRjaGFydFR5cGVzKSA9PSAxKSB7DQoJCQkJJGNoYXJ0VHlwZSA9IGFycmF5X3BvcCgkY2hhcnRUeXBlcyk7DQoJCQl9IGVsc2VpZiAoY291bnQoJGNoYXJ0VHlwZXMpID09IDApIHsNCgkJCQllY2hvICdDaGFydCBpcyBub3QgeWV0IGltcGxlbWVudGVkPGJyIC8+JzsNCgkJCQlyZXR1cm4gZmFsc2U7DQoJCQl9IGVsc2Ugew0KCQkJCXJldHVybiAkdGhpcy0+X3JlbmRlckNvbWJpbmF0aW9uQ2hhcnQoJGdyb3VwQ291bnQsJGRpbWVuc2lvbnMsJG91dHB1dERlc3RpbmF0aW9uKTsNCgkJCX0NCgkJfQ0KDQoJCXN3aXRjaCAoJGNoYXJ0VHlwZSkgew0KCQkJY2FzZSAnYXJlYTNEQ2hhcnQnIDoNCgkJCQkkZGltZW5zaW9ucyA9ICczZCc7DQoJCQljYXNlICdhcmVhQ2hhcnQnIDoNCgkJCQkkdGhpcy0+X3JlbmRlckFyZWFDaGFydCgkZ3JvdXBDb3VudCwkZGltZW5zaW9ucyk7DQoJCQkJYnJlYWs7DQoJCQljYXNlICdiYXIzRENoYXJ0JyA6DQoJCQkJJGRpbWVuc2lvbnMgPSAnM2QnOw0KCQkJY2FzZSAnYmFyQ2hhcnQnIDoNCgkJCQkkdGhpcy0+X3JlbmRlckJhckNoYXJ0KCRncm91cENvdW50LCRkaW1lbnNpb25zKTsNCgkJCQlicmVhazsNCgkJCWNhc2UgJ2xpbmUzRENoYXJ0JyA6DQoJCQkJJGRpbWVuc2lvbnMgPSAnM2QnOw0KCQkJY2FzZSAnbGluZUNoYXJ0JyA6DQoJCQkJJHRoaXMtPl9yZW5kZXJMaW5lQ2hhcnQoJGdyb3VwQ291bnQsJGRpbWVuc2lvbnMpOw0KCQkJCWJyZWFrOw0KCQkJY2FzZSAncGllM0RDaGFydCcgOg0KCQkJCSRkaW1lbnNpb25zID0gJzNkJzsNCgkJCWNhc2UgJ3BpZUNoYXJ0JyA6DQoJCQkJJHRoaXMtPl9yZW5kZXJQaWVDaGFydCgkZ3JvdXBDb3VudCwkZGltZW5zaW9ucyxGYWxzZSxGYWxzZSk7DQoJCQkJYnJlYWs7DQoJCQljYXNlICdkb3VnaG51dDNEQ2hhcnQnIDoNCgkJCQkkZGltZW5zaW9ucyA9ICczZCc7DQoJCQljYXNlICdkb3VnaG51dENoYXJ0JyA6DQoJCQkJJHRoaXMtPl9yZW5kZXJQaWVDaGFydCgkZ3JvdXBDb3VudCwkZGltZW5zaW9ucyxUcnVlLFRydWUpOw0KCQkJCWJyZWFrOw0KCQkJY2FzZSAnc2NhdHRlckNoYXJ0JyA6DQoJCQkJJHRoaXMtPl9yZW5kZXJTY2F0dGVyQ2hhcnQoJGdyb3VwQ291bnQpOw0KCQkJCWJyZWFrOw0KCQkJY2FzZSAnYnViYmxlQ2hhcnQnIDoNCgkJCQkkdGhpcy0+X3JlbmRlckJ1YmJsZUNoYXJ0KCRncm91cENvdW50KTsNCgkJCQlicmVhazsNCgkJCWNhc2UgJ3JhZGFyQ2hhcnQnIDoNCgkJCQkkdGhpcy0+X3JlbmRlclJhZGFyQ2hhcnQoJGdyb3VwQ291bnQpOw0KCQkJCWJyZWFrOw0KCQkJY2FzZSAnc3VyZmFjZTNEQ2hhcnQnIDoNCgkJCQkkZGltZW5zaW9ucyA9ICczZCc7DQoJCQljYXNlICdzdXJmYWNlQ2hhcnQnIDoNCgkJCQkkdGhpcy0+X3JlbmRlckNvbnRvdXJDaGFydCgkZ3JvdXBDb3VudCwkZGltZW5zaW9ucyk7DQoJCQkJYnJlYWs7DQoJCQljYXNlICdzdG9ja0NoYXJ0JyA6DQoJCQkJJHRoaXMtPl9yZW5kZXJTdG9ja0NoYXJ0KCRncm91cENvdW50LCRkaW1lbnNpb25zKTsNCgkJCQlicmVhazsNCgkJCWRlZmF1bHQJOg0KCQkJCWVjaG8gJGNoYXJ0VHlwZS4nIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQ8YnIgLz4nOw0KCQkJCXJldHVybiBmYWxzZTsNCgkJfQ0KCQkkdGhpcy0+X3JlbmRlckxlZ2VuZCgpOw0KDQoJCSR0aGlzLT5fZ3JhcGgtPlN0cm9rZSgkb3V0cHV0RGVzdGluYXRpb24pOw0KCQlyZXR1cm4gdHJ1ZTsNCgl9CS8vCWZ1bmN0aW9uIHJlbmRlcigpDQoNCg0KCS8qKg0KCSAqIENyZWF0ZSBhIG5ldyBQSFBFeGNlbF9DaGFydF9SZW5kZXJlcl9qcGdyYXBoDQoJICovDQoJcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KFBIUEV4Y2VsX0NoYXJ0ICRjaGFydCkNCgl7DQoJCSR0aGlzLT5fZ3JhcGgJPSBudWxsOw0KCQkkdGhpcy0+X2NoYXJ0CT0gJGNoYXJ0Ow0KCX0JLy8JZnVuY3Rpb24gX19jb25zdHJ1Y3QoKQ0KDQp9CS8vCVBIUEV4Y2VsX0NoYXJ0X1JlbmRlcmVyX2pwZ3JhcGgNCg==]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Chart/Renderer/PHP Charting Libraries.txt</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Q2hhcnREaXJlY3Rvcg0KCWh0dHA6Ly93d3cuYWR2c29mdGVuZy5jb20vY2RwaHAuaHRtbA0KDQpHcmFQSFBpdGUNCglodHRwOi8vZ3JhcGhwaXRlLnNvdXJjZWZvcmdlLm5ldC8NCg0KSnBHcmFwaA0KCWh0dHA6Ly93d3cuYWRpdHVzLm51L2pwZ3JhcGgvDQoNCkxpYkNoYXJ0DQoJaHR0cDovL25ha3UuZG9oY3Jldy5jb20vbGliY2hhcnQvcGFnZXMvaW50cm9kdWN0aW9uLw0KDQpwQ2hhcnQNCglodHRwOi8vcGNoYXJ0LnNvdXJjZWZvcmdlLm5ldC8NCg0KVGVlQ2hhcnQNCglodHRwOi8vd3d3LnN0ZWVtYS5jb20vcHJvZHVjdHMvdGVlY2hhcnQvb3ZlcnZpZXcuaHRtbA0K]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Chart/Title.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIFBIUEV4Y2VsCiAqCiAqIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICoKICogQGNhdGVnb3J5CVBIUEV4Y2VsCiAqIEBwYWNrYWdlCQlQSFBFeGNlbF9DaGFydAogKiBAY29weXJpZ2h0CUNvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwgKGh0dHA6Ly93d3cuY29kZXBsZXguY29tL1BIUEV4Y2VsKQogKiBAbGljZW5zZQkJaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL29sZC1saWNlbnNlcy9sZ3BsLTIuMS50eHQJTEdQTAogKiBAdmVyc2lvbgkJMS43LjcsIDIwMTItMDUtMTkKICovCgoKLyoqCiAqIFBIUEV4Y2VsX0NoYXJ0X1RpdGxlCiAqCiAqIEBjYXRlZ29yeQlQSFBFeGNlbAogKiBAcGFja2FnZQkJUEhQRXhjZWxfQ2hhcnQKICogQGNvcHlyaWdodAlDb3B5cmlnaHQgKGMpIDIwMDYgLSAyMDEyIFBIUEV4Y2VsIChodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9QSFBFeGNlbCkKICovCmNsYXNzIFBIUEV4Y2VsX0NoYXJ0X1RpdGxlCnsKCgkvKioKCSAqIFRpdGxlIENhcHRpb24KCSAqCgkgKiBAdmFyIHN0cmluZwoJICovCglwcml2YXRlICRfY2FwdGlvbiA9IG51bGw7CgoJLyoqCgkgKiBUaXRsZSBMYXlvdXQKCSAqCgkgKiBAdmFyIFBIUEV4Y2VsX0NoYXJ0X0xheW91dAoJICovCglwcml2YXRlICRfbGF5b3V0ID0gbnVsbDsKCgkvKioKCSAqIENyZWF0ZSBhIG5ldyBQSFBFeGNlbF9DaGFydF9UaXRsZQoJICovCglwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJGNhcHRpb24gPSBudWxsLCBQSFBFeGNlbF9DaGFydF9MYXlvdXQgJGxheW91dCA9IG51bGwpCgl7CgkJJHRoaXMtPl9jYXB0aW9uID0gJGNhcHRpb247CgkJJHRoaXMtPl9sYXlvdXQgPSAkbGF5b3V0OwoJfQoKCS8qKgoJICogR2V0IGNhcHRpb24KCSAqCgkgKiBAcmV0dXJuIHN0cmluZwoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0Q2FwdGlvbigpIHsKCQlyZXR1cm4gJHRoaXMtPl9jYXB0aW9uOwoJfQoKCS8qKgoJICogU2V0IGNhcHRpb24KCSAqCgkgKiBAcGFyYW0gc3RyaW5nICRjYXB0aW9uCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBzZXRDYXB0aW9uKCRjYXB0aW9uID0gbnVsbCkgewoJCSR0aGlzLT5fY2FwdGlvbiA9ICRjYXB0aW9uOwoJfQoKCS8qKgoJICogR2V0IExheW91dAoJICoKCSAqIEByZXR1cm4gUEhQRXhjZWxfQ2hhcnRfTGF5b3V0CgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRMYXlvdXQoKSB7CgkJcmV0dXJuICR0aGlzLT5fbGF5b3V0OwoJfQoKfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Comment.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIFBIUEV4Y2VsCiAqCiAqIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICoKICogQGNhdGVnb3J5ICAgUEhQRXhjZWwKICogQHBhY2thZ2UgICAgUEhQRXhjZWwKICogQGNvcHlyaWdodCAgQ29weXJpZ2h0IChjKSAyMDA2IC0gMjAxMiBQSFBFeGNlbCAoaHR0cDovL3d3dy5jb2RlcGxleC5jb20vUEhQRXhjZWwpCiAqIEBsaWNlbnNlICAgIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9vbGQtbGljZW5zZXMvbGdwbC0yLjEudHh0CUxHUEwKICogQHZlcnNpb24gICAgMS43LjcsIDIwMTItMDUtMTkKICovCgoKLyoqCiAqIFBIUEV4Y2VsX0NvbW1lbnQKICoKICogQGNhdGVnb3J5ICAgUEhQRXhjZWwKICogQHBhY2thZ2UgICAgUEhQRXhjZWwKICogQGNvcHlyaWdodCAgQ29weXJpZ2h0IChjKSAyMDA2IC0gMjAxMiBQSFBFeGNlbCAoaHR0cDovL3d3dy5jb2RlcGxleC5jb20vUEhQRXhjZWwpCiAqLwpjbGFzcyBQSFBFeGNlbF9Db21tZW50IGltcGxlbWVudHMgUEhQRXhjZWxfSUNvbXBhcmFibGUKewoJLyoqCgkgKiBBdXRob3IKCSAqCgkgKiBAdmFyIHN0cmluZwoJICovCglwcml2YXRlICRfYXV0aG9yOwoKCS8qKgoJICogUmljaCB0ZXh0IGNvbW1lbnQKCSAqCgkgKiBAdmFyIFBIUEV4Y2VsX1JpY2hUZXh0CgkgKi8KCXByaXZhdGUgJF90ZXh0OwoKCS8qKgoJICogQ29tbWVudCB3aWR0aCAoQ1NTIHN0eWxlLCBpLmUuIFhYcHggb3IgWVlwdCkKCSAqCgkgKiBAdmFyIHN0cmluZwoJICovCglwcml2YXRlICRfd2lkdGggPSAnOTZwdCc7CgoJLyoqCgkgKiBMZWZ0IG1hcmdpbiAoQ1NTIHN0eWxlLCBpLmUuIFhYcHggb3IgWVlwdCkKCSAqCgkgKiBAdmFyIHN0cmluZwoJICovCglwcml2YXRlICRfbWFyZ2luTGVmdCA9ICc1OS4yNXB0JzsKCgkvKioKCSAqIFRvcCBtYXJnaW4gKENTUyBzdHlsZSwgaS5lLiBYWHB4IG9yIFlZcHQpCgkgKgoJICogQHZhciBzdHJpbmcKCSAqLwoJcHJpdmF0ZSAkX21hcmdpblRvcCA9ICcxLjVwdCc7CgoJLyoqCgkgKiBWaXNpYmxlCgkgKgoJICogQHZhciBib29sZWFuCgkgKi8KCXByaXZhdGUgJF92aXNpYmxlID0gZmFsc2U7CgoJLyoqCgkgKiBDb21tZW50IGhlaWdodCAoQ1NTIHN0eWxlLCBpLmUuIFhYcHggb3IgWVlwdCkKCSAqCgkgKiBAdmFyIHN0cmluZwoJICovCglwcml2YXRlICRfaGVpZ2h0ID0gJzU1LjVwdCc7CgoJLyoqCgkgKiBDb21tZW50IGZpbGwgY29sb3IKCSAqCgkgKiBAdmFyIFBIUEV4Y2VsX1N0eWxlX0NvbG9yCgkgKi8KCXByaXZhdGUgJF9maWxsQ29sb3I7CgoJLyoqCgkgKiBBbGlnbm1lbnQKCSAqCgkgKiBAdmFyIHN0cmluZwoJICovCglwcml2YXRlICRfYWxpZ25tZW50OwoKICAgIC8qKgogICAgICogQ3JlYXRlIGEgbmV3IFBIUEV4Y2VsX0NvbW1lbnQKICAgICAqCiAgICAgKiBAdGhyb3dzCUV4Y2VwdGlvbgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoKQogICAgewogICAgCS8vIEluaXRpYWxpc2UgdmFyaWFibGVzCiAgICAJJHRoaXMtPl9hdXRob3IJCT0gJ0F1dGhvcic7CiAgICAJJHRoaXMtPl90ZXh0CQk9IG5ldyBQSFBFeGNlbF9SaWNoVGV4dCgpOwogICAgCSR0aGlzLT5fZmlsbENvbG9yCT0gbmV3IFBIUEV4Y2VsX1N0eWxlX0NvbG9yKCdGRkZGRkZFMScpOwoJCSR0aGlzLT5fYWxpZ25tZW50CT0gUEhQRXhjZWxfU3R5bGVfQWxpZ25tZW50OjpIT1JJWk9OVEFMX0dFTkVSQUw7CiAgICB9CgogICAgLyoqCiAgICAgKiBHZXQgQXV0aG9yCiAgICAgKgogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldEF1dGhvcigpIHsKICAgIAlyZXR1cm4gJHRoaXMtPl9hdXRob3I7CiAgICB9CgogICAgLyoqCiAgICAgKiBTZXQgQXV0aG9yCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyAkcFZhbHVlCiAgICAgKiBAcmV0dXJuIFBIUEV4Y2VsX0NvbW1lbnQKICAgICAqLwoJcHVibGljIGZ1bmN0aW9uIHNldEF1dGhvcigkcFZhbHVlID0gJycpIHsKCQkkdGhpcy0+X2F1dGhvciA9ICRwVmFsdWU7CgkJcmV0dXJuICR0aGlzOwoJfQoKICAgIC8qKgogICAgICogR2V0IFJpY2ggdGV4dCBjb21tZW50CiAgICAgKgogICAgICogQHJldHVybiBQSFBFeGNlbF9SaWNoVGV4dAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0VGV4dCgpIHsKICAgIAlyZXR1cm4gJHRoaXMtPl90ZXh0OwogICAgfQoKICAgIC8qKgogICAgICogU2V0IFJpY2ggdGV4dCBjb21tZW50CiAgICAgKgogICAgICogQHBhcmFtIFBIUEV4Y2VsX1JpY2hUZXh0ICRwVmFsdWUKICAgICAqIEByZXR1cm4gUEhQRXhjZWxfQ29tbWVudAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gc2V0VGV4dChQSFBFeGNlbF9SaWNoVGV4dCAkcFZhbHVlKSB7CiAgICAJJHRoaXMtPl90ZXh0ID0gJHBWYWx1ZTsKICAgIAlyZXR1cm4gJHRoaXM7CiAgICB9CgogICAgLyoqCiAgICAgKiBHZXQgY29tbWVudCB3aWR0aCAoQ1NTIHN0eWxlLCBpLmUuIFhYcHggb3IgWVlwdCkKICAgICAqCiAgICAgKiBAcmV0dXJuIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0V2lkdGgoKSB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5fd2lkdGg7CiAgICB9CgogICAgLyoqCiAgICAgKiBTZXQgY29tbWVudCB3aWR0aCAoQ1NTIHN0eWxlLCBpLmUuIFhYcHggb3IgWVlwdCkKICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nICR2YWx1ZQogICAgICogQHJldHVybiBQSFBFeGNlbF9Db21tZW50CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBzZXRXaWR0aCgkdmFsdWUgPSAnOTZwdCcpIHsKICAgICAgICAkdGhpcy0+X3dpZHRoID0gJHZhbHVlOwogICAgICAgIHJldHVybiAkdGhpczsKICAgIH0KCiAgICAvKioKICAgICAqIEdldCBjb21tZW50IGhlaWdodCAoQ1NTIHN0eWxlLCBpLmUuIFhYcHggb3IgWVlwdCkKICAgICAqCiAgICAgKiBAcmV0dXJuIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0SGVpZ2h0KCkgewogICAgICAgIHJldHVybiAkdGhpcy0+X2hlaWdodDsKICAgIH0KCiAgICAvKioKICAgICAqIFNldCBjb21tZW50IGhlaWdodCAoQ1NTIHN0eWxlLCBpLmUuIFhYcHggb3IgWVlwdCkKICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nICR2YWx1ZQogICAgICogQHJldHVybiBQSFBFeGNlbF9Db21tZW50CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBzZXRIZWlnaHQoJHZhbHVlID0gJzU1LjVwdCcpIHsKICAgICAgICAkdGhpcy0+X2hlaWdodCA9ICR2YWx1ZTsKICAgICAgICByZXR1cm4gJHRoaXM7CiAgICB9CgogICAgLyoqCiAgICAgKiBHZXQgbGVmdCBtYXJnaW4gKENTUyBzdHlsZSwgaS5lLiBYWHB4IG9yIFlZcHQpCiAgICAgKgogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldE1hcmdpbkxlZnQoKSB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5fbWFyZ2luTGVmdDsKICAgIH0KCiAgICAvKioKICAgICAqIFNldCBsZWZ0IG1hcmdpbiAoQ1NTIHN0eWxlLCBpLmUuIFhYcHggb3IgWVlwdCkKICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nICR2YWx1ZQogICAgICogQHJldHVybiBQSFBFeGNlbF9Db21tZW50CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBzZXRNYXJnaW5MZWZ0KCR2YWx1ZSA9ICc1OS4yNXB0JykgewogICAgICAgICR0aGlzLT5fbWFyZ2luTGVmdCA9ICR2YWx1ZTsKICAgICAgICByZXR1cm4gJHRoaXM7CiAgICB9CgogICAgLyoqCiAgICAgKiBHZXQgdG9wIG1hcmdpbiAoQ1NTIHN0eWxlLCBpLmUuIFhYcHggb3IgWVlwdCkKICAgICAqCiAgICAgKiBAcmV0dXJuIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0TWFyZ2luVG9wKCkgewogICAgICAgIHJldHVybiAkdGhpcy0+X21hcmdpblRvcDsKICAgIH0KCiAgICAvKioKICAgICAqIFNldCB0b3AgbWFyZ2luIChDU1Mgc3R5bGUsIGkuZS4gWFhweCBvciBZWXB0KQogICAgICoKICAgICAqIEBwYXJhbSBzdHJpbmcgJHZhbHVlCiAgICAgKiBAcmV0dXJuIFBIUEV4Y2VsX0NvbW1lbnQKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHNldE1hcmdpblRvcCgkdmFsdWUgPSAnMS41cHQnKSB7CiAgICAgICAgJHRoaXMtPl9tYXJnaW5Ub3AgPSAkdmFsdWU7CiAgICAgICAgcmV0dXJuICR0aGlzOwogICAgfQoKICAgIC8qKgogICAgICogSXMgdGhlIGNvbW1lbnQgdmlzaWJsZSBieSBkZWZhdWx0PwogICAgICoKICAgICAqIEByZXR1cm4gYm9vbGVhbgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0VmlzaWJsZSgpIHsKICAgICAgICByZXR1cm4gJHRoaXMtPl92aXNpYmxlOwogICAgfQoKICAgIC8qKgogICAgICogU2V0IGNvbW1lbnQgZGVmYXVsdCB2aXNpYmlsaXR5CiAgICAgKgogICAgICogQHBhcmFtIGJvb2xlYW4gJHZhbHVlCiAgICAgKiBAcmV0dXJuIFBIUEV4Y2VsX0NvbW1lbnQKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHNldFZpc2libGUoJHZhbHVlID0gZmFsc2UpIHsKICAgICAgICAkdGhpcy0+X3Zpc2libGUgPSAkdmFsdWU7CiAgICAgICAgcmV0dXJuICR0aGlzOwogICAgfQoKICAgIC8qKgogICAgICogR2V0IGZpbGwgY29sb3IKICAgICAqCiAgICAgKiBAcmV0dXJuIFBIUEV4Y2VsX1N0eWxlX0NvbG9yCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRGaWxsQ29sb3IoKSB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5fZmlsbENvbG9yOwogICAgfQoKICAgIC8qKgogICAgICogU2V0IEFsaWdubWVudAogICAgICoKICAgICAqIEBwYXJhbSBzdHJpbmcgJHBWYWx1ZQogICAgICogQHJldHVybiBQSFBFeGNlbF9Db21tZW50CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBzZXRBbGlnbm1lbnQoJHBWYWx1ZSA9IFBIUEV4Y2VsX1N0eWxlX0FsaWdubWVudDo6SE9SSVpPTlRBTF9HRU5FUkFMKSB7CgkJJHRoaXMtPl9hbGlnbm1lbnQgPSAkcFZhbHVlOwoJCXJldHVybiAkdGhpczsKICAgIH0KCiAgICAvKioKICAgICAqIEdldCBBbGlnbm1lbnQKICAgICAqCiAgICAgKiBAcmV0dXJuIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0QWxpZ25tZW50KCkgewoJCXJldHVybiAkdGhpcy0+X2FsaWdubWVudDsKICAgIH0KCgkvKioKCSAqIEdldCBoYXNoIGNvZGUKCSAqCgkgKiBAcmV0dXJuIHN0cmluZwlIYXNoIGNvZGUKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldEhhc2hDb2RlKCkgewogICAgCXJldHVybiBtZDUoCiAgICAJCSAgJHRoaXMtPl9hdXRob3IKICAgIAkJLiAkdGhpcy0+X3RleHQtPmdldEhhc2hDb2RlKCkKICAgIAkJLiAkdGhpcy0+X3dpZHRoCiAgICAJCS4gJHRoaXMtPl9oZWlnaHQKICAgIAkJLiAkdGhpcy0+X21hcmdpbkxlZnQKICAgIAkJLiAkdGhpcy0+X21hcmdpblRvcAogICAgCQkuICgkdGhpcy0+X3Zpc2libGUgPyAxIDogMCkKICAgIAkJLiAkdGhpcy0+X2ZpbGxDb2xvci0+Z2V0SGFzaENvZGUoKQogICAgCQkuICR0aGlzLT5fYWxpZ25tZW50CiAgICAJCS4gX19DTEFTU19fCiAgICAJKTsKICAgIH0KCgkvKioKCSAqIEltcGxlbWVudCBQSFAgX19jbG9uZSB0byBjcmVhdGUgYSBkZWVwIGNsb25lLCBub3QganVzdCBhIHNoYWxsb3cgY29weS4KCSAqLwoJcHVibGljIGZ1bmN0aW9uIF9fY2xvbmUoKSB7CgkJJHZhcnMgPSBnZXRfb2JqZWN0X3ZhcnMoJHRoaXMpOwoJCWZvcmVhY2ggKCR2YXJzIGFzICRrZXkgPT4gJHZhbHVlKSB7CgkJCWlmIChpc19vYmplY3QoJHZhbHVlKSkgewoJCQkJJHRoaXMtPiRrZXkgPSBjbG9uZSAkdmFsdWU7CgkJCX0gZWxzZSB7CgkJCQkkdGhpcy0+JGtleSA9ICR2YWx1ZTsKCQkJfQoJCX0KCX0KfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/DocumentProperties.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIFBIUEV4Y2VsCiAqCiAqIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICoKICogQGNhdGVnb3J5CVBIUEV4Y2VsCiAqIEBwYWNrYWdlCVBIUEV4Y2VsCiAqIEBjb3B5cmlnaHQJQ29weXJpZ2h0IChjKSAyMDA2IC0gMjAxMiBQSFBFeGNlbCAoaHR0cDovL3d3dy5jb2RlcGxleC5jb20vUEhQRXhjZWwpCiAqIEBsaWNlbnNlCWh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9vbGQtbGljZW5zZXMvbGdwbC0yLjEudHh0CUxHUEwKICogQHZlcnNpb24JMS43LjcsIDIwMTItMDUtMTkKICovCgoKLyoqCiAqIFBIUEV4Y2VsX0RvY3VtZW50UHJvcGVydGllcwogKgogKiBAY2F0ZWdvcnkJUEhQRXhjZWwKICogQHBhY2thZ2UJCVBIUEV4Y2VsCiAqIEBjb3B5cmlnaHQJQ29weXJpZ2h0IChjKSAyMDA2IC0gMjAxMiBQSFBFeGNlbCAoaHR0cDovL3d3dy5jb2RlcGxleC5jb20vUEhQRXhjZWwpCiAqLwpjbGFzcyBQSFBFeGNlbF9Eb2N1bWVudFByb3BlcnRpZXMKewoJLyoqIGNvbnN0YW50cyAqLwoJY29uc3QgUFJPUEVSVFlfVFlQRV9CT09MRUFOCQk9ICdiJzsKCWNvbnN0IFBST1BFUlRZX1RZUEVfSU5URUdFUgkJPSAnaSc7Cgljb25zdCBQUk9QRVJUWV9UWVBFX0ZMT0FUCQk9ICdmJzsKCWNvbnN0IFBST1BFUlRZX1RZUEVfREFURQkJPSAnZCc7Cgljb25zdCBQUk9QRVJUWV9UWVBFX1NUUklORwkJPSAncyc7Cgljb25zdCBQUk9QRVJUWV9UWVBFX1VOS05PV04JCT0gJ3UnOwoKCgkvKioKCSAqIENyZWF0b3IKCSAqCgkgKiBAdmFyCXN0cmluZwoJICovCglwcml2YXRlICRfY3JlYXRvcgk9ICdVbmtub3duIENyZWF0b3InOwoKCS8qKgoJICogTGFzdE1vZGlmaWVkQnkKCSAqCgkgKiBAdmFyCXN0cmluZwoJICovCglwcml2YXRlICRfbGFzdE1vZGlmaWVkQnk7CgoJLyoqCgkgKiBDcmVhdGVkCgkgKgoJICogQHZhcglkYXRldGltZQoJICovCglwcml2YXRlICRfY3JlYXRlZDsKCgkvKioKCSAqIE1vZGlmaWVkCgkgKgoJICogQHZhcglkYXRldGltZQoJICovCglwcml2YXRlICRfbW9kaWZpZWQ7CgoJLyoqCgkgKiBUaXRsZQoJICoKCSAqIEB2YXIJc3RyaW5nCgkgKi8KCXByaXZhdGUgJF90aXRsZQkJCT0gJ1VudGl0bGVkIFNwcmVhZHNoZWV0JzsKCgkvKioKCSAqIERlc2NyaXB0aW9uCgkgKgoJICogQHZhcglzdHJpbmcKCSAqLwoJcHJpdmF0ZSAkX2Rlc2NyaXB0aW9uCT0gJyc7CgoJLyoqCgkgKiBTdWJqZWN0CgkgKgoJICogQHZhcglzdHJpbmcKCSAqLwoJcHJpdmF0ZSAkX3N1YmplY3QJCT0gJyc7CgoJLyoqCgkgKiBLZXl3b3JkcwoJICoKCSAqIEB2YXIJc3RyaW5nCgkgKi8KCXByaXZhdGUgJF9rZXl3b3JkcwkJPSAnJzsKCgkvKioKCSAqIENhdGVnb3J5CgkgKgoJICogQHZhcglzdHJpbmcKCSAqLwoJcHJpdmF0ZSAkX2NhdGVnb3J5CQk9ICcnOwoKCS8qKgoJICogTWFuYWdlcgoJICoKCSAqIEB2YXIJc3RyaW5nCgkgKi8KCXByaXZhdGUgJF9tYW5hZ2VyCQk9ICcnOwoKCS8qKgoJICogQ29tcGFueQoJICoKCSAqIEB2YXIJc3RyaW5nCgkgKi8KCXByaXZhdGUgJF9jb21wYW55CQk9ICdNaWNyb3NvZnQgQ29ycG9yYXRpb24nOwoKCS8qKgoJICogQ3VzdG9tIFByb3BlcnRpZXMKCSAqCgkgKiBAdmFyCXN0cmluZwoJICovCglwcml2YXRlICRfY3VzdG9tUHJvcGVydGllcwk9IGFycmF5KCk7CgoKCS8qKgoJICogQ3JlYXRlIGEgbmV3IFBIUEV4Y2VsX0RvY3VtZW50UHJvcGVydGllcwoJICovCglwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoKQoJewoJCS8vIEluaXRpYWxpc2UgdmFsdWVzCgkJJHRoaXMtPl9sYXN0TW9kaWZpZWRCeQk9ICR0aGlzLT5fY3JlYXRvcjsKCQkkdGhpcy0+X2NyZWF0ZWQJCT0gdGltZSgpOwoJCSR0aGlzLT5fbW9kaWZpZWQJPSB0aW1lKCk7Cgl9CgoJLyoqCgkgKiBHZXQgQ3JlYXRvcgoJICoKCSAqIEByZXR1cm4Jc3RyaW5nCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRDcmVhdG9yKCkgewoJCXJldHVybiAkdGhpcy0+X2NyZWF0b3I7Cgl9CgoJLyoqCgkgKiBTZXQgQ3JlYXRvcgoJICoKCSAqIEBwYXJhbQlzdHJpbmcJJHBWYWx1ZQoJICogQHJldHVybglQSFBFeGNlbF9Eb2N1bWVudFByb3BlcnRpZXMKCSAqLwoJcHVibGljIGZ1bmN0aW9uIHNldENyZWF0b3IoJHBWYWx1ZSA9ICcnKSB7CgkJJHRoaXMtPl9jcmVhdG9yID0gJHBWYWx1ZTsKCQlyZXR1cm4gJHRoaXM7Cgl9CgoJLyoqCgkgKiBHZXQgTGFzdCBNb2RpZmllZCBCeQoJICoKCSAqIEByZXR1cm4Jc3RyaW5nCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRMYXN0TW9kaWZpZWRCeSgpIHsKCQlyZXR1cm4gJHRoaXMtPl9sYXN0TW9kaWZpZWRCeTsKCX0KCgkvKioKCSAqIFNldCBMYXN0IE1vZGlmaWVkIEJ5CgkgKgoJICogQHBhcmFtCXN0cmluZwkkcFZhbHVlCgkgKiBAcmV0dXJuCVBIUEV4Y2VsX0RvY3VtZW50UHJvcGVydGllcwoJICovCglwdWJsaWMgZnVuY3Rpb24gc2V0TGFzdE1vZGlmaWVkQnkoJHBWYWx1ZSA9ICcnKSB7CgkJJHRoaXMtPl9sYXN0TW9kaWZpZWRCeSA9ICRwVmFsdWU7CgkJcmV0dXJuICR0aGlzOwoJfQoKCS8qKgoJICogR2V0IENyZWF0ZWQKCSAqCgkgKiBAcmV0dXJuCWRhdGV0aW1lCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRDcmVhdGVkKCkgewoJCXJldHVybiAkdGhpcy0+X2NyZWF0ZWQ7Cgl9CgoJLyoqCgkgKiBTZXQgQ3JlYXRlZAoJICoKCSAqIEBwYXJhbQlkYXRldGltZQkkcFZhbHVlCgkgKiBAcmV0dXJuCVBIUEV4Y2VsX0RvY3VtZW50UHJvcGVydGllcwoJICovCglwdWJsaWMgZnVuY3Rpb24gc2V0Q3JlYXRlZCgkcFZhbHVlID0gbnVsbCkgewoJCWlmICgkcFZhbHVlID09PSBOVUxMKSB7CgkJCSRwVmFsdWUgPSB0aW1lKCk7CgkJfSBlbHNlaWYgKGlzX3N0cmluZygkcFZhbHVlKSkgewoJCQlpZiAoaXNfbnVtZXJpYygkcFZhbHVlKSkgewoJCQkJJHBWYWx1ZSA9IGludHZhbCgkcFZhbHVlKTsKCQkJfSBlbHNlIHsKCQkJCSRwVmFsdWUgPSBzdHJ0b3RpbWUoJHBWYWx1ZSk7CgkJCX0KCQl9CgoJCSR0aGlzLT5fY3JlYXRlZCA9ICRwVmFsdWU7CgkJcmV0dXJuICR0aGlzOwoJfQoKCS8qKgoJICogR2V0IE1vZGlmaWVkCgkgKgoJICogQHJldHVybglkYXRldGltZQoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0TW9kaWZpZWQoKSB7CgkJcmV0dXJuICR0aGlzLT5fbW9kaWZpZWQ7Cgl9CgoJLyoqCgkgKiBTZXQgTW9kaWZpZWQKCSAqCgkgKiBAcGFyYW0JZGF0ZXRpbWUJJHBWYWx1ZQoJICogQHJldHVybglQSFBFeGNlbF9Eb2N1bWVudFByb3BlcnRpZXMKCSAqLwoJcHVibGljIGZ1bmN0aW9uIHNldE1vZGlmaWVkKCRwVmFsdWUgPSBudWxsKSB7CgkJaWYgKCRwVmFsdWUgPT09IE5VTEwpIHsKCQkJJHBWYWx1ZSA9IHRpbWUoKTsKCQl9IGVsc2VpZiAoaXNfc3RyaW5nKCRwVmFsdWUpKSB7CgkJCWlmIChpc19udW1lcmljKCRwVmFsdWUpKSB7CgkJCQkkcFZhbHVlID0gaW50dmFsKCRwVmFsdWUpOwoJCQl9IGVsc2UgewoJCQkJJHBWYWx1ZSA9IHN0cnRvdGltZSgkcFZhbHVlKTsKCQkJfQoJCX0KCgkJJHRoaXMtPl9tb2RpZmllZCA9ICRwVmFsdWU7CgkJcmV0dXJuICR0aGlzOwoJfQoKCS8qKgoJICogR2V0IFRpdGxlCgkgKgoJICogQHJldHVybglzdHJpbmcKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldFRpdGxlKCkgewoJCXJldHVybiAkdGhpcy0+X3RpdGxlOwoJfQoKCS8qKgoJICogU2V0IFRpdGxlCgkgKgoJICogQHBhcmFtCXN0cmluZwkkcFZhbHVlCgkgKiBAcmV0dXJuCVBIUEV4Y2VsX0RvY3VtZW50UHJvcGVydGllcwoJICovCglwdWJsaWMgZnVuY3Rpb24gc2V0VGl0bGUoJHBWYWx1ZSA9ICcnKSB7CgkJJHRoaXMtPl90aXRsZSA9ICRwVmFsdWU7CgkJcmV0dXJuICR0aGlzOwoJfQoKCS8qKgoJICogR2V0IERlc2NyaXB0aW9uCgkgKgoJICogQHJldHVybglzdHJpbmcKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldERlc2NyaXB0aW9uKCkgewoJCXJldHVybiAkdGhpcy0+X2Rlc2NyaXB0aW9uOwoJfQoKCS8qKgoJICogU2V0IERlc2NyaXB0aW9uCgkgKgoJICogQHBhcmFtCXN0cmluZwkkcFZhbHVlCgkgKiBAcmV0dXJuCVBIUEV4Y2VsX0RvY3VtZW50UHJvcGVydGllcwoJICovCglwdWJsaWMgZnVuY3Rpb24gc2V0RGVzY3JpcHRpb24oJHBWYWx1ZSA9ICcnKSB7CgkJJHRoaXMtPl9kZXNjcmlwdGlvbiA9ICRwVmFsdWU7CgkJcmV0dXJuICR0aGlzOwoJfQoKCS8qKgoJICogR2V0IFN1YmplY3QKCSAqCgkgKiBAcmV0dXJuCXN0cmluZwoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0U3ViamVjdCgpIHsKCQlyZXR1cm4gJHRoaXMtPl9zdWJqZWN0OwoJfQoKCS8qKgoJICogU2V0IFN1YmplY3QKCSAqCgkgKiBAcGFyYW0Jc3RyaW5nCSRwVmFsdWUKCSAqIEByZXR1cm4JUEhQRXhjZWxfRG9jdW1lbnRQcm9wZXJ0aWVzCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBzZXRTdWJqZWN0KCRwVmFsdWUgPSAnJykgewoJCSR0aGlzLT5fc3ViamVjdCA9ICRwVmFsdWU7CgkJcmV0dXJuICR0aGlzOwoJfQoKCS8qKgoJICogR2V0IEtleXdvcmRzCgkgKgoJICogQHJldHVybglzdHJpbmcKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldEtleXdvcmRzKCkgewoJCXJldHVybiAkdGhpcy0+X2tleXdvcmRzOwoJfQoKCS8qKgoJICogU2V0IEtleXdvcmRzCgkgKgoJICogQHBhcmFtCXN0cmluZwkkcFZhbHVlCgkgKiBAcmV0dXJuCVBIUEV4Y2VsX0RvY3VtZW50UHJvcGVydGllcwoJICovCglwdWJsaWMgZnVuY3Rpb24gc2V0S2V5d29yZHMoJHBWYWx1ZSA9ICcnKSB7CgkJJHRoaXMtPl9rZXl3b3JkcyA9ICRwVmFsdWU7CgkJcmV0dXJuICR0aGlzOwoJfQoKCS8qKgoJICogR2V0IENhdGVnb3J5CgkgKgoJICogQHJldHVybglzdHJpbmcKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldENhdGVnb3J5KCkgewoJCXJldHVybiAkdGhpcy0+X2NhdGVnb3J5OwoJfQoKCS8qKgoJICogU2V0IENhdGVnb3J5CgkgKgoJICogQHBhcmFtCXN0cmluZwkkcFZhbHVlCgkgKiBAcmV0dXJuCVBIUEV4Y2VsX0RvY3VtZW50UHJvcGVydGllcwoJICovCglwdWJsaWMgZnVuY3Rpb24gc2V0Q2F0ZWdvcnkoJHBWYWx1ZSA9ICcnKSB7CgkJJHRoaXMtPl9jYXRlZ29yeSA9ICRwVmFsdWU7CgkJcmV0dXJuICR0aGlzOwoJfQoKCS8qKgoJICogR2V0IENvbXBhbnkKCSAqCgkgKiBAcmV0dXJuCXN0cmluZwoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0Q29tcGFueSgpIHsKCQlyZXR1cm4gJHRoaXMtPl9jb21wYW55OwoJfQoKCS8qKgoJICogU2V0IENvbXBhbnkKCSAqCgkgKiBAcGFyYW0Jc3RyaW5nCSRwVmFsdWUKCSAqIEByZXR1cm4JUEhQRXhjZWxfRG9jdW1lbnRQcm9wZXJ0aWVzCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBzZXRDb21wYW55KCRwVmFsdWUgPSAnJykgewoJCSR0aGlzLT5fY29tcGFueSA9ICRwVmFsdWU7CgkJcmV0dXJuICR0aGlzOwoJfQoKCS8qKgoJICogR2V0IE1hbmFnZXIKCSAqCgkgKiBAcmV0dXJuCXN0cmluZwoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0TWFuYWdlcigpIHsKCQlyZXR1cm4gJHRoaXMtPl9tYW5hZ2VyOwoJfQoKCS8qKgoJICogU2V0IE1hbmFnZXIKCSAqCgkgKiBAcGFyYW0Jc3RyaW5nCSRwVmFsdWUKCSAqIEByZXR1cm4JUEhQRXhjZWxfRG9jdW1lbnRQcm9wZXJ0aWVzCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBzZXRNYW5hZ2VyKCRwVmFsdWUgPSAnJykgewoJCSR0aGlzLT5fbWFuYWdlciA9ICRwVmFsdWU7CgkJcmV0dXJuICR0aGlzOwoJfQoKCS8qKgoJICogR2V0IGEgTGlzdCBvZiBDdXN0b20gUHJvcGVydHkgTmFtZXMKCSAqCgkgKiBAcmV0dXJuCWFycmF5IG9mIHN0cmluZwoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0Q3VzdG9tUHJvcGVydGllcygpIHsKCQlyZXR1cm4gYXJyYXlfa2V5cygkdGhpcy0+X2N1c3RvbVByb3BlcnRpZXMpOwoJfQoKCS8qKgoJICogQ2hlY2sgaWYgYSBDdXN0b20gUHJvcGVydHkgaXMgZGVmaW5lZAoJICoKCSAqIEBwYXJhbQlzdHJpbmcJJHByb3BlcnR5TmFtZQoJICogQHJldHVybglib29sZWFuCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBpc0N1c3RvbVByb3BlcnR5U2V0KCRwcm9wZXJ0eU5hbWUpIHsKCQlyZXR1cm4gaXNzZXQoJHRoaXMtPl9jdXN0b21Qcm9wZXJ0aWVzWyRwcm9wZXJ0eU5hbWVdKTsKCX0KCgkvKioKCSAqIEdldCBhIEN1c3RvbSBQcm9wZXJ0eSBWYWx1ZQoJICoKCSAqIEBwYXJhbQlzdHJpbmcJJHByb3BlcnR5TmFtZQoJICogQHJldHVybglzdHJpbmcKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldEN1c3RvbVByb3BlcnR5VmFsdWUoJHByb3BlcnR5TmFtZSkgewoJCWlmIChpc3NldCgkdGhpcy0+X2N1c3RvbVByb3BlcnRpZXNbJHByb3BlcnR5TmFtZV0pKSB7CgkJCXJldHVybiAkdGhpcy0+X2N1c3RvbVByb3BlcnRpZXNbJHByb3BlcnR5TmFtZV1bJ3ZhbHVlJ107CgkJfQoKCX0KCgkvKioKCSAqIEdldCBhIEN1c3RvbSBQcm9wZXJ0eSBUeXBlCgkgKgoJICogQHBhcmFtCXN0cmluZwkkcHJvcGVydHlOYW1lCgkgKiBAcmV0dXJuCXN0cmluZwoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0Q3VzdG9tUHJvcGVydHlUeXBlKCRwcm9wZXJ0eU5hbWUpIHsKCQlpZiAoaXNzZXQoJHRoaXMtPl9jdXN0b21Qcm9wZXJ0aWVzWyRwcm9wZXJ0eU5hbWVdKSkgewoJCQlyZXR1cm4gJHRoaXMtPl9jdXN0b21Qcm9wZXJ0aWVzWyRwcm9wZXJ0eU5hbWVdWyd0eXBlJ107CgkJfQoKCX0KCgkvKioKCSAqIFNldCBhIEN1c3RvbSBQcm9wZXJ0eQoJICoKCSAqIEBwYXJhbQlzdHJpbmcJJHByb3BlcnR5TmFtZQoJICogQHBhcmFtCW1peGVkCSRwcm9wZXJ0eVZhbHVlCgkgKiBAcGFyYW0Jc3RyaW5nCSRwcm9wZXJ0eVR5cGUKCSAqCQkJCQkJJ2knCTogSW50ZWdlcgoJICoJCQkJCQknZicgOiBGbG9hdGluZyBQb2ludAoJICoJCQkJCQkncycgOiBTdHJpbmcKCSAqCQkJCQkJJ2QnIDogRGF0ZS9UaW1lCgkgKgkJCQkJCSdiJyA6IEJvb2xlYW4KCSAqIEByZXR1cm4JUEhQRXhjZWxfRG9jdW1lbnRQcm9wZXJ0aWVzCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBzZXRDdXN0b21Qcm9wZXJ0eSgkcHJvcGVydHlOYW1lLCRwcm9wZXJ0eVZhbHVlPScnLCRwcm9wZXJ0eVR5cGU9TlVMTCkgewoJCWlmICgoJHByb3BlcnR5VHlwZSA9PT0gTlVMTCkgfHwgKCFpbl9hcnJheSgkcHJvcGVydHlUeXBlLGFycmF5KHNlbGY6OlBST1BFUlRZX1RZUEVfSU5URUdFUiwKCQkJCQkJCQkJCQkJCQkJCQkgICBzZWxmOjpQUk9QRVJUWV9UWVBFX0ZMT0FULAoJCQkJCQkJCQkJCQkJCQkJCSAgIHNlbGY6OlBST1BFUlRZX1RZUEVfU1RSSU5HLAoJCQkJCQkJCQkJCQkJCQkJCSAgIHNlbGY6OlBST1BFUlRZX1RZUEVfREFURSwKCQkJCQkJCQkJCQkJCQkJCQkgICBzZWxmOjpQUk9QRVJUWV9UWVBFX0JPT0xFQU4pKSkpIHsKCQkJaWYgKCRwcm9wZXJ0eVZhbHVlID09PSBOVUxMKSB7CgkJCQkkcHJvcGVydHlUeXBlID0gc2VsZjo6UFJPUEVSVFlfVFlQRV9TVFJJTkc7CgkJCX0gZWxzZWlmIChpc19mbG9hdCgkcHJvcGVydHlWYWx1ZSkpIHsKCQkJCSRwcm9wZXJ0eVR5cGUgPSBzZWxmOjpQUk9QRVJUWV9UWVBFX0ZMT0FUOwoJCQl9IGVsc2VpZihpc19pbnQoJHByb3BlcnR5VmFsdWUpKSB7CgkJCQkkcHJvcGVydHlUeXBlID0gc2VsZjo6UFJPUEVSVFlfVFlQRV9JTlRFR0VSOwoJCQl9IGVsc2VpZiAoaXNfYm9vbCgkcHJvcGVydHlWYWx1ZSkpIHsKCQkJCSRwcm9wZXJ0eVR5cGUgPSBzZWxmOjpQUk9QRVJUWV9UWVBFX0JPT0xFQU47CgkJCX0gZWxzZSB7CgkJCQkkcHJvcGVydHlUeXBlID0gc2VsZjo6UFJPUEVSVFlfVFlQRV9TVFJJTkc7CgkJCX0KCQl9CgoJCSR0aGlzLT5fY3VzdG9tUHJvcGVydGllc1skcHJvcGVydHlOYW1lXSA9IGFycmF5KCd2YWx1ZScgPT4gJHByb3BlcnR5VmFsdWUsICd0eXBlJyA9PiAkcHJvcGVydHlUeXBlKTsKCQlyZXR1cm4gJHRoaXM7Cgl9CgoJLyoqCgkgKiBJbXBsZW1lbnQgUEhQIF9fY2xvbmUgdG8gY3JlYXRlIGEgZGVlcCBjbG9uZSwgbm90IGp1c3QgYSBzaGFsbG93IGNvcHkuCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBfX2Nsb25lKCkgewoJCSR2YXJzID0gZ2V0X29iamVjdF92YXJzKCR0aGlzKTsKCQlmb3JlYWNoICgkdmFycyBhcyAka2V5ID0+ICR2YWx1ZSkgewoJCQlpZiAoaXNfb2JqZWN0KCR2YWx1ZSkpIHsKCQkJCSR0aGlzLT4ka2V5ID0gY2xvbmUgJHZhbHVlOwoJCQl9IGVsc2UgewoJCQkJJHRoaXMtPiRrZXkgPSAkdmFsdWU7CgkJCX0KCQl9Cgl9CgoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBjb252ZXJ0UHJvcGVydHkoJHByb3BlcnR5VmFsdWUsJHByb3BlcnR5VHlwZSkgewoJCXN3aXRjaCAoJHByb3BlcnR5VHlwZSkgewoJCQljYXNlICdlbXB0eScJOgkvLwlFbXB0eQoJCQkJcmV0dXJuICcnOwoJCQkJYnJlYWs7CgkJCWNhc2UgJ251bGwnCQk6CS8vCU51bGwKCQkJCXJldHVybiBOVUxMOwoJCQkJYnJlYWs7CgkJCWNhc2UgJ2kxJwkJOgkvLwkxLUJ5dGUgU2lnbmVkIEludGVnZXIKCQkJY2FzZSAnaTInCQk6CS8vCTItQnl0ZSBTaWduZWQgSW50ZWdlcgoJCQljYXNlICdpNCcJCToJLy8JNC1CeXRlIFNpZ25lZCBJbnRlZ2VyCgkJCWNhc2UgJ2k4JwkJOgkvLwk4LUJ5dGUgU2lnbmVkIEludGVnZXIKCQkJY2FzZSAnaW50JwkJOgkvLwlJbnRlZ2VyCgkJCQlyZXR1cm4gKGludCkgJHByb3BlcnR5VmFsdWU7CgkJCQlicmVhazsKCQkJY2FzZSAndWkxJwkJOgkvLwkxLUJ5dGUgVW5zaWduZWQgSW50ZWdlcgoJCQljYXNlICd1aTInCQk6CS8vCTItQnl0ZSBVbnNpZ25lZCBJbnRlZ2VyCgkJCWNhc2UgJ3VpNCcJCToJLy8JNC1CeXRlIFVuc2lnbmVkIEludGVnZXIKCQkJY2FzZSAndWk4JwkJOgkvLwk4LUJ5dGUgVW5zaWduZWQgSW50ZWdlcgoJCQljYXNlICd1aW50JwkJOgkvLwlVbnNpZ25lZCBJbnRlZ2VyCgkJCQlyZXR1cm4gYWJzKChpbnQpICRwcm9wZXJ0eVZhbHVlKTsKCQkJCWJyZWFrOwoJCQljYXNlICdyNCcJCToJLy8JNC1CeXRlIFJlYWwgTnVtYmVyCgkJCWNhc2UgJ3I4JwkJOgkvLwk4LUJ5dGUgUmVhbCBOdW1iZXIKCQkJY2FzZSAnZGVjaW1hbCcJOgkvLwlEZWNpbWFsCgkJCQlyZXR1cm4gKGZsb2F0KSAkcHJvcGVydHlWYWx1ZTsKCQkJCWJyZWFrOwoJCQljYXNlICdscHN0cicJOgkvLwlMUFNUUgoJCQljYXNlICdscHdzdHInCToJLy8JTFBXU1RSCgkJCWNhc2UgJ2JzdHInCQk6CS8vCUJhc2ljIFN0cmluZwoJCQkJcmV0dXJuICRwcm9wZXJ0eVZhbHVlOwoJCQkJYnJlYWs7CgkJCWNhc2UgJ2RhdGUnCQk6CS8vCURhdGUgYW5kIFRpbWUKCQkJY2FzZSAnZmlsZXRpbWUnCToJLy8JRmlsZSBUaW1lCgkJCQlyZXR1cm4gc3RydG90aW1lKCRwcm9wZXJ0eVZhbHVlKTsKCQkJCWJyZWFrOwoJCQljYXNlICdib29sJwkJOgkvLwlCb29sZWFuCgkJCQlyZXR1cm4gKCRwcm9wZXJ0eVZhbHVlID09ICd0cnVlJykgPyBUcnVlIDogRmFsc2U7CgkJCQlicmVhazsKCQkJY2FzZSAnY3knCQk6CS8vCUN1cnJlbmN5CgkJCWNhc2UgJ2Vycm9yJwk6CS8vCUVycm9yIFN0YXR1cyBDb2RlCgkJCWNhc2UgJ3ZlY3RvcicJOgkvLwlWZWN0b3IKCQkJY2FzZSAnYXJyYXknCToJLy8JQXJyYXkKCQkJY2FzZSAnYmxvYicJCToJLy8JQmluYXJ5IEJsb2IKCQkJY2FzZSAnb2Jsb2InCToJLy8JQmluYXJ5IEJsb2IgT2JqZWN0CgkJCWNhc2UgJ3N0cmVhbScJOgkvLwlCaW5hcnkgU3RyZWFtCgkJCWNhc2UgJ29zdHJlYW0nCToJLy8JQmluYXJ5IFN0cmVhbSBPYmplY3QKCQkJY2FzZSAnc3RvcmFnZScJOgkvLwlCaW5hcnkgU3RvcmFnZQoJCQljYXNlICdvc3RvcmFnZScJOgkvLwlCaW5hcnkgU3RvcmFnZSBPYmplY3QKCQkJY2FzZSAndnN0cmVhbScJOgkvLwlCaW5hcnkgVmVyc2lvbmVkIFN0cmVhbQoJCQljYXNlICdjbHNpZCcJOgkvLwlDbGFzcyBJRAoJCQljYXNlICdjZicJCToJLy8JQ2xpcGJvYXJkIERhdGEKCQkJCXJldHVybiAkcHJvcGVydHlWYWx1ZTsKCQkJCWJyZWFrOwoJCX0KCQlyZXR1cm4gJHByb3BlcnR5VmFsdWU7Cgl9CgoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBjb252ZXJ0UHJvcGVydHlUeXBlKCRwcm9wZXJ0eVR5cGUpIHsKCQlzd2l0Y2ggKCRwcm9wZXJ0eVR5cGUpIHsKCQkJY2FzZSAnaTEnCQk6CS8vCTEtQnl0ZSBTaWduZWQgSW50ZWdlcgoJCQljYXNlICdpMicJCToJLy8JMi1CeXRlIFNpZ25lZCBJbnRlZ2VyCgkJCWNhc2UgJ2k0JwkJOgkvLwk0LUJ5dGUgU2lnbmVkIEludGVnZXIKCQkJY2FzZSAnaTgnCQk6CS8vCTgtQnl0ZSBTaWduZWQgSW50ZWdlcgoJCQljYXNlICdpbnQnCQk6CS8vCUludGVnZXIKCQkJY2FzZSAndWkxJwkJOgkvLwkxLUJ5dGUgVW5zaWduZWQgSW50ZWdlcgoJCQljYXNlICd1aTInCQk6CS8vCTItQnl0ZSBVbnNpZ25lZCBJbnRlZ2VyCgkJCWNhc2UgJ3VpNCcJCToJLy8JNC1CeXRlIFVuc2lnbmVkIEludGVnZXIKCQkJY2FzZSAndWk4JwkJOgkvLwk4LUJ5dGUgVW5zaWduZWQgSW50ZWdlcgoJCQljYXNlICd1aW50JwkJOgkvLwlVbnNpZ25lZCBJbnRlZ2VyCgkJCQlyZXR1cm4gc2VsZjo6UFJPUEVSVFlfVFlQRV9JTlRFR0VSOwoJCQkJYnJlYWs7CgkJCWNhc2UgJ3I0JwkJOgkvLwk0LUJ5dGUgUmVhbCBOdW1iZXIKCQkJY2FzZSAncjgnCQk6CS8vCTgtQnl0ZSBSZWFsIE51bWJlcgoJCQljYXNlICdkZWNpbWFsJwk6CS8vCURlY2ltYWwKCQkJCXJldHVybiBzZWxmOjpQUk9QRVJUWV9UWVBFX0ZMT0FUOwoJCQkJYnJlYWs7CgkJCWNhc2UgJ2VtcHR5Jwk6CS8vCUVtcHR5CgkJCWNhc2UgJ251bGwnCQk6CS8vCU51bGwKCQkJY2FzZSAnbHBzdHInCToJLy8JTFBTVFIKCQkJY2FzZSAnbHB3c3RyJwk6CS8vCUxQV1NUUgoJCQljYXNlICdic3RyJwkJOgkvLwlCYXNpYyBTdHJpbmcKCQkJCXJldHVybiBzZWxmOjpQUk9QRVJUWV9UWVBFX1NUUklORzsKCQkJCWJyZWFrOwoJCQljYXNlICdkYXRlJwkJOgkvLwlEYXRlIGFuZCBUaW1lCgkJCWNhc2UgJ2ZpbGV0aW1lJwk6CS8vCUZpbGUgVGltZQoJCQkJcmV0dXJuIHNlbGY6OlBST1BFUlRZX1RZUEVfREFURTsKCQkJCWJyZWFrOwoJCQljYXNlICdib29sJwkJOgkvLwlCb29sZWFuCgkJCQlyZXR1cm4gc2VsZjo6UFJPUEVSVFlfVFlQRV9CT09MRUFOOwoJCQkJYnJlYWs7CgkJCWNhc2UgJ2N5JwkJOgkvLwlDdXJyZW5jeQoJCQljYXNlICdlcnJvcicJOgkvLwlFcnJvciBTdGF0dXMgQ29kZQoJCQljYXNlICd2ZWN0b3InCToJLy8JVmVjdG9yCgkJCWNhc2UgJ2FycmF5Jwk6CS8vCUFycmF5CgkJCWNhc2UgJ2Jsb2InCQk6CS8vCUJpbmFyeSBCbG9iCgkJCWNhc2UgJ29ibG9iJwk6CS8vCUJpbmFyeSBCbG9iIE9iamVjdAoJCQljYXNlICdzdHJlYW0nCToJLy8JQmluYXJ5IFN0cmVhbQoJCQljYXNlICdvc3RyZWFtJwk6CS8vCUJpbmFyeSBTdHJlYW0gT2JqZWN0CgkJCWNhc2UgJ3N0b3JhZ2UnCToJLy8JQmluYXJ5IFN0b3JhZ2UKCQkJY2FzZSAnb3N0b3JhZ2UnCToJLy8JQmluYXJ5IFN0b3JhZ2UgT2JqZWN0CgkJCWNhc2UgJ3ZzdHJlYW0nCToJLy8JQmluYXJ5IFZlcnNpb25lZCBTdHJlYW0KCQkJY2FzZSAnY2xzaWQnCToJLy8JQ2xhc3MgSUQKCQkJY2FzZSAnY2YnCQk6CS8vCUNsaXBib2FyZCBEYXRhCgkJCQlyZXR1cm4gc2VsZjo6UFJPUEVSVFlfVFlQRV9VTktOT1dOOwoJCQkJYnJlYWs7CgkJfQoJCXJldHVybiBzZWxmOjpQUk9QRVJUWV9UWVBFX1VOS05PV047Cgl9Cgp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/DocumentSecurity.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIFBIUEV4Y2VsCiAqCiAqIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICoKICogQGNhdGVnb3J5ICAgUEhQRXhjZWwKICogQHBhY2thZ2UgICAgUEhQRXhjZWwKICogQGNvcHlyaWdodCAgQ29weXJpZ2h0IChjKSAyMDA2IC0gMjAxMiBQSFBFeGNlbCAoaHR0cDovL3d3dy5jb2RlcGxleC5jb20vUEhQRXhjZWwpCiAqIEBsaWNlbnNlICAgIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9vbGQtbGljZW5zZXMvbGdwbC0yLjEudHh0CUxHUEwKICogQHZlcnNpb24gICAgMS43LjcsIDIwMTItMDUtMTkKICovCgoKLyoqCiAqIFBIUEV4Y2VsX0RvY3VtZW50U2VjdXJpdHkKICoKICogQGNhdGVnb3J5ICAgUEhQRXhjZWwKICogQHBhY2thZ2UgICAgUEhQRXhjZWwKICogQGNvcHlyaWdodCAgQ29weXJpZ2h0IChjKSAyMDA2IC0gMjAxMiBQSFBFeGNlbCAoaHR0cDovL3d3dy5jb2RlcGxleC5jb20vUEhQRXhjZWwpCiAqLwpjbGFzcyBQSFBFeGNlbF9Eb2N1bWVudFNlY3VyaXR5CnsKCS8qKgoJICogTG9ja1JldmlzaW9uCgkgKgoJICogQHZhciBib29sZWFuCgkgKi8KCXByaXZhdGUgJF9sb2NrUmV2aXNpb247CgoJLyoqCgkgKiBMb2NrU3RydWN0dXJlCgkgKgoJICogQHZhciBib29sZWFuCgkgKi8KCXByaXZhdGUgJF9sb2NrU3RydWN0dXJlOwoKCS8qKgoJICogTG9ja1dpbmRvd3MKCSAqCgkgKiBAdmFyIGJvb2xlYW4KCSAqLwoJcHJpdmF0ZSAkX2xvY2tXaW5kb3dzOwoKCS8qKgoJICogUmV2aXNpb25zUGFzc3dvcmQKCSAqCgkgKiBAdmFyIHN0cmluZwoJICovCglwcml2YXRlICRfcmV2aXNpb25zUGFzc3dvcmQ7CgoJLyoqCgkgKiBXb3JrYm9va1Bhc3N3b3JkCgkgKgoJICogQHZhciBzdHJpbmcKCSAqLwoJcHJpdmF0ZSAkX3dvcmtib29rUGFzc3dvcmQ7CgogICAgLyoqCiAgICAgKiBDcmVhdGUgYSBuZXcgUEhQRXhjZWxfRG9jdW1lbnRTZWN1cml0eQogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoKQogICAgewogICAgCS8vIEluaXRpYWxpc2UgdmFsdWVzCiAgICAJJHRoaXMtPl9sb2NrUmV2aXNpb24JCT0gZmFsc2U7CiAgICAJJHRoaXMtPl9sb2NrU3RydWN0dXJlCQk9IGZhbHNlOwogICAgCSR0aGlzLT5fbG9ja1dpbmRvd3MJCQk9IGZhbHNlOwogICAgCSR0aGlzLT5fcmV2aXNpb25zUGFzc3dvcmQJPSAnJzsKICAgIAkkdGhpcy0+X3dvcmtib29rUGFzc3dvcmQJPSAnJzsKICAgIH0KCiAgICAvKioKICAgICAqIElzIHNvbWUgc29ydCBvZiBkY3VtZW50IHNlY3VyaXR5IGVuYWJsZWQ/CiAgICAgKgogICAgICogQHJldHVybiBib29sZWFuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGlzU2VjdXJpdHlFbmFibGVkKCkgewogICAgCXJldHVybiAJJHRoaXMtPl9sb2NrUmV2aXNpb24gfHwKCQkgICAgCSR0aGlzLT5fbG9ja1N0cnVjdHVyZSB8fAoJCSAgICAJJHRoaXMtPl9sb2NrV2luZG93czsKICAgIH0KCiAgICAvKioKICAgICAqIEdldCBMb2NrUmV2aXNpb24KICAgICAqCiAgICAgKiBAcmV0dXJuIGJvb2xlYW4KICAgICAqLwogICAgZnVuY3Rpb24gZ2V0TG9ja1JldmlzaW9uKCkgewogICAgCXJldHVybiAkdGhpcy0+X2xvY2tSZXZpc2lvbjsKICAgIH0KCiAgICAvKioKICAgICAqIFNldCBMb2NrUmV2aXNpb24KICAgICAqCiAgICAgKiBAcGFyYW0gYm9vbGVhbiAkcFZhbHVlCiAgICAgKiBAcmV0dXJuIFBIUEV4Y2VsX0RvY3VtZW50U2VjdXJpdHkKICAgICAqLwogICAgZnVuY3Rpb24gc2V0TG9ja1JldmlzaW9uKCRwVmFsdWUgPSBmYWxzZSkgewogICAgCSR0aGlzLT5fbG9ja1JldmlzaW9uID0gJHBWYWx1ZTsKICAgIAlyZXR1cm4gJHRoaXM7CiAgICB9CgogICAgLyoqCiAgICAgKiBHZXQgTG9ja1N0cnVjdHVyZQogICAgICoKICAgICAqIEByZXR1cm4gYm9vbGVhbgogICAgICovCiAgICBmdW5jdGlvbiBnZXRMb2NrU3RydWN0dXJlKCkgewogICAgCXJldHVybiAkdGhpcy0+X2xvY2tTdHJ1Y3R1cmU7CiAgICB9CgogICAgLyoqCiAgICAgKiBTZXQgTG9ja1N0cnVjdHVyZQogICAgICoKICAgICAqIEBwYXJhbSBib29sZWFuICRwVmFsdWUKICAgICAqIEByZXR1cm4gUEhQRXhjZWxfRG9jdW1lbnRTZWN1cml0eQogICAgICovCiAgICBmdW5jdGlvbiBzZXRMb2NrU3RydWN0dXJlKCRwVmFsdWUgPSBmYWxzZSkgewoJCSR0aGlzLT5fbG9ja1N0cnVjdHVyZSA9ICRwVmFsdWU7CgkJcmV0dXJuICR0aGlzOwogICAgfQoKICAgIC8qKgogICAgICogR2V0IExvY2tXaW5kb3dzCiAgICAgKgogICAgICogQHJldHVybiBib29sZWFuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGdldExvY2tXaW5kb3dzKCkgewogICAgCXJldHVybiAkdGhpcy0+X2xvY2tXaW5kb3dzOwogICAgfQoKICAgIC8qKgogICAgICogU2V0IExvY2tXaW5kb3dzCiAgICAgKgogICAgICogQHBhcmFtIGJvb2xlYW4gJHBWYWx1ZQogICAgICogQHJldHVybiBQSFBFeGNlbF9Eb2N1bWVudFNlY3VyaXR5CiAgICAgKi8KICAgIGZ1bmN0aW9uIHNldExvY2tXaW5kb3dzKCRwVmFsdWUgPSBmYWxzZSkgewogICAgCSR0aGlzLT5fbG9ja1dpbmRvd3MgPSAkcFZhbHVlOwogICAgCXJldHVybiAkdGhpczsKICAgIH0KCiAgICAvKioKICAgICAqIEdldCBSZXZpc2lvbnNQYXNzd29yZCAoaGFzaGVkKQogICAgICoKICAgICAqIEByZXR1cm4gc3RyaW5nCiAgICAgKi8KICAgIGZ1bmN0aW9uIGdldFJldmlzaW9uc1Bhc3N3b3JkKCkgewogICAgCXJldHVybiAkdGhpcy0+X3JldmlzaW9uc1Bhc3N3b3JkOwogICAgfQoKICAgIC8qKgogICAgICogU2V0IFJldmlzaW9uc1Bhc3N3b3JkCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyAJJHBWYWx1ZQogICAgICogQHBhcmFtIGJvb2xlYW4gCSRwQWxyZWFkeUhhc2hlZCBJZiB0aGUgcGFzc3dvcmQgaGFzIGFscmVhZHkgYmVlbiBoYXNoZWQsIHNldCB0aGlzIHRvIHRydWUKICAgICAqIEByZXR1cm4gUEhQRXhjZWxfRG9jdW1lbnRTZWN1cml0eQogICAgICovCiAgICBmdW5jdGlvbiBzZXRSZXZpc2lvbnNQYXNzd29yZCgkcFZhbHVlID0gJycsICRwQWxyZWFkeUhhc2hlZCA9IGZhbHNlKSB7CiAgICAJaWYgKCEkcEFscmVhZHlIYXNoZWQpIHsKICAgIAkJJHBWYWx1ZSA9IFBIUEV4Y2VsX1NoYXJlZF9QYXNzd29yZEhhc2hlcjo6aGFzaFBhc3N3b3JkKCRwVmFsdWUpOwogICAgCX0KICAgIAkkdGhpcy0+X3JldmlzaW9uc1Bhc3N3b3JkID0gJHBWYWx1ZTsKICAgIAlyZXR1cm4gJHRoaXM7CiAgICB9CgogICAgLyoqCiAgICAgKiBHZXQgV29ya2Jvb2tQYXNzd29yZCAoaGFzaGVkKQogICAgICoKICAgICAqIEByZXR1cm4gc3RyaW5nCiAgICAgKi8KICAgIGZ1bmN0aW9uIGdldFdvcmtib29rUGFzc3dvcmQoKSB7CiAgICAJcmV0dXJuICR0aGlzLT5fd29ya2Jvb2tQYXNzd29yZDsKICAgIH0KCiAgICAvKioKICAgICAqIFNldCBXb3JrYm9va1Bhc3N3b3JkCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyAJJHBWYWx1ZQogICAgICogQHBhcmFtIGJvb2xlYW4gCSRwQWxyZWFkeUhhc2hlZCBJZiB0aGUgcGFzc3dvcmQgaGFzIGFscmVhZHkgYmVlbiBoYXNoZWQsIHNldCB0aGlzIHRvIHRydWUKICAgICAqIEByZXR1cm4gUEhQRXhjZWxfRG9jdW1lbnRTZWN1cml0eQogICAgICovCiAgICBmdW5jdGlvbiBzZXRXb3JrYm9va1Bhc3N3b3JkKCRwVmFsdWUgPSAnJywgJHBBbHJlYWR5SGFzaGVkID0gZmFsc2UpIHsKICAgIAlpZiAoISRwQWxyZWFkeUhhc2hlZCkgewogICAgCQkkcFZhbHVlID0gUEhQRXhjZWxfU2hhcmVkX1Bhc3N3b3JkSGFzaGVyOjpoYXNoUGFzc3dvcmQoJHBWYWx1ZSk7CiAgICAJfQoJCSR0aGlzLT5fd29ya2Jvb2tQYXNzd29yZCA9ICRwVmFsdWU7CgkJcmV0dXJuICR0aGlzOwogICAgfQoKCS8qKgoJICogSW1wbGVtZW50IFBIUCBfX2Nsb25lIHRvIGNyZWF0ZSBhIGRlZXAgY2xvbmUsIG5vdCBqdXN0IGEgc2hhbGxvdyBjb3B5LgoJICovCglwdWJsaWMgZnVuY3Rpb24gX19jbG9uZSgpIHsKCQkkdmFycyA9IGdldF9vYmplY3RfdmFycygkdGhpcyk7CgkJZm9yZWFjaCAoJHZhcnMgYXMgJGtleSA9PiAkdmFsdWUpIHsKCQkJaWYgKGlzX29iamVjdCgkdmFsdWUpKSB7CgkJCQkkdGhpcy0+JGtleSA9IGNsb25lICR2YWx1ZTsKCQkJfSBlbHNlIHsKCQkJCSR0aGlzLT4ka2V5ID0gJHZhbHVlOwoJCQl9CgkJfQoJfQp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/HashTable.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIFBIUEV4Y2VsCiAqCiAqIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICoKICogQGNhdGVnb3J5ICAgUEhQRXhjZWwKICogQHBhY2thZ2UJUEhQRXhjZWwKICogQGNvcHlyaWdodCAgQ29weXJpZ2h0IChjKSAyMDA2IC0gMjAxMiBQSFBFeGNlbCAoaHR0cDovL3d3dy5jb2RlcGxleC5jb20vUEhQRXhjZWwpCiAqIEBsaWNlbnNlCWh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9vbGQtbGljZW5zZXMvbGdwbC0yLjEudHh0CUxHUEwKICogQHZlcnNpb24JMS43LjcsIDIwMTItMDUtMTkKICovCgoKLyoqCiAqIFBIUEV4Y2VsX0hhc2hUYWJsZQogKgogKiBAY2F0ZWdvcnkgICBQSFBFeGNlbAogKiBAcGFja2FnZQlQSFBFeGNlbAogKiBAY29weXJpZ2h0ICBDb3B5cmlnaHQgKGMpIDIwMDYgLSAyMDEyIFBIUEV4Y2VsIChodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9QSFBFeGNlbCkKICovCmNsYXNzIFBIUEV4Y2VsX0hhc2hUYWJsZQp7CgkvKioKCSAqIEhhc2hUYWJsZSBlbGVtZW50cwoJICoKCSAqIEB2YXIgYXJyYXkKCSAqLwoJcHVibGljICRfaXRlbXMgPSBhcnJheSgpOwoKCS8qKgoJICogSGFzaFRhYmxlIGtleSBtYXAKCSAqCgkgKiBAdmFyIGFycmF5CgkgKi8KCXB1YmxpYyAkX2tleU1hcCA9IGFycmF5KCk7CgoJLyoqCgkgKiBDcmVhdGUgYSBuZXcgUEhQRXhjZWxfSGFzaFRhYmxlCgkgKgoJICogQHBhcmFtCVBIUEV4Y2VsX0lDb21wYXJhYmxlW10gJHBTb3VyY2UJT3B0aW9uYWwgc291cmNlIGFycmF5IHRvIGNyZWF0ZSBIYXNoVGFibGUgZnJvbQoJICogQHRocm93cwlFeGNlcHRpb24KCSAqLwoJcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRwU291cmNlID0gbnVsbCkKCXsKCQlpZiAoJHBTb3VyY2UgIT09IE5VTEwpIHsKCQkJLy8gQ3JlYXRlIEhhc2hUYWJsZQoJCQkkdGhpcy0+YWRkRnJvbVNvdXJjZSgkcFNvdXJjZSk7CgkJfQoJfQoKCS8qKgoJICogQWRkIEhhc2hUYWJsZSBpdGVtcyBmcm9tIHNvdXJjZQoJICoKCSAqIEBwYXJhbQlQSFBFeGNlbF9JQ29tcGFyYWJsZVtdICRwU291cmNlCVNvdXJjZSBhcnJheSB0byBjcmVhdGUgSGFzaFRhYmxlIGZyb20KCSAqIEB0aHJvd3MJRXhjZXB0aW9uCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBhZGRGcm9tU291cmNlKCRwU291cmNlID0gbnVsbCkgewoJCS8vIENoZWNrIGlmIGFuIGFycmF5IHdhcyBwYXNzZWQKCQlpZiAoJHBTb3VyY2UgPT0gbnVsbCkgewoJCQlyZXR1cm47CgkJfSBlbHNlIGlmICghaXNfYXJyYXkoJHBTb3VyY2UpKSB7CgkJCXRocm93IG5ldyBFeGNlcHRpb24oJ0ludmFsaWQgYXJyYXkgcGFyYW1ldGVyIHBhc3NlZC4nKTsKCQl9CgoJCWZvcmVhY2ggKCRwU291cmNlIGFzICRpdGVtKSB7CgkJCSR0aGlzLT5hZGQoJGl0ZW0pOwoJCX0KCX0KCgkvKioKCSAqIEFkZCBIYXNoVGFibGUgaXRlbQoJICoKCSAqIEBwYXJhbQlQSFBFeGNlbF9JQ29tcGFyYWJsZSAkcFNvdXJjZQlJdGVtIHRvIGFkZAoJICogQHRocm93cwlFeGNlcHRpb24KCSAqLwoJcHVibGljIGZ1bmN0aW9uIGFkZChQSFBFeGNlbF9JQ29tcGFyYWJsZSAkcFNvdXJjZSA9IG51bGwpIHsKCQkkaGFzaCA9ICRwU291cmNlLT5nZXRIYXNoQ29kZSgpOwoJCWlmICghaXNzZXQoJHRoaXMtPl9pdGVtc1skaGFzaF0pKSB7CgkJCSR0aGlzLT5faXRlbXNbJGhhc2hdID0gJHBTb3VyY2U7CgkJCSR0aGlzLT5fa2V5TWFwW2NvdW50KCR0aGlzLT5faXRlbXMpIC0gMV0gPSAkaGFzaDsKCQl9Cgl9CgoJLyoqCgkgKiBSZW1vdmUgSGFzaFRhYmxlIGl0ZW0KCSAqCgkgKiBAcGFyYW0JUEhQRXhjZWxfSUNvbXBhcmFibGUgJHBTb3VyY2UJSXRlbSB0byByZW1vdmUKCSAqIEB0aHJvd3MJRXhjZXB0aW9uCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiByZW1vdmUoUEhQRXhjZWxfSUNvbXBhcmFibGUgJHBTb3VyY2UgPSBudWxsKSB7CgkJJGhhc2ggPSAkcFNvdXJjZS0+Z2V0SGFzaENvZGUoKTsKCQlpZiAoaXNzZXQoJHRoaXMtPl9pdGVtc1skaGFzaF0pKSB7CgkJCXVuc2V0KCR0aGlzLT5faXRlbXNbJGhhc2hdKTsKCgkJCSRkZWxldGVLZXkgPSAtMTsKCQkJZm9yZWFjaCAoJHRoaXMtPl9rZXlNYXAgYXMgJGtleSA9PiAkdmFsdWUpIHsKCQkJCWlmICgkZGVsZXRlS2V5ID49IDApIHsKCQkJCQkkdGhpcy0+X2tleU1hcFska2V5IC0gMV0gPSAkdmFsdWU7CgkJCQl9CgoJCQkJaWYgKCR2YWx1ZSA9PSAkaGFzaCkgewoJCQkJCSRkZWxldGVLZXkgPSAka2V5OwoJCQkJfQoJCQl9CgkJCXVuc2V0KCR0aGlzLT5fa2V5TWFwW2NvdW50KCR0aGlzLT5fa2V5TWFwKSAtIDFdKTsKCQl9Cgl9CgoJLyoqCgkgKiBDbGVhciBIYXNoVGFibGUKCSAqCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBjbGVhcigpIHsKCQkkdGhpcy0+X2l0ZW1zID0gYXJyYXkoKTsKCQkkdGhpcy0+X2tleU1hcCA9IGFycmF5KCk7Cgl9CgoJLyoqCgkgKiBDb3VudAoJICoKCSAqIEByZXR1cm4gaW50CgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBjb3VudCgpIHsKCQlyZXR1cm4gY291bnQoJHRoaXMtPl9pdGVtcyk7Cgl9CgoJLyoqCgkgKiBHZXQgaW5kZXggZm9yIGhhc2ggY29kZQoJICoKCSAqIEBwYXJhbQlzdHJpbmcJJHBIYXNoQ29kZQoJICogQHJldHVybglpbnQJSW5kZXgKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldEluZGV4Rm9ySGFzaENvZGUoJHBIYXNoQ29kZSA9ICcnKSB7CgkJcmV0dXJuIGFycmF5X3NlYXJjaCgkcEhhc2hDb2RlLCAkdGhpcy0+X2tleU1hcCk7Cgl9CgoJLyoqCgkgKiBHZXQgYnkgaW5kZXgKCSAqCgkgKiBAcGFyYW0JaW50CSRwSW5kZXgKCSAqIEByZXR1cm4JUEhQRXhjZWxfSUNvbXBhcmFibGUKCSAqCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRCeUluZGV4KCRwSW5kZXggPSAwKSB7CgkJaWYgKGlzc2V0KCR0aGlzLT5fa2V5TWFwWyRwSW5kZXhdKSkgewoJCQlyZXR1cm4gJHRoaXMtPmdldEJ5SGFzaENvZGUoICR0aGlzLT5fa2V5TWFwWyRwSW5kZXhdICk7CgkJfQoKCQlyZXR1cm4gbnVsbDsKCX0KCgkvKioKCSAqIEdldCBieSBoYXNoY29kZQoJICoKCSAqIEBwYXJhbQlzdHJpbmcJJHBIYXNoQ29kZQoJICogQHJldHVybglQSFBFeGNlbF9JQ29tcGFyYWJsZQoJICoKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldEJ5SGFzaENvZGUoJHBIYXNoQ29kZSA9ICcnKSB7CgkJaWYgKGlzc2V0KCR0aGlzLT5faXRlbXNbJHBIYXNoQ29kZV0pKSB7CgkJCXJldHVybiAkdGhpcy0+X2l0ZW1zWyRwSGFzaENvZGVdOwoJCX0KCgkJcmV0dXJuIG51bGw7Cgl9CgoJLyoqCgkgKiBIYXNoVGFibGUgdG8gYXJyYXkKCSAqCgkgKiBAcmV0dXJuIFBIUEV4Y2VsX0lDb21wYXJhYmxlW10KCSAqLwoJcHVibGljIGZ1bmN0aW9uIHRvQXJyYXkoKSB7CgkJcmV0dXJuICR0aGlzLT5faXRlbXM7Cgl9CgoJLyoqCgkgKiBJbXBsZW1lbnQgUEhQIF9fY2xvbmUgdG8gY3JlYXRlIGEgZGVlcCBjbG9uZSwgbm90IGp1c3QgYSBzaGFsbG93IGNvcHkuCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBfX2Nsb25lKCkgewoJCSR2YXJzID0gZ2V0X29iamVjdF92YXJzKCR0aGlzKTsKCQlmb3JlYWNoICgkdmFycyBhcyAka2V5ID0+ICR2YWx1ZSkgewoJCQlpZiAoaXNfb2JqZWN0KCR2YWx1ZSkpIHsKCQkJCSR0aGlzLT4ka2V5ID0gY2xvbmUgJHZhbHVlOwoJCQl9CgkJfQoJfQp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/IComparable.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIFBIUEV4Y2VsCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCiAqCiAqIEBjYXRlZ29yeSAgIFBIUEV4Y2VsCiAqIEBwYWNrYWdlICAgIFBIUEV4Y2VsCiAqIEBjb3B5cmlnaHQgIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwgKGh0dHA6Ly93d3cuY29kZXBsZXguY29tL1BIUEV4Y2VsKQogKiBAbGljZW5zZSAgICBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvb2xkLWxpY2Vuc2VzL2xncGwtMi4xLnR4dAlMR1BMCiAqIEB2ZXJzaW9uICAgIDEuNy43LCAyMDEyLTA1LTE5CiAqLwoKCi8qKgogKiBQSFBFeGNlbF9JQ29tcGFyYWJsZQogKgogKiBAY2F0ZWdvcnkgICBQSFBFeGNlbAogKiBAcGFja2FnZSAgICBQSFBFeGNlbAogKiBAY29weXJpZ2h0ICBDb3B5cmlnaHQgKGMpIDIwMDYgLSAyMDEyIFBIUEV4Y2VsIChodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9QSFBFeGNlbCkKICovCmludGVyZmFjZSBQSFBFeGNlbF9JQ29tcGFyYWJsZQp7CgkvKioKCSAqIEdldCBoYXNoIGNvZGUKCSAqCgkgKiBAcmV0dXJuIHN0cmluZwlIYXNoIGNvZGUKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldEhhc2hDb2RlKCk7Cgp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/IOFactory.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIFBIUEV4Y2VsCiAqCiAqIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICoKICogQGNhdGVnb3J5ICAgUEhQRXhjZWwKICogQHBhY2thZ2UgICAgUEhQRXhjZWwKICogQGNvcHlyaWdodCAgQ29weXJpZ2h0IChjKSAyMDA2IC0gMjAxMiBQSFBFeGNlbCAoaHR0cDovL3d3dy5jb2RlcGxleC5jb20vUEhQRXhjZWwpCiAqIEBsaWNlbnNlICAgIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9vbGQtbGljZW5zZXMvbGdwbC0yLjEudHh0CUxHUEwKICogQHZlcnNpb24gICAgMS43LjcsIDIwMTItMDUtMTkKICovCgoKLyoqCVBIUEV4Y2VsIHJvb3QgZGlyZWN0b3J5ICovCmlmICghZGVmaW5lZCgnUEhQRVhDRUxfUk9PVCcpKSB7CgkvKioKCSAqIEBpZ25vcmUKCSAqLwoJZGVmaW5lKCdQSFBFWENFTF9ST09UJywgZGlybmFtZShfX0ZJTEVfXykgLiAnLy4uLycpOwoJcmVxdWlyZShQSFBFWENFTF9ST09UIC4gJ1BIUEV4Y2VsL0F1dG9sb2FkZXIucGhwJyk7Cn0KCi8qKgogKiBQSFBFeGNlbF9JT0ZhY3RvcnkKICoKICogQGNhdGVnb3J5ICAgUEhQRXhjZWwKICogQHBhY2thZ2UgICAgUEhQRXhjZWwKICogQGNvcHlyaWdodCAgQ29weXJpZ2h0IChjKSAyMDA2IC0gMjAxMiBQSFBFeGNlbCAoaHR0cDovL3d3dy5jb2RlcGxleC5jb20vUEhQRXhjZWwpCiAqLwpjbGFzcyBQSFBFeGNlbF9JT0ZhY3RvcnkKewoJLyoqCgkgKiBTZWFyY2ggbG9jYXRpb25zCgkgKgoJICogQHZhcglhcnJheQoJICogQGFjY2Vzcwlwcml2YXRlCgkgKiBAc3RhdGljCgkgKi8KCXByaXZhdGUgc3RhdGljICRfc2VhcmNoTG9jYXRpb25zID0gYXJyYXkoCgkJYXJyYXkoICd0eXBlJyA9PiAnSVdyaXRlcicsICdwYXRoJyA9PiAnUEhQRXhjZWwvV3JpdGVyL3swfS5waHAnLCAnY2xhc3MnID0+ICdQSFBFeGNlbF9Xcml0ZXJfezB9JyApLAoJCWFycmF5KCAndHlwZScgPT4gJ0lSZWFkZXInLCAncGF0aCcgPT4gJ1BIUEV4Y2VsL1JlYWRlci97MH0ucGhwJywgJ2NsYXNzJyA9PiAnUEhQRXhjZWxfUmVhZGVyX3swfScgKQoJKTsKCgkvKioKCSAqIEF1dG9yZXNvbHZlIGNsYXNzZXMKCSAqCgkgKiBAdmFyCWFycmF5CgkgKiBAYWNjZXNzCXByaXZhdGUKCSAqIEBzdGF0aWMKCSAqLwoJcHJpdmF0ZSBzdGF0aWMgJF9hdXRvUmVzb2x2ZUNsYXNzZXMgPSBhcnJheSgKCQknRXhjZWwyMDA3JywKCQknRXhjZWw1JywKCQknRXhjZWwyMDAzWE1MJywKCQknT09DYWxjJywKCQknU1lMSycsCgkJJ0dudW1lcmljJywKCQknQ1NWJywKCSk7CgogICAgLyoqCiAgICAgKglQcml2YXRlIGNvbnN0cnVjdG9yIGZvciBQSFBFeGNlbF9JT0ZhY3RvcnkKICAgICAqLwogICAgcHJpdmF0ZSBmdW5jdGlvbiBfX2NvbnN0cnVjdCgpIHsgfQoKICAgIC8qKgogICAgICogR2V0IHNlYXJjaCBsb2NhdGlvbnMKICAgICAqCgkgKiBAc3RhdGljCgkgKiBAYWNjZXNzCXB1YmxpYwogICAgICogQHJldHVybglhcnJheQogICAgICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldFNlYXJjaExvY2F0aW9ucygpIHsKCQlyZXR1cm4gc2VsZjo6JF9zZWFyY2hMb2NhdGlvbnM7Cgl9CS8vCWZ1bmN0aW9uIGdldFNlYXJjaExvY2F0aW9ucygpCgoJLyoqCgkgKiBTZXQgc2VhcmNoIGxvY2F0aW9ucwoJICoKCSAqIEBzdGF0aWMKCSAqIEBhY2Nlc3MJcHVibGljCgkgKiBAcGFyYW0JYXJyYXkgJHZhbHVlCgkgKiBAdGhyb3dzCUV4Y2VwdGlvbgoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHNldFNlYXJjaExvY2F0aW9ucygkdmFsdWUpIHsKCQlpZiAoaXNfYXJyYXkoJHZhbHVlKSkgewoJCQlzZWxmOjokX3NlYXJjaExvY2F0aW9ucyA9ICR2YWx1ZTsKCQl9IGVsc2UgewoJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCdJbnZhbGlkIHBhcmFtZXRlciBwYXNzZWQuJyk7CgkJfQoJfQkvLwlmdW5jdGlvbiBzZXRTZWFyY2hMb2NhdGlvbnMoKQoKCS8qKgoJICogQWRkIHNlYXJjaCBsb2NhdGlvbgoJICoKCSAqIEBzdGF0aWMKCSAqIEBhY2Nlc3MJcHVibGljCgkgKiBAcGFyYW0Jc3RyaW5nICR0eXBlCQlFeGFtcGxlOiBJV3JpdGVyCgkgKiBAcGFyYW0Jc3RyaW5nICRsb2NhdGlvbglFeGFtcGxlOiBQSFBFeGNlbC9Xcml0ZXIvezB9LnBocAoJICogQHBhcmFtCXN0cmluZyAkY2xhc3NuYW1lIAlFeGFtcGxlOiBQSFBFeGNlbF9Xcml0ZXJfezB9CgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gYWRkU2VhcmNoTG9jYXRpb24oJHR5cGUgPSAnJywgJGxvY2F0aW9uID0gJycsICRjbGFzc25hbWUgPSAnJykgewoJCXNlbGY6OiRfc2VhcmNoTG9jYXRpb25zW10gPSBhcnJheSggJ3R5cGUnID0+ICR0eXBlLCAncGF0aCcgPT4gJGxvY2F0aW9uLCAnY2xhc3MnID0+ICRjbGFzc25hbWUgKTsKCX0JLy8JZnVuY3Rpb24gYWRkU2VhcmNoTG9jYXRpb24oKQoKCS8qKgoJICogQ3JlYXRlIFBIUEV4Y2VsX1dyaXRlcl9JV3JpdGVyCgkgKgoJICogQHN0YXRpYwoJICogQGFjY2VzcwlwdWJsaWMKCSAqIEBwYXJhbQlQSFBFeGNlbCAkcGhwRXhjZWwKCSAqIEBwYXJhbQlzdHJpbmcgICR3cml0ZXJUeXBlCUV4YW1wbGU6IEV4Y2VsMjAwNwoJICogQHJldHVybglQSFBFeGNlbF9Xcml0ZXJfSVdyaXRlcgoJICogQHRocm93cwlFeGNlcHRpb24KCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBjcmVhdGVXcml0ZXIoUEhQRXhjZWwgJHBocEV4Y2VsLCAkd3JpdGVyVHlwZSA9ICcnKSB7CgkJLy8gU2VhcmNoIHR5cGUKCQkkc2VhcmNoVHlwZSA9ICdJV3JpdGVyJzsKCgkJLy8gSW5jbHVkZSBjbGFzcwoJCWZvcmVhY2ggKHNlbGY6OiRfc2VhcmNoTG9jYXRpb25zIGFzICRzZWFyY2hMb2NhdGlvbikgewoJCQlpZiAoJHNlYXJjaExvY2F0aW9uWyd0eXBlJ10gPT0gJHNlYXJjaFR5cGUpIHsKCQkJCSRjbGFzc05hbWUgPSBzdHJfcmVwbGFjZSgnezB9JywgJHdyaXRlclR5cGUsICRzZWFyY2hMb2NhdGlvblsnY2xhc3MnXSk7CgkJCQkkY2xhc3NGaWxlID0gc3RyX3JlcGxhY2UoJ3swfScsICR3cml0ZXJUeXBlLCAkc2VhcmNoTG9jYXRpb25bJ3BhdGgnXSk7CgoJCQkJJGluc3RhbmNlID0gbmV3ICRjbGFzc05hbWUoJHBocEV4Y2VsKTsKCQkJCWlmICgkaW5zdGFuY2UgIT09IE5VTEwpIHsKCQkJCQlyZXR1cm4gJGluc3RhbmNlOwoJCQkJfQoJCQl9CgkJfQoKCQkvLyBOb3RoaW5nIGZvdW5kLi4uCgkJdGhyb3cgbmV3IEV4Y2VwdGlvbigiTm8gJHNlYXJjaFR5cGUgZm91bmQgZm9yIHR5cGUgJHdyaXRlclR5cGUiKTsKCX0JLy8JZnVuY3Rpb24gY3JlYXRlV3JpdGVyKCkKCgkvKioKCSAqIENyZWF0ZSBQSFBFeGNlbF9SZWFkZXJfSVJlYWRlcgoJICoKCSAqIEBzdGF0aWMKCSAqIEBhY2Nlc3MJcHVibGljCgkgKiBAcGFyYW0Jc3RyaW5nICRyZWFkZXJUeXBlCUV4YW1wbGU6IEV4Y2VsMjAwNwoJICogQHJldHVybglQSFBFeGNlbF9SZWFkZXJfSVJlYWRlcgoJICogQHRocm93cwlFeGNlcHRpb24KCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBjcmVhdGVSZWFkZXIoJHJlYWRlclR5cGUgPSAnJykgewoJCS8vIFNlYXJjaCB0eXBlCgkJJHNlYXJjaFR5cGUgPSAnSVJlYWRlcic7CgoJCS8vIEluY2x1ZGUgY2xhc3MKCQlmb3JlYWNoIChzZWxmOjokX3NlYXJjaExvY2F0aW9ucyBhcyAkc2VhcmNoTG9jYXRpb24pIHsKCQkJaWYgKCRzZWFyY2hMb2NhdGlvblsndHlwZSddID09ICRzZWFyY2hUeXBlKSB7CgkJCQkkY2xhc3NOYW1lID0gc3RyX3JlcGxhY2UoJ3swfScsICRyZWFkZXJUeXBlLCAkc2VhcmNoTG9jYXRpb25bJ2NsYXNzJ10pOwoJCQkJJGNsYXNzRmlsZSA9IHN0cl9yZXBsYWNlKCd7MH0nLCAkcmVhZGVyVHlwZSwgJHNlYXJjaExvY2F0aW9uWydwYXRoJ10pOwoKCQkJCSRpbnN0YW5jZSA9IG5ldyAkY2xhc3NOYW1lKCk7CgkJCQlpZiAoJGluc3RhbmNlICE9PSBOVUxMKSB7CgkJCQkJcmV0dXJuICRpbnN0YW5jZTsKCQkJCX0KCQkJfQoJCX0KCgkJLy8gTm90aGluZyBmb3VuZC4uLgoJCXRocm93IG5ldyBFeGNlcHRpb24oIk5vICRzZWFyY2hUeXBlIGZvdW5kIGZvciB0eXBlICRyZWFkZXJUeXBlIik7Cgl9CS8vCWZ1bmN0aW9uIGNyZWF0ZVJlYWRlcigpCgoJLyoqCgkgKiBMb2FkcyBQSFBFeGNlbCBmcm9tIGZpbGUgdXNpbmcgYXV0b21hdGljIFBIUEV4Y2VsX1JlYWRlcl9JUmVhZGVyIHJlc29sdXRpb24KCSAqCgkgKiBAc3RhdGljCgkgKiBAYWNjZXNzIHB1YmxpYwoJICogQHBhcmFtIAlzdHJpbmcgCQkkcEZpbGVOYW1lCgkgKiBAcmV0dXJuCVBIUEV4Y2VsCgkgKiBAdGhyb3dzCUV4Y2VwdGlvbgoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGxvYWQoJHBGaWxlbmFtZSkgewoJCSRyZWFkZXIgPSBzZWxmOjpjcmVhdGVSZWFkZXJGb3JGaWxlKCRwRmlsZW5hbWUpOwoJCXJldHVybiAkcmVhZGVyLT5sb2FkKCRwRmlsZW5hbWUpOwoJfQkvLwlmdW5jdGlvbiBsb2FkKCkKCgkvKioKCSAqIElkZW50aWZ5IGZpbGUgdHlwZSB1c2luZyBhdXRvbWF0aWMgUEhQRXhjZWxfUmVhZGVyX0lSZWFkZXIgcmVzb2x1dGlvbgoJICoKCSAqIEBzdGF0aWMKCSAqIEBhY2Nlc3MgcHVibGljCgkgKiBAcGFyYW0gCXN0cmluZyAJCSRwRmlsZU5hbWUKCSAqIEByZXR1cm4Jc3RyaW5nCgkgKiBAdGhyb3dzCUV4Y2VwdGlvbgoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGlkZW50aWZ5KCRwRmlsZW5hbWUpIHsKCQkkcmVhZGVyID0gc2VsZjo6Y3JlYXRlUmVhZGVyRm9yRmlsZSgkcEZpbGVuYW1lKTsKCQkkY2xhc3NOYW1lID0gZ2V0X2NsYXNzKCRyZWFkZXIpOwoJCSRjbGFzc1R5cGUgPSBleHBsb2RlKCdfJywkY2xhc3NOYW1lKTsKCQl1bnNldCgkcmVhZGVyKTsKCQlyZXR1cm4gYXJyYXlfcG9wKCRjbGFzc1R5cGUpOwoJfQkvLwlmdW5jdGlvbiBpZGVudGlmeSgpCgoJLyoqCgkgKiBDcmVhdGUgUEhQRXhjZWxfUmVhZGVyX0lSZWFkZXIgZm9yIGZpbGUgdXNpbmcgYXV0b21hdGljIFBIUEV4Y2VsX1JlYWRlcl9JUmVhZGVyIHJlc29sdXRpb24KCSAqCgkgKiBAc3RhdGljCgkgKiBAYWNjZXNzCXB1YmxpYwoJICogQHBhcmFtIAlzdHJpbmcgCQkkcEZpbGVOYW1lCgkgKiBAcmV0dXJuCVBIUEV4Y2VsX1JlYWRlcl9JUmVhZGVyCgkgKiBAdGhyb3dzCUV4Y2VwdGlvbgoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGNyZWF0ZVJlYWRlckZvckZpbGUoJHBGaWxlbmFtZSkgewoKCQkvLyBGaXJzdCwgbHVja3kgZ3Vlc3MgYnkgaW5zcGVjdGluZyBmaWxlIGV4dGVuc2lvbgoJCSRwYXRoaW5mbyA9IHBhdGhpbmZvKCRwRmlsZW5hbWUpOwoKCQlpZiAoaXNzZXQoJHBhdGhpbmZvWydleHRlbnNpb24nXSkpIHsKCQkJc3dpdGNoIChzdHJ0b2xvd2VyKCRwYXRoaW5mb1snZXh0ZW5zaW9uJ10pKSB7CgkJCQljYXNlICd4bHN4JzoKCQkJCQkkcmVhZGVyID0gc2VsZjo6Y3JlYXRlUmVhZGVyKCdFeGNlbDIwMDcnKTsKCQkJCQlicmVhazsKCQkJCWNhc2UgJ3hscyc6CgkJCQljYXNlICd4bHNtJzoKCQkJCQkkcmVhZGVyID0gc2VsZjo6Y3JlYXRlUmVhZGVyKCdFeGNlbDUnKTsKCQkJCQlicmVhazsKCQkJCWNhc2UgJ29kcyc6CgkJCQkJJHJlYWRlciA9IHNlbGY6OmNyZWF0ZVJlYWRlcignT09DYWxjJyk7CgkJCQkJYnJlYWs7CgkJCQljYXNlICdzbGsnOgoJCQkJCSRyZWFkZXIgPSBzZWxmOjpjcmVhdGVSZWFkZXIoJ1NZTEsnKTsKCQkJCQlicmVhazsKCQkJCWNhc2UgJ3htbCc6CgkJCQkJJHJlYWRlciA9IHNlbGY6OmNyZWF0ZVJlYWRlcignRXhjZWwyMDAzWE1MJyk7CgkJCQkJYnJlYWs7CgkJCQljYXNlICdnbnVtZXJpYyc6CgkJCQkJJHJlYWRlciA9IHNlbGY6OmNyZWF0ZVJlYWRlcignR251bWVyaWMnKTsKCQkJCQlicmVhazsKCQkJCWNhc2UgJ2Nzdic6CgkJCQkJLy8gRG8gbm90aGluZwoJCQkJCS8vIFdlIG11c3Qgbm90IHRyeSB0byB1c2UgQ1NWIHJlYWRlciBzaW5jZSBpdCBsb2FkcwoJCQkJCS8vIGFsbCBmaWxlcyBpbmNsdWRpbmcgRXhjZWwgZmlsZXMgZXRjLgoJCQkJCWJyZWFrOwoJCQkJZGVmYXVsdDoKCQkJCQlicmVhazsKCQkJfQoKCQkJLy8gTGV0J3Mgc2VlIGlmIHdlIGFyZSBsdWNreQoJCQlpZiAoaXNzZXQoJHJlYWRlcikgJiYgJHJlYWRlci0+Y2FuUmVhZCgkcEZpbGVuYW1lKSkgewoJCQkJcmV0dXJuICRyZWFkZXI7CgkJCX0KCgkJfQoKCQkvLyBJZiB3ZSByZWFjaCBoZXJlIHRoZW4gImx1Y2t5IGd1ZXNzIiBkaWRuJ3QgZ2l2ZSBhbnkgcmVzdWx0CgoJCS8vIFRyeSBsb2FkaW5nIHVzaW5nIHNlbGY6OiRfYXV0b1Jlc29sdmVDbGFzc2VzCgkJZm9yZWFjaCAoc2VsZjo6JF9hdXRvUmVzb2x2ZUNsYXNzZXMgYXMgJGF1dG9SZXNvbHZlQ2xhc3MpIHsKCQkJJHJlYWRlciA9IHNlbGY6OmNyZWF0ZVJlYWRlcigkYXV0b1Jlc29sdmVDbGFzcyk7CgkJCWlmICgkcmVhZGVyLT5jYW5SZWFkKCRwRmlsZW5hbWUpKSB7CgkJCQlyZXR1cm4gJHJlYWRlcjsKCQkJfQoJCX0KCgl9CS8vCWZ1bmN0aW9uIGNyZWF0ZVJlYWRlckZvckZpbGUoKQp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/locale/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/locale/cs/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/locale/cs/config</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[77u/IyMNCiMjIFBIUEV4Y2VsDQojIw0NCiMjIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTEgUEhQRXhjZWwNCiMjDQojIyBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yDQojIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljDQojIyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXINCiMjIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLg0KIyMNCiMjIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLA0KIyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YNCiMjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VDQojIyBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLg0KIyMNCiMjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMNCiMjIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUNCiMjIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQ0KIyMNCiMjIEBjYXRlZ29yeSAgIFBIUEV4Y2VsDQojIyBAcGFja2FnZSAgICBQSFBFeGNlbF9TZXR0aW5ncw0KIyMgQGNvcHlyaWdodCAgQ29weXJpZ2h0IChjKSAyMDA2IC0gMjAxMSBQSFBFeGNlbCAoaHR0cDovL3d3dy5jb2RlcGxleC5jb20vUEhQRXhjZWwpDQojIyBAbGljZW5zZSAgICBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvb2xkLWxpY2Vuc2VzL2xncGwtMi4xLnR4dAlMR1BMDQojIyBAdmVyc2lvbiAgICAxLjcuNywgMjAxMi0wNS0xOQ0KIyMNCiMjDQoNCg0KQXJndW1lbnRTZXBhcmF0b3IJPSA7DQoNCg0KIyMNCiMjCShGb3IgZnV0dXJlIHVzZSkNCiMjDQpjdXJyZW5jeVN5bWJvbAk9IEvEjQ0KDQoNCiMjDQojIwlFeGNlbCBFcnJvciBDb2RlcwkoRm9yIGZ1dHVyZSB1c2UpDQojIw0KTlVMTAk9ICNOVUxMIQ0KRElWMAk9ICNESVYvMCENClZBTFVFCT0gI0hPRE5PVEEhDQpSRUYJPSAjUkVGIQ0KTkFNRQk9ICNOw4FaRVY/DQpOVU0JPSAjTlVNIQ0KTkEJPSAjTi9BDQo=]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/locale/cs/functions</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[77u/IyMNCiMjIFBIUEV4Y2VsDQojIw0NCiMjIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTEgUEhQRXhjZWwNCiMjDQojIyBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yDQojIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljDQojIyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXINCiMjIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLg0KIyMNCiMjIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLA0KIyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YNCiMjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VDQojIyBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLg0KIyMNCiMjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMNCiMjIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUNCiMjIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQ0KIyMNCiMjIEBjYXRlZ29yeSAgIFBIUEV4Y2VsDQojIyBAcGFja2FnZSAgICBQSFBFeGNlbF9DYWxjdWxhdGlvbg0KIyMgQGNvcHlyaWdodCAgQ29weXJpZ2h0IChjKSAyMDA2IC0gMjAxMSBQSFBFeGNlbCAoaHR0cDovL3d3dy5jb2RlcGxleC5jb20vUEhQRXhjZWwpDQojIyBAbGljZW5zZSAgICBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvb2xkLWxpY2Vuc2VzL2xncGwtMi4xLnR4dAlMR1BMDQojIyBAdmVyc2lvbiAgICAxLjcuNywgMjAxMi0wNS0xOQ0KIyMNCiMjIERhdGEgaW4gdGhpcyBmaWxlIGRlcml2ZWQgZnJvbSBodHRwOi8vd3d3LnBpdWhhLmZpL2V4Y2VsLWZ1bmN0aW9uLW5hbWUtdHJhbnNsYXRpb24vDQojIw0KIyMNCg0KDQojIw0KIyMJQWRkLWluIGFuZCBBdXRvbWF0aW9uIGZ1bmN0aW9ucwkJRnVua2NlIGRvcGzFiGvFryBhIGF1dG9tYXRpemFjZQ0KIyMNCkdFVFBJVk9UREFUQQkJPSBaw41TS0FUS09OVERBVEEJIyMJVnLDoXTDrSBkYXRhIHVsb8W+ZW7DoSB2IGtvbnRpbmdlbsSNbsOtIHRhYnVsY2UuIFBvbW9jw60gZnVua2NlIFrDjVNLQVRLT05UREFUQSBtxa/FvmV0ZSBuYcSNw61zdCBzb3Vocm5uw6EgZGF0YSB6IGtvbnRpbmdlbsSNbsOtIHRhYnVsa3ksIHBva3VkIGpzb3UgdGF0byBkYXRhIHYga29udGluZ2VuxI1uw60gc2VzdGF2xJsgem9icmF6ZW5hLg0KDQoNCiMjDQojIwlDdWJlIGZ1bmN0aW9ucwkJCQlGdW5rY2UgcHJvIHByw6FjaSBzIGtyeWNobGVtaQ0KIyMNCkNVQkVLUElNRU1CRVIJCT0gQ1VCRUtQSU1FTUJFUgkJIyMJVnLDoXTDrSBuw6F6ZXYsIHZsYXN0bm9zdCBhIHZlbGlrb3N0IGtsw63EjW92w6lobyB1a2F6YXRlbGUgdsO9a29udSAoS1VWKSBhIHpvYnJhesOtIHYgYnXFiGNlIG7DoXpldiBhIHZsYXN0bm9zdC4gS2zDrcSNb3bDvSB1a2F6YXRlbCB2w71rb251IGplIGt2YW50aWZpa292YXRlbG7DoSB2ZWxpxI1pbmEsIG5hcMWZw61rbGFkIGhydWLDvSBtxJtzw63EjW7DrSB6aXNrIG5lYm8gxI10dnJ0bGV0bsOtIG9icmF0IG5hIHphbcSbc3RuYW5jZSwga3RlcsOhIHNlIHBvdcW+w612w6EgcHJvIHNsZWRvdsOhbsOtIHbDvWtvbm5vc3RpIG9yZ2FuaXphY2UuDQpDVUJFTUVNQkVSCQk9IENVQkVNRU1CRVIJCSMjCVZyw6F0w60gxI1sZW4gbmVibyBuLXRpY2kgdiBoaWVyYXJjaGlpIGtyeWNobGUuIFNsb3XFvsOtIGsgb3bEm8WZZW7DrSwgemRhIHYga3J5Y2hsaSBleGlzdHVqZSDEjWxlbiBuZWJvIG4tdGljZS4NCkNVQkVNRU1CRVJQUk9QRVJUWQk9IENVQkVNRU1CRVJQUk9QRVJUWQkjIwlWcsOhdMOtIGhvZG5vdHUgdmxhc3Rub3N0aSDEjWxlbmEgdiBrcnljaGxpLiBTbG91xb7DrSBrIG92xJvFmWVuw60sIHpkYSB2IGtyeWNobGkgZXhpc3R1amUgxI1sZW4gcyBkYW7DvW0gbsOhenZlbSwgYSBrIHZyw6FjZW7DrSBrb25rcsOpdG7DrSB2bGFzdG5vc3RpIHRvaG90byDEjWxlbmEuDQpDVUJFUkFOS0VETUVNQkVSCT0gQ1VCRVJBTktFRE1FTUJFUgkjIwlWcsOhdMOtIG4tdMO9IG5lYm8gcG/FmWFkb3bDvSDEjWxlbiBzYWR5LiBQb3XFvmlqdGUgamkgcHJvIHZyw6FjZW7DrSBqZWRub2hvIG5lYm8gdsOtY2UgcHJ2a8WvIHNhZHksIG5hcMWZw61rbGFkIG9iY2hvZG7DrWthIHMgbmVqdnnFocWhw61tIG9icmF0ZW0gbmVibyBkZXNldGkgbmVqbGVwxaHDrWNoIHN0dWRlbnTFry4NCkNVQkVTRVQJCQk9IENVQkVTRVQJCSMjCURlZmludWplIHZ5cG/EjXRlbm91IHNhZHUgxI1sZW7FryBuZWJvIG4tdGljIG9kZXNsw6Fuw61tIHbDvXJhenUgc2FkeSBkbyBrcnljaGxlIG5hIHNlcnZlcnUsIGt0ZXLDvSB2eXR2b8WZw60gc2FkdSBhIHBvdG9tIGppIHZyw6F0w60gZG8gYXBsaWthY2UgTWljcm9zb2Z0IE9mZmljZSBFeGNlbC4NCkNVQkVTRVRDT1VOVAkJPSBDVUJFU0VUQ09VTlQJCSMjCVZyw6F0w60gcG/EjWV0IHBvbG/FvmVrIHYgbW5vxb5pbsSbDQpDVUJFVkFMVUUJCT0gQ1VCRVZBTFVFCQkjIwlWcsOhdMOtIMO6aHJubm91IGhvZG5vdHUgeiBrcnljaGxlLg0KDQoNCiMjDQojIwlEYXRhYmFzZSBmdW5jdGlvbnMJCQlGdW5rY2UgZGF0YWLDoXplDQojIw0KREFWRVJBR0UJCT0gRFBSxa5NxJpSCQkjIwlWcsOhdMOtIHByxa9txJtyIHZ5YnJhbsO9Y2ggcG9sb8W+ZWsgZGF0YWLDoXplLg0KRENPVU5UCQkJPSBEUE/EjEVUCQkjIwlTcG/EjcOtdMOhIGJ1xYhreSBkYXRhYsOhemUgb2JzYWh1asOtY8OtIMSNw61zbGEuDQpEQ09VTlRBCQkJPSBEUE/EjEVUMgkJIyMJU3BvxI3DrXTDoSBidcWIa3kgZGF0YWLDoXplLCBrdGVyw6kgbmVqc291IHByw6F6ZG7DqS4NCkRHRVQJCQk9IERaw41TS0FUCQkjIwlFeHRyYWh1amUgeiBkYXRhYsOhemUgamVkZW4gesOhem5hbSBzcGzFiHVqw61jw60gemFkYW7DoSBrcml0w6lyaWEuDQpETUFYCQkJPSBETUFYCQkJIyMJVnLDoXTDrSBtYXhpbcOhbG7DrSBob2Rub3R1IHogdnlicmFuw71jaCBwb2xvxb5layBkYXRhYsOhemUuDQpETUlOCQkJPSBETUlOCQkJIyMJVnLDoXTDrSBtaW5pbcOhbG7DrSBob2Rub3R1IHogdnlicmFuw71jaCBwb2xvxb5layBkYXRhYsOhemUuDQpEUFJPRFVDVAkJPSBEU09VxIxJTgkJIyMJVnluw6Fzb2LDrSBob2Rub3R5IHVyxI1pdMOpaG8gcG9sZSB6w6F6bmFtxa8gdiBkYXRhYsOhemksIGt0ZXLDqSBzcGzFiHVqw60gZGFuw6Ega3JpdMOpcmlhLg0KRFNUREVWCQkJPSBEU01PRENILlbDnULEmlIJCSMjCU9kaGFkbmUgc23Em3JvZGF0bm91IG9kY2h5bGt1IHbDvWLEm3J1IHZ5YnJhbsO9Y2ggcG9sb8W+ZWsgZGF0YWLDoXplLg0KRFNUREVWUAkJCT0gRFNNT0RDSAkJIyMJVnlwb8SNdGUgc23Em3JvZGF0bm91IG9kY2h5bGt1IHrDoWtsYWRuw61obyBzb3Vib3J1IHZ5YnJhbsO9Y2ggcG9sb8W+ZWsgZGF0YWLDoXplLg0KRFNVTQkJCT0gRFNVTUEJCQkjIwlTZcSNdGUgxI3DrXNsYSB2ZSBzbG91cGNvdsOpbSBwb2xpIHrDoXpuYW3FryBkYXRhYsOhemUsIGt0ZXLDoSBzcGzFiHVqw60gZGFuw6Ega3JpdMOpcmlhLg0KRFZBUgkJCT0gRFZBUi5Ww51CxJpSCQkjIwlPZGhhZG5lIHJvenB0eWwgdsO9YsSbcnUgdnlicmFuw71jaCBwb2xvxb5layBkYXRhYsOhemUuDQpEVkFSUAkJCT0gRFZBUgkJCSMjCVZ5cG/EjXRlIHJvenB0eWwgesOha2xhZG7DrWhvIHNvdWJvcnUgdnlicmFuw71jaCBwb2xvxb5layBkYXRhYsOhemUuDQoNCg0KIyMNCiMjCURhdGUgYW5kIHRpbWUgZnVuY3Rpb25zCQkJRnVua2NlIGRhdGEgYSDEjWFzdQ0KIyMNCkRBVEUJCQk9IERBVFVNCQkJIyMJVnLDoXTDrSBwb8WZYWRvdsOpIMSNw61zbG8gdXLEjWl0w6lobyBkYXRhLg0KREFURVZBTFVFCQk9IERBVFVNSE9ETgkJIyMJUMWZZXZlZGUgZGF0dW0gdmUgZm9ybcSbIHRleHR1IG5hIHBvxZlhZG92w6kgxI3DrXNsby4NCkRBWQkJCT0gREVOCQkJIyMJUMWZZXZlZGUgcG/FmWFkb3bDqSDEjcOtc2xvIG5hIGRlbiB2IG3Em3PDrWNpLg0KREFZUzM2MAkJCT0gUk9LMzYwCQkjIwlWcsOhdMOtIHBvxI1ldCBkbsOtIG1lemkgZHbEm21hIGRhdHkgbmEgesOha2xhZMSbIHJva3UgcyAzNjAgZG55Lg0KRURBVEUJCQk9IEVEQVRFCQkJIyMJVnLDoXTDrSBwb8WZYWRvdsOpIMSNw61zbG8gZGF0YSwga3RlcsOpIG96bmHEjXVqZSB1csSNZW7DvSBwb8SNZXQgbcSbc8OtY8WvIHDFmWVkIG5lYm8gcG8gcG/EjcOhdGXEjW7DrW0gZGF0dS4NCkVPTU9OVEgJCQk9IEVPTU9OVEgJCSMjCVZyw6F0w60gcG/FmWFkb3bDqSDEjcOtc2xvIHBvc2xlZG7DrWhvIGRuZSBtxJtzw61jZSBwxZllZCBuZWJvIHBvIHphZGFuw6ltIHBvxI10dSBtxJtzw61jxa8uDQpIT1VSCQkJPSBIT0RJTkEJCSMjCVDFmWV2ZWRlIHBvxZlhZG92w6kgxI3DrXNsbyBuYSBob2RpbnUuDQpNSU5VVEUJCQk9IE1JTlVUQQkJIyMJUMWZZXZlZGUgcG/FmWFkb3bDqSDEjcOtc2xvIG5hIG1pbnV0dS4NCk1PTlRICQkJPSBNxJpTw41DCQkJIyMJUMWZZXZlZGUgcG/FmWFkb3bDqSDEjcOtc2xvIG5hIG3Em3PDrWMuDQpORVRXT1JLREFZUwkJPSBORVRXT1JLREFZUwkJIyMJVnLDoXTDrSBwb8SNZXQgY2Vsw71jaCBwcmFjb3Zuw61jaCBkbsOtIG1lemkgZHbEm21hIGRhdHkuDQpOT1cJCQk9IE5ZTsONCQkJIyMJVnLDoXTDrSBwb8WZYWRvdsOpIMSNw61zbG8gYWt0dcOhbG7DrWhvIGRhdGEgYSDEjWFzdS4NClNFQ09ORAkJCT0gU0VLVU5EQQkJIyMJUMWZZXZlZGUgcG/FmWFkb3bDqSDEjcOtc2xvIG5hIHNla3VuZHUuDQpUSU1FCQkJPSDEjEFTCQkJIyMJVnLDoXTDrSBwb8WZYWRvdsOpIMSNw61zbG8gdXLEjWl0w6lobyDEjWFzdS4NClRJTUVWQUxVRQkJPSDEjEFTSE9ETgkJIyMJUMWZZXZlZGUgxI1hcyB2ZSBmb3JtxJsgdGV4dHUgbmEgcG/FmWFkb3bDqSDEjcOtc2xvLg0KVE9EQVkJCQk9IERORVMJCQkjIwlWcsOhdMOtIHBvxZlhZG92w6kgxI3DrXNsbyBkbmXFoW7DrWhvIGRhdGEuDQpXRUVLREFZCQkJPSBERU5Uw51ETkUJCSMjCVDFmWV2ZWRlIHBvxZlhZG92w6kgxI3DrXNsbyBuYSBkZW4gdiB0w71kbnUuDQpXRUVLTlVNCQkJPSBXRUVLTlVNCQkjIwlQxZlldmVkZSBwb8WZYWRvdsOpIMSNw61zbG8gbmEgxI3DrXNsbyBwxZllZHN0YXZ1asOtY8OtIMSNw61zZWxub3UgcG96aWNpIHTDvWRuZSB2IHJvY2UuDQpXT1JLREFZCQkJPSBXT1JLREFZCQkjIwlWcsOhdMOtIHBvxZlhZG92w6kgxI3DrXNsbyBkYXRhIHDFmWVkIG5lYm8gcG8gemFkYW7DqW0gcG/EjXR1IHByYWNvdm7DrWNoIGRuw60uDQpZRUFSCQkJPSBST0sJCQkjIwlQxZlldmVkZSBwb8WZYWRvdsOpIMSNw61zbG8gbmEgcm9rLg0KWUVBUkZSQUMJCT0gWUVBUkZSQUMJCSMjCVZyw6F0w60gxI3DoXN0IHJva3Ugdnlqw6FkxZllbm91IHpsb21rZW0gYSBwxZllZHN0YXZ1asOtY8OtIHBvxI1ldCBjZWzDvWNoIGRuw60gbWV6aSBwb8SNw6F0ZcSNbsOtbSBhIGtvbmNvdsO9bSBkYXRlbS4NCg0KDQojIw0KIyMJRW5naW5lZXJpbmcgZnVuY3Rpb25zCQkJSW7FvmVuw71yc2vDqSBmdW5rY2UgKFRlY2huaWNrw6kgZnVua2NlKQ0KIyMNCkJFU1NFTEkJCQk9IEJFU1NFTEkJCSMjCVZyw6F0w60gbW9kaWZpa292YW5vdSBCZXNzZWxvdnUgZnVua2NpIEluKHgpLg0KQkVTU0VMSgkJCT0gQkVTU0VMSgkJIyMJVnLDoXTDrSBtb2RpZmlrb3Zhbm91IEJlc3NlbG92dSBmdW5rY2kgSm4oeCkuDQpCRVNTRUxLCQkJPSBCRVNTRUxLCQkjIwlWcsOhdMOtIG1vZGlmaWtvdmFub3UgQmVzc2Vsb3Z1IGZ1bmtjaSBLbih4KS4NCkJFU1NFTFkJCQk9IEJFU1NFTFkJCSMjCVZyw6F0w60gQmVzc2Vsb3Z1IGZ1bmtjaSBZbih4KS4NCkJJTjJERUMJCQk9IEJJTjJERUMJCSMjCVDFmWV2ZWRlIGJpbsOhcm7DrSDEjcOtc2xvIG5hIGRlc8OtdGtvdsOpLg0KQklOMkhFWAkJCT0gQklOMkhFWAkJIyMJUMWZZXZlZGUgYmluw6FybsOtIMSNw61zbG8gbmEgxaFlc3Ruw6FjdGtvdsOpLg0KQklOMk9DVAkJCT0gQklOMk9DVAkJIyMJUMWZZXZlZGUgYmluw6FybsOtIMSNw61zbG8gbmEgb3NtacSNa292w6kuDQpDT01QTEVYCQkJPSBDT01QTEVYCQkjIwlQxZlldmVkZSByZcOhbG5vdSBhIGltYWdpbsOhcm7DrSDEjcOhc3QgbmEga29tcGxleG7DrSDEjcOtc2xvLg0KQ09OVkVSVAkJCT0gQ09OVkVSVAkJIyMJUMWZZXZlZGUgxI3DrXNsbyBkbyBqaW7DqWhvIGplZG5vdGtvdsOpaG8gbcSbcm7DqWhvIHN5c3TDqW11Lg0KREVDMkJJTgkJCT0gREVDMkJJTgkJIyMJUMWZZXZlZGUgZGVzw610a292w6lobyDEjcOtc2xhIG5hIGR2b2prb3bDqQ0KREVDMkhFWAkJCT0gREVDMkhFWAkJIyMJUMWZZXZlZGUgZGVzw610a292w6kgxI3DrXNsbyBuYSDFoWVzdG7DoWN0a292w6kuDQpERUMyT0NUCQkJPSBERUMyT0NUCQkjIwlQxZlldmVkZSBkZXPDrXRrb3bDqSDEjcOtc2xvIG5hIG9zbWnEjWtvdsOpLg0KREVMVEEJCQk9IERFTFRBCQkJIyMJVGVzdHVqZSByb3Zub3N0IGR2b3UgaG9kbm90Lg0KRVJGCQkJPSBFUkYJCQkjIwlWcsOhdMOtIGNoeWJvdm91IGZ1bmtjaS4NCkVSRkMJCQk9IEVSRkMJCQkjIwlWcsOhdMOtIGRvcGzFiGtvdm91IGNoeWJvdm91IGZ1bmtjaS4NCkdFU1RFUAkJCT0gR0VTVEVQCQkjIwlUZXN0dWplLCB6ZGEgamUgxI3DrXNsbyB2xJt0xaHDrSBuZcW+IG1lem7DrSBob2Rub3RhLg0KSEVYMkJJTgkJCT0gSEVYMkJJTgkJIyMJUMWZZXZlZGUgxaFlc3Ruw6FjdGtvdsOpIMSNw61zbG8gbmEgYmluw6FybsOtLg0KSEVYMkRFQwkJCT0gSEVYMkRFQwkJIyMJUMWZZXZlZGUgxaFlc3Ruw6FjdGtvdsOpIMSNw61zbG8gbmEgZGVzw610a292w6kuDQpIRVgyT0NUCQkJPSBIRVgyT0NUCQkjIwlQxZlldmVkZSDFoWVzdG7DoWN0a292w6kgxI3DrXNsbyBuYSBvc21pxI1rb3bDqS4NCklNQUJTCQkJPSBJTUFCUwkJCSMjCVZyw6F0w60gYWJzb2x1dG7DrSBob2Rub3R1IChtb2R1bCkga29tcGxleG7DrWhvIMSNw61zbGEuDQpJTUFHSU5BUlkJCT0gSU1BR0lOQVJZCQkjIwlWcsOhdMOtIGltYWdpbsOhcm7DrSDEjcOhc3Qga29tcGxleG7DrWhvIMSNw61zbGEuDQpJTUFSR1VNRU5UCQk9IElNQVJHVU1FTlQJCSMjCVZyw6F0w60gYXJndW1lbnQgdGjDqXRhLCDDumhlbCB2eWrDoWTFmWVuw70gdiByYWRpw6FuZWNoLg0KSU1DT05KVUdBVEUJCT0gSU1DT05KVUdBVEUJCSMjCVZyw6F0w60ga29tcGxleG7EmyBzZHJ1xb5lbsOpIMSNw61zbG8ga2Uga29tcGxleG7DrW11IMSNw61zbHUuDQpJTUNPUwkJCT0gSU1DT1MJCQkjIwlWcsOhdMOtIGtvc2ludXMga29tcGxleG7DrWhvIMSNw61zbGEuDQpJTURJVgkJCT0gSU1ESVYJCQkjIwlWcsOhdMOtIHBvZMOtbCBkdm91IGtvbXBsZXhuw61jaCDEjcOtc2VsLg0KSU1FWFAJCQk9IElNRVhQCQkJIyMJVnLDoXTDrSBleHBvbmVuY2nDoWxuw60gdHZhciBrb21wbGV4bsOtaG8gxI3DrXNsYS4NCklNTE4JCQk9IElNTE4JCQkjIwlWcsOhdMOtIHDFmWlyb3plbsO9IGxvZ2FyaXRtdXMga29tcGxleG7DrWhvIMSNw61zbGEuDQpJTUxPRzEwCQkJPSBJTUxPRzEwCQkjIwlWcsOhdMOtIGRla2FkaWNrw70gbG9nYXJpdG11cyBrb21wbGV4bsOtaG8gxI3DrXNsYS4NCklNTE9HMgkJCT0gSU1MT0cyCQkjIwlWcsOhdMOtIGxvZ2FyaXRtdXMga29tcGxleG7DrWhvIMSNw61zbGEgcMWZaSB6w6FrbGFkdSAyLg0KSU1QT1dFUgkJCT0gSU1QT1dFUgkJIyMJVnLDoXTDrSBrb21wbGV4bsOtIMSNw61zbG8gdW1vY27Em27DqSBuYSBjZWzDqSDEjcOtc2xvLg0KSU1QUk9EVUNUCQk9IElNUFJPRFVDVAkJIyMJVnLDoXTDrSBzb3XEjWluIGtvbXBsZXhuw61jaCDEjcOtc2VsLg0KSU1SRUFMCQkJPSBJTVJFQUwJCSMjCVZyw6F0w60gcmXDoWxub3UgxI3DoXN0IGtvbXBsZXhuw61obyDEjcOtc2xhLg0KSU1TSU4JCQk9IElNU0lOCQkJIyMJVnLDoXTDrSBzaW51cyBrb21wbGV4bsOtaG8gxI3DrXNsYS4NCklNU1FSVAkJCT0gSU1TUVJUCQkjIwlWcsOhdMOtIGRydWhvdSBvZG1vY25pbnUga29tcGxleG7DrWhvIMSNw61zbGEuDQpJTVNVQgkJCT0gSU1TVUIJCQkjIwlWcsOhdMOtIHJvemTDrWwgbWV6aSBkdsSbbWEga29tcGxleG7DrW1pIMSNw61zbHkuDQpJTVNVTQkJCT0gSU1TVU0JCQkjIwlWcsOhdMOtIHNvdcSNZXQgZHZvdSBrb21wbGV4bsOtY2ggxI3DrXNlbC4NCk9DVDJCSU4JCQk9IE9DVDJCSU4JCSMjCVDFmWV2ZWRlIG9zbWnEjWtvdsOpIMSNw61zbG8gbmEgYmluw6FybsOtLg0KT0NUMkRFQwkJCT0gT0NUMkRFQwkJIyMJUMWZZXZlZGUgb3NtacSNa292w6kgxI3DrXNsbyBuYSBkZXPDrXRrb3bDqS4NCk9DVDJIRVgJCQk9IE9DVDJIRVgJCSMjCVDFmWV2ZWRlIG9zbWnEjWtvdsOpIMSNw61zbG8gbmEgxaFlc3Ruw6FjdGtvdsOpLg0KDQoNCiMjDQojIwlGaW5hbmNpYWwgZnVuY3Rpb25zCQkJRmluYW7EjW7DrSBmdW5rY2UNCiMjDQpBQ0NSSU5UCQkJPSBBQ0NSSU5UCQkjIwlWcsOhdMOtIG5haHJvbWFkxJtuw70gw7pyb2sgeiBjZW5uw6lobyBwYXDDrXJ1LCB6ZSBrdGVyw6lobyBqZSDDunJvayBwbGFjZW4gdiBwcmF2aWRlbG7DvWNoIHRlcm3DrW5lY2guDQpBQ0NSSU5UTQkJPSBBQ0NSSU5UTQkJIyMJVnLDoXTDrSBuYWhyb21hZMSbbsO9IMO6cm9rIHogY2VubsOpaG8gcGFww61ydSwgemUga3RlcsOpaG8gamUgw7pyb2sgcGxhY2VuIGsgZGF0dSBzcGxhdG5vc3RpLg0KQU1PUkRFR1JDCQk9IEFNT1JERUdSQwkJIyMJVnLDoXTDrSBsaW5lw6FybsOtIGFtb3J0aXphY2kgdiBrYcW+ZMOpbSDDusSNZXRuw61tIG9iZG9iw60gcG9tb2PDrSBrb2VmaWNpZW50dSBhbW9ydGl6YWNlLg0KQU1PUkxJTkMJCT0gQU1PUkxJTkMJCSMjCVZyw6F0w60gbGluZcOhcm7DrSBhbW9ydGl6YWNpIHYga2HFvmTDqW0gw7rEjWV0bsOtbSBvYmRvYsOtLg0KQ09VUERBWUJTCQk9IENPVVBEQVlCUwkJIyMJVnLDoXTDrSBwb8SNZXQgZG7FryBvZCB6YcSNw6F0a3Ugb2Jkb2LDrSBwbGFjZW7DrSBrdXDDs27FryBkbyBkYXRhIHNwbGF0bm9zdGkuDQpDT1VQREFZUwkJPSBDT1VQREFZUwkJIyMJVnLDoXTDrSBwb8SNZXQgZG7FryB2IG9iZG9iw60gcGxhY2Vuw60ga3Vww7Nuxa8sIGt0ZXLDqSBvYnNhaHVqZSBkZW4gesO6xI10b3bDoW7DrS4NCkNPVVBEQVlTTkMJCT0gQ09VUERBWVNOQwkJIyMJVnLDoXTDrSBwb8SNZXQgZG7FryBvZCBkYXRhIHrDusSNdG92w6Fuw60gZG8gbsOhc2xlZHVqw61jw61obyBkYXRhIHBsYWNlbsOtIGt1cMOzbnUuDQpDT1VQTkNECQkJPSBDT1VQTkNECQkjIwlWcsOhdMOtIG7DoXNsZWR1asOtY8OtIGRhdHVtIHBsYWNlbsOtIGt1cMOzbnUgcG8gZGF0dSB6w7rEjXRvdsOhbsOtLg0KQ09VUE5VTQkJCT0gQ09VUE5VTQkJIyMJVnLDoXTDrSBwb8SNZXQga3Vww7Nuxa8gc3BsYXRuw71jaCBtZXppIGRhdGVtIHrDusSNdG92w6Fuw60gYSBkYXRlbSBzcGxhdG5vc3RpLg0KQ09VUFBDRAkJCT0gQ09VUFBDRAkJIyMJVnLDoXTDrSBwxZllZGNob3rDrSBkYXR1bSBwbGFjZW7DrSBrdXDDs251IHDFmWVkIGRhdGVtIHrDusSNdG92w6Fuw60uDQpDVU1JUE1UCQkJPSBDVU1JUE1UCQkjIwlWcsOhdMOtIGt1bXVsYXRpdm7DrSDDunJvayBzcGxhY2Vuw70gbWV6aSBkdsSbbWEgb2Jkb2LDrW1pLg0KQ1VNUFJJTkMJCT0gQ1VNUFJJTkMJCSMjCVZyw6F0w60ga3VtdWxhdGl2bsOtIGppc3RpbnUgc3BsYWNlbm91IG1lemkgZHbEm21hIG9iZG9iw61taSBwxa9qxI1reS4NCkRCCQkJPSBPRFBJUy5aUllDSAkJIyMJVnLDoXTDrSBvZHBpcyBha3RpdmEgemEgdXLEjWl0w6kgb2Jkb2LDrSBwb21vY8OtIGRlZ3Jlc2l2bsOtIG1ldG9keSBvZHBpc3UgcyBwZXZuw71tIHrFr3N0YXRrZW0uDQpEREIJCQk9IE9EUElTLlpSWUNIMgkJIyMJVnLDoXTDrSBvZHBpcyBha3RpdmEgemEgdXLEjWl0w6kgb2Jkb2LDrSBwb21vY8OtIGR2b2ppdMOpIGRlZ3Jlc2l2bsOtIG1ldG9keSBvZHBpc3UgbmVibyBqaW7DqSBtZXRvZHksIGt0ZXJvdSB6YWTDoXRlLg0KRElTQwkJCT0gRElTQwkJCSMjCVZyw6F0w60gZGlza29udG7DrSBzYXpidSBjZW5uw6lobyBwYXDDrXJ1Lg0KRE9MTEFSREUJCT0gRE9MTEFSREUJCSMjCVDFmWV2ZWRlIMSNw6FzdGt1IHYga29ydW7DoWNoIHZ5asOhZMWZZW5vdSB6bG9ta2VtIG5hIMSNw6FzdGt1IHYga29ydW7DoWNoIHZ5asOhZMWZZW5vdSBkZXNldGlubsO9bSDEjcOtc2xlbS4NCkRPTExBUkZSCQk9IERPTExBUkZSCQkjIwlQxZlldmVkZSDEjcOhc3RrdSB2IGtvcnVuw6FjaCB2eWrDoWTFmWVub3UgZGVzZXRpbm7DvW0gxI3DrXNsZW0gbmEgxI3DoXN0a3UgdiBrb3J1bsOhY2ggdnlqw6FkxZllbm91IHpsb21rZW0uDQpEVVJBVElPTgkJPSBEVVJBVElPTgkJIyMJVnLDoXTDrSByb8SNbsOtIGRvYnUgY2VubsOpaG8gcGFww61ydSBzIHByYXZpZGVsbsO9bWkgw7pyb2tvdsO9bWkgc2F6YmFtaS4NCkVGRkVDVAkJCT0gRUZGRUNUCQkjIwlWcsOhdMOtIGVmZWt0aXZuw60gcm/EjW7DrSDDunJva292b3Ugc2F6YnUuDQpGVgkJCT0gQlVESE9ETk9UQQkJIyMJVnLDoXTDrSBidWRvdWPDrSBob2Rub3R1IGludmVzdGljZS4NCkZWU0NIRURVTEUJCT0gRlZTQ0hFRFVMRQkJIyMJVnLDoXTDrSBidWRvdWPDrSBob2Rub3R1IHBvxI3DoXRlxI1uw60gamlzdGlueSBwbyBwb3XFvml0w60gc8OpcmllIHNhemViIHNsb8W+aXTDqWhvIMO6cm9rdS4NCklOVFJBVEUJCQk9IElOVFJBVEUJCSMjCVZyw6F0w60gw7pyb2tvdm91IHNhemJ1IHBsbsSbIGludmVzdG92YW7DqWhvIGNlbm7DqWhvIHBhcMOtcnUuDQpJUE1UCQkJPSBQTEFUQkEuw5pST0sJCSMjCVZyw6F0w60gdsO9xaFrdSDDunJva3UgaW52ZXN0aWNlIHphIGRhbsOpIG9iZG9iw60uDQpJUlIJCQk9IE3DjVJBLlbDnU5PU05PU1RJCSMjCVZyw6F0w60gdm5pdMWZbsOtIHbDvW5vc292w6kgcHJvY2VudG8gc8OpcmllIHBlbsSbxb5uw61jaCB0b2vFry4NCklTUE1UCQkJPSBJU1BNVAkJCSMjCVZ5cG/EjXRlIHbDvcWhaSDDunJva3UgeiBpbnZlc3RpY2UgemFwbGFjZW7DqWhvIGLEm2hlbSB1csSNaXTDqWhvIG9iZG9iw60uDQpNRFVSQVRJT04JCT0gTURVUkFUSU9OCQkjIwlWcsOhdMOtIE1hY2F1bGV5aG8gbW9kaWZpa292YW5vdSBkb2J1IGNlbm7DqWhvIHBhcMOtcnUgbyBub21pbsOhbG7DrSBob2Rub3TEmyAxMDAgS8SNLg0KTUlSUgkJCT0gTU9ELk3DjVJBLlbDnU5PU05PU1RJCSMjCVZyw6F0w60gdm5pdMWZbsOtIHNhemJ1IHbDvW5vc3UsIHDFmWnEjWVtxb4ga2xhZG7DqSBhIHrDoXBvcm7DqSBob2Rub3R5IHBlbsSbxb5uw61jaCBwcm9zdMWZZWRrxa8ganNvdSBmaW5hbmNvdsOhbnkgcG9kbGUgcsWvem7DvWNoIHNhemViLg0KTk9NSU5BTAkJCT0gTk9NSU5BTAkJIyMJVnLDoXTDrSBub21pbsOhbG7DrSByb8SNbsOtIMO6cm9rb3ZvdSBzYXpidS4NCk5QRVIJCQk9IFBPxIxFVC5PQkRPQsONCQkjIwlWcsOhdMOtIHBvxI1ldCBvYmRvYsOtIHBybyBpbnZlc3RpY2kuDQpOUFYJCQk9IMSMSVNUw4EuU09VxIxIT0ROT1RBCSMjCVZyw6F0w60gxI1pc3RvdSBzb3XEjWFzbm91IGhvZG5vdHUgaW52ZXN0aWNlIHZ5cG/EjcOtdGFub3UgbmEgesOha2xhZMSbIHPDqXJpZSBwcmF2aWRlbG7DvWNoIHBlbsSbxb5uw61jaCB0b2vFryBhIGRpc2tvbnRuw60gc2F6YnkuDQpPRERGUFJJQ0UJCT0gT0RERlBSSUNFCQkjIwlWcsOhdMOtIGNlbnUgY2VubsOpaG8gcGFww61ydSBvIG5vbWluw6FsbsOtIGhvZG5vdMSbIDEwMCBLxI0gcyBvZGxpxaFuw71tIHBydm7DrW0gb2Jkb2LDrW0uDQpPRERGWUlFTEQJCT0gT0RERllJRUxECQkjIwlWcsOhdMOtIHbDvW5vcyBjZW5uw6lobyBwYXDDrXJ1IHMgb2RsacWhbsO9bSBwcnZuw61tIG9iZG9iw61tLg0KT0RETFBSSUNFCQk9IE9ERExQUklDRQkJIyMJVnLDoXTDrSBjZW51IGNlbm7DqWhvIHBhcMOtcnUgbyBub21pbsOhbG7DrSBob2Rub3TEmyAxMDAgS8SNIHMgb2RsacWhbsO9bSBwb3NsZWRuw61tIG9iZG9iw61tLg0KT0RETFlJRUxECQk9IE9ERExZSUVMRAkJIyMJVnLDoXTDrSB2w71ub3MgY2VubsOpaG8gcGFww61ydSBzIG9kbGnFoW7DvW0gcG9zbGVkbsOtbSBvYmRvYsOtbS4NClBNVAkJCT0gUExBVEJBCQkjIwlWcsOhdMOtIGhvZG5vdHUgcHJhdmlkZWxuw6kgc3Bsw6F0a3kgYW51aXR5Lg0KUFBNVAkJCT0gUExBVEJBLlrDgUtMQUQJCSMjCVZyw6F0w60gaG9kbm90dSBzcGzDoXRreSBqaXN0aW55IHBybyB6YWRhbm91IGludmVzdGljaSB6YSBkYW7DqSBvYmRvYsOtLg0KUFJJQ0UJCQk9IFBSSUNFCQkJIyMJVnLDoXTDrSBjZW51IGNlbm7DqWhvIHBhcMOtcnUgbyBub21pbsOhbG7DrSBob2Rub3TEmyAxMDAgS8SNLCB6ZSBrdGVyw6lobyBqZSDDunJvayBwbGFjZW4gdiBwcmF2aWRlbG7DvWNoIHRlcm3DrW5lY2guDQpQUklDRURJU0MJCT0gUFJJQ0VESVNDCQkjIwlWcsOhdMOtIGNlbnUgZGlza29udG7DrWhvIGNlbm7DqWhvIHBhcMOtcnUgbyBub21pbsOhbG7DrSBob2Rub3TEmyAxMDAgS8SNLg0KUFJJQ0VNQVQJCT0gUFJJQ0VNQVQJCSMjCVZyw6F0w60gY2VudSBjZW5uw6lobyBwYXDDrXJ1IG8gbm9taW7DoWxuw60gaG9kbm90xJsgMTAwIEvEjSwgemUga3RlcsOpaG8gamUgw7pyb2sgcGxhY2VuIGsgZGF0dSBzcGxhdG5vc3RpLg0KUFYJCQk9IFNPVcSMSE9ETk9UQQkJIyMJVnLDoXTDrSBzb3XEjWFzbm91IGhvZG5vdHUgaW52ZXN0aWNlLg0KUkFURQkJCT0gw5pST0tPVsOBLk3DjVJBCQkjIwlWcsOhdMOtIMO6cm9rb3ZvdSBzYXpidSB2enRhxb5lbm91IG5hIG9iZG9iw60gYW51aXR5Lg0KUkVDRUlWRUQJCT0gUkVDRUlWRUQJCSMjCVZyw6F0w60gxI3DoXN0a3Ugb2JkcsW+ZW5vdSBrIGRhdHUgc3BsYXRub3N0aSBwbG7EmyBpbnZlc3RvdmFuw6lobyBjZW5uw6lobyBwYXDDrXJ1Lg0KU0xOCQkJPSBPRFBJUy5MSU4JCSMjCVZyw6F0w60gcMWZw61tw6kgb2RwaXN5IGFrdGl2YSBwcm8gamVkbm8gb2Jkb2LDrS4NClNZRAkJCT0gT0RQSVMuTkVMSU4JCSMjCVZyw6F0w60gc23Em3Juw6kgxI3DrXNsbyByb8SNbsOtY2ggb2RwaXPFryBha3RpdmEgcHJvIHphZGFuw6kgb2Jkb2LDrS4NClRCSUxMRVEJCQk9IFRCSUxMRVEJCSMjCVZyw6F0w60gdsO9bm9zIHNtxJtua3kgc3TDoXRuw60gcG9rbGFkbnkgZWt2aXZhbGVudG7DrSB2w71ub3N1IG9ibGlnYWNlLg0KVEJJTExQUklDRQkJPSBUQklMTFBSSUNFCQkjIwlWcsOhdMOtIGNlbnUgc23Em25reSBzdMOhdG7DrSBwb2tsYWRueSBvIG5vbWluw6FsbsOtIGhvZG5vdMSbIDEwMCBLxI0uDQpUQklMTFlJRUxECQk9IFRCSUxMWUlFTEQJCSMjCVZyw6F0w60gdsO9bm9zIHNtxJtua3kgc3TDoXRuw60gcG9rbGFkbnkuDQpWREIJCQk9IE9EUElTLlpBLklOVAkJIyMJVnLDoXTDrSBvZHBpcyBha3RpdmEgcHJvIHVyxI1pdMOpIG9iZG9iw60gbmVibyDEjcOhc3Qgb2Jkb2LDrSBwb21vY8OtIGRlZ3Jlc2l2bsOtIG1ldG9keSBvZHBpc3UuDQpYSVJSCQkJPSBYSVJSCQkJIyMJVnLDoXTDrSB2bml0xZluw60gdsO9bm9zbm9zdCBwcm8gaGFybW9ub2dyYW0gcGVuxJvFvm7DrWNoIHRva8WvLCBrdGVyw70gbmVtdXPDrSBiw710IG51dG7EmyBwZXJpb2RpY2vDvS4NClhOUFYJCQk9IFhOUFYJCQkjIwlWcsOhdMOtIMSNaXN0b3Ugc291xI1hc25vdSBob2Rub3R1IHBybyBoYXJtb25vZ3JhbSBwZW7Em8W+bsOtY2ggdG9rxa8sIGt0ZXLDvSBuZW11c8OtIGLDvXQgbnV0bsSbIHBlcmlvZGlja8O9Lg0KWUlFTEQJCQk9IFlJRUxECQkJIyMJVnLDoXTDrSB2w71ub3MgY2VubsOpaG8gcGFww61ydSwgemUga3RlcsOpaG8gamUgw7pyb2sgcGxhY2VuIHYgcHJhdmlkZWxuw71jaCB0ZXJtw61uZWNoLg0KWUlFTERESVNDCQk9IFlJRUxERElTQwkJIyMJVnLDoXTDrSByb8SNbsOtIHbDvW5vcyBkaXNrb250bsOtaG8gY2VubsOpaG8gcGFww61ydSwgbmFwxZnDrWtsYWQgc23Em25reSBzdMOhdG7DrSBwb2tsYWRueS4NCllJRUxETUFUCQk9IFlJRUxETUFUCQkjIwlWcsOhdMOtIHJvxI1uw60gdsO9bm9zIGNlbm7DqWhvIHBhcMOtcnUsIHplIGt0ZXLDqWhvIGplIMO6cm9rIHBsYWNlbiBrIGRhdHUgc3BsYXRub3N0aS4NCg0KDQojIw0KIyMJSW5mb3JtYXRpb24gZnVuY3Rpb25zCQkJSW5mb3JtYcSNbsOtIGZ1bmtjZQ0KIyMNCkNFTEwJCQk9IFBPTMONxIxLTwkJIyMJVnLDoXTDrSBpbmZvcm1hY2UgbyBmb3Jtw6F0b3bDoW7DrSwgdW3DrXN0xJtuw60gbmVibyBvYnNhaHUgYnXFiGt5Lg0KRVJST1IuVFlQRQkJPSBDSFlCQS5UWVAJCSMjCVZyw6F0w60gxI3DrXNsbyBvZHBvdsOtZGFqw61jw60gdHlwdSBjaHlieS4NCklORk8JCQk9IE8uUFJPU1TFmEVEw40JCSMjCVZyw6F0w60gaW5mb3JtYWNlIG8gYWt0dcOhbG7DrW0gcHJhY292bsOtbSBwcm9zdMWZZWTDrS4NCklTQkxBTksJCQk9IEpFLlBSw4FaRE7DiQkJIyMJVnLDoXTDrSBob2Rub3R1IFBSQVZEQSwgcG9rdWQgc2UgYXJndW1lbnQgaG9kbm90YSBvZGthenVqZSBuYSBwcsOhemRub3UgYnXFiGt1Lg0KSVNFUlIJCQk9IEpFLkNIWUJBCQkjIwlWcsOhdMOtIGhvZG5vdHUgUFJBVkRBLCBwb2t1ZCBqZSBhcmd1bWVudCBob2Rub3RhIGxpYm92b2xuw6EgY2h5Ym92w6EgaG9kbm90YSAoa3JvbcSbICNOL0EpLg0KSVNFUlJPUgkJCT0gSkUuQ0hZQkhPRE4JCSMjCVZyw6F0w60gaG9kbm90dSBQUkFWREEsIHBva3VkIGplIGFyZ3VtZW50IGhvZG5vdGEgbGlib3ZvbG7DoSBjaHlib3bDoSBob2Rub3RhLg0KSVNFVkVOCQkJPSBJU0VWRU4JCSMjCVZyw6F0w60gaG9kbm90dSBQUkFWREEsIHBva3VkIGplIMSNw61zbG8gc3Vkw6kuDQpJU0xPR0lDQUwJCT0gSkUuTE9HSE9ETgkJIyMJVnLDoXTDrSBob2Rub3R1IFBSQVZEQSwgcG9rdWQgamUgYXJndW1lbnQgaG9kbm90YSBsb2dpY2vDoSBob2Rub3RhLg0KSVNOQQkJCT0gSkUuTkVERUYJCSMjCVZyw6F0w60gaG9kbm90dSBQUkFWREEsIHBva3VkIGplIGFyZ3VtZW50IGhvZG5vdGEgY2h5Ym92w6EgaG9kbm90YSAjTi9BLg0KSVNOT05URVhUCQk9IEpFLk5FVEVYVAkJIyMJVnLDoXTDrSBob2Rub3R1IFBSQVZEQSwgcG9rdWQgYXJndW1lbnQgaG9kbm90YSBuZW7DrSB0ZXh0Lg0KSVNOVU1CRVIJCT0gSkUuxIzDjVNMTwkJIyMJVnLDoXTDrSBob2Rub3R1IFBSQVZEQSwgcG9rdWQgamUgYXJndW1lbnQgaG9kbm90YSDEjcOtc2xvLg0KSVNPREQJCQk9IElTT0RECQkJIyMJVnLDoXTDrSBob2Rub3R1IFBSQVZEQSwgcG9rdWQgamUgxI3DrXNsbyBsaWNow6kuDQpJU1JFRgkJCT0gSkUuT0RLQVoJCSMjCVZyw6F0w60gaG9kbm90dSBQUkFWREEsIHBva3VkIGplIGFyZ3VtZW50IGhvZG5vdGEgb2RrYXouDQpJU1RFWFQJCQk9IEpFLlRFWFQJCSMjCVZyw6F0w60gaG9kbm90dSBQUkFWREEsIHBva3VkIGplIGFyZ3VtZW50IGhvZG5vdGEgdGV4dC4NCk4JCQk9IE4JCQkjIwlWcsOhdMOtIGhvZG5vdHUgcMWZZXZlZGVub3UgbmEgxI3DrXNsby4NCk5BCQkJPSBORURFRgkJCSMjCVZyw6F0w60gY2h5Ym92b3UgaG9kbm90dSAjTi9BLg0KVFlQRQkJCT0gVFlQCQkJIyMJVnLDoXTDrSDEjcOtc2xvIG96bmHEjXVqw61jw60gZGF0b3bDvSB0eXAgaG9kbm90eS4NCg0KDQojIw0KIyMJTG9naWNhbCBmdW5jdGlvbnMJCQlMb2dpY2vDqSBmdW5rY2UNCiMjDQpBTkQJCQk9IEEJCQkjIwlWcsOhdMOtIGhvZG5vdHUgUFJBVkRBLCBtYWrDrS1saSB2xaFlY2hueSBhcmd1bWVudHkgaG9kbm90dSBQUkFWREEuDQpGQUxTRQkJCT0gTkVQUkFWREEJCSMjCVZyw6F0w60gbG9naWNrb3UgaG9kbm90dSBORVBSQVZEQS4NCklGCQkJPSBLRFnFvQkJCSMjCVVyxI3DrSwga3RlcsO9IGxvZ2lja8O9IHRlc3QgbcOhIHByb2LEm2hub3V0Lg0KSUZFUlJPUgkJCT0gSUZFUlJPUgkJIyMJUG9rdWQgamUgdnpvcmVjIHZ5aG9kbm9jZW4gamFrbyBjaHliYSwgdnLDoXTDrSB6YWRhbm91IGhvZG5vdHUuIFYgb3BhxI1uw6ltIHDFmcOtcGFkxJsgdnLDoXTDrSB2w71zbGVkZWsgdnpvcmNlLg0KTk9UCQkJPSBORQkJCSMjCVByb3ZlZGUgbG9naWNrb3UgbmVnYWNpIGFyZ3VtZW50dSBmdW5rY2UuDQpPUgkJCT0gTkVCTwkJCSMjCVZyw6F0w60gaG9kbm90dSBQUkFWREEsIGplLWxpIGFsZXNwb8WIIGplZGVuIGFyZ3VtZW50IHJvdmVuIGhvZG5vdMSbIFBSQVZEQS4NClRSVUUJCQk9IFBSQVZEQQkJIyMJVnLDoXTDrSBsb2dpY2tvdSBob2Rub3R1IFBSQVZEQS4NCg0KDQojIw0KIyMJTG9va3VwIGFuZCByZWZlcmVuY2UgZnVuY3Rpb25zCQlWeWhsZWTDoXZhY8OtIGZ1bmtjZQ0KIyMNCkFERFJFU1MJCQk9IE9ES0FaCQkJIyMJVnLDoXTDrSB0ZXh0b3bDvSBvZGtheiBuYSBqZWRudSBidcWIa3UgbGlzdHUuDQpBUkVBUwkJCT0gUE/EjEVULkJMT0vFrgkJIyMJVnLDoXTDrSBwb8SNZXQgb2JsYXN0w60gdiBvZGthenUuDQpDSE9PU0UJCQk9IFpWT0xJVAkJIyMJWnZvbMOtIGhvZG5vdHUgemUgc2V6bmFtdSBob2Rub3QuDQpDT0xVTU4JCQk9IFNMT1VQRUMJCSMjCVZyw6F0w60gxI3DrXNsbyBzbG91cGNlIG9ka2F6dS4NCkNPTFVNTlMJCQk9IFNMT1VQQ0UJCSMjCVZyw6F0w60gcG/EjWV0IHNsb3VwY8WvIHYgb2RrYXp1Lg0KSExPT0tVUAkJCT0gVlZZSExFREFUCQkjIwlQcm9obGVkw6EgaG9ybsOtIMWZw6FkZWsgbWF0aWNlIGEgdnLDoXTDrSBob2Rub3R1IHVyxI1lbsOpIGJ1xYhreS4NCkhZUEVSTElOSwkJPSBIWVBFUlRFWFRPVsOdLk9ES0FaCSMjCVZ5dHZvxZnDrSB6w6FzdHVwY2UgbmVibyBvZGtheiwga3RlcsO9IG90ZXbFmWUgZG9rdW1lbnQgdWxvxb5lbsO9IG5hIHPDrcWlb3bDqW0gc2VydmVydSwgdiBzw610aSBpbnRyYW5ldCBuZWJvIEludGVybmV0Lg0KSU5ERVgJCQk9IElOREVYCQkJIyMJUG9tb2PDrSByZWpzdMWZw61rdSB6dm9sw60gaG9kbm90dSB6IG9ka2F6dSBuZWJvIG1hdGljZS4NCklORElSRUNUCQk9IE5FUMWYw41Nw50uT0RLQVoJCSMjCVZyw6F0w60gb2RrYXogdXLEjWVuw70gdGV4dG92b3UgaG9kbm90b3UuDQpMT09LVVAJCQk9IFZZSExFREFUCQkjIwlWeWhsZWTDoSBob2Rub3R5IHZlIHZla3RvcnUgbmVibyBtYXRpY2kuDQpNQVRDSAkJCT0gUE9aVllITEVEQVQJCSMjCVZ5aGxlZMOhIGhvZG5vdHkgdiBvZGthenUgbmVibyBtYXRpY2kuDQpPRkZTRVQJCQk9IFBPU1VOCQkJIyMJVnLDoXTDrSBwb3N1biBvZGthenUgb2QgemFkYW7DqWhvIG9ka2F6dS4NClJPVwkJCT0gxZjDgURFSwkJCSMjCVZyw6F0w60gxI3DrXNsbyDFmcOhZGt1IG9ka2F6dS4NClJPV1MJCQk9IMWYw4FES1kJCQkjIwlWcsOhdMOtIHBvxI1ldCDFmcOhZGvFryB2IG9ka2F6dS4NClJURAkJCT0gUlRECQkJIyMJTmHEjXRlIGRhdGEgcmXDoWxuw6lobyDEjWFzdSB6IHByb2dyYW11LCBrdGVyw70gcG9kcG9ydWplIGF1dG9tYXRpemFjaSBtb2RlbHUgQ09NIChBdXRvbWF0aXphY2U6IFpwxa9zb2IgcHLDoWNlIHMgb2JqZWt0eSB1csSNaXTDqSBhcGxpa2FjZSB6IGppbsOpIGFwbGlrYWNlIG5lYm8gbsOhc3Ryb2plIHBybyB2w712b2ouIEF1dG9tYXRpemFjZSAoZMWZw612ZSBuYXrDvXZhbsOhIGF1dG9tYXRpemFjZSBPTEUpIGplIHBvxI3DrXRhxI1vdsO9bSBzdGFuZGFyZGVtIGEgamUgZnVua2PDrSBtb2RlbHUgQ09NIChDb21wb25lbnQgT2JqZWN0IE1vZGVsKS4pLg0KVFJBTlNQT1NFCQk9IFRSQU5TUE9aSUNFCQkjIwlWcsOhdMOtIHRyYW5zcG9ub3Zhbm91IG1hdGljaS4NClZMT09LVVAJCQk9IFNWWUhMRURBVAkJIyMJUHJvaGxlZMOhIHBydm7DrSBzbG91cGVjIG1hdGljZSwgcMWZZXN1bmUga3Vyem9yIHYgxZnDoWRrdSBhIHZyw6F0w60gaG9kbm90dSBidcWIa3kuDQoNCg0KIyMNCiMjCU1hdGggYW5kIHRyaWdvbm9tZXRyeSBmdW5jdGlvbnMJCU1hdGVtYXRpY2vDqSBhIHRyaWdvbm9tZXRyaWNrw6kgZnVua2NlDQojIw0KQUJTCQkJPSBBQlMJCQkjIwlWcsOhdMOtIGFic29sdXRuw60gaG9kbm90dSDEjcOtc2xhLg0KQUNPUwkJCT0gQVJDQ09TCQkjIwlWcsOhdMOtIGFya3Vza29zaW51cyDEjcOtc2xhLg0KQUNPU0gJCQk9IEFSQ0NPU0gJCSMjCVZyw6F0w60gaHlwZXJib2xpY2vDvSBhcmt1c2tvc2ludXMgxI3DrXNsYS4NCkFTSU4JCQk9IEFSQ1NJTgkJIyMJVnLDoXTDrSBhcmt1c3NpbnVzIMSNw61zbGEuDQpBU0lOSAkJCT0gQVJDU0lOSAkJIyMJVnLDoXTDrSBoeXBlcmJvbGlja8O9IGFya3Vzc2ludXMgxI3DrXNsYS4NCkFUQU4JCQk9IEFSQ1RHCQkJIyMJVnLDoXTDrSBhcmt1c3RhbmdlbnMgxI3DrXNsYS4NCkFUQU4yCQkJPSBBUkNURzIJCSMjCVZyw6F0w60gYXJrdXN0YW5nZW5zIHgtb3bDqSBhIHktb3bDqSBzb3XFmWFkbmljZS4NCkFUQU5ICQkJPSBBUkNUR0gJCSMjCVZyw6F0w60gaHlwZXJib2xpY2vDvSBhcmt1c3RhbmdlbnMgxI3DrXNsYS4NCkNFSUxJTkcJCQk9IFpBT0tSLk5BSE9SVQkJIyMJWmFva3JvdWhsw60gxI3DrXNsbyBuYSBuZWpibGnFvsWhw60gY2Vsw6kgxI3DrXNsbyBuZWJvIG5hIG5lamJsacW+xaHDrSBuw6Fzb2JlayB6YWRhbsOpIGhvZG5vdHkuDQpDT01CSU4JCQk9IEtPTUJJTkFDRQkJIyMJVnLDoXTDrSBwb8SNZXQga29tYmluYWPDrSBwcm8gZGFuw70gcG/EjWV0IHBvbG/FvmVrLg0KQ09TCQkJPSBDT1MJCQkjIwlWcsOhdMOtIGtvc2ludXMgxI3DrXNsYS4NCkNPU0gJCQk9IENPU0gJCQkjIwlWcsOhdMOtIGh5cGVyYm9saWNrw70ga29zaW51cyDEjcOtc2xhLg0KREVHUkVFUwkJCT0gREVHUkVFUwkJIyMJUMWZZXZlZGUgcmFkacOhbnkgbmEgc3R1cG7Emy4NCkVWRU4JCQk9IFpBT0tST1VITElULk5BLlNVRMOJCSMjCVphb2tyb3VobMOtIMSNw61zbG8gbmFob3J1IG5hIG5lamJsacW+xaHDrSBjZWzDqSBzdWTDqSDEjcOtc2xvLg0KRVhQCQkJPSBFWFAJCQkjIwlWcsOhdMOtIHrDoWtsYWQgcMWZaXJvemVuw6lobyBsb2dhcml0bXUgZSB1bW9jbsSbbsO9IG5hIHphZGFuw6kgxI3DrXNsby4NCkZBQ1QJCQk9IEZBS1RPUknDgUwJCSMjCVZyw6F0w60gZmFrdG9yacOhbCDEjcOtc2xhLg0KRkFDVERPVUJMRQkJPSBGQUNURE9VQkxFCQkjIwlWcsOhdMOtIGR2b2ppdMO9IGZha3RvcmnDoWwgxI3DrXNsYS4NCkZMT09SCQkJPSBaQU9LUi5ET0zFrgkJIyMJWmFva3JvdWhsw60gxI3DrXNsbyBkb2zFrywgc23Em3JlbSBrIG51bGUuDQpHQ0QJCQk9IEdDRAkJCSMjCVZyw6F0w60gbmVqdsSbdMWhw60gc3BvbGXEjW7DvSBkxJtsaXRlbC4NCklOVAkJCT0gQ0VMw4EuxIzDgVNUCQkjIwlaYW9rcm91aGzDrSDEjcOtc2xvIGRvbMWvIG5hIG5lamJsacW+xaHDrSBjZWzDqSDEjcOtc2xvLg0KTENNCQkJPSBMQ00JCQkjIwlWcsOhdMOtIG5lam1lbsWhw60gc3BvbGXEjW7DvSBuw6Fzb2Jlay4NCkxOCQkJPSBMTgkJCSMjCVZyw6F0w60gcMWZaXJvemVuw70gbG9nYXJpdG11cyDEjcOtc2xhLg0KTE9HCQkJPSBMT0daCQkJIyMJVnLDoXTDrSBsb2dhcml0bXVzIMSNw61zbGEgcMWZaSB6YWRhbsOpbSB6w6FrbGFkdS4NCkxPRzEwCQkJPSBMT0cJCQkjIwlWcsOhdMOtIGRla2FkaWNrw70gbG9nYXJpdG11cyDEjcOtc2xhLg0KTURFVEVSTQkJCT0gREVURVJNSU5BTlQJCSMjCVZyw6F0w60gZGV0ZXJtaW5hbnQgbWF0aWNlLg0KTUlOVkVSU0UJCT0gSU5WRVJaRQkJIyMJVnLDoXTDrSBpbnZlcnpuw60gbWF0aWNpLg0KTU1VTFQJCQk9IFNPVcSMSU4uTUFUSUMJCSMjCVZyw6F0w60gc291xI1pbiBkdm91IG1hdGljLg0KTU9ECQkJPSBNT0QJCQkjIwlWcsOhdMOtIHpieXRlayBwbyBkxJtsZW7DrS4NCk1ST1VORAkJCT0gTVJPVU5ECQkjIwlWcsOhdMOtIMSNw61zbG8gemFva3JvdWhsZW7DqSBuYSBwb8W+YWRvdmFuw70gbsOhc29iZWsuDQpNVUxUSU5PTUlBTAkJPSBNVUxUSU5PTUlBTAkJIyMJVnLDoXTDrSBtbm9ob8SNbGVuIHogbW5vxb5pbnkgxI3DrXNlbC4NCk9ERAkJCT0gWkFPS1JPVUhMSVQuTkEuTElDSMOJCSMjCVphb2tyb3VobMOtIMSNw61zbG8gbmFob3J1IG5hIG5lamJsacW+xaHDrSBjZWzDqSBsaWNow6kgxI3DrXNsby4NClBJCQkJPSBQSQkJCSMjCVZyw6F0w60gaG9kbm90dSDEjcOtc2xhIHDDrS4NClBPV0VSCQkJPSBQT1dFUgkJCSMjCVVtb2Nuw60gxI3DrXNsbyBuYSB6YWRhbm91IG1vY25pbnUuDQpQUk9EVUNUCQkJPSBTT1XEjElOCQkjIwlWeW7DoXNvYsOtIGFyZ3VtZW50eSBmdW5rY2UuDQpRVU9USUVOVAkJPSBRVU9USUVOVAkJIyMJVnLDoXTDrSBjZWxvdSDEjcOhc3QgZMSbbGVuw60uDQpSQURJQU5TCQkJPSBSQURJQU5TCQkjIwlQxZlldmVkZSBzdHVwbsSbIG5hIHJhZGnDoW55Lg0KUkFORAkJCT0gTsOBSMSMw41TTE8JCSMjCVZyw6F0w60gbsOhaG9kbsOpIMSNw61zbG8gbWV6aSAwIGEgMS4NClJBTkRCRVRXRUVOCQk9IFJBTkRCRVRXRUVOCQkjIwlWcsOhdMOtIG7DoWhvZG7DqSDEjcOtc2xvIG1lemkgemFkYW7DvW1pIMSNw61zbHkuDQpST01BTgkJCT0gUk9NQU4JCQkjIwlQxZlldmVkZSBhcmFic2tvdSDEjcOtc2xpY2kgbmEgxZnDrW1za291IHZlIGZvcm3DoXR1IHRleHR1Lg0KUk9VTkQJCQk9IFpBT0tST1VITElUCQkjIwlaYW9rcm91aGzDrSDEjcOtc2xvIG5hIHphZGFuw70gcG/EjWV0IMSNw61zbGljLg0KUk9VTkRET1dOCQk9IFJPVU5ERE9XTgkJIyMJWmFva3JvdWhsw60gxI3DrXNsbyBkb2zFrywgc23Em3JlbSBrIG51bGUuDQpST1VORFVQCQkJPSBST1VORFVQCQkjIwlaYW9rcm91aGzDrSDEjcOtc2xvIG5haG9ydSwgc23Em3JlbSBvZCBudWx5Lg0KU0VSSUVTU1VNCQk9IFNFUklFU1NVTQkJIyMJVnLDoXTDrSBzb3XEjWV0IG1vY25pbm7DqSDFmWFkeSB1csSNZW7DqSBwb2RsZSB2em9yY2UuDQpTSUdOCQkJPSBTSUdOCQkJIyMJVnLDoXTDrSB6bmFtw6lua28gxI3DrXNsYS4NClNJTgkJCT0gU0lOCQkJIyMJVnLDoXTDrSBzaW51cyBkYW7DqWhvIMO6aGx1Lg0KU0lOSAkJCT0gU0lOSAkJCSMjCVZyw6F0w60gaHlwZXJib2xpY2vDvSBzaW51cyDEjcOtc2xhLg0KU1FSVAkJCT0gT0RNT0NOSU5BCQkjIwlWcsOhdMOtIGtsYWRub3UgZHJ1aG91IG9kbW9jbmludS4NClNRUlRQSQkJCT0gU1FSVFBJCQkjIwlWcsOhdMOtIGRydWhvdSBvZG1vY25pbnUgdsO9cmF6dSAoxI3DrXNsbyAqIHDDrSkuDQpTVUJUT1RBTAkJPSBTVUJUT1RBTAkJIyMJVnLDoXTDrSBzb3Vocm4gdiBzZXpuYW11IG5lYm8gZGF0YWLDoXppLg0KU1VNCQkJPSBTVU1BCQkJIyMJU2XEjXRlIGFyZ3VtZW50eSBmdW5rY2UuDQpTVU1JRgkJCT0gU1VNSUYJCQkjIwlTZcSNdGUgYnXFiGt5IHZ5YnJhbsOpIHBvZGxlIHphZGFuw71jaCBrcml0w6lyacOtLg0KU1VNSUZTCQkJPSBTVU1JRlMJCSMjCVNlxI10ZSBidcWIa3kgdXLEjWVuw6kgdsOtY2UgemFkYW7DvW1pIHBvZG3DrW5rYW1pLg0KU1VNUFJPRFVDVAkJPSBTT1XEjElOLlNLQUzDgVJOw40JIyMJVnLDoXTDrSBzb3XEjWV0IHNvdcSNaW7FryBvZHBvdsOtZGFqw61jw61jaCBwcnZrxa8gbWF0aWMuDQpTVU1TUQkJCT0gU1VNQS7EjFRWRVJDxa4JCSMjCVZyw6F0w60gc291xI1ldCDEjXR2ZXJjxa8gYXJndW1lbnTFry4NClNVTVgyTVkyCQk9IFNVTVgyTVkyCQkjIwlWcsOhdMOtIHNvdcSNZXQgcm96ZMOtbHUgxI10dmVyY8WvIG9kcG92w61kYWrDrWPDrWNoIGhvZG5vdCB2ZSBkdm91IG1hdGljw61jaC4NClNVTVgyUFkyCQk9IFNVTVgyUFkyCQkjIwlWcsOhdMOtIHNvdcSNZXQgc291xI10dSDEjXR2ZXJjxa8gb2Rwb3bDrWRhasOtY8OtY2ggaG9kbm90IHZlIGR2b3UgbWF0aWPDrWNoLg0KU1VNWE1ZMgkJCT0gU1VNWE1ZMgkJIyMJVnLDoXTDrSBzb3XEjWV0IMSNdHZlcmPFryByb3pkw61sxa8gb2Rwb3bDrWRhasOtY8OtY2ggaG9kbm90IHZlIGR2b3UgbWF0aWPDrWNoLg0KVEFOCQkJPSBUR1RHCQkJIyMJVnLDoXTDrSB0YW5nZW5zIMSNw61zbGEuDQpUQU5ICQkJPSBUR0gJCQkjIwlWcsOhdMOtIGh5cGVyYm9saWNrw70gdGFuZ2VucyDEjcOtc2xhLg0KVFJVTkMJCQk9IFVTRUtOT1VUCQkjIwlaa3LDoXTDrSDEjcOtc2xvIG5hIGNlbMOpIMSNw61zbG8uDQoNCg0KIyMNCiMjCVN0YXRpc3RpY2FsIGZ1bmN0aW9ucwkJCVN0YXRpc3RpY2vDqSBmdW5rY2UNCiMjDQpBVkVERVYJCQk9IFBSxa5NT0RDSFlMS0EJCSMjCVZyw6F0w60gcHLFr23Em3Jub3UgaG9kbm90dSBhYnNvbHV0bsOtY2ggb2RjaHlsZWsgZGF0b3bDvWNoIGJvZMWvIG9kIGplamljaCBzdMWZZWRuw60gaG9kbm90eS4NCkFWRVJBR0UJCQk9IFBSxa5NxJpSCQkjIwlWcsOhdMOtIHByxa9txJtybm91IGhvZG5vdHUgYXJndW1lbnTFry4NCkFWRVJBR0VBCQk9IEFWRVJBR0VBCQkjIwlWcsOhdMOtIHByxa9txJtybm91IGhvZG5vdHUgYXJndW1lbnTFryB2xI1ldG7EmyDEjcOtc2VsLCB0ZXh0dSBhIGxvZ2lja8O9Y2ggaG9kbm90Lg0KQVZFUkFHRUlGCQk9IEFWRVJBR0VJRgkJIyMJVnLDoXTDrSBwcsWvbcSbcm5vdSBob2Rub3R1IChhcml0bWV0aWNrw70gcHLFr23Em3IpIHbFoWVjaCBidW7Em2sgdiBvYmxhc3RpLCBrdGVyw6kgdnlob3Z1asOtIHDFmcOtc2x1xaFuw6kgcG9kbcOtbmNlLg0KQVZFUkFHRUlGUwkJPSBBVkVSQUdFSUZTCQkjIwlWcsOhdMOtIHByxa9txJtybm91IGhvZG5vdHUgKGFyaXRtZXRpY2vDvSBwcsWvbcSbcikgdsWhZWNoIGJ1bsSbayB2eWhvdnVqw61jw61jaCBuxJtrb2xpa2EgcG9kbcOtbmvDoW0uDQpCRVRBRElTVAkJPSBCRVRBRElTVAkJIyMJVnLDoXTDrSBob2Rub3R1IHNvdcSNdG92w6lobyByb3pkxJtsZW7DrSBiZXRhLg0KQkVUQUlOVgkJCT0gQkVUQUlOVgkJIyMJVnLDoXTDrSBpbnZlcnpuw60gaG9kbm90dSBzb3XEjXRvdsOpaG8gcm96ZMSbbGVuw60gcHJvIHphZGFuw6kgcm96ZMSbbGVuw60gYmV0YS4NCkJJTk9NRElTVAkJPSBCSU5PTURJU1QJCSMjCVZyw6F0w60gaG9kbm90dSBiaW5vbWlja8OpaG8gcm96ZMSbbGVuw60gcHJhdmTEm3BvZG9ibm9zdGkgamVkbm90bGl2w71jaCB2ZWxpxI1pbi4NCkNISURJU1QJCQk9IENISURJU1QJCSMjCVZyw6F0w60gamVkbm9zdHJhbm5vdSBwcmF2ZMSbcG9kb2Jub3N0IHJvemTEm2xlbsOtIGNow60ta3ZhZHLDoXQuDQpDSElJTlYJCQk9IENISUlOVgkJIyMJVnLDoXTDrSBob2Rub3R1IGZ1bmtjZSBpbnZlcnpuw60gayBkaXN0cmlidcSNbsOtIGZ1bmtjaSBqZWRub3N0cmFubsOpIHByYXZkxJtwb2RvYm5vc3RpIHJvemTEm2xlbsOtIGNow60ta3ZhZHLDoXQuDQpDSElURVNUCQkJPSBDSElURVNUCQkjIwlWcsOhdMOtIHRlc3QgbmV6w6F2aXNsb3N0aS4NCkNPTkZJREVOQ0UJCT0gQ09ORklERU5DRQkJIyMJVnLDoXTDrSBpbnRlcnZhbCBzcG9sZWhsaXZvc3RpIHBybyBzdMWZZWRuw60gaG9kbm90dSB6w6FrbGFkbsOtaG8gc291Ym9ydS4NCkNPUlJFTAkJCT0gQ09SUkVMCQkjIwlWcsOhdMOtIGtvcmVsYcSNbsOtIGtvZWZpY2llbnQgbWV6aSBkdsSbbWEgbW5vxb5pbmFtaSBkYXQuDQpDT1VOVAkJCT0gUE/EjEVUCQkJIyMJVnLDoXTDrSBwb8SNZXQgxI3DrXNlbCB2IHNlem5hbXUgYXJndW1lbnTFry4NCkNPVU5UQQkJCT0gUE/EjEVUMgkJIyMJVnLDoXTDrSBwb8SNZXQgaG9kbm90IHYgc2V6bmFtdSBhcmd1bWVudMWvLg0KQ09VTlRCTEFOSwkJPSBDT1VOVEJMQU5LCQkjIwlTcG/EjcOtdMOhIHBvxI1ldCBwcsOhemRuw71jaCBidW7Em2sgdiBvYmxhc3RpLg0KQ09VTlRJRgkJCT0gQ09VTlRJRgkJIyMJU3BvxI3DrXTDoSBidcWIa3kgdiBvYmxhc3RpLCBrdGVyw6kgb2Rwb3bDrWRhasOtIHphZGFuw71tIGtyaXTDqXJpw61tLg0KQ09VTlRJRlMJCT0gQ09VTlRJRlMJCSMjCVNwb8SNw610w6EgYnXFiGt5IHYgb2JsYXN0aSwga3RlcsOpIG9kcG92w61kYWrDrSB2w61jZSBrcml0w6lyacOtbS4NCkNPVkFSCQkJPSBDT1ZBUgkJCSMjCVZyw6F0w60gaG9kbm90dSBrb3ZhcmlhbmNlLCBwcsWvbcSbcm5vdSBob2Rub3R1IHNvdcSNaW7FryBww6Fyb3bDvWNoIG9kY2h5bGVrDQpDUklUQklOT00JCT0gQ1JJVEJJTk9NCQkjIwlWcsOhdMOtIG5lam1lbsWhw60gaG9kbm90dSwgcHJvIGt0ZXJvdSBtw6Egc291xI10b3bDqSBiaW5vbWlja8OpIHJvemTEm2xlbsOtIGhvZG5vdHUgdsSbdMWhw60gbmVibyByb3ZudSBob2Rub3TEmyBrcml0w6lyaWEuDQpERVZTUQkJCT0gREVWU1EJCQkjIwlWcsOhdMOtIHNvdcSNZXQgxI10dmVyY8WvIG9kY2h5bGVrLg0KRVhQT05ESVNUCQk9IEVYUE9ORElTVAkJIyMJVnLDoXTDrSBob2Rub3R1IGV4cG9uZW5jacOhbG7DrWhvIHJvemTEm2xlbsOtLg0KRkRJU1QJCQk9IEZESVNUCQkJIyMJVnLDoXTDrSBob2Rub3R1IHJvemTEm2xlbsOtIHByYXZkxJtwb2RvYm5vc3RpIEYuDQpGSU5WCQkJPSBGSU5WCQkJIyMJVnLDoXTDrSBob2Rub3R1IGludmVyem7DrSBmdW5rY2UgayBkaXN0cmlidcSNbsOtIGZ1bmtjaSByb3pkxJtsZW7DrSBGLg0KRklTSEVSCQkJPSBGSVNIRVIJCSMjCVZyw6F0w60gaG9kbm90dSBGaXNoZXJvdnkgdHJhbnNmb3JtYWNlLg0KRklTSEVSSU5WCQk9IEZJU0hFUklOVgkJIyMJVnLDoXTDrSBob2Rub3R1IGludmVyem7DrSBmdW5rY2UgayBGaXNoZXJvdsSbIHRyYW5zZm9ybWFjaS4NCkZPUkVDQVNUCQk9IEZPUkVDQVNUCQkjIwlWcsOhdMOtIGhvZG5vdHUgbGluZcOhcm7DrWhvIHRyZW5kdS4NCkZSRVFVRU5DWQkJPSDEjEVUTk9TVEkJCSMjCVZyw6F0w60gxI1ldG5vc3Qgcm96ZMSbbGVuw60gamFrbyBzdmlzbG91IG1hdGljaS4NCkZURVNUCQkJPSBGVEVTVAkJCSMjCVZyw6F0w60gdsO9c2xlZGVrIEYtdGVzdHUuDQpHQU1NQURJU1QJCT0gR0FNTUFESVNUCQkjIwlWcsOhdMOtIGhvZG5vdHUgcm96ZMSbbGVuw60gZ2FtYS4NCkdBTU1BSU5WCQk9IEdBTU1BSU5WCQkjIwlWcsOhdMOtIGhvZG5vdHUgaW52ZXJ6bsOtIGZ1bmtjZSBrIGRpc3RyaWJ1xI1uw60gZnVua2NpIHNvdcSNdG92w6lobyByb3pkxJtsZW7DrSBnYW1hLg0KR0FNTUFMTgkJCT0gR0FNTUFMTgkJIyMJVnLDoXTDrSBwxZlpcm96ZW7DvSBsb2dhcml0bXVzIGZ1bmtjZSBnYW1hLCDOkyh4KS4NCkdFT01FQU4JCQk9IEdFT01FQU4JCSMjCVZyw6F0w60gZ2VvbWV0cmlja8O9IHByxa9txJtyLg0KR1JPV1RICQkJPSBMT0dMSU5UUkVORAkJIyMJVnLDoXTDrSBob2Rub3R5IGV4cG9uZW5jacOhbG7DrWhvIHRyZW5kdS4NCkhBUk1FQU4JCQk9IEhBUk1FQU4JCSMjCVZyw6F0w60gaGFybW9uaWNrw70gcHLFr23Em3IuDQpIWVBHRU9NRElTVAkJPSBIWVBHRU9NRElTVAkJIyMJVnLDoXTDrSBob2Rub3R1IGh5cGVyZ2VvbWV0cmlja8OpaG8gcm96ZMSbbGVuw60uDQpJTlRFUkNFUFQJCT0gSU5URVJDRVBUCQkjIwlWcsOhdMOtIMO6c2VrIGxpbmXDoXJuw60gcmVncmVzbsOtIMSNw6FyeS4NCktVUlQJCQk9IEtVUlQJCQkjIwlWcsOhdMOtIGhvZG5vdHUgZXhjZXN1IG1ub8W+aW55IGRhdC4NCkxBUkdFCQkJPSBMQVJHRQkJCSMjCVZyw6F0w60gay10b3UgbmVqdsSbdMWhw60gaG9kbm90dSBtbm/FvmlueSBkYXQuDQpMSU5FU1QJCQk9IExJTlJFR1JFU0UJCSMjCVZyw6F0w60gcGFyYW1ldHJ5IGxpbmXDoXJuw61obyB0cmVuZHUuDQpMT0dFU1QJCQk9IExPR0xJTlJFR1JFU0UJCSMjCVZyw6F0w60gcGFyYW1ldHJ5IGV4cG9uZW5jacOhbG7DrWhvIHRyZW5kdS4NCkxPR0lOVgkJCT0gTE9HSU5WCQkjIwlWcsOhdMOtIGludmVyem7DrSBmdW5rY2kgayBkaXN0cmlidcSNbsOtIGZ1bmtjaSBsb2dhcml0bWlja28tbm9ybcOhbG7DrWhvIHJvemTEm2xlbsOtLg0KTE9HTk9STURJU1QJCT0gTE9HTk9STURJU1QJCSMjCVZyw6F0w60gaG9kbm90dSBzb3XEjXRvdsOpaG8gbG9nYXJpdG1pY2tvLW5vcm3DoWxuw61obyByb3pkxJtsZW7DrS4NCk1BWAkJCT0gTUFYCQkJIyMJVnLDoXTDrSBtYXhpbcOhbG7DrSBob2Rub3R1IHNlem5hbXUgYXJndW1lbnTFry4NCk1BWEEJCQk9IE1BWEEJCQkjIwlWcsOhdMOtIG1heGltw6FsbsOtIGhvZG5vdHUgc2V6bmFtdSBhcmd1bWVudMWvIHbEjWV0bsSbIMSNw61zZWwsIHRleHR1IGEgbG9naWNrw71jaCBob2Rub3QuDQpNRURJQU4JCQk9IE1FRElBTgkJIyMJVnLDoXTDrSBzdMWZZWRuw60gaG9kbm90dSB6YWRhbsO9Y2ggxI3DrXNlbC4NCk1JTgkJCT0gTUlOCQkJIyMJVnLDoXTDrSBtaW5pbcOhbG7DrSBob2Rub3R1IHNlem5hbXUgYXJndW1lbnTFry4NCk1JTkEJCQk9IE1JTkEJCQkjIwlWcsOhdMOtIG5lam1lbsWhw60gaG9kbm90dSB2IHNlem5hbXUgYXJndW1lbnTFryB2xI1ldG7EmyDEjcOtc2VsLCB0ZXh0dSBhIGxvZ2lja8O9Y2ggaG9kbm90Lg0KTU9ERQkJCT0gTU9ERQkJCSMjCVZyw6F0w60gaG9kbm90dSwga3RlcsOhIHNlIHYgbW5vxb5pbsSbIGRhdCB2eXNreXR1amUgbmVqxI1hc3TEm2ppLg0KTkVHQklOT01ESVNUCQk9IE5FR0JJTk9NRElTVAkJIyMJVnLDoXTDrSBob2Rub3R1IG5lZ2F0aXZuw61obyBiaW5vbWlja8OpaG8gcm96ZMSbbGVuw60uDQpOT1JNRElTVAkJPSBOT1JNRElTVAkJIyMJVnLDoXTDrSBob2Rub3R1IG5vcm3DoWxuw61obyBzb3XEjXRvdsOpaG8gcm96ZMSbbGVuw60uDQpOT1JNSU5WCQkJPSBOT1JNSU5WCQkjIwlWcsOhdMOtIGludmVyem7DrSBmdW5rY2kgayBmdW5rY2kgbm9ybcOhbG7DrWhvIHNvdcSNdG92w6lobyByb3pkxJtsZW7DrS4NCk5PUk1TRElTVAkJPSBOT1JNU0RJU1QJCSMjCVZyw6F0w60gaG9kbm90dSBzdGFuZGFyZG7DrWhvIG5vcm3DoWxuw61obyBzb3XEjXRvdsOpaG8gcm96ZMSbbGVuw60uDQpOT1JNU0lOVgkJPSBOT1JNU0lOVgkJIyMJVnLDoXTDrSBpbnZlcnpuw60gZnVua2NpIGsgZnVua2NpIHN0YW5kYXJkbsOtaG8gbm9ybcOhbG7DrWhvIHNvdcSNdG92w6lobyByb3pkxJtsZW7DrS4NClBFQVJTT04JCQk9IFBFQVJTT04JCSMjCVZyw6F0w60gUGVhcnNvbsWvdiB2w71zbGVkbsO9IG1vbWVudG92w70ga29yZWxhxI1uw60ga29lZmljaWVudC4NClBFUkNFTlRJTEUJCT0gUEVSQ0VOVElMCQkjIwlWcsOhdMOtIGhvZG5vdHUgay10w6lobyBwZXJjZW50aWx1IGhvZG5vdCB2IG9ibGFzdGkuDQpQRVJDRU5UUkFOSwkJPSBQRVJDRU5UUkFOSwkJIyMJVnLDoXTDrSBwb8WZYWTDrSBob2Rub3R5IHYgbW5vxb5pbsSbIGRhdCB2eWrDoWTFmWVuw6kgcHJvY2VudHXDoWxuw60gxI3DoXN0w60gbW5vxb5pbnkgZGF0Lg0KUEVSTVVUCQkJPSBQRVJNVVRBQ0UJCSMjCVZyw6F0w60gcG/EjWV0IHBlcm11dGFjw60gcHJvIHphZGFuw70gcG/EjWV0IG9iamVrdMWvLg0KUE9JU1NPTgkJCT0gUE9JU1NPTgkJIyMJVnLDoXTDrSBob2Rub3R1IGRpc3RyaWJ1xI1uw60gZnVua2NlIFBvaXNzb25vdmEgcm96ZMSbbGVuw60uDQpQUk9CCQkJPSBQUk9CCQkJIyMJVnLDoXTDrSBwcmF2ZMSbcG9kb2Jub3N0IHbDvXNreXR1IGhvZG5vdCB2IG9ibGFzdGkgbWV6aSBkdsSbbWEgbWV6bsOtbWkgaG9kbm90YW1pLg0KUVVBUlRJTEUJCT0gUVVBUlRJTAkJIyMJVnLDoXTDrSBob2Rub3R1IGt2YXJ0aWx1IG1ub8W+aW55IGRhdC4NClJBTksJCQk9IFJBTksJCQkjIwlWcsOhdMOtIHBvxZlhZMOtIMSNw61zbGEgdiBzZXpuYW11IMSNw61zZWwuDQpSU1EJCQk9IFJLUQkJCSMjCVZyw6F0w60gZHJ1aG91IG1vY25pbnUgUGVhcnNvbm92YSB2w71zbGVkbsOpaG8gbW9tZW50b3bDqWhvIGtvcmVsYcSNbsOtaG8ga29lZmljaWVudHUuDQpTS0VXCQkJPSBTS0VXCQkJIyMJVnLDoXTDrSB6ZcWhaWttZW7DrSByb3pkxJtsZW7DrS4NClNMT1BFCQkJPSBTTE9QRQkJCSMjCVZyw6F0w60gc23Em3JuaWNpIGxpbmXDoXJuw60gcmVncmVzbsOtIMSNw6FyeS4NClNNQUxMCQkJPSBTTUFMTAkJCSMjCVZyw6F0w60gay10b3UgbmVqbWVuxaHDrSBob2Rub3R1IG1ub8W+aW55IGRhdC4NClNUQU5EQVJESVpFCQk9IFNUQU5EQVJESVpFCQkjIwlWcsOhdMOtIG5vcm1hbGl6b3Zhbm91IGhvZG5vdHUuDQpTVERFVgkJCT0gU01PRENILlbDnULEmlIJCSMjCVZ5cG/EjXRlIHNtxJtyb2RhdG5vdSBvZGNoeWxrdSB2w71ixJtydS4NClNUREVWQQkJCT0gU1RERVZBCQkjIwlWeXBvxI10ZSBzbcSbcm9kYXRub3Ugb2RjaHlsa3UgdsO9YsSbcnUgdsSNZXRuxJsgxI3DrXNlbCwgdGV4dHUgYSBsb2dpY2vDvWNoIGhvZG5vdC4NClNUREVWUAkJCT0gU01PRENICQkjIwlWeXBvxI10ZSBzbcSbcm9kYXRub3Ugb2RjaHlsa3UgesOha2xhZG7DrWhvIHNvdWJvcnUuDQpTVERFVlBBCQkJPSBTVERFVlBBCQkjIwlWeXBvxI10ZSBzbcSbcm9kYXRub3Ugb2RjaHlsa3UgesOha2xhZG7DrWhvIHNvdWJvcnUgdsSNZXRuxJsgxI3DrXNlbCwgdGV4dHUgYSBsb2dpY2vDvWNoIGhvZG5vdC4NClNURVlYCQkJPSBTVEVZWAkJCSMjCVZyw6F0w60gc3RhbmRhcmRuw60gY2h5YnUgcMWZZWRwb3bEm3plbsOpIGhvZG5vdHkgeSBwcm8ga2HFvmRvdSBob2Rub3R1IHggdiByZWdyZXNpLg0KVERJU1QJCQk9IFRESVNUCQkJIyMJVnLDoXTDrSBob2Rub3R1IFN0dWRlbnRvdmEgdC1yb3pkxJtsZW7DrS4NClRJTlYJCQk9IFRJTlYJCQkjIwlWcsOhdMOtIGludmVyem7DrSBmdW5rY2kgayBkaXN0cmlidcSNbsOtIGZ1bmtjaSBTdHVkZW50b3ZhIHQtcm96ZMSbbGVuw60uDQpUUkVORAkJCT0gTElOVFJFTkQJCSMjCVZyw6F0w60gaG9kbm90eSBsaW5lw6FybsOtaG8gdHJlbmR1Lg0KVFJJTU1FQU4JCT0gVFJJTU1FQU4JCSMjCVZyw6F0w60gc3TFmWVkbsOtIGhvZG5vdHUgdm5pdMWZbsOtIMSNw6FzdGkgbW5vxb5pbnkgZGF0Lg0KVFRFU1QJCQk9IFRURVNUCQkJIyMJVnLDoXTDrSBwcmF2ZMSbcG9kb2Jub3N0IHNwb2plbm91IHNlIFN0dWRlbnRvdsO9bSB0LXRlc3RlbS4NClZBUgkJCT0gVkFSLlbDnULEmlIJCSMjCVZ5cG/EjXRlIHJvenB0eWwgdsO9YsSbcnUuDQpWQVJBCQkJPSBWQVJBCQkJIyMJVnlwb8SNdGUgcm96cHR5bCB2w71ixJtydSB2xI1ldG7EmyDEjcOtc2VsLCB0ZXh0dSBhIGxvZ2lja8O9Y2ggaG9kbm90Lg0KVkFSUAkJCT0gVkFSCQkJIyMJVnlwb8SNdGUgcm96cHR5bCB6w6FrbGFkbsOtaG8gc291Ym9ydS4NClZBUlBBCQkJPSBWQVJQQQkJCSMjCVZ5cG/EjXRlIHJvenB0eWwgesOha2xhZG7DrWhvIHNvdWJvcnUgdsSNZXRuxJsgxI3DrXNlbCwgdGV4dHUgYSBsb2dpY2vDvWNoIGhvZG5vdC4NCldFSUJVTEwJCQk9IFdFSUJVTEwJCSMjCVZyw6F0w60gaG9kbm90dSBXZWlidWxsb3ZhIHJvemTEm2xlbsOtLg0KWlRFU1QJCQk9IFpURVNUCQkJIyMJVnLDoXTDrSBqZWRub3N0cmFubm91IFAtaG9kbm90dSB6LXRlc3R1Lg0KDQoNCiMjDQojIwlUZXh0IGZ1bmN0aW9ucwkJCQlUZXh0b3bDqSBmdW5rY2UNCiMjDQpBU0MJCQk9IEFTQwkJCSMjCVptxJtuw60gem5ha3kgcyBwbG5vdSDFocOtxZlrb3UgKGR2b3ViYWp0b3bDqSl2IMWZZXTEm3pjaSB6bmFrxa8gbmEgem5ha3kgcyBwb2xvdmnEjW7DrSDFocOtxZlrb3UgKGplZG5vYmFqdG92w6kpLg0KQkFIVFRFWFQJCT0gQkFIVFRFWFQJCSMjCVDFmWV2ZWRlIMSNw61zbG8gbmEgdGV4dCB2ZSBmb3Jtw6F0dSwgbcSbbnkgw58gKGJhaHQpLg0KQ0hBUgkJCT0gWk5BSwkJCSMjCVZyw6F0w60gem5hayB1csSNZW7DvSDEjcOtc2xlbSBrw7NkdS4NCkNMRUFOCQkJPSBWWcSMSVNUSVQJCSMjCU9kZWJlcmUgeiB0ZXh0dSB2xaFlY2hueSBuZXRpc2tudXRlbG7DqSB6bmFreS4NCkNPREUJCQk9IEvDk0QJCQkjIwlWcsOhdMOtIMSNw61zZWxuw70ga8OzZCBwcnZuw61obyB6bmFrdSB6YWRhbsOpaG8gdGV4dG92w6lobyDFmWV0xJt6Y2UuDQpDT05DQVRFTkFURQkJPSBDT05DQVRFTkFURQkJIyMJU3BvasOtIG7Em2tvbGlrIHRleHRvdsO9Y2ggcG9sb8W+ZWsgZG8gamVkbsOpLg0KRE9MTEFSCQkJPSBLxIwJCQkjIwlQxZlldmVkZSDEjcOtc2xvIG5hIHRleHQgdmUgZm9ybcOhdHUgbcSbbnkgS8SNICjEjWVza8OhIGtvcnVuYSkuDQpFWEFDVAkJCT0gU1RFSk7DiQkJIyMJWmtvbnRyb2x1amUsIHpkYSBqc291IGR2xJsgdGV4dG92w6kgaG9kbm90eSBzaG9kbsOpLg0KRklORAkJCT0gTkFKw41UCQkJIyMJTmFsZXpuZSB0ZXh0b3ZvdSBob2Rub3R1IHV2bml0xZkgamluw6kgKHJvemxpxaF1amUgbWFsw6EgYSB2ZWxrw6EgcMOtc21lbmEpLg0KRklOREIJCQk9IEZJTkRCCQkJIyMJTmFsZXpuZSB0ZXh0b3ZvdSBob2Rub3R1IHV2bml0xZkgamluw6kgKHJvemxpxaF1amUgbWFsw6EgYSB2ZWxrw6EgcMOtc21lbmEpLg0KRklYRUQJCQk9IFpBT0tST1VITElULk5BLlRFWFQJIyMJWmZvcm3DoXR1amUgxI3DrXNsbyBqYWtvIHRleHQgcyBwZXZuw71tIHBvxI10ZW0gZGVzZXRpbm7DvWNoIG3DrXN0Lg0KSklTCQkJPSBKSVMJCQkjIwlabcSbbsOtIHpuYWt5IHMgcG9sb3ZpxI1uw60gxaHDrcWZa291IChqZWRub2JhanRvdsOpKSB2IMWZZXTEm3pjaSB6bmFrxa8gbmEgem5ha3kgcyBwbG5vdSDFocOtxZlrb3UgKGR2b3ViYWp0b3bDqSkuDQpMRUZUCQkJPSBaTEVWQQkJCSMjCVZyw6F0w60gcHJ2bsOtIHpuYWt5IHRleHRvdsOpIGhvZG5vdHkgdW3DrXN0xJtuw6kgbmVqdsOtY2Ugdmxldm8uDQpMRUZUQgkJCT0gTEVGVEIJCQkjIwlWcsOhdMOtIHBydm7DrSB6bmFreSB0ZXh0b3bDqSBob2Rub3R5IHVtw61zdMSbbsOpIG5lanbDrWNlIHZsZXZvLg0KTEVOCQkJPSBEw4lMS0EJCQkjIwlWcsOhdMOtIHBvxI1ldCB6bmFrxa8gdGV4dG92w6lobyDFmWV0xJt6Y2UuDQpMRU5CCQkJPSBMRU5CCQkJIyMJVnLDoXTDrSBwb8SNZXQgem5ha8WvIHRleHRvdsOpaG8gxZlldMSbemNlLg0KTE9XRVIJCQk9IE1BTMOBCQkJIyMJUMWZZXZlZGUgdGV4dCBuYSBtYWzDoSBww61zbWVuYS4NCk1JRAkJCT0gxIzDgVNUCQkJIyMJVnLDoXTDrSB1csSNaXTDvSBwb8SNZXQgem5ha8WvIHRleHRvdsOpaG8gxZlldMSbemNlIHBvxI3DrW5hamUgemFkYW7DvW0gbcOtc3RlbS4NCk1JREIJCQk9IE1JREIJCQkjIwlWcsOhdMOtIHVyxI1pdMO9IHBvxI1ldCB6bmFrxa8gdGV4dG92w6lobyDFmWV0xJt6Y2UgcG/EjcOtbmFqZSB6YWRhbsO9bSBtw61zdGVtLg0KUEhPTkVUSUMJCT0gWlZVS09Ww4kJCSMjCUV4dHJhaHVqZSBmb25ldGlja8OpIHpuYWt5IChmdXJpZ2FuYSkgeiB0ZXh0b3bDqWhvIMWZZXTEm3pjZS4NClBST1BFUgkJCT0gVkVMS8OBMgkJIyMJUMWZZXZlZGUgcHJ2bsOtIHDDrXNtZW5vIGthxb5kw6lobyBzbG92YSB0ZXh0b3bDqSBob2Rub3R5IG5hIHZlbGvDqS4NClJFUExBQ0UJCQk9IE5BSFJBRElUCQkjIwlOYWhyYWTDrSB6bmFreSB1dm5pdMWZIHRleHR1Lg0KUkVQTEFDRUIJCT0gTkFIUkFESVRCCQkjIwlOYWhyYWTDrSB6bmFreSB1dm5pdMWZIHRleHR1Lg0KUkVQVAkJCT0gT1BBS09WQVQJCSMjCVpvcGFrdWplIHRleHQgcG9kbGUgemFkYW7DqWhvIHBvxI10dSBvcGFrb3bDoW7DrS4NClJJR0hUCQkJPSBaUFJBVkEJCSMjCVZyw6F0w60gcHJ2bsOtIHpuYWt5IHRleHRvdsOpIGhvZG5vdHkgdW3DrXN0xJtuw6kgbmVqdsOtY2UgdnByYXZvLg0KUklHSFRCCQkJPSBSSUdIVEIJCSMjCVZyw6F0w60gcHJ2bsOtIHpuYWt5IHRleHRvdsOpIGhvZG5vdHkgdW3DrXN0xJtuw6kgbmVqdsOtY2UgdnByYXZvLg0KU0VBUkNICQkJPSBITEVEQVQJCSMjCU5hbGV6bmUgdGV4dG92b3UgaG9kbm90dSB1dm5pdMWZIGppbsOpIChtYWzDoSBhIHZlbGvDoSBww61zbWVuYSBuZWpzb3Ugcm96bGnFoW92w6FuYSkuDQpTRUFSQ0hCCQkJPSBTRUFSQ0hCCQkjIwlOYWxlem5lIHRleHRvdm91IGhvZG5vdHUgdXZuaXTFmSBqaW7DqSAobWFsw6EgYSB2ZWxrw6EgcMOtc21lbmEgbmVqc291IHJvemxpxaFvdsOhbmEpLg0KU1VCU1RJVFVURQkJPSBET1NBRElUCQkjIwlWIHRleHRvdsOpbSDFmWV0xJt6Y2kgbmFocmFkw60gc3RhcsO9IHRleHQgbm92w71tLg0KVAkJCT0gVAkJCSMjCVDFmWV2ZWRlIGFyZ3VtZW50eSBuYSB0ZXh0Lg0KVEVYVAkJCT0gSE9ETk9UQS5OQS5URVhUCSMjCVpmb3Jtw6F0dWplIMSNw61zbG8gYSBwxZlldmVkZSBobyBuYSB0ZXh0Lg0KVFJJTQkJCT0gUFJPxIxJU1RJVAkJIyMJT2RzdHJhbsOtIHogdGV4dHUgbWV6ZXJ5Lg0KVVBQRVIJCQk9IFZFTEvDgQkJCSMjCVDFmWV2ZWRlIHRleHQgbmEgdmVsa8OhIHDDrXNtZW5hLg0KVkFMVUUJCQk9IEhPRE5PVEEJCSMjCVDFmWV2ZWRlIHRleHRvdsO9IGFyZ3VtZW50IG5hIMSNw61zbG8uDQo=]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/locale/da/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/locale/da/config</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[77u/IyMNCiMjIFBIUEV4Y2VsDQojIw0NCiMjIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTEgUEhQRXhjZWwNCiMjDQojIyBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yDQojIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljDQojIyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXINCiMjIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLg0KIyMNCiMjIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLA0KIyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YNCiMjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VDQojIyBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLg0KIyMNCiMjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMNCiMjIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUNCiMjIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQ0KIyMNCiMjIEBjYXRlZ29yeSAgIFBIUEV4Y2VsDQojIyBAcGFja2FnZSAgICBQSFBFeGNlbF9TZXR0aW5ncw0KIyMgQGNvcHlyaWdodCAgQ29weXJpZ2h0IChjKSAyMDA2IC0gMjAxMSBQSFBFeGNlbCAoaHR0cDovL3d3dy5jb2RlcGxleC5jb20vUEhQRXhjZWwpDQojIyBAbGljZW5zZSAgICBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvb2xkLWxpY2Vuc2VzL2xncGwtMi4xLnR4dAlMR1BMDQojIyBAdmVyc2lvbiAgICAxLjcuNywgMjAxMi0wNS0xOQ0KIyMNCiMjDQoNCg0KQXJndW1lbnRTZXBhcmF0b3IJPSA7DQoNCg0KIyMNCiMjCShGb3IgZnV0dXJlIHVzZSkNCiMjDQpjdXJyZW5jeVN5bWJvbAk9IGtyCg0KDQoNCiMjDQojIwlFeGNlbCBFcnJvciBDb2RlcwkoRm9yIGZ1dHVyZSB1c2UpDQ0KIyMNCk5VTEwJPSAjTlVMIQ0KRElWMAk9ICNESVZJU0lPTi8wIQ0KVkFMVUUJPSAjVsOGUkRJIQ0KUkVGCT0gI1JFRkVSRU5DRSENCk5BTUUJPSAjTkFWTj8NCk5VTQk9ICNOVU0hDQpOQQk9ICNJL1QNCg==]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/locale/da/functions</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[77u/IyMNCiMjIFBIUEV4Y2VsDQojIw0NCiMjIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTEgUEhQRXhjZWwNCiMjDQojIyBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yDQojIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljDQojIyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXINCiMjIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLg0KIyMNCiMjIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLA0KIyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YNCiMjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VDQojIyBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLg0KIyMNCiMjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMNCiMjIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUNCiMjIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQ0KIyMNCiMjIEBjYXRlZ29yeSAgIFBIUEV4Y2VsDQojIyBAcGFja2FnZSAgICBQSFBFeGNlbF9DYWxjdWxhdGlvbg0KIyMgQGNvcHlyaWdodCAgQ29weXJpZ2h0IChjKSAyMDA2IC0gMjAxMSBQSFBFeGNlbCAoaHR0cDovL3d3dy5jb2RlcGxleC5jb20vUEhQRXhjZWwpDQojIyBAbGljZW5zZSAgICBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvb2xkLWxpY2Vuc2VzL2xncGwtMi4xLnR4dAlMR1BMDQojIyBAdmVyc2lvbiAgICAxLjcuNywgMjAxMi0wNS0xOQ0KIyMNCiMjIERhdGEgaW4gdGhpcyBmaWxlIGRlcml2ZWQgZnJvbSBodHRwOi8vd3d3LnBpdWhhLmZpL2V4Y2VsLWZ1bmN0aW9uLW5hbWUtdHJhbnNsYXRpb24vDQojIw0KIyMNCg0KDQojIw0KIyMJQWRkLWluIGFuZCBBdXRvbWF0aW9uIGZ1bmN0aW9ucwkJCVRpbGbDuGplbHNlc3Byb2dyYW0tIG9nIGF1dG9tYXRpc2VyaW5nc2Z1bmt0aW9uZXINCiMjDQpHRVRQSVZPVERBVEEJCT0gSEVOVFBJVk9UREFUQQkJCSMjCVJldHVybmVyZXIgZGF0YSwgZGVyIGVyIGxhZ3JldCBpIGVuIHBpdm90dGFiZWxyYXBwb3J0DQoNCg0KIyMNCiMjCUN1YmUgZnVuY3Rpb25zCQkJCQlLdWJlZnVua3Rpb25lcg0KIyMNCkNVQkVLUElNRU1CRVIJCT0gS1VCRS5LUEkuTUVETEVNCQkjIwlSZXR1cm5lcmVyIG5hdm4sIGVnZW5za2FiIG9nIG3DpWwgZm9yIGVuIEtQSS1pbmRpa2F0b3Igb2cgdmlzZXIgbmF2bmV0IG9nIGVnZW5za2FiZW4gaSBjZWxsZW4uIEVuIEtQSS1pbmRpa2F0b3IgZXIgZW4gbcOlbGJhciBzdMO4cnJlbHNlLCBmLmVrcy4gYnJ1dHRvb3ZlcnNrdWQgcHIuIG3DpW5lZCBlbGxlciBwZXJzb25hbGV1ZHNraWZ0bmluZyBwci4ga3ZhcnRhbCwgZGVyIGJydWdlcyB0aWwgYXQgb3ZlcnbDpWdlIGVuIG9yZ2FuaXNhdGlvbnMgcHLDpnN0YXRpb25lci4NCkNVQkVNRU1CRVIJCT0gS1VCRS5NRURMRU0JCQkjIwlSZXR1cm5lcmVyIGV0IG1lZGxlbSBlbGxlciBlbiB0dXBlbCBmcmEga3ViZWhpZXJhcmtpZXQuIEJydWdlcyB0aWwgYXQgdmFsaWRlcmUsIG9tIGV0IG1lZGxlbSBlbGxlciBlbiB0dXBlbCBmaW5kZXMgaSBrdWJlbi4NCkNVQkVNRU1CRVJQUk9QRVJUWQk9IEtVQkVNRURMRU0uRUdFTlNLQUIJCSMjCVJldHVybmVyZXIgdsOmcmRpZW4gYWYgZW4gZWdlbnNrYWIgZm9yIGV0IG1lZGxlbSBpIGt1YmVuLiBCcnVnZXMgdGlsIGF0IHZhbGlkZXJlLCBvbSBldCBtZWRsZW1zbmF2biBmaW5kZXMgaSBrdWJlbiwgb2cgcmV0dXJuZXJlIGRlbiBhbmdpdm5lIGVnZW5za2FiIGZvciBtZWRsZW1tZXQuDQpDVUJFUkFOS0VETUVNQkVSCT0gS1VCRU1FRExFTS5SQU5HCQkjIwlSZXR1cm5lcmVyIGRldCBuJ3RlIGVsbGVyIHJhbmdvcmRuZWRlIG1lZGxlbSBpIGV0IHPDpnQuIEJydWdlcyB0aWwgYXQgcmV0dXJuZXJlIGV0IGVsbGVyIGZsZXJlIGVsZW1lbnRlciBpIGV0IHPDpnQsIGYuZWtzLiB0b3Bzw6ZsZ2VyZSBlbGxlciBkZSAxMCBiZWRzdGUgZWxldmVyLg0KQ1VCRVNFVAkJCT0gS1VCRVPDhlQJCQkjIwlEZWZpbmVyZXIgZXQgYmVyZWduZXQgc8OmdCBtZWRsZW1tZXIgZWxsZXIgdHVwbGVyIHZlZCBhdCBzZW5kZSBldCBzw6Z0dWR0cnlrIHRpbCBrdWJlbiBww6Ugc2VydmVyZW4sIHNvbSBvcHJldHRlciBzw6Z0dGV0IG9nIHJldHVybmVyZXIgZGV0IHRpbCBNaWNyb3NvZnQgT2ZmaWNlIEV4Y2VsLg0KQ1VCRVNFVENPVU5UCQk9IEtVQkVTw4ZULlTDhkwJCQkjIwlSZXR1cm5lcmVyIGFudGFsbGV0IGFmIGVsZW1lbnRlciBpIGV0IHPDpnQuDQpDVUJFVkFMVUUJCT0gS1VCRVbDhlJESQkJCSMjCVJldHVybmVyZXIgZW4gc2FtbWVubGFndCAoYWdncmVnZXJldCkgdsOmcmRpIGZyYSBlbiBrdWJlLg0KDQoNCiMjDQojIwlEYXRhYmFzZSBmdW5jdGlvbnMJCQkJRGF0YWJhc2VmdW5rdGlvbmVyDQojIw0KREFWRVJBR0UJCT0gRE1JRERFTAkJCSMjCVJldHVybmVyZXIgZ2VubmVtc25pdHRldCBhZiBtYXJrZXJlZGUgZGF0YWJhc2Vwb3N0ZXINCkRDT1VOVAkJCT0gRFTDhkwJCQkJIyMJVMOmbGxlciBkZSBjZWxsZXIsIGRlciBpbmRlaG9sZGVyIHRhbCwgaSBlbiBkYXRhYmFzZQ0KRENPVU5UQQkJCT0gRFTDhkxWCQkJCSMjCVTDpmxsZXIgdWRmeWxkdGUgY2VsbGVyIGkgZW4gZGF0YWJhc2UNCkRHRVQJCQk9IERIRU5UCQkJCSMjCVVkZHJhZ2VyIGVuIGVua2VsdCBwb3N0LCBkZXIgb3BmeWxkZXIgZGUgYW5naXZuZSBrcml0ZXJpZXIsIGZyYSBlbiBkYXRhYmFzZQ0KRE1BWAkJCT0gRE1BS1MJCQkJIyMJUmV0dXJuZXJlciBkZW4gc3TDuHJzdGUgdsOmcmRpIGJsYW5kdCBtYXJrZXJlZGUgZGF0YWJhc2Vwb3N0ZXINCkRNSU4JCQk9IERNSU4JCQkJIyMJUmV0dXJuZXJlciBkZW4gbWluZHN0ZSB2w6ZyZGkgYmxhbmR0IG1hcmtlcmVkZSBkYXRhYmFzZXBvc3Rlcg0KRFBST0RVQ1QJCT0gRFBST0RVS1QJCQkjIwlHYW5nZXIgdsOmcmRpZXJuZSBpIGV0IGJlc3RlbXQgZmVsdCBtZWQgcG9zdGVyLCBkZXIgb3BmeWxkZXIga3JpdGVyaWVybmUgaSBlbiBkYXRhYmFzZQ0KRFNUREVWCQkJPSBEU1REQUZWCQkJIyMJQmVyZWduZXIgZXQgc2vDuG4gb3ZlciBzdGFuZGFyZGFmdmlnZWxzZW4gYmFzZXJldCBww6UgZW4gc3Rpa3Byw7h2ZSBhZiBtYXJrZXJlZGUgZGF0YWJhc2Vwb3N0ZXINCkRTVERFVlAJCQk9IERTVERBRlZQCQkJIyMJQmVyZWduZXIgc3RhbmRhcmRhZnZpZ2Vsc2VuIGJhc2VyZXQgcMOlIGhlbGUgcG9wdWxhdGlvbmVuIGFmIG1hcmtlcmVkZSBkYXRhYmFzZXBvc3Rlcg0KRFNVTQkJCT0gRFNVTQkJCQkjIwlTYW1tZW5sw6ZnZ2VyIGRlIHRhbCBpIGZlbHRrb2xvbm5lbiBpIGRhdGFiYXNlbiwgZGVyIG9wZnlsZGVyIGtyaXRlcmllcm5lDQpEVkFSCQkJPSBEVkFSSUFOUwkJCSMjCUJlcmVnbmVyIHZhcmlhbnMgYmFzZXJldCBww6UgZW4gc3Rpa3Byw7h2ZSBhZiBtYXJrZXJlZGUgZGF0YWJhc2Vwb3N0ZXINCkRWQVJQCQkJPSBEVkFSSUFOU1AJCQkjIwlCZXJlZ25lciB2YXJpYW5zIGJhc2VyZXQgcMOlIGhlbGUgcG9wdWxhdGlvbmVuIGFmIG1hcmtlcmVkZSBkYXRhYmFzZXBvc3Rlcg0KDQoNCiMjDQojIwlEYXRlIGFuZCB0aW1lIGZ1bmN0aW9ucwkJCQlEYXRvLSBvZyBrbG9ra2VzbMOmdHNmdW5rdGlvbmVyDQojIw0KREFURQkJCT0gREFUTwkJCQkjIwlSZXR1cm5lcmVyIHNlcmllbnVtbWVyZXQgZm9yIGVuIGJlc3RlbXQgZGF0bw0KREFURVZBTFVFCQk9IERBVE9Ww4ZSREkJCQkjIwlLb252ZXJ0ZXJlciBlbiBkYXRvIGkgZm9ybSBhZiB0ZWtzdCB0aWwgZXQgc2VyaWVudW1tZXINCkRBWQkJCT0gREFHCQkJCSMjCUtvbnZlcnRlcmVyIGV0IHNlcmllbnVtbWVyIHRpbCBlbiBkYWcgaSBtw6VuZWRlbg0KREFZUzM2MAkJCT0gREFHRTM2MAkJCSMjCUJlcmVnbmVyIGFudGFsbGV0IGFmIGRhZ2UgbWVsbGVtIHRvIGRhdG9lciBww6UgZ3J1bmRsYWcgYWYgZXQgw6VyIG1lZCAzNjAgZGFnZQ0KRURBVEUJCQk9IEVEQVRPCQkJCSMjCVJldHVybmVyZXIgc2VyaWVudW1tZXJldCBmb3IgZGVuIGRhdG8sIGRlciBsaWdnZXIgZGV0IGFuZ2l2bmUgYW50YWwgbcOlbmVkZXIgZsO4ciBlbGxlciBlZnRlciBzdGFydGRhdG9lbg0KRU9NT05USAkJCT0gU0xVVC5Qw4UuTcOFTkVECQkJIyMJUmV0dXJuZXJlciBzZXJpZW51bW1lcmV0IHDDpSBkZW4gc2lkc3RlIGRhZyBpIG3DpW5lZGVuIGbDuHIgZWxsZXIgZWZ0ZXIgZXQgYW5naXZldCBhbnRhbCBtw6VuZWRlcg0KSE9VUgkJCT0gVElNRQkJCQkjIwlLb252ZXJ0ZXJlciBldCBzZXJpZW51bW1lciB0aWwgZW4gdGltZQ0KTUlOVVRFCQkJPSBNSU5VVAkJCQkjIwlLb252ZXJ0ZXJlciBldCBzZXJpZW51bW1lciB0aWwgZXQgbWludXQNCk1PTlRICQkJPSBNw4VORUQJCQkJIyMJS29udmVydGVyZXIgZXQgc2VyaWVudW1tZXIgdGlsIGVuIG3DpW5lZA0KTkVUV09SS0RBWVMJCT0gQU5UQUwuQVJCRUpEU0RBR0UJCSMjCVJldHVybmVyZXIgYW50YWxsZXQgYWYgaGVsZSBhcmJlamRzZGFnZSBtZWxsZW0gdG8gZGF0b2VyDQpOT1cJCQk9IE5VCQkJCSMjCVJldHVybmVyZXIgc2VyaWVudW1tZXJldCBmb3IgZGVuIGFrdHVlbGxlIGRhdG8gZWxsZXIgZGV0IGFrdHVlbGxlIGtsb2trZXNsw6Z0DQpTRUNPTkQJCQk9IFNFS1VORAkJCSMjCUtvbnZlcnRlcmVyIGV0IHNlcmllbnVtbWVyIHRpbCBldCBzZWt1bmQNClRJTUUJCQk9IEtMT0tLRVNMw4ZUCQkJIyMJUmV0dXJuZXJlciBzZXJpZW51bW1lcmV0IGZvciBldCBiZXN0ZW10IGtsb2trZXNsw6Z0DQpUSU1FVkFMVUUJCT0gVElEU1bDhlJESQkJCSMjCUtvbnZlcnRlcmVyIGV0IGtsb2trZXNsw6Z0IGkgZm9ybSBhZiB0ZWtzdCB0aWwgZXQgc2VyaWVudW1tZXINClRPREFZCQkJPSBJREFHCQkJCSMjCVJldHVybmVyZXIgc2VyaWVudW1tZXJldCBmb3IgZGFncyBkYXRvDQpXRUVLREFZCQkJPSBVR0VEQUcJCQkjIwlLb252ZXJ0ZXJlciBldCBzZXJpZW51bW1lciB0aWwgZW4gdWdlZGFnDQpXRUVLTlVNCQkJPSBVR0UuTlIJCQkjIwlLb252ZXJ0ZXJlciBldCBzZXJpZW51bW1lciB0aWwgZXQgdGFsLCBkZXIgYW5naXZlciB1Z2VudW1tZXJldCBpIMOlcmV0DQpXT1JLREFZCQkJPSBBUkJFSkRTREFHCQkJIyMJUmV0dXJuZXJlciBzZXJpZW51bW1lcmV0IGZvciBkYWdlbiBmw7hyIGVsbGVyIGVmdGVyIGRldCBhbmdpdm5lIGFudGFsIGFyYmVqZHNkYWdlDQpZRUFSCQkJPSDDhVIJCQkJIyMJS29udmVydGVyZXIgZXQgc2VyaWVudW1tZXIgdGlsIGV0IMOlcg0KWUVBUkZSQUMJCT0gw4VSLkJSw5hLCQkJIyMJUmV0dXJuZXJlciDDpXJzYnLDuGtlbiwgZGVyIHJlcHLDpnNlbnRlcmVyIGFudGFsbGV0IGFmIGhlbGUgZGFnZSBtZWxsZW0gc3RhcnRkYXRvIG9nIHNsdXRkYXRvDQoNCg0KIyMNCiMjCUVuZ2luZWVyaW5nIGZ1bmN0aW9ucwkJCQlUZWtuaXNrZSBmdW5rdGlvbmVyDQojIw0KQkVTU0VMSQkJCT0gQkVTU0VMSQkJCSMjCVJldHVybmVyZXIgZGVuIG1vZGlmaWNlcmVkZSBCZXNzZWwtZnVua3Rpb24gSW4oeCkNCkJFU1NFTEoJCQk9IEJFU1NFTEoJCQkjIwlSZXR1cm5lcmVyIEJlc3NlbC1mdW5rdGlvbmVuIEpuKHgpDQpCRVNTRUxLCQkJPSBCRVNTRUxLCQkJIyMJUmV0dXJuZXJlciBkZW4gbW9kaWZpY2VyZWRlIEJlc3NlbC1mdW5rdGlvbiBLbih4KQ0KQkVTU0VMWQkJCT0gQkVTU0VMWQkJCSMjCVJldHVybmVyZXIgQmVzc2VsLWZ1bmt0aW9uZW4gWW4oeCkNCkJJTjJERUMJCQk9IEJJTi5USUwuREVDCQkJIyMJS29udmVydGVyZXIgZXQgYmluw6ZydCB0YWwgdGlsIGV0IGRlY2ltYWx0YWwNCkJJTjJIRVgJCQk9IEJJTi5USUwuSEVYCQkJIyMJS29udmVydGVyZXIgZXQgYmluw6ZydCB0YWwgdGlsIGV0IGhla3NhZGVjaW1hbHQgdGFsDQpCSU4yT0NUCQkJPSBCSU4uVElMLk9LVAkJCSMjCUtvbnZlcnRlcmVyIGV0IGJpbsOmcnQgdGFsIHRpbCBldCBva3RhbHRhbC4NCkNPTVBMRVgJCQk9IEtPTVBMRUtTCQkJIyMJS29udmVydGVyZXIgcmVlbGxlIG9nIGltYWdpbsOmcmUga29lZmZpY2llbnRlciB0aWwgZXQga29tcGxla3N0IHRhbA0KQ09OVkVSVAkJCT0gS09OVkVSVEVSCQkJIyMJS29udmVydGVyZXIgZXQgdGFsIGZyYSDDqW4gbcOlbGVlbmhlZCB0aWwgZW4gYW5kZW4NCkRFQzJCSU4JCQk9IERFQy5USUwuQklOCQkJIyMJS29udmVydGVyZXIgZXQgZGVjaW1hbHRhbCB0aWwgZXQgYmluw6ZydCB0YWwNCkRFQzJIRVgJCQk9IERFQy5USUwuSEVYCQkJIyMJS29udmVydGVyZXIgZXQgZGVjaW1hbHRhbCB0aWwgZXQgaGVrc2FkZWNpbWFsdCB0YWwNCkRFQzJPQ1QJCQk9IERFQy5USUwuT0tUCQkJIyMJS29udmVydGVyZXIgZXQgZGVjaW1hbHRhbCB0aWwgZXQgb2t0YWx0YWwNCkRFTFRBCQkJPSBERUxUQQkJCQkjIwlUZXN0ZXIsIG9tIHRvIHbDpnJkaWVyIGVyIGVucw0KRVJGCQkJPSBGRUpMRlVOSwkJCSMjCVJldHVybmVyIGZlamxmdW5rdGlvbmVuDQpFUkZDCQkJPSBGRUpMRlVOSy5LT01QCQkJIyMJUmV0dXJuZXJlciBkZW4ga29tcGxlbWVudMOmcmUgZmVqbGZ1bmt0aW9uDQpHRVNURVAJCQk9IEdFVFJJTgkJCSMjCVRlc3Rlciwgb20gZXQgdGFsIGVyIHN0w7hycmUgZW5kIGVuIGdyw6Zuc2V2w6ZyZGkNCkhFWDJCSU4JCQk9IEhFWC5USUwuQklOCQkJIyMJS29udmVydGVyZXIgZXQgaGVrc2FkZWNpbWFsdCB0YWwgdGlsIGV0IGJpbsOmcnQgdGFsDQpIRVgyREVDCQkJPSBIRVguVElMLkRFQwkJCSMjCUtvbnZlcnRlcmVyIGV0IGRlY2ltYWx0YWwgdGlsIGV0IGhla3NhZGVjaW1hbHQgdGFsDQpIRVgyT0NUCQkJPSBIRVguVElMLk9LVAkJCSMjCUtvbnZlcnRlcmVyIGV0IGhla3NhZGVjaW1hbHQgdGFsIHRpbCBldCBva3RhbHRhbA0KSU1BQlMJCQk9IElNQUdBQlMJCQkjIwlSZXR1cm5lcmVyIGRlbiBhYnNvbHV0dGUgdsOmcmRpIChtb2R1bHVzKSBmb3IgZXQga29tcGxla3N0IHRhbA0KSU1BR0lOQVJZCQk9IElNQUdJTsOGUgkJCSMjCVJldHVybmVyZXIgZGVuIGltYWdpbsOmcmUga29lZmZpY2llbnQgZm9yIGV0IGtvbXBsZWtzdCB0YWwNCklNQVJHVU1FTlQJCT0gSU1BR0FSR1VNRU5UCQkJIyMJUmV0dXJuZXJlciBhcmd1bWVudGV0IHRoZXRhLCBlbiB2aW5rZWwgdWR0cnlrdCBpIHJhZGlhbmVyDQpJTUNPTkpVR0FURQkJPSBJTUFHS09OSlVHRVJFCQkJIyMJUmV0dXJuZXJlciBkZW4ga29tcGxla3NlIGtvbmp1Z2F0aW9uIGFmIGV0IGtvbXBsZWtzdCB0YWwNCklNQ09TCQkJPSBJTUFHQ09TCQkJIyMJUmV0dXJuZXJlciBldCBrb21wbGVrc3QgdGFscyBjb3NpbnVzDQpJTURJVgkJCT0gSU1BR0RJVgkJCSMjCVJldHVybmVyZXIga3ZvdGllbnRlbiBmb3IgdG8ga29tcGxla3NlIHRhbA0KSU1FWFAJCQk9IElNQUdFS1NQCQkJIyMJUmV0dXJuZXJlciBldCBrb21wbGVrc3QgdGFscyBla3Nwb25lbnRpYWxmdW5rdGlvbg0KSU1MTgkJCT0gSU1BR0xOCQkJIyMJUmV0dXJuZXJlciBldCBrb21wbGVrc3QgdGFscyBuYXR1cmxpZ2UgbG9nYXJpdG1lDQpJTUxPRzEwCQkJPSBJTUFHTE9HMTAJCQkjIwlSZXR1cm5lcmVyIGV0IGtvbXBsZWtzdCB0YWxzIHPDpmR2YW5saWdlIGxvZ2FyaXRtZSAodGl0YWxzbG9nYXJpdG1lKQ0KSU1MT0cyCQkJPSBJTUFHTE9HMgkJCSMjCVJldHVybmVyZXIgZXQga29tcGxla3N0IHRhbHMgc8OmZHZhbmxpZ2UgbG9nYXJpdG1lICh0b3RhbHNsb2dhcml0bWUpDQpJTVBPV0VSCQkJPSBJTUFHUE9URU5TCQkJIyMJUmV0dXJuZXJlciBldCBrb21wbGVrc3QgdGFsIG9wbMO4ZnRldCBpIGVuIGhlbHRhbHNwb3RlbnMNCklNUFJPRFVDVAkJPSBJTUFHUFJPRFVLVAkJCSMjCVJldHVybmVyZXIgcHJvZHVrdGV0IGFmIGtvbXBsZWtzZSB0YWwNCklNUkVBTAkJCT0gSU1BR1JFRUxUCQkJIyMJUmV0dXJuZXJlciBkZW4gcmVlbGxlIGtvZWZmaWNpZW50IGZvciBldCBrb21wbGVrc3QgdGFsDQpJTVNJTgkJCT0gSU1BR1NJTgkJCSMjCVJldHVybmVyZXIgZXQga29tcGxla3N0IHRhbHMgc2ludXMNCklNU1FSVAkJCT0gSU1BR0tWUk9ECQkJIyMJUmV0dXJuZXJlciBldCBrb21wbGVrc3QgdGFscyBrdmFkcmF0cm9kDQpJTVNVQgkJCT0gSU1BR1NVQgkJCSMjCVJldHVybmVyZXIgZm9yc2tlbGxlbiBtZWxsZW0gdG8ga29tcGxla3NlIHRhbA0KSU1TVU0JCQk9IElNQUdTVU0JCQkjIwlSZXR1cm5lcmVyIHN1bW1lbiBhZiBrb21wbGVrc2UgdGFsDQpPQ1QyQklOCQkJPSBPS1QuVElMLkJJTgkJCSMjCUtvbnZlcnRlcmVyIGV0IG9rdGFsdGFsIHRpbCBldCBiaW7DpnJ0IHRhbA0KT0NUMkRFQwkJCT0gT0tULlRJTC5ERUMJCQkjIwlLb252ZXJ0ZXJlciBldCBva3RhbHRhbCB0aWwgZXQgZGVjaW1hbHRhbA0KT0NUMkhFWAkJCT0gT0tULlRJTC5IRVgJCQkjIwlLb252ZXJ0ZXJlciBldCBva3RhbHRhbCB0aWwgZXQgaGVrc2FkZWNpbWFsdCB0YWwNCg0KDQojIw0KIyMJRmluYW5jaWFsIGZ1bmN0aW9ucwkJCQlGaW5hbnNpZWxsZSBmdW5rdGlvbmVyDQojIw0KQUNDUklOVAkJCT0gUMOFTMOYQlJFTlRFCQkJIyMJUmV0dXJuZXJlciBkZW4gcMOlbMO4Ym5lIHJlbnRlIGZvciBldCB2w6ZyZGlwYXBpciBtZWQgcGVyaW9kaXNrZSByZW50ZXVkYmV0YWxpbmdlcg0KQUNDUklOVE0JCT0gUMOFTMOYQlJFTlRFLlVETMOYQgkJIyMJUmV0dXJuZXJlciBkZW4gcMOlbMO4Ym5lIHJlbnRlIGZvciBldCB2w6ZyZGlwYXBpciwgaHZvciByZW50ZXVkYmV0YWxpbmdlbiBmaW5kZXIgc3RlZCB2ZWQgcGFwaXJldHMgdWRsw7hiDQpBTU9SREVHUkMJCT0gQU1PUkRFR1JDCQkJIyMJUmV0dXJuZXJlciBhZnNrcml2bmluZ3NiZWzDuGJldCBmb3IgaHZlciByZWduc2thYnNwZXJpb2RlIHZlZCBoasOmbHAgYWYgZW4gYWZza3Jpdm5pbmdza29lZmZpY2llbnQNCkFNT1JMSU5DCQk9IEFNT1JMSU5DCQkJIyMJUmV0dXJuZXJlciBhZnNrcml2bmluZ3NiZWzDuGJldCBmb3IgaHZlciByZWduc2thYnNwZXJpb2RlDQpDT1VQREFZQlMJCT0gS1VQT05EQUdFLlNBCQkJIyMJUmV0dXJuZXJlciBhbnRhbGxldCBhZiBkYWdlIGZyYSBzdGFydGVuIGFmIGt1cG9ucGVyaW9kZW4gdGlsIGFmcmVnbmluZ3NkYXRvZW4NCkNPVVBEQVlTCQk9IEtVUE9OREFHRS5BCQkJIyMJUmV0dXJuZXJlciBhbnRhbGxldCBhZiBkYWdlIGZyYSBiZWd5bmRlbHNlbiBhZiBrdXBvbnBlcmlvZGVuIHRpbCBhZnJlZ25pbmdzZGF0b2VuDQpDT1VQREFZU05DCQk9IEtVUE9OREFHRS5BTksJCQkjIwlSZXR1cm5lcmVyIGFudGFsbGV0IGFmIGRhZ2UgaSBkZW4ga3Vwb25wZXJpb2RlLCBkZXIgaW5kZWhvbGRlciBhZnJlZ25pbmdzZGF0b2VuDQpDT1VQTkNECQkJPSBLVVBPTkRBRy5Ow4ZTVEUJCSMjCVJldHVybmVyZXIgZGVuIG7DpnN0ZSBrdXBvbmRhdG8gZWZ0ZXIgYWZyZWduaW5nc2RhdG9lbg0KQ09VUE5VTQkJCT0gS1VQT05CRVRBTElOR0VSCQkjIwlSZXR1cm5lcmVyIGFudGFsbGV0IGFmIGt1cG9udWRiZXRhbGluZ2VyIG1lbGxlbSBhZnJlZ25pbmdzLSBvZyB1ZGzDuGJzZGF0b2VuDQpDT1VQUENECQkJPSBLVVBPTkRBRy5GT1JSSUdFCQkjIwlSZXR1cm5lcmVyIGRlbiBmb3JyaWdlIGt1cG9uZGF0byBmw7hyIGFmcmVnbmluZ3NkYXRvZW4NCkNVTUlQTVQJCQk9IEFLS1VNLlJFTlRFCQkJIyMJUmV0dXJuZXJlciBkZW4gYWtrdW11bGVyZWRlIHJlbnRlLCBkZXIgYmV0YWxlcyBww6UgZXQgbMOlbiBtZWxsZW0gdG8gcGVyaW9kZXINCkNVTVBSSU5DCQk9IEFLS1VNLkhPVkVEU1RPTAkJIyMJUmV0dXJuZXJlciBkZW4gYWtrdW11bGVyZWRlIG5lZGJyaW5nZWxzZSBhZiBob3ZlZHN0b2wgbWVsbGVtIHRvIHBlcmlvZGVyDQpEQgkJCT0gREIJCQkJIyMJUmV0dXJuZXJlciBhZnNrcml2bmluZ2VuIHDDpSBldCBha3RpdiBpIGVuIGFuZ2l2ZXQgcGVyaW9kZSB2ZWQgYW52ZW5kZWxzZSBhZiBzYWxkb21ldG9kZW4NCkREQgkJCT0gRFNBCQkJCSMjCVJldHVybmVyZXIgYWZza3Jpdm5pbmdzYmVsw7hiZXQgZm9yIGV0IGFrdGl2IG92ZXIgZW4gYmVzdGVtdCBwZXJpb2RlIHZlZCBhbnZlbmRlbHNlIGFmIGRvYmJlbHRzYWxkb21ldG9kZW4gZWxsZXIgZW4gYW5kZW4gYWZza3Jpdm5pbmdzbWV0b2RlLCBzb20gZHUgYW5naXZlcg0KRElTQwkJCT0gRElTS09OVE8JCQkjIwlSZXR1cm5lcmVyIGV0IHbDpnJkaXBhcGlycyBkaXNrb250bw0KRE9MTEFSREUJCT0gS1IuREVDSU1BTAkJCSMjCUtvbnZlcnRlcmVyIGVuIGtyb25lcHJpcyB1ZHRyeWt0IHNvbSBicsO4ayB0aWwgZW4ga3JvbmVwcmlzIHVkdHJ5a3Qgc29tIGRlY2ltYWx0YWwNCkRPTExBUkZSCQk9IEtSLkJSw5hLCQkJIyMJS29udmVydGVyZXIgZW4ga3JvbmVwcmlzIHVkdHJ5a3Qgc29tIGRlY2ltYWx0YWwgdGlsIGVuIGtyb25lcHJpcyB1ZHRyeWt0IHNvbSBicsO4aw0KRFVSQVRJT04JCT0gVkFSSUdIRUQJCQkjIwlSZXR1cm5lcmVyIGRlbiDDpXJsaWdlIGzDuGJldGlkIGZvciBldCB2w6ZyZGlwYXBpciBtZWQgcGVyaW9kaXNrZSByZW50ZXVkYmV0YWxpbmdlcg0KRUZGRUNUCQkJPSBFRkZFS1RJVi5SRU5URQkJIyMJUmV0dXJuZXJlciBkZW4gw6VybGlnZSBlZmZla3RpdmUgcmVudGUNCkZWCQkJPSBGVgkJCQkjIwlSZXR1cm5lcmVyIGZyZW10aWRzdsOmcmRpZW4gYWYgZW4gaW52ZXN0ZXJpbmcNCkZWU0NIRURVTEUJCT0gRlZUQUJFTAkJCSMjCVJldHVybmVyZXIgZGVuIGZyZW10aWRpZ2UgdsOmcmRpIGFmIGVuIGhvdmVkc3RvbCwgbsOlciBkZXIgZXIgdGlsc2tyZXZldCByZW50ZSBvZyByZW50ZXMgcmVudGUgZWZ0ZXIgZm9yc2tlbGxpZ2UgcmVudGVzYXRzZXINCklOVFJBVEUJCQk9IFJFTlRFRk9ECQkJIyMJUmV0dXJuZXJlciByZW50ZW4gcMOlIGV0IGZ1bGR0IHVkIGludmVzdGVyZXQgdsOmcmRpcGFwaXINCklQTVQJCQk9IFIuWURFTFNFCQkJIyMJUmV0dXJuZXJlciByZW50ZW4gZnJhIGVuIGludmVzdGVyaW5nIGZvciBlbiBnaXZlbiBwZXJpb2RlDQpJUlIJCQk9IElBCQkJCSMjCVJldHVybmVyZXIgZGVuIGludGVybmUgcmVudGUgZm9yIGVuIHLDpmtrZSBwZW5nZXN0csO4bW1lDQpJU1BNVAkJCT0gSVNQTVQJCQkJIyMJQmVyZWduZXIgZGVuIGJldGFsdGUgcmVudGUgaSBsw7hiZXQgYWYgZW4gYmVzdGVtdCBpbnZlc3RlcmluZ3NwZXJpb2RlDQpNRFVSQVRJT04JCT0gTVZBUklHSEVECQkJIyMJUmV0dXJuZXJlciBNYWNhdWxleXMgbW9kaWZpY2VyZWRlIGzDuGJldGlkIGZvciBldCB2w6ZyZGlwYXBpciBtZWQgZW4gZm9ybW9kZXQgcGFyaSBww6Uga3IuIDEwMA0KTUlSUgkJCT0gTUlBCQkJCSMjCVJldHVybmVyZXIgZGVuIGludGVybmUgZm9ycmVudG5pbmcsIGh2b3IgcG9zaXRpdmUgb2cgbmVnYXRpdmUgcGVuZ2VzdHLDuG1tZSBmaW5hbnNpZXJlcyB0aWwgZm9yc2tlbGxpZyByZW50ZQ0KTk9NSU5BTAkJCT0gTk9NSU5FTAkJCSMjCVJldHVybmVyZXIgZGVuIMOlcmxpZ2Ugbm9taW5lbGxlIHJlbnRlDQpOUEVSCQkJPSBOUEVSCQkJCSMjCVJldHVybmVyZXIgYW50YWxsZXQgYWYgcGVyaW9kZXIgZm9yIGVuIGludmVzdGVyaW5nDQpOUFYJCQk9IE5VVElEU1bDhlJESQkJCSMjCVJldHVybmVyZXIgbmV0dG9udXRpZHN2w6ZyZGllbiBmb3IgZW4gaW52ZXN0ZXJpbmcgYmFzZXJldCBww6UgZW4gcsOma2tlIHBlcmlvZGlza2UgcGVuZ2VzdHLDuG1tZSBvZyBlbiBkaXNrb250ZXJpbmdzc2F0cw0KT0RERlBSSUNFCQk9IFVMSUdFLktVUlMuUMOFTFlERU5ERQkJIyMJUmV0dXJuZXJlciBrdXJzZW4gcHIuIGtyLiAxMDAgbm9taW5lbCB2w6ZyZGkgZm9yIGV0IHbDpnJkaXBhcGlyIG1lZCBlbiB1bGlnZSAoa29ydCBlbGxlciBsYW5nKSBmw7hyc3RlIHBlcmlvZGUNCk9EREZZSUVMRAkJPSBVTElHRS5Gw5hSU1RFLkFGS0FTVAkJIyMJUmV0dXJuZXJlciBhZmthc3RldCBmb3IgZXQgdsOmcmRpcGFwaXIgbWVkIHVsaWdlIGbDuHJzdGUgcGVyaW9kZQ0KT0RETFBSSUNFCQk9IFVMSUdFLlNJRFNURS5LVVJTCQkjIwlSZXR1cm5lcmVyIGt1cnNlbiBwci4ga3IuIDEwMCBub21pbmVsIHbDpnJkaSBmb3IgZXQgdsOmcmRpcGFwaXIgbWVkIHVsaWdlIHNpZHN0ZSBwZXJpb2RlDQpPRERMWUlFTEQJCT0gVUxJR0UuU0lEU1RFLkFGS0FTVAkJIyMJUmV0dXJuZXJlciBhZmthc3RldCBmb3IgZXQgdsOmcmRpcGFwaXIgbWVkIHVsaWdlIHNpZHN0ZSBwZXJpb2RlDQpQTVQJCQk9IFlERUxTRQkJCSMjCVJldHVybmVyZXIgcmVudGVuIGZyYSBlbiBpbnZlc3RlcmluZyBmb3IgZW4gZ2l2ZW4gcGVyaW9kZQ0KUFBNVAkJCT0gSC5ZREVMU0UJCQkjIwlSZXR1cm5lcmVyIHlkZWxzZW4gcMOlIGhvdmVkc3RvbGVuIGZvciBlbiBpbnZlc3RlcmluZyBpIGVuIGdpdmVuIHBlcmlvZGUNClBSSUNFCQkJPSBLVVJTCQkJCSMjCVJldHVybmVyZXIga3Vyc2VuIHByLiBrciAxMDAgbm9taW5lbCB2w6ZyZGkgZm9yIGV0IHbDpnJkaXBhcGlyIG1lZCBwZXJpb2Rpc2tlIHJlbnRldWRiZXRhbGluZ2VyDQpQUklDRURJU0MJCT0gS1VSUy5ESVNLT05UTwkJCSMjCVJldHVybmVyZXIga3Vyc2VuIHByLiBrciAxMDAgbm9taW5lbCB2w6ZyZGkgZm9yIGV0IGRpc2tvbnRlcmV0IHbDpnJkaXBhcGlyDQpQUklDRU1BVAkJPSBLVVJTLlVETMOYQgkJCSMjCVJldHVybmVyZXIga3Vyc2VuIHByLiBrciAxMDAgbm9taW5lbCB2w6ZyZGkgZm9yIGV0IHbDpnJkaXBhcGlyLCBodm9yIHJlbnRlbiB1ZGJldGFsZXMgdmVkIHBhcGlyZXRzIHVkbMO4Yg0KUFYJCQk9IE5WCQkJCSMjCVJldHVybmVyZXIgZGVuIG51dsOmcmVuZGUgdsOmcmRpIGFmIGVuIGludmVzdGVyaW5nDQpSQVRFCQkJPSBSRU5URQkJCQkjIwlSZXR1cm5lcmVyIHJlbnRlbiBpIGh2ZXIgcGVyaW9kZSBmb3IgZW4gYW5udWl0ZXQNClJFQ0VJVkVECQk9IE1PRFRBR0VULlZFRC5VREzDmEIJCSMjCVJldHVybmVyZXIgZGV0IGJlbMO4YiwgZGVyIG1vZHRhZ2VzIHZlZCB1ZGzDuGJldCBhZiBldCBmdWxkdCB1ZCBpbnZlc3RlcmV0IHbDpnJkaXBhcGlyDQpTTE4JCQk9IExBCQkJCSMjCVJldHVybmVyZXIgZGVuIGxpbmXDpnJlIGFmc2tyaXZuaW5nIGZvciBldCBha3RpdiBpIGVuIGVua2VsdCBwZXJpb2RlDQpTWUQJCQk9IMOFUlNBRlNLUklWTklORwkJIyMJUmV0dXJuZXJlciBkZW4gw6VybGlnZSBhZnNrcml2bmluZyBww6UgZXQgYWt0aXYgaSBlbiBiZXN0ZW10IHBlcmlvZGUNClRCSUxMRVEJCQk9IFNUQVRTT0JMSUdBVElPTgkJIyMJUmV0dXJuZXJlciBkZXQgb2JsaWdhdGlvbnPDpmt2aXZhbGVudGUgYWZrYXN0IGZvciBlbiBzdGF0c29ibGlnYXRpb24NClRCSUxMUFJJQ0UJCT0gU1RBVFNPQkxJR0FUSU9OLktVUlMJCSMjCVJldHVybmVyZXIga3Vyc2VuIHByLiBrciAxMDAgbm9taW5lbCB2w6ZyZGkgZm9yIGVuIHN0YXRzb2JsaWdhdGlvbg0KVEJJTExZSUVMRAkJPSBTVEFUU09CTElHQVRJT04uQUZLQVNUCSMjCVJldHVybmVyZXIgZW4gYWZrYXN0ZXQgcMOlIGVuIHN0YXRzb2JsaWdhdGlvbg0KVkRCCQkJPSBWU0EJCQkJIyMJUmV0dXJuZXJlciBhZnNrcml2bmluZ2VuIHDDpSBldCBha3RpdiBpIGVuIGFuZ2l2ZXQgcGVyaW9kZSwgaGVydW5kZXIgZGVscGVyaW9kZXIsIHZlZCBicnVnIGFmIGRvYmJlbHRzYWxkb21ldG9kZW4NClhJUlIJCQk9IElOVEVSTi5SRU5URQkJCSMjCVJldHVybmVyZXIgZGVuIGludGVybmUgcmVudGUgZm9yIGVuIHBsYW4gb3ZlciBwZW5nZXN0csO4bW1lLCBkZXIgaWtrZSBiZWjDuHZlciBhdCB2w6ZyZSBwZXJpb2Rpc2tlDQpYTlBWCQkJPSBORVRUTy5OVVRJRFNWw4ZSREkJCSMjCVJldHVybmVyZXIgbnV0aWRzdsOmcmRpZW4gZm9yIGVuIHBsYW4gb3ZlciBwZW5nZXN0csO4bW1lLCBkZXIgaWtrZSBiZWjDuHZlciBhdCB2w6ZyZSBwZXJpb2Rpc2tlDQpZSUVMRAkJCT0gQUZLQVNUCQkJIyMJUmV0dXJuZXJlciBhZmthc3RldCBmb3IgZXQgdsOmcmRpcGFwaXIgbWVkIHBlcmlvZGlza2UgcmVudGV1ZGJldGFsaW5nZXINCllJRUxERElTQwkJPSBBRktBU1QuRElTS09OVE8JCSMjCVJldHVybmVyZXIgZGV0IMOlcmxpZ2UgYWZrYXN0IGZvciBldCBkaXNrb250ZXJldCB2w6ZyZGlwYXBpciwgZi5la3MuIGVuIHN0YXRzb2JsaWdhdGlvbg0KWUlFTERNQVQJCT0gQUZLQVNULlVETMOYQlNEQVRPCQkjIwlSZXR1cm5lcmVyIGRldCDDpXJsaWdlIGFma2FzdCBmb3IgZXQgdsOmcmRpcGFwaXIsIGh2b3IgcmVudGVuIHVkYmV0YWxlcyB2ZWQgcGFwaXJldHMgdWRsw7hiDQoNCg0KIyMNCiMjCUluZm9ybWF0aW9uIGZ1bmN0aW9ucwkJCQlJbmZvcm1hdGlvbnNmdW5rdGlvbmVyDQojIw0KQ0VMTAkJCT0gQ0VMTEUJCQkJIyMJUmV0dXJuZXJlciBvcGx5c25pbmdlciBvbSBmb3JtYXRlcmluZywgcGxhY2VyaW5nIGVsbGVyIGluZGhvbGQgYWYgZW4gY2VsbGUNCkVSUk9SLlRZUEUJCT0gRkVKTFRZUEUJCQkjIwlSZXR1cm5lcmVyIGV0IHRhbCwgZGVyIHN2YXJlciB0aWwgZW4gZmVqbHR5cGUNCklORk8JCQk9IElORk8JCQkJIyMJUmV0dXJuZXJlciBvcGx5c25pbmdlciBvbSBkZXQgYWt0dWVsbGUgb3BlcmF0aXZtaWxqw7gNCklTQkxBTksJCQk9IEVSLlRPTQkJCSMjCVJldHVybmVyZXIgU0FORCwgaHZpcyB2w6ZyZGllbiBlciB0b20NCklTRVJSCQkJPSBFUi5GSkwJCQkjIwlSZXR1cm5lcmVyIFNBTkQsIGh2aXMgdsOmcmRpZW4gZXIgZW4gZmVqbHbDpnJkaSB1bmR0YWdlbiAjSS9UDQpJU0VSUk9SCQkJPSBFUi5GRUpMCQkJIyMJUmV0dXJuZXJlciBTQU5ELCBodmlzIHbDpnJkaWVuIGVyIGVuIGZlamx2w6ZyZGkNCklTRVZFTgkJCT0gRVIuTElHRQkJCSMjCVJldHVybmVyZXIgU0FORCwgaHZpcyB0YWxsZXQgZXIgbGlnZQ0KSVNMT0dJQ0FMCQk9IEVSLkxPR0lTSwkJCSMjCVJldHVybmVyZXIgU0FORCwgaHZpcyB2w6ZyZGllbiBlciBlbiBsb2dpc2sgdsOmcmRpDQpJU05BCQkJPSBFUi5JS0tFLlRJTEfDhk5HRUxJRwkJIyMJUmV0dXJuZXJlciBTQU5ELCBodmlzIHbDpnJkaWVuIGVyIGZlamx2w6ZyZGllbiAjSS9UDQpJU05PTlRFWFQJCT0gRVIuSUtLRS5URUtTVAkJCSMjCVJldHVybmVyZXIgU0FORCwgaHZpcyB2w6ZyZGllbiBpa2tlIGVyIHRla3N0DQpJU05VTUJFUgkJPSBFUi5UQUwJCQkjIwlSZXR1cm5lcmVyIFNBTkQsIGh2aXMgdsOmcmRpZW4gZXIgZXQgdGFsDQpJU09ERAkJCT0gRVIuVUxJR0UJCQkjIwlSZXR1cm5lcmVyIFNBTkQsIGh2aXMgdGFsbGV0IGVyIHVsaWdlDQpJU1JFRgkJCT0gRVIuUkVGRVJFTkNFCQkJIyMJUmV0dXJuZXJlciBTQU5ELCBodmlzIHbDpnJkaWVuIGVyIGVuIHJlZmVyZW5jZQ0KSVNURVhUCQkJPSBFUi5URUtTVAkJCSMjCVJldHVybmVyZXIgU0FORCwgaHZpcyB2w6ZyZGllbiBlciB0ZWtzdA0KTgkJCT0gVEFMCQkJCSMjCVJldHVybmVyZXIgZW4gdsOmcmRpIGtvbnZlcnRlcmV0IHRpbCBldCB0YWwNCk5BCQkJPSBJS0tFLlRJTEfDhk5HRUxJRwkJIyMJUmV0dXJuZXJlciBmZWpsdsOmcmRpZW4gI0kvVA0KVFlQRQkJCT0gVsOGUkRJVFlQRQkJCSMjCVJldHVybmVyZXIgZXQgdGFsLCBkZXIgYW5naXZlciBkYXRhdHlwZW4gZm9yIGVuIHbDpnJkaQ0KDQoNCiMjDQojIwlMb2dpY2FsIGZ1bmN0aW9ucwkJCQlMb2dpc2tlIGZ1bmt0aW9uZXINCiMjDQpBTkQJCQk9IE9HCQkJCSMjCVJldHVybmVyZXIgU0FORCwgaHZpcyBhbGxlIGFyZ3VtZW50ZXJuZSBlciBzYW5kZQ0KRkFMU0UJCQk9IEZBTFNLCQkJCSMjCVJldHVybmVyZXIgZGVuIGxvZ2lza2UgdsOmcmRpIEZBTFNLDQpJRgkJCT0gSFZJUwkJCQkjIwlBbmdpdmVyIGVuIGxvZ2lzayB0ZXN0LCBkZXIgc2thbCB1ZGbDuHJlcw0KSUZFUlJPUgkJCT0gSFZJUy5GRUpMCQkJIyMJUmV0dXJuZXJlciBlbiB2w6ZyZGksIGR1IGFuZ2l2ZXIsIGh2aXMgZW4gZm9ybWVsIGV2YXVsZXJlcyBzb20gZW4gZmVqbC4gUmV0dXJuZXJlciBpIG1vZHNhdCBmYWxkIHJlc3VsdGF0ZXQgYWYgZm9ybWxlbg0KTk9UCQkJPSBJS0tFCQkJCSMjCVZlbmRlciBhcmd1bWVudGV0cyBsb2dpayBvbQ0KT1IJCQk9IEVMTEVSCQkJCSMjCVJldHVybmVyZXQgdsOmcmRpZW4gU0FORCwgaHZpcyBtaW5kc3Qgw6l0IGFyZ3VtZW50IGVyIHNhbmR0DQpUUlVFCQkJPSBTQU5ECQkJCSMjCVJldHVybmVyZXIgZGVuIGxvZ2lza2UgdsOmcmRpIFNBTkQNCg0KDQojIw0KIyMJTG9va3VwIGFuZCByZWZlcmVuY2UgZnVuY3Rpb25zCQkJT3BzbGFncy0gb2cgcmVmZXJlbmNlZnVua3Rpb25lcg0KIyMNCkFERFJFU1MJCQk9IEFEUkVTU0UJCQkjIwlSZXR1cm5lcmVyIGVuIHJlZmVyZW5jZSBzb20gdGVrc3QgdGlsIGVuIGVua2VsdCBjZWxsZSBpIGV0IHJlZ25lYXJrDQpBUkVBUwkJCT0gT01Sw4VERVIJCQkjIwlSZXR1cm5lcmVyIGFudGFsbGV0IGFmIG9tcsOlZGVyIGkgZW4gcmVmZXJlbmNlDQpDSE9PU0UJCQk9IFbDhkxHCQkJCSMjCVbDpmxnZXIgZW4gdsOmcmRpIHDDpSBlbiBsaXN0ZSBtZWQgdsOmcmRpZXINCkNPTFVNTgkJCT0gS09MT05ORQkJCSMjCVJldHVybmVyZXIga29sb25uZW51bW1lcmV0IGkgZW4gcmVmZXJlbmNlDQpDT0xVTU5TCQkJPSBLT0xPTk5FUgkJCSMjCVJldHVybmVyZXIgYW50YWxsZXQgYWYga29sb25uZXIgaSBlbiByZWZlcmVuY2UNCkhMT09LVVAJCQk9IFZPUFNMQUcJCQkjIwlTw7hnZXIgaSBkZW4gw7h2ZXJzdGUgcsOma2tlIGFmIGVuIG1hdHJpeCBvZyByZXR1cm5lcmVyIHbDpnJkaWVuIGFmIGRlbiBhbmdpdm5lIGNlbGxlDQpIWVBFUkxJTksJCT0gSFlQRVJMSU5LCQkJIyMJT3ByZXR0ZXIgZW4gZ2VudmVqIGthbGRldCBldCBoeXBlcmxpbmssIGRlciDDpWJuZXIgZXQgZG9rdW1lbnQsIHNvbSBlciBsYWdyZXQgcMOlIGVuIG5ldHbDpnJrc3NlcnZlciwgcMOlIGV0IGludHJhbmV0IGVsbGVyIHDDpSBpbnRlcm5ldHRldA0KSU5ERVgJCQk9IElOREVLUwkJCSMjCUFudmVuZGVyIGV0IGluZGVrcyB0aWwgYXQgdsOmbGdlIGVuIHbDpnJkaSBmcmEgZW4gcmVmZXJlbmNlIGVsbGVyIGVuIG1hdHJpeA0KSU5ESVJFQ1QJCT0gSU5ESVJFS1RFCQkJIyMJUmV0dXJuZXJlciBlbiByZWZlcmVuY2UsIGRlciBlciBhbmdpdmV0IGFmIGVuIHRla3N0dsOmcmRpDQpMT09LVVAJCQk9IFNMw4UuT1AJCQkjIwlTw7hnZXIgdsOmcmRpZXIgaSBlbiB2ZWt0b3IgZWxsZXIgZW4gbWF0cml4DQpNQVRDSAkJCT0gU0FNTUVOTElHTgkJCSMjCVPDuGdlciB2w6ZyZGllciBpIGVuIHJlZmVyZW5jZSBlbGxlciBlbiBtYXRyaXgNCk9GRlNFVAkJCT0gRk9SU0tZRE5JTkcJCQkjIwlSZXR1cm5lcmVyIGVuIHJlZmVyZW5jZSBmb3Jza3VkdCBpIGZvcmhvbGQgdGlsIGVuIGdpdmVuIHJlZmVyZW5jZQ0KUk9XCQkJPSBSw4ZLS0UJCQkJIyMJUmV0dXJuZXJlciByw6Zra2VudW1tZXJldCBmb3IgZW4gcmVmZXJlbmNlDQpST1dTCQkJPSBSw4ZLS0VSCQkJIyMJUmV0dXJuZXJlciBhbnRhbGxldCBhZiByw6Zra2VyIGkgZW4gcmVmZXJlbmNlDQpSVEQJCQk9IFJURAkJCQkjIwlIZW50ZXIgcmVhbHRpZHNkYXRhIGZyYSBldCBwcm9ncmFtLCBkZXIgdW5kZXJzdMO4dHRlciBDT00tYXV0b21hdGlzZXJpbmcgKEF1dG9tYXRpb246IEVuIG1ldG9kZSB0aWwgYXQgYXJiZWpkZSBtZWQgb2JqZWt0ZXIgZnJhIGV0IGFuZGV0IHByb2dyYW0gZWxsZXIgdWR2aWtsaW5nc3bDpnJrdMO4ai4gQXV0b21hdGlvbiwgc29tIHRpZGxpZ2VyZSBibGV2IGthbGR0IE9MRSBBdXRvbWF0aW9uLCBlciBlbiBpbmR1c3RyaXN0YW5kYXJkIG9nIGVuIGZ1bmt0aW9uIGkgQ09NIChDb21wb25lbnQgT2JqZWN0IE1vZGVsKS4pDQpUUkFOU1BPU0UJCT0gVFJBTlNQT05FUgkJCSMjCVJldHVybmVyZXIgZW4gdHJhbnNwb25lcmV0IG1hdHJpeA0KVkxPT0tVUAkJCT0gTE9QU0xBRwkJCSMjCVPDuGdlciBpIMO4dmVyc3RlIHLDpmtrZSBhZiBlbiBtYXRyaXggb2cgZmx5dHRlciBww6UgdHbDpnJzIGFmIHLDpmtrZW4gZm9yIGF0IHJldHVybmVyZSBlbiBjZWxsZXbDpnJkaQ0KDQoNCiMjDQojIwlNYXRoIGFuZCB0cmlnb25vbWV0cnkgZnVuY3Rpb25zCQkJTWF0ZW1hdGlza2Ugb2cgdHJpZ29ub21ldHJpc2tlIGZ1bmt0aW9uZXINCiMjDQpBQlMJCQk9IEFCUwkJCQkjIwlSZXR1cm5lcmVyIGRlbiBhYnNvbHV0dGUgdsOmcmRpIGFmIGV0IHRhbA0KQUNPUwkJCT0gQVJDQ09TCQkJIyMJUmV0dXJuZXJlciBldCB0YWxzIGFyY3VzIGNvc2ludXMNCkFDT1NICQkJPSBBUkNDT1NICQkJIyMJUmV0dXJuZXJlciBkZW4gaW52ZXJzZSBoeXBlcmJvbHNrZSBjb3NpbnVzIGFmIHRhbA0KQVNJTgkJCT0gQVJDU0lOCQkJIyMJUmV0dXJuZXJlciBldCB0YWxzIGFyY3VzIHNpbnVzDQpBU0lOSAkJCT0gQVJDU0lOSAkJCSMjCVJldHVybmVyZXIgZGVuIGludmVyc2UgaHlwZXJib2xza2Ugc2ludXMgZm9yIHRhbA0KQVRBTgkJCT0gQVJDVEFOCQkJIyMJUmV0dXJuZXJlciBldCB0YWxzIGFyY3VzIHRhbmdlbnMNCkFUQU4yCQkJPSBBUkNUQU4yCQkJIyMJUmV0dXJuZXJlciBkZSBhbmdpdm5lIHgtIG9nIHkta29vcmRpbmF0ZXJzIGFyY3VzIHRhbmdlbnMNCkFUQU5ICQkJPSBBUkNUQU5ICQkJIyMJUmV0dXJuZXJlciBldCB0YWxzIGludmVyc2UgaHlwZXJib2xza2UgdGFuZ2Vucw0KQ0VJTElORwkJCT0gQUZSVU5ELkxPRlQJCQkjIwlBZnJ1bmRlciBldCB0YWwgdGlsIG7DpnJtZXN0ZSBoZWx0YWwgZWxsZXIgdGlsIG7DpnJtZXN0ZSBtdWx0aXBsdW0gYWYgYmV0eWRuaW5nDQpDT01CSU4JCQk9IEtPTUJJTgkJCSMjCVJldHVybmVyZXIgYW50YWxsZXQgYWYga29tYmluYXRpb25lciBmb3IgZXQgZ2l2ZXQgYW50YWwgb2JqZWt0ZXINCkNPUwkJCT0gQ09TCQkJCSMjCVJldHVybmVyZXIgZXQgdGFscyBjb3NpbnVzDQpDT1NICQkJPSBDT1NICQkJCSMjCVJldHVybmVyZXIgZGVuIGludmVyc2UgaHlwZXJib2xza2UgY29zaW51cyBhZiBldCB0YWwNCkRFR1JFRVMJCQk9IEdSQURFUgkJCSMjCUtvbnZlcnRlcmVyIHJhZGlhbmVyIHRpbCBncmFkZXINCkVWRU4JCQk9IExJR0UJCQkJIyMJUnVuZGVyIGV0IHRhbCBvcCB0aWwgbsOmcm1lc3RlIGxpZ2UgaGVsdGFsDQpFWFAJCQk9IEVLU1AJCQkJIyMJUmV0dXJuZXJlciBlIG9wbMO4ZnRldCB0aWwgZW4gcG90ZW5zIGFmIGV0IGFuZ2l2ZXQgdGFsDQpGQUNUCQkJPSBGQUtVTFRFVAkJCSMjCVJldHVybmVyZXIgZXQgdGFscyBmYWt1bHRldA0KRkFDVERPVUJMRQkJPSBET0JCRUxULkZBS1VMVEVUCQkjIwlSZXR1cm5lcmVyIGV0IHRhbHMgZG9iYmVsdGUgZmFrdWx0ZXQNCkZMT09SCQkJPSBBRlJVTkQuR1VMVgkJCSMjCVJ1bmRlciBldCB0YWwgbmVkIG1vZCBudWwNCkdDRAkJCT0gU1TDmFJTVEUuRsOGTExFUy5ESVZJU09SCSMjCVJldHVybmVyZXIgZGVuIHN0w7hyc3RlIGbDpmxsZXMgZGl2aXNvcg0KSU5UCQkJPSBIRUxUQUwJCQkjIwlOZWRydW5kZXIgZXQgdGFsIHRpbCBkZXQgbsOmcm1lc3RlIGhlbHRhbA0KTENNCQkJPSBNSU5EU1RFLkbDhkxMRVMuTVVMVElQTFVNCSMjCVJldHVybmVyZXIgZGV0IG1pbmRzdGUgZsOmbGxlcyBtdWx0aXBsdW0NCkxOCQkJPSBMTgkJCQkjIwlSZXR1cm5lcmVyIGV0IHRhbHMgbmF0dXJsaWdlIGxvZ2FyaXRtZQ0KTE9HCQkJPSBMT0cJCQkJIyMJUmV0dXJuZXJlciBsb2dhcml0bWVuIGZvciBldCB0YWwgcMOlIGdydW5kbGFnIGFmIGV0IGFuZ2l2ZXQgZ3J1bmR0YWwNCkxPRzEwCQkJPSBMT0cxMAkJCQkjIwlSZXR1cm5lcmVyIHRpdGFsc2xvZ2FyaXRtZW4gYWYgZXQgdGFsDQpNREVURVJNCQkJPSBNREVURVJNCQkJIyMJUmV0dXJuZXJlciBkZXRlcm1pbmFudGVuIGZvciBlbiBtYXRyaXgNCk1JTlZFUlNFCQk9IE1JTlZFUlQJCQkjIwlSZXR1cm5lcmVyIGRlbiBpbnZlcnNlIG1hdHJpeCBmb3IgZW4gbWF0cml4DQpNTVVMVAkJCT0gTVBST0RVS1QJCQkjIwlSZXR1cm5lcmVyIG1hdHJpeHByb2R1a3RldCBhZiB0byBtYXRyaXhlcg0KTU9ECQkJPSBSRVNUCQkJCSMjCVJldHVybmVyZXIgcmVzdHbDpnJkaWVuIGZyYSBkaXZpc2lvbg0KTVJPVU5ECQkJPSBNQUZSVU5ECQkJIyMJUmV0dXJuZXJlciBldCB0YWwgYWZydW5kZXQgdGlsIGRldCDDuG5za2VkZSBtdWx0aXBsdW0NCk1VTFRJTk9NSUFMCQk9IE1VTFRJTk9NSUFMCQkJIyMJUmV0dXJuZXJlciBldCBtdWx0aW5vbWlhbHQgdGFsc8OmdA0KT0RECQkJPSBVTElHRQkJCQkjIwlSdW5kZXIgZXQgdGFsIG9wIHRpbCBuw6ZybWVzdGUgdWxpZ2UgaGVsdGFsDQpQSQkJCT0gUEkJCQkJIyMJUmV0dXJuZXJlciB2w6ZyZGllbiBhZiBwaQ0KUE9XRVIJCQk9IFBPVEVOUwkJCSMjCVJldHVybmVyZXIgcmVzdWx0YXRldCBhZiBldCB0YWwgb3Bsw7hmdGV0IHRpbCBlbiBwb3RlbnMNClBST0RVQ1QJCQk9IFBST0RVS1QJCQkjIwlNdWx0aXBsaWNlcmVyIGFyZ3VtZW50ZXJuZQ0KUVVPVElFTlQJCT0gS1ZPVElFTlQJCQkjIwlSZXR1cm5lcmVyIGhlbHRhbHNkZWxlbiB2ZWQgZGl2aXNpb24NClJBRElBTlMJCQk9IFJBRElBTkVSCQkJIyMJS29udmVydGVyZXIgZ3JhZGVyIHRpbCByYWRpYW5lcg0KUkFORAkJCT0gU0xVTVAJCQkJIyMJUmV0dXJuZXJlciBldCB0aWxmw6ZsZGlndCB0YWwgbWVsbGVtIDAgb2cgMQ0KUkFOREJFVFdFRU4JCT0gU0xVTVAuTUVMTEVNCQkJIyMJUmV0dXJuZXJlciBldCB0aWxmw6ZsZGlndCB0YWwgbWVsbGVtIGRlIHRhbCwgZGVyIGFuZ2l2ZXMNClJPTUFOCQkJPSBST01FUlRBTAkJCSMjCUtvbnZlcnRlcmVyIGV0IGFyYWJlcnRhbCB0aWwgcm9tZXJ0YWwgc29tIHRla3N0DQpST1VORAkJCT0gQUZSVU5ECQkJIyMJQWZydW5kZXIgZXQgdGFsIHRpbCBldCBhbmdpdmV0IGFudGFsIGRlY2ltYWxlcg0KUk9VTkRET1dOCQk9IFJVTkQuTkVECQkJIyMJUnVuZGVyIGV0IHRhbCBuZWQgbW9kIG51bA0KUk9VTkRVUAkJCT0gUlVORC5PUAkJCSMjCVJ1bmRlciBldCB0YWwgb3AsIHbDpmsgZnJhIDAgKG51bCkNClNFUklFU1NVTQkJPSBTRVJJRVNVTQkJCSMjCVJldHVybmVyZXIgc3VtbWVuIGFmIGVuIHBvdGVuc3NlcmllIGJhc2VyZXQgcMOlIGVuIGZvcm1lbA0KU0lHTgkJCT0gRk9SVEVHTgkJCSMjCVJldHVybmVyZXIgZXQgdGFscyBmb3J0ZWduDQpTSU4JCQk9IFNJTgkJCQkjIwlSZXR1cm5lcmVyIGVuIGdpdmVuIHZpbmtlbHMgc2ludXN2w6ZyZGkNClNJTkgJCQk9IFNJTkgJCQkJIyMJUmV0dXJuZXJlciBkZW4gaHlwZXJib2xza2Ugc2ludXMgYWYgZXQgdGFsDQpTUVJUCQkJPSBLVlJPRAkJCQkjIwlSZXR1cm5lcmVyIGVuIHBvc2l0aXYga3ZhZHJhdHJvZA0KU1FSVFBJCQkJPSBLVlJPRFBJCQkJIyMJUmV0dXJuZXJlciBrdmFkcmF0cm9kZW4gYWYgKHRhbCAqIHBpOykNClNVQlRPVEFMCQk9IFNVQlRPVEFMCQkJIyMJUmV0dXJuZXJlciBlbiBzdWJ0b3RhbCBww6UgZW4gbGlzdGUgZWxsZXIgaSBlbiBkYXRhYmFzZQ0KU1VNCQkJPSBTVU0JCQkJIyMJTMOmZ2dlciBhcmd1bWVudGVybmUgc2FtbWVuDQpTVU1JRgkJCT0gU1VNLkhWSVMJCQkjIwlMw6ZnZ2VyIGRlIGNlbGxlciBzYW1tZW4sIGRlciBlciBzcGVjaWZpY2VyZXQgYWYgZXQgZ2l2ZXQga3JpdGVyaXVtLg0KU1VNSUZTCQkJPSBTVU0uSFZJU0VSCQkJIyMJTMOmZ2dlciBkZSBjZWxsZXIgaSBldCBvbXLDpWRlIHNhbW1lbiwgZGVyIG9wZnlsZGVyIGZsZXJlIGtyaXRlcmllci4NClNVTVBST0RVQ1QJCT0gU1VNUFJPRFVLVAkJCSMjCVJldHVybmVyZXIgc3VtbWVuIGFmIHByb2R1a3RlciBhZiBlbnMgbWF0cml4a29tcG9uZW50ZXINClNVTVNRCQkJPSBTVU1LVgkJCQkjIwlSZXR1cm5lcmVyIHN1bW1lbiBhZiBhcmd1bWVudGVybmVzIGt2YWRyYXRlcg0KU1VNWDJNWTIJCT0gU1VNWDJNWTIJCQkjIwlSZXR1cm5lcmVyIHN1bW1lbiBhZiBkaWZmZXJlbnNlbiBtZWxsZW0ga3ZhZHJhdGVyIGFmIGVucyB2w6ZyZGllciBpIHRvIG1hdHJpeGVyDQpTVU1YMlBZMgkJPSBTVU1YMlBZMgkJCSMjCVJldHVybmVyZXIgc3VtbWVuIGFmIHN1bW1lbiBhZiBrdmFkcmF0ZXIgYWYgdGlsc3ZhcmVuZGUgdsOmcmRpZXIgaSB0byBtYXRyaXhlcg0KU1VNWE1ZMgkJCT0gU1VNWE1ZMgkJCSMjCVJldHVybmVyZXIgc3VtbWVuIGFmIGt2YWRyYXRlciBhZiBkaWZmZXJlbnNlciBtZWxsZW0gZW5zIHbDpnJkaWVyIGkgdG8gbWF0cml4ZXINClRBTgkJCT0gVEFOCQkJCSMjCVJldHVybmVyZXIgZXQgdGFscyB0YW5nZW5zDQpUQU5ICQkJPSBUQU5ICQkJCSMjCVJldHVybmVyZXIgZXQgdGFscyBoeXBlcmJvbHNrZSB0YW5nZW5zDQpUUlVOQwkJCT0gQUZLT1JUCQkJIyMJQWZrb3J0ZXIgZXQgdGFsIHRpbCBldCBoZWx0YWwNCg0KDQojIw0KIyMJU3RhdGlzdGljYWwgZnVuY3Rpb25zCQkJCVN0YXRpc3Rpc2tlIGZ1bmt0aW9uZXINCiMjDQpBVkVERVYJCQk9IE1BRAkJCQkjIwlSZXR1cm5lcmVyIGRlbiBnZW5uZW1zbml0bGlnZSBudW1lcmlza2UgYWZ2aWdlbHNlIGZyYSBzdGlrcHLDuHZlbnMgbWlkZGVsdsOmcmRpDQpBVkVSQUdFCQkJPSBNSURERUwJCQkjIwlSZXR1cm5lcmVyIG1pZGRlbHbDpnJkaWVuIGFmIGFyZ3VtZW50ZXJuZQ0KQVZFUkFHRUEJCT0gTUlEREVMVgkJCSMjCVJldHVybmVyZXIgbWlkZGVsdsOmcmRpZW4gYWYgYXJndW1lbnRlcm5lIG9nIG1lZHRhZ2VyIHRhbCwgdGVrc3Qgb2cgbG9naXNrZSB2w6ZyZGllcg0KQVZFUkFHRUlGCQk9IE1JRERFTC5IVklTCQkJIyMJUmV0dXJuZXJlciBnZW5uZW1zbml0dGV0IChkZW4gYXJpdG1ldGlza2UgbWlkZGVsdsOmcmRpKSBhZiBhbGxlIGRlIGNlbGxlciwgZGVyIG9wZnlsZGVyIGV0IGdpdmV0IGtyaXRlcml1bSwgaSBldCBvbXLDpWRlDQpBVkVSQUdFSUZTCQk9IE1JRERFTC5IVklTRVIJCQkjIwlSZXR1cm5lcmVyIGdlbm5lbXNuaXR0ZXQgKGRlbiBhcml0bWV0aXNrZSBtaWRkZWx2w6ZyZGkpIGFmIGFsbGUgZGUgY2VsbGVyLCBkZXIgb3BmeWxkZXIgZmxlcmUga3JpdGVyaWVyLg0KQkVUQURJU1QJCT0gQkVUQUZPUkRFTElORwkJCSMjCVJldHVybmVyZXIgZGVuIGt1bXVsYXRpdmUgYmV0YWZvcmRlbGluZ3NmdW5rdGlvbg0KQkVUQUlOVgkJCT0gQkVUQUlOVgkJCSMjCVJldHVybmVyZXIgZGVuIGludmVyc2Uga3VtdWxhdGl2ZSBmb3JkZWxpbmdzZnVua3Rpb24gZm9yIGVuIGFuZ2l2ZXQgYmV0YWZvcmRlbGluZw0KQklOT01ESVNUCQk9IEJJTk9NSUFMRk9SREVMSU5HCQkjIwlSZXR1cm5lcmVyIHB1bmt0c2FuZHN5bmxpZ2hlZGVuIGZvciBiaW5vbWlhbGZvcmRlbGluZ2VuDQpDSElESVNUCQkJPSBDSElGT1JERUxJTkcJCQkjIwlSZXR1cm5lcmVyIGZyYWt0aWxzYW5kc3lubGlnaGVkZW4gZm9yIGVuIGNoaTItZm9yZGVsaW5nDQpDSElJTlYJCQk9IENISUlOVgkJCSMjCVJldHVybmVyZXIgZGVuIGludmVyc2UgZnJha3RpbHNhbmRzeW5saWdoZWQgZm9yIGVuIGNoaTItZm9yZGVsaW5nDQpDSElURVNUCQkJPSBDSElURVNUCQkJIyMJRm9yZXRhZ2VyIGVuIHRlc3QgZm9yIHVhZmjDpm5naWdoZWQNCkNPTkZJREVOQ0UJCT0gS09ORklERU5TSU5URVJWQUwJCSMjCVJldHVybmVyZXIgZXQga29uZmlkZW5zaW50ZXJ2YWwgZm9yIGVuIHBvcHVsYXRpb24NCkNPUlJFTAkJCT0gS09SUkVMQVRJT04JCQkjIwlSZXR1cm5lcmVyIGtvcnJlbGF0aW9uc2tvZWZmaWNpZW50ZW4gbWVsbGVtIHRvIGRhdGFzw6Z0DQpDT1VOVAkJCT0gVMOGTAkJCQkjIwlUw6ZsbGVyIGFudGFsbGV0IGFmIHRhbCBww6UgZW4gbGlzdGUgbWVkIGFyZ3VtZW50ZXINCkNPVU5UQQkJCT0gVMOGTFYJCQkJIyMJVMOmbGxlciBhbnRhbGxldCBhZiB2w6ZyZGllciBww6UgZW4gbGlzdGUgbWVkIGFyZ3VtZW50ZXINCkNPVU5UQkxBTksJCT0gQU5UQUwuQkxBTktFCQkJIyMJVMOmbGxlciBhbnRhbGxldCBhZiB0b21tZSBjZWxsZXIgaSBldCBvbXLDpWRlDQpDT1VOVElGCQkJPSBUw4ZMSFZJUwkJCSMjCVTDpmxsZXIgYW50YWxsZXQgYWYgY2VsbGVyLCBzb20gb3BmeWxkZXIgZGUgZ2l2bmUga3JpdGVyaWVyLCBpIGV0IG9tcsOlZGUNCkNPVU5USUZTCQk9IFTDhkwuSFZJU0VSCQkJIyMJVMOmbGxlciBhbnRhbGxldCBhZiBkZSBjZWxsZXIsIHNvbSBvcGZ5bGRlciBmbGVyZSBrcml0ZXJpZXIsIGkgZXQgb21yw6VkZQ0KQ09WQVIJCQk9IEtPVkFSSUFOUwkJCSMjCUJlcmVnbmVyIGtvdmFyaWFuc2VuIG1lbGxlbSB0byBzdG9rYXN0aXNrZSB2YXJpYWJsZXINCkNSSVRCSU5PTQkJPSBLUklUQklOT00JCQkjIwlSZXR1cm5lcmVyIGRlbiBtaW5kc3RlIHbDpnJkaSBmb3IgeCwgZm9yIGh2aWxrZW4gZGV0IGfDpmxkZXIsIGF0IGZvcmRlbGluZ3NmdW5rdGlvbmVuIGVyIG1pbmRyZSBlbmQgZWxsZXIgbGlnIG1lZCBrcml0ZXJpZXbDpnJkaWVuLg0KREVWU1EJCQk9IFNBSwkJCQkjIwlSZXR1cm5lcmVyIHN1bW1lbiBhZiBkZSBrdmFkcmVyZWRlIGFmdmlnZWxzZXIgZnJhIG1pZGRlbHbDpnJkaWVuDQpFWFBPTkRJU1QJCT0gRUtTUEZPUkRFTElORwkJCSMjCVJldHVybmVyZXIgZWtzcG9uZW50aWFsZm9yZGVsaW5nZW4NCkZESVNUCQkJPSBGRk9SREVMSU5HCQkJIyMJUmV0dXJuZXJlciBmcmFrdGlsc2FuZHN5bmxpZ2hlZGVuIGZvciBGLWZvcmRlbGluZ2VuDQpGSU5WCQkJPSBGSU5WCQkJCSMjCVJldHVybmVyZXIgZGVuIGludmVyc2UgZnJha3RpbHNhbmRzeW5saWdoZWQgZm9yIEYtZm9yZGVsaW5nZW4NCkZJU0hFUgkJCT0gRklTSEVSCQkJIyMJUmV0dXJuZXJlciBGaXNoZXItdHJhbnNmb3JtYXRpb25lbg0KRklTSEVSSU5WCQk9IEZJU0hFUklOVgkJCSMjCVJldHVybmVyZXIgZGVuIGludmVyc2UgRmlzaGVyLXRyYW5zZm9ybWF0aW9uDQpGT1JFQ0FTVAkJPSBQUk9HTk9TRQkJCSMjCVJldHVybmVyZXIgZW4gcHJvZ25vc2V2w6ZyZGkgYmFzZXJldCBww6UgbGluZcOmciB0ZW5kZW5zDQpGUkVRVUVOQ1kJCT0gRlJFS1ZFTlMJCQkjIwlSZXR1cm5lcmVyIGVuIGZyZWt2ZW5zZm9yZGVsaW5nIGkgZW4gc8O4amxldmVrdG9yDQpGVEVTVAkJCT0gRlRFU1QJCQkJIyMJUmV0dXJuZXJlciByZXN1bHRhdGV0IGFmIGVuIEYtdGVzdCB0aWwgc2FtbWVubGlnbmluZyBhZiB2YXJpYW5zDQpHQU1NQURJU1QJCT0gR0FNTUFGT1JERUxJTkcJCSMjCVJldHVybmVyZXIgZm9yZGVsaW5nc2Z1bmt0aW9uZW4gZm9yIGdhbW1hZm9yZGVsaW5nZW4NCkdBTU1BSU5WCQk9IEdBTU1BSU5WCQkJIyMJUmV0dXJuZXJlciBkZW4gaW52ZXJzZSBmb3JkZWxpbmdzZnVua3Rpb24gZm9yIGdhbW1hZm9yZGVsaW5nZW4NCkdBTU1BTE4JCQk9IEdBTU1BTE4JCQkjIwlSZXR1cm5lcmVyIGRlbiBuYXR1cmxpZ2UgbG9nYXJpdG1lIHRpbCBnYW1tYWZvcmRlbGluZ2VuLCBHKHgpDQpHRU9NRUFOCQkJPSBHRU9NSURERUxWw4ZSREkJCSMjCVJldHVybmVyZXIgZGV0IGdlb21ldHJpc2tlIGdlbm5lbXNuaXQNCkdST1dUSAkJCT0gRk9Sw5hHRUxTRQkJCSMjCVJldHVybmVyZXIgdsOmcmRpZXIgbGFuZ3MgZW4gZWtzcG9uZW50aWVsIHRlbmRlbnMNCkhBUk1FQU4JCQk9IEhBUk1JRERFTFbDhlJESQkJIyMJUmV0dXJuZXJlciBkZXQgaGFybW9uaXNrZSBnZW5uZW1zbml0DQpIWVBHRU9NRElTVAkJPSBIWVBHRU9GT1JERUxJTkcJCSMjCVJldHVybmVyZXIgcHVua3RzYW5kc3lubGlnaGVkZW4gaSBlbiBoeXBlcmdlb21ldHJpc2sgZm9yZGVsaW5nDQpJTlRFUkNFUFQJCT0gU0vDhlJJTkcJCQkjIwlSZXR1cm5lcmVyIGFmc2vDpnJpbmdzdsOmcmRpZW4gcMOlIHktYWtzZW4gaSBlbiBsaW5lw6ZyIHJlZ3Jlc3Npb24NCktVUlQJCQk9IFRPUFNURUpMCQkJIyMJUmV0dXJuZXJlciBrdXJ0b3Npc3bDpnJkaWVuIGZvciBlbiBzdG9rYXN0aXNrIHZhcmlhYmVsDQpMQVJHRQkJCT0gU1RPUgkJCQkjIwlSZXR1cm5lcmVyIGRlbiBrJ3RlIHN0w7hyc3RlIHbDpnJkaSBpIGV0IGRhdGFzw6Z0DQpMSU5FU1QJCQk9IExJTlJFR1IJCQkjIwlSZXR1cm5lcmVyIHBhcmFtZXRlcmVzdGltYXRlcm5lIGZvciBlbiBsaW5lw6ZyIHRlbmRlbnMNCkxPR0VTVAkJCT0gTE9HUkVHUgkJCSMjCVJldHVybmVyZXIgcGFyYW1ldGVyZXN0aW1hdGVybmUgZm9yIGVuIGVrc3BvbmVudGllbCB0ZW5kZW5zDQpMT0dJTlYJCQk9IExPR0lOVgkJCSMjCVJldHVybmVyZXIgZGVuIGludmVyc2UgZm9yZGVsaW5nc2Z1bmt0aW9uIGZvciBsb2dub3JtYWxmb3JkZWxpbmdlbg0KTE9HTk9STURJU1QJCT0gTE9HTk9STUZPUkRFTElORwkJIyMJUmV0dXJuZXJlciBmb3JkZWxpbmdzZnVua3Rpb25lbiBmb3IgbG9nbm9ybWFsZm9yZGVsaW5nZW4NCk1BWAkJCT0gTUFLUwkJCQkjIwlSZXR1cm5lcmVyIGRlbiBtYWtzaW1hbGUgdsOmcmRpIHDDpSBlbiBsaXN0ZSBtZWQgYXJndW1lbnRlci4NCk1BWEEJCQk9IE1BS1NWCQkJCSMjCVJldHVybmVyZXIgZGVuIG1ha3NpbWFsZSB2w6ZyZGkgcMOlIGVuIGxpc3RlIG1lZCBhcmd1bWVudGVyIG9nIG1lZHRhZ2VyIHRhbCwgdGVrc3Qgb2cgbG9naXNrZSB2w6ZyZGllcg0KTUVESUFOCQkJPSBNRURJQU4JCQkjIwlSZXR1cm5lcmVyIG1lZGlhbmVuIGZvciBkZSBhbmdpdm5lIHRhbA0KTUlOCQkJPSBNSU4JCQkJIyMJUmV0dXJuZXJlciBkZW4gbWluZHN0ZSB2w6ZyZGkgcMOlIGVuIGxpc3RlIG1lZCBhcmd1bWVudGVyLg0KTUlOQQkJCT0gTUlOVgkJCQkjIwlSZXR1cm5lcmVyIGRlbiBtaW5kc3RlIHbDpnJkaSBww6UgZW4gbGlzdGUgbWVkIGFyZ3VtZW50ZXIgb2cgbWVkdGFnZXIgdGFsLCB0ZWtzdCBvZyBsb2dpc2tlIHbDpnJkaWVyDQpNT0RFCQkJPSBIWVBQSUdTVAkJCSMjCVJldHVybmVyZXIgZGVuIGh5cHBpZ3N0ZSB2w6ZyZGkgaSBldCBkYXRhc8OmdA0KTkVHQklOT01ESVNUCQk9IE5FR0JJTk9NRk9SREVMSU5HCQkjIwlSZXR1cm5lcmVyIGRlbiBuZWdhdGl2ZSBiaW5vbWlhbGZvcmRlbGluZw0KTk9STURJU1QJCT0gTk9STUZPUkRFTElORwkJCSMjCVJldHVybmVyZXIgZm9yZGVsaW5nc2Z1bmt0aW9uZW4gZm9yIG5vcm1hbGZvcmRlbGluZ2VuDQpOT1JNSU5WCQkJPSBOT1JNSU5WCQkJIyMJUmV0dXJuZXJlciBkZW4gaW52ZXJzZSBmb3JkZWxpbmdzZnVua3Rpb24gZm9yIG5vcm1hbGZvcmRlbGluZ2VuDQpOT1JNU0RJU1QJCT0gU1RBTkRBUkROT1JNRk9SREVMSU5HCQkjIwlSZXR1cm5lcmVyIGZvcmRlbGluZ3NmdW5rdGlvbmVuIGZvciBzdGFuZGFyZG5vcm1hbGZvcmRlbGluZ2VuDQpOT1JNU0lOVgkJPSBTVEFOREFSRE5PUk1JTlYJCSMjCVJldHVybmVyZXIgZGVuIGludmVyc2UgZm9yZGVsaW5nc2Z1bmt0aW9uIGZvciBzdGFuZGFyZG5vcm1hbGZvcmRlbGluZ2VuDQpQRUFSU09OCQkJPSBQRUFSU09OCQkJIyMJUmV0dXJuZXJlciBQZWFyc29ucyBrb3JyZWxhdGlvbnNrb2VmZmljaWVudA0KUEVSQ0VOVElMRQkJPSBGUkFLVElMCQkJIyMJUmV0dXJuZXJlciBkZW4gayd0ZSBmcmFrdGlsIGZvciBkYXRhc8OmdHRldA0KUEVSQ0VOVFJBTksJCT0gUFJPQ0VOVFBMQURTCQkJIyMJUmV0dXJuZXJlciBkZW4gcHJvY2VudHVlbGxlIHJhbmcgZm9yIGVuIGdpdmVuIHbDpnJkaSBpIGV0IGRhdGFzw6Z0DQpQRVJNVVQJCQk9IFBFUk1VVAkJCSMjCVJldHVybmVyZXIgYW50YWxsZXQgYWYgcGVybXV0YXRpb25lciBmb3IgZXQgZ2l2ZXQgc8OmdCBvYmpla3Rlcg0KUE9JU1NPTgkJCT0gUE9JU1NPTgkJCSMjCVJldHVybmVyZXIgZm9yZGVsaW5nc2Z1bmt0aW9uZW4gZm9yIGVuIFBvaXNzb24tZm9yZGVsaW5nDQpQUk9CCQkJPSBTQU5EU1lOTElHSEVECQkJIyMJUmV0dXJuZXJlciBpbnRlcnZhbHNhbmRzeW5saWdoZWRlbg0KUVVBUlRJTEUJCT0gS1ZBUlRJTAkJCSMjCVJldHVybmVyZXIga3ZhcnRpbGVuIGkgZXQgZ2l2ZXQgZGF0YXPDpnQNClJBTksJCQk9IFBMQURTCQkJCSMjCVJldHVybmVyZXIgcmFuZ2VuIGZvciBldCB0YWwgcMOlIGVuIGxpc3RlIG1lZCB0YWwNClJTUQkJCT0gRk9SS0xBUklOR1NHUkFECQkjIwlSZXR1cm5lcmVyIFIyLXbDpnJkaWVuIGZyYSBlbiBzaW1wZWwgbGluZcOmciByZWdyZXNzaW9uDQpTS0VXCQkJPSBTS8OGVkhFRAkJCSMjCVJldHVybmVyZXIgc2vDpnZoZWRlbiBmb3IgZW4gc3Rva2FzdGlzayB2YXJpYWJlbA0KU0xPUEUJCQk9IEjDhkxETklORwkJCSMjCVJldHVybmVyZXIgZXN0aW1hdGV0IHDDpSBow6ZsZG5pbmdlbiBmcmEgZW4gc2ltcGVsIGxpbmXDpnIgcmVncmVzc2lvbg0KU01BTEwJCQk9IE1JTkRTVEUJCQkjIwlSZXR1cm5lcmVyIGRlbiBrJ3RlIG1pbmRzdGUgdsOmcmRpIGkgZGF0YXPDpnR0ZXQNClNUQU5EQVJESVpFCQk9IFNUQU5EQVJESVNFUgkJCSMjCVJldHVybmVyZXIgZW4gc3RhbmRhcmRpc2VyZXQgdsOmcmRpDQpTVERFVgkJCT0gU1REQUZWCQkJIyMJRXN0aW1lcmVyIHN0YW5kYXJkYWZ2aWdlbHNlbiBww6UgYmFzaXMgYWYgZW4gc3Rpa3Byw7h2ZQ0KU1RERVZBCQkJPSBTVERBRlZWCQkJIyMJQmVyZWduZXIgc3RhbmRhcmRhZnZpZ2Vsc2VuIHDDpSBiYXNpcyBhZiBlbiBwcsO4dmUgb2cgbWVkdGFnZXIgdGFsLCB0ZWtzdCBvZyBsb2dpc2tlIHbDpnJkaWVyDQpTVERFVlAJCQk9IFNUREFGVlAJCQkjIwlCZXJlZ25lciBzdGFuZGFyZGFmdmlnZWxzZW4gcMOlIGJhc2lzIGFmIGVuIGhlbCBwb3B1bGF0aW9uDQpTVERFVlBBCQkJPSBTVERBRlZQVgkJCSMjCUJlcmVnbmVyIHN0YW5kYXJkYWZ2aWdlbHNlbiBww6UgYmFzaXMgYWYgZW4gaGVsIHBvcHVsYXRpb24gb2cgbWVkdGFnZXIgdGFsLCB0ZWtzdCBvZyBsb2dpc2tlIHbDpnJkaWVyDQpTVEVZWAkJCT0gU1RGWVgJCQkJIyMJUmV0dXJuZXJlciBzdGFuZGFyZGFmdmlnZWxzZW4gZm9yIGRlIGVzdGltZXJlZGUgeS12w6ZyZGllciBpIGRlbiBzaW1wbGUgbGluZcOmcmUgcmVncmVzc2lvbg0KVERJU1QJCQk9IFRGT1JERUxJTkcJCQkjIwlSZXR1cm5lcmVyIGZvcmRlbGluZ3NmdW5rdGlvbmVuIGZvciBTdHVkZW50J3MgdC1mb3JkZWxpbmcNClRJTlYJCQk9IFRJTlYJCQkJIyMJUmV0dXJuZXJlciBkZW4gaW52ZXJzZSBmb3JkZWxpbmdzZnVua3Rpb24gZm9yIFN0dWRlbnQncyB0LWZvcmRlbGluZw0KVFJFTkQJCQk9IFRFTkRFTlMJCQkjIwlSZXR1cm5lcmVyIHbDpnJkaSB1bmRlciBhbnRhZ2Vsc2UgYWYgZW4gbGluZcOmciB0ZW5kZW5zDQpUUklNTUVBTgkJPSBUUklNTUlEREVMVsOGUkRJCQkjIwlSZXR1cm5lcmVyIGRlbiB0cmltbWVkZSBtaWRkZWx2w6ZyZGkgZm9yIGRhdGFzw6Z0dGV0DQpUVEVTVAkJCT0gVFRFU1QJCQkJIyMJUmV0dXJuZXJlciBkZW4gc2FuZHN5bmxpZ2hlZCwgZGVyIGVyIGZvcmJ1bmRldCBtZWQgU3R1ZGVudCdzIHQtdGVzdA0KVkFSCQkJPSBWQVJJQU5TCQkJIyMJQmVyZWduZXIgdmFyaWFuc2VuIHDDpSBiYXNpcyBhZiBlbiBwcsO4dmUNClZBUkEJCQk9IFZBUklBTlNWCQkJIyMJQmVyZWduZXIgdmFyaWFuc2VuIHDDpSBiYXNpcyBhZiBlbiBwcsO4dmUgb2cgbWVkdGFnZXIgdGFsLCB0ZWtzdCBvZyBsb2dpc2tlIHbDpnJkaWVyDQpWQVJQCQkJPSBWQVJJQU5TUAkJCSMjCUJlcmVnbmVyIHZhcmlhbnNlbiBww6UgYmFzaXMgYWYgaGVsZSBwb3B1bGF0aW9uZW4NClZBUlBBCQkJPSBWQVJJQU5TUFYJCQkjIwlCZXJlZ25lciB2YXJpYW5zZW4gcMOlIGJhc2lzIGFmIGhlbGUgcG9wdWxhdGlvbmVuIG9nIG1lZHRhZ2VyIHRhbCwgdGVrc3Qgb2cgbG9naXNrZSB2w6ZyZGllcg0KV0VJQlVMTAkJCT0gV0VJQlVMTAkJCSMjCVJldHVybmVyZXIgZm9yZGVsaW5nc2Z1bmt0aW9uZW4gZm9yIFdlaWJ1bGwtZm9yZGVsaW5nZW4NClpURVNUCQkJPSBaVEVTVAkJCQkjIwlSZXR1cm5lcmVyIHNhbmRzeW5saWdoZWRzdsOmcmRpZW4gdmVkIGVuIGVuLXNpZGV0IHotdGVzdA0KDQoNCiMjDQojIwlUZXh0IGZ1bmN0aW9ucwkJCQkJVGVrc3RmdW5rdGlvbmVyDQojIw0KQVNDCQkJPSBBU0MJCQkJIyMJw4ZuZHJlciBlbmdlbHNrZSB0ZWduIGkgZnVsZCBicmVkZGUgKGRvYmJlbHQtYnl0ZSkgZWxsZXIga2F0YWthbmEgaSBlbiB0ZWduc3RyZW5nIHRpbCB0ZWduIGkgaGFsdiBicmVkZGUgKGVua2VsdC1ieXRlKQ0KQkFIVFRFWFQJCT0gQkFIVFRFS1NUCQkJIyMJS29udmVydGVyZXIgZXQgdGFsIHRpbCB0ZWtzdCB2ZWQgaGrDpmxwIGFmIHZhbHV0YWZvcm1hdGV0IMOfIChiYWh0KQ0KQ0hBUgkJCT0gVEVHTgkJCQkjIwlSZXR1cm5lcmVyIGRldCB0ZWduLCBkZXIgc3ZhcmVyIHRpbCBrb2RlbnVtbWVyZXQNCkNMRUFOCQkJPSBSRU5TCQkJCSMjCUZqZXJuZXIgYWxsZSB0ZWduLCBkZXIgaWtrZSBrYW4gdWRza3JpdmVzLCBmcmEgdGVrc3QNCkNPREUJCQk9IEtPREUJCQkJIyMJUmV0dXJuZXJlciBlbiBudW1lcmlzayBrb2RlIGZvciBkZXQgZsO4cnN0ZSB0ZWduIGkgZW4gdGVrc3RzdHJlbmcNCkNPTkNBVEVOQVRFCQk9IFNBTU1FTkvDhkROSU5HCQkJIyMJU2FtbWVua8OmZGVyIGFkc2tpbGxpZ2UgdGVrc3RlbGVtZW50ZXIgdGlsIMOpdCB0ZWtzdGVsZW1lbnQNCkRPTExBUgkJCT0gS1IJCQkJIyMJS29udmVydGVyZXIgZXQgdGFsIHRpbCB0ZWtzdCB2ZWQgaGrDpmxwIGFmIHZhbHV0YWZvcm1hdGV0IGtyLiAoa3JvbmVyKQ0KRVhBQ1QJCQk9IEVLU0FLVAkJCSMjCUtvbnRyb2xsZXJlciwgb20gdG8gdGVrc3R2w6ZyZGllciBlciBpZGVudGlza2UNCkZJTkQJCQk9IEZJTkQJCQkJIyMJU8O4Z2VyIGVmdGVyIGVuIHRla3N0dsOmcmRpIGkgZW4gYW5kZW4gdGVrc3R2w6ZyZGkgKGRlciBza2VsbmVzIG1lbGxlbSBzdG9yZSBvZyBzbcOlIGJvZ3N0YXZlcikNCkZJTkRCCQkJPSBGSU5EQgkJCQkjIwlTw7hnZXIgZWZ0ZXIgZW4gdGVrc3R2w6ZyZGkgaSBlbiBhbmRlbiB0ZWtzdHbDpnJkaSAoZGVyIHNrZWxuZXMgbWVsbGVtIHN0b3JlIG9nIHNtw6UgYm9nc3RhdmVyKQ0KRklYRUQJCQk9IEZBU1QJCQkJIyMJRm9ybWF0ZXJlciBldCB0YWwgc29tIHRla3N0IG1lZCBldCBmYXN0IGFudGFsIGRlY2ltYWxlcg0KSklTCQkJPSBKSVMJCQkJIyMJw4ZuZHJlciBlbmdlbHNrZSB0ZWduIGkgaGFsdiBicmVkZGUgKGVua2VsdC1ieXRlKSBlbGxlciBrYXRha2FuYSBpIGVuIHRlZ25zdHJlbmcgdGlsIHRlZ24gaSBmdWxkIGJyZWRkZSAoZG9iYmVsdC1ieXRlKQ0KTEVGVAkJCT0gVkVOU1RSRQkJCSMjCVJldHVybmVyZXIgdGVnbmV0IGzDpm5nc3QgdGlsIHZlbnN0cmUgaSBlbiB0ZWtzdHbDpnJkaQ0KTEVGVEIJCQk9IFZFTlNUUkVCCQkJIyMJUmV0dXJuZXJlciB0ZWduZXQgbMOmbmdzdCB0aWwgdmVuc3RyZSBpIGVuIHRla3N0dsOmcmRpDQpMRU4JCQk9IEzDhk5HREUJCQkjIwlSZXR1cm5lcmVyIGFudGFsbGV0IGFmIHRlZ24gaSBlbiB0ZWtzdHN0cmVuZw0KTEVOQgkJCT0gTMOGTkdERUIJCQkjIwlSZXR1cm5lcmVyIGFudGFsbGV0IGFmIHRlZ24gaSBlbiB0ZWtzdHN0cmVuZw0KTE9XRVIJCQk9IFNNw4UuQk9HU1RBVkVSCQkJIyMJS29udmVydGVyZXIgdGVrc3QgdGlsIHNtw6UgYm9nc3RhdmVyDQpNSUQJCQk9IE1JRFQJCQkJIyMJUmV0dXJuZXJlciBldCBiZXN0ZW10IGFudGFsIHRlZ24gZnJhIGVuIHRla3N0c3RyZW5nIGZyYSBvZyBtZWQgZGVuIGFuZ2l2bmUgc3RhcnRwb3NpdGlvbg0KTUlEQgkJCT0gTUlEVEIJCQkJIyMJUmV0dXJuZXJlciBldCBiZXN0ZW10IGFudGFsIHRlZ24gZnJhIGVuIHRla3N0c3RyZW5nIGZyYSBvZyBtZWQgZGVuIGFuZ2l2bmUgc3RhcnRwb3NpdGlvbg0KUEhPTkVUSUMJCT0gRk9ORVRJU0sJCQkjIwlVZGRyYWdlciBkZSBmb25ldGlza2UgKGZ1cmlnYW5hKSB0ZWduIGZyYSBlbiB0ZWtzdHN0cmVuZw0KUFJPUEVSCQkJPSBTVE9SVC5GT1JCT0dTVEFWCQkjIwlLb252ZXJ0ZXJlciBmw7hyc3RlIGJvZ3N0YXYgaSBodmVydCBvcmQgaSB0ZWtzdGVuIHRpbCBzdG9ydCBib2dzdGF2DQpSRVBMQUNFCQkJPSBFUlNUQVQJCQkjIwlFcnN0YXR0ZXIgdGVnbiBpIHRla3N0DQpSRVBMQUNFQgkJPSBFUlNUQVRCCQkJIyMJRXJzdGF0dGVyIHRlZ24gaSB0ZWtzdA0KUkVQVAkJCT0gR0VOVEFHCQkJIyMJR2VudGFnZXIgdGVrc3QgZXQgZ2l2ZXQgYW50YWwgZ2FuZ2UNClJJR0hUCQkJPSBIw5hKUkUJCQkJIyMJUmV0dXJuZXJlciB0ZWduZXQgbMOmbmdzdGUgdGlsIGjDuGpyZSBpIGVuIHRla3N0dsOmcmRpDQpSSUdIVEIJCQk9IEjDmEpSRUIJCQkjIwlSZXR1cm5lcmVyIHRlZ25ldCBsw6ZuZ3N0ZSB0aWwgaMO4anJlIGkgZW4gdGVrc3R2w6ZyZGkNClNFQVJDSAkJCT0gU8OYRwkJCQkjIwlTw7hnZXIgZWZ0ZXIgZW4gdGVrc3R2w6ZyZGkgaSBlbiBhbmRlbiB0ZWtzdHbDpnJkaSAoZGVyIHNrZWxuZXMgaWtrZSBtZWxsZW0gc3RvcmUgb2cgc23DpSBib2dzdGF2ZXIpDQpTRUFSQ0hCCQkJPSBTw5hHQgkJCQkjIwlTw7hnZXIgZWZ0ZXIgZW4gdGVrc3R2w6ZyZGkgaSBlbiBhbmRlbiB0ZWtzdHbDpnJkaSAoZGVyIHNrZWxuZXMgaWtrZSBtZWxsZW0gc3RvcmUgb2cgc23DpSBib2dzdGF2ZXIpDQpTVUJTVElUVVRFCQk9IFVEU0tJRlQJCQkjIwlVZHNraWZ0ZXIgZ2FtbWVsIHRla3N0IG1lZCBueSB0ZWtzdCBpIGVuIHRla3N0c3RyZW5nDQpUCQkJPSBUCQkJCSMjCUtvbnZlcnRlcmVyIGFyZ3VtZW50ZXJuZSB0aWwgdGVrc3QNClRFWFQJCQk9IFRFS1NUCQkJCSMjCUZvcm1hdGVyZXIgZXQgdGFsIG9nIGtvbnZlcnRlcmVyIGRldCB0aWwgdGVrc3QNClRSSU0JCQk9IEZKRVJOLk9WRVJGTMOYRElHRS5CTEFOS0UJIyMJRmplcm5lciBtZWxsZW1ydW0gZnJhIHRla3N0DQpVUFBFUgkJCT0gU1RPUkUuQk9HU1RBVkVSCQkjIwlLb252ZXJ0ZXJlciB0ZWtzdCB0aWwgc3RvcmUgYm9nc3RhdmVyDQpWQUxVRQkJCT0gVsOGUkRJCQkJCSMjCUtvbnZlcnRlcmVyIGV0IHRla3N0YXJndW1lbnQgdGlsIGV0IHRhbA0K]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/locale/de/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/locale/de/config</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[77u/IyMNCiMjIFBIUEV4Y2VsDQojIw0NCiMjIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTEgUEhQRXhjZWwNCiMjDQojIyBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yDQojIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljDQojIyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXINCiMjIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLg0KIyMNCiMjIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLA0KIyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YNCiMjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VDQojIyBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLg0KIyMNCiMjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMNCiMjIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUNCiMjIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQ0KIyMNCiMjIEBjYXRlZ29yeSAgIFBIUEV4Y2VsDQojIyBAcGFja2FnZSAgICBQSFBFeGNlbF9TZXR0aW5ncw0KIyMgQGNvcHlyaWdodCAgQ29weXJpZ2h0IChjKSAyMDA2IC0gMjAxMSBQSFBFeGNlbCAoaHR0cDovL3d3dy5jb2RlcGxleC5jb20vUEhQRXhjZWwpDQojIyBAbGljZW5zZSAgICBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvb2xkLWxpY2Vuc2VzL2xncGwtMi4xLnR4dAlMR1BMDQojIyBAdmVyc2lvbiAgICAxLjcuNywgMjAxMi0wNS0xOQ0KIyMNCiMjDQoNCg0KQXJndW1lbnRTZXBhcmF0b3IJPSA7DQoNCg0KIyMNCiMjCShGb3IgZnV0dXJlIHVzZSkNCiMjDQpjdXJyZW5jeVN5bWJvbAk9IOKCrA0KDQoNCiMjDQojIwlFeGNlbCBFcnJvciBDb2RlcwkoRm9yIGZ1dHVyZSB1c2UpDQ0KIyMNCk5VTEwJPSAjTlVMTCENCkRJVjAJPSAjRElWLzAhDQpWQUxVRQk9ICNXRVJUIQ0KUkVGCT0gI0JFWlVHIQ0KTkFNRQk9ICNOQU1FPw0KTlVNCT0gI1pBSEwhDQpOQQk9ICNOVg0K]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/locale/de/functions</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[77u/IyMNCiMjIFBIUEV4Y2VsDQojIw0NCiMjIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTEgUEhQRXhjZWwNCiMjDQojIyBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yDQojIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljDQojIyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXINCiMjIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLg0KIyMNCiMjIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLA0KIyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YNCiMjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VDQojIyBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLg0KIyMNCiMjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMNCiMjIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUNCiMjIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQ0KIyMNCiMjIEBjYXRlZ29yeSAgIFBIUEV4Y2VsDQojIyBAcGFja2FnZSAgICBQSFBFeGNlbF9DYWxjdWxhdGlvbg0KIyMgQGNvcHlyaWdodCAgQ29weXJpZ2h0IChjKSAyMDA2IC0gMjAxMSBQSFBFeGNlbCAoaHR0cDovL3d3dy5jb2RlcGxleC5jb20vUEhQRXhjZWwpDQojIyBAbGljZW5zZSAgICBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvb2xkLWxpY2Vuc2VzL2xncGwtMi4xLnR4dAlMR1BMDQojIyBAdmVyc2lvbiAgICAxLjcuNywgMjAxMi0wNS0xOQ0KIyMNCiMjIERhdGEgaW4gdGhpcyBmaWxlIGRlcml2ZWQgZnJvbSBodHRwOi8vd3d3LnBpdWhhLmZpL2V4Y2VsLWZ1bmN0aW9uLW5hbWUtdHJhbnNsYXRpb24vDQojIw0KIyMNCg0KDQojIw0KIyMJQWRkLWluIGFuZCBBdXRvbWF0aW9uIGZ1bmN0aW9ucwkJCUFkZC1Jbi0gdW5kIEF1dG9tYXRpc2llcnVuZ3NmdW5rdGlvbmVuDQojIw0KR0VUUElWT1REQVRBCT0gUElWT1REQVRFTlpVT1JETkVOCQkJIyMJSW4gZWluZW0gUGl2b3RUYWJsZS1CZXJpY2h0IGdlc3BlaWNoZXJ0ZSBEYXRlbiB3ZXJkZW4genVyw7xja2dlZ2ViZW4uDQoNCg0KIyMNCiMjCUN1YmUgZnVuY3Rpb25zCQkJCQlDdWJlZnVua3Rpb25lbg0KIyMNCkNVQkVLUElNRU1CRVIJCT0gQ1VCRUtQSUVMRU1FTlQJCSMjCUdpYnQgTmFtZSwgRWlnZW5zY2hhZnQgdW5kIE1lYXN1cmUgZWluZXMgS2V5IFBlcmZvcm1hbmNlIEluZGljYXRvcnMgKEtQSSkgenVyw7xjayB1bmQgemVpZ3QgZGVuIE5hbWVuIHVuZCBkaWUgRWlnZW5zY2hhZnQgaW4gZGVyIFplbGxlIGFuLiBFaW4gS1BJIGlzdCBlaW4gcXVhbnRpZml6aWVyYmFyZXMgTWHDnywgd2llIHouIEIuIGRlciBtb25hdGxpY2hlIEJydXR0b2dld2lubiBvZGVyIGRpZSB2aWVydGVsasOkaHJsaWNoZSBNaXRhcmJlaXRlcmZsdWt0dWF0aW9uLCBtaXQgZGVzc2VuIEhpbGZlIGRhcyBMZWlzdHVuZ3N2ZXJoYWx0ZW4gZWluZXMgVW50ZXJuZWhtZW5zIMO8YmVyd2FjaHQgd2VyZGVuIGthbm4uDQpDVUJFTUVNQkVSCQk9IENVQkVFTEVNRU5UCQkJIyMJR2lidCBlaW4gRWxlbWVudCBvZGVyIGVpbiBUdXBsZSBpbiBlaW5lciBDdWJlaGllcmFyY2hpZSB6dXLDvGNrLiBXaXJkIHZlcndlbmRldCwgdW0genUgw7xiZXJwcsO8ZmVuLCBvYiBkYXMgRWxlbWVudCBvZGVyIFR1cGxlIGltIEN1YmUgdm9yaGFuZGVuIGlzdC4NCkNVQkVNRU1CRVJQUk9QRVJUWQk9IENVQkVFTEVNRU5URUlHRU5TQ0hBRlQJIyMJR2lidCBkZW4gV2VydCBlaW5lciBFbGVtZW50ZWlnZW5zY2hhZnQgaW0gQ3ViZSB6dXLDvGNrLiBXaXJkIHZlcndlbmRldCwgdW0genUgw7xiZXJwcsO8ZmVuLCBvYiBlaW4gRWxlbWVudG5hbWUgaW0gQ3ViZSB2b3JoYW5kZW4gaXN0LCB1bmQgdW0gZGllIGbDvHIgZGllc2VzIEVsZW1lbnQgYW5nZWdlYmVuZSBFaWdlbnNjaGFmdCB6dXLDvGNrenVnZWJlbi4NCkNVQkVSQU5LRURNRU1CRVIJPSBDVUJFUkFOR0VMRU1FTlQJCSMjCUdpYnQgZGFzIG4tdGUgb2RlciBuLXJhbmdpZ2UgRWxlbWVudCBpbiBlaW5lciBNZW5nZSB6dXLDvGNrLiBXaXJkIHZlcndlbmRldCwgdW0gbWluZGVzdGVucyBlaW4gRWxlbWVudCBpbiBlaW5lciBNZW5nZSB6dXLDvGNrenVnZWJlbiwgd2llIHouIEIuIGJlc3RlciBWZXJ0cmllYnNtaXRhcmJlaXRlciBvZGVyIDEwIGJlc3RlIEt1cnN0ZWlsbmVobWVyLg0KQ1VCRVNFVAkJCT0gQ1VCRU1FTkdFCQkJIyMJRGVmaW5pZXJ0IGVpbmUgYmVyZWNobmV0ZSBNZW5nZSBFbGVtZW50ZSBvZGVyIFR1cGxlcyBkdXJjaCBTZW5kZW4gZWluZXMgTWVuZ2VuYXVzZHJ1Y2tzIGFuIGRlbiBDdWJlIGF1ZiBkZW0gU2VydmVyLCBkZXIgZGllIE1lbmdlIGVyc3RlbGx0IHVuZCBhbiBNaWNyb3NvZnQgT2ZmaWNlIEV4Y2VsIHp1csO8Y2tnaWJ0Lg0KQ1VCRVNFVENPVU5UCQk9IENVQkVNRU5HRU5BTlpBSEwJCSMjCUdpYnQgZGllIEFuemFobCBkZXIgRWxlbWVudGUgaW4gZWluZXIgTWVuZ2UgenVyw7xjay4NCkNVQkVWQUxVRQkJPSBDVUJFV0VSVAkJCSMjCUdpYnQgZWluZW4gQWdncmVnYXR3ZXJ0IGF1cyBlaW5lbSBDdWJlIHp1csO8Y2suDQoNCg0KIyMNCiMjCURhdGFiYXNlIGZ1bmN0aW9ucwkJCQlEYXRlbmJhbmtmdW5rdGlvbmVuDQojIw0KREFWRVJBR0UJCT0gREJNSVRURUxXRVJUCQkJIyMJR2lidCBkZW4gTWl0dGVsd2VydCBkZXIgYXVzZ2V3w6RobHRlbiBEYXRlbmJhbmtlaW50csOkZ2UgenVyw7xjaw0KRENPVU5UCQkJPSBEQkFOWkFITAkJCSMjCVrDpGhsdCBkaWUgWmVsbGVuIG1pdCBaYWhsZW4gaW4gZWluZXIgRGF0ZW5iYW5rDQpEQ09VTlRBCQkJPSBEQkFOWkFITDIJCQkjIwlaw6RobHQgbmljaHQgbGVlcmUgWmVsbGVuIGluIGVpbmVyIERhdGVuYmFuaw0KREdFVAkJCT0gREJBVVNaVUcJCQkjIwlFeHRyYWhpZXJ0IGF1cyBlaW5lciBEYXRlbmJhbmsgZWluZW4gZWluemVsbmVuIERhdGVuc2F0eiwgZGVyIGRlbiBhbmdlZ2ViZW5lbiBLcml0ZXJpZW4gZW50c3ByaWNodA0KRE1BWAkJCT0gREJNQVgJCQkJIyMJR2lidCBkZW4gZ3LDtsOfdGVuIFdlcnQgYXVzIGF1c2dld8OkaGx0ZW4gRGF0ZW5iYW5rZWludHLDpGdlbiB6dXLDvGNrDQpETUlOCQkJPSBEQk1JTgkJCQkjIwlHaWJ0IGRlbiBrbGVpbnN0ZW4gV2VydCBhdXMgYXVzZ2V3w6RobHRlbiBEYXRlbmJhbmtlaW50csOkZ2VuIHp1csO8Y2sNCkRQUk9EVUNUCQk9IERCUFJPRFVLVAkJCSMjCU11bHRpcGxpemllcnQgZGllIFdlcnRlIGluIGVpbmVtIGJlc3RpbW10ZW4gRmVsZCBtaXQgRGF0ZW5zw6R0emVuLCBkaWUgZGVuIEtyaXRlcmllbiBpbiBlaW5lciBEYXRlbmJhbmsgZW50c3ByZWNoZW4NCkRTVERFVgkJCT0gREJTVERBQlcJCQkjIwlTY2jDpHR6dCBkaWUgU3RhbmRhcmRhYndlaWNodW5nIGF1ZiBkZXIgR3J1bmRsYWdlIGVpbmVyIFN0aWNocHJvYmUgYXVzIGF1c2dld8OkaGx0ZW4gRGF0ZW5iYW5rZWludHLDpGdlbg0KRFNUREVWUAkJCT0gREJTVERBQldOCQkJIyMJQmVyZWNobmV0IGRpZSBTdGFuZGFyZGFid2VpY2h1bmcgYXVmIGRlciBHcnVuZGxhZ2UgZGVyIEdydW5kZ2VzYW10aGVpdCBhdXNnZXfDpGhsdGVyIERhdGVuYmFua2VpbnRyw6RnZQ0KRFNVTQkJCT0gREJTVU1NRQkJCSMjCUFkZGllcnQgZGllIFphaGxlbiBpbiBkZXIgRmVsZHNwYWx0ZSBtaXQgRGF0ZW5zw6R0emVuIGluIGRlciBEYXRlbmJhbmssIGRpZSBkZW4gS3JpdGVyaWVuIGVudHNwcmVjaGVuDQpEVkFSCQkJPSBEQlZBUklBTloJCQkjIwlTY2jDpHR6dCBkaWUgVmFyaWFueiBhdWYgZGVyIEdydW5kbGFnZSBhdXNnZXfDpGhsdGVyIERhdGVuYmFua2VpbnRyw6RnZQ0KRFZBUlAJCQk9IERCVkFSSUFOWkVOCQkJIyMJQmVyZWNobmV0IGRpZSBWYXJpYW56IGF1ZiBkZXIgR3J1bmRsYWdlIGRlciBHcnVuZGdlc2FtdGhlaXQgYXVzZ2V3w6RobHRlciBEYXRlbmJhbmtlaW50csOkZ2UNCg0KDQojIw0KIyMJRGF0ZSBhbmQgdGltZSBmdW5jdGlvbnMJCQkJRGF0dW1zLSB1bmQgWmVpdGZ1bmt0aW9uZW4NCiMjDQpEQVRFCQkJPSBEQVRVTQkJCQkjIwlHaWJ0IGRpZSBmb3J0bGF1ZmVuZGUgWmFobCBlaW5lcyBiZXN0aW1tdGVuIERhdHVtcyB6dXLDvGNrDQpEQVRFVkFMVUUJCT0gREFUV0VSVAkJCSMjCVdhbmRlbHQgZWluIERhdHVtIGluIEZvcm0gdm9uIFRleHQgaW4gZWluZSBmb3J0bGF1ZmVuZGUgWmFobCB1bQ0KREFZCQkJPSBUQUcJCQkJIyMJV2FuZGVsdCBlaW5lIGZvcnRsYXVmZW5kZSBaYWhsIGluIGRlbiBUYWcgZGVzIE1vbmF0cyB1bQ0KREFZUzM2MAkJCT0gVEFHRTM2MAkJCSMjCUJlcmVjaG5ldCBkaWUgQW56YWhsIGRlciBUYWdlIHp3aXNjaGVuIHp3ZWkgRGF0dW1zYW5nYWJlbiBhdXNnZWhlbmQgdm9uIGVpbmVtIEphaHIsIGRhcyAzNjAgVGFnZSBoYXQNCkVEQVRFCQkJPSBFREFUVU0JCQkjIwlHaWJ0IGRpZSBmb3J0bGF1ZmVuZGUgWmFobCBkZXMgRGF0dW1zIHp1csO8Y2ssIGJlaSBkZW0gZXMgc2ljaCB1bSBkaWUgYW5nZWdlYmVuZSBBbnphaGwgdm9uIE1vbmF0ZW4gdm9yIG9kZXIgbmFjaCBkZW0gQW5mYW5nc3Rlcm1pbiBoYW5kZWx0DQpFT01PTlRICQkJPSBNT05BVFNFTkRFCQkJIyMJR2lidCBkaWUgZm9ydGxhdWZlbmRlIFphaGwgZGVzIGxldHp0ZW4gVGFncyBkZXMgTW9uYXRzIHZvciBvZGVyIG5hY2ggZWluZXIgZmVzdGdlbGVndGVuIEFuemFobCB2b24gTW9uYXRlbiB6dXLDvGNrDQpIT1VSCQkJPSBTVFVOREUJCQkjIwlXYW5kZWx0IGVpbmUgZm9ydGxhdWZlbmRlIFphaGwgaW4gZWluZSBTdHVuZGUgdW0NCk1JTlVURQkJCT0gTUlOVVRFCQkJIyMJV2FuZGVsdCBlaW5lIGZvcnRsYXVmZW5kZSBaYWhsIGluIGVpbmUgTWludXRlIHVtDQpNT05USAkJCT0gTU9OQVQJCQkJIyMJV2FuZGVsdCBlaW5lIGZvcnRsYXVmZW5kZSBaYWhsIGluIGVpbmVuIE1vbmF0IHVtDQpORVRXT1JLREFZUwkJPSBORVRUT0FSQkVJVFNUQUdFCQkjIwlHaWJ0IGRpZSBBbnphaGwgdm9uIGdhbnplbiBBcmJlaXRzdGFnZW4gendpc2NoZW4gendlaSBEYXR1bXN3ZXJ0ZW4genVyw7xjaw0KTk9XCQkJPSBKRVRaVAkJCQkjIwlHaWJ0IGRpZSBmb3J0bGF1ZmVuZGUgWmFobCBkZXMgYWt0dWVsbGVuIERhdHVtcyB1bmQgZGVyIGFrdHVlbGxlbiBVaHJ6ZWl0IHp1csO8Y2sNClNFQ09ORAkJCT0gU0VLVU5ERQkJCSMjCVdhbmRlbHQgZWluZSBmb3J0bGF1ZmVuZGUgWmFobCBpbiBlaW5lIFNla3VuZGUgdW0NClRJTUUJCQk9IFpFSVQJCQkJIyMJR2lidCBkaWUgZm9ydGxhdWZlbmRlIFphaGwgZWluZXIgYmVzdGltbXRlbiBVaHJ6ZWl0IHp1csO8Y2sNClRJTUVWQUxVRQkJPSBaRUlUV0VSVAkJCSMjCVdhbmRlbHQgZWluZSBVaHJ6ZWl0IGluIEZvcm0gdm9uIFRleHQgaW4gZWluZSBmb3J0bGF1ZmVuZGUgWmFobCB1bQ0KVE9EQVkJCQk9IEhFVVRFCQkJCSMjCUdpYnQgZGllIGZvcnRsYXVmZW5kZSBaYWhsIGRlcyBoZXV0aWdlbiBEYXR1bXMgenVyw7xjaw0KV0VFS0RBWQkJCT0gV09DSEVOVEFHCQkJIyMJV2FuZGVsdCBlaW5lIGZvcnRsYXVmZW5kZSBaYWhsIGluIGRlbiBXb2NoZW50YWcgdW0NCldFRUtOVU0JCQk9IEtBTEVOREVSV09DSEUJCQkjIwlXYW5kZWx0IGVpbmUgZm9ydGxhdWZlbmRlIFphaGwgaW4gZWluZSBaYWhsIHVtLCBkaWUgYW5naWJ0LCBpbiB3ZWxjaGUgV29jaGUgZWluZXMgSmFocmVzIGRhcyBhbmdlZ2ViZW5lIERhdHVtIGbDpGxsdA0KV09SS0RBWQkJCT0gQVJCRUlUU1RBRwkJCSMjCUdpYnQgZGllIGZvcnRsYXVmZW5kZSBaYWhsIGRlcyBEYXR1bXMgdm9yIG9kZXIgbmFjaCBlaW5lciBiZXN0aW1tdGVuIEFuemFobCB2b24gQXJiZWl0c3RhZ2VuIHp1csO8Y2sNCllFQVIJCQk9IEpBSFIJCQkJIyMJV2FuZGVsdCBlaW5lIGZvcnRsYXVmZW5kZSBaYWhsIGluIGVpbiBKYWhyIHVtDQpZRUFSRlJBQwkJPSBCUlRFSUxKQUhSRQkJCSMjCUdpYnQgZGllIEFuemFobCBkZXIgZ2FuemVuIFRhZ2Ugendpc2NoZW4gQXVzZ2FuZ3NkYXR1bSB1bmQgRW5kZGF0dW0gaW4gQnJ1Y2h0ZWlsZW4gdm9uIEphaHJlbiB6dXLDvGNrDQoNCg0KIyMNCiMjCUVuZ2luZWVyaW5nIGZ1bmN0aW9ucwkJCQlLb25zdHJ1a3Rpb25zZnVua3Rpb25lbg0KIyMNCkJFU1NFTEkJCQk9IEJFU1NFTEkJCQkjIwlHaWJ0IGRpZSBnZcOkbmRlcnRlIEJlc3NlbGZ1bmt0aW9uIEluKHgpIHp1csO8Y2sNCkJFU1NFTEoJCQk9IEJFU1NFTEoJCQkjIwlHaWJ0IGRpZSBCZXNzZWxmdW5rdGlvbiBKbih4KSB6dXLDvGNrDQpCRVNTRUxLCQkJPSBCRVNTRUxLCQkJIyMJR2lidCBkaWUgZ2XDpG5kZXJ0ZSBCZXNzZWxmdW5rdGlvbiBLbih4KSB6dXLDvGNrDQpCRVNTRUxZCQkJPSBCRVNTRUxZCQkJIyMJR2lidCBkaWUgQmVzc2VsZnVua3Rpb24gWW4oeCkgenVyw7xjaw0KQklOMkRFQwkJCT0gQklOSU5ERVoJCQkjIwlXYW5kZWx0IGVpbmUgYmluw6RyZSBaYWhsIChEdWFsemFobCkgaW4gZWluZSBkZXppbWFsZSBaYWhsIHVtDQpCSU4ySEVYCQkJPSBCSU5JTkhFWAkJCSMjCVdhbmRlbHQgZWluZSBiaW7DpHJlIFphaGwgKER1YWx6YWhsKSBpbiBlaW5lIGhleGFkZXppbWFsZSBaYWhsIHVtDQpCSU4yT0NUCQkJPSBCSU5JTk9LVAkJCSMjCVdhbmRlbHQgZWluZSBiaW7DpHJlIFphaGwgKER1YWx6YWhsKSBpbiBlaW5lIG9rdGFsZSBaYWhsIHVtDQpDT01QTEVYCQkJPSBLT01QTEVYRQkJCSMjCVdhbmRlbHQgZGVuIFJlYWwtIHVuZCBJbWFnaW7DpHJ0ZWlsIGluIGVpbmUga29tcGxleGUgWmFobCB1bQ0KQ09OVkVSVAkJCT0gVU1XQU5ERUxOCQkJIyMJV2FuZGVsdCBlaW5lIFphaGwgdm9uIGVpbmVtIE1hw59zeXN0ZW0gaW4gZWluIGFuZGVyZXMgdW0NCkRFQzJCSU4JCQk9IERFWklOQklOCQkJIyMJV2FuZGVsdCBlaW5lIGRlemltYWxlIFphaGwgaW4gZWluZSBiaW7DpHJlIFphaGwgKER1YWx6YWhsKSB1bQ0KREVDMkhFWAkJCT0gREVaSU5IRVgJCQkjIwlXYW5kZWx0IGVpbmUgZGV6aW1hbGUgWmFobCBpbiBlaW5lIGhleGFkZXppbWFsZSBaYWhsIHVtDQpERUMyT0NUCQkJPSBERVpJTk9LVAkJCSMjCVdhbmRlbHQgZWluZSBkZXppbWFsZSBaYWhsIGluIGVpbmUgb2t0YWxlIFphaGwgdW0NCkRFTFRBCQkJPSBERUxUQQkJCQkjIwnDnGJlcnByw7xmdCwgb2IgendlaSBXZXJ0ZSBnbGVpY2ggc2luZA0KRVJGCQkJPSBHQVVTU0ZFSExFUgkJCSMjCUdpYnQgZGllIEdhdXNzJ3NjaGUgRmVobGVyZnVua3Rpb24genVyw7xjaw0KRVJGQwkJCT0gR0FVU1NGS09NUEwJCQkjIwlHaWJ0IGRhcyBLb21wbGVtZW50IHp1ciBHYXVzcydzY2hlbiBGZWhsZXJmdW5rdGlvbiB6dXLDvGNrDQpHRVNURVAJCQk9IEdHQU5aWkFITAkJCSMjCcOcYmVycHLDvGZ0LCBvYiBlaW5lIFphaGwgZ3LDtsOfZXIgYWxzIGVpbiBnZWdlYmVuZXIgU2Nod2VsbGVud2VydCBpc3QNCkhFWDJCSU4JCQk9IEhFWElOQklOCQkJIyMJV2FuZGVsdCBlaW5lIGhleGFkZXppbWFsZSBaYWhsIGluIGVpbmUgQmluw6RyemFobCB1bQ0KSEVYMkRFQwkJCT0gSEVYSU5ERVoJCQkjIwlXYW5kZWx0IGVpbmUgaGV4YWRlemltYWxlIFphaGwgaW4gZWluZSBkZXppbWFsZSBaYWhsIHVtDQpIRVgyT0NUCQkJPSBIRVhJTk9LVAkJCSMjCVdhbmRlbHQgZWluZSBoZXhhZGV6aW1hbGUgWmFobCBpbiBlaW5lIE9rdGFsemFobCB1bQ0KSU1BQlMJCQk9IElNQUJTCQkJCSMjCUdpYnQgZGVuIEFic29sdXRiZXRyYWcgKE1vZHVsbykgZWluZXIga29tcGxleGVuIFphaGwgenVyw7xjaw0KSU1BR0lOQVJZCQk9IElNQUdJTsOEUlRFSUwJCQkjIwlHaWJ0IGRlbiBJbWFnaW7DpHJ0ZWlsIGVpbmVyIGtvbXBsZXhlbiBaYWhsIHp1csO8Y2sNCklNQVJHVU1FTlQJCT0gSU1BUkdVTUVOVAkJCSMjCUdpYnQgZGFzIEFyZ3VtZW50IFRoZXRhIHp1csO8Y2ssIGVpbmVuIFdpbmtlbCwgZGVyIGFscyBCb2dlbm1hw58gYXVzZ2VkcsO8Y2t0IHdpcmQNCklNQ09OSlVHQVRFCQk9IElNS09OSlVHSUVSVEUJCQkjIwlHaWJ0IGRpZSBrb25qdWdpZXJ0ZSBrb21wbGV4ZSBaYWhsIHp1IGVpbmVyIGtvbXBsZXhlbiBaYWhsIHp1csO8Y2sNCklNQ09TCQkJPSBJTUNPUwkJCQkjIwlHaWJ0IGRlbiBLb3NpbnVzIGVpbmVyIGtvbXBsZXhlbiBaYWhsIHp1csO8Y2sNCklNRElWCQkJPSBJTURJVgkJCQkjIwlHaWJ0IGRlbiBRdW90aWVudGVuIHp3ZWllciBrb21wbGV4ZXIgWmFobGVuIHp1csO8Y2sNCklNRVhQCQkJPSBJTUVYUAkJCQkjIwlHaWJ0IGRpZSBhbGdlYnJhaXNjaGUgRm9ybSBlaW5lciBpbiBleHBvbmVudGllbGxlciBTY2hyZWlid2Vpc2Ugdm9ybGllZ2VuZGVuIGtvbXBsZXhlbiBaYWhsIHp1csO8Y2sNCklNTE4JCQk9IElNTE4JCQkJIyMJR2lidCBkZW4gbmF0w7xybGljaGVuIExvZ2FyaXRobXVzIGVpbmVyIGtvbXBsZXhlbiBaYWhsIHp1csO8Y2sNCklNTE9HMTAJCQk9IElNTE9HMTAJCQkjIwlHaWJ0IGRlbiBMb2dhcml0aG11cyBlaW5lciBrb21wbGV4ZW4gWmFobCB6dXIgQmFzaXMgMTAgenVyw7xjaw0KSU1MT0cyCQkJPSBJTUxPRzIJCQkjIwlHaWJ0IGRlbiBMb2dhcml0aG11cyBlaW5lciBrb21wbGV4ZW4gWmFobCB6dXIgQmFzaXMgMiB6dXLDvGNrDQpJTVBPV0VSCQkJPSBJTUFQT1RFTloJCQkjIwlQb3RlbnppZXJ0IGVpbmUga29tcGxleGUgWmFobCBtaXQgZWluZXIgZ2FuemVuIFphaGwNCklNUFJPRFVDVAkJPSBJTVBST0RVS1QJCQkjIwlHaWJ0IGRhcyBQcm9kdWt0IHZvbiBrb21wbGV4ZW4gWmFobGVuIHp1csO8Y2sNCklNUkVBTAkJCT0gSU1SRUFMVEVJTAkJCSMjCUdpYnQgZGVuIFJlYWx0ZWlsIGVpbmVyIGtvbXBsZXhlbiBaYWhsIHp1csO8Y2sNCklNU0lOCQkJPSBJTVNJTgkJCQkjIwlHaWJ0IGRlbiBTaW51cyBlaW5lciBrb21wbGV4ZW4gWmFobCB6dXLDvGNrDQpJTVNRUlQJCQk9IElNV1VSWkVMCQkJIyMJR2lidCBkaWUgUXVhZHJhdHd1cnplbCBlaW5lciBrb21wbGV4ZW4gWmFobCB6dXLDvGNrDQpJTVNVQgkJCT0gSU1TVUIJCQkJIyMJR2lidCBkaWUgRGlmZmVyZW56IHp3aXNjaGVuIHp3ZWkga29tcGxleGVuIFphaGxlbiB6dXLDvGNrDQpJTVNVTQkJCT0gSU1TVU1NRQkJCSMjCUdpYnQgZGllIFN1bW1lIHZvbiBrb21wbGV4ZW4gWmFobGVuIHp1csO8Y2sNCk9DVDJCSU4JCQk9IE9LVElOQklOCQkJIyMJV2FuZGVsdCBlaW5lIG9rdGFsZSBaYWhsIGluIGVpbmUgYmluw6RyZSBaYWhsIChEdWFsemFobCkgdW0NCk9DVDJERUMJCQk9IE9LVElOREVaCQkJIyMJV2FuZGVsdCBlaW5lIG9rdGFsZSBaYWhsIGluIGVpbmUgZGV6aW1hbGUgWmFobCB1bQ0KT0NUMkhFWAkJCT0gT0tUSU5IRVgJCQkjIwlXYW5kZWx0IGVpbmUgb2t0YWxlIFphaGwgaW4gZWluZSBoZXhhZGV6aW1hbGUgWmFobCB1bQ0KDQoNCiMjDQojIwlGaW5hbmNpYWwgZnVuY3Rpb25zCQkJCUZpbmFuem1hdGhlbWF0aXNjaGUgRnVua3Rpb25lbg0KIyMNCkFDQ1JJTlQJCQk9IEFVRkdFTFpJTlMJCQkjIwlHaWJ0IGRpZSBhdWZnZWxhdWZlbmVuIFppbnNlbiAoU3TDvGNremluc2VuKSBlaW5lcyBXZXJ0cGFwaWVycyBtaXQgcGVyaW9kaXNjaGVuIFppbnN6YWhsdW5nZW4genVyw7xjaw0KQUNDUklOVE0JCT0gQVVGR0VMWklOU0YJCQkjIwlHaWJ0IGRpZSBhdWZnZWxhdWZlbmVuIFppbnNlbiAoU3TDvGNremluc2VuKSBlaW5lcyBXZXJ0cGFwaWVycyB6dXLDvGNrLCBkaWUgYmVpIEbDpGxsaWdrZWl0IGF1c2dlemFobHQgd2VyZGVuDQpBTU9SREVHUkMJCT0gQU1PUkRFR1JLCQkJIyMJR2lidCBkaWUgQWJzY2hyZWlidW5nIGbDvHIgZGllIGVpbnplbG5lbiBBYnNjaHJlaWJ1bmdzemVpdHLDpHVtZSBtaXRoaWxmZSBlaW5lcyBBYnNjaHJlaWJ1bmdza29lZmZpemllbnRlbiB6dXLDvGNrDQpBTU9STElOQwkJPSBBTU9STElORUFSSwkJCSMjCUdpYnQgZGllIEFic2NocmVpYnVuZyBmw7xyIGRpZSBlaW56ZWxuZW4gQWJzY2hyZWlidW5nc3plaXRyw6R1bWUgenVyw7xjaw0KQ09VUERBWUJTCQk9IFpJTlNURVJNVEFHVkEJCQkjIwlHaWJ0IGRpZSBBbnphaGwgZGVyIFRhZ2Ugdm9tIEFuZmFuZyBkZXMgWmluc3Rlcm1pbnMgYmlzIHp1bSBBYnJlY2hudW5nc3Rlcm1pbiB6dXLDvGNrDQpDT1VQREFZUwkJPSBaSU5TVEVSTVRBR0UJCQkjIwlHaWJ0IGRpZSBBbnphaGwgZGVyIFRhZ2UgZGVyIFppbnNwZXJpb2RlIHp1csO8Y2ssIGRpZSBkZW4gQWJyZWNobnVuZ3N0ZXJtaW4gZWluc2NobGllw590DQpDT1VQREFZU05DCQk9IFpJTlNURVJNVEFHTloJCQkjIwlHaWJ0IGRpZSBBbnphaGwgZGVyIFRhZ2Ugdm9tIEFicmVjaG51bmdzdGVybWluIGJpcyB6dW0gbsOkY2hzdGVuIFppbnN0ZXJtaW4genVyw7xjaw0KQ09VUE5DRAkJCT0gWklOU1RFUk1OWgkJCSMjCUdpYnQgZGFzIERhdHVtIGRlcyBlcnN0ZW4gWmluc3Rlcm1pbnMgbmFjaCBkZW0gQWJyZWNobnVuZ3N0ZXJtaW4genVyw7xjaw0KQ09VUE5VTQkJCT0gWklOU1RFUk1aQUhMCQkJIyMJR2lidCBkaWUgQW56YWhsIGRlciBaaW5zdGVybWluZSB6d2lzY2hlbiBBYnJlY2hudW5ncy0gdW5kIEbDpGxsaWdrZWl0c2RhdHVtIHp1csO8Y2sNCkNPVVBQQ0QJCQk9IFpJTlNURVJNVloJCQkjIwlHaWJ0IGRhcyBEYXR1bSBkZXMgbGV0enRlbiBaaW5zdGVybWlucyB2b3IgZGVtIEFicmVjaG51bmdzdGVybWluIHp1csO8Y2sNCkNVTUlQTVQJCQk9IEtVTVpJTlNaCQkJIyMJQmVyZWNobmV0IGRpZSBrdW11bGllcnRlbiBaaW5zZW4sIGRpZSB6d2lzY2hlbiB6d2VpIFBlcmlvZGVuIHp1IHphaGxlbiBzaW5kDQpDVU1QUklOQwkJPSBLVU1LQVBJVEFMCQkJIyMJQmVyZWNobmV0IGRpZSBhdWZnZWxhdWZlbmUgVGlsZ3VuZyBlaW5lcyBEYXJsZWhlbnMsIGRpZSB6d2lzY2hlbiB6d2VpIFBlcmlvZGVuIHp1IHphaGxlbiBpc3QNCkRCCQkJPSBHREEyCQkJCSMjCUdpYnQgZGllIGdlb21ldHJpc2NoLWRlZ3Jlc3NpdmUgQWJzY2hyZWlidW5nIGVpbmVzIFdpcnRzY2hhZnRzZ3V0cyBmw7xyIGVpbmUgYmVzdGltbXRlIFBlcmlvZGUgenVyw7xjaw0KRERCCQkJPSBHREEJCQkJIyMJR2lidCBkaWUgQWJzY2hyZWlidW5nIGVpbmVzIEFubGFnZWd1dHMgZsO8ciBlaW5lbiBhbmdlZ2ViZW5lbiBaZWl0cmF1bSB1bnRlciBWZXJ3ZW5kdW5nIGRlciBkZWdyZXNzaXZlbiBEb3BwZWxyYXRlbi1BYnNjaHJlaWJ1bmcgb2RlciBlaW5lcyBhbmRlcmVuIHZvbiBJaG5lbiBhbmdlZ2ViZW5lbiBBYnNjaHJlaWJ1bmdzdmVyZmFocmVucyB6dXLDvGNrDQpESVNDCQkJPSBESVNBR0lPCQkJIyMJR2lidCBkZW4gaW4gUHJvemVudCBhdXNnZWRyw7xja3RlbiBBYnppbnN1bmdzc2F0eiBlaW5lcyBXZXJ0cGFwaWVycyB6dXLDvGNrDQpET0xMQVJERQkJPSBOT1RJRVJVTkdERVoJCQkjIwlXYW5kZWx0IGVpbmUgTm90aWVydW5nLCBkaWUgYWxzIERlemltYWxicnVjaCBhdXNnZWRyw7xja3Qgd3VyZGUsIGluIGVpbmUgRGV6aW1hbHphaGwgdW0NCkRPTExBUkZSCQk9IE5PVElFUlVOR0JSVQkJCSMjCVdhbmRlbHQgZWluZSBOb3RpZXJ1bmcsIGRpZSBhbHMgRGV6aW1hbHphaGwgYXVzZ2VkcsO8Y2t0IHd1cmRlLCBpbiBlaW5lbiBEZXppbWFsYnJ1Y2ggdW0NCkRVUkFUSU9OCQk9IERVUkFUSU9OCQkJIyMJR2lidCBkaWUgasOkaHJsaWNoZSBEdXJhdGlvbiBlaW5lcyBXZXJ0cGFwaWVycyBtaXQgcGVyaW9kaXNjaGVuIFppbnN6YWhsdW5nZW4genVyw7xjaw0KRUZGRUNUCQkJPSBFRkZFS1RJVgkJCSMjCUdpYnQgZGllIGrDpGhybGljaGUgRWZmZWt0aXZ2ZXJ6aW5zdW5nIHp1csO8Y2sNCkZWCQkJPSBaVwkJCQkjIwlHaWJ0IGRlbiB6dWvDvG5mdGlnZW4gV2VydCAoRW5kd2VydCkgZWluZXIgSW52ZXN0aXRpb24genVyw7xjaw0KRlZTQ0hFRFVMRQkJPSBaVzIJCQkJIyMJR2lidCBkZW4gYXVmZ2V6aW5zdGVuIFdlcnQgZGVzIEFuZmFuZ3NrYXBpdGFscyBmw7xyIGVpbmUgUmVpaGUgcGVyaW9kaXNjaCB1bnRlcnNjaGllZGxpY2hlciBaaW5zc8OkdHplIHp1csO8Y2sNCklOVFJBVEUJCQk9IFpJTlNTQVRaCQkJIyMJR2lidCBkZW4gWmluc3NhdHogZWluZXMgdm9sbCBpbnZlc3RpZXJ0ZW4gV2VydHBhcGllcnMgenVyw7xjaw0KSVBNVAkJCT0gWklOU1oJCQkJIyMJR2lidCBkaWUgWmluc3phaGx1bmcgZWluZXIgSW52ZXN0aXRpb24gZsO8ciBkaWUgYW5nZWdlYmVuZSBQZXJpb2RlIHp1csO8Y2sNCklSUgkJCT0gSUtWCQkJCSMjCUdpYnQgZGVuIGludGVybmVuIFppbnNmdcOfIGVpbmVyIEludmVzdGl0aW9uIG9obmUgRmluYW56aWVydW5nc2tvc3RlbiBvZGVyIFJlaW52ZXN0aXRpb25zZ2V3aW5uZSB6dXLDvGNrDQpJU1BNVAkJCT0gSVNQTVQJCQkJIyMJQmVyZWNobmV0IGRpZSB3w6RocmVuZCBlaW5lcyBiZXN0aW1tdGVuIFplaXRyYXVtcyBmw7xyIGVpbmUgSW52ZXN0aXRpb24gZ2V6YWhsdGVuIFppbnNlbg0KTURVUkFUSU9OCQk9IE1EVVJBVElPTgkJCSMjCUdpYnQgZGllIGdlw6RuZGVydGUgRGF1ZXIgZsO8ciBlaW4gV2VydHBhcGllciBtaXQgZWluZW0gYW5nZW5vbW1lbmVuIE5lbm53ZXJ0IHZvbiAxMDAg4oKsIHp1csO8Y2sNCk1JUlIJCQk9IFFJS1YJCQkJIyMJR2lidCBkZW4gaW50ZXJuZW4gWmluc2Z1w58genVyw7xjaywgd29iZWkgcG9zaXRpdmUgdW5kIG5lZ2F0aXZlIFphaGx1bmdlbiB6dSB1bnRlcnNjaGllZGxpY2hlbiBTw6R0emVuIGZpbmFuemllcnQgd2VyZGVuDQpOT01JTkFMCQkJPSBOT01JTkFMCQkJIyMJR2lidCBkaWUgasOkaHJsaWNoZSBOb21pbmFsdmVyemluc3VuZyB6dXLDvGNrDQpOUEVSCQkJPSBaWlIJCQkJIyMJR2lidCBkaWUgQW56YWhsIGRlciBaYWhsdW5nc3BlcmlvZGVuIGVpbmVyIEludmVzdGl0aW9uIHp1csO8Y2sNCk5QVgkJCT0gTkJXCQkJCSMjCUdpYnQgZGVuIE5ldHRvYmFyd2VydCBlaW5lciBJbnZlc3RpdGlvbiBhdWYgQmFzaXMgcGVyaW9kaXNjaCBhbmZhbGxlbmRlciBaYWhsdW5nZW4gdW5kIGVpbmVzIEFiemluc3VuZ3NmYWt0b3JzIHp1csO8Y2sNCk9EREZQUklDRQkJPSBVTlJFR0VSLktVUlMJCQkjIwlHaWJ0IGRlbiBLdXJzIHBybyAxMDAg4oKsIE5lbm53ZXJ0IGVpbmVzIFdlcnRwYXBpZXJzIG1pdCBlaW5lbSB1bnJlZ2VsbcOkw59pZ2VuIGVyc3RlbiBaaW5zdGVybWluIHp1csO8Y2sNCk9EREZZSUVMRAkJPSBVTlJFR0VSLlJFTkQJCQkjIwlHaWJ0IGRpZSBSZW5kaXRlIGVpbmVzIFdlcnRwYXBpZXJzIG1pdCBlaW5lbSB1bnJlZ2VsbcOkw59pZ2VuIGVyc3RlbiBaaW5zdGVybWluIHp1csO8Y2sNCk9ERExQUklDRQkJPSBVTlJFR0xFLktVUlMJCQkjIwlHaWJ0IGRlbiBLdXJzIHBybyAxMDAg4oKsIE5lbm53ZXJ0IGVpbmVzIFdlcnRwYXBpZXJzIG1pdCBlaW5lbSB1bnJlZ2VsbcOkw59pZ2VuIGxldHp0ZW4gWmluc3Rlcm1pbiB6dXLDvGNrDQpPRERMWUlFTEQJCT0gVU5SRUdMRS5SRU5ECQkJIyMJR2lidCBkaWUgUmVuZGl0ZSBlaW5lcyBXZXJ0cGFwaWVycyBtaXQgZWluZW0gdW5yZWdlbG3DpMOfaWdlbiBsZXR6dGVuIFppbnN0ZXJtaW4genVyw7xjaw0KUE1UCQkJPSBSTVoJCQkJIyMJR2lidCBkaWUgcGVyaW9kaXNjaGUgWmFobHVuZyBmw7xyIGVpbmUgQW5udWl0w6R0IHp1csO8Y2sNClBQTVQJCQk9IEtBUFoJCQkJIyMJR2lidCBkaWUgS2FwaXRhbHLDvGNremFobHVuZyBlaW5lciBJbnZlc3RpdGlvbiBmw7xyIGVpbmUgYW5nZWdlYmVuZSBQZXJpb2RlIHp1csO8Y2sNClBSSUNFCQkJPSBLVVJTCQkJCSMjCUdpYnQgZGVuIEt1cnMgcHJvIDEwMCDigqwgTmVubndlcnQgZWluZXMgV2VydHBhcGllcnMgenVyw7xjaywgZGFzIHBlcmlvZGlzY2ggWmluc2VuIGF1c3phaGx0DQpQUklDRURJU0MJCT0gS1VSU0RJU0FHSU8JCQkjIwlHaWJ0IGRlbiBLdXJzIHBybyAxMDAg4oKsIE5lbm53ZXJ0IGVpbmVzIHVudmVyemluc2xpY2hlbiBXZXJ0cGFwaWVycyB6dXLDvGNrDQpQUklDRU1BVAkJPSBLVVJTRsOETExJRwkJCSMjCUdpYnQgZGVuIEt1cnMgcHJvIDEwMCDigqwgTmVubndlcnQgZWluZXMgV2VydHBhcGllcnMgenVyw7xjaywgZGFzIFppbnNlbiBhbSBGw6RsbGlna2VpdHNkYXR1bSBhdXN6YWhsdA0KUFYJCQk9IEJXCQkJCSMjCUdpYnQgZGVuIEJhcndlcnQgZWluZXIgSW52ZXN0aXRpb24genVyw7xjaw0KUkFURQkJCT0gWklOUwkJCQkjIwlHaWJ0IGRlbiBaaW5zc2F0eiBwcm8gWmVpdHJhdW0gZWluZXIgQW5udWl0w6R0IHp1csO8Y2sNClJFQ0VJVkVECQk9IEFVU1pBSExVTkcJCQkjIwlHaWJ0IGRlbiBBdXN6YWhsdW5nc2JldHJhZyBlaW5lcyB2b2xsIGludmVzdGllcnRlbiBXZXJ0cGFwaWVycyBhbSBGw6RsbGlna2VpdHN0ZXJtaW4genVyw7xjaw0KU0xOCQkJPSBMSUEJCQkJIyMJR2lidCBkaWUgbGluZWFyZSBBYnNjaHJlaWJ1bmcgZWluZXMgV2lydHNjaGFmdHNndXRzIHBybyBQZXJpb2RlIHp1csO8Y2sNClNZRAkJCT0gRElBCQkJCSMjCUdpYnQgZGllIGFyaXRobWV0aXNjaC1kZWdyZXNzaXZlIEFic2NocmVpYnVuZyBlaW5lcyBXaXJ0c2NoYWZ0c2d1dHMgZsO8ciBlaW5lIGJlc3RpbW10ZSBQZXJpb2RlIHp1csO8Y2sNClRCSUxMRVEJCQk9IFRCSUxMw4RRVUlWCQkJIyMJR2lidCBkaWUgUmVuZGl0ZSBmw7xyIGVpbiBXZXJ0cGFwaWVyIHp1csO8Y2sNClRCSUxMUFJJQ0UJCT0gVEJJTExLVVJTCQkJIyMJR2lidCBkZW4gS3VycyBwcm8gMTAwIOKCrCBOZW5ud2VydCBlaW5lcyBXZXJ0cGFwaWVycyB6dXLDvGNrDQpUQklMTFlJRUxECQk9IFRCSUxMUkVORElURQkJCSMjCUdpYnQgZGllIFJlbmRpdGUgZsO8ciBlaW4gV2VydHBhcGllciB6dXLDvGNrDQpWREIJCQk9IFZEQgkJCQkjIwlHaWJ0IGRpZSBkZWdyZXNzaXZlIEFic2NocmVpYnVuZyBlaW5lcyBXaXJ0c2NoYWZ0c2d1dHMgZsO8ciBlaW5lIGJlc3RpbW10ZSBQZXJpb2RlIG9kZXIgVGVpbHBlcmlvZGUgenVyw7xjaw0KWElSUgkJCT0gWElOVFpJTlNGVVNTCQkJIyMJR2lidCBkZW4gaW50ZXJuZW4gWmluc2Z1w58gZWluZXIgUmVpaGUgbmljaHQgcGVyaW9kaXNjaCBhbmZhbGxlbmRlciBaYWhsdW5nZW4genVyw7xjaw0KWE5QVgkJCT0gWEtBUElUQUxXRVJUCQkJIyMJR2lidCBkZW4gTmV0dG9iYXJ3ZXJ0IChLYXBpdGFsd2VydCkgZWluZXIgUmVpaGUgbmljaHQgcGVyaW9kaXNjaCBhbmZhbGxlbmRlciBaYWhsdW5nZW4genVyw7xjaw0KWUlFTEQJCQk9IFJFTkRJVEUJCQkjIwlHaWJ0IGRpZSBSZW5kaXRlIGVpbmVzIFdlcnRwYXBpZXJzIHp1csO8Y2ssIGRhcyBwZXJpb2Rpc2NoIFppbnNlbiBhdXN6YWhsdA0KWUlFTERESVNDCQk9IFJFTkRJVEVESVMJCQkjIwlHaWJ0IGRpZSBqw6RocmxpY2hlIFJlbmRpdGUgZWluZXMgdW52ZXJ6aW5zbGljaGVuIFdlcnRwYXBpZXJzIHp1csO8Y2sNCllJRUxETUFUCQk9IFJFTkRJVEVGw4RMTAkJCSMjCUdpYnQgZGllIGrDpGhybGljaGUgUmVuZGl0ZSBlaW5lcyBXZXJ0cGFwaWVycyB6dXLDvGNrLCBkYXMgWmluc2VuIGFtIEbDpGxsaWdrZWl0c2RhdHVtIGF1c3phaGx0DQoNCg0KIyMNCiMjCUluZm9ybWF0aW9uIGZ1bmN0aW9ucwkJCQlJbmZvcm1hdGlvbnNmdW5rdGlvbmVuDQojIw0KQ0VMTAkJCT0gWkVMTEUJCQkJIyMJR2lidCBJbmZvcm1hdGlvbmVuIHp1IEZvcm1hdGllcnVuZywgUG9zaXRpb24gb2RlciBJbmhhbHQgZWluZXIgWmVsbGUgenVyw7xjaw0KRVJST1IuVFlQRQkJPSBGRUhMRVIuVFlQCQkJIyMJR2lidCBlaW5lIFphaGwgenVyw7xjaywgZGllIGVpbmVtIEZlaGxlcnR5cCBlbnRzcHJpY2h0DQpJTkZPCQkJPSBJTkZPCQkJCSMjCUdpYnQgSW5mb3JtYXRpb25lbiB6dXIgYWt0dWVsbGVuIEJldHJpZWJzc3lzdGVtdW1nZWJ1bmcgenVyw7xjaw0KSVNCTEFOSwkJCT0gSVNUTEVFUgkJCSMjCUdpYnQgV0FIUiB6dXLDvGNrLCB3ZW5uIGRlciBXZXJ0IGxlZXIgaXN0DQpJU0VSUgkJCT0gSVNURkVITAkJCSMjCUdpYnQgV0FIUiB6dXLDvGNrLCB3ZW5uIGRlciBXZXJ0IGVpbiBiZWxpZWJpZ2VyIEZlaGxlcndlcnQgYXXDn2VyICNOL1YgaXN0DQpJU0VSUk9SCQkJPSBJU1RGRUhMRVIJCQkjIwlHaWJ0IFdBSFIgenVyw7xjaywgd2VubiBkZXIgV2VydCBlaW4gYmVsaWViaWdlciBGZWhsZXJ3ZXJ0IGlzdA0KSVNFVkVOCQkJPSBJU1RHRVJBREUJCQkjIwlHaWJ0IFdBSFIgenVyw7xjaywgd2VubiBlcyBzaWNoIHVtIGVpbmUgZ2VyYWRlIFphaGwgaGFuZGVsdA0KSVNMT0dJQ0FMCQk9IElTVExPRwkJCSMjCUdpYnQgV0FIUiB6dXLDvGNrLCB3ZW5uIGRlciBXZXJ0IGVpbiBXYWhyaGVpdHN3ZXJ0IGlzdA0KSVNOQQkJCT0gSVNUTlYJCQkJIyMJR2lidCBXQUhSIHp1csO8Y2ssIHdlbm4gZGVyIFdlcnQgZGVyIEZlaGxlcndlcnQgI04vViBpc3QNCklTTk9OVEVYVAkJPSBJU1RLVEVYVAkJCSMjCUdpYnQgV0FIUiB6dXLDvGNrLCB3ZW5uIGRlciBXZXJ0IGVpbiBFbGVtZW50IGlzdCwgZGFzIGtlaW5lbiBUZXh0IGVudGjDpGx0DQpJU05VTUJFUgkJPSBJU1RaQUhMCQkJIyMJR2lidCBXQUhSIHp1csO8Y2ssIHdlbm4gZGVyIFdlcnQgZWluZSBaYWhsIGlzdA0KSVNPREQJCQk9IElTVFVOR0VSQURFCQkJIyMJR2lidCBXQUhSIHp1csO8Y2ssIHdlbm4gZXMgc2ljaCB1bSBlaW5lIHVuZ2VyYWRlIFphaGwgaGFuZGVsdA0KSVNSRUYJCQk9IElTVEJFWlVHCQkJIyMJR2lidCBXQUhSIHp1csO8Y2ssIHdlbm4gZGVyIFdlcnQgZWluIEJlenVnIGlzdA0KSVNURVhUCQkJPSBJU1RURVhUCQkJIyMJR2lidCBXQUhSIHp1csO8Y2ssIHdlbm4gZGVyIFdlcnQgZWluIEVsZW1lbnQgaXN0LCBkYXMgVGV4dCBlbnRow6RsdA0KTgkJCT0gTgkJCQkjIwlHaWJ0IGRlbiBpbiBlaW5lIFphaGwgdW1nZXdhbmRlbHRlbiBXZXJ0IHp1csO8Y2sNCk5BCQkJPSBOVgkJCQkjIwlHaWJ0IGRlbiBGZWhsZXJ3ZXJ0ICNOViB6dXLDvGNrDQpUWVBFCQkJPSBUWVAJCQkJIyMJR2lidCBlaW5lIFphaGwgenVyw7xjaywgZGllIGRlbiBEYXRlbnR5cCBkZXMgYW5nZWdlYmVuZW4gV2VydHMgYW56ZWlndA0KDQoNCiMjDQojIwlMb2dpY2FsIGZ1bmN0aW9ucwkJCQlMb2dpc2NoZSBGdW5rdGlvbmVuDQojIw0KQU5ECQkJPSBVTkQJCQkJIyMJR2lidCBXQUhSIHp1csO8Y2ssIHdlbm4gYWxsZSB6dWdlaMO2cmlnZW4gQXJndW1lbnRlIFdBSFIgc2luZA0KRkFMU0UJCQk9IEZBTFNDSAkJCSMjCUdpYnQgZGVuIFdhaHJoZWl0c3dlcnQgRkFMU0NIIHp1csO8Y2sNCklGCQkJPSBXRU5OCQkJCSMjCUdpYnQgZWluZW4gbG9naXNjaGVuIFRlc3QgenVtIEF1c2bDvGhyZW4gYW4NCklGRVJST1IJCQk9IFdFTk5GRUhMRVIJCQkjIwlHaWJ0IGVpbmVuIHZvbiBJaG5lbiBmZXN0Z2VsZWd0ZW4gV2VydCB6dXLDvGNrLCB3ZW5uIGRpZSBBdXN3ZXJ0dW5nIGRlciBGb3JtZWwgenUgZWluZW0gRmVobGVyIGbDvGhydDsgYW5kZXJuZmFsbHMgd2lyZCBkYXMgRXJnZWJuaXMgZGVyIEZvcm1lbCB6dXLDvGNrZ2VnZWJlbg0KTk9UCQkJPSBOSUNIVAkJCQkjIwlLZWhydCBkZW4gV2FocmhlaXRzd2VydCBkZXIgenVnZWjDtnJpZ2VuIEFyZ3VtZW50ZSB1bQ0KT1IJCQk9IE9ERVIJCQkJIyMJR2lidCBXQUhSIHp1csO8Y2ssIHdlbm4gZWluIEFyZ3VtZW50IFdBSFIgaXN0DQpUUlVFCQkJPSBXQUhSCQkJCSMjCUdpYnQgZGVuIFdhaHJoZWl0c3dlcnQgV0FIUiB6dXLDvGNrDQoNCg0KIyMNCiMjCUxvb2t1cCBhbmQgcmVmZXJlbmNlIGZ1bmN0aW9ucwkJCU5hY2hzY2hsYWdlLSB1bmQgVmVyd2Vpc2Z1bmt0aW9uZW4NCiMjDQpBRERSRVNTCQkJPSBBRFJFU1NFCQkJIyMJR2lidCBlaW5lbiBCZXp1ZyBhdWYgZWluZSBlaW56ZWxuZSBaZWxsZSBpbiBlaW5lbSBUYWJlbGxlbmJsYXR0IGFscyBUZXh0IHp1csO8Y2sNCkFSRUFTCQkJPSBCRVJFSUNIRQkJCSMjCUdpYnQgZGllIEFuemFobCBkZXIgaW5uZXJoYWxiIGVpbmVzIEJlenVncyBhdWZnZWbDvGhydGVuIEJlcmVpY2hlIHp1csO8Y2sNCkNIT09TRQkJCT0gV0FITAkJCQkjIwlXw6RobHQgZWluZW4gV2VydCBhdXMgZWluZSBMaXN0ZSBtaXQgV2VydGVuIGF1cw0KQ09MVU1OCQkJPSBTUEFMVEUJCQkjIwlHaWJ0IGRpZSBTcGFsdGVubnVtbWVyIGVpbmVzIEJlenVncyB6dXLDvGNrDQpDT0xVTU5TCQkJPSBTUEFMVEVOCQkJIyMJR2lidCBkaWUgQW56YWhsIGRlciBTcGFsdGVuIGluIGVpbmVtIEJlenVnIHp1csO8Y2sNCkhMT09LVVAJCQk9IEhWRVJXRUlTCQkJIyMJU3VjaHQgaW4gZGVyIG9iZXJzdGVuIFplaWxlIGVpbmVyIE1hdHJpeCB1bmQgZ2lidCBkZW4gV2VydCBkZXIgYW5nZWdlYmVuZW4gWmVsbGUgenVyw7xjaw0KSFlQRVJMSU5LCQk9IEhZUEVSTElOSwkJCSMjCUVyc3RlbGx0IGVpbmUgVmVya27DvHBmdW5nLCDDvGJlciBkaWUgZWluIGF1ZiBlaW5lbSBOZXR6d2Vya3NlcnZlciwgaW4gZWluZW0gSW50cmFuZXQgb2RlciBpbSBJbnRlcm5ldCBnZXNwZWljaGVydGVzIERva3VtZW50IGdlw7ZmZm5ldCB3aXJkDQpJTkRFWAkJCT0gSU5ERVgJCQkJIyMJVmVyd2VuZGV0IGVpbmVuIEluZGV4LCB1bSBlaW5lbiBXZXJ0IGF1cyBlaW5lbSBCZXp1ZyBvZGVyIGVpbmVyIE1hdHJpeCBhdXN6dXfDpGhsZW4NCklORElSRUNUCQk9IElORElSRUtUCQkJIyMJR2lidCBlaW5lbiBCZXp1ZyB6dXLDvGNrLCBkZXIgdm9uIGVpbmVtIFRleHR3ZXJ0IGFuZ2VnZWJlbiB3aXJkDQpMT09LVVAJCQk9IExPT0tVUAkJCSMjCVN1Y2h0IFdlcnRlIGluIGVpbmVtIFZla3RvciBvZGVyIGVpbmVyIE1hdHJpeA0KTUFUQ0gJCQk9IFZFUkdMRUlDSAkJCSMjCVN1Y2h0IFdlcnRlIGluIGVpbmVtIEJlenVnIG9kZXIgZWluZXIgTWF0cml4DQpPRkZTRVQJCQk9IEJFUkVJQ0guVkVSU0NISUVCRU4JCSMjCUdpYnQgZWluZW4gQmV6dWdvZmZzZXQgYXVzIGVpbmVtIGdlZ2ViZW5lbiBCZXp1ZyB6dXLDvGNrDQpST1cJCQk9IFpFSUxFCQkJCSMjCUdpYnQgZGllIFplaWxlbm51bW1lciBlaW5lcyBCZXp1Z3MgenVyw7xjaw0KUk9XUwkJCT0gWkVJTEVOCQkJIyMJR2lidCBkaWUgQW56YWhsIGRlciBaZWlsZW4gaW4gZWluZW0gQmV6dWcgenVyw7xjaw0KUlRECQkJPSBSVEQJCQkJIyMJUnVmdCBFY2h0emVpdGRhdGVuIHZvbiBlaW5lbSBQcm9ncmFtbSBhYiwgZGFzIGRpZSBDT00tQXV0b21hdGlzaWVydW5nIChBdXRvbWF0aXNpZXJ1bmc6IEVpbiBWZXJmYWhyZW4sIGJlaSBkZW0gYXVzIGVpbmVyIEFud2VuZHVuZyBvZGVyIGVpbmVtIEVudHdpY2tsdW5nc3Rvb2wgaGVyYXVzIG1pdCBkZW4gT2JqZWt0ZW4gZWluZXIgYW5kZXJlbiBBbndlbmR1bmcgZ2VhcmJlaXRldCB3aXJkLiBEaWUgZnLDvGhlciBhbHMgT0xFLUF1dG9tYXRpc2llcnVuZyBiZXplaWNobmV0ZSBBdXRvbWF0aXNpZXJ1bmcgaXN0IGVpbiBJbmR1c3RyaWVzdGFuZGFyZCB1bmQgZWluZSBGdW5rdGlvbiB2b24gQ09NIChDb21wb25lbnQgT2JqZWN0IE1vZGVsKS4pIHVudGVyc3TDvHR6dA0KVFJBTlNQT1NFCQk9IE1UUkFOUwkJCSMjCUdpYnQgZGllIHRyYW5zcG9uaWVydGUgTWF0cml4IGVpbmVyIE1hdHJpeCB6dXLDvGNrDQpWTE9PS1VQCQkJPSBTVkVSV0VJUwkJCSMjCVN1Y2h0IGluIGRlciBlcnN0ZW4gU3BhbHRlIGVpbmVyIE1hdHJpeCB1bmQgYXJiZWl0ZXQgc2ljaCBkdXJjaCBkaWUgWmVpbGUsIHVtIGRlbiBXZXJ0IGVpbmVyIFplbGxlIHp1csO8Y2t6dWdlYmVuDQoNCg0KIyMNCiMjCU1hdGggYW5kIHRyaWdvbm9tZXRyeSBmdW5jdGlvbnMJCQlNYXRoZW1hdGlzY2hlIHVuZCB0cmlnb25vbWV0cmlzY2hlIEZ1bmt0aW9uZW4NCiMjDQpBQlMJCQk9IEFCUwkJCQkjIwlHaWJ0IGRlbiBBYnNvbHV0d2VydCBlaW5lciBaYWhsIHp1csO8Y2sNCkFDT1MJCQk9IEFSQ0NPUwkJCSMjCUdpYnQgZGVuIEFya3Vza29zaW51cyBlaW5lciBaYWhsIHp1csO8Y2sNCkFDT1NICQkJPSBBUkNDT1NIWVAJCQkjIwlHaWJ0IGRlbiB1bWdla2VocnRlbiBoeXBlcmJvbGlzY2hlbiBLb3NpbnVzIGVpbmVyIFphaGwgenVyw7xjaw0KQVNJTgkJCT0gQVJDU0lOCQkJIyMJR2lidCBkZW4gQXJrdXNzaW51cyBlaW5lciBaYWhsIHp1csO8Y2sNCkFTSU5ICQkJPSBBUkNTSU5IWVAJCQkjIwlHaWJ0IGRlbiB1bWdla2VocnRlbiBoeXBlcmJvbGlzY2hlbiBTaW51cyBlaW5lciBaYWhsIHp1csO8Y2sNCkFUQU4JCQk9IEFSQ1RBTgkJCSMjCUdpYnQgZGVuIEFya3VzdGFuZ2VucyBlaW5lciBaYWhsIHp1csO8Y2sNCkFUQU4yCQkJPSBBUkNUQU4yCQkJIyMJR2lidCBkZW4gQXJrdXN0YW5nZW5zIGVpbmVyIHgtIHVuZCBlaW5lciB5LUtvb3JkaW5hdGUgenVyw7xjaw0KQVRBTkgJCQk9IEFSQ1RBTkhZUAkJCSMjCUdpYnQgZGVuIHVtZ2VrZWhydGVuIGh5cGVyYm9saXNjaGVuIFRhbmdlbnMgZWluZXIgWmFobCB6dXLDvGNrDQpDRUlMSU5HCQkJPSBPQkVSR1JFTlpFCQkJIyMJUnVuZGV0IGVpbmUgWmFobCBhdWYgZGllIG7DpGNoc3RlIGdhbnplIFphaGwgb2RlciBkYXMgbsOkY2hzdGUgVmllbGZhY2hlIHZvbiBTY2hyaXR0DQpDT01CSU4JCQk9IEtPTUJJTkFUSU9ORU4JCQkjIwlHaWJ0IGRpZSBBbnphaGwgZGVyIEtvbWJpbmF0aW9uZW4gZsO8ciBlaW5lIGJlc3RpbW10ZSBBbnphaGwgdm9uIE9iamVrdGVuIHp1csO8Y2sNCkNPUwkJCT0gQ09TCQkJCSMjCUdpYnQgZGVuIEtvc2ludXMgZWluZXIgWmFobCB6dXLDvGNrDQpDT1NICQkJPSBDT1NIWVAJCQkjIwlHaWJ0IGRlbiBoeXBlcmJvbGlzY2hlbiBLb3NpbnVzIGVpbmVyIFphaGwgenVyw7xjaw0KREVHUkVFUwkJCT0gR1JBRAkJCQkjIwlXYW5kZWx0IEJvZ2VubWHDnyAoUmFkaWFudCkgaW4gR3JhZCB1bQ0KRVZFTgkJCT0gR0VSQURFCQkJIyMJUnVuZGV0IGVpbmUgWmFobCBhdWYgZGllIG7DpGNoc3RlIGdlcmFkZSBnYW56ZSBaYWhsIGF1Zg0KRVhQCQkJPSBFWFAJCQkJIyMJUG90ZW56aWVydCBkaWUgQmFzaXMgZSBtaXQgZGVyIGFscyBBcmd1bWVudCBhbmdlZ2ViZW5lbiBaYWhsDQpGQUNUCQkJPSBGQUtVTFTDhFQJCQkjIwlHaWJ0IGRpZSBGYWt1bHTDpHQgZWluZXIgWmFobCB6dXLDvGNrDQpGQUNURE9VQkxFCQk9IFpXRUlGQUtVTFTDhFQJCQkjIwlHaWJ0IGRpZSBGYWt1bHTDpHQgenUgWmFobCBtaXQgU2Nocml0dGzDpG5nZSAyIHp1csO8Y2sNCkZMT09SCQkJPSBVTlRFUkdSRU5aRQkJCSMjCVJ1bmRldCBkaWUgWmFobCBhdWYgQW56YWhsX1N0ZWxsZW4gYWINCkdDRAkJCT0gR0dUCQkJCSMjCUdpYnQgZGVuIGdyw7bDn3RlbiBnZW1laW5zYW1lbiBUZWlsZXIgenVyw7xjaw0KSU5UCQkJPSBHQU5aWkFITAkJCSMjCVJ1bmRldCBlaW5lIFphaGwgYXVmIGRpZSBuw6RjaHN0a2xlaW5lcmUgZ2FuemUgWmFobCBhYg0KTENNCQkJPSBLR1YJCQkJIyMJR2lidCBkYXMga2xlaW5zdGUgZ2VtZWluc2FtZSBWaWVsZmFjaGUgenVyw7xjaw0KTE4JCQk9IExOCQkJCSMjCUdpYnQgZGVuIG5hdMO8cmxpY2hlbiBMb2dhcml0aG11cyBlaW5lciBaYWhsIHp1csO8Y2sNCkxPRwkJCT0gTE9HCQkJCSMjCUdpYnQgZGVuIExvZ2FyaXRobXVzIGVpbmVyIFphaGwgenUgZGVyIGFuZ2VnZWJlbmVuIEJhc2lzIHp1csO8Y2sNCkxPRzEwCQkJPSBMT0cxMAkJCQkjIwlHaWJ0IGRlbiBMb2dhcml0aG11cyBlaW5lciBaYWhsIHp1ciBCYXNpcyAxMCB6dXLDvGNrDQpNREVURVJNCQkJPSBNREVUCQkJCSMjCUdpYnQgZGllIERldGVybWluYW50ZSBlaW5lciBNYXRyaXggenVyw7xjaw0KTUlOVkVSU0UJCT0gTUlOVgkJCQkjIwlHaWJ0IGRpZSBpbnZlcnNlIE1hdHJpeCBlaW5lciBNYXRyaXggenVyw7xjaw0KTU1VTFQJCQk9IE1NVUxUCQkJCSMjCUdpYnQgZGFzIFByb2R1a3QgendlaWVyIE1hdHJpemVuIHp1csO8Y2sNCk1PRAkJCT0gUkVTVAkJCQkjIwlHaWJ0IGRlbiBSZXN0IGVpbmVyIERpdmlzaW9uIHp1csO8Y2sNCk1ST1VORAkJCT0gVlJVTkRFTgkJCSMjCUdpYnQgZWluZSBhdWYgZGFzIGdld8O8bnNjaHRlIFZpZWxmYWNoZSBnZXJ1bmRldGUgWmFobCB6dXLDvGNrDQpNVUxUSU5PTUlBTAkJPSBQT0xZTk9NSUFMCQkJIyMJR2lidCBkZW4gUG9seW5vbWlhbGtvZWZmaXppZW50ZW4gZWluZXIgR3J1cHBlIHZvbiBaYWhsZW4genVyw7xjaw0KT0RECQkJPSBVTkdFUkFERQkJCSMjCVJ1bmRldCBlaW5lIFphaGwgYXVmIGRpZSBuw6RjaHN0ZSB1bmdlcmFkZSBnYW56ZSBaYWhsIGF1Zg0KUEkJCQk9IFBJCQkJCSMjCUdpYnQgZGVuIFdlcnQgUGkgenVyw7xjaw0KUE9XRVIJCQk9IFBPVEVOWgkJCSMjCUdpYnQgYWxzIEVyZ2VibmlzIGVpbmUgcG90ZW56aWVydGUgWmFobCB6dXLDvGNrDQpQUk9EVUNUCQkJPSBQUk9EVUtUCQkJIyMJTXVsdGlwbGl6aWVydCBkaWUgenVnZWjDtnJpZ2VuIEFyZ3VtZW50ZQ0KUVVPVElFTlQJCT0gUVVPVElFTlQJCQkjIwlHaWJ0IGRlbiBnYW56emFobGlnZW4gQW50ZWlsIGVpbmVyIERpdmlzaW9uIHp1csO8Y2sNClJBRElBTlMJCQk9IEJPR0VOTUFTUwkJCSMjCVdhbmRlbHQgR3JhZCBpbiBCb2dlbm1hw58gKFJhZGlhbnQpIHVtDQpSQU5ECQkJPSBaVUZBTExTWkFITAkJCSMjCUdpYnQgZWluZSBadWZhbGxzemFobCB6d2lzY2hlbiAwIHVuZCAxIHp1csO8Y2sNClJBTkRCRVRXRUVOCQk9IFpVRkFMTFNCRVJFSUNICQkjIwlHaWJ0IGVpbmUgWnVmYWxsc3phaGwgYXVzIGRlbSBmZXN0Z2VsZWd0ZW4gQmVyZWljaCB6dXLDvGNrDQpST01BTgkJCT0gUsOWTUlTQ0gJCQkjIwlXYW5kZWx0IGVpbmUgYXJhYmlzY2hlIFphaGwgaW4gZWluZSByw7ZtaXNjaGUgWmFobCBhbHMgVGV4dCB1bQ0KUk9VTkQJCQk9IFJVTkRFTgkJCSMjCVJ1bmRldCBlaW5lIFphaGwgYXVmIGVpbmUgYmVzdGltbXRlIEFuemFobCB2b24gRGV6aW1hbHN0ZWxsZW4NClJPVU5ERE9XTgkJPSBBQlJVTkRFTgkJCSMjCVJ1bmRldCBkaWUgWmFobCBhdWYgQW56YWhsX1N0ZWxsZW4gYWINClJPVU5EVVAJCQk9IEFVRlJVTkRFTgkJCSMjCVJ1bmRldCBkaWUgWmFobCBhdWYgQW56YWhsX1N0ZWxsZW4gYXVmDQpTRVJJRVNTVU0JCT0gUE9URU5aUkVJSEUJCQkjIwlHaWJ0IGRpZSBTdW1tZSB2b24gUG90ZW56ZW4gKHp1ciBCZXJlY2hudW5nIHZvbiBQb3RlbnpyZWloZW4gdW5kIGRpY2hvdG9tZW4gV2FocnNjaGVpbmxpY2hrZWl0ZW4pIHp1csO8Y2sNClNJR04JCQk9IFZPUlpFSUNIRU4JCQkjIwlHaWJ0IGRhcyBWb3J6ZWljaGVuIGVpbmVyIFphaGwgenVyw7xjaw0KU0lOCQkJPSBTSU4JCQkJIyMJR2lidCBkZW4gU2ludXMgZWluZXIgWmFobCB6dXLDvGNrDQpTSU5ICQkJPSBTSU5IWVAJCQkjIwlHaWJ0IGRlbiBoeXBlcmJvbGlzY2hlbiBTaW51cyBlaW5lciBaYWhsIHp1csO8Y2sNClNRUlQJCQk9IFdVUlpFTAkJCSMjCUdpYnQgZGllIFF1YWRyYXR3dXJ6ZWwgZWluZXIgWmFobCB6dXLDvGNrDQpTUVJUUEkJCQk9IFdVUlpFTFBJCQkJIyMJR2lidCBkaWUgV3VyemVsIGF1cyBkZXIgbWl0IFBpIChwaSkgbXVsdGlwbGl6aWVydGVuIFphaGwgenVyw7xjaw0KU1VCVE9UQUwJCT0gVEVJTEVSR0VCTklTCQkJIyMJR2lidCBlaW4gVGVpbGVyZ2VibmlzIGluIGVpbmVyIExpc3RlIG9kZXIgRGF0ZW5iYW5rIHp1csO8Y2sNClNVTQkJCT0gU1VNTUUJCQkJIyMJQWRkaWVydCBkaWUgenVnZWjDtnJpZ2VuIEFyZ3VtZW50ZQ0KU1VNSUYJCQk9IFNVTU1FV0VOTgkJCSMjCUFkZGllcnQgWmFobGVuLCBkaWUgbWl0IGRlbiBTdWNoa3JpdGVyaWVuIMO8YmVyZWluc3RpbW1lbg0KU1VNSUZTCQkJPSBTVU1NRVdFTk5TCQkJIyMJRGllIFplbGxlbiwgZGllIG1laHJlcmUgS3JpdGVyaWVuIGVyZsO8bGxlbiwgd2VyZGVuIGluIGVpbmVtIEJlcmVpY2ggaGluenVnZWbDvGd0DQpTVU1QUk9EVUNUCQk9IFNVTU1FTlBST0RVS1QJCQkjIwlHaWJ0IGRpZSBTdW1tZSBkZXIgUHJvZHVrdGUgenVzYW1tZW5nZWjDtnJpZ2VyIE1hdHJpeGtvbXBvbmVudGVuIHp1csO8Y2sNClNVTVNRCQkJPSBRVUFEUkFURVNVTU1FCQkJIyMJR2lidCBkaWUgU3VtbWUgZGVyIHF1YWRyaWVydGVuIEFyZ3VtZW50ZSB6dXLDvGNrDQpTVU1YMk1ZMgkJPSBTVU1NRVgyTVkyCQkJIyMJR2lidCBkaWUgU3VtbWUgZGVyIERpZmZlcmVuemVuIGRlciBRdWFkcmF0ZSBmw7xyIHp1c2FtbWVuZ2Vow7ZyaWdlIEtvbXBvbmVudGVuIHp3ZWllciBNYXRyaXplbiB6dXLDvGNrDQpTVU1YMlBZMgkJPSBTVU1NRVgyUFkyCQkJIyMJR2lidCBkaWUgU3VtbWUgZGVyIFF1YWRyYXRlIGbDvHIgenVzYW1tZW5nZWjDtnJpZ2UgS29tcG9uZW50ZW4gendlaWVyIE1hdHJpemVuIHp1csO8Y2sNClNVTVhNWTIJCQk9IFNVTU1FWE1ZMgkJCSMjCUdpYnQgZGllIFN1bW1lIGRlciBxdWFkcmllcnRlbiBEaWZmZXJlbnplbiBmw7xyIHp1c2FtbWVuZ2Vow7ZyaWdlIEtvbXBvbmVudGVuIHp3ZWllciBNYXRyaXplbiB6dXLDvGNrDQpUQU4JCQk9IFRBTgkJCQkjIwlHaWJ0IGRlbiBUYW5nZW5zIGVpbmVyIFphaGwgenVyw7xjaw0KVEFOSAkJCT0gVEFOSFlQCQkJIyMJR2lidCBkZW4gaHlwZXJib2xpc2NoZW4gVGFuZ2VucyBlaW5lciBaYWhsIHp1csO8Y2sNClRSVU5DCQkJPSBLw5xSWkVOCQkJIyMJU2NobmVpZGV0IGRpZSBLb21tYXN0ZWxsZW4gZWluZXIgWmFobCBhYiB1bmQgZ2lidCBhbHMgRXJnZWJuaXMgZWluZSBnYW56ZSBaYWhsIHp1csO8Y2sNCg0KDQojIw0KIyMJU3RhdGlzdGljYWwgZnVuY3Rpb25zCQkJCVN0YXRpc3Rpc2NoZSBGdW5rdGlvbmVuDQojIw0KQVZFREVWCQkJPSBNSVRURUxBQlcJCQkjIwlHaWJ0IGRpZSBkdXJjaHNjaG5pdHRsaWNoZSBhYnNvbHV0ZSBBYndlaWNodW5nIGVpbmVyIFJlaWhlIHZvbiBNZXJrbWFsc2F1c3Byw6RndW5nZW4gdW5kIGlocmVtIE1pdHRlbHdlcnQgenVyw7xjaw0KQVZFUkFHRQkJCT0gTUlUVEVMV0VSVAkJCSMjCUdpYnQgZGVuIE1pdHRlbHdlcnQgZGVyIHp1Z2Vow7ZyaWdlbiBBcmd1bWVudGUgenVyw7xjaw0KQVZFUkFHRUEJCT0gTUlUVEVMV0VSVEEJCQkjIwlHaWJ0IGRlbiBNaXR0ZWx3ZXJ0IGRlciB6dWdlaMO2cmlnZW4gQXJndW1lbnRlLCBkaWUgWmFobGVuLCBUZXh0IHVuZCBXYWhyaGVpdHN3ZXJ0ZSBlbnRoYWx0ZW4sIHp1csO8Y2sNCkFWRVJBR0VJRgkJPSBNSVRURUxXRVJUV0VOTgkJIyMJRGVyIER1cmNoc2Nobml0dHN3ZXJ0IChhcml0aG1ldGlzY2hlcyBNaXR0ZWwpIGbDvHIgYWxsZSBaZWxsZW4gaW4gZWluZW0gQmVyZWljaCwgZGllIGVpbmVtIGFuZ2VnZWJlbmVuIEtyaXRlcml1bSBlbnRzcHJlY2hlbiwgd2lyZCB6dXLDvGNrZ2VnZWJlbg0KQVZFUkFHRUlGUwkJPSBNSVRURUxXRVJUV0VOTlMJCSMjCUdpYnQgZGVuIER1cmNoc2Nobml0dHN3ZXJ0IChhcml0aG1ldGlzY2hlcyBNaXR0ZWwpIGFsbGVyIFplbGxlbiB6dXLDvGNrLCBkaWUgbWVocmVyZW4gS3JpdGVyaWVuIGVudHNwcmVjaGVuDQpCRVRBRElTVAkJPSBCRVRBVkVSVAkJCSMjCUdpYnQgZGllIFdlcnRlIGRlciBrdW11bGllcnRlbiBCZXRhdmVydGVpbHVuZ3NmdW5rdGlvbiB6dXLDvGNrDQpCRVRBSU5WCQkJPSBCRVRBSU5WCQkJIyMJR2lidCBkYXMgUXVhbnRpbCBkZXIgYW5nZWdlYmVuZW4gQmV0YXZlcnRlaWx1bmcgenVyw7xjaw0KQklOT01ESVNUCQk9IEJJTk9NVkVSVAkJCSMjCUdpYnQgV2FocnNjaGVpbmxpY2hrZWl0ZW4gZWluZXIgYmlub21pYWx2ZXJ0ZWlsdGVuIFp1ZmFsbHN2YXJpYWJsZW4genVyw7xjaw0KQ0hJRElTVAkJCT0gQ0hJVkVSVAkJCSMjCUdpYnQgV2VydGUgZGVyIFZlcnRlaWx1bmdzZnVua3Rpb24gKDEtQWxwaGEpIGVpbmVyIENoaS1RdWFkcmF0LXZlcnRlaWx0ZW4gWnVmYWxsc2dyw7bDn2UgenVyw7xjaw0KQ0hJSU5WCQkJPSBDSElJTlYJCQkjIwlHaWJ0IFF1YW50aWxlIGRlciBWZXJ0ZWlsdW5nc2Z1bmt0aW9uICgxLUFscGhhKSBkZXIgQ2hpLVF1YWRyYXQtVmVydGVpbHVuZyB6dXLDvGNrDQpDSElURVNUCQkJPSBDSElURVNUCQkJIyMJR2lidCBkaWUgVGVzdHN0YXRpc3RpayBlaW5lcyBVbmFiaMOkbmdpZ2tlaXRzdGVzdHMgenVyw7xjaw0KQ09ORklERU5DRQkJPSBLT05GSURFTloJCQkjIwlFcm3DtmdsaWNodCBkaWUgQmVyZWNobnVuZyBkZXMgMS1BbHBoYSBLb25maWRlbnppbnRlcnZhbGxzIGbDvHIgZGVuIEVyd2FydHVuZ3N3ZXJ0IGVpbmVyIFp1ZmFsbHN2YXJpYWJsZW4NCkNPUlJFTAkJCT0gS09SUkVMCQkJIyMJR2lidCBkZW4gS29ycmVsYXRpb25za29lZmZpemllbnRlbiB6d2VpZXIgUmVpaGVuIHZvbiBNZXJrbWFsc2F1c3Byw6RndW5nZW4genVyw7xjaw0KQ09VTlQJCQk9IEFOWkFITAkJCSMjCUdpYnQgZGllIEFuemFobCBkZXIgWmFobGVuIGluIGRlciBMaXN0ZSBtaXQgQXJndW1lbnRlbiBhbg0KQ09VTlRBCQkJPSBBTlpBSEwyCQkJIyMJR2lidCBkaWUgQW56YWhsIGRlciBXZXJ0ZSBpbiBkZXIgTGlzdGUgbWl0IEFyZ3VtZW50ZW4gYW4NCkNPVU5UQkxBTksJCT0gQU5aQUhMTEVFUkVaRUxMRU4JCSMjCUdpYnQgZGllIEFuemFobCBkZXIgbGVlcmVuIFplbGxlbiBpbiBlaW5lbSBCZXJlaWNoIGFuDQpDT1VOVElGCQkJPSBaw4RITEVOV0VOTgkJCSMjCUdpYnQgZGllIEFuemFobCBkZXIgWmVsbGVuIGluIGVpbmVtIEJlcmVpY2ggYW4sIGRlcmVuIEluaGFsdGUgbWl0IGRlbiBTdWNoa3JpdGVyaWVuIMO8YmVyZWluc3RpbW1lbg0KQ09VTlRJRlMJCT0gWsOESExFTldFTk5TCQkJIyMJR2lidCBkaWUgQW56YWhsIGRlciBaZWxsZW4gaW4gZWluZW0gQmVyZWljaCBhbiwgZGVyZW4gSW5oYWx0ZSBtaXQgbWVocmVyZW4gU3VjaGtyaXRlcmllbiDDvGJlcmVpbnN0aW1tZW4NCkNPVkFSCQkJPSBLT1ZBUgkJCQkjIwlHaWJ0IGRpZSBLb3ZhcmlhbnogenVyw7xjaywgZGVuIE1pdHRlbHdlcnQgZGVyIGbDvHIgYWxsZSBEYXRlbnB1bmt0cGFhcmUgZ2ViaWxkZXRlbiBQcm9kdWt0ZSBkZXIgQWJ3ZWljaHVuZ2VuDQpDUklUQklOT00JCT0gS1JJVEJJTk9NCQkJIyMJR2lidCBkZW4ga2xlaW5zdGVuIFdlcnQgenVyw7xjaywgZsO8ciBkZW4gZGllIGt1bXVsaWVydGVuIFdhaHJzY2hlaW5saWNoa2VpdGVuIGRlciBCaW5vbWlhbHZlcnRlaWx1bmcga2xlaW5lciBvZGVyIGdsZWljaCBlaW5lciBHcmVuendhaHJzY2hlaW5saWNoa2VpdCBzaW5kDQpERVZTUQkJCT0gU1VNUVVBREFCVwkJCSMjCUdpYnQgZGllIFN1bW1lIGRlciBxdWFkcmllcnRlbiBBYndlaWNodW5nZW4gZGVyIERhdGVucHVua3RlIHZvbiBpaHJlbSBTdGljaHByb2Jlbm1pdHRlbHdlcnQgenVyw7xjaw0KRVhQT05ESVNUCQk9IEVYUE9OVkVSVAkJCSMjCUdpYnQgV2FocnNjaGVpbmxpY2hrZWl0ZW4gZWluZXIgZXhwb25lbnRpYWwgdmVydGVpbHRlbiBadWZhbGxzdmFyaWFibGVuIHp1csO8Y2sNCkZESVNUCQkJPSBGVkVSVAkJCQkjIwlHaWJ0IFdlcnRlIGRlciBWZXJ0ZWlsdW5nc2Z1bmt0aW9uICgxLUFscGhhKSBlaW5lciBGLXZlcnRlaWx0ZW4gWnVmYWxsc3ZhcmlhYmxlbiB6dXLDvGNrDQpGSU5WCQkJPSBGSU5WCQkJCSMjCUdpYnQgUXVhbnRpbGUgZGVyIEYtVmVydGVpbHVuZyB6dXLDvGNrDQpGSVNIRVIJCQk9IEZJU0hFUgkJCSMjCUdpYnQgZGllIEZpc2hlci1UcmFuc2Zvcm1hdGlvbiB6dXLDvGNrDQpGSVNIRVJJTlYJCT0gRklTSEVSSU5WCQkJIyMJR2lidCBkaWUgVW1rZWhydW5nIGRlciBGaXNoZXItVHJhbnNmb3JtYXRpb24genVyw7xjaw0KRk9SRUNBU1QJCT0gUFJPR05PU0UJCQkjIwlHaWJ0IGVpbmVuIFdlcnQgenVyw7xjaywgZGVyIHNpY2ggYXVzIGVpbmVtIGxpbmVhcmVuIFRyZW5kIGVyZ2lidA0KRlJFUVVFTkNZCQk9IEjDhFVGSUdLRUlUCQkJIyMJR2lidCBlaW5lIEjDpHVmaWdrZWl0c3ZlcnRlaWx1bmcgYWxzIHZlcnRpa2FsZSBNYXRyaXggenVyw7xjaw0KRlRFU1QJCQk9IEZURVNUCQkJCSMjCUdpYnQgZGllIFRlc3RzdGF0aXN0aWsgZWluZXMgRi1UZXN0cyB6dXLDvGNrDQpHQU1NQURJU1QJCT0gR0FNTUFWRVJUCQkJIyMJR2lidCBXYWhyc2NoZWlubGljaGtlaXRlbiBlaW5lciBnYW1tYXZlcnRlaWx0ZW4gWnVmYWxsc3ZhcmlhYmxlbiB6dXLDvGNrDQpHQU1NQUlOVgkJPSBHQU1NQUlOVgkJCSMjCUdpYnQgUXVhbnRpbGUgZGVyIEdhbW1hdmVydGVpbHVuZyB6dXLDvGNrDQpHQU1NQUxOCQkJPSBHQU1NQUxOCQkJIyMJR2lidCBkZW4gbmF0w7xybGljaGVuIExvZ2FyaXRobXVzIGRlciBHYW1tYWZ1bmt0aW9uIHp1csO8Y2ssIM6TKHgpDQpHRU9NRUFOCQkJPSBHRU9NSVRURUwJCQkjIwlHaWJ0IGRhcyBnZW9tZXRyaXNjaGUgTWl0dGVsIHp1csO8Y2sNCkdST1dUSAkJCT0gVkFSSUFUSU9OCQkJIyMJR2lidCBXZXJ0ZSB6dXLDvGNrLCBkaWUgc2ljaCBhdXMgZWluZW0gZXhwb25lbnRpZWxsZW4gVHJlbmQgZXJnZWJlbg0KSEFSTUVBTgkJCT0gSEFSTUlUVEVMCQkJIyMJR2lidCBkYXMgaGFybW9uaXNjaGUgTWl0dGVsIHp1csO8Y2sNCkhZUEdFT01ESVNUCQk9IEhZUEdFT01WRVJUCQkJIyMJR2lidCBXYWhyc2NoZWlubGljaGtlaXRlbiBlaW5lciBoeXBlcmdlb21ldHJpc2NoLXZlcnRlaWx0ZW4gWnVmYWxsc3ZhcmlhYmxlbiB6dXLDvGNrDQpJTlRFUkNFUFQJCT0gQUNIU0VOQUJTQ0hOSVRUCQkjIwlHaWJ0IGRlbiBTY2huaXR0cHVua3QgZGVyIFJlZ3Jlc3Npb25zZ2VyYWRlbiB6dXLDvGNrDQpLVVJUCQkJPSBLVVJUCQkJCSMjCUdpYnQgZGllIEt1cnRvc2lzIChFeHplc3MpIGVpbmVyIERhdGVuZ3J1cHBlIHp1csO8Y2sNCkxBUkdFCQkJPSBLR1LDllNTVEUJCQkjIwlHaWJ0IGRlbiBrLWdyw7bDn3RlbiBXZXJ0IGVpbmVyIERhdGVuZ3J1cHBlIHp1csO8Y2sNCkxJTkVTVAkJCT0gUkdQCQkJCSMjCUdpYnQgZGllIFBhcmFtZXRlciBlaW5lcyBsaW5lYXJlbiBUcmVuZHMgenVyw7xjaw0KTE9HRVNUCQkJPSBSS1AJCQkJIyMJR2lidCBkaWUgUGFyYW1ldGVyIGVpbmVzIGV4cG9uZW50aWVsbGVuIFRyZW5kcyB6dXLDvGNrDQpMT0dJTlYJCQk9IExPR0lOVgkJCSMjCUdpYnQgUXVhbnRpbGUgZGVyIExvZ25vcm1hbHZlcnRlaWx1bmcgenVyw7xjaw0KTE9HTk9STURJU1QJCT0gTE9HTk9STVZFUlQJCQkjIwlHaWJ0IFdlcnRlIGRlciBWZXJ0ZWlsdW5nc2Z1bmt0aW9uIGVpbmVyIGxvZ25vcm1hbHZlcnRlaWx0ZW4gWnVmYWxsc3ZhcmlhYmxlbiB6dXLDvGNrDQpNQVgJCQk9IE1BWAkJCQkjIwlHaWJ0IGRlbiBNYXhpbWFsd2VydCBlaW5lciBMaXN0ZSBtaXQgQXJndW1lbnRlbiB6dXLDvGNrDQpNQVhBCQkJPSBNQVhBCQkJCSMjCUdpYnQgZGVuIE1heGltYWx3ZXJ0IGVpbmVyIExpc3RlIG1pdCBBcmd1bWVudGVuIHp1csO8Y2ssIGRpZSBaYWhsZW4sIFRleHQgdW5kIFdhaHJoZWl0c3dlcnRlIGVudGhhbHRlbg0KTUVESUFOCQkJPSBNRURJQU4JCQkjIwlHaWJ0IGRlbiBNZWRpYW4gZGVyIGFuZ2VnZWJlbmVuIFphaGxlbiB6dXLDvGNrDQpNSU4JCQk9IE1JTgkJCQkjIwlHaWJ0IGRlbiBNaW5pbWFsd2VydCBlaW5lciBMaXN0ZSBtaXQgQXJndW1lbnRlbiB6dXLDvGNrDQpNSU5BCQkJPSBNSU5BCQkJCSMjCUdpYnQgZGVuIGtsZWluc3RlbiBXZXJ0IGVpbmVyIExpc3RlIG1pdCBBcmd1bWVudGVuIHp1csO8Y2ssIGRpZSBaYWhsZW4sIFRleHQgdW5kIFdhaHJoZWl0c3dlcnRlIGVudGhhbHRlbg0KTU9ERQkJCT0gTU9EQUxXRVJUCQkJIyMJR2lidCBkZW4gYW0gaMOkdWZpZ3N0ZW4gdm9ya29tbWVuZGVuIFdlcnQgaW4gZWluZXIgRGF0ZW5ncnVwcGUgenVyw7xjaw0KTkVHQklOT01ESVNUCQk9IE5FR0JJTk9NVkVSVAkJCSMjCUdpYnQgV2FocnNjaGVpbmxpY2hrZWl0ZW4gZWluZXIgbmVnYXRpdmVuLCBiaW5vbWluYWwgdmVydGVpbHRlbiBadWZhbGxzdmFyaWFibGVuIHp1csO8Y2sNCk5PUk1ESVNUCQk9IE5PUk1WRVJUCQkJIyMJR2lidCBXYWhyc2NoZWlubGljaGtlaXRlbiBlaW5lciBub3JtYWwgdmVydGVpbHRlbiBadWZhbGxzdmFyaWFibGVuIHp1csO8Y2sNCk5PUk1JTlYJCQk9IE5PUk1JTlYJCQkjIwlHaWJ0IFF1YW50aWxlIGRlciBOb3JtYWx2ZXJ0ZWlsdW5nIHp1csO8Y2sNCk5PUk1TRElTVAkJPSBTVEFORE5PUk1WRVJUCQkJIyMJR2lidCBXZXJ0ZSBkZXIgVmVydGVpbHVuZ3NmdW5rdGlvbiBlaW5lciBzdGFuZGFyZG5vcm1hbHZlcnRlaWx0ZW4gWnVmYWxsc3ZhcmlhYmxlbiB6dXLDvGNrDQpOT1JNU0lOVgkJPSBTVEFORE5PUk1JTlYJCQkjIwlHaWJ0IFF1YW50aWxlIGRlciBTdGFuZGFyZG5vcm1hbHZlcnRlaWx1bmcgenVyw7xjaw0KUEVBUlNPTgkJCT0gUEVBUlNPTgkJCSMjCUdpYnQgZGVuIFBlYXJzb25zY2hlbiBLb3JyZWxhdGlvbnNrb2VmZml6aWVudGVuIHp1csO8Y2sNClBFUkNFTlRJTEUJCT0gUVVBTlRJTAkJCSMjCUdpYnQgZGFzIEFscGhhLVF1YW50aWwgZWluZXIgR3J1cHBlIHZvbiBEYXRlbiB6dXLDvGNrDQpQRVJDRU5UUkFOSwkJPSBRVUFOVElMU1JBTkcJCQkjIwlHaWJ0IGRlbiBwcm96ZW50dWFsZW4gUmFuZyAoQWxwaGEpIGVpbmVzIFdlcnRzIGluIGVpbmVyIERhdGVuZ3J1cHBlIHp1csO8Y2sNClBFUk1VVAkJCT0gVkFSSUFUSU9ORU4JCQkjIwlHaWJ0IGRpZSBBbnphaGwgZGVyIE3DtmdsaWNoa2VpdGVuIHp1csO8Y2ssIHVtIGsgRWxlbWVudGUgYXVzIGVpbmVyIE1lbmdlIHZvbiBuIEVsZW1lbnRlbiBvaG5lIFp1csO8Y2tsZWdlbiB6dSB6aWVoZW4NClBPSVNTT04JCQk9IFBPSVNTT04JCQkjIwlHaWJ0IFdhaHJzY2hlaW5saWNoa2VpdGVuIGVpbmVyIHBvaXNzb252ZXJ0ZWlsdGVuIFp1ZmFsbHN2YXJpYWJsZW4genVyw7xjaw0KUFJPQgkJCT0gV0FIUlNDSEJFUkVJQ0gJCSMjCUdpYnQgZGllIFdhaHJzY2hlaW5saWNoa2VpdCBmw7xyIGVpbiB2b24gendlaSBXZXJ0ZW4gZWluZ2VzY2hsb3NzZW5lcyBJbnRlcnZhbGwgenVyw7xjaw0KUVVBUlRJTEUJCT0gUVVBUlRJTEUJCQkjIwlHaWJ0IGRpZSBRdWFydGlsZSBkZXIgRGF0ZW5ncnVwcGUgenVyw7xjaw0KUkFOSwkJCT0gUkFORwkJCQkjIwlHaWJ0IGRlbiBSYW5nIHp1csO8Y2ssIGRlbiBlaW5lIFphaGwgaW5uZXJoYWxiIGVpbmVyIExpc3RlIHZvbiBaYWhsZW4gZWlubmltbXQNClJTUQkJCT0gQkVTVElNTVRIRUlUU01BU1MJCSMjCUdpYnQgZGFzIFF1YWRyYXQgZGVzIFBlYXJzb25zY2hlbiBLb3JyZWxhdGlvbnNrb2VmZml6aWVudGVuIHp1csO8Y2sNClNLRVcJCQk9IFNDSElFRkUJCQkjIwlHaWJ0IGRpZSBTY2hpZWZlIGVpbmVyIFZlcnRlaWx1bmcgenVyw7xjaw0KU0xPUEUJCQk9IFNURUlHVU5HCQkJIyMJR2lidCBkaWUgU3RlaWd1bmcgZGVyIFJlZ3Jlc3Npb25zZ2VyYWRlbiB6dXLDvGNrDQpTTUFMTAkJCT0gS0tMRUlOU1RFCQkJIyMJR2lidCBkZW4gay1rbGVpbnN0ZW4gV2VydCBlaW5lciBEYXRlbmdydXBwZSB6dXLDvGNrDQpTVEFOREFSRElaRQkJPSBTVEFOREFSRElTSUVSVU5HCQkjIwlHaWJ0IGRlbiBzdGFuZGFyZGlzaWVydGVuIFdlcnQgenVyw7xjaw0KU1RERVYJCQk9IFNUQUJXCQkJCSMjCVNjaMOkdHp0IGRpZSBTdGFuZGFyZGFid2VpY2h1bmcgYXVzZ2VoZW5kIHZvbiBlaW5lciBTdGljaHByb2JlDQpTVERFVkEJCQk9IFNUQUJXQQkJCSMjCVNjaMOkdHp0IGRpZSBTdGFuZGFyZGFid2VpY2h1bmcgYXVzZ2VoZW5kIHZvbiBlaW5lciBTdGljaHByb2JlLCBkaWUgWmFobGVuLCBUZXh0IHVuZCBXYWhyaGVpdHN3ZXJ0ZSBlbnRow6RsdA0KU1RERVZQCQkJPSBTVEFCV04JCQkjIwlCZXJlY2huZXQgZGllIFN0YW5kYXJkYWJ3ZWljaHVuZyBhdXNnZWhlbmQgdm9uIGRlciBHcnVuZGdlc2FtdGhlaXQNClNUREVWUEEJCQk9IFNUQUJXTkEJCQkjIwlCZXJlY2huZXQgZGllIFN0YW5kYXJkYWJ3ZWljaHVuZyBhdXNnZWhlbmQgdm9uIGRlciBHcnVuZGdlc2FtdGhlaXQsIGRpZSBaYWhsZW4sIFRleHQgdW5kIFdhaHJoZWl0c3dlcnRlIGVudGjDpGx0DQpTVEVZWAkJCT0gU1RGRUhMRVJZWAkJCSMjCUdpYnQgZGVuIFN0YW5kYXJkZmVobGVyIGRlciBnZXNjaMOkdHp0ZW4geS1XZXJ0ZSBmw7xyIGFsbGUgeC1XZXJ0ZSBkZXIgUmVncmVzc2lvbiB6dXLDvGNrDQpURElTVAkJCT0gVFZFUlQJCQkJIyMJR2lidCBXZXJ0ZSBkZXIgVmVydGVpbHVuZ3NmdW5rdGlvbiAoMS1BbHBoYSkgZWluZXIgKFN0dWRlbnQpIHQtdmVydGVpbHRlbiBadWZhbGxzdmFyaWFibGVuIHp1csO8Y2sNClRJTlYJCQk9IFRJTlYJCQkJIyMJR2lidCBRdWFudGlsZSBkZXIgdC1WZXJ0ZWlsdW5nIHp1csO8Y2sNClRSRU5ECQkJPSBUUkVORAkJCQkjIwlHaWJ0IFdlcnRlIHp1csO8Y2ssIGRpZSBzaWNoIGF1cyBlaW5lbSBsaW5lYXJlbiBUcmVuZCBlcmdlYmVuDQpUUklNTUVBTgkJPSBHRVNUVVRaVE1JVFRFTAkJIyMJR2lidCBkZW4gTWl0dGVsd2VydCBlaW5lciBEYXRlbmdydXBwZSB6dXLDvGNrLCBvaG5lIGRpZSBSYW5kd2VydGUgenUgYmVyw7xja3NpY2h0aWdlbg0KVFRFU1QJCQk9IFRURVNUCQkJCSMjCUdpYnQgZGllIFRlc3RzdGF0aXN0aWsgZWluZXMgU3R1ZGVudCdzY2hlbiB0LVRlc3RzIHp1csO8Y2sNClZBUgkJCT0gVkFSSUFOWgkJCSMjCVNjaMOkdHp0IGRpZSBWYXJpYW56IGF1c2dlaGVuZCB2b24gZWluZXIgU3RpY2hwcm9iZQ0KVkFSQQkJCT0gVkFSSUFOWkEJCQkjIwlTY2jDpHR6dCBkaWUgVmFyaWFueiBhdXNnZWhlbmQgdm9uIGVpbmVyIFN0aWNocHJvYmUsIGRpZSBaYWhsZW4sIFRleHQgdW5kIFdhaHJoZWl0c3dlcnRlIGVudGjDpGx0DQpWQVJQCQkJPSBWQVJJQU5aRU4JCQkjIwlCZXJlY2huZXQgZGllIFZhcmlhbnogYXVzZ2VoZW5kIHZvbiBkZXIgR3J1bmRnZXNhbXRoZWl0DQpWQVJQQQkJCT0gVkFSSUFOWkVOQQkJCSMjCUJlcmVjaG5ldCBkaWUgVmFyaWFueiBhdXNnZWhlbmQgdm9uIGRlciBHcnVuZGdlc2FtdGhlaXQsIGRpZSBaYWhsZW4sIFRleHQgdW5kIFdhaHJoZWl0c3dlcnRlIGVudGjDpGx0DQpXRUlCVUxMCQkJPSBXRUlCVUxMCQkJIyMJR2lidCBXYWhyc2NoZWlubGljaGtlaXRlbiBlaW5lciB3ZWlidWxsdmVydGVpbHRlbiBadWZhbGxzdmFyaWFibGVuIHp1csO8Y2sNClpURVNUCQkJPSBHVEVTVAkJCQkjIwlHaWJ0IGRlbiBlaW5zZWl0aWdlbiBXYWhyc2NoZWlubGljaGtlaXRzd2VydCBmw7xyIGVpbmVuIEdhdXNzdGVzdCAoTm9ybWFsdmVydGVpbHVuZykgenVyw7xjaw0KDQoNCiMjDQojIwlUZXh0IGZ1bmN0aW9ucwkJCQkJVGV4dGZ1bmt0aW9uZW4NCiMjDQpBU0MJCQk9IEFTQwkJCQkjIwlLb252ZXJ0aWVydCBEQi1UZXh0IGluIGVpbmVyIFplaWNoZW5mb2xnZSAobGF0ZWluaXNjaGUgQnVjaHN0YWJlbiBvZGVyIEthdGFrYW5hKSBpbiBTQi1UZXh0DQpCQUhUVEVYVAkJPSBCQUhUVEVYVAkJCSMjCVdhbmRlbHQgZWluZSBaYWhsIGluIFRleHQgaW0gV8OkaHJ1bmdzZm9ybWF0IMOfIChCYWh0KSB1bQ0KQ0hBUgkJCT0gWkVJQ0hFTgkJCSMjCUdpYnQgZGFzIGRlciBDb2RlemFobCBlbnRzcHJlY2hlbmRlIFplaWNoZW4genVyw7xjaw0KQ0xFQU4JCQk9IFPDhFVCRVJOCQkJIyMJTMO2c2NodCBhbGxlIG5pY2h0IGRydWNrYmFyZW4gWmVpY2hlbiBhdXMgZWluZW0gVGV4dA0KQ09ERQkJCT0gQ09ERQkJCQkjIwlHaWJ0IGRpZSBDb2RlemFobCBkZXMgZXJzdGVuIFplaWNoZW5zIGluIGVpbmVtIFRleHQgenVyw7xjaw0KQ09OQ0FURU5BVEUJCT0gVkVSS0VUVEVOCQkJIyMJVmVya27DvHBmdCBtZWhyZXJlIFRleHRlbGVtZW50ZSB6dSBlaW5lbSBUZXh0ZWxlbWVudA0KRE9MTEFSCQkJPSBETQkJCQkjIwlXYW5kZWx0IGVpbmUgWmFobCBpbiBUZXh0IGltIFfDpGhydW5nc2Zvcm1hdCDigqwgKEV1cm8pIHVtDQpFWEFDVAkJCT0gSURFTlRJU0NICQkJIyMJUHLDvGZ0LCBvYiB6d2VpIFRleHR3ZXJ0ZSBpZGVudGlzY2ggc2luZA0KRklORAkJCT0gRklOREVOCQkJIyMJU3VjaHQgbmFjaCBlaW5lbSBUZXh0d2VydCwgZGVyIGluIGVpbmVtIGFuZGVyZW4gVGV4dHdlcnQgZW50aGFsdGVuIGlzdCAoR3Jvw58tL0tsZWluc2NocmVpYnVuZyB3aXJkIHVudGVyc2NoaWVkZW4pDQpGSU5EQgkJCT0gRklOREVOQgkJCSMjCVN1Y2h0IG5hY2ggZWluZW0gVGV4dHdlcnQsIGRlciBpbiBlaW5lbSBhbmRlcmVuIFRleHR3ZXJ0IGVudGhhbHRlbiBpc3QgKEdyb8OfLS9LbGVpbnNjaHJlaWJ1bmcgd2lyZCB1bnRlcnNjaGllZGVuKQ0KRklYRUQJCQk9IEZFU1QJCQkJIyMJRm9ybWF0aWVydCBlaW5lIFphaGwgYWxzIFRleHQgbWl0IGVpbmVyIGZlc3RlbiBBbnphaGwgdm9uIERlemltYWxzdGVsbGVuDQpKSVMJCQk9IEpJUwkJCQkjIwlLb252ZXJ0aWVydCBTQi1UZXh0IGluIGVpbmVyIFplaWNoZW5mb2xnZSAobGF0ZWluaXNjaGUgQnVjaHN0YWJlbiBvZGVyIEthdGFrYW5hKSBpbiBEQi1UZXh0DQpMRUZUCQkJPSBMSU5LUwkJCQkjIwlHaWJ0IGRpZSBaZWljaGVuIGdhbnogbGlua3MgaW4gZWluZW0gVGV4dHdlcnQgenVyw7xjaw0KTEVGVEIJCQk9IExJTktTQgkJCSMjCUdpYnQgZGllIFplaWNoZW4gZ2FueiBsaW5rcyBpbiBlaW5lbSBUZXh0d2VydCB6dXLDvGNrDQpMRU4JCQk9IEzDhE5HRQkJCQkjIwlHaWJ0IGRpZSBBbnphaGwgZGVyIFplaWNoZW4gaW4gZWluZXIgWmVpY2hlbmZvbGdlIHp1csO8Y2sNCkxFTkIJCQk9IEzDhE5HRUIJCQkjIwlHaWJ0IGRpZSBBbnphaGwgZGVyIFplaWNoZW4gaW4gZWluZXIgWmVpY2hlbmZvbGdlIHp1csO8Y2sNCkxPV0VSCQkJPSBLTEVJTgkJCQkjIwlXYW5kZWx0IFRleHQgaW4gS2xlaW5idWNoc3RhYmVuIHVtDQpNSUQJCQk9IFRFSUwJCQkJIyMJR2lidCBlaW5lIGJlc3RpbW10ZSBBbnphaGwgWmVpY2hlbiBhdXMgZWluZXIgWmVpY2hlbmZvbGdlIGFiIGRlciB2b24gSWhuZW4gYW5nZWdlYmVuZW4gU3RlbGxlIHp1csO8Y2sNCk1JREIJCQk9IFRFSUxCCQkJCSMjCUdpYnQgZWluZSBiZXN0aW1tdGUgQW56YWhsIFplaWNoZW4gYXVzIGVpbmVyIFplaWNoZW5mb2xnZSBhYiBkZXIgdm9uIElobmVuIGFuZ2VnZWJlbmVuIFN0ZWxsZSB6dXLDvGNrDQpQSE9ORVRJQwkJPSBQSE9ORVRJQwkJCSMjCUV4dHJhaGllcnQgZGllIHBob25ldGlzY2hlbiAoRnVyaWdhbmEtKVplaWNoZW4gYXVzIGVpbmVyIFRleHR6ZWljaGVuZm9sZ2UNClBST1BFUgkJCT0gR1JPU1MyCQkJIyMJV2FuZGVsdCBkZW4gZXJzdGVuIEJ1Y2hzdGFiZW4gYWxsZXIgV8O2cnRlciBlaW5lcyBUZXh0d2VydHMgaW4gR3Jvw59idWNoc3RhYmVuIHVtDQpSRVBMQUNFCQkJPSBFUlNFVFpFTgkJCSMjCUVyc2V0enQgWmVpY2hlbiBpbiBUZXh0DQpSRVBMQUNFQgkJPSBFUlNFVFpFTkIJCQkjIwlFcnNldHp0IFplaWNoZW4gaW4gVGV4dA0KUkVQVAkJCT0gV0lFREVSSE9MRU4JCQkjIwlXaWVkZXJob2x0IGVpbmVuIFRleHQgc28gb2Z0IHdpZSBhbmdlZ2ViZW4NClJJR0hUCQkJPSBSRUNIVFMJCQkjIwlHaWJ0IGRpZSBaZWljaGVuIGdhbnogcmVjaHRzIGluIGVpbmVtIFRleHR3ZXJ0IHp1csO8Y2sNClJJR0hUQgkJCT0gUkVDSFRTQgkJCSMjCUdpYnQgZGllIFplaWNoZW4gZ2FueiByZWNodHMgaW4gZWluZW0gVGV4dHdlcnQgenVyw7xjaw0KU0VBUkNICQkJPSBTVUNIRU4JCQkjIwlTdWNodCBuYWNoIGVpbmVtIFRleHR3ZXJ0LCBkZXIgaW4gZWluZW0gYW5kZXJlbiBUZXh0d2VydCBlbnRoYWx0ZW4gaXN0IChHcm/Dny0vS2xlaW5zY2hyZWlidW5nIHdpcmQgbmljaHQgdW50ZXJzY2hpZWRlbikNClNFQVJDSEIJCQk9IFNVQ0hFTkIJCQkjIwlTdWNodCBuYWNoIGVpbmVtIFRleHR3ZXJ0LCBkZXIgaW4gZWluZW0gYW5kZXJlbiBUZXh0d2VydCBlbnRoYWx0ZW4gaXN0IChHcm/Dny0vS2xlaW5zY2hyZWlidW5nIHdpcmQgbmljaHQgdW50ZXJzY2hpZWRlbikNClNVQlNUSVRVVEUJCT0gV0VDSFNFTE4JCQkjIwlFcnNldHp0IGluIGVpbmVyIFplaWNoZW5mb2xnZSBuZXVlbiBUZXh0IGdlZ2VuIGFsdGVuDQpUCQkJPSBUCQkJCSMjCVdhbmRlbHQgZGllIHp1Z2Vow7ZyaWdlbiBBcmd1bWVudGUgaW4gVGV4dCB1bQ0KVEVYVAkJCT0gVEVYVAkJCQkjIwlGb3JtYXRpZXJ0IGVpbmUgWmFobCB1bmQgd2FuZGVsdCBzaWUgaW4gVGV4dCB1bQ0KVFJJTQkJCT0gR0zDhFRURU4JCQkjIwlFbnRmZXJudCBMZWVyemVpY2hlbiBhdXMgVGV4dA0KVVBQRVIJCQk9IEdST1NTCQkJCSMjCVdhbmRlbHQgVGV4dCBpbiBHcm/Dn2J1Y2hzdGFiZW4gdW0NClZBTFVFCQkJPSBXRVJUCQkJCSMjCVdhbmRlbHQgZWluIFRleHRhcmd1bWVudCBpbiBlaW5lIFphaGwgdW0NCg==]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/locale/en/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/locale/en/uk/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/locale/en/uk/config</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[77u/IyMNCiMjIFBIUEV4Y2VsDQojIw0NCiMjIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTEgUEhQRXhjZWwNCiMjDQojIyBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yDQojIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljDQojIyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXINCiMjIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLg0KIyMNCiMjIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLA0KIyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YNCiMjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VDQojIyBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLg0KIyMNCiMjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMNCiMjIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUNCiMjIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQ0KIyMNCiMjIEBjYXRlZ29yeSAgIFBIUEV4Y2VsDQojIyBAcGFja2FnZSAgICBQSFBFeGNlbF9TZXR0aW5ncw0KIyMgQGNvcHlyaWdodCAgQ29weXJpZ2h0IChjKSAyMDA2IC0gMjAxMSBQSFBFeGNlbCAoaHR0cDovL3d3dy5jb2RlcGxleC5jb20vUEhQRXhjZWwpDQojIyBAbGljZW5zZSAgICBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvb2xkLWxpY2Vuc2VzL2xncGwtMi4xLnR4dAlMR1BMDQojIyBAdmVyc2lvbiAgICAxLjcuNywgMjAxMi0wNS0xOQ0KIyMNCiMjDQoNCg0KIyMNCiMjCShGb3IgZnV0dXJlIHVzZSkNCiMjDQpjdXJyZW5jeVN5bWJvbAk9IMKjDQo=]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/locale/es/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/locale/es/config</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[77u/IyMNCiMjIFBIUEV4Y2VsDQojIw0NCiMjIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTEgUEhQRXhjZWwNCiMjDQojIyBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yDQojIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljDQojIyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXINCiMjIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLg0KIyMNCiMjIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLA0KIyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YNCiMjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VDQojIyBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLg0KIyMNCiMjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMNCiMjIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUNCiMjIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQ0KIyMNCiMjIEBjYXRlZ29yeSAgIFBIUEV4Y2VsDQojIyBAcGFja2FnZSAgICBQSFBFeGNlbF9TZXR0aW5ncw0KIyMgQGNvcHlyaWdodCAgQ29weXJpZ2h0IChjKSAyMDA2IC0gMjAxMSBQSFBFeGNlbCAoaHR0cDovL3d3dy5jb2RlcGxleC5jb20vUEhQRXhjZWwpDQojIyBAbGljZW5zZSAgICBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvb2xkLWxpY2Vuc2VzL2xncGwtMi4xLnR4dAlMR1BMDQojIyBAdmVyc2lvbiAgICAxLjcuNywgMjAxMi0wNS0xOQ0KIyMNCiMjDQoNCg0KQXJndW1lbnRTZXBhcmF0b3IJPSA7DQoNCg0KIyMNCiMjCShGb3IgZnV0dXJlIHVzZSkNCiMjDQpjdXJyZW5jeVN5bWJvbAk9ICQJIyMJSSdtIHN1cnByaXNlZCB0aGF0IHRoZSBFeGNlbCBEb2N1bWVudGF0aW9uIHN1Z2dlc3RzICQgcmF0aGVyIHRoYW4g4oKsDQoNCg0KIyMNCiMjCUV4Y2VsIEVycm9yIENvZGVzCShGb3IgZnV0dXJlIHVzZSkNDQojIw0KTlVMTAk9ICPCoU5VTE8hDQpESVYwCT0gI8KhRElWLzAhDQpWQUxVRQk9ICPCoVZBTE9SIQ0KUkVGCT0gI8KhUkVGIQ0KTkFNRQk9ICPCv05PTUJSRT8NCk5VTQk9ICPCoU7Dmk0hDQpOQQk9ICNOL0ENCg==]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/locale/es/functions</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[77u/IyMNCiMjIFBIUEV4Y2VsDQojIw0NCiMjIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTEgUEhQRXhjZWwNCiMjDQojIyBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yDQojIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljDQojIyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXINCiMjIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLg0KIyMNCiMjIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLA0KIyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YNCiMjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VDQojIyBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLg0KIyMNCiMjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMNCiMjIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUNCiMjIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQ0KIyMNCiMjIEBjYXRlZ29yeSAgIFBIUEV4Y2VsDQojIyBAcGFja2FnZSAgICBQSFBFeGNlbF9DYWxjdWxhdGlvbg0KIyMgQGNvcHlyaWdodCAgQ29weXJpZ2h0IChjKSAyMDA2IC0gMjAxMSBQSFBFeGNlbCAoaHR0cDovL3d3dy5jb2RlcGxleC5jb20vUEhQRXhjZWwpDQojIyBAbGljZW5zZSAgICBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvb2xkLWxpY2Vuc2VzL2xncGwtMi4xLnR4dAlMR1BMDQojIyBAdmVyc2lvbiAgICAxLjcuNywgMjAxMi0wNS0xOQ0KIyMNCiMjIERhdGEgaW4gdGhpcyBmaWxlIGRlcml2ZWQgZnJvbSBodHRwOi8vd3d3LnBpdWhhLmZpL2V4Y2VsLWZ1bmN0aW9uLW5hbWUtdHJhbnNsYXRpb24vDQojIw0KIyMNCg0KDQojIw0KIyMJQWRkLWluIGFuZCBBdXRvbWF0aW9uIGZ1bmN0aW9ucwkJCQlGdW5jaW9uZXMgZGUgY29tcGxlbWVudG9zIHkgYXV0b21hdGl6YWNpw7NuDQojIw0KR0VUUElWT1REQVRBCQk9IElNUE9SVEFSREFUT1NESU5BTUlDT1MJCSMjCURldnVlbHZlIGxvcyBkYXRvcyBhbG1hY2VuYWRvcyBlbiB1biBpbmZvcm1lIGRlIHRhYmxhIGRpbsOhbWljYS4NCg0KDQojIw0KIyMJQ3ViZSBmdW5jdGlvbnMJCQkJCQlGdW5jaW9uZXMgZGUgY3Vibw0KIyMNCkNVQkVLUElNRU1CRVIJCT0gTUlFTUJST0tQSUNVQk8JCQkjIwlEZXZ1ZWx2ZSB1biBub21icmUsIHByb3BpZWRhZCB5IG1lZGlkYSBkZSBpbmRpY2Fkb3IgZGUgcmVuZGltaWVudG8gY2xhdmUgKEtQSSkgeSBtdWVzdHJhIGVsIG5vbWJyZSB5IGxhIHByb3BpZWRhZCBlbiBsYSBjZWxkYS4gVW4gS1BJIGVzIHVuYSBtZWRpZGEgY3VhbnRpZmljYWJsZSwgY29tbyBsb3MgYmVuZWZpY2lvcyBicnV0b3MgbWVuc3VhbGVzIG8gbGEgZmFjdHVyYWNpw7NuIHRyaW1lc3RyYWwgcG9yIGVtcGxlYWRvLCBxdWUgc2UgdXNhIHBhcmEgc3VwZXJ2aXNhciBlbCByZW5kaW1pZW50byBkZSB1bmEgb3JnYW5pemFjacOzbi4NCkNVQkVNRU1CRVIJCT0gTUlFTUJST0NVQk8JCQkJIyMJRGV2dWVsdmUgdW4gbWllbWJybyBvIHR1cGxhIGVuIHVuYSBqZXJhcnF1w61hIGRlIGN1Ym8uIFNlIHVzYSBwYXJhIHZhbGlkYXIgbGEgZXhpc3RlbmNpYSBkZWwgbWllbWJybyBvIGxhIHR1cGxhIGVuIGVsIGN1Ym8uDQpDVUJFTUVNQkVSUFJPUEVSVFkJPSBQUk9QSUVEQURNSUVNQlJPQ1VCTwkJCSMjCURldnVlbHZlIGVsIHZhbG9yIGRlIHVuYSBwcm9waWVkYWQgZGUgbWllbWJybyBkZWwgY3VibyBTZSB1c2EgcGFyYSB2YWxpZGFyIGxhIGV4aXN0ZW5jaWEgZGUgdW4gbm9tYnJlIGRlIG1pZW1icm8gZW4gZWwgY3VibyB5IHBhcmEgZGV2b2x2ZXIgbGEgcHJvcGllZGFkIGVzcGVjaWZpY2FkYSBwYXJhIGVzdGUgbWllbWJyby4NCkNVQkVSQU5LRURNRU1CRVIJPSBNSUVNQlJPUkFOR09DVUJPCQkJIyMJRGV2dWVsdmUgZWwgbWllbWJybyBuLCBvIGNsYXNpZmljYWRvLCBkZSB1biBjb25qdW50by4gU2UgdXNhIHBhcmEgZGV2b2x2ZXIgdW5vIG8gbcOhcyBlbGVtZW50b3MgZGUgdW4gY29uanVudG8sIHBvciBlamVtcGxvLCBlbCByZXByZXNlbnRhbnRlIGNvbiBtZWpvcmVzIHZlbnRhcyBvIGxvcyBkaWV6IG1lam9yZXMgYWx1bW5vcy4NCkNVQkVTRVQJCQk9IENPTkpVTlRPQ1VCTwkJCQkjIwlEZWZpbmUgdW4gY29uanVudG8gY2FsY3VsYWRvIGRlIG1pZW1icm9zIG8gdHVwbGFzIG1lZGlhbnRlIGVsIGVudsOtbyBkZSB1bmEgZXhwcmVzacOzbiBkZSBjb25qdW50byBhbCBjdWJvIGVuIGVsIHNlcnZpZG9yLCBsbyBxdWUgY3JlYSBlbCBjb25qdW50byB5LCBkZXNwdcOpcywgZGV2dWVsdmUgZGljaG8gY29uanVudG8gYSBNaWNyb3NvZnQgT2ZmaWNlIEV4Y2VsLg0KQ1VCRVNFVENPVU5UCQk9IFJFQ1VFTlRPQ09OSlVOVE9DVUJPCQkJIyMJRGV2dWVsdmUgZWwgbsO6bWVybyBkZSBlbGVtZW50b3MgZGUgdW4gY29uanVudG8uDQpDVUJFVkFMVUUJCT0gVkFMT1JDVUJPCQkJCSMjCURldnVlbHZlIHVuIHZhbG9yIGFncmVnYWRvIGRlIHVuIGN1Ym8uDQoNCg0KIyMNCiMjCURhdGFiYXNlIGZ1bmN0aW9ucwkJCQkJRnVuY2lvbmVzIGRlIGJhc2UgZGUgZGF0b3MNCiMjDQpEQVZFUkFHRQkJPSBCRFBST01FRElPCQkJCSMjCURldnVlbHZlIGVsIHByb21lZGlvIGRlIGxhcyBlbnRyYWRhcyBzZWxlY2Npb25hZGFzIGVuIGxhIGJhc2UgZGUgZGF0b3MuDQpEQ09VTlQJCQk9IEJEQ09OVEFSCQkJCSMjCUN1ZW50YSBlbCBuw7ptZXJvIGRlIGNlbGRhcyBxdWUgY29udGllbmVuIG7Dum1lcm9zIGVuIHVuYSBiYXNlIGRlIGRhdG9zLg0KRENPVU5UQQkJCT0gQkRDT05UQVJBCQkJCSMjCUN1ZW50YSBlbCBuw7ptZXJvIGRlIGNlbGRhcyBubyB2YWPDrWFzIGVuIHVuYSBiYXNlIGRlIGRhdG9zLg0KREdFVAkJCT0gQkRFWFRSQUVSCQkJCSMjCUV4dHJhZSBkZSB1bmEgYmFzZSBkZSBkYXRvcyB1biDDum5pY28gcmVnaXN0cm8gcXVlIGN1bXBsZSBsb3MgY3JpdGVyaW9zIGVzcGVjaWZpY2Fkb3MuDQpETUFYCQkJPSBCRE1BWAkJCQkJIyMJRGV2dWVsdmUgZWwgdmFsb3IgbcOheGltbyBkZSBsYXMgZW50cmFkYXMgc2VsZWNjaW9uYWRhcyBkZSBsYSBiYXNlIGRlIGRhdG9zLg0KRE1JTgkJCT0gQkRNSU4JCQkJCSMjCURldnVlbHZlIGVsIHZhbG9yIG3DrW5pbW8gZGUgbGFzIGVudHJhZGFzIHNlbGVjY2lvbmFkYXMgZGUgbGEgYmFzZSBkZSBkYXRvcy4NCkRQUk9EVUNUCQk9IEJEUFJPRFVDVE8JCQkJIyMJTXVsdGlwbGljYSBsb3MgdmFsb3JlcyBkZSB1biBjYW1wbyBjb25jcmV0byBkZSByZWdpc3Ryb3MgZGUgdW5hIGJhc2UgZGUgZGF0b3MgcXVlIGN1bXBsZW4gbG9zIGNyaXRlcmlvcyBlc3BlY2lmaWNhZG9zLg0KRFNUREVWCQkJPSBCRERFU1ZFU1QJCQkJIyMJQ2FsY3VsYSBsYSBkZXN2aWFjacOzbiBlc3TDoW5kYXIgYSBwYXJ0aXIgZGUgdW5hIG11ZXN0cmEgZGUgZW50cmFkYXMgc2VsZWNjaW9uYWRhcyBlbiBsYSBiYXNlIGRlIGRhdG9zLg0KRFNUREVWUAkJCT0gQkRERVNWRVNUUAkJCQkjIwlDYWxjdWxhIGxhIGRlc3ZpYWNpw7NuIGVzdMOhbmRhciBlbiBmdW5jacOzbiBkZSBsYSBwb2JsYWNpw7NuIHRvdGFsIGRlIGxhcyBlbnRyYWRhcyBzZWxlY2Npb25hZGFzIGRlIGxhIGJhc2UgZGUgZGF0b3MuDQpEU1VNCQkJPSBCRFNVTUEJCQkJIyMJU3VtYSBsb3MgbsO6bWVyb3MgZGUgbGEgY29sdW1uYSBkZSBjYW1wbyBkZSBsb3MgcmVnaXN0cm9zIGRlIGxhIGJhc2UgZGUgZGF0b3MgcXVlIGN1bXBsZW4gbG9zIGNyaXRlcmlvcy4NCkRWQVIJCQk9IEJEVkFSCQkJCQkjIwlDYWxjdWxhIGxhIHZhcmlhbnphIGEgcGFydGlyIGRlIHVuYSBtdWVzdHJhIGRlIGVudHJhZGFzIHNlbGVjY2lvbmFkYXMgZGUgbGEgYmFzZSBkZSBkYXRvcy4NCkRWQVJQCQkJPSBCRFZBUlAJCQkJIyMJQ2FsY3VsYSBsYSB2YXJpYW56YSBhIHBhcnRpciBkZSBsYSBwb2JsYWNpw7NuIHRvdGFsIGRlIGVudHJhZGFzIHNlbGVjY2lvbmFkYXMgZGUgbGEgYmFzZSBkZSBkYXRvcy4NCg0KDQojIw0KIyMJRGF0ZSBhbmQgdGltZSBmdW5jdGlvbnMJCQkJCUZ1bmNpb25lcyBkZSBmZWNoYSB5IGhvcmENCiMjDQpEQVRFCQkJPSBGRUNIQQkJCQkJIyMJRGV2dWVsdmUgZWwgbsO6bWVybyBkZSBzZXJpZSBjb3JyZXNwb25kaWVudGUgYSB1bmEgZmVjaGEgZGV0ZXJtaW5hZGEuDQpEQVRFVkFMVUUJCT0gRkVDSEFOVU1FUk8JCQkJIyMJQ29udmllcnRlIHVuYSBmZWNoYSBjb24gZm9ybWF0byBkZSB0ZXh0byBlbiB1biB2YWxvciBkZSBuw7ptZXJvIGRlIHNlcmllLg0KREFZCQkJPSBESUEJCQkJCSMjCUNvbnZpZXJ0ZSB1biBuw7ptZXJvIGRlIHNlcmllIGVuIHVuIHZhbG9yIGRlIGTDrWEgZGVsIG1lcy4NCkRBWVMzNjAJCQk9IERJQVMzNjAJCQkJIyMJQ2FsY3VsYSBlbCBuw7ptZXJvIGRlIGTDrWFzIGVudHJlIGRvcyBmZWNoYXMgYSBwYXJ0aXIgZGUgdW4gYcOxbyBkZSAzNjAgZMOtYXMuDQpFREFURQkJCT0gRkVDSEEuTUVTCQkJCSMjCURldnVlbHZlIGVsIG7Dum1lcm8gZGUgc2VyaWUgZGUgbGEgZmVjaGEgZXF1aXZhbGVudGUgYWwgbsO6bWVybyBpbmRpY2FkbyBkZSBtZXNlcyBhbnRlcmlvcmVzIG8gcG9zdGVyaW9yZXMgYSBsYSBmZWNoYSBpbmljaWFsLg0KRU9NT05USAkJCT0gRklOLk1FUwkJCQkjIwlEZXZ1ZWx2ZSBlbCBuw7ptZXJvIGRlIHNlcmllIGNvcnJlc3BvbmRpZW50ZSBhbCDDumx0aW1vIGTDrWEgZGVsIG1lcyBhbnRlcmlvciBvIHBvc3RlcmlvciBhIHVuIG7Dum1lcm8gZGUgbWVzZXMgZXNwZWNpZmljYWRvLg0KSE9VUgkJCT0gSE9SQQkJCQkJIyMJQ29udmllcnRlIHVuIG7Dum1lcm8gZGUgc2VyaWUgZW4gdW4gdmFsb3IgZGUgaG9yYS4NCk1JTlVURQkJCT0gTUlOVVRPCQkJCSMjCUNvbnZpZXJ0ZSB1biBuw7ptZXJvIGRlIHNlcmllIGVuIHVuIHZhbG9yIGRlIG1pbnV0by4NCk1PTlRICQkJPSBNRVMJCQkJCSMjCUNvbnZpZXJ0ZSB1biBuw7ptZXJvIGRlIHNlcmllIGVuIHVuIHZhbG9yIGRlIG1lcy4NCk5FVFdPUktEQVlTCQk9IERJQVMuTEFCCQkJCSMjCURldnVlbHZlIGVsIG7Dum1lcm8gZGUgdG9kb3MgbG9zIGTDrWFzIGxhYm9yYWJsZXMgZXhpc3RlbnRlcyBlbnRyZSBkb3MgZmVjaGFzLg0KTk9XCQkJPSBBSE9SQQkJCQkJIyMJRGV2dWVsdmUgZWwgbsO6bWVybyBkZSBzZXJpZSBjb3JyZXNwb25kaWVudGUgYSBsYSBmZWNoYSB5IGhvcmEgYWN0dWFsZXMuDQpTRUNPTkQJCQk9IFNFR1VORE8JCQkJIyMJQ29udmllcnRlIHVuIG7Dum1lcm8gZGUgc2VyaWUgZW4gdW4gdmFsb3IgZGUgc2VndW5kby4NClRJTUUJCQk9IEhPUkEJCQkJCSMjCURldnVlbHZlIGVsIG7Dum1lcm8gZGUgc2VyaWUgY29ycmVzcG9uZGllbnRlIGEgdW5hIGhvcmEgZGV0ZXJtaW5hZGEuDQpUSU1FVkFMVUUJCT0gSE9SQU5VTUVSTwkJCQkjIwlDb252aWVydGUgdW5hIGhvcmEgY29uIGZvcm1hdG8gZGUgdGV4dG8gZW4gdW4gdmFsb3IgZGUgbsO6bWVybyBkZSBzZXJpZS4NClRPREFZCQkJPSBIT1kJCQkJCSMjCURldnVlbHZlIGVsIG7Dum1lcm8gZGUgc2VyaWUgY29ycmVzcG9uZGllbnRlIGFsIGTDrWEgYWN0dWFsLg0KV0VFS0RBWQkJCT0gRElBU0VNCQkJCSMjCUNvbnZpZXJ0ZSB1biBuw7ptZXJvIGRlIHNlcmllIGVuIHVuIHZhbG9yIGRlIGTDrWEgZGUgbGEgc2VtYW5hLg0KV0VFS05VTQkJCT0gTlVNLkRFLlNFTUFOQQkJCQkjIwlDb252aWVydGUgdW4gbsO6bWVybyBkZSBzZXJpZSBlbiB1biBuw7ptZXJvIHF1ZSByZXByZXNlbnRhIGVsIGx1Z2FyIG51bcOpcmljbyBjb3JyZXNwb25kaWVudGUgYSB1bmEgc2VtYW5hIGRlIHVuIGHDsW8uDQpXT1JLREFZCQkJPSBESUEuTEFCCQkJCSMjCURldnVlbHZlIGVsIG7Dum1lcm8gZGUgc2VyaWUgZGUgbGEgZmVjaGEgcXVlIHRpZW5lIGx1Z2FyIGFudGVzIG8gZGVzcHXDqXMgZGUgdW4gbsO6bWVybyBkZXRlcm1pbmFkbyBkZSBkw61hcyBsYWJvcmFibGVzLg0KWUVBUgkJCT0gQcORTwkJCQkJIyMJQ29udmllcnRlIHVuIG7Dum1lcm8gZGUgc2VyaWUgZW4gdW4gdmFsb3IgZGUgYcOxby4NCllFQVJGUkFDCQk9IEZSQUMuQcORTwkJCQkjIwlEZXZ1ZWx2ZSBsYSBmcmFjY2nDs24gZGUgYcOxbyBxdWUgcmVwcmVzZW50YSBlbCBuw7ptZXJvIHRvdGFsIGRlIGTDrWFzIGV4aXN0ZW50ZXMgZW50cmUgZWwgdmFsb3IgZGUgZmVjaGFfaW5pY2lhbCB5IGVsIGRlIGZlY2hhX2ZpbmFsLg0KDQoNCiMjDQojIwlFbmdpbmVlcmluZyBmdW5jdGlvbnMJCQkJCUZ1bmNpb25lcyBkZSBpbmdlbmllcsOtYQ0KIyMNCkJFU1NFTEkJCQk9IEJFU1NFTEkJCQkJIyMJRGV2dWVsdmUgbGEgZnVuY2nDs24gQmVzc2VsIEluKHgpIG1vZGlmaWNhZGEuDQpCRVNTRUxKCQkJPSBCRVNTRUxKCQkJCSMjCURldnVlbHZlIGxhIGZ1bmNpw7NuIEJlc3NlbCBKbih4KS4NCkJFU1NFTEsJCQk9IEJFU1NFTEsJCQkJIyMJRGV2dWVsdmUgbGEgZnVuY2nDs24gQmVzc2VsIEtuKHgpIG1vZGlmaWNhZGEuDQpCRVNTRUxZCQkJPSBCRVNTRUxZCQkJCSMjCURldnVlbHZlIGxhIGZ1bmNpw7NuIEJlc3NlbCBZbih4KS4NCkJJTjJERUMJCQk9IEJJTi5BLkRFQwkJCQkjIwlDb252aWVydGUgdW4gbsO6bWVybyBiaW5hcmlvIGVuIGRlY2ltYWwuDQpCSU4ySEVYCQkJPSBCSU4uQS5IRVgJCQkJIyMJQ29udmllcnRlIHVuIG7Dum1lcm8gYmluYXJpbyBlbiBoZXhhZGVjaW1hbC4NCkJJTjJPQ1QJCQk9IEJJTi5BLk9DVAkJCQkjIwlDb252aWVydGUgdW4gbsO6bWVybyBiaW5hcmlvIGVuIG9jdGFsLg0KQ09NUExFWAkJCT0gQ09NUExFSk8JCQkJIyMJQ29udmllcnRlIGNvZWZpY2llbnRlcyByZWFsZXMgZSBpbWFnaW5hcmlvcyBlbiB1biBuw7ptZXJvIGNvbXBsZWpvLg0KQ09OVkVSVAkJCT0gQ09OVkVSVElSCQkJCSMjCUNvbnZpZXJ0ZSB1biBuw7ptZXJvIGRlIHVuIHNpc3RlbWEgZGUgbWVkaWRhIGEgb3Ryby4NCkRFQzJCSU4JCQk9IERFQy5BLkJJTgkJCQkjIwlDb252aWVydGUgdW4gbsO6bWVybyBkZWNpbWFsIGVuIGJpbmFyaW8uDQpERUMySEVYCQkJPSBERUMuQS5IRVgJCQkJIyMJQ29udmllcnRlIHVuIG7Dum1lcm8gZGVjaW1hbCBlbiBoZXhhZGVjaW1hbC4NCkRFQzJPQ1QJCQk9IERFQy5BLk9DVAkJCQkjIwlDb252aWVydGUgdW4gbsO6bWVybyBkZWNpbWFsIGVuIG9jdGFsLg0KREVMVEEJCQk9IERFTFRBCQkJCQkjIwlDb21wcnVlYmEgc2kgZG9zIHZhbG9yZXMgc29uIGlndWFsZXMuDQpFUkYJCQk9IEZVTi5FUlJPUgkJCQkjIwlEZXZ1ZWx2ZSBsYSBmdW5jacOzbiBkZSBlcnJvci4NCkVSRkMJCQk9IEZVTi5FUlJPUi5DT01QTAkJCSMjCURldnVlbHZlIGxhIGZ1bmNpw7NuIGRlIGVycm9yIGNvbXBsZW1lbnRhcmlvLg0KR0VTVEVQCQkJPSBNQVlPUi5PLklHVUFMCQkJCSMjCUNvbXBydWViYSBzaSB1biBuw7ptZXJvIGVzIG1heW9yIHF1ZSB1biB2YWxvciBkZSB1bWJyYWwuDQpIRVgyQklOCQkJPSBIRVguQS5CSU4JCQkJIyMJQ29udmllcnRlIHVuIG7Dum1lcm8gaGV4YWRlY2ltYWwgZW4gYmluYXJpby4NCkhFWDJERUMJCQk9IEhFWC5BLkRFQwkJCQkjIwlDb252aWVydGUgdW4gbsO6bWVybyBoZXhhZGVjaW1hbCBlbiBkZWNpbWFsLg0KSEVYMk9DVAkJCT0gSEVYLkEuT0NUCQkJCSMjCUNvbnZpZXJ0ZSB1biBuw7ptZXJvIGhleGFkZWNpbWFsIGVuIG9jdGFsLg0KSU1BQlMJCQk9IElNLkFCUwkJCQkjIwlEZXZ1ZWx2ZSBlbCB2YWxvciBhYnNvbHV0byAobcOzZHVsbykgZGUgdW4gbsO6bWVybyBjb21wbGVqby4NCklNQUdJTkFSWQkJPSBJTUFHSU5BUklPCQkJCSMjCURldnVlbHZlIGVsIGNvZWZpY2llbnRlIGltYWdpbmFyaW8gZGUgdW4gbsO6bWVybyBjb21wbGVqby4NCklNQVJHVU1FTlQJCT0gSU0uQU5HVUxPCQkJCSMjCURldnVlbHZlIGVsIGFyZ3VtZW50byB0aGV0YSwgdW4gw6FuZ3VsbyBleHByZXNhZG8gZW4gcmFkaWFuZXMuDQpJTUNPTkpVR0FURQkJPSBJTS5DT05KVUdBREEJCQkJIyMJRGV2dWVsdmUgbGEgY29uanVnYWRhIGNvbXBsZWphIGRlIHVuIG7Dum1lcm8gY29tcGxlam8uDQpJTUNPUwkJCT0gSU0uQ09TCQkJCSMjCURldnVlbHZlIGVsIGNvc2VubyBkZSB1biBuw7ptZXJvIGNvbXBsZWpvLg0KSU1ESVYJCQk9IElNLkRJVgkJCQkjIwlEZXZ1ZWx2ZSBlbCBjb2NpZW50ZSBkZSBkb3MgbsO6bWVyb3MgY29tcGxlam9zLg0KSU1FWFAJCQk9IElNLkVYUAkJCQkjIwlEZXZ1ZWx2ZSBlbCB2YWxvciBleHBvbmVuY2lhbCBkZSB1biBuw7ptZXJvIGNvbXBsZWpvLg0KSU1MTgkJCT0gSU0uTE4JCQkJCSMjCURldnVlbHZlIGVsIGxvZ2FyaXRtbyBuYXR1cmFsIChuZXBlcmlhbm8pIGRlIHVuIG7Dum1lcm8gY29tcGxlam8uDQpJTUxPRzEwCQkJPSBJTS5MT0cxMAkJCQkjIwlEZXZ1ZWx2ZSBlbCBsb2dhcml0bW8gZW4gYmFzZSAxMCBkZSB1biBuw7ptZXJvIGNvbXBsZWpvLg0KSU1MT0cyCQkJPSBJTS5MT0cyCQkJCSMjCURldnVlbHZlIGVsIGxvZ2FyaXRtbyBlbiBiYXNlIDIgZGUgdW4gbsO6bWVybyBjb21wbGVqby4NCklNUE9XRVIJCQk9IElNLlBPVAkJCQkjIwlEZXZ1ZWx2ZSB1biBuw7ptZXJvIGNvbXBsZWpvIGVsZXZhZG8gYSB1bmEgcG90ZW5jaWEgZW50ZXJhLg0KSU1QUk9EVUNUCQk9IElNLlBST0RVQ1QJCQkJIyMJRGV2dWVsdmUgZWwgcHJvZHVjdG8gZGUgbsO6bWVyb3MgY29tcGxlam9zLg0KSU1SRUFMCQkJPSBJTS5SRUFMCQkJCSMjCURldnVlbHZlIGVsIGNvZWZpY2llbnRlIHJlYWwgZGUgdW4gbsO6bWVybyBjb21wbGVqby4NCklNU0lOCQkJPSBJTS5TRU5PCQkJCSMjCURldnVlbHZlIGVsIHNlbm8gZGUgdW4gbsO6bWVybyBjb21wbGVqby4NCklNU1FSVAkJCT0gSU0uUkFJWjIJCQkJIyMJRGV2dWVsdmUgbGEgcmHDrXogY3VhZHJhZGEgZGUgdW4gbsO6bWVybyBjb21wbGVqby4NCklNU1VCCQkJPSBJTS5TVVNUUgkJCQkjIwlEZXZ1ZWx2ZSBsYSBkaWZlcmVuY2lhIGVudHJlIGRvcyBuw7ptZXJvcyBjb21wbGVqb3MuDQpJTVNVTQkJCT0gSU0uU1VNCQkJCSMjCURldnVlbHZlIGxhIHN1bWEgZGUgbsO6bWVyb3MgY29tcGxlam9zLg0KT0NUMkJJTgkJCT0gT0NULkEuQklOCQkJCSMjCUNvbnZpZXJ0ZSB1biBuw7ptZXJvIG9jdGFsIGVuIGJpbmFyaW8uDQpPQ1QyREVDCQkJPSBPQ1QuQS5ERUMJCQkJIyMJQ29udmllcnRlIHVuIG7Dum1lcm8gb2N0YWwgZW4gZGVjaW1hbC4NCk9DVDJIRVgJCQk9IE9DVC5BLkhFWAkJCQkjIwlDb252aWVydGUgdW4gbsO6bWVybyBvY3RhbCBlbiBoZXhhZGVjaW1hbC4NCg0KDQojIw0KIyMJRmluYW5jaWFsIGZ1bmN0aW9ucwkJCQkJRnVuY2lvbmVzIGZpbmFuY2llcmFzDQojIw0KQUNDUklOVAkJCT0gSU5ULkFDVU0JCQkJIyMJRGV2dWVsdmUgZWwgaW50ZXLDqXMgYWN1bXVsYWRvIGRlIHVuIHZhbG9yIGJ1cnPDoXRpbCBjb24gcGFnb3MgZGUgaW50ZXLDqXMgcGVyacOzZGljb3MuDQpBQ0NSSU5UTQkJPSBJTlQuQUNVTS5WCQkJCSMjCURldnVlbHZlIGVsIGludGVyw6lzIGFjdW11bGFkbyBkZSB1biB2YWxvciBidXJzw6F0aWwgY29uIHBhZ29zIGRlIGludGVyw6lzIGFsIHZlbmNpbWllbnRvLg0KQU1PUkRFR1JDCQk9IEFNT1JUSVouUFJPR1JFCQkJIyMJRGV2dWVsdmUgbGEgYW1vcnRpemFjacOzbiBkZSBjYWRhIHBlcsOtb2RvIGNvbnRhYmxlIG1lZGlhbnRlIGVsIHVzbyBkZSB1biBjb2VmaWNpZW50ZSBkZSBhbW9ydGl6YWNpw7NuLg0KQU1PUkxJTkMJCT0gQU1PUlRJWi5MSU4JCQkJIyMJRGV2dWVsdmUgbGEgYW1vcnRpemFjacOzbiBkZSBjYWRhIHVubyBkZSBsb3MgcGVyw61vZG9zIGNvbnRhYmxlcy4NCkNPVVBEQVlCUwkJPSBDVVBPTi5ESUFTLkwxCQkJCSMjCURldnVlbHZlIGVsIG7Dum1lcm8gZGUgZMOtYXMgZGVzZGUgZWwgcHJpbmNpcGlvIGRlbCBwZXLDrW9kbyBkZSB1biBjdXDDs24gaGFzdGEgbGEgZmVjaGEgZGUgbGlxdWlkYWNpw7NuLg0KQ09VUERBWVMJCT0gQ1VQT04uRElBUwkJCQkjIwlEZXZ1ZWx2ZSBlbCBuw7ptZXJvIGRlIGTDrWFzIGRlbCBwZXLDrW9kbyAoZW50cmUgZG9zIGN1cG9uZXMpIGRvbmRlIHNlIGVuY3VlbnRyYSBsYSBmZWNoYSBkZSBsaXF1aWRhY2nDs24uDQpDT1VQREFZU05DCQk9IENVUE9OLkRJQVMuTDIJCQkJIyMJRGV2dWVsdmUgZWwgbsO6bWVybyBkZSBkw61hcyBkZXNkZSBsYSBmZWNoYSBkZSBsaXF1aWRhY2nDs24gaGFzdGEgbGEgZmVjaGEgZGVsIHByw7N4aW1vIGN1cMOzbi4NCkNPVVBOQ0QJCQk9IENVUE9OLkZFQ0hBLkwyCQkJIyMJRGV2dWVsdmUgbGEgZmVjaGEgZGVsIHByw7N4aW1vIGN1cMOzbiBkZXNwdcOpcyBkZSBsYSBmZWNoYSBkZSBsaXF1aWRhY2nDs24uDQpDT1VQTlVNCQkJPSBDVVBPTi5OVU0JCQkJIyMJRGV2dWVsdmUgZWwgbsO6bWVybyBkZSBwYWdvcyBkZSBjdXDDs24gZW50cmUgbGEgZmVjaGEgZGUgbGlxdWlkYWNpw7NuIHkgbGEgZmVjaGEgZGUgdmVuY2ltaWVudG8uDQpDT1VQUENECQkJPSBDVVBPTi5GRUNIQS5MMQkJCSMjCURldnVlbHZlIGxhIGZlY2hhIGRlIGN1cMOzbiBhbnRlcmlvciBhIGxhIGZlY2hhIGRlIGxpcXVpZGFjacOzbi4NCkNVTUlQTVQJCQk9IFBBR08uSU5ULkVOVFJFCQkJIyMJRGV2dWVsdmUgZWwgaW50ZXLDqXMgYWN1bXVsYWRvIHBhZ2FkbyBlbnRyZSBkb3MgcGVyw61vZG9zLg0KQ1VNUFJJTkMJCT0gUEFHTy5QUklOQy5FTlRSRQkJCSMjCURldnVlbHZlIGVsIGNhcGl0YWwgYWN1bXVsYWRvIHBhZ2FkbyBkZSB1biBwcsOpc3RhbW8gZW50cmUgZG9zIHBlcsOtb2Rvcy4NCkRCCQkJPSBEQgkJCQkJIyMJRGV2dWVsdmUgbGEgYW1vcnRpemFjacOzbiBkZSB1biBiaWVuIGR1cmFudGUgdW4gcGVyw61vZG8gZXNwZWPDrWZpY28gYSB0cmF2w6lzIGRlbCBtw6l0b2RvIGRlIGFtb3J0aXphY2nDs24gZGUgc2FsZG8gZmlqby4NCkREQgkJCT0gRERCCQkJCQkjIwlEZXZ1ZWx2ZSBsYSBhbW9ydGl6YWNpw7NuIGRlIHVuIGJpZW4gZHVyYW50ZSB1biBwZXLDrW9kbyBlc3BlY8OtZmljbyBhIHRyYXbDqXMgZGVsIG3DqXRvZG8gZGUgYW1vcnRpemFjacOzbiBwb3IgZG9ibGUgZGlzbWludWNpw7NuIGRlIHNhbGRvIHUgb3RybyBtw6l0b2RvIHF1ZSBzZSBlc3BlY2lmaXF1ZS4NCkRJU0MJCQk9IFRBU0EuREVTQwkJCQkjIwlEZXZ1ZWx2ZSBsYSB0YXNhIGRlIGRlc2N1ZW50byBkZSB1biB2YWxvciBidXJzw6F0aWwuDQpET0xMQVJERQkJPSBNT05FREEuREVDCQkJCSMjCUNvbnZpZXJ0ZSB1bmEgY290aXphY2nDs24gZGUgdW4gdmFsb3IgYnVyc8OhdGlsIGV4cHJlc2FkYSBlbiBmb3JtYSBmcmFjY2lvbmFyaWEgZW4gdW5hIGNvdGl6YWNpw7NuIGRlIHVuIHZhbG9yIGJ1cnPDoXRpbCBleHByZXNhZGEgZW4gZm9ybWEgZGVjaW1hbC4NCkRPTExBUkZSCQk9IE1PTkVEQS5GUkFDCQkJCSMjCUNvbnZpZXJ0ZSB1bmEgY290aXphY2nDs24gZGUgdW4gdmFsb3IgYnVyc8OhdGlsIGV4cHJlc2FkYSBlbiBmb3JtYSBkZWNpbWFsIGVuIHVuYSBjb3RpemFjacOzbiBkZSB1biB2YWxvciBidXJzw6F0aWwgZXhwcmVzYWRhIGVuIGZvcm1hIGZyYWNjaW9uYXJpYS4NCkRVUkFUSU9OCQk9IERVUkFDSU9OCQkJCSMjCURldnVlbHZlIGxhIGR1cmFjacOzbiBhbnVhbCBkZSB1biB2YWxvciBidXJzw6F0aWwgY29uIHBhZ29zIGRlIGludGVyw6lzIHBlcmnDs2RpY28uDQpFRkZFQ1QJCQk9IElOVC5FRkVDVElWTwkJCQkjIwlEZXZ1ZWx2ZSBsYSB0YXNhIGRlIGludGVyw6lzIGFudWFsIGVmZWN0aXZhLg0KRlYJCQk9IFZGCQkJCQkjIwlEZXZ1ZWx2ZSBlbCB2YWxvciBmdXR1cm8gZGUgdW5hIGludmVyc2nDs24uDQpGVlNDSEVEVUxFCQk9IFZGLlBMQU4JCQkJIyMJRGV2dWVsdmUgZWwgdmFsb3IgZnV0dXJvIGRlIHVuIGNhcGl0YWwgaW5pY2lhbCBkZXNwdcOpcyBkZSBhcGxpY2FyIHVuYSBzZXJpZSBkZSB0YXNhcyBkZSBpbnRlcsOpcyBjb21wdWVzdG8uDQpJTlRSQVRFCQkJPSBUQVNBLklOVAkJCQkjIwlEZXZ1ZWx2ZSBsYSB0YXNhIGRlIGludGVyw6lzIHBhcmEgbGEgaW52ZXJzacOzbiB0b3RhbCBkZSB1biB2YWxvciBidXJzw6F0aWwuDQpJUE1UCQkJPSBQQUdPSU5UCQkJCSMjCURldnVlbHZlIGVsIHBhZ28gZGUgaW50ZXJlc2VzIGRlIHVuYSBpbnZlcnNpw7NuIGR1cmFudGUgdW4gcGVyw61vZG8gZGV0ZXJtaW5hZG8uDQpJUlIJCQk9IFRJUgkJCQkJIyMJRGV2dWVsdmUgbGEgdGFzYSBpbnRlcm5hIGRlIHJldG9ybm8gcGFyYSB1bmEgc2VyaWUgZGUgZmx1am9zIGRlIGVmZWN0aXZvIHBlcmnDs2RpY29zLg0KSVNQTVQJCQk9IElOVC5QQUdPLkRJUgkJCQkjIwlDYWxjdWxhIGVsIGludGVyw6lzIHBhZ2FkbyBkdXJhbnRlIHVuIHBlcsOtb2RvIGVzcGVjw61maWNvIGRlIHVuYSBpbnZlcnNpw7NuLg0KTURVUkFUSU9OCQk9IERVUkFDSU9OLk1PRElGCQkJIyMJRGV2dWVsdmUgbGEgZHVyYWNpw7NuIGRlIE1hY2F1bGV5IG1vZGlmaWNhZGEgZGUgdW4gdmFsb3IgYnVyc8OhdGlsIGNvbiB1biB2YWxvciBub21pbmFsIHN1cHVlc3RvIGRlIDEwMCAkLg0KTUlSUgkJCT0gVElSTQkJCQkJIyMJRGV2dWVsdmUgbGEgdGFzYSBpbnRlcm5hIGRlIHJldG9ybm8gZG9uZGUgc2UgZmluYW5jaWFuIGZsdWpvcyBkZSBlZmVjdGl2byBwb3NpdGl2b3MgeSBuZWdhdGl2b3MgYSB0YXNhcyBkaWZlcmVudGVzLg0KTk9NSU5BTAkJCT0gVEFTQS5OT01JTkFMCQkJCSMjCURldnVlbHZlIGxhIHRhc2Egbm9taW5hbCBkZSBpbnRlcsOpcyBhbnVhbC4NCk5QRVIJCQk9IE5QRVIJCQkJCSMjCURldnVlbHZlIGVsIG7Dum1lcm8gZGUgcGVyw61vZG9zIGRlIHVuYSBpbnZlcnNpw7NuLg0KTlBWCQkJPSBWTkEJCQkJCSMjCURldnVlbHZlIGVsIHZhbG9yIG5ldG8gYWN0dWFsIGRlIHVuYSBpbnZlcnNpw7NuIGVuIGZ1bmNpw7NuIGRlIHVuYSBzZXJpZSBkZSBmbHVqb3MgcGVyacOzZGljb3MgZGUgZWZlY3Rpdm8geSB1bmEgdGFzYSBkZSBkZXNjdWVudG8uDQpPRERGUFJJQ0UJCT0gUFJFQ0lPLlBFUi5JUlJFR1VMQVIuMQkJIyMJRGV2dWVsdmUgZWwgcHJlY2lvIHBvciB1biB2YWxvciBub21pbmFsIGRlIDEwMCAkIGRlIHVuIHZhbG9yIGJ1cnPDoXRpbCBjb24gdW4gcHJpbWVyIHBlcsOtb2RvIGltcGFyLg0KT0RERllJRUxECQk9IFJFTkRUTy5QRVIuSVJSRUdVTEFSLjEJCSMjCURldnVlbHZlIGVsIHJlbmRpbWllbnRvIGRlIHVuIHZhbG9yIGJ1cnPDoXRpbCBjb24gdW4gcHJpbWVyIHBlcsOtb2RvIGltcGFyLg0KT0RETFBSSUNFCQk9IFBSRUNJTy5QRVIuSVJSRUdVTEFSLjIJCSMjCURldnVlbHZlIGVsIHByZWNpbyBwb3IgdW4gdmFsb3Igbm9taW5hbCBkZSAxMDAgJCBkZSB1biB2YWxvciBidXJzw6F0aWwgY29uIHVuIMO6bHRpbW8gcGVyw61vZG8gaW1wYXIuDQpPRERMWUlFTEQJCT0gUkVORFRPLlBFUi5JUlJFR1VMQVIuMgkJIyMJRGV2dWVsdmUgZWwgcmVuZGltaWVudG8gZGUgdW4gdmFsb3IgYnVyc8OhdGlsIGNvbiB1biDDumx0aW1vIHBlcsOtb2RvIGltcGFyLg0KUE1UCQkJPSBQQUdPCQkJCQkjIwlEZXZ1ZWx2ZSBlbCBwYWdvIHBlcmnDs2RpY28gZGUgdW5hIGFudWFsaWRhZC4NClBQTVQJCQk9IFBBR09QUklOCQkJCSMjCURldnVlbHZlIGVsIHBhZ28gZGUgY2FwaXRhbCBkZSB1bmEgaW52ZXJzacOzbiBkdXJhbnRlIHVuIHBlcsOtb2RvIGRldGVybWluYWRvLg0KUFJJQ0UJCQk9IFBSRUNJTwkJCQkjIwlEZXZ1ZWx2ZSBlbCBwcmVjaW8gcG9yIHVuIHZhbG9yIG5vbWluYWwgZGUgMTAwICQgZGUgdW4gdmFsb3IgYnVyc8OhdGlsIHF1ZSBwYWdhIHVuYSB0YXNhIGRlIGludGVyw6lzIHBlcmnDs2RpY28uDQpQUklDRURJU0MJCT0gUFJFQ0lPLkRFU0NVRU5UTwkJCSMjCURldnVlbHZlIGVsIHByZWNpbyBwb3IgdW4gdmFsb3Igbm9taW5hbCBkZSAxMDAgJCBkZSB1biB2YWxvciBidXJzw6F0aWwgY29uIGRlc2N1ZW50by4NClBSSUNFTUFUCQk9IFBSRUNJTy5WRU5DSU1JRU5UTwkJCSMjCURldnVlbHZlIGVsIHByZWNpbyBwb3IgdW4gdmFsb3Igbm9taW5hbCBkZSAxMDAgJCBkZSB1biB2YWxvciBidXJzw6F0aWwgcXVlIHBhZ2EgaW50ZXLDqXMgYSBzdSB2ZW5jaW1pZW50by4NClBWCQkJPSBWQUxBQ1QJCQkJIyMJRGV2dWVsdmUgZWwgdmFsb3IgYWN0dWFsIGRlIHVuYSBpbnZlcnNpw7NuLg0KUkFURQkJCT0gVEFTQQkJCQkJIyMJRGV2dWVsdmUgbGEgdGFzYSBkZSBpbnRlcsOpcyBwb3IgcGVyw61vZG8gZGUgdW5hIGFudWFsaWRhZC4NClJFQ0VJVkVECQk9IENBTlRJREFELlJFQ0lCSURBCQkJIyMJRGV2dWVsdmUgbGEgY2FudGlkYWQgcmVjaWJpZGEgYWwgdmVuY2ltaWVudG8gZGUgdW4gdmFsb3IgYnVyc8OhdGlsIGNvbXBsZXRhbWVudGUgaW52ZXJ0aWRvLg0KU0xOCQkJPSBTTE4JCQkJCSMjCURldnVlbHZlIGxhIGFtb3J0aXphY2nDs24gcG9yIG3DqXRvZG8gZGlyZWN0byBkZSB1biBiaWVuIGVuIHVuIHBlcsOtb2RvIGRhZG8uDQpTWUQJCQk9IFNZRAkJCQkJIyMJRGV2dWVsdmUgbGEgYW1vcnRpemFjacOzbiBwb3Igc3VtYSBkZSBkw61naXRvcyBkZSBsb3MgYcOxb3MgZGUgdW4gYmllbiBkdXJhbnRlIHVuIHBlcsOtb2RvIGVzcGVjaWZpY2Fkby4NClRCSUxMRVEJCQk9IExFVFJBLkRFLlRFUy5FUVYuQS5CT05PCQkjIwlEZXZ1ZWx2ZSBlbCByZW5kaW1pZW50byBkZSB1biBib25vIGVxdWl2YWxlbnRlIGEgdW5hIGxldHJhIGRlbCBUZXNvcm8gKGRlIEVFLlVVLikNClRCSUxMUFJJQ0UJCT0gTEVUUkEuREUuVEVTLlBSRUNJTwkJCSMjCURldnVlbHZlIGVsIHByZWNpbyBwb3IgdW4gdmFsb3Igbm9taW5hbCBkZSAxMDAgJCBkZSB1bmEgbGV0cmEgZGVsIFRlc29ybyAoZGUgRUUuVVUuKQ0KVEJJTExZSUVMRAkJPSBMRVRSQS5ERS5URVMuUkVORFRPCQkJIyMJRGV2dWVsdmUgZWwgcmVuZGltaWVudG8gZGUgdW5hIGxldHJhIGRlbCBUZXNvcm8gKGRlIEVFLlVVLikNClZEQgkJCT0gRFZTCQkJCQkjIwlEZXZ1ZWx2ZSBsYSBhbW9ydGl6YWNpw7NuIGRlIHVuIGJpZW4gZHVyYW50ZSB1biBwZXLDrW9kbyBlc3BlY8OtZmljbyBvIHBhcmNpYWwgYSB0cmF2w6lzIGRlbCBtw6l0b2RvIGRlIGPDoWxjdWxvIGRlbCBzYWxkbyBlbiBkaXNtaW51Y2nDs24uDQpYSVJSCQkJPSBUSVIuTk8uUEVSCQkJCSMjCURldnVlbHZlIGxhIHRhc2EgaW50ZXJuYSBkZSByZXRvcm5vIHBhcmEgdW4gZmx1am8gZGUgZWZlY3Rpdm8gcXVlIG5vIGVzIG5lY2VzYXJpYW1lbnRlIHBlcmnDs2RpY28uDQpYTlBWCQkJPSBWTkEuTk8uUEVSCQkJCSMjCURldnVlbHZlIGVsIHZhbG9yIG5ldG8gYWN0dWFsIHBhcmEgdW4gZmx1am8gZGUgZWZlY3Rpdm8gcXVlIG5vIGVzIG5lY2VzYXJpYW1lbnRlIHBlcmnDs2RpY28uDQpZSUVMRAkJCT0gUkVORFRPCQkJCSMjCURldnVlbHZlIGVsIHJlbmRpbWllbnRvIGRlIHVuIHZhbG9yIGJ1cnPDoXRpbCBxdWUgcGFnYSBpbnRlcmVzZXMgcGVyacOzZGljb3MuDQpZSUVMRERJU0MJCT0gUkVORFRPLkRFU0MJCQkJIyMJRGV2dWVsdmUgZWwgcmVuZGltaWVudG8gYW51YWwgZGUgdW4gdmFsb3IgYnVyc8OhdGlsIGNvbiBkZXNjdWVudG87IHBvciBlamVtcGxvLCB1bmEgbGV0cmEgZGVsIFRlc29ybyAoZGUgRUUuVVUuKQ0KWUlFTERNQVQJCT0gUkVORFRPLlZFTkNUTwkJCQkjIwlEZXZ1ZWx2ZSBlbCByZW5kaW1pZW50byBhbnVhbCBkZSB1biB2YWxvciBidXJzw6F0aWwgcXVlIHBhZ2EgaW50ZXJlc2VzIGFsIHZlbmNpbWllbnRvLg0KDQoNCiMjDQojIwlJbmZvcm1hdGlvbiBmdW5jdGlvbnMJCQkJCUZ1bmNpb25lcyBkZSBpbmZvcm1hY2nDs24NCiMjDQpDRUxMCQkJPSBDRUxEQQkJCQkJIyMJRGV2dWVsdmUgaW5mb3JtYWNpw7NuIGFjZXJjYSBkZWwgZm9ybWF0bywgbGEgdWJpY2FjacOzbiBvIGVsIGNvbnRlbmlkbyBkZSB1bmEgY2VsZGEuDQpFUlJPUi5UWVBFCQk9IFRJUE8uREUuRVJST1IJCQkJIyMJRGV2dWVsdmUgdW4gbsO6bWVybyBxdWUgY29ycmVzcG9uZGUgYSB1biB0aXBvIGRlIGVycm9yLg0KSU5GTwkJCT0gSU5GTwkJCQkJIyMJRGV2dWVsdmUgaW5mb3JtYWNpw7NuIGFjZXJjYSBkZWwgZW50b3JubyBvcGVyYXRpdm8gZW4gdXNvLg0KSVNCTEFOSwkJCT0gRVNCTEFOQ08JCQkJIyMJRGV2dWVsdmUgVkVSREFERVJPIHNpIGVsIHZhbG9yIGVzdMOhIGVuIGJsYW5jby4NCklTRVJSCQkJPSBFU0VSUgkJCQkJIyMJRGV2dWVsdmUgVkVSREFERVJPIHNpIGVsIHZhbG9yIGVzIGN1YWxxdWllciB2YWxvciBkZSBlcnJvciBleGNlcHRvICNOL0EuDQpJU0VSUk9SCQkJPSBFU0VSUk9SCQkJCSMjCURldnVlbHZlIFZFUkRBREVSTyBzaSBlbCB2YWxvciBlcyBjdWFscXVpZXIgdmFsb3IgZGUgZXJyb3IuDQpJU0VWRU4JCQk9IEVTLlBBUgkJCQkjIwlEZXZ1ZWx2ZSBWRVJEQURFUk8gc2kgZWwgbsO6bWVybyBlcyBwYXIuDQpJU0xPR0lDQUwJCT0gRVNMT0dJQ08JCQkJIyMJRGV2dWVsdmUgVkVSREFERVJPIHNpIGVsIHZhbG9yIGVzIHVuIHZhbG9yIGzDs2dpY28uDQpJU05BCQkJPSBFU05PRAkJCQkJIyMJRGV2dWVsdmUgVkVSREFERVJPIHNpIGVsIHZhbG9yIGVzIGVsIHZhbG9yIGRlIGVycm9yICNOL0EuDQpJU05PTlRFWFQJCT0gRVNOT1RFWFRPCQkJCSMjCURldnVlbHZlIFZFUkRBREVSTyBzaSBlbCB2YWxvciBubyBlcyB0ZXh0by4NCklTTlVNQkVSCQk9IEVTTlVNRVJPCQkJCSMjCURldnVlbHZlIFZFUkRBREVSTyBzaSBlbCB2YWxvciBlcyB1biBuw7ptZXJvLg0KSVNPREQJCQk9IEVTLklNUEFSCQkJCSMjCURldnVlbHZlIFZFUkRBREVSTyBzaSBlbCBuw7ptZXJvIGVzIGltcGFyLg0KSVNSRUYJCQk9IEVTUkVGCQkJCQkjIwlEZXZ1ZWx2ZSBWRVJEQURFUk8gc2kgZWwgdmFsb3IgZXMgdW5hIHJlZmVyZW5jaWEuDQpJU1RFWFQJCQk9IEVTVEVYVE8JCQkJIyMJRGV2dWVsdmUgVkVSREFERVJPIHNpIGVsIHZhbG9yIGVzIHRleHRvLg0KTgkJCT0gTgkJCQkJIyMJRGV2dWVsdmUgdW4gdmFsb3IgY29udmVydGlkbyBlbiB1biBuw7ptZXJvLg0KTkEJCQk9IE5ECQkJCQkjIwlEZXZ1ZWx2ZSBlbCB2YWxvciBkZSBlcnJvciAjTi9BLg0KVFlQRQkJCT0gVElQTwkJCQkJIyMJRGV2dWVsdmUgdW4gbsO6bWVybyBxdWUgaW5kaWNhIGVsIHRpcG8gZGUgZGF0b3MgZGUgdW4gdmFsb3IuDQoNCg0KIyMNCiMjCUxvZ2ljYWwgZnVuY3Rpb25zCQkJCQlGdW5jaW9uZXMgbMOzZ2ljYXMNCiMjDQpBTkQJCQk9IFkJCQkJCSMjCURldnVlbHZlIFZFUkRBREVSTyBzaSB0b2RvcyBzdXMgYXJndW1lbnRvcyBzb24gVkVSREFERVJPLg0KRkFMU0UJCQk9IEZBTFNPCQkJCQkjIwlEZXZ1ZWx2ZSBlbCB2YWxvciBsw7NnaWNvIEZBTFNPLg0KSUYJCQk9IFNJCQkJCQkjIwlFc3BlY2lmaWNhIHVuYSBwcnVlYmEgbMOzZ2ljYSBxdWUgcmVhbGl6YXIuDQpJRkVSUk9SCQkJPSBTSS5FUlJPUgkJCQkjIwlEZXZ1ZWx2ZSB1biB2YWxvciBxdWUgc2UgZXNwZWNpZmljYSBzaSB1bmEgZsOzcm11bGEgbG8gZXZhbMO6YSBjb21vIHVuIGVycm9yOyBkZSBsbyBjb250cmFyaW8sIGRldnVlbHZlIGVsIHJlc3VsdGFkbyBkZSBsYSBmw7NybXVsYS4NCk5PVAkJCT0gTk8JCQkJCSMjCUludmllcnRlIGVsIHZhbG9yIGzDs2dpY28gZGVsIGFyZ3VtZW50by4NCk9SCQkJPSBPCQkJCQkjIwlEZXZ1ZWx2ZSBWRVJEQURFUk8gc2kgY3VhbHF1aWVyIGFyZ3VtZW50byBlcyBWRVJEQURFUk8uDQpUUlVFCQkJPSBWRVJEQURFUk8JCQkJIyMJRGV2dWVsdmUgZWwgdmFsb3IgbMOzZ2ljbyBWRVJEQURFUk8uDQoNCg0KIyMNCiMjCUxvb2t1cCBhbmQgcmVmZXJlbmNlIGZ1bmN0aW9ucwkJCQlGdW5jaW9uZXMgZGUgYsO6c3F1ZWRhIHkgcmVmZXJlbmNpYQ0KIyMNCkFERFJFU1MJCQk9IERJUkVDQ0lPTgkJCQkjIwlEZXZ1ZWx2ZSB1bmEgcmVmZXJlbmNpYSBjb21vIHRleHRvIGEgdW5hIHNvbGEgY2VsZGEgZGUgdW5hIGhvamEgZGUgY8OhbGN1bG8uDQpBUkVBUwkJCT0gQVJFQVMJCQkJCSMjCURldnVlbHZlIGVsIG7Dum1lcm8gZGUgw6FyZWFzIGRlIHVuYSByZWZlcmVuY2lhLg0KQ0hPT1NFCQkJPSBFTEVHSVIJCQkJIyMJRWxpZ2UgdW4gdmFsb3IgZGUgdW5hIGxpc3RhIGRlIHZhbG9yZXMuDQpDT0xVTU4JCQk9IENPTFVNTkEJCQkJIyMJRGV2dWVsdmUgZWwgbsO6bWVybyBkZSBjb2x1bW5hIGRlIHVuYSByZWZlcmVuY2lhLg0KQ09MVU1OUwkJCT0gQ09MVU1OQVMJCQkJIyMJRGV2dWVsdmUgZWwgbsO6bWVybyBkZSBjb2x1bW5hcyBkZSB1bmEgcmVmZXJlbmNpYS4NCkhMT09LVVAJCQk9IEJVU0NBUkgJCQkJIyMJQnVzY2EgZW4gbGEgZmlsYSBzdXBlcmlvciBkZSB1bmEgbWF0cml6IHkgZGV2dWVsdmUgZWwgdmFsb3IgZGUgbGEgY2VsZGEgaW5kaWNhZGEuDQpIWVBFUkxJTksJCT0gSElQRVJWSU5DVUxPCQkJCSMjCUNyZWEgdW4gYWNjZXNvIGRpcmVjdG8gbyB1biBzYWx0byBxdWUgYWJyZSB1biBkb2N1bWVudG8gYWxtYWNlbmFkbyBlbiB1biBzZXJ2aWRvciBkZSByZWQsIGVuIHVuYSBpbnRyYW5ldCBvIGVuIEludGVybmV0Lg0KSU5ERVgJCQk9IElORElDRQkJCQkjIwlVc2EgdW4gw61uZGljZSBwYXJhIGVsZWdpciB1biB2YWxvciBkZSB1bmEgcmVmZXJlbmNpYSBvIG1hdHJpei4NCklORElSRUNUCQk9IElORElSRUNUTwkJCQkjIwlEZXZ1ZWx2ZSB1bmEgcmVmZXJlbmNpYSBpbmRpY2FkYSBwb3IgdW4gdmFsb3IgZGUgdGV4dG8uDQpMT09LVVAJCQk9IEJVU0NBUgkJCQkjIwlCdXNjYSB2YWxvcmVzIGRlIHVuIHZlY3RvciBvIHVuYSBtYXRyaXouDQpNQVRDSAkJCT0gQ09JTkNJRElSCQkJCSMjCUJ1c2NhIHZhbG9yZXMgZGUgdW5hIHJlZmVyZW5jaWEgbyBtYXRyaXouDQpPRkZTRVQJCQk9IERFU1JFRgkJCQkjIwlEZXZ1ZWx2ZSB1biBkZXNwbGF6YW1pZW50byBkZSByZWZlcmVuY2lhIHJlc3BlY3RvIGEgdW5hIHJlZmVyZW5jaWEgZGFkYS4NClJPVwkJCT0gRklMQQkJCQkJIyMJRGV2dWVsdmUgZWwgbsO6bWVybyBkZSBmaWxhIGRlIHVuYSByZWZlcmVuY2lhLg0KUk9XUwkJCT0gRklMQVMJCQkJCSMjCURldnVlbHZlIGVsIG7Dum1lcm8gZGUgZmlsYXMgZGUgdW5hIHJlZmVyZW5jaWEuDQpSVEQJCQk9IFJEVFIJCQkJCSMjCVJlY3VwZXJhIGRhdG9zIGVuIHRpZW1wbyByZWFsIGRlc2RlIHVuIHByb2dyYW1hIGNvbXBhdGlibGUgY29uIGxhIGF1dG9tYXRpemFjacOzbiBDT00gKGF1dG9tYXRpemFjacOzbjogbW9kbyBkZSB0cmFiYWphciBjb24gbG9zIG9iamV0b3MgZGUgdW5hIGFwbGljYWNpw7NuIGRlc2RlIG90cmEgYXBsaWNhY2nDs24gbyBoZXJyYW1pZW50YSBkZSBlbnRvcm5vLiBMYSBhdXRvbWF0aXphY2nDs24sIGFudGVzIGRlbm9taW5hZGEgYXV0b21hdGl6YWNpw7NuIE9MRSwgZXMgdW4gZXN0w6FuZGFyIGRlIGxhIGluZHVzdHJpYSB5IHVuYSBmdW5jacOzbiBkZWwgTW9kZWxvIGRlIG9iamV0b3MgY29tcG9uZW50ZXMgKENPTSkuKS4NClRSQU5TUE9TRQkJPSBUUkFOU1BPTkVSCQkJCSMjCURldnVlbHZlIGxhIHRyYW5zcG9zaWNpw7NuIGRlIHVuYSBtYXRyaXouDQpWTE9PS1VQCQkJPSBCVVNDQVJWCQkJCSMjCUJ1c2NhIGVuIGxhIHByaW1lcmEgY29sdW1uYSBkZSB1bmEgbWF0cml6IHkgc2UgbXVldmUgZW4gaG9yaXpvbnRhbCBwb3IgbGEgZmlsYSBwYXJhIGRldm9sdmVyIGVsIHZhbG9yIGRlIHVuYSBjZWxkYS4NCg0KDQojIw0KIyMJTWF0aCBhbmQgdHJpZ29ub21ldHJ5IGZ1bmN0aW9ucwkJCQlGdW5jaW9uZXMgbWF0ZW3DoXRpY2FzIHkgdHJpZ29ub23DqXRyaWNhcw0KIyMNCkFCUwkJCT0gQUJTCQkJCQkjIwlEZXZ1ZWx2ZSBlbCB2YWxvciBhYnNvbHV0byBkZSB1biBuw7ptZXJvLg0KQUNPUwkJCT0gQUNPUwkJCQkJIyMJRGV2dWVsdmUgZWwgYXJjb2Nvc2VubyBkZSB1biBuw7ptZXJvLg0KQUNPU0gJCQk9IEFDT1NICQkJCQkjIwlEZXZ1ZWx2ZSBlbCBjb3Nlbm8gaGlwZXJiw7NsaWNvIGludmVyc28gZGUgdW4gbsO6bWVyby4NCkFTSU4JCQk9IEFTRU5PCQkJCQkjIwlEZXZ1ZWx2ZSBlbCBhcmNvc2VubyBkZSB1biBuw7ptZXJvLg0KQVNJTkgJCQk9IEFTRU5PSAkJCQkjIwlEZXZ1ZWx2ZSBlbCBzZW5vIGhpcGVyYsOzbGljbyBpbnZlcnNvIGRlIHVuIG7Dum1lcm8uDQpBVEFOCQkJPSBBVEFOCQkJCQkjIwlEZXZ1ZWx2ZSBsYSBhcmNvdGFuZ2VudGUgZGUgdW4gbsO6bWVyby4NCkFUQU4yCQkJPSBBVEFOMgkJCQkJIyMJRGV2dWVsdmUgbGEgYXJjb3RhbmdlbnRlIGRlIGxhcyBjb29yZGVuYWRhcyAieCIgZSAieSIuDQpBVEFOSAkJCT0gQVRBTkgJCQkJCSMjCURldnVlbHZlIGxhIHRhbmdlbnRlIGhpcGVyYsOzbGljYSBpbnZlcnNhIGRlIHVuIG7Dum1lcm8uDQpDRUlMSU5HCQkJPSBNVUxUSVBMTy5TVVBFUklPUgkJCSMjCVJlZG9uZGVhIHVuIG7Dum1lcm8gYWwgZW50ZXJvIG3DoXMgcHLDs3hpbW8gbyBhbCBtw7psdGlwbG8gc2lnbmlmaWNhdGl2byBtw6FzIGNlcmNhbm8uDQpDT01CSU4JCQk9IENPTUJJTkFUCQkJCSMjCURldnVlbHZlIGVsIG7Dum1lcm8gZGUgY29tYmluYWNpb25lcyBwYXJhIHVuIG7Dum1lcm8gZGV0ZXJtaW5hZG8gZGUgb2JqZXRvcy4NCkNPUwkJCT0gQ09TCQkJCQkjIwlEZXZ1ZWx2ZSBlbCBjb3Nlbm8gZGUgdW4gbsO6bWVyby4NCkNPU0gJCQk9IENPU0gJCQkJCSMjCURldnVlbHZlIGVsIGNvc2VubyBoaXBlcmLDs2xpY28gZGUgdW4gbsO6bWVyby4NCkRFR1JFRVMJCQk9IEdSQURPUwkJCQkjIwlDb252aWVydGUgcmFkaWFuZXMgZW4gZ3JhZG9zLg0KRVZFTgkJCT0gUkVET05ERUEuUEFSCQkJCSMjCVJlZG9uZGVhIHVuIG7Dum1lcm8gaGFzdGEgZWwgZW50ZXJvIHBhciBtw6FzIHByw7N4aW1vLg0KRVhQCQkJPSBFWFAJCQkJCSMjCURldnVlbHZlIGUgZWxldmFkbyBhIGxhIHBvdGVuY2lhIGRlIHVuIG7Dum1lcm8gZGFkby4NCkZBQ1QJCQk9IEZBQ1QJCQkJCSMjCURldnVlbHZlIGVsIGZhY3RvcmlhbCBkZSB1biBuw7ptZXJvLg0KRkFDVERPVUJMRQkJPSBGQUNULkRPQkxFCQkJCSMjCURldnVlbHZlIGVsIGZhY3RvcmlhbCBkb2JsZSBkZSB1biBuw7ptZXJvLg0KRkxPT1IJCQk9IE1VTFRJUExPLklORkVSSU9SCQkJIyMJUmVkb25kZWEgdW4gbsO6bWVybyBoYWNpYSBhYmFqbywgZW4gZGlyZWNjacOzbiBoYWNpYSBjZXJvLg0KR0NECQkJPSBNLkMuRAkJCQkJIyMJRGV2dWVsdmUgZWwgbcOheGltbyBjb23Dum4gZGl2aXNvci4NCklOVAkJCT0gRU5URVJPCQkJCSMjCVJlZG9uZGVhIHVuIG7Dum1lcm8gaGFjaWEgYWJham8gaGFzdGEgZWwgZW50ZXJvIG3DoXMgcHLDs3hpbW8uDQpMQ00JCQk9IE0uQy5NCQkJCQkjIwlEZXZ1ZWx2ZSBlbCBtw61uaW1vIGNvbcO6biBtw7psdGlwbG8uDQpMTgkJCT0gTE4JCQkJCSMjCURldnVlbHZlIGVsIGxvZ2FyaXRtbyBuYXR1cmFsIChuZXBlcmlhbm8pIGRlIHVuIG7Dum1lcm8uDQpMT0cJCQk9IExPRwkJCQkJIyMJRGV2dWVsdmUgZWwgbG9nYXJpdG1vIGRlIHVuIG7Dum1lcm8gZW4gdW5hIGJhc2UgZXNwZWNpZmljYWRhLg0KTE9HMTAJCQk9IExPRzEwCQkJCQkjIwlEZXZ1ZWx2ZSBlbCBsb2dhcml0bW8gZW4gYmFzZSAxMCBkZSB1biBuw7ptZXJvLg0KTURFVEVSTQkJCT0gTURFVEVSTQkJCQkjIwlEZXZ1ZWx2ZSBsYSBkZXRlcm1pbmFudGUgbWF0cmljaWFsIGRlIHVuYSBtYXRyaXouDQpNSU5WRVJTRQkJPSBNSU5WRVJTQQkJCQkjIwlEZXZ1ZWx2ZSBsYSBtYXRyaXogaW52ZXJzYSBkZSB1bmEgbWF0cml6Lg0KTU1VTFQJCQk9IE1NVUxUCQkJCQkjIwlEZXZ1ZWx2ZSBlbCBwcm9kdWN0byBkZSBtYXRyaXogZGUgZG9zIG1hdHJpY2VzLg0KTU9ECQkJPSBSRVNJRFVPCQkJCSMjCURldnVlbHZlIGVsIHJlc3RvIGRlIGxhIGRpdmlzacOzbi4NCk1ST1VORAkJCT0gUkVET05ELk1VTFQJCQkJIyMJRGV2dWVsdmUgdW4gbsO6bWVybyByZWRvbmRlYWRvIGFsIG3Dumx0aXBsbyBkZXNlYWRvLg0KTVVMVElOT01JQUwJCT0gTVVMVElOT01JQUwJCQkJIyMJRGV2dWVsdmUgZWwgcG9saW5vbWlvIGRlIHVuIGNvbmp1bnRvIGRlIG7Dum1lcm9zLg0KT0RECQkJPSBSRURPTkRFQS5JTVBBUgkJCSMjCVJlZG9uZGVhIHVuIG7Dum1lcm8gaGFjaWEgYXJyaWJhIGhhc3RhIGVsIGVudGVybyBpbXBhciBtw6FzIHByw7N4aW1vLg0KUEkJCQk9IFBJCQkJCQkjIwlEZXZ1ZWx2ZSBlbCB2YWxvciBkZSBwaS4NClBPV0VSCQkJPSBQT1RFTkNJQQkJCQkjIwlEZXZ1ZWx2ZSBlbCByZXN1bHRhZG8gZGUgZWxldmFyIHVuIG7Dum1lcm8gYSB1bmEgcG90ZW5jaWEuDQpQUk9EVUNUCQkJPSBQUk9EVUNUTwkJCQkjIwlNdWx0aXBsaWNhIHN1cyBhcmd1bWVudG9zLg0KUVVPVElFTlQJCT0gQ09DSUVOVEUJCQkJIyMJRGV2dWVsdmUgbGEgcGFydGUgZW50ZXJhIGRlIHVuYSBkaXZpc2nDs24uDQpSQURJQU5TCQkJPSBSQURJQU5FUwkJCQkjIwlDb252aWVydGUgZ3JhZG9zIGVuIHJhZGlhbmVzLg0KUkFORAkJCT0gQUxFQVRPUklPCQkJCSMjCURldnVlbHZlIHVuIG7Dum1lcm8gYWxlYXRvcmlvIGVudHJlIDAgeSAxLg0KUkFOREJFVFdFRU4JCT0gQUxFQVRPUklPLkVOVFJFCQkJIyMJRGV2dWVsdmUgdW4gbsO6bWVybyBhbGVhdG9yaW8gZW50cmUgbG9zIG7Dum1lcm9zIHF1ZSBlc3BlY2lmaXF1ZS4NClJPTUFOCQkJPSBOVU1FUk8uUk9NQU5PCQkJCSMjCUNvbnZpZXJ0ZSB1biBuw7ptZXJvIGFyw6FiaWdvIGVuIG7Dum1lcm8gcm9tYW5vLCBjb24gZm9ybWF0byBkZSB0ZXh0by4NClJPVU5ECQkJPSBSRURPTkRFQVIJCQkJIyMJUmVkb25kZWEgdW4gbsO6bWVybyBhbCBuw7ptZXJvIGRlIGRlY2ltYWxlcyBlc3BlY2lmaWNhZG8uDQpST1VORERPV04JCT0gUkVET05ERUFSLk1FTk9TCQkJIyMJUmVkb25kZWEgdW4gbsO6bWVybyBoYWNpYSBhYmFqbywgZW4gZGlyZWNjacOzbiBoYWNpYSBjZXJvLg0KUk9VTkRVUAkJCT0gUkVET05ERUFSLk1BUwkJCQkjIwlSZWRvbmRlYSB1biBuw7ptZXJvIGhhY2lhIGFycmliYSwgZW4gZGlyZWNjacOzbiBjb250cmFyaWEgYSBjZXJvLg0KU0VSSUVTU1VNCQk9IFNVTUEuU0VSSUVTCQkJCSMjCURldnVlbHZlIGxhIHN1bWEgZGUgdW5hIHNlcmllIGRlIHBvdGVuY2lhcyBlbiBmdW5jacOzbiBkZSBsYSBmw7NybXVsYS4NClNJR04JCQk9IFNJR05PCQkJCQkjIwlEZXZ1ZWx2ZSBlbCBzaWdubyBkZSB1biBuw7ptZXJvLg0KU0lOCQkJPSBTRU5PCQkJCQkjIwlEZXZ1ZWx2ZSBlbCBzZW5vIGRlIHVuIMOhbmd1bG8gZGV0ZXJtaW5hZG8uDQpTSU5ICQkJPSBTRU5PSAkJCQkJIyMJRGV2dWVsdmUgZWwgc2VubyBoaXBlcmLDs2xpY28gZGUgdW4gbsO6bWVyby4NClNRUlQJCQk9IFJBSVoJCQkJCSMjCURldnVlbHZlIGxhIHJhw616IGN1YWRyYWRhIHBvc2l0aXZhIGRlIHVuIG7Dum1lcm8uDQpTUVJUUEkJCQk9IFJBSVoyUEkJCQkJIyMJRGV2dWVsdmUgbGEgcmHDrXogY3VhZHJhZGEgZGUgdW4gbsO6bWVybyBtdWx0aXBsaWNhZG8gcG9yIFBJIChuw7ptZXJvICogcGkpLg0KU1VCVE9UQUwJCT0gU1VCVE9UQUxFUwkJCQkjIwlEZXZ1ZWx2ZSB1biBzdWJ0b3RhbCBlbiB1bmEgbGlzdGEgbyBiYXNlIGRlIGRhdG9zLg0KU1VNCQkJPSBTVU1BCQkJCQkjIwlTdW1hIHN1cyBhcmd1bWVudG9zLg0KU1VNSUYJCQk9IFNVTUFSLlNJCQkJCSMjCVN1bWEgbGFzIGNlbGRhcyBlc3BlY2lmaWNhZGFzIHF1ZSBjdW1wbGVuIHVub3MgY3JpdGVyaW9zIGRldGVybWluYWRvcy4NClNVTUlGUwkJCT0gU1VNQVIuU0kuQ09OSlVOVE8JCQkjIwlTdW1hIGxhcyBjZWxkYXMgZGUgdW4gcmFuZ28gcXVlIGN1bXBsZW4gdmFyaW9zIGNyaXRlcmlvcy4NClNVTVBST0RVQ1QJCT0gU1VNQVBST0RVQ1RPCQkJCSMjCURldnVlbHZlIGxhIHN1bWEgZGUgbG9zIHByb2R1Y3RvcyBkZSBsb3MgY29ycmVzcG9uZGllbnRlcyBjb21wb25lbnRlcyBkZSBtYXRyaXouDQpTVU1TUQkJCT0gU1VNQS5DVUFEUkFET1MJCQkjIwlEZXZ1ZWx2ZSBsYSBzdW1hIGRlIGxvcyBjdWFkcmFkb3MgZGUgbG9zIGFyZ3VtZW50b3MuDQpTVU1YMk1ZMgkJPSBTVU1BWDJNRU5PU1kyCQkJCSMjCURldnVlbHZlIGxhIHN1bWEgZGUgbGEgZGlmZXJlbmNpYSBkZSBsb3MgY3VhZHJhZG9zIGRlIGxvcyB2YWxvcmVzIGNvcnJlc3BvbmRpZW50ZXMgZGUgZG9zIG1hdHJpY2VzLg0KU1VNWDJQWTIJCT0gU1VNQVgyTUFTWTIJCQkJIyMJRGV2dWVsdmUgbGEgc3VtYSBkZSBsYSBzdW1hIGRlIGxvcyBjdWFkcmFkb3MgZGUgbG9zIHZhbG9yZXMgY29ycmVzcG9uZGllbnRlcyBkZSBkb3MgbWF0cmljZXMuDQpTVU1YTVkyCQkJPSBTVU1BWE1FTk9TWTIJCQkJIyMJRGV2dWVsdmUgbGEgc3VtYSBkZSBsb3MgY3VhZHJhZG9zIGRlIGxhcyBkaWZlcmVuY2lhcyBkZSBsb3MgdmFsb3JlcyBjb3JyZXNwb25kaWVudGVzIGRlIGRvcyBtYXRyaWNlcy4NClRBTgkJCT0gVEFOCQkJCQkjIwlEZXZ1ZWx2ZSBsYSB0YW5nZW50ZSBkZSB1biBuw7ptZXJvLg0KVEFOSAkJCT0gVEFOSAkJCQkJIyMJRGV2dWVsdmUgbGEgdGFuZ2VudGUgaGlwZXJiw7NsaWNhIGRlIHVuIG7Dum1lcm8uDQpUUlVOQwkJCT0gVFJVTkNBUgkJCQkjIwlUcnVuY2EgdW4gbsO6bWVybyBhIHVuIGVudGVyby4NCg0KDQojIw0KIyMJU3RhdGlzdGljYWwgZnVuY3Rpb25zCQkJCQlGdW5jaW9uZXMgZXN0YWTDrXN0aWNhcw0KIyMNCkFWRURFVgkJCT0gREVTVlBST00JCQkJIyMJRGV2dWVsdmUgZWwgcHJvbWVkaW8gZGUgbGFzIGRlc3ZpYWNpb25lcyBhYnNvbHV0YXMgZGUgbGEgbWVkaWEgZGUgbG9zIHB1bnRvcyBkZSBkYXRvcy4NCkFWRVJBR0UJCQk9IFBST01FRElPCQkJCSMjCURldnVlbHZlIGVsIHByb21lZGlvIGRlIHN1cyBhcmd1bWVudG9zLg0KQVZFUkFHRUEJCT0gUFJPTUVESU9BCQkJCSMjCURldnVlbHZlIGVsIHByb21lZGlvIGRlIHN1cyBhcmd1bWVudG9zLCBpbmNsdWlkb3MgbsO6bWVyb3MsIHRleHRvIHkgdmFsb3JlcyBsw7NnaWNvcy4NCkFWRVJBR0VJRgkJPSBQUk9NRURJTy5TSQkJCQkjIwlEZXZ1ZWx2ZSBlbCBwcm9tZWRpbyAobWVkaWEgYXJpdG3DqXRpY2EpIGRlIHRvZGFzIGxhcyBjZWxkYXMgZGUgdW4gcmFuZ28gcXVlIGN1bXBsZW4gdW5vcyBjcml0ZXJpb3MgZGV0ZXJtaW5hZG9zLg0KQVZFUkFHRUlGUwkJPSBQUk9NRURJTy5TSS5DT05KVU5UTwkJCSMjCURldnVlbHZlIGVsIHByb21lZGlvIChtZWRpYSBhcml0bcOpdGljYSkgZGUgdG9kYXMgbGFzIGNlbGRhcyBxdWUgY3VtcGxlbiBtw7psdGlwbGVzIGNyaXRlcmlvcy4NCkJFVEFESVNUCQk9IERJU1RSLkJFVEEJCQkJIyMJRGV2dWVsdmUgbGEgZnVuY2nDs24gZGUgZGlzdHJpYnVjacOzbiBiZXRhIGFjdW11bGF0aXZhLg0KQkVUQUlOVgkJCT0gRElTVFIuQkVUQS5JTlYJCQkjIwlEZXZ1ZWx2ZSBsYSBmdW5jacOzbiBpbnZlcnNhIGRlIGxhIGZ1bmNpw7NuIGRlIGRpc3RyaWJ1Y2nDs24gYWN1bXVsYXRpdmEgZGUgdW5hIGRpc3RyaWJ1Y2nDs24gYmV0YSBlc3BlY2lmaWNhZGEuDQpCSU5PTURJU1QJCT0gRElTVFIuQklOT00JCQkJIyMJRGV2dWVsdmUgbGEgcHJvYmFiaWxpZGFkIGRlIHVuYSB2YXJpYWJsZSBhbGVhdG9yaWEgZGlzY3JldGEgc2lndWllbmRvIHVuYSBkaXN0cmlidWNpw7NuIGJpbm9taWFsLg0KQ0hJRElTVAkJCT0gRElTVFIuQ0hJCQkJCSMjCURldnVlbHZlIGxhIHByb2JhYmlsaWRhZCBkZSB1bmEgdmFyaWFibGUgYWxlYXRvcmlhIGNvbnRpbnVhIHNpZ3VpZW5kbyB1bmEgZGlzdHJpYnVjacOzbiBjaGkgY3VhZHJhZG8gZGUgdW5hIHNvbGEgY29sYS4NCkNISUlOVgkJCT0gUFJVRUJBLkNISS5JTlYJCQkjIwlEZXZ1ZWx2ZSBsYSBmdW5jacOzbiBpbnZlcnNhIGRlIGxhIHByb2JhYmlsaWRhZCBkZSB1bmEgdmFyaWFibGUgYWxlYXRvcmlhIGNvbnRpbnVhIHNpZ3VpZW5kbyB1bmEgZGlzdHJpYnVjacOzbiBjaGkgY3VhZHJhZG8gZGUgdW5hIHNvbGEgY29sYS4NCkNISVRFU1QJCQk9IFBSVUVCQS5DSEkJCQkJIyMJRGV2dWVsdmUgbGEgcHJ1ZWJhIGRlIGluZGVwZW5kZW5jaWEuDQpDT05GSURFTkNFCQk9IElOVEVSVkFMTy5DT05GSUFOWkEJCQkjIwlEZXZ1ZWx2ZSBlbCBpbnRlcnZhbG8gZGUgY29uZmlhbnphIGRlIGxhIG1lZGlhIGRlIHVuYSBwb2JsYWNpw7NuLg0KQ09SUkVMCQkJPSBDT0VGLkRFLkNPUlJFTAkJCSMjCURldnVlbHZlIGVsIGNvZWZpY2llbnRlIGRlIGNvcnJlbGFjacOzbiBlbnRyZSBkb3MgY29uanVudG9zIGRlIGRhdG9zLg0KQ09VTlQJCQk9IENPTlRBUgkJCQkjIwlDdWVudGEgY3XDoW50b3MgbsO6bWVyb3MgaGF5IGVuIGxhIGxpc3RhIGRlIGFyZ3VtZW50b3MuDQpDT1VOVEEJCQk9IENPTlRBUkEJCQkJIyMJQ3VlbnRhIGN1w6FudG9zIHZhbG9yZXMgaGF5IGVuIGxhIGxpc3RhIGRlIGFyZ3VtZW50b3MuDQpDT1VOVEJMQU5LCQk9IENPTlRBUi5CTEFOQ08JCQkJIyMJQ3VlbnRhIGVsIG7Dum1lcm8gZGUgY2VsZGFzIGVuIGJsYW5jbyBkZSB1biByYW5nby4NCkNPVU5USUYJCQk9IENPTlRBUi5TSQkJCQkjIwlDdWVudGEgZWwgbsO6bWVybyBkZSBjZWxkYXMsIGRlbnRybyBkZWwgcmFuZ28sIHF1ZSBjdW1wbGVuIGVsIGNyaXRlcmlvIGVzcGVjaWZpY2Fkby4NCkNPVU5USUZTCQk9IENPTlRBUi5TSS5DT05KVU5UTwkJCSMjCUN1ZW50YSBlbCBuw7ptZXJvIGRlIGNlbGRhcywgZGVudHJvIGRlbCByYW5nbywgcXVlIGN1bXBsZW4gdmFyaW9zIGNyaXRlcmlvcy4NCkNPVkFSCQkJPSBDT1ZBUgkJCQkJIyMJRGV2dWVsdmUgbGEgY292YXJpYW56YSwgcXVlIGVzIGVsIHByb21lZGlvIGRlIGxvcyBwcm9kdWN0b3MgZGUgbGFzIGRlc3ZpYWNpb25lcyBwYXJhIGNhZGEgcGFyZWphIGRlIHB1bnRvcyBkZSBkYXRvcy4NCkNSSVRCSU5PTQkJPSBCSU5PTS5DUklUCQkJCSMjCURldnVlbHZlIGVsIG1lbm9yIHZhbG9yIGN1eWEgZGlzdHJpYnVjacOzbiBiaW5vbWlhbCBhY3VtdWxhdGl2YSBlcyBtZW5vciBvIGlndWFsIGEgdW4gdmFsb3IgZGUgY3JpdGVyaW8uDQpERVZTUQkJCT0gREVTVklBMgkJCQkjIwlEZXZ1ZWx2ZSBsYSBzdW1hIGRlIGxvcyBjdWFkcmFkb3MgZGUgbGFzIGRlc3ZpYWNpb25lcy4NCkVYUE9ORElTVAkJPSBESVNUUi5FWFAJCQkJIyMJRGV2dWVsdmUgbGEgZGlzdHJpYnVjacOzbiBleHBvbmVuY2lhbC4NCkZESVNUCQkJPSBESVNUUi5GCQkJCSMjCURldnVlbHZlIGxhIGRpc3RyaWJ1Y2nDs24gZGUgcHJvYmFiaWxpZGFkIEYuDQpGSU5WCQkJPSBESVNUUi5GLklOVgkJCQkjIwlEZXZ1ZWx2ZSBsYSBmdW5jacOzbiBpbnZlcnNhIGRlIGxhIGRpc3RyaWJ1Y2nDs24gZGUgcHJvYmFiaWxpZGFkIEYuDQpGSVNIRVIJCQk9IEZJU0hFUgkJCQkjIwlEZXZ1ZWx2ZSBsYSB0cmFuc2Zvcm1hY2nDs24gRmlzaGVyLg0KRklTSEVSSU5WCQk9IFBSVUVCQS5GSVNIRVIuSU5WCQkJIyMJRGV2dWVsdmUgbGEgZnVuY2nDs24gaW52ZXJzYSBkZSBsYSB0cmFuc2Zvcm1hY2nDs24gRmlzaGVyLg0KRk9SRUNBU1QJCT0gUFJPTk9TVElDTwkJCQkjIwlEZXZ1ZWx2ZSB1biB2YWxvciBlbiB1bmEgdGVuZGVuY2lhIGxpbmVhbC4NCkZSRVFVRU5DWQkJPSBGUkVDVUVOQ0lBCQkJCSMjCURldnVlbHZlIHVuYSBkaXN0cmlidWNpw7NuIGRlIGZyZWN1ZW5jaWEgY29tbyB1bmEgbWF0cml6IHZlcnRpY2FsLg0KRlRFU1QJCQk9IFBSVUVCQS5GCQkJCSMjCURldnVlbHZlIGVsIHJlc3VsdGFkbyBkZSB1bmEgcHJ1ZWJhIEYuDQpHQU1NQURJU1QJCT0gRElTVFIuR0FNTUEJCQkJIyMJRGV2dWVsdmUgbGEgZGlzdHJpYnVjacOzbiBnYW1tYS4NCkdBTU1BSU5WCQk9IERJU1RSLkdBTU1BLklOVgkJCSMjCURldnVlbHZlIGxhIGZ1bmNpw7NuIGludmVyc2EgZGUgbGEgZGlzdHJpYnVjacOzbiBnYW1tYSBhY3VtdWxhdGl2YS4NCkdBTU1BTE4JCQk9IEdBTU1BLkxOCQkJCSMjCURldnVlbHZlIGVsIGxvZ2FyaXRtbyBuYXR1cmFsIGRlIGxhIGZ1bmNpw7NuIGdhbW1hLCBHKHgpLg0KR0VPTUVBTgkJCT0gTUVESUEuR0VPTQkJCQkjIwlEZXZ1ZWx2ZSBsYSBtZWRpYSBnZW9tw6l0cmljYS4NCkdST1dUSAkJCT0gQ1JFQ0lNSUVOVE8JCQkJIyMJRGV2dWVsdmUgdmFsb3JlcyBlbiB1bmEgdGVuZGVuY2lhIGV4cG9uZW5jaWFsLg0KSEFSTUVBTgkJCT0gTUVESUEuQVJNTwkJCQkjIwlEZXZ1ZWx2ZSBsYSBtZWRpYSBhcm3Ds25pY2EuDQpIWVBHRU9NRElTVAkJPSBESVNUUi5ISVBFUkdFT00JCQkjIwlEZXZ1ZWx2ZSBsYSBkaXN0cmlidWNpw7NuIGhpcGVyZ2VvbcOpdHJpY2EuDQpJTlRFUkNFUFQJCT0gSU5URVJTRUNDSU9OLkVKRQkJCSMjCURldnVlbHZlIGxhIGludGVyc2VjY2nDs24gZGUgbGEgbMOtbmVhIGRlIHJlZ3Jlc2nDs24gbGluZWFsLg0KS1VSVAkJCT0gQ1VSVE9TSVMJCQkJIyMJRGV2dWVsdmUgbGEgY3VydG9zaXMgZGUgdW4gY29uanVudG8gZGUgZGF0b3MuDQpMQVJHRQkJCT0gSy5FU0lNTy5NQVlPUgkJCQkjIwlEZXZ1ZWx2ZSBlbCBrLcOpc2ltbyBtYXlvciB2YWxvciBkZSB1biBjb25qdW50byBkZSBkYXRvcy4NCkxJTkVTVAkJCT0gRVNUSU1BQ0lPTi5MSU5FQUwJCQkjIwlEZXZ1ZWx2ZSBsb3MgcGFyw6FtZXRyb3MgZGUgdW5hIHRlbmRlbmNpYSBsaW5lYWwuDQpMT0dFU1QJCQk9IEVTVElNQUNJT04uTE9HQVJJVE1JQ0EJCSMjCURldnVlbHZlIGxvcyBwYXLDoW1ldHJvcyBkZSB1bmEgdGVuZGVuY2lhIGV4cG9uZW5jaWFsLg0KTE9HSU5WCQkJPSBESVNUUi5MT0cuSU5WCQkJCSMjCURldnVlbHZlIGxhIGZ1bmNpw7NuIGludmVyc2EgZGUgbGEgZGlzdHJpYnVjacOzbiBsb2dhcsOtdG1pY28tbm9ybWFsLg0KTE9HTk9STURJU1QJCT0gRElTVFIuTE9HLk5PUk0JCQkjIwlEZXZ1ZWx2ZSBsYSBkaXN0cmlidWNpw7NuIGxvZ2Fyw610bWljby1ub3JtYWwgYWN1bXVsYXRpdmEuDQpNQVgJCQk9IE1BWAkJCQkJIyMJRGV2dWVsdmUgZWwgdmFsb3IgbcOheGltbyBkZSB1bmEgbGlzdGEgZGUgYXJndW1lbnRvcy4NCk1BWEEJCQk9IE1BWEEJCQkJCSMjCURldnVlbHZlIGVsIHZhbG9yIG3DoXhpbW8gZGUgdW5hIGxpc3RhIGRlIGFyZ3VtZW50b3MsIGluY2x1aWRvcyBuw7ptZXJvcywgdGV4dG8geSB2YWxvcmVzIGzDs2dpY29zLg0KTUVESUFOCQkJPSBNRURJQU5BCQkJCSMjCURldnVlbHZlIGxhIG1lZGlhbmEgZGUgbG9zIG7Dum1lcm9zIGRhZG9zLg0KTUlOCQkJPSBNSU4JCQkJCSMjCURldnVlbHZlIGVsIHZhbG9yIG3DrW5pbW8gZGUgdW5hIGxpc3RhIGRlIGFyZ3VtZW50b3MuDQpNSU5BCQkJPSBNSU5BCQkJCQkjIwlEZXZ1ZWx2ZSBlbCB2YWxvciBtw61uaW1vIGRlIHVuYSBsaXN0YSBkZSBhcmd1bWVudG9zLCBpbmNsdWlkb3MgbsO6bWVyb3MsIHRleHRvIHkgdmFsb3JlcyBsw7NnaWNvcy4NCk1PREUJCQk9IE1PREEJCQkJCSMjCURldnVlbHZlIGVsIHZhbG9yIG3DoXMgY29tw7puIGRlIHVuIGNvbmp1bnRvIGRlIGRhdG9zLg0KTkVHQklOT01ESVNUCQk9IE5FR0JJTk9NRElTVAkJCQkjIwlEZXZ1ZWx2ZSBsYSBkaXN0cmlidWNpw7NuIGJpbm9taWFsIG5lZ2F0aXZhLg0KTk9STURJU1QJCT0gRElTVFIuTk9STQkJCQkjIwlEZXZ1ZWx2ZSBsYSBkaXN0cmlidWNpw7NuIG5vcm1hbCBhY3VtdWxhdGl2YS4NCk5PUk1JTlYJCQk9IERJU1RSLk5PUk0uSU5WCQkJIyMJRGV2dWVsdmUgbGEgZnVuY2nDs24gaW52ZXJzYSBkZSBsYSBkaXN0cmlidWNpw7NuIG5vcm1hbCBhY3VtdWxhdGl2YS4NCk5PUk1TRElTVAkJPSBESVNUUi5OT1JNLkVTVEFORAkJCSMjCURldnVlbHZlIGxhIGRpc3RyaWJ1Y2nDs24gbm9ybWFsIGVzdMOhbmRhciBhY3VtdWxhdGl2YS4NCk5PUk1TSU5WCQk9IERJU1RSLk5PUk0uRVNUQU5ELklOVgkJCSMjCURldnVlbHZlIGxhIGZ1bmNpw7NuIGludmVyc2EgZGUgbGEgZGlzdHJpYnVjacOzbiBub3JtYWwgZXN0w6FuZGFyIGFjdW11bGF0aXZhLg0KUEVBUlNPTgkJCT0gUEVBUlNPTgkJCQkjIwlEZXZ1ZWx2ZSBlbCBjb2VmaWNpZW50ZSBkZSBtb21lbnRvIGRlIGNvcnJlbGFjacOzbiBkZSBwcm9kdWN0byBQZWFyc29uLg0KUEVSQ0VOVElMRQkJPSBQRVJDRU5USUwJCQkJIyMJRGV2dWVsdmUgZWwgay3DqXNpbW8gcGVyY2VudGlsIGRlIGxvcyB2YWxvcmVzIGRlIHVuIHJhbmdvLg0KUEVSQ0VOVFJBTksJCT0gUkFOR08uUEVSQ0VOVElMCQkJIyMJRGV2dWVsdmUgZWwgcmFuZ28gcG9yY2VudHVhbCBkZSB1biB2YWxvciBkZSB1biBjb25qdW50byBkZSBkYXRvcy4NClBFUk1VVAkJCT0gUEVSTVVUQUNJT05FUwkJCQkjIwlEZXZ1ZWx2ZSBlbCBuw7ptZXJvIGRlIHBlcm11dGFjaW9uZXMgZGUgdW4gbsO6bWVybyBkZXRlcm1pbmFkbyBkZSBvYmpldG9zLg0KUE9JU1NPTgkJCT0gUE9JU1NPTgkJCQkjIwlEZXZ1ZWx2ZSBsYSBkaXN0cmlidWNpw7NuIGRlIFBvaXNzb24uDQpQUk9CCQkJPSBQUk9CQUJJTElEQUQJCQkJIyMJRGV2dWVsdmUgbGEgcHJvYmFiaWxpZGFkIGRlIHF1ZSBsb3MgdmFsb3JlcyBkZSB1biByYW5nbyBzZSBlbmN1ZW50cmVuIGVudHJlIGRvcyBsw61taXRlcy4NClFVQVJUSUxFCQk9IENVQVJUSUwJCQkJIyMJRGV2dWVsdmUgZWwgY3VhcnRpbCBkZSB1biBjb25qdW50byBkZSBkYXRvcy4NClJBTksJCQk9IEpFUkFSUVVJQQkJCQkjIwlEZXZ1ZWx2ZSBsYSBqZXJhcnF1w61hIGRlIHVuIG7Dum1lcm8gZW4gdW5hIGxpc3RhIGRlIG7Dum1lcm9zLg0KUlNRCQkJPSBDT0VGSUNJRU5URS5SMgkJCSMjCURldnVlbHZlIGVsIGN1YWRyYWRvIGRlbCBjb2VmaWNpZW50ZSBkZSBtb21lbnRvIGRlIGNvcnJlbGFjacOzbiBkZSBwcm9kdWN0byBQZWFyc29uLg0KU0tFVwkJCT0gQ09FRklDSUVOVEUuQVNJTUVUUklBCQkJIyMJRGV2dWVsdmUgbGEgYXNpbWV0csOtYSBkZSB1bmEgZGlzdHJpYnVjacOzbi4NClNMT1BFCQkJPSBQRU5ESUVOVEUJCQkJIyMJRGV2dWVsdmUgbGEgcGVuZGllbnRlIGRlIGxhIGzDrW5lYSBkZSByZWdyZXNpw7NuIGxpbmVhbC4NClNNQUxMCQkJPSBLLkVTSU1PLk1FTk9SCQkJCSMjCURldnVlbHZlIGVsIGstw6lzaW1vIG1lbm9yIHZhbG9yIGRlIHVuIGNvbmp1bnRvIGRlIGRhdG9zLg0KU1RBTkRBUkRJWkUJCT0gTk9STUFMSVpBQ0lPTgkJCQkjIwlEZXZ1ZWx2ZSB1biB2YWxvciBub3JtYWxpemFkby4NClNUREVWCQkJPSBERVNWRVNUCQkJCSMjCUNhbGN1bGEgbGEgZGVzdmlhY2nDs24gZXN0w6FuZGFyIGEgcGFydGlyIGRlIHVuYSBtdWVzdHJhLg0KU1RERVZBCQkJPSBERVNWRVNUQQkJCQkjIwlDYWxjdWxhIGxhIGRlc3ZpYWNpw7NuIGVzdMOhbmRhciBhIHBhcnRpciBkZSB1bmEgbXVlc3RyYSwgaW5jbHVpZG9zIG7Dum1lcm9zLCB0ZXh0byB5IHZhbG9yZXMgbMOzZ2ljb3MuDQpTVERFVlAJCQk9IERFU1ZFU1RQCQkJCSMjCUNhbGN1bGEgbGEgZGVzdmlhY2nDs24gZXN0w6FuZGFyIGVuIGZ1bmNpw7NuIGRlIHRvZGEgbGEgcG9ibGFjacOzbi4NClNUREVWUEEJCQk9IERFU1ZFU1RQQQkJCQkjIwlDYWxjdWxhIGxhIGRlc3ZpYWNpw7NuIGVzdMOhbmRhciBlbiBmdW5jacOzbiBkZSB0b2RhIGxhIHBvYmxhY2nDs24sIGluY2x1aWRvcyBuw7ptZXJvcywgdGV4dG8geSB2YWxvcmVzIGzDs2dpY29zLg0KU1RFWVgJCQk9IEVSUk9SLlRJUElDTy5YWQkJCSMjCURldnVlbHZlIGVsIGVycm9yIGVzdMOhbmRhciBkZWwgdmFsb3IgZGUgInkiIHByZXZpc3RvIHBhcmEgY2FkYSAieCIgZGUgbGEgcmVncmVzacOzbi4NClRESVNUCQkJPSBESVNUUi5UCQkJCSMjCURldnVlbHZlIGxhIGRpc3RyaWJ1Y2nDs24gZGUgdCBkZSBTdHVkZW50Lg0KVElOVgkJCT0gRElTVFIuVC5JTlYJCQkJIyMJRGV2dWVsdmUgbGEgZnVuY2nDs24gaW52ZXJzYSBkZSBsYSBkaXN0cmlidWNpw7NuIGRlIHQgZGUgU3R1ZGVudC4NClRSRU5ECQkJPSBURU5ERU5DSUEJCQkJIyMJRGV2dWVsdmUgdmFsb3JlcyBlbiB1bmEgdGVuZGVuY2lhIGxpbmVhbC4NClRSSU1NRUFOCQk9IE1FRElBLkFDT1RBREEJCQkJIyMJRGV2dWVsdmUgbGEgbWVkaWEgZGVsIGludGVyaW9yIGRlIHVuIGNvbmp1bnRvIGRlIGRhdG9zLg0KVFRFU1QJCQk9IFBSVUVCQS5UCQkJCSMjCURldnVlbHZlIGxhIHByb2JhYmlsaWRhZCBhc29jaWFkYSBhIHVuYSBwcnVlYmEgdCBkZSBTdHVkZW50Lg0KVkFSCQkJPSBWQVIJCQkJCSMjCUNhbGN1bGEgbGEgdmFyaWFuemEgZW4gZnVuY2nDs24gZGUgdW5hIG11ZXN0cmEuDQpWQVJBCQkJPSBWQVJBCQkJCQkjIwlDYWxjdWxhIGxhIHZhcmlhbnphIGVuIGZ1bmNpw7NuIGRlIHVuYSBtdWVzdHJhLCBpbmNsdWlkb3MgbsO6bWVyb3MsIHRleHRvIHkgdmFsb3JlcyBsw7NnaWNvcy4NClZBUlAJCQk9IFZBUlAJCQkJCSMjCUNhbGN1bGEgbGEgdmFyaWFuemEgZW4gZnVuY2nDs24gZGUgdG9kYSBsYSBwb2JsYWNpw7NuLg0KVkFSUEEJCQk9IFZBUlBBCQkJCQkjIwlDYWxjdWxhIGxhIHZhcmlhbnphIGVuIGZ1bmNpw7NuIGRlIHRvZGEgbGEgcG9ibGFjacOzbiwgaW5jbHVpZG9zIG7Dum1lcm9zLCB0ZXh0byB5IHZhbG9yZXMgbMOzZ2ljb3MuDQpXRUlCVUxMCQkJPSBESVNULldFSUJVTEwJCQkJIyMJRGV2dWVsdmUgbGEgZGlzdHJpYnVjacOzbiBkZSBXZWlidWxsLg0KWlRFU1QJCQk9IFBSVUVCQS5aCQkJCSMjCURldnVlbHZlIGVsIHZhbG9yIGRlIHVuYSBwcm9iYWJpbGlkYWQgZGUgdW5hIGNvbGEgZGUgdW5hIHBydWViYSB6Lg0KDQoNCiMjDQojIwlUZXh0IGZ1bmN0aW9ucwkJCQkJCUZ1bmNpb25lcyBkZSB0ZXh0bw0KIyMNCkFTQwkJCT0gQVNDCQkJCQkjIwlDb252aWVydGUgbGFzIGxldHJhcyBpbmdsZXNhcyBvIGthdGFrYW5hIGRlIGFuY2hvIGNvbXBsZXRvIChkZSBkb3MgYnl0ZXMpIGRlbnRybyBkZSB1bmEgY2FkZW5hIGRlIGNhcmFjdGVyZXMgZW4gY2FyYWN0ZXJlcyBkZSBhbmNobyBtZWRpbyAoZGUgdW4gYnl0ZSkuDQpCQUhUVEVYVAkJPSBURVhUT0JBSFQJCQkJIyMJQ29udmllcnRlIHVuIG7Dum1lcm8gZW4gdGV4dG8sIGNvbiBlbCBmb3JtYXRvIGRlIG1vbmVkYSDDnyAoQmFodCkuDQpDSEFSCQkJPSBDQVJBQ1RFUgkJCQkjIwlEZXZ1ZWx2ZSBlbCBjYXLDoWN0ZXIgZXNwZWNpZmljYWRvIHBvciBlbCBuw7ptZXJvIGRlIGPDs2RpZ28uDQpDTEVBTgkJCT0gTElNUElBUgkJCQkjIwlRdWl0YSBkZWwgdGV4dG8gdG9kb3MgbG9zIGNhcmFjdGVyZXMgbm8gaW1wcmltaWJsZXMuDQpDT0RFCQkJPSBDT0RJR08JCQkJIyMJRGV2dWVsdmUgdW4gY8OzZGlnbyBudW3DqXJpY28gZGVsIHByaW1lciBjYXLDoWN0ZXIgZGUgdW5hIGNhZGVuYSBkZSB0ZXh0by4NCkNPTkNBVEVOQVRFCQk9IENPTkNBVEVOQVIJCQkJIyMJQ29uY2F0ZW5hIHZhcmlvcyBlbGVtZW50b3MgZGUgdGV4dG8gZW4gdW5vIHNvbG8uDQpET0xMQVIJCQk9IE1PTkVEQQkJCQkjIwlDb252aWVydGUgdW4gbsO6bWVybyBlbiB0ZXh0bywgY29uIGVsIGZvcm1hdG8gZGUgbW9uZWRhICQgKGTDs2xhcikuDQpFWEFDVAkJCT0gSUdVQUwJCQkJCSMjCUNvbXBydWViYSBzaSBkb3MgdmFsb3JlcyBkZSB0ZXh0byBzb24gaWTDqW50aWNvcy4NCkZJTkQJCQk9IEVOQ09OVFJBUgkJCQkjIwlCdXNjYSB1biB2YWxvciBkZSB0ZXh0byBkZW50cm8gZGUgb3RybyAoZGlzdGluZ3VlIG1hecO6c2N1bGFzIGRlIG1pbsO6c2N1bGFzKS4NCkZJTkRCCQkJPSBFTkNPTlRSQVJCCQkJCSMjCUJ1c2NhIHVuIHZhbG9yIGRlIHRleHRvIGRlbnRybyBkZSBvdHJvIChkaXN0aW5ndWUgbWF5w7pzY3VsYXMgZGUgbWluw7pzY3VsYXMpLg0KRklYRUQJCQk9IERFQ0lNQUwJCQkJIyMJRGEgZm9ybWF0byBhIHVuIG7Dum1lcm8gY29tbyB0ZXh0byBjb24gdW4gbsO6bWVybyBmaWpvIGRlIGRlY2ltYWxlcy4NCkpJUwkJCT0gSklTCQkJCQkjIwlDb252aWVydGUgbGFzIGxldHJhcyBpbmdsZXNhcyBvIGthdGFrYW5hIGRlIGFuY2hvIG1lZGlvIChkZSB1biBieXRlKSBkZW50cm8gZGUgdW5hIGNhZGVuYSBkZSBjYXJhY3RlcmVzIGVuIGNhcmFjdGVyZXMgZGUgYW5jaG8gY29tcGxldG8gKGRlIGRvcyBieXRlcykuDQpMRUZUCQkJPSBJWlFVSUVSREEJCQkJIyMJRGV2dWVsdmUgbG9zIGNhcmFjdGVyZXMgZGVsIGxhZG8gaXpxdWllcmRvIGRlIHVuIHZhbG9yIGRlIHRleHRvLg0KTEVGVEIJCQk9IElaUVVJRVJEQUIJCQkJIyMJRGV2dWVsdmUgbG9zIGNhcmFjdGVyZXMgZGVsIGxhZG8gaXpxdWllcmRvIGRlIHVuIHZhbG9yIGRlIHRleHRvLg0KTEVOCQkJPSBMQVJHTwkJCQkJIyMJRGV2dWVsdmUgZWwgbsO6bWVybyBkZSBjYXJhY3RlcmVzIGRlIHVuYSBjYWRlbmEgZGUgdGV4dG8uDQpMRU5CCQkJPSBMQVJHT0IJCQkJIyMJRGV2dWVsdmUgZWwgbsO6bWVybyBkZSBjYXJhY3RlcmVzIGRlIHVuYSBjYWRlbmEgZGUgdGV4dG8uDQpMT1dFUgkJCT0gTUlOVVNDCQkJCSMjCVBvbmUgZWwgdGV4dG8gZW4gbWluw7pzY3VsYXMuDQpNSUQJCQk9IEVYVFJBRQkJCQkjIwlEZXZ1ZWx2ZSB1biBuw7ptZXJvIGVzcGVjw61maWNvIGRlIGNhcmFjdGVyZXMgZGUgdW5hIGNhZGVuYSBkZSB0ZXh0byBxdWUgY29taWVuemEgZW4gbGEgcG9zaWNpw7NuIHF1ZSBzZSBlc3BlY2lmaXF1ZS4NCk1JREIJCQk9IEVYVFJBRUIJCQkJIyMJRGV2dWVsdmUgdW4gbsO6bWVybyBlc3BlY8OtZmljbyBkZSBjYXJhY3RlcmVzIGRlIHVuYSBjYWRlbmEgZGUgdGV4dG8gcXVlIGNvbWllbnphIGVuIGxhIHBvc2ljacOzbiBxdWUgc2UgZXNwZWNpZmlxdWUuDQpQSE9ORVRJQwkJPSBGT05FVElDTwkJCQkjIwlFeHRyYWUgbG9zIGNhcmFjdGVyZXMgZm9uw6l0aWNvcyAoZnVyaWdhbmEpIGRlIHVuYSBjYWRlbmEgZGUgdGV4dG8uDQpQUk9QRVIJCQk9IE5PTVBST1BJTwkJCQkjIwlQb25lIGVuIG1hecO6c2N1bGEgbGEgcHJpbWVyYSBsZXRyYSBkZSBjYWRhIHBhbGFicmEgZGUgdW4gdmFsb3IgZGUgdGV4dG8uDQpSRVBMQUNFCQkJPSBSRUVNUExBWkFSCQkJCSMjCVJlZW1wbGF6YSBjYXJhY3RlcmVzIGRlIHRleHRvLg0KUkVQTEFDRUIJCT0gUkVFTVBMQVpBUkIJCQkJIyMJUmVlbXBsYXphIGNhcmFjdGVyZXMgZGUgdGV4dG8uDQpSRVBUCQkJPSBSRVBFVElSCQkJCSMjCVJlcGl0ZSBlbCB0ZXh0byB1biBuw7ptZXJvIGRldGVybWluYWRvIGRlIHZlY2VzLg0KUklHSFQJCQk9IERFUkVDSEEJCQkJIyMJRGV2dWVsdmUgbG9zIGNhcmFjdGVyZXMgZGVsIGxhZG8gZGVyZWNobyBkZSB1biB2YWxvciBkZSB0ZXh0by4NClJJR0hUQgkJCT0gREVSRUNIQUIJCQkJIyMJRGV2dWVsdmUgbG9zIGNhcmFjdGVyZXMgZGVsIGxhZG8gZGVyZWNobyBkZSB1biB2YWxvciBkZSB0ZXh0by4NClNFQVJDSAkJCT0gSEFMTEFSCQkJCSMjCUJ1c2NhIHVuIHZhbG9yIGRlIHRleHRvIGRlbnRybyBkZSBvdHJvIChubyBkaXN0aW5ndWUgbWF5w7pzY3VsYXMgZGUgbWluw7pzY3VsYXMpLg0KU0VBUkNIQgkJCT0gSEFMTEFSQgkJCQkjIwlCdXNjYSB1biB2YWxvciBkZSB0ZXh0byBkZW50cm8gZGUgb3RybyAobm8gZGlzdGluZ3VlIG1hecO6c2N1bGFzIGRlIG1pbsO6c2N1bGFzKS4NClNVQlNUSVRVVEUJCT0gU1VTVElUVUlSCQkJCSMjCVN1c3RpdHV5ZSB0ZXh0byBudWV2byBwb3IgdGV4dG8gYW50aWd1byBlbiB1bmEgY2FkZW5hIGRlIHRleHRvLg0KVAkJCT0gVAkJCQkJIyMJQ29udmllcnRlIHN1cyBhcmd1bWVudG9zIGEgdGV4dG8uDQpURVhUCQkJPSBURVhUTwkJCQkJIyMJRGEgZm9ybWF0byBhIHVuIG7Dum1lcm8geSBsbyBjb252aWVydGUgZW4gdGV4dG8uDQpUUklNCQkJPSBFU1BBQ0lPUwkJCQkjIwlRdWl0YSBsb3MgZXNwYWNpb3MgZGVsIHRleHRvLg0KVVBQRVIJCQk9IE1BWVVTQwkJCQkjIwlQb25lIGVsIHRleHRvIGVuIG1hecO6c2N1bGFzLg0KVkFMVUUJCQk9IFZBTE9SCQkJCQkjIwlDb252aWVydGUgdW4gYXJndW1lbnRvIGRlIHRleHRvIGVuIHVuIG7Dum1lcm8uDQo=]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/locale/fi/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/locale/fi/config</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[77u/IyMNCiMjIFBIUEV4Y2VsDQojIw0NCiMjIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTEgUEhQRXhjZWwNCiMjDQojIyBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yDQojIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljDQojIyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXINCiMjIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLg0KIyMNCiMjIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLA0KIyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YNCiMjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VDQojIyBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLg0KIyMNCiMjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMNCiMjIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUNCiMjIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQ0KIyMNCiMjIEBjYXRlZ29yeSAgIFBIUEV4Y2VsDQojIyBAcGFja2FnZSAgICBQSFBFeGNlbF9TZXR0aW5ncw0KIyMgQGNvcHlyaWdodCAgQ29weXJpZ2h0IChjKSAyMDA2IC0gMjAxMSBQSFBFeGNlbCAoaHR0cDovL3d3dy5jb2RlcGxleC5jb20vUEhQRXhjZWwpDQojIyBAbGljZW5zZSAgICBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvb2xkLWxpY2Vuc2VzL2xncGwtMi4xLnR4dAlMR1BMDQojIyBAdmVyc2lvbiAgICAxLjcuNywgMjAxMi0wNS0xOQ0KIyMNCiMjDQoNCg0KQXJndW1lbnRTZXBhcmF0b3IJPSA7DQoNCg0KIyMNCiMjCShGb3IgZnV0dXJlIHVzZSkNCiMjDQpjdXJyZW5jeVN5bWJvbAk9ICQJIwlTeW1ib2wgbm90IGtub3duLCBzaG91bGQgaXQgYmUgYSDigqwgKEV1cm8pPw0KDQoNCiMjDQojIwlFeGNlbCBFcnJvciBDb2RlcwkoRm9yIGZ1dHVyZSB1c2UpDQ0KIyMNCk5VTEwJPSAjVFlISsOEIQ0KRElWMAk9ICNKQUtPLzAhDQpWQUxVRQk9ICNBUlZPIQ0KUkVGCT0gI1ZJSVRUQVVTIQ0KTkFNRQk9ICNOSU1JPw0KTlVNCT0gI0xVS1UhDQpOQQk9ICNQVVVUVFVVDQo=]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/locale/fi/functions</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[77u/IyMNCiMjIFBIUEV4Y2VsDQojIw0NCiMjIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTEgUEhQRXhjZWwNCiMjDQojIyBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yDQojIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljDQojIyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXINCiMjIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLg0KIyMNCiMjIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLA0KIyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YNCiMjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VDQojIyBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLg0KIyMNCiMjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMNCiMjIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUNCiMjIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQ0KIyMNCiMjIEBjYXRlZ29yeSAgIFBIUEV4Y2VsDQojIyBAcGFja2FnZSAgICBQSFBFeGNlbF9DYWxjdWxhdGlvbg0KIyMgQGNvcHlyaWdodCAgQ29weXJpZ2h0IChjKSAyMDA2IC0gMjAxMSBQSFBFeGNlbCAoaHR0cDovL3d3dy5jb2RlcGxleC5jb20vUEhQRXhjZWwpDQojIyBAbGljZW5zZSAgICBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvb2xkLWxpY2Vuc2VzL2xncGwtMi4xLnR4dAlMR1BMDQojIyBAdmVyc2lvbiAgICAxLjcuNywgMjAxMi0wNS0xOQ0KIyMNCiMjIERhdGEgaW4gdGhpcyBmaWxlIGRlcml2ZWQgZnJvbSBodHRwOi8vd3d3LnBpdWhhLmZpL2V4Y2VsLWZ1bmN0aW9uLW5hbWUtdHJhbnNsYXRpb24vDQojIw0KIyMNCg0KDQojIw0KIyMJQWRkLWluIGFuZCBBdXRvbWF0aW9uIGZ1bmN0aW9ucwkJCUFwdW9oamVsbWEtIGphIGF1dG9tYWF0aW9mdW5rdGlvdA0KIyMNCkdFVFBJVk9UREFUQQkJPSBOT1VEQS5QSVZPVC5USUVET1QJCSMjCVBhbGF1dHRhYSBwaXZvdC10YXVsdWtrb3JhcG9ydHRpaW4gdGFsbGVubmV0dHVqYSB0aWV0b2phLg0KDQoNCiMjDQojIwlDdWJlIGZ1bmN0aW9ucwkJCQkJS3V1dGlvZnVua3Rpb3QNCiMjDQpDVUJFS1BJTUVNQkVSCQk9IEtVVVRJT0tQSUrDhFNFTgkJIyMJUGFsYXV0dGFhIHN1b3JpdHVza3lreWlsbWFpc2ltZW4gKEtQSSkgbmltZW4sIG9taW5haXN1dWRlbiBzZWvDpCBtaXRhbiBqYSBuw6R5dHTDpMOkIG5pbWVuIHNla8OkIG9taW5haXN1dWRlbiBzb2x1c3NhLiBLUEkgb24gbWl0YXR0YXZpc3NhIG9sZXZhIHN1dXJlLCBrdXRlbiBrdXVrYXVkZW4gYnJ1dHRvdHVvdHRvIHRhaSB2dW9zaW5lbGrDpG5uZWtzZW4gdHnDtm50ZWtpasOka29odGFpbmVuIGxpaWtldmFpaHRvLCBqb2lkZW4gYXZ1bGxhIHRhcmtrYWlsbGFhbiBvcmdhbmlzYWF0aW9uIHN1b3JpdHVza3lrecOkLg0KQ1VCRU1FTUJFUgkJPSBLVVVUSU9OSsOEU0VOCQkJIyMJUGFsYXV0dGFhIGt1dXRpb2hpZXJhcmtpYW4gasOkc2VuZW4gdGFpIG1vbmlrb24uIFTDpGxsw6QgZnVua3Rpb2xsYSB2b2l0IHRhcmtpc3RhYSwgZXR0w6QgasOkc2VuIHRhaSBtb25pa2tvIG9uIG9sZW1hc3NhIGt1dXRpb3NzYS4NCkNVQkVNRU1CRVJQUk9QRVJUWQk9IEtVVVRJT05Kw4RTRU5FTk9NSU5BSVNVVVMJIyMJUGFsYXV0dGFhIGt1dXRpb24gasOkc2Vub21pbmFpc3V1ZGVuIGFydm9uLiBUw6RsbMOkIGZ1bmt0aW9sbGEgdm9pdCB0YXJraXN0YWEsIGV0dMOkIG5pbWkgb24gb2xlbWFzc2Ega3V1dGlvc3NhLCBqYSBwYWxhdXR0YWEgdMOkbcOkbiBqw6RzZW5lbiBtw6TDpHJpdGV0eW4gb21pbmFpc3V1ZGVuLg0KQ1VCRVJBTktFRE1FTUJFUgk9IEtVVVRJT05MVU9LSVRFTFRVSsOEU0VOCSMjCVBhbGF1dHRhYSBqb3Vrb24gbjpubmVuIGrDpHNlbmVuLiBUw6RsbMOkIGZ1bmt0aW9sbGEgdm9pdCBwYWxhdXR0YWEgam91a29zdGEgZWxlbWVudHRlasOkLCBrdXRlbiBwYXJoYWFuIG15eWrDpG4gdGFpIDEwIHBhcmFzdGEgb3Bpc2tlbGlqYWEuDQpDVUJFU0VUCQkJPSBLVVVUSU9KT1VLS08JCQkjIwlNw6TDpHJpdHTDpMOkIGxhc2tldHVuIGrDpHNlbi0gdGFpIG1vbmlra29qb3Vrb24gbMOkaGV0dMOkbcOkbGzDpCBqb3Vrb24gbGF1c2Vra2VpdGEgcGFsdmVsaW1lc3NhIG9sZXZhbGxlIGt1dXRpb2xsZS4gUGFsdmVsaW4gbHVvIGpvdWtvbiBqYSBwYWxhdXR0YWEgc2VuIE1pY3Jvc29mdCBPZmZpY2UgRXhjZWxpbGxlLg0KQ1VCRVNFVENPVU5UCQk9IEtVVVRJT0pPVUtLT0pFTk3DhMOEUsOECQkjIwlQYWxhdXR0YWEgam91a29uIGtvaHRlaWRlbiBtw6TDpHLDpG4uDQpDVUJFVkFMVUUJCT0gS1VVVElPTkFSVk8JCQkjIwlQYWxhdXR0YWEga29vc3RldHVuIGFydm9uIGt1dXRpb3N0YS4NCg0KDQojIw0KIyMJRGF0YWJhc2UgZnVuY3Rpb25zCQkJCVRpZXRva2FudGFmdW5rdGlvdA0KIyMNCkRBVkVSQUdFCQk9IFRLRVNLSUFSVk8JCQkjIwlQYWxhdXR0YWEgdmFsaXR0dWplbiB0aWV0b2thbnRhbWVya2ludMO2amVuIGtlc2tpYXJ2b24uDQpEQ09VTlQJCQk9IFRMQVNLRQkJCSMjCUxhc2tlZSB0aWV0b2thbm5hbiBsdWt1amEgc2lzw6RsdMOkdmllbiBzb2x1amVuIG3DpMOkcsOkbi4NCkRDT1VOVEEJCQk9IFRMQVNLRUEJCQkjIwlMYXNrZWUgdGlldG9rYW5uYW4gdGlldG9qYSBzaXPDpGx0w6R2aWVuIHNvbHVqZW4gbcOkw6Ryw6RuLg0KREdFVAkJCT0gVE5PVURBCQkJIyMJSGFrZWUgbcOkw6RyaXRldHR5asOkIGVodG9qYSB2YXN0YWF2YW4gdGlldHVlZW4gdGlldG9rYW5uYXN0YS4NCkRNQVgJCQk9IFRNQUtTCQkJCSMjCVBhbGF1dHRhYSBzdXVyaW1tYW4gYXJ2b24gdGlldG9rYW5uYXN0YSB2YWxpdHR1amVuIGFydm9qZW4gam91a29zdGEuDQpETUlOCQkJPSBUTUlOCQkJCSMjCVBhbGF1dHRhYSBwaWVuaW1tw6RuIGFydm9uIHRpZXRva2FubmFzdGEgdmFsaXR0dWplbiBhcnZvamVuIGpvdWtvc3RhLg0KRFBST0RVQ1QJCT0gVFRVTE8JCQkJIyMJS2VydG9vIG3DpMOkcml0ZXR5biBlaGRvbiB0w6R5dHTDpHZpZW4gdGlldG9rYW5uYW4gdGlldHVlaWRlbiB0aWV0eXNzw6Qga2VudMOkc3PDpCBvbGV2YXQgYXJ2b3QuDQpEU1RERVYJCQk9IFRLRVNLSUhBSk9OVEEJCQkjIwlMYXNrZWUga2Vza2loYWpvbm5hbiB0aWV0b2thbm5hc3RhIHZhbGl0dWlzdGEgYXJ2b2lzdGEgbXVvZG9zdHV2YW4gb3Rva3NlbiBwZXJ1c3RlZWxsYS4NCkRTVERFVlAJCQk9IFRLRVNLSUhBSk9OVEFQCQkjIwlMYXNrZWUga2Vza2loYWpvbm5hbiB0aWV0b2thbm5hc3RhIHZhbGl0dHVqZW4gYXJ2b2plbiBrb2tvIHBvcHVsYWF0aW9uIHBlcnVzdGVlbGxhLg0KRFNVTQkJCT0gVFNVTU1BCQkJIyMJTGlzw6TDpCBsdXZ1dCBtw6TDpHJpdGV0eW4gZWhkb24gdMOkeXR0w6R2aWVuIHRpZXRva2FubmFuIHRpZXR1ZWlkZW4ga2VudHTDpHNhcmFra2Vlc2Vlbi4NCkRWQVIJCQk9IFRWQVJJQU5TU0kJCQkjIwlMYXNrZWUgdmFyaWFuc3NpbiB0aWV0b2thbm5hc3RhIHZhbGl0dHVqZW4gYXJ2b2plbiBvdG9rc2VuIHBlcnVzdGVlbGxhLg0KRFZBUlAJCQk9IFRWQVJJQU5TU0lQCQkJIyMJTGFza2VlIHZhcmlhbnNzaW4gdGlldG9rYW5uYXN0YSB2YWxpdHR1amVuIGFydm9qZW4ga29rbyBwb3B1bGFhdGlvbiBwZXJ1c3RlZWxsYS4NCg0KDQojIw0KIyMJRGF0ZSBhbmQgdGltZSBmdW5jdGlvbnMJCQkJUMOkaXbDpG3DpMOkcsOkLSBqYSBhaWthZnVua3Rpb3QNCiMjDQpEQVRFCQkJPSBQw4RJVsOEWVMJCQkjIwlQYWxhdXR0YWEgYW5uZXR1biBww6RpdsOkbcOkw6Ryw6RuIGrDpHJqZXN0eXNsdXZ1bi4NCkRBVEVWQUxVRQkJPSBQw4RJVsOEWVNBUlZPCQkJIyMJTXV1bnRhYSB0ZWtzdGltdW9kb3NzYSBvbGV2YW4gcMOkaXbDpG3DpMOkcsOkbiBqw6RyamVzdHlzbHV2dWtzaS4NCkRBWQkJCT0gUMOESVbDhAkJCQkjIwlNdXVudGFhIGrDpHJqZXN0eXNsdXZ1biBrdXVrYXVkZW4gcMOkaXbDpGtzaS4NCkRBWVMzNjAJCQk9IFDDhElWw4RUMzYwCQkJIyMJTGFza2VlIGthaGRlbiBww6RpdsOkbcOkw6Ryw6RuIHbDpGxpc3RlbiBww6RpdmllbiBtw6TDpHLDpG4ga8OkeXR0w6RlbiBwZXJ1c3RhbmEgMzYwLXDDpGl2w6Rpc3TDpCB2dW90dGEuDQpFREFURQkJCT0gUMOESVbDhC5LVVVLQVVTSQkJIyMJUGFsYXV0dGFhIGrDpHJqZXN0eXNsdWt1bmEgcMOkaXbDpG3DpMOkcsOkbiwgam9rYSBwb2lra2VhYSBhbG9pdHVzcMOkaXbDpG4gcMOkaXbDpG3DpMOkcsOkc3TDpCBhbm5ldHVuIGt1dWthdXNpbcOkw6Ryw6RuIHZlcnJhbiBqb2tvIGV0ZWVuLSB0YWkgdGFha3NlcMOkaW4uDQpFT01PTlRICQkJPSBLVVVLQVVTSS5MT1BQVQkJIyMJUGFsYXV0dGFhIGrDpHJqZXN0eXNsdWt1bmEgc2VuIGt1dWthdWRlbiB2aWltZWlzZW4gcMOkaXbDpG3DpMOkcsOkbiwgam9rYSBwb2lra2VhYSBhbm5ldHVuIGt1dWthdXNpbcOkw6Ryw6RuIHZlcnJhbiBldGVlbi0gdGFpIHRhYWtzZXDDpGluLg0KSE9VUgkJCT0gVFVOTklUCQkJIyMJTXV1bnRhYSBqw6RyamVzdHlzbHV2dW4gdHVubmVpa3NpLg0KTUlOVVRFCQkJPSBNSU5VVVRJVAkJCSMjCU11dW50YWEgasOkcmplc3R5c2x1dnVuIG1pbnV1dGVpa3NpLg0KTU9OVEgJCQk9IEtVVUtBVVNJCQkJIyMJTXV1bnRhYSBqw6RyamVzdHlzbHV2dW4ga3V1a2F1c2lrc2kuDQpORVRXT1JLREFZUwkJPSBUWcOWUMOESVbDhFQJCQkjIwlQYWxhdXR0YWEga2FoZGVuIHDDpGl2w6Rtw6TDpHLDpG4gdsOkbGlzc8OkIG9sZXZpZW4gdMOkeXNpZW4gdHnDtnDDpGl2aWVuIG3DpMOkcsOkbi4NCk5PVwkJCT0gTllUCQkJCSMjCVBhbGF1dHRhYSBrdWx1dmFuIHDDpGl2w6Rtw6TDpHLDpG4gamEgYWphbiBqw6RyamVzdHlzbnVtZXJvbi4NClNFQ09ORAkJCT0gU0VLVU5OSVQJCQkjIwlNdXVudGFhIGrDpHJqZXN0eXNsdXZ1biBzZWt1bm5laWtzaS4NClRJTUUJCQk9IEFJS0EJCQkJIyMJUGFsYXV0dGFhIGFubmV0dW4ga2VsbG9uYWphbiBqw6RyamVzdHlzbHV2dW4uDQpUSU1FVkFMVUUJCT0gQUlLQV9BUlZPCQkJIyMJTXV1bnRhYSB0ZWtzdGltdW9kb3NzYSBvbGV2YW4ga2VsbG9uYWphbiBqw6RyamVzdHlzbHV2dWtzaS4NClRPREFZCQkJPSBUw4RNw4QuUMOESVbDhAkJCSMjCVBhbGF1dHRhYSBrdWx1dmFuIHDDpGl2w6RuIHDDpGl2w6Rtw6TDpHLDpG4gasOkcmplc3R5c2x1dnVuLg0KV0VFS0RBWQkJCT0gVklJS09OUMOESVbDhAkJCSMjCU11dW50YWEgasOkcmplc3R5c2x1dnVuIHZpaWtvbnDDpGl2w6Rrc2kuDQpXRUVLTlVNCQkJPSBWSUlLS08uTlJPCQkJIyMJTXV1bnRhYSBqw6RyamVzdHlzbHV2dW4gbHV2dWtzaSwgam9rYSBpbG1haXNlZSB2aWlrb24gasOkcmplc3R5c2x1dnVuIHZ1b2RlbiBhbHVzdGEgbGFza2V0dHVuYS4NCldPUktEQVkJCQk9IFRZw5ZQw4RJVsOECQkJIyMJUGFsYXV0dGFhIGrDpHJqZXN0eXNsdXZ1biBww6RpdsOkbcOkw6Ryw6RsbGUsIGpva2Egc2lqYWl0c2VlIGFubmV0dHVqZW4gdHnDtnDDpGl2aWVuIHZlcnJhbiBldGVlbiB0YWkgdGFha3NlcMOkaW4uDQpZRUFSCQkJPSBWVU9TSQkJCQkjIwlNdXVudGFhIGrDpHJqZXN0eXNsdXZ1biB2dW9zaWtzaS4NCllFQVJGUkFDCQk9IFZVT1NJLk9TQQkJCSMjCVBhbGF1dHRhYSBtw6TDpHJpdGV0dHlqZW4gcMOkaXbDpG3DpMOkcmllbiAoYWxvaXR1c3DDpGl2w6QgamEgbG9wZXR1c3DDpGl2w6QpIHbDpGxpc2VuIG9zYW4gdnVvZGVzdGEuDQoNCg0KIyMNCiMjCUVuZ2luZWVyaW5nIGZ1bmN0aW9ucwkJCQlUZWtuaXNldCBmdW5rdGlvdA0KIyMNCkJFU1NFTEkJCQk9IEJFU1NFTEkJCQkjIwlQYWxhdXR0YWEgbXV1bm5ldHVuIEJlc3NlbC1mdW5rdGlvbiBJbih4KS4NCkJFU1NFTEoJCQk9IEJFU1NFTEoJCQkjIwlQYWxhdXR0YWEgQmVzc2VsLWZ1bmt0aW9uIEpuKHgpLg0KQkVTU0VMSwkJCT0gQkVTU0VMSwkJCSMjCVBhbGF1dHRhYSBtdXVubmV0dW4gQmVzc2VsLWZ1bmt0aW9uIEtuKHgpLg0KQkVTU0VMWQkJCT0gQkVTU0VMWQkJCSMjCVBhbGF1dHRhYSBCZXNzZWwtZnVua3Rpb24gWW4oeCkuDQpCSU4yREVDCQkJPSBCSU5ERVMJCQkjIwlNdXVudGFhIGJpbmFhcmlsdXZ1biBkZXNpbWFhbGlsdXZ1a3NpLg0KQklOMkhFWAkJCT0gQklOSEVLU0EJCQkjIwlNdXVudGFhIGJpbmFhcmlsdXZ1biBoZWtzYWRlc2ltYWFsaWx1dnVrc2kuDQpCSU4yT0NUCQkJPSBCSU5PS1QJCQkjIwlNdXVudGFhIGJpbmFhcmlsdXZ1biBva3RhYWxpbHV2dWtzaS4NCkNPTVBMRVgJCQk9IEtPTVBMRUtTSQkJCSMjCU11dW50YWEgcmVhYWxpLSBqYSBpbWFnaW5hYXJpb3NpZW4ga2VydG9pbWV0IGtvbXBsZWtzaWx1dnVrc2kuDQpDT05WRVJUCQkJPSBNVVVOTkEJCQkjIwlNdXVudGFhIGx1dnVuIHRvaXNlbiBtaXR0YWrDpHJqZXN0ZWxtw6RuIG11a2Fpc2Vrc2kuDQpERUMyQklOCQkJPSBERVNCSU4JCQkjIwlNdXVudGFhIGRlc2ltYWFsaWx1dnVuIGJpbmFhcmlsdXZ1a3NpLg0KREVDMkhFWAkJCT0gREVTSEVLU0EJCQkjIwlNdXVudGFhIGt5bW1lbmrDpHJqZXN0ZWxtw6RuIGx1dnVuIGhla3NhZGVzaW1hYWxpbHV2dWtzaS4NCkRFQzJPQ1QJCQk9IERFU09LVAkJCSMjCU11dW50YWEga3ltbWVuasOkcmplc3RlbG3DpG4gbHV2dW4gb2t0YWFsaWx1dnVrc2kuDQpERUxUQQkJCT0gU0FNQS5BUlZPCQkJIyMJVGFya2lzdGFhLCBvdmF0a28ga2Frc2kgYXJ2b2EgeWh0w6Qgc3V1cmlhLg0KRVJGCQkJPSBWSVJIRUZVTktUSU8JCQkjIwlQYWxhdXR0YWEgdmlyaGVmdW5rdGlvbi4NCkVSRkMJCQk9IFZJUkhFRlVOS1RJTy5LT01QTEVNRU5UVEkJIyMJUGFsYXV0dGFhIGtvbXBsZW1lbnR0aXZpcmhlZnVua3Rpb24uDQpHRVNURVAJCQk9IFJBSkEJCQkJIyMJVGVzdGFhLCBvbmtvIGx1a3Ugc3V1cmVtcGkga3VpbiBreW5ueXNhcnZvLg0KSEVYMkJJTgkJCT0gSEVLU0FCSU4JCQkjIwlNdXVudGFhIGhla3NhZGVzaW1hYWxpbHV2dW4gYmluYWFyaWx1dnVrc2kuDQpIRVgyREVDCQkJPSBIRUtTQURFUwkJCSMjCU11dW50YWEgaGVrc2FkZXNpbWFhbGlsdXZ1biBkZXNpbWFhbGlsdXZ1a3NpLg0KSEVYMk9DVAkJCT0gSEVLU0FPS1QJCQkjIwlNdXVudGFhIGhla3NhZGVzaW1hYWxpbHV2dW4gb2t0YWFsaWx1dnVrc2kuDQpJTUFCUwkJCT0gS09NUExFS1NJLklUU0VJU0FSVk8JCSMjCVBhbGF1dHRhYSBrb21wbGVrc2lsdXZ1biBpdHNlaXNhcnZvbiAobW9kdWx1a3NlbikuDQpJTUFHSU5BUlkJCT0gS09NUExFS1NJLklNQUcJCSMjCVBhbGF1dHRhYSBrb21wbGVrc2lsdXZ1biBpbWFnaW5hYXJpb3NhbiBrZXJ0b2ltZW4uDQpJTUFSR1VNRU5UCQk9IEtPTVBMRUtTSS5BUkcJCQkjIwlQYWxhdXR0YWEgdGhlZXRhLWFyZ3VtZW50aW4sIGpva2Egb24gcmFkaWFhbmVpbmEgYW5uZXR0dSBrdWxtYS4NCklNQ09OSlVHQVRFCQk9IEtPTVBMRUtTSS5LT05KCQkjIwlQYWxhdXR0YWEga29tcGxla3NpbHV2dW4ga29uanVnYWF0dGlsdXZ1bi4NCklNQ09TCQkJPSBLT01QTEVLU0kuQ09TCQkJIyMJUGFsYXV0dGFhIGtvbXBsZWtzaWx1dnVuIGtvc2luaW4uDQpJTURJVgkJCT0gS09NUExFS1NJLk9TQU0JCSMjCVBhbGF1dHRhYSBrYWhkZW4ga29tcGxla3NpbHV2dW4gb3NhbcOkw6Ryw6RuLg0KSU1FWFAJCQk9IEtPTVBMRUtTSS5FS1NQCQkjIwlQYWxhdXR0YWEga29tcGxla3NpbHV2dW4gZWtzcG9uZW50aW4uDQpJTUxOCQkJPSBLT01QTEVLU0kuTE4JCQkjIwlQYWxhdXR0YWEga29tcGxla3NpbHV2dW4gbHVvbm5vbGxpc2VuIGxvZ2FyaXRtaW4uDQpJTUxPRzEwCQkJPSBLT01QTEVLU0kuTE9HMTAJCSMjCVBhbGF1dHRhYSBrb21wbGVrc2lsdXZ1biBreW1tZW5rYW50YWlzZW4gbG9nYXJpdG1pbi4NCklNTE9HMgkJCT0gS09NUExFS1NJLkxPRzIJCSMjCVBhbGF1dHRhYSBrb21wbGVrc2lsdXZ1biBrYWtzaWthbnRhaXNlbiBsb2dhcml0bWluLg0KSU1QT1dFUgkJCT0gS09NUExFS1NJLlBPVAkJCSMjCVBhbGF1dHRhYSBrb2tvbmFpc2x1a3Vwb3RlbnNzaWluIGtvcm90ZXR1biBrb21wbGVrc2lsdXZ1bi4NCklNUFJPRFVDVAkJPSBLT01QTEVLU0kuVFVMTwkJIyMJUGFsYXV0dGFhIGtvbXBsZWtzaWx1a3VqZW4gdHVsb24uDQpJTVJFQUwJCQk9IEtPTVBMRUtTSS5SRUFBTEkJCSMjCVBhbGF1dHRhYSBrb21wbGVrc2lsdXZ1biByZWFhbGlvc2FuIGtlcnRvaW1lbi4NCklNU0lOCQkJPSBLT01QTEVLU0kuU0lOCQkJIyMJUGFsYXV0dGFhIGtvbXBsZWtzaWx1dnVuIHNpbmluLg0KSU1TUVJUCQkJPSBLT01QTEVLU0kuTkVMScOWSgkJIyMJUGFsYXV0dGFhIGtvbXBsZWtzaWx1dnVuIG5lbGnDtmp1dXJlbi4NCklNU1VCCQkJPSBLT01QTEVLU0kuRVJPVFVTCQkjIwlQYWxhdXR0YWEga2FoZGVuIGtvbXBsZWtzaWx1dnVuIGVyb3R1a3Nlbi4NCklNU1VNCQkJPSBLT01QTEVLU0kuU1VNCQkJIyMJUGFsYXV0dGFhIGtvbXBsZWtzaWx1a3VqZW4gc3VtbWFuLg0KT0NUMkJJTgkJCT0gT0tUQklOCQkJIyMJTXV1bnRhYSBva3RhYWxpbHV2dW4gYmluYWFyaWx1dnVrc2kuDQpPQ1QyREVDCQkJPSBPS1RERVMJCQkjIwlNdXVudGFhIG9rdGFhbGlsdXZ1biBkZXNpbWFhbGlsdXZ1a3NpLg0KT0NUMkhFWAkJCT0gT0tUSEVLU0EJCQkjIwlNdXVudGFhIG9rdGFhbGlsdXZ1biBoZWtzYWRlc2ltYWFsaWx1dnVrc2kuDQoNCg0KIyMNCiMjCUZpbmFuY2lhbCBmdW5jdGlvbnMJCQkJUmFob2l0dXNmdW5rdGlvdCAgIA0KIyMNCkFDQ1JJTlQJCQk9IEtFUlRZTllULktPUktPCQkjIwlMYXNrZWUgYXJ2b3BhcGVyaWxsZSBrZXJ0eW5lZW4ga29yb24sIGt1biBrb3JrbyBrZXJ0eXkgc8Okw6RubsO2bGxpc2luIHbDpGxpYWpvaW4uDQpBQ0NSSU5UTQkJPSBLRVJUWU5ZVC5LT1JLTy5MT1BVU1NBCSMjCUxhc2tlZSBhcnZvcGFwZXJpbGxlIGtlcnR5bmVlbiBrb3Jvbiwga3VuIGtvcmtvIG1ha3NldGFhbiBlcsOkcMOkaXbDpG7DpC4NCkFNT1JERUdSQwkJPSBBTU9SREVHUkMJCQkjIwlMYXNrZWUga3Vua2luIGxhc2tlbnRha2F1ZGVuIHBvaXN0b24gcG9pc3Rva2Vycm9pbnRhIGvDpHl0dMOkbcOkbGzDpC4NCkFNT1JMSU5DCQk9IEFNT1JMSU5DCQkJIyMJUGFsYXV0dGFhIGt1bmtpbiBsYXNrZW50YWthdWRlbiBwb2lzdG9uLg0KQ09VUERBWUJTCQk9IEtPUktPUMOESVbDhFQuQUxVU1RBCQkjIwlQYWxhdXR0YWEga29yb25tYWtzdWthdWRlbiBhbG9pdHVzcMOkaXbDpG4gamEgdGlsaXR5c3DDpGl2w6RuIHbDpGxpc2VuIGFqYW5qYWtzb24gcMOkaXZpZW4gbcOkw6Ryw6RuLg0KQ09VUERBWVMJCT0gS09SS09Qw4RJVsOEVAkJCSMjCVBhbGF1dHRhYSBww6RpdmllbiBtw6TDpHLDpG4ga29yb25tYWtzdWthdWRlbHRhLCBqb2hvbiB0aWxpdHlzcMOkaXbDpCBrdXVsdXUuDQpDT1VQREFZU05DCQk9IEtPUktPUMOESVbDhFQuU0VVUkFBVkEJCSMjCVBhbGF1dHRhYSB0aWxpdHlzcMOkaXbDpG4gamEgc2V1cmFhdmFuIGtvcm9ubWFrc3Vww6RpdsOkbiB2w6RsaXNlbiBhamFuamFrc29uIHDDpGl2aWVuIG3DpMOkcsOkbi4NCkNPVVBOQ0QJCQk9IEtPUktPTUFLU1UuU0VVUkFBVkEJCSMjCVBhbGF1dHRhYSB0aWxpdHlzcMOkaXbDpG4gasOkbGtlaXNlbiBzZXVyYWF2YW4ga29yb25tYWtzdXDDpGl2w6RuLg0KQ09VUE5VTQkJCT0gS09SS09Qw4RJVsOESkFLU09UCQkjIwlQYWxhdXR0YWEgYXJ2b3BhcGVyaW4gb3N0b3DDpGl2w6RuIGphIGVyw6TDpG50eW1pc3DDpGl2w6RuIHbDpGxpc3RlbiBrb3Jvbm1ha3N1cMOkaXZpZW4gbcOkw6Ryw6RuLg0KQ09VUFBDRAkJCT0gS09SS09Qw4RJVsOELkVERUxMSU5FTgkJIyMJUGFsYXV0dGFhIHRpbGl0eXNww6RpdsOkw6QgZWRlbHTDpHbDpG4ga29yb25tYWtzdXDDpGl2w6RuLg0KQ1VNSVBNVAkJCT0gTUFLU0VUVFUuS09SS08JCSMjCVBhbGF1dHRhYSBrYWhkZW4gamFrc29uIHbDpGxpc2Vuw6QgYWlrYW5hIGtlcnR5bmVlbiBrb3Jvbi4NCkNVTVBSSU5DCQk9IE1BS1NFVFRVLkxZSEVOTllTCQkjIwlQYWxhdXR0YWEgbGFpbmFsbGUga2FoZGVuIGpha3NvbiB2w6RsaXNlbsOkIGFpa2FuYSBrZXJ0eW5lZW4gbHloZW5ueWtzZW4uDQpEQgkJCT0gREIJCQkJIyMJUGFsYXV0dGFhIGthdWRlbiBraXJqYW5waWRvbGxpc2VuIHBvaXN0b24gYW1lcmlra2FsYWlzZW4gREItbWVuZXRlbG3DpG4gKEZpeGVkLWRlY2xpbmluZyBiYWxhbmNlKSBtdWthYW4uDQpEREIJCQk9IEREQgkJCQkjIwlQYWxhdXR0YWEga2F1ZGVuIGtpcmphbnBpZG9sbGlzZW4gcG9pc3RvbiBhbWVyaWtrYWxhaXNlbiBEREItbWVuZXRlbG3DpG4gKERvdWJsZS1EZWNsaW5pbmcgQmFsYW5jZSkgdGFpIGpvbmtpbiBtdXVuIG3DpMOkcml0dMOkbcOkc2kgbWVuZXRlbG3DpG4gbXVrYWFuLg0KRElTQwkJCT0gRElTS09OVFRPS09SS08JCSMjCVBhbGF1dHRhYSBhcnZvcGFwZXJpbiBkaXNrb250dG9rb3Jvbi4NCkRPTExBUkRFCQk9IFZBTFVVVFRBLkRFUwkJCSMjCU11dW50YWEgbXVydG9sdWt1bmEgaWxtb2l0ZXR1biB2YWx1dXR0YW3DpMOkcsOkbiBkZXNpbWFhbGlsdXZ1a3NpLg0KRE9MTEFSRlIJCT0gVkFMVVVUVEEuTVVSVE8JCSMjCU11dW50YWEgZGVzaW1hYWxpbHVrdW5hIGlsbWFpc3R1biB2YWx1dXR0YW3DpMOkcsOkbiBtdXJ0b2x1dnVrc2kuDQpEVVJBVElPTgkJPSBLRVNUTwkJCQkjIwlQYWxhdXR0YWEga2VzdG9uIGFydm9wYXBlcmlsbGUsIGpvbmthIGtvcm9ubWFrc3UgdGFwYWh0dXUgc8Okw6RubsO2bGxpc2VzdGkuDQpFRkZFQ1QJCQk9IEtPUktPLkVGRUtUCQkJIyMJUGFsYXV0dGFhIHRvZGVsbGlzZW4gdnVvc2lrb3Jvbi4NCkZWCQkJPSBUVUxFVkEuQVJWTwkJCSMjCVBhbGF1dHRhYSBzaWpvaXR1a3NlbiB0dWxldmFuIGFydm9uLg0KRlZTQ0hFRFVMRQkJPSBUVUxFVkEuQVJWTy5FUklLT1JLTwkJIyMJUGFsYXV0dGFhIHDDpMOkb21hbiB0dWxldmFuIGFydm9uLCBrdW4gcMOkw6RvbWFsbGUgb24ga2VydHlueXQga29ya29hIHZhaWh0ZWxldmFzdGkuDQpJTlRSQVRFCQkJPSBLT1JLTy5BUlZPUEFQRVJJCQkjIwlQYWxhdXR0YWEgYXJ2b3BhcGVyaW4ga29ya29rYW5uYW4gdMOkeXNpbiBzaWpvaXRldHVsbGUgYXJ2b3BhcGVyaWxsZS4NCklQTVQJCQk9IElQTVQJCQkJIyMJTGFza2VlIHNpam9pdHVrc2VsbGUgdGFpIGxhaW5hbGxlIHRpZXR0eW7DpCBhamFuamFrc29uYSBrZXJ0eXbDpG4ga29yb24uDQpJUlIJCQk9IFNJU8OESU5FTi5LT1JLTwkJIyMJTGFza2VlIHNpc8OkaXNlbiBrb3Jrb2thbm5hbiBrYXNzYXZpcnJhc3RhIG11b2Rvc3R1dmFsbGUgc2FyamFsbGUuDQpJU1BNVAkJCT0gT05NQUtTVQkJCSMjCUxhc2tlZSBzaWpvaXR1a3NlbiBtYWtzZXR1biBrb3JvbiB0aWV0eWxsw6QgamFrc29sbGEuDQpNRFVSQVRJT04JCT0gS0VTVE8uTVVVTk4JCQkjIwlQYWxhdXR0YWEgbXV1bm5ldHVuIE1hY2F1bGV5LWtlc3RvbiBhcnZvcGFwZXJpbGxlLCBqb25rYSBvbGV0ZXR0dSBuaW1lbGxpc2Fydm8gb24gMTAwIGV1cm9hLg0KTUlSUgkJCT0gTVNJU8OESU5FTgkJCSMjCVBhbGF1dHRhYSBzaXPDpGlzZW4ga29ya29rYW5uYW4sIGt1biBwb3NpdGlpdmlzdGVuIGphIG5lZ2F0aWl2aXN0ZW4ga2Fzc2F2aXJ0b2plbiByYWhvaXR1c2tvcmtvIG9uIGVyaWxhaW5lbi4NCk5PTUlOQUwJCQk9IEtPUktPLlZVT1NJCQkJIyMJUGFsYXV0dGFhIHZ1b3NpdHRhaXNlbiBuaW1lbGxpc2tvcm9uLg0KTlBFUgkJCT0gTkpBS1NPCQkJIyMJUGFsYXV0dGFhIHNpam9pdHVrc2VuIGpha3NvamVuIG3DpMOkcsOkbi4NCk5QVgkJCT0gTk5BCQkJCSMjCVBhbGF1dHRhYSBzaWpvaXR1a3NlbiBueWt5YXJ2b24gdG9pc3R1dmlzdGEga2Fzc2F2aXJyb2lzdGEgbXVvZG9zdHV2YW4gc2FyamFuIGphIGRpc2tvbnR0b2tvcm9uIHBlcnVzdGVlbGxhLg0KT0RERlBSSUNFCQk9IFBBUklUT04uRU5TLk5JTUVMTElTQVJWTwkjIwlQYWxhdXR0YWEgYXJ2b3BhcGVyaW4gaGlubmFuIHRpbGFudGVlc3NhLCBqb3NzYSBlbnNpbW3DpGluZW4gamFrc28gb24gcGFyaXRvbi4NCk9EREZZSUVMRAkJPSBQQVJJVE9OLkVOUy5UVU9UVE8JCSMjCVBhbGF1dHRhYSBhcnZvcGFwZXJpbiB0dW90b24gdGlsYW50ZWVzc2EsIGpvc3NhIGVuc2ltbcOkaW5lbiBqYWtzbyBvbiBwYXJpdG9uLg0KT0RETFBSSUNFCQk9IFBBUklUT04uVklJTS5OSU1FTExJU0FSVk8JIyMJUGFsYXV0dGFhIGFydm9wYXBlcmluIGhpbm5hbiB0aWxhbnRlZXNzYSwgam9zc2EgdmlpbWVpbmVuIGpha3NvIG9uIHBhcml0b24uDQpPRERMWUlFTEQJCT0gUEFSSVRPTi5WSUlNLlRVT1RUTwkJIyMJUGFsYXV0dGFhIGFydm9wYXBlcmluIHR1b3RvbiB0aWxhbnRlZXNzYSwgam9zc2EgdmlpbWVpbmVuIGpha3NvIG9uIHBhcml0b24uDQpQTVQJCQk9IE1BS1NVCQkJCSMjCVBhbGF1dHRhYSBhbm51aXRlZXRpbiBrYXVzaXR0YWlzZW4gbWFrc3VlcsOkbi4NClBQTVQJCQk9IFBQTVQJCQkJIyMJTGFza2VlIHNpam9pdHVrc2VsbGUgdGFpIGxhaW5hbGxlIHRpZXR0eW7DpCBhamFuamFrc29uYSBtYWtzZXR0YXZhbiBseWhlbm55a3Nlbi4NClBSSUNFCQkJPSBISU5UQQkJCQkjIwlQYWxhdXR0YWEgaGlubmFuIDEwMCBldXJvbiBuaW1lbGxpc2Fydm9hIGtvaGRlbiBhcnZvcGFwZXJpbGxlLCBqb25rYSBrb3JrbyBtYWtzZXRhYW4gc8Okw6RubsO2bGxpc2luIHbDpGxpYWpvaW4uDQpQUklDRURJU0MJCT0gSElOVEEuRElTSwkJCSMjCVBhbGF1dHRhYSBkaXNrb250YXR1biBhcnZvcGFwZXJpbiBoaW5uYW4gMTAwIGV1cm9uIG5pbWVsbGlzYXJ2b2Ega29oZGVuLg0KUFJJQ0VNQVQJCT0gSElOVEEuTFVOQVNUVVMJCSMjCVBhbGF1dHRhYSBoaW5uYW4gMTAwIGV1cm9uIG5pbWVsbGlzYXJ2b2Ega29oZGVuIGFydm9wYXBlcmlsbGUsIGpvbmthIGtvcmtvIG1ha3NldGFhbiBlcsOkw6RudHltaXNww6RpdsOkbsOkLg0KUFYJCQk9IE5BCQkJCSMjCVBhbGF1dHRhYSBzaWpvaXR1a3NlbiBueWt5YXJ2b24uDQpSQVRFCQkJPSBLT1JLTwkJCQkjIwlQYWxhdXR0YWEgYW5udWl0ZWV0aW4ga2F1c2l0dGFpc2VuIGtvcmtva2FubmFuLg0KUkVDRUlWRUQJCT0gU0FBVFUuSElOVEEJCQkjIwlQYWxhdXR0YWEgYXJ2b3BhcGVyaW4gdHVvdG9uIGVyw6TDpG50eW1pc3DDpGl2w6Ruw6Qga29rb25hYW4gbWFrc2V0dWxsZSBzaWpvaXR1a3NlbGxlLg0KU0xOCQkJPSBTVFAJCQkJIyMJUGFsYXV0dGFhIHNpam9pdHVrc2VuIHRhc2Fwb2lzdG9uIHloZGVsdMOkIGpha3NvbHRhLg0KU1lECQkJPSBWVU9TSVBPSVNUTwkJCSMjCVBhbGF1dHRhYSBzaWpvaXR1a3NlbiB2dW9zaXBvaXN0b24gYW5uZXR0dW5hIGthdXRlbmEgYW1lcmlra2FsYWlzZW4gU1lELW1lbmV0ZWxtw6RuIChTdW0tb2YtWWVhcidzIERpZ2l0cykgYXZ1bGxhLg0KVEJJTExFUQkJCT0gT0JMSUcuVFVPVFRPUFJPUwkJIyMJUGFsYXV0dGFhIHZhbHRpb24gb2JsaWdhYXRpb24gdHVvdG9uIHZhc3RhYXZhbmEgam91a2tvdmVsa2FraXJqYW4gdHVvdHRvbmEuDQpUQklMTFBSSUNFCQk9IE9CTElHLkhJTlRBCQkJIyMJUGFsYXV0dGFhIG9ibGlnYWF0aW9uIGhpbm5hbiAxMDAgZXVyb24gbmltZWxsaXNhcnZvYSBrb2hkZW4uDQpUQklMTFlJRUxECQk9IE9CTElHLlRVT1RUTwkJCSMjCVBhbGF1dHRhYSBvYmxpZ2FhdGlvbiB0dW90b24uDQpWREIJCQk9IFZEQgkJCQkjIwlQYWxhdXR0YWEgYW5uZXR1biBrYXVkZW4gdGFpIGthdWRlbiBvc2FuIGtpcmphbnBpZG9sbGlzZW4gcG9pc3RvbiBhbWVyaWtrYWxhaXNlbiBEQi1tZW5ldGVsbcOkbiAoRml4ZWQtZGVjbGluaW5nIGJhbGFuY2UpIG11a2Fhbi4NClhJUlIJCQk9IFNJU8OESU5FTi5LT1JLTy5KQUtTT1RPTgkjIwlQYWxhdXR0YWEgc2lzw6Rpc2VuIGtvcmtva2FubmFuIGthc3NhdmlydG9qZW4gc2Fyam9pbGxlLCBqb3RrYSBlaXbDpHQgdsOkbHR0w6Rtw6R0dMOkIG9sZSBzw6TDpG5uw7ZsbGlzacOkLg0KWE5QVgkJCT0gTk5BLkpBS1NPVE9OCQkJIyMJUGFsYXV0dGFhIG5ldHRvbnlreWFydm9uIGthc3NhdmlydGFzYXJqYWxsZSwgam9rYSBlaSB2w6RsdHTDpG3DpHR0w6Qgb2xlIGthdXNpdHRhaW5lbi4NCllJRUxECQkJPSBUVU9UVE8JCQkjIwlQYWxhdXR0YWEgdHVvdG9uIGFydm9wYXBlcmlsbGUsIGpvbmthIGtvcmtvIG1ha3NldGFhbiBzw6TDpG5uw7ZsbGlzaW4gdsOkbGlham9pbi4NCllJRUxERElTQwkJPSBUVU9UVE8uRElTSwkJCSMjCVBhbGF1dHRhYSBkaXNrb250YXR1biBhcnZvcGFwZXJpbiwga3V0ZW4gb2JsaWdhYXRpb24sIHZ1b3NpdHRhaXNlbiB0dW90b24uDQpZSUVMRE1BVAkJPSBUVU9UVE8uRVLDhFAJCQkjIwlQYWxhdXR0YWEgZXLDpMOkbnR5bWlzcMOkaXbDpG7DpMOkbiBrb3Jrb2EgdHVvdHRhdmFuIGFydm9wYXBlcmluIHZ1b3NpdHRhaXNlbiB0dW90b24uDQoNCg0KIyMNCiMjCUluZm9ybWF0aW9uIGZ1bmN0aW9ucwkJCQlFcmlrb2lzZnVua3Rpb3QNCiMjDQpDRUxMCQkJPSBTT0xVCQkJCSMjCVBhbGF1dHRhYSB0aWV0b2phIHNvbHVuIG11b3RvaWx1c3RhLCBzaWphaW5uaXN0YSBqYSBzaXPDpGxsw7ZzdMOkLg0KRVJST1IuVFlQRQkJPSBWSVJIRUVOLkxBSkkJCQkjIwlQYWxhdXR0YWEgdmlyaGV0eXlwcGnDpCB2YXN0YWF2YW4gbHV2dW4uDQpJTkZPCQkJPSBLVVZBVVMJCQkjIwlQYWxhdXR0YWEgdGlldG9qYSBueWt5aXNlc3TDpCBrw6R5dHTDtnltcMOkcmlzdMO2c3TDpC4NCklTQkxBTksJCQk9IE9OVFlISsOECQkJIyMJUGFsYXV0dGFhIGFydm9uIFRPU0ksIGpvcyBhcnZvIG9uIHR5aGrDpC4NCklTRVJSCQkJPSBPTlZJUkgJCQkjIwlQYWxhdXR0YWEgYXJ2b24gVE9TSSwgam9zIGFydm8gb24gbWlrw6QgdGFoYW5zYSB2aXJoZWFydm8gcGFpdHNpIGFydm8gI1BVVVRUVVUhLg0KSVNFUlJPUgkJCT0gT05WSVJIRQkJCSMjCVBhbGF1dHRhYSBhcnZvbiBUT1NJLCBqb3MgYXJ2byBvbiBtaWvDpCB0YWhhbnNhIHZpcmhlYXJ2by4NCklTRVZFTgkJCT0gT05QQVJJTExJTkVOCQkJIyMJUGFsYXV0dGFhIGFydm9uIFRPU0ksIGpvcyBhcnZvIG9uIHBhcmlsbGluZW4uDQpJU0xPR0lDQUwJCT0gT05UT1RVVVMJCQkjIwlQYWxhdXR0YWEgYXJ2b24gVE9TSSwgam9zIGFydm8gb24gbWlrw6QgdGFoYW5zYSBsb29naW5lbiBhcnZvLg0KSVNOQQkJCT0gT05QVVVUVFVVCQkJIyMJUGFsYXV0dGFhIGFydm9uIFRPU0ksIGpvcyB2aXJoZWFydm8gb24gI1BVVVRUVVUhLg0KSVNOT05URVhUCQk9IE9ORUlfVEVLU1RJCQkJIyMJUGFsYXV0dGFhIGFydm9uIFRPU0ksIGpvcyBhcnZvIGVpIG9sZSB0ZWtzdGkuDQpJU05VTUJFUgkJPSBPTkxVS1UJCQkjIwlQYWxhdXR0YWEgYXJ2b24gVE9TSSwgam9zIGFydm8gb24gbHVrdS4NCklTT0RECQkJPSBPTlBBUklUT04JCQkjIwlQYWxhdXR0YWEgYXJ2b24gVE9TSSwgam9zIGFydm8gb24gcGFyaXRvbi4NCklTUkVGCQkJPSBPTlZJSVRUCQkJIyMJUGFsYXV0dGFhIGFydm9uIFRPU0ksIGpvcyBhcnZvIG9uIHZpaXR0YXVzLg0KSVNURVhUCQkJPSBPTlRFS1NUSQkJCSMjCVBhbGF1dHRhYSBhcnZvbiBUT1NJLCBqb3MgYXJ2byBvbiB0ZWtzdGkuDQpOCQkJPSBOCQkJCSMjCVBhbGF1dHRhYSBhcnZvbiBsdXZ1a3NpIG11dW5uZXR0dW5hLg0KTkEJCQk9IFBVVVRUVVUJCQkjIwlQYWxhdXR0YWEgdmlyaGVhcnZvbiAjUFVVVFRVVSEuDQpUWVBFCQkJPSBUWVlQUEkJCQkjIwlQYWxhdXR0YWEgbHV2dW4sIGpva2EgaWxtYWlzZWUgYXJ2b24gdGlldG90eXlwaW4uDQoNCg0KIyMNCiMjCUxvZ2ljYWwgZnVuY3Rpb25zCQkJCUxvb2dpc2V0IGZ1bmt0aW90DQojIw0KQU5ECQkJPSBKQQkJCQkjIwlQYWxhdXR0YWEgYXJ2b24gVE9TSSwgam9zIGthaWtraWVuIGFyZ3VtZW50dGllbiBhcnZvIG9uIFRPU0kuDQpGQUxTRQkJCT0gRVDDhFRPU0kJCQkjIwlQYWxhdXR0YWEgdG90dXVzYXJ2b24gRVDDhFRPU0kuDQpJRgkJCT0gSk9TCQkJCSMjCU3DpMOkcml0dMOkw6Qgc3Vvcml0ZXR0YXZhbiBsb29naXNlbiB0ZXN0aW4uDQpJRkVSUk9SCQkJPSBKT1NWSVJIRQkJCSMjCVBhbGF1dHRhYSBtw6TDpHJpdHTDpG3DpHNpIGFydm9uLCBqb3Mga2FhdmFuIHR1bG9zIG9uIHZpcmhlOyBtdXVzc2EgdGFwYXVrc2Vzc2EgcGFsYXV0dGFhIGthYXZhbiB0dWxva3Nlbi4NCk5PVAkJCT0gRUkJCQkJIyMJS8Okw6RudMOkw6QgYXJndW1lbnRpbiBsb29naXNlbiBhcnZvbi4NCk9SCQkJPSBUQUkJCQkJIyMJUGFsYXV0dGFhIGFydm9uIFRPU0ksIGpvcyBtaW5rw6QgdGFoYW5zYSBhcmd1bWVudGluIGFydm8gb24gVE9TSS4NClRSVUUJCQk9IFRPU0kJCQkJIyMJUGFsYXV0dGFhIHRvdHV1c2Fydm9uIFRPU0kuDQoNCg0KIyMNCiMjCUxvb2t1cCBhbmQgcmVmZXJlbmNlIGZ1bmN0aW9ucwkJCUhha3UtIGphIHZpaXRlZnVua3Rpb3QNCiMjDQpBRERSRVNTCQkJPSBPU09JVEUJCQkjIwlQYWxhdXR0YWEgbGFza2VudGF0YXVsdWtvbiBzb2x1dW4gb3NvaXR0YXZhbiB2aWl0dGF1a3NlbiB0ZWtzdGluw6QuDQpBUkVBUwkJCT0gQUxVRUVUCQkJIyMJUGFsYXV0dGFhIHZpaXR0YXVrc2Vzc2Egb2xldmllbiBhbHVlaWRlbiBtw6TDpHLDpG4uDQpDSE9PU0UJCQk9IFZBTElUU0UuSU5ERUtTSQkJIyMJVmFsaXRzZWUgYXJ2b24gYXJ2b2x1ZXR0ZWxvc3RhLg0KQ09MVU1OCQkJPSBTQVJBS0UJCQkjIwlQYWxhdXR0YWEgdmlpdHRhdWtzZW4gc2FyYWtlbnVtZXJvbi4NCkNPTFVNTlMJCQk9IFNBUkFLS0VFVAkJCSMjCVBhbGF1dHRhYSB2aWl0dGF1a3Nlc3NhIG9sZXZpZW4gc2FyYWtrZWlkZW4gbcOkw6Ryw6RuLg0KSExPT0tVUAkJCT0gVkhBS1UJCQkJIyMJU3Vvcml0dGFhIGhhdW4gbWF0cmlpc2luIHlsaW1tw6RsdMOkIHJpdmlsdMOkIGphIHBhbGF1dHRhYSBtw6TDpHJpdGV0eW4gc29sdW4gYXJ2b24uDQpIWVBFUkxJTksJCT0gSFlQRVJMSU5LS0kJCQkjIwlMdW8gcGlrYWt1dmFra2VlbiB0YWkgdGVrc3Rpbiwgam9rYSBhdmFhIHZlcmtrb3BhbHZlbGltZWVuLCBpbnRyYW5ldGlpbiB0YWkgSW50ZXJuZXRpaW4gdGFsbGVubmV0dW4gdGllZG9zdG9uLg0KSU5ERVgJCQk9IElOREVLU0kJCQkjIwlWYWxpdHNlZSBhcnZvbiB2aWl0dGF1a3Nlc3RhIHRhaSBtYXRyaWlzaXN0YSBpbmRla3NpbiBtdWthYW4uDQpJTkRJUkVDVAkJPSBFUMOEU1VPUkEJCQkjIwlQYWxhdXR0YWEgdGVrc3RpYXJ2b25hIGlsbWFpc3R1biB2aWl0dGF1a3Nlbi4NCkxPT0tVUAkJCT0gSEFLVQkJCQkjIwlFdHNpaSBhcnZvamEgdmVrdG9yaXN0YSB0YWkgbWF0cmlpc2lzdGEuDQpNQVRDSAkJCT0gVkFTVElORQkJCSMjCUV0c2lpIGFydm9qYSB2aWl0dGF1a3Nlc3RhIHRhaSBtYXRyaWlzaXN0YS4NCk9GRlNFVAkJCT0gU0lJUlRZTcOECQkJIyMJUGFsYXV0dGFhIGFubmV0dW4gdmlpdHRhdWtzZW4gc2lpcnR5bcOkbi4NClJPVwkJCT0gUklWSQkJCQkjIwlQYWxhdXR0YWEgdmlpdHRhdWtzZW4gcml2aW51bWVyb24uDQpST1dTCQkJPSBSSVZJVAkJCQkjIwlQYWxhdXR0YWEgdmlpdHRhdWtzZXNzYSBvbGV2aWVuIHJpdmllbiBtw6TDpHLDpG4uDQpSVEQJCQk9IFJURAkJCQkjIwlOb3V0YWEgQ09NLWF1dG9tYWF0aW90YSAoYXV0b21hYXRpbzogVGFwYSBrw6RzaXRlbGzDpCBzb3ZlbGx1a3NlbiBvYmpla3RlamEgdG9pc2VzdGEgc292ZWxsdWtzZXN0YSB0YWkga2VoaXR5c3R5w7ZrYWx1c3RhLiBBdXRvbWFhdGlvLCBqb3RhIGFpZW1taW4ga3V0c3V0dGlpbiBPTEUtYXV0b21hYXRpb2tzaSwgb24gdGVvbGxpc3V1c3N0YW5kYXJkaSBqYSBDT00tbWFsbGluIChDb21wb25lbnQgT2JqZWN0IE1vZGVsKSBvbWluYWlzdXVzLikgdHVrZXZhc3RhIG9oamVsbWFzdGEgcmVhYWxpYWlrYWlzaWEgdGlldG9qYS4NClRSQU5TUE9TRQkJPSBUUkFOU1BPTk9JCQkJIyMJUGFsYXV0dGFhIG1hdHJpaXNpbiBrw6TDpG50ZWlzbWF0cmlpc2luLg0KVkxPT0tVUAkJCT0gUEhBS1UJCQkJIyMJU3Vvcml0dGFhIGhhdW4gbWF0cmlpc2luIGVuc2ltbcOkaXNlc3TDpCBzYXJha2tlZXN0YSBqYSBwYWxhdXR0YWEgcml2aWxsw6Qgb2xldmFuIHNvbHVuIGFydm9uLg0KDQoNCiMjDQojIwlNYXRoIGFuZCB0cmlnb25vbWV0cnkgZnVuY3Rpb25zCQkJTWF0ZW1hYXR0aXNldCBqYSB0cmlnb25vbWV0cmlzZXQgZnVua3Rpb3QNCiMjDQpBQlMJCQk9IElUU0VJU0FSVk8JCQkjIwlQYWxhdXR0YWEgbHV2dW4gaXRzZWlzYXJ2b24uDQpBQ09TCQkJPSBBQ09TCQkJCSMjCVBhbGF1dHRhYSBsdXZ1biBhcmt1c2tvc2luaW4uDQpBQ09TSAkJCT0gQUNPU0gJCQkJIyMJUGFsYXV0dGFhIGx1dnVuIGvDpMOkbnRlaXNlbiBoeXBlcmJvbGlzZW4ga29zaW5pbi4NCkFTSU4JCQk9IEFTSU4JCQkJIyMJUGFsYXV0dGFhIGx1dnVuIGFya3Vzc2luaW4uDQpBU0lOSAkJCT0gQVNJTkgJCQkJIyMJUGFsYXV0dGFhIGx1dnVuIGvDpMOkbnRlaXNlbiBoeXBlcmJvbGlzZW4gc2luaW4uDQpBVEFOCQkJPSBBVEFOCQkJCSMjCVBhbGF1dHRhYSBsdXZ1biBhcmt1c3RhbmdlbnRpbi4NCkFUQU4yCQkJPSBBVEFOMgkJCQkjIwlQYWxhdXR0YWEgYXJrdXN0YW5nZW50aW4geC0gamEgeS1rb29yZGluYWF0aW4gcGVydXN0ZWVsbGEuDQpBVEFOSAkJCT0gQVRBTkgJCQkJIyMJUGFsYXV0dGFhIGx1dnVuIGvDpMOkbnRlaXNlbiBoeXBlcmJvbGlzZW4gdGFuZ2VudGluLg0KQ0VJTElORwkJCT0gUFnDllJJU1TDhC5LRVJSLllMw5ZTCQkjIwlQecO2cmlzdMOkw6QgbHV2dW4gbMOkaGltcMOkw6RuIGtva29uYWlzbHVrdXVuIHRhaSB0YXJra3V1c2FyZ3VtZW50aW4gbMOkaGltcMOkw6RuIGtlcnJhbm5haXNlZW4uDQpDT01CSU4JCQk9IEtPTUJJTkFBVElPCQkJIyMJUGFsYXV0dGFhIG1haGRvbGxpc3RlbiBrb21iaW5hYXRpb2lkZW4gbcOkw6Ryw6RuIGFubmV0dWxsZSBvYmpla3RpZW4gbcOkw6Ryw6RsbGUuDQpDT1MJCQk9IENPUwkJCQkjIwlQYWxhdXR0YWEgbHV2dW4ga29zaW5pbi4NCkNPU0gJCQk9IENPU0gJCQkJIyMJUGFsYXV0dGFhIGx1dnVuIGh5cGVyYm9saXNlbiBrb3NpbmluLg0KREVHUkVFUwkJCT0gQVNURUVUCQkJIyMJTXV1bnRhYSByYWRpYWFuaXQgYXN0ZWlrc2kuDQpFVkVOCQkJPSBQQVJJTExJTkVOCQkJIyMJUHnDtnJpc3TDpMOkIGx1dnVuIHlsw7ZzcMOkaW4gbMOkaGltcMOkw6RuIHBhcmlsbGlzZWVuIGtva29uYWlzbHVrdXVuLg0KRVhQCQkJPSBFS1NQT05FTlRUSQkJCSMjCVBhbGF1dHRhYSBlOm4ga29yb3RldHR1bmEgYW5uZXR1biBsdXZ1biBvc29pdHRhbWFhbiBwb3RlbnNzaWluLg0KRkFDVAkJCT0gS0VSVE9NQQkJCSMjCVBhbGF1dHRhYSBsdXZ1biBrZXJ0b21hbi4NCkZBQ1RET1VCTEUJCT0gS0VSVE9NQS5PU0EJCQkjIwlQYWxhdXR0YWEgbHV2dW4gb3Nha2VydG9tYW4uDQpGTE9PUgkJCT0gUFnDllJJU1TDhC5LRVJSLkFMQVMJCSMjCVB5w7ZyaXN0w6TDpCBsdXZ1biBhbGFzcMOkaW4gKG5vbGxhYSBrb2h0aSkuDQpHQ0QJCQk9IFNVVVJJTi5ZSFQuVEVLSUrDhAkJIyMJUGFsYXV0dGFhIHN1dXJpbW1hbiB5aHRlaXNlbiB0ZWtpasOkbi4NCklOVAkJCT0gS09LT05BSVNMVUtVCQkJIyMJUHnDtnJpc3TDpMOkIGx1dnVuIGFsYXNww6RpbiBsw6RoaW1ww6TDpG4ga29rb25haXNsdWt1dW4uDQpMQ00JCQk9IFBJRU5JTi5ZSFQuSkFFVFRBVkEJCSMjCVBhbGF1dHRhYSBwaWVuaW1tw6RuIHlodGVpc2VuIHRla2lqw6RuLg0KTE4JCQk9IExVT05OTE9HCQkJIyMJUGFsYXV0dGFhIGx1dnVuIGx1b25ub2xsaXNlbiBsb2dhcml0bWluLg0KTE9HCQkJPSBMT0cJCQkJIyMJTGFza2VlIGx1dnVuIGxvZ2FyaXRtaW4ga8OkeXR0w6Rtw6RsbMOkIGFubmV0dHVhIGthbnRhbHVrdWEuDQpMT0cxMAkJCT0gTE9HMTAJCQkJIyMJUGFsYXV0dGFhIGx1dnVuIGt5bW1lbmthbnRhaXNlbiBsb2dhcml0bWluLg0KTURFVEVSTQkJCT0gTURFVEVSTQkJCSMjCVBhbGF1dHRhYSBtYXRyaWlzaW4gbWF0cmlpc2lkZXRlcm1pbmFudGluLg0KTUlOVkVSU0UJCT0gTUvDhMOETlRFSU5FTgkJCSMjCVBhbGF1dHRhYSBtYXRyaWlzaW4ga8Okw6RudGVpc21hdHJpaXNpbi4NCk1NVUxUCQkJPSBNS0VSUk8JCQkjIwlQYWxhdXR0YWEga2FoZGVuIG1hdHJpaXNpbiB0dWxvbi4NCk1PRAkJCT0gSkFLT0oJCQkJIyMJUGFsYXV0dGFhIGpha29sYXNrdW4gasOkw6RubsO2a3Nlbi4NCk1ST1VORAkJCT0gUFnDllJJU1TDhC5LRVJSCQkJIyMJUGFsYXV0dGFhIGx1dnVuIHB5w7ZyaXN0ZXR0eW7DpCBhbm5ldHVuIGx1dnVuIGtlcnJhbm5haXNlZW4uDQpNVUxUSU5PTUlBTAkJPSBNVUxUSU5PTUkJCQkjIwlQYWxhdXR0YWEgbHVrdWpvdWtvbiBtdWx0aW5vbWluLg0KT0RECQkJPSBQQVJJVE9OCQkJIyMJUHnDtnJpc3TDpMOkIGx1dnVuIHlsw7ZzcMOkaW4gbMOkaGltcMOkw6RuIHBhcml0dG9tYWFuIGtva29uYWlzbHVrdXVuLg0KUEkJCQk9IFBJSQkJCQkjIwlQYWxhdXR0YWEgcGlpbiBhcnZvbi4NClBPV0VSCQkJPSBQT1RFTlNTSQkJCSMjCVBhbGF1dHRhYSBsdXZ1biBrb3JvdGV0dHVuYSBoYWx1dHR1dW4gcG90ZW5zc2lpbi4NClBST0RVQ1QJCQk9IFRVTE8JCQkJIyMJS2VydG9vIGFubmV0dXQgYXJndW1lbnRpdC4NClFVT1RJRU5UCQk9IE9TQU3DhMOEUsOECQkJIyMJUGFsYXV0dGFhIG9zYW3DpMOkcsOkbiBrb2tvbmFpc2x1a3Vvc2FuLg0KUkFESUFOUwkJCT0gUkFESUFBTklUCQkJIyMJTXV1bnRhYSBhc3RlZXQgcmFkaWFhbmVpa3NpLg0KUkFORAkJCT0gU0FUVU5OQUlTTFVLVQkJCSMjCVBhbGF1dHRhYSBzYXR1bm5haXNsdXZ1biB2w6RsaWx0w6QgMOKAkzEuDQpSQU5EQkVUV0VFTgkJPSBTQVRVTk5BSVNMVUtVLlbDhExJTFTDhAkJIyMJUGFsYXV0dGFhIHNhdHVubmFpc2x1dnVuIG3DpMOkcml0ZXR0eWplbiBsdWt1amVuIHbDpGxpbHTDpC4NClJPTUFOCQkJPSBST01BTgkJCQkjIwlNdXVudGFhIGFyYWJpYWxhaXNlbiBudW1lcm9uIHRla3N0aW11b3RvaXNla3NpIHJvb21hbGFpc2Vrc2kgbnVtZXJva3NpLg0KUk9VTkQJCQk9IFBZw5ZSSVNUw4QJCQkjIwlQecO2cmlzdMOkw6QgbHV2dW4gYW5uZXR0dXVuIG3DpMOkcsOkw6RuIGRlc2ltYWFsZWphLg0KUk9VTkRET1dOCQk9IFBZw5ZSSVNUw4QuREVTLkFMQVMJCSMjCVB5w7ZyaXN0w6TDpCBsdXZ1biBhbGFzcMOkaW4gKG5vbGxhYSBrb2h0aSkuDQpST1VORFVQCQkJPSBQWcOWUklTVMOELkRFUy5ZTMOWUwkJIyMJUHnDtnJpc3TDpMOkIGx1dnVuIHlsw7ZzcMOkaW4gKHBvaXNww6RpbiBub2xsYXN0YSkuDQpTRVJJRVNTVU0JCT0gU0FSSkEuU1VNTUEJCQkjIwlQYWxhdXR0YWEga2FhdmFhbiBwZXJ1c3R1dmFuIHBvdGVuc3Npc2FyamFuIGFydm9uLg0KU0lHTgkJCT0gRVRVTUVSS0tJCQkJIyMJUGFsYXV0dGFhIGx1dnVuIGV0dW1lcmtpbi4NClNJTgkJCT0gU0lOCQkJCSMjCVBhbGF1dHRhYSBhbm5ldHVuIGt1bG1hbiBzaW5pbi4NClNJTkgJCQk9IFNJTkgJCQkJIyMJUGFsYXV0dGFhIGx1dnVuIGh5cGVyYm9saXNlbiBzaW5pbi4NClNRUlQJCQk9IE5FTEnDlkpVVVJJCQkJIyMJUGFsYXV0dGFhIHBvc2l0aWl2aXNlbiBuZWxpw7ZqdXVyZW4uDQpTUVJUUEkJCQk9IE5FTEnDlkpVVVJJLlBJSQkJIyMJUGFsYXV0dGFhIHR1bG9uIChsdWt1ICogcGlpKSBuZWxpw7ZqdXVyZW4uDQpTVUJUT1RBTAkJPSBWw4RMSVNVTU1BCQkJIyMJUGFsYXV0dGFhIGx1ZXR0ZWxvbiB0YWkgdGlldG9rYW5uYW4gdsOkbGlzdW1tYW4uDQpTVU0JCQk9IFNVTU1BCQkJCSMjCUxhc2tlZSB5aHRlZW4gYW5uZXR1dCBhcmd1bWVudGl0Lg0KU1VNSUYJCQk9IFNVTU1BLkpPUwkJCSMjCUxhc2tlZSBlaGRvdCB0w6R5dHTDpHZpZW4gc29sdWplbiBzdW1tYW4uDQpTVU1JRlMJCQk9IFNVTU1BLkpPUy5KT1VLS08JCSMjCUxhc2tlZSB5aHRlZW4gc29sdWFsdWVlbiB1c2VpdGEgZWh0b2phIHZhc3RhYXZhdCBzb2x1dC4NClNVTVBST0RVQ1QJCT0gVFVMT0pFTi5TVU1NQQkJCSMjCVBhbGF1dHRhYSBtYXRyaWlzaW4gdG9pc2lhYW4gdmFzdGFhdmllbiBvc2llbiB0dWxvamVuIHN1bW1hbi4NClNVTVNRCQkJPSBORUxJw5ZTVU1NQQkJCSMjCVBhbGF1dHRhYSBhcmd1bWVudHRpZW4gbmVsacO2aWRlbiBzdW1tYW4uDQpTVU1YMk1ZMgkJPSBORUxJw5ZTVU1NSUVOLkVST1RVUwkJIyMJUGFsYXV0dGFhIGthaGRlbiBtYXRyaWlzaW4gdG9pc2lhYW4gdmFzdGFhdmllbiBhcnZvamVuIGxhc2tldHR1amVuIG5lbGnDtnN1bW1pZW4gZXJvdHVrc2VuLg0KU1VNWDJQWTIJCT0gTkVMScOWU1VNTUlFTi5TVU1NQQkJIyMJUGFsYXV0dGFhIGthaGRlbiBtYXRyaWlzaW4gdG9pc2lhYW4gdmFzdGFhdmllbiBhcnZvamVuIG5lbGnDtnN1bW1pZW4gc3VtbWFuLg0KU1VNWE1ZMgkJCT0gRVJPVFVTVEVOLk5FTEnDllNVTU1BCQkjIwlQYWxhdXR0YWEga2FoZGVuIG1hdHJpaXNpbiB0b2lzaWFhbiB2YXN0YWF2aWVuIGFydm9qZW4gZXJvdHVzdGVuIG5lbGnDtnN1bW1hbi4NClRBTgkJCT0gVEFOCQkJCSMjCVBhbGF1dHRhYSBsdXZ1biB0YW5nZW50aW4uDQpUQU5ICQkJPSBUQU5ICQkJCSMjCVBhbGF1dHRhYSBsdXZ1biBoeXBlcmJvbGlzZW4gdGFuZ2VudGluLg0KVFJVTkMJCQk9IEtBVEtBSVNFCQkJIyMJS2F0a2Fpc2VlIGx1dnVuIGtva29uYWlzbHV2dWtzaS4NCg0KDQojIw0KIyMJU3RhdGlzdGljYWwgZnVuY3Rpb25zCQkJCVRpbGFzdG9sbGlzZXQgZnVua3Rpb3QNCiMjDQpBVkVERVYJCQk9IEtFU0tJUE9JS0tFQU1BCQkjIwlQYWxhdXR0YWEgaGFqb250b2plbiBpdHNlaXNhcnZvamVuIGtlc2tpYXJ2b24uDQpBVkVSQUdFCQkJPSBLRVNLSUFSVk8JCQkjIwlQYWxhdXR0YWEgYXJndW1lbnR0aWVuIGtlc2tpYXJ2b24uDQpBVkVSQUdFQQkJPSBLRVNLSUFSVk9BCQkJIyMJUGFsYXV0dGFhIGFyZ3VtZW50dGllbiwgbXVrYWFuIGx1a2llbiBsdWt1amVuLCB0ZWtzdGluIGphIGxvb2dpc3RlbiBhcnZvamVuLCBrZXNraWFydm9uLg0KQVZFUkFHRUlGCQk9IEtFU0tJQVJWTy5KT1MJCQkjIwlQYWxhdXR0YWEgYWx1ZWVuIG5paWRlbiBzb2x1amVuIGtlc2tpYXJ2b24gKGFyaXRtZWV0dGlzZW4ga2Vza2lhcnZvbiksIGpvdGthIHTDpHl0dMOkdsOkdCBhbm5ldHV0IGVoZG90Lg0KQVZFUkFHRUlGUwkJPSBLRVNLSUFSVk8uSk9TLkpPVUtLTwkJIyMJUGFsYXV0dGFhIG5paWRlbiBzb2x1amVuIGtlc2tpYXJ2b24gKGFyaXRtZWV0dGlzZW4ga2Vza2lhcnZvbiksIGpvdGthIHZhc3RhYXZhdCB1c2VpdGEgZWh0b2phLg0KQkVUQURJU1QJCT0gQkVFVEFKQUtBVU1BCQkJIyMJUGFsYXV0dGFhIGt1bXVsYXRpaXZpc2VuIGJlZXRhamFrYXVtYWZ1bmt0aW9uIGFydm9uLg0KQkVUQUlOVgkJCT0gQkVFVEFKQUtBVU1BLkvDhMOETlQJCSMjCVBhbGF1dHRhYSBtw6TDpHJpdGV0eW4gYmVldGFqYWthdW1hbiBrw6TDpG50ZWlzZW4ga3VtdWxhdGlpdmlzZW4gamFrYXVtYWZ1bmt0aW9uIGFydm9uLg0KQklOT01ESVNUCQk9IEJJTk9NSUpBS0FVTUEJCQkjIwlQYWxhdXR0YWEgeWtzaXR0w6Rpc2VuIHRlcm1pbiBiaW5vbWlqYWthdW1hdG9kZW5uw6Rrw7Zpc3l5ZGVuLg0KQ0hJRElTVAkJCT0gQ0hJSkFLQVVNQQkJCSMjCVBhbGF1dHRhYSB5a3Npc3V1bnRhaXNlbiBjaGktbmVsacO2biBqYWthdW1hbiB0b2Rlbm7DpGvDtmlzeXlkZW4uDQpDSElJTlYJCQk9IENISUpBS0FVTUEuS8OEw4ROVAkJIyMJUGFsYXV0dGFhIHlrc2lzdXVudGFpc2VuIGNoaS1uZWxpw7ZuIGpha2F1bWFuIHRvZGVubsOka8O2aXN5eWRlbiBrw6TDpG50ZWlzYXJ2b24uDQpDSElURVNUCQkJPSBDSElURVNUSQkJCSMjCVBhbGF1dHRhYSByaWlwcHVtYXR0b211dXN0ZXN0aW4gdHVsb2tzZW4uDQpDT05GSURFTkNFCQk9IExVT1RUQU1VU1bDhExJCQkJIyMJUGFsYXV0dGFhIGx1b3R0YW11c3bDpGxpbiBwb3B1bGFhdGlvbiBrZXNraWFydm9sbGUuDQpDT1JSRUwJCQk9IEtPUlJFTEFBVElPCQkJIyMJUGFsYXV0dGFhIGthaGRlbiBhcnZvam91a29uIGtvcnJlbGFhdGlva2VydG9pbWVuLg0KQ09VTlQJCQk9IExBU0tFCQkJCSMjCUxhc2tlZSBhcmd1bWVudHRpbHVldHRlbG9zc2Egb2xldmllbiBsdWt1amVuIG3DpMOkcsOkbi4NCkNPVU5UQQkJCT0gTEFTS0UuQQkJCSMjCUxhc2tlZSBhcmd1bWVudHRpbHVldHRlbG9zc2Egb2xldmllbiBhcnZvamVuIG3DpMOkcsOkbi4NCkNPVU5UQkxBTksJCT0gTEFTS0UuVFlISsOEVAkJCSMjCUxhc2tlZSBhbHVlZWxsYSBvbGV2aWVuIHR5aGppZW4gc29sdWplbiBtw6TDpHLDpG4uDQpDT1VOVElGCQkJPSBMQVNLRS5KT1MJCQkjIwlMYXNrZWUgYWx1ZWVsbGEgb2xldmllbiBzZWxsYWlzdGVuIHNvbHVqZW4gbcOkw6Ryw6RuLCBqb2lkZW4gc2lzw6RsdMO2IHZhc3RhYSBhbm5ldHR1amEgZWh0b2phLg0KQ09VTlRJRlMJCT0gTEFTS0UuSk9TLkpPVUtLTwkJIyMJTGFza2VlIGFsdWVlbGxhIG9sZXZpZW4gc2VsbGFpc3RlbiBzb2x1amVuIG3DpMOkcsOkbiwgam9pZGVuIHNpc8OkbHTDtiB2YXN0YWEgdXNlaXRhIGVodG9qYS4NCkNPVkFSCQkJPSBLT1ZBUklBTlNTSQkJCSMjCVBhbGF1dHRhYSBrb3ZhcmlhbnNzaW4sIGpva2Egb24ga2Vza2lhcnZvIGhhdmFpbnRvYWluZWlzdG9uIGt1bmtpbiBwaXN0ZXBhcmluIHBvaWtrZWFtaWVuIHR1bG9pc3RhLg0KQ1JJVEJJTk9NCQk9IEJJTk9NSUpBS0FVTUEuS1JJVAkJIyMJUGFsYXV0dGFhIHBpZW5pbW3DpG4gYXJ2b24sIGpvc3NhIGJpbm9taWpha2F1bWFuIGtlcnR5bcOkZnVua3Rpb24gYXJ2byBvbiBwaWVuZW1waSB0YWkgeWh0w6Qgc3V1cmkga3VpbiB2ZXJ0YWlsdWFydm8uDQpERVZTUQkJCT0gT0lLQUlTVFUuTkVMScOWU1VNTUEJCSMjCVBhbGF1dHRhYSBrZXNraXBvaWtrZWFtaWVuIG5lbGnDtnN1bW1hbi4NCkVYUE9ORElTVAkJPSBFS1NQT05FTlRJQUFMSUpBS0FVTUEJCSMjCVBhbGF1dHRhYSBla3Nwb25lbnRpYWFsaWpha2F1bWFuLg0KRkRJU1QJCQk9IEZKQUtBVU1BCQkJIyMJUGFsYXV0dGFhIEYtdG9kZW5uw6Rrw7Zpc3l5c2pha2F1bWFuLg0KRklOVgkJCT0gRkpBS0FVTUEuS8OEw4ROVAkJIyMJUGFsYXV0dGFhIEYtdG9kZW5uw6Rrw7Zpc3l5c2pha2F1bWFuIGvDpMOkbnRlaXNmdW5rdGlvbi4NCkZJU0hFUgkJCT0gRklTSEVSCQkJIyMJUGFsYXV0dGFhIEZpc2hlci1tdXVubm9rc2VuLg0KRklTSEVSSU5WCQk9IEZJU0hFUi5Lw4TDhE5UCQkJIyMJUGFsYXV0dGFhIGvDpMOkbnRlaXNlbiBGaXNoZXItbXV1bm5va3Nlbi4NCkZPUkVDQVNUCQk9IEVOTlVTVEUJCQkjIwlQYWxhdXR0YWEgbGluZWFhcmlzZW4gdHJlbmRpbiBhcnZvbi4NCkZSRVFVRU5DWQkJPSBUQUFKVVVTCQkJIyMJUGFsYXV0dGFhIGZyZWt2ZW5zc2lqYWthdXR1bWFuIHB5c3R5c3V1bnRhaXNlbmEgbWF0cmlpc2luYS4NCkZURVNUCQkJPSBGVEVTVEkJCQkjIwlQYWxhdXR0YWEgRi10ZXN0aW4gdHVsb2tzZW4uDQpHQU1NQURJU1QJCT0gR0FNTUFKQUtBVU1BCQkJIyMJUGFsYXV0dGFhIGdhbW1hamFrYXVtYW4uDQpHQU1NQUlOVgkJPSBHQU1NQUpBS0FVTUEuS8OEw4ROVAkJIyMJUGFsYXV0dGFhIGvDpMOkbnRlaXNlbiBnYW1tYWpha2F1bWFuIGtlcnR5bcOkZnVua3Rpb24uDQpHQU1NQUxOCQkJPSBHQU1NQUxOCQkJIyMJUGFsYXV0dGFhIGdhbW1hZnVua3Rpb24gbHVvbm5vbGxpc2VuIGxvZ2FyaXRtaW4gRyh4KS4NCkdFT01FQU4JCQk9IEtFU0tJQVJWTy5HRU9NCQkjIwlQYWxhdXR0YWEgZ2VvbWV0cmlzZW4ga2Vza2lhcnZvbi4NCkdST1dUSAkJCT0gS0FTVlUJCQkJIyMJUGFsYXV0dGFhIGVrc3BvbmVudGlhYWxpc2VuIHRyZW5kaW4gYXJ2b24uDQpIQVJNRUFOCQkJPSBLRVNLSUFSVk8uSEFSTQkJIyMJUGFsYXV0dGFhIGhhcm1vbmlzZW4ga2Vza2lhcnZvbi4NCkhZUEdFT01ESVNUCQk9IEhZUEVSR0VPTS5KQUtBVU1BCQkjIwlQYWxhdXR0YWEgaHlwZXJnZW9tZXRyaXNlbiBqYWthdW1hbi4NCklOVEVSQ0VQVAkJPSBMRUlLS0FVU1BJU1RFCQkJIyMJUGFsYXV0dGFhIGxpbmVhYXJpc2VuIHJlZ3Jlc3Npb3N1b3JhbiBsZWlra2F1c3Bpc3RlZW4uDQpLVVJUCQkJPSBLVVJUCQkJCSMjCVBhbGF1dHRhYSB0aWV0b2FsdWVlbiB2aW5vdXMtYXJ2b24gZWxpIGh1aXB1a2t1dWRlbi4NCkxBUkdFCQkJPSBTVVVSSQkJCQkjIwlQYWxhdXR0YWEgdGlldG9qb3Vrb24gazpubmVrc2kgc3V1cmltbWFuIGFydm9uLg0KTElORVNUCQkJPSBMSU5SRUdSCQkJIyMJUGFsYXV0dGFhIGxpbmVhYXJpc2VuIHRyZW5kaW4gcGFyYW1ldHJpdC4NCkxPR0VTVAkJCT0gTE9HUkVHUgkJCSMjCVBhbGF1dHRhYSBla3Nwb25lbnRpYWFsaXNlbiB0cmVuZGluIHBhcmFtZXRyaXQuDQpMT0dJTlYJCQk9IExPR05PUk0uSkFLQVVNQS5Lw4TDhE5UCQkjIwlQYWxhdXR0YWEgbG9nbm9ybWVlcmF0dW4gamFrYXVtYW4ga8Okw6RudGVpc2Z1bmt0aW9uLg0KTE9HTk9STURJU1QJCT0gTE9HTk9STS5KQUtBVU1BCQkjIwlQYWxhdXR0YWEgbG9nbm9ybWFhbGlzZW4gamFrYXVtYW4ga2VydHltw6RmdW5rdGlvbi4NCk1BWAkJCT0gTUFLUwkJCQkjIwlQYWxhdXR0YWEgc3V1cmltbWFuIGFydm9uIGFyZ3VtZW50dGlsdWV0dGVsb3N0YS4NCk1BWEEJCQk9IE1BS1NBCQkJCSMjCVBhbGF1dHRhYSBhcmd1bWVudHRpZW4sIG11a2FhbiBsdWtpZW4gbHVrdWplbiwgdGVrc3RpbiBqYSBsb29naXN0ZW4gYXJ2b2plbiwgc3V1cmltbWFuIGFydm9uLg0KTUVESUFOCQkJPSBNRURJQUFOSQkJCSMjCVBhbGF1dHRhYSBhbm5ldHR1amVuIGx1a3VqZW4gbWVkaWFhbmluLg0KTUlOCQkJPSBNSU4JCQkJIyMJUGFsYXV0dGFhIHBpZW5pbW3DpG4gYXJ2b24gYXJndW1lbnR0aWx1ZXR0ZWxvc3RhLg0KTUlOQQkJCT0gTUlOQQkJCQkjIwlQYWxhdXR0YWEgYXJndW1lbnR0aWVuLCBtdWthYW4gbHVraWVuIGx1a3VqZW4sIHRla3N0aW4gamEgbG9vZ2lzdGVuIGFydm9qZW4sIHBpZW5pbW3DpG4gYXJ2b24uDQpNT0RFCQkJPSBNT09ESQkJCQkjIwlQYWxhdXR0YWEgdGlldG9qb3Vrb3NzYSB1c2VpbW1pbiBlc2lpbnR5dsOkbiBhcnZvbi4NCk5FR0JJTk9NRElTVAkJPSBCSU5PTUlKQUtBVU1BLk5FRwkJIyMJUGFsYXV0dGFhIG5lZ2F0aWl2aXNlbiBiaW5vbWlqYWthdW1hbi4NCk5PUk1ESVNUCQk9IE5PUk0uSkFLQVVNQQkJCSMjCVBhbGF1dHRhYSBub3JtYWFsaWpha2F1bWFuIGtlcnR5bcOkZnVua3Rpb24uDQpOT1JNSU5WCQkJPSBOT1JNLkpBS0FVTUEuS8OEw4ROVAkJIyMJUGFsYXV0dGFhIGvDpMOkbnRlaXNlbiBub3JtYWFsaWpha2F1bWFuIGtlcnR5bcOkZnVua3Rpb24uDQpOT1JNU0RJU1QJCT0gTk9STS5KQUtBVU1BLk5PUk1JVAkJIyMJUGFsYXV0dGFhIG5vcm1pdGV0dW4gbm9ybWFhbGlqYWthdW1hbiBrZXJ0eW3DpGZ1bmt0aW9uLg0KTk9STVNJTlYJCT0gTk9STS5KQUtBVU1BLk5PUk1JVC5Lw4TDhE5UCSMjCVBhbGF1dHRhYSBub3JtaXRldHVuIG5vcm1hYWxpamFrYXVtYW4ga2VydHltw6RmdW5rdGlvbiBrw6TDpG50ZWlzYXJ2b24uDQpQRUFSU09OCQkJPSBQRUFSU09OCQkJIyMJUGFsYXV0dGFhIFBlYXJzb25pbiB0dWxvbW9tZW50dGlrb3JyZWxhYXRpb2tlcnRvaW1lbi4NClBFUkNFTlRJTEUJCT0gUFJPU0VOVFRJUElTVEUJCSMjCVBhbGF1dHRhYSBhbHVlZW4gYXJ2b2plbiBrOm5uZW4gcHJvc2VudHRpcGlzdGVlbi4NClBFUkNFTlRSQU5LCQk9IFBST1NFTlRUSUrDhFJKRVNUWVMJCSMjCVBhbGF1dHRhYSB0aWV0b2pvdWtvbiBhcnZvbiBwcm9zZW50dWFhbGlzZW4gasOkcmplc3R5c2x1dnVuLg0KUEVSTVVUCQkJPSBQRVJNVVRBQVRJTwkJCSMjCVBhbGF1dHRhYSBtYWhkb2xsaXN0ZW4gcGVybXV0YWF0aW9pZGVuIG3DpMOkcsOkbiBhbm5ldHVsbGUgb2JqZWt0aWVuIG3DpMOkcsOkbGxlLg0KUE9JU1NPTgkJCT0gUE9JU1NPTgkJCSMjCVBhbGF1dHRhYSBQb2lzc29uaW4gdG9kZW5uw6Rrw7Zpc3l5c2pha2F1bWFuLg0KUFJPQgkJCT0gVE9ERU5Ow4RLw5ZJU1lZUwkJIyMJUGFsYXV0dGFhIHRvZGVubsOka8O2aXN5eWRlbiBzaWxsZSwgZXR0w6QgYXJ2b3Qgb3ZhdCB0aWV0eWx0w6QgdsOkbGlsdMOkLg0KUVVBUlRJTEUJCT0gTkVMSsOETk5FUwkJCSMjCVBhbGF1dHRhYSB0aWV0b2FsdWVlbiBuZWxqw6RubmVrc2VuLg0KUkFOSwkJCT0gQVJWT04uTVVLQUFOCQkJIyMJUGFsYXV0dGFhIGx1dnVuIHBhaWthbiBsdWt1YXJ2b2x1ZXR0ZWxvc3NhLg0KUlNRCQkJPSBQRUFSU09OLk5FTEnDlgkJCSMjCVBhbGF1dHRhYSBQZWFyc29uaW4gdHVsb21vbWVudHRpa29ycmVsYWF0aW9rZXJ0b2ltZW4gbmVsacO2bi4NClNLRVcJCQk9IEpBS0FVTUFOLlZJTk9VUwkJIyMJUGFsYXV0dGFhIGpha2F1bWFuIHZpbm91ZGVuLg0KU0xPUEUJCQk9IEtVTE1BS0VSUk9JTgkJCSMjCVBhbGF1dHRhYSBsaW5lYWFyaXNlbiByZWdyZXNzaW9zdW9yYW4ga3VsbWFrZXJ0b2ltZW4uDQpTTUFMTAkJCT0gUElFTkkJCQkJIyMJUGFsYXV0dGFhIHRpZXRvam91a29uIGs6bm5la3NpIHBpZW5pbW3DpG4gYXJ2b24uDQpTVEFOREFSRElaRQkJPSBOT1JNSVRBCQkJIyMJUGFsYXV0dGFhIG5vcm1pdGV0dW4gYXJ2b24uDQpTVERFVgkJCT0gS0VTS0lIQUpPTlRBCQkJIyMJTGFza2VlIHBvcHVsYWF0aW9uIGtlc2tpaGFqb25uYW4gb3Rva3NlbiBwZXJ1c3RlZWxsYS4NClNUREVWQQkJCT0gS0VTS0lIQUpPTlRBQQkJCSMjCUxhc2tlZSBwb3B1bGFhdGlvbiBrZXNraWhham9ubmFuIG90b2tzZW4gcGVydXN0ZWVsbGEsIG11a2FhbiBsdWtpZW4gbHV2dXQsIHRla3N0aW4gamEgbG9vZ2lzZXQgYXJ2b3QuDQpTVERFVlAJCQk9IEtFU0tJSEFKT05UQVAJCQkjIwlMYXNrZWUgbm9ybWFhbGlqYWthdXR1bWFuIGtva28gcG9wdWxhYXRpb24gcGVydXN0ZWVsbGEuDQpTVERFVlBBCQkJPSBLRVNLSUhBSk9OVEFQQQkJIyMJTGFza2VlIHBvcHVsYWF0aW9uIGtlc2tpaGFqb25uYW4ga29rbyBwb3B1bGFhdGlvbiBwZXJ1c3RlZWxsYSwgbXVrYWFuIGx1a2llbiBsdXZ1dCwgdGVrc3RpbiBqYSB0b3R1dXNhcnZvdC4NClNURVlYCQkJPSBLRVNLSVZJUkhFCQkJIyMJUGFsYXV0dGFhIHJlZ3Jlc3Npb24ga3V0YWtpbiB4LWFydm9hIHZhc3RhYXZhbiBlbm51c3RldHVuIHktYXJ2b24ga2Vza2l2aXJoZWVuLg0KVERJU1QJCQk9IFRKQUtBVU1BCQkJIyMJUGFsYXV0dGFhIHQtamFrYXV0dW1hbi4NClRJTlYJCQk9IFRKQUtBVU1BLkvDhMOETlQJCSMjCVBhbGF1dHRhYSBrw6TDpG50ZWlzZW4gdC1qYWthdW1hbi4NClRSRU5ECQkJPSBTVVVOVEFVUwkJCSMjCVBhbGF1dHRhYSBsaW5lYWFyaXNlbiB0cmVuZGluIGFydm9qYS4NClRSSU1NRUFOCQk9IEtFU0tJQVJWTy5UQVNBVFRVCQkjIwlQYWxhdXR0YWEgdGlldG9qb3Vrb24gdGFzYXR1biBrZXNraWFydm9uLg0KVFRFU1QJCQk9IFRURVNUSQkJCSMjCVBhbGF1dHRhYSB0LXRlc3RpaW4gbGlpdHR5dsOkbiB0b2Rlbm7DpGvDtmlzeXlkZW4uDQpWQVIJCQk9IFZBUgkJCQkjIwlBcnZpb2kgcG9wdWxhYXRpb24gdmFyaWFuc3NpYSBvdG9rc2VuIHBlcnVzdGVlbGxhLg0KVkFSQQkJCT0gVkFSQQkJCQkjIwlMYXNrZWUgcG9wdWxhYXRpb24gdmFyaWFuc3NpbiBvdG9rc2VuIHBlcnVzdGVlbGxhLCBtdWthYW4gbHVraWVuIGx1dnV0LCB0ZWtzdGluIGphIGxvb2dpc2V0IGFydm90Lg0KVkFSUAkJCT0gVkFSUAkJCQkjIwlMYXNrZWUgdmFyaWFuc3NpbiBrb2tvIHBvcHVsYWF0aW9uIHBlcnVzdGVlbGxhLg0KVkFSUEEJCQk9IFZBUlBBCQkJCSMjCUxhc2tlZSBwb3B1bGFhdGlvbiB2YXJpYW5zc2luIGtva28gcG9wdWxhYXRpb24gcGVydXN0ZWVsbGEsIG11a2FhbiBsdWtpZW4gbHV2dXQsIHRla3N0aW4gamEgdG90dXVzYXJ2b3QuDQpXRUlCVUxMCQkJPSBXRUlCVUxMCQkJIyMJUGFsYXV0dGFhIFdlaWJ1bGxpbiBqYWthdW1hbi4NClpURVNUCQkJPSBaVEVTVEkJCQkjIwlQYWxhdXR0YWEgei10ZXN0aW4geWtzaXN1dW50YWlzZW4gdG9kZW5uw6Rrw7Zpc3l5c2Fydm9uLg0KDQoNCiMjDQojIwlUZXh0IGZ1bmN0aW9ucwkJCQkJVGVrc3RpZnVua3Rpb3QNCiMjDQpBU0MJCQk9IEFTQwkJCQkjIwlNdXVudGFhIG1lcmtraWpvbm9zc2Egb2xldmF0IGVuZ2xhbm5pbmtpZWxpc2V0IERCQ1MtIHRhaSBrYXRha2FuYS1tZXJraXQgU0JDUy1tZXJrZWlrc2kuDQpCQUhUVEVYVAkJPSBCQUhUVEVLU1RJCQkJIyMJTXV1bnRhYSBsdXZ1biB0ZWtzdGlrc2kgw58gKGJhaHQpIC12YWx1dXR0YW11b3RvYSBrw6R5dHTDpG3DpGxsw6QuDQpDSEFSCQkJPSBNRVJLS0kJCQkjIwlQYWxhdXR0YWEga29vZGluIGx1a3VhIHZhc3RhYXZhbiBtZXJraW4uDQpDTEVBTgkJCT0gU0lJVk9BCQkJIyMJUG9pc3RhYSB0ZWtzdGlzdMOkIGthaWtraSB0dWxvc3R1bWF0dG9tYXQgbWVya2l0Lg0KQ09ERQkJCT0gS09PREkJCQkJIyMJUGFsYXV0dGFhIHRla3N0aW1lcmtraWpvbm9uIGVuc2ltbcOkaXNlbiBtZXJraW4gbnVtZXJva29vZGluLg0KQ09OQ0FURU5BVEUJCT0gS0VUSlVUQQkJCSMjCVloZGlzdMOkw6QgdXNlYXQgbWVya2tpam9ub3QgeWhkZWtzaSBtZXJra2lqb25va3NpLg0KRE9MTEFSCQkJPSBWQUxVVVRUQQkJCSMjCU11dW50YWEgbHV2dW4gdGVrc3Rpa3NpICQgKGRvbGxhcmkpIC12YWx1dXR0YW11b3RvYSBrw6R5dHTDpG3DpGxsw6QuDQpFWEFDVAkJCT0gVkVSVEFBCQkJIyMJVGFya2lzdGFhLCBvdmF0a28ga2Frc2kgdGVrc3RpYXJ2b2Egc2FtYW5sYWlzZXQuDQpGSU5ECQkJPSBFVFNJCQkJCSMjCUV0c2lpIHRla3N0aWFydm9uIHRvaXNlbiB0ZWtzdGluIHNpc8OkbHTDpCAodHVubmlzdGFhIGlzb3QgamEgcGllbmV0IGtpcmphaW1ldCkuDQpGSU5EQgkJCT0gRVRTSUIJCQkJIyMJRXRzaWkgdGVrc3RpYXJ2b24gdG9pc2VuIHRla3N0aW4gc2lzw6RsdMOkICh0dW5uaXN0YWEgaXNvdCBqYSBwaWVuZXQga2lyamFpbWV0KS4NCkZJWEVECQkJPSBLSUlOVEXDhAkJCSMjCU11b3RvaWxlZSBsdXZ1biB0ZWtzdGlrc2ksIGpvc3NhIG9uIGtpaW50ZcOkIG3DpMOkcsOkIGRlc2ltYWFsZWphLg0KSklTCQkJPSBKSVMJCQkJIyMJTXV1bnRhYSBtZXJra2lqb25vc3NhIG9sZXZhdCBlbmdsYW5uaW5raWVsaXNldCBTQkNTLSB0YWkga2F0YWthbmEtbWVya2l0IERCQ1MtbWVya2Vpa3NpLg0KTEVGVAkJCT0gVkFTRU4JCQkJIyMJUGFsYXV0dGFhIHRla3N0aWFydm9uIHZhc2VtbWFucHVvbGlzZXQgbWVya2l0Lg0KTEVGVEIJCQk9IFZBU0VOQgkJCSMjCVBhbGF1dHRhYSB0ZWtzdGlhcnZvbiB2YXNlbW1hbnB1b2xpc2V0IG1lcmtpdC4NCkxFTgkJCT0gUElUVVVTCQkJIyMJUGFsYXV0dGFhIHRla3N0aW1lcmtraWpvbm9uIG1lcmtraWVuIG3DpMOkcsOkbi4NCkxFTkIJCQk9IFBJVFVVU0IJCQkjIwlQYWxhdXR0YWEgdGVrc3RpbWVya2tpam9ub24gbWVya2tpZW4gbcOkw6Ryw6RuLg0KTE9XRVIJCQk9IFBJRU5FVAkJCSMjCU11dW50YWEgdGVrc3RpbiBwaWVuaWtzaSBraXJqYWltaWtzaS4NCk1JRAkJCT0gUE9JTUkuVEVLU1RJCQkJIyMJUGFsYXV0dGFhIG3DpMOkcml0ZXR5biBtw6TDpHLDpG4gbWVya2tlasOkIG1lcmtraWpvbm9zdGEgYWxrYWVuIGFubmV0dXN0YSBrb2hkYXN0YS4NCk1JREIJCQk9IFBPSU1JLlRFS1NUSUIJCQkjIwlQYWxhdXR0YWEgbcOkw6RyaXRldHluIG3DpMOkcsOkbiBtZXJra2Vqw6QgbWVya2tpam9ub3N0YSBhbGthZW4gYW5uZXR1c3RhIGtvaGRhc3RhLg0KUEhPTkVUSUMJCT0gRk9ORUVUVElORU4JCQkjIwlIYWtlZSBmb25lZXR0aXNldCAoZnVyaWdhbmEpIG1lcmtpdCBtZXJra2lqb25vc3RhLg0KUFJPUEVSCQkJPSBFUklTTklNSQkJCSMjCU11dXR0YWEgbWVya2tpam9ub24ga3Vua2luIHNhbmFuIGVuc2ltbcOkaXNlbiBraXJqYWltZW4gaXNva3NpLg0KUkVQTEFDRQkJCT0gS09SVkFBCQkJIyMJS29ydmFhIHRla3N0aXNzw6Qgb2xldmF0IG1lcmtpdC4NClJFUExBQ0VCCQk9IEtPUlZBQUIJCQkjIwlLb3J2YWEgdGVrc3Rpc3PDpCBvbGV2YXQgbWVya2l0Lg0KUkVQVAkJCT0gVE9JU1RBCQkJIyMJVG9pc3RhYSB0ZWtzdGluIGFubmV0dW4gbcOkw6Ryw6RuIGtlcnRvamEuDQpSSUdIVAkJCT0gT0lLRUEJCQkJIyMJUGFsYXV0dGFhIHRla3N0aWFydm9uIG9pa2VhbnB1b2xpc2V0IG1lcmtpdC4NClJJR0hUQgkJCT0gT0lLRUFCCQkJIyMJUGFsYXV0dGFhIHRla3N0aWFydm9uIG9pa2VhbnB1b2xpc2V0IG1lcmtpdC4NClNFQVJDSAkJCT0gS8OEWS5Mw4RQSQkJCSMjCUV0c2lpIHRla3N0aWFydm9uIHRvaXNlbiB0ZWtzdGluIHNpc8OkbHTDpCAoaXNvdCBqYSBwaWVuZXQga2lyamFpbWV0IHR1bGtpdGFhbiBzYW1vaWtzaSBtZXJrZWlrc2kpLg0KU0VBUkNIQgkJCT0gS8OEWS5Mw4RQSUIJCQkjIwlFdHNpaSB0ZWtzdGlhcnZvbiB0b2lzZW4gdGVrc3RpbiBzaXPDpGx0w6QgKGlzb3QgamEgcGllbmV0IGtpcmphaW1ldCB0dWxraXRhYW4gc2Ftb2lrc2kgbWVya2Vpa3NpKS4NClNVQlNUSVRVVEUJCT0gVkFJSERBCQkJIyMJS29ydmFhIG1lcmtraWpvbm9zc2Egb2xldmFuIHRla3N0aW4gdG9pc2VsbGEuDQpUCQkJPSBUCQkJCSMjCU11dW50YWEgYXJndW1lbnRpdCB0ZWtzdGlrc2kuDQpURVhUCQkJPSBURUtTVEkJCQkjIwlNdW90b2lsZWUgbHV2dW4gamEgbXV1bnRhYSBzZW4gdGVrc3Rpa3NpLg0KVFJJTQkJCT0gUE9JU1RBLlbDhExJVAkJCSMjCVBvaXN0YWEgdsOkbGlsecO2bm5pdCB0ZWtzdGlzdMOkLg0KVVBQRVIJCQk9IElTT1QJCQkJIyMJTXV1bnRhYSB0ZWtzdGluIGlzb2lrc2kga2lyamFpbWlrc2kuDQpWQUxVRQkJCT0gQVJWTwkJCQkjIwlNdXVudGFhIHRla3N0aWFyZ3VtZW50aW4gbHV2dWtzaS4NCg==]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/locale/fr/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/locale/fr/config</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[77u/IyMNCiMjIFBIUEV4Y2VsDQojIw0NCiMjIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTEgUEhQRXhjZWwNCiMjDQojIyBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yDQojIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljDQojIyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXINCiMjIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLg0KIyMNCiMjIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLA0KIyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YNCiMjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VDQojIyBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLg0KIyMNCiMjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMNCiMjIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUNCiMjIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQ0KIyMNCiMjIEBjYXRlZ29yeSAgIFBIUEV4Y2VsDQojIyBAcGFja2FnZSAgICBQSFBFeGNlbF9TZXR0aW5ncw0KIyMgQGNvcHlyaWdodCAgQ29weXJpZ2h0IChjKSAyMDA2IC0gMjAxMSBQSFBFeGNlbCAoaHR0cDovL3d3dy5jb2RlcGxleC5jb20vUEhQRXhjZWwpDQojIyBAbGljZW5zZSAgICBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvb2xkLWxpY2Vuc2VzL2xncGwtMi4xLnR4dAlMR1BMDQojIyBAdmVyc2lvbiAgICAxLjcuNywgMjAxMi0wNS0xOQ0KIyMNCiMjDQoNCg0KQXJndW1lbnRTZXBhcmF0b3IJPSA7DQoNCg0KIyMNCiMjCShGb3IgZnV0dXJlIHVzZSkNCiMjDQpjdXJyZW5jeVN5bWJvbAk9IOKCrA0KDQoNCiMjDQojIwlFeGNlbCBFcnJvciBDb2RlcwkoRm9yIGZ1dHVyZSB1c2UpDQ0KIyMNCk5VTEwJPSAjTlVMIQ0KRElWMAk9ICNESVYvMCENClZBTFVFCT0gI1ZBTEVVUiENClJFRgk9ICNSRUYhDQpOQU1FCT0gI05PTT8NCk5VTQk9ICNOT01CUkUhDQpOQQk9ICNOL0ENCg==]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/locale/fr/functions</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[77u/IyMNCiMjIFBIUEV4Y2VsDQojIw0NCiMjIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTEgUEhQRXhjZWwNCiMjDQojIyBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yDQojIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljDQojIyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXINCiMjIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLg0KIyMNCiMjIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLA0KIyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YNCiMjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VDQojIyBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLg0KIyMNCiMjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMNCiMjIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUNCiMjIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQ0KIyMNCiMjIEBjYXRlZ29yeSAgIFBIUEV4Y2VsDQojIyBAcGFja2FnZSAgICBQSFBFeGNlbF9DYWxjdWxhdGlvbg0KIyMgQGNvcHlyaWdodCAgQ29weXJpZ2h0IChjKSAyMDA2IC0gMjAxMSBQSFBFeGNlbCAoaHR0cDovL3d3dy5jb2RlcGxleC5jb20vUEhQRXhjZWwpDQojIyBAbGljZW5zZSAgICBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvb2xkLWxpY2Vuc2VzL2xncGwtMi4xLnR4dAlMR1BMDQojIyBAdmVyc2lvbiAgICAxLjcuNywgMjAxMi0wNS0xOQ0KIyMNCiMjIERhdGEgaW4gdGhpcyBmaWxlIGRlcml2ZWQgZnJvbSBodHRwOi8vd3d3LnBpdWhhLmZpL2V4Y2VsLWZ1bmN0aW9uLW5hbWUtdHJhbnNsYXRpb24vDQojIw0KIyMNCg0KDQojIw0KIyMJQWRkLWluIGFuZCBBdXRvbWF0aW9uIGZ1bmN0aW9ucwkJCUZvbmN0aW9ucyBkZSBjb21wbMOpbWVudCBldCBk4oCZYXV0b21hdGlzYXRpb24NCiMjDQpHRVRQSVZPVERBVEEJCT0gTElSRURPTk5FRVNUQUJDUk9JU0RZTkFNSVFVRQkjIwlSZW52b2llIGxlcyBkb25uw6llcyBzdG9ja8OpZXMgZGFucyB1biByYXBwb3J0IGRlIHRhYmxlYXUgY3JvaXPDqSBkeW5hbWlxdWUuDQoNCg0KIyMNCiMjCUN1YmUgZnVuY3Rpb25zCQkJCQlGb25jdGlvbnMgQ3ViZQ0KIyMNCkNVQkVLUElNRU1CRVIJCT0gTUVNQlJFS1BJQ1VCRQkJCSMjCVJlbnZvaWUgdW4gbm9tLCB1bmUgcHJvcHJpw6l0w6kgZXQgdW5lIG1lc3VyZSBk4oCZaW5kaWNhdGV1ciBkZSBwZXJmb3JtYW5jZSBjbMOpIGV0IGFmZmljaGUgbGUgbm9tIGV0IGxhIHByb3ByacOpdMOpIGRhbnMgbGEgY2VsbHVsZS4gVW4gaW5kaWNhdGV1ciBkZSBwZXJmb3JtYW5jZSBjbMOpIGVzdCB1bmUgbWVzdXJlIHF1YW50aWZpYWJsZSwgdGVsbGUgcXVlIGxhIG1hcmdlIGLDqW7DqWZpY2lhaXJlIGJydXRlIG1lbnN1ZWxsZSBvdSBsYSByb3RhdGlvbiB0cmltZXN0cmllbGxlIGR1IHBlcnNvbm5lbCwgdXRpbGlzw6llIHBvdXIgw6l2YWx1ZXIgbGVzIHBlcmZvcm1hbmNlcyBk4oCZdW5lIGVudHJlcHJpc2UuDQpDVUJFTUVNQkVSCQk9IE1FTUJSRUNVQkUJCQkjIwlSZW52b2llIHVuIG1lbWJyZSBvdSB1biB1cGxldCBkYW5zIHVuZSBoacOpcmFyY2hpZSBkZSBjdWJlcy4gVXRpbGlzZXogY2V0dGUgZm9uY3Rpb24gcG91ciB2YWxpZGVyIGzigJlleGlzdGVuY2UgZHUgbWVtYnJlIG91IGRlIGzigJl1cGxldCBkYW5zIGxlIGN1YmUuDQpDVUJFTUVNQkVSUFJPUEVSVFkJPSBQUk9QUklFVEVNRU1CUkVDVUJFCQkjIwlSZW52b2llIGxhIHZhbGV1ciBk4oCZdW5lIHByb3ByacOpdMOpIGRlIG1lbWJyZSBkdSBjdWJlLiBVdGlsaXNleiBjZXR0ZSBmb25jdGlvbiBwb3VyIHZhbGlkZXIgbOKAmWV4aXN0ZW5jZSBk4oCZdW4gbm9tIGRlIG1lbWJyZSBkYW5zIGxlIGN1YmUgZXQgcG91ciByZW52b3llciBsYSBwcm9wcmnDqXTDqSBzcMOpY2lmacOpZSBwb3VyIGNlIG1lbWJyZS4NCkNVQkVSQU5LRURNRU1CRVIJPSBSQU5HTUVNQlJFQ1VCRQkJIyMJUmVudm9pZSBsZSBuacOobWUgbWVtYnJlIG91IGxlIG1lbWJyZSBwbGFjw6kgw6AgdW4gY2VydGFpbiByYW5nIGRhbnMgdW4gZW5zZW1ibGUuIFV0aWxpc2V6IGNldHRlIGZvbmN0aW9uIHBvdXIgcmVudm95ZXIgdW4gb3UgcGx1c2lldXJzIMOpbMOpbWVudHMgZOKAmXVuIGVuc2VtYmxlLCB0ZWxzIHF1ZSBsZXMgbWVpbGxldXJzIHZlbmRldXJzIG91IGxlcyAxMCBtZWlsbGV1cnMgw6l0dWRpYW50cy4NCkNVQkVTRVQJCQk9IEpFVUNVQkUJCQkjIwlEw6lmaW5pdCB1biBlbnNlbWJsZSBjYWxjdWzDqSBkZSBtZW1icmVzIG91IGTigJl1cGxldHMgZW4gZW52b3lhbnQgdW5lIGV4cHJlc3Npb24gZMOpZmluaWUgYXUgY3ViZSBzdXIgbGUgc2VydmV1ciBxdWkgY3LDqWUgbOKAmWVuc2VtYmxlIGV0IGxlIHJlbnZvaWUgw6AgTWljcm9zb2Z0IE9mZmljZSBFeGNlbC4NCkNVQkVTRVRDT1VOVAkJPSBOQkpFVUNVQkUJCQkjIwlSZW52b2llIGxlIG5vbWJyZSBk4oCZw6lsw6ltZW50cyBkYW5zIHVuIGpldS4NCkNVQkVWQUxVRQkJPSBWQUxFVVJDVUJFCQkJIyMJUmVudm9pZSB1bmUgdmFsZXVyIGTigJlhZ3LDqWdhdGlvbiBpc3N1ZSBk4oCZdW4gY3ViZS4NCg0KDQojIw0KIyMJRGF0YWJhc2UgZnVuY3Rpb25zCQkJCUZvbmN0aW9ucyBkZSBiYXNlIGRlIGRvbm7DqWVzDQojIw0KREFWRVJBR0UJCT0gQkRNT1lFTk5FCQkJIyMJUmVudm9pZSBsYSBtb3llbm5lIGRlcyBlbnRyw6llcyBkZSBiYXNlIGRlIGRvbm7DqWVzIHPDqWxlY3Rpb25uw6llcy4NCkRDT1VOVAkJCT0gQkNPTVBURQkJCSMjCUNvbXB0ZSBsZSBub21icmUgZGUgY2VsbHVsZXMgZOKAmXVuZSBiYXNlIGRlIGRvbm7DqWVzIHF1aSBjb250aWVubmVudCBkZXMgbm9tYnJlcy4NCkRDT1VOVEEJCQk9IEJETkJWQUwJCQkjIwlDb21wdGUgbGVzIGNlbGx1bGVzIG5vbiB2aWRlcyBk4oCZdW5lIGJhc2UgZGUgZG9ubsOpZXMuDQpER0VUCQkJPSBCRExJUkUJCQkjIwlFeHRyYWl0IGTigJl1bmUgYmFzZSBkZSBkb25uw6llcyB1biBlbnJlZ2lzdHJlbWVudCB1bmlxdWUgcsOpcG9uZGFudCBhdXggY3JpdMOocmVzIHNww6ljaWZpw6lzLg0KRE1BWAkJCT0gQkRNQVgJCQkJIyMJUmVudm9pZSBsYSB2YWxldXIgbWF4aW1hbGUgZGVzIGVudHLDqWVzIGRlIGJhc2UgZGUgZG9ubsOpZXMgc8OpbGVjdGlvbm7DqWVzLg0KRE1JTgkJCT0gQkRNSU4JCQkJIyMJUmVudm9pZSBsYSB2YWxldXIgbWluaW1hbGUgZGVzIGVudHLDqWVzIGRlIGJhc2UgZGUgZG9ubsOpZXMgc8OpbGVjdGlvbm7DqWVzLg0KRFBST0RVQ1QJCT0gQkRQUk9EVUlUCQkJIyMJTXVsdGlwbGllIGxlcyB2YWxldXJzIGTigJl1biBjaGFtcCBwYXJ0aWN1bGllciBkZXMgZW5yZWdpc3RyZW1lbnRzIGTigJl1bmUgYmFzZSBkZSBkb25uw6llcywgcXVpIHLDqXBvbmRlbnQgYXV4IGNyaXTDqHJlcyBzcMOpY2lmacOpcy4NCkRTVERFVgkJCT0gQkRFQ0FSVFlQRQkJCSMjCUNhbGN1bGUgbOKAmcOpY2FydCB0eXBlIHBvdXIgdW4gw6ljaGFudGlsbG9uIGTigJllbnRyw6llcyBkZSBiYXNlIGRlIGRvbm7DqWVzIHPDqWxlY3Rpb25uw6llcy4NCkRTVERFVlAJCQk9IEJERUNBUlRZUEVQCQkJIyMJQ2FsY3VsZSBs4oCZw6ljYXJ0IHR5cGUgcG91ciBs4oCZZW5zZW1ibGUgZOKAmXVuZSBwb3B1bGF0aW9uIGTigJllbnRyw6llcyBkZSBiYXNlIGRlIGRvbm7DqWVzIHPDqWxlY3Rpb25uw6llcy4NCkRTVU0JCQk9IEJEU09NTUUJCQkjIwlBam91dGUgbGVzIG5vbWJyZXMgZGFucyBsYSBjb2xvbm5lIGRlIGNoYW1wIGRlcyBlbnJlZ2lzdHJlbWVudHMgZGUgbGEgYmFzZSBkZSBkb25uw6llcywgcXVpIHLDqXBvbmRlbnQgYXV4IGNyaXTDqHJlcy4NCkRWQVIJCQk9IEJEVkFSCQkJCSMjCUNhbGN1bGUgbGEgdmFyaWFuY2UgcG91ciB1biDDqWNoYW50aWxsb24gZOKAmWVudHLDqWVzIGRlIGJhc2UgZGUgZG9ubsOpZXMgc8OpbGVjdGlvbm7DqWVzLg0KRFZBUlAJCQk9IEJEVkFSUAkJCSMjCUNhbGN1bGUgbGEgdmFyaWFuY2UgcG91ciBs4oCZZW5zZW1ibGUgZOKAmXVuZSBwb3B1bGF0aW9uIGTigJllbnRyw6llcyBkZSBiYXNlIGRlIGRvbm7DqWVzIHPDqWxlY3Rpb25uw6llcy4NCg0KDQojIw0KIyMJRGF0ZSBhbmQgdGltZSBmdW5jdGlvbnMJCQkJRm9uY3Rpb25zIGRlIGRhdGUgZXQgZOKAmWhldXJlDQojIw0KREFURQkJCT0gREFURQkJCQkjIwlSZW52b2llIGxlIG51bcOpcm8gZGUgc8OpcmllIGTigJl1bmUgZGF0ZSBwcsOpY2lzZS4NCkRBVEVWQUxVRQkJPSBEQVRFVkFMCQkJIyMJQ29udmVydGl0IHVuZSBkYXRlIHJlcHLDqXNlbnTDqWUgc291cyBmb3JtZSBkZSB0ZXh0ZSBlbiBudW3DqXJvIGRlIHPDqXJpZS4NCkRBWQkJCT0gSk9VUgkJCQkjIwlDb252ZXJ0aXQgdW4gbnVtw6lybyBkZSBzw6lyaWUgZW4gam91ciBkdSBtb2lzLg0KREFZUzM2MAkJCT0gSk9VUlMzNjAJCQkjIwlDYWxjdWxlIGxlIG5vbWJyZSBkZSBqb3VycyBxdWkgc8OpcGFyZW50IGRldXggZGF0ZXMgc3VyIGxhIGJhc2UgZOKAmXVuZSBhbm7DqWUgZGUgMzYwIGpvdXJzLg0KRURBVEUJCQk9IE1PSVMuREVDQUxFUgkJCSMjCVJlbnZvaWUgbGUgbnVtw6lybyBzw6lxdWVudGllbCBkZSBsYSBkYXRlIHF1aSByZXByw6lzZW50ZSB1bmUgZGF0ZSBzcMOpY2lmacOpZSAobOKAmWFyZ3VtZW50IGRhdGVfZMOpcGFydCksIGNvcnJpZ8OpZSBlbiBwbHVzIG91IGVuIG1vaW5zIGR1IG5vbWJyZSBkZSBtb2lzIGluZGlxdcOpLg0KRU9NT05USAkJCT0gRklOLk1PSVMJCQkjIwlSZW52b2llIGxlIG51bcOpcm8gc8OpcXVlbnRpZWwgZGUgbGEgZGF0ZSBkdSBkZXJuaWVyIGpvdXIgZHUgbW9pcyBwcsOpY8OpZGFudCBvdSBzdWl2YW50IGxhIGRhdGVfZMOpcGFydCBkdSBub21icmUgZGUgbW9pcyBpbmRpcXXDqS4NCkhPVVIJCQk9IEhFVVJFCQkJCSMjCUNvbnZlcnRpdCB1biBudW3DqXJvIGRlIHPDqXJpZSBlbiBoZXVyZS4NCk1JTlVURQkJCT0gTUlOVVRFCQkJIyMJQ29udmVydGl0IHVuIG51bcOpcm8gZGUgc8OpcmllIGVuIG1pbnV0ZS4NCk1PTlRICQkJPSBNT0lTCQkJCSMjCUNvbnZlcnRpdCB1biBudW3DqXJvIGRlIHPDqXJpZSBlbiBtb2lzLg0KTkVUV09SS0RBWVMJCT0gTkIuSk9VUlMuT1VWUkVTCQkjIwlSZW52b2llIGxlIG5vbWJyZSBkZSBqb3VycyBvdXZyw6lzIGVudGllcnMgY29tcHJpcyBlbnRyZSBkZXV4IGRhdGVzLg0KTk9XCQkJPSBNQUlOVEVOQU5UCQkJIyMJUmVudm9pZSBsZSBudW3DqXJvIGRlIHPDqXJpZSBkZSBsYSBkYXRlIGV0IGRlIGzigJloZXVyZSBkdSBqb3VyLg0KU0VDT05ECQkJPSBTRUNPTkRFCQkJIyMJQ29udmVydGl0IHVuIG51bcOpcm8gZGUgc8OpcmllIGVuIHNlY29uZGUuDQpUSU1FCQkJPSBURU1QUwkJCQkjIwlSZW52b2llIGxlIG51bcOpcm8gZGUgc8OpcmllIGTigJl1bmUgaGV1cmUgcHLDqWNpc2UuDQpUSU1FVkFMVUUJCT0gVEVNUFNWQUwJCQkjIwlDb252ZXJ0aXQgdW5lIGRhdGUgcmVwcsOpc2VudMOpZSBzb3VzIGZvcm1lIGRlIHRleHRlIGVuIG51bcOpcm8gZGUgc8OpcmllLg0KVE9EQVkJCQk9IEFVSk9VUkRIVUkJCQkjIwlSZW52b2llIGxlIG51bcOpcm8gZGUgc8OpcmllIGRlIGxhIGRhdGUgZHUgam91ci4NCldFRUtEQVkJCQk9IEpPVVJTRU0JCQkjIwlDb252ZXJ0aXQgdW4gbnVtw6lybyBkZSBzw6lyaWUgZW4gam91ciBkZSBsYSBzZW1haW5lLg0KV0VFS05VTQkJCT0gTk8uU0VNQUlORQkJCSMjCUNvbnZlcnRpdCB1biBudW3DqXJvIGRlIHPDqXJpZSBlbiB1biBudW3DqXJvIHJlcHLDqXNlbnRhbnQgbOKAmW9yZHJlIGRlIGxhIHNlbWFpbmUgZGFucyBs4oCZYW5uw6llLg0KV09SS0RBWQkJCT0gU0VSSUUuSk9VUi5PVVZSRQkJIyMJUmVudm9pZSBsZSBudW3DqXJvIGRlIHPDqXJpZSBkZSBsYSBkYXRlIGF2YW50IG91IGFwcsOocyBsZSBub21icmUgZGUgam91cnMgb3V2csOpcyBzcMOpY2lmacOpcy4NCllFQVIJCQk9IEFOTkVFCQkJCSMjCUNvbnZlcnRpdCB1biBudW3DqXJvIGRlIHPDqXJpZSBlbiBhbm7DqWUuDQpZRUFSRlJBQwkJPSBGUkFDVElPTi5BTk5FRQkJIyMJUmVudm9pZSBsYSBmcmFjdGlvbiBkZSBs4oCZYW5uw6llIHJlcHLDqXNlbnRhbnQgbGUgbm9tYnJlIGRlIGpvdXJzIGVudHJlIGxhIGRhdGUgZGUgZMOpYnV0IGV0IGxhIGRhdGUgZGUgZmluLg0KDQoNCiMjDQojIwlFbmdpbmVlcmluZyBmdW5jdGlvbnMJCQkJRm9uY3Rpb25zIGTigJlpbmfDqW5pZXJpZQ0KIyMNCkJFU1NFTEkJCQk9IEJFU1NFTEkJCQkjIwlSZW52b2llIGxhIGZvbmN0aW9uIEJlc3NlbCBtb2RpZmnDqWUgSW4oeCkuDQpCRVNTRUxKCQkJPSBCRVNTRUxKCQkJIyMJUmVudm9pZSBsYSBmb25jdGlvbiBCZXNzZWwgSm4oeCkuDQpCRVNTRUxLCQkJPSBCRVNTRUxLCQkJIyMJUmVudm9pZSBsYSBmb25jdGlvbiBCZXNzZWwgbW9kaWZpw6llIEtuKHgpLg0KQkVTU0VMWQkJCT0gQkVTU0VMWQkJCSMjCVJlbnZvaWUgbGEgZm9uY3Rpb24gQmVzc2VsIFluKHgpLg0KQklOMkRFQwkJCT0gQklOREVDCQkJIyMJQ29udmVydGl0IHVuIG5vbWJyZSBiaW5haXJlIGVuIG5vbWJyZSBkw6ljaW1hbC4NCkJJTjJIRVgJCQk9IEJJTkhFWAkJCSMjCUNvbnZlcnRpdCB1biBub21icmUgYmluYWlyZSBlbiBub21icmUgaGV4YWTDqWNpbWFsLg0KQklOMk9DVAkJCT0gQklOT0NUCQkJIyMJQ29udmVydGl0IHVuIG5vbWJyZSBiaW5haXJlIGVuIG5vbWJyZSBvY3RhbC4NCkNPTVBMRVgJCQk9IENPTVBMRVhFCQkJIyMJQ29udmVydGl0IGRlcyBjb2VmZmljaWVudHMgcsOpZWwgZXQgaW1hZ2luYWlyZSBlbiB1biBub21icmUgY29tcGxleGUuDQpDT05WRVJUCQkJPSBDT05WRVJUCQkJIyMJQ29udmVydGl0IHVuIG5vbWJyZSBk4oCZdW5lIHVuaXTDqSBkZSBtZXN1cmUgw6AgdW5lIGF1dHJlLg0KREVDMkJJTgkJCT0gREVDQklOCQkJIyMJQ29udmVydGl0IHVuIG5vbWJyZSBkw6ljaW1hbCBlbiBub21icmUgYmluYWlyZS4NCkRFQzJIRVgJCQk9IERFQ0hFWAkJCSMjCUNvbnZlcnRpdCB1biBub21icmUgZMOpY2ltYWwgZW4gbm9tYnJlIGhleGFkw6ljaW1hbC4NCkRFQzJPQ1QJCQk9IERFQ09DVAkJCSMjCUNvbnZlcnRpdCB1biBub21icmUgZMOpY2ltYWwgZW4gbm9tYnJlIG9jdGFsLg0KREVMVEEJCQk9IERFTFRBCQkJCSMjCVRlc3RlIGzigJnDqWdhbGl0w6kgZGUgZGV1eCBub21icmVzLg0KRVJGCQkJPSBFUkYJCQkJIyMJUmVudm9pZSBsYSB2YWxldXIgZGUgbGEgZm9uY3Rpb24gZOKAmWVycmV1ci4NCkVSRkMJCQk9IEVSRkMJCQkJIyMJUmVudm9pZSBsYSB2YWxldXIgZGUgbGEgZm9uY3Rpb24gZOKAmWVycmV1ciBjb21wbMOpbWVudGFpcmUuDQpHRVNURVAJCQk9IFNVUC5TRVVJTAkJCSMjCVRlc3RlIHNpIHVuIG5vbWJyZSBlc3Qgc3Vww6lyaWV1ciDDoCB1bmUgdmFsZXVyIGRlIHNldWlsLg0KSEVYMkJJTgkJCT0gSEVYQklOCQkJIyMJQ29udmVydGl0IHVuIG5vbWJyZSBoZXhhZMOpY2ltYWwgZW4gbm9tYnJlIGJpbmFpcmUuDQpIRVgyREVDCQkJPSBIRVhERUMJCQkjIwlDb252ZXJ0aXQgdW4gbm9tYnJlIGhleGFkw6ljaW1hbCBlbiBub21icmUgZMOpY2ltYWwuDQpIRVgyT0NUCQkJPSBIRVhPQ1QJCQkjIwlDb252ZXJ0aXQgdW4gbm9tYnJlIGhleGFkw6ljaW1hbCBlbiBub21icmUgb2N0YWwuDQpJTUFCUwkJCT0gQ09NUExFWEUuTU9EVUxFCQkjIwlSZW52b2llIGxhIHZhbGV1ciBhYnNvbHVlIChtb2R1bGUpIGTigJl1biBub21icmUgY29tcGxleGUuDQpJTUFHSU5BUlkJCT0gQ09NUExFWEUuSU1BR0lOQUlSRQkJIyMJUmVudm9pZSBsZSBjb2VmZmljaWVudCBpbWFnaW5haXJlIGTigJl1biBub21icmUgY29tcGxleGUuDQpJTUFSR1VNRU5UCQk9IENPTVBMRVhFLkFSR1VNRU5UCQkjIwlSZW52b2llIGzigJlhcmd1bWVudCB0aMOqdGEsIHVuIGFuZ2xlIGV4cHJpbcOpIGVuIHJhZGlhbnMuDQpJTUNPTkpVR0FURQkJPSBDT01QTEVYRS5DT05KVUdVRQkJIyMJUmVudm9pZSBsZSBub21icmUgY29tcGxleGUgY29uanVndcOpIGTigJl1biBub21icmUgY29tcGxleGUuDQpJTUNPUwkJCT0gSU1DT1MJCQkJIyMJUmVudm9pZSBsZSBjb3NpbnVzIGTigJl1biBub21icmUgY29tcGxleGUuDQpJTURJVgkJCT0gQ09NUExFWEUuRElWCQkJIyMJUmVudm9pZSBsZSBxdW90aWVudCBkZSBkZXV4IG5vbWJyZXMgY29tcGxleGVzLg0KSU1FWFAJCQk9IENPTVBMRVhFLkVYUAkJCSMjCVJlbnZvaWUgbGEgZm9uY3Rpb24gZXhwb25lbnRpZWxsZSBk4oCZdW4gbm9tYnJlIGNvbXBsZXhlLg0KSU1MTgkJCT0gQ09NUExFWEUuTE4JCQkjIwlSZW52b2llIGxlIGxvZ2FyaXRobWUgbsOpcMOpcmllbiBk4oCZdW4gbm9tYnJlIGNvbXBsZXhlLg0KSU1MT0cxMAkJCT0gQ09NUExFWEUuTE9HMTAJCSMjCUNhbGN1bGUgbGUgbG9nYXJpdGhtZSBlbiBiYXNlIDEwIGTigJl1biBub21icmUgY29tcGxleGUuDQpJTUxPRzIJCQk9IENPTVBMRVhFLkxPRzIJCQkjIwlDYWxjdWxlIGxlIGxvZ2FyaXRobWUgZW4gYmFzZSAyIGTigJl1biBub21icmUgY29tcGxleGUuDQpJTVBPV0VSCQkJPSBDT01QTEVYRS5QVUlTU0FOQ0UJCSMjCVJlbnZvaWUgdW4gbm9tYnJlIGNvbXBsZXhlIMOpbGV2w6kgw6AgdW5lIHB1aXNzYW5jZSBlbnRpw6hyZS4NCklNUFJPRFVDVAkJPSBDT01QTEVYRS5QUk9EVUlUCQkjIwlSZW52b2llIGxlIHByb2R1aXQgZGUgcGx1c2lldXJzIG5vbWJyZXMgY29tcGxleGVzLg0KSU1SRUFMCQkJPSBDT01QTEVYRS5SRUVMCQkJIyMJUmVudm9pZSBsZSBjb2VmZmljaWVudCByw6llbCBk4oCZdW4gbm9tYnJlIGNvbXBsZXhlLg0KSU1TSU4JCQk9IENPTVBMRVhFLlNJTgkJCSMjCVJlbnZvaWUgbGUgc2ludXMgZOKAmXVuIG5vbWJyZSBjb21wbGV4ZS4NCklNU1FSVAkJCT0gQ09NUExFWEUuUkFDSU5FCQkjIwlSZW52b2llIGxhIHJhY2luZSBjYXJyw6llIGTigJl1biBub21icmUgY29tcGxleGUuDQpJTVNVQgkJCT0gQ09NUExFWEUuRElGRkVSRU5DRQkJIyMJUmVudm9pZSBsYSBkaWZmw6lyZW5jZSBlbnRyZSBkZXV4IG5vbWJyZXMgY29tcGxleGVzLg0KSU1TVU0JCQk9IENPTVBMRVhFLlNPTU1FCQkjIwlSZW52b2llIGxhIHNvbW1lIGRlIHBsdXNpZXVycyBub21icmVzIGNvbXBsZXhlcy4NCk9DVDJCSU4JCQk9IE9DVEJJTgkJCSMjCUNvbnZlcnRpdCB1biBub21icmUgb2N0YWwgZW4gbm9tYnJlIGJpbmFpcmUuDQpPQ1QyREVDCQkJPSBPQ1RERUMJCQkjIwlDb252ZXJ0aXQgdW4gbm9tYnJlIG9jdGFsIGVuIG5vbWJyZSBkw6ljaW1hbC4NCk9DVDJIRVgJCQk9IE9DVEhFWAkJCSMjCUNvbnZlcnRpdCB1biBub21icmUgb2N0YWwgZW4gbm9tYnJlIGhleGFkw6ljaW1hbC4NCg0KDQojIw0KIyMJRmluYW5jaWFsIGZ1bmN0aW9ucwkJCQlGb25jdGlvbnMgZmluYW5jacOocmVzDQojIw0KQUNDUklOVAkJCT0gSU5URVJFVC5BQ0MJCQkjIwlSZW52b2llIGzigJlpbnTDqXLDqnQgY291cnUgbm9uIMOpY2h1IGTigJl1biB0aXRyZSBkb250IGzigJlpbnTDqXLDqnQgZXN0IHBlcsOndSBww6lyaW9kaXF1ZW1lbnQuDQpBQ0NSSU5UTQkJPSBJTlRFUkVULkFDQy5NQVQJCSMjCVJlbnZvaWUgbOKAmWludMOpcsOqdCBjb3VydSBub24gw6ljaHUgZOKAmXVuIHRpdHJlIGRvbnQgbOKAmWludMOpcsOqdCBlc3QgcGVyw6d1IMOgIGzigJnDqWNow6lhbmNlLg0KQU1PUkRFR1JDCQk9IEFNT1JERUdSQwkJCSMjCVJlbnZvaWUgbOKAmWFtb3J0aXNzZW1lbnQgY29ycmVzcG9uZGFudCDDoCBjaGFxdWUgcMOpcmlvZGUgY29tcHRhYmxlIGVuIHV0aWxpc2FudCB1biBjb2VmZmljaWVudCBk4oCZYW1vcnRpc3NlbWVudC4NCkFNT1JMSU5DCQk9IEFNT1JMSU5DCQkJIyMJUmVudm9pZSBs4oCZYW1vcnRpc3NlbWVudCBk4oCZdW4gYmllbiDDoCBsYSBmaW4gZOKAmXVuZSBww6lyaW9kZSBmaXNjYWxlIGRvbm7DqWUuDQpDT1VQREFZQlMJCT0gTkIuSk9VUlMuQ09VUE9OLlBSRUMJCSMjCVJlbnZvaWUgbGUgbm9tYnJlIGRlIGpvdXJzIGVudHJlIGxlIGTDqWJ1dCBkZSBsYSBww6lyaW9kZSBkZSBjb3Vwb24gZXQgbGEgZGF0ZSBkZSBsaXF1aWRhdGlvbi4NCkNPVVBEQVlTCQk9IE5CLkpPVVJTLkNPVVBPTlMJCSMjCVJlbnZvaWUgbGUgbm9tYnJlIGRlIGpvdXJzIHBvdXIgbGEgcMOpcmlvZGUgZHUgY291cG9uIGNvbnRlbmFudCBsYSBkYXRlIGRlIGxpcXVpZGF0aW9uLg0KQ09VUERBWVNOQwkJPSBOQi5KT1VSUy5DT1VQT04uU1VJVgkJIyMJUmVudm9pZSBsZSBub21icmUgZGUgam91cnMgZW50cmUgbGEgZGF0ZSBkZSBsaXF1aWRhdGlvbiBldCBsYSBkYXRlIGR1IGNvdXBvbiBzdWl2YW50IGxhIGRhdGUgZGUgbGlxdWlkYXRpb24uDQpDT1VQTkNECQkJPSBEQVRFLkNPVVBPTi5TVUlWCQkjIwlSZW52b2llIGxhIHByZW1pw6hyZSBkYXRlIGRlIGNvdXBvbiB1bHTDqXJpZXVyZSDDoCBsYSBkYXRlIGRlIHLDqGdsZW1lbnQuDQpDT1VQTlVNCQkJPSBOQi5DT1VQT05TCQkJIyMJUmVudm9pZSBsZSBub21icmUgZGUgY291cG9ucyBkdXMgZW50cmUgbGEgZGF0ZSBkZSByw6hnbGVtZW50IGV0IGxhIGRhdGUgZOKAmcOpY2jDqWFuY2UuDQpDT1VQUENECQkJPSBEQVRFLkNPVVBPTi5QUkVDCQkjIwlSZW52b2llIGxhIGRhdGUgZGUgY291cG9uIHByw6ljw6lkYW50IGxhIGRhdGUgZGUgcsOoZ2xlbWVudC4NCkNVTUlQTVQJCQk9IENVTVVMLklOVEVSCQkJIyMJUmVudm9pZSBs4oCZaW50w6lyw6p0IGN1bXVsw6kgcGF5w6kgc3VyIHVuIGVtcHJ1bnQgZW50cmUgZGV1eCBww6lyaW9kZXMuDQpDVU1QUklOQwkJPSBDVU1VTC5QUklOQ1BFUgkJIyMJUmVudm9pZSBsZSBtb250YW50IGN1bXVsw6kgZGVzIHJlbWJvdXJzZW1lbnRzIGR1IGNhcGl0YWwgZOKAmXVuIGVtcHJ1bnQgZWZmZWN0dcOpcyBlbnRyZSBkZXV4IHDDqXJpb2Rlcy4NCkRCCQkJPSBEQgkJCQkjIwlSZW52b2llIGzigJlhbW9ydGlzc2VtZW50IGTigJl1biBiaWVuIHBvdXIgdW5lIHDDqXJpb2RlIHNww6ljaWZpw6llIGVuIHV0aWxpc2FudCBsYSBtw6l0aG9kZSBkZSBs4oCZYW1vcnRpc3NlbWVudCBkw6lncmVzc2lmIMOgIHRhdXggZml4ZS4NCkREQgkJCT0gRERCCQkJCSMjCVJlbnZvaWUgbOKAmWFtb3J0aXNzZW1lbnQgZOKAmXVuIGJpZW4gcG91ciB0b3V0ZSBww6lyaW9kZSBzcMOpY2lmacOpZSwgZW4gdXRpbGlzYW50IGxhIG3DqXRob2RlIGRlIGzigJlhbW9ydGlzc2VtZW50IGTDqWdyZXNzaWYgw6AgdGF1eCBkb3VibGUgb3Ugc2Vsb24gdW4gY29lZmZpY2llbnQgw6Agc3DDqWNpZmllci4NCkRJU0MJCQk9IFRBVVguRVNDT01QVEUJCQkjIwlDYWxjdWxlIGxlIHRhdXggZOKAmWVzY29tcHRlIGTigJl1bmUgdHJhbnNhY3Rpb24uDQpET0xMQVJERQkJPSBQUklYLkRFQwkJCSMjCUNvbnZlcnRpdCB1biBwcml4IGVuIGV1cm9zLCBleHByaW3DqSBzb3VzIGZvcm1lIGRlIGZyYWN0aW9uLCBlbiB1biBwcml4IGVuIGV1cm9zIGV4cHJpbcOpIHNvdXMgZm9ybWUgZGUgbm9tYnJlIGTDqWNpbWFsLg0KRE9MTEFSRlIJCT0gUFJJWC5GUkFDCQkJIyMJQ29udmVydGl0IHVuIHByaXggZW4gZXVyb3MsIGV4cHJpbcOpIHNvdXMgZm9ybWUgZGUgbm9tYnJlIGTDqWNpbWFsLCBlbiB1biBwcml4IGVuIGV1cm9zIGV4cHJpbcOpIHNvdXMgZm9ybWUgZGUgZnJhY3Rpb24uDQpEVVJBVElPTgkJPSBEVVJFRQkJCQkjIwlSZW52b2llIGxhIGR1csOpZSwgZW4gYW5uw6llcywgZOKAmXVuIHRpdHJlIGRvbnQgbOKAmWludMOpcsOqdCBlc3QgcGVyw6d1IHDDqXJpb2RpcXVlbWVudC4NCkVGRkVDVAkJCT0gVEFVWC5FRkZFQ1RJRgkJCSMjCVJlbnZvaWUgbGUgdGF1eCBk4oCZaW50w6lyw6p0IGFubnVlbCBlZmZlY3RpZi4NCkZWCQkJPSBWQwkJCQkjIwlSZW52b2llIGxhIHZhbGV1ciBmdXR1cmUgZOKAmXVuIGludmVzdGlzc2VtZW50Lg0KRlZTQ0hFRFVMRQkJPSBWQy5QQUlFTUVOVFMJCQkjIwlDYWxjdWxlIGxhIHZhbGV1ciBmdXR1cmUgZOKAmXVuIGludmVzdGlzc2VtZW50IGVuIGFwcGxpcXVhbnQgdW5lIHPDqXJpZSBkZSB0YXV4IGTigJlpbnTDqXLDqnQgY29tcG9zaXRlcy4NCklOVFJBVEUJCQk9IFRBVVguSU5URVJFVAkJCSMjCUFmZmljaGUgbGUgdGF1eCBk4oCZaW50w6lyw6p0IGTigJl1biB0aXRyZSB0b3RhbGVtZW50IGludmVzdGkuDQpJUE1UCQkJPSBJTlRQRVIJCQkjIwlDYWxjdWxlIGxlIG1vbnRhbnQgZGVzIGludMOpcsOqdHMgZOKAmXVuIGludmVzdGlzc2VtZW50IHBvdXIgdW5lIHDDqXJpb2RlIGRvbm7DqWUuDQpJUlIJCQk9IFRSSQkJCQkjIwlDYWxjdWxlIGxlIHRhdXggZGUgcmVudGFiaWxpdMOpIGludGVybmUgZOKAmXVuIGludmVzdGlzc2VtZW50IHBvdXIgdW5lIHN1Y2Nlc3Npb24gZGUgdHLDqXNvcmVyaWVzLg0KSVNQTVQJCQk9IElTUE1UCQkJCSMjCUNhbGN1bGUgbGUgbW9udGFudCBkZXMgaW50w6lyw6p0cyBk4oCZdW4gaW52ZXN0aXNzZW1lbnQgcG91ciB1bmUgcMOpcmlvZGUgZG9ubsOpZS4NCk1EVVJBVElPTgkJPSBEVVJFRS5NT0RJRklFRQkJIyMJUmVudm9pZSBsYSBkdXLDqWUgZGUgTWFjYXVsZXkgbW9kaWZpw6llIHBvdXIgdW4gdGl0cmUgYXlhbnQgdW5lIHZhbGV1ciBub21pbmFsZSBoeXBvdGjDqXRpcXVlIGRlIDEwMF9ldXJvcy4NCk1JUlIJCQk9IFRSSU0JCQkJIyMJQ2FsY3VsZSBsZSB0YXV4IGRlIHJlbnRhYmlsaXTDqSBpbnRlcm5lIGxvcnNxdWUgbGVzIHBhaWVtZW50cyBwb3NpdGlmcyBldCBuw6lnYXRpZnMgc29udCBmaW5hbmPDqXMgw6AgZGVzIHRhdXggZGlmZsOpcmVudHMuDQpOT01JTkFMCQkJPSBUQVVYLk5PTUlOQUwJCQkjIwlDYWxjdWxlIGxlIHRhdXggZOKAmWludMOpcsOqdCBub21pbmFsIGFubnVlbC4NCk5QRVIJCQk9IE5QTQkJCQkjIwlSZW52b2llIGxlIG5vbWJyZSBkZSB2ZXJzZW1lbnRzIG7DqWNlc3NhaXJlcyBwb3VyIHJlbWJvdXJzZXIgdW4gZW1wcnVudC4NCk5QVgkJCT0gVkFOCQkJCSMjCUNhbGN1bGUgbGEgdmFsZXVyIGFjdHVlbGxlIG5ldHRlIGTigJl1biBpbnZlc3Rpc3NlbWVudCBiYXPDqSBzdXIgdW5lIHPDqXJpZSBkZSBkw6ljYWlzc2VtZW50cyBldCB1biB0YXV4IGTigJllc2NvbXB0ZS4NCk9EREZQUklDRQkJPSBQUklYLlBDT1VQT04uSVJSRUcJCSMjCVJlbnZvaWUgbGUgcHJpeCBwYXIgdHJhbmNoZSBkZSB2YWxldXIgbm9taW5hbGUgZGUgMTAwIGV1cm9zIGTigJl1biB0aXRyZSBkb250IGxhIHByZW1pw6hyZSBww6lyaW9kZSBkZSBjb3Vwb24gZXN0IGlycsOpZ3VsacOocmUuDQpPRERGWUlFTEQJCT0gUkVORC5QQ09VUE9OLklSUkVHCQkjIwlSZW52b2llIGxlIHRhdXggZGUgcmVuZGVtZW50IGTigJl1biB0aXRyZSBkb250IGxhIHByZW1pw6hyZSBww6lyaW9kZSBkZSBjb3Vwb24gZXN0IGlycsOpZ3VsacOocmUuDQpPRERMUFJJQ0UJCT0gUFJJWC5EQ09VUE9OLklSUkVHCQkjIwlSZW52b2llIGxlIHByaXggcGFyIHRyYW5jaGUgZGUgdmFsZXVyIG5vbWluYWxlIGRlIDEwMCBldXJvcyBk4oCZdW4gdGl0cmUgZG9udCBsYSBwcmVtacOocmUgcMOpcmlvZGUgZGUgY291cG9uIGVzdCBpcnLDqWd1bGnDqHJlLg0KT0RETFlJRUxECQk9IFJFTkQuRENPVVBPTi5JUlJFRwkJIyMJUmVudm9pZSBsZSB0YXV4IGRlIHJlbmRlbWVudCBk4oCZdW4gdGl0cmUgZG9udCBsYSBkZXJuacOocmUgcMOpcmlvZGUgZGUgY291cG9uIGVzdCBpcnLDqWd1bGnDqHJlLg0KUE1UCQkJPSBWUE0JCQkJIyMJQ2FsY3VsZSBsZSBwYWllbWVudCBww6lyaW9kaXF1ZSBk4oCZdW4gaW52ZXN0aXNzZW1lbnQgZG9ubsOpLg0KUFBNVAkJCT0gUFJJTkNQRVIJCQkjIwlDYWxjdWxlLCBwb3VyIHVuZSBww6lyaW9kZSBkb25uw6llLCBsYSBwYXJ0IGRlIHJlbWJvdXJzZW1lbnQgZHUgcHJpbmNpcGFsIGTigJl1biBpbnZlc3Rpc3NlbWVudC4NClBSSUNFCQkJPSBQUklYLlRJVFJFCQkJIyMJUmVudm9pZSBsZSBwcml4IGTigJl1biB0aXRyZSByYXBwb3J0YW50IGRlcyBpbnTDqXLDqnRzIHDDqXJpb2RpcXVlcywgcG91ciB1bmUgdmFsZXVyIG5vbWluYWxlIGRlIDEwMCBldXJvcy4NClBSSUNFRElTQwkJPSBWQUxFVVIuRU5DQUlTU0VNRU5UCQkjIwlSZW52b2llIGxhIHZhbGV1ciBk4oCZZW5jYWlzc2VtZW50IGTigJl1biBlc2NvbXB0ZSBjb21tZXJjaWFsLCBwb3VyIHVuZSB2YWxldXIgbm9taW5hbGUgZGUgMTAwIGV1cm9zLg0KUFJJQ0VNQVQJCT0gUFJJWC5USVRSRS5FQ0hFQU5DRQkJIyMJUmVudm9pZSBsZSBwcml4IGTigJl1biB0aXRyZSBkb250IGxhIHZhbGV1ciBub21pbmFsZSBlc3QgMTAwIGV1cm9zIGV0IHF1aSByYXBwb3J0ZSBkZXMgaW50w6lyw6p0cyDDoCBs4oCZw6ljaMOpYW5jZS4NClBWCQkJPSBQVgkJCQkjIwlDYWxjdWxlIGxhIHZhbGV1ciBhY3R1ZWxsZSBk4oCZdW4gaW52ZXN0aXNzZW1lbnQuDQpSQVRFCQkJPSBUQVVYCQkJCSMjCUNhbGN1bGUgbGUgdGF1eCBk4oCZaW50w6lyw6p0IHBhciBww6lyaW9kZSBwb3VyIHVuZSBhbm51aXTDqS4NClJFQ0VJVkVECQk9IFZBTEVVUi5OT01JTkFMRQkJIyMJUmVudm9pZSBsYSB2YWxldXIgbm9taW5hbGUgw6Agw6ljaMOpYW5jZSBk4oCZdW4gZWZmZXQgZGUgY29tbWVyY2UuDQpTTE4JCQk9IEFNT1JMSU4JCQkjIwlDYWxjdWxlIGzigJlhbW9ydGlzc2VtZW50IGxpbsOpYWlyZSBk4oCZdW4gYmllbiBwb3VyIHVuZSBww6lyaW9kZSBkb25uw6llLg0KU1lECQkJPSBTWUQJCQkJIyMJQ2FsY3VsZSBs4oCZYW1vcnRpc3NlbWVudCBk4oCZdW4gYmllbiBwb3VyIHVuZSBww6lyaW9kZSBkb25uw6llIHN1ciBsYSBiYXNlIGRlIGxhIG3DqXRob2RlIGFtw6lyaWNhaW5lIFN1bS1vZi1ZZWFycyBEaWdpdHMgKGFtb3J0aXNzZW1lbnQgZMOpZ3Jlc3NpZiDDoCB0YXV4IGTDqWNyb2lzc2FudCBhcHBsaXF1w6kgw6AgdW5lIHZhbGV1ciBjb25zdGFudGUpLg0KVEJJTExFUQkJCT0gVEFVWC5FU0NPTVBURS5SCQkjIwlSZW52b2llIGxlIHRhdXggZOKAmWVzY29tcHRlIHJhdGlvbm5lbCBk4oCZdW4gYm9uIGR1IFRyw6lzb3IuDQpUQklMTFBSSUNFCQk9IFBSSVguQk9OLlRSRVNPUgkJIyMJUmVudm9pZSBsZSBwcml4IGTigJl1biBib24gZHUgVHLDqXNvciBk4oCZdW5lIHZhbGV1ciBub21pbmFsZSBkZSAxMDAgZXVyb3MuDQpUQklMTFlJRUxECQk9IFJFTkRFTUVOVC5CT04uVFJFU09SCQkjIwlDYWxjdWxlIGxlIHRhdXggZGUgcmVuZGVtZW50IGTigJl1biBib24gZHUgVHLDqXNvci4NClZEQgkJCT0gVkRCCQkJCSMjCVJlbnZvaWUgbOKAmWFtb3J0aXNzZW1lbnQgZOKAmXVuIGJpZW4gcG91ciB1bmUgcMOpcmlvZGUgc3DDqWNpZmnDqWUgb3UgcGFydGllbGxlIGVuIHV0aWxpc2FudCB1bmUgbcOpdGhvZGUgZGUgbOKAmWFtb3J0aXNzZW1lbnQgZMOpZ3Jlc3NpZiDDoCB0YXV4IGZpeGUuDQpYSVJSCQkJPSBUUkkuUEFJRU1FTlRTCQkJIyMJQ2FsY3VsZSBsZSB0YXV4IGRlIHJlbnRhYmlsaXTDqSBpbnRlcm5lIGTigJl1biBlbnNlbWJsZSBkZSBwYWllbWVudHMgbm9uIHDDqXJpb2RpcXVlcy4NClhOUFYJCQk9IFZBTi5QQUlFTUVOVFMJCQkjIwlSZW52b2llIGxhIHZhbGV1ciBhY3R1ZWxsZSBuZXR0ZSBk4oCZdW4gZW5zZW1ibGUgZGUgcGFpZW1lbnRzIG5vbiBww6lyaW9kaXF1ZXMuDQpZSUVMRAkJCT0gUkVOREVNRU5ULlRJVFJFCQkjIwlDYWxjdWxlIGxlIHJlbmRlbWVudCBk4oCZdW4gdGl0cmUgcmFwcG9ydGFudCBkZXMgaW50w6lyw6p0cyBww6lyaW9kaXF1ZW1lbnQuDQpZSUVMRERJU0MJCT0gUkVOREVNRU5ULlNJTVBMRQkJIyMJQ2FsY3VsZSBsZSB0YXV4IGRlIHJlbmRlbWVudCBk4oCZdW4gZW1wcnVudCDDoCBpbnTDqXLDqnQgc2ltcGxlIChwYXIgZXhlbXBsZSwgdW4gYm9uIGR1IFRyw6lzb3IpLg0KWUlFTERNQVQJCT0gUkVOREVNRU5ULlRJVFJFLkVDSEVBTkNFCSMjCVJlbnZvaWUgbGUgcmVuZGVtZW50IGFubnVlbCBk4oCZdW4gdGl0cmUgcXVpIHJhcHBvcnRlIGRlcyBpbnTDqXLDqnRzIMOgIGzigJnDqWNow6lhbmNlLg0KDQoNCiMjDQojIwlJbmZvcm1hdGlvbiBmdW5jdGlvbnMJCQkJRm9uY3Rpb25zIGTigJlpbmZvcm1hdGlvbg0KIyMNCkNFTEwJCQk9IENFTExVTEUJCQkjIwlSZW52b2llIGRlcyBpbmZvcm1hdGlvbnMgc3VyIGxhIG1pc2UgZW4gZm9ybWUsIGzigJllbXBsYWNlbWVudCBldCBsZSBjb250ZW51IGTigJl1bmUgY2VsbHVsZS4NCkVSUk9SLlRZUEUJCT0gVFlQRS5FUlJFVVIJCQkjIwlSZW52b2llIHVuIG5vbWJyZSBjb3JyZXNwb25kYW50IMOgIHVuIHR5cGUgZOKAmWVycmV1ci4NCklORk8JCQk9IElORk9STUFUSU9OUwkJCSMjCVJlbnZvaWUgZGVzIGluZm9ybWF0aW9ucyBzdXIgbOKAmWVudmlyb25uZW1lbnQgZOKAmWV4cGxvaXRhdGlvbiBhY3R1ZWwuDQpJU0JMQU5LCQkJPSBFU1RWSURFCQkJIyMJUmVudm9pZSBWUkFJIHNpIGzigJlhcmd1bWVudCB2YWxldXIgZXN0IHZpZGUuDQpJU0VSUgkJCT0gRVNURVJSCQkJIyMJUmVudm9pZSBWUkFJIHNpIGzigJlhcmd1bWVudCB2YWxldXIgZmFpdCByw6lmw6lyZW5jZSDDoCB1bmUgdmFsZXVyIGTigJllcnJldXIsIHNhdWYgI04vQS4NCklTRVJST1IJCQk9IEVTVEVSUkVVUgkJCSMjCVJlbnZvaWUgVlJBSSBzaSBs4oCZYXJndW1lbnQgdmFsZXVyIGZhaXQgcsOpZsOpcmVuY2Ugw6AgdW5lIHZhbGV1ciBk4oCZZXJyZXVyLg0KSVNFVkVOCQkJPSBFU1QuUEFJUgkJCSMjCVJlbnZvaWUgVlJBSSBzaSBsZSBjaGlmZnJlIGVzdCBwYWlyLg0KSVNMT0dJQ0FMCQk9IEVTVExPR0lRVUUJCQkjIwlSZW52b2llIFZSQUkgc2kgbOKAmWFyZ3VtZW50IHZhbGV1ciBmYWl0IHLDqWbDqXJlbmNlIMOgIHVuZSB2YWxldXIgbG9naXF1ZS4NCklTTkEJCQk9IEVTVE5BCQkJCSMjCVJlbnZvaWUgVlJBSSBzaSBs4oCZYXJndW1lbnQgdmFsZXVyIGZhaXQgcsOpZsOpcmVuY2Ugw6AgbGEgdmFsZXVyIGTigJllcnJldXIgI04vQS4NCklTTk9OVEVYVAkJPSBFU1ROT05URVhURQkJCSMjCVJlbnZvaWUgVlJBSSBzaSBs4oCZYXJndW1lbnQgdmFsZXVyIG5lIHNlIHByw6lzZW50ZSBwYXMgc291cyBmb3JtZSBkZSB0ZXh0ZS4NCklTTlVNQkVSCQk9IEVTVE5VTQkJCSMjCVJlbnZvaWUgVlJBSSBzaSBs4oCZYXJndW1lbnQgdmFsZXVyIHJlcHLDqXNlbnRlIHVuIG5vbWJyZS4NCklTT0RECQkJPSBFU1QuSU1QQUlSCQkJIyMJUmVudm9pZSBWUkFJIHNpIGxlIGNoaWZmcmUgZXN0IGltcGFpci4NCklTUkVGCQkJPSBFU1RSRUYJCQkjIwlSZW52b2llIFZSQUkgc2kgbOKAmWFyZ3VtZW50IHZhbGV1ciBlc3QgdW5lIHLDqWbDqXJlbmNlLg0KSVNURVhUCQkJPSBFU1RURVhURQkJCSMjCVJlbnZvaWUgVlJBSSBzaSBs4oCZYXJndW1lbnQgdmFsZXVyIHNlIHByw6lzZW50ZSBzb3VzIGZvcm1lIGRlIHRleHRlLg0KTgkJCT0gTgkJCQkjIwlSZW52b2llIHVuZSB2YWxldXIgY29udmVydGllIGVuIG5vbWJyZS4NCk5BCQkJPSBOQQkJCQkjIwlSZW52b2llIGxhIHZhbGV1ciBk4oCZZXJyZXVyICNOL0EuDQpUWVBFCQkJPSBUWVBFCQkJCSMjCVJlbnZvaWUgdW4gbm9tYnJlIGluZGlxdWFudCBsZSB0eXBlIGRlIGRvbm7DqWVzIGTigJl1bmUgdmFsZXVyLg0KDQoNCiMjDQojIwlMb2dpY2FsIGZ1bmN0aW9ucwkJCQlGb25jdGlvbnMgbG9naXF1ZXMNCiMjDQpBTkQJCQk9IEVUCQkJCSMjCVJlbnZvaWUgVlJBSSBzaSB0b3VzIHNlcyBhcmd1bWVudHMgc29udCBWUkFJLg0KRkFMU0UJCQk9IEZBVVgJCQkJIyMJUmVudm9pZSBsYSB2YWxldXIgbG9naXF1ZSBGQVVYLg0KSUYJCQk9IFNJCQkJCSMjCVNww6ljaWZpZSB1biB0ZXN0IGxvZ2lxdWUgw6AgZWZmZWN0dWVyLg0KSUZFUlJPUgkJCT0gU0lFUlJFVVIJCQkjIwlSZW52b2llIHVuZSB2YWxldXIgcXVlIHZvdXMgc3DDqWNpZmlleiBzaSB1bmUgZm9ybXVsZSBnw6luw6hyZSB1bmUgZXJyZXVyIDsgc2lub24sIGVsbGUgcmVudm9pZSBsZSByw6lzdWx0YXQgZGUgbGEgZm9ybXVsZS4NCk5PVAkJCT0gTk9OCQkJCSMjCUludmVyc2UgbGEgbG9naXF1ZSBkZSBjZXQgYXJndW1lbnQuDQpPUgkJCT0gT1UJCQkJIyMJUmVudm9pZSBWUkFJIHNpIHVuIGRlcyBhcmd1bWVudHMgZXN0IFZSQUkuDQpUUlVFCQkJPSBWUkFJCQkJCSMjCVJlbnZvaWUgbGEgdmFsZXVyIGxvZ2lxdWUgVlJBSS4NCg0KDQojIw0KIyMJTG9va3VwIGFuZCByZWZlcmVuY2UgZnVuY3Rpb25zCQkJRm9uY3Rpb25zIGRlIHJlY2hlcmNoZSBldCBkZSByw6lmw6lyZW5jZQ0KIyMNCkFERFJFU1MJCQk9IEFEUkVTU0UJCQkjIwlSZW52b2llIHVuZSByw6lmw6lyZW5jZSBzb3VzIGZvcm1lIGRlIHRleHRlIMOgIHVuZSBzZXVsZSBjZWxsdWxlIGTigJl1bmUgZmV1aWxsZSBkZSBjYWxjdWwuDQpBUkVBUwkJCT0gWk9ORVMJCQkJIyMJUmVudm9pZSBsZSBub21icmUgZGUgem9uZXMgZGFucyB1bmUgcsOpZsOpcmVuY2UuDQpDSE9PU0UJCQk9IENIT0lTSVIJCQkjIwlDaG9pc2l0IHVuZSB2YWxldXIgZGFucyB1bmUgbGlzdGUuDQpDT0xVTU4JCQk9IENPTE9OTkUJCQkjIwlSZW52b2llIGxlIG51bcOpcm8gZGUgY29sb25uZSBk4oCZdW5lIHLDqWbDqXJlbmNlLg0KQ09MVU1OUwkJCT0gQ09MT05ORVMJCQkjIwlSZW52b2llIGxlIG5vbWJyZSBkZSBjb2xvbm5lcyBkYW5zIHVuZSByw6lmw6lyZW5jZS4NCkhMT09LVVAJCQk9IFJFQ0hFUkNIRUgJCQkjIwlFZmZlY3R1ZSB1bmUgcmVjaGVyY2hlIGRhbnMgbGEgcHJlbWnDqHJlIGxpZ25lIGTigJl1bmUgbWF0cmljZSBldCByZW52b2llIGxhIHZhbGV1ciBkZSBsYSBjZWxsdWxlIGluZGlxdcOpZS4NCkhZUEVSTElOSwkJPSBMSUVOX0hZUEVSVEVYVEUJCSMjCUNyw6llIHVuIHJhY2NvdXJjaSBvdSB1biByZW52b2kgcXVpIG91dnJlIHVuIGRvY3VtZW50IHN0b2Nrw6kgc3VyIHVuIHNlcnZldXIgcsOpc2VhdSwgc3VyIHVuIHLDqXNlYXUgSW50cmFuZXQgb3Ugc3VyIEludGVybmV0Lg0KSU5ERVgJCQk9IElOREVYCQkJCSMjCVV0aWxpc2UgdW4gaW5kZXggcG91ciBjaG9pc2lyIHVuZSB2YWxldXIgcHJvdmVuYW50IGTigJl1bmUgcsOpZsOpcmVuY2Ugb3UgZOKAmXVuZSBtYXRyaWNlLg0KSU5ESVJFQ1QJCT0gSU5ESVJFQ1QJCQkjIwlSZW52b2llIHVuZSByw6lmw6lyZW5jZSBpbmRpcXXDqWUgcGFyIHVuZSB2YWxldXIgZGUgdGV4dGUuDQpMT09LVVAJCQk9IFJFQ0hFUkNIRQkJCSMjCVJlY2hlcmNoZSBkZXMgdmFsZXVycyBkYW5zIHVuIHZlY3RldXIgb3UgdW5lIG1hdHJpY2UuDQpNQVRDSAkJCT0gRVFVSVYJCQkJIyMJUmVjaGVyY2hlIGRlcyB2YWxldXJzIGRhbnMgdW5lIHLDqWbDqXJlbmNlIG91IHVuZSBtYXRyaWNlLg0KT0ZGU0VUCQkJPSBERUNBTEVSCQkJIyMJUmVudm9pZSB1bmUgcsOpZsOpcmVuY2UgZMOpY2Fsw6llIHBhciByYXBwb3J0IMOgIHVuZSByw6lmw6lyZW5jZSBkb25uw6llLg0KUk9XCQkJPSBMSUdORQkJCQkjIwlSZW52b2llIGxlIG51bcOpcm8gZGUgbGlnbmUgZOKAmXVuZSByw6lmw6lyZW5jZS4NClJPV1MJCQk9IExJR05FUwkJCSMjCVJlbnZvaWUgbGUgbm9tYnJlIGRlIGxpZ25lcyBkYW5zIHVuZSByw6lmw6lyZW5jZS4NClJURAkJCT0gUlRECQkJCSMjCUV4dHJhaXQgbGVzIGRvbm7DqWVzIGVuIHRlbXBzIHLDqWVsIMOgIHBhcnRpciBk4oCZdW4gcHJvZ3JhbW1lIHByZW5hbnQgZW4gY2hhcmdlIGzigJlhdXRvbWF0aW9uIENPTSAoQXV0b21hdGlvbiA6IHV0aWxpc2F0aW9uIGRlcyBvYmpldHMgZCd1bmUgYXBwbGljYXRpb24gw6AgcGFydGlyIGQndW5lIGF1dHJlIGFwcGxpY2F0aW9uIG91IGQndW4gYXV0cmUgb3V0aWwgZGUgZMOpdmVsb3BwZW1lbnQuIEF1dHJlZm9pcyBhcHBlbMOpZSBPTEUgQXV0b21hdGlvbiwgQXV0b21hdGlvbiBlc3QgdW5lIG5vcm1lIGluZHVzdHJpZWxsZSBldCB1bmUgZm9uY3Rpb25uYWxpdMOpIGR1IG1vZMOobGUgZCdvYmpldCBDT00gKENvbXBvbmVudCBPYmplY3QgTW9kZWwpLikuDQpUUkFOU1BPU0UJCT0gVFJBTlNQT1NFCQkJIyMJUmVudm9pZSBsYSB0cmFuc3Bvc2l0aW9uIGTigJl1bmUgbWF0cmljZS4NClZMT09LVVAJCQk9IFJFQ0hFUkNIRVYJCQkjIwlFZmZlY3R1ZSB1bmUgcmVjaGVyY2hlIGRhbnMgbGEgcHJlbWnDqHJlIGNvbG9ubmUgZOKAmXVuZSBtYXRyaWNlIGV0IHNlIGTDqXBsYWNlIHN1ciBsYSBsaWduZSBwb3VyIHJlbnZveWVyIGxhIHZhbGV1ciBk4oCZdW5lIGNlbGx1bGUuDQoNCg0KIyMNCiMjCU1hdGggYW5kIHRyaWdvbm9tZXRyeSBmdW5jdGlvbnMJCQlGb25jdGlvbnMgbWF0aMOpbWF0aXF1ZXMgZXQgdHJpZ29ub23DqXRyaXF1ZXMNCiMjDQpBQlMJCQk9IEFCUwkJCQkjIwlSZW52b2llIGxhIHZhbGV1ciBhYnNvbHVlIGTigJl1biBub21icmUuDQpBQ09TCQkJPSBBQ09TCQkJCSMjCVJlbnZvaWUgbOKAmWFyY2Nvc2ludXMgZOKAmXVuIG5vbWJyZS4NCkFDT1NICQkJPSBBQ09TSAkJCQkjIwlSZW52b2llIGxlIGNvc2ludXMgaHlwZXJib2xpcXVlIGludmVyc2UgZOKAmXVuIG5vbWJyZS4NCkFTSU4JCQk9IEFTSU4JCQkJIyMJUmVudm9pZSBs4oCZYXJjc2ludXMgZOKAmXVuIG5vbWJyZS4NCkFTSU5ICQkJPSBBU0lOSAkJCQkjIwlSZW52b2llIGxlIHNpbnVzIGh5cGVyYm9saXF1ZSBpbnZlcnNlIGTigJl1biBub21icmUuDQpBVEFOCQkJPSBBVEFOCQkJCSMjCVJlbnZvaWUgbOKAmWFyY3RhbmdlbnRlIGTigJl1biBub21icmUuDQpBVEFOMgkJCT0gQVRBTjIJCQkJIyMJUmVudm9pZSBs4oCZYXJjdGFuZ2VudGUgZGVzIGNvb3Jkb25uw6llcyB4IGV0IHkuDQpBVEFOSAkJCT0gQVRBTkgJCQkJIyMJUmVudm9pZSBsYSB0YW5nZW50ZSBoeXBlcmJvbGlxdWUgaW52ZXJzZSBk4oCZdW4gbm9tYnJlLg0KQ0VJTElORwkJCT0gUExBRk9ORAkJCSMjCUFycm9uZGl0IHVuIG5vbWJyZSBhdSBub21icmUgZW50aWVyIGxlIHBsdXMgcHJvY2hlIG91IGF1IG11bHRpcGxlIGxlIHBsdXMgcHJvY2hlIGRlIGzigJlhcmd1bWVudCBwcsOpY2lzaW9uIGVuIHPigJnDqWxvaWduYW50IGRlIHrDqXJvLg0KQ09NQklOCQkJPSBDT01CSU4JCQkjIwlSZW52b2llIGxlIG5vbWJyZSBkZSBjb21iaW5haXNvbnMgcXVlIGzigJlvbiBwZXV0IGZvcm1lciBhdmVjIHVuIG5vbWJyZSBkb25uw6kgZOKAmW9iamV0cy4NCkNPUwkJCT0gQ09TCQkJCSMjCVJlbnZvaWUgbGUgY29zaW51cyBk4oCZdW4gbm9tYnJlLg0KQ09TSAkJCT0gQ09TSAkJCQkjIwlSZW52b2llIGxlIGNvc2ludXMgaHlwZXJib2xpcXVlIGTigJl1biBub21icmUuDQpERUdSRUVTCQkJPSBERUdSRVMJCQkjIwlDb252ZXJ0aXQgZGVzIHJhZGlhbnMgZW4gZGVncsOpcy4NCkVWRU4JCQk9IFBBSVIJCQkJIyMJQXJyb25kaXQgdW4gbm9tYnJlIGF1IG5vbWJyZSBlbnRpZXIgcGFpciBsZSBwbHVzIHByb2NoZSBlbiBz4oCZw6lsb2lnbmFudCBkZSB6w6lyby4NCkVYUAkJCT0gRVhQCQkJCSMjCVJlbnZvaWUgZSDDqWxldsOpIMOgIGxhIHB1aXNzYW5jZSBk4oCZdW4gbm9tYnJlIGRvbm7DqS4NCkZBQ1QJCQk9IEZBQ1QJCQkJIyMJUmVudm9pZSBsYSBmYWN0b3JpZWxsZSBk4oCZdW4gbm9tYnJlLg0KRkFDVERPVUJMRQkJPSBGQUNURE9VQkxFCQkJIyMJUmVudm9pZSBsYSBmYWN0b3JpZWxsZSBkb3VibGUgZOKAmXVuIG5vbWJyZS4NCkZMT09SCQkJPSBQTEFOQ0hFUgkJCSMjCUFycm9uZGl0IHVuIG5vbWJyZSBlbiB0ZW5kYW50IHZlcnMgMCAoesOpcm8pLg0KR0NECQkJPSBQR0NECQkJCSMjCVJlbnZvaWUgbGUgcGx1cyBncmFuZCBjb21tdW4gZGl2aXNldXIuDQpJTlQJCQk9IEVOVAkJCQkjIwlBcnJvbmRpdCB1biBub21icmUgw6AgbOKAmWVudGllciBpbW3DqWRpYXRlbWVudCBpbmbDqXJpZXVyLg0KTENNCQkJPSBQUENNCQkJCSMjCVJlbnZvaWUgbGUgcGx1cyBwZXRpdCBjb21tdW4gbXVsdGlwbGUuDQpMTgkJCT0gTE4JCQkJIyMJUmVudm9pZSBsZSBsb2dhcml0aG1lIG7DqXDDqXJpZW4gZOKAmXVuIG5vbWJyZS4NCkxPRwkJCT0gTE9HCQkJCSMjCVJlbnZvaWUgbGUgbG9nYXJpdGhtZSBk4oCZdW4gbm9tYnJlIGRhbnMgbGEgYmFzZSBzcMOpY2lmacOpZS4NCkxPRzEwCQkJPSBMT0cxMAkJCQkjIwlDYWxjdWxlIGxlIGxvZ2FyaXRobWUgZW4gYmFzZSAxMCBk4oCZdW4gbm9tYnJlLg0KTURFVEVSTQkJCT0gREVURVJNQVQJCQkjIwlSZW52b2llIGxlIGTDqXRlcm1pbmFudCBk4oCZdW5lIG1hdHJpY2UuDQpNSU5WRVJTRQkJPSBJTlZFUlNFTUFUCQkJIyMJUmVudm9pZSBsYSBtYXRyaWNlIGludmVyc2UgZOKAmXVuZSBtYXRyaWNlLg0KTU1VTFQJCQk9IFBST0RVSVRNQVQJCQkjIwlSZW52b2llIGxlIHByb2R1aXQgZGUgZGV1eCBtYXRyaWNlcy4NCk1PRAkJCT0gTU9ECQkJCSMjCVJlbnZvaWUgbGUgcmVzdGUgZOKAmXVuZSBkaXZpc2lvbi4NCk1ST1VORAkJCT0gQVJST05ESS5BVS5NVUxUSVBMRQkJIyMJRG9ubmUgbOKAmWFycm9uZGkgZOKAmXVuIG5vbWJyZSBhdSBtdWx0aXBsZSBzcMOpY2lmacOpLg0KTVVMVElOT01JQUwJCT0gTVVMVElOT01JQUxFCQkJIyMJQ2FsY3VsZSBsYSBtdWx0aW5vbWlhbGUgZOKAmXVuIGVuc2VtYmxlIGRlIG5vbWJyZXMuDQpPREQJCQk9IElNUEFJUgkJCSMjCVJlbnZvaWUgbGUgbm9tYnJlLCBhcnJvbmRpIMOgIGxhIHZhbGV1ciBkdSBub21icmUgZW50aWVyIGltcGFpciBsZSBwbHVzIHByb2NoZSBlbiBz4oCZw6lsb2lnbmFudCBkZSB6w6lyby4NClBJCQkJPSBQSQkJCQkjIwlSZW52b2llIGxhIHZhbGV1ciBkZSBwaS4NClBPV0VSCQkJPSBQVUlTU0FOQ0UJCQkjIwlSZW52b2llIGxhIHZhbGV1ciBkdSBub21icmUgw6lsZXbDqSDDoCB1bmUgcHVpc3NhbmNlLg0KUFJPRFVDVAkJCT0gUFJPRFVJVAkJCSMjCU11bHRpcGxpZSBzZXMgYXJndW1lbnRzLg0KUVVPVElFTlQJCT0gUVVPVElFTlQJCQkjIwlSZW52b2llIGxhIHBhcnRpZSBlbnRpw6hyZSBkdSByw6lzdWx0YXQgZOKAmXVuZSBkaXZpc2lvbi4NClJBRElBTlMJCQk9IFJBRElBTlMJCQkjIwlDb252ZXJ0aXQgZGVzIGRlZ3LDqXMgZW4gcmFkaWFucy4NClJBTkQJCQk9IEFMRUEJCQkJIyMJUmVudm9pZSB1biBub21icmUgYWzDqWF0b2lyZSBjb21wcmlzIGVudHJlIDAgZXQgMS4NClJBTkRCRVRXRUVOCQk9IEFMRUEuRU5UUkUuQk9STkVTCQkjIwlSZW52b2llIHVuIG5vbWJyZSBhbMOpYXRvaXJlIGVudHJlIGxlcyBub21icmVzIHF1ZSB2b3VzIHNww6ljaWZpZXouDQpST01BTgkJCT0gUk9NQUlOCQkJIyMJQ29udmVydGl0IGRlcyBjaGlmZnJlcyBhcmFiZXMgZW4gY2hpZmZyZXMgcm9tYWlucywgc291cyBmb3JtZSBkZSB0ZXh0ZS4NClJPVU5ECQkJPSBBUlJPTkRJCQkJIyMJQXJyb25kaXQgdW4gbm9tYnJlIGF1IG5vbWJyZSBkZSBjaGlmZnJlcyBpbmRpcXXDqS4NClJPVU5ERE9XTgkJPSBBUlJPTkRJLklORgkJCSMjCUFycm9uZGl0IHVuIG5vbWJyZSBlbiB0ZW5kYW50IHZlcnMgMCAoesOpcm8pLg0KUk9VTkRVUAkJCT0gQVJST05ESS5TVVAJCQkjIwlBcnJvbmRpdCB1biBub21icmUgw6AgbOKAmWVudGllciBzdXDDqXJpZXVyLCBlbiBz4oCZw6lsb2lnbmFudCBkZSB6w6lyby4NClNFUklFU1NVTQkJPSBTT01NRS5TRVJJRVMJCQkjIwlSZW52b2llIGxhIHNvbW1lIGTigJl1bmUgc8OpcmllIGfDqW9tw6l0cmlxdWUgZW4gc+KAmWFwcHV5YW50IHN1ciBsYSBmb3JtdWxlIHN1aXZhbnRlIDoNClNJR04JCQk9IFNJR05FCQkJCSMjCVJlbnZvaWUgbGUgc2lnbmUgZOKAmXVuIG5vbWJyZS4NClNJTgkJCT0gU0lOCQkJCSMjCVJlbnZvaWUgbGUgc2ludXMgZOKAmXVuIGFuZ2xlIGRvbm7DqS4NClNJTkgJCQk9IFNJTkgJCQkJIyMJUmVudm9pZSBsZSBzaW51cyBoeXBlcmJvbGlxdWUgZOKAmXVuIG5vbWJyZS4NClNRUlQJCQk9IFJBQ0lORQkJCSMjCVJlbnZvaWUgbGEgcmFjaW5lIGNhcnLDqWUgZOKAmXVuIG5vbWJyZS4NClNRUlRQSQkJCT0gUkFDSU5FLlBJCQkJIyMJUmVudm9pZSBsYSByYWNpbmUgY2FycsOpZSBkZSAobm9tYnJlICogcGkpLg0KU1VCVE9UQUwJCT0gU09VUy5UT1RBTAkJCSMjCVJlbnZvaWUgdW4gc291cy10b3RhbCBkYW5zIHVuZSBsaXN0ZSBvdSB1bmUgYmFzZSBkZSBkb25uw6llcy4NClNVTQkJCT0gU09NTUUJCQkJIyMJQ2FsY3VsZSBsYSBzb21tZSBkZSBzZXMgYXJndW1lbnRzLg0KU1VNSUYJCQk9IFNPTU1FLlNJCQkJIyMJQWRkaXRpb25uZSBsZXMgY2VsbHVsZXMgc3DDqWNpZmnDqWVzIHNpIGVsbGVzIHLDqXBvbmRlbnQgw6AgdW4gY3JpdMOocmUgZG9ubsOpLg0KU1VNSUZTCQkJPSBTT01NRS5TSS5FTlMJCQkjIwlBam91dGUgbGVzIGNlbGx1bGVzIGTigJl1bmUgcGxhZ2UgcXVpIHLDqXBvbmRlbnQgw6AgcGx1c2lldXJzIGNyaXTDqHJlcy4NClNVTVBST0RVQ1QJCT0gU09NTUVQUk9ECQkJIyMJTXVsdGlwbGllIGxlcyB2YWxldXJzIGNvcnJlc3BvbmRhbnRlcyBkZXMgbWF0cmljZXMgc3DDqWNpZmnDqWVzIGV0IGNhbGN1bGUgbGEgc29tbWUgZGUgY2VzIHByb2R1aXRzLg0KU1VNU1EJCQk9IFNPTU1FLkNBUlJFUwkJCSMjCVJlbnZvaWUgbGEgc29tbWUgZGVzIGNhcnLDqXMgZGVzIGFyZ3VtZW50cy4NClNVTVgyTVkyCQk9IFNPTU1FLlgyTVkyCQkJIyMJUmVudm9pZSBsYSBzb21tZSBkZSBsYSBkaWZmw6lyZW5jZSBkZXMgY2FycsOpcyBkZXMgdmFsZXVycyBjb3JyZXNwb25kYW50ZXMgZGUgZGV1eCBtYXRyaWNlcy4NClNVTVgyUFkyCQk9IFNPTU1FLlgyUFkyCQkJIyMJUmVudm9pZSBsYSBzb21tZSBkZSBsYSBzb21tZSBkZXMgY2FycsOpcyBkZXMgdmFsZXVycyBjb3JyZXNwb25kYW50ZXMgZGUgZGV1eCBtYXRyaWNlcy4NClNVTVhNWTIJCQk9IFNPTU1FLlhNWTIJCQkjIwlSZW52b2llIGxhIHNvbW1lIGRlcyBjYXJyw6lzIGRlcyBkaWZmw6lyZW5jZXMgZW50cmUgbGVzIHZhbGV1cnMgY29ycmVzcG9uZGFudGVzIGRlIGRldXggbWF0cmljZXMuDQpUQU4JCQk9IFRBTgkJCQkjIwlSZW52b2llIGxhIHRhbmdlbnRlIGTigJl1biBub21icmUuDQpUQU5ICQkJPSBUQU5ICQkJCSMjCVJlbnZvaWUgbGEgdGFuZ2VudGUgaHlwZXJib2xpcXVlIGTigJl1biBub21icmUuDQpUUlVOQwkJCT0gVFJPTlFVRQkJCSMjCVJlbnZvaWUgbGEgcGFydGllIGVudGnDqHJlIGTigJl1biBub21icmUuDQoNCg0KIyMNCiMjCVN0YXRpc3RpY2FsIGZ1bmN0aW9ucwkJCQlGb25jdGlvbnMgc3RhdGlzdGlxdWVzDQojIw0KQVZFREVWCQkJPSBFQ0FSVC5NT1lFTgkJCSMjCVJlbnZvaWUgbGEgbW95ZW5uZSBkZXMgw6ljYXJ0cyBhYnNvbHVzIG9ic2VydsOpcyBkYW5zIGxhIG1veWVubmUgZGVzIHBvaW50cyBkZSBkb25uw6llcy4NCkFWRVJBR0UJCQk9IE1PWUVOTkUJCQkjIwlSZW52b2llIGxhIG1veWVubmUgZGUgc2VzIGFyZ3VtZW50cy4NCkFWRVJBR0VBCQk9IEFWRVJBR0VBCQkJIyMJUmVudm9pZSBsYSBtb3llbm5lIGRlIHNlcyBhcmd1bWVudHMsIG5vbWJyZXMsIHRleHRlIGV0IHZhbGV1cnMgbG9naXF1ZXMgaW5jbHVzLg0KQVZFUkFHRUlGCQk9IE1PWUVOTkUuU0kJCQkjIwlSZW52b2llIGxhIG1veWVubmUgKGFyaXRobcOpdGlxdWUpIGRlIHRvdXRlcyBsZXMgY2VsbHVsZXMgZOKAmXVuZSBwbGFnZSBxdWkgcsOpcG9uZGVudCDDoCBkZXMgY3JpdMOocmVzIGRvbm7DqXMuDQpBVkVSQUdFSUZTCQk9IE1PWUVOTkUuU0kuRU5TCQkjIwlSZW52b2llIGxhIG1veWVubmUgKGFyaXRobcOpdGlxdWUpIGRlIHRvdXRlcyBsZXMgY2VsbHVsZXMgcXVpIHLDqXBvbmRlbnQgw6AgcGx1c2lldXJzIGNyaXTDqHJlcy4NCkJFVEFESVNUCQk9IExPSS5CRVRBCQkJIyMJUmVudm9pZSBsYSBmb25jdGlvbiBkZSBkaXN0cmlidXRpb24gY3VtdWzDqWUuDQpCRVRBSU5WCQkJPSBCRVRBLklOVkVSU0UJCQkjIwlSZW52b2llIGzigJlpbnZlcnNlIGRlIGxhIGZvbmN0aW9uIGRlIGRpc3RyaWJ1dGlvbiBjdW11bMOpZSBwb3VyIHVuZSBkaXN0cmlidXRpb24gYsOqdGEgc3DDqWNpZmnDqWUuDQpCSU5PTURJU1QJCT0gTE9JLkJJTk9NSUFMRQkJCSMjCVJlbnZvaWUgbGEgcHJvYmFiaWxpdMOpIGTigJl1bmUgdmFyaWFibGUgYWzDqWF0b2lyZSBkaXNjcsOodGUgc3VpdmFudCBsYSBsb2kgYmlub21pYWxlLg0KQ0hJRElTVAkJCT0gTE9JLktISURFVVgJCQkjIwlSZW52b2llIGxhIHByb2JhYmlsaXTDqSB1bmlsYXTDqXJhbGUgZGUgbGEgZGlzdHJpYnV0aW9uIGtoaS1kZXV4Lg0KQ0hJSU5WCQkJPSBLSElERVVYLklOVkVSU0UJCSMjCVJlbnZvaWUgbOKAmWludmVyc2UgZGUgbGEgcHJvYmFiaWxpdMOpIHVuaWxhdMOpcmFsZSBkZSBsYSBkaXN0cmlidXRpb24ga2hpLWRldXguDQpDSElURVNUCQkJPSBURVNULktISURFVVgJCQkjIwlSZW52b2llIGxlIHRlc3QgZOKAmWluZMOpcGVuZGFuY2UuDQpDT05GSURFTkNFCQk9IElOVEVSVkFMTEUuQ09ORklBTkNFCQkjIwlSZW52b2llIGzigJlpbnRlcnZhbGxlIGRlIGNvbmZpYW5jZSBwb3VyIHVuZSBtb3llbm5lIGRlIHBvcHVsYXRpb24uDQpDT1JSRUwJCQk9IENPRUZGSUNJRU5ULkNPUlJFTEFUSU9OCSMjCVJlbnZvaWUgbGUgY29lZmZpY2llbnQgZGUgY29ycsOpbGF0aW9uIGVudHJlIGRldXggc8OpcmllcyBkZSBkb25uw6llcy4NCkNPVU5UCQkJPSBOQgkJCQkjIwlEw6l0ZXJtaW5lIGxlcyBub21icmVzIGNvbXByaXMgZGFucyBsYSBsaXN0ZSBkZXMgYXJndW1lbnRzLg0KQ09VTlRBCQkJPSBOQlZBTAkJCQkjIwlEw6l0ZXJtaW5lIGxlIG5vbWJyZSBkZSB2YWxldXJzIGNvbXByaXNlcyBkYW5zIGxhIGxpc3RlIGRlcyBhcmd1bWVudHMuDQpDT1VOVEJMQU5LCQk9IE5CLlZJREUJCQkjIwlDb21wdGUgbGUgbm9tYnJlIGRlIGNlbGx1bGVzIHZpZGVzIGRhbnMgdW5lIHBsYWdlLg0KQ09VTlRJRgkJCT0gTkIuU0kJCQkJIyMJQ29tcHRlIGxlIG5vbWJyZSBkZSBjZWxsdWxlcyBxdWkgcsOpcG9uZGVudCDDoCB1biBjcml0w6hyZSBkb25uw6kgZGFucyB1bmUgcGxhZ2UuDQpDT1VOVElGUwkJPSBOQi5TSS5FTlMJCQkjIwlDb21wdGUgbGUgbm9tYnJlIGRlIGNlbGx1bGVzIMOgIGzigJlpbnTDqXJpZXVyIGTigJl1bmUgcGxhZ2UgcXVpIHLDqXBvbmRlbnQgw6AgcGx1c2lldXJzIGNyaXTDqHJlcy4NCkNPVkFSCQkJPSBDT1ZBUklBTkNFCQkJIyMJUmVudm9pZSBsYSBjb3ZhcmlhbmNlLCBtb3llbm5lIGRlcyBwcm9kdWl0cyBkZXMgw6ljYXJ0cyBwb3VyIGNoYXF1ZSBzw6lyaWUgZOKAmW9ic2VydmF0aW9ucy4NCkNSSVRCSU5PTQkJPSBDUklURVJFLkxPSS5CSU5PTUlBTEUJCSMjCVJlbnZvaWUgbGEgcGx1cyBwZXRpdGUgdmFsZXVyIHBvdXIgbGFxdWVsbGUgbGEgZGlzdHJpYnV0aW9uIGJpbm9taWFsZSBjdW11bMOpZSBlc3QgaW5mw6lyaWV1cmUgb3Ugw6lnYWxlIMOgIHVuZSB2YWxldXIgZGUgY3JpdMOocmUuDQpERVZTUQkJCT0gU09NTUUuQ0FSUkVTLkVDQVJUUwkJIyMJUmVudm9pZSBsYSBzb21tZSBkZXMgY2FycsOpcyBkZXMgw6ljYXJ0cy4NCkVYUE9ORElTVAkJPSBMT0kuRVhQT05FTlRJRUxMRQkJIyMJUmVudm9pZSBsYSBkaXN0cmlidXRpb24gZXhwb25lbnRpZWxsZS4NCkZESVNUCQkJPSBMT0kuRgkJCQkjIwlSZW52b2llIGxhIGRpc3RyaWJ1dGlvbiBkZSBwcm9iYWJpbGl0w6kgRi4NCkZJTlYJCQk9IElOVkVSU0UuTE9JLkYJCQkjIwlSZW52b2llIGzigJlpbnZlcnNlIGRlIGxhIGRpc3RyaWJ1dGlvbiBkZSBwcm9iYWJpbGl0w6kgRi4NCkZJU0hFUgkJCT0gRklTSEVSCQkJIyMJUmVudm9pZSBsYSB0cmFuc2Zvcm1hdGlvbiBkZSBGaXNoZXIuDQpGSVNIRVJJTlYJCT0gRklTSEVSLklOVkVSU0UJCSMjCVJlbnZvaWUgbOKAmWludmVyc2UgZGUgbGEgdHJhbnNmb3JtYXRpb24gZGUgRmlzaGVyLg0KRk9SRUNBU1QJCT0gUFJFVklTSU9OCQkJIyMJQ2FsY3VsZSB1bmUgdmFsZXVyIHBhciByYXBwb3J0IMOgIHVuZSB0ZW5kYW5jZSBsaW7DqWFpcmUuDQpGUkVRVUVOQ1kJCT0gRlJFUVVFTkNFCQkJIyMJQ2FsY3VsZSBsYSBmcsOpcXVlbmNlIGTigJlhcHBhcml0aW9uIGRlcyB2YWxldXJzIGRhbnMgdW5lIHBsYWdlIGRlIHZhbGV1cnMsIHB1aXMgcmVudm9pZSBkZXMgbm9tYnJlcyBzb3VzIGZvcm1lIGRlIG1hdHJpY2UgdmVydGljYWxlLg0KRlRFU1QJCQk9IFRFU1QuRgkJCSMjCVJlbnZvaWUgbGUgcsOpc3VsdGF0IGTigJl1biB0ZXN0IEYuDQpHQU1NQURJU1QJCT0gTE9JLkdBTU1BCQkJIyMJUmVudm9pZSBsYSBwcm9iYWJpbGl0w6kgZOKAmXVuZSB2YXJpYWJsZSBhbMOpYXRvaXJlIHN1aXZhbnQgdW5lIGxvaSBHYW1tYS4NCkdBTU1BSU5WCQk9IExPSS5HQU1NQS5JTlZFUlNFCQkjIwlSZW52b2llLCBwb3VyIHVuZSBwcm9iYWJpbGl0w6kgZG9ubsOpZSwgbGEgdmFsZXVyIGTigJl1bmUgdmFyaWFibGUgYWzDqWF0b2lyZSBzdWl2YW50IHVuZSBsb2kgR2FtbWEuDQpHQU1NQUxOCQkJPSBMTkdBTU1BCQkJIyMJUmVudm9pZSBsZSBsb2dhcml0aG1lIG7DqXDDqXJpZW4gZGUgbGEgZm9uY3Rpb24gR2FtbWEsIEcoeCkNCkdFT01FQU4JCQk9IE1PWUVOTkUuR0VPTUVUUklRVUUJCSMjCVJlbnZvaWUgbGEgbW95ZW5uZSBnw6lvbcOpdHJpcXVlLg0KR1JPV1RICQkJPSBDUk9JU1NBTkNFCQkJIyMJQ2FsY3VsZSBkZXMgdmFsZXVycyBwYXIgcmFwcG9ydCDDoCB1bmUgdGVuZGFuY2UgZXhwb25lbnRpZWxsZS4NCkhBUk1FQU4JCQk9IE1PWUVOTkUuSEFSTU9OSVFVRQkJIyMJUmVudm9pZSBsYSBtb3llbm5lIGhhcm1vbmlxdWUuDQpIWVBHRU9NRElTVAkJPSBMT0kuSFlQRVJHRU9NRVRSSVFVRQkJIyMJUmVudm9pZSBsYSBwcm9iYWJpbGl0w6kgZOKAmXVuZSB2YXJpYWJsZSBhbMOpYXRvaXJlIGRpc2Nyw6h0ZSBzdWl2YW50IHVuZSBsb2kgaHlwZXJnw6lvbcOpdHJpcXVlLg0KSU5URVJDRVBUCQk9IE9SRE9OTkVFLk9SSUdJTkUJCSMjCVJlbnZvaWUgbOKAmW9yZG9ubsOpZSDDoCBs4oCZb3JpZ2luZSBk4oCZdW5lIGRyb2l0ZSBkZSByw6lncmVzc2lvbiBsaW7DqWFpcmUuDQpLVVJUCQkJPSBLVVJUT1NJUwkJCSMjCVJlbnZvaWUgbGUga3VydG9zaXMgZOKAmXVuZSBzw6lyaWUgZGUgZG9ubsOpZXMuDQpMQVJHRQkJCT0gR1JBTkRFLlZBTEVVUgkJCSMjCVJlbnZvaWUgbGEgay1pw6htZSBwbHVzIGdyYW5kZSB2YWxldXIgZOKAmXVuZSBzw6lyaWUgZGUgZG9ubsOpZXMuDQpMSU5FU1QJCQk9IERST0lURVJFRwkJCSMjCVJlbnZvaWUgbGVzIHBhcmFtw6h0cmVzIGTigJl1bmUgdGVuZGFuY2UgbGluw6lhaXJlLg0KTE9HRVNUCQkJPSBMT0dSRUcJCQkjIwlSZW52b2llIGxlcyBwYXJhbcOodHJlcyBk4oCZdW5lIHRlbmRhbmNlIGV4cG9uZW50aWVsbGUuDQpMT0dJTlYJCQk9IExPSS5MT0dOT1JNQUxFLklOVkVSU0UJIyMJUmVudm9pZSBs4oCZaW52ZXJzZSBkZSBsYSBwcm9iYWJpbGl0w6kgcG91ciB1bmUgdmFyaWFibGUgYWzDqWF0b2lyZSBzdWl2YW50IGxhIGxvaSBsb2dub3JtYWxlLg0KTE9HTk9STURJU1QJCT0gTE9JLkxPR05PUk1BTEUJCSMjCVJlbnZvaWUgbGEgcHJvYmFiaWxpdMOpIGTigJl1bmUgdmFyaWFibGUgYWzDqWF0b2lyZSBjb250aW51ZSBzdWl2YW50IHVuZSBsb2kgbG9nbm9ybWFsZS4NCk1BWAkJCT0gTUFYCQkJCSMjCVJlbnZvaWUgbGEgdmFsZXVyIG1heGltYWxlIGNvbnRlbnVlIGRhbnMgdW5lIGxpc3RlIGTigJlhcmd1bWVudHMuDQpNQVhBCQkJPSBNQVhBCQkJCSMjCVJlbnZvaWUgbGEgdmFsZXVyIG1heGltYWxlIGTigJl1bmUgbGlzdGUgZOKAmWFyZ3VtZW50cywgbm9tYnJlcywgdGV4dGUgZXQgdmFsZXVycyBsb2dpcXVlcyBpbmNsdXMuDQpNRURJQU4JCQk9IE1FRElBTkUJCQkjIwlSZW52b2llIGxhIHZhbGV1ciBtw6lkaWFuZSBkZXMgbm9tYnJlcyBkb25uw6lzLg0KTUlOCQkJPSBNSU4JCQkJIyMJUmVudm9pZSBsYSB2YWxldXIgbWluaW1hbGUgY29udGVudWUgZGFucyB1bmUgbGlzdGUgZOKAmWFyZ3VtZW50cy4NCk1JTkEJCQk9IE1JTkEJCQkJIyMJUmVudm9pZSBsYSBwbHVzIHBldGl0ZSB2YWxldXIgZOKAmXVuZSBsaXN0ZSBk4oCZYXJndW1lbnRzLCBub21icmVzLCB0ZXh0ZSBldCB2YWxldXJzIGxvZ2lxdWVzIGluY2x1cy4NCk1PREUJCQk9IE1PREUJCQkJIyMJUmVudm9pZSBsYSB2YWxldXIgbGEgcGx1cyBjb3VyYW50ZSBk4oCZdW5lIHPDqXJpZSBkZSBkb25uw6llcy4NCk5FR0JJTk9NRElTVAkJPSBMT0kuQklOT01JQUxFLk5FRwkJIyMJUmVudm9pZSBsYSBwcm9iYWJpbGl0w6kgZOKAmXVuZSB2YXJpYWJsZSBhbMOpYXRvaXJlIGRpc2Nyw6h0ZSBzdWl2YW50IHVuZSBsb2kgYmlub21pYWxlIG7DqWdhdGl2ZS4NCk5PUk1ESVNUCQk9IExPSS5OT1JNQUxFCQkJIyMJUmVudm9pZSBsYSBwcm9iYWJpbGl0w6kgZOKAmXVuZSB2YXJpYWJsZSBhbMOpYXRvaXJlIGNvbnRpbnVlIHN1aXZhbnQgdW5lIGxvaSBub3JtYWxlLg0KTk9STUlOVgkJCT0gTE9JLk5PUk1BTEUuSU5WRVJTRQkJIyMJUmVudm9pZSwgcG91ciB1bmUgcHJvYmFiaWxpdMOpIGRvbm7DqWUsIGxhIHZhbGV1ciBk4oCZdW5lIHZhcmlhYmxlIGFsw6lhdG9pcmUgc3VpdmFudCB1bmUgbG9pIG5vcm1hbGUgc3RhbmRhcmQuDQpOT1JNU0RJU1QJCT0gTE9JLk5PUk1BTEUuU1RBTkRBUkQJCSMjCVJlbnZvaWUgbGEgcHJvYmFiaWxpdMOpIGTigJl1bmUgdmFyaWFibGUgYWzDqWF0b2lyZSBjb250aW51ZSBzdWl2YW50IHVuZSBsb2kgbm9ybWFsZSBzdGFuZGFyZC4NCk5PUk1TSU5WCQk9IExPSS5OT1JNQUxFLlNUQU5EQVJELklOVkVSU0UJIyMJUmVudm9pZSBs4oCZaW52ZXJzZSBkZSBsYSBkaXN0cmlidXRpb24gY3VtdWzDqWUgbm9ybWFsZSBzdGFuZGFyZC4NClBFQVJTT04JCQk9IFBFQVJTT04JCQkjIwlSZW52b2llIGxlIGNvZWZmaWNpZW50IGRlIGNvcnLDqWxhdGlvbiBk4oCZw6ljaGFudGlsbG9ubmFnZSBkZSBQZWFyc29uLg0KUEVSQ0VOVElMRQkJPSBDRU5USUxFCQkJIyMJUmVudm9pZSBsZSBrLWnDqG1lIGNlbnRpbGUgZGVzIHZhbGV1cnMgZOKAmXVuZSBwbGFnZS4NClBFUkNFTlRSQU5LCQk9IFJBTkcuUE9VUkNFTlRBR0UJCSMjCVJlbnZvaWUgbGUgcmFuZyBlbiBwb3VyY2VudGFnZSBk4oCZdW5lIHZhbGV1ciBk4oCZdW5lIHPDqXJpZSBkZSBkb25uw6llcy4NClBFUk1VVAkJCT0gUEVSTVVUQVRJT04JCQkjIwlSZW52b2llIGxlIG5vbWJyZSBkZSBwZXJtdXRhdGlvbnMgcG91ciB1biBub21icmUgZG9ubsOpIGTigJlvYmpldHMuDQpQT0lTU09OCQkJPSBMT0kuUE9JU1NPTgkJCSMjCVJlbnZvaWUgbGEgcHJvYmFiaWxpdMOpIGTigJl1bmUgdmFyaWFibGUgYWzDqWF0b2lyZSBzdWl2YW50IHVuZSBsb2kgZGUgUG9pc3Nvbi4NClBST0IJCQk9IFBST0JBQklMSVRFCQkJIyMJUmVudm9pZSBsYSBwcm9iYWJpbGl0w6kgcXVlIGRlcyB2YWxldXJzIGTigJl1bmUgcGxhZ2Ugc29pZW50IGNvbXByaXNlcyBlbnRyZSBkZXV4IGxpbWl0ZXMuDQpRVUFSVElMRQkJPSBRVUFSVElMRQkJCSMjCVJlbnZvaWUgbGUgcXVhcnRpbGUgZOKAmXVuZSBzw6lyaWUgZGUgZG9ubsOpZXMuDQpSQU5LCQkJPSBSQU5HCQkJCSMjCVJlbnZvaWUgbGUgcmFuZyBk4oCZdW4gbm9tYnJlIGNvbnRlbnUgZGFucyB1bmUgbGlzdGUuDQpSU1EJCQk9IENPRUZGSUNJRU5ULkRFVEVSTUlOQVRJT04JIyMJUmVudm9pZSBsYSB2YWxldXIgZHUgY29lZmZpY2llbnQgZGUgZMOpdGVybWluYXRpb24gUl4yIGTigJl1bmUgcsOpZ3Jlc3Npb24gbGluw6lhaXJlLg0KU0tFVwkJCT0gQ09FRkZJQ0lFTlQuQVNZTUVUUklFCQkjIwlSZW52b2llIGzigJlhc3ltw6l0cmllIGTigJl1bmUgZGlzdHJpYnV0aW9uLg0KU0xPUEUJCQk9IFBFTlRFCQkJCSMjCVJlbnZvaWUgbGEgcGVudGUgZOKAmXVuZSBkcm9pdGUgZGUgcsOpZ3Jlc3Npb24gbGluw6lhaXJlLg0KU01BTEwJCQk9IFBFVElURS5WQUxFVVIJCQkjIwlSZW52b2llIGxhIGstacOobWUgcGx1cyBwZXRpdGUgdmFsZXVyIGTigJl1bmUgc8OpcmllIGRlIGRvbm7DqWVzLg0KU1RBTkRBUkRJWkUJCT0gQ0VOVFJFRS5SRURVSVRFCQkjIwlSZW52b2llIHVuZSB2YWxldXIgY2VudHLDqWUgcsOpZHVpdGUuDQpTVERFVgkJCT0gRUNBUlRZUEUJCQkjIwnDiXZhbHVlIGzigJnDqWNhcnQgdHlwZSBk4oCZdW5lIHBvcHVsYXRpb24gZW4gc2UgYmFzYW50IHN1ciB1biDDqWNoYW50aWxsb24gZGUgY2V0dGUgcG9wdWxhdGlvbi4NClNUREVWQQkJCT0gU1RERVZBCQkJIyMJw4l2YWx1ZSBs4oCZw6ljYXJ0IHR5cGUgZOKAmXVuZSBwb3B1bGF0aW9uIGVuIHNlIGJhc2FudCBzdXIgdW4gw6ljaGFudGlsbG9uIGRlIGNldHRlIHBvcHVsYXRpb24sIG5vbWJyZXMsIHRleHRlIGV0IHZhbGV1cnMgbG9naXF1ZXMgaW5jbHVzLg0KU1RERVZQCQkJPSBFQ0FSVFlQRVAJCQkjIwlDYWxjdWxlIGzigJnDqWNhcnQgdHlwZSBk4oCZdW5lIHBvcHVsYXRpb24gw6AgcGFydGlyIGRlIGxhIHBvcHVsYXRpb24gZW50acOocmUuDQpTVERFVlBBCQkJPSBTVERFVlBBCQkJIyMJQ2FsY3VsZSBs4oCZw6ljYXJ0IHR5cGUgZOKAmXVuZSBwb3B1bGF0aW9uIMOgIHBhcnRpciBkZSBs4oCZZW5zZW1ibGUgZGUgbGEgcG9wdWxhdGlvbiwgbm9tYnJlcywgdGV4dGUgZXQgdmFsZXVycyBsb2dpcXVlcyBpbmNsdXMuDQpTVEVZWAkJCT0gRVJSRVVSLlRZUEUuWFkJCSMjCVJlbnZvaWUgbOKAmWVycmV1ciB0eXBlIGRlIGxhIHZhbGV1ciB5IHByw6l2dWUgcG91ciBjaGFxdWUgeCBkZSBsYSByw6lncmVzc2lvbi4NClRESVNUCQkJPSBMT0kuU1RVREVOVAkJCSMjCVJlbnZvaWUgbGEgcHJvYmFiaWxpdMOpIGTigJl1bmUgdmFyaWFibGUgYWzDqWF0b2lyZSBzdWl2YW50IHVuZSBsb2kgVCBkZSBTdHVkZW50Lg0KVElOVgkJCT0gTE9JLlNUVURFTlQuSU5WRVJTRQkJIyMJUmVudm9pZSwgcG91ciB1bmUgcHJvYmFiaWxpdMOpIGRvbm7DqWUsIGxhIHZhbGV1ciBk4oCZdW5lIHZhcmlhYmxlIGFsw6lhdG9pcmUgc3VpdmFudCB1bmUgbG9pIFQgZGUgU3R1ZGVudC4NClRSRU5ECQkJPSBURU5EQU5DRQkJCSMjCVJlbnZvaWUgZGVzIHZhbGV1cnMgcGFyIHJhcHBvcnQgw6AgdW5lIHRlbmRhbmNlIGxpbsOpYWlyZS4NClRSSU1NRUFOCQk9IE1PWUVOTkUuUkVEVUlURQkJIyMJUmVudm9pZSBsYSBtb3llbm5lIGRlIGzigJlpbnTDqXJpZXVyIGTigJl1bmUgc8OpcmllIGRlIGRvbm7DqWVzLg0KVFRFU1QJCQk9IFRFU1QuU1RVREVOVAkJCSMjCVJlbnZvaWUgbGEgcHJvYmFiaWxpdMOpIGFzc29jacOpZSDDoCB1biB0ZXN0IFQgZGUgU3R1ZGVudC4NClZBUgkJCT0gVkFSCQkJCSMjCUNhbGN1bGUgbGEgdmFyaWFuY2Ugc3VyIGxhIGJhc2UgZOKAmXVuIMOpY2hhbnRpbGxvbi4NClZBUkEJCQk9IFZBUkEJCQkJIyMJRXN0aW1lIGxhIHZhcmlhbmNlIGTigJl1bmUgcG9wdWxhdGlvbiBlbiBzZSBiYXNhbnQgc3VyIHVuIMOpY2hhbnRpbGxvbiBkZSBjZXR0ZSBwb3B1bGF0aW9uLCBub21icmVzLCB0ZXh0ZSBldCB2YWxldXJzIGxvZ2lxdWVzIGluY2x1c2VzLg0KVkFSUAkJCT0gVkFSLlAJCQkJIyMJQ2FsY3VsZSBsYSB2YXJpYW5jZSBzdXIgbGEgYmFzZSBkZSBs4oCZZW5zZW1ibGUgZGUgbGEgcG9wdWxhdGlvbi4NClZBUlBBCQkJPSBWQVJQQQkJCQkjIwlDYWxjdWxlIGxhIHZhcmlhbmNlIGTigJl1bmUgcG9wdWxhdGlvbiBlbiBzZSBiYXNhbnQgc3VyIGxhIHBvcHVsYXRpb24gZW50acOocmUsIG5vbWJyZXMsIHRleHRlIGV0IHZhbGV1cnMgbG9naXF1ZXMgaW5jbHVzLg0KV0VJQlVMTAkJCT0gTE9JLldFSUJVTEwJCQkjIwlSZW52b2llIGxhIHByb2JhYmlsaXTDqSBk4oCZdW5lIHZhcmlhYmxlIGFsw6lhdG9pcmUgc3VpdmFudCB1bmUgbG9pIGRlIFdlaWJ1bGwuDQpaVEVTVAkJCT0gVEVTVC5aCQkJIyMJUmVudm9pZSBsYSB2YWxldXIgZGUgcHJvYmFiaWxpdMOpIHVuaWxhdMOpcmFsZSBk4oCZdW4gdGVzdCB6Lg0KDQoNCiMjDQojIwlUZXh0IGZ1bmN0aW9ucwkJCQkJRm9uY3Rpb25zIGRlIHRleHRlDQojIw0KQVNDCQkJPSBBU0MJCQkJIyMJQ2hhbmdlIGxlcyBjYXJhY3TDqHJlcyBhbmdsYWlzIG91IGthdGFrYW5hIMOgIHBsZWluZSBjaGFzc2UgKGNvZMOpcyBzdXIgZGV1eCBvY3RldHMpIMOgIGzigJlpbnTDqXJpZXVyIGTigJl1bmUgY2hhw65uZSBkZSBjYXJhY3TDqHJlcyBlbiBjYXJhY3TDqHJlcyDDoCBkZW1pLWNoYXNzZSAoY29kw6lzIHN1ciB1biBvY3RldCkuDQpCQUhUVEVYVAkJPSBCQUhUVEVYVAkJCSMjCUNvbnZlcnRpdCB1biBub21icmUgZW4gdGV4dGUgZW4gdXRpbGlzYW50IGxlIGZvcm1hdCBtb27DqXRhaXJlIMOfIChiYWh0KS4NCkNIQVIJCQk9IENBUgkJCQkjIwlSZW52b2llIGxlIGNhcmFjdMOocmUgc3DDqWNpZmnDqSBwYXIgbGUgY29kZSBudW3DqXJpcXVlLg0KQ0xFQU4JCQk9IEVQVVJBR0UJCQkjIwlTdXBwcmltZSB0b3VzIGxlcyBjYXJhY3TDqHJlcyBkZSBjb250csO0bGUgZHUgdGV4dGUuDQpDT0RFCQkJPSBDT0RFCQkJCSMjCVJlbnZvaWUgbGUgbnVtw6lybyBkZSBjb2RlIGR1IHByZW1pZXIgY2FyYWN0w6hyZSBkdSB0ZXh0ZS4NCkNPTkNBVEVOQVRFCQk9IENPTkNBVEVORVIJCQkjIwlBc3NlbWJsZSBwbHVzaWV1cnMgw6lsw6ltZW50cyB0ZXh0dWVscyBkZSBmYcOnb24gw6AgbuKAmWVuIGZvcm1lciBxdeKAmXVuIHNldWwuDQpET0xMQVIJCQk9IEVVUk8JCQkJIyMJQ29udmVydGl0IHVuIG5vbWJyZSBlbiB0ZXh0ZSBlbiB1dGlsaXNhbnQgbGUgZm9ybWF0IG1vbsOpdGFpcmUg4oKsIChldXJvKS4NCkVYQUNUCQkJPSBFWEFDVAkJCQkjIwlWw6lyaWZpZSBzaSBkZXV4IHZhbGV1cnMgZGUgdGV4dGUgc29udCBpZGVudGlxdWVzLg0KRklORAkJCT0gVFJPVVZFCQkJIyMJVHJvdXZlIHVuIHZhbGV1ciB0ZXh0dWVsbGUgZGFucyB1bmUgYXV0cmUsIGVuIHJlc3BlY3RhbnQgbGEgY2Fzc2UuDQpGSU5EQgkJCT0gVFJPVVZFUkIJCQkjIwlUcm91dmUgdW4gdmFsZXVyIHRleHR1ZWxsZSBkYW5zIHVuZSBhdXRyZSwgZW4gcmVzcGVjdGFudCBsYSBjYXNzZS4NCkZJWEVECQkJPSBDVFhUCQkJCSMjCUNvbnZlcnRpdCB1biBub21icmUgYXUgZm9ybWF0IHRleHRlIGF2ZWMgdW4gbm9tYnJlIGRlIGTDqWNpbWFsZXMgc3DDqWNpZmnDqS4NCkpJUwkJCT0gSklTCQkJCSMjCUNoYW5nZSBsZXMgY2FyYWN0w6hyZXMgYW5nbGFpcyBvdSBrYXRha2FuYSDDoCBkZW1pLWNoYXNzZSAoY29kw6lzIHN1ciB1biBvY3RldCkgw6AgbOKAmWludMOpcmlldXIgZOKAmXVuZSBjaGHDrm5lIGRlIGNhcmFjdMOocmVzIGVuIGNhcmFjdMOocmVzIMOgIMOgIHBsZWluZSBjaGFzc2UgKGNvZMOpcyBzdXIgZGV1eCBvY3RldHMpLg0KTEVGVAkJCT0gR0FVQ0hFCQkJIyMJUmVudm9pZSBkZXMgY2FyYWN0w6hyZXMgc2l0dcOpcyDDoCBs4oCZZXh0csOqbWUgZ2F1Y2hlIGTigJl1bmUgY2hhw65uZSBkZSBjYXJhY3TDqHJlcy4NCkxFRlRCCQkJPSBHQVVDSEVCCQkJIyMJUmVudm9pZSBkZXMgY2FyYWN0w6hyZXMgc2l0dcOpcyDDoCBs4oCZZXh0csOqbWUgZ2F1Y2hlIGTigJl1bmUgY2hhw65uZSBkZSBjYXJhY3TDqHJlcy4NCkxFTgkJCT0gTkJDQVIJCQkJIyMJUmVudm9pZSBsZSBub21icmUgZGUgY2FyYWN0w6hyZXMgY29udGVudXMgZGFucyB1bmUgY2hhw65uZSBkZSB0ZXh0ZS4NCkxFTkIJCQk9IExFTkIJCQkJIyMJUmVudm9pZSBsZSBub21icmUgZGUgY2FyYWN0w6hyZXMgY29udGVudXMgZGFucyB1bmUgY2hhw65uZSBkZSB0ZXh0ZS4NCkxPV0VSCQkJPSBNSU5VU0NVTEUJCQkjIwlDb252ZXJ0aXQgbGUgdGV4dGUgZW4gbWludXNjdWxlcy4NCk1JRAkJCT0gU1RYVAkJCQkjIwlSZW52b2llIHVuIG5vbWJyZSBkw6l0ZXJtaW7DqSBkZSBjYXJhY3TDqHJlcyBk4oCZdW5lIGNoYcOubmUgZGUgdGV4dGUgw6AgcGFydGlyIGRlIGxhIHBvc2l0aW9uIHF1ZSB2b3VzIGluZGlxdWV6Lg0KTUlEQgkJCT0gU1RYVEIJCQkJIyMJUmVudm9pZSB1biBub21icmUgZMOpdGVybWluw6kgZGUgY2FyYWN0w6hyZXMgZOKAmXVuZSBjaGHDrm5lIGRlIHRleHRlIMOgIHBhcnRpciBkZSBsYSBwb3NpdGlvbiBxdWUgdm91cyBpbmRpcXVlei4NClBIT05FVElDCQk9IFBIT05FVElRVUUJCQkjIwlFeHRyYWl0IGxlcyBjYXJhY3TDqHJlcyBwaG9uw6l0aXF1ZXMgKGZ1cmlnYW5hKSBk4oCZdW5lIGNoYcOubmUgZGUgdGV4dGUuDQpQUk9QRVIJCQk9IE5PTVBST1BSRQkJCSMjCU1ldCBlbiBtYWp1c2N1bGVzIGxhIHByZW1pw6hyZSBsZXR0cmUgZGUgY2hhcXVlIG1vdCBkYW5zIHVuZSBjaGHDrm5lIHRleHR1ZWxsZS4NClJFUExBQ0UJCQk9IFJFTVBMQUNFUgkJCSMjCVJlbXBsYWNlIGRlcyBjYXJhY3TDqHJlcyBkYW5zIHVuIHRleHRlLg0KUkVQTEFDRUIJCT0gUkVNUExBQ0VSQgkJCSMjCVJlbXBsYWNlIGRlcyBjYXJhY3TDqHJlcyBkYW5zIHVuIHRleHRlLg0KUkVQVAkJCT0gUkVQVAkJCQkjIwlSw6lww6h0ZSB1biB0ZXh0ZSB1biBjZXJ0YWluIG5vbWJyZSBkZSBmb2lzLg0KUklHSFQJCQk9IERST0lURQkJCSMjCVJlbnZvaWUgZGVzIGNhcmFjdMOocmVzIHNpdHXDqXMgw6AgbOKAmWV4dHLDqm1lIGRyb2l0ZSBk4oCZdW5lIGNoYcOubmUgZGUgY2FyYWN0w6hyZXMuDQpSSUdIVEIJCQk9IERST0lURUIJCQkjIwlSZW52b2llIGRlcyBjYXJhY3TDqHJlcyBzaXR1w6lzIMOgIGzigJlleHRyw6ptZSBkcm9pdGUgZOKAmXVuZSBjaGHDrm5lIGRlIGNhcmFjdMOocmVzLg0KU0VBUkNICQkJPSBDSEVSQ0hFCQkJIyMJVHJvdXZlIHVuIHRleHRlIGRhbnMgdW4gYXV0cmUgdGV4dGUgKHNhbnMgcmVzcGVjdGVyIGxhIGNhc3NlKS4NClNFQVJDSEIJCQk9IENIRVJDSEVSQgkJCSMjCVRyb3V2ZSB1biB0ZXh0ZSBkYW5zIHVuIGF1dHJlIHRleHRlIChzYW5zIHJlc3BlY3RlciBsYSBjYXNzZSkuDQpTVUJTVElUVVRFCQk9IFNVQlNUSVRVRQkJCSMjCVJlbXBsYWNlIGzigJlhbmNpZW4gdGV4dGUgZOKAmXVuZSBjaGHDrm5lIGRlIGNhcmFjdMOocmVzIHBhciB1biBub3V2ZWF1Lg0KVAkJCT0gVAkJCQkjIwlDb252ZXJ0aXQgc2VzIGFyZ3VtZW50cyBlbiB0ZXh0ZS4NClRFWFQJCQk9IFRFWFRFCQkJCSMjCUNvbnZlcnRpdCB1biBub21icmUgYXUgZm9ybWF0IHRleHRlLg0KVFJJTQkJCT0gU1VQUFJFU1BBQ0UJCQkjIwlTdXBwcmltZSBsZXMgZXNwYWNlcyBkdSB0ZXh0ZS4NClVQUEVSCQkJPSBNQUpVU0NVTEUJCQkjIwlDb252ZXJ0aXQgbGUgdGV4dGUgZW4gbWFqdXNjdWxlcy4NClZBTFVFCQkJPSBDTlVNCQkJCSMjCUNvbnZlcnRpdCB1biBhcmd1bWVudCB0ZXh0dWVsIGVuIG5vbWJyZQ0K]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/locale/hu/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/locale/hu/config</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[77u/IyMNCiMjIFBIUEV4Y2VsDQojIw0NCiMjIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTEgUEhQRXhjZWwNCiMjDQojIyBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yDQojIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljDQojIyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXINCiMjIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLg0KIyMNCiMjIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLA0KIyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YNCiMjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VDQojIyBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLg0KIyMNCiMjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMNCiMjIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUNCiMjIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQ0KIyMNCiMjIEBjYXRlZ29yeSAgIFBIUEV4Y2VsDQojIyBAcGFja2FnZSAgICBQSFBFeGNlbF9TZXR0aW5ncw0KIyMgQGNvcHlyaWdodCAgQ29weXJpZ2h0IChjKSAyMDA2IC0gMjAxMSBQSFBFeGNlbCAoaHR0cDovL3d3dy5jb2RlcGxleC5jb20vUEhQRXhjZWwpDQojIyBAbGljZW5zZSAgICBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvb2xkLWxpY2Vuc2VzL2xncGwtMi4xLnR4dAlMR1BMDQojIyBAdmVyc2lvbiAgICAxLjcuNywgMjAxMi0wNS0xOQ0KIyMNCiMjDQoNCg0KQXJndW1lbnRTZXBhcmF0b3IJPSA7DQoNCg0KIyMNCiMjCShGb3IgZnV0dXJlIHVzZSkNCiMjDQpjdXJyZW5jeVN5bWJvbAk9IEZ0DQoNCg0KIyMNCiMjCUV4Y2VsIEVycm9yIENvZGVzCShGb3IgZnV0dXJlIHVzZSkNCiMjDQpOVUxMCT0gI05VTExBIQ0KRElWMAk9ICNaw4lSw5NPU1pUw5MhDQpWQUxVRQk9ICPDiVJUw4lLIQ0KUkVGCT0gI0hJViENCk5BTUUJPSAjTsOJVj8NCk5VTQk9ICNTWsOBTSENCk5BCT0gI0hJw4FOWVpJSw0K]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/locale/hu/functions</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[77u/IyMNCiMjIFBIUEV4Y2VsDQojIw0NCiMjIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTEgUEhQRXhjZWwNCiMjDQojIyBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yDQojIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljDQojIyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXINCiMjIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLg0KIyMNCiMjIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLA0KIyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YNCiMjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VDQojIyBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLg0KIyMNCiMjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMNCiMjIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUNCiMjIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQ0KIyMNCiMjIEBjYXRlZ29yeSAgIFBIUEV4Y2VsDQojIyBAcGFja2FnZSAgICBQSFBFeGNlbF9DYWxjdWxhdGlvbg0KIyMgQGNvcHlyaWdodCAgQ29weXJpZ2h0IChjKSAyMDA2IC0gMjAxMSBQSFBFeGNlbCAoaHR0cDovL3d3dy5jb2RlcGxleC5jb20vUEhQRXhjZWwpDQojIyBAbGljZW5zZSAgICBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvb2xkLWxpY2Vuc2VzL2xncGwtMi4xLnR4dAlMR1BMDQojIyBAdmVyc2lvbiAgICAxLjcuNywgMjAxMi0wNS0xOQ0KIyMNCiMjIERhdGEgaW4gdGhpcyBmaWxlIGRlcml2ZWQgZnJvbSBodHRwOi8vd3d3LnBpdWhhLmZpL2V4Y2VsLWZ1bmN0aW9uLW5hbWUtdHJhbnNsYXRpb24vDQojIw0KIyMNCg0KDQojIw0KIyMJQWRkLWluIGFuZCBBdXRvbWF0aW9uIGZ1bmN0aW9ucwkJCULFkXbDrXRtw6lueWVrIMOpcyBhdXRvbWF0aXrDoWzDoXNpIGbDvGdndsOpbnllaw0KIyMNCkdFVFBJVk9UREFUQQkJPSBLSU1VVEFUw4FTQURBVE9ULlZFU1oJCSMjCUEga2ltdXRhdMOhc29rYmFuIHTDoXJvbHQgYWRhdG9rIHZpc3N6YWFkw6Fzw6FyYSBoYXN6bsOhbGhhdMOzLg0KDQoNCiMjDQojIwlDdWJlIGZ1bmN0aW9ucyBLb2NrYWbDvGdndsOpbnllayAgIA0KIyMNCkNVQkVLUElNRU1CRVIJCT0gS09DS0EuRsWQVEVMSk1VVAkJIyMJRWd5IGbFkSB0ZWxqZXPDrXRtw6lueW11dGF0w7MgKEtQSSkgbmV2w6l0LCB0dWxhamRvbnPDoWfDoXQgw6lzIG3DqXJ0w6lrZWd5c8OpZ8OpdCBhZGphIGVyZWRtw6luecO8bCwgYSBuZXZldCDDqXMgYSB0dWxhamRvbnPDoWdvdCBtZWdqZWxlbsOtdGkgYSBjZWxsw6FiYW4uIEEgS1BJLWsgc3rDoW1zemVyxbFzw610aGV0xZEgbcOpcsOpc2kgbGVoZXTFkXPDqWdldCBqZWxlbnRlbmVrIOKAkyBpbHllbiBtdXRhdMOzIHDDqWxkw6F1bCBhIGhhdmkgYnJ1dHTDsyBueWVyZXPDqWcgdmFneSBheiBlZ3kgYWxrYWxtYXpvdHRyYSBqdXTDsyBuZWd5ZWTDqXZlcyBmb3JnYWxvbSDigJMsIGVneSBzemVydmV6ZXQgdGVsamVzw610bcOpbnnDqW5layBueW9tb25rw7Z2ZXTDqXPDqXJlIGhhc3puw6FsaGF0w7NrLg0KQ1VCRU1FTUJFUgkJPSBLT0NLQS5UQUcJCQkjIwlLb2NrYWhpZXJhY2hpYSB0YWdqw6F0IHZhZ3kgcmVrb3JkasOhdCBhZGphIGVyZWRtw6luecO8bC4gRWxsZW7FkXJpemhldMWRIHZlbGUsIGhvZ3kgc3plcmVwZWwtZSBhIGtvY2vDoWJhbiBheiBhZG90dCB0YWcgdmFneSByZWtvcmQuDQpDVUJFTUVNQkVSUFJPUEVSVFkJPSBLT0NLQS5UQUcuVFVMCQkJIyMJQSBrb2NrYSBlZ3lpayB0YWd0dWxhamRvbnPDoWfDoW5hayDDqXJ0w6lrw6l0IGFkamEgZXJlZG3DqW55w7xsLiBIYXN6bsOhbGF0w6F2YWwgZWxsZW7FkXJpemhldMWRLCBob2d5IHN6ZXJlcGVsLWUgZWd5IHRhZ27DqXYgYSBrb2Nrw6FiYW4sIGVyZWRtw6lueWUgcGVkaWcgYXogZXJyZSBhIHRhZ3JhIHZvbmF0a296w7MsIG1lZ2Fkb3R0IHR1bGFqZG9uc8OhZy4NCkNVQkVSQU5LRURNRU1CRVIJPSBLT0NLQS5IQUxNLkVMRU0JCSMjCUVneSBoYWxtYXogcmFuZ3NvciBzemVyaW50aSBuLWVkaWsgdGFnasOhdCBhZGphIGVyZWRtw6luecO8bC4gSGFzem7DoWxhdMOhdmFsIGVneSBoYWxtYXogZWd5IHZhZ3kgdMO2YmIgZWxlbcOpdCBrYXBoYXRqYSBtZWcsIHDDqWxkw6F1bCBhIGxlZ25hZ3lvYmIgdGVsamVzw610bcOpbnnFsSDDvHpsZXRrw7Z0xZF0IHZhZ3kgYSAxMCBsZWdqb2JiIHRhbnVsw7N0Lg0KQ1VCRVNFVAkJCT0gS09DS0EuSEFMTQkJCSMjCVN6w6Ftw610b3R0IHRhZ29rIHZhZ3kgcmVrb3Jkb2sgaGFsbWF6w6F0IGFkamEgZXJlZG3DqW55w7xsLCBlaGhleiBlZ3kgYmXDoWxsw610b3R0IGtpZmVqZXrDqXN0IGVsa8O8bGQgYSBraXN6b2xnw6Fsw7NuIHRhbMOhbGhhdMOzIGtvY2vDoW5haywgbWFqZCBlenQgYSBoYWxtYXp0IGFkamEgdmlzc3phIGEgTWljcm9zb2Z0IE9mZmljZSBFeGNlbCBhbGthbG1hesOhc25hay4NCkNVQkVTRVRDT1VOVAkJPSBLT0NLQS5IQUxNLkRCCQkJIyMJRWd5IGhhbG1heiBlbGVtc3rDoW3DoXQgYWRqYSBlcmVkbcOpbnnDvGwuDQpDVUJFVkFMVUUJCT0gS09DS0Euw4lSVMOJSwkJCSMjCUtvY2vDoWLDs2wgw7Zzc3plc8OtdGV0dCDDqXJ0w6lrZXQgYWQgZXJlZG3DqW55w7xsLg0KDQoNCiMjDQojIwlEYXRhYmFzZSBmdW5jdGlvbnMJCQkJQWRhdGLDoXppcy1rZXplbMWRIGbDvGdndsOpbnllaw0KIyMNCkRBVkVSQUdFCQk9IEFCLsOBVExBRwkJCSMjCUEga2lqZWzDtmx0IGFkYXRiw6F6aXNlbGVtZWsgw6F0bGFnw6F0IHN6w6Ftw610amEga2kuDQpEQ09VTlQJCQk9IEFCLkRBUkFCCQkJIyMJTWVnc3rDoW1vbGphLCBob2d5IGF6IGFkYXRiw6F6aXNiYW4gaMOhbnkgY2VsbGEgdGFydGFsbWF6IHN6w6Ftb2thdC4NCkRDT1VOVEEJCQk9IEFCLkRBUkFCMgkJCSMjCU1lZ3N6w6Ftb2xqYSBheiBhZGF0YsOhemlzYmFuIGzDqXbFkSBuZW0gw7xyZXMgY2VsbMOha2F0Lg0KREdFVAkJCT0gQUIuTUVaxZAJCQkjIwlFZ3kgYWRhdGLDoXppc2LDs2wgZWd5ZXRsZW4gb2x5YW4gcmVrb3Jkb3QgYWQgdmlzc3phLCBhbWVseSBtZWdmZWxlbCBhIG1lZ2Fkb3R0IGZlbHTDqXRlbGVrbmVrLg0KRE1BWAkJCT0gQUIuTUFYCQkJIyMJQSBraXbDoWxhc3p0b3R0IGFkYXRiw6F6aXNlbGVtZWsga8O2esO8bCBhIGxlZ25hZ3lvYmIgw6lydMOpa2V0IGFkamEgZXJlZG3DqW55w7xsLg0KRE1JTgkJCT0gQUIuTUlOCQkJIyMJQSBraWplbMO2bHQgYWRhdGLDoXppc2VsZW1layBrw7Z6w7xsIGEgbGVna2lzZWJiIMOpcnTDqWtldCBhZGphIGVyZWRtw6luecO8bC4NCkRQUk9EVUNUCQk9IEFCLlNaT1JaQVQJCQkjIwlBeiBhZGF0YsOhemlzIG1lZ2Fkb3R0IGZlbHTDqXRlbGVrbmVrIGVsZWdldCB0ZXbFkSByZWtvcmRqYWlyYSDDtnNzemVzem9yb3p6YSBhIG1lZ2Fkb3R0IG1lesWRYmVuIHRhbMOhbGhhdMOzIHN6w6Ftw6lydMOpa2VrZXQsIMOpcyBlcmVkbcOpbnnDvGwgZXp0IGEgc3pvcnphdG90IGFkamEuDQpEU1RERVYJCQk9IEFCLlNaw5NSw4FTCQkJIyMJQSBraWplbMO2bHQgYWRhdGLDoXppc2VsZW1layBlZ3kgbWludMOhamEgYWxhcGrDoW4gbWVnYmVjc8O8bGkgYSBzesOzcsOhc3QuDQpEU1RERVZQCQkJPSBBQi5TWsOTUsOBUzIJCQkjIwlBIGtpamVsw7ZsdCBhZGF0YsOhemlzZWxlbWVrIHRlbGplcyBzb2thc8OhZ2EgYWxhcGrDoW4ga2lzesOhbcOtdGphIGEgc3rDs3LDoXN0Lg0KRFNVTQkJCT0gQUIuU1pVTQkJCSMjCcOWc3N6ZWFkamEgYSBmZWx0w6l0ZWxuZWsgbWVnZmVsZWzFkSBhZGF0YsOhemlzcmVrb3Jkb2sgbWV6xZFvc3psb3DDoWJhbiBhIHN6w6Ftb2thdC4NCkRWQVIJCQk9IEFCLlZBUgkJCSMjCUEga2lqZWzDtmx0IGFkYXRiw6F6aXNlbGVtZWsgbWludMOhamEgYWxhcGrDoW4gYmVjc2zDqXN0IGFkIGEgc3rDs3LDoXNuw6lneXpldHJlLg0KRFZBUlAJCQk9IEFCLlZBUjIJCQkjIwlBIGtpamVsw7ZsdCBhZGF0YsOhemlzZWxlbWVrIHRlbGplcyBzb2thc8OhZ2EgYWxhcGrDoW4ga2lzesOhbcOtdGphIGEgc3rDs3LDoXNuw6lneXpldGV0Lg0KDQoNCiMjDQojIwlEYXRlIGFuZCB0aW1lIGZ1bmN0aW9ucwkJCQlEw6F0dW1mw7xnZ3bDqW55ZWsNCiMjDQpEQVRFCQkJPSBEw4FUVU0JCQkJIyMJQWRvdHQgZMOhdHVtIGTDoXR1bcOpcnTDqWvDqXQgYWRqYSBlcmVkbcOpbnnDvGwuDQpEQVRFVkFMVUUJCT0gRMOBVFVNw4lSVMOJSwkJCSMjCVN6w7Z2ZWdrw6ludCBtZWdhZG90dCBkw6F0dW1vdCBkw6F0dW3DqXJ0w6lra8OpIGFsYWvDrXQgw6F0Lg0KREFZCQkJPSBOQVAJCQkJIyMJRMOhdHVtw6lydMOpa2V0IGEgaMOzbmFwIGVneSBuYXBqw6F2w6EgKDAtMzEpIGFsYWvDrXQuDQpEQVlTMzYwCQkJPSBOQVAzNjAJCQkjIwlLw6l0IGTDoXR1bSBrw7Z6w6kgZXPFkSBuYXBvayBzesOhbcOhdCBzesOhbcOtdGphIGtpIGEgMzYwIG5hcG9zIMOpdiBhbGFwasOhbi4NCkVEQVRFCQkJPSBFREFURQkJCQkjIwlBZG90dCBkw6F0dW1uw6FsIGFkb3R0IHN6w6Ftw7ogaMOzbmFwcGFsIGtvcsOhYmJpIHZhZ3kga8Opc8WRYmJpIGTDoXR1bSBkw6F0dW3DqXJ0w6lrw6l0IGFkamEgZXJlZG3DqW55w7xsLg0KRU9NT05USAkJCT0gRU9NT05USAkJCSMjCUFkb3R0IGTDoXR1bW7DoWwgYWRvdHQgc3rDoW3DuiBow7NuYXBwYWwga29yw6FiYmkgdmFneSBrw6lzxZFiYmkgaMOzbmFwIHV0b2xzw7MgbmFwasOhbmFrIGTDoXR1bcOpcnTDqWvDqXQgYWRqYSBlcmVkbcOpbnnDvGwuDQpIT1VSCQkJPSDDk1JBCQkJCSMjCUlkxZHDqXJ0w6lrZXQgw7Nyw6Fra8OhIGFsYWvDrXQuDQpNSU5VVEUJCQk9IFBFUkMJCQkJIyMJSWTFkcOpcnTDqWtldCBwZXJjZWtrw6kgYWxha8OtdC4NCk1PTlRICQkJPSBIw5NOQVAJCQkJIyMJSWTFkcOpcnTDqWtldCBow7NuYXBva2vDoSBhbGFrw610Lg0KTkVUV09SS0RBWVMJCT0gTkVUV09SS0RBWVMJCQkjIwlLw6l0IGTDoXR1bSBrw7Z6w7Z0dCBhIHRlbGplcyBtdW5rYW5hcG9rIHN6w6Ftw6F0IGFkamEgbWVnLg0KTk9XCQkJPSBNT1NUCQkJCSMjCUEgbmFwaSBkw6F0dW0gZMOhdHVtw6lydMOpa8OpdCDDqXMgYSBwb250b3MgaWTFkSBpZMWRw6lydMOpa8OpdCBhZGphIGVyZWRtw6luecO8bC4NClNFQ09ORAkJCT0gTVBFUkMJCQkJIyMJSWTFkcOpcnTDqWtldCBtw6Fzb2RwZXJjZWtrw6kgYWxha8OtdCDDoXQuDQpUSU1FCQkJPSBJRMWQCQkJCSMjCUFkb3R0IGlkxZFwb250IGlkxZHDqXJ0w6lrw6l0IGFkamEgbWVnLg0KVElNRVZBTFVFCQk9IElExZDDiVJUw4lLCQkJIyMJU3rDtnZlZ2vDqW50IG1lZ2Fkb3R0IGlkxZFwb250b3QgaWTFkcOpcnTDqWtrw6kgYWxha8OtdCDDoXQuDQpUT0RBWQkJCT0gTUEJCQkJIyMJQSBuYXBpIGTDoXR1bSBkw6F0dW3DqXJ0w6lrw6l0IGFkamEgZXJlZG3DqW55w7xsLg0KV0VFS0RBWQkJCT0gSMOJVC5OQVBKQQkJCSMjCUTDoXR1bcOpcnTDqWtldCBhIGjDqXQgbmFwasOhdsOhIGFsYWvDrXRqYSDDoXQuDQpXRUVLTlVNCQkJPSBXRUVLTlVNCQkJIyMJVmlzc3phdMOpcsOpc2kgw6lydMOpa2UgZWd5IHN6w6FtLCBhbWVseSBhenQgbXV0YXRqYSBtZWcsIGhvZ3kgYSBtZWdhZG90dCBkw6F0dW0gYXogw6l2IGjDoW55YWRpayBoZXTDqXJlIGVzaWsuDQpXT1JLREFZCQkJPSBXT1JLREFZCQkJIyMJQWRvdHQgZMOhdHVtbsOhbCBhZG90dCBtdW5rYW5hcHBhbCBrb3LDoWJiaSB2YWd5IGvDqXPFkWJiaSBkw6F0dW0gZMOhdHVtw6lydMOpa8OpdCBhZGphIGVyZWRtw6luecO8bC4NCllFQVIJCQk9IMOJVgkJCQkjIwlTb3JzesOhbW90IMOpdnbDqSBhbGFrw610IMOhdC4NCllFQVJGUkFDCQk9IFlFQVJGUkFDCQkJIyMJQXogYWRvdHQgZMOhdHVtb2sga8O2esO2dHRpIHRlbGplcyBuYXBvayBzesOhbcOhdCB0w7ZydMOpdmvDqW50IGFkamEgbWVnLg0KDQoNCiMjDQojIwlFbmdpbmVlcmluZyBmdW5jdGlvbnMJCQkJTcOpcm7DtmtpIGbDvGdndsOpbnllaw0KIyMNCkJFU1NFTEkJCQk9IEJFU1NFTEkJCQkjIwlBeiBJbih4KSBtw7Nkb3PDrXRvdHQgQmVzc2VsLWbDvGdndsOpbnkgw6lydMOpa8OpdCBhZGphIGVyZWRtw6luecO8bC4NCkJFU1NFTEoJCQk9IEJFU1NFTEoJCQkjIwlBIEpuKHgpIEJlc3NlbC1mw7xnZ3bDqW55IMOpcnTDqWvDqXQgYWRqYSBlcmVkbcOpbnnDvGwuDQpCRVNTRUxLCQkJPSBCRVNTRUxLCQkJIyMJQSBLbih4KSBtw7Nkb3PDrXRvdHQgQmVzc2VsLWbDvGdndsOpbnkgw6lydMOpa8OpdCBhZGphIGVyZWRtw6luecO8bC4NCkJFU1NFTFkJCQk9IEJFU1NFTFkJCQkjIwlBeiBZbih4KSBtw7Nkb3PDrXRvdHQgQmVzc2VsLWbDvGdndsOpbnkgw6lydMOpa8OpdCBhZGphIGVyZWRtw6luecO8bC4NCkJJTjJERUMJCQk9IEJJTjJERUMJCQkjIwlCaW7DoXJpcyBzesOhbW90IGRlY2ltw6FsaXNzw6EgYWxha8OtdCDDoXQuDQpCSU4ySEVYCQkJPSBCSU4ySEVYCQkJIyMJQmluw6FyaXMgc3rDoW1vdCBoZXhhZGVjaW3DoWxpc3PDoSBhbGFrw610IMOhdC4NCkJJTjJPQ1QJCQk9IEJJTjJPQ1QJCQkjIwlCaW7DoXJpcyBzesOhbW90IG9rdMOhbGlzc8OhIGFsYWvDrXQgw6F0Lg0KQ09NUExFWAkJCT0gQ09NUExFWAkJCSMjCVZhbMOzcyDDqXMga8OpcHpldGVzIHLDqXN6YsWRbCBrb21wbGV4IHN6w6Ftb3Qga8OpcGV6Lg0KQ09OVkVSVAkJCT0gQ09OVkVSVAkJCSMjCU3DqXJ0w6lrZWd5c8OpZ2VrZXQgdsOhbHQgw6F0Lg0KREVDMkJJTgkJCT0gREVDMkJJTgkJCSMjCURlY2ltw6FsaXMgc3rDoW1vdCBiaW7DoXJpc3PDoSBhbGFrw610IMOhdC4NCkRFQzJIRVgJCQk9IERFQzJIRVgJCQkjIwlEZWNpbcOhbGlzIHN6w6Ftb3QgaGV4YWRlY2ltw6FsaXNzw6EgYWxha8OtdCDDoXQuDQpERUMyT0NUCQkJPSBERUMyT0NUCQkJIyMJRGVjaW3DoWxpcyBzesOhbW90IG9rdMOhbGlzc8OhIGFsYWvDrXQgw6F0Lg0KREVMVEEJCQk9IERFTFRBCQkJCSMjCUF6dCB2aXpzZ8OhbGphLCBob2d5IGvDqXQgw6lydMOpayBlZ3llbmzFkS1lLg0KRVJGCQkJPSBFUkYJCQkJIyMJQSBoaWJhZsO8Z2d2w6lueSDDqXJ0w6lrw6l0IGFkamEgZXJlZG3DqW55w7xsLg0KRVJGQwkJCT0gRVJGQwkJCQkjIwlBIGtpZWfDqXN6w610ZXR0IGhpYmFmw7xnZ3bDqW55IMOpcnTDqWvDqXQgYWRqYSBlcmVkbcOpbnnDvGwuDQpHRVNURVAJCQk9IEdFU1RFUAkJCSMjCUF6dCB2aXpzZ8OhbGphLCBob2d5IGVneSBzesOhbSBuYWd5b2JiLWUgYWRvdHQga8O8c3rDtmLDqXJ0w6lrbsOpbC4NCkhFWDJCSU4JCQk9IEhFWDJCSU4JCQkjIwlIZXhhZGVjaW3DoWxpcyBzesOhbW90IGJpbsOhcmlzc8OhIGFsYWvDrXQgw6F0Lg0KSEVYMkRFQwkJCT0gSEVYMkRFQwkJCSMjCUhleGFkZWNpbcOhbGlzIHN6w6Ftb3QgZGVjaW3DoWxpc3PDoSBhbGFrw610IMOhdC4NCkhFWDJPQ1QJCQk9IEhFWDJPQ1QJCQkjIwlIZXhhZGVjaW3DoWxpcyBzesOhbW90IG9rdMOhbGlzc8OhIGFsYWvDrXQgw6F0Lg0KSU1BQlMJCQk9IElNQUJTCQkJCSMjCUtvbXBsZXggc3rDoW0gYWJzem9sw7p0IMOpcnTDqWvDqXQgKG1vZHVsdXPDoXQpIGFkamEgZXJlZG3DqW55w7xsLg0KSU1BR0lOQVJZCQk9IElNQUdJTkFSWQkJCSMjCUtvbXBsZXggc3rDoW0ga8OpcHpldGVzIHLDqXN6w6l0IGFkamEgZXJlZG3DqW55w7xsLg0KSU1BUkdVTUVOVAkJPSBJTUFSR1VNRU5UCQkJIyMJQSBrb21wbGV4IHN6w6FtIHJhZGnDoW5iYW4ga2lmZWplemV0dCB0aMOpdGEgYXJndW1lbnR1bcOhdCBhZGphIGVyZWRtw6luecO8bC4NCklNQ09OSlVHQVRFCQk9IElNQ09OSlVHQVRFCQkJIyMJS29tcGxleCBzesOhbSBrb21wbGV4IGtvbmp1Z8OhbHRqw6F0IGFkamEgZXJlZG3DqW55w7xsLg0KSU1DT1MJCQk9IElNQ09TCQkJCSMjCUtvbXBsZXggc3rDoW0ga29zemludXN6w6F0IGFkamEgZXJlZG3DqW55w7xsLg0KSU1ESVYJCQk9IElNRElWCQkJCSMjCUvDqXQga29tcGxleCBzesOhbSBow6FueWFkb3PDoXQgYWRqYSBlcmVkbcOpbnnDvGwuDQpJTUVYUAkJCT0gSU1FWFAJCQkJIyMJQXogZSBzesOhbSBrb21wbGV4IGtpdGV2xZFqxbEgaGF0dsOhbnnDoXQgYWRqYSBlcmVkbcOpbnnDvGwuDQpJTUxOCQkJPSBJTUxOCQkJCSMjCUtvbXBsZXggc3rDoW0gdGVybcOpc3pldGVzIGxvZ2FyaXRtdXPDoXQgYWRqYSBlcmVkbcOpbnnDvGwuDQpJTUxPRzEwCQkJPSBJTUxPRzEwCQkJIyMJS29tcGxleCBzesOhbSB0w616ZXMgYWxhcMO6IGxvZ2FyaXRtdXPDoXQgYWRqYSBlcmVkbcOpbnnDvGwuDQpJTUxPRzIJCQk9IElNTE9HMgkJCSMjCUtvbXBsZXggc3rDoW0ga2V0dGVzIGFsYXDDuiBsb2dhcml0bXVzw6F0IGFkamEgZXJlZG3DqW55w7xsLg0KSU1QT1dFUgkJCT0gSU1QT1dFUgkJCSMjCUtvbXBsZXggc3rDoW0gaGF0dsOhbnnDoXQgYWRqYSBlcmVkbcOpbnnDvGwuDQpJTVBST0RVQ1QJCT0gSU1QUk9EVUNUCQkJIyMJS29tcGxleCBzesOhbW9rIHN6b3J6YXTDoXQgYWRqYSBlcmVkbcOpbnnDvGwuDQpJTVJFQUwJCQk9IElNUkVBTAkJCSMjCUtvbXBsZXggc3rDoW0gdmFsw7NzIHLDqXN6w6l0IGFkamEgZXJlZG3DqW55w7xsLg0KSU1TSU4JCQk9IElNU0lOCQkJCSMjCUtvbXBsZXggc3rDoW0gc3ppbnVzesOhdCBhZGphIGVyZWRtw6luecO8bC4NCklNU1FSVAkJCT0gSU1TUVJUCQkJIyMJS29tcGxleCBzesOhbSBuw6lneXpldGd5w7Zrw6l0IGFkamEgZXJlZG3DqW55w7xsLg0KSU1TVUIJCQk9IElNU1VCCQkJCSMjCUvDqXQga29tcGxleCBzesOhbSBrw7xsw7ZuYnPDqWfDqXQgYWRqYSBlcmVkbcOpbnnDvGwuDQpJTVNVTQkJCT0gSU1TVU0JCQkJIyMJS29tcGxleCBzesOhbW9rIMO2c3N6ZWfDqXQgYWRqYSBlcmVkbcOpbnnDvGwuDQpPQ1QyQklOCQkJPSBPQ1QyQklOCQkJIyMJT2t0w6FsaXMgc3rDoW1vdCBiaW7DoXJpc3PDoSBhbGFrw610IMOhdC4NCk9DVDJERUMJCQk9IE9DVDJERUMJCQkjIwlPa3TDoWxpcyBzesOhbW90IGRlY2ltw6FsaXNzw6EgYWxha8OtdCDDoXQuDQpPQ1QySEVYCQkJPSBPQ1QySEVYCQkJIyMJT2t0w6FsaXMgc3rDoW1vdCBoZXhhZGVjaW3DoWxpc3PDoSBhbGFrw610IMOhdC4NCg0KDQojIw0KIyMJRmluYW5jaWFsIGZ1bmN0aW9ucwkJCQlQw6luesO8Z3lpIGbDvGdndsOpbnllaw0KIyMNCkFDQ1JJTlQJCQk9IEFDQ1JJTlQJCQkjIwlQZXJpb2Rpa3VzYW4ga2FtYXRvesOzIMOpcnTDqWtwYXDDrXIgZmVsc3phcG9yb2RvdHQga2FtYXTDoXQgYWRqYSBlcmVkbcOpbnnDvGwuDQpBQ0NSSU5UTQkJPSBBQ0NSSU5UTQkJCSMjCUxlasOhcmF0a29yIGthbWF0b3rDsyDDqXJ0w6lrcGFww61yIGZlbHN6YXBvcm9kb3R0IGthbWF0w6F0IGFkamEgZXJlZG3DqW55w7xsLg0KQU1PUkRFR1JDCQk9IEFNT1JERUdSQwkJCSMjCcOBbGzDs2VzemvDtnogbGluZcOhcmlzIMOpcnTDqWtjc8O2a2tlbsOpc8OpdCBhZGphIG1lZyBheiBlZ3llcyBrw7ZueXZlbMOpc2kgaWTFkXN6YWtva3JhIHZvbmF0a296w7Nhbi4NCkFNT1JMSU5DCQk9IEFNT1JMSU5DCQkJIyMJQXogZWd5ZXMga8O2bnl2ZWzDqXNpIGlkxZFzemFrb2tiYW4gYXogw6lydMOpa2Nzw7Zra2Vuw6lzdCBhZGphIG1lZy4NCkNPVVBEQVlCUwkJPSBDT1VQREFZQlMJCQkjIwlBIHN6ZWx2w6lueWlkxZFzemFrIGtlemRldMOpdMWRbCBhIGtpZml6ZXTDqXMgaWTFkXBvbnRqw6FpZyBlbHRlbHQgbmFwb2thdCBhZGphIHZpc3N6YS4NCkNPVVBEQVlTCQk9IENPVVBEQVlTCQkJIyMJQSBraWZpemV0w6lzIGlkxZFwb250asOhdCBtYWfDoWJhbiBmb2dsYWzDsyBzemVsdsOpbnlwZXJpw7NkdXMgaG9zc3rDoXQgYWRqYSBtZWcgbmFwb2tiYW4uDQpDT1VQREFZU05DCQk9IENPVVBEQVlTTkMJCQkjIwlBIGtpZml6ZXTDqXMgaWTFkXBvbnRqYSDDqXMgYSBsZWdrw7Z6ZWxlYmJpIHN6ZWx2w6lueWTDoXR1bSBrw7Z6w7Z0dGkgbmFwb2sgc3rDoW3DoXQgYWRqYSBtZWcuDQpDT1VQTkNECQkJPSBDT1VQTkNECQkJIyMJQSBraWZpemV0w6lzdCBrw7Z2ZXTFkSBsZWdlbHPFkSBzemVsdsOpbnlkw6F0dW1vdCBhZGphIGVyZWRtw6luecO8bC4NCkNPVVBOVU0JCQk9IENPVVBOVU0JCQkjIwlBIGtpZml6ZXTDqXMgw6lzIGEgbGVqw6FyYXQgaWTFkXBvbnRqYSBrw7Z6w7Z0dCBraWZpemV0ZW5kxZEgc3plbHbDqW55ZWsgc3rDoW3DoXQgYWRqYSBlcmVkbcOpbnnDvGwuDQpDT1VQUENECQkJPSBDT1VQUENECQkJIyMJQSBraWZpemV0w6lzIGVsxZF0dGkgdXRvbHPDsyBzemVsdsOpbnlkw6F0dW1vdCBhZGphIGVyZWRtw6luecO8bC4NCkNVTUlQTVQJCQk9IENVTUlQTVQJCQkjIwlLw6l0IGZpemV0w6lzaSBpZMWRc3phayBrw7Z6w7Z0dCBraWZpemV0ZXR0IGthbWF0IGhhbG1vem90dCDDqXJ0w6lrw6l0IGFkamEgZXJlZG3DqW55w7xsLg0KQ1VNUFJJTkMJCT0gQ1VNUFJJTkMJCQkjIwlLw6l0IGZpemV0w6lzaSBpZMWRc3phayBrw7Z6w7Z0dCBraWZpemV0ZXR0IHLDqXN6bGV0ZWsgaGFsbW96b3R0IChrYW1hdG90IG5lbSB0YXJ0YWxtYXrDsykgw6lydMOpa8OpdCBhZGphIGVyZWRtw6luecO8bC4NCkRCCQkJPSBLQ1MyCQkJCSMjCUVzemvDtnogYWRvdHQgaWTFkXN6YWsgYWxhdHRpIMOpcnTDqWtjc8O2a2tlbsOpc8OpdCBzesOhbcOtdGphIGtpIGEgbGluZcOhcmlzIGxlw61yw6FzaSBtb2RlbGwgYWxrYWxtYXrDoXPDoXZhbC4NCkREQgkJCT0gS0NTQQkJCQkjIwlFc3prw7Z6IMOpcnTDqWtjc8O2a2tlbsOpc8OpdCBzesOhbcOtdGphIGtpIGFkb3R0IGlkxZFzemFrcmEgdm9uYXRrb3rDs2FuIGEgcHJvZ3Jlc3N6w612IHZhZ3kgZWd5w6liIG1lZ2Fkb3R0IGxlw61yw6FzaSBtb2RlbGwgYWxrYWxtYXrDoXPDoXZhbC4NCkRJU0MJCQk9IERJU0MJCQkJIyMJw4lydMOpa3BhcMOtciBsZXN6w6Ftw610b2zDoXNpIGthbWF0bMOhYsOhdCBhZGphIGVyZWRtw6luecO8bC4NCkRPTExBUkRFCQk9IERPTExBUkRFCQkJIyMJRWd5IGvDtnrDtm5zw6lnZXMgdMO2cnRrw6ludCBtZWdhZG90dCBzesOhbW90IHRpemVkZXMgdMO2cnR0w6kgYWxha8OtdCDDoXQuDQpET0xMQVJGUgkJPSBET0xMQVJGUgkJCSMjCVRpemVkZXMgdMO2cnRrw6ludCBtZWdhZG90dCBzesOhbW90IGvDtnrDtm5zw6lnZXMgdMO2cnR0w6kgYWxha8OtdCDDoXQuDQpEVVJBVElPTgkJPSBEVVJBVElPTgkJCSMjCVBlcmlvZGlrdXMga2FtYXRmaXpldMOpc8WxIMOpcnTDqWtwYXDDrXIgw6l2ZXMga2FtYXTDqXJ6w6lrZW55c8OpZ8OpdCBhZGphIGVyZWRtw6luecO8bC4NCkVGRkVDVAkJCT0gRUZGRUNUCQkJIyMJQXogw6l2ZXMgdMOpbnlsZWdlcyBrYW1hdGzDoWIgw6lydMOpa8OpdCBhZGphIGVyZWRtw6luecO8bC4NCkZWCQkJPSBKQsOJCQkJCSMjCUJlZmVrdGV0w6lzIGrDtnbFkWJlbGkgw6lydMOpa8OpdCBzesOhbcOtdGphIGtpLg0KRlZTQ0hFRFVMRQkJPSBGVlNDSEVEVUxFCQkJIyMJQSBrZXpkxZF0xZFrZSBhZG90dCBrYW1hdGzDoWJhayBzemVyaW50IG1lZ27DtnZlbHQgasO2dsWRYmVsaSDDqXJ0w6lrw6l0IGFkamEgZXJlZG3DqW55w7xsLg0KSU5UUkFURQkJCT0gSU5UUkFURQkJCSMjCUEgbGVqw6FyYXRpZyB0ZWxqZXNlbiBsZWvDtnTDtnR0IMOpcnTDqWtwYXDDrXIga2FtYXRyw6F0w6Fqw6F0IGFkamEgZXJlZG3DqW55w7xsLg0KSVBNVAkJCT0gUlLDiVNaTEVUCQkJIyMJSGl0ZWx0w7ZybGVzenTDqXNlbiBiZWzDvGwgYSB0xZFrZXTDtnJsZXN6dMOpcyBuYWd5c8OhZ8OhdCBzesOhbcOtdGphIGtpIGFkb3R0IGlkxZFzemFrcmEuDQpJUlIJCQk9IEJNUgkJCQkjIwlBIGJlZmVrdGV0w6lzIGJlbHPFkSBtZWd0w6lyw7xsw6lzaSByw6F0w6Fqw6F0IHN6w6Ftw610amEga2kgcMOpbnrDoXJhbWzDoXNob3ouDQpJU1BNVAkJCT0gTFLDiVNaTEVUS0FNQVQJCQkjIwlBIGJlZmVrdGV0w6lzIGFkb3R0IGlkxZFzemFrw6FyYSBmaXpldGV0dCBrYW1hdG90IHN6w6Ftw610amEga2kuDQpNRFVSQVRJT04JCT0gTURVUkFUSU9OCQkJIyMJRWd5IDEwMCBGdCBuw6l2w6lydMOpa8WxIMOpcnTDqWtwYXDDrXIgTWFjYXVsZXktZsOpbGUgbcOzZG9zw610b3R0IGthbWF0w6lyesOpa2VueXPDqWfDqXQgYWRqYSBlcmVkbcOpbnnDvGwuDQpNSVJSCQkJPSBNRUdUw4lSw5xMw4lTCQkJIyMJQSBiZWZla3RldMOpcyBiZWxzxZEgbWVndMOpcsO8bMOpc2kgcsOhdMOhasOhdCBzesOhbcOtdGphIGtpIGEga8O2bHRzw6lnZWsgw6lzIGEgYmV2w6l0ZWxlayBrw7xsw7ZuYsO2esWRIGthbWF0bMOhYmEgbWVsbGV0dC4NCk5PTUlOQUwJCQk9IE5PTUlOQUwJCQkjIwlBeiDDqXZlcyBuw6l2bGVnZXMga2FtYXRsw6FiIMOpcnTDqWvDqXQgYWRqYSBlcmVkbcOpbnnDvGwuDQpOUEVSCQkJPSBQRVIuU1rDgU0JCQkjIwlBIHTDtnJsZXN6dMOpc2kgaWTFkXN6YWtvayBzesOhbcOhdCBhZGphIG1lZy4NCk5QVgkJCT0gTk3DiQkJCQkjIwlCZWZla3RldMOpc2hleiBrYXBjc29sw7Nkw7MgcMOpbnrDoXJhbWzDoXMgbmV0dMOzIGplbGVuw6lydMOpa8OpdCBzesOhbcOtdGphIGtpIGlzbWVydCBww6luesOhcmFtbMOhcyDDqXMga2FtYXRsw6FiIG1lbGxldHQuDQpPRERGUFJJQ0UJCT0gT0RERlBSSUNFCQkJIyMJRWd5IDEwMCBGdCBuw6l2w6lydMOpa8WxLCBhIGZ1dGFtaWTFkSBlbGVqw6luIHTDtnJlZMOpay1pZMWRc3pha29zIMOpcnTDqWtwYXDDrXIgw6Fyw6F0IGFkamEgZXJlZG3DqW55w7xsLg0KT0RERllJRUxECQk9IE9EREZZSUVMRAkJCSMjCUEgZnV0YW1pZMWRIGVsZWrDqW4gdMO2cmVkw6lrLWlkxZFzemFrb3Mgw6lydMOpa3BhcMOtciBob3phbcOhdCBhZGphIGVyZWRtw6luecO8bC4NCk9ERExQUklDRQkJPSBPRERMUFJJQ0UJCQkjIwlFZ3kgMTAwIEZ0IG7DqXbDqXJ0w6lrxbEsIGEgZnV0YW1pZMWRIHbDqWfDqW4gdMO2cmVkw6lrLWlkxZFzemFrb3Mgw6lydMOpa3BhcMOtciDDoXLDoXQgYWRqYSBlcmVkbcOpbnnDvGwuDQpPRERMWUlFTEQJCT0gT0RETFlJRUxECQkJIyMJQSBmdXRhbWlkxZEgdsOpZ8OpbiB0w7ZyZWTDqWstaWTFkXN6YWtvcyDDqXJ0w6lrcGFww61yIGhvemFtw6F0IGFkamEgZXJlZG3DqW55w7xsLg0KUE1UCQkJPSBSw4lTWkxFVAkJCSMjCUEgdMO2cmxlc3p0w6lzaSBpZMWRc3pha3JhIHZvbmF0a296w7MgdMO2cmxlc3p0w6lzaSDDtnNzemVnZXQgc3rDoW3DrXRqYSBraS4NClBQTVQJCQk9IFBSw4lTWkxFVAkJCSMjCUhpdGVsdMO2cmxlc3p0w6lzZW4gYmVsw7xsIGEgdMWRa2V0w7ZybGVzenTDqXMgbmFneXPDoWfDoXQgc3rDoW3DrXRqYSBraSBhZG90dCBpZMWRc3pha3JhLg0KUFJJQ0UJCQk9IFBSSUNFCQkJCSMjCUVneSAxMDAgRnQgbsOpdsOpcnTDqWvFsSwgcGVyaW9kaWt1c2FuIGthbWF0b3rDsyDDqXJ0w6lrcGFww61yIMOhcsOhdCBhZGphIGVyZWRtw6luecO8bC4NClBSSUNFRElTQwkJPSBQUklDRURJU0MJCQkjIwlFZ3kgMTAwIEZ0IG7DqXbDqXJ0w6lrxbEgbGVzesOhbcOtdG9sdCDDqXJ0w6lrcGFww61yIMOhcsOhdCBhZGphIGVyZWRtw6luecO8bC4NClBSSUNFTUFUCQk9IFBSSUNFTUFUCQkJIyMJRWd5IDEwMCBGdCBuw6l2w6lydMOpa8WxLCBhIGxlasOhcmF0a29yIGthbWF0b3rDsyDDqXJ0w6lrcGFww61yIMOhcsOhdCBhZGphIGVyZWRtw6luecO8bC4NClBWCQkJPSBNw4kJCQkJIyMJQmVmZWt0ZXTDqXMgamVsZW5sZWdpIMOpcnTDqWvDqXQgc3rDoW3DrXRqYSBraS4NClJBVEUJCQk9IFLDgVRBCQkJCSMjCUVneSB0w7ZybGVzenTDqXNpIGlkxZFzemFrYmFuIGF6IGVneSBpZMWRc3pha3JhIGVzxZEga2FtYXRsw6FiIG5hZ3lzw6Fnw6F0IHN6w6Ftw610amEga2kuDQpSRUNFSVZFRAkJPSBSRUNFSVZFRAkJCSMjCUEgbGVqw6FyYXRpZyB0ZWxqZXNlbiBsZWvDtnTDtnR0IMOpcnTDqWtwYXDDrXIgbGVqw6FyYXRha29yIGthcG90dCDDtnNzemVnw6l0IGFkamEgZXJlZG3DqW55w7xsLg0KU0xOCQkJPSBMQ1NBCQkJCSMjCVTDoXJneWkgZXN6a8O2eiBlZ3kgaWTFkXN6YWtyYSBlc8WRIGFtb3J0aXrDoWNpw7Nqw6F0IGFkamEgbWVnIGJydXR0w7Mgw6lydMOpayBzemVyaW50aSBsaW5lw6FyaXMgbGXDrXLDoXNpIGt1bGNzb3QgYWxrYWxtYXp2YS4NClNZRAkJCT0gU1lECQkJCSMjCVTDoXJneWkgZXN6a8O2eiDDqXJ0w6lrY3PDtmtrZW7DqXPDqXQgc3rDoW3DrXRqYSBraSBhZG90dCBpZMWRc3pha3JhIGF6IMOpdmVrIHN6w6FtamVnecO2c3N6ZWfDqXZlbCBkb2xnb3rDsyBtw7Nkc3plciBhbGFwasOhbi4NClRCSUxMRVEJCQk9IFRCSUxMRVEJCQkjIwlLaW5jc3TDoXJqZWd5IGvDtnR2w6lueS1lZ3llbsOpcnTDqWvFsSBob3phbcOhdCBhZGphIGVyZWRtw6luecO8bC4NClRCSUxMUFJJQ0UJCT0gVEJJTExQUklDRQkJCSMjCUVneSAxMDAgRnQgbsOpdsOpcnTDqWvFsSBraW5jc3TDoXJqZWd5IMOhcsOhdCBhZGphIGVyZWRtw6luecO8bC4NClRCSUxMWUlFTEQJCT0gVEJJTExZSUVMRAkJCSMjCUtpbmNzdMOhcmplZ3kgaG96YW3DoXQgYWRqYSBlcmVkbcOpbnnDvGwuDQpWREIJCQk9IMOJQ1NSSQkJCQkjIwlUw6FyZ3lpIGVzemvDtnogYW1vcnRpesOhY2nDs2rDoXQgc3rDoW3DrXRqYSBraSBtZWdhZG90dCB2YWd5IHLDqXN6aWTFkXN6YWtyYSBhIGNzw7Zra2VuxZEgZWd5ZW5sZWcgbcOzZHN6ZXLDqW5layBhbGthbG1hesOhc8OhdmFsLg0KWElSUgkJCT0gWElSUgkJCQkjIwnDnHRlbWV6ZXR0IGvDqXN6cMOpbnpmb3JnYWxvbSAoY2FzaCBmbG93KSBiZWxzxZEgbWVndMOpcsO8bMOpc2kga2FtYXRyw6F0w6Fqw6F0IGFkamEgZXJlZG3DqW55w7xsLg0KWE5QVgkJCT0gWE5QVgkJCQkjIwnDnHRlbWV6ZXR0IGvDqXN6cMOpbnpmb3JnYWxvbSAoY2FzaCBmbG93KSBuZXR0w7MgamVsZW5sZWdpIMOpcnTDqWvDqXQgYWRqYSBlcmVkbcOpbnnDvGwuDQpZSUVMRAkJCT0gWUlFTEQJCQkJIyMJUGVyaW9kaWt1c2FuIGthbWF0b3rDsyDDqXJ0w6lrcGFww61yIGhvemFtw6F0IGFkamEgZXJlZG3DqW55w7xsLg0KWUlFTERESVNDCQk9IFlJRUxERElTQwkJCSMjCUxlc3rDoW3DrXRvbHQgw6lydMOpa3BhcMOtciAocMOpbGTDoXVsIGtpbmNzdMOhcmplZ3kpIMOpdmVzIGhvemFtw6F0IGFkamEgZXJlZG3DqW55w7xsLg0KWUlFTERNQVQJCT0gWUlFTERNQVQJCQkjIwlMZWrDoXJhdGtvciBrYW1hdG96w7Mgw6lydMOpa3BhcMOtciDDqXZlcyBob3phbcOhdCBhZGphIGVyZWRtw6luecO8bC4NCg0KDQojIw0KIyMJSW5mb3JtYXRpb24gZnVuY3Rpb25zCQkJCUluZm9ybcOhY2nDs3MgZsO8Z2d2w6lueWVrDQojIw0KQ0VMTAkJCT0gQ0VMTEEJCQkJIyMJRWd5IGNlbGxhIGZvcm3DoXR1bcOhcmEsIGVsaGVseWV6a2Vkw6lzw6lyZSB2YWd5IHRhcnRhbG3DoXJhIHZvbmF0a296w7MgYWRhdG9rYXQgYWQgZXJlZG3DqW55w7xsLg0KRVJST1IuVFlQRQkJPSBISUJBLlTDjVBVUwkJCSMjCUVneSBoaWJhdMOtcHVzaG96IHRhcnRvesOzIHN6w6Ftb3QgYWQgZXJlZG3DqW55w7xsLg0KSU5GTwkJCT0gSU5Gw5MJCQkJIyMJQSByZW5kc3plci0gw6lzIG11bmtha8O2cm55ZXpldCBwaWxsYW5hdG55aSDDoWxsYXBvdMOhcsOzbCBhZCBmZWx2aWzDoWdvc8OtdMOhc3QuDQpJU0JMQU5LCQkJPSDDnFJFUwkJCQkjIwlFcmVkbcOpbnllIElHQVosIGhhIGF6IMOpcnTDqWsgw7xyZXMuDQpJU0VSUgkJCT0gSElCQQkJCQkjIwlFcmVkbcOpbnllIElHQVosIGhhIGF6IMOpcnTDqWsgdmFsYW1lbHlpayBoaWJhw6lydMOpayBhICNIScOBTllaSUsga2l2w6l0ZWzDqXZlbC4NCklTRVJST1IJCQk9IEhJQsOBUwkJCQkjIwlFcmVkbcOpbnllIElHQVosIGhhIGF6IMOpcnTDqWsgdmFsYW1lbHlpayBoaWJhw6lydMOpay4NCklTRVZFTgkJCT0gSVNFVkVOCQkJIyMJRXJlZG3DqW55ZSBJR0FaLCBoYSBhcmd1bWVudHVtYSBww6Fyb3Mgc3rDoW0uDQpJU0xPR0lDQUwJCT0gTE9HSUtBSQkJCSMjCUVyZWRtw6lueWUgSUdBWiwgaGEgYXogw6lydMOpayBsb2dpa2FpIMOpcnTDqWsuDQpJU05BCQkJPSBOSU5DUwkJCQkjIwlFcmVkbcOpbnllIElHQVosIGhhIGF6IMOpcnTDqWsgYSAjSEnDgU5ZWklLIGhpYmHDqXJ0w6lrLg0KSVNOT05URVhUCQk9IE5FTS5TWsOWVkVHCQkJIyMJRXJlZG3DqW55ZSBJR0FaLCBoYSBheiDDqXJ0w6lrIG5lbSBzesO2dmVnLg0KSVNOVU1CRVIJCT0gU1rDgU0JCQkJIyMJRXJlZG3DqW55ZSBJR0FaLCBoYSBheiDDqXJ0w6lrIHN6w6FtLg0KSVNPREQJCQk9IElTT0RECQkJCSMjCUVyZWRtw6lueWUgSUdBWiwgaGEgYXJndW1lbnR1bWEgcMOhcmF0bGFuIHN6w6FtLg0KSVNSRUYJCQk9IEhJVkFUS09aw4FTCQkJIyMJRXJlZG3DqW55ZSBJR0FaLCBoYSBheiDDqXJ0w6lrIGhpdmF0a296w6FzLg0KSVNURVhUCQkJPSBTWsOWVkVHLkUJCQkjIwlFcmVkbcOpbnllIElHQVosIGhhIGF6IMOpcnTDqWsgc3rDtnZlZy4NCk4JCQk9IE4JCQkJIyMJQXJndW1lbnR1bcOhbmFrIMOpcnTDqWvDqXQgc3rDoW1tw6EgYWxha8OtdGphLg0KTkEJCQk9IEhJw4FOWVpJSwkJCSMjCUVyZWRtw6lueWUgYSAjSEnDgU5ZWklLIGhpYmHDqXJ0w6lrLg0KVFlQRQkJCT0gVMONUFVTCQkJCSMjCcOJcnTDqWsgYWRhdHTDrXB1c8OhbmFrIGF6b25vc8OtdMOzc3rDoW3DoXQgYWRqYSBlcmVkbcOpbnnDvGwuDQoNCg0KIyMNCiMjCUxvZ2ljYWwgZnVuY3Rpb25zCQkJCUxvZ2lrYWkgZsO8Z2d2w6lueWVrDQojIw0KQU5ECQkJPSDDiVMJCQkJIyMJRXJlZG3DqW55ZSBJR0FaLCBoYSBtaW5kZW4gYXJndW1lbnR1bWEgSUdBWi4NCkZBTFNFCQkJPSBIQU1JUwkJCQkjIwlBIEhBTUlTIGxvZ2lrYWkgw6lydMOpa2V0IGFkamEgZXJlZG3DqW55w7xsLg0KSUYJCQk9IEhBCQkJCSMjCUxvZ2lrYWkgdml6c2fDoWxhdG90IGhhanQgdsOpZ3JlLg0KSUZFUlJPUgkJCT0gSEFISUJBCQkJIyMJQSBtZWdhZG90dCDDqXJ0w6lrZXQgYWRqYSB2aXNzemEsIGhhIGVneSBrw6lwbGV0IGhpYsOhaG96IHZlemV0OyBtw6FzIGVzZXRiZW4gYSBrw6lwbGV0IMOpcnTDqWvDqXQgYWRqYSBlcmVkbcOpbnnDvGwuDQpOT1QJCQk9IE5FTQkJCQkjIwlBcmd1bWVudHVtYSDDqXJ0w6lrw6luZWsgZWxsZW50ZXR0asOpdCBhZGphIGVyZWRtw6luecO8bC4NCk9SCQkJPSBWQUdZCQkJCSMjCUVyZWRtw6lueWUgSUdBWiwgaGEgYsOhcm1lbHkgYXJndW1lbnR1bWEgSUdBWi4NClRSVUUJCQk9IElHQVoJCQkJIyMJQXogSUdBWiBsb2dpa2FpIMOpcnTDqWtldCBhZGphIGVyZWRtw6luecO8bC4NCg0KDQojIw0KIyMJTG9va3VwIGFuZCByZWZlcmVuY2UgZnVuY3Rpb25zCQkJS2VyZXPDqXNpIMOpcyBoaXZhdGtvesOhc2kgZsO8Z2d2w6lueWVrDQojIw0KQUREUkVTUwkJCT0gQ8ONTQkJCQkjIwlBIG11bmthbGFwIGVneSBjZWxsw6Fqw6FyYSB2YWzDsyBoaXZhdGtvesOhc3QgYWRqYSBzesO2dmVna8OpbnQgZXJlZG3DqW55w7xsLg0KQVJFQVMJCQk9IFRFUsOcTEVUCQkJIyMJSGl2YXRrb3rDoXNiYW4gYSB0ZXLDvGxldGVrIHN6w6Ftw6F0IGFkamEgZXJlZG3DqW55w7xsLg0KQ0hPT1NFCQkJPSBWw4FMQVNaVAkJCSMjCcOJcnTDqWtlayBsaXN0w6Fqw6Fiw7NsIHbDoWxhc3p0IGtpIGVneSBlbGVtZXQuDQpDT0xVTU4JCQk9IE9TWkxPUAkJCSMjCUVneSBoaXZhdGtvesOhcyBvc3psb3BzesOhbcOhdCBhZGphIGVyZWRtw6luecO8bC4NCkNPTFVNTlMJCQk9IE9TWkxPUE9LCQkJIyMJQSBoaXZhdGtvesOhc2JhbiB0YWzDoWxoYXTDsyBvc3psb3BvayBzesOhbcOhdCBhZGphIGVyZWRtw6luecO8bC4NCkhMT09LVVAJCQk9IFZLRVJFUwkJCSMjCUEgbWVnYWRvdHQgdMO2bWIgZmVsc8WRIHNvcsOhYmFuIGFkb3R0IMOpcnTDqWvFsSBlbGVtZXQga2VyZXMsIMOpcyBhIG1lZ3RhbMOhbHQgZWxlbSBvc3psb3DDoWLDs2wgYWRvdHQgc29yYmFuIGVsaGVseWV6a2VkxZEgw6lydMOpa2tlbCB0w6lyIHZpc3N6YS4NCkhZUEVSTElOSwkJPSBISVBFUkhJVkFUS09aw4FTCQkjIwlIw6Fsw7N6YXRpIGtpc3pvbGfDoWzDs24sIGludHJhbmV0ZW4gdmFneSBheiBpbnRlcm5ldGVuIHTDoXJvbHQgZG9rdW1lbnR1bW90IG1lZ255aXTDsyBwYXJhbmNzaWtvbnQgdmFneSBoaXZhdGtvesOhc3QgaG96IGzDqXRyZS4NCklOREVYCQkJPSBJTkRFWAkJCQkjIwlUw7ZtYi0gdmFneSBoaXZhdGtvesOhcyBpbmRleHN6ZWwgbWVnYWRvdHQgw6lydMOpa8OpdCBhZGphIHZpc3N6YS4NCklORElSRUNUCQk9IElORElSRUtUCQkJIyMJU3rDtnZlZyBtZWdhZG90dCBoaXZhdGtvesOhc3QgYWQgZXJlZG3DqW55w7xsLg0KTE9PS1VQCQkJPSBLRVJFUwkJCQkjIwlWZWt0b3JiYW4gdmFneSB0w7ZtYmJlbiBrZXJlcyBtZWcgw6lydMOpa2VrZXQuDQpNQVRDSAkJCT0gSE9MLlZBTgkJCSMjCUhpdmF0a296w6FzYmFuIHZhZ3kgdMO2bWJiZW4gw6lydMOpa2VrZXQga2VyZXMuDQpPRkZTRVQJCQk9IE9GU1pFVAkJCSMjCUhpdmF0a296w6FzIGVneSBtw6FzaWsgaGl2YXRrb3rDoXN0w7NsIHN6w6Ftw610b3R0IHTDoXZvbHPDoWfDoXQgYWRqYSBtZWcuDQpST1cJCQk9IFNPUgkJCQkjIwlFZ3kgaGl2YXRrb3rDoXMgc29yw6FuYWsgc3rDoW3DoXQgYWRqYSBtZWcuDQpST1dTCQkJPSBTT1JPSwkJCQkjIwlFZ3kgaGl2YXRrb3rDoXMgc29yYWluYWsgc3rDoW3DoXQgYWRqYSBtZWcuDQpSVEQJCQk9IFJURAkJCQkjIwlWYWzDs3MgaWRlasWxIGFkYXRva2F0IGtlcmVzIHZpc3N6YSBhIENPTSBhdXRvbWF0aXptdXN0IChhdXRvbWF0aXrDoWzDoXM6IEVneSBhbGthbG1hesOhcyBvYmpla3R1bWFpdmFsIHZhbMOzIG11bmthIG3DoXNpayBhbGthbG1hesOhc2LDs2wgdmFneSBmZWpsZXN6dMWRZXN6a8O2emLFkWwuIEEga29yw6FiYmFuIE9MRSBhdXRvbWF0aXptdXNuYWsgbmV2ZXpldHQgYXV0b21hdGl6w6Fsw6FzIGlwYXLDoWdpIHN6YWJ2w6FueSwgYSBDb21wb25lbnQgT2JqZWN0IE1vZGVsIChDT00pIHN6b2xnw6FsdGF0w6FzYS4pIHTDoW1vZ2F0w7MgcHJvZ3JhbWLDs2wuDQpUUkFOU1BPU0UJCT0gVFJBTlNaUE9Ow4FMw4FTCQkJIyMJRWd5IHTDtm1iIHRyYW5zenBvbsOhbHRqw6F0IGFkamEgZXJlZG3DqW55w7xsLg0KVkxPT0tVUAkJCT0gRktFUkVTCQkJIyMJQSBtZWdhZG90dCB0w7ZtYiBiYWwgc3rDqWxzxZEgb3N6bG9ww6FiYW4gbWVna2VyZXMgZWd5IMOpcnTDqWtldCwgbWFqZCBhbm5hayBzb3JhIMOpcyBhIG1lZ2Fkb3R0IG9zemxvcCBtZXRzesOpc3BvbnRqw6FiYW4gbGV2xZEgw6lydMOpa2VkIGFkamEgZXJlZG3DqW55w7xsLg0KDQoNCiMjDQojIwlNYXRoIGFuZCB0cmlnb25vbWV0cnkgZnVuY3Rpb25zCQkJTWF0ZW1hdGlrYWkgw6lzIHRyaWdvbm9tZXRyaWt1cyBmw7xnZ3bDqW55ZWsNCiMjDQpBQlMJCQk9IEFCUwkJCQkjIwlFZ3kgc3rDoW0gYWJzem9sw7p0IMOpcnTDqWvDqXQgYWRqYSBlcmVkbcOpbnnDvGwuDQpBQ09TCQkJPSBBUkNDT1MJCQkjIwlFZ3kgc3rDoW0gYXJrdXN6IGtvc3ppbnVzesOhdCBzesOhbcOtdGphIGtpLg0KQUNPU0gJCQk9IEFDT1NICQkJCSMjCUVneSBzesOhbSBpbnZlcnoga29zemludXN6IGhpcGVyYm9saWt1c3rDoXQgc3rDoW3DrXRqYSBraS4NCkFTSU4JCQk9IEFSQ1NJTgkJCSMjCUVneSBzesOhbSBhcmt1c3ogc3ppbnVzesOhdCBzesOhbcOtdGphIGtpLg0KQVNJTkgJCQk9IEFTSU5ICQkJCSMjCUVneSBzesOhbSBpbnZlcnogc3ppbnVzeiBoaXBlcmJvbGlrdXN6w6F0IHN6w6Ftw610amEga2kuDQpBVEFOCQkJPSBBUkNUQU4JCQkjIwlFZ3kgc3rDoW0gYXJrdXN6IHRhbmdlbnPDqXQgc3rDoW3DrXRqYSBraS4NCkFUQU4yCQkJPSBBUkNUQU4yCQkJIyMJWCDDqXMgeSBrb29yZGluw6F0w6FrIGFsYXBqw6FuIHN6w6Ftw610amEga2kgYXogYXJrdXN6IHRhbmdlbnMgw6lydMOpa2V0Lg0KQVRBTkgJCQk9IEFUQU5ICQkJCSMjCUEgc3rDoW0gaW52ZXJ6IHRhbmdlbnMgaGlwZXJib2xpa3VzesOhdCBzesOhbcOtdGphIGtpLg0KQ0VJTElORwkJCT0gUExBRk9OCQkJIyMJRWd5IHN6w6Ftb3QgYSBsZWdrw7Z6ZWxlYmJpIGVnw6lzenJlIHZhZ3kgYSBwb250b3Nzw6Fna8OpbnQgbWVnYWRvdHQgw6lydMOpayBsZWdrw7Z6ZWxlYmIgZXPFkSB0w7ZiYnN6w7Zyw7Zzw6lyZSBrZXJla8OtdC4NCkNPTUJJTgkJCT0gS09NQklOw4FDScOTSwkJCSMjCUFkb3R0IHN6w6Ftw7ogb2JqZWt0dW0gw7Zzc3plcyBsZWhldHPDqWdlcyBrb21iaW7DoWNpw7NpbmFrIHN6w6Ftw6F0IHN6w6Ftw610amEga2kuDQpDT1MJCQk9IENPUwkJCQkjIwlFZ3kgc3rDoW0ga29zemludXN6w6F0IHN6w6Ftw610amEga2kuDQpDT1NICQkJPSBDT1NICQkJCSMjCUVneSBzesOhbSBrb3N6aW51c3ogaGlwZXJib2xpa3VzesOhdCBzesOhbcOtdGphIGtpLg0KREVHUkVFUwkJCT0gRk9LCQkJCSMjCVJhZGnDoW50IGZva2vDoSBhbGFrw610IMOhdC4NCkVWRU4JCQk9IFDDgVJPUwkJCQkjIwlFZ3kgc3rDoW1vdCBhIGxlZ2vDtnplbGViYmkgcMOhcm9zIGVnw6lzeiBzesOhbXJhIGtlcmVrw610Lg0KRVhQCQkJPSBLSVRFVsWQCQkJIyMJQXogZSBhZG90dCBraXRldsWRasWxIGhhdHbDoW55w6F0IGFkamEgZXJlZG3DqW55w7xsLg0KRkFDVAkJCT0gRkFLVAkJCQkjIwlFZ3kgc3rDoW0gZmFrdG9yacOhbGlzw6F0IHN6w6Ftw610amEga2kuDQpGQUNURE9VQkxFCQk9IEZBQ1RET1VCTEUJCQkjIwlFZ3kgc3rDoW0gZHVwbGEgZmFrdG9yacOhbGlzw6F0IGFkamEgZXJlZG3DqW55w7xsLg0KRkxPT1IJCQk9IFBBREzDkwkJCQkjIwlFZ3kgc3rDoW1vdCBsZWZlbMOpLCBhIG51bGxhIGZlbMOpIGtlcmVrw610Lg0KR0NECQkJPSBHQ0QJCQkJIyMJQSBsZWduYWd5b2JiIGvDtnrDtnMgb3N6dMOzdCBhZGphIGVyZWRtw6luecO8bC4NCklOVAkJCT0gSU5UCQkJCSMjCUVneSBzesOhbW90IGxlZmVsw6kga2VyZWvDrXQgYSBsZWdrw7Z6ZWxlYmJpIGVnw6lzenJlLg0KTENNCQkJPSBMQ00JCQkJIyMJQSBsZWdraXNlYmIga8O2esO2cyB0w7ZiYnN6w7Zyw7ZzdCBhZGphIGVyZWRtw6luecO8bC4NCkxOCQkJPSBMTgkJCQkjIwlFZ3kgc3rDoW0gdGVybcOpc3pldGVzIGxvZ2FyaXRtdXPDoXQgc3rDoW3DrXRqYSBraS4NCkxPRwkJCT0gTE9HCQkJCSMjCUVneSBzesOhbSBhZG90dCBhbGFww7ogbG9nYXJpdG11c8OhdCBzesOhbcOtdGphIGtpLg0KTE9HMTAJCQk9IExPRzEwCQkJCSMjCUVneSBzesOhbSAxMC1lcyBhbGFww7ogbG9nYXJpdG11c8OhdCBzesOhbcOtdGphIGtpLg0KTURFVEVSTQkJCT0gTURFVEVSTQkJCSMjCUVneSB0w7ZtYiBtw6F0cml4LWRldGVybWluw6Fuc8OhdCBzesOhbcOtdGphIGtpLg0KTUlOVkVSU0UJCT0gSU5WRVJaLk3DgVRSSVgJCQkjIwlFZ3kgdMO2bWIgbcOhdHJpeCBpbnZlcnrDqXQgYWRqYSBlcmVkbcOpbnnDvGwuDQpNTVVMVAkJCT0gTVNaT1JaQVQJCQkjIwlLw6l0IHTDtm1iIG3DoXRyaXgtc3pvcnphdMOhdCBhZGphIG1lZy4NCk1PRAkJCT0gTUFSQUTDiUsJCQkjIwlFZ3kgc3rDoW0gb3N6dMOhc2kgbWFyYWTDqWvDoXQgYWRqYSBlcmVkbcOpbnnDvGwuDQpNUk9VTkQJCQk9IE1ST1VORAkJCSMjCUEga8OtdsOhbnQgdMO2YmJzesO2csO2c8OpcmUga2VyZWvDrXRldHQgw6lydMOpa2V0IGFkIGVyZWRtw6luecO8bC4NCk1VTFRJTk9NSUFMCQk9IE1VTFRJTk9NSUFMCQkJIyMJU3rDoW1oYWxtYXogbXVsdGlub21pw6FsaXPDoXQgYWRqYSBlcmVkbcOpbnnDvGwuDQpPREQJCQk9IFDDgVJBVExBTgkJCSMjCUVneSBzesOhbW90IGEgbGVna8O2emVsZWJiaSBww6FyYXRsYW4gc3rDoW1yYSBrZXJla8OtdC4NClBJCQkJPSBQSQkJCQkjIwlBIHBpIG1hdGVtYXRpa2FpIMOhbGxhbmTDs3QgYWRqYSB2aXNzemEuDQpQT1dFUgkJCT0gSEFUVsOBTlkJCQkjIwlFZ3kgc3rDoW0gYWRvdHQga2l0ZXbFkWrFsSBoYXR2w6FuecOhdCBzesOhbcOtdGphIGtpLg0KUFJPRFVDVAkJCT0gU1pPUlpBVAkJCSMjCUFyZ3VtZW50dW1haSBzem9yemF0w6F0IHN6w6Ftw610amEga2kuDQpRVU9USUVOVAkJPSBRVU9USUVOVAkJCSMjCUVneSBow6FueWFkb3MgZWfDqXN6IHLDqXN6w6l0IGFkamEgZXJlZG3DqW55w7xsLg0KUkFESUFOUwkJCT0gUkFEScOBTgkJCSMjCUZva290IHJhZGnDoW5uw6EgYWxha8OtdCDDoXQuDQpSQU5ECQkJPSBWw4lMCQkJCSMjCUVneSAwIMOpcyAxIGvDtnrDtnR0aSB2w6lsZXRsZW4gc3rDoW1vdCBhZCBlcmVkbcOpbnnDvGwuDQpSQU5EQkVUV0VFTgkJPSBSQU5EQkVUV0VFTgkJCSMjCU1lZ2Fkb3R0IHN6w6Ftb2sga8O2esOpIGVzxZEgdsOpbGV0bGVuIHN6w6Ftb3Qgw6FsbMOtdCBlbMWRLg0KUk9NQU4JCQk9IFLDk01BSQkJCQkjIwlFZ3kgc3rDoW1vdCByw7NtYWkgc3rDoW1va2thbCBraWZlamV6dmUgc3rDtnZlZ2vDqW50IGFkIGVyZWRtw6luecO8bC4NClJPVU5ECQkJPSBLRVJFS8ONVMOJUwkJCSMjCUVneSBzesOhbW90IGFkb3R0IHN6w6Ftw7ogc3rDoW1qZWd5cmUga2VyZWvDrXQuDQpST1VORERPV04JCT0gS0VSRUvDjVTDiVMuTEUJCQkjIwlFZ3kgc3rDoW1vdCBsZWZlbMOpLCBhIG51bGxhIGZlbMOpIGtlcmVrw610Lg0KUk9VTkRVUAkJCT0gS0VSRUvDjVTDiVMuRkVMCQkJIyMJRWd5IHN6w6Ftb3QgZmVsZmVsw6ksIGEgbnVsbMOhdMOzbCB0w6F2b2xhYmJyYSBrZXJla8OtdC4NClNFUklFU1NVTQkJPSBTRVJJRVNTVU0JCQkjIwlIYXR2w6FueXNvciDDtnNzemVnw6l0IGFkamEgZXJlZG3DqW55w7xsLg0KU0lHTgkJCT0gRUzFkEpFTAkJCSMjCUVneSBzesOhbSBlbMWRamVsw6l0IGFkamEgbWVnLg0KU0lOCQkJPSBTSU4JCQkJIyMJRWd5IHN6w7ZnIHN6aW51c3rDoXQgc3rDoW3DrXRqYSBraS4NClNJTkgJCQk9IFNJTkgJCQkJIyMJRWd5IHN6w6FtIHN6aW51c3ogaGlwZXJib2xpa3VzesOhdCBzesOhbcOtdGphIGtpLg0KU1FSVAkJCT0gR1nDlksJCQkJIyMJRWd5IHN6w6FtIHBveml0w612IG7DqWd5emV0Z3nDtmvDqXQgc3rDoW3DrXRqYSBraS4NClNRUlRQSQkJCT0gU1FSVFBJCQkJIyMJQSAoc3rDoW0qcGkpIG7DqWd5emV0Z3nDtmvDqXQgYWRqYSBlcmVkbcOpbnnDvGwuDQpTVUJUT1RBTAkJPSBSw4lTWsOWU1NaRUcJCQkjIwlMaXN0YSB2YWd5IGFkYXRiw6F6aXMgcsOpc3rDtnNzemVnw6l0IGFkamEgZXJlZG3DqW55w7xsLg0KU1VNCQkJPSBTWlVNCQkJCSMjCcOWc3N6ZWFkamEgYXogYXJndW1lbnR1bWxpc3TDoWrDoWJhbiBsw6l2xZEgc3rDoW1va2F0Lg0KU1VNSUYJCQk9IFNaVU1IQQkJCSMjCUEgbWVnYWRvdHQgZmVsdMOpdGVsZWtuZWsgZWxlZ2V0IHRldsWRIGNlbGzDoWtiYW4gdGFsw6FsaGF0w7Mgw6lydMOpa2VrZXQgYWRqYSDDtnNzemUuDQpTVU1JRlMJCQk9IFNaVU1IQVTDlkJCCQkJIyMJVMO2YmIgbWVnYWRvdHQgZmVsdMOpdGVsbmVrIGVsZWdldCB0w6l2xZEgdGFydG9tw6FueWNlbGzDoWsgw7Zzc3plZ8OpdCBhZGphIGVyZWRtw6luecO8bC4NClNVTVBST0RVQ1QJCT0gU1pPUlpBVMOWU1NaRUcJCQkjIwlBIG1lZ2ZlbGVsxZEgdMO2bWJlbGVtZWsgc3pvcnphdMOhbmFrIMO2c3N6ZWfDqXQgc3rDoW3DrXRqYSBraS4NClNVTVNRCQkJPSBOw4lHWVpFVMOWU1NaRUcJCQkjIwlBcmd1bWVudHVtYWkgbsOpZ3l6ZXTDqW5layDDtnNzemVnw6l0IHN6w6Ftw610amEga2kuDQpTVU1YMk1ZMgkJPSBTWlVNWDJCxZBMWTIJCQkjIwlLw6l0IHTDtm1iIG1lZ2ZlbGVsxZEgZWxlbWVpIG7DqWd5emV0w6luZWsga8O8bMO2bmJzw6lnw6l0IMO2c3N6ZWd6aS4NClNVTVgyUFkyCQk9IFNaVU1YMk1FR1kyCQkJIyMJS8OpdCB0w7ZtYiBtZWdmZWxlbMWRIGVsZW1laSBuw6lneXpldMOpbmVrIMO2c3N6ZWfDqXQgw7Zzc3plZ3ppLg0KU1VNWE1ZMgkJCT0gU1pVTVhCxZBMWTIJCQkjIwlLw6l0IHTDtm1iIG1lZ2ZlbGVsxZEgZWxlbWVpIGvDvGzDtm5ic8OpZ8OpbmVrIG7DqWd5emV0w7Zzc3plZ8OpdCBzesOhbcOtdGphIGtpLg0KVEFOCQkJPSBUQU4JCQkJIyMJRWd5IHN6w6FtIHRhbmdlbnPDqXQgc3rDoW3DrXRqYSBraS4NClRBTkgJCQk9IFRBTkgJCQkJIyMJRWd5IHN6w6FtIHRhbmdlbnMgaGlwZXJib2xpa3VzesOhdCBzesOhbcOtdGphIGtpLg0KVFJVTkMJCQk9IENTT05LCQkJCSMjCUVneSBzesOhbW90IGVnw6lzc3rDqSBjc29ua8OtdC4NCg0KDQojIw0KIyMJU3RhdGlzdGljYWwgZnVuY3Rpb25zCQkJCVN0YXRpc3p0aWthaSBmw7xnZ3bDqW55ZWsNCiMjDQpBVkVERVYJCQk9IMOBVEwuRUxUw4lSw4lTCQkJIyMJQXogYWRhdHBvbnRva25hayDDoXRsYWd1a3TDs2wgdmFsw7Mgw6F0bGFnb3MgYWJzem9sw7p0IGVsdMOpcsOpc8OpdCBzesOhbcOtdGphIGtpLg0KQVZFUkFHRQkJCT0gw4FUTEFHCQkJCSMjCUFyZ3VtZW50dW1haSDDoXRsYWfDoXQgc3rDoW3DrXRqYSBraS4NCkFWRVJBR0VBCQk9IMOBVExBR0EJCQkjIwlBcmd1bWVudHVtYWkgw6F0bGFnw6F0IHN6w6Ftw610amEga2kgKGJlbGXDqXJ0dmUgYSBzesOhbW9rYXQsIHN6w7Z2ZWdldCDDqXMgbG9naWthaSDDqXJ0w6lrZWtldCkuDQpBVkVSQUdFSUYJCT0gw4FUTEFHSEEJCQkjIwlBIG1lZ2Fkb3R0IGZlbHTDqXRlbG5layBlbGVnZXQgdMOpdsWRIHRhcnRvbcOhbnkgY2VsbMOhaW5hayDDoXRsYWfDoXQgKHN6w6FtdGFuaSBrw7Z6ZXDDqXQpIGFkamEgZXJlZG3DqW55w7xsLg0KQVZFUkFHRUlGUwkJPSDDgVRMQUdIQVTDlkJCCQkJIyMJQSBtZWdhZG90dCBmZWx0w6l0ZWxla25layBlbGVnZXQgdMOpdsWRIGNlbGzDoWsgw6F0bGFnw6F0IChzesOhbXRhbmkga8O2emVww6l0KSBhZGphIGVyZWRtw6luecO8bC4NCkJFVEFESVNUCQk9IELDiVRBLkVMT1NaTMOBUwkJCSMjCUEgYsOpdGEtZWxvc3psw6FzIGbDvGdndsOpbnl0IHN6w6Ftw610amEga2kuDQpCRVRBSU5WCQkJPSBJTlZFUlouQsOJVEEJCQkjIwlBZG90dCBiw6l0YS1lbG9zemzDoXNob3oga2lzesOhbcOtdGphIGEgYsOpdGEgZWxvc3psw6FzZsO8Z2d2w6lueSBpbnZlcnrDqXQuDQpCSU5PTURJU1QJCT0gQklOT00uRUxPU1pMw4FTCQkjIwlBIGRpc3prcsOpdCBiaW5vbWnDoWxpcyBlbG9zemzDoXMgdmFsw7NzesOtbsWxc8OpZ8OpcnTDqWvDqXQgc3rDoW3DrXRqYSBraS4NCkNISURJU1QJCQk9IEtISS5FTE9TWkzDgVMJCQkjIwlBIGtoaS1uw6lneXpldC1lbG9zemzDoXMgZWd5c3rDqWzFsSB2YWzDs3N6w61uxbFzw6lnw6lydMOpa8OpdCBzesOhbcOtdGphIGtpLg0KQ0hJSU5WCQkJPSBJTlZFUlouS0hJCQkJIyMJQSBraGktbsOpZ3l6ZXQtZWxvc3psw6FzIGVneXN6w6lsxbEgdmFsw7NzesOtbsWxc8OpZ8OpcnTDqWvDqW5layBpbnZlcnrDqXQgc3rDoW3DrXRqYSBraS4NCkNISVRFU1QJCQk9IEtISS5QUsOTQkEJCQkjIwlGw7xnZ2V0bGVuc8OpZ3ZpenNnw6FsYXRvdCBoYWp0IHbDqWdyZS4NCkNPTkZJREVOQ0UJCT0gTUVHQsONWkhBVMOTU8OBRwkJCSMjCUVneSBzdGF0aXN6dGlrYWkgc29rYXPDoWcgdsOhcmhhdMOzIMOpcnTDqWvDqW5layBtZWdiw616aGF0w7Nzw6FnaSBpbnRlcnZhbGx1bcOhdCBhZGphIGVyZWRtw6luecO8bC4NCkNPUlJFTAkJCT0gS09SUkVMCQkJIyMJS8OpdCBhZGF0aGFsbWF6IGtvcnJlbMOhY2nDs3MgZWd5w7x0dGhhdMOzasOhdCBzesOhbcOtdGphIGtpLg0KQ09VTlQJCQk9IERBUkFCCQkJCSMjCU1lZ3N6w6Ftb2xqYSwgaG9neSBhcmd1bWVudHVtbGlzdMOhasOhYmFuIGjDoW55IHN6w6FtIHRhbMOhbGhhdMOzLg0KQ09VTlRBCQkJPSBEQVJBQjIJCQkjIwlNZWdzesOhbW9samEsIGhvZ3kgYXJndW1lbnR1bWxpc3TDoWrDoWJhbiBow6FueSDDqXJ0w6lrIHRhbMOhbGhhdMOzLg0KQ09VTlRCTEFOSwkJPSBEQVJBQsOcUkVTCQkJIyMJRWd5IHRhcnRvbcOhbnliYW4gw7Zzc3plc3rDoW1vbGphIGF6IMO8cmVzIGNlbGzDoWthdC4NCkNPVU5USUYJCQk9IERBUkFCVEVMSQkJCSMjCUVneSB0YXJ0b23DoW55YmFuIMO2c3N6ZXN6w6Ftb2xqYSBhem9rYXQgYSBjZWxsw6FrYXQsIGFtZWx5ZWsgZWxlZ2V0IHRlc3puZWsgYSBtZWdhZG90dCBmZWx0w6l0ZWxuZWsuDQpDT1VOVElGUwkJPSBEQVJBQkhBVMOWQkIJCQkjIwlFZ3kgdGFydG9tw6FueWJhbiDDtnNzemVzesOhbW9samEgYXpva2F0IGEgY2VsbMOha2F0LCBhbWVseWVrIGVsZWdldCB0ZXN6bmVrIHTDtmJiIGZlbHTDqXRlbG5lay4NCkNPVkFSCQkJPSBLT1ZBUgkJCQkjIwlBIGtvdmFyaWFuY2nDoXQsIGF6YXogYSBww6Fyb25rw6ludGkgZWx0w6lyw6lzZWsgc3pvcnphdMOhbmFrIMOhdGxhZ8OhdCBzesOhbcOtdGphIGtpLg0KQ1JJVEJJTk9NCQk9IEtSSVRCSU5PTQkJCSMjCUF6dCBhIGxlZ2tpc2ViYiBzesOhbW90IGFkamEgZXJlZG3DqW55w7xsLCBhbWVseXJlIGEgYmlub21pw6FsaXMgZWxvc3psw6FzZsO8Z2d2w6lueSDDqXJ0w6lrZSBuZW0ga2lzZWJiIGVneSBhZG90dCBoYXTDoXLDqXJ0w6lrbsOpbC4NCkRFVlNRCQkJPSBTUQkJCQkjIwlBeiDDoXRsYWd0w7NsIHZhbMOzIGVsdMOpcsOpc2VrIG7DqWd5emV0w6luZWsgw7Zzc3plZ8OpdCBzesOhbcOtdGphIGtpLg0KRVhQT05ESVNUCQk9IEVYUC5FTE9TWkzDgVMJCQkjIwlBeiBleHBvbmVuY2nDoWxpcyBlbG9zemzDoXMgw6lydMOpa8OpdCBzesOhbcOtdGphIGtpLg0KRkRJU1QJCQk9IEYuRUxPU1pMw4FTCQkJIyMJQXogRi1lbG9zemzDoXMgw6lydMOpa8OpdCBzesOhbcOtdGphIGtpLg0KRklOVgkJCT0gSU5WRVJaLkYJCQkjIwlBeiBGLWVsb3N6bMOhcyBpbnZlcnrDqW5layDDqXJ0w6lrw6l0IHN6w6Ftw610amEga2kuDQpGSVNIRVIJCQk9IEZJU0hFUgkJCSMjCUZpc2hlci10cmFuc3pmb3Jtw6FjacOzdCBoYWp0IHbDqWdyZS4NCkZJU0hFUklOVgkJPSBJTlZFUlouRklTSEVSCQkJIyMJQSBGaXNoZXItdHJhbnN6Zm9ybcOhY2nDsyBpbnZlcnrDqXQgaGFqdGphIHbDqWdyZS4NCkZPUkVDQVNUCQk9IEVMxZBSRUpFTFrDiVMJCQkjIwlBeiBpc21lcnQgw6lydMOpa2VrIGFsYXBqw6FuIGxpbmXDoXJpcyByZWdyZXNzemnDs3ZhbCBiZWNzw7xsdCDDqXJ0w6lrZXQgYWQgZXJlZG3DqW55w7xsLg0KRlJFUVVFTkNZCQk9IEdZQUtPUklTw4FHCQkJIyMJQSBneWFrb3Jpc8OhZ2kgdmFneSBlbXBpcmlrdXMgZWxvc3psw6FzIMOpcnTDqWvDqXQgZsO8Z2fFkWxlZ2VzIHTDtm1ia8OpbnQgYWRqYSBlcmVkbcOpbnnDvGwuDQpGVEVTVAkJCT0gRi5QUsOTQkEJCQkjIwlBeiBGLXByw7NiYSDDqXJ0w6lrw6l0IGFkamEgZXJlZG3DqW55w7xsLg0KR0FNTUFESVNUCQk9IEdBTU1BLkVMT1NaTMOBUwkJIyMJQSBnYW1tYS1lbG9zemzDoXMgw6lydMOpa8OpdCBzesOhbcOtdGphIGtpLg0KR0FNTUFJTlYJCT0gSU5WRVJaLkdBTU1BCQkJIyMJQSBnYW1tYS1lbG9zemzDoXMgZWxvc3psw6FzZsO8Z2d2w6lueWUgaW52ZXJ6w6luZWsgw6lydMOpa8OpdCBzesOhbcOtdGphIGtpLg0KR0FNTUFMTgkJCT0gR0FNTUFMTgkJCSMjCUEgZ2FtbWEtZsO8Z2d2w6lueSB0ZXJtw6lzemV0ZXMgbG9nYXJpdG11c8OhdCBzesOhbcOtdGphIGtpLg0KR0VPTUVBTgkJCT0gTcOJUlRBTkkuS8OWWsOJUAkJCSMjCUFyZ3VtZW50dW1haSBtw6lydGFuaSBrw7Z6w6lww6lydMOpa8OpdCBzesOhbcOtdGphIGtpLg0KR1JPV1RICQkJPSBOw5ZWCQkJCSMjCUV4cG9uZW5jacOhbGlzIHJlZ3Jlc3N6acOzIGFsYXBqw6FuIGFkIGJlY3Nsw6lzdC4NCkhBUk1FQU4JCQk9IEhBUk0uS8OWWsOJUAkJCSMjCUFyZ3VtZW50dW1haSBoYXJtb25pa3VzIMOhdGxhZ8OhdCBzesOhbcOtdGphIGtpLg0KSFlQR0VPTURJU1QJCT0gSElQRVJHRU9NLkVMT1NaTMOBUwkJIyMJQSBoaXBlcmdlb21ldHJpYWkgZWxvc3psw6FzIMOpcnTDqWvDqXQgc3rDoW3DrXRqYSBraS4NCklOVEVSQ0VQVAkJPSBNRVRTWgkJCQkjIwlBIHJlZ3Jlc3N6acOzcyBlZ3llbmVzIHkgdGVuZ2VsbHllbCB2YWzDsyBtZXRzesOpc3BvbnRqw6F0IGhhdMOhcm96emEgbWVnLg0KS1VSVAkJCT0gQ1PDmkNTT1NTw4FHCQkJIyMJRWd5IGFkYXRoYWxtYXogY3PDumNzb3Nzw6Fnw6F0IHN6w6Ftw610amEga2kuDQpMQVJHRQkJCT0gTkFHWQkJCQkjIwlFZ3kgYWRhdGhhbG1heiBrLWFkaWsgbGVnbmFneW9iYiBlbGVtw6l0IGFkamEgZXJlZG3DqW55w7xsLg0KTElORVNUCQkJPSBMSU4uSUxMCQkJIyMJQSBsZWdraXNlYmIgbsOpZ3l6ZXRlayBtw7Nkc3plcsOpdmVsIGF6IGFkYXRva3JhIGlsbGVzenRldHQgZWd5ZW5lcyBwYXJhbcOpdGVyZWl0IGhhdMOhcm96emEgbWVnLg0KTE9HRVNUCQkJPSBMT0cuSUxMCQkJIyMJQXogYWRhdG9rcmEgaWxsZXN6dGV0dCBleHBvbmVuY2nDoWxpcyBnw7ZyYmUgcGFyYW3DqXRlcmVpdCBoYXTDoXJvenphIG1lZy4NCkxPR0lOVgkJCT0gSU5WRVJaLkxPRy5FTE9TWkzDgVMJCSMjCUEgbG9nbm9ybcOhbGlzIGVsb3N6bMOhcyBpbnZlcnrDqXQgc3rDoW3DrXRqYSBraS4NCkxPR05PUk1ESVNUCQk9IExPRy5FTE9TWkzDgVMJCQkjIwlBIGxvZ25vcm3DoWxpcyBlbG9zemzDoXNmw7xnZ3bDqW55IMOpcnTDqWvDqXQgc3rDoW3DrXRqYSBraS4NCk1BWAkJCT0gTUFYCQkJCSMjCUF6IGFyZ3VtZW50dW1haSBrw7Z6w7Z0dCBzemVyZXBsxZEgbGVnbmFneW9iYiBzesOhbW90IGFkamEgbWVnLg0KTUFYQQkJCT0gTUFYMgkJCQkjIwlBeiBhcmd1bWVudHVtYWkga8O2esO2dHQgc3plcmVwbMWRIGxlZ25hZ3lvYmIgc3rDoW1vdCBhZGphIG1lZyAoYmVsZcOpcnR2ZSBhIHN6w6Ftb2thdCwgc3rDtnZlZ2V0IMOpcyBsb2dpa2FpIMOpcnTDqWtla2V0KS4NCk1FRElBTgkJCT0gTUVEScOBTgkJCSMjCUFkb3R0IHN6w6FtaGFsbWF6IG1lZGnDoW5qw6F0IHN6w6Ftw610amEga2kuDQpNSU4JCQk9IE1JTgkJCQkjIwlBeiBhcmd1bWVudHVtYWkga8O2esO2dHQgc3plcmVwbMWRIGxlZ2tpc2ViYiBzesOhbW90IGFkamEgbWVnLg0KTUlOQQkJCT0gTUlOMgkJCQkjIwlBeiBhcmd1bWVudHVtYWkga8O2esO2dHQgc3plcmVwbMWRIGxlZ2tpc2ViYiBzesOhbW90IGFkamEgbWVnLCBiZWxlw6lydHZlIGEgc3rDoW1va2F0LCBzesO2dmVnZXQgw6lzIGxvZ2lrYWkgw6lydMOpa2VrZXQuDQpNT0RFCQkJPSBNw5NEVVNaCQkJIyMJRWd5IGFkYXRoYWxtYXpiw7NsIGtpdsOhbGFzenRqYSBhIGxlZ2d5YWtyYWJiYW4gZWzFkWZvcmR1bMOzIHN6w6Ftb3QuDQpORUdCSU5PTURJU1QJCT0gTkVHQklOT00uRUxPU1pMCQkjIwlBIG5lZ2F0w612IGJpbm9tacOhbGlzIGVsb3N6bMOhcyDDqXJ0w6lrw6l0IHN6w6Ftw610amEga2kuDQpOT1JNRElTVAkJPSBOT1JNLkVMT1NaTAkJCSMjCUEgbm9ybcOhbGlzIGVsb3N6bMOhcyDDqXJ0w6lrw6l0IHN6w6Ftw610amEga2kuDQpOT1JNSU5WCQkJPSBJTlZFUlouTk9STQkJCSMjCUEgbm9ybcOhbGlzIGVsb3N6bMOhcyBlbG9zemzDoXNmw7xnZ3bDqW55ZSBpbnZlcnrDqW5layDDqXJ0w6lrw6l0IHN6w6Ftw610amEga2kuDQpOT1JNU0RJU1QJCT0gU1ROT1JNRUxPU1pMCQkJIyMJQSBzdGFuZGFyZCBub3Jtw6FsaXMgZWxvc3psw6FzIGVsb3N6bMOhc2bDvGdndsOpbnnDqW5layDDqXJ0w6lrw6l0IHN6w6Ftw610amEga2kuDQpOT1JNU0lOVgkJPSBJTlZFUlouU1ROT1JNCQkJIyMJQSBzdGFuZGFyZCBub3Jtw6FsaXMgZWxvc3psw6FzIGVsb3N6bMOhc2bDvGdndsOpbnllIGludmVyesOpbmVrIMOpcnTDqWvDqXQgc3rDoW3DrXRqYSBraS4NClBFQVJTT04JCQk9IFBFQVJTT04JCQkjIwlBIFBlYXJzb24tZsOpbGUga29ycmVsw6FjacOzcyBlZ3nDvHR0aGF0w7N0IHN6w6Ftw610amEga2kuDQpQRVJDRU5USUxFCQk9IFBFUkNFTlRJTElTCQkJIyMJRWd5IHRhcnRvbcOhbnliYW4gdGFsw6FsaGF0w7Mgw6lydMOpa2VrIGstYWRpayBwZXJjZW50aWxpc8OpdCwgYXpheiBzesOhemFsw6lrb3N6dMOhbHnDoXQgYWRqYSBlcmVkbcOpbnnDvGwuDQpQRVJDRU5UUkFOSwkJPSBTWsOBWkFMw4lLUkFORwkJCSMjCUVneSDDqXJ0w6lrbmVrIGVneSBhZGF0aGFsbWF6b24gYmVsw7xsIHZldHQgc3rDoXphbMOpa29zIHJhbmdqw6F0IChlbGhlbHllemtlZMOpc8OpdCkgc3rDoW3DrXRqYSBraS4NClBFUk1VVAkJCT0gVkFSScOBQ0nDk0sJCQkjIwlBZG90dCBzesOhbcO6IG9iamVrdHVtIGstYWQgb3N6dMOhbHnDuiBpc23DqXRsw6lzIG7DqWxrw7xsaSB2YXJpw6FjacOzaW5hayBzesOhbcOhdCBzesOhbcOtdGphIGtpLg0KUE9JU1NPTgkJCT0gUE9JU1NPTgkJCSMjCUEgUG9pc3Nvbi1lbG9zemzDoXMgw6lydMOpa8OpdCBzesOhbcOtdGphIGtpLg0KUFJPQgkJCT0gVkFMw5NTWsONTsWwU8OJRwkJCSMjCUFubmFrIHZhbMOzc3rDrW7FsXPDqWfDqXQgc3rDoW3DrXRqYSBraSwgaG9neSBhZG90dCDDqXJ0w6lrZWsga8OpdCBoYXTDoXLDqXJ0w6lrIGvDtnrDqSBlc25lay4NClFVQVJUSUxFCQk9IEtWQVJUSUxJUwkJCSMjCUVneSBhZGF0aGFsbWF6IGt2YXJ0aWxpc8OpdCAobmVneWVkc3ppbnRqw6l0KSBzesOhbcOtdGphIGtpLg0KUkFOSwkJCT0gU09SU1rDgU0JCQkjIwlLaXN6w6Ftw610amEsIGhvZ3kgZWd5IHN6w6FtIGjDoW55YWRpayBlZ3kgc3rDoW1zb3JvemF0YmFuLg0KUlNRCQkJPSBSTsOJR1laRVQJCQkjIwlLaXN6w6Ftw610amEgYSBQZWFyc29uLWbDqWxlIHN6b3J6YXRtb21lbnR1bSBrb3JyZWzDoWNpw7NzIGVnecO8dHRoYXTDs2rDoW5hayBuw6lneXpldMOpdC4NClNLRVcJCQk9IEZFUkRFU8OJRwkJCSMjCUVneSBlbG9zemzDoXMgZmVyZGVzw6lnw6l0IGhhdMOhcm96emEgbWVnLg0KU0xPUEUJCQk9IE1FUkVERUtTw4lHCQkJIyMJRWd5IGxpbmXDoXJpcyByZWdyZXNzemnDs3MgZWd5ZW5lcyBtZXJlZGVrc8OpZ8OpdCBzesOhbcOtdGphIGtpLg0KU01BTEwJCQk9IEtJQ1NJCQkJCSMjCUVneSBhZGF0aGFsbWF6IGstYWRpayBsZWdraXNlYmIgZWxlbcOpdCBhZGphIG1lZy4NClNUQU5EQVJESVpFCQk9IE5PUk1BTElaw4FMw4FTCQkJIyMJTm9ybWFsaXrDoWx0IMOpcnTDqWtldCBhZCBlcmVkbcOpbnnDvGwuDQpTVERFVgkJCT0gU1rDk1LDgVMJCQkjIwlFZ3kgc3RhdGlzenRpa2FpIHNva2Fzw6FnIG1pbnTDoWrDoWLDs2wga2lzesOhbcOtdGphIGFubmFrIHN6w7Nyw6Fzw6F0Lg0KU1RERVZBCQkJPSBTWsOTUsOBU0EJCQkjIwlFZ3kgc3RhdGlzenRpa2FpIHNva2Fzw6FnIG1pbnTDoWrDoWLDs2wga2lzesOhbcOtdGphIGFubmFrIHN6w7Nyw6Fzw6F0IChiZWxlw6lydHZlIGEgc3rDoW1va2F0LCBzesO2dmVnZXQgw6lzIGxvZ2lrYWkgw6lydMOpa2VrZXQpLg0KU1RERVZQCQkJPSBTWsOTUsOBU1AJCQkjIwlFZ3kgc3RhdGlzenRpa2FpIHNva2Fzw6FnIGVnw6lzesOpYsWRbCBraXN6w6Ftw610amEgYW5uYWsgc3rDs3LDoXPDoXQuDQpTVERFVlBBCQkJPSBTWsOTUsOBU1BBCQkJIyMJRWd5IHN0YXRpc3p0aWthaSBzb2thc8OhZyBlZ8Opc3rDqWLFkWwga2lzesOhbcOtdGphIGFubmFrIHN6w7Nyw6Fzw6F0IChiZWxlw6lydHZlIHN6w6Ftb2thdCwgc3rDtnZlZ2V0IMOpcyBsb2dpa2FpIMOpcnTDqWtla2V0KS4NClNURVlYCQkJPSBTVEhJQkFZWAkJCSMjCUVneSByZWdyZXNzemnDsyBlc2V0w6luIGF6IGVneWVzIHgtw6lydMOpa2VrIGFsYXBqw6FuIG1lZ2hhdMOhcm96b3R0IHktw6lydMOpa2VrIHN0YW5kYXJkIGhpYsOhasOhdCBzesOhbcOtdGphIGtpLg0KVERJU1QJCQk9IFQuRUxPU1pMw4FTCQkJIyMJQSBTdHVkZW50LWbDqWxlIHQtZWxvc3psw6FzIMOpcnTDqWvDqXQgc3rDoW3DrXRqYSBraS4NClRJTlYJCQk9IElOVkVSWi5UCQkJIyMJQSBTdHVkZW50LWbDqWxlIHQtZWxvc3psw6FzIGludmVyesOpdCBzesOhbcOtdGphIGtpLg0KVFJFTkQJCQk9IFRSRU5ECQkJCSMjCUxpbmXDoXJpcyB0cmVuZCDDqXJ0w6lrZWl0IHN6w6Ftw610amEga2kuDQpUUklNTUVBTgkJPSBSw4lTWsOBVExBRwkJCSMjCUVneSBhZGF0aGFsbWF6IGvDtnrDqXBzxZEgcsOpc3rDqW5layDDoXRsYWfDoXQgc3rDoW3DrXRqYSBraS4NClRURVNUCQkJPSBULlBSw5NCQQkJCSMjCUEgU3R1ZGVudC1mw6lsZSB0LXByw7Niw6Fob3ogdGFydG96w7MgdmFsw7NzesOtbsWxc8OpZ2V0IHN6w6Ftw610amEga2kuDQpWQVIJCQk9IFZBUgkJCQkjIwlNaW50YSBhbGFwasOhbiBiZWNzbMOpc3QgYWQgYSB2YXJpYW5jacOhcmEuDQpWQVJBCQkJPSBWQVJBCQkJCSMjCU1pbnRhIGFsYXBqw6FuIGJlY3Nsw6lzdCBhZCBhIHZhcmlhbmNpw6FyYSAoYmVsZcOpcnR2ZSBzesOhbW9rYXQsIHN6w7Z2ZWdldCDDqXMgbG9naWthaSDDqXJ0w6lrZWtldCkuDQpWQVJQCQkJPSBWQVJQCQkJCSMjCUVneSBzdGF0aXN6dGlrYWkgc29rYXPDoWcgdmFyaWFuY2nDoWrDoXQgc3rDoW3DrXRqYSBraS4NClZBUlBBCQkJPSBWQVJQQQkJCQkjIwlFZ3kgc3RhdGlzenRpa2FpIHNva2Fzw6FnIHZhcmlhbmNpw6Fqw6F0IHN6w6Ftw610amEga2kgKGJlbGXDqXJ0dmUgc3rDoW1va2F0LCBzesO2dmVnZXQgw6lzIGxvZ2lrYWkgw6lydMOpa2VrZXQpLg0KV0VJQlVMTAkJCT0gV0VJQlVMTAkJCSMjCUEgV2VpYnVsbC1mw6lsZSBlbG9zemzDoXMgw6lydMOpa8OpdCBzesOhbcOtdGphIGtpLg0KWlRFU1QJCQk9IFouUFLDk0JBCQkJIyMJQXogZWd5c3rDqWzFsSB6LXByw7Niw6F2YWwga2Fwb3R0IHZhbMOzc3rDrW7FsXPDqWfDqXJ0w6lrZXQgc3rDoW3DrXRqYSBraS4NCg0KDQojIw0KIyMJVGV4dCBmdW5jdGlvbnMJCQkJCVN6w7Z2ZWdtxbF2ZWxldGVraGV6IGhhc3puw6FsaGF0w7MgZsO8Z2d2w6lueWVrDQojIw0KQVNDCQkJPSBBU0MJCQkJIyMJU3rDtnZlZyB0ZWxqZXMgc3rDqWxlc3PDqWfFsSAoa8OpdGLDoWp0b3MpIGxhdGluIMOpcyBrYXRha2FuYSBrYXJha3RlcmVpdCBmw6lsc3rDqWxlc3PDqWfFsSAoZWd5YsOhanRvcykga2FyYWt0ZXJla2vDqSBhbGFrw610amEuDQpCQUhUVEVYVAkJPSBCQUhUU1rDllZFRwkJCSMjCVN6w6Ftb3Qgc3rDtnZlZ2fDqSBhbGFrw610IGEgw58gKGJhaHQpIHDDqW56bmVtZm9ybcOhdHVtIGhhc3puw6FsYXTDoXZhbC4NCkNIQVIJCQk9IEtBUkFLVEVSCQkJIyMJQSBrw7Nkc3rDoW1tYWwgbWVnaGF0w6Fyb3pvdHQga2FyYWt0ZXJ0IGFkamEgZXJlZG3DqW55w7xsLg0KQ0xFQU4JCQk9IFRJU1pUw41UCQkJIyMJQSBzesO2dmVnYsWRbCBlbHTDoXZvbMOtdGphIGF6IMO2c3N6ZXMgbmVtIG55b210YXRoYXTDsyBrYXJha3RlcnQuDQpDT0RFCQkJPSBLw5NECQkJCSMjCUthcmFrdGVyc29yb3phdCBlbHPFkSBrYXJha3RlcsOpbmVrIG51bWVyaWt1cyBrw7NkasOhdCBhZGphIGVyZWRtw6luecO8bC4NCkNPTkNBVEVOQVRFCQk9IMOWU1NaRUbFsFoJCQkjIwlUw7ZiYiBzesO2dmVnZWxlbWV0IGVneWV0bGVuIHN6w7Z2ZWdlcyBlbGVtbcOpIGbFsXogw7Zzc3plLg0KRE9MTEFSCQkJPSBGT1JJTlQJCQkjIwlTesOhbW90IHDDqW56bmVtIGZvcm3DoXR1bcO6IHN6w7Z2ZWdnw6kgYWxha8OtdCDDoXQuDQpFWEFDVAkJCT0gQVpPTk9TCQkJIyMJTWVndml6c2fDoWxqYSwgaG9neSBrw6l0IMOpcnTDqWsgYXpvbm9zLWUuDQpGSU5ECQkJPSBTWsOWVkVHLlRBTMOBTAkJCSMjCUthcmFrdGVyc29yb3phdG90IGtlcmVzIGVneSBtw6FzaWtiYW4gKGEga2lzLSDDqXMgbmFneWJldMWxayBtZWdrw7xsw7ZuYsO2enRldMOpc8OpdmVsKS4NCkZJTkRCCQkJPSBTWsOWVkVHLlRBTMOBTDIJCQkjIwlLYXJha3RlcnNvcm96YXRvdCBrZXJlcyBlZ3kgbcOhc2lrYmFuIChhIGtpcy0gw6lzIG5hZ3liZXTFsWsgbWVna8O8bMO2bmLDtnp0ZXTDqXPDqXZlbCkuDQpGSVhFRAkJCT0gRklYCQkJCSMjCVN6w6Ftb3Qgc3rDtnZlZ2VzIGZvcm3DoXR1bcO6cmEgYWxha8OtdCBhZG90dCBzesOhbcO6IHRpemVkZXNqZWd5cmUga2VyZWvDrXR2ZS4NCkpJUwkJCT0gSklTCQkJCSMjCUEgZsOpbHN6w6lsZXNzw6lnxbEgKGVneWLDoWp0b3MpIGxhdGluIMOpcyBhIGthdGFrYW5hIGthcmFrdGVyZWtldCB0ZWxqZXMgc3rDqWxlc3PDqWfFsSAoa8OpdGLDoWp0b3MpIGthcmFrdGVyZWtrw6kgYWxha8OtdGphLg0KTEVGVAkJCT0gQkFMCQkJCSMjCVN6w7Z2ZWcgYmFsIHN6w6lsc8WRIGthcmFrdGVyZWl0IGFkamEgZXJlZG3DqW55w7xsLg0KTEVGVEIJCQk9IEJBTDIJCQkJIyMJU3rDtnZlZyBiYWwgc3rDqWxzxZEga2FyYWt0ZXJlaXQgYWRqYSBlcmVkbcOpbnnDvGwuDQpMRU4JCQk9IEhPU1NaCQkJCSMjCVN6w7Z2ZWcga2FyYWt0ZXJla2JlbiBtw6lydCBob3NzesOhdCBhZGphIGVyZWRtw6luecO8bC4NCkxFTkIJCQk9IEhPU1NaMgkJCSMjCVN6w7Z2ZWcga2FyYWt0ZXJla2JlbiBtw6lydCBob3NzesOhdCBhZGphIGVyZWRtw6luecO8bC4NCkxPV0VSCQkJPSBLSVNCRVTFsAkJCSMjCVN6w7Z2ZWdldCBraXNiZXTFsXNzw6kgYWxha8OtdCDDoXQuDQpNSUQJCQk9IEvDllrDiVAJCQkJIyMJQSBzesO2dmVnIGFkb3R0IHBvesOtY2nDs2rDoXTDs2wga2V6ZHZlIG1lZ2Fkb3R0IHN6w6Ftw7oga2FyYWt0ZXJ0IGFkIHZpc3N6YSBlcmVkbcOpbnlrw6ludC4NCk1JREIJCQk9IEvDllrDiVAyCQkJIyMJQSBzesO2dmVnIGFkb3R0IHBvesOtY2nDs2rDoXTDs2wga2V6ZHZlIG1lZ2Fkb3R0IHN6w6Ftw7oga2FyYWt0ZXJ0IGFkIHZpc3N6YSBlcmVkbcOpbnlrw6ludC4NClBIT05FVElDCQk9IFBIT05FVElDCQkJIyMJU3rDtnZlZyBmdXJpZ2FuYSAoZm9uZXRpa3VzKSBrYXJha3RlcmVpdCBhZGphIHZpc3N6YS4NClBST1BFUgkJCT0gVE7DiVYJCQkJIyMJU3rDtnZlZyBtaW5kZW4gc3phdsOhbmFrIGtlemTFkWJldMWxasOpdCBuYWd5YmV0xbFzcmUgY3NlcsOpbGkuDQpSRVBMQUNFCQkJPSBDU0VSRQkJCQkjIwlBIHN6w7Z2ZWdlbiBiZWzDvGwga2FyYWt0ZXJla2V0IGNzZXLDqWwuDQpSRVBMQUNFQgkJPSBDU0VSRTIJCQkjIwlBIHN6w7Z2ZWdlbiBiZWzDvGwga2FyYWt0ZXJla2V0IGNzZXLDqWwuDQpSRVBUCQkJPSBTT0tTWk9SCQkJIyMJTWVnYWRvdHQgc3rDoW3DuiBhbGthbG9tbWFsIG1lZ2lzbcOpdGVsIGVneSBzesO2dmVncsOpc3p0Lg0KUklHSFQJCQk9IEpPQkIJCQkJIyMJU3rDtnZlZ3LDqXN6IGpvYmIgc3rDqWxzxZEga2FyYWt0ZXJlaXQgYWRqYSBlcmVkbcOpbnnDvGwuDQpSSUdIVEIJCQk9IEpPQkIyCQkJCSMjCVN6w7Z2ZWdyw6lzeiBqb2JiIHN6w6lsc8WRIGthcmFrdGVyZWl0IGFkamEgZXJlZG3DqW55w7xsLg0KU0VBUkNICQkJPSBTWsOWVkVHLktFUkVTCQkJIyMJS2FyYWt0ZXJzb3JvemF0b3Qga2VyZXMgZWd5IG3DoXNpa2JhbiAoYSBraXMtIMOpcyBuYWd5YmV0xbFrIGvDtnrDtnR0IG5lbSB0ZXN6IGvDvGzDtm5ic8OpZ2V0KS4NClNFQVJDSEIJCQk9IFNaw5ZWRUcuS0VSRVMyCQkJIyMJS2FyYWt0ZXJzb3JvemF0b3Qga2VyZXMgZWd5IG3DoXNpa2JhbiAoYSBraXMtIMOpcyBuYWd5YmV0xbFrIGvDtnrDtnR0IG5lbSB0ZXN6IGvDvGzDtm5ic8OpZ2V0KS4NClNVQlNUSVRVVEUJCT0gSEVMWUVUVEUJCQkjIwlTesO2dmVnYmVuIGFkb3R0IGthcmFrdGVyZWtldCBtw6FzaWtyYSBjc2Vyw6lsLg0KVAkJCT0gVAkJCQkjIwlBcmd1bWVudHVtw6F0IHN6w7Z2ZWdnw6kgYWxha8OtdGphIMOhdC4NClRFWFQJCQk9IFNaw5ZWRUcJCQkjIwlTesOhbcOpcnTDqWtldCBhbGFrw610IMOhdCBhZG90dCBzesOhbWZvcm3DoXR1bcO6IHN6w7Z2ZWdnw6kuDQpUUklNCQkJPSBUUklNCQkJCSMjCUEgc3rDtnZlZ2LFkWwgZWx0w6F2b2zDrXRqYSBhIHN6w7Nrw7Z6w7ZrZXQuDQpVUFBFUgkJCT0gTkFHWUJFVMWwUwkJCSMjCVN6w7Z2ZWdldCBuYWd5YmV0xbFzc8OpIGFsYWvDrXQgw6F0Lg0KVkFMVUUJCQk9IMOJUlTDiUsJCQkJIyMJU3rDtnZlZ2V0IHN6w6FtbcOhIGFsYWvDrXQgw6F0Lg0K]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/locale/it/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/locale/it/config</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[77u/IyMNCiMjIFBIUEV4Y2VsDQojIw0NCiMjIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTEgUEhQRXhjZWwNCiMjDQojIyBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yDQojIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljDQojIyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXINCiMjIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLg0KIyMNCiMjIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLA0KIyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YNCiMjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VDQojIyBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLg0KIyMNCiMjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMNCiMjIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUNCiMjIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQ0KIyMNCiMjIEBjYXRlZ29yeSAgIFBIUEV4Y2VsDQojIyBAcGFja2FnZSAgICBQSFBFeGNlbF9TZXR0aW5ncw0KIyMgQGNvcHlyaWdodCAgQ29weXJpZ2h0IChjKSAyMDA2IC0gMjAxMSBQSFBFeGNlbCAoaHR0cDovL3d3dy5jb2RlcGxleC5jb20vUEhQRXhjZWwpDQojIyBAbGljZW5zZSAgICBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvb2xkLWxpY2Vuc2VzL2xncGwtMi4xLnR4dAlMR1BMDQojIyBAdmVyc2lvbiAgICAxLjcuNywgMjAxMi0wNS0xOQ0KIyMNCiMjDQoNCg0KQXJndW1lbnRTZXBhcmF0b3IJPSA7DQoNCg0KIyMNCiMjCShGb3IgZnV0dXJlIHVzZSkNCiMjDQpjdXJyZW5jeVN5bWJvbAk9IOKCrA0KDQoNCiMjDQojIwlFeGNlbCBFcnJvciBDb2RlcwkoRm9yIGZ1dHVyZSB1c2UpDQ0KIyMNCk5VTEwJPSAjTlVMTE8hDQpESVYwCT0gI0RJVi8wIQ0KVkFMVUUJPSAjVkFMT1JFIQ0KUkVGCT0gI1JJRiENCk5BTUUJPSAjTk9NRT8NCk5VTQk9ICNOVU0hDQpOQQk9ICNOL0QNCg==]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/locale/it/functions</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[77u/IyMNCiMjIFBIUEV4Y2VsDQojIw0NCiMjIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTEgUEhQRXhjZWwNCiMjDQojIyBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yDQojIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljDQojIyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXINCiMjIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLg0KIyMNCiMjIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLA0KIyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YNCiMjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VDQojIyBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLg0KIyMNCiMjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMNCiMjIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUNCiMjIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQ0KIyMNCiMjIEBjYXRlZ29yeSAgIFBIUEV4Y2VsDQojIyBAcGFja2FnZSAgICBQSFBFeGNlbF9DYWxjdWxhdGlvbg0KIyMgQGNvcHlyaWdodCAgQ29weXJpZ2h0IChjKSAyMDA2IC0gMjAxMSBQSFBFeGNlbCAoaHR0cDovL3d3dy5jb2RlcGxleC5jb20vUEhQRXhjZWwpDQojIyBAbGljZW5zZSAgICBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvb2xkLWxpY2Vuc2VzL2xncGwtMi4xLnR4dAlMR1BMDQojIyBAdmVyc2lvbiAgICAxLjcuNywgMjAxMi0wNS0xOQ0KIyMNCiMjIERhdGEgaW4gdGhpcyBmaWxlIGRlcml2ZWQgZnJvbSBodHRwOi8vd3d3LnBpdWhhLmZpL2V4Y2VsLWZ1bmN0aW9uLW5hbWUtdHJhbnNsYXRpb24vDQojIw0KIyMNCg0KDQojIw0KIyMJQWRkLWluIGFuZCBBdXRvbWF0aW9uIGZ1bmN0aW9ucwkJCUZ1bnppb25pIGRpIGF1dG9tYXppb25lIGUgZGVpIGNvbXBvbmVudGkgYWdnaXVudGl2aQ0KIyMNCkdFVFBJVk9UREFUQQkJPSBJTkZPLkRBVEkuVEFCLlBJVk9UCQkjIwlSZXN0aXR1aXNjZSBpIGRhdGkgbWVtb3JpenphdGkgaW4gdW4gcmFwcG9ydG8gZGkgdGFiZWxsYSBwaXZvdA0KDQoNCiMjDQojIwlDdWJlIGZ1bmN0aW9ucwkJCQkJRnVuemlvbmkgY3Vibw0KIyMNCkNVQkVLUElNRU1CRVIJCT0gTUVNQlJPLktQSS5DVUJPCQkjIwlSZXN0aXR1aXNjZSBpbCBub21lLCBsYSBwcm9wcmlldMOgIGUgbGEgbWlzdXJhIGRpIHVuIGluZGljYXRvcmUgZGkgcHJlc3RhemlvbmkgY2hpYXZlIChLUEkpIGUgdmlzdWFsaXp6YSBpbCBub21lIGUgbGEgcHJvcHJpZXTDoCBuZWxsYSBjZWxsYS4gVW4gS1BJIMOoIHVuYSBtaXN1cmEgcXVhbnRpZmljYWJpbGUsIGFkIGVzZW1waW8gbCd1dGlsZSBsb3JkbyBtZW5zaWxlIG8gaWwgZmF0dHVyYXRvIHRyaW1lc3RyYWxlIGRlaSBkaXBlbmRlbnRpLCB1dGlsaXp6YXRhIHBlciBpbCBtb25pdG9yYWdnaW8gZGVsbGUgcHJlc3RhemlvbmkgZGkgdW4nb3JnYW5penphemlvbmUuDQpDVUJFTUVNQkVSCQk9IE1FTUJSTy5DVUJPCQkJIyMJUmVzdGl0dWlzY2UgdW4gbWVtYnJvIG8gdW5hIHR1cGxhIGluIHVuYSBnZXJhcmNoaWEgZGkgY3ViaS4gQ29uc2VudGUgZGkgdmVyaWZpY2FyZSBsJ2VzaXN0ZW56YSBkZWwgbWVtYnJvIG8gZGVsbGEgdHVwbGEgbmVsIGN1Ym8uDQpDVUJFTUVNQkVSUFJPUEVSVFkJPSBQUk9QUklFVMOALk1FTUJSTy5DVUJPCQkjIwlSZXN0aXR1aXNjZSBpbCB2YWxvcmUgZGkgdW5hIHByb3ByaWV0w6AgZGkgdW4gbWVtYnJvIGRlbCBjdWJvLiBDb25zZW50ZSBkaSB2ZXJpZmljYXJlIGwnZXNpc3RlbnphIGRpIHVuIG5vbWUgZGkgbWVtYnJvIGFsbCdpbnRlcm5vIGRlbCBjdWJvIGUgZGkgcmVzdGl0dWlyZSBsYSBwcm9wcmlldMOgIHNwZWNpZmljYXRhIHBlciB0YWxlIG1lbWJyby4NCkNVQkVSQU5LRURNRU1CRVIJPSBNRU1CUk8uQ1VCTy5DT04uUkFOR08JCSMjCVJlc3RpdHVpc2NlIGwnbi1lc2ltbyBtZW1icm8gbyBpbCBtZW1icm8gb3JkaW5hdG8gZGkgdW4gaW5zaWVtZS4gQ29uc2VudGUgZGkgcmVzdGl0dWlyZSB1bm8gbyBwacO5IGVsZW1lbnRpIGluIHVuIGluc2llbWUsIGFkIGVzZW1waW8gbCdhZ2VudGUgZGkgdmVuZGl0YSBtaWdsaW9yZSBvIGkgcHJpbWkgMTAgc3R1ZGVudGkuDQpDVUJFU0VUCQkJPSBTRVQuQ1VCTwkJCSMjCURlZmluaXNjZSB1biBpbnNpZW1lIGRpIHR1cGxlIG8gbWVtYnJpIGNhbGNvbGF0aSBtZWRpYW50ZSBsJ2ludmlvIGRpIHVuJ2VzcHJlc3Npb25lIGRpIGluc2llbWUgYWwgY3VibyBzdWwgc2VydmVyLiBJbiBxdWVzdG8gbW9kbyBsJ2luc2llbWUgdmllbmUgY3JlYXRvIGUgcmVzdGl0dWl0byBhIE1pY3Jvc29mdCBPZmZpY2UgRXhjZWwuDQpDVUJFU0VUQ09VTlQJCT0gQ09OVEEuU0VULkNVQk8JCSMjCVJlc3RpdHVpc2NlIGlsIG51bWVybyBkaSBlbGVtZW50aSBkaSB1biBpbnNpZW1lLg0KQ1VCRVZBTFVFCQk9IFZBTE9SRS5DVUJPCQkJIyMJUmVzdGl0dWlzY2UgdW4gdmFsb3JlIGFnZ3JlZ2F0byBkYSB1biBjdWJvLg0KDQoNCiMjDQojIwlEYXRhYmFzZSBmdW5jdGlvbnMJCQkJRnVuemlvbmkgZGkgZGF0YWJhc2UNCiMjDQpEQVZFUkFHRQkJPSBEQi5NRURJQQkJCSMjCVJlc3RpdHVpc2NlIGxhIG1lZGlhIGRpIHZvY2kgZGVsIGRhdGFiYXNlIHNlbGV6aW9uYXRlDQpEQ09VTlQJCQk9IERCLkNPTlRBLk5VTUVSSQkJIyMJQ29udGEgbGUgY2VsbGUgZGkgdW4gZGF0YWJhc2UgY29udGVuZW50aSBudW1lcmkNCkRDT1VOVEEJCQk9IERCLkNPTlRBLlZBTE9SSQkJIyMJQ29udGEgbGUgY2VsbGUgbm9uIHZ1b3RlIGluIHVuIGRhdGFiYXNlDQpER0VUCQkJPSBEQi5WQUxPUkkJCQkjIwlFc3RyYWUgZGEgdW4gZGF0YWJhc2UgdW4gc2luZ29sbyByZWNvcmQgY2hlIHNvZGRpc2ZhIGkgY3JpdGVyaSBzcGVjaWZpY2F0aQ0KRE1BWAkJCT0gREIuTUFYCQkJIyMJUmVzdGl0dWlzY2UgaWwgdmFsb3JlIG1hc3NpbW8gZGFsbGUgdm9jaSBzZWxlemlvbmF0ZSBpbiB1biBkYXRhYmFzZQ0KRE1JTgkJCT0gREIuTUlOCQkJIyMJUmVzdGl0dWlzY2UgaWwgdmFsb3JlIG1pbmltbyBkYWxsZSB2b2NpIGRpIHVuIGRhdGFiYXNlIHNlbGV6aW9uYXRlDQpEUFJPRFVDVAkJPSBEQi5QUk9ET1RUTwkJCSMjCU1vbHRpcGxpY2EgaSB2YWxvcmkgaW4gdW4gZGV0ZXJtaW5hdG8gY2FtcG8gZGkgcmVjb3JkIGNoZSBzb2RkaXNmYW5vIGkgY3JpdGVyaSBkZWwgZGF0YWJhc2UNCkRTVERFVgkJCT0gREIuREVWLlNUCQkJIyMJUmVzdGl0dWlzY2UgdW5hIHN0aW1hIGRlbGxhIGRldmlhemlvbmUgc3RhbmRhcmQgc3VsbGEgYmFzZSBkaSB1biBjYW1waW9uZSBkaSB2b2NpIGRpIHVuIGRhdGFiYXNlIHNlbGV6aW9uYXRlDQpEU1RERVZQCQkJPSBEQi5ERVYuU1QuUE9QCQkJIyMJQ2FsY29sYSBsYSBkZXZpYXppb25lIHN0YW5kYXJkIHN1bGxhIGJhc2UgZGkgdHV0dGUgbGUgdm9jaSBkaSB1biBkYXRhYmFzZSBzZWxlemlvbmF0ZQ0KRFNVTQkJCT0gREIuU09NTUEJCQkjIwlBZ2dpdW5nZSBpIG51bWVyaSBuZWwgY2FtcG8gY29sb25uYSBkaSByZWNvcmQgZGVsIGRhdGFiYXNlIGNoZSBzb2RkaXNmYSBkZXRlcm1pbmF0aSBjcml0ZXJpDQpEVkFSCQkJPSBEQi5WQVIJCQkjIwlSZXN0aXR1aXNjZSB1bmEgc3RpbWEgZGVsbGEgdmFyaWFuemEgc3VsbGEgYmFzZSBkaSB1biBjYW1waW9uZSBkYSB2b2NpIGRpIHVuIGRhdGFiYXNlIHNlbGV6aW9uYXRlDQpEVkFSUAkJCT0gREIuVkFSLlBPUAkJCSMjCUNhbGNvbGEgbGEgdmFyaWFuemEgc3VsbGEgYmFzZSBkaSB0dXR0ZSBsZSB2b2NpIGRpIHVuIGRhdGFiYXNlIHNlbGV6aW9uYXRlDQoNCg0KIyMNCiMjCURhdGUgYW5kIHRpbWUgZnVuY3Rpb25zCQkJCUZ1bnppb25pIGRhdGEgZSBvcmENCiMjDQpEQVRFCQkJPSBEQVRBCQkJCSMjCVJlc3RpdHVpc2NlIGlsIG51bWVybyBzZXJpYWxlIGRpIHVuYSBkZXRlcm1pbmF0YSBkYXRhDQpEQVRFVkFMVUUJCT0gREFUQS5WQUxPUkUJCQkjIwlDb252ZXJ0ZSB1bmEgZGF0YSBzb3R0byBmb3JtYSBkaSB0ZXN0byBpbiB1biBudW1lcm8gc2VyaWFsZQ0KREFZCQkJPSBHSU9STk8JCQkjIwlDb252ZXJ0ZSB1biBudW1lcm8gc2VyaWFsZSBpbiB1biBnaW9ybm8gZGVsIG1lc2UNCkRBWVMzNjAJCQk9IEdJT1JOTzM2MAkJCSMjCUNhbGNvbGEgaWwgbnVtZXJvIGRpIGdpb3JuaSBjb21wcmVzbyB0cmEgZHVlIGRhdGUgYmFzYW5kb3NpIHN1IHVuIGFubm8gZGkgMzYwIGdpb3JuaQ0KRURBVEUJCQk9IERBVEEuTUVTRQkJCSMjCVJlc3RpdHVpc2NlIGlsIG51bWVybyBzZXJpYWxlIGRlbGxhIGRhdGEgY2hlIHJhcHByZXNlbnRhIGlsIG51bWVybyBkaSBtZXNpIHByaW1hIG8gZG9wbyBsYSBkYXRhIGRpIGluaXppbw0KRU9NT05USAkJCT0gRklORS5NRVNFCQkJIyMJUmVzdGl0dWlzY2UgaWwgbnVtZXJvIHNlcmlhbGUgZGVsbCd1bHRpbW8gZ2lvcm5vIGRlbCBtZXNlLCBwcmltYSBvIGRvcG8gdW4gZGV0ZXJtaW5hdG8gbnVtZXJvIGRpIG1lc2kNCkhPVVIJCQk9IE9SQQkJCQkjIwlDb252ZXJ0ZSB1biBudW1lcm8gc2VyaWFsZSBpbiB1bidvcmENCk1JTlVURQkJCT0gTUlOVVRPCQkJIyMJQ29udmVydGUgdW4gbnVtZXJvIHNlcmlhbGUgaW4gdW4gbWludXRvDQpNT05USAkJCT0gTUVTRQkJCQkjIwlDb252ZXJ0ZSB1biBudW1lcm8gc2VyaWFsZSBpbiB1biBtZXNlDQpORVRXT1JLREFZUwkJPSBHSU9STkkuTEFWT1JBVElWSS5UT1QJCSMjCVJlc3RpdHVpc2NlIGlsIG51bWVybyBkaSB0dXR0aSBpIGdpb3JuaSBsYXZvcmF0aXZpIGNvbXByZXNpIGZyYSBkdWUgZGF0ZQ0KTk9XCQkJPSBBREVTU08JCQkjIwlSZXN0aXR1aXNjZSBpbCBudW1lcm8gc2VyaWFsZSBkZWxsYSBkYXRhIGUgZGVsbCdvcmEgY29ycmVudGUNClNFQ09ORAkJCT0gU0VDT05ETwkJCSMjCUNvbnZlcnRlIHVuIG51bWVybyBzZXJpYWxlIGluIHVuIHNlY29uZG8NClRJTUUJCQk9IE9SQVJJTwkJCSMjCVJlc3RpdHVpc2NlIGlsIG51bWVybyBzZXJpYWxlIGRpIHVuYSBkZXRlcm1pbmF0YSBvcmENClRJTUVWQUxVRQkJPSBPUkFSSU8uVkFMT1JFCQkJIyMJQ29udmVydGUgdW4gb3JhcmlvIGluIGZvcm1hIGRpIHRlc3RvIGluIHVuIG51bWVybyBzZXJpYWxlDQpUT0RBWQkJCT0gT0dHSQkJCQkjIwlSZXN0aXR1aXNjZSBpbCBudW1lcm8gc2VyaWFsZSByZWxhdGl2byBhbGxhIGRhdGEgb2RpZXJuYQ0KV0VFS0RBWQkJCT0gR0lPUk5PLlNFVFRJTUFOQQkJIyMJQ29udmVydGUgdW4gbnVtZXJvIHNlcmlhbGUgaW4gdW4gZ2lvcm5vIGRlbGxhIHNldHRpbWFuYQ0KV0VFS05VTQkJCT0gTlVNLlNFVFRJTUFOQQkJCSMjCUNvbnZlcnRlIHVuIG51bWVybyBzZXJpYWxlIGluIHVuIG51bWVybyBjaGUgcmFwcHJlc2VudGEgbGEgcG9zaXppb25lIG51bWVyaWNhIGRpIHVuYSBzZXR0aW1hbmEgbmVsbCdhbm5vDQpXT1JLREFZCQkJPSBHSU9STk8uTEFWT1JBVElWTwkJIyMJUmVzdGl0dWlzY2UgaWwgbnVtZXJvIGRlbGxhIGRhdGEgcHJpbWEgbyBkb3BvIHVuIGRldGVybWluYXRvIG51bWVybyBkaSBnaW9ybmkgbGF2b3JhdGl2aQ0KWUVBUgkJCT0gQU5OTwkJCQkjIwlDb252ZXJ0ZSB1biBudW1lcm8gc2VyaWFsZSBpbiB1biBhbm5vDQpZRUFSRlJBQwkJPSBGUkFaSU9ORS5BTk5PCQkJIyMJUmVzdGl0dWlzY2UgbGEgZnJhemlvbmUgZGVsbCdhbm5vIGNoZSByYXBwcmVzZW50YSBpbCBudW1lcm8gZGVpIGdpb3JuaSBjb21wcmVzaSB0cmEgdW5hIGRhdGFfIGluaXppYWxlIGUgdW5hIGRhdGFfZmluYWxlDQoNCg0KIyMNCiMjCUVuZ2luZWVyaW5nIGZ1bmN0aW9ucwkJCQlGdW56aW9uaSBpbmdlZ25lcmlzdGljaGUNCiMjDQpCRVNTRUxJCQkJPSBCRVNTRUwuSQkJCSMjCVJlc3RpdHVpc2NlIGxhIGZ1bnppb25lIGRpIEJlc3NlbCBtb2RpZmljYXRhIEluKHgpDQpCRVNTRUxKCQkJPSBCRVNTRUwuSgkJCSMjCVJlc3RpdHVpc2NlIGxhIGZ1bnppb25lIGRpIEJlc3NlbCBKbih4KQ0KQkVTU0VMSwkJCT0gQkVTU0VMLksJCQkjIwlSZXN0aXR1aXNjZSBsYSBmdW56aW9uZSBkaSBCZXNzZWwgbW9kaWZpY2F0YSBLbih4KQ0KQkVTU0VMWQkJCT0gQkVTU0VMLlkJCQkjIwlSZXN0aXR1aXNjZSBsYSBmdW56aW9uZSBkaSBCZXNzZWwgWW4oeCkNCkJJTjJERUMJCQk9IEJJTkFSSU8uREVDSU1BTEUJCSMjCUNvbnZlcnRlIHVuIG51bWVybyBiaW5hcmlvIGluIGRlY2ltYWxlDQpCSU4ySEVYCQkJPSBCSU5BUklPLkhFWAkJCSMjCUNvbnZlcnRlIHVuIG51bWVybyBiaW5hcmlvIGluIGVzYWRlY2ltYWxlDQpCSU4yT0NUCQkJPSBCSU5BUklPLk9DVAkJCSMjCUNvbnZlcnRlIHVuIG51bWVybyBiaW5hcmlvIGluIG90dGFsZQ0KQ09NUExFWAkJCT0gQ09NUExFU1NPCQkJIyMJQ29udmVydGUgaSBjb2VmZmljaWVudGkgcmVhbGkgZSBpbW1hZ2luYXJpIGluIG51bWVyaSBjb21wbGVzc2kNCkNPTlZFUlQJCQk9IENPTlZFUlRJCQkJIyMJQ29udmVydGUgdW4gbnVtZXJvIGRhIHVuIHNpc3RlbWEgZGkgbWlzdXJhIGluIHVuIGFsdHJvDQpERUMyQklOCQkJPSBERUNJTUFMRS5CSU5BUklPCQkjIwlDb252ZXJ0ZSB1biBudW1lcm8gZGVjaW1hbGUgaW4gYmluYXJpbw0KREVDMkhFWAkJCT0gREVDSU1BTEUuSEVYCQkJIyMJQ29udmVydGUgdW4gbnVtZXJvIGRlY2ltYWxlIGluIGVzYWRlY2ltYWxlDQpERUMyT0NUCQkJPSBERUNJTUFMRS5PQ1QJCQkjIwlDb252ZXJ0ZSB1biBudW1lcm8gZGVjaW1hbGUgaW4gb3R0YWxlDQpERUxUQQkJCT0gREVMVEEJCQkJIyMJVmVyaWZpY2Egc2UgZHVlIHZhbG9yaSBzb25vIHVndWFsaQ0KRVJGCQkJPSBGVU5aLkVSUk9SRQkJCSMjCVJlc3RpdHVpc2NlIGxhIGZ1bnppb25lIGRpIGVycm9yZQ0KRVJGQwkJCT0gRlVOWi5FUlJPUkUuQ09NUAkJIyMJUmVzdGl0dWlzY2UgbGEgZnVuemlvbmUgZGkgZXJyb3JlIGNvbXBsZW1lbnRhcmUNCkdFU1RFUAkJCT0gU09HTElBCQkJIyMJVmVyaWZpY2Egc2UgdW4gbnVtZXJvIMOoIG1hZ2dpb3JlIGRlbCB2YWxvcmUgZGkgc29nbGlhDQpIRVgyQklOCQkJPSBIRVguQklOQVJJTwkJCSMjCUNvbnZlcnRlIHVuIG51bWVybyBlc2FkZWNpbWFsZSBpbiBiaW5hcmlvDQpIRVgyREVDCQkJPSBIRVguREVDSU1BTEUJCQkjIwlDb252ZXJ0ZSB1biBudW1lcm8gZXNhZGVjaW1hbGUgaW4gZGVjaW1hbGUNCkhFWDJPQ1QJCQk9IEhFWC5PQ1QJCQkjIwlDb252ZXJ0ZSB1biBudW1lcm8gZXNhZGVjaW1hbGUgaW4gb3R0YWxlDQpJTUFCUwkJCT0gQ09NUC5NT0RVTE8JCQkjIwlSZXN0aXR1aXNjZSBpbCB2YWxvcmUgYXNzb2x1dG8gKG1vZHVsbykgZGkgdW4gbnVtZXJvIGNvbXBsZXNzbw0KSU1BR0lOQVJZCQk9IENPTVAuSU1NQUdJTkFSSU8JCSMjCVJlc3RpdHVpc2NlIGlsIGNvZWZmaWNpZW50ZSBpbW1hZ2luYXJpbyBkaSB1biBudW1lcm8gY29tcGxlc3NvDQpJTUFSR1VNRU5UCQk9IENPTVAuQVJHT01FTlRPCQkjIwlSZXN0aXR1aXNjZSBsJ2FyZ29tZW50byB0aGV0YSwgdW4gYW5nb2xvIGVzcHJlc3NvIGluIHJhZGlhbnRpDQpJTUNPTkpVR0FURQkJPSBDT01QLkNPTklVR0FUTwkJIyMJUmVzdGl0dWlzY2UgaWwgY29tcGxlc3NvIGNvbml1Z2F0byBkZWwgbnVtZXJvIGNvbXBsZXNzbw0KSU1DT1MJCQk9IENPTVAuQ09TCQkJIyMJUmVzdGl0dWlzY2UgaWwgY29zZW5vIGRpIHVuIG51bWVybyBjb21wbGVzc28NCklNRElWCQkJPSBDT01QLkRJVgkJCSMjCVJlc3RpdHVpc2NlIGlsIHF1b3ppZW50ZSBkaSBkdWUgbnVtZXJpIGNvbXBsZXNzaQ0KSU1FWFAJCQk9IENPTVAuRVhQCQkJIyMJUmVzdGl0dWlzY2UgaWwgdmFsb3JlIGVzcG9uZW56aWFsZSBkaSB1biBudW1lcm8gY29tcGxlc3NvDQpJTUxOCQkJPSBDT01QLkxOCQkJIyMJUmVzdGl0dWlzY2UgaWwgbG9nYXJpdG1vIG5hdHVyYWxlIGRpIHVuIG51bWVybyBjb21wbGVzc28NCklNTE9HMTAJCQk9IENPTVAuTE9HMTAJCQkjIwlSZXN0aXR1aXNjZSBpbCBsb2dhcml0bW8gaW4gYmFzZSAxMCBkaSB1biBudW1lcm8gY29tcGxlc3NvDQpJTUxPRzIJCQk9IENPTVAuTE9HMgkJCSMjCVJlc3RpdHVpc2NlIHVuIGxvZ2FyaXRtbyBpbiBiYXNlIDIgZGkgdW4gbnVtZXJvIGNvbXBsZXNzbw0KSU1QT1dFUgkJCT0gQ09NUC5QT1RFTlpBCQkJIyMJUmVzdGl0dWlzY2UgaWwgbnVtZXJvIGNvbXBsZXNzbyBlbGV2YXRvIGEgdW5hIHBvdGVuemEgaW50ZXJhDQpJTVBST0RVQ1QJCT0gQ09NUC5QUk9ET1RUTwkJCSMjCVJlc3RpdHVpc2NlIGlsIHByb2RvdHRvIGRpIG51bWVyaSBjb21wbGVzc2kgY29tcHJlc2kgdHJhIDIgZSAyOQ0KSU1SRUFMCQkJPSBDT01QLlBBUlRFLlJFQUxFCQkjIwlSZXN0aXR1aXNjZSBpbCBjb2VmZmljaWVudGUgcmVhbGUgZGkgdW4gbnVtZXJvIGNvbXBsZXNzbw0KSU1TSU4JCQk9IENPTVAuU0VOCQkJIyMJUmVzdGl0dWlzY2UgaWwgc2VubyBkaSB1biBudW1lcm8gY29tcGxlc3NvDQpJTVNRUlQJCQk9IENPTVAuUkFEUQkJCSMjCVJlc3RpdHVpc2NlIGxhIHJhZGljZSBxdWFkcmF0YSBkaSB1biBudW1lcm8gY29tcGxlc3NvDQpJTVNVQgkJCT0gQ09NUC5ESUZGCQkJIyMJUmVzdGl0dWlzY2UgbGEgZGlmZmVyZW56YSBmcmEgZHVlIG51bWVyaSBjb21wbGVzc2kNCklNU1VNCQkJPSBDT01QLlNPTU1BCQkJIyMJUmVzdGl0dWlzY2UgbGEgc29tbWEgZGkgbnVtZXJpIGNvbXBsZXNzaQ0KT0NUMkJJTgkJCT0gT0NULkJJTkFSSU8JCQkjIwlDb252ZXJ0ZSB1biBudW1lcm8gb3R0YWxlIGluIGJpbmFyaW8NCk9DVDJERUMJCQk9IE9DVC5ERUNJTUFMRQkJCSMjCUNvbnZlcnRlIHVuIG51bWVybyBvdHRhbGUgaW4gZGVjaW1hbGUNCk9DVDJIRVgJCQk9IE9DVC5IRVgJCQkjIwlDb252ZXJ0ZSB1biBudW1lcm8gb3R0YWxlIGluIGVzYWRlY2ltYWxlDQoNCg0KIyMNCiMjCUZpbmFuY2lhbCBmdW5jdGlvbnMJCQkJRnVuemlvbmkgZmluYW56aWFyaWUNCiMjDQpBQ0NSSU5UCQkJPSBJTlQuTUFUVVJBVE8uUEVSCQkjIwlSZXN0aXR1aXNjZSBsJ2ludGVyZXNzZSBtYXR1cmF0byBkaSB1biB0aXRvbG8gY2hlIHBhZ2EgaW50ZXJlc3NpIHBlcmlvZGljaQ0KQUNDUklOVE0JCT0gSU5ULk1BVFVSQVRPLlNDQUQJCSMjCVJlc3RpdHVpc2NlIGwnaW50ZXJlc3NlIG1hdHVyYXRvIGRpIHVuIHRpdG9sbyBjaGUgcGFnYSBpbnRlcmVzc2kgYWxsYSBzY2FkZW56YQ0KQU1PUkRFR1JDCQk9IEFNTU9SVC5ERUdSCQkJIyMJUmVzdGl0dWlzY2UgbCdhbW1vcnRhbWVudG8gcGVyIG9nbmkgcGVyaW9kbyBjb250YWJpbGUgdXRpbGl6emFuZG8gdW4gY29lZmZpY2llbnRlIGRpIGFtbW9ydGFtZW50bw0KQU1PUkxJTkMJCT0gQU1NT1JULlBFUgkJCSMjCVJlc3RpdHVpc2NlIGwnYW1tb3J0YW1lbnRvIHBlciBvZ25pIHBlcmlvZG8gY29udGFiaWxlDQpDT1VQREFZQlMJCT0gR0lPUk5JLkNFRC5JTklaLkxJUQkJIyMJUmVzdGl0dWlzY2UgaWwgbnVtZXJvIGRlaSBnaW9ybmkgY2hlIHZhbm5vIGRhbGwnaW5pemlvIGRlbCBwZXJpb2RvIGRpIGR1cmF0YSBkZWxsYSBjZWRvbGEgYWxsYSBkYXRhIGRpIGxpcXVpZGF6aW9uZQ0KQ09VUERBWVMJCT0gR0lPUk5JLkNFRAkJCSMjCVJlc3RpdHVpc2NlIGlsIG51bWVybyBkZWkgZ2lvcm5pIHJlbGF0aXZpIGFsIHBlcmlvZG8gZGVsbGEgY2Vkb2xhIGNoZSBjb250aWVuZSBsYSBkYXRhIGRpIGxpcXVpZGF6aW9uZQ0KQ09VUERBWVNOQwkJPSBHSU9STkkuQ0VELk5VT1ZBCQkjIwlSZXN0aXR1aXNjZSBpbCBudW1lcm8gZGkgZ2lvcm5pIGNoZSB2YW5ubyBkYWxsYSBkYXRhIGRpIGxpcXVpZGF6aW9uZSBhbGxhIGRhdGEgZGVsbGEgY2Vkb2xhIHN1Y2Nlc3NpdmENCkNPVVBOQ0QJCQk9IERBVEEuQ0VELlNVQ0MJCQkjIwlSZXN0aXR1aXNjZSB1biBudW1lcm8gY2hlIHJhcHByZXNlbnRhIGxhIGRhdGEgZGVsbGEgY2Vkb2xhIHN1Y2Nlc3NpdmEgYWxsYSBkYXRhIGRpIGxpcXVpZGF6aW9uZQ0KQ09VUE5VTQkJCT0gTlVNLkNFRAkJCSMjCVJlc3RpdHVpc2NlIGlsIG51bWVybyBkaSBjZWRvbGUgcGFnYWJpbGkgZnJhIGxhIGRhdGEgZGkgbGlxdWlkYXppb25lIGUgbGEgZGF0YSBkaSBzY2FkZW56YQ0KQ09VUFBDRAkJCT0gREFUQS5DRUQuUFJFQwkJCSMjCVJlc3RpdHVpc2NlIHVuIG51bWVybyBjaGUgcmFwcHJlc2VudGEgbGEgZGF0YSBkZWxsYSBjZWRvbGEgcHJlY2VkZW50ZSBhbGxhIGRhdGEgZGkgbGlxdWlkYXppb25lDQpDVU1JUE1UCQkJPSBJTlQuQ1VNVUwJCQkjIwlSZXN0aXR1aXNjZSBsJ2ludGVyZXNzZSBjdW11bGF0aXZvIHBhZ2F0byBmcmEgZHVlIHBlcmlvZGkNCkNVTVBSSU5DCQk9IENBUC5DVU0JCQkjIwlSZXN0aXR1aXNjZSBpbCBjYXBpdGFsZSBjdW11bGF0aXZvIHBhZ2F0byBwZXIgZXN0aW5ndWVyZSB1biBkZWJpdG8gZnJhIGR1ZSBwZXJpb2RpDQpEQgkJCT0gREIJCQkJIyMJUmVzdGl0dWlzY2UgbCdhbW1vcnRhbWVudG8gZGkgdW4gYmVuZSBwZXIgdW4gcGVyaW9kbyBzcGVjaWZpY2F0byB1dGlsaXp6YW5kbyBpbCBtZXRvZG8gZGkgYW1tb3J0YW1lbnRvIGEgcXVvdGUgZmlzc2UgZGVjcmVzY2VudGkNCkREQgkJCT0gQU1NT1JUCQkJIyMJUmVzdGl0dWlzY2UgbCdhbW1vcnRhbWVudG8gZGkgdW4gYmVuZSBwZXIgdW4gcGVyaW9kbyBzcGVjaWZpY2F0byB1dGlsaXp6YW5kbyBpbCBtZXRvZG8gZGkgYW1tb3J0YW1lbnRvIGEgZG9wcGllIHF1b3RlIGRlY3Jlc2NlbnRpIG8gYWx0cmkgbWV0b2RpIHNwZWNpZmljYXRpDQpESVNDCQkJPSBUQVNTTy5TQ09OVE8JCQkjIwlSZXN0aXR1aXNjZSBpbCB0YXNzbyBkaSBzY29udG8gcGVyIHVuIHRpdG9sbw0KRE9MTEFSREUJCT0gVkFMVVRBLkRFQwkJCSMjCUNvbnZlcnRlIHVuIHByZXp6byB2YWx1dGEsIGVzcHJlc3NvIGNvbWUgZnJhemlvbmUsIGluIHByZXp6byB2YWx1dGEsIGVzcHJlc3NvIGNvbWUgbnVtZXJvIGRlY2ltYWxlDQpET0xMQVJGUgkJPSBWQUxVVEEuRlJBWgkJCSMjCUNvbnZlcnRlIHVuIHByZXp6byB2YWx1dGEsIGVzcHJlc3NvIGNvbWUgbnVtZXJvIGRlY2ltYWxlLCBpbiBwcmV6em8gdmFsdXRhLCBlc3ByZXNzbyBjb21lIGZyYXppb25lDQpEVVJBVElPTgkJPSBEVVJBVEEJCQkjIwlSZXN0aXR1aXNjZSBsYSBkdXJhdGEgYW5udWFsZSBkaSB1biB0aXRvbG8gY29uIGkgcGFnYW1lbnRpIGRpIGludGVyZXNzZSBwZXJpb2RpY28NCkVGRkVDVAkJCT0gRUZGRVRUSVZPCQkJIyMJUmVzdGl0dWlzY2UgbCdlZmZldHRpdm8gdGFzc28gZGkgaW50ZXJlc3NlIGFubnVvDQpGVgkJCT0gVkFMLkZVVAkJCSMjCVJlc3RpdHVpc2NlIGlsIHZhbG9yZSBmdXR1cm8gZGkgdW4gaW52ZXN0aW1lbnRvDQpGVlNDSEVEVUxFCQk9IFZBTC5GVVQuQ0FQSVRBTEUJCSMjCVJlc3RpdHVpc2NlIGlsIHZhbG9yZSBmdXR1cm8gZGkgdW4gY2FwaXRhbGUgaW5pemlhbGUgZG9wbyBhdmVyIGFwcGxpY2F0byB1bmEgc2VyaWUgZGkgdGFzc2kgZGkgaW50ZXJlc3NlIGNvbXBvc3RpDQpJTlRSQVRFCQkJPSBUQVNTTy5JTlQJCQkjIwlSZXN0aXR1aXNjZSBpbCB0YXNzbyBkaSBpbnRlcmVzc2UgcGVyIHVuIHRpdG9sbyBpbnRlcmFtZW50ZSBpbnZlc3RpdG8NCklQTVQJCQk9IElOVEVSRVNTSQkJCSMjCVJlc3RpdHVpc2NlIGlsIHZhbG9yZSBkZWdsaSBpbnRlcmVzc2kgcGVyIHVuIGludmVzdGltZW50byByZWxhdGl2byBhIHVuIHBlcmlvZG8gc3BlY2lmaWNvDQpJUlIJCQk9IFRJUi5DT1NUCQkJIyMJUmVzdGl0dWlzY2UgaWwgdGFzc28gZGkgcmVuZGltZW50byBpbnRlcm5vIHBlciB1bmEgc2VyaWUgZGkgZmx1c3NpIGRpIGNhc3NhDQpJU1BNVAkJCT0gSU5URVJFU1NFLlJBVEEJCSMjCUNhbGNvbGEgbCdpbnRlcmVzc2UgZGkgdW4gaW52ZXN0aW1lbnRvIHBhZ2F0byBkdXJhbnRlIHVuIHBlcmlvZG8gc3BlY2lmaWNvDQpNRFVSQVRJT04JCT0gRFVSQVRBLk0JCQkjIwlSZXN0aXR1aXNjZSBsYSBkdXJhdGEgTWFjYXVsZXkgbW9kaWZpY2F0YSBwZXIgdW4gdGl0b2xvIGNvbiB1biB2YWxvcmUgcHJlc3VudG8gZGkg4oKsIDEwMA0KTUlSUgkJCT0gVElSLlZBUgkJCSMjCVJlc3RpdHVpc2NlIGlsIHRhc3NvIGRpIHJlbmRpbWVudG8gaW50ZXJubyBpbiBjdWkgaSBmbHVzc2kgZGkgY2Fzc2EgcG9zaXRpdmkgZSBuZWdhdGl2aSBzb25vIGZpbmFuemlhdGkgYSB0YXNzaSBkaWZmZXJlbnRpDQpOT01JTkFMCQkJPSBOT01JTkFMRQkJCSMjCVJlc3RpdHVpc2NlIGlsIHRhc3NvIGRpIGludGVyZXNzZSBub21pbmFsZSBhbm51YWxlDQpOUEVSCQkJPSBOVU0uUkFURQkJCSMjCVJlc3RpdHVpc2NlIHVuIG51bWVybyBkaSBwZXJpb2RpIHJlbGF0aXZpIGEgdW4gaW52ZXN0aW1lbnRvDQpOUFYJCQk9IFZBTgkJCQkjIwlSZXN0aXR1aXNjZSBpbCB2YWxvcmUgYXR0dWFsZSBuZXR0byBkaSB1biBpbnZlc3RpbWVudG8gYmFzYXRvIHN1IHVuYSBzZXJpZSBkaSBmbHVzc2kgZGkgY2Fzc2EgcGVyaW9kaWNpIGUgc3VsIHRhc3NvIGRpIHNjb250bw0KT0RERlBSSUNFCQk9IFBSRVpaTy5QUklNTy5JUlIJCSMjCVJlc3RpdHVpc2NlIGlsIHByZXp6byBkaSB1biB0aXRvbG8gZGFsIHZhbG9yZSBub21pbmFsZSBkaSDigqwgMTAwIGF2ZW50ZSBpbCBwcmltbyBwZXJpb2RvIGRpIGR1cmF0YSBpcnJlZ29sYXJlDQpPRERGWUlFTEQJCT0gUkVORC5QUklNTy5JUlIJCSMjCVJlc3RpdHVpc2NlIGlsIHJlbmRpbWVudG8gZGkgdW4gdGl0b2xvIGF2ZW50ZSBpbCBwcmltbyBwZXJpb2RvIGRpIGR1cmF0YSBpcnJlZ29sYXJlDQpPRERMUFJJQ0UJCT0gUFJFWlpPLlVMVElNTy5JUlIJCSMjCVJlc3RpdHVpc2NlIGlsIHByZXp6byBkaSB1biB0aXRvbG8gZGFsIHZhbG9yZSBub21pbmFsZSBkaSDigqwgMTAwIGF2ZW50ZSBsJ3VsdGltbyBwZXJpb2RvIGRpIGR1cmF0YSBpcnJlZ29sYXJlDQpPRERMWUlFTEQJCT0gUkVORC5VTFRJTU8uSVJSCQkjIwlSZXN0aXR1aXNjZSBpbCByZW5kaW1lbnRvIGRpIHVuIHRpdG9sbyBhdmVudGUgbCd1bHRpbW8gcGVyaW9kbyBkaSBkdXJhdGEgaXJyZWdvbGFyZQ0KUE1UCQkJPSBSQVRBCQkJCSMjCVJlc3RpdHVpc2NlIGlsIHBhZ2FtZW50byBwZXJpb2RpY28gZGkgdW5hIHJlbmRpdGEgYW5udWENClBQTVQJCQk9IFAuUkFUQQkJCSMjCVJlc3RpdHVpc2NlIGlsIHBhZ2FtZW50byBzdWwgY2FwaXRhbGUgZGkgdW4gaW52ZXN0aW1lbnRvIHBlciB1biBkYXRvIHBlcmlvZG8NClBSSUNFCQkJPSBQUkVaWk8JCQkjIwlSZXN0aXR1aXNjZSBpbCBwcmV6em8gZGkgdW4gdGl0b2xvIGRhbCB2YWxvcmUgbm9taW5hbGUgZGkg4oKsIDEwMCBjaGUgcGFnYSBpbnRlcmVzc2kgcGVyaW9kaWNpDQpQUklDRURJU0MJCT0gUFJFWlpPLlNDT05UCQkJIyMJUmVzdGl0dWlzY2UgaWwgcHJlenpvIGRpIHVuIHRpdG9sbyBzY29udGF0byBkYWwgdmFsb3JlIG5vbWluYWxlIGRpIOKCrCAxMDANClBSSUNFTUFUCQk9IFBSRVpaTy5TQ0FECQkJIyMJUmVzdGl0dWlzY2UgaWwgcHJlenpvIGRpIHVuIHRpdG9sbyBkYWwgdmFsb3JlIG5vbWluYWxlIGRpIOKCrCAxMDAgY2hlIHBhZ2EgZ2xpIGludGVyZXNzaSBhbGxhIHNjYWRlbnphDQpQVgkJCT0gVkEJCQkJIyMJUmVzdGl0dWlzY2UgaWwgdmFsb3JlIGF0dHVhbGUgZGkgdW4gaW52ZXN0aW1lbnRvDQpSQVRFCQkJPSBUQVNTTwkJCQkjIwlSZXN0aXR1aXNjZSBpbCB0YXNzbyBkaSBpbnRlcmVzc2UgcGVyIHVuIHBlcmlvZG8gZGkgdW4nYW5udWFsaXTDoA0KUkVDRUlWRUQJCT0gUklDRVYuU0NBRAkJCSMjCVJlc3RpdHVpc2NlIGwnYW1tb250YXJlIHJpY2V2dXRvIGFsbGEgc2NhZGVuemEgZGkgdW4gdGl0b2xvIGludGVyYW1lbnRlIGludmVzdGl0bw0KU0xOCQkJPSBBTU1PUlQuQ09TVAkJCSMjCVJlc3RpdHVpc2NlIGwnYW1tb3J0YW1lbnRvIGEgcXVvdGUgY29zdGFudGkgZGkgdW4gYmVuZSBwZXIgdW4gc2luZ29sbyBwZXJpb2RvDQpTWUQJCQk9IEFNTU9SVC5BTk5VTwkJCSMjCVJlc3RpdHVpc2NlIGwnYW1tb3J0YW1lbnRvIGEgc29tbWEgZGVnbGkgYW5uaSBkaSB1biBiZW5lIHBlciB1biBwZXJpb2RvIHNwZWNpZmljYXRvDQpUQklMTEVRCQkJPSBCT1QuRVFVSVYJCQkjIwlSZXN0aXR1aXNjZSBpbCByZW5kaW1lbnRvIGVxdWl2YWxlbnRlIGFkIHVuJ29iYmxpZ2F6aW9uZSBwZXIgdW4gQnVvbm8gb3JkaW5hcmlvIGRlbCBUZXNvcm8NClRCSUxMUFJJQ0UJCT0gQk9ULlBSRVpaTwkJCSMjCVJlc3RpdHVpc2NlIGlsIHByZXp6byBkaSB1biBCdW9ubyBkZWwgVGVzb3JvIGRhbCB2YWxvcmUgbm9taW5hbGUgZGkg4oKsIDEwMA0KVEJJTExZSUVMRAkJPSBCT1QuUkVORAkJCSMjCVJlc3RpdHVpc2NlIGlsIHJlbmRpbWVudG8gZGkgdW4gQnVvbm8gZGVsIFRlc29ybw0KVkRCCQkJPSBBTU1PUlQuVkFSCQkJIyMJUmVzdGl0dWlzY2UgbCdhbW1vcnRhbWVudG8gZGkgdW4gYmVuZSBwZXIgdW4gcGVyaW9kbyBzcGVjaWZpY2F0byBvIHBhcnppYWxlIHV0aWxpenphbmRvIGlsIG1ldG9kbyBhIGRvcHBpZSBxdW90ZSBwcm9wb3J6aW9uYWxpIGFpIHZhbG9yaSByZXNpZHVpDQpYSVJSCQkJPSBUSVIuWAkJCQkjIwlSZXN0aXR1aXNjZSBpbCB0YXNzbyBkaSByZW5kaW1lbnRvIGludGVybm8gZGkgdW4gaW1waWVnbyBkaSBmbHVzc2kgZGkgY2Fzc2ENClhOUFYJCQk9IFZBTi5YCQkJCSMjCVJlc3RpdHVpc2NlIGlsIHZhbG9yZSBhdHR1YWxlIG5ldHRvIGRpIHVuIGltcGllZ28gZGkgZmx1c3NpIGRpIGNhc3NhIG5vbiBuZWNlc3NhcmlhbWVudGUgcGVyaW9kaWNpDQpZSUVMRAkJCT0gUkVORAkJCQkjIwlSZXN0aXR1aXNjZSBpbCByZW5kaW1lbnRvIGRpIHVuIHRpdG9sbyBjaGUgZnJ1dHRhIGludGVyZXNzaSBwZXJpb2RpY2kNCllJRUxERElTQwkJPSBSRU5ELlRJVE9MSS5TQ09OVAkJIyMJUmVzdGl0dWlzY2UgaWwgcmVuZGltZW50byBhbm51YWxlIGRpIHVuIHRpdG9sbyBzY29udGF0bywgYWQgZXNlbXBpbyB1biBCdW9ubyBkZWwgVGVzb3JvDQpZSUVMRE1BVAkJPSBSRU5ELlNDQUQJCQkjIwlSZXN0aXR1aXNjZSBpbCByZW5kaW1lbnRvIGFubnVvIGRpIHVuIHRpdG9sbyBjaGUgcGFnYSBpbnRlcmVzc2kgYWxsYSBzY2FkZW56YQ0KDQoNCiMjDQojIwlJbmZvcm1hdGlvbiBmdW5jdGlvbnMJCQkJRnVuemlvbmkgcmVsYXRpdmUgYWxsZSBpbmZvcm1hemlvbmkNCiMjDQpDRUxMCQkJPSBDRUxMQQkJCQkjIwlSZXN0aXR1aXNjZSBsZSBpbmZvcm1hemlvbmkgc3VsbGEgZm9ybWF0dGF6aW9uZSwgbGEgcG9zaXppb25lIG8gaSBjb250ZW51dGkgZGkgdW5hIGNlbGxhDQpFUlJPUi5UWVBFCQk9IEVSUk9SRS5USVBPCQkJIyMJUmVzdGl0dWlzY2UgdW4gbnVtZXJvIGNoZSBjb3JyaXNwb25kZSBhIHVuIHRpcG8gZGkgZXJyb3JlDQpJTkZPCQkJPSBJTkZPCQkJCSMjCVJlc3RpdHVpc2NlIGxlIGluZm9ybWF6aW9uaSBzdWxsJ2FtYmllbnRlIG9wZXJhdGl2byBjb3JyZW50ZQ0KSVNCTEFOSwkJCT0gVkFMLlZVT1RPCQkJIyMJUmVzdGl0dWlzY2UgVkVSTyBzZSBpbCB2YWxvcmUgw6ggdnVvdG8NCklTRVJSCQkJPSBWQUwuRVJSCQkJIyMJUmVzdGl0dWlzY2UgVkVSTyBzZSBpbCB2YWxvcmUgw6ggdW4gdmFsb3JlIGRpIGVycm9yZSBxdWFsc2lhc2kgdHJhbm5lICNOL0QNCklTRVJST1IJCQk9IFZBTC5FUlJPUkUJCQkjIwlSZXN0aXR1aXNjZSBWRVJPIHNlIGlsIHZhbG9yZSDDqCB1biB2YWxvcmUgZGkgZXJyb3JlIHF1YWxzaWFzaQ0KSVNFVkVOCQkJPSBWQUwuUEFSSQkJCSMjCVJlc3RpdHVpc2NlIFZFUk8gc2UgaWwgbnVtZXJvIMOoIHBhcmkNCklTTE9HSUNBTAkJPSBWQUwuTE9HSUNPCQkJIyMJUmVzdGl0dWlzY2UgVkVSTyBzZSBpbCB2YWxvcmUgw6ggdW4gdmFsb3JlIGxvZ2ljbw0KSVNOQQkJCT0gVkFMLk5PTi5ESVNQCQkJIyMJUmVzdGl0dWlzY2UgVkVSTyBzZSBpbCB2YWxvcmUgw6ggdW4gdmFsb3JlIGRpIGVycm9yZSAjTi9EDQpJU05PTlRFWFQJCT0gVkFMLk5PTi5URVNUTwkJCSMjCVJlc3RpdHVpc2NlIFZFUk8gc2UgaWwgdmFsb3JlIG5vbiDDqCBpbiBmb3JtYXRvIHRlc3RvDQpJU05VTUJFUgkJPSBWQUwuTlVNRVJPCQkJIyMJUmVzdGl0dWlzY2UgVkVSTyBzZSBpbCB2YWxvcmUgw6ggdW4gbnVtZXJvDQpJU09ERAkJCT0gVkFMLkRJU1BBUkkJCQkjIwlSZXN0aXR1aXNjZSBWRVJPIHNlIGlsIG51bWVybyDDqCBkaXNwYXJpDQpJU1JFRgkJCT0gVkFMLlJJRgkJCSMjCVJlc3RpdHVpc2NlIFZFUk8gc2UgaWwgdmFsb3JlIMOoIHVuIHJpZmVyaW1lbnRvDQpJU1RFWFQJCQk9IFZBTC5URVNUTwkJCSMjCVJlc3RpdHVpc2NlIFZFUk8gc2UgaWwgdmFsb3JlIMOoIGluIGZvcm1hdG8gdGVzdG8NCk4JCQk9IE5VTQkJCQkjIwlSZXN0aXR1aXNjZSB1biB2YWxvcmUgY29udmVydGl0byBpbiBudW1lcm8NCk5BCQkJPSBOT04uRElTUAkJCSMjCVJlc3RpdHVpc2NlIGlsIHZhbG9yZSBkaSBlcnJvcmUgI04vRA0KVFlQRQkJCT0gVElQTwkJCQkjIwlSZXN0aXR1aXNjZSB1biBudW1lcm8gY2hlIGluZGljYSBpbCB0aXBvIGRpIGRhdGkgcmVsYXRpdmkgYSB1biB2YWxvcmUNCg0KDQojIw0KIyMJTG9naWNhbCBmdW5jdGlvbnMJCQkJRnVuemlvbmkgbG9naWNoZQ0KIyMNCkFORAkJCT0gRQkJCQkjIwlSZXN0aXR1aXNjZSBWRVJPIHNlIHR1dHRpIGdsaSBhcmdvbWVudGkgc29ubyBWRVJPDQpGQUxTRQkJCT0gRkFMU08JCQkJIyMJUmVzdGl0dWlzY2UgaWwgdmFsb3JlIGxvZ2ljbyBGQUxTTw0KSUYJCQk9IFNFCQkJCSMjCVNwZWNpZmljYSB1biB0ZXN0IGxvZ2ljbyBkYSBlc2VndWlyZQ0KSUZFUlJPUgkJCT0gU0UuRVJST1JFCQkJIyMJUmVzdGl0dWlzY2UgdW4gdmFsb3JlIHNwZWNpZmljYXRvIHNlIHVuYSBmb3JtdWxhIGZvcm5pc2NlIHVuIGVycm9yZSBjb21lIHJpc3VsdGF0bzsgaW4gY2FzbyBjb250cmFyaW8sIHJlc3RpdHVpc2NlIGlsIHJpc3VsdGF0byBkZWxsYSBmb3JtdWxhDQpOT1QJCQk9IE5PTgkJCQkjIwlJbnZlcnRlIGxhIGxvZ2ljYSBkZWdsaSBhcmdvbWVudGkNCk9SCQkJPSBPCQkJCSMjCVJlc3RpdHVpc2NlIFZFUk8gc2UgdW4gYXJnb21lbnRvIHF1YWxzaWFzaSDDqCBWRVJPDQpUUlVFCQkJPSBWRVJPCQkJCSMjCVJlc3RpdHVpc2NlIGlsIHZhbG9yZSBsb2dpY28gVkVSTw0KDQoNCiMjDQojIwlMb29rdXAgYW5kIHJlZmVyZW5jZSBmdW5jdGlvbnMJCQlGdW56aW9uaSBkaSByaWNlcmNhIGUgZGkgcmlmZXJpbWVudG8NCiMjDQpBRERSRVNTCQkJPSBJTkRJUklaWk8JCQkjIwlSZXN0aXR1aXNjZSB1biByaWZlcmltZW50byBjb21lIHRlc3RvIGluIHVuYSBzaW5nb2xhIGNlbGxhIGRpIHVuIGZvZ2xpbyBkaSBsYXZvcm8NCkFSRUFTCQkJPSBBUkVFCQkJCSMjCVJlc3RpdHVpc2NlIGlsIG51bWVybyBkaSBhcmVlIGluIHVuIHJpZmVyaW1lbnRvDQpDSE9PU0UJCQk9IFNDRUdMSQkJCSMjCVNjZWdsaWUgdW4gdmFsb3JlIGRhIHVuIGVsZW5jbyBkaSB2YWxvcmkNCkNPTFVNTgkJCT0gUklGLkNPTE9OTkEJCQkjIwlSZXN0aXR1aXNjZSBpbCBudW1lcm8gZGkgY29sb25uYSBkaSB1biByaWZlcmltZW50bw0KQ09MVU1OUwkJCT0gQ09MT05ORQkJCSMjCVJlc3RpdHVpc2NlIGlsIG51bWVybyBkaSBjb2xvbm5lIGluIHVuIHJpZmVyaW1lbnRvDQpITE9PS1VQCQkJPSBDRVJDQS5PUklaWgkJCSMjCUVmZmV0dHVhIHVuYSByaWNlcmNhIG5lbGxhIHJpZ2Egc3VwZXJpb3JlIGRpIHVuYSBtYXRyaWNlIGUgcmVzdGl0dWlzY2UgaWwgdmFsb3JlIGRlbGxhIGNlbGxhIHNwZWNpZmljYXRhDQpIWVBFUkxJTksJCT0gQ09MTEVHLklQRVJURVNUVUFMRQkJIyMJQ3JlYSB1biBjb2xsZWdhbWVudG8gY2hlIGFwcmUgdW4gZG9jdW1lbnRvIG1lbW9yaXp6YXRvIGluIHVuIHNlcnZlciBkaSByZXRlLCB1bmEgcmV0ZSBJbnRyYW5ldCBvIEludGVybmV0DQpJTkRFWAkJCT0gSU5ESUNFCQkJIyMJVXRpbGl6emEgdW4gaW5kaWNlIHBlciBzY2VnbGllcmUgdW4gdmFsb3JlIGRhIHVuIHJpZmVyaW1lbnRvIG8gZGEgdW5hIG1hdHJpY2UNCklORElSRUNUCQk9IElORElSRVRUTwkJCSMjCVJlc3RpdHVpc2NlIHVuIHJpZmVyaW1lbnRvIHNwZWNpZmljYXRvIGRhIHVuIHZhbG9yZSB0ZXN0bw0KTE9PS1VQCQkJPSBDRVJDQQkJCQkjIwlSaWNlcmNhIGkgdmFsb3JpIGluIHVuIHZldHRvcmUgbyBpbiB1bmEgbWF0cmljZQ0KTUFUQ0gJCQk9IENPTkZST05UQQkJCSMjCVJpY2VyY2EgaSB2YWxvcmkgaW4gdW4gcmlmZXJpbWVudG8gbyBpbiB1bmEgbWF0cmljZQ0KT0ZGU0VUCQkJPSBTQ0FSVE8JCQkjIwlSZXN0aXR1aXNjZSB1bm8gc2NhcnRvIGRpIHJpZmVyaW1lbnRvIGRhIHVuIHJpZmVyaW1lbnRvIGRhdG8NClJPVwkJCT0gUklGLlJJR0EJCQkjIwlSZXN0aXR1aXNjZSBpbCBudW1lcm8gZGkgcmlnYSBkaSB1biByaWZlcmltZW50bw0KUk9XUwkJCT0gUklHSEUJCQkJIyMJUmVzdGl0dWlzY2UgaWwgbnVtZXJvIGRlbGxlIHJpZ2hlIGluIHVuIHJpZmVyaW1lbnRvDQpSVEQJCQk9IERBVElURU1QT1JFQUxFCQkjIwlSZWN1cGVyYSBkYXRpIGluIHRlbXBvIHJlYWxlIGRhIHVuIHByb2dyYW1tYSBjaGUgc3VwcG9ydGEgbCdhdXRvbWF6aW9uZSBDT00gKGF1dG9tYXppb25lOiBNZXRvZG8gcGVyIHV0aWxpenphcmUgZ2xpIG9nZ2V0dGkgZGkgdW4nYXBwbGljYXppb25lIGRhIHVuJ2FsdHJhIGFwcGxpY2F6aW9uZSBvIGRhIHVuIGFsdHJvIHN0cnVtZW50byBkaSBzdmlsdXBwby4gUHJlY2VkZW50ZW1lbnRlIG5vdGEgY29tZSBhdXRvbWF6aW9uZSBPTEUsIGwnYXV0b21hemlvbmUgw6ggdW5vIHN0YW5kYXJkIGRlbCBzZXR0b3JlIGUgdW5hIGNhcmF0dGVyaXN0aWNhIGRlbCBtb2RlbGxvIENPTSAoQ29tcG9uZW50IE9iamVjdCBNb2RlbCkuKQ0KVFJBTlNQT1NFCQk9IE1BVFIuVFJBU1BPU1RBCQkjIwlSZXN0aXR1aXNjZSBsYSB0cmFzcG9zaXppb25lIGRpIHVuYSBtYXRyaWNlDQpWTE9PS1VQCQkJPSBDRVJDQS5WRVJUCQkJIyMJRWZmZXR0dWEgdW5hIHJpY2VyY2EgbmVsbGEgcHJpbWEgY29sb25uYSBkaSB1bmEgbWF0cmljZSBlIHNpIHNwb3N0YSBhdHRyYXZlcnNvIGxhIHJpZ2EgcGVyIHJlc3RpdHVpcmUgaWwgdmFsb3JlIGRpIHVuYSBjZWxsYQ0KDQoNCiMjDQojIwlNYXRoIGFuZCB0cmlnb25vbWV0cnkgZnVuY3Rpb25zCQkJRnVuemlvbmkgbWF0ZW1hdGljaGUgZSB0cmlnb25vbWV0cmljaGUNCiMjDQpBQlMJCQk9IEFTUwkJCQkjIwlSZXN0aXR1aXNjZSBpbCB2YWxvcmUgYXNzb2x1dG8gZGkgdW4gbnVtZXJvLg0KQUNPUwkJCT0gQVJDQ09TCQkJIyMJUmVzdGl0dWlzY2UgbCdhcmNvY29zZW5vIGRpIHVuIG51bWVybw0KQUNPU0gJCQk9IEFSQ0NPU0gJCQkjIwlSZXN0aXR1aXNjZSBsJ2ludmVyc28gZGVsIGNvc2VubyBpcGVyYm9saWNvIGRpIHVuIG51bWVybw0KQVNJTgkJCT0gQVJDU0VOCQkJIyMJUmVzdGl0dWlzY2UgbCdhcmNvc2VubyBkaSB1biBudW1lcm8NCkFTSU5ICQkJPSBBUkNTRU5ICQkJIyMJUmVzdGl0dWlzY2UgbCdpbnZlcnNvIGRlbCBzZW5vIGlwZXJib2xpY28gZGkgdW4gbnVtZXJvDQpBVEFOCQkJPSBBUkNUQU4JCQkjIwlSZXN0aXR1aXNjZSBsJ2FyY290YW5nZW50ZSBkaSB1biBudW1lcm8NCkFUQU4yCQkJPSBBUkNUQU4uMgkJCSMjCVJlc3RpdHVpc2NlIGwnYXJjb3RhbmdlbnRlIGRlbGxlIGNvb3JkaW5hdGUgeCBlIHkgc3BlY2lmaWNhdGUNCkFUQU5ICQkJPSBBUkNUQU5ICQkJIyMJUmVzdGl0dWlzY2UgbCdpbnZlcnNvIGRlbGxhIHRhbmdlbnRlIGlwZXJib2xpY2EgZGkgdW4gbnVtZXJvDQpDRUlMSU5HCQkJPSBBUlJPVE9OREEuRUNDRVNTTwkJIyMJQXJyb3RvbmRhIHVuIG51bWVybyBwZXIgZWNjZXNzbyBhbGwnaW50ZXJvIHBpw7kgdmljaW5vIG8gYWwgbXVsdGlwbG8gcGnDuSB2aWNpbm8gYSBwZXNvDQpDT01CSU4JCQk9IENPTUJJTkFaSU9ORQkJCSMjCVJlc3RpdHVpc2NlIGlsIG51bWVybyBkaSBjb21iaW5hemlvbmkgcG9zc2liaWxpIHBlciB1biBudW1lcm8gYXNzZWduYXRvIGRpIGVsZW1lbnRpDQpDT1MJCQk9IENPUwkJCQkjIwlSZXN0aXR1aXNjZSBpbCBjb3Nlbm8gZGVsbCdhbmdvbG8gc3BlY2lmaWNhdG8NCkNPU0gJCQk9IENPU0gJCQkJIyMJUmVzdGl0dWlzY2UgaWwgY29zZW5vIGlwZXJib2xpY28gZGkgdW4gbnVtZXJvDQpERUdSRUVTCQkJPSBHUkFESQkJCQkjIwlDb252ZXJ0ZSBpIHJhZGlhbnRpIGluIGdyYWRpDQpFVkVOCQkJPSBQQVJJCQkJCSMjCUFycm90b25kYSBpbCB2YWxvcmUgYXNzb2x1dG8gZGkgdW4gbnVtZXJvIHBlciBlY2Nlc3NvIGFsIHBpw7kgdmljaW5vIGludGVybyBwYXJpDQpFWFAJCQk9IEVTUAkJCQkjIwlSZXN0aXR1aXNjZSBpbCBudW1lcm8gZSBlbGV2YXRvIGFsbGEgcG90ZW56YSBkaSBudW0NCkZBQ1QJCQk9IEZBVFRPUklBTEUJCQkjIwlSZXN0aXR1aXNjZSBpbCBmYXR0b3JpYWxlIGRpIHVuIG51bWVybw0KRkFDVERPVUJMRQkJPSBGQVRULkRPUFBJTwkJCSMjCVJlc3RpdHVpc2NlIGlsIGZhdHRvcmlhbGUgZG9wcGlvIGRpIHVuIG51bWVybw0KRkxPT1IJCQk9IEFSUk9UT05EQS5ESUZFVFRPCQkjIwlBcnJvdG9uZGEgdW4gbnVtZXJvIHBlciBkaWZldHRvIGFsIG11bHRpcGxvIHBpw7kgdmljaW5vIGEgemVybw0KR0NECQkJPSBNQ0QJCQkJIyMJUmVzdGl0dWlzY2UgaWwgbWFzc2ltbyBjb211bmUgZGl2aXNvcmUNCklOVAkJCT0gSU5UCQkJCSMjCUFycm90b25kYSB1biBudW1lcm8gcGVyIGRpZmV0dG8gYWwgbnVtZXJvIGludGVybyBwacO5IHZpY2lubw0KTENNCQkJPSBNQ00JCQkJIyMJUmVzdGl0dWlzY2UgaWwgbWluaW1vIGNvbXVuZSBtdWx0aXBsbw0KTE4JCQk9IExOCQkJCSMjCVJlc3RpdHVpc2NlIGlsIGxvZ2FyaXRtbyBuYXR1cmFsZSBkaSB1biBudW1lcm8NCkxPRwkJCT0gTE9HCQkJCSMjCVJlc3RpdHVpc2NlIGlsIGxvZ2FyaXRtbyBkaSB1biBudW1lcm8gaW4gdW5hIHNwZWNpZmljYXRhIGJhc2UNCkxPRzEwCQkJPSBMT0cxMAkJCQkjIwlSZXN0aXR1aXNjZSBpbCBsb2dhcml0bW8gaW4gYmFzZSAxMCBkaSB1biBudW1lcm8NCk1ERVRFUk0JCQk9IE1BVFIuREVURVJNCQkJIyMJUmVzdGl0dWlzY2UgaWwgZGV0ZXJtaW5hbnRlIGRpIHVuYSBtYXRyaWNlDQpNSU5WRVJTRQkJPSBNQVRSLklOVkVSU0EJCQkjIwlSZXN0aXR1aXNjZSBsJ2ludmVyc28gZGkgdW5hIG1hdHJpY2UNCk1NVUxUCQkJPSBNQVRSLlBST0RPVFRPCQkJIyMJUmVzdGl0dWlzY2UgaWwgcHJvZG90dG8gZGkgZHVlIG1hdHJpY2kNCk1PRAkJCT0gUkVTVE8JCQkJIyMJUmVzdGl0dWlzY2UgaWwgcmVzdG8gZGVsbGEgZGl2aXNpb25lDQpNUk9VTkQJCQk9IEFSUk9UT05EQS5NVUxUSVBMTwkJIyMJUmVzdGl0dWlzY2UgdW4gbnVtZXJvIGFycm90b25kYXRvIGFsIG11bHRpcGxvIGRlc2lkZXJhdG8NCk1VTFRJTk9NSUFMCQk9IE1VTFRJTk9NSUFMRQkJCSMjCVJlc3RpdHVpc2NlIGlsIG11bHRpbm9taWFsZSBkaSB1biBpbnNpZW1lIGRpIG51bWVyaQ0KT0RECQkJPSBESVNQQVJJCQkJIyMJQXJyb3RvbmRhIHVuIG51bWVybyBwZXIgZWNjZXNzbyBhbCBwacO5IHZpY2lubyBpbnRlcm8gZGlzcGFyaQ0KUEkJCQk9IFBJLkdSRUNPCQkJIyMJUmVzdGl0dWlzY2UgaWwgdmFsb3JlIGRpIHBpIGdyZWNvDQpQT1dFUgkJCT0gUE9URU5aQQkJCSMjCVJlc3RpdHVpc2NlIGlsIHJpc3VsdGF0byBkaSB1biBudW1lcm8gZWxldmF0byBhIHBvdGVuemENClBST0RVQ1QJCQk9IFBST0RPVFRPCQkJIyMJTW9sdGlwbGljYSBpIHN1b2kgYXJnb21lbnRpDQpRVU9USUVOVAkJPSBRVU9aSUVOVEUJCQkjIwlSZXN0aXR1aXNjZSBsYSBwYXJ0ZSBpbnRlcmEgZGkgdW5hIGRpdmlzaW9uZQ0KUkFESUFOUwkJCT0gUkFESUFOVEkJCQkjIwlDb252ZXJ0ZSBpIGdyYWRpIGluIHJhZGlhbnRpDQpSQU5ECQkJPSBDQVNVQUxFCQkJIyMJUmVzdGl0dWlzY2UgdW4gbnVtZXJvIGNhc3VhbGUgY29tcHJlc28gdHJhIDAgZSAxDQpSQU5EQkVUV0VFTgkJPSBDQVNVQUxFLlRSQQkJCSMjCVJlc3RpdHVpc2NlIHVuIG51bWVybyBjYXN1YWxlIGNvbXByZXNvIHRyYSBpIG51bWVyaSBzcGVjaWZpY2F0aQ0KUk9NQU4JCQk9IFJPTUFOTwkJCSMjCVJlc3RpdHVpc2NlIGlsIG51bWVybyBjb21lIG51bWVybyByb21hbm8gc290dG8gZm9ybWEgZGkgdGVzdG8NClJPVU5ECQkJPSBBUlJPVE9OREEJCQkjIwlBcnJvdG9uZGEgaWwgbnVtZXJvIGFsIG51bWVybyBkaSBjaWZyZSBzcGVjaWZpY2F0bw0KUk9VTkRET1dOCQk9IEFSUk9UT05EQS5QRVIuRElGCQkjIwlBcnJvdG9uZGEgaWwgdmFsb3JlIGFzc29sdXRvIGRpIHVuIG51bWVybyBwZXIgZGlmZXR0bw0KUk9VTkRVUAkJCT0gQVJST1RPTkRBLlBFUi5FQ0MJCSMjCUFycm90b25kYSBpbCB2YWxvcmUgYXNzb2x1dG8gZGkgdW4gbnVtZXJvIHBlciBlY2Nlc3NvDQpTRVJJRVNTVU0JCT0gU09NTUEuU0VSSUUJCQkjIwlSZXN0aXR1aXNjZSBsYSBzb21tYSBkaSB1bmEgc2VyaWUgZGkgcG90ZW56ZSBpbiBiYXNlIGFsbGEgZm9ybXVsYQ0KU0lHTgkJCT0gU0VHTk8JCQkJIyMJUmVzdGl0dWlzY2UgaWwgc2Vnbm8gZGkgdW4gbnVtZXJvDQpTSU4JCQk9IFNFTgkJCQkjIwlSZXN0aXR1aXNjZSBpbCBzZW5vIGRpIHVuIGRhdG8gYW5nb2xvDQpTSU5ICQkJPSBTRU5ICQkJCSMjCVJlc3RpdHVpc2NlIGlsIHNlbm8gaXBlcmJvbGljbyBkaSB1biBudW1lcm8NClNRUlQJCQk9IFJBRFEJCQkJIyMJUmVzdGl0dWlzY2UgdW5hIHJhZGljZSBxdWFkcmF0YQ0KU1FSVFBJCQkJPSBSQURRLlBJLkdSRUNPCQkJIyMJUmVzdGl0dWlzY2UgbGEgcmFkaWNlIHF1YWRyYXRhIGRpIHVuIG51bWVybyAobnVtZXJvICogcGkgZ3JlY28pDQpTVUJUT1RBTAkJPSBTVUJUT1RBTEUJCQkjIwlSZXN0aXR1aXNjZSB1biBzdWJ0b3RhbGUgaW4gdW4gZWxlbmNvIG8gaW4gdW4gZGF0YWJhc2UNClNVTQkJCT0gU09NTUEJCQkJIyMJU29tbWEgaSBzdW9pIGFyZ29tZW50aQ0KU1VNSUYJCQk9IFNPTU1BLlNFCQkJIyMJU29tbWEgbGUgY2VsbGUgc3BlY2lmaWNhdGUgZGEgdW4gZGF0byBjcml0ZXJpbw0KU1VNSUZTCQkJPSBTT01NQS5QScOZLlNFCQkJIyMJU29tbWEgbGUgY2VsbGUgaW4gdW4gaW50ZXJ2YWxsbyBjaGUgc29kZGlzZmFubyBwacO5IGNyaXRlcmkNClNVTVBST0RVQ1QJCT0gTUFUUi5TT01NQS5QUk9ET1RUTwkJIyMJUmVzdGl0dWlzY2UgbGEgc29tbWEgZGVpIHByb2RvdHRpIGRlaSBjb21wb25lbnRpIGNvcnJpc3BvbmRlbnRpIGRlbGxhIG1hdHJpY2UNClNVTVNRCQkJPSBTT01NQS5RCQkJIyMJUmVzdGl0dWlzY2UgbGEgc29tbWEgZGVpIHF1YWRyYXRpIGRlZ2xpIGFyZ29tZW50aQ0KU1VNWDJNWTIJCT0gU09NTUEuRElGRi5RCQkJIyMJUmVzdGl0dWlzY2UgbGEgc29tbWEgZGVsbGEgZGlmZmVyZW56YSBkZWkgcXVhZHJhdGkgZGVpIGNvcnJpc3BvbmRlbnRpIGVsZW1lbnRpIGluIGR1ZSBtYXRyaWNpDQpTVU1YMlBZMgkJPSBTT01NQS5TT01NQS5RCQkJIyMJUmVzdGl0dWlzY2UgbGEgc29tbWEgZGVsbGEgc29tbWEgZGVpIHF1YWRyYXRpIGRlaSBjb3JyaXNwb25kZW50aSBlbGVtZW50aSBpbiBkdWUgbWF0cmljaQ0KU1VNWE1ZMgkJCT0gU09NTUEuUS5ESUZGCQkJIyMJUmVzdGl0dWlzY2UgbGEgc29tbWEgZGVpIHF1YWRyYXRpIGRlbGxlIGRpZmZlcmVuemUgZGVpIGNvcnJpc3BvbmRlbnRpIGVsZW1lbnRpIGluIGR1ZSBtYXRyaWNpDQpUQU4JCQk9IFRBTgkJCQkjIwlSZXN0aXR1aXNjZSBsYSB0YW5nZW50ZSBkaSB1biBudW1lcm8NClRBTkgJCQk9IFRBTkgJCQkJIyMJUmVzdGl0dWlzY2UgbGEgdGFuZ2VudGUgaXBlcmJvbGljYSBkaSB1biBudW1lcm8NClRSVU5DCQkJPSBUUk9OQ0EJCQkjIwlUcm9uY2EgbGEgcGFydGUgZGVjaW1hbGUgZGkgdW4gbnVtZXJvDQoNCg0KIyMNCiMjCVN0YXRpc3RpY2FsIGZ1bmN0aW9ucwkJCQlGdW56aW9uaSBzdGF0aXN0aWNoZQ0KIyMNCkFWRURFVgkJCT0gTUVESUEuREVWCQkJIyMJUmVzdGl0dWlzY2UgbGEgbWVkaWEgZGVsbGUgZGV2aWF6aW9uaSBhc3NvbHV0ZSBkZWxsZSBjb29yZGluYXRlIHJpc3BldHRvIGFsbGEgbG9ybyBtZWRpYQ0KQVZFUkFHRQkJCT0gTUVESUEJCQkJIyMJUmVzdGl0dWlzY2UgbGEgbWVkaWEgZGVnbGkgYXJnb21lbnRpDQpBVkVSQUdFQQkJPSBNRURJQS5WQUxPUkkJCQkjIwlSZXN0aXR1aXNjZSBsYSBtZWRpYSBkZWdsaSBhcmdvbWVudGksIGluY2x1c2kgaSBudW1lcmksIGlsIHRlc3RvIGUgaSB2YWxvcmkgbG9naWNpDQpBVkVSQUdFSUYJCT0gTUVESUEuU0UJCQkjIwlSZXN0aXR1aXNjZSBsYSBtZWRpYSBhcml0bWV0aWNhIGRpIHR1dHRlIGxlIGNlbGxlIGluIHVuIGludGVydmFsbG8gY2hlIHNvZGRpc2Zhbm8gdW4gZGV0ZXJtaW5hdG8gY3JpdGVyaW8NCkFWRVJBR0VJRlMJCT0gTUVESUEuUEnDmS5TRQkJCSMjCVJlc3RpdHVpc2NlIGxhIG1lZGlhIGFyaXRtZXRpY2EgZGkgdHV0dGUgbGUgY2VsbGUgY2hlIHNvZGRpc2Zhbm8gcGnDuSBjcml0ZXJpDQpCRVRBRElTVAkJPSBESVNUUklCLkJFVEEJCQkjIwlSZXN0aXR1aXNjZSBsYSBmdW56aW9uZSBkaSBkaXN0cmlidXppb25lIGN1bXVsYXRpdmEgYmV0YQ0KQkVUQUlOVgkJCT0gSU5WLkJFVEEJCQkjIwlSZXN0aXR1aXNjZSBsJ2ludmVyc28gZGVsbGEgZnVuemlvbmUgZGkgZGlzdHJpYnV6aW9uZSBjdW11bGF0aXZhIHBlciB1bmEgZGlzdHJpYnV6aW9uZSBiZXRhIHNwZWNpZmljYXRhDQpCSU5PTURJU1QJCT0gRElTVFJJQi5CSU5PTQkJCSMjCVJlc3RpdHVpc2NlIGxhIGRpc3RyaWJ1emlvbmUgYmlub21pYWxlIHBlciBpbCB0ZXJtaW5lIGluZGl2aWR1YWxlDQpDSElESVNUCQkJPSBESVNUUklCLkNISQkJCSMjCVJlc3RpdHVpc2NlIGxhIHByb2JhYmlsaXTDoCBhIHVuYSBjb2RhIHBlciBsYSBkaXN0cmlidXppb25lIGRlbCBjaGkgcXVhZHJhdG8NCkNISUlOVgkJCT0gSU5WLkNISQkJCSMjCVJlc3RpdHVpc2NlIGwnaW52ZXJzbyBkZWxsYSBwcm9iYWJpbGl0w6AgYWQgdW5hIGNvZGEgcGVyIGxhIGRpc3RyaWJ1emlvbmUgZGVsIGNoaSBxdWFkcmF0bw0KQ0hJVEVTVAkJCT0gVEVTVC5DSEkJCQkjIwlSZXN0aXR1aXNjZSBpbCB0ZXN0IHBlciBsJ2luZGlwZW5kZW56YQ0KQ09ORklERU5DRQkJPSBDT05GSURFTlpBCQkJIyMJUmVzdGl0dWlzY2UgbCdpbnRlcnZhbGxvIGRpIGNvbmZpZGVuemEgcGVyIHVuYSBwb3BvbGF6aW9uZQ0KQ09SUkVMCQkJPSBDT1JSRUxBWklPTkUJCQkjIwlSZXN0aXR1aXNjZSBpbCBjb2VmZmljaWVudGUgZGkgY29ycmVsYXppb25lIHRyYSBkdWUgaW5zaWVtaSBkaSBkYXRpDQpDT1VOVAkJCT0gQ09OVEEuTlVNRVJJCQkJIyMJQ29udGEgbGEgcXVhbnRpdMOgIGRpIG51bWVyaSBuZWxsJ2VsZW5jbyBkaSBhcmdvbWVudGkNCkNPVU5UQQkJCT0gQ09OVEEuVkFMT1JJCQkJIyMJQ29udGEgaWwgbnVtZXJvIGRpIHZhbG9yaSBuZWxsJ2VsZW5jbyBkaSBhcmdvbWVudGkNCkNPVU5UQkxBTksJCT0gQ09OVEEuVlVPVEUJCQkjIwlDb250YSBpbCBudW1lcm8gZGkgY2VsbGUgdnVvdGUgYWxsJ2ludGVybm8gZGkgdW4gaW50ZXJ2YWxsbw0KQ09VTlRJRgkJCT0gQ09OVEEuU0UJCQkjIwlDb250YSBpbCBudW1lcm8gZGkgY2VsbGUgYWxsJ2ludGVybm8gZGkgdW4gaW50ZXJ2YWxsbyBjaGUgc29kZGlzZmEgaSBjcml0ZXJpIHNwZWNpZmljYXRpDQpDT1VOVElGUwkJPSBDT05UQS5QScOZLlNFCQkJIyMJQ29udGEgaWwgbnVtZXJvIGRpIGNlbGxlIGluIHVuIGludGVydmFsbG8gY2hlIHNvZGRpc2Zhbm8gcGnDuSBjcml0ZXJpLg0KQ09WQVIJCQk9IENPVkFSSUFOWkEJCQkjIwlDYWxjb2xhIGxhIGNvdmFyaWFuemEsIGxhIG1lZGlhIGRlaSBwcm9kb3R0aSBkZWxsZSBkZXZpYXppb25pIGFjY29wcGlhdGUNCkNSSVRCSU5PTQkJPSBDUklULkJJTk9NCQkJIyMJUmVzdGl0dWlzY2UgaWwgcGnDuSBwaWNjb2xvIHZhbG9yZSBwZXIgaWwgcXVhbGUgbGEgZGlzdHJpYnV6aW9uZSBjdW11bGF0aXZhIGJpbm9taWFsZSByaXN1bHRhIG1hZ2dpb3JlIG8gdWd1YWxlIGFkIHVuIHZhbG9yZSBkaSBjcml0ZXJpbw0KREVWU1EJCQk9IERFVi5RCQkJCSMjCVJlc3RpdHVpc2NlIGxhIHNvbW1hIGRlaSBxdWFkcmF0aSBkZWxsZSBkZXZpYXppb25pDQpFWFBPTkRJU1QJCT0gRElTVFJJQi5FWFAJCQkjIwlSZXN0aXR1aXNjZSBsYSBkaXN0cmlidXppb25lIGVzcG9uZW56aWFsZQ0KRkRJU1QJCQk9IERJU1RSSUIuRgkJCSMjCVJlc3RpdHVpc2NlIGxhIGRpc3RyaWJ1emlvbmUgZGkgcHJvYmFiaWxpdMOgIEYNCkZJTlYJCQk9IElOVi5GCQkJCSMjCVJlc3RpdHVpc2NlIGwnaW52ZXJzbyBkZWxsYSBkaXN0cmlidXppb25lIGRlbGxhIHByb2JhYmlsaXTDoCBGDQpGSVNIRVIJCQk9IEZJU0hFUgkJCSMjCVJlc3RpdHVpc2NlIGxhIHRyYXNmb3JtYXppb25lIGRpIEZpc2hlcg0KRklTSEVSSU5WCQk9IElOVi5GSVNIRVIJCQkjIwlSZXN0aXR1aXNjZSBsJ2ludmVyc28gZGVsbGEgdHJhc2Zvcm1hemlvbmUgZGkgRmlzaGVyDQpGT1JFQ0FTVAkJPSBQUkVWSVNJT05FCQkJIyMJUmVzdGl0dWlzY2UgaSB2YWxvcmkgbHVuZ28gdW5hIHRlbmRlbnphIGxpbmVhcmUNCkZSRVFVRU5DWQkJPSBGUkVRVUVOWkEJCQkjIwlSZXN0aXR1aXNjZSBsYSBkaXN0cmlidXppb25lIGRpIGZyZXF1ZW56YSBjb21lIG1hdHJpY2UgdmVydGljYWxlDQpGVEVTVAkJCT0gVEVTVC5GCQkJIyMJUmVzdGl0dWlzY2UgaWwgcmlzdWx0YXRvIGRpIHVuIHRlc3QgRg0KR0FNTUFESVNUCQk9IERJU1RSSUIuR0FNTUEJCQkjIwlSZXN0aXR1aXNjZSBsYSBkaXN0cmlidXppb25lIGdhbW1hDQpHQU1NQUlOVgkJPSBJTlYuR0FNTUEJCQkjIwlSZXN0aXR1aXNjZSBsJ2ludmVyc28gZGVsbGEgZGlzdHJpYnV6aW9uZSBjdW11bGF0aXZhIGdhbW1hDQpHQU1NQUxOCQkJPSBMTi5HQU1NQQkJCSMjCVJlc3RpdHVpc2NlIGlsIGxvZ2FyaXRtbyBuYXR1cmFsZSBkZWxsYSBmdW56aW9uZSBnYW1tYSwgRyh4KQ0KR0VPTUVBTgkJCT0gTUVESUEuR0VPTUVUUklDQQkJIyMJUmVzdGl0dWlzY2UgbGEgbWVkaWEgZ2VvbWV0cmljYQ0KR1JPV1RICQkJPSBDUkVTQ0lUQQkJCSMjCVJlc3RpdHVpc2NlIGkgdmFsb3JpIGx1bmdvIHVuYSBsaW5lYSBkaSB0ZW5kZW56YSBlc3BvbmVuemlhbGUNCkhBUk1FQU4JCQk9IE1FRElBLkFSTU9OSUNBCQkjIwlSZXN0aXR1aXNjZSBsYSBtZWRpYSBhcm1vbmljYQ0KSFlQR0VPTURJU1QJCT0gRElTVFJJQi5JUEVSR0VPTQkJIyMJUmVzdGl0dWlzY2UgbGEgZGlzdHJpYnV6aW9uZSBpcGVyZ2VvbWV0cmljYQ0KSU5URVJDRVBUCQk9IElOVEVSQ0VUVEEJCQkjIwlSZXN0aXR1aXNjZSBsJ2ludGVyY2V0dGEgZGVsbGEgcmV0dGEgZGkgcmVncmVzc2lvbmUgbGluZWFyZQ0KS1VSVAkJCT0gQ1VSVE9TSQkJCSMjCVJlc3RpdHVpc2NlIGxhIGN1cnRvc2kgZGkgdW4gaW5zaWVtZSBkaSBkYXRpDQpMQVJHRQkJCT0gR1JBTkRFCQkJIyMJUmVzdGl0dWlzY2UgaWwgay1lc2ltbyB2YWxvcmUgcGnDuSBncmFuZGUgaW4gdW4gaW5zaWVtZSBkaSBkYXRpDQpMSU5FU1QJCQk9IFJFR1IuTElOCQkJIyMJUmVzdGl0dWlzY2UgaSBwYXJhbWV0cmkgZGkgdW5hIHRlbmRlbnphIGxpbmVhcmUNCkxPR0VTVAkJCT0gUkVHUi5MT0cJCQkjIwlSZXN0aXR1aXNjZSBpIHBhcmFtZXRyaSBkaSB1bmEgbGluZWEgZGkgdGVuZGVuemEgZXNwb25lbnppYWxlDQpMT0dJTlYJCQk9IElOVi5MT0dOT1JNCQkJIyMJUmVzdGl0dWlzY2UgbCdpbnZlcnNvIGRpIHVuYSBkaXN0cmlidXppb25lIGxvZ25vcm1hbGUNCkxPR05PUk1ESVNUCQk9IERJU1RSSUIuTE9HTk9STQkJIyMJUmVzdGl0dWlzY2UgbGEgZGlzdHJpYnV6aW9uZSBsb2dub3JtYWxlIGN1bXVsYXRpdmENCk1BWAkJCT0gTUFYCQkJCSMjCVJlc3RpdHVpc2NlIGlsIHZhbG9yZSBtYXNzaW1vIGluIHVuIGVsZW5jbyBkaSBhcmdvbWVudGkNCk1BWEEJCQk9IE1BWC5WQUxPUkkJCQkjIwlSZXN0aXR1aXNjZSBpbCB2YWxvcmUgbWFzc2ltbyBpbiB1biBlbGVuY28gZGkgYXJnb21lbnRpLCBpbmNsdXNpIGkgbnVtZXJpLCBpbCB0ZXN0byBlIGkgdmFsb3JpIGxvZ2ljaQ0KTUVESUFOCQkJPSBNRURJQU5BCQkJIyMJUmVzdGl0dWlzY2UgbGEgbWVkaWFuYSBkZWkgbnVtZXJpIHNwZWNpZmljYXRpDQpNSU4JCQk9IE1JTgkJCQkjIwlSZXN0aXR1aXNjZSBpbCB2YWxvcmUgbWluaW1vIGluIHVuIGVsZW5jbyBkaSBhcmdvbWVudGkNCk1JTkEJCQk9IE1JTi5WQUxPUkkJCQkjIwlSZXN0aXR1aXNjZSBpbCBwacO5IHBpY2NvbG8gdmFsb3JlIGluIHVuIGVsZW5jbyBkaSBhcmdvbWVudGksIGluY2x1c2kgaSBudW1lcmksIGlsIHRlc3RvIGUgaSB2YWxvcmkgbG9naWNpDQpNT0RFCQkJPSBNT0RBCQkJCSMjCVJlc3RpdHVpc2NlIGlsIHZhbG9yZSBwacO5IGNvbXVuZSBpbiB1biBpbnNpZW1lIGRpIGRhdGkNCk5FR0JJTk9NRElTVAkJPSBESVNUUklCLkJJTk9NLk5FRwkJIyMJUmVzdGl0dWlzY2UgbGEgZGlzdHJpYnV6aW9uZSBiaW5vbWlhbGUgbmVnYXRpdmENCk5PUk1ESVNUCQk9IERJU1RSSUIuTk9STQkJCSMjCVJlc3RpdHVpc2NlIGxhIGRpc3RyaWJ1emlvbmUgY3VtdWxhdGl2YSBub3JtYWxlDQpOT1JNSU5WCQkJPSBJTlYuTk9STQkJCSMjCVJlc3RpdHVpc2NlIGwnaW52ZXJzbyBkZWxsYSBkaXN0cmlidXppb25lIGN1bXVsYXRpdmEgbm9ybWFsZSBzdGFuZGFyZA0KTk9STVNESVNUCQk9IERJU1RSSUIuTk9STS5TVAkJIyMJUmVzdGl0dWlzY2UgbGEgZGlzdHJpYnV6aW9uZSBjdW11bGF0aXZhIG5vcm1hbGUgc3RhbmRhcmQNCk5PUk1TSU5WCQk9IElOVi5OT1JNLlNUCQkJIyMJUmVzdGl0dWlzY2UgbCdpbnZlcnNvIGRlbGxhIGRpc3RyaWJ1emlvbmUgY3VtdWxhdGl2YSBub3JtYWxlDQpQRUFSU09OCQkJPSBQRUFSU09OCQkJIyMJUmVzdGl0dWlzY2UgaWwgY29lZmZpY2llbnRlIGRlbCBtb21lbnRvIGRpIGNvcnJlbGF6aW9uZSBkaSBQZWFyc29uDQpQRVJDRU5USUxFCQk9IFBFUkNFTlRJTEUJCQkjIwlSZXN0aXR1aXNjZSBpbCBrLWVzaW1vIGRhdG8gcGVyY2VudGlsZSBkaSB2YWxvcmkgaW4gdW4gaW50ZXJ2YWxsbw0KUEVSQ0VOVFJBTksJCT0gUEVSQ0VOVC5SQU5HTwkJCSMjCVJlc3RpdHVpc2NlIGlsIHJhbmdvIGRpIHVuIHZhbG9yZSBpbiB1biBpbnNpZW1lIGRpIGRhdGkgY29tZSBwZXJjZW50dWFsZQ0KUEVSTVVUCQkJPSBQRVJNVVRBWklPTkUJCQkjIwlSZXN0aXR1aXNjZSBpbCBudW1lcm8gZGVsbGUgcGVybXV0YXppb25pIHBlciB1biBkZXRlcm1pbmF0byBudW1lcm8gZGkgb2dnZXR0aQ0KUE9JU1NPTgkJCT0gUE9JU1NPTgkJCSMjCVJlc3RpdHVpc2NlIGxhIGRpc3RyaWJ1emlvbmUgZGkgUG9pc3Nvbg0KUFJPQgkJCT0gUFJPQkFCSUxJVMOACQkJIyMJQ2FsY29sYSBsYSBwcm9iYWJpbGl0w6AgY2hlIGRlaSB2YWxvcmkgaW4gdW4gaW50ZXJ2YWxsbyBzaWFubyBjb21wcmVzaSB0cmEgZHVlIGxpbWl0aQ0KUVVBUlRJTEUJCT0gUVVBUlRJTEUJCQkjIwlSZXN0aXR1aXNjZSBpbCBxdWFydGlsZSBkaSB1biBpbnNpZW1lIGRpIGRhdGkNClJBTksJCQk9IFJBTkdPCQkJCSMjCVJlc3RpdHVpc2NlIGlsIHJhbmdvIGRpIHVuIG51bWVybyBpbiB1biBlbGVuY28gZGkgbnVtZXJpDQpSU1EJCQk9IFJRCQkJCSMjCVJlc3RpdHVpc2NlIGxhIHJhZGljZSBxdWFkcmF0YSBkZWwgY29lZmZpY2llbnRlIGRpIG1vbWVudG8gZGkgY29ycmVsYXppb25lIGRpIFBlYXJzb24NClNLRVcJCQk9IEFTSU1NRVRSSUEJCQkjIwlSZXN0aXR1aXNjZSBpbCBncmFkbyBkaSBhc2ltbWV0cmlhIGRpIHVuYSBkaXN0cmlidXppb25lDQpTTE9QRQkJCT0gUEVOREVOWkEJCQkjIwlSZXN0aXR1aXNjZSBsYSBwZW5kZW56YSBkaSB1bmEgcmV0dGEgZGkgcmVncmVzc2lvbmUgbGluZWFyZQ0KU01BTEwJCQk9IFBJQ0NPTE8JCQkjIwlSZXN0aXR1aXNjZSBpbCBrLWVzaW1vIHZhbG9yZSBwacO5IHBpY2NvbG8gaW4gdW4gaW5zaWVtZSBkaSBkYXRpDQpTVEFOREFSRElaRQkJPSBOT1JNQUxJWlpBCQkJIyMJUmVzdGl0dWlzY2UgdW4gdmFsb3JlIG5vcm1hbGl6emF0bw0KU1RERVYJCQk9IERFVi5TVAkJCSMjCVJlc3RpdHVpc2NlIHVuYSBzdGltYSBkZWxsYSBkZXZpYXppb25lIHN0YW5kYXJkIHN1bGxhIGJhc2UgZGkgdW4gY2FtcGlvbmUNClNUREVWQQkJCT0gREVWLlNULlZBTE9SSQkJCSMjCVJlc3RpdHVpc2NlIHVuYSBzdGltYSBkZWxsYSBkZXZpYXppb25lIHN0YW5kYXJkIHN1bGxhIGJhc2UgZGkgdW4gY2FtcGlvbmUsIGluY2x1c2kgaSBudW1lcmksIGlsIHRlc3RvIGUgaSB2YWxvcmkgbG9naWNpDQpTVERFVlAJCQk9IERFVi5TVC5QT1AJCQkjIwlDYWxjb2xhIGxhIGRldmlhemlvbmUgc3RhbmRhcmQgc3VsbGEgYmFzZSBkaSB1bidpbnRlcmEgcG9wb2xhemlvbmUNClNUREVWUEEJCQk9IERFVi5TVC5QT1AuVkFMT1JJCQkjIwlDYWxjb2xhIGxhIGRldmlhemlvbmUgc3RhbmRhcmQgc3VsbGEgYmFzZSBzdWxsJ2ludGVyYSBwb3BvbGF6aW9uZSwgaW5jbHVzaSBpIG51bWVyaSwgaWwgdGVzdG8gZSBpIHZhbG9yaSBsb2dpY2kNClNURVlYCQkJPSBFUlIuU1RELllYCQkJIyMJUmVzdGl0dWlzY2UgbCdlcnJvcmUgc3RhbmRhcmQgZGVsIHZhbG9yZSBwcmV2aXN0byBwZXIgeSBwZXIgb2duaSB2YWxvcmUgeCBuZWxsYSByZWdyZXNzaW9uZQ0KVERJU1QJCQk9IERJU1RSSUIuVAkJCSMjCVJlc3RpdHVpc2NlIGxhIGRpc3RyaWJ1emlvbmUgdCBkaSBTdHVkZW50DQpUSU5WCQkJPSBJTlYuVAkJCQkjIwlSZXN0aXR1aXNjZSBsJ2ludmVyc2EgZGVsbGEgZGlzdHJpYnV6aW9uZSB0IGRpIFN0dWRlbnQNClRSRU5ECQkJPSBURU5ERU5aQQkJCSMjCVJlc3RpdHVpc2NlIGkgdmFsb3JpIGx1bmdvIHVuYSBsaW5lYSBkaSB0ZW5kZW56YSBsaW5lYXJlDQpUUklNTUVBTgkJPSBNRURJQS5UUk9OQ0FUQQkJIyMJUmVzdGl0dWlzY2UgbGEgbWVkaWEgZGVsbGEgcGFydGUgaW50ZXJuYSBkaSB1biBpbnNpZW1lIGRpIGRhdGkNClRURVNUCQkJPSBURVNULlQJCQkjIwlSZXN0aXR1aXNjZSBsYSBwcm9iYWJpbGl0w6AgYXNzb2NpYXRhIGFkIHVuIHRlc3QgdCBkaSBTdHVkZW50DQpWQVIJCQk9IFZBUgkJCQkjIwlTdGltYSBsYSB2YXJpYW56YSBzdWxsYSBiYXNlIGRpIHVuIGNhbXBpb25lDQpWQVJBCQkJPSBWQVIuVkFMT1JJCQkJIyMJU3RpbWEgbGEgdmFyaWFuemEgc3VsbGEgYmFzZSBkaSB1biBjYW1waW9uZSwgaW5jbHVzaSBpIG51bWVyaSwgaWwgdGVzdG8gZSBpIHZhbG9yaSBsb2dpY2kNClZBUlAJCQk9IFZBUi5QT1AJCQkjIwlDYWxjb2xhIGxhIHZhcmlhbnphIHN1bGxhIGJhc2UgZGVsbCdpbnRlcmEgcG9wb2xhemlvbmUNClZBUlBBCQkJPSBWQVIuUE9QLlZBTE9SSQkJIyMJQ2FsY29sYSBsYSBkZXZpYXppb25lIHN0YW5kYXJkIHN1bGxhIGJhc2Ugc3VsbCdpbnRlcmEgcG9wb2xhemlvbmUsIGluY2x1c2kgaSBudW1lcmksIGlsIHRlc3RvIGUgaSB2YWxvcmkgbG9naWNpDQpXRUlCVUxMCQkJPSBXRUlCVUxMCQkJIyMJUmVzdGl0dWlzY2UgbGEgZGlzdHJpYnV6aW9uZSBkaSBXZWlidWxsDQpaVEVTVAkJCT0gVEVTVC5aCQkJIyMJUmVzdGl0dWlzY2UgaWwgdmFsb3JlIGRpIHByb2JhYmlsaXTDoCBhIHVuYSBjb2RhIHBlciB1biB0ZXN0IHoNCg0KDQojIw0KIyMJVGV4dCBmdW5jdGlvbnMJCQkJCUZ1bnppb25pIGRpIHRlc3RvDQojIw0KQVNDCQkJPSBBU0MJCQkJIyMJTW9kaWZpY2EgbGUgbGV0dGVyZSBpbmdsZXNpIG8gaWwga2F0YWthbmEgYSBkb3BwaW8gYnl0ZSBhbGwnaW50ZXJubyBkaSB1bmEgc3RyaW5nYSBkaSBjYXJhdHRlcmkgaW4gY2FyYXR0ZXJpIGEgc2luZ29sbyBieXRlDQpCQUhUVEVYVAkJPSBCQUhUVEVTVE8JCQkjIwlDb252ZXJ0ZSB1biBudW1lcm8gaW4gdGVzdG8sIHV0aWxpenphbmRvIGlsIGZvcm1hdG8gdmFsdXRhIMOfIChiYWh0KQ0KQ0hBUgkJCT0gQ09ESUNFLkNBUkFUVAkJCSMjCVJlc3RpdHVpc2NlIGlsIGNhcmF0dGVyZSBzcGVjaWZpY2F0byBkYWwgbnVtZXJvIGRpIGNvZGljZQ0KQ0xFQU4JCQk9IExJQkVSQQkJCSMjCUVsaW1pbmEgZGFsIHRlc3RvIHR1dHRpIGkgY2FyYXR0ZXJpIGNoZSBub24gw6ggcG9zc2liaWxlIHN0YW1wYXJlDQpDT0RFCQkJPSBDT0RJQ0UJCQkjIwlSZXN0aXR1aXNjZSBpbCBjb2RpY2UgbnVtZXJpY28gZGVsIHByaW1vIGNhcmF0dGVyZSBkaSB1bmEgc3RyaW5nYSBkaSB0ZXN0bw0KQ09OQ0FURU5BVEUJCT0gQ09OQ0FURU5BCQkJIyMJVW5pc2NlIGRpdmVyc2kgZWxlbWVudGkgZGkgdGVzdG8gaW4gdW4gdW5pY28gZWxlbWVudG8gZGkgdGVzdG8NCkRPTExBUgkJCT0gVkFMVVRBCQkJIyMJQ29udmVydGUgdW4gbnVtZXJvIGluIHRlc3RvLCB1dGlsaXp6YW5kbyBpbCBmb3JtYXRvIHZhbHV0YSDigqwgKGV1cm8pDQpFWEFDVAkJCT0gSURFTlRJQ08JCQkjIwlWZXJpZmljYSBzZSBkdWUgdmFsb3JpIGRpIHRlc3RvIHNvbm8gdWd1YWxpDQpGSU5ECQkJPSBUUk9WQQkJCQkjIwlSaWxldmEgdW4gdmFsb3JlIGRpIHRlc3RvIGFsbCdpbnRlcm5vIGRpIHVuIGFsdHJvIChkaXN0aW56aW9uZSB0cmEgbWFpdXNjb2xlIGUgbWludXNjb2xlKQ0KRklOREIJCQk9IFRST1ZBLkIJCQkjIwlSaWxldmEgdW4gdmFsb3JlIGRpIHRlc3RvIGFsbCdpbnRlcm5vIGRpIHVuIGFsdHJvIChkaXN0aW56aW9uZSB0cmEgbWFpdXNjb2xlIGUgbWludXNjb2xlKQ0KRklYRUQJCQk9IEZJU1NPCQkJCSMjCUZvcm1hdHRhIHVuIG51bWVybyBjb21lIHRlc3RvIGNvbiB1biBudW1lcm8gZmlzc28gZGkgZGVjaW1hbGkNCkpJUwkJCT0gT1JESU5BTUVOVE8uSklTCQkjIwlNb2RpZmljYSBsZSBsZXR0ZXJlIGluZ2xlc2kgbyBpIGNhcmF0dGVyaSBrYXRha2FuYSBhIGJ5dGUgc2luZ29sbyBhbGwnaW50ZXJubyBkaSB1bmEgc3RyaW5nYSBkaSBjYXJhdHRlcmkgaW4gY2FyYXR0ZXJpIGEgYnl0ZSBkb3BwaW8uDQpMRUZUCQkJPSBTSU5JU1RSQQkJCSMjCVJlc3RpdHVpc2NlIGlsIGNhcmF0dGVyZSBwacO5IGEgc2luaXN0cmEgZGkgdW4gdmFsb3JlIGRpIHRlc3RvDQpMRUZUQgkJCT0gU0lOSVNUUkEuQgkJCSMjCVJlc3RpdHVpc2NlIGlsIGNhcmF0dGVyZSBwacO5IGEgc2luaXN0cmEgZGkgdW4gdmFsb3JlIGRpIHRlc3RvDQpMRU4JCQk9IExVTkdIRVpaQQkJCSMjCVJlc3RpdHVpc2NlIGlsIG51bWVybyBkaSBjYXJhdHRlcmkgZGkgdW5hIHN0cmluZ2EgZGkgdGVzdG8NCkxFTkIJCQk9IExVTkIJCQkJIyMJUmVzdGl0dWlzY2UgaWwgbnVtZXJvIGRpIGNhcmF0dGVyaSBkaSB1bmEgc3RyaW5nYSBkaSB0ZXN0bw0KTE9XRVIJCQk9IE1JTlVTQwkJCSMjCUNvbnZlcnRlIGlsIHRlc3RvIGluIGxldHRlcmUgbWludXNjb2xlDQpNSUQJCQk9IE1FRElBCQkJCSMjCVJlc3RpdHVpc2NlIHVuIG51bWVybyBzcGVjaWZpY28gZGkgY2FyYXR0ZXJpIGRpIHVuYSBzdHJpbmdhIGRpIHRlc3RvIGEgcGFydGlyZSBkYWxsYSBwb3NpemlvbmUgc3BlY2lmaWNhdGENCk1JREIJCQk9IE1FRElBLkIJCQkjIwlSZXN0aXR1aXNjZSB1biBudW1lcm8gc3BlY2lmaWNvIGRpIGNhcmF0dGVyaSBkaSB1bmEgc3RyaW5nYSBkaSB0ZXN0byBhIHBhcnRpcmUgZGFsbGEgcG9zaXppb25lIHNwZWNpZmljYXRhDQpQSE9ORVRJQwkJPSBGVVJJR0FOQQkJCSMjCUVzdHJhZSBpIGNhcmF0dGVyaSBmb25ldGljaSAoZnVyaWdhbmEpIGRhIHVuYSBzdHJpbmdhIGRpIHRlc3RvLg0KUFJPUEVSCQkJPSBNQUlVU0MuSU5JWgkJCSMjCUNvbnZlcnRlIGluIG1haXVzY29sbyBsYSBwcmltYSBsZXR0ZXJhIGRpIG9nbmkgcGFyb2xhIGRpIHVuIHZhbG9yZSBkaSB0ZXN0bw0KUkVQTEFDRQkJCT0gUklNUElBWlpBCQkJIyMJU29zdGl0dWlzY2UgaSBjYXJhdHRlcmkgYWxsJ2ludGVybm8gZGkgdW4gdGVzdG8NClJFUExBQ0VCCQk9IFNPU1RJVFVJU0NJLkIJCQkjIwlTb3N0aXR1aXNjZSBpIGNhcmF0dGVyaSBhbGwnaW50ZXJubyBkaSB1biB0ZXN0bw0KUkVQVAkJCT0gUklQRVRJCQkJIyMJUmlwZXRlIHVuIHRlc3RvIHBlciB1biBkYXRvIG51bWVybyBkaSB2b2x0ZQ0KUklHSFQJCQk9IERFU1RSQQkJCSMjCVJlc3RpdHVpc2NlIGlsIGNhcmF0dGVyZSBwacO5IGEgZGVzdHJhIGRpIHVuIHZhbG9yZSBkaSB0ZXN0bw0KUklHSFRCCQkJPSBERVNUUkEuQgkJCSMjCVJlc3RpdHVpc2NlIGlsIGNhcmF0dGVyZSBwacO5IGEgZGVzdHJhIGRpIHVuIHZhbG9yZSBkaSB0ZXN0bw0KU0VBUkNICQkJPSBSSUNFUkNBCQkJIyMJUmlsZXZhIHVuIHZhbG9yZSBkaSB0ZXN0byBhbGwnaW50ZXJubyBkaSB1biBhbHRybyAobm9uIMOoIHNlbnNpYmlsZSBhbGxlIG1haXVzY29sZSBlIG1pbnVzY29sZSkNClNFQVJDSEIJCQk9IENFUkNBLkIJCQkjIwlSaWxldmEgdW4gdmFsb3JlIGRpIHRlc3RvIGFsbCdpbnRlcm5vIGRpIHVuIGFsdHJvIChub24gw6ggc2Vuc2liaWxlIGFsbGUgbWFpdXNjb2xlIGUgbWludXNjb2xlKQ0KU1VCU1RJVFVURQkJPSBTT1NUSVRVSVNDSQkJCSMjCVNvc3RpdHVpc2NlIGlsIG51b3ZvIHRlc3RvIGFsIHRlc3RvIGNvbnRlbnV0byBpbiB1bmEgc3RyaW5nYQ0KVAkJCT0gVAkJCQkjIwlDb252ZXJ0ZSBnbGkgYXJnb21lbnRpIGluIHRlc3RvDQpURVhUCQkJPSBURVNUTwkJCQkjIwlGb3JtYXR0YSB1biBudW1lcm8gZSBsbyBjb252ZXJ0ZSBpbiB0ZXN0bw0KVFJJTQkJCT0gQU5OVUxMQS5TUEFaSQkJCSMjCUVsaW1pbmEgZ2xpIHNwYXppIGRhbCB0ZXN0bw0KVVBQRVIJCQk9IE1BSVVTQwkJCSMjCUNvbnZlcnRlIGlsIHRlc3RvIGluIGxldHRlcmUgbWFpdXNjb2xlDQpWQUxVRQkJCT0gVkFMT1JFCQkJIyMJQ29udmVydGUgdW4gYXJnb21lbnRvIGRpIHRlc3RvIGluIG51bWVybw0K]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/locale/nl/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/locale/nl/config</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[77u/IyMNCiMjIFBIUEV4Y2VsDQojIw0NCiMjIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTEgUEhQRXhjZWwNCiMjDQojIyBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yDQojIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljDQojIyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXINCiMjIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLg0KIyMNCiMjIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLA0KIyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YNCiMjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VDQojIyBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLg0KIyMNCiMjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMNCiMjIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUNCiMjIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQ0KIyMNCiMjIEBjYXRlZ29yeSAgIFBIUEV4Y2VsDQojIyBAcGFja2FnZSAgICBQSFBFeGNlbF9TZXR0aW5ncw0KIyMgQGNvcHlyaWdodCAgQ29weXJpZ2h0IChjKSAyMDA2IC0gMjAxMSBQSFBFeGNlbCAoaHR0cDovL3d3dy5jb2RlcGxleC5jb20vUEhQRXhjZWwpDQojIyBAbGljZW5zZSAgICBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvb2xkLWxpY2Vuc2VzL2xncGwtMi4xLnR4dAlMR1BMDQojIyBAdmVyc2lvbiAgICAxLjcuNywgMjAxMi0wNS0xOQ0KIyMNCiMjDQoNCg0KQXJndW1lbnRTZXBhcmF0b3IJPSA7DQoNCg0KIyMNCiMjCShGb3IgZnV0dXJlIHVzZSkNCiMjDQpjdXJyZW5jeVN5bWJvbAk9IOKCrA0KDQoNCiMjDQojIwlFeGNlbCBFcnJvciBDb2RlcwkoRm9yIGZ1dHVyZSB1c2UpDQ0KIyMNCk5VTEwJPSAjTEVFRyENCkRJVjAJPSAjREVFTC8wIQ0KVkFMVUUJPSAjV0FBUkRFIQ0KUkVGCT0gI1ZFUlchDQpOQU1FCT0gI05BQU0/DQpOVU0JPSAjR0VUQUwhDQpOQQk9ICNOL0INCg==]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/locale/nl/functions</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[77u/IyMNCiMjIFBIUEV4Y2VsDQojIw0NCiMjIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTEgUEhQRXhjZWwNCiMjDQojIyBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yDQojIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljDQojIyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXINCiMjIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLg0KIyMNCiMjIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLA0KIyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YNCiMjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VDQojIyBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLg0KIyMNCiMjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMNCiMjIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUNCiMjIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQ0KIyMNCiMjIEBjYXRlZ29yeSAgIFBIUEV4Y2VsDQojIyBAcGFja2FnZSAgICBQSFBFeGNlbF9DYWxjdWxhdGlvbg0KIyMgQGNvcHlyaWdodCAgQ29weXJpZ2h0IChjKSAyMDA2IC0gMjAxMSBQSFBFeGNlbCAoaHR0cDovL3d3dy5jb2RlcGxleC5jb20vUEhQRXhjZWwpDQojIyBAbGljZW5zZSAgICBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvb2xkLWxpY2Vuc2VzL2xncGwtMi4xLnR4dAlMR1BMDQojIyBAdmVyc2lvbiAgICAxLjcuNywgMjAxMi0wNS0xOQ0KIyMNCiMjIERhdGEgaW4gdGhpcyBmaWxlIGRlcml2ZWQgZnJvbSBodHRwOi8vd3d3LnBpdWhhLmZpL2V4Y2VsLWZ1bmN0aW9uLW5hbWUtdHJhbnNsYXRpb24vDQojIw0KIyMNCg0KDQojIw0KIyMJQWRkLWluIGFuZCBBdXRvbWF0aW9uIGZ1bmN0aW9ucwkJCUF1dG9tYXRpc2VyaW5nc2Z1bmN0aWVzIGVuIGZ1bmN0aWVzIGluIGludm9lZ3RvZXBhc3Npbmdlbg0KIyMNCkdFVFBJVk9UREFUQQkJPSBEUkFBSVRBQkVMLk9QSEFMRU4JCSMjCUdlZWZ0IGdlZ2V2ZW5zIHVpdCBlZW4gZHJhYWl0YWJlbHJhcHBvcnQgYWxzIHJlc3VsdGFhdA0KDQoNCiMjDQojIwlDdWJlIGZ1bmN0aW9ucwkJCQkJS3VidXNmdW5jdGllcw0KIyMNCkNVQkVLUElNRU1CRVIJCT0gS1VCVVNLUElMSUQJCQkjIwlSZXRvdXJuZWVydCBkZSBuYWFtLCBlaWdlbnNjaGFwIGVuIHdhYXJkZSB2YW4gZWVuIEtQSSAocHJlc3RhdGllLWluZGljYXRvcikgZW4gZ2VlZnQgZGUgbmFhbSBlbiBkZSBlaWdlbnNjaGFwIGluIGRlIGNlbCB3ZWVyLiBFZW4gS1BJIGlzIGVlbiBtZWV0YmFyZSB3YWFyZGUsIHpvYWxzIGRlIG1hYW5kZWxpamtzZSBicnV0b3dpbnN0IG9mIGRlIG9temV0IHBlciBrd2FydGFhbCBwZXIgd2Vya25lbWVyLCBkaWUgd29yZHQgZ2VicnVpa3Qgb20gZGUgcHJlc3RhdGllcyB2YW4gZWVuIG9yZ2FuaXNhdGllIHRlIGJld2FrZW4NCkNVQkVNRU1CRVIJCT0gS1VCVVNMSUQJCQkjIwlSZXRvdXJuZWVydCBlZW4gbGlkIG9mIHR1cGVsIGluIGVlbiBrdWJ1c2hpw6tyYXJjaGllLiBXb3JkdCBnZWJydWlrdCBvbSB0ZSBjb250cm9sZXJlbiBvZiBoZXQgbGlkIG9mIGRlIHR1cGVsIGluIGRlIGt1YnVzIGFhbndlemlnIGlzDQpDVUJFTUVNQkVSUFJPUEVSVFkJPSBLVUJVU0xJREVJR0VOU0NIQVAJCSMjCVJldG91cm5lZXJ0IGRlIHdhYXJkZSB2YW4gZWVuIGxpZGVpZ2Vuc2NoYXAgaW4gZGUga3VidXMuIFdvcmR0IGdlYnJ1aWt0IG9tIHRlIGNvbnRyb2xlcmVuIG9mIGRlIGxpZG5hYW0gaW4gZGUga3VidXMgYmVzdGFhdCBlbiByZXRvdXJuZWVydCBkZSBvcGdlZ2V2ZW4gZWlnZW5zY2hhcCB2b29yIGRpdCBsaWQNCkNVQkVSQU5LRURNRU1CRVIJPSBLVUJVU0dFUkFOR0NISUtUTElECQkjIwlSZXRvdXJuZWVydCBoZXQgem92ZWVsc3RlLCBnZXJhbmdzY2hpa3RlIGxpZCBpbiBlZW4gc2V0LiBXb3JkdCBnZWJydWlrdCBvbSBlZW4gb2YgbWVlciBlbGVtZW50ZW4gaW4gZWVuIHNldCB0ZSByZXRvdXJuZXJlbiwgem9hbHMgZGUgdGllbiBiZXN0ZSB2ZXJrb3BlcnMgb2YgZGUgdGllbiBiZXN0ZSBzdHVkZW50ZW4NCkNVQkVTRVQJCQk9IEtVQlVTU0VUCQkJIyMJRGVmaW5pZWVydCBlZW4gYmVyZWtlbmRlIHNldCBsZWRlbiBvZiB0dXBlbHMgZG9vciBlZW4gaW5nZXN0ZWxkZSBleHByZXNzaWUgbmFhciBkZSBrdWJ1cyBvcCBkZSBzZXJ2ZXIgdGUgc3R1cmVuLCBhbHdhYXIgZGUgc2V0IHdvcmR0IGdlbWFha3QgZW4gdmVydm9sZ2VucyB3b3JkdCBnZXJldG91cm5lZXJkIG5hYXIgTWljcm9zb2Z0IE9mZmljZSBFeGNlbA0KQ1VCRVNFVENPVU5UCQk9IEtVQlVTU0VUQUFOVEFMCQkjIwlSZXRvdXJuZWVydCBoZXQgYWFudGFsIG9uZGVyZGVsZW4gaW4gZWVuIHNldA0KQ1VCRVZBTFVFCQk9IEtVQlVTV0FBUkRFCQkJIyMJUmV0b3VybmVlcnQgZWVuIHNhbWVuZ2VzdGVsZGUgd2FhcmRlIHZhbiBlZW4ga3VidXMNCg0KDQojIw0KIyMJRGF0YWJhc2UgZnVuY3Rpb25zCQkJCURhdGFiYXNlZnVuY3RpZXMNCiMjDQpEQVZFUkFHRQkJPSBEQkdFTUlEREVMREUJCQkjIwlCZXJla2VudCBkZSBnZW1pZGRlbGRlIHdhYXJkZSBpbiBnZXNlbGVjdGVlcmRlIGRhdGFiYXNlZ2VnZXZlbnMNCkRDT1VOVAkJCT0gREJBQU5UQUwJCQkjIwlUZWx0IGRlIGNlbGxlbiBtZXQgZ2V0YWxsZW4gaW4gZWVuIGRhdGFiYXNlDQpEQ09VTlRBCQkJPSBEQkFBTlRBTEMJCQkjIwlUZWx0IGRlIG5pZXQtbGVnZSBjZWxsZW4gaW4gZWVuIGRhdGFiYXNlDQpER0VUCQkJPSBEQkxFWkVOCQkJIyMJUmV0b3VybmVlcnQgw6nDqW4gcmVjb3JkIGRhdCB2b2xkb2V0IGFhbiBkZSBvcGdlZ2V2ZW4gY3JpdGVyaWEgdWl0IGVlbiBkYXRhYmFzZQ0KRE1BWAkJCT0gREJNQVgJCQkJIyMJUmV0b3VybmVlcnQgZGUgbWF4aW11bXdhYXJkZSBpbiBkZSBnZXNlbGVjdGVlcmRlIGRhdGFiYXNlZ2VnZXZlbnMNCkRNSU4JCQk9IERCTUlOCQkJCSMjCVJldG91cm5lZXJ0IGRlIG1pbmltdW13YWFyZGUgaW4gZGUgZ2VzZWxlY3RlZXJkZSBkYXRhYmFzZWdlZ2V2ZW5zDQpEUFJPRFVDVAkJPSBEQlBST0RVQ1QJCQkjIwlWZXJtZW5pZ3Z1bGRpZ3QgZGUgd2FhcmRlbiBpbiBlZW4gYmVwYWFsZCB2ZWxkIHZhbiBkZSByZWNvcmRzIGRpZSB2b2xkb2VuIGFhbiBkZSBjcml0ZXJpYSBpbiBlZW4gZGF0YWJhc2UNCkRTVERFVgkJCT0gREJTVERFVgkJCSMjCU1hYWt0IGVlbiBzY2hhdHRpbmcgdmFuIGRlIHN0YW5kYWFyZGRldmlhdGllIG9wIGJhc2lzIHZhbiBlZW4gc3RlZWtwcm9lZiB1aXQgZ2VzZWxlY3RlZXJkZSBkYXRhYmFzZWdlZ2V2ZW5zDQpEU1RERVZQCQkJPSBEQlNUREVWUAkJCSMjCUJlcmVrZW50IGRlIHN0YW5kYWFyZGRldmlhdGllIG9wIGJhc2lzIHZhbiBkZSB2b2xsZWRpZ2UgcG9wdWxhdGllIHZhbiBnZXNlbGVjdGVlcmRlIGRhdGFiYXNlZ2VnZXZlbnMNCkRTVU0JCQk9IERCU09NCQkJCSMjCVRlbHQgZGUgZ2V0YWxsZW4gdWl0IGVlbiBrb2xvbSByZWNvcmRzIGluIGRlIGRhdGFiYXNlIG9wIGRpZSB2b2xkb2VuIGFhbiBkZSBjcml0ZXJpYQ0KRFZBUgkJCT0gREJWQVIJCQkJIyMJTWFha3QgZWVuIHNjaGF0dGluZyB2YW4gZGUgdmFyaWFudGllIG9wIGJhc2lzIHZhbiBlZW4gc3RlZWtwcm9lZiB1aXQgZ2VzZWxlY3RlZXJkZSBkYXRhYmFzZWdlZ2V2ZW5zDQpEVkFSUAkJCT0gREJWQVJQCQkJIyMJQmVyZWtlbnQgZGUgdmFyaWFudGllIG9wIGJhc2lzIHZhbiBkZSB2b2xsZWRpZ2UgcG9wdWxhdGllIHZhbiBnZXNlbGVjdGVlcmRlIGRhdGFiYXNlZ2VnZXZlbnMNCg0KDQojIw0KIyMJRGF0ZSBhbmQgdGltZSBmdW5jdGlvbnMJCQkJRGF0dW0tIGVuIHRpamRmdW5jdGllcw0KIyMNCkRBVEUJCQk9IERBVFVNCQkJCSMjCUdlZWZ0IGFscyByZXN1bHRhYXQgaGV0IHNlcmnDq2xlIGdldGFsIHZhbiBlZW4gb3BnZWdldmVuIGRhdHVtDQpEQVRFVkFMVUUJCT0gREFUVU1XQUFSREUJCQkjIwlDb252ZXJ0ZWVydCBlZW4gZGF0dW0gaW4gZGUgdm9ybSB2YW4gdGVrc3QgbmFhciBlZW4gc2VyaWVlbCBnZXRhbA0KREFZCQkJPSBEQUcJCQkJIyMJQ29udmVydGVlcnQgZWVuIHNlcmllZWwgZ2V0YWwgbmFhciBlZW4gZGFnIHZhbiBkZSBtYWFuZA0KREFZUzM2MAkJCT0gREFHRU4zNjAJCQkjIwlCZXJla2VudCBoZXQgYWFudGFsIGRhZ2VuIHR1c3NlbiB0d2VlIGRhdHVtcyBvcCBiYXNpcyB2YW4gZWVuIGphYXIgbWV0IDM2MCBkYWdlbg0KRURBVEUJCQk9IFpFTEZERS5EQUcJCQkjIwlHZWVmdCBhbHMgcmVzdWx0YWF0IGhldCBzZXJpw6tsZSBnZXRhbCB2YW4gZWVuIGRhdHVtIGRpZSBoZXQgb3BnZWdldmVuIGFhbnRhbCBtYWFuZGVuIHZvb3Igb2YgbmEgZGUgYmVnaW5kYXR1bSBsaWd0DQpFT01PTlRICQkJPSBMQUFUU1RFLkRBRwkJCSMjCUdlZWZ0IGFscyByZXN1bHRhYXQgaGV0IHNlcmnDq2xlIGdldGFsIHZhbiBkZSBsYWF0c3RlIGRhZyB2YW4gZGUgbWFhbmQgdm9vciBvZiBuYSBoZXQgb3BnZWdldmVuIGFhbnRhbCBtYWFuZGVuDQpIT1VSCQkJPSBVVVIJCQkJIyMJQ29udmVydGVlcnQgZWVuIHNlcmllZWwgZ2V0YWwgbmFhciB1cmVuDQpNSU5VVEUJCQk9IE1JTlVVVAkJCSMjCUNvbnZlcnRlZXJ0IGVlbiBzZXJpZWVsIG5hYXIgZ2V0YWwgbWludXRlbg0KTU9OVEgJCQk9IE1BQU5ECQkJCSMjCUNvbnZlcnRlZXJ0IGVlbiBzZXJpZWVsIGdldGFsIG5hYXIgZWVuIG1hYW5kDQpORVRXT1JLREFZUwkJPSBORVRUTy5XRVJLREFHRU4JCSMjCUdlZWZ0IGFscyByZXN1bHRhYXQgaGV0IGFhbnRhbCBoZWxlIHdlcmtkYWdlbiB0dXNzZW4gdHdlZSBkYXR1bXMNCk5PVwkJCT0gTlUJCQkJIyMJR2VlZnQgYWxzIHJlc3VsdGFhdCBoZXQgc2VyacOrbGUgZ2V0YWwgdmFuIGRlIGh1aWRpZ2UgZGF0dW0gZW4gdGlqZA0KU0VDT05ECQkJPSBTRUNPTkRFCQkJIyMJQ29udmVydGVlcnQgZWVuIHNlcmllZWwgZ2V0YWwgbmFhciBzZWNvbmRlbg0KVElNRQkJCT0gVElKRAkJCQkjIwlHZWVmdCBhbHMgcmVzdWx0YWF0IGhldCBzZXJpw6tsZSBnZXRhbCB2YW4gZWVuIGJlcGFhbGQgdGlqZHN0aXANClRJTUVWQUxVRQkJPSBUSUpEV0FBUkRFCQkJIyMJQ29udmVydGVlcnQgZGUgdGlqZCBpbiBkZSB2b3JtIHZhbiB0ZWtzdCBuYWFyIGVlbiBzZXJpZWVsIGdldGFsDQpUT0RBWQkJCT0gVkFOREFBRwkJCSMjCUdlZWZ0IGFscyByZXN1bHRhYXQgaGV0IHNlcmnDq2xlIGdldGFsIHZhbiBkZSBodWlkaWdlIGRhdHVtDQpXRUVLREFZCQkJPSBXRUVLREFHCQkJIyMJQ29udmVydGVlcnQgZWVuIHNlcmllZWwgZ2V0YWwgbmFhciBlZW4gd2Vla2RhZw0KV0VFS05VTQkJCT0gV0VFS05VTU1FUgkJCSMjCUNvbnZlcnRlZXJ0IGVlbiBzZXJpZWVsIGdldGFsIG5hYXIgZWVuIHdlZWtudW1tZXINCldPUktEQVkJCQk9IFdFUktEQUcJCQkjIwlHZWVmdCBhbHMgcmVzdWx0YWF0IGhldCBzZXJpw6tsZSBnZXRhbCB2YW4gZGUgZGF0dW0gdm9vciBvZiBuYSBlZW4gYmVwYWFsZCBhYW50YWwgd2Vya2RhZ2VuDQpZRUFSCQkJPSBKQUFSCQkJCSMjCUNvbnZlcnRlZXJ0IGVlbiBzZXJpZWVsIGdldGFsIG5hYXIgZWVuIGphYXINCllFQVJGUkFDCQk9IEpBQVIuREVFTAkJCSMjCUdlZWZ0IGFscyByZXN1bHRhYXQgaGV0IGdlZGVlbHRlIHZhbiBoZXQgamFhciwgdWl0Z2VkcnVrdCBpbiBoZXQgYWFudGFsIGhlbGUgZGFnZW4gdHVzc2VuIGJlZ2luZGF0dW0gZW4gZWluZGRhdHVtDQoNCg0KIyMNCiMjCUVuZ2luZWVyaW5nIGZ1bmN0aW9ucwkJCQlUZWNobmlzY2hlIGZ1bmN0aWVzDQojIw0KQkVTU0VMSQkJCT0gQkVTU0VMLlkJCQkjIwlHZWVmdCBhbHMgcmVzdWx0YWF0IGRlIGdld2lqemlnZGUgQmVzc2VsLWZ1bmN0aWUgSW4oeCkNCkJFU1NFTEoJCQk9IEJFU1NFTC5KCQkJIyMJR2VlZnQgYWxzIHJlc3VsdGFhdCBkZSBCZXNzZWwtZnVuY3RpZSBKbih4KQ0KQkVTU0VMSwkJCT0gQkVTU0VMLksJCQkjIwlHZWVmdCBhbHMgcmVzdWx0YWF0IGRlIGdld2lqemlnZGUgQmVzc2VsLWZ1bmN0aWUgS24oeCkNCkJFU1NFTFkJCQk9IEJFU1NFTC5ZCQkJIyMJR2VlZnQgYWxzIHJlc3VsdGFhdCBkZSBnZXdpanppZ2RlIEJlc3NlbC1mdW5jdGllIFluKHgpDQpCSU4yREVDCQkJPSBCSU4uTi5ERUMJCQkjIwlDb252ZXJ0ZWVydCBlZW4gYmluYWlyIGdldGFsIG5hYXIgZWVuIGRlY2ltYWFsIGdldGFsDQpCSU4ySEVYCQkJPSBCSU4uTi5IRVgJCQkjIwlDb252ZXJ0ZWVydCBlZW4gYmluYWlyIGdldGFsIG5hYXIgZWVuIGhleGFkZWNpbWFhbCBnZXRhbA0KQklOMk9DVAkJCT0gQklOLk4uT0NUCQkJIyMJQ29udmVydGVlcnQgZWVuIGJpbmFpciBnZXRhbCBuYWFyIGVlbiBvY3RhYWwgZ2V0YWwNCkNPTVBMRVgJCQk9IENPTVBMRVgJCQkjIwlDb252ZXJ0ZWVydCByZcOrbGUgZW4gaW1hZ2luYWlyZSBjb8OrZmZpY2nDq250ZW4gbmFhciBlZW4gY29tcGxleCBnZXRhbA0KQ09OVkVSVAkJCT0gQ09OVkVSVEVSRU4JCQkjIwlDb252ZXJ0ZWVydCBlZW4gZ2V0YWwgaW4gZGUgZW5lIG1hYXRlZW5oZWlkIG5hYXIgZWVuIGdldGFsIGluIGVlbiBhbmRlcmUgbWFhdGVlbmhlaWQNCkRFQzJCSU4JCQk9IERFQy5OLkJJTgkJCSMjCUNvbnZlcnRlZXJ0IGVlbiBkZWNpbWFhbCBnZXRhbCBuYWFyIGVlbiBiaW5haXIgZ2V0YWwNCkRFQzJIRVgJCQk9IERFQy5OLkhFWAkJCSMjCUNvbnZlcnRlZXJ0IGVlbiBkZWNpbWFhbCBnZXRhbCBuYWFyIGVlbiBoZXhhZGVjaW1hYWwgZ2V0YWwNCkRFQzJPQ1QJCQk9IERFQy5OLk9DVAkJCSMjCUNvbnZlcnRlZXJ0IGVlbiBkZWNpbWFhbCBnZXRhbCBuYWFyIGVlbiBvY3RhYWwgZ2V0YWwNCkRFTFRBCQkJPSBERUxUQQkJCQkjIwlUZXN0IG9mIHR3ZWUgd2FhcmRlbiBnZWxpamsgemlqbg0KRVJGCQkJPSBGT1VURlVOQ1RJRQkJCSMjCUdlZWZ0IGFscyByZXN1bHRhYXQgZGUgZm91dGZ1bmN0aWUNCkVSRkMJCQk9IEZPVVQuQ09NUExFTUVOVAkJIyMJR2VlZnQgYWxzIHJlc3VsdGFhdCBkZSBjb21wbGVtZW50YWlyZSBmb3V0ZnVuY3RpZQ0KR0VTVEVQCQkJPSBHUk9URVIuREFOCQkJIyMJVGVzdCBvZiBlZW4gZ2V0YWwgZ3JvdGVyIGlzIGRhbiBkZSBkcmVtcGVsd2FhcmRlDQpIRVgyQklOCQkJPSBIRVguTi5CSU4JCQkjIwlDb252ZXJ0ZWVydCBlZW4gaGV4YWRlY2ltYWFsIGdldGFsIG5hYXIgZWVuIGJpbmFpciBnZXRhbA0KSEVYMkRFQwkJCT0gSEVYLk4uREVDCQkJIyMJQ29udmVydGVlcnQgZWVuIGhleGFkZWNpbWFhbCBnZXRhbCBuYWFyIGVlbiBkZWNpbWFhbCBnZXRhbA0KSEVYMk9DVAkJCT0gSEVYLk4uT0NUCQkJIyMJQ29udmVydGVlcnQgZWVuIGhleGFkZWNpbWFhbCBnZXRhbCBuYWFyIGVlbiBvY3RhYWwgZ2V0YWwNCklNQUJTCQkJPSBDLkFCUwkJCQkjIwlHZWVmdCBhbHMgcmVzdWx0YWF0IGRlIGFic29sdXRlIHdhYXJkZSAobW9kdWx1cykgdmFuIGVlbiBjb21wbGV4IGdldGFsDQpJTUFHSU5BUlkJCT0gQy5JTS5ERUVMCQkJIyMJR2VlZnQgYWxzIHJlc3VsdGFhdCBkZSBpbWFnaW5haXJlIGNvw6tmZmljacOrbnQgdmFuIGVlbiBjb21wbGV4IGdldGFsDQpJTUFSR1VNRU5UCQk9IEMuQVJHVU1FTlQJCQkjIwlHZWVmdCBhbHMgcmVzdWx0YWF0IGhldCBhcmd1bWVudCB0aMOodGEsIGVlbiBob2VrIHVpdGdlZHJ1a3QgaW4gcmFkaWFsZW4NCklNQ09OSlVHQVRFCQk9IEMuVE9FR0VWT0VHRAkJCSMjCUdlZWZ0IGFscyByZXN1bHRhYXQgaGV0IGNvbXBsZXhlIHRvZWdldm9lZ2RlIGdldGFsIHZhbiBlZW4gY29tcGxleCBnZXRhbA0KSU1DT1MJCQk9IEMuQ09TCQkJCSMjCUdlZWZ0IGFscyByZXN1bHRhYXQgZGUgY29zaW51cyB2YW4gZWVuIGNvbXBsZXggZ2V0YWwNCklNRElWCQkJPSBDLlFVT1RJRU5UCQkJIyMJR2VlZnQgYWxzIHJlc3VsdGFhdCBoZXQgcXVvdGnDq250IHZhbiB0d2VlIGNvbXBsZXhlIGdldGFsbGVuDQpJTUVYUAkJCT0gQy5FWFAJCQkJIyMJR2VlZnQgYWxzIHJlc3VsdGFhdCBkZSBleHBvbmVudCB2YW4gZWVuIGNvbXBsZXggZ2V0YWwNCklNTE4JCQk9IEMuTE4JCQkJIyMJR2VlZnQgYWxzIHJlc3VsdGFhdCBkZSBuYXR1dXJsaWprZSBsb2dhcml0bWUgdmFuIGVlbiBjb21wbGV4IGdldGFsDQpJTUxPRzEwCQkJPSBDLkxPRzEwCQkJIyMJR2VlZnQgYWxzIHJlc3VsdGFhdCBkZSBsb2dhcml0bWUgbWV0IGdyb25kdGFsIDEwIHZhbiBlZW4gY29tcGxleCBnZXRhbA0KSU1MT0cyCQkJPSBDLkxPRzIJCQkjIwlHZWVmdCBhbHMgcmVzdWx0YWF0IGRlIGxvZ2FyaXRtZSBtZXQgZ3JvbmR0YWwgMiB2YW4gZWVuIGNvbXBsZXggZ2V0YWwNCklNUE9XRVIJCQk9IEMuTUFDSFQJCQkjIwlHZWVmdCBhbHMgcmVzdWx0YWF0IGVlbiBjb21wbGV4IGdldGFsIGRhdCBpcyB2ZXJoZXZlbiB0b3QgZGUgbWFjaHQgdmFuIGVlbiBnZWhlZWwgZ2V0YWwNCklNUFJPRFVDVAkJPSBDLlBST0RVQ1QJCQkjIwlHZWVmdCBhbHMgcmVzdWx0YWF0IGhldCBwcm9kdWN0IHZhbiBjb21wbGV4ZSBnZXRhbGxlbg0KSU1SRUFMCQkJPSBDLlJFRUVMLkRFRUwJCQkjIwlHZWVmdCBhbHMgcmVzdWx0YWF0IGRlIHJlw6tsZSBjb8OrZmZpY2nDq250IHZhbiBlZW4gY29tcGxleCBnZXRhbA0KSU1TSU4JCQk9IEMuU0lOCQkJCSMjCUdlZWZ0IGFscyByZXN1bHRhYXQgZGUgc2ludXMgdmFuIGVlbiBjb21wbGV4IGdldGFsDQpJTVNRUlQJCQk9IEMuV09SVEVMCQkJIyMJR2VlZnQgYWxzIHJlc3VsdGFhdCBkZSB2aWVya2FudHN3b3J0ZWwgdmFuIGVlbiBjb21wbGV4IGdldGFsDQpJTVNVQgkJCT0gQy5WRVJTQ0hJTAkJCSMjCUdlZWZ0IGFscyByZXN1bHRhYXQgaGV0IHZlcnNjaGlsIHR1c3NlbiB0d2VlIGNvbXBsZXhlIGdldGFsbGVuDQpJTVNVTQkJCT0gQy5TT00JCQkJIyMJR2VlZnQgYWxzIHJlc3VsdGFhdCBkZSBzb20gdmFuIGNvbXBsZXhlIGdldGFsbGVuDQpPQ1QyQklOCQkJPSBPQ1QuTi5CSU4JCQkjIwlDb252ZXJ0ZWVydCBlZW4gb2N0YWFsIGdldGFsIG5hYXIgZWVuIGJpbmFpciBnZXRhbA0KT0NUMkRFQwkJCT0gT0NULk4uREVDCQkJIyMJQ29udmVydGVlcnQgZWVuIG9jdGFhbCBnZXRhbCBuYWFyIGVlbiBkZWNpbWFhbCBnZXRhbA0KT0NUMkhFWAkJCT0gT0NULk4uSEVYCQkJIyMJQ29udmVydGVlcnQgZWVuIG9jdGFhbCBnZXRhbCBuYWFyIGVlbiBoZXhhZGVjaW1hYWwgZ2V0YWwNCg0KDQojIw0KIyMJRmluYW5jaWFsIGZ1bmN0aW9ucwkJCQlGaW5hbmNpw6tsZSBmdW5jdGllcw0KIyMNCkFDQ1JJTlQJCQk9IFNBTUVORy5SRU5URQkJCSMjCUJlcmVrZW50IGRlIG9wZ2Vsb3BlbiByZW50ZSB2b29yIGVlbiB3YWFyZGVwYXBpZXIgd2FhcnZhbiBkZSByZW50ZSBwZXJpb2RpZWsgd29yZHQgdWl0Z2VrZWVyZA0KQUNDUklOVE0JCT0gU0FNRU5HLlJFTlRFLlYJCSMjCUJlcmVrZW50IGRlIG9wZ2Vsb3BlbiByZW50ZSB2b29yIGVlbiB3YWFyZGVwYXBpZXIgd2FhcnZhbiBkZSByZW50ZSBvcCBkZSB2ZXJ2YWxkYXR1bSB3b3JkdCB1aXRnZWtlZXJkDQpBTU9SREVHUkMJCT0gQU1PUkRFR1JDCQkJIyMJR2VlZnQgYWxzIHJlc3VsdGFhdCBkZSBhZnNjaHJpanZpbmcgdm9vciBlbGtlIGJvZWtpbmdzcGVyaW9kZSBkb29yIGVlbiBhZnNjaHJpanZpbmdzY2/Dq2ZmaWNpw6tudCB0b2UgdGUgcGFzc2VuDQpBTU9STElOQwkJPSBBTU9STElOQwkJCSMjCUJlcmVrZW50IGRlIGFmc2NocmlqdmluZyB2b29yIGVsa2UgYm9la2luZ3NwZXJpb2RlDQpDT1VQREFZQlMJCT0gQ09VUC5EQUdFTi5CQgkJCSMjCUJlcmVrZW50IGhldCBhYW50YWwgZGFnZW4gdmFuYWYgaGV0IGJlZ2luIHZhbiBkZSBjb3Vwb250ZXJtaWpuIHRvdCBkZSBzdG9ydGluZ3NkYXR1bQ0KQ09VUERBWVMJCT0gQ09VUC5EQUdFTgkJCSMjCUdlZWZ0IGFscyByZXN1bHRhYXQgaGV0IGFhbnRhbCBkYWdlbiBpbiBkZSBjb3Vwb250ZXJtaWpuIHdhYXJpbiBkZSBzdG9ydGluZ3NkYXR1bSB2YWx0DQpDT1VQREFZU05DCQk9IENPVVAuREFHRU4uVlYJCQkjIwlHZWVmdCBhbHMgcmVzdWx0YWF0IGhldCBhYW50YWwgZGFnZW4gdmFuYWYgZGUgc3RvcnRpbmdzZGF0dW0gdG90IGRlIHZvbGdlbmRlIGNvdXBvbnZlcnZhbGRhdHVtDQpDT1VQTkNECQkJPSBDT1VQLkRBVFVNLk5CCQkJIyMJR2VlZnQgYWxzIHJlc3VsdGFhdCBkZSB2b2xnZW5kZSBjb3Vwb25kYXR1bSBuYSBkZSBzdG9ydGluZ3NkYXR1bQ0KQ09VUE5VTQkJCT0gQ09VUC5BQU5UQUwJCQkjIwlHZWVmdCBhbHMgcmVzdWx0YWF0IGhldCBhYW50YWwgY291cG9ucyBkYXQgbm9nIG1vZXQgd29yZGVuIHVpdGJldGFhbGQgdHVzc2VuIGRlIHN0b3J0aW5nc2RhdHVtIGVuIGRlIHZlcnZhbGRhdHVtDQpDT1VQUENECQkJPSBDT1VQLkRBVFVNLlZCCQkJIyMJR2VlZnQgYWxzIHJlc3VsdGFhdCBkZSB2b3JpZ2UgY291cG9udmVydmFsZGF0dW0gdsOzw7NyIGRlIHN0b3J0aW5nc2RhdHVtDQpDVU1JUE1UCQkJPSBDVU0uUkVOVEUJCQkjIwlHZWVmdCBhbHMgcmVzdWx0YWF0IGRlIGN1bXVsYXRpZXZlIHJlbnRlIGRpZSB0dXNzZW4gdHdlZSB0ZXJtaWpuZW4gaXMgdWl0Z2VrZWVyZA0KQ1VNUFJJTkMJCT0gQ1VNLkhPT0ZEU09NCQkJIyMJR2VlZnQgYWxzIHJlc3VsdGFhdCBkZSBjdW11bGF0aWV2ZSBob29mZHNvbSB2YW4gZWVuIGxlbmluZyBkaWUgdHVzc2VuIHR3ZWUgdGVybWlqbmVuIGlzIHRlcnVnYmV0YWFsZA0KREIJCQk9IERCCQkJCSMjCUdlZWZ0IGFscyByZXN1bHRhYXQgZGUgYWZzY2hyaWp2aW5nIHZhbiBhY3RpdmEgdm9vciBlZW4gYmVwYWFsZGUgcGVyaW9kZSBtZXQgYmVodWxwIHZhbiBkZSAnZml4ZWQgZGVjbGluaW5nIGJhbGFuY2UnLW1ldGhvZGUNCkREQgkJCT0gRERCCQkJCSMjCUdlZWZ0IGFscyByZXN1bHRhYXQgZGUgYWZzY2hyaWp2aW5nIHZhbiBhY3RpdmEgb3ZlciBlZW4gYmVwYWFsZGUgdGVybWlqbiBtZXQgYmVodWxwIHZhbiBkZSAnZG91YmxlIGRlY2xpbmluZyBiYWxhbmNlJy1tZXRob2RlIG9mIGVlbiBhbmRlcmUgbWV0aG9kZSBkaWUgdSBvcGdlZWZ0DQpESVNDCQkJPSBESVNDT05UTwkJCSMjCUdlZWZ0IGFscyByZXN1bHRhYXQgaGV0IGRpc2NvbnRvcGVyY2VudGFnZSB2b29yIGVlbiB3YWFyZGVwYXBpZXINCkRPTExBUkRFCQk9IEVVUk8uREUJCQkjIwlDb252ZXJ0ZWVydCBlZW4gcHJpanMgaW4gZXVybydzLCB1aXRnZWRydWt0IGluIGVlbiBicmV1aywgbmFhciBlZW4gcHJpanMgaW4gZXVybydzLCB1aXRnZWRydWt0IGluIGVlbiBkZWNpbWFhbCBnZXRhbA0KRE9MTEFSRlIJCT0gRVVSTy5CUgkJCSMjCUNvbnZlcnRlZXJ0IGVlbiBwcmlqcyBpbiBldXJvJ3MsIHVpdGdlZHJ1a3QgaW4gZWVuIGRlY2ltYWFsIGdldGFsLCBuYWFyIGVlbiBwcmlqcyBpbiBldXJvJ3MsIHVpdGdlZHJ1a3QgaW4gZWVuIGJyZXVrDQpEVVJBVElPTgkJPSBEVVVSCQkJCSMjCUdlZWZ0IGFscyByZXN1bHRhYXQgZGUgZ2V3b2dlbiBnZW1pZGRlbGRlIGxvb3B0aWpkIHZvb3IgZWVuIHdhYXJkZXBhcGllciBtZXQgcGVyaW9kaWVrZSByZW50ZWJldGFsaW5nZW4NCkVGRkVDVAkJCT0gRUZGRUNULlJFTlRFCQkJIyMJR2VlZnQgYWxzIHJlc3VsdGFhdCBoZXQgZWZmZWN0aWV2ZSBqYWFybGlqa3NlIHJlbnRlcGVyY2VudGFnZQ0KRlYJCQk9IFRXCQkJCSMjCUdlZWZ0IGFscyByZXN1bHRhYXQgZGUgdG9la29tc3RpZ2Ugd2FhcmRlIHZhbiBlZW4gaW52ZXN0ZXJpbmcNCkZWU0NIRURVTEUJCT0gVE9FSy5XQUFSREUyCQkJIyMJR2VlZnQgYWxzIHJlc3VsdGFhdCBkZSB0b2Vrb21zdGlnZSB3YWFyZGUgdmFuIGVlbiBiZXBhYWxkZSBob29mZHNvbSBuYSBoZXQgdG9lcGFzc2VuIHZhbiBlZW4gcmVla3Mgc2FtZW5nZXN0ZWxkZSByZW50ZXBlcmNlbnRhZ2VzDQpJTlRSQVRFCQkJPSBSRU5URVBFUkNFTlRBR0UJCSMjCUdlZWZ0IGFscyByZXN1bHRhYXQgaGV0IHJlbnRlcGVyY2VudGFnZSB2b29yIGVlbiB2b2xnZXN0b3J0IHdhYXJkZXBhcGllcg0KSVBNVAkJCT0gSUJFVAkJCQkjIwlHZWVmdCBhbHMgcmVzdWx0YWF0IGRlIHRlIGJldGFsZW4gcmVudGUgdm9vciBlZW4gaW52ZXN0ZXJpbmcgb3ZlciBlZW4gYmVwYWFsZGUgdGVybWlqbg0KSVJSCQkJPSBJUgkJCQkjIwlHZWVmdCBhbHMgcmVzdWx0YWF0IGRlIGludGVybmUgcmVudGFiaWxpdGVpdCB2b29yIGVlbiByZWVrcyBjYXNoZmxvd3MNCklTUE1UCQkJPSBJU0JFVAkJCQkjIwlHZWVmdCBhbHMgcmVzdWx0YWF0IGRlIHJlbnRlIGRpZSBpcyBiZXRhYWxkIHRpamRlbnMgZWVuIGJlcGFhbGRlIHRlcm1pam4gdmFuIGVlbiBpbnZlc3RlcmluZw0KTURVUkFUSU9OCQk9IEFBTkcuRFVVUgkJCSMjCUdlZWZ0IGFscyByZXN1bHRhYXQgZGUgYWFuZ2VwYXN0ZSBNYWNhdWxleS1sb29wdGlqZCB2b29yIGVlbiB3YWFyZGVwYXBpZXIsIGFhbmdlbm9tZW4gZGF0IGRlIG5vbWluYWxlIHdhYXJkZSDigqwgMTAwIGJlZHJhYWd0DQpNSVJSCQkJPSBHSVIJCQkJIyMJR2VlZnQgYWxzIHJlc3VsdGFhdCBkZSBpbnRlcm5lIHJlbnRhYmlsaXRlaXQgdm9vciBlZW4gc2VyaWUgY2FzaGZsb3dzLCB3YWFyYmlqIHZvb3IgYmV0YWxpbmdlbiBlZW4gYW5kZXIgcmVudGVwZXJjZW50YWdlIGdlbGR0IGRhbiB2b29yIGlua29tc3Rlbg0KTk9NSU5BTAkJCT0gTk9NSU5BTEUuUkVOVEUJCSMjCUdlZWZ0IGFscyByZXN1bHRhYXQgaGV0IG5vbWluYWxlIGphYXJsaWprc2UgcmVudGVwZXJjZW50YWdlDQpOUEVSCQkJPSBOUEVSCQkJCSMjCUdlZWZ0IGFscyByZXN1bHRhYXQgaGV0IGFhbnRhbCB0ZXJtaWpuZW4gdmFuIGVlbiBpbnZlc3RlcmluZw0KTlBWCQkJPSBOSFcJCQkJIyMJR2VlZnQgYWxzIHJlc3VsdGFhdCBkZSBuZXR0byBodWlkaWdlIHdhYXJkZSB2YW4gZWVuIGludmVzdGVyaW5nIG9wIGJhc2lzIHZhbiBlZW4gcmVla3MgcGVyaW9kaWVrZSBjYXNoZmxvd3MgZW4gZWVuIGRpc2NvbnRvcGVyY2VudGFnZQ0KT0RERlBSSUNFCQk9IEFGVy5FVC5QUklKUwkJCSMjCUdlZWZ0IGFscyByZXN1bHRhYXQgZGUgcHJpanMgcGVyIOKCrCAxMDAgbm9taW5hbGUgd2FhcmRlIHZvb3IgZWVuIHdhYXJkZXBhcGllciBtZXQgZWVuIGFmd2lqa2VuZGUgZWVyc3RlIHRlcm1pam4NCk9EREZZSUVMRAkJPSBBRlcuRVQuUkVORAkJCSMjCUdlZWZ0IGFscyByZXN1bHRhYXQgaGV0IHJlbmRlbWVudCB2b29yIGVlbiB3YWFyZGVwYXBpZXIgbWV0IGVlbiBhZndpamtlbmRlIGVlcnN0ZSB0ZXJtaWpuDQpPRERMUFJJQ0UJCT0gQUZXLkxULlBSSUpTCQkJIyMJR2VlZnQgYWxzIHJlc3VsdGFhdCBkZSBwcmlqcyBwZXIg4oKsIDEwMCBub21pbmFsZSB3YWFyZGUgdm9vciBlZW4gd2FhcmRlcGFwaWVyIG1ldCBlZW4gYWZ3aWprZW5kZSBsYWF0c3RlIHRlcm1pam4NCk9ERExZSUVMRAkJPSBBRlcuTFQuUkVORAkJCSMjCUdlZWZ0IGFscyByZXN1bHRhYXQgaGV0IHJlbmRlbWVudCB2b29yIGVlbiB3YWFyZGVwYXBpZXIgbWV0IGVlbiBhZndpamtlbmRlIGxhYXRzdGUgdGVybWlqbg0KUE1UCQkJPSBCRVQJCQkJIyMJR2VlZnQgYWxzIHJlc3VsdGFhdCBkZSBwZXJpb2RpZWtlIGJldGFsaW5nIHZvb3IgZWVuIGFubnXDr3RlaXQNClBQTVQJCQk9IFBCRVQJCQkJIyMJR2VlZnQgYWxzIHJlc3VsdGFhdCBkZSBhZmJldGFsaW5nIG9wIGRlIGhvb2Zkc29tIHZvb3IgZWVuIGJlcGFhbGRlIHRlcm1pam4NClBSSUNFCQkJPSBQUklKUy5OT00JCQkjIwlHZWVmdCBhbHMgcmVzdWx0YWF0IGRlIHByaWpzIHBlciDigqwgMTAwIG5vbWluYWxlIHdhYXJkZSB2b29yIGVlbiB3YWFyZGVwYXBpZXIgd2FhcnZhbiBkZSByZW50ZSBwZXJpb2RpZWsgd29yZHQgdWl0Z2VrZWVyZA0KUFJJQ0VESVNDCQk9IFBSSUpTLkRJU0NPTlRPCQkjIwlHZWVmdCBhbHMgcmVzdWx0YWF0IGRlIHByaWpzIHBlciDigqwgMTAwIG5vbWluYWxlIHdhYXJkZSB2b29yIGVlbiB2ZXJkaXNjb250ZWVyZCB3YWFyZGVwYXBpZXINClBSSUNFTUFUCQk9IFBSSUpTLlZFUlZBTERBRwkJIyMJR2VlZnQgYWxzIHJlc3VsdGFhdCBkZSBwcmlqcyBwZXIg4oKsIDEwMCBub21pbmFsZSB3YWFyZGUgdm9vciBlZW4gd2FhcmRlcGFwaWVyIHdhYXJ2YW4gZGUgcmVudGUgd29yZHQgdWl0Z2VrZWVyZCBvcCBkZSB2ZXJ2YWxkYXR1bQ0KUFYJCQk9IEhXCQkJCSMjCUdlZWZ0IGFscyByZXN1bHRhYXQgZGUgaHVpZGlnZSB3YWFyZGUgdmFuIGVlbiBpbnZlc3RlcmluZw0KUkFURQkJCT0gUkVOVEUJCQkJIyMJR2VlZnQgYWxzIHJlc3VsdGFhdCBoZXQgcGVyaW9kaWVrZSByZW50ZXBlcmNlbnRhZ2Ugdm9vciBlZW4gYW5udcOvdGVpdA0KUkVDRUlWRUQJCT0gT1BCUkVOR1NUCQkJIyMJR2VlZnQgYWxzIHJlc3VsdGFhdCBoZXQgYmVkcmFnIGRhdCBvcCBkZSB2ZXJ2YWxkYXR1bSB3b3JkdCB1aXRnZWtlZXJkIHZvb3IgZWVuIHZvbGdlc3RvcnQgd2FhcmRlcGFwaWVyDQpTTE4JCQk9IExJTi5BRlNDSFIJCQkjIwlHZWVmdCBhbHMgcmVzdWx0YWF0IGRlIGxpbmVhaXJlIGFmc2NocmlqdmluZyB2YW4gYWN0aXZhIG92ZXIgw6nDqW4gdGVybWlqbg0KU1lECQkJPSBTWUQJCQkJIyMJR2VlZnQgYWxzIHJlc3VsdGFhdCBkZSBhZnNjaHJpanZpbmcgdmFuIGFjdGl2YSBvdmVyIGVlbiBiZXBhYWxkZSB0ZXJtaWpuIG1ldCBiZWh1bHAgdmFuIGRlICdTdW0tT2YtWWVhcnMtRGlnaXRzJy1tZXRob2RlDQpUQklMTEVRCQkJPSBTQ0hBVEsuT0JMCQkJIyMJR2VlZnQgYWxzIHJlc3VsdGFhdCBoZXQgcmVuZGVtZW50IG9wIHNjaGF0a2lzdHBhcGllciwgZGF0IG9wIGRlemVsZmRlIG1hbmllciB3b3JkdCBiZXJla2VuZCBhbHMgaGV0IHJlbmRlbWVudCBvcCBvYmxpZ2F0aWVzDQpUQklMTFBSSUNFCQk9IFNDSEFUSy5QUklKUwkJCSMjCUJlcGFhbHQgZGUgcHJpanMgcGVyIOKCrCAxMDAgbm9taW5hbGUgd2FhcmRlIHZvb3Igc2NoYXRraXN0cGFwaWVyDQpUQklMTFlJRUxECQk9IFNDSEFUSy5SRU5ECQkJIyMJQmVyZWtlbnQgaGV0IHJlbmRlbWVudCB2b29yIHNjaGF0a2lzdHBhcGllcg0KVkRCCQkJPSBWREIJCQkJIyMJR2VlZnQgYWxzIHJlc3VsdGFhdCBkZSBhZnNjaHJpanZpbmcgdmFuIGFjdGl2YSBvdmVyIGVlbiBnZWhlbGUgb2YgZ2VkZWVsdGVsaWprZSB0ZXJtaWpuIG1ldCBiZWh1bHAgdmFuIGRlICdkZWNsaW5pbmcgYmFsYW5jZSctbWV0aG9kZQ0KWElSUgkJCT0gSVIuU0NIRU1BCQkJIyMJQmVyZWtlbnQgZGUgaW50ZXJuZSByZW50YWJpbGl0ZWl0IHZvb3IgZWVuIGJldGFsaW5nc3NjaGVtYSB2YW4gY2FzaGZsb3dzDQpYTlBWCQkJPSBOSFcyCQkJCSMjCUJlcmVrZW50IGRlIGh1aWRpZ2UgbmV0dG93YWFyZGUgdm9vciBlZW4gYmV0YWxpbmdzc2NoZW1hIHZhbiBjYXNoZmxvd3MNCllJRUxECQkJPSBSRU5ERU1FTlQJCQkjIwlHZWVmdCBhbHMgcmVzdWx0YWF0IGhldCByZW5kZW1lbnQgdm9vciBlZW4gd2FhcmRlcGFwaWVyIHdhYXJ2YW4gZGUgcmVudGUgcGVyaW9kaWVrIHdvcmR0IHVpdGdla2VlcmQNCllJRUxERElTQwkJPSBSRU5ELkRJU0NPTlRPCQkJIyMJR2VlZnQgYWxzIHJlc3VsdGFhdCBoZXQgamFhcmxpamtzZSByZW5kZW1lbnQgdm9vciBlZW4gdmVyZGlzY29udGVlcmQgd2FhcmRlcGFwaWVyLCBiaWp2b29yYmVlbGQgc2NoYXRraXN0cGFwaWVyDQpZSUVMRE1BVAkJPSBSRU5ELlZFUlZBTAkJCSMjCUdlZWZ0IGFscyByZXN1bHRhYXQgaGV0IGphYXJsaWprc2UgcmVuZGVtZW50IHZvb3IgZWVuIHdhYXJkZXBhcGllciB3YWFydmFuIGRlIHJlbnRlIHdvcmR0IHVpdGdla2VlcmQgb3AgZGUgdmVydmFsZGF0dW0NCg0KDQojIw0KIyMJSW5mb3JtYXRpb24gZnVuY3Rpb25zCQkJCUluZm9ybWF0aWVmdW5jdGllcw0KIyMNCkNFTEwJCQk9IENFTAkJCQkjIwlHZWVmdCBhbHMgcmVzdWx0YWF0IGluZm9ybWF0aWUgb3ZlciBkZSBvcG1hYWssIGxvY2F0aWUgb2YgaW5ob3VkIHZhbiBlZW4gY2VsDQpFUlJPUi5UWVBFCQk9IFRZUEUuRk9VVAkJCSMjCUdlZWZ0IGFscyByZXN1bHRhYXQgZWVuIGdldGFsIGRhdCBvdmVyZWVua29tdCBtZXQgZWVuIHZhbiBkZSBmb3V0d2FhcmRlbiB2YW4gTWljcm9zb2Z0IEV4Y2VsDQpJTkZPCQkJPSBJTkZPCQkJCSMjCUdlZWZ0IGFscyByZXN1bHRhYXQgaW5mb3JtYXRpZSBvdmVyIGRlIGh1aWRpZ2UgYmVzdHVyaW5nc29tZ2V2aW5nDQpJU0JMQU5LCQkJPSBJU0xFRUcJCQkjIwlHZWVmdCBhbHMgcmVzdWx0YWF0IFdBQVIgYWxzIGRlIHdhYXJkZSBsZWVnIGlzDQpJU0VSUgkJCT0gSVNGT1VUMgkJCSMjCUdlZWZ0IGFscyByZXN1bHRhYXQgV0FBUiBhbHMgZGUgd2FhcmRlIGVlbiBmb3V0d2FhcmRlIGlzLCBtZXQgdWl0em9uZGVyaW5nIHZhbiAjTi9CDQpJU0VSUk9SCQkJPSBJU0ZPVVQJCQkjIwlHZWVmdCBhbHMgcmVzdWx0YWF0IFdBQVIgYWxzIGRlIHdhYXJkZSBlZW4gZm91dHdhYXJkZSBpcw0KSVNFVkVOCQkJPSBJUy5FVkVOCQkJIyMJR2VlZnQgYWxzIHJlc3VsdGFhdCBXQUFSIGFscyBoZXQgZ2V0YWwgZXZlbiBpcw0KSVNMT0dJQ0FMCQk9IElTTE9HSVNDSAkJCSMjCUdlZWZ0IGFscyByZXN1bHRhYXQgV0FBUiBhbHMgZGUgd2FhcmRlIGVlbiBsb2dpc2NoZSB3YWFyZGUgaXMNCklTTkEJCQk9IElTTkIJCQkJIyMJR2VlZnQgYWxzIHJlc3VsdGFhdCBXQUFSIGFscyBkZSB3YWFyZGUgZGUgZm91dHdhYXJkZSAjTi9CIGlzDQpJU05PTlRFWFQJCT0gSVNHRUVOVEVLU1QJCQkjIwlHZWVmdCBhbHMgcmVzdWx0YWF0IFdBQVIgYWxzIGRlIHdhYXJkZSBnZWVuIHRla3N0IGlzDQpJU05VTUJFUgkJPSBJU0dFVEFMCQkJIyMJR2VlZnQgYWxzIHJlc3VsdGFhdCBXQUFSIGFscyBkZSB3YWFyZGUgZWVuIGdldGFsIGlzDQpJU09ERAkJCT0gSVMuT05FVkVOCQkJIyMJR2VlZnQgYWxzIHJlc3VsdGFhdCBXQUFSIGFscyBoZXQgZ2V0YWwgb25ldmVuIGlzDQpJU1JFRgkJCT0gSVNWRVJXSUpaSU5HCQkJIyMJR2VlZnQgYWxzIHJlc3VsdGFhdCBXQUFSIGFscyBkZSB3YWFyZGUgZWVuIHZlcndpanppbmcgaXMNCklTVEVYVAkJCT0gSVNURUtTVAkJCSMjCUdlZWZ0IGFscyByZXN1bHRhYXQgV0FBUiBhbHMgZGUgd2FhcmRlIHRla3N0IGlzDQpOCQkJPSBOCQkJCSMjCUdlZWZ0IGFscyByZXN1bHRhYXQgZWVuIHdhYXJkZSBkaWUgaXMgZ2Vjb252ZXJ0ZWVyZCBuYWFyIGVlbiBnZXRhbA0KTkEJCQk9IE5CCQkJCSMjCUdlZWZ0IGFscyByZXN1bHRhYXQgZGUgZm91dHdhYXJkZSAjTi9CDQpUWVBFCQkJPSBUWVBFCQkJCSMjCUdlZWZ0IGFscyByZXN1bHRhYXQgZWVuIGdldGFsIGRhdCBoZXQgZ2VnZXZlbnN0eXBlIHZhbiBlZW4gd2FhcmRlIGFhbmdlZWZ0DQoNCg0KIyMNCiMjCUxvZ2ljYWwgZnVuY3Rpb25zCQkJCUxvZ2lzY2hlIGZ1bmN0aWVzDQojIw0KQU5ECQkJPSBFTgkJCQkjIwlHZWVmdCBhbHMgcmVzdWx0YWF0IFdBQVIgYWxzIGFsbGUgYXJndW1lbnRlbiBXQUFSIHppam4NCkZBTFNFCQkJPSBPTldBQVIJCQkjIwlHZWVmdCBhbHMgcmVzdWx0YWF0IGRlIGxvZ2lzY2hlIHdhYXJkZSBPTldBQVINCklGCQkJPSBBTFMJCQkJIyMJR2VlZnQgZWVuIGxvZ2lzY2hlIHRlc3QgYWFuDQpJRkVSUk9SCQkJPSBBTFMuRk9VVAkJCSMjCVJldG91cm5lZXJ0IGVlbiB3YWFyZGUgZGllIHUgb3BnZWVmdCBhbHMgZWVuIGZvcm11bGUgZWVuIGZvdXQgb3BsZXZlcnQsIGFuZGVycyB3b3JkdCBoZXQgcmVzdWx0YWF0IHZhbiBkZSBmb3JtdWxlIGdlcmV0b3VybmVlcmQNCk5PVAkJCT0gTklFVAkJCQkjIwlLZWVydCBkZSBsb2dpc2NoZSB3YWFyZGUgdmFuIGhldCBhcmd1bWVudCBvbQ0KT1IJCQk9IE9GCQkJCSMjCUdlZWZ0IGFscyByZXN1bHRhYXQgV0FBUiBhbHMgbWluaW1hYWwgZWVuIHZhbiBkZSBhcmd1bWVudGVuIFdBQVIgaXMNClRSVUUJCQk9IFdBQVIJCQkJIyMJR2VlZnQgYWxzIHJlc3VsdGFhdCBkZSBsb2dpc2NoZSB3YWFyZGUgV0FBUg0KDQoNCiMjDQojIwlMb29rdXAgYW5kIHJlZmVyZW5jZSBmdW5jdGlvbnMJCQlab2VrLSBlbiB2ZXJ3aWp6aW5nc2Z1bmN0aWVzDQojIw0KQUREUkVTUwkJCT0gQURSRVMJCQkJIyMJR2VlZnQgYWxzIHJlc3VsdGFhdCBlZW4gdmVyd2lqemluZywgaW4gZGUgdm9ybSB2YW4gdGVrc3QsIG5hYXIgw6nDqW4gYmVwYWFsZGUgY2VsIGluIGVlbiB3ZXJrYmxhZA0KQVJFQVMJCQk9IEJFUkVJS0VOCQkJIyMJR2VlZnQgYWxzIHJlc3VsdGFhdCBoZXQgYWFudGFsIGJlcmVpa2VuIGluIGVlbiB2ZXJ3aWp6aW5nDQpDSE9PU0UJCQk9IEtJRVpFTgkJCSMjCUtpZXN0IGVlbiB3YWFyZGUgdWl0IGVlbiBsaWpzdCBtZXQgd2FhcmRlbg0KQ09MVU1OCQkJPSBLT0xPTQkJCQkjIwlHZWVmdCBhbHMgcmVzdWx0YWF0IGhldCBrb2xvbW51bW1lciB2YW4gZWVuIHZlcndpanppbmcNCkNPTFVNTlMJCQk9IEtPTE9NTUVOCQkJIyMJR2VlZnQgYWxzIHJlc3VsdGFhdCBoZXQgYWFudGFsIGtvbG9tbWVuIGluIGVlbiB2ZXJ3aWp6aW5nDQpITE9PS1VQCQkJPSBIT1JJWi5aT0VLRU4JCQkjIwlab2VrdCBpbiBkZSBib3ZlbnN0ZSByaWogdmFuIGVlbiBtYXRyaXggbmFhciBlZW4gYmVwYWFsZGUgd2FhcmRlIGVuIGdlZWZ0IGFscyByZXN1bHRhYXQgZGUgZ2V2b25kZW4gd2FhcmRlIGluIGRlIG9wZ2VnZXZlbiBjZWwNCkhZUEVSTElOSwkJPSBIWVBFUkxJTksJCQkjIwlNYWFrdCBlZW4gc25lbGtvcHBlbGluZyBvZiBlZW4gc3Byb25nIHdhYXJtZWUgZWVuIGRvY3VtZW50IHdvcmR0IGdlb3BlbmQgZGF0IGlzIG9wZ2VzbGFnZW4gb3AgZWVuIG5ldHdlcmtzZXJ2ZXIsIGVlbiBpbnRyYW5ldCBvZiBvcCBpbnRlcm5ldA0KSU5ERVgJCQk9IElOREVYCQkJCSMjCUtpZXN0IG1ldCBlZW4gaW5kZXggZWVuIHdhYXJkZSB1aXQgZWVuIHZlcndpanppbmcgb2YgZWVuIG1hdHJpeA0KSU5ESVJFQ1QJCT0gSU5ESVJFQ1QJCQkjIwlHZWVmdCBhbHMgcmVzdWx0YWF0IGVlbiB2ZXJ3aWp6aW5nIGRpZSB3b3JkdCBhYW5nZWdldmVuIG1ldCBlZW4gdGVrc3R3YWFyZGUNCkxPT0tVUAkJCT0gWk9FS0VOCQkJIyMJWm9la3QgbmFhciBiZXBhYWxkZSB3YWFyZGVuIGluIGVlbiB2ZWN0b3Igb2YgZWVuIG1hdHJpeA0KTUFUQ0gJCQk9IFZFUkdFTElKS0VOCQkJIyMJWm9la3QgbmFhciBiZXBhYWxkZSB3YWFyZGVuIGluIGVlbiB2ZXJ3aWp6aW5nIG9mIGVlbiBtYXRyaXgNCk9GRlNFVAkJCT0gVkVSU0NIVUlWSU5HCQkJIyMJR2VlZnQgYWxzIHJlc3VsdGFhdCBlZW4gbmlldXdlIHZlcndpanppbmcgZGllIGlzIHZlcnNjaG92ZW4gdGVuIG9wemljaHRlIHZhbiBlZW4gYmVwYWFsZGUgdmVyd2lqemluZw0KUk9XCQkJPSBSSUoJCQkJIyMJR2VlZnQgYWxzIHJlc3VsdGFhdCBoZXQgcmlqbnVtbWVyIHZhbiBlZW4gdmVyd2lqemluZw0KUk9XUwkJCT0gUklKRU4JCQkJIyMJR2VlZnQgYWxzIHJlc3VsdGFhdCBoZXQgYWFudGFsIHJpamVuIGluIGVlbiB2ZXJ3aWp6aW5nDQpSVEQJCQk9IFJURwkJCQkjIwlIYWFsdCByZWFsdGltZWdlZ2V2ZW5zIG9wIHVpdCBlZW4gcHJvZ3JhbW1hIGRhdCBDT00tYXV0b21hdGlzZXJpbmcgKGF1dG9tYXRpc2VyaW5nOiBlZW4gbWV0aG9kZSB3YWFybWVlIGRlIGVuZSB0b2VwYXNzaW5nIG9iamVjdGVuIHZhbiBlZW4gYW5kZXJlIHRvZXBhc3Npbmcgb2Ygb250d2lra2VscHJvZ3JhbW1hIGthbiBiZXN0dXJlbi4gQXV0b21hdGlzZXJpbmcgd2VyZCB2cm9lZ2VyIE9MRS1hdXRvbWF0aXNlcmluZyBnZW5vZW1kLiBBdXRvbWF0aXNlcmluZyBpcyBlZW4gaW5kdXN0cmllbm9ybSBkaWUgZGVlbCB1aXRtYWFrdCB2YW4gaGV0IENvbXBvbmVudCBPYmplY3QgTW9kZWwgKENPTSkuKSBvbmRlcnN0ZXVudA0KVFJBTlNQT1NFCQk9IFRSQU5TUE9ORVJFTgkJCSMjCUdlZWZ0IGFscyByZXN1bHRhYXQgZGUgZ2V0cmFuc3BvbmVlcmRlIHZhbiBlZW4gbWF0cml4DQpWTE9PS1VQCQkJPSBWRVJULlpPRUtFTgkJCSMjCVpvZWt0IGluIGRlIG1lZXN0IGxpbmtzZSBrb2xvbSB2YW4gZWVuIG1hdHJpeCBuYWFyIGVlbiBiZXBhYWxkZSB3YWFyZGUgZW4gZ2VlZnQgYWxzIHJlc3VsdGFhdCBkZSB3YWFyZGUgaW4gZGUgb3BnZWdldmVuIGNlbA0KDQoNCiMjDQojIwlNYXRoIGFuZCB0cmlnb25vbWV0cnkgZnVuY3Rpb25zCQkJV2lza3VuZGlnZSBlbiB0cmlnb25vbWV0cmlzY2hlIGZ1bmN0aWVzDQojIw0KQUJTCQkJPSBBQlMJCQkJIyMJR2VlZnQgYWxzIHJlc3VsdGFhdCBkZSBhYnNvbHV0ZSB3YWFyZGUgdmFuIGVlbiBnZXRhbA0KQUNPUwkJCT0gQk9PR0NPUwkJCSMjCUdlZWZ0IGFscyByZXN1bHRhYXQgZGUgYm9vZ2Nvc2ludXMgdmFuIGVlbiBnZXRhbA0KQUNPU0gJCQk9IEJPT0dDT1NICQkJIyMJR2VlZnQgYWxzIHJlc3VsdGFhdCBkZSBpbnZlcnNlIGNvc2ludXMgaHlwZXJib2xpY3VzIHZhbiBlZW4gZ2V0YWwNCkFTSU4JCQk9IEJPT0dTSU4JCQkjIwlHZWVmdCBhbHMgcmVzdWx0YWF0IGRlIGJvb2dzaW51cyB2YW4gZWVuIGdldGFsDQpBU0lOSAkJCT0gQk9PR1NJTkgJCQkjIwlHZWVmdCBhbHMgcmVzdWx0YWF0IGRlIGludmVyc2Ugc2ludXMgaHlwZXJib2xpY3VzIHZhbiBlZW4gZ2V0YWwNCkFUQU4JCQk9IEJPT0dUQU4JCQkjIwlHZWVmdCBhbHMgcmVzdWx0YWF0IGRlIGJvb2d0YW5nZW5zIHZhbiBlZW4gZ2V0YWwNCkFUQU4yCQkJPSBCT09HVEFOMgkJCSMjCUdlZWZ0IGFscyByZXN1bHRhYXQgZGUgYm9vZ3RhbmdlbnMgdmFuIGRlIHgtIGVuIHktY2/DtnJkaW5hdGVuDQpBVEFOSAkJCT0gQk9PR1RBTkgJCQkjIwlHZWVmdCBhbHMgcmVzdWx0YWF0IGRlIGludmVyc2UgdGFuZ2VucyBoeXBlcmJvbGljdXMgdmFuIGVlbiBnZXRhbA0KQ0VJTElORwkJCT0gQUZST05ERU4uQk9WRU4JCSMjCVJvbmR0IGRlIGFic29sdXRlIHdhYXJkZSB2YW4gZWVuIGdldGFsIG5hYXIgYm92ZW4gYWYgb3AgaGV0IGRpY2h0c3RiaWp6aWpuZGUgZ2VoZWxlIGdldGFsIG9mIGhldCBkaWNodHN0YmlqemlqbmRlIHNpZ25pZmljYW50ZSB2ZWVsdm91ZA0KQ09NQklOCQkJPSBDT01CSU5BVElFUwkJCSMjCUdlZWZ0IGFscyByZXN1bHRhYXQgaGV0IGFhbnRhbCBjb21iaW5hdGllcyB2b29yIGVlbiBiZXBhYWxkIGFhbnRhbCBvYmplY3Rlbg0KQ09TCQkJPSBDT1MJCQkJIyMJR2VlZnQgYWxzIHJlc3VsdGFhdCBkZSBjb3NpbnVzIHZhbiBlZW4gZ2V0YWwNCkNPU0gJCQk9IENPU0gJCQkJIyMJR2VlZnQgYWxzIHJlc3VsdGFhdCBkZSBjb3NpbnVzIGh5cGVyYm9saWN1cyB2YW4gZWVuIGdldGFsDQpERUdSRUVTCQkJPSBHUkFERU4JCQkjIwlDb252ZXJ0ZWVydCByYWRpYWxlbiBuYWFyIGdyYWRlbg0KRVZFTgkJCT0gRVZFTgkJCQkjIwlSb25kdCBoZXQgZ2V0YWwgYWYgb3AgaGV0IGRpY2h0c3RiaWp6aWpuZGUgZ2VoZWxlIGV2ZW4gZ2V0YWwNCkVYUAkJCT0gRVhQCQkJCSMjCVZlcmhlZnQgZSB0b3QgZGUgbWFjaHQgdmFuIGVlbiBiZXBhYWxkIGdldGFsDQpGQUNUCQkJPSBGQUNVTFRFSVQJCQkjIwlHZWVmdCBhbHMgcmVzdWx0YWF0IGRlIGZhY3VsdGVpdCB2YW4gZWVuIGdldGFsDQpGQUNURE9VQkxFCQk9IERVQkJFTEUuRkFDVUxURUlUCQkjIwlHZWVmdCBhbHMgcmVzdWx0YWF0IGRlIGR1YmJlbGUgZmFjdWx0ZWl0IHZhbiBlZW4gZ2V0YWwNCkZMT09SCQkJPSBBRlJPTkRFTi5CRU5FREVOCQkjIwlSb25kdCBkZSBhYnNvbHV0ZSB3YWFyZGUgdmFuIGVlbiBnZXRhbCBuYWFyIGJlbmVkZW4gYWYNCkdDRAkJCT0gR0dECQkJCSMjCUdlZWZ0IGFscyByZXN1bHRhYXQgZGUgZ3Jvb3RzdGUgZ2VtZW5lIGRlbGVyDQpJTlQJCQk9IElOVEVHRVIJCQkjIwlSb25kdCBlZW4gZ2V0YWwgbmFhciBiZW5lZGVuIGFmIG9wIGhldCBkaWNodHN0YmlqemlqbmRlIGdlaGVsZSBnZXRhbA0KTENNCQkJPSBLR1YJCQkJIyMJR2VlZnQgYWxzIHJlc3VsdGFhdCBoZXQga2xlaW5zdGUgZ2VtZW5lIHZlZWx2b3VkDQpMTgkJCT0gTE4JCQkJIyMJR2VlZnQgYWxzIHJlc3VsdGFhdCBkZSBuYXR1dXJsaWprZSBsb2dhcml0bWUgdmFuIGVlbiBnZXRhbA0KTE9HCQkJPSBMT0cJCQkJIyMJR2VlZnQgYWxzIHJlc3VsdGFhdCBkZSBsb2dhcml0bWUgbWV0IGhldCBvcGdlZ2V2ZW4gZ3JvbmR0YWwgdmFuIGVlbiBnZXRhbA0KTE9HMTAJCQk9IExPRzEwCQkJCSMjCUdlZWZ0IGFscyByZXN1bHRhYXQgZGUgbG9nYXJpdG1lIG1ldCBncm9uZHRhbCAxMCB2YW4gZWVuIGdldGFsDQpNREVURVJNCQkJPSBERVRFUk1JTkFOVE1BVAkJIyMJR2VlZnQgYWxzIHJlc3VsdGFhdCBkZSBkZXRlcm1pbmFudCB2YW4gZWVuIG1hdHJpeA0KTUlOVkVSU0UJCT0gSU5WRVJTRU1BVAkJCSMjCUdlZWZ0IGFscyByZXN1bHRhYXQgZGUgaW52ZXJzZSB2YW4gZWVuIG1hdHJpeA0KTU1VTFQJCQk9IFBST0RVQ1RNQVQJCQkjIwlHZWVmdCBhbHMgcmVzdWx0YWF0IGhldCBwcm9kdWN0IHZhbiB0d2VlIG1hdHJpY2VzDQpNT0QJCQk9IFJFU1QJCQkJIyMJR2VlZnQgYWxzIHJlc3VsdGFhdCBoZXQgcmVzdGdldGFsIHZhbiBlZW4gZGVsaW5nDQpNUk9VTkQJCQk9IEFGUk9OREVOLk4uVkVFTFZPVUQJCSMjCUdlZWZ0IGFscyByZXN1bHRhYXQgZWVuIGdldGFsIGFmZ2Vyb25kIG9wIGhldCBnZXdlbnN0ZSB2ZWVsdm91ZA0KTVVMVElOT01JQUwJCT0gTVVMVElOT01JQUFMCQkJIyMJR2VlZnQgYWxzIHJlc3VsdGFhdCBkZSBtdWx0aW5vbWlhYWxjb8OrZmZpY2nDq250IHZhbiBlZW4gcmVla3MgZ2V0YWxsZW4NCk9ERAkJCT0gT05FVkVOCQkJIyMJUm9uZHQgZGUgYWJzb2x1dGUgd2FhcmRlIHZhbiBoZXQgZ2V0YWwgbmFhciBib3ZlbiBhZiBvcCBoZXQgZGljaHRzdGJpanppam5kZSBnZWhlbGUgb25ldmVuIGdldGFsDQpQSQkJCT0gUEkJCQkJIyMJR2VlZnQgYWxzIHJlc3VsdGFhdCBkZSB3YWFyZGUgdmFuIHBpDQpQT1dFUgkJCT0gTUFDSFQJCQkJIyMJVmVyaGVmdCBlZW4gZ2V0YWwgdG90IGVlbiBtYWNodA0KUFJPRFVDVAkJCT0gUFJPRFVDVAkJCSMjCVZlcm1lbmlndnVsZGlndCBkZSBhcmd1bWVudGVuIG1ldCBlbGthYXINClFVT1RJRU5UCQk9IFFVT1RJRU5UCQkJIyMJR2VlZnQgYWxzIHJlc3VsdGFhdCBkZSB1aXRrb21zdCB2YW4gZWVuIGRlbGluZyBhbHMgZ2VoZWVsIGdldGFsDQpSQURJQU5TCQkJPSBSQURJQUxFTgkJCSMjCUNvbnZlcnRlZXJ0IGdyYWRlbiBuYWFyIHJhZGlhbGVuDQpSQU5ECQkJPSBBU0VMRUNUCQkJIyMJR2VlZnQgYWxzIHJlc3VsdGFhdCBlZW4gd2lsbGVrZXVyaWcgZ2V0YWwgdHVzc2VuIDAgZW4gMQ0KUkFOREJFVFdFRU4JCT0gQVNFTEVDVFRVU1NFTgkJCSMjCUdlZWZ0IGVlbiB3aWxsZWtldXJpZyBnZXRhbCB0dXNzZW4gZGUgZ2V0YWxsZW4gZGllIHUgaGVidCBvcGdlZ2V2ZW4NClJPTUFOCQkJPSBST01FSU5TCQkJIyMJQ29udmVydGVlcnQgZWVuIEFyYWJpc2NoIGdldGFsIG5hYXIgZWVuIFJvbWVpbnMgZ2V0YWwgZW4gZ2VlZnQgaGV0IHJlc3VsdGFhdCB3ZWVyIGluIGRlIHZvcm0gdmFuIHRla3N0DQpST1VORAkJCT0gQUZST05ERU4JCQkjIwlSb25kdCBlZW4gZ2V0YWwgYWYgb3AgaGV0IG9wZ2VnZXZlbiBhYW50YWwgZGVjaW1hbGVuDQpST1VORERPV04JCT0gQUZST05ERU4uTkFBUi5CRU5FREVOCQkjIwlSb25kdCBkZSBhYnNvbHV0ZSB3YWFyZGUgdmFuIGVlbiBnZXRhbCBuYWFyIGJlbmVkZW4gYWYNClJPVU5EVVAJCQk9IEFGUk9OREVOLk5BQVIuQk9WRU4JCSMjCVJvbmR0IGRlIGFic29sdXRlIHdhYXJkZSB2YW4gZWVuIGdldGFsIG5hYXIgYm92ZW4gYWYNClNFUklFU1NVTQkJPSBTT00uTUFDSFRSRUVLUwkJIyMJR2VlZnQgYWxzIHJlc3VsdGFhdCBkZSBzb20gdmFuIGVlbiBtYWNodHJlZWtzIGRpZSBpcyBnZWJhc2VlcmQgb3AgZGUgZm9ybXVsZQ0KU0lHTgkJCT0gUE9TLk5FRwkJCSMjCUdlZWZ0IGFscyByZXN1bHRhYXQgaGV0IHRla2VuIHZhbiBlZW4gZ2V0YWwNClNJTgkJCT0gU0lOCQkJCSMjCUdlZWZ0IGFscyByZXN1bHRhYXQgZGUgc2ludXMgdmFuIGRlIG9wZ2VnZXZlbiBob2VrDQpTSU5ICQkJPSBTSU5ICQkJCSMjCUdlZWZ0IGFscyByZXN1bHRhYXQgZGUgc2ludXMgaHlwZXJib2xpY3VzIHZhbiBlZW4gZ2V0YWwNClNRUlQJCQk9IFdPUlRFTAkJCSMjCUdlZWZ0IGFscyByZXN1bHRhYXQgZGUgcG9zaXRpZXZlIHZpZXJrYW50c3dvcnRlbCB2YW4gZWVuIGdldGFsDQpTUVJUUEkJCQk9IFdPUlRFTC5QSQkJCSMjCUdlZWZ0IGFscyByZXN1bHRhYXQgZGUgdmllcmthbnRzd29ydGVsIHZhbiAoZ2V0YWwgKiBwaSkNClNVQlRPVEFMCQk9IFNVQlRPVEFBTAkJCSMjCUdlZWZ0IGFscyByZXN1bHRhYXQgZWVuIHN1YnRvdGFhbCB2b29yIGVlbiBiZXJlaWsNClNVTQkJCT0gU09NCQkJCSMjCVRlbHQgZGUgYXJndW1lbnRlbiBvcA0KU1VNSUYJCQk9IFNPTS5BTFMJCQkjIwlUZWx0IGRlIGdldGFsbGVuIGJpaiBlbGthYXIgb3AgZGllIHZvbGRvZW4gYWFuIGVlbiBiZXBhYWxkIGNyaXRlcml1bQ0KU1VNSUZTCQkJPSBTT01NRU4uQUxTCQkJIyMJVGVsdCBkZSBjZWxsZW4gaW4gZWVuIGJlcmVpayBvcCBkaWUgYWFuIG1lZXJkZXJlIGNyaXRlcmlhIHZvbGRvZW4NClNVTVBST0RVQ1QJCT0gU09NUFJPRFVDVAkJCSMjCUdlZWZ0IGFscyByZXN1bHRhYXQgZGUgc29tIHZhbiBkZSBwcm9kdWN0ZW4gdmFuIGRlIGNvcnJlc3BvbmRlcmVuZGUgbWF0cml4ZWxlbWVudGVuDQpTVU1TUQkJCT0gS1dBRFJBVEVOU09NCQkJIyMJR2VlZnQgYWxzIHJlc3VsdGFhdCBkZSBzb20gdmFuIGRlIGt3YWRyYXRlbiB2YW4gZGUgYXJndW1lbnRlbg0KU1VNWDJNWTIJCT0gU09NLlgyTUlOWTIJCQkjIwlHZWVmdCBhbHMgcmVzdWx0YWF0IGRlIHNvbSB2YW4gaGV0IHZlcnNjaGlsIHR1c3NlbiBkZSBrd2FkcmF0ZW4gdmFuIGNvcnJlc3BvbmRlcmVuZGUgd2FhcmRlbiBpbiB0d2VlIG1hdHJpY2VzDQpTVU1YMlBZMgkJPSBTT00uWDJQTFVTWTIJCQkjIwlHZWVmdCBhbHMgcmVzdWx0YWF0IGRlIHNvbSB2YW4gZGUga3dhZHJhdGVuc29tIHZhbiBjb3JyZXNwb25kZXJlbmRlIHdhYXJkZW4gaW4gdHdlZSBtYXRyaWNlcw0KU1VNWE1ZMgkJCT0gU09NLlhNSU5ZLjIJCQkjIwlHZWVmdCBhbHMgcmVzdWx0YWF0IGRlIHNvbSB2YW4gZGUga3dhZHJhdGVuIHZhbiBkZSB2ZXJzY2hpbGxlbiB0dXNzZW4gZGUgY29ycmVzcG9uZGVyZW5kZSB3YWFyZGVuIGluIHR3ZWUgbWF0cmljZXMNClRBTgkJCT0gVEFOCQkJCSMjCUdlZWZ0IGFscyByZXN1bHRhYXQgZGUgdGFuZ2VucyB2YW4gZWVuIGdldGFsDQpUQU5ICQkJPSBUQU5ICQkJCSMjCUdlZWZ0IGFscyByZXN1bHRhYXQgZGUgdGFuZ2VucyBoeXBlcmJvbGljdXMgdmFuIGVlbiBnZXRhbA0KVFJVTkMJCQk9IEdFSEVFTAkJCSMjCUthcHQgZWVuIGdldGFsIGFmIHRvdCBlZW4gZ2VoZWVsIGdldGFsDQoNCg0KIyMNCiMjCVN0YXRpc3RpY2FsIGZ1bmN0aW9ucwkJCQlTdGF0aXN0aXNjaGUgZnVuY3RpZXMNCiMjDQpBVkVERVYJCQk9IEdFTS5ERVZJQVRJRQkJCSMjCUdlZWZ0IGFscyByZXN1bHRhYXQgaGV0IGdlbWlkZGVsZGUgdmFuIGRlIGFic29sdXRlIGRldmlhdGllcyB2YW4gZ2VnZXZlbnNwdW50ZW4gdGVuIG9wemljaHRlIHZhbiBodW4gZ2VtaWRkZWxkZSB3YWFyZGUNCkFWRVJBR0UJCQk9IEdFTUlEREVMREUJCQkjIwlHZWVmdCBhbHMgcmVzdWx0YWF0IGhldCBnZW1pZGRlbGRlIHZhbiBkZSBhcmd1bWVudGVuDQpBVkVSQUdFQQkJPSBHRU1JRERFTERFQQkJCSMjCUdlZWZ0IGFscyByZXN1bHRhYXQgaGV0IGdlbWlkZGVsZGUgdmFuIGRlIGFyZ3VtZW50ZW4sIGluY2x1c2llZiBnZXRhbGxlbiwgdGVrc3QgZW4gbG9naXNjaGUgd2FhcmRlbg0KQVZFUkFHRUlGCQk9IEdFTUlEREVMREUuQUxTCQkjIwlHZWVmdCBoZXQgZ2VtaWRkZWxkZSAocmVrZW5rdW5kaWcgZ2VtaWRkZWxkZSkgYWxzIHJlc3VsdGFhdCB2YW4gYWxsZSBjZWxsZW4gaW4gZWVuIGJlcmVpayBkaWUgdm9sZG9lbiBhYW4gZGUgb3BnZWdldmVuIGNyaXRlcmlhDQpBVkVSQUdFSUZTCQk9IEdFTUlEREVMREVOLkFMUwkJIyMJR2VlZnQgaGV0IGdlbWlkZGVsZGUgKHJla2Vua3VuZGlnIGdlbWlkZGVsZGUpIGFscyByZXN1bHRhYXQgdmFuIGFsbGUgY2VsbGVuIGRpZSBhYW4gbWVlcmRlcmUgY3JpdGVyaWEgdm9sZG9lbg0KQkVUQURJU1QJCT0gQkVUQS5WRVJECQkJIyMJR2VlZnQgYWxzIHJlc3VsdGFhdCBkZSBjdW11bGF0aWV2ZSBiw6h0YS12ZXJkZWxpbmdzZnVuY3RpZQ0KQkVUQUlOVgkJCT0gQkVUQS5JTlYJCQkjIwlHZWVmdCBhbHMgcmVzdWx0YWF0IGRlIGludmVyc2UgdmFuIGRlIGN1bXVsYXRpZXZlIHZlcmRlbGluZ3NmdW5jdGllIHZvb3IgZWVuIGdlZ2V2ZW4gYsOodGEtdmVyZGVsaW5nDQpCSU5PTURJU1QJCT0gQklOT01JQUxFLlZFUkQJCSMjCUdlZWZ0IGFscyByZXN1bHRhYXQgZGUgYmlub21pYWxlIHZlcmRlbGluZw0KQ0hJRElTVAkJCT0gQ0hJLktXQURSQUFUCQkJIyMJR2VlZnQgYWxzIHJlc3VsdGFhdCBkZSBlZW56aWpkaWdlIGthbnMgdmFuIGRlIGNoaS1rd2FkcmFhdHZlcmRlbGluZw0KQ0hJSU5WCQkJPSBDSEkuS1dBRFJBQVQuSU5WCQkjIwlHZWVmdCBhbHMgcmVzdWx0YWF0IGRlIGludmVyc2UgdmFuIGVlbiBlZW56aWpkaWdlIGthbnMgdmFuIGRlIGNoaS1rd2FkcmFhdHZlcmRlbGluZw0KQ0hJVEVTVAkJCT0gQ0hJLlRPRVRTCQkJIyMJR2VlZnQgYWxzIHJlc3VsdGFhdCBkZSBvbmFmaGFua2VsaWpraGVpZHN0b2V0cw0KQ09ORklERU5DRQkJPSBCRVRST1VXQkFBUkhFSUQJCSMjCUdlZWZ0IGFscyByZXN1bHRhYXQgaGV0IGJldHJvdXdiYWFyaGVpZHNpbnRlcnZhbCB2YW4gZWVuIGdlbWlkZGVsZGUgd2FhcmRlIHZvb3IgZGUgZWxlbWVudGVuIHZhbiBlZW4gcG9wdWxhdGllDQpDT1JSRUwJCQk9IENPUlJFTEFUSUUJCQkjIwlHZWVmdCBhbHMgcmVzdWx0YWF0IGRlIGNvcnJlbGF0aWVjb8OrZmZpY2nDq250IHZhbiB0d2VlIGdlZ2V2ZW5zdmVyemFtZWxpbmdlbg0KQ09VTlQJCQk9IEFBTlRBTAkJCSMjCVRlbHQgaGV0IGFhbnRhbCBnZXRhbGxlbiBpbiBkZSBhcmd1bWVudGVubGlqc3QNCkNPVU5UQQkJCT0gQUFOVEFMQVJHCQkJIyMJVGVsdCBoZXQgYWFudGFsIHdhYXJkZW4gaW4gZGUgYXJndW1lbnRlbmxpanN0DQpDT1VOVEJMQU5LCQk9IEFBTlRBTC5MRUdFLkNFTExFTgkJIyMJVGVsdCBoZXQgYWFudGFsIGxlZ2UgY2VsbGVuIGluIGVlbiBiZXJlaWsNCkNPVU5USUYJCQk9IEFBTlRBTC5BTFMJCQkjIwlUZWx0IGluIGVlbiBiZXJlaWsgaGV0IGFhbnRhbCBjZWxsZW4gZGllIHZvbGRvZW4gYWFuIGVlbiBiZXBhYWxkIGNyaXRlcml1bQ0KQ09VTlRJRlMJCT0gQUFOVEFMTEVOLkFMUwkJCSMjCVRlbHQgaW4gZWVuIGJlcmVpayBoZXQgYWFudGFsIGNlbGxlbiBkaWUgdm9sZG9lbiBhYW4gbWVlcmRlcmUgY3JpdGVyaWENCkNPVkFSCQkJPSBDT1ZBUklBTlRJRQkJCSMjCUdlZWZ0IGFscyByZXN1bHRhYXQgZGUgY292YXJpYW50aWUsIGhldCBnZW1pZGRlbGRlIHZhbiBkZSBwcm9kdWN0ZW4gdmFuIGRlIGdlcGFhcmRlIGRldmlhdGllcw0KQ1JJVEJJTk9NCQk9IENSSVQuQklOT00JCQkjIwlHZWVmdCBhbHMgcmVzdWx0YWF0IGRlIGtsZWluc3RlIHdhYXJkZSB3YWFydm9vciBkZSBiaW5vbWlhbGUgdmVyZGVsaW5nIGtsZWluZXIgaXMgZGFuIG9mIGdlbGlqayBpcyBhYW4gaGV0IGNyaXRlcml1bQ0KREVWU1EJCQk9IERFVi5LV0FECQkJIyMJR2VlZnQgYWxzIHJlc3VsdGFhdCBkZSBzb20gdmFuIGRlIGRldmlhdGllcyBpbiBoZXQga3dhZHJhYXQNCkVYUE9ORElTVAkJPSBFWFBPTi5WRVJECQkJIyMJR2VlZnQgYWxzIHJlc3VsdGFhdCBkZSBleHBvbmVudGnDq2xlIHZlcmRlbGluZw0KRkRJU1QJCQk9IEYuVkVSREVMSU5HCQkJIyMJR2VlZnQgYWxzIHJlc3VsdGFhdCBkZSBGLXZlcmRlbGluZw0KRklOVgkJCT0gRi5JTlZFUlNFCQkJIyMJR2VlZnQgYWxzIHJlc3VsdGFhdCBkZSBpbnZlcnNlIHZhbiBkZSBGLXZlcmRlbGluZw0KRklTSEVSCQkJPSBGSVNIRVIJCQkjIwlHZWVmdCBhbHMgcmVzdWx0YWF0IGRlIEZpc2hlci10cmFuc2Zvcm1hdGllDQpGSVNIRVJJTlYJCT0gRklTSEVSLklOVgkJCSMjCUdlZWZ0IGFscyByZXN1bHRhYXQgZGUgaW52ZXJzZSB2YW4gZGUgRmlzaGVyLXRyYW5zZm9ybWF0aWUNCkZPUkVDQVNUCQk9IFZPT1JTUEVMTEVOCQkJIyMJR2VlZnQgYWxzIHJlc3VsdGFhdCBlZW4gd2FhcmRlIG9wIGJhc2lzIHZhbiBlZW4gbGluZWFpcmUgdHJlbmQNCkZSRVFVRU5DWQkJPSBGUkVRVUVOVElFCQkJIyMJR2VlZnQgYWxzIHJlc3VsdGFhdCBlZW4gZnJlcXVlbnRpZXZlcmRlbGluZyBpbiBkZSB2b3JtIHZhbiBlZW4gdmVydGljYWxlIG1hdHJpeA0KRlRFU1QJCQk9IEYuVE9FVFMJCQkjIwlHZWVmdCBhbHMgcmVzdWx0YWF0IGVlbiBGLXRvZXRzDQpHQU1NQURJU1QJCT0gR0FNTUEuVkVSRAkJCSMjCUdlZWZ0IGFscyByZXN1bHRhYXQgZGUgZ2FtbWEtdmVyZGVsaW5nDQpHQU1NQUlOVgkJPSBHQU1NQS5JTlYJCQkjIwlHZWVmdCBhbHMgcmVzdWx0YWF0IGRlIGludmVyc2UgdmFuIGRlIGN1bXVsYXRpZXZlIGdhbW1hLXZlcmRlbGluZw0KR0FNTUFMTgkJCT0gR0FNTUEuTE4JCQkjIwlHZWVmdCBhbHMgcmVzdWx0YWF0IGRlIG5hdHV1cmxpamtlIGxvZ2FyaXRtZSB2YW4gZGUgZ2FtbWEtZnVuY3RpZSwgRyh4KQ0KR0VPTUVBTgkJCT0gTUVFVEsuR0VNCQkJIyMJR2VlZnQgYWxzIHJlc3VsdGFhdCBoZXQgbWVldGt1bmRpZ2UgZ2VtaWRkZWxkZQ0KR1JPV1RICQkJPSBHUk9FSQkJCQkjIwlHZWVmdCBhbHMgcmVzdWx0YWF0IGRlIHdhYXJkZW4gdm9vciBlZW4gZXhwb25lbnRpw6tsZSB0cmVuZA0KSEFSTUVBTgkJCT0gSEFSTS5HRU0JCQkjIwlHZWVmdCBhbHMgcmVzdWx0YWF0IGhldCBoYXJtb25pc2NoZSBnZW1pZGRlbGRlDQpIWVBHRU9NRElTVAkJPSBIWVBFUkdFTy5WRVJECQkJIyMJR2VlZnQgYWxzIHJlc3VsdGFhdCBkZSBoeXBlcmdlb21ldHJpc2NoZSB2ZXJkZWxpbmcNCklOVEVSQ0VQVAkJPSBTTklKUFVOVAkJCSMjCUdlZWZ0IGFscyByZXN1bHRhYXQgaGV0IHNuaWpwdW50IHZhbiBkZSBsaW5lYWlyZSByZWdyZXNzaWVsaWpuIG1ldCBkZSB5LWFzDQpLVVJUCQkJPSBLVVJUT1NJUwkJCSMjCUdlZWZ0IGFscyByZXN1bHRhYXQgZGUga3VydG9zaXMgdmFuIGVlbiBnZWdldmVuc3ZlcnphbWVsaW5nDQpMQVJHRQkJCT0gR1JPT1RTVEUJCQkjIwlHZWVmdCBhbHMgcmVzdWx0YWF0IGRlIG9wIGstMSBuYSBncm9vdHN0ZSB3YWFyZGUgaW4gZWVuIGdlZ2V2ZW5zdmVyemFtZWxpbmcNCkxJTkVTVAkJCT0gTElKTlNDSAkJCSMjCUdlZWZ0IGFscyByZXN1bHRhYXQgZGUgcGFyYW1ldGVycyB2YW4gZWVuIGxpbmVhaXJlIHRyZW5kDQpMT0dFU1QJCQk9IExPR1NDSAkJCSMjCUdlZWZ0IGFscyByZXN1bHRhYXQgZGUgcGFyYW1ldGVycyB2YW4gZWVuIGV4cG9uZW50acOrbGUgdHJlbmQNCkxPR0lOVgkJCT0gTE9HLk5PUk0uSU5WCQkJIyMJR2VlZnQgYWxzIHJlc3VsdGFhdCBkZSBpbnZlcnNlIHZhbiBkZSBsb2dhcml0bWlzY2hlIG5vcm1hbGUgdmVyZGVsaW5nDQpMT0dOT1JNRElTVAkJPSBMT0cuTk9STS5WRVJECQkJIyMJR2VlZnQgYWxzIHJlc3VsdGFhdCBkZSBjdW11bGF0aWV2ZSBsb2dhcml0bWlzY2hlIG5vcm1hbGUgdmVyZGVsaW5nDQpNQVgJCQk9IE1BWAkJCQkjIwlHZWVmdCBhbHMgcmVzdWx0YWF0IGRlIG1heGltdW13YWFyZGUgaW4gZWVuIGxpanN0IG1ldCBhcmd1bWVudGVuDQpNQVhBCQkJPSBNQVhBCQkJCSMjCUdlZWZ0IGFscyByZXN1bHRhYXQgZGUgbWF4aW11bXdhYXJkZSBpbiBlZW4gbGlqc3QgbWV0IGFyZ3VtZW50ZW4sIGluY2x1c2llZiBnZXRhbGxlbiwgdGVrc3QgZW4gbG9naXNjaGUgd2FhcmRlbg0KTUVESUFOCQkJPSBNRURJQUFOCQkJIyMJR2VlZnQgYWxzIHJlc3VsdGFhdCBkZSBtZWRpYWFuIHZhbiBkZSBvcGdlZ2V2ZW4gZ2V0YWxsZW4NCk1JTgkJCT0gTUlOCQkJCSMjCUdlZWZ0IGFscyByZXN1bHRhYXQgZGUgbWluaW11bXdhYXJkZSBpbiBlZW4gbGlqc3QgbWV0IGFyZ3VtZW50ZW4NCk1JTkEJCQk9IE1JTkEJCQkJIyMJR2VlZnQgYWxzIHJlc3VsdGFhdCBkZSBtaW5pbXVtd2FhcmRlIGluIGVlbiBsaWpzdCBtZXQgYXJndW1lbnRlbiwgaW5jbHVzaWVmIGdldGFsbGVuLCB0ZWtzdCBlbiBsb2dpc2NoZSB3YWFyZGVuDQpNT0RFCQkJPSBNT0RVUwkJCQkjIwlHZWVmdCBhbHMgcmVzdWx0YWF0IGRlIG1lZXN0IHZvb3Jrb21lbmRlIHdhYXJkZSBpbiBlZW4gZ2VnZXZlbnN2ZXJ6YW1lbGluZw0KTkVHQklOT01ESVNUCQk9IE5FRy5CSU5PTS5WRVJECQkjIwlHZWVmdCBhbHMgcmVzdWx0YWF0IGRlIG5lZ2F0aWV2ZSBiaW5vbWlhYWx2ZXJkZWxpbmcNCk5PUk1ESVNUCQk9IE5PUk0uVkVSRAkJCSMjCUdlZWZ0IGFscyByZXN1bHRhYXQgZGUgY3VtdWxhdGlldmUgbm9ybWFsZSB2ZXJkZWxpbmcNCk5PUk1JTlYJCQk9IE5PUk0uSU5WCQkJIyMJR2VlZnQgYWxzIHJlc3VsdGFhdCBkZSBpbnZlcnNlIHZhbiBkZSBjdW11bGF0aWV2ZSBzdGFuZGFhcmRub3JtYWxlIHZlcmRlbGluZw0KTk9STVNESVNUCQk9IFNUQU5ELk5PUk0uVkVSRAkJIyMJR2VlZnQgYWxzIHJlc3VsdGFhdCBkZSBjdW11bGF0aWV2ZSBzdGFuZGFhcmRub3JtYWxlIHZlcmRlbGluZw0KTk9STVNJTlYJCT0gU1RBTkQuTk9STS5JTlYJCSMjCUdlZWZ0IGFscyByZXN1bHRhYXQgZGUgaW52ZXJzZSB2YW4gZGUgY3VtdWxhdGlldmUgbm9ybWFsZSB2ZXJkZWxpbmcNClBFQVJTT04JCQk9IFBFQVJTT04JCQkjIwlHZWVmdCBhbHMgcmVzdWx0YWF0IGRlIGNvcnJlbGF0aWVjb8OrZmZpY2nDq250IHZhbiBQZWFyc29uDQpQRVJDRU5USUxFCQk9IFBFUkNFTlRJRUwJCQkjIwlHZWVmdCBhbHMgcmVzdWx0YWF0IGhldCBrLWRlIHBlcmNlbnRpZWwgdmFuIHdhYXJkZW4gaW4gZWVuIGJlcmVpaw0KUEVSQ0VOVFJBTksJCT0gUEVSQ0VOVC5SQU5HCQkJIyMJR2VlZnQgYWxzIHJlc3VsdGFhdCBkZSBwb3NpdGllLCBpbiBwcm9jZW50ZW4gdWl0Z2VkcnVrdCwgdmFuIGVlbiB3YWFyZGUgaW4gZGUgcmFuZ29yZGUgdmFuIGVlbiBnZWdldmVuc3ZlcnphbWVsaW5nDQpQRVJNVVQJCQk9IFBFUk1VVEFUSUVTCQkJIyMJR2VlZnQgYWxzIHJlc3VsdGFhdCBoZXQgYWFudGFsIHBlcm11dGF0aWVzIHZvb3IgZWVuIGdlZ2V2ZW4gYWFudGFsIG9iamVjdGVuDQpQT0lTU09OCQkJPSBQT0lTU09OCQkJIyMJR2VlZnQgYWxzIHJlc3VsdGFhdCBkZSBQb2lzc29uLXZlcmRlbGluZw0KUFJPQgkJCT0gS0FOUwkJCQkjIwlHZWVmdCBhbHMgcmVzdWx0YWF0IGRlIGthbnMgZGF0IHdhYXJkZW4gemljaCB0dXNzZW4gdHdlZSBncmVuemVuIGJldmluZGVuDQpRVUFSVElMRQkJPSBLV0FSVElFTAkJCSMjCUdlZWZ0IGFscyByZXN1bHRhYXQgaGV0IGt3YXJ0aWVsIHZhbiBlZW4gZ2VnZXZlbnN2ZXJ6YW1lbGluZw0KUkFOSwkJCT0gUkFORwkJCQkjIwlHZWVmdCBhbHMgcmVzdWx0YWF0IGhldCByYW5nbnVtbWVyIHZhbiBlZW4gZ2V0YWwgaW4gZWVuIGxpanN0IGdldGFsbGVuDQpSU1EJCQk9IFIuS1dBRFJBQVQJCQkjIwlHZWVmdCBhbHMgcmVzdWx0YWF0IGhldCBrd2FkcmFhdCB2YW4gZGUgUGVhcnNvbi1jb3JyZWxhdGllY2/Dq2ZmaWNpw6tudA0KU0tFVwkJCT0gU0NIRUVGSEVJRAkJCSMjCUdlZWZ0IGFscyByZXN1bHRhYXQgZGUgbWF0ZSB2YW4gYXN5bW1ldHJpZSB2YW4gZWVuIHZlcmRlbGluZw0KU0xPUEUJCQk9IFJJQ0hUSU5HCQkJIyMJR2VlZnQgYWxzIHJlc3VsdGFhdCBkZSByaWNodGluZ3Njb8OrZmZpY2nDq250IHZhbiBlZW4gbGluZWFpcmUgcmVncmVzc2llbGlqbg0KU01BTEwJCQk9IEtMRUlOU1RFCQkJIyMJR2VlZnQgYWxzIHJlc3VsdGFhdCBkZSBvcCBrLTEgbmEga2xlaW5zdGUgd2FhcmRlIGluIGVlbiBnZWdldmVuc3ZlcnphbWVsaW5nDQpTVEFOREFSRElaRQkJPSBOT1JNQUxJU0VSRU4JCQkjIwlHZWVmdCBhbHMgcmVzdWx0YWF0IGVlbiBnZW5vcm1hbGlzZWVyZGUgd2FhcmRlDQpTVERFVgkJCT0gU1RERVYJCQkJIyMJTWFha3QgZWVuIHNjaGF0dGluZyB2YW4gZGUgc3RhbmRhYXJkZGV2aWF0aWUgb3AgYmFzaXMgdmFuIGVlbiBzdGVla3Byb2VmDQpTVERFVkEJCQk9IFNUREVWQQkJCSMjCU1hYWt0IGVlbiBzY2hhdHRpbmcgdmFuIGRlIHN0YW5kYWFyZGRldmlhdGllIG9wIGJhc2lzIHZhbiBlZW4gc3RlZWtwcm9lZiwgaW5jbHVzaWVmIGdldGFsbGVuLCB0ZWtzdCBlbiBsb2dpc2NoZSB3YWFyZGVuDQpTVERFVlAJCQk9IFNUREVWUAkJCSMjCUJlcmVrZW50IGRlIHN0YW5kYWFyZGRldmlhdGllIG9wIGJhc2lzIHZhbiBkZSB2b2xsZWRpZ2UgcG9wdWxhdGllDQpTVERFVlBBCQkJPSBTVERFVlBBCQkJIyMJQmVyZWtlbnQgZGUgc3RhbmRhYXJkZGV2aWF0aWUgb3AgYmFzaXMgdmFuIGRlIHZvbGxlZGlnZSBwb3B1bGF0aWUsIGluY2x1c2llZiBnZXRhbGxlbiwgdGVrc3QgZW4gbG9naXNjaGUgd2FhcmRlbg0KU1RFWVgJCQk9IFNUQU5ELkZPVVQuWVgJCQkjIwlHZWVmdCBhbHMgcmVzdWx0YWF0IGRlIHN0YW5kYWFyZGZvdXQgaW4gZGUgdm9vcnNwZWxkZSB5LXdhYXJkZSB2b29yIGVsa2UgeCBpbiBlZW4gcmVncmVzc2llDQpURElTVAkJCT0gVC5WRVJECQkJIyMJR2VlZnQgYWxzIHJlc3VsdGFhdCBkZSBTdHVkZW50IFQtdmVyZGVsaW5nDQpUSU5WCQkJPSBULklOVgkJCQkjIwlHZWVmdCBhbHMgcmVzdWx0YWF0IGRlIGludmVyc2UgdmFuIGRlIFN0dWRlbnQgVC12ZXJkZWxpbmcNClRSRU5ECQkJPSBUUkVORAkJCQkjIwlHZWVmdCBhbHMgcmVzdWx0YWF0IGRlIHdhYXJkZW4gdm9vciBlZW4gbGluZWFpcmUgdHJlbmQNClRSSU1NRUFOCQk9IEdFVFJJTUQuR0VNCQkJIyMJR2VlZnQgYWxzIHJlc3VsdGFhdCBoZXQgZ2VtaWRkZWxkZSB2YW4gd2FhcmRlbiBpbiBlZW4gZ2VnZXZlbnN2ZXJ6YW1lbGluZw0KVFRFU1QJCQk9IFQuVE9FVFMJCQkjIwlHZWVmdCBhbHMgcmVzdWx0YWF0IGRlIGthbnMgbWV0IGJlaHVscCB2YW4gZGUgU3R1ZGVudCBULXRvZXRzDQpWQVIJCQk9IFZBUgkJCQkjIwlNYWFrdCBlZW4gc2NoYXR0aW5nIHZhbiBkZSB2YXJpYW50aWUgb3AgYmFzaXMgdmFuIGVlbiBzdGVla3Byb2VmDQpWQVJBCQkJPSBWQVJBCQkJCSMjCU1hYWt0IGVlbiBzY2hhdHRpbmcgdmFuIGRlIHZhcmlhbnRpZSBvcCBiYXNpcyB2YW4gZWVuIHN0ZWVrcHJvZWYsIGluY2x1c2llZiBnZXRhbGxlbiwgdGVrc3QgZW4gbG9naXNjaGUgd2FhcmRlbg0KVkFSUAkJCT0gVkFSUAkJCQkjIwlCZXJla2VudCBkZSB2YXJpYW50aWUgb3AgYmFzaXMgdmFuIGRlIHZvbGxlZGlnZSBwb3B1bGF0aWUNClZBUlBBCQkJPSBWQVJQQQkJCQkjIwlCZXJla2VudCBkZSBzdGFuZGFhcmRkZXZpYXRpZSBvcCBiYXNpcyB2YW4gZGUgdm9sbGVkaWdlIHBvcHVsYXRpZSwgaW5jbHVzaWVmIGdldGFsbGVuLCB0ZWtzdCBlbiBsb2dpc2NoZSB3YWFyZGVuDQpXRUlCVUxMCQkJPSBXRUlCVUxMCQkJIyMJR2VlZnQgYWxzIHJlc3VsdGFhdCBkZSBXZWlidWxsLXZlcmRlbGluZw0KWlRFU1QJCQk9IFouVE9FVFMJCQkjIwlHZWVmdCBhbHMgcmVzdWx0YWF0IGRlIGVlbnppamRpZ2Uga2Fuc3dhYXJkZSB2YW4gZWVuIFotdG9ldHMNCg0KDQojIw0KIyMJVGV4dCBmdW5jdGlvbnMJCQkJCVRla3N0ZnVuY3RpZXMNCiMjDQpBU0MJCQk9IEFTQwkJCQkjIwlXaWp6aWd0IE5lZGVybGFuZHNlIGxldHRlcnMgb2Yga2F0YWthbmF0ZWtlbnMgb3ZlciBkZSB2b2xsZSBicmVlZHRlIChkdWJiZWwtYnl0ZXRla2VucykgYmlubmVuIGVlbiB0ZWtlbnJlZWtzIGluIHRla2VucyBvdmVyIGRlIGhhbHZlIGJyZWVkdGUgKGVua2VsLWJ5dGV0ZWtlbnMpDQpCQUhUVEVYVAkJPSBCQUhULlRFS1NUCQkJIyMJQ29udmVydGVlcnQgZWVuIGdldGFsIG5hYXIgdGVrc3QgbWV0IGRlIHZhbHV0YW5vdGF0aWUgw58gKGJhaHQpDQpDSEFSCQkJPSBURUtFTgkJCQkjIwlHZWVmdCBhbHMgcmVzdWx0YWF0IGhldCB0ZWtlbiBkYXQgaG9vcnQgYmlqIGRlIG9wZ2VnZXZlbiBjb2RlDQpDTEVBTgkJCT0gV0lTU0VOLkNPTlRST0wJCSMjCVZlcndpamRlcnQgYWxsZSBuaWV0LWFmZHJ1a2JhcmUgdGVrZW5zIHVpdCBlZW4gdGVrc3QNCkNPREUJCQk9IENPREUJCQkJIyMJR2VlZnQgYWxzIHJlc3VsdGFhdCBkZSBudW1lcmlla2UgY29kZSB2b29yIGhldCBlZXJzdGUgdGVrZW4gaW4gZWVuIHRla2VucmVla3MNCkNPTkNBVEVOQVRFCQk9IFRFS1NULlNBTUVOVk9FR0VOCQkjIwlWb2VndCB2ZXJzY2hpbGxlbmRlIHRla3N0ZnJhZ21lbnRlbiBzYW1lbiB0b3Qgw6nDqW4gdGVrc3RmcmFnbWVudA0KRE9MTEFSCQkJPSBFVVJPCQkJCSMjCUNvbnZlcnRlZXJ0IGVlbiBnZXRhbCBuYWFyIHRla3N0IG1ldCBkZSB2YWx1dGFub3RhdGllIOKCrCAoZXVybykNCkVYQUNUCQkJPSBHRUxJSksJCQkjIwlDb250cm9sZWVydCBvZiB0d2VlIHRla2VucmVla3NlbiBpZGVudGllayB6aWpuDQpGSU5ECQkJPSBWSU5ELkFMTEVTCQkJIyMJWm9la3QgZWVuIGJlcGFhbGRlIHRla2VucmVla3MgaW4gZWVuIHRla3N0ICh3YWFyYmlqIG9uZGVyc2NoZWlkIHdvcmR0IGdlbWFha3QgdHVzc2VuIGhvb2ZkbGV0dGVycyBlbiBrbGVpbmUgbGV0dGVycykNCkZJTkRCCQkJPSBWSU5ELkFMTEVTLkIJCQkjIwlab2VrdCBlZW4gYmVwYWFsZGUgdGVrZW5yZWVrcyBpbiBlZW4gdGVrc3QgKHdhYXJiaWogb25kZXJzY2hlaWQgd29yZHQgZ2VtYWFrdCB0dXNzZW4gaG9vZmRsZXR0ZXJzIGVuIGtsZWluZSBsZXR0ZXJzKQ0KRklYRUQJCQk9IFZBU1QJCQkJIyMJTWFha3QgZWVuIGdldGFsIGFscyB0ZWtzdCBtZXQgZWVuIHZhc3QgYWFudGFsIGRlY2ltYWxlbiBvcA0KSklTCQkJPSBKSVMJCQkJIyMJV2lqemlndCBOZWRlcmxhbmRzZSBsZXR0ZXJzIG9mIGthdGFrYW5hdGVrZW5zIG92ZXIgZGUgaGFsdmUgYnJlZWR0ZSAoZW5rZWwtYnl0ZXRla2VucykgYmlubmVuIGVlbiB0ZWtlbnJlZWtzIGluIHRla2VucyBvdmVyIGRlIHZvbGxlIGJyZWVkdGUgKGR1YmJlbC1ieXRldGVrZW5zKQ0KTEVGVAkJCT0gTElOS1MJCQkJIyMJR2VlZnQgYWxzIHJlc3VsdGFhdCBkZSBtZWVzdCBsaW5rc2UgdGVrZW5zIGluIGVlbiB0ZWtlbnJlZWtzDQpMRUZUQgkJCT0gTElOS1NCCQkJIyMJR2VlZnQgYWxzIHJlc3VsdGFhdCBkZSBtZWVzdCBsaW5rc2UgdGVrZW5zIGluIGVlbiB0ZWtlbnJlZWtzDQpMRU4JCQk9IExFTkdURQkJCSMjCUdlZWZ0IGFscyByZXN1bHRhYXQgaGV0IGFhbnRhbCB0ZWtlbnMgaW4gZWVuIHRla2VucmVla3MNCkxFTkIJCQk9IExFTkdURUIJCQkjIwlHZWVmdCBhbHMgcmVzdWx0YWF0IGhldCBhYW50YWwgdGVrZW5zIGluIGVlbiB0ZWtlbnJlZWtzDQpMT1dFUgkJCT0gS0xFSU5FLkxFVFRFUlMJCSMjCVpldCB0ZWtzdCBvbSBpbiBrbGVpbmUgbGV0dGVycw0KTUlECQkJPSBNSURERU4JCQkjIwlHZWVmdCBhbHMgcmVzdWx0YWF0IGVlbiBiZXBhYWxkIGFhbnRhbCB0ZWtlbnMgdmFuIGVlbiB0ZWtlbnJlZWtzIHZhbmFmIGRlIHBvc2l0aWUgZGllIHUgb3BnZWVmdA0KTUlEQgkJCT0gREVFTEIJCQkJIyMJR2VlZnQgYWxzIHJlc3VsdGFhdCBlZW4gYmVwYWFsZCBhYW50YWwgdGVrZW5zIHZhbiBlZW4gdGVrZW5yZWVrcyB2YW5hZiBkZSBwb3NpdGllIGRpZSB1IG9wZ2VlZnQNClBIT05FVElDCQk9IEZPTkVUSVNDSAkJCSMjCUhhYWx0IGRlIGZvbmV0aXNjaGUgdGVrZW5zIChmdXJpZ2FuYSkgdWl0IGVlbiB0ZWtlbnJlZWtzIG9wDQpQUk9QRVIJCQk9IEJFR0lOTEVUVEVSUwkJCSMjCVpldCBkZSBlZXJzdGUgbGV0dGVyIHZhbiBlbGsgd29vcmQgaW4gZWVuIHRla3N0IG9tIGluIGVlbiBob29mZGxldHRlcg0KUkVQTEFDRQkJCT0gVkVSVkFORwkJCSMjCVZlcnZhbmd0IHRla2VucyBiaW5uZW4gZWVuIHRla3N0DQpSRVBMQUNFQgkJPSBWRVJWQU5HRU5CCQkJIyMJVmVydmFuZ3QgdGVrZW5zIGJpbm5lbiBlZW4gdGVrc3QNClJFUFQJCQk9IEhFUkhBTElORwkJCSMjCUhlcmhhYWx0IGVlbiB0ZWtzdCBlZW4gYWFudGFsIG1hbGVuDQpSSUdIVAkJCT0gUkVDSFRTCQkJIyMJR2VlZnQgYWxzIHJlc3VsdGFhdCBkZSBtZWVzdCByZWNodHNlIHRla2VucyBpbiBlZW4gdGVrZW5yZWVrcw0KUklHSFRCCQkJPSBSRUNIVFNCCQkJIyMJR2VlZnQgYWxzIHJlc3VsdGFhdCBkZSBtZWVzdCByZWNodHNlIHRla2VucyBpbiBlZW4gdGVrZW5yZWVrcw0KU0VBUkNICQkJPSBWSU5ELlNQRUMJCQkjIwlab2VrdCBlZW4gYmVwYWFsZGUgdGVrZW5yZWVrcyBpbiBlZW4gdGVrc3QgKHdhYXJiaWogZ2VlbiBvbmRlcnNjaGVpZCB3b3JkdCBnZW1hYWt0IHR1c3NlbiBob29mZGxldHRlcnMgZW4ga2xlaW5lIGxldHRlcnMpDQpTRUFSQ0hCCQkJPSBWSU5ELlNQRUMuQgkJCSMjCVpvZWt0IGVlbiBiZXBhYWxkZSB0ZWtlbnJlZWtzIGluIGVlbiB0ZWtzdCAod2FhcmJpaiBnZWVuIG9uZGVyc2NoZWlkIHdvcmR0IGdlbWFha3QgdHVzc2VuIGhvb2ZkbGV0dGVycyBlbiBrbGVpbmUgbGV0dGVycykNClNVQlNUSVRVVEUJCT0gU1VCU1RJVFVFUkVOCQkJIyMJVmVydmFuZ3Qgb3VkZSB0ZWtzdCBkb29yIG5pZXV3ZSB0ZWtzdCBpbiBlZW4gdGVrZW5yZWVrcw0KVAkJCT0gVAkJCQkjIwlDb252ZXJ0ZWVydCBkZSBhcmd1bWVudGVuIG5hYXIgdGVrc3QNClRFWFQJCQk9IFRFS1NUCQkJCSMjCU1hYWt0IGVlbiBnZXRhbCBvcCBlbiBjb252ZXJ0ZWVydCBoZXQgZ2V0YWwgbmFhciB0ZWtzdA0KVFJJTQkJCT0gU1BBVElFUy5XSVNTRU4JCSMjCVZlcndpamRlcnQgZGUgc3BhdGllcyB1aXQgZWVuIHRla3N0DQpVUFBFUgkJCT0gSE9PRkRMRVRURVJTCQkJIyMJWmV0IHRla3N0IG9tIGluIGhvb2ZkbGV0dGVycw0KVkFMVUUJCQk9IFdBQVJERQkJCSMjCUNvbnZlcnRlZXJ0IHRla3N0IG5hYXIgZWVuIGdldGFsDQo=]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/locale/no/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/locale/no/config</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[77u/IyMNCiMjIFBIUEV4Y2VsDQojIw0NCiMjIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTEgUEhQRXhjZWwNCiMjDQojIyBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yDQojIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljDQojIyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXINCiMjIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLg0KIyMNCiMjIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLA0KIyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YNCiMjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VDQojIyBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLg0KIyMNCiMjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMNCiMjIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUNCiMjIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQ0KIyMNCiMjIEBjYXRlZ29yeSAgIFBIUEV4Y2VsDQojIyBAcGFja2FnZSAgICBQSFBFeGNlbF9TZXR0aW5ncw0KIyMgQGNvcHlyaWdodCAgQ29weXJpZ2h0IChjKSAyMDA2IC0gMjAxMSBQSFBFeGNlbCAoaHR0cDovL3d3dy5jb2RlcGxleC5jb20vUEhQRXhjZWwpDQojIyBAbGljZW5zZSAgICBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvb2xkLWxpY2Vuc2VzL2xncGwtMi4xLnR4dAlMR1BMDQojIyBAdmVyc2lvbiAgICAxLjcuNywgMjAxMi0wNS0xOQ0KIyMNCiMjDQoNCg0KQXJndW1lbnRTZXBhcmF0b3IJPSA7DQoNCg0KIyMNCiMjCShGb3IgZnV0dXJlIHVzZSkNCiMjDQpjdXJyZW5jeVN5bWJvbAk9IGtyDQoNCg0KIyMNCiMjCUV4Y2VsIEVycm9yIENvZGVzCShGb3IgZnV0dXJlIHVzZSkNDQojIw0KTlVMTAk9ICNOVUxMIQ0KRElWMAk9ICNESVYvMCENClZBTFVFCT0gI1ZFUkRJIQ0KUkVGCT0gI1JFRiENCk5BTUUJPSAjTkFWTj8NCk5VTQk9ICNOVU0hDQpOQQk9ICNJL1QNCg==]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/locale/no/functions</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[77u/IyMNCiMjIFBIUEV4Y2VsDQojIw0NCiMjIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTEgUEhQRXhjZWwNCiMjDQojIyBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yDQojIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljDQojIyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXINCiMjIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLg0KIyMNCiMjIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLA0KIyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YNCiMjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VDQojIyBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLg0KIyMNCiMjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMNCiMjIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUNCiMjIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQ0KIyMNCiMjIEBjYXRlZ29yeSAgIFBIUEV4Y2VsDQojIyBAcGFja2FnZSAgICBQSFBFeGNlbF9DYWxjdWxhdGlvbg0KIyMgQGNvcHlyaWdodCAgQ29weXJpZ2h0IChjKSAyMDA2IC0gMjAxMSBQSFBFeGNlbCAoaHR0cDovL3d3dy5jb2RlcGxleC5jb20vUEhQRXhjZWwpDQojIyBAbGljZW5zZSAgICBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvb2xkLWxpY2Vuc2VzL2xncGwtMi4xLnR4dAlMR1BMDQojIyBAdmVyc2lvbiAgICAxLjcuNywgMjAxMi0wNS0xOQ0KIyMNCiMjIERhdGEgaW4gdGhpcyBmaWxlIGRlcml2ZWQgZnJvbSBodHRwOi8vd3d3LnBpdWhhLmZpL2V4Y2VsLWZ1bmN0aW9uLW5hbWUtdHJhbnNsYXRpb24vDQojIw0KIyMNCg0KDQojIw0KIyMJQWRkLWluIGFuZCBBdXRvbWF0aW9uIGZ1bmN0aW9ucwkJCQlGdW5rc2pvbmVuZSBUaWxsZWdnIG9nIEF1dG9tYXRpc2VyaW5nDQojIw0KR0VUUElWT1REQVRBCQk9IEhFTlRQSVZPVERBVEEJCQkJIyMJUmV0dXJuZXJlciBkYXRhIHNvbSBlciBsYWdyZXQgaSBlbiBwaXZvdHRhYmVsbHJhcHBvcnQNCg0KDQojIw0KIyMJQ3ViZSBmdW5jdGlvbnMJCQkJCQlLdWJlZnVua3Nqb25lcg0KIyMNCkNVQkVLUElNRU1CRVIJCT0gS1VCRUtQSU1FRExFTQkJCQkjIwlSZXR1cm5lcmVyIG5hdm5ldCwgZWdlbnNrYXBlbiBvZyBtw6VsZXQgZm9yIGVuIHZpa3RpZyB5dGVsc2VzaW5kaWthdG9yIChLUEkpLCBvZyB2aXNlciBuYXZuZXQgb2cgZWdlbnNrYXBlbiBpIGNlbGxlbi4gRW4gS1BJIGVyIGVuIG3DpWxiYXIgZW5oZXQsIGZvciBla3NlbXBlbCBtw6VuZWRsaWcgYnJ1dHRvaW5udGplbmluZyBlbGxlciBrdmFydGFsc3ZpcyBpbm50amVuaW5nIHBlciBhbnNhdHQsIG9nIGJydWtlcyB0aWwgw6Ugb3ZlcnbDpWtlIHl0ZWxzZW4gaSBlbiBvcmdhbmlzYXNqb24uDQpDVUJFTUVNQkVSCQk9IEtVQkVNRURMRU0JCQkJIyMJUmV0dXJuZXJlciBldCBtZWRsZW0gZWxsZXIgZW4gdHVwcGVsIGkgZXQga3ViZWhpZXJhcmtpLiBCcnVrZXMgdGlsIMOlIHZhbGlkZXJlIGF0IG1lZGxlbW1ldCBlbGxlciB0dXBwZWxlbiBmaW5uZXMgaSBrdWJlbi4NCkNVQkVNRU1CRVJQUk9QRVJUWQk9IEtVQkVNRURMRU1FR0VOU0tBUAkJCSMjCVJldHVybmVyZXIgdmVyZGllbiB0aWwgZW4gbWVkbGVtc2VnZW5za2FwIGkga3ViZW4uIEJydWtlcyB0aWwgw6UgdmFsaWRlcmUgYXQgZXQgbWVkbGVtc25hdm4gZmlubmVzIGkga3ViZW4sIG9nIHRpbCDDpSByZXR1cm5lcmUgZGVuIGFuZ2l0dGUgZWdlbnNrYXBlbiBmb3IgZGV0dGUgbWVkbGVtbWV0Lg0KQ1VCRVJBTktFRE1FTUJFUgk9IEtVQkVSQU5HRVJUTUVETEVNCQkJIyMJUmV0dXJuZXJlciBkZXQgbi10ZSwgZWxsZXIgcmFuZ2VydGUsIG1lZGxlbW1ldCBpIGV0IHNldHQuIEJydWtlcyB0aWwgw6UgcmV0dXJuZXJlIGV0dCBlbGxlciBmbGVyZSBlbGVtZW50ZXIgaSBldCBzZXR0LCBmb3IgZWtzZW1wZWwgZGUgMTAgYmVzdGUgc3R1ZGVudGVuZS4NCkNVQkVTRVQJCQk9IEtVQkVTRVRUCQkJCSMjCURlZmluZXJlciBldCBiZXJlZ25ldCBzZXR0IGF2IG1lZGxlbW1lciBlbGxlciB0dXBwZWxlciB2ZWQgw6Ugc2VuZGUgZXQgc2V0dHV0dHJ5a2sgdGlsIGt1YmVuIHDDpSBzZXJ2ZXJlbiwgbm9lIHNvbSBvcHByZXR0ZXIgc2V0dGV0IG9nIGRlcmV0dGVyIHJldHVybmVyZXIgZGV0dGUgc2V0dGV0IHRpbCBNaWNyb3NvZnQgT2ZmaWNlIEV4Y2VsLg0KQ1VCRVNFVENPVU5UCQk9IEtVQkVTRVRUQU5UQUxMCQkJIyMJUmV0dXJuZXJlciBhbnRhbGxldCBlbGVtZW50ZXIgaSBldCBzZXR0Lg0KQ1VCRVZBTFVFCQk9IEtVQkVWRVJESQkJCQkjIwlSZXR1cm5lcmVyIGVuIGFnZ3JlZ2VydCB2ZXJkaSBmcmEgZW4ga3ViZS4NCg0KDQojIw0KIyMJRGF0YWJhc2UgZnVuY3Rpb25zCQkJCQlEYXRhYmFzZWZ1bmtzam9uZXINCiMjDQpEQVZFUkFHRQkJPSBER0pFTk5PTVNOSVRUCQkJCSMjCVJldHVybmVyZXIgZ2plbm5vbXNuaXR0ZXQgYXYgbWVya2VkZSBkYXRhYmFzZXBvc3Rlcg0KRENPVU5UCQkJPSBEQU5UQUxMCQkJCSMjCVRlbGxlciBjZWxsZXIgc29tIGlubmVob2xkZXIgdGFsbCBpIGVuIGRhdGFiYXNlDQpEQ09VTlRBCQkJPSBEQU5UQUxMQQkJCQkjIwlUZWxsZXIgY2VsbGVyIHNvbSBpa2tlIGVyIHRvbW1lIGkgZW4gZGF0YWJhc2UNCkRHRVQJCQk9IERIRU5UCQkJCQkjIwlUcmVra2VyIHV0IGZyYSBlbiBkYXRhYmFzZSBlbiBwb3N0IHNvbSBvcHBmeWxsZXIgYW5naXR0ZSB2aWxrw6VyDQpETUFYCQkJPSBETUFLUwkJCQkJIyMJUmV0dXJuZXJlciBtYWtzaW11bXN2ZXJkaWVuIGZyYSBtZXJrZWRlIGRhdGFiYXNlcG9zdGVyDQpETUlOCQkJPSBETUlOCQkJCQkjIwlSZXR1cm5lcmVyIG1pbmltdW1zdmVyZGllbiBmcmEgbWVya2VkZSBkYXRhYmFzZXBvc3Rlcg0KRFBST0RVQ1QJCT0gRFBST0RVS1QJCQkJIyMJTXVsdGlwbGlzZXJlciB2ZXJkaWVuZSBpIGV0IGJlc3RlbXQgZmVsdCBtZWQgcG9zdGVyIHNvbSBvcHBmeWxsZXIgdmlsa8OlcmVuZSBpIGVuIGRhdGFiYXNlDQpEU1RERVYJCQk9IERTVERBVgkJCQkjIwlFc3RpbWVyZXIgc3RhbmRhcmRhdnZpa2V0IGJhc2VydCBww6UgZXQgdXR2YWxnIGF2IG1lcmtlZGUgZGF0YWJhc2Vwb3N0ZXINCkRTVERFVlAJCQk9IERTVEFWUAkJCQkjIwlCZXJlZ25lciBzdGFuZGFyZGF2dmlrZXQgYmFzZXJ0IHDDpSBhdCBtZXJrZWRlIGRhdGFiYXNlcG9zdGVyIHV0Z2rDuHIgaGVsZSBwb3B1bGFzam9uZW4NCkRTVU0JCQk9IERTVU1NRVIJCQkJIyMJTGVnZ2VyIHRpbCB0YWxsZW5lIGkgZmVsdGtvbG9ubmVuIG1lZCBwb3N0ZXIsIGkgZGF0YWJhc2VuIHNvbSBvcHBmeWxsZXIgdmlsa8OlcmVuZQ0KRFZBUgkJCT0gRFZBUklBTlMJCQkJIyMJRXN0aW1lcmVyIHZhcmlhbnNlbiBiYXNlcnQgcMOlIGV0IHV0dmFsZyBhdiBtZXJrZWRlIGRhdGFiYXNlcG9zdGVyDQpEVkFSUAkJCT0gRFZBUklBTlNQCQkJCSMjCUJlcmVnbmVyIHZhcmlhbnNlbiBiYXNlcnQgcMOlIGF0IG1lcmtlZGUgZGF0YWJhc2Vwb3N0ZXIgdXRnasO4ciBoZWxlIHBvcHVsYXNqb25lbg0KDQoNCiMjDQojIwlEYXRlIGFuZCB0aW1lIGZ1bmN0aW9ucwkJCQkJRGF0by0gb2cgdGlkc2Z1bmtzam9uZXINCiMjDQpEQVRFCQkJPSBEQVRPCQkJCQkjIwlSZXR1cm5lcmVyIHNlcmllbnVtbWVyZXQgc29tIHN2YXJlciB0aWwgZW4gYmVzdGVtdCBkYXRvDQpEQVRFVkFMVUUJCT0gREFUT1ZFUkRJCQkJCSMjCUtvbnZlcnRlcmVyIGVuIGRhdG8gbWVkIHRla3N0Zm9ybWF0IHRpbCBldCBzZXJpZW51bW1lcg0KREFZCQkJPSBEQUcJCQkJCSMjCUtvbnZlcnRlcmVyIGV0IHNlcmllbnVtbWVyIHRpbCBlbiBkYWcgaSBtw6VuZWRlbg0KREFZUzM2MAkJCT0gREFHRVIzNjAJCQkJIyMJQmVyZWduZXIgYW50YWxsIGRhZ2VyIG1lbGxvbSB0byBkYXRvZXIgYmFzZXJ0IHDDpSBldCDDpXIgbWVkIDM2MCBkYWdlcg0KRURBVEUJCQk9IERBRy5FVFRFUgkJCQkjIwlSZXR1cm5lcmVyIHNlcmllbnVtbWVyZXQgc29tIHN2YXJlciB0aWwgZGF0b2VuIHNvbSBlciBkZXQgaW5kaWtlcnRlIGFudGFsbCBtw6VuZWRlciBmw7hyIGVsbGVyIGV0dGVyIHN0YXJ0ZGF0b2VuDQpFT01PTlRICQkJPSBNw4VORURTU0xVVFQJCQkJIyMJUmV0dXJuZXJlciBzZXJpZW51bW1lcmV0IHNvbSBzdmFyZXIgdGlsIHNpc3RlIGRhZyBpIG3DpW5lZGVuLCBmw7hyIGVsbGVyIGV0dGVyIGV0IGFuZ2l0dCBhbnRhbGwgbcOlbmVkZXINCkhPVVIJCQk9IFRJTUUJCQkJCSMjCUtvbnZlcnRlcmVyIGV0IHNlcmllbnVtbWVyIHRpbCBlbiB0aW1lDQpNSU5VVEUJCQk9IE1JTlVUVAkJCQkjIwlLb252ZXJ0ZXJlciBldCBzZXJpZW51bW1lciB0aWwgZXQgbWludXR0DQpNT05USAkJCT0gTcOFTkVECQkJCQkjIwlLb252ZXJ0ZXJlciBldCBzZXJpZW51bW1lciB0aWwgZW4gbcOlbmVkDQpORVRXT1JLREFZUwkJPSBORVRULkFSQkVJRFNEQUdFUgkJCSMjCVJldHVybmVyZXIgYW50YWxsIGhlbGUgYXJiZWlkc2RhZ2VyIG1lbGxvbSB0byBkYXRvZXINCk5PVwkJCT0gTsOFCQkJCQkjIwlSZXR1cm5lcmVyIHNlcmllbnVtbWVyZXQgc29tIHN2YXJlciB0aWwgZ2plbGRlbmRlIGRhdG8gb2cga2xva2tlc2xldHQNClNFQ09ORAkJCT0gU0VLVU5ECQkJCSMjCUtvbnZlcnRlcmVyIGV0IHNlcmllbnVtbWVyIHRpbCBldCBzZWt1bmQNClRJTUUJCQk9IFRJRAkJCQkJIyMJUmV0dXJuZXJlciBzZXJpZW51bW1lcmV0IHNvbSBzdmFyZXIgdGlsIGV0IGJlc3RlbXQga2xva2tlc2xldHQNClRJTUVWQUxVRQkJPSBUSURTVkVSREkJCQkJIyMJS29udmVydGVyZXIgZXQga2xva2tlc2xldHQgaSB0ZWtzdGZvcm1hdCB0aWwgZXQgc2VyaWVudW1tZXINClRPREFZCQkJPSBJREFHCQkJCQkjIwlSZXR1cm5lcmVyIHNlcmllbnVtbWVyZXQgc29tIHN2YXJlciB0aWwgZGFnZW5zIGRhdG8NCldFRUtEQVkJCQk9IFVLRURBRwkJCQkjIwlLb252ZXJ0ZXJlciBldCBzZXJpZW51bW1lciB0aWwgZW4gdWtlZGFnDQpXRUVLTlVNCQkJPSBVS0VOUgkJCQkJIyMJS29udmVydGVyZXIgZXQgc2VyaWVudW1tZXIgdGlsIGV0IHRhbGwgc29tIHJlcHJlc2VudGVyZXIgaHZpbGtldCBudW1tZXIgdWtlbiBoYXIgaSBldCDDpXINCldPUktEQVkJCQk9IEFSQkVJRFNEQUcJCQkJIyMJUmV0dXJuZXJlciBzZXJpZW51bW1lcmV0IHNvbSBzdmFyZXIgdGlsIGRhdG9lbiBmw7hyIGVsbGVyIGV0dGVyIGV0IGFuZ2l0dCBhbnRhbGwgYXJiZWlkc2RhZ2VyDQpZRUFSCQkJPSDDhVIJCQkJCSMjCUtvbnZlcnRlcmVyIGV0IHNlcmllbnVtbWVyIHRpbCBldCDDpXINCllFQVJGUkFDCQk9IMOFUkRFTAkJCQkJIyMJUmV0dXJuZXJlciBicsO4a2RlbGVuIGZvciDDpXJldCwgc29tIHN2YXJlciB0aWwgYW50YWxsIGhlbGUgZGFnZXIgbWVsbG9tIHN0YXJ0ZGF0byBvZyBzbHV0dGRhdG8NCg0KDQojIw0KIyMJRW5naW5lZXJpbmcgZnVuY3Rpb25zCQkJCQlUZWtuaXNrZSBmdW5rc2pvbmVyDQojIw0KQkVTU0VMSQkJCT0gQkVTU0VMSQkJCQkjIwlSZXR1cm5lcmVyIGRlbiBlbmRyZWRlIEJlc3NlbC1mdW5rc2pvbmVuIEluKHgpDQpCRVNTRUxKCQkJPSBCRVNTRUxKCQkJCSMjCVJldHVybmVyZXIgQmVzc2VsLWZ1bmtzam9uZW4gSm4oeCkNCkJFU1NFTEsJCQk9IEJFU1NFTEsJCQkJIyMJUmV0dXJuZXJlciBkZW4gZW5kcmVkZSBCZXNzZWwtZnVua3Nqb25lbiBLbih4KQ0KQkVTU0VMWQkJCT0gQkVTU0VMWQkJCQkjIwlSZXR1cm5lcmVyIEJlc3NlbC1mdW5rc2pvbmVuIFluKHgpDQpCSU4yREVDCQkJPSBCSU5USUxERVMJCQkJIyMJS29udmVydGVyZXIgZXQgYmluw6ZydCB0YWxsIHRpbCBldCBkZXNpbWFsdGFsbA0KQklOMkhFWAkJCT0gQklOVElMSEVLUwkJCQkjIwlLb252ZXJ0ZXJlciBldCBiaW7DpnJ0IHRhbGwgdGlsIGV0IGhla3NhZGVzaW1hbHRhbGwNCkJJTjJPQ1QJCQk9IEJJTlRJTE9LVAkJCQkjIwlLb252ZXJ0ZXJlciBldCBiaW7DpnJ0IHRhbGwgdGlsIGV0IG9rdGFsdGFsbA0KQ09NUExFWAkJCT0gS09NUExFS1MJCQkJIyMJS29udmVydGVyZXIgcmVlbGxlIG9nIGltYWdpbsOmcmUga29lZmZpc2llbnRlciB0aWwgZXQga29tcGxla3N0IHRhbGwNCkNPTlZFUlQJCQk9IEtPTlZFUlRFUgkJCQkjIwlLb252ZXJ0ZXJlciBldCB0YWxsIGZyYSBldHQgbcOlbHN5c3RlbSB0aWwgZXQgYW5uZXQNCkRFQzJCSU4JCQk9IERFU1RJTEJJTgkJCQkjIwlLb252ZXJ0ZXJlciBldCBkZXNpbWFsdGFsbCB0aWwgZXQgYmluw6ZydGFsbA0KREVDMkhFWAkJCT0gREVTVElMSEVLUwkJCQkjIwlLb252ZXJ0ZXJlciBldCBoZWx0YWxsIGkgMTAtdGFsbHN5c3RlbWV0IHRpbCBldCBoZWtzYWRlc2ltYWx0IHRhbGwNCkRFQzJPQ1QJCQk9IERFU1RJTE9LVAkJCQkjIwlLb252ZXJ0ZXJlciBldCBoZWx0YWxsIGkgMTAtdGFsbHN5c3RlbWV0IHRpbCBldCBva3RhbHRhbGwNCkRFTFRBCQkJPSBERUxUQQkJCQkJIyMJVW5kZXJzw7hrZXIgb20gdG8gdmVyZGllciBlciBsaWtlDQpFUkYJCQk9IEZFSUxGCQkJCQkjIwlSZXR1cm5lcmVyIGZlaWxmdW5rc2pvbmVuDQpFUkZDCQkJPSBGRUlMRksJCQkJIyMJUmV0dXJuZXJlciBkZW4ga29tcGxlbWVudMOmcmUgZmVpbGZ1bmtzam9uZW4NCkdFU1RFUAkJCT0gR1JFTlNFVkVSREkJCQkJIyMJVGVzdGVyIG9tIGV0IHRhbGwgZXIgc3TDuHJyZSBlbm4gZW4gdGVyc2tlbHZlcmRpDQpIRVgyQklOCQkJPSBIRUtTVElMQklOCQkJCSMjCUtvbnZlcnRlcmVyIGV0IGhla3NhZGVzaW1hbHRhbGwgdGlsIGV0IGJpbsOmcnQgdGFsbA0KSEVYMkRFQwkJCT0gSEVLU1RJTERFUwkJCQkjIwlLb252ZXJ0ZXJlciBldCBoZWtzYWRlc2ltYWx0IHRhbGwgdGlsIGV0IGhlbHRhbGwgaSAxMC10YWxsc3lzdGVtZXQNCkhFWDJPQ1QJCQk9IEhFS1NUSUxPS1QJCQkJIyMJS29udmVydGVyZXIgZXQgaGVrc2FkZXNpbWFsdCB0YWxsIHRpbCBldCBva3RhbHRhbGwNCklNQUJTCQkJPSBJTUFCUwkJCQkJIyMJUmV0dXJuZXJlciBhYnNvbHV0dHZlcmRpZW4gKGtvZWZmaXNpZW50ZW4pIHRpbCBldCBrb21wbGVrc3QgdGFsbA0KSU1BR0lOQVJZCQk9IElNQUdJTsOGUgkJCQkjIwlSZXR1cm5lcmVyIGRlbiBpbWFnaW7DpnJlIGtvZWZmaXNpZW50ZW4gdGlsIGV0IGtvbXBsZWtzdCB0YWxsDQpJTUFSR1VNRU5UCQk9IElNQVJHVU1FTlQJCQkJIyMJUmV0dXJuZXJlciBhcmd1bWVudGV0IHRoZXRhLCBzb20gZXIgZW4gdmlua2VsIHV0dHJ5a3QgaSByYWRpYW5lcg0KSU1DT05KVUdBVEUJCT0gSU1LT05KVUdFUlQJCQkJIyMJUmV0dXJuZXJlciBkZW4ga29tcGxla3NlIGtvbmp1Z2F0ZW4gdGlsIGV0IGtvbXBsZWtzdCB0YWxsDQpJTUNPUwkJCT0gSU1DT1MJCQkJCSMjCVJldHVybmVyZXIgY29zaW51cyB0aWwgZXQga29tcGxla3N0IHRhbGwNCklNRElWCQkJPSBJTURJVgkJCQkJIyMJUmV0dXJuZXJlciBrdm90aWVudGVuIHRpbCB0byBrb21wbGVrc2UgdGFsbA0KSU1FWFAJCQk9IElNRUtTUAkJCQkjIwlSZXR1cm5lcmVyIGVrc3BvbmVudGVuIHRpbCBldCBrb21wbGVrc3QgdGFsbA0KSU1MTgkJCT0gSU1MTgkJCQkJIyMJUmV0dXJuZXJlciBkZW4gbmF0dXJsaWdlIGxvZ2FyaXRtZW4gZm9yIGV0IGtvbXBsZWtzdCB0YWxsDQpJTUxPRzEwCQkJPSBJTUxPRzEwCQkJCSMjCVJldHVybmVyZXIgbG9nYXJpdG1lbiBtZWQgZ3J1bm50YWxsIDEwIGZvciBldCBrb21wbGVrc3QgdGFsbA0KSU1MT0cyCQkJPSBJTUxPRzIJCQkJIyMJUmV0dXJuZXJlciBsb2dhcml0bWVuIG1lZCBncnVubnRhbGwgMiBmb3IgZXQga29tcGxla3N0IHRhbGwNCklNUE9XRVIJCQk9IElNT1BQSMOYWQkJCQkjIwlSZXR1cm5lcmVyIGV0IGtvbXBsZWtzdCB0YWxsIG9wcGjDuHlkIHRpbCBlbiBoZWx0YWxsc3BvdGVucw0KSU1QUk9EVUNUCQk9IElNUFJPRFVLVAkJCQkjIwlSZXR1cm5lcmVyIHByb2R1a3RldCBhdiBrb21wbGVrc2UgdGFsbA0KSU1SRUFMCQkJPSBJTVJFRUxMCQkJCSMjCVJldHVybmVyZXIgZGVuIHJlZWxsZSBrb2VmZmlzaWVudGVuIHRpbCBldCBrb21wbGVrc3QgdGFsbA0KSU1TSU4JCQk9IElNU0lOCQkJCQkjIwlSZXR1cm5lcmVyIHNpbnVzIHRpbCBldCBrb21wbGVrc3QgdGFsbA0KSU1TUVJUCQkJPSBJTVJPVAkJCQkJIyMJUmV0dXJuZXJlciBrdmFkcmF0cm90ZW4gYXYgZXQga29tcGxla3N0IHRhbGwNCklNU1VCCQkJPSBJTVNVQgkJCQkJIyMJUmV0dXJuZXJlciBkaWZmZXJhbnNlbiBtZWxsb20gdG8ga29tcGxla3NlIHRhbGwNCklNU1VNCQkJPSBJTVNVTU1FUgkJCQkjIwlSZXR1cm5lcmVyIHN1bW1lbiBhdiBrb21wbGVrc2UgdGFsbA0KT0NUMkJJTgkJCT0gT0tUVElMQklOCQkJCSMjCUtvbnZlcnRlcmVyIGV0IG9rdGFsdGFsbCB0aWwgZXQgYmluw6ZydCB0YWxsDQpPQ1QyREVDCQkJPSBPS1RUSUxERVMJCQkJIyMJS29udmVydGVyZXIgZXQgb2t0YWx0YWxsIHRpbCBldCBkZXNpbWFsdGFsbA0KT0NUMkhFWAkJCT0gT0tUVElMSEVLUwkJCQkjIwlLb252ZXJ0ZXJlciBldCBva3RhbHRhbGwgdGlsIGV0IGhla3NhZGVzaW1hbHRhbGwNCg0KDQojIw0KIyMJRmluYW5jaWFsIGZ1bmN0aW9ucwkJCQkJw5hrb25vbWlza2UgZnVua3Nqb25lcg0KIyMNCkFDQ1JJTlQJCQk9IFDDhUzDmFBULlBFUklPRElTSy5SRU5URQkJIyMJUmV0dXJuZXJlciBww6Vsw7hwdGUgcmVudGVyIGZvciBldCB2ZXJkaXBhcGlyIHNvbSBiZXRhbGVyIHBlcmlvZGlzayByZW50ZQ0KQUNDUklOVE0JCT0gUMOFTMOYUFQuRk9SRkFMTFNSRU5URQkJCSMjCVJldHVybmVyZXIgZGVuIHDDpWzDuHB0ZSByZW50ZW4gZm9yIGV0IHZlcmRpcGFwaXIgc29tIGJldGFsZXIgcmVudGUgdmVkIGZvcmZhbGwNCkFNT1JERUdSQwkJPSBBTU9SREVHUkMJCQkJIyMJUmV0dXJuZXJlciBhdnNrcml2bmluZ2VuIGZvciBodmVyIHJlZ25za2Fwc3BlcmlvZGUgdmVkIGhqZWxwIGF2IGVuIGF2c2tyaXZpbmdza29lZmZpc2llbnQNCkFNT1JMSU5DCQk9IEFNT1JMSU5DCQkJCSMjCVJldHVybmVyZXIgYXZza3JpdmluZ2VuIGZvciBodmVyIHJlZ25za2Fwc3BlcmlvZGUNCkNPVVBEQVlCUwkJPSBPQkxJRy5EQUdFUi5GRgkJCSMjCVJldHVybmVyZXIgYW50YWxsIGRhZ2VyIGZyYSBiZWd5bm5lbHNlbiBhdiBkZW4gcmVudGViw6ZyZW5kZSBwZXJpb2RlbiB0aWwgaW5ubMO4c25pbmdzZGF0b2VuDQpDT1VQREFZUwkJPSBPQkxJRy5EQUdFUgkJCQkjIwlSZXR1cm5lcmVyIGFudGFsbCBkYWdlciBpIGRlbiByZW50ZWLDpnJlbmRlIHBlcmlvZGVuIHNvbSBpbm5laG9sZGVyIGlubmzDuHNuaW5nc2RhdG9lbg0KQ09VUERBWVNOQwkJPSBPQkxJRy5EQUdFUi5ORgkJCSMjCVJldHVybmVyZXIgYW50YWxsIGRhZ2VyIGZyYSBiZXRhbGluZ3NkYXRvIHRpbCBuZXN0ZSByZW50ZWlubmJldGFsaW5nc2RhdG8NCkNPVVBOQ0QJCQk9IE9CTElHLkRBR0VSLkVGCQkJIyMJUmV0dXJuZXJlciBvYmxpZ2Fzam9uc2RhdG9lbiBzb20ga29tbWVyIGV0dGVyIG9wcGdqw7hyc2RhdG9lbg0KQ09VUE5VTQkJCT0gT0JMSUcuQU5UQUxMCQkJCSMjCVJldHVybmVyZXIgYW50YWxsIG9ibGlnYXNqb25lciBzb20gc2thbCBiZXRhbGVzIG1lbGxvbSBvcHBnasO4cnNkYXRvZW4gb2cgZm9yZmFsbHNkYXRvZW4NCkNPVVBQQ0QJCQk9IE9CTElHLkRBRy5GT1JSSUdFCQkJIyMJUmV0dXJuZXJlciBvYmxpZ2Fzam9uc2RhdG9lbiBzb20ga29tbWVyIGbDuHIgb3BwZ2rDuHJzZGF0b2VuDQpDVU1JUE1UCQkJPSBTQU1MRVQuUkVOVEUJCQkJIyMJUmV0dXJuZXJlciBkZW4ga3VtdWxhdGl2ZSByZW50ZW4gc29tIGVyIGJldGFsdCBtZWxsb20gdG8gcGVyaW9kZXINCkNVTVBSSU5DCQk9IFNBTUxFVC5IT1ZFRFNUT0wJCQkjIwlSZXR1cm5lcmVyIGRlbiBrdW11bGF0aXZlIGhvdmVkc3RvbGVuIHNvbSBlciBiZXRhbHQgZm9yIGV0IGzDpW4gbWVsbG9tIHRvIHBlcmlvZGVyDQpEQgkJCT0gREFWU0tSCQkJCSMjCVJldHVybmVyZXIgYXZza3Jpdm5pbmdlbiBmb3IgZXQgYWt0aXZ1bSBpIGVuIGFuZ2l0dCBwZXJpb2RlLCBmb3JldGF0dCBtZWQgZmFzdCBkZWdyZXNzaXYgYXZza3Jpdm5pbmcNCkREQgkJCT0gREVHUkFWUwkJCQkjIwlSZXR1cm5lcmVyIGF2c2tyaXZuaW5nZW4gZm9yIGV0IGFrdGl2dW0gZm9yIGVuIGdpdHQgcGVyaW9kZSwgdmVkIGhqZWxwIGF2IGRvYmJlbCBkZWdyZXNzaXYgYXZza3Jpdm5pbmcgZWxsZXIgZW4gbWV0b2RlIHNvbSBkdSBzZWx2IGFuZ2lyDQpESVNDCQkJPSBESVNLT05URVJUCQkJCSMjCVJldHVybmVyZXIgZGlza29udGVyaW5nc3JhdGVuIGZvciBldCB2ZXJkaXBhcGlyDQpET0xMQVJERQkJPSBET0xMQVJERQkJCQkjIwlLb252ZXJ0ZXJlciBlbiB2YWx1dGFwcmlzIHV0dHJ5a3Qgc29tIGVuIGJyw7hrLCB0aWwgZW4gdmFsdXRhcHJpcyB1dHRyeWt0IHNvbSBldCBkZXNpbWFsdGFsbA0KRE9MTEFSRlIJCT0gRE9MTEFSQlIJCQkJIyMJS29udmVydGVyZXIgZW4gdmFsdXRhcHJpcyB1dHRyeWt0IHNvbSBldCBkZXNpbWFsdGFsbCwgdGlsIGVuIHZhbHV0YXByaXMgdXR0cnlrdCBzb20gZW4gYnLDuGsNCkRVUkFUSU9OCQk9IFZBUklHSEVUCQkJCSMjCVJldHVybmVyZXIgw6VybGlnIHZhcmlnaGV0IGZvciBldCB2ZXJkaXBhcGlyIG1lZCByZW50ZXIgc29tIGJldGFsZXMgcGVyaW9kaXNrDQpFRkZFQ1QJCQk9IEVGRkVLVElWLlJFTlRFCQkJIyMJUmV0dXJuZXJlciBkZW4gZWZmZWt0aXZlIMOlcmxpZ2UgcmVudGVzYXRzZW4NCkZWCQkJPSBTTFVUVFZFUkRJCQkJCSMjCVJldHVybmVyZXIgZnJlbXRpZGlnIHZlcmRpIGZvciBlbiBpbnZlc3RlcmluZw0KRlZTQ0hFRFVMRQkJPSBTVlBMQU4JCQkJIyMJUmV0dXJuZXJlciBkZW4gZnJlbXRpZGlnZSB2ZXJkaWVuIGF2IGVuIGlubmfDpWVuZGUgaG92ZWRzdG9sIGV0dGVyIMOlIGhhIGFudmVuZHQgZW4gc2VyaWUgbWVkIHNhbW1lbnNhdHRlIHJlbnRlc2F0c2VyDQpJTlRSQVRFCQkJPSBSRU5URVNBVFMJCQkJIyMJUmV0dXJuZXJlciByZW50ZWZvdGVuIGF2IGV0IGZ1bGxmaW5hbnNpZXJ0IHZlcmRpcGFwaXINCklQTVQJCQk9IFJBVkRSQUcJCQkJIyMJUmV0dXJuZXJlciBiZXRhbHRlIHJlbnRlciBww6UgZW4gaW52ZXN0ZXJpbmcgZm9yIGVuIGdpdHQgcGVyaW9kZQ0KSVJSCQkJPSBJUgkJCQkJIyMJUmV0dXJuZXJlciBpbnRlcm5yZW50ZW4gZm9yIGVuIHNlcmllIGtvbnRhbnRzdHLDuG1tZXINCklTUE1UCQkJPSBFUi5BVkRSQUcJCQkJIyMJQmVyZWduZXIgcmVudGVuIHNvbSBlciBiZXRhbHQgZm9yIGVuIGludmVzdGVyaW5nIGkgbMO4cGV0IGF2IGVuIGJlc3RlbXQgcGVyaW9kZQ0KTURVUkFUSU9OCQk9IE1WQVJJR0hFVAkJCQkjIwlSZXR1cm5lcmVyIE1hY2F1bGV5cyBtb2RpZmlzZXJ0ZSB2YXJpZ2hldCBmb3IgZXQgdmVyZGlwYXBpciBtZWQgZW4gYW50YXR0IHDDpWx5ZGVuZGUgdmVyZGkgcMOlIGtyIDEwMCwwMA0KTUlSUgkJCT0gTU9ESVIJCQkJCSMjCVJldHVybmVyZXIgaW50ZXJucmVudGVuIGRlciBwb3NpdGl2ZSBvZyBuZWdhdGl2ZSBrb250YW50c3Ryw7htbWVyIGZpbmFuc2llcmVzIG1lZCBmb3Jza2plbGxpZ2Ugc2F0c2VyDQpOT01JTkFMCQkJPSBOT01JTkVMTAkJCQkjIwlSZXR1cm5lcmVyIMOlcmxpZyBub21pbmVsbCByZW50ZXNhdHMNCk5QRVIJCQk9IFBFUklPREVSCQkJCSMjCVJldHVybmVyZXIgYW50YWxsIHBlcmlvZGVyIGZvciBlbiBpbnZlc3RlcmluZw0KTlBWCQkJPSBOTlYJCQkJCSMjCVJldHVybmVyZXIgbmV0dG8gbsOldmVyZGkgZm9yIGVuIGludmVzdGVyaW5nLCBiYXNlcnQgcMOlIGVuIHNlcmllIHBlcmlvZGlza2Uga29udGFudHN0csO4bW1lciBvZyBlbiByZW50ZXNhdHMNCk9EREZQUklDRQkJPSBBVlZJS0ZQLlBSSVMJCQkJIyMJUmV0dXJuZXJlciBwcmlzIHDDpWx5ZGVuZGUga3IgMTAwIGZvciBldCB2ZXJkaXBhcGlyIG1lZCBlbiBvZGRlIGbDuHJzdGUgcGVyaW9kZQ0KT0RERllJRUxECQk9IEFWVklLRlAuQVZLQVNUTklORwkJCSMjCVJldHVybmVyZXIgYXZrYXN0aW5nZW4gZm9yIGV0IHZlcmRpcGFwaXIgbWVkIGVuIG9kZGUgZsO4cnN0ZSBwZXJpb2RlDQpPRERMUFJJQ0UJCT0gQVZWSUtTUC5QUklTCQkJCSMjCVJldHVybmVyZXIgcHJpcyBww6VseWRlbmRlIGtyIDEwMCBmb3IgZXQgdmVyZGlwYXBpciBtZWQgZW4gb2RkZSBzaXN0ZSBwZXJpb2RlDQpPRERMWUlFTEQJCT0gQVZWSUtTUC5BVktBU1ROSU5HCQkJIyMJUmV0dXJuZXJlciBhdmthc3RpbmdlbiBmb3IgZXQgdmVyZGlwYXBpciBtZWQgZW4gb2RkZSBzaXN0ZSBwZXJpb2RlDQpQTVQJCQk9IEFWRFJBRwkJCQkjIwlSZXR1cm5lcmVyIHBlcmlvZGlzayBiZXRhbGluZyBmb3IgZW4gYW5udWl0ZXQNClBQTVQJCQk9IEFNT1JUCQkJCQkjIwlSZXR1cm5lcmVyIGJldGFsaW5nZW4gcMOlIGhvdmVkc3RvbGVuIGZvciBlbiBpbnZlc3RlcmluZyBpIGVuIGdpdHQgcGVyaW9kZQ0KUFJJQ0UJCQk9IFBSSVMJCQkJCSMjCVJldHVybmVyZXIgcHJpc2VuIHBlciBww6VseWRlbmRlIGtyIDEwMCBmb3IgZXQgdmVyZGlwYXBpciBzb20gZ2lyIHBlcmlvZGlzayBhdmthc3RuaW5nDQpQUklDRURJU0MJCT0gUFJJUy5ESVNLT05URVJUCQkJIyMJUmV0dXJuZXJlciBwcmlzZW4gcGVyIHDDpWx5ZGVuZGUga3IgMTAwIGZvciBldCBkaXNrb250ZXJ0IHZlcmRpcGFwaXINClBSSUNFTUFUCQk9IFBSSVMuRk9SRkFMTAkJCQkjIwlSZXR1cm5lcmVyIHByaXNlbiBwZXIgcMOlbHlkZW5kZSBrciAxMDAgYXYgZXQgdmVyZGlwYXBpciBzb20gYmV0YWxlciByZW50ZSB2ZWQgZm9yZmFsbA0KUFYJCQk9IE7DhVZFUkRJCQkJCSMjCVJldHVybmVyZXIgbsOldmVyZGllbiBhdiBlbiBpbnZlc3RlcmluZw0KUkFURQkJCT0gUkVOVEUJCQkJCSMjCVJldHVybmVyZXIgcmVudGVzYXRzZW4gcGVyIHBlcmlvZGUgZm9yIGVuIGFubnVpdGV0DQpSRUNFSVZFRAkJPSBNT1RUQVRULkFWS0FTVAkJCSMjCVJldHVybmVyZXIgc3VtbWVuIHNvbSBtb3R0YXMgdmVkIGZvcmZhbGxzZGF0byBmb3IgZXQgZnVsbGludmVzdGVydCB2ZXJkaXBhcGlyDQpTTE4JCQk9IExJTkFWUwkJCQkjIwlSZXR1cm5lcmVyIGRlbiBsaW5lw6ZyZSBhdnNrcml2bmluZ2VuIGZvciBldCBha3RpdnVtIGkgw6luIHBlcmlvZGUNClNZRAkJCT0gw4VSU0FWUwkJCQkjIwlSZXR1cm5lcmVyIMOlcnNhdnNrcml2bmluZ2VuIGZvciBldCBha3RpdnVtIGkgZW4gYW5naXR0IHBlcmlvZGUNClRCSUxMRVEJCQk9IFRCSUxMRUtWCQkJCSMjCVJldHVybmVyZXIgZGVuIG9ibGlnYXNqb25zZWt2aXZhbGVudGUgYXZrYXN0bmluZ2VuIGZvciBlbiBzdGF0c29ibGlnYXNqb24NClRCSUxMUFJJQ0UJCT0gVEJJTExQUklTCQkJCSMjCVJldHVybmVyZXIgcHJpc2VuIHBlciBww6VseWRlbmRlIGtyIDEwMCBmb3IgZW4gc3RhdHNvYmxpZ2Fzam9uDQpUQklMTFlJRUxECQk9IFRCSUxMQVZLQVNUTklORwkJCSMjCVJldHVybmVyZXIgYXZrYXN0bmluZ2VuIHRpbCBlbiBzdGF0c29ibGlnYXNqb24NClZEQgkJCT0gVkVSRElBVlMJCQkJIyMJUmV0dXJuZXJlciBhdnNrcml2bmluZ2VuIGZvciBldCBha3RpdnVtIGkgZW4gYW5naXR0IHBlcmlvZGUgZWxsZXIgZGVscGVyaW9kZSwgdmVkIGhqZWxwIGF2IGRlZ3Jlc3NpdiBhdnNrcml2bmluZw0KWElSUgkJCT0gWElSCQkJCQkjIwlSZXR1cm5lcmVyIGludGVybnJlbnRlbiBmb3IgZW4gc2VyaWUga29udGFudHN0csO4bW1lciBzb20gaWtrZSBuw7hkdmVuZGlndmlzIGVyIHBlcmlvZGlza2UNClhOUFYJCQk9IFhOTlYJCQkJCSMjCVJldHVybmVyZXIgbmV0dG8gbsOldmVyZGkgZm9yIGVuIHNlcmllIGtvbnRhbnRzdHLDuG1tZXIgc29tIGlra2UgbsO4ZHZlbmRpZ3ZpcyBlciBwZXJpb2Rpc2tlDQpZSUVMRAkJCT0gQVZLQVNUCQkJCSMjCVJldHVybmVyZXIgYXZrYXN0bmluZ2VuIHDDpSBldCB2ZXJkaXBhcGlyIHNvbSBiZXRhbGVyIHBlcmlvZGlzayByZW50ZQ0KWUlFTERESVNDCQk9IEFWS0FTVC5ESVNLT05URVJUCQkJIyMJUmV0dXJuZXJlciDDpXJsaWcgYXZrYXN0bmluZyBmb3IgZXQgZGlza29udGVydCB2ZXJkaXBhcGlyLCBmb3IgZWtzZW1wZWwgZW4gc3RhdHNrYXNzZXZla3NlbA0KWUlFTERNQVQJCT0gQVZLQVNULkZPUkZBTEwJCQkjIwlSZXR1cm5lcmVyIGRlbiDDpXJsaWdlIGF2a2FzdG5pbmdlbiBmb3IgZXQgdmVyZGlwYXBpciBzb20gYmV0YWxlciByZW50ZSB2ZWQgZm9yZmFsbHNkYXRvDQoNCg0KIyMNCiMjCUluZm9ybWF0aW9uIGZ1bmN0aW9ucwkJCQkJSW5mb3JtYXNqb25zZnVua3Nqb25lcg0KIyMNCkNFTEwJCQk9IENFTExFCQkJCQkjIwlSZXR1cm5lcmVyIGluZm9ybWFzam9uIG9tIGZvcm1hdGVyaW5nLCBwbGFzc2VyaW5nIGVsbGVyIGlubmhvbGRldCB0aWwgZW4gY2VsbGUNCkVSUk9SLlRZUEUJCT0gRkVJTC5UWVBFCQkJCSMjCVJldHVybmVyZXIgZXQgdGFsbCBzb20gc3ZhcmVyIHRpbCBlbiBmZWlsdHlwZQ0KSU5GTwkJCT0gSU5GTwkJCQkJIyMJUmV0dXJuZXJlciBpbmZvcm1hc2pvbiBvbSBnamVsZGVuZGUgb3BlcmF0aXZtaWxqw7gNCklTQkxBTksJCQk9IEVSVE9NCQkJCQkjIwlSZXR1cm5lcmVyIFNBTk4gaHZpcyB2ZXJkaWVuIGVyIHRvbQ0KSVNFUlIJCQk9IEVSRkVJTAkJCQkjIwlSZXR1cm5lcmVyIFNBTk4gaHZpcyB2ZXJkaWVuIGVyIGVuIGh2aWxrZW4gc29tIGhlbHN0IGFubmVuIGZlaWx2ZXJkaSBlbm4gI0kvVA0KSVNFUlJPUgkJCT0gRVJGRUlMCQkJCSMjCVJldHVybmVyZXIgU0FOTiBodmlzIHZlcmRpZW4gZXIgZW4gaHZpbGtlbiBzb20gaGVsc3QgZmVpbHZlcmRpDQpJU0VWRU4JCQk9IEVSUEFSVEFMTAkJCQkjIwlSZXR1cm5lcmVyIFNBTk4gaHZpcyB0YWxsZXQgZXIgZXQgcGFydGFsbA0KSVNMT0dJQ0FMCQk9IEVSTE9HSVNLCQkJCSMjCVJldHVybmVyZXIgU0FOTiBodmlzIHZlcmRpZW4gZXIgZW4gbG9naXNrIHZlcmRpDQpJU05BCQkJPSBFUklUCQkJCQkjIwlSZXR1cm5lcmVyIFNBTk4gaHZpcyB2ZXJkaWVuIGVyIGZlaWx2ZXJkaWVuICNJL1QNCklTTk9OVEVYVAkJPSBFUklLS0VURUtTVAkJCQkjIwlSZXR1cm5lcmVyIFNBTk4gaHZpcyB2ZXJkaWVuIGlra2UgZXIgdGVrc3QNCklTTlVNQkVSCQk9IEVSVEFMTAkJCQkjIwlSZXR1cm5lcmVyIFNBTk4gaHZpcyB2ZXJkaWVuIGVyIGV0IHRhbGwNCklTT0RECQkJPSBFUk9EREVUQUxMCQkJCSMjCVJldHVybmVyZXIgU0FOTiBodmlzIHRhbGxldCBlciBldCBvZGRldGFsbA0KSVNSRUYJCQk9IEVSUkVGCQkJCQkjIwlSZXR1cm5lcmVyIFNBTk4gaHZpcyB2ZXJkaWVuIGVyIGVuIHJlZmVyYW5zZQ0KSVNURVhUCQkJPSBFUlRFS1NUCQkJCSMjCVJldHVybmVyZXIgU0FOTiBodmlzIHZlcmRpZW4gZXIgdGVrc3QNCk4JCQk9IE4JCQkJCSMjCVJldHVybmVyZXIgZW4gdmVyZGkgc29tIGVyIGtvbnZlcnRlcnQgdGlsIGV0IHRhbGwNCk5BCQkJPSBJVAkJCQkJIyMJUmV0dXJuZXJlciBmZWlsdmVyZGllbiAjSS9UDQpUWVBFCQkJPSBWRVJESVRZUEUJCQkJIyMJUmV0dXJuZXJlciBldCB0YWxsIHNvbSBpbmRpa2VyZXIgZGF0YXR5cGVuIHRpbCBlbiB2ZXJkaQ0KDQoNCiMjDQojIwlMb2dpY2FsIGZ1bmN0aW9ucwkJCQkJTG9naXNrZSBmdW5rc2pvbmVyDQojIw0KQU5ECQkJPSBPRwkJCQkJIyMJUmV0dXJuZXJlciBTQU5OIGh2aXMgYWxsZSBhcmd1bWVudGVuZSBlciBsaWsgU0FOTg0KRkFMU0UJCQk9IFVTQU5OCQkJCQkjIwlSZXR1cm5lcmVyIGRlbiBsb2dpc2tlIHZlcmRpZW4gVVNBTk4NCklGCQkJPSBIVklTCQkJCQkjIwlBbmdpciBlbiBsb2dpc2sgdGVzdCBzb20gc2thbCB1dGbDuHJlcw0KSUZFUlJPUgkJCT0gSFZJU0ZFSUwJCQkJIyMJUmV0dXJuZXJlciBlbiB2ZXJkaSBkdSBhbmdpciBodmlzIGVuIGZvcm1lbCBldmFsdWVyZXIgdGlsIGVuIGZlaWwuIEVsbGVycyByZXR1cm5lcmVyIGRlbiByZXN1bHRhdGV0IGF2IGZvcm1lbGVuLg0KTk9UCQkJPSBJS0tFCQkJCQkjIwlSZXZlcnNlcmVyIGxvZ2lra2VuIHRpbCBhcmd1bWVudGV0DQpPUgkJCT0gRUxMRVIJCQkJCSMjCVJldHVybmVyZXIgU0FOTiBodmlzIGV0dCBlbGxlciBmbGVyZSBhcmd1bWVudGVyIGVyIGxpayBTQU5ODQpUUlVFCQkJPSBTQU5OCQkJCQkjIwlSZXR1cm5lcmVyIGRlbiBsb2dpc2tlIHZlcmRpZW4gU0FOTg0KDQoNCiMjDQojIwlMb29rdXAgYW5kIHJlZmVyZW5jZSBmdW5jdGlvbnMJCQkJT3Bwc2xhZy0gb2cgcmVmZXJhbnNlZnVua3Nqb25lcg0KIyMNCkFERFJFU1MJCQk9IEFEUkVTU0UJCQkJIyMJUmV0dXJuZXJlciBlbiByZWZlcmFuc2Ugc29tIHRla3N0IHRpbCBlbiBlbmtlbHQgY2VsbGUgaSBldCByZWduZWFyaw0KQVJFQVMJCQk9IE9NUsOFREVSCQkJCSMjCVJldHVybmVyZXIgYW50YWxsIG9tcsOlZGVyIGkgZW4gcmVmZXJhbnNlDQpDSE9PU0UJCQk9IFZFTEcJCQkJCSMjCVZlbGdlciBlbiB2ZXJkaSBmcmEgZW4gbGlzdGUgbWVkIHZlcmRpZXINCkNPTFVNTgkJCT0gS09MT05ORQkJCQkjIwlSZXR1cm5lcmVyIGtvbG9ubmVudW1tZXJldCBmb3IgZW4gcmVmZXJhbnNlDQpDT0xVTU5TCQkJPSBLT0xPTk5FUgkJCQkjIwlSZXR1cm5lcmVyIGFudGFsbCBrb2xvbm5lciBpIGVuIHJlZmVyYW5zZQ0KSExPT0tVUAkJCT0gRklOTi5LT0xPTk5FCQkJCSMjCUxldGVyIGkgZGVuIMO4dmVyc3RlIHJhZGVuIGkgZW4gbWF0cmlzZSBvZyByZXR1cm5lcmVyIHZlcmRpZW4gZm9yIGRlbiBhbmdpdHRlIGNlbGxlbg0KSFlQRVJMSU5LCQk9IEhZUEVSS09CTElORwkJCQkjIwlPcHByZXR0ZXIgZW4gc25hcnZlaSBlbGxlciBldCBob3BwIHNvbSDDpXBuZXIgZXQgZG9rdW1lbnQgc29tIGVyIGxhZ3JldCBww6UgZW4gbmV0dHZlcmtzc2VydmVyLCBldCBpbnRyYW5ldHQgZWxsZXIgSW50ZXJuZXR0DQpJTkRFWAkJCT0gSU5ERUtTCQkJCSMjCUJydWtlciBlbiBpbmRla3MgdGlsIMOlIHZlbGdlIGVuIHZlcmRpIGZyYSBlbiByZWZlcmFuc2UgZWxsZXIgbWF0cmlzZQ0KSU5ESVJFQ1QJCT0gSU5ESVJFS1RFCQkJCSMjCVJldHVybmVyZXIgZW4gcmVmZXJhbnNlIGFuZ2l0dCBhdiBlbiB0ZWtzdHZlcmRpDQpMT09LVVAJCQk9IFNMw4UuT1BQCQkJCSMjCVNsw6VyIG9wcCB2ZXJkaWVyIGkgZW4gdmVrdG9yIGVsbGVyIG1hdHJpc2UNCk1BVENICQkJPSBTQU1NRU5MSUdORQkJCQkjIwlTbMOlciBvcHAgdmVyZGllciBpIGVuIHJlZmVyYW5zZSBlbGxlciBtYXRyaXNlDQpPRkZTRVQJCQk9IEZPUlNLWVZOSU5HCQkJCSMjCVJldHVybmVyZXIgZW4gcmVmZXJhbnNlZm9yc2t5dm5pbmcgZnJhIGVuIGdpdHQgcmVmZXJhbnNlDQpST1cJCQk9IFJBRAkJCQkJIyMJUmV0dXJuZXJlciByYWRudW1tZXJldCBmb3IgZW4gcmVmZXJhbnNlDQpST1dTCQkJPSBSQURFUgkJCQkJIyMJUmV0dXJuZXJlciBhbnRhbGwgcmFkZXIgaSBlbiByZWZlcmFuc2UNClJURAkJCT0gUlRECQkJCQkjIwlIZW50ZXIgc2FubnRpZHNkYXRhIGZyYSBldCBwcm9ncmFtIHNvbSBzdMO4dHRlciBDT00tYXV0b21hdGlzZXJpbmcgKGF1dG9tYXRpc2VyaW5nOiBFbiBtw6V0ZSDDpSBhcmJlaWRlIHDDpSBtZWQgcHJvZ3JhbW9iamVrdGVyIGZyYSBldCBhbm5ldCBwcm9ncmFtLSBlbGxlciB1dHZpa2xpbmdzdmVya3TDuHkuIFRpZGxpZ2VyZSBrYWx0IE9MRS1hdXRvbWF0aXNlcmluZy4gQXV0b21hdGlzZXJpbmcgZXIgZW4gYnJhbnNqZXN0YW5kYXJkIG9nIGVuIGZ1bmtzam9uIGkgQ29tcG9uZW50IE9iamVjdCBNb2RlbCAoQ09NKS4pDQpUUkFOU1BPU0UJCT0gVFJBTlNQT05FUgkJCQkjIwlSZXR1cm5lcmVyIHRyYW5zcG9uZXJpbmdlbiBhdiBlbiBtYXRyaXNlDQpWTE9PS1VQCQkJPSBGSU5OLlJBRAkJCQkjIwlMZXRlciBpIGRlbiBmw7hyc3RlIGtvbG9ubmVuIGkgZW4gbWF0cmlzZSBvZyBmbHl0dGVyIGJvcnRvdmVyIHJhZGVuIGZvciDDpSByZXR1cm5lcmUgdmVyZGllbiB0aWwgZW4gY2VsbGUNCg0KDQojIw0KIyMJTWF0aCBhbmQgdHJpZ29ub21ldHJ5IGZ1bmN0aW9ucwkJCQlNYXRlbWF0aWtrLSBvZyB0cmlnb25vbWV0cmlmdW5rc2pvbmVyDQojIw0KQUJTCQkJPSBBQlMJCQkJCSMjCVJldHVybmVyZXIgYWJzb2x1dHR2ZXJkaWVuIHRpbCBldCB0YWxsDQpBQ09TCQkJPSBBUkNDT1MJCQkJIyMJUmV0dXJuZXJlciBhcmN1cyBjb3NpbnVzIHRpbCBldCB0YWxsDQpBQ09TSAkJCT0gQVJDQ09TSAkJCQkjIwlSZXR1cm5lcmVyIGRlbiBpbnZlcnNlIGh5cGVyYm9sc2tlIGNvc2ludXMgdGlsIGV0IHRhbGwNCkFTSU4JCQk9IEFSQ1NJTgkJCQkjIwlSZXR1cm5lcmVyIGFyY3VzIHNpbnVzIHRpbCBldCB0YWxsDQpBU0lOSAkJCT0gQVJDU0lOSAkJCQkjIwlSZXR1cm5lcmVyIGRlbiBpbnZlcnNlIGh5cGVyYm9sc2tlIHNpbnVzIHRpbCBldCB0YWxsDQpBVEFOCQkJPSBBUkNUQU4JCQkJIyMJUmV0dXJuZXJlciBhcmN1cyB0YW5nZW5zIHRpbCBldCB0YWxsDQpBVEFOMgkJCT0gQVJDVEFOMgkJCQkjIwlSZXR1cm5lcmVyIGFyY3VzIHRhbmdlbnMgZnJhIHgtIG9nIHkta29vcmRpbmF0ZXINCkFUQU5ICQkJPSBBUkNUQU5ICQkJCSMjCVJldHVybmVyZXIgZGVuIGludmVyc2UgaHlwZXJib2xza2UgdGFuZ2VucyB0aWwgZXQgdGFsbA0KQ0VJTElORwkJCT0gQVZSVU5ELkdKRUxERU5ERS5NVUxUSVBMVU0JCSMjCVJ1bmRlciBhdiBldCB0YWxsIHRpbCBuw6ZybWVzdGUgaGVsdGFsbCBlbGxlciB0aWwgbsOmcm1lc3RlIHNpZ25pZmlrYW50ZSBtdWx0aXBsdW0NCkNPTUJJTgkJCT0gS09NQklOQVNKT04JCQkJIyMJUmV0dXJuZXJlciBhbnRhbGwga29tYmluYXNqb25lciBmb3IgZXR0IGdpdHQgYW50YWxsIG9iamVrdGVyDQpDT1MJCQk9IENPUwkJCQkJIyMJUmV0dXJuZXJlciBjb3NpbnVzIHRpbCBldCB0YWxsDQpDT1NICQkJPSBDT1NICQkJCQkjIwlSZXR1cm5lcmVyIGRlbiBoeXBlcmJvbHNrZSBjb3NpbnVzIHRpbCBldCB0YWxsDQpERUdSRUVTCQkJPSBHUkFERVIJCQkJIyMJS29udmVydGVyZXIgcmFkaWFuZXIgdGlsIGdyYWRlcg0KRVZFTgkJCT0gQVZSVU5ELlRJTC5QQVJUQUxMCQkJIyMJUnVuZGVyIGF2IGV0IHRhbGwgb3Bwb3ZlciB0aWwgbsOmcm1lc3RlIGhlbHRhbGwgc29tIGVyIGV0IHBhcnRhbGwNCkVYUAkJCT0gRUtTUAkJCQkJIyMJUmV0dXJuZXJlciBlIG9wcGjDuHlkIGkgZW4gYW5naXR0IHBvdGVucw0KRkFDVAkJCT0gRkFLVUxURVQJCQkJIyMJUmV0dXJuZXJlciBmYWt1bHRldCB0aWwgZXQgdGFsbA0KRkFDVERPVUJMRQkJPSBET0JCRUxGQUtUCQkJCSMjCVJldHVybmVyZXIgZXQgdGFsbHMgZG9ibGUgZmFrdWx0ZXQNCkZMT09SCQkJPSBBVlJVTkQuR0pFTERFTkRFLk1VTFRJUExVTS5ORUQJIyMJQXZydW5kZXIgZXQgdGFsbCBuZWRvdmVyLCBtb3QgbnVsbA0KR0NECQkJPSBTRkYJCQkJCSMjCVJldHVybmVyZXIgaMO4eWVzdGUgZmVsbGVzIGRpdmlzb3INCklOVAkJCT0gSEVMVEFMTAkJCQkjIwlBdnJ1bmRlciBldCB0YWxsIG5lZG92ZXIgdGlsIG7DpnJtZXN0ZSBoZWx0YWxsDQpMQ00JCQk9IE1GTQkJCQkJIyMJUmV0dXJuZXJlciBtaW5zdGUgZmVsbGVzIG11bHRpcGx1bQ0KTE4JCQk9IExOCQkJCQkjIwlSZXR1cm5lcmVyIGRlbiBuYXR1cmxpZ2UgbG9nYXJpdG1lbiB0aWwgZXQgdGFsbA0KTE9HCQkJPSBMT0cJCQkJCSMjCVJldHVybmVyZXIgbG9nYXJpdG1lbiBmb3IgZXQgdGFsbCB0aWwgZXQgYW5naXR0IGdydW5udGFsbA0KTE9HMTAJCQk9IExPRzEwCQkJCQkjIwlSZXR1cm5lcmVyIGxvZ2FyaXRtZW4gbWVkIGdydW5udGFsbCAxMCBmb3IgZXQgdGFsbA0KTURFVEVSTQkJCT0gTURFVEVSTQkJCQkjIwlSZXR1cm5lcmVyIG1hdHJpc2VkZXRlcm1pbmFudGVuIHRpbCBlbiBtYXRyaXNlDQpNSU5WRVJTRQkJPSBNSU5WRVJTCQkJCSMjCVJldHVybmVyZXIgZGVuIGludmVyc2UgbWF0cmlzZW4gdGlsIGVuIG1hdHJpc2UNCk1NVUxUCQkJPSBNTVVMVAkJCQkJIyMJUmV0dXJuZXJlciBtYXRyaXNlcHJvZHVrdGV0IGF2IHRvIG1hdHJpc2VyDQpNT0QJCQk9IFJFU1QJCQkJCSMjCVJldHVybmVyZXIgcmVzdGVuIGZyYSBlbiBkaXZpc2pvbg0KTVJPVU5ECQkJPSBNUlVORAkJCQkJIyMJUmV0dXJuZXJlciBldCB0YWxsIGF2cnVuZGV0IHRpbCBkZXQgw7huc2tlZGUgbXVsdGlwbHVtDQpNVUxUSU5PTUlBTAkJPSBNVUxUSU5PTUlORUxMCQkJCSMjCVJldHVybmVyZXIgZGV0IG11bHRpbm9taW5lbGxlIGZvciBldCBzZXR0IG1lZCB0YWxsDQpPREQJCQk9IEFWUlVORC5USUwuT0RERVRBTEwJCQkjIwlSdW5kZXIgYXYgZXQgdGFsbCBvcHBvdmVyIHRpbCBuw6ZybWVzdGUgaGVsdGFsbCBzb20gZXIgZXQgb2RkZXRhbGwNClBJCQkJPSBQSQkJCQkJIyMJUmV0dXJuZXJlciB2ZXJkaWVuIGF2IHBpDQpQT1dFUgkJCT0gT1BQSMOYWUQuSQkJCQkjIwlSZXR1cm5lcmVyIHJlc3VsdGF0ZXQgYXYgZXQgdGFsbCBvcHBow7h5ZCBpIGVuIHBvdGVucw0KUFJPRFVDVAkJCT0gUFJPRFVLVAkJCQkjIwlNdWx0aXBsaXNlcmVyIGFyZ3VtZW50ZW5lDQpRVU9USUVOVAkJPSBLVk9USUVOVAkJCQkjIwlSZXR1cm5lcmVyIGhlbHRhbGxzZGVsZW4gYXYgZW4gZGl2aXNqb24NClJBRElBTlMJCQk9IFJBRElBTkVSCQkJCSMjCUtvbnZlcnRlcmVyIGdyYWRlciB0aWwgcmFkaWFuZXINClJBTkQJCQk9IFRJTEZFTERJRwkJCQkjIwlSZXR1cm5lcmVyIGV0IHRpbGZlbGRpZyB0YWxsIG1lbGxvbSAwIG9nIDENClJBTkRCRVRXRUVOCQk9IFRJTEZFTERJR01FTExPTQkJCSMjCVJldHVybmVyZXIgZXQgdGlsZmVsZGlnIHRhbGwgaW5uZW5mb3IgZXQgYW5naXR0IG9tcsOlZGUNClJPTUFOCQkJPSBST01FUlRBTEwJCQkJIyMJS29udmVydGVyZXIgdmFubGlnZSB0YWxsIHRpbCByb21lcnRhbGwsIHNvbSB0ZWtzdA0KUk9VTkQJCQk9IEFWUlVORAkJCQkjIwlBdnJ1bmRlciBldCB0YWxsIHRpbCBldCBhbmdpdHQgYW50YWxsIHNpZnJlDQpST1VORERPV04JCT0gQVZSVU5ELk5FRAkJCQkjIwlBdnJ1bmRlciBldCB0YWxsIG5lZG92ZXIsIG1vdCBudWxsDQpST1VORFVQCQkJPSBBVlJVTkQuT1BQCQkJCSMjCVJ1bmRlciBhdiBldCB0YWxsIG9wcG92ZXIsIGJvcnQgZnJhIG51bGwNClNFUklFU1NVTQkJPSBTVU1NRVIuUkVLS0UJCQkJIyMJUmV0dXJuZXJlciBzdW1tZW4gYXYgZW4gZ2VvbWV0cmlzayByZWtrZSwgYmFzZXJ0IHDDpSBmb3JtZWxlbg0KU0lHTgkJCT0gRk9SVEVHTgkJCQkjIwlSZXR1cm5lcmVyIGZvcnRlZ25ldCBmb3IgZXQgdGFsbA0KU0lOCQkJPSBTSU4JCQkJCSMjCVJldHVybmVyZXIgc2ludXMgdGlsIGVuIGdpdHQgdmlua2VsDQpTSU5ICQkJPSBTSU5ICQkJCQkjIwlSZXR1cm5lcmVyIGRlbiBoeXBlcmJvbHNrZSBzaW51cyB0aWwgZXQgdGFsbA0KU1FSVAkJCT0gUk9UCQkJCQkjIwlSZXR1cm5lcmVyIGVuIHBvc2l0aXYga3ZhZHJhdHJvdA0KU1FSVFBJCQkJPSBST1RQSQkJCQkJIyMJUmV0dXJuZXJlciBrdmFkcmF0cm90ZW4gYXYgKHRhbGwgKiBwaSkNClNVQlRPVEFMCQk9IERFTFNVTQkJCQkjIwlSZXR1cm5lcmVyIGVuIGRlbHN1bSBpIGVuIGxpc3RlIGVsbGVyIGRhdGFiYXNlDQpTVU0JCQk9IFNVTU1FUgkJCQkjIwlMZWdnZXIgc2FtbWVuIGFyZ3VtZW50ZW5lDQpTVU1JRgkJCT0gU1VNTUVSSFZJUwkJCQkjIwlMZWdnZXIgc2FtbWVuIGNlbGxlbmUgYW5naXR0IHZlZCBldCBnaXR0IHZpbGvDpXINClNVTUlGUwkJCT0gU1VNTUVSLkhWSVMuU0VUVAkJCSMjCUxlZ2dlciBzYW1tZW4gY2VsbGVuZSBpIGV0IG9tcsOlZGUgc29tIG9wcGZ5bGxlciBmbGVyZSB2aWxrw6VyDQpTVU1QUk9EVUNUCQk9IFNVTU1FUlBST0RVS1QJCQkJIyMJUmV0dXJuZXJlciBzdW1tZW4gYXYgcHJvZHVrdGVuZSBhdiB0aWxzdmFyZW5kZSBtYXRyaXNla29tcG9uZW50ZXINClNVTVNRCQkJPSBTVU1NRVJLVkFEUkFUCQkJCSMjCVJldHVybmVyZXIga3ZhZHJhdHN1bW1lbiBhdiBhcmd1bWVudGVuZQ0KU1VNWDJNWTIJCT0gU1VNTUVSWDJNWTIJCQkJIyMJUmV0dXJuZXJlciBzdW1tZW4gYXYgZGlmZmVyYW5zZW4gYXYga3ZhZHJhdGVuZSBmb3IgdGlsc3ZhcmVuZGUgdmVyZGllciBpIHRvIG1hdHJpc2VyDQpTVU1YMlBZMgkJPSBTVU1NRVJYMlBZMgkJCQkjIwlSZXR1cm5lcmVyIHN1bW1lbiBhdiBrdmFkcmF0c3VtbWVuZSBmb3IgdGlsc3ZhcmVuZGUgdmVyZGllciBpIHRvIG1hdHJpc2VyDQpTVU1YTVkyCQkJPSBTVU1NRVJYTVkyCQkJCSMjCVJldHVybmVyZXIgc3VtbWVuIGF2IGt2YWRyYXRlbmUgYXYgZGlmZmVyYW5zZW4gZm9yIHRpbHN2YXJlbmRlIHZlcmRpZXIgaSB0byBtYXRyaXNlcg0KVEFOCQkJPSBUQU4JCQkJCSMjCVJldHVybmVyZXIgdGFuZ2VucyBmb3IgZXQgdGFsbA0KVEFOSAkJCT0gVEFOSAkJCQkJIyMJUmV0dXJuZXJlciBkZW4gaHlwZXJib2xza2UgdGFuZ2VucyBmb3IgZXQgdGFsbA0KVFJVTkMJCQk9IEFWS09SVAkJCQkjIwlLb3J0ZXIgYXYgZXQgdGFsbCB0aWwgZXQgaGVsdGFsbA0KDQoNCiMjDQojIwlTdGF0aXN0aWNhbCBmdW5jdGlvbnMJCQkJCVN0YXRpc3Rpc2tlIGZ1bmtzam9uZXINCiMjDQpBVkVERVYJCQk9IEdKRU5OT01TTklUVFNBVlZJSwkJCSMjCVJldHVybmVyZXIgZGF0YXB1bmt0ZW5lcyBnamVubm9tc25pdHRsaWdlIGFic29sdXR0YXZ2aWsgZnJhIG1pZGRlbHZlcmRpZW4NCkFWRVJBR0UJCQk9IEdKRU5OT01TTklUVAkJCQkjIwlSZXR1cm5lcmVyIGdqZW5ub21zbml0dGV0IGZvciBhcmd1bWVudGVuZQ0KQVZFUkFHRUEJCT0gR0pFTk5PTVNOSVRUQQkJCQkjIwlSZXR1cm5lcmVyIGdqZW5ub21zbml0dGV0IGZvciBhcmd1bWVudGVuZSwgaW5rbHVkZXJ0IHRhbGwsIHRla3N0IG9nIGxvZ2lza2UgdmVyZGllcg0KQVZFUkFHRUlGCQk9IEdKRU5OT01TTklUVEhWSVMJCQkjIwlSZXR1cm5lcmVyIGdqZW5ub21zbml0dGV0IChhcml0bWV0aXNrIGdqZW5ub21zbml0dCkgYXYgYWxsZSBjZWxsZW5lIGkgZXQgb21yw6VkZSBzb20gb3BwZnlsbGVyIGV0IGJlc3RlbXQgdmlsa8Olcg0KQVZFUkFHRUlGUwkJPSBHSkVOTk9NU05JVFQuSFZJUy5TRVRUCQkjIwlSZXR1cm5lcmVyIGdqZW5ub21zbml0dGV0IChhcml0bWV0aXNrIG1pZGRlbHZlcmRpKSBhdiBhbGxlIGNlbGxlciBzb20gb3BwZnlsbGVyIGZsZXJlIHZpbGvDpXIuDQpCRVRBRElTVAkJPSBCRVRBLkZPUkRFTElORwkJCSMjCVJldHVybmVyZXIgZGVuIGt1bXVsYXRpdmUgYmV0YWZvcmRlbGluZ3NmdW5rc2pvbmVuDQpCRVRBSU5WCQkJPSBJTlZFUlMuQkVUQS5GT1JERUxJTkcJCQkjIwlSZXR1cm5lcmVyIGRlbiBpbnZlcnNlIHZlcmRpZW4gdGlsIGZvcmRlbGluZ3NmdW5rc2pvbmVuIGZvciBlbiBhbmdpdHQgYmV0YWZvcmRlbGluZw0KQklOT01ESVNUCQk9IEJJTk9NLkZPUkRFTElORwkJCSMjCVJldHVybmVyZXIgZGVuIGluZGl2aWR1ZWxsZSBiaW5vbWlza2Ugc2FubnN5bmxpZ2hldHNmb3JkZWxpbmdlbg0KQ0hJRElTVAkJCT0gS0pJLkZPUkRFTElORwkJCQkjIwlSZXR1cm5lcmVyIGRlbiBlbnNpZGlnZSBzYW5uc3lubGlnaGV0ZW4gZm9yIGVuIGtqaWt2YWRyZXJ0IGZvcmRlbGluZw0KQ0hJSU5WCQkJPSBJTlZFUlMuS0pJLkZPUkRFTElORwkJCSMjCVJldHVybmVyZXIgZGVuIGludmVyc2UgYXYgZGVuIGVuc2lkaWdlIHNhbm5zeW5saWdoZXRlbiBmb3IgZGVuIGtqaWt2YWRyZXJ0ZSBmb3JkZWxpbmdlbg0KQ0hJVEVTVAkJCT0gS0pJLlRFU1QJCQkJIyMJVXRmw7hyZXIgdGVzdGVuIGZvciB1YXZoZW5naWdoZXQNCkNPTkZJREVOQ0UJCT0gS09ORklERU5TCQkJCSMjCVJldHVybmVyZXIga29uZmlkZW5zaW50ZXJ2YWxsZXQgdGlsIGdqZW5ub21zbml0dGV0IGZvciBlbiBwb3B1bGFzam9uDQpDT1JSRUwJCQk9IEtPUlJFTEFTSk9OCQkJCSMjCVJldHVybmVyZXIga29ycmVsYXNqb25za29lZmZpc2llbnRlbiBtZWxsb20gdG8gZGF0YXNldHQNCkNPVU5UCQkJPSBBTlRBTEwJCQkJIyMJVGVsbGVyIGh2b3IgbWFuZ2UgdGFsbCBzb20gZXIgaSBhcmd1bWVudGxpc3Rlbg0KQ09VTlRBCQkJPSBBTlRBTExBCQkJCSMjCVRlbGxlciBodm9yIG1hbmdlIHZlcmRpZXIgc29tIGVyIGkgYXJndW1lbnRsaXN0ZW4NCkNPVU5UQkxBTksJCT0gVEVMTEJMQU5LRQkJCQkjIwlUZWxsZXIgYW50YWxsIHRvbW1lIGNlbGxlciBpIGV0IG9tcsOlZGUuDQpDT1VOVElGCQkJPSBBTlRBTEwuSFZJUwkJCQkjIwlUZWxsZXIgYW50YWxsIGNlbGxlciBpIGV0IG9tcsOlZGUgc29tIG9wcGZ5bGxlciBnaXR0ZSB2aWxrw6VyDQpDT1VOVElGUwkJPSBBTlRBTEwuSFZJUy5TRVRUCQkJIyMJVGVsbGVyIGFudGFsbGV0IGlra2UtdG9tbWUgY2VsbGVyIGkgZXQgb21yw6VkZSBzb20gb3BwZnlsbGVyIGZsZXJlIHZpbGvDpXINCkNPVkFSCQkJPSBLT1ZBUklBTlMJCQkJIyMJUmV0dXJuZXJlciBrb3ZhcmlhbnNlbiwgZ2plbm5vbXNuaXR0ZXQgYXYgcHJvZHVrdGVuZSBhdiBwYXJ2aXNlIGF2dmlrDQpDUklUQklOT00JCT0gR1JFTlNFLkJJTk9NCQkJCSMjCVJldHVybmVyZXIgZGVuIG1pbnN0ZSB2ZXJkaWVuIGRlciBkZW4ga3VtdWxhdGl2ZSBiaW5vbWlza2UgZm9yZGVsaW5nZW4gZXIgbWluZHJlIGVubiBlbGxlciBsaWsgZW4gdmlsa8OlcnN2ZXJkaQ0KREVWU1EJCQk9IEFWVklLLktWQURSRVJUCQkJIyMJUmV0dXJuZXJlciBzdW1tZW4gYXYga3ZhZHJlcnRlIGF2dmlrDQpFWFBPTkRJU1QJCT0gRUtTUC5GT1JERUxJTkcJCQkjIwlSZXR1cm5lcmVyIGVrc3BvbmVudGlhbGZvcmRlbGluZ2VuDQpGRElTVAkJCT0gRkZPUkRFTElORwkJCQkjIwlSZXR1cm5lcmVyIEYtc2FubnN5bmxpZ2hldHNmb3JkZWxpbmdlbg0KRklOVgkJCT0gRkZPUkRFTElORy5JTlZFUlMJCQkjIwlSZXR1cm5lcmVyIGRlbiBpbnZlcnNlIGF2IGRlbiBzYW5uc3lubGlnZSBGLWZvcmRlbGluZ2VuDQpGSVNIRVIJCQk9IEZJU0hFUgkJCQkjIwlSZXR1cm5lcmVyIEZpc2hlci10cmFuc2Zvcm1hc2pvbmVuDQpGSVNIRVJJTlYJCT0gRklTSEVSSU5WCQkJCSMjCVJldHVybmVyZXIgZGVuIGludmVyc2UgYXYgRmlzaGVyLXRyYW5zZm9ybWFzam9uZW4NCkZPUkVDQVNUCQk9IFBST0dOT1NFCQkJCSMjCVJldHVybmVyZXIgZW4gdmVyZGkgbGFuZ3MgZW4gbGluZcOmciB0cmVuZA0KRlJFUVVFTkNZCQk9IEZSRUtWRU5TCQkJCSMjCVJldHVybmVyZXIgZW4gZnJla3ZlbnNkaXN0cmlidXNqb24gc29tIGVuIGxvZGRyZXR0IG1hdHJpc2UNCkZURVNUCQkJPSBGVEVTVAkJCQkJIyMJUmV0dXJuZXJlciByZXN1bHRhdGV0IGF2IGVuIEYtdGVzdA0KR0FNTUFESVNUCQk9IEdBTU1BRk9SREVMSU5HCQkJIyMJUmV0dXJuZXJlciBnYW1tYWZvcmRlbGluZ2VuDQpHQU1NQUlOVgkJPSBHQU1NQUlOVgkJCQkjIwlSZXR1cm5lcmVyIGRlbiBpbnZlcnNlIGF2IGRlbiBnYW1tYWt1bXVsYXRpdmUgZm9yZGVsaW5nZW4NCkdBTU1BTE4JCQk9IEdBTU1BTE4JCQkJIyMJUmV0dXJuZXJlciBkZW4gbmF0dXJsaWdlIGxvZ2FyaXRtZW4gdGlsIGdhbW1hZnVua3Nqb25lbiBHKHgpDQpHRU9NRUFOCQkJPSBHSkVOTk9NU05JVFQuR0VPTUVUUklTSwkJIyMJUmV0dXJuZXJlciBkZW4gZ2VvbWV0cmlza2UgbWlkZGVsdmVyZGllbg0KR1JPV1RICQkJPSBWRUtTVAkJCQkJIyMJUmV0dXJuZXJlciB2ZXJkaWVyIGxhbmdzIGVuIGVrc3BvbmVudGllbGwgdHJlbmQNCkhBUk1FQU4JCQk9IEdKRU5OT01TTklUVC5IQVJNT05JU0sJCSMjCVJldHVybmVyZXIgZGVuIGhhcm1vbmlza2UgbWlkZGVsdmVyZGllbg0KSFlQR0VPTURJU1QJCT0gSFlQR0VPTS5GT1JERUxJTkcJCQkjIwlSZXR1cm5lcmVyIGRlbiBoeXBlcmdlb21ldHJpc2tlIGZvcmRlbGluZ2VuDQpJTlRFUkNFUFQJCT0gU0tKw4ZSSU5HU1BVTktUCQkJIyMJUmV0dXJuZXJlciBza2rDpnJpbmdzcHVua3RldCB0aWwgZGVuIGxpbmXDpnJlIHJlZ3Jlc2pvbnNsaW5qZW4NCktVUlQJCQk9IEtVUlQJCQkJCSMjCVJldHVybmVyZXIga3VydG9zZW4gdGlsIGV0IGRhdGFzZXR0DQpMQVJHRQkJCT0gTi5TVMOYUlNUCQkJCSMjCVJldHVybmVyZXIgZGVuIG4tdGUgc3TDuHJzdGUgdmVyZGllbiBpIGV0IGRhdGFzZXR0DQpMSU5FU1QJCQk9IFJFVFRMSU5KRQkJCQkjIwlSZXR1cm5lcmVyIHBhcmFtZXRlcm5lIHRpbCBlbiBsaW5lw6ZyIHRyZW5kDQpMT0dFU1QJCQk9IEtVUlZFCQkJCQkjIwlSZXR1cm5lcmVyIHBhcmFtZXRlcm5lIHRpbCBlbiBla3Nwb25lbnRpZWxsIHRyZW5kDQpMT0dJTlYJCQk9IExPR0lOVgkJCQkjIwlSZXR1cm5lcmVyIGRlbiBpbnZlcnNlIGxvZ25vcm1hbGUgZm9yZGVsaW5nZW4NCkxPR05PUk1ESVNUCQk9IExPR05PUk1GT1JECQkJCSMjCVJldHVybmVyZXIgZGVuIGt1bXVsYXRpdmUgbG9nbm9ybWFsZSBmb3JkZWxpbmdlbg0KTUFYCQkJPSBTVMOYUlNUCQkJCSMjCVJldHVybmVyZXIgbWFrc2ltdW1zdmVyZGllbiBpIGVuIGFyZ3VtZW50bGlzdGUNCk1BWEEJCQk9IE1BS1NBCQkJCQkjIwlSZXR1cm5lcmVyIG1ha3NpbXVtc3ZlcmRpZW4gaSBlbiBhcmd1bWVudGxpc3RlLCBpbmtsdWRlcnQgdGFsbCwgdGVrc3Qgb2cgbG9naXNrZSB2ZXJkaWVyDQpNRURJQU4JCQk9IE1FRElBTgkJCQkjIwlSZXR1cm5lcmVyIG1lZGlhbmVuIHRpbCB0YWxsZW5lIHNvbSBlciBnaXR0DQpNSU4JCQk9IE1JTgkJCQkJIyMJUmV0dXJuZXJlciBtaW5pbXVtc3ZlcmRpZW4gaSBlbiBhcmd1bWVudGxpc3RlDQpNSU5BCQkJPSBNSU5BCQkJCQkjIwlSZXR1cm5lcmVyIGRlbiBtaW5zdGUgdmVyZGllbiBpIGVuIGFyZ3VtZW50bGlzdGUsIGlua2x1ZGVydCB0YWxsLCB0ZWtzdCBvZyBsb2dpc2tlIHZlcmRpZXINCk1PREUJCQk9IE1PRFVTCQkJCQkjIwlSZXR1cm5lcmVyIGRlbiB2YW5saWdzdGUgdmVyZGllbiBpIGV0IGRhdGFzZXR0DQpORUdCSU5PTURJU1QJCT0gTkVHQklOT00uRk9SREVMSU5HCQkJIyMJUmV0dXJuZXJlciBkZW4gbmVnYXRpdmUgYmlub21pc2tlIGZvcmRlbGluZ2VuDQpOT1JNRElTVAkJPSBOT1JNQUxGT1JERUxJTkcJCQkjIwlSZXR1cm5lcmVyIGRlbiBrdW11bGF0aXZlIG5vcm1hbGZvcmRlbGluZ2VuDQpOT1JNSU5WCQkJPSBOT1JNSU5WCQkJCSMjCVJldHVybmVyZXIgZGVuIGludmVyc2Uga3VtdWxhdGl2ZSBub3JtYWxmb3JkZWxpbmdlbg0KTk9STVNESVNUCQk9IE5PUk1TRk9SREVMSU5HCQkJIyMJUmV0dXJuZXJlciBzdGFuZGFyZCBrdW11bGF0aXYgbm9ybWFsZm9yZGVsaW5nDQpOT1JNU0lOVgkJPSBOT1JNU0lOVgkJCQkjIwlSZXR1cm5lcmVyIGRlbiBpbnZlcnNlIGF2IGRlbiBkZW4ga3VtdWxhdGl2ZSBzdGFuZGFyZCBub3JtYWxmb3JkZWxpbmdlbg0KUEVBUlNPTgkJCT0gUEVBUlNPTgkJCQkjIwlSZXR1cm5lcmVyIHByb2R1a3Rtb21lbnRrb3JyZWxhc2pvbnNrb2VmZmlzaWVudGVuLCBQZWFyc29uDQpQRVJDRU5USUxFCQk9IFBFUlNFTlRJTAkJCQkjIwlSZXR1cm5lcmVyIGRlbiBuLXRlIHBlcnNlbnRpbCBhdiB2ZXJkaWVuZSBpIGV0IG9tcsOlZGUNClBFUkNFTlRSQU5LCQk9IFBST1NFTlRERUwJCQkJIyMJUmV0dXJuZXJlciBwcm9zZW50cmFuZ2VyaW5nZW4gYXYgZW4gdmVyZGkgaSBldCBkYXRhc2V0dA0KUEVSTVVUCQkJPSBQRVJNVVRFUgkJCQkjIwlSZXR1cm5lcmVyIGFudGFsbCBwZXJtdXRhc2pvbmVyIGZvciBldCBnaXR0IGFudGFsbCBvYmpla3Rlcg0KUE9JU1NPTgkJCT0gUE9JU1NPTgkJCQkjIwlSZXR1cm5lcmVyIFBvaXNzb25zIHNhbm5zeW5saWdoZXRzZm9yZGVsaW5nDQpQUk9CCQkJPSBTQU5OU1lOTElHCQkJCSMjCVJldHVybmVyZXIgc2FubnN5bmxpZ2hldGVuIGZvciBhdCB2ZXJkaWVyIGkgZXQgb21yw6VkZSBsaWdnZXIgbWVsbG9tIHRvIGdyZW5zZXINClFVQVJUSUxFCQk9IEtWQVJUSUwJCQkJIyMJUmV0dXJuZXJlciBrdmFydGlsZW4gdGlsIGV0IGRhdGFzZXR0DQpSQU5LCQkJPSBSQU5HCQkJCQkjIwlSZXR1cm5lcmVyIHJhbmdlcmluZ2VuIGF2IGV0IHRhbGwsIGVsbGVyIHBsYXNzZW4gdGFsbGV0IGhhciBpIGVuIHJla2tlDQpSU1EJCQk9IFJLVkFEUkFUCQkJCSMjCVJldHVybmVyZXIga3ZhZHJhdGV0IGF2IHByb2R1a3Rtb21lbnRrb3JyZWxhc2pvbnNrb2VmZmlzaWVudGVuIChQZWFyc29ucyByKQ0KU0tFVwkJCT0gU0tKRVZGT1JERUxJTkcJCQkjIwlSZXR1cm5lcmVyIHNramV2aGV0ZW4gaSBlbiBmb3JkZWxpbmcNClNMT1BFCQkJPSBTVElHTklOR1NUQUxMCQkJCSMjCVJldHVybmVyZXIgc3RpZ25pbmd0YWxsZXQgZm9yIGRlbiBsaW5lw6ZyZSByZWdyZXNqb25zbGluamVuDQpTTUFMTAkJCT0gTi5NSU5TVAkJCQkjIwlSZXR1cm5lcmVyIGRlbiBuLXRlIG1pbnN0ZSB2ZXJkaWVuIGkgZXQgZGF0YXNldHQNClNUQU5EQVJESVpFCQk9IE5PUk1BTElTRVIJCQkJIyMJUmV0dXJuZXJlciBlbiBub3JtYWxpc2VydCB2ZXJkaQ0KU1RERVYJCQk9IFNUREFWCQkJCQkjIwlFc3RpbWVyZSBzdGFuZGFyZGF2dmlrIHDDpSBncnVubmxhZyBhdiBldCB1dHZhbGcNClNUREVWQQkJCT0gU1REQVZWSUtBCQkJCSMjCUVzdGltZXJlciBzdGFuZGFyZGF2dmlrIGJhc2VydCBww6UgZXQgdXR2YWxnLCBpbmtsdWRlcnQgdGFsbCwgdGVrc3Qgb2cgbG9naXNrZSB2ZXJkaWVyDQpTVERFVlAJCQk9IFNUREFWUAkJCQkjIwlCZXJlZ25lciBzdGFuZGFyZGF2dmlrIGJhc2VydCBww6UgaGVsZSBwb3B1bGFzam9uZW4NClNUREVWUEEJCQk9IFNUREFWVklLUEEJCQkJIyMJQmVyZWduZXIgc3RhbmRhcmRhdnZpayBiYXNlcnQgcMOlIGhlbGUgcG9wdWxhc2pvbmVuLCBpbmtsdWRlcnQgdGFsbCwgdGVrc3Qgb2cgbG9naXNrZSB2ZXJkaWVyDQpTVEVZWAkJCT0gU1RBTkRBUkRGRUlMCQkJCSMjCVJldHVybmVyZXIgc3RhbmRhcmRmZWlsZW4gZm9yIGRlbiBwcmVkaWtlcnRlIHktdmVyZGllbiBmb3IgaHZlciB4IGkgcmVncmVzam9uZW4NClRESVNUCQkJPSBURk9SREVMSU5HCQkJCSMjCVJldHVybmVyZXIgZW4gU3R1ZGVudCB0LWZvcmRlbGluZw0KVElOVgkJCT0gVElOVgkJCQkJIyMJUmV0dXJuZXJlciBkZW4gaW52ZXJzZSBTdHVkZW50IHQtZm9yZGVsaW5nZW4NClRSRU5ECQkJPSBUUkVORAkJCQkJIyMJUmV0dXJuZXJlciB2ZXJkaWVyIGxhbmdzIGVuIGxpbmXDpnIgdHJlbmQNClRSSU1NRUFOCQk9IFRSSU1NRVQuR0pFTk5PTVNOSVRUCQkJIyMJUmV0dXJuZXJlciBkZW4gaW50ZXJuZSBtaWRkZWx2ZXJkaWVuIHRpbCBldCBkYXRhc2V0dA0KVFRFU1QJCQk9IFRURVNUCQkJCQkjIwlSZXR1cm5lcmVyIHNhbm5zeW5saWdoZXRlbiBhc3Nvc2llcnQgbWVkIGVuIFN0dWRlbnQgdC10ZXN0DQpWQVIJCQk9IFZBUklBTlMJCQkJIyMJRXN0aW1lcmVyIHZhcmlhbnMgYmFzZXJ0IHDDpSBldCB1dHZhbGcNClZBUkEJCQk9IFZBUklBTlNBCQkJCSMjCUVzdGltZXJlciB2YXJpYW5zIGJhc2VydCBww6UgZXQgdXR2YWxnLCBpbmtsdWRlcnQgdGFsbCwgdGVrc3Qgb2cgbG9naXNrZSB2ZXJkaWVyDQpWQVJQCQkJPSBWQVJJQU5TUAkJCQkjIwlCZXJlZ25lciB2YXJpYW5zIGJhc2VydCBww6UgaGVsZSBwb3B1bGFzam9uZW4NClZBUlBBCQkJPSBWQVJJQU5TUEEJCQkJIyMJQmVyZWduZXIgdmFyaWFucyBiYXNlcnQgcMOlIGhlbGUgcG9wdWxhc2pvbmVuLCBpbmtsdWRlcnQgdGFsbCwgdGVrc3Qgb2cgbG9naXNrZSB2ZXJkaWVyDQpXRUlCVUxMCQkJPSBXRUlCVUxMLkZPUkRFTElORwkJCSMjCVJldHVybmVyZXIgV2VpYnVsbC1mb3JkZWxpbmdlbg0KWlRFU1QJCQk9IFpURVNUCQkJCQkjIwlSZXR1cm5lcmVyIGRlbiBlbnNpZGlnZSBzYW5uc3lubGlnaGV0c3ZlcmRpZW4gZm9yIGVuIHotdGVzdA0KDQoNCiMjDQojIwlUZXh0IGZ1bmN0aW9ucwkJCQkJCVRla3N0ZnVua3Nqb25lcg0KIyMNCkFTQwkJCT0gU1RJR0VOREUJCQkJIyMJRW5kcmVyIGZ1bGxicmVkZGVzIChkb2JiZWx0Ynl0ZSkgZW5nZWxza2UgYm9rc3RhdmVyIGVsbGVyIGthdGFrYW5hIGkgZW4gdGVnbnN0cmVuZywgdGlsIGhhbHZicmVkZGVzIChlbmtlbHRieXRlKSB0ZWduDQpCQUhUVEVYVAkJPSBCQUhUVEVLU1QJCQkJIyMJS29udmVydGVyZXIgZXQgdGFsbCB0aWwgdGVrc3QsIG9nIGJydWtlciB2YWx1dGFmb3JtYXRldCDDnyAoYmFodCkNCkNIQVIJCQk9IFRFR05LT0RFCQkJCSMjCVJldHVybmVyZXIgdGVnbmV0IHNvbSBzdmFyZXIgdGlsIGtvZGVudW1tZXJldA0KQ0xFQU4JCQk9IFJFTlNLCQkJCQkjIwlGamVybmVyIGFsbGUgdGVnbiBzb20gaWtrZSBrYW4gc2tyaXZlcyB1dCwgZnJhIHRla3N0ZW4NCkNPREUJCQk9IEtPREUJCQkJCSMjCVJldHVybmVyZXIgZW4gbnVtZXJpc2sga29kZSBmb3IgZGV0IGbDuHJzdGUgdGVnbmV0IGkgZW4gdGVrc3RzdHJlbmcNCkNPTkNBVEVOQVRFCQk9IEtKRURFLlNBTU1FTgkJCQkjIwlTbMOlciBzYW1tZW4gZmxlcmUgdGVrc3RlbGVtZW50ZXIgdGlsIGV0dCB0ZWtzdGVsZW1lbnQNCkRPTExBUgkJCT0gVkFMVVRBCQkJCSMjCUtvbnZlcnRlcmVyIGV0IHRhbGwgdGlsIHRla3N0LCBvZyBicnVrZXIgdmFsdXRhZm9ybWF0ZXQgJCAoZG9sbGFyKQ0KRVhBQ1QJCQk9IEVLU0FLVAkJCQkjIwlLb250cm9sbGVyZXIgb20gdG8gdGVrc3R2ZXJkaWVyIGVyIGxpa2UNCkZJTkQJCQk9IEZJTk4JCQkJCSMjCUZpbm5lciBlbiB0ZWtzdHZlcmRpIGlubmUgaSBlbiBhbm5lbiAoc2tpbGxlciBtZWxsb20gc3RvcmUgb2cgc23DpSBib2tzdGF2ZXIpDQpGSU5EQgkJCT0gRklOTkIJCQkJCSMjCUZpbm5lciBlbiB0ZWtzdHZlcmRpIGlubmUgaSBlbiBhbm5lbiAoc2tpbGxlciBtZWxsb20gc3RvcmUgb2cgc23DpSBib2tzdGF2ZXIpDQpGSVhFRAkJCT0gRkFTVFNBVFQJCQkJIyMJRm9ybWF0ZXJlciBldCB0YWxsIHNvbSB0ZWtzdCBtZWQgZXQgYmVzdGVtdCBhbnRhbGwgZGVzaW1hbGVyDQpKSVMJCQk9IEpJUwkJCQkJIyMJRW5kcmVyIGhhbHZicmVkZGVzIChlbmtlbHRieXRlKSBlbmdlbHNrZSBib2tzdGF2ZXIgZWxsZXIga2F0YWthbmEgaSBlbiB0ZWduc3RyZW5nLCB0aWwgZnVsbGJyZWRkZXMgKGRvYmJlbHRieXRlKSB0ZWduDQpMRUZUCQkJPSBWRU5TVFJFCQkJCSMjCVJldHVybmVyZXIgdGVnbmVuZSBsZW5nc3QgdGlsIHZlbnN0cmUgaSBlbiB0ZWtzdHZlcmRpDQpMRUZUQgkJCT0gVkVOU1RSRUIJCQkJIyMJUmV0dXJuZXJlciB0ZWduZW5lIGxlbmdzdCB0aWwgdmVuc3RyZSBpIGVuIHRla3N0dmVyZGkNCkxFTgkJCT0gTEVOR0RFCQkJCSMjCVJldHVybmVyZXIgYW50YWxsIHRlZ24gaSBlbiB0ZWtzdHN0cmVuZw0KTEVOQgkJCT0gTEVOR0RFQgkJCQkjIwlSZXR1cm5lcmVyIGFudGFsbCB0ZWduIGkgZW4gdGVrc3RzdHJlbmcNCkxPV0VSCQkJPSBTTcOFCQkJCQkjIwlLb252ZXJ0ZXJlciB0ZWtzdCB0aWwgc23DpSBib2tzdGF2ZXINCk1JRAkJCT0gREVMVEVLU1QJCQkJIyMJUmV0dXJuZXJlciBldCBhbmdpdHQgYW50YWxsIHRlZ24gZnJhIGVuIHRla3N0c3RyZW5nLCBvZyBiZWd5bm5lciBmcmEgcG9zaXNqb25lbiBkdSBhbmdpcg0KTUlEQgkJCT0gREVMVEVLU1RCCQkJCSMjCVJldHVybmVyZXIgZXQgYW5naXR0IGFudGFsbCB0ZWduIGZyYSBlbiB0ZWtzdHN0cmVuZywgb2cgYmVneW5uZXIgZnJhIHBvc2lzam9uZW4gZHUgYW5naXINClBIT05FVElDCQk9IEZVUklHQU5BCQkJCSMjCVRyZWtrZXIgdXQgZm9uZXRpc2tlIHRlZ24gKGZ1cmlnYW5hKSBmcmEgZW4gdGVrc3RzdHJlbmcNClBST1BFUgkJCT0gU1RPUi5GT1JCT0tTVEFWCQkJIyMJR2lyIGRlbiBmw7hyc3RlIGJva3N0YXZlbiBpIGh2ZXJ0IG9yZCBpIGVuIHRla3N0dmVyZGkgc3RvciBmb3Jib2tzdGF2DQpSRVBMQUNFCQkJPSBFUlNUQVRUCQkJCSMjCUVyc3RhdHRlciB0ZWduIGkgZW4gdGVrc3QNClJFUExBQ0VCCQk9IEVSU1RBVFRCCQkJCSMjCUVyc3RhdHRlciB0ZWduIGkgZW4gdGVrc3QNClJFUFQJCQk9IEdKRU5UQQkJCQkjIwlHamVudGFyIHRla3N0IGV0IGdpdHQgYW50YWxsIGdhbmdlcg0KUklHSFQJCQk9IEjDmFlSRQkJCQkJIyMJUmV0dXJuZXJlciB0ZWduZW5lIGxlbmdzdCB0aWwgaMO4eXJlIGkgZW4gdGVrc3R2ZXJkaQ0KUklHSFRCCQkJPSBIw5hZUkVCCQkJCSMjCVJldHVybmVyZXIgdGVnbmVuZSBsZW5nc3QgdGlsIGjDuHlyZSBpIGVuIHRla3N0dmVyZGkNClNFQVJDSAkJCT0gU8OYSwkJCQkJIyMJRmlubmVyIGVuIHRla3N0dmVyZGkgaW5uZSBpIGVuIGFubmVuIChza2lsbGVyIGlra2UgbWVsbG9tIHN0b3JlIG9nIHNtw6UgYm9rc3RhdmVyKQ0KU0VBUkNIQgkJCT0gU8OYS0IJCQkJCSMjCUZpbm5lciBlbiB0ZWtzdHZlcmRpIGlubmUgaSBlbiBhbm5lbiAoc2tpbGxlciBpa2tlIG1lbGxvbSBzdG9yZSBvZyBzbcOlIGJva3N0YXZlcikNClNVQlNUSVRVVEUJCT0gQllUVC5VVAkJCQkjIwlCeXR0ZXIgdXQgZ2FtbWVsIHRla3N0IG1lZCBueSB0ZWtzdCBpIGVuIHRla3N0c3RyZW5nDQpUCQkJPSBUCQkJCQkjIwlLb252ZXJ0ZXJlciBhcmd1bWVudGVuZSB0aWwgdGVrc3QNClRFWFQJCQk9IFRFS1NUCQkJCQkjIwlGb3JtYXRlcmVyIGV0IHRhbGwgb2cga29udmVydGVyZXIgZGV0IHRpbCB0ZWtzdA0KVFJJTQkJCT0gVFJJTU1FCQkJCSMjCUZqZXJuZXIgbWVsbG9tcm9tIGZyYSB0ZWtzdA0KVVBQRVIJCQk9IFNUT1JFCQkJCQkjIwlLb252ZXJ0ZXJlciB0ZWtzdCB0aWwgc3RvcmUgYm9rc3RhdmVyDQpWQUxVRQkJCT0gVkVSREkJCQkJCSMjCUtvbnZlcnRlcmVyIGV0IHRla3N0YXJndW1lbnQgdGlsIGV0IHRhbGwNCg==]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/locale/pl/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/locale/pl/config</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[77u/IyMNCiMjIFBIUEV4Y2VsDQojIw0NCiMjIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTEgUEhQRXhjZWwNCiMjDQojIyBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yDQojIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljDQojIyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXINCiMjIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLg0KIyMNCiMjIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLA0KIyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YNCiMjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VDQojIyBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLg0KIyMNCiMjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMNCiMjIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUNCiMjIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQ0KIyMNCiMjIEBjYXRlZ29yeSAgIFBIUEV4Y2VsDQojIyBAcGFja2FnZSAgICBQSFBFeGNlbF9TZXR0aW5ncw0KIyMgQGNvcHlyaWdodCAgQ29weXJpZ2h0IChjKSAyMDA2IC0gMjAxMSBQSFBFeGNlbCAoaHR0cDovL3d3dy5jb2RlcGxleC5jb20vUEhQRXhjZWwpDQojIyBAbGljZW5zZSAgICBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvb2xkLWxpY2Vuc2VzL2xncGwtMi4xLnR4dAlMR1BMDQojIyBAdmVyc2lvbiAgICAxLjcuNywgMjAxMi0wNS0xOQ0KIyMNCiMjDQoNCg0KQXJndW1lbnRTZXBhcmF0b3IJPSA7DQoNCg0KIyMNCiMjCShGb3IgZnV0dXJlIHVzZSkNCiMjDQpjdXJyZW5jeVN5bWJvbAk9IHrFgg0KDQoNCiMjDQojIwlFeGNlbCBFcnJvciBDb2RlcwkoRm9yIGZ1dHVyZSB1c2UpDQ0KIyMNCk5VTEwJPSAjWkVSTyENCkRJVjAJPSAjRFpJRUwvMCENClZBTFVFCT0gI0FSRyENClJFRgk9ICNBRFIhDQpOQU1FCT0gI05BWldBPw0KTlVNCT0gI0xJQ1pCQSENCk5BCT0gI04vRCENCg==]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/locale/pl/functions</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[77u/IyMNCiMjIFBIUEV4Y2VsDQojIw0NCiMjIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTEgUEhQRXhjZWwNCiMjDQojIyBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yDQojIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljDQojIyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXINCiMjIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLg0KIyMNCiMjIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLA0KIyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YNCiMjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VDQojIyBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLg0KIyMNCiMjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMNCiMjIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUNCiMjIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQ0KIyMNCiMjIEBjYXRlZ29yeSAgIFBIUEV4Y2VsDQojIyBAcGFja2FnZSAgICBQSFBFeGNlbF9DYWxjdWxhdGlvbg0KIyMgQGNvcHlyaWdodCAgQ29weXJpZ2h0IChjKSAyMDA2IC0gMjAxMSBQSFBFeGNlbCAoaHR0cDovL3d3dy5jb2RlcGxleC5jb20vUEhQRXhjZWwpDQojIyBAbGljZW5zZSAgICBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvb2xkLWxpY2Vuc2VzL2xncGwtMi4xLnR4dAlMR1BMDQojIyBAdmVyc2lvbiAgICAxLjcuNywgMjAxMi0wNS0xOQ0KIyMNCiMjIERhdGEgaW4gdGhpcyBmaWxlIGRlcml2ZWQgZnJvbSBodHRwOi8vd3d3LnBpdWhhLmZpL2V4Y2VsLWZ1bmN0aW9uLW5hbWUtdHJhbnNsYXRpb24vDQojIw0KIyMNCg0KDQojIw0KIyMJQWRkLWluIGFuZCBBdXRvbWF0aW9uIGZ1bmN0aW9ucwkJCUZ1bmtjamUgZG9kYXRrw7N3IGkgYXV0b21hdHl6YWNqaQ0KIyMNCkdFVFBJVk9UREFUQQkJPSBXRcW5REFORVRBQkVMSQkJCSMjCVp3cmFjYSBkYW5lIHByemVjaG93eXdhbmUgdyByYXBvcmNpZSB0YWJlbGkgcHJ6ZXN0YXduZWouDQoNCg0KIyMNCiMjCUN1YmUgZnVuY3Rpb25zCQkJCQlGdW5rY2plIG1vZHXFgsOzdw0KIyMNCkNVQkVLUElNRU1CRVIJCT0gRUxFTUVOVC5LUEkuTU9EVcWBVQkJIyMJWndyYWNhIG5henfEmSwgd8WCYcWbY2l3b8WbxIcgaSBtaWFyxJkga2x1Y3pvd2VnbyB3c2thxbpuaWthIHd5ZGFqbm/Fm2NpIChLUEkpIG9yYXogd3nFm3dpZXRsYSBuYXp3xJkgaSB3xYJhxZtjaXdvxZvEhyB3IGtvbcOzcmNlLiBXc2thxbpuaWsgS1BJIGplc3QgbWlhcsSFIGlsb8WbY2lvd8SFLCB0YWvEhSBqYWsgbWllc2nEmWN6bnkgenlzayBicnV0dG8gbHViIGt3YXJ0YWxuYSBmbHVrdHVhY2phIHByYWNvd25pa8OzdywgdcW8eXdhbsSFIGRvIG1vbml0b3Jvd2FuaWEgd3lkYWpub8WbY2kgb3JnYW5pemFjamkuDQpDVUJFTUVNQkVSCQk9IEVMRU1FTlQuTU9EVcWBVQkJIyMJWndyYWNhIGVsZW1lbnQgbHViIGtyb3RrxJkgeiBoaWVyYXJjaGlpIG1vZHXFgnUuIFPFgnXFvHkgZG8gc3ByYXdkemFuaWEsIGN6eSBlbGVtZW50IGx1YiBrcm90a2EgaXN0bmllamUgdyBtb2R1bGUuDQpDVUJFTUVNQkVSUFJPUEVSVFkJPSBXxYFBxZpDSVdPxZrEhi5FTEVNRU5UVS5NT0RVxYFVCSMjCVp3cmFjYSB3YXJ0b8WbxIcgd8WCYcWbY2l3b8WbY2kgZWxlbWVudHUgdyBtb2R1bGUuIFPFgnXFvHkgZG8gc3ByYXdkemFuaWEsIGN6eSBuYXp3YSBlbGVtZW50dSBpc3RuaWVqZSB3IG1vZHVsZSwgaSB6d3JhY2FuaWEgb2tyZcWbbG9uZWogd8WCYcWbY2l3b8WbY2kgZGxhIHRlZ28gZWxlbWVudHUuDQpDVUJFUkFOS0VETUVNQkVSCT0gVVNaRVJFR09XQU5ZLkVMRU1FTlQuTU9EVcWBVQkjIwlad3JhY2Egbi10eSAoYWxibyB1c3plcmVnb3dhbnkpIGVsZW1lbnQgemVzdGF3dS4gU8WCdcW8eSBkbyB6d3JhY2FuaWEgZWxlbWVudHUgbHViIGVsZW1lbnTDs3cgemVzdGF3dSwgbmEgcHJ6eWvFgmFkIG5hamxlcHN6ZWdvIHNwcnplZGF3Y3kgbHViIDEwIG5hamxlcHN6eWNoIHN0dWRlbnTDs3cuDQpDVUJFU0VUCQkJPSBaRVNUQVcuTU9EVcWBw5NXCQkjIwlEZWZpbml1amUgb2JsaWN6b255IHplc3RhdyBlbGVtZW50w7N3IGx1YiBrcm90ZWssIHd5c3nFgmFqxIVjIHd5cmHFvGVuaWUgemVzdGF3dSBkbyBzZXJ3ZXJhIG1vZHXFgnUsIGt0w7NyeSB0d29yenkgemVzdGF3IGkgendyYWNhIGdvIGRvIHByb2dyYW11IE1pY3Jvc29mdCBPZmZpY2UgRXhjZWwuDQpDVUJFU0VUQ09VTlQJCT0gTElDWk5JSy5NT0RVxYHDk1cuWkVTVEFXVQkjIwlad3JhY2EgbGljemLEmSBlbGVtZW50w7N3IHplc3Rhd3UuDQpDVUJFVkFMVUUJCT0gV0FSVE/FmsSGLk1PRFXFgVUJCSMjCVp3cmFjYSB6YWdyZWdvd2FuxIUgd2FydG/Fm8SHIHogbW9kdcWCdS4NCg0KDQojIw0KIyMJRGF0YWJhc2UgZnVuY3Rpb25zCQkJCUZ1bmtjamUgYmF6IGRhbnljaA0KIyMNCkRBVkVSQUdFCQk9IEJELsWaUkVETklBCQkJIyMJWndyYWNhIHdhcnRvxZvEhyDFm3JlZG5pZWogd3licmFueWNoIHdwaXPDs3cgYmF6eSBkYW55Y2guDQpEQ09VTlQJCQk9IEJELklMRS5SRUtPUkTDk1cJCSMjCVpsaWN6YSBrb23Ds3JraSB6YXdpZXJhasSFY2UgbGljemJ5IHcgYmF6aWUgZGFueWNoLg0KRENPVU5UQQkJCT0gQkQuSUxFLlJFS09SRMOTVy5BCQkjIwlabGljemEgbmllcHVzdGUga29tw7Nya2kgdyBiYXppZSBkYW55Y2guDQpER0VUCQkJPSBCRC5QT0xFCQkJIyMJV3lvZHLEmWJuaWEgeiBiYXp5IGRhbnljaCBqZWRlbiByZWtvcmQgc3BlxYJuaWFqxIVjeSBva3JlxZtsb25lIGtyeXRlcmlhLg0KRE1BWAkJCT0gQkQuTUFYCQkJIyMJWndyYWNhIHdhcnRvxZvEhyBtYWtzeW1hbG7EhSB6IHd5YnJhbnljaCB3cGlzw7N3IGJhenkgZGFueWNoLg0KRE1JTgkJCT0gQkQuTUlOCQkJIyMJWndyYWNhIHdhcnRvxZvEhyBtaW5pbWFsbsSFIHogd3licmFueWNoIHdwaXPDs3cgYmF6eSBkYW55Y2guDQpEUFJPRFVDVAkJPSBCRC5JTE9DWllOCQkJIyMJTW5vxbx5IHdhcnRvxZtjaSB3IGtvbmtyZXRueW0sIHNwZcWCbmlhasSFY3ltIGtyeXRlcmlhIHBvbHUgcmVrb3Jkw7N3IGJhenkgZGFueWNoLg0KRFNUREVWCQkJPSBCRC5PRENILlNUQU5EQVJECQkjIwlTemFjdWplIG9kY2h5bGVuaWUgc3RhbmRhcmRvd2UgbmEgcG9kc3Rhd2llIHByw7Nia2kgeiB3eWJyYW55Y2ggd3Bpc8OzdyBiYXp5IGRhbnljaC4NCkRTVERFVlAJCQk9IEJELk9EQ0guU1RBTkRBUkQuUE9QVUwJIyMJT2JsaWN6YSBvZGNoeWxlbmllIHN0YW5kYXJkb3dlIG5hIHBvZHN0YXdpZSBjYcWCZWogcG9wdWxhY2ppIHd5YnJhbnljaCB3cGlzw7N3IGJhenkgZGFueWNoLg0KRFNVTQkJCT0gQkQuU1VNQQkJCSMjCURvZGFqZSBsaWN6YnkgdyBrb2x1bW5pZSBww7NsIHJla29yZMOzdyBiYXp5IGRhbnljaCwga3TDs3JlIHNwZcWCbmlhasSFIGtyeXRlcmlhLg0KRFZBUgkJCT0gQkQuV0FSSUFOQ0pBCQkJIyMJU3phY3VqZSB3YXJpYW5jasSZIG5hIHBvZHN0YXdpZSBwcsOzYmtpIHogd3licmFueWNoIHdwaXPDs3cgYmF6eSBkYW55Y2guDQpEVkFSUAkJCT0gQkQuV0FSSUFOQ0pBLlBPUFVMCQkjIwlPYmxpY3phIHdhcmlhbmNqxJkgbmEgcG9kc3Rhd2llIGNhxYJlaiBwb3B1bGFjamkgd3licmFueWNoIHdwaXPDs3cgYmF6eSBkYW55Y2guDQoNCg0KIyMNCiMjCURhdGUgYW5kIHRpbWUgZnVuY3Rpb25zCQkJCUZ1bmtjamUgZGF0LCBnb2R6aW4gaSBjemFzdQ0KIyMNCkRBVEUJCQk9IERBVEEJCQkJIyMJWndyYWNhIGxpY3pixJkgc2VyeWpuxIUgZGxhIHd5YnJhbmVqIGRhdHkuDQpEQVRFVkFMVUUJCT0gREFUQS5XQVJUT8WaxIYJCQkjIwlLb253ZXJ0dWplIGRhdMSZIHcgZm9ybWllIHRla3N0dSBuYSBsaWN6YsSZIHNlcnlqbsSFLg0KREFZCQkJPSBEWklFxYMJCQkJIyMJS29ud2VydHVqZSBsaWN6YsSZIHNlcnlqbsSFIG5hIGR6aWXFhCBtaWVzacSFY2EuDQpEQVlTMzYwCQkJPSBETkkuMzYwCQkJIyMJT2JsaWN6YSBsaWN6YsSZIGRuaSBtacSZZHp5IGR3aWVtYSBkYXRhbWkgbmEgcG9kc3Rhd2llIHJva3UgMzYwLWRuaW93ZWdvLg0KRURBVEUJCQk9IFVQxYFETkkJCQkjIwlad3JhY2EgbGljemLEmSBzZXJ5am7EhSBkYXR5IGpha28gd3NrYXphbsSFIGxpY3pixJkgbWllc2nEmWN5IHByemVkIG9rcmXFm2xvbsSFIGRhdMSFIHBvY3rEhXRrb3fEhSBsdWIgcG8gbmllai4NCkVPTU9OVEgJCQk9IEVPTU9OVEgJCQkjIwlad3JhY2EgbGljemLEmSBzZXJ5am7EhSBvc3RhdG5pZWdvIGRuaWEgbWllc2nEhWNhIHByemVkIG9rcmXFm2xvbsSFIGxpY3pixIUgbWllc2nEmWN5IGx1YiBwbyBuaWVqLg0KSE9VUgkJCT0gR09EWklOQQkJCSMjCUtvbndlcnR1amUgbGljemLEmSBzZXJ5am7EhSBuYSBnb2R6aW7EmS4NCk1JTlVURQkJCT0gTUlOVVRBCQkJIyMJS29ud2VydHVqZSBsaWN6YsSZIHNlcnlqbsSFIG5hIG1pbnV0xJkuDQpNT05USAkJCT0gTUlFU0nEhEMJCQkjIwlLb253ZXJ0dWplIGxpY3pixJkgc2VyeWpuxIUgbmEgbWllc2nEhWMuDQpORVRXT1JLREFZUwkJPSBORVRXT1JLREFZUwkJCSMjCVp3cmFjYSBsaWN6YsSZIHBlxYJueWNoIGRuaSByb2JvY3p5Y2ggbWnEmWR6eSBkd2llbWEgZGF0YW1pLg0KTk9XCQkJPSBURVJBWgkJCQkjIwlad3JhY2EgbGljemLEmSBzZXJ5am7EhSBiaWXFvMSFY2VqIGRhdHkgaSBnb2R6aW55Lg0KU0VDT05ECQkJPSBTRUtVTkRBCQkJIyMJS29ud2VydHVqZSBsaWN6YsSZIHNlcnlqbsSFIG5hIHNla3VuZMSZLg0KVElNRQkJCT0gQ1pBUwkJCQkjIwlad3JhY2EgbGljemLEmSBzZXJ5am7EhSBva3JlxZtsb25lZ28gY3phc3UuDQpUSU1FVkFMVUUJCT0gQ1pBUy5XQVJUT8WaxIYJCQkjIwlLb253ZXJ0dWplIGN6YXMgdyBmb3JtaWUgdGVrc3R1IG5hIGxpY3pixJkgc2VyeWpuxIUuDQpUT0RBWQkJCT0gRFpJxZoJCQkJIyMJWndyYWNhIGxpY3pixJkgc2VyeWpuxIUgZGxhIGRhdHkgYmllxbzEhWNlai4NCldFRUtEQVkJCQk9IERaSUXFgy5UWUcJCQkjIwlLb253ZXJ0dWplIGxpY3pixJkgc2VyeWpuxIUgbmEgZHppZcWEIHR5Z29kbmlhLg0KV0VFS05VTQkJCT0gV0VFS05VTQkJCSMjCUtvbndlcnR1amUgbGljemLEmSBzZXJ5am7EhSBuYSBsaWN6YsSZIHJlcHJlemVudHVqxIVjxIUgbnVtZXIgdHlnb2RuaWEgdyByb2t1Lg0KV09SS0RBWQkJCT0gV09SS0RBWQkJCSMjCVp3cmFjYSBsaWN6YsSZIHNlcnlqbsSFIGRsYSBkYXR5IHByemVkIG9rcmXFm2xvbsSFIGxpY3pixIUgZG5pIHJvYm9jenljaCBsdWIgcG8gbmllai4NCllFQVIJCQk9IFJPSwkJCQkjIwlLb253ZXJ0dWplIGxpY3pixJkgc2VyeWpuxIUgbmEgcm9rLg0KWUVBUkZSQUMJCT0gWUVBUkZSQUMJCQkjIwlad3JhY2EgY3rEmcWbxIcgcm9rdSByZXByZXplbnRvd2FuxIUgcHJ6ZXogcGXFgm7EhSBsaWN6YsSZIGRuaSBtacSZZHp5IGRhdMSFIHBvY3rEhXRrb3fEhSBhIGRhdMSFIGtvxYRjb3fEhS4NCg0KDQojIw0KIyMJRW5naW5lZXJpbmcgZnVuY3Rpb25zCQkJCUZ1bmtjamUgaW7FvHluaWVyc2tpZQ0KIyMNCkJFU1NFTEkJCQk9IEJFU1NFTEkJCQkjIwlad3JhY2Egd2FydG/Fm8SHIHptb2R5Zmlrb3dhbmVqIGZ1bmtjamkgQmVzc2VsYSBJbih4KS4NCkJFU1NFTEoJCQk9IEJFU1NFTEoJCQkjIwlad3JhY2Egd2FydG/Fm8SHIGZ1bmtjamkgQmVzc2VsYSBKbih4KS4NCkJFU1NFTEsJCQk9IEJFU1NFTEsJCQkjIwlad3JhY2Egd2FydG/Fm8SHIHptb2R5Zmlrb3dhbmVqIGZ1bmtjamkgQmVzc2VsYSBLbih4KS4NCkJFU1NFTFkJCQk9IEJFU1NFTFkJCQkjIwlad3JhY2Egd2FydG/Fm8SHIGZ1bmtjamkgQmVzc2VsYSBZbih4KS4NCkJJTjJERUMJCQk9IEJJTjJERUMJCQkjIwlLb253ZXJ0dWplIGxpY3pixJkgdyBwb3N0YWNpIGR3w7Nqa293ZWogbmEgbGljemLEmSB3IHBvc3RhY2kgZHppZXNpxJl0bmVqLg0KQklOMkhFWAkJCT0gQklOMkhFWAkJCSMjCUtvbndlcnR1amUgbGljemLEmSB3IHBvc3RhY2kgZHfDs2prb3dlaiBuYSBsaWN6YsSZIHcgcG9zdGFjaSBzemVzbmFzdGtvd2VqLg0KQklOMk9DVAkJCT0gQklOMk9DVAkJCSMjCUtvbndlcnR1amUgbGljemLEmSB3IHBvc3RhY2kgZHfDs2prb3dlaiBuYSBsaWN6YsSZIHcgcG9zdGFjaSDDs3NlbWtvd2VqLg0KQ09NUExFWAkJCT0gQ09NUExFWAkJCSMjCUtvbndlcnR1amUgY3rEmcWbxIcgcnplY3p5d2lzdMSFIGkgdXJvam9uxIUgbmEgbGljemLEmSB6ZXNwb2xvbsSFLg0KQ09OVkVSVAkJCT0gQ09OVkVSVAkJCSMjCUtvbndlcnR1amUgbGljemLEmSB6IGplZG5lZ28gc3lzdGVtdSBtaWFyIG5hIGlubnkuDQpERUMyQklOCQkJPSBERUMyQklOCQkJIyMJS29ud2VydHVqZSBsaWN6YsSZIHcgcG9zdGFjaSBkemllc2nEmXRuZWogbmEgcG9zdGHEhyBkd8Ozamtvd8SFLg0KREVDMkhFWAkJCT0gREVDMkhFWAkJCSMjCUtvbndlcnR1amUgbGljemLEmSB3IHBvc3RhY2kgZHppZXNpxJl0bmVqIG5hIGxpY3pixJkgdyBwb3N0YWNpIHN6ZXNuYXN0a293ZWouDQpERUMyT0NUCQkJPSBERUMyT0NUCQkJIyMJS29ud2VydHVqZSBsaWN6YsSZIHcgcG9zdGFjaSBkemllc2nEmXRuZWogbmEgbGljemLEmSB3IHBvc3RhY2kgw7NzZW1rb3dlai4NCkRFTFRBCQkJPSBERUxUQQkJCQkjIwlTcHJhd2R6YSwgY3p5IGR3aWUgd2FydG/Fm2NpIHPEhSByw7N3bmUuDQpFUkYJCQk9IEVSRgkJCQkjIwlad3JhY2Egd2FydG/Fm8SHIGZ1bmtjamkgYsWCxJlkdS4NCkVSRkMJCQk9IEVSRkMJCQkJIyMJWndyYWNhIHdhcnRvxZvEhyBrb21wbGVtZW50YXJuZWogZnVua2NqaSBixYLEmWR1Lg0KR0VTVEVQCQkJPSBHRVNURVAJCQkjIwlTcHJhd2R6YSwgY3p5IGxpY3piYSBqZXN0IHdpxJlrc3phIG5pxbwgd2FydG/Fm8SHIHByb2dvd2EuDQpIRVgyQklOCQkJPSBIRVgyQklOCQkJIyMJS29ud2VydHVqZSBsaWN6YsSZIHcgcG9zdGFjaSBzemVzbmFzdGtvd2VqIG5hIGxpY3pixJkgdyBwb3N0YWNpIGR3w7Nqa293ZWouDQpIRVgyREVDCQkJPSBIRVgyREVDCQkJIyMJS29ud2VydHVqZSBsaWN6YsSZIHcgcG9zdGFjaSBzemVzbmFzdGtvd2VqIG5hIGxpY3pixJkgdyBwb3N0YWNpIGR6aWVzacSZdG5lai4NCkhFWDJPQ1QJCQk9IEhFWDJPQ1QJCQkjIwlLb253ZXJ0dWplIGxpY3pixJkgdyBwb3N0YWNpIHN6ZXNuYXN0a293ZWogbmEgbGljemLEmSB3IHBvc3RhY2kgw7NzZW1rb3dlai4NCklNQUJTCQkJPSBJTUFCUwkJCQkjIwlad3JhY2Egd2FydG/Fm8SHIGJlend6Z2zEmWRuxIUgKG1vZHXFgikgbGljemJ5IHplc3BvbG9uZWouDQpJTUFHSU5BUlkJCT0gSU1BR0lOQVJZCQkJIyMJWndyYWNhIHdhcnRvxZvEhyBjesSZxZtjaSB1cm9qb25laiBsaWN6YnkgemVzcG9sb25lai4NCklNQVJHVU1FTlQJCT0gSU1BUkdVTUVOVAkJCSMjCVp3cmFjYSB3YXJ0b8WbxIcgYXJndW1lbnR1IGxpY3pieSB6ZXNwb2xvbmVqLCBwcnp5IGN6eW0ga8SFdCB3eXJhxbxvbnkgamVzdCB3IHJhZGlhbmFjaC4NCklNQ09OSlVHQVRFCQk9IElNQ09OSlVHQVRFCQkJIyMJWndyYWNhIHdhcnRvxZvEhyBsaWN6Ynkgc3ByesSZxbxvbmVqIGRhbmVqIGxpY3pieSB6ZXNwb2xvbmVqLg0KSU1DT1MJCQk9IElNQ09TCQkJCSMjCVp3cmFjYSB3YXJ0b8WbxIcgY29zaW51c2EgbGljemJ5IHplc3BvbG9uZWouDQpJTURJVgkJCT0gSU1ESVYJCQkJIyMJWndyYWNhIHdhcnRvxZvEhyBpbG9yYXp1IGR3w7NjaCBsaWN6YiB6ZXNwb2xvbnljaC4NCklNRVhQCQkJPSBJTUVYUAkJCQkjIwlad3JhY2EgcG9zdGHEhyB3eWvFgmFkbmljesSFIGxpY3pieSB6ZXNwb2xvbmVqLg0KSU1MTgkJCT0gSU1MTgkJCQkjIwlad3JhY2Egd2FydG/Fm8SHIGxvZ2FyeXRtdSBuYXR1cmFsbmVnbyBsaWN6YnkgemVzcG9sb25lai4NCklNTE9HMTAJCQk9IElNTE9HMTAJCQkjIwlad3JhY2Egd2FydG/Fm8SHIGxvZ2FyeXRtdSBkemllc2nEmXRuZWdvIGxpY3pieSB6ZXNwb2xvbmVqLg0KSU1MT0cyCQkJPSBJTUxPRzIJCQkjIwlad3JhY2Egd2FydG/Fm8SHIGxvZ2FyeXRtdSBsaWN6YnkgemVzcG9sb25laiBwcnp5IHBvZHN0YXdpZSAyLg0KSU1QT1dFUgkJCT0gSU1QT1dFUgkJCSMjCVp3cmFjYSB3YXJ0b8WbxIcgbGljemJ5IHplc3BvbG9uZWogcG9kbmllc2lvbmVqIGRvIHBvdMSZZ2kgY2HFgmtvd2l0ZWouDQpJTVBST0RVQ1QJCT0gSU1QUk9EVUNUCQkJIyMJWndyYWNhIHdhcnRvxZvEhyBpbG9jenludSBsaWN6YiB6ZXNwb2xvbnljaC4NCklNUkVBTAkJCT0gSU1SRUFMCQkJIyMJWndyYWNhIHdhcnRvxZvEhyBjesSZxZtjaSByemVjenl3aXN0ZWogbGljemJ5IHplc3BvbG9uZWouDQpJTVNJTgkJCT0gSU1TSU4JCQkJIyMJWndyYWNhIHdhcnRvxZvEhyBzaW51c2EgbGljemJ5IHplc3BvbG9uZWouDQpJTVNRUlQJCQk9IElNU1FSVAkJCSMjCVp3cmFjYSB3YXJ0b8WbxIcgcGllcndpYXN0a2Ega3dhZHJhdG93ZWdvIHogbGljemJ5IHplc3BvbG9uZWouDQpJTVNVQgkJCT0gSU1TVUIJCQkJIyMJWndyYWNhIHdhcnRvxZvEhyByw7PFvG5pY3kgZHfDs2NoIGxpY3piIHplc3BvbG9ueWNoLg0KSU1TVU0JCQk9IElNU1VNCQkJCSMjCVp3cmFjYSB3YXJ0b8WbxIcgc3VteSBsaWN6YiB6ZXNwb2xvbnljaC4NCk9DVDJCSU4JCQk9IE9DVDJCSU4JCQkjIwlLb253ZXJ0dWplIGxpY3pixJkgdyBwb3N0YWNpIMOzc2Vta293ZWogbmEgbGljemLEmSB3IHBvc3RhY2kgZHfDs2prb3dlai4NCk9DVDJERUMJCQk9IE9DVDJERUMJCQkjIwlLb253ZXJ0dWplIGxpY3pixJkgdyBwb3N0YWNpIMOzc2Vta293ZWogbmEgbGljemLEmSB3IHBvc3RhY2kgZHppZXNpxJl0bmVqLg0KT0NUMkhFWAkJCT0gT0NUMkhFWAkJCSMjCUtvbndlcnR1amUgbGljemLEmSB3IHBvc3RhY2kgw7NzZW1rb3dlaiBuYSBsaWN6YsSZIHcgcG9zdGFjaSBzemVzbmFzdGtvd2VqLg0KDQoNCiMjDQojIwlGaW5hbmNpYWwgZnVuY3Rpb25zCQkJCUZ1bmtjamUgZmluYW5zb3dlDQojIw0KQUNDUklOVAkJCT0gQUNDUklOVAkJCSMjCVp3cmFjYSBuYXJvc8WCZSBvZHNldGtpIGRsYSBwYXBpZXJ1IHdhcnRvxZtjaW93ZWdvIHogb3Byb2NlbnRvd2FuaWVtIG9rcmVzb3d5bS4NCkFDQ1JJTlRNCQk9IEFDQ1JJTlRNCQkJIyMJWndyYWNhIG5hcm9zxYJlIG9kc2V0a2kgZGxhIHBhcGllcnUgd2FydG/Fm2Npb3dlZ28geiBvcHJvY2VudG93YW5pZW0gdyB0ZXJtaW5pZSB3eWt1cHUuDQpBTU9SREVHUkMJCT0gQU1PUkRFR1JDCQkJIyMJWndyYWNhIGFtb3J0eXphY2rEmSBkbGEga2HFvGRlZ28gb2tyZXN1IHJvemxpY3plbmlvd2VnbyB6IHd5a29yenlzdGFuaWVtIHdzcMOzxYJjenlubmlrYSBhbW9ydHl6YWNqaS4NCkFNT1JMSU5DCQk9IEFNT1JMSU5DCQkJIyMJWndyYWNhIGFtb3J0eXphY2rEmSBkbGEga2HFvGRlZ28gb2tyZXN1IHJvemxpY3plbmlvd2Vnby4NCkNPVVBEQVlCUwkJPSBDT1VQREFZQlMJCQkjIwlad3JhY2EgbGljemLEmSBkbmkgb2QgcG9jesSFdGt1IG9rcmVzdSBkeXdpZGVuZHkgZG8gZG5pYSByb3psaWN6ZW5pb3dlZ28uDQpDT1VQREFZUwkJPSBDT1VQREFZUwkJCSMjCVp3cmFjYSBsaWN6YsSZIGRuaSB3IG9rcmVzaWUgZHl3aWRlbmR5LCB6IHV3emdsxJlkbmllbmllbSBkbmlhIHJvemxpY3plbmlvd2Vnby4NCkNPVVBEQVlTTkMJCT0gQ09VUERBWVNOQwkJCSMjCVp3cmFjYSBsaWN6YsSZIGRuaSBvZCBkbmlhIHJvemxpY3plbmlvd2VnbyBkbyBkYXR5IG5hc3TEmXBuZWdvIGRuaWEgZHl3aWRlbmR5Lg0KQ09VUE5DRAkJCT0gQ09VUE5DRAkJCSMjCVp3cmFjYSBkemllxYQgbmFzdMSZcG5laiBkeXdpZGVuZHkgcG8gZG5pdSByb3psaWN6ZW5pb3d5bS4NCkNPVVBOVU0JCQk9IENPVVBOVU0JCQkjIwlad3JhY2EgbGljemLEmSBkeXdpZGVuZCBwxYJhdG55Y2ggbWnEmWR6eSBkbmllbSByb3psaWN6ZW5pb3d5bSBhIGRuaWVtIHd5a3VwdS4NCkNPVVBQQ0QJCQk9IENPVVBQQ0QJCQkjIwlad3JhY2EgZHppZcWEIHBvcHJ6ZWRuaWVqIGR5d2lkZW5keSBwcnplZCBkbmllbSByb3psaWN6ZW5pb3d5bS4NCkNVTUlQTVQJCQk9IENVTUlQTVQJCQkjIwlad3JhY2Egd2FydG/Fm8SHIHByb2NlbnR1IHNrxYJhZGFuZWdvIHDFgmF0bmVnbyBtacSZZHp5IGR3b21hIG9rcmVzYW1pLg0KQ1VNUFJJTkMJCT0gQ1VNUFJJTkMJCQkjIwlad3JhY2Egd2FydG/Fm8SHIGthcGl0YcWCdSBza3VtdWxvd2FuZWdvIHNwxYJhdHkgcG/FvHljemtpIG1pxJlkenkgZHdvbWEgb2tyZXNhbWkuDQpEQgkJCT0gREIJCQkJIyMJWndyYWNhIGFtb3J0eXphY2rEmSDFm3JvZGthIHRyd2HFgmVnbyB3IGRhbnltIG9rcmVzaWUgbWV0b2TEhSBkZWdyZXN5d27EhSB6IHphc3Rvc293YW5pZW0gc3RhxYJlaiBiYXpvd2VqLg0KRERCCQkJPSBEREIJCQkJIyMJWndyYWNhIGFtb3J0eXphY2rEmSDFm3JvZGthIHRyd2HFgmVnbyB6YSBwb2Rhbnkgb2tyZXMgbWV0b2TEhSBkZWdyZXN5d27EhSB6IHphc3Rvc293YW5pZW0gcG9kd8Ozam5laiBiYXpvd2VqIGx1YiBtZXRvZMSFIG9rcmXFm2xvbsSFIHByemV6IHXFvHl0a293bmlrYS4NCkRJU0MJCQk9IERJU0MJCQkJIyMJWndyYWNhIHdhcnRvxZvEhyBzdG9weSBkeXNrb250b3dlaiBwYXBpZXJ1IHdhcnRvxZtjaW93ZWdvLg0KRE9MTEFSREUJCT0gRE9MTEFSREUJCQkjIwlLb253ZXJ0dWplIGNlbsSZIHcgcG9zdGFjaSB1xYJhbWtvd2VqIG5hIGNlbsSZIHd5cmHFvG9uxIUgdyBwb3N0YWNpIGR6aWVzacSZdG5lai4NCkRPTExBUkZSCQk9IERPTExBUkZSCQkJIyMJS29ud2VydHVqZSBjZW7EmSB3eXJhxbxvbsSFIHcgcG9zdGFjaSBkemllc2nEmXRuZWogbmEgY2VuxJkgd3lyYcW8b27EhSB3IHBvc3RhY2kgdcWCYW1rb3dlai4NCkRVUkFUSU9OCQk9IERVUkFUSU9OCQkJIyMJWndyYWNhIHdhcnRvxZvEhyByb2N6bmVnbyBwcnp5Y2hvZHUgeiBwYXBpZXJ1IHdhcnRvxZtjaW93ZWdvIG8gb2tyZXNvd3ljaCB3eXDFgmF0YWNoIG9wcm9jZW50b3dhbmlhLg0KRUZGRUNUCQkJPSBFRkZFQ1QJCQkjIwlad3JhY2Egd2FydG/Fm8SHIGVmZWt0eXduZWogcm9jem5laiBzdG9weSBwcm9jZW50b3dlai4NCkZWCQkJPSBGVgkJCQkjIwlad3JhY2EgcHJ6eXN6xYLEhSB3YXJ0b8WbxIcgbG9rYXR5Lg0KRlZTQ0hFRFVMRQkJPSBGVlNDSEVEVUxFCQkJIyMJWndyYWNhIHByenlzesWCxIUgd2FydG/Fm8SHIGthcGl0YcWCdSBwb2N6xIV0a293ZWdvIHdyYXogeiBzemVyZWdpZW0gcHJvY2VudMOzdyBza8WCYWRhbnljaC4NCklOVFJBVEUJCQk9IElOVFJBVEUJCQkjIwlad3JhY2Egd2FydG/Fm8SHIHN0b3B5IHByb2NlbnRvd2VqIHBhcGllcnUgd2FydG/Fm2Npb3dlZ28gY2HFgmtvd2ljaWUgdWxva293YW5lZ28uDQpJUE1UCQkJPSBJUE1UCQkJCSMjCVp3cmFjYSB3eXNva2/Fm8SHIHNwxYJhdHkgb3Byb2NlbnRvd2FuaWEgbG9rYXR5IHphIGRhbnkgb2tyZXMuDQpJUlIJCQk9IElSUgkJCQkjIwlad3JhY2Egd2FydG/Fm8SHIHdld27EmXRyem5laiBzdG9weSB6d3JvdHUgZGxhIHNlcmlpIHByemVwxYJ5d8OzdyBnb3TDs3drb3d5Y2guDQpJU1BNVAkJCT0gSVNQTVQJCQkJIyMJT2JsaWN6YSB3eXNva2/Fm8SHIHNwxYJhdHkgb3Byb2NlbnRvd2FuaWEgemEgZGFueSBva3JlcyBsb2thdHkuDQpNRFVSQVRJT04JCT0gTURVUkFUSU9OCQkJIyMJWndyYWNhIHdhcnRvxZvEhyB6bW9keWZpa293YW5lZ28gb2tyZXN1IE1hY2F1bGV5YSBkbGEgcGFwaWVydSB3YXJ0b8WbY2lvd2VnbyBvIHphxYJvxbxvbmVqIHdhcnRvxZtjaSBub21pbmFsbmVqIDEwMCB6xYIuDQpNSVJSCQkJPSBNSVJSCQkJCSMjCVp3cmFjYSB3YXJ0b8WbxIcgd2V3bsSZdHJ6bmVqIHN0b3B5IHp3cm90dSBkbGEgcHJ6eXBhZGt1LCBnZHkgZG9kYXRuaWUgaSB1amVtbmUgcHJ6ZXDFgnl3eSBnb3TDs3drb3dlIG1hasSFIHLDs8W8bmUgc3RvcHkuDQpOT01JTkFMCQkJPSBOT01JTkFMCQkJIyMJWndyYWNhIHd5c29rb8WbxIcgbm9taW5hbG5laiByb2N6bmVqIHN0b3B5IHByb2NlbnRvd2VqLg0KTlBFUgkJCT0gTlBFUgkJCQkjIwlad3JhY2EgbGljemLEmSBva3Jlc8OzdyBkbGEgbG9rYXR5Lg0KTlBWCQkJPSBOUFYJCQkJIyMJWndyYWNhIHdhcnRvxZvEhyBiaWXFvMSFY8SFIG5ldHRvIGxva2F0eSBuYSBwb2RzdGF3aWUgc3plcmVndSBva3Jlc293eWNoIHByemVwxYJ5d8OzdyBnb3TDs3drb3d5Y2ggaSBzdG9weSBkeXNrb250b3dlai4NCk9EREZQUklDRQkJPSBPRERGUFJJQ0UJCQkjIwlad3JhY2EgY2VuxJkgemEgMTAwIHrFgiB3YXJ0b8WbY2kgbm9taW5hbG5laiBwYXBpZXJ1IHdhcnRvxZtjaW93ZWdvIHogbmlldHlwb3d5bSBwaWVyd3N6eW0gb2tyZXNlbS4NCk9EREZZSUVMRAkJPSBPRERGWUlFTEQJCQkjIwlad3JhY2EgcmVudG93bm/Fm8SHIHBhcGllcnUgd2FydG/Fm2Npb3dlZ28geiBuaWV0eXBvd3ltIHBpZXJ3c3p5bSBva3Jlc2VtLg0KT0RETFBSSUNFCQk9IE9ERExQUklDRQkJCSMjCVp3cmFjYSBjZW7EmSB6YSAxMDAgesWCIHdhcnRvxZtjaSBub21pbmFsbmVqIHBhcGllcnUgd2FydG/Fm2Npb3dlZ28geiBuaWV0eXBvd3ltIG9zdGF0bmltIG9rcmVzZW0uDQpPRERMWUlFTEQJCT0gT0RETFlJRUxECQkJIyMJWndyYWNhIHJlbnRvd25vxZvEhyBwYXBpZXJ1IHdhcnRvxZtjaW93ZWdvIHogbmlldHlwb3d5bSBvc3RhdG5pbSBva3Jlc2VtLg0KUE1UCQkJPSBQTVQJCQkJIyMJWndyYWNhIHdhcnRvxZvEhyBva3Jlc293ZWogcMWCYXRub8WbY2kgcmF0eSByb2N6bmVqLg0KUFBNVAkJCT0gUFBNVAkJCQkjIwlad3JhY2Egd3lzb2tvxZvEhyBzcMWCYXR5IGthcGl0YcWCdSB3IHByenlwYWRrdSBsb2thdHkgZGxhIGRhbmVnbyBva3Jlc3UuDQpQUklDRQkJCT0gUFJJQ0UJCQkJIyMJWndyYWNhIGNlbsSZIHphIDEwMCB6xYIgd2FydG/Fm2NpIG5vbWluYWxuZWogcGFwaWVydSB3YXJ0b8WbY2lvd2VnbyB6IG9wcm9jZW50b3dhbmllbSBva3Jlc293eW0uDQpQUklDRURJU0MJCT0gUFJJQ0VESVNDCQkJIyMJWndyYWNhIGNlbsSZIHphIDEwMCB6xYIgd2FydG/Fm2NpIG5vbWluYWxuZWogcGFwaWVydSB3YXJ0b8WbY2lvd2VnbyB6ZHlza29udG93YW5lZ28uDQpQUklDRU1BVAkJPSBQUklDRU1BVAkJCSMjCVp3cmFjYSBjZW7EmSB6YSAxMDAgesWCIHdhcnRvxZtjaSBub21pbmFsbmVqIHBhcGllcnUgd2FydG/Fm2Npb3dlZ28geiBvcHJvY2VudG93YW5pZW0gdyB0ZXJtaW5pZSB3eWt1cHUuDQpQVgkJCT0gUFYJCQkJIyMJWndyYWNhIHdhcnRvxZvEhyBiaWXFvMSFY8SFIGxva2F0eS4NClJBVEUJCQk9IFJBVEUJCQkJIyMJWndyYWNhIHd5c29rb8WbxIcgc3RvcHkgcHJvY2VudG93ZWogdyBva3Jlc2llIHJhdHkgcm9jem5lai4NClJFQ0VJVkVECQk9IFJFQ0VJVkVECQkJIyMJWndyYWNhIHdhcnRvxZvEhyBrYXBpdGHFgnUgb3RyenltYW5lZ28gcHJ6eSB3eWt1cGllIHBhcGllcnUgd2FydG/Fm2Npb3dlZ28gY2HFgmtvd2ljaWUgdWxva293YW5lZ28uDQpTTE4JCQk9IFNMTgkJCQkjIwlad3JhY2EgYW1vcnR5emFjasSZIMWbcm9ka2EgdHJ3YcWCZWdvIHphIGplZGVuIG9rcmVzIG1ldG9kxIUgbGluaW93xIUuDQpTWUQJCQk9IFNZRAkJCQkjIwlad3JhY2EgYW1vcnR5emFjasSZIMWbcm9ka2EgdHJ3YcWCZWdvIHphIGRhbnkgb2tyZXMgbWV0b2TEhSBzdW15IGN5ZnIgbGF0IGFtb3J0eXphY2ppLg0KVEJJTExFUQkJCT0gVEJJTExFUQkJCSMjCVp3cmFjYSByZW50b3dub8WbxIcgZWt3aXdhbGVudHUgb2JsaWdhY2ppIGRsYSBib251IHNrYXJib3dlZ28uDQpUQklMTFBSSUNFCQk9IFRCSUxMUFJJQ0UJCQkjIwlad3JhY2EgY2VuxJkgemEgMTAwIHrFgiB3YXJ0b8WbY2kgbm9taW5hbG5laiBib251IHNrYXJib3dlZ28uDQpUQklMTFlJRUxECQk9IFRCSUxMWUlFTEQJCQkjIwlad3JhY2EgcmVudG93bm/Fm8SHIGJvbnUgc2thcmJvd2Vnby4NClZEQgkJCT0gVkRCCQkJCSMjCU9ibGljemEgYW1vcnR5emFjasSZIMWbcm9ka2EgdHJ3YcWCZWdvIHcgZGFueW0gb2tyZXNpZSBsdWIgamVnbyBjesSZxZtjaSBtZXRvZMSFIGRlZ3Jlc3l3bsSFLg0KWElSUgkJCT0gWElSUgkJCQkjIwlad3JhY2Egd2FydG/Fm8SHIHdld27EmXRyem5laiBzdG9weSB6d3JvdHUgZGxhIHNlcmlpIHJvesWCb8W8b255Y2ggdyBjemFzaWUgcHJ6ZXDFgnl3w7N3IGdvdMOzd2tvd3ljaCwgbmlla29uaWVjem5pZSBva3Jlc293eWNoLg0KWE5QVgkJCT0gWE5QVgkJCQkjIwlad3JhY2Egd2FydG/Fm8SHIGJpZcW8xIVjxIUgbmV0dG8gZGxhIHNlcmlpIHJvesWCb8W8b255Y2ggdyBjemFzaWUgcHJ6ZXDFgnl3w7N3IGdvdMOzd2tvd3ljaCwgbmlla29uaWVjem5pZSBva3Jlc293eWNoLg0KWUlFTEQJCQk9IFlJRUxECQkJCSMjCVp3cmFjYSByZW50b3dub8WbxIcgcGFwaWVydSB3YXJ0b8WbY2lvd2VnbyB6IG9wcm9jZW50b3dhbmllbSBva3Jlc293eW0uDQpZSUVMRERJU0MJCT0gWUlFTERESVNDCQkJIyMJWndyYWNhIHJvY3puxIUgcmVudG93bm/Fm8SHIHpkeXNrb250b3dhbmVnbyBwYXBpZXJ1IHdhcnRvxZtjaW93ZWdvLCBuYSBwcnp5a8WCYWQgYm9udSBza2FyYm93ZWdvLg0KWUlFTERNQVQJCT0gWUlFTERNQVQJCQkjIwlad3JhY2Egcm9jem7EhSByZW50b3dub8WbxIcgcGFwaWVydSB3YXJ0b8WbY2lvd2VnbyBvcHJvY2VudG93YW5lZ28gcHJ6eSB3eWt1cGllLg0KDQoNCiMjDQojIwlJbmZvcm1hdGlvbiBmdW5jdGlvbnMJCQkJRnVua2NqZSBpbmZvcm1hY3lqbmUNCiMjDQpDRUxMCQkJPSBLT03Dk1JLQQkJCSMjCVp3cmFjYSBpbmZvcm1hY2plIG8gZm9ybWFjaWUsIHBvxYJvxbxlbml1IGx1YiB6YXdhcnRvxZtjaSBrb23Ds3JraS4NCkVSUk9SLlRZUEUJCT0gTlIuQsWBxJhEVQkJCSMjCVp3cmFjYSBsaWN6YsSZIG9kcG93aWFkYWrEhWPEhSB0eXBvd2kgYsWCxJlkdS4NCklORk8JCQk9IElORk8JCQkJIyMJWndyYWNhIGluZm9ybWFjasSZIG8gYWt0dWFsbnltIMWbcm9kb3dpc2t1IHByYWN5Lg0KSVNCTEFOSwkJCT0gQ1pZLlBVU1RBCQkJIyMJWndyYWNhIHdhcnRvxZvEhyBQUkFXREEsIGplxZtsaSB3YXJ0b8WbxIcgamVzdCBwdXN0YS4NCklTRVJSCQkJPSBDWlkuQsWBCQkJIyMJWndyYWNhIHdhcnRvxZvEhyBQUkFXREEsIGplxZtsaSB3YXJ0b8WbxIcgamVzdCBkb3dvbG7EhSB3YXJ0b8WbY2nEhSBixYLEmWR1LCB6IHd5asSFdGtpZW0gI04vRCEuDQpJU0VSUk9SCQkJPSBDWlkuQsWBxIRECQkJIyMJWndyYWNhIHdhcnRvxZvEhyBQUkFXREEsIGplxZtsaSB3YXJ0b8WbxIcgamVzdCBkb3dvbG7EhSB3YXJ0b8WbY2nEhSBixYLEmWR1Lg0KSVNFVkVOCQkJPSBJU0VWRU4JCQkjIwlad3JhY2Egd2FydG/Fm8SHIFBSQVdEQSwgamXFm2xpIGxpY3piYSBqZXN0IHBhcnp5c3RhLg0KSVNMT0dJQ0FMCQk9IENaWS5MT0dJQ1pOQQkJCSMjCVp3cmFjYSB3YXJ0b8WbxIcgUFJBV0RBLCBqZcWbbGkgd2FydG/Fm8SHIGplc3Qgd2FydG/Fm2NpxIUgbG9naWN6bsSFLg0KSVNOQQkJCT0gQ1pZLkJSQUsJCQkjIwlad3JhY2Egd2FydG/Fm8SHIFBSQVdEQSwgamXFm2xpIHdhcnRvxZvEhyBqZXN0IHdhcnRvxZtjacSFIGLFgsSZZHUgI04vRCEuDQpJU05PTlRFWFQJCT0gQ1pZLk5JRS5URUtTVAkJCSMjCVp3cmFjYSB3YXJ0b8WbxIcgUFJBV0RBLCBqZcWbbGkgd2FydG/Fm8SHIG5pZSBqZXN0IHRla3N0ZW0uDQpJU05VTUJFUgkJPSBDWlkuTElDWkJBCQkJIyMJWndyYWNhIHdhcnRvxZvEhyBQUkFXREEsIGplxZtsaSB3YXJ0b8WbxIcgamVzdCBsaWN6YsSFLg0KSVNPREQJCQk9IElTT0RECQkJCSMjCVp3cmFjYSB3YXJ0b8WbxIcgUFJBV0RBLCBqZcWbbGkgbGljemJhIGplc3QgbmllcGFyenlzdGEuDQpJU1JFRgkJCT0gQ1pZLkFEUgkJCSMjCVp3cmFjYSB3YXJ0b8WbxIcgUFJBV0RBLCBqZcWbbGkgd2FydG/Fm8SHIGplc3Qgb2R3b8WCYW5pZW0uDQpJU1RFWFQJCQk9IENaWS5URUtTVAkJCSMjCVp3cmFjYSB3YXJ0b8WbxIcgUFJBV0RBLCBqZcWbbGkgd2FydG/Fm8SHIGplc3QgdGVrc3RlbS4NCk4JCQk9IEwJCQkJIyMJWndyYWNhIHdhcnRvxZvEhyBwcnpla29ud2VydG93YW7EhSBuYSBwb3N0YcSHIGxpY3pib3fEhS4NCk5BCQkJPSBCUkFLCQkJCSMjCVp3cmFjYSB3YXJ0b8WbxIcgYsWCxJlkdSAjTi9EIS4NClRZUEUJCQk9IFRZUAkJCQkjIwlad3JhY2EgbGljemLEmSB3c2thenVqxIVjxIUgdHlwIGRhbnljaCB3YXJ0b8WbY2kuDQoNCg0KIyMNCiMjCUxvZ2ljYWwgZnVuY3Rpb25zCQkJCUZ1bmtjamUgbG9naWN6bmUNCiMjDQpBTkQJCQk9IE9SQVoJCQkJIyMJWndyYWNhIHdhcnRvxZvEhyBQUkFXREEsIGplxZtsaSB3c3p5c3RraWUgYXJndW1lbnR5IG1hasSFIHdhcnRvxZvEhyBQUkFXREEuDQpGQUxTRQkJCT0gRkHFgVNaCQkJCSMjCVp3cmFjYSB3YXJ0b8WbxIcgbG9naWN6bsSFIEZBxYFTWi4NCklGCQkJPSBKRcW7RUxJCQkJIyMJT2tyZcWbbGEgd2FydW5layBsb2dpY3pueSBkbyBzcHJhd2R6ZW5pYS4NCklGRVJST1IJCQk9IEpFxbtFTEkuQsWBxIRECQkJIyMJWndyYWNhIG9rcmXFm2xvbsSFIHdhcnRvxZvEhywgamXFm2xpIHd5bmlraWVtIG9ibGljemVuaWEgZm9ybXXFgnkgamVzdCBixYLEhWQ7IHcgcHJ6ZWNpd255bSBwcnp5cGFka3UgendyYWNhIHd5bmlrIGZvcm11xYJ5Lg0KTk9UCQkJPSBOSUUJCQkJIyMJT2R3cmFjYSB3YXJ0b8WbxIcgbG9naWN6bsSFIGFyZ3VtZW50dS4NCk9SCQkJPSBMVUIJCQkJIyMJWndyYWNhIHdhcnRvxZvEhyBQUkFXREEsIGplxZtsaSBjbyBuYWptbmllaiBqZWRlbiB6IGFyZ3VtZW50w7N3IG1hIHdhcnRvxZvEhyBQUkFXREEuDQpUUlVFCQkJPSBQUkFXREEJCQkjIwlad3JhY2Egd2FydG/Fm8SHIGxvZ2ljem7EhSBQUkFXREEuDQoNCg0KIyMNCiMjCUxvb2t1cCBhbmQgcmVmZXJlbmNlIGZ1bmN0aW9ucwkJCUZ1bmtjamUgd3lzenVraXdhbmlhIGkgb2R3b8WCYcWEDQojIw0KQUREUkVTUwkJCT0gQURSRVMJCQkJIyMJWndyYWNhIG9kd2/FgmFuaWUgZG8gamVkbmVqIGtvbcOzcmtpIHcgYXJrdXN6dSBqYWtvIHdhcnRvxZvEhyB0ZWtzdG93xIUuDQpBUkVBUwkJCT0gT0JTWkFSWQkJCSMjCVp3cmFjYSBsaWN6YsSZIG9ic3phcsOzdyB3eXN0xJlwdWrEhWN5Y2ggdyBvZHdvxYJhbml1Lg0KQ0hPT1NFCQkJPSBXWUJJRVJaCQkJIyMJV3liaWVyYSB3YXJ0b8WbxIcgeiBsaXN0eSB3YXJ0b8WbY2kuDQpDT0xVTU4JCQk9IE5SLktPTFVNTlkJCQkjIwlad3JhY2EgbnVtZXIga29sdW1ueSB6IG9kd2/FgmFuaWEuDQpDT0xVTU5TCQkJPSBMSUNaQkEuS09MVU1OCQkJIyMJWndyYWNhIGxpY3pixJkga29sdW1uIGRsYSBkYW5lZ28gb2R3b8WCYW5pYS4NCkhMT09LVVAJCQk9IFdZU1pVS0FKLlBPWklPTU8JCSMjCVByemVnbMSFZGEgZ8Ozcm55IHdpZXJzeiB0YWJsaWN5IGkgendyYWNhIHdhcnRvxZvEhyB3c2themFuZWoga29tw7Nya2kuDQpIWVBFUkxJTksJCT0gSElQRVLFgcSEQ1pFCQkJIyMJVHdvcnp5IHNrcsOzdCBsdWIgc2tvaywga3TDs3J5IHBvendhbGEgb3R3aWVyYcSHIGRva3VtZW50IHByemVjaG93eXdhbnkgbmEgc2Vyd2VyemUgc2llY2lvd3ltLCB3IHNpZWNpIGludHJhbmV0IGx1YiB3IEludGVybmVjaWUuDQpJTkRFWAkJCT0gSU5ERUtTCQkJIyMJVcW8eXdhIGluZGVrc3UgZG8gd3liaWVyYW5pYSB3YXJ0b8WbY2kgeiBvZHdvxYJhbmlhIGx1YiB0YWJsaWN5Lg0KSU5ESVJFQ1QJCT0gQURSLlBPxZpSCQkJIyMJWndyYWNhIG9kd2/FgmFuaWUgb2tyZcWbbG9uZSBwcnpleiB3YXJ0b8WbxIcgdGVrc3Rvd8SFLg0KTE9PS1VQCQkJPSBXWVNaVUtBSgkJCSMjCVd5c3p1a3VqZSB3YXJ0b8WbY2kgdyB3ZWt0b3J6ZSBsdWIgdGFibGljeS4NCk1BVENICQkJPSBQT0RBSi5QT1pZQ0rEmAkJCSMjCVd5c3p1a3VqZSB3YXJ0b8WbY2kgdyBvZHdvxYJhbml1IGx1YiB3IHRhYmxpY3kuDQpPRkZTRVQJCQk9IFBSWkVTVU5JxJhDSUUJCQkjIwlad3JhY2EgYWRyZXMgcHJ6ZXN1bmnEmXR5IG9kIGRhbmVnbyBvZHdvxYJhbmlhLg0KUk9XCQkJPSBXSUVSU1oJCQkjIwlad3JhY2EgbnVtZXIgd2llcnN6YSBvZHdvxYJhbmlhLg0KUk9XUwkJCT0gSUxFLldJRVJTWlkJCQkjIwlad3JhY2EgbGljemLEmSB3aWVyc3p5IGRsYSBkYW5lZ28gb2R3b8WCYW5pYS4NClJURAkJCT0gUlRECQkJCSMjCVBvYmllcmEgZGFuZSB3IGN6YXNpZSByemVjenl3aXN0eW0geiBwcm9ncmFtdSBvYnPFgnVndWrEhWNlZ28gYXV0b21hdHl6YWNqxJkgQ09NIChBdXRvbWF0eXphY2phOiBTcG9zw7NiIHByYWN5IHogb2JpZWt0YW1pIGFwbGlrYWNqaSBwb2Nob2R6xIVjeW1pIHogaW5uZWogYXBsaWthY2ppIGx1YiBuYXJ6xJlkemlhIHByb2pla3Rvd2FuaWEuIE5henl3YW5hIHdjemXFm25pZWogQXV0b21hdHl6YWNqxIUgT0xFLCBBdXRvbWF0eXphY2phIGplc3Qgc3RhbmRhcmRlbSBwcnplbXlzxYJvd3ltIGkgZnVua2NqxIUgb2JpZWt0b3dlZ28gbW9kZWx1IHNrxYJhZG5pa8OzdyAoQ09NLCBDb21wb25lbnQgT2JqZWN0IE1vZGVsKS4pLg0KVFJBTlNQT1NFCQk9IFRSQU5TUE9OVUoJCQkjIwlad3JhY2EgdHJhbnNwb25vd2FuxIUgdGFibGljxJkuDQpWTE9PS1VQCQkJPSBXWVNaVUtBSi5QSU9OT1dPCQkjIwlQcnplc3p1a3VqZSBwaWVyd3N6xIUga29sdW1uxJkgdGFibGljeSBpIHByemVjaG9kemkgd3pkxYJ1xbwgd2llcnN6YSwgYWJ5IHp3csOzY2nEhyB3YXJ0b8WbxIcga29tw7Nya2kuDQoNCg0KIyMNCiMjCU1hdGggYW5kIHRyaWdvbm9tZXRyeSBmdW5jdGlvbnMJCQlGdW5rY2plIG1hdGVtYXR5Y3puZSBpIHRyeWdvbm9tZXRyeWN6bmUNCiMjDQpBQlMJCQk9IE1PRFXFgS5MSUNaQlkJCQkjIwlad3JhY2Egd2FydG/Fm8SHIGFic29sdXRuxIUgbGljemJ5Lg0KQUNPUwkJCT0gQUNPUwkJCQkjIwlad3JhY2EgYXJjdXMgY29zaW51cyBsaWN6YnkuDQpBQ09TSAkJCT0gQUNPU0gJCQkJIyMJWndyYWNhIGFyY3VzIGNvc2ludXMgaGlwZXJib2xpY3pueSBsaWN6YnkuDQpBU0lOCQkJPSBBU0lOCQkJCSMjCVp3cmFjYSBhcmN1cyBzaW51cyBsaWN6YnkuDQpBU0lOSAkJCT0gQVNJTkgJCQkJIyMJWndyYWNhIGFyY3VzIHNpbnVzIGhpcGVyYm9saWN6bnkgbGljemJ5Lg0KQVRBTgkJCT0gQVRBTgkJCQkjIwlad3JhY2EgYXJjdXMgdGFuZ2VucyBsaWN6YnkuDQpBVEFOMgkJCT0gQVRBTjIJCQkJIyMJWndyYWNhIGFyY3VzIHRhbmdlbnMgbGljemJ5IG5hIHBvZHN0YXdpZSB3c3DDs8WCcnrEmWRueWNoIHggaSB5Lg0KQVRBTkgJCQk9IEFUQU5ICQkJCSMjCVp3cmFjYSBhcmN1cyB0YW5nZW5zIGhpcGVyYm9saWN6bnkgbGljemJ5Lg0KQ0VJTElORwkJCT0gWkFPS1IuVy5Hw5NSxJgJCQkjIwlaYW9rcsSFZ2xhIGxpY3pixJkgZG8gbmFqYmxpxbxzemVqIGxpY3pieSBjYcWCa293aXRlaiBsdWIgZG8gbmFqYmxpxbxzemVqIHdpZWxva3JvdG5vxZtjaSBkb2vFgmFkbm/Fm2NpLg0KQ09NQklOCQkJPSBLT01CSU5BQ0pFCQkJIyMJWndyYWNhIGxpY3pixJkga29tYmluYWNqaSBkbGEgZGFuZWogbGljemJ5IG9iaWVrdMOzdy4NCkNPUwkJCT0gQ09TCQkJCSMjCVp3cmFjYSBjb3NpbnVzIGxpY3pieS4NCkNPU0gJCQk9IENPU0gJCQkJIyMJWndyYWNhIGNvc2ludXMgaGlwZXJib2xpY3pueSBsaWN6YnkuDQpERUdSRUVTCQkJPSBTVE9QTklFCQkJIyMJS29ud2VydHVqZSByYWRpYW55IG5hIHN0b3BuaWUuDQpFVkVOCQkJPSBaQU9LUi5ETy5QQVJaCQkJIyMJWmFva3LEhWdsYSBsaWN6YsSZIHcgZ8OzcsSZIGRvIG5hamJsacW8c3plaiBsaWN6YnkgcGFyenlzdGVqLg0KRVhQCQkJPSBFWFAJCQkJIyMJWndyYWNhIHdhcnRvxZvEhyBsaWN6YnkgZSBwb2RuaWVzaW9uZWogZG8gcG90xJlnaSBva3JlxZtsb25laiBwcnpleiBwb2RhbsSFIGxpY3pixJkuDQpGQUNUCQkJPSBTSUxOSUEJCQkjIwlad3JhY2Egc2lsbmnEmSBsaWN6YnkuDQpGQUNURE9VQkxFCQk9IEZBQ1RET1VCTEUJCQkjIwlad3JhY2EgcG9kd8Ozam7EhSBzaWxuacSZIGxpY3pieS4NCkZMT09SCQkJPSBaQU9LUi5XLkTDk8WBCQkJIyMJWmFva3LEhWdsYSBsaWN6YsSZIHcgZMOzxYIsIHcga2llcnVua3UgemVyYS4NCkdDRAkJCT0gR0NECQkJCSMjCVp3cmFjYSBuYWp3acSZa3N6eSB3c3DDs2xueSBkemllbG5pay4NCklOVAkJCT0gWkFPS1IuRE8uQ0HFgUsJCQkjIwlaYW9rcsSFZ2xhIGxpY3pixJkgdyBkw7PFgiBkbyBuYWpibGnFvHN6ZWogbGljemJ5IGNhxYJrb3dpdGVqLg0KTENNCQkJPSBMQ00JCQkJIyMJWndyYWNhIG5ham1uaWVqc3rEhSB3c3DDs2xuxIUgd2llbG9rcm90bm/Fm8SHLg0KTE4JCQk9IExOCQkJCSMjCVp3cmFjYSBsb2dhcnl0bSBuYXR1cmFsbnkgcG9kYW5laiBsaWN6YnkuDQpMT0cJCQk9IExPRwkJCQkjIwlad3JhY2EgbG9nYXJ5dG0gZGFuZWogbGljemJ5IHByenkgemFkYW5laiBwb2RzdGF3aWUuDQpMT0cxMAkJCT0gTE9HMTAJCQkJIyMJWndyYWNhIGxvZ2FyeXRtIGR6aWVzacSZdG55IGxpY3pieS4NCk1ERVRFUk0JCQk9IFdZWk5BQ1pOSUsuTUFDSUVSWlkJCSMjCVp3cmFjYSB3eXpuYWN6bmlrIG1hY2llcnp5IHRhYmxpY3kuDQpNSU5WRVJTRQkJPSBNQUNJRVJaLk9EVwkJCSMjCVp3cmFjYSBvZHdyb3Rub8WbxIcgbWFjaWVyenkgdGFibGljeS4NCk1NVUxUCQkJPSBNQUNJRVJaLklMT0NaWU4JCSMjCVp3cmFjYSBpbG9jenluIG1hY2llcnp5IGR3w7NjaCB0YWJsaWMuDQpNT0QJCQk9IE1PRAkJCQkjIwlad3JhY2EgcmVzenTEmSB6IGR6aWVsZW5pYS4NCk1ST1VORAkJCT0gTVJPVU5ECQkJIyMJWndyYWNhIGxpY3pixJkgemFva3LEhWdsb27EhSBkbyDFvMSFZGFuZWogd2llbG9rcm90bm/Fm2NpLg0KTVVMVElOT01JQUwJCT0gTVVMVElOT01JQUwJCQkjIwlad3JhY2Egd2llbG9taWFuIGRsYSB6YmlvcnUgbGljemIuDQpPREQJCQk9IFpBT0tSLkRPLk5QQVJaCQkjIwlaYW9rcsSFZ2xhIGxpY3pixJkgdyBnw7NyxJkgZG8gbmFqYmxpxbxzemVqIGxpY3pieSBuaWVwYXJ6eXN0ZWouDQpQSQkJCT0gUEkJCQkJIyMJWndyYWNhIHdhcnRvxZvEhyBsaWN6YnkgUGkuDQpQT1dFUgkJCT0gUE9UxJhHQQkJCSMjCVp3cmFjYSBsaWN6YsSZIHBvZG5pZXNpb27EhSBkbyBwb3TEmWdpLg0KUFJPRFVDVAkJCT0gSUxPQ1pZTgkJCSMjCU1ub8W8eSBhcmd1bWVudHkuDQpRVU9USUVOVAkJPSBRVU9USUVOVAkJCSMjCVp3cmFjYSBpbG9yYXogKGNhxYJrb3dpdHkpLg0KUkFESUFOUwkJCT0gUkFESUFOWQkJCSMjCUtvbndlcnR1amUgc3RvcG5pZSBuYSByYWRpYW55Lg0KUkFORAkJCT0gTE9TCQkJCSMjCVp3cmFjYSBsaWN6YsSZIHBzZXVkb2xvc293xIUgeiB6YWtyZXN1IG9kIDAgZG8gMS4NClJBTkRCRVRXRUVOCQk9IFJBTkRCRVRXRUVOCQkJIyMJWndyYWNhIGxpY3pixJkgcHNldWRvbG9zb3fEhSB6IHpha3Jlc3Ugb2tyZcWbbG9uZWdvIHByemV6IHBvZGFuZSBhcmd1bWVudHkuDQpST01BTgkJCT0gUlpZTVNLSUUJCQkjIwlLb253ZXJ0dWplIGxpY3pixJkgYXJhYnNrxIUgbmEgcnp5bXNrxIUgamFrbyB0ZWtzdC4NClJPVU5ECQkJPSBaQU9LUgkJCQkjIwlaYW9rcsSFZ2xhIGxpY3pixJkgZG8gb2tyZcWbbG9uZWogbGljemJ5IGN5ZnIuDQpST1VORERPV04JCT0gWkFPS1IuRMOTxYEJCQkjIwlaYW9rcsSFZ2xhIGxpY3pixJkgdyBkw7PFgiwgdyBraWVydW5rdSB6ZXJhLg0KUk9VTkRVUAkJCT0gWkFPS1IuR8OTUkEJCQkjIwlaYW9rcsSFZ2xhIGxpY3pixJkgdyBnw7NyxJksIHcga2llcnVua3Ugb2QgemVyYS4NClNFUklFU1NVTQkJPSBTRVJJRVNTVU0JCQkjIwlad3JhY2Egc3VtxJkgc3plcmVndSBwb3TEmWdvd2VnbyBuYSBwb2RzdGF3aWUgd3pvcnUuDQpTSUdOCQkJPSBaTkFLLkxJQ1pCWQkJCSMjCVp3cmFjYSB6bmFrIGxpY3pieS4NClNJTgkJCT0gU0lOCQkJCSMjCVp3cmFjYSBzaW51cyBkYW5lZ28ga8SFdGEuDQpTSU5ICQkJPSBTSU5ICQkJCSMjCVp3cmFjYSBzaW51cyBoaXBlcmJvbGljem55IGxpY3pieS4NClNRUlQJCQk9IFBJRVJXSUFTVEVLCQkJIyMJWndyYWNhIGRvZGF0bmkgcGllcndpYXN0ZWsga3dhZHJhdG93eS4NClNRUlRQSQkJCT0gU1FSVFBJCQkJIyMJWndyYWNhIHBpZXJ3aWFzdGVrIGt3YWRyYXRvd3kgaWxvY3p5bnUgKGxpY3piYSAqIFBpKS4NClNVQlRPVEFMCQk9IFNVTVkuUE/FmlJFRE5JRQkJIyMJWndyYWNhIHN1bcSZIGN6xJnFm2Npb3fEhSBsaXN0eSBsdWIgYmF6eSBkYW55Y2guDQpTVU0JCQk9IFNVTUEJCQkJIyMJRG9kYWplIGFyZ3VtZW50eS4NClNVTUlGCQkJPSBTVU1BLkpFxbtFTEkJCQkjIwlEb2RhamUga29tw7Nya2kgb2tyZcWbbG9uZSBwcnpleiBwb2RhbmUga3J5dGVyaXVtLg0KU1VNSUZTCQkJPSBTVU1BLldBUlVOS8OTVwkJCSMjCURvZGFqZSBrb23Ds3JraSB3IHpha3Jlc2llLCBrdMOzcmUgc3BlxYJuaWFqxIUgd2llbGUga3J5dGVyacOzdy4NClNVTVBST0RVQ1QJCT0gU1VNQS5JTE9DWllOw5NXCQkjIwlad3JhY2Egc3VtxJkgaWxvY3p5bsOzdyBvZHBvd2llZG5pY2ggZWxlbWVudMOzdyB0YWJsaWN5Lg0KU1VNU1EJCQk9IFNVTUEuS1dBRFJBVMOTVwkJIyMJWndyYWNhIHN1bcSZIGt3YWRyYXTDs3cgYXJndW1lbnTDs3cuDQpTVU1YMk1ZMgkJPSBTVU1BLlgyLk0uWTIJCQkjIwlad3JhY2Egc3VtxJkgcsOzxbxuaWMga3dhZHJhdMOzdyBvZHBvd2llZG5pY2ggd2FydG/Fm2NpIHcgZHfDs2NoIHRhYmxpY2FjaC4NClNVTVgyUFkyCQk9IFNVTUEuWDIuUC5ZMgkJCSMjCVp3cmFjYSBzdW3EmSBzdW0ga3dhZHJhdMOzdyBvZHBvd2llZG5pY2ggd2FydG/Fm2NpIHcgZHfDs2NoIHRhYmxpY2FjaC4NClNVTVhNWTIJCQk9IFNVTUEuWE1ZLjIJCQkjIwlad3JhY2Egc3VtxJkga3dhZHJhdMOzdyByw7PFvG5pYyBvZHBvd2llZG5pY2ggd2FydG/Fm2NpIHcgZHfDs2NoIHRhYmxpY2FjaC4NClRBTgkJCT0gVEFOCQkJCSMjCVp3cmFjYSB0YW5nZW5zIGxpY3pieS4NClRBTkgJCQk9IFRBTkgJCQkJIyMJWndyYWNhIHRhbmdlbnMgaGlwZXJib2xpY3pueSBsaWN6YnkuDQpUUlVOQwkJCT0gTElDWkJBLkNBxYFLCQkJIyMJUHJ6eWNpbmEgbGljemLEmSBkbyB3YXJ0b8WbY2kgY2HFgmtvd2l0ZWouDQoNCg0KIyMNCiMjCVN0YXRpc3RpY2FsIGZ1bmN0aW9ucwkJCQlGdW5rY2plIHN0YXR5c3R5Y3puZQ0KIyMNCkFWRURFVgkJCT0gT0RDSC7FmlJFRE5JRQkJCSMjCVp3cmFjYSDFm3JlZG5pxIUgd2FydG/Fm8SHIG9kY2h5bGXFhCBhYnNvbHV0bnljaCBwdW5rdMOzdyBkYW55Y2ggb2QgaWNoIHdhcnRvxZtjaSDFm3JlZG5pZWouDQpBVkVSQUdFCQkJPSDFmlJFRE5JQQkJCSMjCVp3cmFjYSB3YXJ0b8WbxIcgxZtyZWRuacSFIGFyZ3VtZW50w7N3Lg0KQVZFUkFHRUEJCT0gxZpSRUROSUEuQQkJCSMjCVp3cmFjYSB3YXJ0b8WbxIcgxZtyZWRuacSFIGFyZ3VtZW50w7N3LCB6IHV3emdsxJlkbmllbmllbSBsaWN6YiwgdGVrc3TDs3cgaSB3YXJ0b8WbY2kgbG9naWN6bnljaC4NCkFWRVJBR0VJRgkJPSDFmlJFRE5JQS5KRcW7RUxJCQkjIwlad3JhY2EgxZtyZWRuacSFICjFm3JlZG5pxIUgYXJ5dG1ldHljem7EhSkgd3N6eXN0a2ljaCBrb23Ds3JlayB3IHpha3Jlc2llLCBrdMOzcmUgc3BlxYJuaWFqxIUgcG9kYW5lIGtyeXRlcmlhLg0KQVZFUkFHRUlGUwkJPSDFmlJFRE5JQS5XQVJVTkvDk1cJCSMjCVp3cmFjYSDFm3JlZG5pxIUgKMWbcmVkbmnEhSBhcnl0bWV0eWN6bsSFKSB3c3p5c3RraWNoIGtvbcOzcmVrLCBrdMOzcmUgc3BlxYJuaWFqxIUgamVkbm8gbHViIHdpxJljZWoga3J5dGVyacOzdy4NCkJFVEFESVNUCQk9IFJPWkvFgUFELkJFVEEJCQkjIwlad3JhY2Egc2t1bXVsb3dhbsSFIGZ1bmtjasSZIGfEmXN0b8WbY2kgcHJhd2RvcG9kb2JpZcWEc3R3YSBiZXRhLg0KQkVUQUlOVgkJCT0gUk9aS8WBQUQuQkVUQS5PRFcJCSMjCVp3cmFjYSBvZHdyb3Rub8WbxIcgc2t1bXVsb3dhbmVqIGZ1bmtjamkgZ8SZc3RvxZtjaSBwcmF3ZG9wb2RvYmllxYRzdHdhIGJldGEuDQpCSU5PTURJU1QJCT0gUk9aS8WBQUQuRFdVTQkJCSMjCVp3cmFjYSBwb2plZHluY3p5IHNrxYJhZG5payBkd3VtaWFub3dlZ28gcm96a8WCYWR1IHByYXdkb3BvZG9iaWXFhHN0d2EuDQpDSElESVNUCQkJPSBST1pLxYFBRC5DSEkJCQkjIwlad3JhY2Egd2FydG/Fm8SHIGplZG5vc3Ryb25uZWdvIHByYXdkb3BvZG9iaWXFhHN0d2Egcm96a8WCYWR1IGNoaS1rd2FkcmF0Lg0KQ0hJSU5WCQkJPSBST1pLxYFBRC5DSEkuT0RXCQkjIwlad3JhY2Egb2R3cm90bm/Fm8SHIHdhcnRvxZtjaSBqZWRub3N0cm9ubmVnbyBwcmF3ZG9wb2RvYmllxYRzdHdhIHJvemvFgmFkdSBjaGkta3dhZHJhdC4NCkNISVRFU1QJCQk9IFRFU1QuQ0hJCQkJIyMJWndyYWNhIHRlc3QgbmllemFsZcW8bm/Fm2NpLg0KQ09ORklERU5DRQkJPSBVRk5PxZrEhgkJCSMjCVp3cmFjYSBpbnRlcndhxYIgdWZub8WbY2kgZGxhIMWbcmVkbmllaiBwb3B1bGFjamkuDQpDT1JSRUwJCQk9IFdTUC5LT1JFTEFDSkkJCQkjIwlad3JhY2Egd3Nww7PFgmN6eW5uaWsga29yZWxhY2ppIGR3w7NjaCB6YmlvcsOzdyBkYW55Y2guDQpDT1VOVAkJCT0gSUxFLkxJQ1pCCQkJIyMJWmxpY3phIGxpY3pieSB6bmFqZHVqxIVjZSBzacSZIG5hIGxpxZtjaWUgYXJndW1lbnTDs3cuDQpDT1VOVEEJCQk9IElMRS5OSUVQVVNUWUNICQkjIwlabGljemEgd2FydG/Fm2NpIHpuYWpkdWrEhWNlIHNpxJkgbmEgbGnFm2NpZSBhcmd1bWVudMOzdy4NCkNPVU5UQkxBTksJCT0gTElDWi5QVVNURQkJCSMjCVp3cmFjYSBsaWN6YsSZIHB1c3R5Y2gga29tw7NyZWsgdyBwZXdueW0gemFrcmVzaWUuDQpDT1VOVElGCQkJPSBMSUNaLkpFxbtFTEkJCQkjIwlabGljemEga29tw7Nya2kgd2V3bsSFdHJ6IHpha3Jlc3UsIGt0w7NyZSBzcGXFgm5pYWrEhSBwb2RhbmUga3J5dGVyaWEuDQpDT1VOVElGUwkJPSBMSUNaLldBUlVOS0kJCQkjIwlabGljemEga29tw7Nya2kgd2V3bsSFdHJ6IHpha3Jlc3UsIGt0w7NyZSBzcGXFgm5pYWrEhSB3aWVsZSBrcnl0ZXJpw7N3Lg0KQ09WQVIJCQk9IEtPV0FSSUFOQ0pBCQkJIyMJWndyYWNhIGtvd2FyaWFuY2rEmSwgY3p5bGkgxZtyZWRuacSFIHdhcnRvxZvEhyBpbG9jenluw7N3IG9kcG93aWVkbmljaCBvZGNoeWxlxYQuDQpDUklUQklOT00JCT0gUFLDk0cuUk9aS8WBQUQuRFdVTQkJIyMJWndyYWNhIG5ham1uaWVqc3rEhSB3YXJ0b8WbxIcsIGRsYSBrdMOzcmVqIHNrdW11bG93YW55IHJvemvFgmFkIGR3dW1pYW5vd3kgamVzdCBtbmllanN6eSBuacW8IHdhcnRvxZvEhyBrcnl0ZXJpdW0gbHViIHLDs3dueSBqZWouDQpERVZTUQkJCT0gT0RDSC5LV0FEUkFUT1dFCQkjIwlad3JhY2Egc3VtxJkga3dhZHJhdMOzdyBvZGNoeWxlxYQuDQpFWFBPTkRJU1QJCT0gUk9aS8WBQUQuRVhQCQkJIyMJWndyYWNhIHJvemvFgmFkIHd5a8WCYWRuaWN6eS4NCkZESVNUCQkJPSBST1pLxYFBRC5GCQkJIyMJWndyYWNhIHJvemvFgmFkIHByYXdkb3BvZG9iaWXFhHN0d2EgRi4NCkZJTlYJCQk9IFJPWkvFgUFELkYuT0RXCQkJIyMJWndyYWNhIG9kd3JvdG5vxZvEhyByb3prxYJhZHUgcHJhd2RvcG9kb2JpZcWEc3R3YSBGLg0KRklTSEVSCQkJPSBST1pLxYFBRC5GSVNIRVIJCSMjCVp3cmFjYSB0cmFuc2Zvcm1hY2rEmSBGaXNoZXJhLg0KRklTSEVSSU5WCQk9IFJPWkvFgUFELkZJU0hFUi5PRFcJCSMjCVp3cmFjYSBvZHdyb3Rub8WbxIcgdHJhbnNmb3JtYWNqaSBGaXNoZXJhLg0KRk9SRUNBU1QJCT0gUkVHTElOWAkJCSMjCVp3cmFjYSB3YXJ0b8WbxIcgdHJlbmR1IGxpbmlvd2Vnby4NCkZSRVFVRU5DWQkJPSBDWsSYU1RPxZrEhgkJCSMjCVp3cmFjYSByb3prxYJhZCBjesSZc3RvdGxpd2/Fm2NpIGpha28gdGFibGljxJkgcGlvbm93xIUuDQpGVEVTVAkJCT0gVEVTVC5GCQkJIyMJWndyYWNhIHd5bmlrIHRlc3R1IEYuDQpHQU1NQURJU1QJCT0gUk9aS8WBQUQuR0FNTUEJCQkjIwlad3JhY2Egcm96a8WCYWQgZ2FtbWEuDQpHQU1NQUlOVgkJPSBST1pLxYFBRC5HQU1NQS5PRFcJCSMjCVp3cmFjYSBvZHdyb3Rub8WbxIcgc2t1bXVsb3dhbmVnbyByb3prxYJhZHUgZ2FtbWEuDQpHQU1NQUxOCQkJPSBST1pLxYFBRC5MSU4uR0FNTUEJCSMjCVp3cmFjYSBsb2dhcnl0bSBuYXR1cmFsbnkgZnVua2NqaSBnYW1tYSwgzpMoeCkuDQpHRU9NRUFOCQkJPSDFmlJFRE5JQS5HRU9NRVRSWUNaTkEJCSMjCVp3cmFjYSDFm3JlZG5pxIUgZ2VvbWV0cnljem7EhS4NCkdST1dUSAkJCT0gUkVHRVhQVwkJCSMjCVp3cmFjYSB3YXJ0b8WbY2kgdHJlbmR1IHd5a8WCYWRuaWN6ZWdvLg0KSEFSTUVBTgkJCT0gxZpSRUROSUEuSEFSTU9OSUNaTkEJCSMjCVp3cmFjYSDFm3JlZG5pxIUgaGFybW9uaWN6bsSFLg0KSFlQR0VPTURJU1QJCT0gUk9aS8WBQUQuSElQRVJHRU9NCQkjIwlad3JhY2Egcm96a8WCYWQgaGlwZXJnZW9tZXRyeWN6bnkuDQpJTlRFUkNFUFQJCT0gT0RDScSYVEEJCQkjIwlad3JhY2EgcHVua3QgcHJ6ZWNpxJljaWEgb3NpIHBpb25vd2VqIHogbGluacSFIHJlZ3Jlc2ppIGxpbmlvd2VqLg0KS1VSVAkJCT0gS1VSVE9aQQkJCSMjCVp3cmFjYSBrdXJ0b3rEmSB6YmlvcnUgZGFueWNoLg0KTEFSR0UJCQk9IE1BWC5LCQkJCSMjCVp3cmFjYSBrLXTEhSBuYWp3acSZa3N6xIUgd2FydG/Fm8SHIHplIHpiaW9ydSBkYW55Y2guDQpMSU5FU1QJCQk9IFJFR0xJTlAJCQkjIwlad3JhY2EgcGFyYW1ldHJ5IHRyZW5kdSBsaW5pb3dlZ28uDQpMT0dFU1QJCQk9IFJFR0VYUFAJCQkjIwlad3JhY2EgcGFyYW1ldHJ5IHRyZW5kdSB3eWvFgmFkbmljemVnby4NCkxPR0lOVgkJCT0gUk9aS8WBQUQuTE9HLk9EVwkJIyMJWndyYWNhIG9kd3JvdG5vxZvEhyByb3prxYJhZHUgbG9nYXJ5dG11IG5hdHVyYWxuZWdvLg0KTE9HTk9STURJU1QJCT0gUk9aS8WBQUQuTE9HCQkJIyMJWndyYWNhIHNrdW11bG93YW55IHJvemvFgmFkIGxvZ2FyeXRtdSBuYXR1cmFsbmVnby4NCk1BWAkJCT0gTUFYCQkJCSMjCVp3cmFjYSBtYWtzeW1hbG7EhSB3YXJ0b8WbxIcgbGlzdHkgYXJndW1lbnTDs3cuDQpNQVhBCQkJPSBNQVguQQkJCQkjIwlad3JhY2EgbWFrc3ltYWxuxIUgd2FydG/Fm8SHIGxpc3R5IGFyZ3VtZW50w7N3LCB6IHV3emdsxJlkbmllbmllbSBsaWN6YiwgdGVrc3TDs3cgaSB3YXJ0b8WbY2kgbG9naWN6bnljaC4NCk1FRElBTgkJCT0gTUVESUFOQQkJCSMjCVp3cmFjYSBtZWRpYW7EmSBwb2RhbnljaCBsaWN6Yi4NCk1JTgkJCT0gTUlOCQkJCSMjCVp3cmFjYSBtaW5pbWFsbsSFIHdhcnRvxZvEhyBsaXN0eSBhcmd1bWVudMOzdy4NCk1JTkEJCQk9IE1JTi5BCQkJCSMjCVp3cmFjYSBuYWptbmllanN6xIUgd2FydG/Fm8SHIGxpc3R5IGFyZ3VtZW50w7N3LCB6IHV3emdsxJlkbmllbmllbSBsaWN6YiwgdGVrc3TDs3cgaSB3YXJ0b8WbY2kgbG9naWN6bnljaC4NCk1PREUJCQk9IFdZU1QuTkFKQ1rEmMWaQ0lFSgkJIyMJWndyYWNhIHdhcnRvxZvEhyBuYWpjesSZxZtjaWVqIHd5c3TEmXB1asSFY8SFIHcgemJpb3J6ZSBkYW55Y2guDQpORUdCSU5PTURJU1QJCT0gUk9aS8WBQUQuRFdVTS5QUlpFQwkJIyMJWndyYWNhIHVqZW1ueSByb3prxYJhZCBkd3VtaWFub3d5Lg0KTk9STURJU1QJCT0gUk9aS8WBQUQuTk9STUFMTlkJCSMjCVp3cmFjYSByb3prxYJhZCBub3JtYWxueSBza3VtdWxvd2FueS4NCk5PUk1JTlYJCQk9IFJPWkvFgUFELk5PUk1BTE5ZLk9EVwkJIyMJWndyYWNhIG9kd3JvdG5vxZvEhyByb3prxYJhZHUgbm9ybWFsbmVnbyBza3VtdWxvd2FuZWdvLg0KTk9STVNESVNUCQk9IFJPWkvFgUFELk5PUk1BTE5ZLlMJCSMjCVp3cmFjYSBzdGFuZGFyZG93eSByb3prxYJhZCBub3JtYWxueSBza3VtdWxvd2FueS4NCk5PUk1TSU5WCQk9IFJPWkvFgUFELk5PUk1BTE5ZLlMuT0RXCSMjCVp3cmFjYSBvZHdyb3Rub8WbxIcgc3RhbmRhcmRvd2VnbyByb3prxYJhZHUgbm9ybWFsbmVnbyBza3VtdWxvd2FuZWdvLg0KUEVBUlNPTgkJCT0gUEVBUlNPTgkJCSMjCVp3cmFjYSB3c3DDs8WCY3p5bm5payBrb3JlbGFjamkgbW9tZW50dSBpbG9jenludSBQZWFyc29uYS4NClBFUkNFTlRJTEUJCT0gUEVSQ0VOVFlMCQkJIyMJV3l6bmFjemEgay10eSBwZXJjZW50eWwgd2FydG/Fm2NpIHcgemFrcmVzaWUuDQpQRVJDRU5UUkFOSwkJPSBQUk9DRU5ULlBPWllDSkEJCSMjCVp3cmFjYSBwcm9jZW50b3fEhSBwb3p5Y2rEmSB3YXJ0b8WbY2kgdyB6YmlvcnplIGRhbnljaC4NClBFUk1VVAkJCT0gUEVSTVVUQUNKRQkJCSMjCVp3cmFjYSBsaWN6YsSZIHBlcm11dGFjamkgZGxhIGRhbmVqIGxpY3pieSBvYmlla3TDs3cuDQpQT0lTU09OCQkJPSBST1pLxYFBRC5QT0lTU09OCQkjIwlad3JhY2Egcm96a8WCYWQgUG9pc3NvbmEuDQpQUk9CCQkJPSBQUkFXRFBECQkJIyMJWndyYWNhIHByYXdkb3BvZG9iaWXFhHN0d28sIMW8ZSB3YXJ0b8WbY2kgdyB6YWtyZXNpZSBsZcW8xIUgcG9tacSZZHp5IGR3aWVtYSBncmFuaWNhbWkuDQpRVUFSVElMRQkJPSBLV0FSVFlMCQkJIyMJV3l6bmFjemEga3dhcnR5bCB6YmlvcnUgZGFueWNoLg0KUkFOSwkJCT0gUE9aWUNKQQkJCSMjCVp3cmFjYSBwb3p5Y2rEmSBsaWN6YnkgbmEgbGnFm2NpZSBsaWN6Yi4NClJTUQkJCT0gUi5LV0FEUkFUCQkJIyMJWndyYWNhIGt3YWRyYXQgd3Nww7PFgmN6eW5uaWthIGtvcmVsYWNqaSBtb21lbnR1IGlsb2N6eW51IFBlYXJzb25hLg0KU0tFVwkJCT0gU0tPxZpOT8WaxIYJCQkjIwlad3JhY2Egc2tvxZtub8WbxIcgcm96a8WCYWR1Lg0KU0xPUEUJCQk9IE5BQ0hZTEVOSUUJCQkjIwlad3JhY2EgbmFjaHlsZW5pZSBsaW5paSByZWdyZXNqaSBsaW5pb3dlai4NClNNQUxMCQkJPSBNSU4uSwkJCQkjIwlad3JhY2Egay10xIUgbmFqbW5pZWpzesSFIHdhcnRvxZvEhyB6ZSB6YmlvcnUgZGFueWNoLg0KU1RBTkRBUkRJWkUJCT0gTk9STUFMSVpVSgkJCSMjCVp3cmFjYSB3YXJ0b8WbxIcgem5vcm1hbGl6b3dhbsSFLg0KU1RERVYJCQk9IE9EQ0guU1RBTkRBUkRPV0UJCSMjCVN6YWN1amUgb2RjaHlsZW5pZSBzdGFuZGFyZG93ZSBuYSBwb2RzdGF3aWUgcHLDs2JraS4NClNUREVWQQkJCT0gT0RDSC5TVEFOREFSRE9XRS5BCQkjIwlTemFjdWplIG9kY2h5bGVuaWUgc3RhbmRhcmRvd2UgbmEgcG9kc3Rhd2llIHByw7Nia2ksIHogdXd6Z2zEmWRuaWVuaWVtIGxpY3piLCB0ZWtzdMOzdyBpIHdhcnRvxZtjaSBsb2dpY3pueWNoLg0KU1RERVZQCQkJPSBPRENILlNUQU5EQVJELlBPUFVMCQkjIwlPYmxpY3phIG9kY2h5bGVuaWUgc3RhbmRhcmRvd2UgbmEgcG9kc3Rhd2llIGNhxYJlaiBwb3B1bGFjamkuDQpTVERFVlBBCQkJPSBPRENILlNUQU5EQVJELlBPUFVMLkEJCSMjCU9ibGljemEgb2RjaHlsZW5pZSBzdGFuZGFyZG93ZSBuYSBwb2RzdGF3aWUgY2HFgmVqIHBvcHVsYWNqaSwgeiB1d3pnbMSZZG5pZW5pZW0gbGljemIsIHRla3PDs3cgaSB3YXJ0b8WbY2kgbG9naWN6bnljaC4NClNURVlYCQkJPSBSRUdCxYFTVEQJCQkjIwlad3JhY2EgYsWCxIVkIHN0YW5kYXJkb3d5IHByemV3aWR6aWFuZWogd2FydG/Fm2NpIHkgZGxhIGthxbxkZWogd2FydG/Fm2NpIHggdyByZWdyZXNqaS4NClRESVNUCQkJPSBST1pLxYFBRC5UCQkJIyMJWndyYWNhIHJvemvFgmFkIHQtU3R1ZGVudGEuDQpUSU5WCQkJPSBST1pLxYFBRC5ULk9EVwkJCSMjCVp3cmFjYSBvZHdyb3Rub8WbxIcgcm96a8WCYWR1IHQtU3R1ZGVudGEuDQpUUkVORAkJCT0gUkVHTElOVwkJCSMjCVp3cmFjYSB3YXJ0b8WbY2kgdHJlbmR1IGxpbmlvd2Vnby4NClRSSU1NRUFOCQk9IMWaUkVETklBLldFV04JCQkjIwlad3JhY2EgxZtyZWRuacSFIHdhcnRvxZvEhyBkbGEgd27EmXRyemEgemJpb3J1IGRhbnljaC4NClRURVNUCQkJPSBURVNULlQJCQkjIwlad3JhY2EgcHJhd2RvcG9kb2JpZcWEc3R3byB6d2nEhXphbmUgeiB0ZXN0ZW0gdC1TdHVkZW50YS4NClZBUgkJCT0gV0FSSUFOQ0pBCQkJIyMJU3phY3VqZSB3YXJpYW5jasSZIG5hIHBvZHN0YXdpZSBwcsOzYmtpLg0KVkFSQQkJCT0gV0FSSUFOQ0pBLkEJCQkjIwlTemFjdWplIHdhcmlhbmNqxJkgbmEgcG9kc3Rhd2llIHByw7Nia2ksIHogdXd6Z2zEmWRuaWVuaWVtIGxpY3piLCB0ZWtzdMOzdyBpIHdhcnRvxZtjaSBsb2dpY3pueWNoLg0KVkFSUAkJCT0gV0FSSUFOQ0pBLlBPUFVMCQkjIwlPYmxpY3phIHdhcmlhbmNqxJkgbmEgcG9kc3Rhd2llIGNhxYJlaiBwb3B1bGFjamkuDQpWQVJQQQkJCT0gV0FSSUFOQ0pBLlBPUFVMLkEJCSMjCU9ibGljemEgd2FyaWFuY2rEmSBuYSBwb2RzdGF3aWUgY2HFgmVqIHBvcHVsYWNqaSwgeiB1d3pnbMSZZG5pZW5pZW0gbGljemIsIHRla3N0w7N3IGkgd2FydG/Fm2NpIGxvZ2ljem55Y2guDQpXRUlCVUxMCQkJPSBST1pLxYFBRC5XRUlCVUxMCQkjIwlad3JhY2Egcm96a8WCYWQgV2VpYnVsbGEuDQpaVEVTVAkJCT0gVEVTVC5aCQkJIyMJWndyYWNhIHdhcnRvxZvEhyBqZWRub3N0cm9ubmVnbyBwcmF3ZG9wb2RvYmllxYRzdHdhIHRlc3R1IHouDQoNCg0KIyMNCiMjCVRleHQgZnVuY3Rpb25zCQkJCQlGdW5rY2plIHRla3N0b3dlDQojIw0KQVNDCQkJPSBBU0MJCQkJIyMJWmFtaWVuaWEgbGl0ZXJ5IGFuZ2llbHNraWUgbHViIGthdGFrYW5hIG8gcGXFgm5laiBzemVyb2tvxZtjaSAoZHd1YmFqdG93ZSkgdyBjacSFZ3Ugem5ha8OzdyBuYSB6bmFraSBvIHN6ZXJva2/Fm2NpIHBvxYLDs3drb3dlaiAoamVkbm9iYWp0b3dlKS4NCkJBSFRURVhUCQk9IEJBSFRURVhUCQkJIyMJS29ud2VydHVqZSBsaWN6YsSZIG5hIHRla3N0LCBzdG9zdWrEhWMgZm9ybWF0IHdhbHV0b3d5IMOfIChiYWh0KS4NCkNIQVIJCQk9IFpOQUsJCQkJIyMJWndyYWNhIHpuYWsgbyBwb2RhbnltIG51bWVyemUga29kdS4NCkNMRUFOCQkJPSBPQ1pZxZrEhgkJCSMjCVVzdXdhIHogdGVrc3R1IHdzenlzdGtpZSB6bmFraSwga3TDs3JlIG5pZSBtb2fEhSBiecSHIGRydWtvd2FuZS4NCkNPREUJCQk9IEtPRAkJCQkjIwlad3JhY2Ega29kIG51bWVyeWN6bnkgcGllcndzemVnbyB6bmFrdSB3IGNpxIVndSB0ZWtzdG93eW0uDQpDT05DQVRFTkFURQkJPSBaxYHEhENaLlRFS1NUWQkJCSMjCcWBxIVjenkga2lsa2Egb2RkemllbG55Y2ggdGVrc3TDs3cgdyBqZWRlbiB0ZWtzdC4NCkRPTExBUgkJCT0gS1dPVEEJCQkJIyMJS29ud2VydHVqZSBsaWN6YsSZIG5hIHRla3N0LCBzdG9zdWrEhWMgZm9ybWF0IHdhbHV0b3d5ICQgKGRvbGFyKS4NCkVYQUNUCQkJPSBQT1LDk1dOQUoJCQkjIwlTcHJhd2R6YSBpZGVudHljem5vxZvEhyBkd8OzY2ggd2FydG/Fm2NpIHRla3N0b3d5Y2guDQpGSU5ECQkJPSBaTkFKRMW5CQkJIyMJWm5hamR1amUgamVkbsSFIHdhcnRvxZvEhyB0ZWtzdG93xIUgd2V3bsSFdHJ6IGlubmVqICh6IHV3emdsxJlkbmllbmllbSB3aWVsa2ljaCBpIG1hxYJ5Y2ggbGl0ZXIpLg0KRklOREIJCQk9IFpOQUpExblCCQkJIyMJWm5hamR1amUgamVkbsSFIHdhcnRvxZvEhyB0ZWtzdG93xIUgd2V3bsSFdHJ6IGlubmVqICh6IHV3emdsxJlkbmllbmllbSB3aWVsa2ljaCBpIG1hxYJ5Y2ggbGl0ZXIpLg0KRklYRUQJCQk9IFpBT0tSLkRPLlRFS1NUCQkjIwlGb3JtYXR1amUgbGljemLEmSBqYWtvIHRla3N0IHByenkgc3RhxYJlaiBsaWN6YmllIG1pZWpzYyBkemllc2nEmXRueWNoLg0KSklTCQkJPSBKSVMJCQkJIyMJWm1pZW5pYSBsaXRlcnkgYW5naWVsc2tpZSBsdWIga2F0YWthbmEgbyBzemVyb2tvxZtjaSBwb8WCw7N3a293ZWogKGplZG5vYmFqdG93ZSkgdyBjacSFZ3Ugem5ha8OzdyBuYSB6bmFraSBvIHBlxYJuZWogc3plcm9rb8WbY2kgKGR3dWJhanRvd2UpLg0KTEVGVAkJCT0gTEVXWQkJCQkjIwlad3JhY2Egc2tyYWpuZSBsZXdlIHpuYWtpIHogd2FydG/Fm2NpIHRla3N0b3dlai4NCkxFRlRCCQkJPSBMRVdZQgkJCQkjIwlad3JhY2Egc2tyYWpuZSBsZXdlIHpuYWtpIHogd2FydG/Fm2NpIHRla3N0b3dlai4NCkxFTgkJCT0gRMWBCQkJCSMjCVp3cmFjYSBsaWN6YsSZIHpuYWvDs3cgY2nEhWd1IHRla3N0b3dlZ28uDQpMRU5CCQkJPSBExYEuQgkJCQkjIwlad3JhY2EgbGljemLEmSB6bmFrw7N3IGNpxIVndSB0ZWtzdG93ZWdvLg0KTE9XRVIJCQk9IExJVEVSWS5NQcWBRQkJCSMjCUtvbndlcnR1amUgd2llbGtpZSBsaXRlcnkgdGVrc3R1IG5hIG1hxYJlIGxpdGVyeS4NCk1JRAkJCT0gRlJBR01FTlQuVEVLU1RVCQkjIwlad3JhY2Egb2tyZcWbbG9uxIUgbGljemLEmSB6bmFrw7N3IHogY2nEhWd1IHRla3N0b3dlZ28sIHphY3p5bmFqxIVjIG9kIHphZGFuZWogcG96eWNqaS4NCk1JREIJCQk9IEZSQUdNRU5ULlRFS1NUVS5CCQkjIwlad3JhY2Egb2tyZcWbbG9uxIUgbGljemLEmSB6bmFrw7N3IHogY2nEhWd1IHRla3N0b3dlZ28sIHphY3p5bmFqxIVjIG9kIHphZGFuZWogcG96eWNqaS4NClBIT05FVElDCQk9IFBIT05FVElDCQkJIyMJV3liaWVyYSB6bmFraSBmb25ldHljem5lIChmdXJpZ2FuYSkgeiBjacSFZ3UgdGVrc3Rvd2Vnby4NClBST1BFUgkJCT0gWi5XSUVMS0lFSi5MSVRFUlkJCSMjCVphc3TEmXB1amUgcGllcndzesSFIGxpdGVyxJkga2HFvGRlZ28gd3lyYXp1IHRla3N0dSB3aWVsa8SFIGxpdGVyxIUuDQpSRVBMQUNFCQkJPSBaQVNUxIRQCQkJIyMJWmFzdMSZcHVqZSB6bmFraSB3IHRla8WbY2llLg0KUkVQTEFDRUIJCT0gWkFTVMSEUC5CCQkJIyMJWmFzdMSZcHVqZSB6bmFraSB3IHRla8WbY2llLg0KUkVQVAkJCT0gUE9XVAkJCQkjIwlQb3dpZWxhIHRla3N0IGRhbsSFIGxpY3pixJkgcmF6eS4NClJJR0hUCQkJPSBQUkFXWQkJCQkjIwlad3JhY2Egc2tyYWpuZSBwcmF3ZSB6bmFraSB6IHdhcnRvxZtjaSB0ZWtzdG93ZWouDQpSSUdIVEIJCQk9IFBSQVdZQgkJCSMjCVp3cmFjYSBza3Jham5lIHByYXdlIHpuYWtpIHogd2FydG/Fm2NpIHRla3N0b3dlai4NClNFQVJDSAkJCT0gU1pVS0FKLlRFS1NUCQkJIyMJV3lzenVrdWplIGplZG7EhSB3YXJ0b8WbxIcgdGVrc3Rvd8SFIHdld27EhXRyeiBpbm5laiAoYmV6IHV3emdsxJlkbmlhbmlhIHdpZWxrb8WbY2kgbGl0ZXIpLg0KU0VBUkNIQgkJCT0gU1pVS0FKLlRFS1NULkIJCSMjCVd5c3p1a3VqZSBqZWRuxIUgd2FydG/Fm8SHIHRla3N0b3fEhSB3ZXduxIV0cnogaW5uZWogKGJleiB1d3pnbMSZZG5pYW5pYSB3aWVsa2/Fm2NpIGxpdGVyKS4NClNVQlNUSVRVVEUJCT0gUE9EU1RBVwkJCSMjCVBvZHN0YXdpYSBub3d5IHRla3N0IHcgbWllanNjZSBwb3ByemVkbmllZ28gdGVrc3R1IHcgY2nEhWd1IHRla3N0b3d5bS4NClQJCQk9IFQJCQkJIyMJS29ud2VydHVqZSBhcmd1bWVudHkgbmEgdGVrc3QuDQpURVhUCQkJPSBURUtTVAkJCQkjIwlGb3JtYXR1amUgbGljemLEmSBpIGtvbndlcnR1amUgasSFIG5hIHRla3N0Lg0KVFJJTQkJCT0gVVNVxYMuWkLEmERORS5PRFNUxJhQWQkJIyMJVXN1d2Egc3BhY2plIHogdGVrc3R1Lg0KVVBQRVIJCQk9IExJVEVSWS5XSUVMS0lFCQkjIwlLb253ZXJ0dWplIHpuYWtpIHRla3N0dSBuYSB3aWVsa2llIGxpdGVyeS4NClZBTFVFCQkJPSBXQVJUT8WaxIYJCQkjIwlLb253ZXJ0dWplIGFyZ3VtZW50IHRla3N0b3d5IG5hIGxpY3pixJkuDQo=]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/locale/pt/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/locale/pt/br/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/locale/pt/br/config</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[77u/IyMNCiMjIFBIUEV4Y2VsDQojIw0NCiMjIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTEgUEhQRXhjZWwNCiMjDQojIyBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yDQojIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljDQojIyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXINCiMjIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLg0KIyMNCiMjIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLA0KIyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YNCiMjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VDQojIyBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLg0KIyMNCiMjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMNCiMjIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUNCiMjIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQ0KIyMNCiMjIEBjYXRlZ29yeSAgIFBIUEV4Y2VsDQojIyBAcGFja2FnZSAgICBQSFBFeGNlbF9TZXR0aW5ncw0KIyMgQGNvcHlyaWdodCAgQ29weXJpZ2h0IChjKSAyMDA2IC0gMjAxMSBQSFBFeGNlbCAoaHR0cDovL3d3dy5jb2RlcGxleC5jb20vUEhQRXhjZWwpDQojIyBAbGljZW5zZSAgICBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvb2xkLWxpY2Vuc2VzL2xncGwtMi4xLnR4dAlMR1BMDQojIyBAdmVyc2lvbiAgICAxLjcuNywgMjAxMi0wNS0xOQ0KIyMNCiMjDQoNCg0KQXJndW1lbnRTZXBhcmF0b3IJPSA7DQoNCg0KIyMNCiMjCShGb3IgZnV0dXJlIHVzZSkNCiMjDQpjdXJyZW5jeVN5bWJvbAk9IFIkDQoNCg0KIyMNCiMjCUV4Y2VsIEVycm9yIENvZGVzCShGb3IgZnV0dXJlIHVzZSkNDQojIw0KTlVMTAk9ICNOVUxPIQ0KRElWMAk9ICNESVYvMCENClZBTFVFCT0gI1ZBTE9SIQ0KUkVGCT0gI1JFRiENCk5BTUUJPSAjTk9NRT8NCk5VTQk9ICNOw5pNIQ0KTkEJPSAjTi9EDQo=]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/locale/pt/br/functions</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[77u/IyMNCiMjCUFkZC1pbiBhbmQgQXV0b21hdGlvbiBmdW5jdGlvbnMJCQlGdW7Dp8O1ZXMgU3VwbGVtZW50byBlIEF1dG9tYcOnw6NvDQojIw0KR0VUUElWT1REQVRBCQk9IElORk9EQURPU1RBQkVMQURJTsOCTUlDQQkjIwlSZXRvcm5hIG9zIGRhZG9zIGFybWF6ZW5hZG9zIGVtIHVtIHJlbGF0w7NyaW8gZGUgdGFiZWxhIGRpbsOibWljYQ0KDQoNCiMjDQojIwlDdWJlIGZ1bmN0aW9ucwkJCQkJRnVuw6fDtWVzIGRlIEN1Ym8NCiMjDQpDVUJFS1BJTUVNQkVSCQk9IE1FTUJST0tQSUNVQk8JCQkjIwlSZXRvcm5hIG8gbm9tZSBkZSB1bSBLUEkgKGluZGljYWRvciBkZSBkZXNlbXBlbmhvLWNoYXZlKSwgdW1hIHByb3ByaWVkYWRlIGUgdW1hIG1lZGlkYSBlIGV4aWJlIG8gbm9tZSBlIGEgcHJvcHJpZWRhZGUgbmEgY8OpbHVsYS4gVW0gS1BJIMOpIHVtYSBtZWRpZGEgcXVhbnRpZmljw6F2ZWwsIGNvbW8gbyBsdWNybyBicnV0byBtZW5zYWwgb3UgYSByb3RhdGl2aWRhZGUgdHJpbWVzdHJhbCBkb3MgZnVuY2lvbsOhcmlvcywgdXNhZGEgcGFyYSBtb25pdG9yYXIgbyBkZXNlbXBlbmhvIGRlIHVtYSBvcmdhbml6YcOnw6NvLg0KQ1VCRU1FTUJFUgkJPSBNRU1CUk9DVUJPCQkJIyMJUmV0b3JuYSB1bSBtZW1icm8gb3UgdHVwbGEgZW0gdW1hIGhpZXJhcnF1aWEgZGUgY3Viby4gVXNlIHBhcmEgdmFsaWRhciBzZSBvIG1lbWJybyBvdSB0dXBsYSBleGlzdGUgbm8gY3Viby4NCkNVQkVNRU1CRVJQUk9QRVJUWQk9IFBST1BSSUVEQURFTUVNQlJPQ1VCTwkJIyMJUmV0b3JuYSBvIHZhbG9yIGRhIHByb3ByaWVkYWRlIGRlIHVtIG1lbWJybyBubyBjdWJvLiBVc2FkYSBwYXJhIHZhbGlkYXIgYSBleGlzdMOqbmNpYSBkbyBub21lIGRvIG1lbWJybyBubyBjdWJvIGUgcGFyYSByZXRvcm5hciBhIHByb3ByaWVkYWRlIGVzcGVjaWZpY2FkYSBwYXJhIGVzc2UgbWVtYnJvLg0KQ1VCRVJBTktFRE1FTUJFUgk9IE1FTUJST0NMQVNTSUZJQ0FET0NVQk8JIyMJUmV0b3JuYSBvIGVuw6lzaW1vIG1lbWJybywgb3UgbyBtZW1icm8gb3JkZW5hZG8sIGVtIHVtIGNvbmp1bnRvLiBVc2UgcGFyYSByZXRvcm5hciB1bSBvdSBtYWlzIGVsZW1lbnRvcyBlbSB1bSBjb25qdW50bywgYXNzaW0gY29tbyBvIG1lbGhvciB2ZW5kZWRvciBvdSBvcyBkZXogbWVsaG9yZXMgYWx1bm9zLg0KQ1VCRVNFVAkJCT0gQ09OSlVOVE9DVUJPCQkJIyMJRGVmaW5lIHVtIGNvbmp1bnRvIGNhbGN1bGFkbyBkZSBtZW1icm9zIG91IHR1cGxhcyBlbnZpYW5kbyB1bWEgZXhwcmVzc8OjbyBkbyBjb25qdW50byBwYXJhIG8gY3VibyBubyBzZXJ2aWRvciwgcXVlIGNyaWEgbyBjb25qdW50byBlIG8gcmV0b3JuYSBwYXJhIG8gTWljcm9zb2Z0IE9mZmljZSBFeGNlbC4NCkNVQkVTRVRDT1VOVAkJPSBDT05UQUdFTUNPTkpVTlRPQ1VCTwkJIyMJUmV0b3JuYSBvIG7Dum1lcm8gZGUgaXRlbnMgZW0gdW0gY29uanVudG8uDQpDVUJFVkFMVUUJCT0gVkFMT1JDVUJPCQkJIyMJUmV0b3JuYSB1bSB2YWxvciBhZ3JlZ2FkbyBkZSB1bSBjdWJvLg0KDQoNCiMjDQojIwlEYXRhYmFzZSBmdW5jdGlvbnMJCQkJRnVuw6fDtWVzIGRlIGJhbmNvIGRlIGRhZG9zDQojIw0KREFWRVJBR0UJCT0gQkRNw4lESUEJCQkjIwlSZXRvcm5hIGEgbcOpZGlhIGRhcyBlbnRyYWRhcyBzZWxlY2lvbmFkYXMgZGUgdW0gYmFuY28gZGUgZGFkb3MNCkRDT1VOVAkJCT0gQkRDT05UQVIJCQkjIwlDb250YSBhcyBjw6lsdWxhcyBxdWUgY29udMOqbSBuw7ptZXJvcyBlbSB1bSBiYW5jbyBkZSBkYWRvcw0KRENPVU5UQQkJCT0gQkRDT05UQVJBCQkJIyMJQ29udGEgY8OpbHVsYXMgbsOjbyB2YXppYXMgZW0gdW0gYmFuY28gZGUgZGFkb3MNCkRHRVQJCQk9IEJERVhUUkFJUgkJCSMjCUV4dHJhaSBkZSB1bSBiYW5jbyBkZSBkYWRvcyB1bSDDum5pY28gcmVnaXN0cm8gcXVlIGNvcnJlc3BvbmRlIGEgdW0gY3JpdMOpcmlvIGVzcGVjw61maWNvDQpETUFYCQkJPSBCRE3DgVgJCQkJIyMJUmV0b3JuYSBvIHZhbG9yIG3DoXhpbW8gZGUgZW50cmFkYXMgc2VsZWNpb25hZGFzIGRlIHVtIGJhbmNvIGRlIGRhZG9zDQpETUlOCQkJPSBCRE3DjU4JCQkJIyMJUmV0b3JuYSBvIHZhbG9yIG3DrW5pbW8gZGUgZW50cmFkYXMgc2VsZWNpb25hZGFzIGRlIHVtIGJhbmNvIGRlIGRhZG9zDQpEUFJPRFVDVAkJPSBCRE1VTFRJUEwJCQkjIwlNdWx0aXBsaWNhIG9zIHZhbG9yZXMgZW0gdW0gY2FtcG8gZXNwZWPDrWZpY28gZGUgcmVnaXN0cm9zIHF1ZSBjb3JyZXNwb25kZW0gYW8gY3JpdMOpcmlvIGVtIHVtIGJhbmNvIGRlIGRhZG9zDQpEU1RERVYJCQk9IEJERVNUCQkJCSMjCUVzdGltYSBvIGRlc3ZpbyBwYWRyw6NvIGNvbSBiYXNlIGVtIHVtYSBhbW9zdHJhIGRlIGVudHJhZGFzIHNlbGVjaW9uYWRhcyBkZSB1bSBiYW5jbyBkZSBkYWRvcw0KRFNUREVWUAkJCT0gQkRERVNWUEEJCQkjIwlDYWxjdWxhIG8gZGVzdmlvIHBhZHLDo28gY29tIGJhc2UgbmEgcG9wdWxhw6fDo28gaW50ZWlyYSBkZSBlbnRyYWRhcyBzZWxlY2lvbmFkYXMgZGUgdW0gYmFuY28gZGUgZGFkb3MNCkRTVU0JCQk9IEJEU09NQQkJCSMjCUFkaWNpb25hIG9zIG7Dum1lcm9zIMOgIGNvbHVuYSBkZSBjYW1wb3MgZGUgcmVnaXN0cm9zIGRvIGJhbmNvIGRlIGRhZG9zIHF1ZSBjb3JyZXNwb25kZW0gYW8gY3JpdMOpcmlvDQpEVkFSCQkJPSBCRFZBUkVTVAkJCSMjCUVzdGltYSBhIHZhcmnDom5jaWEgY29tIGJhc2UgZW0gdW1hIGFtb3N0cmEgZGUgZW50cmFkYXMgc2VsZWNpb25hZGFzIGRlIHVtIGJhbmNvIGRlIGRhZG9zDQpEVkFSUAkJCT0gQkRWQVJQCQkJIyMJQ2FsY3VsYSBhIHZhcmnDom5jaWEgY29tIGJhc2UgbmEgcG9wdWxhw6fDo28gaW50ZWlyYSBkZSBlbnRyYWRhcyBzZWxlY2lvbmFkYXMgZGUgdW0gYmFuY28gZGUgZGFkb3MNCg0KDQojIw0KIyMJRGF0ZSBhbmQgdGltZSBmdW5jdGlvbnMJCQkJRnVuw6fDtWVzIGRlIGRhdGEgZSBob3JhDQojIw0KREFURQkJCT0gREFUQQkJCQkjIwlSZXRvcm5hIG8gbsO6bWVybyBkZSBzw6lyaWUgZGUgdW1hIGRhdGEgZXNwZWPDrWZpY2ENCkRBVEVWQUxVRQkJPSBEQVRBLlZBTE9SCQkJIyMJQ29udmVydGUgdW1hIGRhdGEgbmEgZm9ybWEgZGUgdGV4dG8gcGFyYSB1bSBuw7ptZXJvIGRlIHPDqXJpZQ0KREFZCQkJPSBESUEJCQkJIyMJQ29udmVydGUgdW0gbsO6bWVybyBkZSBzw6lyaWUgZW0gdW0gZGlhIGRvIG3DqnMNCkRBWVMzNjAJCQk9IERJQVMzNjAJCQkjIwlDYWxjdWxhIG8gbsO6bWVybyBkZSBkaWFzIGVudHJlIGR1YXMgZGF0YXMgY29tIGJhc2UgZW0gdW0gYW5vIGRlIDM2MCBkaWFzDQpFREFURQkJCT0gREFUQU0JCQkJIyMJUmV0b3JuYSBvIG7Dum1lcm8gZGUgc8OpcmllIGRhIGRhdGEgcXVlIMOpIG8gbsO6bWVybyBpbmRpY2FkbyBkZSBtZXNlcyBhbnRlcyBvdSBkZXBvaXMgZGEgZGF0YSBpbmljaWFsDQpFT01PTlRICQkJPSBGSU1Nw4pTCQkJIyMJUmV0b3JuYSBvIG7Dum1lcm8gZGUgc8OpcmllIGRvIMO6bHRpbW8gZGlhIGRvIG3DqnMgYW50ZXMgb3UgZGVwb2lzIGRlIHVtIG7Dum1lcm8gZXNwZWNpZmljYWRvIGRlIG1lc2VzDQpIT1VSCQkJPSBIT1JBCQkJCSMjCUNvbnZlcnRlIHVtIG7Dum1lcm8gZGUgc8OpcmllIGVtIHVtYSBob3JhDQpNSU5VVEUJCQk9IE1JTlVUTwkJCSMjCUNvbnZlcnRlIHVtIG7Dum1lcm8gZGUgc8OpcmllIGVtIHVtIG1pbnV0bw0KTU9OVEgJCQk9IE3DilMJCQkJIyMJQ29udmVydGUgdW0gbsO6bWVybyBkZSBzw6lyaWUgZW0gdW0gbcOqcw0KTkVUV09SS0RBWVMJCT0gRElBVFJBQkFMSE9UT1RBTAkJIyMJUmV0b3JuYSBvIG7Dum1lcm8gZGUgZGlhcyDDunRlaXMgaW50ZWlyb3MgZW50cmUgZHVhcyBkYXRhcw0KTk9XCQkJPSBBR09SQQkJCQkjIwlSZXRvcm5hIG8gbsO6bWVybyBkZSBzw6lyaWUgc2Vxw7xlbmNpYWwgZGEgZGF0YSBlIGhvcmEgYXR1YWlzDQpTRUNPTkQJCQk9IFNFR1VORE8JCQkjIwlDb252ZXJ0ZSB1bSBuw7ptZXJvIGRlIHPDqXJpZSBlbSB1bSBzZWd1bmRvDQpUSU1FCQkJPSBIT1JBCQkJCSMjCVJldG9ybmEgbyBuw7ptZXJvIGRlIHPDqXJpZSBkZSB1bWEgaG9yYSBlc3BlY8OtZmljYQ0KVElNRVZBTFVFCQk9IFZBTE9SLlRFTVBPCQkJIyMJQ29udmVydGUgdW0gaG9yw6FyaW8gbmEgZm9ybWEgZGUgdGV4dG8gcGFyYSB1bSBuw7ptZXJvIGRlIHPDqXJpZQ0KVE9EQVkJCQk9IEhPSkUJCQkJIyMJUmV0b3JuYSBvIG7Dum1lcm8gZGUgc8OpcmllIGRhIGRhdGEgZGUgaG9qZQ0KV0VFS0RBWQkJCT0gRElBLkRBLlNFTUFOQQkJCSMjCUNvbnZlcnRlIHVtIG7Dum1lcm8gZGUgc8OpcmllIGVtIHVtIGRpYSBkYSBzZW1hbmENCldFRUtOVU0JCQk9IE7Dmk1TRU1BTkEJCQkjIwlDb252ZXJ0ZSB1bSBuw7ptZXJvIGRlIHPDqXJpZSBlbSB1bSBuw7ptZXJvIHF1ZSByZXByZXNlbnRhIG9uZGUgYSBzZW1hbmEgY2FpIG51bWVyaWNhbWVudGUgZW0gdW0gYW5vDQpXT1JLREFZCQkJPSBESUFUUkFCQUxITwkJCSMjCVJldG9ybmEgbyBuw7ptZXJvIGRlIHPDqXJpZSBkYSBkYXRhIGFudGVzIG91IGRlcG9pcyBkZSB1bSBuw7ptZXJvIGVzcGVjw61maWNvIGRlIGRpYXMgw7p0ZWlzDQpZRUFSCQkJPSBBTk8JCQkJIyMJQ29udmVydGUgdW0gbsO6bWVybyBkZSBzw6lyaWUgZW0gdW0gYW5vDQpZRUFSRlJBQwkJPSBGUkHDh8ODT0FOTwkJCSMjCVJldG9ybmEgYSBmcmHDp8OjbyBkbyBhbm8gcXVlIHJlcHJlc2VudGEgbyBuw7ptZXJvIGRlIGRpYXMgZW50cmUgZGF0YV9pbmljaWFsIGUgZGF0YV9maW5hbA0KDQoNCiMjDQojIwlFbmdpbmVlcmluZyBmdW5jdGlvbnMJCQkJRnVuw6fDtWVzIGRlIGVuZ2VuaGFyaWENCiMjDQpCRVNTRUxJCQkJPSBCRVNTRUxJCQkJIyMJUmV0b3JuYSBhIGZ1bsOnw6NvIGRlIEJlc3NlbCBJbih4KSBtb2RpZmljYWRhDQpCRVNTRUxKCQkJPSBCRVNTRUxKCQkJIyMJUmV0b3JuYSBhIGZ1bsOnw6NvIGRlIEJlc3NlbCBKbih4KQ0KQkVTU0VMSwkJCT0gQkVTU0VMSwkJCSMjCVJldG9ybmEgYSBmdW7Dp8OjbyBkZSBCZXNzZWwgS24oeCkgbW9kaWZpY2FkYQ0KQkVTU0VMWQkJCT0gQkVTU0VMWQkJCSMjCVJldG9ybmEgYSBmdW7Dp8OjbyBkZSBCZXNzZWwgWW4oeCkNCkJJTjJERUMJCQk9IEJJTjJERUMJCQkjIwlDb252ZXJ0ZSB1bSBuw7ptZXJvIGJpbsOhcmlvIGVtIGRlY2ltYWwNCkJJTjJIRVgJCQk9IEJJTjJIRVgJCQkjIwlDb252ZXJ0ZSB1bSBuw7ptZXJvIGJpbsOhcmlvIGVtIGhleGFkZWNpbWFsDQpCSU4yT0NUCQkJPSBCSU4yT0NUCQkJIyMJQ29udmVydGUgdW0gbsO6bWVybyBiaW7DoXJpbyBlbSBvY3RhbA0KQ09NUExFWAkJCT0gQ09NUExFWAkJCSMjCUNvbnZlcnRlIGNvZWZpY2llbnRlcyByZWFpcyBlIGltYWdpbsOhcmlvcyBlIHVtIG7Dum1lcm8gY29tcGxleG8NCkNPTlZFUlQJCQk9IENPTlZFUlRFUgkJCSMjCUNvbnZlcnRlIHVtIG7Dum1lcm8gZGUgdW0gc2lzdGVtYSBkZSBtZWRpZGEgcGFyYSBvdXRybw0KREVDMkJJTgkJCT0gREVDQUJJTgkJCSMjCUNvbnZlcnRlIHVtIG7Dum1lcm8gZGVjaW1hbCBlbSBiaW7DoXJpbw0KREVDMkhFWAkJCT0gREVDQUhFWAkJCSMjCUNvbnZlcnRlIHVtIG7Dum1lcm8gZGVjaW1hbCBlbSBoZXhhZGVjaW1hbA0KREVDMk9DVAkJCT0gREVDQU9DVAkJCSMjCUNvbnZlcnRlIHVtIG7Dum1lcm8gZGVjaW1hbCBlbSBvY3RhbA0KREVMVEEJCQk9IERFTFRBCQkJCSMjCVRlc3RhIHNlIGRvaXMgdmFsb3JlcyBzw6NvIGlndWFpcw0KRVJGCQkJPSBGVU5FUlJPCQkJIyMJUmV0b3JuYSBhIGZ1bsOnw6NvIGRlIGVycm8NCkVSRkMJCQk9IEZVTkVSUk9DT01QTAkJCSMjCVJldG9ybmEgYSBmdW7Dp8OjbyBkZSBlcnJvIGNvbXBsZW1lbnRhcg0KR0VTVEVQCQkJPSBERUdSQVUJCQkjIwlUZXN0YSBzZSB1bSBuw7ptZXJvIMOpIG1haW9yIGRvIHF1ZSB1bSB2YWxvciBsaW1pdGUNCkhFWDJCSU4JCQk9IEhFWEFCSU4JCQkjIwlDb252ZXJ0ZSB1bSBuw7ptZXJvIGhleGFkZWNpbWFsIGVtIGJpbsOhcmlvDQpIRVgyREVDCQkJPSBIRVhBREVDCQkJIyMJQ29udmVydGUgdW0gbsO6bWVybyBoZXhhZGVjaW1hbCBlbSBkZWNpbWFsDQpIRVgyT0NUCQkJPSBIRVhBT0NUCQkJIyMJQ29udmVydGUgdW0gbsO6bWVybyBoZXhhZGVjaW1hbCBlbSBvY3RhbA0KSU1BQlMJCQk9IElNQUJTCQkJCSMjCVJldG9ybmEgbyB2YWxvciBhYnNvbHV0byAobcOzZHVsbykgZGUgdW0gbsO6bWVybyBjb21wbGV4bw0KSU1BR0lOQVJZCQk9IElNQUdJTsOBUklPCQkJIyMJUmV0b3JuYSBvIGNvZWZpY2llbnRlIGltYWdpbsOhcmlvIGRlIHVtIG7Dum1lcm8gY29tcGxleG8NCklNQVJHVU1FTlQJCT0gSU1BUkcJCQkJIyMJUmV0b3JuYSBvIGFyZ3VtZW50byB0ZXRhLCB1bSDDom5ndWxvIGV4cHJlc3NvIGVtIHJhZGlhbm9zDQpJTUNPTkpVR0FURQkJPSBJTUNPTkoJCQkjIwlSZXRvcm5hIG8gY29uanVnYWRvIGNvbXBsZXhvIGRlIHVtIG7Dum1lcm8gY29tcGxleG8NCklNQ09TCQkJPSBJTUNPUwkJCQkjIwlSZXRvcm5hIG8gY29zc2VubyBkZSB1bSBuw7ptZXJvIGNvbXBsZXhvDQpJTURJVgkJCT0gSU1ESVYJCQkJIyMJUmV0b3JuYSBvIHF1b2NpZW50ZSBkZSBkb2lzIG7Dum1lcm9zIGNvbXBsZXhvcw0KSU1FWFAJCQk9IElNRVhQCQkJCSMjCVJldG9ybmEgbyBleHBvbmVuY2lhbCBkZSB1bSBuw7ptZXJvIGNvbXBsZXhvDQpJTUxOCQkJPSBJTUxOCQkJCSMjCVJldG9ybmEgbyBsb2dhcml0bW8gbmF0dXJhbCBkZSB1bSBuw7ptZXJvIGNvbXBsZXhvDQpJTUxPRzEwCQkJPSBJTUxPRzEwCQkJIyMJUmV0b3JuYSBvIGxvZ2FyaXRtbyBkZSBiYXNlIDEwIGRlIHVtIG7Dum1lcm8gY29tcGxleG8NCklNTE9HMgkJCT0gSU1MT0cyCQkJIyMJUmV0b3JuYSBvIGxvZ2FyaXRtbyBkZSBiYXNlIDIgZGUgdW0gbsO6bWVybyBjb21wbGV4bw0KSU1QT1dFUgkJCT0gSU1QT1QJCQkJIyMJUmV0b3JuYSB1bSBuw7ptZXJvIGNvbXBsZXhvIGVsZXZhZG8gYSB1bWEgcG90w6puY2lhIGludGVpcmENCklNUFJPRFVDVAkJPSBJTVBST0QJCQkjIwlSZXRvcm5hIG8gcHJvZHV0byBkZSBuw7ptZXJvcyBjb21wbGV4b3MNCklNUkVBTAkJCT0gSU1SRUFMCQkJIyMJUmV0b3JuYSBvIGNvZWZpY2llbnRlIHJlYWwgZGUgdW0gbsO6bWVybyBjb21wbGV4bw0KSU1TSU4JCQk9IElNU0VOTwkJCSMjCVJldG9ybmEgbyBzZW5vIGRlIHVtIG7Dum1lcm8gY29tcGxleG8NCklNU1FSVAkJCT0gSU1SQUlaCQkJIyMJUmV0b3JuYSBhIHJhaXogcXVhZHJhZGEgZGUgdW0gbsO6bWVybyBjb21wbGV4bw0KSU1TVUIJCQk9IElNU1VCVFIJCQkjIwlSZXRvcm5hIGEgZGlmZXJlbsOnYSBlbnRyZSBkb2lzIG7Dum1lcm9zIGNvbXBsZXhvcw0KSU1TVU0JCQk9IElNU09NQQkJCSMjCVJldG9ybmEgYSBzb21hIGRlIG7Dum1lcm9zIGNvbXBsZXhvcw0KT0NUMkJJTgkJCT0gT0NUQUJJTgkJCSMjCUNvbnZlcnRlIHVtIG7Dum1lcm8gb2N0YWwgZW0gYmluw6FyaW8NCk9DVDJERUMJCQk9IE9DVEFERUMJCQkjIwlDb252ZXJ0ZSB1bSBuw7ptZXJvIG9jdGFsIGVtIGRlY2ltYWwNCk9DVDJIRVgJCQk9IE9DVEFIRVgJCQkjIwlDb252ZXJ0ZSB1bSBuw7ptZXJvIG9jdGFsIGVtIGhleGFkZWNpbWFsDQoNCg0KIyMNCiMjCUZpbmFuY2lhbCBmdW5jdGlvbnMJCQkJRnVuw6fDtWVzIGZpbmFuY2VpcmFzDQojIw0KQUNDUklOVAkJCT0gSlVST1NBQ1VNCQkJIyMJUmV0b3JuYSBhIHRheGEgZGUganVyb3MgYWN1bXVsYWRvcyBkZSB1bSB0w610dWxvIHF1ZSBwYWdhIHVtYSB0YXhhIHBlcmnDs2RpY2EgZGUganVyb3MNCkFDQ1JJTlRNCQk9IEpVUk9TQUNVTVYJCQkjIwlSZXRvcm5hIG9zIGp1cm9zIGFjdW11bGFkb3MgZGUgdW0gdMOtdHVsbyBxdWUgcGFnYSBqdXJvcyBubyB2ZW5jaW1lbnRvDQpBTU9SREVHUkMJCT0gQU1PUkRFR1JDCQkJIyMJUmV0b3JuYSBhIGRlcHJlY2lhw6fDo28gcGFyYSBjYWRhIHBlcsOtb2RvIGNvbnTDoWJpbCB1c2FuZG8gbyBjb2VmaWNpZW50ZSBkZSBkZXByZWNpYcOnw6NvDQpBTU9STElOQwkJPSBBTU9STElOQwkJCSMjCVJldG9ybmEgYSBkZXByZWNpYcOnw6NvIHBhcmEgY2FkYSBwZXLDrW9kbyBjb250w6FiaWwNCkNPVVBEQVlCUwkJPSBDVVBESUFTSU5MSVEJCQkjIwlSZXRvcm5hIG8gbsO6bWVybyBkZSBkaWFzIGRvIGluw61jaW8gZG8gcGVyw61vZG8gZGUgY3Vwb20gYXTDqSBhIGRhdGEgZGUgbGlxdWlkYcOnw6NvDQpDT1VQREFZUwkJPSBDVVBESUFTCQkJIyMJUmV0b3JuYSBvIG7Dum1lcm8gZGUgZGlhcyBubyBwZXLDrW9kbyBkZSBjdXBvbSBxdWUgY29udMOpbSBhIGRhdGEgZGUgcXVpdGHDp8Ojbw0KQ09VUERBWVNOQwkJPSBDVVBESUFTUFLDk1gJCQkjIwlSZXRvcm5hIG8gbsO6bWVybyBkZSBkaWFzIGRhIGRhdGEgZGUgbGlxdWlkYcOnw6NvIGF0w6kgYSBkYXRhIGRvIHByw7N4aW1vIGN1cG9tDQpDT1VQTkNECQkJPSBDVVBEQVRBUFLDk1gJCQkjIwlSZXRvcm5hIGEgcHLDs3hpbWEgZGF0YSBkZSBjdXBvbSBhcMOzcyBhIGRhdGEgZGUgcXVpdGHDp8Ojbw0KQ09VUE5VTQkJCT0gQ1VQTsOaTQkJCSMjCVJldG9ybmEgbyBuw7ptZXJvIGRlIGN1cG9ucyBwYWfDoXZlaXMgZW50cmUgYXMgZGF0YXMgZGUgcXVpdGHDp8OjbyBlIHZlbmNpbWVudG8NCkNPVVBQQ0QJCQk9IENVUERBVEFBTlQJCQkjIwlSZXRvcm5hIGEgZGF0YSBkZSBjdXBvbSBhbnRlcmlvciDDoCBkYXRhIGRlIHF1aXRhw6fDo28NCkNVTUlQTVQJCQk9IFBHVE9KVVJBQ1VNCQkJIyMJUmV0b3JuYSBvcyBqdXJvcyBhY3VtdWxhZG9zIHBhZ29zIGVudHJlIGRvaXMgcGVyw61vZG9zDQpDVU1QUklOQwkJPSBQR1RPQ0FQQUNVTQkJCSMjCVJldG9ybmEgbyBjYXBpdGFsIGFjdW11bGFkbyBwYWdvIHNvYnJlIHVtIGVtcHLDqXN0aW1vIGVudHJlIGRvaXMgcGVyw61vZG9zDQpEQgkJCT0gQkQJCQkJIyMJUmV0b3JuYSBhIGRlcHJlY2lhw6fDo28gZGUgdW0gYXRpdm8gcGFyYSB1bSBwZXLDrW9kbyBlc3BlY2lmaWNhZG8sIHVzYW5kbyBvIG3DqXRvZG8gZGUgYmFsYW7Dp28gZGUgZGVjbMOtbmlvIGZpeG8NCkREQgkJCT0gQkRECQkJCSMjCVJldG9ybmEgYSBkZXByZWNpYcOnw6NvIGRlIHVtIGF0aXZvIGNvbSByZWxhw6fDo28gYSB1bSBwZXLDrW9kbyBlc3BlY2lmaWNhZG8gdXNhbmRvIG8gbcOpdG9kbyBkZSBzYWxkb3MgZGVjcmVzY2VudGVzIGR1cGxvcyBvdSBxdWFscXVlciBvdXRybyBtw6l0b2RvIGVzcGVjaWZpY2FkbyBwb3Igdm9jw6oNCkRJU0MJCQk9IERFU0MJCQkJIyMJUmV0b3JuYSBhIHRheGEgZGUgZGVzY29udG8gZGUgdW0gdMOtdHVsbw0KRE9MTEFSREUJCT0gTU9FREFERUMJCQkjIwlDb252ZXJ0ZSB1bSBwcmXDp28gZW0gZm9ybWF0byBkZSBtb2VkYSwgbmEgZm9ybWEgZnJhY2lvbsOhcmlhLCBlbSB1bSBwcmXDp28gbmEgZm9ybWEgZGVjaW1hbA0KRE9MTEFSRlIJCT0gTU9FREFGUkEJCQkjIwlDb252ZXJ0ZSB1bSBwcmXDp28sIGFwcmVzZW50YWRvIG5hIGZvcm1hIGRlY2ltYWwsIGVtIHVtIHByZcOnbyBhcHJlc2VudGFkbyBuYSBmb3JtYSBmcmFjaW9uw6FyaWENCkRVUkFUSU9OCQk9IERVUkHDh8ODTwkJCSMjCVJldG9ybmEgYSBkdXJhw6fDo28gYW51YWwgZGUgdW0gdMOtdHVsbyBjb20gcGFnYW1lbnRvcyBkZSBqdXJvcyBwZXJpw7NkaWNvcw0KRUZGRUNUCQkJPSBFRkVUSVZBCQkJIyMJUmV0b3JuYSBhIHRheGEgZGUganVyb3MgYW51YWwgZWZldGl2YQ0KRlYJCQk9IFZGCQkJCSMjCVJldG9ybmEgbyB2YWxvciBmdXR1cm8gZGUgdW0gaW52ZXN0aW1lbnRvDQpGVlNDSEVEVUxFCQk9IFZGUExBTk8JCQkjIwlSZXRvcm5hIG8gdmFsb3IgZnV0dXJvIGRlIHVtIGNhcGl0YWwgaW5pY2lhbCBhcMOzcyBhIGFwbGljYcOnw6NvIGRlIHVtYSBzw6lyaWUgZGUgdGF4YXMgZGUganVyb3MgY29tcG9zdGFzDQpJTlRSQVRFCQkJPSBUQVhBSlVST1MJCQkjIwlSZXRvcm5hIGEgdGF4YSBkZSBqdXJvcyBkZSB1bSB0w610dWxvIHRvdGFsbWVudGUgaW52ZXN0aWRvDQpJUE1UCQkJPSBJUEdUTwkJCQkjIwlSZXRvcm5hIG8gcGFnYW1lbnRvIGRlIGp1cm9zIHBhcmEgdW0gaW52ZXN0aW1lbnRvIGVtIHVtIGRldGVybWluYWRvIHBlcsOtb2RvDQpJUlIJCQk9IFRJUgkJCQkjIwlSZXRvcm5hIGEgdGF4YSBpbnRlcm5hIGRlIHJldG9ybm8gZGUgdW1hIHPDqXJpZSBkZSBmbHV4b3MgZGUgY2FpeGENCklTUE1UCQkJPSDDiVBHVE8JCQkJIyMJQ2FsY3VsYSBvcyBqdXJvcyBwYWdvcyBkdXJhbnRlIHVtIHBlcsOtb2RvIGVzcGVjw61maWNvIGRlIHVtIGludmVzdGltZW50bw0KTURVUkFUSU9OCQk9IE1EVVJBw4fDg08JCQkjIwlSZXRvcm5hIGEgZHVyYcOnw6NvIGRlIE1hY2F1bGV5IG1vZGlmaWNhZGEgcGFyYSB1bSB0w610dWxvIGNvbSB1bSB2YWxvciBkZSBwYXJpZGFkZSBlcXVpdmFsZW50ZSBhIFIkIDEwMA0KTUlSUgkJCT0gTVRJUgkJCQkjIwlDYWxjdWxhIGEgdGF4YSBpbnRlcm5hIGRlIHJldG9ybm8gZW0gcXVlIGZsdXhvcyBkZSBjYWl4YSBwb3NpdGl2b3MgZSBuZWdhdGl2b3Mgc8OjbyBmaW5hbmNpYWRvcyBjb20gZGlmZXJlbnRlcyB0YXhhcw0KTk9NSU5BTAkJCT0gTk9NSU5BTAkJCSMjCVJldG9ybmEgYSB0YXhhIGRlIGp1cm9zIG5vbWluYWwgYW51YWwNCk5QRVIJCQk9IE5QRVIJCQkJIyMJUmV0b3JuYSBvIG7Dum1lcm8gZGUgcGVyw61vZG9zIGRlIHVtIGludmVzdGltZW50bw0KTlBWCQkJPSBWUEwJCQkJIyMJUmV0b3JuYSBvIHZhbG9yIGzDrXF1aWRvIGF0dWFsIGRlIHVtIGludmVzdGltZW50byBjb20gYmFzZSBlbSB1bWEgc8OpcmllIGRlIGZsdXhvcyBkZSBjYWl4YSBwZXJpw7NkaWNvcyBlIGVtIHVtYSB0YXhhIGRlIGRlc2NvbnRvDQpPRERGUFJJQ0UJCT0gUFJFw4dPUFJJTUlOQwkJCSMjCVJldG9ybmEgbyBwcmXDp28gcG9yIFIkIDEwMCBkZSB2YWxvciBub21pbmFsIGRlIHVtIHTDrXR1bG8gY29tIHVtIHByaW1laXJvIHBlcsOtb2RvIGluZGVmaW5pZG8NCk9EREZZSUVMRAkJPSBMVUNST1BSSU1JTkMJCQkjIwlSZXRvcm5hIG8gcmVuZGltZW50byBkZSB1bSB0w610dWxvIGNvbSB1bSBwcmltZWlybyBwZXLDrW9kbyBpbmRlZmluaWRvDQpPRERMUFJJQ0UJCT0gUFJFw4dPw5pMVElOQwkJCSMjCVJldG9ybmEgbyBwcmXDp28gcG9yIFIkIDEwMCBkZSB2YWxvciBub21pbmFsIGRlIHVtIHTDrXR1bG8gY29tIHVtIMO6bHRpbW8gcGVyw61vZG8gZGUgY3Vwb20gaW5kZWZpbmlkbw0KT0RETFlJRUxECQk9IExVQ1JPw5pMVElOQwkJCSMjCVJldG9ybmEgbyByZW5kaW1lbnRvIGRlIHVtIHTDrXR1bG8gY29tIHVtIMO6bHRpbW8gcGVyw61vZG8gaW5kZWZpbmlkbw0KUE1UCQkJPSBQR1RPCQkJCSMjCVJldG9ybmEgbyBwYWdhbWVudG8gcGVyacOzZGljbyBkZSB1bWEgYW51aWRhZGUNClBQTVQJCQk9IFBQR1RPCQkJCSMjCVJldG9ybmEgbyBwYWdhbWVudG8gZGUgY2FwaXRhbCBwYXJhIGRldGVybWluYWRvIHBlcsOtb2RvIGRlIGludmVzdGltZW50bw0KUFJJQ0UJCQk9IFBSRcOHTwkJCQkjIwlSZXRvcm5hIGEgcHJlw6dvIHBvciBSJCAxMDAsMDAgZGUgdmFsb3Igbm9taW5hbCBkZSB1bSB0w610dWxvIHF1ZSBwYWdhIGp1cm9zIHBlcmnDs2RpY29zDQpQUklDRURJU0MJCT0gUFJFw4dPREVTQwkJCSMjCVJldG9ybmEgbyBwcmXDp28gcG9yIFIkIDEwMCwwMCBkZSB2YWxvciBub21pbmFsIGRlIHVtIHTDrXR1bG8gZGVzY29udGFkbw0KUFJJQ0VNQVQJCT0gUFJFw4dPVkVOQwkJCSMjCVJldG9ybmEgbyBwcmXDp28gcG9yIFIkIDEwMCwwMCBkZSB2YWxvciBub21pbmFsIGRlIHVtIHTDrXR1bG8gcXVlIHBhZ2EganVyb3Mgbm8gdmVuY2ltZW50bw0KUFYJCQk9IFZQCQkJCSMjCVJldG9ybmEgbyB2YWxvciBwcmVzZW50ZSBkZSB1bSBpbnZlc3RpbWVudG8NClJBVEUJCQk9IFRBWEEJCQkJIyMJUmV0b3JuYSBhIHRheGEgZGUganVyb3MgcG9yIHBlcsOtb2RvIGRlIHVtYSBhbnVpZGFkZQ0KUkVDRUlWRUQJCT0gUkVDRUJFUgkJCSMjCVJldG9ybmEgYSBxdWFudGlhIHJlY2ViaWRhIG5vIHZlbmNpbWVudG8gZGUgdW0gdMOtdHVsbyB0b3RhbG1lbnRlIGludmVzdGlkbw0KU0xOCQkJPSBEUEQJCQkJIyMJUmV0b3JuYSBhIGRlcHJlY2lhw6fDo28gZW0gbGluaGEgcmV0YSBkZSB1bSBhdGl2byBkdXJhbnRlIHVtIHBlcsOtb2RvDQpTWUQJCQk9IFNEQQkJCQkjIwlSZXRvcm5hIGEgZGVwcmVjaWHDp8OjbyBkb3MgZMOtZ2l0b3MgZGEgc29tYSBkb3MgYW5vcyBkZSB1bSBhdGl2byBwYXJhIHVtIHBlcsOtb2RvIGVzcGVjaWZpY2Fkbw0KVEJJTExFUQkJCT0gT1ROCQkJCSMjCVJldG9ybmEgbyByZW5kaW1lbnRvIGRlIHVtIHTDrXR1bG8gZXF1aXZhbGVudGUgYSB1bWEgb2JyaWdhw6fDo28gZG8gVGVzb3Vybw0KVEJJTExQUklDRQkJPSBPVE5WQUxPUgkJCSMjCVJldG9ybmEgbyBwcmXDp28gcG9yIFIkIDEwMCwwMCBkZSB2YWxvciBub21pbmFsIGRlIHVtYSBvYnJpZ2HDp8OjbyBkbyBUZXNvdXJvDQpUQklMTFlJRUxECQk9IE9UTkxVQ1JPCQkJIyMJUmV0b3JuYSBvIHJlbmRpbWVudG8gZGUgdW1hIG9icmlnYcOnw6NvIGRvIFRlc291cm8NClZEQgkJCT0gQkRWCQkJCSMjCVJldG9ybmEgYSBkZXByZWNpYcOnw6NvIGRlIHVtIGF0aXZvIHBhcmEgdW0gcGVyw61vZG8gZXNwZWNpZmljYWRvIG91IHBhcmNpYWwgdXNhbmRvIHVtIG3DqXRvZG8gZGUgYmFsYW7Dp28gZGVjbGluYW50ZQ0KWElSUgkJCT0gWFRJUgkJCQkjIwlGb3JuZWNlIGEgdGF4YSBpbnRlcm5hIGRlIHJldG9ybm8gcGFyYSB1bSBwcm9ncmFtYSBkZSBmbHV4b3MgZGUgY2FpeGEgcXVlIG7Do28gw6kgbmVjZXNzYXJpYW1lbnRlIHBlcmnDs2RpY28NClhOUFYJCQk9IFhWUEwJCQkJIyMJUmV0b3JuYSBvIHZhbG9yIHByZXNlbnRlIGzDrXF1aWRvIGRlIHVtIHByb2dyYW1hIGRlIGZsdXhvcyBkZSBjYWl4YSBxdWUgbsOjbyDDqSBuZWNlc3NhcmlhbWVudGUgcGVyacOzZGljbw0KWUlFTEQJCQk9IExVQ1JPCQkJCSMjCVJldG9ybmEgbyBsdWNybyBkZSB1bSB0w610dWxvIHF1ZSBwYWdhIGp1cm9zIHBlcmnDs2RpY29zDQpZSUVMRERJU0MJCT0gTFVDUk9ERVNDCQkJIyMJUmV0b3JuYSBvIHJlbmRpbWVudG8gYW51YWwgZGUgdW0gdMOtdHVsbyBkZXNjb250YWRvLiBQb3IgZXhlbXBsbywgdW1hIG9icmlnYcOnw6NvIGRvIFRlc291cm8NCllJRUxETUFUCQk9IExVQ1JPVkVOQwkJCSMjCVJldG9ybmEgbyBsdWNybyBhbnVhbCBkZSB1bSB0w610dWxvIHF1ZSBwYWdhIGp1cm9zIG5vIHZlbmNpbWVudG8NCg0KDQojIw0KIyMJSW5mb3JtYXRpb24gZnVuY3Rpb25zCQkJCUZ1bsOnw7VlcyBkZSBpbmZvcm1hw6fDo28NCiMjDQpDRUxMCQkJPSBDw4lMCQkJCSMjCVJldG9ybmEgaW5mb3JtYcOnw7VlcyBzb2JyZSBmb3JtYXRhw6fDo28sIGxvY2FsaXphw6fDo28gb3UgY29udGXDumRvIGRlIHVtYSBjw6lsdWxhDQpFUlJPUi5UWVBFCQk9IFRJUE8uRVJSTwkJCSMjCVJldG9ybmEgdW0gbsO6bWVybyBjb3JyZXNwb25kZW50ZSBhIHVtIHRpcG8gZGUgZXJybw0KSU5GTwkJCT0gSU5GT1JNQcOHw4NPCQkJIyMJUmV0b3JuYSBpbmZvcm1hw6fDtWVzIHNvYnJlIG8gYW1iaWVudGUgb3BlcmFjaW9uYWwgYXR1YWwNCklTQkxBTksJCQk9IMOJQ8OJTC5WQVpJQQkJCSMjCVJldG9ybmEgVkVSREFERUlSTyBzZSBvIHZhbG9yIGZvciB2YXppbw0KSVNFUlIJCQk9IMOJRVJSTwkJCQkjIwlSZXRvcm5hIFZFUkRBREVJUk8gc2UgbyB2YWxvciBmb3IgdW0gdmFsb3IgZGUgZXJybyBkaWZlcmVudGUgZGUgI04vRA0KSVNFUlJPUgkJCT0gw4lFUlJPUwkJCSMjCVJldG9ybmEgVkVSREFERUlSTyBzZSBvIHZhbG9yIGZvciB1bSB2YWxvciBkZSBlcnJvDQpJU0VWRU4JCQk9IMOJUEFSCQkJCSMjCVJldG9ybmEgVkVSREFERUlSTyBzZSBvIG7Dum1lcm8gZm9yIHBhcg0KSVNMT0dJQ0FMCQk9IMOJTMOTR0lDTwkJCSMjCVJldG9ybmEgVkVSREFERUlSTyBzZSBvIHZhbG9yIGZvciB1bSB2YWxvciBsw7NnaWNvDQpJU05BCQkJPSDDiS5Ow4NPLkRJU1AJCQkjIwlSZXRvcm5hIFZFUkRBREVJUk8gc2UgbyB2YWxvciBmb3IgbyB2YWxvciBkZSBlcnJvICNOL0QNCklTTk9OVEVYVAkJPSDDiS5Ow4NPLlRFWFRPCQkJIyMJUmV0b3JuYSBWRVJEQURFSVJPIHNlIG8gdmFsb3IgZm9yIGRpZmVyZW50ZSBkZSB0ZXh0bw0KSVNOVU1CRVIJCT0gw4lOw5pNCQkJCSMjCVJldG9ybmEgVkVSREFERUlSTyBzZSBvIHZhbG9yIGZvciB1bSBuw7ptZXJvDQpJU09ERAkJCT0gw4lJTVBBUgkJCSMjCVJldG9ybmEgVkVSREFERUlSTyBzZSBvIG7Dum1lcm8gZm9yIMOtbXBhcg0KSVNSRUYJCQk9IMOJUkVGCQkJCSMjCVJldG9ybmEgVkVSREFERUlSTyBzZSBvIHZhbG9yIGZvciB1bWEgcmVmZXLDqm5jaWENCklTVEVYVAkJCT0gw4lURVhUTwkJCSMjCVJldG9ybmEgVkVSREFERUlSTyBzZSBvIHZhbG9yIGZvciB0ZXh0bw0KTgkJCT0gTgkJCQkjIwlSZXRvcm5hIHVtIHZhbG9yIGNvbnZlcnRpZG8gZW0gdW0gbsO6bWVybw0KTkEJCQk9IE7Dg08uRElTUAkJCSMjCVJldG9ybmEgbyB2YWxvciBkZSBlcnJvICNOL0QNClRZUEUJCQk9IFRJUE8JCQkJIyMJUmV0b3JuYSB1bSBuw7ptZXJvIGluZGljYW5kbyBvIHRpcG8gZGUgZGFkb3MgZGUgdW0gdmFsb3INCg0KDQojIw0KIyMJTG9naWNhbCBmdW5jdGlvbnMJCQkJRnVuw6fDtWVzIGzDs2dpY2FzDQojIw0KQU5ECQkJPSBFCQkJCSMjCVJldG9ybmEgVkVSREFERUlSTyBzZSB0b2RvcyBvcyBzZXVzIGFyZ3VtZW50b3MgZm9yZW0gVkVSREFERUlST1MNCkZBTFNFCQkJPSBGQUxTTwkJCQkjIwlSZXRvcm5hIG8gdmFsb3IgbMOzZ2ljbyBGQUxTTw0KSUYJCQk9IFNFCQkJCSMjCUVzcGVjaWZpY2EgdW0gdGVzdGUgbMOzZ2ljbyBhIHNlciBleGVjdXRhZG8NCklGRVJST1IJCQk9IFNFRVJSTwkJCSMjCVJldG9ybmFyw6EgdW0gdmFsb3IgcXVlIHZvY8OqIGVzcGVjaWZpY2Egc2UgdW1hIGbDs3JtdWxhIGZvciBhdmFsaWFkYSBwYXJhIHVtIGVycm87IGRvIGNvbnRyw6FyaW8sIHJldG9ybmFyw6EgbyByZXN1bHRhZG8gZGEgZsOzcm11bGENCk5PVAkJCT0gTsODTwkJCQkjIwlJbnZlcnRlIG8gdmFsb3IgbMOzZ2ljbyBkbyBhcmd1bWVudG8NCk9SCQkJPSBPVQkJCQkjIwlSZXRvcm5hIFZFUkRBREVJUk8gc2UgdW0gZG9zIGFyZ3VtZW50b3MgZm9yIFZFUkRBREVJUk8NClRSVUUJCQk9IFZFUkRBREVJUk8JCQkjIwlSZXRvcm5hIG8gdmFsb3IgbMOzZ2ljbyBWRVJEQURFSVJPDQoNCg0KIyMNCiMjCUxvb2t1cCBhbmQgcmVmZXJlbmNlIGZ1bmN0aW9ucwkJCUZ1bsOnw7VlcyBkZSBwZXNxdWlzYSBlIHJlZmVyw6puY2lhDQojIw0KQUREUkVTUwkJCT0gRU5ERVJFw4dPCQkJIyMJUmV0b3JuYSB1bWEgcmVmZXLDqm5jaWEgY29tbyB0ZXh0byBwYXJhIHVtYSDDum5pY2EgY8OpbHVsYSBlbSB1bWEgcGxhbmlsaGENCkFSRUFTCQkJPSDDgVJFQVMJCQkJIyMJUmV0b3JuYSBvIG7Dum1lcm8gZGUgw6FyZWFzIGVtIHVtYSByZWZlcsOqbmNpYQ0KQ0hPT1NFCQkJPSBFU0NPTEhFUgkJCSMjCUVzY29saGUgdW0gdmFsb3IgYSBwYXJ0aXIgZGUgdW1hIGxpc3RhIGRlIHZhbG9yZXMNCkNPTFVNTgkJCT0gQ09MCQkJCSMjCVJldG9ybmEgbyBuw7ptZXJvIGRhIGNvbHVuYSBkZSB1bWEgcmVmZXLDqm5jaWENCkNPTFVNTlMJCQk9IENPTFMJCQkJIyMJUmV0b3JuYSBvIG7Dum1lcm8gZGUgY29sdW5hcyBlbSB1bWEgcmVmZXLDqm5jaWENCkhMT09LVVAJCQk9IFBST0NICQkJCSMjCVByb2N1cmEgbmEgbGluaGEgc3VwZXJpb3IgZGUgdW1hIG1hdHJpeiBlIHJldG9ybmEgbyB2YWxvciBkYSBjw6lsdWxhIGVzcGVjaWZpY2FkYQ0KSFlQRVJMSU5LCQk9IEhZUEVSTElOSwkJCSMjCUNyaWEgdW0gYXRhbGhvIG91IHNhbHRvIHF1ZSBhYnJlIHVtIGRvY3VtZW50byBhcm1hemVuYWRvIGVtIHVtIHNlcnZpZG9yIGRlIHJlZGUsIHVtYSBpbnRyYW5ldCBvdSBuYSBJbnRlcm5ldA0KSU5ERVgJCQk9IMONTkRJQ0UJCQkjIwlVc2EgdW0gw61uZGljZSBwYXJhIGVzY29saGVyIHVtIHZhbG9yIGRlIHVtYSByZWZlcsOqbmNpYSBvdSBtYXRyaXoNCklORElSRUNUCQk9IElORElSRVRPCQkJIyMJUmV0b3JuYSB1bWEgcmVmZXLDqm5jaWEgaW5kaWNhZGEgcG9yIHVtIHZhbG9yIGRlIHRleHRvDQpMT09LVVAJCQk9IFBST0MJCQkJIyMJUHJvY3VyYSB2YWxvcmVzIGVtIHVtIHZldG9yIG91IGVtIHVtYSBtYXRyaXoNCk1BVENICQkJPSBDT1JSRVNQCQkJIyMJUHJvY3VyYSB2YWxvcmVzIGVtIHVtYSByZWZlcsOqbmNpYSBvdSBlbSB1bWEgbWF0cml6DQpPRkZTRVQJCQk9IERFU0xPQwkJCSMjCVJldG9ybmEgdW0gZGVzbG9jYW1lbnRvIGRlIHJlZmVyw6puY2lhIGNvbSBiYXNlIGVtIHVtYSBkZXRlcm1pbmFkYSByZWZlcsOqbmNpYQ0KUk9XCQkJPSBMSU4JCQkJIyMJUmV0b3JuYSBvIG7Dum1lcm8gZGEgbGluaGEgZGUgdW1hIHJlZmVyw6puY2lhDQpST1dTCQkJPSBMSU5TCQkJCSMjCVJldG9ybmEgbyBuw7ptZXJvIGRlIGxpbmhhcyBlbSB1bWEgcmVmZXLDqm5jaWENClJURAkJCT0gUlRECQkJCSMjCVJlY3VwZXJhIGRhZG9zIGVtIHRlbXBvIHJlYWwgZGUgdW0gcHJvZ3JhbWEgcXVlIG9mZXJlw6dhIHN1cG9ydGUgYSBhdXRvbWHDp8OjbyBDT00gKGF1dG9tYcOnw6NvOiB1bWEgZm9ybWEgZGUgdHJhYmFsaGFyIGNvbSBvYmpldG9zIGRlIHVtIGFwbGljYXRpdm8gYSBwYXJ0aXIgZGUgb3V0cm8gYXBsaWNhdGl2byBvdSBmZXJyYW1lbnRhIGRlIGRlc2Vudm9sdmltZW50by4gQ2hhbWFkYSBpbmljaWFsbWVudGUgZGUgYXV0b21hw6fDo28gT0xFLCBhIGF1dG9tYcOnw6NvIMOpIHVtIHBhZHLDo28gaW5kdXN0cmlhbCBlIHVtIHJlY3Vyc28gZG8gbW9kZWxvIGRlIG9iamV0byBjb21wb25lbnRlIChDT00pLikNClRSQU5TUE9TRQkJPSBUUkFOU1BPUgkJCSMjCVJldG9ybmEgYSB0cmFuc3Bvc2nDp8OjbyBkZSB1bWEgbWF0cml6DQpWTE9PS1VQCQkJPSBQUk9DVgkJCQkjIwlQcm9jdXJhIG5hIHByaW1laXJhIGNvbHVuYSBkZSB1bWEgbWF0cml6IGUgbW92ZSBhbyBsb25nbyBkYSBsaW5oYSBwYXJhIHJldG9ybmFyIG8gdmFsb3IgZGUgdW1hIGPDqWx1bGENCg0KDQojIw0KIyMJTWF0aCBhbmQgdHJpZ29ub21ldHJ5IGZ1bmN0aW9ucwkJCUZ1bsOnw7VlcyBtYXRlbcOhdGljYXMgZSB0cmlnb25vbcOpdHJpY2FzDQojIw0KQUJTCQkJPSBBQlMJCQkJIyMJUmV0b3JuYSBvIHZhbG9yIGFic29sdXRvIGRlIHVtIG7Dum1lcm8NCkFDT1MJCQk9IEFDT1MJCQkJIyMJUmV0b3JuYSBvIGFyY28gY29zc2VubyBkZSB1bSBuw7ptZXJvDQpBQ09TSAkJCT0gQUNPU0gJCQkJIyMJUmV0b3JuYSBvIGNvc3Nlbm8gaGlwZXJiw7NsaWNvIGludmVyc28gZGUgdW0gbsO6bWVybw0KQVNJTgkJCT0gQVNFTgkJCQkjIwlSZXRvcm5hIG8gYXJjbyBzZW5vIGRlIHVtIG7Dum1lcm8NCkFTSU5ICQkJPSBBU0VOSAkJCQkjIwlSZXRvcm5hIG8gc2VubyBoaXBlcmLDs2xpY28gaW52ZXJzbyBkZSB1bSBuw7ptZXJvDQpBVEFOCQkJPSBBVEFOCQkJCSMjCVJldG9ybmEgbyBhcmNvIHRhbmdlbnRlIGRlIHVtIG7Dum1lcm8NCkFUQU4yCQkJPSBBVEFOMgkJCQkjIwlSZXRvcm5hIG8gYXJjbyB0YW5nZW50ZSBkYXMgY29vcmRlbmFkYXMgeCBlIHkgZXNwZWNpZmljYWRhcw0KQVRBTkgJCQk9IEFUQU5ICQkJCSMjCVJldG9ybmEgYSB0YW5nZW50ZSBoaXBlcmLDs2xpY2EgaW52ZXJzYSBkZSB1bSBuw7ptZXJvDQpDRUlMSU5HCQkJPSBURVRPCQkJCSMjCUFycmVkb25kYSB1bSBuw7ptZXJvIHBhcmEgbyBpbnRlaXJvIG1haXMgcHLDs3hpbW8gb3UgcGFyYSBvIG3Dumx0aXBsbyBtYWlzIHByw7N4aW1vIGRlIHNpZ25pZmljw6JuY2lhDQpDT01CSU4JCQk9IENPTUJJTgkJCSMjCVJldG9ybmEgbyBuw7ptZXJvIGRlIGNvbWJpbmHDp8O1ZXMgZGUgdW0gZGV0ZXJtaW5hZG8gbsO6bWVybyBkZSBvYmpldG9zDQpDT1MJCQk9IENPUwkJCQkjIwlSZXRvcm5hIG8gY29zc2VubyBkZSB1bSBuw7ptZXJvDQpDT1NICQkJPSBDT1NICQkJCSMjCVJldG9ybmEgbyBjb3NzZW5vIGhpcGVyYsOzbGljbyBkZSB1bSBuw7ptZXJvDQpERUdSRUVTCQkJPSBHUkFVUwkJCQkjIwlDb252ZXJ0ZSByYWRpYW5vcyBlbSBncmF1cw0KRVZFTgkJCT0gUEFSCQkJCSMjCUFycmVkb25kYSB1bSBuw7ptZXJvIHBhcmEgY2ltYSBhdMOpIG8gaW50ZWlybyBwYXIgbWFpcyBwcsOzeGltbw0KRVhQCQkJPSBFWFAJCQkJIyMJUmV0b3JuYSBlIGVsZXZhZG8gw6AgcG90w6puY2lhIGRlIHVtIG7Dum1lcm8gZXNwZWNpZmljYWRvDQpGQUNUCQkJPSBGQVRPUklBTAkJCSMjCVJldG9ybmEgbyBmYXRvcmlhbCBkZSB1bSBuw7ptZXJvDQpGQUNURE9VQkxFCQk9IEZBVERVUExPCQkJIyMJUmV0b3JuYSBvIGZhdG9yaWFsIGR1cGxvIGRlIHVtIG7Dum1lcm8NCkZMT09SCQkJPSBBUlJFRE1VTFRCCQkJIyMJQXJyZWRvbmRhIHVtIG7Dum1lcm8gcGFyYSBiYWl4byBhdMOpIHplcm8NCkdDRAkJCT0gTURDCQkJCSMjCVJldG9ybmEgbyBtw6F4aW1vIGRpdmlzb3IgY29tdW0NCklOVAkJCT0gSU5UCQkJCSMjCUFycmVkb25kYSB1bSBuw7ptZXJvIHBhcmEgYmFpeG8gYXTDqSBvIG7Dum1lcm8gaW50ZWlybyBtYWlzIHByw7N4aW1vDQpMQ00JCQk9IE1NQwkJCQkjIwlSZXRvcm5hIG8gbcOtbmltbyBtw7psdGlwbG8gY29tdW0NCkxOCQkJPSBMTgkJCQkjIwlSZXRvcm5hIG8gbG9nYXJpdG1vIG5hdHVyYWwgZGUgdW0gbsO6bWVybw0KTE9HCQkJPSBMT0cJCQkJIyMJUmV0b3JuYSBvIGxvZ2FyaXRtbyBkZSB1bSBuw7ptZXJvIGRlIHVtYSBiYXNlIGVzcGVjaWZpY2FkYQ0KTE9HMTAJCQk9IExPRzEwCQkJCSMjCVJldG9ybmEgbyBsb2dhcml0bW8gZGUgYmFzZSAxMCBkZSB1bSBuw7ptZXJvDQpNREVURVJNCQkJPSBNQVRSSVouREVURVJNCQkJIyMJUmV0b3JuYSBvIGRldGVybWluYW50ZSBkZSB1bWEgbWF0cml6IGRlIHVtYSB2YXJpw6F2ZWwgZG8gdGlwbyBtYXRyaXoNCk1JTlZFUlNFCQk9IE1BVFJJWi5JTlZFUlNPCQkjIwlSZXRvcm5hIGEgbWF0cml6IGludmVyc2EgZGUgdW1hIG1hdHJpeg0KTU1VTFQJCQk9IE1BVFJJWi5NVUxUCQkJIyMJUmV0b3JuYSBvIHByb2R1dG8gZGUgZHVhcyBtYXRyaXplcw0KTU9ECQkJPSBSRVNUTwkJCQkjIwlSZXRvcm5hIG8gcmVzdG8gZGEgZGl2aXPDo28NCk1ST1VORAkJCT0gTUFSUkVECQkJIyMJUmV0b3JuYSB1bSBuw7ptZXJvIGFycmVkb25kYWRvIGFvIG3Dumx0aXBsbyBkZXNlamFkbw0KTVVMVElOT01JQUwJCT0gTVVMVElOT01JQUwJCQkjIwlSZXRvcm5hIG8gbXVsdGlub21pYWwgZGUgdW0gY29uanVudG8gZGUgbsO6bWVyb3MNCk9ERAkJCT0gw41NUEFSCQkJCSMjCUFycmVkb25kYSB1bSBuw7ptZXJvIHBhcmEgY2ltYSBhdMOpIG8gaW50ZWlybyDDrW1wYXIgbWFpcyBwcsOzeGltbw0KUEkJCQk9IFBJCQkJCSMjCVJldG9ybmEgbyB2YWxvciBkZSBQaQ0KUE9XRVIJCQk9IFBPVMOKTkNJQQkJCSMjCUZvcm5lY2UgbyByZXN1bHRhZG8gZGUgdW0gbsO6bWVybyBlbGV2YWRvIGEgdW1hIHBvdMOqbmNpYQ0KUFJPRFVDVAkJCT0gTVVMVAkJCQkjIwlNdWx0aXBsaWNhIHNldXMgYXJndW1lbnRvcw0KUVVPVElFTlQJCT0gUVVPQ0lFTlRFCQkJIyMJUmV0b3JuYSBhIHBhcnRlIGludGVpcmEgZGUgdW1hIGRpdmlzw6NvDQpSQURJQU5TCQkJPSBSQURJQU5PUwkJCSMjCUNvbnZlcnRlIGdyYXVzIGVtIHJhZGlhbm9zDQpSQU5ECQkJPSBBTEVBVMOTUklPCQkJIyMJUmV0b3JuYSB1bSBuw7ptZXJvIGFsZWF0w7NyaW8gZW50cmUgMCBlIDENClJBTkRCRVRXRUVOCQk9IEFMRUFUw5NSSU9FTlRSRQkJIyMJUmV0b3JuYSB1bSBuw7ptZXJvIGFsZWF0w7NyaW8gZW50cmUgb3MgbsO6bWVyb3MgZXNwZWNpZmljYWRvcw0KUk9NQU4JCQk9IFJPTUFOTwkJCSMjCUNvbnZlcnRlIHVtIGFsZ2FyaXNtbyBhcsOhYmljbyBlbSByb21hbm8sIGNvbW8gdGV4dG8NClJPVU5ECQkJPSBBUlJFRAkJCQkjIwlBcnJlZG9uZGEgdW0gbsO6bWVybyBhdMOpIHVtYSBxdWFudGlkYWRlIGVzcGVjaWZpY2FkYSBkZSBkw61naXRvcw0KUk9VTkRET1dOCQk9IEFSUkVET05EQVIuUEFSQS5CQUlYTwkJIyMJQXJyZWRvbmRhIHVtIG7Dum1lcm8gcGFyYSBiYWl4byBhdMOpIHplcm8NClJPVU5EVVAJCQk9IEFSUkVET05EQVIuUEFSQS5DSU1BCQkjIwlBcnJlZG9uZGEgdW0gbsO6bWVybyBwYXJhIGNpbWEsIGFmYXN0YW5kby1vIGRlIHplcm8NClNFUklFU1NVTQkJPSBTT01BU0VRw5zDik5DSUEJCQkjIwlSZXRvcm5hIGEgc29tYSBkZSB1bWEgc8OpcmllIHBvbGlub21pYWwgYmFzZWFkYSBuYSBmw7NybXVsYQ0KU0lHTgkJCT0gU0lOQUwJCQkJIyMJUmV0b3JuYSBvIHNpbmFsIGRlIHVtIG7Dum1lcm8NClNJTgkJCT0gU0VOCQkJCSMjCVJldG9ybmEgbyBzZW5vIGRlIHVtIMOibmd1bG8gZGFkbw0KU0lOSAkJCT0gU0VOSAkJCQkjIwlSZXRvcm5hIG8gc2VubyBoaXBlcmLDs2xpY28gZGUgdW0gbsO6bWVybw0KU1FSVAkJCT0gUkFJWgkJCQkjIwlSZXRvcm5hIHVtYSByYWl6IHF1YWRyYWRhIHBvc2l0aXZhDQpTUVJUUEkJCQk9IFJBSVpQSQkJCSMjCVJldG9ybmEgYSByYWl6IHF1YWRyYWRhIGRlIChuw7ptKiBwaSkNClNVQlRPVEFMCQk9IFNVQlRPVEFMCQkJIyMJUmV0b3JuYSB1bSBzdWJ0b3RhbCBlbSB1bWEgbGlzdGEgb3UgZW0gdW0gYmFuY28gZGUgZGFkb3MNClNVTQkJCT0gU09NQQkJCQkjIwlTb21hIHNldXMgYXJndW1lbnRvcw0KU1VNSUYJCQk9IFNPTUFTRQkJCSMjCUFkaWNpb25hIGFzIGPDqWx1bGFzIGVzcGVjaWZpY2FkYXMgcG9yIHVtIGRldGVybWluYWRvIGNyaXTDqXJpbw0KU1VNSUZTCQkJPSBTT01BU0UJCQkjIwlBZGljaW9uYSBhcyBjw6lsdWxhcyBlbSB1bSBpbnRlcnZhbG8gcXVlIGF0ZW5kZSBhIHbDoXJpb3MgY3JpdMOpcmlvcw0KU1VNUFJPRFVDVAkJPSBTT01BUlBST0RVVE8JCQkjIwlSZXRvcm5hIGEgc29tYSBkb3MgcHJvZHV0b3MgZGUgY29tcG9uZW50ZXMgY29ycmVzcG9uZGVudGVzIGRlIG1hdHJpemVzDQpTVU1TUQkJCT0gU09NQVFVQUQJCQkjIwlSZXRvcm5hIGEgc29tYSBkb3MgcXVhZHJhZG9zIGRvcyBhcmd1bWVudG9zDQpTVU1YMk1ZMgkJPSBTT01BWDJEWTIJCQkjIwlSZXRvcm5hIGEgc29tYSBkYSBkaWZlcmVuw6dhIGRvcyBxdWFkcmFkb3MgZG9zIHZhbG9yZXMgY29ycmVzcG9uZGVudGVzIGVtIGR1YXMgbWF0cml6ZXMNClNVTVgyUFkyCQk9IFNPTUFYMlNZMgkJCSMjCVJldG9ybmEgYSBzb21hIGRhIHNvbWEgZG9zIHF1YWRyYWRvcyBkb3MgdmFsb3JlcyBjb3JyZXNwb25kZW50ZXMgZW0gZHVhcyBtYXRyaXplcw0KU1VNWE1ZMgkJCT0gU09NQVhNWTIJCQkjIwlSZXRvcm5hIGEgc29tYSBkb3MgcXVhZHJhZG9zIGRhcyBkaWZlcmVuw6dhcyBkb3MgdmFsb3JlcyBjb3JyZXNwb25kZW50ZXMgZW0gZHVhcyBtYXRyaXplcw0KVEFOCQkJPSBUQU4JCQkJIyMJUmV0b3JuYSBhIHRhbmdlbnRlIGRlIHVtIG7Dum1lcm8NClRBTkgJCQk9IFRBTkgJCQkJIyMJUmV0b3JuYSBhIHRhbmdlbnRlIGhpcGVyYsOzbGljYSBkZSB1bSBuw7ptZXJvDQpUUlVOQwkJCT0gVFJVTkNBUgkJCSMjCVRydW5jYSB1bSBuw7ptZXJvIHBhcmEgdW0gaW50ZWlybw0KDQoNCiMjDQojIwlTdGF0aXN0aWNhbCBmdW5jdGlvbnMJCQkJRnVuw6fDtWVzIGVzdGF0w61zdGljYXMNCiMjDQpBVkVERVYJCQk9IERFU1YuTcOJRElPCQkJIyMJUmV0b3JuYSBhIG3DqWRpYSBhcml0bcOpdGljYSBkb3MgZGVzdmlvcyBtw6lkaW9zIGRvcyBwb250b3MgZGUgZGFkb3MgYSBwYXJ0aXIgZGUgc3VhIG3DqWRpYQ0KQVZFUkFHRQkJCT0gTcOJRElBCQkJCSMjCVJldG9ybmEgYSBtw6lkaWEgZG9zIGFyZ3VtZW50b3MNCkFWRVJBR0VBCQk9IE3DiURJQUEJCQkjIwlSZXRvcm5hIGEgbcOpZGlhIGRvcyBhcmd1bWVudG9zLCBpbmNsdXNpdmUgbsO6bWVyb3MsIHRleHRvIGUgdmFsb3JlcyBsw7NnaWNvcw0KQVZFUkFHRUlGCQk9IE3DiURJQVNFCQkJIyMJUmV0b3JuYSBhIG3DqWRpYSAobcOpZGlhIGFyaXRtw6l0aWNhKSBkZSB0b2RhcyBhcyBjw6lsdWxhcyBlbSB1bSBpbnRlcnZhbG8gcXVlIGF0ZW5kZW0gYSB1bSBkZXRlcm1pbmFkbyBjcml0w6lyaW8NCkFWRVJBR0VJRlMJCT0gTcOJRElBU0VTCQkJIyMJUmV0b3JuYSBhIG3DqWRpYSAobcOpZGlhIGFyaXRtw6l0aWNhKSBkZSB0b2RhcyBhcyBjw6lsdWxhcyBxdWUgYXRlbmRlbSBhIG3Dumx0aXBsb3MgY3JpdMOpcmlvcy4NCkJFVEFESVNUCQk9IERJU1RCRVRBCQkJIyMJUmV0b3JuYSBhIGZ1bsOnw6NvIGRlIGRpc3RyaWJ1acOnw6NvIGN1bXVsYXRpdmEgYmV0YQ0KQkVUQUlOVgkJCT0gQkVUQS5BQ1VNLklOVgkJCSMjCVJldG9ybmEgbyBpbnZlcnNvIGRhIGZ1bsOnw6NvIGRlIGRpc3RyaWJ1acOnw6NvIGN1bXVsYXRpdmEgcGFyYSB1bWEgZGlzdHJpYnVpw6fDo28gYmV0YSBlc3BlY2lmaWNhZGENCkJJTk9NRElTVAkJPSBESVNUUkJJTk9NCQkJIyMJUmV0b3JuYSBhIHByb2JhYmlsaWRhZGUgZGUgZGlzdHJpYnVpw6fDo28gYmlub21pYWwgZG8gdGVybW8gaW5kaXZpZHVhbA0KQ0hJRElTVAkJCT0gRElTVC5RVUkJCQkjIwlSZXRvcm5hIGEgcHJvYmFiaWxpZGFkZSB1bmljYXVkYWwgZGEgZGlzdHJpYnVpw6fDo28gcXVpLXF1YWRyYWRhDQpDSElJTlYJCQk9IElOVi5RVUkJCQkjIwlSZXRvcm5hIG8gaW52ZXJzbyBkYSBwcm9iYWJpbGlkYWRlIHVuaS1jYXVkYWwgZGEgZGlzdHJpYnVpw6fDo28gcXVpLXF1YWRyYWRhDQpDSElURVNUCQkJPSBURVNURS5RVUkJCQkjIwlSZXRvcm5hIG8gdGVzdGUgcGFyYSBpbmRlcGVuZMOqbmNpYQ0KQ09ORklERU5DRQkJPSBJTlQuQ09ORklBTsOHQQkJCSMjCVJldG9ybmEgbyBpbnRlcnZhbG8gZGUgY29uZmlhbsOnYSBwYXJhIHVtYSBtw6lkaWEgZGEgcG9wdWxhw6fDo28NCkNPUlJFTAkJCT0gQ09SUkVMCQkJIyMJUmV0b3JuYSBvIGNvZWZpY2llbnRlIGRlIGNvcnJlbGHDp8OjbyBlbnRyZSBkb2lzIGNvbmp1bnRvcyBkZSBkYWRvcw0KQ09VTlQJCQk9IENPTlQuTsOaTQkJCSMjCUNhbGN1bGEgcXVhbnRvcyBuw7ptZXJvcyBow6EgbmEgbGlzdGEgZGUgYXJndW1lbnRvcw0KQ09VTlRBCQkJPSBDT05ULlZBTE9SRVMJCQkjIwlDYWxjdWxhIHF1YW50b3MgdmFsb3JlcyBow6EgbmEgbGlzdGEgZGUgYXJndW1lbnRvcw0KQ09VTlRCTEFOSwkJPSBDT05UQVIuVkFaSU8JCQkjIwlDb250YSBvIG7Dum1lcm8gZGUgY8OpbHVsYXMgdmF6aWFzIG5vIGludGVydmFsbyBlc3BlY2lmaWNhZG8NCkNPVU5USUYJCQk9IENPTlQuU0UJCQkjIwlDYWxjdWxhIG8gbsO6bWVybyBkZSBjw6lsdWxhcyBuw6NvIHZhemlhcyBlbSB1bSBpbnRlcnZhbG8gcXVlIGNvcnJlc3BvbmRlIGEgZGV0ZXJtaW5hZG9zIGNyaXTDqXJpb3MNCkNPVU5USUZTCQk9IENPTlQuU0VTCQkJIyMJQ29udGEgbyBuw7ptZXJvIGRlIGPDqWx1bGFzIGRlbnRybyBkZSB1bSBpbnRlcnZhbG8gcXVlIGF0ZW5kZSBhIG3Dumx0aXBsb3MgY3JpdMOpcmlvcw0KQ09WQVIJCQk9IENPVkFSCQkJCSMjCVJldG9ybmEgYSBjb3ZhcmnDom5jaWEsIGEgbcOpZGlhIGRvcyBwcm9kdXRvcyBkb3MgZGVzdmlvcyBwYXJlcw0KQ1JJVEJJTk9NCQk9IENSSVQuQklOT00JCQkjIwlSZXRvcm5hIG8gbWVub3IgdmFsb3IgcGFyYSBvIHF1YWwgYSBkaXN0cmlidWnDp8OjbyBiaW5vbWlhbCBjdW11bGF0aXZhIMOpIG1lbm9yIG91IGlndWFsIGFvIHZhbG9yIHBhZHLDo28NCkRFVlNRCQkJPSBERVNWUQkJCQkjIwlSZXRvcm5hIGEgc29tYSBkb3MgcXVhZHJhZG9zIGRvcyBkZXN2aW9zDQpFWFBPTkRJU1QJCT0gRElTVEVYUE9OCQkJIyMJUmV0b3JuYSBhIGRpc3RyaWJ1acOnw6NvIGV4cG9uZW5jaWFsDQpGRElTVAkJCT0gRElTVEYJCQkJIyMJUmV0b3JuYSBhIGRpc3RyaWJ1acOnw6NvIGRlIHByb2JhYmlsaWRhZGUgRg0KRklOVgkJCT0gSU5WRgkJCQkjIwlSZXRvcm5hIG8gaW52ZXJzbyBkYSBkaXN0cmlidWnDp8OjbyBkZSBwcm9iYWJpbGlkYWRlcyBGDQpGSVNIRVIJCQk9IEZJU0hFUgkJCSMjCVJldG9ybmEgYSB0cmFuc2Zvcm1hw6fDo28gRmlzaGVyDQpGSVNIRVJJTlYJCT0gRklTSEVSSU5WCQkJIyMJUmV0b3JuYSBvIGludmVyc28gZGEgdHJhbnNmb3JtYcOnw6NvIEZpc2hlcg0KRk9SRUNBU1QJCT0gUFJFVklTw4NPCQkJIyMJUmV0b3JuYSB1bSB2YWxvciBhbyBsb25nbyBkZSB1bWEgbGluaGEgcmV0YQ0KRlJFUVVFTkNZCQk9IEZSRVHDnMOKTkNJQQkJCSMjCVJldG9ybmEgdW1hIGRpc3RyaWJ1acOnw6NvIGRlIGZyZXHDvMOqbmNpYSBjb21vIHVtYSBtYXRyaXogdmVydGljYWwNCkZURVNUCQkJPSBURVNURUYJCQkjIwlSZXRvcm5hIG8gcmVzdWx0YWRvIGRlIHVtIHRlc3RlIEYNCkdBTU1BRElTVAkJPSBESVNUR0FNQQkJCSMjCVJldG9ybmEgYSBkaXN0cmlidWnDp8OjbyBnYW1hDQpHQU1NQUlOVgkJPSBJTlZHQU1BCQkJIyMJUmV0b3JuYSBvIGludmVyc28gZGEgZGlzdHJpYnVpw6fDo28gY3VtdWxhdGl2YSBnYW1hDQpHQU1NQUxOCQkJPSBMTkdBTUEJCQkjIwlSZXRvcm5hIG8gbG9nYXJpdG1vIG5hdHVyYWwgZGEgZnVuw6fDo28gZ2FtYSwgRyh4KQ0KR0VPTUVBTgkJCT0gTcOJRElBLkdFT03DiVRSSUNBCQkjIwlSZXRvcm5hIGEgbcOpZGlhIGdlb23DqXRyaWNhDQpHUk9XVEgJCQk9IENSRVNDSU1FTlRPCQkJIyMJUmV0b3JuYSB2YWxvcmVzIGFvIGxvbmdvIGRlIHVtYSB0ZW5kw6puY2lhIGV4cG9uZW5jaWFsDQpIQVJNRUFOCQkJPSBNw4lESUEuSEFSTcOUTklDQQkJIyMJUmV0b3JuYSBhIG3DqWRpYSBoYXJtw7RuaWNhDQpIWVBHRU9NRElTVAkJPSBESVNULkhJUEVSR0VPTQkJIyMJUmV0b3JuYSBhIGRpc3RyaWJ1acOnw6NvIGhpcGVyZ2VvbcOpdHJpY2ENCklOVEVSQ0VQVAkJPSBJTlRFUkNFUMOHw4NPCQkJIyMJUmV0b3JuYSBhIGludGVyY2Vww6fDo28gZGEgbGluaGEgZGUgcmVncmVzc8OjbyBsaW5lYXINCktVUlQJCQk9IENVUlQJCQkJIyMJUmV0b3JuYSBhIGN1cnRvc2UgZGUgdW0gY29uanVudG8gZGUgZGFkb3MNCkxBUkdFCQkJPSBNQUlPUgkJCQkjIwlSZXRvcm5hIG8gbWFpb3IgdmFsb3Igay3DqXNpbW8gZGUgdW0gY29uanVudG8gZGUgZGFkb3MNCkxJTkVTVAkJCT0gUFJPSi5MSU4JCQkjIwlSZXRvcm5hIG9zIHBhcsOibWV0cm9zIGRlIHVtYSB0ZW5kw6puY2lhIGxpbmVhcg0KTE9HRVNUCQkJPSBQUk9KLkxPRwkJCSMjCVJldG9ybmEgb3MgcGFyw6JtZXRyb3MgZGUgdW1hIHRlbmTDqm5jaWEgZXhwb25lbmNpYWwNCkxPR0lOVgkJCT0gSU5WTE9HCQkJIyMJUmV0b3JuYSBvIGludmVyc28gZGEgZGlzdHJpYnVpw6fDo28gbG9nbm9ybWFsDQpMT0dOT1JNRElTVAkJPSBESVNULkxPR05PUk1BTAkJIyMJUmV0b3JuYSBhIGRpc3RyaWJ1acOnw6NvIGxvZ25vcm1hbCBjdW11bGF0aXZhDQpNQVgJCQk9IE3DgVhJTU8JCQkjIwlSZXRvcm5hIG8gdmFsb3IgbcOheGltbyBlbSB1bWEgbGlzdGEgZGUgYXJndW1lbnRvcw0KTUFYQQkJCT0gTcOBWElNT0EJCQkjIwlSZXRvcm5hIG8gbWFpb3IgdmFsb3IgZW0gdW1hIGxpc3RhIGRlIGFyZ3VtZW50b3MsIGluY2x1c2l2ZSBuw7ptZXJvcywgdGV4dG8gZSB2YWxvcmVzIGzDs2dpY29zDQpNRURJQU4JCQk9IE1FRAkJCQkjIwlSZXRvcm5hIGEgbWVkaWFuYSBkb3MgbsO6bWVyb3MgaW5kaWNhZG9zDQpNSU4JCQk9IE3DjU5JTU8JCQkjIwlSZXRvcm5hIG8gdmFsb3IgbcOtbmltbyBlbSB1bWEgbGlzdGEgZGUgYXJndW1lbnRvcw0KTUlOQQkJCT0gTcONTklNT0EJCQkjIwlSZXRvcm5hIG8gbWVub3IgdmFsb3IgZW0gdW1hIGxpc3RhIGRlIGFyZ3VtZW50b3MsIGluY2x1c2l2ZSBuw7ptZXJvcywgdGV4dG8gZSB2YWxvcmVzIGzDs2dpY29zDQpNT0RFCQkJPSBNT0RPCQkJCSMjCVJldG9ybmEgbyB2YWxvciBtYWlzIGNvbXVtIGVtIHVtIGNvbmp1bnRvIGRlIGRhZG9zDQpORUdCSU5PTURJU1QJCT0gRElTVC5CSU4uTkVHCQkJIyMJUmV0b3JuYSBhIGRpc3RyaWJ1acOnw6NvIGJpbm9taWFsIG5lZ2F0aXZhDQpOT1JNRElTVAkJPSBESVNULk5PUk0JCQkjIwlSZXRvcm5hIGEgZGlzdHJpYnVpw6fDo28gY3VtdWxhdGl2YSBub3JtYWwNCk5PUk1JTlYJCQk9IElOVi5OT1JNCQkJIyMJUmV0b3JuYSBvIGludmVyc28gZGEgZGlzdHJpYnVpw6fDo28gY3VtdWxhdGl2YSBub3JtYWwNCk5PUk1TRElTVAkJPSBESVNULk5PUk1QCQkJIyMJUmV0b3JuYSBhIGRpc3RyaWJ1acOnw6NvIGN1bXVsYXRpdmEgbm9ybWFsIHBhZHLDo28NCk5PUk1TSU5WCQk9IElOVi5OT1JNUAkJCSMjCVJldG9ybmEgbyBpbnZlcnNvIGRhIGRpc3RyaWJ1acOnw6NvIGN1bXVsYXRpdmEgbm9ybWFsIHBhZHLDo28NClBFQVJTT04JCQk9IFBFQVJTT04JCQkjIwlSZXRvcm5hIG8gY29lZmljaWVudGUgZGUgY29ycmVsYcOnw6NvIGRvIG1vbWVudG8gZG8gcHJvZHV0byBQZWFyc29uDQpQRVJDRU5USUxFCQk9IFBFUkNFTlRJTAkJCSMjCVJldG9ybmEgbyBrLcOpc2ltbyBwZXJjZW50aWwgZGUgdmFsb3JlcyBlbSB1bSBpbnRlcnZhbG8NClBFUkNFTlRSQU5LCQk9IE9SREVNLlBPUkNFTlRVQUwJCSMjCVJldG9ybmEgYSBvcmRlbSBwZXJjZW50dWFsIGRlIHVtIHZhbG9yIGVtIHVtIGNvbmp1bnRvIGRlIGRhZG9zDQpQRVJNVVQJCQk9IFBFUk1VVAkJCSMjCVJldG9ybmEgbyBuw7ptZXJvIGRlIHBlcm11dGHDp8O1ZXMgZGUgdW0gZGV0ZXJtaW5hZG8gbsO6bWVybyBkZSBvYmpldG9zDQpQT0lTU09OCQkJPSBQT0lTU09OCQkJIyMJUmV0b3JuYSBhIGRpc3RyaWJ1acOnw6NvIFBvaXNzb24NClBST0IJCQk9IFBST0IJCQkJIyMJUmV0b3JuYSBhIHByb2JhYmlsaWRhZGUgZGUgdmFsb3JlcyBlbSB1bSBpbnRlcnZhbG8gZXN0YXJlbSBlbnRyZSBkb2lzIGxpbWl0ZXMNClFVQVJUSUxFCQk9IFFVQVJUSUwJCQkjIwlSZXRvcm5hIG8gcXVhcnRpbCBkbyBjb25qdW50byBkZSBkYWRvcw0KUkFOSwkJCT0gT1JERU0JCQkJIyMJUmV0b3JuYSBhIHBvc2nDp8OjbyBkZSB1bSBuw7ptZXJvIGVtIHVtYSBsaXN0YSBkZSBuw7ptZXJvcw0KUlNRCQkJPSBSUVVBRAkJCQkjIwlSZXRvcm5hIG8gcXVhZHJhZG8gZG8gY29lZmljaWVudGUgZGUgY29ycmVsYcOnw6NvIGRvIG1vbWVudG8gZG8gcHJvZHV0byBkZSBQZWFyc29uDQpTS0VXCQkJPSBESVNUT1LDh8ODTwkJCSMjCVJldG9ybmEgYSBkaXN0b3LDp8OjbyBkZSB1bWEgZGlzdHJpYnVpw6fDo28NClNMT1BFCQkJPSBJTkNMSU5Bw4fDg08JCQkjIwlSZXRvcm5hIGEgaW5jbGluYcOnw6NvIGRhIGxpbmhhIGRlIHJlZ3Jlc3PDo28gbGluZWFyDQpTTUFMTAkJCT0gTUVOT1IJCQkJIyMJUmV0b3JuYSBvIG1lbm9yIHZhbG9yIGstw6lzaW1vIGRvIGNvbmp1bnRvIGRlIGRhZG9zDQpTVEFOREFSRElaRQkJPSBQQURST05JWkFSCQkJIyMJUmV0b3JuYSB1bSB2YWxvciBub3JtYWxpemFkbw0KU1RERVYJCQk9IERFU1ZQQUQJCQkjIwlFc3RpbWEgbyBkZXN2aW8gcGFkcsOjbyBjb20gYmFzZSBlbSB1bWEgYW1vc3RyYQ0KU1RERVZBCQkJPSBERVNWUEFEQQkJCSMjCUVzdGltYSBvIGRlc3ZpbyBwYWRyw6NvIGNvbSBiYXNlIGVtIHVtYSBhbW9zdHJhLCBpbmNsdXNpdmUgbsO6bWVyb3MsIHRleHRvIGUgdmFsb3JlcyBsw7NnaWNvcw0KU1RERVZQCQkJPSBERVNWUEFEUAkJCSMjCUNhbGN1bGEgbyBkZXN2aW8gcGFkcsOjbyBjb20gYmFzZSBuYSBwb3B1bGHDp8OjbyB0b3RhbA0KU1RERVZQQQkJCT0gREVTVlBBRFBBCQkJIyMJQ2FsY3VsYSBvIGRlc3ZpbyBwYWRyw6NvIGNvbSBiYXNlIG5hIHBvcHVsYcOnw6NvIHRvdGFsLCBpbmNsdXNpdmUgbsO6bWVyb3MsIHRleHRvIGUgdmFsb3JlcyBsw7NnaWNvcw0KU1RFWVgJCQk9IEVQQURZWAkJCSMjCVJldG9ybmEgbyBlcnJvIHBhZHLDo28gZG8gdmFsb3IteSBwcmV2aXN0byBwYXJhIGNhZGEgeCBkYSByZWdyZXNzw6NvDQpURElTVAkJCT0gRElTVFQJCQkJIyMJUmV0b3JuYSBhIGRpc3RyaWJ1acOnw6NvIHQgZGUgU3R1ZGVudA0KVElOVgkJCT0gSU5WVAkJCQkjIwlSZXRvcm5hIG8gaW52ZXJzbyBkYSBkaXN0cmlidWnDp8OjbyB0IGRlIFN0dWRlbnQNClRSRU5ECQkJPSBURU5Ew4pOQ0lBCQkJIyMJUmV0b3JuYSB2YWxvcmVzIGFvIGxvbmdvIGRlIHVtYSB0ZW5kw6puY2lhIGxpbmVhcg0KVFJJTU1FQU4JCT0gTcOJRElBLklOVEVSTkEJCQkjIwlSZXRvcm5hIGEgbcOpZGlhIGRvIGludGVyaW9yIGRlIHVtIGNvbmp1bnRvIGRlIGRhZG9zDQpUVEVTVAkJCT0gVEVTVEVUCQkJIyMJUmV0b3JuYSBhIHByb2JhYmlsaWRhZGUgYXNzb2NpYWRhIGFvIHRlc3RlIHQgZGUgU3R1ZGVudA0KVkFSCQkJPSBWQVIJCQkJIyMJRXN0aW1hIGEgdmFyacOibmNpYSBjb20gYmFzZSBlbSB1bWEgYW1vc3RyYQ0KVkFSQQkJCT0gVkFSQQkJCQkjIwlFc3RpbWEgYSB2YXJpw6JuY2lhIGNvbSBiYXNlIGVtIHVtYSBhbW9zdHJhLCBpbmNsdXNpdmUgbsO6bWVyb3MsIHRleHRvIGUgdmFsb3JlcyBsw7NnaWNvcw0KVkFSUAkJCT0gVkFSUAkJCQkjIwlDYWxjdWxhIGEgdmFyacOibmNpYSBjb20gYmFzZSBuYSBwb3B1bGHDp8OjbyBpbnRlaXJhDQpWQVJQQQkJCT0gVkFSUEEJCQkJIyMJQ2FsY3VsYSBhIHZhcmnDom5jaWEgY29tIGJhc2UgbmEgcG9wdWxhw6fDo28gdG90YWwsIGluY2x1c2l2ZSBuw7ptZXJvcywgdGV4dG8gZSB2YWxvcmVzIGzDs2dpY29zDQpXRUlCVUxMCQkJPSBXRUlCVUxMCQkJIyMJUmV0b3JuYSBhIGRpc3RyaWJ1acOnw6NvIFdlaWJ1bGwNClpURVNUCQkJPSBURVNURVoJCQkjIwlSZXRvcm5hIG8gdmFsb3IgZGUgcHJvYmFiaWxpZGFkZSB1bmktY2F1ZGFsIGRlIHVtIHRlc3RlLXoNCg0KDQojIw0KIyMJVGV4dCBmdW5jdGlvbnMJCQlGdW7Dp8O1ZXMgZGUgdGV4dG8NCiMjDQpBU0MJCQk9IEFTQwkJCQkjIwlBbHRlcmEgbGV0cmFzIGRvIGluZ2zDqnMgb3Uga2F0YWthbmEgZGUgbGFyZ3VyYSB0b3RhbCAoYnl0ZXMgZHVwbG9zKSBkZW50cm8gZGUgdW1hIHNlccO8w6puY2lhIGRlIGNhcmFjdGVyZXMgcGFyYSBjYXJhY3RlcmVzIGRlIG1laWEgbGFyZ3VyYSAoYnl0ZSDDum5pY28pDQpCQUhUVEVYVAkJPSBCQUhUVEVYVAkJCSMjCUNvbnZlcnRlIHVtIG7Dum1lcm8gZW0gdW0gdGV4dG8sIHVzYW5kbyBvIGZvcm1hdG8gZGUgbW9lZGEgw58gKGJhaHQpDQpDSEFSCQkJPSBDQVJBQ1QJCQkjIwlSZXRvcm5hIG8gY2FyYWN0ZXJlIGVzcGVjaWZpY2FkbyBwZWxvIG7Dum1lcm8gZGUgY8OzZGlnbw0KQ0xFQU4JCQk9IFRJUkFSCQkJCSMjCVJlbW92ZSB0b2RvcyBvcyBjYXJhY3RlcmVzIGRvIHRleHRvIHF1ZSBuw6NvIHBvZGVtIHNlciBpbXByZXNzb3MNCkNPREUJCQk9IEPDk0RJR08JCQkjIwlSZXRvcm5hIHVtIGPDs2RpZ28gbnVtw6lyaWNvIHBhcmEgbyBwcmltZWlybyBjYXJhY3RlcmUgZGUgdW1hIHNlccO8w6puY2lhIGRlIGNhcmFjdGVyZXMgZGUgdGV4dG8NCkNPTkNBVEVOQVRFCQk9IENPTkNBVEVOQVIJCQkjIwlBZ3J1cGEgdsOhcmlvcyBpdGVucyBkZSB0ZXh0byBlbSB1bSDDum5pY28gaXRlbSBkZSB0ZXh0bw0KRE9MTEFSCQkJPSBNT0VEQQkJCQkjIwlDb252ZXJ0ZSB1bSBuw7ptZXJvIGVtIHRleHRvLCB1c2FuZG8gbyBmb3JtYXRvIGRlIG1vZWRhICQgKGTDs2xhcikNCkVYQUNUCQkJPSBFWEFUTwkJCQkjIwlWZXJpZmljYSBzZSBkb2lzIHZhbG9yZXMgZGUgdGV4dG8gc8OjbyBpZMOqbnRpY29zDQpGSU5ECQkJPSBQUk9DVVJBUgkJCSMjCVByb2N1cmEgdW0gdmFsb3IgZGUgdGV4dG8gZGVudHJvIGRlIG91dHJvIChkaWZlcmVuY2lhIG1hacO6c2N1bGFzIGRlIG1pbsO6c2N1bGFzKQ0KRklOREIJCQk9IFBST0NVUkFSQgkJCSMjCVByb2N1cmEgdW0gdmFsb3IgZGUgdGV4dG8gZGVudHJvIGRlIG91dHJvIChkaWZlcmVuY2lhIG1hacO6c2N1bGFzIGRlIG1pbsO6c2N1bGFzKQ0KRklYRUQJCQk9IERFRi5Ow5pNLkRFQwkJCSMjCUZvcm1hdGEgdW0gbsO6bWVybyBjb21vIHRleHRvIGNvbSB1bSBuw7ptZXJvIGZpeG8gZGUgZGVjaW1haXMNCkpJUwkJCT0gSklTCQkJCSMjCUFsdGVyYSBsZXRyYXMgZG8gaW5nbMOqcyBvdSBrYXRha2FuYSBkZSBtZWlhIGxhcmd1cmEgKGJ5dGUgw7puaWNvKSBkZW50cm8gZGUgdW1hIHNlccO8w6puY2lhIGRlIGNhcmFjdGVyZXMgcGFyYSBjYXJhY3RlcmVzIGRlIGxhcmd1cmEgdG90YWwgKGJ5dGVzIGR1cGxvcykNCkxFRlQJCQk9IEVTUVVFUkRBCQkJIyMJUmV0b3JuYSBvcyBjYXJhY3RlcmVzIG1haXMgw6AgZXNxdWVyZGEgZGUgdW0gdmFsb3IgZGUgdGV4dG8NCkxFRlRCCQkJPSBFU1FVRVJEQUIJCQkjIwlSZXRvcm5hIG9zIGNhcmFjdGVyZXMgbWFpcyDDoCBlc3F1ZXJkYSBkZSB1bSB2YWxvciBkZSB0ZXh0bw0KTEVOCQkJPSBOw5pNLkNBUkFDVAkJCSMjCVJldG9ybmEgbyBuw7ptZXJvIGRlIGNhcmFjdGVyZXMgZW0gdW1hIHNlccO8w6puY2lhIGRlIHRleHRvDQpMRU5CCQkJPSBOw5pNLkNBUkFDVEIJCQkjIwlSZXRvcm5hIG8gbsO6bWVybyBkZSBjYXJhY3RlcmVzIGVtIHVtYSBzZXHDvMOqbmNpYSBkZSB0ZXh0bw0KTE9XRVIJCQk9IE1JTsOaU0NVTEEJCQkjIwlDb252ZXJ0ZSB0ZXh0byBwYXJhIG1pbsO6c2N1bGFzDQpNSUQJCQk9IEVYVC5URVhUTwkJCSMjCVJldG9ybmEgdW0gbsO6bWVybyBlc3BlY8OtZmljbyBkZSBjYXJhY3RlcmVzIGRlIHVtYSBzZXHDvMOqbmNpYSBkZSB0ZXh0byBjb21lw6dhbmRvIG5hIHBvc2nDp8OjbyBlc3BlY2lmaWNhZGENCk1JREIJCQk9IEVYVC5URVhUT0IJCQkjIwlSZXRvcm5hIHVtIG7Dum1lcm8gZXNwZWPDrWZpY28gZGUgY2FyYWN0ZXJlcyBkZSB1bWEgc2Vxw7zDqm5jaWEgZGUgdGV4dG8gY29tZcOnYW5kbyBuYSBwb3Npw6fDo28gZXNwZWNpZmljYWRhDQpQSE9ORVRJQwkJPSBGT07DiVRJQ0EJCQkjIwlFeHRyYWkgb3MgY2FyYWN0ZXJlcyBmb27DqXRpY29zIChmdXJpZ2FuYSkgZGUgdW1hIHNlccO8w6puY2lhIGRlIGNhcmFjdGVyZXMgZGUgdGV4dG8NClBST1BFUgkJCT0gUFJJLk1BScOaU0NVTEEJCQkjIwlDb2xvY2EgYSBwcmltZWlyYSBsZXRyYSBkZSBjYWRhIHBhbGF2cmEgZW0gbWFpw7pzY3VsYSBlbSB1bSB2YWxvciBkZSB0ZXh0bw0KUkVQTEFDRQkJCT0gTVVEQVIJCQkJIyMJTXVkYSBvcyBjYXJhY3RlcmVzIGRlbnRybyBkbyB0ZXh0bw0KUkVQTEFDRUIJCT0gTVVEQVJCCQkJIyMJTXVkYSBvcyBjYXJhY3RlcmVzIGRlbnRybyBkbyB0ZXh0bw0KUkVQVAkJCT0gUkVQVAkJCQkjIwlSZXBldGUgbyB0ZXh0byB1bSBkZXRlcm1pbmFkbyBuw7ptZXJvIGRlIHZlemVzDQpSSUdIVAkJCT0gRElSRUlUQQkJCSMjCVJldG9ybmEgb3MgY2FyYWN0ZXJlcyBtYWlzIMOgIGRpcmVpdGEgZGUgdW0gdmFsb3IgZGUgdGV4dG8NClJJR0hUQgkJCT0gRElSRUlUQUIJCQkjIwlSZXRvcm5hIG9zIGNhcmFjdGVyZXMgbWFpcyDDoCBkaXJlaXRhIGRlIHVtIHZhbG9yIGRlIHRleHRvDQpTRUFSQ0gJCQk9IExPQ0FMSVpBUgkJCSMjCUxvY2FsaXphIHVtIHZhbG9yIGRlIHRleHRvIGRlbnRybyBkZSBvdXRybyAobsOjbyBkaWZlcmVuY2lhIG1hacO6c2N1bGFzIGRlIG1pbsO6c2N1bGFzKQ0KU0VBUkNIQgkJCT0gTE9DQUxJWkFSQgkJCSMjCUxvY2FsaXphIHVtIHZhbG9yIGRlIHRleHRvIGRlbnRybyBkZSBvdXRybyAobsOjbyBkaWZlcmVuY2lhIG1hacO6c2N1bGFzIGRlIG1pbsO6c2N1bGFzKQ0KU1VCU1RJVFVURQkJPSBTVUJTVElUVUlSCQkJIyMJU3Vic3RpdHVpIHVtIG5vdm8gdGV4dG8gcG9yIHVtIHRleHRvIGFudGlnbyBlbSB1bWEgc2Vxw7zDqm5jaWEgZGUgdGV4dG8NClQJCQk9IFQJCQkJIyMJQ29udmVydGUgb3MgYXJndW1lbnRvcyBlbSB0ZXh0bw0KVEVYVAkJCT0gVEVYVE8JCQkJIyMJRm9ybWF0YSB1bSBuw7ptZXJvIGUgbyBjb252ZXJ0ZSBlbSB0ZXh0bw0KVFJJTQkJCT0gQVJSVU1BUgkJCSMjCVJlbW92ZSBlc3Bhw6dvcyBkbyB0ZXh0bw0KVVBQRVIJCQk9IE1BScOaU0NVTEEJCQkjIwlDb252ZXJ0ZSBvIHRleHRvIGVtIG1hacO6c2N1bGFzDQpWQUxVRQkJCT0gVkFMT1IJCQkJIyMJQ29udmVydGUgdW0gYXJndW1lbnRvIGRlIHRleHRvIGVtIHVtIG7Dum1lcm8NCg==]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/locale/pt/config</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[77u/IyMNCiMjIFBIUEV4Y2VsDQojIw0NCiMjIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTEgUEhQRXhjZWwNCiMjDQojIyBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yDQojIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljDQojIyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXINCiMjIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLg0KIyMNCiMjIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLA0KIyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YNCiMjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VDQojIyBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLg0KIyMNCiMjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMNCiMjIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUNCiMjIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQ0KIyMNCiMjIEBjYXRlZ29yeSAgIFBIUEV4Y2VsDQojIyBAcGFja2FnZSAgICBQSFBFeGNlbF9TZXR0aW5ncw0KIyMgQGNvcHlyaWdodCAgQ29weXJpZ2h0IChjKSAyMDA2IC0gMjAxMSBQSFBFeGNlbCAoaHR0cDovL3d3dy5jb2RlcGxleC5jb20vUEhQRXhjZWwpDQojIyBAbGljZW5zZSAgICBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvb2xkLWxpY2Vuc2VzL2xncGwtMi4xLnR4dAlMR1BMDQojIyBAdmVyc2lvbiAgICAxLjcuNywgMjAxMi0wNS0xOQ0KIyMNCiMjDQoNCg0KQXJndW1lbnRTZXBhcmF0b3IJPSA7DQoNCg0KIyMNCiMjCShGb3IgZnV0dXJlIHVzZSkNCiMjDQpjdXJyZW5jeVN5bWJvbAk9IOKCrA0KDQoNCiMjDQojIwlFeGNlbCBFcnJvciBDb2RlcwkoRm9yIGZ1dHVyZSB1c2UpDQ0KIyMNCk5VTEwJPSAjTlVMTyENCkRJVjAJPSAjRElWLzAhDQpWQUxVRQk9ICNWQUxPUiENClJFRgk9ICNSRUYhDQpOQU1FCT0gI05PTUU/DQpOVU0JPSAjTsOaTSENCk5BCT0gI04vRA0K]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/locale/pt/functions</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[77u/IyMNCiMjCUFkZC1pbiBhbmQgQXV0b21hdGlvbiBmdW5jdGlvbnMJCQlGdW7Dp8O1ZXMgZGUgU3VwbGVtZW50byBlIEF1dG9tYXRpemHDp8Ojbw0KIyMNCkdFVFBJVk9UREFUQQkJPSBPQlRFUkRBRE9TRElOCQkJIyMJRGV2b2x2ZSBkYWRvcyBhcm1hemVuYWRvcyBudW0gcmVsYXTDs3JpbyBkZSBUYWJlbGEgRGluw6JtaWNhDQoNCg0KIyMNCiMjCUN1YmUgZnVuY3Rpb25zCQkJCQlGdW7Dp8O1ZXMgZGUgY3Vibw0KIyMNCkNVQkVLUElNRU1CRVIJCT0gTUVNQlJPS1BJQ1VCTwkJCSMjCURldm9sdmUgbyBub21lLCBwcm9wcmllZGFkZSBlIG1lZGnDp8OjbyBkZSB1bSBLUEkgKGtleSBwZXJmb3JtYW5jZSBpbmRpY2F0b3IpIGUgYXByZXNlbnRhIG8gbm9tZSBlIGEgcHJvcHJpZWRhZGUgbmEgY8OpbHVsYS4gVW0gS1BJIMOpIHVtYSBtZWRpZGEgcXVhbnRpZmljw6F2ZWwsIGNvbW8sIHBvciBleGVtcGxvLCBvIGx1Y3JvIG1lbnNhbCBicnV0byBvdSBhIHJvdGF0aXZpZGFkZSB0cmltZXN0cmFsIGRlIHBlc3NvYWwsIHV0aWxpemFkYSBwYXJhIG1vbml0b3JpemFyIG8gZGVzZW1wZW5obyBkZSB1bWEgb3JnYW5pemHDp8Ojby4NCkNVQkVNRU1CRVIJCT0gTUVNQlJPQ1VCTwkJCSMjCURldm9sdmUgdW0gbWVtYnJvIG91IGNhZGVpYSBkZSBpZGVudGlmaWNhw6fDo28gbnVtYSBoaWVyYXJxdWlhIGRlIGN1Ym8uIFV0aWxpemFkYSBwYXJhIHZhbGlkYXIgYSBleGlzdMOqbmNpYSBkbyBtZW1icm8gb3UgY2FkZWlhIGRlIGlkZW50aWZpY2HDp8OjbyBubyBjdWJvLg0KQ1VCRU1FTUJFUlBST1BFUlRZCT0gUFJPUFJJRURBREVNRU1CUk9DVUJPCQkjIwlEZXZvbHZlIG8gdmFsb3IgZGUgdW1hIHByb3ByaWVkYWRlIGRlIG1lbWJybyBubyBjdWJvLiBVdGlsaXphZGEgcGFyYSB2YWxpZGFyIGEgZXhpc3TDqm5jaWEgZGUgdW0gbm9tZSBkZSBtZW1icm8gbm8gY3VibyBlIHBhcmEgZGV2b2x2ZXIgYSBwcm9wcmllZGFkZSBlc3BlY2lmaWNhZGEgcGFyYSBlc3NlIG1lbWJyby4NCkNVQkVSQU5LRURNRU1CRVIJPSBNRU1CUk9DTEFTU0lGSUNBRE9DVUJPCSMjCURldm9sdmUgbyBlbsOpc2ltbyBvdSBhIGNsYXNzaWZpY2HDp8OjbyBtYWlzIGFsdGEgbnVtIGNvbmp1bnRvLiBVdGlsaXphZGEgcGFyYSBkZXZvbHZlciB1bSBvdSBtYWlzIGVsZW1lbnRvcyBudW0gY29uanVudG8sIHRhbCBjb21vIG8gbWVsaG9yIHZlbmRlZG9yIG91IG9zIDEwIG1lbGhvcmVzIGFsdW5vcy4NCkNVQkVTRVQJCQk9IENPTkpVTlRPQ1VCTwkJCSMjCURlZmluZSB1bSBjb25qdW50byBjYWxjdWxhZG8gZGUgbWVtYnJvcyBvdSBjYWRlaWFzIGRlIGlkZW50aWZpY2HDp8OjbyBlbnZpYW5kbyB1bWEgZXhwcmVzc8OjbyBkZSBjb25qdW50byBwYXJhIG8gY3VibyBubyBzZXJ2aWRvciwgcXVlIGNyaWEgbyBjb25qdW50byBlLCBlbSBzZWd1aWRhLCBkZXZvbHZlIG8gY29uanVudG8gYW8gTWljcm9zb2Z0IE9mZmljZSBFeGNlbC4NCkNVQkVTRVRDT1VOVAkJPSBDT05UQVJDT05KVU5UT0NVQk8JCSMjCURldm9sdmUgbyBuw7ptZXJvIGRlIGl0ZW5zIG51bSBjb25qdW50by4NCkNVQkVWQUxVRQkJPSBWQUxPUkNVQk8JCQkjIwlEZXZvbHZlIHVtIHZhbG9yIGFncmVnYWRvIGRvIGN1Ym8uDQoNCg0KIyMNCiMjCURhdGFiYXNlIGZ1bmN0aW9ucwkJCQlGdW7Dp8O1ZXMgZGUgYmFzZSBkZSBkYWRvcw0KIyMNCkRBVkVSQUdFCQk9IEJETcOJRElBCQkJIyMJRGV2b2x2ZSBhIG3DqWRpYSBkYXMgZW50cmFkYXMgZGEgYmFzZSBkZSBkYWRvcyBzZWxlY2Npb25hZGFzDQpEQ09VTlQJCQk9IEJEQ09OVEFSCQkJIyMJQ29udGEgYXMgY8OpbHVsYXMgcXVlIGNvbnTDqm0gbsO6bWVyb3MgbnVtYSBiYXNlIGRlIGRhZG9zDQpEQ09VTlRBCQkJPSBCRENPTlRBUi5WQUwJCQkjIwlDb250YSBhcyBjw6lsdWxhcyBxdWUgbsOjbyBlc3RlamFtIGVtIGJyYW5jbyBudW1hIGJhc2UgZGUgZGFkb3MNCkRHRVQJCQk9IEJET0JURVIJCQkjIwlFeHRyYWkgZGUgdW1hIGJhc2UgZGUgZGFkb3MgdW0gw7puaWNvIHJlZ2lzdG8gcXVlIGNvcnJlc3BvbmRlIGFvcyBjcml0w6lyaW9zIGVzcGVjaWZpY2Fkb3MNCkRNQVgJCQk9IEJETcOBWAkJCQkjIwlEZXZvbHZlIG8gdmFsb3IgbcOheGltbyBkYXMgZW50cmFkYXMgZGEgYmFzZSBkZSBkYWRvcyBzZWxlY2Npb25hZGFzDQpETUlOCQkJPSBCRE3DjU4JCQkJIyMJRGV2b2x2ZSBvIHZhbG9yIG3DrW5pbW8gZGFzIGVudHJhZGFzIGRhIGJhc2UgZGUgZGFkb3Mgc2VsZWNjaW9uYWRhcw0KRFBST0RVQ1QJCT0gQkRNVUxUSVBMCQkJIyMJTXVsdGlwbGljYSBvcyB2YWxvcmVzIGRlIHVtIGRldGVybWluYWRvIGNhbXBvIGRlIHJlZ2lzdG9zIHF1ZSBjb3JyZXNwb25kZW0gYW9zIGNyaXTDqXJpb3MgbnVtYSBiYXNlIGRlIGRhZG9zDQpEU1RERVYJCQk9IEJEREVTVlBBRAkJCSMjCUNhbGN1bGEgbyBkZXN2aW8tcGFkcsOjbyBjb20gYmFzZSBudW1hIGFtb3N0cmEgZGUgZW50cmFkYXMgZGEgYmFzZSBkZSBkYWRvcyBzZWxlY2Npb25hZGFzDQpEU1RERVZQCQkJPSBCRERFU1ZQQURQCQkJIyMJQ2FsY3VsYSBvIGRlc3Zpby1wYWRyw6NvIGNvbSBiYXNlIG5hIHBvcHVsYcOnw6NvIHRvdGFsIGRhcyBlbnRyYWRhcyBkYSBiYXNlIGRlIGRhZG9zIHNlbGVjY2lvbmFkYXMNCkRTVU0JCQk9IEJEU09NQQkJCSMjCUFkaWNpb25hIG9zIG7Dum1lcm9zIG5hIGNvbHVuYSBkZSBjYW1wbyBkb3MgcmVnaXN0b3MgZGUgYmFzZSBkZSBkYWRvcyBxdWUgY29ycmVzcG9uZGVtIGFvcyBjcml0w6lyaW9zDQpEVkFSCQkJPSBCRFZBUgkJCQkjIwlDYWxjdWxhIGEgdmFyacOibmNpYSBjb20gYmFzZSBudW1hIGFtb3N0cmEgZGFzIGVudHJhZGFzIGRlIGJhc2UgZGUgZGFkb3Mgc2VsZWNjaW9uYWRhcw0KRFZBUlAJCQk9IEJEVkFSUAkJCSMjCUNhbGN1bGEgYSB2YXJpw6JuY2lhIGNvbSBiYXNlIG5hIHBvcHVsYcOnw6NvIHRvdGFsIGRhcyBlbnRyYWRhcyBkZSBiYXNlIGRlIGRhZG9zIHNlbGVjY2lvbmFkYXMNCg0KDQojIw0KIyMJRGF0ZSBhbmQgdGltZSBmdW5jdGlvbnMJCQkJRnVuw6fDtWVzIGRlIGRhdGEgZSBob3JhDQojIw0KREFURQkJCT0gREFUQQkJCQkjIwlEZXZvbHZlIG8gbsO6bWVybyBkZSBzw6lyaWUgZGUgdW1hIGRldGVybWluYWRhIGRhdGENCkRBVEVWQUxVRQkJPSBEQVRBLlZBTE9SCQkJIyMJQ29udmVydGUgdW1hIGRhdGEgZW0gZm9ybWEgZGUgdGV4dG8gbnVtIG7Dum1lcm8gZGUgc8OpcmllDQpEQVkJCQk9IERJQQkJCQkjIwlDb252ZXJ0ZSB1bSBuw7ptZXJvIGRlIHPDqXJpZSBudW0gZGlhIGRvIG3DqnMNCkRBWVMzNjAJCQk9IERJQVMzNjAJCQkjIwlDYWxjdWxhIG8gbsO6bWVybyBkZSBkaWFzIGVudHJlIGR1YXMgZGF0YXMgY29tIGJhc2UgbnVtIGFubyBjb20gMzYwIGRpYXMNCkVEQVRFCQkJPSBEQVRBTQkJCQkjIwlEZXZvbHZlIHVtIG7Dum1lcm8gZGUgc8OpcmllIGRlIGRhdGEgcXVlIGNvcnJlc3BvbmRlIGFvIG7Dum1lcm8gZGUgbWVzZXMgaW5kaWNhZG8gYW50ZXMgb3UgZGVwb2lzIGRhIGRhdGEgZGUgaW7DrWNpbw0KRU9NT05USAkJCT0gRklNTcOKUwkJCSMjCURldm9sdmUgbyBuw7ptZXJvIGRlIHPDqXJpZSBkbyDDumx0aW1vIGRpYSBkbyBtw6pzIGFudGVzIG91IGRlcG9pcyBkZSB1bSBuw7ptZXJvIGRlIG1lc2VzIGVzcGVjaWZpY2Fkbw0KSE9VUgkJCT0gSE9SQQkJCQkjIwlDb252ZXJ0ZSB1bSBuw7ptZXJvIGRlIHPDqXJpZSBudW1hIGhvcmENCk1JTlVURQkJCT0gTUlOVVRPCQkJIyMJQ29udmVydGUgdW0gbsO6bWVybyBkZSBzw6lyaWUgbnVtIG1pbnV0bw0KTU9OVEgJCQk9IE3DilMJCQkJIyMJQ29udmVydGUgdW0gbsO6bWVybyBkZSBzw6lyaWUgbnVtIG3DqnMNCk5FVFdPUktEQVlTCQk9IERJQVRSQUJBTEhPVE9UQUwJCSMjCURldm9sdmUgbyBuw7ptZXJvIHRvdGFsIGRlIGRpYXMgw7p0ZWlzIGVudHJlIGR1YXMgZGF0YXMNCk5PVwkJCT0gQUdPUkEJCQkJIyMJRGV2b2x2ZSBvIG7Dum1lcm8gZGUgc8OpcmllIGRhIGRhdGEgZSBob3JhIGFjdHVhaXMNClNFQ09ORAkJCT0gU0VHVU5ETwkJCSMjCUNvbnZlcnRlIHVtIG7Dum1lcm8gZGUgc8OpcmllIG51bSBzZWd1bmRvDQpUSU1FCQkJPSBURU1QTwkJCQkjIwlEZXZvbHZlIG8gbsO6bWVybyBkZSBzw6lyaWUgZGUgdW0gZGV0ZXJtaW5hZG8gdGVtcG8NClRJTUVWQUxVRQkJPSBWQUxPUi5URU1QTwkJCSMjCUNvbnZlcnRlIHVtIHRlbXBvIGVtIGZvcm1hIGRlIHRleHRvIG51bSBuw7ptZXJvIGRlIHPDqXJpZQ0KVE9EQVkJCQk9IEhPSkUJCQkJIyMJRGV2b2x2ZSBvIG7Dum1lcm8gZGUgc8OpcmllIGRhIGRhdGEgYWN0dWFsDQpXRUVLREFZCQkJPSBESUEuU0VNQU5BCQkJIyMJQ29udmVydGUgdW0gbsO6bWVybyBkZSBzw6lyaWUgbnVtIGRpYSBkYSBzZW1hbmENCldFRUtOVU0JCQk9IE7Dmk1TRU1BTkEJCQkjIwlDb252ZXJ0ZSB1bSBuw7ptZXJvIGRlIHPDqXJpZSBudW0gbsO6bWVybyBxdWUgcmVwcmVzZW50YSBvIG7Dum1lcm8gZGEgc2VtYW5hIG51bSBkZXRlcm1pbmFkbyBhbm8NCldPUktEQVkJCQk9IERJQS5UUkFCQUxITwkJCSMjCURldm9sdmUgbyBuw7ptZXJvIGRlIHPDqXJpZSBkYSBkYXRhIGFudGVzIG91IGRlcG9pcyBkZSB1bSBuw7ptZXJvIGRlIGRpYXMgw7p0ZWlzIGVzcGVjaWZpY2Fkbw0KWUVBUgkJCT0gQU5PCQkJCSMjCUNvbnZlcnRlIHVtIG7Dum1lcm8gZGUgc8OpcmllIG51bSBhbm8NCllFQVJGUkFDCQk9IEZSQUPDh8ODT0FOTwkJCSMjCURldm9sdmUgYSBmcmFjw6fDo28gZGUgYW5vIHF1ZSByZXByZXNlbnRhIG8gbsO6bWVybyBkZSBkaWFzIGludGVpcm9zIGVudHJlIGEgZGF0YV9kZV9pbsOtY2lvIGUgYSBkYXRhX2RlX2ZpbQ0KDQoNCiMjDQojIwlFbmdpbmVlcmluZyBmdW5jdGlvbnMJCQkJRnVuw6fDtWVzIGRlIGVuZ2VuaGFyaWENCiMjDQpCRVNTRUxJCQkJPSBCRVNTRUxJCQkJIyMJRGV2b2x2ZSBhIGZ1bsOnw6NvIGRlIEJlc3NlbCBtb2RpZmljYWRhIEluKHgpDQpCRVNTRUxKCQkJPSBCRVNTRUxKCQkJIyMJRGV2b2x2ZSBhIGZ1bsOnw6NvIGRlIEJlc3NlbCBKbih4KQ0KQkVTU0VMSwkJCT0gQkVTU0VMSwkJCSMjCURldm9sdmUgYSBmdW7Dp8OjbyBkZSBCZXNzZWwgbW9kaWZpY2FkYSBLbih4KQ0KQkVTU0VMWQkJCT0gQkVTU0VMWQkJCSMjCURldm9sdmUgYSBmdW7Dp8OjbyBkZSBCZXNzZWwgWW4oeCkNCkJJTjJERUMJCQk9IEJJTkFERUMJCQkjIwlDb252ZXJ0ZSB1bSBuw7ptZXJvIGJpbsOhcmlvIGVtIGRlY2ltYWwNCkJJTjJIRVgJCQk9IEJJTkFIRVgJCQkjIwlDb252ZXJ0ZSB1bSBuw7ptZXJvIGJpbsOhcmlvIGVtIGhleGFkZWNpbWFsDQpCSU4yT0NUCQkJPSBCSU5BT0NUCQkJIyMJQ29udmVydGUgdW0gbsO6bWVybyBiaW7DoXJpbyBlbSBvY3RhbA0KQ09NUExFWAkJCT0gQ09NUExFWE8JCQkjIwlDb252ZXJ0ZSBjb2VmaWNpZW50ZXMgcmVhaXMgZSBpbWFnaW7DoXJpb3MgbnVtIG7Dum1lcm8gY29tcGxleG8NCkNPTlZFUlQJCQk9IENPTlZFUlRFUgkJCSMjCUNvbnZlcnRlIHVtIG7Dum1lcm8gZGUgdW0gc2lzdGVtYSBkZSBtZWRpZGEgbm91dHJvDQpERUMyQklOCQkJPSBERUNBQklOCQkJIyMJQ29udmVydGUgdW0gbsO6bWVybyBkZWNpbWFsIGVtIGJpbsOhcmlvDQpERUMySEVYCQkJPSBERUNBSEVYCQkJIyMJQ29udmVydGUgdW0gbsO6bWVybyBkZWNpbWFsIGVtIGhleGFkZWNpbWFsDQpERUMyT0NUCQkJPSBERUNBT0NUCQkJIyMJQ29udmVydGUgdW0gbsO6bWVybyBkZWNpbWFsIGVtIG9jdGFsDQpERUxUQQkJCT0gREVMVEEJCQkJIyMJVGVzdGEgc2UgZG9pcyB2YWxvcmVzIHPDo28gaWd1YWlzDQpFUkYJCQk9IEZVTkNFUlJPCQkJIyMJRGV2b2x2ZSBhIGZ1bsOnw6NvIGRlIGVycm8NCkVSRkMJCQk9IEZVTkNFUlJPQ09NUEwJCQkjIwlEZXZvbHZlIGEgZnVuw6fDo28gZGUgZXJybyBjb21wbGVtZW50YXINCkdFU1RFUAkJCT0gREVHUkFVCQkJIyMJVGVzdGEgc2UgdW0gbsO6bWVybyDDqSBtYWlvciBkbyBxdWUgdW0gdmFsb3IgbGltaXRlDQpIRVgyQklOCQkJPSBIRVhBQklOCQkJIyMJQ29udmVydGUgdW0gbsO6bWVybyBoZXhhZGVjaW1hbCBlbSBiaW7DoXJpbw0KSEVYMkRFQwkJCT0gSEVYQURFQwkJCSMjCUNvbnZlcnRlIHVtIG7Dum1lcm8gaGV4YWRlY2ltYWwgZW0gZGVjaW1hbA0KSEVYMk9DVAkJCT0gSEVYQU9DVAkJCSMjCUNvbnZlcnRlIHVtIG7Dum1lcm8gaGV4YWRlY2ltYWwgZW0gb2N0YWwNCklNQUJTCQkJPSBJTUFCUwkJCQkjIwlEZXZvbHZlIG8gdmFsb3IgYWJzb2x1dG8gKG3Ds2R1bG8pIGRlIHVtIG7Dum1lcm8gY29tcGxleG8NCklNQUdJTkFSWQkJPSBJTUFHSU7DgVJJTwkJCSMjCURldm9sdmUgbyBjb2VmaWNpZW50ZSBpbWFnaW7DoXJpbyBkZSB1bSBuw7ptZXJvIGNvbXBsZXhvDQpJTUFSR1VNRU5UCQk9IElNQVJHCQkJCSMjCURldm9sdmUgbyBhcmd1bWVudG8gVGV0YSwgdW0gw6JuZ3VsbyBleHByZXNzbyBlbSByYWRpYW5vcw0KSU1DT05KVUdBVEUJCT0gSU1DT05KCQkJIyMJRGV2b2x2ZSBvIGNvbmp1Z2FkbyBjb21wbGV4byBkZSB1bSBuw7ptZXJvIGNvbXBsZXhvDQpJTUNPUwkJCT0gSU1DT1MJCQkJIyMJRGV2b2x2ZSBvIGNvLXNlbm8gZGUgdW0gbsO6bWVybyBjb21wbGV4bw0KSU1ESVYJCQk9IElNRElWCQkJCSMjCURldm9sdmUgbyBxdW9jaWVudGUgZGUgZG9pcyBuw7ptZXJvcyBjb21wbGV4b3MNCklNRVhQCQkJPSBJTUVYUAkJCQkjIwlEZXZvbHZlIG8gZXhwb25lbmNpYWwgZGUgdW0gbsO6bWVybyBjb21wbGV4bw0KSU1MTgkJCT0gSU1MTgkJCQkjIwlEZXZvbHZlIG8gbG9nYXJpdG1vIG5hdHVyYWwgZGUgdW0gbsO6bWVybyBjb21wbGV4bw0KSU1MT0cxMAkJCT0gSU1MT0cxMAkJCSMjCURldm9sdmUgbyBsb2dhcml0bW8gZGUgYmFzZSAxMCBkZSB1bSBuw7ptZXJvIGNvbXBsZXhvDQpJTUxPRzIJCQk9IElNTE9HMgkJCSMjCURldm9sdmUgbyBsb2dhcml0bW8gZGUgYmFzZSAyIGRlIHVtIG7Dum1lcm8gY29tcGxleG8NCklNUE9XRVIJCQk9IElNUE9UCQkJCSMjCURldm9sdmUgdW0gbsO6bWVybyBjb21wbGV4byBlbGV2YWRvIGEgdW1hIHBvdMOqbmNpYSBpbnRlaXJhDQpJTVBST0RVQ1QJCT0gSU1QUk9ECQkJIyMJRGV2b2x2ZSBvIHByb2R1dG8gZGUgbsO6bWVyb3MgY29tcGxleG9zDQpJTVJFQUwJCQk9IElNUkVBTAkJCSMjCURldm9sdmUgbyBjb2VmaWNpZW50ZSByZWFsIGRlIHVtIG7Dum1lcm8gY29tcGxleG8NCklNU0lOCQkJPSBJTVNFTk8JCQkjIwlEZXZvbHZlIG8gc2VubyBkZSB1bSBuw7ptZXJvIGNvbXBsZXhvDQpJTVNRUlQJCQk9IElNUkFJWgkJCSMjCURldm9sdmUgYSByYWl6IHF1YWRyYWRhIGRlIHVtIG7Dum1lcm8gY29tcGxleG8NCklNU1VCCQkJPSBJTVNVQlRSCQkJIyMJRGV2b2x2ZSBhIGRpZmVyZW7Dp2EgZW50cmUgZG9pcyBuw7ptZXJvcyBjb21wbGV4b3MNCklNU1VNCQkJPSBJTVNPTUEJCQkjIwlEZXZvbHZlIGEgc29tYSBkZSBuw7ptZXJvcyBjb21wbGV4b3MNCk9DVDJCSU4JCQk9IE9DVEFCSU4JCQkjIwlDb252ZXJ0ZSB1bSBuw7ptZXJvIG9jdGFsIGVtIGJpbsOhcmlvDQpPQ1QyREVDCQkJPSBPQ1RBREVDCQkJIyMJQ29udmVydGUgdW0gbsO6bWVybyBvY3RhbCBlbSBkZWNpbWFsDQpPQ1QySEVYCQkJPSBPQ1RBSEVYCQkJIyMJQ29udmVydGUgdW0gbsO6bWVybyBvY3RhbCBlbSBoZXhhZGVjaW1hbA0KDQoNCiMjDQojIwlGaW5hbmNpYWwgZnVuY3Rpb25zCQkJCUZ1bsOnw7VlcyBmaW5hbmNlaXJhcw0KIyMNCkFDQ1JJTlQJCQk9IEpVUk9TQUNVTQkJCSMjCURldm9sdmUgb3MganVyb3MgYWN1bXVsYWRvcyBkZSB1bSB0w610dWxvIHF1ZSBwYWdhIGp1cm9zIHBlcmnDs2RpY29zDQpBQ0NSSU5UTQkJPSBKVVJPU0FDVU1WCQkJIyMJRGV2b2x2ZSBvcyBqdXJvcyBhY3VtdWxhZG9zIGRlIHVtIHTDrXR1bG8gcXVlIHBhZ2EganVyb3Mgbm8gdmVuY2ltZW50bw0KQU1PUkRFR1JDCQk9IEFNT1JERUdSQwkJCSMjCURldm9sdmUgYSBkZXByZWNpYcOnw6NvIGNvcnJlc3BvbmRlbnRlIGEgY2FkYSBwZXLDrW9kbyBjb250YWJpbMOtc3RpY28gdXRpbGl6YW5kbyB1bSBjb2VmaWNpZW50ZSBkZSBkZXByZWNpYcOnw6NvDQpBTU9STElOQwkJPSBBTU9STElOQwkJCSMjCURldm9sdmUgYSBkZXByZWNpYcOnw6NvIGNvcnJlc3BvbmRlbnRlIGEgY2FkYSBwZXLDrW9kbyBjb250YWJpbMOtc3RpY28NCkNPVVBEQVlCUwkJPSBDVVBESUFTSU5MSVEJCQkjIwlEZXZvbHZlIG8gbsO6bWVybyBkZSBkaWFzIGVudHJlIG8gaW7DrWNpbyBkbyBwZXLDrW9kbyBkbyBjdXDDo28gZSBhIGRhdGEgZGUgcmVndWxhcml6YcOnw6NvDQpDT1VQREFZUwkJPSBDVVBESUFTCQkJIyMJRGV2b2x2ZSBvIG7Dum1lcm8gZGUgZGlhcyBubyBwZXLDrW9kbyBkbyBjdXDDo28gcXVlIGNvbnTDqW0gYSBkYXRhIGRlIHJlZ3VsYXJpemHDp8Ojbw0KQ09VUERBWVNOQwkJPSBDVVBESUFTUFLDk1gJCQkjIwlEZXZvbHZlIG8gbsO6bWVybyBkZSBkaWFzIGVudHJlIGEgZGF0YSBkZSByZWd1bGFyaXphw6fDo28gZSBhIGRhdGEgZG8gY3Vww6NvIHNlZ3VpbnRlDQpDT1VQTkNECQkJPSBDVVBEQVRBUFLDk1gJCQkjIwlEZXZvbHZlIGEgZGF0YSBkbyBjdXDDo28gc2VndWludGUgYXDDs3MgYSBkYXRhIGRlIHJlZ3VsYXJpemHDp8Ojbw0KQ09VUE5VTQkJCT0gQ1VQTsOaTQkJCSMjCURldm9sdmUgbyBuw7ptZXJvIGRlIGN1cMO1ZXMgYSBzZXJlbSBwYWdvcyBlbnRyZSBhIGRhdGEgZGUgcmVndWxhcml6YcOnw6NvIGUgYSBkYXRhIGRlIHZlbmNpbWVudG8NCkNPVVBQQ0QJCQk9IENVUERBVEFBTlQJCQkjIwlEZXZvbHZlIGEgZGF0YSBkbyBjdXDDo28gYW50ZXJpb3IgYW50ZXMgZGEgZGF0YSBkZSByZWd1bGFyaXphw6fDo28NCkNVTUlQTVQJCQk9IFBHVE9KVVJBQ1VNCQkJIyMJRGV2b2x2ZSBvcyBqdXJvcyBjdW11bGF0aXZvcyBwYWdvcyBlbnRyZSBkb2lzIHBlcsOtb2Rvcw0KQ1VNUFJJTkMJCT0gUEdUT0NBUEFDVU0JCQkjIwlEZXZvbHZlIG8gY2FwaXRhbCBjdW11bGF0aXZvIHBhZ28gYSB0w610dWxvIGRlIGVtcHLDqXN0aW1vIGVudHJlIGRvaXMgcGVyw61vZG9zDQpEQgkJCT0gQkQJCQkJIyMJRGV2b2x2ZSBhIGRlcHJlY2lhw6fDo28gZGUgdW0gYWN0aXZvIHJlbGF0aXZvIGEgdW0gcGVyw61vZG8gZXNwZWNpZmljYWRvIHV0aWxpemFuZG8gbyBtw6l0b2RvIGRhcyBxdW90YXMgZGVncmVzc2l2YXMgZml4YXMNCkREQgkJCT0gQkRECQkJCSMjCURldm9sdmUgYSBkZXByZWNpYcOnw6NvIGRlIHVtIGFjdGl2byByZWxhdGl2byBhIHVtIHBlcsOtb2RvIGVzcGVjaWZpY2FkbyB1dGlsaXphbmRvIG8gbcOpdG9kbyBkYXMgcXVvdGFzIGRlZ3Jlc3NpdmFzIGR1cGxhcyBvdSBxdWFscXVlciBvdXRybyBtw6l0b2RvIGVzcGVjaWZpY2Fkbw0KRElTQwkJCT0gREVTQwkJCQkjIwlEZXZvbHZlIGEgdGF4YSBkZSBkZXNjb250byBkZSB1bSB0w610dWxvDQpET0xMQVJERQkJPSBNT0VEQURFQwkJCSMjCUNvbnZlcnRlIHVtIHByZcOnbyBlbSB1bmlkYWRlIG1vbmV0w6FyaWEsIGV4cHJlc3NvIGNvbW8gdW1hIGZyYWPDp8OjbywgbnVtIHByZcOnbyBlbSB1bmlkYWRlIG1vbmV0w6FyaWEsIGV4cHJlc3NvIGNvbW8gdW0gbsO6bWVybyBkZWNpbWFsDQpET0xMQVJGUgkJPSBNT0VEQUZSQQkJCSMjCUNvbnZlcnRlIHVtIHByZcOnbyBlbSB1bmlkYWRlIG1vbmV0w6FyaWEsIGV4cHJlc3NvIGNvbW8gdW0gbsO6bWVybyBkZWNpbWFsLCBudW0gcHJlw6dvIGVtIHVuaWRhZGUgbW9uZXTDoXJpYSwgZXhwcmVzc28gY29tbyB1bWEgZnJhY8Onw6NvDQpEVVJBVElPTgkJPSBEVVJBw4fDg08JCQkjIwlEZXZvbHZlIGEgZHVyYcOnw6NvIGFudWFsIGRlIHVtIHTDrXR1bG8gY29tIHBhZ2FtZW50b3MgZGUganVyb3MgcGVyacOzZGljb3MNCkVGRkVDVAkJCT0gRUZFQ1RJVkEJCQkjIwlEZXZvbHZlIGEgdGF4YSBkZSBqdXJvcyBhbnVhbCBlZmVjdGl2YQ0KRlYJCQk9IFZGCQkJCSMjCURldm9sdmUgbyB2YWxvciBmdXR1cm8gZGUgdW0gaW52ZXN0aW1lbnRvDQpGVlNDSEVEVUxFCQk9IFZGUExBTk8JCQkjIwlEZXZvbHZlIG8gdmFsb3IgZnV0dXJvIGRlIHVtIGNhcGl0YWwgaW5pY2lhbCBhcMOzcyBhIGFwbGljYcOnw6NvIGRlIHVtYSBzw6lyaWUgZGUgdGF4YXMgZGUganVybyBjb21wb3N0YXMNCklOVFJBVEUJCQk9IFRBWEFKVVJPUwkJCSMjCURldm9sdmUgYSB0YXhhIGRlIGp1cm9zIGRlIHVtIHTDrXR1bG8gaW52ZXN0aWRvIG5hIHRvdGFsaWRhZGUNCklQTVQJCQk9IElQR1RPCQkJCSMjCURldm9sdmUgbyBwYWdhbWVudG8gZG9zIGp1cm9zIGRlIHVtIGludmVzdGltZW50byBkdXJhbnRlIHVtIGRldGVybWluYWRvIHBlcsOtb2RvDQpJUlIJCQk9IFRJUgkJCQkjIwlEZXZvbHZlIGEgdGF4YSBkZSByZW50YWJpbGlkYWRlIGludGVybmEgcGFyYSB1bWEgc8OpcmllIGRlIGZsdXhvcyBtb25ldMOhcmlvcw0KSVNQTVQJCQk9IMOJLlBHVE8JCQkjIwlDYWxjdWxhIG9zIGp1cm9zIHBhZ29zIGR1cmFudGUgdW0gcGVyw61vZG8gZXNwZWPDrWZpY28gZGUgdW0gaW52ZXN0aW1lbnRvDQpNRFVSQVRJT04JCT0gTURVUkHDh8ODTwkJCSMjCURldm9sdmUgYSBkdXJhw6fDo28gbW9kaWZpY2FkYSBkZSBNYWNhdWxleSBkZSB1bSB0w610dWxvIGNvbSB1bSB2YWxvciBkZSBwYXJpZGFkZSBlcXVpdmFsZW50ZSBhIOKCrCAxMDANCk1JUlIJCQk9IE1USVIJCQkJIyMJRGV2b2x2ZSBhIHRheGEgaW50ZXJuYSBkZSByZW50YWJpbGlkYWRlIGVtIHF1ZSBvcyBmbHV4b3MgbW9uZXTDoXJpb3MgcG9zaXRpdm9zIGUgbmVnYXRpdm9zIHPDo28gZmluYW5jaWFkb3MgY29tIHRheGFzIGRpZmVyZW50ZXMNCk5PTUlOQUwJCQk9IE5PTUlOQUwJCQkjIwlEZXZvbHZlIGEgdGF4YSBkZSBqdXJvcyBub21pbmFsIGFudWFsDQpOUEVSCQkJPSBOUEVSCQkJCSMjCURldm9sdmUgbyBuw7ptZXJvIGRlIHBlcsOtb2RvcyBkZSB1bSBpbnZlc3RpbWVudG8NCk5QVgkJCT0gVkFMCQkJCSMjCURldm9sdmUgbyB2YWxvciBhY3R1YWwgbMOtcXVpZG8gZGUgdW0gaW52ZXN0aW1lbnRvIGNvbSBiYXNlIG51bWEgc8OpcmllIGRlIGZsdXhvcyBtb25ldMOhcmlvcyBwZXJpw7NkaWNvcyBlIG51bWEgdGF4YSBkZSBkZXNjb250bw0KT0RERlBSSUNFCQk9IFBSRcOHT1BSSU1JTkMJCQkjIwlEZXZvbHZlIG8gcHJlw6dvIHBvciDigqwgMTAwIGRvIHZhbG9yIG5vbWluYWwgZGUgdW0gdMOtdHVsbyBjb20gdW0gcGVyw61vZG8gaW5pY2lhbCBpbmNvbXBsZXRvDQpPRERGWUlFTEQJCT0gTFVDUk9QUklNSU5DCQkJIyMJRGV2b2x2ZSBvIGx1Y3JvIGRlIHVtIHTDrXR1bG8gY29tIHVtIHBlcsOtb2RvIGluaWNpYWwgaW5jb21wbGV0bw0KT0RETFBSSUNFCQk9IFBSRcOHT8OaTFRJTkMJCQkjIwlEZXZvbHZlIG8gcHJlw6dvIHBvciDigqwgMTAwIGRvIHZhbG9yIG5vbWluYWwgZGUgdW0gdMOtdHVsbyBjb20gdW0gcGVyw61vZG8gZmluYWwgaW5jb21wbGV0bw0KT0RETFlJRUxECQk9IExVQ1JPw5pMVElOQwkJCSMjCURldm9sdmUgbyBsdWNybyBkZSB1bSB0w610dWxvIGNvbSB1bSBwZXLDrW9kbyBmaW5hbCBpbmNvbXBsZXRvDQpQTVQJCQk9IFBHVE8JCQkJIyMJRGV2b2x2ZSBvIHBhZ2FtZW50byBwZXJpw7NkaWNvIGRlIHVtYSBhbnVpZGFkZQ0KUFBNVAkJCT0gUFBHVE8JCQkJIyMJRGV2b2x2ZSBvIHBhZ2FtZW50byBzb2JyZSBvIGNhcGl0YWwgZGUgdW0gaW52ZXN0aW1lbnRvIG51bSBkZXRlcm1pbmFkbyBwZXLDrW9kbw0KUFJJQ0UJCQk9IFBSRcOHTwkJCQkjIwlEZXZvbHZlIG8gcHJlw6dvIHBvciDigqwgMTAwIGRvIHZhbG9yIG5vbWluYWwgZGUgdW0gdMOtdHVsbyBxdWUgcGFnYSBqdXJvcyBwZXJpw7NkaWNvcw0KUFJJQ0VESVNDCQk9IFBSRcOHT0RFU0MJCQkjIwlEZXZvbHZlIG8gcHJlw6dvIHBvciDigqwgMTAwIGRvIHZhbG9yIG5vbWluYWwgZGUgdW0gdMOtdHVsbyBkZXNjb250YWRvDQpQUklDRU1BVAkJPSBQUkXDh09WRU5DCQkJIyMJRGV2b2x2ZSBvIHByZcOnbyBwb3Ig4oKsIDEwMCBkbyB2YWxvciBub21pbmFsIGRlIHVtIHTDrXR1bG8gcXVlIHBhZ2EganVyb3Mgbm8gdmVuY2ltZW50bw0KUFYJCQk9IFZBCQkJCSMjCURldm9sdmUgbyB2YWxvciBhY3R1YWwgZGUgdW0gaW52ZXN0aW1lbnRvDQpSQVRFCQkJPSBUQVhBCQkJCSMjCURldm9sdmUgYSB0YXhhIGRlIGp1cm9zIHBvciBwZXLDrW9kbyBkZSB1bWEgYW51aWRhZGUNClJFQ0VJVkVECQk9IFJFQ0VCRVIJCQkjIwlEZXZvbHZlIG8gbW9udGFudGUgcmVjZWJpZG8gbm8gdmVuY2ltZW50byBkZSB1bSB0w610dWxvIGludmVzdGlkbyBuYSB0b3RhbGlkYWRlDQpTTE4JCQk9IEFNT1JUCQkJCSMjCURldm9sdmUgdW1hIGRlcHJlY2lhw6fDo28gbGluZWFyIGRlIHVtIGFjdGl2byBkdXJhbnRlIHVtIHBlcsOtb2RvDQpTWUQJCQk9IEFNT1JURAkJCSMjCURldm9sdmUgYSBkZXByZWNpYcOnw6NvIHBvciBhbGdhcmlzbW9zIGRhIHNvbWEgZG9zIGFub3MgZGUgdW0gYWN0aXZvIGR1cmFudGUgdW0gcGVyw61vZG8gZXNwZWNpZmljYWRvDQpUQklMTEVRCQkJPSBPVE4JCQkJIyMJRGV2b2x2ZSBvIGx1Y3JvIGRlIHVtIHTDrXR1bG8gZXF1aXZhbGVudGUgYSB1bWEgT2JyaWdhw6fDo28gZG8gVGVzb3Vybw0KVEJJTExQUklDRQkJPSBPVE5WQUxPUgkJCSMjCURldm9sdmUgbyBwcmXDp28gcG9yIOKCrCAxMDAgZGUgdmFsb3Igbm9taW5hbCBkZSB1bWEgT2JyaWdhw6fDo28gZG8gVGVzb3Vybw0KVEJJTExZSUVMRAkJPSBPVE5MVUNSTwkJCSMjCURldm9sdmUgbyBsdWNybyBkZSB1bWEgT2JyaWdhw6fDo28gZG8gVGVzb3Vybw0KVkRCCQkJPSBCRFYJCQkJIyMJRGV2b2x2ZSBhIGRlcHJlY2lhw6fDo28gZGUgdW0gYWN0aXZvIHJlbGF0aXZvIGEgdW0gcGVyw61vZG8gZXNwZWPDrWZpY28gb3UgcGFyY2lhbCB1dGlsaXphbmRvIHVtIG3DqXRvZG8gZGUgcXVvdGFzIGRlZ3Jlc3NpdmFzDQpYSVJSCQkJPSBYVElSCQkJCSMjCURldm9sdmUgYSB0YXhhIGludGVybmEgZGUgcmVudGFiaWxpZGFkZSBkZSB1bSBwbGFubyBkZSBmbHV4b3MgbW9uZXTDoXJpb3MgcXVlIG7Do28gc2VqYSBuZWNlc3NhcmlhbWVudGUgcGVyacOzZGljYQ0KWE5QVgkJCT0gWFZBTAkJCQkjIwlEZXZvbHZlIG8gdmFsb3IgYWN0dWFsIGzDrXF1aWRvIGRlIHVtIHBsYW5vIGRlIGZsdXhvcyBtb25ldMOhcmlvcyBxdWUgbsOjbyBzZWphIG5lY2Vzc2FyaWFtZW50ZSBwZXJpw7NkaWNvDQpZSUVMRAkJCT0gTFVDUk8JCQkJIyMJRGV2b2x2ZSBvIGx1Y3JvIGRlIHVtIHTDrXR1bG8gcXVlIHBhZ2EganVyb3MgcGVyacOzZGljb3MNCllJRUxERElTQwkJPSBMVUNST0RFU0MJCQkjIwlEZXZvbHZlIG8gbHVjcm8gYW51YWwgZGUgdW0gdMOtdHVsbyBlbWl0aWRvIGFiYWl4byBkbyB2YWxvciBub21pbmFsLCBwb3IgZXhlbXBsbywgdW1hIE9icmlnYcOnw6NvIGRvIFRlc291cm8NCllJRUxETUFUCQk9IExVQ1JPVkVOQwkJCSMjCURldm9sdmUgbyBsdWNybyBhbnVhbCBkZSB1bSB0w610dWxvIHF1ZSBwYWdhIGp1cm9zIG5hIGRhdGEgZGUgdmVuY2ltZW50bw0KDQoNCiMjDQojIwlJbmZvcm1hdGlvbiBmdW5jdGlvbnMJCQkJRnVuw6fDtWVzIGRlIGluZm9ybWHDp8Ojbw0KIyMNCkNFTEwJCQk9IEPDiUwJCQkJIyMJRGV2b2x2ZSBpbmZvcm1hw6fDtWVzIHNvYnJlIGEgZm9ybWF0YcOnw6NvLCBsb2NhbGl6YcOnw6NvIG91IGNvbnRlw7pkbyBkZSB1bWEgY8OpbHVsYQ0KRVJST1IuVFlQRQkJPSBUSVBPLkVSUk8JCQkjIwlEZXZvbHZlIHVtIG7Dum1lcm8gY29ycmVzcG9uZGVudGUgYSB1bSB0aXBvIGRlIGVycm8NCklORk8JCQk9IElORk9STUHDh8ODTwkJCSMjCURldm9sdmUgaW5mb3JtYcOnw7VlcyBzb2JyZSBvIGFtYmllbnRlIGRlIGZ1bmNpb25hbWVudG8gYWN0dWFsDQpJU0JMQU5LCQkJPSDDiS5Dw4lMLlZBWklBCQkJIyMJRGV2b2x2ZSBWRVJEQURFSVJPIHNlIG8gdmFsb3IgZXN0aXZlciBlbSBicmFuY28NCklTRVJSCQkJPSDDiS5FUlJPUwkJCSMjCURldm9sdmUgVkVSREFERUlSTyBzZSBvIHZhbG9yIGZvciB1bSB2YWxvciBkZSBlcnJvIGRpZmVyZW50ZSBkZSAjTi9EDQpJU0VSUk9SCQkJPSDDiS5FUlJPCQkJIyMJRGV2b2x2ZSBWRVJEQURFSVJPIHNlIG8gdmFsb3IgZm9yIHVtIHZhbG9yIGRlIGVycm8NCklTRVZFTgkJCT0gw4lQQVIJCQkJIyMJRGV2b2x2ZSBWRVJEQURFSVJPIHNlIG8gbsO6bWVybyBmb3IgcGFyDQpJU0xPR0lDQUwJCT0gw4kuTMOTR0lDTwkJCSMjCURldm9sdmUgVkVSREFERUlSTyBzZSBvIHZhbG9yIGZvciBsw7NnaWNvDQpJU05BCQkJPSDDiS5Ow4NPLkRJU1AJCQkjIwlEZXZvbHZlIFZFUkRBREVJUk8gc2UgbyB2YWxvciBmb3IgbyB2YWxvciBkZSBlcnJvICNOL0QNCklTTk9OVEVYVAkJPSDDiS5Ow4NPLlRFWFRPCQkJIyMJRGV2b2x2ZSBWRVJEQURFSVJPIHNlIG8gdmFsb3IgbsOjbyBmb3IgdGV4dG8NCklTTlVNQkVSCQk9IMOJLk7Dmk0JCQkJIyMJRGV2b2x2ZSBWRVJEQURFSVJPIHNlIG8gdmFsb3IgZm9yIHVtIG7Dum1lcm8NCklTT0RECQkJPSDDicONTVBBUgkJCSMjCURldm9sdmUgVkVSREFERUlSTyBzZSBvIG7Dum1lcm8gZm9yIMOtbXBhcg0KSVNSRUYJCQk9IMOJLlJFRgkJCQkjIwlEZXZvbHZlIFZFUkRBREVJUk8gc2UgbyB2YWxvciBmb3IgdW1hIHJlZmVyw6puY2lhDQpJU1RFWFQJCQk9IMOJLlRFWFRPCQkJIyMJRGV2b2x2ZSBWRVJEQURFSVJPIHNlIG8gdmFsb3IgZm9yIHRleHRvDQpOCQkJPSBOCQkJCSMjCURldm9sdmUgdW0gdmFsb3IgY29udmVydGlkbyBudW0gbsO6bWVybw0KTkEJCQk9IE7Dg08uRElTUAkJCSMjCURldm9sdmUgbyB2YWxvciBkZSBlcnJvICNOL0QNClRZUEUJCQk9IFRJUE8JCQkJIyMJRGV2b2x2ZSB1bSBuw7ptZXJvIHF1ZSBpbmRpY2EgbyB0aXBvIGRlIGRhZG9zIGRlIHVtIHZhbG9yDQoNCg0KIyMNCiMjCUxvZ2ljYWwgZnVuY3Rpb25zCQkJCUZ1bsOnw7VlcyBsw7NnaWNhcw0KIyMNCkFORAkJCT0gRQkJCQkjIwlEZXZvbHZlIFZFUkRBREVJUk8gc2UgdG9kb3Mgb3MgcmVzcGVjdGl2b3MgYXJndW1lbnRvcyBjb3JyZXNwb25kZXJlbSBhIFZFUkRBREVJUk8NCkZBTFNFCQkJPSBGQUxTTwkJCQkjIwlEZXZvbHZlIG8gdmFsb3IgbMOzZ2ljbyBGQUxTTw0KSUYJCQk9IFNFCQkJCSMjCUVzcGVjaWZpY2EgdW0gdGVzdGUgbMOzZ2ljbyBhIHNlciBleGVjdXRhZG8NCklGRVJST1IJCQk9IFNFLkVSUk8JCQkjIwlEZXZvbHZlIHVtIHZhbG9yIGRlZmluaWRvIHBlbG8gdXRpbGl6YWRvciBzZSBvY29ycmVyIHVtIGVycm8gbmEgZsOzcm11bGEsIGUgZGV2b2x2ZSBvIHJlc3VsdGFkbyBkYSBmw7NybXVsYSBzZSBuw6NvIG9jb3JyZXIgbmVuaHVtIGVycm8NCk5PVAkJCT0gTsODTwkJCQkjIwlJbnZlcnRlIGEgbMOzZ2ljYSBkbyByZXNwZWN0aXZvIGFyZ3VtZW50bw0KT1IJCQk9IE9VCQkJCSMjCURldm9sdmUgVkVSREFERUlSTyBzZSBxdWFscXVlciBhcmd1bWVudG8gZm9yIFZFUkRBREVJUk8NClRSVUUJCQk9IFZFUkRBREVJUk8JCQkjIwlEZXZvbHZlIG8gdmFsb3IgbMOzZ2ljbyBWRVJEQURFSVJPDQoNCg0KIyMNCiMjCUxvb2t1cCBhbmQgcmVmZXJlbmNlIGZ1bmN0aW9ucwkJCUZ1bsOnw7VlcyBkZSBwZXNxdWlzYSBlIHJlZmVyw6puY2lhDQojIw0KQUREUkVTUwkJCT0gRU5ERVJFw4dPCQkJIyMJRGV2b2x2ZSB1bWEgcmVmZXLDqm5jaWEgYSB1bWEgw7puaWNhIGPDqWx1bGEgbnVtYSBmb2xoYSBkZSBjw6FsY3VsbyBjb21vIHRleHRvDQpBUkVBUwkJCT0gw4FSRUFTCQkJCSMjCURldm9sdmUgbyBuw7ptZXJvIGRlIMOhcmVhcyBudW1hIHJlZmVyw6puY2lhDQpDSE9PU0UJCQk9IFNFTEVDQ0lPTkFSCQkJIyMJU2VsZWNjaW9uYSB1bSB2YWxvciBhIHBhcnRpciBkZSB1bWEgbGlzdGEgZGUgdmFsb3Jlcw0KQ09MVU1OCQkJPSBDT0wJCQkJIyMJRGV2b2x2ZSBvIG7Dum1lcm8gZGEgY29sdW5hIGRlIHVtYSByZWZlcsOqbmNpYQ0KQ09MVU1OUwkJCT0gQ09MUwkJCQkjIwlEZXZvbHZlIG8gbsO6bWVybyBkZSBjb2x1bmFzIG51bWEgcmVmZXLDqm5jaWENCkhMT09LVVAJCQk9IFBST0NICQkJCSMjCVByb2N1cmEgbmEgbGluaGEgc3VwZXJpb3IgZGUgdW1hIG1hdHJpeiBlIGRldm9sdmUgbyB2YWxvciBkYSBjw6lsdWxhIGluZGljYWRhDQpIWVBFUkxJTksJCT0gSElQRVJMSUdBw4fDg08JCQkjIwlDcmlhIHVtIGF0YWxobyBvdSBoaXBlcmxpZ2HDp8OjbyBxdWUgYWJyZSB1bSBkb2N1bWVudG8gYXJtYXplbmFkbyBudW0gc2Vydmlkb3IgZGUgcmVkZSwgbnVtYSBpbnRyYW5ldCBvdSBuYSBJbnRlcm5ldA0KSU5ERVgJCQk9IMONTkRJQ0UJCQkjIwlVdGlsaXphIHVtIMOtbmRpY2UgcGFyYSBlc2NvbGhlciB1bSB2YWxvciBkZSB1bWEgcmVmZXLDqm5jaWEgb3UgZGUgdW1hIG1hdHJpeg0KSU5ESVJFQ1QJCT0gSU5ESVJFQ1RPCQkJIyMJRGV2b2x2ZSB1bWEgcmVmZXLDqm5jaWEgaW5kaWNhZGEgcG9yIHVtIHZhbG9yIGRlIHRleHRvDQpMT09LVVAJCQk9IFBST0MJCQkJIyMJUHJvY3VyYSB2YWxvcmVzIG51bSB2ZWN0b3Igb3UgbnVtYSBtYXRyaXoNCk1BVENICQkJPSBDT1JSRVNQCQkJIyMJUHJvY3VyYSB2YWxvcmVzIG51bWEgcmVmZXLDqm5jaWEgb3UgbnVtYSBtYXRyaXoNCk9GRlNFVAkJCT0gREVTTE9DQU1FTlRPCQkJIyMJRGV2b2x2ZSBvIGRlc2xvY2FtZW50byBkZSByZWZlcsOqbmNpYSBkZSB1bWEgZGV0ZXJtaW5hZGEgcmVmZXLDqm5jaWENClJPVwkJCT0gTElOCQkJCSMjCURldm9sdmUgbyBuw7ptZXJvIGRhIGxpbmhhIGRlIHVtYSByZWZlcsOqbmNpYQ0KUk9XUwkJCT0gTElOUwkJCQkjIwlEZXZvbHZlIG8gbsO6bWVybyBkZSBsaW5oYXMgbnVtYSByZWZlcsOqbmNpYQ0KUlRECQkJPSBSVEQJCQkJIyMJT2J0w6ltIGRhZG9zIGVtIHRlbXBvIHJlYWwgYSBwYXJ0aXIgZGUgdW0gcHJvZ3JhbWEgcXVlIHN1cG9ydGUgYXV0b21hdGl6YcOnw6NvIENPTSAoYXV0b21hdGl6YcOnw6NvOiBtb2RvIGRlIHRyYWJhbGhhciBjb20gb2JqZWN0b3MgZGUgdW1hIGFwbGljYcOnw6NvIGEgcGFydGlyIGRlIG91dHJhIGFwbGljYcOnw6NvIG91IGZlcnJhbWVudGEgZGUgZGVzZW52b2x2aW1lbnRvLiBBbnRlcmlvcm1lbnRlIGNvbmhlY2lkYSBjb21vIGF1dG9tYXRpemHDp8OjbyBPTEUsIGEgYXV0b21hdGl6YcOnw6NvIMOpIHVtYSBub3JtYSBkYSBpbmTDunN0cmlhIGRlIHNvZnR3YXJlIGUgdW1hIGZ1bmNpb25hbGlkYWRlIENPTSAoQ29tcG9uZW50IE9iamVjdCBNb2RlbCkuKQ0KVFJBTlNQT1NFCQk9IFRSQU5TUE9SCQkJIyMJRGV2b2x2ZSBhIHRyYW5zcG9zacOnw6NvIGRlIHVtYSBtYXRyaXoNClZMT09LVVAJCQk9IFBST0NWCQkJCSMjCVByb2N1cmEgbmEgcHJpbWVpcmEgY29sdW5hIGRlIHVtYSBtYXRyaXogZSBwZXJjb3JyZSBhIGxpbmhhIHBhcmEgZGV2b2x2ZXIgbyB2YWxvciBkZSB1bWEgY8OpbHVsYQ0KDQoNCiMjDQojIwlNYXRoIGFuZCB0cmlnb25vbWV0cnkgZnVuY3Rpb25zCQkJRnVuw6fDtWVzIG1hdGVtw6F0aWNhcyBlIHRyaWdvbm9tw6l0cmljYXMNCiMjDQpBQlMJCQk9IEFCUwkJCQkjIwlEZXZvbHZlIG8gdmFsb3IgYWJzb2x1dG8gZGUgdW0gbsO6bWVybw0KQUNPUwkJCT0gQUNPUwkJCQkjIwlEZXZvbHZlIG8gYXJjbyBkZSBjby1zZW5vIGRlIHVtIG7Dum1lcm8NCkFDT1NICQkJPSBBQ09TSAkJCQkjIwlEZXZvbHZlIG8gY28tc2VubyBoaXBlcmLDs2xpY28gaW52ZXJzbyBkZSB1bSBuw7ptZXJvDQpBU0lOCQkJPSBBU0VOCQkJCSMjCURldm9sdmUgbyBhcmNvIGRlIHNlbm8gZGUgdW0gbsO6bWVybw0KQVNJTkgJCQk9IEFTRU5ICQkJCSMjCURldm9sdmUgbyBzZW5vIGhpcGVyYsOzbGljbyBpbnZlcnNvIGRlIHVtIG7Dum1lcm8NCkFUQU4JCQk9IEFUQU4JCQkJIyMJRGV2b2x2ZSBvIGFyY28gZGUgdGFuZ2VudGUgZGUgdW0gbsO6bWVybw0KQVRBTjIJCQk9IEFUQU4yCQkJCSMjCURldm9sdmUgbyBhcmNvIGRlIHRhbmdlbnRlIGRhcyBjb29yZGVuYWRhcyB4IGUgeQ0KQVRBTkgJCQk9IEFUQU5ICQkJCSMjCURldm9sdmUgYSB0YW5nZW50ZSBoaXBlcmLDs2xpY2EgaW52ZXJzYSBkZSB1bSBuw7ptZXJvDQpDRUlMSU5HCQkJPSBBUlJFRC5FWENFU1NPCQkJIyMJQXJyZWRvbmRhIHVtIG7Dum1lcm8gcGFyYSBvIG7Dum1lcm8gaW50ZWlybyBtYWlzIHByw7N4aW1vIG91IHBhcmEgbyBtw7psdGlwbG8gZGUgc2lnbmlmaWPDom5jaWEgbWFpcyBwcsOzeGltbw0KQ09NQklOCQkJPSBDT01CSU4JCQkjIwlEZXZvbHZlIG8gbsO6bWVybyBkZSBjb21iaW5hw6fDtWVzIGRlIHVtIGRldGVybWluYWRvIG7Dum1lcm8gZGUgb2JqZWN0b3MNCkNPUwkJCT0gQ09TCQkJCSMjCURldm9sdmUgbyBjby1zZW5vIGRlIHVtIG7Dum1lcm8NCkNPU0gJCQk9IENPU0gJCQkJIyMJRGV2b2x2ZSBvIGNvLXNlbm8gaGlwZXJiw7NsaWNvIGRlIHVtIG7Dum1lcm8NCkRFR1JFRVMJCQk9IEdSQVVTCQkJCSMjCUNvbnZlcnRlIHJhZGlhbm9zIGVtIGdyYXVzDQpFVkVOCQkJPSBQQVIJCQkJIyMJQXJyZWRvbmRhIHVtIG7Dum1lcm8gcG9yIGV4Y2Vzc28gcGFyYSBvIG7Dum1lcm8gaW50ZWlybyBtYWlzIHByw7N4aW1vDQpFWFAJCQk9IEVYUAkJCQkjIwlEZXZvbHZlIGUgZWxldmFkbyDDoCBwb3TDqm5jaWEgZGUgdW0gZGV0ZXJtaW5hZG8gbsO6bWVybw0KRkFDVAkJCT0gRkFDVE9SSUFMCQkJIyMJRGV2b2x2ZSBvIGZhY3RvcmlhbCBkZSB1bSBuw7ptZXJvDQpGQUNURE9VQkxFCQk9IEZBQ1REVVBMTwkJCSMjCURldm9sdmUgbyBmYWN0b3JpYWwgZHVwbG8gZGUgdW0gbsO6bWVybw0KRkxPT1IJCQk9IEFSUkVELkRFRkVJVE8JCQkjIwlBcnJlZG9uZGEgdW0gbsO6bWVybyBwb3IgZGVmZWl0byBhdMOpIHplcm8NCkdDRAkJCT0gTURDCQkJCSMjCURldm9sdmUgbyBtYWlvciBkaXZpc29yIGNvbXVtDQpJTlQJCQk9IElOVAkJCQkjIwlBcnJlZG9uZGEgdW0gbsO6bWVybyBwb3IgZGVmZWl0byBwYXJhIG8gbsO6bWVybyBpbnRlaXJvIG1haXMgcHLDs3hpbW8NCkxDTQkJCT0gTU1DCQkJCSMjCURldm9sdmUgbyBtw61uaW1vIG3Dumx0aXBsbyBjb211bQ0KTE4JCQk9IExOCQkJCSMjCURldm9sdmUgbyBsb2dhcml0bW8gbmF0dXJhbCBkZSB1bSBuw7ptZXJvDQpMT0cJCQk9IExPRwkJCQkjIwlEZXZvbHZlIG8gbG9nYXJpdG1vIGRlIHVtIG7Dum1lcm8gY29tIHVtYSBiYXNlIGVzcGVjaWZpY2FkYQ0KTE9HMTAJCQk9IExPRzEwCQkJCSMjCURldm9sdmUgbyBsb2dhcml0bW8gZGUgYmFzZSAxMCBkZSB1bSBuw7ptZXJvDQpNREVURVJNCQkJPSBNQVRSSVouREVURVJNCQkJIyMJRGV2b2x2ZSBvIGRldGVybWluYW50ZSBtYXRyaWNpYWwgZGUgdW1hIG1hdHJpeg0KTUlOVkVSU0UJCT0gTUFUUklaLklOVkVSU0EJCSMjCURldm9sdmUgbyBpbnZlcnNvIG1hdHJpY2lhbCBkZSB1bWEgbWF0cml6DQpNTVVMVAkJCT0gTUFUUklaLk1VTFQJCQkjIwlEZXZvbHZlIG8gcHJvZHV0byBtYXRyaWNpYWwgZGUgZHVhcyBtYXRyaXplcw0KTU9ECQkJPSBSRVNUTwkJCQkjIwlEZXZvbHZlIG8gcmVzdG8gZGEgZGl2aXPDo28NCk1ST1VORAkJCT0gTUFSUkVECQkJIyMJRGV2b2x2ZSB1bSBuw7ptZXJvIGFycmVkb25kYWRvIHBhcmEgbyBtw7psdGlwbG8gcHJldGVuZGlkbw0KTVVMVElOT01JQUwJCT0gUE9MSU5PTUlBTAkJCSMjCURldm9sdmUgbyBwb2xpbm9taWFsIGRlIHVtIGNvbmp1bnRvIGRlIG7Dum1lcm9zDQpPREQJCQk9IMONTVBBUgkJCQkjIwlBcnJlZG9uZGEgcG9yIGV4Y2Vzc28gdW0gbsO6bWVybyBwYXJhIG8gbsO6bWVybyBpbnRlaXJvIMOtbXBhciBtYWlzIHByw7N4aW1vDQpQSQkJCT0gUEkJCQkJIyMJRGV2b2x2ZSBvIHZhbG9yIGRlIHBpDQpQT1dFUgkJCT0gUE9Uw4pOQ0lBCQkJIyMJRGV2b2x2ZSBvIHJlc3VsdGFkbyBkZSB1bSBuw7ptZXJvIGVsZXZhZG8gYSB1bWEgcG90w6puY2lhDQpQUk9EVUNUCQkJPSBQUk9EVVRPCQkJIyMJTXVsdGlwbGljYSBvcyByZXNwZWN0aXZvcyBhcmd1bWVudG9zDQpRVU9USUVOVAkJPSBRVU9DSUVOVEUJCQkjIwlEZXZvbHZlIGEgcGFydGUgaW50ZWlyYSBkZSB1bWEgZGl2aXPDo28NClJBRElBTlMJCQk9IFJBRElBTk9TCQkJIyMJQ29udmVydGUgZ3JhdXMgZW0gcmFkaWFub3MNClJBTkQJCQk9IEFMRUFUw5NSSU8JCQkjIwlEZXZvbHZlIHVtIG7Dum1lcm8gYWxlYXTDs3JpbyBlbnRyZSAwIGUgMQ0KUkFOREJFVFdFRU4JCT0gQUxFQVTDk1JJT0VOVFJFCQkjIwlEZXZvbHZlIHVtIG7Dum1lcm8gYWxlYXTDs3JpbyBlbnRyZSBvcyBuw7ptZXJvcyBlc3BlY2lmaWNhZG9zDQpST01BTgkJCT0gUk9NQU5PCQkJIyMJQ29udmVydGUgdW0gbsO6bWVybyDDoXJhYmUgZW0gcm9tYW5vLCBjb21vIHRleHRvDQpST1VORAkJCT0gQVJSRUQJCQkJIyMJQXJyZWRvbmRhIHVtIG7Dum1lcm8gcGFyYSB1bSBuw7ptZXJvIGRlIGTDrWdpdG9zIGVzcGVjaWZpY2Fkbw0KUk9VTkRET1dOCQk9IEFSUkVELlBBUkEuQkFJWE8JCSMjCUFycmVkb25kYSB1bSBuw7ptZXJvIHBvciBkZWZlaXRvIGF0w6kgemVybw0KUk9VTkRVUAkJCT0gQVJSRUQuUEFSQS5DSU1BCQkjIwlBcnJlZG9uZGEgdW0gbsO6bWVybyBwb3IgZXhjZXNzbywgYWZhc3RhbmRvLW8gZGUgemVybw0KU0VSSUVTU1VNCQk9IFNPTUFTw4lSSUUJCQkjIwlEZXZvbHZlIGEgc29tYSBkZSB1bWEgc8OpcmllIGRlIHBvdMOqbmNpYXMgYmFzZWFkYSBuYSBmw7NybXVsYQ0KU0lHTgkJCT0gU0lOQUwJCQkJIyMJRGV2b2x2ZSBvIHNpbmFsIGRlIHVtIG7Dum1lcm8NClNJTgkJCT0gU0VOCQkJCSMjCURldm9sdmUgbyBzZW5vIGRlIHVtIGRldGVybWluYWRvIMOibmd1bG8NClNJTkgJCQk9IFNFTkgJCQkJIyMJRGV2b2x2ZSBvIHNlbm8gaGlwZXJiw7NsaWNvIGRlIHVtIG7Dum1lcm8NClNRUlQJCQk9IFJBSVpRCQkJCSMjCURldm9sdmUgdW1hIHJhaXogcXVhZHJhZGEgcG9zaXRpdmENClNRUlRQSQkJCT0gUkFJWlBJCQkJIyMJRGV2b2x2ZSBhIHJhaXogcXVhZHJhZGEgZGUgKG7Dum0gKiBwaSkNClNVQlRPVEFMCQk9IFNVQlRPVEFMCQkJIyMJRGV2b2x2ZSB1bSBzdWJ0b3RhbCBudW1hIGxpc3RhIG91IGJhc2UgZGUgZGFkb3MNClNVTQkJCT0gU09NQQkJCQkjIwlBZGljaW9uYSBvcyByZXNwZWN0aXZvcyBhcmd1bWVudG9zDQpTVU1JRgkJCT0gU09NQS5TRQkJCSMjCUFkaWNpb25hIGFzIGPDqWx1bGFzIGVzcGVjaWZpY2FkYXMgcG9yIHVtIGRldGVybWluYWRvIGNyaXTDqXJpbw0KU1VNSUZTCQkJPSBTT01BLlNFLlMJCQkjIwlBZGljaW9uYSBhcyBjw6lsdWxhcyBudW0gaW50ZXJ2YWxvIHF1ZSBjdW1wcmUgdsOhcmlvcyBjcml0w6lyaW9zDQpTVU1QUk9EVUNUCQk9IFNPTUFSUFJPRFVUTwkJCSMjCURldm9sdmUgYSBzb21hIGRvcyBwcm9kdXRvcyBkZSBjb21wb25lbnRlcyBkZSBtYXRyaXplcyBjb3JyZXNwb25kZW50ZXMNClNVTVNRCQkJPSBTT01BUlFVQUQJCQkjIwlEZXZvbHZlIGEgc29tYSBkb3MgcXVhZHJhZG9zIGRvcyBhcmd1bWVudG9zDQpTVU1YMk1ZMgkJPSBTT01BWDJEWTIJCQkjIwlEZXZvbHZlIGEgc29tYSBkYSBkaWZlcmVuw6dhIGRvcyBxdWFkcmFkb3MgZG9zIHZhbG9yZXMgY29ycmVzcG9uZGVudGVzIGVtIGR1YXMgbWF0cml6ZXMNClNVTVgyUFkyCQk9IFNPTUFYMlNZMgkJCSMjCURldm9sdmUgYSBzb21hIGRhIHNvbWEgZG9zIHF1YWRyYWRvcyBkb3MgdmFsb3JlcyBjb3JyZXNwb25kZW50ZXMgZW0gZHVhcyBtYXRyaXplcw0KU1VNWE1ZMgkJCT0gU09NQVhNWTIJCQkjIwlEZXZvbHZlIGEgc29tYSBkb3MgcXVhZHJhZG9zIGRhIGRpZmVyZW7Dp2EgZG9zIHZhbG9yZXMgY29ycmVzcG9uZGVudGVzIGVtIGR1YXMgbWF0cml6ZXMNClRBTgkJCT0gVEFOCQkJCSMjCURldm9sdmUgYSB0YW5nZW50ZSBkZSB1bSBuw7ptZXJvDQpUQU5ICQkJPSBUQU5ICQkJCSMjCURldm9sdmUgYSB0YW5nZW50ZSBoaXBlcmLDs2xpY2EgZGUgdW0gbsO6bWVybw0KVFJVTkMJCQk9IFRSVU5DQVIJCQkjIwlUcnVuY2EgdW0gbsO6bWVybyBwYXJhIHVtIG7Dum1lcm8gaW50ZWlybw0KDQoNCiMjDQojIwlTdGF0aXN0aWNhbCBmdW5jdGlvbnMJCQkJRnVuw6fDtWVzIGVzdGF0w61zdGljYXMNCiMjDQpBVkVERVYJCQk9IERFU1YuTcOJRElPCQkJIyMJRGV2b2x2ZSBhIG3DqWRpYSBhcml0bcOpdGljYSBkb3MgZGVzdmlvcyBhYnNvbHV0b3Mgw6AgbcOpZGlhIGRvcyBwb250b3MgZGUgZGFkb3MNCkFWRVJBR0UJCQk9IE3DiURJQQkJCQkjIwlEZXZvbHZlIGEgbcOpZGlhIGRvcyByZXNwZWN0aXZvcyBhcmd1bWVudG9zDQpBVkVSQUdFQQkJPSBNw4lESUFBCQkJIyMJRGV2b2x2ZSB1bWEgbcOpZGlhIGRvcyByZXNwZWN0aXZvcyBhcmd1bWVudG9zLCBpbmNsdWluZG8gbsO6bWVyb3MsIHRleHRvIGUgdmFsb3JlcyBsw7NnaWNvcw0KQVZFUkFHRUlGCQk9IE3DiURJQS5TRQkJCSMjCURldm9sdmUgYSBtw6lkaWEgYXJpdG3DqXRpY2EgZGUgdG9kYXMgYXMgY8OpbHVsYXMgbnVtIGludGVydmFsbyBxdWUgY3VtcHJlbSBkZXRlcm1pbmFkbyBjcml0w6lyaW8NCkFWRVJBR0VJRlMJCT0gTcOJRElBLlNFLlMJCQkjIwlEZXZvbHZlIGEgbcOpZGlhIGFyaXRtw6l0aWNhIGRlIHRvZGFzIGFzIGPDqWx1bGFzIHF1ZSBjdW1wcmVtIG3Dumx0aXBsb3MgY3JpdMOpcmlvcw0KQkVUQURJU1QJCT0gRElTVEJFVEEJCQkjIwlEZXZvbHZlIGEgZnVuw6fDo28gZGUgZGlzdHJpYnVpw6fDo28gY3VtdWxhdGl2YSBiZXRhDQpCRVRBSU5WCQkJPSBCRVRBLkFDVU0uSU5WCQkJIyMJRGV2b2x2ZSBvIGludmVyc28gZGEgZnVuw6fDo28gZGUgZGlzdHJpYnVpw6fDo28gY3VtdWxhdGl2YSByZWxhdGl2YW1lbnRlIGEgdW1hIGRpc3RyaWJ1acOnw6NvIGJldGEgZXNwZWPDrWZpY2ENCkJJTk9NRElTVAkJPSBESVNUUkJJTk9NCQkJIyMJRGV2b2x2ZSBhIHByb2JhYmlsaWRhZGUgZGUgZGlzdHJpYnVpw6fDo28gYmlub21pYWwgZGUgdGVybW8gaW5kaXZpZHVhbA0KQ0hJRElTVAkJCT0gRElTVC5DSEkJCQkjIwlEZXZvbHZlIGEgcHJvYmFiaWxpZGFkZSB1bmljYXVkYWwgZGEgZGlzdHJpYnVpw6fDo28gcXVpLXF1YWRyYWRhDQpDSElJTlYJCQk9IElOVi5DSEkJCQkjIwlEZXZvbHZlIG8gaW52ZXJzbyBkYSBwcm9iYWJpbGlkYWRlIHVuaWNhdWRhbCBkYSBkaXN0cmlidWnDp8OjbyBxdWktcXVhZHJhZGENCkNISVRFU1QJCQk9IFRFU1RFLkNISQkJCSMjCURldm9sdmUgbyB0ZXN0ZSBwYXJhIGluZGVwZW5kw6puY2lhDQpDT05GSURFTkNFCQk9IElOVC5DT05GSUFOw4dBCQkJIyMJRGV2b2x2ZSBvIGludGVydmFsbyBkZSBjb25maWFuw6dhIGNvcnJlc3BvbmRlbnRlIGEgdW1hIG3DqWRpYSBkZSBwb3B1bGHDp8Ojbw0KQ09SUkVMCQkJPSBDT1JSRUwJCQkjIwlEZXZvbHZlIG8gY29lZmljaWVudGUgZGUgY29ycmVsYcOnw6NvIGVudHJlIGRvaXMgY29uanVudG9zIGRlIGRhZG9zDQpDT1VOVAkJCT0gQ09OVEFSCQkJIyMJQ29udGEgb3MgbsO6bWVyb3MgcXVlIGV4aXN0ZW0gbmEgbGlzdGEgZGUgYXJndW1lbnRvcw0KQ09VTlRBCQkJPSBDT05UQVIuVkFMCQkJIyMJQ29udGEgb3MgdmFsb3JlcyBxdWUgZXhpc3RlbSBuYSBsaXN0YSBkZSBhcmd1bWVudG9zDQpDT1VOVEJMQU5LCQk9IENPTlRBUi5WQVpJTwkJCSMjCUNvbnRhIG8gbsO6bWVybyBkZSBjw6lsdWxhcyBlbSBicmFuY28gbnVtIGludGVydmFsbw0KQ09VTlRJRgkJCT0gQ09OVEFSLlNFCQkJIyMJQ2FsY3VsYSBvIG7Dum1lcm8gZGUgY8OpbHVsYXMgbnVtIGludGVydmFsbyBxdWUgY29ycmVzcG9uZGUgYW9zIGNyaXTDqXJpb3MgZGV0ZXJtaW5hZG9zDQpDT1VOVElGUwkJPSBDT05UQVIuU0UuUwkJCSMjCUNvbnRhIG8gbsO6bWVybyBkZSBjw6lsdWxhcyBudW0gaW50ZXJ2YWxvIHF1ZSBjdW1wcmVtIG3Dumx0aXBsb3MgY3JpdMOpcmlvcw0KQ09WQVIJCQk9IENPVkFSCQkJCSMjCURldm9sdmUgYSBjb3ZhcmnDom5jaWEsIHF1ZSDDqSBhIG3DqWRpYSBkb3MgcHJvZHV0b3MgZGUgZGVzdmlvcyBkZSBwYXJlcw0KQ1JJVEJJTk9NCQk9IENSSVQuQklOT00JCQkjIwlEZXZvbHZlIG8gbWVub3IgdmFsb3IgZW0gcXVlIGEgZGlzdHJpYnVpw6fDo28gYmlub21pYWwgY3VtdWxhdGl2YSDDqSBpbmZlcmlvciBvdSBpZ3VhbCBhIHVtIHZhbG9yIGRlIGNyaXTDqXJpbw0KREVWU1EJCQk9IERFU1ZRCQkJCSMjCURldm9sdmUgYSBzb21hIGRvcyBxdWFkcmFkb3MgZG9zIGRlc3Zpb3MNCkVYUE9ORElTVAkJPSBESVNURVhQT04JCQkjIwlEZXZvbHZlIGEgZGlzdHJpYnVpw6fDo28gZXhwb25lbmNpYWwNCkZESVNUCQkJPSBESVNURgkJCQkjIwlEZXZvbHZlIGEgZGlzdHJpYnVpw6fDo28gZGEgcHJvYmFiaWxpZGFkZSBGDQpGSU5WCQkJPSBJTlZGCQkJCSMjCURldm9sdmUgbyBpbnZlcnNvIGRhIGRpc3RyaWJ1acOnw6NvIGRhIHByb2JhYmlsaWRhZGUgRg0KRklTSEVSCQkJPSBGSVNIRVIJCQkjIwlEZXZvbHZlIGEgdHJhbnNmb3JtYcOnw6NvIEZpc2hlcg0KRklTSEVSSU5WCQk9IEZJU0hFUklOVgkJCSMjCURldm9sdmUgbyBpbnZlcnNvIGRhIHRyYW5zZm9ybWHDp8OjbyBGaXNoZXINCkZPUkVDQVNUCQk9IFBSRVZJU8ODTwkJCSMjCURldm9sdmUgdW0gdmFsb3IgYW8gbG9uZ28gZGUgdW1hIHRlbmTDqm5jaWEgbGluZWFyDQpGUkVRVUVOQ1kJCT0gRlJFUVXDik5DSUEJCQkjIwlEZXZvbHZlIHVtYSBkaXN0cmlidWnDp8OjbyBkZSBmcmVxdcOqbmNpYSBjb21vIHVtYSBtYXRyaXogdmVydGljYWwNCkZURVNUCQkJPSBURVNURUYJCQkjIwlEZXZvbHZlIG8gcmVzdWx0YWRvIGRlIHVtIHRlc3RlIEYNCkdBTU1BRElTVAkJPSBESVNUR0FNQQkJCSMjCURldm9sdmUgYSBkaXN0cmlidWnDp8OjbyBnYW1hDQpHQU1NQUlOVgkJPSBJTlZHQU1BCQkJIyMJRGV2b2x2ZSBvIGludmVyc28gZGEgZGlzdHJpYnVpw6fDo28gZ2FtYSBjdW11bGF0aXZhDQpHQU1NQUxOCQkJPSBMTkdBTUEJCQkjIwlEZXZvbHZlIG8gbG9nYXJpdG1vIG5hdHVyYWwgZGEgZnVuw6fDo28gZ2FtYSwgzpMoeCkNCkdFT01FQU4JCQk9IE3DiURJQS5HRU9Nw4lUUklDQQkJIyMJRGV2b2x2ZSBhIG3DqWRpYSBnZW9tw6l0cmljYQ0KR1JPV1RICQkJPSBDUkVTQ0lNRU5UTwkJCSMjCURldm9sdmUgdmFsb3JlcyBhbyBsb25nbyBkZSB1bWEgdGVuZMOqbmNpYSBleHBvbmVuY2lhbA0KSEFSTUVBTgkJCT0gTcOJRElBLkhBUk3Dk05JQ0EJCSMjCURldm9sdmUgYSBtw6lkaWEgaGFybcOzbmljYQ0KSFlQR0VPTURJU1QJCT0gRElTVC5ISVBFUkdFT00JCSMjCURldm9sdmUgYSBkaXN0cmlidWnDp8OjbyBoaXBlcmdlb23DqXRyaWNhDQpJTlRFUkNFUFQJCT0gSU5URVJDRVBUQVIJCQkjIwlEZXZvbHZlIGEgaW50ZXJjZXDDp8OjbyBkYSBsaW5oYSBkZSByZWdyZXNzw6NvIGxpbmVhcg0KS1VSVAkJCT0gQ1VSVAkJCQkjIwlEZXZvbHZlIGEgY3VydG9zZSBkZSB1bSBjb25qdW50byBkZSBkYWRvcw0KTEFSR0UJCQk9IE1BSU9SCQkJCSMjCURldm9sdmUgbyBtYWlvciB2YWxvciBrLcOpc2ltbyBkZSB1bSBjb25qdW50byBkZSBkYWRvcw0KTElORVNUCQkJPSBQUk9KLkxJTgkJCSMjCURldm9sdmUgb3MgcGFyw6JtZXRyb3MgZGUgdW1hIHRlbmTDqm5jaWEgbGluZWFyDQpMT0dFU1QJCQk9IFBST0ouTE9HCQkJIyMJRGV2b2x2ZSBvcyBwYXLDom1ldHJvcyBkZSB1bWEgdGVuZMOqbmNpYSBleHBvbmVuY2lhbA0KTE9HSU5WCQkJPSBJTlZMT0cJCQkjIwlEZXZvbHZlIG8gaW52ZXJzbyBkYSBkaXN0cmlidWnDp8OjbyBub3JtYWwgbG9nYXLDrXRtaWNhDQpMT0dOT1JNRElTVAkJPSBESVNULk5PUk1BTExPRwkJIyMJRGV2b2x2ZSBhIGRpc3RyaWJ1acOnw6NvIG5vcm1hbCBsb2dhcsOtdG1pY2EgY3VtdWxhdGl2YQ0KTUFYCQkJPSBNw4FYSU1PCQkJIyMJRGV2b2x2ZSBvIHZhbG9yIG3DoXhpbW8gbnVtYSBsaXN0YSBkZSBhcmd1bWVudG9zDQpNQVhBCQkJPSBNw4FYSU1PQQkJCSMjCURldm9sdmUgbyB2YWxvciBtw6F4aW1vIG51bWEgbGlzdGEgZGUgYXJndW1lbnRvcywgaW5jbHVpbmRvIG7Dum1lcm9zLCB0ZXh0byBlIHZhbG9yZXMgbMOzZ2ljb3MNCk1FRElBTgkJCT0gTUVECQkJCSMjCURldm9sdmUgYSBtZWRpYW5hIGRvcyBuw7ptZXJvcyBpbmRpY2Fkb3MNCk1JTgkJCT0gTcONTklNTwkJCSMjCURldm9sdmUgbyB2YWxvciBtw61uaW1vIG51bWEgbGlzdGEgZGUgYXJndW1lbnRvcw0KTUlOQQkJCT0gTcONTklNT0EJCQkjIwlEZXZvbHZlIG8gdmFsb3IgbcOtbmltbyBudW1hIGxpc3RhIGRlIGFyZ3VtZW50b3MsIGluY2x1aW5kbyBuw7ptZXJvcywgdGV4dG8gZSB2YWxvcmVzIGzDs2dpY29zDQpNT0RFCQkJPSBNT0RBCQkJCSMjCURldm9sdmUgbyB2YWxvciBtYWlzIGNvbXVtIG51bSBjb25qdW50byBkZSBkYWRvcw0KTkVHQklOT01ESVNUCQk9IERJU1QuQklOLk5FRwkJCSMjCURldm9sdmUgYSBkaXN0cmlidWnDp8OjbyBiaW5vbWluYWwgbmVnYXRpdmENCk5PUk1ESVNUCQk9IERJU1QuTk9STQkJCSMjCURldm9sdmUgYSBkaXN0cmlidWnDp8OjbyBjdW11bGF0aXZhIG5vcm1hbA0KTk9STUlOVgkJCT0gSU5WLk5PUk0JCQkjIwlEZXZvbHZlIG8gaW52ZXJzbyBkYSBkaXN0cmlidWnDp8OjbyBjdW11bGF0aXZhIG5vcm1hbA0KTk9STVNESVNUCQk9IERJU1QuTk9STVAJCQkjIwlEZXZvbHZlIGEgZGlzdHJpYnVpw6fDo28gY3VtdWxhdGl2YSBub3JtYWwgcGFkcsOjbw0KTk9STVNJTlYJCT0gSU5WLk5PUk1QCQkJIyMJRGV2b2x2ZSBvIGludmVyc28gZGEgZGlzdHJpYnVpw6fDo28gY3VtdWxhdGl2YSBub3JtYWwgcGFkcsOjbw0KUEVBUlNPTgkJCT0gUEVBUlNPTgkJCSMjCURldm9sdmUgbyBjb2VmaWNpZW50ZSBkZSBjb3JyZWxhw6fDo28gbW9tZW50by9wcm9kdXRvIGRlIFBlYXJzb24NClBFUkNFTlRJTEUJCT0gUEVSQ0VOVElMCQkJIyMJRGV2b2x2ZSBvIGstw6lzaW1vIHBlcmNlbnRpbCBkZSB2YWxvcmVzIG51bSBpbnRlcnZhbG8NClBFUkNFTlRSQU5LCQk9IE9SREVNLlBFUkNFTlRVQUwJCSMjCURldm9sdmUgYSBvcmRlbSBwZXJjZW50dWFsIGRlIHVtIHZhbG9yIG51bSBjb25qdW50byBkZSBkYWRvcw0KUEVSTVVUCQkJPSBQRVJNVVRBUgkJCSMjCURldm9sdmUgbyBuw7ptZXJvIGRlIHBlcm11dGHDp8O1ZXMgZGUgdW0gZGV0ZXJtaW5hZG8gbsO6bWVybyBkZSBvYmplY3Rvcw0KUE9JU1NPTgkJCT0gUE9JU1NPTgkJCSMjCURldm9sdmUgYSBkaXN0cmlidWnDp8OjbyBkZSBQb2lzc29uDQpQUk9CCQkJPSBQUk9CCQkJCSMjCURldm9sdmUgYSBwcm9iYWJpbGlkYWRlIGRvcyB2YWxvcmVzIG51bSBpbnRlcnZhbG8gc2UgZW5jb250cmFyZW0gZW50cmUgZG9pcyBsaW1pdGVzDQpRVUFSVElMRQkJPSBRVUFSVElMCQkJIyMJRGV2b2x2ZSBvIHF1YXJ0aWwgZGUgdW0gY29uanVudG8gZGUgZGFkb3MNClJBTksJCQk9IE9SREVNCQkJCSMjCURldm9sdmUgYSBvcmRlbSBkZSB1bSBuw7ptZXJvIG51bWEgbGlzdGEgbnVtw6lyaWNhDQpSU1EJCQk9IFJRVUFECQkJCSMjCURldm9sdmUgbyBxdWFkcmFkbyBkbyBjb2VmaWNpZW50ZSBkZSBjb3JyZWxhw6fDo28gbW9tZW50by9wcm9kdXRvIGRlIFBlYXJzb24NClNLRVcJCQk9IERJU1RPUsOHw4NPCQkJIyMJRGV2b2x2ZSBhIGRpc3RvcsOnw6NvIGRlIHVtYSBkaXN0cmlidWnDp8Ojbw0KU0xPUEUJCQk9IERFQ0xJVkUJCQkjIwlEZXZvbHZlIG8gZGVjbGl2ZSBkYSBsaW5oYSBkZSByZWdyZXNzw6NvIGxpbmVhcg0KU01BTEwJCQk9IE1FTk9SCQkJCSMjCURldm9sdmUgbyBtZW5vciB2YWxvciBkZSBrLcOpc2ltbyBkZSB1bSBjb25qdW50byBkZSBkYWRvcw0KU1RBTkRBUkRJWkUJCT0gTk9STUFMSVpBUgkJCSMjCURldm9sdmUgdW0gdmFsb3Igbm9ybWFsaXphZG8NClNUREVWCQkJPSBERVNWUEFECQkJIyMJQ2FsY3VsYSBvIGRlc3Zpby1wYWRyw6NvIGNvbSBiYXNlIG51bWEgYW1vc3RyYQ0KU1RERVZBCQkJPSBERVNWUEFEQQkJCSMjCUNhbGN1bGEgbyBkZXN2aW8tcGFkcsOjbyBjb20gYmFzZSBudW1hIGFtb3N0cmEsIGluY2x1aW5kbyBuw7ptZXJvcywgdGV4dG8gZSB2YWxvcmVzIGzDs2dpY29zDQpTVERFVlAJCQk9IERFU1ZQQURQCQkJIyMJQ2FsY3VsYSBvIGRlc3Zpby1wYWRyw6NvIGNvbSBiYXNlIG5hIHBvcHVsYcOnw6NvIHRvdGFsDQpTVERFVlBBCQkJPSBERVNWUEFEUEEJCQkjIwlDYWxjdWxhIG8gZGVzdmlvLXBhZHLDo28gY29tIGJhc2UgbmEgcG9wdWxhw6fDo28gdG90YWwsIGluY2x1aW5kbyBuw7ptZXJvcywgdGV4dG8gZSB2YWxvcmVzIGzDs2dpY29zDQpTVEVZWAkJCT0gRVBBRFlYCQkJIyMJRGV2b2x2ZSBvIGVycm8tcGFkcsOjbyBkbyB2YWxvciBkZSB5IHByZXZpc3RvIHBhcmEgY2FkYSB4IG5hIHJlZ3Jlc3PDo28NClRESVNUCQkJPSBESVNUVAkJCQkjIwlEZXZvbHZlIGEgZGlzdHJpYnVpw6fDo28gdCBkZSBTdHVkZW50DQpUSU5WCQkJPSBJTlZUCQkJCSMjCURldm9sdmUgbyBpbnZlcnNvIGRhIGRpc3RyaWJ1acOnw6NvIHQgZGUgU3R1ZGVudA0KVFJFTkQJCQk9IFRFTkTDik5DSUEJCQkjIwlEZXZvbHZlIHZhbG9yZXMgYW8gbG9uZ28gZGUgdW1hIHRlbmTDqm5jaWEgbGluZWFyDQpUUklNTUVBTgkJPSBNw4lESUEuSU5URVJOQQkJCSMjCURldm9sdmUgYSBtw6lkaWEgZG8gaW50ZXJpb3IgZGUgdW0gY29uanVudG8gZGUgZGFkb3MNClRURVNUCQkJPSBURVNURVQJCQkjIwlEZXZvbHZlIGEgcHJvYmFiaWxpZGFkZSBhc3NvY2lhZGEgYW8gdGVzdGUgdCBkZSBTdHVkZW50DQpWQVIJCQk9IFZBUgkJCQkjIwlDYWxjdWxhIGEgdmFyacOibmNpYSBjb20gYmFzZSBudW1hIGFtb3N0cmENClZBUkEJCQk9IFZBUkEJCQkJIyMJQ2FsY3VsYSBhIHZhcmnDom5jaWEgY29tIGJhc2UgbnVtYSBhbW9zdHJhLCBpbmNsdWluZG8gbsO6bWVyb3MsIHRleHRvIGUgdmFsb3JlcyBsw7NnaWNvcw0KVkFSUAkJCT0gVkFSUAkJCQkjIwlDYWxjdWxhIGEgdmFyacOibmNpYSBjb20gYmFzZSBuYSBwb3B1bGHDp8OjbyB0b3RhbA0KVkFSUEEJCQk9IFZBUlBBCQkJCSMjCUNhbGN1bGEgYSB2YXJpw6JuY2lhIGNvbSBiYXNlIG5hIHBvcHVsYcOnw6NvIHRvdGFsLCBpbmNsdWluZG8gbsO6bWVyb3MsIHRleHRvIGUgdmFsb3JlcyBsw7NnaWNvcw0KV0VJQlVMTAkJCT0gV0VJQlVMTAkJCSMjCURldm9sdmUgYSBkaXN0cmlidWnDp8OjbyBXZWlidWxsDQpaVEVTVAkJCT0gVEVTVEVaCQkJIyMJRGV2b2x2ZSBvIHZhbG9yIGRlIHByb2JhYmlsaWRhZGUgdW5pY2F1ZGFsIGRlIHVtIHRlc3RlLXoNCg0KDQojIw0KIyMJVGV4dCBmdW5jdGlvbnMJCQkJCUZ1bsOnw7VlcyBkZSB0ZXh0bw0KIyMNCkFTQwkJCT0gQVNDCQkJCSMjCUFsdGVyYSBsZXRyYXMgb3Uga2F0YWthbmEgZGUgbGFyZ3VyYSB0b3RhbCAoYnl0ZSBkdXBsbykgbnVtYSBjYWRlaWEgZGUgY2FyYWN0ZXJlcyBwYXJhIGNhcmFjdGVyZXMgZGUgbGFyZ3VyYSBtw6lkaWEgKGJ5dGUgw7puaWNvKQ0KQkFIVFRFWFQJCT0gVEVYVE8uQkFIVAkJCSMjCUNvbnZlcnRlIHVtIG7Dum1lcm8gZW0gdGV4dG8sIHV0aWxpemFuZG8gbyBmb3JtYXRvIG1vbmV0w6FyaW8gw58gKGJhaHQpDQpDSEFSCQkJPSBDQVLDgUNUCQkJIyMJRGV2b2x2ZSBvIGNhcsOhY3RlciBlc3BlY2lmaWNhZG8gcGVsbyBuw7ptZXJvIGRlIGPDs2RpZ28NCkNMRUFOCQkJPSBMSU1QQVIJCQkjIwlSZW1vdmUgZG8gdGV4dG8gdG9kb3Mgb3MgY2FyYWN0ZXJlcyBuw6NvIGltcHJpbcOtdmVpcw0KQ09ERQkJCT0gQ8OTRElHTwkJCSMjCURldm9sdmUgdW0gY8OzZGlnbyBudW3DqXJpY28gY29ycmVzcG9uZGVudGUgYW8gcHJpbWVpcm8gY2Fyw6FjdGVyIG51bWEgY2FkZWlhIGRlIHRleHRvDQpDT05DQVRFTkFURQkJPSBDT05DQVRFTkFSCQkJIyMJQWdydXBhIHbDoXJpb3MgaXRlbnMgZGUgdGV4dG8gbnVtIMO6bmljbyBpdGVtIGRlIHRleHRvDQpET0xMQVIJCQk9IE1PRURBCQkJCSMjCUNvbnZlcnRlIHVtIG7Dum1lcm8gZW0gdGV4dG8sIHV0aWxpemFuZG8gbyBmb3JtYXRvIG1vbmV0w6FyaW8g4oKsIChFdXJvKQ0KRVhBQ1QJCQk9IEVYQUNUTwkJCSMjCVZlcmlmaWNhIHNlIGRvaXMgdmFsb3JlcyBkZSB0ZXh0byBzw6NvIGlkw6pudGljb3MNCkZJTkQJCQk9IExPQ0FMSVpBUgkJCSMjCUxvY2FsaXphIHVtIHZhbG9yIGRlIHRleHRvIGRlbnRybyBkZSBvdXRybyAoc2Vuc8OtdmVsIMOgcyBtYWnDunNjdWxhcyBlIG1pbsO6c2N1bGFzKQ0KRklOREIJCQk9IExPQ0FMSVpBUkIJCQkjIwlMb2NhbGl6YSB1bSB2YWxvciBkZSB0ZXh0byBkZW50cm8gZGUgb3V0cm8gKHNlbnPDrXZlbCDDoHMgbWFpw7pzY3VsYXMgZSBtaW7DunNjdWxhcykNCkZJWEVECQkJPSBGSVhBCQkJCSMjCUZvcm1hdGEgdW0gbsO6bWVybyBjb21vIHRleHRvIGNvbSB1bSBuw7ptZXJvIGZpeG8gZGUgZGVjaW1haXMNCkpJUwkJCT0gSklTCQkJCSMjCUFsdGVyYSBsZXRyYXMgb3Uga2F0YWthbmEgZGUgbGFyZ3VyYSBtw6lkaWEgKGJ5dGUgw7puaWNvKSBudW1hIGNhZGVpYSBkZSBjYXJhY3RlcmVzIHBhcmEgY2FyYWN0ZXJlcyBkZSBsYXJndXJhIHRvdGFsIChieXRlIGR1cGxvKQ0KTEVGVAkJCT0gRVNRVUVSREEJCQkjIwlEZXZvbHZlIG9zIGNhcmFjdGVyZXMgbWFpcyDDoCBlc3F1ZXJkYSBkZSB1bSB2YWxvciBkZSB0ZXh0bw0KTEVGVEIJCQk9IEVTUVVFUkRBQgkJCSMjCURldm9sdmUgb3MgY2FyYWN0ZXJlcyBtYWlzIMOgIGVzcXVlcmRhIGRlIHVtIHZhbG9yIGRlIHRleHRvDQpMRU4JCQk9IE7Dmk0uQ0FSQUNUCQkJIyMJRGV2b2x2ZSBvIG7Dum1lcm8gZGUgY2FyYWN0ZXJlcyBkZSB1bWEgY2FkZWlhIGRlIHRleHRvDQpMRU5CCQkJPSBOw5pNLkNBUkFDVEIJCQkjIwlEZXZvbHZlIG8gbsO6bWVybyBkZSBjYXJhY3RlcmVzIGRlIHVtYSBjYWRlaWEgZGUgdGV4dG8NCkxPV0VSCQkJPSBNSU7DmlNDVUxBUwkJCSMjCUNvbnZlcnRlIG8gdGV4dG8gZW0gbWluw7pzY3VsYXMNCk1JRAkJCT0gU0VHLlRFWFRPCQkJIyMJRGV2b2x2ZSB1bSBuw7ptZXJvIGVzcGVjw61maWNvIGRlIGNhcmFjdGVyZXMgZGUgdW1hIGNhZGVpYSBkZSB0ZXh0bywgYSBwYXJ0aXIgZGEgcG9zacOnw6NvIGVzcGVjaWZpY2FkYQ0KTUlEQgkJCT0gU0VHLlRFWFRPQgkJCSMjCURldm9sdmUgdW0gbsO6bWVybyBlc3BlY8OtZmljbyBkZSBjYXJhY3RlcmVzIGRlIHVtYSBjYWRlaWEgZGUgdGV4dG8sIGEgcGFydGlyIGRhIHBvc2nDp8OjbyBlc3BlY2lmaWNhZGENClBIT05FVElDCQk9IEZPTsOJVElDQQkJCSMjCVJldGlyYSBvcyBjYXJhY3RlcmVzIGZvbsOpdGljb3MgKGZ1cmlnYW5hKSBkZSB1bWEgY2FkZWlhIGRlIHRleHRvDQpQUk9QRVIJCQk9IElOSUNJQUwuTUFJw5pTQ1VMQQkJIyMJQ29sb2NhIGVtIG1hacO6c2N1bGFzIGEgcHJpbWVpcmEgbGV0cmEgZGUgY2FkYSBwYWxhdnJhIGRlIHVtIHZhbG9yIGRlIHRleHRvDQpSRVBMQUNFCQkJPSBTVUJTVElUVUlSCQkJIyMJU3Vic3RpdHVpIGNhcmFjdGVyZXMgbm8gdGV4dG8NClJFUExBQ0VCCQk9IFNVQlNUSVRVSVJCCQkJIyMJU3Vic3RpdHVpIGNhcmFjdGVyZXMgbm8gdGV4dG8NClJFUFQJCQk9IFJFUEVUSVIJCQkjIwlSZXBldGUgdGV4dG8gdW0gZGV0ZXJtaW5hZG8gbsO6bWVybyBkZSB2ZXplcw0KUklHSFQJCQk9IERJUkVJVEEJCQkjIwlEZXZvbHZlIG9zIGNhcmFjdGVyZXMgbWFpcyDDoCBkaXJlaXRhIGRlIHVtIHZhbG9yIGRlIHRleHRvDQpSSUdIVEIJCQk9IERJUkVJVEFCCQkJIyMJRGV2b2x2ZSBvcyBjYXJhY3RlcmVzIG1haXMgw6AgZGlyZWl0YSBkZSB1bSB2YWxvciBkZSB0ZXh0bw0KU0VBUkNICQkJPSBQUk9DVVJBUgkJCSMjCUxvY2FsaXphIHVtIHZhbG9yIGRlIHRleHRvIGRlbnRybyBkZSBvdXRybyAobsOjbyBzZW5zw612ZWwgYSBtYWnDunNjdWxhcyBlIG1pbsO6c2N1bGFzKQ0KU0VBUkNIQgkJCT0gUFJPQ1VSQVJCCQkJIyMJTG9jYWxpemEgdW0gdmFsb3IgZGUgdGV4dG8gZGVudHJvIGRlIG91dHJvIChuw6NvIHNlbnPDrXZlbCBhIG1hacO6c2N1bGFzIGUgbWluw7pzY3VsYXMpDQpTVUJTVElUVVRFCQk9IFNVQlNUCQkJCSMjCVN1YnN0aXR1aSB0ZXh0byBub3ZvIHBvciB0ZXh0byBhbnRpZ28gbnVtYSBjYWRlaWEgZGUgdGV4dG8NClQJCQk9IFQJCQkJIyMJQ29udmVydGUgb3MgcmVzcGVjdGl2b3MgYXJndW1lbnRvcyBlbSB0ZXh0bw0KVEVYVAkJCT0gVEVYVE8JCQkJIyMJRm9ybWF0YSB1bSBuw7ptZXJvIGUgY29udmVydGUtbyBlbSB0ZXh0bw0KVFJJTQkJCT0gQ09NUEFDVEFSCQkJIyMJUmVtb3ZlIGVzcGHDp29zIGRvIHRleHRvDQpVUFBFUgkJCT0gTUFJw5pTQ1VMQVMJCQkjIwlDb252ZXJ0ZSB0ZXh0byBlbSBtYWnDunNjdWxhcw0KVkFMVUUJCQk9IFZBTE9SCQkJCSMjCUNvbnZlcnRlIHVtIGFyZ3VtZW50byBkZSB0ZXh0byBudW0gbsO6bWVybw0K]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/locale/ru/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/locale/ru/config</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[77u/IyMNCiMjIFBIUEV4Y2VsDQojIw0NCiMjIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTEgUEhQRXhjZWwNCiMjDQojIyBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yDQojIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljDQojIyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXINCiMjIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLg0KIyMNCiMjIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLA0KIyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YNCiMjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VDQojIyBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLg0KIyMNCiMjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMNCiMjIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUNCiMjIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQ0KIyMNCiMjIEBjYXRlZ29yeSAgIFBIUEV4Y2VsDQojIyBAcGFja2FnZSAgICBQSFBFeGNlbF9TZXR0aW5ncw0KIyMgQGNvcHlyaWdodCAgQ29weXJpZ2h0IChjKSAyMDA2IC0gMjAxMSBQSFBFeGNlbCAoaHR0cDovL3d3dy5jb2RlcGxleC5jb20vUEhQRXhjZWwpDQojIyBAbGljZW5zZSAgICBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvb2xkLWxpY2Vuc2VzL2xncGwtMi4xLnR4dAlMR1BMDQojIyBAdmVyc2lvbiAgICAxLjcuNywgMjAxMi0wNS0xOQ0KIyMNCiMjDQoNCg0KQXJndW1lbnRTZXBhcmF0b3IJPSA7DQoNCg0KIyMNCiMjCShGb3IgZnV0dXJlIHVzZSkNCiMjDQpjdXJyZW5jeVN5bWJvbAk9INGADQoNCg0KIyMNCiMjCUV4Y2VsIEVycm9yIENvZGVzCShGb3IgZnV0dXJlIHVzZSkNDQojIw0KTlVMTAk9ICPQn9Cj0KHQotCeIQ0KRElWMAk9ICPQlNCV0JsvMCENClZBTFVFCT0gI9CX0J3QkNCnIQ0KUkVGCT0gI9Ch0KHQq9CbIQ0KTkFNRQk9ICPQmNCc0K8/DQpOVU0JPSAj0KfQmNCh0JvQniENCk5BCT0gI9CdL9CUDQo=]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/locale/ru/functions</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[77u/IyMNCiMjIFBIUEV4Y2VsDQojIw0NCiMjIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTEgUEhQRXhjZWwNCiMjDQojIyBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yDQojIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljDQojIyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXINCiMjIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLg0KIyMNCiMjIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLA0KIyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YNCiMjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VDQojIyBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLg0KIyMNCiMjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMNCiMjIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUNCiMjIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQ0KIyMNCiMjIEBjYXRlZ29yeSAgIFBIUEV4Y2VsDQojIyBAcGFja2FnZSAgICBQSFBFeGNlbF9DYWxjdWxhdGlvbg0KIyMgQGNvcHlyaWdodCAgQ29weXJpZ2h0IChjKSAyMDA2IC0gMjAxMSBQSFBFeGNlbCAoaHR0cDovL3d3dy5jb2RlcGxleC5jb20vUEhQRXhjZWwpDQojIyBAbGljZW5zZSAgICBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvb2xkLWxpY2Vuc2VzL2xncGwtMi4xLnR4dAlMR1BMDQojIyBAdmVyc2lvbiAgICAxLjcuNywgMjAxMi0wNS0xOQ0KIyMNCiMjIERhdGEgaW4gdGhpcyBmaWxlIGRlcml2ZWQgZnJvbSBpbmZvcm1hdGlvbiBwcm92aWRlZCBieSB3ZWItanVuaW9yIChodHRwOi8vd3d3LndlYi1qdW5pb3IubmV0LykNCiMjDQojIw0KDQoNCiMjDQojIwlBZGQtaW4gYW5kIEF1dG9tYXRpb24gZnVuY3Rpb25zCQkJCdCk0YPQvdC60YbQuNC4INC90LDQtNGB0YLRgNC+0LXQuiDQuCDQsNCy0YLQvtC80LDRgtC40LfQsNGG0LjQuA0KIyMNCkdFVFBJVk9UREFUQQkJPSDQn9Ce0JvQo9Cn0JjQotCsLtCU0JDQndCd0KvQlS7QodCS0J7QlNCd0J7QmS7QotCQ0JHQm9CY0KbQqwkjIwnQktC+0LfQstGA0LDRidCw0LXRgiDQtNCw0L3QvdGL0LUsINGF0YDQsNC90Y/RidC40LXRgdGPINCyINC+0YLRh9C10YLQtSDRgdCy0L7QtNC90L7QuSDRgtCw0LHQu9C40YbRiy4NCg0KDQojIw0KIyMJQ3ViZSBmdW5jdGlvbnMJCQkJCQnQpNGD0L3QutGG0LjQuCDQmtGD0LENCiMjDQpDVUJFS1BJTUVNQkVSCQk9INCa0KPQkdCt0JvQldCc0JXQndCi0JrQmNCfCQkJCSMjCdCS0L7Qt9Cy0YDQsNGJ0LDQtdGCINGB0LLQvtC50YHRgtCy0L4g0LrQu9GO0YfQtdCy0L7Qs9C+INC40L3QtNC40LrQsNGC0L7RgNCwINC/0YDQvtC40LfQstC+0LTQuNGC0LXQu9GM0L3QvtGB0YLQuCDCqyjQmtCY0J8pwrsg0Lgg0L7RgtC+0LHRgNCw0LbQsNC10YIg0LjQvNGPIMKr0JrQmNCfwrsg0LIg0Y/Rh9C10LnQutC1LiDCq9Ca0JjQn8K7INC/0YDQtdC00YHRgtCw0LLQu9GP0LXRgiDRgdC+0LHQvtC5INC60L7Qu9C40YfQtdGB0YLQstC10L3QvdGD0Y4g0LLQtdC70LjRh9C40L3Rgywg0YLQsNC60YPRjiDQutCw0Log0LXQttC10LzQtdGB0Y/Rh9C90LDRjyDQstCw0LvQvtCy0LDRjyDQv9GA0LjQsdGL0LvRjCDQuNC70Lgg0LXQttC10LrQstCw0YDRgtCw0LvRjNC90LDRjyDRgtC10LrRg9GH0LXRgdGC0Ywg0LrQsNC00YDQvtCyLCDQuNGB0L/QvtC70YzQt9GD0LXQvNC+0Lkg0LTQu9GPINC60L7QvdGC0YDQvtC70Y8g0Y3RhNGE0LXQutGC0LjQstC90L7RgdGC0Lgg0YDQsNCx0L7RgtGLINC+0YDQs9Cw0L3QuNC30LDRhtC40LguDQpDVUJFTUVNQkVSCQk9INCa0KPQkdCt0JvQldCc0JXQndCiCQkJCSMjCdCS0L7Qt9Cy0YDQsNGJ0LDQtdGCINGN0LvQtdC80LXQvdGCINC40LvQuCDQutC+0YDRgtC10LYg0LjQtyDQutGD0LHQsC4g0JjRgdC/0L7Qu9GM0LfRg9C10YLRgdGPINC00LvRjyDQv9GA0L7QstC10YDQutC4INGB0YPRidC10YHRgtCy0L7QstCw0L3QuNGPINGN0LvQtdC80LXQvdGC0LAg0LjQu9C4INC60L7RgNGC0LXQttCwINCyINC60YPQsdC1Lg0KQ1VCRU1FTUJFUlBST1BFUlRZCT0g0JrQo9CR0KHQktCe0JnQodCi0JLQntCt0JvQldCc0JXQndCi0JAJCQkjIwnQktC+0LfQstGA0LDRidCw0LXRgiDQt9C90LDRh9C10L3QuNC1INGB0LLQvtC50YHRgtCy0LAg0Y3Qu9C10LzQtdC90YLQsCDQuNC3INC60YPQsdCwLiDQmNGB0L/QvtC70YzQt9GD0LXRgtGB0Y8g0LTQu9GPINC/0YDQvtCy0LXRgNC60Lgg0YHRg9GJ0LXRgdGC0LLQvtCy0LDQvdC40Y8g0LjQvNC10L3QuCDRjdC70LXQvNC10L3RgtCwINCyINC60YPQsdC1INC4INCy0L7Qt9Cy0YDQsNGJ0LDQtdGCINGD0LrQsNC30LDQvdC90L7QtSDRgdCy0L7QudGB0YLQstC+INC00LvRjyDRjdGC0L7Qs9C+INGN0LvQtdC80LXQvdGC0LAuDQpDVUJFUkFOS0VETUVNQkVSCT0g0JrQo9CR0J/QntCg0K3Qm9CV0JzQldCd0KIJCQkJIyMJ0JLQvtC30LLRgNCw0YnQsNC10YIgbi3Ri9C5INC40LvQuCDRgNCw0L3QttC40YDQvtCy0LDQvdC90YvQuSDRjdC70LXQvNC10L3RgiDQsiDQvNC90L7QttC10YHRgtCy0L4uINCY0YHQv9C+0LvRjNC30YPQtdGC0YHRjyDQtNC70Y8g0LLQvtC30LLRgNCw0YnQtdC90LjRjyDQvtC00L3QvtCz0L4g0LjQu9C4INC90LXRgdC60L7Qu9GM0LrQuNGFINGN0LvQtdC80LXQvdGC0L7QsiDQsiDQvNC90L7QttC10YHRgtCy0L4sINC90LDQv9GA0LjQvNC10YAsINC70YPRh9GI0LXQs9C+INC/0YDQvtC00LDQstGG0LAg0LjQu9C4IDEwINC70YPRh9GI0LjRhSDRgdGC0YPQtNC10L3RgtC+0LIuDQpDVUJFU0VUCQkJPSDQmtCj0JHQnNCd0J7QlgkJCQkjIwnQntC/0YDQtdC00LXQu9GP0LXRgiDQstGL0YfQuNGB0LvQuNGC0LXQu9GM0L3QvtC1INC80L3QvtC20LXRgdGC0LLQviDRjdC70LXQvNC10L3RgtC+0LIg0LjQu9C4INC60L7RgNGC0LXQttC10LksINC+0YLQv9GA0LDQstC70Y/RjyDQvdCwINGB0LXRgNCy0LXRgCDQstGL0YDQsNC20LXQvdC40LUsINC60L7RgtC+0YDQvtC1INGB0L7Qt9C00LDQtdGCINC80L3QvtC20LXRgdGC0LLQviwg0LAg0LfQsNGC0LXQvCDQstC+0LfQstGA0LDRidCw0LXRgiDQtdCz0L4g0LIgTWljcm9zb2Z0IE9mZmljZSBFeGNlbC4NCkNVQkVTRVRDT1VOVAkJPSDQmtCj0JHQp9CY0KHQm9Ce0K3Qm9Cc0J3QntCWCQkJIyMJ0JLQvtC30LLRgNCw0YnQsNC10YIg0YfQuNGB0LvQviDRjdC70LXQvNC10L3RgtC+0LIg0LzQvdC+0LbQtdGB0YLQstCwLg0KQ1VCRVZBTFVFCQk9INCa0KPQkdCX0J3QkNCn0JXQndCY0JUJCQkJIyMJ0JLQvtC30LLRgNCw0YnQsNC10YIg0L7QsdC+0LHRidC10L3QvdC+0LUg0LfQvdCw0YfQtdC90LjQtSDQuNC3INC60YPQsdCwLg0KDQoNCiMjDQojIwlEYXRhYmFzZSBmdW5jdGlvbnMJCQkJCdCk0YPQvdC60YbQuNC4INC00LvRjyDRgNCw0LHQvtGC0Ysg0YEg0LHQsNC30LDQvNC4INC00LDQvdC90YvRhQ0KIyMNCkRBVkVSQUdFCQk9INCU0KHQoNCX0J3QkNCnCQkJCSMjCdCS0L7Qt9Cy0YDQsNGJ0LDQtdGCINGB0YDQtdC00L3QtdC1INC30L3QsNGH0LXQvdC40LUg0LLRi9Cx0YDQsNC90L3Ri9GFINC30LDQv9C40YHQtdC5INCx0LDQt9GLINC00LDQvdC90YvRhS4NCkRDT1VOVAkJCT0g0JHQodCn0IHQogkJCQkJIyMJ0J/QvtC00YHRh9C40YLRi9Cy0LDQtdGCINC60L7Qu9C40YfQtdGB0YLQstC+INGH0LjRgdC70L7QstGL0YUg0Y/Rh9C10LXQuiDQsiDQsdCw0LfQtSDQtNCw0L3QvdGL0YUuDQpEQ09VTlRBCQkJPSDQkdCh0KfQgdCi0JAJCQkJIyMJ0J/QvtC00YHRh9C40YLRi9Cy0LDQtdGCINC60L7Qu9C40YfQtdGB0YLQstC+INC90LXQv9GD0YHRgtGL0YUg0Y/Rh9C10LXQuiDQsiDQsdCw0LfQtSDQtNCw0L3QvdGL0YUuDQpER0VUCQkJPSDQkdCY0JfQktCb0JXQp9CsCQkJCSMjCdCY0LfQstC70LXQutCw0LXRgiDQuNC3INCx0LDQt9GLINC00LDQvdC90YvRhSDQvtC00L3RgyDQt9Cw0L/QuNGB0YwsINGD0LTQvtCy0LvQtdGC0LLQvtGA0Y/RjtGJ0YPRjiDQt9Cw0LTQsNC90L3QvtC80YMg0YPRgdC70L7QstC40Y4uDQpETUFYCQkJPSDQlNCc0JDQmtChCQkJCQkjIwnQktC+0LfQstGA0LDRidCw0LXRgiDQvNCw0LrRgdC40LzQsNC70YzQvdC+0LUg0LfQvdCw0YfQtdC90LjQtSDRgdGA0LXQtNC4INCy0YvQtNC10LvQtdC90L3Ri9GFINC30LDQv9C40YHQtdC5INCx0LDQt9GLINC00LDQvdC90YvRhS4NCkRNSU4JCQk9INCU0JzQmNCdCQkJCQkjIwnQktC+0LfQstGA0LDRidCw0LXRgiDQvNC40L3QuNC80LDQu9GM0L3QvtC1INC30L3QsNGH0LXQvdC40LUg0YHRgNC10LTQuCDQstGL0LTQtdC70LXQvdC90YvRhSDQt9Cw0L/QuNGB0LXQuSDQsdCw0LfRiyDQtNCw0L3QvdGL0YUuDQpEUFJPRFVDVAkJPSDQkdCU0J/QoNCe0JjQl9CS0JXQlAkJCQkjIwnQn9C10YDQtdC80L3QvtC20LDQtdGCINC30L3QsNGH0LXQvdC40Y8g0L7Qv9GA0LXQtNC10LvQtdC90L3QvtCz0L4g0L/QvtC70Y8g0LIg0LfQsNC/0LjRgdGP0YUg0LHQsNC30Ysg0LTQsNC90L3Ri9GFLCDRg9C00L7QstC70LXRgtCy0L7RgNGP0Y7RidC40YUg0YPRgdC70L7QstC40Y4uDQpEU1RERVYJCQk9INCU0KHQotCQ0J3QlNCe0KLQmtCbCQkJCSMjCdCe0YbQtdC90LjQstCw0LXRgiDRgdGC0LDQvdC00LDRgNGC0L3QvtC1INC+0YLQutC70L7QvdC10L3QuNC1INC/0L4g0LLRi9Cx0L7RgNC60LUg0LTQu9GPINCy0YvQtNC10LvQtdC90L3Ri9GFINC30LDQv9C40YHQtdC5INCx0LDQt9GLINC00LDQvdC90YvRhS4NCkRTVERFVlAJCQk9INCU0KHQotCQ0J3QlNCe0KLQmtCb0J8JCQkJIyMJ0JLRi9GH0LjRgdC70Y/QtdGCINGB0YLQsNC90LTQsNGA0YLQvdC+0LUg0L7RgtC60LvQvtC90LXQvdC40LUg0L/QviDQs9C10L3QtdGA0LDQu9GM0L3QvtC5INGB0L7QstC+0LrRg9C/0L3QvtGB0YLQuCDQtNC70Y8g0LLRi9C00LXQu9C10L3QvdGL0YUg0LfQsNC/0LjRgdC10Lkg0LHQsNC30Ysg0LTQsNC90L3Ri9GFDQpEU1VNCQkJPSDQkdCU0KHQo9Cc0JwJCQkJIyMJ0KHRg9C80LzQuNGA0YPQtdGCINGH0LjRgdC70LAg0LIg0L/QvtC70LUg0LTQu9GPINC30LDQv9C40YHQtdC5INCx0LDQt9GLINC00LDQvdC90YvRhSwg0YPQtNC+0LLQu9C10YLQstC+0YDRj9GO0YnQuNGFINGD0YHQu9C+0LLQuNGOLg0KRFZBUgkJCT0g0JHQlNCU0JjQodCfCQkJCSMjCdCe0YbQtdC90LjQstCw0LXRgiDQtNC40YHQv9C10YDRgdC40Y4g0L/QviDQstGL0LHQvtGA0LrQtSDQuNC3INCy0YvQtNC10LvQtdC90L3Ri9GFINC30LDQv9C40YHQtdC5INCx0LDQt9GLINC00LDQvdC90YvRhQ0KRFZBUlAJCQk9INCR0JTQlNCY0KHQn9CfCQkJCSMjCdCS0YvRh9C40YHQu9GP0LXRgiDQtNC40YHQv9C10YDRgdC40Y4g0L/QviDQs9C10L3QtdGA0LDQu9GM0L3QvtC5INGB0L7QstC+0LrRg9C/0L3QvtGB0YLQuCDQtNC70Y8g0LLRi9C00LXQu9C10L3QvdGL0YUg0LfQsNC/0LjRgdC10Lkg0LHQsNC30Ysg0LTQsNC90L3Ri9GFDQoNCg0KIyMNCiMjCURhdGUgYW5kIHRpbWUgZnVuY3Rpb25zCQkJCQnQpNGD0L3QutGG0LjQuCDQtNCw0YLRiyDQuCDQstGA0LXQvNC10L3QuA0KIyMNCkRBVEUJCQk9INCU0JDQotCQCQkJCQkjIwnQktC+0LfQstGA0LDRidCw0LXRgiDQt9Cw0LTQsNC90L3Rg9GOINC00LDRgtGDINCyINGH0LjRgdC70L7QstC+0Lwg0YTQvtGA0LzQsNGC0LUuDQpEQVRFVkFMVUUJCT0g0JTQkNCi0JDQl9Cd0JDQpwkJCQkjIwnQn9GA0LXQvtCx0YDQsNC30YPQtdGCINC00LDRgtGDINC40Lcg0YLQtdC60YHRgtC+0LLQvtCz0L4g0YTQvtGA0LzQsNGC0LAg0LIg0YfQuNGB0LvQvtCy0L7QuSDRhNC+0YDQvNCw0YIuDQpEQVkJCQk9INCU0JXQndCsCQkJCQkjIwnQn9GA0LXQvtCx0YDQsNC30YPQtdGCINC00LDRgtGDINCyINGH0LjRgdC70L7QstC+0Lwg0YTQvtGA0LzQsNGC0LUg0LIg0LTQtdC90Ywg0LzQtdGB0Y/RhtCwLg0KREFZUzM2MAkJCT0g0JTQndCV0JkzNjAJCQkJIyMJ0JLRi9GH0LjRgdC70Y/QtdGCINC60L7Qu9C40YfQtdGB0YLQstC+INC00L3QtdC5INC80LXQttC00YMg0LTQstGD0LzRjyDQtNCw0YLQsNC80Lgg0L3QsCDQvtGB0L3QvtCy0LUgMzYwLdC00L3QtdCy0L3QvtCz0L4g0LPQvtC00LAuDQpFREFURQkJCT0g0JTQkNCi0JDQnNCV0KEJCQkJIyMJ0JLQvtC30LLRgNCw0YnQsNC10YIg0LTQsNGC0YMg0LIg0YfQuNGB0LvQvtCy0L7QvCDRhNC+0YDQvNCw0YLQtSwg0L7RgtGB0YLQvtGP0YnRg9GOINC90LAg0LfQsNC00LDQvdC90L7QtSDRh9C40YHQu9C+INC80LXRgdGP0YbQtdCyINCy0L/QtdGA0LXQtCDQuNC70Lgg0L3QsNC30LDQtCDQvtGCINC90LDRh9Cw0LvRjNC90L7QuSDQtNCw0YLRiy4NCkVPTU9OVEgJCQk9INCa0J7QndCc0JXQodCv0KbQkAkJCQkjIwnQktC+0LfQstGA0LDRidCw0LXRgiDQtNCw0YLRgyDQsiDRh9C40YHQu9C+0LLQvtC8INGE0L7RgNC80LDRgtC1INC00LvRjyDQv9C+0YHQu9C10LTQvdC10LPQviDQtNC90Y8g0LzQtdGB0Y/RhtCwLCDQvtGC0YHRgtC+0Y/RidC10LPQviDQstC/0LXRgNC10LQg0LjQu9C4INC90LDQt9Cw0LQg0L3QsCDQt9Cw0LTQsNC90L3QvtC1INGH0LjRgdC70L4g0LzQtdGB0Y/RhtC10LIuDQpIT1VSCQkJPSDQp9CQ0KEJCQkJCSMjCdCf0YDQtdC+0LHRgNCw0LfRg9C10YIg0LTQsNGC0YMg0LIg0YfQuNGB0LvQvtCy0L7QvCDRhNC+0YDQvNCw0YLQtSDQsiDRh9Cw0YHRiy4NCk1JTlVURQkJCT0g0JzQmNCd0KPQotCrCQkJCSMjCdCf0YDQtdC+0LHRgNCw0LfRg9C10YIg0LTQsNGC0YMg0LIg0YfQuNGB0LvQvtCy0L7QvCDRhNC+0YDQvNCw0YLQtSDQsiDQvNC40L3Rg9GC0YsuDQpNT05USAkJCT0g0JzQldCh0K/QpgkJCQkJIyMJ0J/RgNC10L7QsdGA0LDQt9GD0LXRgiDQtNCw0YLRgyDQsiDRh9C40YHQu9C+0LLQvtC8INGE0L7RgNC80LDRgtC1INCyINC80LXRgdGP0YbRiy4NCk5FVFdPUktEQVlTCQk9INCn0JjQodCi0KDQkNCR0JTQndCYCQkJCSMjCdCS0L7Qt9Cy0YDQsNGJ0LDQtdGCINC60L7Qu9C40YfQtdGB0YLQstC+INGA0LDQsdC+0YfQuNGFINC00L3QtdC5INC80LXQttC00YMg0LTQstGD0LzRjyDQtNCw0YLQsNC80LguDQpOT1cJCQk9INCi0JTQkNCi0JAJCQkJCSMjCdCS0L7Qt9Cy0YDQsNGJ0LDQtdGCINGC0LXQutGD0YnRg9GOINC00LDRgtGDINC4INCy0YDQtdC80Y8g0LIg0YfQuNGB0LvQvtCy0L7QvCDRhNC+0YDQvNCw0YLQtS4NClNFQ09ORAkJCT0g0KHQldCa0KPQndCU0KsJCQkJIyMJ0J/RgNC10L7QsdGA0LDQt9GD0LXRgiDQtNCw0YLRgyDQsiDRh9C40YHQu9C+0LLQvtC8INGE0L7RgNC80LDRgtC1INCyINGB0LXQutGD0L3QtNGLLg0KVElNRQkJCT0g0JLQoNCV0JzQrwkJCQkJIyMJ0JLQvtC30LLRgNCw0YnQsNC10YIg0LfQsNC00LDQvdC90L7QtSDQstGA0LXQvNGPINCyINGH0LjRgdC70L7QstC+0Lwg0YTQvtGA0LzQsNGC0LUuDQpUSU1FVkFMVUUJCT0g0JLQoNCV0JzQl9Cd0JDQpwkJCQkjIwnQn9GA0LXQvtCx0YDQsNC30YPQtdGCINCy0YDQtdC80Y8g0LjQtyDRgtC10LrRgdGC0L7QstC+0LPQviDRhNC+0YDQvNCw0YLQsCDQsiDRh9C40YHQu9C+0LLQvtC5INGE0L7RgNC80LDRgi4NClRPREFZCQkJPSDQodCV0JPQntCU0J3QrwkJCQkjIwnQktC+0LfQstGA0LDRidCw0LXRgiDRgtC10LrRg9GJ0YPRjiDQtNCw0YLRgyDQsiDRh9C40YHQu9C+0LLQvtC8INGE0L7RgNC80LDRgtC1Lg0KV0VFS0RBWQkJCT0g0JTQldCd0KzQndCV0JQJCQkJIyMJ0J/RgNC10L7QsdGA0LDQt9GD0LXRgiDQtNCw0YLRgyDQsiDRh9C40YHQu9C+0LLQvtC8INGE0L7RgNC80LDRgtC1INCyINC00LXQvdGMINC90LXQtNC10LvQuC4NCldFRUtOVU0JCQk9INCd0J7QnNCd0JXQlNCV0JvQmAkJCQkjIwnQn9GA0LXQvtCx0YDQsNC30YPQtdGCINGH0LjRgdC70L7QstC+0LUg0L/RgNC10LTRgdGC0LDQstC70LXQvdC40LUg0LIg0YfQuNGB0LvQviwg0LrQvtGC0L7RgNC+0LUg0YPQutCw0LfRi9Cy0LDQtdGCLCDQvdCwINC60LDQutGD0Y4g0L3QtdC00LXQu9GOINCz0L7QtNCwINC/0YDQuNGF0L7QtNC40YLRgdGPINGD0LrQsNC30LDQvdC90LDRjyDQtNCw0YLQsC4NCldPUktEQVkJCQk9INCg0JDQkdCU0JXQndCsCQkJCSMjCdCS0L7Qt9Cy0YDQsNGJ0LDQtdGCINC00LDRgtGDINCyINGH0LjRgdC70L7QstC+0Lwg0YTQvtGA0LzQsNGC0LUsINC+0YLRgdGC0L7Rj9GJ0YPRjiDQstC/0LXRgNC10LQg0LjQu9C4INC90LDQt9Cw0LQg0L3QsCDQt9Cw0LTQsNC90L3QvtC1INC60L7Qu9C40YfQtdGB0YLQstC+INGA0LDQsdC+0YfQuNGFINC00L3QtdC5Lg0KWUVBUgkJCT0g0JPQntCUCQkJCQkjIwnQn9GA0LXQvtCx0YDQsNC30YPQtdGCINC00LDRgtGDINCyINGH0LjRgdC70L7QstC+0Lwg0YTQvtGA0LzQsNGC0LUg0LIg0LPQvtC0Lg0KWUVBUkZSQUMJCT0g0JTQntCb0K/Qk9Ce0JTQkAkJCQkjIwnQktC+0LfQstGA0LDRidCw0LXRgiDQtNC+0LvRjiDQs9C+0LTQsCwg0LrQvtGC0L7RgNGD0Y4g0YHQvtGB0YLQsNCy0LvRj9C10YIg0LrQvtC70LjRh9C10YHRgtCy0L4g0LTQvdC10Lkg0LzQtdC20LTRgyDQvdCw0YfQsNC70YzQvdC+0Lkg0Lgg0LrQvtC90LXRh9C90L7QuSDQtNCw0YLQsNC80LguDQoNCg0KIyMNCiMjCUVuZ2luZWVyaW5nIGZ1bmN0aW9ucwkJCQkJ0JjQvdC20LXQvdC10YDQvdGL0LUg0YTRg9C90LrRhtC40LgNCiMjDQpCRVNTRUxJCQkJPSDQkdCV0KHQodCV0JvQrC5JCSAJCQkjIwnQktC+0LfQstGA0LDRidCw0LXRgiDQvNC+0LTQuNGE0LjRhtC40YDQvtCy0LDQvdC90YPRjiDRhNGD0L3QutGG0LjRjiDQkdC10YHRgdC10LvRjyBJbih4KS4NCkJFU1NFTEoJCQk9INCR0JXQodCh0JXQm9CsLkoJCQkJIyMJ0JLQvtC30LLRgNCw0YnQsNC10YIg0YTRg9C90LrRhtC40Y4g0JHQtdGB0YHQtdC70Y8gSm4oeCkuDQpCRVNTRUxLCQkJPSDQkdCV0KHQodCV0JvQrC5LCQkJCSMjCdCS0L7Qt9Cy0YDQsNGJ0LDQtdGCINC80L7QtNC40YTQuNGG0LjRgNC+0LLQsNC90L3Rg9GOINGE0YPQvdC60YbQuNGOINCR0LXRgdGB0LXQu9GPIEtuKHgpLg0KQkVTU0VMWQkJCT0g0JHQldCh0KHQldCb0KwuWQkJCQkjIwnQktC+0LfQstGA0LDRidCw0LXRgiDRhNGD0L3QutGG0LjRjiDQkdC10YHRgdC10LvRjyBZbih4KS4NCkJJTjJERUMJCQk9INCU0JIu0JIu0JTQldChCQkJCSMjCdCf0YDQtdC+0LHRgNCw0LfRg9C10YIg0LTQstC+0LjRh9C90L7QtSDRh9C40YHQu9C+INCyINC00LXRgdGP0YLQuNGH0L3QvtC1Lg0KQklOMkhFWAkJCT0g0JTQki7Qki7QqNCV0KHQotCdCQkJCSMjCdCf0YDQtdC+0LHRgNCw0LfRg9C10YIg0LTQstC+0LjRh9C90L7QtSDRh9C40YHQu9C+INCyINGI0LXRgdGC0L3QsNC00YbQsNGC0LXRgNC40YfQvdC+0LUuDQpCSU4yT0NUCQkJPSDQlNCSLtCSLtCS0J7QodCs0JwJCQkJIyMJ0J/RgNC10L7QsdGA0LDQt9GD0LXRgiDQtNCy0L7QuNGH0L3QvtC1INGH0LjRgdC70L4g0LIg0LLQvtGB0YzQvNC10YDQuNGH0L3QvtC1Lg0KQ09NUExFWAkJCT0g0JrQntCc0J/Qm9CV0JrQodCdCQkJCSMjCdCf0YDQtdC+0LHRgNCw0LfRg9C10YIg0LrQvtGN0YTRhNC40YbQuNC10L3RgtGLINC/0YDQuCDQstC10YnQtdGB0YLQstC10L3QvdC+0Lkg0Lgg0LzQvdC40LzQvtC5INGH0LDRgdGC0Y/RhSDQutC+0LzQv9C70LXQutGB0L3QvtCz0L4g0YfQuNGB0LvQsCDQsiDQutC+0LzQv9C70LXQutGB0L3QvtC1INGH0LjRgdC70L4uDQpDT05WRVJUCQkJPSDQn9Cg0JXQntCR0KAJCQkJIyMJ0J/RgNC10L7QsdGA0LDQt9GD0LXRgiDRh9C40YHQu9C+INC40Lcg0L7QtNC90L7QuSDRgdC40YHRgtC10LzRiyDQtdC00LjQvdC40YYg0LjQt9C80LXRgNC10L3QuNGPINCyINC00YDRg9Cz0YPRji4NCkRFQzJCSU4JCQk9INCU0JXQoS7Qki7QlNCSCQkJCSMjCdCf0YDQtdC+0LHRgNCw0LfRg9C10YIg0LTQtdGB0Y/RgtC40YfQvdC+0LUg0YfQuNGB0LvQviDQsiDQtNCy0L7QuNGH0L3QvtC1Lg0KREVDMkhFWAkJCT0g0JTQldChLtCSLtCo0JXQodCi0J0JCQkJIyMJ0J/RgNC10L7QsdGA0LDQt9GD0LXRgiDQtNC10YHRj9GC0LjRh9C90L7QtSDRh9C40YHQu9C+INCyINGI0LXRgdGC0L3QsNC00YbQsNGC0LXRgNC40YfQvdC+0LUuDQpERUMyT0NUCQkJPSDQlNCV0KEu0JIu0JLQntCh0KzQnAkJCQkjIwnQn9GA0LXQvtCx0YDQsNC30YPQtdGCINC00LXRgdGP0YLQuNGH0L3QvtC1INGH0LjRgdC70L4g0LIg0LLQvtGB0YzQvNC10YDQuNGH0L3QvtC1Lg0KREVMVEEJCQk9INCU0JXQm9Cs0KLQkAkJCQkjIwnQn9GA0L7QstC10YDRj9C10YIg0YDQsNCy0LXQvdGB0YLQstC+INC00LLRg9GFINC30L3QsNGH0LXQvdC40LkuDQpFUkYJCQk9INCk0J7QqAkJCQkJIyMJ0JLQvtC30LLRgNCw0YnQsNC10YIg0YTRg9C90LrRhtC40Y4g0L7RiNC40LHQutC4Lg0KRVJGQwkJCT0g0JTQpNCe0KgJCQkJCSMjCdCS0L7Qt9Cy0YDQsNGJ0LDQtdGCINC00L7Qv9C+0LvQvdC40YLQtdC70YzQvdGD0Y4g0YTRg9C90LrRhtC40Y4g0L7RiNC40LHQutC4Lg0KR0VTVEVQCQkJPSDQn9Ce0KDQntCTCQkJCQkjIwnQn9GA0L7QstC10YDRj9C10YIsINC90LUg0L/RgNC10LLRi9GI0LDQtdGCINC70Lgg0LTQsNC90L3QvtC1INGH0LjRgdC70L4g0L/QvtGA0L7Qs9C+0LLQvtCz0L4g0LfQvdCw0YfQtdC90LjRjy4NCkhFWDJCSU4JCQk9INCo0JXQodCi0J0u0JIu0JTQkgkJCQkjIwnQn9GA0LXQvtCx0YDQsNC30YPQtdGCINGI0LXRgdGC0L3QsNC00YbQsNGC0LXRgNC40YfQvdC+0LUg0YfQuNGB0LvQviDQsiDQtNCy0L7QuNGH0L3QvtC1Lg0KSEVYMkRFQwkJCT0g0KjQldCh0KLQnS7Qki7QlNCV0KEJCQkJIyMJ0J/RgNC10L7QsdGA0LDQt9GD0LXRgiDRiNC10YHRgtC90LDQtNGG0LDRgtC10YDQuNGH0L3QvtC1INGH0LjRgdC70L4g0LIg0LTQtdGB0Y/RgtC40YfQvdC+0LUuDQpIRVgyT0NUCQkJPSDQqNCV0KHQotCdLtCSLtCS0J7QodCs0JwJCQkJIyMJ0J/RgNC10L7QsdGA0LDQt9GD0LXRgiDRiNC10YHRgtC90LDQtNGG0LDRgtC10YDQuNGH0L3QvtC1INGH0LjRgdC70L4g0LIg0LLQvtGB0YzQvNC10YDQuNGH0L3QvtC1Lg0KSU1BQlMJCQk9INCc0J3QmNCcLkFCUwkJCQkjIwnQktC+0LfQstGA0LDRidCw0LXRgiDQsNCx0YHQvtC70Y7RgtC90YPRjiDQstC10LvQuNGH0LjQvdGDICjQvNC+0LTRg9C70YwpINC60L7QvNC/0LvQtdC60YHQvdC+0LPQviDRh9C40YHQu9CwLg0KSU1BR0lOQVJZCQk9INCc0J3QmNCcLtCn0JDQodCi0KwJCQkJIyMJ0JLQvtC30LLRgNCw0YnQsNC10YIg0LrQvtGN0YTRhNC40YbQuNC10L3RgiDQv9GA0Lgg0LzQvdC40LzQvtC5INGH0LDRgdGC0Lgg0LrQvtC80L/Qu9C10LrRgdC90L7Qs9C+INGH0LjRgdC70LAuDQpJTUFSR1VNRU5UCQk9INCc0J3QmNCcLtCQ0KDQk9Cj0JzQldCd0KIJCQkJIyMJ0JLQvtC30LLRgNCw0YnQsNC10YIg0LfQvdCw0YfQtdC90LjQtSDQsNGA0LPRg9C80LXQvdGC0LAg0LrQvtC80L/Qu9C10LrRgdC90L7Qs9C+INGH0LjRgdC70LAgKNGC0LXRgtCwKSDigJQg0YPQs9C+0LssINCy0YvRgNCw0LbQtdC90L3Ri9C5INCyINGA0LDQtNC40LDQvdCw0YUuDQpJTUNPTkpVR0FURQkJPSDQnNCd0JjQnC7QodCe0J/QoNCv0JYJCQkJIyMJ0JLQvtC30LLRgNCw0YnQsNC10YIg0LrQvtC80L/Qu9C10LrRgdC90L4t0YHQvtC/0YDRj9C20LXQvdC90L7QtSDQutC+0LzQv9C70LXQutGB0L3QvtC1INGH0LjRgdC70L4uDQpJTUNPUwkJCT0g0JzQndCY0JwuQ09TCQkJCSMjCdCS0L7Qt9Cy0YDQsNGJ0LDQtdGCINC60L7RgdC40L3Rg9GBINC60L7QvNC/0LvQtdC60YHQvdC+0LPQviDRh9C40YHQu9CwLg0KSU1ESVYJCQk9INCc0J3QmNCcLtCU0JXQmwkJCQkjIwnQktC+0LfQstGA0LDRidCw0LXRgiDRh9Cw0YHRgtC90L7QtSDQvtGCINC00LXQu9C10L3QuNGPINC00LLRg9GFINC60L7QvNC/0LvQtdC60YHQvdGL0YUg0YfQuNGB0LXQuy4NCklNRVhQCQkJPSDQnNCd0JjQnC5FWFAJCQkJIyMJ0JLQvtC30LLRgNCw0YnQsNC10YIg0Y3QutGB0L/QvtC90LXQvdGC0YMg0LrQvtC80L/Qu9C10LrRgdC90L7Qs9C+INGH0LjRgdC70LAuDQpJTUxOCQkJPSDQnNCd0JjQnC5MTgkJCQkjIwnQktC+0LfQstGA0LDRidCw0LXRgiDQvdCw0YLRg9GA0LDQu9GM0L3Ri9C5INC70L7Qs9Cw0YDQuNGE0Lwg0LrQvtC80L/Qu9C10LrRgdC90L7Qs9C+INGH0LjRgdC70LAuDQpJTUxPRzEwCQkJPSDQnNCd0JjQnC5MT0cxMAkJCQkjIwnQktC+0LfQstGA0LDRidCw0LXRgiDQvtCx0YvRh9C90YvQuSAo0LTQtdGB0Y/RgtC40YfQvdGL0LkpINC70L7Qs9Cw0YDQuNGE0Lwg0LrQvtC80L/Qu9C10LrRgdC90L7Qs9C+INGH0LjRgdC70LAuDQpJTUxPRzIJCQk9INCc0J3QmNCcLkxPRzIJCQkJIyMJ0JLQvtC30LLRgNCw0YnQsNC10YIg0LTQstC+0LjRh9C90YvQuSDQu9C+0LPQsNGA0LjRhNC8INC60L7QvNC/0LvQtdC60YHQvdC+0LPQviDRh9C40YHQu9CwLg0KSU1QT1dFUgkJCT0g0JzQndCY0Jwu0KHQotCV0J/QldCd0KwJCQkJIyMJ0JLQvtC30LLRgNCw0YnQsNC10YIg0LrQvtC80L/Qu9C10LrRgdC90L7QtSDRh9C40YHQu9C+LCDQstC+0LfQstC10LTQtdC90L3QvtC1INCyINGG0LXQu9GD0Y4g0YHRgtC10L/QtdC90YwuDQpJTVBST0RVQ1QJCT0g0JzQndCY0Jwu0J/QoNCe0JjQl9CS0JXQlAkJCQkjIwnQktC+0LfQstGA0LDRidCw0LXRgiDQv9GA0L7QuNC30LLQtdC00LXQvdC40LUg0L7RgiAyINC00L4gMjkg0LrQvtC80L/Qu9C10LrRgdC90YvRhSDRh9C40YHQtdC7Lg0KSU1SRUFMCQkJPSDQnNCd0JjQnC7QktCV0KkJCQkJIyMJ0JLQvtC30LLRgNCw0YnQsNC10YIg0LrQvtGN0YTRhNC40YbQuNC10L3RgiDQv9GA0Lgg0LLQtdGJ0LXRgdGC0LLQtdC90L3QvtC5INGH0LDRgdGC0Lgg0LrQvtC80L/Qu9C10LrRgdC90L7Qs9C+INGH0LjRgdC70LAuDQpJTVNJTgkJCT0g0JzQndCY0JwuU0lOCQkJCSMjCdCS0L7Qt9Cy0YDQsNGJ0LDQtdGCINGB0LjQvdGD0YEg0LrQvtC80L/Qu9C10LrRgdC90L7Qs9C+INGH0LjRgdC70LAuDQpJTVNRUlQJCQk9INCc0J3QmNCcLtCa0J7QoNCV0J3QrAkJCQkjIwnQktC+0LfQstGA0LDRidCw0LXRgiDQt9C90LDRh9C10L3QuNC1INC60LLQsNC00YDQsNGC0L3QvtCz0L4g0LrQvtGA0L3RjyDQuNC3INC60L7QvNC/0LvQtdC60YHQvdC+0LPQviDRh9C40YHQu9CwLg0KSU1TVUIJCQk9INCc0J3QmNCcLtCg0JDQl9CdCQkJCSMjCdCS0L7Qt9Cy0YDQsNGJ0LDQtdGCINGA0LDQt9C90L7RgdGC0Ywg0LTQstGD0YUg0LrQvtC80L/Qu9C10LrRgdC90YvRhSDRh9C40YHQtdC7Lg0KSU1TVU0JCQk9INCc0J3QmNCcLtCh0KPQnNCcCQkJCSMjCdCS0L7Qt9Cy0YDQsNGJ0LDQtdGCINGB0YPQvNC80YMg0LrQvtC80L/Qu9C10LrRgdC90YvRhSDRh9C40YHQtdC7Lg0KT0NUMkJJTgkJCT0g0JLQntCh0KzQnC7Qki7QlNCSCQkJCSMjCdCf0YDQtdC+0LHRgNCw0LfRg9C10YIg0LLQvtGB0YzQvNC10YDQuNGH0L3QvtC1INGH0LjRgdC70L4g0LIg0LTQstC+0LjRh9C90L7QtS4NCk9DVDJERUMJCQk9INCS0J7QodCs0Jwu0JIu0JTQldChCQkJCSMjCdCf0YDQtdC+0LHRgNCw0LfRg9C10YIg0LLQvtGB0YzQvNC10YDQuNGH0L3QvtC1INGH0LjRgdC70L4g0LIg0LTQtdGB0Y/RgtC40YfQvdC+0LUuDQpPQ1QySEVYCQkJPSDQktCe0KHQrNCcLtCSLtCo0JXQodCi0J0JCQkJIyMJ0J/RgNC10L7QsdGA0LDQt9GD0LXRgiDQstC+0YHRjNC80LXRgNC40YfQvdC+0LUg0YfQuNGB0LvQviDQsiDRiNC10YHRgtC90LDQtNGG0LDRgtC10YDQuNGH0L3QvtC1Lg0KDQoNCiMjDQojIwlGaW5hbmNpYWwgZnVuY3Rpb25zCQkJCQnQpNC40L3QsNC90YHQvtCy0YvQtSDRhNGD0L3QutGG0LjQuA0KIyMNCkFDQ1JJTlQJCQk9INCd0JDQmtCe0J/QlNCe0KXQntCUCQkJCSMjCdCS0L7Qt9Cy0YDQsNGJ0LDQtdGCINC90LDQutC+0L/Qu9C10L3QvdGL0Lkg0L/RgNC+0YbQtdC90YIg0L/QviDRhtC10L3QvdGL0Lwg0LHRg9C80LDQs9Cw0Lwg0YEg0L/QtdGA0LjQvtC00LjRh9C10YHQutC+0Lkg0LLRi9C/0LvQsNGC0L7QuSDQv9GA0L7RhtC10L3RgtC+0LIuDQpBQ0NSSU5UTQkJPSDQndCQ0JrQntCf0JTQntCl0J7QlNCf0J7Qk9CQ0KgJCQkjIwnQktC+0LfQstGA0LDRidCw0LXRgiDQvdCw0LrQvtC/0LvQtdC90L3Ri9C5INC/0YDQvtGG0LXQvdGCINC/0L4g0YbQtdC90L3Ri9C8INCx0YPQvNCw0LPQsNC8LCDQv9GA0L7RhtC10L3RgtGLINC/0L4g0LrQvtGC0L7RgNGL0Lwg0LLRi9C/0LvQsNGH0LjQstCw0Y7RgtGB0Y8g0LIg0YHRgNC+0Log0L/QvtCz0LDRiNC10L3QuNGPLg0KQU1PUkRFR1JDCQk9INCQ0JzQntCg0KPQnAkJCQkjIwnQktC+0LfQstGA0LDRidCw0LXRgiDQstC10LvQuNGH0LjQvdGDINCw0LzQvtGA0YLQuNC30LDRhtC40Lgg0LTQu9GPINC60LDQttC00L7Qs9C+INC/0LXRgNC40L7QtNCwLCDQuNGB0L/QvtC70YzQt9GD0Y8g0LrQvtGN0YTRhNC40YbQuNC10L3RgiDQsNC80L7RgNGC0LjQt9Cw0YbQuNC4Lg0KQU1PUkxJTkMJCT0g0JDQnNCe0KDQo9CSCQkJCSMjCdCS0L7Qt9Cy0YDQsNGJ0LDQtdGCINCy0LXQu9C40YfQuNC90YMg0LDQvNC+0YDRgtC40LfQsNGG0LjQuCDQtNC70Y8g0LrQsNC20LTQvtCz0L4g0L/QtdGA0LjQvtC00LAuDQpDT1VQREFZQlMJCT0g0JTQndCV0JnQmtCj0J/QntCd0JTQngkJCQkjIwnQktC+0LfQstGA0LDRidCw0LXRgiDQutC+0LvQuNGH0LXRgdGC0LLQviDQtNC90LXQuSDQvtGCINC90LDRh9Cw0LvQsCDQtNC10LnRgdGC0LLQuNGPINC60YPQv9C+0L3QsCDQtNC+INC00LDRgtGLINGB0L7Qs9C70LDRiNC10L3QuNGPLg0KQ09VUERBWVMJCT0g0JTQndCV0JnQmtCj0J/QntCdCQkJCSMjCdCS0L7Qt9Cy0YDQsNGJ0LDQtdGCINGH0LjRgdC70L4g0LTQvdC10Lkg0LIg0L/QtdGA0LjQvtC00LUg0LrRg9C/0L7QvdCwLCDRgdC+0LTQtdGA0LbQsNGJ0LXQvCDQtNCw0YLRgyDRgdC+0LPQu9Cw0YjQtdC90LjRjy4NCkNPVVBEQVlTTkMJCT0g0JTQndCV0JnQmtCj0J/QntCd0J/QntCh0JvQlQkJCSMjCdCS0L7Qt9Cy0YDQsNGJ0LDQtdGCINGH0LjRgdC70L4g0LTQvdC10Lkg0L7RgiDQtNCw0YLRiyDRgdC+0LPQu9Cw0YjQtdC90LjRjyDQtNC+INGB0YDQvtC60LAg0YHQu9C10LTRg9GO0YnQtdCz0L4g0LrRg9C/0L7QvdCwLg0KQ09VUE5DRAkJCT0g0JTQkNCi0JDQmtCj0J/QntCd0J/QntCh0JvQlQkJCSMjCdCS0L7Qt9Cy0YDQsNGJ0LDQtdGCINGB0LvQtdC00YPRjtGJ0YPRjiDQtNCw0YLRgyDQutGD0L/QvtC90LAg0L/QvtGB0LvQtSDQtNCw0YLRiyDRgdC+0LPQu9Cw0YjQtdC90LjRjy4NCkNPVVBOVU0JCQk9INCn0JjQodCb0JrQo9Cf0J7QnQkJCQkjIwnQktC+0LfQstGA0LDRidCw0LXRgiDQutC+0LvQuNGH0LXRgdGC0LLQviDQutGD0L/QvtC90L7Qsiwg0LrQvtGC0L7RgNGL0LUg0LzQvtCz0YPRgiDQsdGL0YLRjCDQvtC/0LvQsNGH0LXQvdGLINC80LXQttC00YMg0LTQsNGC0L7QuSDRgdC+0LPQu9Cw0YjQtdC90LjRjyDQuCDRgdGA0L7QutC+0Lwg0LLRgdGC0YPQv9C70LXQvdC40Y8g0LIg0YHQuNC70YMuDQpDT1VQUENECQkJPSDQlNCQ0KLQkNCa0KPQn9Ce0J3QlNCeCQkJCSMjCdCS0L7Qt9Cy0YDQsNGJ0LDQtdGCINC/0YDQtdC00YvQtNGD0YnRg9GOINC00LDRgtGDINC60YPQv9C+0L3QsCDQv9C10YDQtdC0INC00LDRgtC+0Lkg0YHQvtCz0LvQsNGI0LXQvdC40Y8uDQpDVU1JUE1UCQkJPSDQntCR0KnQn9Cb0JDQogkJCQkjIwnQktC+0LfQstGA0LDRidCw0LXRgiDQvtCx0YnRg9GOINCy0YvQv9C70LDRgtGDLCDQv9GA0L7QuNC30LLQtdC00LXQvdC90YPRjiDQvNC10LbQtNGDINC00LLRg9C80Y8g0L/QtdGA0LjQvtC00LjRh9C10YHQutC40LzQuCDQstGL0L/Qu9Cw0YLQsNC80LguDQpDVU1QUklOQwkJPSDQntCR0KnQlNCe0KXQntCUCQkJCSMjCdCS0L7Qt9Cy0YDQsNGJ0LDQtdGCINC+0LHRidGD0Y4g0LLRi9C/0LvQsNGC0YMg0L/QviDQt9Cw0LnQvNGDINC80LXQttC00YMg0LTQstGD0LzRjyDQv9C10YDQuNC+0LTQsNC80LguDQpEQgkJCT0g0KTQo9CeCQkJCQkjIwnQktC+0LfQstGA0LDRidCw0LXRgiDQstC10LvQuNGH0LjQvdGDINCw0LzQvtGA0YLQuNC30LDRhtC40Lgg0LDQutGC0LjQstCwINC00LvRjyDQt9Cw0LTQsNC90L3QvtCz0L4g0L/QtdGA0LjQvtC00LAsINGA0LDRgdGB0YfQuNGC0LDQvdC90YPRjiDQvNC10YLQvtC00L7QvCDRhNC40LrRgdC40YDQvtCy0LDQvdC90L7Qs9C+INGD0LzQtdC90YzRiNC10L3QuNGPINC+0YHRgtCw0YLQutCwLg0KRERCCQkJPSDQlNCU0J7QkQkJCQkJIyMJ0JLQvtC30LLRgNCw0YnQsNC10YIg0LLQtdC70LjRh9C40L3RgyDQsNC80L7RgNGC0LjQt9Cw0YbQuNC4INCw0LrRgtC40LLQsCDQt9CwINC00LDQvdC90YvQuSDQv9C10YDQuNC+0LQsINC40YHQv9C+0LvRjNC30YPRjyDQvNC10YLQvtC0INC00LLQvtC50L3QvtCz0L4g0YPQvNC10L3RjNGI0LXQvdC40Y8g0L7RgdGC0LDRgtC60LAg0LjQu9C4INC40L3QvtC5INGP0LLQvdC+INGD0LrQsNC30LDQvdC90YvQuSDQvNC10YLQvtC0Lg0KRElTQwkJCT0g0KHQmtCY0JTQmtCQCQkJCSMjCdCS0L7Qt9Cy0YDQsNGJ0LDQtdGCINC90L7RgNC80YMg0YHQutC40LTQutC4INC00LvRjyDRhtC10L3QvdGL0YUg0LHRg9C80LDQsy4NCkRPTExBUkRFCQk9INCg0KPQkdCb0Kwu0JTQldChCQkJCSMjCdCf0YDQtdC+0LHRgNCw0LfRg9C10YIg0YbQtdC90YMg0LIg0YDRg9Cx0LvRj9GFLCDQstGL0YDQsNC20LXQvdC90YPRjiDQsiDQstC40LTQtSDQtNGA0L7QsdC4LCDQsiDRhtC10L3RgyDQsiDRgNGD0LHQu9GP0YUsINCy0YvRgNCw0LbQtdC90L3Rg9GOINC00LXRgdGP0YLQuNGH0L3Ri9C8INGH0LjRgdC70L7QvC4NCkRPTExBUkZSCQk9INCg0KPQkdCb0Kwu0JTQoNCe0JHQrAkJCQkjIwnQn9GA0LXQvtCx0YDQsNC30YPQtdGCINGG0LXQvdGDINCyINGA0YPQsdC70Y/RhSwg0LLRi9GA0LDQttC10L3QvdGD0Y4g0LTQtdGB0Y/RgtC40YfQvdGL0Lwg0YfQuNGB0LvQvtC8LCDQsiDRhtC10L3RgyDQsiDRgNGD0LHQu9GP0YUsINCy0YvRgNCw0LbQtdC90L3Rg9GOINCyINCy0LjQtNC1INC00YDQvtCx0LguDQpEVVJBVElPTgkJPSDQlNCb0JjQogkJCQkJIyMJ0JLQvtC30LLRgNCw0YnQsNC10YIg0LXQttC10LPQvtC00L3Rg9GOINC/0YDQvtC00L7Qu9C20LjRgtC10LvRjNC90L7RgdGC0Ywg0LTQtdC50YHRgtCy0LjRjyDRhtC10L3QvdGL0YUg0LHRg9C80LDQsyDRgSDQv9C10YDQuNC+0LTQuNGH0LXRgdC60LjQvNC4INCy0YvQv9C70LDRgtCw0LzQuCDQv9C+INC/0YDQvtGG0LXQvdGC0LDQvC4NCkVGRkVDVAkJCT0g0K3QpNCk0JXQmtCiCQkJCSMjCdCS0L7Qt9Cy0YDQsNGJ0LDQtdGCINC00LXQudGB0YLQstGD0Y7RidC40LUg0LXQttC10LPQvtC00L3Ri9C1INC/0YDQvtGG0LXQvdGC0L3Ri9C1INGB0YLQsNCy0LrQuC4NCkZWCQkJPSDQkdChCQkJCQkjIwnQktC+0LfQstGA0LDRidCw0LXRgiDQsdGD0LTRg9GJ0YPRjiDRgdGC0L7QuNC80L7RgdGC0Ywg0LjQvdCy0LXRgdGC0LjRhtC40LguDQpGVlNDSEVEVUxFCQk9INCR0JfQoNCQ0KHQn9CY0KEJCQkJIyMJ0JLQvtC30LLRgNCw0YnQsNC10YIg0LHRg9C00YPRidGD0Y4g0YHRgtC+0LjQvNC+0YHRgtGMINC/0LXRgNCy0L7QvdCw0YfQsNC70YzQvdC+0Lkg0L7RgdC90L7QstC90L7QuSDRgdGD0LzQvNGLINC/0L7RgdC70LUg0L3QsNGH0LjRgdC70LXQvdC40Y8g0YDRj9C00LAg0YHQu9C+0LbQvdGL0YUg0L/RgNC+0YbQtdC90YLQvtCyLg0KSU5UUkFURQkJCT0g0JjQndCe0KDQnNCQCQkJCSMjCdCS0L7Qt9Cy0YDQsNGJ0LDQtdGCINC/0YDQvtGG0LXQvdGC0L3Rg9GOINGB0YLQsNCy0LrRgyDQtNC70Y8g0L/QvtC70L3QvtGB0YLRjNGOINC40L3QstC10YHRgtC40YDQvtCy0LDQvdC90YvRhSDRhtC10L3QvdGL0YUg0LHRg9C80LDQsy4NCklQTVQJCQk9INCf0KDQn9Cb0KIJCQkJCSMjCdCS0L7Qt9Cy0YDQsNGJ0LDQtdGCINCy0LXQu9C40YfQuNC90YMg0LLRi9C/0LvQsNGC0Ysg0L/RgNC40LHRi9C70Lgg0L3QsCDQstC70L7QttC10L3QuNGPINC30LAg0LTQsNC90L3Ri9C5INC/0LXRgNC40L7QtC4NCklSUgkJCT0g0JLQodCUCQkJCQkjIwnQktC+0LfQstGA0LDRidCw0LXRgiDQstC90YPRgtGA0LXQvdC90Y7RjiDRgdGC0LDQstC60YMg0LTQvtGF0L7QtNC90L7RgdGC0Lgg0LTQu9GPINGA0Y/QtNCwINC/0L7RgtC+0LrQvtCyINC00LXQvdC10LbQvdGL0YUg0YHRgNC10LTRgdGC0LIuDQpJU1BNVAkJCT0g0J/QoNCe0KbQn9Cb0JDQogkJCQkjIwnQktGL0YfQuNGB0LvRj9C10YIg0LLRi9C/0LvQsNGC0Ysg0LfQsCDRg9C60LDQt9Cw0L3QvdGL0Lkg0L/QtdGA0LjQvtC0INC40L3QstC10YHRgtC40YbQuNC4Lg0KTURVUkFUSU9OCQk9INCc0JTQm9CY0KIJCQkJCSMjCdCS0L7Qt9Cy0YDQsNGJ0LDQtdGCINC80L7QtNC40YTQuNGG0LjRgNC+0LLQsNC90L3Rg9GOINC00LvQuNGC0LXQu9GM0L3QvtGB0YLRjCDQnNCw0LrQvtC70LXRjyDQtNC70Y8g0YbQtdC90L3Ri9GFINCx0YPQvNCw0LMg0YEg0L/RgNC10LTQv9C+0LvQsNCz0LDQtdC80L7QuSDQvdC+0LzQuNC90LDQu9GM0L3QvtC5INGB0YLQvtC40LzQvtGB0YLRjNGOIDEwMCDRgNGD0LHQu9C10LkuDQpNSVJSCQkJPSDQnNCS0KHQlAkJCQkJIyMJ0JLQvtC30LLRgNCw0YnQsNC10YIg0LLQvdGD0YLRgNC10L3QvdGO0Y4g0YHRgtCw0LLQutGDINC00L7RhdC+0LTQvdC+0YHRgtC4LCDQv9GA0Lgg0LrQvtGC0L7RgNC+0Lkg0L/QvtC70L7QttC40YLQtdC70YzQvdGL0LUg0Lgg0L7RgtGA0LjRhtCw0YLQtdC70YzQvdGL0LUg0LTQtdC90LXQttC90YvQtSDQv9C+0YLQvtC60Lgg0LjQvNC10Y7RgiDRgNCw0LfQvdGL0LUg0LfQvdCw0YfQtdC90LjRjyDRgdGC0LDQstC60LguDQpOT01JTkFMCQkJPSDQndCe0JzQmNCd0JDQmwkJCQkjIwnQktC+0LfQstGA0LDRidCw0LXRgiDQvdC+0LzQuNC90LDQu9GM0L3Rg9GOINCz0L7QtNC+0LLRg9GOINC/0YDQvtGG0LXQvdGC0L3Rg9GOINGB0YLQsNCy0LrRgy4NCk5QRVIJCQk9INCa0J/QldCgCQkJCQkjIwnQktC+0LfQstGA0LDRidCw0LXRgiDQvtCx0YnQtdC1INC60L7Qu9C40YfQtdGB0YLQstC+INC/0LXRgNC40L7QtNC+0LIg0LLRi9C/0LvQsNGC0Ysg0LTQu9GPINC00LDQvdC90L7Qs9C+INCy0LrQu9Cw0LTQsC4NCk5QVgkJCT0g0KfQn9ChCQkJCQkjIwnQktC+0LfQstGA0LDRidCw0LXRgiDRh9C40YHRgtGD0Y4g0L/RgNC40LLQtdC00LXQvdC90YPRjiDRgdGC0L7QuNC80L7RgdGC0Ywg0LjQvdCy0LXRgdGC0LjRhtC40LgsINC+0YHQvdC+0LLQsNC90L3QvtC5INC90LAg0YHQtdGA0LjQuCDQv9C10YDQuNC+0LTQuNGH0LXRgdC60LjRhSDQtNC10L3QtdC20L3Ri9GFINC/0L7RgtC+0LrQvtCyINC4INGB0YLQsNCy0LrQtSDQtNC40YHQutC+0L3RgtC40YDQvtCy0LDQvdC40Y8uDQpPRERGUFJJQ0UJCT0g0KbQldCd0JDQn9CV0KDQktCd0JXQoNCV0JMJCQkJIyMJ0JLQvtC30LLRgNCw0YnQsNC10YIg0YbQtdC90YMg0LfQsCAxMDAg0YDRg9Cx0LvQtdC5INC90LDRgNC40YbQsNGC0LXQu9GM0L3QvtC5INGB0YLQvtC40LzQvtGB0YLQuCDRhtC10L3QvdGL0YUg0LHRg9C80LDQsyDRgSDQvdC10YDQtdCz0YPQu9GP0YDQvdGL0Lwg0L/QtdGA0LLRi9C8INC/0LXRgNC40L7QtNC+0LwuDQpPRERGWUlFTEQJCT0g0JTQntCl0J7QlNCf0JXQoNCS0J3QldCg0JXQkwkJCSMjCdCS0L7Qt9Cy0YDQsNGJ0LDQtdGCINC00L7RhdC+0LQg0L/QviDRhtC10L3QvdGL0Lwg0LHRg9C80LDQs9Cw0Lwg0YEg0L3QtdGA0LXQs9GD0LvRj9GA0L3Ri9C8INC/0LXRgNCy0YvQvCDQv9C10YDQuNC+0LTQvtC8Lg0KT0RETFBSSUNFCQk9INCm0JXQndCQ0J/QntCh0JvQndCV0KDQldCTCQkJCSMjCdCS0L7Qt9Cy0YDQsNGJ0LDQtdGCINGG0LXQvdGDINC30LAgMTAwINGA0YPQsdC70LXQuSDQvdCw0YDQuNGG0LDRgtC10LvRjNC90L7QuSDRgdGC0L7QuNC80L7RgdGC0Lgg0YbQtdC90L3Ri9GFINCx0YPQvNCw0LMg0YEg0L3QtdGA0LXQs9GD0LvRj9GA0L3Ri9C8INC/0L7RgdC70LXQtNC90LjQvCDQv9C10YDQuNC+0LTQvtC8Lg0KT0RETFlJRUxECQk9INCU0J7QpdCe0JTQn9Ce0KHQm9Cd0JXQoNCV0JMJCQkjIwnQktC+0LfQstGA0LDRidCw0LXRgiDQtNC+0YXQvtC0INC/0L4g0YbQtdC90L3Ri9C8INCx0YPQvNCw0LPQsNC8INGBINC90LXRgNC10LPRg9C70Y/RgNC90YvQvCDQv9C+0YHQu9C10LTQvdC40Lwg0L/QtdGA0LjQvtC00L7QvC4NClBNVAkJCT0g0J/Qm9CiCQkJCQkjIwnQktC+0LfQstGA0LDRidCw0LXRgiDQstC10LvQuNGH0LjQvdGDINCy0YvQv9C70LDRgtGLINC30LAg0L7QtNC40L0g0L/QtdGA0LjQvtC0INCw0L3QvdGD0LjRgtC10YLQsC4NClBQTVQJCQk9INCe0KHQn9Cb0KIJCQkJCSMjCdCS0L7Qt9Cy0YDQsNGJ0LDQtdGCINCy0LXQu9C40YfQuNC90YMg0LLRi9C/0LvQsNGCINCyINC/0L7Qs9Cw0YjQtdC90LjQtSDQvtGB0L3QvtCy0L3QvtC5INGB0YPQvNC80Ysg0L/QviDQuNC90LLQtdGB0YLQuNGG0LjQuCDQt9CwINC30LDQtNCw0L3QvdGL0Lkg0L/QtdGA0LjQvtC0Lg0KUFJJQ0UJCQk9INCm0JXQndCQCQkJCQkjIwnQktC+0LfQstGA0LDRidCw0LXRgiDRhtC10L3RgyDQt9CwIDEwMCDRgNGD0LHQu9C10Lkg0L3QsNGA0LjRhtCw0YLQtdC70YzQvdC+0Lkg0YHRgtC+0LjQvNC+0YHRgtC4INGG0LXQvdC90YvRhSDQsdGD0LzQsNCzLCDQv9C+INC60L7RgtC+0YDRi9C8INC/0YDQvtC40LfQstC+0LTQuNGC0YHRjyDQv9C10YDQuNC+0LTQuNGH0LXRgdC60LDRjyDQstGL0L/Qu9Cw0YLQsCDQv9GA0L7RhtC10L3RgtC+0LIuDQpQUklDRURJU0MJCT0g0KbQldCd0JDQodCa0JjQlNCa0JAJCQkJIyMJ0JLQvtC30LLRgNCw0YnQsNC10YIg0YbQtdC90YMg0LfQsCAxMDAg0YDRg9Cx0LvQtdC5INC90L7QvNC40L3QsNC70YzQvdC+0Lkg0YHRgtC+0LjQvNC+0YHRgtC4INGG0LXQvdC90YvRhSDQsdGD0LzQsNCzLCDQvdCwINC60L7RgtC+0YDRi9C1INGB0LTQtdC70LDQvdCwINGB0LrQuNC00LrQsC4NClBSSUNFTUFUCQk9INCm0JXQndCQ0J/QntCT0JDQqAkJCQkjIwnQktC+0LfQstGA0LDRidCw0LXRgiDRhtC10L3RgyDQt9CwIDEwMCDRgNGD0LHQu9C10Lkg0L3QvtC80LjQvdCw0LvRjNC90L7QuSDRgdGC0L7QuNC80L7RgdGC0Lgg0YbQtdC90L3Ri9GFINCx0YPQvNCw0LMsINC/0YDQvtGG0LXQvdGC0Ysg0L/QviDQutC+0YLQvtGA0YvQvCDQstGL0L/Qu9Cw0YfQuNCy0LDRjtGC0YHRjyDQsiDRgdGA0L7QuiDQv9C+0LPQsNGI0LXQvdC40Y8uDQpQVgkJCT0g0J/QoQkJCQkJIyMJ0JLQvtC30LLRgNCw0YnQsNC10YIg0L/RgNC40LLQtdC00LXQvdC90YPRjiAo0Log0YLQtdC60YPRidC10LzRgyDQvNC+0LzQtdC90YLRgykg0YHRgtC+0LjQvNC+0YHRgtGMINC40L3QstC10YHRgtC40YbQuNC4Lg0KUkFURQkJCT0g0KHQotCQ0JLQmtCQCQkJCSMjCdCS0L7Qt9Cy0YDQsNGJ0LDQtdGCINC/0YDQvtGG0LXQvdGC0L3Rg9GOINGB0YLQsNCy0LrRgyDQv9C+INCw0L3QvdGD0LjRgtC10YLRgyDQt9CwINC+0LTQuNC9INC/0LXRgNC40L7QtC4NClJFQ0VJVkVECQk9INCf0J7Qm9Cj0KfQldCd0J4JCQkJIyMJ0JLQvtC30LLRgNCw0YnQsNC10YIg0YHRg9C80LzRgywg0L/QvtC70YPRh9C10L3QvdGD0Y4g0Log0YHRgNC+0LrRgyDQv9C+0LPQsNGI0LXQvdC40Y8g0L/QvtC70L3QvtGB0YLRjNGOINC+0LHQtdGB0L/QtdGH0LXQvdC90YvRhSDRhtC10L3QvdGL0YUg0LHRg9C80LDQsy4NClNMTgkJCT0g0JDQn9CbCQkJCQkjIwnQktC+0LfQstGA0LDRidCw0LXRgiDQstC10LvQuNGH0LjQvdGDINC70LjQvdC10LnQvdC+0Lkg0LDQvNC+0YDRgtC40LfQsNGG0LjQuCDQsNC60YLQuNCy0LAg0LfQsCDQvtC00LjQvSDQv9C10YDQuNC+0LQuDQpTWUQJCQk9INCQ0KHQpwkJCQkJIyMJ0JLQvtC30LLRgNCw0YnQsNC10YIg0LLQtdC70LjRh9C40L3RgyDQsNC80L7RgNGC0LjQt9Cw0YbQuNC4INCw0LrRgtC40LLQsCDQt9CwINC00LDQvdC90YvQuSDQv9C10YDQuNC+0LQsINGA0LDRgdGB0YfQuNGC0LDQvdC90YPRjiDQvNC10YLQvtC00L7QvCDRgdGD0LzQvNGLINCz0L7QtNC+0LLRi9GFINGH0LjRgdC10LsuDQpUQklMTEVRCQkJPSDQoNCQ0JLQndCe0JrQp9CV0JoJCQkJIyMJ0JLQvtC30LLRgNCw0YnQsNC10YIg0Y3QutCy0LjQstCw0LvQtdC90YLQvdGL0Lkg0L7QsdC70LjQs9Cw0YbQuNC4INC00L7RhdC+0LQg0L/QviDQutCw0LfQvdCw0YfQtdC50YHQutC+0LzRgyDRh9C10LrRgy4NClRCSUxMUFJJQ0UJCT0g0KbQldCd0JDQmtCn0JXQmgkJCQkjIwnQktC+0LfQstGA0LDRidCw0LXRgiDRhtC10L3RgyDQt9CwIDEwMCDRgNGD0LHQu9C10Lkg0L3QsNGA0LjRhtCw0YLQtdC70YzQvdC+0Lkg0YHRgtC+0LjQvNC+0YHRgtC4INC00LvRjyDQutCw0LfQvdCw0YfQtdC50YHQutC+0LPQviDRh9C10LrQsC4NClRCSUxMWUlFTEQJCT0g0JTQntCl0J7QlNCa0KfQldCaCQkJCSMjCdCS0L7Qt9Cy0YDQsNGJ0LDQtdGCINC00L7RhdC+0LQg0L/QviDQutCw0LfQvdCw0YfQtdC50YHQutC+0LzRgyDRh9C10LrRgy4NClZEQgkJCT0g0J/Qo9CeCQkJCQkjIwnQktC+0LfQstGA0LDRidCw0LXRgiDQstC10LvQuNGH0LjQvdGDINCw0LzQvtGA0YLQuNC30LDRhtC40Lgg0LDQutGC0LjQstCwINC00LvRjyDRg9C60LDQt9Cw0L3QvdC+0LPQviDQuNC70Lgg0YfQsNGB0YLQuNGH0L3QvtCz0L4g0L/QtdGA0LjQvtC00LAg0L/RgNC4INC40YHQv9C+0LvRjNC30L7QstCw0L3QuNC4INC80LXRgtC+0LTQsCDRgdC+0LrRgNCw0YnQsNGO0YnQtdCz0L7RgdGPINCx0LDQu9Cw0L3RgdCwLg0KWElSUgkJCT0g0KfQmNCh0KLQktCd0JTQntClCQkJCSMjCdCS0L7Qt9Cy0YDQsNGJ0LDQtdGCINCy0L3Rg9GC0YDQtdC90L3RjtGOINGB0YLQsNCy0LrRgyDQtNC+0YXQvtC00L3QvtGB0YLQuCDQtNC70Y8g0LPRgNCw0YTQuNC60LAg0LTQtdC90LXQttC90YvRhSDQv9C+0YLQvtC60L7Qsiwg0LrQvtGC0L7RgNGL0LUg0L3QtSDQvtCx0Y/Qt9Cw0YLQtdC70YzQvdC+INC90L7RgdGP0YIg0L/QtdGA0LjQvtC00LjRh9C10YHQutC40Lkg0YXQsNGA0LDQutGC0LXRgC4NClhOUFYJCQk9INCn0JjQodCi0J3QlwkJCQkjIwnQktC+0LfQstGA0LDRidCw0LXRgiDRh9C40YHRgtGD0Y4g0L/RgNC40LLQtdC00LXQvdC90YPRjiDRgdGC0L7QuNC80L7RgdGC0Ywg0LTQu9GPINC00LXQvdC10LbQvdGL0YUg0L/QvtGC0L7QutC+0LIsINC60L7RgtC+0YDRi9C1INC90LUg0L7QsdGP0LfQsNGC0LXQu9GM0L3QviDRj9Cy0LvRj9GO0YLRgdGPINC/0LXRgNC40L7QtNC40YfQtdGB0LrQuNC80LguDQpZSUVMRAkJCT0g0JTQntCl0J7QlAkJCQkJIyMJ0JLQvtC30LLRgNCw0YnQsNC10YIg0LTQvtGF0L7QtCDQvtGCINGG0LXQvdC90YvRhSDQsdGD0LzQsNCzLCDQv9C+INC60L7RgtC+0YDRi9C8INC/0YDQvtC40LfQstC+0LTRj9GC0YHRjyDQv9C10YDQuNC+0LTQuNGH0LXRgdC60LjQtSDQstGL0L/Qu9Cw0YLRiyDQv9GA0L7RhtC10L3RgtC+0LIuDQpZSUVMRERJU0MJCT0g0JTQntCl0J7QlNCh0JrQmNCU0JrQkAkJCQkjIwnQktC+0LfQstGA0LDRidCw0LXRgiDQs9C+0LTQvtCy0L7QuSDQtNC+0YXQvtC0INC/0L4g0YbQtdC90L3Ri9C8INCx0YPQvNCw0LPQsNC8LCDQvdCwINC60L7RgtC+0YDRi9C1INGB0LTQtdC70LDQvdCwINGB0LrQuNC00LrQsCAo0L/RgNC40LzQtdGAIOKAlCDQutCw0LfQvdCw0YfQtdC50YHQutC40LUg0YfQtdC60LgpLg0KWUlFTERNQVQJCT0g0JTQntCl0J7QlNCf0J7Qk9CQ0KgJCQkJIyMJ0JLQvtC30LLRgNCw0YnQsNC10YIg0LPQvtC00L7QstC+0Lkg0LTQvtGF0L7QtCDQvtGCINGG0LXQvdC90YvRhSDQsdGD0LzQsNCzLCDQv9GA0L7RhtC10L3RgtGLINC/0L4g0LrQvtGC0L7RgNGL0Lwg0LLRi9C/0LvQsNGH0LjQstCw0Y7RgtGB0Y8g0LIg0YHRgNC+0Log0L/QvtCz0LDRiNC10L3QuNGPLg0KDQoNCiMjDQojIwlJbmZvcm1hdGlvbiBmdW5jdGlvbnMJCQkJCdCY0L3RhNC+0YDQvNCw0YbQuNC+0L3QvdGL0LUg0YTRg9C90LrRhtC40LgNCiMjDQpDRUxMCQkJPSDQr9Cn0JXQmdCa0JAJCQkJIyMJ0JLQvtC30LLRgNCw0YnQsNC10YIg0LjQvdGE0L7RgNC80LDRhtC40Y4g0L4g0YTQvtGA0LzQsNGC0LUsINGA0LDRgdC/0L7Qu9C+0LbQtdC90LjQuCDQuNC70Lgg0YHQvtC00LXRgNC20LjQvNC+0Lwg0Y/Rh9C10LnQutC4Lg0KRVJST1IuVFlQRQkJPSDQotCY0J8u0J7QqNCY0JHQmtCYCQkJCSMjCdCS0L7Qt9Cy0YDQsNGJ0LDQtdGCINGH0LjRgdC70L7QstC+0Lkg0LrQvtC0LCDRgdC+0L7RgtCy0LXRgtGB0YLQstGD0Y7RidC40Lkg0YLQuNC/0YMg0L7RiNC40LHQutC4Lg0KSU5GTwkJCT0g0JjQndCk0J7QoNCcCQkJCSMjCdCS0L7Qt9Cy0YDQsNGJ0LDQtdGCINC40L3RhNC+0YDQvNCw0YbQuNGOINC+INGC0LXQutGD0YnQtdC5INC+0L/QtdGA0LDRhtC40L7QvdC90L7QuSDRgdGA0LXQtNC1Lg0KSVNCTEFOSwkJCT0g0JXQn9Cj0KHQotCeCQkJCSMjCdCS0L7Qt9Cy0YDQsNGJ0LDQtdGCINC30L3QsNGH0LXQvdC40LUg0JjQodCi0JjQndCQLCDQtdGB0LvQuCDQsNGA0LPRg9C80LXQvdGCINGP0LLQu9GP0LXRgtGB0Y8g0YHRgdGL0LvQutC+0Lkg0L3QsCDQv9GD0YHRgtGD0Y4g0Y/Rh9C10LnQutGDLg0KSVNFUlIJCQk9INCV0J7QqAkJCQkJIyMJ0JLQvtC30LLRgNCw0YnQsNC10YIg0LfQvdCw0YfQtdC90LjQtSDQmNCh0KLQmNCd0JAsINC10YHQu9C4INCw0YDQs9GD0LzQtdC90YIg0YHRgdGL0LvQsNC10YLRgdGPINC90LAg0LvRjtCx0L7QtSDQt9C90LDRh9C10L3QuNC1INC+0YjQuNCx0LrQuCwg0LrRgNC+0LzQtSAj0J0v0JQuDQpJU0VSUk9SCQkJPSDQldCe0KjQmNCR0JrQkAkJCQkjIwnQktC+0LfQstGA0LDRidCw0LXRgiDQt9C90LDRh9C10L3QuNC1INCY0KHQotCY0J3QkCwg0LXRgdC70Lgg0LDRgNCz0YPQvNC10L3RgiDRgdGB0YvQu9Cw0LXRgtGB0Y8g0L3QsCDQu9GO0LHQvtC1INC30L3QsNGH0LXQvdC40LUg0L7RiNC40LHQutC4Lg0KSVNFVkVOCQkJPSDQldCn0IHQotCdCQkJCQkjIwnQktC+0LfQstGA0LDRidCw0LXRgiDQt9C90LDRh9C10L3QuNC1INCY0KHQotCY0J3QkCwg0LXRgdC70Lgg0LfQvdCw0YfQtdC90LjQtSDQsNGA0LPRg9C80LXQvdGC0LAg0Y/QstC70Y/QtdGC0YHRjyDRh9C10YLQvdGL0Lwg0YfQuNGB0LvQvtC8Lg0KSVNMT0dJQ0FMCQk9INCV0JvQntCT0JjQpwkJCQkjIwnQktC+0LfQstGA0LDRidCw0LXRgiDQt9C90LDRh9C10L3QuNC1INCY0KHQotCY0J3QkCwg0LXRgdC70Lgg0LDRgNCz0YPQvNC10L3RgiDRgdGB0YvQu9Cw0LXRgtGB0Y8g0L3QsCDQu9C+0LPQuNGH0LXRgdC60L7QtSDQt9C90LDRh9C10L3QuNC1Lg0KSVNOQQkJCT0g0JXQndCUCQkJCQkjIwnQktC+0LfQstGA0LDRidCw0LXRgiDQt9C90LDRh9C10L3QuNC1INCY0KHQotCY0J3QkCwg0LXRgdC70Lgg0LDRgNCz0YPQvNC10L3RgiDRgdGB0YvQu9Cw0LXRgtGB0Y8g0L3QsCDQt9C90LDRh9C10L3QuNC1INC+0YjQuNCx0LrQuCAj0J0v0JQuDQpJU05PTlRFWFQJCT0g0JXQndCV0KLQldCa0KHQogkJCQkjIwnQktC+0LfQstGA0LDRidCw0LXRgiDQt9C90LDRh9C10L3QuNC1INCY0KHQotCY0J3QkCwg0LXRgdC70Lgg0LfQvdCw0YfQtdC90LjQtSDQsNGA0LPRg9C80LXQvdGC0LAg0L3QtSDRj9Cy0LvRj9C10YLRgdGPINGC0LXQutGB0YLQvtC8Lg0KSVNOVU1CRVIJCT0g0JXQp9CY0KHQm9CeCQkJCSMjCdCS0L7Qt9Cy0YDQsNGJ0LDQtdGCINC30L3QsNGH0LXQvdC40LUg0JjQodCi0JjQndCQLCDQtdGB0LvQuCDQsNGA0LPRg9C80LXQvdGCINGB0YHRi9C70LDQtdGC0YHRjyDQvdCwINGH0LjRgdC70L4uDQpJU09ERAkJCT0g0JXQndCV0KfQgdCiCQkJCSMjCdCS0L7Qt9Cy0YDQsNGJ0LDQtdGCINC30L3QsNGH0LXQvdC40LUg0JjQodCi0JjQndCQLCDQtdGB0LvQuCDQt9C90LDRh9C10L3QuNC1INCw0YDQs9GD0LzQtdC90YLQsCDRj9Cy0LvRj9C10YLRgdGPINC90LXRh9C10YLQvdGL0Lwg0YfQuNGB0LvQvtC8Lg0KSVNSRUYJCQk9INCV0KHQodCr0JvQmtCQCQkJCSMjCdCS0L7Qt9Cy0YDQsNGJ0LDQtdGCINC30L3QsNGH0LXQvdC40LUg0JjQodCi0JjQndCQLCDQtdGB0LvQuCDQt9C90LDRh9C10L3QuNC1INCw0YDQs9GD0LzQtdC90YLQsCDRj9Cy0LvRj9C10YLRgdGPINGB0YHRi9C70LrQvtC5Lg0KSVNURVhUCQkJPSDQldCi0JXQmtCh0KIJCQkJIyMJ0JLQvtC30LLRgNCw0YnQsNC10YIg0LfQvdCw0YfQtdC90LjQtSDQmNCh0KLQmNCd0JAsINC10YHQu9C4INC30L3QsNGH0LXQvdC40LUg0LDRgNCz0YPQvNC10L3RgtCwINGP0LLQu9GP0LXRgtGB0Y8g0YLQtdC60YHRgtC+0LwuDQpOCQkJPSDQpwkJCQkJIyMJ0JLQvtC30LLRgNCw0YnQsNC10YIg0LfQvdCw0YfQtdC90LjQtSwg0L/RgNC10L7QsdGA0LDQt9C+0LLQsNC90L3QvtC1INCyINGH0LjRgdC70L4uDQpOQQkJCT0g0J3QlAkJCQkJIyMJ0JLQvtC30LLRgNCw0YnQsNC10YIg0LfQvdCw0YfQtdC90LjQtSDQvtGI0LjQsdC60LggI9CdL9CULg0KVFlQRQkJCT0g0KLQmNCfCQkJCQkjIwnQktC+0LfQstGA0LDRidCw0LXRgiDRh9C40YHQu9C+LCDQvtCx0L7Qt9C90LDRh9Cw0Y7RidC10LUg0YLQuNC/INC00LDQvdC90YvRhSDQt9C90LDRh9C10L3QuNGPLg0KDQoNCiMjDQojIwlMb2dpY2FsIGZ1bmN0aW9ucwkJCQkJ0JvQvtCz0LjRh9C10YHQutC40LUg0YTRg9C90LrRhtC40LgNCiMjDQpBTkQJCQk9INCYCQkJCQkjIwlSZW52b2llIFZSQUkgc2kgdG91cyBzZXMgYXJndW1lbnRzIHNvbnQgVlJBSS4NCkZBTFNFCQkJPSDQm9Ce0JbQrAkJCQkJIyMJ0JLQvtC30LLRgNCw0YnQsNC10YIg0LvQvtCz0LjRh9C10YHQutC+0LUg0LfQvdCw0YfQtdC90LjQtSDQm9Ce0JbQrC4NCklGCQkJPSDQldCh0JvQmAkJCQkJIyMJ0JLRi9C/0L7Qu9C90Y/QtdGCINC/0YDQvtCy0LXRgNC60YMg0YPRgdC70L7QstC40Y8uDQpJRkVSUk9SCQkJPSDQldCh0JvQmNCe0KjQmNCR0JrQkAkJCQkjIwnQktC+0LfQstGA0LDRidCw0LXRgiDQstCy0LXQtNGR0L3QvdC+0LUg0LfQvdCw0YfQtdC90LjQtSwg0LXRgdC70Lgg0LLRi9GH0LjRgdC70LXQvdC40LUg0L/QviDRhNC+0YDQvNGD0LvQtSDQstGL0LfRi9Cy0LDQtdGCINC+0YjQuNCx0LrRgzsg0LIg0L/RgNC+0YLQuNCy0L3QvtC8INGB0LvRg9GH0LDQtSDRhNGD0L3QutGG0LjRjyDQstC+0LfQstGA0LDRidCw0LXRgiDRgNC10LfRg9C70YzRgtCw0YIg0LLRi9GH0LjRgdC70LXQvdC40Y8uDQpOT1QJCQk9INCd0JUJCQkJCSMjCdCc0LXQvdGP0LXRgiDQu9C+0LPQuNGH0LXRgdC60L7QtSDQt9C90LDRh9C10L3QuNC1INGB0LLQvtC10LPQviDQsNGA0LPRg9C80LXQvdGC0LAg0L3QsCDQv9GA0L7RgtC40LLQvtC/0L7Qu9C+0LbQvdC+0LUuDQpPUgkJCT0g0JjQm9CYCQkJCQkjIwnQktC+0LfQstGA0LDRidCw0LXRgiDQt9C90LDRh9C10L3QuNC1INCY0KHQotCY0J3QkCwg0LXRgdC70Lgg0YXQvtGC0Y8g0LHRiyDQvtC00LjQvSDQsNGA0LPRg9C80LXQvdGCINC40LzQtdC10YIg0LfQvdCw0YfQtdC90LjQtSDQmNCh0KLQmNCd0JAuDQpUUlVFCQkJPSDQmNCh0KLQmNCd0JAJCQkJIyMJ0JLQvtC30LLRgNCw0YnQsNC10YIg0LvQvtCz0LjRh9C10YHQutC+0LUg0LfQvdCw0YfQtdC90LjQtSDQmNCh0KLQmNCd0JAuDQoNCg0KIyMNCiMjCUxvb2t1cCBhbmQgcmVmZXJlbmNlIGZ1bmN0aW9ucwkJCQnQpNGD0L3QutGG0LjQuCDRgdGB0YvQu9C60Lgg0Lgg0L/QvtC40YHQutCwDQojIw0KQUREUkVTUwkJCT0g0JDQlNCg0JXQoQkJCQkJIyMJ0JLQvtC30LLRgNCw0YnQsNC10YIg0YHRgdGL0LvQutGDINC90LAg0L7RgtC00LXQu9GM0L3Rg9GOINGP0YfQtdC50LrRgyDQu9C40YHRgtCwINCyINCy0LjQtNC1INGC0LXQutGB0YLQsC4NCkFSRUFTCQkJPSDQntCR0JvQkNCh0KLQmAkJCQkjIwnQktC+0LfQstGA0LDRidCw0LXRgiDQutC+0LvQuNGH0LXRgdGC0LLQviDQvtCx0LvQsNGB0YLQtdC5INCyINGB0YHRi9C70LrQtS4NCkNIT09TRQkJCT0g0JLQq9CR0J7QoAkJCQkJIyMJ0JLRi9Cx0LjRgNCw0LXRgiDQt9C90LDRh9C10L3QuNC1INC40Lcg0YHQv9C40YHQutCwINC30L3QsNGH0LXQvdC40Lkg0L/QviDQuNC90LTQtdC60YHRgy4NCkNPTFVNTgkJCT0g0KHQotCe0JvQkdCV0KYJCQkJIyMJ0JLQvtC30LLRgNCw0YnQsNC10YIg0L3QvtC80LXRgCDRgdGC0L7Qu9Cx0YbQsCwg0L3QsCDQutC+0YLQvtGA0YvQuSDRg9C60LDQt9GL0LLQsNC10YIg0YHRgdGL0LvQutCwLg0KQ09MVU1OUwkJCT0g0KfQmNCh0JvQodCi0J7Qm9CRCQkJCSMjCdCS0L7Qt9Cy0YDQsNGJ0LDQtdGCINC60L7Qu9C40YfQtdGB0YLQstC+INGB0YLQvtC70LHRhtC+0LIg0LIg0YHRgdGL0LvQutC1Lg0KSExPT0tVUAkJCT0g0JPQn9CgCQkJCQkjIwnQmNGJ0LXRgiDQsiDQv9C10YDQstC+0Lkg0YHRgtGA0L7QutC1INC80LDRgdGB0LjQstCwINC4INCy0L7Qt9Cy0YDQsNGJ0LDQtdGCINC30L3QsNGH0LXQvdC40LUg0L7RgtC80LXRh9C10L3QvdC+0Lkg0Y/Rh9C10LnQutC4DQpIWVBFUkxJTksJCT0g0JPQmNCf0JXQoNCh0KHQq9Cb0JrQkAkJCQkjIwnQodC+0LfQtNCw0LXRgiDRgdGB0YvQu9C60YMsINC+0YLQutGA0YvQstCw0Y7RidGD0Y4g0LTQvtC60YPQvNC10L3Rgiwg0LrQvtGC0L7RgNGL0Lkg0L3QsNGF0L7QtNC40YLRgdGPINC90LAg0YHQtdGA0LLQtdGA0LUg0YHQtdGC0LgsINCyINC40L3RgtGA0LDRgdC10YLQuCDQuNC70Lgg0LIg0JjQvdGC0LXRgNC90LXRgtC1Lg0KSU5ERVgJCQk9INCY0J3QlNCV0JrQoQkJCQkjIwnQmNGB0L/QvtC70YzQt9GD0LXRgiDQuNC90LTQtdC60YEg0LTQu9GPINCy0YvQsdC+0YDQsCDQt9C90LDRh9C10L3QuNGPINC40Lcg0YHRgdGL0LvQutC4INC40LvQuCDQvNCw0YHRgdC40LLQsC4NCklORElSRUNUCQk9INCU0JLQodCh0KvQmwkJCQkjIwnQktC+0LfQstGA0LDRidCw0LXRgiDRgdGB0YvQu9C60YMsINC30LDQtNCw0L3QvdGD0Y4g0YLQtdC60YHRgtC+0LLRi9C8INC30L3QsNGH0LXQvdC40LXQvC4NCkxPT0tVUAkJCT0g0J/QoNCe0KHQnNCe0KLQoAkJCQkjIwnQmNGJ0LXRgiDQt9C90LDRh9C10L3QuNGPINCyINCy0LXQutGC0L7RgNC1INC40LvQuCDQvNCw0YHRgdC40LLQtS4NCk1BVENICQkJPSDQn9Ce0JjQodCa0J/QntCXCQkJCSMjCdCY0YnQtdGCINC30L3QsNGH0LXQvdC40Y8g0LIg0YHRgdGL0LvQutC1INC40LvQuCDQvNCw0YHRgdC40LLQtS4NCk9GRlNFVAkJCT0g0KHQnNCV0KkJCQkJCSMjCdCS0L7Qt9Cy0YDQsNGJ0LDQtdGCINGB0LzQtdGJ0LXQvdC40LUg0YHRgdGL0LvQutC4INC+0YLQvdC+0YHQuNGC0LXQu9GM0L3QviDQt9Cw0LTQsNC90L3QvtC5INGB0YHRi9C70LrQuC4NClJPVwkJCT0g0KHQotCg0J7QmtCQCQkJCSMjCdCS0L7Qt9Cy0YDQsNGJ0LDQtdGCINC90L7QvNC10YAg0YHRgtGA0L7QutC4LCDQvtC/0YDQtdC00LXQu9GP0LXQvNC+0Lkg0YHRgdGL0LvQutC+0LkuDQpST1dTCQkJPSDQp9Ch0KLQoNCe0JoJCQkJIyMJ0JLQvtC30LLRgNCw0YnQsNC10YIg0LrQvtC70LjRh9C10YHRgtCy0L4g0YHRgtGA0L7QuiDQsiDRgdGB0YvQu9C60LUuDQpSVEQJCQk9INCU0KDQkgkJCQkJIyMJ0JjQt9Cy0LvQtdC60LDQtdGCINC00LDQvdC90YvQtSDRgNC10LDQu9GM0L3QvtCz0L4g0LLRgNC10LzQtdC90Lgg0LjQtyDQv9GA0L7Qs9GA0LDQvNC8LCDQv9C+0LTQtNC10YDQttC40LLQsNGO0YnQuNGFINCw0LLRgtC+0LzQsNGC0LjQt9Cw0YbQuNGOIENPTSAo0J/RgNC+0LPRgNCw0LzQvNC40YDQvtCy0LDQvdC40LUg0L7QsdGK0LXQutGC0L7Qsi4g0KHRgtCw0L3QtNCw0YDRgtC90L7QtSDRgdGA0LXQtNGB0YLQstC+INC00LvRjyDRgNCw0LHQvtGC0Ysg0YEg0L7QsdGK0LXQutGC0LDQvNC4INC90LXQutC+0YLQvtGA0L7Qs9C+INC/0YDQuNC70L7QttC10L3QuNGPINC40Lcg0LTRgNGD0LPQvtCz0L4g0L/RgNC40LvQvtC20LXQvdC40Y8g0LjQu9C4INGB0YDQtdC00YHRgtCy0LAg0YDQsNC30YDQsNCx0L7RgtC60LguINCf0YDQvtCz0YDQsNC80LzQuNGA0L7QstCw0L3QuNC1INC+0LHRitC10LrRgtC+0LIgKNGA0LDQvdC10LUg0L3QsNC30YvQstCw0LXQvNC+0LUg0L/RgNC+0LPRgNCw0LzQvNC40YDQvtCy0LDQvdC40LXQvCBPTEUpINGP0LLQu9GP0LXRgtGB0Y8g0YTRg9C90LrRhtC40LXQuSDQvNC+0LTQtdC70LggQ09NIChDb21wb25lbnQgT2JqZWN0IE1vZGVsLCDQvNC+0LTQtdC70Ywg0LrQvtC80L/QvtC90LXQvdGC0L3Ri9GFINC+0LHRitC10LrRgtC+0LIpLikuDQpUUkFOU1BPU0UJCT0g0KLQoNCQ0J3QodCfCQkJCSMjCdCS0L7Qt9Cy0YDQsNGJ0LDQtdGCINGC0YDQsNC90YHQv9C+0L3QuNGA0L7QstCw0L3QvdGL0Lkg0LzQsNGB0YHQuNCyLg0KVkxPT0tVUAkJCT0g0JLQn9CgCQkJCQkjIwnQmNGJ0LXRgiDQt9C90LDRh9C10L3QuNC1INCyINC/0LXRgNCy0L7QvCDRgdGC0L7Qu9Cx0YbQtSDQvNCw0YHRgdC40LLQsCDQuCDQstC+0LfQstGA0LDRidCw0LXRgiDQt9C90LDRh9C10L3QuNC1INC40Lcg0Y/Rh9C10LnQutC4INCyINC90LDQudC00LXQvdC90L7QuSDRgdGC0YDQvtC60LUg0Lgg0YPQutCw0LfQsNC90L3QvtC8INGB0YLQvtC70LHRhtC1Lg0KDQoNCiMjDQojIwlNYXRoIGFuZCB0cmlnb25vbWV0cnkgZnVuY3Rpb25zCQkJCdCc0LDRgtC10LzQsNGC0LjRh9C10YHQutC40LUg0Lgg0YLRgNC40LPQvtC90L7QvNC10YLRgNC40YfQtdGB0LrQuNC1INGE0YPQvdC60YbQuNC4DQojIw0KQUJTCQkJPSBBQlMJCQkJCSMjCdCS0L7Qt9Cy0YDQsNGJ0LDQtdGCINC80L7QtNGD0LvRjCAo0LDQsdGB0L7Qu9GO0YLQvdGD0Y4g0LLQtdC70LjRh9C40L3Rgykg0YfQuNGB0LvQsC4NCkFDT1MJCQk9IEFDT1MJCQkJCSMjCdCS0L7Qt9Cy0YDQsNGJ0LDQtdGCINCw0YDQutC60L7RgdC40L3Rg9GBINGH0LjRgdC70LAuDQpBQ09TSAkJCT0gQUNPU0gJCQkJCSMjCdCS0L7Qt9Cy0YDQsNGJ0LDQtdGCINCz0LjQv9C10YDQsdC+0LvQuNGH0LXRgdC60LjQuSDQsNGA0LrQutC+0YHQuNC90YPRgSDRh9C40YHQu9CwLg0KQVNJTgkJCT0gQVNJTgkJCQkJIyMJ0JLQvtC30LLRgNCw0YnQsNC10YIg0LDRgNC60YHQuNC90YPRgSDRh9C40YHQu9CwLg0KQVNJTkgJCQk9IEFTSU5ICQkJCQkjIwnQktC+0LfQstGA0LDRidCw0LXRgiDQs9C40L/QtdGA0LHQvtC70LjRh9C10YHQutC40Lkg0LDRgNC60YHQuNC90YPRgSDRh9C40YHQu9CwLg0KQVRBTgkJCT0gQVRBTgkJCQkJIyMJ0JLQvtC30LLRgNCw0YnQsNC10YIg0LDRgNC60YLQsNC90LPQtdC90YEg0YfQuNGB0LvQsC4NCkFUQU4yCQkJPSBBVEFOMgkJCQkJIyMJ0JLQvtC30LLRgNCw0YnQsNC10YIg0LDRgNC60YLQsNC90LPQtdC90YEg0LTQu9GPINC30LDQtNCw0L3QvdGL0YUg0LrQvtC+0YDQtNC40L3QsNGCIHgg0LggeS4NCkFUQU5ICQkJPSBBVEFOSAkJCQkJIyMJ0JLQvtC30LLRgNCw0YnQsNC10YIg0LPQuNC/0LXRgNCx0L7Qu9C40YfQtdGB0LrQuNC5INCw0YDQutGC0LDQvdCz0LXQvdGBINGH0LjRgdC70LAuDQpDRUlMSU5HCQkJPSDQntCa0KDQktCS0JXQoNClCQkJCSMjCdCe0LrRgNGD0LPQu9GP0LXRgiDRh9C40YHQu9C+INC00L4g0LHQu9C40LbQsNC50YjQtdCz0L4g0YbQtdC70L7Qs9C+INC40LvQuCDQtNC+INCx0LvQuNC20LDQudGI0LXQs9C+INC60YDQsNGC0L3QvtCz0L4g0YPQutCw0LfQsNC90L3QvtC80YMg0LfQvdCw0YfQtdC90LjRji4NCkNPTUJJTgkJCT0g0KfQmNCh0JvQmtCe0JzQkQkJCQkjIwnQktC+0LfQstGA0LDRidCw0LXRgiDQutC+0LvQuNGH0LXRgdGC0LLQviDQutC+0LzQsdC40L3QsNGG0LjQuSDQtNC70Y8g0LfQsNC00LDQvdC90L7Qs9C+INGH0LjRgdC70LAg0L7QsdGK0LXQutGC0L7Qsi4NCkNPUwkJCT0gQ09TCQkJCQkjIwnQktC+0LfQstGA0LDRidCw0LXRgiDQutC+0YHQuNC90YPRgSDRh9C40YHQu9CwLg0KQ09TSAkJCT0gQ09TSAkJCQkJIyMJ0JLQvtC30LLRgNCw0YnQsNC10YIg0LPQuNC/0LXRgNCx0L7Qu9C40YfQtdGB0LrQuNC5INC60L7RgdC40L3Rg9GBINGH0LjRgdC70LAuDQpERUdSRUVTCQkJPSDQk9Cg0JDQlNCj0KHQqwkJCQkjIwnQn9GA0LXQvtCx0YDQsNC30YPQtdGCINGA0LDQtNC40LDQvdGLINCyINCz0YDQsNC00YPRgdGLLg0KRVZFTgkJCT0g0KfQgdCi0J0JCQkJCSMjCdCe0LrRgNGD0LPQu9GP0LXRgiDRh9C40YHQu9C+INC00L4g0LHQu9C40LbQsNC50YjQtdCz0L4g0YfQtdGC0L3QvtCz0L4g0YbQtdC70L7Qs9C+Lg0KRVhQCQkJPSBFWFAJCQkJCSMjCdCS0L7Qt9Cy0YDQsNGJ0LDQtdGCINGH0LjRgdC70L4gZSwg0LLQvtC30LLQtdC00LXQvdC90L7QtSDQsiDRg9C60LDQt9Cw0L3QvdGD0Y4g0YHRgtC10L/QtdC90YwuDQpGQUNUCQkJPSDQpNCQ0JrQotCgCQkJCQkjIwnQktC+0LfQstGA0LDRidCw0LXRgiDRhNCw0LrRgtC+0YDQuNCw0Lsg0YfQuNGB0LvQsC4NCkZBQ1RET1VCTEUJCT0g0JTQktCk0JDQmtCi0KAJCQkJIyMJ0JLQvtC30LLRgNCw0YnQsNC10YIg0LTQstC+0LnQvdC+0Lkg0YTQsNC60YLQvtGA0LjQsNC7INGH0LjRgdC70LAuDQpGTE9PUgkJCT0g0J7QmtCg0JLQndCY0JcJCQkJIyMJ0J7QutGA0YPQs9C70Y/QtdGCINGH0LjRgdC70L4g0LTQviDQsdC70LjQttCw0LnRiNC10LPQviDQvNC10L3RjNGI0LXQs9C+INC/0L4g0LzQvtC00YPQu9GOINC30L3QsNGH0LXQvdC40Y8uDQpHQ0QJCQk9INCd0J7QlAkJCQkJIyMJ0JLQvtC30LLRgNCw0YnQsNC10YIg0L3QsNC40LHQvtC70YzRiNC40Lkg0L7QsdGJ0LjQuSDQtNC10LvQuNGC0LXQu9GMLg0KSU5UCQkJPSDQptCV0JvQntCVCQkJCQkjIwnQntC60YDRg9Cz0LvRj9C10YIg0YfQuNGB0LvQviDQtNC+INCx0LvQuNC20LDQudGI0LXQs9C+INC80LXQvdGM0YjQtdCz0L4g0YbQtdC70L7Qs9C+Lg0KTENNCQkJPSDQndCe0JoJCQkJCSMjCdCS0L7Qt9Cy0YDQsNGJ0LDQtdGCINC90LDQuNC80LXQvdGM0YjQtdC1INC+0LHRidC10LUg0LrRgNCw0YLQvdC+0LUuDQpMTgkJCT0gTE4JCQkJCSMjCdCS0L7Qt9Cy0YDQsNGJ0LDQtdGCINC90LDRgtGD0YDQsNC70YzQvdGL0Lkg0LvQvtCz0LDRgNC40YTQvCDRh9C40YHQu9CwLg0KTE9HCQkJPSBMT0cJCQkJCSMjCdCS0L7Qt9Cy0YDQsNGJ0LDQtdGCINC70L7Qs9Cw0YDQuNGE0Lwg0YfQuNGB0LvQsCDQv9C+INC30LDQtNCw0L3QvdC+0LzRgyDQvtGB0L3QvtCy0LDQvdC40Y4uDQpMT0cxMAkJCT0gTE9HMTAJCQkJCSMjCdCS0L7Qt9Cy0YDQsNGJ0LDQtdGCINC00LXRgdGP0YLQuNGH0L3Ri9C5INC70L7Qs9Cw0YDQuNGE0Lwg0YfQuNGB0LvQsC4NCk1ERVRFUk0JCQk9INCc0J7Qn9Cg0JXQlAkJCQkjIwnQktC+0LfQstGA0LDRidCw0LXRgiDQvtC/0YDQtdC00LXQu9C40YLQtdC70Ywg0LzQsNGC0YDQuNGG0Ysg0LzQsNGB0YHQuNCy0LAuDQpNSU5WRVJTRQkJPSDQnNCe0JHQoAkJCQkJIyMJ0JLQvtC30LLRgNCw0YnQsNC10YIg0L7QsdGA0LDRgtC90YPRjiDQvNCw0YLRgNC40YbRgyDQvNCw0YHRgdC40LLQsC4NCk1NVUxUCQkJPSDQnNCj0JzQndCe0JYJCQkJIyMJ0JLQvtC30LLRgNCw0YnQsNC10YIg0L/RgNC+0LjQt9Cy0LXQtNC10L3QuNC1INC80LDRgtGA0LjRhiDQtNCy0YPRhSDQvNCw0YHRgdC40LLQvtCyLg0KTU9ECQkJPSDQntCh0KLQkNCiCQkJCQkjIwnQktC+0LfQstGA0LDRidCw0LXRgiDQvtGB0YLQsNGC0L7QuiDQvtGCINC00LXQu9C10L3QuNGPLg0KTVJPVU5ECQkJPSDQntCa0KDQo9CT0JvQogkJCQkjIwnQktC+0LfQstGA0LDRidCw0LXRgiDRh9C40YHQu9C+LCDQvtC60YDRg9Cz0LvQtdC90L3QvtC1INGBINGC0YDQtdCx0YPQtdC80L7QuSDRgtC+0YfQvdC+0YHRgtGM0Y4uDQpNVUxUSU5PTUlBTAkJPSDQnNCj0JvQrNCi0JjQndCe0JwJCQkJIyMJ0JLQvtC30LLRgNCw0YnQsNC10YIg0LzRg9C70YzRgtC40L3QvtC80LjQsNC70YzQvdGL0Lkg0LrQvtGN0YTRhNC40YbQuNC10L3RgiDQvNC90L7QttC10YHRgtCy0LAg0YfQuNGB0LXQuy4NCk9ERAkJCT0g0J3QldCn0IHQogkJCQkJIyMJ0J7QutGA0YPQs9C70Y/QtdGCINGH0LjRgdC70L4g0LTQviDQsdC70LjQttCw0LnRiNC10LPQviDQvdC10YfQtdGC0L3QvtCz0L4g0YbQtdC70L7Qs9C+Lg0KUEkJCQk9INCf0JgJCQkJCSMjCdCS0L7Qt9Cy0YDQsNGJ0LDQtdGCINGH0LjRgdC70L4g0L/QuC4NClBPV0VSCQkJPSDQodCi0JXQn9CV0J3QrAkJCQkjIwnQktC+0LfQstGA0LDRidCw0LXRgiDRgNC10LfRg9C70YzRgtCw0YIg0LLQvtC30LLQtdC00LXQvdC40Y8g0YfQuNGB0LvQsCDQsiDRgdGC0LXQv9C10L3RjC4NClBST0RVQ1QJCQk9INCf0KDQntCY0JfQktCV0JQJCQkJIyMJ0JLQvtC30LLRgNCw0YnQsNC10YIg0L/RgNC+0LjQt9Cy0LXQtNC10L3QuNC1INCw0YDQs9GD0LzQtdC90YLQvtCyLg0KUVVPVElFTlQJCT0g0KfQkNCh0KLQndCe0JUJCQkJIyMJ0JLQvtC30LLRgNCw0YnQsNC10YIg0YbQtdC70YPRjiDRh9Cw0YHRgtGMINGH0LDRgdGC0L3QvtCz0L4g0L/RgNC4INC00LXQu9C10L3QuNC4Lg0KUkFESUFOUwkJCT0g0KDQkNCU0JjQkNCd0KsJCQkJIyMJ0J/RgNC10L7QsdGA0LDQt9GD0LXRgiDQs9GA0LDQtNGD0YHRiyDQsiDRgNCw0LTQuNCw0L3Riy4NClJBTkQJCQk9INCh0JvQp9CY0KEJCQkJCSMjCdCS0L7Qt9Cy0YDQsNGJ0LDQtdGCINGB0LvRg9GH0LDQudC90L7QtSDRh9C40YHQu9C+INCyINC40L3RgtC10YDQstCw0LvQtSDQvtGCIDAg0LTQviAxLg0KUkFOREJFVFdFRU4JCT0g0KHQm9Cj0KfQnNCV0JbQlNCjCQkJCSMjCdCS0L7Qt9Cy0YDQsNGJ0LDQtdGCINGB0LvRg9GH0LDQudC90L7QtSDRh9C40YHQu9C+INCyINC40L3RgtC10YDQstCw0LvQtSDQvNC10LbQtNGDINC00LLRg9C80Y8g0LfQsNC00LDQvdC90YvQvNC4INGH0LjRgdC70LDQvNC4Lg0KUk9NQU4JCQk9INCg0JjQnNCh0JrQntCVCQkJCSMjCdCf0YDQtdC+0LHRgNCw0LfRg9C10YIg0LDRgNCw0LHRgdC60LjQtSDRhtC40YTRgNGLINCyINGA0LjQvNGB0LrQuNC1INCyINCy0LjQtNC1INGC0LXQutGB0YLQsC4NClJPVU5ECQkJPSDQntCa0KDQo9CT0JsJCQkJIyMJ0J7QutGA0YPQs9C70Y/QtdGCINGH0LjRgdC70L4g0LTQviDRg9C60LDQt9Cw0L3QvdC+0LPQviDQutC+0LvQuNGH0LXRgdGC0LLQsCDQtNC10YHRj9GC0LjRh9C90YvRhSDRgNCw0LfRgNGP0LTQvtCyLg0KUk9VTkRET1dOCQk9INCe0JrQoNCj0JPQm9CS0J3QmNCXCQkJCSMjCdCe0LrRgNGD0LPQu9GP0LXRgiDRh9C40YHQu9C+INC00L4g0LHQu9C40LbQsNC50YjQtdCz0L4g0LzQtdC90YzRiNC10LPQviDQv9C+INC80L7QtNGD0LvRjiDQt9C90LDRh9C10L3QuNGPLg0KUk9VTkRVUAkJCT0g0J7QmtCg0KPQk9Cb0JLQktCV0KDQpQkJCQkjIwnQntC60YDRg9Cz0LvRj9C10YIg0YfQuNGB0LvQviDQtNC+INCx0LvQuNC20LDQudGI0LXQs9C+INCx0L7Qu9GM0YjQtdCz0L4g0L/QviDQvNC+0LTRg9C70Y4g0LfQvdCw0YfQtdC90LjRjy4NClNFUklFU1NVTQkJPSDQoNCv0JQu0KHQo9Cc0JwJCQkJIyMJ0JLQvtC30LLRgNCw0YnQsNC10YIg0YHRg9C80LzRgyDRgdGC0LXQv9C10L3QvdC+0LPQviDRgNGP0LTQsCwg0LLRi9GH0LjRgdC70LXQvdC90YPRjiDQv9C+INGE0L7RgNC80YPQu9C1Lg0KU0lHTgkJCT0g0JfQndCQ0JoJCQkJCSMjCdCS0L7Qt9Cy0YDQsNGJ0LDQtdGCINC30L3QsNC6INGH0LjRgdC70LAuDQpTSU4JCQk9IFNJTgkJCQkJIyMJ0JLQvtC30LLRgNCw0YnQsNC10YIg0YHQuNC90YPRgSDQt9Cw0LTQsNC90L3QvtCz0L4g0YPQs9C70LAuDQpTSU5ICQkJPSBTSU5ICQkJCQkjIwnQktC+0LfQstGA0LDRidCw0LXRgiDQs9C40L/QtdGA0LHQvtC70LjRh9C10YHQutC40Lkg0YHQuNC90YPRgSDRh9C40YHQu9CwLg0KU1FSVAkJCT0g0JrQntCg0JXQndCsCQkJCSMjCdCS0L7Qt9Cy0YDQsNGJ0LDQtdGCINC/0L7Qu9C+0LbQuNGC0LXQu9GM0L3QvtC1INC30L3QsNGH0LXQvdC40LUg0LrQstCw0LTRgNCw0YLQvdC+0LPQviDQutC+0YDQvdGPLg0KU1FSVFBJCQkJPSDQmtCe0KDQldCd0KzQn9CYCQkJCSMjCdCS0L7Qt9Cy0YDQsNGJ0LDQtdGCINC60LLQsNC00YDQsNGC0L3Ri9C5INC60L7RgNC10L3RjCDQuNC3INC30L3QsNGH0LXQvdC40Y8g0LLRi9GA0LDQttC10L3QuNGPICjRh9C40YHQu9C+ICog0J/QmCkuDQpTVUJUT1RBTAkJPSDQn9Cg0J7QnNCV0JbQo9Ci0J7Qp9Cd0KvQlS7QmNCi0J7Qk9CYCQkJIyMJ0JLQvtC30LLRgNCw0YnQsNC10YIg0L/RgNC+0LzQtdC20YPRgtC+0YfQvdGL0Lkg0LjRgtC+0LMg0LIg0YHQv9C40YHQutC1INC40LvQuCDQsdCw0LfQtSDQtNCw0L3QvdGL0YUuDQpTVU0JCQk9INCh0KPQnNCcCQkJCQkjIwnQodGD0LzQvNC40YDRg9C10YIg0LDRgNCz0YPQvNC10L3RgtGLLg0KU1VNSUYJCQk9INCh0KPQnNCc0JXQodCb0JgJCQkJIyMJ0KHRg9C80LzQuNGA0YPQtdGCINGP0YfQtdC50LrQuCwg0YPQtNC+0LLQu9C10YLQstC+0YDRj9GO0YnQuNC1INC30LDQtNCw0L3QvdC+0LzRgyDRg9GB0LvQvtCy0LjRji4NClNVTUlGUwkJCT0g0KHQo9Cc0JzQldCh0JvQmNCc0J0JCQkJIyMJ0KHRg9C80LzQuNGA0YPQtdGCINC00LjQsNC/0LDQt9C+0L0g0Y/Rh9C10LXQuiwg0YPQtNC+0LLQu9C10YLQstC+0YDRj9GO0YnQuNGFINC90LXRgdC60L7Qu9GM0LrQuNC8INGD0YHQu9C+0LLQuNGP0LwuIA0KU1VNUFJPRFVDVAkJPSDQodCj0JzQnNCf0KDQntCY0JfQkgkJCQkjIwnQktC+0LfQstGA0LDRidCw0LXRgiDRgdGD0LzQvNGDINC/0YDQvtC40LfQstC10LTQtdC90LjQuSDRgdC+0L7RgtCy0LXRgtGB0YLQstGD0Y7RidC40YUg0Y3Qu9C10LzQtdC90YLQvtCyINC80LDRgdGB0LjQstC+0LIuDQpTVU1TUQkJCT0g0KHQo9Cc0JzQmtCSCQkJCSMjCdCS0L7Qt9Cy0YDQsNGJ0LDQtdGCINGB0YPQvNC80YMg0LrQstCw0LTRgNCw0YLQvtCyINCw0YDQs9GD0LzQtdC90YLQvtCyLg0KU1VNWDJNWTIJCT0g0KHQo9Cc0JzQoNCQ0JfQndCa0JIJCQkJIyMJ0JLQvtC30LLRgNCw0YnQsNC10YIg0YHRg9C80LzRgyDRgNCw0LfQvdC+0YHRgtC10Lkg0LrQstCw0LTRgNCw0YLQvtCyINGB0L7QvtGC0LLQtdGC0YHRgtCy0YPRjtGJ0LjRhSDQt9C90LDRh9C10L3QuNC5INCyINC00LLRg9GFINC80LDRgdGB0LjQstCw0YUuDQpTVU1YMlBZMgkJPSDQodCj0JzQnNCh0KPQnNCc0JrQkgkJCQkjIwnQktC+0LfQstGA0LDRidCw0LXRgiDRgdGD0LzQvNGDINGB0YPQvNC8INC60LLQsNC00YDQsNGC0L7QsiDRgdC+0L7RgtCy0LXRgtGB0YLQstGD0Y7RidC40YUg0Y3Qu9C10LzQtdC90YLQvtCyINC00LLRg9GFINC80LDRgdGB0LjQstC+0LIuDQpTVU1YTVkyCQkJPSDQodCj0JzQnNCa0JLQoNCQ0JfQnQkJCQkjIwnQktC+0LfQstGA0LDRidCw0LXRgiDRgdGD0LzQvNGDINC60LLQsNC00YDQsNGC0L7QsiDRgNCw0LfQvdC+0YHRgtC10Lkg0YHQvtC+0YLQstC10YLRgdGC0LLRg9GO0YnQuNGFINC30L3QsNGH0LXQvdC40Lkg0LIg0LTQstGD0YUg0LzQsNGB0YHQuNCy0LDRhS4NClRBTgkJCT0gVEFOCQkJCQkjIwnQktC+0LfQstGA0LDRidCw0LXRgiDRgtCw0L3Qs9C10L3RgSDRh9C40YHQu9CwLg0KVEFOSAkJCT0gVEFOSAkJCQkJIyMJ0JLQvtC30LLRgNCw0YnQsNC10YIg0LPQuNC/0LXRgNCx0L7Qu9C40YfQtdGB0LrQuNC5INGC0LDQvdCz0LXQvdGBINGH0LjRgdC70LAuDQpUUlVOQwkJCT0g0J7QotCR0KAJCQkJCSMjCdCe0YLQsdGA0LDRgdGL0LLQsNC10YIg0LTRgNC+0LHQvdGD0Y4g0YfQsNGB0YLRjCDRh9C40YHQu9CwLg0KDQoNCiMjDQojIwlTdGF0aXN0aWNhbCBmdW5jdGlvbnMJCQkJCdCh0YLQsNGC0LjRgdGC0LjRh9C10YHQutC40LUg0YTRg9C90LrRhtC40LgNCiMjDQpBVkVERVYJCQk9INCh0KDQntCi0JrQmwkJCQkjIwnQktC+0LfQstGA0LDRidCw0LXRgiDRgdGA0LXQtNC90LXQtSDQsNGA0LjRhNC80LXRgtC40YfQtdGB0LrQvtC1INCw0LHRgdC+0LvRjtGC0L3Ri9GFINC30L3QsNGH0LXQvdC40Lkg0L7RgtC60LvQvtC90LXQvdC40Lkg0YLQvtGH0LXQuiDQtNCw0L3QvdGL0YUg0L7RgiDRgdGA0LXQtNC90LXQs9C+Lg0KQVZFUkFHRQkJCT0g0KHQoNCX0J3QkNCnCQkJCSMjCdCS0L7Qt9Cy0YDQsNGJ0LDQtdGCINGB0YDQtdC00L3QtdC1INCw0YDQuNGE0LzQtdGC0LjRh9C10YHQutC+0LUg0LDRgNCz0YPQvNC10L3RgtC+0LIuDQpBVkVSQUdFQQkJPSDQodCg0JfQndCQ0KfQkAkJCQkjIwnQktC+0LfQstGA0LDRidCw0LXRgiDRgdGA0LXQtNC90LXQtSDQsNGA0LjRhNC80LXRgtC40YfQtdGB0LrQvtC1INCw0YDQs9GD0LzQtdC90YLQvtCyLCDQstC60LvRjtGH0LDRjyDRh9C40YHQu9CwLCDRgtC10LrRgdGCINC4INC70L7Qs9C40YfQtdGB0LrQuNC1INC30L3QsNGH0LXQvdC40Y8uDQpBVkVSQUdFSUYJCT0g0KHQoNCX0J3QkNCn0JXQodCb0JggCQkJCSMjCdCS0L7Qt9Cy0YDQsNGJ0LDQtdGCINGB0YDQtdC00L3QtdC1INC30L3QsNGH0LXQvdC40LUgKNGB0YDQtdC00L3QtdC1INCw0YDQuNGE0LzQtdGC0LjRh9C10YHQutC+0LUpINCy0YHQtdGFINGP0YfQtdC10Log0LIg0LTQuNCw0L/QsNC30L7QvdC1LCDQutC+0YLQvtGA0YvQtSDRg9C00L7QstC70LXRgtCy0L7RgNGP0Y7RgiDQtNCw0L3QvdC+0LzRgyDRg9GB0LvQvtCy0LjRji4NCkFWRVJBR0VJRlMJCT0g0KHQoNCX0J3QkNCn0JXQodCb0JjQnNCdIAkJCQkjIwnQktC+0LfQstGA0LDRidCw0LXRgiDRgdGA0LXQtNC90LXQtSDQt9C90LDRh9C10L3QuNC1ICjRgdGA0LXQtNC90LXQtSDQsNGA0LjRhNC80LXRgtC40YfQtdGB0LrQvtC1KSDQstGB0LXRhSDRj9GH0LXQtdC6LCDQutC+0YLQvtGA0YvQtSDRg9C00L7QstC70LXRgtCy0L7RgNGP0Y7RgiDQvdC10YHQutC+0LvRjNC60LjQvCDRg9GB0LvQvtCy0LjRj9C8LiANCkJFVEFESVNUCQk9INCR0JXQotCQ0KDQkNCh0J8JCQkJIyMJ0JLQvtC30LLRgNCw0YnQsNC10YIg0LjQvdGC0LXQs9GA0LDQu9GM0L3Rg9GOINGE0YPQvdC60YbQuNGOINCx0LXRgtCwLdGA0LDRgdC/0YDQtdC00LXQu9C10L3QuNGPLg0KQkVUQUlOVgkJCT0g0JHQldCi0JDQntCR0KAJCQkJIyMJ0JLQvtC30LLRgNCw0YnQsNC10YIg0L7QsdGA0LDRgtC90YPRjiDQuNC90YLQtdCz0YDQsNC70YzQvdGD0Y4g0YTRg9C90LrRhtC40Y4g0YPQutCw0LfQsNC90L3QvtCz0L4g0LHQtdGC0LAt0YDQsNGB0L/RgNC10LTQtdC70LXQvdC40Y8uDQpCSU5PTURJU1QJCT0g0JHQmNCd0J7QnNCg0JDQodCfCQkJCSMjCdCS0L7Qt9Cy0YDQsNGJ0LDQtdGCINC+0YLQtNC10LvRjNC90L7QtSDQt9C90LDRh9C10L3QuNC1INCx0LjQvdC+0LzQuNCw0LvRjNC90L7Qs9C+INGA0LDRgdC/0YDQtdC00LXQu9C10L3QuNGPLg0KQ0hJRElTVAkJCT0g0KXQmDLQoNCQ0KHQnwkJCQkjIwnQktC+0LfQstGA0LDRidCw0LXRgiDQvtC00L3QvtGB0YLQvtGA0L7QvdC90Y7RjiDQstC10YDQvtGP0YLQvdC+0YHRgtGMINGA0LDRgdC/0YDQtdC00LXQu9C10L3QuNGPINGF0Lgt0LrQstCw0LTRgNCw0YIuDQpDSElJTlYJCQk9INCl0Jgy0J7QkdCgCQkJCSMjCdCS0L7Qt9Cy0YDQsNGJ0LDQtdGCINC+0LHRgNCw0YLQvdC+0LUg0LfQvdCw0YfQtdC90LjQtSDQvtC00L3QvtGB0YLQvtGA0L7QvdC90LXQuSDQstC10YDQvtGP0YLQvdC+0YHRgtC4INGA0LDRgdC/0YDQtdC00LXQu9C10L3QuNGPINGF0Lgt0LrQstCw0LTRgNCw0YIuDQpDSElURVNUCQkJPSDQpdCYMtCi0JXQodCiCQkJCSMjCdCS0L7Qt9Cy0YDQsNGJ0LDQtdGCINGC0LXRgdGCINC90LAg0L3QtdC30LDQstC40YHQuNC80L7RgdGC0YwuDQpDT05GSURFTkNFCQk9INCU0J7QktCV0KDQmNCiCQkJCSMjCdCS0L7Qt9Cy0YDQsNGJ0LDQtdGCINC00L7QstC10YDQuNGC0LXQu9GM0L3Ri9C5INC40L3RgtC10YDQstCw0Lsg0LTQu9GPINGB0YDQtdC00L3QtdCz0L4g0LfQvdCw0YfQtdC90LjRjyDQv9C+INCz0LXQvdC10YDQsNC70YzQvdC+0Lkg0YHQvtCy0L7QutGD0L/QvdC+0YHRgtC4Lg0KQ09SUkVMCQkJPSDQmtCe0KDQoNCV0JsJCQkJIyMJ0JLQvtC30LLRgNCw0YnQsNC10YIg0LrQvtGN0YTRhNC40YbQuNC10L3RgiDQutC+0YDRgNC10LvRj9GG0LjQuCDQvNC10LbQtNGDINC00LLRg9C80Y8g0LzQvdC+0LbQtdGB0YLQstCw0LzQuCDQtNCw0L3QvdGL0YUuDQpDT1VOVAkJCT0g0KHQp9CB0KIJCQkJCSMjCdCf0L7QtNGB0YfQuNGC0YvQstCw0LXRgiDQutC+0LvQuNGH0LXRgdGC0LLQviDRh9C40YHQtdC7INCyINGB0L/QuNGB0LrQtSDQsNGA0LPRg9C80LXQvdGC0L7Qsi4NCkNPVU5UQQkJCT0g0KHQp9CB0KLQlwkJCQkJIyMJ0J/QvtC00YHRh9C40YLRi9Cy0LDQtdGCINC60L7Qu9C40YfQtdGB0YLQstC+INC30L3QsNGH0LXQvdC40Lkg0LIg0YHQv9C40YHQutC1INCw0YDQs9GD0LzQtdC90YLQvtCyLg0KQ09VTlRCTEFOSwkJPSDQodCn0JjQotCQ0KLQrNCf0KPQodCi0J7QotCrCQkJIyMJ0J/QvtC00YHRh9C40YLRi9Cy0LDQtdGCINC60L7Qu9C40YfQtdGB0YLQstC+INC/0YPRgdGC0YvRhSDRj9GH0LXQtdC6INCyINC00LjQsNC/0LDQt9C+0L3QtQ0KQ09VTlRJRgkJCT0g0KHQp9CB0KLQldCh0JvQmCAJCQkJIyMJ0J/QvtC00YHRh9C40YLRi9Cy0LDQtdGCINC60L7Qu9C40YfQtdGB0YLQstC+INGP0YfQtdC10Log0LIg0LTQuNCw0L/QsNC30L7QvdC1LCDRg9C00L7QstC70LXRgtCy0L7RgNGP0Y7RidC40YUg0LfQsNC00LDQvdC90L7QvNGDINGD0YHQu9C+0LLQuNGODQpDT1VOVElGUwkJPSDQodCn0IHQotCV0KHQm9CY0JzQnQkJCQkjIwnQn9C+0LTRgdGH0LjRgtGL0LLQsNC10YIg0LrQvtC70LjRh9C10YHRgtCy0L4g0Y/Rh9C10LXQuiDQstC90YPRgtGA0Lgg0LTQuNCw0L/QsNC30L7QvdCwLCDRg9C00L7QstC70LXRgtCy0L7RgNGP0Y7RidC40YUg0L3QtdGB0LrQvtC70YzQutC40Lwg0YPRgdC70L7QstC40Y/QvC4NCkNPVkFSCQkJPSDQmtCe0JLQkNCgCQkJCQkjIwnQktC+0LfQstGA0LDRidCw0LXRgiDQutC+0LLQsNGA0LjQsNGG0LjRjiwg0YHRgNC10LTQvdC10LUg0L/RgNC+0LjQt9Cy0LXQtNC10L3QuNC5INC/0LDRgNC90YvRhSDQvtGC0LrQu9C+0L3QtdC90LjQuQ0KQ1JJVEJJTk9NCQk9INCa0KDQmNCi0JHQmNCd0J7QnAkJCQkjIwnQktC+0LfQstGA0LDRidCw0LXRgiDQvdCw0LjQvNC10L3RjNGI0LXQtSDQt9C90LDRh9C10L3QuNC1LCDQtNC70Y8g0LrQvtGC0L7RgNC+0LPQviDQuNC90YLQtdCz0YDQsNC70YzQvdC+0LUg0LHQuNC90L7QvNC40LDQu9GM0L3QvtC1INGA0LDRgdC/0YDQtdC00LXQu9C10L3QuNC1INC80LXQvdGM0YjQtSDQuNC70Lgg0YDQsNCy0L3QviDQt9Cw0LTQsNC90L3QvtC80YMg0LrRgNC40YLQtdGA0LjRji4NCkRFVlNRCQkJPSDQmtCS0JDQlNCg0J7QotCa0JsJCQkJIyMJ0JLQvtC30LLRgNCw0YnQsNC10YIg0YHRg9C80LzRgyDQutCy0LDQtNGA0LDRgtC+0LIg0L7RgtC60LvQvtC90LXQvdC40LkuDQpFWFBPTkRJU1QJCT0g0K3QmtCh0J/QoNCQ0KHQnwkJCQkjIwnQktC+0LfQstGA0LDRidCw0LXRgiDRjdC60YHQv9C+0L3QtdC90YbQuNCw0LvRjNC90L7QtSDRgNCw0YHQv9GA0LXQtNC10LvQtdC90LjQtS4NCkZESVNUCQkJPSBG0KDQkNCh0J8JCQkJCSMjCdCS0L7Qt9Cy0YDQsNGJ0LDQtdGCIEYt0YDQsNGB0L/RgNC10LTQtdC70LXQvdC40LUg0LLQtdGA0L7Rj9GC0L3QvtGB0YLQuC4NCkZJTlYJCQk9IEbQoNCQ0KHQn9Ce0JHQoAkJCQkjIwnQktC+0LfQstGA0LDRidCw0LXRgiDQvtCx0YDQsNGC0L3QvtC1INC30L3QsNGH0LXQvdC40LUg0LTQu9GPIEYt0YDQsNGB0L/RgNC10LTQtdC70LXQvdC40Y8g0LLQtdGA0L7Rj9GC0L3QvtGB0YLQuC4NCkZJU0hFUgkJCT0g0KTQmNCo0JXQoAkJCQkJIyMJ0JLQvtC30LLRgNCw0YnQsNC10YIg0L/RgNC10L7QsdGA0LDQt9C+0LLQsNC90LjQtSDQpNC40YjQtdGA0LAuDQpGSVNIRVJJTlYJCT0g0KTQmNCo0JXQoNCe0JHQoAkJCQkjIwnQktC+0LfQstGA0LDRidCw0LXRgiDQvtCx0YDQsNGC0L3QvtC1INC/0YDQtdC+0LHRgNCw0LfQvtCy0LDQvdC40LUg0KTQuNGI0LXRgNCwLg0KRk9SRUNBU1QJCT0g0J/QoNCV0JTQodCa0JDQlwkJCQkjIwnQktC+0LfQstGA0LDRidCw0LXRgiDQt9C90LDRh9C10L3QuNC1INC70LjQvdC10LnQvdC+0LPQviDRgtGA0LXQvdC00LAuDQpGUkVRVUVOQ1kJCT0g0KfQkNCh0KLQntCi0JAJCQkJIyMJ0JLQvtC30LLRgNCw0YnQsNC10YIg0YDQsNGB0L/RgNC10LTQtdC70LXQvdC40LUg0YfQsNGB0YLQvtGCINCyINCy0LjQtNC1INCy0LXRgNGC0LjQutCw0LvRjNC90L7Qs9C+INC80LDRgdGB0LjQstCwLg0KRlRFU1QJCQk9INCk0KLQldCh0KIJCQkJCSMjCdCS0L7Qt9Cy0YDQsNGJ0LDQtdGCINGA0LXQt9GD0LvRjNGC0LDRgiBGLdGC0LXRgdGC0LAuDQpHQU1NQURJU1QJCT0g0JPQkNCc0JzQkNCg0JDQodCfCQkJCSMjCdCS0L7Qt9Cy0YDQsNGJ0LDQtdGCINCz0LDQvNC80LAt0YDQsNGB0L/RgNC10LTQtdC70LXQvdC40LUuDQpHQU1NQUlOVgkJPSDQk9CQ0JzQnNCQ0J7QkdCgCQkJCSMjCdCS0L7Qt9Cy0YDQsNGJ0LDQtdGCINC+0LHRgNCw0YLQvdC+0LUg0LPQsNC80LzQsC3RgNCw0YHQv9GA0LXQtNC10LvQtdC90LjQtS4NCkdBTU1BTE4JCQk9INCT0JDQnNCc0JDQndCb0J7QkwkJCQkjIwnQktC+0LfQstGA0LDRidCw0LXRgiDQvdCw0YLRg9GA0LDQu9GM0L3Ri9C5INC70L7Qs9Cw0YDQuNGE0Lwg0LPQsNC80LzQsCDRhNGD0L3QutGG0LjQuCwgzpMoeCkuDQpHRU9NRUFOCQkJPSDQodCg0JPQldCe0JwJCQkJIyMJ0JLQvtC30LLRgNCw0YnQsNC10YIg0YHRgNC10LTQvdC10LUg0LPQtdC+0LzQtdGC0YDQuNGH0LXRgdC60L7QtS4NCkdST1dUSAkJCT0g0KDQntCh0KIJCQkJCSMjCdCS0L7Qt9Cy0YDQsNGJ0LDQtdGCINC30L3QsNGH0LXQvdC40Y8g0LIg0YHQvtC+0YLQstC10YLRgdGC0LLQuNC4INGBINGN0LrRgdC/0L7QvdC10L3RhtC40LDQu9GM0L3Ri9C8INGC0YDQtdC90LTQvtC8Lg0KSEFSTUVBTgkJCT0g0KHQoNCT0JDQoNCcCQkJCSMjCdCS0L7Qt9Cy0YDQsNGJ0LDQtdGCINGB0YDQtdC00L3QtdC1INCz0LDRgNC80L7QvdC40YfQtdGB0LrQvtC1Lg0KSFlQR0VPTURJU1QJCT0g0JPQmNCf0JXQoNCT0JXQntCc0JXQogkJCQkjIwnQktC+0LfQstGA0LDRidCw0LXRgiDQs9C40L/QtdGA0LPQtdC+0LzQtdGC0YDQuNGH0LXRgdC60L7QtSDRgNCw0YHQv9GA0LXQtNC10LvQtdC90LjQtS4NCklOVEVSQ0VQVAkJPSDQntCi0KDQldCX0J7QmgkJCQkjIwnQktC+0LfQstGA0LDRidCw0LXRgiDQvtGC0YDQtdC30L7Quiwg0L7RgtGB0LXQutCw0LXQvNGL0Lkg0L3QsCDQvtGB0Lgg0LvQuNC90LjQtdC5INC70LjQvdC10LnQvdC+0Lkg0YDQtdCz0YDQtdGB0YHQuNC4Lg0KS1VSVAkJCT0g0K3QmtCh0KbQldCh0KEJCQkJIyMJ0JLQvtC30LLRgNCw0YnQsNC10YIg0Y3QutGB0YbQtdGB0YEg0LzQvdC+0LbQtdGB0YLQstCwINC00LDQvdC90YvRhS4NCkxBUkdFCQkJPSDQndCQ0JjQkdCe0JvQrNCo0JjQmQkJCQkjIwnQktC+0LfQstGA0LDRidCw0LXRgiBrLdC+0LUg0L3QsNC40LHQvtC70YzRiNC10LUg0LfQvdCw0YfQtdC90LjQtSDQsiDQvNC90L7QttC10YHRgtCy0LUg0LTQsNC90L3Ri9GFLg0KTElORVNUCQkJPSDQm9CY0J3QldCZ0J0JCQkJIyMJ0JLQvtC30LLRgNCw0YnQsNC10YIg0L/QsNGA0LDQvNC10YLRgNGLINC70LjQvdC10LnQvdC+0LPQviDRgtGA0LXQvdC00LAuDQpMT0dFU1QJCQk9INCb0JPQoNCk0J/QoNCY0JHQmwkJCQkjIwnQktC+0LfQstGA0LDRidCw0LXRgiDQv9Cw0YDQsNC80LXRgtGA0Ysg0Y3QutGB0L/QvtC90LXQvdGG0LjQsNC70YzQvdC+0LPQviDRgtGA0LXQvdC00LAuDQpMT0dJTlYJCQk9INCb0J7Qk9Cd0J7QoNCc0J7QkdCgCQkJCSMjCdCS0L7Qt9Cy0YDQsNGJ0LDQtdGCINC+0LHRgNCw0YLQvdC+0LUg0LvQvtCz0LDRgNC40YTQvNC40YfQtdGB0LrQvtC1INC90L7RgNC80LDQu9GM0L3QvtC1INGA0LDRgdC/0YDQtdC00LXQu9C10L3QuNC1Lg0KTE9HTk9STURJU1QJCT0g0JvQntCT0J3QntCg0JzQoNCQ0KHQnwkJCQkjIwnQktC+0LfQstGA0LDRidCw0LXRgiDQuNC90YLQtdCz0YDQsNC70YzQvdC+0LUg0LvQvtCz0LDRgNC40YTQvNC40YfQtdGB0LrQvtC1INC90L7RgNC80LDQu9GM0L3QvtC1INGA0LDRgdC/0YDQtdC00LXQu9C10L3QuNC1Lg0KTUFYCQkJPSDQnNCQ0JrQoQkJCQkJIyMJ0JLQvtC30LLRgNCw0YnQsNC10YIg0L3QsNC40LHQvtC70YzRiNC10LUg0LfQvdCw0YfQtdC90LjQtSDQsiDRgdC/0LjRgdC60LUg0LDRgNCz0YPQvNC10L3RgtC+0LIuDQpNQVhBCQkJPSDQnNCQ0JrQodCQCQkJCQkjIwnQktC+0LfQstGA0LDRidCw0LXRgiDQvdCw0LjQsdC+0LvRjNGI0LXQtSDQt9C90LDRh9C10L3QuNC1INCyINGB0L/QuNGB0LrQtSDQsNGA0LPRg9C80LXQvdGC0L7Qsiwg0LLQutC70Y7Rh9Cw0Y8g0YfQuNGB0LvQsCwg0YLQtdC60YHRgiDQuCDQu9C+0LPQuNGH0LXRgdC60LjQtSDQt9C90LDRh9C10L3QuNGPLg0KTUVESUFOCQkJPSDQnNCV0JTQmNCQ0J3QkAkJCQkjIwnQktC+0LfQstGA0LDRidCw0LXRgiDQvNC10LTQuNCw0L3RgyDQt9Cw0LTQsNC90L3Ri9GFINGH0LjRgdC10LsuDQpNSU4JCQk9INCc0JjQnQkJCQkJIyMJ0JLQvtC30LLRgNCw0YnQsNC10YIg0L3QsNC40LzQtdC90YzRiNC10LUg0LfQvdCw0YfQtdC90LjQtSDQsiDRgdC/0LjRgdC60LUg0LDRgNCz0YPQvNC10L3RgtC+0LIuDQpNSU5BCQkJPSDQnNCY0J3QkAkJCQkJIyMJ0JLQvtC30LLRgNCw0YnQsNC10YIg0L3QsNC40LzQtdC90YzRiNC10LUg0LfQvdCw0YfQtdC90LjQtSDQsiDRgdC/0LjRgdC60LUg0LDRgNCz0YPQvNC10L3RgtC+0LIsINCy0LrQu9GO0YfQsNGPINGH0LjRgdC70LAsINGC0LXQutGB0YIg0Lgg0LvQvtCz0LjRh9C10YHQutC40LUg0LfQvdCw0YfQtdC90LjRjy4NCk1PREUJCQk9INCc0J7QlNCQCQkJCQkjIwnQktC+0LfQstGA0LDRidCw0LXRgiDQt9C90LDRh9C10L3QuNC1INC80L7QtNGLINC80L3QvtC20LXRgdGC0LLQsCDQtNCw0L3QvdGL0YUuDQpORUdCSU5PTURJU1QJCT0g0J7QotCg0JHQmNCd0J7QnNCg0JDQodCfCQkJCSMjCdCS0L7Qt9Cy0YDQsNGJ0LDQtdGCINC+0YLRgNC40YbQsNGC0LXQu9GM0L3QvtC1INCx0LjQvdC+0LzQuNCw0LvRjNC90L7QtSDRgNCw0YHQv9GA0LXQtNC10LvQtdC90LjQtS4NCk5PUk1ESVNUCQk9INCd0J7QoNCc0KDQkNCh0J8JCQkJIyMJ0JLQvtC30LLRgNCw0YnQsNC10YIg0L3QvtGA0LzQsNC70YzQvdGD0Y4g0YTRg9C90LrRhtC40Y4g0YDQsNGB0L/RgNC10LTQtdC70LXQvdC40Y8uDQpOT1JNSU5WCQkJPSDQndCe0KDQnNCe0JHQoAkJCQkjIwnQktC+0LfQstGA0LDRidCw0LXRgiDQvtCx0YDQsNGC0L3QvtC1INC90L7RgNC80LDQu9GM0L3QvtC1INGA0LDRgdC/0YDQtdC00LXQu9C10L3QuNC1Lg0KTk9STVNESVNUCQk9INCd0J7QoNCc0KHQotCg0JDQodCfCQkJCSMjCdCS0L7Qt9Cy0YDQsNGJ0LDQtdGCINGB0YLQsNC90LTQsNGA0YLQvdC+0LUg0L3QvtGA0LzQsNC70YzQvdC+0LUg0LjQvdGC0LXQs9GA0LDQu9GM0L3QvtC1INGA0LDRgdC/0YDQtdC00LXQu9C10L3QuNC1Lg0KTk9STVNJTlYJCT0g0J3QntCg0JzQodCi0J7QkdCgCQkJCSMjCdCS0L7Qt9Cy0YDQsNGJ0LDQtdGCINC+0LHRgNCw0YLQvdC+0LUg0LfQvdCw0YfQtdC90LjQtSDRgdGC0LDQvdC00LDRgNGC0L3QvtCz0L4g0L3QvtGA0LzQsNC70YzQvdC+0LPQviDRgNCw0YHQv9GA0LXQtNC10LvQtdC90LjRjy4NClBFQVJTT04JCQk9INCf0JjQoNCh0J7QnQkJCQkjIwnQktC+0LfQstGA0LDRidCw0LXRgiDQutC+0Y3RhNGE0LjRhtC40LXQvdGCINC60L7RgNGA0LXQu9GP0YbQuNC4INCf0LjRgNGB0L7QvdCwLg0KUEVSQ0VOVElMRQkJPSDQn9CV0KDQodCV0J3QotCY0JvQrAkJCQkjIwnQktC+0LfQstGA0LDRidCw0LXRgiBrLdGD0Y4g0L/QtdGA0YHQtdC90YLQuNC70Ywg0LTQu9GPINC30L3QsNGH0LXQvdC40Lkg0LTQuNCw0L/QsNC30L7QvdCwLg0KUEVSQ0VOVFJBTksJCT0g0J/QoNCe0KbQldCd0KLQoNCQ0J3QkwkJCQkjIwnQktC+0LfQstGA0LDRidCw0LXRgiDQv9GA0L7RhtC10L3RgtC90YPRjiDQvdC+0YDQvNGDINC30L3QsNGH0LXQvdC40Y8g0LIg0LzQvdC+0LbQtdGB0YLQstC1INC00LDQvdC90YvRhS4NClBFUk1VVAkJCT0g0J/QldCg0JXQodCiCQkJCSMjCdCS0L7Qt9Cy0YDQsNGJ0LDQtdGCINC60L7Qu9C40YfQtdGB0YLQstC+INC/0LXRgNC10YHRgtCw0L3QvtCy0L7QuiDQtNC70Y8g0LfQsNC00LDQvdC90L7Qs9C+INGH0LjRgdC70LAg0L7QsdGK0LXQutGC0L7Qsi4NClBPSVNTT04JCQk9INCf0KPQkNCh0KHQntCdCQkJCSMjCdCS0L7Qt9Cy0YDQsNGJ0LDQtdGCINGA0LDRgdC/0YDQtdC00LXQu9C10L3QuNC1INCf0YPQsNGB0YHQvtC90LAuDQpQUk9CCQkJPSDQktCV0KDQntCv0KLQndCe0KHQotCsCQkJCSMjCdCS0L7Qt9Cy0YDQsNGJ0LDQtdGCINCy0LXRgNC+0Y/RgtC90L7RgdGC0Ywg0YLQvtCz0L4sINGH0YLQviDQt9C90LDRh9C10L3QuNC1INC40Lcg0LTQuNCw0L/QsNC30L7QvdCwINC90LDRhdC+0LTQuNGC0YHRjyDQstC90YPRgtGA0Lgg0LfQsNC00LDQvdC90YvRhSDQv9GA0LXQtNC10LvQvtCyLg0KUVVBUlRJTEUJCT0g0JrQktCQ0KDQotCY0JvQrAkJCQkjIwnQktC+0LfQstGA0LDRidCw0LXRgiDQutCy0LDRgNGC0LjQu9GMINC80L3QvtC20LXRgdGC0LLQsCDQtNCw0L3QvdGL0YUuDQpSQU5LCQkJPSDQoNCQ0J3QkwkJCQkJIyMJ0JLQvtC30LLRgNCw0YnQsNC10YIg0YDQsNC90LMg0YfQuNGB0LvQsCDQsiDRgdC/0LjRgdC60LUg0YfQuNGB0LXQuy4NClJTUQkJCT0g0JrQktCf0JjQoNCh0J7QnQkJCQkjIwnQktC+0LfQstGA0LDRidCw0LXRgiDQutCy0LDQtNGA0LDRgiDQutC+0Y3RhNGE0LjRhtC40LXQvdGC0LAg0LrQvtGA0YDQtdC70Y/RhtC40Lgg0J/QuNGA0YHQvtC90LAuDQpTS0VXCQkJPSDQodCa0J7QoQkJCQkJIyMJ0JLQvtC30LLRgNCw0YnQsNC10YIg0LDRgdC40LzQvNC10YLRgNC40Y4g0YDQsNGB0L/RgNC10LTQtdC70LXQvdC40Y8uDQpTTE9QRQkJCT0g0J3QkNCa0JvQntCdCQkJCSMjCdCS0L7Qt9Cy0YDQsNGJ0LDQtdGCINC90LDQutC70L7QvSDQu9C40L3QuNC4INC70LjQvdC10LnQvdC+0Lkg0YDQtdCz0YDQtdGB0YHQuNC4Lg0KU01BTEwJCQk9INCd0JDQmNCc0JXQndCs0KjQmNCZCQkJCSMjCdCS0L7Qt9Cy0YDQsNGJ0LDQtdGCIGst0L7QtSDQvdCw0LjQvNC10L3RjNGI0LXQtSDQt9C90LDRh9C10L3QuNC1INCyINC80L3QvtC20LXRgdGC0LLQtSDQtNCw0L3QvdGL0YUuDQpTVEFOREFSRElaRQkJPSDQndCe0KDQnNCQ0JvQmNCX0JDQptCY0K8JCQkJIyMJ0JLQvtC30LLRgNCw0YnQsNC10YIg0L3QvtGA0LzQsNC70LjQt9C+0LLQsNC90L3QvtC1INC30L3QsNGH0LXQvdC40LUuDQpTVERFVgkJCT0g0KHQotCQ0J3QlNCe0KLQmtCb0J7QnQkJCQkjIwnQntGG0LXQvdC40LLQsNC10YIg0YHRgtCw0L3QtNCw0YDRgtC90L7QtSDQvtGC0LrQu9C+0L3QtdC90LjQtSDQv9C+INCy0YvQsdC+0YDQutC1Lg0KU1RERVZBCQkJPSDQodCi0JDQndCU0J7QotCa0JvQntCd0JAJCQkJIyMJ0J7RhtC10L3QuNCy0LDQtdGCINGB0YLQsNC90LTQsNGA0YLQvdC+0LUg0L7RgtC60LvQvtC90LXQvdC40LUg0L/QviDQstGL0LHQvtGA0LrQtSwg0LLQutC70Y7Rh9Cw0Y8g0YfQuNGB0LvQsCwg0YLQtdC60YHRgiDQuCDQu9C+0LPQuNGH0LXRgdC60LjQtSDQt9C90LDRh9C10L3QuNGPLg0KU1RERVZQCQkJPSDQodCi0JDQndCU0J7QotCa0JvQntCd0J8JCQkJIyMJ0JLRi9GH0LjRgdC70Y/QtdGCINGB0YLQsNC90LTQsNGA0YLQvdC+0LUg0L7RgtC60LvQvtC90LXQvdC40LUg0L/QviDQs9C10L3QtdGA0LDQu9GM0L3QvtC5INGB0L7QstC+0LrRg9C/0L3QvtGB0YLQuC4NClNUREVWUEEJCQk9INCh0KLQkNCd0JTQntCi0JrQm9Ce0J3Qn9CQCQkJCSMjCdCS0YvRh9C40YHQu9GP0LXRgiDRgdGC0LDQvdC00LDRgNGC0L3QvtC1INC+0YLQutC70L7QvdC10L3QuNC1INC/0L4g0LPQtdC90LXRgNCw0LvRjNC90L7QuSDRgdC+0LLQvtC60YPQv9C90L7RgdGC0LgsINCy0LrQu9GO0YfQsNGPINGH0LjRgdC70LAsINGC0LXQutGB0YIg0Lgg0LvQvtCz0LjRh9C10YHQutC40LUg0LfQvdCw0YfQtdC90LjRjy4NClNURVlYCQkJPSDQodCi0J7QqFlYCQkJCSMjCdCS0L7Qt9Cy0YDQsNGJ0LDQtdGCINGB0YLQsNC90LTQsNGA0YLQvdGD0Y4g0L7RiNC40LHQutGDINC/0YDQtdC00YHQutCw0LfQsNC90L3Ri9GFINC30L3QsNGH0LXQvdC40LkgeSDQtNC70Y8g0LrQsNC20LTQvtCz0L4g0LfQvdCw0YfQtdC90LjRjyB4INCyINGA0LXQs9GA0LXRgdGB0LjQuC4NClRESVNUCQkJPSDQodCi0KzQrtCU0KDQkNCh0J8JCQkJIyMJ0JLQvtC30LLRgNCw0YnQsNC10YIgdC3RgNCw0YHQv9GA0LXQtNC10LvQtdC90LjQtSDQodGC0YzRjtC00LXQvdGC0LAuDQpUSU5WCQkJPSDQodCi0KzQrtCU0KDQkNCh0J/QntCR0KAJCQkJIyMJ0JLQvtC30LLRgNCw0YnQsNC10YIg0L7QsdGA0LDRgtC90L7QtSB0LdGA0LDRgdC/0YDQtdC00LXQu9C10L3QuNC1INCh0YLRjNGO0LTQtdC90YLQsC4NClRSRU5ECQkJPSDQotCV0J3QlNCV0J3QptCY0K8JCQkJIyMJ0JLQvtC30LLRgNCw0YnQsNC10YIg0LfQvdCw0YfQtdC90LjRjyDQsiDRgdC+0L7RgtCy0LXRgtGB0YLQstC40Lgg0YEg0LvQuNC90LXQudC90YvQvCDRgtGA0LXQvdC00L7QvC4NClRSSU1NRUFOCQk9INCj0KDQldCX0KHQoNCV0JTQndCV0JUJCQkJIyMJ0JLQvtC30LLRgNCw0YnQsNC10YIg0YHRgNC10LTQvdC10LUg0LLQvdGD0YLRgNC10L3QvdC+0YHRgtC4INC80L3QvtC20LXRgdGC0LLQsCDQtNCw0L3QvdGL0YUuDQpUVEVTVAkJCT0g0KLQotCV0KHQogkJCQkJIyMJ0JLQvtC30LLRgNCw0YnQsNC10YIg0LLQtdGA0L7Rj9GC0L3QvtGB0YLRjCwg0YHQvtC+0YLQstC10YLRgdGC0LLRg9GO0YnRg9GOINC60YDQuNGC0LXRgNC40Y4g0KHRgtGM0Y7QtNC10L3RgtCwLg0KVkFSCQkJPSDQlNCY0KHQnwkJCQkJIyMJ0J7RhtC10L3QuNCy0LDQtdGCINC00LjRgdC/0LXRgNGB0LjRjiDQv9C+INCy0YvQsdC+0YDQutC1Lg0KVkFSQQkJCT0g0JTQmNCh0J/QkAkJCQkJIyMJ0J7RhtC10L3QuNCy0LDQtdGCINC00LjRgdC/0LXRgNGB0LjRjiDQv9C+INCy0YvQsdC+0YDQutC1LCDQstC60LvRjtGH0LDRjyDRh9C40YHQu9CwLCDRgtC10LrRgdGCINC4INC70L7Qs9C40YfQtdGB0LrQuNC1INC30L3QsNGH0LXQvdC40Y8uDQpWQVJQCQkJPSDQlNCY0KHQn9CgCQkJCQkjIwnQktGL0YfQuNGB0LvRj9C10YIg0LTQuNGB0L/QtdGA0YHQuNGOINC00LvRjyDQs9C10L3QtdGA0LDQu9GM0L3QvtC5INGB0L7QstC+0LrRg9C/0L3QvtGB0YLQuC4NClZBUlBBCQkJPSDQlNCY0KHQn9Cg0JAJCQkJIyMJ0JLRi9GH0LjRgdC70Y/QtdGCINC00LjRgdC/0LXRgNGB0LjRjiDQtNC70Y8g0LPQtdC90LXRgNCw0LvRjNC90L7QuSDRgdC+0LLQvtC60YPQv9C90L7RgdGC0LgsINCy0LrQu9GO0YfQsNGPINGH0LjRgdC70LAsINGC0LXQutGB0YIg0Lgg0LvQvtCz0LjRh9C10YHQutC40LUg0LfQvdCw0YfQtdC90LjRjy4NCldFSUJVTEwJCQk9INCS0JXQmdCR0KPQm9CbCQkJCSMjCdCS0L7Qt9Cy0YDQsNGJ0LDQtdGCINGA0LDRgdC/0YDQtdC00LXQu9C10L3QuNC1INCS0LXQudCx0YPQu9C70LAuDQpaVEVTVAkJCT0gWtCi0JXQodCiCQkJCQkjIwnQktC+0LfQstGA0LDRidCw0LXRgiDQtNCy0YPRgdGC0L7RgNC+0L3QvdC10LUgUC3Qt9C90LDRh9C10L3QuNC1IHot0YLQtdGB0YLQsC4NCg0KDQojIw0KIyMJVGV4dCBmdW5jdGlvbnMJCQkJCQnQotC10LrRgdGC0L7QstGL0LUg0YTRg9C90LrRhtC40LgNCiMjDQpBU0MJCQk9IEFTQwkJCQkJIyMJ0JTQu9GPINGP0LfRi9C60L7QsiDRgSDQtNCy0YPRhdCx0LDQudGC0L7QstGL0LzQuCDQvdCw0LHQvtGA0LDQvNC4INC30L3QsNC60L7QsiAo0L3QsNC/0YDQuNC80LXRgCwg0LrQsNGC0LDQutCw0L3QsCkg0L/RgNC10L7QsdGA0LDQt9GD0LXRgiDQv9C+0LvQvdC+0YjQuNGA0LjQvdC90YvQtSAo0LTQstGD0YXQsdCw0LnRgtC+0LLRi9C1KSDQt9C90LDQutC4INCyINC/0L7Qu9GD0YjQuNGA0LjQvdC90YvQtSAo0L7QtNC90L7QsdCw0LnRgtC+0LLRi9C1KS4NCkJBSFRURVhUCQk9INCR0JDQotCi0JXQmtCh0KIJCQkJIyMJ0J/RgNC10L7QsdGA0LDQt9GD0LXRgiDRh9C40YHQu9C+INCyINGC0LXQutGB0YIsINC40YHQv9C+0LvRjNC30YPRjyDQtNC10L3QtdC20L3Ri9C5INGE0L7RgNC80LDRgiDDnyAo0JHQkNCiKS4NCkNIQVIJCQk9INCh0JjQnNCS0J7QmwkJCQkjIwnQktC+0LfQstGA0LDRidCw0LXRgiDQt9C90LDQuiDRgSDQt9Cw0LTQsNC90L3Ri9C8INC60L7QtNC+0LwuDQpDTEVBTgkJCT0g0J/QldCn0KHQmNCc0JIJCQkJIyMJ0KPQtNCw0LvRj9C10YIg0LLRgdC1INC90LXQv9C10YfQsNGC0LDQtdC80YvQtSDQt9C90LDQutC4INC40Lcg0YLQtdC60YHRgtCwLg0KQ09ERQkJCT0g0JrQntCU0KHQmNCc0JIJCQkJIyMJ0JLQvtC30LLRgNCw0YnQsNC10YIg0YfQuNGB0LvQvtCy0L7QuSDQutC+0LQg0L/QtdGA0LLQvtCz0L4g0LfQvdCw0LrQsCDQsiDRgtC10LrRgdGC0L7QstC+0Lkg0YHRgtGA0L7QutC1Lg0KQ09OQ0FURU5BVEUJCT0g0KHQptCV0J/QmNCi0KwJCQkJIyMJ0J7QsdGK0LXQtNC40L3Rj9C10YIg0L3QtdGB0LrQvtC70YzQutC+INGC0LXQutGB0YLQvtCy0YvRhSDRjdC70LXQvNC10L3RgtC+0LIg0LIg0L7QtNC40L0uDQpET0xMQVIJCQk9INCg0KPQkdCb0KwJCQkJCSMjCdCf0YDQtdC+0LHRgNCw0LfRg9C10YIg0YfQuNGB0LvQviDQsiDRgtC10LrRgdGCLCDQuNGB0L/QvtC70YzQt9GD0Y8g0LTQtdC90LXQttC90YvQuSDRhNC+0YDQvNCw0YIuDQpFWEFDVAkJCT0g0KHQntCS0J/QkNCUCQkJCSMjCdCf0YDQvtCy0LXRgNGP0LXRgiDQuNC00LXQvdGC0LjRh9C90L7RgdGC0Ywg0LTQstGD0YUg0YLQtdC60YHRgtC+0LLRi9GFINC30L3QsNGH0LXQvdC40LkuDQpGSU5ECQkJPSDQndCQ0JnQotCYCQkJCQkjIwnQmNGJ0LXRgiDQstGF0L7QttC00LXQvdC40Y8g0L7QtNC90L7Qs9C+INGC0LXQutGB0YLQvtCy0L7Qs9C+INC30L3QsNGH0LXQvdC40Y8g0LIg0LTRgNGD0LPQvtC8ICjRgSDRg9GH0LXRgtC+0Lwg0YDQtdCz0LjRgdGC0YDQsCkuDQpGSU5EQgkJCT0g0J3QkNCZ0KLQmNCRCQkJCSMjCdCY0YnQtdGCINCy0YXQvtC20LTQtdC90LjRjyDQvtC00L3QvtCz0L4g0YLQtdC60YHRgtC+0LLQvtCz0L4g0LfQvdCw0YfQtdC90LjRjyDQsiDQtNGA0YPQs9C+0LwgKNGBINGD0YfQtdGC0L7QvCDRgNC10LPQuNGB0YLRgNCwKS4NCkZJWEVECQkJPSDQpNCY0JrQodCY0KDQntCS0JDQndCd0KvQmQkJCQkjIwnQpNC+0YDQvNCw0YLQuNGA0YPQtdGCINGH0LjRgdC70L4g0Lgg0L/RgNC10L7QsdGA0LDQt9GD0LXRgiDQtdCz0L4g0LIg0YLQtdC60YHRgiDRgSDQt9Cw0LTQsNC90L3Ri9C8INGH0LjRgdC70L7QvCDQtNC10YHRj9GC0LjRh9C90YvRhSDQt9C90LDQutC+0LIuDQpKSVMJCQk9IEpJUwkJCQkJIyMJ0JTQu9GPINGP0LfRi9C60L7QsiDRgSDQtNCy0YPRhdCx0LDQudGC0L7QstGL0LzQuCDQvdCw0LHQvtGA0LDQvNC4INC30L3QsNC60L7QsiAo0L3QsNC/0YDQuNC80LXRgCwg0LrQsNGC0LDQutCw0L3QsCkg0L/RgNC10L7QsdGA0LDQt9GD0LXRgiDQv9C+0LvRg9GI0LjRgNC40L3QvdGL0LUgKNC+0LTQvdC+0LHQsNC50YLQvtCy0YvQtSkg0LfQvdCw0LrQuCDQsiDRgtC10LrRgdGC0L7QstC+0Lkg0YHRgtGA0L7QutC1INCyINC/0L7Qu9C90L7RiNC40YDQuNC90L3Ri9C1ICjQtNCy0YPRhdCx0LDQudGC0L7QstGL0LUpLg0KTEVGVAkJCT0g0JvQldCS0KHQmNCc0JIJCQkJIyMJ0JLQvtC30LLRgNCw0YnQsNC10YIg0LrRgNCw0LnQvdC40LUg0YHQu9C10LLQsCDQt9C90LDQutC4INGC0LXQutGB0YLQvtCy0L7Qs9C+INC30L3QsNGH0LXQvdC40Y8uDQpMRUZUQgkJCT0g0JvQldCS0JEJCQkJCSMjCdCS0L7Qt9Cy0YDQsNGJ0LDQtdGCINC60YDQsNC50L3QuNC1INGB0LvQtdCy0LAg0LfQvdCw0LrQuCDRgtC10LrRgdGC0L7QstC+0LPQviDQt9C90LDRh9C10L3QuNGPLg0KTEVOCQkJPSDQlNCb0KHQotCgCQkJCQkjIwnQktC+0LfQstGA0LDRidCw0LXRgiDQutC+0LvQuNGH0LXRgdGC0LLQviDQt9C90LDQutC+0LIg0LIg0YLQtdC60YHRgtC+0LLQvtC5INGB0YLRgNC+0LrQtS4NCkxFTkIJCQk9INCU0JvQmNCd0JEJCQkJCSMjCdCS0L7Qt9Cy0YDQsNGJ0LDQtdGCINC60L7Qu9C40YfQtdGB0YLQstC+INC30L3QsNC60L7QsiDQsiDRgtC10LrRgdGC0L7QstC+0Lkg0YHRgtGA0L7QutC1Lg0KTE9XRVIJCQk9INCh0KLQoNCe0KfQnQkJCQkjIwnQn9GA0LXQvtCx0YDQsNC30YPQtdGCINCy0YHQtSDQsdGD0LrQstGLINGC0LXQutGB0YLQsCDQsiDRgdGC0YDQvtGH0L3Ri9C1Lg0KTUlECQkJPSDQn9Ch0KLQoAkJCQkJIyMJ0JLQvtC30LLRgNCw0YnQsNC10YIg0LfQsNC00LDQvdC90L7QtSDRh9C40YHQu9C+INC30L3QsNC60L7QsiDQuNC3INGB0YLRgNC+0LrQuCDRgtC10LrRgdGC0LAsINC90LDRh9C40L3QsNGPINGBINGD0LrQsNC30LDQvdC90L7QuSDQv9C+0LfQuNGG0LjQuC4NCk1JREIJCQk9INCf0KHQotCg0JEJCQkJCSMjCdCS0L7Qt9Cy0YDQsNGJ0LDQtdGCINC30LDQtNCw0L3QvdC+0LUg0YfQuNGB0LvQviDQt9C90LDQutC+0LIg0LjQtyDRgdGC0YDQvtC60Lgg0YLQtdC60YHRgtCwLCDQvdCw0YfQuNC90LDRjyDRgSDRg9C60LDQt9Cw0L3QvdC+0Lkg0L/QvtC30LjRhtC40LguDQpQSE9ORVRJQwkJPSBQSE9ORVRJQwkJCQkjIwnQmNC30LLQu9C10LrQsNC10YIg0YTQvtC90LXRgtC40YfQtdGB0LrQuNC1ICjRhNGD0YDQuNCz0LDQvdCwKSDQt9C90LDQutC4INC40Lcg0YLQtdC60YHRgtC+0LLQvtC5INGB0YLRgNC+0LrQuC4NClBST1BFUgkJCT0g0J/QoNCe0J/QndCQ0KcJCQkJIyMJ0J/RgNC10L7QsdGA0LDQt9GD0LXRgiDQv9C10YDQstGD0Y4g0LHRg9C60LLRgyDQsiDQutCw0LbQtNC+0Lwg0YHQu9C+0LLQtSDRgtC10LrRgdGC0LAg0LIg0L/RgNC+0L/QuNGB0L3Rg9GOLg0KUkVQTEFDRQkJCT0g0JfQkNCc0JXQndCY0KLQrAkJCQkjIwnQl9Cw0LzQtdC90Y/QtdGCINC30L3QsNC60Lgg0LIg0YLQtdC60YHRgtC1Lg0KUkVQTEFDRUIJCT0g0JfQkNCc0JXQndCY0KLQrNCRCQkJCSMjCdCX0LDQvNC10L3Rj9C10YIg0LfQvdCw0LrQuCDQsiDRgtC10LrRgdGC0LUuDQpSRVBUCQkJPSDQn9Ce0JLQotCe0KAJCQkJIyMJ0J/QvtCy0YLQvtGA0Y/QtdGCINGC0LXQutGB0YIg0LfQsNC00LDQvdC90L7QtSDRh9C40YHQu9C+INGA0LDQty4NClJJR0hUCQkJPSDQn9Cg0JDQktCh0JjQnNCSCQkJCSMjCdCS0L7Qt9Cy0YDQsNGJ0LDQtdGCINC60YDQsNC50L3QuNC1INGB0L/RgNCw0LLQsCDQt9C90LDQutC4INGC0LXQutGB0YLQvtCy0L7QuSDRgdGC0YDQvtC60LguDQpSSUdIVEIJCQk9INCf0KDQkNCS0JEJCQkJCSMjCdCS0L7Qt9Cy0YDQsNGJ0LDQtdGCINC60YDQsNC50L3QuNC1INGB0L/RgNCw0LLQsCDQt9C90LDQutC4INGC0LXQutGB0YLQvtCy0L7QuSDRgdGC0YDQvtC60LguDQpTRUFSQ0gJCQk9INCf0J7QmNCh0JoJCQkJCSMjCdCY0YnQtdGCINCy0YXQvtC20LTQtdC90LjRjyDQvtC00L3QvtCz0L4g0YLQtdC60YHRgtC+0LLQvtCz0L4g0LfQvdCw0YfQtdC90LjRjyDQsiDQtNGA0YPQs9C+0LwgKNCx0LXQtyDRg9GH0LXRgtCwINGA0LXQs9C40YHRgtGA0LApLg0KU0VBUkNIQgkJCT0g0J/QntCY0KHQmtCRCQkJCSMjCdCY0YnQtdGCINCy0YXQvtC20LTQtdC90LjRjyDQvtC00L3QvtCz0L4g0YLQtdC60YHRgtC+0LLQvtCz0L4g0LfQvdCw0YfQtdC90LjRjyDQsiDQtNGA0YPQs9C+0LwgKNCx0LXQtyDRg9GH0LXRgtCwINGA0LXQs9C40YHRgtGA0LApLg0KU1VCU1RJVFVURQkJPSDQn9Ce0JTQodCi0JDQktCY0KLQrAkJCQkjIwnQl9Cw0LzQtdC90Y/QtdGCINCyINGC0LXQutGB0YLQvtCy0L7QuSDRgdGC0YDQvtC60LUg0YHRgtCw0YDRi9C5INGC0LXQutGB0YIg0L3QvtCy0YvQvC4NClQJCQk9INCiCQkJCQkjIwnQn9GA0LXQvtCx0YDQsNC30YPQtdGCINCw0YDQs9GD0LzQtdC90YLRiyDQsiDRgtC10LrRgdGCLg0KVEVYVAkJCT0g0KLQldCa0KHQogkJCQkJIyMJ0KTQvtGA0LzQsNGC0LjRgNGD0LXRgiDRh9C40YHQu9C+INC4INC/0YDQtdC+0LHRgNCw0LfRg9C10YIg0LXQs9C+INCyINGC0LXQutGB0YIuDQpUUklNCQkJPSDQodCW0J/QoNCe0JHQldCb0KsJCQkJIyMJ0KPQtNCw0LvRj9C10YIg0LjQtyDRgtC10LrRgdGC0LAg0L/RgNC+0LHQtdC70YsuDQpVUFBFUgkJCT0g0J/QoNCe0J/QmNCh0J0JCQkJIyMJ0J/RgNC10L7QsdGA0LDQt9GD0LXRgiDQstGB0LUg0LHRg9C60LLRiyDRgtC10LrRgdGC0LAg0LIg0L/RgNC+0L/QuNGB0L3Ri9C1Lg0KVkFMVUUJCQk9INCX0J3QkNCn0JXQnQkJCQkjIwnQn9GA0LXQvtCx0YDQsNC30YPQtdGCINGC0LXQutGB0YLQvtCy0YvQuSDQsNGA0LPRg9C80LXQvdGCINCyINGH0LjRgdC70L4uDQo=]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/locale/sv/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/locale/sv/config</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[77u/IyMNCiMjIFBIUEV4Y2VsDQojIw0NCiMjIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTEgUEhQRXhjZWwNCiMjDQojIyBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yDQojIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljDQojIyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXINCiMjIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLg0KIyMNCiMjIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLA0KIyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YNCiMjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VDQojIyBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLg0KIyMNCiMjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMNCiMjIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUNCiMjIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQ0KIyMNCiMjIEBjYXRlZ29yeSAgIFBIUEV4Y2VsDQojIyBAcGFja2FnZSAgICBQSFBFeGNlbF9TZXR0aW5ncw0KIyMgQGNvcHlyaWdodCAgQ29weXJpZ2h0IChjKSAyMDA2IC0gMjAxMSBQSFBFeGNlbCAoaHR0cDovL3d3dy5jb2RlcGxleC5jb20vUEhQRXhjZWwpDQojIyBAbGljZW5zZSAgICBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvb2xkLWxpY2Vuc2VzL2xncGwtMi4xLnR4dAlMR1BMDQojIyBAdmVyc2lvbiAgICAxLjcuNywgMjAxMi0wNS0xOQ0KIyMNCiMjDQoNCg0KQXJndW1lbnRTZXBhcmF0b3IJPSA7DQoNCg0KIyMNCiMjCShGb3IgZnV0dXJlIHVzZSkNCiMjDQpjdXJyZW5jeVN5bWJvbAk9IGtyDQoNCg0KIyMNCiMjCUV4Y2VsIEVycm9yIENvZGVzCShGb3IgZnV0dXJlIHVzZSkNDQojIw0KTlVMTAk9ICNTa8Okcm5pbmchDQpESVYwCT0gI0RpdmlzaW9uLzAhDQpWQUxVRQk9ICNWw6RyZGVmZWwhDQpSRUYJPSAjUmVmZXJlbnMhDQpOQU1FCT0gI05hbW4/DQpOVU0JPSAjT2dpbHRpZ3QhDQpOQQk9ICNTYWtuYXMhDQo=]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/locale/sv/functions</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[77u/IyMNCiMjCUFkZC1pbiBhbmQgQXV0b21hdGlvbiBmdW5jdGlvbnMJCQlUaWxsw6RnZ3MtIG9jaCBhdXRvbWF0aXNlcmluZ3NmdW5rdGlvbmVyDQojIw0KR0VUUElWT1REQVRBCQk9IEjDhE1UQS5QSVZPVERBVEEJCSMjCVJldHVybmVyYXIgZGF0YSBzb20gbGFncmF0cyBpIGVuIHBpdm90dGFiZWxscmFwcG9ydA0KDQoNCiMjDQojIwlDdWJlIGZ1bmN0aW9ucwkJCQkJS3ViZnVua3Rpb25lcg0KIyMNCkNVQkVLUElNRU1CRVIJCT0gS1VCS1BJTUVETEVNCQkJIyMJUmV0dXJuZXJhciBuYW1uLCBlZ2Vuc2thcCBvY2ggbcOldHQgZsO2ciBlbiBLUEkgb2NoIHZpc2FyIG5hbW5ldCBvY2ggZWdlbnNrYXBlbiBpIGNlbGxlbi4gRW4gS1BJLCBlbGxlciBwcmVzdGFuZGFpbmRpa2F0b3IsIMOkciBldHQga3ZhbnRpZmllcmJhcnQgbcOldHQsIHQuZXguIG3DpW5hdGxpZyBicnV0dG92aW5zdCBlbGxlciBwZXJzb25hbG9tc8OkdHRuaW5nIHBlciBrdmFydGFsLCBzb20gYW52w6RuZHMgZsO2ciBhdHQgYW5hbHlzZXJhIGV0dCBmw7ZyZXRhZ3MgcmVzdWx0YXQuDQpDVUJFTUVNQkVSCQk9IEtVQk1FRExFTQkJCSMjCVJldHVybmVyYXIgZW4gbWVkbGVtIGVsbGVyIGV0dCBwYXIgaSBlbiBrdWJoaWVyYXJraS4gQW52w6RuZHMgZsO2ciBhdHQgdmVyaWZpZXJhIGF0dCBtZWRsZW1tZW4gZWxsZXIgcGFyZXQgZmlubnMgaSBrdWJlbi4NCkNVQkVNRU1CRVJQUk9QRVJUWQk9IEtVQk1FRExFTVNFR0VOU0tBUAkJIyMJUmV0dXJuZXJhciB2w6RyZGV0IGbDtnIgZW4gbWVkbGVtc2VnZW5za2FwIGkga3ViZW4uIEFudsOkbmRzIGbDtnIgYXR0IHZlcmlmaWVyYSBhdHQgZXR0IG1lZGxlbXNuYW1uIGZpbm5zIGkga3ViZW4sIHNhbXQgZsO2ciBhdHQgcmV0dXJuZXJhIGRlbiBhbmdpdm5hIGVnZW5za2FwZW4gZsO2ciBtZWRsZW1tZW4uDQpDVUJFUkFOS0VETUVNQkVSCT0gS1VCUkFOR09SRE5BRE1FRExFTQkJIyMJUmV0dXJuZXJhciBkZW4gbjp0ZSwgZWxsZXIgcmFuZ29yZG5hZGUsIG1lZGxlbW1lbiBpIGVuIHVwcHPDpHR0bmluZy4gQW52w6RuZHMgZsO2ciBhdHQgcmV0dXJuZXJhIGV0dCBlbGxlciBmbGVyYSBlbGVtZW50IGkgZW4gdXBwc8OkdHRuaW5nLCB0aWxsIGV4ZW1wZWx2aXMgZGVuIGLDpHN0YSBmw7Zyc8OkbGphcmVuIGVsbGVyIGRlIHRpbyBiw6RzdGEgZWxldmVybmEuDQpDVUJFU0VUCQkJPSBLVUJJTlNUw4RMTE5JTkcJCSMjCURlZmluaWVyYXIgZW4gYmVyw6RrbmFkIHVwcHPDpHR0bmluZyBtZWRsZW1tYXIgZWxsZXIgcGFyIGdlbm9tIGF0dCBza2lja2EgZXR0IGJlc3TDpG10IHV0dHJ5Y2sgdGlsbCBrdWJlbiBww6Ugc2VydmVybiwgc29tIHNrYXBhciB1cHBzw6R0dG5pbmdlbiBvY2ggc2VkYW4gcmV0dXJuZXJhciBkZW4gdGlsbCBNaWNyb3NvZnQgT2ZmaWNlIEV4Y2VsLg0KQ1VCRVNFVENPVU5UCQk9IEtVQklOU1TDhExMTklOR0FOVEFMCQkjIwlSZXR1cm5lcmFyIGFudGFsZXQgb2JqZWt0IGkgZW4gdXBwc8OkdHRuaW5nLg0KQ1VCRVZBTFVFCQk9IEtVQlbDhFJERQkJCSMjCVJldHVybmVyYXIgZXR0IG3DpG5nZHbDpHJkZSBmcsOlbiBlbiBrdWIuDQoNCg0KIyMNCiMjCURhdGFiYXNlIGZ1bmN0aW9ucwkJCQlEYXRhYmFzZnVua3Rpb25lcg0KIyMNCkRBVkVSQUdFCQk9IERNRURFTAkJCSMjCVJldHVybmVyYXIgbWVkZWx2w6RyZGV0IGF2IGRhdGFiYXNwb3N0ZXJuYQ0KRENPVU5UCQkJPSBEQU5UQUwJCQkjIwlSw6RrbmFyIGFudGFsZXQgY2VsbGVyIHNvbSBpbm5laMOlbGxlciB0YWwgaSBlbiBkYXRhYmFzDQpEQ09VTlRBCQkJPSBEQU5UQUxWCQkJIyMJUsOka25hciBpZnlsbGRhIGNlbGxlciBpIGVuIGRhdGFiYXMNCkRHRVQJCQk9IERIw4RNVEEJCQkjIwlIw6RtdGFyIGVuIGVuc3Rha2EgcG9zdCBmcsOlbiBlbiBkYXRhYmFzIHNvbSB1cHBmeWxsZXIgZGUgYW5naXZuYSB2aWxsa29yZW4NCkRNQVgJCQk9IERNQVgJCQkJIyMJUmV0dXJuZXJhciBkZXQgc3TDtnJzdGEgdsOkcmRldCBmcsOlbiBkYXRhYmFzcG9zdGVybmENCkRNSU4JCQk9IERNSU4JCQkJIyMJUmV0dXJuZXJhciBkZXQgbWluc3RhIHbDpHJkZXQgZnLDpW4gZGF0YWJhc3Bvc3Rlcm5hDQpEUFJPRFVDVAkJPSBEUFJPRFVLVAkJCSMjCU11bHRpcGxpY2VyYXIgdsOkcmRlbmEgaSBldHQgdmlzc3QgZsOkbHQgaSBwb3N0ZXIgc29tIHVwcGZ5bGxlciB2aWxsa29yZXQNCkRTVERFVgkJCT0gRFNUREFWCQkJIyMJVXBwc2thdHRhciBzdGFuZGFyZGF2dmlrZWxzZW4gYmFzZXJhdCBww6UgZXR0IHVydmFsIGF2IGRhdGFiYXNwb3N0ZXJuYQ0KRFNUREVWUAkJCT0gRFNUREFWUAkJCSMjCUJlcsOka25hciBzdGFuZGFyZGF2dmlrZWxzZW4gdXRpZnLDpW4gaGVsYSBwb3B1bGF0aW9uZW4gYXYgdmFsZGEgZGF0YWJhc3Bvc3Rlcg0KRFNVTQkJCT0gRFNVTU1BCQkJIyMJU3VtbWVyYXIgdGFsZW4gaSBrb2x1bW5mw6RsdCBpIGRhdGFiYXNwb3N0ZXIgc29tIHVwcGZ5bGxlciB2aWxsa29yZXQNCkRWQVIJCQk9IERWQVJJQU5TCQkJIyMJVXBwc2thdHRhciB2YXJpYW5zZW4gYmFzZXJhdCBww6UgZXR0IHVydmFsIGF2IGRhdGFiYXNwb3N0ZXJuYQ0KRFZBUlAJCQk9IERWQVJJQU5TUAkJCSMjCUJlcsOka25hciB2YXJpYW5zZW4gdXRpZnLDpW4gaGVsYSBwb3B1bGF0aW9uZW4gYXYgdmFsZGEgZGF0YWJhc3Bvc3Rlcg0KDQoNCiMjDQojIwlEYXRlIGFuZCB0aW1lIGZ1bmN0aW9ucwkJCQlUaWQtIG9jaCBkYXR1bWZ1bmt0aW9uZXINCiMjDQpEQVRFCQkJPSBEQVRVTQkJCQkjIwlSZXR1cm5lcmFyIGV0dCBzZXJpZW51bW1lciBmw7ZyIGV0dCB2aXNzdCBkYXR1bQ0KREFURVZBTFVFCQk9IERBVFVNVsOEUkRFCQkJIyMJS29udmVydGVyYXIgZXR0IGRhdHVtIGkgdGV4dGZvcm1hdCB0aWxsIGV0dCBzZXJpZW51bW1lcg0KREFZCQkJPSBEQUcJCQkJIyMJS29udmVydGVyYXIgZXR0IHNlcmllbnVtbWVyIHRpbGwgZGFnIGkgbcOlbmFkZW4NCkRBWVMzNjAJCQk9IERBR0FSMzYwCQkJIyMJQmVyw6RrbmFyIGFudGFsZXQgZGFnYXIgbWVsbGFuIHR2w6UgZGF0dW0gYmFzZXJhdCBww6UgZXR0IDM2MC1kYWdhcnPDpXINCkVEQVRFCQkJPSBFREFUVU0JCQkjIwlSZXR1cm5lcmFyIHNlcmllbnVtcmV0IGbDtnIgZXR0IGRhdHVtIHNvbSBpbmZhbGxlciBldHQgdmlzc3QgYW50YWwgbcOlbmFkZXIgZsO2cmUgZWxsZXIgZWZ0ZXIgc3RhcnRkYXR1bWV0DQpFT01PTlRICQkJPSBTTFVUTcOFTkFECQkJIyMJUmV0dXJuZXJhciBzZXJpZW51bXJldCBmw7ZyIHNpc3RhIGRhZ2VuIGkgbcOlbmFkZW4gZXR0IHZpc3N0IGFudGFsIG3DpW5hZGVyIHRpZGlnYXJlIGVsbGVyIHNlbmFyZQ0KSE9VUgkJCT0gVElNTUUJCQkJIyMJS29udmVydGVyYXIgZXR0IHNlcmllbnVtbWVyIHRpbGwgZW4gdGltbWUNCk1JTlVURQkJCT0gTUlOVVQJCQkJIyMJS29udmVydGVyYXIgZXR0IHNlcmllbnVtbWVyIHRpbGwgZW4gbWludXQNCk1PTlRICQkJPSBNw4VOQUQJCQkJIyMJS29udmVydGVyYXIgZXR0IHNlcmllbnVtbWVyIHRpbGwgZW4gbcOlbmFkDQpORVRXT1JLREFZUwkJPSBORVRUT0FSQkVUU0RBR0FSCQkjIwlSZXR1cm5lcmFyIGFudGFsZXQgaGVsYSBhcmJldHNkYWdhciBtZWxsYW4gdHbDpSBkYXR1bQ0KTk9XCQkJPSBOVQkJCQkjIwlSZXR1cm5lcmFyIHNlcmllbnVtcmV0IGbDtnIgZGFnZW5zIGRhdHVtIG9jaCBha3R1ZWxsIHRpZA0KU0VDT05ECQkJPSBTRUtVTkQJCQkjIwlLb252ZXJ0ZXJhciBldHQgc2VyaWVudW1tZXIgdGlsbCBlbiBzZWt1bmQNClRJTUUJCQk9IEtMT0NLU0xBRwkJCSMjCVJldHVybmVyYXIgc2VyaWVudW1yZXQgZsO2ciBlbiB2aXNzIHRpZA0KVElNRVZBTFVFCQk9IFRJRFbDhFJERQkJCSMjCUtvbnZlcnRlcmFyIGVuIHRpZCBpIHRleHRmb3JtYXQgdGlsbCBldHQgc2VyaWVudW1tZXINClRPREFZCQkJPSBJREFHCQkJCSMjCVJldHVybmVyYXIgc2VyaWVudW1yZXQgZsO2ciBkYWdlbnMgZGF0dW0NCldFRUtEQVkJCQk9IFZFQ0tPREFHCQkJIyMJS29udmVydGVyYXIgZXR0IHNlcmllbnVtbWVyIHRpbGwgZW4gZGFnIGkgdmVja2FuDQpXRUVLTlVNCQkJPSBWRUNLT05SCQkJIyMJS29udmVydGVyYXIgZXR0IHNlcmllbnVtbWVyIHRpbGwgZXR0IHZlY2tvbnVtbWVyDQpXT1JLREFZCQkJPSBBUkJFVFNEQUdBUgkJCSMjCVJldHVybmVyYXIgc2VyaWVudW1yZXQgZsO2ciBldHQgZGF0dW0gZXR0IHZpc3N0IGFudGFsIGFyYmV0c2RhZ2FyIHRpZGlnYXJlIGVsbGVyIHNlbmFyZQ0KWUVBUgkJCT0gw4VSCQkJCSMjCUtvbnZlcnRlcmFyIGV0dCBzZXJpZW51bW1lciB0aWxsIGV0dCDDpXINCllFQVJGUkFDCQk9IMOFUkRFTAkJCQkjIwlSZXR1cm5lcmFyIGVuIGRlbCBhdiBldHQgw6VyIHNvbSByZXByZXNlbnRlcmFyIGFudGFsZXQgaGVsYSBkYWdhciBtZWxsYW4gc3RhcnQtIG9jaCBzbHV0ZGF0dW0NCg0KDQojIw0KIyMJRW5naW5lZXJpbmcgZnVuY3Rpb25zCQkJCVRla25pc2thIGZ1bmt0aW9uZXINCiMjDQpCRVNTRUxJCQkJPSBCRVNTRUxJCQkJIyMJUmV0dXJuZXJhciBkZW4gbW9kaWZpZXJhZGUgQmVzc2VsLWZ1bmt0aW9uZW4gSW4oeCkNCkJFU1NFTEoJCQk9IEJFU1NFTEoJCQkjIwlSZXR1cm5lcmFyIEJlc3NlbC1mdW5rdGlvbmVuIEpuKHgpDQpCRVNTRUxLCQkJPSBCRVNTRUxLCQkJIyMJUmV0dXJuZXJhciBkZW4gbW9kaWZpZXJhZGUgQmVzc2VsLWZ1bmt0aW9uZW4gS24oeCkNCkJFU1NFTFkJCQk9IEJFU1NFTFkJCQkjIwlSZXR1cm5lcmFyIEJlc3NlbC1mdW5rdGlvbmVuIFluKHgpDQpCSU4yREVDCQkJPSBCSU4uVElMTC5ERUMJCQkjIwlPbXZhbmRsYXIgZXR0IGJpbsOkcnQgdGFsIHRpbGwgZGVjaW1hbHQNCkJJTjJIRVgJCQk9IEJJTi5USUxMLkhFWAkJCSMjCU9tdmFuZGxhciBldHQgYmluw6RydCB0YWwgdGlsbCBoZXhhZGVjaW1hbHQNCkJJTjJPQ1QJCQk9IEJJTi5USUxMLk9LVAkJCSMjCU9tdmFuZGxhciBldHQgYmluw6RydCB0YWwgdGlsbCBva3RhbHQNCkNPTVBMRVgJCQk9IEtPTVBMRVgJCQkjIwlPbXZhbmRsYXIgcmVlbGxhIG9jaCBpbWFnaW7DpHJhIGtvZWZmaWNpZW50ZXIgdGlsbCBldHQga29tcGxleHQgdGFsDQpDT05WRVJUCQkJPSBLT05WRVJURVJBCQkJIyMJT212YW5kbGFyIGV0dCB0YWwgZnLDpW4gZXR0IG3DpXR0c3lzdGVtIHRpbGwgZXR0IGFubmF0DQpERUMyQklOCQkJPSBERUMuVElMTC5CSU4JCQkjIwlPbXZhbmRsYXIgZXR0IGRlY2ltYWx0IHRhbCB0aWxsIGJpbsOkcnQNCkRFQzJIRVgJCQk9IERFQy5USUxMLkhFWAkJCSMjCU9tdmFuZGxhciBldHQgZGVjaW1hbHQgdGFsIHRpbGwgaGV4YWRlY2ltYWx0DQpERUMyT0NUCQkJPSBERUMuVElMTC5PS1QJCQkjIwlPbXZhbmRsYXIgZXR0IGRlY2ltYWx0IHRhbCB0aWxsIG9rdGFsdA0KREVMVEEJCQk9IERFTFRBCQkJCSMjCVRlc3RhciBvbSB0dsOlIHbDpHJkZW4gw6RyIGxpa2ENCkVSRgkJCT0gRkVMRgkJCQkjIwlSZXR1cm5lcmFyIGZlbGZ1bmt0aW9uZW4NCkVSRkMJCQk9IEZFTEZLCQkJCSMjCVJldHVybmVyYXIgZGVuIGtvbXBsZW1lbnTDpHJhIGZlbGZ1bmt0aW9uZW4NCkdFU1RFUAkJCT0gU0xTVEVHCQkJIyMJVGVzdGFyIG9tIGV0dCB0YWwgw6RyIHN0w7ZycmUgw6RuIGV0dCB0csO2c2tlbHbDpHJkZQ0KSEVYMkJJTgkJCT0gSEVYLlRJTEwuQklOCQkJIyMJT212YW5kbGFyIGV0dCBoZXhhZGVjaW1hbHQgdGFsIHRpbGwgYmluw6RydA0KSEVYMkRFQwkJCT0gSEVYLlRJTEwuREVDCQkJIyMJT212YW5kbGFyIGV0dCBoZXhhZGVjaW1hbHQgdGFsIHRpbGwgZGVjaW1hbHQNCkhFWDJPQ1QJCQk9IEhFWC5USUxMLk9LVAkJCSMjCU9tdmFuZGxhciBldHQgaGV4YWRlY2ltYWx0IHRhbCB0aWxsIG9rdGFsdA0KSU1BQlMJCQk9IElNQUJTCQkJCSMjCVJldHVybmVyYXIgYWJzb2x1dHbDpHJkZXQgKG1vZHVsdXMpIGbDtnIgZXR0IGtvbXBsZXh0IHRhbA0KSU1BR0lOQVJZCQk9IElNQUdJTsOEUgkJCSMjCVJldHVybmVyYXIgZGVuIGltYWdpbsOkcmEga29lZmZpY2llbnRlbiBmw7ZyIGV0dCBrb21wbGV4dCB0YWwNCklNQVJHVU1FTlQJCT0gSU1BUkdVTUVOVAkJCSMjCVJldHVybmVyYXIgZGV0IGtvbXBsZXhhIHRhbGV0cyBhcmd1bWVudCwgZW4gdmlua2VsIHV0dHJ5Y2t0IGkgcmFkaWFuZXINCklNQ09OSlVHQVRFCQk9IElNS09OSlVHQVQJCQkjIwlSZXR1cm5lcmFyIGRldCBrb21wbGV4YSB0YWxldHMga29uanVnYXQNCklNQ09TCQkJPSBJTUNPUwkJCQkjIwlSZXR1cm5lcmFyIGNvc2ludXMgZsO2ciBldHQga29tcGxleHQgdGFsDQpJTURJVgkJCT0gSU1ESVYJCQkJIyMJUmV0dXJuZXJhciBrdm90ZW4gZsO2ciB0dsOlIGtvbXBsZXhhIHRhbA0KSU1FWFAJCQk9IElNRVVQUEjDlkpUCQkJIyMJUmV0dXJuZXJhciBleHBvbmVudGVuIGbDtnIgZXR0IGtvbXBsZXh0IHRhbA0KSU1MTgkJCT0gSU1MTgkJCQkjIwlSZXR1cm5lcmFyIGRlbiBuYXR1cmxpZ2EgbG9nYXJpdG1lbiBmw7ZyIGV0dCBrb21wbGV4dCB0YWwNCklNTE9HMTAJCQk9IElNTE9HMTAJCQkjIwlSZXR1cm5lcmFyIDEwLWxvZ2FyaXRtZW4gZsO2ciBldHQga29tcGxleHQgdGFsDQpJTUxPRzIJCQk9IElNTE9HMgkJCSMjCVJldHVybmVyYXIgMi1sb2dhcml0bWVuIGbDtnIgZXR0IGtvbXBsZXh0IHRhbA0KSU1QT1dFUgkJCT0gSU1VUFBIw5ZKVAkJCSMjCVJldHVybmVyYXIgZXR0IGtvbXBsZXh0IHRhbCB1cHBow7ZqdCB0aWxsIGVuIGV4cG9uZW50DQpJTVBST0RVQ1QJCT0gSU1QUk9EVUtUCQkJIyMJUmV0dXJuZXJhciBwcm9kdWt0ZW4gYXYga29tcGxleGEgdGFsDQpJTVJFQUwJCQk9IElNUkVBTAkJCSMjCVJldHVybmVyYXIgZGVuIHJlZWxsYSBrb2VmZmljaWVudGVuIGbDtnIgZXR0IGtvbXBsZXh0IHRhbA0KSU1TSU4JCQk9IElNU0lOCQkJCSMjCVJldHVybmVyYXIgc2ludXMgZsO2ciBldHQga29tcGxleHQgdGFsDQpJTVNRUlQJCQk9IElNUk9UCQkJCSMjCVJldHVybmVyYXIga3ZhZHJhdHJvdGVuIGF2IGV0dCBrb21wbGV4dCB0YWwNCklNU1VCCQkJPSBJTURJRkYJCQkjIwlSZXR1cm5lcmFyIGRpZmZlcmVuc2VuIG1lbGxhbiB0dsOlIGtvbXBsZXhhIHRhbA0KSU1TVU0JCQk9IElNU1VNCQkJCSMjCVJldHVybmVyYXIgc3VtbWFuIGF2IGtvbXBsZXhhIHRhbA0KT0NUMkJJTgkJCT0gT0tULlRJTEwuQklOCQkJIyMJT212YW5kbGFyIGV0dCBva3RhbHQgdGFsIHRpbGwgYmluw6RydA0KT0NUMkRFQwkJCT0gT0tULlRJTEwuREVDCQkJIyMJT212YW5kbGFyIGV0dCBva3RhbHQgdGFsIHRpbGwgZGVjaW1hbHQNCk9DVDJIRVgJCQk9IE9LVC5USUxMLkhFWAkJCSMjCU9tdmFuZGxhciBldHQgb2t0YWx0IHRhbCB0aWxsIGhleGFkZWNpbWFsdA0KDQoNCiMjDQojIwlGaW5hbmNpYWwgZnVuY3Rpb25zCQkJCUZpbmFuc2llbGxhIGZ1bmt0aW9uZXINCiMjDQpBQ0NSSU5UCQkJPSBVUFBMUsOETlRBCQkJIyMJUmV0dXJuZXJhciBkZW4gdXBwbHVwbmEgcsOkbnRhbiBmw7ZyIHbDpHJkZXBhcHBlciBtZWQgcGVyaW9kaXNrIHLDpG50YQ0KQUNDUklOVE0JCT0gVVBQTE9CTFLDhE5UQQkJCSMjCVJldHVybmVyYXIgZGVuIHVwcGx1cG5hIHLDpG50YW4gZsO2ciBldHQgdsOkcmRlcGFwcGVyIHNvbSBnZXIgYXZrYXN0bmluZyBww6UgZsO2cmZhbGxvZGFnZW4NCkFNT1JERUdSQwkJPSBBTU9SREVHUkMJCQkjIwlSZXR1cm5lcmFyIGF2c2tyaXZuaW5nZW4gZsO2ciB2YXJqZSByZWRvdmlzbmluZ3NwZXJpb2QgbWVkIGhqw6RscCBhdiBlbiBhdnNrcml2bmluZ3Nrb2VmZmljaWVudA0KQU1PUkxJTkMJCT0gQU1PUkxJTkMJCQkjIwlSZXR1cm5lcmFyIGF2c2tyaXZuaW5nZW4gZsO2ciB2YXJqZSByZWRvdmlzbmluZ3NwZXJpb2QNCkNPVVBEQVlCUwkJPSBLVVBEQUdCQgkJCSMjCVJldHVybmVyYXIgYW50YWwgZGFnYXIgZnLDpW4gYsO2cmphbiBhdiBrdXBvbmdwZXJpb2RlbiB0aWxsIGxpa3ZpZGRhZ2VuDQpDT1VQREFZUwkJPSBLVVBEQUdBUlMJCQkjIwlSZXR1cm5lcmFyIGFudGFsZXQgZGFnYXIgaSBrdXBvbmdwZXJpb2RlbiBzb20gaW5uZWjDpWxsZXIgYmV0YWxuaW5nc2RhdHVtZXQNCkNPVVBEQVlTTkMJCT0gS1VQREFHTksJCQkjIwlSZXR1cm5lcmFyIGFudGFsZXQgZGFnYXIgZnLDpW4gYmV0YWxuaW5nc2RhdHVtZXQgdGlsbCBuw6RzdGEga3Vwb25nZGF0dW0NCkNPVVBOQ0QJCQk9IEtVUE5LRAkJCSMjCVJldHVybmVyYXIgbsOkc3RhIGt1cG9uZ2RhdHVtIGVmdGVyIGxpa3ZpZGRhZ2VuDQpDT1VQTlVNCQkJPSBLVVBBTlQJCQkjIwlSZXR1cm5lcmFyIGt1cG9uZ2VyIHNvbSBmw7ZyZmFsbGVyIHRpbGwgYmV0YWxuaW5nIG1lbGxhbiBsaWt2aWRkYWdlbiBvY2ggZsO2cmZhbGxvZGFnZW4NCkNPVVBQQ0QJCQk9IEtVUEZLRAkJCSMjCVJldHVybmVyYXIgZsO2cmVnw6VlbmRlIGt1cG9uZ2RhdHVtIGbDtnJlIGxpa3ZpZGRhZ2VuDQpDVU1JUE1UCQkJPSBLVU1Sw4ROVEEJCQkjIwlSZXR1cm5lcmFyIGRlbiBhY2t1bXVsZXJhZGUgcsOkbnRhbiBzb20gYmV0YWxhdHMgbWVsbGFuIHR2w6UgcGVyaW9kZXINCkNVTVBSSU5DCQk9IEtVTVBSSVMJCQkjIwlSZXR1cm5lcmFyIGRldCBhY2t1bXVsZXJhZGUga2FwaXRhbGJlbG9wcGV0IHNvbSBiZXRhbGF0cyBww6UgZXR0IGzDpW4gbWVsbGFuIHR2w6UgcGVyaW9kZXINCkRCCQkJPSBEQgkJCQkjIwlSZXR1cm5lcmFyIGF2c2tyaXZuaW5nZW4gZsO2ciBlbiB0aWxsZ8OlbmcgdW5kZXIgZW4gYW5naXZlbiB0aWQgZW5saWd0IG1ldG9kZW4gZsO2ciBmYXN0IGRlZ3Jlc3NpdiBhdnNrcml2bmluZw0KRERCCQkJPSBERUdBVlNLUgkJCSMjCVJldHVybmVyYXIgZW4gdGlsbGfDpW5ncyB2w6RyZGVtaW5za25pbmcgdW5kZXIgZW4gdmlzcyBwZXJpb2QgbWVkIGhqw6RscCBhdiBkdWJiZWwgZGVncmVzc2l2IGF2c2tyaXZuaW5nIGVsbGVyIG7DpWdvbiBhbm5hbiBtZXRvZCBzb20gZHUgYW5nZXINCkRJU0MJCQk9IERJU0sJCQkJIyMJUmV0dXJuZXJhciBkaXNrb250ZXJpbmdzcsOkbnRhbiBmw7ZyIGV0dCB2w6RyZGVwYXBwZXINCkRPTExBUkRFCQk9IERFQ1RBTAkJCSMjCU9tdmFuZGxhciBldHQgcHJpcyB1dHRyeWNrdCBzb20gZXR0IGJyw6VrIHRpbGwgZXR0IGRlY2ltYWx0YWwNCkRPTExBUkZSCQk9IEJSw4VLCQkJCSMjCU9tdmFuZGxhciBldHQgcHJpcyBpIGtyb25vciB1dHRyeWNrdCBzb20gZXR0IGRlY2ltYWx0YWwgdGlsbCBldHQgYnLDpWsNCkRVUkFUSU9OCQk9IEzDllBUSUQJCQkjIwlSZXR1cm5lcmFyIGRlbiDDpXJsaWdhIGzDtnB0aWRlbiBmw7ZyIGVuIHPDpGtlcmhldCBtZWQgcGVyaW9kaXNrYSByw6RudGViZXRhbG5pbmdhcg0KRUZGRUNUCQkJPSBFRkZSw4ROVEEJCQkjIwlSZXR1cm5lcmFyIGRlbiDDpXJsaWdhIGVmZmVrdGl2YSByw6RudGVzYXRzZW4NCkZWCQkJPSBTTFVUVsOEUkRFCQkJIyMJUmV0dXJuZXJhciBkZXQgZnJhbXRpZGEgdsOkcmRldCBww6UgZW4gaW52ZXN0ZXJpbmcNCkZWU0NIRURVTEUJCT0gRsOWUlLDhE5UTklORwkJCSMjCVJldHVybmVyYXIgZGV0IGZyYW10aWRhIHbDpHJkZXQgYXYgZXR0IGJlZ3lubmVsc2VrYXBpdGFsIGJlcsOka25hdCBww6Ugb2xpa2EgcsOkbnRlbml2w6Vlcg0KSU5UUkFURQkJCT0gw4VSU1LDhE5UQQkJCSMjCVJldHVybmVyYXIgcsOkbnRlc2F0c2VuIGbDtnIgZXR0IGJldGFsdCB2w6RyZGVwYXBwZXINCklQTVQJCQk9IFJCRVRBTE5JTkcJCQkjIwlSZXR1cm5lcmFyIHLDpG50ZWRlbGVuIGF2IGVuIGJldGFsbmluZyBmw7ZyIGVuIGdpdmVuIHBlcmlvZA0KSVJSCQkJPSBJUgkJCQkjIwlSZXR1cm5lcmFyIGludGVybnLDpG50YW4gZsO2ciBlbiBzZXJpZSBiZXRhbG5pbmdhcg0KSVNQTVQJCQk9IFJBTMOFTgkJCQkjIwlCZXLDpGtuYXIgcsOkbnRhbiBzb20gaGFyIGJldGFsYXRzIHVuZGVyIGVuIHNwZWNpZmlrIGJldGFsbmluZ3NwZXJpb2QNCk1EVVJBVElPTgkJPSBNTMOWUFRJRAkJCSMjCVJldHVybmVyYXIgZGVuIG1vZGlmaWVyYWRlIE1hY2F1bGV5LWzDtnB0aWRlbiBmw7ZyIGV0dCB2w6RyZGVwYXBwZXIgbWVkIGRldCBhbnRhZ25hIG5vbWluZWxsYSB2w6RyZGV0IDEwMCBrcg0KTUlSUgkJCT0gTU9ESVIJCQkJIyMJUmV0dXJuZXJhciBpbnRlcm5yw6RudGFuIGTDpHIgcG9zaXRpdmEgb2NoIG5lZ2F0aXZhIGJldGFsbmluZ2FyIGZpbmFuc2llcmFzIG1lZCBvbGlrYSByw6RudG9yDQpOT01JTkFMCQkJPSBOT01Sw4ROVEEJCQkjIwlSZXR1cm5lcmFyIGRlbiDDpXJsaWdhIG5vbWluZWxsYSByw6RudGVzYXRzZW4NCk5QRVIJCQk9IFBFUklPREVSCQkJIyMJUmV0dXJuZXJhciBhbnRhbGV0IHBlcmlvZGVyIGbDtnIgZW4gaW52ZXN0ZXJpbmcNCk5QVgkJCT0gTkVUTlVWw4RSREUJCQkjIwlSZXR1cm5lcmFyIG51dsOkcmRldCBhdiBlbiBzZXJpZSBwZXJpb2Rpc2thIGJldGFsbmluZ2FyIHZpZCBlbiBnaXZlbiBkaXNrb250ZXJpbmdzcsOkbnRhDQpPRERGUFJJQ0UJCT0gVUREQUZQUklTCQkJIyMJUmV0dXJuZXJhciBwcmlzZXQgcGVyIDEwMCBrciBub21pbmVsbHQgdsOkcmRlIGbDtnIgZXR0IHbDpHJkZXBhcHBlciBtZWQgZW4gdWRkYSBmw7Zyc3RhIHBlcmlvZA0KT0RERllJRUxECQk9IFVEREFGQVZLQVNUTklORwkJIyMJUmV0dXJuZXJhciBhdmthc3RuaW5nZW4gZsO2ciBlbiBzw6RrZXJoZXQgbWVkIGVuIHVkZGEgZsO2cnN0YSBwZXJpb2QNCk9ERExQUklDRQkJPSBVRERBU1BSSVMJCQkjIwlSZXR1cm5lcmFyIHByaXNldCBwZXIgMTAwIGtyIG5vbWluZWxsdCB2w6RyZGUgZsO2ciBldHQgdsOkcmRlcGFwcGVyIG1lZCBlbiB1ZGRhIHNpc3RhIHBlcmlvZA0KT0RETFlJRUxECQk9IFVEREFTQVZLQVNUTklORwkJIyMJUmV0dXJuZXJhciBhdmthc3RuaW5nZW4gZsO2ciBlbiBzw6RrZXJoZXQgbWVkIGVuIHVkZGEgc2lzdGEgcGVyaW9kDQpQTVQJCQk9IEJFVEFMTklORwkJCSMjCVJldHVybmVyYXIgZGVuIHBlcmlvZGlza2EgYmV0YWxuaW5nZW4gZsO2ciBlbiBhbm51aXRldA0KUFBNVAkJCT0gQU1PUlQJCQkJIyMJUmV0dXJuZXJhciBhbW9ydGVyaW5nc2RlbGVuIGF2IGVuIGFubnVpdGV0c2JldGFsbmluZyBmw7ZyIGVuIGdpdmVuIHBlcmlvZA0KUFJJQ0UJCQk9IFBSSVMJCQkJIyMJUmV0dXJuZXJhciBwcmlzZXQgcGVyIDEwMCBrciBub21pbmVsbHQgdsOkcmRlIGbDtnIgZXR0IHbDpHJkZXBhcHBlciBzb20gZ2VyIHBlcmlvZGlzayByw6RudGENClBSSUNFRElTQwkJPSBQUklTRElTSwkJCSMjCVJldHVybmVyYXIgcHJpc2V0IHBlciAxMDAga3Igbm9taW5lbGx0IHbDpHJkZSBmw7ZyIGV0dCBkaXNrb250ZXJhdCB2w6RyZGVwYXBwZXINClBSSUNFTUFUCQk9IFBSSVNGw5ZSRgkJCSMjCVJldHVybmVyYXIgcHJpc2V0IHBlciAxMDAga3Igbm9taW5lbGx0IHbDpHJkZSBmw7ZyIGV0dCB2w6RyZGVwYXBwZXIgc29tIGdlciByw6RudGEgcMOlIGbDtnJmYWxsb2RhZ2VuDQpQVgkJCT0gUFYJCQkJIyMJUmV0dXJuZXJhciBudXbDpHJkZXQgYXYgZW4gc2VyaWUgbGlrYSBzdG9yYSBwZXJpb2Rpc2thIGJldGFsbmluZ2FyDQpSQVRFCQkJPSBSw4ROVEEJCQkJIyMJUmV0dXJuZXJhciByw6RudGVzYXRzZW4gcGVyIHBlcmlvZCBpIGVuIGFubnVpdGV0DQpSRUNFSVZFRAkJPSBCRUxPUFAJCQkjIwlSZXR1cm5lcmFyIGJlbG9wcGV0IHNvbSB1dGRlbGFzIHDDpSBmw7ZyZmFsbG9kYWdlbiBmw7ZyIGV0dCBiZXRhbGF0IHbDpHJkZXBhcHBlcg0KU0xOCQkJPSBMSU5BVlNLUgkJCSMjCVJldHVybmVyYXIgZGVuIGxpbmrDpHJhIGF2c2tyaXZuaW5nZW4gZsO2ciBlbiB0aWxsZ8OlbmcgdW5kZXIgZW4gcGVyaW9kDQpTWUQJCQk9IMOFUlNBVlNLUgkJCSMjCVJldHVybmVyYXIgZGVuIMOlcmxpZ2EgYXZza3Jpdm5pbmdzc3VtbWFuIGbDtnIgZW4gdGlsbGfDpW5nIHVuZGVyIGVuIGFuZ2l2ZW4gcGVyaW9kDQpUQklMTEVRCQkJPSBTU1ZYRUtWCQkJIyMJUmV0dXJuZXJhciBhdmthc3RuaW5nZW4gbW90c3ZhcmFuZGUgZW4gb2JsaWdhdGlvbiBmw7ZyIGVuIHN0YXRzc2t1bGR2w6R4ZWwNClRCSUxMUFJJQ0UJCT0gU1NWWFBSSVMJCQkjIwlSZXR1cm5lcmFyIHByaXNldCBwZXIgMTAwIGtyIG5vbWluZWxsdCB2w6RyZGUgZsO2ciBlbiBzdGF0c3NrdWxkdsOkeGVsDQpUQklMTFlJRUxECQk9IFNTVlhSw4ROVEEJCQkjIwlSZXR1cm5lcmFyIGF2a2FzdG5pbmdlbiBmw7ZyIGVuIHN0YXRzc2t1bGR2w6R4ZWwNClZEQgkJCT0gVkRFR1JBVlNLUgkJCSMjCVJldHVybmVyYXIgYXZza3Jpdm5pbmdlbiBmw7ZyIGVuIHRpbGxnw6VuZyB1bmRlciBlbiBhbmdpdmVuIHBlcmlvZCAobWVkIGRlZ3Jlc3NpdiBhdnNrcml2bmluZykNClhJUlIJCQk9IFhJUlIJCQkJIyMJUmV0dXJuZXJhciBpbnRlcm5yw6RudGFuIGbDtnIgZW4gc2VyaWUgYmV0YWxuaW5nYXIgc29tIGludGUgbsO2ZHbDpG5kaWd0dmlzIMOkciBwZXJpb2Rpc2thDQpYTlBWCQkJPSBYTlVWw4RSREUJCQkjIwlSZXR1cm5lcmFyIGRldCBudXZhcmFuZGUgbmV0dG92w6RyZGV0IGbDtnIgZW4gc2VyaWUgYmV0YWxuaW5nYXIgc29tIGludGUgbsO2ZHbDpG5kaWd0dmlzIMOkciBwZXJpb2Rpc2thDQpZSUVMRAkJCT0gTk9NQVZLCQkJIyMJUmV0dXJuZXJhciBhdmthc3RuaW5nZW4gZsO2ciBldHQgdsOkcmRlcGFwcGVyIHNvbSBnZXIgcGVyaW9kaXNrIHLDpG50YQ0KWUlFTERESVNDCQk9IE5PTUFWS0RJU0sJCQkjIwlSZXR1cm5lcmFyIGRlbiDDpXJsaWdhIGF2a2FzdG5pbmdlbiBmw7ZyIGRpc2tvbnRlcmFkZSB2w6RyZGVwYXBwZXIsIGV4ZW1wZWx2aXMgZW4gc3RhdHNza3VsZHbDpHhlbA0KWUlFTERNQVQJCT0gTk9NQVZLRsOWUkYJCQkjIwlSZXR1cm5lcmFyIGRlbiDDpXJsaWdhIGF2a2FzdG5pbmdlbiBmw7ZyIGV0dCB2w6RyZGVwYXBwZXIgc29tIGdlciByw6RudGEgcMOlIGbDtnJmYWxsb2RhZ2VuDQoNCg0KIyMNCiMjCUluZm9ybWF0aW9uIGZ1bmN0aW9ucwkJCQlJbmZvcm1hdGlvbnNmdW5rdGlvbmVyDQojIw0KQ0VMTAkJCT0gQ0VMTAkJCQkjIwlSZXR1cm5lcmFyIGluZm9ybWF0aW9uIG9tIGZvcm1hdGVyaW5nLCBwbGF0cyBvY2ggaW5uZWjDpWxsIGkgZW4gY2VsbA0KRVJST1IuVFlQRQkJPSBGRUwuVFlQCQkJIyMJUmV0dXJuZXJhciBldHQgdGFsIHNvbSBtb3RzdmFyYXIgZXR0IGZlbHbDpHJkZQ0KSU5GTwkJCT0gSU5GTwkJCQkjIwlSZXR1cm5lcmFyIGluZm9ybWF0aW9uIG9tIG9wZXJhdGl2c3lzdGVtZXQNCklTQkxBTksJCQk9IMOEUlJFRgkJCQkjIwlSZXR1cm5lcmFyIFNBTlQgb20gdsOkcmRldCDDpHIgdG9tdA0KSVNFUlIJCQk9IMOECQkJCSMjCVJldHVybmVyYXIgU0FOVCBvbSB2w6RyZGV0IMOkciBldHQgZmVsdsOkcmRlIGFubmF0IMOkbiAjU0FLTkFTIQ0KSVNFUlJPUgkJCT0gw4RSRkVMCQkJCSMjCVJldHVybmVyYXIgU0FOVCBvbSB2w6RyZGV0IMOkciBldHQgZmVsdsOkcmRlDQpJU0VWRU4JCQk9IMOEUkrDhE1OCQkJIyMJUmV0dXJuZXJhciBTQU5UIG9tIHRhbGV0IMOkciBqw6RtbnQNCklTTE9HSUNBTAkJPSDDhFJFSlRFWFQJCQkjIwlSZXR1cm5lcmFyIFNBTlQgb20gdsOkcmRldCDDpHIgZXR0IGxvZ2lza3QgdsOkcmRlDQpJU05BCQkJPSDDhFJMT0dJU0sJCQkjIwlSZXR1cm5lcmFyIFNBTlQgb20gdsOkcmRldCDDpHIgZmVsdsOkcmRldCAjU0FLTkFTIQ0KSVNOT05URVhUCQk9IMOEUlNBS05BRAkJCSMjCVJldHVybmVyYXIgU0FOVCBvbSB2w6RyZGV0IGludGUgw6RyIHRleHQNCklTTlVNQkVSCQk9IMOEUlRBTAkJCQkjIwlSZXR1cm5lcmFyIFNBTlQgb20gdsOkcmRldCDDpHIgZXR0IHRhbA0KSVNPREQJCQk9IMOEUlVEREEJCQkjIwlSZXR1cm5lcmFyIFNBTlQgb20gdGFsZXQgw6RyIHVkZGENCklTUkVGCQkJPSDDhFJUT00JCQkJIyMJUmV0dXJuZXJhciBTQU5UIG9tIHbDpHJkZXQgw6RyIGVuIHJlZmVyZW5zDQpJU1RFWFQJCQk9IMOEUlRFWFQJCQkjIwlSZXR1cm5lcmFyIFNBTlQgb20gdsOkcmRldCDDpHIgdGV4dA0KTgkJCT0gTgkJCQkjIwlSZXR1cm5lcmFyIGV0dCB2w6RyZGUgb212YW5kbGF0IHRpbGwgZXR0IHRhbA0KTkEJCQk9IFNBS05BUwkJCSMjCVJldHVybmVyYXIgZmVsdsOkcmRldCAjU0FLTkFTIQ0KVFlQRQkJCT0gVsOEUkRFVFlQCQkJIyMJUmV0dXJuZXJhciBldHQgdGFsIHNvbSBhbmdlciB2w6RyZGV0cyBkYXRhdHlwDQoNCg0KIyMNCiMjCUxvZ2ljYWwgZnVuY3Rpb25zCQkJCUxvZ2lza2EgZnVua3Rpb25lcg0KIyMNCkFORAkJCT0gT0NICQkJCSMjCVJldHVybmVyYXIgU0FOVCBvbSBhbGxhIGFyZ3VtZW50IMOkciBzYW5uYQ0KRkFMU0UJCQk9IEZBTFNLVAkJCSMjCVJldHVybmVyYXIgZGV0IGxvZ2lza2EgdsOkcmRldCBGQUxTS1QNCklGCQkJPSBPTQkJCQkjIwlBbmdlciB2aWxrZXQgbG9naXNrdCB0ZXN0IHNvbSBza2EgdXRmw7ZyYXMNCklGRVJST1IJCQk9IE9NRkVMCQkJCSMjCVJldHVybmVyYXIgZXR0IHbDpHJkZSBzb20gZHUgYW5nZXIgb20gZW4gZm9ybWVsIHV0dsOkcmRlcmFyIHRpbGwgZXR0IGZlbDsgYW5uYXJzIHJldHVybmVyYXMgcmVzdWx0YXRldCBhdiBmb3JtZWxuDQpOT1QJCQk9IElDS0UJCQkJIyMJSW52ZXJ0ZXJhciBsb2dpa2VuIGbDtnIgYXJndW1lbnRlbg0KT1IJCQk9IEVMTEVSCQkJCSMjCVJldHVybmVyYXIgU0FOVCBvbSBuw6Vnb3QgYXJndW1lbnQgw6RyIFNBTlQNClRSVUUJCQk9IFNBTlQJCQkJIyMJUmV0dXJuZXJhciBkZXQgbG9naXNrYSB2w6RyZGV0IFNBTlQNCg0KDQojIw0KIyMJTG9va3VwIGFuZCByZWZlcmVuY2UgZnVuY3Rpb25zCQkJU8O2ay0gb2NoIHJlZmVyZW5zZnVua3Rpb25lcg0KIyMNCkFERFJFU1MJCQk9IEFEUkVTUwkJCSMjCVJldHVybmVyYXIgZW4gcmVmZXJlbnMgc29tIHRleHQgdGlsbCBlbiBlbnN0YWthIGNlbGwgaSBldHQga2Fsa3lsYmxhZA0KQVJFQVMJCQk9IE9NUsOFREVOCQkJIyMJUmV0dXJuZXJhciBhbnRhbGV0IG9tcsOlZGVuIGkgZW4gcmVmZXJlbnMNCkNIT09TRQkJCT0gVsOETEoJCQkJIyMJVsOkbGplciBldHQgdsOkcmRlIGkgZW4gbGlzdGEgw7Z2ZXIgdsOkcmRlbg0KQ09MVU1OCQkJPSBLT0xVTU4JCQkjIwlSZXR1cm5lcmFyIGtvbHVtbm51bXJldCBmw7ZyIGVuIHJlZmVyZW5zDQpDT0xVTU5TCQkJPSBLT0xVTU5FUgkJCSMjCVJldHVybmVyYXIgYW50YWxldCBrb2x1bW5lciBpIGVuIHJlZmVyZW5zDQpITE9PS1VQCQkJPSBMRVRBS09MVU1OCQkJIyMJU8O2a2VyIGkgZGVuIMO2dmVyc3RhIHJhZGVuIGkgZW4gbWF0cmlzIG9jaCByZXR1cm5lcmFyIHbDpHJkZXQgZsO2ciBhbmdpdmVuIGNlbGwNCkhZUEVSTElOSwkJPSBIWVBFUkzDhE5LCQkJIyMJU2thcGFyIGVuIGdlbnbDpGcgZWxsZXIgZXR0IGhvcHAgdGlsbCBldHQgZG9rdW1lbnQgaSBuw6R0dmVya2V0LCBpIGV0dCBpbnRyYW7DpHQgZWxsZXIgcMOlIEludGVybmV0DQpJTkRFWAkJCT0gSU5ERVgJCQkJIyMJQW52w6RuZGVyIGV0dCBpbmRleCBmw7ZyIGV0dCB2w6RsamEgZXR0IHbDpHJkZSBpIGVuIHJlZmVyZW5zIGVsbGVyIG1hdHJpcw0KSU5ESVJFQ1QJCT0gSU5ESVJFS1QJCQkjIwlSZXR1cm5lcmFyIGVuIHJlZmVyZW5zIHNvbSBhbmdlcyBhdiBldHQgdGV4dHbDpHJkZQ0KTE9PS1VQCQkJPSBMRVRBVVBQCQkJIyMJTGV0YXIgdXBwIHbDpHJkZW4gaSBlbiB2ZWt0b3IgZWxsZXIgbWF0cmlzDQpNQVRDSAkJCT0gUEFTU0EJCQkJIyMJTGV0YXIgdXBwIHbDpHJkZW4gaSBlbiByZWZlcmVucyBlbGxlciBtYXRyaXMNCk9GRlNFVAkJCT0gRsOWUlNLSlVUTklORwkJCSMjCVJldHVybmVyYXIgZW4gcmVmZXJlbnMgZsO2cnNranV0ZW4gaSBmw7ZyaMOlbGxhbmRlIHRpbGwgZW4gZ2l2ZW4gcmVmZXJlbnMNClJPVwkJCT0gUkFECQkJCSMjCVJldHVybmVyYXIgcmFkbnVtcmV0IGbDtnIgZW4gcmVmZXJlbnMNClJPV1MJCQk9IFJBREVSCQkJCSMjCVJldHVybmVyYXIgYW50YWxldCByYWRlciBpIGVuIHJlZmVyZW5zDQpSVEQJCQk9IFJURAkJCQkjIwlIw6RtdGFyIHJlYWx0aWRzZGF0YSBmcsOlbiBldHQgcHJvZ3JhbSBzb20gc3TDtmRlciBDT00tYXV0b21hdGlvbiAoQXV0b21hdGlvbjogRXR0IHPDpHR0IGF0dCBhcmJldGEgbWVkIGV0dCBwcm9ncmFtcyBvYmpla3QgZnLDpW4gZXR0IGFubmF0IHByb2dyYW0gZWxsZXIgdXR2ZWNrbGluZ3N2ZXJrdHlnLiBEZXR0YSBrYWxsYWRlcyB0aWRpZ2FyZSBmw7ZyIE9MRSBBdXRvbWF0aW9uLCBvY2ggw6RyIGVuIGJyYW5zY2hzdGFuZGFyZCBvY2ggaW5nw6VyIGkgQ29tcG9uZW50IE9iamVjdCBNb2RlbCAoQ09NKS4pDQpUUkFOU1BPU0UJCT0gVFJBTlNQT05FUkEJCQkjIwlUcmFuc3BvbmVyYXIgZW4gbWF0cmlzDQpWTE9PS1VQCQkJPSBMRVRBUkFECQkJIyMJTGV0YXIgaSBkZW4gZsO2cnN0YSBrb2x1bW5lbiBpIGVuIG1hdHJpcyBvY2ggZmx5dHRhciDDtnZlciByYWRlbiBmw7ZyIGF0dCByZXR1cm5lcmEgdsOkcmRldCBmw7ZyIGVuIGNlbGwNCg0KDQojIw0KIyMJTWF0aCBhbmQgdHJpZ29ub21ldHJ5IGZ1bmN0aW9ucwkJCU1hdGVtYXRpc2thIG9jaCB0cmlnb25vbWV0cmlza2EgZnVua3Rpb25lcg0KIyMNCkFCUwkJCT0gQUJTCQkJCSMjCVJldHVybmVyYXIgYWJzb2x1dHbDpHJkZXQgYXYgZXR0IHRhbA0KQUNPUwkJCT0gQVJDQ09TCQkJIyMJUmV0dXJuZXJhciBhcmN1cyBjb3NpbnVzIGbDtnIgZXR0IHRhbA0KQUNPU0gJCQk9IEFSQ0NPU0gJCQkjIwlSZXR1cm5lcmFyIGludmVydGVyYWQgaHlwZXJib2xpc2sgY29zaW51cyBmw7ZyIGV0dCB0YWwNCkFTSU4JCQk9IEFSQ1NJTgkJCSMjCVJldHVybmVyYXIgYXJjdXMgY29zaW51cyBmw7ZyIGV0dCB0YWwNCkFTSU5ICQkJPSBBUkNTSU5ICQkJIyMJUmV0dXJuZXJhciBoeXBlcmJvbGlzayBhcmN1cyBzaW51cyBmw7ZyIGV0dCB0YWwNCkFUQU4JCQk9IEFSQ1RBTgkJCSMjCVJldHVybmVyYXIgYXJjdXMgdGFuZ2VucyBmw7ZyIGV0dCB0YWwNCkFUQU4yCQkJPSBBUkNUQU4yCQkJIyMJUmV0dXJuZXJhciBhcmN1cyB0YW5nZW5zIGbDtnIgZW4geC0gb2NoIGVuIHktIGtvb3JkaW5hdA0KQVRBTkgJCQk9IEFSQ1RBTkgJCQkjIwlSZXR1cm5lcmFyIGh5cGVyYm9saXNrIGFyY3VzIHRhbmdlbnMgZsO2ciBldHQgdGFsDQpDRUlMSU5HCQkJPSBSVU5EQS5VUFAJCQkjIwlBdnJ1bmRhciBldHQgdGFsIHRpbGwgbsOkcm1hc3RlIGhlbHRhbCBlbGxlciBuw6RybWFzdGUgc2lnbmlmaWthbnRhIG11bHRpcGVsDQpDT01CSU4JCQk9IEtPTUJJTgkJCSMjCVJldHVybmVyYXIgYW50YWxldCBrb21iaW5hdGlvbmVyIGbDtnIgZXR0IGdpdmV0IGFudGFsIG9iamVrdA0KQ09TCQkJPSBDT1MJCQkJIyMJUmV0dXJuZXJhciBjb3NpbnVzIGbDtnIgZXR0IHRhbA0KQ09TSAkJCT0gQ09TSAkJCQkjIwlSZXR1cm5lcmFyIGh5cGVyYm9saXNrdCBjb3NpbnVzIGbDtnIgZXR0IHRhbA0KREVHUkVFUwkJCT0gR1JBREVSCQkJIyMJT212YW5kbGFyIHJhZGlhbmVyIHRpbGwgZ3JhZGVyDQpFVkVOCQkJPSBKw4RNTgkJCQkjIwlBdnJ1bmRhciBldHQgdGFsIHVwcMOldCB0aWxsIG7DpHJtYXN0ZSBoZWx0YWwNCkVYUAkJCT0gRVhQCQkJCSMjCVJldHVybmVyYXIgZSB1cHBow7ZqdCB0aWxsIGV0dCBnaXZldCB0YWwNCkZBQ1QJCQk9IEZBS1VMVEVUCQkJIyMJUmV0dXJuZXJhciBmYWt1bHRldGVuIGbDtnIgZXR0IHRhbA0KRkFDVERPVUJMRQkJPSBEVUJCRUxGQUtVTFRFVAkJIyMJUmV0dXJuZXJhciBkdWJiZWxmYWt1bHRldGVuIGbDtnIgZXR0IHRhbA0KRkxPT1IJCQk9IFJVTkRBLk5FRAkJCSMjCUF2cnVuZGFyIGV0dCB0YWwgbmVkw6V0IG1vdCBub2xsDQpHQ0QJCQk9IFNHRAkJCQkjIwlSZXR1cm5lcmFyIGRlbiBzdMO2cnN0YSBnZW1lbnNhbW1hIG7DpG1uYXJlbg0KSU5UCQkJPSBIRUxUQUwJCQkjIwlBdnJ1bmRhciBldHQgdGFsIG5lZMOldCB0aWxsIG7DpHJtYXN0ZSBoZWx0YWwNCkxDTQkJCT0gTUdNCQkJCSMjCVJldHVybmVyYXIgZGVuIG1pbnN0YSBnZW1lbnNhbW1hIG11bHRpcGVsbg0KTE4JCQk9IExOCQkJCSMjCVJldHVybmVyYXIgZGVuIG5hdHVybGlnYSBsb2dhcml0bWVuIGbDtnIgZXR0IHRhbA0KTE9HCQkJPSBMT0cJCQkJIyMJUmV0dXJuZXJhciBsb2dhcml0bWVuIGbDtnIgZXR0IHRhbCBmw7ZyIGVuIGdpdmVuIGJhcw0KTE9HMTAJCQk9IExPRzEwCQkJCSMjCVJldHVybmVyYXIgMTAtbG9nYXJpdG1lbiBmw7ZyIGV0dCB0YWwNCk1ERVRFUk0JCQk9IE1ERVRFUk0JCQkjIwlSZXR1cm5lcmFyIG1hdHJpc2VuIHNvbSDDpHIgYXZnw7ZyYW5kZXQgYXYgZW4gbWF0cmlzDQpNSU5WRVJTRQkJPSBNSU5WRVJUCQkJIyMJUmV0dXJuZXJhciBtYXRyaXNpbnZlcnNlbiBhdiBlbiBtYXRyaXMNCk1NVUxUCQkJPSBNTVVMVAkJCQkjIwlSZXR1cm5lcmFyIG1hdHJpc3Byb2R1a3RlbiBhdiB0dsOlIG1hdHJpc2VyDQpNT0QJCQk9IFJFU1QJCQkJIyMJUmV0dXJuZXJhciByZXN0ZW4gdmlkIGVuIGRpdmlzaW9uDQpNUk9VTkQJCQk9IE1BVlJVTkRBCQkJIyMJUmV0dXJuZXJhciBldHQgdGFsIGF2cnVuZGF0IHRpbGwgZW4gZ2l2ZW4gbXVsdGlwZWwNCk1VTFRJTk9NSUFMCQk9IE1VTFRJTk9NSUFMCQkJIyMJUmV0dXJuZXJhciBtdWx0aW5vbWlhbGVuIGbDtnIgZW4gdXBwc8OkdHRuaW5nIHRhbA0KT0RECQkJPSBVRERBCQkJCSMjCUF2cnVuZGFyIGV0dCB0YWwgdXBww6V0IHRpbGwgbsOkcm1hc3RlIHVkZGEgaGVsdGFsDQpQSQkJCT0gUEkJCQkJIyMJUmV0dXJuZXJhciB2w6RyZGV0IHBpDQpQT1dFUgkJCT0gVVBQSMOWSlQuVElMTAkJCSMjCVJldHVybmVyYXIgcmVzdWx0YXRldCBhdiBldHQgdGFsIHVwcGjDtmp0IHRpbGwgZW4gZXhwb25lbnQNClBST0RVQ1QJCQk9IFBST0RVS1QJCQkjIwlNdWx0aXBsaWNlcmFyIGFyZ3VtZW50ZW4NClFVT1RJRU5UCQk9IEtWT1QJCQkJIyMJUmV0dXJuZXJhciBoZWx0YWxzZGVsZW4gYXYgZW4gZGl2aXNpb24NClJBRElBTlMJCQk9IFJBRElBTkVSCQkJIyMJT212YW5kbGFyIGdyYWRlciB0aWxsIHJhZGlhbmVyDQpSQU5ECQkJPSBTTFVNUAkJCQkjIwlSZXR1cm5lcmFyIGV0dCBzbHVtcHRhbCBtZWxsYW4gMCBvY2ggMQ0KUkFOREJFVFdFRU4JCT0gU0xVTVAuTUVMTEFOCQkJIyMJUmV0dXJuZXJhciBldHQgc2x1bXB0YWwgbWVsbGFuIGRlIHRhbCBzb20gZHUgYW5nZXINClJPTUFOCQkJPSBST01FUlNLCQkJIyMJT212YW5kbGFyIHZhbmxpZ2EgKGFyYWJpc2thKSBzaWZmcm9yIHRpbGwgcm9tZXJza2Egc29tIHRleHQNClJPVU5ECQkJPSBBVlJVTkRBCQkJIyMJQXZydW5kYXIgZXR0IHRhbCB0aWxsIGV0dCBhbmdpdmV0IGFudGFsIHNpZmZyb3INClJPVU5ERE9XTgkJPSBBVlJVTkRBLk5FRMOFVAkJCSMjCUF2cnVuZGFyIGV0dCB0YWwgbmVkw6V0IG1vdCBub2xsDQpST1VORFVQCQkJPSBBVlJVTkRBLlVQUMOFVAkJCSMjCUF2cnVuZGFyIGV0dCB0YWwgdXBww6V0LCBmcsOlbiBub2xsDQpTRVJJRVNTVU0JCT0gU0VSSUVTVU1NQQkJCSMjCVJldHVybmVyYXIgc3VtbWFuIGF2IGVuIHBvdGVuc3NlcmllIGJhc2VyYXQgcMOlIGZvcm1lbG4NClNJR04JCQk9IFRFQ0tFTgkJCSMjCVJldHVybmVyYXIgdGVja25ldCBmw7ZyIGV0dCB0YWwNClNJTgkJCT0gU0lOCQkJCSMjCVJldHVybmVyYXIgc2ludXMgZsO2ciBlbiBnaXZlbiB2aW5rZWwNClNJTkgJCQk9IFNJTkgJCQkJIyMJUmV0dXJuZXJhciBoeXBlcmJvbGlzayBzaW51cyBmw7ZyIGV0dCB0YWwNClNRUlQJCQk9IFJPVAkJCQkjIwlSZXR1cm5lcmFyIGRlbiBwb3NpdGl2YSBrdmFkcmF0cm90ZW4NClNRUlRQSQkJCT0gUk9UUEkJCQkJIyMJUmV0dXJuZXJhciBrdmFkcmF0cm90ZW4gZsO2ciAodGFsICogcGkpDQpTVUJUT1RBTAkJPSBERUxTVU1NQQkJCSMjCVJldHVybmVyYXIgZW4gZGVsc3VtbWEgaSBlbiBsaXN0YSBlbGxlciBkYXRhYmFzDQpTVU0JCQk9IFNVTU1BCQkJCSMjCVN1bW1lcmFyIGFyZ3VtZW50ZW4NClNVTUlGCQkJPSBTVU1NQS5PTQkJCSMjCVN1bW1lcmFyIGNlbGxlciBlbmxpZ3QgZXR0IGFuZ2l2ZXQgdmlsbGtvcg0KU1VNSUZTCQkJPSBTVU1NQS5PTUYJCQkjIwlMw6RnZ2VyIHRpbGwgY2VsbGVybmEgaSBldHQgb21yw6VkZSBzb20gdXBwZnlsbGVyIGZsZXJhIGtyaXRlcmllcg0KU1VNUFJPRFVDVAkJPSBQUk9EVUtUU1VNTUEJCQkjIwlSZXR1cm5lcmFyIHN1bW1hbiBhdiBwcm9kdWt0ZXJuYSBpIG1vdHN2YXJhbmRlIG1hdHJpc2tvbXBvbmVudGVyDQpTVU1TUQkJCT0gS1ZBRFJBVFNVTU1BCQkJIyMJUmV0dXJuZXJhciBzdW1tYW4gYXYgYXJndW1lbnRlbnMga3ZhZHJhdGVyDQpTVU1YMk1ZMgkJPSBTVU1NQVgyTVkyCQkJIyMJUmV0dXJuZXJhciBzdW1tYW4gYXYgZGlmZmVyZW5zZW4gbWVsbGFuIGt2YWRyYXRlcm5hIGbDtnIgbW90c3ZhcmFuZGUgdsOkcmRlbiBpIHR2w6UgbWF0cmlzZXINClNVTVgyUFkyCQk9IFNVTU1BWDJQWTIJCQkjIwlSZXR1cm5lcmFyIHN1bW1hbiBhdiBzdW1tYW4gYXYga3ZhZHJhdGVybmEgYXYgbW90c3ZhcmFuZGUgdsOkcmRlbiBpIHR2w6UgbWF0cmlzZXINClNVTVhNWTIJCQk9IFNVTU1BWE1ZMgkJCSMjCVJldHVybmVyYXIgc3VtbWFuIGF2IGt2YWRyYXRlbiBhdiBza2lsbG5hZGVuIG1lbGxhbiBtb3RzdmFyYW5kZSB2w6RyZGVuIGkgdHbDpSBtYXRyaXNlcg0KVEFOCQkJPSBUQU4JCQkJIyMJUmV0dXJuZXJhciB0YW5nZW5zIGbDtnIgZXR0IHRhbA0KVEFOSAkJCT0gVEFOSAkJCQkjIwlSZXR1cm5lcmFyIGh5cGVyYm9saXNrIHRhbmdlbnMgZsO2ciBldHQgdGFsDQpUUlVOQwkJCT0gQVZLT1JUQQkJCSMjCUF2a29ydGFyIGV0dCB0YWwgdGlsbCBldHQgaGVsdGFsDQoNCg0KIyMNCiMjCVN0YXRpc3RpY2FsIGZ1bmN0aW9ucwkJCQlTdGF0aXN0aXNrYSBmdW5rdGlvbmVyDQojIw0KQVZFREVWCQkJPSBNRURFTEFWVgkJCSMjCVJldHVybmVyYXIgbWVkZWx2w6RyZGV0IGbDtnIgZGF0YXB1bmt0ZXJzIGFic29sdXRhIGF2dmlrZWxzZSBmcsOlbiBkZXJhcyBtZWRlbHbDpHJkZQ0KQVZFUkFHRQkJCT0gTUVERUwJCQkJIyMJUmV0dXJuZXJhciBtZWRlbHbDpHJkZXQgYXYgYXJndW1lbnRlbg0KQVZFUkFHRUEJCT0gQVZFUkFHRUEJCQkjIwlSZXR1cm5lcmFyIG1lZGVsdsOkcmRldCBhdiBhcmd1bWVudGVuLCBpbmtsdXNpdmUgdGFsLCB0ZXh0IG9jaCBsb2dpc2thIHbDpHJkZW4NCkFWRVJBR0VJRgkJPSBNRURFTE9NCQkJIyMJUmV0dXJuZXJhciBtZWRlbHbDpHJkZXQgKGFyaXRtZXRpc2t0IG1lZGVsdsOkcmRlKSBmw7ZyIGFsbGEgY2VsbGVyIGkgZXR0IG9tcsOlZGUgc29tIHVwcGZ5bGxlciBldHQgZ2l2ZXQga3JpdGVyaXVtDQpBVkVSQUdFSUZTCQk9IE1FREVMT01GCQkJIyMJUmV0dXJuZXJhciBtZWRlbHbDpHJkZXQgKGRldCBhcml0bWV0aXNrYSBtZWRlbHbDpHJkZXQpIGbDtnIgYWxsYSBjZWxsZXIgc29tIHVwcGZ5bGxlciBmbGVyYSB2aWxsa29yLg0KQkVUQURJU1QJCT0gQkVUQUbDllJECQkJIyMJUmV0dXJuZXJhciBkZW4ga3VtdWxhdGl2YSBiZXRhZsO2cmRlbG5pbmdzZnVua3Rpb25lbg0KQkVUQUlOVgkJCT0gQkVUQUlOVgkJCSMjCVJldHVybmVyYXIgaW52ZXJzZW4gdGlsbCBkZW4ga3VtdWxhdGl2YSBmw7ZyZGVsbmluZ3NmdW5rdGlvbmVuIGbDtnIgZW4gdmlzcyBiZXRhZsO2cmRlbG5pbmcNCkJJTk9NRElTVAkJPSBCSU5PTUbDllJECQkJIyMJUmV0dXJuZXJhciBkZW4gaW5kaXZpZHVlbGxhIGJpbm9taWFsZsO2cmRlbG5pbmdlbg0KQ0hJRElTVAkJCT0gQ0hJMkbDllJECQkJIyMJUmV0dXJuZXJhciBkZW4gZW5zaWRpZ2Egc2Fubm9saWtoZXRlbiBhdiBjMi1mw7ZyZGVsbmluZ2VuDQpDSElJTlYJCQk9IENISTJJTlYJCQkjIwlSZXR1cm5lcmFyIGludmVyc2VuIGF2IGNoaTItZsO2cmRlbG5pbmdlbg0KQ0hJVEVTVAkJCT0gQ0hJMlRFU1QJCQkjIwlSZXR1cm5lcmFyIG9iZXJvZW5kZXRlc3Rlbg0KQ09ORklERU5DRQkJPSBLT05GSURFTlMJCQkjIwlSZXR1cm5lcmFyIGtvbmZpZGVuc2ludGVydmFsbGV0IGbDtnIgZW4gcG9wdWxhdGlvbnMgbWVkZWx2w6RyZGUNCkNPUlJFTAkJCT0gS09SUkVMCQkJIyMJUmV0dXJuZXJhciBrb3JyZWxhdGlvbnNrb2VmZmljaWVudGVuIG1lbGxhbiB0dsOlIGRhdGFtw6RuZ2Rlcg0KQ09VTlQJCQk9IEFOVEFMCQkJCSMjCVLDpGtuYXIgaHVyIG3DpW5nYSB0YWwgc29tIGZpbm5zIGJsYW5kIGFyZ3VtZW50ZW4NCkNPVU5UQQkJCT0gQU5UQUxWCQkJIyMJUsOka25hciBodXIgbcOlbmdhIHbDpHJkZW4gc29tIGZpbm5zIGJsYW5kIGFyZ3VtZW50ZW4NCkNPVU5UQkxBTksJCT0gQU5UQUwuVE9NTUEJCQkjIwlSw6RrbmFyIGFudGFsZXQgdG9tbWEgY2VsbGVyIGkgZXR0IG9tcsOlZGUNCkNPVU5USUYJCQk9IEFOVEFMLk9NCQkJIyMJUsOka25hciBhbnRhbGV0IGNlbGxlciBpIGV0dCBvbXLDpWRlIHNvbSB1cHBmeWxsZXIgYW5naXZuYSB2aWxsa29yLg0KQ09VTlRJRlMJCT0gQU5UQUwuT01GCQkJIyMJUsOka25hciBhbnRhbGV0IGNlbGxlciBpIGV0dCBvbXLDpWRlIHNvbSB1cHBmeWxsZXIgZmxlcmEgdmlsbGtvci4NCkNPVkFSCQkJPSBLT1ZBUgkJCQkjIwlSZXR1cm5lcmFyIGtvdmFyaWFuc2VuLCBkLnYucy4gbWVkZWx2w6RyZGV0IGF2IHByb2R1a3Rlcm5hIGbDtnIgcGFyYWRlIGF2dmlrZWxzZXINCkNSSVRCSU5PTQkJPSBLUklUQklOT00JCQkjIwlSZXR1cm5lcmFyIGRldCBtaW5zdGEgdsOkcmRldCBmw7ZyIHZpbGtldCBkZW4ga3VtdWxhdGl2YSBiaW5vbWlhbGbDtnJkZWxuaW5nZW4gw6RyIG1pbmRyZSDDpG4gZWxsZXIgbGlrYSBtZWQgZXR0IHZpbGxrb3JzdsOkcmRlDQpERVZTUQkJCT0gS1ZBREFWVgkJCSMjCVJldHVybmVyYXIgc3VtbWFuIGF2IGt2YWRyYXRlciBww6UgYXZ2aWtlbHNlcg0KRVhQT05ESVNUCQk9IEVYUE9ORsOWUkQJCQkjIwlSZXR1cm5lcmFyIGV4cG9uZW50aWFsZsO2cmRlbG5pbmdlbg0KRkRJU1QJCQk9IEZGw5ZSRAkJCQkjIwlSZXR1cm5lcmFyIEYtc2Fubm9saWtoZXRzZsO2cmRlbG5pbmdlbg0KRklOVgkJCT0gRklOVgkJCQkjIwlSZXR1cm5lcmFyIGludmVyc2VuIHRpbGwgRi1zYW5ub2xpa2hldHNmw7ZyZGVsbmluZ2VuDQpGSVNIRVIJCQk9IEZJU0hFUgkJCSMjCVJldHVybmVyYXIgRmlzaGVyLXRyYW5zZm9ybWF0aW9uZW4NCkZJU0hFUklOVgkJPSBGSVNIRVJJTlYJCQkjIwlSZXR1cm5lcmFyIGludmVyc2VuIHRpbGwgRmlzaGVyLXRyYW5zZm9ybWF0aW9uZW4NCkZPUkVDQVNUCQk9IFBSRURJS1RJT04JCQkjIwlSZXR1cm5lcmFyIGV0dCB2w6RyZGUgbMOkbmdzIGVuIGxpbmrDpHIgdHJlbmRsaW5qZQ0KRlJFUVVFTkNZCQk9IEZSRUtWRU5TCQkJIyMJUmV0dXJuZXJhciBlbiBmcmVrdmVuc2bDtnJkZWxuaW5nIHNvbSBlbiBsb2Ryw6R0IG1hdHJpcw0KRlRFU1QJCQk9IEZURVNUCQkJCSMjCVJldHVybmVyYXIgcmVzdWx0YXRldCBhdiBlbiBGLXRlc3QNCkdBTU1BRElTVAkJPSBHQU1NQUbDllJECQkJIyMJUmV0dXJuZXJhciBnYW1tYWbDtnJkZWxuaW5nZW4NCkdBTU1BSU5WCQk9IEdBTU1BSU5WCQkJIyMJUmV0dXJuZXJhciBpbnZlcnNlbiB0aWxsIGRlbiBrdW11bGF0aXZhIGdhbW1hZsO2cmRlbG5pbmdlbg0KR0FNTUFMTgkJCT0gR0FNTUFMTgkJCSMjCVJldHVybmVyYXIgZGVuIG5hdHVybGlnYSBsb2dhcml0bWVuIGbDtnIgZ2FtbWFmdW5rdGlvbmVuLCBHKHgpDQpHRU9NRUFOCQkJPSBHRU9NRURFTAkJCSMjCVJldHVybmVyYXIgZGV0IGdlb21ldHJpc2thIG1lZGVsdsOkcmRldA0KR1JPV1RICQkJPSBFWFBUUkVORAkJCSMjCVJldHVybmVyYXIgdsOkcmRlbiBsw6RuZ3MgZW4gZXhwb25lbnRpZWxsIHRyZW5kDQpIQVJNRUFOCQkJPSBIQVJNTUVERUwJCQkjIwlSZXR1cm5lcmFyIGRldCBoYXJtb25pc2thIG1lZGVsdsOkcmRldA0KSFlQR0VPTURJU1QJCT0gSFlQR0VPTUbDllJECQkJIyMJUmV0dXJuZXJhciBkZW4gaHlwZXJnZW9tZXRyaXNrYSBmw7ZyZGVsbmluZ2VuDQpJTlRFUkNFUFQJCT0gU0vDhFJOSU5HU1BVTktUCQkjIwlSZXR1cm5lcmFyIHNrw6RybmluZ3NwdW5rdGVuIGbDtnIgZW4gbGluasOkciByZWdyZXNzaW9uc2xpbmplDQpLVVJUCQkJPSBUT1BQSUdIRVQJCQkjIwlSZXR1cm5lcmFyIHRvcHBpZ2hldGVuIGF2IGVuIG3DpG5nZCBkYXRhDQpMQVJHRQkJCT0gU1TDllJTVEEJCQkjIwlSZXR1cm5lcmFyIGRldCBuOnRlIHN0w7Zyc3RhIHbDpHJkZXQgaSBlbiBtw6RuZ2QgZGF0YQ0KTElORVNUCQkJPSBSRUdSCQkJCSMjCVJldHVybmVyYXIgcGFyYW1ldHJhciB0aWxsIGVuIGxpbmrDpHIgdHJlbmRsaW5qZQ0KTE9HRVNUCQkJPSBFWFBSRUdSCQkJIyMJUmV0dXJuZXJhciBwYXJhbWV0cmFybmEgaSBlbiBleHBvbmVudGllbGwgdHJlbmQNCkxPR0lOVgkJCT0gTE9HSU5WCQkJIyMJUmV0dXJuZXJhciBpbnZlcnNlbiB0aWxsIGRlbiBsb2dub3JtYWxhIGbDtnJkZWxuaW5nZW4NCkxPR05PUk1ESVNUCQk9IExPR05PUk1Gw5ZSRAkJCSMjCVJldHVybmVyYXIgZGVuIGt1bXVsYXRpdmEgbG9nbm9ybWFsYSBmw7ZyZGVsbmluZ2VuDQpNQVgJCQk9IE1BWAkJCQkjIwlSZXR1cm5lcmFyIGRldCBzdMO2cnN0YSB2w6RyZGV0IGkgZW4gbGlzdGEgYXYgYXJndW1lbnQNCk1BWEEJCQk9IE1BWEEJCQkJIyMJUmV0dXJuZXJhciBkZXQgc3TDtnJzdGEgdsOkcmRldCBpIGVuIGxpc3RhIGF2IGFyZ3VtZW50LCBpbmtsdXNpdmUgdGFsLCB0ZXh0IG9jaCBsb2dpc2thIHbDpHJkZW4NCk1FRElBTgkJCT0gTUVESUFOCQkJIyMJUmV0dXJuZXJhciBtZWRpYW5lbiBmw7ZyIGFuZ2l2bmEgdGFsDQpNSU4JCQk9IE1JTgkJCQkjIwlSZXR1cm5lcmFyIGRldCBtaW5zdGEgdsOkcmRldCBpIGVuIGxpc3RhIG1lZCBhcmd1bWVudA0KTUlOQQkJCT0gTUlOQQkJCQkjIwlSZXR1cm5lcmFyIGRldCBtaW5zdGEgdsOkcmRldCBpIGVuIGxpc3RhIMO2dmVyIGFyZ3VtZW50LCBpbmtsdXNpdmUgdGFsLCB0ZXh0IG9jaCBsb2dpc2thIHbDpHJkZW4NCk1PREUJCQk9IFRZUFbDhFJERQkJCSMjCVJldHVybmVyYXIgZGV0IHZhbmxpZ2FzdGUgdsOkcmRldCBpIGVuIGRhdGFtw6RuZ2QNCk5FR0JJTk9NRElTVAkJPSBORUdCSU5PTUbDllJECQkJIyMJUmV0dXJuZXJhciBkZW4gbmVnYXRpdmEgYmlub21pYWxmw7ZyZGVsbmluZ2VuDQpOT1JNRElTVAkJPSBOT1JNRsOWUkQJCQkjIwlSZXR1cm5lcmFyIGRlbiBrdW11bGF0aXZhIG5vcm1hbGbDtnJkZWxuaW5nZW4NCk5PUk1JTlYJCQk9IE5PUk1JTlYJCQkjIwlSZXR1cm5lcmFyIGludmVyc2VuIHRpbGwgZGVuIGt1bXVsYXRpdmEgbm9ybWFsZsO2cmRlbG5pbmdlbg0KTk9STVNESVNUCQk9IE5PUk1TRsOWUkQJCQkjIwlSZXR1cm5lcmFyIGRlbiBrdW11bGF0aXZhIHN0YW5kYXJkbm9ybWFsZsO2cmRlbG5pbmdlbg0KTk9STVNJTlYJCT0gTk9STVNJTlYJCQkjIwlSZXR1cm5lcmFyIGludmVyc2VuIHRpbGwgZGVuIGt1bXVsYXRpdmEgc3RhbmRhcmRub3JtYWxmw7ZyZGVsbmluZ2VuDQpQRUFSU09OCQkJPSBQRUFSU09OCQkJIyMJUmV0dXJuZXJhciBrb3JyZWxhdGlvbnNrb2VmZmljaWVudGVuIHRpbGwgUGVhcnNvbnMgbW9tZW50cHJvZHVrdA0KUEVSQ0VOVElMRQkJPSBQRVJDRU5USUwJCQkjIwlSZXR1cm5lcmFyIGRlbiBuOnRlIHBlcmNlbnRpbGVuIGF2IHbDpHJkZW4gaSBldHQgb21yw6VkZQ0KUEVSQ0VOVFJBTksJCT0gUFJPQ0VOVFJBTkcJCQkjIwlSZXR1cm5lcmFyIHByb2NlbnRyYW5nZW4gZsO2ciBldHQgdsOkcmRlIGkgZW4gZGF0YW3DpG5nZA0KUEVSTVVUCQkJPSBQRVJNVVQJCQkjIwlSZXR1cm5lcmFyIGFudGFsIHBlcm11dGF0aW9uZXIgZsO2ciBldHQgZ2l2ZXQgYW50YWwgb2JqZWt0DQpQT0lTU09OCQkJPSBQT0lTU09OCQkJIyMJUmV0dXJuZXJhciBQb2lzc29uLWbDtnJkZWxuaW5nZW4NClBST0IJCQk9IFNBTk5PTElLSEVUCQkJIyMJUmV0dXJuZXJhciBzYW5ub2xpa2hldGVuIGF0dCB2w6RyZGVuIGkgZXR0IG9tcsOlZGUgbGlnZ2VyIG1lbGxhbiB0dsOlIGdyw6Ruc2VyDQpRVUFSVElMRQkJPSBLVkFSVElMCQkJIyMJUmV0dXJuZXJhciBrdmFydGlsZW4gYXYgZW4gbcOkbmdkIGRhdGENClJBTksJCQk9IFJBTkcJCQkJIyMJUmV0dXJuZXJhciByYW5nb3JkbmluZ2VuIGbDtnIgZXR0IHRhbCBpIGVuIGxpc3RhIG1lZCB0YWwNClJTUQkJCT0gUktWCQkJCSMjCVJldHVybmVyYXIga3ZhZHJhdGVuIGF2IFBlYXJzb25zIHByb2R1a3Rtb21lbnRrb3JyZWxhdGlvbnNrb2VmZmljaWVudA0KU0tFVwkJCT0gU05FREhFVAkJCSMjCVJldHVybmVyYXIgc25lZGhldGVuIGbDtnIgZW4gZsO2cmRlbG5pbmcNClNMT1BFCQkJPSBMVVROSU5HCQkJIyMJUmV0dXJuZXJhciBsdXRuaW5nZW4gcMOlIGVuIGxpbmrDpHIgcmVncmVzc2lvbnNsaW5qZQ0KU01BTEwJCQk9IE1JTlNUQQkJCSMjCVJldHVybmVyYXIgZGV0IG46dGUgbWluc3RhIHbDpHJkZXQgaSBlbiBtw6RuZ2QgZGF0YQ0KU1RBTkRBUkRJWkUJCT0gU1RBTkRBUkRJU0VSQQkJCSMjCVJldHVybmVyYXIgZXR0IG5vcm1hbGlzZXJhdCB2w6RyZGUNClNUREVWCQkJPSBTVERBVgkJCQkjIwlVcHBza2F0dGFyIHN0YW5kYXJkYXZ2aWtlbHNlbiBiYXNlcmF0IHDDpSBldHQgdXJ2YWwNClNUREVWQQkJCT0gU1RERVZBCQkJIyMJVXBwc2thdHRhciBzdGFuZGFyZGF2dmlrZWxzZW4gYmFzZXJhdCBww6UgZXR0IHVydmFsLCBpbmtsdXNpdmUgdGFsLCB0ZXh0IG9jaCBsb2dpc2thIHbDpHJkZW4NClNUREVWUAkJCT0gU1REQVZQCQkJIyMJQmVyw6RrbmFyIHN0YW5kYXJkYXZ2aWtlbHNlbiBiYXNlcmF0IHDDpSBoZWxhIHBvcHVsYXRpb25lbg0KU1RERVZQQQkJCT0gU1RERVZQQQkJCSMjCUJlcsOka25hciBzdGFuZGFyZGF2dmlrZWxzZW4gYmFzZXJhdCBww6UgaGVsYSBwb3B1bGF0aW9uZW4sIGlua2x1c2l2ZSB0YWwsIHRleHQgb2NoIGxvZ2lza2EgdsOkcmRlbg0KU1RFWVgJCQk9IFNUREZFTFlYCQkJIyMJUmV0dXJuZXJhciBzdGFuZGFyZGZlbGV0IGbDtnIgZXR0IGbDtnJ1dHNww6V0dCB5LXbDpHJkZSBmw7ZyIHZhcmplIHgtdsOkcmRlIGkgcmVncmVzc2lvbmVuDQpURElTVAkJCT0gVEbDllJECQkJCSMjCVJldHVybmVyYXIgU3R1ZGVudHMgdC1mw7ZyZGVsbmluZw0KVElOVgkJCT0gVElOVgkJCQkjIwlSZXR1cm5lcmFyIGludmVyc2VuIHRpbGwgU3R1ZGVudHMgdC1mw7ZyZGVsbmluZw0KVFJFTkQJCQk9IFRSRU5ECQkJCSMjCVJldHVybmVyYXIgdsOkcmRlbiBsw6RuZ3MgZW4gbGluasOkciB0cmVuZA0KVFJJTU1FQU4JCT0gVFJJTU1FREVMCQkJIyMJUmV0dXJuZXJhciBtZWRlbHbDpHJkZXQgYXYgbWl0dHB1bmt0ZXJuYSBpIGVuIGRhdGFtw6RuZ2QNClRURVNUCQkJPSBUVEVTVAkJCQkjIwlSZXR1cm5lcmFyIHNhbm5vbGlraGV0ZW4gYmVyw6RrbmFkIHVyIFN0dWRlbnRzIHQtdGVzdA0KVkFSCQkJPSBWQVJJQU5TCQkJIyMJVXBwc2thdHRhciB2YXJpYW5zZW4gYmFzZXJhdCBww6UgZXR0IHVydmFsDQpWQVJBCQkJPSBWQVJBCQkJCSMjCVVwcHNrYXR0YXIgdmFyaWFuc2VuIGJhc2VyYXQgcMOlIGV0dCB1cnZhbCwgaW5rbHVzaXZlIHRhbCwgdGV4dCBvY2ggbG9naXNrYSB2w6RyZGVuDQpWQVJQCQkJPSBWQVJJQU5TUAkJCSMjCUJlcsOka25hciB2YXJpYW5zZW4gYmFzZXJhdCBww6UgaGVsYSBwb3B1bGF0aW9uZW4NClZBUlBBCQkJPSBWQVJQQQkJCQkjIwlCZXLDpGtuYXIgdmFyaWFuc2VuIGJhc2VyYXQgcMOlIGhlbGEgcG9wdWxhdGlvbmVuLCBpbmtsdXNpdmUgdGFsLCB0ZXh0IG9jaCBsb2dpc2thIHbDpHJkZW4NCldFSUJVTEwJCQk9IFdFSUJVTEwJCQkjIwlSZXR1cm5lcmFyIFdlaWJ1bGwtZsO2cmRlbG5pbmdlbg0KWlRFU1QJCQk9IFpURVNUCQkJCSMjCVJldHVybmVyYXIgZGV0IGVuc2lkaWdhIHNhbm5vbGlraGV0c3bDpHJkZXQgYXYgZXR0IHotdGVzdA0KDQoNCiMjDQojIwlUZXh0IGZ1bmN0aW9ucwkJCQkJVGV4dGZ1bmt0aW9uZXINCiMjDQpBU0MJCQk9IEFTQwkJCQkjIwnDhG5kcmFyIGhlbGJyZWRkcyAoZHViYmVsIGJ5dGUpIGVuZ2Vsc2thIGJva3N0w6R2ZXIgZWxsZXIga2F0YWthbmEgaW5vbSBlbiB0ZWNrZW5zdHLDpG5nIHRpbGwgdGVja2VuIG1lZCBoYWx2dCBicmVkZHN0ZWcgKGVua2VsIGJ5dGUpDQpCQUhUVEVYVAkJPSBCQUhUVEVYVAkJCSMjCU9tdmFuZGxhciBldHQgdGFsIHRpbGwgdGV4dCBtZWQgdmFsdXRhZm9ybWF0ZXQgw58gKGJhaHQpDQpDSEFSCQkJPSBURUNLRU5LT0QJCQkjIwlSZXR1cm5lcmFyIHRlY2tuZXQgc29tIGFuZ2VzIGF2IGtvZA0KQ0xFQU4JCQk9IFNUw4REQQkJCQkjIwlUYXIgYm9ydCBhbGxhIGlja2UgdXRza3JpdmJhcmEgdGVja2VuIGkgZW4gdGV4dA0KQ09ERQkJCT0gS09ECQkJCSMjCVJldHVybmVyYXIgZW4gbnVtZXJpc2sga29kIGbDtnIgZGV0IGbDtnJzdGEgdGVja25ldCBpIGVuIHRleHRzdHLDpG5nDQpDT05DQVRFTkFURQkJPSBTQU1NQU5GT0dBCQkJIyMJU2FtbWFuZm9nYXIgZmxlcmEgdGV4dGRlbGFyIHRpbGwgZW4gdGV4dHN0csOkbmcNCkRPTExBUgkJCT0gVkFMVVRBCQkJIyMJT212YW5kbGFyIGV0dCB0YWwgdGlsbCB0ZXh0IG1lZCB2YWx1dGFmb3JtYXQNCkVYQUNUCQkJPSBFWEFLVAkJCQkjIwlLb250cm9sbGVyYXIgb20gdHbDpSB0ZXh0dsOkcmRlbiDDpHIgaWRlbnRpc2thDQpGSU5ECQkJPSBISVRUQQkJCQkjIwlIaXR0YXIgZW4gdGV4dCBpIGVuIGFubmFuIChza2lsamVyIHDDpSBnZW1lbmVyIG9jaCB2ZXJzYWxlcikNCkZJTkRCCQkJPSBISVRUQUIJCQkjIwlIaXR0YXIgZW4gdGV4dCBpIGVuIGFubmFuIChza2lsamVyIHDDpSBnZW1lbmVyIG9jaCB2ZXJzYWxlcikNCkZJWEVECQkJPSBGQVNUVEFMCQkJIyMJRm9ybWF0ZXJhciBldHQgdGFsIHNvbSB0ZXh0IG1lZCBldHQgZmFzdCBhbnRhbCBkZWNpbWFsZXINCkpJUwkJCT0gSklTCQkJCSMjCcOEbmRyYXIgaGFsdmJyZWRkcyAoZW5rZWwgYnl0ZSkgZW5nZWxza2EgYm9rc3TDpHZlciBlbGxlciBrYXRha2FuYSBpbm9tIGVuIHRlY2tlbnN0csOkbmcgdGlsbCB0ZWNrZW4gbWVkIGhlbHQgYnJlZGRzdGVnIChkdWJiZWwgYnl0ZSkNCkxFRlQJCQk9IFbDhE5TVEVSCQkJIyMJUmV0dXJuZXJhciB0ZWNrZW4gbMOkbmdzdCB0aWxsIHbDpG5zdGVyIGkgZW4gc3Ryw6RuZw0KTEVGVEIJCQk9IFbDhE5TVEVSQgkJCSMjCVJldHVybmVyYXIgdGVja2VuIGzDpG5nc3QgdGlsbCB2w6Ruc3RlciBpIGVuIHN0csOkbmcNCkxFTgkJCT0gTMOETkdECQkJCSMjCVJldHVybmVyYXIgYW50YWxldCB0ZWNrZW4gaSBlbiB0ZXh0c3Ryw6RuZw0KTEVOQgkJCT0gTMOETkdEQgkJCSMjCVJldHVybmVyYXIgYW50YWxldCB0ZWNrZW4gaSBlbiB0ZXh0c3Ryw6RuZw0KTE9XRVIJCQk9IEdFTUVORVIJCQkjIwlPbXZhbmRsYXIgdGV4dCB0aWxsIGdlbWVuZXINCk1JRAkJCT0gRVhURVhUCQkJIyMJUmV0dXJuZXJhciBhbmdpdmV0IGFudGFsIHRlY2tlbiBmcsOlbiBlbiB0ZXh0IG1lZCBiw7ZyamFuIHZpZCBkZW4gcG9zaXRpb24gc29tIGR1IGFuZ2VyDQpNSURCCQkJPSBFWFRFWFRCCQkJIyMJUmV0dXJuZXJhciBhbmdpdmV0IGFudGFsIHRlY2tlbiBmcsOlbiBlbiB0ZXh0IG1lZCBiw7ZyamFuIHZpZCBkZW4gcG9zaXRpb24gc29tIGR1IGFuZ2VyDQpQSE9ORVRJQwkJPSBQSE9ORVRJQwkJCSMjCVJldHVybmVyYXIgZGUgZm9uZXRpc2thIChmdXJpZ2FuYSkgdGVja25lbiBpIGVuIHRleHRzdHLDpG5nDQpQUk9QRVIJCQk9IElOSVRJQUwJCQkjIwnDhG5kcmFyIGbDtnJzdGEgYm9rc3RhdmVuIGkgdmFyamUgb3JkIGkgZXR0IHRleHR2w6RyZGUgdGlsbCB2ZXJzYWwNClJFUExBQ0UJCQk9IEVSU8OEVFQJCQkjIwlFcnPDpHR0ZXIgdGVja2VuIGkgdGV4dA0KUkVQTEFDRUIJCT0gRVJTw4RUVEIJCQkjIwlFcnPDpHR0ZXIgdGVja2VuIGkgdGV4dA0KUkVQVAkJCT0gUkVQCQkJCSMjCVVwcHJlcGFyIGVuIHRleHQgZXR0IGJlc3TDpG10IGFudGFsIGfDpW5nZXINClJJR0hUCQkJPSBIw5ZHRVIJCQkJIyMJUmV0dXJuZXJhciB0ZWNrZW4gbMOkbmdzdCB0aWxsIGjDtmdlciBpIGVuIHN0csOkbmcNClJJR0hUQgkJCT0gSMOWR0VSQgkJCSMjCVJldHVybmVyYXIgdGVja2VuIGzDpG5nc3QgdGlsbCBow7ZnZXIgaSBlbiBzdHLDpG5nDQpTRUFSQ0gJCQk9IFPDlksJCQkJIyMJSGl0dGFyIGV0dCB0ZXh0dsOkcmRlIGkgZXR0IGFubmF0IChza2lsamVyIGludGUgcMOlIGdlbWVuZXIgb2NoIHZlcnNhbGVyKQ0KU0VBUkNIQgkJCT0gU8OWS0IJCQkJIyMJSGl0dGFyIGV0dCB0ZXh0dsOkcmRlIGkgZXR0IGFubmF0IChza2lsamVyIGludGUgcMOlIGdlbWVuZXIgb2NoIHZlcnNhbGVyKQ0KU1VCU1RJVFVURQkJPSBCWVQuVVQJCQkjIwlFcnPDpHR0ZXIgZ2FtbWFsIHRleHQgbWVkIG55IHRleHQgaSBlbiB0ZXh0c3Ryw6RuZw0KVAkJCT0gVAkJCQkjIwlPbXZhbmRsYXIgYXJndW1lbnRlbiB0aWxsIHRleHQNClRFWFQJCQk9IFRFWFQJCQkJIyMJRm9ybWF0ZXJhciBldHQgdGFsIG9jaCBvbXZhbmRsYXIgZGV0IHRpbGwgdGV4dA0KVFJJTQkJCT0gUkVOU0EJCQkJIyMJVGFyIGJvcnQgYmxhbmtzdGVnIGZyw6VuIHRleHQNClVQUEVSCQkJPSBWRVJTQUxFUgkJCSMjCU9tdmFuZGxhciB0ZXh0IHRpbGwgdmVyc2FsZXINClZBTFVFCQkJPSBURVhUTlVNCQkJIyMJT212YW5kbGFyIGV0dCB0ZXh0YXJndW1lbnQgdGlsbCBldHQgdGFsDQo=]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/NamedRange.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIFBIUEV4Y2VsCiAqCiAqIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICoKICogQGNhdGVnb3J5ICAgUEhQRXhjZWwKICogQHBhY2thZ2UgICAgUEhQRXhjZWwKICogQGNvcHlyaWdodCAgQ29weXJpZ2h0IChjKSAyMDA2IC0gMjAxMiBQSFBFeGNlbCAoaHR0cDovL3d3dy5jb2RlcGxleC5jb20vUEhQRXhjZWwpCiAqIEBsaWNlbnNlICAgIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9vbGQtbGljZW5zZXMvbGdwbC0yLjEudHh0CUxHUEwKICogQHZlcnNpb24gICAgMS43LjcsIDIwMTItMDUtMTkKICovCgoKLyoqCiAqIFBIUEV4Y2VsX05hbWVkUmFuZ2UKICoKICogQGNhdGVnb3J5ICAgUEhQRXhjZWwKICogQHBhY2thZ2UgICAgUEhQRXhjZWwKICogQGNvcHlyaWdodCAgQ29weXJpZ2h0IChjKSAyMDA2IC0gMjAxMiBQSFBFeGNlbCAoaHR0cDovL3d3dy5jb2RlcGxleC5jb20vUEhQRXhjZWwpCiAqLwpjbGFzcyBQSFBFeGNlbF9OYW1lZFJhbmdlCnsKCS8qKgoJICogUmFuZ2UgbmFtZQoJICoKCSAqIEB2YXIgc3RyaW5nCgkgKi8KCXByaXZhdGUgJF9uYW1lOwoKCS8qKgoJICogV29ya3NoZWV0IG9uIHdoaWNoIHRoZSBuYW1lZCByYW5nZSBjYW4gYmUgcmVzb2x2ZWQKCSAqCgkgKiBAdmFyIFBIUEV4Y2VsX1dvcmtzaGVldAoJICovCglwcml2YXRlICRfd29ya3NoZWV0OwoKCS8qKgoJICogUmFuZ2Ugb2YgdGhlIHJlZmVyZW5jZWQgY2VsbHMKCSAqCgkgKiBAdmFyIHN0cmluZwoJICovCglwcml2YXRlICRfcmFuZ2U7CgoJLyoqCgkgKiBJcyB0aGUgbmFtZWQgcmFuZ2UgbG9jYWw/IChpLmUuIGNhbiBvbmx5IGJlIHVzZWQgb24gJHRoaXMtPl93b3Jrc2hlZXQpCgkgKgoJICogQHZhciBib29sCgkgKi8KCXByaXZhdGUgJF9sb2NhbE9ubHk7CgoJLyoqCgkgKiBTY29wZQoJICoKCSAqIEB2YXIgUEhQRXhjZWxfV29ya3NoZWV0CgkgKi8KCXByaXZhdGUgJF9zY29wZTsKCiAgICAvKioKICAgICAqIENyZWF0ZSBhIG5ldyBOYW1lZFJhbmdlCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyAkcE5hbWUKICAgICAqIEBwYXJhbSBQSFBFeGNlbF9Xb3Jrc2hlZXQgJHBXb3Jrc2hlZXQKICAgICAqIEBwYXJhbSBzdHJpbmcgJHBSYW5nZQogICAgICogQHBhcmFtIGJvb2wgJHBMb2NhbE9ubHkKICAgICAqIEBwYXJhbSBQSFBFeGNlbF9Xb3Jrc2hlZXR8bnVsbCAkcFNjb3BlCVNjb3BlLiBPbmx5IGFwcGxpZXMgd2hlbiAkcExvY2FsT25seSA9IHRydWUuIE51bGwgZm9yIGdsb2JhbCBzY29wZS4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRwTmFtZSA9IG51bGwsIFBIUEV4Y2VsX1dvcmtzaGVldCAkcFdvcmtzaGVldCwgJHBSYW5nZSA9ICdBMScsICRwTG9jYWxPbmx5ID0gZmFsc2UsICRwU2NvcGUgPSBudWxsKQogICAgewogICAgCS8vIFZhbGlkYXRlIGRhdGEKICAgIAlpZiAoKCRwTmFtZSA9PT0gTlVMTCkgfHwgKCRwV29ya3NoZWV0ID09PSBOVUxMKSB8fCAoJHBSYW5nZSA9PT0gTlVMTCkpIHsKICAgIAkJdGhyb3cgbmV3IEV4Y2VwdGlvbignUGFyYW1ldGVycyBjYW4gbm90IGJlIG51bGwuJyk7CiAgICAJfQoKICAgIAkvLyBTZXQgbG9jYWwgbWVtYmVycwogICAgCSR0aGlzLT5fbmFtZSAJCT0gJHBOYW1lOwogICAgCSR0aGlzLT5fd29ya3NoZWV0IAk9ICRwV29ya3NoZWV0OwogICAgCSR0aGlzLT5fcmFuZ2UgCQk9ICRwUmFuZ2U7CiAgICAJJHRoaXMtPl9sb2NhbE9ubHkgCT0gJHBMb2NhbE9ubHk7CiAgICAJJHRoaXMtPl9zY29wZSAJCT0gKCRwTG9jYWxPbmx5ID09IHRydWUpID8KCQkJCQkJCQkoKCRwU2NvcGUgPT0gbnVsbCkgPyAkcFdvcmtzaGVldCA6ICRwU2NvcGUpIDogbnVsbDsKICAgIH0KCiAgICAvKioKICAgICAqIEdldCBuYW1lCiAgICAgKgogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldE5hbWUoKSB7CiAgICAJcmV0dXJuICR0aGlzLT5fbmFtZTsKICAgIH0KCiAgICAvKioKICAgICAqIFNldCBuYW1lCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyAkdmFsdWUKICAgICAqIEByZXR1cm4gUEhQRXhjZWxfTmFtZWRSYW5nZQogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gc2V0TmFtZSgkdmFsdWUgPSBudWxsKSB7CiAgICAJaWYgKCR2YWx1ZSAhPT0gTlVMTCkgewogICAgCQkvLyBPbGQgdGl0bGUKICAgIAkJJG9sZFRpdGxlID0gJHRoaXMtPl9uYW1lOwoKICAgIAkJLy8gUmUtYXR0YWNoCiAgICAJCWlmICgkdGhpcy0+X3dvcmtzaGVldCAhPT0gTlVMTCkgewogICAgCQkJJHRoaXMtPl93b3Jrc2hlZXQtPmdldFBhcmVudCgpLT5yZW1vdmVOYW1lZFJhbmdlKCR0aGlzLT5fbmFtZSwkdGhpcy0+X3dvcmtzaGVldCk7CiAgICAJCX0KICAgIAkJJHRoaXMtPl9uYW1lID0gJHZhbHVlOwoKICAgIAkJaWYgKCR0aGlzLT5fd29ya3NoZWV0ICE9PSBOVUxMKSB7CiAgICAJCQkkdGhpcy0+X3dvcmtzaGVldC0+Z2V0UGFyZW50KCktPmFkZE5hbWVkUmFuZ2UoJHRoaXMpOwogICAgCQl9CgoJICAgIAkvLyBOZXcgdGl0bGUKCSAgICAJJG5ld1RpdGxlID0gJHRoaXMtPl9uYW1lOwoJICAgIAlQSFBFeGNlbF9SZWZlcmVuY2VIZWxwZXI6OmdldEluc3RhbmNlKCktPnVwZGF0ZU5hbWVkRm9ybXVsYXMoJHRoaXMtPl93b3Jrc2hlZXQtPmdldFBhcmVudCgpLCAkb2xkVGl0bGUsICRuZXdUaXRsZSk7CiAgICAJfQogICAgCXJldHVybiAkdGhpczsKICAgIH0KCiAgICAvKioKICAgICAqIEdldCB3b3Jrc2hlZXQKICAgICAqCiAgICAgKiBAcmV0dXJuIFBIUEV4Y2VsX1dvcmtzaGVldAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0V29ya3NoZWV0KCkgewogICAgCXJldHVybiAkdGhpcy0+X3dvcmtzaGVldDsKICAgIH0KCiAgICAvKioKICAgICAqIFNldCB3b3Jrc2hlZXQKICAgICAqCiAgICAgKiBAcGFyYW0gUEhQRXhjZWxfV29ya3NoZWV0ICR2YWx1ZQogICAgICogQHJldHVybiBQSFBFeGNlbF9OYW1lZFJhbmdlCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBzZXRXb3Jrc2hlZXQoUEhQRXhjZWxfV29ya3NoZWV0ICR2YWx1ZSA9IG51bGwpIHsKICAgIAlpZiAoJHZhbHVlICE9PSBOVUxMKSB7CiAgICAJCSR0aGlzLT5fd29ya3NoZWV0ID0gJHZhbHVlOwogICAgCX0KICAgIAlyZXR1cm4gJHRoaXM7CiAgICB9CgogICAgLyoqCiAgICAgKiBHZXQgcmFuZ2UKICAgICAqCiAgICAgKiBAcmV0dXJuIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0UmFuZ2UoKSB7CiAgICAJcmV0dXJuICR0aGlzLT5fcmFuZ2U7CiAgICB9CgogICAgLyoqCiAgICAgKiBTZXQgcmFuZ2UKICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nICR2YWx1ZQogICAgICogQHJldHVybiBQSFBFeGNlbF9OYW1lZFJhbmdlCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBzZXRSYW5nZSgkdmFsdWUgPSBudWxsKSB7CiAgICAJaWYgKCR2YWx1ZSAhPT0gTlVMTCkgewogICAgCQkkdGhpcy0+X3JhbmdlID0gJHZhbHVlOwogICAgCX0KICAgIAlyZXR1cm4gJHRoaXM7CiAgICB9CgogICAgLyoqCiAgICAgKiBHZXQgbG9jYWxPbmx5CiAgICAgKgogICAgICogQHJldHVybiBib29sCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRMb2NhbE9ubHkoKSB7CiAgICAJcmV0dXJuICR0aGlzLT5fbG9jYWxPbmx5OwogICAgfQoKICAgIC8qKgogICAgICogU2V0IGxvY2FsT25seQogICAgICoKICAgICAqIEBwYXJhbSBib29sICR2YWx1ZQogICAgICogQHJldHVybiBQSFBFeGNlbF9OYW1lZFJhbmdlCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBzZXRMb2NhbE9ubHkoJHZhbHVlID0gZmFsc2UpIHsKICAgIAkkdGhpcy0+X2xvY2FsT25seSA9ICR2YWx1ZTsKICAgIAkkdGhpcy0+X3Njb3BlID0gJHZhbHVlID8gJHRoaXMtPl93b3Jrc2hlZXQgOiBudWxsOwogICAgCXJldHVybiAkdGhpczsKICAgIH0KCiAgICAvKioKICAgICAqIEdldCBzY29wZQogICAgICoKICAgICAqIEByZXR1cm4gUEhQRXhjZWxfV29ya3NoZWV0fG51bGwKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldFNjb3BlKCkgewogICAgCXJldHVybiAkdGhpcy0+X3Njb3BlOwogICAgfQoKICAgIC8qKgogICAgICogU2V0IHNjb3BlCiAgICAgKgogICAgICogQHBhcmFtIFBIUEV4Y2VsX1dvcmtzaGVldHxudWxsICR2YWx1ZQogICAgICogQHJldHVybiBQSFBFeGNlbF9OYW1lZFJhbmdlCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBzZXRTY29wZShQSFBFeGNlbF9Xb3Jrc2hlZXQgJHZhbHVlID0gbnVsbCkgewogICAgCSR0aGlzLT5fc2NvcGUgPSAkdmFsdWU7CiAgICAJJHRoaXMtPl9sb2NhbE9ubHkgPSAoJHZhbHVlID09IG51bGwpID8gZmFsc2UgOiB0cnVlOwogICAgCXJldHVybiAkdGhpczsKICAgIH0KCiAgICAvKioKICAgICAqIFJlc29sdmUgYSBuYW1lZCByYW5nZSB0byBhIHJlZ3VsYXIgY2VsbCByYW5nZQogICAgICoKICAgICAqIEBwYXJhbSBzdHJpbmcgJHBOYW1lZFJhbmdlIE5hbWVkIHJhbmdlCiAgICAgKiBAcGFyYW0gUEhQRXhjZWxfV29ya3NoZWV0fG51bGwgJHBTaGVldCBTY29wZS4gVXNlIG51bGwgZm9yIGdsb2JhbCBzY29wZQogICAgICogQHJldHVybiBQSFBFeGNlbF9OYW1lZFJhbmdlCiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gcmVzb2x2ZVJhbmdlKCRwTmFtZWRSYW5nZSA9ICcnLCBQSFBFeGNlbF9Xb3Jrc2hlZXQgJHBTaGVldCkgewoJCXJldHVybiAkcFNoZWV0LT5nZXRQYXJlbnQoKS0+Z2V0TmFtZWRSYW5nZSgkcE5hbWVkUmFuZ2UsICRwU2hlZXQpOwogICAgfQoKCS8qKgoJICogSW1wbGVtZW50IFBIUCBfX2Nsb25lIHRvIGNyZWF0ZSBhIGRlZXAgY2xvbmUsIG5vdCBqdXN0IGEgc2hhbGxvdyBjb3B5LgoJICovCglwdWJsaWMgZnVuY3Rpb24gX19jbG9uZSgpIHsKCQkkdmFycyA9IGdldF9vYmplY3RfdmFycygkdGhpcyk7CgkJZm9yZWFjaCAoJHZhcnMgYXMgJGtleSA9PiAkdmFsdWUpIHsKCQkJaWYgKGlzX29iamVjdCgkdmFsdWUpKSB7CgkJCQkkdGhpcy0+JGtleSA9IGNsb25lICR2YWx1ZTsKCQkJfSBlbHNlIHsKCQkJCSR0aGlzLT4ka2V5ID0gJHZhbHVlOwoJCQl9CgkJfQoJfQp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Reader/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Reader/CSV.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIFBIUEV4Y2VsCiAqCiAqIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICoKICogQGNhdGVnb3J5ICAgUEhQRXhjZWwKICogQHBhY2thZ2UgICAgUEhQRXhjZWxfUmVhZGVyCiAqIEBjb3B5cmlnaHQgIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwgKGh0dHA6Ly93d3cuY29kZXBsZXguY29tL1BIUEV4Y2VsKQogKiBAbGljZW5zZSAgICBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvb2xkLWxpY2Vuc2VzL2xncGwtMi4xLnR4dAlMR1BMCiAqIEB2ZXJzaW9uICAgIDEuNy43LCAyMDEyLTA1LTE5CiAqLwoKCi8qKiBQSFBFeGNlbCByb290IGRpcmVjdG9yeSAqLwppZiAoIWRlZmluZWQoJ1BIUEVYQ0VMX1JPT1QnKSkgewoJLyoqCgkgKiBAaWdub3JlCgkgKi8KCWRlZmluZSgnUEhQRVhDRUxfUk9PVCcsIGRpcm5hbWUoX19GSUxFX18pIC4gJy8uLi8uLi8nKTsKCXJlcXVpcmUoUEhQRVhDRUxfUk9PVCAuICdQSFBFeGNlbC9BdXRvbG9hZGVyLnBocCcpOwp9CgovKioKICogUEhQRXhjZWxfUmVhZGVyX0NTVgogKgogKiBAY2F0ZWdvcnkgICBQSFBFeGNlbAogKiBAcGFja2FnZSAgICBQSFBFeGNlbF9SZWFkZXIKICogQGNvcHlyaWdodCAgQ29weXJpZ2h0IChjKSAyMDA2IC0gMjAxMiBQSFBFeGNlbCAoaHR0cDovL3d3dy5jb2RlcGxleC5jb20vUEhQRXhjZWwpCiAqLwpjbGFzcyBQSFBFeGNlbF9SZWFkZXJfQ1NWIGltcGxlbWVudHMgUEhQRXhjZWxfUmVhZGVyX0lSZWFkZXIKewoJLyoqCgkgKiBJbnB1dCBlbmNvZGluZwoJICoKCSAqIEBhY2Nlc3MJcHJpdmF0ZQoJICogQHZhcglzdHJpbmcKCSAqLwoJcHJpdmF0ZSAkX2lucHV0RW5jb2RpbmcJPSAnVVRGLTgnOwoKCS8qKgoJICogRGVsaW1pdGVyCgkgKgoJICogQGFjY2Vzcwlwcml2YXRlCgkgKiBAdmFyIHN0cmluZwoJICovCglwcml2YXRlICRfZGVsaW1pdGVyCQk9ICcsJzsKCgkvKioKCSAqIEVuY2xvc3VyZQoJICoKCSAqIEBhY2Nlc3MJcHJpdmF0ZQoJICogQHZhcglzdHJpbmcKCSAqLwoJcHJpdmF0ZSAkX2VuY2xvc3VyZQkJPSAnIic7CgoJLyoqCgkgKiBMaW5lIGVuZGluZwoJICoKCSAqIEBhY2Nlc3MJcHJpdmF0ZQoJICogQHZhcglzdHJpbmcKCSAqLwoJcHJpdmF0ZSAkX2xpbmVFbmRpbmcJPSBQSFBfRU9MOwoKCS8qKgoJICogU2hlZXQgaW5kZXggdG8gcmVhZAoJICoKCSAqIEBhY2Nlc3MJcHJpdmF0ZQoJICogQHZhcglpbnQKCSAqLwoJcHJpdmF0ZSAkX3NoZWV0SW5kZXgJPSAwOwoKCS8qKgoJICogTG9hZCByb3dzIGNvbnRpZ3VvdXNseQoJICoKCSAqIEBhY2Nlc3MJcHJpdmF0ZQoJICogQHZhcglpbnQKCSAqLwoJcHJpdmF0ZSAkX2NvbnRpZ3VvdXMJPSBmYWxzZTsKCgoJLyoqCgkgKiBSb3cgY291bnRlciBmb3IgbG9hZGluZyByb3dzIGNvbnRpZ3VvdXNseQoJICoKCSAqIEBhY2Nlc3MJcHJpdmF0ZQoJICogQHZhcglpbnQKCSAqLwoJcHJpdmF0ZSAkX2NvbnRpZ3VvdXNSb3cJPSAtMTsKCgkvKioKCSAqIFBIUEV4Y2VsX1JlYWRlcl9JUmVhZEZpbHRlciBpbnN0YW5jZQoJICoKCSAqIEBhY2Nlc3MJcHJpdmF0ZQoJICogQHZhcglQSFBFeGNlbF9SZWFkZXJfSVJlYWRGaWx0ZXIKCSAqLwoJcHJpdmF0ZSAkX3JlYWRGaWx0ZXIgPSBudWxsOwoKCgkvKioKCSAqIENyZWF0ZSBhIG5ldyBQSFBFeGNlbF9SZWFkZXJfQ1NWCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgpIHsKCQkkdGhpcy0+X3JlYWRGaWx0ZXIJCT0gbmV3IFBIUEV4Y2VsX1JlYWRlcl9EZWZhdWx0UmVhZEZpbHRlcigpOwoJfQkvLwlmdW5jdGlvbiBfX2NvbnN0cnVjdCgpCgoKCS8qKgoJICogQ2FuIHRoZSBjdXJyZW50IFBIUEV4Y2VsX1JlYWRlcl9JUmVhZGVyIHJlYWQgdGhlIGZpbGU/CgkgKgoJICogQGFjY2VzcwlwdWJsaWMKCSAqIEBwYXJhbSAJc3RyaW5nIAkJJHBGaWxlTmFtZQoJICogQHJldHVybiBib29sZWFuCgkgKiBAdGhyb3dzIEV4Y2VwdGlvbgoJICovCglwdWJsaWMgZnVuY3Rpb24gY2FuUmVhZCgkcEZpbGVuYW1lKQoJewoJCS8vIENoZWNrIGlmIGZpbGUgZXhpc3RzCgkJaWYgKCFmaWxlX2V4aXN0cygkcEZpbGVuYW1lKSkgewoJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCJDb3VsZCBub3Qgb3BlbiAiIC4gJHBGaWxlbmFtZSAuICIgZm9yIHJlYWRpbmchIEZpbGUgZG9lcyBub3QgZXhpc3QuIik7CgkJfQoKCQlyZXR1cm4gdHJ1ZTsKCX0JLy8JZnVuY3Rpb24gY2FuUmVhZCgpCgoKCS8qKgoJICogUmVhZCBmaWx0ZXIKCSAqCgkgKiBAYWNjZXNzCXB1YmxpYwoJICogQHJldHVybiBQSFBFeGNlbF9SZWFkZXJfSVJlYWRGaWx0ZXIKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldFJlYWRGaWx0ZXIoKSB7CgkJcmV0dXJuICR0aGlzLT5fcmVhZEZpbHRlcjsKCX0JLy8JZnVuY3Rpb24gZ2V0UmVhZEZpbHRlcigpCgoKCS8qKgoJICogU2V0IHJlYWQgZmlsdGVyCgkgKgoJICogQGFjY2VzcwlwdWJsaWMKCSAqIEBwYXJhbQlQSFBFeGNlbF9SZWFkZXJfSVJlYWRGaWx0ZXIgJHBWYWx1ZQoJICovCglwdWJsaWMgZnVuY3Rpb24gc2V0UmVhZEZpbHRlcihQSFBFeGNlbF9SZWFkZXJfSVJlYWRGaWx0ZXIgJHBWYWx1ZSkgewoJCSR0aGlzLT5fcmVhZEZpbHRlciA9ICRwVmFsdWU7CgkJcmV0dXJuICR0aGlzOwoJfQkvLwlmdW5jdGlvbiBzZXRSZWFkRmlsdGVyKCkKCgoJLyoqCgkgKiBTZXQgaW5wdXQgZW5jb2RpbmcKCSAqCgkgKiBAYWNjZXNzCXB1YmxpYwoJICogQHBhcmFtIHN0cmluZyAkcFZhbHVlIElucHV0IGVuY29kaW5nCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBzZXRJbnB1dEVuY29kaW5nKCRwVmFsdWUgPSAnVVRGLTgnKQoJewoJCSR0aGlzLT5faW5wdXRFbmNvZGluZyA9ICRwVmFsdWU7CgkJcmV0dXJuICR0aGlzOwoJfQkvLwlmdW5jdGlvbiBzZXRJbnB1dEVuY29kaW5nKCkKCgoJLyoqCgkgKiBHZXQgaW5wdXQgZW5jb2RpbmcKCSAqCgkgKiBAYWNjZXNzCXB1YmxpYwoJICogQHJldHVybiBzdHJpbmcKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldElucHV0RW5jb2RpbmcoKQoJewoJCXJldHVybiAkdGhpcy0+X2lucHV0RW5jb2Rpbmc7Cgl9CS8vCWZ1bmN0aW9uIGdldElucHV0RW5jb2RpbmcoKQoKCgkvKioKCSAqIFJldHVybiB3b3Jrc2hlZXQgaW5mbyAoTmFtZSwgTGFzdCBDb2x1bW4gTGV0dGVyLCBMYXN0IENvbHVtbiBJbmRleCwgVG90YWwgUm93cywgVG90YWwgQ29sdW1ucykKCSAqCgkgKiBAYWNjZXNzCXB1YmxpYwoJICogQHBhcmFtIAlzdHJpbmcgCQkkcEZpbGVuYW1lCgkgKiBAdGhyb3dzCUV4Y2VwdGlvbgoJICovCglwdWJsaWMgZnVuY3Rpb24gbGlzdFdvcmtzaGVldEluZm8oJHBGaWxlbmFtZSkKCXsKCQkvLyBDaGVjayBpZiBmaWxlIGV4aXN0cwoJCWlmICghZmlsZV9leGlzdHMoJHBGaWxlbmFtZSkpIHsKCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbigiQ291bGQgbm90IG9wZW4gIiAuICRwRmlsZW5hbWUgLiAiIGZvciByZWFkaW5nISBGaWxlIGRvZXMgbm90IGV4aXN0LiIpOwoJCX0KCgkJLy8gT3BlbiBmaWxlCgkJJGZpbGVIYW5kbGUgPSBmb3BlbigkcEZpbGVuYW1lLCAncicpOwoJCWlmICgkZmlsZUhhbmRsZSA9PT0gZmFsc2UpIHsKCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbigiQ291bGQgbm90IG9wZW4gZmlsZSAiIC4gJHBGaWxlbmFtZSAuICIgZm9yIHJlYWRpbmcuIik7CgkJfQoKCQkvLyBTa2lwIEJPTSwgaWYgYW55CgkJc3dpdGNoICgkdGhpcy0+X2lucHV0RW5jb2RpbmcpIHsKCQkJY2FzZSAnVVRGLTgnOgoJCQkJZmdldHMoJGZpbGVIYW5kbGUsIDQpID09ICJceEVGXHhCQlx4QkYiID8KCQkJCWZzZWVrKCRmaWxlSGFuZGxlLCAzKSA6IGZzZWVrKCRmaWxlSGFuZGxlLCAwKTsKCQkJCWJyZWFrOwoJCQljYXNlICdVVEYtMTZMRSc6CgkJCQlmZ2V0cygkZmlsZUhhbmRsZSwgMykgPT0gIlx4RkZceEZFIiA/CgkJCQlmc2VlaygkZmlsZUhhbmRsZSwgMikgOiBmc2VlaygkZmlsZUhhbmRsZSwgMCk7CgkJCQlicmVhazsKCQkJY2FzZSAnVVRGLTE2QkUnOgoJCQkJZmdldHMoJGZpbGVIYW5kbGUsIDMpID09ICJceEZFXHhGRiIgPwoJCQkJZnNlZWsoJGZpbGVIYW5kbGUsIDIpIDogZnNlZWsoJGZpbGVIYW5kbGUsIDApOwoJCQkJYnJlYWs7CgkJCWNhc2UgJ1VURi0zMkxFJzoKCQkJCWZnZXRzKCRmaWxlSGFuZGxlLCA1KSA9PSAiXHhGRlx4RkVceDAwXHgwMCIgPwoJCQkJZnNlZWsoJGZpbGVIYW5kbGUsIDQpIDogZnNlZWsoJGZpbGVIYW5kbGUsIDApOwoJCQkJYnJlYWs7CgkJCWNhc2UgJ1VURi0zMkJFJzoKCQkJCWZnZXRzKCRmaWxlSGFuZGxlLCA1KSA9PSAiXHgwMFx4MDBceEZFXHhGRiIgPwoJCQkJZnNlZWsoJGZpbGVIYW5kbGUsIDQpIDogZnNlZWsoJGZpbGVIYW5kbGUsIDApOwoJCQkJYnJlYWs7CgkJCWRlZmF1bHQ6CgkJCQlicmVhazsKCQl9CgoJCSRlc2NhcGVFbmNsb3N1cmVzID0gYXJyYXkoICJcXCIgLiAkdGhpcy0+X2VuY2xvc3VyZSwgJHRoaXMtPl9lbmNsb3N1cmUgLiAkdGhpcy0+X2VuY2xvc3VyZSApOwoKCQkkd29ya3NoZWV0SW5mbyA9IGFycmF5KCk7CgkJJHdvcmtzaGVldEluZm9bMF1bJ3dvcmtzaGVldE5hbWUnXSA9ICdXb3Jrc2hlZXQnOwoJCSR3b3Jrc2hlZXRJbmZvWzBdWydsYXN0Q29sdW1uTGV0dGVyJ10gPSAnQSc7CgkJJHdvcmtzaGVldEluZm9bMF1bJ2xhc3RDb2x1bW5JbmRleCddID0gMDsKCQkkd29ya3NoZWV0SW5mb1swXVsndG90YWxSb3dzJ10gPSAwOwoJCSR3b3Jrc2hlZXRJbmZvWzBdWyd0b3RhbENvbHVtbnMnXSA9IDA7CgoJCS8vIExvb3AgdGhyb3VnaCBlYWNoIGxpbmUgb2YgdGhlIGZpbGUgaW4gdHVybgoJCXdoaWxlICgoJHJvd0RhdGEgPSBmZ2V0Y3N2KCRmaWxlSGFuZGxlLCAwLCAkdGhpcy0+X2RlbGltaXRlciwgJHRoaXMtPl9lbmNsb3N1cmUpKSAhPT0gRkFMU0UpIHsKCQkJJHdvcmtzaGVldEluZm9bMF1bJ3RvdGFsUm93cyddKys7CgkJCSR3b3Jrc2hlZXRJbmZvWzBdWydsYXN0Q29sdW1uSW5kZXgnXSA9IG1heCgkd29ya3NoZWV0SW5mb1swXVsnbGFzdENvbHVtbkluZGV4J10sIGNvdW50KCRyb3dEYXRhKSAtIDEpOwoJCX0KCgkJJHdvcmtzaGVldEluZm9bMF1bJ2xhc3RDb2x1bW5MZXR0ZXInXSA9IFBIUEV4Y2VsX0NlbGw6OnN0cmluZ0Zyb21Db2x1bW5JbmRleCgkd29ya3NoZWV0SW5mb1swXVsnbGFzdENvbHVtbkluZGV4J10pOwoJCSR3b3Jrc2hlZXRJbmZvWzBdWyd0b3RhbENvbHVtbnMnXSA9ICR3b3Jrc2hlZXRJbmZvWzBdWydsYXN0Q29sdW1uSW5kZXgnXSArIDE7CgoJCS8vIENsb3NlIGZpbGUKCQlmY2xvc2UoJGZpbGVIYW5kbGUpOwoKCQlyZXR1cm4gJHdvcmtzaGVldEluZm87Cgl9CgoKCS8qKgoJICogTG9hZHMgUEhQRXhjZWwgZnJvbSBmaWxlCgkgKgoJICogQGFjY2VzcwlwdWJsaWMKCSAqIEBwYXJhbSAJc3RyaW5nIAkJJHBGaWxlbmFtZQoJICogQHJldHVybiBQSFBFeGNlbAoJICogQHRocm93cyBFeGNlcHRpb24KCSAqLwoJcHVibGljIGZ1bmN0aW9uIGxvYWQoJHBGaWxlbmFtZSkKCXsKCQkvLyBDcmVhdGUgbmV3IFBIUEV4Y2VsCgkJJG9ialBIUEV4Y2VsID0gbmV3IFBIUEV4Y2VsKCk7CgoJCS8vIExvYWQgaW50byB0aGlzIGluc3RhbmNlCgkJcmV0dXJuICR0aGlzLT5sb2FkSW50b0V4aXN0aW5nKCRwRmlsZW5hbWUsICRvYmpQSFBFeGNlbCk7Cgl9CS8vCWZ1bmN0aW9uIGxvYWQoKQoKCgkvKioKCSAqIExvYWRzIFBIUEV4Y2VsIGZyb20gZmlsZSBpbnRvIFBIUEV4Y2VsIGluc3RhbmNlCgkgKgoJICogQGFjY2VzcwlwdWJsaWMKCSAqIEBwYXJhbSAJc3RyaW5nIAkJJHBGaWxlbmFtZQoJICogQHBhcmFtCVBIUEV4Y2VsCSRvYmpQSFBFeGNlbAoJICogQHJldHVybiAJUEhQRXhjZWwKCSAqIEB0aHJvd3MgCUV4Y2VwdGlvbgoJICovCglwdWJsaWMgZnVuY3Rpb24gbG9hZEludG9FeGlzdGluZygkcEZpbGVuYW1lLCBQSFBFeGNlbCAkb2JqUEhQRXhjZWwpCgl7CgkJLy8gQ2hlY2sgaWYgZmlsZSBleGlzdHMKCQlpZiAoIWZpbGVfZXhpc3RzKCRwRmlsZW5hbWUpKSB7CgkJCXRocm93IG5ldyBFeGNlcHRpb24oIkNvdWxkIG5vdCBvcGVuICIgLiAkcEZpbGVuYW1lIC4gIiBmb3IgcmVhZGluZyEgRmlsZSBkb2VzIG5vdCBleGlzdC4iKTsKCQl9CgoJCS8vIENyZWF0ZSBuZXcgUEhQRXhjZWwKCQl3aGlsZSAoJG9ialBIUEV4Y2VsLT5nZXRTaGVldENvdW50KCkgPD0gJHRoaXMtPl9zaGVldEluZGV4KSB7CgkJCSRvYmpQSFBFeGNlbC0+Y3JlYXRlU2hlZXQoKTsKCQl9CgkJJHNoZWV0ID0gJG9ialBIUEV4Y2VsLT5zZXRBY3RpdmVTaGVldEluZGV4KCAkdGhpcy0+X3NoZWV0SW5kZXggKTsKCgkJJGxpbmVFbmRpbmcgPSBpbmlfZ2V0KCdhdXRvX2RldGVjdF9saW5lX2VuZGluZ3MnKTsKCQlpbmlfc2V0KCdhdXRvX2RldGVjdF9saW5lX2VuZGluZ3MnLCB0cnVlKTsKCgkJLy8gT3BlbiBmaWxlCgkJJGZpbGVIYW5kbGUgPSBmb3BlbigkcEZpbGVuYW1lLCAncicpOwoJCWlmICgkZmlsZUhhbmRsZSA9PT0gZmFsc2UpIHsKCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbigiQ291bGQgbm90IG9wZW4gZmlsZSAkcEZpbGVuYW1lIGZvciByZWFkaW5nLiIpOwoJCX0KCgkJLy8gU2tpcCBCT00sIGlmIGFueQoJCXN3aXRjaCAoJHRoaXMtPl9pbnB1dEVuY29kaW5nKSB7CgkJCWNhc2UgJ1VURi04JzoKCQkJCWZnZXRzKCRmaWxlSGFuZGxlLCA0KSA9PSAiXHhFRlx4QkJceEJGIiA/CgkJCQkJZnNlZWsoJGZpbGVIYW5kbGUsIDMpIDogZnNlZWsoJGZpbGVIYW5kbGUsIDApOwoJCQkJYnJlYWs7CgkJCWNhc2UgJ1VURi0xNkxFJzoKCQkJCWZnZXRzKCRmaWxlSGFuZGxlLCAzKSA9PSAiXHhGRlx4RkUiID8KCQkJCQlmc2VlaygkZmlsZUhhbmRsZSwgMikgOiBmc2VlaygkZmlsZUhhbmRsZSwgMCk7CgkJCQlicmVhazsKCQkJY2FzZSAnVVRGLTE2QkUnOgoJCQkJZmdldHMoJGZpbGVIYW5kbGUsIDMpID09ICJceEZFXHhGRiIgPwoJCQkJCWZzZWVrKCRmaWxlSGFuZGxlLCAyKSA6IGZzZWVrKCRmaWxlSGFuZGxlLCAwKTsKCQkJCWJyZWFrOwoJCQljYXNlICdVVEYtMzJMRSc6CgkJCQlmZ2V0cygkZmlsZUhhbmRsZSwgNSkgPT0gIlx4RkZceEZFXHgwMFx4MDAiID8KCQkJCQlmc2VlaygkZmlsZUhhbmRsZSwgNCkgOiBmc2VlaygkZmlsZUhhbmRsZSwgMCk7CgkJCQlicmVhazsKCQkJY2FzZSAnVVRGLTMyQkUnOgoJCQkJZmdldHMoJGZpbGVIYW5kbGUsIDUpID09ICJceDAwXHgwMFx4RkVceEZGIiA/CgkJCQkJZnNlZWsoJGZpbGVIYW5kbGUsIDQpIDogZnNlZWsoJGZpbGVIYW5kbGUsIDApOwoJCQkJYnJlYWs7CgkJCWRlZmF1bHQ6CgkJCQlicmVhazsKCQl9CgoJCSRlc2NhcGVFbmNsb3N1cmVzID0gYXJyYXkoICJcXCIgLiAkdGhpcy0+X2VuY2xvc3VyZSwKCQkJCQkJCQkgICAkdGhpcy0+X2VuY2xvc3VyZSAuICR0aGlzLT5fZW5jbG9zdXJlCgkJCQkJCQkJICk7CgoJCS8vIFNldCBvdXIgc3RhcnRpbmcgcm93IGJhc2VkIG9uIHdoZXRoZXIgd2UncmUgaW4gY29udGlndW91cyBtb2RlIG9yIG5vdAoJCSRjdXJyZW50Um93ID0gMTsKCQlpZiAoJHRoaXMtPl9jb250aWd1b3VzKSB7CgkJCSRjdXJyZW50Um93ID0gKCR0aGlzLT5fY29udGlndW91c1JvdyA9PSAtMSkgPyAkc2hlZXQtPmdldEhpZ2hlc3RSb3coKTogJHRoaXMtPl9jb250aWd1b3VzUm93OwoJCX0KCgkJLy8gTG9vcCB0aHJvdWdoIGVhY2ggbGluZSBvZiB0aGUgZmlsZSBpbiB0dXJuCgkJd2hpbGUgKCgkcm93RGF0YSA9IGZnZXRjc3YoJGZpbGVIYW5kbGUsIDAsICR0aGlzLT5fZGVsaW1pdGVyLCAkdGhpcy0+X2VuY2xvc3VyZSkpICE9PSBGQUxTRSkgewoJCQkkY29sdW1uTGV0dGVyID0gJ0EnOwoJCQlmb3JlYWNoKCRyb3dEYXRhIGFzICRyb3dEYXR1bSkgewoJCQkJaWYgKCRyb3dEYXR1bSAhPSAnJyAmJiAkdGhpcy0+X3JlYWRGaWx0ZXItPnJlYWRDZWxsKCRjb2x1bW5MZXR0ZXIsICRjdXJyZW50Um93KSkgewoJCQkJCS8vIFVuZXNjYXBlIGVuY2xvc3VyZXMKCQkJCQkkcm93RGF0dW0gPSBzdHJfcmVwbGFjZSgkZXNjYXBlRW5jbG9zdXJlcywgJHRoaXMtPl9lbmNsb3N1cmUsICRyb3dEYXR1bSk7CgoJCQkJCS8vIENvbnZlcnQgZW5jb2RpbmcgaWYgbmVjZXNzYXJ5CgkJCQkJaWYgKCR0aGlzLT5faW5wdXRFbmNvZGluZyAhPT0gJ1VURi04JykgewoJCQkJCQkkcm93RGF0dW0gPSBQSFBFeGNlbF9TaGFyZWRfU3RyaW5nOjpDb252ZXJ0RW5jb2RpbmcoJHJvd0RhdHVtLCAnVVRGLTgnLCAkdGhpcy0+X2lucHV0RW5jb2RpbmcpOwoJCQkJCX0KCgkJCQkJLy8gU2V0IGNlbGwgdmFsdWUKCQkJCQkkc2hlZXQtPmdldENlbGwoJGNvbHVtbkxldHRlciAuICRjdXJyZW50Um93KS0+c2V0VmFsdWUoJHJvd0RhdHVtKTsKCQkJCX0KCQkJCSsrJGNvbHVtbkxldHRlcjsKCQkJfQoJCQkrKyRjdXJyZW50Um93OwoJCX0KCgkJLy8gQ2xvc2UgZmlsZQoJCWZjbG9zZSgkZmlsZUhhbmRsZSk7CgoJCWlmICgkdGhpcy0+X2NvbnRpZ3VvdXMpIHsKCQkJJHRoaXMtPl9jb250aWd1b3VzUm93ID0gJGN1cnJlbnRSb3c7CgkJfQoKCQlpbmlfc2V0KCdhdXRvX2RldGVjdF9saW5lX2VuZGluZ3MnLCAkbGluZUVuZGluZyk7CgoJCS8vIFJldHVybgoJCXJldHVybiAkb2JqUEhQRXhjZWw7Cgl9CS8vCWZ1bmN0aW9uIGxvYWRJbnRvRXhpc3RpbmcoKQoKCgkvKioKCSAqIEdldCBkZWxpbWl0ZXIKCSAqCgkgKiBAYWNjZXNzCXB1YmxpYwoJICogQHJldHVybiBzdHJpbmcKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldERlbGltaXRlcigpIHsKCQlyZXR1cm4gJHRoaXMtPl9kZWxpbWl0ZXI7Cgl9CS8vCWZ1bmN0aW9uIGdldERlbGltaXRlcigpCgoKCS8qKgoJICogU2V0IGRlbGltaXRlcgoJICoKCSAqIEBhY2Nlc3MJcHVibGljCgkgKiBAcGFyYW0Jc3RyaW5nCSRwVmFsdWUJCURlbGltaXRlciwgZGVmYXVsdHMgdG8gLAoJICogQHJldHVybglQSFBFeGNlbF9SZWFkZXJfQ1NWCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBzZXREZWxpbWl0ZXIoJHBWYWx1ZSA9ICcsJykgewoJCSR0aGlzLT5fZGVsaW1pdGVyID0gJHBWYWx1ZTsKCQlyZXR1cm4gJHRoaXM7Cgl9CS8vCWZ1bmN0aW9uIHNldERlbGltaXRlcigpCgoKCS8qKgoJICogR2V0IGVuY2xvc3VyZQoJICoKCSAqIEBhY2Nlc3MJcHVibGljCgkgKiBAcmV0dXJuIHN0cmluZwoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0RW5jbG9zdXJlKCkgewoJCXJldHVybiAkdGhpcy0+X2VuY2xvc3VyZTsKCX0JLy8JZnVuY3Rpb24gZ2V0RW5jbG9zdXJlKCkKCgoJLyoqCgkgKiBTZXQgZW5jbG9zdXJlCgkgKgoJICogQGFjY2VzcwlwdWJsaWMKCSAqIEBwYXJhbQlzdHJpbmcJJHBWYWx1ZQkJRW5jbG9zdXJlLCBkZWZhdWx0cyB0byAiCgkgKiBAcmV0dXJuIFBIUEV4Y2VsX1JlYWRlcl9DU1YKCSAqLwoJcHVibGljIGZ1bmN0aW9uIHNldEVuY2xvc3VyZSgkcFZhbHVlID0gJyInKSB7CgkJaWYgKCRwVmFsdWUgPT0gJycpIHsKCQkJJHBWYWx1ZSA9ICciJzsKCQl9CgkJJHRoaXMtPl9lbmNsb3N1cmUgPSAkcFZhbHVlOwoJCXJldHVybiAkdGhpczsKCX0JLy8JZnVuY3Rpb24gc2V0RW5jbG9zdXJlKCkKCgoJLyoqCgkgKiBHZXQgbGluZSBlbmRpbmcKCSAqCgkgKiBAYWNjZXNzCXB1YmxpYwoJICogQHJldHVybiBzdHJpbmcKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldExpbmVFbmRpbmcoKSB7CgkJcmV0dXJuICR0aGlzLT5fbGluZUVuZGluZzsKCX0JLy8JZnVuY3Rpb24gZ2V0TGluZUVuZGluZygpCgoKCS8qKgoJICogU2V0IGxpbmUgZW5kaW5nCgkgKgoJICogQGFjY2VzcwlwdWJsaWMKCSAqIEBwYXJhbQlzdHJpbmcJJHBWYWx1ZQkJTGluZSBlbmRpbmcsIGRlZmF1bHRzIHRvIE9TIGxpbmUgZW5kaW5nIChQSFBfRU9MKQoJICogQHJldHVybiBQSFBFeGNlbF9SZWFkZXJfQ1NWCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBzZXRMaW5lRW5kaW5nKCRwVmFsdWUgPSBQSFBfRU9MKSB7CgkJJHRoaXMtPl9saW5lRW5kaW5nID0gJHBWYWx1ZTsKCQlyZXR1cm4gJHRoaXM7Cgl9CS8vCWZ1bmN0aW9uIHNldExpbmVFbmRpbmcoKQoKCgkvKioKCSAqIEdldCBzaGVldCBpbmRleAoJICoKCSAqIEBhY2Nlc3MJcHVibGljCgkgKiBAcmV0dXJuIGludAoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0U2hlZXRJbmRleCgpIHsKCQlyZXR1cm4gJHRoaXMtPl9zaGVldEluZGV4OwoJfQkvLwlmdW5jdGlvbiBnZXRTaGVldEluZGV4KCkKCgoJLyoqCgkgKiBTZXQgc2hlZXQgaW5kZXgKCSAqCgkgKiBAYWNjZXNzCXB1YmxpYwoJICogQHBhcmFtCWludAkJJHBWYWx1ZQkJU2hlZXQgaW5kZXgKCSAqIEByZXR1cm4gUEhQRXhjZWxfUmVhZGVyX0NTVgoJICovCglwdWJsaWMgZnVuY3Rpb24gc2V0U2hlZXRJbmRleCgkcFZhbHVlID0gMCkgewoJCSR0aGlzLT5fc2hlZXRJbmRleCA9ICRwVmFsdWU7CgkJcmV0dXJuICR0aGlzOwoJfQkvLwlmdW5jdGlvbiBzZXRTaGVldEluZGV4KCkKCgoJLyoqCgkgKiBTZXQgQ29udGlndW91cwoJICoKCSAqIEBhY2Nlc3MJcHVibGljCgkgKiBAcGFyYW0gc3RyaW5nICRwVmFsdWUgSW5wdXQgZW5jb2RpbmcKCSAqLwoJcHVibGljIGZ1bmN0aW9uIHNldENvbnRpZ3VvdXMoJGNvbnRpZ3VvdXMgPSBmYWxzZSkKCXsKCQkkdGhpcy0+X2NvbnRpZ3VvdXMgPSAoYm9vbCkkY29udGlndW91czsKCQlpZiAoISRjb250aWd1b3VzKSB7CgkJCSR0aGlzLT5fY29udGlndW91c1Jvdwk9IC0xOwoJCX0KCgkJcmV0dXJuICR0aGlzOwoJfQkvLwlmdW5jdGlvbiBzZXRJbnB1dEVuY29kaW5nKCkKCgoJLyoqCgkgKiBHZXQgQ29udGlndW91cwoJICoKCSAqIEBhY2Nlc3MJcHVibGljCgkgKiBAcmV0dXJuIGJvb2xlYW4KCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldENvbnRpZ3VvdXMoKSB7CgkJcmV0dXJuICR0aGlzLT5fY29udGlndW91czsKCX0JLy8JZnVuY3Rpb24gZ2V0U2hlZXRJbmRleCgpCgp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Reader/DefaultReadFilter.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIFBIUEV4Y2VsCiAqCiAqIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICoKICogQGNhdGVnb3J5ICAgUEhQRXhjZWwKICogQHBhY2thZ2UgICAgUEhQRXhjZWxfUmVhZGVyCiAqIEBjb3B5cmlnaHQgIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwgKGh0dHA6Ly93d3cuY29kZXBsZXguY29tL1BIUEV4Y2VsKQogKiBAbGljZW5zZSAgICBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvb2xkLWxpY2Vuc2VzL2xncGwtMi4xLnR4dAlMR1BMCiAqIEB2ZXJzaW9uICAgIDEuNy43LCAyMDEyLTA1LTE5CiAqLwoKCi8qKiBQSFBFeGNlbCByb290IGRpcmVjdG9yeSAqLwppZiAoIWRlZmluZWQoJ1BIUEVYQ0VMX1JPT1QnKSkgewoJLyoqCgkgKiBAaWdub3JlCgkgKi8KCWRlZmluZSgnUEhQRVhDRUxfUk9PVCcsIGRpcm5hbWUoX19GSUxFX18pIC4gJy8uLi8uLi8nKTsKCXJlcXVpcmUoUEhQRVhDRUxfUk9PVCAuICdQSFBFeGNlbC9BdXRvbG9hZGVyLnBocCcpOwp9CgovKioKICogUEhQRXhjZWxfUmVhZGVyX0RlZmF1bHRSZWFkRmlsdGVyCiAqCiAqIEBjYXRlZ29yeSAgIFBIUEV4Y2VsCiAqIEBwYWNrYWdlICAgIFBIUEV4Y2VsX1JlYWRlcgogKiBAY29weXJpZ2h0ICBDb3B5cmlnaHQgKGMpIDIwMDYgLSAyMDEyIFBIUEV4Y2VsIChodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9QSFBFeGNlbCkKICovCmNsYXNzIFBIUEV4Y2VsX1JlYWRlcl9EZWZhdWx0UmVhZEZpbHRlciBpbXBsZW1lbnRzIFBIUEV4Y2VsX1JlYWRlcl9JUmVhZEZpbHRlcgp7CgkvKioKCSAqIFNob3VsZCB0aGlzIGNlbGwgYmUgcmVhZD8KCSAqCgkgKiBAcGFyYW0gCSRjb2x1bW4JCVN0cmluZyBjb2x1bW4gaW5kZXgKCSAqIEBwYXJhbSAJJHJvdwkJCVJvdyBpbmRleAoJICogQHBhcmFtCSR3b3Jrc2hlZXROYW1lCU9wdGlvbmFsIHdvcmtzaGVldCBuYW1lCgkgKiBAcmV0dXJuCWJvb2xlYW4KCSAqLwoJcHVibGljIGZ1bmN0aW9uIHJlYWRDZWxsKCRjb2x1bW4sICRyb3csICR3b3Jrc2hlZXROYW1lID0gJycpIHsKCQlyZXR1cm4gdHJ1ZTsKCX0KfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Reader/Excel5.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCi8qKg0KICogUEhQRXhjZWwNCiAqDQogKiBDb3B5cmlnaHQgKGMpIDIwMDYgLSAyMDEyIFBIUEV4Y2VsDQogKg0KICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcg0KICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYw0KICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyDQogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4NCiAqDQogKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwNCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mDQogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQ0KICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4NCiAqDQogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljDQogKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlDQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0ENCiAqDQogKiBAY2F0ZWdvcnkgICBQSFBFeGNlbA0KICogQHBhY2thZ2UgICAgUEhQRXhjZWxfUmVhZGVyX0V4Y2VsNQ0KICogQGNvcHlyaWdodCAgQ29weXJpZ2h0IChjKSAyMDA2IC0gMjAxMiBQSFBFeGNlbCAoaHR0cDovL3d3dy5jb2RlcGxleC5jb20vUEhQRXhjZWwpDQogKiBAbGljZW5zZSAgICBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvb2xkLWxpY2Vuc2VzL2xncGwtMi4xLnR4dAlMR1BMDQogKiBAdmVyc2lvbiAgICAxLjcuNywgMjAxMi0wNS0xOQ0KICovDQoNCi8vIE9yaWdpbmFsIGZpbGUgaGVhZGVyIG9mIFBhcnNlWEwgKHVzZWQgYXMgdGhlIGJhc2UgZm9yIHRoaXMgY2xhc3MpOg0KLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vIEFkYXB0ZWQgZnJvbSBFeGNlbF9TcHJlYWRzaGVldF9SZWFkZXIgZGV2ZWxvcGVkIGJ5IHVzZXJzIGJpem9uMTUzLA0KLy8gdHJleDAwNSwgYW5kIG1tcDExIChTb3VyY2VGb3JnZS5uZXQpDQovLyBodHRwOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3RzL3BocGV4Y2VscmVhZGVyLw0KLy8gUHJpbWFyeSBjaGFuZ2VzIG1hZGUgYnkgY2FueW9uY2FzYSAoZHZjKSBmb3IgUGFyc2VYTCAxLjAwIC4uLg0KLy8JIE1vZGVsbGVkIG1vcmVzbyBhZnRlciBQZXJsIEV4Y2VsIFBhcnNlL1dyaXRlIG1vZHVsZXMNCi8vCSBBZGRlZCBQYXJzZV9FeGNlbF9TcHJlYWRzaGVldCBvYmplY3QNCi8vCQkgUmVhZHMgYSB3aG9sZSB3b3Jrc2hlZXQgb3IgdGFiIGFzIHJvdyxjb2x1bW4gYXJyYXkgb3IgYXMNCi8vCQkgYXNzb2NpYXRlZCBoYXNoIG9mIGluZGV4ZWQgcm93cyBhbmQgbmFtZWQgY29sdW1uIGZpZWxkcw0KLy8JIEFkZGVkIHZhcmlhYmxlcyBmb3Igd29ya3NoZWV0ICh0YWIpIGluZGV4ZXMgYW5kIG5hbWVzDQovLwkgQWRkZWQgYW4gb2JqZWN0IGNhbGwgZm9yIGxvYWRpbmcgaW5kaXZpZHVhbCB3b29ya3NoZWV0cw0KLy8JIENoYW5nZWQgZGVmYXVsdCBpbmRleGluZyBkZWZhdWx0cyB0byAwIGJhc2VkIGFycmF5cw0KLy8JIEZpeGVkIGRhdGUvdGltZSBhbmQgcGVyY2VudCBmb3JtYXRzDQovLwkgSW5jbHVkZXMgcGF0Y2hlcyBmb3VuZCBhdCBTb3VyY2VGb3JnZS4uLg0KLy8JCSB1bmljb2RlIHBhdGNoIGJ5IG5vYm9keQ0KLy8JCSB1bnBhY2soImQiKSBtYWNoaW5lIGRlcGVkZW5jeSBwYXRjaCBieSBtYXRjaHkNCi8vCQkgYm91bmRzaGVldCB1dGYxNiBwYXRjaCBieSBiamFlbmljaGVuDQovLwkgUmVuYW1lZCBmdW5jdGlvbnMgZm9yIHNob3J0ZXIgbmFtZXMNCi8vCSBHZW5lcmFsIGNvZGUgY2xlYW51cCBhbmQgcmlnb3IsIGluY2x1ZGluZyA8ODAgY29sdW1uIHdpZHRoDQovLwkgSW5jbHVkZWQgYSB0ZXN0Y2FzZSBFeGNlbCBmaWxlIGFuZCBQSFAgZXhhbXBsZSBjYWxscw0KLy8JIENvZGUgd29ya3MgZm9yIFBIUCA1LngNCg0KLy8gUHJpbWFyeSBjaGFuZ2VzIG1hZGUgYnkgY2FueW9uY2FzYSAoZHZjKSBmb3IgUGFyc2VYTCAxLjEwIC4uLg0KLy8gaHR0cDovL3NvdXJjZWZvcmdlLm5ldC90cmFja2VyL2luZGV4LnBocD9mdW5jPWRldGFpbCZhaWQ9MTQ2Njk2NCZncm91cF9pZD05OTE2MCZhdGlkPTYyMzMzNA0KLy8JIERlY29kaW5nIG9mIGZvcm11bGEgY29uZGl0aW9ucywgcmVzdWx0cywgYW5kIHRva2Vucy4NCi8vCSBTdXBwb3J0IGZvciB1c2VyLWRlZmluZWQgbmFtZWQgY2VsbHMgYWRkZWQgYXMgYW4gYXJyYXkgIm5hbWVkY2VsbHMiDQovLwkJIFBhdGNoIGNvZGUgZm9yIHVzZXItZGVmaW5lZCBuYW1lZCBjZWxscyBzdXBwb3J0cyBzaW5nbGUgY2VsbHMgb25seS4NCi8vCQkgTk9URTogdGhpcyBwYXRjaCBvbmx5IHdvcmtzIGZvciBCSUZGOCBhcyBCSUZGNS03IHVzZSBhIGRpZmZlcmVudA0KLy8JCSBleHRlcm5hbCBzaGVldCByZWZlcmVuY2Ugc3RydWN0dXJlDQoNCg0KLyoqIFBIUEV4Y2VsIHJvb3QgZGlyZWN0b3J5ICovDQppZiAoIWRlZmluZWQoJ1BIUEVYQ0VMX1JPT1QnKSkgew0KCS8qKg0KCSAqIEBpZ25vcmUNCgkgKi8NCglkZWZpbmUoJ1BIUEVYQ0VMX1JPT1QnLCBkaXJuYW1lKF9fRklMRV9fKSAuICcvLi4vLi4vJyk7DQoJcmVxdWlyZShQSFBFWENFTF9ST09UIC4gJ1BIUEV4Y2VsL0F1dG9sb2FkZXIucGhwJyk7DQp9DQoNCi8qKg0KICogUEhQRXhjZWxfUmVhZGVyX0V4Y2VsNQ0KICoNCiAqIFRoaXMgY2xhc3MgdXNlcyB7QGxpbmsgaHR0cDovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0cy9waHBleGNlbHJlYWRlci9wYXJzZVhMfQ0KICoNCiAqIEBjYXRlZ29yeQlQSFBFeGNlbA0KICogQHBhY2thZ2UJCVBIUEV4Y2VsX1JlYWRlcl9FeGNlbDUNCiAqIEBjb3B5cmlnaHQJQ29weXJpZ2h0IChjKSAyMDA2IC0gMjAxMiBQSFBFeGNlbCAoaHR0cDovL3d3dy5jb2RlcGxleC5jb20vUEhQRXhjZWwpDQogKi8NCmNsYXNzIFBIUEV4Y2VsX1JlYWRlcl9FeGNlbDUgaW1wbGVtZW50cyBQSFBFeGNlbF9SZWFkZXJfSVJlYWRlcg0Kew0KCS8vIFBhcnNlWEwgZGVmaW5pdGlvbnMNCgljb25zdCBYTFNfQklGRjgJCQkJCQk9IDB4MDYwMDsNCgljb25zdCBYTFNfQklGRjcJCQkJCQk9IDB4MDUwMDsNCgljb25zdCBYTFNfV29ya2Jvb2tHbG9iYWxzCQkJPSAweDAwMDU7DQoJY29uc3QgWExTX1dvcmtzaGVldAkJCQkJPSAweDAwMTA7DQoNCgkvLyByZWNvcmQgaWRlbnRpZmllcnMNCgljb25zdCBYTFNfVHlwZV9GT1JNVUxBCQkJCT0gMHgwMDA2Ow0KCWNvbnN0IFhMU19UeXBlX0VPRgkJCQkJPSAweDAwMGE7DQoJY29uc3QgWExTX1R5cGVfUFJPVEVDVAkJCQk9IDB4MDAxMjsNCgljb25zdCBYTFNfVHlwZV9PQkpFQ1RQUk9URUNUCQk9IDB4MDA2MzsNCgljb25zdCBYTFNfVHlwZV9TQ0VOUFJPVEVDVAkJCT0gMHgwMGRkOw0KCWNvbnN0IFhMU19UeXBlX1BBU1NXT1JECQkJCT0gMHgwMDEzOw0KCWNvbnN0IFhMU19UeXBlX0hFQURFUgkJCQk9IDB4MDAxNDsNCgljb25zdCBYTFNfVHlwZV9GT09URVIJCQkJPSAweDAwMTU7DQoJY29uc3QgWExTX1R5cGVfRVhURVJOU0hFRVQJCQk9IDB4MDAxNzsNCgljb25zdCBYTFNfVHlwZV9ERUZJTkVETkFNRQkJCT0gMHgwMDE4Ow0KCWNvbnN0IFhMU19UeXBlX1ZFUlRJQ0FMUEFHRUJSRUFLUwk9IDB4MDAxYTsNCgljb25zdCBYTFNfVHlwZV9IT1JJWk9OVEFMUEFHRUJSRUFLUwk9IDB4MDAxYjsNCgljb25zdCBYTFNfVHlwZV9OT1RFCQkJCQk9IDB4MDAxYzsNCgljb25zdCBYTFNfVHlwZV9TRUxFQ1RJT04JCQk9IDB4MDAxZDsNCgljb25zdCBYTFNfVHlwZV9EQVRFTU9ERQkJCQk9IDB4MDAyMjsNCgljb25zdCBYTFNfVHlwZV9FWFRFUk5OQU1FCQkJPSAweDAwMjM7DQoJY29uc3QgWExTX1R5cGVfTEVGVE1BUkdJTgkJCT0gMHgwMDI2Ow0KCWNvbnN0IFhMU19UeXBlX1JJR0hUTUFSR0lOCQkJPSAweDAwMjc7DQoJY29uc3QgWExTX1R5cGVfVE9QTUFSR0lOCQkJPSAweDAwMjg7DQoJY29uc3QgWExTX1R5cGVfQk9UVE9NTUFSR0lOCQkJPSAweDAwMjk7DQoJY29uc3QgWExTX1R5cGVfUFJJTlRHUklETElORVMJCT0gMHgwMDJiOw0KCWNvbnN0IFhMU19UeXBlX0ZJTEVQQVNTCQkJCT0gMHgwMDJmOw0KCWNvbnN0IFhMU19UeXBlX0ZPTlQJCQkJCT0gMHgwMDMxOw0KCWNvbnN0IFhMU19UeXBlX0NPTlRJTlVFCQkJCT0gMHgwMDNjOw0KCWNvbnN0IFhMU19UeXBlX1BBTkUJCQkJCT0gMHgwMDQxOw0KCWNvbnN0IFhMU19UeXBlX0NPREVQQUdFCQkJCT0gMHgwMDQyOw0KCWNvbnN0IFhMU19UeXBlX0RFRkNPTFdJRFRIIAkJCT0gMHgwMDU1Ow0KCWNvbnN0IFhMU19UeXBlX09CSgkJCQkJPSAweDAwNWQ7DQoJY29uc3QgWExTX1R5cGVfQ09MSU5GTwkJCQk9IDB4MDA3ZDsNCgljb25zdCBYTFNfVHlwZV9JTURBVEEJCQkJPSAweDAwN2Y7DQoJY29uc3QgWExTX1R5cGVfU0hFRVRQUgkJCQk9IDB4MDA4MTsNCgljb25zdCBYTFNfVHlwZV9IQ0VOVEVSCQkJCT0gMHgwMDgzOw0KCWNvbnN0IFhMU19UeXBlX1ZDRU5URVIJCQkJPSAweDAwODQ7DQoJY29uc3QgWExTX1R5cGVfU0hFRVQJCQkJPSAweDAwODU7DQoJY29uc3QgWExTX1R5cGVfUEFMRVRURQkJCQk9IDB4MDA5MjsNCgljb25zdCBYTFNfVHlwZV9TQ0wJCQkJCT0gMHgwMGEwOw0KCWNvbnN0IFhMU19UeXBlX1BBR0VTRVRVUAkJCT0gMHgwMGExOw0KCWNvbnN0IFhMU19UeXBlX01VTFJLCQkJCT0gMHgwMGJkOw0KCWNvbnN0IFhMU19UeXBlX01VTEJMQU5LCQkJCT0gMHgwMGJlOw0KCWNvbnN0IFhMU19UeXBlX0RCQ0VMTAkJCQk9IDB4MDBkNzsNCgljb25zdCBYTFNfVHlwZV9YRgkJCQkJPSAweDAwZTA7DQoJY29uc3QgWExTX1R5cGVfTUVSR0VEQ0VMTFMJCQk9IDB4MDBlNTsNCgljb25zdCBYTFNfVHlwZV9NU09EUkFXSU5HR1JPVVAJCT0gMHgwMGViOw0KCWNvbnN0IFhMU19UeXBlX01TT0RSQVdJTkcJCQk9IDB4MDBlYzsNCgljb25zdCBYTFNfVHlwZV9TU1QJCQkJCT0gMHgwMGZjOw0KCWNvbnN0IFhMU19UeXBlX0xBQkVMU1NUCQkJCT0gMHgwMGZkOw0KCWNvbnN0IFhMU19UeXBlX0VYVFNTVAkJCQk9IDB4MDBmZjsNCgljb25zdCBYTFNfVHlwZV9FWFRFUk5BTEJPT0sJCQk9IDB4MDFhZTsNCgljb25zdCBYTFNfVHlwZV9EQVRBVkFMSURBVElPTlMJCT0gMHgwMWIyOw0KCWNvbnN0IFhMU19UeXBlX1RYTwkJCQkJPSAweDAxYjY7DQoJY29uc3QgWExTX1R5cGVfSFlQRVJMSU5LCQkJPSAweDAxYjg7DQoJY29uc3QgWExTX1R5cGVfREFUQVZBTElEQVRJT04JCT0gMHgwMWJlOw0KCWNvbnN0IFhMU19UeXBlX0RJTUVOU0lPTgkJCT0gMHgwMjAwOw0KCWNvbnN0IFhMU19UeXBlX0JMQU5LCQkJCT0gMHgwMjAxOw0KCWNvbnN0IFhMU19UeXBlX05VTUJFUgkJCQk9IDB4MDIwMzsNCgljb25zdCBYTFNfVHlwZV9MQUJFTAkJCQk9IDB4MDIwNDsNCgljb25zdCBYTFNfVHlwZV9CT09MRVJSCQkJCT0gMHgwMjA1Ow0KCWNvbnN0IFhMU19UeXBlX1NUUklORwkJCQk9IDB4MDIwNzsNCgljb25zdCBYTFNfVHlwZV9ST1cJCQkJCT0gMHgwMjA4Ow0KCWNvbnN0IFhMU19UeXBlX0lOREVYCQkJCT0gMHgwMjBiOw0KCWNvbnN0IFhMU19UeXBlX0FSUkFZCQkJCT0gMHgwMjIxOw0KCWNvbnN0IFhMU19UeXBlX0RFRkFVTFRST1dIRUlHSFQgCT0gMHgwMjI1Ow0KCWNvbnN0IFhMU19UeXBlX1dJTkRPVzIJCQkJPSAweDAyM2U7DQoJY29uc3QgWExTX1R5cGVfUksJCQkJCT0gMHgwMjdlOw0KCWNvbnN0IFhMU19UeXBlX1NUWUxFCQkJCT0gMHgwMjkzOw0KCWNvbnN0IFhMU19UeXBlX0ZPUk1BVAkJCQk9IDB4MDQxZTsNCgljb25zdCBYTFNfVHlwZV9TSEFSRURGTUxBCQkJPSAweDA0YmM7DQoJY29uc3QgWExTX1R5cGVfQk9GCQkJCQk9IDB4MDgwOTsNCgljb25zdCBYTFNfVHlwZV9TSEVFVFBST1RFQ1RJT04JCT0gMHgwODY3Ow0KCWNvbnN0IFhMU19UeXBlX1JBTkdFUFJPVEVDVElPTgkJPSAweDA4Njg7DQoJY29uc3QgWExTX1R5cGVfU0hFRVRMQVlPVVQJCQk9IDB4MDg2MjsNCgljb25zdCBYTFNfVHlwZV9YRkVYVAkJCQk9IDB4MDg3ZDsNCgljb25zdCBYTFNfVHlwZV9VTktOT1dOCQkJCT0gMHhmZmZmOw0KDQoNCgkvKioNCgkgKiBSZWFkIGRhdGEgb25seT8NCgkgKiBJZGVudGlmaWVzIHdoZXRoZXIgdGhlIFJlYWRlciBzaG91bGQgb25seSByZWFkIGRhdGEgdmFsdWVzIGZvciBjZWxscywgYW5kIGlnbm9yZSBhbnkgZm9ybWF0dGluZyBpbmZvcm1hdGlvbjsNCgkgKgkJb3Igd2hldGhlciBpdCBzaG91bGQgcmVhZCBib3RoIGRhdGEgYW5kIGZvcm1hdHRpbmcNCgkgKg0KCSAqIEB2YXIJYm9vbGVhbg0KCSAqLw0KCXByaXZhdGUgJF9yZWFkRGF0YU9ubHkgPSBmYWxzZTsNCg0KCS8qKg0KCSAqIFJlc3RyaWN0IHdoaWNoIHNoZWV0cyBzaG91bGQgYmUgbG9hZGVkPw0KCSAqIFRoaXMgcHJvcGVydHkgaG9sZHMgYW4gYXJyYXkgb2Ygd29ya3NoZWV0IG5hbWVzIHRvIGJlIGxvYWRlZC4gSWYgbnVsbCwgdGhlbiBhbGwgd29ya3NoZWV0cyB3aWxsIGJlIGxvYWRlZC4NCgkgKg0KCSAqIEB2YXIJYXJyYXkgb2Ygc3RyaW5nDQoJICovDQoJcHJpdmF0ZSAkX2xvYWRTaGVldHNPbmx5ID0gbnVsbDsNCg0KCS8qKg0KCSAqIFBIUEV4Y2VsX1JlYWRlcl9JUmVhZEZpbHRlciBpbnN0YW5jZQ0KCSAqDQoJICogQHZhciBQSFBFeGNlbF9SZWFkZXJfSVJlYWRGaWx0ZXINCgkgKi8NCglwcml2YXRlICRfcmVhZEZpbHRlciA9IG51bGw7DQoNCgkvKioNCgkgKiBTdW1tYXJ5IEluZm9ybWF0aW9uIHN0cmVhbSBkYXRhLg0KCSAqDQoJICogQHZhciBzdHJpbmcNCgkgKi8NCglwcml2YXRlICRfc3VtbWFyeUluZm9ybWF0aW9uOw0KDQoJLyoqDQoJICogRXh0ZW5kZWQgU3VtbWFyeSBJbmZvcm1hdGlvbiBzdHJlYW0gZGF0YS4NCgkgKg0KCSAqIEB2YXIgc3RyaW5nDQoJICovDQoJcHJpdmF0ZSAkX2RvY3VtZW50U3VtbWFyeUluZm9ybWF0aW9uOw0KDQoJLyoqDQoJICogVXNlci1EZWZpbmVkIFByb3BlcnRpZXMgc3RyZWFtIGRhdGEuDQoJICoNCgkgKiBAdmFyIHN0cmluZw0KCSAqLw0KCXByaXZhdGUgJF91c2VyRGVmaW5lZFByb3BlcnRpZXM7DQoNCgkvKioNCgkgKiBXb3JrYm9vayBzdHJlYW0gZGF0YS4gKEluY2x1ZGVzIHdvcmtib29rIGdsb2JhbHMgc3Vic3RyZWFtIGFzIHdlbGwgYXMgc2hlZXQgc3Vic3RyZWFtcykNCgkgKg0KCSAqIEB2YXIgc3RyaW5nDQoJICovDQoJcHJpdmF0ZSAkX2RhdGE7DQoNCgkvKioNCgkgKiBTaXplIGluIGJ5dGVzIG9mICR0aGlzLT5fZGF0YQ0KCSAqDQoJICogQHZhciBpbnQNCgkgKi8NCglwcml2YXRlICRfZGF0YVNpemU7DQoNCgkvKioNCgkgKiBDdXJyZW50IHBvc2l0aW9uIGluIHN0cmVhbQ0KCSAqDQoJICogQHZhciBpbnRlZ2VyDQoJICovDQoJcHJpdmF0ZSAkX3BvczsNCg0KCS8qKg0KCSAqIFdvcmtib29rIHRvIGJlIHJldHVybmVkIGJ5IHRoZSByZWFkZXIuDQoJICoNCgkgKiBAdmFyIFBIUEV4Y2VsDQoJICovDQoJcHJpdmF0ZSAkX3BocEV4Y2VsOw0KDQoJLyoqDQoJICogV29ya3NoZWV0IHRoYXQgaXMgY3VycmVudGx5IGJlaW5nIGJ1aWx0IGJ5IHRoZSByZWFkZXIuDQoJICoNCgkgKiBAdmFyIFBIUEV4Y2VsX1dvcmtzaGVldA0KCSAqLw0KCXByaXZhdGUgJF9waHBTaGVldDsNCg0KCS8qKg0KCSAqIEJJRkYgdmVyc2lvbg0KCSAqDQoJICogQHZhciBpbnQNCgkgKi8NCglwcml2YXRlICRfdmVyc2lvbjsNCg0KCS8qKg0KCSAqIENvZGVwYWdlIHNldCBpbiB0aGUgRXhjZWwgZmlsZSBiZWluZyByZWFkLiBPbmx5IGltcG9ydGFudCBmb3IgQklGRjUgKEV4Y2VsIDUuMCAtIEV4Y2VsIDk1KQ0KCSAqIEZvciBCSUZGOCAoRXhjZWwgOTcgLSBFeGNlbCAyMDAzKSB0aGlzIHdpbGwgYWx3YXlzIGhhdmUgdGhlIHZhbHVlICdVVEYtMTZMRScNCgkgKg0KCSAqIEB2YXIgc3RyaW5nDQoJICovDQoJcHJpdmF0ZSAkX2NvZGVwYWdlOw0KDQoJLyoqDQoJICogU2hhcmVkIGZvcm1hdHMNCgkgKg0KCSAqIEB2YXIgYXJyYXkNCgkgKi8NCglwcml2YXRlICRfZm9ybWF0czsNCg0KCS8qKg0KCSAqIFNoYXJlZCBmb250cw0KCSAqDQoJICogQHZhciBhcnJheQ0KCSAqLw0KCXByaXZhdGUgJF9vYmpGb250czsNCg0KCS8qKg0KCSAqIENvbG9yIHBhbGV0dGUNCgkgKg0KCSAqIEB2YXIgYXJyYXkNCgkgKi8NCglwcml2YXRlICRfcGFsZXR0ZTsNCg0KCS8qKg0KCSAqIFdvcmtzaGVldHMNCgkgKg0KCSAqIEB2YXIgYXJyYXkNCgkgKi8NCglwcml2YXRlICRfc2hlZXRzOw0KDQoJLyoqDQoJICogRXh0ZXJuYWwgYm9va3MNCgkgKg0KCSAqIEB2YXIgYXJyYXkNCgkgKi8NCglwcml2YXRlICRfZXh0ZXJuYWxCb29rczsNCg0KCS8qKg0KCSAqIFJFRiBzdHJ1Y3R1cmVzLiBPbmx5IGFwcGxpZXMgdG8gQklGRjguDQoJICoNCgkgKiBAdmFyIGFycmF5DQoJICovDQoJcHJpdmF0ZSAkX3JlZjsNCg0KCS8qKg0KCSAqIEV4dGVybmFsIG5hbWVzDQoJICoNCgkgKiBAdmFyIGFycmF5DQoJICovDQoJcHJpdmF0ZSAkX2V4dGVybmFsTmFtZXM7DQoNCgkvKioNCgkgKiBEZWZpbmVkIG5hbWVzDQoJICoNCgkgKiBAdmFyIGFycmF5DQoJICovDQoJcHJpdmF0ZSAkX2RlZmluZWRuYW1lOw0KDQoJLyoqDQoJICogU2hhcmVkIHN0cmluZ3MuIE9ubHkgYXBwbGllcyB0byBCSUZGOC4NCgkgKg0KCSAqIEB2YXIgYXJyYXkNCgkgKi8NCglwcml2YXRlICRfc3N0Ow0KDQoJLyoqDQoJICogUGFuZXMgYXJlIGZyb3plbj8gKGluIHNoZWV0IGN1cnJlbnRseSBiZWluZyByZWFkKS4gU2VlIFdJTkRPVzIgcmVjb3JkLg0KCSAqDQoJICogQHZhciBib29sZWFuDQoJICovDQoJcHJpdmF0ZSAkX2Zyb3plbjsNCg0KCS8qKg0KCSAqIEZpdCBwcmludG91dCB0byBudW1iZXIgb2YgcGFnZXM/IChpbiBzaGVldCBjdXJyZW50bHkgYmVpbmcgcmVhZCkuIFNlZSBTSEVFVFBSIHJlY29yZC4NCgkgKg0KCSAqIEB2YXIgYm9vbGVhbg0KCSAqLw0KCXByaXZhdGUgJF9pc0ZpdFRvUGFnZXM7DQoNCgkvKioNCgkgKiBPYmplY3RzLiBPbmUgT0JKIHJlY29yZCBjb250cmlidXRlcyB3aXRoIG9uZSBlbnRyeS4NCgkgKg0KCSAqIEB2YXIgYXJyYXkNCgkgKi8NCglwcml2YXRlICRfb2JqczsNCg0KCS8qKg0KCSAqIFRleHQgT2JqZWN0cy4gT25lIFRYTyByZWNvcmQgY29ycmVzcG9uZHMgd2l0aCBvbmUgZW50cnkuDQoJICoNCgkgKiBAdmFyIGFycmF5DQoJICovDQoJcHJpdmF0ZSAkX3RleHRPYmplY3RzOw0KDQoJLyoqDQoJICogQ2VsbCBBbm5vdGF0aW9ucyAoQklGRjgpDQoJICoNCgkgKiBAdmFyIGFycmF5DQoJICovDQoJcHJpdmF0ZSAkX2NlbGxOb3RlczsNCg0KCS8qKg0KCSAqIFRoZSBjb21iaW5lZCBNU09EUkFXSU5HR1JPVVAgZGF0YQ0KCSAqDQoJICogQHZhciBzdHJpbmcNCgkgKi8NCglwcml2YXRlICRfZHJhd2luZ0dyb3VwRGF0YTsNCg0KCS8qKg0KCSAqIFRoZSBjb21iaW5lZCBNU09EUkFXSU5HIGRhdGEgKHBlciBzaGVldCkNCgkgKg0KCSAqIEB2YXIgc3RyaW5nDQoJICovDQoJcHJpdmF0ZSAkX2RyYXdpbmdEYXRhOw0KDQoJLyoqDQoJICogS2VlcCB0cmFjayBvZiBYRiBpbmRleA0KCSAqDQoJICogQHZhciBpbnQNCgkgKi8NCglwcml2YXRlICRfeGZJbmRleDsNCg0KCS8qKg0KCSAqIE1hcHBpbmcgb2YgWEYgaW5kZXggKHRoYXQgaXMgYSBjZWxsIFhGKSB0byBmaW5hbCBpbmRleCBpbiBjZWxsWGYgY29sbGVjdGlvbg0KCSAqDQoJICogQHZhciBhcnJheQ0KCSAqLw0KCXByaXZhdGUgJF9tYXBDZWxsWGZJbmRleDsNCg0KCS8qKg0KCSAqIE1hcHBpbmcgb2YgWEYgaW5kZXggKHRoYXQgaXMgYSBzdHlsZSBYRikgdG8gZmluYWwgaW5kZXggaW4gY2VsbFN0eWxlWGYgY29sbGVjdGlvbg0KCSAqDQoJICogQHZhciBhcnJheQ0KCSAqLw0KCXByaXZhdGUgJF9tYXBDZWxsU3R5bGVYZkluZGV4Ow0KDQoJLyoqDQoJICogVGhlIHNoYXJlZCBmb3JtdWxhcyBpbiBhIHNoZWV0LiBPbmUgU0hBUkVERk1MQSByZWNvcmQgY29udHJpYnV0ZXMgd2l0aCBvbmUgdmFsdWUuDQoJICoNCgkgKiBAdmFyIGFycmF5DQoJICovDQoJcHJpdmF0ZSAkX3NoYXJlZEZvcm11bGFzOw0KDQoJLyoqDQoJICogVGhlIHNoYXJlZCBmb3JtdWxhIHBhcnRzIGluIGEgc2hlZXQuIE9uZSBGT1JNVUxBIHJlY29yZCBjb250cmlidXRlcyB3aXRoIG9uZSB2YWx1ZSBpZiBpdA0KCSAqIHJlZmVycyB0byBhIHNoYXJlZCBmb3JtdWxhLg0KCSAqDQoJICogQHZhciBhcnJheQ0KCSAqLw0KCXByaXZhdGUgJF9zaGFyZWRGb3JtdWxhUGFydHM7DQoNCg0KCS8qKg0KCSAqIENyZWF0ZSBhIG5ldyBQSFBFeGNlbF9SZWFkZXJfRXhjZWw1IGluc3RhbmNlDQoJICovDQoJcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCkgew0KCQkkdGhpcy0+X3JlYWRGaWx0ZXIgPSBuZXcgUEhQRXhjZWxfUmVhZGVyX0RlZmF1bHRSZWFkRmlsdGVyKCk7DQoJfQ0KDQoNCgkvKioNCgkgKiBSZWFkIGRhdGEgb25seT8NCgkgKgkJSWYgdGhpcyBpcyB0cnVlLCB0aGVuIHRoZSBSZWFkZXIgd2lsbCBvbmx5IHJlYWQgZGF0YSB2YWx1ZXMgZm9yIGNlbGxzLCBpdCB3aWxsIG5vdCByZWFkIGFueSBmb3JtYXR0aW5nIGluZm9ybWF0aW9uLg0KCSAqCQlJZiBmYWxzZSAodGhlIGRlZmF1bHQpIGl0IHdpbGwgcmVhZCBkYXRhIGFuZCBmb3JtYXR0aW5nLg0KCSAqDQoJICogQHJldHVybglib29sZWFuDQoJICovDQoJcHVibGljIGZ1bmN0aW9uIGdldFJlYWREYXRhT25seSgpDQoJew0KCQlyZXR1cm4gJHRoaXMtPl9yZWFkRGF0YU9ubHk7DQoJfQ0KDQoNCgkvKioNCgkgKiBTZXQgcmVhZCBkYXRhIG9ubHkNCgkgKgkJU2V0IHRvIHRydWUsIHRvIGFkdmlzZSB0aGUgUmVhZGVyIG9ubHkgdG8gcmVhZCBkYXRhIHZhbHVlcyBmb3IgY2VsbHMsIGFuZCB0byBpZ25vcmUgYW55IGZvcm1hdHRpbmcgaW5mb3JtYXRpb24uDQoJICoJCVNldCB0byBmYWxzZSAodGhlIGRlZmF1bHQpIHRvIGFkdmlzZSB0aGUgUmVhZGVyIHRvIHJlYWQgYm90aCBkYXRhIGFuZCBmb3JtYXR0aW5nIGZvciBjZWxscy4NCgkgKg0KCSAqIEBwYXJhbQlib29sZWFuCSRwVmFsdWUNCgkgKg0KCSAqIEByZXR1cm4JUEhQRXhjZWxfUmVhZGVyX0V4Y2VsNQ0KCSAqLw0KCXB1YmxpYyBmdW5jdGlvbiBzZXRSZWFkRGF0YU9ubHkoJHBWYWx1ZSA9IGZhbHNlKQ0KCXsNCgkJJHRoaXMtPl9yZWFkRGF0YU9ubHkgPSAkcFZhbHVlOw0KCQlyZXR1cm4gJHRoaXM7DQoJfQ0KDQoNCgkvKioNCgkgKiBHZXQgd2hpY2ggc2hlZXRzIHRvIGxvYWQNCgkgKgkJUmV0dXJucyBlaXRoZXIgYW4gYXJyYXkgb2Ygd29ya3NoZWV0IG5hbWVzICh0aGUgbGlzdCBvZiB3b3Jrc2hlZXRzIHRoYXQgc2hvdWxkIGJlIGxvYWRlZCksIG9yIGEgbnVsbA0KCSAqCQkJaW5kaWNhdGluZyB0aGF0IGFsbCB3b3Jrc2hlZXRzIGluIHRoZSB3b3JrYm9vayBzaG91bGQgYmUgbG9hZGVkLg0KCSAqDQoJICogQHJldHVybiBtaXhlZA0KCSAqLw0KCXB1YmxpYyBmdW5jdGlvbiBnZXRMb2FkU2hlZXRzT25seSgpDQoJew0KCQlyZXR1cm4gJHRoaXMtPl9sb2FkU2hlZXRzT25seTsNCgl9DQoNCg0KCS8qKg0KCSAqIFNldCB3aGljaCBzaGVldHMgdG8gbG9hZA0KCSAqDQoJICogQHBhcmFtIG1peGVkICR2YWx1ZQ0KCSAqCQlUaGlzIHNob3VsZCBiZSBlaXRoZXIgYW4gYXJyYXkgb2Ygd29ya3NoZWV0IG5hbWVzIHRvIGJlIGxvYWRlZCwgb3IgYSBzdHJpbmcgY29udGFpbmluZyBhIHNpbmdsZSB3b3Jrc2hlZXQgbmFtZS4NCgkgKgkJSWYgTlVMTCwgdGhlbiBpdCB0ZWxscyB0aGUgUmVhZGVyIHRvIHJlYWQgYWxsIHdvcmtzaGVldHMgaW4gdGhlIHdvcmtib29rDQoJICoNCgkgKiBAcmV0dXJuIFBIUEV4Y2VsX1JlYWRlcl9FeGNlbDUNCgkgKi8NCglwdWJsaWMgZnVuY3Rpb24gc2V0TG9hZFNoZWV0c09ubHkoJHZhbHVlID0gbnVsbCkNCgl7DQoJCSR0aGlzLT5fbG9hZFNoZWV0c09ubHkgPSBpc19hcnJheSgkdmFsdWUpID8NCgkJCSR2YWx1ZSA6IGFycmF5KCR2YWx1ZSk7DQoJCXJldHVybiAkdGhpczsNCgl9DQoNCg0KCS8qKg0KCSAqIFNldCBhbGwgc2hlZXRzIHRvIGxvYWQNCgkgKgkJVGVsbHMgdGhlIFJlYWRlciB0byBsb2FkIGFsbCB3b3Jrc2hlZXRzIGZyb20gdGhlIHdvcmtib29rLg0KCSAqDQoJICogQHJldHVybglQSFBFeGNlbF9SZWFkZXJfRXhjZWw1DQoJICovDQoJcHVibGljIGZ1bmN0aW9uIHNldExvYWRBbGxTaGVldHMoKQ0KCXsNCgkJJHRoaXMtPl9sb2FkU2hlZXRzT25seSA9IG51bGw7DQoJCXJldHVybiAkdGhpczsNCgl9DQoNCg0KCS8qKg0KCSAqIFJlYWQgZmlsdGVyDQoJICoNCgkgKiBAcmV0dXJuIFBIUEV4Y2VsX1JlYWRlcl9JUmVhZEZpbHRlcg0KCSAqLw0KCXB1YmxpYyBmdW5jdGlvbiBnZXRSZWFkRmlsdGVyKCkgew0KCQlyZXR1cm4gJHRoaXMtPl9yZWFkRmlsdGVyOw0KCX0NCg0KDQoJLyoqDQoJICogU2V0IHJlYWQgZmlsdGVyDQoJICoNCgkgKiBAcGFyYW0gUEhQRXhjZWxfUmVhZGVyX0lSZWFkRmlsdGVyICRwVmFsdWUNCgkgKiBAcmV0dXJuIFBIUEV4Y2VsX1JlYWRlcl9FeGNlbDUNCgkgKi8NCglwdWJsaWMgZnVuY3Rpb24gc2V0UmVhZEZpbHRlcihQSFBFeGNlbF9SZWFkZXJfSVJlYWRGaWx0ZXIgJHBWYWx1ZSkgew0KCQkkdGhpcy0+X3JlYWRGaWx0ZXIgPSAkcFZhbHVlOw0KCQlyZXR1cm4gJHRoaXM7DQoJfQ0KDQoNCgkvKioNCgkgKiBDYW4gdGhlIGN1cnJlbnQgUEhQRXhjZWxfUmVhZGVyX0lSZWFkZXIgcmVhZCB0aGUgZmlsZT8NCgkgKg0KCSAqIEBwYXJhbSAJc3RyaW5nIAkJJHBGaWxlTmFtZQ0KCSAqIEByZXR1cm4gCWJvb2xlYW4NCgkgKiBAdGhyb3dzIEV4Y2VwdGlvbg0KCSAqLw0KCXB1YmxpYyBmdW5jdGlvbiBjYW5SZWFkKCRwRmlsZW5hbWUpDQoJew0KCQkvLyBDaGVjayBpZiBmaWxlIGV4aXN0cw0KCQlpZiAoIWZpbGVfZXhpc3RzKCRwRmlsZW5hbWUpKSB7DQoJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCJDb3VsZCBub3Qgb3BlbiAiIC4gJHBGaWxlbmFtZSAuICIgZm9yIHJlYWRpbmchIEZpbGUgZG9lcyBub3QgZXhpc3QuIik7DQoJCX0NCg0KCQl0cnkgew0KCQkJLy8gVXNlIFBhcnNlWEwgZm9yIHRoZSBoYXJkIHdvcmsuDQoJCQkkb2xlID0gbmV3IFBIUEV4Y2VsX1NoYXJlZF9PTEVSZWFkKCk7DQoNCgkJCS8vIGdldCBleGNlbCBkYXRhDQoJCQkkcmVzID0gJG9sZS0+cmVhZCgkcEZpbGVuYW1lKTsNCgkJCXJldHVybiB0cnVlOw0KDQoJCX0gY2F0Y2ggKEV4Y2VwdGlvbiAkZSkgew0KCQkJcmV0dXJuIGZhbHNlOw0KCQl9DQoJfQ0KDQoNCgkvKioNCgkgKiBSZWFkcyBuYW1lcyBvZiB0aGUgd29ya3NoZWV0cyBmcm9tIGEgZmlsZSwgd2l0aG91dCBwYXJzaW5nIHRoZSB3aG9sZSBmaWxlIHRvIGEgUEhQRXhjZWwgb2JqZWN0DQoJICoNCgkgKiBAcGFyYW0gCXN0cmluZyAJCSRwRmlsZW5hbWUNCgkgKiBAdGhyb3dzIAlFeGNlcHRpb24NCgkgKi8NCglwdWJsaWMgZnVuY3Rpb24gbGlzdFdvcmtzaGVldE5hbWVzKCRwRmlsZW5hbWUpDQoJew0KCQkvLyBDaGVjayBpZiBmaWxlIGV4aXN0cw0KCQlpZiAoIWZpbGVfZXhpc3RzKCRwRmlsZW5hbWUpKSB7DQoJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCJDb3VsZCBub3Qgb3BlbiAiIC4gJHBGaWxlbmFtZSAuICIgZm9yIHJlYWRpbmchIEZpbGUgZG9lcyBub3QgZXhpc3QuIik7DQoJCX0NCg0KCQkkd29ya3NoZWV0TmFtZXMgPSBhcnJheSgpOw0KDQoJCS8vIFJlYWQgdGhlIE9MRSBmaWxlDQoJCSR0aGlzLT5fbG9hZE9MRSgkcEZpbGVuYW1lKTsNCg0KCQkvLyB0b3RhbCBieXRlIHNpemUgb2YgRXhjZWwgZGF0YSAod29ya2Jvb2sgZ2xvYmFsIHN1YnN0cmVhbSArIHNoZWV0IHN1YnN0cmVhbXMpDQoJCSR0aGlzLT5fZGF0YVNpemUgPSBzdHJsZW4oJHRoaXMtPl9kYXRhKTsNCg0KCQkkdGhpcy0+X3BvcwkJPSAwOw0KCQkkdGhpcy0+X3NoZWV0cwk9IGFycmF5KCk7DQoNCgkJLy8gUGFyc2UgV29ya2Jvb2sgR2xvYmFsIFN1YnN0cmVhbQ0KCQl3aGlsZSAoJHRoaXMtPl9wb3MgPCAkdGhpcy0+X2RhdGFTaXplKSB7DQoJCQkkY29kZSA9IHNlbGY6Ol9HZXRJbnQyZCgkdGhpcy0+X2RhdGEsICR0aGlzLT5fcG9zKTsNCg0KCQkJc3dpdGNoICgkY29kZSkgew0KCQkJCWNhc2Ugc2VsZjo6WExTX1R5cGVfQk9GOgkkdGhpcy0+X3JlYWRCb2YoKTsJCWJyZWFrOw0KCQkJCWNhc2Ugc2VsZjo6WExTX1R5cGVfU0hFRVQ6CSR0aGlzLT5fcmVhZFNoZWV0KCk7CWJyZWFrOw0KCQkJCWNhc2Ugc2VsZjo6WExTX1R5cGVfRU9GOgkkdGhpcy0+X3JlYWREZWZhdWx0KCk7CWJyZWFrIDI7DQoJCQkJZGVmYXVsdDoJCQkJCSR0aGlzLT5fcmVhZERlZmF1bHQoKTsJYnJlYWs7DQoJCQl9DQoJCX0NCg0KCQlmb3JlYWNoICgkdGhpcy0+X3NoZWV0cyBhcyAkc2hlZXQpIHsNCgkJCWlmICgkc2hlZXRbJ3NoZWV0VHlwZSddICE9IDB4MDApIHsNCgkJCQkvLyAweDAwOiBXb3Jrc2hlZXQsIDB4MDI6IENoYXJ0LCAweDA2OiBWaXN1YWwgQmFzaWMgbW9kdWxlDQoJCQkJY29udGludWU7DQoJCQl9DQoNCgkJCSR3b3Jrc2hlZXROYW1lc1tdID0gJHNoZWV0WyduYW1lJ107DQoJCX0NCg0KCQlyZXR1cm4gJHdvcmtzaGVldE5hbWVzOw0KCX0NCg0KDQoJLyoqDQoJICogUmV0dXJuIHdvcmtzaGVldCBpbmZvIChOYW1lLCBMYXN0IENvbHVtbiBMZXR0ZXIsIExhc3QgQ29sdW1uIEluZGV4LCBUb3RhbCBSb3dzLCBUb3RhbCBDb2x1bW5zKQ0KCSAqDQoJICogQHBhcmFtICAgc3RyaW5nICAgICAkcEZpbGVuYW1lDQoJICogQHRocm93cyAgIEV4Y2VwdGlvbg0KCSAqLw0KCXB1YmxpYyBmdW5jdGlvbiBsaXN0V29ya3NoZWV0SW5mbygkcEZpbGVuYW1lKQ0KCXsNCgkJLy8gQ2hlY2sgaWYgZmlsZSBleGlzdHMNCgkJaWYgKCFmaWxlX2V4aXN0cygkcEZpbGVuYW1lKSkgew0KCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbigiQ291bGQgbm90IG9wZW4gIiAuICRwRmlsZW5hbWUgLiAiIGZvciByZWFkaW5nISBGaWxlIGRvZXMgbm90IGV4aXN0LiIpOw0KCQl9DQoNCgkJJHdvcmtzaGVldEluZm8gPSBhcnJheSgpOw0KDQoJCS8vIFJlYWQgdGhlIE9MRSBmaWxlDQoJCSR0aGlzLT5fbG9hZE9MRSgkcEZpbGVuYW1lKTsNCg0KCQkvLyB0b3RhbCBieXRlIHNpemUgb2YgRXhjZWwgZGF0YSAod29ya2Jvb2sgZ2xvYmFsIHN1YnN0cmVhbSArIHNoZWV0IHN1YnN0cmVhbXMpDQoJCSR0aGlzLT5fZGF0YVNpemUgPSBzdHJsZW4oJHRoaXMtPl9kYXRhKTsNCg0KCQkvLyBpbml0aWFsaXplDQoJCSR0aGlzLT5fcG9zICAgID0gMDsNCgkJJHRoaXMtPl9zaGVldHMgPSBhcnJheSgpOw0KDQoJCS8vIFBhcnNlIFdvcmtib29rIEdsb2JhbCBTdWJzdHJlYW0NCgkJd2hpbGUgKCR0aGlzLT5fcG9zIDwgJHRoaXMtPl9kYXRhU2l6ZSkgew0KCQkJJGNvZGUgPSBzZWxmOjpfR2V0SW50MmQoJHRoaXMtPl9kYXRhLCAkdGhpcy0+X3Bvcyk7DQoNCgkJCXN3aXRjaCAoJGNvZGUpIHsNCgkJCQljYXNlIHNlbGY6OlhMU19UeXBlX0JPRjogICAgICAgICR0aGlzLT5fcmVhZEJvZigpOyAgICAgICAgYnJlYWs7DQoJCQkJY2FzZSBzZWxmOjpYTFNfVHlwZV9TSEVFVDogICAgICAkdGhpcy0+X3JlYWRTaGVldCgpOyAgICAgIGJyZWFrOw0KCQkJCWNhc2Ugc2VsZjo6WExTX1R5cGVfRU9GOiAgICAgICAgJHRoaXMtPl9yZWFkRGVmYXVsdCgpOyAgICBicmVhayAyOw0KCQkJCWRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPl9yZWFkRGVmYXVsdCgpOyAgICBicmVhazsNCgkJCX0NCgkJfQ0KDQoJCS8vIFBhcnNlIHRoZSBpbmRpdmlkdWFsIHNoZWV0cw0KCQlmb3JlYWNoICgkdGhpcy0+X3NoZWV0cyBhcyAkc2hlZXQpIHsNCg0KCQkJaWYgKCRzaGVldFsnc2hlZXRUeXBlJ10gIT0gMHgwMCkgew0KCQkJCS8vIDB4MDA6IFdvcmtzaGVldA0KCQkJCS8vIDB4MDI6IENoYXJ0DQoJCQkJLy8gMHgwNjogVmlzdWFsIEJhc2ljIG1vZHVsZQ0KCQkJCWNvbnRpbnVlOw0KCQkJfQ0KDQoJCQkkdG1wSW5mbyA9IGFycmF5KCk7DQoJCQkkdG1wSW5mb1snd29ya3NoZWV0TmFtZSddID0gJHNoZWV0WyduYW1lJ107DQoJCQkkdG1wSW5mb1snbGFzdENvbHVtbkxldHRlciddID0gJ0EnOw0KCQkJJHRtcEluZm9bJ2xhc3RDb2x1bW5JbmRleCddID0gMDsNCgkJCSR0bXBJbmZvWyd0b3RhbFJvd3MnXSA9IDA7DQoJCQkkdG1wSW5mb1sndG90YWxDb2x1bW5zJ10gPSAwOw0KDQoJCQkkdGhpcy0+X3BvcyA9ICRzaGVldFsnb2Zmc2V0J107DQoNCgkJCXdoaWxlICgkdGhpcy0+X3BvcyA8PSAkdGhpcy0+X2RhdGFTaXplIC0gNCkgew0KCQkJCSRjb2RlID0gc2VsZjo6X0dldEludDJkKCR0aGlzLT5fZGF0YSwgJHRoaXMtPl9wb3MpOw0KDQoJCQkJc3dpdGNoICgkY29kZSkgew0KCQkJCQljYXNlIHNlbGY6OlhMU19UeXBlX1JLOg0KCQkJCQljYXNlIHNlbGY6OlhMU19UeXBlX0xBQkVMU1NUOg0KCQkJCQljYXNlIHNlbGY6OlhMU19UeXBlX05VTUJFUjoNCgkJCQkJY2FzZSBzZWxmOjpYTFNfVHlwZV9GT1JNVUxBOg0KCQkJCQljYXNlIHNlbGY6OlhMU19UeXBlX0JPT0xFUlI6DQoJCQkJCWNhc2Ugc2VsZjo6WExTX1R5cGVfTEFCRUw6DQoJCQkJCQkkbGVuZ3RoID0gc2VsZjo6X0dldEludDJkKCR0aGlzLT5fZGF0YSwgJHRoaXMtPl9wb3MgKyAyKTsNCgkJCQkJCSRyZWNvcmREYXRhID0gc3Vic3RyKCR0aGlzLT5fZGF0YSwgJHRoaXMtPl9wb3MgKyA0LCAkbGVuZ3RoKTsNCg0KCQkJCQkJLy8gbW92ZSBzdHJlYW0gcG9pbnRlciB0byBuZXh0IHJlY29yZA0KCQkJCQkJJHRoaXMtPl9wb3MgKz0gNCArICRsZW5ndGg7DQoNCgkJCQkJCSRyb3dJbmRleCA9IHNlbGY6Ol9HZXRJbnQyZCgkcmVjb3JkRGF0YSwgMCkgKyAxOw0KCQkJCQkJJGNvbHVtbkluZGV4ID0gc2VsZjo6X0dldEludDJkKCRyZWNvcmREYXRhLCAyKTsNCg0KCQkJCQkJJHRtcEluZm9bJ3RvdGFsUm93cyddID0gbWF4KCR0bXBJbmZvWyd0b3RhbFJvd3MnXSwgJHJvd0luZGV4KTsNCgkJCQkJCSR0bXBJbmZvWydsYXN0Q29sdW1uSW5kZXgnXSA9IG1heCgkdG1wSW5mb1snbGFzdENvbHVtbkluZGV4J10sICRjb2x1bW5JbmRleCk7DQoJCQkJCQlicmVhazsNCgkJCQkJY2FzZSBzZWxmOjpYTFNfVHlwZV9CT0Y6ICAgICAgJHRoaXMtPl9yZWFkQm9mKCk7ICAgICAgICAgIGJyZWFrOw0KCQkJCQljYXNlIHNlbGY6OlhMU19UeXBlX0VPRjogICAgICAkdGhpcy0+X3JlYWREZWZhdWx0KCk7ICAgICAgYnJlYWsgMjsNCgkJCQkJZGVmYXVsdDogICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPl9yZWFkRGVmYXVsdCgpOyAgICAgIGJyZWFrOw0KCQkJCX0NCgkJCX0NCg0KCQkJJHRtcEluZm9bJ2xhc3RDb2x1bW5MZXR0ZXInXSA9IFBIUEV4Y2VsX0NlbGw6OnN0cmluZ0Zyb21Db2x1bW5JbmRleCgkdG1wSW5mb1snbGFzdENvbHVtbkluZGV4J10pOw0KCQkJJHRtcEluZm9bJ3RvdGFsQ29sdW1ucyddID0gJHRtcEluZm9bJ2xhc3RDb2x1bW5JbmRleCddICsgMTsNCg0KCQkJJHdvcmtzaGVldEluZm9bXSA9ICR0bXBJbmZvOw0KCQl9DQoNCgkJcmV0dXJuICR3b3Jrc2hlZXRJbmZvOw0KCX0NCg0KDQoJLyoqDQoJICogTG9hZHMgUEhQRXhjZWwgZnJvbSBmaWxlDQoJICoNCgkgKiBAcGFyYW0gCXN0cmluZyAJCSRwRmlsZW5hbWUNCgkgKiBAcmV0dXJuIAlQSFBFeGNlbA0KCSAqIEB0aHJvd3MgCUV4Y2VwdGlvbg0KCSAqLw0KCXB1YmxpYyBmdW5jdGlvbiBsb2FkKCRwRmlsZW5hbWUpDQoJew0KCQkvLyBSZWFkIHRoZSBPTEUgZmlsZQ0KCQkkdGhpcy0+X2xvYWRPTEUoJHBGaWxlbmFtZSk7DQoNCgkJLy8gSW5pdGlhbGlzYXRpb25zDQoJCSR0aGlzLT5fcGhwRXhjZWwgPSBuZXcgUEhQRXhjZWw7DQoJCSR0aGlzLT5fcGhwRXhjZWwtPnJlbW92ZVNoZWV0QnlJbmRleCgwKTsgLy8gcmVtb3ZlIDFzdCBzaGVldA0KCQlpZiAoISR0aGlzLT5fcmVhZERhdGFPbmx5KSB7DQoJCQkkdGhpcy0+X3BocEV4Y2VsLT5yZW1vdmVDZWxsU3R5bGVYZkJ5SW5kZXgoMCk7IC8vIHJlbW92ZSB0aGUgZGVmYXVsdCBzdHlsZQ0KCQkJJHRoaXMtPl9waHBFeGNlbC0+cmVtb3ZlQ2VsbFhmQnlJbmRleCgwKTsgLy8gcmVtb3ZlIHRoZSBkZWZhdWx0IHN0eWxlDQoJCX0NCg0KCQkvLyBSZWFkIHRoZSBzdW1tYXJ5IGluZm9ybWF0aW9uIHN0cmVhbSAoY29udGFpbmluZyBtZXRhIGRhdGEpDQoJCSR0aGlzLT5fcmVhZFN1bW1hcnlJbmZvcm1hdGlvbigpOw0KDQoJCS8vIFJlYWQgdGhlIEFkZGl0aW9uYWwgZG9jdW1lbnQgc3VtbWFyeSBpbmZvcm1hdGlvbiBzdHJlYW0gKGNvbnRhaW5pbmcgYXBwbGljYXRpb24tc3BlY2lmaWMgbWV0YSBkYXRhKQ0KCQkkdGhpcy0+X3JlYWREb2N1bWVudFN1bW1hcnlJbmZvcm1hdGlvbigpOw0KDQoJCS8vIHRvdGFsIGJ5dGUgc2l6ZSBvZiBFeGNlbCBkYXRhICh3b3JrYm9vayBnbG9iYWwgc3Vic3RyZWFtICsgc2hlZXQgc3Vic3RyZWFtcykNCgkJJHRoaXMtPl9kYXRhU2l6ZSA9IHN0cmxlbigkdGhpcy0+X2RhdGEpOw0KDQoJCS8vIGluaXRpYWxpemUNCgkJJHRoaXMtPl9wb3MJCQkJCT0gMDsNCgkJJHRoaXMtPl9jb2RlcGFnZQkJCT0gJ0NQMTI1Mic7DQoJCSR0aGlzLT5fZm9ybWF0cwkJCQk9IGFycmF5KCk7DQoJCSR0aGlzLT5fb2JqRm9udHMJCQk9IGFycmF5KCk7DQoJCSR0aGlzLT5fcGFsZXR0ZQkJCQk9IGFycmF5KCk7DQoJCSR0aGlzLT5fc2hlZXRzCQkJCT0gYXJyYXkoKTsNCgkJJHRoaXMtPl9leHRlcm5hbEJvb2tzCQk9IGFycmF5KCk7DQoJCSR0aGlzLT5fcmVmCQkJCQk9IGFycmF5KCk7DQoJCSR0aGlzLT5fZGVmaW5lZG5hbWUJCQk9IGFycmF5KCk7DQoJCSR0aGlzLT5fc3N0CQkJCQk9IGFycmF5KCk7DQoJCSR0aGlzLT5fZHJhd2luZ0dyb3VwRGF0YQk9ICcnOw0KCQkkdGhpcy0+X3hmSW5kZXgJCQkJPSAnJzsNCgkJJHRoaXMtPl9tYXBDZWxsWGZJbmRleAkJPSBhcnJheSgpOw0KCQkkdGhpcy0+X21hcENlbGxTdHlsZVhmSW5kZXgJPSBhcnJheSgpOw0KDQoJCS8vIFBhcnNlIFdvcmtib29rIEdsb2JhbCBTdWJzdHJlYW0NCgkJd2hpbGUgKCR0aGlzLT5fcG9zIDwgJHRoaXMtPl9kYXRhU2l6ZSkgew0KCQkJJGNvZGUgPSBzZWxmOjpfR2V0SW50MmQoJHRoaXMtPl9kYXRhLCAkdGhpcy0+X3Bvcyk7DQoNCgkJCXN3aXRjaCAoJGNvZGUpIHsNCgkJCQljYXNlIHNlbGY6OlhMU19UeXBlX0JPRjoJCQkkdGhpcy0+X3JlYWRCb2YoKTsJCQkJYnJlYWs7DQoJCQkJY2FzZSBzZWxmOjpYTFNfVHlwZV9GSUxFUEFTUzoJCSR0aGlzLT5fcmVhZEZpbGVwYXNzKCk7CQkJYnJlYWs7DQoJCQkJY2FzZSBzZWxmOjpYTFNfVHlwZV9DT0RFUEFHRToJCSR0aGlzLT5fcmVhZENvZGVwYWdlKCk7CQkJYnJlYWs7DQoJCQkJY2FzZSBzZWxmOjpYTFNfVHlwZV9EQVRFTU9ERToJCSR0aGlzLT5fcmVhZERhdGVNb2RlKCk7CQkJYnJlYWs7DQoJCQkJY2FzZSBzZWxmOjpYTFNfVHlwZV9GT05UOgkJCSR0aGlzLT5fcmVhZEZvbnQoKTsJCQkJYnJlYWs7DQoJCQkJY2FzZSBzZWxmOjpYTFNfVHlwZV9GT1JNQVQ6CQkJJHRoaXMtPl9yZWFkRm9ybWF0KCk7CQkJYnJlYWs7DQoJCQkJY2FzZSBzZWxmOjpYTFNfVHlwZV9YRjoJCQkJJHRoaXMtPl9yZWFkWGYoKTsJCQkJYnJlYWs7DQoJCQkJY2FzZSBzZWxmOjpYTFNfVHlwZV9YRkVYVDoJCQkkdGhpcy0+X3JlYWRYZkV4dCgpOwkJCWJyZWFrOw0KCQkJCWNhc2Ugc2VsZjo6WExTX1R5cGVfU1RZTEU6CQkJJHRoaXMtPl9yZWFkU3R5bGUoKTsJCQlicmVhazsNCgkJCQljYXNlIHNlbGY6OlhMU19UeXBlX1BBTEVUVEU6CQkkdGhpcy0+X3JlYWRQYWxldHRlKCk7CQkJYnJlYWs7DQoJCQkJY2FzZSBzZWxmOjpYTFNfVHlwZV9TSEVFVDoJCQkkdGhpcy0+X3JlYWRTaGVldCgpOwkJCWJyZWFrOw0KCQkJCWNhc2Ugc2VsZjo6WExTX1R5cGVfRVhURVJOQUxCT09LOgkkdGhpcy0+X3JlYWRFeHRlcm5hbEJvb2soKTsJCWJyZWFrOw0KCQkJCWNhc2Ugc2VsZjo6WExTX1R5cGVfRVhURVJOTkFNRToJCSR0aGlzLT5fcmVhZEV4dGVybk5hbWUoKTsJCWJyZWFrOw0KCQkJCWNhc2Ugc2VsZjo6WExTX1R5cGVfRVhURVJOU0hFRVQ6CSR0aGlzLT5fcmVhZEV4dGVyblNoZWV0KCk7CQlicmVhazsNCgkJCQljYXNlIHNlbGY6OlhMU19UeXBlX0RFRklORUROQU1FOgkkdGhpcy0+X3JlYWREZWZpbmVkTmFtZSgpOwkJYnJlYWs7DQoJCQkJY2FzZSBzZWxmOjpYTFNfVHlwZV9NU09EUkFXSU5HR1JPVVA6CSR0aGlzLT5fcmVhZE1zb0RyYXdpbmdHcm91cCgpOwlicmVhazsNCgkJCQljYXNlIHNlbGY6OlhMU19UeXBlX1NTVDoJCQkkdGhpcy0+X3JlYWRTc3QoKTsJCQkJYnJlYWs7DQoJCQkJY2FzZSBzZWxmOjpYTFNfVHlwZV9FT0Y6CQkJJHRoaXMtPl9yZWFkRGVmYXVsdCgpOwkJCWJyZWFrIDI7DQoJCQkJZGVmYXVsdDoJCQkJCQkJJHRoaXMtPl9yZWFkRGVmYXVsdCgpOwkJCWJyZWFrOw0KCQkJfQ0KCQl9DQoNCgkJLy8gUmVzb2x2ZSBpbmRleGVkIGNvbG9ycyBmb3IgZm9udCwgZmlsbCwgYW5kIGJvcmRlciBjb2xvcnMNCgkJLy8gQ2Fubm90IGJlIHJlc29sdmVkIGFscmVhZHkgaW4gWEYgcmVjb3JkLCBiZWNhdXNlIFBBTEVUVEUgcmVjb3JkIGNvbWVzIGFmdGVyd2FyZHMNCgkJaWYgKCEkdGhpcy0+X3JlYWREYXRhT25seSkgew0KCQkJZm9yZWFjaCAoJHRoaXMtPl9vYmpGb250cyBhcyAkb2JqRm9udCkgew0KCQkJCWlmIChpc3NldCgkb2JqRm9udC0+Y29sb3JJbmRleCkpIHsNCgkJCQkJJGNvbG9yID0gc2VsZjo6X3JlYWRDb2xvcigkb2JqRm9udC0+Y29sb3JJbmRleCwkdGhpcy0+X3BhbGV0dGUsJHRoaXMtPl92ZXJzaW9uKTsNCgkJCQkJJG9iakZvbnQtPmdldENvbG9yKCktPnNldFJHQigkY29sb3JbJ3JnYiddKTsNCgkJCQl9DQoJCQl9DQoNCgkJCWZvcmVhY2ggKCR0aGlzLT5fcGhwRXhjZWwtPmdldENlbGxYZkNvbGxlY3Rpb24oKSBhcyAkb2JqU3R5bGUpIHsNCgkJCQkvLyBmaWxsIHN0YXJ0IGFuZCBlbmQgY29sb3INCgkJCQkkZmlsbCA9ICRvYmpTdHlsZS0+Z2V0RmlsbCgpOw0KDQoJCQkJaWYgKGlzc2V0KCRmaWxsLT5zdGFydGNvbG9ySW5kZXgpKSB7DQoJCQkJCSRzdGFydENvbG9yID0gc2VsZjo6X3JlYWRDb2xvcigkZmlsbC0+c3RhcnRjb2xvckluZGV4LCR0aGlzLT5fcGFsZXR0ZSwkdGhpcy0+X3ZlcnNpb24pOw0KCQkJCQkkZmlsbC0+Z2V0U3RhcnRDb2xvcigpLT5zZXRSR0IoJHN0YXJ0Q29sb3JbJ3JnYiddKTsNCgkJCQl9DQoNCgkJCQlpZiAoaXNzZXQoJGZpbGwtPmVuZGNvbG9ySW5kZXgpKSB7DQoJCQkJCSRlbmRDb2xvciA9IHNlbGY6Ol9yZWFkQ29sb3IoJGZpbGwtPmVuZGNvbG9ySW5kZXgsJHRoaXMtPl9wYWxldHRlLCR0aGlzLT5fdmVyc2lvbik7DQoJCQkJCSRmaWxsLT5nZXRFbmRDb2xvcigpLT5zZXRSR0IoJGVuZENvbG9yWydyZ2InXSk7DQoJCQkJfQ0KDQoJCQkJLy8gYm9yZGVyIGNvbG9ycw0KCQkJCSR0b3AgICAgICA9ICRvYmpTdHlsZS0+Z2V0Qm9yZGVycygpLT5nZXRUb3AoKTsNCgkJCQkkcmlnaHQgICAgPSAkb2JqU3R5bGUtPmdldEJvcmRlcnMoKS0+Z2V0UmlnaHQoKTsNCgkJCQkkYm90dG9tICAgPSAkb2JqU3R5bGUtPmdldEJvcmRlcnMoKS0+Z2V0Qm90dG9tKCk7DQoJCQkJJGxlZnQgICAgID0gJG9ialN0eWxlLT5nZXRCb3JkZXJzKCktPmdldExlZnQoKTsNCgkJCQkkZGlhZ29uYWwgPSAkb2JqU3R5bGUtPmdldEJvcmRlcnMoKS0+Z2V0RGlhZ29uYWwoKTsNCg0KCQkJCWlmIChpc3NldCgkdG9wLT5jb2xvckluZGV4KSkgew0KCQkJCQkkYm9yZGVyVG9wQ29sb3IgPSBzZWxmOjpfcmVhZENvbG9yKCR0b3AtPmNvbG9ySW5kZXgsJHRoaXMtPl9wYWxldHRlLCR0aGlzLT5fdmVyc2lvbik7DQoJCQkJCSR0b3AtPmdldENvbG9yKCktPnNldFJHQigkYm9yZGVyVG9wQ29sb3JbJ3JnYiddKTsNCgkJCQl9DQoNCgkJCQlpZiAoaXNzZXQoJHJpZ2h0LT5jb2xvckluZGV4KSkgew0KCQkJCQkkYm9yZGVyUmlnaHRDb2xvciA9IHNlbGY6Ol9yZWFkQ29sb3IoJHJpZ2h0LT5jb2xvckluZGV4LCR0aGlzLT5fcGFsZXR0ZSwkdGhpcy0+X3ZlcnNpb24pOw0KCQkJCQkkcmlnaHQtPmdldENvbG9yKCktPnNldFJHQigkYm9yZGVyUmlnaHRDb2xvclsncmdiJ10pOw0KCQkJCX0NCg0KCQkJCWlmIChpc3NldCgkYm90dG9tLT5jb2xvckluZGV4KSkgew0KCQkJCQkkYm9yZGVyQm90dG9tQ29sb3IgPSBzZWxmOjpfcmVhZENvbG9yKCRib3R0b20tPmNvbG9ySW5kZXgsJHRoaXMtPl9wYWxldHRlLCR0aGlzLT5fdmVyc2lvbik7DQoJCQkJCSRib3R0b20tPmdldENvbG9yKCktPnNldFJHQigkYm9yZGVyQm90dG9tQ29sb3JbJ3JnYiddKTsNCgkJCQl9DQoNCgkJCQlpZiAoaXNzZXQoJGxlZnQtPmNvbG9ySW5kZXgpKSB7DQoJCQkJCSRib3JkZXJMZWZ0Q29sb3IgPSBzZWxmOjpfcmVhZENvbG9yKCRsZWZ0LT5jb2xvckluZGV4LCR0aGlzLT5fcGFsZXR0ZSwkdGhpcy0+X3ZlcnNpb24pOw0KCQkJCQkkbGVmdC0+Z2V0Q29sb3IoKS0+c2V0UkdCKCRib3JkZXJMZWZ0Q29sb3JbJ3JnYiddKTsNCgkJCQl9DQoNCgkJCQlpZiAoaXNzZXQoJGRpYWdvbmFsLT5jb2xvckluZGV4KSkgew0KCQkJCQkkYm9yZGVyRGlhZ29uYWxDb2xvciA9IHNlbGY6Ol9yZWFkQ29sb3IoJGRpYWdvbmFsLT5jb2xvckluZGV4LCR0aGlzLT5fcGFsZXR0ZSwkdGhpcy0+X3ZlcnNpb24pOw0KCQkJCQkkZGlhZ29uYWwtPmdldENvbG9yKCktPnNldFJHQigkYm9yZGVyRGlhZ29uYWxDb2xvclsncmdiJ10pOw0KCQkJCX0NCgkJCX0NCgkJfQ0KDQoJCS8vIHRyZWF0IE1TT0RSQVdJTkdHUk9VUCByZWNvcmRzLCB3b3JrYm9vay1sZXZlbCBFc2NoZXINCgkJaWYgKCEkdGhpcy0+X3JlYWREYXRhT25seSAmJiAkdGhpcy0+X2RyYXdpbmdHcm91cERhdGEpIHsNCgkJCSRlc2NoZXJXb3JrYm9vayA9IG5ldyBQSFBFeGNlbF9TaGFyZWRfRXNjaGVyKCk7DQoJCQkkcmVhZGVyID0gbmV3IFBIUEV4Y2VsX1JlYWRlcl9FeGNlbDVfRXNjaGVyKCRlc2NoZXJXb3JrYm9vayk7DQoJCQkkZXNjaGVyV29ya2Jvb2sgPSAkcmVhZGVyLT5sb2FkKCR0aGlzLT5fZHJhd2luZ0dyb3VwRGF0YSk7DQoNCgkJCS8vIGRlYnVnIEVzY2hlciBzdHJlYW0NCgkJCS8vJGRlYnVnID0gbmV3IERlYnVnX0VzY2hlcihuZXcgUEhQRXhjZWxfU2hhcmVkX0VzY2hlcigpKTsNCgkJCS8vJGRlYnVnLT5sb2FkKCR0aGlzLT5fZHJhd2luZ0dyb3VwRGF0YSk7DQoJCX0NCg0KCQkvLyBQYXJzZSB0aGUgaW5kaXZpZHVhbCBzaGVldHMNCgkJZm9yZWFjaCAoJHRoaXMtPl9zaGVldHMgYXMgJHNoZWV0KSB7DQoNCgkJCWlmICgkc2hlZXRbJ3NoZWV0VHlwZSddICE9IDB4MDApIHsNCgkJCQkvLyAweDAwOiBXb3Jrc2hlZXQsIDB4MDI6IENoYXJ0LCAweDA2OiBWaXN1YWwgQmFzaWMgbW9kdWxlDQoJCQkJY29udGludWU7DQoJCQl9DQoNCgkJCS8vIGNoZWNrIGlmIHNoZWV0IHNob3VsZCBiZSBza2lwcGVkDQoJCQlpZiAoaXNzZXQoJHRoaXMtPl9sb2FkU2hlZXRzT25seSkgJiYgIWluX2FycmF5KCRzaGVldFsnbmFtZSddLCAkdGhpcy0+X2xvYWRTaGVldHNPbmx5KSkgew0KCQkJCWNvbnRpbnVlOw0KCQkJfQ0KDQoJCQkvLyBhZGQgc2hlZXQgdG8gUEhQRXhjZWwgb2JqZWN0DQoJCQkkdGhpcy0+X3BocFNoZWV0ID0gJHRoaXMtPl9waHBFeGNlbC0+Y3JlYXRlU2hlZXQoKTsNCgkJCS8vCVVzZSBmYWxzZSBmb3IgJHVwZGF0ZUZvcm11bGFDZWxsUmVmZXJlbmNlcyB0byBwcmV2ZW50IGFkanVzdG1lbnQgb2Ygd29ya3NoZWV0IHJlZmVyZW5jZXMgaW4gZm9ybXVsYQ0KCQkJLy8JCWNlbGxzLi4uIGR1cmluZyB0aGUgbG9hZCwgYWxsIGZvcm11bGFlIHNob3VsZCBiZSBjb3JyZWN0LCBhbmQgd2UncmUgc2ltcGx5IGJyaW5naW5nIHRoZSB3b3Jrc2hlZXQNCgkJCS8vCQluYW1lIGluIGxpbmUgd2l0aCB0aGUgZm9ybXVsYSwgbm90IHRoZSByZXZlcnNlDQoJCQkkdGhpcy0+X3BocFNoZWV0LT5zZXRUaXRsZSgkc2hlZXRbJ25hbWUnXSxmYWxzZSk7DQoJCQkkdGhpcy0+X3BocFNoZWV0LT5zZXRTaGVldFN0YXRlKCRzaGVldFsnc2hlZXRTdGF0ZSddKTsNCg0KCQkJJHRoaXMtPl9wb3MgPSAkc2hlZXRbJ29mZnNldCddOw0KDQoJCQkvLyBJbml0aWFsaXplIGlzRml0VG9QYWdlcy4gTWF5IGNoYW5nZSBhZnRlciByZWFkaW5nIFNIRUVUUFIgcmVjb3JkLg0KCQkJJHRoaXMtPl9pc0ZpdFRvUGFnZXMgPSBmYWxzZTsNCg0KCQkJLy8gSW5pdGlhbGl6ZSBkcmF3aW5nRGF0YQ0KCQkJJHRoaXMtPl9kcmF3aW5nRGF0YSA9ICcnOw0KDQoJCQkvLyBJbml0aWFsaXplIG9ianMNCgkJCSR0aGlzLT5fb2JqcyA9IGFycmF5KCk7DQoNCgkJCS8vIEluaXRpYWxpemUgc2hhcmVkIGZvcm11bGEgcGFydHMNCgkJCSR0aGlzLT5fc2hhcmVkRm9ybXVsYVBhcnRzID0gYXJyYXkoKTsNCg0KCQkJLy8gSW5pdGlhbGl6ZSBzaGFyZWQgZm9ybXVsYXMNCgkJCSR0aGlzLT5fc2hhcmVkRm9ybXVsYXMgPSBhcnJheSgpOw0KDQoJCQkvLyBJbml0aWFsaXplIHRleHQgb2Jqcw0KCQkJJHRoaXMtPl90ZXh0T2JqZWN0cyA9IGFycmF5KCk7DQoNCgkJCS8vIEluaXRpYWxpemUgY2VsbCBhbm5vdGF0aW9ucw0KCQkJJHRoaXMtPl9jZWxsTm90ZXMgPSBhcnJheSgpOw0KCQkJJHRoaXMtPnRleHRPYmpSZWYgPSAtMTsNCg0KCQkJd2hpbGUgKCR0aGlzLT5fcG9zIDw9ICR0aGlzLT5fZGF0YVNpemUgLSA0KSB7DQoJCQkJJGNvZGUgPSBzZWxmOjpfR2V0SW50MmQoJHRoaXMtPl9kYXRhLCAkdGhpcy0+X3Bvcyk7DQoNCgkJCQlzd2l0Y2ggKCRjb2RlKSB7DQoJCQkJCWNhc2Ugc2VsZjo6WExTX1R5cGVfQk9GOgkJCQkJJHRoaXMtPl9yZWFkQm9mKCk7CQkJCQkJYnJlYWs7DQoJCQkJCWNhc2Ugc2VsZjo6WExTX1R5cGVfUFJJTlRHUklETElORVM6CQkJJHRoaXMtPl9yZWFkUHJpbnRHcmlkbGluZXMoKTsJCQlicmVhazsNCgkJCQkJY2FzZSBzZWxmOjpYTFNfVHlwZV9ERUZBVUxUUk9XSEVJR0hUOgkJJHRoaXMtPl9yZWFkRGVmYXVsdFJvd0hlaWdodCgpOwkJCWJyZWFrOw0KCQkJCQljYXNlIHNlbGY6OlhMU19UeXBlX1NIRUVUUFI6CQkJCSR0aGlzLT5fcmVhZFNoZWV0UHIoKTsJCQkJCWJyZWFrOw0KCQkJCQljYXNlIHNlbGY6OlhMU19UeXBlX0hPUklaT05UQUxQQUdFQlJFQUtTOgkkdGhpcy0+X3JlYWRIb3Jpem9udGFsUGFnZUJyZWFrcygpOwkJYnJlYWs7DQoJCQkJCWNhc2Ugc2VsZjo6WExTX1R5cGVfVkVSVElDQUxQQUdFQlJFQUtTOgkJJHRoaXMtPl9yZWFkVmVydGljYWxQYWdlQnJlYWtzKCk7CQlicmVhazsNCgkJCQkJY2FzZSBzZWxmOjpYTFNfVHlwZV9IRUFERVI6CQkJCQkkdGhpcy0+X3JlYWRIZWFkZXIoKTsJCQkJCWJyZWFrOw0KCQkJCQljYXNlIHNlbGY6OlhMU19UeXBlX0ZPT1RFUjoJCQkJCSR0aGlzLT5fcmVhZEZvb3RlcigpOwkJCQkJYnJlYWs7DQoJCQkJCWNhc2Ugc2VsZjo6WExTX1R5cGVfSENFTlRFUjoJCQkJJHRoaXMtPl9yZWFkSGNlbnRlcigpOwkJCQkJYnJlYWs7DQoJCQkJCWNhc2Ugc2VsZjo6WExTX1R5cGVfVkNFTlRFUjoJCQkJJHRoaXMtPl9yZWFkVmNlbnRlcigpOwkJCQkJYnJlYWs7DQoJCQkJCWNhc2Ugc2VsZjo6WExTX1R5cGVfTEVGVE1BUkdJTjoJCQkJJHRoaXMtPl9yZWFkTGVmdE1hcmdpbigpOwkJCQlicmVhazsNCgkJCQkJY2FzZSBzZWxmOjpYTFNfVHlwZV9SSUdIVE1BUkdJTjoJCQkkdGhpcy0+X3JlYWRSaWdodE1hcmdpbigpOwkJCQlicmVhazsNCgkJCQkJY2FzZSBzZWxmOjpYTFNfVHlwZV9UT1BNQVJHSU46CQkJCSR0aGlzLT5fcmVhZFRvcE1hcmdpbigpOwkJCQlicmVhazsNCgkJCQkJY2FzZSBzZWxmOjpYTFNfVHlwZV9CT1RUT01NQVJHSU46CQkJJHRoaXMtPl9yZWFkQm90dG9tTWFyZ2luKCk7CQkJCWJyZWFrOw0KCQkJCQljYXNlIHNlbGY6OlhMU19UeXBlX1BBR0VTRVRVUDoJCQkJJHRoaXMtPl9yZWFkUGFnZVNldHVwKCk7CQkJCWJyZWFrOw0KCQkJCQljYXNlIHNlbGY6OlhMU19UeXBlX1BST1RFQ1Q6CQkJCSR0aGlzLT5fcmVhZFByb3RlY3QoKTsJCQkJCWJyZWFrOw0KCQkJCQljYXNlIHNlbGY6OlhMU19UeXBlX1NDRU5QUk9URUNUOgkJCSR0aGlzLT5fcmVhZFNjZW5Qcm90ZWN0KCk7CQkJCWJyZWFrOw0KCQkJCQljYXNlIHNlbGY6OlhMU19UeXBlX09CSkVDVFBST1RFQ1Q6CQkJJHRoaXMtPl9yZWFkT2JqZWN0UHJvdGVjdCgpOwkJCWJyZWFrOw0KCQkJCQljYXNlIHNlbGY6OlhMU19UeXBlX1BBU1NXT1JEOgkJCQkkdGhpcy0+X3JlYWRQYXNzd29yZCgpOwkJCQkJYnJlYWs7DQoJCQkJCWNhc2Ugc2VsZjo6WExTX1R5cGVfREVGQ09MV0lEVEg6CQkJJHRoaXMtPl9yZWFkRGVmQ29sV2lkdGgoKTsJCQkJYnJlYWs7DQoJCQkJCWNhc2Ugc2VsZjo6WExTX1R5cGVfQ09MSU5GTzoJCQkJJHRoaXMtPl9yZWFkQ29sSW5mbygpOwkJCQkJYnJlYWs7DQoJCQkJCWNhc2Ugc2VsZjo6WExTX1R5cGVfRElNRU5TSU9OOgkJCQkkdGhpcy0+X3JlYWREZWZhdWx0KCk7CQkJCQlicmVhazsNCgkJCQkJY2FzZSBzZWxmOjpYTFNfVHlwZV9ST1c6CQkJCQkkdGhpcy0+X3JlYWRSb3coKTsJCQkJCQlicmVhazsNCgkJCQkJY2FzZSBzZWxmOjpYTFNfVHlwZV9EQkNFTEw6CQkJCQkkdGhpcy0+X3JlYWREZWZhdWx0KCk7CQkJCQlicmVhazsNCgkJCQkJY2FzZSBzZWxmOjpYTFNfVHlwZV9SSzoJCQkJCQkkdGhpcy0+X3JlYWRSaygpOwkJCQkJCWJyZWFrOw0KCQkJCQljYXNlIHNlbGY6OlhMU19UeXBlX0xBQkVMU1NUOgkJCQkkdGhpcy0+X3JlYWRMYWJlbFNzdCgpOwkJCQkJYnJlYWs7DQoJCQkJCWNhc2Ugc2VsZjo6WExTX1R5cGVfTVVMUks6CQkJCQkkdGhpcy0+X3JlYWRNdWxSaygpOwkJCQkJYnJlYWs7DQoJCQkJCWNhc2Ugc2VsZjo6WExTX1R5cGVfTlVNQkVSOgkJCQkJJHRoaXMtPl9yZWFkTnVtYmVyKCk7CQkJCQlicmVhazsNCgkJCQkJY2FzZSBzZWxmOjpYTFNfVHlwZV9GT1JNVUxBOgkJCQkkdGhpcy0+X3JlYWRGb3JtdWxhKCk7CQkJCQlicmVhazsNCgkJCQkJY2FzZSBzZWxmOjpYTFNfVHlwZV9TSEFSRURGTUxBOgkJCQkkdGhpcy0+X3JlYWRTaGFyZWRGbWxhKCk7CQkJCWJyZWFrOw0KCQkJCQljYXNlIHNlbGY6OlhMU19UeXBlX0JPT0xFUlI6CQkJCSR0aGlzLT5fcmVhZEJvb2xFcnIoKTsJCQkJCWJyZWFrOw0KCQkJCQljYXNlIHNlbGY6OlhMU19UeXBlX01VTEJMQU5LOgkJCQkkdGhpcy0+X3JlYWRNdWxCbGFuaygpOwkJCQkJYnJlYWs7DQoJCQkJCWNhc2Ugc2VsZjo6WExTX1R5cGVfTEFCRUw6CQkJCQkkdGhpcy0+X3JlYWRMYWJlbCgpOwkJCQkJYnJlYWs7DQoJCQkJCWNhc2Ugc2VsZjo6WExTX1R5cGVfQkxBTks6CQkJCQkkdGhpcy0+X3JlYWRCbGFuaygpOwkJCQkJYnJlYWs7DQoJCQkJCWNhc2Ugc2VsZjo6WExTX1R5cGVfTVNPRFJBV0lORzoJCQkJJHRoaXMtPl9yZWFkTXNvRHJhd2luZygpOwkJCQlicmVhazsNCgkJCQkJY2FzZSBzZWxmOjpYTFNfVHlwZV9PQko6CQkJCQkkdGhpcy0+X3JlYWRPYmooKTsJCQkJCQlicmVhazsNCgkJCQkJY2FzZSBzZWxmOjpYTFNfVHlwZV9XSU5ET1cyOgkJCQkkdGhpcy0+X3JlYWRXaW5kb3cyKCk7CQkJCQlicmVhazsNCgkJCQkJY2FzZSBzZWxmOjpYTFNfVHlwZV9TQ0w6CQkJCQkkdGhpcy0+X3JlYWRTY2woKTsJCQkJCQlicmVhazsNCgkJCQkJY2FzZSBzZWxmOjpYTFNfVHlwZV9QQU5FOgkJCQkJJHRoaXMtPl9yZWFkUGFuZSgpOwkJCQkJCWJyZWFrOw0KCQkJCQljYXNlIHNlbGY6OlhMU19UeXBlX1NFTEVDVElPTjoJCQkJJHRoaXMtPl9yZWFkU2VsZWN0aW9uKCk7CQkJCWJyZWFrOw0KCQkJCQljYXNlIHNlbGY6OlhMU19UeXBlX01FUkdFRENFTExTOgkJCSR0aGlzLT5fcmVhZE1lcmdlZENlbGxzKCk7CQkJCWJyZWFrOw0KCQkJCQljYXNlIHNlbGY6OlhMU19UeXBlX0hZUEVSTElOSzoJCQkJJHRoaXMtPl9yZWFkSHlwZXJMaW5rKCk7CQkJCWJyZWFrOw0KCQkJCQljYXNlIHNlbGY6OlhMU19UeXBlX0RBVEFWQUxJREFUSU9OUzoJCSR0aGlzLT5fcmVhZERhdGFWYWxpZGF0aW9ucygpOwkJCWJyZWFrOw0KCQkJCQljYXNlIHNlbGY6OlhMU19UeXBlX0RBVEFWQUxJREFUSU9OOgkJCSR0aGlzLT5fcmVhZERhdGFWYWxpZGF0aW9uKCk7CQkJYnJlYWs7DQoJCQkJCWNhc2Ugc2VsZjo6WExTX1R5cGVfU0hFRVRMQVlPVVQ6CQkJJHRoaXMtPl9yZWFkU2hlZXRMYXlvdXQoKTsJCQkJYnJlYWs7DQoJCQkJCWNhc2Ugc2VsZjo6WExTX1R5cGVfU0hFRVRQUk9URUNUSU9OOgkJJHRoaXMtPl9yZWFkU2hlZXRQcm90ZWN0aW9uKCk7CQkJYnJlYWs7DQoJCQkJCWNhc2Ugc2VsZjo6WExTX1R5cGVfUkFOR0VQUk9URUNUSU9OOgkJJHRoaXMtPl9yZWFkUmFuZ2VQcm90ZWN0aW9uKCk7CQkJYnJlYWs7DQoJCQkJCWNhc2Ugc2VsZjo6WExTX1R5cGVfTk9URToJCQkJCSR0aGlzLT5fcmVhZE5vdGUoKTsJCQkJCQlicmVhazsNCgkJCQkJLy9jYXNlIHNlbGY6OlhMU19UeXBlX0lNREFUQToJCQkJJHRoaXMtPl9yZWFkSW1EYXRhKCk7CQkJCQlicmVhazsNCgkJCQkJY2FzZSBzZWxmOjpYTFNfVHlwZV9UWE86CQkJCQkkdGhpcy0+X3JlYWRUZXh0T2JqZWN0KCk7CQkJCWJyZWFrOw0KCQkJCQljYXNlIHNlbGY6OlhMU19UeXBlX0NPTlRJTlVFOgkJCQkkdGhpcy0+X3JlYWRDb250aW51ZSgpOwkJCQkJYnJlYWs7DQoJCQkJCWNhc2Ugc2VsZjo6WExTX1R5cGVfRU9GOgkJCQkJJHRoaXMtPl9yZWFkRGVmYXVsdCgpOwkJCQkJYnJlYWsgMjsNCgkJCQkJZGVmYXVsdDoJCQkJCQkJCQkkdGhpcy0+X3JlYWREZWZhdWx0KCk7CQkJCQlicmVhazsNCgkJCQl9DQoNCgkJCX0NCg0KCQkJLy8gdHJlYXQgTVNPRFJBV0lORyByZWNvcmRzLCBzaGVldC1sZXZlbCBFc2NoZXINCgkJCWlmICghJHRoaXMtPl9yZWFkRGF0YU9ubHkgJiYgJHRoaXMtPl9kcmF3aW5nRGF0YSkgew0KCQkJCSRlc2NoZXJXb3Jrc2hlZXQgPSBuZXcgUEhQRXhjZWxfU2hhcmVkX0VzY2hlcigpOw0KCQkJCSRyZWFkZXIgPSBuZXcgUEhQRXhjZWxfUmVhZGVyX0V4Y2VsNV9Fc2NoZXIoJGVzY2hlcldvcmtzaGVldCk7DQoJCQkJJGVzY2hlcldvcmtzaGVldCA9ICRyZWFkZXItPmxvYWQoJHRoaXMtPl9kcmF3aW5nRGF0YSk7DQoNCgkJCQkvLyBkZWJ1ZyBFc2NoZXIgc3RyZWFtDQoJCQkJLy8kZGVidWcgPSBuZXcgRGVidWdfRXNjaGVyKG5ldyBQSFBFeGNlbF9TaGFyZWRfRXNjaGVyKCkpOw0KCQkJCS8vJGRlYnVnLT5sb2FkKCR0aGlzLT5fZHJhd2luZ0RhdGEpOw0KDQoJCQkJLy8gZ2V0IGFsbCBzcENvbnRhaW5lcnMgaW4gb25lIGxvbmcgYXJyYXksIHNvIHRoZXkgY2FuIGJlIG1hcHBlZCB0byBPQkogcmVjb3Jkcw0KCQkJCSRhbGxTcENvbnRhaW5lcnMgPSAkZXNjaGVyV29ya3NoZWV0LT5nZXREZ0NvbnRhaW5lcigpLT5nZXRTcGdyQ29udGFpbmVyKCktPmdldEFsbFNwQ29udGFpbmVycygpOw0KCQkJfQ0KDQoJCQkvLyB0cmVhdCBPQkogcmVjb3Jkcw0KCQkJZm9yZWFjaCAoJHRoaXMtPl9vYmpzIGFzICRuID0+ICRvYmopIHsNCi8vCQkJCWVjaG8gJzxociAvPjxiPk9iamVjdDwvYj4gcmVmZXJlbmNlIGlzICcsJG4sJzxiciAvPic7DQovLwkJCQl2YXJfZHVtcCgkb2JqKTsNCi8vCQkJCWVjaG8gJzxiciAvPic7DQoNCgkJCQkvLyB0aGUgZmlyc3Qgc2hhcGUgY29udGFpbmVyIG5ldmVyIGhhcyBhIGNvcnJlc3BvbmRpbmcgT0JKIHJlY29yZCwgaGVuY2UgJG4gKyAxDQoJCQkJJHNwQ29udGFpbmVyID0gJGFsbFNwQ29udGFpbmVyc1skbiArIDFdOw0KDQoJCQkJLy8gd2Ugc2tpcCBhbGwgc3BDb250YWluZXJzIHRoYXQgYXJlIGEgcGFydCBvZiBhIGdyb3VwIHNoYXBlIHNpbmNlIHdlIGNhbm5vdCB5ZXQgaGFuZGxlIHRob3NlDQoJCQkJaWYgKCRzcENvbnRhaW5lci0+Z2V0TmVzdGluZ0xldmVsKCkgPiAxKSB7DQoJCQkJCWNvbnRpbnVlOw0KCQkJCX0NCg0KCQkJCS8vIGNhbGN1bGF0ZSB0aGUgd2lkdGggYW5kIGhlaWdodCBvZiB0aGUgc2hhcGUNCgkJCQlsaXN0KCRzdGFydENvbHVtbiwgJHN0YXJ0Um93KSA9IFBIUEV4Y2VsX0NlbGw6OmNvb3JkaW5hdGVGcm9tU3RyaW5nKCRzcENvbnRhaW5lci0+Z2V0U3RhcnRDb29yZGluYXRlcygpKTsNCgkJCQlsaXN0KCRlbmRDb2x1bW4sICRlbmRSb3cpID0gUEhQRXhjZWxfQ2VsbDo6Y29vcmRpbmF0ZUZyb21TdHJpbmcoJHNwQ29udGFpbmVyLT5nZXRFbmRDb29yZGluYXRlcygpKTsNCg0KCQkJCSRzdGFydE9mZnNldFggPSAkc3BDb250YWluZXItPmdldFN0YXJ0T2Zmc2V0WCgpOw0KCQkJCSRzdGFydE9mZnNldFkgPSAkc3BDb250YWluZXItPmdldFN0YXJ0T2Zmc2V0WSgpOw0KCQkJCSRlbmRPZmZzZXRYID0gJHNwQ29udGFpbmVyLT5nZXRFbmRPZmZzZXRYKCk7DQoJCQkJJGVuZE9mZnNldFkgPSAkc3BDb250YWluZXItPmdldEVuZE9mZnNldFkoKTsNCg0KCQkJCSR3aWR0aCA9IFBIUEV4Y2VsX1NoYXJlZF9FeGNlbDU6OmdldERpc3RhbmNlWCgkdGhpcy0+X3BocFNoZWV0LCAkc3RhcnRDb2x1bW4sICRzdGFydE9mZnNldFgsICRlbmRDb2x1bW4sICRlbmRPZmZzZXRYKTsNCgkJCQkkaGVpZ2h0ID0gUEhQRXhjZWxfU2hhcmVkX0V4Y2VsNTo6Z2V0RGlzdGFuY2VZKCR0aGlzLT5fcGhwU2hlZXQsICRzdGFydFJvdywgJHN0YXJ0T2Zmc2V0WSwgJGVuZFJvdywgJGVuZE9mZnNldFkpOw0KDQoJCQkJLy8gY2FsY3VsYXRlIG9mZnNldFggYW5kIG9mZnNldFkgb2YgdGhlIHNoYXBlDQoJCQkJJG9mZnNldFggPSAkc3RhcnRPZmZzZXRYICogUEhQRXhjZWxfU2hhcmVkX0V4Y2VsNTo6c2l6ZUNvbCgkdGhpcy0+X3BocFNoZWV0LCAkc3RhcnRDb2x1bW4pIC8gMTAyNDsNCgkJCQkkb2Zmc2V0WSA9ICRzdGFydE9mZnNldFkgKiBQSFBFeGNlbF9TaGFyZWRfRXhjZWw1OjpzaXplUm93KCR0aGlzLT5fcGhwU2hlZXQsICRzdGFydFJvdykgLyAyNTY7DQoNCgkJCQlzd2l0Y2ggKCRvYmpbJ290T2JqVHlwZSddKSB7DQoNCgkJCQljYXNlIDB4MTk6DQoJCQkJCS8vIE5vdGUNCi8vCQkJCQllY2hvICdDZWxsIEFubm90YXRpb24gT2JqZWN0PGJyIC8+JzsNCi8vCQkJCQllY2hvICdPYmplY3QgSUQgaXMgJywkb2JqWydpZE9iaklEJ10sJzxiciAvPic7DQovLw0KCQkJCQlpZiAoaXNzZXQoJHRoaXMtPl9jZWxsTm90ZXNbJG9ialsnaWRPYmpJRCddXSkpIHsNCgkJCQkJCSRjZWxsTm90ZSA9ICR0aGlzLT5fY2VsbE5vdGVzWyRvYmpbJ2lkT2JqSUQnXV07DQoNCi8vCQkJCQkJZWNobyAnX2NlbGxOb3Rlc1snLCRvYmpbJ2lkT2JqSUQnXSwnXTogJzsNCi8vCQkJCQkJdmFyX2R1bXAoJGNlbGxOb3RlKTsNCi8vCQkJCQkJZWNobyAnPGJyIC8+JzsNCi8vDQoJCQkJCQlpZiAoaXNzZXQoJHRoaXMtPl90ZXh0T2JqZWN0c1skb2JqWydpZE9iaklEJ11dKSkgew0KCQkJCQkJCSR0ZXh0T2JqZWN0ID0gJHRoaXMtPl90ZXh0T2JqZWN0c1skb2JqWydpZE9iaklEJ11dOw0KLy8JCQkJCQkJZWNobyAnX3RleHRPYmplY3Q6ICc7DQovLwkJCQkJCQl2YXJfZHVtcCgkdGV4dE9iamVjdCk7DQovLwkJCQkJCQllY2hvICc8YnIgLz4nOw0KLy8NCgkJCQkJCQkkdGhpcy0+X2NlbGxOb3Rlc1skb2JqWydpZE9iaklEJ11dWydvYmpUZXh0RGF0YSddID0gJHRleHRPYmplY3Q7DQoJCQkJCQkJJHRleHQgPSAkdGV4dE9iamVjdFsndGV4dCddOw0KCQkJCQkJfQ0KLy8JCQkJCQllY2hvICR0ZXh0LCc8YnIgLz4nOw0KCQkJCQl9DQoJCQkJCWJyZWFrOw0KDQoJCQkJY2FzZSAweDA4Og0KLy8JCQkJCWVjaG8gJ1BpY3R1cmUgT2JqZWN0PGJyIC8+JzsNCgkJCQkJLy8gcGljdHVyZQ0KDQoJCQkJCS8vIGdldCBpbmRleCB0byBCU0UgZW50cnkgKDEtYmFzZWQpDQoJCQkJCSRCU0VpbmRleCA9ICRzcENvbnRhaW5lci0+Z2V0T1BUKDB4MDEwNCk7DQoJCQkJCSRCU0VDb2xsZWN0aW9uID0gJGVzY2hlcldvcmtib29rLT5nZXREZ2dDb250YWluZXIoKS0+Z2V0QnN0b3JlQ29udGFpbmVyKCktPmdldEJTRUNvbGxlY3Rpb24oKTsNCgkJCQkJJEJTRSA9ICRCU0VDb2xsZWN0aW9uWyRCU0VpbmRleCAtIDFdOw0KCQkJCQkkYmxpcFR5cGUgPSAkQlNFLT5nZXRCbGlwVHlwZSgpOw0KDQoJCQkJCS8vIG5lZWQgY2hlY2sgYmVjYXVzZSBzb21lIGJsaXAgdHlwZXMgYXJlIG5vdCBzdXBwb3J0ZWQgYnkgRXNjaGVyIHJlYWRlciBzdWNoIGFzIEVNRg0KCQkJCQlpZiAoJGJsaXAgPSAkQlNFLT5nZXRCbGlwKCkpIHsNCgkJCQkJCSRpaCA9IGltYWdlY3JlYXRlZnJvbXN0cmluZygkYmxpcC0+Z2V0RGF0YSgpKTsNCgkJCQkJCSRkcmF3aW5nID0gbmV3IFBIUEV4Y2VsX1dvcmtzaGVldF9NZW1vcnlEcmF3aW5nKCk7DQoJCQkJCQkkZHJhd2luZy0+c2V0SW1hZ2VSZXNvdXJjZSgkaWgpOw0KDQoJCQkJCQkvLyB3aWR0aCwgaGVpZ2h0LCBvZmZzZXRYLCBvZmZzZXRZDQoJCQkJCQkkZHJhd2luZy0+c2V0UmVzaXplUHJvcG9ydGlvbmFsKGZhbHNlKTsNCgkJCQkJCSRkcmF3aW5nLT5zZXRXaWR0aCgkd2lkdGgpOw0KCQkJCQkJJGRyYXdpbmctPnNldEhlaWdodCgkaGVpZ2h0KTsNCgkJCQkJCSRkcmF3aW5nLT5zZXRPZmZzZXRYKCRvZmZzZXRYKTsNCgkJCQkJCSRkcmF3aW5nLT5zZXRPZmZzZXRZKCRvZmZzZXRZKTsNCg0KCQkJCQkJc3dpdGNoICgkYmxpcFR5cGUpIHsNCgkJCQkJCQljYXNlIFBIUEV4Y2VsX1NoYXJlZF9Fc2NoZXJfRGdnQ29udGFpbmVyX0JzdG9yZUNvbnRhaW5lcl9CU0U6OkJMSVBUWVBFX0pQRUc6DQoJCQkJCQkJCSRkcmF3aW5nLT5zZXRSZW5kZXJpbmdGdW5jdGlvbihQSFBFeGNlbF9Xb3Jrc2hlZXRfTWVtb3J5RHJhd2luZzo6UkVOREVSSU5HX0pQRUcpOw0KCQkJCQkJCQkkZHJhd2luZy0+c2V0TWltZVR5cGUoUEhQRXhjZWxfV29ya3NoZWV0X01lbW9yeURyYXdpbmc6Ok1JTUVUWVBFX0pQRUcpOw0KCQkJCQkJCQlicmVhazsNCg0KCQkJCQkJCWNhc2UgUEhQRXhjZWxfU2hhcmVkX0VzY2hlcl9EZ2dDb250YWluZXJfQnN0b3JlQ29udGFpbmVyX0JTRTo6QkxJUFRZUEVfUE5HOg0KCQkJCQkJCQkkZHJhd2luZy0+c2V0UmVuZGVyaW5nRnVuY3Rpb24oUEhQRXhjZWxfV29ya3NoZWV0X01lbW9yeURyYXdpbmc6OlJFTkRFUklOR19QTkcpOw0KCQkJCQkJCQkkZHJhd2luZy0+c2V0TWltZVR5cGUoUEhQRXhjZWxfV29ya3NoZWV0X01lbW9yeURyYXdpbmc6Ok1JTUVUWVBFX1BORyk7DQoJCQkJCQkJCWJyZWFrOw0KCQkJCQkJfQ0KDQoJCQkJCQkkZHJhd2luZy0+c2V0V29ya3NoZWV0KCR0aGlzLT5fcGhwU2hlZXQpOw0KCQkJCQkJJGRyYXdpbmctPnNldENvb3JkaW5hdGVzKCRzcENvbnRhaW5lci0+Z2V0U3RhcnRDb29yZGluYXRlcygpKTsNCgkJCQkJfQ0KDQoJCQkJCWJyZWFrOw0KDQoJCQkJZGVmYXVsdDoNCgkJCQkJLy8gb3RoZXIgb2JqZWN0IHR5cGUNCgkJCQkJYnJlYWs7DQoNCgkJCQl9DQoJCQl9DQoNCgkJCS8vIHRyZWF0IFNIQVJFREZNTEEgcmVjb3Jkcw0KCQkJaWYgKCR0aGlzLT5fdmVyc2lvbiA9PSBzZWxmOjpYTFNfQklGRjgpIHsNCgkJCQlmb3JlYWNoICgkdGhpcy0+X3NoYXJlZEZvcm11bGFQYXJ0cyBhcyAkY2VsbCA9PiAkYmFzZUNlbGwpIHsNCgkJCQkJbGlzdCgkY29sdW1uLCAkcm93KSA9IFBIUEV4Y2VsX0NlbGw6OmNvb3JkaW5hdGVGcm9tU3RyaW5nKCRjZWxsKTsNCgkJCQkJaWYgKCgkdGhpcy0+Z2V0UmVhZEZpbHRlcigpICE9PSBOVUxMKSAmJiAkdGhpcy0+Z2V0UmVhZEZpbHRlcigpLT5yZWFkQ2VsbCgkY29sdW1uLCAkcm93LCAkdGhpcy0+X3BocFNoZWV0LT5nZXRUaXRsZSgpKSApIHsNCgkJCQkJCSRmb3JtdWxhID0gJHRoaXMtPl9nZXRGb3JtdWxhRnJvbVN0cnVjdHVyZSgkdGhpcy0+X3NoYXJlZEZvcm11bGFzWyRiYXNlQ2VsbF0sICRjZWxsKTsNCgkJCQkJCSR0aGlzLT5fcGhwU2hlZXQtPmdldENlbGwoJGNlbGwpLT5zZXRWYWx1ZUV4cGxpY2l0KCc9JyAuICRmb3JtdWxhLCBQSFBFeGNlbF9DZWxsX0RhdGFUeXBlOjpUWVBFX0ZPUk1VTEEpOw0KCQkJCQl9DQoJCQkJfQ0KCQkJfQ0KDQoJCQlpZiAoIWVtcHR5KCR0aGlzLT5fY2VsbE5vdGVzKSkgew0KCQkJCWZvcmVhY2goJHRoaXMtPl9jZWxsTm90ZXMgYXMgJG5vdGUgPT4gJG5vdGVEZXRhaWxzKSB7DQovLwkJCQkJZWNobyAnPGI+Q2VsbCBhbm5vdGF0aW9uICcsJG5vdGUsJzwvYj48YnIgLz4nOw0KLy8JCQkJCXZhcl9kdW1wKCRub3RlRGV0YWlscyk7DQovLwkJCQkJZWNobyAnPGJyIC8+JzsNCgkJCQkJJGNlbGxBZGRyZXNzID0gc3RyX3JlcGxhY2UoJyQnLCcnLCRub3RlRGV0YWlsc1snY2VsbFJlZiddKTsNCgkJCQkJJHRoaXMtPl9waHBTaGVldC0+Z2V0Q29tbWVudCggJGNlbGxBZGRyZXNzICkNCgkJCQkJCQkJCQkJCQktPnNldEF1dGhvciggJG5vdGVEZXRhaWxzWydhdXRob3InXSApDQoJCQkJCQkJCQkJCQkJLT5zZXRUZXh0KCR0aGlzLT5fcGFyc2VSaWNoVGV4dCgkbm90ZURldGFpbHNbJ29ialRleHREYXRhJ11bJ3RleHQnXSkgKTsNCgkJCQl9DQoJCQl9DQoJCX0NCg0KCQkvLyBhZGQgdGhlIG5hbWVkIHJhbmdlcyAoZGVmaW5lZCBuYW1lcykNCgkJZm9yZWFjaCAoJHRoaXMtPl9kZWZpbmVkbmFtZSBhcyAkZGVmaW5lZE5hbWUpIHsNCgkJCWlmICgkZGVmaW5lZE5hbWVbJ2lzQnVpbHRJbk5hbWUnXSkgew0KCQkJCXN3aXRjaCAoJGRlZmluZWROYW1lWyduYW1lJ10pIHsNCg0KCQkJCWNhc2UgcGFjaygnQycsIDB4MDYpOg0KCQkJCQkvLyBwcmludCBhcmVhDQoJCQkJCS8vCWluIGdlbmVyYWwsIGZvcm11bGEgbG9va3MgbGlrZSB0aGlzOiBGb28hJEMkNzokSiQ2NixCYXIhJEEkMTokSVYkMg0KDQoJCQkJCSRyYW5nZXMgPSBleHBsb2RlKCcsJywgJGRlZmluZWROYW1lWydmb3JtdWxhJ10pOyAvLyBGSVhNRTogd2hhdCBpZiBzaGVldG5hbWUgY29udGFpbnMgY29tbWE/DQoNCgkJCQkJJGV4dHJhY3RlZFJhbmdlcyA9IGFycmF5KCk7DQoJCQkJCWZvcmVhY2ggKCRyYW5nZXMgYXMgJHJhbmdlKSB7DQoJCQkJCQkvLyAkcmFuZ2Ugc2hvdWxkIGxvb2sgbGlrZSBvbmUgb2YgdGhlc2UNCgkJCQkJCS8vCQlGb28hJEMkNzokSiQ2Ng0KCQkJCQkJLy8JCUJhciEkQSQxOiRJViQyDQoNCgkJCQkJCSRleHBsb2RlcyA9IGV4cGxvZGUoJyEnLCAkcmFuZ2UpOwkvLyBGSVhNRTogd2hhdCBpZiBzaGVldG5hbWUgY29udGFpbnMgZXhjbGFtYXRpb24gbWFyaz8NCgkJCQkJCSRzaGVldE5hbWUgPSAkZXhwbG9kZXNbMF07DQoNCgkJCQkJCWlmIChjb3VudCgkZXhwbG9kZXMpID09IDIpIHsNCgkJCQkJCQkkZXh0cmFjdGVkUmFuZ2VzW10gPSBzdHJfcmVwbGFjZSgnJCcsICcnLCAkZXhwbG9kZXNbMV0pOyAvLyBDNzpKNjYNCgkJCQkJCX0NCgkJCQkJfQ0KCQkJCQlpZiAoJGRvY1NoZWV0ID0gJHRoaXMtPl9waHBFeGNlbC0+Z2V0U2hlZXRCeU5hbWUoJHNoZWV0TmFtZSkpIHsNCgkJCQkJCSRkb2NTaGVldC0+Z2V0UGFnZVNldHVwKCktPnNldFByaW50QXJlYShpbXBsb2RlKCcsJywgJGV4dHJhY3RlZFJhbmdlcykpOyAvLyBDNzpKNjYsQTE6SVYyDQoJCQkJCX0NCgkJCQkJYnJlYWs7DQoNCgkJCQljYXNlIHBhY2soJ0MnLCAweDA3KToNCgkJCQkJLy8gcHJpbnQgdGl0bGVzIChyZXBlYXRpbmcgcm93cykNCgkJCQkJLy8gQXNzdW1pbmcgQklGRjgsIHRoZXJlIGFyZSAzIGNhc2VzDQoJCQkJCS8vIDEuIHJlcGVhdGluZyByb3dzDQoJCQkJCS8vCQlmb3JtdWxhIGxvb2tzIGxpa2UgdGhpczogU2hlZXQhJEEkMTokSVYkMg0KCQkJCQkvLwkJcm93cyAxLTIgcmVwZWF0DQoJCQkJCS8vIDIuIHJlcGVhdGluZyBjb2x1bW5zDQoJCQkJCS8vCQlmb3JtdWxhIGxvb2tzIGxpa2UgdGhpczogU2hlZXQhJEEkMTokQiQ2NTUzNg0KCQkJCQkvLwkJY29sdW1ucyBBLUIgcmVwZWF0DQoJCQkJCS8vIDMuIGJvdGggcmVwZWF0aW5nIHJvd3MgYW5kIHJlcGVhdGluZyBjb2x1bW5zDQoJCQkJCS8vCQlmb3JtdWxhIGxvb2tzIGxpa2UgdGhpczogU2hlZXQhJEEkMTokQiQ2NTUzNixTaGVldCEkQSQxOiRJViQyDQoNCgkJCQkJJHJhbmdlcyA9IGV4cGxvZGUoJywnLCAkZGVmaW5lZE5hbWVbJ2Zvcm11bGEnXSk7IC8vIEZJWE1FOiB3aGF0IGlmIHNoZWV0bmFtZSBjb250YWlucyBjb21tYT8NCg0KCQkJCQlmb3JlYWNoICgkcmFuZ2VzIGFzICRyYW5nZSkgew0KCQkJCQkJLy8gJHJhbmdlIHNob3VsZCBsb29rIGxpa2UgdGhpcyBvbmUgb2YgdGhlc2UNCgkJCQkJCS8vCQlTaGVldCEkQSQxOiRCJDY1NTM2DQoJCQkJCQkvLwkJU2hlZXQhJEEkMTokSVYkMg0KDQoJCQkJCQkkZXhwbG9kZXMgPSBleHBsb2RlKCchJywgJHJhbmdlKTsNCg0KCQkJCQkJaWYgKGNvdW50KCRleHBsb2RlcykgPT0gMikgew0KCQkJCQkJCWlmICgkZG9jU2hlZXQgPSAkdGhpcy0+X3BocEV4Y2VsLT5nZXRTaGVldEJ5TmFtZSgkZXhwbG9kZXNbMF0pKSB7DQoNCgkJCQkJCQkJJGV4dHJhY3RlZFJhbmdlID0gJGV4cGxvZGVzWzFdOw0KCQkJCQkJCQkkZXh0cmFjdGVkUmFuZ2UgPSBzdHJfcmVwbGFjZSgnJCcsICcnLCAkZXh0cmFjdGVkUmFuZ2UpOw0KDQoJCQkJCQkJCSRjb29yZGluYXRlU3RyaW5ncyA9IGV4cGxvZGUoJzonLCAkZXh0cmFjdGVkUmFuZ2UpOw0KCQkJCQkJCQlpZiAoY291bnQoJGNvb3JkaW5hdGVTdHJpbmdzKSA9PSAyKSB7DQoJCQkJCQkJCQlsaXN0KCRmaXJzdENvbHVtbiwgJGZpcnN0Um93KSA9IFBIUEV4Y2VsX0NlbGw6OmNvb3JkaW5hdGVGcm9tU3RyaW5nKCRjb29yZGluYXRlU3RyaW5nc1swXSk7DQoJCQkJCQkJCQlsaXN0KCRsYXN0Q29sdW1uLCAkbGFzdFJvdykgPSBQSFBFeGNlbF9DZWxsOjpjb29yZGluYXRlRnJvbVN0cmluZygkY29vcmRpbmF0ZVN0cmluZ3NbMV0pOw0KDQoJCQkJCQkJCQlpZiAoJGZpcnN0Q29sdW1uID09ICdBJyBhbmQgJGxhc3RDb2x1bW4gPT0gJ0lWJykgew0KCQkJCQkJCQkJCS8vIHRoZW4gd2UgaGF2ZSByZXBlYXRpbmcgcm93cw0KCQkJCQkJCQkJCSRkb2NTaGVldC0+Z2V0UGFnZVNldHVwKCktPnNldFJvd3NUb1JlcGVhdEF0VG9wKGFycmF5KCRmaXJzdFJvdywgJGxhc3RSb3cpKTsNCgkJCQkJCQkJCX0gZWxzZWlmICgkZmlyc3RSb3cgPT0gMSBhbmQgJGxhc3RSb3cgPT0gNjU1MzYpIHsNCgkJCQkJCQkJCQkvLyB0aGVuIHdlIGhhdmUgcmVwZWF0aW5nIGNvbHVtbnMNCgkJCQkJCQkJCQkkZG9jU2hlZXQtPmdldFBhZ2VTZXR1cCgpLT5zZXRDb2x1bW5zVG9SZXBlYXRBdExlZnQoYXJyYXkoJGZpcnN0Q29sdW1uLCAkbGFzdENvbHVtbikpOw0KCQkJCQkJCQkJfQ0KCQkJCQkJCQl9DQoJCQkJCQkJfQ0KCQkJCQkJfQ0KCQkJCQl9DQoJCQkJCWJyZWFrOw0KDQoJCQkJfQ0KCQkJfSBlbHNlIHsNCgkJCQkvLyBFeHRyYWN0IHJhbmdlDQoJCQkJJGV4cGxvZGVzID0gZXhwbG9kZSgnIScsICRkZWZpbmVkTmFtZVsnZm9ybXVsYSddKTsNCg0KCQkJCWlmIChjb3VudCgkZXhwbG9kZXMpID09IDIpIHsNCgkJCQkJaWYgKCgkZG9jU2hlZXQgPSAkdGhpcy0+X3BocEV4Y2VsLT5nZXRTaGVldEJ5TmFtZSgkZXhwbG9kZXNbMF0pKSB8fA0KCQkJCQkJKCRkb2NTaGVldCA9ICR0aGlzLT5fcGhwRXhjZWwtPmdldFNoZWV0QnlOYW1lKHRyaW0oJGV4cGxvZGVzWzBdLCInIikpKSkgew0KCQkJCQkJJGV4dHJhY3RlZFJhbmdlID0gJGV4cGxvZGVzWzFdOw0KCQkJCQkJJGV4dHJhY3RlZFJhbmdlID0gc3RyX3JlcGxhY2UoJyQnLCAnJywgJGV4dHJhY3RlZFJhbmdlKTsNCg0KCQkJCQkJJGxvY2FsT25seSA9ICgkZGVmaW5lZE5hbWVbJ3Njb3BlJ10gPT0gMCkgPyBmYWxzZSA6IHRydWU7DQoNCgkJCQkJCSRzY29wZSA9ICgkZGVmaW5lZE5hbWVbJ3Njb3BlJ10gPT0gMCkgPw0KCQkJCQkJCW51bGwgOiAkdGhpcy0+X3BocEV4Y2VsLT5nZXRTaGVldEJ5TmFtZSgkdGhpcy0+X3NoZWV0c1skZGVmaW5lZE5hbWVbJ3Njb3BlJ10gLSAxXVsnbmFtZSddKTsNCg0KCQkJCQkJJHRoaXMtPl9waHBFeGNlbC0+YWRkTmFtZWRSYW5nZSggbmV3IFBIUEV4Y2VsX05hbWVkUmFuZ2UoKHN0cmluZykkZGVmaW5lZE5hbWVbJ25hbWUnXSwgJGRvY1NoZWV0LCAkZXh0cmFjdGVkUmFuZ2UsICRsb2NhbE9ubHksICRzY29wZSkgKTsNCgkJCQkJfQ0KCQkJCX0gZWxzZSB7DQoJCQkJCS8vCU5hbWVkIFZhbHVlDQoJCQkJCS8vCVRPRE8gUHJvdmlkZSBzdXBwb3J0IGZvciBuYW1lZCB2YWx1ZXMNCgkJCQl9DQoJCQl9DQoJCX0NCg0KCQlyZXR1cm4gJHRoaXMtPl9waHBFeGNlbDsNCgl9DQoNCg0KCS8qKg0KCSAqIFVzZSBPTEUgcmVhZGVyIHRvIGV4dHJhY3QgdGhlIHJlbGV2YW50IGRhdGEgc3RyZWFtcyBmcm9tIHRoZSBPTEUgZmlsZQ0KCSAqDQoJICogQHBhcmFtIHN0cmluZyAkcEZpbGVuYW1lDQoJICovDQoJcHJpdmF0ZSBmdW5jdGlvbiBfbG9hZE9MRSgkcEZpbGVuYW1lKQ0KCXsNCgkJLy8gT0xFIHJlYWRlcg0KCQkkb2xlID0gbmV3IFBIUEV4Y2VsX1NoYXJlZF9PTEVSZWFkKCk7DQoNCgkJLy8gZ2V0IGV4Y2VsIGRhdGEsDQoJCSRyZXMgPSAkb2xlLT5yZWFkKCRwRmlsZW5hbWUpOw0KCQkvLyBHZXQgd29ya2Jvb2sgZGF0YTogd29ya2Jvb2sgc3RyZWFtICsgc2hlZXQgc3RyZWFtcw0KCQkkdGhpcy0+X2RhdGEgPSAkb2xlLT5nZXRTdHJlYW0oJG9sZS0+d3JrYm9vayk7DQoNCgkJLy8gR2V0IHN1bW1hcnkgaW5mb3JtYXRpb24gZGF0YQ0KCQkkdGhpcy0+X3N1bW1hcnlJbmZvcm1hdGlvbiA9ICRvbGUtPmdldFN0cmVhbSgkb2xlLT5zdW1tYXJ5SW5mb3JtYXRpb24pOw0KDQoJCS8vIEdldCBhZGRpdGlvbmFsIGRvY3VtZW50IHN1bW1hcnkgaW5mb3JtYXRpb24gZGF0YQ0KCQkkdGhpcy0+X2RvY3VtZW50U3VtbWFyeUluZm9ybWF0aW9uID0gJG9sZS0+Z2V0U3RyZWFtKCRvbGUtPmRvY3VtZW50U3VtbWFyeUluZm9ybWF0aW9uKTsNCg0KCQkvLyBHZXQgdXNlci1kZWZpbmVkIHByb3BlcnR5IGRhdGENCi8vCQkkdGhpcy0+X3VzZXJEZWZpbmVkUHJvcGVydGllcyA9ICRvbGUtPmdldFVzZXJEZWZpbmVkUHJvcGVydGllcygpOw0KCX0NCg0KDQoJLyoqDQoJICogUmVhZCBzdW1tYXJ5IGluZm9ybWF0aW9uDQoJICovDQoJcHJpdmF0ZSBmdW5jdGlvbiBfcmVhZFN1bW1hcnlJbmZvcm1hdGlvbigpDQoJew0KCQlpZiAoIWlzc2V0KCR0aGlzLT5fc3VtbWFyeUluZm9ybWF0aW9uKSkgew0KCQkJcmV0dXJuOw0KCQl9DQoNCgkJLy8gb2Zmc2V0OiAwOyBzaXplOiAyOyBtdXN0IGJlIDB4RkUgMHhGRiAoVVRGLTE2IExFIGJ5dGUgb3JkZXIgbWFyaykNCgkJLy8gb2Zmc2V0OiAyOyBzaXplOiAyOw0KCQkvLyBvZmZzZXQ6IDQ7IHNpemU6IDI7IE9TIHZlcnNpb24NCgkJLy8gb2Zmc2V0OiA2OyBzaXplOiAyOyBPUyBpbmRpY2F0b3INCgkJLy8gb2Zmc2V0OiA4OyBzaXplOiAxNg0KCQkvLyBvZmZzZXQ6IDI0OyBzaXplOiA0OyBzZWN0aW9uIGNvdW50DQoJCSRzZWNDb3VudCA9IHNlbGY6Ol9HZXRJbnQ0ZCgkdGhpcy0+X3N1bW1hcnlJbmZvcm1hdGlvbiwgMjQpOw0KDQoJCS8vIG9mZnNldDogMjg7IHNpemU6IDE2OyBmaXJzdCBzZWN0aW9uJ3MgY2xhc3MgaWQ6IGUwIDg1IDlmIGYyIGY5IDRmIDY4IDEwIGFiIDkxIDA4IDAwIDJiIDI3IGIzIGQ5DQoJCS8vIG9mZnNldDogNDQ7IHNpemU6IDQNCgkJJHNlY09mZnNldCA9IHNlbGY6Ol9HZXRJbnQ0ZCgkdGhpcy0+X3N1bW1hcnlJbmZvcm1hdGlvbiwgNDQpOw0KDQoJCS8vIHNlY3Rpb24gaGVhZGVyDQoJCS8vIG9mZnNldDogJHNlY09mZnNldDsgc2l6ZTogNDsgc2VjdGlvbiBsZW5ndGgNCgkJJHNlY0xlbmd0aCA9IHNlbGY6Ol9HZXRJbnQ0ZCgkdGhpcy0+X3N1bW1hcnlJbmZvcm1hdGlvbiwgJHNlY09mZnNldCk7DQoNCgkJLy8gb2Zmc2V0OiAkc2VjT2Zmc2V0KzQ7IHNpemU6IDQ7IHByb3BlcnR5IGNvdW50DQoJCSRjb3VudFByb3BlcnRpZXMgPSBzZWxmOjpfR2V0SW50NGQoJHRoaXMtPl9zdW1tYXJ5SW5mb3JtYXRpb24sICRzZWNPZmZzZXQrNCk7DQoNCgkJLy8gaW5pdGlhbGl6ZSBjb2RlIHBhZ2UgKHVzZWQgdG8gcmVzb2x2ZSBzdHJpbmcgdmFsdWVzKQ0KCQkkY29kZVBhZ2UgPSAnQ1AxMjUyJzsNCg0KCQkvLyBvZmZzZXQ6ICgkc2VjT2Zmc2V0KzgpOyBzaXplOiB2YXINCgkJLy8gbG9vcCB0aHJvdWdoIHByb3BlcnR5IGRlY2FyYXRpb25zIGFuZCBwcm9wZXJ0aWVzDQoJCWZvciAoJGkgPSAwOyAkaSA8ICRjb3VudFByb3BlcnRpZXM7ICsrJGkpIHsNCg0KCQkJLy8gb2Zmc2V0OiAoJHNlY09mZnNldCs4KSArICg4ICogJGkpOyBzaXplOiA0OyBwcm9wZXJ0eSBJRA0KCQkJJGlkID0gc2VsZjo6X0dldEludDRkKCR0aGlzLT5fc3VtbWFyeUluZm9ybWF0aW9uLCAoJHNlY09mZnNldCs4KSArICg4ICogJGkpKTsNCg0KCQkJLy8gVXNlIHZhbHVlIG9mIHByb3BlcnR5IGlkIGFzIGFwcHJvcHJpYXRlDQoJCQkvLyBvZmZzZXQ6ICgkc2VjT2Zmc2V0KzEyKSArICg4ICogJGkpOyBzaXplOiA0OyBvZmZzZXQgZnJvbSBiZWdpbm5pbmcgb2Ygc2VjdGlvbiAoNDgpDQoJCQkkb2Zmc2V0ID0gc2VsZjo6X0dldEludDRkKCR0aGlzLT5fc3VtbWFyeUluZm9ybWF0aW9uLCAoJHNlY09mZnNldCsxMikgKyAoOCAqICRpKSk7DQoNCgkJCSR0eXBlID0gc2VsZjo6X0dldEludDRkKCR0aGlzLT5fc3VtbWFyeUluZm9ybWF0aW9uLCAkc2VjT2Zmc2V0ICsgJG9mZnNldCk7DQoNCgkJCS8vIGluaXRpYWxpemUgcHJvcGVydHkgdmFsdWUNCgkJCSR2YWx1ZSA9IG51bGw7DQoNCgkJCS8vIGV4dHJhY3QgcHJvcGVydHkgdmFsdWUgYmFzZWQgb24gcHJvcGVydHkgdHlwZQ0KCQkJc3dpdGNoICgkdHlwZSkgew0KCQkJCWNhc2UgMHgwMjogLy8gMiBieXRlIHNpZ25lZCBpbnRlZ2VyDQoJCQkJCSR2YWx1ZSA9IHNlbGY6Ol9HZXRJbnQyZCgkdGhpcy0+X3N1bW1hcnlJbmZvcm1hdGlvbiwgJHNlY09mZnNldCArIDQgKyAkb2Zmc2V0KTsNCgkJCQkJYnJlYWs7DQoNCgkJCQljYXNlIDB4MDM6IC8vIDQgYnl0ZSBzaWduZWQgaW50ZWdlcg0KCQkJCQkkdmFsdWUgPSBzZWxmOjpfR2V0SW50NGQoJHRoaXMtPl9zdW1tYXJ5SW5mb3JtYXRpb24sICRzZWNPZmZzZXQgKyA0ICsgJG9mZnNldCk7DQoJCQkJCWJyZWFrOw0KDQoJCQkJY2FzZSAweDEzOiAvLyA0IGJ5dGUgdW5zaWduZWQgaW50ZWdlcg0KCQkJCQkvLyBub3QgbmVlZGVkIHlldCwgZml4IGxhdGVyIGlmIG5lY2Vzc2FyeQ0KCQkJCQlicmVhazsNCg0KCQkJCWNhc2UgMHgxRTogLy8gbnVsbC10ZXJtaW5hdGVkIHN0cmluZyBwcmVwZW5kZWQgYnkgZHdvcmQgc3RyaW5nIGxlbmd0aA0KCQkJCQkkYnl0ZUxlbmd0aCA9IHNlbGY6Ol9HZXRJbnQ0ZCgkdGhpcy0+X3N1bW1hcnlJbmZvcm1hdGlvbiwgJHNlY09mZnNldCArIDQgKyAkb2Zmc2V0KTsNCgkJCQkJJHZhbHVlID0gc3Vic3RyKCR0aGlzLT5fc3VtbWFyeUluZm9ybWF0aW9uLCAkc2VjT2Zmc2V0ICsgOCArICRvZmZzZXQsICRieXRlTGVuZ3RoKTsNCgkJCQkJJHZhbHVlID0gUEhQRXhjZWxfU2hhcmVkX1N0cmluZzo6Q29udmVydEVuY29kaW5nKCR2YWx1ZSwgJ1VURi04JywgJGNvZGVQYWdlKTsNCgkJCQkJJHZhbHVlID0gcnRyaW0oJHZhbHVlKTsNCgkJCQkJYnJlYWs7DQoNCgkJCQljYXNlIDB4NDA6IC8vIEZpbGV0aW1lICg2NC1iaXQgdmFsdWUgcmVwcmVzZW50aW5nIHRoZSBudW1iZXIgb2YgMTAwLW5hbm9zZWNvbmQgaW50ZXJ2YWxzIHNpbmNlIEphbnVhcnkgMSwgMTYwMSkNCgkJCQkJLy8gUEhQLXRpbWUNCgkJCQkJJHZhbHVlID0gUEhQRXhjZWxfU2hhcmVkX09MRTo6T0xFMkxvY2FsRGF0ZShzdWJzdHIoJHRoaXMtPl9zdW1tYXJ5SW5mb3JtYXRpb24sICRzZWNPZmZzZXQgKyA0ICsgJG9mZnNldCwgOCkpOw0KCQkJCQlicmVhazsNCg0KCQkJCWNhc2UgMHg0NzogLy8gQ2xpcGJvYXJkIGZvcm1hdA0KCQkJCQkvLyBub3QgbmVlZGVkIHlldCwgZml4IGxhdGVyIGlmIG5lY2Vzc2FyeQ0KCQkJCQlicmVhazsNCgkJCX0NCg0KCQkJc3dpdGNoICgkaWQpIHsNCgkJCQljYXNlIDB4MDE6CS8vCUNvZGUgUGFnZQ0KCQkJCQkkY29kZVBhZ2UgPSBQSFBFeGNlbF9TaGFyZWRfQ29kZVBhZ2U6Ok51bWJlclRvTmFtZSgkdmFsdWUpOw0KCQkJCQlicmVhazsNCg0KCQkJCWNhc2UgMHgwMjoJLy8JVGl0bGUNCgkJCQkJJHRoaXMtPl9waHBFeGNlbC0+Z2V0UHJvcGVydGllcygpLT5zZXRUaXRsZSgkdmFsdWUpOw0KCQkJCQlicmVhazsNCg0KCQkJCWNhc2UgMHgwMzoJLy8JU3ViamVjdA0KCQkJCQkkdGhpcy0+X3BocEV4Y2VsLT5nZXRQcm9wZXJ0aWVzKCktPnNldFN1YmplY3QoJHZhbHVlKTsNCgkJCQkJYnJlYWs7DQoNCgkJCQljYXNlIDB4MDQ6CS8vCUF1dGhvciAoQ3JlYXRvcikNCgkJCQkJJHRoaXMtPl9waHBFeGNlbC0+Z2V0UHJvcGVydGllcygpLT5zZXRDcmVhdG9yKCR2YWx1ZSk7DQoJCQkJCWJyZWFrOw0KDQoJCQkJY2FzZSAweDA1OgkvLwlLZXl3b3Jkcw0KCQkJCQkkdGhpcy0+X3BocEV4Y2VsLT5nZXRQcm9wZXJ0aWVzKCktPnNldEtleXdvcmRzKCR2YWx1ZSk7DQoJCQkJCWJyZWFrOw0KDQoJCQkJY2FzZSAweDA2OgkvLwlDb21tZW50cyAoRGVzY3JpcHRpb24pDQoJCQkJCSR0aGlzLT5fcGhwRXhjZWwtPmdldFByb3BlcnRpZXMoKS0+c2V0RGVzY3JpcHRpb24oJHZhbHVlKTsNCgkJCQkJYnJlYWs7DQoNCgkJCQljYXNlIDB4MDc6CS8vCVRlbXBsYXRlDQoJCQkJCS8vCU5vdCBzdXBwb3J0ZWQgYnkgUEhQRXhjZWwNCgkJCQkJYnJlYWs7DQoNCgkJCQljYXNlIDB4MDg6CS8vCUxhc3QgU2F2ZWQgQnkgKExhc3RNb2RpZmllZEJ5KQ0KCQkJCQkkdGhpcy0+X3BocEV4Y2VsLT5nZXRQcm9wZXJ0aWVzKCktPnNldExhc3RNb2RpZmllZEJ5KCR2YWx1ZSk7DQoJCQkJCWJyZWFrOw0KDQoJCQkJY2FzZSAweDA5OgkvLwlSZXZpc2lvbg0KCQkJCQkvLwlOb3Qgc3VwcG9ydGVkIGJ5IFBIUEV4Y2VsDQoJCQkJCWJyZWFrOw0KDQoJCQkJY2FzZSAweDBBOgkvLwlUb3RhbCBFZGl0aW5nIFRpbWUNCgkJCQkJLy8JTm90IHN1cHBvcnRlZCBieSBQSFBFeGNlbA0KCQkJCQlicmVhazsNCg0KCQkJCWNhc2UgMHgwQjoJLy8JTGFzdCBQcmludGVkDQoJCQkJCS8vCU5vdCBzdXBwb3J0ZWQgYnkgUEhQRXhjZWwNCgkJCQkJYnJlYWs7DQoNCgkJCQljYXNlIDB4MEM6CS8vCUNyZWF0ZWQgRGF0ZS9UaW1lDQoJCQkJCSR0aGlzLT5fcGhwRXhjZWwtPmdldFByb3BlcnRpZXMoKS0+c2V0Q3JlYXRlZCgkdmFsdWUpOw0KCQkJCQlicmVhazsNCg0KCQkJCWNhc2UgMHgwRDoJLy8JTW9kaWZpZWQgRGF0ZS9UaW1lDQoJCQkJCSR0aGlzLT5fcGhwRXhjZWwtPmdldFByb3BlcnRpZXMoKS0+c2V0TW9kaWZpZWQoJHZhbHVlKTsNCgkJCQkJYnJlYWs7DQoNCgkJCQljYXNlIDB4MEU6CS8vCU51bWJlciBvZiBQYWdlcw0KCQkJCQkvLwlOb3Qgc3VwcG9ydGVkIGJ5IFBIUEV4Y2VsDQoJCQkJCWJyZWFrOw0KDQoJCQkJY2FzZSAweDBGOgkvLwlOdW1iZXIgb2YgV29yZHMNCgkJCQkJLy8JTm90IHN1cHBvcnRlZCBieSBQSFBFeGNlbA0KCQkJCQlicmVhazsNCg0KCQkJCWNhc2UgMHgxMDoJLy8JTnVtYmVyIG9mIENoYXJhY3RlcnMNCgkJCQkJLy8JTm90IHN1cHBvcnRlZCBieSBQSFBFeGNlbA0KCQkJCQlicmVhazsNCg0KCQkJCWNhc2UgMHgxMToJLy8JVGh1bWJuYWlsDQoJCQkJCS8vCU5vdCBzdXBwb3J0ZWQgYnkgUEhQRXhjZWwNCgkJCQkJYnJlYWs7DQoNCgkJCQljYXNlIDB4MTI6CS8vCU5hbWUgb2YgY3JlYXRpbmcgYXBwbGljYXRpb24NCgkJCQkJLy8JTm90IHN1cHBvcnRlZCBieSBQSFBFeGNlbA0KCQkJCQlicmVhazsNCg0KCQkJCWNhc2UgMHgxMzoJLy8JU2VjdXJpdHkNCgkJCQkJLy8JTm90IHN1cHBvcnRlZCBieSBQSFBFeGNlbA0KCQkJCQlicmVhazsNCg0KCQkJfQ0KCQl9DQoJfQ0KDQoNCgkvKioNCgkgKiBSZWFkIGFkZGl0aW9uYWwgZG9jdW1lbnQgc3VtbWFyeSBpbmZvcm1hdGlvbg0KCSAqLw0KCXByaXZhdGUgZnVuY3Rpb24gX3JlYWREb2N1bWVudFN1bW1hcnlJbmZvcm1hdGlvbigpDQoJew0KCQlpZiAoIWlzc2V0KCR0aGlzLT5fZG9jdW1lbnRTdW1tYXJ5SW5mb3JtYXRpb24pKSB7DQoJCQlyZXR1cm47DQoJCX0NCg0KCQkvLwlvZmZzZXQ6IDA7CXNpemU6IDI7CW11c3QgYmUgMHhGRSAweEZGIChVVEYtMTYgTEUgYnl0ZSBvcmRlciBtYXJrKQ0KCQkvLwlvZmZzZXQ6IDI7CXNpemU6IDI7DQoJCS8vCW9mZnNldDogNDsJc2l6ZTogMjsJT1MgdmVyc2lvbg0KCQkvLwlvZmZzZXQ6IDY7CXNpemU6IDI7CU9TIGluZGljYXRvcg0KCQkvLwlvZmZzZXQ6IDg7CXNpemU6IDE2DQoJCS8vCW9mZnNldDogMjQ7CXNpemU6IDQ7CXNlY3Rpb24gY291bnQNCgkJJHNlY0NvdW50ID0gc2VsZjo6X0dldEludDRkKCR0aGlzLT5fZG9jdW1lbnRTdW1tYXJ5SW5mb3JtYXRpb24sIDI0KTsNCi8vCQllY2hvICckc2VjQ291bnQgPSAnLCRzZWNDb3VudCwnPGJyIC8+JzsNCg0KCQkvLyBvZmZzZXQ6IDI4OwlzaXplOiAxNjsJZmlyc3Qgc2VjdGlvbidzIGNsYXNzIGlkOiAwMiBkNSBjZCBkNSA5YyAyZSAxYiAxMCA5MyA5NyAwOCAwMCAyYiAyYyBmOSBhZQ0KCQkvLyBvZmZzZXQ6IDQ0OwlzaXplOiA0OwlmaXJzdCBzZWN0aW9uIG9mZnNldA0KCQkkc2VjT2Zmc2V0ID0gc2VsZjo6X0dldEludDRkKCR0aGlzLT5fZG9jdW1lbnRTdW1tYXJ5SW5mb3JtYXRpb24sIDQ0KTsNCi8vCQllY2hvICckc2VjT2Zmc2V0ID0gJywkc2VjT2Zmc2V0LCc8YnIgLz4nOw0KDQoJCS8vCXNlY3Rpb24gaGVhZGVyDQoJCS8vCW9mZnNldDogJHNlY09mZnNldDsJc2l6ZTogNDsJc2VjdGlvbiBsZW5ndGgNCgkJJHNlY0xlbmd0aCA9IHNlbGY6Ol9HZXRJbnQ0ZCgkdGhpcy0+X2RvY3VtZW50U3VtbWFyeUluZm9ybWF0aW9uLCAkc2VjT2Zmc2V0KTsNCi8vCQllY2hvICckc2VjTGVuZ3RoID0gJywkc2VjTGVuZ3RoLCc8YnIgLz4nOw0KDQoJCS8vCW9mZnNldDogJHNlY09mZnNldCs0OwlzaXplOiA0Owlwcm9wZXJ0eSBjb3VudA0KCQkkY291bnRQcm9wZXJ0aWVzID0gc2VsZjo6X0dldEludDRkKCR0aGlzLT5fZG9jdW1lbnRTdW1tYXJ5SW5mb3JtYXRpb24sICRzZWNPZmZzZXQrNCk7DQovLwkJZWNobyAnJGNvdW50UHJvcGVydGllcyA9ICcsJGNvdW50UHJvcGVydGllcywnPGJyIC8+JzsNCg0KCQkvLyBpbml0aWFsaXplIGNvZGUgcGFnZSAodXNlZCB0byByZXNvbHZlIHN0cmluZyB2YWx1ZXMpDQoJCSRjb2RlUGFnZSA9ICdDUDEyNTInOw0KDQoJCS8vCW9mZnNldDogKCRzZWNPZmZzZXQrOCk7CXNpemU6IHZhcg0KCQkvLwlsb29wIHRocm91Z2ggcHJvcGVydHkgZGVjYXJhdGlvbnMgYW5kIHByb3BlcnRpZXMNCgkJZm9yICgkaSA9IDA7ICRpIDwgJGNvdW50UHJvcGVydGllczsgKyskaSkgew0KLy8JCQllY2hvICdQcm9wZXJ0eSAnLCRpLCc8YnIgLz4nOw0KCQkJLy8Jb2Zmc2V0OiAoJHNlY09mZnNldCs4KSArICg4ICogJGkpOwlzaXplOiA0Owlwcm9wZXJ0eSBJRA0KCQkJJGlkID0gc2VsZjo6X0dldEludDRkKCR0aGlzLT5fZG9jdW1lbnRTdW1tYXJ5SW5mb3JtYXRpb24sICgkc2VjT2Zmc2V0KzgpICsgKDggKiAkaSkpOw0KLy8JCQllY2hvICdJRCBpcyAnLCRpZCwnPGJyIC8+JzsNCg0KCQkJLy8gVXNlIHZhbHVlIG9mIHByb3BlcnR5IGlkIGFzIGFwcHJvcHJpYXRlDQoJCQkvLyBvZmZzZXQ6IDYwICsgOCAqICRpOwlzaXplOiA0OwlvZmZzZXQgZnJvbSBiZWdpbm5pbmcgb2Ygc2VjdGlvbiAoNDgpDQoJCQkkb2Zmc2V0ID0gc2VsZjo6X0dldEludDRkKCR0aGlzLT5fZG9jdW1lbnRTdW1tYXJ5SW5mb3JtYXRpb24sICgkc2VjT2Zmc2V0KzEyKSArICg4ICogJGkpKTsNCg0KCQkJJHR5cGUgPSBzZWxmOjpfR2V0SW50NGQoJHRoaXMtPl9kb2N1bWVudFN1bW1hcnlJbmZvcm1hdGlvbiwgJHNlY09mZnNldCArICRvZmZzZXQpOw0KLy8JCQllY2hvICdUeXBlIGlzICcsJHR5cGUsJywgJzsNCg0KCQkJLy8gaW5pdGlhbGl6ZSBwcm9wZXJ0eSB2YWx1ZQ0KCQkJJHZhbHVlID0gbnVsbDsNCg0KCQkJLy8gZXh0cmFjdCBwcm9wZXJ0eSB2YWx1ZSBiYXNlZCBvbiBwcm9wZXJ0eSB0eXBlDQoJCQlzd2l0Y2ggKCR0eXBlKSB7DQoJCQkJY2FzZSAweDAyOgkvLwkyIGJ5dGUgc2lnbmVkIGludGVnZXINCgkJCQkJJHZhbHVlID0gc2VsZjo6X0dldEludDJkKCR0aGlzLT5fZG9jdW1lbnRTdW1tYXJ5SW5mb3JtYXRpb24sICRzZWNPZmZzZXQgKyA0ICsgJG9mZnNldCk7DQoJCQkJCWJyZWFrOw0KDQoJCQkJY2FzZSAweDAzOgkvLwk0IGJ5dGUgc2lnbmVkIGludGVnZXINCgkJCQkJJHZhbHVlID0gc2VsZjo6X0dldEludDRkKCR0aGlzLT5fZG9jdW1lbnRTdW1tYXJ5SW5mb3JtYXRpb24sICRzZWNPZmZzZXQgKyA0ICsgJG9mZnNldCk7DQoJCQkJCWJyZWFrOw0KDQoJCQkJY2FzZSAweDBCOiAgLy8gQm9vbGVhbg0KCQkJCQkkdmFsdWUgPSBzZWxmOjpfR2V0SW50MmQoJHRoaXMtPl9kb2N1bWVudFN1bW1hcnlJbmZvcm1hdGlvbiwgJHNlY09mZnNldCArIDQgKyAkb2Zmc2V0KTsNCgkJCQkJJHZhbHVlID0gKCR2YWx1ZSA9PSAwID8gZmFsc2UgOiB0cnVlKTsNCgkJCQkJYnJlYWs7DQoNCgkJCQljYXNlIDB4MTM6CS8vCTQgYnl0ZSB1bnNpZ25lZCBpbnRlZ2VyDQoJCQkJCS8vIG5vdCBuZWVkZWQgeWV0LCBmaXggbGF0ZXIgaWYgbmVjZXNzYXJ5DQoJCQkJCWJyZWFrOw0KDQoJCQkJY2FzZSAweDFFOgkvLwludWxsLXRlcm1pbmF0ZWQgc3RyaW5nIHByZXBlbmRlZCBieSBkd29yZCBzdHJpbmcgbGVuZ3RoDQoJCQkJCSRieXRlTGVuZ3RoID0gc2VsZjo6X0dldEludDRkKCR0aGlzLT5fZG9jdW1lbnRTdW1tYXJ5SW5mb3JtYXRpb24sICRzZWNPZmZzZXQgKyA0ICsgJG9mZnNldCk7DQoJCQkJCSR2YWx1ZSA9IHN1YnN0cigkdGhpcy0+X2RvY3VtZW50U3VtbWFyeUluZm9ybWF0aW9uLCAkc2VjT2Zmc2V0ICsgOCArICRvZmZzZXQsICRieXRlTGVuZ3RoKTsNCgkJCQkJJHZhbHVlID0gUEhQRXhjZWxfU2hhcmVkX1N0cmluZzo6Q29udmVydEVuY29kaW5nKCR2YWx1ZSwgJ1VURi04JywgJGNvZGVQYWdlKTsNCgkJCQkJJHZhbHVlID0gcnRyaW0oJHZhbHVlKTsNCgkJCQkJYnJlYWs7DQoNCgkJCQljYXNlIDB4NDA6CS8vCUZpbGV0aW1lICg2NC1iaXQgdmFsdWUgcmVwcmVzZW50aW5nIHRoZSBudW1iZXIgb2YgMTAwLW5hbm9zZWNvbmQgaW50ZXJ2YWxzIHNpbmNlIEphbnVhcnkgMSwgMTYwMSkNCgkJCQkJLy8gUEhQLVRpbWUNCgkJCQkJJHZhbHVlID0gUEhQRXhjZWxfU2hhcmVkX09MRTo6T0xFMkxvY2FsRGF0ZShzdWJzdHIoJHRoaXMtPl9kb2N1bWVudFN1bW1hcnlJbmZvcm1hdGlvbiwgJHNlY09mZnNldCArIDQgKyAkb2Zmc2V0LCA4KSk7DQoJCQkJCWJyZWFrOw0KDQoJCQkJY2FzZSAweDQ3OgkvLwlDbGlwYm9hcmQgZm9ybWF0DQoJCQkJCS8vIG5vdCBuZWVkZWQgeWV0LCBmaXggbGF0ZXIgaWYgbmVjZXNzYXJ5DQoJCQkJCWJyZWFrOw0KCQkJfQ0KDQoJCQlzd2l0Y2ggKCRpZCkgew0KCQkJCWNhc2UgMHgwMToJLy8JQ29kZSBQYWdlDQoJCQkJCSRjb2RlUGFnZSA9IFBIUEV4Y2VsX1NoYXJlZF9Db2RlUGFnZTo6TnVtYmVyVG9OYW1lKCR2YWx1ZSk7DQoJCQkJCWJyZWFrOw0KDQoJCQkJY2FzZSAweDAyOgkvLwlDYXRlZ29yeQ0KCQkJCQkkdGhpcy0+X3BocEV4Y2VsLT5nZXRQcm9wZXJ0aWVzKCktPnNldENhdGVnb3J5KCR2YWx1ZSk7DQoJCQkJCWJyZWFrOw0KDQoJCQkJY2FzZSAweDAzOgkvLwlQcmVzZW50YXRpb24gVGFyZ2V0DQoJCQkJCS8vCU5vdCBzdXBwb3J0ZWQgYnkgUEhQRXhjZWwNCgkJCQkJYnJlYWs7DQoNCgkJCQljYXNlIDB4MDQ6CS8vCUJ5dGVzDQoJCQkJCS8vCU5vdCBzdXBwb3J0ZWQgYnkgUEhQRXhjZWwNCgkJCQkJYnJlYWs7DQoNCgkJCQljYXNlIDB4MDU6CS8vCUxpbmVzDQoJCQkJCS8vCU5vdCBzdXBwb3J0ZWQgYnkgUEhQRXhjZWwNCgkJCQkJYnJlYWs7DQoNCgkJCQljYXNlIDB4MDY6CS8vCVBhcmFncmFwaHMNCgkJCQkJLy8JTm90IHN1cHBvcnRlZCBieSBQSFBFeGNlbA0KCQkJCQlicmVhazsNCg0KCQkJCWNhc2UgMHgwNzoJLy8JU2xpZGVzDQoJCQkJCS8vCU5vdCBzdXBwb3J0ZWQgYnkgUEhQRXhjZWwNCgkJCQkJYnJlYWs7DQoNCgkJCQljYXNlIDB4MDg6CS8vCU5vdGVzDQoJCQkJCS8vCU5vdCBzdXBwb3J0ZWQgYnkgUEhQRXhjZWwNCgkJCQkJYnJlYWs7DQoNCgkJCQljYXNlIDB4MDk6CS8vCUhpZGRlbiBTbGlkZXMNCgkJCQkJLy8JTm90IHN1cHBvcnRlZCBieSBQSFBFeGNlbA0KCQkJCQlicmVhazsNCg0KCQkJCWNhc2UgMHgwQToJLy8JTU0gQ2xpcHMNCgkJCQkJLy8JTm90IHN1cHBvcnRlZCBieSBQSFBFeGNlbA0KCQkJCQlicmVhazsNCg0KCQkJCWNhc2UgMHgwQjoJLy8JU2NhbGUgQ3JvcA0KCQkJCQkvLwlOb3Qgc3VwcG9ydGVkIGJ5IFBIUEV4Y2VsDQoJCQkJCWJyZWFrOw0KDQoJCQkJY2FzZSAweDBDOgkvLwlIZWFkaW5nIFBhaXJzDQoJCQkJCS8vCU5vdCBzdXBwb3J0ZWQgYnkgUEhQRXhjZWwNCgkJCQkJYnJlYWs7DQoNCgkJCQljYXNlIDB4MEQ6CS8vCVRpdGxlcyBvZiBQYXJ0cw0KCQkJCQkvLwlOb3Qgc3VwcG9ydGVkIGJ5IFBIUEV4Y2VsDQoJCQkJCWJyZWFrOw0KDQoJCQkJY2FzZSAweDBFOgkvLwlNYW5hZ2VyDQoJCQkJCSR0aGlzLT5fcGhwRXhjZWwtPmdldFByb3BlcnRpZXMoKS0+c2V0TWFuYWdlcigkdmFsdWUpOw0KCQkJCQlicmVhazsNCg0KCQkJCWNhc2UgMHgwRjoJLy8JQ29tcGFueQ0KCQkJCQkkdGhpcy0+X3BocEV4Y2VsLT5nZXRQcm9wZXJ0aWVzKCktPnNldENvbXBhbnkoJHZhbHVlKTsNCgkJCQkJYnJlYWs7DQoNCgkJCQljYXNlIDB4MTA6CS8vCUxpbmtzIHVwLXRvLWRhdGUNCgkJCQkJLy8JTm90IHN1cHBvcnRlZCBieSBQSFBFeGNlbA0KCQkJCQlicmVhazsNCg0KCQkJfQ0KCQl9DQoJfQ0KDQoNCgkvKioNCgkgKiBSZWFkcyBhIGdlbmVyYWwgdHlwZSBvZiBCSUZGIHJlY29yZC4gRG9lcyBub3RoaW5nIGV4Y2VwdCBmb3IgbW92aW5nIHN0cmVhbSBwb2ludGVyIGZvcndhcmQgdG8gbmV4dCByZWNvcmQuDQoJICovDQoJcHJpdmF0ZSBmdW5jdGlvbiBfcmVhZERlZmF1bHQoKQ0KCXsNCgkJJGxlbmd0aCA9IHNlbGY6Ol9HZXRJbnQyZCgkdGhpcy0+X2RhdGEsICR0aGlzLT5fcG9zICsgMik7DQovLwkJJHJlY29yZERhdGEgPSBzdWJzdHIoJHRoaXMtPl9kYXRhLCAkdGhpcy0+X3BvcyArIDQsICRsZW5ndGgpOw0KDQoJCS8vIG1vdmUgc3RyZWFtIHBvaW50ZXIgdG8gbmV4dCByZWNvcmQNCgkJJHRoaXMtPl9wb3MgKz0gNCArICRsZW5ndGg7DQoJfQ0KDQoNCgkvKioNCgkgKglUaGUgTk9URSByZWNvcmQgc3BlY2lmaWVzIGEgY29tbWVudCBhc3NvY2lhdGVkIHdpdGggYSBwYXJ0aWN1bGFyIGNlbGwuIEluIEV4Y2VsIDk1IChCSUZGNykgYW5kIGVhcmxpZXIgdmVyc2lvbnMsDQoJICoJCXRoaXMgcmVjb3JkIHN0b3JlcyBhIG5vdGUgKGNlbGwgbm90ZSkuIFRoaXMgZmVhdHVyZSB3YXMgc2lnbmlmaWNhbnRseSBlbmhhbmNlZCBpbiBFeGNlbCA5Ny4NCgkgKi8NCglwcml2YXRlIGZ1bmN0aW9uIF9yZWFkTm90ZSgpDQoJew0KLy8JCWVjaG8gJzxiPlJlYWQgQ2VsbCBBbm5vdGF0aW9uPC9iPjxiciAvPic7DQoJCSRsZW5ndGggPSBzZWxmOjpfR2V0SW50MmQoJHRoaXMtPl9kYXRhLCAkdGhpcy0+X3BvcyArIDIpOw0KCQkkcmVjb3JkRGF0YSA9IHN1YnN0cigkdGhpcy0+X2RhdGEsICR0aGlzLT5fcG9zICsgNCwgJGxlbmd0aCk7DQoNCgkJLy8gbW92ZSBzdHJlYW0gcG9pbnRlciB0byBuZXh0IHJlY29yZA0KCQkkdGhpcy0+X3BvcyArPSA0ICsgJGxlbmd0aDsNCg0KCQlpZiAoJHRoaXMtPl9yZWFkRGF0YU9ubHkpIHsNCgkJCXJldHVybjsNCgkJfQ0KDQoJCSRjZWxsQWRkcmVzcyA9ICR0aGlzLT5fcmVhZEJJRkY4Q2VsbEFkZHJlc3Moc3Vic3RyKCRyZWNvcmREYXRhLCAwLCA0KSk7DQoJCWlmICgkdGhpcy0+X3ZlcnNpb24gPT0gc2VsZjo6WExTX0JJRkY4KSB7DQoJCQkkbm90ZU9iaklEID0gc2VsZjo6X0dldEludDJkKCRyZWNvcmREYXRhLCA2KTsNCgkJCSRub3RlQXV0aG9yID0gc2VsZjo6X3JlYWRVbmljb2RlU3RyaW5nTG9uZyhzdWJzdHIoJHJlY29yZERhdGEsIDgpKTsNCgkJCSRub3RlQXV0aG9yID0gJG5vdGVBdXRob3JbJ3ZhbHVlJ107DQovLwkJCWVjaG8gJ05vdGUgQWRkcmVzcz0nLCRjZWxsQWRkcmVzcywnPGJyIC8+JzsNCi8vCQkJZWNobyAnTm90ZSBPYmplY3QgSUQ9Jywkbm90ZU9iaklELCc8YnIgLz4nOw0KLy8JCQllY2hvICdOb3RlIEF1dGhvcj0nLCRub3RlQXV0aG9yLCc8aHIgLz4nOw0KLy8NCgkJCSR0aGlzLT5fY2VsbE5vdGVzWyRub3RlT2JqSURdID0gYXJyYXkoJ2NlbGxSZWYnCQk9PiAkY2VsbEFkZHJlc3MsDQoJCQkJCQkJCQkJCQkgICdvYmplY3RJRCcJPT4gJG5vdGVPYmpJRCwNCgkJCQkJCQkJCQkJCSAgJ2F1dGhvcicJCT0+ICRub3RlQXV0aG9yDQoJCQkJCQkJCQkJCQkgKTsNCgkJfSBlbHNlIHsNCgkJCSRleHRlbnNpb24gPSBmYWxzZTsNCgkJCWlmICgkY2VsbEFkZHJlc3MgPT0gJyRCJDY1NTM2Jykgew0KCQkJCS8vCUlmIHRoZSBhZGRyZXNzIHJvdyBpcyAtMSBhbmQgdGhlIGNvbHVtbiBpcyAwLCAod2hpY2ggdHJhbnNsYXRlcyBhcyAkQiQ2NTUzNikgdGhlbiB0aGlzIGlzIGEgY29udGludWF0aW9uDQoJCQkJLy8JCW5vdGUgZnJvbSB0aGUgcHJldmlvdXMgY2VsbCBhbm5vdGF0aW9uLiBXZSdyZSBub3QgeWV0IGhhbmRsaW5nIHRoaXMsIHNvIGFubm90YXRpb25zIGxvbmdlciB0aGFuIHRoZQ0KCQkJCS8vCQltYXggMjA0OCBieXRlcyB3aWxsIHByb2JhYmx5IHRocm93IGEgd29iYmx5Lg0KCQkJCSRyb3cgPSBzZWxmOjpfR2V0SW50MmQoJHJlY29yZERhdGEsIDApOw0KCQkJCSRleHRlbnNpb24gPSB0cnVlOw0KCQkJCSRjZWxsQWRkcmVzcyA9IGFycmF5X3BvcChhcnJheV9rZXlzKCR0aGlzLT5fcGhwU2hlZXQtPmdldENvbW1lbnRzKCkpKTsNCgkJCX0NCi8vCQkJZWNobyAnTm90ZSBBZGRyZXNzPScsJGNlbGxBZGRyZXNzLCc8YnIgLz4nOw0KDQoJCQkkY2VsbEFkZHJlc3MgPSBzdHJfcmVwbGFjZSgnJCcsJycsJGNlbGxBZGRyZXNzKTsNCgkJCSRub3RlTGVuZ3RoID0gc2VsZjo6X0dldEludDJkKCRyZWNvcmREYXRhLCA0KTsNCgkJCSRub3RlVGV4dCA9IHRyaW0oc3Vic3RyKCRyZWNvcmREYXRhLCA2KSk7DQovLwkJCWVjaG8gJ05vdGUgTGVuZ3RoPScsJG5vdGVMZW5ndGgsJzxiciAvPic7DQovLwkJCWVjaG8gJ05vdGUgVGV4dD0nLCRub3RlVGV4dCwnPGJyIC8+JzsNCg0KCQkJaWYgKCRleHRlbnNpb24pIHsNCgkJCQkvLwlDb25jYXRlbmF0ZSB0aGlzIGV4dGVuc2lvbiB3aXRoIHRoZSBjdXJyZW50bHkgc2V0IGNvbW1lbnQgZm9yIHRoZSBjZWxsDQoJCQkJJGNvbW1lbnQgPSAkdGhpcy0+X3BocFNoZWV0LT5nZXRDb21tZW50KCAkY2VsbEFkZHJlc3MgKTsNCgkJCQkkY29tbWVudFRleHQgPSAkY29tbWVudC0+Z2V0VGV4dCgpLT5nZXRQbGFpblRleHQoKTsNCgkJCQkkY29tbWVudC0+c2V0VGV4dCgkdGhpcy0+X3BhcnNlUmljaFRleHQoJGNvbW1lbnRUZXh0LiRub3RlVGV4dCkgKTsNCgkJCX0gZWxzZSB7DQoJCQkJLy8JU2V0IGNvbW1lbnQgZm9yIHRoZSBjZWxsDQoJCQkJJHRoaXMtPl9waHBTaGVldC0+Z2V0Q29tbWVudCggJGNlbGxBZGRyZXNzICkNCi8vCQkJCQkJCQkJCQkJCS0+c2V0QXV0aG9yKCAkYXV0aG9yICkNCgkJCQkJCQkJCQkJCQktPnNldFRleHQoJHRoaXMtPl9wYXJzZVJpY2hUZXh0KCRub3RlVGV4dCkgKTsNCgkJCX0NCgkJfQ0KDQoJfQ0KDQoNCgkvKioNCgkgKglUaGUgVEVYVCBPYmplY3QgcmVjb3JkIGNvbnRhaW5zIHRoZSB0ZXh0IGFzc29jaWF0ZWQgd2l0aCBhIGNlbGwgYW5ub3RhdGlvbi4NCgkgKi8NCglwcml2YXRlIGZ1bmN0aW9uIF9yZWFkVGV4dE9iamVjdCgpDQoJew0KCQkkbGVuZ3RoID0gc2VsZjo6X0dldEludDJkKCR0aGlzLT5fZGF0YSwgJHRoaXMtPl9wb3MgKyAyKTsNCgkJJHJlY29yZERhdGEgPSBzdWJzdHIoJHRoaXMtPl9kYXRhLCAkdGhpcy0+X3BvcyArIDQsICRsZW5ndGgpOw0KDQoJCS8vIG1vdmUgc3RyZWFtIHBvaW50ZXIgdG8gbmV4dCByZWNvcmQNCgkJJHRoaXMtPl9wb3MgKz0gNCArICRsZW5ndGg7DQoNCgkJaWYgKCR0aGlzLT5fcmVhZERhdGFPbmx5KSB7DQoJCQlyZXR1cm47DQoJCX0NCg0KCQkvLyByZWNvcmREYXRhIGNvbnNpc3RzIG9mIGFuIGFycmF5IG9mIHN1YnJlY29yZHMgbG9va2luZyBsaWtlIHRoaXM6DQoJCS8vCWdyYml0OiAyIGJ5dGVzOyBPcHRpb24gRmxhZ3MNCgkJLy8Jcm90OiAyIGJ5dGVzOyByb3RhdGlvbg0KCQkvLwljY2hUZXh0OiAyIGJ5dGVzOyBsZW5ndGggb2YgdGhlIHRleHQgKGluIHRoZSBmaXJzdCBjb250aW51ZSByZWNvcmQpDQoJCS8vCWNiUnVuczogMiBieXRlczsgbGVuZ3RoIG9mIHRoZSBmb3JtYXR0aW5nIChpbiB0aGUgc2Vjb25kIGNvbnRpbnVlIHJlY29yZCkNCgkJLy8gZm9sbG93ZWQgYnkgdGhlIGNvbnRpbnVhdGlvbiByZWNvcmRzIGNvbnRhaW5pbmcgdGhlIGFjdHVhbCB0ZXh0IGFuZCBmb3JtYXR0aW5nDQoJCSRncmJpdE9wdHMJPSBzZWxmOjpfR2V0SW50MmQoJHJlY29yZERhdGEsIDApOw0KCQkkcm90CQk9IHNlbGY6Ol9HZXRJbnQyZCgkcmVjb3JkRGF0YSwgMik7DQoJCSRjY2hUZXh0CT0gc2VsZjo6X0dldEludDJkKCRyZWNvcmREYXRhLCAxMCk7DQoJCSRjYlJ1bnMJCT0gc2VsZjo6X0dldEludDJkKCRyZWNvcmREYXRhLCAxMik7DQoJCSR0ZXh0CQk9ICR0aGlzLT5fZ2V0U3BsaWNlZFJlY29yZERhdGEoKTsNCg0KCQkkdGhpcy0+X3RleHRPYmplY3RzWyR0aGlzLT50ZXh0T2JqUmVmXSA9IGFycmF5KA0KCQkJCSd0ZXh0JwkJPT4gc3Vic3RyKCR0ZXh0WyJyZWNvcmREYXRhIl0sJHRleHRbInNwbGljZU9mZnNldHMiXVswXSsxLCRjY2hUZXh0KSwNCgkJCQknZm9ybWF0Jwk9PiBzdWJzdHIoJHRleHRbInJlY29yZERhdGEiXSwkdGV4dFsic3BsaWNlT2Zmc2V0cyJdWzFdLCRjYlJ1bnMpLA0KCQkJCSdhbGlnbm1lbnQnCT0+ICRncmJpdE9wdHMsDQoJCQkJJ3JvdGF0aW9uJwk9PiAkcm90DQoJCQkgKTsNCg0KLy8JCWVjaG8gJzxiPl9yZWFkVGV4dE9iamVjdCgpPC9iPjxiciAvPic7DQovLwkJdmFyX2R1bXAoJHRoaXMtPl90ZXh0T2JqZWN0c1skdGhpcy0+dGV4dE9ialJlZl0pOw0KLy8JCWVjaG8gJzxiciAvPic7DQoJfQ0KDQoNCgkvKioNCgkgKiBSZWFkIEJPRg0KCSAqLw0KCXByaXZhdGUgZnVuY3Rpb24gX3JlYWRCb2YoKQ0KCXsNCgkJJGxlbmd0aCA9IHNlbGY6Ol9HZXRJbnQyZCgkdGhpcy0+X2RhdGEsICR0aGlzLT5fcG9zICsgMik7DQoJCSRyZWNvcmREYXRhID0gc3Vic3RyKCR0aGlzLT5fZGF0YSwgJHRoaXMtPl9wb3MgKyA0LCAkbGVuZ3RoKTsNCg0KCQkvLyBtb3ZlIHN0cmVhbSBwb2ludGVyIHRvIG5leHQgcmVjb3JkDQoJCSR0aGlzLT5fcG9zICs9IDQgKyAkbGVuZ3RoOw0KDQoJCS8vIG9mZnNldDogMjsgc2l6ZTogMjsgdHlwZSBvZiB0aGUgZm9sbG93aW5nIGRhdGENCgkJJHN1YnN0cmVhbVR5cGUgPSBzZWxmOjpfR2V0SW50MmQoJHJlY29yZERhdGEsIDIpOw0KDQoJCXN3aXRjaCAoJHN1YnN0cmVhbVR5cGUpIHsNCgkJCWNhc2Ugc2VsZjo6WExTX1dvcmtib29rR2xvYmFsczoNCgkJCQkkdmVyc2lvbiA9IHNlbGY6Ol9HZXRJbnQyZCgkcmVjb3JkRGF0YSwgMCk7DQoJCQkJaWYgKCgkdmVyc2lvbiAhPSBzZWxmOjpYTFNfQklGRjgpICYmICgkdmVyc2lvbiAhPSBzZWxmOjpYTFNfQklGRjcpKSB7DQoJCQkJCXRocm93IG5ldyBFeGNlcHRpb24oJ0Nhbm5vdCByZWFkIHRoaXMgRXhjZWwgZmlsZS4gVmVyc2lvbiBpcyB0b28gb2xkLicpOw0KCQkJCX0NCgkJCQkkdGhpcy0+X3ZlcnNpb24gPSAkdmVyc2lvbjsNCgkJCQlicmVhazsNCg0KCQkJY2FzZSBzZWxmOjpYTFNfV29ya3NoZWV0Og0KCQkJCS8vIGRvIG5vdCB1c2UgdGhpcyB2ZXJzaW9uIGluZm9ybWF0aW9uIGZvciBhbnl0aGluZw0KCQkJCS8vIGl0IGlzIHVucmVsaWFibGUgKE9wZW5PZmZpY2UgZG9jLCA1LjgpLCB1c2Ugb25seSB2ZXJzaW9uIGluZm9ybWF0aW9uIGZyb20gdGhlIGdsb2JhbCBzdHJlYW0NCgkJCQlicmVhazsNCg0KCQkJZGVmYXVsdDoNCgkJCQkvLyBzdWJzdHJlYW0sIGUuZy4gY2hhcnQNCgkJCQkvLyBqdXN0IHNraXAgdGhlIGVudGlyZSBzdWJzdHJlYW0NCgkJCQlkbyB7DQoJCQkJCSRjb2RlID0gc2VsZjo6X0dldEludDJkKCR0aGlzLT5fZGF0YSwgJHRoaXMtPl9wb3MpOw0KCQkJCQkkdGhpcy0+X3JlYWREZWZhdWx0KCk7DQoJCQkJfSB3aGlsZSAoJGNvZGUgIT0gc2VsZjo6WExTX1R5cGVfRU9GICYmICR0aGlzLT5fcG9zIDwgJHRoaXMtPl9kYXRhU2l6ZSk7DQoJCQkJYnJlYWs7DQoJCX0NCgl9DQoNCg0KCS8qKg0KCSAqIEZJTEVQQVNTDQoJICoNCgkgKiBUaGlzIHJlY29yZCBpcyBwYXJ0IG9mIHRoZSBGaWxlIFByb3RlY3Rpb24gQmxvY2suIEl0DQoJICogY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHJlYWQvd3JpdGUgcGFzc3dvcmQgb2YgdGhlDQoJICogZmlsZS4gQWxsIHJlY29yZCBjb250ZW50cyBmb2xsb3dpbmcgdGhpcyByZWNvcmQgd2lsbCBiZQ0KCSAqIGVuY3J5cHRlZC4NCgkgKg0KCSAqIC0tCSJPcGVuT2ZmaWNlLm9yZydzIERvY3VtZW50YXRpb24gb2YgdGhlIE1pY3Jvc29mdA0KCSAqIAkJRXhjZWwgRmlsZSBGb3JtYXQiDQoJICovDQoJcHJpdmF0ZSBmdW5jdGlvbiBfcmVhZEZpbGVwYXNzKCkNCgl7DQoJCSRsZW5ndGggPSBzZWxmOjpfR2V0SW50MmQoJHRoaXMtPl9kYXRhLCAkdGhpcy0+X3BvcyArIDIpOw0KLy8JCSRyZWNvcmREYXRhID0gc3Vic3RyKCR0aGlzLT5fZGF0YSwgJHRoaXMtPl9wb3MgKyA0LCAkbGVuZ3RoKTsNCg0KCQkvLyBtb3ZlIHN0cmVhbSBwb2ludGVyIHRvIG5leHQgcmVjb3JkDQoJCSR0aGlzLT5fcG9zICs9IDQgKyAkbGVuZ3RoOw0KDQoJCXRocm93IG5ldyBFeGNlcHRpb24oJ0Nhbm5vdCByZWFkIGVuY3J5cHRlZCBmaWxlJyk7DQoJfQ0KDQoNCgkvKioNCgkgKiBDT0RFUEFHRQ0KCSAqDQoJICogVGhpcyByZWNvcmQgc3RvcmVzIHRoZSB0ZXh0IGVuY29kaW5nIHVzZWQgdG8gd3JpdGUgYnl0ZQ0KCSAqIHN0cmluZ3MsIHN0b3JlZCBhcyBNUyBXaW5kb3dzIGNvZGUgcGFnZSBpZGVudGlmaWVyLg0KCSAqDQoJICogLS0JIk9wZW5PZmZpY2Uub3JnJ3MgRG9jdW1lbnRhdGlvbiBvZiB0aGUgTWljcm9zb2Z0DQoJICogCQlFeGNlbCBGaWxlIEZvcm1hdCINCgkgKi8NCglwcml2YXRlIGZ1bmN0aW9uIF9yZWFkQ29kZXBhZ2UoKQ0KCXsNCgkJJGxlbmd0aCA9IHNlbGY6Ol9HZXRJbnQyZCgkdGhpcy0+X2RhdGEsICR0aGlzLT5fcG9zICsgMik7DQoJCSRyZWNvcmREYXRhID0gc3Vic3RyKCR0aGlzLT5fZGF0YSwgJHRoaXMtPl9wb3MgKyA0LCAkbGVuZ3RoKTsNCg0KCQkvLyBtb3ZlIHN0cmVhbSBwb2ludGVyIHRvIG5leHQgcmVjb3JkDQoJCSR0aGlzLT5fcG9zICs9IDQgKyAkbGVuZ3RoOw0KDQoJCS8vIG9mZnNldDogMDsgc2l6ZTogMjsgY29kZSBwYWdlIGlkZW50aWZpZXINCgkJJGNvZGVwYWdlID0gc2VsZjo6X0dldEludDJkKCRyZWNvcmREYXRhLCAwKTsNCg0KCQkkdGhpcy0+X2NvZGVwYWdlID0gUEhQRXhjZWxfU2hhcmVkX0NvZGVQYWdlOjpOdW1iZXJUb05hbWUoJGNvZGVwYWdlKTsNCgl9DQoNCg0KCS8qKg0KCSAqIERBVEVNT0RFDQoJICoNCgkgKiBUaGlzIHJlY29yZCBzcGVjaWZpZXMgdGhlIGJhc2UgZGF0ZSBmb3IgZGlzcGxheWluZyBkYXRlDQoJICogdmFsdWVzLiBBbGwgZGF0ZXMgYXJlIHN0b3JlZCBhcyBjb3VudCBvZiBkYXlzIHBhc3QgdGhpcw0KCSAqIGJhc2UgZGF0ZS4gSW4gQklGRjItQklGRjQgdGhpcyByZWNvcmQgaXMgcGFydCBvZiB0aGUNCgkgKiBDYWxjdWxhdGlvbiBTZXR0aW5ncyBCbG9jay4gSW4gQklGRjUtQklGRjggaXQgaXMNCgkgKiBzdG9yZWQgaW4gdGhlIFdvcmtib29rIEdsb2JhbHMgU3Vic3RyZWFtLg0KCSAqDQoJICogLS0JIk9wZW5PZmZpY2Uub3JnJ3MgRG9jdW1lbnRhdGlvbiBvZiB0aGUgTWljcm9zb2Z0DQoJICogCQlFeGNlbCBGaWxlIEZvcm1hdCINCgkgKi8NCglwcml2YXRlIGZ1bmN0aW9uIF9yZWFkRGF0ZU1vZGUoKQ0KCXsNCgkJJGxlbmd0aCA9IHNlbGY6Ol9HZXRJbnQyZCgkdGhpcy0+X2RhdGEsICR0aGlzLT5fcG9zICsgMik7DQoJCSRyZWNvcmREYXRhID0gc3Vic3RyKCR0aGlzLT5fZGF0YSwgJHRoaXMtPl9wb3MgKyA0LCAkbGVuZ3RoKTsNCg0KCQkvLyBtb3ZlIHN0cmVhbSBwb2ludGVyIHRvIG5leHQgcmVjb3JkDQoJCSR0aGlzLT5fcG9zICs9IDQgKyAkbGVuZ3RoOw0KDQoJCS8vIG9mZnNldDogMDsgc2l6ZTogMjsgMCA9IGJhc2UgMTkwMCwgMSA9IGJhc2UgMTkwNA0KCQlQSFBFeGNlbF9TaGFyZWRfRGF0ZTo6c2V0RXhjZWxDYWxlbmRhcihQSFBFeGNlbF9TaGFyZWRfRGF0ZTo6Q0FMRU5EQVJfV0lORE9XU18xOTAwKTsNCgkJaWYgKG9yZCgkcmVjb3JkRGF0YXswfSkgPT0gMSkgew0KCQkJUEhQRXhjZWxfU2hhcmVkX0RhdGU6OnNldEV4Y2VsQ2FsZW5kYXIoUEhQRXhjZWxfU2hhcmVkX0RhdGU6OkNBTEVOREFSX01BQ18xOTA0KTsNCgkJfQ0KCX0NCg0KDQoJLyoqDQoJICogUmVhZCBhIEZPTlQgcmVjb3JkDQoJICovDQoJcHJpdmF0ZSBmdW5jdGlvbiBfcmVhZEZvbnQoKQ0KCXsNCgkJJGxlbmd0aCA9IHNlbGY6Ol9HZXRJbnQyZCgkdGhpcy0+X2RhdGEsICR0aGlzLT5fcG9zICsgMik7DQoJCSRyZWNvcmREYXRhID0gc3Vic3RyKCR0aGlzLT5fZGF0YSwgJHRoaXMtPl9wb3MgKyA0LCAkbGVuZ3RoKTsNCg0KCQkvLyBtb3ZlIHN0cmVhbSBwb2ludGVyIHRvIG5leHQgcmVjb3JkDQoJCSR0aGlzLT5fcG9zICs9IDQgKyAkbGVuZ3RoOw0KDQoJCWlmICghJHRoaXMtPl9yZWFkRGF0YU9ubHkpIHsNCgkJCSRvYmpGb250ID0gbmV3IFBIUEV4Y2VsX1N0eWxlX0ZvbnQoKTsNCg0KCQkJLy8gb2Zmc2V0OiAwOyBzaXplOiAyOyBoZWlnaHQgb2YgdGhlIGZvbnQgKGluIHR3aXBzID0gMS8yMCBvZiBhIHBvaW50KQ0KCQkJJHNpemUgPSBzZWxmOjpfR2V0SW50MmQoJHJlY29yZERhdGEsIDApOw0KCQkJJG9iakZvbnQtPnNldFNpemUoJHNpemUgLyAyMCk7DQoNCgkJCS8vIG9mZnNldDogMjsgc2l6ZTogMjsgb3B0aW9uIGZsYWdzDQoJCQkJLy8gYml0OiAwOyBtYXNrIDB4MDAwMTsgYm9sZCAocmVkdW5kYW50IGluIEJJRkY1LUJJRkY4KQ0KCQkJCS8vIGJpdDogMTsgbWFzayAweDAwMDI7IGl0YWxpYw0KCQkJCSRpc0l0YWxpYyA9ICgweDAwMDIgJiBzZWxmOjpfR2V0SW50MmQoJHJlY29yZERhdGEsIDIpKSA+PiAxOw0KCQkJCWlmICgkaXNJdGFsaWMpICRvYmpGb250LT5zZXRJdGFsaWModHJ1ZSk7DQoNCgkJCQkvLyBiaXQ6IDI7IG1hc2sgMHgwMDA0OyB1bmRlcmxpbmVkIChyZWR1bmRhbnQgaW4gQklGRjUtQklGRjgpDQoJCQkJLy8gYml0OiAzOyBtYXNrIDB4MDAwODsgc3RyaWtlDQoJCQkJJGlzU3RyaWtlID0gKDB4MDAwOCAmIHNlbGY6Ol9HZXRJbnQyZCgkcmVjb3JkRGF0YSwgMikpID4+IDM7DQoJCQkJaWYgKCRpc1N0cmlrZSkgJG9iakZvbnQtPnNldFN0cmlrZXRocm91Z2godHJ1ZSk7DQoNCgkJCS8vIG9mZnNldDogNDsgc2l6ZTogMjsgY29sb3VyIGluZGV4DQoJCQkkY29sb3JJbmRleCA9IHNlbGY6Ol9HZXRJbnQyZCgkcmVjb3JkRGF0YSwgNCk7DQoJCQkkb2JqRm9udC0+Y29sb3JJbmRleCA9ICRjb2xvckluZGV4Ow0KDQoJCQkvLyBvZmZzZXQ6IDY7IHNpemU6IDI7IGZvbnQgd2VpZ2h0DQoJCQkkd2VpZ2h0ID0gc2VsZjo6X0dldEludDJkKCRyZWNvcmREYXRhLCA2KTsNCgkJCXN3aXRjaCAoJHdlaWdodCkgew0KCQkJCWNhc2UgMHgwMkJDOg0KCQkJCQkkb2JqRm9udC0+c2V0Qm9sZCh0cnVlKTsNCgkJCQkJYnJlYWs7DQoJCQl9DQoNCgkJCS8vIG9mZnNldDogODsgc2l6ZTogMjsgZXNjYXBlbWVudCB0eXBlDQoJCQkkZXNjYXBlbWVudCA9IHNlbGY6Ol9HZXRJbnQyZCgkcmVjb3JkRGF0YSwgOCk7DQoJCQlzd2l0Y2ggKCRlc2NhcGVtZW50KSB7DQoJCQkJY2FzZSAweDAwMDE6DQoJCQkJCSRvYmpGb250LT5zZXRTdXBlclNjcmlwdCh0cnVlKTsNCgkJCQkJYnJlYWs7DQoJCQkJY2FzZSAweDAwMDI6DQoJCQkJCSRvYmpGb250LT5zZXRTdWJTY3JpcHQodHJ1ZSk7DQoJCQkJCWJyZWFrOw0KCQkJfQ0KDQoJCQkvLyBvZmZzZXQ6IDEwOyBzaXplOiAxOyB1bmRlcmxpbmUgdHlwZQ0KCQkJJHVuZGVybGluZVR5cGUgPSBvcmQoJHJlY29yZERhdGF7MTB9KTsNCgkJCXN3aXRjaCAoJHVuZGVybGluZVR5cGUpIHsNCgkJCQljYXNlIDB4MDA6DQoJCQkJCWJyZWFrOyAvLyBubyB1bmRlcmxpbmUNCgkJCQljYXNlIDB4MDE6DQoJCQkJCSRvYmpGb250LT5zZXRVbmRlcmxpbmUoUEhQRXhjZWxfU3R5bGVfRm9udDo6VU5ERVJMSU5FX1NJTkdMRSk7DQoJCQkJCWJyZWFrOw0KCQkJCWNhc2UgMHgwMjoNCgkJCQkJJG9iakZvbnQtPnNldFVuZGVybGluZShQSFBFeGNlbF9TdHlsZV9Gb250OjpVTkRFUkxJTkVfRE9VQkxFKTsNCgkJCQkJYnJlYWs7DQoJCQkJY2FzZSAweDIxOg0KCQkJCQkkb2JqRm9udC0+c2V0VW5kZXJsaW5lKFBIUEV4Y2VsX1N0eWxlX0ZvbnQ6OlVOREVSTElORV9TSU5HTEVBQ0NPVU5USU5HKTsNCgkJCQkJYnJlYWs7DQoJCQkJY2FzZSAweDIyOg0KCQkJCQkkb2JqRm9udC0+c2V0VW5kZXJsaW5lKFBIUEV4Y2VsX1N0eWxlX0ZvbnQ6OlVOREVSTElORV9ET1VCTEVBQ0NPVU5USU5HKTsNCgkJCQkJYnJlYWs7DQoJCQl9DQoNCgkJCS8vIG9mZnNldDogMTE7IHNpemU6IDE7IGZvbnQgZmFtaWx5DQoJCQkvLyBvZmZzZXQ6IDEyOyBzaXplOiAxOyBjaGFyYWN0ZXIgc2V0DQoJCQkvLyBvZmZzZXQ6IDEzOyBzaXplOiAxOyBub3QgdXNlZA0KCQkJLy8gb2Zmc2V0OiAxNDsgc2l6ZTogdmFyOyBmb250IG5hbWUNCgkJCWlmICgkdGhpcy0+X3ZlcnNpb24gPT0gc2VsZjo6WExTX0JJRkY4KSB7DQoJCQkJJHN0cmluZyA9IHNlbGY6Ol9yZWFkVW5pY29kZVN0cmluZ1Nob3J0KHN1YnN0cigkcmVjb3JkRGF0YSwgMTQpKTsNCgkJCX0gZWxzZSB7DQoJCQkJJHN0cmluZyA9ICR0aGlzLT5fcmVhZEJ5dGVTdHJpbmdTaG9ydChzdWJzdHIoJHJlY29yZERhdGEsIDE0KSk7DQoJCQl9DQoJCQkkb2JqRm9udC0+c2V0TmFtZSgkc3RyaW5nWyd2YWx1ZSddKTsNCg0KCQkJJHRoaXMtPl9vYmpGb250c1tdID0gJG9iakZvbnQ7DQoJCX0NCgl9DQoNCg0KCS8qKg0KCSAqIEZPUk1BVA0KCSAqDQoJICogVGhpcyByZWNvcmQgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYSBudW1iZXIgZm9ybWF0Lg0KCSAqIEFsbCBGT1JNQVQgcmVjb3JkcyBvY2N1ciB0b2dldGhlciBpbiBhIHNlcXVlbnRpYWwgbGlzdC4NCgkgKg0KCSAqIEluIEJJRkYyLUJJRkY0IG90aGVyIHJlY29yZHMgcmVmZXJlbmNpbmcgYSBGT1JNQVQgcmVjb3JkDQoJICogY29udGFpbiBhIHplcm8tYmFzZWQgaW5kZXggaW50byB0aGlzIGxpc3QuIEZyb20gQklGRjUgb24NCgkgKiB0aGUgRk9STUFUIHJlY29yZCBjb250YWlucyB0aGUgaW5kZXggaXRzZWxmIHRoYXQgd2lsbCBiZQ0KCSAqIHVzZWQgYnkgb3RoZXIgcmVjb3Jkcy4NCgkgKg0KCSAqIC0tCSJPcGVuT2ZmaWNlLm9yZydzIERvY3VtZW50YXRpb24gb2YgdGhlIE1pY3Jvc29mdA0KCSAqIAkJRXhjZWwgRmlsZSBGb3JtYXQiDQoJICovDQoJcHJpdmF0ZSBmdW5jdGlvbiBfcmVhZEZvcm1hdCgpDQoJew0KCQkkbGVuZ3RoID0gc2VsZjo6X0dldEludDJkKCR0aGlzLT5fZGF0YSwgJHRoaXMtPl9wb3MgKyAyKTsNCgkJJHJlY29yZERhdGEgPSBzdWJzdHIoJHRoaXMtPl9kYXRhLCAkdGhpcy0+X3BvcyArIDQsICRsZW5ndGgpOw0KDQoJCS8vIG1vdmUgc3RyZWFtIHBvaW50ZXIgdG8gbmV4dCByZWNvcmQNCgkJJHRoaXMtPl9wb3MgKz0gNCArICRsZW5ndGg7DQoNCgkJaWYgKCEkdGhpcy0+X3JlYWREYXRhT25seSkgew0KCQkJJGluZGV4Q29kZSA9IHNlbGY6Ol9HZXRJbnQyZCgkcmVjb3JkRGF0YSwgMCk7DQoNCgkJCWlmICgkdGhpcy0+X3ZlcnNpb24gPT0gc2VsZjo6WExTX0JJRkY4KSB7DQoJCQkJJHN0cmluZyA9IHNlbGY6Ol9yZWFkVW5pY29kZVN0cmluZ0xvbmcoc3Vic3RyKCRyZWNvcmREYXRhLCAyKSk7DQoJCQl9IGVsc2Ugew0KCQkJCS8vIEJJRkY3DQoJCQkJJHN0cmluZyA9ICR0aGlzLT5fcmVhZEJ5dGVTdHJpbmdTaG9ydChzdWJzdHIoJHJlY29yZERhdGEsIDIpKTsNCgkJCX0NCg0KCQkJJGZvcm1hdFN0cmluZyA9ICRzdHJpbmdbJ3ZhbHVlJ107DQoJCQkkdGhpcy0+X2Zvcm1hdHNbJGluZGV4Q29kZV0gPSAkZm9ybWF0U3RyaW5nOw0KCQl9DQoJfQ0KDQoNCgkvKioNCgkgKiBYRiAtIEV4dGVuZGVkIEZvcm1hdA0KCSAqDQoJICogVGhpcyByZWNvcmQgY29udGFpbnMgZm9ybWF0dGluZyBpbmZvcm1hdGlvbiBmb3IgY2VsbHMsIHJvd3MsIGNvbHVtbnMgb3Igc3R5bGVzLg0KCSAqIEFjY29yZGluZyB0byBodHRwOi8vc3VwcG9ydC5taWNyb3NvZnQuY29tL2tiLzE0NzczMiB0aGVyZSBhcmUgYWx3YXlzIGF0IGxlYXN0IDE1IGNlbGwgc3R5bGUgWEYNCgkgKiBhbmQgMSBjZWxsIFhGLg0KCSAqIEluc3BlY3Rpb24gb2YgRXhjZWwgZmlsZXMgZ2VuZXJhdGVkIGJ5IE1TIE9mZmljZSBFeGNlbCBzaG93cyB0aGF0IFhGIHJlY29yZHMgMC0xNCBhcmUgY2VsbCBzdHlsZSBYRg0KCSAqIGFuZCBYRiByZWNvcmQgMTUgaXMgYSBjZWxsIFhGDQoJICogV2Ugb25seSByZWFkIHRoZSBmaXJzdCBjZWxsIHN0eWxlIFhGIGFuZCBza2lwIHRoZSByZW1haW5pbmcgY2VsbCBzdHlsZSBYRiByZWNvcmRzDQoJICogV2UgcmVhZCBhbGwgY2VsbCBYRiByZWNvcmRzLg0KCSAqDQoJICogLS0JIk9wZW5PZmZpY2Uub3JnJ3MgRG9jdW1lbnRhdGlvbiBvZiB0aGUgTWljcm9zb2Z0DQoJICogCQlFeGNlbCBGaWxlIEZvcm1hdCINCgkgKi8NCglwcml2YXRlIGZ1bmN0aW9uIF9yZWFkWGYoKQ0KCXsNCgkJJGxlbmd0aCA9IHNlbGY6Ol9HZXRJbnQyZCgkdGhpcy0+X2RhdGEsICR0aGlzLT5fcG9zICsgMik7DQoJCSRyZWNvcmREYXRhID0gc3Vic3RyKCR0aGlzLT5fZGF0YSwgJHRoaXMtPl9wb3MgKyA0LCAkbGVuZ3RoKTsNCg0KCQkvLyBtb3ZlIHN0cmVhbSBwb2ludGVyIHRvIG5leHQgcmVjb3JkDQoJCSR0aGlzLT5fcG9zICs9IDQgKyAkbGVuZ3RoOw0KDQoJCSRvYmpTdHlsZSA9IG5ldyBQSFBFeGNlbF9TdHlsZSgpOw0KDQoJCWlmICghJHRoaXMtPl9yZWFkRGF0YU9ubHkpIHsNCgkJCS8vIG9mZnNldDogIDA7IHNpemU6IDI7IEluZGV4IHRvIEZPTlQgcmVjb3JkDQoJCQlpZiAoc2VsZjo6X0dldEludDJkKCRyZWNvcmREYXRhLCAwKSA8IDQpIHsNCgkJCQkkZm9udEluZGV4ID0gc2VsZjo6X0dldEludDJkKCRyZWNvcmREYXRhLCAwKTsNCgkJCX0gZWxzZSB7DQoJCQkJLy8gdGhpcyBoYXMgdG8gZG8gd2l0aCB0aGF0IGluZGV4IDQgaXMgb21pdHRlZCBpbiBhbGwgQklGRiB2ZXJzaW9ucyBmb3Igc29tZSBzdHJhbmdlIHJlYXNvbg0KCQkJCS8vIGNoZWNrIHRoZSBPcGVuT2ZmaWNlIGRvY3VtZW50YXRpb24gb2YgdGhlIEZPTlQgcmVjb3JkDQoJCQkJJGZvbnRJbmRleCA9IHNlbGY6Ol9HZXRJbnQyZCgkcmVjb3JkRGF0YSwgMCkgLSAxOw0KCQkJfQ0KCQkJJG9ialN0eWxlLT5zZXRGb250KCR0aGlzLT5fb2JqRm9udHNbJGZvbnRJbmRleF0pOw0KDQoJCQkvLyBvZmZzZXQ6ICAyOyBzaXplOiAyOyBJbmRleCB0byBGT1JNQVQgcmVjb3JkDQoJCQkkbnVtYmVyRm9ybWF0SW5kZXggPSBzZWxmOjpfR2V0SW50MmQoJHJlY29yZERhdGEsIDIpOw0KCQkJaWYgKGlzc2V0KCR0aGlzLT5fZm9ybWF0c1skbnVtYmVyRm9ybWF0SW5kZXhdKSkgew0KCQkJCS8vIHRoZW4gd2UgaGF2ZSB1c2VyLWRlZmluZWQgZm9ybWF0IGNvZGUNCgkJCQkkbnVtYmVyZm9ybWF0ID0gYXJyYXkoJ2NvZGUnID0+ICR0aGlzLT5fZm9ybWF0c1skbnVtYmVyRm9ybWF0SW5kZXhdKTsNCgkJCX0gZWxzZWlmICgoJGNvZGUgPSBQSFBFeGNlbF9TdHlsZV9OdW1iZXJGb3JtYXQ6OmJ1aWx0SW5Gb3JtYXRDb2RlKCRudW1iZXJGb3JtYXRJbmRleCkpICE9PSAnJykgew0KCQkJCS8vIHRoZW4gd2UgaGF2ZSBidWlsdC1pbiBmb3JtYXQgY29kZQ0KCQkJCSRudW1iZXJmb3JtYXQgPSBhcnJheSgnY29kZScgPT4gJGNvZGUpOw0KCQkJfSBlbHNlIHsNCgkJCQkvLyB3ZSBzZXQgdGhlIGdlbmVyYWwgZm9ybWF0IGNvZGUNCgkJCQkkbnVtYmVyZm9ybWF0ID0gYXJyYXkoJ2NvZGUnID0+ICdHZW5lcmFsJyk7DQoJCQl9DQoJCQkkb2JqU3R5bGUtPmdldE51bWJlckZvcm1hdCgpLT5zZXRGb3JtYXRDb2RlKCRudW1iZXJmb3JtYXRbJ2NvZGUnXSk7DQoNCgkJCS8vIG9mZnNldDogIDQ7IHNpemU6IDI7IFhGIHR5cGUsIGNlbGwgcHJvdGVjdGlvbiwgYW5kIHBhcmVudCBzdHlsZSBYRg0KCQkJLy8gYml0IDItMDsgbWFzayAweDAwMDc7IFhGX1RZUEVfUFJPVA0KCQkJJHhmVHlwZVByb3QgPSBzZWxmOjpfR2V0SW50MmQoJHJlY29yZERhdGEsIDQpOw0KCQkJLy8gYml0IDA7IG1hc2sgMHgwMTsgMSA9IGNlbGwgaXMgbG9ja2VkDQoJCQkkaXNMb2NrZWQgPSAoMHgwMSAmICR4ZlR5cGVQcm90KSA+PiAwOw0KCQkJJG9ialN0eWxlLT5nZXRQcm90ZWN0aW9uKCktPnNldExvY2tlZCgkaXNMb2NrZWQgPw0KCQkJCVBIUEV4Y2VsX1N0eWxlX1Byb3RlY3Rpb246OlBST1RFQ1RJT05fSU5IRVJJVCA6IFBIUEV4Y2VsX1N0eWxlX1Byb3RlY3Rpb246OlBST1RFQ1RJT05fVU5QUk9URUNURUQpOw0KDQoJCQkvLyBiaXQgMTsgbWFzayAweDAyOyAxID0gRm9ybXVsYSBpcyBoaWRkZW4NCgkJCSRpc0hpZGRlbiA9ICgweDAyICYgJHhmVHlwZVByb3QpID4+IDE7DQoJCQkkb2JqU3R5bGUtPmdldFByb3RlY3Rpb24oKS0+c2V0SGlkZGVuKCRpc0hpZGRlbiA/DQoJCQkJUEhQRXhjZWxfU3R5bGVfUHJvdGVjdGlvbjo6UFJPVEVDVElPTl9QUk9URUNURUQgOiBQSFBFeGNlbF9TdHlsZV9Qcm90ZWN0aW9uOjpQUk9URUNUSU9OX1VOUFJPVEVDVEVEKTsNCg0KCQkJLy8gYml0IDI7IG1hc2sgMHgwNDsgMCA9IENlbGwgWEYsIDEgPSBDZWxsIFN0eWxlIFhGDQoJCQkkaXNDZWxsU3R5bGVYZiA9ICgweDA0ICYgJHhmVHlwZVByb3QpID4+IDI7DQoNCgkJCS8vIG9mZnNldDogIDY7IHNpemU6IDE7IEFsaWdubWVudCBhbmQgdGV4dCBicmVhaw0KCQkJLy8gYml0IDItMCwgbWFzayAweDA3OyBob3Jpem9udGFsIGFsaWdubWVudA0KCQkJJGhvckFsaWduID0gKDB4MDcgJiBvcmQoJHJlY29yZERhdGF7Nn0pKSA+PiAwOw0KCQkJc3dpdGNoICgkaG9yQWxpZ24pIHsNCgkJCQljYXNlIDA6DQoJCQkJCSRvYmpTdHlsZS0+Z2V0QWxpZ25tZW50KCktPnNldEhvcml6b250YWwoUEhQRXhjZWxfU3R5bGVfQWxpZ25tZW50OjpIT1JJWk9OVEFMX0dFTkVSQUwpOw0KCQkJCQlicmVhazsNCgkJCQljYXNlIDE6DQoJCQkJCSRvYmpTdHlsZS0+Z2V0QWxpZ25tZW50KCktPnNldEhvcml6b250YWwoUEhQRXhjZWxfU3R5bGVfQWxpZ25tZW50OjpIT1JJWk9OVEFMX0xFRlQpOw0KCQkJCQlicmVhazsNCgkJCQljYXNlIDI6DQoJCQkJCSRvYmpTdHlsZS0+Z2V0QWxpZ25tZW50KCktPnNldEhvcml6b250YWwoUEhQRXhjZWxfU3R5bGVfQWxpZ25tZW50OjpIT1JJWk9OVEFMX0NFTlRFUik7DQoJCQkJCWJyZWFrOw0KCQkJCWNhc2UgMzoNCgkJCQkJJG9ialN0eWxlLT5nZXRBbGlnbm1lbnQoKS0+c2V0SG9yaXpvbnRhbChQSFBFeGNlbF9TdHlsZV9BbGlnbm1lbnQ6OkhPUklaT05UQUxfUklHSFQpOw0KCQkJCQlicmVhazsNCgkJCQljYXNlIDU6DQoJCQkJCSRvYmpTdHlsZS0+Z2V0QWxpZ25tZW50KCktPnNldEhvcml6b250YWwoUEhQRXhjZWxfU3R5bGVfQWxpZ25tZW50OjpIT1JJWk9OVEFMX0pVU1RJRlkpOw0KCQkJCQlicmVhazsNCgkJCQljYXNlIDY6DQoJCQkJCSRvYmpTdHlsZS0+Z2V0QWxpZ25tZW50KCktPnNldEhvcml6b250YWwoUEhQRXhjZWxfU3R5bGVfQWxpZ25tZW50OjpIT1JJWk9OVEFMX0NFTlRFUl9DT05USU5VT1VTKTsNCgkJCQkJYnJlYWs7DQoJCQl9DQoJCQkvLyBiaXQgMywgbWFzayAweDA4OyB3cmFwIHRleHQNCgkJCSR3cmFwVGV4dCA9ICgweDA4ICYgb3JkKCRyZWNvcmREYXRhezZ9KSkgPj4gMzsNCgkJCXN3aXRjaCAoJHdyYXBUZXh0KSB7DQoJCQkJY2FzZSAwOg0KCQkJCQkkb2JqU3R5bGUtPmdldEFsaWdubWVudCgpLT5zZXRXcmFwVGV4dChmYWxzZSk7DQoJCQkJCWJyZWFrOw0KCQkJCWNhc2UgMToNCgkJCQkJJG9ialN0eWxlLT5nZXRBbGlnbm1lbnQoKS0+c2V0V3JhcFRleHQodHJ1ZSk7DQoJCQkJCWJyZWFrOw0KCQkJfQ0KCQkJLy8gYml0IDYtNCwgbWFzayAweDcwOyB2ZXJ0aWNhbCBhbGlnbm1lbnQNCgkJCSR2ZXJ0QWxpZ24gPSAoMHg3MCAmIG9yZCgkcmVjb3JkRGF0YXs2fSkpID4+IDQ7DQoJCQlzd2l0Y2ggKCR2ZXJ0QWxpZ24pIHsNCgkJCQljYXNlIDA6DQoJCQkJCSRvYmpTdHlsZS0+Z2V0QWxpZ25tZW50KCktPnNldFZlcnRpY2FsKFBIUEV4Y2VsX1N0eWxlX0FsaWdubWVudDo6VkVSVElDQUxfVE9QKTsNCgkJCQkJYnJlYWs7DQoJCQkJY2FzZSAxOg0KCQkJCQkkb2JqU3R5bGUtPmdldEFsaWdubWVudCgpLT5zZXRWZXJ0aWNhbChQSFBFeGNlbF9TdHlsZV9BbGlnbm1lbnQ6OlZFUlRJQ0FMX0NFTlRFUik7DQoJCQkJCWJyZWFrOw0KCQkJCWNhc2UgMjoNCgkJCQkJJG9ialN0eWxlLT5nZXRBbGlnbm1lbnQoKS0+c2V0VmVydGljYWwoUEhQRXhjZWxfU3R5bGVfQWxpZ25tZW50OjpWRVJUSUNBTF9CT1RUT00pOw0KCQkJCQlicmVhazsNCgkJCQljYXNlIDM6DQoJCQkJCSRvYmpTdHlsZS0+Z2V0QWxpZ25tZW50KCktPnNldFZlcnRpY2FsKFBIUEV4Y2VsX1N0eWxlX0FsaWdubWVudDo6VkVSVElDQUxfSlVTVElGWSk7DQoJCQkJCWJyZWFrOw0KCQkJfQ0KDQoJCQlpZiAoJHRoaXMtPl92ZXJzaW9uID09IHNlbGY6OlhMU19CSUZGOCkgew0KCQkJCS8vIG9mZnNldDogIDc7IHNpemU6IDE7IFhGX1JPVEFUSU9OOiBUZXh0IHJvdGF0aW9uIGFuZ2xlDQoJCQkJCSRhbmdsZSA9IG9yZCgkcmVjb3JkRGF0YXs3fSk7DQoJCQkJCSRyb3RhdGlvbiA9IDA7DQoJCQkJCWlmICgkYW5nbGUgPD0gOTApIHsNCgkJCQkJCSRyb3RhdGlvbiA9ICRhbmdsZTsNCgkJCQkJfSBlbHNlIGlmICgkYW5nbGUgPD0gMTgwKSB7DQoJCQkJCQkkcm90YXRpb24gPSA5MCAtICRhbmdsZTsNCgkJCQkJfSBlbHNlIGlmICgkYW5nbGUgPT0gMjU1KSB7DQoJCQkJCQkkcm90YXRpb24gPSAtMTY1Ow0KCQkJCQl9DQoJCQkJCSRvYmpTdHlsZS0+Z2V0QWxpZ25tZW50KCktPnNldFRleHRSb3RhdGlvbigkcm90YXRpb24pOw0KDQoJCQkJLy8gb2Zmc2V0OiAgODsgc2l6ZTogMTsgSW5kZW50YXRpb24sIHNocmluayB0byBjZWxsIHNpemUsIGFuZCB0ZXh0IGRpcmVjdGlvbg0KCQkJCQkvLyBiaXQ6IDMtMDsgbWFzazogMHgwRjsgaW5kZW50IGxldmVsDQoJCQkJCSRpbmRlbnQgPSAoMHgwRiAmIG9yZCgkcmVjb3JkRGF0YXs4fSkpID4+IDA7DQoJCQkJCSRvYmpTdHlsZS0+Z2V0QWxpZ25tZW50KCktPnNldEluZGVudCgkaW5kZW50KTsNCg0KCQkJCQkvLyBiaXQ6IDQ7IG1hc2s6IDB4MTA7IDEgPSBzaHJpbmsgY29udGVudCB0byBmaXQgaW50byBjZWxsDQoJCQkJCSRzaHJpbmtUb0ZpdCA9ICgweDEwICYgb3JkKCRyZWNvcmREYXRhezh9KSkgPj4gNDsNCgkJCQkJc3dpdGNoICgkc2hyaW5rVG9GaXQpIHsNCgkJCQkJCWNhc2UgMDoNCgkJCQkJCQkkb2JqU3R5bGUtPmdldEFsaWdubWVudCgpLT5zZXRTaHJpbmtUb0ZpdChmYWxzZSk7DQoJCQkJCQkJYnJlYWs7DQoJCQkJCQljYXNlIDE6DQoJCQkJCQkJJG9ialN0eWxlLT5nZXRBbGlnbm1lbnQoKS0+c2V0U2hyaW5rVG9GaXQodHJ1ZSk7DQoJCQkJCQkJYnJlYWs7DQoJCQkJCX0NCg0KCQkJCS8vIG9mZnNldDogIDk7IHNpemU6IDE7IEZsYWdzIHVzZWQgZm9yIGF0dHJpYnV0ZSBncm91cHMNCg0KCQkJCS8vIG9mZnNldDogMTA7IHNpemU6IDQ7IENlbGwgYm9yZGVyIGxpbmVzIGFuZCBiYWNrZ3JvdW5kIGFyZWENCgkJCQkJLy8gYml0OiAzLTA7IG1hc2s6IDB4MDAwMDAwMEY7IGxlZnQgc3R5bGUNCgkJCQkJaWYgKCRib3JkZXJzTGVmdFN0eWxlID0gc2VsZjo6X21hcEJvcmRlclN0eWxlKCgweDAwMDAwMDBGICYgc2VsZjo6X0dldEludDRkKCRyZWNvcmREYXRhLCAxMCkpID4+IDApKSB7DQoJCQkJCQkkb2JqU3R5bGUtPmdldEJvcmRlcnMoKS0+Z2V0TGVmdCgpLT5zZXRCb3JkZXJTdHlsZSgkYm9yZGVyc0xlZnRTdHlsZSk7DQoJCQkJCX0NCgkJCQkJLy8gYml0OiA3LTQ7IG1hc2s6IDB4MDAwMDAwRjA7IHJpZ2h0IHN0eWxlDQoJCQkJCWlmICgkYm9yZGVyc1JpZ2h0U3R5bGUgPSBzZWxmOjpfbWFwQm9yZGVyU3R5bGUoKDB4MDAwMDAwRjAgJiBzZWxmOjpfR2V0SW50NGQoJHJlY29yZERhdGEsIDEwKSkgPj4gNCkpIHsNCgkJCQkJCSRvYmpTdHlsZS0+Z2V0Qm9yZGVycygpLT5nZXRSaWdodCgpLT5zZXRCb3JkZXJTdHlsZSgkYm9yZGVyc1JpZ2h0U3R5bGUpOw0KCQkJCQl9DQoJCQkJCS8vIGJpdDogMTEtODsgbWFzazogMHgwMDAwMEYwMDsgdG9wIHN0eWxlDQoJCQkJCWlmICgkYm9yZGVyc1RvcFN0eWxlID0gc2VsZjo6X21hcEJvcmRlclN0eWxlKCgweDAwMDAwRjAwICYgc2VsZjo6X0dldEludDRkKCRyZWNvcmREYXRhLCAxMCkpID4+IDgpKSB7DQoJCQkJCQkkb2JqU3R5bGUtPmdldEJvcmRlcnMoKS0+Z2V0VG9wKCktPnNldEJvcmRlclN0eWxlKCRib3JkZXJzVG9wU3R5bGUpOw0KCQkJCQl9DQoJCQkJCS8vIGJpdDogMTUtMTI7IG1hc2s6IDB4MDAwMEYwMDA7IGJvdHRvbSBzdHlsZQ0KCQkJCQlpZiAoJGJvcmRlcnNCb3R0b21TdHlsZSA9IHNlbGY6Ol9tYXBCb3JkZXJTdHlsZSgoMHgwMDAwRjAwMCAmIHNlbGY6Ol9HZXRJbnQ0ZCgkcmVjb3JkRGF0YSwgMTApKSA+PiAxMikpIHsNCgkJCQkJCSRvYmpTdHlsZS0+Z2V0Qm9yZGVycygpLT5nZXRCb3R0b20oKS0+c2V0Qm9yZGVyU3R5bGUoJGJvcmRlcnNCb3R0b21TdHlsZSk7DQoJCQkJCX0NCgkJCQkJLy8gYml0OiAyMi0xNjsgbWFzazogMHgwMDdGMDAwMDsgbGVmdCBjb2xvcg0KCQkJCQkkb2JqU3R5bGUtPmdldEJvcmRlcnMoKS0+Z2V0TGVmdCgpLT5jb2xvckluZGV4ID0gKDB4MDA3RjAwMDAgJiBzZWxmOjpfR2V0SW50NGQoJHJlY29yZERhdGEsIDEwKSkgPj4gMTY7DQoNCgkJCQkJLy8gYml0OiAyOS0yMzsgbWFzazogMHgzRjgwMDAwMDsgcmlnaHQgY29sb3INCgkJCQkJJG9ialN0eWxlLT5nZXRCb3JkZXJzKCktPmdldFJpZ2h0KCktPmNvbG9ySW5kZXggPSAoMHgzRjgwMDAwMCAmIHNlbGY6Ol9HZXRJbnQ0ZCgkcmVjb3JkRGF0YSwgMTApKSA+PiAyMzsNCg0KCQkJCQkvLyBiaXQ6IDMwOyBtYXNrOiAweDQwMDAwMDAwOyAxID0gZGlhZ29uYWwgbGluZSBmcm9tIHRvcCBsZWZ0IHRvIHJpZ2h0IGJvdHRvbQ0KCQkJCQkkZGlhZ29uYWxEb3duID0gKDB4NDAwMDAwMDAgJiBzZWxmOjpfR2V0SW50NGQoJHJlY29yZERhdGEsIDEwKSkgPj4gMzAgPw0KCQkJCQkJdHJ1ZSA6IGZhbHNlOw0KDQoJCQkJCS8vIGJpdDogMzE7IG1hc2s6IDB4ODAwMDAwMDA7IDEgPSBkaWFnb25hbCBsaW5lIGZyb20gYm90dG9tIGxlZnQgdG8gdG9wIHJpZ2h0DQoJCQkJCSRkaWFnb25hbFVwID0gKDB4ODAwMDAwMDAgJiBzZWxmOjpfR2V0SW50NGQoJHJlY29yZERhdGEsIDEwKSkgPj4gMzEgPw0KCQkJCQkJdHJ1ZSA6IGZhbHNlOw0KDQoJCQkJCWlmICgkZGlhZ29uYWxVcCA9PSBmYWxzZSAmJiAkZGlhZ29uYWxEb3duID09IGZhbHNlKSB7DQoJCQkJCQkkb2JqU3R5bGUtPmdldEJvcmRlcnMoKS0+c2V0RGlhZ29uYWxEaXJlY3Rpb24oUEhQRXhjZWxfU3R5bGVfQm9yZGVyczo6RElBR09OQUxfTk9ORSk7DQoJCQkJCX0gZWxzZWlmICgkZGlhZ29uYWxVcCA9PSB0cnVlICYmICRkaWFnb25hbERvd24gPT0gZmFsc2UpIHsNCgkJCQkJCSRvYmpTdHlsZS0+Z2V0Qm9yZGVycygpLT5zZXREaWFnb25hbERpcmVjdGlvbihQSFBFeGNlbF9TdHlsZV9Cb3JkZXJzOjpESUFHT05BTF9VUCk7DQoJCQkJCX0gZWxzZWlmICgkZGlhZ29uYWxVcCA9PSBmYWxzZSAmJiAkZGlhZ29uYWxEb3duID09IHRydWUpIHsNCgkJCQkJCSRvYmpTdHlsZS0+Z2V0Qm9yZGVycygpLT5zZXREaWFnb25hbERpcmVjdGlvbihQSFBFeGNlbF9TdHlsZV9Cb3JkZXJzOjpESUFHT05BTF9ET1dOKTsNCgkJCQkJfSBlbHNlaWYgKCRkaWFnb25hbFVwID09IHRydWUgJiYgJGRpYWdvbmFsRG93biA9PSB0cnVlKSB7DQoJCQkJCQkkb2JqU3R5bGUtPmdldEJvcmRlcnMoKS0+c2V0RGlhZ29uYWxEaXJlY3Rpb24oUEhQRXhjZWxfU3R5bGVfQm9yZGVyczo6RElBR09OQUxfQk9USCk7DQoJCQkJCX0NCg0KCQkJCS8vIG9mZnNldDogMTQ7IHNpemU6IDQ7DQoJCQkJCS8vIGJpdDogNi0wOyBtYXNrOiAweDAwMDAwMDdGOyB0b3AgY29sb3INCgkJCQkJJG9ialN0eWxlLT5nZXRCb3JkZXJzKCktPmdldFRvcCgpLT5jb2xvckluZGV4ID0gKDB4MDAwMDAwN0YgJiBzZWxmOjpfR2V0SW50NGQoJHJlY29yZERhdGEsIDE0KSkgPj4gMDsNCg0KCQkJCQkvLyBiaXQ6IDEzLTc7IG1hc2s6IDB4MDAwMDNGODA7IGJvdHRvbSBjb2xvcg0KCQkJCQkkb2JqU3R5bGUtPmdldEJvcmRlcnMoKS0+Z2V0Qm90dG9tKCktPmNvbG9ySW5kZXggPSAoMHgwMDAwM0Y4MCAmIHNlbGY6Ol9HZXRJbnQ0ZCgkcmVjb3JkRGF0YSwgMTQpKSA+PiA3Ow0KDQoJCQkJCS8vIGJpdDogMjAtMTQ7IG1hc2s6IDB4MDAxRkMwMDA7IGRpYWdvbmFsIGNvbG9yDQoJCQkJCSRvYmpTdHlsZS0+Z2V0Qm9yZGVycygpLT5nZXREaWFnb25hbCgpLT5jb2xvckluZGV4ID0gKDB4MDAxRkMwMDAgJiBzZWxmOjpfR2V0SW50NGQoJHJlY29yZERhdGEsIDE0KSkgPj4gMTQ7DQoNCgkJCQkJLy8gYml0OiAyNC0yMTsgbWFzazogMHgwMUUwMDAwMDsgZGlhZ29uYWwgc3R5bGUNCgkJCQkJaWYgKCRib3JkZXJzRGlhZ29uYWxTdHlsZSA9IHNlbGY6Ol9tYXBCb3JkZXJTdHlsZSgoMHgwMUUwMDAwMCAmIHNlbGY6Ol9HZXRJbnQ0ZCgkcmVjb3JkRGF0YSwgMTQpKSA+PiAyMSkpIHsNCgkJCQkJCSRvYmpTdHlsZS0+Z2V0Qm9yZGVycygpLT5nZXREaWFnb25hbCgpLT5zZXRCb3JkZXJTdHlsZSgkYm9yZGVyc0RpYWdvbmFsU3R5bGUpOw0KCQkJCQl9DQoNCgkJCQkJLy8gYml0OiAzMS0yNjsgbWFzazogMHhGQzAwMDAwMCBmaWxsIHBhdHRlcm4NCgkJCQkJaWYgKCRmaWxsVHlwZSA9IHNlbGY6Ol9tYXBGaWxsUGF0dGVybigoMHhGQzAwMDAwMCAmIHNlbGY6Ol9HZXRJbnQ0ZCgkcmVjb3JkRGF0YSwgMTQpKSA+PiAyNikpIHsNCgkJCQkJCSRvYmpTdHlsZS0+Z2V0RmlsbCgpLT5zZXRGaWxsVHlwZSgkZmlsbFR5cGUpOw0KCQkJCQl9DQoJCQkJLy8gb2Zmc2V0OiAxODsgc2l6ZTogMjsgcGF0dGVybiBhbmQgYmFja2dyb3VuZCBjb2xvdXINCgkJCQkJLy8gYml0OiA2LTA7IG1hc2s6IDB4MDA3RjsgY29sb3IgaW5kZXggZm9yIHBhdHRlcm4gY29sb3INCgkJCQkJJG9ialN0eWxlLT5nZXRGaWxsKCktPnN0YXJ0Y29sb3JJbmRleCA9ICgweDAwN0YgJiBzZWxmOjpfR2V0SW50MmQoJHJlY29yZERhdGEsIDE4KSkgPj4gMDsNCg0KCQkJCQkvLyBiaXQ6IDEzLTc7IG1hc2s6IDB4M0Y4MDsgY29sb3IgaW5kZXggZm9yIHBhdHRlcm4gYmFja2dyb3VuZA0KCQkJCQkkb2JqU3R5bGUtPmdldEZpbGwoKS0+ZW5kY29sb3JJbmRleCA9ICgweDNGODAgJiBzZWxmOjpfR2V0SW50MmQoJHJlY29yZERhdGEsIDE4KSkgPj4gNzsNCgkJCX0gZWxzZSB7DQoJCQkJLy8gQklGRjUNCg0KCQkJCS8vIG9mZnNldDogNzsgc2l6ZTogMTsgVGV4dCBvcmllbnRhdGlvbiBhbmQgZmxhZ3MNCgkJCQkkb3JpZW50YXRpb25BbmRGbGFncyA9IG9yZCgkcmVjb3JkRGF0YXs3fSk7DQoNCgkJCQkvLyBiaXQ6IDEtMDsgbWFzazogMHgwMzsgWEZfT1JJRU5UQVRJT046IFRleHQgb3JpZW50YXRpb24NCgkJCQkkeGZPcmllbnRhdGlvbiA9ICgweDAzICYgJG9yaWVudGF0aW9uQW5kRmxhZ3MpID4+IDA7DQoJCQkJc3dpdGNoICgkeGZPcmllbnRhdGlvbikgew0KCQkJCQljYXNlIDA6DQoJCQkJCQkkb2JqU3R5bGUtPmdldEFsaWdubWVudCgpLT5zZXRUZXh0Um90YXRpb24oMCk7DQoJCQkJCQlicmVhazsNCgkJCQkJY2FzZSAxOg0KCQkJCQkJJG9ialN0eWxlLT5nZXRBbGlnbm1lbnQoKS0+c2V0VGV4dFJvdGF0aW9uKC0xNjUpOw0KCQkJCQkJYnJlYWs7DQoJCQkJCWNhc2UgMjoNCgkJCQkJCSRvYmpTdHlsZS0+Z2V0QWxpZ25tZW50KCktPnNldFRleHRSb3RhdGlvbig5MCk7DQoJCQkJCQlicmVhazsNCgkJCQkJY2FzZSAzOg0KCQkJCQkJJG9ialN0eWxlLT5nZXRBbGlnbm1lbnQoKS0+c2V0VGV4dFJvdGF0aW9uKC05MCk7DQoJCQkJCQlicmVhazsNCgkJCQl9DQoNCgkJCQkvLyBvZmZzZXQ6IDg7IHNpemU6IDQ7IGNlbGwgYm9yZGVyIGxpbmVzIGFuZCBiYWNrZ3JvdW5kIGFyZWENCgkJCQkkYm9yZGVyQW5kQmFja2dyb3VuZCA9IHNlbGY6Ol9HZXRJbnQ0ZCgkcmVjb3JkRGF0YSwgOCk7DQoNCgkJCQkvLyBiaXQ6IDYtMDsgbWFzazogMHgwMDAwMDA3RjsgY29sb3IgaW5kZXggZm9yIHBhdHRlcm4gY29sb3INCgkJCQkkb2JqU3R5bGUtPmdldEZpbGwoKS0+c3RhcnRjb2xvckluZGV4ID0gKDB4MDAwMDAwN0YgJiAkYm9yZGVyQW5kQmFja2dyb3VuZCkgPj4gMDsNCg0KCQkJCS8vIGJpdDogMTMtNzsgbWFzazogMHgwMDAwM0Y4MDsgY29sb3IgaW5kZXggZm9yIHBhdHRlcm4gYmFja2dyb3VuZA0KCQkJCSRvYmpTdHlsZS0+Z2V0RmlsbCgpLT5lbmRjb2xvckluZGV4ID0gKDB4MDAwMDNGODAgJiAkYm9yZGVyQW5kQmFja2dyb3VuZCkgPj4gNzsNCg0KCQkJCS8vIGJpdDogMjEtMTY7IG1hc2s6IDB4MDAzRjAwMDA7IGZpbGwgcGF0dGVybg0KCQkJCSRvYmpTdHlsZS0+Z2V0RmlsbCgpLT5zZXRGaWxsVHlwZShzZWxmOjpfbWFwRmlsbFBhdHRlcm4oKDB4MDAzRjAwMDAgJiAkYm9yZGVyQW5kQmFja2dyb3VuZCkgPj4gMTYpKTsNCg0KCQkJCS8vIGJpdDogMjQtMjI7IG1hc2s6IDB4MDFDMDAwMDA7IGJvdHRvbSBsaW5lIHN0eWxlDQoJCQkJJG9ialN0eWxlLT5nZXRCb3JkZXJzKCktPmdldEJvdHRvbSgpLT5zZXRCb3JkZXJTdHlsZShzZWxmOjpfbWFwQm9yZGVyU3R5bGUoKDB4MDFDMDAwMDAgJiAkYm9yZGVyQW5kQmFja2dyb3VuZCkgPj4gMjIpKTsNCg0KCQkJCS8vIGJpdDogMzEtMjU7IG1hc2s6IDB4RkUwMDAwMDA7IGJvdHRvbSBsaW5lIGNvbG9yDQoJCQkJJG9ialN0eWxlLT5nZXRCb3JkZXJzKCktPmdldEJvdHRvbSgpLT5jb2xvckluZGV4ID0gKDB4RkUwMDAwMDAgJiAkYm9yZGVyQW5kQmFja2dyb3VuZCkgPj4gMjU7DQoNCgkJCQkvLyBvZmZzZXQ6IDEyOyBzaXplOiA0OyBjZWxsIGJvcmRlciBsaW5lcw0KCQkJCSRib3JkZXJMaW5lcyA9IHNlbGY6Ol9HZXRJbnQ0ZCgkcmVjb3JkRGF0YSwgMTIpOw0KDQoJCQkJLy8gYml0OiAyLTA7IG1hc2s6IDB4MDAwMDAwMDc7IHRvcCBsaW5lIHN0eWxlDQoJCQkJJG9ialN0eWxlLT5nZXRCb3JkZXJzKCktPmdldFRvcCgpLT5zZXRCb3JkZXJTdHlsZShzZWxmOjpfbWFwQm9yZGVyU3R5bGUoKDB4MDAwMDAwMDcgJiAkYm9yZGVyTGluZXMpID4+IDApKTsNCg0KCQkJCS8vIGJpdDogNS0zOyBtYXNrOiAweDAwMDAwMDM4OyBsZWZ0IGxpbmUgc3R5bGUNCgkJCQkkb2JqU3R5bGUtPmdldEJvcmRlcnMoKS0+Z2V0TGVmdCgpLT5zZXRCb3JkZXJTdHlsZShzZWxmOjpfbWFwQm9yZGVyU3R5bGUoKDB4MDAwMDAwMzggJiAkYm9yZGVyTGluZXMpID4+IDMpKTsNCg0KCQkJCS8vIGJpdDogOC02OyBtYXNrOiAweDAwMDAwMUMwOyByaWdodCBsaW5lIHN0eWxlDQoJCQkJJG9ialN0eWxlLT5nZXRCb3JkZXJzKCktPmdldFJpZ2h0KCktPnNldEJvcmRlclN0eWxlKHNlbGY6Ol9tYXBCb3JkZXJTdHlsZSgoMHgwMDAwMDFDMCAmICRib3JkZXJMaW5lcykgPj4gNikpOw0KDQoJCQkJLy8gYml0OiAxNS05OyBtYXNrOiAweDAwMDBGRTAwOyB0b3AgbGluZSBjb2xvciBpbmRleA0KCQkJCSRvYmpTdHlsZS0+Z2V0Qm9yZGVycygpLT5nZXRUb3AoKS0+Y29sb3JJbmRleCA9ICgweDAwMDBGRTAwICYgJGJvcmRlckxpbmVzKSA+PiA5Ow0KDQoJCQkJLy8gYml0OiAyMi0xNjsgbWFzazogMHgwMDdGMDAwMDsgbGVmdCBsaW5lIGNvbG9yIGluZGV4DQoJCQkJJG9ialN0eWxlLT5nZXRCb3JkZXJzKCktPmdldExlZnQoKS0+Y29sb3JJbmRleCA9ICgweDAwN0YwMDAwICYgJGJvcmRlckxpbmVzKSA+PiAxNjsNCg0KCQkJCS8vIGJpdDogMjktMjM7IG1hc2s6IDB4M0Y4MDAwMDA7IHJpZ2h0IGxpbmUgY29sb3IgaW5kZXgNCgkJCQkkb2JqU3R5bGUtPmdldEJvcmRlcnMoKS0+Z2V0UmlnaHQoKS0+Y29sb3JJbmRleCA9ICgweDNGODAwMDAwICYgJGJvcmRlckxpbmVzKSA+PiAyMzsNCgkJCX0NCg0KCQkJLy8gYWRkIGNlbGxTdHlsZVhmIG9yIGNlbGxYZiBhbmQgdXBkYXRlIG1hcHBpbmcNCgkJCWlmICgkaXNDZWxsU3R5bGVYZikgew0KCQkJCS8vIHdlIG9ubHkgcmVhZCBvbmUgc3R5bGUgWEYgcmVjb3JkIHdoaWNoIGlzIGFsd2F5cyB0aGUgZmlyc3QNCgkJCQlpZiAoJHRoaXMtPl94ZkluZGV4ID09IDApIHsNCgkJCQkJJHRoaXMtPl9waHBFeGNlbC0+YWRkQ2VsbFN0eWxlWGYoJG9ialN0eWxlKTsNCgkJCQkJJHRoaXMtPl9tYXBDZWxsU3R5bGVYZkluZGV4WyR0aGlzLT5feGZJbmRleF0gPSAwOw0KCQkJCX0NCgkJCX0gZWxzZSB7DQoJCQkJLy8gd2UgcmVhZCBhbGwgY2VsbCBYRiByZWNvcmRzDQoJCQkJJHRoaXMtPl9waHBFeGNlbC0+YWRkQ2VsbFhmKCRvYmpTdHlsZSk7DQoJCQkJJHRoaXMtPl9tYXBDZWxsWGZJbmRleFskdGhpcy0+X3hmSW5kZXhdID0gY291bnQoJHRoaXMtPl9waHBFeGNlbC0+Z2V0Q2VsbFhmQ29sbGVjdGlvbigpKSAtIDE7DQoJCQl9DQoNCgkJCS8vIHVwZGF0ZSBYRiBpbmRleCBmb3Igd2hlbiB3ZSByZWFkIG5leHQgcmVjb3JkDQoJCQkrKyR0aGlzLT5feGZJbmRleDsNCgkJfQ0KCX0NCg0KDQoJLyoqDQoJICoNCgkgKi8NCglwcml2YXRlIGZ1bmN0aW9uIF9yZWFkWGZFeHQoKQ0KCXsNCgkJJGxlbmd0aCA9IHNlbGY6Ol9HZXRJbnQyZCgkdGhpcy0+X2RhdGEsICR0aGlzLT5fcG9zICsgMik7DQoJCSRyZWNvcmREYXRhID0gc3Vic3RyKCR0aGlzLT5fZGF0YSwgJHRoaXMtPl9wb3MgKyA0LCAkbGVuZ3RoKTsNCg0KCQkvLyBtb3ZlIHN0cmVhbSBwb2ludGVyIHRvIG5leHQgcmVjb3JkDQoJCSR0aGlzLT5fcG9zICs9IDQgKyAkbGVuZ3RoOw0KDQoJCWlmICghJHRoaXMtPl9yZWFkRGF0YU9ubHkpIHsNCgkJCS8vIG9mZnNldDogMDsgc2l6ZTogMjsgMHgwODdEID0gcmVwZWF0ZWQgaGVhZGVyDQoNCgkJCS8vIG9mZnNldDogMjsgc2l6ZTogMg0KDQoJCQkvLyBvZmZzZXQ6IDQ7IHNpemU6IDg7IG5vdCB1c2VkDQoNCgkJCS8vIG9mZnNldDogMTI7IHNpemU6IDI7IHJlY29yZCB2ZXJzaW9uDQoNCgkJCS8vIG9mZnNldDogMTQ7IHNpemU6IDI7IGluZGV4IHRvIFhGIHJlY29yZCB3aGljaCB0aGlzIHJlY29yZCBtb2RpZmllcw0KCQkJJGl4ZmUgPSBzZWxmOjpfR2V0SW50MmQoJHJlY29yZERhdGEsIDE0KTsNCg0KCQkJLy8gb2Zmc2V0OiAxNjsgc2l6ZTogMjsgbm90IHVzZWQNCg0KCQkJLy8gb2Zmc2V0OiAxODsgc2l6ZTogMjsgbnVtYmVyIG9mIGV4dGVuc2lvbiBwcm9wZXJ0aWVzIHRoYXQgZm9sbG93DQoJCQkkY2V4dHMgPSBzZWxmOjpfR2V0SW50MmQoJHJlY29yZERhdGEsIDE4KTsNCg0KCQkJLy8gc3RhcnQgcmVhZGluZyB0aGUgYWN0dWFsIGV4dGVuc2lvbiBkYXRhDQoJCQkkb2Zmc2V0ID0gMjA7DQoJCQl3aGlsZSAoJG9mZnNldCA8ICRsZW5ndGgpIHsNCgkJCQkvLyBleHRlbnNpb24gdHlwZQ0KCQkJCSRleHRUeXBlID0gc2VsZjo6X0dldEludDJkKCRyZWNvcmREYXRhLCAkb2Zmc2V0KTsNCg0KCQkJCS8vIGV4dGVuc2lvbiBsZW5ndGgNCgkJCQkkY2IgPSBzZWxmOjpfR2V0SW50MmQoJHJlY29yZERhdGEsICRvZmZzZXQgKyAyKTsNCg0KCQkJCS8vIGV4dGVuc2lvbiBkYXRhDQoJCQkJJGV4dERhdGEgPSBzdWJzdHIoJHJlY29yZERhdGEsICRvZmZzZXQgKyA0LCAkY2IpOw0KDQoJCQkJc3dpdGNoICgkZXh0VHlwZSkgew0KCQkJCQljYXNlIDQ6CQkvLyBmaWxsIHN0YXJ0IGNvbG9yDQoJCQkJCQkkeGNsZlR5cGUgID0gc2VsZjo6X0dldEludDJkKCRleHREYXRhLCAwKTsgLy8gY29sb3IgdHlwZQ0KCQkJCQkJJHhjbHJWYWx1ZSA9IHN1YnN0cigkZXh0RGF0YSwgNCwgNCk7IC8vIGNvbG9yIHZhbHVlICh2YWx1ZSBiYXNlZCBvbiBjb2xvciB0eXBlKQ0KDQoJCQkJCQlpZiAoJHhjbGZUeXBlID09IDIpIHsNCgkJCQkJCQkkcmdiID0gc3ByaW50ZignJTAyWCUwMlglMDJYJywgb3JkKCR4Y2xyVmFsdWV7MH0pLCBvcmQoJHhjbHJWYWx1ZXsxfSksIG9yZCgkeGNsclZhbHVlezJ9KSk7DQoNCgkJCQkJCQkvLyBtb2RpZnkgdGhlIHJlbGV2YW50IHN0eWxlIHByb3BlcnR5DQoJCQkJCQkJaWYgKCBpc3NldCgkdGhpcy0+X21hcENlbGxYZkluZGV4WyRpeGZlXSkgKSB7DQoJCQkJCQkJCSRmaWxsID0gJHRoaXMtPl9waHBFeGNlbC0+Z2V0Q2VsbFhmQnlJbmRleCgkdGhpcy0+X21hcENlbGxYZkluZGV4WyRpeGZlXSktPmdldEZpbGwoKTsNCgkJCQkJCQkJJGZpbGwtPmdldFN0YXJ0Q29sb3IoKS0+c2V0UkdCKCRyZ2IpOw0KCQkJCQkJCQl1bnNldCgkZmlsbC0+c3RhcnRjb2xvckluZGV4KTsgLy8gbm9ybWFsIGNvbG9yIGluZGV4IGRvZXMgbm90IGFwcGx5LCBkaXNjYXJkDQoJCQkJCQkJfQ0KCQkJCQkJfQ0KCQkJCQkJYnJlYWs7DQoNCgkJCQkJY2FzZSA1OgkJLy8gZmlsbCBlbmQgY29sb3INCgkJCQkJCSR4Y2xmVHlwZSAgPSBzZWxmOjpfR2V0SW50MmQoJGV4dERhdGEsIDApOyAvLyBjb2xvciB0eXBlDQoJCQkJCQkkeGNsclZhbHVlID0gc3Vic3RyKCRleHREYXRhLCA0LCA0KTsgLy8gY29sb3IgdmFsdWUgKHZhbHVlIGJhc2VkIG9uIGNvbG9yIHR5cGUpDQoNCgkJCQkJCWlmICgkeGNsZlR5cGUgPT0gMikgew0KCQkJCQkJCSRyZ2IgPSBzcHJpbnRmKCclMDJYJTAyWCUwMlgnLCBvcmQoJHhjbHJWYWx1ZXswfSksIG9yZCgkeGNsclZhbHVlezF9KSwgb3JkKCR4Y2xyVmFsdWV7Mn0pKTsNCg0KCQkJCQkJCS8vIG1vZGlmeSB0aGUgcmVsZXZhbnQgc3R5bGUgcHJvcGVydHkNCgkJCQkJCQlpZiAoIGlzc2V0KCR0aGlzLT5fbWFwQ2VsbFhmSW5kZXhbJGl4ZmVdKSApIHsNCgkJCQkJCQkJJGZpbGwgPSAkdGhpcy0+X3BocEV4Y2VsLT5nZXRDZWxsWGZCeUluZGV4KCR0aGlzLT5fbWFwQ2VsbFhmSW5kZXhbJGl4ZmVdKS0+Z2V0RmlsbCgpOw0KCQkJCQkJCQkkZmlsbC0+Z2V0RW5kQ29sb3IoKS0+c2V0UkdCKCRyZ2IpOw0KCQkJCQkJCQl1bnNldCgkZmlsbC0+ZW5kY29sb3JJbmRleCk7IC8vIG5vcm1hbCBjb2xvciBpbmRleCBkb2VzIG5vdCBhcHBseSwgZGlzY2FyZA0KCQkJCQkJCX0NCgkJCQkJCX0NCgkJCQkJCWJyZWFrOw0KDQoJCQkJCWNhc2UgNzoJCS8vIGJvcmRlciBjb2xvciB0b3ANCgkJCQkJCSR4Y2xmVHlwZSAgPSBzZWxmOjpfR2V0SW50MmQoJGV4dERhdGEsIDApOyAvLyBjb2xvciB0eXBlDQoJCQkJCQkkeGNsclZhbHVlID0gc3Vic3RyKCRleHREYXRhLCA0LCA0KTsgLy8gY29sb3IgdmFsdWUgKHZhbHVlIGJhc2VkIG9uIGNvbG9yIHR5cGUpDQoNCgkJCQkJCWlmICgkeGNsZlR5cGUgPT0gMikgew0KCQkJCQkJCSRyZ2IgPSBzcHJpbnRmKCclMDJYJTAyWCUwMlgnLCBvcmQoJHhjbHJWYWx1ZXswfSksIG9yZCgkeGNsclZhbHVlezF9KSwgb3JkKCR4Y2xyVmFsdWV7Mn0pKTsNCg0KCQkJCQkJCS8vIG1vZGlmeSB0aGUgcmVsZXZhbnQgc3R5bGUgcHJvcGVydHkNCgkJCQkJCQlpZiAoIGlzc2V0KCR0aGlzLT5fbWFwQ2VsbFhmSW5kZXhbJGl4ZmVdKSApIHsNCgkJCQkJCQkJJHRvcCA9ICR0aGlzLT5fcGhwRXhjZWwtPmdldENlbGxYZkJ5SW5kZXgoJHRoaXMtPl9tYXBDZWxsWGZJbmRleFskaXhmZV0pLT5nZXRCb3JkZXJzKCktPmdldFRvcCgpOw0KCQkJCQkJCQkkdG9wLT5nZXRDb2xvcigpLT5zZXRSR0IoJHJnYik7DQoJCQkJCQkJCXVuc2V0KCR0b3AtPmNvbG9ySW5kZXgpOyAvLyBub3JtYWwgY29sb3IgaW5kZXggZG9lcyBub3QgYXBwbHksIGRpc2NhcmQNCgkJCQkJCQl9DQoJCQkJCQl9DQoJCQkJCQlicmVhazsNCg0KCQkJCQljYXNlIDg6CQkvLyBib3JkZXIgY29sb3IgYm90dG9tDQoJCQkJCQkkeGNsZlR5cGUgID0gc2VsZjo6X0dldEludDJkKCRleHREYXRhLCAwKTsgLy8gY29sb3IgdHlwZQ0KCQkJCQkJJHhjbHJWYWx1ZSA9IHN1YnN0cigkZXh0RGF0YSwgNCwgNCk7IC8vIGNvbG9yIHZhbHVlICh2YWx1ZSBiYXNlZCBvbiBjb2xvciB0eXBlKQ0KDQoJCQkJCQlpZiAoJHhjbGZUeXBlID09IDIpIHsNCgkJCQkJCQkkcmdiID0gc3ByaW50ZignJTAyWCUwMlglMDJYJywgb3JkKCR4Y2xyVmFsdWV7MH0pLCBvcmQoJHhjbHJWYWx1ZXsxfSksIG9yZCgkeGNsclZhbHVlezJ9KSk7DQoNCgkJCQkJCQkvLyBtb2RpZnkgdGhlIHJlbGV2YW50IHN0eWxlIHByb3BlcnR5DQoJCQkJCQkJaWYgKCBpc3NldCgkdGhpcy0+X21hcENlbGxYZkluZGV4WyRpeGZlXSkgKSB7DQoJCQkJCQkJCSRib3R0b20gPSAkdGhpcy0+X3BocEV4Y2VsLT5nZXRDZWxsWGZCeUluZGV4KCR0aGlzLT5fbWFwQ2VsbFhmSW5kZXhbJGl4ZmVdKS0+Z2V0Qm9yZGVycygpLT5nZXRCb3R0b20oKTsNCgkJCQkJCQkJJGJvdHRvbS0+Z2V0Q29sb3IoKS0+c2V0UkdCKCRyZ2IpOw0KCQkJCQkJCQl1bnNldCgkYm90dG9tLT5jb2xvckluZGV4KTsgLy8gbm9ybWFsIGNvbG9yIGluZGV4IGRvZXMgbm90IGFwcGx5LCBkaXNjYXJkDQoJCQkJCQkJfQ0KCQkJCQkJfQ0KCQkJCQkJYnJlYWs7DQoNCgkJCQkJY2FzZSA5OgkJLy8gYm9yZGVyIGNvbG9yIGxlZnQNCgkJCQkJCSR4Y2xmVHlwZSAgPSBzZWxmOjpfR2V0SW50MmQoJGV4dERhdGEsIDApOyAvLyBjb2xvciB0eXBlDQoJCQkJCQkkeGNsclZhbHVlID0gc3Vic3RyKCRleHREYXRhLCA0LCA0KTsgLy8gY29sb3IgdmFsdWUgKHZhbHVlIGJhc2VkIG9uIGNvbG9yIHR5cGUpDQoNCgkJCQkJCWlmICgkeGNsZlR5cGUgPT0gMikgew0KCQkJCQkJCSRyZ2IgPSBzcHJpbnRmKCclMDJYJTAyWCUwMlgnLCBvcmQoJHhjbHJWYWx1ZXswfSksIG9yZCgkeGNsclZhbHVlezF9KSwgb3JkKCR4Y2xyVmFsdWV7Mn0pKTsNCg0KCQkJCQkJCS8vIG1vZGlmeSB0aGUgcmVsZXZhbnQgc3R5bGUgcHJvcGVydHkNCgkJCQkJCQlpZiAoIGlzc2V0KCR0aGlzLT5fbWFwQ2VsbFhmSW5kZXhbJGl4ZmVdKSApIHsNCgkJCQkJCQkJJGxlZnQgPSAkdGhpcy0+X3BocEV4Y2VsLT5nZXRDZWxsWGZCeUluZGV4KCR0aGlzLT5fbWFwQ2VsbFhmSW5kZXhbJGl4ZmVdKS0+Z2V0Qm9yZGVycygpLT5nZXRMZWZ0KCk7DQoJCQkJCQkJCSRsZWZ0LT5nZXRDb2xvcigpLT5zZXRSR0IoJHJnYik7DQoJCQkJCQkJCXVuc2V0KCRsZWZ0LT5jb2xvckluZGV4KTsgLy8gbm9ybWFsIGNvbG9yIGluZGV4IGRvZXMgbm90IGFwcGx5LCBkaXNjYXJkDQoJCQkJCQkJfQ0KCQkJCQkJfQ0KCQkJCQkJYnJlYWs7DQoNCgkJCQkJY2FzZSAxMDoJCS8vIGJvcmRlciBjb2xvciByaWdodA0KCQkJCQkJJHhjbGZUeXBlICA9IHNlbGY6Ol9HZXRJbnQyZCgkZXh0RGF0YSwgMCk7IC8vIGNvbG9yIHR5cGUNCgkJCQkJCSR4Y2xyVmFsdWUgPSBzdWJzdHIoJGV4dERhdGEsIDQsIDQpOyAvLyBjb2xvciB2YWx1ZSAodmFsdWUgYmFzZWQgb24gY29sb3IgdHlwZSkNCg0KCQkJCQkJaWYgKCR4Y2xmVHlwZSA9PSAyKSB7DQoJCQkJCQkJJHJnYiA9IHNwcmludGYoJyUwMlglMDJYJTAyWCcsIG9yZCgkeGNsclZhbHVlezB9KSwgb3JkKCR4Y2xyVmFsdWV7MX0pLCBvcmQoJHhjbHJWYWx1ZXsyfSkpOw0KDQoJCQkJCQkJLy8gbW9kaWZ5IHRoZSByZWxldmFudCBzdHlsZSBwcm9wZXJ0eQ0KCQkJCQkJCWlmICggaXNzZXQoJHRoaXMtPl9tYXBDZWxsWGZJbmRleFskaXhmZV0pICkgew0KCQkJCQkJCQkkcmlnaHQgPSAkdGhpcy0+X3BocEV4Y2VsLT5nZXRDZWxsWGZCeUluZGV4KCR0aGlzLT5fbWFwQ2VsbFhmSW5kZXhbJGl4ZmVdKS0+Z2V0Qm9yZGVycygpLT5nZXRSaWdodCgpOw0KCQkJCQkJCQkkcmlnaHQtPmdldENvbG9yKCktPnNldFJHQigkcmdiKTsNCgkJCQkJCQkJdW5zZXQoJHJpZ2h0LT5jb2xvckluZGV4KTsgLy8gbm9ybWFsIGNvbG9yIGluZGV4IGRvZXMgbm90IGFwcGx5LCBkaXNjYXJkDQoJCQkJCQkJfQ0KCQkJCQkJfQ0KCQkJCQkJYnJlYWs7DQoNCgkJCQkJY2FzZSAxMToJCS8vIGJvcmRlciBjb2xvciBkaWFnb25hbA0KCQkJCQkJJHhjbGZUeXBlICA9IHNlbGY6Ol9HZXRJbnQyZCgkZXh0RGF0YSwgMCk7IC8vIGNvbG9yIHR5cGUNCgkJCQkJCSR4Y2xyVmFsdWUgPSBzdWJzdHIoJGV4dERhdGEsIDQsIDQpOyAvLyBjb2xvciB2YWx1ZSAodmFsdWUgYmFzZWQgb24gY29sb3IgdHlwZSkNCg0KCQkJCQkJaWYgKCR4Y2xmVHlwZSA9PSAyKSB7DQoJCQkJCQkJJHJnYiA9IHNwcmludGYoJyUwMlglMDJYJTAyWCcsIG9yZCgkeGNsclZhbHVlezB9KSwgb3JkKCR4Y2xyVmFsdWV7MX0pLCBvcmQoJHhjbHJWYWx1ZXsyfSkpOw0KDQoJCQkJCQkJLy8gbW9kaWZ5IHRoZSByZWxldmFudCBzdHlsZSBwcm9wZXJ0eQ0KCQkJCQkJCWlmICggaXNzZXQoJHRoaXMtPl9tYXBDZWxsWGZJbmRleFskaXhmZV0pICkgew0KCQkJCQkJCQkkZGlhZ29uYWwgPSAkdGhpcy0+X3BocEV4Y2VsLT5nZXRDZWxsWGZCeUluZGV4KCR0aGlzLT5fbWFwQ2VsbFhmSW5kZXhbJGl4ZmVdKS0+Z2V0Qm9yZGVycygpLT5nZXREaWFnb25hbCgpOw0KCQkJCQkJCQkkZGlhZ29uYWwtPmdldENvbG9yKCktPnNldFJHQigkcmdiKTsNCgkJCQkJCQkJdW5zZXQoJGRpYWdvbmFsLT5jb2xvckluZGV4KTsgLy8gbm9ybWFsIGNvbG9yIGluZGV4IGRvZXMgbm90IGFwcGx5LCBkaXNjYXJkDQoJCQkJCQkJfQ0KCQkJCQkJfQ0KCQkJCQkJYnJlYWs7DQoNCgkJCQkJY2FzZSAxMzoJLy8gZm9udCBjb2xvcg0KCQkJCQkJJHhjbGZUeXBlICA9IHNlbGY6Ol9HZXRJbnQyZCgkZXh0RGF0YSwgMCk7IC8vIGNvbG9yIHR5cGUNCgkJCQkJCSR4Y2xyVmFsdWUgPSBzdWJzdHIoJGV4dERhdGEsIDQsIDQpOyAvLyBjb2xvciB2YWx1ZSAodmFsdWUgYmFzZWQgb24gY29sb3IgdHlwZSkNCg0KCQkJCQkJaWYgKCR4Y2xmVHlwZSA9PSAyKSB7DQoJCQkJCQkJJHJnYiA9IHNwcmludGYoJyUwMlglMDJYJTAyWCcsIG9yZCgkeGNsclZhbHVlezB9KSwgb3JkKCR4Y2xyVmFsdWV7MX0pLCBvcmQoJHhjbHJWYWx1ZXsyfSkpOw0KDQoJCQkJCQkJLy8gbW9kaWZ5IHRoZSByZWxldmFudCBzdHlsZSBwcm9wZXJ0eQ0KCQkJCQkJCWlmICggaXNzZXQoJHRoaXMtPl9tYXBDZWxsWGZJbmRleFskaXhmZV0pICkgew0KCQkJCQkJCQkkZm9udCA9ICR0aGlzLT5fcGhwRXhjZWwtPmdldENlbGxYZkJ5SW5kZXgoJHRoaXMtPl9tYXBDZWxsWGZJbmRleFskaXhmZV0pLT5nZXRGb250KCk7DQoJCQkJCQkJCSRmb250LT5nZXRDb2xvcigpLT5zZXRSR0IoJHJnYik7DQoJCQkJCQkJCXVuc2V0KCRmb250LT5jb2xvckluZGV4KTsgLy8gbm9ybWFsIGNvbG9yIGluZGV4IGRvZXMgbm90IGFwcGx5LCBkaXNjYXJkDQoJCQkJCQkJfQ0KCQkJCQkJfQ0KCQkJCQkJYnJlYWs7DQoJCQkJfQ0KDQoJCQkJJG9mZnNldCArPSAkY2I7DQoJCQl9DQoJCX0NCg0KCX0NCg0KDQoJLyoqDQoJICogUmVhZCBTVFlMRSByZWNvcmQNCgkgKi8NCglwcml2YXRlIGZ1bmN0aW9uIF9yZWFkU3R5bGUoKQ0KCXsNCgkJJGxlbmd0aCA9IHNlbGY6Ol9HZXRJbnQyZCgkdGhpcy0+X2RhdGEsICR0aGlzLT5fcG9zICsgMik7DQoJCSRyZWNvcmREYXRhID0gc3Vic3RyKCR0aGlzLT5fZGF0YSwgJHRoaXMtPl9wb3MgKyA0LCAkbGVuZ3RoKTsNCg0KCQkvLyBtb3ZlIHN0cmVhbSBwb2ludGVyIHRvIG5leHQgcmVjb3JkDQoJCSR0aGlzLT5fcG9zICs9IDQgKyAkbGVuZ3RoOw0KDQoJCWlmICghJHRoaXMtPl9yZWFkRGF0YU9ubHkpIHsNCgkJCS8vIG9mZnNldDogMDsgc2l6ZTogMjsgaW5kZXggdG8gWEYgcmVjb3JkIGFuZCBmbGFnIGZvciBidWlsdC1pbiBzdHlsZQ0KCQkJJGl4ZmUgPSBzZWxmOjpfR2V0SW50MmQoJHJlY29yZERhdGEsIDApOw0KDQoJCQkvLyBiaXQ6IDExLTA7IG1hc2sgMHgwRkZGOyBpbmRleCB0byBYRiByZWNvcmQNCgkJCSR4ZkluZGV4ID0gKDB4MEZGRiAmICRpeGZlKSA+PiAwOw0KDQoJCQkvLyBiaXQ6IDE1OyBtYXNrIDB4ODAwMDsgMCA9IHVzZXItZGVmaW5lZCBzdHlsZSwgMSA9IGJ1aWx0LWluIHN0eWxlDQoJCQkkaXNCdWlsdEluID0gKGJvb2wpICgoMHg4MDAwICYgJGl4ZmUpID4+IDE1KTsNCg0KCQkJaWYgKCRpc0J1aWx0SW4pIHsNCgkJCQkvLyBvZmZzZXQ6IDI7IHNpemU6IDE7IGlkZW50aWZpZXIgZm9yIGJ1aWx0LWluIHN0eWxlDQoJCQkJJGJ1aWx0SW5JZCA9IG9yZCgkcmVjb3JkRGF0YXsyfSk7DQoNCgkJCQlzd2l0Y2ggKCRidWlsdEluSWQpIHsNCgkJCQljYXNlIDB4MDA6DQoJCQkJCS8vIGN1cnJlbnRseSwgd2UgYXJlIG5vdCB1c2luZyB0aGlzIGZvciBhbnl0aGluZw0KCQkJCQlicmVhazsNCg0KCQkJCWRlZmF1bHQ6DQoJCQkJCWJyZWFrOw0KCQkJCX0NCg0KCQkJfSBlbHNlIHsNCgkJCQkvLyB1c2VyLWRlZmluZWQ7IG5vdCBzdXBwb3J0ZWQgYnkgUEhQRXhjZWwNCgkJCX0NCgkJfQ0KCX0NCg0KDQoJLyoqDQoJICogUmVhZCBQQUxFVFRFIHJlY29yZA0KCSAqLw0KCXByaXZhdGUgZnVuY3Rpb24gX3JlYWRQYWxldHRlKCkNCgl7DQoJCSRsZW5ndGggPSBzZWxmOjpfR2V0SW50MmQoJHRoaXMtPl9kYXRhLCAkdGhpcy0+X3BvcyArIDIpOw0KCQkkcmVjb3JkRGF0YSA9IHN1YnN0cigkdGhpcy0+X2RhdGEsICR0aGlzLT5fcG9zICsgNCwgJGxlbmd0aCk7DQoNCgkJLy8gbW92ZSBzdHJlYW0gcG9pbnRlciB0byBuZXh0IHJlY29yZA0KCQkkdGhpcy0+X3BvcyArPSA0ICsgJGxlbmd0aDsNCg0KCQlpZiAoISR0aGlzLT5fcmVhZERhdGFPbmx5KSB7DQoJCQkvLyBvZmZzZXQ6IDA7IHNpemU6IDI7IG51bWJlciBvZiBmb2xsb3dpbmcgY29sb3JzDQoJCQkkbm0gPSBzZWxmOjpfR2V0SW50MmQoJHJlY29yZERhdGEsIDApOw0KDQoJCQkvLyBsaXN0IG9mIFJHQiBjb2xvcnMNCgkJCWZvciAoJGkgPSAwOyAkaSA8ICRubTsgKyskaSkgew0KCQkJCSRyZ2IgPSBzdWJzdHIoJHJlY29yZERhdGEsIDIgKyA0ICogJGksIDQpOw0KCQkJCSR0aGlzLT5fcGFsZXR0ZVtdID0gc2VsZjo6X3JlYWRSR0IoJHJnYik7DQoJCQl9DQoJCX0NCgl9DQoNCg0KCS8qKg0KCSAqIFNIRUVUDQoJICoNCgkgKiBUaGlzIHJlY29yZCBpcyAgbG9jYXRlZCBpbiB0aGUgIFdvcmtib29rIEdsb2JhbHMNCgkgKiBTdWJzdHJlYW0gIGFuZCByZXByZXNlbnRzIGEgc2hlZXQgaW5zaWRlIHRoZSB3b3JrYm9vay4NCgkgKiBPbmUgU0hFRVQgcmVjb3JkIGlzIHdyaXR0ZW4gZm9yIGVhY2ggc2hlZXQuIEl0IHN0b3JlcyB0aGUNCgkgKiBzaGVldCBuYW1lIGFuZCBhIHN0cmVhbSBvZmZzZXQgdG8gdGhlIEJPRiByZWNvcmQgb2YgdGhlDQoJICogcmVzcGVjdGl2ZSBTaGVldCBTdWJzdHJlYW0gd2l0aGluIHRoZSBXb3JrYm9vayBTdHJlYW0uDQoJICoNCgkgKiAtLQkiT3Blbk9mZmljZS5vcmcncyBEb2N1bWVudGF0aW9uIG9mIHRoZSBNaWNyb3NvZnQNCgkgKiAJCUV4Y2VsIEZpbGUgRm9ybWF0Ig0KCSAqLw0KCXByaXZhdGUgZnVuY3Rpb24gX3JlYWRTaGVldCgpDQoJew0KCQkkbGVuZ3RoID0gc2VsZjo6X0dldEludDJkKCR0aGlzLT5fZGF0YSwgJHRoaXMtPl9wb3MgKyAyKTsNCgkJJHJlY29yZERhdGEgPSBzdWJzdHIoJHRoaXMtPl9kYXRhLCAkdGhpcy0+X3BvcyArIDQsICRsZW5ndGgpOw0KDQoJCS8vIG1vdmUgc3RyZWFtIHBvaW50ZXIgdG8gbmV4dCByZWNvcmQNCgkJJHRoaXMtPl9wb3MgKz0gNCArICRsZW5ndGg7DQoNCgkJLy8gb2Zmc2V0OiAwOyBzaXplOiA0OyBhYnNvbHV0ZSBzdHJlYW0gcG9zaXRpb24gb2YgdGhlIEJPRiByZWNvcmQgb2YgdGhlIHNoZWV0DQoJCSRyZWNfb2Zmc2V0ID0gc2VsZjo6X0dldEludDRkKCRyZWNvcmREYXRhLCAwKTsNCg0KCQkvLyBvZmZzZXQ6IDQ7IHNpemU6IDE7IHNoZWV0IHN0YXRlDQoJCXN3aXRjaCAob3JkKCRyZWNvcmREYXRhezR9KSkgew0KCQkJY2FzZSAweDAwOiAkc2hlZXRTdGF0ZSA9IFBIUEV4Y2VsX1dvcmtzaGVldDo6U0hFRVRTVEFURV9WSVNJQkxFOyAgICBicmVhazsNCgkJCWNhc2UgMHgwMTogJHNoZWV0U3RhdGUgPSBQSFBFeGNlbF9Xb3Jrc2hlZXQ6OlNIRUVUU1RBVEVfSElEREVOOyAgICAgYnJlYWs7DQoJCQljYXNlIDB4MDI6ICRzaGVldFN0YXRlID0gUEhQRXhjZWxfV29ya3NoZWV0OjpTSEVFVFNUQVRFX1ZFUllISURERU47IGJyZWFrOw0KCQkJZGVmYXVsdDogJHNoZWV0U3RhdGUgPSBQSFBFeGNlbF9Xb3Jrc2hlZXQ6OlNIRUVUU1RBVEVfVklTSUJMRTsgICAgICBicmVhazsNCgkJfQ0KDQoJCS8vIG9mZnNldDogNTsgc2l6ZTogMTsgc2hlZXQgdHlwZQ0KCQkkc2hlZXRUeXBlID0gb3JkKCRyZWNvcmREYXRhezV9KTsNCg0KCQkvLyBvZmZzZXQ6IDY7IHNpemU6IHZhcjsgc2hlZXQgbmFtZQ0KCQlpZiAoJHRoaXMtPl92ZXJzaW9uID09IHNlbGY6OlhMU19CSUZGOCkgew0KCQkJJHN0cmluZyA9IHNlbGY6Ol9yZWFkVW5pY29kZVN0cmluZ1Nob3J0KHN1YnN0cigkcmVjb3JkRGF0YSwgNikpOw0KCQkJJHJlY19uYW1lID0gJHN0cmluZ1sndmFsdWUnXTsNCgkJfSBlbHNlaWYgKCR0aGlzLT5fdmVyc2lvbiA9PSBzZWxmOjpYTFNfQklGRjcpIHsNCgkJCSRzdHJpbmcgPSAkdGhpcy0+X3JlYWRCeXRlU3RyaW5nU2hvcnQoc3Vic3RyKCRyZWNvcmREYXRhLCA2KSk7DQoJCQkkcmVjX25hbWUgPSAkc3RyaW5nWyd2YWx1ZSddOw0KCQl9DQoNCgkJJHRoaXMtPl9zaGVldHNbXSA9IGFycmF5KA0KCQkJJ25hbWUnID0+ICRyZWNfbmFtZSwNCgkJCSdvZmZzZXQnID0+ICRyZWNfb2Zmc2V0LA0KCQkJJ3NoZWV0U3RhdGUnID0+ICRzaGVldFN0YXRlLA0KCQkJJ3NoZWV0VHlwZScgPT4gJHNoZWV0VHlwZSwNCgkJKTsNCgl9DQoNCg0KCS8qKg0KCSAqIFJlYWQgRVhURVJOQUxCT09LIHJlY29yZA0KCSAqLw0KCXByaXZhdGUgZnVuY3Rpb24gX3JlYWRFeHRlcm5hbEJvb2soKQ0KCXsNCgkJJGxlbmd0aCA9IHNlbGY6Ol9HZXRJbnQyZCgkdGhpcy0+X2RhdGEsICR0aGlzLT5fcG9zICsgMik7DQoJCSRyZWNvcmREYXRhID0gc3Vic3RyKCR0aGlzLT5fZGF0YSwgJHRoaXMtPl9wb3MgKyA0LCAkbGVuZ3RoKTsNCg0KCQkvLyBtb3ZlIHN0cmVhbSBwb2ludGVyIHRvIG5leHQgcmVjb3JkDQoJCSR0aGlzLT5fcG9zICs9IDQgKyAkbGVuZ3RoOw0KDQoJCS8vIG9mZnNldCB3aXRoaW4gcmVjb3JkIGRhdGENCgkJJG9mZnNldCA9IDA7DQoNCgkJLy8gdGhlcmUgYXJlIDQgdHlwZXMgb2YgcmVjb3Jkcw0KCQlpZiAoc3RybGVuKCRyZWNvcmREYXRhKSA+IDQpIHsNCgkJCS8vIGV4dGVybmFsIHJlZmVyZW5jZQ0KCQkJLy8gb2Zmc2V0OiAwOyBzaXplOiAyOyBudW1iZXIgb2Ygc2hlZXQgbmFtZXMgKCRubSkNCgkJCSRubSA9IHNlbGY6Ol9HZXRJbnQyZCgkcmVjb3JkRGF0YSwgMCk7DQoJCQkkb2Zmc2V0ICs9IDI7DQoNCgkJCS8vIG9mZnNldDogMjsgc2l6ZTogdmFyOyBlbmNvZGVkIFVSTCB3aXRob3V0IHNoZWV0IG5hbWUgKFVuaWNvZGUgc3RyaW5nLCAxNi1iaXQgbGVuZ3RoKQ0KCQkJJGVuY29kZWRVcmxTdHJpbmcgPSBzZWxmOjpfcmVhZFVuaWNvZGVTdHJpbmdMb25nKHN1YnN0cigkcmVjb3JkRGF0YSwgMikpOw0KCQkJJG9mZnNldCArPSAkZW5jb2RlZFVybFN0cmluZ1snc2l6ZSddOw0KDQoJCQkvLyBvZmZzZXQ6IHZhcjsgc2l6ZTogdmFyOyBsaXN0IG9mICRubSBzaGVldCBuYW1lcyAoVW5pY29kZSBzdHJpbmdzLCAxNi1iaXQgbGVuZ3RoKQ0KCQkJJGV4dGVybmFsU2hlZXROYW1lcyA9IGFycmF5KCk7DQoJCQlmb3IgKCRpID0gMDsgJGkgPCAkbm07ICsrJGkpIHsNCgkJCQkkZXh0ZXJuYWxTaGVldE5hbWVTdHJpbmcgPSBzZWxmOjpfcmVhZFVuaWNvZGVTdHJpbmdMb25nKHN1YnN0cigkcmVjb3JkRGF0YSwgJG9mZnNldCkpOw0KCQkJCSRleHRlcm5hbFNoZWV0TmFtZXNbXSA9ICRleHRlcm5hbFNoZWV0TmFtZVN0cmluZ1sndmFsdWUnXTsNCgkJCQkkb2Zmc2V0ICs9ICRleHRlcm5hbFNoZWV0TmFtZVN0cmluZ1snc2l6ZSddOw0KCQkJfQ0KDQoJCQkvLyBzdG9yZSB0aGUgcmVjb3JkIGRhdGENCgkJCSR0aGlzLT5fZXh0ZXJuYWxCb29rc1tdID0gYXJyYXkoDQoJCQkJJ3R5cGUnID0+ICdleHRlcm5hbCcsDQoJCQkJJ2VuY29kZWRVcmwnID0+ICRlbmNvZGVkVXJsU3RyaW5nWyd2YWx1ZSddLA0KCQkJCSdleHRlcm5hbFNoZWV0TmFtZXMnID0+ICRleHRlcm5hbFNoZWV0TmFtZXMsDQoJCQkpOw0KDQoJCX0gZWxzZWlmIChzdWJzdHIoJHJlY29yZERhdGEsIDIsIDIpID09IHBhY2soJ0NDJywgMHgwMSwgMHgwNCkpIHsNCgkJCS8vIGludGVybmFsIHJlZmVyZW5jZQ0KCQkJLy8gb2Zmc2V0OiAwOyBzaXplOiAyOyBudW1iZXIgb2Ygc2hlZXQgaW4gdGhpcyBkb2N1bWVudA0KCQkJLy8gb2Zmc2V0OiAyOyBzaXplOiAyOyAweDAxIDB4MDQNCgkJCSR0aGlzLT5fZXh0ZXJuYWxCb29rc1tdID0gYXJyYXkoDQoJCQkJJ3R5cGUnID0+ICdpbnRlcm5hbCcsDQoJCQkpOw0KCQl9IGVsc2VpZiAoc3Vic3RyKCRyZWNvcmREYXRhLCAwLCA0KSA9PSBwYWNrKCd2Q0MnLCAweDAwMDEsIDB4MDEsIDB4M0EpKSB7DQoJCQkvLyBhZGQtaW4gZnVuY3Rpb24NCgkJCS8vIG9mZnNldDogMDsgc2l6ZTogMjsgMHgwMDAxDQoJCQkkdGhpcy0+X2V4dGVybmFsQm9va3NbXSA9IGFycmF5KA0KCQkJCSd0eXBlJyA9PiAnYWRkSW5GdW5jdGlvbicsDQoJCQkpOw0KCQl9IGVsc2VpZiAoc3Vic3RyKCRyZWNvcmREYXRhLCAwLCAyKSA9PSBwYWNrKCd2JywgMHgwMDAwKSkgew0KCQkJLy8gRERFIGxpbmtzLCBPTEUgbGlua3MNCgkJCS8vIG9mZnNldDogMDsgc2l6ZTogMjsgMHgwMDAwDQoJCQkvLyBvZmZzZXQ6IDI7IHNpemU6IHZhcjsgZW5jb2RlZCBzb3VyY2UgZG9jdW1lbnQgbmFtZQ0KCQkJJHRoaXMtPl9leHRlcm5hbEJvb2tzW10gPSBhcnJheSgNCgkJCQkndHlwZScgPT4gJ0RERW9yT0xFJywNCgkJCSk7DQoJCX0NCgl9DQoNCg0KCS8qKg0KCSAqIFJlYWQgRVhURVJOTkFNRSByZWNvcmQuDQoJICovDQoJcHJpdmF0ZSBmdW5jdGlvbiBfcmVhZEV4dGVybk5hbWUoKQ0KCXsNCgkJJGxlbmd0aCA9IHNlbGY6Ol9HZXRJbnQyZCgkdGhpcy0+X2RhdGEsICR0aGlzLT5fcG9zICsgMik7DQoJCSRyZWNvcmREYXRhID0gc3Vic3RyKCR0aGlzLT5fZGF0YSwgJHRoaXMtPl9wb3MgKyA0LCAkbGVuZ3RoKTsNCg0KCQkvLyBtb3ZlIHN0cmVhbSBwb2ludGVyIHRvIG5leHQgcmVjb3JkDQoJCSR0aGlzLT5fcG9zICs9IDQgKyAkbGVuZ3RoOw0KDQoJCS8vIGV4dGVybmFsIHNoZWV0IHJlZmVyZW5jZXMgcHJvdmlkZWQgZm9yIG5hbWVkIGNlbGxzDQoJCWlmICgkdGhpcy0+X3ZlcnNpb24gPT0gc2VsZjo6WExTX0JJRkY4KSB7DQoJCQkvLyBvZmZzZXQ6IDA7IHNpemU6IDI7IG9wdGlvbnMNCgkJCSRvcHRpb25zID0gc2VsZjo6X0dldEludDJkKCRyZWNvcmREYXRhLCAwKTsNCg0KCQkJLy8gb2Zmc2V0OiAyOyBzaXplOiAyOw0KDQoJCQkvLyBvZmZzZXQ6IDQ7IHNpemU6IDI7IG5vdCB1c2VkDQoNCgkJCS8vIG9mZnNldDogNjsgc2l6ZTogdmFyDQoJCQkkbmFtZVN0cmluZyA9IHNlbGY6Ol9yZWFkVW5pY29kZVN0cmluZ1Nob3J0KHN1YnN0cigkcmVjb3JkRGF0YSwgNikpOw0KDQoJCQkvLyBvZmZzZXQ6IHZhcjsgc2l6ZTogdmFyOyBmb3JtdWxhIGRhdGENCgkJCSRvZmZzZXQgPSA2ICsgJG5hbWVTdHJpbmdbJ3NpemUnXTsNCgkJCSRmb3JtdWxhID0gJHRoaXMtPl9nZXRGb3JtdWxhRnJvbVN0cnVjdHVyZShzdWJzdHIoJHJlY29yZERhdGEsICRvZmZzZXQpKTsNCg0KCQkJJHRoaXMtPl9leHRlcm5hbE5hbWVzW10gPSBhcnJheSgNCgkJCQknbmFtZScgPT4gJG5hbWVTdHJpbmdbJ3ZhbHVlJ10sDQoJCQkJJ2Zvcm11bGEnID0+ICRmb3JtdWxhLA0KCQkJKTsNCgkJfQ0KCX0NCg0KDQoJLyoqDQoJICogUmVhZCBFWFRFUk5TSEVFVCByZWNvcmQNCgkgKi8NCglwcml2YXRlIGZ1bmN0aW9uIF9yZWFkRXh0ZXJuU2hlZXQoKQ0KCXsNCgkJJGxlbmd0aCA9IHNlbGY6Ol9HZXRJbnQyZCgkdGhpcy0+X2RhdGEsICR0aGlzLT5fcG9zICsgMik7DQoJCSRyZWNvcmREYXRhID0gc3Vic3RyKCR0aGlzLT5fZGF0YSwgJHRoaXMtPl9wb3MgKyA0LCAkbGVuZ3RoKTsNCg0KCQkvLyBtb3ZlIHN0cmVhbSBwb2ludGVyIHRvIG5leHQgcmVjb3JkDQoJCSR0aGlzLT5fcG9zICs9IDQgKyAkbGVuZ3RoOw0KDQoJCS8vIGV4dGVybmFsIHNoZWV0IHJlZmVyZW5jZXMgcHJvdmlkZWQgZm9yIG5hbWVkIGNlbGxzDQoJCWlmICgkdGhpcy0+X3ZlcnNpb24gPT0gc2VsZjo6WExTX0JJRkY4KSB7DQoJCQkvLyBvZmZzZXQ6IDA7IHNpemU6IDI7IG51bWJlciBvZiBmb2xsb3dpbmcgcmVmIHN0cnVjdHVyZXMNCgkJCSRubSA9IHNlbGY6Ol9HZXRJbnQyZCgkcmVjb3JkRGF0YSwgMCk7DQoJCQlmb3IgKCRpID0gMDsgJGkgPCAkbm07ICsrJGkpIHsNCgkJCQkkdGhpcy0+X3JlZltdID0gYXJyYXkoDQoJCQkJCS8vIG9mZnNldDogMiArIDYgKiAkaTsgaW5kZXggdG8gRVhURVJOQUxCT09LIHJlY29yZA0KCQkJCQknZXh0ZXJuYWxCb29rSW5kZXgnID0+IHNlbGY6Ol9HZXRJbnQyZCgkcmVjb3JkRGF0YSwgMiArIDYgKiAkaSksDQoJCQkJCS8vIG9mZnNldDogNCArIDYgKiAkaTsgaW5kZXggdG8gZmlyc3Qgc2hlZXQgaW4gRVhURVJOQUxCT09LIHJlY29yZA0KCQkJCQknZmlyc3RTaGVldEluZGV4JyA9PiBzZWxmOjpfR2V0SW50MmQoJHJlY29yZERhdGEsIDQgKyA2ICogJGkpLA0KCQkJCQkvLyBvZmZzZXQ6IDYgKyA2ICogJGk7IGluZGV4IHRvIGxhc3Qgc2hlZXQgaW4gRVhURVJOQUxCT09LIHJlY29yZA0KCQkJCQknbGFzdFNoZWV0SW5kZXgnID0+IHNlbGY6Ol9HZXRJbnQyZCgkcmVjb3JkRGF0YSwgNiArIDYgKiAkaSksDQoJCQkJKTsNCgkJCX0NCgkJfQ0KCX0NCg0KDQoJLyoqDQoJICogREVGSU5FRE5BTUUNCgkgKg0KCSAqIFRoaXMgcmVjb3JkIGlzIHBhcnQgb2YgYSBMaW5rIFRhYmxlLiBJdCBjb250YWlucyB0aGUgbmFtZQ0KCSAqIGFuZCB0aGUgdG9rZW4gYXJyYXkgb2YgYW4gaW50ZXJuYWwgZGVmaW5lZCBuYW1lLiBUb2tlbg0KCSAqIGFycmF5cyBvZiBkZWZpbmVkIG5hbWVzIGNvbnRhaW4gdG9rZW5zIHdpdGggYWJlcnJhbnQNCgkgKiB0b2tlbiBjbGFzc2VzLg0KCSAqDQoJICogLS0JIk9wZW5PZmZpY2Uub3JnJ3MgRG9jdW1lbnRhdGlvbiBvZiB0aGUgTWljcm9zb2Z0DQoJICogCQlFeGNlbCBGaWxlIEZvcm1hdCINCgkgKi8NCglwcml2YXRlIGZ1bmN0aW9uIF9yZWFkRGVmaW5lZE5hbWUoKQ0KCXsNCgkJJGxlbmd0aCA9IHNlbGY6Ol9HZXRJbnQyZCgkdGhpcy0+X2RhdGEsICR0aGlzLT5fcG9zICsgMik7DQoJCSRyZWNvcmREYXRhID0gc3Vic3RyKCR0aGlzLT5fZGF0YSwgJHRoaXMtPl9wb3MgKyA0LCAkbGVuZ3RoKTsNCg0KCQkvLyBtb3ZlIHN0cmVhbSBwb2ludGVyIHRvIG5leHQgcmVjb3JkDQoJCSR0aGlzLT5fcG9zICs9IDQgKyAkbGVuZ3RoOw0KDQoJCWlmICgkdGhpcy0+X3ZlcnNpb24gPT0gc2VsZjo6WExTX0JJRkY4KSB7DQoJCQkvLyByZXRyaWV2ZXMgbmFtZWQgY2VsbHMNCg0KCQkJLy8gb2Zmc2V0OiAwOyBzaXplOiAyOyBvcHRpb24gZmxhZ3MNCgkJCSRvcHRzID0gc2VsZjo6X0dldEludDJkKCRyZWNvcmREYXRhLCAwKTsNCg0KCQkJCS8vIGJpdDogNTsgbWFzazogMHgwMDIwOyAwID0gdXNlci1kZWZpbmVkIG5hbWUsIDEgPSBidWlsdC1pbi1uYW1lDQoJCQkJJGlzQnVpbHRJbk5hbWUgPSAoMHgwMDIwICYgJG9wdHMpID4+IDU7DQoNCgkJCS8vIG9mZnNldDogMjsgc2l6ZTogMTsga2V5Ym9hcmQgc2hvcnRjdXQNCg0KCQkJLy8gb2Zmc2V0OiAzOyBzaXplOiAxOyBsZW5ndGggb2YgdGhlIG5hbWUgKGNoYXJhY3RlciBjb3VudCkNCgkJCSRubGVuID0gb3JkKCRyZWNvcmREYXRhezN9KTsNCg0KCQkJLy8gb2Zmc2V0OiA0OyBzaXplOiAyOyBzaXplIG9mIHRoZSBmb3JtdWxhIGRhdGEgKGl0IGNhbiBoYXBwZW4gdGhhdCB0aGlzIGlzIHplcm8pDQoJCQkvLyBub3RlOiB0aGVyZSBjYW4gYWxzbyBiZSBhZGRpdGlvbmFsIGRhdGEsIHRoaXMgaXMgbm90IGluY2x1ZGVkIGluICRmbGVuDQoJCQkkZmxlbiA9IHNlbGY6Ol9HZXRJbnQyZCgkcmVjb3JkRGF0YSwgNCk7DQoNCgkJCS8vIG9mZnNldDogODsgc2l6ZTogMjsgMD1HbG9iYWwgbmFtZSwgb3RoZXJ3aXNlIGluZGV4IHRvIHNoZWV0ICgxLWJhc2VkKQ0KCQkJJHNjb3BlID0gc2VsZjo6X0dldEludDJkKCRyZWNvcmREYXRhLCA4KTsNCg0KCQkJLy8gb2Zmc2V0OiAxNDsgc2l6ZTogdmFyOyBOYW1lIChVbmljb2RlIHN0cmluZyB3aXRob3V0IGxlbmd0aCBmaWVsZCkNCgkJCSRzdHJpbmcgPSBzZWxmOjpfcmVhZFVuaWNvZGVTdHJpbmcoc3Vic3RyKCRyZWNvcmREYXRhLCAxNCksICRubGVuKTsNCg0KCQkJLy8gb2Zmc2V0OiB2YXI7IHNpemU6ICRmbGVuOyBmb3JtdWxhIGRhdGENCgkJCSRvZmZzZXQgPSAxNCArICRzdHJpbmdbJ3NpemUnXTsNCgkJCSRmb3JtdWxhU3RydWN0dXJlID0gcGFjaygndicsICRmbGVuKSAuIHN1YnN0cigkcmVjb3JkRGF0YSwgJG9mZnNldCk7DQoNCgkJCXRyeSB7DQoJCQkJJGZvcm11bGEgPSAkdGhpcy0+X2dldEZvcm11bGFGcm9tU3RydWN0dXJlKCRmb3JtdWxhU3RydWN0dXJlKTsNCgkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiAkZSkgew0KCQkJCSRmb3JtdWxhID0gJyc7DQoJCQl9DQoNCgkJCSR0aGlzLT5fZGVmaW5lZG5hbWVbXSA9IGFycmF5KA0KCQkJCSdpc0J1aWx0SW5OYW1lJyA9PiAkaXNCdWlsdEluTmFtZSwNCgkJCQknbmFtZScgPT4gJHN0cmluZ1sndmFsdWUnXSwNCgkJCQknZm9ybXVsYScgPT4gJGZvcm11bGEsDQoJCQkJJ3Njb3BlJyA9PiAkc2NvcGUsDQoJCQkpOw0KCQl9DQoJfQ0KDQoNCgkvKioNCgkgKiBSZWFkIE1TT0RSQVdJTkdHUk9VUCByZWNvcmQNCgkgKi8NCglwcml2YXRlIGZ1bmN0aW9uIF9yZWFkTXNvRHJhd2luZ0dyb3VwKCkNCgl7DQoJCSRsZW5ndGggPSBzZWxmOjpfR2V0SW50MmQoJHRoaXMtPl9kYXRhLCAkdGhpcy0+X3BvcyArIDIpOw0KDQoJCS8vIGdldCBzcGxpY2VkIHJlY29yZCBkYXRhDQoJCSRzcGxpY2VkUmVjb3JkRGF0YSA9ICR0aGlzLT5fZ2V0U3BsaWNlZFJlY29yZERhdGEoKTsNCgkJJHJlY29yZERhdGEgPSAkc3BsaWNlZFJlY29yZERhdGFbJ3JlY29yZERhdGEnXTsNCg0KCQkkdGhpcy0+X2RyYXdpbmdHcm91cERhdGEgLj0gJHJlY29yZERhdGE7DQoJfQ0KDQoNCgkvKioNCgkgKiBTU1QgLSBTaGFyZWQgU3RyaW5nIFRhYmxlDQoJICoNCgkgKiBUaGlzIHJlY29yZCBjb250YWlucyBhIGxpc3Qgb2YgYWxsIHN0cmluZ3MgdXNlZCBhbnl3aGVyZQ0KCSAqIGluIHRoZSB3b3JrYm9vay4gRWFjaCBzdHJpbmcgb2NjdXJzIG9ubHkgb25jZS4gVGhlDQoJICogd29ya2Jvb2sgdXNlcyBpbmRleGVzIGludG8gdGhlIGxpc3QgdG8gcmVmZXJlbmNlIHRoZQ0KCSAqIHN0cmluZ3MuDQoJICoNCgkgKiAtLQkiT3Blbk9mZmljZS5vcmcncyBEb2N1bWVudGF0aW9uIG9mIHRoZSBNaWNyb3NvZnQNCgkgKiAJCUV4Y2VsIEZpbGUgRm9ybWF0Ig0KCSAqKi8NCglwcml2YXRlIGZ1bmN0aW9uIF9yZWFkU3N0KCkNCgl7DQoJCS8vIG9mZnNldCB3aXRoaW4gKHNwbGljZWQpIHJlY29yZCBkYXRhDQoJCSRwb3MgPSAwOw0KDQoJCS8vIGdldCBzcGxpY2VkIHJlY29yZCBkYXRhDQoJCSRzcGxpY2VkUmVjb3JkRGF0YSA9ICR0aGlzLT5fZ2V0U3BsaWNlZFJlY29yZERhdGEoKTsNCg0KCQkkcmVjb3JkRGF0YSA9ICRzcGxpY2VkUmVjb3JkRGF0YVsncmVjb3JkRGF0YSddOw0KCQkkc3BsaWNlT2Zmc2V0cyA9ICRzcGxpY2VkUmVjb3JkRGF0YVsnc3BsaWNlT2Zmc2V0cyddOw0KDQoJCS8vIG9mZnNldDogMDsgc2l6ZTogNDsgdG90YWwgbnVtYmVyIG9mIHN0cmluZ3MgaW4gdGhlIHdvcmtib29rDQoJCSRwb3MgKz0gNDsNCg0KCQkvLyBvZmZzZXQ6IDQ7IHNpemU6IDQ7IG51bWJlciBvZiBmb2xsb3dpbmcgc3RyaW5ncyAoJG5tKQ0KCQkkbm0gPSBzZWxmOjpfR2V0SW50NGQoJHJlY29yZERhdGEsIDQpOw0KCQkkcG9zICs9IDQ7DQoNCgkJLy8gbG9vcCB0aHJvdWdoIHRoZSBVbmljb2RlIHN0cmluZ3MgKDE2LWJpdCBsZW5ndGgpDQoJCWZvciAoJGkgPSAwOyAkaSA8ICRubTsgKyskaSkgew0KDQoJCQkvLyBudW1iZXIgb2YgY2hhcmFjdGVycyBpbiB0aGUgVW5pY29kZSBzdHJpbmcNCgkJCSRudW1DaGFycyA9IHNlbGY6Ol9HZXRJbnQyZCgkcmVjb3JkRGF0YSwgJHBvcyk7DQoJCQkkcG9zICs9IDI7DQoNCgkJCS8vIG9wdGlvbiBmbGFncw0KCQkJJG9wdGlvbkZsYWdzID0gb3JkKCRyZWNvcmREYXRheyRwb3N9KTsNCgkJCSsrJHBvczsNCg0KCQkJLy8gYml0OiAwOyBtYXNrOiAweDAxOyAwID0gY29tcHJlc3NlZDsgMSA9IHVuY29tcHJlc3NlZA0KCQkJJGlzQ29tcHJlc3NlZCA9ICgoJG9wdGlvbkZsYWdzICYgMHgwMSkgPT0gMCkgOw0KDQoJCQkvLyBiaXQ6IDI7IG1hc2s6IDB4MDI7IDAgPSBvcmRpbmFyeTsgMSA9IEFzaWFuIHBob25ldGljDQoJCQkkaGFzQXNpYW4gPSAoKCRvcHRpb25GbGFncyAmIDB4MDQpICE9IDApOw0KDQoJCQkvLyBiaXQ6IDM7IG1hc2s6IDB4MDM7IDAgPSBvcmRpbmFyeTsgMSA9IFJpY2gtVGV4dA0KCQkJJGhhc1JpY2hUZXh0ID0gKCgkb3B0aW9uRmxhZ3MgJiAweDA4KSAhPSAwKTsNCg0KCQkJaWYgKCRoYXNSaWNoVGV4dCkgew0KCQkJCS8vIG51bWJlciBvZiBSaWNoLVRleHQgZm9ybWF0dGluZyBydW5zDQoJCQkJJGZvcm1hdHRpbmdSdW5zID0gc2VsZjo6X0dldEludDJkKCRyZWNvcmREYXRhLCAkcG9zKTsNCgkJCQkkcG9zICs9IDI7DQoJCQl9DQoNCgkJCWlmICgkaGFzQXNpYW4pIHsNCgkJCQkvLyBzaXplIG9mIEFzaWFuIHBob25ldGljIHNldHRpbmcNCgkJCQkkZXh0ZW5kZWRSdW5MZW5ndGggPSBzZWxmOjpfR2V0SW50NGQoJHJlY29yZERhdGEsICRwb3MpOw0KCQkJCSRwb3MgKz0gNDsNCgkJCX0NCg0KCQkJLy8gZXhwZWN0ZWQgYnl0ZSBsZW5ndGggb2YgY2hhcmFjdGVyIGFycmF5IGlmIG5vdCBzcGxpdA0KCQkJJGxlbiA9ICgkaXNDb21wcmVzc2VkKSA/ICRudW1DaGFycyA6ICRudW1DaGFycyAqIDI7DQoNCgkJCS8vIGxvb2sgdXAgbGltaXQgcG9zaXRpb24NCgkJCWZvcmVhY2ggKCRzcGxpY2VPZmZzZXRzIGFzICRzcGxpY2VPZmZzZXQpIHsNCgkJCQkvLyBpdCBjYW4gaGFwcGVuIHRoYXQgdGhlIHN0cmluZyBpcyBlbXB0eSwgdGhlcmVmb3JlIHdlIG5lZWQNCgkJCQkvLyA8PSBhbmQgbm90IGp1c3QgPA0KCQkJCWlmICgkcG9zIDw9ICRzcGxpY2VPZmZzZXQpIHsNCgkJCQkJJGxpbWl0cG9zID0gJHNwbGljZU9mZnNldDsNCgkJCQkJYnJlYWs7DQoJCQkJfQ0KCQkJfQ0KDQoJCQlpZiAoJHBvcyArICRsZW4gPD0gJGxpbWl0cG9zKSB7DQoJCQkJLy8gY2hhcmFjdGVyIGFycmF5IGlzIG5vdCBzcGxpdCBiZXR3ZWVuIHJlY29yZHMNCg0KCQkJCSRyZXRzdHIgPSBzdWJzdHIoJHJlY29yZERhdGEsICRwb3MsICRsZW4pOw0KCQkJCSRwb3MgKz0gJGxlbjsNCg0KCQkJfSBlbHNlIHsNCgkJCQkvLyBjaGFyYWN0ZXIgYXJyYXkgaXMgc3BsaXQgYmV0d2VlbiByZWNvcmRzDQoNCgkJCQkvLyBmaXJzdCBwYXJ0IG9mIGNoYXJhY3RlciBhcnJheQ0KCQkJCSRyZXRzdHIgPSBzdWJzdHIoJHJlY29yZERhdGEsICRwb3MsICRsaW1pdHBvcyAtICRwb3MpOw0KDQoJCQkJJGJ5dGVzUmVhZCA9ICRsaW1pdHBvcyAtICRwb3M7DQoNCgkJCQkvLyByZW1haW5pbmcgY2hhcmFjdGVycyBpbiBVbmljb2RlIHN0cmluZw0KCQkJCSRjaGFyc0xlZnQgPSAkbnVtQ2hhcnMgLSAoKCRpc0NvbXByZXNzZWQpID8gJGJ5dGVzUmVhZCA6ICgkYnl0ZXNSZWFkIC8gMikpOw0KDQoJCQkJJHBvcyA9ICRsaW1pdHBvczsNCg0KCQkJCS8vIGtlZXAgcmVhZGluZyB0aGUgY2hhcmFjdGVycw0KCQkJCXdoaWxlICgkY2hhcnNMZWZ0ID4gMCkgew0KDQoJCQkJCS8vIGxvb2sgdXAgbmV4dCBsaW1pdCBwb3NpdGlvbiwgaW4gY2FzZSB0aGUgc3RyaW5nIHNwYW4gbW9yZSB0aGFuIG9uZSBjb250aW51ZSByZWNvcmQNCgkJCQkJZm9yZWFjaCAoJHNwbGljZU9mZnNldHMgYXMgJHNwbGljZU9mZnNldCkgew0KCQkJCQkJaWYgKCRwb3MgPCAkc3BsaWNlT2Zmc2V0KSB7DQoJCQkJCQkJJGxpbWl0cG9zID0gJHNwbGljZU9mZnNldDsNCgkJCQkJCQlicmVhazsNCgkJCQkJCX0NCgkJCQkJfQ0KDQoJCQkJCS8vIHJlcGVhdGVkIG9wdGlvbiBmbGFncw0KCQkJCQkvLyBPcGVuT2ZmaWNlLm9yZyBkb2N1bWVudGF0aW9uIDUuMjENCgkJCQkJJG9wdGlvbiA9IG9yZCgkcmVjb3JkRGF0YXskcG9zfSk7DQoJCQkJCSsrJHBvczsNCg0KCQkJCQlpZiAoJGlzQ29tcHJlc3NlZCAmJiAoJG9wdGlvbiA9PSAwKSkgew0KCQkJCQkJLy8gMXN0IGZyYWdtZW50IGNvbXByZXNzZWQNCgkJCQkJCS8vIHRoaXMgZnJhZ21lbnQgY29tcHJlc3NlZA0KCQkJCQkJJGxlbiA9IG1pbigkY2hhcnNMZWZ0LCAkbGltaXRwb3MgLSAkcG9zKTsNCgkJCQkJCSRyZXRzdHIgLj0gc3Vic3RyKCRyZWNvcmREYXRhLCAkcG9zLCAkbGVuKTsNCgkJCQkJCSRjaGFyc0xlZnQgLT0gJGxlbjsNCgkJCQkJCSRpc0NvbXByZXNzZWQgPSB0cnVlOw0KDQoJCQkJCX0gZWxzZWlmICghJGlzQ29tcHJlc3NlZCAmJiAoJG9wdGlvbiAhPSAwKSkgew0KCQkJCQkJLy8gMXN0IGZyYWdtZW50IHVuY29tcHJlc3NlZA0KCQkJCQkJLy8gdGhpcyBmcmFnbWVudCB1bmNvbXByZXNzZWQNCgkJCQkJCSRsZW4gPSBtaW4oJGNoYXJzTGVmdCAqIDIsICRsaW1pdHBvcyAtICRwb3MpOw0KCQkJCQkJJHJldHN0ciAuPSBzdWJzdHIoJHJlY29yZERhdGEsICRwb3MsICRsZW4pOw0KCQkJCQkJJGNoYXJzTGVmdCAtPSAkbGVuIC8gMjsNCgkJCQkJCSRpc0NvbXByZXNzZWQgPSBmYWxzZTsNCg0KCQkJCQl9IGVsc2VpZiAoISRpc0NvbXByZXNzZWQgJiYgKCRvcHRpb24gPT0gMCkpIHsNCgkJCQkJCS8vIDFzdCBmcmFnbWVudCB1bmNvbXByZXNzZWQNCgkJCQkJCS8vIHRoaXMgZnJhZ21lbnQgY29tcHJlc3NlZA0KCQkJCQkJJGxlbiA9IG1pbigkY2hhcnNMZWZ0LCAkbGltaXRwb3MgLSAkcG9zKTsNCgkJCQkJCWZvciAoJGogPSAwOyAkaiA8ICRsZW47ICsrJGopIHsNCgkJCQkJCQkkcmV0c3RyIC49ICRyZWNvcmREYXRheyRwb3MgKyAkan0gLiBjaHIoMCk7DQoJCQkJCQl9DQoJCQkJCQkkY2hhcnNMZWZ0IC09ICRsZW47DQoJCQkJCQkkaXNDb21wcmVzc2VkID0gZmFsc2U7DQoNCgkJCQkJfSBlbHNlIHsNCgkJCQkJCS8vIDFzdCBmcmFnbWVudCBjb21wcmVzc2VkDQoJCQkJCQkvLyB0aGlzIGZyYWdtZW50IHVuY29tcHJlc3NlZA0KCQkJCQkJJG5ld3N0ciA9ICcnOw0KCQkJCQkJZm9yICgkaiA9IDA7ICRqIDwgc3RybGVuKCRyZXRzdHIpOyArKyRqKSB7DQoJCQkJCQkJJG5ld3N0ciAuPSAkcmV0c3RyWyRqXSAuIGNocigwKTsNCgkJCQkJCX0NCgkJCQkJCSRyZXRzdHIgPSAkbmV3c3RyOw0KCQkJCQkJJGxlbiA9IG1pbigkY2hhcnNMZWZ0ICogMiwgJGxpbWl0cG9zIC0gJHBvcyk7DQoJCQkJCQkkcmV0c3RyIC49IHN1YnN0cigkcmVjb3JkRGF0YSwgJHBvcywgJGxlbik7DQoJCQkJCQkkY2hhcnNMZWZ0IC09ICRsZW4gLyAyOw0KCQkJCQkJJGlzQ29tcHJlc3NlZCA9IGZhbHNlOw0KCQkJCQl9DQoNCgkJCQkJJHBvcyArPSAkbGVuOw0KCQkJCX0NCgkJCX0NCg0KCQkJLy8gY29udmVydCB0byBVVEYtOA0KCQkJJHJldHN0ciA9IHNlbGY6Ol9lbmNvZGVVVEYxNigkcmV0c3RyLCAkaXNDb21wcmVzc2VkKTsNCg0KCQkJLy8gcmVhZCBhZGRpdGlvbmFsIFJpY2gtVGV4dCBpbmZvcm1hdGlvbiwgaWYgYW55DQoJCQkkZm10UnVucyA9IGFycmF5KCk7DQoJCQlpZiAoJGhhc1JpY2hUZXh0KSB7DQoJCQkJLy8gbGlzdCBvZiBmb3JtYXR0aW5nIHJ1bnMNCgkJCQlmb3IgKCRqID0gMDsgJGogPCAkZm9ybWF0dGluZ1J1bnM7ICsrJGopIHsNCgkJCQkJLy8gZmlyc3QgZm9ybWF0dGVkIGNoYXJhY3RlcjsgemVyby1iYXNlZA0KCQkJCQkkY2hhclBvcyA9IHNlbGY6Ol9HZXRJbnQyZCgkcmVjb3JkRGF0YSwgJHBvcyArICRqICogNCk7DQoNCgkJCQkJLy8gaW5kZXggdG8gZm9udCByZWNvcmQNCgkJCQkJJGZvbnRJbmRleCA9IHNlbGY6Ol9HZXRJbnQyZCgkcmVjb3JkRGF0YSwgJHBvcyArIDIgKyAkaiAqIDQpOw0KDQoJCQkJCSRmbXRSdW5zW10gPSBhcnJheSgNCgkJCQkJCSdjaGFyUG9zJyA9PiAkY2hhclBvcywNCgkJCQkJCSdmb250SW5kZXgnID0+ICRmb250SW5kZXgsDQoJCQkJCSk7DQoJCQkJfQ0KCQkJCSRwb3MgKz0gNCAqICRmb3JtYXR0aW5nUnVuczsNCgkJCX0NCg0KCQkJLy8gcmVhZCBhZGRpdGlvbmFsIEFzaWFuIHBob25ldGljcyBpbmZvcm1hdGlvbiwgaWYgYW55DQoJCQlpZiAoJGhhc0FzaWFuKSB7DQoJCQkJLy8gRm9yIEFzaWFuIHBob25ldGljIHNldHRpbmdzLCB3ZSBza2lwIHRoZSBleHRlbmRlZCBzdHJpbmcgZGF0YQ0KCQkJCSRwb3MgKz0gJGV4dGVuZGVkUnVuTGVuZ3RoOw0KCQkJfQ0KDQoJCQkvLyBzdG9yZSB0aGUgc2hhcmVkIHN0aW5nDQoJCQkkdGhpcy0+X3NzdFtdID0gYXJyYXkoDQoJCQkJJ3ZhbHVlJyA9PiAkcmV0c3RyLA0KCQkJCSdmbXRSdW5zJyA9PiAkZm10UnVucywNCgkJCSk7DQoJCX0NCg0KCQkvLyBfZ2V0U3BsaWNlZFJlY29yZERhdGEoKSB0YWtlcyBjYXJlIG9mIG1vdmluZyBjdXJyZW50IHBvc2l0aW9uIGluIGRhdGEgc3RyZWFtDQoJfQ0KDQoNCgkvKioNCgkgKiBSZWFkIFBSSU5UR1JJRExJTkVTIHJlY29yZA0KCSAqLw0KCXByaXZhdGUgZnVuY3Rpb24gX3JlYWRQcmludEdyaWRsaW5lcygpDQoJew0KCQkkbGVuZ3RoID0gc2VsZjo6X0dldEludDJkKCR0aGlzLT5fZGF0YSwgJHRoaXMtPl9wb3MgKyAyKTsNCgkJJHJlY29yZERhdGEgPSBzdWJzdHIoJHRoaXMtPl9kYXRhLCAkdGhpcy0+X3BvcyArIDQsICRsZW5ndGgpOw0KDQoJCS8vIG1vdmUgc3RyZWFtIHBvaW50ZXIgdG8gbmV4dCByZWNvcmQNCgkJJHRoaXMtPl9wb3MgKz0gNCArICRsZW5ndGg7DQoNCgkJaWYgKCR0aGlzLT5fdmVyc2lvbiA9PSBzZWxmOjpYTFNfQklGRjggJiYgISR0aGlzLT5fcmVhZERhdGFPbmx5KSB7DQoJCQkvLyBvZmZzZXQ6IDA7IHNpemU6IDI7IDAgPSBkbyBub3QgcHJpbnQgc2hlZXQgZ3JpZCBsaW5lczsgMSA9IHByaW50IHNoZWV0IGdyaWRsaW5lcw0KCQkJJHByaW50R3JpZGxpbmVzID0gKGJvb2wpIHNlbGY6Ol9HZXRJbnQyZCgkcmVjb3JkRGF0YSwgMCk7DQoJCQkkdGhpcy0+X3BocFNoZWV0LT5zZXRQcmludEdyaWRsaW5lcygkcHJpbnRHcmlkbGluZXMpOw0KCQl9DQoJfQ0KDQoNCgkvKioNCgkgKiBSZWFkIERFRkFVTFRST1dIRUlHSFQgcmVjb3JkDQoJICovDQoJcHJpdmF0ZSBmdW5jdGlvbiBfcmVhZERlZmF1bHRSb3dIZWlnaHQoKQ0KCXsNCgkJJGxlbmd0aCA9IHNlbGY6Ol9HZXRJbnQyZCgkdGhpcy0+X2RhdGEsICR0aGlzLT5fcG9zICsgMik7DQoJCSRyZWNvcmREYXRhID0gc3Vic3RyKCR0aGlzLT5fZGF0YSwgJHRoaXMtPl9wb3MgKyA0LCAkbGVuZ3RoKTsNCg0KCQkvLyBtb3ZlIHN0cmVhbSBwb2ludGVyIHRvIG5leHQgcmVjb3JkDQoJCSR0aGlzLT5fcG9zICs9IDQgKyAkbGVuZ3RoOw0KDQoJCS8vIG9mZnNldDogMDsgc2l6ZTogMjsgb3B0aW9uIGZsYWdzDQoJCS8vIG9mZnNldDogMjsgc2l6ZTogMjsgZGVmYXVsdCBoZWlnaHQgZm9yIHVudXNlZCByb3dzLCAodHdpcHMgMS8yMCBwb2ludCkNCgkJJGhlaWdodCA9IHNlbGY6Ol9HZXRJbnQyZCgkcmVjb3JkRGF0YSwgMik7DQoJCSR0aGlzLT5fcGhwU2hlZXQtPmdldERlZmF1bHRSb3dEaW1lbnNpb24oKS0+c2V0Um93SGVpZ2h0KCRoZWlnaHQgLyAyMCk7DQoJfQ0KDQoNCgkvKioNCgkgKiBSZWFkIFNIRUVUUFIgcmVjb3JkDQoJICovDQoJcHJpdmF0ZSBmdW5jdGlvbiBfcmVhZFNoZWV0UHIoKQ0KCXsNCgkJJGxlbmd0aCA9IHNlbGY6Ol9HZXRJbnQyZCgkdGhpcy0+X2RhdGEsICR0aGlzLT5fcG9zICsgMik7DQoJCSRyZWNvcmREYXRhID0gc3Vic3RyKCR0aGlzLT5fZGF0YSwgJHRoaXMtPl9wb3MgKyA0LCAkbGVuZ3RoKTsNCg0KCQkvLyBtb3ZlIHN0cmVhbSBwb2ludGVyIHRvIG5leHQgcmVjb3JkDQoJCSR0aGlzLT5fcG9zICs9IDQgKyAkbGVuZ3RoOw0KDQoJCS8vIG9mZnNldDogMDsgc2l6ZTogMg0KDQoJCS8vIGJpdDogNjsgbWFzazogMHgwMDQwOyAwID0gb3V0bGluZSBidXR0b25zIGFib3ZlIG91dGxpbmUgZ3JvdXANCgkJJGlzU3VtbWFyeUJlbG93ID0gKDB4MDA0MCAmIHNlbGY6Ol9HZXRJbnQyZCgkcmVjb3JkRGF0YSwgMCkpID4+IDY7DQoJCSR0aGlzLT5fcGhwU2hlZXQtPnNldFNob3dTdW1tYXJ5QmVsb3coJGlzU3VtbWFyeUJlbG93KTsNCg0KCQkvLyBiaXQ6IDc7IG1hc2s6IDB4MDA4MDsgMCA9IG91dGxpbmUgYnV0dG9ucyBsZWZ0IG9mIG91dGxpbmUgZ3JvdXANCgkJJGlzU3VtbWFyeVJpZ2h0ID0gKDB4MDA4MCAmIHNlbGY6Ol9HZXRJbnQyZCgkcmVjb3JkRGF0YSwgMCkpID4+IDc7DQoJCSR0aGlzLT5fcGhwU2hlZXQtPnNldFNob3dTdW1tYXJ5UmlnaHQoJGlzU3VtbWFyeVJpZ2h0KTsNCg0KCQkvLyBiaXQ6IDg7IG1hc2s6IDB4MTAwOyAwID0gc2NhbGUgcHJpbnRvdXQgaW4gcGVyY2VudCwgMSA9IGZpdCBwcmludG91dCB0byBudW1iZXIgb2YgcGFnZXMNCgkJLy8gdGhpcyBjb3JyZXNwb25kcyB0byByYWRpbyBidXR0b24gc2V0dGluZyBpbiBwYWdlIHNldHVwIGRpYWxvZyBpbiBFeGNlbA0KCQkkdGhpcy0+X2lzRml0VG9QYWdlcyA9IChib29sKSAoKDB4MDEwMCAmIHNlbGY6Ol9HZXRJbnQyZCgkcmVjb3JkRGF0YSwgMCkpID4+IDgpOw0KCX0NCg0KDQoJLyoqDQoJICogUmVhZCBIT1JJWk9OVEFMUEFHRUJSRUFLUyByZWNvcmQNCgkgKi8NCglwcml2YXRlIGZ1bmN0aW9uIF9yZWFkSG9yaXpvbnRhbFBhZ2VCcmVha3MoKQ0KCXsNCgkJJGxlbmd0aCA9IHNlbGY6Ol9HZXRJbnQyZCgkdGhpcy0+X2RhdGEsICR0aGlzLT5fcG9zICsgMik7DQoJCSRyZWNvcmREYXRhID0gc3Vic3RyKCR0aGlzLT5fZGF0YSwgJHRoaXMtPl9wb3MgKyA0LCAkbGVuZ3RoKTsNCg0KCQkvLyBtb3ZlIHN0cmVhbSBwb2ludGVyIHRvIG5leHQgcmVjb3JkDQoJCSR0aGlzLT5fcG9zICs9IDQgKyAkbGVuZ3RoOw0KDQoJCWlmICgkdGhpcy0+X3ZlcnNpb24gPT0gc2VsZjo6WExTX0JJRkY4ICYmICEkdGhpcy0+X3JlYWREYXRhT25seSkgew0KDQoJCQkvLyBvZmZzZXQ6IDA7IHNpemU6IDI7IG51bWJlciBvZiB0aGUgZm9sbG93aW5nIHJvdyBpbmRleCBzdHJ1Y3R1cmVzDQoJCQkkbm0gPSBzZWxmOjpfR2V0SW50MmQoJHJlY29yZERhdGEsIDApOw0KDQoJCQkvLyBvZmZzZXQ6IDI7IHNpemU6IDYgKiAkbm07IGxpc3Qgb2YgJG5tIHJvdyBpbmRleCBzdHJ1Y3R1cmVzDQoJCQlmb3IgKCRpID0gMDsgJGkgPCAkbm07ICsrJGkpIHsNCgkJCQkkciA9IHNlbGY6Ol9HZXRJbnQyZCgkcmVjb3JkRGF0YSwgMiArIDYgKiAkaSk7DQoJCQkJJGNmID0gc2VsZjo6X0dldEludDJkKCRyZWNvcmREYXRhLCAyICsgNiAqICRpICsgMik7DQoJCQkJJGNsID0gc2VsZjo6X0dldEludDJkKCRyZWNvcmREYXRhLCAyICsgNiAqICRpICsgNCk7DQoNCgkJCQkvLyBub3Qgc3VyZSB3aHkgdHdvIGNvbHVtbiBpbmRleGVzIGFyZSBuZWNlc3Nhcnk/DQoJCQkJJHRoaXMtPl9waHBTaGVldC0+c2V0QnJlYWtCeUNvbHVtbkFuZFJvdygkY2YsICRyLCBQSFBFeGNlbF9Xb3Jrc2hlZXQ6OkJSRUFLX1JPVyk7DQoJCQl9DQoJCX0NCgl9DQoNCg0KCS8qKg0KCSAqIFJlYWQgVkVSVElDQUxQQUdFQlJFQUtTIHJlY29yZA0KCSAqLw0KCXByaXZhdGUgZnVuY3Rpb24gX3JlYWRWZXJ0aWNhbFBhZ2VCcmVha3MoKQ0KCXsNCgkJJGxlbmd0aCA9IHNlbGY6Ol9HZXRJbnQyZCgkdGhpcy0+X2RhdGEsICR0aGlzLT5fcG9zICsgMik7DQoJCSRyZWNvcmREYXRhID0gc3Vic3RyKCR0aGlzLT5fZGF0YSwgJHRoaXMtPl9wb3MgKyA0LCAkbGVuZ3RoKTsNCg0KCQkvLyBtb3ZlIHN0cmVhbSBwb2ludGVyIHRvIG5leHQgcmVjb3JkDQoJCSR0aGlzLT5fcG9zICs9IDQgKyAkbGVuZ3RoOw0KDQoJCWlmICgkdGhpcy0+X3ZlcnNpb24gPT0gc2VsZjo6WExTX0JJRkY4ICYmICEkdGhpcy0+X3JlYWREYXRhT25seSkgew0KCQkJLy8gb2Zmc2V0OiAwOyBzaXplOiAyOyBudW1iZXIgb2YgdGhlIGZvbGxvd2luZyBjb2x1bW4gaW5kZXggc3RydWN0dXJlcw0KCQkJJG5tID0gc2VsZjo6X0dldEludDJkKCRyZWNvcmREYXRhLCAwKTsNCg0KCQkJLy8gb2Zmc2V0OiAyOyBzaXplOiA2ICogJG5tOyBsaXN0IG9mICRubSByb3cgaW5kZXggc3RydWN0dXJlcw0KCQkJZm9yICgkaSA9IDA7ICRpIDwgJG5tOyArKyRpKSB7DQoJCQkJJGMgPSBzZWxmOjpfR2V0SW50MmQoJHJlY29yZERhdGEsIDIgKyA2ICogJGkpOw0KCQkJCSRyZiA9IHNlbGY6Ol9HZXRJbnQyZCgkcmVjb3JkRGF0YSwgMiArIDYgKiAkaSArIDIpOw0KCQkJCSRybCA9IHNlbGY6Ol9HZXRJbnQyZCgkcmVjb3JkRGF0YSwgMiArIDYgKiAkaSArIDQpOw0KDQoJCQkJLy8gbm90IHN1cmUgd2h5IHR3byByb3cgaW5kZXhlcyBhcmUgbmVjZXNzYXJ5Pw0KCQkJCSR0aGlzLT5fcGhwU2hlZXQtPnNldEJyZWFrQnlDb2x1bW5BbmRSb3coJGMsICRyZiwgUEhQRXhjZWxfV29ya3NoZWV0OjpCUkVBS19DT0xVTU4pOw0KCQkJfQ0KCQl9DQoJfQ0KDQoNCgkvKioNCgkgKiBSZWFkIEhFQURFUiByZWNvcmQNCgkgKi8NCglwcml2YXRlIGZ1bmN0aW9uIF9yZWFkSGVhZGVyKCkNCgl7DQoJCSRsZW5ndGggPSBzZWxmOjpfR2V0SW50MmQoJHRoaXMtPl9kYXRhLCAkdGhpcy0+X3BvcyArIDIpOw0KCQkkcmVjb3JkRGF0YSA9IHN1YnN0cigkdGhpcy0+X2RhdGEsICR0aGlzLT5fcG9zICsgNCwgJGxlbmd0aCk7DQoNCgkJLy8gbW92ZSBzdHJlYW0gcG9pbnRlciB0byBuZXh0IHJlY29yZA0KCQkkdGhpcy0+X3BvcyArPSA0ICsgJGxlbmd0aDsNCg0KCQlpZiAoISR0aGlzLT5fcmVhZERhdGFPbmx5KSB7DQoJCQkvLyBvZmZzZXQ6IDA7IHNpemU6IHZhcg0KCQkJLy8gcmVhbGl6ZWQgdGhhdCAkcmVjb3JkRGF0YSBjYW4gYmUgZW1wdHkgZXZlbiB3aGVuIHJlY29yZCBleGlzdHMNCgkJCWlmICgkcmVjb3JkRGF0YSkgew0KCQkJCWlmICgkdGhpcy0+X3ZlcnNpb24gPT0gc2VsZjo6WExTX0JJRkY4KSB7DQoJCQkJCSRzdHJpbmcgPSBzZWxmOjpfcmVhZFVuaWNvZGVTdHJpbmdMb25nKCRyZWNvcmREYXRhKTsNCgkJCQl9IGVsc2Ugew0KCQkJCQkkc3RyaW5nID0gJHRoaXMtPl9yZWFkQnl0ZVN0cmluZ1Nob3J0KCRyZWNvcmREYXRhKTsNCgkJCQl9DQoNCgkJCQkkdGhpcy0+X3BocFNoZWV0LT5nZXRIZWFkZXJGb290ZXIoKS0+c2V0T2RkSGVhZGVyKCRzdHJpbmdbJ3ZhbHVlJ10pOw0KCQkJCSR0aGlzLT5fcGhwU2hlZXQtPmdldEhlYWRlckZvb3RlcigpLT5zZXRFdmVuSGVhZGVyKCRzdHJpbmdbJ3ZhbHVlJ10pOw0KCQkJfQ0KCQl9DQoJfQ0KDQoNCgkvKioNCgkgKiBSZWFkIEZPT1RFUiByZWNvcmQNCgkgKi8NCglwcml2YXRlIGZ1bmN0aW9uIF9yZWFkRm9vdGVyKCkNCgl7DQoJCSRsZW5ndGggPSBzZWxmOjpfR2V0SW50MmQoJHRoaXMtPl9kYXRhLCAkdGhpcy0+X3BvcyArIDIpOw0KCQkkcmVjb3JkRGF0YSA9IHN1YnN0cigkdGhpcy0+X2RhdGEsICR0aGlzLT5fcG9zICsgNCwgJGxlbmd0aCk7DQoNCgkJLy8gbW92ZSBzdHJlYW0gcG9pbnRlciB0byBuZXh0IHJlY29yZA0KCQkkdGhpcy0+X3BvcyArPSA0ICsgJGxlbmd0aDsNCg0KCQlpZiAoISR0aGlzLT5fcmVhZERhdGFPbmx5KSB7DQoJCQkvLyBvZmZzZXQ6IDA7IHNpemU6IHZhcg0KCQkJLy8gcmVhbGl6ZWQgdGhhdCAkcmVjb3JkRGF0YSBjYW4gYmUgZW1wdHkgZXZlbiB3aGVuIHJlY29yZCBleGlzdHMNCgkJCWlmICgkcmVjb3JkRGF0YSkgew0KCQkJCWlmICgkdGhpcy0+X3ZlcnNpb24gPT0gc2VsZjo6WExTX0JJRkY4KSB7DQoJCQkJCSRzdHJpbmcgPSBzZWxmOjpfcmVhZFVuaWNvZGVTdHJpbmdMb25nKCRyZWNvcmREYXRhKTsNCgkJCQl9IGVsc2Ugew0KCQkJCQkkc3RyaW5nID0gJHRoaXMtPl9yZWFkQnl0ZVN0cmluZ1Nob3J0KCRyZWNvcmREYXRhKTsNCgkJCQl9DQoJCQkJJHRoaXMtPl9waHBTaGVldC0+Z2V0SGVhZGVyRm9vdGVyKCktPnNldE9kZEZvb3Rlcigkc3RyaW5nWyd2YWx1ZSddKTsNCgkJCQkkdGhpcy0+X3BocFNoZWV0LT5nZXRIZWFkZXJGb290ZXIoKS0+c2V0RXZlbkZvb3Rlcigkc3RyaW5nWyd2YWx1ZSddKTsNCgkJCX0NCgkJfQ0KCX0NCg0KDQoJLyoqDQoJICogUmVhZCBIQ0VOVEVSIHJlY29yZA0KCSAqLw0KCXByaXZhdGUgZnVuY3Rpb24gX3JlYWRIY2VudGVyKCkNCgl7DQoJCSRsZW5ndGggPSBzZWxmOjpfR2V0SW50MmQoJHRoaXMtPl9kYXRhLCAkdGhpcy0+X3BvcyArIDIpOw0KCQkkcmVjb3JkRGF0YSA9IHN1YnN0cigkdGhpcy0+X2RhdGEsICR0aGlzLT5fcG9zICsgNCwgJGxlbmd0aCk7DQoNCgkJLy8gbW92ZSBzdHJlYW0gcG9pbnRlciB0byBuZXh0IHJlY29yZA0KCQkkdGhpcy0+X3BvcyArPSA0ICsgJGxlbmd0aDsNCg0KCQlpZiAoISR0aGlzLT5fcmVhZERhdGFPbmx5KSB7DQoJCQkvLyBvZmZzZXQ6IDA7IHNpemU6IDI7IDAgPSBwcmludCBzaGVldCBsZWZ0IGFsaWduZWQsIDEgPSBwcmludCBzaGVldCBjZW50ZXJlZCBob3Jpem9udGFsbHkNCgkJCSRpc0hvcml6b250YWxDZW50ZXJlZCA9IChib29sKSBzZWxmOjpfR2V0SW50MmQoJHJlY29yZERhdGEsIDApOw0KDQoJCQkkdGhpcy0+X3BocFNoZWV0LT5nZXRQYWdlU2V0dXAoKS0+c2V0SG9yaXpvbnRhbENlbnRlcmVkKCRpc0hvcml6b250YWxDZW50ZXJlZCk7DQoJCX0NCgl9DQoNCg0KCS8qKg0KCSAqIFJlYWQgVkNFTlRFUiByZWNvcmQNCgkgKi8NCglwcml2YXRlIGZ1bmN0aW9uIF9yZWFkVmNlbnRlcigpDQoJew0KCQkkbGVuZ3RoID0gc2VsZjo6X0dldEludDJkKCR0aGlzLT5fZGF0YSwgJHRoaXMtPl9wb3MgKyAyKTsNCgkJJHJlY29yZERhdGEgPSBzdWJzdHIoJHRoaXMtPl9kYXRhLCAkdGhpcy0+X3BvcyArIDQsICRsZW5ndGgpOw0KDQoJCS8vIG1vdmUgc3RyZWFtIHBvaW50ZXIgdG8gbmV4dCByZWNvcmQNCgkJJHRoaXMtPl9wb3MgKz0gNCArICRsZW5ndGg7DQoNCgkJaWYgKCEkdGhpcy0+X3JlYWREYXRhT25seSkgew0KCQkJLy8gb2Zmc2V0OiAwOyBzaXplOiAyOyAwID0gcHJpbnQgc2hlZXQgYWxpZ25lZCBhdCB0b3AgcGFnZSBib3JkZXIsIDEgPSBwcmludCBzaGVldCB2ZXJ0aWNhbGx5IGNlbnRlcmVkDQoJCQkkaXNWZXJ0aWNhbENlbnRlcmVkID0gKGJvb2wpIHNlbGY6Ol9HZXRJbnQyZCgkcmVjb3JkRGF0YSwgMCk7DQoNCgkJCSR0aGlzLT5fcGhwU2hlZXQtPmdldFBhZ2VTZXR1cCgpLT5zZXRWZXJ0aWNhbENlbnRlcmVkKCRpc1ZlcnRpY2FsQ2VudGVyZWQpOw0KCQl9DQoJfQ0KDQoNCgkvKioNCgkgKiBSZWFkIExFRlRNQVJHSU4gcmVjb3JkDQoJICovDQoJcHJpdmF0ZSBmdW5jdGlvbiBfcmVhZExlZnRNYXJnaW4oKQ0KCXsNCgkJJGxlbmd0aCA9IHNlbGY6Ol9HZXRJbnQyZCgkdGhpcy0+X2RhdGEsICR0aGlzLT5fcG9zICsgMik7DQoJCSRyZWNvcmREYXRhID0gc3Vic3RyKCR0aGlzLT5fZGF0YSwgJHRoaXMtPl9wb3MgKyA0LCAkbGVuZ3RoKTsNCg0KCQkvLyBtb3ZlIHN0cmVhbSBwb2ludGVyIHRvIG5leHQgcmVjb3JkDQoJCSR0aGlzLT5fcG9zICs9IDQgKyAkbGVuZ3RoOw0KDQoJCWlmICghJHRoaXMtPl9yZWFkRGF0YU9ubHkpIHsNCgkJCS8vIG9mZnNldDogMDsgc2l6ZTogOA0KCQkJJHRoaXMtPl9waHBTaGVldC0+Z2V0UGFnZU1hcmdpbnMoKS0+c2V0TGVmdChzZWxmOjpfZXh0cmFjdE51bWJlcigkcmVjb3JkRGF0YSkpOw0KCQl9DQoJfQ0KDQoNCgkvKioNCgkgKiBSZWFkIFJJR0hUTUFSR0lOIHJlY29yZA0KCSAqLw0KCXByaXZhdGUgZnVuY3Rpb24gX3JlYWRSaWdodE1hcmdpbigpDQoJew0KCQkkbGVuZ3RoID0gc2VsZjo6X0dldEludDJkKCR0aGlzLT5fZGF0YSwgJHRoaXMtPl9wb3MgKyAyKTsNCgkJJHJlY29yZERhdGEgPSBzdWJzdHIoJHRoaXMtPl9kYXRhLCAkdGhpcy0+X3BvcyArIDQsICRsZW5ndGgpOw0KDQoJCS8vIG1vdmUgc3RyZWFtIHBvaW50ZXIgdG8gbmV4dCByZWNvcmQNCgkJJHRoaXMtPl9wb3MgKz0gNCArICRsZW5ndGg7DQoNCgkJaWYgKCEkdGhpcy0+X3JlYWREYXRhT25seSkgew0KCQkJLy8gb2Zmc2V0OiAwOyBzaXplOiA4DQoJCQkkdGhpcy0+X3BocFNoZWV0LT5nZXRQYWdlTWFyZ2lucygpLT5zZXRSaWdodChzZWxmOjpfZXh0cmFjdE51bWJlcigkcmVjb3JkRGF0YSkpOw0KCQl9DQoJfQ0KDQoNCgkvKioNCgkgKiBSZWFkIFRPUE1BUkdJTiByZWNvcmQNCgkgKi8NCglwcml2YXRlIGZ1bmN0aW9uIF9yZWFkVG9wTWFyZ2luKCkNCgl7DQoJCSRsZW5ndGggPSBzZWxmOjpfR2V0SW50MmQoJHRoaXMtPl9kYXRhLCAkdGhpcy0+X3BvcyArIDIpOw0KCQkkcmVjb3JkRGF0YSA9IHN1YnN0cigkdGhpcy0+X2RhdGEsICR0aGlzLT5fcG9zICsgNCwgJGxlbmd0aCk7DQoNCgkJLy8gbW92ZSBzdHJlYW0gcG9pbnRlciB0byBuZXh0IHJlY29yZA0KCQkkdGhpcy0+X3BvcyArPSA0ICsgJGxlbmd0aDsNCg0KCQlpZiAoISR0aGlzLT5fcmVhZERhdGFPbmx5KSB7DQoJCQkvLyBvZmZzZXQ6IDA7IHNpemU6IDgNCgkJCSR0aGlzLT5fcGhwU2hlZXQtPmdldFBhZ2VNYXJnaW5zKCktPnNldFRvcChzZWxmOjpfZXh0cmFjdE51bWJlcigkcmVjb3JkRGF0YSkpOw0KCQl9DQoJfQ0KDQoNCgkvKioNCgkgKiBSZWFkIEJPVFRPTU1BUkdJTiByZWNvcmQNCgkgKi8NCglwcml2YXRlIGZ1bmN0aW9uIF9yZWFkQm90dG9tTWFyZ2luKCkNCgl7DQoJCSRsZW5ndGggPSBzZWxmOjpfR2V0SW50MmQoJHRoaXMtPl9kYXRhLCAkdGhpcy0+X3BvcyArIDIpOw0KCQkkcmVjb3JkRGF0YSA9IHN1YnN0cigkdGhpcy0+X2RhdGEsICR0aGlzLT5fcG9zICsgNCwgJGxlbmd0aCk7DQoNCgkJLy8gbW92ZSBzdHJlYW0gcG9pbnRlciB0byBuZXh0IHJlY29yZA0KCQkkdGhpcy0+X3BvcyArPSA0ICsgJGxlbmd0aDsNCg0KCQlpZiAoISR0aGlzLT5fcmVhZERhdGFPbmx5KSB7DQoJCQkvLyBvZmZzZXQ6IDA7IHNpemU6IDgNCgkJCSR0aGlzLT5fcGhwU2hlZXQtPmdldFBhZ2VNYXJnaW5zKCktPnNldEJvdHRvbShzZWxmOjpfZXh0cmFjdE51bWJlcigkcmVjb3JkRGF0YSkpOw0KCQl9DQoJfQ0KDQoNCgkvKioNCgkgKiBSZWFkIFBBR0VTRVRVUCByZWNvcmQNCgkgKi8NCglwcml2YXRlIGZ1bmN0aW9uIF9yZWFkUGFnZVNldHVwKCkNCgl7DQoJCSRsZW5ndGggPSBzZWxmOjpfR2V0SW50MmQoJHRoaXMtPl9kYXRhLCAkdGhpcy0+X3BvcyArIDIpOw0KCQkkcmVjb3JkRGF0YSA9IHN1YnN0cigkdGhpcy0+X2RhdGEsICR0aGlzLT5fcG9zICsgNCwgJGxlbmd0aCk7DQoNCgkJLy8gbW92ZSBzdHJlYW0gcG9pbnRlciB0byBuZXh0IHJlY29yZA0KCQkkdGhpcy0+X3BvcyArPSA0ICsgJGxlbmd0aDsNCg0KCQlpZiAoISR0aGlzLT5fcmVhZERhdGFPbmx5KSB7DQoJCQkvLyBvZmZzZXQ6IDA7IHNpemU6IDI7IHBhcGVyIHNpemUNCgkJCSRwYXBlclNpemUgPSBzZWxmOjpfR2V0SW50MmQoJHJlY29yZERhdGEsIDApOw0KDQoJCQkvLyBvZmZzZXQ6IDI7IHNpemU6IDI7IHNjYWxpbmcgZmFjdG9yDQoJCQkkc2NhbGUgPSBzZWxmOjpfR2V0SW50MmQoJHJlY29yZERhdGEsIDIpOw0KDQoJCQkvLyBvZmZzZXQ6IDY7IHNpemU6IDI7IGZpdCB3b3Jrc2hlZXQgd2lkdGggdG8gdGhpcyBudW1iZXIgb2YgcGFnZXMsIDAgPSB1c2UgYXMgbWFueSBhcyBuZWVkZWQNCgkJCSRmaXRUb1dpZHRoID0gc2VsZjo6X0dldEludDJkKCRyZWNvcmREYXRhLCA2KTsNCg0KCQkJLy8gb2Zmc2V0OiA4OyBzaXplOiAyOyBmaXQgd29ya3NoZWV0IGhlaWdodCB0byB0aGlzIG51bWJlciBvZiBwYWdlcywgMCA9IHVzZSBhcyBtYW55IGFzIG5lZWRlZA0KCQkJJGZpdFRvSGVpZ2h0ID0gc2VsZjo6X0dldEludDJkKCRyZWNvcmREYXRhLCA4KTsNCg0KCQkJLy8gb2Zmc2V0OiAxMDsgc2l6ZTogMjsgb3B0aW9uIGZsYWdzDQoNCgkJCQkvLyBiaXQ6IDE7IG1hc2s6IDB4MDAwMjsgMD1sYW5kc2NhcGUsIDE9cG9ydHJhaXQNCgkJCQkkaXNQb3J0cmFpdCA9ICgweDAwMDIgJiBzZWxmOjpfR2V0SW50MmQoJHJlY29yZERhdGEsIDEwKSkgPj4gMTsNCg0KCQkJCS8vIGJpdDogMjsgbWFzazogMHgwMDA0OyAxPSBwYXBlciBzaXplLCBzY2FsaW5nIGZhY3RvciwgcGFwZXIgb3JpZW50LiBub3QgaW5pdA0KCQkJCS8vIHdoZW4gdGhpcyBiaXQgaXMgc2V0LCBkbyBub3QgdXNlIGZsYWdzIGZvciB0aG9zZSBwcm9wZXJ0aWVzDQoJCQkJJGlzTm90SW5pdCA9ICgweDAwMDQgJiBzZWxmOjpfR2V0SW50MmQoJHJlY29yZERhdGEsIDEwKSkgPj4gMjsNCg0KCQkJaWYgKCEkaXNOb3RJbml0KSB7DQoJCQkJJHRoaXMtPl9waHBTaGVldC0+Z2V0UGFnZVNldHVwKCktPnNldFBhcGVyU2l6ZSgkcGFwZXJTaXplKTsNCgkJCQlzd2l0Y2ggKCRpc1BvcnRyYWl0KSB7DQoJCQkJY2FzZSAwOiAkdGhpcy0+X3BocFNoZWV0LT5nZXRQYWdlU2V0dXAoKS0+c2V0T3JpZW50YXRpb24oUEhQRXhjZWxfV29ya3NoZWV0X1BhZ2VTZXR1cDo6T1JJRU5UQVRJT05fTEFORFNDQVBFKTsgYnJlYWs7DQoJCQkJY2FzZSAxOiAkdGhpcy0+X3BocFNoZWV0LT5nZXRQYWdlU2V0dXAoKS0+c2V0T3JpZW50YXRpb24oUEhQRXhjZWxfV29ya3NoZWV0X1BhZ2VTZXR1cDo6T1JJRU5UQVRJT05fUE9SVFJBSVQpOyBicmVhazsNCgkJCQl9DQoNCgkJCQkkdGhpcy0+X3BocFNoZWV0LT5nZXRQYWdlU2V0dXAoKS0+c2V0U2NhbGUoJHNjYWxlLCBmYWxzZSk7DQoJCQkJJHRoaXMtPl9waHBTaGVldC0+Z2V0UGFnZVNldHVwKCktPnNldEZpdFRvUGFnZSgoYm9vbCkgJHRoaXMtPl9pc0ZpdFRvUGFnZXMpOw0KCQkJCSR0aGlzLT5fcGhwU2hlZXQtPmdldFBhZ2VTZXR1cCgpLT5zZXRGaXRUb1dpZHRoKCRmaXRUb1dpZHRoLCBmYWxzZSk7DQoJCQkJJHRoaXMtPl9waHBTaGVldC0+Z2V0UGFnZVNldHVwKCktPnNldEZpdFRvSGVpZ2h0KCRmaXRUb0hlaWdodCwgZmFsc2UpOw0KCQkJfQ0KDQoJCQkvLyBvZmZzZXQ6IDE2OyBzaXplOiA4OyBoZWFkZXIgbWFyZ2luIChJRUVFIDc1NCBmbG9hdGluZy1wb2ludCB2YWx1ZSkNCgkJCSRtYXJnaW5IZWFkZXIgPSBzZWxmOjpfZXh0cmFjdE51bWJlcihzdWJzdHIoJHJlY29yZERhdGEsIDE2LCA4KSk7DQoJCQkkdGhpcy0+X3BocFNoZWV0LT5nZXRQYWdlTWFyZ2lucygpLT5zZXRIZWFkZXIoJG1hcmdpbkhlYWRlcik7DQoNCgkJCS8vIG9mZnNldDogMjQ7IHNpemU6IDg7IGZvb3RlciBtYXJnaW4gKElFRUUgNzU0IGZsb2F0aW5nLXBvaW50IHZhbHVlKQ0KCQkJJG1hcmdpbkZvb3RlciA9IHNlbGY6Ol9leHRyYWN0TnVtYmVyKHN1YnN0cigkcmVjb3JkRGF0YSwgMjQsIDgpKTsNCgkJCSR0aGlzLT5fcGhwU2hlZXQtPmdldFBhZ2VNYXJnaW5zKCktPnNldEZvb3RlcigkbWFyZ2luRm9vdGVyKTsNCgkJfQ0KCX0NCg0KDQoJLyoqDQoJICogUFJPVEVDVCAtIFNoZWV0IHByb3RlY3Rpb24gKEJJRkYyIHRocm91Z2ggQklGRjgpDQoJICogICBpZiB0aGlzIHJlY29yZCBpcyBvbWl0dGVkLCB0aGVuIGl0IGFsc28gbWVhbnMgbm8gc2hlZXQgcHJvdGVjdGlvbg0KCSAqLw0KCXByaXZhdGUgZnVuY3Rpb24gX3JlYWRQcm90ZWN0KCkNCgl7DQoJCSRsZW5ndGggPSBzZWxmOjpfR2V0SW50MmQoJHRoaXMtPl9kYXRhLCAkdGhpcy0+X3BvcyArIDIpOw0KCQkkcmVjb3JkRGF0YSA9IHN1YnN0cigkdGhpcy0+X2RhdGEsICR0aGlzLT5fcG9zICsgNCwgJGxlbmd0aCk7DQoNCgkJLy8gbW92ZSBzdHJlYW0gcG9pbnRlciB0byBuZXh0IHJlY29yZA0KCQkkdGhpcy0+X3BvcyArPSA0ICsgJGxlbmd0aDsNCg0KCQlpZiAoJHRoaXMtPl9yZWFkRGF0YU9ubHkpIHsNCgkJCXJldHVybjsNCgkJfQ0KDQoJCS8vIG9mZnNldDogMDsgc2l6ZTogMjsNCg0KCQkvLyBiaXQgMCwgbWFzayAweDAxOyAxID0gc2hlZXQgaXMgcHJvdGVjdGVkDQoJCSRib29sID0gKDB4MDEgJiBzZWxmOjpfR2V0SW50MmQoJHJlY29yZERhdGEsIDApKSA+PiAwOw0KCQkkdGhpcy0+X3BocFNoZWV0LT5nZXRQcm90ZWN0aW9uKCktPnNldFNoZWV0KChib29sKSRib29sKTsNCgl9DQoNCg0KCS8qKg0KCSAqIFNDRU5QUk9URUNUDQoJICovDQoJcHJpdmF0ZSBmdW5jdGlvbiBfcmVhZFNjZW5Qcm90ZWN0KCkNCgl7DQoJCSRsZW5ndGggPSBzZWxmOjpfR2V0SW50MmQoJHRoaXMtPl9kYXRhLCAkdGhpcy0+X3BvcyArIDIpOw0KCQkkcmVjb3JkRGF0YSA9IHN1YnN0cigkdGhpcy0+X2RhdGEsICR0aGlzLT5fcG9zICsgNCwgJGxlbmd0aCk7DQoNCgkJLy8gbW92ZSBzdHJlYW0gcG9pbnRlciB0byBuZXh0IHJlY29yZA0KCQkkdGhpcy0+X3BvcyArPSA0ICsgJGxlbmd0aDsNCg0KCQlpZiAoJHRoaXMtPl9yZWFkRGF0YU9ubHkpIHsNCgkJCXJldHVybjsNCgkJfQ0KDQoJCS8vIG9mZnNldDogMDsgc2l6ZTogMjsNCg0KCQkvLyBiaXQ6IDAsIG1hc2sgMHgwMTsgMSA9IHNjZW5hcmlvcyBhcmUgcHJvdGVjdGVkDQoJCSRib29sID0gKDB4MDEgJiBzZWxmOjpfR2V0SW50MmQoJHJlY29yZERhdGEsIDApKSA+PiAwOw0KDQoJCSR0aGlzLT5fcGhwU2hlZXQtPmdldFByb3RlY3Rpb24oKS0+c2V0U2NlbmFyaW9zKChib29sKSRib29sKTsNCgl9DQoNCg0KCS8qKg0KCSAqIE9CSkVDVFBST1RFQ1QNCgkgKi8NCglwcml2YXRlIGZ1bmN0aW9uIF9yZWFkT2JqZWN0UHJvdGVjdCgpDQoJew0KCQkkbGVuZ3RoID0gc2VsZjo6X0dldEludDJkKCR0aGlzLT5fZGF0YSwgJHRoaXMtPl9wb3MgKyAyKTsNCgkJJHJlY29yZERhdGEgPSBzdWJzdHIoJHRoaXMtPl9kYXRhLCAkdGhpcy0+X3BvcyArIDQsICRsZW5ndGgpOw0KDQoJCS8vIG1vdmUgc3RyZWFtIHBvaW50ZXIgdG8gbmV4dCByZWNvcmQNCgkJJHRoaXMtPl9wb3MgKz0gNCArICRsZW5ndGg7DQoNCgkJaWYgKCR0aGlzLT5fcmVhZERhdGFPbmx5KSB7DQoJCQlyZXR1cm47DQoJCX0NCg0KCQkvLyBvZmZzZXQ6IDA7IHNpemU6IDI7DQoNCgkJLy8gYml0OiAwLCBtYXNrIDB4MDE7IDEgPSBvYmplY3RzIGFyZSBwcm90ZWN0ZWQNCgkJJGJvb2wgPSAoMHgwMSAmIHNlbGY6Ol9HZXRJbnQyZCgkcmVjb3JkRGF0YSwgMCkpID4+IDA7DQoNCgkJJHRoaXMtPl9waHBTaGVldC0+Z2V0UHJvdGVjdGlvbigpLT5zZXRPYmplY3RzKChib29sKSRib29sKTsNCgl9DQoNCg0KCS8qKg0KCSAqIFBBU1NXT1JEIC0gU2hlZXQgcHJvdGVjdGlvbiAoaGFzaGVkKSBwYXNzd29yZCAoQklGRjIgdGhyb3VnaCBCSUZGOCkNCgkgKi8NCglwcml2YXRlIGZ1bmN0aW9uIF9yZWFkUGFzc3dvcmQoKQ0KCXsNCgkJJGxlbmd0aCA9IHNlbGY6Ol9HZXRJbnQyZCgkdGhpcy0+X2RhdGEsICR0aGlzLT5fcG9zICsgMik7DQoJCSRyZWNvcmREYXRhID0gc3Vic3RyKCR0aGlzLT5fZGF0YSwgJHRoaXMtPl9wb3MgKyA0LCAkbGVuZ3RoKTsNCg0KCQkvLyBtb3ZlIHN0cmVhbSBwb2ludGVyIHRvIG5leHQgcmVjb3JkDQoJCSR0aGlzLT5fcG9zICs9IDQgKyAkbGVuZ3RoOw0KDQoJCWlmICghJHRoaXMtPl9yZWFkRGF0YU9ubHkpIHsNCgkJCS8vIG9mZnNldDogMDsgc2l6ZTogMjsgMTYtYml0IGhhc2ggdmFsdWUgb2YgcGFzc3dvcmQNCgkJCSRwYXNzd29yZCA9IHN0cnRvdXBwZXIoZGVjaGV4KHNlbGY6Ol9HZXRJbnQyZCgkcmVjb3JkRGF0YSwgMCkpKTsgLy8gdGhlIGhhc2hlZCBwYXNzd29yZA0KCQkJJHRoaXMtPl9waHBTaGVldC0+Z2V0UHJvdGVjdGlvbigpLT5zZXRQYXNzd29yZCgkcGFzc3dvcmQsIHRydWUpOw0KCQl9DQoJfQ0KDQoNCgkvKioNCgkgKiBSZWFkIERFRkNPTFdJRFRIIHJlY29yZA0KCSAqLw0KCXByaXZhdGUgZnVuY3Rpb24gX3JlYWREZWZDb2xXaWR0aCgpDQoJew0KCQkkbGVuZ3RoID0gc2VsZjo6X0dldEludDJkKCR0aGlzLT5fZGF0YSwgJHRoaXMtPl9wb3MgKyAyKTsNCgkJJHJlY29yZERhdGEgPSBzdWJzdHIoJHRoaXMtPl9kYXRhLCAkdGhpcy0+X3BvcyArIDQsICRsZW5ndGgpOw0KDQoJCS8vIG1vdmUgc3RyZWFtIHBvaW50ZXIgdG8gbmV4dCByZWNvcmQNCgkJJHRoaXMtPl9wb3MgKz0gNCArICRsZW5ndGg7DQoNCgkJLy8gb2Zmc2V0OiAwOyBzaXplOiAyOyBkZWZhdWx0IGNvbHVtbiB3aWR0aA0KCQkkd2lkdGggPSBzZWxmOjpfR2V0SW50MmQoJHJlY29yZERhdGEsIDApOw0KCQlpZiAoJHdpZHRoICE9IDgpIHsNCgkJCSR0aGlzLT5fcGhwU2hlZXQtPmdldERlZmF1bHRDb2x1bW5EaW1lbnNpb24oKS0+c2V0V2lkdGgoJHdpZHRoKTsNCgkJfQ0KCX0NCg0KDQoJLyoqDQoJICogUmVhZCBDT0xJTkZPIHJlY29yZA0KCSAqLw0KCXByaXZhdGUgZnVuY3Rpb24gX3JlYWRDb2xJbmZvKCkNCgl7DQoJCSRsZW5ndGggPSBzZWxmOjpfR2V0SW50MmQoJHRoaXMtPl9kYXRhLCAkdGhpcy0+X3BvcyArIDIpOw0KCQkkcmVjb3JkRGF0YSA9IHN1YnN0cigkdGhpcy0+X2RhdGEsICR0aGlzLT5fcG9zICsgNCwgJGxlbmd0aCk7DQoNCgkJLy8gbW92ZSBzdHJlYW0gcG9pbnRlciB0byBuZXh0IHJlY29yZA0KCQkkdGhpcy0+X3BvcyArPSA0ICsgJGxlbmd0aDsNCg0KCQlpZiAoISR0aGlzLT5fcmVhZERhdGFPbmx5KSB7DQoJCQkvLyBvZmZzZXQ6IDA7IHNpemU6IDI7IGluZGV4IHRvIGZpcnN0IGNvbHVtbiBpbiByYW5nZQ0KCQkJJGZjID0gc2VsZjo6X0dldEludDJkKCRyZWNvcmREYXRhLCAwKTsgLy8gZmlyc3QgY29sdW1uIGluZGV4DQoNCgkJCS8vIG9mZnNldDogMjsgc2l6ZTogMjsgaW5kZXggdG8gbGFzdCBjb2x1bW4gaW4gcmFuZ2UNCgkJCSRsYyA9IHNlbGY6Ol9HZXRJbnQyZCgkcmVjb3JkRGF0YSwgMik7IC8vIGZpcnN0IGNvbHVtbiBpbmRleA0KDQoJCQkvLyBvZmZzZXQ6IDQ7IHNpemU6IDI7IHdpZHRoIG9mIHRoZSBjb2x1bW4gaW4gMS8yNTYgb2YgdGhlIHdpZHRoIG9mIHRoZSB6ZXJvIGNoYXJhY3Rlcg0KCQkJJHdpZHRoID0gc2VsZjo6X0dldEludDJkKCRyZWNvcmREYXRhLCA0KTsNCg0KCQkJLy8gb2Zmc2V0OiA2OyBzaXplOiAyOyBpbmRleCB0byBYRiByZWNvcmQgZm9yIGRlZmF1bHQgY29sdW1uIGZvcm1hdHRpbmcNCgkJCSR4ZkluZGV4ID0gc2VsZjo6X0dldEludDJkKCRyZWNvcmREYXRhLCA2KTsNCg0KCQkJLy8gb2Zmc2V0OiA4OyBzaXplOiAyOyBvcHRpb24gZmxhZ3MNCg0KCQkJCS8vIGJpdDogMDsgbWFzazogMHgwMDAxOyAxPSBjb2x1bW5zIGFyZSBoaWRkZW4NCgkJCQkkaXNIaWRkZW4gPSAoMHgwMDAxICYgc2VsZjo6X0dldEludDJkKCRyZWNvcmREYXRhLCA4KSkgPj4gMDsNCg0KCQkJCS8vIGJpdDogMTAtODsgbWFzazogMHgwNzAwOyBvdXRsaW5lIGxldmVsIG9mIHRoZSBjb2x1bW5zICgwID0gbm8gb3V0bGluZSkNCgkJCQkkbGV2ZWwgPSAoMHgwNzAwICYgc2VsZjo6X0dldEludDJkKCRyZWNvcmREYXRhLCA4KSkgPj4gODsNCg0KCQkJCS8vIGJpdDogMTI7IG1hc2s6IDB4MTAwMDsgMSA9IGNvbGxhcHNlZA0KCQkJCSRpc0NvbGxhcHNlZCA9ICgweDEwMDAgJiBzZWxmOjpfR2V0SW50MmQoJHJlY29yZERhdGEsIDgpKSA+PiAxMjsNCg0KCQkJLy8gb2Zmc2V0OiAxMDsgc2l6ZTogMjsgbm90IHVzZWQNCg0KCQkJZm9yICgkaSA9ICRmYzsgJGkgPD0gJGxjOyArKyRpKSB7DQoJCQkJaWYgKCRsYyA9PSAyNTUgfHwgJGxjID09IDI1Nikgew0KCQkJCQkkdGhpcy0+X3BocFNoZWV0LT5nZXREZWZhdWx0Q29sdW1uRGltZW5zaW9uKCktPnNldFdpZHRoKCR3aWR0aCAvIDI1Nik7DQoJCQkJCWJyZWFrOw0KCQkJCX0NCgkJCQkkdGhpcy0+X3BocFNoZWV0LT5nZXRDb2x1bW5EaW1lbnNpb25CeUNvbHVtbigkaSktPnNldFdpZHRoKCR3aWR0aCAvIDI1Nik7DQoJCQkJJHRoaXMtPl9waHBTaGVldC0+Z2V0Q29sdW1uRGltZW5zaW9uQnlDb2x1bW4oJGkpLT5zZXRWaXNpYmxlKCEkaXNIaWRkZW4pOw0KCQkJCSR0aGlzLT5fcGhwU2hlZXQtPmdldENvbHVtbkRpbWVuc2lvbkJ5Q29sdW1uKCRpKS0+c2V0T3V0bGluZUxldmVsKCRsZXZlbCk7DQoJCQkJJHRoaXMtPl9waHBTaGVldC0+Z2V0Q29sdW1uRGltZW5zaW9uQnlDb2x1bW4oJGkpLT5zZXRDb2xsYXBzZWQoJGlzQ29sbGFwc2VkKTsNCgkJCQkkdGhpcy0+X3BocFNoZWV0LT5nZXRDb2x1bW5EaW1lbnNpb25CeUNvbHVtbigkaSktPnNldFhmSW5kZXgoJHRoaXMtPl9tYXBDZWxsWGZJbmRleFskeGZJbmRleF0pOw0KCQkJfQ0KCQl9DQoJfQ0KDQoNCgkvKioNCgkgKiBST1cNCgkgKg0KCSAqIFRoaXMgcmVjb3JkIGNvbnRhaW5zIHRoZSBwcm9wZXJ0aWVzIG9mIGEgc2luZ2xlIHJvdyBpbiBhDQoJICogc2hlZXQuIFJvd3MgYW5kIGNlbGxzIGluIGEgc2hlZXQgYXJlIGRpdmlkZWQgaW50byBibG9ja3MNCgkgKiBvZiAzMiByb3dzLg0KCSAqDQoJICogLS0JIk9wZW5PZmZpY2Uub3JnJ3MgRG9jdW1lbnRhdGlvbiBvZiB0aGUgTWljcm9zb2Z0DQoJICogCQlFeGNlbCBGaWxlIEZvcm1hdCINCgkgKi8NCglwcml2YXRlIGZ1bmN0aW9uIF9yZWFkUm93KCkNCgl7DQoJCSRsZW5ndGggPSBzZWxmOjpfR2V0SW50MmQoJHRoaXMtPl9kYXRhLCAkdGhpcy0+X3BvcyArIDIpOw0KCQkkcmVjb3JkRGF0YSA9IHN1YnN0cigkdGhpcy0+X2RhdGEsICR0aGlzLT5fcG9zICsgNCwgJGxlbmd0aCk7DQoNCgkJLy8gbW92ZSBzdHJlYW0gcG9pbnRlciB0byBuZXh0IHJlY29yZA0KCQkkdGhpcy0+X3BvcyArPSA0ICsgJGxlbmd0aDsNCg0KCQlpZiAoISR0aGlzLT5fcmVhZERhdGFPbmx5KSB7DQoJCQkvLyBvZmZzZXQ6IDA7IHNpemU6IDI7IGluZGV4IG9mIHRoaXMgcm93DQoJCQkkciA9IHNlbGY6Ol9HZXRJbnQyZCgkcmVjb3JkRGF0YSwgMCk7DQoNCgkJCS8vIG9mZnNldDogMjsgc2l6ZTogMjsgaW5kZXggdG8gY29sdW1uIG9mIHRoZSBmaXJzdCBjZWxsIHdoaWNoIGlzIGRlc2NyaWJlZCBieSBhIGNlbGwgcmVjb3JkDQoNCgkJCS8vIG9mZnNldDogNDsgc2l6ZTogMjsgaW5kZXggdG8gY29sdW1uIG9mIHRoZSBsYXN0IGNlbGwgd2hpY2ggaXMgZGVzY3JpYmVkIGJ5IGEgY2VsbCByZWNvcmQsIGluY3JlYXNlZCBieSAxDQoNCgkJCS8vIG9mZnNldDogNjsgc2l6ZTogMjsNCg0KCQkJLy8gYml0OiAxNC0wOyBtYXNrOiAweDdGRkY7IGhlaWdodCBvZiB0aGUgcm93LCBpbiB0d2lwcyA9IDEvMjAgb2YgYSBwb2ludA0KCQkJJGhlaWdodCA9ICgweDdGRkYgJiBzZWxmOjpfR2V0SW50MmQoJHJlY29yZERhdGEsIDYpKSA+PiAwOw0KDQoJCQkvLyBiaXQ6IDE1OiBtYXNrOiAweDgwMDA7IDAgPSByb3cgaGFzIGN1c3RvbSBoZWlnaHQ7IDE9IHJvdyBoYXMgZGVmYXVsdCBoZWlnaHQNCgkJCSR1c2VEZWZhdWx0SGVpZ2h0ID0gKDB4ODAwMCAmIHNlbGY6Ol9HZXRJbnQyZCgkcmVjb3JkRGF0YSwgNikpID4+IDE1Ow0KDQoJCQlpZiAoISR1c2VEZWZhdWx0SGVpZ2h0KSB7DQoJCQkJJHRoaXMtPl9waHBTaGVldC0+Z2V0Um93RGltZW5zaW9uKCRyICsgMSktPnNldFJvd0hlaWdodCgkaGVpZ2h0IC8gMjApOw0KCQkJfQ0KDQoJCQkvLyBvZmZzZXQ6IDg7IHNpemU6IDI7IG5vdCB1c2VkDQoNCgkJCS8vIG9mZnNldDogMTA7IHNpemU6IDI7IG5vdCB1c2VkIGluIEJJRkY1LUJJRkY4DQoNCgkJCS8vIG9mZnNldDogMTI7IHNpemU6IDQ7IG9wdGlvbiBmbGFncyBhbmQgZGVmYXVsdCByb3cgZm9ybWF0dGluZw0KDQoJCQkvLyBiaXQ6IDItMDogbWFzazogMHgwMDAwMDAwNzsgb3V0bGluZSBsZXZlbCBvZiB0aGUgcm93DQoJCQkkbGV2ZWwgPSAoMHgwMDAwMDAwNyAmIHNlbGY6Ol9HZXRJbnQ0ZCgkcmVjb3JkRGF0YSwgMTIpKSA+PiAwOw0KCQkJJHRoaXMtPl9waHBTaGVldC0+Z2V0Um93RGltZW5zaW9uKCRyICsgMSktPnNldE91dGxpbmVMZXZlbCgkbGV2ZWwpOw0KDQoJCQkvLyBiaXQ6IDQ7IG1hc2s6IDB4MDAwMDAwMTA7IDEgPSBvdXRsaW5lIGdyb3VwIHN0YXJ0IG9yIGVuZHMgaGVyZS4uLiBhbmQgaXMgY29sbGFwc2VkDQoJCQkkaXNDb2xsYXBzZWQgPSAoMHgwMDAwMDAxMCAmIHNlbGY6Ol9HZXRJbnQ0ZCgkcmVjb3JkRGF0YSwgMTIpKSA+PiA0Ow0KCQkJJHRoaXMtPl9waHBTaGVldC0+Z2V0Um93RGltZW5zaW9uKCRyICsgMSktPnNldENvbGxhcHNlZCgkaXNDb2xsYXBzZWQpOw0KDQoJCQkvLyBiaXQ6IDU7IG1hc2s6IDB4MDAwMDAwMjA7IDEgPSByb3cgaXMgaGlkZGVuDQoJCQkkaXNIaWRkZW4gPSAoMHgwMDAwMDAyMCAmIHNlbGY6Ol9HZXRJbnQ0ZCgkcmVjb3JkRGF0YSwgMTIpKSA+PiA1Ow0KCQkJJHRoaXMtPl9waHBTaGVldC0+Z2V0Um93RGltZW5zaW9uKCRyICsgMSktPnNldFZpc2libGUoISRpc0hpZGRlbik7DQoNCgkJCS8vIGJpdDogNzsgbWFzazogMHgwMDAwMDA4MDsgMSA9IHJvdyBoYXMgZXhwbGljaXQgZm9ybWF0DQoJCQkkaGFzRXhwbGljaXRGb3JtYXQgPSAoMHgwMDAwMDA4MCAmIHNlbGY6Ol9HZXRJbnQ0ZCgkcmVjb3JkRGF0YSwgMTIpKSA+PiA3Ow0KDQoJCQkvLyBiaXQ6IDI3LTE2OyBtYXNrOiAweDBGRkYwMDAwOyBvbmx5IGFwcGxpZXMgd2hlbiBoYXNFeHBsaWNpdEZvcm1hdCA9IDE7IGluZGV4IHRvIFhGIHJlY29yZA0KCQkJJHhmSW5kZXggPSAoMHgwRkZGMDAwMCAmIHNlbGY6Ol9HZXRJbnQ0ZCgkcmVjb3JkRGF0YSwgMTIpKSA+PiAxNjsNCg0KCQkJaWYgKCRoYXNFeHBsaWNpdEZvcm1hdCkgew0KCQkJCSR0aGlzLT5fcGhwU2hlZXQtPmdldFJvd0RpbWVuc2lvbigkciArIDEpLT5zZXRYZkluZGV4KCR0aGlzLT5fbWFwQ2VsbFhmSW5kZXhbJHhmSW5kZXhdKTsNCgkJCX0NCgkJfQ0KCX0NCg0KDQoJLyoqDQoJICogUmVhZCBSSyByZWNvcmQNCgkgKiBUaGlzIHJlY29yZCByZXByZXNlbnRzIGEgY2VsbCB0aGF0IGNvbnRhaW5zIGFuIFJLIHZhbHVlDQoJICogKGVuY29kZWQgaW50ZWdlciBvciBmbG9hdGluZy1wb2ludCB2YWx1ZSkuIElmIGENCgkgKiBmbG9hdGluZy1wb2ludCB2YWx1ZSBjYW5ub3QgYmUgZW5jb2RlZCB0byBhbiBSSyB2YWx1ZSwNCgkgKiBhIE5VTUJFUiByZWNvcmQgd2lsbCBiZSB3cml0dGVuLiBUaGlzIHJlY29yZCByZXBsYWNlcyB0aGUNCgkgKiByZWNvcmQgSU5URUdFUiB3cml0dGVuIGluIEJJRkYyLg0KCSAqDQoJICogLS0JIk9wZW5PZmZpY2Uub3JnJ3MgRG9jdW1lbnRhdGlvbiBvZiB0aGUgTWljcm9zb2Z0DQoJICogCQlFeGNlbCBGaWxlIEZvcm1hdCINCgkgKi8NCglwcml2YXRlIGZ1bmN0aW9uIF9yZWFkUmsoKQ0KCXsNCgkJJGxlbmd0aCA9IHNlbGY6Ol9HZXRJbnQyZCgkdGhpcy0+X2RhdGEsICR0aGlzLT5fcG9zICsgMik7DQoJCSRyZWNvcmREYXRhID0gc3Vic3RyKCR0aGlzLT5fZGF0YSwgJHRoaXMtPl9wb3MgKyA0LCAkbGVuZ3RoKTsNCg0KCQkvLyBtb3ZlIHN0cmVhbSBwb2ludGVyIHRvIG5leHQgcmVjb3JkDQoJCSR0aGlzLT5fcG9zICs9IDQgKyAkbGVuZ3RoOw0KDQoJCS8vIG9mZnNldDogMDsgc2l6ZTogMjsgaW5kZXggdG8gcm93DQoJCSRyb3cgPSBzZWxmOjpfR2V0SW50MmQoJHJlY29yZERhdGEsIDApOw0KDQoJCS8vIG9mZnNldDogMjsgc2l6ZTogMjsgaW5kZXggdG8gY29sdW1uDQoJCSRjb2x1bW4gPSBzZWxmOjpfR2V0SW50MmQoJHJlY29yZERhdGEsIDIpOw0KCQkkY29sdW1uU3RyaW5nID0gUEhQRXhjZWxfQ2VsbDo6c3RyaW5nRnJvbUNvbHVtbkluZGV4KCRjb2x1bW4pOw0KDQoJCS8vIFJlYWQgY2VsbD8NCgkJaWYgKCgkdGhpcy0+Z2V0UmVhZEZpbHRlcigpICE9PSBOVUxMKSAmJiAkdGhpcy0+Z2V0UmVhZEZpbHRlcigpLT5yZWFkQ2VsbCgkY29sdW1uU3RyaW5nLCAkcm93ICsgMSwgJHRoaXMtPl9waHBTaGVldC0+Z2V0VGl0bGUoKSkgKSB7DQoJCQkvLyBvZmZzZXQ6IDQ7IHNpemU6IDI7IGluZGV4IHRvIFhGIHJlY29yZA0KCQkJJHhmSW5kZXggPSBzZWxmOjpfR2V0SW50MmQoJHJlY29yZERhdGEsIDQpOw0KDQoJCQkvLyBvZmZzZXQ6IDY7IHNpemU6IDQ7IFJLIHZhbHVlDQoJCQkkcmtudW0gPSBzZWxmOjpfR2V0SW50NGQoJHJlY29yZERhdGEsIDYpOw0KCQkJJG51bVZhbHVlID0gc2VsZjo6X0dldElFRUU3NTQoJHJrbnVtKTsNCg0KCQkJJGNlbGwgPSAkdGhpcy0+X3BocFNoZWV0LT5nZXRDZWxsKCRjb2x1bW5TdHJpbmcgLiAoJHJvdyArIDEpKTsNCgkJCWlmICghJHRoaXMtPl9yZWFkRGF0YU9ubHkpIHsNCgkJCQkvLyBhZGQgc3R5bGUgaW5mb3JtYXRpb24NCgkJCQkkY2VsbC0+c2V0WGZJbmRleCgkdGhpcy0+X21hcENlbGxYZkluZGV4WyR4ZkluZGV4XSk7DQoJCQl9DQoNCgkJCS8vIGFkZCBjZWxsDQoJCQkkY2VsbC0+c2V0VmFsdWVFeHBsaWNpdCgkbnVtVmFsdWUsIFBIUEV4Y2VsX0NlbGxfRGF0YVR5cGU6OlRZUEVfTlVNRVJJQyk7DQoJCX0NCgl9DQoNCg0KCS8qKg0KCSAqIFJlYWQgTEFCRUxTU1QgcmVjb3JkDQoJICogVGhpcyByZWNvcmQgcmVwcmVzZW50cyBhIGNlbGwgdGhhdCBjb250YWlucyBhIHN0cmluZy4gSXQNCgkgKiByZXBsYWNlcyB0aGUgTEFCRUwgcmVjb3JkIGFuZCBSU1RSSU5HIHJlY29yZCB1c2VkIGluDQoJICogQklGRjItQklGRjUuDQoJICoNCgkgKiAtLQkiT3Blbk9mZmljZS5vcmcncyBEb2N1bWVudGF0aW9uIG9mIHRoZSBNaWNyb3NvZnQNCgkgKiAJCUV4Y2VsIEZpbGUgRm9ybWF0Ig0KCSAqLw0KCXByaXZhdGUgZnVuY3Rpb24gX3JlYWRMYWJlbFNzdCgpDQoJew0KCQkkbGVuZ3RoID0gc2VsZjo6X0dldEludDJkKCR0aGlzLT5fZGF0YSwgJHRoaXMtPl9wb3MgKyAyKTsNCgkJJHJlY29yZERhdGEgPSBzdWJzdHIoJHRoaXMtPl9kYXRhLCAkdGhpcy0+X3BvcyArIDQsICRsZW5ndGgpOw0KDQoJCS8vIG1vdmUgc3RyZWFtIHBvaW50ZXIgdG8gbmV4dCByZWNvcmQNCgkJJHRoaXMtPl9wb3MgKz0gNCArICRsZW5ndGg7DQoNCgkJLy8gb2Zmc2V0OiAwOyBzaXplOiAyOyBpbmRleCB0byByb3cNCgkJJHJvdyA9IHNlbGY6Ol9HZXRJbnQyZCgkcmVjb3JkRGF0YSwgMCk7DQoNCgkJLy8gb2Zmc2V0OiAyOyBzaXplOiAyOyBpbmRleCB0byBjb2x1bW4NCgkJJGNvbHVtbiA9IHNlbGY6Ol9HZXRJbnQyZCgkcmVjb3JkRGF0YSwgMik7DQoJCSRjb2x1bW5TdHJpbmcgPSBQSFBFeGNlbF9DZWxsOjpzdHJpbmdGcm9tQ29sdW1uSW5kZXgoJGNvbHVtbik7DQoNCgkJLy8gUmVhZCBjZWxsPw0KCQlpZiAoKCR0aGlzLT5nZXRSZWFkRmlsdGVyKCkgIT09IE5VTEwpICYmICR0aGlzLT5nZXRSZWFkRmlsdGVyKCktPnJlYWRDZWxsKCRjb2x1bW5TdHJpbmcsICRyb3cgKyAxLCAkdGhpcy0+X3BocFNoZWV0LT5nZXRUaXRsZSgpKSApIHsNCgkJCS8vIG9mZnNldDogNDsgc2l6ZTogMjsgaW5kZXggdG8gWEYgcmVjb3JkDQoJCQkkeGZJbmRleCA9IHNlbGY6Ol9HZXRJbnQyZCgkcmVjb3JkRGF0YSwgNCk7DQoNCgkJCS8vIG9mZnNldDogNjsgc2l6ZTogNDsgaW5kZXggdG8gU1NUIHJlY29yZA0KCQkJJGluZGV4ID0gc2VsZjo6X0dldEludDRkKCRyZWNvcmREYXRhLCA2KTsNCg0KCQkJLy8gYWRkIGNlbGwNCgkJCWlmICgoJGZtdFJ1bnMgPSAkdGhpcy0+X3NzdFskaW5kZXhdWydmbXRSdW5zJ10pICYmICEkdGhpcy0+X3JlYWREYXRhT25seSkgew0KCQkJCS8vIHRoZW4gd2Ugc2hvdWxkIHRyZWF0IGFzIHJpY2ggdGV4dA0KCQkJCSRyaWNoVGV4dCA9IG5ldyBQSFBFeGNlbF9SaWNoVGV4dCgpOw0KCQkJCSRjaGFyUG9zID0gMDsNCgkJCQkkc3N0Q291bnQgPSBjb3VudCgkdGhpcy0+X3NzdFskaW5kZXhdWydmbXRSdW5zJ10pOw0KCQkJCWZvciAoJGkgPSAwOyAkaSA8PSAkc3N0Q291bnQ7ICsrJGkpIHsNCgkJCQkJaWYgKGlzc2V0KCRmbXRSdW5zWyRpXSkpIHsNCgkJCQkJCSR0ZXh0ID0gUEhQRXhjZWxfU2hhcmVkX1N0cmluZzo6U3Vic3RyaW5nKCR0aGlzLT5fc3N0WyRpbmRleF1bJ3ZhbHVlJ10sICRjaGFyUG9zLCAkZm10UnVuc1skaV1bJ2NoYXJQb3MnXSAtICRjaGFyUG9zKTsNCgkJCQkJCSRjaGFyUG9zID0gJGZtdFJ1bnNbJGldWydjaGFyUG9zJ107DQoJCQkJCX0gZWxzZSB7DQoJCQkJCQkkdGV4dCA9IFBIUEV4Y2VsX1NoYXJlZF9TdHJpbmc6OlN1YnN0cmluZygkdGhpcy0+X3NzdFskaW5kZXhdWyd2YWx1ZSddLCAkY2hhclBvcywgUEhQRXhjZWxfU2hhcmVkX1N0cmluZzo6Q291bnRDaGFyYWN0ZXJzKCR0aGlzLT5fc3N0WyRpbmRleF1bJ3ZhbHVlJ10pKTsNCgkJCQkJfQ0KDQoJCQkJCWlmIChQSFBFeGNlbF9TaGFyZWRfU3RyaW5nOjpDb3VudENoYXJhY3RlcnMoJHRleHQpID4gMCkgew0KCQkJCQkJaWYgKCRpID09IDApIHsgLy8gZmlyc3QgdGV4dCBydW4sIG5vIHN0eWxlDQoJCQkJCQkJJHJpY2hUZXh0LT5jcmVhdGVUZXh0KCR0ZXh0KTsNCgkJCQkJCX0gZWxzZSB7DQoJCQkJCQkJJHRleHRSdW4gPSAkcmljaFRleHQtPmNyZWF0ZVRleHRSdW4oJHRleHQpOw0KCQkJCQkJCWlmIChpc3NldCgkZm10UnVuc1skaSAtIDFdKSkgew0KCQkJCQkJCQlpZiAoJGZtdFJ1bnNbJGkgLSAxXVsnZm9udEluZGV4J10gPCA0KSB7DQoJCQkJCQkJCQkkZm9udEluZGV4ID0gJGZtdFJ1bnNbJGkgLSAxXVsnZm9udEluZGV4J107DQoJCQkJCQkJCX0gZWxzZSB7DQoJCQkJCQkJCQkvLyB0aGlzIGhhcyB0byBkbyB3aXRoIHRoYXQgaW5kZXggNCBpcyBvbWl0dGVkIGluIGFsbCBCSUZGIHZlcnNpb25zIGZvciBzb21lIHN0cmFuZ2UgcmVhc29uDQoJCQkJCQkJCQkvLyBjaGVjayB0aGUgT3Blbk9mZmljZSBkb2N1bWVudGF0aW9uIG9mIHRoZSBGT05UIHJlY29yZA0KCQkJCQkJCQkJJGZvbnRJbmRleCA9ICRmbXRSdW5zWyRpIC0gMV1bJ2ZvbnRJbmRleCddIC0gMTsNCgkJCQkJCQkJfQ0KCQkJCQkJCQkkdGV4dFJ1bi0+c2V0Rm9udChjbG9uZSAkdGhpcy0+X29iakZvbnRzWyRmb250SW5kZXhdKTsNCgkJCQkJCQl9DQoJCQkJCQl9DQoJCQkJCX0NCgkJCQl9DQoJCQkJJGNlbGwgPSAkdGhpcy0+X3BocFNoZWV0LT5nZXRDZWxsKCRjb2x1bW5TdHJpbmcgLiAoJHJvdyArIDEpKTsNCgkJCQkkY2VsbC0+c2V0VmFsdWVFeHBsaWNpdCgkcmljaFRleHQsIFBIUEV4Y2VsX0NlbGxfRGF0YVR5cGU6OlRZUEVfU1RSSU5HKTsNCgkJCX0gZWxzZSB7DQoJCQkJJGNlbGwgPSAkdGhpcy0+X3BocFNoZWV0LT5nZXRDZWxsKCRjb2x1bW5TdHJpbmcgLiAoJHJvdyArIDEpKTsNCgkJCQkkY2VsbC0+c2V0VmFsdWVFeHBsaWNpdCgkdGhpcy0+X3NzdFskaW5kZXhdWyd2YWx1ZSddLCBQSFBFeGNlbF9DZWxsX0RhdGFUeXBlOjpUWVBFX1NUUklORyk7DQoJCQl9DQoNCgkJCWlmICghJHRoaXMtPl9yZWFkRGF0YU9ubHkpIHsNCgkJCQkvLyBhZGQgc3R5bGUgaW5mb3JtYXRpb24NCgkJCQkkY2VsbC0+c2V0WGZJbmRleCgkdGhpcy0+X21hcENlbGxYZkluZGV4WyR4ZkluZGV4XSk7DQoJCQl9DQoJCX0NCgl9DQoNCg0KCS8qKg0KCSAqIFJlYWQgTVVMUksgcmVjb3JkDQoJICogVGhpcyByZWNvcmQgcmVwcmVzZW50cyBhIGNlbGwgcmFuZ2UgY29udGFpbmluZyBSSyB2YWx1ZQ0KCSAqIGNlbGxzLiBBbGwgY2VsbHMgYXJlIGxvY2F0ZWQgaW4gdGhlIHNhbWUgcm93Lg0KCSAqDQoJICogLS0JIk9wZW5PZmZpY2Uub3JnJ3MgRG9jdW1lbnRhdGlvbiBvZiB0aGUgTWljcm9zb2Z0DQoJICogCQlFeGNlbCBGaWxlIEZvcm1hdCINCgkgKi8NCglwcml2YXRlIGZ1bmN0aW9uIF9yZWFkTXVsUmsoKQ0KCXsNCgkJJGxlbmd0aCA9IHNlbGY6Ol9HZXRJbnQyZCgkdGhpcy0+X2RhdGEsICR0aGlzLT5fcG9zICsgMik7DQoJCSRyZWNvcmREYXRhID0gc3Vic3RyKCR0aGlzLT5fZGF0YSwgJHRoaXMtPl9wb3MgKyA0LCAkbGVuZ3RoKTsNCg0KCQkvLyBtb3ZlIHN0cmVhbSBwb2ludGVyIHRvIG5leHQgcmVjb3JkDQoJCSR0aGlzLT5fcG9zICs9IDQgKyAkbGVuZ3RoOw0KDQoJCS8vIG9mZnNldDogMDsgc2l6ZTogMjsgaW5kZXggdG8gcm93DQoJCSRyb3cgPSBzZWxmOjpfR2V0SW50MmQoJHJlY29yZERhdGEsIDApOw0KDQoJCS8vIG9mZnNldDogMjsgc2l6ZTogMjsgaW5kZXggdG8gZmlyc3QgY29sdW1uDQoJCSRjb2xGaXJzdCA9IHNlbGY6Ol9HZXRJbnQyZCgkcmVjb3JkRGF0YSwgMik7DQoNCgkJLy8gb2Zmc2V0OiB2YXI7IHNpemU6IDI7IGluZGV4IHRvIGxhc3QgY29sdW1uDQoJCSRjb2xMYXN0ID0gc2VsZjo6X0dldEludDJkKCRyZWNvcmREYXRhLCAkbGVuZ3RoIC0gMik7DQoJCSRjb2x1bW5zID0gJGNvbExhc3QgLSAkY29sRmlyc3QgKyAxOw0KDQoJCS8vIG9mZnNldCB3aXRoaW4gcmVjb3JkIGRhdGENCgkJJG9mZnNldCA9IDQ7DQoNCgkJZm9yICgkaSA9IDA7ICRpIDwgJGNvbHVtbnM7ICsrJGkpIHsNCgkJCSRjb2x1bW5TdHJpbmcgPSBQSFBFeGNlbF9DZWxsOjpzdHJpbmdGcm9tQ29sdW1uSW5kZXgoJGNvbEZpcnN0ICsgJGkpOw0KDQoJCQkvLyBSZWFkIGNlbGw/DQoJCQlpZiAoKCR0aGlzLT5nZXRSZWFkRmlsdGVyKCkgIT09IE5VTEwpICYmICR0aGlzLT5nZXRSZWFkRmlsdGVyKCktPnJlYWRDZWxsKCRjb2x1bW5TdHJpbmcsICRyb3cgKyAxLCAkdGhpcy0+X3BocFNoZWV0LT5nZXRUaXRsZSgpKSApIHsNCg0KCQkJCS8vIG9mZnNldDogdmFyOyBzaXplOiAyOyBpbmRleCB0byBYRiByZWNvcmQNCgkJCQkkeGZJbmRleCA9IHNlbGY6Ol9HZXRJbnQyZCgkcmVjb3JkRGF0YSwgJG9mZnNldCk7DQoNCgkJCQkvLyBvZmZzZXQ6IHZhcjsgc2l6ZTogNDsgUksgdmFsdWUNCgkJCQkkbnVtVmFsdWUgPSBzZWxmOjpfR2V0SUVFRTc1NChzZWxmOjpfR2V0SW50NGQoJHJlY29yZERhdGEsICRvZmZzZXQgKyAyKSk7DQoJCQkJJGNlbGwgPSAkdGhpcy0+X3BocFNoZWV0LT5nZXRDZWxsKCRjb2x1bW5TdHJpbmcgLiAoJHJvdyArIDEpKTsNCgkJCQlpZiAoISR0aGlzLT5fcmVhZERhdGFPbmx5KSB7DQoJCQkJCS8vIGFkZCBzdHlsZQ0KCQkJCQkkY2VsbC0+c2V0WGZJbmRleCgkdGhpcy0+X21hcENlbGxYZkluZGV4WyR4ZkluZGV4XSk7DQoJCQkJfQ0KDQoJCQkJLy8gYWRkIGNlbGwgdmFsdWUNCgkJCQkkY2VsbC0+c2V0VmFsdWVFeHBsaWNpdCgkbnVtVmFsdWUsIFBIUEV4Y2VsX0NlbGxfRGF0YVR5cGU6OlRZUEVfTlVNRVJJQyk7DQoJCQl9DQoNCgkJCSRvZmZzZXQgKz0gNjsNCgkJfQ0KCX0NCg0KDQoJLyoqDQoJICogUmVhZCBOVU1CRVIgcmVjb3JkDQoJICogVGhpcyByZWNvcmQgcmVwcmVzZW50cyBhIGNlbGwgdGhhdCBjb250YWlucyBhDQoJICogZmxvYXRpbmctcG9pbnQgdmFsdWUuDQoJICoNCgkgKiAtLQkiT3Blbk9mZmljZS5vcmcncyBEb2N1bWVudGF0aW9uIG9mIHRoZSBNaWNyb3NvZnQNCgkgKiAJCUV4Y2VsIEZpbGUgRm9ybWF0Ig0KCSAqLw0KCXByaXZhdGUgZnVuY3Rpb24gX3JlYWROdW1iZXIoKQ0KCXsNCgkJJGxlbmd0aCA9IHNlbGY6Ol9HZXRJbnQyZCgkdGhpcy0+X2RhdGEsICR0aGlzLT5fcG9zICsgMik7DQoJCSRyZWNvcmREYXRhID0gc3Vic3RyKCR0aGlzLT5fZGF0YSwgJHRoaXMtPl9wb3MgKyA0LCAkbGVuZ3RoKTsNCg0KCQkvLyBtb3ZlIHN0cmVhbSBwb2ludGVyIHRvIG5leHQgcmVjb3JkDQoJCSR0aGlzLT5fcG9zICs9IDQgKyAkbGVuZ3RoOw0KDQoJCS8vIG9mZnNldDogMDsgc2l6ZTogMjsgaW5kZXggdG8gcm93DQoJCSRyb3cgPSBzZWxmOjpfR2V0SW50MmQoJHJlY29yZERhdGEsIDApOw0KDQoJCS8vIG9mZnNldDogMjsgc2l6ZSAyOyBpbmRleCB0byBjb2x1bW4NCgkJJGNvbHVtbiA9IHNlbGY6Ol9HZXRJbnQyZCgkcmVjb3JkRGF0YSwgMik7DQoJCSRjb2x1bW5TdHJpbmcgPSBQSFBFeGNlbF9DZWxsOjpzdHJpbmdGcm9tQ29sdW1uSW5kZXgoJGNvbHVtbik7DQoNCgkJLy8gUmVhZCBjZWxsPw0KCQlpZiAoKCR0aGlzLT5nZXRSZWFkRmlsdGVyKCkgIT09IE5VTEwpICYmICR0aGlzLT5nZXRSZWFkRmlsdGVyKCktPnJlYWRDZWxsKCRjb2x1bW5TdHJpbmcsICRyb3cgKyAxLCAkdGhpcy0+X3BocFNoZWV0LT5nZXRUaXRsZSgpKSApIHsNCgkJCS8vIG9mZnNldCA0OyBzaXplOiAyOyBpbmRleCB0byBYRiByZWNvcmQNCgkJCSR4ZkluZGV4ID0gc2VsZjo6X0dldEludDJkKCRyZWNvcmREYXRhLCA0KTsNCg0KCQkJJG51bVZhbHVlID0gc2VsZjo6X2V4dHJhY3ROdW1iZXIoc3Vic3RyKCRyZWNvcmREYXRhLCA2LCA4KSk7DQoNCgkJCSRjZWxsID0gJHRoaXMtPl9waHBTaGVldC0+Z2V0Q2VsbCgkY29sdW1uU3RyaW5nIC4gKCRyb3cgKyAxKSk7DQoJCQlpZiAoISR0aGlzLT5fcmVhZERhdGFPbmx5KSB7DQoJCQkJLy8gYWRkIGNlbGwgc3R5bGUNCgkJCQkkY2VsbC0+c2V0WGZJbmRleCgkdGhpcy0+X21hcENlbGxYZkluZGV4WyR4ZkluZGV4XSk7DQoJCQl9DQoNCgkJCS8vIGFkZCBjZWxsIHZhbHVlDQoJCQkkY2VsbC0+c2V0VmFsdWVFeHBsaWNpdCgkbnVtVmFsdWUsIFBIUEV4Y2VsX0NlbGxfRGF0YVR5cGU6OlRZUEVfTlVNRVJJQyk7DQoJCX0NCgl9DQoNCg0KCS8qKg0KCSAqIFJlYWQgRk9STVVMQSByZWNvcmQgKyBwZXJoYXBzIGEgZm9sbG93aW5nIFNUUklORyByZWNvcmQgaWYgZm9ybXVsYSByZXN1bHQgaXMgYSBzdHJpbmcNCgkgKiBUaGlzIHJlY29yZCBjb250YWlucyB0aGUgdG9rZW4gYXJyYXkgYW5kIHRoZSByZXN1bHQgb2YgYQ0KCSAqIGZvcm11bGEgY2VsbC4NCgkgKg0KCSAqIC0tCSJPcGVuT2ZmaWNlLm9yZydzIERvY3VtZW50YXRpb24gb2YgdGhlIE1pY3Jvc29mdA0KCSAqIAkJRXhjZWwgRmlsZSBGb3JtYXQiDQoJICovDQoJcHJpdmF0ZSBmdW5jdGlvbiBfcmVhZEZvcm11bGEoKQ0KCXsNCgkJJGxlbmd0aCA9IHNlbGY6Ol9HZXRJbnQyZCgkdGhpcy0+X2RhdGEsICR0aGlzLT5fcG9zICsgMik7DQoJCSRyZWNvcmREYXRhID0gc3Vic3RyKCR0aGlzLT5fZGF0YSwgJHRoaXMtPl9wb3MgKyA0LCAkbGVuZ3RoKTsNCg0KCQkvLyBtb3ZlIHN0cmVhbSBwb2ludGVyIHRvIG5leHQgcmVjb3JkDQoJCSR0aGlzLT5fcG9zICs9IDQgKyAkbGVuZ3RoOw0KDQoJCS8vIG9mZnNldDogMDsgc2l6ZTogMjsgcm93IGluZGV4DQoJCSRyb3cgPSBzZWxmOjpfR2V0SW50MmQoJHJlY29yZERhdGEsIDApOw0KDQoJCS8vIG9mZnNldDogMjsgc2l6ZTogMjsgY29sIGluZGV4DQoJCSRjb2x1bW4gPSBzZWxmOjpfR2V0SW50MmQoJHJlY29yZERhdGEsIDIpOw0KCQkkY29sdW1uU3RyaW5nID0gUEhQRXhjZWxfQ2VsbDo6c3RyaW5nRnJvbUNvbHVtbkluZGV4KCRjb2x1bW4pOw0KDQoJCS8vIG9mZnNldDogMjA6IHNpemU6IHZhcmlhYmxlOyBmb3JtdWxhIHN0cnVjdHVyZQ0KCQkkZm9ybXVsYVN0cnVjdHVyZSA9IHN1YnN0cigkcmVjb3JkRGF0YSwgMjApOw0KDQoJCS8vIG9mZnNldDogMTQ6IHNpemU6IDI7IG9wdGlvbiBmbGFncywgcmVjYWxjdWxhdGUgYWx3YXlzLCByZWNhbGN1bGF0ZSBvbiBvcGVuIGV0Yy4NCgkJJG9wdGlvbnMgPSBzZWxmOjpfR2V0SW50MmQoJHJlY29yZERhdGEsIDE0KTsNCg0KCQkvLyBiaXQ6IDA7IG1hc2s6IDB4MDAwMTsgMSA9IHJlY2FsY3VsYXRlIGFsd2F5cw0KCQkvLyBiaXQ6IDE7IG1hc2s6IDB4MDAwMjsgMSA9IGNhbGN1bGF0ZSBvbiBvcGVuDQoJCS8vIGJpdDogMjsgbWFzazogMHgwMDA4OyAxID0gcGFydCBvZiBhIHNoYXJlZCBmb3JtdWxhDQoJCSRpc1BhcnRPZlNoYXJlZEZvcm11bGEgPSAoYm9vbCkgKDB4MDAwOCAmICRvcHRpb25zKTsNCg0KCQkvLyBXQVJOSU5HOg0KCQkvLyBXZSBjYW4gYXBwYXJlbnRseSBub3QgcmVseSBvbiAkaXNQYXJ0T2ZTaGFyZWRGb3JtdWxhLiBFdmVuIHdoZW4gJGlzUGFydE9mU2hhcmVkRm9ybXVsYSA9IHRydWUNCgkJLy8gdGhlIGZvcm11bGEgZGF0YSBtYXkgYmUgb3JkaW5hcnkgZm9ybXVsYSBkYXRhLCB0aGVyZWZvcmUgd2UgbmVlZCB0byBjaGVjaw0KCQkvLyBleHBsaWNpdGx5IGZvciB0aGUgdEV4cCB0b2tlbiAoMHgwMSkNCgkJJGlzUGFydE9mU2hhcmVkRm9ybXVsYSA9ICRpc1BhcnRPZlNoYXJlZEZvcm11bGEgJiYgb3JkKCRmb3JtdWxhU3RydWN0dXJlezJ9KSA9PSAweDAxOw0KDQoJCWlmICgkaXNQYXJ0T2ZTaGFyZWRGb3JtdWxhKSB7DQoJCQkvLyBwYXJ0IG9mIHNoYXJlZCBmb3JtdWxhIHdoaWNoIG1lYW5zIHRoZXJlIHdpbGwgYmUgYSBmb3JtdWxhIHdpdGggYSB0RXhwIHRva2VuIGFuZCBub3RoaW5nIGVsc2UNCgkJCS8vIGdldCB0aGUgYmFzZSBjZWxsLCBncmFiIHRFeHAgdG9rZW4NCgkJCSRiYXNlUm93ID0gc2VsZjo6X0dldEludDJkKCRmb3JtdWxhU3RydWN0dXJlLCAzKTsNCgkJCSRiYXNlQ29sID0gc2VsZjo6X0dldEludDJkKCRmb3JtdWxhU3RydWN0dXJlLCA1KTsNCgkJCSR0aGlzLT5fYmFzZUNlbGwgPSBQSFBFeGNlbF9DZWxsOjpzdHJpbmdGcm9tQ29sdW1uSW5kZXgoJGJhc2VDb2wpLiAoJGJhc2VSb3cgKyAxKTsNCgkJfQ0KDQoJCS8vIFJlYWQgY2VsbD8NCgkJaWYgKCgkdGhpcy0+Z2V0UmVhZEZpbHRlcigpICE9PSBOVUxMKSAmJiAkdGhpcy0+Z2V0UmVhZEZpbHRlcigpLT5yZWFkQ2VsbCgkY29sdW1uU3RyaW5nLCAkcm93ICsgMSwgJHRoaXMtPl9waHBTaGVldC0+Z2V0VGl0bGUoKSkgKSB7DQoNCgkJCWlmICgkaXNQYXJ0T2ZTaGFyZWRGb3JtdWxhKSB7DQoJCQkJLy8gZm9ybXVsYSBpcyBhZGRlZCB0byB0aGlzIGNlbGwgYWZ0ZXIgdGhlIHNoZWV0IGhhcyBiZWVuIHJlYWQNCgkJCQkkdGhpcy0+X3NoYXJlZEZvcm11bGFQYXJ0c1skY29sdW1uU3RyaW5nIC4gKCRyb3cgKyAxKV0gPSAkdGhpcy0+X2Jhc2VDZWxsOw0KCQkJfQ0KDQoJCQkvLyBvZmZzZXQ6IDE2OiBzaXplOiA0OyBub3QgdXNlZA0KDQoJCQkvLyBvZmZzZXQ6IDQ7IHNpemU6IDI7IFhGIGluZGV4DQoJCQkkeGZJbmRleCA9IHNlbGY6Ol9HZXRJbnQyZCgkcmVjb3JkRGF0YSwgNCk7DQoNCgkJCS8vIG9mZnNldDogNjsgc2l6ZTogODsgcmVzdWx0IG9mIHRoZSBmb3JtdWxhDQoJCQlpZiAoIChvcmQoJHJlY29yZERhdGF7Nn0pID09IDApDQoJCQkJJiYgKG9yZCgkcmVjb3JkRGF0YXsxMn0pID09IDI1NSkNCgkJCQkmJiAob3JkKCRyZWNvcmREYXRhezEzfSkgPT0gMjU1KSApIHsNCg0KCQkJCS8vIFN0cmluZyBmb3JtdWxhLiBSZXN1bHQgZm9sbG93cyBpbiBhcHBlbmRlZCBTVFJJTkcgcmVjb3JkDQoJCQkJJGRhdGFUeXBlID0gUEhQRXhjZWxfQ2VsbF9EYXRhVHlwZTo6VFlQRV9TVFJJTkc7DQoNCgkJCQkvLyByZWFkIHBvc3NpYmxlIFNIQVJFREZNTEEgcmVjb3JkDQoJCQkJJGNvZGUgPSBzZWxmOjpfR2V0SW50MmQoJHRoaXMtPl9kYXRhLCAkdGhpcy0+X3Bvcyk7DQoJCQkJaWYgKCRjb2RlID09IHNlbGY6OlhMU19UeXBlX1NIQVJFREZNTEEpIHsNCgkJCQkJJHRoaXMtPl9yZWFkU2hhcmVkRm1sYSgpOw0KCQkJCX0NCg0KCQkJCS8vIHJlYWQgU1RSSU5HIHJlY29yZA0KCQkJCSR2YWx1ZSA9ICR0aGlzLT5fcmVhZFN0cmluZygpOw0KDQoJCQl9IGVsc2VpZiAoKG9yZCgkcmVjb3JkRGF0YXs2fSkgPT0gMSkNCgkJCQkmJiAob3JkKCRyZWNvcmREYXRhezEyfSkgPT0gMjU1KQ0KCQkJCSYmIChvcmQoJHJlY29yZERhdGF7MTN9KSA9PSAyNTUpKSB7DQoNCgkJCQkvLyBCb29sZWFuIGZvcm11bGEuIFJlc3VsdCBpcyBpbiArMjsgMD1mYWxzZSwgMT10cnVlDQoJCQkJJGRhdGFUeXBlID0gUEhQRXhjZWxfQ2VsbF9EYXRhVHlwZTo6VFlQRV9CT09MOw0KCQkJCSR2YWx1ZSA9IChib29sKSBvcmQoJHJlY29yZERhdGF7OH0pOw0KDQoJCQl9IGVsc2VpZiAoKG9yZCgkcmVjb3JkRGF0YXs2fSkgPT0gMikNCgkJCQkmJiAob3JkKCRyZWNvcmREYXRhezEyfSkgPT0gMjU1KQ0KCQkJCSYmIChvcmQoJHJlY29yZERhdGF7MTN9KSA9PSAyNTUpKSB7DQoNCgkJCQkvLyBFcnJvciBmb3JtdWxhLiBFcnJvciBjb2RlIGlzIGluICsyDQoJCQkJJGRhdGFUeXBlID0gUEhQRXhjZWxfQ2VsbF9EYXRhVHlwZTo6VFlQRV9FUlJPUjsNCgkJCQkkdmFsdWUgPSBzZWxmOjpfbWFwRXJyb3JDb2RlKG9yZCgkcmVjb3JkRGF0YXs4fSkpOw0KDQoJCQl9IGVsc2VpZiAoKG9yZCgkcmVjb3JkRGF0YXs2fSkgPT0gMykNCgkJCQkmJiAob3JkKCRyZWNvcmREYXRhezEyfSkgPT0gMjU1KQ0KCQkJCSYmIChvcmQoJHJlY29yZERhdGF7MTN9KSA9PSAyNTUpKSB7DQoNCgkJCQkvLyBGb3JtdWxhIHJlc3VsdCBpcyBhIG51bGwgc3RyaW5nDQoJCQkJJGRhdGFUeXBlID0gUEhQRXhjZWxfQ2VsbF9EYXRhVHlwZTo6VFlQRV9OVUxMOw0KCQkJCSR2YWx1ZSA9ICcnOw0KDQoJCQl9IGVsc2Ugew0KDQoJCQkJLy8gZm9ydW1sYSByZXN1bHQgaXMgYSBudW1iZXIsIGZpcnN0IDE0IGJ5dGVzIGxpa2UgX05VTUJFUiByZWNvcmQNCgkJCQkkZGF0YVR5cGUgPSBQSFBFeGNlbF9DZWxsX0RhdGFUeXBlOjpUWVBFX05VTUVSSUM7DQoJCQkJJHZhbHVlID0gc2VsZjo6X2V4dHJhY3ROdW1iZXIoc3Vic3RyKCRyZWNvcmREYXRhLCA2LCA4KSk7DQoNCgkJCX0NCg0KCQkJJGNlbGwgPSAkdGhpcy0+X3BocFNoZWV0LT5nZXRDZWxsKCRjb2x1bW5TdHJpbmcgLiAoJHJvdyArIDEpKTsNCgkJCWlmICghJHRoaXMtPl9yZWFkRGF0YU9ubHkpIHsNCgkJCQkvLyBhZGQgY2VsbCBzdHlsZQ0KCQkJCSRjZWxsLT5zZXRYZkluZGV4KCR0aGlzLT5fbWFwQ2VsbFhmSW5kZXhbJHhmSW5kZXhdKTsNCgkJCX0NCg0KCQkJLy8gc3RvcmUgdGhlIGZvcm11bGENCgkJCWlmICghJGlzUGFydE9mU2hhcmVkRm9ybXVsYSkgew0KCQkJCS8vIG5vdCBwYXJ0IG9mIHNoYXJlZCBmb3JtdWxhDQoJCQkJLy8gYWRkIGNlbGwgdmFsdWUuIElmIHdlIGNhbiByZWFkIGZvcm11bGEsIHBvcHVsYXRlIHdpdGggZm9ybXVsYSwgb3RoZXJ3aXNlIGp1c3QgdXNlZCBjYWNoZWQgdmFsdWUNCgkJCQl0cnkgew0KCQkJCQlpZiAoJHRoaXMtPl92ZXJzaW9uICE9IHNlbGY6OlhMU19CSUZGOCkgew0KCQkJCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbignTm90IEJJRkY4LiBDYW4gb25seSByZWFkIEJJRkY4IGZvcm11bGFzJyk7DQoJCQkJCX0NCgkJCQkJJGZvcm11bGEgPSAkdGhpcy0+X2dldEZvcm11bGFGcm9tU3RydWN0dXJlKCRmb3JtdWxhU3RydWN0dXJlKTsgLy8gZ2V0IGZvcm11bGEgaW4gaHVtYW4gbGFuZ3VhZ2UNCgkJCQkJJGNlbGwtPnNldFZhbHVlRXhwbGljaXQoJz0nIC4gJGZvcm11bGEsIFBIUEV4Y2VsX0NlbGxfRGF0YVR5cGU6OlRZUEVfRk9STVVMQSk7DQoNCgkJCQl9IGNhdGNoIChFeGNlcHRpb24gJGUpIHsNCgkJCQkJJGNlbGwtPnNldFZhbHVlRXhwbGljaXQoJHZhbHVlLCAkZGF0YVR5cGUpOw0KCQkJCX0NCgkJCX0gZWxzZSB7DQoJCQkJaWYgKCR0aGlzLT5fdmVyc2lvbiA9PSBzZWxmOjpYTFNfQklGRjgpIHsNCgkJCQkJLy8gZG8gbm90aGluZyBhdCB0aGlzIHBvaW50LCBmb3JtdWxhIGlkIGFkZGVkIGxhdGVyIGluIHRoZSBjb2RlDQoJCQkJfSBlbHNlIHsNCgkJCQkJJGNlbGwtPnNldFZhbHVlRXhwbGljaXQoJHZhbHVlLCAkZGF0YVR5cGUpOw0KCQkJCX0NCgkJCX0NCg0KCQkJLy8gc3RvcmUgdGhlIGNhY2hlZCBjYWxjdWxhdGVkIHZhbHVlDQoJCQkkY2VsbC0+c2V0Q2FsY3VsYXRlZFZhbHVlKCR2YWx1ZSk7DQoJCX0NCgl9DQoNCg0KCS8qKg0KCSAqIFJlYWQgYSBTSEFSRURGTUxBIHJlY29yZC4gVGhpcyBmdW5jdGlvbiBqdXN0IHN0b3JlcyB0aGUgYmluYXJ5IHNoYXJlZCBmb3JtdWxhIGluIHRoZSByZWFkZXIsDQoJICogd2hpY2ggdXN1YWxseSBjb250YWlucyByZWxhdGl2ZSByZWZlcmVuY2VzLg0KCSAqIFRoZXNlIHdpbGwgYmUgdXNlZCB0byBjb25zdHJ1Y3QgdGhlIGZvcm11bGEgaW4gZWFjaCBzaGFyZWQgZm9ybXVsYSBwYXJ0IGFmdGVyIHRoZSBzaGVldCBpcyByZWFkLg0KCSAqLw0KCXByaXZhdGUgZnVuY3Rpb24gX3JlYWRTaGFyZWRGbWxhKCkNCgl7DQoJCSRsZW5ndGggPSBzZWxmOjpfR2V0SW50MmQoJHRoaXMtPl9kYXRhLCAkdGhpcy0+X3BvcyArIDIpOw0KCQkkcmVjb3JkRGF0YSA9IHN1YnN0cigkdGhpcy0+X2RhdGEsICR0aGlzLT5fcG9zICsgNCwgJGxlbmd0aCk7DQoNCgkJLy8gbW92ZSBzdHJlYW0gcG9pbnRlciB0byBuZXh0IHJlY29yZA0KCQkkdGhpcy0+X3BvcyArPSA0ICsgJGxlbmd0aDsNCg0KCQkvLyBvZmZzZXQ6IDAsIHNpemU6IDY7IGNlbGwgcmFuZ2UgYWRkcmVzcyBvZiB0aGUgYXJlYSB1c2VkIGJ5IHRoZSBzaGFyZWQgZm9ybXVsYSwgbm90IHVzZWQgZm9yIGFueXRoaW5nDQoJCSRjZWxsUmFuZ2UgPSBzdWJzdHIoJHJlY29yZERhdGEsIDAsIDYpOw0KCQkkY2VsbFJhbmdlID0gJHRoaXMtPl9yZWFkQklGRjVDZWxsUmFuZ2VBZGRyZXNzRml4ZWQoJGNlbGxSYW5nZSk7IC8vIG5vdGU6IGV2ZW4gQklGRjggdXNlcyBCSUZGNSBzeW50YXgNCg0KCQkvLyBvZmZzZXQ6IDYsIHNpemU6IDE7IG5vdCB1c2VkDQoNCgkJLy8gb2Zmc2V0OiA3LCBzaXplOiAxOyBudW1iZXIgb2YgZXhpc3RpbmcgRk9STVVMQSByZWNvcmRzIGZvciB0aGlzIHNoYXJlZCBmb3JtdWxhDQoJCSRubyA9IG9yZCgkcmVjb3JkRGF0YXs3fSk7DQoNCgkJLy8gb2Zmc2V0OiA4LCBzaXplOiB2YXI7IEJpbmFyeSB0b2tlbiBhcnJheSBvZiB0aGUgc2hhcmVkIGZvcm11bGENCgkJJGZvcm11bGEgPSBzdWJzdHIoJHJlY29yZERhdGEsIDgpOw0KDQoJCS8vIGF0IHRoaXMgcG9pbnQgd2Ugb25seSBzdG9yZSB0aGUgc2hhcmVkIGZvcm11bGEgZm9yIGxhdGVyIHVzZQ0KCQkkdGhpcy0+X3NoYXJlZEZvcm11bGFzWyR0aGlzLT5fYmFzZUNlbGxdID0gJGZvcm11bGE7DQoNCgl9DQoNCg0KCS8qKg0KCSAqIFJlYWQgYSBTVFJJTkcgcmVjb3JkIGZyb20gY3VycmVudCBzdHJlYW0gcG9zaXRpb24gYW5kIGFkdmFuY2UgdGhlIHN0cmVhbSBwb2ludGVyIHRvIG5leHQgcmVjb3JkDQoJICogVGhpcyByZWNvcmQgaXMgdXNlZCBmb3Igc3RvcmluZyByZXN1bHQgZnJvbSBGT1JNVUxBIHJlY29yZCB3aGVuIGl0IGlzIGEgc3RyaW5nLCBhbmQNCgkgKiBpdCBvY2N1cnMgZGlyZWN0bHkgYWZ0ZXIgdGhlIEZPUk1VTEEgcmVjb3JkDQoJICoNCgkgKiBAcmV0dXJuIHN0cmluZyBUaGUgc3RyaW5nIGNvbnRlbnRzIGFzIFVURi04DQoJICovDQoJcHJpdmF0ZSBmdW5jdGlvbiBfcmVhZFN0cmluZygpDQoJew0KCQkkbGVuZ3RoID0gc2VsZjo6X0dldEludDJkKCR0aGlzLT5fZGF0YSwgJHRoaXMtPl9wb3MgKyAyKTsNCgkJJHJlY29yZERhdGEgPSBzdWJzdHIoJHRoaXMtPl9kYXRhLCAkdGhpcy0+X3BvcyArIDQsICRsZW5ndGgpOw0KDQoJCS8vIG1vdmUgc3RyZWFtIHBvaW50ZXIgdG8gbmV4dCByZWNvcmQNCgkJJHRoaXMtPl9wb3MgKz0gNCArICRsZW5ndGg7DQoNCgkJaWYgKCR0aGlzLT5fdmVyc2lvbiA9PSBzZWxmOjpYTFNfQklGRjgpIHsNCgkJCSRzdHJpbmcgPSBzZWxmOjpfcmVhZFVuaWNvZGVTdHJpbmdMb25nKCRyZWNvcmREYXRhKTsNCgkJCSR2YWx1ZSA9ICRzdHJpbmdbJ3ZhbHVlJ107DQoJCX0gZWxzZSB7DQoJCQkkc3RyaW5nID0gJHRoaXMtPl9yZWFkQnl0ZVN0cmluZ0xvbmcoJHJlY29yZERhdGEpOw0KCQkJJHZhbHVlID0gJHN0cmluZ1sndmFsdWUnXTsNCgkJfQ0KDQoJCXJldHVybiAkdmFsdWU7DQoJfQ0KDQoNCgkvKioNCgkgKiBSZWFkIEJPT0xFUlIgcmVjb3JkDQoJICogVGhpcyByZWNvcmQgcmVwcmVzZW50cyBhIEJvb2xlYW4gdmFsdWUgb3IgZXJyb3IgdmFsdWUNCgkgKiBjZWxsLg0KCSAqDQoJICogLS0JIk9wZW5PZmZpY2Uub3JnJ3MgRG9jdW1lbnRhdGlvbiBvZiB0aGUgTWljcm9zb2Z0DQoJICogCQlFeGNlbCBGaWxlIEZvcm1hdCINCgkgKi8NCglwcml2YXRlIGZ1bmN0aW9uIF9yZWFkQm9vbEVycigpDQoJew0KCQkkbGVuZ3RoID0gc2VsZjo6X0dldEludDJkKCR0aGlzLT5fZGF0YSwgJHRoaXMtPl9wb3MgKyAyKTsNCgkJJHJlY29yZERhdGEgPSBzdWJzdHIoJHRoaXMtPl9kYXRhLCAkdGhpcy0+X3BvcyArIDQsICRsZW5ndGgpOw0KDQoJCS8vIG1vdmUgc3RyZWFtIHBvaW50ZXIgdG8gbmV4dCByZWNvcmQNCgkJJHRoaXMtPl9wb3MgKz0gNCArICRsZW5ndGg7DQoNCgkJLy8gb2Zmc2V0OiAwOyBzaXplOiAyOyByb3cgaW5kZXgNCgkJJHJvdyA9IHNlbGY6Ol9HZXRJbnQyZCgkcmVjb3JkRGF0YSwgMCk7DQoNCgkJLy8gb2Zmc2V0OiAyOyBzaXplOiAyOyBjb2x1bW4gaW5kZXgNCgkJJGNvbHVtbiA9IHNlbGY6Ol9HZXRJbnQyZCgkcmVjb3JkRGF0YSwgMik7DQoJCSRjb2x1bW5TdHJpbmcgPSBQSFBFeGNlbF9DZWxsOjpzdHJpbmdGcm9tQ29sdW1uSW5kZXgoJGNvbHVtbik7DQoNCgkJLy8gUmVhZCBjZWxsPw0KCQlpZiAoKCR0aGlzLT5nZXRSZWFkRmlsdGVyKCkgIT09IE5VTEwpICYmICR0aGlzLT5nZXRSZWFkRmlsdGVyKCktPnJlYWRDZWxsKCRjb2x1bW5TdHJpbmcsICRyb3cgKyAxLCAkdGhpcy0+X3BocFNoZWV0LT5nZXRUaXRsZSgpKSApIHsNCgkJCS8vIG9mZnNldDogNDsgc2l6ZTogMjsgaW5kZXggdG8gWEYgcmVjb3JkDQoJCQkkeGZJbmRleCA9IHNlbGY6Ol9HZXRJbnQyZCgkcmVjb3JkRGF0YSwgNCk7DQoNCgkJCS8vIG9mZnNldDogNjsgc2l6ZTogMTsgdGhlIGJvb2xlYW4gdmFsdWUgb3IgZXJyb3IgdmFsdWUNCgkJCSRib29sRXJyID0gb3JkKCRyZWNvcmREYXRhezZ9KTsNCg0KCQkJLy8gb2Zmc2V0OiA3OyBzaXplOiAxOyAwPWJvb2xlYW47IDE9ZXJyb3INCgkJCSRpc0Vycm9yID0gb3JkKCRyZWNvcmREYXRhezd9KTsNCg0KCQkJJGNlbGwgPSAkdGhpcy0+X3BocFNoZWV0LT5nZXRDZWxsKCRjb2x1bW5TdHJpbmcgLiAoJHJvdyArIDEpKTsNCgkJCXN3aXRjaCAoJGlzRXJyb3IpIHsNCgkJCQljYXNlIDA6IC8vIGJvb2xlYW4NCgkJCQkJJHZhbHVlID0gKGJvb2wpICRib29sRXJyOw0KDQoJCQkJCS8vIGFkZCBjZWxsIHZhbHVlDQoJCQkJCSRjZWxsLT5zZXRWYWx1ZUV4cGxpY2l0KCR2YWx1ZSwgUEhQRXhjZWxfQ2VsbF9EYXRhVHlwZTo6VFlQRV9CT09MKTsNCgkJCQkJYnJlYWs7DQoNCgkJCQljYXNlIDE6IC8vIGVycm9yIHR5cGUNCgkJCQkJJHZhbHVlID0gc2VsZjo6X21hcEVycm9yQ29kZSgkYm9vbEVycik7DQoNCgkJCQkJLy8gYWRkIGNlbGwgdmFsdWUNCgkJCQkJJGNlbGwtPnNldFZhbHVlRXhwbGljaXQoJHZhbHVlLCBQSFBFeGNlbF9DZWxsX0RhdGFUeXBlOjpUWVBFX0VSUk9SKTsNCgkJCQkJYnJlYWs7DQoJCQl9DQoNCgkJCWlmICghJHRoaXMtPl9yZWFkRGF0YU9ubHkpIHsNCgkJCQkvLyBhZGQgY2VsbCBzdHlsZQ0KCQkJCSRjZWxsLT5zZXRYZkluZGV4KCR0aGlzLT5fbWFwQ2VsbFhmSW5kZXhbJHhmSW5kZXhdKTsNCgkJCX0NCgkJfQ0KCX0NCg0KDQoJLyoqDQoJICogUmVhZCBNVUxCTEFOSyByZWNvcmQNCgkgKiBUaGlzIHJlY29yZCByZXByZXNlbnRzIGEgY2VsbCByYW5nZSBvZiBlbXB0eSBjZWxscy4gQWxsDQoJICogY2VsbHMgYXJlIGxvY2F0ZWQgaW4gdGhlIHNhbWUgcm93DQoJICoNCgkgKiAtLQkiT3Blbk9mZmljZS5vcmcncyBEb2N1bWVudGF0aW9uIG9mIHRoZSBNaWNyb3NvZnQNCgkgKiAJCUV4Y2VsIEZpbGUgRm9ybWF0Ig0KCSAqLw0KCXByaXZhdGUgZnVuY3Rpb24gX3JlYWRNdWxCbGFuaygpDQoJew0KCQkkbGVuZ3RoID0gc2VsZjo6X0dldEludDJkKCR0aGlzLT5fZGF0YSwgJHRoaXMtPl9wb3MgKyAyKTsNCgkJJHJlY29yZERhdGEgPSBzdWJzdHIoJHRoaXMtPl9kYXRhLCAkdGhpcy0+X3BvcyArIDQsICRsZW5ndGgpOw0KDQoJCS8vIG1vdmUgc3RyZWFtIHBvaW50ZXIgdG8gbmV4dCByZWNvcmQNCgkJJHRoaXMtPl9wb3MgKz0gNCArICRsZW5ndGg7DQoNCgkJLy8gb2Zmc2V0OiAwOyBzaXplOiAyOyBpbmRleCB0byByb3cNCgkJJHJvdyA9IHNlbGY6Ol9HZXRJbnQyZCgkcmVjb3JkRGF0YSwgMCk7DQoNCgkJLy8gb2Zmc2V0OiAyOyBzaXplOiAyOyBpbmRleCB0byBmaXJzdCBjb2x1bW4NCgkJJGZjID0gc2VsZjo6X0dldEludDJkKCRyZWNvcmREYXRhLCAyKTsNCg0KCQkvLyBvZmZzZXQ6IDQ7IHNpemU6IDIgeCBuYzsgbGlzdCBvZiBpbmRleGVzIHRvIFhGIHJlY29yZHMNCgkJLy8gYWRkIHN0eWxlIGluZm9ybWF0aW9uDQoJCWlmICghJHRoaXMtPl9yZWFkRGF0YU9ubHkpIHsNCgkJCWZvciAoJGkgPSAwOyAkaSA8ICRsZW5ndGggLyAyIC0gMzsgKyskaSkgew0KCQkJCSRjb2x1bW5TdHJpbmcgPSBQSFBFeGNlbF9DZWxsOjpzdHJpbmdGcm9tQ29sdW1uSW5kZXgoJGZjICsgJGkpOw0KDQoJCQkJLy8gUmVhZCBjZWxsPw0KCQkJCWlmICgoJHRoaXMtPmdldFJlYWRGaWx0ZXIoKSAhPT0gTlVMTCkgJiYgJHRoaXMtPmdldFJlYWRGaWx0ZXIoKS0+cmVhZENlbGwoJGNvbHVtblN0cmluZywgJHJvdyArIDEsICR0aGlzLT5fcGhwU2hlZXQtPmdldFRpdGxlKCkpICkgew0KCQkJCQkkeGZJbmRleCA9IHNlbGY6Ol9HZXRJbnQyZCgkcmVjb3JkRGF0YSwgNCArIDIgKiAkaSk7DQoJCQkJCSR0aGlzLT5fcGhwU2hlZXQtPmdldENlbGwoJGNvbHVtblN0cmluZyAuICgkcm93ICsgMSkpLT5zZXRYZkluZGV4KCR0aGlzLT5fbWFwQ2VsbFhmSW5kZXhbJHhmSW5kZXhdKTsNCgkJCQl9DQoJCQl9DQoJCX0NCg0KCQkvLyBvZmZzZXQ6IDY7IHNpemUgMjsgaW5kZXggdG8gbGFzdCBjb2x1bW4gKG5vdCBuZWVkZWQpDQoJfQ0KDQoNCgkvKioNCgkgKiBSZWFkIExBQkVMIHJlY29yZA0KCSAqIFRoaXMgcmVjb3JkIHJlcHJlc2VudHMgYSBjZWxsIHRoYXQgY29udGFpbnMgYSBzdHJpbmcuIEluDQoJICogQklGRjggaXQgaXMgdXN1YWxseSByZXBsYWNlZCBieSB0aGUgTEFCRUxTU1QgcmVjb3JkLg0KCSAqIEV4Y2VsIHN0aWxsIHVzZXMgdGhpcyByZWNvcmQsIGlmIGl0IGNvcGllcyB1bmZvcm1hdHRlZA0KCSAqIHRleHQgY2VsbHMgdG8gdGhlIGNsaXBib2FyZC4NCgkgKg0KCSAqIC0tCSJPcGVuT2ZmaWNlLm9yZydzIERvY3VtZW50YXRpb24gb2YgdGhlIE1pY3Jvc29mdA0KCSAqIAkJRXhjZWwgRmlsZSBGb3JtYXQiDQoJICovDQoJcHJpdmF0ZSBmdW5jdGlvbiBfcmVhZExhYmVsKCkNCgl7DQoJCSRsZW5ndGggPSBzZWxmOjpfR2V0SW50MmQoJHRoaXMtPl9kYXRhLCAkdGhpcy0+X3BvcyArIDIpOw0KCQkkcmVjb3JkRGF0YSA9IHN1YnN0cigkdGhpcy0+X2RhdGEsICR0aGlzLT5fcG9zICsgNCwgJGxlbmd0aCk7DQoNCgkJLy8gbW92ZSBzdHJlYW0gcG9pbnRlciB0byBuZXh0IHJlY29yZA0KCQkkdGhpcy0+X3BvcyArPSA0ICsgJGxlbmd0aDsNCg0KCQkvLyBvZmZzZXQ6IDA7IHNpemU6IDI7IGluZGV4IHRvIHJvdw0KCQkkcm93ID0gc2VsZjo6X0dldEludDJkKCRyZWNvcmREYXRhLCAwKTsNCg0KCQkvLyBvZmZzZXQ6IDI7IHNpemU6IDI7IGluZGV4IHRvIGNvbHVtbg0KCQkkY29sdW1uID0gc2VsZjo6X0dldEludDJkKCRyZWNvcmREYXRhLCAyKTsNCgkJJGNvbHVtblN0cmluZyA9IFBIUEV4Y2VsX0NlbGw6OnN0cmluZ0Zyb21Db2x1bW5JbmRleCgkY29sdW1uKTsNCg0KCQkvLyBSZWFkIGNlbGw/DQoJCWlmICgoJHRoaXMtPmdldFJlYWRGaWx0ZXIoKSAhPT0gTlVMTCkgJiYgJHRoaXMtPmdldFJlYWRGaWx0ZXIoKS0+cmVhZENlbGwoJGNvbHVtblN0cmluZywgJHJvdyArIDEsICR0aGlzLT5fcGhwU2hlZXQtPmdldFRpdGxlKCkpICkgew0KCQkJLy8gb2Zmc2V0OiA0OyBzaXplOiAyOyBYRiBpbmRleA0KCQkJJHhmSW5kZXggPSBzZWxmOjpfR2V0SW50MmQoJHJlY29yZERhdGEsIDQpOw0KDQoJCQkvLyBhZGQgY2VsbCB2YWx1ZQ0KCQkJLy8gdG9kbzogd2hhdCBpZiBzdHJpbmcgaXMgdmVyeSBsb25nPyBjb250aW51ZSByZWNvcmQNCgkJCWlmICgkdGhpcy0+X3ZlcnNpb24gPT0gc2VsZjo6WExTX0JJRkY4KSB7DQoJCQkJJHN0cmluZyA9IHNlbGY6Ol9yZWFkVW5pY29kZVN0cmluZ0xvbmcoc3Vic3RyKCRyZWNvcmREYXRhLCA2KSk7DQoJCQkJJHZhbHVlID0gJHN0cmluZ1sndmFsdWUnXTsNCgkJCX0gZWxzZSB7DQoJCQkJJHN0cmluZyA9ICR0aGlzLT5fcmVhZEJ5dGVTdHJpbmdMb25nKHN1YnN0cigkcmVjb3JkRGF0YSwgNikpOw0KCQkJCSR2YWx1ZSA9ICRzdHJpbmdbJ3ZhbHVlJ107DQoJCQl9DQoJCQkkY2VsbCA9ICR0aGlzLT5fcGhwU2hlZXQtPmdldENlbGwoJGNvbHVtblN0cmluZyAuICgkcm93ICsgMSkpOw0KCQkJJGNlbGwtPnNldFZhbHVlRXhwbGljaXQoJHZhbHVlLCBQSFBFeGNlbF9DZWxsX0RhdGFUeXBlOjpUWVBFX1NUUklORyk7DQoNCgkJCWlmICghJHRoaXMtPl9yZWFkRGF0YU9ubHkpIHsNCgkJCQkvLyBhZGQgY2VsbCBzdHlsZQ0KCQkJCSRjZWxsLT5zZXRYZkluZGV4KCR0aGlzLT5fbWFwQ2VsbFhmSW5kZXhbJHhmSW5kZXhdKTsNCgkJCX0NCgkJfQ0KCX0NCg0KDQoJLyoqDQoJICogUmVhZCBCTEFOSyByZWNvcmQNCgkgKi8NCglwcml2YXRlIGZ1bmN0aW9uIF9yZWFkQmxhbmsoKQ0KCXsNCgkJJGxlbmd0aCA9IHNlbGY6Ol9HZXRJbnQyZCgkdGhpcy0+X2RhdGEsICR0aGlzLT5fcG9zICsgMik7DQoJCSRyZWNvcmREYXRhID0gc3Vic3RyKCR0aGlzLT5fZGF0YSwgJHRoaXMtPl9wb3MgKyA0LCAkbGVuZ3RoKTsNCg0KCQkvLyBtb3ZlIHN0cmVhbSBwb2ludGVyIHRvIG5leHQgcmVjb3JkDQoJCSR0aGlzLT5fcG9zICs9IDQgKyAkbGVuZ3RoOw0KDQoJCS8vIG9mZnNldDogMDsgc2l6ZTogMjsgcm93IGluZGV4DQoJCSRyb3cgPSBzZWxmOjpfR2V0SW50MmQoJHJlY29yZERhdGEsIDApOw0KDQoJCS8vIG9mZnNldDogMjsgc2l6ZTogMjsgY29sIGluZGV4DQoJCSRjb2wgPSBzZWxmOjpfR2V0SW50MmQoJHJlY29yZERhdGEsIDIpOw0KCQkkY29sdW1uU3RyaW5nID0gUEhQRXhjZWxfQ2VsbDo6c3RyaW5nRnJvbUNvbHVtbkluZGV4KCRjb2wpOw0KDQoJCS8vIFJlYWQgY2VsbD8NCgkJaWYgKCgkdGhpcy0+Z2V0UmVhZEZpbHRlcigpICE9PSBOVUxMKSAmJiAkdGhpcy0+Z2V0UmVhZEZpbHRlcigpLT5yZWFkQ2VsbCgkY29sdW1uU3RyaW5nLCAkcm93ICsgMSwgJHRoaXMtPl9waHBTaGVldC0+Z2V0VGl0bGUoKSkgKSB7DQoJCQkvLyBvZmZzZXQ6IDQ7IHNpemU6IDI7IFhGIGluZGV4DQoJCQkkeGZJbmRleCA9IHNlbGY6Ol9HZXRJbnQyZCgkcmVjb3JkRGF0YSwgNCk7DQoNCgkJCS8vIGFkZCBzdHlsZSBpbmZvcm1hdGlvbg0KCQkJaWYgKCEkdGhpcy0+X3JlYWREYXRhT25seSkgew0KCQkJCSR0aGlzLT5fcGhwU2hlZXQtPmdldENlbGwoJGNvbHVtblN0cmluZyAuICgkcm93ICsgMSkpLT5zZXRYZkluZGV4KCR0aGlzLT5fbWFwQ2VsbFhmSW5kZXhbJHhmSW5kZXhdKTsNCgkJCX0NCgkJfQ0KDQoJfQ0KDQoNCgkvKioNCgkgKiBSZWFkIE1TT0RSQVdJTkcgcmVjb3JkDQoJICovDQoJcHJpdmF0ZSBmdW5jdGlvbiBfcmVhZE1zb0RyYXdpbmcoKQ0KCXsNCgkJJGxlbmd0aCA9IHNlbGY6Ol9HZXRJbnQyZCgkdGhpcy0+X2RhdGEsICR0aGlzLT5fcG9zICsgMik7DQoNCgkJLy8gZ2V0IHNwbGljZWQgcmVjb3JkIGRhdGENCgkJJHNwbGljZWRSZWNvcmREYXRhID0gJHRoaXMtPl9nZXRTcGxpY2VkUmVjb3JkRGF0YSgpOw0KCQkkcmVjb3JkRGF0YSA9ICRzcGxpY2VkUmVjb3JkRGF0YVsncmVjb3JkRGF0YSddOw0KDQoJCSR0aGlzLT5fZHJhd2luZ0RhdGEgLj0gJHJlY29yZERhdGE7DQoJfQ0KDQoNCgkvKioNCgkgKiBSZWFkIE9CSiByZWNvcmQNCgkgKi8NCglwcml2YXRlIGZ1bmN0aW9uIF9yZWFkT2JqKCkNCgl7DQoJCSRsZW5ndGggPSBzZWxmOjpfR2V0SW50MmQoJHRoaXMtPl9kYXRhLCAkdGhpcy0+X3BvcyArIDIpOw0KCQkkcmVjb3JkRGF0YSA9IHN1YnN0cigkdGhpcy0+X2RhdGEsICR0aGlzLT5fcG9zICsgNCwgJGxlbmd0aCk7DQoNCgkJLy8gbW92ZSBzdHJlYW0gcG9pbnRlciB0byBuZXh0IHJlY29yZA0KCQkkdGhpcy0+X3BvcyArPSA0ICsgJGxlbmd0aDsNCg0KCQlpZiAoJHRoaXMtPl9yZWFkRGF0YU9ubHkgfHwgJHRoaXMtPl92ZXJzaW9uICE9IHNlbGY6OlhMU19CSUZGOCkgew0KCQkJcmV0dXJuOw0KCQl9DQoNCgkJLy8gcmVjb3JkRGF0YSBjb25zaXN0cyBvZiBhbiBhcnJheSBvZiBzdWJyZWNvcmRzIGxvb2tpbmcgbGlrZSB0aGlzOg0KCQkvLwlmdDogMiBieXRlczsgZnRDbW8gdHlwZSAoMHgxNSkNCgkJLy8JY2I6IDIgYnl0ZXM7IHNpemUgaW4gYnl0ZXMgb2YgZnRDbW8gZGF0YQ0KCQkvLwlvdDogMiBieXRlczsgT2JqZWN0IFR5cGUNCgkJLy8JaWQ6IDIgYnl0ZXM7IE9iamVjdCBpZCBudW1iZXINCgkJLy8JZ3JiaXQ6IDIgYnl0ZXM7IE9wdGlvbiBGbGFncw0KCQkvLwlkYXRhOiB2YXI7IHN1YnJlY29yZCBkYXRhDQoNCgkJLy8gZm9yIG5vdywgd2UgYXJlIGp1c3QgaW50ZXJlc3RlZCBpbiB0aGUgc2Vjb25kIHN1YnJlY29yZCBjb250YWluaW5nIHRoZSBvYmplY3QgdHlwZQ0KCQkkZnRDbW9UeXBlCT0gc2VsZjo6X0dldEludDJkKCRyZWNvcmREYXRhLCAwKTsNCgkJJGNiQ21vU2l6ZQk9IHNlbGY6Ol9HZXRJbnQyZCgkcmVjb3JkRGF0YSwgMik7DQoJCSRvdE9ialR5cGUJPSBzZWxmOjpfR2V0SW50MmQoJHJlY29yZERhdGEsIDQpOw0KCQkkaWRPYmpJRAk9IHNlbGY6Ol9HZXRJbnQyZCgkcmVjb3JkRGF0YSwgNik7DQoJCSRncmJpdE9wdHMJPSBzZWxmOjpfR2V0SW50MmQoJHJlY29yZERhdGEsIDYpOw0KDQoJCSR0aGlzLT5fb2Jqc1tdID0gYXJyYXkoDQoJCQknZnRDbW9UeXBlJwk9PiAkZnRDbW9UeXBlLA0KCQkJJ2NiQ21vU2l6ZScJPT4gJGNiQ21vU2l6ZSwNCgkJCSdvdE9ialR5cGUnCT0+ICRvdE9ialR5cGUsDQoJCQknaWRPYmpJRCcJPT4gJGlkT2JqSUQsDQoJCQknZ3JiaXRPcHRzJwk9PiAkZ3JiaXRPcHRzDQoJCSk7DQoJCSR0aGlzLT50ZXh0T2JqUmVmID0gJGlkT2JqSUQ7DQoNCi8vCQllY2hvICc8Yj5fcmVhZE9iaigpPC9iPjxiciAvPic7DQovLwkJdmFyX2R1bXAoZW5kKCR0aGlzLT5fb2JqcykpOw0KLy8JCWVjaG8gJzxiciAvPic7DQoJfQ0KDQoNCgkvKioNCgkgKiBSZWFkIFdJTkRPVzIgcmVjb3JkDQoJICovDQoJcHJpdmF0ZSBmdW5jdGlvbiBfcmVhZFdpbmRvdzIoKQ0KCXsNCgkJJGxlbmd0aCA9IHNlbGY6Ol9HZXRJbnQyZCgkdGhpcy0+X2RhdGEsICR0aGlzLT5fcG9zICsgMik7DQoJCSRyZWNvcmREYXRhID0gc3Vic3RyKCR0aGlzLT5fZGF0YSwgJHRoaXMtPl9wb3MgKyA0LCAkbGVuZ3RoKTsNCg0KCQkvLyBtb3ZlIHN0cmVhbSBwb2ludGVyIHRvIG5leHQgcmVjb3JkDQoJCSR0aGlzLT5fcG9zICs9IDQgKyAkbGVuZ3RoOw0KDQoJCS8vIG9mZnNldDogMDsgc2l6ZTogMjsgb3B0aW9uIGZsYWdzDQoJCSRvcHRpb25zID0gc2VsZjo6X0dldEludDJkKCRyZWNvcmREYXRhLCAwKTsNCg0KCQkvLyBiaXQ6IDE7IG1hc2s6IDB4MDAwMjsgMCA9IGRvIG5vdCBzaG93IGdyaWRsaW5lcywgMSA9IHNob3cgZ3JpZGxpbmVzDQoJCSRzaG93R3JpZGxpbmVzID0gKGJvb2wpICgoMHgwMDAyICYgJG9wdGlvbnMpID4+IDEpOw0KCQkkdGhpcy0+X3BocFNoZWV0LT5zZXRTaG93R3JpZGxpbmVzKCRzaG93R3JpZGxpbmVzKTsNCg0KCQkvLyBiaXQ6IDI7IG1hc2s6IDB4MDAwNDsgMCA9IGRvIG5vdCBzaG93IGhlYWRlcnMsIDEgPSBzaG93IGhlYWRlcnMNCgkJJHNob3dSb3dDb2xIZWFkZXJzID0gKGJvb2wpICgoMHgwMDA0ICYgJG9wdGlvbnMpID4+IDIpOw0KCQkkdGhpcy0+X3BocFNoZWV0LT5zZXRTaG93Um93Q29sSGVhZGVycygkc2hvd1Jvd0NvbEhlYWRlcnMpOw0KDQoJCS8vIGJpdDogMzsgbWFzazogMHgwMDA4OyAwID0gcGFuZXMgYXJlIG5vdCBmcm96ZW4sIDEgPSBwYW5lcyBhcmUgZnJvemVuDQoJCSR0aGlzLT5fZnJvemVuID0gKGJvb2wpICgoMHgwMDA4ICYgJG9wdGlvbnMpID4+IDMpOw0KDQoJCS8vIGJpdDogNjsgbWFzazogMHgwMDQwOyAwID0gY29sdW1ucyBmcm9tIGxlZnQgdG8gcmlnaHQsIDEgPSBjb2x1bW5zIGZyb20gcmlnaHQgdG8gbGVmdA0KCQkkdGhpcy0+X3BocFNoZWV0LT5zZXRSaWdodFRvTGVmdCgoYm9vbCkoKDB4MDA0MCAmICRvcHRpb25zKSA+PiA2KSk7DQoNCgkJLy8gYml0OiAxMDsgbWFzazogMHgwNDAwOyAwID0gc2hlZXQgbm90IGFjdGl2ZSwgMSA9IHNoZWV0IGFjdGl2ZQ0KCQkkaXNBY3RpdmUgPSAoYm9vbCkgKCgweDA0MDAgJiAkb3B0aW9ucykgPj4gMTApOw0KCQlpZiAoJGlzQWN0aXZlKSB7DQoJCQkkdGhpcy0+X3BocEV4Y2VsLT5zZXRBY3RpdmVTaGVldEluZGV4KCR0aGlzLT5fcGhwRXhjZWwtPmdldEluZGV4KCR0aGlzLT5fcGhwU2hlZXQpKTsNCgkJfQ0KCX0NCg0KDQoJLyoqDQoJICogUmVhZCBTQ0wgcmVjb3JkDQoJICovDQoJcHJpdmF0ZSBmdW5jdGlvbiBfcmVhZFNjbCgpDQoJew0KCQkkbGVuZ3RoID0gc2VsZjo6X0dldEludDJkKCR0aGlzLT5fZGF0YSwgJHRoaXMtPl9wb3MgKyAyKTsNCgkJJHJlY29yZERhdGEgPSBzdWJzdHIoJHRoaXMtPl9kYXRhLCAkdGhpcy0+X3BvcyArIDQsICRsZW5ndGgpOw0KDQoJCS8vIG1vdmUgc3RyZWFtIHBvaW50ZXIgdG8gbmV4dCByZWNvcmQNCgkJJHRoaXMtPl9wb3MgKz0gNCArICRsZW5ndGg7DQoNCgkJLy8gb2Zmc2V0OiAwOyBzaXplOiAyOyBudW1lcmF0b3Igb2YgdGhlIHZpZXcgbWFnbmlmaWNhdGlvbg0KCQkkbnVtZXJhdG9yID0gc2VsZjo6X0dldEludDJkKCRyZWNvcmREYXRhLCAwKTsNCg0KCQkvLyBvZmZzZXQ6IDI7IHNpemU6IDI7IG51bWVyYXRvciBvZiB0aGUgdmlldyBtYWduaWZpY2F0aW9uDQoJCSRkZW51bWVyYXRvciA9IHNlbGY6Ol9HZXRJbnQyZCgkcmVjb3JkRGF0YSwgMik7DQoNCgkJLy8gc2V0IHRoZSB6b29tIHNjYWxlIChpbiBwZXJjZW50KQ0KCQkkdGhpcy0+X3BocFNoZWV0LT5nZXRTaGVldFZpZXcoKS0+c2V0Wm9vbVNjYWxlKCRudW1lcmF0b3IgKiAxMDAgLyAkZGVudW1lcmF0b3IpOw0KCX0NCg0KDQoJLyoqDQoJICogUmVhZCBQQU5FIHJlY29yZA0KCSAqLw0KCXByaXZhdGUgZnVuY3Rpb24gX3JlYWRQYW5lKCkNCgl7DQoJCSRsZW5ndGggPSBzZWxmOjpfR2V0SW50MmQoJHRoaXMtPl9kYXRhLCAkdGhpcy0+X3BvcyArIDIpOw0KCQkkcmVjb3JkRGF0YSA9IHN1YnN0cigkdGhpcy0+X2RhdGEsICR0aGlzLT5fcG9zICsgNCwgJGxlbmd0aCk7DQoNCgkJLy8gbW92ZSBzdHJlYW0gcG9pbnRlciB0byBuZXh0IHJlY29yZA0KCQkkdGhpcy0+X3BvcyArPSA0ICsgJGxlbmd0aDsNCg0KCQlpZiAoISR0aGlzLT5fcmVhZERhdGFPbmx5KSB7DQoJCQkvLyBvZmZzZXQ6IDA7IHNpemU6IDI7IHBvc2l0aW9uIG9mIHZlcnRpY2FsIHNwbGl0DQoJCQkkcHggPSBzZWxmOjpfR2V0SW50MmQoJHJlY29yZERhdGEsIDApOw0KDQoJCQkvLyBvZmZzZXQ6IDI7IHNpemU6IDI7IHBvc2l0aW9uIG9mIGhvcml6b250YWwgc3BsaXQNCgkJCSRweSA9IHNlbGY6Ol9HZXRJbnQyZCgkcmVjb3JkRGF0YSwgMik7DQoNCgkJCWlmICgkdGhpcy0+X2Zyb3plbikgew0KCQkJCS8vIGZyb3plbiBwYW5lcw0KCQkJCSR0aGlzLT5fcGhwU2hlZXQtPmZyZWV6ZVBhbmUoUEhQRXhjZWxfQ2VsbDo6c3RyaW5nRnJvbUNvbHVtbkluZGV4KCRweCkgLiAoJHB5ICsgMSkpOw0KCQkJfSBlbHNlIHsNCgkJCQkvLyB1bmZyb3plbiBwYW5lczsgc3BsaXQgd2luZG93czsgbm90IHN1cHBvcnRlZCBieSBQSFBFeGNlbCBjb3JlDQoJCQl9DQoJCX0NCgl9DQoNCg0KCS8qKg0KCSAqIFJlYWQgU0VMRUNUSU9OIHJlY29yZC4gVGhlcmUgaXMgb25lIHN1Y2ggcmVjb3JkIGZvciBlYWNoIHBhbmUgaW4gdGhlIHNoZWV0Lg0KCSAqLw0KCXByaXZhdGUgZnVuY3Rpb24gX3JlYWRTZWxlY3Rpb24oKQ0KCXsNCgkJJGxlbmd0aCA9IHNlbGY6Ol9HZXRJbnQyZCgkdGhpcy0+X2RhdGEsICR0aGlzLT5fcG9zICsgMik7DQoJCSRyZWNvcmREYXRhID0gc3Vic3RyKCR0aGlzLT5fZGF0YSwgJHRoaXMtPl9wb3MgKyA0LCAkbGVuZ3RoKTsNCg0KCQkvLyBtb3ZlIHN0cmVhbSBwb2ludGVyIHRvIG5leHQgcmVjb3JkDQoJCSR0aGlzLT5fcG9zICs9IDQgKyAkbGVuZ3RoOw0KDQoJCWlmICghJHRoaXMtPl9yZWFkRGF0YU9ubHkpIHsNCgkJCS8vIG9mZnNldDogMDsgc2l6ZTogMTsgcGFuZSBpZGVudGlmaWVyDQoJCQkkcGFuZUlkID0gb3JkKCRyZWNvcmREYXRhezB9KTsNCg0KCQkJLy8gb2Zmc2V0OiAxOyBzaXplOiAyOyBpbmRleCB0byByb3cgb2YgdGhlIGFjdGl2ZSBjZWxsDQoJCQkkciA9IHNlbGY6Ol9HZXRJbnQyZCgkcmVjb3JkRGF0YSwgMSk7DQoNCgkJCS8vIG9mZnNldDogMzsgc2l6ZTogMjsgaW5kZXggdG8gY29sdW1uIG9mIHRoZSBhY3RpdmUgY2VsbA0KCQkJJGMgPSBzZWxmOjpfR2V0SW50MmQoJHJlY29yZERhdGEsIDMpOw0KDQoJCQkvLyBvZmZzZXQ6IDU7IHNpemU6IDI7IGluZGV4IGludG8gdGhlIGZvbGxvd2luZyBjZWxsIHJhbmdlIGxpc3QgdG8gdGhlDQoJCQkvLyAgZW50cnkgdGhhdCBjb250YWlucyB0aGUgYWN0aXZlIGNlbGwNCgkJCSRpbmRleCA9IHNlbGY6Ol9HZXRJbnQyZCgkcmVjb3JkRGF0YSwgNSk7DQoNCgkJCS8vIG9mZnNldDogNzsgc2l6ZTogdmFyOyBjZWxsIHJhbmdlIGFkZHJlc3MgbGlzdCBjb250YWluaW5nIGFsbCBzZWxlY3RlZCBjZWxsIHJhbmdlcw0KCQkJJGRhdGEgPSBzdWJzdHIoJHJlY29yZERhdGEsIDcpOw0KCQkJJGNlbGxSYW5nZUFkZHJlc3NMaXN0ID0gJHRoaXMtPl9yZWFkQklGRjVDZWxsUmFuZ2VBZGRyZXNzTGlzdCgkZGF0YSk7IC8vIG5vdGU6IGFsc28gQklGRjggdXNlcyBCSUZGNSBzeW50YXgNCg0KCQkJJHNlbGVjdGVkQ2VsbHMgPSAkY2VsbFJhbmdlQWRkcmVzc0xpc3RbJ2NlbGxSYW5nZUFkZHJlc3NlcyddWzBdOw0KDQoJCQkvLyBmaXJzdCByb3cgJzEnICsgbGFzdCByb3cgJzE2Mzg0JyBpbmRpY2F0ZXMgdGhhdCBmdWxsIGNvbHVtbiBpcyBzZWxlY3RlZCAoYXBwYXJlbnRseSBhbHNvIGluIEJJRkY4ISkNCgkJCWlmIChwcmVnX21hdGNoKCcvXihbQS1aXSsxXDpbQS1aXSspMTYzODQkLycsICRzZWxlY3RlZENlbGxzKSkgew0KCQkJCSRzZWxlY3RlZENlbGxzID0gcHJlZ19yZXBsYWNlKCcvXihbQS1aXSsxXDpbQS1aXSspMTYzODQkLycsICckezF9MTA0ODU3NicsICRzZWxlY3RlZENlbGxzKTsNCgkJCX0NCg0KCQkJLy8gZmlyc3Qgcm93ICcxJyArIGxhc3Qgcm93ICc2NTUzNicgaW5kaWNhdGVzIHRoYXQgZnVsbCBjb2x1bW4gaXMgc2VsZWN0ZWQNCgkJCWlmIChwcmVnX21hdGNoKCcvXihbQS1aXSsxXDpbQS1aXSspNjU1MzYkLycsICRzZWxlY3RlZENlbGxzKSkgew0KCQkJCSRzZWxlY3RlZENlbGxzID0gcHJlZ19yZXBsYWNlKCcvXihbQS1aXSsxXDpbQS1aXSspNjU1MzYkLycsICckezF9MTA0ODU3NicsICRzZWxlY3RlZENlbGxzKTsNCgkJCX0NCg0KCQkJLy8gZmlyc3QgY29sdW1uICdBJyArIGxhc3QgY29sdW1uICdJVicgaW5kaWNhdGVzIHRoYXQgZnVsbCByb3cgaXMgc2VsZWN0ZWQNCgkJCWlmIChwcmVnX21hdGNoKCcvXihBWzAtOV0rXDopSVYoWzAtOV0rKSQvJywgJHNlbGVjdGVkQ2VsbHMpKSB7DQoJCQkJJHNlbGVjdGVkQ2VsbHMgPSBwcmVnX3JlcGxhY2UoJy9eKEFbMC05XStcOilJVihbMC05XSspJC8nLCAnJHsxfVhGRCR7Mn0nLCAkc2VsZWN0ZWRDZWxscyk7DQoJCQl9DQoNCgkJCSR0aGlzLT5fcGhwU2hlZXQtPnNldFNlbGVjdGVkQ2VsbHMoJHNlbGVjdGVkQ2VsbHMpOw0KCQl9DQoJfQ0KDQoNCglwcml2YXRlIGZ1bmN0aW9uIF9pbmNsdWRlQ2VsbFJhbmdlRmlsdGVyZWQoJGNlbGxSYW5nZUFkZHJlc3MpDQoJew0KCQkkaW5jbHVkZUNlbGxSYW5nZSA9IHRydWU7DQoJCWlmICgkdGhpcy0+Z2V0UmVhZEZpbHRlcigpICE9PSBOVUxMKSB7DQoJCQkkaW5jbHVkZUNlbGxSYW5nZSA9IGZhbHNlOw0KCQkJJHJhbmdlQm91bmRhcmllcyA9IFBIUEV4Y2VsX0NlbGw6OmdldFJhbmdlQm91bmRhcmllcygkY2VsbFJhbmdlQWRkcmVzcyk7DQoJCQkkcmFuZ2VCb3VuZGFyaWVzWzFdWzBdKys7DQoJCQlmb3IgKCRyb3cgPSAkcmFuZ2VCb3VuZGFyaWVzWzBdWzFdOyAkcm93IDw9ICRyYW5nZUJvdW5kYXJpZXNbMV1bMV07ICRyb3crKykgew0KCQkJCWZvciAoJGNvbHVtbiA9ICRyYW5nZUJvdW5kYXJpZXNbMF1bMF07ICRjb2x1bW4gIT0gJHJhbmdlQm91bmRhcmllc1sxXVswXTsgJGNvbHVtbisrKSB7DQoJCQkJCWlmICgkdGhpcy0+Z2V0UmVhZEZpbHRlcigpLT5yZWFkQ2VsbCgkY29sdW1uLCAkcm93LCAkdGhpcy0+X3BocFNoZWV0LT5nZXRUaXRsZSgpKSkgew0KCQkJCQkJJGluY2x1ZGVDZWxsUmFuZ2UgPSB0cnVlOw0KCQkJCQkJYnJlYWsgMjsNCgkJCQkJfQ0KCQkJCX0NCgkJCX0NCgkJfQ0KCQlyZXR1cm4gJGluY2x1ZGVDZWxsUmFuZ2U7DQoJfQ0KDQoNCgkvKioNCgkgKiBNRVJHRURDRUxMUw0KCSAqDQoJICogVGhpcyByZWNvcmQgY29udGFpbnMgdGhlIGFkZHJlc3NlcyBvZiBtZXJnZWQgY2VsbCByYW5nZXMNCgkgKiBpbiB0aGUgY3VycmVudCBzaGVldC4NCgkgKg0KCSAqIC0tCSJPcGVuT2ZmaWNlLm9yZydzIERvY3VtZW50YXRpb24gb2YgdGhlIE1pY3Jvc29mdA0KCSAqIAkJRXhjZWwgRmlsZSBGb3JtYXQiDQoJICovDQoJcHJpdmF0ZSBmdW5jdGlvbiBfcmVhZE1lcmdlZENlbGxzKCkNCgl7DQoJCSRsZW5ndGggPSBzZWxmOjpfR2V0SW50MmQoJHRoaXMtPl9kYXRhLCAkdGhpcy0+X3BvcyArIDIpOw0KCQkkcmVjb3JkRGF0YSA9IHN1YnN0cigkdGhpcy0+X2RhdGEsICR0aGlzLT5fcG9zICsgNCwgJGxlbmd0aCk7DQoNCgkJLy8gbW92ZSBzdHJlYW0gcG9pbnRlciB0byBuZXh0IHJlY29yZA0KCQkkdGhpcy0+X3BvcyArPSA0ICsgJGxlbmd0aDsNCg0KCQlpZiAoJHRoaXMtPl92ZXJzaW9uID09IHNlbGY6OlhMU19CSUZGOCAmJiAhJHRoaXMtPl9yZWFkRGF0YU9ubHkpIHsNCgkJCSRjZWxsUmFuZ2VBZGRyZXNzTGlzdCA9ICR0aGlzLT5fcmVhZEJJRkY4Q2VsbFJhbmdlQWRkcmVzc0xpc3QoJHJlY29yZERhdGEpOw0KCQkJZm9yZWFjaCAoJGNlbGxSYW5nZUFkZHJlc3NMaXN0WydjZWxsUmFuZ2VBZGRyZXNzZXMnXSBhcyAkY2VsbFJhbmdlQWRkcmVzcykgew0KCQkJCWlmICgkdGhpcy0+X2luY2x1ZGVDZWxsUmFuZ2VGaWx0ZXJlZCgkY2VsbFJhbmdlQWRkcmVzcykpIHsNCgkJCQkJJHRoaXMtPl9waHBTaGVldC0+bWVyZ2VDZWxscygkY2VsbFJhbmdlQWRkcmVzcyk7DQoJCQkJfQ0KCQkJfQ0KCQl9DQoJfQ0KDQoNCgkvKioNCgkgKiBSZWFkIEhZUEVSTElOSyByZWNvcmQNCgkgKi8NCglwcml2YXRlIGZ1bmN0aW9uIF9yZWFkSHlwZXJMaW5rKCkNCgl7DQoJCSRsZW5ndGggPSBzZWxmOjpfR2V0SW50MmQoJHRoaXMtPl9kYXRhLCAkdGhpcy0+X3BvcyArIDIpOw0KCQkkcmVjb3JkRGF0YSA9IHN1YnN0cigkdGhpcy0+X2RhdGEsICR0aGlzLT5fcG9zICsgNCwgJGxlbmd0aCk7DQoNCgkJLy8gbW92ZSBzdHJlYW0gcG9pbnRlciBmb3J3YXJkIHRvIG5leHQgcmVjb3JkDQoJCSR0aGlzLT5fcG9zICs9IDQgKyAkbGVuZ3RoOw0KDQoJCWlmICghJHRoaXMtPl9yZWFkRGF0YU9ubHkpIHsNCgkJCS8vIG9mZnNldDogMDsgc2l6ZTogODsgY2VsbCByYW5nZSBhZGRyZXNzIG9mIGFsbCBjZWxscyBjb250YWluaW5nIHRoaXMgaHlwZXJsaW5rDQoJCQl0cnkgew0KCQkJCSRjZWxsUmFuZ2UgPSAkdGhpcy0+X3JlYWRCSUZGOENlbGxSYW5nZUFkZHJlc3NGaXhlZCgkcmVjb3JkRGF0YSwgMCwgOCk7DQoJCQl9IGNhdGNoIChFeGNlcHRpb24gJGUpIHsNCgkJCQlyZXR1cm47DQoJCQl9DQoNCgkJCS8vIG9mZnNldDogOCwgc2l6ZTogMTY7IEdVSUQgb2YgU3RkTGluaw0KDQoJCQkvLyBvZmZzZXQ6IDI0LCBzaXplOiA0OyB1bmtub3duIHZhbHVlDQoNCgkJCS8vIG9mZnNldDogMjgsIHNpemU6IDQ7IG9wdGlvbiBmbGFncw0KDQoJCQkJLy8gYml0OiAwOyBtYXNrOiAweDAwMDAwMDAxOyAwID0gbm8gbGluayBvciBleHRhbnQsIDEgPSBmaWxlIGxpbmsgb3IgVVJMDQoJCQkJJGlzRmlsZUxpbmtPclVybCA9ICgweDAwMDAwMDAxICYgc2VsZjo6X0dldEludDJkKCRyZWNvcmREYXRhLCAyOCkpID4+IDA7DQoNCgkJCQkvLyBiaXQ6IDE7IG1hc2s6IDB4MDAwMDAwMDI7IDAgPSByZWxhdGl2ZSBwYXRoLCAxID0gYWJzb2x1dGUgcGF0aCBvciBVUkwNCgkJCQkkaXNBYnNQYXRoT3JVcmwgPSAoMHgwMDAwMDAwMSAmIHNlbGY6Ol9HZXRJbnQyZCgkcmVjb3JkRGF0YSwgMjgpKSA+PiAxOw0KDQoJCQkJLy8gYml0OiAyIChhbmQgNCk7IG1hc2s6IDB4MDAwMDAwMTQ7IDAgPSBubyBkZXNjcmlwdGlvbg0KCQkJCSRoYXNEZXNjID0gKDB4MDAwMDAwMTQgJiBzZWxmOjpfR2V0SW50MmQoJHJlY29yZERhdGEsIDI4KSkgPj4gMjsNCg0KCQkJCS8vIGJpdDogMzsgbWFzazogMHgwMDAwMDAwODsgMCA9IG5vIHRleHQsIDEgPSBoYXMgdGV4dA0KCQkJCSRoYXNUZXh0ID0gKDB4MDAwMDAwMDggJiBzZWxmOjpfR2V0SW50MmQoJHJlY29yZERhdGEsIDI4KSkgPj4gMzsNCg0KCQkJCS8vIGJpdDogNzsgbWFzazogMHgwMDAwMDA4MDsgMCA9IG5vIHRhcmdldCBmcmFtZSwgMSA9IGhhcyB0YXJnZXQgZnJhbWUNCgkJCQkkaGFzRnJhbWUgPSAoMHgwMDAwMDA4MCAmIHNlbGY6Ol9HZXRJbnQyZCgkcmVjb3JkRGF0YSwgMjgpKSA+PiA3Ow0KDQoJCQkJLy8gYml0OiA4OyBtYXNrOiAweDAwMDAwMTAwOyAwID0gZmlsZSBsaW5rIG9yIFVSTCwgMSA9IFVOQyBwYXRoIChpbmMuIHNlcnZlciBuYW1lKQ0KCQkJCSRpc1VOQyA9ICgweDAwMDAwMTAwICYgc2VsZjo6X0dldEludDJkKCRyZWNvcmREYXRhLCAyOCkpID4+IDg7DQoNCgkJCS8vIG9mZnNldCB3aXRoaW4gcmVjb3JkIGRhdGENCgkJCSRvZmZzZXQgPSAzMjsNCg0KCQkJaWYgKCRoYXNEZXNjKSB7DQoJCQkJLy8gb2Zmc2V0OiAzMjsgc2l6ZTogdmFyOyBjaGFyYWN0ZXIgY291bnQgb2YgZGVzY3JpcHRpb24gdGV4dA0KCQkJCSRkbCA9IHNlbGY6Ol9HZXRJbnQ0ZCgkcmVjb3JkRGF0YSwgMzIpOw0KCQkJCS8vIG9mZnNldDogMzY7IHNpemU6IHZhcjsgY2hhcmFjdGVyIGFycmF5IG9mIGRlc2NyaXB0aW9uIHRleHQsIG5vIFVuaWNvZGUgc3RyaW5nIGhlYWRlciwgYWx3YXlzIDE2LWJpdCBjaGFyYWN0ZXJzLCB6ZXJvIHRlcm1pbmF0ZWQNCgkJCQkkZGVzYyA9IHNlbGY6Ol9lbmNvZGVVVEYxNihzdWJzdHIoJHJlY29yZERhdGEsIDM2LCAyICogKCRkbCAtIDEpKSwgZmFsc2UpOw0KCQkJCSRvZmZzZXQgKz0gNCArIDIgKiAkZGw7DQoJCQl9DQoJCQlpZiAoJGhhc0ZyYW1lKSB7DQoJCQkJJGZsID0gc2VsZjo6X0dldEludDRkKCRyZWNvcmREYXRhLCAkb2Zmc2V0KTsNCgkJCQkkb2Zmc2V0ICs9IDQgKyAyICogJGZsOw0KCQkJfQ0KDQoJCQkvLyBkZXRlY3QgdHlwZSBvZiBoeXBlcmxpbmsgKHRoZXJlIGFyZSA0IHR5cGVzKQ0KCQkJJGh5cGVybGlua1R5cGUgPSBudWxsOw0KDQoJCQlpZiAoJGlzVU5DKSB7DQoJCQkJJGh5cGVybGlua1R5cGUgPSAnVU5DJzsNCgkJCX0gZWxzZSBpZiAoISRpc0ZpbGVMaW5rT3JVcmwpIHsNCgkJCQkkaHlwZXJsaW5rVHlwZSA9ICd3b3JrYm9vayc7DQoJCQl9IGVsc2UgaWYgKG9yZCgkcmVjb3JkRGF0YXskb2Zmc2V0fSkgPT0gMHgwMykgew0KCQkJCSRoeXBlcmxpbmtUeXBlID0gJ2xvY2FsJzsNCgkJCX0gZWxzZSBpZiAob3JkKCRyZWNvcmREYXRheyRvZmZzZXR9KSA9PSAweEUwKSB7DQoJCQkJJGh5cGVybGlua1R5cGUgPSAnVVJMJzsNCgkJCX0NCg0KCQkJc3dpdGNoICgkaHlwZXJsaW5rVHlwZSkgew0KCQkJY2FzZSAnVVJMJzoNCgkJCQkvLyBzZWN0aW9uIDUuNTguMjogSHlwZXJsaW5rIGNvbnRhaW5pbmcgYSBVUkwNCgkJCQkvLyBlLmcuIGh0dHA6Ly9leGFtcGxlLm9yZy9pbmRleC5waHANCg0KCQkJCS8vIG9mZnNldDogdmFyOyBzaXplOiAxNjsgR1VJRCBvZiBVUkwgTW9uaWtlcg0KCQkJCSRvZmZzZXQgKz0gMTY7DQoJCQkJLy8gb2Zmc2V0OiB2YXI7IHNpemU6IDQ7IHNpemUgKGluIGJ5dGVzKSBvZiBjaGFyYWN0ZXIgYXJyYXkgb2YgdGhlIFVSTCBpbmNsdWRpbmcgdHJhaWxpbmcgemVybyB3b3JkDQoJCQkJJHVzID0gc2VsZjo6X0dldEludDRkKCRyZWNvcmREYXRhLCAkb2Zmc2V0KTsNCgkJCQkkb2Zmc2V0ICs9IDQ7DQoJCQkJLy8gb2Zmc2V0OiB2YXI7IHNpemU6ICR1czsgY2hhcmFjdGVyIGFycmF5IG9mIHRoZSBVUkwsIG5vIFVuaWNvZGUgc3RyaW5nIGhlYWRlciwgYWx3YXlzIDE2LWJpdCBjaGFyYWN0ZXJzLCB6ZXJvLXRlcm1pbmF0ZWQNCgkJCQkkdXJsID0gc2VsZjo6X2VuY29kZVVURjE2KHN1YnN0cigkcmVjb3JkRGF0YSwgJG9mZnNldCwgJHVzIC0gMiksIGZhbHNlKTsNCgkJCQkkdXJsIC49ICRoYXNUZXh0ID8gJyMnIDogJyc7DQoJCQkJJG9mZnNldCArPSAkdXM7DQoJCQkJYnJlYWs7DQoNCgkJCWNhc2UgJ2xvY2FsJzoNCgkJCQkvLyBzZWN0aW9uIDUuNTguMzogSHlwZXJsaW5rIHRvIGxvY2FsIGZpbGUNCgkJCQkvLyBleGFtcGxlczoNCgkJCQkvLyAgIG15ZG9jLnR4dA0KCQkJCS8vICAgLi4vLi4vc29tZWRvYy54bHMjU2hlZXQhQTENCg0KCQkJCS8vIG9mZnNldDogdmFyOyBzaXplOiAxNjsgR1VJIG9mIEZpbGUgTW9uaWtlcg0KCQkJCSRvZmZzZXQgKz0gMTY7DQoNCgkJCQkvLyBvZmZzZXQ6IHZhcjsgc2l6ZTogMjsgZGlyZWN0b3J5IHVwLWxldmVsIGNvdW50Lg0KCQkJCSR1cExldmVsQ291bnQgPSBzZWxmOjpfR2V0SW50MmQoJHJlY29yZERhdGEsICRvZmZzZXQpOw0KCQkJCSRvZmZzZXQgKz0gMjsNCg0KCQkJCS8vIG9mZnNldDogdmFyOyBzaXplOiA0OyBjaGFyYWN0ZXIgY291bnQgb2YgdGhlIHNob3J0ZW5lZCBmaWxlIHBhdGggYW5kIG5hbWUsIGluY2x1ZGluZyB0cmFpbGluZyB6ZXJvIHdvcmQNCgkJCQkkc2wgPSBzZWxmOjpfR2V0SW50NGQoJHJlY29yZERhdGEsICRvZmZzZXQpOw0KCQkJCSRvZmZzZXQgKz0gNDsNCg0KCQkJCS8vIG9mZnNldDogdmFyOyBzaXplOiBzbDsgY2hhcmFjdGVyIGFycmF5IG9mIHRoZSBzaG9ydGVuZWQgZmlsZSBwYXRoIGFuZCBuYW1lIGluIDguMy1ET1MtZm9ybWF0IChjb21wcmVzc2VkIFVuaWNvZGUgc3RyaW5nKQ0KCQkJCSRzaG9ydGVuZWRGaWxlUGF0aCA9IHN1YnN0cigkcmVjb3JkRGF0YSwgJG9mZnNldCwgJHNsKTsNCgkJCQkkc2hvcnRlbmVkRmlsZVBhdGggPSBzZWxmOjpfZW5jb2RlVVRGMTYoJHNob3J0ZW5lZEZpbGVQYXRoLCB0cnVlKTsNCgkJCQkkc2hvcnRlbmVkRmlsZVBhdGggPSBzdWJzdHIoJHNob3J0ZW5lZEZpbGVQYXRoLCAwLCAtMSk7IC8vIHJlbW92ZSB0cmFpbGluZyB6ZXJvDQoNCgkJCQkkb2Zmc2V0ICs9ICRzbDsNCg0KCQkJCS8vIG9mZnNldDogdmFyOyBzaXplOiAyNDsgdW5rbm93biBzZXF1ZW5jZQ0KCQkJCSRvZmZzZXQgKz0gMjQ7DQoNCgkJCQkvLyBleHRlbmRlZCBmaWxlIHBhdGgNCgkJCQkvLyBvZmZzZXQ6IHZhcjsgc2l6ZTogNDsgc2l6ZSBvZiB0aGUgZm9sbG93aW5nIGZpbGUgbGluayBmaWVsZCBpbmNsdWRpbmcgc3RyaW5nIGxlbnRoIG1hcmsNCgkJCQkkc3ogPSBzZWxmOjpfR2V0SW50NGQoJHJlY29yZERhdGEsICRvZmZzZXQpOw0KCQkJCSRvZmZzZXQgKz0gNDsNCg0KCQkJCS8vIG9ubHkgcHJlc2VudCBpZiAkc3ogPiAwDQoJCQkJaWYgKCRzeiA+IDApIHsNCgkJCQkJLy8gb2Zmc2V0OiB2YXI7IHNpemU6IDQ7IHNpemUgb2YgdGhlIGNoYXJhY3RlciBhcnJheSBvZiB0aGUgZXh0ZW5kZWQgZmlsZSBwYXRoIGFuZCBuYW1lDQoJCQkJCSR4bCA9IHNlbGY6Ol9HZXRJbnQ0ZCgkcmVjb3JkRGF0YSwgJG9mZnNldCk7DQoJCQkJCSRvZmZzZXQgKz0gNDsNCg0KCQkJCQkvLyBvZmZzZXQ6IHZhcjsgc2l6ZSAyOyB1bmtub3duDQoJCQkJCSRvZmZzZXQgKz0gMjsNCg0KCQkJCQkvLyBvZmZzZXQ6IHZhcjsgc2l6ZSAkeGw7IGNoYXJhY3RlciBhcnJheSBvZiB0aGUgZXh0ZW5kZWQgZmlsZSBwYXRoIGFuZCBuYW1lLg0KCQkJCQkkZXh0ZW5kZWRGaWxlUGF0aCA9IHN1YnN0cigkcmVjb3JkRGF0YSwgJG9mZnNldCwgJHhsKTsNCgkJCQkJJGV4dGVuZGVkRmlsZVBhdGggPSBzZWxmOjpfZW5jb2RlVVRGMTYoJGV4dGVuZGVkRmlsZVBhdGgsIGZhbHNlKTsNCgkJCQkJJG9mZnNldCArPSAkeGw7DQoJCQkJfQ0KDQoJCQkJLy8gY29uc3RydWN0IHRoZSBwYXRoDQoJCQkJJHVybCA9IHN0cl9yZXBlYXQoJy4uXFwnLCAkdXBMZXZlbENvdW50KTsNCgkJCQkkdXJsIC49ICgkc3ogPiAwKSA/DQoJCQkJCSRleHRlbmRlZEZpbGVQYXRoIDogJHNob3J0ZW5lZEZpbGVQYXRoOyAvLyB1c2UgZXh0ZW5kZWQgcGF0aCBpZiBhdmFpbGFibGUNCgkJCQkkdXJsIC49ICRoYXNUZXh0ID8gJyMnIDogJyc7DQoNCgkJCQlicmVhazsNCg0KDQoJCQljYXNlICdVTkMnOg0KCQkJCS8vIHNlY3Rpb24gNS41OC40OiBIeXBlcmxpbmsgdG8gYSBGaWxlIHdpdGggVU5DIChVbml2ZXJzYWwgTmFtaW5nIENvbnZlbnRpb24pIFBhdGgNCgkJCQkvLyB0b2RvOiBpbXBsZW1lbnQNCgkJCQlyZXR1cm47DQoNCgkJCWNhc2UgJ3dvcmtib29rJzoNCgkJCQkvLyBzZWN0aW9uIDUuNTguNTogSHlwZXJsaW5rIHRvIHRoZSBDdXJyZW50IFdvcmtib29rDQoJCQkJLy8gZS5nLiBTaGVldDIhQjE6QzIsIHN0b3JlZCBpbiB0ZXh0IG1hcmsgZmllbGQNCgkJCQkkdXJsID0gJ3NoZWV0Oi8vJzsNCgkJCQlicmVhazsNCg0KCQkJZGVmYXVsdDoNCgkJCQlyZXR1cm47DQoNCgkJCX0NCg0KCQkJaWYgKCRoYXNUZXh0KSB7DQoJCQkJLy8gb2Zmc2V0OiB2YXI7IHNpemU6IDQ7IGNoYXJhY3RlciBjb3VudCBvZiB0ZXh0IG1hcmsgaW5jbHVkaW5nIHRyYWlsaW5nIHplcm8gd29yZA0KCQkJCSR0bCA9IHNlbGY6Ol9HZXRJbnQ0ZCgkcmVjb3JkRGF0YSwgJG9mZnNldCk7DQoJCQkJJG9mZnNldCArPSA0Ow0KCQkJCS8vIG9mZnNldDogdmFyOyBzaXplOiB2YXI7IGNoYXJhY3RlciBhcnJheSBvZiB0aGUgdGV4dCBtYXJrIHdpdGhvdXQgdGhlICMgc2lnbiwgbm8gVW5pY29kZSBoZWFkZXIsIGFsd2F5cyAxNi1iaXQgY2hhcmFjdGVycywgemVyby10ZXJtaW5hdGVkDQoJCQkJJHRleHQgPSBzZWxmOjpfZW5jb2RlVVRGMTYoc3Vic3RyKCRyZWNvcmREYXRhLCAkb2Zmc2V0LCAyICogKCR0bCAtIDEpKSwgZmFsc2UpOw0KCQkJCSR1cmwgLj0gJHRleHQ7DQoJCQl9DQoNCgkJCS8vIGFwcGx5IHRoZSBoeXBlcmxpbmsgdG8gYWxsIHRoZSByZWxldmFudCBjZWxscw0KCQkJZm9yZWFjaCAoUEhQRXhjZWxfQ2VsbDo6ZXh0cmFjdEFsbENlbGxSZWZlcmVuY2VzSW5SYW5nZSgkY2VsbFJhbmdlKSBhcyAkY29vcmRpbmF0ZSkgew0KCQkJCSR0aGlzLT5fcGhwU2hlZXQtPmdldENlbGwoJGNvb3JkaW5hdGUpLT5nZXRIeXBlckxpbmsoKS0+c2V0VXJsKCR1cmwpOw0KCQkJfQ0KCQl9DQoJfQ0KDQoNCgkvKioNCgkgKiBSZWFkIERBVEFWQUxJREFUSU9OUyByZWNvcmQNCgkgKi8NCglwcml2YXRlIGZ1bmN0aW9uIF9yZWFkRGF0YVZhbGlkYXRpb25zKCkNCgl7DQoJCSRsZW5ndGggPSBzZWxmOjpfR2V0SW50MmQoJHRoaXMtPl9kYXRhLCAkdGhpcy0+X3BvcyArIDIpOw0KCQkkcmVjb3JkRGF0YSA9IHN1YnN0cigkdGhpcy0+X2RhdGEsICR0aGlzLT5fcG9zICsgNCwgJGxlbmd0aCk7DQoNCgkJLy8gbW92ZSBzdHJlYW0gcG9pbnRlciBmb3J3YXJkIHRvIG5leHQgcmVjb3JkDQoJCSR0aGlzLT5fcG9zICs9IDQgKyAkbGVuZ3RoOw0KCX0NCg0KDQoJLyoqDQoJICogUmVhZCBEQVRBVkFMSURBVElPTiByZWNvcmQNCgkgKi8NCglwcml2YXRlIGZ1bmN0aW9uIF9yZWFkRGF0YVZhbGlkYXRpb24oKQ0KCXsNCgkJJGxlbmd0aCA9IHNlbGY6Ol9HZXRJbnQyZCgkdGhpcy0+X2RhdGEsICR0aGlzLT5fcG9zICsgMik7DQoJCSRyZWNvcmREYXRhID0gc3Vic3RyKCR0aGlzLT5fZGF0YSwgJHRoaXMtPl9wb3MgKyA0LCAkbGVuZ3RoKTsNCg0KCQkvLyBtb3ZlIHN0cmVhbSBwb2ludGVyIGZvcndhcmQgdG8gbmV4dCByZWNvcmQNCgkJJHRoaXMtPl9wb3MgKz0gNCArICRsZW5ndGg7DQoNCgkJaWYgKCR0aGlzLT5fcmVhZERhdGFPbmx5KSB7DQoJCQlyZXR1cm47DQoJCX0NCg0KCQkvLyBvZmZzZXQ6IDA7IHNpemU6IDQ7IE9wdGlvbnMNCgkJJG9wdGlvbnMgPSBzZWxmOjpfR2V0SW50NGQoJHJlY29yZERhdGEsIDApOw0KDQoJCS8vIGJpdDogMC0zOyBtYXNrOiAweDAwMDAwMDBGOyB0eXBlDQoJCSR0eXBlID0gKDB4MDAwMDAwMEYgJiAkb3B0aW9ucykgPj4gMDsNCgkJc3dpdGNoICgkdHlwZSkgew0KCQkJY2FzZSAweDAwOgkkdHlwZSA9IFBIUEV4Y2VsX0NlbGxfRGF0YVZhbGlkYXRpb246OlRZUEVfTk9ORTsJCWJyZWFrOw0KCQkJY2FzZSAweDAxOgkkdHlwZSA9IFBIUEV4Y2VsX0NlbGxfRGF0YVZhbGlkYXRpb246OlRZUEVfV0hPTEU7CQlicmVhazsNCgkJCWNhc2UgMHgwMjoJJHR5cGUgPSBQSFBFeGNlbF9DZWxsX0RhdGFWYWxpZGF0aW9uOjpUWVBFX0RFQ0lNQUw7CQlicmVhazsNCgkJCWNhc2UgMHgwMzoJJHR5cGUgPSBQSFBFeGNlbF9DZWxsX0RhdGFWYWxpZGF0aW9uOjpUWVBFX0xJU1Q7CQlicmVhazsNCgkJCWNhc2UgMHgwNDoJJHR5cGUgPSBQSFBFeGNlbF9DZWxsX0RhdGFWYWxpZGF0aW9uOjpUWVBFX0RBVEU7CQlicmVhazsNCgkJCWNhc2UgMHgwNToJJHR5cGUgPSBQSFBFeGNlbF9DZWxsX0RhdGFWYWxpZGF0aW9uOjpUWVBFX1RJTUU7CQlicmVhazsNCgkJCWNhc2UgMHgwNjoJJHR5cGUgPSBQSFBFeGNlbF9DZWxsX0RhdGFWYWxpZGF0aW9uOjpUWVBFX1RFWFRMRU5HVEg7CWJyZWFrOw0KCQkJY2FzZSAweDA3OgkkdHlwZSA9IFBIUEV4Y2VsX0NlbGxfRGF0YVZhbGlkYXRpb246OlRZUEVfQ1VTVE9NOwkJYnJlYWs7DQoJCX0NCg0KCQkvLyBiaXQ6IDQtNjsgbWFzazogMHgwMDAwMDA3MDsgZXJyb3IgdHlwZQ0KCQkkZXJyb3JTdHlsZSA9ICgweDAwMDAwMDcwICYgJG9wdGlvbnMpID4+IDQ7DQoJCXN3aXRjaCAoJGVycm9yU3R5bGUpIHsNCgkJCWNhc2UgMHgwMDoJJGVycm9yU3R5bGUgPSBQSFBFeGNlbF9DZWxsX0RhdGFWYWxpZGF0aW9uOjpTVFlMRV9TVE9QOwkJCWJyZWFrOw0KCQkJY2FzZSAweDAxOgkkZXJyb3JTdHlsZSA9IFBIUEV4Y2VsX0NlbGxfRGF0YVZhbGlkYXRpb246OlNUWUxFX1dBUk5JTkc7CQlicmVhazsNCgkJCWNhc2UgMHgwMjoJJGVycm9yU3R5bGUgPSBQSFBFeGNlbF9DZWxsX0RhdGFWYWxpZGF0aW9uOjpTVFlMRV9JTkZPUk1BVElPTjsJYnJlYWs7DQoJCX0NCg0KCQkvLyBiaXQ6IDc7IG1hc2s6IDB4MDAwMDAwODA7IDE9IGZvcm11bGEgaXMgZXhwbGljaXQgKG9ubHkgYXBwbGllcyB0byBsaXN0KQ0KCQkvLyBJIGhhdmUgb25seSBzZWVuIGNhc2VzIHdoZXJlIHRoaXMgaXMgMQ0KCQkkZXhwbGljaXRGb3JtdWxhID0gKDB4MDAwMDAwODAgJiAkb3B0aW9ucykgPj4gNzsNCg0KCQkvLyBiaXQ6IDg7IG1hc2s6IDB4MDAwMDAxMDA7IDE9IGVtcHR5IGNlbGxzIGFsbG93ZWQNCgkJJGFsbG93QmxhbmsgPSAoMHgwMDAwMDEwMCAmICRvcHRpb25zKSA+PiA4Ow0KDQoJCS8vIGJpdDogOTsgbWFzazogMHgwMDAwMDIwMDsgMT0gc3VwcHJlc3MgZHJvcCBkb3duIGFycm93IGluIGxpc3QgdHlwZSB2YWxpZGl0eQ0KCQkkc3VwcHJlc3NEcm9wRG93biA9ICgweDAwMDAwMjAwICYgJG9wdGlvbnMpID4+IDk7DQoNCgkJLy8gYml0OiAxODsgbWFzazogMHgwMDA0MDAwMDsgMT0gc2hvdyBwcm9tcHQgYm94IGlmIGNlbGwgc2VsZWN0ZWQNCgkJJHNob3dJbnB1dE1lc3NhZ2UgPSAoMHgwMDA0MDAwMCAmICRvcHRpb25zKSA+PiAxODsNCg0KCQkvLyBiaXQ6IDE5OyBtYXNrOiAweDAwMDgwMDAwOyAxPSBzaG93IGVycm9yIGJveCBpZiBpbnZhbGlkIHZhbHVlcyBlbnRlcmVkDQoJCSRzaG93RXJyb3JNZXNzYWdlID0gKDB4MDAwODAwMDAgJiAkb3B0aW9ucykgPj4gMTk7DQoNCgkJLy8gYml0OiAyMC0yMzsgbWFzazogMHgwMEYwMDAwMDsgY29uZGl0aW9uIG9wZXJhdG9yDQoJCSRvcGVyYXRvciA9ICgweDAwRjAwMDAwICYgJG9wdGlvbnMpID4+IDIwOw0KCQlzd2l0Y2ggKCRvcGVyYXRvcikgew0KCQkJY2FzZSAweDAwOiAkb3BlcmF0b3IgPSBQSFBFeGNlbF9DZWxsX0RhdGFWYWxpZGF0aW9uOjpPUEVSQVRPUl9CRVRXRUVOCQkJOwlicmVhazsNCgkJCWNhc2UgMHgwMTogJG9wZXJhdG9yID0gUEhQRXhjZWxfQ2VsbF9EYXRhVmFsaWRhdGlvbjo6T1BFUkFUT1JfTk9UQkVUV0VFTgkJOwlicmVhazsNCgkJCWNhc2UgMHgwMjogJG9wZXJhdG9yID0gUEhQRXhjZWxfQ2VsbF9EYXRhVmFsaWRhdGlvbjo6T1BFUkFUT1JfRVFVQUwJCQkJOwlicmVhazsNCgkJCWNhc2UgMHgwMzogJG9wZXJhdG9yID0gUEhQRXhjZWxfQ2VsbF9EYXRhVmFsaWRhdGlvbjo6T1BFUkFUT1JfTk9URVFVQUwJCQk7CWJyZWFrOw0KCQkJY2FzZSAweDA0OiAkb3BlcmF0b3IgPSBQSFBFeGNlbF9DZWxsX0RhdGFWYWxpZGF0aW9uOjpPUEVSQVRPUl9HUkVBVEVSVEhBTgkJOwlicmVhazsNCgkJCWNhc2UgMHgwNTogJG9wZXJhdG9yID0gUEhQRXhjZWxfQ2VsbF9EYXRhVmFsaWRhdGlvbjo6T1BFUkFUT1JfTEVTU1RIQU4JCQk7CWJyZWFrOw0KCQkJY2FzZSAweDA2OiAkb3BlcmF0b3IgPSBQSFBFeGNlbF9DZWxsX0RhdGFWYWxpZGF0aW9uOjpPUEVSQVRPUl9HUkVBVEVSVEhBTk9SRVFVQUw7CWJyZWFrOw0KCQkJY2FzZSAweDA3OiAkb3BlcmF0b3IgPSBQSFBFeGNlbF9DZWxsX0RhdGFWYWxpZGF0aW9uOjpPUEVSQVRPUl9MRVNTVEhBTk9SRVFVQUwJOwlicmVhazsNCgkJfQ0KDQoJCS8vIG9mZnNldDogNDsgc2l6ZTogdmFyOyB0aXRsZSBvZiB0aGUgcHJvbXB0IGJveA0KCQkkb2Zmc2V0ID0gNDsNCgkJJHN0cmluZyA9IHNlbGY6Ol9yZWFkVW5pY29kZVN0cmluZ0xvbmcoc3Vic3RyKCRyZWNvcmREYXRhLCAkb2Zmc2V0KSk7DQoJCSRwcm9tcHRUaXRsZSA9ICRzdHJpbmdbJ3ZhbHVlJ10gIT09IGNocigwKSA/DQoJCQkkc3RyaW5nWyd2YWx1ZSddIDogJyc7DQoJCSRvZmZzZXQgKz0gJHN0cmluZ1snc2l6ZSddOw0KDQoJCS8vIG9mZnNldDogdmFyOyBzaXplOiB2YXI7IHRpdGxlIG9mIHRoZSBlcnJvciBib3gNCgkJJHN0cmluZyA9IHNlbGY6Ol9yZWFkVW5pY29kZVN0cmluZ0xvbmcoc3Vic3RyKCRyZWNvcmREYXRhLCAkb2Zmc2V0KSk7DQoJCSRlcnJvclRpdGxlID0gJHN0cmluZ1sndmFsdWUnXSAhPT0gY2hyKDApID8NCgkJCSRzdHJpbmdbJ3ZhbHVlJ10gOiAnJzsNCgkJJG9mZnNldCArPSAkc3RyaW5nWydzaXplJ107DQoNCgkJLy8gb2Zmc2V0OiB2YXI7IHNpemU6IHZhcjsgdGV4dCBvZiB0aGUgcHJvbXB0IGJveA0KCQkkc3RyaW5nID0gc2VsZjo6X3JlYWRVbmljb2RlU3RyaW5nTG9uZyhzdWJzdHIoJHJlY29yZERhdGEsICRvZmZzZXQpKTsNCgkJJHByb21wdCA9ICRzdHJpbmdbJ3ZhbHVlJ10gIT09IGNocigwKSA/DQoJCQkkc3RyaW5nWyd2YWx1ZSddIDogJyc7DQoJCSRvZmZzZXQgKz0gJHN0cmluZ1snc2l6ZSddOw0KDQoJCS8vIG9mZnNldDogdmFyOyBzaXplOiB2YXI7IHRleHQgb2YgdGhlIGVycm9yIGJveA0KCQkkc3RyaW5nID0gc2VsZjo6X3JlYWRVbmljb2RlU3RyaW5nTG9uZyhzdWJzdHIoJHJlY29yZERhdGEsICRvZmZzZXQpKTsNCgkJJGVycm9yID0gJHN0cmluZ1sndmFsdWUnXSAhPT0gY2hyKDApID8NCgkJCSRzdHJpbmdbJ3ZhbHVlJ10gOiAnJzsNCgkJJG9mZnNldCArPSAkc3RyaW5nWydzaXplJ107DQoNCgkJLy8gb2Zmc2V0OiB2YXI7IHNpemU6IDI7IHNpemUgb2YgdGhlIGZvcm11bGEgZGF0YSBmb3IgdGhlIGZpcnN0IGNvbmRpdGlvbg0KCQkkc3oxID0gc2VsZjo6X0dldEludDJkKCRyZWNvcmREYXRhLCAkb2Zmc2V0KTsNCgkJJG9mZnNldCArPSAyOw0KDQoJCS8vIG9mZnNldDogdmFyOyBzaXplOiAyOyBub3QgdXNlZA0KCQkkb2Zmc2V0ICs9IDI7DQoNCgkJLy8gb2Zmc2V0OiB2YXI7IHNpemU6ICRzejE7IGZvcm11bGEgZGF0YSBmb3IgZmlyc3QgY29uZGl0aW9uICh3aXRob3V0IHNpemUgZmllbGQpDQoJCSRmb3JtdWxhMSA9IHN1YnN0cigkcmVjb3JkRGF0YSwgJG9mZnNldCwgJHN6MSk7DQoJCSRmb3JtdWxhMSA9IHBhY2soJ3YnLCAkc3oxKSAuICRmb3JtdWxhMTsgLy8gcHJlcGVuZCB0aGUgbGVuZ3RoDQoJCXRyeSB7DQoJCQkkZm9ybXVsYTEgPSAkdGhpcy0+X2dldEZvcm11bGFGcm9tU3RydWN0dXJlKCRmb3JtdWxhMSk7DQoNCgkJCS8vIGluIGxpc3QgdHlwZSB2YWxpZGl0eSwgbnVsbCBjaGFyYWN0ZXJzIGFyZSB1c2VkIGFzIGl0ZW0gc2VwYXJhdG9ycw0KCQkJaWYgKCR0eXBlID09IFBIUEV4Y2VsX0NlbGxfRGF0YVZhbGlkYXRpb246OlRZUEVfTElTVCkgew0KCQkJCSRmb3JtdWxhMSA9IHN0cl9yZXBsYWNlKGNocigwKSwgJywnLCAkZm9ybXVsYTEpOw0KCQkJfQ0KCQl9IGNhdGNoIChFeGNlcHRpb24gJGUpIHsNCgkJCXJldHVybjsNCgkJfQ0KCQkkb2Zmc2V0ICs9ICRzejE7DQoNCgkJLy8gb2Zmc2V0OiB2YXI7IHNpemU6IDI7IHNpemUgb2YgdGhlIGZvcm11bGEgZGF0YSBmb3IgdGhlIGZpcnN0IGNvbmRpdGlvbg0KCQkkc3oyID0gc2VsZjo6X0dldEludDJkKCRyZWNvcmREYXRhLCAkb2Zmc2V0KTsNCgkJJG9mZnNldCArPSAyOw0KDQoJCS8vIG9mZnNldDogdmFyOyBzaXplOiAyOyBub3QgdXNlZA0KCQkkb2Zmc2V0ICs9IDI7DQoNCgkJLy8gb2Zmc2V0OiB2YXI7IHNpemU6ICRzejI7IGZvcm11bGEgZGF0YSBmb3Igc2Vjb25kIGNvbmRpdGlvbiAod2l0aG91dCBzaXplIGZpZWxkKQ0KCQkkZm9ybXVsYTIgPSBzdWJzdHIoJHJlY29yZERhdGEsICRvZmZzZXQsICRzejIpOw0KCQkkZm9ybXVsYTIgPSBwYWNrKCd2JywgJHN6MikgLiAkZm9ybXVsYTI7IC8vIHByZXBlbmQgdGhlIGxlbmd0aA0KCQl0cnkgew0KCQkJJGZvcm11bGEyID0gJHRoaXMtPl9nZXRGb3JtdWxhRnJvbVN0cnVjdHVyZSgkZm9ybXVsYTIpOw0KCQl9IGNhdGNoIChFeGNlcHRpb24gJGUpIHsNCgkJCXJldHVybjsNCgkJfQ0KCQkkb2Zmc2V0ICs9ICRzejI7DQoNCgkJLy8gb2Zmc2V0OiB2YXI7IHNpemU6IHZhcjsgY2VsbCByYW5nZSBhZGRyZXNzIGxpc3Qgd2l0aA0KCQkkY2VsbFJhbmdlQWRkcmVzc0xpc3QgPSAkdGhpcy0+X3JlYWRCSUZGOENlbGxSYW5nZUFkZHJlc3NMaXN0KHN1YnN0cigkcmVjb3JkRGF0YSwgJG9mZnNldCkpOw0KCQkkY2VsbFJhbmdlQWRkcmVzc2VzID0gJGNlbGxSYW5nZUFkZHJlc3NMaXN0WydjZWxsUmFuZ2VBZGRyZXNzZXMnXTsNCg0KCQlmb3JlYWNoICgkY2VsbFJhbmdlQWRkcmVzc2VzIGFzICRjZWxsUmFuZ2UpIHsNCgkJCSRzdFJhbmdlID0gJHRoaXMtPl9waHBTaGVldC0+c2hyaW5rUmFuZ2VUb0ZpdCgkY2VsbFJhbmdlKTsNCgkJCSRzdFJhbmdlID0gUEhQRXhjZWxfQ2VsbDo6ZXh0cmFjdEFsbENlbGxSZWZlcmVuY2VzSW5SYW5nZSgkc3RSYW5nZSk7DQoJCQlmb3JlYWNoICgkc3RSYW5nZSBhcyAkY29vcmRpbmF0ZSkgew0KCQkJCSRvYmpWYWxpZGF0aW9uID0gJHRoaXMtPl9waHBTaGVldC0+Z2V0Q2VsbCgkY29vcmRpbmF0ZSktPmdldERhdGFWYWxpZGF0aW9uKCk7DQoJCQkJJG9ialZhbGlkYXRpb24tPnNldFR5cGUoJHR5cGUpOw0KCQkJCSRvYmpWYWxpZGF0aW9uLT5zZXRFcnJvclN0eWxlKCRlcnJvclN0eWxlKTsNCgkJCQkkb2JqVmFsaWRhdGlvbi0+c2V0QWxsb3dCbGFuaygoYm9vbCkkYWxsb3dCbGFuayk7DQoJCQkJJG9ialZhbGlkYXRpb24tPnNldFNob3dJbnB1dE1lc3NhZ2UoKGJvb2wpJHNob3dJbnB1dE1lc3NhZ2UpOw0KCQkJCSRvYmpWYWxpZGF0aW9uLT5zZXRTaG93RXJyb3JNZXNzYWdlKChib29sKSRzaG93RXJyb3JNZXNzYWdlKTsNCgkJCQkkb2JqVmFsaWRhdGlvbi0+c2V0U2hvd0Ryb3BEb3duKCEkc3VwcHJlc3NEcm9wRG93bik7DQoJCQkJJG9ialZhbGlkYXRpb24tPnNldE9wZXJhdG9yKCRvcGVyYXRvcik7DQoJCQkJJG9ialZhbGlkYXRpb24tPnNldEVycm9yVGl0bGUoJGVycm9yVGl0bGUpOw0KCQkJCSRvYmpWYWxpZGF0aW9uLT5zZXRFcnJvcigkZXJyb3IpOw0KCQkJCSRvYmpWYWxpZGF0aW9uLT5zZXRQcm9tcHRUaXRsZSgkcHJvbXB0VGl0bGUpOw0KCQkJCSRvYmpWYWxpZGF0aW9uLT5zZXRQcm9tcHQoJHByb21wdCk7DQoJCQkJJG9ialZhbGlkYXRpb24tPnNldEZvcm11bGExKCRmb3JtdWxhMSk7DQoJCQkJJG9ialZhbGlkYXRpb24tPnNldEZvcm11bGEyKCRmb3JtdWxhMik7DQoJCQl9DQoJCX0NCg0KCX0NCg0KDQoJLyoqDQoJICogUmVhZCBTSEVFVExBWU9VVCByZWNvcmQuIFN0b3JlcyBzaGVldCB0YWIgY29sb3IgaW5mb3JtYXRpb24uDQoJICovDQoJcHJpdmF0ZSBmdW5jdGlvbiBfcmVhZFNoZWV0TGF5b3V0KCkNCgl7DQoJCSRsZW5ndGggPSBzZWxmOjpfR2V0SW50MmQoJHRoaXMtPl9kYXRhLCAkdGhpcy0+X3BvcyArIDIpOw0KCQkkcmVjb3JkRGF0YSA9IHN1YnN0cigkdGhpcy0+X2RhdGEsICR0aGlzLT5fcG9zICsgNCwgJGxlbmd0aCk7DQoNCgkJLy8gbW92ZSBzdHJlYW0gcG9pbnRlciB0byBuZXh0IHJlY29yZA0KCQkkdGhpcy0+X3BvcyArPSA0ICsgJGxlbmd0aDsNCg0KCQkvLyBsb2NhbCBwb2ludGVyIGluIHJlY29yZCBkYXRhDQoJCSRvZmZzZXQgPSAwOw0KDQoJCWlmICghJHRoaXMtPl9yZWFkRGF0YU9ubHkpIHsNCgkJCS8vIG9mZnNldDogMDsgc2l6ZTogMjsgcmVwZWF0ZWQgcmVjb3JkIGlkZW50aWZpZXIgMHgwODYyDQoNCgkJCS8vIG9mZnNldDogMjsgc2l6ZTogMTA7IG5vdCB1c2VkDQoNCgkJCS8vIG9mZnNldDogMTI7IHNpemU6IDQ7IHNpemUgb2YgcmVjb3JkIGRhdGENCgkJCS8vIEV4Y2VsIDIwMDMgdXNlcyBzaXplIG9mIDB4MTQgKGRvY3VtZW50ZWQpLCBFeGNlbCAyMDA3IHVzZXMgc2l6ZSBvZiAweDI4IChub3QgZG9jdW1lbnRlZD8pDQoJCQkkc3ogPSBzZWxmOjpfR2V0SW50NGQoJHJlY29yZERhdGEsIDEyKTsNCg0KCQkJc3dpdGNoICgkc3opIHsNCgkJCQljYXNlIDB4MTQ6DQoJCQkJCS8vIG9mZnNldDogMTY7IHNpemU6IDI7IGNvbG9yIGluZGV4IGZvciBzaGVldCB0YWINCgkJCQkJJGNvbG9ySW5kZXggPSBzZWxmOjpfR2V0SW50MmQoJHJlY29yZERhdGEsIDE2KTsNCgkJCQkJJGNvbG9yID0gc2VsZjo6X3JlYWRDb2xvcigkY29sb3JJbmRleCwkdGhpcy0+X3BhbGV0dGUsJHRoaXMtPl92ZXJzaW9uKTsNCgkJCQkJJHRoaXMtPl9waHBTaGVldC0+Z2V0VGFiQ29sb3IoKS0+c2V0UkdCKCRjb2xvclsncmdiJ10pOw0KCQkJCQlicmVhazsNCg0KCQkJCWNhc2UgMHgyODoNCgkJCQkJLy8gVE9ETzogSW52ZXN0aWdhdGUgc3RydWN0dXJlIGZvciAueGxzIFNIRUVUTEFZT1VUIHJlY29yZCBhcyBzYXZlZCBieSBNUyBPZmZpY2UgRXhjZWwgMjAwNw0KCQkJCQlyZXR1cm47DQoJCQkJCWJyZWFrOw0KCQkJfQ0KCQl9DQoJfQ0KDQoNCgkvKioNCgkgKiBSZWFkIFNIRUVUUFJPVEVDVElPTiByZWNvcmQgKEZFQVRIRUFEUikNCgkgKi8NCglwcml2YXRlIGZ1bmN0aW9uIF9yZWFkU2hlZXRQcm90ZWN0aW9uKCkNCgl7DQoJCSRsZW5ndGggPSBzZWxmOjpfR2V0SW50MmQoJHRoaXMtPl9kYXRhLCAkdGhpcy0+X3BvcyArIDIpOw0KCQkkcmVjb3JkRGF0YSA9IHN1YnN0cigkdGhpcy0+X2RhdGEsICR0aGlzLT5fcG9zICsgNCwgJGxlbmd0aCk7DQoNCgkJLy8gbW92ZSBzdHJlYW0gcG9pbnRlciB0byBuZXh0IHJlY29yZA0KCQkkdGhpcy0+X3BvcyArPSA0ICsgJGxlbmd0aDsNCg0KCQlpZiAoJHRoaXMtPl9yZWFkRGF0YU9ubHkpIHsNCgkJCXJldHVybjsNCgkJfQ0KDQoJCS8vIG9mZnNldDogMDsgc2l6ZTogMjsgcmVwZWF0ZWQgcmVjb3JkIGhlYWRlcg0KDQoJCS8vIG9mZnNldDogMjsgc2l6ZTogMjsgRlJUIGNlbGwgcmVmZXJlbmNlIGZsYWcgKD0wIGN1cnJlbnRseSkNCg0KCQkvLyBvZmZzZXQ6IDQ7IHNpemU6IDg7IEN1cnJlbnRseSBub3QgdXNlZCBhbmQgc2V0IHRvIDANCg0KCQkvLyBvZmZzZXQ6IDEyOyBzaXplOiAyOyBTaGFyZWQgZmVhdHVyZSB0eXBlIGluZGV4ICgyPUVuaGFuY2VkIFByb3RldGlvbiwgND1TbWFydFRhZykNCgkJJGlzZiA9IHNlbGY6Ol9HZXRJbnQyZCgkcmVjb3JkRGF0YSwgMTIpOw0KCQlpZiAoJGlzZiAhPSAyKSB7DQoJCQlyZXR1cm47DQoJCX0NCg0KCQkvLyBvZmZzZXQ6IDE0OyBzaXplOiAxOyA9MSBzaW5jZSB0aGlzIGlzIGEgZmVhdCBoZWFkZXINCg0KCQkvLyBvZmZzZXQ6IDE1OyBzaXplOiA0OyBzaXplIG9mIHJnYkhkclNEYXRhDQoNCgkJLy8gcmdiSGRyU0RhdGEsIGFzc3VtZSAiRW5oYW5jZWQgUHJvdGVjdGlvbiINCgkJLy8gb2Zmc2V0OiAxOTsgc2l6ZTogMjsgb3B0aW9uIGZsYWdzDQoJCSRvcHRpb25zID0gc2VsZjo6X0dldEludDJkKCRyZWNvcmREYXRhLCAxOSk7DQoNCgkJLy8gYml0OiAwOyBtYXNrIDB4MDAwMTsgMSA9IHVzZXIgbWF5IGVkaXQgb2JqZWN0cywgMCA9IHVzZXJzIG11c3Qgbm90IGVkaXQgb2JqZWN0cw0KCQkkYm9vbCA9ICgweDAwMDEgJiAkb3B0aW9ucykgPj4gMDsNCgkJJHRoaXMtPl9waHBTaGVldC0+Z2V0UHJvdGVjdGlvbigpLT5zZXRPYmplY3RzKCEkYm9vbCk7DQoNCgkJLy8gYml0OiAxOyBtYXNrIDB4MDAwMjsgZWRpdCBzY2VuYXJpb3MNCgkJJGJvb2wgPSAoMHgwMDAyICYgJG9wdGlvbnMpID4+IDE7DQoJCSR0aGlzLT5fcGhwU2hlZXQtPmdldFByb3RlY3Rpb24oKS0+c2V0U2NlbmFyaW9zKCEkYm9vbCk7DQoNCgkJLy8gYml0OiAyOyBtYXNrIDB4MDAwNDsgZm9ybWF0IGNlbGxzDQoJCSRib29sID0gKDB4MDAwNCAmICRvcHRpb25zKSA+PiAyOw0KCQkkdGhpcy0+X3BocFNoZWV0LT5nZXRQcm90ZWN0aW9uKCktPnNldEZvcm1hdENlbGxzKCEkYm9vbCk7DQoNCgkJLy8gYml0OiAzOyBtYXNrIDB4MDAwODsgZm9ybWF0IGNvbHVtbnMNCgkJJGJvb2wgPSAoMHgwMDA4ICYgJG9wdGlvbnMpID4+IDM7DQoJCSR0aGlzLT5fcGhwU2hlZXQtPmdldFByb3RlY3Rpb24oKS0+c2V0Rm9ybWF0Q29sdW1ucyghJGJvb2wpOw0KDQoJCS8vIGJpdDogNDsgbWFzayAweDAwMTA7IGZvcm1hdCByb3dzDQoJCSRib29sID0gKDB4MDAxMCAmICRvcHRpb25zKSA+PiA0Ow0KCQkkdGhpcy0+X3BocFNoZWV0LT5nZXRQcm90ZWN0aW9uKCktPnNldEZvcm1hdFJvd3MoISRib29sKTsNCg0KCQkvLyBiaXQ6IDU7IG1hc2sgMHgwMDIwOyBpbnNlcnQgY29sdW1ucw0KCQkkYm9vbCA9ICgweDAwMjAgJiAkb3B0aW9ucykgPj4gNTsNCgkJJHRoaXMtPl9waHBTaGVldC0+Z2V0UHJvdGVjdGlvbigpLT5zZXRJbnNlcnRDb2x1bW5zKCEkYm9vbCk7DQoNCgkJLy8gYml0OiA2OyBtYXNrIDB4MDA0MDsgaW5zZXJ0IHJvd3MNCgkJJGJvb2wgPSAoMHgwMDQwICYgJG9wdGlvbnMpID4+IDY7DQoJCSR0aGlzLT5fcGhwU2hlZXQtPmdldFByb3RlY3Rpb24oKS0+c2V0SW5zZXJ0Um93cyghJGJvb2wpOw0KDQoJCS8vIGJpdDogNzsgbWFzayAweDAwODA7IGluc2VydCBoeXBlcmxpbmtzDQoJCSRib29sID0gKDB4MDA4MCAmICRvcHRpb25zKSA+PiA3Ow0KCQkkdGhpcy0+X3BocFNoZWV0LT5nZXRQcm90ZWN0aW9uKCktPnNldEluc2VydEh5cGVybGlua3MoISRib29sKTsNCg0KCQkvLyBiaXQ6IDg7IG1hc2sgMHgwMTAwOyBkZWxldGUgY29sdW1ucw0KCQkkYm9vbCA9ICgweDAxMDAgJiAkb3B0aW9ucykgPj4gODsNCgkJJHRoaXMtPl9waHBTaGVldC0+Z2V0UHJvdGVjdGlvbigpLT5zZXREZWxldGVDb2x1bW5zKCEkYm9vbCk7DQoNCgkJLy8gYml0OiA5OyBtYXNrIDB4MDIwMDsgZGVsZXRlIHJvd3MNCgkJJGJvb2wgPSAoMHgwMjAwICYgJG9wdGlvbnMpID4+IDk7DQoJCSR0aGlzLT5fcGhwU2hlZXQtPmdldFByb3RlY3Rpb24oKS0+c2V0RGVsZXRlUm93cyghJGJvb2wpOw0KDQoJCS8vIGJpdDogMTA7IG1hc2sgMHgwNDAwOyBzZWxlY3QgbG9ja2VkIGNlbGxzDQoJCSRib29sID0gKDB4MDQwMCAmICRvcHRpb25zKSA+PiAxMDsNCgkJJHRoaXMtPl9waHBTaGVldC0+Z2V0UHJvdGVjdGlvbigpLT5zZXRTZWxlY3RMb2NrZWRDZWxscyghJGJvb2wpOw0KDQoJCS8vIGJpdDogMTE7IG1hc2sgMHgwODAwOyBzb3J0IGNlbGwgcmFuZ2UNCgkJJGJvb2wgPSAoMHgwODAwICYgJG9wdGlvbnMpID4+IDExOw0KCQkkdGhpcy0+X3BocFNoZWV0LT5nZXRQcm90ZWN0aW9uKCktPnNldFNvcnQoISRib29sKTsNCg0KCQkvLyBiaXQ6IDEyOyBtYXNrIDB4MTAwMDsgYXV0byBmaWx0ZXINCgkJJGJvb2wgPSAoMHgxMDAwICYgJG9wdGlvbnMpID4+IDEyOw0KCQkkdGhpcy0+X3BocFNoZWV0LT5nZXRQcm90ZWN0aW9uKCktPnNldEF1dG9GaWx0ZXIoISRib29sKTsNCg0KCQkvLyBiaXQ6IDEzOyBtYXNrIDB4MjAwMDsgcGl2b3QgdGFibGVzDQoJCSRib29sID0gKDB4MjAwMCAmICRvcHRpb25zKSA+PiAxMzsNCgkJJHRoaXMtPl9waHBTaGVldC0+Z2V0UHJvdGVjdGlvbigpLT5zZXRQaXZvdFRhYmxlcyghJGJvb2wpOw0KDQoJCS8vIGJpdDogMTQ7IG1hc2sgMHg0MDAwOyBzZWxlY3QgdW5sb2NrZWQgY2VsbHMNCgkJJGJvb2wgPSAoMHg0MDAwICYgJG9wdGlvbnMpID4+IDE0Ow0KCQkkdGhpcy0+X3BocFNoZWV0LT5nZXRQcm90ZWN0aW9uKCktPnNldFNlbGVjdFVubG9ja2VkQ2VsbHMoISRib29sKTsNCg0KCQkvLyBvZmZzZXQ6IDIxOyBzaXplOiAyOyBub3QgdXNlZA0KCX0NCg0KDQoJLyoqDQoJICogUmVhZCBSQU5HRVBST1RFQ1RJT04gcmVjb3JkDQoJICogUmVhZGluZyBvZiB0aGlzIHJlY29yZCBpcyBiYXNlZCBvbiBNaWNyb3NvZnQgT2ZmaWNlIEV4Y2VsIDk3LTIwMDAgQmluYXJ5IEZpbGUgRm9ybWF0IFNwZWNpZmljYXRpb24sDQoJICogd2hlcmUgaXQgaXMgcmVmZXJyZWQgdG8gYXMgRkVBVCByZWNvcmQNCgkgKi8NCglwcml2YXRlIGZ1bmN0aW9uIF9yZWFkUmFuZ2VQcm90ZWN0aW9uKCkNCgl7DQoJCSRsZW5ndGggPSBzZWxmOjpfR2V0SW50MmQoJHRoaXMtPl9kYXRhLCAkdGhpcy0+X3BvcyArIDIpOw0KCQkkcmVjb3JkRGF0YSA9IHN1YnN0cigkdGhpcy0+X2RhdGEsICR0aGlzLT5fcG9zICsgNCwgJGxlbmd0aCk7DQoNCgkJLy8gbW92ZSBzdHJlYW0gcG9pbnRlciB0byBuZXh0IHJlY29yZA0KCQkkdGhpcy0+X3BvcyArPSA0ICsgJGxlbmd0aDsNCg0KCQkvLyBsb2NhbCBwb2ludGVyIGluIHJlY29yZCBkYXRhDQoJCSRvZmZzZXQgPSAwOw0KDQoJCWlmICghJHRoaXMtPl9yZWFkRGF0YU9ubHkpIHsNCgkJCSRvZmZzZXQgKz0gMTI7DQoNCgkJCS8vIG9mZnNldDogMTI7IHNpemU6IDI7IHNoYXJlZCBmZWF0dXJlIHR5cGUsIDIgPSBlbmhhbmNlZCBwcm90ZWN0aW9uLCA0ID0gc21hcnQgdGFnDQoJCQkkaXNmID0gc2VsZjo6X0dldEludDJkKCRyZWNvcmREYXRhLCAxMik7DQoJCQlpZiAoJGlzZiAhPSAyKSB7DQoJCQkJLy8gd2Ugb25seSByZWFkIEZFQVQgcmVjb3JkcyBvZiB0eXBlIDINCgkJCQlyZXR1cm47DQoJCQl9DQoJCQkkb2Zmc2V0ICs9IDI7DQoNCgkJCSRvZmZzZXQgKz0gNTsNCg0KCQkJLy8gb2Zmc2V0OiAxOTsgc2l6ZTogMjsgY291bnQgb2YgcmVmIHJhbmdlcyB0aGlzIGZlYXR1cmUgaXMgb24NCgkJCSRjcmVmID0gc2VsZjo6X0dldEludDJkKCRyZWNvcmREYXRhLCAxOSk7DQoJCQkkb2Zmc2V0ICs9IDI7DQoNCgkJCSRvZmZzZXQgKz0gNjsNCg0KCQkJLy8gb2Zmc2V0OiAyNzsgc2l6ZTogOCAqICRjcmVmOyBsaXN0IG9mIGNlbGwgcmFuZ2VzIChsaWtlIGluIGh5cGVybGluayByZWNvcmQpDQoJCQkkY2VsbFJhbmdlcyA9IGFycmF5KCk7DQoJCQlmb3IgKCRpID0gMDsgJGkgPCAkY3JlZjsgKyskaSkgew0KCQkJCXRyeSB7DQoJCQkJCSRjZWxsUmFuZ2UgPSAkdGhpcy0+X3JlYWRCSUZGOENlbGxSYW5nZUFkZHJlc3NGaXhlZChzdWJzdHIoJHJlY29yZERhdGEsIDI3ICsgOCAqICRpLCA4KSk7DQoJCQkJfSBjYXRjaCAoRXhjZXB0aW9uICRlKSB7DQoJCQkJCXJldHVybjsNCgkJCQl9DQoJCQkJJGNlbGxSYW5nZXNbXSA9ICRjZWxsUmFuZ2U7DQoJCQkJJG9mZnNldCArPSA4Ow0KCQkJfQ0KDQoJCQkvLyBvZmZzZXQ6IHZhcjsgc2l6ZTogdmFyOyB2YXJpYWJsZSBsZW5ndGggb2YgZmVhdHVyZSBzcGVjaWZpYyBkYXRhDQoJCQkkcmdiRmVhdCA9IHN1YnN0cigkcmVjb3JkRGF0YSwgJG9mZnNldCk7DQoJCQkkb2Zmc2V0ICs9IDQ7DQoNCgkJCS8vIG9mZnNldDogdmFyOyBzaXplOiA0OyB0aGUgZW5jcnlwdGVkIHBhc3N3b3JkIChvbmx5IDE2LWJpdCBhbHRob3VnaCBmaWVsZCBpcyAzMi1iaXQpDQoJCQkkd1Bhc3N3b3JkID0gc2VsZjo6X0dldEludDRkKCRyZWNvcmREYXRhLCAkb2Zmc2V0KTsNCgkJCSRvZmZzZXQgKz0gNDsNCg0KCQkJLy8gQXBwbHkgcmFuZ2UgcHJvdGVjdGlvbiB0byBzaGVldA0KCQkJaWYgKCRjZWxsUmFuZ2VzKSB7DQoJCQkJJHRoaXMtPl9waHBTaGVldC0+cHJvdGVjdENlbGxzKGltcGxvZGUoJyAnLCAkY2VsbFJhbmdlcyksIHN0cnRvdXBwZXIoZGVjaGV4KCR3UGFzc3dvcmQpKSwgdHJ1ZSk7DQoJCQl9DQoJCX0NCgl9DQoNCg0KCS8qKg0KCSAqIFJlYWQgSU1EQVRBIHJlY29yZA0KCSAqLw0KCXByaXZhdGUgZnVuY3Rpb24gX3JlYWRJbURhdGEoKQ0KCXsNCgkJJGxlbmd0aCA9IHNlbGY6Ol9HZXRJbnQyZCgkdGhpcy0+X2RhdGEsICR0aGlzLT5fcG9zICsgMik7DQoNCgkJLy8gZ2V0IHNwbGljZWQgcmVjb3JkIGRhdGENCgkJJHNwbGljZWRSZWNvcmREYXRhID0gJHRoaXMtPl9nZXRTcGxpY2VkUmVjb3JkRGF0YSgpOw0KCQkkcmVjb3JkRGF0YSA9ICRzcGxpY2VkUmVjb3JkRGF0YVsncmVjb3JkRGF0YSddOw0KDQoJCS8vIFVOREVSIENPTlNUUlVDVElPTg0KDQoJCS8vIG9mZnNldDogMDsgc2l6ZTogMjsgaW1hZ2UgZm9ybWF0DQoJCSRjZiA9IHNlbGY6Ol9HZXRJbnQyZCgkcmVjb3JkRGF0YSwgMCk7DQoNCgkJLy8gb2Zmc2V0OiAyOyBzaXplOiAyOyBlbnZpcm9ubWVudCBmcm9tIHdoaWNoIHRoZSBmaWxlIHdhcyB3cml0dGVuDQoJCSRlbnYgPSBzZWxmOjpfR2V0SW50MmQoJHJlY29yZERhdGEsIDIpOw0KDQoJCS8vIG9mZnNldDogNDsgc2l6ZTogNDsgbGVuZ3RoIG9mIHRoZSBpbWFnZSBkYXRhDQoJCSRsY2IgPSBzZWxmOjpfR2V0SW50NGQoJHJlY29yZERhdGEsIDQpOw0KDQoJCS8vIG9mZnNldDogODsgc2l6ZTogdmFyOyBpbWFnZSBkYXRhDQoJCSRpRGF0YSA9IHN1YnN0cigkcmVjb3JkRGF0YSwgOCk7DQoNCgkJc3dpdGNoICgkY2YpIHsNCgkJY2FzZSAweDA5OiAvLyBXaW5kb3dzIGJpdG1hcCBmb3JtYXQNCgkJCS8vIEJJVE1BUENPUkVJTkZPDQoJCQkvLyAxLiBCSVRNQVBDT1JFSEVBREVSDQoJCQkvLyBvZmZzZXQ6IDA7IHNpemU6IDQ7IGJjU2l6ZSwgU3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVxdWlyZWQgYnkgdGhlIHN0cnVjdHVyZQ0KCQkJJGJjU2l6ZSA9IHNlbGY6Ol9HZXRJbnQ0ZCgkaURhdGEsIDApOw0KLy8JCQl2YXJfZHVtcCgkYmNTaXplKTsNCg0KCQkJLy8gb2Zmc2V0OiA0OyBzaXplOiAyOyBiY1dpZHRoLCBzcGVjaWZpZXMgdGhlIHdpZHRoIG9mIHRoZSBiaXRtYXAsIGluIHBpeGVscw0KCQkJJGJjV2lkdGggPSBzZWxmOjpfR2V0SW50MmQoJGlEYXRhLCA0KTsNCi8vCQkJdmFyX2R1bXAoJGJjV2lkdGgpOw0KDQoJCQkvLyBvZmZzZXQ6IDY7IHNpemU6IDI7IGJjSGVpZ2h0LCBzcGVjaWZpZXMgdGhlIGhlaWdodCBvZiB0aGUgYml0bWFwLCBpbiBwaXhlbHMuDQoJCQkkYmNIZWlnaHQgPSBzZWxmOjpfR2V0SW50MmQoJGlEYXRhLCA2KTsNCi8vCQkJdmFyX2R1bXAoJGJjSGVpZ2h0KTsNCgkJCSRpaCA9IGltYWdlY3JlYXRldHJ1ZWNvbG9yKCRiY1dpZHRoLCAkYmNIZWlnaHQpOw0KDQoJCQkvLyBvZmZzZXQ6IDg7IHNpemU6IDI7IGJjUGxhbmVzLCBzcGVjaWZpZXMgdGhlIG51bWJlciBvZiBwbGFuZXMgZm9yIHRoZSB0YXJnZXQgZGV2aWNlLiBUaGlzIHZhbHVlIG11c3QgYmUgMQ0KDQoJCQkvLyBvZmZzZXQ6IDEwOyBzaXplOiAyOyBiY0JpdENvdW50IHNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIGJpdHMtcGVyLXBpeGVsLiBUaGlzIHZhbHVlIG11c3QgYmUgMSwgNCwgOCwgb3IgMjQNCgkJCSRiY0JpdENvdW50ID0gc2VsZjo6X0dldEludDJkKCRpRGF0YSwgMTApOw0KLy8JCQl2YXJfZHVtcCgkYmNCaXRDb3VudCk7DQoNCgkJCSRyZ2JTdHJpbmcgPSBzdWJzdHIoJGlEYXRhLCAxMik7DQoJCQkkcmdiVHJpcGxlcyA9IGFycmF5KCk7DQoJCQl3aGlsZSAoc3RybGVuKCRyZ2JTdHJpbmcpID4gMCkgew0KCQkJCSRyZ2JUcmlwbGVzW10gPSB1bnBhY2soJ0NiL0NnL0NyJywgJHJnYlN0cmluZyk7DQoJCQkJJHJnYlN0cmluZyA9IHN1YnN0cigkcmdiU3RyaW5nLCAzKTsNCgkJCX0NCgkJCSR4ID0gMDsNCgkJCSR5ID0gMDsNCgkJCWZvcmVhY2ggKCRyZ2JUcmlwbGVzIGFzICRpID0+ICRyZ2JUcmlwbGUpIHsNCgkJCQkkY29sb3IgPSBpbWFnZWNvbG9yYWxsb2NhdGUoJGloLCAkcmdiVHJpcGxlWydyJ10sICRyZ2JUcmlwbGVbJ2cnXSwgJHJnYlRyaXBsZVsnYiddKTsNCgkJCQlpbWFnZXNldHBpeGVsKCRpaCwgJHgsICRiY0hlaWdodCAtIDEgLSAkeSwgJGNvbG9yKTsNCgkJCQkkeCA9ICgkeCArIDEpICUgJGJjV2lkdGg7DQoJCQkJJHkgPSAkeSArIGZsb29yKCgkeCArIDEpIC8gJGJjV2lkdGgpOw0KCQkJfQ0KCQkJLy9pbWFnZXBuZygkaWgsICdpbWFnZS5wbmcnKTsNCg0KCQkJJGRyYXdpbmcgPSBuZXcgUEhQRXhjZWxfV29ya3NoZWV0X0RyYXdpbmcoKTsNCgkJCSRkcmF3aW5nLT5zZXRQYXRoKCRmaWxlbmFtZSk7DQoJCQkkZHJhd2luZy0+c2V0V29ya3NoZWV0KCR0aGlzLT5fcGhwU2hlZXQpOw0KDQoJCQlicmVhazsNCg0KCQljYXNlIDB4MDI6IC8vIFdpbmRvd3MgbWV0YWZpbGUgb3IgTWFjaW50b3NoIFBJQ1QgZm9ybWF0DQoJCWNhc2UgMHgwZTogLy8gbmF0aXZlIGZvcm1hdA0KCQlkZWZhdWx0Ow0KCQkJYnJlYWs7DQoNCgkJfQ0KDQoJCS8vIF9nZXRTcGxpY2VkUmVjb3JkRGF0YSgpIHRha2VzIGNhcmUgb2YgbW92aW5nIGN1cnJlbnQgcG9zaXRpb24gaW4gZGF0YSBzdHJlYW0NCgl9DQoNCg0KCS8qKg0KCSAqIFJlYWQgYSBmcmVlIENPTlRJTlVFIHJlY29yZC4gRnJlZSBDT05USU5VRSByZWNvcmQgbWF5IGJlIGEgY2Ftb3VmbGFnZWQgTVNPRFJBV0lORyByZWNvcmQNCgkgKiBXaGVuIE1TT0RSQVdJTkcgZGF0YSBvbiBhIHNoZWV0IGV4Y2VlZHMgODIyNCBieXRlcywgQ09OVElOVUUgcmVjb3JkcyBhcmUgdXNlZCBpbnN0ZWFkLiBVbmRvY3VtZW50ZWQuDQoJICogSW4gdGhpcyBjYXNlLCB3ZSBtdXN0IHRyZWF0IHRoZSBDT05USU5VRSByZWNvcmQgYXMgYSBNU09EUkFXSU5HIHJlY29yZA0KCSAqLw0KCXByaXZhdGUgZnVuY3Rpb24gX3JlYWRDb250aW51ZSgpDQoJew0KCQkkbGVuZ3RoID0gc2VsZjo6X0dldEludDJkKCR0aGlzLT5fZGF0YSwgJHRoaXMtPl9wb3MgKyAyKTsNCgkJJHJlY29yZERhdGEgPSBzdWJzdHIoJHRoaXMtPl9kYXRhLCAkdGhpcy0+X3BvcyArIDQsICRsZW5ndGgpOw0KDQoJCS8vIGNoZWNrIGlmIHdlIGFyZSByZWFkaW5nIGRyYXdpbmcgZGF0YQ0KCQkvLyB0aGlzIGlzIGluIGNhc2UgYSBmcmVlIENPTlRJTlVFIHJlY29yZCBvY2N1cnMgaW4gb3RoZXIgY2lyY3Vtc3RhbmNlcyB3ZSBhcmUgdW5hd2FyZSBvZg0KCQlpZiAoJHRoaXMtPl9kcmF3aW5nRGF0YSA9PSAnJykgew0KCQkJLy8gbW92ZSBzdHJlYW0gcG9pbnRlciB0byBuZXh0IHJlY29yZA0KCQkJJHRoaXMtPl9wb3MgKz0gNCArICRsZW5ndGg7DQoNCgkJCXJldHVybjsNCgkJfQ0KDQoJCS8vIGNoZWNrIGlmIHJlY29yZCBkYXRhIGlzIGF0IGxlYXN0IDQgYnl0ZXMgbG9uZywgb3RoZXJ3aXNlIHRoZXJlIGlzIG5vIGNoYW5jZSB0aGlzIGlzIE1TT0RSQVdJTkcgZGF0YQ0KCQlpZiAoJGxlbmd0aCA8IDQpIHsNCgkJCS8vIG1vdmUgc3RyZWFtIHBvaW50ZXIgdG8gbmV4dCByZWNvcmQNCgkJCSR0aGlzLT5fcG9zICs9IDQgKyAkbGVuZ3RoOw0KDQoJCQlyZXR1cm47DQoJCX0NCg0KCQkvLyBkaXJ0eSBjaGVjayB0byBzZWUgaWYgQ09OVElOVUUgcmVjb3JkIGNvdWxkIGJlIGEgY2Ftb3VmbGFnZWQgTVNPRFJBV0lORyByZWNvcmQNCgkJLy8gbG9vayBpbnNpZGUgQ09OVElOVUUgcmVjb3JkIHRvIHNlZSBpZiBpdCBsb29rcyBsaWtlIGEgcGFydCBvZiBhbiBFc2NoZXIgc3RyZWFtDQoJCS8vIHdlIGtub3cgdGhhdCBFc2NoZXIgc3RyZWFtIG1heSBiZSBzcGxpdCBhdCBsZWFzdCBhdA0KCQkvLwkJMHhGMDAzIE1zb2ZidFNwZ3JDb250YWluZXINCgkJLy8JCTB4RjAwNCBNc29mYnRTcENvbnRhaW5lcg0KCQkvLwkJMHhGMDBEIE1zb2ZidENsaWVudFRleHRib3gNCgkJJHZhbGlkU3BsaXRQb2ludHMgPSBhcnJheSgweEYwMDMsIDB4RjAwNCwgMHhGMDBEKTsgLy8gYWRkIGlkZW50aWZpZXJzIGlmIHdlIGZpbmQgbW9yZQ0KDQoJCSRzcGxpdFBvaW50ID0gc2VsZjo6X0dldEludDJkKCRyZWNvcmREYXRhLCAyKTsNCgkJaWYgKGluX2FycmF5KCRzcGxpdFBvaW50LCAkdmFsaWRTcGxpdFBvaW50cykpIHsNCgkJCS8vIGdldCBzcGxpY2VkIHJlY29yZCBkYXRhIChhbmQgbW92ZSBwb2ludGVyIHRvIG5leHQgcmVjb3JkKQ0KCQkJJHNwbGljZWRSZWNvcmREYXRhID0gJHRoaXMtPl9nZXRTcGxpY2VkUmVjb3JkRGF0YSgpOw0KCQkJJHRoaXMtPl9kcmF3aW5nRGF0YSAuPSAkc3BsaWNlZFJlY29yZERhdGFbJ3JlY29yZERhdGEnXTsNCg0KCQkJcmV0dXJuOw0KCQl9DQoNCgkJLy8gbW92ZSBzdHJlYW0gcG9pbnRlciB0byBuZXh0IHJlY29yZA0KCQkkdGhpcy0+X3BvcyArPSA0ICsgJGxlbmd0aDsNCg0KCX0NCg0KDQoJLyoqDQoJICogUmVhZHMgYSByZWNvcmQgZnJvbSBjdXJyZW50IHBvc2l0aW9uIGluIGRhdGEgc3RyZWFtIGFuZCBjb250aW51ZXMgcmVhZGluZyBkYXRhIGFzIGxvbmcgYXMgQ09OVElOVUUNCgkgKiByZWNvcmRzIGFyZSBmb3VuZC4gU3BsaWNlcyB0aGUgcmVjb3JkIGRhdGEgcGllY2VzIGFuZCByZXR1cm5zIHRoZSBjb21iaW5lZCBzdHJpbmcgYXMgaWYgcmVjb3JkIGRhdGENCgkgKiBpcyBpbiBvbmUgcGllY2UuDQoJICogTW92ZXMgdG8gbmV4dCBjdXJyZW50IHBvc2l0aW9uIGluIGRhdGEgc3RyZWFtIHRvIHN0YXJ0IG9mIG5leHQgcmVjb3JkIGRpZmZlcmVudCBmcm9tIGEgQ09OdElOVUUgcmVjb3JkDQoJICoNCgkgKiBAcmV0dXJuIGFycmF5DQoJICovDQoJcHJpdmF0ZSBmdW5jdGlvbiBfZ2V0U3BsaWNlZFJlY29yZERhdGEoKQ0KCXsNCgkJJGRhdGEgPSAnJzsNCgkJJHNwbGljZU9mZnNldHMgPSBhcnJheSgpOw0KDQoJCSRpID0gMDsNCgkJJHNwbGljZU9mZnNldHNbMF0gPSAwOw0KDQoJCWRvIHsNCgkJCSsrJGk7DQoNCgkJCS8vIG9mZnNldDogMDsgc2l6ZTogMjsgaWRlbnRpZmllcg0KCQkJJGlkZW50aWZpZXIgPSBzZWxmOjpfR2V0SW50MmQoJHRoaXMtPl9kYXRhLCAkdGhpcy0+X3Bvcyk7DQoJCQkvLyBvZmZzZXQ6IDI7IHNpemU6IDI7IGxlbmd0aA0KCQkJJGxlbmd0aCA9IHNlbGY6Ol9HZXRJbnQyZCgkdGhpcy0+X2RhdGEsICR0aGlzLT5fcG9zICsgMik7DQoJCQkkZGF0YSAuPSBzdWJzdHIoJHRoaXMtPl9kYXRhLCAkdGhpcy0+X3BvcyArIDQsICRsZW5ndGgpOw0KDQoJCQkkc3BsaWNlT2Zmc2V0c1skaV0gPSAkc3BsaWNlT2Zmc2V0c1skaSAtIDFdICsgJGxlbmd0aDsNCg0KCQkJJHRoaXMtPl9wb3MgKz0gNCArICRsZW5ndGg7DQoJCQkkbmV4dElkZW50aWZpZXIgPSBzZWxmOjpfR2V0SW50MmQoJHRoaXMtPl9kYXRhLCAkdGhpcy0+X3Bvcyk7DQoJCX0NCgkJd2hpbGUgKCRuZXh0SWRlbnRpZmllciA9PSBzZWxmOjpYTFNfVHlwZV9DT05USU5VRSk7DQoNCgkJJHNwbGljZWREYXRhID0gYXJyYXkoDQoJCQkncmVjb3JkRGF0YScgPT4gJGRhdGEsDQoJCQknc3BsaWNlT2Zmc2V0cycgPT4gJHNwbGljZU9mZnNldHMsDQoJCSk7DQoNCgkJcmV0dXJuICRzcGxpY2VkRGF0YTsNCg0KCX0NCg0KDQoJLyoqDQoJICogQ29udmVydCBmb3JtdWxhIHN0cnVjdHVyZSBpbnRvIGh1bWFuIHJlYWRhYmxlIEV4Y2VsIGZvcm11bGEgbGlrZSAnQTMrQTUqNScNCgkgKg0KCSAqIEBwYXJhbSBzdHJpbmcgJGZvcm11bGFTdHJ1Y3R1cmUgVGhlIGNvbXBsZXRlIGJpbmFyeSBkYXRhIGZvciB0aGUgZm9ybXVsYQ0KCSAqIEBwYXJhbSBzdHJpbmcgJGJhc2VDZWxsIEJhc2UgY2VsbCwgb25seSBuZWVkZWQgd2hlbiBmb3JtdWxhIGNvbnRhaW5zIHRSZWZOIHRva2VucywgZS5nLiB3aXRoIHNoYXJlZCBmb3JtdWxhcw0KCSAqIEByZXR1cm4gc3RyaW5nIEh1bWFuIHJlYWRhYmxlIGZvcm11bGENCgkgKi8NCglwcml2YXRlIGZ1bmN0aW9uIF9nZXRGb3JtdWxhRnJvbVN0cnVjdHVyZSgkZm9ybXVsYVN0cnVjdHVyZSwgJGJhc2VDZWxsID0gJ0ExJykNCgl7DQoJCS8vIG9mZnNldDogMDsgc2l6ZTogMjsgc2l6ZSBvZiB0aGUgZm9sbG93aW5nIGZvcm11bGEgZGF0YQ0KCQkkc3ogPSBzZWxmOjpfR2V0SW50MmQoJGZvcm11bGFTdHJ1Y3R1cmUsIDApOw0KDQoJCS8vIG9mZnNldDogMjsgc2l6ZTogc3oNCgkJJGZvcm11bGFEYXRhID0gc3Vic3RyKCRmb3JtdWxhU3RydWN0dXJlLCAyLCAkc3opOw0KDQoJCS8vIGZvciBkZWJ1ZzogZHVtcCB0aGUgZm9ybXVsYSBkYXRhDQoJCS8vZWNobyAnPHhtcD4nOw0KCQkvL2VjaG8gJ3NpemU6ICcgLiAkc3ogLiAiXG4iOw0KCQkvL2VjaG8gJ3RoZSBlbnRpcmUgZm9ybXVsYSBkYXRhOiAnOw0KCQkvL0RlYnVnOjpkdW1wKCRmb3JtdWxhRGF0YSk7DQoJCS8vZWNobyAiXG4tLS0tXG4iOw0KDQoJCS8vIG9mZnNldDogMiArIHN6OyBzaXplOiB2YXJpYWJsZSAob3B0aW9uYWwpDQoJCWlmIChzdHJsZW4oJGZvcm11bGFTdHJ1Y3R1cmUpID4gMiArICRzeikgew0KCQkJJGFkZGl0aW9uYWxEYXRhID0gc3Vic3RyKCRmb3JtdWxhU3RydWN0dXJlLCAyICsgJHN6KTsNCg0KCQkJLy8gZm9yIGRlYnVnOiBkdW1wIHRoZSBhZGRpdGlvbmFsIGRhdGENCgkJCS8vZWNobyAndGhlIGVudGlyZSBhZGRpdGlvbmFsIGRhdGE6ICc7DQoJCQkvL0RlYnVnOjpkdW1wKCRhZGRpdGlvbmFsRGF0YSk7DQoJCQkvL2VjaG8gIlxuLS0tLVxuIjsNCg0KCQl9IGVsc2Ugew0KCQkJJGFkZGl0aW9uYWxEYXRhID0gJyc7DQoJCX0NCg0KCQlyZXR1cm4gJHRoaXMtPl9nZXRGb3JtdWxhRnJvbURhdGEoJGZvcm11bGFEYXRhLCAkYWRkaXRpb25hbERhdGEsICRiYXNlQ2VsbCk7DQoJfQ0KDQoNCgkvKioNCgkgKiBUYWtlIGZvcm11bGEgZGF0YSBhbmQgYWRkaXRpb25hbCBkYXRhIGZvciBmb3JtdWxhIGFuZCByZXR1cm4gaHVtYW4gcmVhZGFibGUgZm9ybXVsYQ0KCSAqDQoJICogQHBhcmFtIHN0cmluZyAkZm9ybXVsYURhdGEgVGhlIGJpbmFyeSBkYXRhIGZvciB0aGUgZm9ybXVsYSBpdHNlbGYNCgkgKiBAcGFyYW0gc3RyaW5nICRhZGRpdGlvbmFsRGF0YSBBZGRpdGlvbmFsIGJpbmFyeSBkYXRhIGdvaW5nIHdpdGggdGhlIGZvcm11bGENCgkgKiBAcGFyYW0gc3RyaW5nICRiYXNlQ2VsbCBCYXNlIGNlbGwsIG9ubHkgbmVlZGVkIHdoZW4gZm9ybXVsYSBjb250YWlucyB0UmVmTiB0b2tlbnMsIGUuZy4gd2l0aCBzaGFyZWQgZm9ybXVsYXMNCgkgKiBAcmV0dXJuIHN0cmluZyBIdW1hbiByZWFkYWJsZSBmb3JtdWxhDQoJICovDQoJcHJpdmF0ZSBmdW5jdGlvbiBfZ2V0Rm9ybXVsYUZyb21EYXRhKCRmb3JtdWxhRGF0YSwgICRhZGRpdGlvbmFsRGF0YSA9ICcnLCAkYmFzZUNlbGwgPSAnQTEnKQ0KCXsNCgkJLy8gc3RhcnQgcGFyc2luZyB0aGUgZm9ybXVsYSBkYXRhDQoJCSR0b2tlbnMgPSBhcnJheSgpOw0KDQoJCXdoaWxlIChzdHJsZW4oJGZvcm11bGFEYXRhKSA+IDAgYW5kICR0b2tlbiA9ICR0aGlzLT5fZ2V0TmV4dFRva2VuKCRmb3JtdWxhRGF0YSwgJGJhc2VDZWxsKSkgew0KCQkJJHRva2Vuc1tdID0gJHRva2VuOw0KCQkJJGZvcm11bGFEYXRhID0gc3Vic3RyKCRmb3JtdWxhRGF0YSwgJHRva2VuWydzaXplJ10pOw0KDQoJCQkvLyBmb3IgZGVidWc6IGR1bXAgdGhlIHRva2VuDQoJCQkvL3Zhcl9kdW1wKCR0b2tlbik7DQoJCX0NCg0KCQkkZm9ybXVsYVN0cmluZyA9ICR0aGlzLT5fY3JlYXRlRm9ybXVsYUZyb21Ub2tlbnMoJHRva2VucywgJGFkZGl0aW9uYWxEYXRhKTsNCg0KCQlyZXR1cm4gJGZvcm11bGFTdHJpbmc7DQoJfQ0KDQoNCgkvKioNCgkgKiBUYWtlIGFycmF5IG9mIHRva2VucyB0b2dldGhlciB3aXRoIGFkZGl0aW9uYWwgZGF0YSBmb3IgZm9ybXVsYSBhbmQgcmV0dXJuIGh1bWFuIHJlYWRhYmxlIGZvcm11bGENCgkgKg0KCSAqIEBwYXJhbSBhcnJheSAkdG9rZW5zDQoJICogQHBhcmFtIGFycmF5ICRhZGRpdGlvbmFsRGF0YSBBZGRpdGlvbmFsIGJpbmFyeSBkYXRhIGdvaW5nIHdpdGggdGhlIGZvcm11bGENCgkgKiBAcGFyYW0gc3RyaW5nICRiYXNlQ2VsbCBCYXNlIGNlbGwsIG9ubHkgbmVlZGVkIHdoZW4gZm9ybXVsYSBjb250YWlucyB0UmVmTiB0b2tlbnMsIGUuZy4gd2l0aCBzaGFyZWQgZm9ybXVsYXMNCgkgKiBAcmV0dXJuIHN0cmluZyBIdW1hbiByZWFkYWJsZSBmb3JtdWxhDQoJICovDQoJcHJpdmF0ZSBmdW5jdGlvbiBfY3JlYXRlRm9ybXVsYUZyb21Ub2tlbnMoJHRva2VucywgJGFkZGl0aW9uYWxEYXRhKQ0KCXsNCgkJLy8gZW1wdHkgZm9ybXVsYT8NCgkJaWYgKGVtcHR5KCR0b2tlbnMpKSB7DQoJCQlyZXR1cm4gJyc7DQoJCX0NCg0KCQkkZm9ybXVsYVN0cmluZ3MgPSBhcnJheSgpOw0KCQlmb3JlYWNoICgkdG9rZW5zIGFzICR0b2tlbikgew0KCQkJLy8gaW5pdGlhbGl6ZSBzcGFjZXMNCgkJCSRzcGFjZTAgPSBpc3NldCgkc3BhY2UwKSA/ICRzcGFjZTAgOiAnJzsgLy8gc3BhY2VzIGJlZm9yZSBuZXh0IHRva2VuLCBub3QgdFBhcmVuDQoJCQkkc3BhY2UxID0gaXNzZXQoJHNwYWNlMSkgPyAkc3BhY2UxIDogJyc7IC8vIGNhcnJpYWdlIHJldHVybnMgYmVmb3JlIG5leHQgdG9rZW4sIG5vdCB0UGFyZW4NCgkJCSRzcGFjZTIgPSBpc3NldCgkc3BhY2UyKSA/ICRzcGFjZTIgOiAnJzsgLy8gc3BhY2VzIGJlZm9yZSBvcGVuaW5nIHBhcmVudGhlc2lzDQoJCQkkc3BhY2UzID0gaXNzZXQoJHNwYWNlMykgPyAkc3BhY2UzIDogJyc7IC8vIGNhcnJpYWdlIHJldHVybnMgYmVmb3JlIG9wZW5pbmcgcGFyZW50aGVzaXMNCgkJCSRzcGFjZTQgPSBpc3NldCgkc3BhY2U0KSA/ICRzcGFjZTQgOiAnJzsgLy8gc3BhY2VzIGJlZm9yZSBjbG9zaW5nIHBhcmVudGhlc2lzDQoJCQkkc3BhY2U1ID0gaXNzZXQoJHNwYWNlNSkgPyAkc3BhY2U1IDogJyc7IC8vIGNhcnJpYWdlIHJldHVybnMgYmVmb3JlIGNsb3NpbmcgcGFyZW50aGVzaXMNCg0KCQkJc3dpdGNoICgkdG9rZW5bJ25hbWUnXSkgew0KCQkJY2FzZSAndEFkZCc6IC8vIGFkZGl0aW9uDQoJCQljYXNlICd0Q29uY2F0JzogLy8gYWRkaXRpb24NCgkJCWNhc2UgJ3REaXYnOiAvLyBkaXZpc2lvbg0KCQkJY2FzZSAndEVRJzogLy8gZXF1YWxpdHkNCgkJCWNhc2UgJ3RHRSc6IC8vIGdyZWF0ZXIgdGhhbiBvciBlcXVhbA0KCQkJY2FzZSAndEdUJzogLy8gZ3JlYXRlciB0aGFuDQoJCQljYXNlICd0SXNlY3QnOiAvLyBpbnRlcnNlY3Rpb24NCgkJCWNhc2UgJ3RMRSc6IC8vIGxlc3MgdGhhbiBvciBlcXVhbA0KCQkJY2FzZSAndExpc3QnOiAvLyBsZXNzIHRoYW4gb3IgZXF1YWwNCgkJCWNhc2UgJ3RMVCc6IC8vIGxlc3MgdGhhbg0KCQkJY2FzZSAndE11bCc6IC8vIG11bHRpcGxpY2F0aW9uDQoJCQljYXNlICd0TkUnOiAvLyBtdWx0aXBsaWNhdGlvbg0KCQkJY2FzZSAndFBvd2VyJzogLy8gcG93ZXINCgkJCWNhc2UgJ3RSYW5nZSc6IC8vIHJhbmdlDQoJCQljYXNlICd0U3ViJzogLy8gc3VidHJhY3Rpb24NCgkJCQkkb3AyID0gYXJyYXlfcG9wKCRmb3JtdWxhU3RyaW5ncyk7DQoJCQkJJG9wMSA9IGFycmF5X3BvcCgkZm9ybXVsYVN0cmluZ3MpOw0KCQkJCSRmb3JtdWxhU3RyaW5nc1tdID0gIiRvcDEkc3BhY2UxJHNwYWNlMHskdG9rZW5bJ2RhdGEnXX0kb3AyIjsNCgkJCQl1bnNldCgkc3BhY2UwLCAkc3BhY2UxKTsNCgkJCQlicmVhazsNCgkJCWNhc2UgJ3RVcGx1cyc6IC8vIHVuYXJ5IHBsdXMNCgkJCWNhc2UgJ3RVbWludXMnOiAvLyB1bmFyeSBtaW51cw0KCQkJCSRvcCA9IGFycmF5X3BvcCgkZm9ybXVsYVN0cmluZ3MpOw0KCQkJCSRmb3JtdWxhU3RyaW5nc1tdID0gIiRzcGFjZTEkc3BhY2UweyR0b2tlblsnZGF0YSddfSRvcCI7DQoJCQkJdW5zZXQoJHNwYWNlMCwgJHNwYWNlMSk7DQoJCQkJYnJlYWs7DQoJCQljYXNlICd0UGVyY2VudCc6IC8vIHBlcmNlbnQgc2lnbg0KCQkJCSRvcCA9IGFycmF5X3BvcCgkZm9ybXVsYVN0cmluZ3MpOw0KCQkJCSRmb3JtdWxhU3RyaW5nc1tdID0gIiRvcCRzcGFjZTEkc3BhY2UweyR0b2tlblsnZGF0YSddfSI7DQoJCQkJdW5zZXQoJHNwYWNlMCwgJHNwYWNlMSk7DQoJCQkJYnJlYWs7DQoJCQljYXNlICd0QXR0clZvbGF0aWxlJzogLy8gaW5kaWNhdGVzIHZvbGF0aWxlIGZ1bmN0aW9uDQoJCQljYXNlICd0QXR0cklmJzoNCgkJCWNhc2UgJ3RBdHRyU2tpcCc6DQoJCQljYXNlICd0QXR0ckNob29zZSc6DQoJCQkJLy8gdG9rZW4gaXMgb25seSBpbXBvcnRhbnQgZm9yIEV4Y2VsIGZvcm11bGEgZXZhbHVhdG9yDQoJCQkJLy8gZG8gbm90aGluZw0KCQkJCWJyZWFrOw0KCQkJY2FzZSAndEF0dHJTcGFjZSc6IC8vIHNwYWNlIC8gY2FycmlhZ2UgcmV0dXJuDQoJCQkJLy8gc3BhY2Ugd2lsbCBiZSB1c2VkIHdoZW4gbmV4dCB0b2tlbiBhcnJpdmVzLCBkbyBub3QgYWx0ZXIgZm9ybXVsYVN0cmluZyBzdGFjaw0KCQkJCXN3aXRjaCAoJHRva2VuWydkYXRhJ11bJ3NwYWNldHlwZSddKSB7DQoJCQkJY2FzZSAndHlwZTAnOg0KCQkJCQkkc3BhY2UwID0gc3RyX3JlcGVhdCgnICcsICR0b2tlblsnZGF0YSddWydzcGFjZWNvdW50J10pOw0KCQkJCQlicmVhazsNCgkJCQljYXNlICd0eXBlMSc6DQoJCQkJCSRzcGFjZTEgPSBzdHJfcmVwZWF0KCJcbiIsICR0b2tlblsnZGF0YSddWydzcGFjZWNvdW50J10pOw0KCQkJCQlicmVhazsNCgkJCQljYXNlICd0eXBlMic6DQoJCQkJCSRzcGFjZTIgPSBzdHJfcmVwZWF0KCcgJywgJHRva2VuWydkYXRhJ11bJ3NwYWNlY291bnQnXSk7DQoJCQkJCWJyZWFrOw0KCQkJCWNhc2UgJ3R5cGUzJzoNCgkJCQkJJHNwYWNlMyA9IHN0cl9yZXBlYXQoIlxuIiwgJHRva2VuWydkYXRhJ11bJ3NwYWNlY291bnQnXSk7DQoJCQkJCWJyZWFrOw0KCQkJCWNhc2UgJ3R5cGU0JzoNCgkJCQkJJHNwYWNlNCA9IHN0cl9yZXBlYXQoJyAnLCAkdG9rZW5bJ2RhdGEnXVsnc3BhY2Vjb3VudCddKTsNCgkJCQkJYnJlYWs7DQoJCQkJY2FzZSAndHlwZTUnOg0KCQkJCQkkc3BhY2U1ID0gc3RyX3JlcGVhdCgiXG4iLCAkdG9rZW5bJ2RhdGEnXVsnc3BhY2Vjb3VudCddKTsNCgkJCQkJYnJlYWs7DQoJCQkJfQ0KCQkJCWJyZWFrOw0KCQkJY2FzZSAndEF0dHJTdW0nOiAvLyBTVU0gZnVuY3Rpb24gd2l0aCBvbmUgcGFyYW1ldGVyDQoJCQkJJG9wID0gYXJyYXlfcG9wKCRmb3JtdWxhU3RyaW5ncyk7DQoJCQkJJGZvcm11bGFTdHJpbmdzW10gPSAieyRzcGFjZTF9eyRzcGFjZTB9U1VNKCRvcCkiOw0KCQkJCXVuc2V0KCRzcGFjZTAsICRzcGFjZTEpOw0KCQkJCWJyZWFrOw0KCQkJY2FzZSAndEZ1bmMnOiAvLyBmdW5jdGlvbiB3aXRoIGZpeGVkIG51bWJlciBvZiBhcmd1bWVudHMNCgkJCWNhc2UgJ3RGdW5jVic6IC8vIGZ1bmN0aW9uIHdpdGggdmFyaWFibGUgbnVtYmVyIG9mIGFyZ3VtZW50cw0KCQkJCWlmICgkdG9rZW5bJ2RhdGEnXVsnZnVuY3Rpb24nXSAhPSAnJykgew0KCQkJCQkvLyBub3JtYWwgZnVuY3Rpb24NCgkJCQkJJG9wcyA9IGFycmF5KCk7IC8vIGFycmF5IG9mIG9wZXJhdG9ycw0KCQkJCQlmb3IgKCRpID0gMDsgJGkgPCAkdG9rZW5bJ2RhdGEnXVsnYXJncyddOyArKyRpKSB7DQoJCQkJCQkkb3BzW10gPSBhcnJheV9wb3AoJGZvcm11bGFTdHJpbmdzKTsNCgkJCQkJfQ0KCQkJCQkkb3BzID0gYXJyYXlfcmV2ZXJzZSgkb3BzKTsNCgkJCQkJJGZvcm11bGFTdHJpbmdzW10gPSAiJHNwYWNlMSRzcGFjZTB7JHRva2VuWydkYXRhJ11bJ2Z1bmN0aW9uJ119KCIgLiBpbXBsb2RlKCcsJywgJG9wcykgLiAiKSI7DQoJCQkJCXVuc2V0KCRzcGFjZTAsICRzcGFjZTEpOw0KCQkJCX0gZWxzZSB7DQoJCQkJCS8vIGFkZC1pbiBmdW5jdGlvbg0KCQkJCQkkb3BzID0gYXJyYXkoKTsgLy8gYXJyYXkgb2Ygb3BlcmF0b3JzDQoJCQkJCWZvciAoJGkgPSAwOyAkaSA8ICR0b2tlblsnZGF0YSddWydhcmdzJ10gLSAxOyArKyRpKSB7DQoJCQkJCQkkb3BzW10gPSBhcnJheV9wb3AoJGZvcm11bGFTdHJpbmdzKTsNCgkJCQkJfQ0KCQkJCQkkb3BzID0gYXJyYXlfcmV2ZXJzZSgkb3BzKTsNCgkJCQkJJGZ1bmN0aW9uID0gYXJyYXlfcG9wKCRmb3JtdWxhU3RyaW5ncyk7DQoJCQkJCSRmb3JtdWxhU3RyaW5nc1tdID0gIiRzcGFjZTEkc3BhY2UwJGZ1bmN0aW9uKCIgLiBpbXBsb2RlKCcsJywgJG9wcykgLiAiKSI7DQoJCQkJCXVuc2V0KCRzcGFjZTAsICRzcGFjZTEpOw0KCQkJCX0NCgkJCQlicmVhazsNCgkJCWNhc2UgJ3RQYXJlbic6IC8vIHBhcmVudGhlc2lzDQoJCQkJJGV4cHJlc3Npb24gPSBhcnJheV9wb3AoJGZvcm11bGFTdHJpbmdzKTsNCgkJCQkkZm9ybXVsYVN0cmluZ3NbXSA9ICIkc3BhY2UzJHNwYWNlMigkZXhwcmVzc2lvbiRzcGFjZTUkc3BhY2U0KSI7DQoJCQkJdW5zZXQoJHNwYWNlMiwgJHNwYWNlMywgJHNwYWNlNCwgJHNwYWNlNSk7DQoJCQkJYnJlYWs7DQoJCQljYXNlICd0QXJyYXknOiAvLyBhcnJheSBjb25zdGFudA0KCQkJCSRjb25zdGFudEFycmF5ID0gc2VsZjo6X3JlYWRCSUZGOENvbnN0YW50QXJyYXkoJGFkZGl0aW9uYWxEYXRhKTsNCgkJCQkkZm9ybXVsYVN0cmluZ3NbXSA9ICRzcGFjZTEgLiAkc3BhY2UwIC4gJGNvbnN0YW50QXJyYXlbJ3ZhbHVlJ107DQoJCQkJJGFkZGl0aW9uYWxEYXRhID0gc3Vic3RyKCRhZGRpdGlvbmFsRGF0YSwgJGNvbnN0YW50QXJyYXlbJ3NpemUnXSk7IC8vIGJpdGUgb2YgY2h1bmsgb2YgYWRkaXRpb25hbCBkYXRhDQoJCQkJdW5zZXQoJHNwYWNlMCwgJHNwYWNlMSk7DQoJCQkJYnJlYWs7DQoJCQljYXNlICd0TWVtQXJlYSc6DQoJCQkJLy8gYml0ZSBvZmYgY2h1bmsgb2YgYWRkaXRpb25hbCBkYXRhDQoJCQkJJGNlbGxSYW5nZUFkZHJlc3NMaXN0ID0gJHRoaXMtPl9yZWFkQklGRjhDZWxsUmFuZ2VBZGRyZXNzTGlzdCgkYWRkaXRpb25hbERhdGEpOw0KCQkJCSRhZGRpdGlvbmFsRGF0YSA9IHN1YnN0cigkYWRkaXRpb25hbERhdGEsICRjZWxsUmFuZ2VBZGRyZXNzTGlzdFsnc2l6ZSddKTsNCgkJCQkkZm9ybXVsYVN0cmluZ3NbXSA9ICIkc3BhY2UxJHNwYWNlMHskdG9rZW5bJ2RhdGEnXX0iOw0KCQkJCXVuc2V0KCRzcGFjZTAsICRzcGFjZTEpOw0KCQkJCWJyZWFrOw0KCQkJY2FzZSAndEFyZWEnOiAvLyBjZWxsIHJhbmdlIGFkZHJlc3MNCgkJCWNhc2UgJ3RCb29sJzogLy8gYm9vbGVhbg0KCQkJY2FzZSAndEVycic6IC8vIGVycm9yIGNvZGUNCgkJCWNhc2UgJ3RJbnQnOiAvLyBpbnRlZ2VyDQoJCQljYXNlICd0TWVtRXJyJzoNCgkJCWNhc2UgJ3RNZW1GdW5jJzoNCgkJCWNhc2UgJ3RNaXNzQXJnJzoNCgkJCWNhc2UgJ3ROYW1lJzoNCgkJCWNhc2UgJ3ROYW1lWCc6DQoJCQljYXNlICd0TnVtJzogLy8gbnVtYmVyDQoJCQljYXNlICd0UmVmJzogLy8gc2luZ2xlIGNlbGwgcmVmZXJlbmNlDQoJCQljYXNlICd0UmVmM2QnOiAvLyAzZCBjZWxsIHJlZmVyZW5jZQ0KCQkJY2FzZSAndEFyZWEzZCc6IC8vIDNkIGNlbGwgcmFuZ2UgcmVmZXJlbmNlDQoJCQljYXNlICd0UmVmTic6DQoJCQljYXNlICd0QXJlYU4nOg0KCQkJY2FzZSAndFN0cic6IC8vIHN0cmluZw0KCQkJCSRmb3JtdWxhU3RyaW5nc1tdID0gIiRzcGFjZTEkc3BhY2UweyR0b2tlblsnZGF0YSddfSI7DQoJCQkJdW5zZXQoJHNwYWNlMCwgJHNwYWNlMSk7DQoJCQkJYnJlYWs7DQoJCQl9DQoJCX0NCgkJJGZvcm11bGFTdHJpbmcgPSAkZm9ybXVsYVN0cmluZ3NbMF07DQoNCgkJLy8gZm9yIGRlYnVnOiBkdW1wIHRoZSBodW1hbiByZWFkYWJsZSBmb3JtdWxhDQoJCS8vZWNobyAnLS0tLScgLiAiXG4iOw0KCQkvL2VjaG8gJ0Zvcm11bGE6ICcgLiAkZm9ybXVsYVN0cmluZzsNCg0KCQlyZXR1cm4gJGZvcm11bGFTdHJpbmc7DQoJfQ0KDQoNCgkvKioNCgkgKiBGZXRjaCBuZXh0IHRva2VuIGZyb20gYmluYXJ5IGZvcm11bGEgZGF0YQ0KCSAqDQoJICogQHBhcmFtIHN0cmluZyBGb3JtdWxhIGRhdGENCgkgKiBAcGFyYW0gc3RyaW5nICRiYXNlQ2VsbCBCYXNlIGNlbGwsIG9ubHkgbmVlZGVkIHdoZW4gZm9ybXVsYSBjb250YWlucyB0UmVmTiB0b2tlbnMsIGUuZy4gd2l0aCBzaGFyZWQgZm9ybXVsYXMNCgkgKiBAcmV0dXJuIGFycmF5DQoJICogQHRocm93cyBFeGNlcHRpb24NCgkgKi8NCglwcml2YXRlIGZ1bmN0aW9uIF9nZXROZXh0VG9rZW4oJGZvcm11bGFEYXRhLCAkYmFzZUNlbGwgPSAnQTEnKQ0KCXsNCgkJLy8gb2Zmc2V0OiAwOyBzaXplOiAxOyB0b2tlbiBpZA0KCQkkaWQgPSBvcmQoJGZvcm11bGFEYXRhWzBdKTsgLy8gdG9rZW4gaWQNCgkJJG5hbWUgPSBmYWxzZTsgLy8gaW5pdGlhbGl6ZSB0b2tlbiBuYW1lDQoNCgkJc3dpdGNoICgkaWQpIHsNCgkJY2FzZSAweDAzOiAkbmFtZSA9ICd0QWRkJzsJCSRzaXplID0gMTsJJGRhdGEgPSAnKyc7CWJyZWFrOw0KCQljYXNlIDB4MDQ6ICRuYW1lID0gJ3RTdWInOwkJJHNpemUgPSAxOwkkZGF0YSA9ICctJzsJYnJlYWs7DQoJCWNhc2UgMHgwNTogJG5hbWUgPSAndE11bCc7CQkkc2l6ZSA9IDE7CSRkYXRhID0gJyonOwlicmVhazsNCgkJY2FzZSAweDA2OiAkbmFtZSA9ICd0RGl2JzsJCSRzaXplID0gMTsJJGRhdGEgPSAnLyc7CWJyZWFrOw0KCQljYXNlIDB4MDc6ICRuYW1lID0gJ3RQb3dlcic7CSRzaXplID0gMTsJJGRhdGEgPSAnXic7CWJyZWFrOw0KCQljYXNlIDB4MDg6ICRuYW1lID0gJ3RDb25jYXQnOwkkc2l6ZSA9IDE7CSRkYXRhID0gJyYnOwlicmVhazsNCgkJY2FzZSAweDA5OiAkbmFtZSA9ICd0TFQnOwkJJHNpemUgPSAxOwkkZGF0YSA9ICc8JzsJYnJlYWs7DQoJCWNhc2UgMHgwQTogJG5hbWUgPSAndExFJzsJCSRzaXplID0gMTsJJGRhdGEgPSAnPD0nOwlicmVhazsNCgkJY2FzZSAweDBCOiAkbmFtZSA9ICd0RVEnOwkJJHNpemUgPSAxOwkkZGF0YSA9ICc9JzsJYnJlYWs7DQoJCWNhc2UgMHgwQzogJG5hbWUgPSAndEdFJzsJCSRzaXplID0gMTsJJGRhdGEgPSAnPj0nOwlicmVhazsNCgkJY2FzZSAweDBEOiAkbmFtZSA9ICd0R1QnOwkJJHNpemUgPSAxOwkkZGF0YSA9ICc+JzsJYnJlYWs7DQoJCWNhc2UgMHgwRTogJG5hbWUgPSAndE5FJzsJCSRzaXplID0gMTsJJGRhdGEgPSAnPD4nOwlicmVhazsNCgkJY2FzZSAweDBGOiAkbmFtZSA9ICd0SXNlY3QnOwkkc2l6ZSA9IDE7CSRkYXRhID0gJyAnOwlicmVhazsNCgkJY2FzZSAweDEwOiAkbmFtZSA9ICd0TGlzdCc7CQkkc2l6ZSA9IDE7CSRkYXRhID0gJywnOwlicmVhazsNCgkJY2FzZSAweDExOiAkbmFtZSA9ICd0UmFuZ2UnOwkkc2l6ZSA9IDE7CSRkYXRhID0gJzonOwlicmVhazsNCgkJY2FzZSAweDEyOiAkbmFtZSA9ICd0VXBsdXMnOwkkc2l6ZSA9IDE7CSRkYXRhID0gJysnOwlicmVhazsNCgkJY2FzZSAweDEzOiAkbmFtZSA9ICd0VW1pbnVzJzsJJHNpemUgPSAxOwkkZGF0YSA9ICctJzsJYnJlYWs7DQoJCWNhc2UgMHgxNDogJG5hbWUgPSAndFBlcmNlbnQnOwkkc2l6ZSA9IDE7CSRkYXRhID0gJyUnOwlicmVhazsNCgkJY2FzZSAweDE1OgkvLwlwYXJlbnRoZXNpcw0KCQkJJG5hbWUgID0gJ3RQYXJlbic7DQoJCQkkc2l6ZSAgPSAxOw0KCQkJJGRhdGEgPSBudWxsOw0KCQkJYnJlYWs7DQoJCWNhc2UgMHgxNjoJLy8JbWlzc2luZyBhcmd1bWVudA0KCQkJJG5hbWUgPSAndE1pc3NBcmcnOw0KCQkJJHNpemUgPSAxOw0KCQkJJGRhdGEgPSAnJzsNCgkJCWJyZWFrOw0KCQljYXNlIDB4MTc6CS8vCXN0cmluZw0KCQkJJG5hbWUgPSAndFN0cic7DQoJCQkvLyBvZmZzZXQ6IDE7IHNpemU6IHZhcjsgVW5pY29kZSBzdHJpbmcsIDgtYml0IHN0cmluZyBsZW5ndGgNCgkJCSRzdHJpbmcgPSBzZWxmOjpfcmVhZFVuaWNvZGVTdHJpbmdTaG9ydChzdWJzdHIoJGZvcm11bGFEYXRhLCAxKSk7DQoJCQkkc2l6ZSA9IDEgKyAkc3RyaW5nWydzaXplJ107DQoJCQkkZGF0YSA9IHNlbGY6Ol9VVEY4dG9FeGNlbERvdWJsZVF1b3RlZCgkc3RyaW5nWyd2YWx1ZSddKTsNCgkJCWJyZWFrOw0KCQljYXNlIDB4MTk6CS8vCVNwZWNpYWwgYXR0cmlidXRlDQoJCQkvLyBvZmZzZXQ6IDE7IHNpemU6IDE7IGF0dHJpYnV0ZSB0eXBlIGZsYWdzOg0KCQkJc3dpdGNoIChvcmQoJGZvcm11bGFEYXRhWzFdKSkgew0KCQkJY2FzZSAweDAxOg0KCQkJCSRuYW1lID0gJ3RBdHRyVm9sYXRpbGUnOw0KCQkJCSRzaXplID0gNDsNCgkJCQkkZGF0YSA9IG51bGw7DQoJCQkJYnJlYWs7DQoJCQljYXNlIDB4MDI6DQoJCQkJJG5hbWUgPSAndEF0dHJJZic7DQoJCQkJJHNpemUgPSA0Ow0KCQkJCSRkYXRhID0gbnVsbDsNCgkJCQlicmVhazsNCgkJCWNhc2UgMHgwNDoNCgkJCQkkbmFtZSA9ICd0QXR0ckNob29zZSc7DQoJCQkJLy8gb2Zmc2V0OiAyOyBzaXplOiAyOyBudW1iZXIgb2YgY2hvaWNlcyBpbiB0aGUgQ0hPT1NFIGZ1bmN0aW9uICgkbmMsIG51bWJlciBvZiBwYXJhbWV0ZXJzIGRlY3JlYXNlZCBieSAxKQ0KCQkJCSRuYyA9IHNlbGY6Ol9HZXRJbnQyZCgkZm9ybXVsYURhdGEsIDIpOw0KCQkJCS8vIG9mZnNldDogNDsgc2l6ZTogMiAqICRuYw0KCQkJCS8vIG9mZnNldDogNCArIDIgKiAkbmM7IHNpemU6IDINCgkJCQkkc2l6ZSA9IDIgKiAkbmMgKyA2Ow0KCQkJCSRkYXRhID0gbnVsbDsNCgkJCQlicmVhazsNCgkJCWNhc2UgMHgwODoNCgkJCQkkbmFtZSA9ICd0QXR0clNraXAnOw0KCQkJCSRzaXplID0gNDsNCgkJCQkkZGF0YSA9IG51bGw7DQoJCQkJYnJlYWs7DQoJCQljYXNlIDB4MTA6DQoJCQkJJG5hbWUgPSAndEF0dHJTdW0nOw0KCQkJCSRzaXplID0gNDsNCgkJCQkkZGF0YSA9IG51bGw7DQoJCQkJYnJlYWs7DQoJCQljYXNlIDB4NDA6DQoJCQljYXNlIDB4NDE6DQoJCQkJJG5hbWUgPSAndEF0dHJTcGFjZSc7DQoJCQkJJHNpemUgPSA0Ow0KCQkJCS8vIG9mZnNldDogMjsgc2l6ZTogMjsgc3BhY2UgdHlwZSBhbmQgcG9zaXRpb24NCgkJCQlzd2l0Y2ggKG9yZCgkZm9ybXVsYURhdGFbMl0pKSB7DQoJCQkJY2FzZSAweDAwOg0KCQkJCQkkc3BhY2V0eXBlID0gJ3R5cGUwJzsNCgkJCQkJYnJlYWs7DQoJCQkJY2FzZSAweDAxOg0KCQkJCQkkc3BhY2V0eXBlID0gJ3R5cGUxJzsNCgkJCQkJYnJlYWs7DQoJCQkJY2FzZSAweDAyOg0KCQkJCQkkc3BhY2V0eXBlID0gJ3R5cGUyJzsNCgkJCQkJYnJlYWs7DQoJCQkJY2FzZSAweDAzOg0KCQkJCQkkc3BhY2V0eXBlID0gJ3R5cGUzJzsNCgkJCQkJYnJlYWs7DQoJCQkJY2FzZSAweDA0Og0KCQkJCQkkc3BhY2V0eXBlID0gJ3R5cGU0JzsNCgkJCQkJYnJlYWs7DQoJCQkJY2FzZSAweDA1Og0KCQkJCQkkc3BhY2V0eXBlID0gJ3R5cGU1JzsNCgkJCQkJYnJlYWs7DQoJCQkJZGVmYXVsdDoNCgkJCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbignVW5yZWNvZ25pemVkIHNwYWNlIHR5cGUgaW4gdEF0dHJTcGFjZSB0b2tlbicpOw0KCQkJCQlicmVhazsNCgkJCQl9DQoJCQkJLy8gb2Zmc2V0OiAzOyBzaXplOiAxOyBudW1iZXIgb2YgaW5zZXJ0ZWQgc3BhY2VzL2NhcnJpYWdlIHJldHVybnMNCgkJCQkkc3BhY2Vjb3VudCA9IG9yZCgkZm9ybXVsYURhdGFbM10pOw0KDQoJCQkJJGRhdGEgPSBhcnJheSgnc3BhY2V0eXBlJyA9PiAkc3BhY2V0eXBlLCAnc3BhY2Vjb3VudCcgPT4gJHNwYWNlY291bnQpOw0KCQkJCWJyZWFrOw0KCQkJZGVmYXVsdDoNCgkJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCdVbnJlY29nbml6ZWQgYXR0cmlidXRlIGZsYWcgaW4gdEF0dHIgdG9rZW4nKTsNCgkJCQlicmVhazsNCgkJCX0NCgkJCWJyZWFrOw0KCQljYXNlIDB4MUM6CS8vCWVycm9yIGNvZGUNCgkJCS8vIG9mZnNldDogMTsgc2l6ZTogMTsgZXJyb3IgY29kZQ0KCQkJJG5hbWUgPSAndEVycic7DQoJCQkkc2l6ZSA9IDI7DQoJCQkkZGF0YSA9IHNlbGY6Ol9tYXBFcnJvckNvZGUob3JkKCRmb3JtdWxhRGF0YVsxXSkpOw0KCQkJYnJlYWs7DQoJCWNhc2UgMHgxRDoJLy8JYm9vbGVhbg0KCQkJLy8gb2Zmc2V0OiAxOyBzaXplOiAxOyAwID0gZmFsc2UsIDEgPSB0cnVlOw0KCQkJJG5hbWUgPSAndEJvb2wnOw0KCQkJJHNpemUgPSAyOw0KCQkJJGRhdGEgPSBvcmQoJGZvcm11bGFEYXRhWzFdKSA/ICdUUlVFJyA6ICdGQUxTRSc7DQoJCQlicmVhazsNCgkJY2FzZSAweDFFOgkvLwlpbnRlZ2VyDQoJCQkvLyBvZmZzZXQ6IDE7IHNpemU6IDI7IHVuc2lnbmVkIDE2LWJpdCBpbnRlZ2VyDQoJCQkkbmFtZSA9ICd0SW50JzsNCgkJCSRzaXplID0gMzsNCgkJCSRkYXRhID0gc2VsZjo6X0dldEludDJkKCRmb3JtdWxhRGF0YSwgMSk7DQoJCQlicmVhazsNCgkJY2FzZSAweDFGOgkvLwludW1iZXINCgkJCS8vIG9mZnNldDogMTsgc2l6ZTogODsNCgkJCSRuYW1lID0gJ3ROdW0nOw0KCQkJJHNpemUgPSA5Ow0KCQkJJGRhdGEgPSBzZWxmOjpfZXh0cmFjdE51bWJlcihzdWJzdHIoJGZvcm11bGFEYXRhLCAxKSk7DQoJCQkkZGF0YSA9IHN0cl9yZXBsYWNlKCcsJywgJy4nLCAoc3RyaW5nKSRkYXRhKTsgLy8gaW4gY2FzZSBub24tRW5nbGlzaCBsb2NhbGUNCgkJCWJyZWFrOw0KCQljYXNlIDB4MjA6CS8vCWFycmF5IGNvbnN0YW50DQoJCWNhc2UgMHg0MDoNCgkJY2FzZSAweDYwOg0KCQkJLy8gb2Zmc2V0OiAxOyBzaXplOiA3OyBub3QgdXNlZA0KCQkJJG5hbWUgPSAndEFycmF5JzsNCgkJCSRzaXplID0gODsNCgkJCSRkYXRhID0gbnVsbDsNCgkJCWJyZWFrOw0KCQljYXNlIDB4MjE6CS8vCWZ1bmN0aW9uIHdpdGggZml4ZWQgbnVtYmVyIG9mIGFyZ3VtZW50cw0KCQljYXNlIDB4NDE6DQoJCWNhc2UgMHg2MToNCgkJCSRuYW1lID0gJ3RGdW5jJzsNCgkJCSRzaXplID0gMzsNCgkJCS8vIG9mZnNldDogMTsgc2l6ZTogMjsgaW5kZXggdG8gYnVpbHQtaW4gc2hlZXQgZnVuY3Rpb24NCgkJCXN3aXRjaCAoc2VsZjo6X0dldEludDJkKCRmb3JtdWxhRGF0YSwgMSkpIHsNCgkJCWNhc2UgICAyOiAkZnVuY3Rpb24gPSAnSVNOQSc7IAkJCSRhcmdzID0gMTsgCWJyZWFrOw0KCQkJY2FzZSAgIDM6ICRmdW5jdGlvbiA9ICdJU0VSUk9SJzsgCQkkYXJncyA9IDE7IAlicmVhazsNCgkJCWNhc2UgIDEwOiAkZnVuY3Rpb24gPSAnTkEnOyAJCQkkYXJncyA9IDA7IAlicmVhazsNCgkJCWNhc2UgIDE1OiAkZnVuY3Rpb24gPSAnU0lOJzsgCQkJJGFyZ3MgPSAxOyAJYnJlYWs7DQoJCQljYXNlICAxNjogJGZ1bmN0aW9uID0gJ0NPUyc7IAkJCSRhcmdzID0gMTsgCWJyZWFrOw0KCQkJY2FzZSAgMTc6ICRmdW5jdGlvbiA9ICdUQU4nOyAJCQkkYXJncyA9IDE7IAlicmVhazsNCgkJCWNhc2UgIDE4OiAkZnVuY3Rpb24gPSAnQVRBTic7IAkJCSRhcmdzID0gMTsgCWJyZWFrOw0KCQkJY2FzZSAgMTk6ICRmdW5jdGlvbiA9ICdQSSc7IAkJCSRhcmdzID0gMDsgCWJyZWFrOw0KCQkJY2FzZSAgMjA6ICRmdW5jdGlvbiA9ICdTUVJUJzsgCQkJJGFyZ3MgPSAxOyAJYnJlYWs7DQoJCQljYXNlICAyMTogJGZ1bmN0aW9uID0gJ0VYUCc7IAkJCSRhcmdzID0gMTsgCWJyZWFrOw0KCQkJY2FzZSAgMjI6ICRmdW5jdGlvbiA9ICdMTic7IAkJCSRhcmdzID0gMTsgCWJyZWFrOw0KCQkJY2FzZSAgMjM6ICRmdW5jdGlvbiA9ICdMT0cxMCc7IAkJCSRhcmdzID0gMTsgCWJyZWFrOw0KCQkJY2FzZSAgMjQ6ICRmdW5jdGlvbiA9ICdBQlMnOyAJCQkkYXJncyA9IDE7IAlicmVhazsNCgkJCWNhc2UgIDI1OiAkZnVuY3Rpb24gPSAnSU5UJzsgCQkJJGFyZ3MgPSAxOyAJYnJlYWs7DQoJCQljYXNlICAyNjogJGZ1bmN0aW9uID0gJ1NJR04nOyAJCQkkYXJncyA9IDE7IAlicmVhazsNCgkJCWNhc2UgIDI3OiAkZnVuY3Rpb24gPSAnUk9VTkQnOyAJCQkkYXJncyA9IDI7IAlicmVhazsNCgkJCWNhc2UgIDMwOiAkZnVuY3Rpb24gPSAnUkVQVCc7IAkJCSRhcmdzID0gMjsgCWJyZWFrOw0KCQkJY2FzZSAgMzE6ICRmdW5jdGlvbiA9ICdNSUQnOyAJCQkkYXJncyA9IDM7IAlicmVhazsNCgkJCWNhc2UgIDMyOiAkZnVuY3Rpb24gPSAnTEVOJzsgCQkJJGFyZ3MgPSAxOyAJYnJlYWs7DQoJCQljYXNlICAzMzogJGZ1bmN0aW9uID0gJ1ZBTFVFJzsgCQkJJGFyZ3MgPSAxOyAJYnJlYWs7DQoJCQljYXNlICAzNDogJGZ1bmN0aW9uID0gJ1RSVUUnOyAJCQkkYXJncyA9IDA7IAlicmVhazsNCgkJCWNhc2UgIDM1OiAkZnVuY3Rpb24gPSAnRkFMU0UnOyAJCQkkYXJncyA9IDA7IAlicmVhazsNCgkJCWNhc2UgIDM4OiAkZnVuY3Rpb24gPSAnTk9UJzsgCQkJJGFyZ3MgPSAxOyAJYnJlYWs7DQoJCQljYXNlICAzOTogJGZ1bmN0aW9uID0gJ01PRCc7IAkJCSRhcmdzID0gMjsJYnJlYWs7DQoJCQljYXNlICA0MDogJGZ1bmN0aW9uID0gJ0RDT1VOVCc7IAkJJGFyZ3MgPSAzOwlicmVhazsNCgkJCWNhc2UgIDQxOiAkZnVuY3Rpb24gPSAnRFNVTSc7IAkJCSRhcmdzID0gMzsJYnJlYWs7DQoJCQljYXNlICA0MjogJGZ1bmN0aW9uID0gJ0RBVkVSQUdFJzsgCQkkYXJncyA9IDM7CWJyZWFrOw0KCQkJY2FzZSAgNDM6ICRmdW5jdGlvbiA9ICdETUlOJzsgCQkJJGFyZ3MgPSAzOwlicmVhazsNCgkJCWNhc2UgIDQ0OiAkZnVuY3Rpb24gPSAnRE1BWCc7IAkJCSRhcmdzID0gMzsJYnJlYWs7DQoJCQljYXNlICA0NTogJGZ1bmN0aW9uID0gJ0RTVERFVic7IAkJJGFyZ3MgPSAzOwlicmVhazsNCgkJCWNhc2UgIDQ4OiAkZnVuY3Rpb24gPSAnVEVYVCc7IAkJCSRhcmdzID0gMjsJYnJlYWs7DQoJCQljYXNlICA2MTogJGZ1bmN0aW9uID0gJ01JUlInOyAJCQkkYXJncyA9IDM7CWJyZWFrOw0KCQkJY2FzZSAgNjM6ICRmdW5jdGlvbiA9ICdSQU5EJzsgCQkJJGFyZ3MgPSAwOwlicmVhazsNCgkJCWNhc2UgIDY1OiAkZnVuY3Rpb24gPSAnREFURSc7IAkJCSRhcmdzID0gMzsJYnJlYWs7DQoJCQljYXNlICA2NjogJGZ1bmN0aW9uID0gJ1RJTUUnOyAJCQkkYXJncyA9IDM7CWJyZWFrOw0KCQkJY2FzZSAgNjc6ICRmdW5jdGlvbiA9ICdEQVknOyAJCQkkYXJncyA9IDE7CWJyZWFrOw0KCQkJY2FzZSAgNjg6ICRmdW5jdGlvbiA9ICdNT05USCc7IAkJCSRhcmdzID0gMTsJYnJlYWs7DQoJCQljYXNlICA2OTogJGZ1bmN0aW9uID0gJ1lFQVInOyAJCQkkYXJncyA9IDE7CWJyZWFrOw0KCQkJY2FzZSAgNzE6ICRmdW5jdGlvbiA9ICdIT1VSJzsgCQkJJGFyZ3MgPSAxOwlicmVhazsNCgkJCWNhc2UgIDcyOiAkZnVuY3Rpb24gPSAnTUlOVVRFJzsgCQkkYXJncyA9IDE7CWJyZWFrOw0KCQkJY2FzZSAgNzM6ICRmdW5jdGlvbiA9ICdTRUNPTkQnOyAJCSRhcmdzID0gMTsJYnJlYWs7DQoJCQljYXNlICA3NDogJGZ1bmN0aW9uID0gJ05PVyc7IAkJCSRhcmdzID0gMDsJYnJlYWs7DQoJCQljYXNlICA3NTogJGZ1bmN0aW9uID0gJ0FSRUFTJzsgCQkJJGFyZ3MgPSAxOwlicmVhazsNCgkJCWNhc2UgIDc2OiAkZnVuY3Rpb24gPSAnUk9XUyc7IAkJCSRhcmdzID0gMTsJYnJlYWs7DQoJCQljYXNlICA3NzogJGZ1bmN0aW9uID0gJ0NPTFVNTlMnOyAJCSRhcmdzID0gMTsJYnJlYWs7DQoJCQljYXNlICA4MzogJGZ1bmN0aW9uID0gJ1RSQU5TUE9TRSc7IAkJJGFyZ3MgPSAxOwlicmVhazsNCgkJCWNhc2UgIDg2OiAkZnVuY3Rpb24gPSAnVFlQRSc7IAkJCSRhcmdzID0gMTsJYnJlYWs7DQoJCQljYXNlICA5NzogJGZ1bmN0aW9uID0gJ0FUQU4yJzsgCQkJJGFyZ3MgPSAyOwlicmVhazsNCgkJCWNhc2UgIDk4OiAkZnVuY3Rpb24gPSAnQVNJTic7IAkJCSRhcmdzID0gMTsJYnJlYWs7DQoJCQljYXNlICA5OTogJGZ1bmN0aW9uID0gJ0FDT1MnOyAJCQkkYXJncyA9IDE7CWJyZWFrOw0KCQkJY2FzZSAxMDU6ICRmdW5jdGlvbiA9ICdJU1JFRic7IAkJCSRhcmdzID0gMTsJYnJlYWs7DQoJCQljYXNlIDExMTogJGZ1bmN0aW9uID0gJ0NIQVInOyAJCQkkYXJncyA9IDE7CWJyZWFrOw0KCQkJY2FzZSAxMTI6ICRmdW5jdGlvbiA9ICdMT1dFUic7IAkJCSRhcmdzID0gMTsJYnJlYWs7DQoJCQljYXNlIDExMzogJGZ1bmN0aW9uID0gJ1VQUEVSJzsgCQkJJGFyZ3MgPSAxOwlicmVhazsNCgkJCWNhc2UgMTE0OiAkZnVuY3Rpb24gPSAnUFJPUEVSJzsgCQkkYXJncyA9IDE7CWJyZWFrOw0KCQkJY2FzZSAxMTc6ICRmdW5jdGlvbiA9ICdFWEFDVCc7IAkJCSRhcmdzID0gMjsJYnJlYWs7DQoJCQljYXNlIDExODogJGZ1bmN0aW9uID0gJ1RSSU0nOyAJCQkkYXJncyA9IDE7CWJyZWFrOw0KCQkJY2FzZSAxMTk6ICRmdW5jdGlvbiA9ICdSRVBMQUNFJzsgCQkkYXJncyA9IDQ7CWJyZWFrOw0KCQkJY2FzZSAxMjE6ICRmdW5jdGlvbiA9ICdDT0RFJzsgCQkJJGFyZ3MgPSAxOwlicmVhazsNCgkJCWNhc2UgMTI2OiAkZnVuY3Rpb24gPSAnSVNFUlInOyAJCQkkYXJncyA9IDE7CWJyZWFrOw0KCQkJY2FzZSAxMjc6ICRmdW5jdGlvbiA9ICdJU1RFWFQnOyAJCSRhcmdzID0gMTsJYnJlYWs7DQoJCQljYXNlIDEyODogJGZ1bmN0aW9uID0gJ0lTTlVNQkVSJzsgCQkkYXJncyA9IDE7CWJyZWFrOw0KCQkJY2FzZSAxMjk6ICRmdW5jdGlvbiA9ICdJU0JMQU5LJzsgCQkkYXJncyA9IDE7CWJyZWFrOw0KCQkJY2FzZSAxMzA6ICRmdW5jdGlvbiA9ICdUJzsgCQkJCSRhcmdzID0gMTsJYnJlYWs7DQoJCQljYXNlIDEzMTogJGZ1bmN0aW9uID0gJ04nOyAJCQkJJGFyZ3MgPSAxOwlicmVhazsNCgkJCWNhc2UgMTQwOiAkZnVuY3Rpb24gPSAnREFURVZBTFVFJzsgCQkkYXJncyA9IDE7CWJyZWFrOw0KCQkJY2FzZSAxNDE6ICRmdW5jdGlvbiA9ICdUSU1FVkFMVUUnOyAJCSRhcmdzID0gMTsJYnJlYWs7DQoJCQljYXNlIDE0MjogJGZ1bmN0aW9uID0gJ1NMTic7IAkJCSRhcmdzID0gMzsJYnJlYWs7DQoJCQljYXNlIDE0MzogJGZ1bmN0aW9uID0gJ1NZRCc7IAkJCSRhcmdzID0gNDsJYnJlYWs7DQoJCQljYXNlIDE2MjogJGZ1bmN0aW9uID0gJ0NMRUFOJzsgCQkJJGFyZ3MgPSAxOwlicmVhazsNCgkJCWNhc2UgMTYzOiAkZnVuY3Rpb24gPSAnTURFVEVSTSc7IAkJJGFyZ3MgPSAxOwlicmVhazsNCgkJCWNhc2UgMTY0OiAkZnVuY3Rpb24gPSAnTUlOVkVSU0UnOyAJCSRhcmdzID0gMTsJYnJlYWs7DQoJCQljYXNlIDE2NTogJGZ1bmN0aW9uID0gJ01NVUxUJzsgCQkJJGFyZ3MgPSAyOwlicmVhazsNCgkJCWNhc2UgMTg0OiAkZnVuY3Rpb24gPSAnRkFDVCc7IAkJCSRhcmdzID0gMTsJYnJlYWs7DQoJCQljYXNlIDE4OTogJGZ1bmN0aW9uID0gJ0RQUk9EVUNUJzsgCQkkYXJncyA9IDM7CWJyZWFrOw0KCQkJY2FzZSAxOTA6ICRmdW5jdGlvbiA9ICdJU05PTlRFWFQnOyAJCSRhcmdzID0gMTsJYnJlYWs7DQoJCQljYXNlIDE5NTogJGZ1bmN0aW9uID0gJ0RTVERFVlAnOyAJCSRhcmdzID0gMzsJYnJlYWs7DQoJCQljYXNlIDE5NjogJGZ1bmN0aW9uID0gJ0RWQVJQJzsgCQkJJGFyZ3MgPSAzOwlicmVhazsNCgkJCWNhc2UgMTk4OiAkZnVuY3Rpb24gPSAnSVNMT0dJQ0FMJzsgCQkkYXJncyA9IDE7CWJyZWFrOw0KCQkJY2FzZSAxOTk6ICRmdW5jdGlvbiA9ICdEQ09VTlRBJzsgCQkkYXJncyA9IDM7CWJyZWFrOw0KCQkJY2FzZSAyMDc6ICRmdW5jdGlvbiA9ICdSRVBMQUNFQic7IAkJJGFyZ3MgPSA0OwlicmVhazsNCgkJCWNhc2UgMjEwOiAkZnVuY3Rpb24gPSAnTUlEQic7IAkJCSRhcmdzID0gMzsJYnJlYWs7DQoJCQljYXNlIDIxMTogJGZ1bmN0aW9uID0gJ0xFTkInOyAJCQkkYXJncyA9IDE7CWJyZWFrOw0KCQkJY2FzZSAyMTI6ICRmdW5jdGlvbiA9ICdST1VORFVQJzsgCQkkYXJncyA9IDI7CWJyZWFrOw0KCQkJY2FzZSAyMTM6ICRmdW5jdGlvbiA9ICdST1VORERPV04nOyAJCSRhcmdzID0gMjsJYnJlYWs7DQoJCQljYXNlIDIxNDogJGZ1bmN0aW9uID0gJ0FTQyc7IAkJCSRhcmdzID0gMTsJYnJlYWs7DQoJCQljYXNlIDIxNTogJGZ1bmN0aW9uID0gJ0RCQ1MnOyAJCQkkYXJncyA9IDE7CWJyZWFrOw0KCQkJY2FzZSAyMjE6ICRmdW5jdGlvbiA9ICdUT0RBWSc7IAkJCSRhcmdzID0gMDsJYnJlYWs7DQoJCQljYXNlIDIyOTogJGZ1bmN0aW9uID0gJ1NJTkgnOyAJCQkkYXJncyA9IDE7CWJyZWFrOw0KCQkJY2FzZSAyMzA6ICRmdW5jdGlvbiA9ICdDT1NIJzsgCQkJJGFyZ3MgPSAxOwlicmVhazsNCgkJCWNhc2UgMjMxOiAkZnVuY3Rpb24gPSAnVEFOSCc7IAkJCSRhcmdzID0gMTsJYnJlYWs7DQoJCQljYXNlIDIzMjogJGZ1bmN0aW9uID0gJ0FTSU5IJzsgCQkJJGFyZ3MgPSAxOwlicmVhazsNCgkJCWNhc2UgMjMzOiAkZnVuY3Rpb24gPSAnQUNPU0gnOyAJCQkkYXJncyA9IDE7CWJyZWFrOw0KCQkJY2FzZSAyMzQ6ICRmdW5jdGlvbiA9ICdBVEFOSCc7IAkJCSRhcmdzID0gMTsJYnJlYWs7DQoJCQljYXNlIDIzNTogJGZ1bmN0aW9uID0gJ0RHRVQnOyAJCQkkYXJncyA9IDM7CWJyZWFrOw0KCQkJY2FzZSAyNDQ6ICRmdW5jdGlvbiA9ICdJTkZPJzsgCQkJJGFyZ3MgPSAxOwlicmVhazsNCgkJCWNhc2UgMjUyOiAkZnVuY3Rpb24gPSAnRlJFUVVFTkNZJzsgCQkkYXJncyA9IDI7CWJyZWFrOw0KCQkJY2FzZSAyNjE6ICRmdW5jdGlvbiA9ICdFUlJPUi5UWVBFJzsgCSRhcmdzID0gMTsJYnJlYWs7DQoJCQljYXNlIDI3MTogJGZ1bmN0aW9uID0gJ0dBTU1BTE4nOyAJCSRhcmdzID0gMTsJYnJlYWs7DQoJCQljYXNlIDI3MzogJGZ1bmN0aW9uID0gJ0JJTk9NRElTVCc7IAkJJGFyZ3MgPSA0OwlicmVhazsNCgkJCWNhc2UgMjc0OiAkZnVuY3Rpb24gPSAnQ0hJRElTVCc7IAkJJGFyZ3MgPSAyOwlicmVhazsNCgkJCWNhc2UgMjc1OiAkZnVuY3Rpb24gPSAnQ0hJSU5WJzsgCQkkYXJncyA9IDI7CWJyZWFrOw0KCQkJY2FzZSAyNzY6ICRmdW5jdGlvbiA9ICdDT01CSU4nOyAJCSRhcmdzID0gMjsJYnJlYWs7DQoJCQljYXNlIDI3NzogJGZ1bmN0aW9uID0gJ0NPTkZJREVOQ0UnOyAJJGFyZ3MgPSAzOwlicmVhazsNCgkJCWNhc2UgMjc4OiAkZnVuY3Rpb24gPSAnQ1JJVEJJTk9NJzsgCQkkYXJncyA9IDM7CWJyZWFrOw0KCQkJY2FzZSAyNzk6ICRmdW5jdGlvbiA9ICdFVkVOJzsgCQkJJGFyZ3MgPSAxOwlicmVhazsNCgkJCWNhc2UgMjgwOiAkZnVuY3Rpb24gPSAnRVhQT05ESVNUJzsgCQkkYXJncyA9IDM7CWJyZWFrOw0KCQkJY2FzZSAyODE6ICRmdW5jdGlvbiA9ICdGRElTVCc7IAkJCSRhcmdzID0gMzsJYnJlYWs7DQoJCQljYXNlIDI4MjogJGZ1bmN0aW9uID0gJ0ZJTlYnOyAJCQkkYXJncyA9IDM7CWJyZWFrOw0KCQkJY2FzZSAyODM6ICRmdW5jdGlvbiA9ICdGSVNIRVInOyAJCSRhcmdzID0gMTsJYnJlYWs7DQoJCQljYXNlIDI4NDogJGZ1bmN0aW9uID0gJ0ZJU0hFUklOVic7IAkJJGFyZ3MgPSAxOwlicmVhazsNCgkJCWNhc2UgMjg1OiAkZnVuY3Rpb24gPSAnRkxPT1InOyAJCQkkYXJncyA9IDI7CWJyZWFrOw0KCQkJY2FzZSAyODY6ICRmdW5jdGlvbiA9ICdHQU1NQURJU1QnOyAJCSRhcmdzID0gNDsJYnJlYWs7DQoJCQljYXNlIDI4NzogJGZ1bmN0aW9uID0gJ0dBTU1BSU5WJzsgCQkkYXJncyA9IDM7CWJyZWFrOw0KCQkJY2FzZSAyODg6ICRmdW5jdGlvbiA9ICdDRUlMSU5HJzsgCQkkYXJncyA9IDI7CWJyZWFrOw0KCQkJY2FzZSAyODk6ICRmdW5jdGlvbiA9ICdIWVBHRU9NRElTVCc7CSRhcmdzID0gNDsJYnJlYWs7DQoJCQljYXNlIDI5MDogJGZ1bmN0aW9uID0gJ0xPR05PUk1ESVNUJzsJJGFyZ3MgPSAzOwlicmVhazsNCgkJCWNhc2UgMjkxOiAkZnVuY3Rpb24gPSAnTE9HSU5WJzsJCQkkYXJncyA9IDM7CWJyZWFrOw0KCQkJY2FzZSAyOTI6ICRmdW5jdGlvbiA9ICdORUdCSU5PTURJU1QnOwkkYXJncyA9IDM7CWJyZWFrOw0KCQkJY2FzZSAyOTM6ICRmdW5jdGlvbiA9ICdOT1JNRElTVCc7CQkkYXJncyA9IDQ7CWJyZWFrOw0KCQkJY2FzZSAyOTQ6ICRmdW5jdGlvbiA9ICdOT1JNU0RJU1QnOwkJJGFyZ3MgPSAxOwlicmVhazsNCgkJCWNhc2UgMjk1OiAkZnVuY3Rpb24gPSAnTk9STUlOVic7CQkkYXJncyA9IDM7CWJyZWFrOw0KCQkJY2FzZSAyOTY6ICRmdW5jdGlvbiA9ICdOT1JNU0lOVic7CQkkYXJncyA9IDE7CWJyZWFrOw0KCQkJY2FzZSAyOTc6ICRmdW5jdGlvbiA9ICdTVEFOREFSRElaRSc7CSRhcmdzID0gMzsJYnJlYWs7DQoJCQljYXNlIDI5ODogJGZ1bmN0aW9uID0gJ09ERCc7CQkJJGFyZ3MgPSAxOwlicmVhazsNCgkJCWNhc2UgMjk5OiAkZnVuY3Rpb24gPSAnUEVSTVVUJzsJCQkkYXJncyA9IDI7CWJyZWFrOw0KCQkJY2FzZSAzMDA6ICRmdW5jdGlvbiA9ICdQT0lTU09OJzsJCSRhcmdzID0gMzsJYnJlYWs7DQoJCQljYXNlIDMwMTogJGZ1bmN0aW9uID0gJ1RESVNUJzsJCQkkYXJncyA9IDM7CWJyZWFrOw0KCQkJY2FzZSAzMDI6ICRmdW5jdGlvbiA9ICdXRUlCVUxMJzsJCSRhcmdzID0gNDsJYnJlYWs7DQoJCQljYXNlIDMwMzogJGZ1bmN0aW9uID0gJ1NVTVhNWTInOwkJJGFyZ3MgPSAyOwlicmVhazsNCgkJCWNhc2UgMzA0OiAkZnVuY3Rpb24gPSAnU1VNWDJNWTInOwkJJGFyZ3MgPSAyOwlicmVhazsNCgkJCWNhc2UgMzA1OiAkZnVuY3Rpb24gPSAnU1VNWDJQWTInOwkJJGFyZ3MgPSAyOwlicmVhazsNCgkJCWNhc2UgMzA2OiAkZnVuY3Rpb24gPSAnQ0hJVEVTVCc7CQkkYXJncyA9IDI7CWJyZWFrOw0KCQkJY2FzZSAzMDc6ICRmdW5jdGlvbiA9ICdDT1JSRUwnOwkJCSRhcmdzID0gMjsJYnJlYWs7DQoJCQljYXNlIDMwODogJGZ1bmN0aW9uID0gJ0NPVkFSJzsJCQkkYXJncyA9IDI7CWJyZWFrOw0KCQkJY2FzZSAzMDk6ICRmdW5jdGlvbiA9ICdGT1JFQ0FTVCc7CQkkYXJncyA9IDM7CWJyZWFrOw0KCQkJY2FzZSAzMTA6ICRmdW5jdGlvbiA9ICdGVEVTVCc7CQkJJGFyZ3MgPSAyOwlicmVhazsNCgkJCWNhc2UgMzExOiAkZnVuY3Rpb24gPSAnSU5URVJDRVBUJzsJCSRhcmdzID0gMjsJYnJlYWs7DQoJCQljYXNlIDMxMjogJGZ1bmN0aW9uID0gJ1BFQVJTT04nOwkJJGFyZ3MgPSAyOwlicmVhazsNCgkJCWNhc2UgMzEzOiAkZnVuY3Rpb24gPSAnUlNRJzsJCQkkYXJncyA9IDI7CWJyZWFrOw0KCQkJY2FzZSAzMTQ6ICRmdW5jdGlvbiA9ICdTVEVZWCc7CQkJJGFyZ3MgPSAyOwlicmVhazsNCgkJCWNhc2UgMzE1OiAkZnVuY3Rpb24gPSAnU0xPUEUnOwkJCSRhcmdzID0gMjsJYnJlYWs7DQoJCQljYXNlIDMxNjogJGZ1bmN0aW9uID0gJ1RURVNUJzsJCQkkYXJncyA9IDQ7CWJyZWFrOw0KCQkJY2FzZSAzMjU6ICRmdW5jdGlvbiA9ICdMQVJHRSc7CQkJJGFyZ3MgPSAyOwlicmVhazsNCgkJCWNhc2UgMzI2OiAkZnVuY3Rpb24gPSAnU01BTEwnOwkJCSRhcmdzID0gMjsJYnJlYWs7DQoJCQljYXNlIDMyNzogJGZ1bmN0aW9uID0gJ1FVQVJUSUxFJzsJCSRhcmdzID0gMjsJYnJlYWs7DQoJCQljYXNlIDMyODogJGZ1bmN0aW9uID0gJ1BFUkNFTlRJTEUnOwkJJGFyZ3MgPSAyOwlicmVhazsNCgkJCWNhc2UgMzMxOiAkZnVuY3Rpb24gPSAnVFJJTU1FQU4nOwkJJGFyZ3MgPSAyOwlicmVhazsNCgkJCWNhc2UgMzMyOiAkZnVuY3Rpb24gPSAnVElOVic7CQkJJGFyZ3MgPSAyOwlicmVhazsNCgkJCWNhc2UgMzM3OiAkZnVuY3Rpb24gPSAnUE9XRVInOwkJCSRhcmdzID0gMjsJYnJlYWs7DQoJCQljYXNlIDM0MjogJGZ1bmN0aW9uID0gJ1JBRElBTlMnOwkJJGFyZ3MgPSAxOwlicmVhazsNCgkJCWNhc2UgMzQzOiAkZnVuY3Rpb24gPSAnREVHUkVFUyc7CQkkYXJncyA9IDE7CWJyZWFrOw0KCQkJY2FzZSAzNDY6ICRmdW5jdGlvbiA9ICdDT1VOVElGJzsJCSRhcmdzID0gMjsJYnJlYWs7DQoJCQljYXNlIDM0NzogJGZ1bmN0aW9uID0gJ0NPVU5UQkxBTksnOwkJJGFyZ3MgPSAxOwlicmVhazsNCgkJCWNhc2UgMzUwOiAkZnVuY3Rpb24gPSAnSVNQTVQnOwkJCSRhcmdzID0gNDsJYnJlYWs7DQoJCQljYXNlIDM1MTogJGZ1bmN0aW9uID0gJ0RBVEVESUYnOwkJJGFyZ3MgPSAzOwlicmVhazsNCgkJCWNhc2UgMzUyOiAkZnVuY3Rpb24gPSAnREFURVNUUklORyc7CQkkYXJncyA9IDE7CWJyZWFrOw0KCQkJY2FzZSAzNTM6ICRmdW5jdGlvbiA9ICdOVU1CRVJTVFJJTkcnOwkkYXJncyA9IDI7CWJyZWFrOw0KCQkJY2FzZSAzNjA6ICRmdW5jdGlvbiA9ICdQSE9ORVRJQyc7CQkkYXJncyA9IDE7CWJyZWFrOw0KCQkJY2FzZSAzNjg6ICRmdW5jdGlvbiA9ICdCQUhUVEVYVCc7CQkkYXJncyA9IDE7CWJyZWFrOw0KCQkJZGVmYXVsdDoNCgkJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCdVbnJlY29nbml6ZWQgZnVuY3Rpb24gaW4gZm9ybXVsYScpOw0KCQkJCWJyZWFrOw0KCQkJfQ0KCQkJJGRhdGEgPSBhcnJheSgnZnVuY3Rpb24nID0+ICRmdW5jdGlvbiwgJ2FyZ3MnID0+ICRhcmdzKTsNCgkJCWJyZWFrOw0KCQljYXNlIDB4MjI6CS8vCWZ1bmN0aW9uIHdpdGggdmFyaWFibGUgbnVtYmVyIG9mIGFyZ3VtZW50cw0KCQljYXNlIDB4NDI6DQoJCWNhc2UgMHg2MjoNCgkJCSRuYW1lID0gJ3RGdW5jVic7DQoJCQkkc2l6ZSA9IDQ7DQoJCQkvLyBvZmZzZXQ6IDE7IHNpemU6IDE7IG51bWJlciBvZiBhcmd1bWVudHMNCgkJCSRhcmdzID0gb3JkKCRmb3JtdWxhRGF0YVsxXSk7DQoJCQkvLyBvZmZzZXQ6IDI6IHNpemU6IDI7IGluZGV4IHRvIGJ1aWx0LWluIHNoZWV0IGZ1bmN0aW9uDQoJCQkkaW5kZXggPSBzZWxmOjpfR2V0SW50MmQoJGZvcm11bGFEYXRhLCAyKTsNCgkJCXN3aXRjaCAoJGluZGV4KSB7DQoJCQljYXNlICAgMDogJGZ1bmN0aW9uID0gJ0NPVU5UJzsJCQlicmVhazsNCgkJCWNhc2UgICAxOiAkZnVuY3Rpb24gPSAnSUYnOwkJCQlicmVhazsNCgkJCWNhc2UgICA0OiAkZnVuY3Rpb24gPSAnU1VNJzsJCQlicmVhazsNCgkJCWNhc2UgICA1OiAkZnVuY3Rpb24gPSAnQVZFUkFHRSc7CQlicmVhazsNCgkJCWNhc2UgICA2OiAkZnVuY3Rpb24gPSAnTUlOJzsJCQlicmVhazsNCgkJCWNhc2UgICA3OiAkZnVuY3Rpb24gPSAnTUFYJzsJCQlicmVhazsNCgkJCWNhc2UgICA4OiAkZnVuY3Rpb24gPSAnUk9XJzsJCQlicmVhazsNCgkJCWNhc2UgICA5OiAkZnVuY3Rpb24gPSAnQ09MVU1OJzsJCQlicmVhazsNCgkJCWNhc2UgIDExOiAkZnVuY3Rpb24gPSAnTlBWJzsJCQlicmVhazsNCgkJCWNhc2UgIDEyOiAkZnVuY3Rpb24gPSAnU1RERVYnOwkJCWJyZWFrOw0KCQkJY2FzZSAgMTM6ICRmdW5jdGlvbiA9ICdET0xMQVInOwkJCWJyZWFrOw0KCQkJY2FzZSAgMTQ6ICRmdW5jdGlvbiA9ICdGSVhFRCc7CQkJYnJlYWs7DQoJCQljYXNlICAyODogJGZ1bmN0aW9uID0gJ0xPT0tVUCc7CQkJYnJlYWs7DQoJCQljYXNlICAyOTogJGZ1bmN0aW9uID0gJ0lOREVYJzsJCQlicmVhazsNCgkJCWNhc2UgIDM2OiAkZnVuY3Rpb24gPSAnQU5EJzsJCQlicmVhazsNCgkJCWNhc2UgIDM3OiAkZnVuY3Rpb24gPSAnT1InOwkJCQlicmVhazsNCgkJCWNhc2UgIDQ2OiAkZnVuY3Rpb24gPSAnVkFSJzsJCQlicmVhazsNCgkJCWNhc2UgIDQ5OiAkZnVuY3Rpb24gPSAnTElORVNUJzsJCQlicmVhazsNCgkJCWNhc2UgIDUwOiAkZnVuY3Rpb24gPSAnVFJFTkQnOwkJCWJyZWFrOw0KCQkJY2FzZSAgNTE6ICRmdW5jdGlvbiA9ICdMT0dFU1QnOwkJCWJyZWFrOw0KCQkJY2FzZSAgNTI6ICRmdW5jdGlvbiA9ICdHUk9XVEgnOwkJCWJyZWFrOw0KCQkJY2FzZSAgNTY6ICRmdW5jdGlvbiA9ICdQVic7CQkJCWJyZWFrOw0KCQkJY2FzZSAgNTc6ICRmdW5jdGlvbiA9ICdGVic7CQkJCWJyZWFrOw0KCQkJY2FzZSAgNTg6ICRmdW5jdGlvbiA9ICdOUEVSJzsJCQlicmVhazsNCgkJCWNhc2UgIDU5OiAkZnVuY3Rpb24gPSAnUE1UJzsJCQlicmVhazsNCgkJCWNhc2UgIDYwOiAkZnVuY3Rpb24gPSAnUkFURSc7CQkJYnJlYWs7DQoJCQljYXNlICA2MjogJGZ1bmN0aW9uID0gJ0lSUic7CQkJYnJlYWs7DQoJCQljYXNlICA2NDogJGZ1bmN0aW9uID0gJ01BVENIJzsJCQlicmVhazsNCgkJCWNhc2UgIDcwOiAkZnVuY3Rpb24gPSAnV0VFS0RBWSc7CQlicmVhazsNCgkJCWNhc2UgIDc4OiAkZnVuY3Rpb24gPSAnT0ZGU0VUJzsJCQlicmVhazsNCgkJCWNhc2UgIDgyOiAkZnVuY3Rpb24gPSAnU0VBUkNIJzsJCQlicmVhazsNCgkJCWNhc2UgMTAwOiAkZnVuY3Rpb24gPSAnQ0hPT1NFJzsJCQlicmVhazsNCgkJCWNhc2UgMTAxOiAkZnVuY3Rpb24gPSAnSExPT0tVUCc7CQlicmVhazsNCgkJCWNhc2UgMTAyOiAkZnVuY3Rpb24gPSAnVkxPT0tVUCc7CQlicmVhazsNCgkJCWNhc2UgMTA5OiAkZnVuY3Rpb24gPSAnTE9HJzsJCQlicmVhazsNCgkJCWNhc2UgMTE1OiAkZnVuY3Rpb24gPSAnTEVGVCc7CQkJYnJlYWs7DQoJCQljYXNlIDExNjogJGZ1bmN0aW9uID0gJ1JJR0hUJzsJCQlicmVhazsNCgkJCWNhc2UgMTIwOiAkZnVuY3Rpb24gPSAnU1VCU1RJVFVURSc7CQlicmVhazsNCgkJCWNhc2UgMTI0OiAkZnVuY3Rpb24gPSAnRklORCc7CQkJYnJlYWs7DQoJCQljYXNlIDEyNTogJGZ1bmN0aW9uID0gJ0NFTEwnOwkJCWJyZWFrOw0KCQkJY2FzZSAxNDQ6ICRmdW5jdGlvbiA9ICdEREInOwkJCWJyZWFrOw0KCQkJY2FzZSAxNDg6ICRmdW5jdGlvbiA9ICdJTkRJUkVDVCc7CQlicmVhazsNCgkJCWNhc2UgMTY3OiAkZnVuY3Rpb24gPSAnSVBNVCc7CQkJYnJlYWs7DQoJCQljYXNlIDE2ODogJGZ1bmN0aW9uID0gJ1BQTVQnOwkJCWJyZWFrOw0KCQkJY2FzZSAxNjk6ICRmdW5jdGlvbiA9ICdDT1VOVEEnOwkJCWJyZWFrOw0KCQkJY2FzZSAxODM6ICRmdW5jdGlvbiA9ICdQUk9EVUNUJzsJCWJyZWFrOw0KCQkJY2FzZSAxOTM6ICRmdW5jdGlvbiA9ICdTVERFVlAnOwkJCWJyZWFrOw0KCQkJY2FzZSAxOTQ6ICRmdW5jdGlvbiA9ICdWQVJQJzsJCQlicmVhazsNCgkJCWNhc2UgMTk3OiAkZnVuY3Rpb24gPSAnVFJVTkMnOwkJCWJyZWFrOw0KCQkJY2FzZSAyMDQ6ICRmdW5jdGlvbiA9ICdVU0RPTExBUic7CQlicmVhazsNCgkJCWNhc2UgMjA1OiAkZnVuY3Rpb24gPSAnRklOREInOwkJCWJyZWFrOw0KCQkJY2FzZSAyMDY6ICRmdW5jdGlvbiA9ICdTRUFSQ0hCJzsJCWJyZWFrOw0KCQkJY2FzZSAyMDg6ICRmdW5jdGlvbiA9ICdMRUZUQic7CQkJYnJlYWs7DQoJCQljYXNlIDIwOTogJGZ1bmN0aW9uID0gJ1JJR0hUQic7CQkJYnJlYWs7DQoJCQljYXNlIDIxNjogJGZ1bmN0aW9uID0gJ1JBTksnOwkJCWJyZWFrOw0KCQkJY2FzZSAyMTk6ICRmdW5jdGlvbiA9ICdBRERSRVNTJzsJCWJyZWFrOw0KCQkJY2FzZSAyMjA6ICRmdW5jdGlvbiA9ICdEQVlTMzYwJzsJCWJyZWFrOw0KCQkJY2FzZSAyMjI6ICRmdW5jdGlvbiA9ICdWREInOwkJCWJyZWFrOw0KCQkJY2FzZSAyMjc6ICRmdW5jdGlvbiA9ICdNRURJQU4nOwkJCWJyZWFrOw0KCQkJY2FzZSAyMjg6ICRmdW5jdGlvbiA9ICdTVU1QUk9EVUNUJzsJCWJyZWFrOw0KCQkJY2FzZSAyNDc6ICRmdW5jdGlvbiA9ICdEQic7CQkJCWJyZWFrOw0KCQkJY2FzZSAyNTU6ICRmdW5jdGlvbiA9ICcnOwkJCQlicmVhazsNCgkJCWNhc2UgMjY5OiAkZnVuY3Rpb24gPSAnQVZFREVWJzsJCQlicmVhazsNCgkJCWNhc2UgMjcwOiAkZnVuY3Rpb24gPSAnQkVUQURJU1QnOwkJYnJlYWs7DQoJCQljYXNlIDI3MjogJGZ1bmN0aW9uID0gJ0JFVEFJTlYnOwkJYnJlYWs7DQoJCQljYXNlIDMxNzogJGZ1bmN0aW9uID0gJ1BST0InOwkJCWJyZWFrOw0KCQkJY2FzZSAzMTg6ICRmdW5jdGlvbiA9ICdERVZTUSc7CQkJYnJlYWs7DQoJCQljYXNlIDMxOTogJGZ1bmN0aW9uID0gJ0dFT01FQU4nOwkJYnJlYWs7DQoJCQljYXNlIDMyMDogJGZ1bmN0aW9uID0gJ0hBUk1FQU4nOwkJYnJlYWs7DQoJCQljYXNlIDMyMTogJGZ1bmN0aW9uID0gJ1NVTVNRJzsJCQlicmVhazsNCgkJCWNhc2UgMzIyOiAkZnVuY3Rpb24gPSAnS1VSVCc7CQkJYnJlYWs7DQoJCQljYXNlIDMyMzogJGZ1bmN0aW9uID0gJ1NLRVcnOwkJCWJyZWFrOw0KCQkJY2FzZSAzMjQ6ICRmdW5jdGlvbiA9ICdaVEVTVCc7CQkJYnJlYWs7DQoJCQljYXNlIDMyOTogJGZ1bmN0aW9uID0gJ1BFUkNFTlRSQU5LJzsJYnJlYWs7DQoJCQljYXNlIDMzMDogJGZ1bmN0aW9uID0gJ01PREUnOwkJCWJyZWFrOw0KCQkJY2FzZSAzMzY6ICRmdW5jdGlvbiA9ICdDT05DQVRFTkFURSc7CWJyZWFrOw0KCQkJY2FzZSAzNDQ6ICRmdW5jdGlvbiA9ICdTVUJUT1RBTCc7CQlicmVhazsNCgkJCWNhc2UgMzQ1OiAkZnVuY3Rpb24gPSAnU1VNSUYnOwkJCWJyZWFrOw0KCQkJY2FzZSAzNTQ6ICRmdW5jdGlvbiA9ICdST01BTic7CQkJYnJlYWs7DQoJCQljYXNlIDM1ODogJGZ1bmN0aW9uID0gJ0dFVFBJVk9UREFUQSc7CWJyZWFrOw0KCQkJY2FzZSAzNTk6ICRmdW5jdGlvbiA9ICdIWVBFUkxJTksnOwkJYnJlYWs7DQoJCQljYXNlIDM2MTogJGZ1bmN0aW9uID0gJ0FWRVJBR0VBJzsJCWJyZWFrOw0KCQkJY2FzZSAzNjI6ICRmdW5jdGlvbiA9ICdNQVhBJzsJCQlicmVhazsNCgkJCWNhc2UgMzYzOiAkZnVuY3Rpb24gPSAnTUlOQSc7CQkJYnJlYWs7DQoJCQljYXNlIDM2NDogJGZ1bmN0aW9uID0gJ1NUREVWUEEnOwkJYnJlYWs7DQoJCQljYXNlIDM2NTogJGZ1bmN0aW9uID0gJ1ZBUlBBJzsJCQlicmVhazsNCgkJCWNhc2UgMzY2OiAkZnVuY3Rpb24gPSAnU1RERVZBJzsJCQlicmVhazsNCgkJCWNhc2UgMzY3OiAkZnVuY3Rpb24gPSAnVkFSQSc7CQkJYnJlYWs7DQoJCQlkZWZhdWx0Og0KCQkJCXRocm93IG5ldyBFeGNlcHRpb24oJ1VucmVjb2duaXplZCBmdW5jdGlvbiBpbiBmb3JtdWxhJyk7DQoJCQkJYnJlYWs7DQoJCQl9DQoJCQkkZGF0YSA9IGFycmF5KCdmdW5jdGlvbicgPT4gJGZ1bmN0aW9uLCAnYXJncycgPT4gJGFyZ3MpOw0KCQkJYnJlYWs7DQoJCWNhc2UgMHgyMzoJLy8JaW5kZXggdG8gZGVmaW5lZCBuYW1lDQoJCWNhc2UgMHg0MzoNCgkJY2FzZSAweDYzOg0KCQkJJG5hbWUgPSAndE5hbWUnOw0KCQkJJHNpemUgPSA1Ow0KCQkJLy8gb2Zmc2V0OiAxOyBzaXplOiAyOyBvbmUtYmFzZWQgaW5kZXggdG8gZGVmaW5lZG5hbWUgcmVjb3JkDQoJCQkkZGVmaW5lZE5hbWVJbmRleCA9IHNlbGY6Ol9HZXRJbnQyZCgkZm9ybXVsYURhdGEsIDEpIC0gMTsNCgkJCS8vIG9mZnNldDogMjsgc2l6ZTogMjsgbm90IHVzZWQNCgkJCSRkYXRhID0gJHRoaXMtPl9kZWZpbmVkbmFtZVskZGVmaW5lZE5hbWVJbmRleF1bJ25hbWUnXTsNCgkJCWJyZWFrOw0KCQljYXNlIDB4MjQ6CS8vCXNpbmdsZSBjZWxsIHJlZmVyZW5jZSBlLmcuIEE1DQoJCWNhc2UgMHg0NDoNCgkJY2FzZSAweDY0Og0KCQkJJG5hbWUgPSAndFJlZic7DQoJCQkkc2l6ZSA9IDU7DQoJCQkkZGF0YSA9ICR0aGlzLT5fcmVhZEJJRkY4Q2VsbEFkZHJlc3Moc3Vic3RyKCRmb3JtdWxhRGF0YSwgMSwgNCkpOw0KCQkJYnJlYWs7DQoJCWNhc2UgMHgyNToJLy8JY2VsbCByYW5nZSByZWZlcmVuY2UgdG8gY2VsbHMgaW4gdGhlIHNhbWUgc2hlZXQgKDJkKQ0KCQljYXNlIDB4NDU6DQoJCWNhc2UgMHg2NToNCgkJCSRuYW1lID0gJ3RBcmVhJzsNCgkJCSRzaXplID0gOTsNCgkJCSRkYXRhID0gJHRoaXMtPl9yZWFkQklGRjhDZWxsUmFuZ2VBZGRyZXNzKHN1YnN0cigkZm9ybXVsYURhdGEsIDEsIDgpKTsNCgkJCWJyZWFrOw0KCQljYXNlIDB4MjY6CS8vCUNvbnN0YW50IHJlZmVyZW5jZSBzdWItZXhwcmVzc2lvbg0KCQljYXNlIDB4NDY6DQoJCWNhc2UgMHg2NjoNCgkJCSRuYW1lID0gJ3RNZW1BcmVhJzsNCgkJCS8vIG9mZnNldDogMTsgc2l6ZTogNDsgbm90IHVzZWQNCgkJCS8vIG9mZnNldDogNTsgc2l6ZTogMjsgc2l6ZSBvZiB0aGUgZm9sbG93aW5nIHN1YmV4cHJlc3Npb24NCgkJCSRzdWJTaXplID0gc2VsZjo6X0dldEludDJkKCRmb3JtdWxhRGF0YSwgNSk7DQoJCQkkc2l6ZSA9IDcgKyAkc3ViU2l6ZTsNCgkJCSRkYXRhID0gJHRoaXMtPl9nZXRGb3JtdWxhRnJvbURhdGEoc3Vic3RyKCRmb3JtdWxhRGF0YSwgNywgJHN1YlNpemUpKTsNCgkJCWJyZWFrOw0KCQljYXNlIDB4Mjc6CS8vCURlbGV0ZWQgY29uc3RhbnQgcmVmZXJlbmNlIHN1Yi1leHByZXNzaW9uDQoJCWNhc2UgMHg0NzoNCgkJY2FzZSAweDY3Og0KCQkJJG5hbWUgPSAndE1lbUVycic7DQoJCQkvLyBvZmZzZXQ6IDE7IHNpemU6IDQ7IG5vdCB1c2VkDQoJCQkvLyBvZmZzZXQ6IDU7IHNpemU6IDI7IHNpemUgb2YgdGhlIGZvbGxvd2luZyBzdWJleHByZXNzaW9uDQoJCQkkc3ViU2l6ZSA9IHNlbGY6Ol9HZXRJbnQyZCgkZm9ybXVsYURhdGEsIDUpOw0KCQkJJHNpemUgPSA3ICsgJHN1YlNpemU7DQoJCQkkZGF0YSA9ICR0aGlzLT5fZ2V0Rm9ybXVsYUZyb21EYXRhKHN1YnN0cigkZm9ybXVsYURhdGEsIDcsICRzdWJTaXplKSk7DQoJCQlicmVhazsNCgkJY2FzZSAweDI5OgkvLwlWYXJpYWJsZSByZWZlcmVuY2Ugc3ViLWV4cHJlc3Npb24NCgkJY2FzZSAweDQ5Og0KCQljYXNlIDB4Njk6DQoJCQkkbmFtZSA9ICd0TWVtRnVuYyc7DQoJCQkvLyBvZmZzZXQ6IDE7IHNpemU6IDI7IHNpemUgb2YgdGhlIGZvbGxvd2luZyBzdWItZXhwcmVzc2lvbg0KCQkJJHN1YlNpemUgPSBzZWxmOjpfR2V0SW50MmQoJGZvcm11bGFEYXRhLCAxKTsNCgkJCSRzaXplID0gMyArICRzdWJTaXplOw0KCQkJJGRhdGEgPSAkdGhpcy0+X2dldEZvcm11bGFGcm9tRGF0YShzdWJzdHIoJGZvcm11bGFEYXRhLCAzLCAkc3ViU2l6ZSkpOw0KCQkJYnJlYWs7DQoNCgkJY2FzZSAweDJDOiAvLyBSZWxhdGl2ZSAyZCBjZWxsIHJlZmVyZW5jZSByZWZlcmVuY2UsIHVzZWQgaW4gc2hhcmVkIGZvcm11bGFzIGFuZCBzb21lIG90aGVyIHBsYWNlcw0KCQljYXNlIDB4NEM6DQoJCWNhc2UgMHg2QzoNCgkJCSRuYW1lID0gJ3RSZWZOJzsNCgkJCSRzaXplID0gNTsNCgkJCSRkYXRhID0gJHRoaXMtPl9yZWFkQklGRjhDZWxsQWRkcmVzc0Ioc3Vic3RyKCRmb3JtdWxhRGF0YSwgMSwgNCksICRiYXNlQ2VsbCk7DQoJCQlicmVhazsNCg0KCQljYXNlIDB4MkQ6CS8vCVJlbGF0aXZlIDJkIHJhbmdlIHJlZmVyZW5jZQ0KCQljYXNlIDB4NEQ6DQoJCWNhc2UgMHg2RDoNCgkJCSRuYW1lID0gJ3RBcmVhTic7DQoJCQkkc2l6ZSA9IDk7DQoJCQkkZGF0YSA9ICR0aGlzLT5fcmVhZEJJRkY4Q2VsbFJhbmdlQWRkcmVzc0Ioc3Vic3RyKCRmb3JtdWxhRGF0YSwgMSwgOCksICRiYXNlQ2VsbCk7DQoJCQlicmVhazsNCg0KCQljYXNlIDB4Mzk6CS8vCUV4dGVybmFsIG5hbWUNCgkJY2FzZSAweDU5Og0KCQljYXNlIDB4Nzk6DQoJCQkkbmFtZSA9ICd0TmFtZVgnOw0KCQkJJHNpemUgPSA3Ow0KCQkJLy8gb2Zmc2V0OiAxOyBzaXplOiAyOyBpbmRleCB0byBSRUYgZW50cnkgaW4gRVhURVJOU0hFRVQgcmVjb3JkDQoJCQkvLyBvZmZzZXQ6IDM7IHNpemU6IDI7IG9uZS1iYXNlZCBpbmRleCB0byBERUZJTkVETkFNRSBvciBFWFRFUk5OQU1FIHJlY29yZA0KCQkJJGluZGV4ID0gc2VsZjo6X0dldEludDJkKCRmb3JtdWxhRGF0YSwgMyk7DQoJCQkvLyBhc3N1bWUgaW5kZXggaXMgdG8gRVhURVJOTkFNRSByZWNvcmQNCgkJCSRkYXRhID0gJHRoaXMtPl9leHRlcm5hbE5hbWVzWyRpbmRleCAtIDFdWyduYW1lJ107DQoJCQkvLyBvZmZzZXQ6IDU7IHNpemU6IDI7IG5vdCB1c2VkDQoJCQlicmVhazsNCg0KCQljYXNlIDB4M0E6CS8vCTNkIHJlZmVyZW5jZSB0byBjZWxsDQoJCWNhc2UgMHg1QToNCgkJY2FzZSAweDdBOg0KCQkJJG5hbWUgPSAndFJlZjNkJzsNCgkJCSRzaXplID0gNzsNCg0KCQkJdHJ5IHsNCgkJCQkvLyBvZmZzZXQ6IDE7IHNpemU6IDI7IGluZGV4IHRvIFJFRiBlbnRyeQ0KCQkJCSRzaGVldFJhbmdlID0gJHRoaXMtPl9yZWFkU2hlZXRSYW5nZUJ5UmVmSW5kZXgoc2VsZjo6X0dldEludDJkKCRmb3JtdWxhRGF0YSwgMSkpOw0KCQkJCS8vIG9mZnNldDogMzsgc2l6ZTogNDsgY2VsbCBhZGRyZXNzDQoJCQkJJGNlbGxBZGRyZXNzID0gJHRoaXMtPl9yZWFkQklGRjhDZWxsQWRkcmVzcyhzdWJzdHIoJGZvcm11bGFEYXRhLCAzLCA0KSk7DQoNCgkJCQkkZGF0YSA9ICIkc2hlZXRSYW5nZSEkY2VsbEFkZHJlc3MiOw0KCQkJfSBjYXRjaCAoRXhjZXB0aW9uICRlKSB7DQoJCQkJLy8gZGVsZXRlZCBzaGVldCByZWZlcmVuY2UNCgkJCQkkZGF0YSA9ICcjUkVGISc7DQoJCQl9DQoNCgkJCWJyZWFrOw0KCQljYXNlIDB4M0I6CS8vCTNkIHJlZmVyZW5jZSB0byBjZWxsIHJhbmdlDQoJCWNhc2UgMHg1QjoNCgkJY2FzZSAweDdCOg0KCQkJJG5hbWUgPSAndEFyZWEzZCc7DQoJCQkkc2l6ZSA9IDExOw0KDQoJCQl0cnkgew0KCQkJCS8vIG9mZnNldDogMTsgc2l6ZTogMjsgaW5kZXggdG8gUkVGIGVudHJ5DQoJCQkJJHNoZWV0UmFuZ2UgPSAkdGhpcy0+X3JlYWRTaGVldFJhbmdlQnlSZWZJbmRleChzZWxmOjpfR2V0SW50MmQoJGZvcm11bGFEYXRhLCAxKSk7DQoJCQkJLy8gb2Zmc2V0OiAzOyBzaXplOiA4OyBjZWxsIGFkZHJlc3MNCgkJCQkkY2VsbFJhbmdlQWRkcmVzcyA9ICR0aGlzLT5fcmVhZEJJRkY4Q2VsbFJhbmdlQWRkcmVzcyhzdWJzdHIoJGZvcm11bGFEYXRhLCAzLCA4KSk7DQoNCgkJCQkkZGF0YSA9ICIkc2hlZXRSYW5nZSEkY2VsbFJhbmdlQWRkcmVzcyI7DQoJCQl9IGNhdGNoIChFeGNlcHRpb24gJGUpIHsNCgkJCQkvLyBkZWxldGVkIHNoZWV0IHJlZmVyZW5jZQ0KCQkJCSRkYXRhID0gJyNSRUYhJzsNCgkJCX0NCg0KCQkJYnJlYWs7DQoJCS8vIFVua25vd24gY2FzZXMJLy8gZG9uJ3Qga25vdyBob3cgdG8gZGVhbCB3aXRoDQoJCWRlZmF1bHQ6DQoJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCdVbnJlY29nbml6ZWQgdG9rZW4gJyAuIHNwcmludGYoJyUwMlgnLCAkaWQpIC4gJyBpbiBmb3JtdWxhJyk7DQoJCQlicmVhazsNCgkJfQ0KDQoJCXJldHVybiBhcnJheSgNCgkJCSdpZCcgPT4gJGlkLA0KCQkJJ25hbWUnID0+ICRuYW1lLA0KCQkJJ3NpemUnID0+ICRzaXplLA0KCQkJJ2RhdGEnID0+ICRkYXRhLA0KCQkpOw0KCX0NCg0KDQoJLyoqDQoJICogUmVhZHMgYSBjZWxsIGFkZHJlc3MgaW4gQklGRjggZS5nLiAnQTInIG9yICckQSQyJw0KCSAqIHNlY3Rpb24gMy4zLjQNCgkgKg0KCSAqIEBwYXJhbSBzdHJpbmcgJGNlbGxBZGRyZXNzU3RydWN0dXJlDQoJICogQHJldHVybiBzdHJpbmcNCgkgKi8NCglwcml2YXRlIGZ1bmN0aW9uIF9yZWFkQklGRjhDZWxsQWRkcmVzcygkY2VsbEFkZHJlc3NTdHJ1Y3R1cmUpDQoJew0KCQkvLyBvZmZzZXQ6IDA7IHNpemU6IDI7IGluZGV4IHRvIHJvdyAoMC4uLiA2NTUzNSkgKG9yIG9mZnNldCAoLTMyNzY4Li4uIDMyNzY3KSkNCgkJJHJvdyA9IHNlbGY6Ol9HZXRJbnQyZCgkY2VsbEFkZHJlc3NTdHJ1Y3R1cmUsIDApICsgMTsNCg0KCQkvLyBvZmZzZXQ6IDI7IHNpemU6IDI7IGluZGV4IHRvIGNvbHVtbiBvciBjb2x1bW4gb2Zmc2V0ICsgcmVsYXRpdmUgZmxhZ3MNCg0KCQkJLy8gYml0OiA3LTA7IG1hc2sgMHgwMEZGOyBjb2x1bW4gaW5kZXgNCgkJCSRjb2x1bW4gPSBQSFBFeGNlbF9DZWxsOjpzdHJpbmdGcm9tQ29sdW1uSW5kZXgoMHgwMEZGICYgc2VsZjo6X0dldEludDJkKCRjZWxsQWRkcmVzc1N0cnVjdHVyZSwgMikpOw0KDQoJCQkvLyBiaXQ6IDE0OyBtYXNrIDB4NDAwMDsgKDEgPSByZWxhdGl2ZSBjb2x1bW4gaW5kZXgsIDAgPSBhYnNvbHV0ZSBjb2x1bW4gaW5kZXgpDQoJCQlpZiAoISgweDQwMDAgJiBzZWxmOjpfR2V0SW50MmQoJGNlbGxBZGRyZXNzU3RydWN0dXJlLCAyKSkpIHsNCgkJCQkkY29sdW1uID0gJyQnIC4gJGNvbHVtbjsNCgkJCX0NCgkJCS8vIGJpdDogMTU7IG1hc2sgMHg4MDAwOyAoMSA9IHJlbGF0aXZlIHJvdyBpbmRleCwgMCA9IGFic29sdXRlIHJvdyBpbmRleCkNCgkJCWlmICghKDB4ODAwMCAmIHNlbGY6Ol9HZXRJbnQyZCgkY2VsbEFkZHJlc3NTdHJ1Y3R1cmUsIDIpKSkgew0KCQkJCSRyb3cgPSAnJCcgLiAkcm93Ow0KCQkJfQ0KDQoJCXJldHVybiAkY29sdW1uIC4gJHJvdzsNCgl9DQoNCg0KCS8qKg0KCSAqIFJlYWRzIGEgY2VsbCBhZGRyZXNzIGluIEJJRkY4IGZvciBzaGFyZWQgZm9ybXVsYXMuIFVzZXMgcG9zaXRpdmUgYW5kIG5lZ2F0aXZlIHZhbHVlcyBmb3Igcm93IGFuZCBjb2x1bW4NCgkgKiB0byBpbmRpY2F0ZSBvZmZzZXRzIGZyb20gYSBiYXNlIGNlbGwNCgkgKiBzZWN0aW9uIDMuMy40DQoJICoNCgkgKiBAcGFyYW0gc3RyaW5nICRjZWxsQWRkcmVzc1N0cnVjdHVyZQ0KCSAqIEBwYXJhbSBzdHJpbmcgJGJhc2VDZWxsIEJhc2UgY2VsbCwgb25seSBuZWVkZWQgd2hlbiBmb3JtdWxhIGNvbnRhaW5zIHRSZWZOIHRva2VucywgZS5nLiB3aXRoIHNoYXJlZCBmb3JtdWxhcw0KCSAqIEByZXR1cm4gc3RyaW5nDQoJICovDQoJcHJpdmF0ZSBmdW5jdGlvbiBfcmVhZEJJRkY4Q2VsbEFkZHJlc3NCKCRjZWxsQWRkcmVzc1N0cnVjdHVyZSwgJGJhc2VDZWxsID0gJ0ExJykNCgl7DQoJCWxpc3QoJGJhc2VDb2wsICRiYXNlUm93KSA9IFBIUEV4Y2VsX0NlbGw6OmNvb3JkaW5hdGVGcm9tU3RyaW5nKCRiYXNlQ2VsbCk7DQoJCSRiYXNlQ29sID0gUEhQRXhjZWxfQ2VsbDo6Y29sdW1uSW5kZXhGcm9tU3RyaW5nKCRiYXNlQ29sKSAtIDE7DQoNCgkJLy8gb2Zmc2V0OiAwOyBzaXplOiAyOyBpbmRleCB0byByb3cgKDAuLi4gNjU1MzUpIChvciBvZmZzZXQgKC0zMjc2OC4uLiAzMjc2NykpDQoJCQkkcm93SW5kZXggPSBzZWxmOjpfR2V0SW50MmQoJGNlbGxBZGRyZXNzU3RydWN0dXJlLCAwKTsNCgkJCSRyb3cgPSBzZWxmOjpfR2V0SW50MmQoJGNlbGxBZGRyZXNzU3RydWN0dXJlLCAwKSArIDE7DQoNCgkJLy8gb2Zmc2V0OiAyOyBzaXplOiAyOyBpbmRleCB0byBjb2x1bW4gb3IgY29sdW1uIG9mZnNldCArIHJlbGF0aXZlIGZsYWdzDQoNCgkJCS8vIGJpdDogNy0wOyBtYXNrIDB4MDBGRjsgY29sdW1uIGluZGV4DQoJCQkkY29sSW5kZXggPSAweDAwRkYgJiBzZWxmOjpfR2V0SW50MmQoJGNlbGxBZGRyZXNzU3RydWN0dXJlLCAyKTsNCg0KCQkJLy8gYml0OiAxNDsgbWFzayAweDQwMDA7ICgxID0gcmVsYXRpdmUgY29sdW1uIGluZGV4LCAwID0gYWJzb2x1dGUgY29sdW1uIGluZGV4KQ0KCQkJaWYgKCEoMHg0MDAwICYgc2VsZjo6X0dldEludDJkKCRjZWxsQWRkcmVzc1N0cnVjdHVyZSwgMikpKSB7DQoJCQkJJGNvbHVtbiA9IFBIUEV4Y2VsX0NlbGw6OnN0cmluZ0Zyb21Db2x1bW5JbmRleCgkY29sSW5kZXgpOw0KCQkJCSRjb2x1bW4gPSAnJCcgLiAkY29sdW1uOw0KCQkJfSBlbHNlIHsNCgkJCQkkY29sSW5kZXggPSAoJGNvbEluZGV4IDw9IDEyNykgPyAkY29sSW5kZXggOiAkY29sSW5kZXggLSAyNTY7DQoJCQkJJGNvbHVtbiA9IFBIUEV4Y2VsX0NlbGw6OnN0cmluZ0Zyb21Db2x1bW5JbmRleCgkYmFzZUNvbCArICRjb2xJbmRleCk7DQoJCQl9DQoNCgkJCS8vIGJpdDogMTU7IG1hc2sgMHg4MDAwOyAoMSA9IHJlbGF0aXZlIHJvdyBpbmRleCwgMCA9IGFic29sdXRlIHJvdyBpbmRleCkNCgkJCWlmICghKDB4ODAwMCAmIHNlbGY6Ol9HZXRJbnQyZCgkY2VsbEFkZHJlc3NTdHJ1Y3R1cmUsIDIpKSkgew0KCQkJCSRyb3cgPSAnJCcgLiAkcm93Ow0KCQkJfSBlbHNlIHsNCgkJCQkkcm93SW5kZXggPSAoJHJvd0luZGV4IDw9IDMyNzY3KSA/ICRyb3dJbmRleCA6ICRyb3dJbmRleCAtIDY1NTM2Ow0KCQkJCSRyb3cgPSAkYmFzZVJvdyArICRyb3dJbmRleDsNCgkJCX0NCg0KCQlyZXR1cm4gJGNvbHVtbiAuICRyb3c7DQoJfQ0KDQoNCgkvKioNCgkgKiBSZWFkcyBhIGNlbGwgcmFuZ2UgYWRkcmVzcyBpbiBCSUZGNSBlLmcuICdBMjpCNicgb3IgJ0ExJw0KCSAqIGFsd2F5cyBmaXhlZCByYW5nZQ0KCSAqIHNlY3Rpb24gMi41LjE0DQoJICoNCgkgKiBAcGFyYW0gc3RyaW5nICRzdWJEYXRhDQoJICogQHJldHVybiBzdHJpbmcNCgkgKiBAdGhyb3dzIEV4Y2VwdGlvbg0KCSAqLw0KCXByaXZhdGUgZnVuY3Rpb24gX3JlYWRCSUZGNUNlbGxSYW5nZUFkZHJlc3NGaXhlZCgkc3ViRGF0YSkNCgl7DQoJCS8vIG9mZnNldDogMDsgc2l6ZTogMjsgaW5kZXggdG8gZmlyc3Qgcm93DQoJCSRmciA9IHNlbGY6Ol9HZXRJbnQyZCgkc3ViRGF0YSwgMCkgKyAxOw0KDQoJCS8vIG9mZnNldDogMjsgc2l6ZTogMjsgaW5kZXggdG8gbGFzdCByb3cNCgkJJGxyID0gc2VsZjo6X0dldEludDJkKCRzdWJEYXRhLCAyKSArIDE7DQoNCgkJLy8gb2Zmc2V0OiA0OyBzaXplOiAxOyBpbmRleCB0byBmaXJzdCBjb2x1bW4NCgkJJGZjID0gb3JkKCRzdWJEYXRhezR9KTsNCg0KCQkvLyBvZmZzZXQ6IDU7IHNpemU6IDE7IGluZGV4IHRvIGxhc3QgY29sdW1uDQoJCSRsYyA9IG9yZCgkc3ViRGF0YXs1fSk7DQoNCgkJLy8gY2hlY2sgdmFsdWVzDQoJCWlmICgkZnIgPiAkbHIgfHwgJGZjID4gJGxjKSB7DQoJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCdOb3QgYSBjZWxsIHJhbmdlIGFkZHJlc3MnKTsNCgkJfQ0KDQoJCS8vIGNvbHVtbiBpbmRleCB0byBsZXR0ZXINCgkJJGZjID0gUEhQRXhjZWxfQ2VsbDo6c3RyaW5nRnJvbUNvbHVtbkluZGV4KCRmYyk7DQoJCSRsYyA9IFBIUEV4Y2VsX0NlbGw6OnN0cmluZ0Zyb21Db2x1bW5JbmRleCgkbGMpOw0KDQoJCWlmICgkZnIgPT0gJGxyIGFuZCAkZmMgPT0gJGxjKSB7DQoJCQlyZXR1cm4gIiRmYyRmciI7DQoJCX0NCgkJcmV0dXJuICIkZmMkZnI6JGxjJGxyIjsNCgl9DQoNCg0KCS8qKg0KCSAqIFJlYWRzIGEgY2VsbCByYW5nZSBhZGRyZXNzIGluIEJJRkY4IGUuZy4gJ0EyOkI2JyBvciAnQTEnDQoJICogYWx3YXlzIGZpeGVkIHJhbmdlDQoJICogc2VjdGlvbiAyLjUuMTQNCgkgKg0KCSAqIEBwYXJhbSBzdHJpbmcgJHN1YkRhdGENCgkgKiBAcmV0dXJuIHN0cmluZw0KCSAqIEB0aHJvd3MgRXhjZXB0aW9uDQoJICovDQoJcHJpdmF0ZSBmdW5jdGlvbiBfcmVhZEJJRkY4Q2VsbFJhbmdlQWRkcmVzc0ZpeGVkKCRzdWJEYXRhKQ0KCXsNCgkJLy8gb2Zmc2V0OiAwOyBzaXplOiAyOyBpbmRleCB0byBmaXJzdCByb3cNCgkJJGZyID0gc2VsZjo6X0dldEludDJkKCRzdWJEYXRhLCAwKSArIDE7DQoNCgkJLy8gb2Zmc2V0OiAyOyBzaXplOiAyOyBpbmRleCB0byBsYXN0IHJvdw0KCQkkbHIgPSBzZWxmOjpfR2V0SW50MmQoJHN1YkRhdGEsIDIpICsgMTsNCg0KCQkvLyBvZmZzZXQ6IDQ7IHNpemU6IDI7IGluZGV4IHRvIGZpcnN0IGNvbHVtbg0KCQkkZmMgPSBzZWxmOjpfR2V0SW50MmQoJHN1YkRhdGEsIDQpOw0KDQoJCS8vIG9mZnNldDogNjsgc2l6ZTogMjsgaW5kZXggdG8gbGFzdCBjb2x1bW4NCgkJJGxjID0gc2VsZjo6X0dldEludDJkKCRzdWJEYXRhLCA2KTsNCg0KCQkvLyBjaGVjayB2YWx1ZXMNCgkJaWYgKCRmciA+ICRsciB8fCAkZmMgPiAkbGMpIHsNCgkJCXRocm93IG5ldyBFeGNlcHRpb24oJ05vdCBhIGNlbGwgcmFuZ2UgYWRkcmVzcycpOw0KCQl9DQoNCgkJLy8gY29sdW1uIGluZGV4IHRvIGxldHRlcg0KCQkkZmMgPSBQSFBFeGNlbF9DZWxsOjpzdHJpbmdGcm9tQ29sdW1uSW5kZXgoJGZjKTsNCgkJJGxjID0gUEhQRXhjZWxfQ2VsbDo6c3RyaW5nRnJvbUNvbHVtbkluZGV4KCRsYyk7DQoNCgkJaWYgKCRmciA9PSAkbHIgYW5kICRmYyA9PSAkbGMpIHsNCgkJCXJldHVybiAiJGZjJGZyIjsNCgkJfQ0KCQlyZXR1cm4gIiRmYyRmcjokbGMkbHIiOw0KCX0NCg0KDQoJLyoqDQoJICogUmVhZHMgYSBjZWxsIHJhbmdlIGFkZHJlc3MgaW4gQklGRjggZS5nLiAnQTI6QjYnIG9yICckQSQyOiRCJDYnDQoJICogdGhlcmUgYXJlIGZsYWdzIGluZGljYXRpbmcgd2hldGhlciBjb2x1bW4vcm93IGluZGV4IGlzIHJlbGF0aXZlDQoJICogc2VjdGlvbiAzLjMuNA0KCSAqDQoJICogQHBhcmFtIHN0cmluZyAkc3ViRGF0YQ0KCSAqIEByZXR1cm4gc3RyaW5nDQoJICovDQoJcHJpdmF0ZSBmdW5jdGlvbiBfcmVhZEJJRkY4Q2VsbFJhbmdlQWRkcmVzcygkc3ViRGF0YSkNCgl7DQoJCS8vIHRvZG86IGlmIGNlbGwgcmFuZ2UgaXMganVzdCBhIHNpbmdsZSBjZWxsLCBzaG91bGQgdGhpcyBmdW5jaXRvbg0KCQkvLyBub3QganVzdCByZXR1cm4gZS5nLiAnQTEnIGFuZCBub3QgJ0ExOkExJyA/DQoNCgkJLy8gb2Zmc2V0OiAwOyBzaXplOiAyOyBpbmRleCB0byBmaXJzdCByb3cgKDAuLi4gNjU1MzUpIChvciBvZmZzZXQgKC0zMjc2OC4uLiAzMjc2NykpDQoJCQkkZnIgPSBzZWxmOjpfR2V0SW50MmQoJHN1YkRhdGEsIDApICsgMTsNCg0KCQkvLyBvZmZzZXQ6IDI7IHNpemU6IDI7IGluZGV4IHRvIGxhc3Qgcm93ICgwLi4uIDY1NTM1KSAob3Igb2Zmc2V0ICgtMzI3NjguLi4gMzI3NjcpKQ0KCQkJJGxyID0gc2VsZjo6X0dldEludDJkKCRzdWJEYXRhLCAyKSArIDE7DQoNCgkJLy8gb2Zmc2V0OiA0OyBzaXplOiAyOyBpbmRleCB0byBmaXJzdCBjb2x1bW4gb3IgY29sdW1uIG9mZnNldCArIHJlbGF0aXZlIGZsYWdzDQoNCgkJLy8gYml0OiA3LTA7IG1hc2sgMHgwMEZGOyBjb2x1bW4gaW5kZXgNCgkJJGZjID0gUEhQRXhjZWxfQ2VsbDo6c3RyaW5nRnJvbUNvbHVtbkluZGV4KDB4MDBGRiAmIHNlbGY6Ol9HZXRJbnQyZCgkc3ViRGF0YSwgNCkpOw0KDQoJCS8vIGJpdDogMTQ7IG1hc2sgMHg0MDAwOyAoMSA9IHJlbGF0aXZlIGNvbHVtbiBpbmRleCwgMCA9IGFic29sdXRlIGNvbHVtbiBpbmRleCkNCgkJaWYgKCEoMHg0MDAwICYgc2VsZjo6X0dldEludDJkKCRzdWJEYXRhLCA0KSkpIHsNCgkJCSRmYyA9ICckJyAuICRmYzsNCgkJfQ0KDQoJCS8vIGJpdDogMTU7IG1hc2sgMHg4MDAwOyAoMSA9IHJlbGF0aXZlIHJvdyBpbmRleCwgMCA9IGFic29sdXRlIHJvdyBpbmRleCkNCgkJaWYgKCEoMHg4MDAwICYgc2VsZjo6X0dldEludDJkKCRzdWJEYXRhLCA0KSkpIHsNCgkJCSRmciA9ICckJyAuICRmcjsNCgkJfQ0KDQoJCS8vIG9mZnNldDogNjsgc2l6ZTogMjsgaW5kZXggdG8gbGFzdCBjb2x1bW4gb3IgY29sdW1uIG9mZnNldCArIHJlbGF0aXZlIGZsYWdzDQoNCgkJLy8gYml0OiA3LTA7IG1hc2sgMHgwMEZGOyBjb2x1bW4gaW5kZXgNCgkJJGxjID0gUEhQRXhjZWxfQ2VsbDo6c3RyaW5nRnJvbUNvbHVtbkluZGV4KDB4MDBGRiAmIHNlbGY6Ol9HZXRJbnQyZCgkc3ViRGF0YSwgNikpOw0KDQoJCS8vIGJpdDogMTQ7IG1hc2sgMHg0MDAwOyAoMSA9IHJlbGF0aXZlIGNvbHVtbiBpbmRleCwgMCA9IGFic29sdXRlIGNvbHVtbiBpbmRleCkNCgkJaWYgKCEoMHg0MDAwICYgc2VsZjo6X0dldEludDJkKCRzdWJEYXRhLCA2KSkpIHsNCgkJCSRsYyA9ICckJyAuICRsYzsNCgkJfQ0KDQoJCS8vIGJpdDogMTU7IG1hc2sgMHg4MDAwOyAoMSA9IHJlbGF0aXZlIHJvdyBpbmRleCwgMCA9IGFic29sdXRlIHJvdyBpbmRleCkNCgkJaWYgKCEoMHg4MDAwICYgc2VsZjo6X0dldEludDJkKCRzdWJEYXRhLCA2KSkpIHsNCgkJCSRsciA9ICckJyAuICRscjsNCgkJfQ0KDQoJCXJldHVybiAiJGZjJGZyOiRsYyRsciI7DQoJfQ0KDQoNCgkvKioNCgkgKiBSZWFkcyBhIGNlbGwgcmFuZ2UgYWRkcmVzcyBpbiBCSUZGOCBmb3Igc2hhcmVkIGZvcm11bGFzLiBVc2VzIHBvc2l0aXZlIGFuZCBuZWdhdGl2ZSB2YWx1ZXMgZm9yIHJvdyBhbmQgY29sdW1uDQoJICogdG8gaW5kaWNhdGUgb2Zmc2V0cyBmcm9tIGEgYmFzZSBjZWxsDQoJICogc2VjdGlvbiAzLjMuNA0KCSAqDQoJICogQHBhcmFtIHN0cmluZyAkc3ViRGF0YQ0KCSAqIEBwYXJhbSBzdHJpbmcgJGJhc2VDZWxsIEJhc2UgY2VsbA0KCSAqIEByZXR1cm4gc3RyaW5nIENlbGwgcmFuZ2UgYWRkcmVzcw0KCSAqLw0KCXByaXZhdGUgZnVuY3Rpb24gX3JlYWRCSUZGOENlbGxSYW5nZUFkZHJlc3NCKCRzdWJEYXRhLCAkYmFzZUNlbGwgPSAnQTEnKQ0KCXsNCgkJbGlzdCgkYmFzZUNvbCwgJGJhc2VSb3cpID0gUEhQRXhjZWxfQ2VsbDo6Y29vcmRpbmF0ZUZyb21TdHJpbmcoJGJhc2VDZWxsKTsNCgkJJGJhc2VDb2wgPSBQSFBFeGNlbF9DZWxsOjpjb2x1bW5JbmRleEZyb21TdHJpbmcoJGJhc2VDb2wpIC0gMTsNCg0KCQkvLyBUT0RPOiBpZiBjZWxsIHJhbmdlIGlzIGp1c3QgYSBzaW5nbGUgY2VsbCwgc2hvdWxkIHRoaXMgZnVuY2l0b24NCgkJLy8gbm90IGp1c3QgcmV0dXJuIGUuZy4gJ0ExJyBhbmQgbm90ICdBMTpBMScgPw0KDQoJCS8vIG9mZnNldDogMDsgc2l6ZTogMjsgZmlyc3Qgcm93DQoJCSRmckluZGV4ID0gc2VsZjo6X0dldEludDJkKCRzdWJEYXRhLCAwKTsgLy8gYWRqdXN0IGJlbG93DQoNCgkJLy8gb2Zmc2V0OiAyOyBzaXplOiAyOyByZWxhdGl2ZSBpbmRleCB0byBmaXJzdCByb3cgKDAuLi4gNjU1MzUpIHNob3VsZCBiZSB0cmVhdGVkIGFzIG9mZnNldCAoLTMyNzY4Li4uIDMyNzY3KQ0KCQkkbHJJbmRleCA9IHNlbGY6Ol9HZXRJbnQyZCgkc3ViRGF0YSwgMik7IC8vIGFkanVzdCBiZWxvdw0KDQoJCS8vIG9mZnNldDogNDsgc2l6ZTogMjsgZmlyc3QgY29sdW1uIHdpdGggcmVsYXRpdmUvYWJzb2x1dGUgZmxhZ3MNCg0KCQkvLyBiaXQ6IDctMDsgbWFzayAweDAwRkY7IGNvbHVtbiBpbmRleA0KCQkkZmNJbmRleCA9IDB4MDBGRiAmIHNlbGY6Ol9HZXRJbnQyZCgkc3ViRGF0YSwgNCk7DQoNCgkJLy8gYml0OiAxNDsgbWFzayAweDQwMDA7ICgxID0gcmVsYXRpdmUgY29sdW1uIGluZGV4LCAwID0gYWJzb2x1dGUgY29sdW1uIGluZGV4KQ0KCQlpZiAoISgweDQwMDAgJiBzZWxmOjpfR2V0SW50MmQoJHN1YkRhdGEsIDQpKSkgew0KCQkJLy8gYWJzb2x1dGUgY29sdW1uIGluZGV4DQoJCQkkZmMgPSBQSFBFeGNlbF9DZWxsOjpzdHJpbmdGcm9tQ29sdW1uSW5kZXgoJGZjSW5kZXgpOw0KCQkJJGZjID0gJyQnIC4gJGZjOw0KCQl9IGVsc2Ugew0KCQkJLy8gY29sdW1uIG9mZnNldA0KCQkJJGZjSW5kZXggPSAoJGZjSW5kZXggPD0gMTI3KSA/ICRmY0luZGV4IDogJGZjSW5kZXggLSAyNTY7DQoJCQkkZmMgPSBQSFBFeGNlbF9DZWxsOjpzdHJpbmdGcm9tQ29sdW1uSW5kZXgoJGJhc2VDb2wgKyAkZmNJbmRleCk7DQoJCX0NCg0KCQkvLyBiaXQ6IDE1OyBtYXNrIDB4ODAwMDsgKDEgPSByZWxhdGl2ZSByb3cgaW5kZXgsIDAgPSBhYnNvbHV0ZSByb3cgaW5kZXgpDQoJCWlmICghKDB4ODAwMCAmIHNlbGY6Ol9HZXRJbnQyZCgkc3ViRGF0YSwgNCkpKSB7DQoJCQkvLyBhYnNvbHV0ZSByb3cgaW5kZXgNCgkJCSRmciA9ICRmckluZGV4ICsgMTsNCgkJCSRmciA9ICckJyAuICRmcjsNCgkJfSBlbHNlIHsNCgkJCS8vIHJvdyBvZmZzZXQNCgkJCSRmckluZGV4ID0gKCRmckluZGV4IDw9IDMyNzY3KSA/ICRmckluZGV4IDogJGZySW5kZXggLSA2NTUzNjsNCgkJCSRmciA9ICRiYXNlUm93ICsgJGZySW5kZXg7DQoJCX0NCg0KCQkvLyBvZmZzZXQ6IDY7IHNpemU6IDI7IGxhc3QgY29sdW1uIHdpdGggcmVsYXRpdmUvYWJzb2x1dGUgZmxhZ3MNCg0KCQkvLyBiaXQ6IDctMDsgbWFzayAweDAwRkY7IGNvbHVtbiBpbmRleA0KCQkkbGNJbmRleCA9IDB4MDBGRiAmIHNlbGY6Ol9HZXRJbnQyZCgkc3ViRGF0YSwgNik7DQoJCSRsY0luZGV4ID0gKCRsY0luZGV4IDw9IDEyNykgPyAkbGNJbmRleCA6ICRsY0luZGV4IC0gMjU2Ow0KCQkkbGMgPSBQSFBFeGNlbF9DZWxsOjpzdHJpbmdGcm9tQ29sdW1uSW5kZXgoJGJhc2VDb2wgKyAkbGNJbmRleCk7DQoNCgkJLy8gYml0OiAxNDsgbWFzayAweDQwMDA7ICgxID0gcmVsYXRpdmUgY29sdW1uIGluZGV4LCAwID0gYWJzb2x1dGUgY29sdW1uIGluZGV4KQ0KCQlpZiAoISgweDQwMDAgJiBzZWxmOjpfR2V0SW50MmQoJHN1YkRhdGEsIDYpKSkgew0KCQkJLy8gYWJzb2x1dGUgY29sdW1uIGluZGV4DQoJCQkkbGMgPSBQSFBFeGNlbF9DZWxsOjpzdHJpbmdGcm9tQ29sdW1uSW5kZXgoJGxjSW5kZXgpOw0KCQkJJGxjID0gJyQnIC4gJGxjOw0KCQl9IGVsc2Ugew0KCQkJLy8gY29sdW1uIG9mZnNldA0KCQkJJGxjSW5kZXggPSAoJGxjSW5kZXggPD0gMTI3KSA/ICRsY0luZGV4IDogJGxjSW5kZXggLSAyNTY7DQoJCQkkbGMgPSBQSFBFeGNlbF9DZWxsOjpzdHJpbmdGcm9tQ29sdW1uSW5kZXgoJGJhc2VDb2wgKyAkbGNJbmRleCk7DQoJCX0NCg0KCQkvLyBiaXQ6IDE1OyBtYXNrIDB4ODAwMDsgKDEgPSByZWxhdGl2ZSByb3cgaW5kZXgsIDAgPSBhYnNvbHV0ZSByb3cgaW5kZXgpDQoJCWlmICghKDB4ODAwMCAmIHNlbGY6Ol9HZXRJbnQyZCgkc3ViRGF0YSwgNikpKSB7DQoJCQkvLyBhYnNvbHV0ZSByb3cgaW5kZXgNCgkJCSRsciA9ICRsckluZGV4ICsgMTsNCgkJCSRsciA9ICckJyAuICRscjsNCgkJfSBlbHNlIHsNCgkJCS8vIHJvdyBvZmZzZXQNCgkJCSRsckluZGV4ID0gKCRsckluZGV4IDw9IDMyNzY3KSA/ICRsckluZGV4IDogJGxySW5kZXggLSA2NTUzNjsNCgkJCSRsciA9ICRiYXNlUm93ICsgJGxySW5kZXg7DQoJCX0NCg0KCQlyZXR1cm4gIiRmYyRmcjokbGMkbHIiOw0KCX0NCg0KDQoJLyoqDQoJICogUmVhZCBCSUZGOCBjZWxsIHJhbmdlIGFkZHJlc3MgbGlzdA0KCSAqIHNlY3Rpb24gMi41LjE1DQoJICoNCgkgKiBAcGFyYW0gc3RyaW5nICRzdWJEYXRhDQoJICogQHJldHVybiBhcnJheQ0KCSAqLw0KCXByaXZhdGUgZnVuY3Rpb24gX3JlYWRCSUZGOENlbGxSYW5nZUFkZHJlc3NMaXN0KCRzdWJEYXRhKQ0KCXsNCgkJJGNlbGxSYW5nZUFkZHJlc3NlcyA9IGFycmF5KCk7DQoNCgkJLy8gb2Zmc2V0OiAwOyBzaXplOiAyOyBudW1iZXIgb2YgdGhlIGZvbGxvd2luZyBjZWxsIHJhbmdlIGFkZHJlc3Nlcw0KCQkkbm0gPSBzZWxmOjpfR2V0SW50MmQoJHN1YkRhdGEsIDApOw0KDQoJCSRvZmZzZXQgPSAyOw0KCQkvLyBvZmZzZXQ6IDI7IHNpemU6IDggKiAkbm07IGxpc3Qgb2YgJG5tIChmaXhlZCkgY2VsbCByYW5nZSBhZGRyZXNzZXMNCgkJZm9yICgkaSA9IDA7ICRpIDwgJG5tOyArKyRpKSB7DQoJCQkkY2VsbFJhbmdlQWRkcmVzc2VzW10gPSAkdGhpcy0+X3JlYWRCSUZGOENlbGxSYW5nZUFkZHJlc3NGaXhlZChzdWJzdHIoJHN1YkRhdGEsICRvZmZzZXQsIDgpKTsNCgkJCSRvZmZzZXQgKz0gODsNCgkJfQ0KDQoJCXJldHVybiBhcnJheSgNCgkJCSdzaXplJyA9PiAyICsgOCAqICRubSwNCgkJCSdjZWxsUmFuZ2VBZGRyZXNzZXMnID0+ICRjZWxsUmFuZ2VBZGRyZXNzZXMsDQoJCSk7DQoJfQ0KDQoNCgkvKioNCgkgKiBSZWFkIEJJRkY1IGNlbGwgcmFuZ2UgYWRkcmVzcyBsaXN0DQoJICogc2VjdGlvbiAyLjUuMTUNCgkgKg0KCSAqIEBwYXJhbSBzdHJpbmcgJHN1YkRhdGENCgkgKiBAcmV0dXJuIGFycmF5DQoJICovDQoJcHJpdmF0ZSBmdW5jdGlvbiBfcmVhZEJJRkY1Q2VsbFJhbmdlQWRkcmVzc0xpc3QoJHN1YkRhdGEpDQoJew0KCQkkY2VsbFJhbmdlQWRkcmVzc2VzID0gYXJyYXkoKTsNCg0KCQkvLyBvZmZzZXQ6IDA7IHNpemU6IDI7IG51bWJlciBvZiB0aGUgZm9sbG93aW5nIGNlbGwgcmFuZ2UgYWRkcmVzc2VzDQoJCSRubSA9IHNlbGY6Ol9HZXRJbnQyZCgkc3ViRGF0YSwgMCk7DQoNCgkJJG9mZnNldCA9IDI7DQoJCS8vIG9mZnNldDogMjsgc2l6ZTogNiAqICRubTsgbGlzdCBvZiAkbm0gKGZpeGVkKSBjZWxsIHJhbmdlIGFkZHJlc3Nlcw0KCQlmb3IgKCRpID0gMDsgJGkgPCAkbm07ICsrJGkpIHsNCgkJCSRjZWxsUmFuZ2VBZGRyZXNzZXNbXSA9ICR0aGlzLT5fcmVhZEJJRkY1Q2VsbFJhbmdlQWRkcmVzc0ZpeGVkKHN1YnN0cigkc3ViRGF0YSwgJG9mZnNldCwgNikpOw0KCQkJJG9mZnNldCArPSA2Ow0KCQl9DQoNCgkJcmV0dXJuIGFycmF5KA0KCQkJJ3NpemUnID0+IDIgKyA2ICogJG5tLA0KCQkJJ2NlbGxSYW5nZUFkZHJlc3NlcycgPT4gJGNlbGxSYW5nZUFkZHJlc3NlcywNCgkJKTsNCgl9DQoNCg0KCS8qKg0KCSAqIEdldCBhIHNoZWV0IHJhbmdlIGxpa2UgU2hlZXQxOlNoZWV0MyBmcm9tIFJFRiBpbmRleA0KCSAqIE5vdGU6IElmIHRoZXJlIGlzIG9ubHkgb25lIHNoZWV0IGluIHRoZSByYW5nZSwgb25lIGdldHMgZS5nIFNoZWV0MQ0KCSAqIEl0IGNhbiBhbHNvIGhhcHBlbiB0aGF0IHRoZSBSRUYgc3RydWN0dXJlIHVzZXMgdGhlIC0xIChGRkZGKSBjb2RlIHRvIGluZGljYXRlIGRlbGV0ZWQgc2hlZXRzLA0KCSAqIGluIHdoaWNoIGNhc2UgYW4gZXhjZXB0aW9uIGlzIHRocm93bg0KCSAqDQoJICogQHBhcmFtIGludCAkaW5kZXgNCgkgKiBAcmV0dXJuIHN0cmluZ3xmYWxzZQ0KCSAqIEB0aHJvd3MgRXhjZXB0aW9uDQoJICovDQoJcHJpdmF0ZSBmdW5jdGlvbiBfcmVhZFNoZWV0UmFuZ2VCeVJlZkluZGV4KCRpbmRleCkNCgl7DQoJCWlmIChpc3NldCgkdGhpcy0+X3JlZlskaW5kZXhdKSkgew0KDQoJCQkkdHlwZSA9ICR0aGlzLT5fZXh0ZXJuYWxCb29rc1skdGhpcy0+X3JlZlskaW5kZXhdWydleHRlcm5hbEJvb2tJbmRleCddXVsndHlwZSddOw0KDQoJCQlzd2l0Y2ggKCR0eXBlKSB7DQoJCQkJY2FzZSAnaW50ZXJuYWwnOg0KCQkJCQkvLyBjaGVjayBpZiB3ZSBoYXZlIGEgZGVsZXRlZCAzZCByZWZlcmVuY2UNCgkJCQkJaWYgKCR0aGlzLT5fcmVmWyRpbmRleF1bJ2ZpcnN0U2hlZXRJbmRleCddID09IDB4RkZGRiBvciAkdGhpcy0+X3JlZlskaW5kZXhdWydsYXN0U2hlZXRJbmRleCddID09IDB4RkZGRikgew0KCQkJCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbignRGVsZXRlZCBzaGVldCByZWZlcmVuY2UnKTsNCgkJCQkJfQ0KDQoJCQkJCS8vIHdlIGhhdmUgbm9ybWFsIHNoZWV0IHJhbmdlIChjb2xsYXBzZWQgb3IgdW5jb2xsYXBzZWQpDQoJCQkJCSRmaXJzdFNoZWV0TmFtZSA9ICR0aGlzLT5fc2hlZXRzWyR0aGlzLT5fcmVmWyRpbmRleF1bJ2ZpcnN0U2hlZXRJbmRleCddXVsnbmFtZSddOw0KCQkJCQkkbGFzdFNoZWV0TmFtZSA9ICR0aGlzLT5fc2hlZXRzWyR0aGlzLT5fcmVmWyRpbmRleF1bJ2xhc3RTaGVldEluZGV4J11dWyduYW1lJ107DQoNCgkJCQkJaWYgKCRmaXJzdFNoZWV0TmFtZSA9PSAkbGFzdFNoZWV0TmFtZSkgew0KCQkJCQkJLy8gY29sbGFwc2VkIHNoZWV0IHJhbmdlDQoJCQkJCQkkc2hlZXRSYW5nZSA9ICRmaXJzdFNoZWV0TmFtZTsNCgkJCQkJfSBlbHNlIHsNCgkJCQkJCSRzaGVldFJhbmdlID0gIiRmaXJzdFNoZWV0TmFtZTokbGFzdFNoZWV0TmFtZSI7DQoJCQkJCX0NCg0KCQkJCQkvLyBlc2NhcGUgdGhlIHNpbmdsZS1xdW90ZXMNCgkJCQkJJHNoZWV0UmFuZ2UgPSBzdHJfcmVwbGFjZSgiJyIsICInJyIsICRzaGVldFJhbmdlKTsNCg0KCQkJCQkvLyBpZiB0aGVyZSBhcmUgc3BlY2lhbCBjaGFyYWN0ZXJzLCB3ZSBuZWVkIHRvIGVuY2xvc2UgdGhlIHJhbmdlIGluIHNpbmdsZS1xdW90ZXMNCgkJCQkJLy8gdG9kbzogY2hlY2sgaWYgd2UgaGF2ZSBpZGVudGlmaWVkIHRoZSB3aG9sZSBzZXQgb2Ygc3BlY2lhbCBjaGFyYWN0ZXJzDQoJCQkJCS8vIGl0IHNlZW1zIHRoYXQgdGhlIGZvbGxvd2luZyBjaGFyYWN0ZXJzIGFyZSBub3QgYWNjZXB0ZWQgZm9yIHNoZWV0IG5hbWVzDQoJCQkJCS8vIGFuZCB3ZSBtYXkgYXNzdW1lIHRoYXQgdGhleSBhcmUgbm90IHByZXNlbnQ6IFtdKi86XD8NCgkJCQkJaWYgKHByZWdfbWF0Y2goIi9bICFcIkAjwqMkJSZ7KCl9PD49Kyd8Xiw7LV0vIiwgJHNoZWV0UmFuZ2UpKSB7DQoJCQkJCQkkc2hlZXRSYW5nZSA9ICInJHNoZWV0UmFuZ2UnIjsNCgkJCQkJfQ0KDQoJCQkJCXJldHVybiAkc2hlZXRSYW5nZTsNCgkJCQkJYnJlYWs7DQoNCgkJCQlkZWZhdWx0Og0KCQkJCQkvLyBUT0RPOiBleHRlcm5hbCBzaGVldCBzdXBwb3J0DQoJCQkJCXRocm93IG5ldyBFeGNlcHRpb24oJ0V4Y2VsNSByZWFkZXIgb25seSBzdXBwb3J0cyBpbnRlcm5hbCBzaGVldHMgaW4gZm9tdWxhcycpOw0KCQkJCQlicmVhazsNCgkJCX0NCgkJfQ0KCQlyZXR1cm4gZmFsc2U7DQoJfQ0KDQoNCgkvKioNCgkgKiByZWFkIEJJRkY4IGNvbnN0YW50IHZhbHVlIGFycmF5IGZyb20gYXJyYXkgZGF0YQ0KCSAqIHJldHVybnMgZS5nLiBhcnJheSgndmFsdWUnID0+ICd7MSwyOzMsNH0nLCAnc2l6ZScgPT4gNDB9DQoJICogc2VjdGlvbiAyLjUuOA0KCSAqDQoJICogQHBhcmFtIHN0cmluZyAkYXJyYXlEYXRhDQoJICogQHJldHVybiBhcnJheQ0KCSAqLw0KCXByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIF9yZWFkQklGRjhDb25zdGFudEFycmF5KCRhcnJheURhdGEpDQoJew0KCQkvLyBvZmZzZXQ6IDA7IHNpemU6IDE7IG51bWJlciBvZiBjb2x1bW5zIGRlY3JlYXNlZCBieSAxDQoJCSRuYyA9IG9yZCgkYXJyYXlEYXRhWzBdKTsNCg0KCQkvLyBvZmZzZXQ6IDE7IHNpemU6IDI7IG51bWJlciBvZiByb3dzIGRlY3JlYXNlZCBieSAxDQoJCSRuciA9IHNlbGY6Ol9HZXRJbnQyZCgkYXJyYXlEYXRhLCAxKTsNCgkJJHNpemUgPSAzOyAvLyBpbml0aWFsaXplDQoJCSRhcnJheURhdGEgPSBzdWJzdHIoJGFycmF5RGF0YSwgMyk7DQoNCgkJLy8gb2Zmc2V0OiAzOyBzaXplOiB2YXI7IGxpc3Qgb2YgKCRuYyArIDEpICogKCRuciArIDEpIGNvbnN0YW50IHZhbHVlcw0KCQkkbWF0cml4Q2h1bmtzID0gYXJyYXkoKTsNCgkJZm9yICgkciA9IDE7ICRyIDw9ICRuciArIDE7ICsrJHIpIHsNCgkJCSRpdGVtcyA9IGFycmF5KCk7DQoJCQlmb3IgKCRjID0gMTsgJGMgPD0gJG5jICsgMTsgKyskYykgew0KCQkJCSRjb25zdGFudCA9IHNlbGY6Ol9yZWFkQklGRjhDb25zdGFudCgkYXJyYXlEYXRhKTsNCgkJCQkkaXRlbXNbXSA9ICRjb25zdGFudFsndmFsdWUnXTsNCgkJCQkkYXJyYXlEYXRhID0gc3Vic3RyKCRhcnJheURhdGEsICRjb25zdGFudFsnc2l6ZSddKTsNCgkJCQkkc2l6ZSArPSAkY29uc3RhbnRbJ3NpemUnXTsNCgkJCX0NCgkJCSRtYXRyaXhDaHVua3NbXSA9IGltcGxvZGUoJywnLCAkaXRlbXMpOyAvLyBsb29rcyBsaWtlIGUuZy4gJzEsImhlbGxvIicNCgkJfQ0KCQkkbWF0cml4ID0gJ3snIC4gaW1wbG9kZSgnOycsICRtYXRyaXhDaHVua3MpIC4gJ30nOw0KDQoJCXJldHVybiBhcnJheSgNCgkJCSd2YWx1ZScgPT4gJG1hdHJpeCwNCgkJCSdzaXplJyA9PiAkc2l6ZSwNCgkJKTsNCgl9DQoNCg0KCS8qKg0KCSAqIHJlYWQgQklGRjggY29uc3RhbnQgdmFsdWUgd2hpY2ggbWF5IGJlICdFbXB0eSBWYWx1ZScsICdOdW1iZXInLCAnU3RyaW5nIFZhbHVlJywgJ0Jvb2xlYW4gVmFsdWUnLCAnRXJyb3IgVmFsdWUnDQoJICogc2VjdGlvbiAyLjUuNw0KCSAqIHJldHVybnMgZS5nLiBhcnJheSgndmFsdWUnID0+ICc1JywgJ3NpemUnID0+IDkpDQoJICoNCgkgKiBAcGFyYW0gc3RyaW5nICR2YWx1ZURhdGENCgkgKiBAcmV0dXJuIGFycmF5DQoJICovDQoJcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gX3JlYWRCSUZGOENvbnN0YW50KCR2YWx1ZURhdGEpDQoJew0KCQkvLyBvZmZzZXQ6IDA7IHNpemU6IDE7IGlkZW50aWZpZXIgZm9yIHR5cGUgb2YgY29uc3RhbnQNCgkJJGlkZW50aWZpZXIgPSBvcmQoJHZhbHVlRGF0YVswXSk7DQoNCgkJc3dpdGNoICgkaWRlbnRpZmllcikgew0KCQljYXNlIDB4MDA6IC8vIGVtcHR5IGNvbnN0YW50ICh3aGF0IGlzIHRoaXM/KQ0KCQkJJHZhbHVlID0gJyc7DQoJCQkkc2l6ZSA9IDk7DQoJCQlicmVhazsNCgkJY2FzZSAweDAxOiAvLyBudW1iZXINCgkJCS8vIG9mZnNldDogMTsgc2l6ZTogODsgSUVFRSA3NTQgZmxvYXRpbmctcG9pbnQgdmFsdWUNCgkJCSR2YWx1ZSA9IHNlbGY6Ol9leHRyYWN0TnVtYmVyKHN1YnN0cigkdmFsdWVEYXRhLCAxLCA4KSk7DQoJCQkkc2l6ZSA9IDk7DQoJCQlicmVhazsNCgkJY2FzZSAweDAyOiAvLyBzdHJpbmcgdmFsdWUNCgkJCS8vIG9mZnNldDogMTsgc2l6ZTogdmFyOyBVbmljb2RlIHN0cmluZywgMTYtYml0IHN0cmluZyBsZW5ndGgNCgkJCSRzdHJpbmcgPSBzZWxmOjpfcmVhZFVuaWNvZGVTdHJpbmdMb25nKHN1YnN0cigkdmFsdWVEYXRhLCAxKSk7DQoJCQkkdmFsdWUgPSAnIicgLiAkc3RyaW5nWyd2YWx1ZSddIC4gJyInOw0KCQkJJHNpemUgPSAxICsgJHN0cmluZ1snc2l6ZSddOw0KCQkJYnJlYWs7DQoJCWNhc2UgMHgwNDogLy8gYm9vbGVhbg0KCQkJLy8gb2Zmc2V0OiAxOyBzaXplOiAxOyAwID0gRkFMU0UsIDEgPSBUUlVFDQoJCQlpZiAob3JkKCR2YWx1ZURhdGFbMV0pKSB7DQoJCQkJJHZhbHVlID0gJ1RSVUUnOw0KCQkJfSBlbHNlIHsNCgkJCQkkdmFsdWUgPSAnRkFMU0UnOw0KCQkJfQ0KCQkJJHNpemUgPSA5Ow0KCQkJYnJlYWs7DQoJCWNhc2UgMHgxMDogLy8gZXJyb3IgY29kZQ0KCQkJLy8gb2Zmc2V0OiAxOyBzaXplOiAxOyBlcnJvciBjb2RlDQoJCQkkdmFsdWUgPSBzZWxmOjpfbWFwRXJyb3JDb2RlKG9yZCgkdmFsdWVEYXRhWzFdKSk7DQoJCQkkc2l6ZSA9IDk7DQoJCQlicmVhazsNCgkJfQ0KCQlyZXR1cm4gYXJyYXkoDQoJCQkndmFsdWUnID0+ICR2YWx1ZSwNCgkJCSdzaXplJyA9PiAkc2l6ZSwNCgkJKTsNCgl9DQoNCg0KCS8qKg0KCSAqIEV4dHJhY3QgUkdCIGNvbG9yDQoJICogT3Blbk9mZmljZS5vcmcncyBEb2N1bWVudGF0aW9uIG9mIHRoZSBNaWNyb3NvZnQgRXhjZWwgRmlsZSBGb3JtYXQsIHNlY3Rpb24gMi41LjQNCgkgKg0KCSAqIEBwYXJhbSBzdHJpbmcgJHJnYiBFbmNvZGVkIFJHQiB2YWx1ZSAoNCBieXRlcykNCgkgKiBAcmV0dXJuIGFycmF5DQoJICovDQoJcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gX3JlYWRSR0IoJHJnYikNCgl7DQoJCS8vIG9mZnNldDogMDsgc2l6ZSAxOyBSZWQgY29tcG9uZW50DQoJCSRyID0gb3JkKCRyZ2J7MH0pOw0KDQoJCS8vIG9mZnNldDogMTsgc2l6ZTogMTsgR3JlZW4gY29tcG9uZW50DQoJCSRnID0gb3JkKCRyZ2J7MX0pOw0KDQoJCS8vIG9mZnNldDogMjsgc2l6ZTogMTsgQmx1ZSBjb21wb25lbnQNCgkJJGIgPSBvcmQoJHJnYnsyfSk7DQoNCgkJLy8gSEVYIG5vdGF0aW9uLCBlLmcuICdGRjAwRkMnDQoJCSRyZ2IgPSBzcHJpbnRmKCclMDJYJTAyWCUwMlgnLCAkciwgJGcsICRiKTsNCg0KCQlyZXR1cm4gYXJyYXkoJ3JnYicgPT4gJHJnYik7DQoJfQ0KDQoNCgkvKioNCgkgKiBSZWFkIGJ5dGUgc3RyaW5nICg4LWJpdCBzdHJpbmcgbGVuZ3RoKQ0KCSAqIE9wZW5PZmZpY2UgZG9jdW1lbnRhdGlvbjogMi41LjINCgkgKg0KCSAqIEBwYXJhbSBzdHJpbmcgJHN1YkRhdGENCgkgKiBAcmV0dXJuIGFycmF5DQoJICovDQoJcHJpdmF0ZSBmdW5jdGlvbiBfcmVhZEJ5dGVTdHJpbmdTaG9ydCgkc3ViRGF0YSkNCgl7DQoJCS8vIG9mZnNldDogMDsgc2l6ZTogMTsgbGVuZ3RoIG9mIHRoZSBzdHJpbmcgKGNoYXJhY3RlciBjb3VudCkNCgkJJGxuID0gb3JkKCRzdWJEYXRhWzBdKTsNCg0KCQkvLyBvZmZzZXQ6IDE6IHNpemU6IHZhcjsgY2hhcmFjdGVyIGFycmF5ICg4LWJpdCBjaGFyYWN0ZXJzKQ0KCQkkdmFsdWUgPSAkdGhpcy0+X2RlY29kZUNvZGVwYWdlKHN1YnN0cigkc3ViRGF0YSwgMSwgJGxuKSk7DQoNCgkJcmV0dXJuIGFycmF5KA0KCQkJJ3ZhbHVlJyA9PiAkdmFsdWUsDQoJCQknc2l6ZScgPT4gMSArICRsbiwgLy8gc2l6ZSBpbiBieXRlcyBvZiBkYXRhIHN0cnVjdHVyZQ0KCQkpOw0KCX0NCg0KDQoJLyoqDQoJICogUmVhZCBieXRlIHN0cmluZyAoMTYtYml0IHN0cmluZyBsZW5ndGgpDQoJICogT3Blbk9mZmljZSBkb2N1bWVudGF0aW9uOiAyLjUuMg0KCSAqDQoJICogQHBhcmFtIHN0cmluZyAkc3ViRGF0YQ0KCSAqIEByZXR1cm4gYXJyYXkNCgkgKi8NCglwcml2YXRlIGZ1bmN0aW9uIF9yZWFkQnl0ZVN0cmluZ0xvbmcoJHN1YkRhdGEpDQoJew0KCQkvLyBvZmZzZXQ6IDA7IHNpemU6IDI7IGxlbmd0aCBvZiB0aGUgc3RyaW5nIChjaGFyYWN0ZXIgY291bnQpDQoJCSRsbiA9IHNlbGY6Ol9HZXRJbnQyZCgkc3ViRGF0YSwgMCk7DQoNCgkJLy8gb2Zmc2V0OiAyOiBzaXplOiB2YXI7IGNoYXJhY3RlciBhcnJheSAoOC1iaXQgY2hhcmFjdGVycykNCgkJJHZhbHVlID0gJHRoaXMtPl9kZWNvZGVDb2RlcGFnZShzdWJzdHIoJHN1YkRhdGEsIDIpKTsNCg0KCQkvL3JldHVybiAkc3RyaW5nOw0KCQlyZXR1cm4gYXJyYXkoDQoJCQkndmFsdWUnID0+ICR2YWx1ZSwNCgkJCSdzaXplJyA9PiAyICsgJGxuLCAvLyBzaXplIGluIGJ5dGVzIG9mIGRhdGEgc3RydWN0dXJlDQoJCSk7DQoJfQ0KDQoNCgkvKioNCgkgKiBFeHRyYWN0cyBhbiBFeGNlbCBVbmljb2RlIHNob3J0IHN0cmluZyAoOC1iaXQgc3RyaW5nIGxlbmd0aCkNCgkgKiBPcGVuT2ZmaWNlIGRvY3VtZW50YXRpb246IDIuNS4zDQoJICogZnVuY3Rpb24gd2lsbCBhdXRvbWF0aWNhbGx5IGZpbmQgb3V0IHdoZXJlIHRoZSBVbmljb2RlIHN0cmluZyBlbmRzLg0KCSAqDQoJICogQHBhcmFtIHN0cmluZyAkc3ViRGF0YQ0KCSAqIEByZXR1cm4gYXJyYXkNCgkgKi8NCglwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBfcmVhZFVuaWNvZGVTdHJpbmdTaG9ydCgkc3ViRGF0YSkNCgl7DQoJCSR2YWx1ZSA9ICcnOw0KDQoJCS8vIG9mZnNldDogMDogc2l6ZTogMTsgbGVuZ3RoIG9mIHRoZSBzdHJpbmcgKGNoYXJhY3RlciBjb3VudCkNCgkJJGNoYXJhY3RlckNvdW50ID0gb3JkKCRzdWJEYXRhWzBdKTsNCg0KCQkkc3RyaW5nID0gc2VsZjo6X3JlYWRVbmljb2RlU3RyaW5nKHN1YnN0cigkc3ViRGF0YSwgMSksICRjaGFyYWN0ZXJDb3VudCk7DQoNCgkJLy8gYWRkIDEgZm9yIHRoZSBzdHJpbmcgbGVuZ3RoDQoJCSRzdHJpbmdbJ3NpemUnXSArPSAxOw0KDQoJCXJldHVybiAkc3RyaW5nOw0KCX0NCg0KDQoJLyoqDQoJICogRXh0cmFjdHMgYW4gRXhjZWwgVW5pY29kZSBsb25nIHN0cmluZyAoMTYtYml0IHN0cmluZyBsZW5ndGgpDQoJICogT3Blbk9mZmljZSBkb2N1bWVudGF0aW9uOiAyLjUuMw0KCSAqIHRoaXMgZnVuY3Rpb24gaXMgdW5kZXIgY29uc3RydWN0aW9uLCBuZWVkcyB0byBzdXBwb3J0IHJpY2ggdGV4dCwgYW5kIEFzaWFuIHBob25ldGljIHNldHRpbmdzDQoJICoNCgkgKiBAcGFyYW0gc3RyaW5nICRzdWJEYXRhDQoJICogQHJldHVybiBhcnJheQ0KCSAqLw0KCXByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIF9yZWFkVW5pY29kZVN0cmluZ0xvbmcoJHN1YkRhdGEpDQoJew0KCQkkdmFsdWUgPSAnJzsNCg0KCQkvLyBvZmZzZXQ6IDA6IHNpemU6IDI7IGxlbmd0aCBvZiB0aGUgc3RyaW5nIChjaGFyYWN0ZXIgY291bnQpDQoJCSRjaGFyYWN0ZXJDb3VudCA9IHNlbGY6Ol9HZXRJbnQyZCgkc3ViRGF0YSwgMCk7DQoNCgkJJHN0cmluZyA9IHNlbGY6Ol9yZWFkVW5pY29kZVN0cmluZyhzdWJzdHIoJHN1YkRhdGEsIDIpLCAkY2hhcmFjdGVyQ291bnQpOw0KDQoJCS8vIGFkZCAyIGZvciB0aGUgc3RyaW5nIGxlbmd0aA0KCQkkc3RyaW5nWydzaXplJ10gKz0gMjsNCg0KCQlyZXR1cm4gJHN0cmluZzsNCgl9DQoNCg0KCS8qKg0KCSAqIFJlYWQgVW5pY29kZSBzdHJpbmcgd2l0aCBubyBzdHJpbmcgbGVuZ3RoIGZpZWxkLCBidXQgd2l0aCBrbm93biBjaGFyYWN0ZXIgY291bnQNCgkgKiB0aGlzIGZ1bmN0aW9uIGlzIHVuZGVyIGNvbnN0cnVjdGlvbiwgbmVlZHMgdG8gc3VwcG9ydCByaWNoIHRleHQsIGFuZCBBc2lhbiBwaG9uZXRpYyBzZXR0aW5ncw0KCSAqIE9wZW5PZmZpY2Uub3JnJ3MgRG9jdW1lbnRhdGlvbiBvZiB0aGUgTWljcm9zb2Z0IEV4Y2VsIEZpbGUgRm9ybWF0LCBzZWN0aW9uIDIuNS4zDQoJICoNCgkgKiBAcGFyYW0gc3RyaW5nICRzdWJEYXRhDQoJICogQHBhcmFtIGludCAkY2hhcmFjdGVyQ291bnQNCgkgKiBAcmV0dXJuIGFycmF5DQoJICovDQoJcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gX3JlYWRVbmljb2RlU3RyaW5nKCRzdWJEYXRhLCAkY2hhcmFjdGVyQ291bnQpDQoJew0KCQkkdmFsdWUgPSAnJzsNCg0KCQkvLyBvZmZzZXQ6IDA6IHNpemU6IDE7IG9wdGlvbiBmbGFncw0KDQoJCQkvLyBiaXQ6IDA7IG1hc2s6IDB4MDE7IGNoYXJhY3RlciBjb21wcmVzc2lvbiAoMCA9IGNvbXByZXNzZWQgOC1iaXQsIDEgPSB1bmNvbXByZXNzZWQgMTYtYml0KQ0KCQkJJGlzQ29tcHJlc3NlZCA9ICEoKDB4MDEgJiBvcmQoJHN1YkRhdGFbMF0pKSA+PiAwKTsNCg0KCQkJLy8gYml0OiAyOyBtYXNrOiAweDA0OyBBc2lhbiBwaG9uZXRpYyBzZXR0aW5ncw0KCQkJJGhhc0FzaWFuID0gKDB4MDQpICYgb3JkKCRzdWJEYXRhWzBdKSA+PiAyOw0KDQoJCQkvLyBiaXQ6IDM7IG1hc2s6IDB4MDg7IFJpY2gtVGV4dCBzZXR0aW5ncw0KCQkJJGhhc1JpY2hUZXh0ID0gKDB4MDgpICYgb3JkKCRzdWJEYXRhWzBdKSA+PiAzOw0KDQoJCS8vIG9mZnNldDogMTogc2l6ZTogdmFyOyBjaGFyYWN0ZXIgYXJyYXkNCgkJLy8gdGhpcyBvZmZzZXQgYXNzdW1lcyByaWNodGV4dCBhbmQgQXNpYW4gcGhvbmV0aWMgc2V0dGluZ3MgYXJlIG9mZiB3aGljaCBpcyBnZW5lcmFsbHkgd3JvbmcNCgkJLy8gbmVlZHMgdG8gYmUgZml4ZWQNCgkJJHZhbHVlID0gc2VsZjo6X2VuY29kZVVURjE2KHN1YnN0cigkc3ViRGF0YSwgMSwgJGlzQ29tcHJlc3NlZCA/ICRjaGFyYWN0ZXJDb3VudCA6IDIgKiAkY2hhcmFjdGVyQ291bnQpLCAkaXNDb21wcmVzc2VkKTsNCg0KCQlyZXR1cm4gYXJyYXkoDQoJCQkndmFsdWUnID0+ICR2YWx1ZSwNCgkJCSdzaXplJyA9PiAkaXNDb21wcmVzc2VkID8gMSArICRjaGFyYWN0ZXJDb3VudCA6IDEgKyAyICogJGNoYXJhY3RlckNvdW50LCAvLyB0aGUgc2l6ZSBpbiBieXRlcyBpbmNsdWRpbmcgdGhlIG9wdGlvbiBmbGFncw0KCQkpOw0KCX0NCg0KDQoJLyoqDQoJICogQ29udmVydCBVVEYtOCBzdHJpbmcgdG8gc3RyaW5nIHN1cm91bmRlZCBieSBkb3VibGUgcXVvdGVzLiBVc2VkIGZvciBleHBsaWNpdCBzdHJpbmcgdG9rZW5zIGluIGZvcm11bGFzLg0KCSAqIEV4YW1wbGU6ICBoZWxsbyJ3b3JsZCAgLS0+ICAiaGVsbG8iIndvcmxkIg0KCSAqDQoJICogQHBhcmFtIHN0cmluZyAkdmFsdWUgVVRGLTggZW5jb2RlZCBzdHJpbmcNCgkgKiBAcmV0dXJuIHN0cmluZw0KCSAqLw0KCXByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIF9VVEY4dG9FeGNlbERvdWJsZVF1b3RlZCgkdmFsdWUpDQoJew0KCQlyZXR1cm4gJyInIC4gc3RyX3JlcGxhY2UoJyInLCAnIiInLCAkdmFsdWUpIC4gJyInOw0KCX0NCg0KDQoJLyoqDQoJICogUmVhZHMgZmlyc3QgOCBieXRlcyBvZiBhIHN0cmluZyBhbmQgcmV0dXJuIElFRUUgNzU0IGZsb2F0DQoJICoNCgkgKiBAcGFyYW0gc3RyaW5nICRkYXRhIEJpbmFyeSBzdHJpbmcgdGhhdCBpcyBhdCBsZWFzdCA4IGJ5dGVzIGxvbmcNCgkgKiBAcmV0dXJuIGZsb2F0DQoJICovDQoJcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gX2V4dHJhY3ROdW1iZXIoJGRhdGEpDQoJew0KCQkkcmtudW1oaWdoID0gc2VsZjo6X0dldEludDRkKCRkYXRhLCA0KTsNCgkJJHJrbnVtbG93ID0gc2VsZjo6X0dldEludDRkKCRkYXRhLCAwKTsNCgkJJHNpZ24gPSAoJHJrbnVtaGlnaCAmIDB4ODAwMDAwMDApID4+IDMxOw0KCQkkZXhwID0gKCgkcmtudW1oaWdoICYgMHg3ZmYwMDAwMCkgPj4gMjApIC0gMTAyMzsNCgkJJG1hbnRpc3NhID0gKDB4MTAwMDAwIHwgKCRya251bWhpZ2ggJiAweDAwMGZmZmZmKSk7DQoJCSRtYW50aXNzYWxvdzEgPSAoJHJrbnVtbG93ICYgMHg4MDAwMDAwMCkgPj4gMzE7DQoJCSRtYW50aXNzYWxvdzIgPSAoJHJrbnVtbG93ICYgMHg3ZmZmZmZmZik7DQoJCSR2YWx1ZSA9ICRtYW50aXNzYSAvIHBvdyggMiAsICgyMCAtICRleHApKTsNCg0KCQlpZiAoJG1hbnRpc3NhbG93MSAhPSAwKSB7DQoJCQkkdmFsdWUgKz0gMSAvIHBvdyAoMiAsICgyMSAtICRleHApKTsNCgkJfQ0KDQoJCSR2YWx1ZSArPSAkbWFudGlzc2Fsb3cyIC8gcG93ICgyICwgKDUyIC0gJGV4cCkpOw0KCQlpZiAoJHNpZ24pIHsNCgkJCSR2YWx1ZSAqPSAtMTsNCgkJfQ0KDQoJCXJldHVybiAkdmFsdWU7DQoJfQ0KDQoNCglwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBfR2V0SUVFRTc1NCgkcmtudW0pDQoJew0KCQlpZiAoKCRya251bSAmIDB4MDIpICE9IDApIHsNCgkJCSR2YWx1ZSA9ICRya251bSA+PiAyOw0KCQl9IGVsc2Ugew0KCQkJLy8gY2hhbmdlcyBieSBtbXAsIGluZm8gb24gSUVFRTc1NCBlbmNvZGluZyBmcm9tDQoJCQkvLyByZXNlYXJjaC5taWNyb3NvZnQuY29tL35ob2xsYXNjaC9jZ2luZGV4L2NvZGluZy9pZWVlZmxvYXQuaHRtbA0KCQkJLy8gVGhlIFJLIGZvcm1hdCBjYWxscyBmb3IgdXNpbmcgb25seSB0aGUgbW9zdCBzaWduaWZpY2FudCAzMCBiaXRzDQoJCQkvLyBvZiB0aGUgNjQgYml0IGZsb2F0aW5nIHBvaW50IHZhbHVlLiBUaGUgb3RoZXIgMzQgYml0cyBhcmUgYXNzdW1lZA0KCQkJLy8gdG8gYmUgMCBzbyB3ZSB1c2UgdGhlIHVwcGVyIDMwIGJpdHMgb2YgJHJrbnVtIGFzIGZvbGxvd3MuLi4NCgkJCSRzaWduID0gKCRya251bSAmIDB4ODAwMDAwMDApID4+IDMxOw0KCQkJJGV4cCA9ICgkcmtudW0gJiAweDdmZjAwMDAwKSA+PiAyMDsNCgkJCSRtYW50aXNzYSA9ICgweDEwMDAwMCB8ICgkcmtudW0gJiAweDAwMGZmZmZjKSk7DQoJCQkkdmFsdWUgPSAkbWFudGlzc2EgLyBwb3coIDIgLCAoMjAtICgkZXhwIC0gMTAyMykpKTsNCgkJCWlmICgkc2lnbikgew0KCQkJCSR2YWx1ZSA9IC0xICogJHZhbHVlOw0KCQkJfQ0KCQkJLy9lbmQgb2YgY2hhbmdlcyBieSBtbXANCgkJfQ0KCQlpZiAoKCRya251bSAmIDB4MDEpICE9IDApIHsNCgkJCSR2YWx1ZSAvPSAxMDA7DQoJCX0NCgkJcmV0dXJuICR2YWx1ZTsNCgl9DQoNCg0KCS8qKg0KCSAqIEdldCBVVEYtOCBzdHJpbmcgZnJvbSAoY29tcHJlc3NlZCBvciB1bmNvbXByZXNzZWQpIFVURi0xNiBzdHJpbmcNCgkgKg0KCSAqIEBwYXJhbSBzdHJpbmcgJHN0cmluZw0KCSAqIEBwYXJhbSBib29sICRjb21wcmVzc2VkDQoJICogQHJldHVybiBzdHJpbmcNCgkgKi8NCglwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBfZW5jb2RlVVRGMTYoJHN0cmluZywgJGNvbXByZXNzZWQgPSAnJykNCgl7DQoJCWlmICgkY29tcHJlc3NlZCkgew0KCQkJJHN0cmluZyA9IHNlbGY6Ol91bmNvbXByZXNzQnl0ZVN0cmluZygkc3RyaW5nKTsNCiAJCX0NCg0KCQlyZXR1cm4gUEhQRXhjZWxfU2hhcmVkX1N0cmluZzo6Q29udmVydEVuY29kaW5nKCRzdHJpbmcsICdVVEYtOCcsICdVVEYtMTZMRScpOw0KCX0NCg0KDQoJLyoqDQoJICogQ29udmVydCBVVEYtMTYgc3RyaW5nIGluIGNvbXByZXNzZWQgbm90YXRpb24gdG8gdW5jb21wcmVzc2VkIGZvcm0uIE9ubHkgdXNlZCBmb3IgQklGRjguDQoJICoNCgkgKiBAcGFyYW0gc3RyaW5nICRzdHJpbmcNCgkgKiBAcmV0dXJuIHN0cmluZw0KCSAqLw0KCXByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIF91bmNvbXByZXNzQnl0ZVN0cmluZygkc3RyaW5nKQ0KCXsNCgkJJHVuY29tcHJlc3NlZFN0cmluZyA9ICcnOw0KCQkkc3RyTGVuID0gc3RybGVuKCRzdHJpbmcpOw0KCQlmb3IgKCRpID0gMDsgJGkgPCAkc3RyTGVuOyArKyRpKSB7DQoJCQkkdW5jb21wcmVzc2VkU3RyaW5nIC49ICRzdHJpbmdbJGldIC4gIlwwIjsNCgkJfQ0KDQoJCXJldHVybiAkdW5jb21wcmVzc2VkU3RyaW5nOw0KCX0NCg0KDQoJLyoqDQoJICogQ29udmVydCBzdHJpbmcgdG8gVVRGLTguIE9ubHkgdXNlZCBmb3IgQklGRjUuDQoJICoNCgkgKiBAcGFyYW0gc3RyaW5nICRzdHJpbmcNCgkgKiBAcmV0dXJuIHN0cmluZw0KCSAqLw0KCXByaXZhdGUgZnVuY3Rpb24gX2RlY29kZUNvZGVwYWdlKCRzdHJpbmcpDQoJew0KCQlyZXR1cm4gUEhQRXhjZWxfU2hhcmVkX1N0cmluZzo6Q29udmVydEVuY29kaW5nKCRzdHJpbmcsICdVVEYtOCcsICR0aGlzLT5fY29kZXBhZ2UpOw0KCX0NCg0KDQoJLyoqDQoJICogUmVhZCAxNi1iaXQgdW5zaWduZWQgaW50ZWdlcg0KCSAqDQoJICogQHBhcmFtIHN0cmluZyAkZGF0YQ0KCSAqIEBwYXJhbSBpbnQgJHBvcw0KCSAqIEByZXR1cm4gaW50DQoJICovDQoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBfR2V0SW50MmQoJGRhdGEsICRwb3MpDQoJew0KCQlyZXR1cm4gb3JkKCRkYXRhWyRwb3NdKSB8IChvcmQoJGRhdGFbJHBvcysxXSkgPDwgOCk7DQoJfQ0KDQoNCgkvKioNCgkgKiBSZWFkIDMyLWJpdCBzaWduZWQgaW50ZWdlcg0KCSAqDQoJICogQHBhcmFtIHN0cmluZyAkZGF0YQ0KCSAqIEBwYXJhbSBpbnQgJHBvcw0KCSAqIEByZXR1cm4gaW50DQoJICovDQoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBfR2V0SW50NGQoJGRhdGEsICRwb3MpDQoJew0KCQkvLyBGSVg6IHJlcHJlc2VudCBudW1iZXJzIGNvcnJlY3RseSBvbiA2NC1iaXQgc3lzdGVtDQoJCS8vIGh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvdHJhY2tlci9pbmRleC5waHA/ZnVuYz1kZXRhaWwmYWlkPTE0ODczNzImZ3JvdXBfaWQ9OTkxNjAmYXRpZD02MjMzMzQNCgkJLy8gSGFja2VkIGJ5IEFuZHJlYXMgUmVobSAyMDA2IHRvIGVuc3VyZSBjb3JyZWN0IHJlc3VsdCBvZiB0aGUgPDwyNCBibG9jayBvbiAzMiBhbmQgNjRiaXQgc3lzdGVtcw0KCQkkX29yXzI0ID0gb3JkKCRkYXRhWyRwb3MgKyAzXSk7DQoJCWlmICgkX29yXzI0ID49IDEyOCkgew0KCQkJLy8gbmVnYXRpdmUgbnVtYmVyDQoJCQkkX29yZF8yNCA9IC1hYnMoKDI1NiAtICRfb3JfMjQpIDw8IDI0KTsNCgkJfSBlbHNlIHsNCgkJCSRfb3JkXzI0ID0gKCRfb3JfMjQgJiAxMjcpIDw8IDI0Ow0KCQl9DQoJCXJldHVybiBvcmQoJGRhdGFbJHBvc10pIHwgKG9yZCgkZGF0YVskcG9zKzFdKSA8PCA4KSB8IChvcmQoJGRhdGFbJHBvcysyXSkgPDwgMTYpIHwgJF9vcmRfMjQ7DQoJfQ0KDQoNCgkvKioNCgkgKiBSZWFkIGNvbG9yDQoJICoNCgkgKiBAcGFyYW0gaW50ICRjb2xvciBJbmRleGVkIGNvbG9yDQoJICogQHBhcmFtIGFycmF5ICRwYWxldHRlIENvbG9yIHBhbGV0dGUNCgkgKiBAcmV0dXJuIGFycmF5IFJHQiBjb2xvciB2YWx1ZSwgZXhhbXBsZTogYXJyYXkoJ3JnYicgPT4gJ0ZGMDAwMCcpDQoJICovDQoJcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gX3JlYWRDb2xvcigkY29sb3IsJHBhbGV0dGUsJHZlcnNpb24pDQoJew0KCQlpZiAoJGNvbG9yIDw9IDB4MDcgfHwgJGNvbG9yID49IDB4NDApIHsNCgkJCS8vIHNwZWNpYWwgYnVpbHQtaW4gY29sb3INCgkJCXJldHVybiBzZWxmOjpfbWFwQnVpbHRJbkNvbG9yKCRjb2xvcik7DQoJCX0gZWxzZWlmIChpc3NldCgkcGFsZXR0ZSkgJiYgaXNzZXQoJHBhbGV0dGVbJGNvbG9yIC0gOF0pKSB7DQoJCQkvLyBwYWxldHRlIGNvbG9yLCBjb2xvciBpbmRleCAweDA4IG1hcHMgdG8gcGFsbGV0ZSBpbmRleCAwDQoJCQlyZXR1cm4gJHBhbGV0dGVbJGNvbG9yIC0gOF07DQoJCX0gZWxzZSB7DQoJCQkvLyBkZWZhdWx0IGNvbG9yIHRhYmxlDQoJCQlpZiAoJHZlcnNpb24gPT0gc2VsZjo6WExTX0JJRkY4KSB7DQoJCQkJcmV0dXJuIHNlbGY6Ol9tYXBDb2xvcigkY29sb3IpOw0KCQkJfSBlbHNlIHsNCgkJCQkvLyBCSUZGNQ0KCQkJCXJldHVybiBzZWxmOjpfbWFwQ29sb3JCSUZGNSgkY29sb3IpOw0KCQkJfQ0KCQl9DQoNCgkJcmV0dXJuICRjb2xvcjsNCgl9DQoNCg0KCS8qKg0KCSAqIE1hcCBib3JkZXIgc3R5bGUNCgkgKiBPcGVuT2ZmaWNlIGRvY3VtZW50YXRpb246IDIuNS4xMQ0KCSAqDQoJICogQHBhcmFtIGludCAkaW5kZXgNCgkgKiBAcmV0dXJuIHN0cmluZw0KCSAqLw0KCXByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIF9tYXBCb3JkZXJTdHlsZSgkaW5kZXgpDQoJew0KCQlzd2l0Y2ggKCRpbmRleCkgew0KCQkJY2FzZSAweDAwOiByZXR1cm4gUEhQRXhjZWxfU3R5bGVfQm9yZGVyOjpCT1JERVJfTk9ORTsNCgkJCWNhc2UgMHgwMTogcmV0dXJuIFBIUEV4Y2VsX1N0eWxlX0JvcmRlcjo6Qk9SREVSX1RISU47DQoJCQljYXNlIDB4MDI6IHJldHVybiBQSFBFeGNlbF9TdHlsZV9Cb3JkZXI6OkJPUkRFUl9NRURJVU07DQoJCQljYXNlIDB4MDM6IHJldHVybiBQSFBFeGNlbF9TdHlsZV9Cb3JkZXI6OkJPUkRFUl9EQVNIRUQ7DQoJCQljYXNlIDB4MDQ6IHJldHVybiBQSFBFeGNlbF9TdHlsZV9Cb3JkZXI6OkJPUkRFUl9ET1RURUQ7DQoJCQljYXNlIDB4MDU6IHJldHVybiBQSFBFeGNlbF9TdHlsZV9Cb3JkZXI6OkJPUkRFUl9USElDSzsNCgkJCWNhc2UgMHgwNjogcmV0dXJuIFBIUEV4Y2VsX1N0eWxlX0JvcmRlcjo6Qk9SREVSX0RPVUJMRTsNCgkJCWNhc2UgMHgwNzogcmV0dXJuIFBIUEV4Y2VsX1N0eWxlX0JvcmRlcjo6Qk9SREVSX0hBSVI7DQoJCQljYXNlIDB4MDg6IHJldHVybiBQSFBFeGNlbF9TdHlsZV9Cb3JkZXI6OkJPUkRFUl9NRURJVU1EQVNIRUQ7DQoJCQljYXNlIDB4MDk6IHJldHVybiBQSFBFeGNlbF9TdHlsZV9Cb3JkZXI6OkJPUkRFUl9EQVNIRE9UOw0KCQkJY2FzZSAweDBBOiByZXR1cm4gUEhQRXhjZWxfU3R5bGVfQm9yZGVyOjpCT1JERVJfTUVESVVNREFTSERPVDsNCgkJCWNhc2UgMHgwQjogcmV0dXJuIFBIUEV4Y2VsX1N0eWxlX0JvcmRlcjo6Qk9SREVSX0RBU0hET1RET1Q7DQoJCQljYXNlIDB4MEM6IHJldHVybiBQSFBFeGNlbF9TdHlsZV9Cb3JkZXI6OkJPUkRFUl9NRURJVU1EQVNIRE9URE9UOw0KCQkJY2FzZSAweDBEOiByZXR1cm4gUEhQRXhjZWxfU3R5bGVfQm9yZGVyOjpCT1JERVJfU0xBTlREQVNIRE9UOw0KCQkJZGVmYXVsdDogICByZXR1cm4gUEhQRXhjZWxfU3R5bGVfQm9yZGVyOjpCT1JERVJfTk9ORTsNCgkJfQ0KCX0NCg0KDQoJLyoqDQoJICogR2V0IGZpbGwgcGF0dGVybiBmcm9tIGluZGV4DQoJICogT3Blbk9mZmljZSBkb2N1bWVudGF0aW9uOiAyLjUuMTINCgkgKg0KCSAqIEBwYXJhbSBpbnQgJGluZGV4DQoJICogQHJldHVybiBzdHJpbmcNCgkgKi8NCglwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBfbWFwRmlsbFBhdHRlcm4oJGluZGV4KQ0KCXsNCgkJc3dpdGNoICgkaW5kZXgpIHsNCgkJCWNhc2UgMHgwMDogcmV0dXJuIFBIUEV4Y2VsX1N0eWxlX0ZpbGw6OkZJTExfTk9ORTsNCgkJCWNhc2UgMHgwMTogcmV0dXJuIFBIUEV4Y2VsX1N0eWxlX0ZpbGw6OkZJTExfU09MSUQ7DQoJCQljYXNlIDB4MDI6IHJldHVybiBQSFBFeGNlbF9TdHlsZV9GaWxsOjpGSUxMX1BBVFRFUk5fTUVESVVNR1JBWTsNCgkJCWNhc2UgMHgwMzogcmV0dXJuIFBIUEV4Y2VsX1N0eWxlX0ZpbGw6OkZJTExfUEFUVEVSTl9EQVJLR1JBWTsNCgkJCWNhc2UgMHgwNDogcmV0dXJuIFBIUEV4Y2VsX1N0eWxlX0ZpbGw6OkZJTExfUEFUVEVSTl9MSUdIVEdSQVk7DQoJCQljYXNlIDB4MDU6IHJldHVybiBQSFBFeGNlbF9TdHlsZV9GaWxsOjpGSUxMX1BBVFRFUk5fREFSS0hPUklaT05UQUw7DQoJCQljYXNlIDB4MDY6IHJldHVybiBQSFBFeGNlbF9TdHlsZV9GaWxsOjpGSUxMX1BBVFRFUk5fREFSS1ZFUlRJQ0FMOw0KCQkJY2FzZSAweDA3OiByZXR1cm4gUEhQRXhjZWxfU3R5bGVfRmlsbDo6RklMTF9QQVRURVJOX0RBUktET1dOOw0KCQkJY2FzZSAweDA4OiByZXR1cm4gUEhQRXhjZWxfU3R5bGVfRmlsbDo6RklMTF9QQVRURVJOX0RBUktVUDsNCgkJCWNhc2UgMHgwOTogcmV0dXJuIFBIUEV4Y2VsX1N0eWxlX0ZpbGw6OkZJTExfUEFUVEVSTl9EQVJLR1JJRDsNCgkJCWNhc2UgMHgwQTogcmV0dXJuIFBIUEV4Y2VsX1N0eWxlX0ZpbGw6OkZJTExfUEFUVEVSTl9EQVJLVFJFTExJUzsNCgkJCWNhc2UgMHgwQjogcmV0dXJuIFBIUEV4Y2VsX1N0eWxlX0ZpbGw6OkZJTExfUEFUVEVSTl9MSUdIVEhPUklaT05UQUw7DQoJCQljYXNlIDB4MEM6IHJldHVybiBQSFBFeGNlbF9TdHlsZV9GaWxsOjpGSUxMX1BBVFRFUk5fTElHSFRWRVJUSUNBTDsNCgkJCWNhc2UgMHgwRDogcmV0dXJuIFBIUEV4Y2VsX1N0eWxlX0ZpbGw6OkZJTExfUEFUVEVSTl9MSUdIVERPV047DQoJCQljYXNlIDB4MEU6IHJldHVybiBQSFBFeGNlbF9TdHlsZV9GaWxsOjpGSUxMX1BBVFRFUk5fTElHSFRVUDsNCgkJCWNhc2UgMHgwRjogcmV0dXJuIFBIUEV4Y2VsX1N0eWxlX0ZpbGw6OkZJTExfUEFUVEVSTl9MSUdIVEdSSUQ7DQoJCQljYXNlIDB4MTA6IHJldHVybiBQSFBFeGNlbF9TdHlsZV9GaWxsOjpGSUxMX1BBVFRFUk5fTElHSFRUUkVMTElTOw0KCQkJY2FzZSAweDExOiByZXR1cm4gUEhQRXhjZWxfU3R5bGVfRmlsbDo6RklMTF9QQVRURVJOX0dSQVkxMjU7DQoJCQljYXNlIDB4MTI6IHJldHVybiBQSFBFeGNlbF9TdHlsZV9GaWxsOjpGSUxMX1BBVFRFUk5fR1JBWTA2MjU7DQoJCQlkZWZhdWx0OiAgIHJldHVybiBQSFBFeGNlbF9TdHlsZV9GaWxsOjpGSUxMX05PTkU7DQoJCX0NCgl9DQoNCg0KCS8qKg0KCSAqIE1hcCBlcnJvciBjb2RlLCBlLmcuICcjTi9BJw0KCSAqDQoJICogQHBhcmFtIGludCAkc3ViRGF0YQ0KCSAqIEByZXR1cm4gc3RyaW5nDQoJICovDQoJcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gX21hcEVycm9yQ29kZSgkc3ViRGF0YSkNCgl7DQoJCXN3aXRjaCAoJHN1YkRhdGEpIHsNCgkJCWNhc2UgMHgwMDogcmV0dXJuICcjTlVMTCEnOwkJYnJlYWs7DQoJCQljYXNlIDB4MDc6IHJldHVybiAnI0RJVi8wISc7CWJyZWFrOw0KCQkJY2FzZSAweDBGOiByZXR1cm4gJyNWQUxVRSEnOwlicmVhazsNCgkJCWNhc2UgMHgxNzogcmV0dXJuICcjUkVGISc7CQlicmVhazsNCgkJCWNhc2UgMHgxRDogcmV0dXJuICcjTkFNRT8nOwkJYnJlYWs7DQoJCQljYXNlIDB4MjQ6IHJldHVybiAnI05VTSEnOwkJYnJlYWs7DQoJCQljYXNlIDB4MkE6IHJldHVybiAnI04vQSc7CQlicmVhazsNCgkJCWRlZmF1bHQ6IHJldHVybiBmYWxzZTsNCgkJfQ0KCX0NCg0KDQoJLyoqDQoJICogTWFwIGJ1aWx0LWluIGNvbG9yIHRvIFJHQiB2YWx1ZQ0KCSAqDQoJICogQHBhcmFtIGludCAkY29sb3IgSW5kZXhlZCBjb2xvcg0KCSAqIEByZXR1cm4gYXJyYXkNCgkgKi8NCglwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBfbWFwQnVpbHRJbkNvbG9yKCRjb2xvcikNCgl7DQoJCXN3aXRjaCAoJGNvbG9yKSB7DQoJCQljYXNlIDB4MDA6IHJldHVybiBhcnJheSgncmdiJyA9PiAnMDAwMDAwJyk7DQoJCQljYXNlIDB4MDE6IHJldHVybiBhcnJheSgncmdiJyA9PiAnRkZGRkZGJyk7DQoJCQljYXNlIDB4MDI6IHJldHVybiBhcnJheSgncmdiJyA9PiAnRkYwMDAwJyk7DQoJCQljYXNlIDB4MDM6IHJldHVybiBhcnJheSgncmdiJyA9PiAnMDBGRjAwJyk7DQoJCQljYXNlIDB4MDQ6IHJldHVybiBhcnJheSgncmdiJyA9PiAnMDAwMEZGJyk7DQoJCQljYXNlIDB4MDU6IHJldHVybiBhcnJheSgncmdiJyA9PiAnRkZGRjAwJyk7DQoJCQljYXNlIDB4MDY6IHJldHVybiBhcnJheSgncmdiJyA9PiAnRkYwMEZGJyk7DQoJCQljYXNlIDB4MDc6IHJldHVybiBhcnJheSgncmdiJyA9PiAnMDBGRkZGJyk7DQoJCQljYXNlIDB4NDA6IHJldHVybiBhcnJheSgncmdiJyA9PiAnMDAwMDAwJyk7IC8vIHN5c3RlbSB3aW5kb3cgdGV4dCBjb2xvcg0KCQkJY2FzZSAweDQxOiByZXR1cm4gYXJyYXkoJ3JnYicgPT4gJ0ZGRkZGRicpOyAvLyBzeXN0ZW0gd2luZG93IGJhY2tncm91bmQgY29sb3INCgkJCWRlZmF1bHQ6ICAgcmV0dXJuIGFycmF5KCdyZ2InID0+ICcwMDAwMDAnKTsNCgkJfQ0KCX0NCg0KDQoJLyoqDQoJICogTWFwIGNvbG9yIGFycmF5IGZyb20gQklGRjUgYnVpbHQtaW4gY29sb3IgaW5kZXgNCgkgKg0KCSAqIEBwYXJhbSBpbnQgJHN1YkRhdGENCgkgKiBAcmV0dXJuIGFycmF5DQoJICovDQoJcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gX21hcENvbG9yQklGRjUoJHN1YkRhdGEpDQoJew0KCQlzd2l0Y2ggKCRzdWJEYXRhKSB7DQoJCQljYXNlIDB4MDg6IHJldHVybiBhcnJheSgncmdiJyA9PiAnMDAwMDAwJyk7DQoJCQljYXNlIDB4MDk6IHJldHVybiBhcnJheSgncmdiJyA9PiAnRkZGRkZGJyk7DQoJCQljYXNlIDB4MEE6IHJldHVybiBhcnJheSgncmdiJyA9PiAnRkYwMDAwJyk7DQoJCQljYXNlIDB4MEI6IHJldHVybiBhcnJheSgncmdiJyA9PiAnMDBGRjAwJyk7DQoJCQljYXNlIDB4MEM6IHJldHVybiBhcnJheSgncmdiJyA9PiAnMDAwMEZGJyk7DQoJCQljYXNlIDB4MEQ6IHJldHVybiBhcnJheSgncmdiJyA9PiAnRkZGRjAwJyk7DQoJCQljYXNlIDB4MEU6IHJldHVybiBhcnJheSgncmdiJyA9PiAnRkYwMEZGJyk7DQoJCQljYXNlIDB4MEY6IHJldHVybiBhcnJheSgncmdiJyA9PiAnMDBGRkZGJyk7DQoJCQljYXNlIDB4MTA6IHJldHVybiBhcnJheSgncmdiJyA9PiAnODAwMDAwJyk7DQoJCQljYXNlIDB4MTE6IHJldHVybiBhcnJheSgncmdiJyA9PiAnMDA4MDAwJyk7DQoJCQljYXNlIDB4MTI6IHJldHVybiBhcnJheSgncmdiJyA9PiAnMDAwMDgwJyk7DQoJCQljYXNlIDB4MTM6IHJldHVybiBhcnJheSgncmdiJyA9PiAnODA4MDAwJyk7DQoJCQljYXNlIDB4MTQ6IHJldHVybiBhcnJheSgncmdiJyA9PiAnODAwMDgwJyk7DQoJCQljYXNlIDB4MTU6IHJldHVybiBhcnJheSgncmdiJyA9PiAnMDA4MDgwJyk7DQoJCQljYXNlIDB4MTY6IHJldHVybiBhcnJheSgncmdiJyA9PiAnQzBDMEMwJyk7DQoJCQljYXNlIDB4MTc6IHJldHVybiBhcnJheSgncmdiJyA9PiAnODA4MDgwJyk7DQoJCQljYXNlIDB4MTg6IHJldHVybiBhcnJheSgncmdiJyA9PiAnODA4MEZGJyk7DQoJCQljYXNlIDB4MTk6IHJldHVybiBhcnJheSgncmdiJyA9PiAnODAyMDYwJyk7DQoJCQljYXNlIDB4MUE6IHJldHVybiBhcnJheSgncmdiJyA9PiAnRkZGRkMwJyk7DQoJCQljYXNlIDB4MUI6IHJldHVybiBhcnJheSgncmdiJyA9PiAnQTBFMEYwJyk7DQoJCQljYXNlIDB4MUM6IHJldHVybiBhcnJheSgncmdiJyA9PiAnNjAwMDgwJyk7DQoJCQljYXNlIDB4MUQ6IHJldHVybiBhcnJheSgncmdiJyA9PiAnRkY4MDgwJyk7DQoJCQljYXNlIDB4MUU6IHJldHVybiBhcnJheSgncmdiJyA9PiAnMDA4MEMwJyk7DQoJCQljYXNlIDB4MUY6IHJldHVybiBhcnJheSgncmdiJyA9PiAnQzBDMEZGJyk7DQoJCQljYXNlIDB4MjA6IHJldHVybiBhcnJheSgncmdiJyA9PiAnMDAwMDgwJyk7DQoJCQljYXNlIDB4MjE6IHJldHVybiBhcnJheSgncmdiJyA9PiAnRkYwMEZGJyk7DQoJCQljYXNlIDB4MjI6IHJldHVybiBhcnJheSgncmdiJyA9PiAnRkZGRjAwJyk7DQoJCQljYXNlIDB4MjM6IHJldHVybiBhcnJheSgncmdiJyA9PiAnMDBGRkZGJyk7DQoJCQljYXNlIDB4MjQ6IHJldHVybiBhcnJheSgncmdiJyA9PiAnODAwMDgwJyk7DQoJCQljYXNlIDB4MjU6IHJldHVybiBhcnJheSgncmdiJyA9PiAnODAwMDAwJyk7DQoJCQljYXNlIDB4MjY6IHJldHVybiBhcnJheSgncmdiJyA9PiAnMDA4MDgwJyk7DQoJCQljYXNlIDB4Mjc6IHJldHVybiBhcnJheSgncmdiJyA9PiAnMDAwMEZGJyk7DQoJCQljYXNlIDB4Mjg6IHJldHVybiBhcnJheSgncmdiJyA9PiAnMDBDRkZGJyk7DQoJCQljYXNlIDB4Mjk6IHJldHVybiBhcnJheSgncmdiJyA9PiAnNjlGRkZGJyk7DQoJCQljYXNlIDB4MkE6IHJldHVybiBhcnJheSgncmdiJyA9PiAnRTBGRkUwJyk7DQoJCQljYXNlIDB4MkI6IHJldHVybiBhcnJheSgncmdiJyA9PiAnRkZGRjgwJyk7DQoJCQljYXNlIDB4MkM6IHJldHVybiBhcnJheSgncmdiJyA9PiAnQTZDQUYwJyk7DQoJCQljYXNlIDB4MkQ6IHJldHVybiBhcnJheSgncmdiJyA9PiAnREQ5Q0IzJyk7DQoJCQljYXNlIDB4MkU6IHJldHVybiBhcnJheSgncmdiJyA9PiAnQjM4RkVFJyk7DQoJCQljYXNlIDB4MkY6IHJldHVybiBhcnJheSgncmdiJyA9PiAnRTNFM0UzJyk7DQoJCQljYXNlIDB4MzA6IHJldHVybiBhcnJheSgncmdiJyA9PiAnMkE2RkY5Jyk7DQoJCQljYXNlIDB4MzE6IHJldHVybiBhcnJheSgncmdiJyA9PiAnM0ZCOENEJyk7DQoJCQljYXNlIDB4MzI6IHJldHVybiBhcnJheSgncmdiJyA9PiAnNDg4NDM2Jyk7DQoJCQljYXNlIDB4MzM6IHJldHVybiBhcnJheSgncmdiJyA9PiAnOTU4QzQxJyk7DQoJCQljYXNlIDB4MzQ6IHJldHVybiBhcnJheSgncmdiJyA9PiAnOEU1RTQyJyk7DQoJCQljYXNlIDB4MzU6IHJldHVybiBhcnJheSgncmdiJyA9PiAnQTA2MjdBJyk7DQoJCQljYXNlIDB4MzY6IHJldHVybiBhcnJheSgncmdiJyA9PiAnNjI0RkFDJyk7DQoJCQljYXNlIDB4Mzc6IHJldHVybiBhcnJheSgncmdiJyA9PiAnOTY5Njk2Jyk7DQoJCQljYXNlIDB4Mzg6IHJldHVybiBhcnJheSgncmdiJyA9PiAnMUQyRkJFJyk7DQoJCQljYXNlIDB4Mzk6IHJldHVybiBhcnJheSgncmdiJyA9PiAnMjg2Njc2Jyk7DQoJCQljYXNlIDB4M0E6IHJldHVybiBhcnJheSgncmdiJyA9PiAnMDA0NTAwJyk7DQoJCQljYXNlIDB4M0I6IHJldHVybiBhcnJheSgncmdiJyA9PiAnNDUzRTAxJyk7DQoJCQljYXNlIDB4M0M6IHJldHVybiBhcnJheSgncmdiJyA9PiAnNkEyODEzJyk7DQoJCQljYXNlIDB4M0Q6IHJldHVybiBhcnJheSgncmdiJyA9PiAnODUzOTZBJyk7DQoJCQljYXNlIDB4M0U6IHJldHVybiBhcnJheSgncmdiJyA9PiAnNEEzMjg1Jyk7DQoJCQljYXNlIDB4M0Y6IHJldHVybiBhcnJheSgncmdiJyA9PiAnNDI0MjQyJyk7DQoJCQlkZWZhdWx0OiAgIHJldHVybiBhcnJheSgncmdiJyA9PiAnMDAwMDAwJyk7DQoJCX0NCgl9DQoNCg0KCS8qKg0KCSAqIE1hcCBjb2xvciBhcnJheSBmcm9tIEJJRkY4IGJ1aWx0LWluIGNvbG9yIGluZGV4DQoJICoNCgkgKiBAcGFyYW0gaW50ICRzdWJEYXRhDQoJICogQHJldHVybiBhcnJheQ0KCSAqLw0KCXByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIF9tYXBDb2xvcigkc3ViRGF0YSkNCgl7DQoJCXN3aXRjaCAoJHN1YkRhdGEpIHsNCgkJCWNhc2UgMHgwODogcmV0dXJuIGFycmF5KCdyZ2InID0+ICcwMDAwMDAnKTsNCgkJCWNhc2UgMHgwOTogcmV0dXJuIGFycmF5KCdyZ2InID0+ICdGRkZGRkYnKTsNCgkJCWNhc2UgMHgwQTogcmV0dXJuIGFycmF5KCdyZ2InID0+ICdGRjAwMDAnKTsNCgkJCWNhc2UgMHgwQjogcmV0dXJuIGFycmF5KCdyZ2InID0+ICcwMEZGMDAnKTsNCgkJCWNhc2UgMHgwQzogcmV0dXJuIGFycmF5KCdyZ2InID0+ICcwMDAwRkYnKTsNCgkJCWNhc2UgMHgwRDogcmV0dXJuIGFycmF5KCdyZ2InID0+ICdGRkZGMDAnKTsNCgkJCWNhc2UgMHgwRTogcmV0dXJuIGFycmF5KCdyZ2InID0+ICdGRjAwRkYnKTsNCgkJCWNhc2UgMHgwRjogcmV0dXJuIGFycmF5KCdyZ2InID0+ICcwMEZGRkYnKTsNCgkJCWNhc2UgMHgxMDogcmV0dXJuIGFycmF5KCdyZ2InID0+ICc4MDAwMDAnKTsNCgkJCWNhc2UgMHgxMTogcmV0dXJuIGFycmF5KCdyZ2InID0+ICcwMDgwMDAnKTsNCgkJCWNhc2UgMHgxMjogcmV0dXJuIGFycmF5KCdyZ2InID0+ICcwMDAwODAnKTsNCgkJCWNhc2UgMHgxMzogcmV0dXJuIGFycmF5KCdyZ2InID0+ICc4MDgwMDAnKTsNCgkJCWNhc2UgMHgxNDogcmV0dXJuIGFycmF5KCdyZ2InID0+ICc4MDAwODAnKTsNCgkJCWNhc2UgMHgxNTogcmV0dXJuIGFycmF5KCdyZ2InID0+ICcwMDgwODAnKTsNCgkJCWNhc2UgMHgxNjogcmV0dXJuIGFycmF5KCdyZ2InID0+ICdDMEMwQzAnKTsNCgkJCWNhc2UgMHgxNzogcmV0dXJuIGFycmF5KCdyZ2InID0+ICc4MDgwODAnKTsNCgkJCWNhc2UgMHgxODogcmV0dXJuIGFycmF5KCdyZ2InID0+ICc5OTk5RkYnKTsNCgkJCWNhc2UgMHgxOTogcmV0dXJuIGFycmF5KCdyZ2InID0+ICc5OTMzNjYnKTsNCgkJCWNhc2UgMHgxQTogcmV0dXJuIGFycmF5KCdyZ2InID0+ICdGRkZGQ0MnKTsNCgkJCWNhc2UgMHgxQjogcmV0dXJuIGFycmF5KCdyZ2InID0+ICdDQ0ZGRkYnKTsNCgkJCWNhc2UgMHgxQzogcmV0dXJuIGFycmF5KCdyZ2InID0+ICc2NjAwNjYnKTsNCgkJCWNhc2UgMHgxRDogcmV0dXJuIGFycmF5KCdyZ2InID0+ICdGRjgwODAnKTsNCgkJCWNhc2UgMHgxRTogcmV0dXJuIGFycmF5KCdyZ2InID0+ICcwMDY2Q0MnKTsNCgkJCWNhc2UgMHgxRjogcmV0dXJuIGFycmF5KCdyZ2InID0+ICdDQ0NDRkYnKTsNCgkJCWNhc2UgMHgyMDogcmV0dXJuIGFycmF5KCdyZ2InID0+ICcwMDAwODAnKTsNCgkJCWNhc2UgMHgyMTogcmV0dXJuIGFycmF5KCdyZ2InID0+ICdGRjAwRkYnKTsNCgkJCWNhc2UgMHgyMjogcmV0dXJuIGFycmF5KCdyZ2InID0+ICdGRkZGMDAnKTsNCgkJCWNhc2UgMHgyMzogcmV0dXJuIGFycmF5KCdyZ2InID0+ICcwMEZGRkYnKTsNCgkJCWNhc2UgMHgyNDogcmV0dXJuIGFycmF5KCdyZ2InID0+ICc4MDAwODAnKTsNCgkJCWNhc2UgMHgyNTogcmV0dXJuIGFycmF5KCdyZ2InID0+ICc4MDAwMDAnKTsNCgkJCWNhc2UgMHgyNjogcmV0dXJuIGFycmF5KCdyZ2InID0+ICcwMDgwODAnKTsNCgkJCWNhc2UgMHgyNzogcmV0dXJuIGFycmF5KCdyZ2InID0+ICcwMDAwRkYnKTsNCgkJCWNhc2UgMHgyODogcmV0dXJuIGFycmF5KCdyZ2InID0+ICcwMENDRkYnKTsNCgkJCWNhc2UgMHgyOTogcmV0dXJuIGFycmF5KCdyZ2InID0+ICdDQ0ZGRkYnKTsNCgkJCWNhc2UgMHgyQTogcmV0dXJuIGFycmF5KCdyZ2InID0+ICdDQ0ZGQ0MnKTsNCgkJCWNhc2UgMHgyQjogcmV0dXJuIGFycmF5KCdyZ2InID0+ICdGRkZGOTknKTsNCgkJCWNhc2UgMHgyQzogcmV0dXJuIGFycmF5KCdyZ2InID0+ICc5OUNDRkYnKTsNCgkJCWNhc2UgMHgyRDogcmV0dXJuIGFycmF5KCdyZ2InID0+ICdGRjk5Q0MnKTsNCgkJCWNhc2UgMHgyRTogcmV0dXJuIGFycmF5KCdyZ2InID0+ICdDQzk5RkYnKTsNCgkJCWNhc2UgMHgyRjogcmV0dXJuIGFycmF5KCdyZ2InID0+ICdGRkNDOTknKTsNCgkJCWNhc2UgMHgzMDogcmV0dXJuIGFycmF5KCdyZ2InID0+ICczMzY2RkYnKTsNCgkJCWNhc2UgMHgzMTogcmV0dXJuIGFycmF5KCdyZ2InID0+ICczM0NDQ0MnKTsNCgkJCWNhc2UgMHgzMjogcmV0dXJuIGFycmF5KCdyZ2InID0+ICc5OUNDMDAnKTsNCgkJCWNhc2UgMHgzMzogcmV0dXJuIGFycmF5KCdyZ2InID0+ICdGRkNDMDAnKTsNCgkJCWNhc2UgMHgzNDogcmV0dXJuIGFycmF5KCdyZ2InID0+ICdGRjk5MDAnKTsNCgkJCWNhc2UgMHgzNTogcmV0dXJuIGFycmF5KCdyZ2InID0+ICdGRjY2MDAnKTsNCgkJCWNhc2UgMHgzNjogcmV0dXJuIGFycmF5KCdyZ2InID0+ICc2NjY2OTknKTsNCgkJCWNhc2UgMHgzNzogcmV0dXJuIGFycmF5KCdyZ2InID0+ICc5Njk2OTYnKTsNCgkJCWNhc2UgMHgzODogcmV0dXJuIGFycmF5KCdyZ2InID0+ICcwMDMzNjYnKTsNCgkJCWNhc2UgMHgzOTogcmV0dXJuIGFycmF5KCdyZ2InID0+ICczMzk5NjYnKTsNCgkJCWNhc2UgMHgzQTogcmV0dXJuIGFycmF5KCdyZ2InID0+ICcwMDMzMDAnKTsNCgkJCWNhc2UgMHgzQjogcmV0dXJuIGFycmF5KCdyZ2InID0+ICczMzMzMDAnKTsNCgkJCWNhc2UgMHgzQzogcmV0dXJuIGFycmF5KCdyZ2InID0+ICc5OTMzMDAnKTsNCgkJCWNhc2UgMHgzRDogcmV0dXJuIGFycmF5KCdyZ2InID0+ICc5OTMzNjYnKTsNCgkJCWNhc2UgMHgzRTogcmV0dXJuIGFycmF5KCdyZ2InID0+ICczMzMzOTknKTsNCgkJCWNhc2UgMHgzRjogcmV0dXJuIGFycmF5KCdyZ2InID0+ICczMzMzMzMnKTsNCgkJCWRlZmF1bHQ6ICAgcmV0dXJuIGFycmF5KCdyZ2InID0+ICcwMDAwMDAnKTsNCgkJfQ0KCX0NCg0KDQoJcHJpdmF0ZSBmdW5jdGlvbiBfcGFyc2VSaWNoVGV4dCgkaXMgPSAnJykgew0KCQkkdmFsdWUgPSBuZXcgUEhQRXhjZWxfUmljaFRleHQoKTsNCg0KCQkkdmFsdWUtPmNyZWF0ZVRleHQoJGlzKTsNCg0KCQlyZXR1cm4gJHZhbHVlOw0KCX0NCg0KfQ0K]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Reader/Excel5/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Reader/Excel5/Escher.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIFBIUEV4Y2VsCiAqCiAqIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICoKICogQGNhdGVnb3J5ICAgUEhQRXhjZWwKICogQHBhY2thZ2UgICAgUEhQRXhjZWxfUmVhZGVyX0V4Y2VsNQogKiBAY29weXJpZ2h0ICBDb3B5cmlnaHQgKGMpIDIwMDYgLSAyMDEyIFBIUEV4Y2VsIChodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9QSFBFeGNlbCkKICogQGxpY2Vuc2UgICAgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL29sZC1saWNlbnNlcy9sZ3BsLTIuMS50eHQJTEdQTAogKiBAdmVyc2lvbiAgICAxLjcuNywgMjAxMi0wNS0xOQogKi8KCi8qKgogKiBQSFBFeGNlbF9SZWFkZXJfRXhjZWw1X0VzY2hlcgogKgogKiBAY2F0ZWdvcnkgICBQSFBFeGNlbAogKiBAcGFja2FnZSAgICBQSFBFeGNlbF9SZWFkZXJfRXhjZWw1CiAqIEBjb3B5cmlnaHQgIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwgKGh0dHA6Ly93d3cuY29kZXBsZXguY29tL1BIUEV4Y2VsKQogKi8KY2xhc3MgUEhQRXhjZWxfUmVhZGVyX0V4Y2VsNV9Fc2NoZXIKewoJY29uc3QgREdHQ09OVEFJTkVSCQk9IDB4RjAwMDsKCWNvbnN0IEJTVE9SRUNPTlRBSU5FUgk9IDB4RjAwMTsKCWNvbnN0IERHQ09OVEFJTkVSCQk9IDB4RjAwMjsKCWNvbnN0IFNQR1JDT05UQUlORVIJCT0gMHhGMDAzOwoJY29uc3QgU1BDT05UQUlORVIJCT0gMHhGMDA0OwoJY29uc3QgREdHCQkJCT0gMHhGMDA2OwoJY29uc3QgQlNFCQkJCT0gMHhGMDA3OwoJY29uc3QgREcJCQkJPSAweEYwMDg7Cgljb25zdCBTUEdSCQkJCT0gMHhGMDA5OwoJY29uc3QgU1AJCQkJPSAweEYwMEE7Cgljb25zdCBPUFQJCQkJPSAweEYwMEI7Cgljb25zdCBDTElFTlRURVhUQk9YCQk9IDB4RjAwRDsKCWNvbnN0IENMSUVOVEFOQ0hPUgkJPSAweEYwMTA7Cgljb25zdCBDTElFTlREQVRBCQk9IDB4RjAxMTsKCWNvbnN0IEJMSVBKUEVHCQkJPSAweEYwMUQ7Cgljb25zdCBCTElQUE5HCQkJPSAweEYwMUU7Cgljb25zdCBTUExJVE1FTlVDT0xPUlMJPSAweEYxMUU7Cgljb25zdCBURVJUSUFSWU9QVAkJPSAweEYxMjI7CgoJLyoqCgkgKiBFc2NoZXIgc3RyZWFtIGRhdGEgKGJpbmFyeSkKCSAqCgkgKiBAdmFyIHN0cmluZwoJICovCglwcml2YXRlICRfZGF0YTsKCgkvKioKCSAqIFNpemUgaW4gYnl0ZXMgb2YgdGhlIEVzY2hlciBzdHJlYW0gZGF0YQoJICoKCSAqIEB2YXIgaW50CgkgKi8KCXByaXZhdGUgJF9kYXRhU2l6ZTsKCgkvKioKCSAqIEN1cnJlbnQgcG9zaXRpb24gb2Ygc3RyZWFtIHBvaW50ZXIgaW4gRXNjaGVyIHN0cmVhbSBkYXRhCgkgKgoJICogQHZhciBpbnQKCSAqLwoJcHJpdmF0ZSAkX3BvczsKCgkvKioKCSAqIFRoZSBvYmplY3QgdG8gYmUgcmV0dXJuZWQgYnkgdGhlIHJlYWRlci4gTW9kaWZpZWQgZHVyaW5nIGxvYWQuCgkgKgoJICogQHZhciBtaXhlZAoJICovCglwcml2YXRlICRfb2JqZWN0OwoKCS8qKgoJICogQ3JlYXRlIGEgbmV3IFBIUEV4Y2VsX1JlYWRlcl9FeGNlbDVfRXNjaGVyIGluc3RhbmNlCgkgKgoJICogQHBhcmFtIG1peGVkICRvYmplY3QKCSAqLwoJcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRvYmplY3QpCgl7CgkJJHRoaXMtPl9vYmplY3QgPSAkb2JqZWN0OwoJfQoKCS8qKgoJICogTG9hZCBFc2NoZXIgc3RyZWFtIGRhdGEuIE1heSBiZSBhIHBhcnRpYWwgRXNjaGVyIHN0cmVhbS4KCSAqCgkgKiBAcGFyYW0gc3RyaW5nICRkYXRhCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBsb2FkKCRkYXRhKQoJewoJCSR0aGlzLT5fZGF0YSA9ICRkYXRhOwoKCQkvLyB0b3RhbCBieXRlIHNpemUgb2YgRXhjZWwgZGF0YSAod29ya2Jvb2sgZ2xvYmFsIHN1YnN0cmVhbSArIHNoZWV0IHN1YnN0cmVhbXMpCgkJJHRoaXMtPl9kYXRhU2l6ZSA9IHN0cmxlbigkdGhpcy0+X2RhdGEpOwoKCQkkdGhpcy0+X3BvcyA9IDA7CgoJCS8vIFBhcnNlIEVzY2hlciBzdHJlYW0KCQl3aGlsZSAoJHRoaXMtPl9wb3MgPCAkdGhpcy0+X2RhdGFTaXplKSB7CgoJCQkvLyBvZmZzZXQ6IDI7IHNpemU6IDI6IFJlY29yZCBUeXBlCgkJCSRmYnQgPSBQSFBFeGNlbF9SZWFkZXJfRXhjZWw1OjpfR2V0SW50MmQoJHRoaXMtPl9kYXRhLCAkdGhpcy0+X3BvcyArIDIpOwoKCQkJc3dpdGNoICgkZmJ0KSB7CgkJCQljYXNlIHNlbGY6OkRHR0NPTlRBSU5FUjoJJHRoaXMtPl9yZWFkRGdnQ29udGFpbmVyKCk7CQlicmVhazsKCQkJCWNhc2Ugc2VsZjo6REdHOgkJCQkkdGhpcy0+X3JlYWREZ2coKTsJCQkJYnJlYWs7CgkJCQljYXNlIHNlbGY6OkJTVE9SRUNPTlRBSU5FUjoJJHRoaXMtPl9yZWFkQnN0b3JlQ29udGFpbmVyKCk7CWJyZWFrOwoJCQkJY2FzZSBzZWxmOjpCU0U6CQkJCSR0aGlzLT5fcmVhZEJTRSgpOwkJCQlicmVhazsKCQkJCWNhc2Ugc2VsZjo6QkxJUEpQRUc6CQkkdGhpcy0+X3JlYWRCbGlwSlBFRygpOwkJCWJyZWFrOwoJCQkJY2FzZSBzZWxmOjpCTElQUE5HOgkJCSR0aGlzLT5fcmVhZEJsaXBQTkcoKTsJCQlicmVhazsKCQkJCWNhc2Ugc2VsZjo6T1BUOgkJCQkkdGhpcy0+X3JlYWRPUFQoKTsJCQkJYnJlYWs7CgkJCQljYXNlIHNlbGY6OlRFUlRJQVJZT1BUOgkJJHRoaXMtPl9yZWFkVGVydGlhcnlPUFQoKTsJCWJyZWFrOwoJCQkJY2FzZSBzZWxmOjpTUExJVE1FTlVDT0xPUlM6CSR0aGlzLT5fcmVhZFNwbGl0TWVudUNvbG9ycygpOwlicmVhazsKCQkJCWNhc2Ugc2VsZjo6REdDT05UQUlORVI6CQkkdGhpcy0+X3JlYWREZ0NvbnRhaW5lcigpOwkJYnJlYWs7CgkJCQljYXNlIHNlbGY6OkRHOgkJCQkkdGhpcy0+X3JlYWREZygpOwkJCQlicmVhazsKCQkJCWNhc2Ugc2VsZjo6U1BHUkNPTlRBSU5FUjoJJHRoaXMtPl9yZWFkU3BnckNvbnRhaW5lcigpOwlicmVhazsKCQkJCWNhc2Ugc2VsZjo6U1BDT05UQUlORVI6CQkkdGhpcy0+X3JlYWRTcENvbnRhaW5lcigpOwkJYnJlYWs7CgkJCQljYXNlIHNlbGY6OlNQR1I6CQkJJHRoaXMtPl9yZWFkU3BncigpOwkJCQlicmVhazsKCQkJCWNhc2Ugc2VsZjo6U1A6CQkJCSR0aGlzLT5fcmVhZFNwKCk7CQkJCWJyZWFrOwoJCQkJY2FzZSBzZWxmOjpDTElFTlRURVhUQk9YOgkkdGhpcy0+X3JlYWRDbGllbnRUZXh0Ym94KCk7CWJyZWFrOwoJCQkJY2FzZSBzZWxmOjpDTElFTlRBTkNIT1I6CSR0aGlzLT5fcmVhZENsaWVudEFuY2hvcigpOwkJYnJlYWs7CgkJCQljYXNlIHNlbGY6OkNMSUVOVERBVEE6CQkkdGhpcy0+X3JlYWRDbGllbnREYXRhKCk7CQlicmVhazsKCQkJCWRlZmF1bHQ6CQkJCQkkdGhpcy0+X3JlYWREZWZhdWx0KCk7CQkJYnJlYWs7CgkJCX0KCQl9CgoJCXJldHVybiAkdGhpcy0+X29iamVjdDsKCX0KCgkvKioKCSAqIFJlYWQgYSBnZW5lcmljIHJlY29yZAoJICovCglwcml2YXRlIGZ1bmN0aW9uIF9yZWFkRGVmYXVsdCgpCgl7CgkJLy8gb2Zmc2V0IDA7IHNpemU6IDI7IHJlY1ZlciBhbmQgcmVjSW5zdGFuY2UKCQkkdmVySW5zdGFuY2UgPSBQSFBFeGNlbF9SZWFkZXJfRXhjZWw1OjpfR2V0SW50MmQoJHRoaXMtPl9kYXRhLCAkdGhpcy0+X3Bvcyk7CgoJCS8vIG9mZnNldDogMjsgc2l6ZTogMjogUmVjb3JkIFR5cGUKCQkkZmJ0ID0gUEhQRXhjZWxfUmVhZGVyX0V4Y2VsNTo6X0dldEludDJkKCR0aGlzLT5fZGF0YSwgJHRoaXMtPl9wb3MgKyAyKTsKCgkJLy8gYml0OiAwLTM7IG1hc2s6IDB4MDAwRjsgcmVjVmVyCgkJJHJlY1ZlciA9ICgweDAwMEYgJiAkdmVySW5zdGFuY2UpID4+IDA7CgoJCSRsZW5ndGggPSBQSFBFeGNlbF9SZWFkZXJfRXhjZWw1OjpfR2V0SW50NGQoJHRoaXMtPl9kYXRhLCAkdGhpcy0+X3BvcyArIDQpOwoJCSRyZWNvcmREYXRhID0gc3Vic3RyKCR0aGlzLT5fZGF0YSwgJHRoaXMtPl9wb3MgKyA4LCAkbGVuZ3RoKTsKCgkJLy8gbW92ZSBzdHJlYW0gcG9pbnRlciB0byBuZXh0IHJlY29yZAoJCSR0aGlzLT5fcG9zICs9IDggKyAkbGVuZ3RoOwoJfQoKCS8qKgoJICogUmVhZCBEZ2dDb250YWluZXIgcmVjb3JkIChEcmF3aW5nIEdyb3VwIENvbnRhaW5lcikKCSAqLwoJcHJpdmF0ZSBmdW5jdGlvbiBfcmVhZERnZ0NvbnRhaW5lcigpCgl7CgkJJGxlbmd0aCA9IFBIUEV4Y2VsX1JlYWRlcl9FeGNlbDU6Ol9HZXRJbnQ0ZCgkdGhpcy0+X2RhdGEsICR0aGlzLT5fcG9zICsgNCk7CgkJJHJlY29yZERhdGEgPSBzdWJzdHIoJHRoaXMtPl9kYXRhLCAkdGhpcy0+X3BvcyArIDgsICRsZW5ndGgpOwoKCQkvLyBtb3ZlIHN0cmVhbSBwb2ludGVyIHRvIG5leHQgcmVjb3JkCgkJJHRoaXMtPl9wb3MgKz0gOCArICRsZW5ndGg7CgoJCS8vIHJlY29yZCBpcyBhIGNvbnRhaW5lciwgcmVhZCBjb250ZW50cwoJCSRkZ2dDb250YWluZXIgPSBuZXcgUEhQRXhjZWxfU2hhcmVkX0VzY2hlcl9EZ2dDb250YWluZXIoKTsKCQkkdGhpcy0+X29iamVjdC0+c2V0RGdnQ29udGFpbmVyKCRkZ2dDb250YWluZXIpOwoJCSRyZWFkZXIgPSBuZXcgUEhQRXhjZWxfUmVhZGVyX0V4Y2VsNV9Fc2NoZXIoJGRnZ0NvbnRhaW5lcik7CgkJJHJlYWRlci0+bG9hZCgkcmVjb3JkRGF0YSk7Cgl9CgoJLyoqCgkgKiBSZWFkIERnZyByZWNvcmQgKERyYXdpbmcgR3JvdXApCgkgKi8KCXByaXZhdGUgZnVuY3Rpb24gX3JlYWREZ2coKQoJewoJCSRsZW5ndGggPSBQSFBFeGNlbF9SZWFkZXJfRXhjZWw1OjpfR2V0SW50NGQoJHRoaXMtPl9kYXRhLCAkdGhpcy0+X3BvcyArIDQpOwoJCSRyZWNvcmREYXRhID0gc3Vic3RyKCR0aGlzLT5fZGF0YSwgJHRoaXMtPl9wb3MgKyA4LCAkbGVuZ3RoKTsKCgkJLy8gbW92ZSBzdHJlYW0gcG9pbnRlciB0byBuZXh0IHJlY29yZAoJCSR0aGlzLT5fcG9zICs9IDggKyAkbGVuZ3RoOwoJfQoKCS8qKgoJICogUmVhZCBCc3RvcmVDb250YWluZXIgcmVjb3JkIChCbGlwIFN0b3JlIENvbnRhaW5lcikKCSAqLwoJcHJpdmF0ZSBmdW5jdGlvbiBfcmVhZEJzdG9yZUNvbnRhaW5lcigpCgl7CgkJJGxlbmd0aCA9IFBIUEV4Y2VsX1JlYWRlcl9FeGNlbDU6Ol9HZXRJbnQ0ZCgkdGhpcy0+X2RhdGEsICR0aGlzLT5fcG9zICsgNCk7CgkJJHJlY29yZERhdGEgPSBzdWJzdHIoJHRoaXMtPl9kYXRhLCAkdGhpcy0+X3BvcyArIDgsICRsZW5ndGgpOwoKCQkvLyBtb3ZlIHN0cmVhbSBwb2ludGVyIHRvIG5leHQgcmVjb3JkCgkJJHRoaXMtPl9wb3MgKz0gOCArICRsZW5ndGg7CgoJCS8vIHJlY29yZCBpcyBhIGNvbnRhaW5lciwgcmVhZCBjb250ZW50cwoJCSRic3RvcmVDb250YWluZXIgPSBuZXcgUEhQRXhjZWxfU2hhcmVkX0VzY2hlcl9EZ2dDb250YWluZXJfQnN0b3JlQ29udGFpbmVyKCk7CgkJJHRoaXMtPl9vYmplY3QtPnNldEJzdG9yZUNvbnRhaW5lcigkYnN0b3JlQ29udGFpbmVyKTsKCQkkcmVhZGVyID0gbmV3IFBIUEV4Y2VsX1JlYWRlcl9FeGNlbDVfRXNjaGVyKCRic3RvcmVDb250YWluZXIpOwoJCSRyZWFkZXItPmxvYWQoJHJlY29yZERhdGEpOwoJfQoKCS8qKgoJICogUmVhZCBCU0UgcmVjb3JkCgkgKi8KCXByaXZhdGUgZnVuY3Rpb24gX3JlYWRCU0UoKQoJewoJCS8vIG9mZnNldDogMDsgc2l6ZTogMjsgcmVjVmVyIGFuZCByZWNJbnN0YW5jZQoKCQkvLyBiaXQ6IDQtMTU7IG1hc2s6IDB4RkZGMDsgcmVjSW5zdGFuY2UKCQkkcmVjSW5zdGFuY2UgPSAoMHhGRkYwICYgUEhQRXhjZWxfUmVhZGVyX0V4Y2VsNTo6X0dldEludDJkKCR0aGlzLT5fZGF0YSwgJHRoaXMtPl9wb3MpKSA+PiA0OwoKCQkkbGVuZ3RoID0gUEhQRXhjZWxfUmVhZGVyX0V4Y2VsNTo6X0dldEludDRkKCR0aGlzLT5fZGF0YSwgJHRoaXMtPl9wb3MgKyA0KTsKCQkkcmVjb3JkRGF0YSA9IHN1YnN0cigkdGhpcy0+X2RhdGEsICR0aGlzLT5fcG9zICsgOCwgJGxlbmd0aCk7CgoJCS8vIG1vdmUgc3RyZWFtIHBvaW50ZXIgdG8gbmV4dCByZWNvcmQKCQkkdGhpcy0+X3BvcyArPSA4ICsgJGxlbmd0aDsKCgkJLy8gYWRkIEJTRSB0byBCc3RvcmVDb250YWluZXIKCQkkQlNFID0gbmV3IFBIUEV4Y2VsX1NoYXJlZF9Fc2NoZXJfRGdnQ29udGFpbmVyX0JzdG9yZUNvbnRhaW5lcl9CU0UoKTsKCQkkdGhpcy0+X29iamVjdC0+YWRkQlNFKCRCU0UpOwoKCQkkQlNFLT5zZXRCTElQVHlwZSgkcmVjSW5zdGFuY2UpOwoKCQkvLyBvZmZzZXQ6IDA7IHNpemU6IDE7IGJ0V2luMzIgKE1TT0JMSVBUWVBFKQoJCSRidFdpbjMyID0gb3JkKCRyZWNvcmREYXRhWzBdKTsKCgkJLy8gb2Zmc2V0OiAxOyBzaXplOiAxOyBidFdpbjMyIChNU09CTElQVFlQRSkKCQkkYnRNYWNPUyA9IG9yZCgkcmVjb3JkRGF0YVsxXSk7CgoJCS8vIG9mZnNldDogMjsgc2l6ZTogMTY7IE1ENCBkaWdlc3QKCQkkcmdiVWlkID0gc3Vic3RyKCRyZWNvcmREYXRhLCAyLCAxNik7CgoJCS8vIG9mZnNldDogMTg7IHNpemU6IDI7IHRhZwoJCSR0YWcgPSBQSFBFeGNlbF9SZWFkZXJfRXhjZWw1OjpfR2V0SW50MmQoJHJlY29yZERhdGEsIDE4KTsKCgkJLy8gb2Zmc2V0OiAyMDsgc2l6ZTogNDsgc2l6ZSBvZiBCTElQIGluIGJ5dGVzCgkJJHNpemUgPSBQSFBFeGNlbF9SZWFkZXJfRXhjZWw1OjpfR2V0SW50NGQoJHJlY29yZERhdGEsIDIwKTsKCgkJLy8gb2Zmc2V0OiAyNDsgc2l6ZTogNDsgbnVtYmVyIG9mIHJlZmVyZW5jZXMgdG8gdGhpcyBCTElQCgkJJGNSZWYgPSBQSFBFeGNlbF9SZWFkZXJfRXhjZWw1OjpfR2V0SW50NGQoJHJlY29yZERhdGEsIDI0KTsKCgkJLy8gb2Zmc2V0OiAyODsgc2l6ZTogNDsgTVNPRk8gZmlsZSBvZmZzZXQKCQkkZm9EZWxheSA9IFBIUEV4Y2VsX1JlYWRlcl9FeGNlbDU6Ol9HZXRJbnQ0ZCgkcmVjb3JkRGF0YSwgMjgpOwoKCQkvLyBvZmZzZXQ6IDMyOyBzaXplOiAxOyB1bnVzZWQxCgkJJHVudXNlZDEgPSBvcmQoJHJlY29yZERhdGF7MzJ9KTsKCgkJLy8gb2Zmc2V0OiAzMzsgc2l6ZTogMTsgc2l6ZSBvZiBuYW1lRGF0YSBpbiBieXRlcyAoaW5jbHVkaW5nIG51bGwgdGVybWluYXRvcikKCQkkY2JOYW1lID0gb3JkKCRyZWNvcmREYXRhezMzfSk7CgoJCS8vIG9mZnNldDogMzQ7IHNpemU6IDE7IHVudXNlZDIKCQkkdW51c2VkMiA9IG9yZCgkcmVjb3JkRGF0YXszNH0pOwoKCQkvLyBvZmZzZXQ6IDM1OyBzaXplOiAxOyB1bnVzZWQzCgkJJHVudXNlZDMgPSBvcmQoJHJlY29yZERhdGF7MzV9KTsKCgkJLy8gb2Zmc2V0OiAzNjsgc2l6ZTogJGNiTmFtZTsgbmFtZURhdGEKCQkkbmFtZURhdGEgPSBzdWJzdHIoJHJlY29yZERhdGEsIDM2LCAkY2JOYW1lKTsKCgkJLy8gb2Zmc2V0OiAzNiArICRjYk5hbWUsIHNpemU6IHZhcjsgdGhlIEJMSVAgZGF0YQoJCSRibGlwRGF0YSA9IHN1YnN0cigkcmVjb3JkRGF0YSwgMzYgKyAkY2JOYW1lKTsKCgkJLy8gcmVjb3JkIGlzIGEgY29udGFpbmVyLCByZWFkIGNvbnRlbnRzCgkJJHJlYWRlciA9IG5ldyBQSFBFeGNlbF9SZWFkZXJfRXhjZWw1X0VzY2hlcigkQlNFKTsKCQkkcmVhZGVyLT5sb2FkKCRibGlwRGF0YSk7Cgl9CgoJLyoqCgkgKiBSZWFkIEJsaXBKUEVHIHJlY29yZC4gSG9sZHMgcmF3IEpQRUcgaW1hZ2UgZGF0YQoJICovCglwcml2YXRlIGZ1bmN0aW9uIF9yZWFkQmxpcEpQRUcoKQoJewoJCS8vIG9mZnNldDogMDsgc2l6ZTogMjsgcmVjVmVyIGFuZCByZWNJbnN0YW5jZQoKCQkvLyBiaXQ6IDQtMTU7IG1hc2s6IDB4RkZGMDsgcmVjSW5zdGFuY2UKCQkkcmVjSW5zdGFuY2UgPSAoMHhGRkYwICYgUEhQRXhjZWxfUmVhZGVyX0V4Y2VsNTo6X0dldEludDJkKCR0aGlzLT5fZGF0YSwgJHRoaXMtPl9wb3MpKSA+PiA0OwoKCQkkbGVuZ3RoID0gUEhQRXhjZWxfUmVhZGVyX0V4Y2VsNTo6X0dldEludDRkKCR0aGlzLT5fZGF0YSwgJHRoaXMtPl9wb3MgKyA0KTsKCQkkcmVjb3JkRGF0YSA9IHN1YnN0cigkdGhpcy0+X2RhdGEsICR0aGlzLT5fcG9zICsgOCwgJGxlbmd0aCk7CgoJCS8vIG1vdmUgc3RyZWFtIHBvaW50ZXIgdG8gbmV4dCByZWNvcmQKCQkkdGhpcy0+X3BvcyArPSA4ICsgJGxlbmd0aDsKCgkJJHBvcyA9IDA7CgoJCS8vIG9mZnNldDogMDsgc2l6ZTogMTY7IHJnYlVpZDEgKE1ENCBkaWdlc3Qgb2YpCgkJJHJnYlVpZDEgPSBzdWJzdHIoJHJlY29yZERhdGEsIDAsIDE2KTsKCQkkcG9zICs9IDE2OwoKCQkvLyBvZmZzZXQ6IDE2OyBzaXplOiAxNjsgcmdiVWlkMiAoTUQ0IGRpZ2VzdCksIG9ubHkgaWYgJHJlY0luc3RhbmNlID0gMHg0NkIgb3IgMHg2RTMKCQlpZiAoaW5fYXJyYXkoJHJlY0luc3RhbmNlLCBhcnJheSgweDA0NkIsIDB4MDZFMykpKSB7CgkJCSRyZ2JVaWQyID0gc3Vic3RyKCRyZWNvcmREYXRhLCAxNiwgMTYpOwoJCQkkcG9zICs9IDE2OwoJCX0KCgkJLy8gb2Zmc2V0OiB2YXI7IHNpemU6IDE7IHRhZwoJCSR0YWcgPSBvcmQoJHJlY29yZERhdGF7JHBvc30pOwoJCSRwb3MgKz0gMTsKCgkJLy8gb2Zmc2V0OiB2YXI7IHNpemU6IHZhcjsgdGhlIHJhdyBpbWFnZSBkYXRhCgkJJGRhdGEgPSBzdWJzdHIoJHJlY29yZERhdGEsICRwb3MpOwoKCQkkYmxpcCA9IG5ldyBQSFBFeGNlbF9TaGFyZWRfRXNjaGVyX0RnZ0NvbnRhaW5lcl9Cc3RvcmVDb250YWluZXJfQlNFX0JsaXAoKTsKCQkkYmxpcC0+c2V0RGF0YSgkZGF0YSk7CgoJCSR0aGlzLT5fb2JqZWN0LT5zZXRCbGlwKCRibGlwKTsKCX0KCgkvKioKCSAqIFJlYWQgQmxpcFBORyByZWNvcmQuIEhvbGRzIHJhdyBQTkcgaW1hZ2UgZGF0YQoJICovCglwcml2YXRlIGZ1bmN0aW9uIF9yZWFkQmxpcFBORygpCgl7CgkJLy8gb2Zmc2V0OiAwOyBzaXplOiAyOyByZWNWZXIgYW5kIHJlY0luc3RhbmNlCgoJCS8vIGJpdDogNC0xNTsgbWFzazogMHhGRkYwOyByZWNJbnN0YW5jZQoJCSRyZWNJbnN0YW5jZSA9ICgweEZGRjAgJiBQSFBFeGNlbF9SZWFkZXJfRXhjZWw1OjpfR2V0SW50MmQoJHRoaXMtPl9kYXRhLCAkdGhpcy0+X3BvcykpID4+IDQ7CgoJCSRsZW5ndGggPSBQSFBFeGNlbF9SZWFkZXJfRXhjZWw1OjpfR2V0SW50NGQoJHRoaXMtPl9kYXRhLCAkdGhpcy0+X3BvcyArIDQpOwoJCSRyZWNvcmREYXRhID0gc3Vic3RyKCR0aGlzLT5fZGF0YSwgJHRoaXMtPl9wb3MgKyA4LCAkbGVuZ3RoKTsKCgkJLy8gbW92ZSBzdHJlYW0gcG9pbnRlciB0byBuZXh0IHJlY29yZAoJCSR0aGlzLT5fcG9zICs9IDggKyAkbGVuZ3RoOwoKCQkkcG9zID0gMDsKCgkJLy8gb2Zmc2V0OiAwOyBzaXplOiAxNjsgcmdiVWlkMSAoTUQ0IGRpZ2VzdCBvZikKCQkkcmdiVWlkMSA9IHN1YnN0cigkcmVjb3JkRGF0YSwgMCwgMTYpOwoJCSRwb3MgKz0gMTY7CgoJCS8vIG9mZnNldDogMTY7IHNpemU6IDE2OyByZ2JVaWQyIChNRDQgZGlnZXN0KSwgb25seSBpZiAkcmVjSW5zdGFuY2UgPSAweDQ2QiBvciAweDZFMwoJCWlmICgkcmVjSW5zdGFuY2UgPT0gMHgwNkUxKSB7CgkJCSRyZ2JVaWQyID0gc3Vic3RyKCRyZWNvcmREYXRhLCAxNiwgMTYpOwoJCQkkcG9zICs9IDE2OwoJCX0KCgkJLy8gb2Zmc2V0OiB2YXI7IHNpemU6IDE7IHRhZwoJCSR0YWcgPSBvcmQoJHJlY29yZERhdGF7JHBvc30pOwoJCSRwb3MgKz0gMTsKCgkJLy8gb2Zmc2V0OiB2YXI7IHNpemU6IHZhcjsgdGhlIHJhdyBpbWFnZSBkYXRhCgkJJGRhdGEgPSBzdWJzdHIoJHJlY29yZERhdGEsICRwb3MpOwoKCQkkYmxpcCA9IG5ldyBQSFBFeGNlbF9TaGFyZWRfRXNjaGVyX0RnZ0NvbnRhaW5lcl9Cc3RvcmVDb250YWluZXJfQlNFX0JsaXAoKTsKCQkkYmxpcC0+c2V0RGF0YSgkZGF0YSk7CgoJCSR0aGlzLT5fb2JqZWN0LT5zZXRCbGlwKCRibGlwKTsKCX0KCgkvKioKCSAqIFJlYWQgT1BUIHJlY29yZC4gVGhpcyByZWNvcmQgbWF5IG9jY3VyIHdpdGhpbiBEZ2dDb250YWluZXIgcmVjb3JkIG9yIFNwQ29udGFpbmVyCgkgKi8KCXByaXZhdGUgZnVuY3Rpb24gX3JlYWRPUFQoKQoJewoJCS8vIG9mZnNldDogMDsgc2l6ZTogMjsgcmVjVmVyIGFuZCByZWNJbnN0YW5jZQoKCQkvLyBiaXQ6IDQtMTU7IG1hc2s6IDB4RkZGMDsgcmVjSW5zdGFuY2UKCQkkcmVjSW5zdGFuY2UgPSAoMHhGRkYwICYgUEhQRXhjZWxfUmVhZGVyX0V4Y2VsNTo6X0dldEludDJkKCR0aGlzLT5fZGF0YSwgJHRoaXMtPl9wb3MpKSA+PiA0OwoKCQkkbGVuZ3RoID0gUEhQRXhjZWxfUmVhZGVyX0V4Y2VsNTo6X0dldEludDRkKCR0aGlzLT5fZGF0YSwgJHRoaXMtPl9wb3MgKyA0KTsKCQkkcmVjb3JkRGF0YSA9IHN1YnN0cigkdGhpcy0+X2RhdGEsICR0aGlzLT5fcG9zICsgOCwgJGxlbmd0aCk7CgoJCS8vIG1vdmUgc3RyZWFtIHBvaW50ZXIgdG8gbmV4dCByZWNvcmQKCQkkdGhpcy0+X3BvcyArPSA4ICsgJGxlbmd0aDsKCgkJJHRoaXMtPl9yZWFkT2ZmaWNlQXJ0UkdGT1BURSgkcmVjb3JkRGF0YSwgJHJlY0luc3RhbmNlKTsKCX0KCgkvKioKCSAqIFJlYWQgVGVydGlhcnlPUFQgcmVjb3JkCgkgKi8KCXByaXZhdGUgZnVuY3Rpb24gX3JlYWRUZXJ0aWFyeU9QVCgpCgl7CgkJLy8gb2Zmc2V0OiAwOyBzaXplOiAyOyByZWNWZXIgYW5kIHJlY0luc3RhbmNlCgoJCS8vIGJpdDogNC0xNTsgbWFzazogMHhGRkYwOyByZWNJbnN0YW5jZQoJCSRyZWNJbnN0YW5jZSA9ICgweEZGRjAgJiBQSFBFeGNlbF9SZWFkZXJfRXhjZWw1OjpfR2V0SW50MmQoJHRoaXMtPl9kYXRhLCAkdGhpcy0+X3BvcykpID4+IDQ7CgoJCSRsZW5ndGggPSBQSFBFeGNlbF9SZWFkZXJfRXhjZWw1OjpfR2V0SW50NGQoJHRoaXMtPl9kYXRhLCAkdGhpcy0+X3BvcyArIDQpOwoJCSRyZWNvcmREYXRhID0gc3Vic3RyKCR0aGlzLT5fZGF0YSwgJHRoaXMtPl9wb3MgKyA4LCAkbGVuZ3RoKTsKCgkJLy8gbW92ZSBzdHJlYW0gcG9pbnRlciB0byBuZXh0IHJlY29yZAoJCSR0aGlzLT5fcG9zICs9IDggKyAkbGVuZ3RoOwoJfQoKCS8qKgoJICogUmVhZCBTcGxpdE1lbnVDb2xvcnMgcmVjb3JkCgkgKi8KCXByaXZhdGUgZnVuY3Rpb24gX3JlYWRTcGxpdE1lbnVDb2xvcnMoKQoJewoJCSRsZW5ndGggPSBQSFBFeGNlbF9SZWFkZXJfRXhjZWw1OjpfR2V0SW50NGQoJHRoaXMtPl9kYXRhLCAkdGhpcy0+X3BvcyArIDQpOwoJCSRyZWNvcmREYXRhID0gc3Vic3RyKCR0aGlzLT5fZGF0YSwgJHRoaXMtPl9wb3MgKyA4LCAkbGVuZ3RoKTsKCgkJLy8gbW92ZSBzdHJlYW0gcG9pbnRlciB0byBuZXh0IHJlY29yZAoJCSR0aGlzLT5fcG9zICs9IDggKyAkbGVuZ3RoOwoJfQoKCS8qKgoJICogUmVhZCBEZ0NvbnRhaW5lciByZWNvcmQgKERyYXdpbmcgQ29udGFpbmVyKQoJICovCglwcml2YXRlIGZ1bmN0aW9uIF9yZWFkRGdDb250YWluZXIoKQoJewoJCSRsZW5ndGggPSBQSFBFeGNlbF9SZWFkZXJfRXhjZWw1OjpfR2V0SW50NGQoJHRoaXMtPl9kYXRhLCAkdGhpcy0+X3BvcyArIDQpOwoJCSRyZWNvcmREYXRhID0gc3Vic3RyKCR0aGlzLT5fZGF0YSwgJHRoaXMtPl9wb3MgKyA4LCAkbGVuZ3RoKTsKCgkJLy8gbW92ZSBzdHJlYW0gcG9pbnRlciB0byBuZXh0IHJlY29yZAoJCSR0aGlzLT5fcG9zICs9IDggKyAkbGVuZ3RoOwoKCQkvLyByZWNvcmQgaXMgYSBjb250YWluZXIsIHJlYWQgY29udGVudHMKCQkkZGdDb250YWluZXIgPSBuZXcgUEhQRXhjZWxfU2hhcmVkX0VzY2hlcl9EZ0NvbnRhaW5lcigpOwoJCSR0aGlzLT5fb2JqZWN0LT5zZXREZ0NvbnRhaW5lcigkZGdDb250YWluZXIpOwoJCSRyZWFkZXIgPSBuZXcgUEhQRXhjZWxfUmVhZGVyX0V4Y2VsNV9Fc2NoZXIoJGRnQ29udGFpbmVyKTsKCQkkZXNjaGVyID0gJHJlYWRlci0+bG9hZCgkcmVjb3JkRGF0YSk7Cgl9CgoJLyoqCgkgKiBSZWFkIERnIHJlY29yZCAoRHJhd2luZykKCSAqLwoJcHJpdmF0ZSBmdW5jdGlvbiBfcmVhZERnKCkKCXsKCQkkbGVuZ3RoID0gUEhQRXhjZWxfUmVhZGVyX0V4Y2VsNTo6X0dldEludDRkKCR0aGlzLT5fZGF0YSwgJHRoaXMtPl9wb3MgKyA0KTsKCQkkcmVjb3JkRGF0YSA9IHN1YnN0cigkdGhpcy0+X2RhdGEsICR0aGlzLT5fcG9zICsgOCwgJGxlbmd0aCk7CgoJCS8vIG1vdmUgc3RyZWFtIHBvaW50ZXIgdG8gbmV4dCByZWNvcmQKCQkkdGhpcy0+X3BvcyArPSA4ICsgJGxlbmd0aDsKCX0KCgkvKioKCSAqIFJlYWQgU3BnckNvbnRhaW5lciByZWNvcmQgKFNoYXBlIEdyb3VwIENvbnRhaW5lcikKCSAqLwoJcHJpdmF0ZSBmdW5jdGlvbiBfcmVhZFNwZ3JDb250YWluZXIoKQoJewoJCS8vIGNvbnRleHQgaXMgZWl0aGVyIGNvbnRleHQgRGdDb250YWluZXIgb3IgU3BnckNvbnRhaW5lcgoKCQkkbGVuZ3RoID0gUEhQRXhjZWxfUmVhZGVyX0V4Y2VsNTo6X0dldEludDRkKCR0aGlzLT5fZGF0YSwgJHRoaXMtPl9wb3MgKyA0KTsKCQkkcmVjb3JkRGF0YSA9IHN1YnN0cigkdGhpcy0+X2RhdGEsICR0aGlzLT5fcG9zICsgOCwgJGxlbmd0aCk7CgoJCS8vIG1vdmUgc3RyZWFtIHBvaW50ZXIgdG8gbmV4dCByZWNvcmQKCQkkdGhpcy0+X3BvcyArPSA4ICsgJGxlbmd0aDsKCgkJLy8gcmVjb3JkIGlzIGEgY29udGFpbmVyLCByZWFkIGNvbnRlbnRzCgkJJHNwZ3JDb250YWluZXIgPSBuZXcgUEhQRXhjZWxfU2hhcmVkX0VzY2hlcl9EZ0NvbnRhaW5lcl9TcGdyQ29udGFpbmVyKCk7CgoJCWlmICgkdGhpcy0+X29iamVjdCBpbnN0YW5jZW9mIFBIUEV4Y2VsX1NoYXJlZF9Fc2NoZXJfRGdDb250YWluZXIpIHsKCQkJLy8gRGdDb250YWluZXIKCQkJJHRoaXMtPl9vYmplY3QtPnNldFNwZ3JDb250YWluZXIoJHNwZ3JDb250YWluZXIpOwoJCX0gZWxzZSB7CgkJCS8vIFNwZ3JDb250YWluZXIKCQkJJHRoaXMtPl9vYmplY3QtPmFkZENoaWxkKCRzcGdyQ29udGFpbmVyKTsKCQl9CgoJCSRyZWFkZXIgPSBuZXcgUEhQRXhjZWxfUmVhZGVyX0V4Y2VsNV9Fc2NoZXIoJHNwZ3JDb250YWluZXIpOwoJCSRlc2NoZXIgPSAkcmVhZGVyLT5sb2FkKCRyZWNvcmREYXRhKTsKCX0KCgkvKioKCSAqIFJlYWQgU3BDb250YWluZXIgcmVjb3JkIChTaGFwZSBDb250YWluZXIpCgkgKi8KCXByaXZhdGUgZnVuY3Rpb24gX3JlYWRTcENvbnRhaW5lcigpCgl7CgkJJGxlbmd0aCA9IFBIUEV4Y2VsX1JlYWRlcl9FeGNlbDU6Ol9HZXRJbnQ0ZCgkdGhpcy0+X2RhdGEsICR0aGlzLT5fcG9zICsgNCk7CgkJJHJlY29yZERhdGEgPSBzdWJzdHIoJHRoaXMtPl9kYXRhLCAkdGhpcy0+X3BvcyArIDgsICRsZW5ndGgpOwoKCQkvLyBhZGQgc3BDb250YWluZXIgdG8gc3BnckNvbnRhaW5lcgoJCSRzcENvbnRhaW5lciA9IG5ldyBQSFBFeGNlbF9TaGFyZWRfRXNjaGVyX0RnQ29udGFpbmVyX1NwZ3JDb250YWluZXJfU3BDb250YWluZXIoKTsKCQkkdGhpcy0+X29iamVjdC0+YWRkQ2hpbGQoJHNwQ29udGFpbmVyKTsKCgkJLy8gbW92ZSBzdHJlYW0gcG9pbnRlciB0byBuZXh0IHJlY29yZAoJCSR0aGlzLT5fcG9zICs9IDggKyAkbGVuZ3RoOwoKCQkvLyByZWNvcmQgaXMgYSBjb250YWluZXIsIHJlYWQgY29udGVudHMKCQkkcmVhZGVyID0gbmV3IFBIUEV4Y2VsX1JlYWRlcl9FeGNlbDVfRXNjaGVyKCRzcENvbnRhaW5lcik7CgkJJGVzY2hlciA9ICRyZWFkZXItPmxvYWQoJHJlY29yZERhdGEpOwoJfQoKCS8qKgoJICogUmVhZCBTcGdyIHJlY29yZCAoU2hhcGUgR3JvdXApCgkgKi8KCXByaXZhdGUgZnVuY3Rpb24gX3JlYWRTcGdyKCkKCXsKCQkkbGVuZ3RoID0gUEhQRXhjZWxfUmVhZGVyX0V4Y2VsNTo6X0dldEludDRkKCR0aGlzLT5fZGF0YSwgJHRoaXMtPl9wb3MgKyA0KTsKCQkkcmVjb3JkRGF0YSA9IHN1YnN0cigkdGhpcy0+X2RhdGEsICR0aGlzLT5fcG9zICsgOCwgJGxlbmd0aCk7CgoJCS8vIG1vdmUgc3RyZWFtIHBvaW50ZXIgdG8gbmV4dCByZWNvcmQKCQkkdGhpcy0+X3BvcyArPSA4ICsgJGxlbmd0aDsKCX0KCgkvKioKCSAqIFJlYWQgU3AgcmVjb3JkIChTaGFwZSkKCSAqLwoJcHJpdmF0ZSBmdW5jdGlvbiBfcmVhZFNwKCkKCXsKCQkvLyBvZmZzZXQ6IDA7IHNpemU6IDI7IHJlY1ZlciBhbmQgcmVjSW5zdGFuY2UKCgkJLy8gYml0OiA0LTE1OyBtYXNrOiAweEZGRjA7IHJlY0luc3RhbmNlCgkJJHJlY0luc3RhbmNlID0gKDB4RkZGMCAmIFBIUEV4Y2VsX1JlYWRlcl9FeGNlbDU6Ol9HZXRJbnQyZCgkdGhpcy0+X2RhdGEsICR0aGlzLT5fcG9zKSkgPj4gNDsKCgkJJGxlbmd0aCA9IFBIUEV4Y2VsX1JlYWRlcl9FeGNlbDU6Ol9HZXRJbnQ0ZCgkdGhpcy0+X2RhdGEsICR0aGlzLT5fcG9zICsgNCk7CgkJJHJlY29yZERhdGEgPSBzdWJzdHIoJHRoaXMtPl9kYXRhLCAkdGhpcy0+X3BvcyArIDgsICRsZW5ndGgpOwoKCQkvLyBtb3ZlIHN0cmVhbSBwb2ludGVyIHRvIG5leHQgcmVjb3JkCgkJJHRoaXMtPl9wb3MgKz0gOCArICRsZW5ndGg7Cgl9CgoJLyoqCgkgKiBSZWFkIENsaWVudFRleHRib3ggcmVjb3JkCgkgKi8KCXByaXZhdGUgZnVuY3Rpb24gX3JlYWRDbGllbnRUZXh0Ym94KCkKCXsKCQkvLyBvZmZzZXQ6IDA7IHNpemU6IDI7IHJlY1ZlciBhbmQgcmVjSW5zdGFuY2UKCgkJLy8gYml0OiA0LTE1OyBtYXNrOiAweEZGRjA7IHJlY0luc3RhbmNlCgkJJHJlY0luc3RhbmNlID0gKDB4RkZGMCAmIFBIUEV4Y2VsX1JlYWRlcl9FeGNlbDU6Ol9HZXRJbnQyZCgkdGhpcy0+X2RhdGEsICR0aGlzLT5fcG9zKSkgPj4gNDsKCgkJJGxlbmd0aCA9IFBIUEV4Y2VsX1JlYWRlcl9FeGNlbDU6Ol9HZXRJbnQ0ZCgkdGhpcy0+X2RhdGEsICR0aGlzLT5fcG9zICsgNCk7CgkJJHJlY29yZERhdGEgPSBzdWJzdHIoJHRoaXMtPl9kYXRhLCAkdGhpcy0+X3BvcyArIDgsICRsZW5ndGgpOwoKCQkvLyBtb3ZlIHN0cmVhbSBwb2ludGVyIHRvIG5leHQgcmVjb3JkCgkJJHRoaXMtPl9wb3MgKz0gOCArICRsZW5ndGg7Cgl9CgoJLyoqCgkgKiBSZWFkIENsaWVudEFuY2hvciByZWNvcmQuIFRoaXMgcmVjb3JkIGhvbGRzIGluZm9ybWF0aW9uIGFib3V0IHdoZXJlIHRoZSBzaGFwZSBpcyBhbmNob3JlZCBpbiB3b3Jrc2hlZXQKCSAqLwoJcHJpdmF0ZSBmdW5jdGlvbiBfcmVhZENsaWVudEFuY2hvcigpCgl7CgkJJGxlbmd0aCA9IFBIUEV4Y2VsX1JlYWRlcl9FeGNlbDU6Ol9HZXRJbnQ0ZCgkdGhpcy0+X2RhdGEsICR0aGlzLT5fcG9zICsgNCk7CgkJJHJlY29yZERhdGEgPSBzdWJzdHIoJHRoaXMtPl9kYXRhLCAkdGhpcy0+X3BvcyArIDgsICRsZW5ndGgpOwoKCQkvLyBtb3ZlIHN0cmVhbSBwb2ludGVyIHRvIG5leHQgcmVjb3JkCgkJJHRoaXMtPl9wb3MgKz0gOCArICRsZW5ndGg7CgoJCS8vIG9mZnNldDogMjsgc2l6ZTogMjsgdXBwZXItbGVmdCBjb3JuZXIgY29sdW1uIGluZGV4ICgwLWJhc2VkKQoJCSRjMSA9IFBIUEV4Y2VsX1JlYWRlcl9FeGNlbDU6Ol9HZXRJbnQyZCgkcmVjb3JkRGF0YSwgMik7CgoJCS8vIG9mZnNldDogNDsgc2l6ZTogMjsgdXBwZXItbGVmdCBjb3JuZXIgaG9yaXpvbnRhbCBvZmZzZXQgaW4gMS8xMDI0IG9mIGNvbHVtbiB3aWR0aAoJCSRzdGFydE9mZnNldFggPSBQSFBFeGNlbF9SZWFkZXJfRXhjZWw1OjpfR2V0SW50MmQoJHJlY29yZERhdGEsIDQpOwoKCQkvLyBvZmZzZXQ6IDY7IHNpemU6IDI7IHVwcGVyLWxlZnQgY29ybmVyIHJvdyBpbmRleCAoMC1iYXNlZCkKCQkkcjEgPSBQSFBFeGNlbF9SZWFkZXJfRXhjZWw1OjpfR2V0SW50MmQoJHJlY29yZERhdGEsIDYpOwoKCQkvLyBvZmZzZXQ6IDg7IHNpemU6IDI7IHVwcGVyLWxlZnQgY29ybmVyIHZlcnRpY2FsIG9mZnNldCBpbiAxLzI1NiBvZiByb3cgaGVpZ2h0CgkJJHN0YXJ0T2Zmc2V0WSA9IFBIUEV4Y2VsX1JlYWRlcl9FeGNlbDU6Ol9HZXRJbnQyZCgkcmVjb3JkRGF0YSwgOCk7CgoJCS8vIG9mZnNldDogMTA7IHNpemU6IDI7IGJvdHRvbS1yaWdodCBjb3JuZXIgY29sdW1uIGluZGV4ICgwLWJhc2VkKQoJCSRjMiA9IFBIUEV4Y2VsX1JlYWRlcl9FeGNlbDU6Ol9HZXRJbnQyZCgkcmVjb3JkRGF0YSwgMTApOwoKCQkvLyBvZmZzZXQ6IDEyOyBzaXplOiAyOyBib3R0b20tcmlnaHQgY29ybmVyIGhvcml6b250YWwgb2Zmc2V0IGluIDEvMTAyNCBvZiBjb2x1bW4gd2lkdGgKCQkkZW5kT2Zmc2V0WCA9IFBIUEV4Y2VsX1JlYWRlcl9FeGNlbDU6Ol9HZXRJbnQyZCgkcmVjb3JkRGF0YSwgMTIpOwoKCQkvLyBvZmZzZXQ6IDE0OyBzaXplOiAyOyBib3R0b20tcmlnaHQgY29ybmVyIHJvdyBpbmRleCAoMC1iYXNlZCkKCQkkcjIgPSBQSFBFeGNlbF9SZWFkZXJfRXhjZWw1OjpfR2V0SW50MmQoJHJlY29yZERhdGEsIDE0KTsKCgkJLy8gb2Zmc2V0OiAxNjsgc2l6ZTogMjsgYm90dG9tLXJpZ2h0IGNvcm5lciB2ZXJ0aWNhbCBvZmZzZXQgaW4gMS8yNTYgb2Ygcm93IGhlaWdodAoJCSRlbmRPZmZzZXRZID0gUEhQRXhjZWxfUmVhZGVyX0V4Y2VsNTo6X0dldEludDJkKCRyZWNvcmREYXRhLCAxNik7CgoJCS8vIHNldCB0aGUgc3RhcnQgY29vcmRpbmF0ZXMKCQkkdGhpcy0+X29iamVjdC0+c2V0U3RhcnRDb29yZGluYXRlcyhQSFBFeGNlbF9DZWxsOjpzdHJpbmdGcm9tQ29sdW1uSW5kZXgoJGMxKSAuICgkcjEgKyAxKSk7CgoJCS8vIHNldCB0aGUgc3RhcnQgb2Zmc2V0WAoJCSR0aGlzLT5fb2JqZWN0LT5zZXRTdGFydE9mZnNldFgoJHN0YXJ0T2Zmc2V0WCk7CgoJCS8vIHNldCB0aGUgc3RhcnQgb2Zmc2V0WQoJCSR0aGlzLT5fb2JqZWN0LT5zZXRTdGFydE9mZnNldFkoJHN0YXJ0T2Zmc2V0WSk7CgoJCS8vIHNldCB0aGUgZW5kIGNvb3JkaW5hdGVzCgkJJHRoaXMtPl9vYmplY3QtPnNldEVuZENvb3JkaW5hdGVzKFBIUEV4Y2VsX0NlbGw6OnN0cmluZ0Zyb21Db2x1bW5JbmRleCgkYzIpIC4gKCRyMiArIDEpKTsKCgkJLy8gc2V0IHRoZSBlbmQgb2Zmc2V0WAoJCSR0aGlzLT5fb2JqZWN0LT5zZXRFbmRPZmZzZXRYKCRlbmRPZmZzZXRYKTsKCgkJLy8gc2V0IHRoZSBlbmQgb2Zmc2V0WQoJCSR0aGlzLT5fb2JqZWN0LT5zZXRFbmRPZmZzZXRZKCRlbmRPZmZzZXRZKTsKCX0KCgkvKioKCSAqIFJlYWQgQ2xpZW50RGF0YSByZWNvcmQKCSAqLwoJcHJpdmF0ZSBmdW5jdGlvbiBfcmVhZENsaWVudERhdGEoKQoJewoJCSRsZW5ndGggPSBQSFBFeGNlbF9SZWFkZXJfRXhjZWw1OjpfR2V0SW50NGQoJHRoaXMtPl9kYXRhLCAkdGhpcy0+X3BvcyArIDQpOwoJCSRyZWNvcmREYXRhID0gc3Vic3RyKCR0aGlzLT5fZGF0YSwgJHRoaXMtPl9wb3MgKyA4LCAkbGVuZ3RoKTsKCgkJLy8gbW92ZSBzdHJlYW0gcG9pbnRlciB0byBuZXh0IHJlY29yZAoJCSR0aGlzLT5fcG9zICs9IDggKyAkbGVuZ3RoOwoJfQoKCS8qKgoJICogUmVhZCBPZmZpY2VBcnRSR0ZPUFRFIHRhYmxlIG9mIHByb3BlcnR5LXZhbHVlIHBhaXJzCgkgKgoJICogQHBhcmFtIHN0cmluZyAkZGF0YSBCaW5hcnkgZGF0YQoJICogQHBhcmFtIGludCAkbiBOdW1iZXIgb2YgcHJvcGVydGllcwoJICovCglwcml2YXRlIGZ1bmN0aW9uIF9yZWFkT2ZmaWNlQXJ0UkdGT1BURSgkZGF0YSwgJG4pIHsKCgkJJHNwbGljZWRDb21wbGV4RGF0YSA9IHN1YnN0cigkZGF0YSwgNiAqICRuKTsKCgkJLy8gbG9vcCB0aHJvdWdoIHByb3BlcnR5LXZhbHVlIHBhaXJzCgkJZm9yICgkaSA9IDA7ICRpIDwgJG47ICsrJGkpIHsKCQkJLy8gcmVhZCA2IGJ5dGVzIGF0IGEgdGltZQoJCQkkZm9wdGUgPSBzdWJzdHIoJGRhdGEsIDYgKiAkaSwgNik7CgoJCQkvLyBvZmZzZXQ6IDA7IHNpemU6IDI7IG9waWQKCQkJJG9waWQgPSBQSFBFeGNlbF9SZWFkZXJfRXhjZWw1OjpfR2V0SW50MmQoJGZvcHRlLCAwKTsKCgkJCS8vIGJpdDogMC0xMzsgbWFzazogMHgzRkZGOyBvcGlkLm9waWQKCQkJJG9waWRPcGlkID0gKDB4M0ZGRiAmICRvcGlkKSA+PiAwOwoKCQkJLy8gYml0OiAxNDsgbWFzayAweDQwMDA7IDEgPSB2YWx1ZSBpbiBvcCBmaWVsZCBpcyBCTElQIGlkZW50aWZpZXIKCQkJJG9waWRGQmlkID0gKDB4NDAwMCAmICRvcGlkKSA+PiAxNDsKCgkJCS8vIGJpdDogMTU7IG1hc2sgMHg4MDAwOyAxID0gdGhpcyBpcyBhIGNvbXBsZXggcHJvcGVydHksIG9wIGZpZWxkIHNwZWNpZmllcyBzaXplIG9mIGNvbXBsZXggZGF0YQoJCQkkb3BpZEZDb21wbGV4ID0gKDB4ODAwMCAmICRvcGlkKSA+PiAxNTsKCgkJCS8vIG9mZnNldDogMjsgc2l6ZTogNDsgdGhlIHZhbHVlIGZvciB0aGlzIHByb3BlcnR5CgkJCSRvcCA9IFBIUEV4Y2VsX1JlYWRlcl9FeGNlbDU6Ol9HZXRJbnQ0ZCgkZm9wdGUsIDIpOwoKCQkJaWYgKCRvcGlkRkNvbXBsZXgpIHsKCQkJCSRjb21wbGV4RGF0YSA9IHN1YnN0cigkc3BsaWNlZENvbXBsZXhEYXRhLCAwLCAkb3ApOwoJCQkJJHNwbGljZWRDb21wbGV4RGF0YSA9IHN1YnN0cigkc3BsaWNlZENvbXBsZXhEYXRhLCAkb3ApOwoKCQkJCS8vIHdlIHN0b3JlIHN0cmluZyB2YWx1ZSB3aXRoIGNvbXBsZXggZGF0YQoJCQkJJHZhbHVlID0gJGNvbXBsZXhEYXRhOwoJCQl9IGVsc2UgewoJCQkJLy8gd2Ugc3RvcmUgaW50ZWdlciB2YWx1ZQoJCQkJJHZhbHVlID0gJG9wOwoJCQl9CgoJCQkkdGhpcy0+X29iamVjdC0+c2V0T1BUKCRvcGlkT3BpZCwgJHZhbHVlKTsKCQl9Cgl9Cgp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Reader/Excel2003XML.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIFBIUEV4Y2VsCiAqCiAqIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICoKICogQGNhdGVnb3J5ICAgUEhQRXhjZWwKICogQHBhY2thZ2UgICAgUEhQRXhjZWxfUmVhZGVyCiAqIEBjb3B5cmlnaHQgIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwgKGh0dHA6Ly93d3cuY29kZXBsZXguY29tL1BIUEV4Y2VsKQogKiBAbGljZW5zZSAgICBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvb2xkLWxpY2Vuc2VzL2xncGwtMi4xLnR4dAlMR1BMCiAqIEB2ZXJzaW9uICAgIDEuNy43LCAyMDEyLTA1LTE5CiAqLwoKCi8qKiBQSFBFeGNlbCByb290IGRpcmVjdG9yeSAqLwppZiAoIWRlZmluZWQoJ1BIUEVYQ0VMX1JPT1QnKSkgewoJLyoqCgkgKiBAaWdub3JlCgkgKi8KCWRlZmluZSgnUEhQRVhDRUxfUk9PVCcsIGRpcm5hbWUoX19GSUxFX18pIC4gJy8uLi8uLi8nKTsKCXJlcXVpcmUoUEhQRVhDRUxfUk9PVCAuICdQSFBFeGNlbC9BdXRvbG9hZGVyLnBocCcpOwp9CgovKioKICogUEhQRXhjZWxfUmVhZGVyX0V4Y2VsMjAwM1hNTAogKgogKiBAY2F0ZWdvcnkgICBQSFBFeGNlbAogKiBAcGFja2FnZSAgICBQSFBFeGNlbF9SZWFkZXIKICogQGNvcHlyaWdodCAgQ29weXJpZ2h0IChjKSAyMDA2IC0gMjAxMiBQSFBFeGNlbCAoaHR0cDovL3d3dy5jb2RlcGxleC5jb20vUEhQRXhjZWwpCiAqLwpjbGFzcyBQSFBFeGNlbF9SZWFkZXJfRXhjZWwyMDAzWE1MIGltcGxlbWVudHMgUEhQRXhjZWxfUmVhZGVyX0lSZWFkZXIKewoJLyoqCgkgKiBSZWFkIGRhdGEgb25seT8KCSAqCgkgKiBAdmFyIGJvb2xlYW4KCSAqLwoJcHJpdmF0ZSAkX3JlYWREYXRhT25seSA9IGZhbHNlOwoKCS8qKgoJICogUmVzdGljdCB3aGljaCBzaGVldHMgc2hvdWxkIGJlIGxvYWRlZD8KCSAqCgkgKiBAdmFyIGFycmF5CgkgKi8KCXByaXZhdGUgJF9sb2FkU2hlZXRzT25seSA9IG51bGw7CgoJLyoqCgkgKiBGb3JtYXRzCgkgKgoJICogQHZhciBhcnJheQoJICovCglwcml2YXRlICRfc3R5bGVzID0gYXJyYXkoKTsKCgkvKioKCSAqIFBIUEV4Y2VsX1JlYWRlcl9JUmVhZEZpbHRlciBpbnN0YW5jZQoJICoKCSAqIEB2YXIgUEhQRXhjZWxfUmVhZGVyX0lSZWFkRmlsdGVyCgkgKi8KCXByaXZhdGUgJF9yZWFkRmlsdGVyID0gbnVsbDsKCgkvKioKCSAqIENoYXJhY3RlciBzZXQgdXNlZCBpbiB0aGUgZmlsZQoJICoKCSAqIEB2YXIgc3RyaW5nCgkgKi8KCXByaXZhdGUgJF9jaGFyU2V0ID0gJ1VURi04JzsKCgoJLyoqCgkgKiBDcmVhdGUgYSBuZXcgUEhQRXhjZWxfUmVhZGVyX0V4Y2VsMjAwM1hNTAoJICovCglwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoKSB7CgkJJHRoaXMtPl9yZWFkRmlsdGVyIAk9IG5ldyBQSFBFeGNlbF9SZWFkZXJfRGVmYXVsdFJlYWRGaWx0ZXIoKTsKCX0KCgoJLyoqCgkgKiBSZWFkIGRhdGEgb25seT8KCSAqCgkgKiBAcmV0dXJuIGJvb2xlYW4KCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldFJlYWREYXRhT25seSgpIHsKCQlyZXR1cm4gJHRoaXMtPl9yZWFkRGF0YU9ubHk7Cgl9CgoKCS8qKgoJICogU2V0IHJlYWQgZGF0YSBvbmx5CgkgKgoJICogQHBhcmFtIGJvb2xlYW4gJHBWYWx1ZQoJICogQHJldHVybiBQSFBFeGNlbF9SZWFkZXJfRXhjZWwyMDAzWE1MCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBzZXRSZWFkRGF0YU9ubHkoJHBWYWx1ZSA9IGZhbHNlKSB7CgkJJHRoaXMtPl9yZWFkRGF0YU9ubHkgPSAkcFZhbHVlOwoJCXJldHVybiAkdGhpczsKCX0KCgoJLyoqCgkgKiBHZXQgd2hpY2ggc2hlZXRzIHRvIGxvYWQKCSAqCgkgKiBAcmV0dXJuIG1peGVkCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRMb2FkU2hlZXRzT25seSgpCgl7CgkJcmV0dXJuICR0aGlzLT5fbG9hZFNoZWV0c09ubHk7Cgl9CgoKCS8qKgoJICogU2V0IHdoaWNoIHNoZWV0cyB0byBsb2FkCgkgKgoJICogQHBhcmFtIG1peGVkICR2YWx1ZQoJICogQHJldHVybiBQSFBFeGNlbF9SZWFkZXJfRXhjZWwyMDAzWE1MCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBzZXRMb2FkU2hlZXRzT25seSgkdmFsdWUgPSBudWxsKQoJewoJCSR0aGlzLT5fbG9hZFNoZWV0c09ubHkgPSBpc19hcnJheSgkdmFsdWUpID8KCQkJJHZhbHVlIDogYXJyYXkoJHZhbHVlKTsKCQlyZXR1cm4gJHRoaXM7Cgl9CgoKCS8qKgoJICogU2V0IGFsbCBzaGVldHMgdG8gbG9hZAoJICoKCSAqIEByZXR1cm4gUEhQRXhjZWxfUmVhZGVyX0V4Y2VsMjAwM1hNTAoJICovCglwdWJsaWMgZnVuY3Rpb24gc2V0TG9hZEFsbFNoZWV0cygpCgl7CgkJJHRoaXMtPl9sb2FkU2hlZXRzT25seSA9IG51bGw7CgkJcmV0dXJuICR0aGlzOwoJfQoKCgkvKioKCSAqIFJlYWQgZmlsdGVyCgkgKgoJICogQHJldHVybiBQSFBFeGNlbF9SZWFkZXJfSVJlYWRGaWx0ZXIKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldFJlYWRGaWx0ZXIoKSB7CgkJcmV0dXJuICR0aGlzLT5fcmVhZEZpbHRlcjsKCX0KCgoJLyoqCgkgKiBTZXQgcmVhZCBmaWx0ZXIKCSAqCgkgKiBAcGFyYW0gUEhQRXhjZWxfUmVhZGVyX0lSZWFkRmlsdGVyICRwVmFsdWUKCSAqIEByZXR1cm4gUEhQRXhjZWxfUmVhZGVyX0V4Y2VsMjAwM1hNTAoJICovCglwdWJsaWMgZnVuY3Rpb24gc2V0UmVhZEZpbHRlcihQSFBFeGNlbF9SZWFkZXJfSVJlYWRGaWx0ZXIgJHBWYWx1ZSkgewoJCSR0aGlzLT5fcmVhZEZpbHRlciA9ICRwVmFsdWU7CgkJcmV0dXJuICR0aGlzOwoJfQoKCgkvKioKCSAqIENhbiB0aGUgY3VycmVudCBQSFBFeGNlbF9SZWFkZXJfSVJlYWRlciByZWFkIHRoZSBmaWxlPwoJICoKCSAqIEBwYXJhbSAJc3RyaW5nIAkJJHBGaWxlTmFtZQoJICogQHJldHVybiAJYm9vbGVhbgoJICogQHRocm93cyBFeGNlcHRpb24KCSAqLwoJcHVibGljIGZ1bmN0aW9uIGNhblJlYWQoJHBGaWxlbmFtZSkKCXsKCgkJLy8JT2ZmaWNlCQkJCQl4bWxuczpvPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpvZmZpY2UiCgkJLy8JRXhjZWwJCQkJCXhtbG5zOng9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOmV4Y2VsIgoJCS8vCVhNTCBTcHJlYWRzaGVldAkJCXhtbG5zOnNzPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpzcHJlYWRzaGVldCIKCQkvLwlTcHJlYWRzaGVldCBjb21wb25lbnQJeG1sbnM6Yz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6Y29tcG9uZW50OnNwcmVhZHNoZWV0IgoJCS8vCVhNTCBzY2hlbWEgCQkJCXhtbG5zOnM9InV1aWQ6QkRDNkUzRjAtNkRBMy0xMWQxLUEyQTMtMDBBQTAwQzE0ODgyIgoJCS8vCVhNTCBkYXRhIHR5cGUJCQl4bWxuczpkdD0idXVpZDpDMkY0MTAxMC02NUIzLTExZDEtQTI5Ri0wMEFBMDBDMTQ4ODIiCgkJLy8JTVMtcGVyc2lzdCByZWNvcmRzZXQJeG1sbnM6cnM9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206cm93c2V0IgoJCS8vCVJvd3NldAkJCQkJeG1sbnM6ej0iI1Jvd3NldFNjaGVtYSIKCQkvLwoKCQkkc2lnbmF0dXJlID0gYXJyYXkoCgkJCQknPD94bWwgdmVyc2lvbj0iMS4wIicsCgkJCQknPD9tc28tYXBwbGljYXRpb24gcHJvZ2lkPSJFeGNlbC5TaGVldCI/PicKCQkJKTsKCgkJLy8gQ2hlY2sgaWYgZmlsZSBleGlzdHMKCQlpZiAoIWZpbGVfZXhpc3RzKCRwRmlsZW5hbWUpKSB7CgkJCXRocm93IG5ldyBFeGNlcHRpb24oIkNvdWxkIG5vdCBvcGVuICIgLiAkcEZpbGVuYW1lIC4gIiBmb3IgcmVhZGluZyEgRmlsZSBkb2VzIG5vdCBleGlzdC4iKTsKCQl9CgoJCS8vIFJlYWQgc2FtcGxlIGRhdGEgKGZpcnN0IDIgS0Igd2lsbCBkbykKCQkkZmggPSBmb3BlbigkcEZpbGVuYW1lLCAncicpOwoJCSRkYXRhID0gZnJlYWQoJGZoLCAyMDQ4KTsKCQlmY2xvc2UoJGZoKTsKCgkJJHZhbGlkID0gdHJ1ZTsKCQlmb3JlYWNoKCRzaWduYXR1cmUgYXMgJG1hdGNoKSB7CgkJCS8vIGV2ZXJ5IHBhcnQgb2YgdGhlIHNpZ25hdHVyZSBtdXN0IGJlIHByZXNlbnQKCQkJaWYgKHN0cnBvcygkZGF0YSwgJG1hdGNoKSA9PT0gZmFsc2UpIHsKCQkJCSR2YWxpZCA9IGZhbHNlOwoJCQkJYnJlYWs7CgkJCX0KCQl9CgoJCS8vCVJldHJpZXZlIGNoYXJzZXQgZW5jb2RpbmcKCQlpZihwcmVnX21hdGNoKCcvPD94bWwuKmVuY29kaW5nPVtcJyJdKC4qPylbXCciXS4qPz4vdW0nLCRkYXRhLCRtYXRjaGVzKSkgewoJCQkkdGhpcy0+X2NoYXJTZXQgPSBzdHJ0b3VwcGVyKCRtYXRjaGVzWzFdKTsKCQl9Ci8vCQllY2hvICdDaGFyYWN0ZXIgU2V0IGlzICcsJHRoaXMtPl9jaGFyU2V0LCc8YnIgLz4nOwoKCQlyZXR1cm4gJHZhbGlkOwoJfQoKCgkvKioKCSAqIFJlYWRzIG5hbWVzIG9mIHRoZSB3b3Jrc2hlZXRzIGZyb20gYSBmaWxlLCB3aXRob3V0IHBhcnNpbmcgdGhlIHdob2xlIGZpbGUgdG8gYSBQSFBFeGNlbCBvYmplY3QKCSAqCgkgKiBAcGFyYW0gCXN0cmluZyAJCSRwRmlsZW5hbWUKCSAqIEB0aHJvd3MgCUV4Y2VwdGlvbgoJICovCglwdWJsaWMgZnVuY3Rpb24gbGlzdFdvcmtzaGVldE5hbWVzKCRwRmlsZW5hbWUpCgl7CgkJLy8gQ2hlY2sgaWYgZmlsZSBleGlzdHMKCQlpZiAoIWZpbGVfZXhpc3RzKCRwRmlsZW5hbWUpKSB7CgkJCXRocm93IG5ldyBFeGNlcHRpb24oIkNvdWxkIG5vdCBvcGVuICIgLiAkcEZpbGVuYW1lIC4gIiBmb3IgcmVhZGluZyEgRmlsZSBkb2VzIG5vdCBleGlzdC4iKTsKCQl9CgkJaWYgKCEkdGhpcy0+Y2FuUmVhZCgkcEZpbGVuYW1lKSkgewoJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCRwRmlsZW5hbWUgLiAiIGlzIGFuIEludmFsaWQgU3ByZWFkc2hlZXQgZmlsZS4iKTsKCQl9CgoJCSR3b3Jrc2hlZXROYW1lcyA9IGFycmF5KCk7CgoJCSR4bWwgPSBzaW1wbGV4bWxfbG9hZF9maWxlKCRwRmlsZW5hbWUpOwoJCSRuYW1lc3BhY2VzID0gJHhtbC0+Z2V0TmFtZXNwYWNlcyh0cnVlKTsKCgkJJHhtbF9zcyA9ICR4bWwtPmNoaWxkcmVuKCRuYW1lc3BhY2VzWydzcyddKTsKCQlmb3JlYWNoKCR4bWxfc3MtPldvcmtzaGVldCBhcyAkd29ya3NoZWV0KSB7CgkJCSR3b3Jrc2hlZXRfc3MgPSAkd29ya3NoZWV0LT5hdHRyaWJ1dGVzKCRuYW1lc3BhY2VzWydzcyddKTsKCQkJJHdvcmtzaGVldE5hbWVzW10gPSBzZWxmOjpfY29udmVydFN0cmluZ0VuY29kaW5nKChzdHJpbmcpICR3b3Jrc2hlZXRfc3NbJ05hbWUnXSwkdGhpcy0+X2NoYXJTZXQpOwoJCX0KCgkJcmV0dXJuICR3b3Jrc2hlZXROYW1lczsKCX0KCgoJLyoqCgkgKiBSZXR1cm4gd29ya3NoZWV0IGluZm8gKE5hbWUsIExhc3QgQ29sdW1uIExldHRlciwgTGFzdCBDb2x1bW4gSW5kZXgsIFRvdGFsIFJvd3MsIFRvdGFsIENvbHVtbnMpCgkgKgoJICogQHBhcmFtICAgc3RyaW5nICAgICAkcEZpbGVuYW1lCgkgKiBAdGhyb3dzICAgRXhjZXB0aW9uCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBsaXN0V29ya3NoZWV0SW5mbygkcEZpbGVuYW1lKQoJewoJCS8vIENoZWNrIGlmIGZpbGUgZXhpc3RzCgkJaWYgKCFmaWxlX2V4aXN0cygkcEZpbGVuYW1lKSkgewoJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCJDb3VsZCBub3Qgb3BlbiAiIC4gJHBGaWxlbmFtZSAuICIgZm9yIHJlYWRpbmchIEZpbGUgZG9lcyBub3QgZXhpc3QuIik7CgkJfQoKCQkkd29ya3NoZWV0SW5mbyA9IGFycmF5KCk7CgoJCSR4bWwgPSBzaW1wbGV4bWxfbG9hZF9maWxlKCRwRmlsZW5hbWUpOwoJCSRuYW1lc3BhY2VzID0gJHhtbC0+Z2V0TmFtZXNwYWNlcyh0cnVlKTsKCgkJJHdvcmtzaGVldElEID0gMTsKCQkkeG1sX3NzID0gJHhtbC0+Y2hpbGRyZW4oJG5hbWVzcGFjZXNbJ3NzJ10pOwoJCWZvcmVhY2goJHhtbF9zcy0+V29ya3NoZWV0IGFzICR3b3Jrc2hlZXQpIHsKCQkJJHdvcmtzaGVldF9zcyA9ICR3b3Jrc2hlZXQtPmF0dHJpYnV0ZXMoJG5hbWVzcGFjZXNbJ3NzJ10pOwoKCQkJJHRtcEluZm8gPSBhcnJheSgpOwoJCQkkdG1wSW5mb1snd29ya3NoZWV0TmFtZSddID0gJyc7CgkJCSR0bXBJbmZvWydsYXN0Q29sdW1uTGV0dGVyJ10gPSAnQSc7CgkJCSR0bXBJbmZvWydsYXN0Q29sdW1uSW5kZXgnXSA9IDA7CgkJCSR0bXBJbmZvWyd0b3RhbFJvd3MnXSA9IDA7CgkJCSR0bXBJbmZvWyd0b3RhbENvbHVtbnMnXSA9IDA7CgoJCQlpZiAoaXNzZXQoJHdvcmtzaGVldF9zc1snTmFtZSddKSkgewoJCQkJJHRtcEluZm9bJ3dvcmtzaGVldE5hbWUnXSA9IChzdHJpbmcpICR3b3Jrc2hlZXRfc3NbJ05hbWUnXTsKCQkJfSBlbHNlIHsKCQkJCSR0bXBJbmZvWyd3b3Jrc2hlZXROYW1lJ10gPSAiV29ya3NoZWV0X3skd29ya3NoZWV0SUR9IjsKCQkJfQoKCQkJaWYgKGlzc2V0KCR3b3Jrc2hlZXQtPlRhYmxlLT5Sb3cpKSB7CgkJCQkkcm93SW5kZXggPSAwOwoKCQkJCWZvcmVhY2goJHdvcmtzaGVldC0+VGFibGUtPlJvdyBhcyAkcm93RGF0YSkgewoJCQkJCSRjb2x1bW5JbmRleCA9IDA7CgkJCQkJJHJvd0hhc0RhdGEgPSBmYWxzZTsKCgkJCQkJZm9yZWFjaCgkcm93RGF0YS0+Q2VsbCBhcyAkY2VsbCkgewoJCQkJCQlpZiAoaXNzZXQoJGNlbGwtPkRhdGEpKSB7CgkJCQkJCQkkdG1wSW5mb1snbGFzdENvbHVtbkluZGV4J10gPSBtYXgoJHRtcEluZm9bJ2xhc3RDb2x1bW5JbmRleCddLCAkY29sdW1uSW5kZXgpOwoJCQkJCQkJJHJvd0hhc0RhdGEgPSB0cnVlOwoJCQkJCQl9CgoJCQkJCQkrKyRjb2x1bW5JbmRleDsKCQkJCQl9CgoJCQkJCSsrJHJvd0luZGV4OwoKCQkJCQlpZiAoJHJvd0hhc0RhdGEpIHsKCQkJCQkJJHRtcEluZm9bJ3RvdGFsUm93cyddID0gbWF4KCR0bXBJbmZvWyd0b3RhbFJvd3MnXSwgJHJvd0luZGV4KTsKCQkJCQl9CgkJCQl9CgkJCX0KCgkJCSR0bXBJbmZvWydsYXN0Q29sdW1uTGV0dGVyJ10gPSBQSFBFeGNlbF9DZWxsOjpzdHJpbmdGcm9tQ29sdW1uSW5kZXgoJHRtcEluZm9bJ2xhc3RDb2x1bW5JbmRleCddKTsKCQkJJHRtcEluZm9bJ3RvdGFsQ29sdW1ucyddID0gJHRtcEluZm9bJ2xhc3RDb2x1bW5JbmRleCddICsgMTsKCgkJCSR3b3Jrc2hlZXRJbmZvW10gPSAkdG1wSW5mbzsKCQkJKyskd29ya3NoZWV0SUQ7CgkJfQoKCQlyZXR1cm4gJHdvcmtzaGVldEluZm87Cgl9CgoKICAgIC8qKgoJICogTG9hZHMgUEhQRXhjZWwgZnJvbSBmaWxlCgkgKgoJICogQHBhcmFtIAlzdHJpbmcgCQkkcEZpbGVuYW1lCgkgKiBAcmV0dXJuIAlQSFBFeGNlbAoJICogQHRocm93cyAJRXhjZXB0aW9uCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBsb2FkKCRwRmlsZW5hbWUpCgl7CgkJLy8gQ3JlYXRlIG5ldyBQSFBFeGNlbAoJCSRvYmpQSFBFeGNlbCA9IG5ldyBQSFBFeGNlbCgpOwoKCQkvLyBMb2FkIGludG8gdGhpcyBpbnN0YW5jZQoJCXJldHVybiAkdGhpcy0+bG9hZEludG9FeGlzdGluZygkcEZpbGVuYW1lLCAkb2JqUEhQRXhjZWwpOwoJfQoKCglwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBpZGVudGlmeUZpeGVkU3R5bGVWYWx1ZSgkc3R5bGVMaXN0LCYkc3R5bGVBdHRyaWJ1dGVWYWx1ZSkgewoJCSRzdHlsZUF0dHJpYnV0ZVZhbHVlID0gc3RydG9sb3dlcigkc3R5bGVBdHRyaWJ1dGVWYWx1ZSk7CgkJZm9yZWFjaCgkc3R5bGVMaXN0IGFzICRzdHlsZSkgewoJCQlpZiAoJHN0eWxlQXR0cmlidXRlVmFsdWUgPT0gc3RydG9sb3dlcigkc3R5bGUpKSB7CgkJCQkkc3R5bGVBdHRyaWJ1dGVWYWx1ZSA9ICRzdHlsZTsKCQkJCXJldHVybiB0cnVlOwoJCQl9CgkJfQoJCXJldHVybiBmYWxzZTsKCX0KCgogCS8qKgogCSAqIHBpeGVsIHVuaXRzIHRvIGV4Y2VsIHdpZHRoIHVuaXRzKHVuaXRzIG9mIDEvMjU2dGggb2YgYSBjaGFyYWN0ZXIgd2lkdGgpCiAJICogQHBhcmFtIHB4cwogCSAqIEByZXR1cm4KIAkgKi8KIAlwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBfcGl4ZWwyV2lkdGhVbml0cygkcHhzKSB7CgkJJFVOSVRfT0ZGU0VUX01BUCA9IGFycmF5KDAsIDM2LCA3MywgMTA5LCAxNDYsIDE4MiwgMjE5KTsKCgkJJHdpZHRoVW5pdHMgPSAyNTYgKiAoJHB4cyAvIDcpOwoJCSR3aWR0aFVuaXRzICs9ICRVTklUX09GRlNFVF9NQVBbKCRweHMgJSA3KV07CgkJcmV0dXJuICR3aWR0aFVuaXRzOwoJfQoKCgkvKioKCSAqIGV4Y2VsIHdpZHRoIHVuaXRzKHVuaXRzIG9mIDEvMjU2dGggb2YgYSBjaGFyYWN0ZXIgd2lkdGgpIHRvIHBpeGVsIHVuaXRzCgkgKiBAcGFyYW0gd2lkdGhVbml0cwoJICogQHJldHVybgoJICovCglwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBfd2lkdGhVbml0czJQaXhlbCgkd2lkdGhVbml0cykgewoJCSRwaXhlbHMgPSAoJHdpZHRoVW5pdHMgLyAyNTYpICogNzsKCQkkb2Zmc2V0V2lkdGhVbml0cyA9ICR3aWR0aFVuaXRzICUgMjU2OwoJCSRwaXhlbHMgKz0gcm91bmQoJG9mZnNldFdpZHRoVW5pdHMgLyAoMjU2IC8gNykpOwoJCXJldHVybiAkcGl4ZWxzOwoJfQoKCglwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBfaGV4MnN0cigkaGV4KSB7CgkJcmV0dXJuIGNocihoZXhkZWMoJGhleFsxXSkpOwoJfQoKCgkvKioKCSAqIExvYWRzIFBIUEV4Y2VsIGZyb20gZmlsZSBpbnRvIFBIUEV4Y2VsIGluc3RhbmNlCgkgKgoJICogQHBhcmFtIAlzdHJpbmcgCQkkcEZpbGVuYW1lCgkgKiBAcGFyYW0JUEhQRXhjZWwJJG9ialBIUEV4Y2VsCgkgKiBAcmV0dXJuIAlQSFBFeGNlbAoJICogQHRocm93cyAJRXhjZXB0aW9uCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBsb2FkSW50b0V4aXN0aW5nKCRwRmlsZW5hbWUsIFBIUEV4Y2VsICRvYmpQSFBFeGNlbCkKCXsKCQkkZnJvbUZvcm1hdHMJPSBhcnJheSgnXC0nLAknXCAnKTsKCQkkdG9Gb3JtYXRzCQk9IGFycmF5KCctJywJJyAnKTsKCgkJJHVuZGVybGluZVN0eWxlcyA9IGFycmF5ICgKCQkJCVBIUEV4Y2VsX1N0eWxlX0ZvbnQ6OlVOREVSTElORV9OT05FLAoJCQkJUEhQRXhjZWxfU3R5bGVfRm9udDo6VU5ERVJMSU5FX0RPVUJMRSwKCQkJCVBIUEV4Y2VsX1N0eWxlX0ZvbnQ6OlVOREVSTElORV9ET1VCTEVBQ0NPVU5USU5HLAoJCQkJUEhQRXhjZWxfU3R5bGVfRm9udDo6VU5ERVJMSU5FX1NJTkdMRSwKCQkJCVBIUEV4Y2VsX1N0eWxlX0ZvbnQ6OlVOREVSTElORV9TSU5HTEVBQ0NPVU5USU5HCgkJCSk7CgkJJHZlcnRpY2FsQWxpZ25tZW50U3R5bGVzID0gYXJyYXkgKAoJCQkJUEhQRXhjZWxfU3R5bGVfQWxpZ25tZW50OjpWRVJUSUNBTF9CT1RUT00sCgkJCQlQSFBFeGNlbF9TdHlsZV9BbGlnbm1lbnQ6OlZFUlRJQ0FMX1RPUCwKCQkJCVBIUEV4Y2VsX1N0eWxlX0FsaWdubWVudDo6VkVSVElDQUxfQ0VOVEVSLAoJCQkJUEhQRXhjZWxfU3R5bGVfQWxpZ25tZW50OjpWRVJUSUNBTF9KVVNUSUZZCgkJCSk7CgkJJGhvcml6b250YWxBbGlnbm1lbnRTdHlsZXMgPSBhcnJheSAoCgkJCQlQSFBFeGNlbF9TdHlsZV9BbGlnbm1lbnQ6OkhPUklaT05UQUxfR0VORVJBTCwKCQkJCVBIUEV4Y2VsX1N0eWxlX0FsaWdubWVudDo6SE9SSVpPTlRBTF9MRUZULAoJCQkJUEhQRXhjZWxfU3R5bGVfQWxpZ25tZW50OjpIT1JJWk9OVEFMX1JJR0hULAoJCQkJUEhQRXhjZWxfU3R5bGVfQWxpZ25tZW50OjpIT1JJWk9OVEFMX0NFTlRFUiwKCQkJCVBIUEV4Y2VsX1N0eWxlX0FsaWdubWVudDo6SE9SSVpPTlRBTF9DRU5URVJfQ09OVElOVU9VUywKCQkJCVBIUEV4Y2VsX1N0eWxlX0FsaWdubWVudDo6SE9SSVpPTlRBTF9KVVNUSUZZCgkJCSk7CgoJCSR0aW1lem9uZU9iaiA9IG5ldyBEYXRlVGltZVpvbmUoJ0V1cm9wZS9Mb25kb24nKTsKCQkkR01UID0gbmV3IERhdGVUaW1lWm9uZSgnVVRDJyk7CgoKCQkvLyBDaGVjayBpZiBmaWxlIGV4aXN0cwoJCWlmICghZmlsZV9leGlzdHMoJHBGaWxlbmFtZSkpIHsKCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbigiQ291bGQgbm90IG9wZW4gIiAuICRwRmlsZW5hbWUgLiAiIGZvciByZWFkaW5nISBGaWxlIGRvZXMgbm90IGV4aXN0LiIpOwoJCX0KCgkJaWYgKCEkdGhpcy0+Y2FuUmVhZCgkcEZpbGVuYW1lKSkgewoJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCRwRmlsZW5hbWUgLiAiIGlzIGFuIEludmFsaWQgU3ByZWFkc2hlZXQgZmlsZS4iKTsKCQl9CgoJCSR4bWwgPSBzaW1wbGV4bWxfbG9hZF9maWxlKCRwRmlsZW5hbWUpOwoJCSRuYW1lc3BhY2VzID0gJHhtbC0+Z2V0TmFtZXNwYWNlcyh0cnVlKTsKCgkJJGRvY1Byb3BzID0gJG9ialBIUEV4Y2VsLT5nZXRQcm9wZXJ0aWVzKCk7CgkJaWYgKGlzc2V0KCR4bWwtPkRvY3VtZW50UHJvcGVydGllc1swXSkpIHsKCQkJZm9yZWFjaCgkeG1sLT5Eb2N1bWVudFByb3BlcnRpZXNbMF0gYXMgJHByb3BlcnR5TmFtZSA9PiAkcHJvcGVydHlWYWx1ZSkgewoJCQkJc3dpdGNoICgkcHJvcGVydHlOYW1lKSB7CgkJCQkJY2FzZSAnVGl0bGUnIDoKCQkJCQkJCSRkb2NQcm9wcy0+c2V0VGl0bGUoc2VsZjo6X2NvbnZlcnRTdHJpbmdFbmNvZGluZygkcHJvcGVydHlWYWx1ZSwkdGhpcy0+X2NoYXJTZXQpKTsKCQkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgJ1N1YmplY3QnIDoKCQkJCQkJCSRkb2NQcm9wcy0+c2V0U3ViamVjdChzZWxmOjpfY29udmVydFN0cmluZ0VuY29kaW5nKCRwcm9wZXJ0eVZhbHVlLCR0aGlzLT5fY2hhclNldCkpOwoJCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSAnQXV0aG9yJyA6CgkJCQkJCQkkZG9jUHJvcHMtPnNldENyZWF0b3Ioc2VsZjo6X2NvbnZlcnRTdHJpbmdFbmNvZGluZygkcHJvcGVydHlWYWx1ZSwkdGhpcy0+X2NoYXJTZXQpKTsKCQkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgJ0NyZWF0ZWQnIDoKCQkJCQkJCSRjcmVhdGlvbkRhdGUgPSBzdHJ0b3RpbWUoJHByb3BlcnR5VmFsdWUpOwoJCQkJCQkJJGRvY1Byb3BzLT5zZXRDcmVhdGVkKCRjcmVhdGlvbkRhdGUpOwoJCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSAnTGFzdEF1dGhvcicgOgoJCQkJCQkJJGRvY1Byb3BzLT5zZXRMYXN0TW9kaWZpZWRCeShzZWxmOjpfY29udmVydFN0cmluZ0VuY29kaW5nKCRwcm9wZXJ0eVZhbHVlLCR0aGlzLT5fY2hhclNldCkpOwoJCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSAnTGFzdFNhdmVkJyA6CgkJCQkJCQkkbGFzdFNhdmVEYXRlID0gc3RydG90aW1lKCRwcm9wZXJ0eVZhbHVlKTsKCQkJCQkJCSRkb2NQcm9wcy0+c2V0TW9kaWZpZWQoJGxhc3RTYXZlRGF0ZSk7CgkJCQkJCQlicmVhazsKCQkJCQljYXNlICdDb21wYW55JyA6CgkJCQkJCQkkZG9jUHJvcHMtPnNldENvbXBhbnkoc2VsZjo6X2NvbnZlcnRTdHJpbmdFbmNvZGluZygkcHJvcGVydHlWYWx1ZSwkdGhpcy0+X2NoYXJTZXQpKTsKCQkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgJ0NhdGVnb3J5JyA6CgkJCQkJCQkkZG9jUHJvcHMtPnNldENhdGVnb3J5KHNlbGY6Ol9jb252ZXJ0U3RyaW5nRW5jb2RpbmcoJHByb3BlcnR5VmFsdWUsJHRoaXMtPl9jaGFyU2V0KSk7CgkJCQkJCQlicmVhazsKCQkJCQljYXNlICdNYW5hZ2VyJyA6CgkJCQkJCQkkZG9jUHJvcHMtPnNldE1hbmFnZXIoc2VsZjo6X2NvbnZlcnRTdHJpbmdFbmNvZGluZygkcHJvcGVydHlWYWx1ZSwkdGhpcy0+X2NoYXJTZXQpKTsKCQkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgJ0tleXdvcmRzJyA6CgkJCQkJCQkkZG9jUHJvcHMtPnNldEtleXdvcmRzKHNlbGY6Ol9jb252ZXJ0U3RyaW5nRW5jb2RpbmcoJHByb3BlcnR5VmFsdWUsJHRoaXMtPl9jaGFyU2V0KSk7CgkJCQkJCQlicmVhazsKCQkJCQljYXNlICdEZXNjcmlwdGlvbicgOgoJCQkJCQkJJGRvY1Byb3BzLT5zZXREZXNjcmlwdGlvbihzZWxmOjpfY29udmVydFN0cmluZ0VuY29kaW5nKCRwcm9wZXJ0eVZhbHVlLCR0aGlzLT5fY2hhclNldCkpOwoJCQkJCQkJYnJlYWs7CgkJCQl9CgkJCX0KCQl9CgkJaWYgKGlzc2V0KCR4bWwtPkN1c3RvbURvY3VtZW50UHJvcGVydGllcykpIHsKCQkJZm9yZWFjaCgkeG1sLT5DdXN0b21Eb2N1bWVudFByb3BlcnRpZXNbMF0gYXMgJHByb3BlcnR5TmFtZSA9PiAkcHJvcGVydHlWYWx1ZSkgewoJCQkJJHByb3BlcnR5QXR0cmlidXRlcyA9ICRwcm9wZXJ0eVZhbHVlLT5hdHRyaWJ1dGVzKCRuYW1lc3BhY2VzWydkdCddKTsKCQkJCSRwcm9wZXJ0eU5hbWUgPSBwcmVnX3JlcGxhY2VfY2FsbGJhY2soJy9feChbMC05YS16XXs0fSlfLycsJ1BIUEV4Y2VsX1JlYWRlcl9FeGNlbDIwMDNYTUw6Ol9oZXgyc3RyJywkcHJvcGVydHlOYW1lKTsKCQkJCSRwcm9wZXJ0eVR5cGUgPSBQSFBFeGNlbF9Eb2N1bWVudFByb3BlcnRpZXM6OlBST1BFUlRZX1RZUEVfVU5LTk9XTjsKCQkJCXN3aXRjaCgoc3RyaW5nKSAkcHJvcGVydHlBdHRyaWJ1dGVzKSB7CgkJCQkJY2FzZSAnc3RyaW5nJyA6CgkJCQkJCSRwcm9wZXJ0eVR5cGUgPSBQSFBFeGNlbF9Eb2N1bWVudFByb3BlcnRpZXM6OlBST1BFUlRZX1RZUEVfU1RSSU5HOwoJCQkJCQkkcHJvcGVydHlWYWx1ZSA9IHRyaW0oJHByb3BlcnR5VmFsdWUpOwoJCQkJCQlicmVhazsKCQkJCQljYXNlICdib29sZWFuJyA6CgkJCQkJCSRwcm9wZXJ0eVR5cGUgPSBQSFBFeGNlbF9Eb2N1bWVudFByb3BlcnRpZXM6OlBST1BFUlRZX1RZUEVfQk9PTEVBTjsKCQkJCQkJJHByb3BlcnR5VmFsdWUgPSAoYm9vbCkgJHByb3BlcnR5VmFsdWU7CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgJ2ludGVnZXInIDoKCQkJCQkJJHByb3BlcnR5VHlwZSA9IFBIUEV4Y2VsX0RvY3VtZW50UHJvcGVydGllczo6UFJPUEVSVFlfVFlQRV9JTlRFR0VSOwoJCQkJCQkkcHJvcGVydHlWYWx1ZSA9IGludHZhbCgkcHJvcGVydHlWYWx1ZSk7CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgJ2Zsb2F0JyA6CgkJCQkJCSRwcm9wZXJ0eVR5cGUgPSBQSFBFeGNlbF9Eb2N1bWVudFByb3BlcnRpZXM6OlBST1BFUlRZX1RZUEVfRkxPQVQ7CgkJCQkJCSRwcm9wZXJ0eVZhbHVlID0gZmxvYXR2YWwoJHByb3BlcnR5VmFsdWUpOwoJCQkJCQlicmVhazsKCQkJCQljYXNlICdkYXRlVGltZS50eicgOgoJCQkJCQkkcHJvcGVydHlUeXBlID0gUEhQRXhjZWxfRG9jdW1lbnRQcm9wZXJ0aWVzOjpQUk9QRVJUWV9UWVBFX0RBVEU7CgkJCQkJCSRwcm9wZXJ0eVZhbHVlID0gc3RydG90aW1lKHRyaW0oJHByb3BlcnR5VmFsdWUpKTsKCQkJCQkJYnJlYWs7CgkJCQl9CgkJCQkkZG9jUHJvcHMtPnNldEN1c3RvbVByb3BlcnR5KCRwcm9wZXJ0eU5hbWUsJHByb3BlcnR5VmFsdWUsJHByb3BlcnR5VHlwZSk7CgkJCX0KCQl9CgoJCWZvcmVhY2goJHhtbC0+U3R5bGVzWzBdIGFzICRzdHlsZSkgewoJCQkkc3R5bGVfc3MgPSAkc3R5bGUtPmF0dHJpYnV0ZXMoJG5hbWVzcGFjZXNbJ3NzJ10pOwoJCQkkc3R5bGVJRCA9IChzdHJpbmcpICRzdHlsZV9zc1snSUQnXTsKLy8JCQllY2hvICdTdHlsZSBJRCA9ICcuJHN0eWxlSUQuJzxiciAvPic7CgkJCWlmICgkc3R5bGVJRCA9PSAnRGVmYXVsdCcpIHsKCQkJCSR0aGlzLT5fc3R5bGVzWydEZWZhdWx0J10gPSBhcnJheSgpOwoJCQl9IGVsc2UgewoJCQkJJHRoaXMtPl9zdHlsZXNbJHN0eWxlSURdID0gJHRoaXMtPl9zdHlsZXNbJ0RlZmF1bHQnXTsKCQkJfQoJCQlmb3JlYWNoICgkc3R5bGUgYXMgJHN0eWxlVHlwZSA9PiAkc3R5bGVEYXRhKSB7CgkJCQkkc3R5bGVBdHRyaWJ1dGVzID0gJHN0eWxlRGF0YS0+YXR0cmlidXRlcygkbmFtZXNwYWNlc1snc3MnXSk7Ci8vCQkJCWVjaG8gJHN0eWxlVHlwZS4nPGJyIC8+JzsKCQkJCXN3aXRjaCAoJHN0eWxlVHlwZSkgewoJCQkJCWNhc2UgJ0FsaWdubWVudCcgOgoJCQkJCQkJZm9yZWFjaCgkc3R5bGVBdHRyaWJ1dGVzIGFzICRzdHlsZUF0dHJpYnV0ZUtleSA9PiAkc3R5bGVBdHRyaWJ1dGVWYWx1ZSkgewovLwkJCQkJCQkJZWNobyAkc3R5bGVBdHRyaWJ1dGVLZXkuJyA9ICcuJHN0eWxlQXR0cmlidXRlVmFsdWUuJzxiciAvPic7CgkJCQkJCQkJJHN0eWxlQXR0cmlidXRlVmFsdWUgPSAoc3RyaW5nKSAkc3R5bGVBdHRyaWJ1dGVWYWx1ZTsKCQkJCQkJCQlzd2l0Y2ggKCRzdHlsZUF0dHJpYnV0ZUtleSkgewoJCQkJCQkJCQljYXNlICdWZXJ0aWNhbCcgOgoJCQkJCQkJCQkJCWlmIChzZWxmOjppZGVudGlmeUZpeGVkU3R5bGVWYWx1ZSgkdmVydGljYWxBbGlnbm1lbnRTdHlsZXMsJHN0eWxlQXR0cmlidXRlVmFsdWUpKSB7CgkJCQkJCQkJCQkJCSR0aGlzLT5fc3R5bGVzWyRzdHlsZUlEXVsnYWxpZ25tZW50J11bJ3ZlcnRpY2FsJ10gPSAkc3R5bGVBdHRyaWJ1dGVWYWx1ZTsKCQkJCQkJCQkJCQl9CgkJCQkJCQkJCQkJYnJlYWs7CgkJCQkJCQkJCWNhc2UgJ0hvcml6b250YWwnIDoKCQkJCQkJCQkJCQlpZiAoc2VsZjo6aWRlbnRpZnlGaXhlZFN0eWxlVmFsdWUoJGhvcml6b250YWxBbGlnbm1lbnRTdHlsZXMsJHN0eWxlQXR0cmlidXRlVmFsdWUpKSB7CgkJCQkJCQkJCQkJCSR0aGlzLT5fc3R5bGVzWyRzdHlsZUlEXVsnYWxpZ25tZW50J11bJ2hvcml6b250YWwnXSA9ICRzdHlsZUF0dHJpYnV0ZVZhbHVlOwoJCQkJCQkJCQkJCX0KCQkJCQkJCQkJCQlicmVhazsKCQkJCQkJCQkJY2FzZSAnV3JhcFRleHQnIDoKCQkJCQkJCQkJCQkkdGhpcy0+X3N0eWxlc1skc3R5bGVJRF1bJ2FsaWdubWVudCddWyd3cmFwJ10gPSB0cnVlOwoJCQkJCQkJCQkJCWJyZWFrOwoJCQkJCQkJCX0KCQkJCQkJCX0KCQkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgJ0JvcmRlcnMnIDoKCQkJCQkJCWZvcmVhY2goJHN0eWxlRGF0YS0+Qm9yZGVyIGFzICRib3JkZXJTdHlsZSkgewoJCQkJCQkJCSRib3JkZXJBdHRyaWJ1dGVzID0gJGJvcmRlclN0eWxlLT5hdHRyaWJ1dGVzKCRuYW1lc3BhY2VzWydzcyddKTsKCQkJCQkJCQkkdGhpc0JvcmRlciA9IGFycmF5KCk7CgkJCQkJCQkJZm9yZWFjaCgkYm9yZGVyQXR0cmlidXRlcyBhcyAkYm9yZGVyU3R5bGVLZXkgPT4gJGJvcmRlclN0eWxlVmFsdWUpIHsKLy8JCQkJCQkJCQllY2hvICRib3JkZXJTdHlsZUtleS4nID0gJy4kYm9yZGVyU3R5bGVWYWx1ZS4nPGJyIC8+JzsKCQkJCQkJCQkJc3dpdGNoICgkYm9yZGVyU3R5bGVLZXkpIHsKCQkJCQkJCQkJCWNhc2UgJ0xpbmVTdHlsZScgOgoJCQkJCQkJCQkJCQkkdGhpc0JvcmRlclsnc3R5bGUnXSA9IFBIUEV4Y2VsX1N0eWxlX0JvcmRlcjo6Qk9SREVSX01FRElVTTsKLy8JCQkJCQkJCQkJCQkkdGhpc0JvcmRlclsnc3R5bGUnXSA9ICRib3JkZXJTdHlsZVZhbHVlOwoJCQkJCQkJCQkJCQlicmVhazsKCQkJCQkJCQkJCWNhc2UgJ1dlaWdodCcgOgovLwkJCQkJCQkJCQkJCSR0aGlzQm9yZGVyWydzdHlsZSddID0gJGJvcmRlclN0eWxlVmFsdWU7CgkJCQkJCQkJCQkJCWJyZWFrOwoJCQkJCQkJCQkJY2FzZSAnUG9zaXRpb24nIDoKCQkJCQkJCQkJCQkJJGJvcmRlclBvc2l0aW9uID0gc3RydG9sb3dlcigkYm9yZGVyU3R5bGVWYWx1ZSk7CgkJCQkJCQkJCQkJCWJyZWFrOwoJCQkJCQkJCQkJY2FzZSAnQ29sb3InIDoKCQkJCQkJCQkJCQkJJGJvcmRlckNvbG91ciA9IHN1YnN0cigkYm9yZGVyU3R5bGVWYWx1ZSwxKTsKCQkJCQkJCQkJCQkJJHRoaXNCb3JkZXJbJ2NvbG9yJ11bJ3JnYiddID0gJGJvcmRlckNvbG91cjsKCQkJCQkJCQkJCQkJYnJlYWs7CgkJCQkJCQkJCX0KCQkJCQkJCQl9CgkJCQkJCQkJaWYgKCFlbXB0eSgkdGhpc0JvcmRlcikpIHsKCQkJCQkJCQkJaWYgKCgkYm9yZGVyUG9zaXRpb24gPT0gJ2xlZnQnKSB8fCAoJGJvcmRlclBvc2l0aW9uID09ICdyaWdodCcpIHx8ICgkYm9yZGVyUG9zaXRpb24gPT0gJ3RvcCcpIHx8ICgkYm9yZGVyUG9zaXRpb24gPT0gJ2JvdHRvbScpKSB7CgkJCQkJCQkJCQkkdGhpcy0+X3N0eWxlc1skc3R5bGVJRF1bJ2JvcmRlcnMnXVskYm9yZGVyUG9zaXRpb25dID0gJHRoaXNCb3JkZXI7CgkJCQkJCQkJCX0KCQkJCQkJCQl9CgkJCQkJCQl9CgkJCQkJCQlicmVhazsKCQkJCQljYXNlICdGb250JyA6CgkJCQkJCQlmb3JlYWNoKCRzdHlsZUF0dHJpYnV0ZXMgYXMgJHN0eWxlQXR0cmlidXRlS2V5ID0+ICRzdHlsZUF0dHJpYnV0ZVZhbHVlKSB7Ci8vCQkJCQkJCQllY2hvICRzdHlsZUF0dHJpYnV0ZUtleS4nID0gJy4kc3R5bGVBdHRyaWJ1dGVWYWx1ZS4nPGJyIC8+JzsKCQkJCQkJCQkkc3R5bGVBdHRyaWJ1dGVWYWx1ZSA9IChzdHJpbmcpICRzdHlsZUF0dHJpYnV0ZVZhbHVlOwoJCQkJCQkJCXN3aXRjaCAoJHN0eWxlQXR0cmlidXRlS2V5KSB7CgkJCQkJCQkJCWNhc2UgJ0ZvbnROYW1lJyA6CgkJCQkJCQkJCQkJJHRoaXMtPl9zdHlsZXNbJHN0eWxlSURdWydmb250J11bJ25hbWUnXSA9ICRzdHlsZUF0dHJpYnV0ZVZhbHVlOwoJCQkJCQkJCQkJCWJyZWFrOwoJCQkJCQkJCQljYXNlICdTaXplJyA6CgkJCQkJCQkJCQkJJHRoaXMtPl9zdHlsZXNbJHN0eWxlSURdWydmb250J11bJ3NpemUnXSA9ICRzdHlsZUF0dHJpYnV0ZVZhbHVlOwoJCQkJCQkJCQkJCWJyZWFrOwoJCQkJCQkJCQljYXNlICdDb2xvcicgOgoJCQkJCQkJCQkJCSR0aGlzLT5fc3R5bGVzWyRzdHlsZUlEXVsnZm9udCddWydjb2xvciddWydyZ2InXSA9IHN1YnN0cigkc3R5bGVBdHRyaWJ1dGVWYWx1ZSwxKTsKCQkJCQkJCQkJCQlicmVhazsKCQkJCQkJCQkJY2FzZSAnQm9sZCcgOgoJCQkJCQkJCQkJCSR0aGlzLT5fc3R5bGVzWyRzdHlsZUlEXVsnZm9udCddWydib2xkJ10gPSB0cnVlOwoJCQkJCQkJCQkJCWJyZWFrOwoJCQkJCQkJCQljYXNlICdJdGFsaWMnIDoKCQkJCQkJCQkJCQkkdGhpcy0+X3N0eWxlc1skc3R5bGVJRF1bJ2ZvbnQnXVsnaXRhbGljJ10gPSB0cnVlOwoJCQkJCQkJCQkJCWJyZWFrOwoJCQkJCQkJCQljYXNlICdVbmRlcmxpbmUnIDoKCQkJCQkJCQkJCQlpZiAoc2VsZjo6aWRlbnRpZnlGaXhlZFN0eWxlVmFsdWUoJHVuZGVybGluZVN0eWxlcywkc3R5bGVBdHRyaWJ1dGVWYWx1ZSkpIHsKCQkJCQkJCQkJCQkJJHRoaXMtPl9zdHlsZXNbJHN0eWxlSURdWydmb250J11bJ3VuZGVybGluZSddID0gJHN0eWxlQXR0cmlidXRlVmFsdWU7CgkJCQkJCQkJCQkJfQoJCQkJCQkJCQkJCWJyZWFrOwoJCQkJCQkJCX0KCQkJCQkJCX0KCQkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgJ0ludGVyaW9yJyA6CgkJCQkJCQlmb3JlYWNoKCRzdHlsZUF0dHJpYnV0ZXMgYXMgJHN0eWxlQXR0cmlidXRlS2V5ID0+ICRzdHlsZUF0dHJpYnV0ZVZhbHVlKSB7Ci8vCQkJCQkJCQllY2hvICRzdHlsZUF0dHJpYnV0ZUtleS4nID0gJy4kc3R5bGVBdHRyaWJ1dGVWYWx1ZS4nPGJyIC8+JzsKCQkJCQkJCQlzd2l0Y2ggKCRzdHlsZUF0dHJpYnV0ZUtleSkgewoJCQkJCQkJCQljYXNlICdDb2xvcicgOgoJCQkJCQkJCQkJCSR0aGlzLT5fc3R5bGVzWyRzdHlsZUlEXVsnZmlsbCddWydjb2xvciddWydyZ2InXSA9IHN1YnN0cigkc3R5bGVBdHRyaWJ1dGVWYWx1ZSwxKTsKCQkJCQkJCQkJCQlicmVhazsKCQkJCQkJCQl9CgkJCQkJCQl9CgkJCQkJCQlicmVhazsKCQkJCQljYXNlICdOdW1iZXJGb3JtYXQnIDoKCQkJCQkJCWZvcmVhY2goJHN0eWxlQXR0cmlidXRlcyBhcyAkc3R5bGVBdHRyaWJ1dGVLZXkgPT4gJHN0eWxlQXR0cmlidXRlVmFsdWUpIHsKLy8JCQkJCQkJCWVjaG8gJHN0eWxlQXR0cmlidXRlS2V5LicgPSAnLiRzdHlsZUF0dHJpYnV0ZVZhbHVlLic8YnIgLz4nOwoJCQkJCQkJCSRzdHlsZUF0dHJpYnV0ZVZhbHVlID0gc3RyX3JlcGxhY2UoJGZyb21Gb3JtYXRzLCR0b0Zvcm1hdHMsJHN0eWxlQXR0cmlidXRlVmFsdWUpOwoJCQkJCQkJCXN3aXRjaCAoJHN0eWxlQXR0cmlidXRlVmFsdWUpIHsKCQkJCQkJCQkJY2FzZSAnU2hvcnQgRGF0ZScgOgoJCQkJCQkJCQkJCSRzdHlsZUF0dHJpYnV0ZVZhbHVlID0gJ2RkL21tL3l5eXknOwoJCQkJCQkJCQkJCWJyZWFrOwoJCQkJCQkJCX0KCQkJCQkJCQlpZiAoJHN0eWxlQXR0cmlidXRlVmFsdWUgPiAnJykgewoJCQkJCQkJCQkkdGhpcy0+X3N0eWxlc1skc3R5bGVJRF1bJ251bWJlcmZvcm1hdCddWydjb2RlJ10gPSAkc3R5bGVBdHRyaWJ1dGVWYWx1ZTsKCQkJCQkJCQl9CgkJCQkJCQl9CgkJCQkJCQlicmVhazsKCQkJCQljYXNlICdQcm90ZWN0aW9uJyA6CgkJCQkJCQlmb3JlYWNoKCRzdHlsZUF0dHJpYnV0ZXMgYXMgJHN0eWxlQXR0cmlidXRlS2V5ID0+ICRzdHlsZUF0dHJpYnV0ZVZhbHVlKSB7Ci8vCQkJCQkJCQllY2hvICRzdHlsZUF0dHJpYnV0ZUtleS4nID0gJy4kc3R5bGVBdHRyaWJ1dGVWYWx1ZS4nPGJyIC8+JzsKCQkJCQkJCX0KCQkJCQkJCWJyZWFrOwoJCQkJfQoJCQl9Ci8vCQkJcHJpbnRfcigkdGhpcy0+X3N0eWxlc1skc3R5bGVJRF0pOwovLwkJCWVjaG8gJzxociAvPic7CgkJfQovLwkJZWNobyAnPGhyIC8+JzsKCgkJJHdvcmtzaGVldElEID0gMDsKCQkkeG1sX3NzID0gJHhtbC0+Y2hpbGRyZW4oJG5hbWVzcGFjZXNbJ3NzJ10pOwoKCQlmb3JlYWNoKCR4bWxfc3MtPldvcmtzaGVldCBhcyAkd29ya3NoZWV0KSB7CgkJCSR3b3Jrc2hlZXRfc3MgPSAkd29ya3NoZWV0LT5hdHRyaWJ1dGVzKCRuYW1lc3BhY2VzWydzcyddKTsKCgkJCWlmICgoaXNzZXQoJHRoaXMtPl9sb2FkU2hlZXRzT25seSkpICYmIChpc3NldCgkd29ya3NoZWV0X3NzWydOYW1lJ10pKSAmJgoJCQkJKCFpbl9hcnJheSgkd29ya3NoZWV0X3NzWydOYW1lJ10sICR0aGlzLT5fbG9hZFNoZWV0c09ubHkpKSkgewoJCQkJY29udGludWU7CgkJCX0KCi8vCQkJZWNobyAnPGgzPldvcmtzaGVldDogJywkd29ya3NoZWV0X3NzWydOYW1lJ10sJzxoMz4nOwovLwoJCQkvLyBDcmVhdGUgbmV3IFdvcmtzaGVldAoJCQkkb2JqUEhQRXhjZWwtPmNyZWF0ZVNoZWV0KCk7CgkJCSRvYmpQSFBFeGNlbC0+c2V0QWN0aXZlU2hlZXRJbmRleCgkd29ya3NoZWV0SUQpOwoJCQlpZiAoaXNzZXQoJHdvcmtzaGVldF9zc1snTmFtZSddKSkgewoJCQkJJHdvcmtzaGVldE5hbWUgPSBzZWxmOjpfY29udmVydFN0cmluZ0VuY29kaW5nKChzdHJpbmcpICR3b3Jrc2hlZXRfc3NbJ05hbWUnXSwkdGhpcy0+X2NoYXJTZXQpOwoJCQkJLy8JVXNlIGZhbHNlIGZvciAkdXBkYXRlRm9ybXVsYUNlbGxSZWZlcmVuY2VzIHRvIHByZXZlbnQgYWRqdXN0bWVudCBvZiB3b3Jrc2hlZXQgcmVmZXJlbmNlcyBpbgoJCQkJLy8JCWZvcm11bGEgY2VsbHMuLi4gZHVyaW5nIHRoZSBsb2FkLCBhbGwgZm9ybXVsYWUgc2hvdWxkIGJlIGNvcnJlY3QsIGFuZCB3ZSdyZSBzaW1wbHkgYnJpbmdpbmcKCQkJCS8vCQl0aGUgd29ya3NoZWV0IG5hbWUgaW4gbGluZSB3aXRoIHRoZSBmb3JtdWxhLCBub3QgdGhlIHJldmVyc2UKCQkJCSRvYmpQSFBFeGNlbC0+Z2V0QWN0aXZlU2hlZXQoKS0+c2V0VGl0bGUoJHdvcmtzaGVldE5hbWUsZmFsc2UpOwoJCQl9CgoJCQkkY29sdW1uSUQgPSAnQSc7CgkJCWlmIChpc3NldCgkd29ya3NoZWV0LT5UYWJsZS0+Q29sdW1uKSkgewoJCQkJZm9yZWFjaCgkd29ya3NoZWV0LT5UYWJsZS0+Q29sdW1uIGFzICRjb2x1bW5EYXRhKSB7CgkJCQkJJGNvbHVtbkRhdGFfc3MgPSAkY29sdW1uRGF0YS0+YXR0cmlidXRlcygkbmFtZXNwYWNlc1snc3MnXSk7CgkJCQkJaWYgKGlzc2V0KCRjb2x1bW5EYXRhX3NzWydJbmRleCddKSkgewoJCQkJCQkkY29sdW1uSUQgPSBQSFBFeGNlbF9DZWxsOjpzdHJpbmdGcm9tQ29sdW1uSW5kZXgoJGNvbHVtbkRhdGFfc3NbJ0luZGV4J10tMSk7CgkJCQkJfQoJCQkJCWlmIChpc3NldCgkY29sdW1uRGF0YV9zc1snV2lkdGgnXSkpIHsKCQkJCQkJJGNvbHVtbldpZHRoID0gJGNvbHVtbkRhdGFfc3NbJ1dpZHRoJ107Ci8vCQkJCQkJZWNobyAnPGI+U2V0dGluZyBjb2x1bW4gd2lkdGggZm9yICcuJGNvbHVtbklELicgdG8gJy4kY29sdW1uV2lkdGguJzwvYj48YnIgLz4nOwoJCQkJCQkkb2JqUEhQRXhjZWwtPmdldEFjdGl2ZVNoZWV0KCktPmdldENvbHVtbkRpbWVuc2lvbigkY29sdW1uSUQpLT5zZXRXaWR0aCgkY29sdW1uV2lkdGggLyA1LjQpOwoJCQkJCX0KCQkJCQkrKyRjb2x1bW5JRDsKCQkJCX0KCQkJfQoKCQkJJHJvd0lEID0gMTsKCQkJaWYgKGlzc2V0KCR3b3Jrc2hlZXQtPlRhYmxlLT5Sb3cpKSB7CgkJCQlmb3JlYWNoKCR3b3Jrc2hlZXQtPlRhYmxlLT5Sb3cgYXMgJHJvd0RhdGEpIHsKCQkJCQkkcm93SGFzRGF0YSA9IGZhbHNlOwoJCQkJCSRyb3dfc3MgPSAkcm93RGF0YS0+YXR0cmlidXRlcygkbmFtZXNwYWNlc1snc3MnXSk7CgkJCQkJaWYgKGlzc2V0KCRyb3dfc3NbJ0luZGV4J10pKSB7CgkJCQkJCSRyb3dJRCA9IChpbnRlZ2VyKSAkcm93X3NzWydJbmRleCddOwoJCQkJCX0KLy8JCQkJCWVjaG8gJzxiPlJvdyAnLiRyb3dJRC4nPC9iPjxiciAvPic7CgoJCQkJCSRjb2x1bW5JRCA9ICdBJzsKCQkJCQlmb3JlYWNoKCRyb3dEYXRhLT5DZWxsIGFzICRjZWxsKSB7CgoJCQkJCQkkY2VsbF9zcyA9ICRjZWxsLT5hdHRyaWJ1dGVzKCRuYW1lc3BhY2VzWydzcyddKTsKCQkJCQkJaWYgKGlzc2V0KCRjZWxsX3NzWydJbmRleCddKSkgewoJCQkJCQkJJGNvbHVtbklEID0gUEhQRXhjZWxfQ2VsbDo6c3RyaW5nRnJvbUNvbHVtbkluZGV4KCRjZWxsX3NzWydJbmRleCddLTEpOwoJCQkJCQl9CgkJCQkJCSRjZWxsUmFuZ2UgPSAkY29sdW1uSUQuJHJvd0lEOwoKCQkJCQkJaWYgKCR0aGlzLT5nZXRSZWFkRmlsdGVyKCkgIT09IE5VTEwpIHsKCQkJCQkJCWlmICghJHRoaXMtPmdldFJlYWRGaWx0ZXIoKS0+cmVhZENlbGwoJGNvbHVtbklELCAkcm93SUQsICR3b3Jrc2hlZXROYW1lKSkgewoJCQkJCQkJCWNvbnRpbnVlOwoJCQkJCQkJfQoJCQkJCQl9CgoJCQkJCQlpZiAoKGlzc2V0KCRjZWxsX3NzWydNZXJnZUFjcm9zcyddKSkgfHwgKGlzc2V0KCRjZWxsX3NzWydNZXJnZURvd24nXSkpKSB7CgkJCQkJCQkkY29sdW1uVG8gPSAkY29sdW1uSUQ7CgkJCQkJCQlpZiAoaXNzZXQoJGNlbGxfc3NbJ01lcmdlQWNyb3NzJ10pKSB7CgkJCQkJCQkJJGNvbHVtblRvID0gUEhQRXhjZWxfQ2VsbDo6c3RyaW5nRnJvbUNvbHVtbkluZGV4KFBIUEV4Y2VsX0NlbGw6OmNvbHVtbkluZGV4RnJvbVN0cmluZygkY29sdW1uSUQpICsgJGNlbGxfc3NbJ01lcmdlQWNyb3NzJ10gLTEpOwoJCQkJCQkJfQoJCQkJCQkJJHJvd1RvID0gJHJvd0lEOwoJCQkJCQkJaWYgKGlzc2V0KCRjZWxsX3NzWydNZXJnZURvd24nXSkpIHsKCQkJCQkJCQkkcm93VG8gPSAkcm93VG8gKyAkY2VsbF9zc1snTWVyZ2VEb3duJ107CgkJCQkJCQl9CgkJCQkJCQkkY2VsbFJhbmdlIC49ICc6Jy4kY29sdW1uVG8uJHJvd1RvOwoJCQkJCQkJJG9ialBIUEV4Y2VsLT5nZXRBY3RpdmVTaGVldCgpLT5tZXJnZUNlbGxzKCRjZWxsUmFuZ2UpOwoJCQkJCQl9CgoJCQkJCQkkY2VsbElzU2V0ID0gJGhhc0NhbGN1bGF0ZWRWYWx1ZSA9IGZhbHNlOwoJCQkJCQkkY2VsbERhdGFGb3JtdWxhID0gJyc7CgkJCQkJCWlmIChpc3NldCgkY2VsbF9zc1snRm9ybXVsYSddKSkgewoJCQkJCQkJJGNlbGxEYXRhRm9ybXVsYSA9ICRjZWxsX3NzWydGb3JtdWxhJ107CgkJCQkJCQkvLyBhZGRlZCB0aGlzIGFzIGEgY2hlY2sgZm9yIGFycmF5IGZvcm11bGFzCgkJCQkJCQlpZiAoaXNzZXQoJGNlbGxfc3NbJ0FycmF5UmFuZ2UnXSkpIHsKCQkJCQkJCQkkY2VsbERhdGFDU0VGb3JtdWxhID0gJGNlbGxfc3NbJ0FycmF5UmFuZ2UnXTsKLy8JCQkJCQkJCWVjaG8gImZvdW5kIGFuIGFycmF5IGZvcm11bGEgYXQgIi4kY29sdW1uSUQuJHJvd0lELiI8YnIgLz4iOwoJCQkJCQkJfQoJCQkJCQkJJGhhc0NhbGN1bGF0ZWRWYWx1ZSA9IHRydWU7CgkJCQkJCX0KCQkJCQkJaWYgKGlzc2V0KCRjZWxsLT5EYXRhKSkgewoJCQkJCQkJJGNlbGxWYWx1ZSA9ICRjZWxsRGF0YSA9ICRjZWxsLT5EYXRhOwoJCQkJCQkJJHR5cGUgPSBQSFBFeGNlbF9DZWxsX0RhdGFUeXBlOjpUWVBFX05VTEw7CgkJCQkJCQkkY2VsbERhdGFfc3MgPSAkY2VsbERhdGEtPmF0dHJpYnV0ZXMoJG5hbWVzcGFjZXNbJ3NzJ10pOwoJCQkJCQkJaWYgKGlzc2V0KCRjZWxsRGF0YV9zc1snVHlwZSddKSkgewoJCQkJCQkJCSRjZWxsRGF0YVR5cGUgPSAkY2VsbERhdGFfc3NbJ1R5cGUnXTsKCQkJCQkJCQlzd2l0Y2ggKCRjZWxsRGF0YVR5cGUpIHsKCQkJCQkJCQkJLyoKCQkJCQkJCQkJY29uc3QgVFlQRV9TVFJJTkcJCT0gJ3MnOwoJCQkJCQkJCQljb25zdCBUWVBFX0ZPUk1VTEEJCT0gJ2YnOwoJCQkJCQkJCQljb25zdCBUWVBFX05VTUVSSUMJCT0gJ24nOwoJCQkJCQkJCQljb25zdCBUWVBFX0JPT0wJCQk9ICdiJzsKCQkJCQkJCQkgICAgY29uc3QgVFlQRV9OVUxMCQkJPSAnbnVsbCc7CgkJCQkJCQkJICAgIGNvbnN0IFRZUEVfSU5MSU5FCQk9ICdpbmxpbmVTdHInOwoJCQkJCQkJCQljb25zdCBUWVBFX0VSUk9SCQk9ICdlJzsKCQkJCQkJCQkJKi8KCQkJCQkJCQkJY2FzZSAnU3RyaW5nJyA6CgkJCQkJCQkJCQkJJGNlbGxWYWx1ZSA9IHNlbGY6Ol9jb252ZXJ0U3RyaW5nRW5jb2RpbmcoJGNlbGxWYWx1ZSwkdGhpcy0+X2NoYXJTZXQpOwoJCQkJCQkJCQkJCSR0eXBlID0gUEhQRXhjZWxfQ2VsbF9EYXRhVHlwZTo6VFlQRV9TVFJJTkc7CgkJCQkJCQkJCQkJYnJlYWs7CgkJCQkJCQkJCWNhc2UgJ051bWJlcicgOgoJCQkJCQkJCQkJCSR0eXBlID0gUEhQRXhjZWxfQ2VsbF9EYXRhVHlwZTo6VFlQRV9OVU1FUklDOwoJCQkJCQkJCQkJCSRjZWxsVmFsdWUgPSAoZmxvYXQpICRjZWxsVmFsdWU7CgkJCQkJCQkJCQkJaWYgKGZsb29yKCRjZWxsVmFsdWUpID09ICRjZWxsVmFsdWUpIHsKCQkJCQkJCQkJCQkJJGNlbGxWYWx1ZSA9IChpbnRlZ2VyKSAkY2VsbFZhbHVlOwoJCQkJCQkJCQkJCX0KCQkJCQkJCQkJCQlicmVhazsKCQkJCQkJCQkJY2FzZSAnQm9vbGVhbicgOgoJCQkJCQkJCQkJCSR0eXBlID0gUEhQRXhjZWxfQ2VsbF9EYXRhVHlwZTo6VFlQRV9CT09MOwoJCQkJCQkJCQkJCSRjZWxsVmFsdWUgPSAoJGNlbGxWYWx1ZSAhPSAwKTsKCQkJCQkJCQkJCQlicmVhazsKCQkJCQkJCQkJY2FzZSAnRGF0ZVRpbWUnIDoKCQkJCQkJCQkJCQkkdHlwZSA9IFBIUEV4Y2VsX0NlbGxfRGF0YVR5cGU6OlRZUEVfTlVNRVJJQzsKCQkJCQkJCQkJCQkkY2VsbFZhbHVlID0gUEhQRXhjZWxfU2hhcmVkX0RhdGU6OlBIUFRvRXhjZWwoc3RydG90aW1lKCRjZWxsVmFsdWUpKTsKCQkJCQkJCQkJCQlicmVhazsKCQkJCQkJCQkJY2FzZSAnRXJyb3InIDoKCQkJCQkJCQkJCQkkdHlwZSA9IFBIUEV4Y2VsX0NlbGxfRGF0YVR5cGU6OlRZUEVfRVJST1I7CgkJCQkJCQkJCQkJYnJlYWs7CgkJCQkJCQkJfQoJCQkJCQkJfQoKCQkJCQkJCWlmICgkaGFzQ2FsY3VsYXRlZFZhbHVlKSB7Ci8vCQkJCQkJCQllY2hvICdGT1JNVUxBPGJyIC8+JzsKCQkJCQkJCQkkdHlwZSA9IFBIUEV4Y2VsX0NlbGxfRGF0YVR5cGU6OlRZUEVfRk9STVVMQTsKCQkJCQkJCQkkY29sdW1uTnVtYmVyID0gUEhQRXhjZWxfQ2VsbDo6Y29sdW1uSW5kZXhGcm9tU3RyaW5nKCRjb2x1bW5JRCk7CgkJCQkJCQkJaWYgKHN1YnN0cigkY2VsbERhdGFGb3JtdWxhLDAsMykgPT0gJ29mOicpIHsKCQkJCQkJCQkJJGNlbGxEYXRhRm9ybXVsYSA9IHN1YnN0cigkY2VsbERhdGFGb3JtdWxhLDMpOwovLwkJCQkJCQkJCWVjaG8gJ0JlZm9yZTogJywkY2VsbERhdGFGb3JtdWxhLCc8YnIgLz4nOwoJCQkJCQkJCQkkdGVtcCA9IGV4cGxvZGUoJyInLCRjZWxsRGF0YUZvcm11bGEpOwoJCQkJCQkJCQkka2V5ID0gZmFsc2U7CgkJCQkJCQkJCWZvcmVhY2goJHRlbXAgYXMgJiR2YWx1ZSkgewoJCQkJCQkJCQkJLy8JT25seSByZXBsYWNlIGluIGFsdGVybmF0ZSBhcnJheSBlbnRyaWVzIChpLmUuIG5vbi1xdW90ZWQgYmxvY2tzKQoJCQkJCQkJCQkJaWYgKCRrZXkgPSAhJGtleSkgewoJCQkJCQkJCQkJCSR2YWx1ZSA9IHN0cl9yZXBsYWNlKGFycmF5KCdbLicsJy4nLCddJyksJycsJHZhbHVlKTsKCQkJCQkJCQkJCX0KCQkJCQkJCQkJfQoJCQkJCQkJCX0gZWxzZSB7CgkJCQkJCQkJCS8vCUNvbnZlcnQgUjFDMSBzdHlsZSByZWZlcmVuY2VzIHRvIEExIHN0eWxlIHJlZmVyZW5jZXMgKGJ1dCBvbmx5IHdoZW4gbm90IHF1b3RlZCkKLy8JCQkJCQkJCQllY2hvICdCZWZvcmU6ICcsJGNlbGxEYXRhRm9ybXVsYSwnPGJyIC8+JzsKCQkJCQkJCQkJJHRlbXAgPSBleHBsb2RlKCciJywkY2VsbERhdGFGb3JtdWxhKTsKCQkJCQkJCQkJJGtleSA9IGZhbHNlOwoJCQkJCQkJCQlmb3JlYWNoKCR0ZW1wIGFzICYkdmFsdWUpIHsKCQkJCQkJCQkJCS8vCU9ubHkgcmVwbGFjZSBpbiBhbHRlcm5hdGUgYXJyYXkgZW50cmllcyAoaS5lLiBub24tcXVvdGVkIGJsb2NrcykKCQkJCQkJCQkJCWlmICgka2V5ID0gISRrZXkpIHsKCQkJCQkJCQkJCQlwcmVnX21hdGNoX2FsbCgnLyhSKFxbPy0/XGQqXF0/KSkoQyhcWz8tP1xkKlxdPykpLycsJHZhbHVlLCAkY2VsbFJlZmVyZW5jZXMsUFJFR19TRVRfT1JERVIrUFJFR19PRkZTRVRfQ0FQVFVSRSk7CgkJCQkJCQkJCQkJLy8JUmV2ZXJzZSB0aGUgbWF0Y2hlcyBhcnJheSwgb3RoZXJ3aXNlIGFsbCBvdXIgb2Zmc2V0cyB3aWxsIGJlY29tZSBpbmNvcnJlY3QgaWYgd2UgbW9kaWZ5IG91ciB3YXkKCQkJCQkJCQkJCQkvLwkJdGhyb3VnaCB0aGUgZm9ybXVsYSBmcm9tIGxlZnQgdG8gcmlnaHQuIFJldmVyc2luZyBtZWFucyB0aGF0IHdlIHdvcmsgcmlnaHQgdG8gbGVmdC50aHJvdWdoCgkJCQkJCQkJCQkJLy8JCXRoZSBmb3JtdWxhCgkJCQkJCQkJCQkJJGNlbGxSZWZlcmVuY2VzID0gYXJyYXlfcmV2ZXJzZSgkY2VsbFJlZmVyZW5jZXMpOwoJCQkJCQkJCQkJCS8vCUxvb3AgdGhyb3VnaCBlYWNoIFIxQzEgc3R5bGUgcmVmZXJlbmNlIGluIHR1cm4sIGNvbnZlcnRpbmcgaXQgdG8gaXRzIEExIHN0eWxlIGVxdWl2YWxlbnQsCgkJCQkJCQkJCQkJLy8JCXRoZW4gbW9kaWZ5IHRoZSBmb3JtdWxhIHRvIHVzZSB0aGF0IG5ldyByZWZlcmVuY2UKCQkJCQkJCQkJCQlmb3JlYWNoKCRjZWxsUmVmZXJlbmNlcyBhcyAkY2VsbFJlZmVyZW5jZSkgewoJCQkJCQkJCQkJCQkkcm93UmVmZXJlbmNlID0gJGNlbGxSZWZlcmVuY2VbMl1bMF07CgkJCQkJCQkJCQkJCS8vCUVtcHR5IFIgcmVmZXJlbmNlIGlzIHRoZSBjdXJyZW50IHJvdwoJCQkJCQkJCQkJCQlpZiAoJHJvd1JlZmVyZW5jZSA9PSAnJykgJHJvd1JlZmVyZW5jZSA9ICRyb3dJRDsKCQkJCQkJCQkJCQkJLy8JQnJhY2tldGVkIFIgcmVmZXJlbmNlcyBhcmUgcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgcm93CgkJCQkJCQkJCQkJCWlmICgkcm93UmVmZXJlbmNlezB9ID09ICdbJykgJHJvd1JlZmVyZW5jZSA9ICRyb3dJRCArIHRyaW0oJHJvd1JlZmVyZW5jZSwnW10nKTsKCQkJCQkJCQkJCQkJJGNvbHVtblJlZmVyZW5jZSA9ICRjZWxsUmVmZXJlbmNlWzRdWzBdOwoJCQkJCQkJCQkJCQkvLwlFbXB0eSBDIHJlZmVyZW5jZSBpcyB0aGUgY3VycmVudCBjb2x1bW4KCQkJCQkJCQkJCQkJaWYgKCRjb2x1bW5SZWZlcmVuY2UgPT0gJycpICRjb2x1bW5SZWZlcmVuY2UgPSAkY29sdW1uTnVtYmVyOwoJCQkJCQkJCQkJCQkvLwlCcmFja2V0ZWQgQyByZWZlcmVuY2VzIGFyZSByZWxhdGl2ZSB0byB0aGUgY3VycmVudCBjb2x1bW4KCQkJCQkJCQkJCQkJaWYgKCRjb2x1bW5SZWZlcmVuY2V7MH0gPT0gJ1snKSAkY29sdW1uUmVmZXJlbmNlID0gJGNvbHVtbk51bWJlciArIHRyaW0oJGNvbHVtblJlZmVyZW5jZSwnW10nKTsKCQkJCQkJCQkJCQkJJEExQ2VsbFJlZmVyZW5jZSA9IFBIUEV4Y2VsX0NlbGw6OnN0cmluZ0Zyb21Db2x1bW5JbmRleCgkY29sdW1uUmVmZXJlbmNlLTEpLiRyb3dSZWZlcmVuY2U7CgkJCQkJCQkJCQkJCQkkdmFsdWUgPSBzdWJzdHJfcmVwbGFjZSgkdmFsdWUsJEExQ2VsbFJlZmVyZW5jZSwkY2VsbFJlZmVyZW5jZVswXVsxXSxzdHJsZW4oJGNlbGxSZWZlcmVuY2VbMF1bMF0pKTsKCQkJCQkJCQkJCQl9CgkJCQkJCQkJCQl9CgkJCQkJCQkJCX0KCQkJCQkJCQl9CgkJCQkJCQkJdW5zZXQoJHZhbHVlKTsKCQkJCQkJCQkvLwlUaGVuIHJlYnVpbGQgdGhlIGZvcm11bGEgc3RyaW5nCgkJCQkJCQkJJGNlbGxEYXRhRm9ybXVsYSA9IGltcGxvZGUoJyInLCR0ZW1wKTsKLy8JCQkJCQkJCWVjaG8gJ0FmdGVyOiAnLCRjZWxsRGF0YUZvcm11bGEsJzxiciAvPic7CgkJCQkJCQl9CgovLwkJCQkJCQllY2hvICdDZWxsICcuJGNvbHVtbklELiRyb3dJRC4nIGlzIGEgJy4kdHlwZS4nIHdpdGggYSB2YWx1ZSBvZiAnLigoJGhhc0NhbGN1bGF0ZWRWYWx1ZSkgPyAkY2VsbERhdGFGb3JtdWxhIDogJGNlbGxWYWx1ZSkuJzxiciAvPic7Ci8vCgkJCQkJCQkkb2JqUEhQRXhjZWwtPmdldEFjdGl2ZVNoZWV0KCktPmdldENlbGwoJGNvbHVtbklELiRyb3dJRCktPnNldFZhbHVlRXhwbGljaXQoKCgkaGFzQ2FsY3VsYXRlZFZhbHVlKSA/ICRjZWxsRGF0YUZvcm11bGEgOiAkY2VsbFZhbHVlKSwkdHlwZSk7CgkJCQkJCQlpZiAoJGhhc0NhbGN1bGF0ZWRWYWx1ZSkgewovLwkJCQkJCQkJZWNobyAnRm9ybXVsYSByZXN1bHQgaXMgJy4kY2VsbFZhbHVlLic8YnIgLz4nOwoJCQkJCQkJCSRvYmpQSFBFeGNlbC0+Z2V0QWN0aXZlU2hlZXQoKS0+Z2V0Q2VsbCgkY29sdW1uSUQuJHJvd0lEKS0+c2V0Q2FsY3VsYXRlZFZhbHVlKCRjZWxsVmFsdWUpOwoJCQkJCQkJfQoJCQkJCQkJJGNlbGxJc1NldCA9ICRyb3dIYXNEYXRhID0gdHJ1ZTsKCQkJCQkJfQoKCQkJCQkJaWYgKGlzc2V0KCRjZWxsLT5Db21tZW50KSkgewovLwkJCQkJCQllY2hvICc8Yj5jb21tZW50IGZvdW5kPC9iPjxiciAvPic7CgkJCQkJCQkkY29tbWVudEF0dHJpYnV0ZXMgPSAkY2VsbC0+Q29tbWVudC0+YXR0cmlidXRlcygkbmFtZXNwYWNlc1snc3MnXSk7CgkJCQkJCQkkYXV0aG9yID0gJ3Vua25vd24nOwoJCQkJCQkJaWYgKGlzc2V0KCRjb21tZW50QXR0cmlidXRlcy0+QXV0aG9yKSkgewoJCQkJCQkJCSRhdXRob3IgPSAoc3RyaW5nKSRjb21tZW50QXR0cmlidXRlcy0+QXV0aG9yOwovLwkJCQkJCQkJZWNobyAnQXV0aG9yOiAnLCRhdXRob3IsJzxiciAvPic7CgkJCQkJCQl9CgkJCQkJCQkkbm9kZSA9ICRjZWxsLT5Db21tZW50LT5EYXRhLT5hc1hNTCgpOwovLwkJCQkJCQkkYW5ub3RhdGlvbiA9IHN0cl9yZXBsYWNlKCdodG1sOicsJycsc3Vic3RyKCRub2RlLDQ5LC0xMCkpOwovLwkJCQkJCQllY2hvICRhbm5vdGF0aW9uLCc8YnIgLz4nOwoJCQkJCQkJJGFubm90YXRpb24gPSBzdHJpcF90YWdzKCRub2RlKTsKLy8JCQkJCQkJZWNobyAnQW5ub3RhdGlvbjogJywkYW5ub3RhdGlvbiwnPGJyIC8+JzsKCQkJCQkJCSRvYmpQSFBFeGNlbC0+Z2V0QWN0aXZlU2hlZXQoKS0+Z2V0Q29tbWVudCggJGNvbHVtbklELiRyb3dJRCApCgkJCQkJCQkJCQkJCQkJCS0+c2V0QXV0aG9yKHNlbGY6Ol9jb252ZXJ0U3RyaW5nRW5jb2RpbmcoJGF1dGhvciAsJHRoaXMtPl9jaGFyU2V0KSkKCQkJCQkJCQkJCQkJCQkJLT5zZXRUZXh0KCR0aGlzLT5fcGFyc2VSaWNoVGV4dCgkYW5ub3RhdGlvbikgKTsKCQkJCQkJfQoKCQkJCQkJaWYgKCgkY2VsbElzU2V0KSAmJiAoaXNzZXQoJGNlbGxfc3NbJ1N0eWxlSUQnXSkpKSB7CgkJCQkJCQkkc3R5bGUgPSAoc3RyaW5nKSAkY2VsbF9zc1snU3R5bGVJRCddOwovLwkJCQkJCQllY2hvICdDZWxsIHN0eWxlIGZvciAnLiRjb2x1bW5JRC4kcm93SUQuJyBpcyAnLiRzdHlsZS4nPGJyIC8+JzsKCQkJCQkJCWlmICgoaXNzZXQoJHRoaXMtPl9zdHlsZXNbJHN0eWxlXSkpICYmICghZW1wdHkoJHRoaXMtPl9zdHlsZXNbJHN0eWxlXSkpKSB7Ci8vCQkJCQkJCQllY2hvICdDZWxsICcuJGNvbHVtbklELiRyb3dJRC4nPGJyIC8+JzsKLy8JCQkJCQkJCXByaW50X3IoJHRoaXMtPl9zdHlsZXNbJHN0eWxlXSk7Ci8vCQkJCQkJCQllY2hvICc8YnIgLz4nOwoJCQkJCQkJCWlmICghJG9ialBIUEV4Y2VsLT5nZXRBY3RpdmVTaGVldCgpLT5jZWxsRXhpc3RzKCRjb2x1bW5JRC4kcm93SUQpKSB7CgkJCQkJCQkJCSRvYmpQSFBFeGNlbC0+Z2V0QWN0aXZlU2hlZXQoKS0+Z2V0Q2VsbCgkY29sdW1uSUQuJHJvd0lEKS0+c2V0VmFsdWUoTlVMTCk7CgkJCQkJCQkJfQoJCQkJCQkJCSRvYmpQSFBFeGNlbC0+Z2V0QWN0aXZlU2hlZXQoKS0+Z2V0U3R5bGUoJGNlbGxSYW5nZSktPmFwcGx5RnJvbUFycmF5KCR0aGlzLT5fc3R5bGVzWyRzdHlsZV0pOwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJCSsrJGNvbHVtbklEOwoJCQkJCX0KCgkJCQkJaWYgKCRyb3dIYXNEYXRhKSB7CgkJCQkJCWlmIChpc3NldCgkcm93X3NzWydTdHlsZUlEJ10pKSB7CgkJCQkJCQkkcm93U3R5bGUgPSAkcm93X3NzWydTdHlsZUlEJ107CgkJCQkJCX0KCQkJCQkJaWYgKGlzc2V0KCRyb3dfc3NbJ0hlaWdodCddKSkgewoJCQkJCQkJJHJvd0hlaWdodCA9ICRyb3dfc3NbJ0hlaWdodCddOwovLwkJCQkJCQllY2hvICc8Yj5TZXR0aW5nIHJvdyBoZWlnaHQgdG8gJy4kcm93SGVpZ2h0Lic8L2I+PGJyIC8+JzsKCQkJCQkJCSRvYmpQSFBFeGNlbC0+Z2V0QWN0aXZlU2hlZXQoKS0+Z2V0Um93RGltZW5zaW9uKCRyb3dJRCktPnNldFJvd0hlaWdodCgkcm93SGVpZ2h0KTsKCQkJCQkJfQoJCQkJCX0KCgkJCQkJKyskcm93SUQ7CgkJCQl9CgkJCX0KCQkJKyskd29ya3NoZWV0SUQ7CgkJfQoKCQkvLyBSZXR1cm4KCQlyZXR1cm4gJG9ialBIUEV4Y2VsOwoJfQoKCglwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBfY29udmVydFN0cmluZ0VuY29kaW5nKCRzdHJpbmcsJGNoYXJzZXQpIHsKCQlpZiAoJGNoYXJzZXQgIT0gJ1VURi04JykgewoJCQlyZXR1cm4gUEhQRXhjZWxfU2hhcmVkX1N0cmluZzo6Q29udmVydEVuY29kaW5nKCRzdHJpbmcsJ1VURi04JywkY2hhcnNldCk7CgkJfQoJCXJldHVybiAkc3RyaW5nOwoJfQoKCglwcml2YXRlIGZ1bmN0aW9uIF9wYXJzZVJpY2hUZXh0KCRpcyA9ICcnKSB7CgkJJHZhbHVlID0gbmV3IFBIUEV4Y2VsX1JpY2hUZXh0KCk7CgoJCSR2YWx1ZS0+Y3JlYXRlVGV4dChzZWxmOjpfY29udmVydFN0cmluZ0VuY29kaW5nKCRpcywkdGhpcy0+X2NoYXJTZXQpKTsKCgkJcmV0dXJuICR2YWx1ZTsKCX0KCn0K]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Reader/Excel2007.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIFBIUEV4Y2VsCiAqCiAqIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICoKICogQGNhdGVnb3J5ICAgUEhQRXhjZWwKICogQHBhY2thZ2UgICAgUEhQRXhjZWxfUmVhZGVyCiAqIEBjb3B5cmlnaHQgIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwgKGh0dHA6Ly93d3cuY29kZXBsZXguY29tL1BIUEV4Y2VsKQogKiBAbGljZW5zZSAgICBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvb2xkLWxpY2Vuc2VzL2xncGwtMi4xLnR4dAlMR1BMCiAqIEB2ZXJzaW9uICAgIDEuNy43LCAyMDEyLTA1LTE5CiAqLwoKCi8qKiBQSFBFeGNlbCByb290IGRpcmVjdG9yeSAqLwppZiAoIWRlZmluZWQoJ1BIUEVYQ0VMX1JPT1QnKSkgewoJLyoqCgkgKiBAaWdub3JlCgkgKi8KCWRlZmluZSgnUEhQRVhDRUxfUk9PVCcsIGRpcm5hbWUoX19GSUxFX18pIC4gJy8uLi8uLi8nKTsKCXJlcXVpcmUoUEhQRVhDRUxfUk9PVCAuICdQSFBFeGNlbC9BdXRvbG9hZGVyLnBocCcpOwp9CgovKioKICogUEhQRXhjZWxfUmVhZGVyX0V4Y2VsMjAwNwogKgogKiBAY2F0ZWdvcnkJUEhQRXhjZWwKICogQHBhY2thZ2UJUEhQRXhjZWxfUmVhZGVyCiAqIEBjb3B5cmlnaHQJQ29weXJpZ2h0IChjKSAyMDA2IC0gMjAxMiBQSFBFeGNlbCAoaHR0cDovL3d3dy5jb2RlcGxleC5jb20vUEhQRXhjZWwpCiAqLwpjbGFzcyBQSFBFeGNlbF9SZWFkZXJfRXhjZWwyMDA3IGltcGxlbWVudHMgUEhQRXhjZWxfUmVhZGVyX0lSZWFkZXIKewoJLyoqCgkgKiBSZWFkIGRhdGEgb25seT8KCSAqIElkZW50aWZpZXMgd2hldGhlciB0aGUgUmVhZGVyIHNob3VsZCBvbmx5IHJlYWQgZGF0YSB2YWx1ZXMgZm9yIGNlbGxzLCBhbmQgaWdub3JlIGFueSBmb3JtYXR0aW5nIGluZm9ybWF0aW9uOwoJICoJCW9yIHdoZXRoZXIgaXQgc2hvdWxkIHJlYWQgYm90aCBkYXRhIGFuZCBmb3JtYXR0aW5nCgkgKgoJICogQHZhcglib29sZWFuCgkgKi8KCXByaXZhdGUgJF9yZWFkRGF0YU9ubHkgPSBmYWxzZTsKCgkvKioNCgkgKiBSZWFkIGNoYXJ0cyB0aGF0IGFyZSBkZWZpbmVkIGluIHRoZSB3b3JrYm9vaz8NCgkgKiBJZGVudGlmaWVzIHdoZXRoZXIgdGhlIFJlYWRlciBzaG91bGQgcmVhZCB0aGUgZGVmaW5pdGlvbnMgZm9yIGFueSBjaGFydHMgdGhhdCBleGlzdCBpbiB0aGUgd29ya2Jvb2s7DQoJICoNCgkgKiBAdmFyCWJvb2xlYW4NCgkgKi8NCglwcml2YXRlICRfaW5jbHVkZUNoYXJ0cyA9IGZhbHNlOw0KDQoJLyoqCgkgKiBSZXN0cmljdCB3aGljaCBzaGVldHMgc2hvdWxkIGJlIGxvYWRlZD8KCSAqIFRoaXMgcHJvcGVydHkgaG9sZHMgYW4gYXJyYXkgb2Ygd29ya3NoZWV0IG5hbWVzIHRvIGJlIGxvYWRlZC4gSWYgbnVsbCwgdGhlbiBhbGwgd29ya3NoZWV0cyB3aWxsIGJlIGxvYWRlZC4KCSAqCgkgKiBAdmFyIGFycmF5IG9mIHN0cmluZwoJICovCglwcml2YXRlICRfbG9hZFNoZWV0c09ubHkgPSBudWxsOwoKCS8qKgoJICogUEhQRXhjZWxfUmVhZGVyX0lSZWFkRmlsdGVyIGluc3RhbmNlCgkgKgoJICogQHZhciBQSFBFeGNlbF9SZWFkZXJfSVJlYWRGaWx0ZXIKCSAqLwoJcHJpdmF0ZSAkX3JlYWRGaWx0ZXIgPSBudWxsOwoKCS8qKgoJICogUEhQRXhjZWxfUmVmZXJlbmNlSGVscGVyIGluc3RhbmNlCgkgKgoJICogQHZhciBQSFBFeGNlbF9SZWZlcmVuY2VIZWxwZXIKCSAqLwoJcHJpdmF0ZSAkX3JlZmVyZW5jZUhlbHBlciA9IG51bGw7CgoJLyoqCgkgKiBQSFBFeGNlbF9SZWFkZXJfRXhjZWwyMDA3X1RoZW1lIGluc3RhbmNlCgkgKgoJICogQHZhciBQSFBFeGNlbF9SZWFkZXJfRXhjZWwyMDA3X1RoZW1lCgkgKi8KCXByaXZhdGUgc3RhdGljICRfdGhlbWUgPSBudWxsOwoKCgkvKioNCgkgKiBDcmVhdGUgYSBuZXcgUEhQRXhjZWxfUmVhZGVyX0V4Y2VsMjAwNyBpbnN0YW5jZQ0KCSAqLw0KCXB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgpIHsNCgkJJHRoaXMtPl9yZWFkRmlsdGVyID0gbmV3IFBIUEV4Y2VsX1JlYWRlcl9EZWZhdWx0UmVhZEZpbHRlcigpOw0KCQkkdGhpcy0+X3JlZmVyZW5jZUhlbHBlciA9IFBIUEV4Y2VsX1JlZmVyZW5jZUhlbHBlcjo6Z2V0SW5zdGFuY2UoKTsNCgl9DQoNCg0KCS8qKgoJICogUmVhZCBkYXRhIG9ubHk/CgkgKgkJSWYgdGhpcyBpcyB0cnVlLCB0aGVuIHRoZSBSZWFkZXIgd2lsbCBvbmx5IHJlYWQgZGF0YSB2YWx1ZXMgZm9yIGNlbGxzLCBpdCB3aWxsIG5vdCByZWFkIGFueSBmb3JtYXR0aW5nIGluZm9ybWF0aW9uLgoJICoJCUlmIGZhbHNlICh0aGUgZGVmYXVsdCkgaXQgd2lsbCByZWFkIGRhdGEgYW5kIGZvcm1hdHRpbmcuCgkgKgoJICogQHJldHVybglib29sZWFuCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRSZWFkRGF0YU9ubHkoKSB7CgkJcmV0dXJuICR0aGlzLT5fcmVhZERhdGFPbmx5OwoJfQoKDQoJLyoqCgkgKiBTZXQgcmVhZCBkYXRhIG9ubHkKCSAqCQlTZXQgdG8gdHJ1ZSwgdG8gYWR2aXNlIHRoZSBSZWFkZXIgb25seSB0byByZWFkIGRhdGEgdmFsdWVzIGZvciBjZWxscywgYW5kIHRvIGlnbm9yZSBhbnkgZm9ybWF0dGluZyBpbmZvcm1hdGlvbi4KCSAqCQlTZXQgdG8gZmFsc2UgKHRoZSBkZWZhdWx0KSB0byBhZHZpc2UgdGhlIFJlYWRlciB0byByZWFkIGJvdGggZGF0YSBhbmQgZm9ybWF0dGluZyBmb3IgY2VsbHMuCgkgKgoJICogQHBhcmFtCWJvb2xlYW4JJHBWYWx1ZQoJICoKCSAqIEByZXR1cm4JUEhQRXhjZWxfUmVhZGVyX0V4Y2VsMjAwNwoJICovCglwdWJsaWMgZnVuY3Rpb24gc2V0UmVhZERhdGFPbmx5KCRwVmFsdWUgPSBmYWxzZSkgewoJCSR0aGlzLT5fcmVhZERhdGFPbmx5ID0gJHBWYWx1ZTsKCQlyZXR1cm4gJHRoaXM7Cgl9Cg0KCgkvKioNCgkgKiBSZWFkIGNoYXJ0cyBpbiB3b3JrYm9vaz8NCgkgKgkJSWYgdGhpcyBpcyB0cnVlLCB0aGVuIHRoZSBSZWFkZXIgd2lsbCBpbmNsdWRlIGFueSBjaGFydHMgdGhhdCBleGlzdCBpbiB0aGUgd29ya2Jvb2suDQoJICogICAgICBOb3RlIHRoYXQgYSBSZWFkRGF0YU9ubHkgdmFsdWUgb2YgZmFsc2Ugb3ZlcnJpZGVzLCBhbmQgY2hhcnRzIHdvbid0IGJlIHJlYWQgcmVnYXJkbGVzcyBvZiB0aGUgSW5jbHVkZUNoYXJ0cyB2YWx1ZS4NCgkgKgkJSWYgZmFsc2UgKHRoZSBkZWZhdWx0KSBpdCB3aWxsIGlnbm9yZSBhbnkgY2hhcnRzIGRlZmluZWQgaW4gdGhlIHdvcmtib29rIGZpbGUuDQoJICoNCgkgKiBAcmV0dXJuCWJvb2xlYW4NCgkgKi8NCglwdWJsaWMgZnVuY3Rpb24gZ2V0SW5jbHVkZUNoYXJ0cygpIHsNCgkJcmV0dXJuICR0aGlzLT5faW5jbHVkZUNoYXJ0czsNCgl9DQoNCg0KCS8qKg0KCSAqIFNldCByZWFkIGNoYXJ0cyBpbiB3b3JrYm9vaw0KCSAqCQlTZXQgdG8gdHJ1ZSwgdG8gYWR2aXNlIHRoZSBSZWFkZXIgdG8gaW5jbHVkZSBhbnkgY2hhcnRzIHRoYXQgZXhpc3QgaW4gdGhlIHdvcmtib29rLg0KCSAqICAgICAgTm90ZSB0aGF0IGEgUmVhZERhdGFPbmx5IHZhbHVlIG9mIGZhbHNlIG92ZXJyaWRlcywgYW5kIGNoYXJ0cyB3b24ndCBiZSByZWFkIHJlZ2FyZGxlc3Mgb2YgdGhlIEluY2x1ZGVDaGFydHMgdmFsdWUuDQoJICoJCVNldCB0byBmYWxzZSAodGhlIGRlZmF1bHQpIHRvIGRpc2NhcmQgY2hhcnRzLg0KCSAqDQoJICogQHBhcmFtCWJvb2xlYW4JJHBWYWx1ZQ0KCSAqDQoJICogQHJldHVybglQSFBFeGNlbF9SZWFkZXJfRXhjZWwyMDA3DQoJICovDQoJcHVibGljIGZ1bmN0aW9uIHNldEluY2x1ZGVDaGFydHMoJHBWYWx1ZSA9IGZhbHNlKSB7DQoJCSR0aGlzLT5faW5jbHVkZUNoYXJ0cyA9IChib29sZWFuKSAkcFZhbHVlOw0KCQlyZXR1cm4gJHRoaXM7DQoJfQ0KDQoNCgkvKioKCSAqIEdldCB3aGljaCBzaGVldHMgdG8gbG9hZAoJICogUmV0dXJucyBlaXRoZXIgYW4gYXJyYXkgb2Ygd29ya3NoZWV0IG5hbWVzICh0aGUgbGlzdCBvZiB3b3Jrc2hlZXRzIHRoYXQgc2hvdWxkIGJlIGxvYWRlZCksIG9yIGEgbnVsbAoJICoJCWluZGljYXRpbmcgdGhhdCBhbGwgd29ya3NoZWV0cyBpbiB0aGUgd29ya2Jvb2sgc2hvdWxkIGJlIGxvYWRlZC4KCSAqCgkgKiBAcmV0dXJuIG1peGVkCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRMb2FkU2hlZXRzT25seSgpCgl7CgkJcmV0dXJuICR0aGlzLT5fbG9hZFNoZWV0c09ubHk7Cgl9CgoNCgkvKioKCSAqIFNldCB3aGljaCBzaGVldHMgdG8gbG9hZAoJICoKCSAqIEBwYXJhbSBtaXhlZCAkdmFsdWUKCSAqCQlUaGlzIHNob3VsZCBiZSBlaXRoZXIgYW4gYXJyYXkgb2Ygd29ya3NoZWV0IG5hbWVzIHRvIGJlIGxvYWRlZCwgb3IgYSBzdHJpbmcgY29udGFpbmluZyBhIHNpbmdsZSB3b3Jrc2hlZXQgbmFtZS4KCSAqCQlJZiBOVUxMLCB0aGVuIGl0IHRlbGxzIHRoZSBSZWFkZXIgdG8gcmVhZCBhbGwgd29ya3NoZWV0cyBpbiB0aGUgd29ya2Jvb2sKCSAqCgkgKiBAcmV0dXJuIFBIUEV4Y2VsX1JlYWRlcl9FeGNlbDIwMDcKCSAqLwoJcHVibGljIGZ1bmN0aW9uIHNldExvYWRTaGVldHNPbmx5KCR2YWx1ZSA9IG51bGwpCgl7CgkJJHRoaXMtPl9sb2FkU2hlZXRzT25seSA9IGlzX2FycmF5KCR2YWx1ZSkgPwoJCQkkdmFsdWUgOiBhcnJheSgkdmFsdWUpOwoJCXJldHVybiAkdGhpczsKCX0KCg0KCS8qKgoJICogU2V0IGFsbCBzaGVldHMgdG8gbG9hZAoJICoJCVRlbGxzIHRoZSBSZWFkZXIgdG8gbG9hZCBhbGwgd29ya3NoZWV0cyBmcm9tIHRoZSB3b3JrYm9vay4KCSAqCgkgKiBAcmV0dXJuIFBIUEV4Y2VsX1JlYWRlcl9FeGNlbDIwMDcKCSAqLwoJcHVibGljIGZ1bmN0aW9uIHNldExvYWRBbGxTaGVldHMoKQoJewoJCSR0aGlzLT5fbG9hZFNoZWV0c09ubHkgPSBudWxsOwoJCXJldHVybiAkdGhpczsKCX0KCg0KCS8qKgoJICogUmVhZCBmaWx0ZXIKCSAqCgkgKiBAcmV0dXJuIFBIUEV4Y2VsX1JlYWRlcl9JUmVhZEZpbHRlcgoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0UmVhZEZpbHRlcigpIHsKCQlyZXR1cm4gJHRoaXMtPl9yZWFkRmlsdGVyOwoJfQoKDQoJLyoqCgkgKiBTZXQgcmVhZCBmaWx0ZXIKCSAqCgkgKiBAcGFyYW0gUEhQRXhjZWxfUmVhZGVyX0lSZWFkRmlsdGVyICRwVmFsdWUKCSAqIEByZXR1cm4gUEhQRXhjZWxfUmVhZGVyX0V4Y2VsMjAwNwoJICovCglwdWJsaWMgZnVuY3Rpb24gc2V0UmVhZEZpbHRlcihQSFBFeGNlbF9SZWFkZXJfSVJlYWRGaWx0ZXIgJHBWYWx1ZSkgewoJCSR0aGlzLT5fcmVhZEZpbHRlciA9ICRwVmFsdWU7CgkJcmV0dXJuICR0aGlzOwoJfQoKCgkvKioKCSAqIENhbiB0aGUgY3VycmVudCBQSFBFeGNlbF9SZWFkZXJfSVJlYWRlciByZWFkIHRoZSBmaWxlPwoJICoKCSAqIEBwYXJhbSAJc3RyaW5nIAkJJHBGaWxlTmFtZQoJICogQHJldHVybiAJYm9vbGVhbgoJICogQHRocm93cyBFeGNlcHRpb24KCSAqLwoJcHVibGljIGZ1bmN0aW9uIGNhblJlYWQoJHBGaWxlbmFtZSkKCXsKCQkvLyBDaGVjayBpZiBmaWxlIGV4aXN0cwoJCWlmICghZmlsZV9leGlzdHMoJHBGaWxlbmFtZSkpIHsKCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbigiQ291bGQgbm90IG9wZW4gIiAuICRwRmlsZW5hbWUgLiAiIGZvciByZWFkaW5nISBGaWxlIGRvZXMgbm90IGV4aXN0LiIpOwoJCX0KCgkJLy8gQ2hlY2sgaWYgemlwIGNsYXNzIGV4aXN0cwoJCWlmICghY2xhc3NfZXhpc3RzKCdaaXBBcmNoaXZlJykpIHsKCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbigiWmlwQXJjaGl2ZSBsaWJyYXJ5IGlzIG5vdCBlbmFibGVkIik7CgkJfQoKCQkkeGwgPSBmYWxzZTsKCQkvLyBMb2FkIGZpbGUKCQkkemlwID0gbmV3IFppcEFyY2hpdmU7CgkJaWYgKCR6aXAtPm9wZW4oJHBGaWxlbmFtZSkgPT09IHRydWUpIHsKCQkJLy8gY2hlY2sgaWYgaXQgaXMgYW4gT09YTUwgYXJjaGl2ZQoJCQkkcmVscyA9IHNpbXBsZXhtbF9sb2FkX3N0cmluZygkdGhpcy0+X2dldEZyb21aaXBBcmNoaXZlKCR6aXAsICJfcmVscy8ucmVscyIpKTsKCQkJaWYgKCRyZWxzICE9PSBmYWxzZSkgewoJCQkJZm9yZWFjaCAoJHJlbHMtPlJlbGF0aW9uc2hpcCBhcyAkcmVsKSB7CgkJCQkJc3dpdGNoICgkcmVsWyJUeXBlIl0pIHsKCQkJCQkJY2FzZSAiaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL29mZmljZURvY3VtZW50LzIwMDYvcmVsYXRpb25zaGlwcy9vZmZpY2VEb2N1bWVudCI6CgkJCQkJCQlpZiAoYmFzZW5hbWUoJHJlbFsiVGFyZ2V0Il0pID09ICd3b3JrYm9vay54bWwnKSB7CgkJCQkJCQkJJHhsID0gdHJ1ZTsKCQkJCQkJCX0KCQkJCQkJCWJyZWFrOwoKCQkJCQl9CgkJCQl9CgkJCX0KCQkJJHppcC0+Y2xvc2UoKTsKCQl9CgoJCXJldHVybiAkeGw7Cgl9CgoNCgkvKioNCgkgKiBSZXR1cm4gd29ya3NoZWV0IGluZm8gKE5hbWUsIExhc3QgQ29sdW1uIExldHRlciwgTGFzdCBDb2x1bW4gSW5kZXgsIFRvdGFsIFJvd3MsIFRvdGFsIENvbHVtbnMpDQoJICoNCgkgKiBAcGFyYW0gICBzdHJpbmcgICAgICRwRmlsZW5hbWUNCgkgKiBAdGhyb3dzICAgRXhjZXB0aW9uDQoJICovDQoJcHVibGljIGZ1bmN0aW9uIGxpc3RXb3Jrc2hlZXRJbmZvKCRwRmlsZW5hbWUpDQoJew0KCQkvLyBDaGVjayBpZiBmaWxlIGV4aXN0cw0KCQlpZiAoIWZpbGVfZXhpc3RzKCRwRmlsZW5hbWUpKSB7DQoJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCJDb3VsZCBub3Qgb3BlbiAiIC4gJHBGaWxlbmFtZSAuICIgZm9yIHJlYWRpbmchIEZpbGUgZG9lcyBub3QgZXhpc3QuIik7DQoJCX0NCg0KCQkkd29ya3NoZWV0SW5mbyA9IGFycmF5KCk7DQoNCgkJJHppcCA9IG5ldyBaaXBBcmNoaXZlOw0KCQkkemlwLT5vcGVuKCRwRmlsZW5hbWUpOw0KDQoJCSRyZWxzID0gc2ltcGxleG1sX2xvYWRfc3RyaW5nKCR0aGlzLT5fZ2V0RnJvbVppcEFyY2hpdmUoJHppcCwgIl9yZWxzLy5yZWxzIikpOyAvL34gaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL3BhY2thZ2UvMjAwNi9yZWxhdGlvbnNoaXBzIik7DQoJCWZvcmVhY2ggKCRyZWxzLT5SZWxhdGlvbnNoaXAgYXMgJHJlbCkgew0KCQkJaWYgKCRyZWxbIlR5cGUiXSA9PSAiaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL29mZmljZURvY3VtZW50LzIwMDYvcmVsYXRpb25zaGlwcy9vZmZpY2VEb2N1bWVudCIpIHsNCgkJCQkkZGlyID0gZGlybmFtZSgkcmVsWyJUYXJnZXQiXSk7DQoJCQkJJHJlbHNXb3JrYm9vayA9IHNpbXBsZXhtbF9sb2FkX3N0cmluZygkdGhpcy0+X2dldEZyb21aaXBBcmNoaXZlKCR6aXAsICIkZGlyL19yZWxzLyIgLiBiYXNlbmFtZSgkcmVsWyJUYXJnZXQiXSkgLiAiLnJlbHMiKSk7ICAvL34gaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL3BhY2thZ2UvMjAwNi9yZWxhdGlvbnNoaXBzIik7DQoJCQkJJHJlbHNXb3JrYm9vay0+cmVnaXN0ZXJYUGF0aE5hbWVzcGFjZSgicmVsIiwgImh0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9wYWNrYWdlLzIwMDYvcmVsYXRpb25zaGlwcyIpOw0KDQoJCQkJJHdvcmtzaGVldHMgPSBhcnJheSgpOw0KCQkJCWZvcmVhY2ggKCRyZWxzV29ya2Jvb2stPlJlbGF0aW9uc2hpcCBhcyAkZWxlKSB7DQoJCQkJCWlmICgkZWxlWyJUeXBlIl0gPT0gImh0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9vZmZpY2VEb2N1bWVudC8yMDA2L3JlbGF0aW9uc2hpcHMvd29ya3NoZWV0Iikgew0KCQkJCQkJJHdvcmtzaGVldHNbKHN0cmluZykgJGVsZVsiSWQiXV0gPSAkZWxlWyJUYXJnZXQiXTsNCgkJCQkJfQ0KCQkJCX0NCg0KCQkJCSR4bWxXb3JrYm9vayA9IHNpbXBsZXhtbF9sb2FkX3N0cmluZygkdGhpcy0+X2dldEZyb21aaXBBcmNoaXZlKCR6aXAsICJ7JHJlbFsnVGFyZ2V0J119IikpOyAgLy9+IGh0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9zcHJlYWRzaGVldG1sLzIwMDYvbWFpbiIpOw0KCQkJCWlmICgkeG1sV29ya2Jvb2stPnNoZWV0cykgew0KCQkJCQkkZGlyID0gZGlybmFtZSgkcmVsWyJUYXJnZXQiXSk7DQoJCQkJCWZvcmVhY2ggKCR4bWxXb3JrYm9vay0+c2hlZXRzLT5zaGVldCBhcyAkZWxlU2hlZXQpIHsNCgkJCQkJCSR0bXBJbmZvID0gYXJyYXkoKTsNCgkJCQkJCSR0bXBJbmZvWyd3b3Jrc2hlZXROYW1lJ10gPSAoc3RyaW5nKSAkZWxlU2hlZXRbIm5hbWUiXTsNCgkJCQkJCSR0bXBJbmZvWydsYXN0Q29sdW1uTGV0dGVyJ10gPSAnQSc7DQoJCQkJCQkkdG1wSW5mb1snbGFzdENvbHVtbkluZGV4J10gPSAwOw0KCQkJCQkJJHRtcEluZm9bJ3RvdGFsUm93cyddID0gMDsNCgkJCQkJCSR0bXBJbmZvWyd0b3RhbENvbHVtbnMnXSA9IDA7DQoNCgkJCQkJCSRmaWxlV29ya3NoZWV0ID0gJHdvcmtzaGVldHNbKHN0cmluZykgc2VsZjo6YXJyYXlfaXRlbSgkZWxlU2hlZXQtPmF0dHJpYnV0ZXMoImh0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9vZmZpY2VEb2N1bWVudC8yMDA2L3JlbGF0aW9uc2hpcHMiKSwgImlkIildOw0KCQkJCQkJJHhtbFNoZWV0ID0gc2ltcGxleG1sX2xvYWRfc3RyaW5nKCR0aGlzLT5fZ2V0RnJvbVppcEFyY2hpdmUoJHppcCwgIiRkaXIvJGZpbGVXb3Jrc2hlZXQiKSk7ICAvL34gaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL3NwcmVhZHNoZWV0bWwvMjAwNi9tYWluIik7DQoJCQkJCQlpZiAoJHhtbFNoZWV0ICYmICR4bWxTaGVldC0+c2hlZXREYXRhICYmICR4bWxTaGVldC0+c2hlZXREYXRhLT5yb3cpIHsNCgkJCQkJCQlmb3JlYWNoICgkeG1sU2hlZXQtPnNoZWV0RGF0YS0+cm93IGFzICRyb3cpIHsNCgkJCQkJCQkJZm9yZWFjaCAoJHJvdy0+YyBhcyAkYykgew0KCQkJCQkJCQkJJHIgPSAoc3RyaW5nKSAkY1siciJdOw0KCQkJCQkJCQkJJGNvb3JkaW5hdGVzID0gUEhQRXhjZWxfQ2VsbDo6Y29vcmRpbmF0ZUZyb21TdHJpbmcoJHIpOw0KDQoJCQkJCQkJCQkkcm93SW5kZXggPSAkY29vcmRpbmF0ZXNbMV07DQoJCQkJCQkJCQkkY29sdW1uSW5kZXggPSBQSFBFeGNlbF9DZWxsOjpjb2x1bW5JbmRleEZyb21TdHJpbmcoJGNvb3JkaW5hdGVzWzBdKSAtIDE7DQoNCgkJCQkJCQkJCSR0bXBJbmZvWyd0b3RhbFJvd3MnXSA9IG1heCgkdG1wSW5mb1sndG90YWxSb3dzJ10sICRyb3dJbmRleCk7DQoJCQkJCQkJCQkkdG1wSW5mb1snbGFzdENvbHVtbkluZGV4J10gPSBtYXgoJHRtcEluZm9bJ2xhc3RDb2x1bW5JbmRleCddLCAkY29sdW1uSW5kZXgpOw0KCQkJCQkJCQl9DQoJCQkJCQkJfQ0KCQkJCQkJfQ0KDQoJCQkJCQkkdG1wSW5mb1snbGFzdENvbHVtbkxldHRlciddID0gUEhQRXhjZWxfQ2VsbDo6c3RyaW5nRnJvbUNvbHVtbkluZGV4KCR0bXBJbmZvWydsYXN0Q29sdW1uSW5kZXgnXSk7DQoJCQkJCQkkdG1wSW5mb1sndG90YWxDb2x1bW5zJ10gPSAkdG1wSW5mb1snbGFzdENvbHVtbkluZGV4J10gKyAxOw0KDQoJCQkJCQkkd29ya3NoZWV0SW5mb1tdID0gJHRtcEluZm87DQoJCQkJCX0NCgkJCQl9DQoJCQl9DQoJCX0NCg0KCQkkemlwLT5jbG9zZSgpOw0KDQoJCXJldHVybiAkd29ya3NoZWV0SW5mbzsNCgl9DQoNCg0KCXByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIF9jYXN0VG9Cb29sKCRjKSB7Ci8vCQllY2hvICdJbml0aWFsIENhc3QgdG8gQm9vbGVhbjxiciAvPic7CgkJJHZhbHVlID0gaXNzZXQoJGMtPnYpID8gKHN0cmluZykgJGMtPnYgOiBudWxsOwoJCWlmICgkdmFsdWUgPT0gJzAnKSB7CgkJCXJldHVybiBmYWxzZTsKCQl9IGVsc2VpZiAoJHZhbHVlID09ICcxJykgewoJCQlyZXR1cm4gdHJ1ZTsKCQl9IGVsc2UgewoJCQlyZXR1cm4gKGJvb2wpJGMtPnY7CgkJfQoJCXJldHVybiAkdmFsdWU7Cgl9CS8vCWZ1bmN0aW9uIF9jYXN0VG9Cb29sKCkKCg0KCXByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIF9jYXN0VG9FcnJvcigkYykgewovLwkJZWNobyAnSW5pdGlhbCBDYXN0IHRvIEVycm9yPGJyIC8+JzsKCQlyZXR1cm4gaXNzZXQoJGMtPnYpID8gKHN0cmluZykgJGMtPnYgOiBudWxsOzsKCX0JLy8JZnVuY3Rpb24gX2Nhc3RUb0Vycm9yKCkKCg0KCXByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIF9jYXN0VG9TdHJpbmcoJGMpIHsKLy8JCWVjaG8gJ0luaXRpYWwgQ2FzdCB0byBTdHJpbmc8YnIgLz4nOwoJCXJldHVybiBpc3NldCgkYy0+dikgPyAoc3RyaW5nKSAkYy0+diA6IG51bGw7OwoJfQkvLwlmdW5jdGlvbiBfY2FzdFRvU3RyaW5nKCkKCg0KCXByaXZhdGUgZnVuY3Rpb24gX2Nhc3RUb0Zvcm11bGEoJGMsJHIsJiRjZWxsRGF0YVR5cGUsJiR2YWx1ZSwmJGNhbGN1bGF0ZWRWYWx1ZSwmJHNoYXJlZEZvcm11bGFzLCRjYXN0QmFzZVR5cGUpIHsKLy8JCWVjaG8gJzxmb250IGNvbG9yPSJkYXJrZ3JlZW4iPkZvcm11bGE8L2ZvbnQ+PGJyIC8+JzsKLy8JCWVjaG8gJyRjLT5mIGlzICcuJGMtPmYuJzxiciAvPic7CgkJJGNlbGxEYXRhVHlwZSAJCT0gJ2YnOwoJCSR2YWx1ZSAJCQkJPSAiPXskYy0+Zn0iOwoJCSRjYWxjdWxhdGVkVmFsdWUgCT0gc2VsZjo6JGNhc3RCYXNlVHlwZSgkYyk7CgoJCS8vIFNoYXJlZCBmb3JtdWxhPwoJCWlmIChpc3NldCgkYy0+ZlsndCddKSAmJiBzdHJ0b2xvd2VyKChzdHJpbmcpJGMtPmZbJ3QnXSkgPT0gJ3NoYXJlZCcpIHsKLy8JCQllY2hvICc8Zm9udCBjb2xvcj0iZGFya2dyZWVuIj5TSEFSRUQgRk9STVVMQTwvZm9udD48YnIgLz4nOwoJCQkkaW5zdGFuY2UgPSAoc3RyaW5nKSRjLT5mWydzaSddOwoKLy8JCQllY2hvICdJbnN0YW5jZSBJRCA9ICcuJGluc3RhbmNlLic8YnIgLz4nOwovLwovLwkJCWVjaG8gJ1NoYXJlZCBGb3JtdWxhIEFycmF5OjxwcmU+JzsKLy8JCQlwcmludF9yKCRzaGFyZWRGb3JtdWxhcyk7Ci8vCQkJZWNobyAnPC9wcmU+JzsKCQkJaWYgKCFpc3NldCgkc2hhcmVkRm9ybXVsYXNbKHN0cmluZykkYy0+Zlsnc2knXV0pKSB7Ci8vCQkJCWVjaG8gJzxmb250IGNvbG9yPSJkYXJrZ3JlZW4iPlNFVFRJTkcgTkVXIFNIQVJFRCBGT1JNVUxBPC9mb250PjxiciAvPic7Ci8vCQkJCWVjaG8gJ01hc3RlciBpcyAnLiRyLic8YnIgLz4nOwovLwkJCQllY2hvICdGb3JtdWxhIGlzICcuJHZhbHVlLic8YnIgLz4nOwoJCQkJJHNoYXJlZEZvcm11bGFzWyRpbnN0YW5jZV0gPSBhcnJheSgJJ21hc3RlcicgPT4gJHIsCgkJCQkJCQkJCQkJCQknZm9ybXVsYScgPT4gJHZhbHVlCgkJCQkJCQkJCQkJCSAgKTsKLy8JCQkJZWNobyAnTmV3IFNoYXJlZCBGb3JtdWxhIEFycmF5OjxwcmU+JzsKLy8JCQkJcHJpbnRfcigkc2hhcmVkRm9ybXVsYXMpOwovLwkJCQllY2hvICc8L3ByZT4nOwoJCQl9IGVsc2UgewovLwkJCQllY2hvICc8Zm9udCBjb2xvcj0iZGFya2dyZWVuIj5HRVRUSU5HIFNIQVJFRCBGT1JNVUxBPC9mb250PjxiciAvPic7Ci8vCQkJCWVjaG8gJ01hc3RlciBpcyAnLiRzaGFyZWRGb3JtdWxhc1skaW5zdGFuY2VdWydtYXN0ZXInXS4nPGJyIC8+JzsKLy8JCQkJZWNobyAnRm9ybXVsYSBpcyAnLiRzaGFyZWRGb3JtdWxhc1skaW5zdGFuY2VdWydmb3JtdWxhJ10uJzxiciAvPic7CgkJCQkkbWFzdGVyID0gUEhQRXhjZWxfQ2VsbDo6Y29vcmRpbmF0ZUZyb21TdHJpbmcoJHNoYXJlZEZvcm11bGFzWyRpbnN0YW5jZV1bJ21hc3RlciddKTsKCQkJCSRjdXJyZW50ID0gUEhQRXhjZWxfQ2VsbDo6Y29vcmRpbmF0ZUZyb21TdHJpbmcoJHIpOwoKCQkJCSRkaWZmZXJlbmNlID0gYXJyYXkoMCwgMCk7CgkJCQkkZGlmZmVyZW5jZVswXSA9IFBIUEV4Y2VsX0NlbGw6OmNvbHVtbkluZGV4RnJvbVN0cmluZygkY3VycmVudFswXSkgLSBQSFBFeGNlbF9DZWxsOjpjb2x1bW5JbmRleEZyb21TdHJpbmcoJG1hc3RlclswXSk7CgkJCQkkZGlmZmVyZW5jZVsxXSA9ICRjdXJyZW50WzFdIC0gJG1hc3RlclsxXTsKCgkJCQkkdmFsdWUgPSAkdGhpcy0+X3JlZmVyZW5jZUhlbHBlci0+dXBkYXRlRm9ybXVsYVJlZmVyZW5jZXMoCSRzaGFyZWRGb3JtdWxhc1skaW5zdGFuY2VdWydmb3JtdWxhJ10sCgkJCQkJCQkJCQkJCQkJCQkJCQknQTEnLAoJCQkJCQkJCQkJCQkJCQkJCQkJJGRpZmZlcmVuY2VbMF0sCgkJCQkJCQkJCQkJCQkJCQkJCQkkZGlmZmVyZW5jZVsxXQoJCQkJCQkJCQkJCQkJCQkJCQkgKTsKLy8JCQkJZWNobyAnQWRqdXN0ZWQgRm9ybXVsYSBpcyAnLiR2YWx1ZS4nPGJyIC8+JzsKCQkJfQoJCX0KCX0KCg0KCXB1YmxpYyBmdW5jdGlvbiBfZ2V0RnJvbVppcEFyY2hpdmUoWmlwQXJjaGl2ZSAkYXJjaGl2ZSwgJGZpbGVOYW1lID0gJycpCgl7CgkJLy8gUm9vdC1yZWxhdGl2ZSBwYXRocwoJCWlmIChzdHJwb3MoJGZpbGVOYW1lLCAnLy8nKSAhPT0gZmFsc2UpCgkJewoJCQkkZmlsZU5hbWUgPSBzdWJzdHIoJGZpbGVOYW1lLCBzdHJwb3MoJGZpbGVOYW1lLCAnLy8nKSArIDEpOwoJCX0KCQkkZmlsZU5hbWUgPSBQSFBFeGNlbF9TaGFyZWRfRmlsZTo6cmVhbHBhdGgoJGZpbGVOYW1lKTsKCgkJLy8gQXBhY2hlIFBPSSBmaXhlcwoJCSRjb250ZW50cyA9ICRhcmNoaXZlLT5nZXRGcm9tTmFtZSgkZmlsZU5hbWUpOwoJCWlmICgkY29udGVudHMgPT09IGZhbHNlKQoJCXsKCQkJJGNvbnRlbnRzID0gJGFyY2hpdmUtPmdldEZyb21OYW1lKHN1YnN0cigkZmlsZU5hbWUsIDEpKTsKCQl9CgoJCXJldHVybiAkY29udGVudHM7Cgl9CgoNCgkvKioKCSAqIFJlYWRzIG5hbWVzIG9mIHRoZSB3b3Jrc2hlZXRzIGZyb20gYSBmaWxlLCB3aXRob3V0IHBhcnNpbmcgdGhlIHdob2xlIGZpbGUgdG8gYSBQSFBFeGNlbCBvYmplY3QKCSAqCgkgKiBAcGFyYW0gCXN0cmluZyAJCSRwRmlsZW5hbWUKCSAqIEB0aHJvd3MgCUV4Y2VwdGlvbgoJICovCglwdWJsaWMgZnVuY3Rpb24gbGlzdFdvcmtzaGVldE5hbWVzKCRwRmlsZW5hbWUpCgl7CgkJLy8gQ2hlY2sgaWYgZmlsZSBleGlzdHMKCQlpZiAoIWZpbGVfZXhpc3RzKCRwRmlsZW5hbWUpKSB7CgkJCXRocm93IG5ldyBFeGNlcHRpb24oIkNvdWxkIG5vdCBvcGVuICIgLiAkcEZpbGVuYW1lIC4gIiBmb3IgcmVhZGluZyEgRmlsZSBkb2VzIG5vdCBleGlzdC4iKTsKCQl9CgoJCSR3b3Jrc2hlZXROYW1lcyA9IGFycmF5KCk7CgoJCSR6aXAgPSBuZXcgWmlwQXJjaGl2ZTsKCQkkemlwLT5vcGVuKCRwRmlsZW5hbWUpOwoKCQkkcmVscyA9IHNpbXBsZXhtbF9sb2FkX3N0cmluZygkdGhpcy0+X2dldEZyb21aaXBBcmNoaXZlKCR6aXAsICJfcmVscy8ucmVscyIpKTsgLy9+IGh0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9wYWNrYWdlLzIwMDYvcmVsYXRpb25zaGlwcyIpOwoJCWZvcmVhY2ggKCRyZWxzLT5SZWxhdGlvbnNoaXAgYXMgJHJlbCkgewoJCQlzd2l0Y2ggKCRyZWxbIlR5cGUiXSkgewoJCQkJY2FzZSAiaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL29mZmljZURvY3VtZW50LzIwMDYvcmVsYXRpb25zaGlwcy9vZmZpY2VEb2N1bWVudCI6CgkJCQkJJHhtbFdvcmtib29rID0gc2ltcGxleG1sX2xvYWRfc3RyaW5nKCR0aGlzLT5fZ2V0RnJvbVppcEFyY2hpdmUoJHppcCwgInskcmVsWydUYXJnZXQnXX0iKSk7ICAvL34gaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL3NwcmVhZHNoZWV0bWwvMjAwNi9tYWluIik7CgoJCQkJCWlmICgkeG1sV29ya2Jvb2stPnNoZWV0cykgewoJCQkJCQlmb3JlYWNoICgkeG1sV29ya2Jvb2stPnNoZWV0cy0+c2hlZXQgYXMgJGVsZVNoZWV0KSB7CgkJCQkJCQkvLyBDaGVjayBpZiBzaGVldCBzaG91bGQgYmUgc2tpcHBlZAoJCQkJCQkJJHdvcmtzaGVldE5hbWVzW10gPSAoc3RyaW5nKSAkZWxlU2hlZXRbIm5hbWUiXTsKCQkJCQkJfQoJCQkJCX0KCQkJfQoJCX0KCgkJJHppcC0+Y2xvc2UoKTsKCgkJcmV0dXJuICR3b3Jrc2hlZXROYW1lczsKCX0KCgoJLyoqCgkgKiBMb2FkcyBQSFBFeGNlbCBmcm9tIGZpbGUKCSAqCgkgKiBAcGFyYW0gCXN0cmluZyAJCSRwRmlsZW5hbWUKCSAqIEB0aHJvd3MgCUV4Y2VwdGlvbgoJICovCglwdWJsaWMgZnVuY3Rpb24gbG9hZCgkcEZpbGVuYW1lKQoJewoJCS8vIENoZWNrIGlmIGZpbGUgZXhpc3RzCgkJaWYgKCFmaWxlX2V4aXN0cygkcEZpbGVuYW1lKSkgewoJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCJDb3VsZCBub3Qgb3BlbiAiIC4gJHBGaWxlbmFtZSAuICIgZm9yIHJlYWRpbmchIEZpbGUgZG9lcyBub3QgZXhpc3QuIik7CgkJfQoKCQkvLyBJbml0aWFsaXNhdGlvbnMKCQkkZXhjZWwgPSBuZXcgUEhQRXhjZWw7CgkJJGV4Y2VsLT5yZW1vdmVTaGVldEJ5SW5kZXgoMCk7CgkJaWYgKCEkdGhpcy0+X3JlYWREYXRhT25seSkgewoJCQkkZXhjZWwtPnJlbW92ZUNlbGxTdHlsZVhmQnlJbmRleCgwKTsgLy8gcmVtb3ZlIHRoZSBkZWZhdWx0IHN0eWxlCgkJCSRleGNlbC0+cmVtb3ZlQ2VsbFhmQnlJbmRleCgwKTsgLy8gcmVtb3ZlIHRoZSBkZWZhdWx0IHN0eWxlCgkJfQoJCSR6aXAgPSBuZXcgWmlwQXJjaGl2ZTsKCQkkemlwLT5vcGVuKCRwRmlsZW5hbWUpOwoKCQkvLwlSZWFkIHRoZSB0aGVtZSBmaXJzdCwgYmVjYXVzZSB3ZSBuZWVkIHRoZSBjb2xvdXIgc2NoZW1lIHdoZW4gcmVhZGluZyB0aGUgc3R5bGVzCgkJJHdiUmVscyA9IHNpbXBsZXhtbF9sb2FkX3N0cmluZygkdGhpcy0+X2dldEZyb21aaXBBcmNoaXZlKCR6aXAsICJ4bC9fcmVscy93b3JrYm9vay54bWwucmVscyIpKTsgLy9+IGh0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9wYWNrYWdlLzIwMDYvcmVsYXRpb25zaGlwcyIpOwoJCWZvcmVhY2ggKCR3YlJlbHMtPlJlbGF0aW9uc2hpcCBhcyAkcmVsKSB7CgkJCXN3aXRjaCAoJHJlbFsiVHlwZSJdKSB7CgkJCQljYXNlICJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvb2ZmaWNlRG9jdW1lbnQvMjAwNi9yZWxhdGlvbnNoaXBzL3RoZW1lIjoKCQkJCQkkdGhlbWVPcmRlckFycmF5ID0gYXJyYXkoJ2x0MScsJ2RrMScsJ2x0MicsJ2RrMicpOwoJCQkJCSR0aGVtZU9yZGVyQWRkaXRpb25hbCA9IGNvdW50KCR0aGVtZU9yZGVyQXJyYXkpOwoKCQkJCQkkeG1sVGhlbWUgPSBzaW1wbGV4bWxfbG9hZF9zdHJpbmcoJHRoaXMtPl9nZXRGcm9tWmlwQXJjaGl2ZSgkemlwLCAieGwveyRyZWxbJ1RhcmdldCddfSIpKTsKCQkJCQlpZiAoaXNfb2JqZWN0KCR4bWxUaGVtZSkpIHsKCQkJCQkJJHhtbFRoZW1lTmFtZSA9ICR4bWxUaGVtZS0+YXR0cmlidXRlcygpOwoJCQkJCQkkeG1sVGhlbWUgPSAkeG1sVGhlbWUtPmNoaWxkcmVuKCJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvZHJhd2luZ21sLzIwMDYvbWFpbiIpOwoJCQkJCQkkdGhlbWVOYW1lID0gKHN0cmluZykkeG1sVGhlbWVOYW1lWyduYW1lJ107Cg0KCQkJCQkJJGNvbG91clNjaGVtZSA9ICR4bWxUaGVtZS0+dGhlbWVFbGVtZW50cy0+Y2xyU2NoZW1lLT5hdHRyaWJ1dGVzKCk7CgkJCQkJCSRjb2xvdXJTY2hlbWVOYW1lID0gKHN0cmluZykkY29sb3VyU2NoZW1lWyduYW1lJ107CgkJCQkJCSRjb2xvdXJTY2hlbWUgPSAkeG1sVGhlbWUtPnRoZW1lRWxlbWVudHMtPmNsclNjaGVtZS0+Y2hpbGRyZW4oImh0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9kcmF3aW5nbWwvMjAwNi9tYWluIik7CgoJCQkJCQkkdGhlbWVDb2xvdXJzID0gYXJyYXkoKTsKCQkJCQkJZm9yZWFjaCAoJGNvbG91clNjaGVtZSBhcyAkayA9PiAkeG1sQ29sb3VyKSB7CgkJCQkJCQkkdGhlbWVQb3MgPSBhcnJheV9zZWFyY2goJGssJHRoZW1lT3JkZXJBcnJheSk7CgkJCQkJCQlpZiAoJHRoZW1lUG9zID09PSBmYWxzZSkgewoJCQkJCQkJCSR0aGVtZVBvcyA9ICR0aGVtZU9yZGVyQWRkaXRpb25hbCsrOwoJCQkJCQkJfQoJCQkJCQkJaWYgKGlzc2V0KCR4bWxDb2xvdXItPnN5c0NscikpIHsKCQkJCQkJCQkkeG1sQ29sb3VyRGF0YSA9ICR4bWxDb2xvdXItPnN5c0Nsci0+YXR0cmlidXRlcygpOwoJCQkJCQkJCSR0aGVtZUNvbG91cnNbJHRoZW1lUG9zXSA9ICR4bWxDb2xvdXJEYXRhWydsYXN0Q2xyJ107CgkJCQkJCQl9IGVsc2VpZiAoaXNzZXQoJHhtbENvbG91ci0+c3JnYkNscikpIHsKCQkJCQkJCQkkeG1sQ29sb3VyRGF0YSA9ICR4bWxDb2xvdXItPnNyZ2JDbHItPmF0dHJpYnV0ZXMoKTsKCQkJCQkJCQkkdGhlbWVDb2xvdXJzWyR0aGVtZVBvc10gPSAkeG1sQ29sb3VyRGF0YVsndmFsJ107CgkJCQkJCQl9CgkJCQkJCX0KCQkJCQkJc2VsZjo6JF90aGVtZSA9IG5ldyBQSFBFeGNlbF9SZWFkZXJfRXhjZWwyMDA3X1RoZW1lKCR0aGVtZU5hbWUsJGNvbG91clNjaGVtZU5hbWUsJHRoZW1lQ29sb3Vycyk7CgkJCQkJfQoJCQkJCWJyZWFrOwoJCQl9CgkJfQoKCQkkcmVscyA9IHNpbXBsZXhtbF9sb2FkX3N0cmluZygkdGhpcy0+X2dldEZyb21aaXBBcmNoaXZlKCR6aXAsICJfcmVscy8ucmVscyIpKTsgLy9+IGh0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9wYWNrYWdlLzIwMDYvcmVsYXRpb25zaGlwcyIpOwoJCWZvcmVhY2ggKCRyZWxzLT5SZWxhdGlvbnNoaXAgYXMgJHJlbCkgewoJCQlzd2l0Y2ggKCRyZWxbIlR5cGUiXSkgewoJCQkJY2FzZSAiaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL3BhY2thZ2UvMjAwNi9yZWxhdGlvbnNoaXBzL21ldGFkYXRhL2NvcmUtcHJvcGVydGllcyI6CgkJCQkJJHhtbENvcmUgPSBzaW1wbGV4bWxfbG9hZF9zdHJpbmcoJHRoaXMtPl9nZXRGcm9tWmlwQXJjaGl2ZSgkemlwLCAieyRyZWxbJ1RhcmdldCddfSIpKTsKCQkJCQlpZiAoaXNfb2JqZWN0KCR4bWxDb3JlKSkgewoJCQkJCQkkeG1sQ29yZS0+cmVnaXN0ZXJYUGF0aE5hbWVzcGFjZSgiZGMiLCAiaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iKTsKCQkJCQkJJHhtbENvcmUtPnJlZ2lzdGVyWFBhdGhOYW1lc3BhY2UoImRjdGVybXMiLCAiaHR0cDovL3B1cmwub3JnL2RjL3Rlcm1zLyIpOwoJCQkJCQkkeG1sQ29yZS0+cmVnaXN0ZXJYUGF0aE5hbWVzcGFjZSgiY3AiLCAiaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL3BhY2thZ2UvMjAwNi9tZXRhZGF0YS9jb3JlLXByb3BlcnRpZXMiKTsKCQkJCQkJJGRvY1Byb3BzID0gJGV4Y2VsLT5nZXRQcm9wZXJ0aWVzKCk7CgkJCQkJCSRkb2NQcm9wcy0+c2V0Q3JlYXRvcigoc3RyaW5nKSBzZWxmOjphcnJheV9pdGVtKCR4bWxDb3JlLT54cGF0aCgiZGM6Y3JlYXRvciIpKSk7CgkJCQkJCSRkb2NQcm9wcy0+c2V0TGFzdE1vZGlmaWVkQnkoKHN0cmluZykgc2VsZjo6YXJyYXlfaXRlbSgkeG1sQ29yZS0+eHBhdGgoImNwOmxhc3RNb2RpZmllZEJ5IikpKTsKCQkJCQkJJGRvY1Byb3BzLT5zZXRDcmVhdGVkKHN0cnRvdGltZShzZWxmOjphcnJheV9pdGVtKCR4bWxDb3JlLT54cGF0aCgiZGN0ZXJtczpjcmVhdGVkIikpKSk7IC8vISByZXNwZWN0IHhzaTp0eXBlCgkJCQkJCSRkb2NQcm9wcy0+c2V0TW9kaWZpZWQoc3RydG90aW1lKHNlbGY6OmFycmF5X2l0ZW0oJHhtbENvcmUtPnhwYXRoKCJkY3Rlcm1zOm1vZGlmaWVkIikpKSk7IC8vISByZXNwZWN0IHhzaTp0eXBlCgkJCQkJCSRkb2NQcm9wcy0+c2V0VGl0bGUoKHN0cmluZykgc2VsZjo6YXJyYXlfaXRlbSgkeG1sQ29yZS0+eHBhdGgoImRjOnRpdGxlIikpKTsKCQkJCQkJJGRvY1Byb3BzLT5zZXREZXNjcmlwdGlvbigoc3RyaW5nKSBzZWxmOjphcnJheV9pdGVtKCR4bWxDb3JlLT54cGF0aCgiZGM6ZGVzY3JpcHRpb24iKSkpOwoJCQkJCQkkZG9jUHJvcHMtPnNldFN1YmplY3QoKHN0cmluZykgc2VsZjo6YXJyYXlfaXRlbSgkeG1sQ29yZS0+eHBhdGgoImRjOnN1YmplY3QiKSkpOwoJCQkJCQkkZG9jUHJvcHMtPnNldEtleXdvcmRzKChzdHJpbmcpIHNlbGY6OmFycmF5X2l0ZW0oJHhtbENvcmUtPnhwYXRoKCJjcDprZXl3b3JkcyIpKSk7CgkJCQkJCSRkb2NQcm9wcy0+c2V0Q2F0ZWdvcnkoKHN0cmluZykgc2VsZjo6YXJyYXlfaXRlbSgkeG1sQ29yZS0+eHBhdGgoImNwOmNhdGVnb3J5IikpKTsKCQkJCQl9CgkJCQlicmVhazsKCgkJCQljYXNlICJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvb2ZmaWNlRG9jdW1lbnQvMjAwNi9yZWxhdGlvbnNoaXBzL2V4dGVuZGVkLXByb3BlcnRpZXMiOgoJCQkJCSR4bWxDb3JlID0gc2ltcGxleG1sX2xvYWRfc3RyaW5nKCR0aGlzLT5fZ2V0RnJvbVppcEFyY2hpdmUoJHppcCwgInskcmVsWydUYXJnZXQnXX0iKSk7CgkJCQkJaWYgKGlzX29iamVjdCgkeG1sQ29yZSkpIHsKCQkJCQkJJGRvY1Byb3BzID0gJGV4Y2VsLT5nZXRQcm9wZXJ0aWVzKCk7CgkJCQkJCWlmIChpc3NldCgkeG1sQ29yZS0+Q29tcGFueSkpCgkJCQkJCQkkZG9jUHJvcHMtPnNldENvbXBhbnkoKHN0cmluZykgJHhtbENvcmUtPkNvbXBhbnkpOwoJCQkJCQlpZiAoaXNzZXQoJHhtbENvcmUtPk1hbmFnZXIpKQoJCQkJCQkJJGRvY1Byb3BzLT5zZXRNYW5hZ2VyKChzdHJpbmcpICR4bWxDb3JlLT5NYW5hZ2VyKTsKCQkJCQl9CgkJCQlicmVhazsKCgkJCQljYXNlICJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvb2ZmaWNlRG9jdW1lbnQvMjAwNi9yZWxhdGlvbnNoaXBzL2N1c3RvbS1wcm9wZXJ0aWVzIjoKCQkJCQkkeG1sQ29yZSA9IHNpbXBsZXhtbF9sb2FkX3N0cmluZygkdGhpcy0+X2dldEZyb21aaXBBcmNoaXZlKCR6aXAsICJ7JHJlbFsnVGFyZ2V0J119IikpOwoJCQkJCWlmIChpc19vYmplY3QoJHhtbENvcmUpKSB7CgkJCQkJCSRkb2NQcm9wcyA9ICRleGNlbC0+Z2V0UHJvcGVydGllcygpOwoJCQkJCQlmb3JlYWNoICgkeG1sQ29yZSBhcyAkeG1sUHJvcGVydHkpIHsKCQkJCQkJCSRjZWxsRGF0YU9mZmljZUF0dHJpYnV0ZXMgPSAkeG1sUHJvcGVydHktPmF0dHJpYnV0ZXMoKTsKCQkJCQkJCWlmIChpc3NldCgkY2VsbERhdGFPZmZpY2VBdHRyaWJ1dGVzWyduYW1lJ10pKSB7CgkJCQkJCQkJJHByb3BlcnR5TmFtZSA9IChzdHJpbmcpICRjZWxsRGF0YU9mZmljZUF0dHJpYnV0ZXNbJ25hbWUnXTsKCQkJCQkJCQkkY2VsbERhdGFPZmZpY2VDaGlsZHJlbiA9ICR4bWxQcm9wZXJ0eS0+Y2hpbGRyZW4oJ2h0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9vZmZpY2VEb2N1bWVudC8yMDA2L2RvY1Byb3BzVlR5cGVzJyk7CgkJCQkJCQkJJGF0dHJpYnV0ZVR5cGUgPSAkY2VsbERhdGFPZmZpY2VDaGlsZHJlbi0+Z2V0TmFtZSgpOwoJCQkJCQkJCSRhdHRyaWJ1dGVWYWx1ZSA9IChzdHJpbmcpICRjZWxsRGF0YU9mZmljZUNoaWxkcmVuLT57JGF0dHJpYnV0ZVR5cGV9OwoJCQkJCQkJCSRhdHRyaWJ1dGVWYWx1ZSA9IFBIUEV4Y2VsX0RvY3VtZW50UHJvcGVydGllczo6Y29udmVydFByb3BlcnR5KCRhdHRyaWJ1dGVWYWx1ZSwkYXR0cmlidXRlVHlwZSk7CgkJCQkJCQkJJGF0dHJpYnV0ZVR5cGUgPSBQSFBFeGNlbF9Eb2N1bWVudFByb3BlcnRpZXM6OmNvbnZlcnRQcm9wZXJ0eVR5cGUoJGF0dHJpYnV0ZVR5cGUpOwoJCQkJCQkJCSRkb2NQcm9wcy0+c2V0Q3VzdG9tUHJvcGVydHkoJHByb3BlcnR5TmFtZSwkYXR0cmlidXRlVmFsdWUsJGF0dHJpYnV0ZVR5cGUpOwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJfQoJCQkJYnJlYWs7CgoJCQkJY2FzZSAiaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL29mZmljZURvY3VtZW50LzIwMDYvcmVsYXRpb25zaGlwcy9vZmZpY2VEb2N1bWVudCI6CgkJCQkJJGRpciA9IGRpcm5hbWUoJHJlbFsiVGFyZ2V0Il0pOwoJCQkJCSRyZWxzV29ya2Jvb2sgPSBzaW1wbGV4bWxfbG9hZF9zdHJpbmcoJHRoaXMtPl9nZXRGcm9tWmlwQXJjaGl2ZSgkemlwLCAiJGRpci9fcmVscy8iIC4gYmFzZW5hbWUoJHJlbFsiVGFyZ2V0Il0pIC4gIi5yZWxzIikpOyAgLy9+IGh0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9wYWNrYWdlLzIwMDYvcmVsYXRpb25zaGlwcyIpOwoJCQkJCSRyZWxzV29ya2Jvb2stPnJlZ2lzdGVyWFBhdGhOYW1lc3BhY2UoInJlbCIsICJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvcGFja2FnZS8yMDA2L3JlbGF0aW9uc2hpcHMiKTsKCgkJCQkJJHNoYXJlZFN0cmluZ3MgPSBhcnJheSgpOwoJCQkJCSR4cGF0aCA9IHNlbGY6OmFycmF5X2l0ZW0oJHJlbHNXb3JrYm9vay0+eHBhdGgoInJlbDpSZWxhdGlvbnNoaXBbQFR5cGU9J2h0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9vZmZpY2VEb2N1bWVudC8yMDA2L3JlbGF0aW9uc2hpcHMvc2hhcmVkU3RyaW5ncyddIikpOwoJCQkJCSR4bWxTdHJpbmdzID0gc2ltcGxleG1sX2xvYWRfc3RyaW5nKCR0aGlzLT5fZ2V0RnJvbVppcEFyY2hpdmUoJHppcCwgIiRkaXIvJHhwYXRoW1RhcmdldF0iKSk7ICAvL34gaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL3NwcmVhZHNoZWV0bWwvMjAwNi9tYWluIik7CgkJCQkJaWYgKGlzc2V0KCR4bWxTdHJpbmdzKSAmJiBpc3NldCgkeG1sU3RyaW5ncy0+c2kpKSB7CgkJCQkJCWZvcmVhY2ggKCR4bWxTdHJpbmdzLT5zaSBhcyAkdmFsKSB7CgkJCQkJCQlpZiAoaXNzZXQoJHZhbC0+dCkpIHsKCQkJCQkJCQkkc2hhcmVkU3RyaW5nc1tdID0gUEhQRXhjZWxfU2hhcmVkX1N0cmluZzo6Q29udHJvbENoYXJhY3Rlck9PWE1MMlBIUCggKHN0cmluZykgJHZhbC0+dCApOwoJCQkJCQkJfSBlbHNlaWYgKGlzc2V0KCR2YWwtPnIpKSB7CgkJCQkJCQkJJHNoYXJlZFN0cmluZ3NbXSA9ICR0aGlzLT5fcGFyc2VSaWNoVGV4dCgkdmFsKTsKCQkJCQkJCX0KCQkJCQkJfQoJCQkJCX0KCgkJCQkJJHdvcmtzaGVldHMgPSBhcnJheSgpOwoJCQkJCWZvcmVhY2ggKCRyZWxzV29ya2Jvb2stPlJlbGF0aW9uc2hpcCBhcyAkZWxlKSB7CgkJCQkJCWlmICgkZWxlWyJUeXBlIl0gPT0gImh0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9vZmZpY2VEb2N1bWVudC8yMDA2L3JlbGF0aW9uc2hpcHMvd29ya3NoZWV0IikgewoJCQkJCQkJJHdvcmtzaGVldHNbKHN0cmluZykgJGVsZVsiSWQiXV0gPSAkZWxlWyJUYXJnZXQiXTsKCQkJCQkJfQoJCQkJCX0KCgkJCQkJJHN0eWxlcyAJPSBhcnJheSgpOwoJCQkJCSRjZWxsU3R5bGVzID0gYXJyYXkoKTsKCQkJCQkkeHBhdGggPSBzZWxmOjphcnJheV9pdGVtKCRyZWxzV29ya2Jvb2stPnhwYXRoKCJyZWw6UmVsYXRpb25zaGlwW0BUeXBlPSdodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvb2ZmaWNlRG9jdW1lbnQvMjAwNi9yZWxhdGlvbnNoaXBzL3N0eWxlcyddIikpOwoJCQkJCSR4bWxTdHlsZXMgPSBzaW1wbGV4bWxfbG9hZF9zdHJpbmcoJHRoaXMtPl9nZXRGcm9tWmlwQXJjaGl2ZSgkemlwLCAiJGRpci8keHBhdGhbVGFyZ2V0XSIpKTsgLy9+IGh0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9zcHJlYWRzaGVldG1sLzIwMDYvbWFpbiIpOwoJCQkJCSRudW1GbXRzID0gbnVsbDsKCQkJCQlpZiAoJHhtbFN0eWxlcyAmJiAkeG1sU3R5bGVzLT5udW1GbXRzWzBdKSB7CgkJCQkJCSRudW1GbXRzID0gJHhtbFN0eWxlcy0+bnVtRm10c1swXTsKCQkJCQl9CgkJCQkJaWYgKGlzc2V0KCRudW1GbXRzKSAmJiAoJG51bUZtdHMgIT09IE5VTEwpKSB7CgkJCQkJCSRudW1GbXRzLT5yZWdpc3RlclhQYXRoTmFtZXNwYWNlKCJzbWwiLCAiaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL3NwcmVhZHNoZWV0bWwvMjAwNi9tYWluIik7CgkJCQkJfQoJCQkJCWlmICghJHRoaXMtPl9yZWFkRGF0YU9ubHkgJiYgJHhtbFN0eWxlcykgewoJCQkJCQlmb3JlYWNoICgkeG1sU3R5bGVzLT5jZWxsWGZzLT54ZiBhcyAkeGYpIHsKCQkJCQkJCSRudW1GbXQgPSBQSFBFeGNlbF9TdHlsZV9OdW1iZXJGb3JtYXQ6OkZPUk1BVF9HRU5FUkFMOwoKCQkJCQkJCWlmICgkeGZbIm51bUZtdElkIl0pIHsKCQkJCQkJCQlpZiAoaXNzZXQoJG51bUZtdHMpKSB7CgkJCQkJCQkJCSR0bXBOdW1GbXQgPSBzZWxmOjphcnJheV9pdGVtKCRudW1GbXRzLT54cGF0aCgic21sOm51bUZtdFtAbnVtRm10SWQ9JHhmW251bUZtdElkXV0iKSk7CgoJCQkJCQkJCQlpZiAoaXNzZXQoJHRtcE51bUZtdFsiZm9ybWF0Q29kZSJdKSkgewoJCQkJCQkJCQkJJG51bUZtdCA9IChzdHJpbmcpICR0bXBOdW1GbXRbImZvcm1hdENvZGUiXTsKCQkJCQkJCQkJfQoJCQkJCQkJCX0KCgkJCQkJCQkJaWYgKChpbnQpJHhmWyJudW1GbXRJZCJdIDwgMTY0KSB7CgkJCQkJCQkJCSRudW1GbXQgPSBQSFBFeGNlbF9TdHlsZV9OdW1iZXJGb3JtYXQ6OmJ1aWx0SW5Gb3JtYXRDb2RlKChpbnQpJHhmWyJudW1GbXRJZCJdKTsKCQkJCQkJCQl9CgkJCQkJCQl9CgkJCQkJCQkvLyRudW1GbXQgPSBzdHJfcmVwbGFjZSgnbW0nLCAnaScsICRudW1GbXQpOwoJCQkJCQkJLy8kbnVtRm10ID0gc3RyX3JlcGxhY2UoJ2gnLCAnSCcsICRudW1GbXQpOwoKCQkJCQkJCSRzdHlsZSA9IChvYmplY3QpIGFycmF5KAoJCQkJCQkJCSJudW1GbXQiID0+ICRudW1GbXQsCgkJCQkJCQkJImZvbnQiID0+ICR4bWxTdHlsZXMtPmZvbnRzLT5mb250W2ludHZhbCgkeGZbImZvbnRJZCJdKV0sCgkJCQkJCQkJImZpbGwiID0+ICR4bWxTdHlsZXMtPmZpbGxzLT5maWxsW2ludHZhbCgkeGZbImZpbGxJZCJdKV0sCgkJCQkJCQkJImJvcmRlciIgPT4gJHhtbFN0eWxlcy0+Ym9yZGVycy0+Ym9yZGVyW2ludHZhbCgkeGZbImJvcmRlcklkIl0pXSwKCQkJCQkJCQkiYWxpZ25tZW50IiA9PiAkeGYtPmFsaWdubWVudCwKCQkJCQkJCQkicHJvdGVjdGlvbiIgPT4gJHhmLT5wcm90ZWN0aW9uLAoJCQkJCQkJKTsKCQkJCQkJCSRzdHlsZXNbXSA9ICRzdHlsZTsKCgkJCQkJCQkvLyBhZGQgc3R5bGUgdG8gY2VsbFhmIGNvbGxlY3Rpb24KCQkJCQkJCSRvYmpTdHlsZSA9IG5ldyBQSFBFeGNlbF9TdHlsZTsKCQkJCQkJCXNlbGY6Ol9yZWFkU3R5bGUoJG9ialN0eWxlLCAkc3R5bGUpOwoJCQkJCQkJJGV4Y2VsLT5hZGRDZWxsWGYoJG9ialN0eWxlKTsKCQkJCQkJfQoKCQkJCQkJZm9yZWFjaCAoJHhtbFN0eWxlcy0+Y2VsbFN0eWxlWGZzLT54ZiBhcyAkeGYpIHsKCQkJCQkJCSRudW1GbXQgPSBQSFBFeGNlbF9TdHlsZV9OdW1iZXJGb3JtYXQ6OkZPUk1BVF9HRU5FUkFMOwoJCQkJCQkJaWYgKCRudW1GbXRzICYmICR4ZlsibnVtRm10SWQiXSkgewoJCQkJCQkJCSR0bXBOdW1GbXQgPSBzZWxmOjphcnJheV9pdGVtKCRudW1GbXRzLT54cGF0aCgic21sOm51bUZtdFtAbnVtRm10SWQ9JHhmW251bUZtdElkXV0iKSk7CgkJCQkJCQkJaWYgKGlzc2V0KCR0bXBOdW1GbXRbImZvcm1hdENvZGUiXSkpIHsKCQkJCQkJCQkJJG51bUZtdCA9IChzdHJpbmcpICR0bXBOdW1GbXRbImZvcm1hdENvZGUiXTsKCQkJCQkJCQl9IGVsc2UgaWYgKChpbnQpJHhmWyJudW1GbXRJZCJdIDwgMTY1KSB7CgkJCQkJCQkJCSRudW1GbXQgPSBQSFBFeGNlbF9TdHlsZV9OdW1iZXJGb3JtYXQ6OmJ1aWx0SW5Gb3JtYXRDb2RlKChpbnQpJHhmWyJudW1GbXRJZCJdKTsKCQkJCQkJCQl9CgkJCQkJCQl9CgoJCQkJCQkJJGNlbGxTdHlsZSA9IChvYmplY3QpIGFycmF5KAoJCQkJCQkJCSJudW1GbXQiID0+ICRudW1GbXQsCgkJCQkJCQkJImZvbnQiID0+ICR4bWxTdHlsZXMtPmZvbnRzLT5mb250W2ludHZhbCgkeGZbImZvbnRJZCJdKV0sCgkJCQkJCQkJImZpbGwiID0+ICR4bWxTdHlsZXMtPmZpbGxzLT5maWxsW2ludHZhbCgkeGZbImZpbGxJZCJdKV0sCgkJCQkJCQkJImJvcmRlciIgPT4gJHhtbFN0eWxlcy0+Ym9yZGVycy0+Ym9yZGVyW2ludHZhbCgkeGZbImJvcmRlcklkIl0pXSwKCQkJCQkJCQkiYWxpZ25tZW50IiA9PiAkeGYtPmFsaWdubWVudCwKCQkJCQkJCQkicHJvdGVjdGlvbiIgPT4gJHhmLT5wcm90ZWN0aW9uLAoJCQkJCQkJKTsKCQkJCQkJCSRjZWxsU3R5bGVzW10gPSAkY2VsbFN0eWxlOwoKCQkJCQkJCS8vIGFkZCBzdHlsZSB0byBjZWxsU3R5bGVYZiBjb2xsZWN0aW9uCgkJCQkJCQkkb2JqU3R5bGUgPSBuZXcgUEhQRXhjZWxfU3R5bGU7CgkJCQkJCQlzZWxmOjpfcmVhZFN0eWxlKCRvYmpTdHlsZSwgJGNlbGxTdHlsZSk7CgkJCQkJCQkkZXhjZWwtPmFkZENlbGxTdHlsZVhmKCRvYmpTdHlsZSk7CgkJCQkJCX0KCQkJCQl9CgoJCQkJCSRkeGZzID0gYXJyYXkoKTsKCQkJCQlpZiAoISR0aGlzLT5fcmVhZERhdGFPbmx5ICYmICR4bWxTdHlsZXMpIHsKCQkJCQkJaWYgKCR4bWxTdHlsZXMtPmR4ZnMpIHsKCQkJCQkJCWZvcmVhY2ggKCR4bWxTdHlsZXMtPmR4ZnMtPmR4ZiBhcyAkZHhmKSB7CgkJCQkJCQkJJHN0eWxlID0gbmV3IFBIUEV4Y2VsX1N0eWxlOwoJCQkJCQkJCXNlbGY6Ol9yZWFkU3R5bGUoJHN0eWxlLCAkZHhmKTsKCQkJCQkJCQkkZHhmc1tdID0gJHN0eWxlOwoJCQkJCQkJfQoJCQkJCQl9CgoJCQkJCQlpZiAoJHhtbFN0eWxlcy0+Y2VsbFN0eWxlcykKCQkJCQkJewoJCQkJCQkJZm9yZWFjaCAoJHhtbFN0eWxlcy0+Y2VsbFN0eWxlcy0+Y2VsbFN0eWxlIGFzICRjZWxsU3R5bGUpIHsKCQkJCQkJCQlpZiAoaW50dmFsKCRjZWxsU3R5bGVbJ2J1aWx0aW5JZCddKSA9PSAwKSB7CgkJCQkJCQkJCWlmIChpc3NldCgkY2VsbFN0eWxlc1tpbnR2YWwoJGNlbGxTdHlsZVsneGZJZCddKV0pKSB7CgkJCQkJCQkJCQkvLyBTZXQgZGVmYXVsdCBzdHlsZQoJCQkJCQkJCQkJJHN0eWxlID0gbmV3IFBIUEV4Y2VsX1N0eWxlOwoJCQkJCQkJCQkJc2VsZjo6X3JlYWRTdHlsZSgkc3R5bGUsICRjZWxsU3R5bGVzW2ludHZhbCgkY2VsbFN0eWxlWyd4ZklkJ10pXSk7CgoJCQkJCQkJCQkJLy8gbm9ybWFsIHN0eWxlLCBjdXJyZW50bHkgbm90IHVzaW5nIGl0IGZvciBhbnl0aGluZwoJCQkJCQkJCQl9CgkJCQkJCQkJfQoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJfQoKCQkJCQkkeG1sV29ya2Jvb2sgPSBzaW1wbGV4bWxfbG9hZF9zdHJpbmcoJHRoaXMtPl9nZXRGcm9tWmlwQXJjaGl2ZSgkemlwLCAieyRyZWxbJ1RhcmdldCddfSIpKTsgIC8vfiBodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvc3ByZWFkc2hlZXRtbC8yMDA2L21haW4iKTsKCgkJCQkJLy8gU2V0IGJhc2UgZGF0ZQoJCQkJCWlmICgkeG1sV29ya2Jvb2stPndvcmtib29rUHIpIHsKCQkJCQkJUEhQRXhjZWxfU2hhcmVkX0RhdGU6OnNldEV4Y2VsQ2FsZW5kYXIoUEhQRXhjZWxfU2hhcmVkX0RhdGU6OkNBTEVOREFSX1dJTkRPV1NfMTkwMCk7CgkJCQkJCWlmIChpc3NldCgkeG1sV29ya2Jvb2stPndvcmtib29rUHJbJ2RhdGUxOTA0J10pKSB7CgkJCQkJCQkkZGF0ZTE5MDQgPSAoc3RyaW5nKSR4bWxXb3JrYm9vay0+d29ya2Jvb2tQclsnZGF0ZTE5MDQnXTsKCQkJCQkJCWlmICgkZGF0ZTE5MDQgPT0gInRydWUiIHx8ICRkYXRlMTkwNCA9PSAiMSIpIHsKCQkJCQkJCQlQSFBFeGNlbF9TaGFyZWRfRGF0ZTo6c2V0RXhjZWxDYWxlbmRhcihQSFBFeGNlbF9TaGFyZWRfRGF0ZTo6Q0FMRU5EQVJfTUFDXzE5MDQpOwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJfQoKCQkJCQkkc2hlZXRJZCA9IDA7IC8vIGtlZXAgdHJhY2sgb2YgbmV3IHNoZWV0IGlkIGluIGZpbmFsIHdvcmtib29rCgkJCQkJJG9sZFNoZWV0SWQgPSAtMTsgLy8ga2VlcCB0cmFjayBvZiBvbGQgc2hlZXQgaWQgaW4gZmluYWwgd29ya2Jvb2sKCQkJCQkkY291bnRTa2lwcGVkU2hlZXRzID0gMDsgLy8ga2VlcCB0cmFjayBvZiBudW1iZXIgb2Ygc2tpcHBlZCBzaGVldHMKCQkJCQkkbWFwU2hlZXRJZCA9IGFycmF5KCk7IC8vIG1hcHBpbmcgb2Ygc2hlZXQgaWRzIGZyb20gb2xkIHRvIG5ldwoKCgkJCQkJJGNoYXJ0cyA9ICRjaGFydERldGFpbHMgPSBhcnJheSgpOwoKCQkJCQlpZiAoJHhtbFdvcmtib29rLT5zaGVldHMpIHsKCQkJCQkJZm9yZWFjaCAoJHhtbFdvcmtib29rLT5zaGVldHMtPnNoZWV0IGFzICRlbGVTaGVldCkgewoJCQkJCQkJKyskb2xkU2hlZXRJZDsKCgkJCQkJCQkvLyBDaGVjayBpZiBzaGVldCBzaG91bGQgYmUgc2tpcHBlZAoJCQkJCQkJaWYgKGlzc2V0KCR0aGlzLT5fbG9hZFNoZWV0c09ubHkpICYmICFpbl9hcnJheSgoc3RyaW5nKSAkZWxlU2hlZXRbIm5hbWUiXSwgJHRoaXMtPl9sb2FkU2hlZXRzT25seSkpIHsKCQkJCQkJCQkrKyRjb3VudFNraXBwZWRTaGVldHM7CgkJCQkJCQkJJG1hcFNoZWV0SWRbJG9sZFNoZWV0SWRdID0gbnVsbDsKCQkJCQkJCQljb250aW51ZTsKCQkJCQkJCX0KCgkJCQkJCQkvLyBNYXAgb2xkIHNoZWV0IGlkIGluIG9yaWdpbmFsIHdvcmtib29rIHRvIG5ldyBzaGVldCBpZC4KCQkJCQkJCS8vIFRoZXkgd2lsbCBkaWZmZXIgaWYgbG9hZFNoZWV0c09ubHkoKSBpcyBiZWluZyB1c2VkCgkJCQkJCQkkbWFwU2hlZXRJZFskb2xkU2hlZXRJZF0gPSAkb2xkU2hlZXRJZCAtICRjb3VudFNraXBwZWRTaGVldHM7CgoJCQkJCQkJLy8gTG9hZCBzaGVldAoJCQkJCQkJJGRvY1NoZWV0ID0gJGV4Y2VsLT5jcmVhdGVTaGVldCgpOwoJCQkJCQkJLy8JVXNlIGZhbHNlIGZvciAkdXBkYXRlRm9ybXVsYUNlbGxSZWZlcmVuY2VzIHRvIHByZXZlbnQgYWRqdXN0bWVudCBvZiB3b3Jrc2hlZXQNCgkJCQkJCQkvLwkJcmVmZXJlbmNlcyBpbiBmb3JtdWxhIGNlbGxzLi4uIGR1cmluZyB0aGUgbG9hZCwgYWxsIGZvcm11bGFlIHNob3VsZCBiZSBjb3JyZWN0LA0KCQkJCQkJCS8vCQlhbmQgd2UncmUgc2ltcGx5IGJyaW5naW5nIHRoZSB3b3Jrc2hlZXQgbmFtZSBpbiBsaW5lIHdpdGggdGhlIGZvcm11bGEsIG5vdCB0aGUNCgkJCQkJCQkvLwkJcmV2ZXJzZQ0KCQkJCQkJCSRkb2NTaGVldC0+c2V0VGl0bGUoKHN0cmluZykgJGVsZVNoZWV0WyJuYW1lIl0sZmFsc2UpOwoJCQkJCQkJJGZpbGVXb3Jrc2hlZXQgPSAkd29ya3NoZWV0c1soc3RyaW5nKSBzZWxmOjphcnJheV9pdGVtKCRlbGVTaGVldC0+YXR0cmlidXRlcygiaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL29mZmljZURvY3VtZW50LzIwMDYvcmVsYXRpb25zaGlwcyIpLCAiaWQiKV07CgkJCQkJCQkkeG1sU2hlZXQgPSBzaW1wbGV4bWxfbG9hZF9zdHJpbmcoJHRoaXMtPl9nZXRGcm9tWmlwQXJjaGl2ZSgkemlwLCAiJGRpci8kZmlsZVdvcmtzaGVldCIpKTsgIC8vfiBodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvc3ByZWFkc2hlZXRtbC8yMDA2L21haW4iKTsKCgkJCQkJCQkkc2hhcmVkRm9ybXVsYXMgPSBhcnJheSgpOwoKCQkJCQkJCWlmIChpc3NldCgkZWxlU2hlZXRbInN0YXRlIl0pICYmIChzdHJpbmcpICRlbGVTaGVldFsic3RhdGUiXSAhPSAnJykgewoJCQkJCQkJCSRkb2NTaGVldC0+c2V0U2hlZXRTdGF0ZSggKHN0cmluZykgJGVsZVNoZWV0WyJzdGF0ZSJdICk7CgkJCQkJCQl9CgoJCQkJCQkJaWYgKGlzc2V0KCR4bWxTaGVldC0+c2hlZXRWaWV3cykgJiYgaXNzZXQoJHhtbFNoZWV0LT5zaGVldFZpZXdzLT5zaGVldFZpZXcpKSB7CgkJCQkJCQkgICAgaWYgKGlzc2V0KCR4bWxTaGVldC0+c2hlZXRWaWV3cy0+c2hlZXRWaWV3Wyd6b29tU2NhbGUnXSkpIHsKCQkJCQkJCQkgICAgJGRvY1NoZWV0LT5nZXRTaGVldFZpZXcoKS0+c2V0Wm9vbVNjYWxlKCBpbnR2YWwoJHhtbFNoZWV0LT5zaGVldFZpZXdzLT5zaGVldFZpZXdbJ3pvb21TY2FsZSddKSApOwoJCQkJCQkJCX0KCgkJCQkJCQkgICAgaWYgKGlzc2V0KCR4bWxTaGVldC0+c2hlZXRWaWV3cy0+c2hlZXRWaWV3Wyd6b29tU2NhbGVOb3JtYWwnXSkpIHsKCQkJCQkJCQkgICAgJGRvY1NoZWV0LT5nZXRTaGVldFZpZXcoKS0+c2V0Wm9vbVNjYWxlTm9ybWFsKCBpbnR2YWwoJHhtbFNoZWV0LT5zaGVldFZpZXdzLT5zaGVldFZpZXdbJ3pvb21TY2FsZU5vcm1hbCddKSApOwoJCQkJCQkJCX0KCgkJCQkJCQkJaWYgKGlzc2V0KCR4bWxTaGVldC0+c2hlZXRWaWV3cy0+c2hlZXRWaWV3WydzaG93R3JpZExpbmVzJ10pKSB7CgkJCQkJCQkJCSRkb2NTaGVldC0+c2V0U2hvd0dyaWRMaW5lcygoc3RyaW5nKSR4bWxTaGVldC0+c2hlZXRWaWV3cy0+c2hlZXRWaWV3WydzaG93R3JpZExpbmVzJ10gPyB0cnVlIDogZmFsc2UpOwoJCQkJCQkJCX0KCgkJCQkJCQkJaWYgKGlzc2V0KCR4bWxTaGVldC0+c2hlZXRWaWV3cy0+c2hlZXRWaWV3WydzaG93Um93Q29sSGVhZGVycyddKSkgewoJCQkJCQkJCQkkZG9jU2hlZXQtPnNldFNob3dSb3dDb2xIZWFkZXJzKChzdHJpbmcpJHhtbFNoZWV0LT5zaGVldFZpZXdzLT5zaGVldFZpZXdbJ3Nob3dSb3dDb2xIZWFkZXJzJ10gPyB0cnVlIDogZmFsc2UpOwoJCQkJCQkJCX0KCgkJCQkJCQkJaWYgKGlzc2V0KCR4bWxTaGVldC0+c2hlZXRWaWV3cy0+c2hlZXRWaWV3WydyaWdodFRvTGVmdCddKSkgewoJCQkJCQkJCQkkZG9jU2hlZXQtPnNldFJpZ2h0VG9MZWZ0KChzdHJpbmcpJHhtbFNoZWV0LT5zaGVldFZpZXdzLT5zaGVldFZpZXdbJ3JpZ2h0VG9MZWZ0J10gPyB0cnVlIDogZmFsc2UpOwoJCQkJCQkJCX0KCgkJCQkJCQkJaWYgKGlzc2V0KCR4bWxTaGVldC0+c2hlZXRWaWV3cy0+c2hlZXRWaWV3LT5wYW5lKSkgewoJCQkJCQkJCSAgICBpZiAoaXNzZXQoJHhtbFNoZWV0LT5zaGVldFZpZXdzLT5zaGVldFZpZXctPnBhbmVbJ3RvcExlZnRDZWxsJ10pKSB7CgkJCQkJCQkJICAgICAgICAkZG9jU2hlZXQtPmZyZWV6ZVBhbmUoIChzdHJpbmcpJHhtbFNoZWV0LT5zaGVldFZpZXdzLT5zaGVldFZpZXctPnBhbmVbJ3RvcExlZnRDZWxsJ10gKTsKCQkJCQkJCQkgICAgfSBlbHNlIHsKCQkJCQkJCQkgICAgICAgICR4U3BsaXQgPSAwOwoJCQkJCQkJCSAgICAgICAgJHlTcGxpdCA9IDA7CgoJCQkJCQkJCSAgICAgICAgaWYgKGlzc2V0KCR4bWxTaGVldC0+c2hlZXRWaWV3cy0+c2hlZXRWaWV3LT5wYW5lWyd4U3BsaXQnXSkpIHsKCQkJCQkJCQkgICAgICAgICAgICAkeFNwbGl0ID0gMSArIGludHZhbCgkeG1sU2hlZXQtPnNoZWV0Vmlld3MtPnNoZWV0Vmlldy0+cGFuZVsneFNwbGl0J10pOwoJCQkJCQkJCSAgICAgICAgfQoKCQkJCQkJCQkgICAgCWlmIChpc3NldCgkeG1sU2hlZXQtPnNoZWV0Vmlld3MtPnNoZWV0Vmlldy0+cGFuZVsneVNwbGl0J10pKSB7CgkJCQkJCQkJICAgICAgICAgICAgJHlTcGxpdCA9IDEgKyBpbnR2YWwoJHhtbFNoZWV0LT5zaGVldFZpZXdzLT5zaGVldFZpZXctPnBhbmVbJ3lTcGxpdCddKTsKCQkJCQkJCQkgICAgICAgIH0KCgkJCQkJCQkJICAgICAgICAkZG9jU2hlZXQtPmZyZWV6ZVBhbmVCeUNvbHVtbkFuZFJvdygkeFNwbGl0LCAkeVNwbGl0KTsKCQkJCQkJCQkgICAgfQoJCQkJCQkJCX0KCgkJCQkJCQkJaWYgKGlzc2V0KCR4bWxTaGVldC0+c2hlZXRWaWV3cy0+c2hlZXRWaWV3LT5zZWxlY3Rpb24pKSB7CgkJCQkJCQkJCWlmIChpc3NldCgkeG1sU2hlZXQtPnNoZWV0Vmlld3MtPnNoZWV0Vmlldy0+c2VsZWN0aW9uWydzcXJlZiddKSkgewoJCQkJCQkJCQkJJHNxcmVmID0gKHN0cmluZykkeG1sU2hlZXQtPnNoZWV0Vmlld3MtPnNoZWV0Vmlldy0+c2VsZWN0aW9uWydzcXJlZiddOwoJCQkJCQkJCQkJJHNxcmVmID0gZXhwbG9kZSgnICcsICRzcXJlZik7CgkJCQkJCQkJCQkkc3FyZWYgPSAkc3FyZWZbMF07CgkJCQkJCQkJCQkkZG9jU2hlZXQtPnNldFNlbGVjdGVkQ2VsbHMoJHNxcmVmKTsKCQkJCQkJCQkJfQoJCQkJCQkJCX0KCgkJCQkJCQl9CgoJCQkJCQkJaWYgKGlzc2V0KCR4bWxTaGVldC0+c2hlZXRQcikgJiYgaXNzZXQoJHhtbFNoZWV0LT5zaGVldFByLT50YWJDb2xvcikpIHsKCQkJCQkJCQlpZiAoaXNzZXQoJHhtbFNoZWV0LT5zaGVldFByLT50YWJDb2xvclsncmdiJ10pKSB7CgkJCQkJCQkJCSRkb2NTaGVldC0+Z2V0VGFiQ29sb3IoKS0+c2V0QVJHQiggKHN0cmluZykkeG1sU2hlZXQtPnNoZWV0UHItPnRhYkNvbG9yWydyZ2InXSApOwoJCQkJCQkJCX0KCQkJCQkJCX0KCgkJCQkJCQlpZiAoaXNzZXQoJHhtbFNoZWV0LT5zaGVldFByKSAmJiBpc3NldCgkeG1sU2hlZXQtPnNoZWV0UHItPm91dGxpbmVQcikpIHsKCQkJCQkJCQlpZiAoaXNzZXQoJHhtbFNoZWV0LT5zaGVldFByLT5vdXRsaW5lUHJbJ3N1bW1hcnlSaWdodCddKSAmJiAkeG1sU2hlZXQtPnNoZWV0UHItPm91dGxpbmVQclsnc3VtbWFyeVJpZ2h0J10gPT0gZmFsc2UpIHsKCQkJCQkJCQkJJGRvY1NoZWV0LT5zZXRTaG93U3VtbWFyeVJpZ2h0KGZhbHNlKTsKCQkJCQkJCQl9IGVsc2UgewoJCQkJCQkJCQkkZG9jU2hlZXQtPnNldFNob3dTdW1tYXJ5UmlnaHQodHJ1ZSk7CgkJCQkJCQkJfQoKCQkJCQkJCQlpZiAoaXNzZXQoJHhtbFNoZWV0LT5zaGVldFByLT5vdXRsaW5lUHJbJ3N1bW1hcnlCZWxvdyddKSAmJiAkeG1sU2hlZXQtPnNoZWV0UHItPm91dGxpbmVQclsnc3VtbWFyeUJlbG93J10gPT0gZmFsc2UpIHsKCQkJCQkJCQkJJGRvY1NoZWV0LT5zZXRTaG93U3VtbWFyeUJlbG93KGZhbHNlKTsKCQkJCQkJCQl9IGVsc2UgewoJCQkJCQkJCQkkZG9jU2hlZXQtPnNldFNob3dTdW1tYXJ5QmVsb3codHJ1ZSk7CgkJCQkJCQkJfQoJCQkJCQkJfQoKCQkJCQkJCWlmIChpc3NldCgkeG1sU2hlZXQtPnNoZWV0UHIpICYmIGlzc2V0KCR4bWxTaGVldC0+c2hlZXRQci0+cGFnZVNldFVwUHIpKSB7CgkJCQkJCQkJaWYgKGlzc2V0KCR4bWxTaGVldC0+c2hlZXRQci0+cGFnZVNldFVwUHJbJ2ZpdFRvUGFnZSddKSAmJiAkeG1sU2hlZXQtPnNoZWV0UHItPnBhZ2VTZXRVcFByWydmaXRUb1BhZ2UnXSA9PSBmYWxzZSkgewoJCQkJCQkJCQkkZG9jU2hlZXQtPmdldFBhZ2VTZXR1cCgpLT5zZXRGaXRUb1BhZ2UoZmFsc2UpOwoJCQkJCQkJCX0gZWxzZSB7CgkJCQkJCQkJCSRkb2NTaGVldC0+Z2V0UGFnZVNldHVwKCktPnNldEZpdFRvUGFnZSh0cnVlKTsKCQkJCQkJCQl9CgkJCQkJCQl9CgoJCQkJCQkJaWYgKGlzc2V0KCR4bWxTaGVldC0+c2hlZXRGb3JtYXRQcikpIHsKCQkJCQkJCQlpZiAoaXNzZXQoJHhtbFNoZWV0LT5zaGVldEZvcm1hdFByWydjdXN0b21IZWlnaHQnXSkgJiYgKChzdHJpbmcpJHhtbFNoZWV0LT5zaGVldEZvcm1hdFByWydjdXN0b21IZWlnaHQnXSA9PSAnMScgfHwgc3RydG9sb3dlcigoc3RyaW5nKSR4bWxTaGVldC0+c2hlZXRGb3JtYXRQclsnY3VzdG9tSGVpZ2h0J10pID09ICd0cnVlJykgJiYgaXNzZXQoJHhtbFNoZWV0LT5zaGVldEZvcm1hdFByWydkZWZhdWx0Um93SGVpZ2h0J10pKSB7CgkJCQkJCQkJCSRkb2NTaGVldC0+Z2V0RGVmYXVsdFJvd0RpbWVuc2lvbigpLT5zZXRSb3dIZWlnaHQoIChmbG9hdCkkeG1sU2hlZXQtPnNoZWV0Rm9ybWF0UHJbJ2RlZmF1bHRSb3dIZWlnaHQnXSApOwoJCQkJCQkJCX0KCQkJCQkJCQlpZiAoaXNzZXQoJHhtbFNoZWV0LT5zaGVldEZvcm1hdFByWydkZWZhdWx0Q29sV2lkdGgnXSkpIHsKCQkJCQkJCQkJJGRvY1NoZWV0LT5nZXREZWZhdWx0Q29sdW1uRGltZW5zaW9uKCktPnNldFdpZHRoKCAoZmxvYXQpJHhtbFNoZWV0LT5zaGVldEZvcm1hdFByWydkZWZhdWx0Q29sV2lkdGgnXSApOwoJCQkJCQkJCX0KCQkJCQkJCX0KCgkJCQkJCQlpZiAoaXNzZXQoJHhtbFNoZWV0LT5jb2xzKSAmJiAhJHRoaXMtPl9yZWFkRGF0YU9ubHkpIHsKCQkJCQkJCQlmb3JlYWNoICgkeG1sU2hlZXQtPmNvbHMtPmNvbCBhcyAkY29sKSB7CgkJCQkJCQkJCWZvciAoJGkgPSBpbnR2YWwoJGNvbFsibWluIl0pIC0gMTsgJGkgPCBpbnR2YWwoJGNvbFsibWF4Il0pOyArKyRpKSB7CgkJCQkJCQkJCQlpZiAoJGNvbFsic3R5bGUiXSAmJiAhJHRoaXMtPl9yZWFkRGF0YU9ubHkpIHsKCQkJCQkJCQkJCQkkZG9jU2hlZXQtPmdldENvbHVtbkRpbWVuc2lvbihQSFBFeGNlbF9DZWxsOjpzdHJpbmdGcm9tQ29sdW1uSW5kZXgoJGkpKS0+c2V0WGZJbmRleChpbnR2YWwoJGNvbFsic3R5bGUiXSkpOwoJCQkJCQkJCQkJfQoJCQkJCQkJCQkJaWYgKCRjb2xbImJlc3RGaXQiXSkgewoJCQkJCQkJCQkJCS8vJGRvY1NoZWV0LT5nZXRDb2x1bW5EaW1lbnNpb24oUEhQRXhjZWxfQ2VsbDo6c3RyaW5nRnJvbUNvbHVtbkluZGV4KCRpKSktPnNldEF1dG9TaXplKHRydWUpOwoJCQkJCQkJCQkJfQoJCQkJCQkJCQkJaWYgKCRjb2xbImhpZGRlbiJdKSB7CgkJCQkJCQkJCQkJJGRvY1NoZWV0LT5nZXRDb2x1bW5EaW1lbnNpb24oUEhQRXhjZWxfQ2VsbDo6c3RyaW5nRnJvbUNvbHVtbkluZGV4KCRpKSktPnNldFZpc2libGUoZmFsc2UpOwoJCQkJCQkJCQkJfQoJCQkJCQkJCQkJaWYgKCRjb2xbImNvbGxhcHNlZCJdKSB7CgkJCQkJCQkJCQkJJGRvY1NoZWV0LT5nZXRDb2x1bW5EaW1lbnNpb24oUEhQRXhjZWxfQ2VsbDo6c3RyaW5nRnJvbUNvbHVtbkluZGV4KCRpKSktPnNldENvbGxhcHNlZCh0cnVlKTsKCQkJCQkJCQkJCX0KCQkJCQkJCQkJCWlmICgkY29sWyJvdXRsaW5lTGV2ZWwiXSA+IDApIHsKCQkJCQkJCQkJCQkkZG9jU2hlZXQtPmdldENvbHVtbkRpbWVuc2lvbihQSFBFeGNlbF9DZWxsOjpzdHJpbmdGcm9tQ29sdW1uSW5kZXgoJGkpKS0+c2V0T3V0bGluZUxldmVsKGludHZhbCgkY29sWyJvdXRsaW5lTGV2ZWwiXSkpOwoJCQkJCQkJCQkJfQoJCQkJCQkJCQkJJGRvY1NoZWV0LT5nZXRDb2x1bW5EaW1lbnNpb24oUEhQRXhjZWxfQ2VsbDo6c3RyaW5nRnJvbUNvbHVtbkluZGV4KCRpKSktPnNldFdpZHRoKGZsb2F0dmFsKCRjb2xbIndpZHRoIl0pKTsKCgkJCQkJCQkJCQlpZiAoaW50dmFsKCRjb2xbIm1heCJdKSA9PSAxNjM4NCkgewoJCQkJCQkJCQkJCWJyZWFrOwoJCQkJCQkJCQkJfQoJCQkJCQkJCQl9CgkJCQkJCQkJfQoJCQkJCQkJfQoKCQkJCQkJCWlmIChpc3NldCgkeG1sU2hlZXQtPnByaW50T3B0aW9ucykgJiYgISR0aGlzLT5fcmVhZERhdGFPbmx5KSB7CgkJCQkJCQkJaWYgKCR4bWxTaGVldC0+cHJpbnRPcHRpb25zWydncmlkTGluZXNTZXQnXSA9PSAndHJ1ZScgJiYgJHhtbFNoZWV0LT5wcmludE9wdGlvbnNbJ2dyaWRMaW5lc1NldCddID09ICcxJykgewoJCQkJCQkJCQkkZG9jU2hlZXQtPnNldFNob3dHcmlkbGluZXModHJ1ZSk7CgkJCQkJCQkJfQoKCQkJCQkJCQlpZiAoJHhtbFNoZWV0LT5wcmludE9wdGlvbnNbJ2dyaWRMaW5lcyddID09ICd0cnVlJyB8fCAkeG1sU2hlZXQtPnByaW50T3B0aW9uc1snZ3JpZExpbmVzJ10gPT0gJzEnKSB7CgkJCQkJCQkJCSRkb2NTaGVldC0+c2V0UHJpbnRHcmlkbGluZXModHJ1ZSk7CgkJCQkJCQkJfQoKCQkJCQkJCQlpZiAoJHhtbFNoZWV0LT5wcmludE9wdGlvbnNbJ2hvcml6b250YWxDZW50ZXJlZCddKSB7CgkJCQkJCQkJCSRkb2NTaGVldC0+Z2V0UGFnZVNldHVwKCktPnNldEhvcml6b250YWxDZW50ZXJlZCh0cnVlKTsKCQkJCQkJCQl9CgkJCQkJCQkJaWYgKCR4bWxTaGVldC0+cHJpbnRPcHRpb25zWyd2ZXJ0aWNhbENlbnRlcmVkJ10pIHsKCQkJCQkJCQkJJGRvY1NoZWV0LT5nZXRQYWdlU2V0dXAoKS0+c2V0VmVydGljYWxDZW50ZXJlZCh0cnVlKTsKCQkJCQkJCQl9CgkJCQkJCQl9CgoJCQkJCQkJaWYgKCR4bWxTaGVldCAmJiAkeG1sU2hlZXQtPnNoZWV0RGF0YSAmJiAkeG1sU2hlZXQtPnNoZWV0RGF0YS0+cm93KSB7CgkJCQkJCQkJZm9yZWFjaCAoJHhtbFNoZWV0LT5zaGVldERhdGEtPnJvdyBhcyAkcm93KSB7CgkJCQkJCQkJCWlmICgkcm93WyJodCJdICYmICEkdGhpcy0+X3JlYWREYXRhT25seSkgewoJCQkJCQkJCQkJJGRvY1NoZWV0LT5nZXRSb3dEaW1lbnNpb24oaW50dmFsKCRyb3dbInIiXSkpLT5zZXRSb3dIZWlnaHQoZmxvYXR2YWwoJHJvd1siaHQiXSkpOwoJCQkJCQkJCQl9CgkJCQkJCQkJCWlmICgkcm93WyJoaWRkZW4iXSAmJiAhJHRoaXMtPl9yZWFkRGF0YU9ubHkpIHsKCQkJCQkJCQkJCSRkb2NTaGVldC0+Z2V0Um93RGltZW5zaW9uKGludHZhbCgkcm93WyJyIl0pKS0+c2V0VmlzaWJsZShmYWxzZSk7CgkJCQkJCQkJCX0KCQkJCQkJCQkJaWYgKCRyb3dbImNvbGxhcHNlZCJdKSB7CgkJCQkJCQkJCQkkZG9jU2hlZXQtPmdldFJvd0RpbWVuc2lvbihpbnR2YWwoJHJvd1siciJdKSktPnNldENvbGxhcHNlZCh0cnVlKTsKCQkJCQkJCQkJfQoJCQkJCQkJCQlpZiAoJHJvd1sib3V0bGluZUxldmVsIl0gPiAwKSB7CgkJCQkJCQkJCQkkZG9jU2hlZXQtPmdldFJvd0RpbWVuc2lvbihpbnR2YWwoJHJvd1siciJdKSktPnNldE91dGxpbmVMZXZlbChpbnR2YWwoJHJvd1sib3V0bGluZUxldmVsIl0pKTsKCQkJCQkJCQkJfQoJCQkJCQkJCQlpZiAoJHJvd1sicyJdICYmICEkdGhpcy0+X3JlYWREYXRhT25seSkgewoJCQkJCQkJCQkJJGRvY1NoZWV0LT5nZXRSb3dEaW1lbnNpb24oaW50dmFsKCRyb3dbInIiXSkpLT5zZXRYZkluZGV4KGludHZhbCgkcm93WyJzIl0pKTsKCQkJCQkJCQkJfQoKCQkJCQkJCQkJZm9yZWFjaCAoJHJvdy0+YyBhcyAkYykgewoJCQkJCQkJCQkJJHIgCQkJCQk9IChzdHJpbmcpICRjWyJyIl07CgkJCQkJCQkJCQkkY2VsbERhdGFUeXBlIAkJPSAoc3RyaW5nKSAkY1sidCJdOwoJCQkJCQkJCQkJJHZhbHVlCQkJCT0gbnVsbDsKCQkJCQkJCQkJCSRjYWxjdWxhdGVkVmFsdWUgCT0gbnVsbDsKCgkJCQkJCQkJCQkvLyBSZWFkIGNlbGw/CgkJCQkJCQkJCQlpZiAoJHRoaXMtPmdldFJlYWRGaWx0ZXIoKSAhPT0gTlVMTCkgewoJCQkJCQkJCQkJCSRjb29yZGluYXRlcyA9IFBIUEV4Y2VsX0NlbGw6OmNvb3JkaW5hdGVGcm9tU3RyaW5nKCRyKTsKCgkJCQkJCQkJCQkJaWYgKCEkdGhpcy0+Z2V0UmVhZEZpbHRlcigpLT5yZWFkQ2VsbCgkY29vcmRpbmF0ZXNbMF0sICRjb29yZGluYXRlc1sxXSwgJGRvY1NoZWV0LT5nZXRUaXRsZSgpKSkgewoJCQkJCQkJCQkJCQljb250aW51ZTsKCQkJCQkJCQkJCQl9CgkJCQkJCQkJCQl9CgoJLy8JCQkJCQkJCQllY2hvICc8Yj5SZWFkaW5nIGNlbGwgJy4kY29vcmRpbmF0ZXNbMF0uJGNvb3JkaW5hdGVzWzFdLic8L2I+PGJyIC8+JzsKCS8vCQkJCQkJCQkJcHJpbnRfcigkYyk7CgkvLwkJCQkJCQkJCWVjaG8gJzxiciAvPic7CgkvLwkJCQkJCQkJCWVjaG8gJ0NlbGwgRGF0YSBUeXBlIGlzICcuJGNlbGxEYXRhVHlwZS4nOiAnOwoJLy8KCQkJCQkJCQkJCS8vIFJlYWQgY2VsbCEKCQkJCQkJCQkJCXN3aXRjaCAoJGNlbGxEYXRhVHlwZSkgewoJCQkJCQkJCQkJCWNhc2UgInMiOgoJLy8JCQkJCQkJCQkJCWVjaG8gJ1N0cmluZzxiciAvPic7CgkJCQkJCQkJCQkJCWlmICgoc3RyaW5nKSRjLT52ICE9ICcnKSB7CgkJCQkJCQkJCQkJCQkkdmFsdWUgPSAkc2hhcmVkU3RyaW5nc1tpbnR2YWwoJGMtPnYpXTsKCgkJCQkJCQkJCQkJCQlpZiAoJHZhbHVlIGluc3RhbmNlb2YgUEhQRXhjZWxfUmljaFRleHQpIHsKCQkJCQkJCQkJCQkJCQkkdmFsdWUgPSBjbG9uZSAkdmFsdWU7CgkJCQkJCQkJCQkJCQl9CgkJCQkJCQkJCQkJCX0gZWxzZSB7CgkJCQkJCQkJCQkJCQkkdmFsdWUgPSAnJzsKCQkJCQkJCQkJCQkJfQoKCQkJCQkJCQkJCQkJYnJlYWs7CgkJCQkJCQkJCQkJY2FzZSAiYiI6CgkvLwkJCQkJCQkJCQkJZWNobyAnQm9vbGVhbjxiciAvPic7CgkJCQkJCQkJCQkJCWlmICghaXNzZXQoJGMtPmYpKSB7CgkJCQkJCQkJCQkJCQkkdmFsdWUgPSBzZWxmOjpfY2FzdFRvQm9vbCgkYyk7CgkJCQkJCQkJCQkJCX0gZWxzZSB7CgkJCQkJCQkJCQkJCQkvLyBGb3JtdWxhCgkJCQkJCQkJCQkJCQkkdGhpcy0+X2Nhc3RUb0Zvcm11bGEoJGMsJHIsJGNlbGxEYXRhVHlwZSwkdmFsdWUsJGNhbGN1bGF0ZWRWYWx1ZSwkc2hhcmVkRm9ybXVsYXMsJ19jYXN0VG9Cb29sJyk7CgkJCQkJCQkJCQkJCQlpZiAoaXNzZXQoJGMtPmZbJ3QnXSkpIHsNCgkJCQkJCQkJCQkJCQkJJGF0dCA9IGFycmF5KCk7DQoJCQkJCQkJCQkJCQkJCSRhdHQgPSAkYy0+ZjsNCgkJCQkJCQkJCQkJCQkJJGRvY1NoZWV0LT5nZXRDZWxsKCRyKS0+c2V0Rm9ybXVsYUF0dHJpYnV0ZXMoJGF0dCk7DQoJCQkJCQkJCQkJCQkJfQ0KCS8vCQkJCQkJCQkJCQkJZWNobyAnJGNhbGN1bGF0ZWRWYWx1ZSA9ICcuJGNhbGN1bGF0ZWRWYWx1ZS4nPGJyIC8+JzsKCQkJCQkJCQkJCQkJfQoJCQkJCQkJCQkJCQlicmVhazsKCQkJCQkJCQkJCQljYXNlICJpbmxpbmVTdHIiOgoJLy8JCQkJCQkJCQkJCWVjaG8gJ0lubGluZSBTdHJpbmc8YnIgLz4nOwoJCQkJCQkJCQkJCQkkdmFsdWUgPSAkdGhpcy0+X3BhcnNlUmljaFRleHQoJGMtPmlzKTsKCgkJCQkJCQkJCQkJCWJyZWFrOwoJCQkJCQkJCQkJCWNhc2UgImUiOgoJLy8JCQkJCQkJCQkJCWVjaG8gJ0Vycm9yPGJyIC8+JzsKCQkJCQkJCQkJCQkJaWYgKCFpc3NldCgkYy0+ZikpIHsKCQkJCQkJCQkJCQkJCSR2YWx1ZSA9IHNlbGY6Ol9jYXN0VG9FcnJvcigkYyk7CgkJCQkJCQkJCQkJCX0gZWxzZSB7CgkJCQkJCQkJCQkJCQkvLyBGb3JtdWxhCgkJCQkJCQkJCQkJCQkkdGhpcy0+X2Nhc3RUb0Zvcm11bGEoJGMsJHIsJGNlbGxEYXRhVHlwZSwkdmFsdWUsJGNhbGN1bGF0ZWRWYWx1ZSwkc2hhcmVkRm9ybXVsYXMsJ19jYXN0VG9FcnJvcicpOwoJLy8JCQkJCQkJCQkJCQllY2hvICckY2FsY3VsYXRlZFZhbHVlID0gJy4kY2FsY3VsYXRlZFZhbHVlLic8YnIgLz4nOwoJCQkJCQkJCQkJCQl9CgoJCQkJCQkJCQkJCQlicmVhazsKCgkJCQkJCQkJCQkJZGVmYXVsdDoKCS8vCQkJCQkJCQkJCQllY2hvICdEZWZhdWx0PGJyIC8+JzsKCQkJCQkJCQkJCQkJaWYgKCFpc3NldCgkYy0+ZikpIHsKCS8vCQkJCQkJCQkJCQkJZWNobyAnTm90IGEgRm9ybXVsYTxiciAvPic7CgkJCQkJCQkJCQkJCQkkdmFsdWUgPSBzZWxmOjpfY2FzdFRvU3RyaW5nKCRjKTsKCQkJCQkJCQkJCQkJfSBlbHNlIHsKCS8vCQkJCQkJCQkJCQkJZWNobyAnVHJlYXQgYXMgRm9ybXVsYTxiciAvPic7CgkJCQkJCQkJCQkJCQkvLyBGb3JtdWxhCgkJCQkJCQkJCQkJCQkkdGhpcy0+X2Nhc3RUb0Zvcm11bGEoJGMsJHIsJGNlbGxEYXRhVHlwZSwkdmFsdWUsJGNhbGN1bGF0ZWRWYWx1ZSwkc2hhcmVkRm9ybXVsYXMsJ19jYXN0VG9TdHJpbmcnKTsKCS8vCQkJCQkJCQkJCQkJZWNobyAnJGNhbGN1bGF0ZWRWYWx1ZSA9ICcuJGNhbGN1bGF0ZWRWYWx1ZS4nPGJyIC8+JzsKCQkJCQkJCQkJCQkJfQoKCQkJCQkJCQkJCQkJYnJlYWs7CgkJCQkJCQkJCQl9CgkvLwkJCQkJCQkJCWVjaG8gJ1ZhbHVlIGlzICcuJHZhbHVlLic8YnIgLz4nOwoKCQkJCQkJCQkJCS8vIENoZWNrIGZvciBudW1lcmljIHZhbHVlcwoJCQkJCQkJCQkJaWYgKGlzX251bWVyaWMoJHZhbHVlKSAmJiAkY2VsbERhdGFUeXBlICE9ICdzJykgewoJCQkJCQkJCQkJCWlmICgkdmFsdWUgPT0gKGludCkkdmFsdWUpICR2YWx1ZSA9IChpbnQpJHZhbHVlOwoJCQkJCQkJCQkJCWVsc2VpZiAoJHZhbHVlID09IChmbG9hdCkkdmFsdWUpICR2YWx1ZSA9IChmbG9hdCkkdmFsdWU7CgkJCQkJCQkJCQkJZWxzZWlmICgkdmFsdWUgPT0gKGRvdWJsZSkkdmFsdWUpICR2YWx1ZSA9IChkb3VibGUpJHZhbHVlOwoJCQkJCQkJCQkJfQoKCQkJCQkJCQkJCS8vIFJpY2ggdGV4dD8KCQkJCQkJCQkJCWlmICgkdmFsdWUgaW5zdGFuY2VvZiBQSFBFeGNlbF9SaWNoVGV4dCAmJiAkdGhpcy0+X3JlYWREYXRhT25seSkgewoJCQkJCQkJCQkJCSR2YWx1ZSA9ICR2YWx1ZS0+Z2V0UGxhaW5UZXh0KCk7CgkJCQkJCQkJCQl9CgoJCQkJCQkJCQkJJGNlbGwgPSAkZG9jU2hlZXQtPmdldENlbGwoJHIpOwoJCQkJCQkJCQkJLy8gQXNzaWduIHZhbHVlCgkJCQkJCQkJCQlpZiAoJGNlbGxEYXRhVHlwZSAhPSAnJykgewoJCQkJCQkJCQkJCSRjZWxsLT5zZXRWYWx1ZUV4cGxpY2l0KCR2YWx1ZSwgJGNlbGxEYXRhVHlwZSk7CgkJCQkJCQkJCQl9IGVsc2UgewoJCQkJCQkJCQkJCSRjZWxsLT5zZXRWYWx1ZSgkdmFsdWUpOwoJCQkJCQkJCQkJfQoJCQkJCQkJCQkJaWYgKCRjYWxjdWxhdGVkVmFsdWUgIT09IE5VTEwpIHsKCQkJCQkJCQkJCQkkY2VsbC0+c2V0Q2FsY3VsYXRlZFZhbHVlKCRjYWxjdWxhdGVkVmFsdWUpOwoJCQkJCQkJCQkJfQoKCQkJCQkJCQkJCS8vIFN0eWxlIGluZm9ybWF0aW9uPwoJCQkJCQkJCQkJaWYgKCRjWyJzIl0gJiYgISR0aGlzLT5fcmVhZERhdGFPbmx5KSB7CgkJCQkJCQkJCQkJLy8gbm8gc3R5bGUgaW5kZXggbWVhbnMgMCwgaXQgc2VlbXMKCQkJCQkJCQkJCQkkY2VsbC0+c2V0WGZJbmRleChpc3NldCgkc3R5bGVzW2ludHZhbCgkY1sicyJdKV0pID8KCQkJCQkJCQkJCQkJaW50dmFsKCRjWyJzIl0pIDogMCk7CgkJCQkJCQkJCQl9CgkJCQkJCQkJCX0KCQkJCQkJCQl9CgkJCQkJCQl9CgoJCQkJCQkJJGNvbmRpdGlvbmFscyA9IGFycmF5KCk7CgkJCQkJCQlpZiAoISR0aGlzLT5fcmVhZERhdGFPbmx5ICYmICR4bWxTaGVldCAmJiAkeG1sU2hlZXQtPmNvbmRpdGlvbmFsRm9ybWF0dGluZykgewoJCQkJCQkJCWZvcmVhY2ggKCR4bWxTaGVldC0+Y29uZGl0aW9uYWxGb3JtYXR0aW5nIGFzICRjb25kaXRpb25hbCkgewoJCQkJCQkJCQlmb3JlYWNoICgkY29uZGl0aW9uYWwtPmNmUnVsZSBhcyAkY2ZSdWxlKSB7CgkJCQkJCQkJCQlpZiAoCgkJCQkJCQkJCQkJKAoJCQkJCQkJCQkJCQkoc3RyaW5nKSRjZlJ1bGVbInR5cGUiXSA9PSBQSFBFeGNlbF9TdHlsZV9Db25kaXRpb25hbDo6Q09ORElUSU9OX05PTkUgfHwKCQkJCQkJCQkJCQkJKHN0cmluZykkY2ZSdWxlWyJ0eXBlIl0gPT0gUEhQRXhjZWxfU3R5bGVfQ29uZGl0aW9uYWw6OkNPTkRJVElPTl9DRUxMSVMgfHwKCQkJCQkJCQkJCQkJKHN0cmluZykkY2ZSdWxlWyJ0eXBlIl0gPT0gUEhQRXhjZWxfU3R5bGVfQ29uZGl0aW9uYWw6OkNPTkRJVElPTl9DT05UQUlOU1RFWFQgfHwKCQkJCQkJCQkJCQkJKHN0cmluZykkY2ZSdWxlWyJ0eXBlIl0gPT0gUEhQRXhjZWxfU3R5bGVfQ29uZGl0aW9uYWw6OkNPTkRJVElPTl9FWFBSRVNTSU9OCgkJCQkJCQkJCQkJKSAmJiBpc3NldCgkZHhmc1tpbnR2YWwoJGNmUnVsZVsiZHhmSWQiXSldKQoJCQkJCQkJCQkJKSB7CgkJCQkJCQkJCQkJJGNvbmRpdGlvbmFsc1soc3RyaW5nKSAkY29uZGl0aW9uYWxbInNxcmVmIl1dW2ludHZhbCgkY2ZSdWxlWyJwcmlvcml0eSJdKV0gPSAkY2ZSdWxlOwoJCQkJCQkJCQkJfQoJCQkJCQkJCQl9CgkJCQkJCQkJfQoKCQkJCQkJCQlmb3JlYWNoICgkY29uZGl0aW9uYWxzIGFzICRyZWYgPT4gJGNmUnVsZXMpIHsKCQkJCQkJCQkJa3NvcnQoJGNmUnVsZXMpOwoJCQkJCQkJCQkkY29uZGl0aW9uYWxTdHlsZXMgPSBhcnJheSgpOwoJCQkJCQkJCQlmb3JlYWNoICgkY2ZSdWxlcyBhcyAkY2ZSdWxlKSB7CgkJCQkJCQkJCQkkb2JqQ29uZGl0aW9uYWwgPSBuZXcgUEhQRXhjZWxfU3R5bGVfQ29uZGl0aW9uYWwoKTsKCQkJCQkJCQkJCSRvYmpDb25kaXRpb25hbC0+c2V0Q29uZGl0aW9uVHlwZSgoc3RyaW5nKSRjZlJ1bGVbInR5cGUiXSk7CgkJCQkJCQkJCQkkb2JqQ29uZGl0aW9uYWwtPnNldE9wZXJhdG9yVHlwZSgoc3RyaW5nKSRjZlJ1bGVbIm9wZXJhdG9yIl0pOwoKCQkJCQkJCQkJCWlmICgoc3RyaW5nKSRjZlJ1bGVbInRleHQiXSAhPSAnJykgewoJCQkJCQkJCQkJCSRvYmpDb25kaXRpb25hbC0+c2V0VGV4dCgoc3RyaW5nKSRjZlJ1bGVbInRleHQiXSk7CgkJCQkJCQkJCQl9CgoJCQkJCQkJCQkJaWYgKGNvdW50KCRjZlJ1bGUtPmZvcm11bGEpID4gMSkgewoJCQkJCQkJCQkJCWZvcmVhY2ggKCRjZlJ1bGUtPmZvcm11bGEgYXMgJGZvcm11bGEpIHsKCQkJCQkJCQkJCQkJJG9iakNvbmRpdGlvbmFsLT5hZGRDb25kaXRpb24oKHN0cmluZykkZm9ybXVsYSk7CgkJCQkJCQkJCQkJfQoJCQkJCQkJCQkJfSBlbHNlIHsKCQkJCQkJCQkJCQkkb2JqQ29uZGl0aW9uYWwtPmFkZENvbmRpdGlvbigoc3RyaW5nKSRjZlJ1bGUtPmZvcm11bGEpOwoJCQkJCQkJCQkJfQoJCQkJCQkJCQkJJG9iakNvbmRpdGlvbmFsLT5zZXRTdHlsZShjbG9uZSAkZHhmc1tpbnR2YWwoJGNmUnVsZVsiZHhmSWQiXSldKTsKCQkJCQkJCQkJCSRjb25kaXRpb25hbFN0eWxlc1tdID0gJG9iakNvbmRpdGlvbmFsOwoJCQkJCQkJCQl9CgoJCQkJCQkJCQkvLyBFeHRyYWN0IGFsbCBjZWxsIHJlZmVyZW5jZXMgaW4gJHJlZgoJCQkJCQkJCQkkYVJlZmVyZW5jZXMgPSBQSFBFeGNlbF9DZWxsOjpleHRyYWN0QWxsQ2VsbFJlZmVyZW5jZXNJblJhbmdlKCRyZWYpOwoJCQkJCQkJCQlmb3JlYWNoICgkYVJlZmVyZW5jZXMgYXMgJHJlZmVyZW5jZSkgewoJCQkJCQkJCQkJJGRvY1NoZWV0LT5nZXRTdHlsZSgkcmVmZXJlbmNlKS0+c2V0Q29uZGl0aW9uYWxTdHlsZXMoJGNvbmRpdGlvbmFsU3R5bGVzKTsKCQkJCQkJCQkJfQoJCQkJCQkJCX0KCQkJCQkJCX0KCgkJCQkJCQkkYUtleXMgPSBhcnJheSgic2hlZXQiLCAib2JqZWN0cyIsICJzY2VuYXJpb3MiLCAiZm9ybWF0Q2VsbHMiLCAiZm9ybWF0Q29sdW1ucyIsICJmb3JtYXRSb3dzIiwgImluc2VydENvbHVtbnMiLCAiaW5zZXJ0Um93cyIsICJpbnNlcnRIeXBlcmxpbmtzIiwgImRlbGV0ZUNvbHVtbnMiLCAiZGVsZXRlUm93cyIsICJzZWxlY3RMb2NrZWRDZWxscyIsICJzb3J0IiwgImF1dG9GaWx0ZXIiLCAicGl2b3RUYWJsZXMiLCAic2VsZWN0VW5sb2NrZWRDZWxscyIpOwoJCQkJCQkJaWYgKCEkdGhpcy0+X3JlYWREYXRhT25seSAmJiAkeG1sU2hlZXQgJiYgJHhtbFNoZWV0LT5zaGVldFByb3RlY3Rpb24pIHsKCQkJCQkJCQlmb3JlYWNoICgkYUtleXMgYXMgJGtleSkgewoJCQkJCQkJCQkkbWV0aG9kID0gInNldCIgLiB1Y2ZpcnN0KCRrZXkpOwoJCQkJCQkJCQkkZG9jU2hlZXQtPmdldFByb3RlY3Rpb24oKS0+JG1ldGhvZCgkeG1sU2hlZXQtPnNoZWV0UHJvdGVjdGlvblska2V5XSA9PSAidHJ1ZSIpOwoJCQkJCQkJCX0KCQkJCQkJCX0KCgkJCQkJCQlpZiAoISR0aGlzLT5fcmVhZERhdGFPbmx5ICYmICR4bWxTaGVldCAmJiAkeG1sU2hlZXQtPnNoZWV0UHJvdGVjdGlvbikgewoJCQkJCQkJCSRkb2NTaGVldC0+Z2V0UHJvdGVjdGlvbigpLT5zZXRQYXNzd29yZCgoc3RyaW5nKSAkeG1sU2hlZXQtPnNoZWV0UHJvdGVjdGlvblsicGFzc3dvcmQiXSwgdHJ1ZSk7CgkJCQkJCQkJaWYgKCR4bWxTaGVldC0+cHJvdGVjdGVkUmFuZ2VzLT5wcm90ZWN0ZWRSYW5nZSkgewoJCQkJCQkJCQlmb3JlYWNoICgkeG1sU2hlZXQtPnByb3RlY3RlZFJhbmdlcy0+cHJvdGVjdGVkUmFuZ2UgYXMgJHByb3RlY3RlZFJhbmdlKSB7CgkJCQkJCQkJCQkkZG9jU2hlZXQtPnByb3RlY3RDZWxscygoc3RyaW5nKSAkcHJvdGVjdGVkUmFuZ2VbInNxcmVmIl0sIChzdHJpbmcpICRwcm90ZWN0ZWRSYW5nZVsicGFzc3dvcmQiXSwgdHJ1ZSk7CgkJCQkJCQkJCX0KCQkJCQkJCQl9CgkJCQkJCQl9CgoJCQkJCQkJaWYgKCR4bWxTaGVldCAmJiAkeG1sU2hlZXQtPmF1dG9GaWx0ZXIgJiYgISR0aGlzLT5fcmVhZERhdGFPbmx5KSB7CgkJCQkJCQkJJGRvY1NoZWV0LT5zZXRBdXRvRmlsdGVyKChzdHJpbmcpICR4bWxTaGVldC0+YXV0b0ZpbHRlclsicmVmIl0pOwoJCQkJCQkJfQoKCQkJCQkJCWlmICgkeG1sU2hlZXQgJiYgJHhtbFNoZWV0LT5tZXJnZUNlbGxzICYmICR4bWxTaGVldC0+bWVyZ2VDZWxscy0+bWVyZ2VDZWxsICYmICEkdGhpcy0+X3JlYWREYXRhT25seSkgewoJCQkJCQkJCWZvcmVhY2ggKCR4bWxTaGVldC0+bWVyZ2VDZWxscy0+bWVyZ2VDZWxsIGFzICRtZXJnZUNlbGwpIHsKCQkJCQkJCQkJJGRvY1NoZWV0LT5tZXJnZUNlbGxzKChzdHJpbmcpICRtZXJnZUNlbGxbInJlZiJdKTsKCQkJCQkJCQl9CgkJCQkJCQl9CgoJCQkJCQkJaWYgKCR4bWxTaGVldCAmJiAkeG1sU2hlZXQtPnBhZ2VNYXJnaW5zICYmICEkdGhpcy0+X3JlYWREYXRhT25seSkgewoJCQkJCQkJCSRkb2NQYWdlTWFyZ2lucyA9ICRkb2NTaGVldC0+Z2V0UGFnZU1hcmdpbnMoKTsKCQkJCQkJCQkkZG9jUGFnZU1hcmdpbnMtPnNldExlZnQoZmxvYXR2YWwoJHhtbFNoZWV0LT5wYWdlTWFyZ2luc1sibGVmdCJdKSk7CgkJCQkJCQkJJGRvY1BhZ2VNYXJnaW5zLT5zZXRSaWdodChmbG9hdHZhbCgkeG1sU2hlZXQtPnBhZ2VNYXJnaW5zWyJyaWdodCJdKSk7CgkJCQkJCQkJJGRvY1BhZ2VNYXJnaW5zLT5zZXRUb3AoZmxvYXR2YWwoJHhtbFNoZWV0LT5wYWdlTWFyZ2luc1sidG9wIl0pKTsKCQkJCQkJCQkkZG9jUGFnZU1hcmdpbnMtPnNldEJvdHRvbShmbG9hdHZhbCgkeG1sU2hlZXQtPnBhZ2VNYXJnaW5zWyJib3R0b20iXSkpOwoJCQkJCQkJCSRkb2NQYWdlTWFyZ2lucy0+c2V0SGVhZGVyKGZsb2F0dmFsKCR4bWxTaGVldC0+cGFnZU1hcmdpbnNbImhlYWRlciJdKSk7CgkJCQkJCQkJJGRvY1BhZ2VNYXJnaW5zLT5zZXRGb290ZXIoZmxvYXR2YWwoJHhtbFNoZWV0LT5wYWdlTWFyZ2luc1siZm9vdGVyIl0pKTsKCQkJCQkJCX0KCgkJCQkJCQlpZiAoJHhtbFNoZWV0ICYmICR4bWxTaGVldC0+cGFnZVNldHVwICYmICEkdGhpcy0+X3JlYWREYXRhT25seSkgewoJCQkJCQkJCSRkb2NQYWdlU2V0dXAgPSAkZG9jU2hlZXQtPmdldFBhZ2VTZXR1cCgpOwoKCQkJCQkJCQlpZiAoaXNzZXQoJHhtbFNoZWV0LT5wYWdlU2V0dXBbIm9yaWVudGF0aW9uIl0pKSB7CgkJCQkJCQkJCSRkb2NQYWdlU2V0dXAtPnNldE9yaWVudGF0aW9uKChzdHJpbmcpICR4bWxTaGVldC0+cGFnZVNldHVwWyJvcmllbnRhdGlvbiJdKTsKCQkJCQkJCQl9CgkJCQkJCQkJaWYgKGlzc2V0KCR4bWxTaGVldC0+cGFnZVNldHVwWyJwYXBlclNpemUiXSkpIHsKCQkJCQkJCQkJJGRvY1BhZ2VTZXR1cC0+c2V0UGFwZXJTaXplKGludHZhbCgkeG1sU2hlZXQtPnBhZ2VTZXR1cFsicGFwZXJTaXplIl0pKTsKCQkJCQkJCQl9CgkJCQkJCQkJaWYgKGlzc2V0KCR4bWxTaGVldC0+cGFnZVNldHVwWyJzY2FsZSJdKSkgewoJCQkJCQkJCQkkZG9jUGFnZVNldHVwLT5zZXRTY2FsZShpbnR2YWwoJHhtbFNoZWV0LT5wYWdlU2V0dXBbInNjYWxlIl0pLCBmYWxzZSk7CgkJCQkJCQkJfQoJCQkJCQkJCWlmIChpc3NldCgkeG1sU2hlZXQtPnBhZ2VTZXR1cFsiZml0VG9IZWlnaHQiXSkgJiYgaW50dmFsKCR4bWxTaGVldC0+cGFnZVNldHVwWyJmaXRUb0hlaWdodCJdKSA+PSAwKSB7CgkJCQkJCQkJCSRkb2NQYWdlU2V0dXAtPnNldEZpdFRvSGVpZ2h0KGludHZhbCgkeG1sU2hlZXQtPnBhZ2VTZXR1cFsiZml0VG9IZWlnaHQiXSksIGZhbHNlKTsKCQkJCQkJCQl9CgkJCQkJCQkJaWYgKGlzc2V0KCR4bWxTaGVldC0+cGFnZVNldHVwWyJmaXRUb1dpZHRoIl0pICYmIGludHZhbCgkeG1sU2hlZXQtPnBhZ2VTZXR1cFsiZml0VG9XaWR0aCJdKSA+PSAwKSB7CgkJCQkJCQkJCSRkb2NQYWdlU2V0dXAtPnNldEZpdFRvV2lkdGgoaW50dmFsKCR4bWxTaGVldC0+cGFnZVNldHVwWyJmaXRUb1dpZHRoIl0pLCBmYWxzZSk7CgkJCQkJCQkJfQoJCQkJCQkJCWlmIChpc3NldCgkeG1sU2hlZXQtPnBhZ2VTZXR1cFsiZmlyc3RQYWdlTnVtYmVyIl0pICYmIGlzc2V0KCR4bWxTaGVldC0+cGFnZVNldHVwWyJ1c2VGaXJzdFBhZ2VOdW1iZXIiXSkgJiYKCQkJCQkJCQkJKChzdHJpbmcpJHhtbFNoZWV0LT5wYWdlU2V0dXBbInVzZUZpcnN0UGFnZU51bWJlciJdID09ICd0cnVlJyB8fCAoc3RyaW5nKSR4bWxTaGVldC0+cGFnZVNldHVwWyJ1c2VGaXJzdFBhZ2VOdW1iZXIiXSA9PSAnMScpKSB7CgkJCQkJCQkJCSRkb2NQYWdlU2V0dXAtPnNldEZpcnN0UGFnZU51bWJlcihpbnR2YWwoJHhtbFNoZWV0LT5wYWdlU2V0dXBbImZpcnN0UGFnZU51bWJlciJdKSk7CgkJCQkJCQkJfQoJCQkJCQkJfQoKCQkJCQkJCWlmICgkeG1sU2hlZXQgJiYgJHhtbFNoZWV0LT5oZWFkZXJGb290ZXIgJiYgISR0aGlzLT5fcmVhZERhdGFPbmx5KSB7CgkJCQkJCQkJJGRvY0hlYWRlckZvb3RlciA9ICRkb2NTaGVldC0+Z2V0SGVhZGVyRm9vdGVyKCk7CgoJCQkJCQkJCWlmIChpc3NldCgkeG1sU2hlZXQtPmhlYWRlckZvb3RlclsiZGlmZmVyZW50T2RkRXZlbiJdKSAmJgoJCQkJCQkJCQkoKHN0cmluZykkeG1sU2hlZXQtPmhlYWRlckZvb3RlclsiZGlmZmVyZW50T2RkRXZlbiJdID09ICd0cnVlJyB8fCAoc3RyaW5nKSR4bWxTaGVldC0+aGVhZGVyRm9vdGVyWyJkaWZmZXJlbnRPZGRFdmVuIl0gPT0gJzEnKSkgewoJCQkJCQkJCQkkZG9jSGVhZGVyRm9vdGVyLT5zZXREaWZmZXJlbnRPZGRFdmVuKHRydWUpOwoJCQkJCQkJCX0gZWxzZSB7CgkJCQkJCQkJCSRkb2NIZWFkZXJGb290ZXItPnNldERpZmZlcmVudE9kZEV2ZW4oZmFsc2UpOwoJCQkJCQkJCX0KCQkJCQkJCQlpZiAoaXNzZXQoJHhtbFNoZWV0LT5oZWFkZXJGb290ZXJbImRpZmZlcmVudEZpcnN0Il0pICYmCgkJCQkJCQkJCSgoc3RyaW5nKSR4bWxTaGVldC0+aGVhZGVyRm9vdGVyWyJkaWZmZXJlbnRGaXJzdCJdID09ICd0cnVlJyB8fCAoc3RyaW5nKSR4bWxTaGVldC0+aGVhZGVyRm9vdGVyWyJkaWZmZXJlbnRGaXJzdCJdID09ICcxJykpIHsKCQkJCQkJCQkJJGRvY0hlYWRlckZvb3Rlci0+c2V0RGlmZmVyZW50Rmlyc3QodHJ1ZSk7CgkJCQkJCQkJfSBlbHNlIHsKCQkJCQkJCQkJJGRvY0hlYWRlckZvb3Rlci0+c2V0RGlmZmVyZW50Rmlyc3QoZmFsc2UpOwoJCQkJCQkJCX0KCQkJCQkJCQlpZiAoaXNzZXQoJHhtbFNoZWV0LT5oZWFkZXJGb290ZXJbInNjYWxlV2l0aERvYyJdKSAmJgoJCQkJCQkJCQkoKHN0cmluZykkeG1sU2hlZXQtPmhlYWRlckZvb3Rlclsic2NhbGVXaXRoRG9jIl0gPT0gJ2ZhbHNlJyB8fCAoc3RyaW5nKSR4bWxTaGVldC0+aGVhZGVyRm9vdGVyWyJzY2FsZVdpdGhEb2MiXSA9PSAnMCcpKSB7CgkJCQkJCQkJCSRkb2NIZWFkZXJGb290ZXItPnNldFNjYWxlV2l0aERvY3VtZW50KGZhbHNlKTsKCQkJCQkJCQl9IGVsc2UgewoJCQkJCQkJCQkkZG9jSGVhZGVyRm9vdGVyLT5zZXRTY2FsZVdpdGhEb2N1bWVudCh0cnVlKTsKCQkJCQkJCQl9CgkJCQkJCQkJaWYgKGlzc2V0KCR4bWxTaGVldC0+aGVhZGVyRm9vdGVyWyJhbGlnbldpdGhNYXJnaW5zIl0pICYmCgkJCQkJCQkJCSgoc3RyaW5nKSR4bWxTaGVldC0+aGVhZGVyRm9vdGVyWyJhbGlnbldpdGhNYXJnaW5zIl0gPT0gJ2ZhbHNlJyB8fCAoc3RyaW5nKSR4bWxTaGVldC0+aGVhZGVyRm9vdGVyWyJhbGlnbldpdGhNYXJnaW5zIl0gPT0gJzAnKSkgewoJCQkJCQkJCQkkZG9jSGVhZGVyRm9vdGVyLT5zZXRBbGlnbldpdGhNYXJnaW5zKGZhbHNlKTsKCQkJCQkJCQl9IGVsc2UgewoJCQkJCQkJCQkkZG9jSGVhZGVyRm9vdGVyLT5zZXRBbGlnbldpdGhNYXJnaW5zKHRydWUpOwoJCQkJCQkJCX0KCgkJCQkJCQkJJGRvY0hlYWRlckZvb3Rlci0+c2V0T2RkSGVhZGVyKChzdHJpbmcpICR4bWxTaGVldC0+aGVhZGVyRm9vdGVyLT5vZGRIZWFkZXIpOwoJCQkJCQkJCSRkb2NIZWFkZXJGb290ZXItPnNldE9kZEZvb3Rlcigoc3RyaW5nKSAkeG1sU2hlZXQtPmhlYWRlckZvb3Rlci0+b2RkRm9vdGVyKTsKCQkJCQkJCQkkZG9jSGVhZGVyRm9vdGVyLT5zZXRFdmVuSGVhZGVyKChzdHJpbmcpICR4bWxTaGVldC0+aGVhZGVyRm9vdGVyLT5ldmVuSGVhZGVyKTsKCQkJCQkJCQkkZG9jSGVhZGVyRm9vdGVyLT5zZXRFdmVuRm9vdGVyKChzdHJpbmcpICR4bWxTaGVldC0+aGVhZGVyRm9vdGVyLT5ldmVuRm9vdGVyKTsKCQkJCQkJCQkkZG9jSGVhZGVyRm9vdGVyLT5zZXRGaXJzdEhlYWRlcigoc3RyaW5nKSAkeG1sU2hlZXQtPmhlYWRlckZvb3Rlci0+Zmlyc3RIZWFkZXIpOwoJCQkJCQkJCSRkb2NIZWFkZXJGb290ZXItPnNldEZpcnN0Rm9vdGVyKChzdHJpbmcpICR4bWxTaGVldC0+aGVhZGVyRm9vdGVyLT5maXJzdEZvb3Rlcik7CgkJCQkJCQl9CgoJCQkJCQkJaWYgKCR4bWxTaGVldCAmJiAkeG1sU2hlZXQtPnJvd0JyZWFrcyAmJiAkeG1sU2hlZXQtPnJvd0JyZWFrcy0+YnJrICYmICEkdGhpcy0+X3JlYWREYXRhT25seSkgewoJCQkJCQkJCWZvcmVhY2ggKCR4bWxTaGVldC0+cm93QnJlYWtzLT5icmsgYXMgJGJyaykgewoJCQkJCQkJCQlpZiAoJGJya1sibWFuIl0pIHsKCQkJCQkJCQkJCSRkb2NTaGVldC0+c2V0QnJlYWsoIkEkYnJrW2lkXSIsIFBIUEV4Y2VsX1dvcmtzaGVldDo6QlJFQUtfUk9XKTsKCQkJCQkJCQkJfQoJCQkJCQkJCX0KCQkJCQkJCX0KCQkJCQkJCWlmICgkeG1sU2hlZXQgJiYgJHhtbFNoZWV0LT5jb2xCcmVha3MgJiYgJHhtbFNoZWV0LT5jb2xCcmVha3MtPmJyayAmJiAhJHRoaXMtPl9yZWFkRGF0YU9ubHkpIHsKCQkJCQkJCQlmb3JlYWNoICgkeG1sU2hlZXQtPmNvbEJyZWFrcy0+YnJrIGFzICRicmspIHsKCQkJCQkJCQkJaWYgKCRicmtbIm1hbiJdKSB7CgkJCQkJCQkJCQkkZG9jU2hlZXQtPnNldEJyZWFrKFBIUEV4Y2VsX0NlbGw6OnN0cmluZ0Zyb21Db2x1bW5JbmRleCgkYnJrWyJpZCJdKSAuICIxIiwgUEhQRXhjZWxfV29ya3NoZWV0OjpCUkVBS19DT0xVTU4pOwoJCQkJCQkJCQl9CgkJCQkJCQkJfQoJCQkJCQkJfQoKCQkJCQkJCWlmICgkeG1sU2hlZXQgJiYgJHhtbFNoZWV0LT5kYXRhVmFsaWRhdGlvbnMgJiYgISR0aGlzLT5fcmVhZERhdGFPbmx5KSB7CgkJCQkJCQkJZm9yZWFjaCAoJHhtbFNoZWV0LT5kYXRhVmFsaWRhdGlvbnMtPmRhdGFWYWxpZGF0aW9uIGFzICRkYXRhVmFsaWRhdGlvbikgewoJCQkJCQkJCSAgICAvLyBVcHBlcmNhc2UgY29vcmRpbmF0ZQoJCQkJCQkJICAgIAkkcmFuZ2UgPSBzdHJ0b3VwcGVyKCRkYXRhVmFsaWRhdGlvblsic3FyZWYiXSk7CgkJCQkJCQkJCSRyYW5nZVNldCA9IGV4cGxvZGUoJyAnLCRyYW5nZSk7CgkJCQkJCQkJCWZvcmVhY2goJHJhbmdlU2V0IGFzICRyYW5nZSkgewoJCQkJCQkJCQkJJHN0UmFuZ2UgPSAkZG9jU2hlZXQtPnNocmlua1JhbmdlVG9GaXQoJHJhbmdlKTsKCgkJCQkJCQkJCQkvLyBFeHRyYWN0IGFsbCBjZWxsIHJlZmVyZW5jZXMgaW4gJHJhbmdlCgkJCQkJCQkJCQkkYVJlZmVyZW5jZXMgPSBQSFBFeGNlbF9DZWxsOjpleHRyYWN0QWxsQ2VsbFJlZmVyZW5jZXNJblJhbmdlKCRzdFJhbmdlKTsKCQkJCQkJCQkJCWZvcmVhY2ggKCRhUmVmZXJlbmNlcyBhcyAkcmVmZXJlbmNlKSB7CgkJCQkJCQkJCQkJLy8gQ3JlYXRlIHZhbGlkYXRpb24KCQkJCQkJCQkJCQkkZG9jVmFsaWRhdGlvbiA9ICRkb2NTaGVldC0+Z2V0Q2VsbCgkcmVmZXJlbmNlKS0+Z2V0RGF0YVZhbGlkYXRpb24oKTsKCQkJCQkJCQkJCQkkZG9jVmFsaWRhdGlvbi0+c2V0VHlwZSgoc3RyaW5nKSAkZGF0YVZhbGlkYXRpb25bInR5cGUiXSk7CgkJCQkJCQkJCQkJJGRvY1ZhbGlkYXRpb24tPnNldEVycm9yU3R5bGUoKHN0cmluZykgJGRhdGFWYWxpZGF0aW9uWyJlcnJvclN0eWxlIl0pOwoJCQkJCQkJCQkJCSRkb2NWYWxpZGF0aW9uLT5zZXRPcGVyYXRvcigoc3RyaW5nKSAkZGF0YVZhbGlkYXRpb25bIm9wZXJhdG9yIl0pOwoJCQkJCQkJCQkJCSRkb2NWYWxpZGF0aW9uLT5zZXRBbGxvd0JsYW5rKCRkYXRhVmFsaWRhdGlvblsiYWxsb3dCbGFuayJdICE9IDApOwoJCQkJCQkJCQkJCSRkb2NWYWxpZGF0aW9uLT5zZXRTaG93RHJvcERvd24oJGRhdGFWYWxpZGF0aW9uWyJzaG93RHJvcERvd24iXSA9PSAwKTsKCQkJCQkJCQkJCQkkZG9jVmFsaWRhdGlvbi0+c2V0U2hvd0lucHV0TWVzc2FnZSgkZGF0YVZhbGlkYXRpb25bInNob3dJbnB1dE1lc3NhZ2UiXSAhPSAwKTsKCQkJCQkJCQkJCQkkZG9jVmFsaWRhdGlvbi0+c2V0U2hvd0Vycm9yTWVzc2FnZSgkZGF0YVZhbGlkYXRpb25bInNob3dFcnJvck1lc3NhZ2UiXSAhPSAwKTsKCQkJCQkJCQkJCQkkZG9jVmFsaWRhdGlvbi0+c2V0RXJyb3JUaXRsZSgoc3RyaW5nKSAkZGF0YVZhbGlkYXRpb25bImVycm9yVGl0bGUiXSk7CgkJCQkJCQkJCQkJJGRvY1ZhbGlkYXRpb24tPnNldEVycm9yKChzdHJpbmcpICRkYXRhVmFsaWRhdGlvblsiZXJyb3IiXSk7CgkJCQkJCQkJCQkJJGRvY1ZhbGlkYXRpb24tPnNldFByb21wdFRpdGxlKChzdHJpbmcpICRkYXRhVmFsaWRhdGlvblsicHJvbXB0VGl0bGUiXSk7CgkJCQkJCQkJCQkJJGRvY1ZhbGlkYXRpb24tPnNldFByb21wdCgoc3RyaW5nKSAkZGF0YVZhbGlkYXRpb25bInByb21wdCJdKTsKCQkJCQkJCQkJCQkkZG9jVmFsaWRhdGlvbi0+c2V0Rm9ybXVsYTEoKHN0cmluZykgJGRhdGFWYWxpZGF0aW9uLT5mb3JtdWxhMSk7CgkJCQkJCQkJCQkJJGRvY1ZhbGlkYXRpb24tPnNldEZvcm11bGEyKChzdHJpbmcpICRkYXRhVmFsaWRhdGlvbi0+Zm9ybXVsYTIpOwoJCQkJCQkJCQkJfQoJCQkJCQkJCQl9CgkJCQkJCQkJfQoJCQkJCQkJfQoKCQkJCQkJCS8vIEFkZCBoeXBlcmxpbmtzCgkJCQkJCQkkaHlwZXJsaW5rcyA9IGFycmF5KCk7CgkJCQkJCQlpZiAoISR0aGlzLT5fcmVhZERhdGFPbmx5KSB7CgkJCQkJCQkJLy8gTG9jYXRlIGh5cGVybGluayByZWxhdGlvbnMKCQkJCQkJCQlpZiAoJHppcC0+bG9jYXRlTmFtZShkaXJuYW1lKCIkZGlyLyRmaWxlV29ya3NoZWV0IikgLiAiL19yZWxzLyIgLiBiYXNlbmFtZSgkZmlsZVdvcmtzaGVldCkgLiAiLnJlbHMiKSkgewoJCQkJCQkJCQkkcmVsc1dvcmtzaGVldCA9IHNpbXBsZXhtbF9sb2FkX3N0cmluZygkdGhpcy0+X2dldEZyb21aaXBBcmNoaXZlKCR6aXAsICBkaXJuYW1lKCIkZGlyLyRmaWxlV29ya3NoZWV0IikgLiAiL19yZWxzLyIgLiBiYXNlbmFtZSgkZmlsZVdvcmtzaGVldCkgLiAiLnJlbHMiKSApOyAvL34gaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL3BhY2thZ2UvMjAwNi9yZWxhdGlvbnNoaXBzIik7CgkJCQkJCQkJCWZvcmVhY2ggKCRyZWxzV29ya3NoZWV0LT5SZWxhdGlvbnNoaXAgYXMgJGVsZSkgewoJCQkJCQkJCQkJaWYgKCRlbGVbIlR5cGUiXSA9PSAiaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL29mZmljZURvY3VtZW50LzIwMDYvcmVsYXRpb25zaGlwcy9oeXBlcmxpbmsiKSB7CgkJCQkJCQkJCQkJJGh5cGVybGlua3NbKHN0cmluZykkZWxlWyJJZCJdXSA9IChzdHJpbmcpJGVsZVsiVGFyZ2V0Il07CgkJCQkJCQkJCQl9CgkJCQkJCQkJCX0KCQkJCQkJCQl9CgoJCQkJCQkJCS8vIExvb3AgdGhyb3VnaCBoeXBlcmxpbmtzCgkJCQkJCQkJaWYgKCR4bWxTaGVldCAmJiAkeG1sU2hlZXQtPmh5cGVybGlua3MpIHsKCQkJCQkJCQkJZm9yZWFjaCAoJHhtbFNoZWV0LT5oeXBlcmxpbmtzLT5oeXBlcmxpbmsgYXMgJGh5cGVybGluaykgewoJCQkJCQkJCQkJLy8gTGluayB1cmwKCQkJCQkJCQkJCSRsaW5rUmVsID0gJGh5cGVybGluay0+YXR0cmlidXRlcygnaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL29mZmljZURvY3VtZW50LzIwMDYvcmVsYXRpb25zaGlwcycpOwoKCQkJCQkJCQkJCWZvcmVhY2ggKFBIUEV4Y2VsX0NlbGw6OmV4dHJhY3RBbGxDZWxsUmVmZXJlbmNlc0luUmFuZ2UoJGh5cGVybGlua1sncmVmJ10pIGFzICRjZWxsUmVmZXJlbmNlKSB7CgkJCQkJCQkJCQkJJGNlbGwgPSAkZG9jU2hlZXQtPmdldENlbGwoICRjZWxsUmVmZXJlbmNlICk7CgkJCQkJCQkJCQkJaWYgKGlzc2V0KCRsaW5rUmVsWydpZCddKSkgewoJCQkJCQkJCQkJCQkkY2VsbC0+Z2V0SHlwZXJsaW5rKCktPnNldFVybCggJGh5cGVybGlua3NbIChzdHJpbmcpJGxpbmtSZWxbJ2lkJ10gXSApOwoJCQkJCQkJCQkJCX0KCQkJCQkJCQkJCQlpZiAoaXNzZXQoJGh5cGVybGlua1snbG9jYXRpb24nXSkpIHsKCQkJCQkJCQkJCQkJJGNlbGwtPmdldEh5cGVybGluaygpLT5zZXRVcmwoICdzaGVldDovLycgLiAoc3RyaW5nKSRoeXBlcmxpbmtbJ2xvY2F0aW9uJ10gKTsKCQkJCQkJCQkJCQl9CgoJCQkJCQkJCQkJCS8vIFRvb2x0aXAKCQkJCQkJCQkJCQlpZiAoaXNzZXQoJGh5cGVybGlua1sndG9vbHRpcCddKSkgewoJCQkJCQkJCQkJCQkkY2VsbC0+Z2V0SHlwZXJsaW5rKCktPnNldFRvb2x0aXAoIChzdHJpbmcpJGh5cGVybGlua1sndG9vbHRpcCddICk7CgkJCQkJCQkJCQkJfQoJCQkJCQkJCQkJfQoJCQkJCQkJCQl9CgkJCQkJCQkJfQoJCQkJCQkJfQoKCQkJCQkJCS8vIEFkZCBjb21tZW50cwoJCQkJCQkJJGNvbW1lbnRzID0gYXJyYXkoKTsKCQkJCQkJCSR2bWxDb21tZW50cyA9IGFycmF5KCk7CgkJCQkJCQlpZiAoISR0aGlzLT5fcmVhZERhdGFPbmx5KSB7CgkJCQkJCQkJLy8gTG9jYXRlIGNvbW1lbnQgcmVsYXRpb25zCgkJCQkJCQkJaWYgKCR6aXAtPmxvY2F0ZU5hbWUoZGlybmFtZSgiJGRpci8kZmlsZVdvcmtzaGVldCIpIC4gIi9fcmVscy8iIC4gYmFzZW5hbWUoJGZpbGVXb3Jrc2hlZXQpIC4gIi5yZWxzIikpIHsKCQkJCQkJCQkJJHJlbHNXb3Jrc2hlZXQgPSBzaW1wbGV4bWxfbG9hZF9zdHJpbmcoJHRoaXMtPl9nZXRGcm9tWmlwQXJjaGl2ZSgkemlwLCAgZGlybmFtZSgiJGRpci8kZmlsZVdvcmtzaGVldCIpIC4gIi9fcmVscy8iIC4gYmFzZW5hbWUoJGZpbGVXb3Jrc2hlZXQpIC4gIi5yZWxzIikgKTsgLy9+IGh0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9wYWNrYWdlLzIwMDYvcmVsYXRpb25zaGlwcyIpOwoJCQkJCQkJCQlmb3JlYWNoICgkcmVsc1dvcmtzaGVldC0+UmVsYXRpb25zaGlwIGFzICRlbGUpIHsKCQkJCQkJCQkJICAgIGlmICgkZWxlWyJUeXBlIl0gPT0gImh0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9vZmZpY2VEb2N1bWVudC8yMDA2L3JlbGF0aW9uc2hpcHMvY29tbWVudHMiKSB7CgkJCQkJCQkJCQkJJGNvbW1lbnRzWyhzdHJpbmcpJGVsZVsiSWQiXV0gPSAoc3RyaW5nKSRlbGVbIlRhcmdldCJdOwoJCQkJCQkJCQkJfQoJCQkJCQkJCQkgICAgaWYgKCRlbGVbIlR5cGUiXSA9PSAiaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL29mZmljZURvY3VtZW50LzIwMDYvcmVsYXRpb25zaGlwcy92bWxEcmF3aW5nIikgewoJCQkJCQkJCQkJCSR2bWxDb21tZW50c1soc3RyaW5nKSRlbGVbIklkIl1dID0gKHN0cmluZykkZWxlWyJUYXJnZXQiXTsKCQkJCQkJCQkJCX0KCQkJCQkJCQkJfQoJCQkJCQkJCX0KCgkJCQkJCQkJLy8gTG9vcCB0aHJvdWdoIGNvbW1lbnRzCgkJCQkJCQkJZm9yZWFjaCAoJGNvbW1lbnRzIGFzICRyZWxOYW1lID0+ICRyZWxQYXRoKSB7CgkJCQkJCQkJCS8vIExvYWQgY29tbWVudHMgZmlsZQoJCQkJCQkJCQkkcmVsUGF0aCA9IFBIUEV4Y2VsX1NoYXJlZF9GaWxlOjpyZWFscGF0aChkaXJuYW1lKCIkZGlyLyRmaWxlV29ya3NoZWV0IikgLiAiLyIgLiAkcmVsUGF0aCk7CgkJCQkJCQkJCSRjb21tZW50c0ZpbGUgPSBzaW1wbGV4bWxfbG9hZF9zdHJpbmcoJHRoaXMtPl9nZXRGcm9tWmlwQXJjaGl2ZSgkemlwLCAkcmVsUGF0aCkgKTsKCgkJCQkJCQkJCS8vIFV0aWxpdHkgdmFyaWFibGVzCgkJCQkJCQkJCSRhdXRob3JzID0gYXJyYXkoKTsKCgkJCQkJCQkJCS8vIExvb3AgdGhyb3VnaCBhdXRob3JzCgkJCQkJCQkJCWZvcmVhY2ggKCRjb21tZW50c0ZpbGUtPmF1dGhvcnMtPmF1dGhvciBhcyAkYXV0aG9yKSB7CgkJCQkJCQkJCQkkYXV0aG9yc1tdID0gKHN0cmluZykkYXV0aG9yOwoJCQkJCQkJCQl9CgoJCQkJCQkJCQkvLyBMb29wIHRocm91Z2ggY29udGVudHMKCQkJCQkJCQkJZm9yZWFjaCAoJGNvbW1lbnRzRmlsZS0+Y29tbWVudExpc3QtPmNvbW1lbnQgYXMgJGNvbW1lbnQpIHsKCQkJCQkJCQkJCSRkb2NTaGVldC0+Z2V0Q29tbWVudCggKHN0cmluZykkY29tbWVudFsncmVmJ10gKS0+c2V0QXV0aG9yKCAkYXV0aG9yc1soc3RyaW5nKSRjb21tZW50WydhdXRob3JJZCddXSApOwoJCQkJCQkJCQkJJGRvY1NoZWV0LT5nZXRDb21tZW50KCAoc3RyaW5nKSRjb21tZW50WydyZWYnXSApLT5zZXRUZXh0KCAkdGhpcy0+X3BhcnNlUmljaFRleHQoJGNvbW1lbnQtPnRleHQpICk7CgkJCQkJCQkJCX0KCQkJCQkJCQl9CgoJCQkJCQkJCS8vIExvb3AgdGhyb3VnaCBWTUwgY29tbWVudHMKCQkJCQkJCSAgICBmb3JlYWNoICgkdm1sQ29tbWVudHMgYXMgJHJlbE5hbWUgPT4gJHJlbFBhdGgpIHsKCQkJCQkJCQkJLy8gTG9hZCBWTUwgY29tbWVudHMgZmlsZQoJCQkJCQkJCQkkcmVsUGF0aCA9IFBIUEV4Y2VsX1NoYXJlZF9GaWxlOjpyZWFscGF0aChkaXJuYW1lKCIkZGlyLyRmaWxlV29ya3NoZWV0IikgLiAiLyIgLiAkcmVsUGF0aCk7CgkJCQkJCQkJCSR2bWxDb21tZW50c0ZpbGUgPSBzaW1wbGV4bWxfbG9hZF9zdHJpbmcoICR0aGlzLT5fZ2V0RnJvbVppcEFyY2hpdmUoJHppcCwgJHJlbFBhdGgpICk7CgkJCQkJCQkJCSR2bWxDb21tZW50c0ZpbGUtPnJlZ2lzdGVyWFBhdGhOYW1lc3BhY2UoJ3YnLCAndXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTp2bWwnKTsKCgkJCQkJCQkJCSRzaGFwZXMgPSAkdm1sQ29tbWVudHNGaWxlLT54cGF0aCgnLy92OnNoYXBlJyk7CgkJCQkJCQkJCWZvcmVhY2ggKCRzaGFwZXMgYXMgJHNoYXBlKSB7CgkJCQkJCQkJCQkkc2hhcGUtPnJlZ2lzdGVyWFBhdGhOYW1lc3BhY2UoJ3YnLCAndXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTp2bWwnKTsKCgkJCQkJCQkJCQlpZiAoaXNzZXQoJHNoYXBlWydzdHlsZSddKSkgewoJICAgIAkJCQkJCQkJCSRzdHlsZSAgICAgICAgPSAoc3RyaW5nKSRzaGFwZVsnc3R5bGUnXTsKCSAgICAJCQkJCQkJCQkkZmlsbENvbG9yICAgID0gc3RydG91cHBlciggc3Vic3RyKCAoc3RyaW5nKSRzaGFwZVsnZmlsbGNvbG9yJ10sIDEgKSApOwoJICAgIAkJCQkJCQkJCSRjb2x1bW4gICAgICAgPSBudWxsOwoJICAgIAkJCQkJCQkJCSRyb3cgICAgICAgICAgPSBudWxsOwoKCSAgICAJCQkJCQkJCQkkY2xpZW50RGF0YSAgID0gJHNoYXBlLT54cGF0aCgnLi8veDpDbGllbnREYXRhJyk7CgkgICAgCQkJCQkJCQkJaWYgKGlzX2FycmF5KCRjbGllbnREYXRhKSAmJiAhZW1wdHkoJGNsaWVudERhdGEpKSB7CgkgICAgICAgIAkJCQkJCQkJCSRjbGllbnREYXRhICAgPSAkY2xpZW50RGF0YVswXTsKCgkgICAgICAgIAkJCQkJCQkJCWlmICggaXNzZXQoJGNsaWVudERhdGFbJ09iamVjdFR5cGUnXSkgJiYgKHN0cmluZykkY2xpZW50RGF0YVsnT2JqZWN0VHlwZSddID09ICdOb3RlJyApIHsKCSAgICAgICAgCQkJCQkJCQkJICAgICR0ZW1wID0gJGNsaWVudERhdGEtPnhwYXRoKCcuLy94OlJvdycpOwoJICAgICAgICAJCQkJCQkJCQkgICAgaWYgKGlzX2FycmF5KCR0ZW1wKSkgJHJvdyA9ICR0ZW1wWzBdOwoKCSAgICAgICAgCQkJCQkJCQkJICAgICR0ZW1wID0gJGNsaWVudERhdGEtPnhwYXRoKCcuLy94OkNvbHVtbicpOwoJICAgICAgICAJCQkJCQkJCQkgICAgaWYgKGlzX2FycmF5KCR0ZW1wKSkgJGNvbHVtbiA9ICR0ZW1wWzBdOwoJICAgICAgICAJCQkJCQkJCQl9CgkgICAgCQkJCQkJCQkJfQoKCSAgICAJCQkJCQkJCQlpZiAoKCRjb2x1bW4gIT09IE5VTEwpICYmICgkcm93ICE9PSBOVUxMKSkgewoJICAgIAkJCQkJCQkJCSAgICAvLyBTZXQgY29tbWVudCBwcm9wZXJ0aWVzCgkgICAgCQkJCQkJCQkJICAgICRjb21tZW50ID0gJGRvY1NoZWV0LT5nZXRDb21tZW50QnlDb2x1bW5BbmRSb3coKHN0cmluZykgJGNvbHVtbiwgJHJvdyArIDEpOwoJICAgIAkJCQkJCQkJCSAgICAkY29tbWVudC0+Z2V0RmlsbENvbG9yKCktPnNldFJHQiggJGZpbGxDb2xvciApOwoKCSAgICAJCQkJCQkJCQkgICAgLy8gUGFyc2Ugc3R5bGUKCSAgICAJCQkJCQkJCQkgICAgJHN0eWxlQXJyYXkgPSBleHBsb2RlKCc7Jywgc3RyX3JlcGxhY2UoJyAnLCAnJywgJHN0eWxlKSk7CgkgICAgCQkJCQkJCQkJICAgIGZvcmVhY2ggKCRzdHlsZUFycmF5IGFzICRzdHlsZVBhaXIpIHsKCSAgICAJCQkJCQkJCQkgICAgICAgICRzdHlsZVBhaXIgPSBleHBsb2RlKCc6JywgJHN0eWxlUGFpcik7CgoJICAgIAkJCQkJCQkJCSAgICAgICAgaWYgKCRzdHlsZVBhaXJbMF0gPT0gJ21hcmdpbi1sZWZ0JykgICAgICRjb21tZW50LT5zZXRNYXJnaW5MZWZ0KCRzdHlsZVBhaXJbMV0pOwoJICAgIAkJCQkJCQkJCSAgICAgICAgaWYgKCRzdHlsZVBhaXJbMF0gPT0gJ21hcmdpbi10b3AnKSAgICAgICRjb21tZW50LT5zZXRNYXJnaW5Ub3AoJHN0eWxlUGFpclsxXSk7CgkgICAgCQkJCQkJCQkJICAgICAgICBpZiAoJHN0eWxlUGFpclswXSA9PSAnd2lkdGgnKSAgICAgICAgICAgJGNvbW1lbnQtPnNldFdpZHRoKCRzdHlsZVBhaXJbMV0pOwoJICAgIAkJCQkJCQkJCSAgICAgICAgaWYgKCRzdHlsZVBhaXJbMF0gPT0gJ2hlaWdodCcpICAgICAgICAgICRjb21tZW50LT5zZXRIZWlnaHQoJHN0eWxlUGFpclsxXSk7CgkgICAgCQkJCQkJCQkJICAgICAgICBpZiAoJHN0eWxlUGFpclswXSA9PSAndmlzaWJpbGl0eScpICAgICAgJGNvbW1lbnQtPnNldFZpc2libGUoICRzdHlsZVBhaXJbMV0gPT0gJ3Zpc2libGUnICk7CgoJICAgIAkJCQkJCQkJCSAgICB9CgkgICAgCQkJCQkJCQkJfQoJCQkJCQkJCQkJfQoJCQkJCQkJCQl9CgkJCQkJCQkJfQoKCQkJCQkJCQkvLyBIZWFkZXIvZm9vdGVyIGltYWdlcwoJCQkJCQkJCWlmICgkeG1sU2hlZXQgJiYgJHhtbFNoZWV0LT5sZWdhY3lEcmF3aW5nSEYgJiYgISR0aGlzLT5fcmVhZERhdGFPbmx5KSB7CgkJCQkJCQkJCWlmICgkemlwLT5sb2NhdGVOYW1lKGRpcm5hbWUoIiRkaXIvJGZpbGVXb3Jrc2hlZXQiKSAuICIvX3JlbHMvIiAuIGJhc2VuYW1lKCRmaWxlV29ya3NoZWV0KSAuICIucmVscyIpKSB7CgkJCQkJCQkJCQkkcmVsc1dvcmtzaGVldCA9IHNpbXBsZXhtbF9sb2FkX3N0cmluZygkdGhpcy0+X2dldEZyb21aaXBBcmNoaXZlKCR6aXAsICBkaXJuYW1lKCIkZGlyLyRmaWxlV29ya3NoZWV0IikgLiAiL19yZWxzLyIgLiBiYXNlbmFtZSgkZmlsZVdvcmtzaGVldCkgLiAiLnJlbHMiKSApOyAvL34gaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL3BhY2thZ2UvMjAwNi9yZWxhdGlvbnNoaXBzIik7CgkJCQkJCQkJCQkkdm1sUmVsYXRpb25zaGlwID0gJyc7CgoJCQkJCQkJCQkJZm9yZWFjaCAoJHJlbHNXb3Jrc2hlZXQtPlJlbGF0aW9uc2hpcCBhcyAkZWxlKSB7CgkJCQkJCQkJCQkJaWYgKCRlbGVbIlR5cGUiXSA9PSAiaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL29mZmljZURvY3VtZW50LzIwMDYvcmVsYXRpb25zaGlwcy92bWxEcmF3aW5nIikgewoJCQkJCQkJCQkJCQkkdm1sUmVsYXRpb25zaGlwID0gc2VsZjo6ZGlyX2FkZCgiJGRpci8kZmlsZVdvcmtzaGVldCIsICRlbGVbIlRhcmdldCJdKTsKCQkJCQkJCQkJCQl9CgkJCQkJCQkJCQl9CgoJCQkJCQkJCQkJaWYgKCR2bWxSZWxhdGlvbnNoaXAgIT0gJycpIHsKCQkJCQkJCQkJCQkvLyBGZXRjaCBsaW5rZWQgaW1hZ2VzCgkJCQkJCQkJCQkJJHJlbHNWTUwgPSBzaW1wbGV4bWxfbG9hZF9zdHJpbmcoJHRoaXMtPl9nZXRGcm9tWmlwQXJjaGl2ZSgkemlwLCAgZGlybmFtZSgkdm1sUmVsYXRpb25zaGlwKSAuICcvX3JlbHMvJyAuIGJhc2VuYW1lKCR2bWxSZWxhdGlvbnNoaXApIC4gJy5yZWxzJyApKTsgLy9+IGh0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9wYWNrYWdlLzIwMDYvcmVsYXRpb25zaGlwcyIpOwoJCQkJCQkJCQkJCSRkcmF3aW5ncyA9IGFycmF5KCk7CgkJCQkJCQkJCQkJZm9yZWFjaCAoJHJlbHNWTUwtPlJlbGF0aW9uc2hpcCBhcyAkZWxlKSB7CgkJCQkJCQkJCQkJCWlmICgkZWxlWyJUeXBlIl0gPT0gImh0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9vZmZpY2VEb2N1bWVudC8yMDA2L3JlbGF0aW9uc2hpcHMvaW1hZ2UiKSB7CgkJCQkJCQkJCQkJCQkkZHJhd2luZ3NbKHN0cmluZykgJGVsZVsiSWQiXV0gPSBzZWxmOjpkaXJfYWRkKCR2bWxSZWxhdGlvbnNoaXAsICRlbGVbIlRhcmdldCJdKTsKCQkJCQkJCQkJCQkJfQoJCQkJCQkJCQkJCX0KCgkJCQkJCQkJCQkJLy8gRmV0Y2ggVk1MIGRvY3VtZW50CgkJCQkJCQkJCQkJJHZtbERyYXdpbmcgPSBzaW1wbGV4bWxfbG9hZF9zdHJpbmcoJHRoaXMtPl9nZXRGcm9tWmlwQXJjaGl2ZSgkemlwLCAkdm1sUmVsYXRpb25zaGlwKSk7CgkJCQkJCQkJCQkJJHZtbERyYXdpbmctPnJlZ2lzdGVyWFBhdGhOYW1lc3BhY2UoJ3YnLCAndXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTp2bWwnKTsKCgkJCQkJCQkJCQkJJGhmSW1hZ2VzID0gYXJyYXkoKTsKCgkJCQkJCQkJCQkJJHNoYXBlcyA9ICR2bWxEcmF3aW5nLT54cGF0aCgnLy92OnNoYXBlJyk7CgkJCQkJCQkJCQkJZm9yZWFjaCAoJHNoYXBlcyBhcyAkc2hhcGUpIHsKCQkJCQkJCQkJCQkJJHNoYXBlLT5yZWdpc3RlclhQYXRoTmFtZXNwYWNlKCd2JywgJ3VybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206dm1sJyk7CgkJCQkJCQkJCQkJCSRpbWFnZURhdGEgPSAkc2hhcGUtPnhwYXRoKCcvL3Y6aW1hZ2VkYXRhJyk7CgkJCQkJCQkJCQkJCSRpbWFnZURhdGEgPSAkaW1hZ2VEYXRhWzBdOwoKCQkJCQkJCQkJCQkJJGltYWdlRGF0YSA9ICRpbWFnZURhdGEtPmF0dHJpYnV0ZXMoJ3VybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZScpOwoJCQkJCQkJCQkJCQkkc3R5bGUgPSBzZWxmOjp0b0NTU0FycmF5KCAoc3RyaW5nKSRzaGFwZVsnc3R5bGUnXSApOwoKCQkJCQkJCQkJCQkJJGhmSW1hZ2VzWyAoc3RyaW5nKSRzaGFwZVsnaWQnXSBdID0gbmV3IFBIUEV4Y2VsX1dvcmtzaGVldF9IZWFkZXJGb290ZXJEcmF3aW5nKCk7CgkJCQkJCQkJCQkJCWlmIChpc3NldCgkaW1hZ2VEYXRhWyd0aXRsZSddKSkgewoJCQkJCQkJCQkJCQkJJGhmSW1hZ2VzWyAoc3RyaW5nKSRzaGFwZVsnaWQnXSBdLT5zZXROYW1lKCAoc3RyaW5nKSRpbWFnZURhdGFbJ3RpdGxlJ10gKTsKCQkJCQkJCQkJCQkJfQoKCQkJCQkJCQkJCQkJJGhmSW1hZ2VzWyAoc3RyaW5nKSRzaGFwZVsnaWQnXSBdLT5zZXRQYXRoKCJ6aXA6Ly8kcEZpbGVuYW1lIyIgLiAkZHJhd2luZ3NbKHN0cmluZykkaW1hZ2VEYXRhWydyZWxpZCddXSwgZmFsc2UpOwoJCQkJCQkJCQkJCQkkaGZJbWFnZXNbIChzdHJpbmcpJHNoYXBlWydpZCddIF0tPnNldFJlc2l6ZVByb3BvcnRpb25hbChmYWxzZSk7CgkJCQkJCQkJCQkJCSRoZkltYWdlc1sgKHN0cmluZykkc2hhcGVbJ2lkJ10gXS0+c2V0V2lkdGgoJHN0eWxlWyd3aWR0aCddKTsKCQkJCQkJCQkJCQkJJGhmSW1hZ2VzWyAoc3RyaW5nKSRzaGFwZVsnaWQnXSBdLT5zZXRIZWlnaHQoJHN0eWxlWydoZWlnaHQnXSk7CgkJCQkJCQkJCQkJCSRoZkltYWdlc1sgKHN0cmluZykkc2hhcGVbJ2lkJ10gXS0+c2V0T2Zmc2V0WCgkc3R5bGVbJ21hcmdpbi1sZWZ0J10pOwoJCQkJCQkJCQkJCQkkaGZJbWFnZXNbIChzdHJpbmcpJHNoYXBlWydpZCddIF0tPnNldE9mZnNldFkoJHN0eWxlWydtYXJnaW4tdG9wJ10pOwoJCQkJCQkJCQkJCQkkaGZJbWFnZXNbIChzdHJpbmcpJHNoYXBlWydpZCddIF0tPnNldFJlc2l6ZVByb3BvcnRpb25hbCh0cnVlKTsKCQkJCQkJCQkJCQl9CgoJCQkJCQkJCQkJCSRkb2NTaGVldC0+Z2V0SGVhZGVyRm9vdGVyKCktPnNldEltYWdlcygkaGZJbWFnZXMpOwoJCQkJCQkJCQkJfQoJCQkJCQkJCQl9CgkJCQkJCQkJfQoKCQkJCQkJCX0KCgkvLyBUT0RPOiBNYWtlIHN1cmUgZHJhd2luZ3MgYW5kIGdyYXBoIGFyZSBsb2FkZWQgZGlmZmVyZW50bHkhCgkJCQkJCQlpZiAoJHppcC0+bG9jYXRlTmFtZShkaXJuYW1lKCIkZGlyLyRmaWxlV29ya3NoZWV0IikgLiAiL19yZWxzLyIgLiBiYXNlbmFtZSgkZmlsZVdvcmtzaGVldCkgLiAiLnJlbHMiKSkgewoJCQkJCQkJCSRyZWxzV29ya3NoZWV0ID0gc2ltcGxleG1sX2xvYWRfc3RyaW5nKCR0aGlzLT5fZ2V0RnJvbVppcEFyY2hpdmUoJHppcCwgIGRpcm5hbWUoIiRkaXIvJGZpbGVXb3Jrc2hlZXQiKSAuICIvX3JlbHMvIiAuIGJhc2VuYW1lKCRmaWxlV29ya3NoZWV0KSAuICIucmVscyIpICk7IC8vfiBodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvcGFja2FnZS8yMDA2L3JlbGF0aW9uc2hpcHMiKTsKCQkJCQkJCQkkZHJhd2luZ3MgPSBhcnJheSgpOwoJCQkJCQkJCWZvcmVhY2ggKCRyZWxzV29ya3NoZWV0LT5SZWxhdGlvbnNoaXAgYXMgJGVsZSkgewoJCQkJCQkJCQlpZiAoJGVsZVsiVHlwZSJdID09ICJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvb2ZmaWNlRG9jdW1lbnQvMjAwNi9yZWxhdGlvbnNoaXBzL2RyYXdpbmciKSB7CgkJCQkJCQkJCQkkZHJhd2luZ3NbKHN0cmluZykgJGVsZVsiSWQiXV0gPSBzZWxmOjpkaXJfYWRkKCIkZGlyLyRmaWxlV29ya3NoZWV0IiwgJGVsZVsiVGFyZ2V0Il0pOwoJCQkJCQkJCQl9CgkJCQkJCQkJfQoJCQkJCQkJCWlmICgkeG1sU2hlZXQtPmRyYXdpbmcgJiYgISR0aGlzLT5fcmVhZERhdGFPbmx5KSB7CgkJCQkJCQkJCWZvcmVhY2ggKCR4bWxTaGVldC0+ZHJhd2luZyBhcyAkZHJhd2luZykgewoJCQkJCQkJCQkJJGZpbGVEcmF3aW5nID0gJGRyYXdpbmdzWyhzdHJpbmcpIHNlbGY6OmFycmF5X2l0ZW0oJGRyYXdpbmctPmF0dHJpYnV0ZXMoImh0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9vZmZpY2VEb2N1bWVudC8yMDA2L3JlbGF0aW9uc2hpcHMiKSwgImlkIildOwoJCQkJCQkJCQkJJHJlbHNEcmF3aW5nID0gc2ltcGxleG1sX2xvYWRfc3RyaW5nKCR0aGlzLT5fZ2V0RnJvbVppcEFyY2hpdmUoJHppcCwgIGRpcm5hbWUoJGZpbGVEcmF3aW5nKSAuICIvX3JlbHMvIiAuIGJhc2VuYW1lKCRmaWxlRHJhd2luZykgLiAiLnJlbHMiKSApOyAvL34gaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL3BhY2thZ2UvMjAwNi9yZWxhdGlvbnNoaXBzIik7CgkJCQkJCQkJCQkkaW1hZ2VzID0gYXJyYXkoKTsKCgkJCQkJCQkJCQlpZiAoJHJlbHNEcmF3aW5nICYmICRyZWxzRHJhd2luZy0+UmVsYXRpb25zaGlwKSB7CgkJCQkJCQkJCQkJZm9yZWFjaCAoJHJlbHNEcmF3aW5nLT5SZWxhdGlvbnNoaXAgYXMgJGVsZSkgewoJCQkJCQkJCQkJCQlpZiAoJGVsZVsiVHlwZSJdID09ICJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvb2ZmaWNlRG9jdW1lbnQvMjAwNi9yZWxhdGlvbnNoaXBzL2ltYWdlIikgewoJCQkJCQkJCQkJCQkJJGltYWdlc1soc3RyaW5nKSAkZWxlWyJJZCJdXSA9IHNlbGY6OmRpcl9hZGQoJGZpbGVEcmF3aW5nLCAkZWxlWyJUYXJnZXQiXSk7CgkJCQkJCQkJCQkJCX0gZWxzZWlmICgkZWxlWyJUeXBlIl0gPT0gImh0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9vZmZpY2VEb2N1bWVudC8yMDA2L3JlbGF0aW9uc2hpcHMvY2hhcnQiKSB7CgkJCQkJCQkJCQkJCQlpZiAoJHRoaXMtPl9pbmNsdWRlQ2hhcnRzKSB7DQoJCQkJCQkJCQkJCQkJCSRjaGFydHNbc2VsZjo6ZGlyX2FkZCgkZmlsZURyYXdpbmcsICRlbGVbIlRhcmdldCJdKV0gPSBhcnJheSgnaWQnCQk9PiAoc3RyaW5nKSAkZWxlWyJJZCJdLAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSAnc2hlZXQnCT0+ICRkb2NTaGVldC0+Z2V0VGl0bGUoKQoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSk7CgkJCQkJCQkJCQkJCQl9CgkJCQkJCQkJCQkJCX0NCgkJCQkJCQkJCQkJfQoJCQkJCQkJCQkJfQoJCQkJCQkJCQkJJHhtbERyYXdpbmcgPSBzaW1wbGV4bWxfbG9hZF9zdHJpbmcoJHRoaXMtPl9nZXRGcm9tWmlwQXJjaGl2ZSgkemlwLCAkZmlsZURyYXdpbmcpKS0+Y2hpbGRyZW4oImh0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9kcmF3aW5nbWwvMjAwNi9zcHJlYWRzaGVldERyYXdpbmciKTsKCgkJCQkJCQkJCQlpZiAoJHhtbERyYXdpbmctPm9uZUNlbGxBbmNob3IpIHsKCQkJCQkJCQkJCQlmb3JlYWNoICgkeG1sRHJhd2luZy0+b25lQ2VsbEFuY2hvciBhcyAkb25lQ2VsbEFuY2hvcikgewoJCQkJCQkJCQkJCQlpZiAoJG9uZUNlbGxBbmNob3ItPnBpYy0+YmxpcEZpbGwpIHsKCQkJCQkJCQkJCQkJCSRibGlwID0gJG9uZUNlbGxBbmNob3ItPnBpYy0+YmxpcEZpbGwtPmNoaWxkcmVuKCJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvZHJhd2luZ21sLzIwMDYvbWFpbiIpLT5ibGlwOwoJCQkJCQkJCQkJCQkJJHhmcm0gPSAkb25lQ2VsbEFuY2hvci0+cGljLT5zcFByLT5jaGlsZHJlbigiaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL2RyYXdpbmdtbC8yMDA2L21haW4iKS0+eGZybTsKCQkJCQkJCQkJCQkJCSRvdXRlclNoZHcgPSAkb25lQ2VsbEFuY2hvci0+cGljLT5zcFByLT5jaGlsZHJlbigiaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL2RyYXdpbmdtbC8yMDA2L21haW4iKS0+ZWZmZWN0THN0LT5vdXRlclNoZHc7CgkJCQkJCQkJCQkJCQkkb2JqRHJhd2luZyA9IG5ldyBQSFBFeGNlbF9Xb3Jrc2hlZXRfRHJhd2luZzsKCQkJCQkJCQkJCQkJCSRvYmpEcmF3aW5nLT5zZXROYW1lKChzdHJpbmcpIHNlbGY6OmFycmF5X2l0ZW0oJG9uZUNlbGxBbmNob3ItPnBpYy0+bnZQaWNQci0+Y052UHItPmF0dHJpYnV0ZXMoKSwgIm5hbWUiKSk7CgkJCQkJCQkJCQkJCQkkb2JqRHJhd2luZy0+c2V0RGVzY3JpcHRpb24oKHN0cmluZykgc2VsZjo6YXJyYXlfaXRlbSgkb25lQ2VsbEFuY2hvci0+cGljLT5udlBpY1ByLT5jTnZQci0+YXR0cmlidXRlcygpLCAiZGVzY3IiKSk7CgkJCQkJCQkJCQkJCQkkb2JqRHJhd2luZy0+c2V0UGF0aCgiemlwOi8vJHBGaWxlbmFtZSMiIC4gJGltYWdlc1soc3RyaW5nKSBzZWxmOjphcnJheV9pdGVtKCRibGlwLT5hdHRyaWJ1dGVzKCJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvb2ZmaWNlRG9jdW1lbnQvMjAwNi9yZWxhdGlvbnNoaXBzIiksICJlbWJlZCIpXSwgZmFsc2UpOwoJCQkJCQkJCQkJCQkJJG9iakRyYXdpbmctPnNldENvb3JkaW5hdGVzKFBIUEV4Y2VsX0NlbGw6OnN0cmluZ0Zyb21Db2x1bW5JbmRleCgoc3RyaW5nKSAkb25lQ2VsbEFuY2hvci0+ZnJvbS0+Y29sKSAuICgkb25lQ2VsbEFuY2hvci0+ZnJvbS0+cm93ICsgMSkpOwoJCQkJCQkJCQkJCQkJJG9iakRyYXdpbmctPnNldE9mZnNldFgoUEhQRXhjZWxfU2hhcmVkX0RyYXdpbmc6OkVNVVRvUGl4ZWxzKCRvbmVDZWxsQW5jaG9yLT5mcm9tLT5jb2xPZmYpKTsKCQkJCQkJCQkJCQkJCSRvYmpEcmF3aW5nLT5zZXRPZmZzZXRZKFBIUEV4Y2VsX1NoYXJlZF9EcmF3aW5nOjpFTVVUb1BpeGVscygkb25lQ2VsbEFuY2hvci0+ZnJvbS0+cm93T2ZmKSk7CgkJCQkJCQkJCQkJCQkkb2JqRHJhd2luZy0+c2V0UmVzaXplUHJvcG9ydGlvbmFsKGZhbHNlKTsKCQkJCQkJCQkJCQkJCSRvYmpEcmF3aW5nLT5zZXRXaWR0aChQSFBFeGNlbF9TaGFyZWRfRHJhd2luZzo6RU1VVG9QaXhlbHMoc2VsZjo6YXJyYXlfaXRlbSgkb25lQ2VsbEFuY2hvci0+ZXh0LT5hdHRyaWJ1dGVzKCksICJjeCIpKSk7CgkJCQkJCQkJCQkJCQkkb2JqRHJhd2luZy0+c2V0SGVpZ2h0KFBIUEV4Y2VsX1NoYXJlZF9EcmF3aW5nOjpFTVVUb1BpeGVscyhzZWxmOjphcnJheV9pdGVtKCRvbmVDZWxsQW5jaG9yLT5leHQtPmF0dHJpYnV0ZXMoKSwgImN5IikpKTsKCQkJCQkJCQkJCQkJCWlmICgkeGZybSkgewoJCQkJCQkJCQkJCQkJCSRvYmpEcmF3aW5nLT5zZXRSb3RhdGlvbihQSFBFeGNlbF9TaGFyZWRfRHJhd2luZzo6YW5nbGVUb0RlZ3JlZXMoc2VsZjo6YXJyYXlfaXRlbSgkeGZybS0+YXR0cmlidXRlcygpLCAicm90IikpKTsKCQkJCQkJCQkJCQkJCX0KCQkJCQkJCQkJCQkJCWlmICgkb3V0ZXJTaGR3KSB7CgkJCQkJCQkJCQkJCQkJJHNoYWRvdyA9ICRvYmpEcmF3aW5nLT5nZXRTaGFkb3coKTsKCQkJCQkJCQkJCQkJCQkkc2hhZG93LT5zZXRWaXNpYmxlKHRydWUpOwoJCQkJCQkJCQkJCQkJCSRzaGFkb3ctPnNldEJsdXJSYWRpdXMoUEhQRXhjZWxfU2hhcmVkX0RyYXdpbmc6OkVNVVRvcGl4ZWxzKHNlbGY6OmFycmF5X2l0ZW0oJG91dGVyU2hkdy0+YXR0cmlidXRlcygpLCAiYmx1clJhZCIpKSk7CgkJCQkJCQkJCQkJCQkJJHNoYWRvdy0+c2V0RGlzdGFuY2UoUEhQRXhjZWxfU2hhcmVkX0RyYXdpbmc6OkVNVVRvcGl4ZWxzKHNlbGY6OmFycmF5X2l0ZW0oJG91dGVyU2hkdy0+YXR0cmlidXRlcygpLCAiZGlzdCIpKSk7CgkJCQkJCQkJCQkJCQkJJHNoYWRvdy0+c2V0RGlyZWN0aW9uKFBIUEV4Y2VsX1NoYXJlZF9EcmF3aW5nOjphbmdsZVRvRGVncmVlcyhzZWxmOjphcnJheV9pdGVtKCRvdXRlclNoZHctPmF0dHJpYnV0ZXMoKSwgImRpciIpKSk7CgkJCQkJCQkJCQkJCQkJJHNoYWRvdy0+c2V0QWxpZ25tZW50KChzdHJpbmcpIHNlbGY6OmFycmF5X2l0ZW0oJG91dGVyU2hkdy0+YXR0cmlidXRlcygpLCAiYWxnbiIpKTsKCQkJCQkJCQkJCQkJCQkkc2hhZG93LT5nZXRDb2xvcigpLT5zZXRSR0Ioc2VsZjo6YXJyYXlfaXRlbSgkb3V0ZXJTaGR3LT5zcmdiQ2xyLT5hdHRyaWJ1dGVzKCksICJ2YWwiKSk7CgkJCQkJCQkJCQkJCQkJJHNoYWRvdy0+c2V0QWxwaGEoc2VsZjo6YXJyYXlfaXRlbSgkb3V0ZXJTaGR3LT5zcmdiQ2xyLT5hbHBoYS0+YXR0cmlidXRlcygpLCAidmFsIikgLyAxMDAwKTsKCQkJCQkJCQkJCQkJCX0KCQkJCQkJCQkJCQkJCSRvYmpEcmF3aW5nLT5zZXRXb3Jrc2hlZXQoJGRvY1NoZWV0KTsKCQkJCQkJCQkJCQkJfSBlbHNlIHsKCQkJCQkJCQkJCQkJCSRjb29yZGluYXRlcwk9IFBIUEV4Y2VsX0NlbGw6OnN0cmluZ0Zyb21Db2x1bW5JbmRleCgoc3RyaW5nKSAkb25lQ2VsbEFuY2hvci0+ZnJvbS0+Y29sKSAuICgkb25lQ2VsbEFuY2hvci0+ZnJvbS0+cm93ICsgMSk7CgkJCQkJCQkJCQkJCQkkb2Zmc2V0WAkJPSBQSFBFeGNlbF9TaGFyZWRfRHJhd2luZzo6RU1VVG9QaXhlbHMoJG9uZUNlbGxBbmNob3ItPmZyb20tPmNvbE9mZik7CgkJCQkJCQkJCQkJCQkkb2Zmc2V0WQkJPSBQSFBFeGNlbF9TaGFyZWRfRHJhd2luZzo6RU1VVG9QaXhlbHMoJG9uZUNlbGxBbmNob3ItPmZyb20tPnJvd09mZik7CgkJCQkJCQkJCQkJCQkkd2lkdGgJCQk9IFBIUEV4Y2VsX1NoYXJlZF9EcmF3aW5nOjpFTVVUb1BpeGVscyhzZWxmOjphcnJheV9pdGVtKCRvbmVDZWxsQW5jaG9yLT5leHQtPmF0dHJpYnV0ZXMoKSwgImN4IikpOwoJCQkJCQkJCQkJCQkJJGhlaWdodAkJCT0gUEhQRXhjZWxfU2hhcmVkX0RyYXdpbmc6OkVNVVRvUGl4ZWxzKHNlbGY6OmFycmF5X2l0ZW0oJG9uZUNlbGxBbmNob3ItPmV4dC0+YXR0cmlidXRlcygpLCAiY3kiKSk7CgkJCQkJCQkJCQkJCX0KCQkJCQkJCQkJCQl9CgkJCQkJCQkJCQl9CgkJCQkJCQkJCQlpZiAoJHhtbERyYXdpbmctPnR3b0NlbGxBbmNob3IpIHsKCQkJCQkJCQkJCQlmb3JlYWNoICgkeG1sRHJhd2luZy0+dHdvQ2VsbEFuY2hvciBhcyAkdHdvQ2VsbEFuY2hvcikgewoJCQkJCQkJCQkJCQlpZiAoJHR3b0NlbGxBbmNob3ItPnBpYy0+YmxpcEZpbGwpIHsKCQkJCQkJCQkJCQkJCSRibGlwID0gJHR3b0NlbGxBbmNob3ItPnBpYy0+YmxpcEZpbGwtPmNoaWxkcmVuKCJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvZHJhd2luZ21sLzIwMDYvbWFpbiIpLT5ibGlwOwoJCQkJCQkJCQkJCQkJJHhmcm0gPSAkdHdvQ2VsbEFuY2hvci0+cGljLT5zcFByLT5jaGlsZHJlbigiaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL2RyYXdpbmdtbC8yMDA2L21haW4iKS0+eGZybTsKCQkJCQkJCQkJCQkJCSRvdXRlclNoZHcgPSAkdHdvQ2VsbEFuY2hvci0+cGljLT5zcFByLT5jaGlsZHJlbigiaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL2RyYXdpbmdtbC8yMDA2L21haW4iKS0+ZWZmZWN0THN0LT5vdXRlclNoZHc7CgkJCQkJCQkJCQkJCQkkb2JqRHJhd2luZyA9IG5ldyBQSFBFeGNlbF9Xb3Jrc2hlZXRfRHJhd2luZzsKCQkJCQkJCQkJCQkJCSRvYmpEcmF3aW5nLT5zZXROYW1lKChzdHJpbmcpIHNlbGY6OmFycmF5X2l0ZW0oJHR3b0NlbGxBbmNob3ItPnBpYy0+bnZQaWNQci0+Y052UHItPmF0dHJpYnV0ZXMoKSwgIm5hbWUiKSk7CgkJCQkJCQkJCQkJCQkkb2JqRHJhd2luZy0+c2V0RGVzY3JpcHRpb24oKHN0cmluZykgc2VsZjo6YXJyYXlfaXRlbSgkdHdvQ2VsbEFuY2hvci0+cGljLT5udlBpY1ByLT5jTnZQci0+YXR0cmlidXRlcygpLCAiZGVzY3IiKSk7CgkJCQkJCQkJCQkJCQkkb2JqRHJhd2luZy0+c2V0UGF0aCgiemlwOi8vJHBGaWxlbmFtZSMiIC4gJGltYWdlc1soc3RyaW5nKSBzZWxmOjphcnJheV9pdGVtKCRibGlwLT5hdHRyaWJ1dGVzKCJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvb2ZmaWNlRG9jdW1lbnQvMjAwNi9yZWxhdGlvbnNoaXBzIiksICJlbWJlZCIpXSwgZmFsc2UpOwoJCQkJCQkJCQkJCQkJJG9iakRyYXdpbmctPnNldENvb3JkaW5hdGVzKFBIUEV4Y2VsX0NlbGw6OnN0cmluZ0Zyb21Db2x1bW5JbmRleCgoc3RyaW5nKSAkdHdvQ2VsbEFuY2hvci0+ZnJvbS0+Y29sKSAuICgkdHdvQ2VsbEFuY2hvci0+ZnJvbS0+cm93ICsgMSkpOwoJCQkJCQkJCQkJCQkJJG9iakRyYXdpbmctPnNldE9mZnNldFgoUEhQRXhjZWxfU2hhcmVkX0RyYXdpbmc6OkVNVVRvUGl4ZWxzKCR0d29DZWxsQW5jaG9yLT5mcm9tLT5jb2xPZmYpKTsKCQkJCQkJCQkJCQkJCSRvYmpEcmF3aW5nLT5zZXRPZmZzZXRZKFBIUEV4Y2VsX1NoYXJlZF9EcmF3aW5nOjpFTVVUb1BpeGVscygkdHdvQ2VsbEFuY2hvci0+ZnJvbS0+cm93T2ZmKSk7CgkJCQkJCQkJCQkJCQkkb2JqRHJhd2luZy0+c2V0UmVzaXplUHJvcG9ydGlvbmFsKGZhbHNlKTsKCgkJCQkJCQkJCQkJCQkkb2JqRHJhd2luZy0+c2V0V2lkdGgoUEhQRXhjZWxfU2hhcmVkX0RyYXdpbmc6OkVNVVRvUGl4ZWxzKHNlbGY6OmFycmF5X2l0ZW0oJHhmcm0tPmV4dC0+YXR0cmlidXRlcygpLCAiY3giKSkpOwoJCQkJCQkJCQkJCQkJJG9iakRyYXdpbmctPnNldEhlaWdodChQSFBFeGNlbF9TaGFyZWRfRHJhd2luZzo6RU1VVG9QaXhlbHMoc2VsZjo6YXJyYXlfaXRlbSgkeGZybS0+ZXh0LT5hdHRyaWJ1dGVzKCksICJjeSIpKSk7CgoJCQkJCQkJCQkJCQkJaWYgKCR4ZnJtKSB7CgkJCQkJCQkJCQkJCQkJJG9iakRyYXdpbmctPnNldFJvdGF0aW9uKFBIUEV4Y2VsX1NoYXJlZF9EcmF3aW5nOjphbmdsZVRvRGVncmVlcyhzZWxmOjphcnJheV9pdGVtKCR4ZnJtLT5hdHRyaWJ1dGVzKCksICJyb3QiKSkpOwoJCQkJCQkJCQkJCQkJfQoJCQkJCQkJCQkJCQkJaWYgKCRvdXRlclNoZHcpIHsKCQkJCQkJCQkJCQkJCQkkc2hhZG93ID0gJG9iakRyYXdpbmctPmdldFNoYWRvdygpOwoJCQkJCQkJCQkJCQkJCSRzaGFkb3ctPnNldFZpc2libGUodHJ1ZSk7CgkJCQkJCQkJCQkJCQkJJHNoYWRvdy0+c2V0Qmx1clJhZGl1cyhQSFBFeGNlbF9TaGFyZWRfRHJhd2luZzo6RU1VVG9waXhlbHMoc2VsZjo6YXJyYXlfaXRlbSgkb3V0ZXJTaGR3LT5hdHRyaWJ1dGVzKCksICJibHVyUmFkIikpKTsKCQkJCQkJCQkJCQkJCQkkc2hhZG93LT5zZXREaXN0YW5jZShQSFBFeGNlbF9TaGFyZWRfRHJhd2luZzo6RU1VVG9waXhlbHMoc2VsZjo6YXJyYXlfaXRlbSgkb3V0ZXJTaGR3LT5hdHRyaWJ1dGVzKCksICJkaXN0IikpKTsKCQkJCQkJCQkJCQkJCQkkc2hhZG93LT5zZXREaXJlY3Rpb24oUEhQRXhjZWxfU2hhcmVkX0RyYXdpbmc6OmFuZ2xlVG9EZWdyZWVzKHNlbGY6OmFycmF5X2l0ZW0oJG91dGVyU2hkdy0+YXR0cmlidXRlcygpLCAiZGlyIikpKTsKCQkJCQkJCQkJCQkJCQkkc2hhZG93LT5zZXRBbGlnbm1lbnQoKHN0cmluZykgc2VsZjo6YXJyYXlfaXRlbSgkb3V0ZXJTaGR3LT5hdHRyaWJ1dGVzKCksICJhbGduIikpOwoJCQkJCQkJCQkJCQkJCSRzaGFkb3ctPmdldENvbG9yKCktPnNldFJHQihzZWxmOjphcnJheV9pdGVtKCRvdXRlclNoZHctPnNyZ2JDbHItPmF0dHJpYnV0ZXMoKSwgInZhbCIpKTsKCQkJCQkJCQkJCQkJCQkkc2hhZG93LT5zZXRBbHBoYShzZWxmOjphcnJheV9pdGVtKCRvdXRlclNoZHctPnNyZ2JDbHItPmFscGhhLT5hdHRyaWJ1dGVzKCksICJ2YWwiKSAvIDEwMDApOwoJCQkJCQkJCQkJCQkJfQoJCQkJCQkJCQkJCQkJJG9iakRyYXdpbmctPnNldFdvcmtzaGVldCgkZG9jU2hlZXQpOwoJCQkJCQkJCQkJCQl9IGVsc2VpZigkdGhpcy0+X2luY2x1ZGVDaGFydHMpIHsNCgkJCQkJCQkJCQkJCQkkZnJvbUNvb3JkaW5hdGUJPSBQSFBFeGNlbF9DZWxsOjpzdHJpbmdGcm9tQ29sdW1uSW5kZXgoKHN0cmluZykgJHR3b0NlbGxBbmNob3ItPmZyb20tPmNvbCkgLiAoJHR3b0NlbGxBbmNob3ItPmZyb20tPnJvdyArIDEpOwoJCQkJCQkJCQkJCQkJJGZyb21PZmZzZXRYCT0gUEhQRXhjZWxfU2hhcmVkX0RyYXdpbmc6OkVNVVRvUGl4ZWxzKCR0d29DZWxsQW5jaG9yLT5mcm9tLT5jb2xPZmYpOwoJCQkJCQkJCQkJCQkJJGZyb21PZmZzZXRZCT0gUEhQRXhjZWxfU2hhcmVkX0RyYXdpbmc6OkVNVVRvUGl4ZWxzKCR0d29DZWxsQW5jaG9yLT5mcm9tLT5yb3dPZmYpOwoJCQkJCQkJCQkJCQkJJHRvQ29vcmRpbmF0ZQk9IFBIUEV4Y2VsX0NlbGw6OnN0cmluZ0Zyb21Db2x1bW5JbmRleCgoc3RyaW5nKSAkdHdvQ2VsbEFuY2hvci0+dG8tPmNvbCkgLiAoJHR3b0NlbGxBbmNob3ItPnRvLT5yb3cgKyAxKTsKCQkJCQkJCQkJCQkJCSR0b09mZnNldFgJCT0gUEhQRXhjZWxfU2hhcmVkX0RyYXdpbmc6OkVNVVRvUGl4ZWxzKCR0d29DZWxsQW5jaG9yLT50by0+Y29sT2ZmKTsKCQkJCQkJCQkJCQkJCSR0b09mZnNldFkJCT0gUEhQRXhjZWxfU2hhcmVkX0RyYXdpbmc6OkVNVVRvUGl4ZWxzKCR0d29DZWxsQW5jaG9yLT50by0+cm93T2ZmKTsKCQkJCQkJCQkJCQkJCSRncmFwaGljCQk9ICR0d29DZWxsQW5jaG9yLT5ncmFwaGljRnJhbWUtPmNoaWxkcmVuKCJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvZHJhd2luZ21sLzIwMDYvbWFpbiIpLT5ncmFwaGljOwoJCQkJCQkJCQkJCQkJJGNoYXJ0UmVmCQk9ICRncmFwaGljLT5ncmFwaGljRGF0YS0+Y2hpbGRyZW4oImh0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9kcmF3aW5nbWwvMjAwNi9jaGFydCIpLT5jaGFydDsKCQkJCQkJCQkJCQkJCSR0aGlzQ2hhcnQJCT0gKHN0cmluZykgJGNoYXJ0UmVmLT5hdHRyaWJ1dGVzKCJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvb2ZmaWNlRG9jdW1lbnQvMjAwNi9yZWxhdGlvbnNoaXBzIik7CgoJCQkJCQkJCQkJCQkJJGNoYXJ0RGV0YWlsc1skZG9jU2hlZXQtPmdldFRpdGxlKCkuJyEnLiR0aGlzQ2hhcnRdID0KCQkJCQkJCQkJCQkJCQkJYXJyYXkoCSdmcm9tQ29vcmRpbmF0ZScJPT4gJGZyb21Db29yZGluYXRlLAoJCQkJCQkJCQkJCQkJCQkJCSdmcm9tT2Zmc2V0WCcJCT0+ICRmcm9tT2Zmc2V0WCwKCQkJCQkJCQkJCQkJCQkJCQknZnJvbU9mZnNldFknCQk9PiAkZnJvbU9mZnNldFksCgkJCQkJCQkJCQkJCQkJCQkJJ3RvQ29vcmRpbmF0ZScJCT0+ICR0b0Nvb3JkaW5hdGUsCgkJCQkJCQkJCQkJCQkJCQkJJ3RvT2Zmc2V0WCcJCQk9PiAkdG9PZmZzZXRYLAoJCQkJCQkJCQkJCQkJCQkJCSd0b09mZnNldFknCQkJPT4gJHRvT2Zmc2V0WSwKCQkJCQkJCQkJCQkJCQkJCQknd29ya3NoZWV0VGl0bGUnCT0+ICRkb2NTaGVldC0+Z2V0VGl0bGUoKQoJCQkJCQkJCQkJCQkJCQkJICk7CgkJCQkJCQkJCQkJCX0NCgkJCQkJCQkJCQkJfQoJCQkJCQkJCQkJfQoKCQkJCQkJCQkJfQoJCQkJCQkJCX0KCQkJCQkJCX0KCgkJCQkJCQkvLyBMb29wIHRocm91Z2ggZGVmaW5lZE5hbWVzCgkJCQkJCQlpZiAoJHhtbFdvcmtib29rLT5kZWZpbmVkTmFtZXMpIHsKCQkJCQkJCQlmb3JlYWNoICgkeG1sV29ya2Jvb2stPmRlZmluZWROYW1lcy0+ZGVmaW5lZE5hbWUgYXMgJGRlZmluZWROYW1lKSB7CgkJCQkJCQkJCS8vIEV4dHJhY3QgcmFuZ2UKCQkJCQkJCQkJJGV4dHJhY3RlZFJhbmdlID0gKHN0cmluZykkZGVmaW5lZE5hbWU7CgkJCQkJCQkJCSRleHRyYWN0ZWRSYW5nZSA9IHByZWdfcmVwbGFjZSgnL1wnKFx3KylcJ1whLycsICcnLCAkZXh0cmFjdGVkUmFuZ2UpOwoJCQkJCQkJCQlpZiAoKCRzcG9zID0gc3RycG9zKCRleHRyYWN0ZWRSYW5nZSwnIScpKSAhPT0gZmFsc2UpIHsKCQkJCQkJCQkJCSRleHRyYWN0ZWRSYW5nZSA9IHN1YnN0cigkZXh0cmFjdGVkUmFuZ2UsMCwkc3Bvcykuc3RyX3JlcGxhY2UoJyQnLCAnJywgc3Vic3RyKCRleHRyYWN0ZWRSYW5nZSwkc3BvcykpOwoJCQkJCQkJCQl9IGVsc2UgewoJCQkJCQkJCQkJJGV4dHJhY3RlZFJhbmdlID0gc3RyX3JlcGxhY2UoJyQnLCAnJywgJGV4dHJhY3RlZFJhbmdlKTsKCQkJCQkJCQkJfQoKCQkJCQkJCQkJLy8gVmFsaWQgcmFuZ2U/CgkJCQkJCQkJCWlmIChzdHJpcG9zKChzdHJpbmcpJGRlZmluZWROYW1lLCAnI1JFRiEnKSAhPT0gZmFsc2UgfHwgJGV4dHJhY3RlZFJhbmdlID09ICcnKSB7CgkJCQkJCQkJCQljb250aW51ZTsKCQkJCQkJCQkJfQoKCQkJCQkJCQkJLy8gU29tZSBkZWZpbmVkTmFtZXMgYXJlIG9ubHkgYXBwbGljYWJsZSBpZiB3ZSBhcmUgb24gdGhlIHNhbWUgc2hlZXQuLi4KCQkJCQkJCQkJaWYgKChzdHJpbmcpJGRlZmluZWROYW1lWydsb2NhbFNoZWV0SWQnXSAhPSAnJyAmJiAoc3RyaW5nKSRkZWZpbmVkTmFtZVsnbG9jYWxTaGVldElkJ10gPT0gJHNoZWV0SWQpIHsKCQkJCQkJCQkJCS8vIFN3aXRjaCBvbiB0eXBlCgkJCQkJCQkJCQlzd2l0Y2ggKChzdHJpbmcpJGRlZmluZWROYW1lWyduYW1lJ10pIHsKCgkJCQkJCQkJCQkJY2FzZSAnX3hsbm0uX0ZpbHRlckRhdGFiYXNlJzoKCQkJCQkJCQkJCQkJJGRvY1NoZWV0LT5zZXRBdXRvRmlsdGVyKCRleHRyYWN0ZWRSYW5nZSk7CgkJCQkJCQkJCQkJCWJyZWFrOwoKCQkJCQkJCQkJCQljYXNlICdfeGxubS5QcmludF9UaXRsZXMnOgoJCQkJCQkJCQkJCQkvLyBTcGxpdCAkZXh0cmFjdGVkUmFuZ2UKCQkJCQkJCQkJCQkJJGV4dHJhY3RlZFJhbmdlID0gZXhwbG9kZSgnLCcsICRleHRyYWN0ZWRSYW5nZSk7CgoJCQkJCQkJCQkJCQkvLyBTZXQgcHJpbnQgdGl0bGVzCgkJCQkJCQkJCQkJCWZvcmVhY2ggKCRleHRyYWN0ZWRSYW5nZSBhcyAkcmFuZ2UpIHsKCQkJCQkJCQkJCQkJCSRtYXRjaGVzID0gYXJyYXkoKTsKCgkJCQkJCQkJCQkJCQkvLyBjaGVjayBmb3IgcmVwZWF0aW5nIGNvbHVtbnMsIGUgZy4gJ0E6QScgb3IgJ0E6RCcKCQkJCQkJCQkJCQkJCWlmIChwcmVnX21hdGNoKCcvXihbQS1aXSspXDooW0EtWl0rKSQvJywgJHJhbmdlLCAkbWF0Y2hlcykpIHsKCQkJCQkJCQkJCQkJCQkkZG9jU2hlZXQtPmdldFBhZ2VTZXR1cCgpLT5zZXRDb2x1bW5zVG9SZXBlYXRBdExlZnQoYXJyYXkoJG1hdGNoZXNbMV0sICRtYXRjaGVzWzJdKSk7CgkJCQkJCQkJCQkJCQl9CgkJCQkJCQkJCQkJCQkvLyBjaGVjayBmb3IgcmVwZWF0aW5nIHJvd3MsIGUuZy4gJzE6MScgb3IgJzE6NScKCQkJCQkJCQkJCQkJCWVsc2VpZiAocHJlZ19tYXRjaCgnL14oXGQrKVw6KFxkKykkLycsICRyYW5nZSwgJG1hdGNoZXMpKSB7CgkJCQkJCQkJCQkJCQkJJGRvY1NoZWV0LT5nZXRQYWdlU2V0dXAoKS0+c2V0Um93c1RvUmVwZWF0QXRUb3AoYXJyYXkoJG1hdGNoZXNbMV0sICRtYXRjaGVzWzJdKSk7CgkJCQkJCQkJCQkJCQl9CgkJCQkJCQkJCQkJCX0KCQkJCQkJCQkJCQkJYnJlYWs7CgoJCQkJCQkJCQkJCWNhc2UgJ194bG5tLlByaW50X0FyZWEnOgoJCQkJCQkJCQkJCQkkcmFuZ2VTZXRzID0gZXhwbG9kZSgnLCcsICRleHRyYWN0ZWRSYW5nZSk7CQkvLyBGSVhNRTogd2hhdCBpZiBzaGVldG5hbWUgY29udGFpbnMgY29tbWE/CgkJCQkJCQkJCQkJCSRuZXdSYW5nZVNldHMgPSBhcnJheSgpOwoJCQkJCQkJCQkJCQlmb3JlYWNoKCRyYW5nZVNldHMgYXMgJHJhbmdlU2V0KSB7CgkJCQkJCQkJCQkJCQkkcmFuZ2UgPSBleHBsb2RlKCchJywgJHJhbmdlU2V0KTsJLy8gRklYTUU6IHdoYXQgaWYgc2hlZXRuYW1lIGNvbnRhaW5zIGV4Y2xhbWF0aW9uIG1hcms/CgkJCQkJCQkJCQkJCQkkcmFuZ2VTZXQgPSBpc3NldCgkcmFuZ2VbMV0pID8gJHJhbmdlWzFdIDogJHJhbmdlWzBdOwoJCQkJCQkJCQkJCQkJJG5ld1JhbmdlU2V0c1tdID0gc3RyX3JlcGxhY2UoJyQnLCAnJywgJHJhbmdlU2V0KTsKCQkJCQkJCQkJCQkJfQoJCQkJCQkJCQkJCQkkZG9jU2hlZXQtPmdldFBhZ2VTZXR1cCgpLT5zZXRQcmludEFyZWEoaW1wbG9kZSgnLCcsJG5ld1JhbmdlU2V0cykpOwoJCQkJCQkJCQkJCQlicmVhazsKCgkJCQkJCQkJCQkJZGVmYXVsdDoKCQkJCQkJCQkJCQkJYnJlYWs7CgkJCQkJCQkJCQl9CgkJCQkJCQkJCX0KCQkJCQkJCQl9CgkJCQkJCQl9CgoJCQkJCQkJLy8gTmV4dCBzaGVldCBpZAoJCQkJCQkJKyskc2hlZXRJZDsKCQkJCQkJfQoKCQkJCQkJLy8gTG9vcCB0aHJvdWdoIGRlZmluZWROYW1lcwoJCQkJCQlpZiAoJHhtbFdvcmtib29rLT5kZWZpbmVkTmFtZXMpIHsKCQkJCQkJCWZvcmVhY2ggKCR4bWxXb3JrYm9vay0+ZGVmaW5lZE5hbWVzLT5kZWZpbmVkTmFtZSBhcyAkZGVmaW5lZE5hbWUpIHsKCQkJCQkJCQkvLyBFeHRyYWN0IHJhbmdlCgkJCQkJCQkJJGV4dHJhY3RlZFJhbmdlID0gKHN0cmluZykkZGVmaW5lZE5hbWU7CgkJCQkJCQkJJGV4dHJhY3RlZFJhbmdlID0gcHJlZ19yZXBsYWNlKCcvXCcoXHcrKVwnXCEvJywgJycsICRleHRyYWN0ZWRSYW5nZSk7CgkJCQkJCQkJaWYgKCgkc3BvcyA9IHN0cnBvcygkZXh0cmFjdGVkUmFuZ2UsJyEnKSkgIT09IGZhbHNlKSB7CgkJCQkJCQkJCSRleHRyYWN0ZWRSYW5nZSA9IHN1YnN0cigkZXh0cmFjdGVkUmFuZ2UsMCwkc3Bvcykuc3RyX3JlcGxhY2UoJyQnLCAnJywgc3Vic3RyKCRleHRyYWN0ZWRSYW5nZSwkc3BvcykpOwoJCQkJCQkJCX0gZWxzZSB7CgkJCQkJCQkJCSRleHRyYWN0ZWRSYW5nZSA9IHN0cl9yZXBsYWNlKCckJywgJycsICRleHRyYWN0ZWRSYW5nZSk7CgkJCQkJCQkJfQoKCQkJCQkJCQkvLyBWYWxpZCByYW5nZT8KCQkJCQkJCQlpZiAoc3RyaXBvcygoc3RyaW5nKSRkZWZpbmVkTmFtZSwgJyNSRUYhJykgIT09IGZhbHNlIHx8ICRleHRyYWN0ZWRSYW5nZSA9PSAnJykgewoJCQkJCQkJCQljb250aW51ZTsKCQkJCQkJCQl9CgoJCQkJCQkJCS8vIFNvbWUgZGVmaW5lZE5hbWVzIGFyZSBvbmx5IGFwcGxpY2FibGUgaWYgd2UgYXJlIG9uIHRoZSBzYW1lIHNoZWV0Li4uCgkJCQkJCQkJaWYgKChzdHJpbmcpJGRlZmluZWROYW1lWydsb2NhbFNoZWV0SWQnXSAhPSAnJykgewoJCQkJCQkJCQkvLyBMb2NhbCBkZWZpbmVkIG5hbWUKCQkJCQkJCQkJLy8gU3dpdGNoIG9uIHR5cGUKCQkJCQkJCQkJc3dpdGNoICgoc3RyaW5nKSRkZWZpbmVkTmFtZVsnbmFtZSddKSB7CgoJCQkJCQkJCQkJY2FzZSAnX3hsbm0uX0ZpbHRlckRhdGFiYXNlJzoKCQkJCQkJCQkJCWNhc2UgJ194bG5tLlByaW50X1RpdGxlcyc6CgkJCQkJCQkJCQljYXNlICdfeGxubS5QcmludF9BcmVhJzoKCQkJCQkJCQkJCQlicmVhazsKCgkJCQkJCQkJCQlkZWZhdWx0OgoJCQkJCQkJCQkJCSRyYW5nZSA9IGV4cGxvZGUoJyEnLCAoc3RyaW5nKSRkZWZpbmVkTmFtZSk7CgkJCQkJCQkJCQkJaWYgKGNvdW50KCRyYW5nZSkgPT0gMikgewoJCQkJCQkJCQkJCQkkcmFuZ2VbMF0gPSBzdHJfcmVwbGFjZSgiJyciLCAiJyIsICRyYW5nZVswXSk7CgkJCQkJCQkJCQkJCSRyYW5nZVswXSA9IHN0cl9yZXBsYWNlKCInIiwgIiIsICRyYW5nZVswXSk7CgkJCQkJCQkJCQkJCWlmICgkd29ya3NoZWV0ID0gJGRvY1NoZWV0LT5nZXRQYXJlbnQoKS0+Z2V0U2hlZXRCeU5hbWUoJHJhbmdlWzBdKSkgewoJCQkJCQkJCQkJCQkJJGV4dHJhY3RlZFJhbmdlID0gc3RyX3JlcGxhY2UoJyQnLCAnJywgJHJhbmdlWzFdKTsKCQkJCQkJCQkJCQkJCSRzY29wZSA9ICRkb2NTaGVldC0+Z2V0UGFyZW50KCktPmdldFNoZWV0KChzdHJpbmcpJGRlZmluZWROYW1lWydsb2NhbFNoZWV0SWQnXSk7CgoJCQkJCQkJCQkJCQkJJGV4Y2VsLT5hZGROYW1lZFJhbmdlKCBuZXcgUEhQRXhjZWxfTmFtZWRSYW5nZSgoc3RyaW5nKSRkZWZpbmVkTmFtZVsnbmFtZSddLCAkd29ya3NoZWV0LCAkZXh0cmFjdGVkUmFuZ2UsIHRydWUsICRzY29wZSkgKTsKCQkJCQkJCQkJCQkJfQoJCQkJCQkJCQkJCX0KCQkJCQkJCQkJCQlicmVhazsKCQkJCQkJCQkJfQoJCQkJCQkJCX0gZWxzZSBpZiAoIWlzc2V0KCRkZWZpbmVkTmFtZVsnbG9jYWxTaGVldElkJ10pKSB7CgkJCQkJCQkJCS8vICJHbG9iYWwiIGRlZmluZWROYW1lcwoJCQkJCQkJCQkkbG9jYXRlZFNoZWV0ID0gbnVsbDsKCQkJCQkJCQkJJGV4dHJhY3RlZFNoZWV0TmFtZSA9ICcnOwoJCQkJCQkJCQlpZiAoc3RycG9zKCAoc3RyaW5nKSRkZWZpbmVkTmFtZSwgJyEnICkgIT09IGZhbHNlKSB7CgkJCQkJCQkJCQkvLyBFeHRyYWN0IHNoZWV0IG5hbWUKCQkJCQkJCQkJCSRleHRyYWN0ZWRTaGVldE5hbWUgPSBQSFBFeGNlbF9Xb3Jrc2hlZXQ6OmV4dHJhY3RTaGVldFRpdGxlKCAoc3RyaW5nKSRkZWZpbmVkTmFtZSwgdHJ1ZSApOwoJCQkJCQkJCQkJJGV4dHJhY3RlZFNoZWV0TmFtZSA9ICRleHRyYWN0ZWRTaGVldE5hbWVbMF07CgoJCQkJCQkJCQkJLy8gTG9jYXRlIHNoZWV0CgkJCQkJCQkJCQkkbG9jYXRlZFNoZWV0ID0gJGV4Y2VsLT5nZXRTaGVldEJ5TmFtZSgkZXh0cmFjdGVkU2hlZXROYW1lKTsKCgkJCQkJCQkJCQkvLyBNb2RpZnkgcmFuZ2UKCQkJCQkJCQkJCSRyYW5nZSA9IGV4cGxvZGUoJyEnLCAkZXh0cmFjdGVkUmFuZ2UpOwoJCQkJCQkJCQkJJGV4dHJhY3RlZFJhbmdlID0gaXNzZXQoJHJhbmdlWzFdKSA/ICRyYW5nZVsxXSA6ICRyYW5nZVswXTsKCQkJCQkJCQkJfQoKCQkJCQkJCQkJaWYgKCRsb2NhdGVkU2hlZXQgIT09IE5VTEwpIHsKCQkJCQkJCQkJCSRleGNlbC0+YWRkTmFtZWRSYW5nZSggbmV3IFBIUEV4Y2VsX05hbWVkUmFuZ2UoKHN0cmluZykkZGVmaW5lZE5hbWVbJ25hbWUnXSwgJGxvY2F0ZWRTaGVldCwgJGV4dHJhY3RlZFJhbmdlLCBmYWxzZSkgKTsKCQkJCQkJCQkJfQoJCQkJCQkJCX0KCQkJCQkJCX0KCQkJCQkJfQoJCQkJCX0KCgkJCQkJaWYgKCEkdGhpcy0+X3JlYWREYXRhT25seSkgewoJCQkJCQkvLyBhY3RpdmUgc2hlZXQgaW5kZXgKCQkJCQkJJGFjdGl2ZVRhYiA9IGludHZhbCgkeG1sV29ya2Jvb2stPmJvb2tWaWV3cy0+d29ya2Jvb2tWaWV3WyJhY3RpdmVUYWIiXSk7IC8vIHJlZmVycyB0byBvbGQgc2hlZXQgaW5kZXgKCgkJCQkJCS8vIGtlZXAgYWN0aXZlIHNoZWV0IGluZGV4IGlmIHNoZWV0IGlzIHN0aWxsIGxvYWRlZCwgZWxzZSBmaXJzdCBzaGVldCBpcyBzZXQgYXMgdGhlIGFjdGl2ZQoJCQkJCQlpZiAoaXNzZXQoJG1hcFNoZWV0SWRbJGFjdGl2ZVRhYl0pICYmICRtYXBTaGVldElkWyRhY3RpdmVUYWJdICE9PSBudWxsKSB7CgkJCQkJCQkkZXhjZWwtPnNldEFjdGl2ZVNoZWV0SW5kZXgoJG1hcFNoZWV0SWRbJGFjdGl2ZVRhYl0pOwoJCQkJCQl9IGVsc2UgewoJCQkJCQkJaWYgKCRleGNlbC0+Z2V0U2hlZXRDb3VudCgpID09IDApIHsKCQkJCQkJCQkkZXhjZWwtPmNyZWF0ZVNoZWV0KCk7CgkJCQkJCQl9CgkJCQkJCQkkZXhjZWwtPnNldEFjdGl2ZVNoZWV0SW5kZXgoMCk7CgkJCQkJCX0KCQkJCQl9CgkJCQlicmVhazsKCQkJfQoKCQl9CgoKCQlpZiAoISR0aGlzLT5fcmVhZERhdGFPbmx5KSB7CgkJCSRjb250ZW50VHlwZXMgPSBzaW1wbGV4bWxfbG9hZF9zdHJpbmcoJHRoaXMtPl9nZXRGcm9tWmlwQXJjaGl2ZSgkemlwLCAiW0NvbnRlbnRfVHlwZXNdLnhtbCIpKTsKCQkJZm9yZWFjaCAoJGNvbnRlbnRUeXBlcy0+T3ZlcnJpZGUgYXMgJGNvbnRlbnRUeXBlKSB7CgkJCQlzd2l0Y2ggKCRjb250ZW50VHlwZVsiQ29udGVudFR5cGUiXSkgewoJCQkJCWNhc2UgImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5kcmF3aW5nbWwuY2hhcnQreG1sIjoKCQkJCQkJaWYgKCR0aGlzLT5faW5jbHVkZUNoYXJ0cykgew0KCQkJCQkJCSRjaGFydEVudHJ5UmVmID0gbHRyaW0oJGNvbnRlbnRUeXBlWydQYXJ0TmFtZSddLCcvJyk7CgkJCQkJCQkkY2hhcnRFbGVtZW50cyA9IHNpbXBsZXhtbF9sb2FkX3N0cmluZygkdGhpcy0+X2dldEZyb21aaXBBcmNoaXZlKCR6aXAsICRjaGFydEVudHJ5UmVmKSk7CgkJCQkJCQkkb2JqQ2hhcnQgPSBQSFBFeGNlbF9SZWFkZXJfRXhjZWwyMDA3X0NoYXJ0OjpyZWFkQ2hhcnQoJGNoYXJ0RWxlbWVudHMsYmFzZW5hbWUoJGNoYXJ0RW50cnlSZWYsJy54bWwnKSk7CgovLwkJCQkJCQllY2hvICdDaGFydCAnLCRjaGFydEVudHJ5UmVmLCc8YnIgLz4nOwovLwkJCQkJCQl2YXJfZHVtcCgkY2hhcnRzWyRjaGFydEVudHJ5UmVmXSk7Ci8vCgkJCQkJCQlpZiAoaXNzZXQoJGNoYXJ0c1skY2hhcnRFbnRyeVJlZl0pKSB7CgkJCQkJCQkJJGNoYXJ0UG9zaXRpb25SZWYgPSAkY2hhcnRzWyRjaGFydEVudHJ5UmVmXVsnc2hlZXQnXS4nIScuJGNoYXJ0c1skY2hhcnRFbnRyeVJlZl1bJ2lkJ107Ci8vCQkJCQkJCQllY2hvICdQb3NpdGlvbiBSZWYgJywkY2hhcnRQb3NpdGlvblJlZiwnPGJyIC8+JzsKCQkJCQkJCQlpZiAoaXNzZXQoJGNoYXJ0RGV0YWlsc1skY2hhcnRQb3NpdGlvblJlZl0pKSB7Ci8vCQkJCQkJCQkJdmFyX2R1bXAoJGNoYXJ0RGV0YWlsc1skY2hhcnRQb3NpdGlvblJlZl0pOwoNCgkJCQkJCQkJCSRleGNlbC0+Z2V0U2hlZXRCeU5hbWUoJGNoYXJ0c1skY2hhcnRFbnRyeVJlZl1bJ3NoZWV0J10pLT5hZGRDaGFydCgkb2JqQ2hhcnQpOwoJCQkJCQkJCQkkb2JqQ2hhcnQtPnNldFdvcmtzaGVldCgkZXhjZWwtPmdldFNoZWV0QnlOYW1lKCRjaGFydHNbJGNoYXJ0RW50cnlSZWZdWydzaGVldCddKSk7CgkJCQkJCQkJCSRvYmpDaGFydC0+c2V0VG9wTGVmdFBvc2l0aW9uKCAkY2hhcnREZXRhaWxzWyRjaGFydFBvc2l0aW9uUmVmXVsnZnJvbUNvb3JkaW5hdGUnXSwKCQkJCQkJCQkJCQkJCQkJCSAgICRjaGFydERldGFpbHNbJGNoYXJ0UG9zaXRpb25SZWZdWydmcm9tT2Zmc2V0WCddLAoJCQkJCQkJCQkJCQkJCQkJICAgJGNoYXJ0RGV0YWlsc1skY2hhcnRQb3NpdGlvblJlZl1bJ2Zyb21PZmZzZXRZJ10KCQkJCQkJCQkJCQkJCQkJCSApOwoJCQkJCQkJCQkkb2JqQ2hhcnQtPnNldEJvdHRvbVJpZ2h0UG9zaXRpb24oICRjaGFydERldGFpbHNbJGNoYXJ0UG9zaXRpb25SZWZdWyd0b0Nvb3JkaW5hdGUnXSwKCQkJCQkJCQkJCQkJCQkJCQkgICAkY2hhcnREZXRhaWxzWyRjaGFydFBvc2l0aW9uUmVmXVsndG9PZmZzZXRYJ10sCgkJCQkJCQkJCQkJCQkJCQkJICAgJGNoYXJ0RGV0YWlsc1skY2hhcnRQb3NpdGlvblJlZl1bJ3RvT2Zmc2V0WSddCgkJCQkJCQkJCQkJCQkJCQkJICk7CgkJCQkJCQkJfQoJCQkJCQkJfQ0KCQkJCQkJfQoJCQkJfQoJCQl9CgkJfQoKCQkkemlwLT5jbG9zZSgpOwoKCQlyZXR1cm4gJGV4Y2VsOwoJfQoNCgoJcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gX3JlYWRDb2xvcigkY29sb3IsICRiYWNrZ3JvdW5kPWZhbHNlKSB7CgkJaWYgKGlzc2V0KCRjb2xvclsicmdiIl0pKSB7CgkJCXJldHVybiAoc3RyaW5nKSRjb2xvclsicmdiIl07CgkJfSBlbHNlIGlmIChpc3NldCgkY29sb3JbImluZGV4ZWQiXSkpIHsKCQkJcmV0dXJuIFBIUEV4Y2VsX1N0eWxlX0NvbG9yOjppbmRleGVkQ29sb3IoJGNvbG9yWyJpbmRleGVkIl0tNywkYmFja2dyb3VuZCktPmdldEFSR0IoKTsKCQl9IGVsc2UgaWYgKGlzc2V0KCRjb2xvclsidGhlbWUiXSkpIHsKCQkJaWYgKHNlbGY6OiRfdGhlbWUgIT09IE5VTEwpIHsKCQkJCSRyZXR1cm5Db2xvdXIgPSBzZWxmOjokX3RoZW1lLT5nZXRDb2xvdXJCeUluZGV4KChpbnQpJGNvbG9yWyJ0aGVtZSJdKTsKCQkJCWlmIChpc3NldCgkY29sb3JbInRpbnQiXSkpIHsKCQkJCQkkdGludEFkanVzdCA9IChmbG9hdCkgJGNvbG9yWyJ0aW50Il07CgkJCQkJJHJldHVybkNvbG91ciA9IFBIUEV4Y2VsX1N0eWxlX0NvbG9yOjpjaGFuZ2VCcmlnaHRuZXNzKCRyZXR1cm5Db2xvdXIsICR0aW50QWRqdXN0KTsKCQkJCX0KCQkJCXJldHVybiAnRkYnLiRyZXR1cm5Db2xvdXI7CgkJCX0KCQl9CgoJCWlmICgkYmFja2dyb3VuZCkgewoJCQlyZXR1cm4gJ0ZGRkZGRkZGJzsKCQl9CgkJcmV0dXJuICdGRjAwMDAwMCc7Cgl9CgoNCglwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBfcmVhZFN0eWxlKCRkb2NTdHlsZSwgJHN0eWxlKSB7CgkJLy8gZm9ybWF0IGNvZGUKCQlpZiAoaXNzZXQoJHN0eWxlLT5udW1GbXQpKSB7CgkJCSRkb2NTdHlsZS0+Z2V0TnVtYmVyRm9ybWF0KCktPnNldEZvcm1hdENvZGUoJHN0eWxlLT5udW1GbXQpOwoJCX0KCgkJLy8gZm9udAoJCWlmIChpc3NldCgkc3R5bGUtPmZvbnQpKSB7CgkJCSRkb2NTdHlsZS0+Z2V0Rm9udCgpLT5zZXROYW1lKChzdHJpbmcpICRzdHlsZS0+Zm9udC0+bmFtZVsidmFsIl0pOwoJCQkkZG9jU3R5bGUtPmdldEZvbnQoKS0+c2V0U2l6ZSgoc3RyaW5nKSAkc3R5bGUtPmZvbnQtPnN6WyJ2YWwiXSk7CgkJCWlmIChpc3NldCgkc3R5bGUtPmZvbnQtPmIpKSB7CgkJCQkkZG9jU3R5bGUtPmdldEZvbnQoKS0+c2V0Qm9sZCghaXNzZXQoJHN0eWxlLT5mb250LT5iWyJ2YWwiXSkgfHwgJHN0eWxlLT5mb250LT5iWyJ2YWwiXSA9PSAndHJ1ZScgfHwgJHN0eWxlLT5mb250LT5iWyJ2YWwiXSA9PSAnMScpOwoJCQl9CgkJCWlmIChpc3NldCgkc3R5bGUtPmZvbnQtPmkpKSB7CgkJCQkkZG9jU3R5bGUtPmdldEZvbnQoKS0+c2V0SXRhbGljKCFpc3NldCgkc3R5bGUtPmZvbnQtPmlbInZhbCJdKSB8fCAkc3R5bGUtPmZvbnQtPmlbInZhbCJdID09ICd0cnVlJyB8fCAkc3R5bGUtPmZvbnQtPmlbInZhbCJdID09ICcxJyk7CgkJCX0KCQkJaWYgKGlzc2V0KCRzdHlsZS0+Zm9udC0+c3RyaWtlKSkgewoJCQkJJGRvY1N0eWxlLT5nZXRGb250KCktPnNldFN0cmlrZXRocm91Z2goIWlzc2V0KCRzdHlsZS0+Zm9udC0+c3RyaWtlWyJ2YWwiXSkgfHwgJHN0eWxlLT5mb250LT5zdHJpa2VbInZhbCJdID09ICd0cnVlJyB8fCAkc3R5bGUtPmZvbnQtPnN0cmlrZVsidmFsIl0gPT0gJzEnKTsKCQkJfQoJCQkkZG9jU3R5bGUtPmdldEZvbnQoKS0+Z2V0Q29sb3IoKS0+c2V0QVJHQihzZWxmOjpfcmVhZENvbG9yKCRzdHlsZS0+Zm9udC0+Y29sb3IpKTsKCgkJCWlmIChpc3NldCgkc3R5bGUtPmZvbnQtPnUpICYmICFpc3NldCgkc3R5bGUtPmZvbnQtPnVbInZhbCJdKSkgewoJCQkJJGRvY1N0eWxlLT5nZXRGb250KCktPnNldFVuZGVybGluZShQSFBFeGNlbF9TdHlsZV9Gb250OjpVTkRFUkxJTkVfU0lOR0xFKTsKCQkJfSBlbHNlIGlmIChpc3NldCgkc3R5bGUtPmZvbnQtPnUpICYmIGlzc2V0KCRzdHlsZS0+Zm9udC0+dVsidmFsIl0pKSB7CgkJCQkkZG9jU3R5bGUtPmdldEZvbnQoKS0+c2V0VW5kZXJsaW5lKChzdHJpbmcpJHN0eWxlLT5mb250LT51WyJ2YWwiXSk7CgkJCX0KCgkJCWlmIChpc3NldCgkc3R5bGUtPmZvbnQtPnZlcnRBbGlnbikgJiYgaXNzZXQoJHN0eWxlLT5mb250LT52ZXJ0QWxpZ25bInZhbCJdKSkgewoJCQkJJHZlcnRBbGlnbiA9IHN0cnRvbG93ZXIoKHN0cmluZykkc3R5bGUtPmZvbnQtPnZlcnRBbGlnblsidmFsIl0pOwoJCQkJaWYgKCR2ZXJ0QWxpZ24gPT0gJ3N1cGVyc2NyaXB0JykgewoJCQkJCSRkb2NTdHlsZS0+Z2V0Rm9udCgpLT5zZXRTdXBlclNjcmlwdCh0cnVlKTsKCQkJCX0KCQkJCWlmICgkdmVydEFsaWduID09ICdzdWJzY3JpcHQnKSB7CgkJCQkJJGRvY1N0eWxlLT5nZXRGb250KCktPnNldFN1YlNjcmlwdCh0cnVlKTsKCQkJCX0KCQkJfQoJCX0KCgkJLy8gZmlsbAoJCWlmIChpc3NldCgkc3R5bGUtPmZpbGwpKSB7CgkJCWlmICgkc3R5bGUtPmZpbGwtPmdyYWRpZW50RmlsbCkgewoJCQkJJGdyYWRpZW50RmlsbCA9ICRzdHlsZS0+ZmlsbC0+Z3JhZGllbnRGaWxsWzBdOwoJCQkJaWYoIWVtcHR5KCRncmFkaWVudEZpbGxbInR5cGUiXSkpIHsNCgkJCQkJJGRvY1N0eWxlLT5nZXRGaWxsKCktPnNldEZpbGxUeXBlKChzdHJpbmcpICRncmFkaWVudEZpbGxbInR5cGUiXSk7CgkJCQl9CgkJCQkkZG9jU3R5bGUtPmdldEZpbGwoKS0+c2V0Um90YXRpb24oZmxvYXR2YWwoJGdyYWRpZW50RmlsbFsiZGVncmVlIl0pKTsKCQkJCSRncmFkaWVudEZpbGwtPnJlZ2lzdGVyWFBhdGhOYW1lc3BhY2UoInNtbCIsICJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvc3ByZWFkc2hlZXRtbC8yMDA2L21haW4iKTsKCQkJCSRkb2NTdHlsZS0+Z2V0RmlsbCgpLT5nZXRTdGFydENvbG9yKCktPnNldEFSR0Ioc2VsZjo6X3JlYWRDb2xvciggc2VsZjo6YXJyYXlfaXRlbSgkZ3JhZGllbnRGaWxsLT54cGF0aCgic21sOnN0b3BbQHBvc2l0aW9uPTBdIikpLT5jb2xvcikgKTsKCQkJCSRkb2NTdHlsZS0+Z2V0RmlsbCgpLT5nZXRFbmRDb2xvcigpLT5zZXRBUkdCKHNlbGY6Ol9yZWFkQ29sb3IoIHNlbGY6OmFycmF5X2l0ZW0oJGdyYWRpZW50RmlsbC0+eHBhdGgoInNtbDpzdG9wW0Bwb3NpdGlvbj0xXSIpKS0+Y29sb3IpICk7CgkJCX0gZWxzZWlmICgkc3R5bGUtPmZpbGwtPnBhdHRlcm5GaWxsKSB7CgkJCQkkcGF0dGVyblR5cGUgPSAoc3RyaW5nKSRzdHlsZS0+ZmlsbC0+cGF0dGVybkZpbGxbInBhdHRlcm5UeXBlIl0gIT0gJycgPyAoc3RyaW5nKSRzdHlsZS0+ZmlsbC0+cGF0dGVybkZpbGxbInBhdHRlcm5UeXBlIl0gOiAnc29saWQnOwoJCQkJJGRvY1N0eWxlLT5nZXRGaWxsKCktPnNldEZpbGxUeXBlKCRwYXR0ZXJuVHlwZSk7CgkJCQlpZiAoJHN0eWxlLT5maWxsLT5wYXR0ZXJuRmlsbC0+ZmdDb2xvcikgewoJCQkJCSRkb2NTdHlsZS0+Z2V0RmlsbCgpLT5nZXRTdGFydENvbG9yKCktPnNldEFSR0Ioc2VsZjo6X3JlYWRDb2xvcigkc3R5bGUtPmZpbGwtPnBhdHRlcm5GaWxsLT5mZ0NvbG9yLHRydWUpKTsKCQkJCX0gZWxzZSB7CgkJCQkJJGRvY1N0eWxlLT5nZXRGaWxsKCktPmdldFN0YXJ0Q29sb3IoKS0+c2V0QVJHQignRkYwMDAwMDAnKTsKCQkJCX0KCQkJCWlmICgkc3R5bGUtPmZpbGwtPnBhdHRlcm5GaWxsLT5iZ0NvbG9yKSB7CgkJCQkJJGRvY1N0eWxlLT5nZXRGaWxsKCktPmdldEVuZENvbG9yKCktPnNldEFSR0Ioc2VsZjo6X3JlYWRDb2xvcigkc3R5bGUtPmZpbGwtPnBhdHRlcm5GaWxsLT5iZ0NvbG9yLHRydWUpKTsKCQkJCX0KCQkJfQoJCX0KCgkJLy8gYm9yZGVyCgkJaWYgKGlzc2V0KCRzdHlsZS0+Ym9yZGVyKSkgewoJCQkkZGlhZ29uYWxVcCAgID0gZmFsc2U7CgkJCSRkaWFnb25hbERvd24gPSBmYWxzZTsKCQkJaWYgKCRzdHlsZS0+Ym9yZGVyWyJkaWFnb25hbFVwIl0gPT0gJ3RydWUnIHx8ICRzdHlsZS0+Ym9yZGVyWyJkaWFnb25hbFVwIl0gPT0gMSkgewoJCQkJJGRpYWdvbmFsVXAgPSB0cnVlOwoJCQl9CgkJCWlmICgkc3R5bGUtPmJvcmRlclsiZGlhZ29uYWxEb3duIl0gPT0gJ3RydWUnIHx8ICRzdHlsZS0+Ym9yZGVyWyJkaWFnb25hbERvd24iXSA9PSAxKSB7CgkJCQkkZGlhZ29uYWxEb3duID0gdHJ1ZTsKCQkJfQoJCQlpZiAoJGRpYWdvbmFsVXAgPT0gZmFsc2UgJiYgJGRpYWdvbmFsRG93biA9PSBmYWxzZSkgewoJCQkJJGRvY1N0eWxlLT5nZXRCb3JkZXJzKCktPnNldERpYWdvbmFsRGlyZWN0aW9uKFBIUEV4Y2VsX1N0eWxlX0JvcmRlcnM6OkRJQUdPTkFMX05PTkUpOwoJCQl9IGVsc2VpZiAoJGRpYWdvbmFsVXAgPT0gdHJ1ZSAmJiAkZGlhZ29uYWxEb3duID09IGZhbHNlKSB7CgkJCQkkZG9jU3R5bGUtPmdldEJvcmRlcnMoKS0+c2V0RGlhZ29uYWxEaXJlY3Rpb24oUEhQRXhjZWxfU3R5bGVfQm9yZGVyczo6RElBR09OQUxfVVApOwoJCQl9IGVsc2VpZiAoJGRpYWdvbmFsVXAgPT0gZmFsc2UgJiYgJGRpYWdvbmFsRG93biA9PSB0cnVlKSB7CgkJCQkkZG9jU3R5bGUtPmdldEJvcmRlcnMoKS0+c2V0RGlhZ29uYWxEaXJlY3Rpb24oUEhQRXhjZWxfU3R5bGVfQm9yZGVyczo6RElBR09OQUxfRE9XTik7CgkJCX0gZWxzZWlmICgkZGlhZ29uYWxVcCA9PSB0cnVlICYmICRkaWFnb25hbERvd24gPT0gdHJ1ZSkgewoJCQkJJGRvY1N0eWxlLT5nZXRCb3JkZXJzKCktPnNldERpYWdvbmFsRGlyZWN0aW9uKFBIUEV4Y2VsX1N0eWxlX0JvcmRlcnM6OkRJQUdPTkFMX0JPVEgpOwoJCQl9CgkJCXNlbGY6Ol9yZWFkQm9yZGVyKCRkb2NTdHlsZS0+Z2V0Qm9yZGVycygpLT5nZXRMZWZ0KCksICRzdHlsZS0+Ym9yZGVyLT5sZWZ0KTsKCQkJc2VsZjo6X3JlYWRCb3JkZXIoJGRvY1N0eWxlLT5nZXRCb3JkZXJzKCktPmdldFJpZ2h0KCksICRzdHlsZS0+Ym9yZGVyLT5yaWdodCk7CgkJCXNlbGY6Ol9yZWFkQm9yZGVyKCRkb2NTdHlsZS0+Z2V0Qm9yZGVycygpLT5nZXRUb3AoKSwgJHN0eWxlLT5ib3JkZXItPnRvcCk7CgkJCXNlbGY6Ol9yZWFkQm9yZGVyKCRkb2NTdHlsZS0+Z2V0Qm9yZGVycygpLT5nZXRCb3R0b20oKSwgJHN0eWxlLT5ib3JkZXItPmJvdHRvbSk7CgkJCXNlbGY6Ol9yZWFkQm9yZGVyKCRkb2NTdHlsZS0+Z2V0Qm9yZGVycygpLT5nZXREaWFnb25hbCgpLCAkc3R5bGUtPmJvcmRlci0+ZGlhZ29uYWwpOwoJCX0KCgkJLy8gYWxpZ25tZW50CgkJaWYgKGlzc2V0KCRzdHlsZS0+YWxpZ25tZW50KSkgewoJCQkkZG9jU3R5bGUtPmdldEFsaWdubWVudCgpLT5zZXRIb3Jpem9udGFsKChzdHJpbmcpICRzdHlsZS0+YWxpZ25tZW50WyJob3Jpem9udGFsIl0pOwoJCQkkZG9jU3R5bGUtPmdldEFsaWdubWVudCgpLT5zZXRWZXJ0aWNhbCgoc3RyaW5nKSAkc3R5bGUtPmFsaWdubWVudFsidmVydGljYWwiXSk7CgoJCQkkdGV4dFJvdGF0aW9uID0gMDsKCQkJaWYgKChpbnQpJHN0eWxlLT5hbGlnbm1lbnRbInRleHRSb3RhdGlvbiJdIDw9IDkwKSB7CgkJCQkkdGV4dFJvdGF0aW9uID0gKGludCkkc3R5bGUtPmFsaWdubWVudFsidGV4dFJvdGF0aW9uIl07CgkJCX0gZWxzZSBpZiAoKGludCkkc3R5bGUtPmFsaWdubWVudFsidGV4dFJvdGF0aW9uIl0gPiA5MCkgewoJCQkJJHRleHRSb3RhdGlvbiA9IDkwIC0gKGludCkkc3R5bGUtPmFsaWdubWVudFsidGV4dFJvdGF0aW9uIl07CgkJCX0KCgkJCSRkb2NTdHlsZS0+Z2V0QWxpZ25tZW50KCktPnNldFRleHRSb3RhdGlvbihpbnR2YWwoJHRleHRSb3RhdGlvbikpOwoJCQkkZG9jU3R5bGUtPmdldEFsaWdubWVudCgpLT5zZXRXcmFwVGV4dCggKHN0cmluZykkc3R5bGUtPmFsaWdubWVudFsid3JhcFRleHQiXSA9PSAidHJ1ZSIgfHwgKHN0cmluZykkc3R5bGUtPmFsaWdubWVudFsid3JhcFRleHQiXSA9PSAiMSIgKTsKCQkJJGRvY1N0eWxlLT5nZXRBbGlnbm1lbnQoKS0+c2V0U2hyaW5rVG9GaXQoIChzdHJpbmcpJHN0eWxlLT5hbGlnbm1lbnRbInNocmlua1RvRml0Il0gPT0gInRydWUiIHx8IChzdHJpbmcpJHN0eWxlLT5hbGlnbm1lbnRbInNocmlua1RvRml0Il0gPT0gIjEiICk7CgkJCSRkb2NTdHlsZS0+Z2V0QWxpZ25tZW50KCktPnNldEluZGVudCggaW50dmFsKChzdHJpbmcpJHN0eWxlLT5hbGlnbm1lbnRbImluZGVudCJdKSA+IDAgPyBpbnR2YWwoKHN0cmluZykkc3R5bGUtPmFsaWdubWVudFsiaW5kZW50Il0pIDogMCApOwoJCX0KCgkJLy8gcHJvdGVjdGlvbgoJCWlmIChpc3NldCgkc3R5bGUtPnByb3RlY3Rpb24pKSB7CgkJCWlmIChpc3NldCgkc3R5bGUtPnByb3RlY3Rpb25bJ2xvY2tlZCddKSkgewoJCQkJaWYgKChzdHJpbmcpJHN0eWxlLT5wcm90ZWN0aW9uWydsb2NrZWQnXSA9PSAndHJ1ZScpIHsKCQkJCQkkZG9jU3R5bGUtPmdldFByb3RlY3Rpb24oKS0+c2V0TG9ja2VkKFBIUEV4Y2VsX1N0eWxlX1Byb3RlY3Rpb246OlBST1RFQ1RJT05fUFJPVEVDVEVEKTsKCQkJCX0gZWxzZSB7CgkJCQkJJGRvY1N0eWxlLT5nZXRQcm90ZWN0aW9uKCktPnNldExvY2tlZChQSFBFeGNlbF9TdHlsZV9Qcm90ZWN0aW9uOjpQUk9URUNUSU9OX1VOUFJPVEVDVEVEKTsKCQkJCX0KCQkJfQoKCQkJaWYgKGlzc2V0KCRzdHlsZS0+cHJvdGVjdGlvblsnaGlkZGVuJ10pKSB7CgkJCQlpZiAoKHN0cmluZykkc3R5bGUtPnByb3RlY3Rpb25bJ2hpZGRlbiddID09ICd0cnVlJykgewoJCQkJCSRkb2NTdHlsZS0+Z2V0UHJvdGVjdGlvbigpLT5zZXRIaWRkZW4oUEhQRXhjZWxfU3R5bGVfUHJvdGVjdGlvbjo6UFJPVEVDVElPTl9QUk9URUNURUQpOwoJCQkJfSBlbHNlIHsKCQkJCQkkZG9jU3R5bGUtPmdldFByb3RlY3Rpb24oKS0+c2V0SGlkZGVuKFBIUEV4Y2VsX1N0eWxlX1Byb3RlY3Rpb246OlBST1RFQ1RJT05fVU5QUk9URUNURUQpOwoJCQkJfQoJCQl9CgkJfQoJfQoNCgoJcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gX3JlYWRCb3JkZXIoJGRvY0JvcmRlciwgJGVsZUJvcmRlcikgewoJCWlmIChpc3NldCgkZWxlQm9yZGVyWyJzdHlsZSJdKSkgewoJCQkkZG9jQm9yZGVyLT5zZXRCb3JkZXJTdHlsZSgoc3RyaW5nKSAkZWxlQm9yZGVyWyJzdHlsZSJdKTsKCQl9CgkJaWYgKGlzc2V0KCRlbGVCb3JkZXItPmNvbG9yKSkgewoJCQkkZG9jQm9yZGVyLT5nZXRDb2xvcigpLT5zZXRBUkdCKHNlbGY6Ol9yZWFkQ29sb3IoJGVsZUJvcmRlci0+Y29sb3IpKTsKCQl9Cgl9CgoNCglwcml2YXRlIGZ1bmN0aW9uIF9wYXJzZVJpY2hUZXh0KCRpcyA9IG51bGwpIHsKCQkkdmFsdWUgPSBuZXcgUEhQRXhjZWxfUmljaFRleHQoKTsKCgkJaWYgKGlzc2V0KCRpcy0+dCkpIHsKCQkJJHZhbHVlLT5jcmVhdGVUZXh0KCBQSFBFeGNlbF9TaGFyZWRfU3RyaW5nOjpDb250cm9sQ2hhcmFjdGVyT09YTUwyUEhQKCAoc3RyaW5nKSAkaXMtPnQgKSApOwoJCX0gZWxzZSB7CgkJCWZvcmVhY2ggKCRpcy0+ciBhcyAkcnVuKSB7CgkJCQlpZiAoIWlzc2V0KCRydW4tPnJQcikpIHsKCQkJCQkkb2JqVGV4dCA9ICR2YWx1ZS0+Y3JlYXRlVGV4dCggUEhQRXhjZWxfU2hhcmVkX1N0cmluZzo6Q29udHJvbENoYXJhY3Rlck9PWE1MMlBIUCggKHN0cmluZykgJHJ1bi0+dCApICk7CgoJCQkJfSBlbHNlIHsKCQkJCQkkb2JqVGV4dCA9ICR2YWx1ZS0+Y3JlYXRlVGV4dFJ1biggUEhQRXhjZWxfU2hhcmVkX1N0cmluZzo6Q29udHJvbENoYXJhY3Rlck9PWE1MMlBIUCggKHN0cmluZykgJHJ1bi0+dCApICk7CgoJCQkJCWlmIChpc3NldCgkcnVuLT5yUHItPnJGb250WyJ2YWwiXSkpIHsKCQkJCQkJJG9ialRleHQtPmdldEZvbnQoKS0+c2V0TmFtZSgoc3RyaW5nKSAkcnVuLT5yUHItPnJGb250WyJ2YWwiXSk7CgkJCQkJfQoKCQkJCQlpZiAoaXNzZXQoJHJ1bi0+clByLT5zelsidmFsIl0pKSB7CgkJCQkJCSRvYmpUZXh0LT5nZXRGb250KCktPnNldFNpemUoKHN0cmluZykgJHJ1bi0+clByLT5zelsidmFsIl0pOwoJCQkJCX0KCgkJCQkJaWYgKGlzc2V0KCRydW4tPnJQci0+Y29sb3IpKSB7CgkJCQkJCSRvYmpUZXh0LT5nZXRGb250KCktPnNldENvbG9yKCBuZXcgUEhQRXhjZWxfU3R5bGVfQ29sb3IoIHNlbGY6Ol9yZWFkQ29sb3IoJHJ1bi0+clByLT5jb2xvcikgKSApOwoJCQkJCX0KCgkJCQkJaWYgKCAoaXNzZXQoJHJ1bi0+clByLT5iWyJ2YWwiXSkgJiYgKChzdHJpbmcpICRydW4tPnJQci0+YlsidmFsIl0gPT0gJ3RydWUnIHx8IChzdHJpbmcpICRydW4tPnJQci0+YlsidmFsIl0gPT0gJzEnKSkKCQkJCQkgICAgIHx8IChpc3NldCgkcnVuLT5yUHItPmIpICYmICFpc3NldCgkcnVuLT5yUHItPmJbInZhbCJdKSkgKSB7CgkJCQkJCSRvYmpUZXh0LT5nZXRGb250KCktPnNldEJvbGQodHJ1ZSk7CgkJCQkJfQoKCQkJCQlpZiAoIChpc3NldCgkcnVuLT5yUHItPmlbInZhbCJdKSAmJiAoKHN0cmluZykgJHJ1bi0+clByLT5pWyJ2YWwiXSA9PSAndHJ1ZScgfHwgKHN0cmluZykgJHJ1bi0+clByLT5pWyJ2YWwiXSA9PSAnMScpKQoJCQkJCSAgICAgfHwgKGlzc2V0KCRydW4tPnJQci0+aSkgJiYgIWlzc2V0KCRydW4tPnJQci0+aVsidmFsIl0pKSApIHsKCQkJCQkJJG9ialRleHQtPmdldEZvbnQoKS0+c2V0SXRhbGljKHRydWUpOwoJCQkJCX0KCgkJCQkJaWYgKGlzc2V0KCRydW4tPnJQci0+dmVydEFsaWduKSAmJiBpc3NldCgkcnVuLT5yUHItPnZlcnRBbGlnblsidmFsIl0pKSB7CgkJCQkJCSR2ZXJ0QWxpZ24gPSBzdHJ0b2xvd2VyKChzdHJpbmcpJHJ1bi0+clByLT52ZXJ0QWxpZ25bInZhbCJdKTsKCQkJCQkJaWYgKCR2ZXJ0QWxpZ24gPT0gJ3N1cGVyc2NyaXB0JykgewoJCQkJCQkJJG9ialRleHQtPmdldEZvbnQoKS0+c2V0U3VwZXJTY3JpcHQodHJ1ZSk7CgkJCQkJCX0KCQkJCQkJaWYgKCR2ZXJ0QWxpZ24gPT0gJ3N1YnNjcmlwdCcpIHsKCQkJCQkJCSRvYmpUZXh0LT5nZXRGb250KCktPnNldFN1YlNjcmlwdCh0cnVlKTsKCQkJCQkJfQoJCQkJCX0KCgkJCQkJaWYgKGlzc2V0KCRydW4tPnJQci0+dSkgJiYgIWlzc2V0KCRydW4tPnJQci0+dVsidmFsIl0pKSB7CgkJCQkJCSRvYmpUZXh0LT5nZXRGb250KCktPnNldFVuZGVybGluZShQSFBFeGNlbF9TdHlsZV9Gb250OjpVTkRFUkxJTkVfU0lOR0xFKTsKCQkJCQl9IGVsc2UgaWYgKGlzc2V0KCRydW4tPnJQci0+dSkgJiYgaXNzZXQoJHJ1bi0+clByLT51WyJ2YWwiXSkpIHsKCQkJCQkJJG9ialRleHQtPmdldEZvbnQoKS0+c2V0VW5kZXJsaW5lKChzdHJpbmcpJHJ1bi0+clByLT51WyJ2YWwiXSk7CgkJCQkJfQoKCQkJCQlpZiAoIChpc3NldCgkcnVuLT5yUHItPnN0cmlrZVsidmFsIl0pICAmJiAoKHN0cmluZykgJHJ1bi0+clByLT5zdHJpa2VbInZhbCJdID09ICd0cnVlJyB8fCAoc3RyaW5nKSAkcnVuLT5yUHItPnN0cmlrZVsidmFsIl0gPT0gJzEnKSkKCQkJCQkgICAgIHx8IChpc3NldCgkcnVuLT5yUHItPnN0cmlrZSkgJiYgIWlzc2V0KCRydW4tPnJQci0+c3RyaWtlWyJ2YWwiXSkpICkgewoJCQkJCQkkb2JqVGV4dC0+Z2V0Rm9udCgpLT5zZXRTdHJpa2V0aHJvdWdoKHRydWUpOwoJCQkJCX0KCQkJCX0KCQkJfQoJCX0KCgkJcmV0dXJuICR2YWx1ZTsKCX0KCg0KCXByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGFycmF5X2l0ZW0oJGFycmF5LCAka2V5ID0gMCkgewoJCXJldHVybiAoaXNzZXQoJGFycmF5WyRrZXldKSA/ICRhcnJheVska2V5XSA6IG51bGwpOwoJfQoKDQoJcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gZGlyX2FkZCgkYmFzZSwgJGFkZCkgewoJCXJldHVybiBwcmVnX3JlcGxhY2UoJ35bXi9dKy9cLlwuL34nLCAnJywgZGlybmFtZSgkYmFzZSkgLiAiLyRhZGQiKTsKCX0KCg0KCXByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIHRvQ1NTQXJyYXkoJHN0eWxlKSB7CgkJJHN0eWxlID0gc3RyX3JlcGxhY2UoYXJyYXkoIlxyIiwiXG4iKSwgIiIsICRzdHlsZSk7CgoJCSR0ZW1wID0gZXhwbG9kZSgnOycsICRzdHlsZSk7CgkJJHN0eWxlID0gYXJyYXkoKTsKCQlmb3JlYWNoICgkdGVtcCBhcyAkaXRlbSkgewoJCQkkaXRlbSA9IGV4cGxvZGUoJzonLCAkaXRlbSk7CgoJCQlpZiAoc3RycG9zKCRpdGVtWzFdLCAncHgnKSAhPT0gZmFsc2UpIHsKCQkJCSRpdGVtWzFdID0gc3RyX3JlcGxhY2UoJ3B4JywgJycsICRpdGVtWzFdKTsKCQkJfQoJCQlpZiAoc3RycG9zKCRpdGVtWzFdLCAncHQnKSAhPT0gZmFsc2UpIHsKCQkJCSRpdGVtWzFdID0gc3RyX3JlcGxhY2UoJ3B0JywgJycsICRpdGVtWzFdKTsKCQkJCSRpdGVtWzFdID0gUEhQRXhjZWxfU2hhcmVkX0ZvbnQ6OmZvbnRTaXplVG9QaXhlbHMoJGl0ZW1bMV0pOwoJCQl9CgkJCWlmIChzdHJwb3MoJGl0ZW1bMV0sICdpbicpICE9PSBmYWxzZSkgewoJCQkJJGl0ZW1bMV0gPSBzdHJfcmVwbGFjZSgnaW4nLCAnJywgJGl0ZW1bMV0pOwoJCQkJJGl0ZW1bMV0gPSBQSFBFeGNlbF9TaGFyZWRfRm9udDo6aW5jaFNpemVUb1BpeGVscygkaXRlbVsxXSk7CgkJCX0KCQkJaWYgKHN0cnBvcygkaXRlbVsxXSwgJ2NtJykgIT09IGZhbHNlKSB7CgkJCQkkaXRlbVsxXSA9IHN0cl9yZXBsYWNlKCdjbScsICcnLCAkaXRlbVsxXSk7CgkJCQkkaXRlbVsxXSA9IFBIUEV4Y2VsX1NoYXJlZF9Gb250OjpjZW50aW1ldGVyU2l6ZVRvUGl4ZWxzKCRpdGVtWzFdKTsKCQkJfQoKCQkJJHN0eWxlWyRpdGVtWzBdXSA9ICRpdGVtWzFdOwoJCX0KCgkJcmV0dXJuICRzdHlsZTsKCX0KfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Reader/Excel2007/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Reader/Excel2007/Chart.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIFBIUEV4Y2VsCiAqCiAqIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICoKICogQGNhdGVnb3J5CVBIUEV4Y2VsCiAqIEBwYWNrYWdlCQlQSFBFeGNlbF9SZWFkZXJfRXhjZWw1CiAqIEBjb3B5cmlnaHQJQ29weXJpZ2h0IChjKSAyMDA2IC0gMjAxMiBQSFBFeGNlbCAoaHR0cDovL3d3dy5jb2RlcGxleC5jb20vUEhQRXhjZWwpCiAqIEBsaWNlbnNlCQlodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvb2xkLWxpY2Vuc2VzL2xncGwtMi4xLnR4dAlMR1BMCiAqIEB2ZXJzaW9uCQkxLjcuNywgMjAxMi0wNS0xOQogKi8KCi8qKgogKiBQSFBFeGNlbF9SZWFkZXJfRXhjZWwyMDA3X0NoYXJ0CiAqCiAqIEBjYXRlZ29yeQlQSFBFeGNlbAogKiBAcGFja2FnZQkJUEhQRXhjZWxfUmVhZGVyX0V4Y2VsMjAwNwogKiBAY29weXJpZ2h0CUNvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwgKGh0dHA6Ly93d3cuY29kZXBsZXguY29tL1BIUEV4Y2VsKQogKi8KY2xhc3MgUEhQRXhjZWxfUmVhZGVyX0V4Y2VsMjAwN19DaGFydAp7Cglwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBfZ2V0QXR0cmlidXRlKCRjb21wb25lbnQsICRuYW1lLCAkZm9ybWF0KSB7CgkJJGF0dHJpYnV0ZXMgPSAkY29tcG9uZW50LT5hdHRyaWJ1dGVzKCk7CgkJaWYgKGlzc2V0KCRhdHRyaWJ1dGVzWyRuYW1lXSkpIHsKCQkJaWYgKCRmb3JtYXQgPT0gJ3N0cmluZycpIHsKCQkJCXJldHVybiAoc3RyaW5nKSAkYXR0cmlidXRlc1skbmFtZV07CgkJCX0gZWxzZWlmICgkZm9ybWF0ID09ICdpbnRlZ2VyJykgewoJCQkJcmV0dXJuIChpbnRlZ2VyKSAkYXR0cmlidXRlc1skbmFtZV07CgkJCX0gZWxzZWlmICgkZm9ybWF0ID09ICdib29sZWFuJykgewoJCQkJcmV0dXJuIChib29sZWFuKSAoJGF0dHJpYnV0ZXNbJG5hbWVdID09ICcwJykgPyBmYWxzZSA6IHRydWU7CgkJCX0gZWxzZSB7CgkJCQlyZXR1cm4gKGZsb2F0KSAkYXR0cmlidXRlc1skbmFtZV07CgkJCX0KCQl9CgkJcmV0dXJuIG51bGw7Cgl9CS8vCWZ1bmN0aW9uIF9nZXRBdHRyaWJ1dGUoKQoKCglwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBfcmVhZENvbG9yKCRjb2xvciwkYmFja2dyb3VuZD1mYWxzZSkgewoJCWlmIChpc3NldCgkY29sb3JbInJnYiJdKSkgewoJCQlyZXR1cm4gKHN0cmluZykkY29sb3JbInJnYiJdOwoJCX0gZWxzZSBpZiAoaXNzZXQoJGNvbG9yWyJpbmRleGVkIl0pKSB7CgkJCXJldHVybiBQSFBFeGNlbF9TdHlsZV9Db2xvcjo6aW5kZXhlZENvbG9yKCRjb2xvclsiaW5kZXhlZCJdLTcsJGJhY2tncm91bmQpLT5nZXRBUkdCKCk7CgkJfQoJfQoKCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHJlYWRDaGFydCgkY2hhcnRFbGVtZW50cywkY2hhcnROYW1lKSB7CgkJJG5hbWVzcGFjZXNDaGFydE1ldGEgPSAkY2hhcnRFbGVtZW50cy0+Z2V0TmFtZXNwYWNlcyh0cnVlKTsKCQkkY2hhcnRFbGVtZW50c0MgPSAkY2hhcnRFbGVtZW50cy0+Y2hpbGRyZW4oJG5hbWVzcGFjZXNDaGFydE1ldGFbJ2MnXSk7CgoJCSRYYXhpc0xhYmVsID0gJFlheGlzTGFiZWwgPSAkbGVnZW5kID0gJHRpdGxlID0gbnVsbDsKCgkJZm9yZWFjaCgkY2hhcnRFbGVtZW50c0MgYXMgJGNoYXJ0RWxlbWVudEtleSA9PiAkY2hhcnRFbGVtZW50KSB7CgkJCXN3aXRjaCAoJGNoYXJ0RWxlbWVudEtleSkgewoJCQkJY2FzZSAiY2hhcnQiOgoJCQkJCWZvcmVhY2goJGNoYXJ0RWxlbWVudCBhcyAkY2hhcnREZXRhaWxzS2V5ID0+ICRjaGFydERldGFpbHMpIHsKCQkJCQkJJGNoYXJ0RGV0YWlsc0MgPSAkY2hhcnREZXRhaWxzLT5jaGlsZHJlbigkbmFtZXNwYWNlc0NoYXJ0TWV0YVsnYyddKTsKCQkJCQkJc3dpdGNoICgkY2hhcnREZXRhaWxzS2V5KSB7CgkJCQkJCQljYXNlICJwbG90QXJlYSI6CgkJCQkJCQkJCSRwbG90QXJlYUxheW91dCA9ICRYYXhpc0xhYmxlID0gJFlheGlzTGFibGUgPSBudWxsOwoJCQkJCQkJCQkkcGxvdFNlcmllcyA9IGFycmF5KCk7CgkJCQkJCQkJCWZvcmVhY2goJGNoYXJ0RGV0YWlscyBhcyAkY2hhcnREZXRhaWxLZXkgPT4gJGNoYXJ0RGV0YWlsKSB7CgkJCQkJCQkJCQlzd2l0Y2ggKCRjaGFydERldGFpbEtleSkgewoJCQkJCQkJCQkJCWNhc2UgImxheW91dCI6CgkJCQkJCQkJCQkJCSRwbG90QXJlYUxheW91dCA9IHNlbGY6Ol9jaGFydExheW91dERldGFpbHMoJGNoYXJ0RGV0YWlsLCRuYW1lc3BhY2VzQ2hhcnRNZXRhLCdwbG90QXJlYScpOwoJCQkJCQkJCQkJCQlicmVhazsKCQkJCQkJCQkJCQljYXNlICJjYXRBeCI6CgkJCQkJCQkJCQkJCWlmIChpc3NldCgkY2hhcnREZXRhaWwtPnRpdGxlKSkgewoJCQkJCQkJCQkJCQkJJFhheGlzTGFiZWwgPSBzZWxmOjpfY2hhcnRUaXRsZSgkY2hhcnREZXRhaWwtPnRpdGxlLT5jaGlsZHJlbigkbmFtZXNwYWNlc0NoYXJ0TWV0YVsnYyddKSwkbmFtZXNwYWNlc0NoYXJ0TWV0YSwnY2F0Jyk7CgkJCQkJCQkJCQkJCX0KCQkJCQkJCQkJCQkJYnJlYWs7CgkJCQkJCQkJCQkJY2FzZSAiZGF0ZUF4IjoKCQkJCQkJCQkJCQkJaWYgKGlzc2V0KCRjaGFydERldGFpbC0+dGl0bGUpKSB7CgkJCQkJCQkJCQkJCQkkWGF4aXNMYWJlbCA9IHNlbGY6Ol9jaGFydFRpdGxlKCRjaGFydERldGFpbC0+dGl0bGUtPmNoaWxkcmVuKCRuYW1lc3BhY2VzQ2hhcnRNZXRhWydjJ10pLCRuYW1lc3BhY2VzQ2hhcnRNZXRhLCdjYXQnKTsKCQkJCQkJCQkJCQkJfQoJCQkJCQkJCQkJCQlicmVhazsKCQkJCQkJCQkJCQljYXNlICJ2YWxBeCI6CgkJCQkJCQkJCQkJCWlmIChpc3NldCgkY2hhcnREZXRhaWwtPnRpdGxlKSkgewoJCQkJCQkJCQkJCQkJJFlheGlzTGFiZWwgPSBzZWxmOjpfY2hhcnRUaXRsZSgkY2hhcnREZXRhaWwtPnRpdGxlLT5jaGlsZHJlbigkbmFtZXNwYWNlc0NoYXJ0TWV0YVsnYyddKSwkbmFtZXNwYWNlc0NoYXJ0TWV0YSwnY2F0Jyk7CgkJCQkJCQkJCQkJCX0KCQkJCQkJCQkJCQkJYnJlYWs7CgkJCQkJCQkJCQkJY2FzZSAiYmFyQ2hhcnQiOgoJCQkJCQkJCQkJCWNhc2UgImJhcjNEQ2hhcnQiOgoJCQkJCQkJCQkJCQkkYmFyRGlyZWN0aW9uID0gc2VsZjo6X2dldEF0dHJpYnV0ZSgkY2hhcnREZXRhaWwtPmJhckRpciwgJ3ZhbCcsICdzdHJpbmcnKTsKCQkJCQkJCQkJCQkJJHBsb3RTZXIgPSBzZWxmOjpfY2hhcnREYXRhU2VyaWVzKCRjaGFydERldGFpbCwkbmFtZXNwYWNlc0NoYXJ0TWV0YSwkY2hhcnREZXRhaWxLZXkpOwoJCQkJCQkJCQkJCQkkcGxvdFNlci0+c2V0UGxvdERpcmVjdGlvbigkYmFyRGlyZWN0aW9uKTsKCQkJCQkJCQkJCQkJJHBsb3RTZXJpZXNbXSA9ICRwbG90U2VyOwoJCQkJCQkJCQkJCQlicmVhazsKCQkJCQkJCQkJCQljYXNlICJsaW5lQ2hhcnQiOgoJCQkJCQkJCQkJCWNhc2UgImxpbmUzRENoYXJ0IjoKCQkJCQkJCQkJCQkJJHBsb3RTZXJpZXNbXSA9IHNlbGY6Ol9jaGFydERhdGFTZXJpZXMoJGNoYXJ0RGV0YWlsLCRuYW1lc3BhY2VzQ2hhcnRNZXRhLCRjaGFydERldGFpbEtleSk7CgkJCQkJCQkJCQkJCWJyZWFrOwoJCQkJCQkJCQkJCWNhc2UgImFyZWFDaGFydCI6CgkJCQkJCQkJCQkJY2FzZSAiYXJlYTNEQ2hhcnQiOgoJCQkJCQkJCQkJCQkkcGxvdFNlcmllc1tdID0gc2VsZjo6X2NoYXJ0RGF0YVNlcmllcygkY2hhcnREZXRhaWwsJG5hbWVzcGFjZXNDaGFydE1ldGEsJGNoYXJ0RGV0YWlsS2V5KTsKCQkJCQkJCQkJCQkJYnJlYWs7CgkJCQkJCQkJCQkJY2FzZSAiZG91Z2hudXRDaGFydCI6CgkJCQkJCQkJCQkJY2FzZSAicGllQ2hhcnQiOgoJCQkJCQkJCQkJCWNhc2UgInBpZTNEQ2hhcnQiOgoJCQkJCQkJCQkJCQkkZXhwbG9zaW9uID0gaXNzZXQoJGNoYXJ0RGV0YWlsLT5zZXItPmV4cGxvc2lvbik7CgkJCQkJCQkJCQkJCSRwbG90U2VyID0gc2VsZjo6X2NoYXJ0RGF0YVNlcmllcygkY2hhcnREZXRhaWwsJG5hbWVzcGFjZXNDaGFydE1ldGEsJGNoYXJ0RGV0YWlsS2V5KTsKCQkJCQkJCQkJCQkJJHBsb3RTZXItPnNldFBsb3RTdHlsZSgkZXhwbG9zaW9uKTsKCQkJCQkJCQkJCQkJJHBsb3RTZXJpZXNbXSA9ICRwbG90U2VyOwoJCQkJCQkJCQkJCQlicmVhazsKCQkJCQkJCQkJCQljYXNlICJzY2F0dGVyQ2hhcnQiOgoJCQkJCQkJCQkJCQkkc2NhdHRlclN0eWxlID0gc2VsZjo6X2dldEF0dHJpYnV0ZSgkY2hhcnREZXRhaWwtPnNjYXR0ZXJTdHlsZSwgJ3ZhbCcsICdzdHJpbmcnKTsKCQkJCQkJCQkJCQkJJHBsb3RTZXIgPSBzZWxmOjpfY2hhcnREYXRhU2VyaWVzKCRjaGFydERldGFpbCwkbmFtZXNwYWNlc0NoYXJ0TWV0YSwkY2hhcnREZXRhaWxLZXkpOwoJCQkJCQkJCQkJCQkkcGxvdFNlci0+c2V0UGxvdFN0eWxlKCRzY2F0dGVyU3R5bGUpOwoJCQkJCQkJCQkJCQkkcGxvdFNlcmllc1tdID0gJHBsb3RTZXI7CgkJCQkJCQkJCQkJCWJyZWFrOwoJCQkJCQkJCQkJCWNhc2UgImJ1YmJsZUNoYXJ0IjoKCQkJCQkJCQkJCQkJJGJ1YmJsZVNjYWxlID0gc2VsZjo6X2dldEF0dHJpYnV0ZSgkY2hhcnREZXRhaWwtPmJ1YmJsZVNjYWxlLCAndmFsJywgJ2ludGVnZXInKTsKCQkJCQkJCQkJCQkJJHBsb3RTZXIgPSBzZWxmOjpfY2hhcnREYXRhU2VyaWVzKCRjaGFydERldGFpbCwkbmFtZXNwYWNlc0NoYXJ0TWV0YSwkY2hhcnREZXRhaWxLZXkpOwoJCQkJCQkJCQkJCQkkcGxvdFNlci0+c2V0UGxvdFN0eWxlKCRidWJibGVTY2FsZSk7CgkJCQkJCQkJCQkJCSRwbG90U2VyaWVzW10gPSAkcGxvdFNlcjsKCQkJCQkJCQkJCQkJYnJlYWs7CgkJCQkJCQkJCQkJY2FzZSAicmFkYXJDaGFydCI6CgkJCQkJCQkJCQkJCSRyYWRhclN0eWxlID0gc2VsZjo6X2dldEF0dHJpYnV0ZSgkY2hhcnREZXRhaWwtPnJhZGFyU3R5bGUsICd2YWwnLCAnc3RyaW5nJyk7CgkJCQkJCQkJCQkJCSRwbG90U2VyID0gc2VsZjo6X2NoYXJ0RGF0YVNlcmllcygkY2hhcnREZXRhaWwsJG5hbWVzcGFjZXNDaGFydE1ldGEsJGNoYXJ0RGV0YWlsS2V5KTsKCQkJCQkJCQkJCQkJJHBsb3RTZXItPnNldFBsb3RTdHlsZSgkcmFkYXJTdHlsZSk7CgkJCQkJCQkJCQkJCSRwbG90U2VyaWVzW10gPSAkcGxvdFNlcjsKCQkJCQkJCQkJCQkJYnJlYWs7CgkJCQkJCQkJCQkJY2FzZSAic3VyZmFjZUNoYXJ0IjoKCQkJCQkJCQkJCQljYXNlICJzdXJmYWNlM0RDaGFydCI6CgkJCQkJCQkJCQkJCSR3aXJlRnJhbWUgPSBzZWxmOjpfZ2V0QXR0cmlidXRlKCRjaGFydERldGFpbC0+d2lyZWZyYW1lLCAndmFsJywgJ2Jvb2xlYW4nKTsKCQkJCQkJCQkJCQkJJHBsb3RTZXIgPSBzZWxmOjpfY2hhcnREYXRhU2VyaWVzKCRjaGFydERldGFpbCwkbmFtZXNwYWNlc0NoYXJ0TWV0YSwkY2hhcnREZXRhaWxLZXkpOwoJCQkJCQkJCQkJCQkkcGxvdFNlci0+c2V0UGxvdFN0eWxlKCR3aXJlRnJhbWUpOwoJCQkJCQkJCQkJCQkkcGxvdFNlcmllc1tdID0gJHBsb3RTZXI7CgkJCQkJCQkJCQkJCWJyZWFrOwoJCQkJCQkJCQkJCWNhc2UgInN0b2NrQ2hhcnQiOgoJCQkJCQkJCQkJCQkkcGxvdFNlcmllc1tdID0gc2VsZjo6X2NoYXJ0RGF0YVNlcmllcygkY2hhcnREZXRhaWwsJG5hbWVzcGFjZXNDaGFydE1ldGEsJGNoYXJ0RGV0YWlsS2V5KTsKCQkJCQkJCQkJCQkJYnJlYWs7CgkJCQkJCQkJCQl9CgkJCQkJCQkJCX0KCQkJCQkJCQkJJHBsb3RBcmVhID0gbmV3IFBIUEV4Y2VsX0NoYXJ0X1Bsb3RBcmVhKCRwbG90QXJlYUxheW91dCwkcGxvdFNlcmllcyk7CgkJCQkJCQkJCWJyZWFrOwoJCQkJCQkJY2FzZSAicGxvdFZpc09ubHkiOgoJCQkJCQkJCQkkcGxvdFZpc09ubHkgPSBzZWxmOjpfZ2V0QXR0cmlidXRlKCRjaGFydERldGFpbHMsICd2YWwnLCAnc3RyaW5nJyk7CgkJCQkJCQkJCWJyZWFrOwoJCQkJCQkJY2FzZSAiZGlzcEJsYW5rc0FzIjoKCQkJCQkJCQkJJGRpc3BCbGFua3NBcyA9IHNlbGY6Ol9nZXRBdHRyaWJ1dGUoJGNoYXJ0RGV0YWlscywgJ3ZhbCcsICdzdHJpbmcnKTsKCQkJCQkJCQkJYnJlYWs7CgkJCQkJCQljYXNlICJ0aXRsZSI6CgkJCQkJCQkJCSR0aXRsZSA9IHNlbGY6Ol9jaGFydFRpdGxlKCRjaGFydERldGFpbHMsJG5hbWVzcGFjZXNDaGFydE1ldGEsJ3RpdGxlJyk7CgkJCQkJCQkJCWJyZWFrOwoJCQkJCQkJY2FzZSAibGVnZW5kIjoKCQkJCQkJCQkJJGxlZ2VuZFBvcyA9ICdyJzsKCQkJCQkJCQkJJGxlZ2VuZExheW91dCA9IG51bGw7CgkJCQkJCQkJCSRsZWdlbmRPdmVybGF5ID0gZmFsc2U7CgkJCQkJCQkJCWZvcmVhY2goJGNoYXJ0RGV0YWlscyBhcyAkY2hhcnREZXRhaWxLZXkgPT4gJGNoYXJ0RGV0YWlsKSB7CgkJCQkJCQkJCQlzd2l0Y2ggKCRjaGFydERldGFpbEtleSkgewoJCQkJCQkJCQkJCWNhc2UgImxlZ2VuZFBvcyI6CgkJCQkJCQkJCQkJCSRsZWdlbmRQb3MgPSBzZWxmOjpfZ2V0QXR0cmlidXRlKCRjaGFydERldGFpbCwgJ3ZhbCcsICdzdHJpbmcnKTsKCQkJCQkJCQkJCQkJYnJlYWs7CgkJCQkJCQkJCQkJY2FzZSAib3ZlcmxheSI6CgkJCQkJCQkJCQkJCSRsZWdlbmRPdmVybGF5ID0gc2VsZjo6X2dldEF0dHJpYnV0ZSgkY2hhcnREZXRhaWwsICd2YWwnLCAnYm9vbGVhbicpOwoJCQkJCQkJCQkJCQlicmVhazsKCQkJCQkJCQkJCQljYXNlICJsYXlvdXQiOgoJCQkJCQkJCQkJCQkkbGVnZW5kTGF5b3V0ID0gc2VsZjo6X2NoYXJ0TGF5b3V0RGV0YWlscygkY2hhcnREZXRhaWwsJG5hbWVzcGFjZXNDaGFydE1ldGEsJ2xlZ2VuZCcpOwoJCQkJCQkJCQkJCQlicmVhazsKCQkJCQkJCQkJCX0KCQkJCQkJCQkJfQoJCQkJCQkJCQkkbGVnZW5kID0gbmV3IFBIUEV4Y2VsX0NoYXJ0X0xlZ2VuZCgkbGVnZW5kUG9zLCAkbGVnZW5kTGF5b3V0LCAkbGVnZW5kT3ZlcmxheSk7CgkJCQkJCQkJCWJyZWFrOwoJCQkJCQl9CgkJCQkJfQoJCQl9CgkJfQoJCSRjaGFydCA9IG5ldyBQSFBFeGNlbF9DaGFydCgkY2hhcnROYW1lLCR0aXRsZSwkbGVnZW5kLCRwbG90QXJlYSwkcGxvdFZpc09ubHksJGRpc3BCbGFua3NBcywkWGF4aXNMYWJlbCwkWWF4aXNMYWJlbCk7CgoJCXJldHVybiAkY2hhcnQ7Cgl9CS8vCWZ1bmN0aW9uIHJlYWRDaGFydCgpCgoKCXByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIF9jaGFydFRpdGxlKCR0aXRsZURldGFpbHMsJG5hbWVzcGFjZXNDaGFydE1ldGEsJHR5cGUpIHsKCQkkY2FwdGlvbiA9IGFycmF5KCk7CgkJJHRpdGxlTGF5b3V0ID0gbnVsbDsKCQlmb3JlYWNoKCR0aXRsZURldGFpbHMgYXMgJHRpdGxlRGV0YWlsS2V5ID0+ICRjaGFydERldGFpbCkgewoJCQlzd2l0Y2ggKCR0aXRsZURldGFpbEtleSkgewoJCQkJY2FzZSAidHgiOgoJCQkJCSR0aXRsZURldGFpbHMgPSAkY2hhcnREZXRhaWwtPnJpY2gtPmNoaWxkcmVuKCRuYW1lc3BhY2VzQ2hhcnRNZXRhWydhJ10pOwoJCQkJCWZvcmVhY2goJHRpdGxlRGV0YWlscyBhcyAkdGl0bGVLZXkgPT4gJHRpdGxlRGV0YWlsKSB7CgkJCQkJCXN3aXRjaCAoJHRpdGxlS2V5KSB7CgkJCQkJCQljYXNlICJwIjoKCQkJCQkJCQkkdGl0bGVEZXRhaWxQYXJ0ID0gJHRpdGxlRGV0YWlsLT5jaGlsZHJlbigkbmFtZXNwYWNlc0NoYXJ0TWV0YVsnYSddKTsKCQkJCQkJCQkkY2FwdGlvbltdID0gc2VsZjo6X3BhcnNlUmljaFRleHQoJHRpdGxlRGV0YWlsUGFydCk7CgkJCQkJCX0KCQkJCQl9CgkJCQkJYnJlYWs7CgkJCQljYXNlICJsYXlvdXQiOgoJCQkJCSR0aXRsZUxheW91dCA9IHNlbGY6Ol9jaGFydExheW91dERldGFpbHMoJGNoYXJ0RGV0YWlsLCRuYW1lc3BhY2VzQ2hhcnRNZXRhKTsKCQkJCQlicmVhazsKCQkJfQoJCX0KCgkJcmV0dXJuIG5ldyBQSFBFeGNlbF9DaGFydF9UaXRsZSgkY2FwdGlvbiwgJHRpdGxlTGF5b3V0KTsKCX0JLy8JZnVuY3Rpb24gX2NoYXJ0VGl0bGUoKQoKCglwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBfY2hhcnRMYXlvdXREZXRhaWxzKCRjaGFydERldGFpbCwkbmFtZXNwYWNlc0NoYXJ0TWV0YSkgewoJCWlmICghaXNzZXQoJGNoYXJ0RGV0YWlsLT5tYW51YWxMYXlvdXQpKSB7CgkJCXJldHVybiBudWxsOwoJCX0KCQkkZGV0YWlscyA9ICRjaGFydERldGFpbC0+bWFudWFsTGF5b3V0LT5jaGlsZHJlbigkbmFtZXNwYWNlc0NoYXJ0TWV0YVsnYyddKTsKCQlpZiAoaXNfbnVsbCgkZGV0YWlscykpIHsKCQkJcmV0dXJuIG51bGw7CgkJfQoJCSRsYXlvdXQgPSBhcnJheSgpOwoJCWZvcmVhY2goJGRldGFpbHMgYXMgJGRldGFpbEtleSA9PiAkZGV0YWlsKSB7Ci8vCQkJZWNobyAkZGV0YWlsS2V5LCcgPT4gJyxzZWxmOjpfZ2V0QXR0cmlidXRlKCRkZXRhaWwsICd2YWwnLCAnc3RyaW5nJyksJzxiciAvPic7CgkJCSRsYXlvdXRbJGRldGFpbEtleV0gPSBzZWxmOjpfZ2V0QXR0cmlidXRlKCRkZXRhaWwsICd2YWwnLCAnc3RyaW5nJyk7CgkJfQoJCXJldHVybiBuZXcgUEhQRXhjZWxfQ2hhcnRfTGF5b3V0KCRsYXlvdXQpOwoJfQkvLwlmdW5jdGlvbiBfY2hhcnRMYXlvdXREZXRhaWxzKCkKCgoJcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gX2NoYXJ0RGF0YVNlcmllcygkY2hhcnREZXRhaWwsJG5hbWVzcGFjZXNDaGFydE1ldGEsJHBsb3RUeXBlKSB7CgkJJG11bHRpU2VyaWVzVHlwZSA9IE5VTEw7CgkJJHNtb290aExpbmUgPSBmYWxzZTsKCQkkc2VyaWVzTGFiZWwgPSAkc2VyaWVzQ2F0ZWdvcnkgPSAkc2VyaWVzVmFsdWVzID0gJHBsb3RPcmRlciA9IGFycmF5KCk7CgoJCSRzZXJpZXNEZXRhaWxTZXQgPSAkY2hhcnREZXRhaWwtPmNoaWxkcmVuKCRuYW1lc3BhY2VzQ2hhcnRNZXRhWydjJ10pOwoJCWZvcmVhY2goJHNlcmllc0RldGFpbFNldCBhcyAkc2VyaWVzRGV0YWlsS2V5ID0+ICRzZXJpZXNEZXRhaWxzKSB7CgkJCXN3aXRjaCAoJHNlcmllc0RldGFpbEtleSkgewoJCQkJY2FzZSAiZ3JvdXBpbmciOgoJCQkJCSRtdWx0aVNlcmllc1R5cGUgPSBzZWxmOjpfZ2V0QXR0cmlidXRlKCRjaGFydERldGFpbC0+Z3JvdXBpbmcsICd2YWwnLCAnc3RyaW5nJyk7CgkJCQkJYnJlYWs7CgkJCQljYXNlICJzZXIiOgoJCQkJCSRtYXJrZXIgPSBOVUxMOwoJCQkJCWZvcmVhY2goJHNlcmllc0RldGFpbHMgYXMgJHNlcmllc0tleSA9PiAkc2VyaWVzRGV0YWlsKSB7CgkJCQkJCXN3aXRjaCAoJHNlcmllc0tleSkgewoJCQkJCQkJY2FzZSAiaWR4IjoKCQkJCQkJCQkkc2VyaWVzSW5kZXggPSBzZWxmOjpfZ2V0QXR0cmlidXRlKCRzZXJpZXNEZXRhaWwsICd2YWwnLCAnaW50ZWdlcicpOwoJCQkJCQkJCWJyZWFrOwoJCQkJCQkJY2FzZSAib3JkZXIiOgoJCQkJCQkJCSRzZXJpZXNPcmRlciA9IHNlbGY6Ol9nZXRBdHRyaWJ1dGUoJHNlcmllc0RldGFpbCwgJ3ZhbCcsICdpbnRlZ2VyJyk7CgkJCQkJCQkJJHBsb3RPcmRlclskc2VyaWVzSW5kZXhdID0gJHNlcmllc09yZGVyOwoJCQkJCQkJCWJyZWFrOwoJCQkJCQkJY2FzZSAidHgiOgoJCQkJCQkJCSRzZXJpZXNMYWJlbFskc2VyaWVzSW5kZXhdID0gc2VsZjo6X2NoYXJ0RGF0YVNlcmllc1ZhbHVlU2V0KCRzZXJpZXNEZXRhaWwsJG5hbWVzcGFjZXNDaGFydE1ldGEpOwoJCQkJCQkJCWJyZWFrOwoJCQkJCQkJY2FzZSAibWFya2VyIjoKCQkJCQkJCQkkbWFya2VyID0gc2VsZjo6X2dldEF0dHJpYnV0ZSgkc2VyaWVzRGV0YWlsLT5zeW1ib2wsICd2YWwnLCAnc3RyaW5nJyk7CgkJCQkJCQkJYnJlYWs7CgkJCQkJCQljYXNlICJzbW9vdGgiOgoJCQkJCQkJCSRzbW9vdGhMaW5lID0gc2VsZjo6X2dldEF0dHJpYnV0ZSgkc2VyaWVzRGV0YWlsLCAndmFsJywgJ2Jvb2xlYW4nKTsKCQkJCQkJCQlicmVhazsKCQkJCQkJCWNhc2UgImNhdCI6CgkJCQkJCQkJJHNlcmllc0NhdGVnb3J5WyRzZXJpZXNJbmRleF0gPSBzZWxmOjpfY2hhcnREYXRhU2VyaWVzVmFsdWVTZXQoJHNlcmllc0RldGFpbCwkbmFtZXNwYWNlc0NoYXJ0TWV0YSk7CgkJCQkJCQkJYnJlYWs7CgkJCQkJCQljYXNlICJ2YWwiOgoJCQkJCQkJCSRzZXJpZXNWYWx1ZXNbJHNlcmllc0luZGV4XSA9IHNlbGY6Ol9jaGFydERhdGFTZXJpZXNWYWx1ZVNldCgkc2VyaWVzRGV0YWlsLCRuYW1lc3BhY2VzQ2hhcnRNZXRhLCRtYXJrZXIpOwoJCQkJCQkJCWJyZWFrOwoJCQkJCQkJY2FzZSAieFZhbCI6CgkJCQkJCQkJJHNlcmllc0NhdGVnb3J5WyRzZXJpZXNJbmRleF0gPSBzZWxmOjpfY2hhcnREYXRhU2VyaWVzVmFsdWVTZXQoJHNlcmllc0RldGFpbCwkbmFtZXNwYWNlc0NoYXJ0TWV0YSwkbWFya2VyKTsKCQkJCQkJCQlicmVhazsKCQkJCQkJCWNhc2UgInlWYWwiOgoJCQkJCQkJCSRzZXJpZXNWYWx1ZXNbJHNlcmllc0luZGV4XSA9IHNlbGY6Ol9jaGFydERhdGFTZXJpZXNWYWx1ZVNldCgkc2VyaWVzRGV0YWlsLCRuYW1lc3BhY2VzQ2hhcnRNZXRhLCRtYXJrZXIpOwoJCQkJCQkJCWJyZWFrOwoJCQkJCQl9CgkJCQkJfQoJCQl9CgkJfQoJCXJldHVybiBuZXcgUEhQRXhjZWxfQ2hhcnRfRGF0YVNlcmllcygkcGxvdFR5cGUsJG11bHRpU2VyaWVzVHlwZSwkcGxvdE9yZGVyLCRzZXJpZXNMYWJlbCwkc2VyaWVzQ2F0ZWdvcnksJHNlcmllc1ZhbHVlcywkc21vb3RoTGluZSk7Cgl9CS8vCWZ1bmN0aW9uIF9jaGFydERhdGFTZXJpZXMoKQoKCglwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBfY2hhcnREYXRhU2VyaWVzVmFsdWVTZXQoJHNlcmllc0RldGFpbCwgJG5hbWVzcGFjZXNDaGFydE1ldGEsICRtYXJrZXIgPSBudWxsLCAkc21vb3RoTGluZSA9IGZhbHNlKSB7CgkJaWYgKGlzc2V0KCRzZXJpZXNEZXRhaWwtPnN0clJlZikpIHsKCQkJJHNlcmllc1NvdXJjZSA9IChzdHJpbmcpICRzZXJpZXNEZXRhaWwtPnN0clJlZi0+ZjsKCQkJJHNlcmllc0RhdGEgPSBzZWxmOjpfY2hhcnREYXRhU2VyaWVzVmFsdWVzKCRzZXJpZXNEZXRhaWwtPnN0clJlZi0+c3RyQ2FjaGUtPmNoaWxkcmVuKCRuYW1lc3BhY2VzQ2hhcnRNZXRhWydjJ10pLCdzJyk7CgoJCQlyZXR1cm4gbmV3IFBIUEV4Y2VsX0NoYXJ0X0RhdGFTZXJpZXNWYWx1ZXMoJ1N0cmluZycsJHNlcmllc1NvdXJjZSwkc2VyaWVzRGF0YVsnZm9ybWF0Q29kZSddLCRzZXJpZXNEYXRhWydwb2ludENvdW50J10sJHNlcmllc0RhdGFbJ2RhdGFWYWx1ZXMnXSwkbWFya2VyLCRzbW9vdGhMaW5lKTsKCQl9IGVsc2VpZiAoaXNzZXQoJHNlcmllc0RldGFpbC0+bnVtUmVmKSkgewoJCQkkc2VyaWVzU291cmNlID0gKHN0cmluZykgJHNlcmllc0RldGFpbC0+bnVtUmVmLT5mOwoJCQkkc2VyaWVzRGF0YSA9IHNlbGY6Ol9jaGFydERhdGFTZXJpZXNWYWx1ZXMoJHNlcmllc0RldGFpbC0+bnVtUmVmLT5udW1DYWNoZS0+Y2hpbGRyZW4oJG5hbWVzcGFjZXNDaGFydE1ldGFbJ2MnXSkpOwoKCQkJcmV0dXJuIG5ldyBQSFBFeGNlbF9DaGFydF9EYXRhU2VyaWVzVmFsdWVzKCdOdW1iZXInLCRzZXJpZXNTb3VyY2UsJHNlcmllc0RhdGFbJ2Zvcm1hdENvZGUnXSwkc2VyaWVzRGF0YVsncG9pbnRDb3VudCddLCRzZXJpZXNEYXRhWydkYXRhVmFsdWVzJ10sJG1hcmtlciwkc21vb3RoTGluZSk7CgkJfSBlbHNlaWYgKGlzc2V0KCRzZXJpZXNEZXRhaWwtPm11bHRpTHZsU3RyUmVmKSkgewoJCQkkc2VyaWVzU291cmNlID0gKHN0cmluZykgJHNlcmllc0RldGFpbC0+bXVsdGlMdmxTdHJSZWYtPmY7CgkJCSRzZXJpZXNEYXRhID0gc2VsZjo6X2NoYXJ0RGF0YVNlcmllc1ZhbHVlc011bHRpTGV2ZWwoJHNlcmllc0RldGFpbC0+bXVsdGlMdmxTdHJSZWYtPm11bHRpTHZsU3RyQ2FjaGUtPmNoaWxkcmVuKCRuYW1lc3BhY2VzQ2hhcnRNZXRhWydjJ10pLCdzJyk7CgkJCSRzZXJpZXNEYXRhWydwb2ludENvdW50J10gPSBjb3VudCgkc2VyaWVzRGF0YVsnZGF0YVZhbHVlcyddKTsKCgkJCXJldHVybiBuZXcgUEhQRXhjZWxfQ2hhcnRfRGF0YVNlcmllc1ZhbHVlcygnU3RyaW5nJywkc2VyaWVzU291cmNlLCRzZXJpZXNEYXRhWydmb3JtYXRDb2RlJ10sJHNlcmllc0RhdGFbJ3BvaW50Q291bnQnXSwkc2VyaWVzRGF0YVsnZGF0YVZhbHVlcyddLCRtYXJrZXIsJHNtb290aExpbmUpOwoJCX0gZWxzZWlmIChpc3NldCgkc2VyaWVzRGV0YWlsLT5tdWx0aUx2bE51bVJlZikpIHsKCQkJJHNlcmllc1NvdXJjZSA9IChzdHJpbmcpICRzZXJpZXNEZXRhaWwtPm11bHRpTHZsTnVtUmVmLT5mOwoJCQkkc2VyaWVzRGF0YSA9IHNlbGY6Ol9jaGFydERhdGFTZXJpZXNWYWx1ZXNNdWx0aUxldmVsKCRzZXJpZXNEZXRhaWwtPm11bHRpTHZsTnVtUmVmLT5tdWx0aUx2bE51bUNhY2hlLT5jaGlsZHJlbigkbmFtZXNwYWNlc0NoYXJ0TWV0YVsnYyddKSwncycpOwoJCQkkc2VyaWVzRGF0YVsncG9pbnRDb3VudCddID0gY291bnQoJHNlcmllc0RhdGFbJ2RhdGFWYWx1ZXMnXSk7CgoJCQlyZXR1cm4gbmV3IFBIUEV4Y2VsX0NoYXJ0X0RhdGFTZXJpZXNWYWx1ZXMoJ1N0cmluZycsJHNlcmllc1NvdXJjZSwkc2VyaWVzRGF0YVsnZm9ybWF0Q29kZSddLCRzZXJpZXNEYXRhWydwb2ludENvdW50J10sJHNlcmllc0RhdGFbJ2RhdGFWYWx1ZXMnXSwkbWFya2VyLCRzbW9vdGhMaW5lKTsKCQl9CgkJcmV0dXJuIG51bGw7Cgl9CS8vCWZ1bmN0aW9uIF9jaGFydERhdGFTZXJpZXNWYWx1ZVNldCgpCgoKCXByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIF9jaGFydERhdGFTZXJpZXNWYWx1ZXMoJHNlcmllc1ZhbHVlU2V0LCRkYXRhVHlwZT0nbicpIHsKCQkkc2VyaWVzVmFsID0gYXJyYXkoKTsKCQkkZm9ybWF0Q29kZSA9ICcnOwoJCSRwb2ludENvdW50ID0gMDsKCgkJZm9yZWFjaCgkc2VyaWVzVmFsdWVTZXQgYXMgJHNlcmllc1ZhbHVlSWR4ID0+ICRzZXJpZXNWYWx1ZSkgewoJCQlzd2l0Y2ggKCRzZXJpZXNWYWx1ZUlkeCkgewoJCQkJY2FzZSAncHRDb3VudCc6CgkJCQkJJHBvaW50Q291bnQgPSBzZWxmOjpfZ2V0QXR0cmlidXRlKCRzZXJpZXNWYWx1ZSwgJ3ZhbCcsICdpbnRlZ2VyJyk7CgkJCQkJYnJlYWs7CgkJCQljYXNlICdmb3JtYXRDb2RlJzoKCQkJCQkkZm9ybWF0Q29kZSA9IChzdHJpbmcpICRzZXJpZXNWYWx1ZTsKCQkJCQlicmVhazsKCQkJCWNhc2UgJ3B0JzoKCQkJCQkkcG9pbnRWYWwgPSBzZWxmOjpfZ2V0QXR0cmlidXRlKCRzZXJpZXNWYWx1ZSwgJ2lkeCcsICdpbnRlZ2VyJyk7CgkJCQkJaWYgKCRkYXRhVHlwZSA9PSAncycpIHsKCQkJCQkJJHNlcmllc1ZhbFskcG9pbnRWYWxdID0gKHN0cmluZykgJHNlcmllc1ZhbHVlLT52OwoJCQkJCX0gZWxzZSB7CgkJCQkJCSRzZXJpZXNWYWxbJHBvaW50VmFsXSA9IChmbG9hdCkgJHNlcmllc1ZhbHVlLT52OwoJCQkJCX0KCQkJCQlicmVhazsKCQkJfQoJCX0KCgkJcmV0dXJuIGFycmF5KCAnZm9ybWF0Q29kZScJPT4gJGZvcm1hdENvZGUsCgkJCQkJICAncG9pbnRDb3VudCcJPT4gJHBvaW50Q291bnQsCgkJCQkJICAnZGF0YVZhbHVlcycJPT4gJHNlcmllc1ZhbAoJCQkJCSk7Cgl9CS8vCWZ1bmN0aW9uIF9jaGFydERhdGFTZXJpZXNWYWx1ZXMoKQoKCglwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBfY2hhcnREYXRhU2VyaWVzVmFsdWVzTXVsdGlMZXZlbCgkc2VyaWVzVmFsdWVTZXQsJGRhdGFUeXBlPSduJykgewoJCSRzZXJpZXNWYWwgPSBhcnJheSgpOwoJCSRmb3JtYXRDb2RlID0gJyc7CgkJJHBvaW50Q291bnQgPSAwOwoKCQlmb3JlYWNoKCRzZXJpZXNWYWx1ZVNldC0+bHZsIGFzICRzZXJpZXNMZXZlbElkeCA9PiAkc2VyaWVzTGV2ZWwpIHsKCQkJZm9yZWFjaCgkc2VyaWVzTGV2ZWwgYXMgJHNlcmllc1ZhbHVlSWR4ID0+ICRzZXJpZXNWYWx1ZSkgewoJCQkJc3dpdGNoICgkc2VyaWVzVmFsdWVJZHgpIHsKCQkJCQljYXNlICdwdENvdW50JzoKCQkJCQkJJHBvaW50Q291bnQgPSBzZWxmOjpfZ2V0QXR0cmlidXRlKCRzZXJpZXNWYWx1ZSwgJ3ZhbCcsICdpbnRlZ2VyJyk7CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgJ2Zvcm1hdENvZGUnOgoJCQkJCQkkZm9ybWF0Q29kZSA9IChzdHJpbmcpICRzZXJpZXNWYWx1ZTsKCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSAncHQnOgoJCQkJCQkkcG9pbnRWYWwgPSBzZWxmOjpfZ2V0QXR0cmlidXRlKCRzZXJpZXNWYWx1ZSwgJ2lkeCcsICdpbnRlZ2VyJyk7CgkJCQkJCWlmICgkZGF0YVR5cGUgPT0gJ3MnKSB7CgkJCQkJCQkkc2VyaWVzVmFsWyRwb2ludFZhbF1bXSA9IChzdHJpbmcpICRzZXJpZXNWYWx1ZS0+djsKCQkJCQkJfSBlbHNlIHsKCQkJCQkJCSRzZXJpZXNWYWxbJHBvaW50VmFsXVtdID0gKGZsb2F0KSAkc2VyaWVzVmFsdWUtPnY7CgkJCQkJCX0KCQkJCQkJYnJlYWs7CgkJCQl9CgkJCX0KCQl9CgoJCXJldHVybiBhcnJheSggJ2Zvcm1hdENvZGUnCT0+ICRmb3JtYXRDb2RlLAoJCQkJCSAgJ3BvaW50Q291bnQnCT0+ICRwb2ludENvdW50LAoJCQkJCSAgJ2RhdGFWYWx1ZXMnCT0+ICRzZXJpZXNWYWwKCQkJCQkpOwoJfQkvLwlmdW5jdGlvbiBfY2hhcnREYXRhU2VyaWVzVmFsdWVzTXVsdGlMZXZlbCgpCgoJcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gX3BhcnNlUmljaFRleHQoJHRpdGxlRGV0YWlsUGFydCA9IG51bGwpIHsKCQkkdmFsdWUgPSBuZXcgUEhQRXhjZWxfUmljaFRleHQoKTsKCgkJZm9yZWFjaCgkdGl0bGVEZXRhaWxQYXJ0IGFzICR0aXRsZURldGFpbEVsZW1lbnRLZXkgPT4gJHRpdGxlRGV0YWlsRWxlbWVudCkgewoJCQlpZiAoaXNzZXQoJHRpdGxlRGV0YWlsRWxlbWVudC0+dCkpIHsKCQkJCSRvYmpUZXh0ID0gJHZhbHVlLT5jcmVhdGVUZXh0UnVuKCAoc3RyaW5nKSAkdGl0bGVEZXRhaWxFbGVtZW50LT50ICk7CgkJCX0KCQkJaWYgKGlzc2V0KCR0aXRsZURldGFpbEVsZW1lbnQtPnJQcikpIHsKCQkJCWlmIChpc3NldCgkdGl0bGVEZXRhaWxFbGVtZW50LT5yUHItPnJGb250WyJ2YWwiXSkpIHsKCQkJCQkkb2JqVGV4dC0+Z2V0Rm9udCgpLT5zZXROYW1lKChzdHJpbmcpICR0aXRsZURldGFpbEVsZW1lbnQtPnJQci0+ckZvbnRbInZhbCJdKTsKCQkJCX0KCgkJCQkkZm9udFNpemUgPSAoc2VsZjo6X2dldEF0dHJpYnV0ZSgkdGl0bGVEZXRhaWxFbGVtZW50LT5yUHIsICdzeicsICdpbnRlZ2VyJykpOwoJCQkJaWYgKCFpc19udWxsKCRmb250U2l6ZSkpIHsKCQkJCQkkb2JqVGV4dC0+Z2V0Rm9udCgpLT5zZXRTaXplKGZsb29yKCRmb250U2l6ZSAvIDEwMCkpOwoJCQkJfQoKCQkJCSRmb250Q29sb3IgPSAoc2VsZjo6X2dldEF0dHJpYnV0ZSgkdGl0bGVEZXRhaWxFbGVtZW50LT5yUHIsICdjb2xvcicsICdzdHJpbmcnKSk7CgkJCQlpZiAoIWlzX251bGwoJGZvbnRDb2xvcikpIHsKCQkJCQkkb2JqVGV4dC0+Z2V0Rm9udCgpLT5zZXRDb2xvciggbmV3IFBIUEV4Y2VsX1N0eWxlX0NvbG9yKCBzZWxmOjpfcmVhZENvbG9yKCRmb250Q29sb3IpICkgKTsKCQkJCX0KCgkJCQkkYm9sZCA9IHNlbGY6Ol9nZXRBdHRyaWJ1dGUoJHRpdGxlRGV0YWlsRWxlbWVudC0+clByLCAnYicsICdib29sZWFuJyk7CgkJCQlpZiAoIWlzX251bGwoJGJvbGQpKSB7CgkJCQkJJG9ialRleHQtPmdldEZvbnQoKS0+c2V0Qm9sZCgkYm9sZCk7CgkJCQl9CgoJCQkJJGl0YWxpYyA9IHNlbGY6Ol9nZXRBdHRyaWJ1dGUoJHRpdGxlRGV0YWlsRWxlbWVudC0+clByLCAnaScsICdib29sZWFuJyk7CgkJCQlpZiAoIWlzX251bGwoJGl0YWxpYykpIHsKCQkJCQkkb2JqVGV4dC0+Z2V0Rm9udCgpLT5zZXRJdGFsaWMoJGl0YWxpYyk7CgkJCQl9CgoJCQkJJGJhc2VsaW5lID0gc2VsZjo6X2dldEF0dHJpYnV0ZSgkdGl0bGVEZXRhaWxFbGVtZW50LT5yUHIsICdiYXNlbGluZScsICdpbnRlZ2VyJyk7CgkJCQlpZiAoIWlzX251bGwoJGJhc2VsaW5lKSkgewoJCQkJCWlmICgkYmFzZWxpbmUgPiAwKSB7CgkJCQkJCSRvYmpUZXh0LT5nZXRGb250KCktPnNldFN1cGVyU2NyaXB0KHRydWUpOwoJCQkJCX0gZWxzZWlmKCRiYXNlbGluZSA8IDApIHsKCQkJCQkJJG9ialRleHQtPmdldEZvbnQoKS0+c2V0U3ViU2NyaXB0KHRydWUpOwoJCQkJCX0KCQkJCX0KCgkJCQkkdW5kZXJzY29yZSA9IChzZWxmOjpfZ2V0QXR0cmlidXRlKCR0aXRsZURldGFpbEVsZW1lbnQtPnJQciwgJ3UnLCAnc3RyaW5nJykpOwoJCQkJaWYgKCFpc19udWxsKCR1bmRlcnNjb3JlKSkgewoJCQkJCWlmICgkdW5kZXJzY29yZSA9PSAnc25nJykgewoJCQkJCQkkb2JqVGV4dC0+Z2V0Rm9udCgpLT5zZXRVbmRlcmxpbmUoUEhQRXhjZWxfU3R5bGVfRm9udDo6VU5ERVJMSU5FX1NJTkdMRSk7CgkJCQkJfSBlbHNlaWYoJHVuZGVyc2NvcmUgPT0gJ2RibCcpIHsKCQkJCQkJJG9ialRleHQtPmdldEZvbnQoKS0+c2V0VW5kZXJsaW5lKFBIUEV4Y2VsX1N0eWxlX0ZvbnQ6OlVOREVSTElORV9ET1VCTEUpOwoJCQkJCX0gZWxzZSB7CgkJCQkJCSRvYmpUZXh0LT5nZXRGb250KCktPnNldFVuZGVybGluZShQSFBFeGNlbF9TdHlsZV9Gb250OjpVTkRFUkxJTkVfTk9ORSk7CgkJCQkJfQoJCQkJfQoKCQkJCSRzdHJpa2V0aHJvdWdoID0gKHNlbGY6Ol9nZXRBdHRyaWJ1dGUoJHRpdGxlRGV0YWlsRWxlbWVudC0+clByLCAncycsICdzdHJpbmcnKSk7CgkJCQlpZiAoIWlzX251bGwoJHN0cmlrZXRocm91Z2gpKSB7CgkJCQkJaWYgKCRzdHJpa2V0aHJvdWdoID09ICdub1N0cmlrZScpIHsKCQkJCQkJJG9ialRleHQtPmdldEZvbnQoKS0+c2V0U3RyaWtldGhyb3VnaChmYWxzZSk7CgkJCQkJfSBlbHNlIHsKCQkJCQkJJG9ialRleHQtPmdldEZvbnQoKS0+c2V0U3RyaWtldGhyb3VnaCh0cnVlKTsKCQkJCQl9CgkJCQl9CgkJCX0KCQl9CgoJCXJldHVybiAkdmFsdWU7Cgl9Cgp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Reader/Excel2007/Theme.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIFBIUEV4Y2VsCiAqCiAqIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICoKICogQGNhdGVnb3J5ICAgUEhQRXhjZWwKICogQHBhY2thZ2UgICAgUEhQRXhjZWxfUmVhZGVyX0V4Y2VsMjAwNwogKiBAY29weXJpZ2h0ICBDb3B5cmlnaHQgKGMpIDIwMDYgLSAyMDEyIFBIUEV4Y2VsIChodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9QSFBFeGNlbCkKICogQGxpY2Vuc2UgICAgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL29sZC1saWNlbnNlcy9sZ3BsLTIuMS50eHQJTEdQTAogKiBAdmVyc2lvbiAgICAxLjcuNywgMjAxMi0wNS0xOQogKi8KCgovKioKICogUEhQRXhjZWxfUmVhZGVyX0V4Y2VsMjAwN19UaGVtZQogKgogKiBAY2F0ZWdvcnkgICBQSFBFeGNlbAogKiBAcGFja2FnZSAgICBQSFBFeGNlbF9SZWFkZXJfRXhjZWwyMDA3CiAqIEBjb3B5cmlnaHQgIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwgKGh0dHA6Ly93d3cuY29kZXBsZXguY29tL1BIUEV4Y2VsKQogKi8KY2xhc3MgUEhQRXhjZWxfUmVhZGVyX0V4Y2VsMjAwN19UaGVtZQp7CgkvKioKCSAqIFRoZW1lIE5hbWUKCSAqCgkgKiBAdmFyIHN0cmluZwoJICovCglwcml2YXRlICRfdGhlbWVOYW1lOwoKCS8qKgoJICogQ29sb3VyIFNjaGVtZSBOYW1lCgkgKgoJICogQHZhciBzdHJpbmcKCSAqLwoJcHJpdmF0ZSAkX2NvbG91clNjaGVtZU5hbWU7CgoJLyoqCgkgKiBDb2xvdXIgTWFwIGluZGV4ZWQgYnkgcG9zaXRpb24KCSAqCgkgKiBAdmFyIGFycmF5IG9mIHN0cmluZwoJICovCglwcml2YXRlICRfY29sb3VyTWFwVmFsdWVzOwoKCgkvKioKCSAqIENvbG91ciBNYXAKCSAqCgkgKiBAdmFyIGFycmF5IG9mIHN0cmluZwoJICovCglwcml2YXRlICRfY29sb3VyTWFwOwoKCiAgICAvKioKICAgICAqIENyZWF0ZSBhIG5ldyBQSFBFeGNlbF9UaGVtZQoJICoKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCR0aGVtZU5hbWUsJGNvbG91clNjaGVtZU5hbWUsJGNvbG91ck1hcCkKICAgIHsKCQkvLyBJbml0aWFsaXNlIHZhbHVlcwogICAgCSR0aGlzLT5fdGhlbWVOYW1lCQkJPSAkdGhlbWVOYW1lOwoJCSR0aGlzLT5fY29sb3VyU2NoZW1lTmFtZQk9ICRjb2xvdXJTY2hlbWVOYW1lOwoJCSR0aGlzLT5fY29sb3VyTWFwCQkJPSAkY29sb3VyTWFwOwogICAgfQoKCS8qKgoJICogR2V0IFRoZW1lIE5hbWUKCSAqCgkgKiBAcmV0dXJuIHN0cmluZwoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0VGhlbWVOYW1lKCkKCXsKCQlyZXR1cm4gJHRoaXMtPl90aGVtZU5hbWU7Cgl9CgogICAgLyoqCiAgICAgKiBHZXQgY29sb3VyIFNjaGVtZSBOYW1lCiAgICAgKgogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldENvbG91clNjaGVtZU5hbWUoKSB7CgkJcmV0dXJuICR0aGlzLT5fY29sb3VyU2NoZW1lTmFtZTsKICAgIH0KCiAgICAvKioKICAgICAqIEdldCBjb2xvdXIgTWFwIFZhbHVlIGJ5IFBvc2l0aW9uCiAgICAgKgogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldENvbG91ckJ5SW5kZXgoJGluZGV4PTApIHsKICAgIAlpZiAoaXNzZXQoJHRoaXMtPl9jb2xvdXJNYXBbJGluZGV4XSkpIHsKCQkJcmV0dXJuICR0aGlzLT5fY29sb3VyTWFwWyRpbmRleF07CgkJfQoJCXJldHVybiBudWxsOwogICAgfQoKCS8qKgoJICogSW1wbGVtZW50IFBIUCBfX2Nsb25lIHRvIGNyZWF0ZSBhIGRlZXAgY2xvbmUsIG5vdCBqdXN0IGEgc2hhbGxvdyBjb3B5LgoJICovCglwdWJsaWMgZnVuY3Rpb24gX19jbG9uZSgpIHsKCQkkdmFycyA9IGdldF9vYmplY3RfdmFycygkdGhpcyk7CgkJZm9yZWFjaCAoJHZhcnMgYXMgJGtleSA9PiAkdmFsdWUpIHsKCQkJaWYgKChpc19vYmplY3QoJHZhbHVlKSkgJiYgKCRrZXkgIT0gJ19wYXJlbnQnKSkgewoJCQkJJHRoaXMtPiRrZXkgPSBjbG9uZSAkdmFsdWU7CgkJCX0gZWxzZSB7CgkJCQkkdGhpcy0+JGtleSA9ICR2YWx1ZTsKCQkJfQoJCX0KCX0KfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Reader/Gnumeric.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIFBIUEV4Y2VsCiAqCiAqIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICoKICogQGNhdGVnb3J5ICAgUEhQRXhjZWwKICogQHBhY2thZ2UgICAgUEhQRXhjZWxfUmVhZGVyCiAqIEBjb3B5cmlnaHQgIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwgKGh0dHA6Ly93d3cuY29kZXBsZXguY29tL1BIUEV4Y2VsKQogKiBAbGljZW5zZSAgICBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvb2xkLWxpY2Vuc2VzL2xncGwtMi4xLnR4dAlMR1BMCiAqIEB2ZXJzaW9uICAgIDEuNy43LCAyMDEyLTA1LTE5CiAqLwoKCi8qKiBQSFBFeGNlbCByb290IGRpcmVjdG9yeSAqLwppZiAoIWRlZmluZWQoJ1BIUEVYQ0VMX1JPT1QnKSkgewoJLyoqCgkgKiBAaWdub3JlCgkgKi8KCWRlZmluZSgnUEhQRVhDRUxfUk9PVCcsIGRpcm5hbWUoX19GSUxFX18pIC4gJy8uLi8uLi8nKTsKCXJlcXVpcmUoUEhQRVhDRUxfUk9PVCAuICdQSFBFeGNlbC9BdXRvbG9hZGVyLnBocCcpOwp9CgovKioKICogUEhQRXhjZWxfUmVhZGVyX0dudW1lcmljCiAqCiAqIEBjYXRlZ29yeQlQSFBFeGNlbAogKiBAcGFja2FnZQkJUEhQRXhjZWxfUmVhZGVyCiAqIEBjb3B5cmlnaHQJQ29weXJpZ2h0IChjKSAyMDA2IC0gMjAxMiBQSFBFeGNlbCAoaHR0cDovL3d3dy5jb2RlcGxleC5jb20vUEhQRXhjZWwpCiAqLwpjbGFzcyBQSFBFeGNlbF9SZWFkZXJfR251bWVyaWMgaW1wbGVtZW50cyBQSFBFeGNlbF9SZWFkZXJfSVJlYWRlcgp7CgkvKioKCSAqIFJlYWQgZGF0YSBvbmx5PwoJICogSWRlbnRpZmllcyB3aGV0aGVyIHRoZSBSZWFkZXIgc2hvdWxkIG9ubHkgcmVhZCBkYXRhIHZhbHVlcyBmb3IgY2VsbHMsIGFuZCBpZ25vcmUgYW55IGZvcm1hdHRpbmcgaW5mb3JtYXRpb247CgkgKgkJb3Igd2hldGhlciBpdCBzaG91bGQgcmVhZCBib3RoIGRhdGEgYW5kIGZvcm1hdHRpbmcKCSAqCgkgKiBAdmFyCWJvb2xlYW4KCSAqLwoJcHJpdmF0ZSAkX3JlYWREYXRhT25seSA9IGZhbHNlOwoKCS8qKgoJICogUmVzdHJpY3Qgd2hpY2ggc2hlZXRzIHNob3VsZCBiZSBsb2FkZWQ/CgkgKiBUaGlzIHByb3BlcnR5IGhvbGRzIGFuIGFycmF5IG9mIHdvcmtzaGVldCBuYW1lcyB0byBiZSBsb2FkZWQuIElmIG51bGwsIHRoZW4gYWxsIHdvcmtzaGVldHMgd2lsbCBiZSBsb2FkZWQuCgkgKgoJICogQHZhcglhcnJheSBvZiBzdHJpbmcKCSAqLwoJcHJpdmF0ZSAkX2xvYWRTaGVldHNPbmx5ID0gbnVsbDsKCgkvKioKCSAqIEZvcm1hdHMKCSAqCgkgKiBAdmFyIGFycmF5CgkgKi8KCXByaXZhdGUgJF9zdHlsZXMgPSBhcnJheSgpOwoKCS8qKgoJICogU2hhcmVkIEV4cHJlc3Npb25zCgkgKgoJICogQHZhciBhcnJheQoJICovCglwcml2YXRlICRfZXhwcmVzc2lvbnMgPSBhcnJheSgpOwoKCXByaXZhdGUgJF9yZWZlcmVuY2VIZWxwZXIgPSBudWxsOwoKCS8qKgoJICogUEhQRXhjZWxfUmVhZGVyX0lSZWFkRmlsdGVyIGluc3RhbmNlCgkgKgoJICogQHZhciBQSFBFeGNlbF9SZWFkZXJfSVJlYWRGaWx0ZXIKCSAqLwoJcHJpdmF0ZSAkX3JlYWRGaWx0ZXIgPSBudWxsOwoKCgkvKioKCSAqIENyZWF0ZSBhIG5ldyBQSFBFeGNlbF9SZWFkZXJfR251bWVyaWMKCSAqLwoJcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCkgewoJCSR0aGlzLT5fcmVhZEZpbHRlciAJPSBuZXcgUEhQRXhjZWxfUmVhZGVyX0RlZmF1bHRSZWFkRmlsdGVyKCk7CgkJJHRoaXMtPl9yZWZlcmVuY2VIZWxwZXIgPSBQSFBFeGNlbF9SZWZlcmVuY2VIZWxwZXI6OmdldEluc3RhbmNlKCk7Cgl9CgoKCS8qKgoJICogUmVhZCBkYXRhIG9ubHk/CgkgKgkJSWYgdGhpcyBpcyB0cnVlLCB0aGVuIHRoZSBSZWFkZXIgd2lsbCBvbmx5IHJlYWQgZGF0YSB2YWx1ZXMgZm9yIGNlbGxzLCBpdCB3aWxsIG5vdCByZWFkIGFueSBmb3JtYXR0aW5nIGluZm9ybWF0aW9uLgoJICoJCUlmIGZhbHNlICh0aGUgZGVmYXVsdCkgaXQgd2lsbCByZWFkIGRhdGEgYW5kIGZvcm1hdHRpbmcuCgkgKgoJICogQHJldHVybglib29sZWFuCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRSZWFkRGF0YU9ubHkoKSB7CgkJcmV0dXJuICR0aGlzLT5fcmVhZERhdGFPbmx5OwoJfQoKCgkvKioKCSAqIFNldCByZWFkIGRhdGEgb25seQoJICoJCVNldCB0byB0cnVlLCB0byBhZHZpc2UgdGhlIFJlYWRlciBvbmx5IHRvIHJlYWQgZGF0YSB2YWx1ZXMgZm9yIGNlbGxzLCBhbmQgdG8gaWdub3JlIGFueSBmb3JtYXR0aW5nIGluZm9ybWF0aW9uLgoJICoJCVNldCB0byBmYWxzZSAodGhlIGRlZmF1bHQpIHRvIGFkdmlzZSB0aGUgUmVhZGVyIHRvIHJlYWQgYm90aCBkYXRhIGFuZCBmb3JtYXR0aW5nIGZvciBjZWxscy4KCSAqCgkgKiBAcGFyYW0JYm9vbGVhbgkkcFZhbHVlCgkgKgoJICogQHJldHVybglQSFBFeGNlbF9SZWFkZXJfR251bWVyaWMKCSAqLwoJcHVibGljIGZ1bmN0aW9uIHNldFJlYWREYXRhT25seSgkcFZhbHVlID0gZmFsc2UpIHsKCQkkdGhpcy0+X3JlYWREYXRhT25seSA9ICRwVmFsdWU7CgkJcmV0dXJuICR0aGlzOwoJfQoKCgkvKioKCSAqIEdldCB3aGljaCBzaGVldHMgdG8gbG9hZAoJICogUmV0dXJucyBlaXRoZXIgYW4gYXJyYXkgb2Ygd29ya3NoZWV0IG5hbWVzICh0aGUgbGlzdCBvZiB3b3Jrc2hlZXRzIHRoYXQgc2hvdWxkIGJlIGxvYWRlZCksIG9yIGEgbnVsbAoJICoJCWluZGljYXRpbmcgdGhhdCBhbGwgd29ya3NoZWV0cyBpbiB0aGUgd29ya2Jvb2sgc2hvdWxkIGJlIGxvYWRlZC4KCSAqCgkgKiBAcmV0dXJuIG1peGVkCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRMb2FkU2hlZXRzT25seSgpCgl7CgkJcmV0dXJuICR0aGlzLT5fbG9hZFNoZWV0c09ubHk7Cgl9CgoKCS8qKgoJICogU2V0IHdoaWNoIHNoZWV0cyB0byBsb2FkCgkgKgoJICogQHBhcmFtIG1peGVkICR2YWx1ZQoJICoJCVRoaXMgc2hvdWxkIGJlIGVpdGhlciBhbiBhcnJheSBvZiB3b3Jrc2hlZXQgbmFtZXMgdG8gYmUgbG9hZGVkLCBvciBhIHN0cmluZyBjb250YWluaW5nIGEgc2luZ2xlIHdvcmtzaGVldCBuYW1lLgoJICoJCUlmIE5VTEwsIHRoZW4gaXQgdGVsbHMgdGhlIFJlYWRlciB0byByZWFkIGFsbCB3b3Jrc2hlZXRzIGluIHRoZSB3b3JrYm9vawoJICoKCSAqIEByZXR1cm4gUEhQRXhjZWxfUmVhZGVyX0dudW1lcmljCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBzZXRMb2FkU2hlZXRzT25seSgkdmFsdWUgPSBudWxsKQoJewoJCSR0aGlzLT5fbG9hZFNoZWV0c09ubHkgPSBpc19hcnJheSgkdmFsdWUpID8KCQkJJHZhbHVlIDogYXJyYXkoJHZhbHVlKTsKCQlyZXR1cm4gJHRoaXM7Cgl9CgoKCS8qKgoJICogU2V0IGFsbCBzaGVldHMgdG8gbG9hZAoJICoJCVRlbGxzIHRoZSBSZWFkZXIgdG8gbG9hZCBhbGwgd29ya3NoZWV0cyBmcm9tIHRoZSB3b3JrYm9vay4KCSAqCgkgKiBAcmV0dXJuIFBIUEV4Y2VsX1JlYWRlcl9HbnVtZXJpYwoJICovCglwdWJsaWMgZnVuY3Rpb24gc2V0TG9hZEFsbFNoZWV0cygpCgl7CgkJJHRoaXMtPl9sb2FkU2hlZXRzT25seSA9IG51bGw7CgkJcmV0dXJuICR0aGlzOwoJfQoKCgkvKioKCSAqIFJlYWQgZmlsdGVyCgkgKgoJICogQHJldHVybiBQSFBFeGNlbF9SZWFkZXJfSVJlYWRGaWx0ZXIKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldFJlYWRGaWx0ZXIoKSB7CgkJcmV0dXJuICR0aGlzLT5fcmVhZEZpbHRlcjsKCX0KCgoJLyoqCgkgKiBTZXQgcmVhZCBmaWx0ZXIKCSAqCgkgKiBAcGFyYW0gUEhQRXhjZWxfUmVhZGVyX0lSZWFkRmlsdGVyICRwVmFsdWUKCSAqIEByZXR1cm4gUEhQRXhjZWxfUmVhZGVyX0dudW1lcmljCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBzZXRSZWFkRmlsdGVyKFBIUEV4Y2VsX1JlYWRlcl9JUmVhZEZpbHRlciAkcFZhbHVlKSB7CgkJJHRoaXMtPl9yZWFkRmlsdGVyID0gJHBWYWx1ZTsKCQlyZXR1cm4gJHRoaXM7Cgl9CgoKCS8qKgoJICogQ2FuIHRoZSBjdXJyZW50IFBIUEV4Y2VsX1JlYWRlcl9JUmVhZGVyIHJlYWQgdGhlIGZpbGU/CgkgKgoJICogQHBhcmFtIAlzdHJpbmcgCQkkcEZpbGVOYW1lCgkgKiBAcmV0dXJuIAlib29sZWFuCgkgKiBAdGhyb3dzIEV4Y2VwdGlvbgoJICovCglwdWJsaWMgZnVuY3Rpb24gY2FuUmVhZCgkcEZpbGVuYW1lKQoJewoJCS8vIENoZWNrIGlmIGZpbGUgZXhpc3RzCgkJaWYgKCFmaWxlX2V4aXN0cygkcEZpbGVuYW1lKSkgewoJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCJDb3VsZCBub3Qgb3BlbiAiIC4gJHBGaWxlbmFtZSAuICIgZm9yIHJlYWRpbmchIEZpbGUgZG9lcyBub3QgZXhpc3QuIik7CgkJfQoKCQkvLyBDaGVjayBpZiBnemxpYiBmdW5jdGlvbnMgYXJlIGF2YWlsYWJsZQoJCWlmICghZnVuY3Rpb25fZXhpc3RzKCdnenJlYWQnKSkgewoJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCJnemxpYiBsaWJyYXJ5IGlzIG5vdCBlbmFibGVkIik7CgkJfQoKCQkvLyBSZWFkIHNpZ25hdHVyZSBkYXRhIChmaXJzdCAzIGJ5dGVzKQoJCSRmaCA9IGZvcGVuKCRwRmlsZW5hbWUsICdyJyk7CgkJJGRhdGEgPSBmcmVhZCgkZmgsIDIpOwoJCWZjbG9zZSgkZmgpOwoKCQlpZiAoJGRhdGEgIT0gY2hyKDB4MUYpLmNocigweDhCKSkgewoJCQlyZXR1cm4gZmFsc2U7CgkJfQoKCQlyZXR1cm4gdHJ1ZTsKCX0KCgoJLyoqCgkgKiBSZXR1cm4gd29ya3NoZWV0IGluZm8gKE5hbWUsIExhc3QgQ29sdW1uIExldHRlciwgTGFzdCBDb2x1bW4gSW5kZXgsIFRvdGFsIFJvd3MsIFRvdGFsIENvbHVtbnMpCgkgKgoJICogQHBhcmFtICAgc3RyaW5nICAgICAkcEZpbGVuYW1lCgkgKiBAdGhyb3dzICAgRXhjZXB0aW9uCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBsaXN0V29ya3NoZWV0SW5mbygkcEZpbGVuYW1lKQoJewoJCS8vIENoZWNrIGlmIGZpbGUgZXhpc3RzCgkJaWYgKCFmaWxlX2V4aXN0cygkcEZpbGVuYW1lKSkgewoJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCJDb3VsZCBub3Qgb3BlbiAiIC4gJHBGaWxlbmFtZSAuICIgZm9yIHJlYWRpbmchIEZpbGUgZG9lcyBub3QgZXhpc3QuIik7CgkJfQoKCQkkZ0ZpbGVEYXRhID0gJHRoaXMtPl9nemZpbGVHZXRDb250ZW50cygkcEZpbGVuYW1lKTsKCgkJJHhtbCA9IHNpbXBsZXhtbF9sb2FkX3N0cmluZygkZ0ZpbGVEYXRhKTsKCQkkbmFtZXNwYWNlc01ldGEgPSAkeG1sLT5nZXROYW1lc3BhY2VzKHRydWUpOwoKCQkkZ25tWE1MID0gJHhtbC0+Y2hpbGRyZW4oJG5hbWVzcGFjZXNNZXRhWydnbm0nXSk7CgoJCSR3b3Jrc2hlZXRJbmZvID0gYXJyYXkoKTsKCgkJZm9yZWFjaCAoJGdubVhNTC0+U2hlZXRzLT5TaGVldCBhcyAkc2hlZXQpIHsKCQkJJHRtcEluZm8gPSBhcnJheSgpOwoJCQkkdG1wSW5mb1snd29ya3NoZWV0TmFtZSddID0gKHN0cmluZykgJHNoZWV0LT5OYW1lOwoJCQkkdG1wSW5mb1snbGFzdENvbHVtbkxldHRlciddID0gJ0EnOwoJCQkkdG1wSW5mb1snbGFzdENvbHVtbkluZGV4J10gPSAwOwoJCQkkdG1wSW5mb1sndG90YWxSb3dzJ10gPSAwOwoJCQkkdG1wSW5mb1sndG90YWxDb2x1bW5zJ10gPSAwOwoKCQkJZm9yZWFjaCAoJHNoZWV0LT5DZWxscy0+Q2VsbCBhcyAkY2VsbCkgewoJCQkJJGNlbGxBdHRyaWJ1dGVzID0gJGNlbGwtPmF0dHJpYnV0ZXMoKTsKCgkJCQkkcm93SW5kZXggPSAoaW50KSAkY2VsbEF0dHJpYnV0ZXMtPlJvdyArIDE7CgkJCQkkY29sdW1uSW5kZXggPSAoaW50KSAkY2VsbEF0dHJpYnV0ZXMtPkNvbDsKCgkJCQkkdG1wSW5mb1sndG90YWxSb3dzJ10gPSBtYXgoJHRtcEluZm9bJ3RvdGFsUm93cyddLCAkcm93SW5kZXgpOwoJCQkJJHRtcEluZm9bJ2xhc3RDb2x1bW5JbmRleCddID0gbWF4KCR0bXBJbmZvWydsYXN0Q29sdW1uSW5kZXgnXSwgJGNvbHVtbkluZGV4KTsKCQkJfQoKCQkJJHRtcEluZm9bJ2xhc3RDb2x1bW5MZXR0ZXInXSA9IFBIUEV4Y2VsX0NlbGw6OnN0cmluZ0Zyb21Db2x1bW5JbmRleCgkdG1wSW5mb1snbGFzdENvbHVtbkluZGV4J10pOwoJCQkkdG1wSW5mb1sndG90YWxDb2x1bW5zJ10gPSAkdG1wSW5mb1snbGFzdENvbHVtbkluZGV4J10gKyAxOwoKCQkJJHdvcmtzaGVldEluZm9bXSA9ICR0bXBJbmZvOwoJCX0KCgkJcmV0dXJuICR3b3Jrc2hlZXRJbmZvOwoJfQoKCglwcml2YXRlIGZ1bmN0aW9uIF9nemZpbGVHZXRDb250ZW50cygkZmlsZW5hbWUpIHsKCQkkZmlsZSA9IEBnem9wZW4oJGZpbGVuYW1lLCAncmInKTsKCQlpZiAoJGZpbGUgIT09IGZhbHNlKSB7CgkJCSRkYXRhID0gJyc7CgkJCXdoaWxlICghZ3plb2YoJGZpbGUpKSB7CgkJCQkkZGF0YSAuPSBnenJlYWQoJGZpbGUsIDEwMjQpOwoJCQl9CgkJCWd6Y2xvc2UoJGZpbGUpOwoJCX0KCQlyZXR1cm4gJGRhdGE7Cgl9CgoKCS8qKgoJICogTG9hZHMgUEhQRXhjZWwgZnJvbSBmaWxlCgkgKgoJICogQHBhcmFtIAlzdHJpbmcgCQkkcEZpbGVuYW1lCgkgKiBAcmV0dXJuIAlQSFBFeGNlbAoJICogQHRocm93cyAJRXhjZXB0aW9uCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBsb2FkKCRwRmlsZW5hbWUpCgl7CgkJLy8gQ3JlYXRlIG5ldyBQSFBFeGNlbAoJCSRvYmpQSFBFeGNlbCA9IG5ldyBQSFBFeGNlbCgpOwoKCQkvLyBMb2FkIGludG8gdGhpcyBpbnN0YW5jZQoJCXJldHVybiAkdGhpcy0+bG9hZEludG9FeGlzdGluZygkcEZpbGVuYW1lLCAkb2JqUEhQRXhjZWwpOwoJfQoKCgkvKioKCSAqIFJlYWRzIG5hbWVzIG9mIHRoZSB3b3Jrc2hlZXRzIGZyb20gYSBmaWxlLCB3aXRob3V0IHBhcnNpbmcgdGhlIHdob2xlIGZpbGUgdG8gYSBQSFBFeGNlbCBvYmplY3QKCSAqCgkgKiBAcGFyYW0gCXN0cmluZyAJCSRwRmlsZW5hbWUKCSAqIEB0aHJvd3MgCUV4Y2VwdGlvbgoJICovCglwdWJsaWMgZnVuY3Rpb24gbGlzdFdvcmtzaGVldE5hbWVzKCRwRmlsZW5hbWUpCgl7CgkJLy8gQ2hlY2sgaWYgZmlsZSBleGlzdHMKCQlpZiAoIWZpbGVfZXhpc3RzKCRwRmlsZW5hbWUpKSB7CgkJCXRocm93IG5ldyBFeGNlcHRpb24oIkNvdWxkIG5vdCBvcGVuICIgLiAkcEZpbGVuYW1lIC4gIiBmb3IgcmVhZGluZyEgRmlsZSBkb2VzIG5vdCBleGlzdC4iKTsKCQl9CgoJCSRnRmlsZURhdGEgPSAkdGhpcy0+X2d6ZmlsZUdldENvbnRlbnRzKCRwRmlsZW5hbWUpOwoKCQkkeG1sID0gc2ltcGxleG1sX2xvYWRfc3RyaW5nKCRnRmlsZURhdGEpOwoJCSRuYW1lc3BhY2VzTWV0YSA9ICR4bWwtPmdldE5hbWVzcGFjZXModHJ1ZSk7CgoJCSRnbm1YTUwgPSAkeG1sLT5jaGlsZHJlbigkbmFtZXNwYWNlc01ldGFbJ2dubSddKTsKCgkJJHdvcmtzaGVldE5hbWVzID0gYXJyYXkoKTsKCgkJZm9yZWFjaCgkZ25tWE1MLT5TaGVldHMtPlNoZWV0IGFzICRzaGVldCkgewoJCQkkd29ya3NoZWV0TmFtZXNbXSA9IChzdHJpbmcpICRzaGVldC0+TmFtZTsKCQl9CgoJCXJldHVybiAkd29ya3NoZWV0TmFtZXM7Cgl9CgoKCS8qKgoJICogTG9hZHMgUEhQRXhjZWwgZnJvbSBmaWxlIGludG8gUEhQRXhjZWwgaW5zdGFuY2UKCSAqCgkgKiBAcGFyYW0gCXN0cmluZyAJCSRwRmlsZW5hbWUKCSAqIEBwYXJhbQlQSFBFeGNlbAkkb2JqUEhQRXhjZWwKCSAqIEByZXR1cm4gCVBIUEV4Y2VsCgkgKiBAdGhyb3dzIAlFeGNlcHRpb24KCSAqLwoJcHVibGljIGZ1bmN0aW9uIGxvYWRJbnRvRXhpc3RpbmcoJHBGaWxlbmFtZSwgUEhQRXhjZWwgJG9ialBIUEV4Y2VsKQoJewoJCS8vIENoZWNrIGlmIGZpbGUgZXhpc3RzCgkJaWYgKCFmaWxlX2V4aXN0cygkcEZpbGVuYW1lKSkgewoJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCJDb3VsZCBub3Qgb3BlbiAiIC4gJHBGaWxlbmFtZSAuICIgZm9yIHJlYWRpbmchIEZpbGUgZG9lcyBub3QgZXhpc3QuIik7CgkJfQoKCQkkdGltZXpvbmVPYmogPSBuZXcgRGF0ZVRpbWVab25lKCdFdXJvcGUvTG9uZG9uJyk7CgkJJEdNVCA9IG5ldyBEYXRlVGltZVpvbmUoJ1VUQycpOwoKCQkkZ0ZpbGVEYXRhID0gJHRoaXMtPl9nemZpbGVHZXRDb250ZW50cygkcEZpbGVuYW1lKTsKCi8vCQllY2hvICc8cHJlPic7Ci8vCQllY2hvIGh0bWxlbnRpdGllcygkZ0ZpbGVEYXRhLEVOVF9RVU9URVMsJ1VURi04Jyk7Ci8vCQllY2hvICc8L3ByZT48aHIgLz4nOwovLwoJCSR4bWwgPSBzaW1wbGV4bWxfbG9hZF9zdHJpbmcoJGdGaWxlRGF0YSk7CgkJJG5hbWVzcGFjZXNNZXRhID0gJHhtbC0+Z2V0TmFtZXNwYWNlcyh0cnVlKTsKCi8vCQl2YXJfZHVtcCgkbmFtZXNwYWNlc01ldGEpOwovLwoJCSRnbm1YTUwgPSAkeG1sLT5jaGlsZHJlbigkbmFtZXNwYWNlc01ldGFbJ2dubSddKTsKCgkJJGRvY1Byb3BzID0gJG9ialBIUEV4Y2VsLT5nZXRQcm9wZXJ0aWVzKCk7CgkJLy8JRG9jdW1lbnQgUHJvcGVydGllcyBhcmUgaGVsZCBkaWZmZXJlbnRseSwgZGVwZW5kaW5nIG9uIHRoZSB2ZXJzaW9uIG9mIEdudW1lcmljCgkJaWYgKGlzc2V0KCRuYW1lc3BhY2VzTWV0YVsnb2ZmaWNlJ10pKSB7CgkJCSRvZmZpY2VYTUwgPSAkeG1sLT5jaGlsZHJlbigkbmFtZXNwYWNlc01ldGFbJ29mZmljZSddKTsKCQkgICAgJG9mZmljZURvY1hNTCA9ICRvZmZpY2VYTUwtPnsnZG9jdW1lbnQtbWV0YSd9OwoJCQkkb2ZmaWNlRG9jTWV0YVhNTCA9ICRvZmZpY2VEb2NYTUwtPm1ldGE7CgoJCQlmb3JlYWNoKCRvZmZpY2VEb2NNZXRhWE1MIGFzICRvZmZpY2VQcm9wZXJ0eURhdGEpIHsKCgkJCQkkb2ZmaWNlUHJvcGVydHlEQyA9IGFycmF5KCk7CgkJCQlpZiAoaXNzZXQoJG5hbWVzcGFjZXNNZXRhWydkYyddKSkgewoJCQkJCSRvZmZpY2VQcm9wZXJ0eURDID0gJG9mZmljZVByb3BlcnR5RGF0YS0+Y2hpbGRyZW4oJG5hbWVzcGFjZXNNZXRhWydkYyddKTsKCQkJCX0KCQkJCWZvcmVhY2goJG9mZmljZVByb3BlcnR5REMgYXMgJHByb3BlcnR5TmFtZSA9PiAkcHJvcGVydHlWYWx1ZSkgewoJCQkJCSRwcm9wZXJ0eVZhbHVlID0gKHN0cmluZykgJHByb3BlcnR5VmFsdWU7CgkJCQkJc3dpdGNoICgkcHJvcGVydHlOYW1lKSB7CgkJCQkJCWNhc2UgJ3RpdGxlJyA6CgkJCQkJCQkJJGRvY1Byb3BzLT5zZXRUaXRsZSh0cmltKCRwcm9wZXJ0eVZhbHVlKSk7CgkJCQkJCQkJYnJlYWs7CgkJCQkJCWNhc2UgJ3N1YmplY3QnIDoKCQkJCQkJCQkkZG9jUHJvcHMtPnNldFN1YmplY3QodHJpbSgkcHJvcGVydHlWYWx1ZSkpOwoJCQkJCQkJCWJyZWFrOwoJCQkJCQljYXNlICdjcmVhdG9yJyA6CgkJCQkJCQkJJGRvY1Byb3BzLT5zZXRDcmVhdG9yKHRyaW0oJHByb3BlcnR5VmFsdWUpKTsKCQkJCQkJCQkkZG9jUHJvcHMtPnNldExhc3RNb2RpZmllZEJ5KHRyaW0oJHByb3BlcnR5VmFsdWUpKTsKCQkJCQkJCQlicmVhazsKCQkJCQkJY2FzZSAnZGF0ZScgOgoJCQkJCQkJCSRjcmVhdGlvbkRhdGUgPSBzdHJ0b3RpbWUodHJpbSgkcHJvcGVydHlWYWx1ZSkpOwoJCQkJCQkJCSRkb2NQcm9wcy0+c2V0Q3JlYXRlZCgkY3JlYXRpb25EYXRlKTsKCQkJCQkJCQkkZG9jUHJvcHMtPnNldE1vZGlmaWVkKCRjcmVhdGlvbkRhdGUpOwoJCQkJCQkJCWJyZWFrOwoJCQkJCQljYXNlICdkZXNjcmlwdGlvbicgOgoJCQkJCQkJCSRkb2NQcm9wcy0+c2V0RGVzY3JpcHRpb24odHJpbSgkcHJvcGVydHlWYWx1ZSkpOwoJCQkJCQkJCWJyZWFrOwoJCQkJCX0KCQkJCX0KCQkJCSRvZmZpY2VQcm9wZXJ0eU1ldGEgPSBhcnJheSgpOwoJCQkJaWYgKGlzc2V0KCRuYW1lc3BhY2VzTWV0YVsnbWV0YSddKSkgewoJCQkJCSRvZmZpY2VQcm9wZXJ0eU1ldGEgPSAkb2ZmaWNlUHJvcGVydHlEYXRhLT5jaGlsZHJlbigkbmFtZXNwYWNlc01ldGFbJ21ldGEnXSk7CgkJCQl9CgkJCQlmb3JlYWNoKCRvZmZpY2VQcm9wZXJ0eU1ldGEgYXMgJHByb3BlcnR5TmFtZSA9PiAkcHJvcGVydHlWYWx1ZSkgewoJCQkJCSRhdHRyaWJ1dGVzID0gJHByb3BlcnR5VmFsdWUtPmF0dHJpYnV0ZXMoJG5hbWVzcGFjZXNNZXRhWydtZXRhJ10pOwoJCQkJCSRwcm9wZXJ0eVZhbHVlID0gKHN0cmluZykgJHByb3BlcnR5VmFsdWU7CgkJCQkJc3dpdGNoICgkcHJvcGVydHlOYW1lKSB7CgkJCQkJCWNhc2UgJ2tleXdvcmQnIDoKCQkJCQkJCQkkZG9jUHJvcHMtPnNldEtleXdvcmRzKHRyaW0oJHByb3BlcnR5VmFsdWUpKTsKCQkJCQkJCQlicmVhazsKCQkJCQkJY2FzZSAnaW5pdGlhbC1jcmVhdG9yJyA6CgkJCQkJCQkJJGRvY1Byb3BzLT5zZXRDcmVhdG9yKHRyaW0oJHByb3BlcnR5VmFsdWUpKTsKCQkJCQkJCQkkZG9jUHJvcHMtPnNldExhc3RNb2RpZmllZEJ5KHRyaW0oJHByb3BlcnR5VmFsdWUpKTsKCQkJCQkJCQlicmVhazsKCQkJCQkJY2FzZSAnY3JlYXRpb24tZGF0ZScgOgoJCQkJCQkJCSRjcmVhdGlvbkRhdGUgPSBzdHJ0b3RpbWUodHJpbSgkcHJvcGVydHlWYWx1ZSkpOwoJCQkJCQkJCSRkb2NQcm9wcy0+c2V0Q3JlYXRlZCgkY3JlYXRpb25EYXRlKTsKCQkJCQkJCQkkZG9jUHJvcHMtPnNldE1vZGlmaWVkKCRjcmVhdGlvbkRhdGUpOwoJCQkJCQkJCWJyZWFrOwoJCQkJCQljYXNlICd1c2VyLWRlZmluZWQnIDoKCQkJCQkJCQlsaXN0KCwkYXR0ck5hbWUpID0gZXhwbG9kZSgnOicsJGF0dHJpYnV0ZXNbJ25hbWUnXSk7CgkJCQkJCQkJc3dpdGNoICgkYXR0ck5hbWUpIHsKCQkJCQkJCQkJY2FzZSAncHVibGlzaGVyJyA6CgkJCQkJCQkJCQkJJGRvY1Byb3BzLT5zZXRDb21wYW55KHRyaW0oJHByb3BlcnR5VmFsdWUpKTsKCQkJCQkJCQkJCQlicmVhazsKCQkJCQkJCQkJY2FzZSAnY2F0ZWdvcnknIDoKCQkJCQkJCQkJCQkkZG9jUHJvcHMtPnNldENhdGVnb3J5KHRyaW0oJHByb3BlcnR5VmFsdWUpKTsKCQkJCQkJCQkJCQlicmVhazsKCQkJCQkJCQkJY2FzZSAnbWFuYWdlcicgOgoJCQkJCQkJCQkJCSRkb2NQcm9wcy0+c2V0TWFuYWdlcih0cmltKCRwcm9wZXJ0eVZhbHVlKSk7CgkJCQkJCQkJCQkJYnJlYWs7CgkJCQkJCQkJfQoJCQkJCQkJCWJyZWFrOwoJCQkJCX0KCQkJCX0KCQkJfQoJCX0gZWxzZWlmIChpc3NldCgkZ25tWE1MLT5TdW1tYXJ5KSkgewoJCQlmb3JlYWNoKCRnbm1YTUwtPlN1bW1hcnktPkl0ZW0gYXMgJHN1bW1hcnlJdGVtKSB7CgkJCQkkcHJvcGVydHlOYW1lID0gJHN1bW1hcnlJdGVtLT5uYW1lOwoJCQkJJHByb3BlcnR5VmFsdWUgPSAkc3VtbWFyeUl0ZW0tPnsndmFsLXN0cmluZyd9OwoJCQkJc3dpdGNoICgkcHJvcGVydHlOYW1lKSB7CgkJCQkJY2FzZSAndGl0bGUnIDoKCQkJCQkJJGRvY1Byb3BzLT5zZXRUaXRsZSh0cmltKCRwcm9wZXJ0eVZhbHVlKSk7CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgJ2NvbW1lbnRzJyA6CgkJCQkJCSRkb2NQcm9wcy0+c2V0RGVzY3JpcHRpb24odHJpbSgkcHJvcGVydHlWYWx1ZSkpOwoJCQkJCQlicmVhazsKCQkJCQljYXNlICdrZXl3b3JkcycgOgoJCQkJCQkkZG9jUHJvcHMtPnNldEtleXdvcmRzKHRyaW0oJHByb3BlcnR5VmFsdWUpKTsKCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSAnY2F0ZWdvcnknIDoKCQkJCQkJJGRvY1Byb3BzLT5zZXRDYXRlZ29yeSh0cmltKCRwcm9wZXJ0eVZhbHVlKSk7CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgJ21hbmFnZXInIDoKCQkJCQkJJGRvY1Byb3BzLT5zZXRNYW5hZ2VyKHRyaW0oJHByb3BlcnR5VmFsdWUpKTsKCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSAnYXV0aG9yJyA6CgkJCQkJCSRkb2NQcm9wcy0+c2V0Q3JlYXRvcih0cmltKCRwcm9wZXJ0eVZhbHVlKSk7CgkJCQkJCSRkb2NQcm9wcy0+c2V0TGFzdE1vZGlmaWVkQnkodHJpbSgkcHJvcGVydHlWYWx1ZSkpOwoJCQkJCQlicmVhazsKCQkJCQljYXNlICdjb21wYW55JyA6CgkJCQkJCSRkb2NQcm9wcy0+c2V0Q29tcGFueSh0cmltKCRwcm9wZXJ0eVZhbHVlKSk7CgkJCQkJCWJyZWFrOwoJCQkJfQoJCQl9CgkJfQoKCQkkd29ya3NoZWV0SUQgPSAwOwoJCWZvcmVhY2goJGdubVhNTC0+U2hlZXRzLT5TaGVldCBhcyAkc2hlZXQpIHsKCQkJJHdvcmtzaGVldE5hbWUgPSAoc3RyaW5nKSAkc2hlZXQtPk5hbWU7Ci8vCQkJZWNobyAnPGI+V29ya3NoZWV0OiAnLCR3b3Jrc2hlZXROYW1lLCc8L2I+PGJyIC8+JzsKCQkJaWYgKChpc3NldCgkdGhpcy0+X2xvYWRTaGVldHNPbmx5KSkgJiYgKCFpbl9hcnJheSgkd29ya3NoZWV0TmFtZSwgJHRoaXMtPl9sb2FkU2hlZXRzT25seSkpKSB7CgkJCQljb250aW51ZTsKCQkJfQoKCQkJJG1heFJvdyA9ICRtYXhDb2wgPSAwOwoKCQkJLy8gQ3JlYXRlIG5ldyBXb3Jrc2hlZXQKCQkJJG9ialBIUEV4Y2VsLT5jcmVhdGVTaGVldCgpOwoJCQkkb2JqUEhQRXhjZWwtPnNldEFjdGl2ZVNoZWV0SW5kZXgoJHdvcmtzaGVldElEKTsKCQkJLy8JVXNlIGZhbHNlIGZvciAkdXBkYXRlRm9ybXVsYUNlbGxSZWZlcmVuY2VzIHRvIHByZXZlbnQgYWRqdXN0bWVudCBvZiB3b3Jrc2hlZXQgcmVmZXJlbmNlcyBpbiBmb3JtdWxhCgkJCS8vCQljZWxscy4uLiBkdXJpbmcgdGhlIGxvYWQsIGFsbCBmb3JtdWxhZSBzaG91bGQgYmUgY29ycmVjdCwgYW5kIHdlJ3JlIHNpbXBseSBicmluZ2luZyB0aGUgd29ya3NoZWV0CgkJCS8vCQluYW1lIGluIGxpbmUgd2l0aCB0aGUgZm9ybXVsYSwgbm90IHRoZSByZXZlcnNlCgkJCSRvYmpQSFBFeGNlbC0+Z2V0QWN0aXZlU2hlZXQoKS0+c2V0VGl0bGUoJHdvcmtzaGVldE5hbWUsZmFsc2UpOwoKCQkJaWYgKCghJHRoaXMtPl9yZWFkRGF0YU9ubHkpICYmIChpc3NldCgkc2hlZXQtPlByaW50SW5mb3JtYXRpb24pKSkgewoJCQkJaWYgKGlzc2V0KCRzaGVldC0+UHJpbnRJbmZvcm1hdGlvbi0+TWFyZ2lucykpIHsKCQkJCQlmb3JlYWNoKCRzaGVldC0+UHJpbnRJbmZvcm1hdGlvbi0+TWFyZ2lucy0+Y2hpbGRyZW4oJ2dubScsVFJVRSkgYXMgJGtleSA9PiAkbWFyZ2luKSB7CgkJCQkJCSRtYXJnaW5BdHRyaWJ1dGVzID0gJG1hcmdpbi0+YXR0cmlidXRlcygpOwoJCQkJCQkkbWFyZ2luU2l6ZSA9IDcyIC8gMTAwOwkvLwlEZWZhdWx0CgkJCQkJCXN3aXRjaCgkbWFyZ2luQXR0cmlidXRlc1snUHJlZlVuaXQnXSkgewoJCQkJCQkJY2FzZSAnbW0nIDoKCQkJCQkJCQkkbWFyZ2luU2l6ZSA9IGludHZhbCgkbWFyZ2luQXR0cmlidXRlc1snUG9pbnRzJ10pIC8gMTAwOwoJCQkJCQkJCWJyZWFrOwoJCQkJCQl9CgkJCQkJCXN3aXRjaCgka2V5KSB7CgkJCQkJCQljYXNlICd0b3AnIDoKCQkJCQkJCQkkb2JqUEhQRXhjZWwtPmdldEFjdGl2ZVNoZWV0KCktPmdldFBhZ2VNYXJnaW5zKCktPnNldFRvcCgkbWFyZ2luU2l6ZSk7CgkJCQkJCQkJYnJlYWs7CgkJCQkJCQljYXNlICdib3R0b20nIDoKCQkJCQkJCQkkb2JqUEhQRXhjZWwtPmdldEFjdGl2ZVNoZWV0KCktPmdldFBhZ2VNYXJnaW5zKCktPnNldEJvdHRvbSgkbWFyZ2luU2l6ZSk7CgkJCQkJCQkJYnJlYWs7CgkJCQkJCQljYXNlICdsZWZ0JyA6CgkJCQkJCQkJJG9ialBIUEV4Y2VsLT5nZXRBY3RpdmVTaGVldCgpLT5nZXRQYWdlTWFyZ2lucygpLT5zZXRMZWZ0KCRtYXJnaW5TaXplKTsKCQkJCQkJCQlicmVhazsKCQkJCQkJCWNhc2UgJ3JpZ2h0JyA6CgkJCQkJCQkJJG9ialBIUEV4Y2VsLT5nZXRBY3RpdmVTaGVldCgpLT5nZXRQYWdlTWFyZ2lucygpLT5zZXRSaWdodCgkbWFyZ2luU2l6ZSk7CgkJCQkJCQkJYnJlYWs7CgkJCQkJCQljYXNlICdoZWFkZXInIDoKCQkJCQkJCQkkb2JqUEhQRXhjZWwtPmdldEFjdGl2ZVNoZWV0KCktPmdldFBhZ2VNYXJnaW5zKCktPnNldEhlYWRlcigkbWFyZ2luU2l6ZSk7CgkJCQkJCQkJYnJlYWs7CgkJCQkJCQljYXNlICdmb290ZXInIDoKCQkJCQkJCQkkb2JqUEhQRXhjZWwtPmdldEFjdGl2ZVNoZWV0KCktPmdldFBhZ2VNYXJnaW5zKCktPnNldEZvb3RlcigkbWFyZ2luU2l6ZSk7CgkJCQkJCQkJYnJlYWs7CgkJCQkJCX0KCQkJCQl9CgkJCQl9CgkJCX0KCgkJCWZvcmVhY2goJHNoZWV0LT5DZWxscy0+Q2VsbCBhcyAkY2VsbCkgewoJCQkJJGNlbGxBdHRyaWJ1dGVzID0gJGNlbGwtPmF0dHJpYnV0ZXMoKTsKCQkJCSRyb3cgPSAoaW50KSAkY2VsbEF0dHJpYnV0ZXMtPlJvdyArIDE7CgkJCQkkY29sdW1uID0gKGludCkgJGNlbGxBdHRyaWJ1dGVzLT5Db2w7CgoJCQkJaWYgKCRyb3cgPiAkbWF4Um93KSAkbWF4Um93ID0gJHJvdzsKCQkJCWlmICgkY29sdW1uID4gJG1heENvbCkgJG1heENvbCA9ICRjb2x1bW47CgoJCQkJJGNvbHVtbiA9IFBIUEV4Y2VsX0NlbGw6OnN0cmluZ0Zyb21Db2x1bW5JbmRleCgkY29sdW1uKTsKCgkJCQkvLyBSZWFkIGNlbGw/CgkJCQlpZiAoJHRoaXMtPmdldFJlYWRGaWx0ZXIoKSAhPT0gTlVMTCkgewoJCQkJCWlmICghJHRoaXMtPmdldFJlYWRGaWx0ZXIoKS0+cmVhZENlbGwoJGNvbHVtbiwgJHJvdywgJHdvcmtzaGVldE5hbWUpKSB7CgkJCQkJCWNvbnRpbnVlOwoJCQkJCX0KCQkJCX0KCgkJCQkkVmFsdWVUeXBlID0gJGNlbGxBdHRyaWJ1dGVzLT5WYWx1ZVR5cGU7CgkJCQkkRXhwcklEID0gKHN0cmluZykgJGNlbGxBdHRyaWJ1dGVzLT5FeHBySUQ7Ci8vCQkJCWVjaG8gJ0NlbGwgJywkY29sdW1uLCRyb3csJzxiciAvPic7Ci8vCQkJCWVjaG8gJ1R5cGUgaXMgJywkVmFsdWVUeXBlLCc8YnIgLz4nOwovLwkJCQllY2hvICdWYWx1ZSBpcyAnLCRjZWxsLCc8YnIgLz4nOwoJCQkJJHR5cGUgPSBQSFBFeGNlbF9DZWxsX0RhdGFUeXBlOjpUWVBFX0ZPUk1VTEE7CgkJCQlpZiAoJEV4cHJJRCA+ICcnKSB7CgkJCQkJaWYgKCgoc3RyaW5nKSAkY2VsbCkgPiAnJykgewoKCQkJCQkJJHRoaXMtPl9leHByZXNzaW9uc1skRXhwcklEXSA9IGFycmF5KCAnY29sdW1uJwk9PiAkY2VsbEF0dHJpYnV0ZXMtPkNvbCwKCQkJCQkJCQkJCQkJCQkJICAncm93JwkJPT4gJGNlbGxBdHRyaWJ1dGVzLT5Sb3csCgkJCQkJCQkJCQkJCQkJCSAgJ2Zvcm11bGEnCT0+IChzdHJpbmcpICRjZWxsCgkJCQkJCQkJCQkJCQkJCSk7Ci8vCQkJCQkJZWNobyAnTkVXIEVYUFJFU1NJT04gJywkRXhwcklELCc8YnIgLz4nOwoJCQkJCX0gZWxzZSB7CgkJCQkJCSRleHByZXNzaW9uID0gJHRoaXMtPl9leHByZXNzaW9uc1skRXhwcklEXTsKCgkJCQkJCSRjZWxsID0gJHRoaXMtPl9yZWZlcmVuY2VIZWxwZXItPnVwZGF0ZUZvcm11bGFSZWZlcmVuY2VzKCAkZXhwcmVzc2lvblsnZm9ybXVsYSddLAoJCQkJCQkJCQkJCQkJCQkJCQkJCSAgJ0ExJywKCQkJCQkJCQkJCQkJCQkJCQkJCQkgICRjZWxsQXR0cmlidXRlcy0+Q29sIC0gJGV4cHJlc3Npb25bJ2NvbHVtbiddLAoJCQkJCQkJCQkJCQkJCQkJCQkJCSAgJGNlbGxBdHRyaWJ1dGVzLT5Sb3cgLSAkZXhwcmVzc2lvblsncm93J10sCgkJCQkJCQkJCQkJCQkJCQkJCQkJICAkd29ya3NoZWV0TmFtZQoJCQkJCQkJCQkJCQkJCQkJCQkJCSk7Ci8vCQkJCQkJZWNobyAnU0hBUkVEIEVYUFJFU1NJT04gJywkRXhwcklELCc8YnIgLz4nOwovLwkJCQkJCWVjaG8gJ05ldyBWYWx1ZSBpcyAnLCRjZWxsLCc8YnIgLz4nOwoJCQkJCX0KCQkJCQkkdHlwZSA9IFBIUEV4Y2VsX0NlbGxfRGF0YVR5cGU6OlRZUEVfRk9STVVMQTsKCQkJCX0gZWxzZSB7CgkJCQkJc3dpdGNoKCRWYWx1ZVR5cGUpIHsKCQkJCQkJY2FzZSAnMTAnIDoJCS8vCU5VTEwKCQkJCQkJCSR0eXBlID0gUEhQRXhjZWxfQ2VsbF9EYXRhVHlwZTo6VFlQRV9OVUxMOwoJCQkJCQkJYnJlYWs7CgkJCQkJCWNhc2UgJzIwJyA6CQkvLwlCb29sZWFuCgkJCQkJCQkkdHlwZSA9IFBIUEV4Y2VsX0NlbGxfRGF0YVR5cGU6OlRZUEVfQk9PTDsKCQkJCQkJCSRjZWxsID0gKCRjZWxsID09ICdUUlVFJykgPyBUcnVlIDogRmFsc2U7CgkJCQkJCQlicmVhazsKCQkJCQkJY2FzZSAnMzAnIDoJCS8vCUludGVnZXIKCQkJCQkJCSRjZWxsID0gaW50dmFsKCRjZWxsKTsKCQkJCQkJY2FzZSAnNDAnIDoJCS8vCUZsb2F0CgkJCQkJCQkkdHlwZSA9IFBIUEV4Y2VsX0NlbGxfRGF0YVR5cGU6OlRZUEVfTlVNRVJJQzsKCQkJCQkJCWJyZWFrOwoJCQkJCQljYXNlICc1MCcgOgkJLy8JRXJyb3IKCQkJCQkJCSR0eXBlID0gUEhQRXhjZWxfQ2VsbF9EYXRhVHlwZTo6VFlQRV9FUlJPUjsKCQkJCQkJCWJyZWFrOwoJCQkJCQljYXNlICc2MCcgOgkJLy8JU3RyaW5nCgkJCQkJCQkkdHlwZSA9IFBIUEV4Y2VsX0NlbGxfRGF0YVR5cGU6OlRZUEVfU1RSSU5HOwoJCQkJCQkJYnJlYWs7CgkJCQkJCWNhc2UgJzcwJyA6CQkvLwlDZWxsIFJhbmdlCgkJCQkJCWNhc2UgJzgwJyA6CQkvLwlBcnJheQoJCQkJCX0KCQkJCX0KCQkJCSRvYmpQSFBFeGNlbC0+Z2V0QWN0aXZlU2hlZXQoKS0+Z2V0Q2VsbCgkY29sdW1uLiRyb3cpLT5zZXRWYWx1ZUV4cGxpY2l0KCRjZWxsLCR0eXBlKTsKCQkJfQoKCQkJaWYgKCghJHRoaXMtPl9yZWFkRGF0YU9ubHkpICYmIChpc3NldCgkc2hlZXQtPk9iamVjdHMpKSkgewoJCQkJZm9yZWFjaCgkc2hlZXQtPk9iamVjdHMtPmNoaWxkcmVuKCdnbm0nLFRSVUUpIGFzICRrZXkgPT4gJGNvbW1lbnQpIHsKCQkJCQkkY29tbWVudEF0dHJpYnV0ZXMgPSAkY29tbWVudC0+YXR0cmlidXRlcygpOwoJCQkJCS8vCU9ubHkgY29tbWVudCBvYmplY3RzIGFyZSBoYW5kbGVkIGF0IHRoZSBtb21lbnQKCQkJCQlpZiAoJGNvbW1lbnRBdHRyaWJ1dGVzLT5UZXh0KSB7CgkJCQkJCSRvYmpQSFBFeGNlbC0+Z2V0QWN0aXZlU2hlZXQoKS0+Z2V0Q29tbWVudCggKHN0cmluZykkY29tbWVudEF0dHJpYnV0ZXMtPk9iamVjdEJvdW5kICkKCQkJCQkJCQkJCQkJCQkJLT5zZXRBdXRob3IoIChzdHJpbmcpJGNvbW1lbnRBdHRyaWJ1dGVzLT5BdXRob3IgKQoJCQkJCQkJCQkJCQkJCQktPnNldFRleHQoJHRoaXMtPl9wYXJzZVJpY2hUZXh0KChzdHJpbmcpJGNvbW1lbnRBdHRyaWJ1dGVzLT5UZXh0KSApOwoJCQkJCX0KCQkJCX0KCQkJfQovLwkJCWVjaG8gJyRtYXhDb2w9JywkbWF4Q29sLCc7ICRtYXhSb3c9JywkbWF4Um93LCc8YnIgLz4nOwovLwoJCQlmb3JlYWNoKCRzaGVldC0+U3R5bGVzLT5TdHlsZVJlZ2lvbiBhcyAkc3R5bGVSZWdpb24pIHsKCQkJCSRzdHlsZUF0dHJpYnV0ZXMgPSAkc3R5bGVSZWdpb24tPmF0dHJpYnV0ZXMoKTsKCQkJCWlmICgoJHN0eWxlQXR0cmlidXRlc1snc3RhcnRSb3cnXSA8PSAkbWF4Um93KSAmJgoJCQkJCSgkc3R5bGVBdHRyaWJ1dGVzWydzdGFydENvbCddIDw9ICRtYXhDb2wpKSB7CgoJCQkJCSRzdGFydENvbHVtbiA9IFBIUEV4Y2VsX0NlbGw6OnN0cmluZ0Zyb21Db2x1bW5JbmRleCgoaW50KSAkc3R5bGVBdHRyaWJ1dGVzWydzdGFydENvbCddKTsKCQkJCQkkc3RhcnRSb3cgPSAkc3R5bGVBdHRyaWJ1dGVzWydzdGFydFJvdyddICsgMTsKCgkJCQkJJGVuZENvbHVtbiA9ICgkc3R5bGVBdHRyaWJ1dGVzWydlbmRDb2wnXSA+ICRtYXhDb2wpID8gJG1heENvbCA6IChpbnQpICRzdHlsZUF0dHJpYnV0ZXNbJ2VuZENvbCddOwoJCQkJCSRlbmRDb2x1bW4gPSBQSFBFeGNlbF9DZWxsOjpzdHJpbmdGcm9tQ29sdW1uSW5kZXgoJGVuZENvbHVtbik7CgkJCQkJJGVuZFJvdyA9ICgkc3R5bGVBdHRyaWJ1dGVzWydlbmRSb3cnXSA+ICRtYXhSb3cpID8gJG1heFJvdyA6ICRzdHlsZUF0dHJpYnV0ZXNbJ2VuZFJvdyddOwoJCQkJCSRlbmRSb3cgKz0gMTsKCQkJCQkkY2VsbFJhbmdlID0gJHN0YXJ0Q29sdW1uLiRzdGFydFJvdy4nOicuJGVuZENvbHVtbi4kZW5kUm93OwovLwkJCQkJZWNobyAkY2VsbFJhbmdlLCc8YnIgLz4nOwoKCQkJCQkkc3R5bGVBdHRyaWJ1dGVzID0gJHN0eWxlUmVnaW9uLT5TdHlsZS0+YXR0cmlidXRlcygpOwovLwkJCQkJdmFyX2R1bXAoJHN0eWxlQXR0cmlidXRlcyk7Ci8vCQkJCQllY2hvICc8YnIgLz4nOwoKCQkJCQkvLwlXZSBzdGlsbCBzZXQgdGhlIG51bWJlciBmb3JtYXQgbWFzayBmb3IgZGF0ZS90aW1lIHZhbHVlcywgZXZlbiBpZiBfcmVhZERhdGFPbmx5IGlzIHRydWUKCQkJCQlpZiAoKCEkdGhpcy0+X3JlYWREYXRhT25seSkgfHwKCQkJCQkJKFBIUEV4Y2VsX1NoYXJlZF9EYXRlOjppc0RhdGVUaW1lRm9ybWF0Q29kZSgkc3R5bGVBcnJheVsnbnVtYmVyZm9ybWF0J11bJ2NvZGUnXSkpKSB7CgkJCQkJCSRzdHlsZUFycmF5ID0gYXJyYXkoKTsKCQkJCQkJJHN0eWxlQXJyYXlbJ251bWJlcmZvcm1hdCddWydjb2RlJ10gPSAoc3RyaW5nKSAkc3R5bGVBdHRyaWJ1dGVzWydGb3JtYXQnXTsKCQkJCQkJLy8JSWYgX3JlYWREYXRhT25seSBpcyBmYWxzZSwgd2Ugc2V0IGFsbCBmb3JtYXR0aW5nIGluZm9ybWF0aW9uCgkJCQkJCWlmICghJHRoaXMtPl9yZWFkRGF0YU9ubHkpIHsKCQkJCQkJCXN3aXRjaCgkc3R5bGVBdHRyaWJ1dGVzWydIQWxpZ24nXSkgewoJCQkJCQkJCWNhc2UgJzEnIDoKCQkJCQkJCQkJJHN0eWxlQXJyYXlbJ2FsaWdubWVudCddWydob3Jpem9udGFsJ10gPSBQSFBFeGNlbF9TdHlsZV9BbGlnbm1lbnQ6OkhPUklaT05UQUxfR0VORVJBTDsKCQkJCQkJCQkJYnJlYWs7CgkJCQkJCQkJY2FzZSAnMicgOgoJCQkJCQkJCQkkc3R5bGVBcnJheVsnYWxpZ25tZW50J11bJ2hvcml6b250YWwnXSA9IFBIUEV4Y2VsX1N0eWxlX0FsaWdubWVudDo6SE9SSVpPTlRBTF9MRUZUOwoJCQkJCQkJCQlicmVhazsKCQkJCQkJCQljYXNlICc0JyA6CgkJCQkJCQkJCSRzdHlsZUFycmF5WydhbGlnbm1lbnQnXVsnaG9yaXpvbnRhbCddID0gUEhQRXhjZWxfU3R5bGVfQWxpZ25tZW50OjpIT1JJWk9OVEFMX1JJR0hUOwoJCQkJCQkJCQlicmVhazsKCQkJCQkJCQljYXNlICc4JyA6CgkJCQkJCQkJCSRzdHlsZUFycmF5WydhbGlnbm1lbnQnXVsnaG9yaXpvbnRhbCddID0gUEhQRXhjZWxfU3R5bGVfQWxpZ25tZW50OjpIT1JJWk9OVEFMX0NFTlRFUjsKCQkJCQkJCQkJYnJlYWs7CgkJCQkJCQkJY2FzZSAnMTYnIDoKCQkJCQkJCQljYXNlICc2NCcgOgoJCQkJCQkJCQkkc3R5bGVBcnJheVsnYWxpZ25tZW50J11bJ2hvcml6b250YWwnXSA9IFBIUEV4Y2VsX1N0eWxlX0FsaWdubWVudDo6SE9SSVpPTlRBTF9DRU5URVJfQ09OVElOVU9VUzsKCQkJCQkJCQkJYnJlYWs7CgkJCQkJCQkJY2FzZSAnMzInIDoKCQkJCQkJCQkJJHN0eWxlQXJyYXlbJ2FsaWdubWVudCddWydob3Jpem9udGFsJ10gPSBQSFBFeGNlbF9TdHlsZV9BbGlnbm1lbnQ6OkhPUklaT05UQUxfSlVTVElGWTsKCQkJCQkJCQkJYnJlYWs7CgkJCQkJCQl9CgoJCQkJCQkJc3dpdGNoKCRzdHlsZUF0dHJpYnV0ZXNbJ1ZBbGlnbiddKSB7CgkJCQkJCQkJY2FzZSAnMScgOgoJCQkJCQkJCQkkc3R5bGVBcnJheVsnYWxpZ25tZW50J11bJ3ZlcnRpY2FsJ10gPSBQSFBFeGNlbF9TdHlsZV9BbGlnbm1lbnQ6OlZFUlRJQ0FMX1RPUDsKCQkJCQkJCQkJYnJlYWs7CgkJCQkJCQkJY2FzZSAnMicgOgoJCQkJCQkJCQkkc3R5bGVBcnJheVsnYWxpZ25tZW50J11bJ3ZlcnRpY2FsJ10gPSBQSFBFeGNlbF9TdHlsZV9BbGlnbm1lbnQ6OlZFUlRJQ0FMX0JPVFRPTTsKCQkJCQkJCQkJYnJlYWs7CgkJCQkJCQkJY2FzZSAnNCcgOgoJCQkJCQkJCQkkc3R5bGVBcnJheVsnYWxpZ25tZW50J11bJ3ZlcnRpY2FsJ10gPSBQSFBFeGNlbF9TdHlsZV9BbGlnbm1lbnQ6OlZFUlRJQ0FMX0NFTlRFUjsKCQkJCQkJCQkJYnJlYWs7CgkJCQkJCQkJY2FzZSAnOCcgOgoJCQkJCQkJCQkkc3R5bGVBcnJheVsnYWxpZ25tZW50J11bJ3ZlcnRpY2FsJ10gPSBQSFBFeGNlbF9TdHlsZV9BbGlnbm1lbnQ6OlZFUlRJQ0FMX0pVU1RJRlk7CgkJCQkJCQkJCWJyZWFrOwoJCQkJCQkJfQoKCQkJCQkJCSRzdHlsZUFycmF5WydhbGlnbm1lbnQnXVsnd3JhcCddID0gKCRzdHlsZUF0dHJpYnV0ZXNbJ1dyYXBUZXh0J10gPT0gJzEnKSA/IFRydWUgOiBGYWxzZTsKCQkJCQkJCSRzdHlsZUFycmF5WydhbGlnbm1lbnQnXVsnc2hyaW5rVG9GaXQnXSA9ICgkc3R5bGVBdHRyaWJ1dGVzWydTaHJpbmtUb0ZpdCddID09ICcxJykgPyBUcnVlIDogRmFsc2U7CgkJCQkJCQkkc3R5bGVBcnJheVsnYWxpZ25tZW50J11bJ2luZGVudCddID0gKGludHZhbCgkc3R5bGVBdHRyaWJ1dGVzWyJJbmRlbnQiXSkgPiAwKSA/ICRzdHlsZUF0dHJpYnV0ZXNbImluZGVudCJdIDogMDsKCgkJCQkJCQkkUkdCID0gc2VsZjo6X3BhcnNlR251bWVyaWNDb2xvdXIoJHN0eWxlQXR0cmlidXRlc1siRm9yZSJdKTsKCQkJCQkJCSRzdHlsZUFycmF5Wydmb250J11bJ2NvbG9yJ11bJ3JnYiddID0gJFJHQjsKCQkJCQkJCSRSR0IgPSBzZWxmOjpfcGFyc2VHbnVtZXJpY0NvbG91cigkc3R5bGVBdHRyaWJ1dGVzWyJCYWNrIl0pOwoJCQkJCQkJJHNoYWRlID0gJHN0eWxlQXR0cmlidXRlc1siU2hhZGUiXTsKCQkJCQkJCWlmICgoJFJHQiAhPSAnMDAwMDAwJykgfHwgKCRzaGFkZSAhPSAnMCcpKSB7CgkJCQkJCQkJJHN0eWxlQXJyYXlbJ2ZpbGwnXVsnY29sb3InXVsncmdiJ10gPSAkc3R5bGVBcnJheVsnZmlsbCddWydzdGFydGNvbG9yJ11bJ3JnYiddID0gJFJHQjsKCQkJCQkJCQkkUkdCMiA9IHNlbGY6Ol9wYXJzZUdudW1lcmljQ29sb3VyKCRzdHlsZUF0dHJpYnV0ZXNbIlBhdHRlcm5Db2xvciJdKTsKCQkJCQkJCQkkc3R5bGVBcnJheVsnZmlsbCddWydlbmRjb2xvciddWydyZ2InXSA9ICRSR0IyOwoJCQkJCQkJCXN3aXRjaCgkc2hhZGUpIHsKCQkJCQkJCQkJY2FzZSAnMScgOgoJCQkJCQkJCQkJJHN0eWxlQXJyYXlbJ2ZpbGwnXVsndHlwZSddID0gUEhQRXhjZWxfU3R5bGVfRmlsbDo6RklMTF9TT0xJRDsKCQkJCQkJCQkJCWJyZWFrOwoJCQkJCQkJCQljYXNlICcyJyA6CgkJCQkJCQkJCQkkc3R5bGVBcnJheVsnZmlsbCddWyd0eXBlJ10gPSBQSFBFeGNlbF9TdHlsZV9GaWxsOjpGSUxMX0dSQURJRU5UX0xJTkVBUjsKCQkJCQkJCQkJCWJyZWFrOwoJCQkJCQkJCQljYXNlICczJyA6CgkJCQkJCQkJCQkkc3R5bGVBcnJheVsnZmlsbCddWyd0eXBlJ10gPSBQSFBFeGNlbF9TdHlsZV9GaWxsOjpGSUxMX0dSQURJRU5UX1BBVEg7CgkJCQkJCQkJCQlicmVhazsKCQkJCQkJCQkJY2FzZSAnNCcgOgoJCQkJCQkJCQkJJHN0eWxlQXJyYXlbJ2ZpbGwnXVsndHlwZSddID0gUEhQRXhjZWxfU3R5bGVfRmlsbDo6RklMTF9QQVRURVJOX0RBUktET1dOOwoJCQkJCQkJCQkJYnJlYWs7CgkJCQkJCQkJCWNhc2UgJzUnIDoKCQkJCQkJCQkJCSRzdHlsZUFycmF5WydmaWxsJ11bJ3R5cGUnXSA9IFBIUEV4Y2VsX1N0eWxlX0ZpbGw6OkZJTExfUEFUVEVSTl9EQVJLR1JBWTsKCQkJCQkJCQkJCWJyZWFrOwoJCQkJCQkJCQljYXNlICc2JyA6CgkJCQkJCQkJCQkkc3R5bGVBcnJheVsnZmlsbCddWyd0eXBlJ10gPSBQSFBFeGNlbF9TdHlsZV9GaWxsOjpGSUxMX1BBVFRFUk5fREFSS0dSSUQ7CgkJCQkJCQkJCQlicmVhazsKCQkJCQkJCQkJY2FzZSAnNycgOgoJCQkJCQkJCQkJJHN0eWxlQXJyYXlbJ2ZpbGwnXVsndHlwZSddID0gUEhQRXhjZWxfU3R5bGVfRmlsbDo6RklMTF9QQVRURVJOX0RBUktIT1JJWk9OVEFMOwoJCQkJCQkJCQkJYnJlYWs7CgkJCQkJCQkJCWNhc2UgJzgnIDoKCQkJCQkJCQkJCSRzdHlsZUFycmF5WydmaWxsJ11bJ3R5cGUnXSA9IFBIUEV4Y2VsX1N0eWxlX0ZpbGw6OkZJTExfUEFUVEVSTl9EQVJLVFJFTExJUzsKCQkJCQkJCQkJCWJyZWFrOwoJCQkJCQkJCQljYXNlICc5JyA6CgkJCQkJCQkJCQkkc3R5bGVBcnJheVsnZmlsbCddWyd0eXBlJ10gPSBQSFBFeGNlbF9TdHlsZV9GaWxsOjpGSUxMX1BBVFRFUk5fREFSS1VQOwoJCQkJCQkJCQkJYnJlYWs7CgkJCQkJCQkJCWNhc2UgJzEwJyA6CgkJCQkJCQkJCQkkc3R5bGVBcnJheVsnZmlsbCddWyd0eXBlJ10gPSBQSFBFeGNlbF9TdHlsZV9GaWxsOjpGSUxMX1BBVFRFUk5fREFSS1ZFUlRJQ0FMOwoJCQkJCQkJCQkJYnJlYWs7CgkJCQkJCQkJCWNhc2UgJzExJyA6CgkJCQkJCQkJCQkkc3R5bGVBcnJheVsnZmlsbCddWyd0eXBlJ10gPSBQSFBFeGNlbF9TdHlsZV9GaWxsOjpGSUxMX1BBVFRFUk5fR1JBWTA2MjU7CgkJCQkJCQkJCQlicmVhazsKCQkJCQkJCQkJY2FzZSAnMTInIDoKCQkJCQkJCQkJCSRzdHlsZUFycmF5WydmaWxsJ11bJ3R5cGUnXSA9IFBIUEV4Y2VsX1N0eWxlX0ZpbGw6OkZJTExfUEFUVEVSTl9HUkFZMTI1OwoJCQkJCQkJCQkJYnJlYWs7CgkJCQkJCQkJCWNhc2UgJzEzJyA6CgkJCQkJCQkJCQkkc3R5bGVBcnJheVsnZmlsbCddWyd0eXBlJ10gPSBQSFBFeGNlbF9TdHlsZV9GaWxsOjpGSUxMX1BBVFRFUk5fTElHSFRET1dOOwoJCQkJCQkJCQkJYnJlYWs7CgkJCQkJCQkJCWNhc2UgJzE0JyA6CgkJCQkJCQkJCQkkc3R5bGVBcnJheVsnZmlsbCddWyd0eXBlJ10gPSBQSFBFeGNlbF9TdHlsZV9GaWxsOjpGSUxMX1BBVFRFUk5fTElHSFRHUkFZOwoJCQkJCQkJCQkJYnJlYWs7CgkJCQkJCQkJCWNhc2UgJzE1JyA6CgkJCQkJCQkJCQkkc3R5bGVBcnJheVsnZmlsbCddWyd0eXBlJ10gPSBQSFBFeGNlbF9TdHlsZV9GaWxsOjpGSUxMX1BBVFRFUk5fTElHSFRHUklEOwoJCQkJCQkJCQkJYnJlYWs7CgkJCQkJCQkJCWNhc2UgJzE2JyA6CgkJCQkJCQkJCQkkc3R5bGVBcnJheVsnZmlsbCddWyd0eXBlJ10gPSBQSFBFeGNlbF9TdHlsZV9GaWxsOjpGSUxMX1BBVFRFUk5fTElHSFRIT1JJWk9OVEFMOwoJCQkJCQkJCQkJYnJlYWs7CgkJCQkJCQkJCWNhc2UgJzE3JyA6CgkJCQkJCQkJCQkkc3R5bGVBcnJheVsnZmlsbCddWyd0eXBlJ10gPSBQSFBFeGNlbF9TdHlsZV9GaWxsOjpGSUxMX1BBVFRFUk5fTElHSFRUUkVMTElTOwoJCQkJCQkJCQkJYnJlYWs7CgkJCQkJCQkJCWNhc2UgJzE4JyA6CgkJCQkJCQkJCQkkc3R5bGVBcnJheVsnZmlsbCddWyd0eXBlJ10gPSBQSFBFeGNlbF9TdHlsZV9GaWxsOjpGSUxMX1BBVFRFUk5fTElHSFRVUDsKCQkJCQkJCQkJCWJyZWFrOwoJCQkJCQkJCQljYXNlICcxOScgOgoJCQkJCQkJCQkJJHN0eWxlQXJyYXlbJ2ZpbGwnXVsndHlwZSddID0gUEhQRXhjZWxfU3R5bGVfRmlsbDo6RklMTF9QQVRURVJOX0xJR0hUVkVSVElDQUw7CgkJCQkJCQkJCQlicmVhazsKCQkJCQkJCQkJY2FzZSAnMjAnIDoKCQkJCQkJCQkJCSRzdHlsZUFycmF5WydmaWxsJ11bJ3R5cGUnXSA9IFBIUEV4Y2VsX1N0eWxlX0ZpbGw6OkZJTExfUEFUVEVSTl9NRURJVU1HUkFZOwoJCQkJCQkJCQkJYnJlYWs7CgkJCQkJCQkJfQoJCQkJCQkJfQoKCQkJCQkJCSRmb250QXR0cmlidXRlcyA9ICRzdHlsZVJlZ2lvbi0+U3R5bGUtPkZvbnQtPmF0dHJpYnV0ZXMoKTsKLy8JCQkJCQkJdmFyX2R1bXAoJGZvbnRBdHRyaWJ1dGVzKTsKLy8JCQkJCQkJZWNobyAnPGJyIC8+JzsKCQkJCQkJCSRzdHlsZUFycmF5Wydmb250J11bJ25hbWUnXSA9IChzdHJpbmcpICRzdHlsZVJlZ2lvbi0+U3R5bGUtPkZvbnQ7CgkJCQkJCQkkc3R5bGVBcnJheVsnZm9udCddWydzaXplJ10gPSBpbnR2YWwoJGZvbnRBdHRyaWJ1dGVzWydVbml0J10pOwoJCQkJCQkJJHN0eWxlQXJyYXlbJ2ZvbnQnXVsnYm9sZCddID0gKCRmb250QXR0cmlidXRlc1snQm9sZCddID09ICcxJykgPyBUcnVlIDogRmFsc2U7CgkJCQkJCQkkc3R5bGVBcnJheVsnZm9udCddWydpdGFsaWMnXSA9ICgkZm9udEF0dHJpYnV0ZXNbJ0l0YWxpYyddID09ICcxJykgPyBUcnVlIDogRmFsc2U7CgkJCQkJCQkkc3R5bGVBcnJheVsnZm9udCddWydzdHJpa2UnXSA9ICgkZm9udEF0dHJpYnV0ZXNbJ1N0cmlrZVRocm91Z2gnXSA9PSAnMScpID8gVHJ1ZSA6IEZhbHNlOwoJCQkJCQkJc3dpdGNoKCRmb250QXR0cmlidXRlc1snVW5kZXJsaW5lJ10pIHsKCQkJCQkJCQljYXNlICcxJyA6CgkJCQkJCQkJCSRzdHlsZUFycmF5Wydmb250J11bJ3VuZGVybGluZSddID0gUEhQRXhjZWxfU3R5bGVfRm9udDo6VU5ERVJMSU5FX1NJTkdMRTsKCQkJCQkJCQkJYnJlYWs7CgkJCQkJCQkJY2FzZSAnMicgOgoJCQkJCQkJCQkkc3R5bGVBcnJheVsnZm9udCddWyd1bmRlcmxpbmUnXSA9IFBIUEV4Y2VsX1N0eWxlX0ZvbnQ6OlVOREVSTElORV9ET1VCTEU7CgkJCQkJCQkJCWJyZWFrOwoJCQkJCQkJCWNhc2UgJzMnIDoKCQkJCQkJCQkJJHN0eWxlQXJyYXlbJ2ZvbnQnXVsndW5kZXJsaW5lJ10gPSBQSFBFeGNlbF9TdHlsZV9Gb250OjpVTkRFUkxJTkVfU0lOR0xFQUNDT1VOVElORzsKCQkJCQkJCQkJYnJlYWs7CgkJCQkJCQkJY2FzZSAnNCcgOgoJCQkJCQkJCQkkc3R5bGVBcnJheVsnZm9udCddWyd1bmRlcmxpbmUnXSA9IFBIUEV4Y2VsX1N0eWxlX0ZvbnQ6OlVOREVSTElORV9ET1VCTEVBQ0NPVU5USU5HOwoJCQkJCQkJCQlicmVhazsKCQkJCQkJCQlkZWZhdWx0IDoKCQkJCQkJCQkJJHN0eWxlQXJyYXlbJ2ZvbnQnXVsndW5kZXJsaW5lJ10gPSBQSFBFeGNlbF9TdHlsZV9Gb250OjpVTkRFUkxJTkVfTk9ORTsKCQkJCQkJCQkJYnJlYWs7CgkJCQkJCQl9CgkJCQkJCQlzd2l0Y2goJGZvbnRBdHRyaWJ1dGVzWydTY3JpcHQnXSkgewoJCQkJCQkJCWNhc2UgJzEnIDoKCQkJCQkJCQkJJHN0eWxlQXJyYXlbJ2ZvbnQnXVsnc3VwZXJTY3JpcHQnXSA9IFRydWU7CgkJCQkJCQkJCWJyZWFrOwoJCQkJCQkJCWNhc2UgJy0xJyA6CgkJCQkJCQkJCSRzdHlsZUFycmF5Wydmb250J11bJ3N1YlNjcmlwdCddID0gVHJ1ZTsKCQkJCQkJCQkJYnJlYWs7CgkJCQkJCQl9CgoJCQkJCQkJaWYgKGlzc2V0KCRzdHlsZVJlZ2lvbi0+U3R5bGUtPlN0eWxlQm9yZGVyKSkgewoJCQkJCQkJCWlmIChpc3NldCgkc3R5bGVSZWdpb24tPlN0eWxlLT5TdHlsZUJvcmRlci0+VG9wKSkgewoJCQkJCQkJCQkkc3R5bGVBcnJheVsnYm9yZGVycyddWyd0b3AnXSA9IHNlbGY6Ol9wYXJzZUJvcmRlckF0dHJpYnV0ZXMoJHN0eWxlUmVnaW9uLT5TdHlsZS0+U3R5bGVCb3JkZXItPlRvcC0+YXR0cmlidXRlcygpKTsKCQkJCQkJCQl9CgkJCQkJCQkJaWYgKGlzc2V0KCRzdHlsZVJlZ2lvbi0+U3R5bGUtPlN0eWxlQm9yZGVyLT5Cb3R0b20pKSB7CgkJCQkJCQkJCSRzdHlsZUFycmF5Wydib3JkZXJzJ11bJ2JvdHRvbSddID0gc2VsZjo6X3BhcnNlQm9yZGVyQXR0cmlidXRlcygkc3R5bGVSZWdpb24tPlN0eWxlLT5TdHlsZUJvcmRlci0+Qm90dG9tLT5hdHRyaWJ1dGVzKCkpOwoJCQkJCQkJCX0KCQkJCQkJCQlpZiAoaXNzZXQoJHN0eWxlUmVnaW9uLT5TdHlsZS0+U3R5bGVCb3JkZXItPkxlZnQpKSB7CgkJCQkJCQkJCSRzdHlsZUFycmF5Wydib3JkZXJzJ11bJ2xlZnQnXSA9IHNlbGY6Ol9wYXJzZUJvcmRlckF0dHJpYnV0ZXMoJHN0eWxlUmVnaW9uLT5TdHlsZS0+U3R5bGVCb3JkZXItPkxlZnQtPmF0dHJpYnV0ZXMoKSk7CgkJCQkJCQkJfQoJCQkJCQkJCWlmIChpc3NldCgkc3R5bGVSZWdpb24tPlN0eWxlLT5TdHlsZUJvcmRlci0+UmlnaHQpKSB7CgkJCQkJCQkJCSRzdHlsZUFycmF5Wydib3JkZXJzJ11bJ3JpZ2h0J10gPSBzZWxmOjpfcGFyc2VCb3JkZXJBdHRyaWJ1dGVzKCRzdHlsZVJlZ2lvbi0+U3R5bGUtPlN0eWxlQm9yZGVyLT5SaWdodC0+YXR0cmlidXRlcygpKTsKCQkJCQkJCQl9CgkJCQkJCQkJaWYgKChpc3NldCgkc3R5bGVSZWdpb24tPlN0eWxlLT5TdHlsZUJvcmRlci0+RGlhZ29uYWwpKSAmJiAoaXNzZXQoJHN0eWxlUmVnaW9uLT5TdHlsZS0+U3R5bGVCb3JkZXItPnsnUmV2LURpYWdvbmFsJ30pKSkgewoJCQkJCQkJCQkkc3R5bGVBcnJheVsnYm9yZGVycyddWydkaWFnb25hbCddID0gc2VsZjo6X3BhcnNlQm9yZGVyQXR0cmlidXRlcygkc3R5bGVSZWdpb24tPlN0eWxlLT5TdHlsZUJvcmRlci0+RGlhZ29uYWwtPmF0dHJpYnV0ZXMoKSk7CgkJCQkJCQkJCSRzdHlsZUFycmF5Wydib3JkZXJzJ11bJ2RpYWdvbmFsZGlyZWN0aW9uJ10gPSBQSFBFeGNlbF9TdHlsZV9Cb3JkZXJzOjpESUFHT05BTF9CT1RIOwoJCQkJCQkJCX0gZWxzZWlmIChpc3NldCgkc3R5bGVSZWdpb24tPlN0eWxlLT5TdHlsZUJvcmRlci0+RGlhZ29uYWwpKSB7CgkJCQkJCQkJCSRzdHlsZUFycmF5Wydib3JkZXJzJ11bJ2RpYWdvbmFsJ10gPSBzZWxmOjpfcGFyc2VCb3JkZXJBdHRyaWJ1dGVzKCRzdHlsZVJlZ2lvbi0+U3R5bGUtPlN0eWxlQm9yZGVyLT5EaWFnb25hbC0+YXR0cmlidXRlcygpKTsKCQkJCQkJCQkJJHN0eWxlQXJyYXlbJ2JvcmRlcnMnXVsnZGlhZ29uYWxkaXJlY3Rpb24nXSA9IFBIUEV4Y2VsX1N0eWxlX0JvcmRlcnM6OkRJQUdPTkFMX1VQOwoJCQkJCQkJCX0gZWxzZWlmIChpc3NldCgkc3R5bGVSZWdpb24tPlN0eWxlLT5TdHlsZUJvcmRlci0+eydSZXYtRGlhZ29uYWwnfSkpIHsKCQkJCQkJCQkJJHN0eWxlQXJyYXlbJ2JvcmRlcnMnXVsnZGlhZ29uYWwnXSA9IHNlbGY6Ol9wYXJzZUJvcmRlckF0dHJpYnV0ZXMoJHN0eWxlUmVnaW9uLT5TdHlsZS0+U3R5bGVCb3JkZXItPnsnUmV2LURpYWdvbmFsJ30tPmF0dHJpYnV0ZXMoKSk7CgkJCQkJCQkJCSRzdHlsZUFycmF5Wydib3JkZXJzJ11bJ2RpYWdvbmFsZGlyZWN0aW9uJ10gPSBQSFBFeGNlbF9TdHlsZV9Cb3JkZXJzOjpESUFHT05BTF9ET1dOOwoJCQkJCQkJCX0KCQkJCQkJCX0KCQkJCQkJCWlmIChpc3NldCgkc3R5bGVSZWdpb24tPlN0eWxlLT5IeXBlckxpbmspKSB7CgkJCQkJCQkJLy8JVE8gRE8KCQkJCQkJCQkkaHlwZXJsaW5rID0gJHN0eWxlUmVnaW9uLT5TdHlsZS0+SHlwZXJMaW5rLT5hdHRyaWJ1dGVzKCk7CgkJCQkJCQl9CgkJCQkJCX0KLy8JCQkJCQl2YXJfZHVtcCgkc3R5bGVBcnJheSk7Ci8vCQkJCQkJZWNobyAnPGJyIC8+JzsKCQkJCQkJJG9ialBIUEV4Y2VsLT5nZXRBY3RpdmVTaGVldCgpLT5nZXRTdHlsZSgkY2VsbFJhbmdlKS0+YXBwbHlGcm9tQXJyYXkoJHN0eWxlQXJyYXkpOwoJCQkJCX0KCQkJCX0KCQkJfQoKCQkJaWYgKCghJHRoaXMtPl9yZWFkRGF0YU9ubHkpICYmIChpc3NldCgkc2hlZXQtPkNvbHMpKSkgewoJCQkJLy8JQ29sdW1uIFdpZHRocwoJCQkJJGNvbHVtbkF0dHJpYnV0ZXMgPSAkc2hlZXQtPkNvbHMtPmF0dHJpYnV0ZXMoKTsKCQkJCSRkZWZhdWx0V2lkdGggPSAkY29sdW1uQXR0cmlidXRlc1snRGVmYXVsdFNpemVQdHMnXSAgLyA1LjQ7CgkJCQkkYyA9IDA7CgkJCQlmb3JlYWNoKCRzaGVldC0+Q29scy0+Q29sSW5mbyBhcyAkY29sdW1uT3ZlcnJpZGUpIHsKCQkJCQkkY29sdW1uQXR0cmlidXRlcyA9ICRjb2x1bW5PdmVycmlkZS0+YXR0cmlidXRlcygpOwoJCQkJCSRjb2x1bW4gPSAkY29sdW1uQXR0cmlidXRlc1snTm8nXTsKCQkJCQkkY29sdW1uV2lkdGggPSAkY29sdW1uQXR0cmlidXRlc1snVW5pdCddICAvIDUuNDsKCQkJCQkkaGlkZGVuID0gKChpc3NldCgkY29sdW1uQXR0cmlidXRlc1snSGlkZGVuJ10pKSAmJiAoJGNvbHVtbkF0dHJpYnV0ZXNbJ0hpZGRlbiddID09ICcxJykpID8gdHJ1ZSA6IGZhbHNlOwoJCQkJCSRjb2x1bW5Db3VudCA9IChpc3NldCgkY29sdW1uQXR0cmlidXRlc1snQ291bnQnXSkpID8gJGNvbHVtbkF0dHJpYnV0ZXNbJ0NvdW50J10gOiAxOwoJCQkJCXdoaWxlICgkYyA8ICRjb2x1bW4pIHsKCQkJCQkJJG9ialBIUEV4Y2VsLT5nZXRBY3RpdmVTaGVldCgpLT5nZXRDb2x1bW5EaW1lbnNpb24oUEhQRXhjZWxfQ2VsbDo6c3RyaW5nRnJvbUNvbHVtbkluZGV4KCRjKSktPnNldFdpZHRoKCRkZWZhdWx0V2lkdGgpOwoJCQkJCQkrKyRjOwoJCQkJCX0KCQkJCQl3aGlsZSAoKCRjIDwgKCRjb2x1bW4rJGNvbHVtbkNvdW50KSkgJiYgKCRjIDw9ICRtYXhDb2wpKSB7CgkJCQkJCSRvYmpQSFBFeGNlbC0+Z2V0QWN0aXZlU2hlZXQoKS0+Z2V0Q29sdW1uRGltZW5zaW9uKFBIUEV4Y2VsX0NlbGw6OnN0cmluZ0Zyb21Db2x1bW5JbmRleCgkYykpLT5zZXRXaWR0aCgkY29sdW1uV2lkdGgpOwoJCQkJCQlpZiAoJGhpZGRlbikgewoJCQkJCQkJJG9ialBIUEV4Y2VsLT5nZXRBY3RpdmVTaGVldCgpLT5nZXRDb2x1bW5EaW1lbnNpb24oUEhQRXhjZWxfQ2VsbDo6c3RyaW5nRnJvbUNvbHVtbkluZGV4KCRjKSktPnNldFZpc2libGUoZmFsc2UpOwoJCQkJCQl9CgkJCQkJCSsrJGM7CgkJCQkJfQoJCQkJfQoJCQkJd2hpbGUgKCRjIDw9ICRtYXhDb2wpIHsKCQkJCQkkb2JqUEhQRXhjZWwtPmdldEFjdGl2ZVNoZWV0KCktPmdldENvbHVtbkRpbWVuc2lvbihQSFBFeGNlbF9DZWxsOjpzdHJpbmdGcm9tQ29sdW1uSW5kZXgoJGMpKS0+c2V0V2lkdGgoJGRlZmF1bHRXaWR0aCk7CgkJCQkJKyskYzsKCQkJCX0KCQkJfQoKCQkJaWYgKCghJHRoaXMtPl9yZWFkRGF0YU9ubHkpICYmIChpc3NldCgkc2hlZXQtPlJvd3MpKSkgewoJCQkJLy8JUm93IEhlaWdodHMKCQkJCSRyb3dBdHRyaWJ1dGVzID0gJHNoZWV0LT5Sb3dzLT5hdHRyaWJ1dGVzKCk7CgkJCQkkZGVmYXVsdEhlaWdodCA9ICRyb3dBdHRyaWJ1dGVzWydEZWZhdWx0U2l6ZVB0cyddOwoJCQkJJHIgPSAwOwoKCQkJCWZvcmVhY2goJHNoZWV0LT5Sb3dzLT5Sb3dJbmZvIGFzICRyb3dPdmVycmlkZSkgewoJCQkJCSRyb3dBdHRyaWJ1dGVzID0gJHJvd092ZXJyaWRlLT5hdHRyaWJ1dGVzKCk7CgkJCQkJJHJvdyA9ICRyb3dBdHRyaWJ1dGVzWydObyddOwoJCQkJCSRyb3dIZWlnaHQgPSAkcm93QXR0cmlidXRlc1snVW5pdCddOwoJCQkJCSRoaWRkZW4gPSAoKGlzc2V0KCRyb3dBdHRyaWJ1dGVzWydIaWRkZW4nXSkpICYmICgkcm93QXR0cmlidXRlc1snSGlkZGVuJ10gPT0gJzEnKSkgPyB0cnVlIDogZmFsc2U7CgkJCQkJJHJvd0NvdW50ID0gKGlzc2V0KCRyb3dBdHRyaWJ1dGVzWydDb3VudCddKSkgPyAkcm93QXR0cmlidXRlc1snQ291bnQnXSA6IDE7CgkJCQkJd2hpbGUgKCRyIDwgJHJvdykgewoJCQkJCQkrKyRyOwoJCQkJCQkkb2JqUEhQRXhjZWwtPmdldEFjdGl2ZVNoZWV0KCktPmdldFJvd0RpbWVuc2lvbigkciktPnNldFJvd0hlaWdodCgkZGVmYXVsdEhlaWdodCk7CgkJCQkJfQoJCQkJCXdoaWxlICgoJHIgPCAoJHJvdyskcm93Q291bnQpKSAmJiAoJHIgPCAkbWF4Um93KSkgewoJCQkJCQkrKyRyOwoJCQkJCQkkb2JqUEhQRXhjZWwtPmdldEFjdGl2ZVNoZWV0KCktPmdldFJvd0RpbWVuc2lvbigkciktPnNldFJvd0hlaWdodCgkcm93SGVpZ2h0KTsKCQkJCQkJaWYgKCRoaWRkZW4pIHsKCQkJCQkJCSRvYmpQSFBFeGNlbC0+Z2V0QWN0aXZlU2hlZXQoKS0+Z2V0Um93RGltZW5zaW9uKCRyKS0+c2V0VmlzaWJsZShmYWxzZSk7CgkJCQkJCX0KCQkJCQl9CgkJCQl9CgkJCQl3aGlsZSAoJHIgPCAkbWF4Um93KSB7CgkJCQkJKyskcjsKCQkJCQkkb2JqUEhQRXhjZWwtPmdldEFjdGl2ZVNoZWV0KCktPmdldFJvd0RpbWVuc2lvbigkciktPnNldFJvd0hlaWdodCgkZGVmYXVsdEhlaWdodCk7CgkJCQl9CgkJCX0KCgkJCS8vCUhhbmRsZSBNZXJnZWQgQ2VsbHMgaW4gdGhpcyB3b3Jrc2hlZXQKCQkJaWYgKGlzc2V0KCRzaGVldC0+TWVyZ2VkUmVnaW9ucykpIHsKCQkJCWZvcmVhY2goJHNoZWV0LT5NZXJnZWRSZWdpb25zLT5NZXJnZSBhcyAkbWVyZ2VDZWxscykgewoJCQkJCSRvYmpQSFBFeGNlbC0+Z2V0QWN0aXZlU2hlZXQoKS0+bWVyZ2VDZWxscygkbWVyZ2VDZWxscyk7CgkJCQl9CgkJCX0KCgkJCSR3b3Jrc2hlZXRJRCsrOwoJCX0KCgkJLy8JTG9vcCB0aHJvdWdoIGRlZmluZWROYW1lcyAoZ2xvYmFsIG5hbWVkIHJhbmdlcykKCQlpZiAoaXNzZXQoJGdubVhNTC0+TmFtZXMpKSB7CgkJCWZvcmVhY2goJGdubVhNTC0+TmFtZXMtPk5hbWUgYXMgJG5hbWVkUmFuZ2UpIHsKCQkJCSRuYW1lID0gKHN0cmluZykgJG5hbWVkUmFuZ2UtPm5hbWU7CgkJCQkkcmFuZ2UgPSAoc3RyaW5nKSAkbmFtZWRSYW5nZS0+dmFsdWU7CgkJCQlpZiAoc3RyaXBvcygkcmFuZ2UsICcjUkVGIScpICE9PSBmYWxzZSkgewoJCQkJCWNvbnRpbnVlOwoJCQkJfQoKCQkJCSRyYW5nZSA9IGV4cGxvZGUoJyEnLCRyYW5nZSk7CgkJCQkkcmFuZ2VbMF0gPSB0cmltKCRyYW5nZVswXSwiJyIpOzsKCQkJCWlmICgkd29ya3NoZWV0ID0gJG9ialBIUEV4Y2VsLT5nZXRTaGVldEJ5TmFtZSgkcmFuZ2VbMF0pKSB7CgkJCQkJJGV4dHJhY3RlZFJhbmdlID0gc3RyX3JlcGxhY2UoJyQnLCAnJywgJHJhbmdlWzFdKTsKCQkJCQkkb2JqUEhQRXhjZWwtPmFkZE5hbWVkUmFuZ2UoIG5ldyBQSFBFeGNlbF9OYW1lZFJhbmdlKCRuYW1lLCAkd29ya3NoZWV0LCAkZXh0cmFjdGVkUmFuZ2UpICk7CgkJCQl9CgkJCX0KCQl9CgoKCQkvLyBSZXR1cm4KCQlyZXR1cm4gJG9ialBIUEV4Y2VsOwoJfQoKCglwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBfcGFyc2VCb3JkZXJBdHRyaWJ1dGVzKCRib3JkZXJBdHRyaWJ1dGVzKSB7CgkJJHN0eWxlQXJyYXkgPSBhcnJheSgpOwoKCQlpZiAoaXNzZXQoJGJvcmRlckF0dHJpYnV0ZXNbIkNvbG9yIl0pKSB7CgkJCSRSR0IgPSBzZWxmOjpfcGFyc2VHbnVtZXJpY0NvbG91cigkYm9yZGVyQXR0cmlidXRlc1siQ29sb3IiXSk7CgkJCSRzdHlsZUFycmF5Wydjb2xvciddWydyZ2InXSA9ICRSR0I7CgkJfQoKCQlzd2l0Y2ggKCRib3JkZXJBdHRyaWJ1dGVzWyJTdHlsZSJdKSB7CgkJCWNhc2UgJzAnIDoKCQkJCSRzdHlsZUFycmF5WydzdHlsZSddID0gUEhQRXhjZWxfU3R5bGVfQm9yZGVyOjpCT1JERVJfTk9ORTsKCQkJCWJyZWFrOwoJCQljYXNlICcxJyA6CgkJCQkkc3R5bGVBcnJheVsnc3R5bGUnXSA9IFBIUEV4Y2VsX1N0eWxlX0JvcmRlcjo6Qk9SREVSX1RISU47CgkJCQlicmVhazsKCQkJY2FzZSAnMicgOgoJCQkJJHN0eWxlQXJyYXlbJ3N0eWxlJ10gPSBQSFBFeGNlbF9TdHlsZV9Cb3JkZXI6OkJPUkRFUl9NRURJVU07CgkJCQlicmVhazsKCQkJY2FzZSAnNCcgOgoJCQkJJHN0eWxlQXJyYXlbJ3N0eWxlJ10gPSBQSFBFeGNlbF9TdHlsZV9Cb3JkZXI6OkJPUkRFUl9EQVNIRUQ7CgkJCQlicmVhazsKCQkJY2FzZSAnNScgOgoJCQkJJHN0eWxlQXJyYXlbJ3N0eWxlJ10gPSBQSFBFeGNlbF9TdHlsZV9Cb3JkZXI6OkJPUkRFUl9USElDSzsKCQkJCWJyZWFrOwoJCQljYXNlICc2JyA6CgkJCQkkc3R5bGVBcnJheVsnc3R5bGUnXSA9IFBIUEV4Y2VsX1N0eWxlX0JvcmRlcjo6Qk9SREVSX0RPVUJMRTsKCQkJCWJyZWFrOwoJCQljYXNlICc3JyA6CgkJCQkkc3R5bGVBcnJheVsnc3R5bGUnXSA9IFBIUEV4Y2VsX1N0eWxlX0JvcmRlcjo6Qk9SREVSX0RPVFRFRDsKCQkJCWJyZWFrOwoJCQljYXNlICc5JyA6CgkJCQkkc3R5bGVBcnJheVsnc3R5bGUnXSA9IFBIUEV4Y2VsX1N0eWxlX0JvcmRlcjo6Qk9SREVSX0RBU0hET1Q7CgkJCQlicmVhazsKCQkJY2FzZSAnMTAnIDoKCQkJCSRzdHlsZUFycmF5WydzdHlsZSddID0gUEhQRXhjZWxfU3R5bGVfQm9yZGVyOjpCT1JERVJfTUVESVVNREFTSERPVDsKCQkJCWJyZWFrOwoJCQljYXNlICcxMScgOgoJCQkJJHN0eWxlQXJyYXlbJ3N0eWxlJ10gPSBQSFBFeGNlbF9TdHlsZV9Cb3JkZXI6OkJPUkRFUl9EQVNIRE9URE9UOwoJCQkJYnJlYWs7CgkJCWNhc2UgJzEyJyA6CgkJCQkkc3R5bGVBcnJheVsnc3R5bGUnXSA9IFBIUEV4Y2VsX1N0eWxlX0JvcmRlcjo6Qk9SREVSX01FRElVTURBU0hET1RET1Q7CgkJCQlicmVhazsKCQkJY2FzZSAnMTMnIDoKCQkJCSRzdHlsZUFycmF5WydzdHlsZSddID0gUEhQRXhjZWxfU3R5bGVfQm9yZGVyOjpCT1JERVJfTUVESVVNREFTSERPVERPVDsKCQkJCWJyZWFrOwoJCQljYXNlICczJyA6CgkJCQkkc3R5bGVBcnJheVsnc3R5bGUnXSA9IFBIUEV4Y2VsX1N0eWxlX0JvcmRlcjo6Qk9SREVSX1NMQU5UREFTSERPVDsKCQkJCWJyZWFrOwoJCQljYXNlICc4JyA6CgkJCQkkc3R5bGVBcnJheVsnc3R5bGUnXSA9IFBIUEV4Y2VsX1N0eWxlX0JvcmRlcjo6Qk9SREVSX01FRElVTURBU0hFRDsKCQkJCWJyZWFrOwoJCX0KCQlyZXR1cm4gJHN0eWxlQXJyYXk7Cgl9CgoKCXByaXZhdGUgZnVuY3Rpb24gX3BhcnNlUmljaFRleHQoJGlzID0gJycpIHsKCQkkdmFsdWUgPSBuZXcgUEhQRXhjZWxfUmljaFRleHQoKTsKCgkJJHZhbHVlLT5jcmVhdGVUZXh0KCRpcyk7CgoJCXJldHVybiAkdmFsdWU7Cgl9CgoKCXByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIF9wYXJzZUdudW1lcmljQ29sb3VyKCRnbm1Db2xvdXIpIHsKCQlsaXN0KCRnbm1SLCRnbm1HLCRnbm1CKSA9IGV4cGxvZGUoJzonLCRnbm1Db2xvdXIpOwoJCSRnbm1SID0gc3Vic3RyKHN0cl9wYWQoJGdubVIsNCwnMCcsU1RSX1BBRF9SSUdIVCksMCwyKTsKCQkkZ25tRyA9IHN1YnN0cihzdHJfcGFkKCRnbm1HLDQsJzAnLFNUUl9QQURfUklHSFQpLDAsMik7CgkJJGdubUIgPSBzdWJzdHIoc3RyX3BhZCgkZ25tQiw0LCcwJyxTVFJfUEFEX1JJR0hUKSwwLDIpOwoJCSRSR0IgPSAkZ25tUi4kZ25tRy4kZ25tQjsKLy8JCWVjaG8gJ0V4Y2VsIENvbG91cjogJywkUkdCLCc8YnIgLz4nOwoJCXJldHVybiAkUkdCOwoJfQoKfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Reader/IReader.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIFBIUEV4Y2VsCiAqCiAqIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICoKICogQGNhdGVnb3J5ICAgUEhQRXhjZWwKICogQHBhY2thZ2UgICAgUEhQRXhjZWxfUmVhZGVyCiAqIEBjb3B5cmlnaHQgIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwgKGh0dHA6Ly93d3cuY29kZXBsZXguY29tL1BIUEV4Y2VsKQogKiBAbGljZW5zZSAgICBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvb2xkLWxpY2Vuc2VzL2xncGwtMi4xLnR4dAlMR1BMCiAqIEB2ZXJzaW9uICAgIDEuNy43LCAyMDEyLTA1LTE5CiAqLwoKCi8qKgogKiBQSFBFeGNlbF9SZWFkZXJfSVJlYWRlcgogKgogKiBAY2F0ZWdvcnkgICBQSFBFeGNlbAogKiBAcGFja2FnZSAgICBQSFBFeGNlbF9SZWFkZXIKICogQGNvcHlyaWdodCAgQ29weXJpZ2h0IChjKSAyMDA2IC0gMjAxMiBQSFBFeGNlbCAoaHR0cDovL3d3dy5jb2RlcGxleC5jb20vUEhQRXhjZWwpCiAqLwppbnRlcmZhY2UgUEhQRXhjZWxfUmVhZGVyX0lSZWFkZXIKewoJLyoqCgkgKiBDYW4gdGhlIGN1cnJlbnQgUEhQRXhjZWxfUmVhZGVyX0lSZWFkZXIgcmVhZCB0aGUgZmlsZT8KCSAqCgkgKiBAcGFyYW0gCXN0cmluZyAJCSRwRmlsZU5hbWUKCSAqIEByZXR1cm4gCWJvb2xlYW4KCSAqLwoJcHVibGljIGZ1bmN0aW9uIGNhblJlYWQoJHBGaWxlbmFtZSk7CgoJLyoqCgkgKiBMb2FkcyBQSFBFeGNlbCBmcm9tIGZpbGUKCSAqCgkgKiBAcGFyYW0gCXN0cmluZyAJCSRwRmlsZU5hbWUKCSAqIEB0aHJvd3MgCUV4Y2VwdGlvbgoJICovCglwdWJsaWMgZnVuY3Rpb24gbG9hZCgkcEZpbGVuYW1lKTsKfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Reader/IReadFilter.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIFBIUEV4Y2VsCiAqCiAqIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICoKICogQGNhdGVnb3J5ICAgUEhQRXhjZWwKICogQHBhY2thZ2UgICAgUEhQRXhjZWxfUmVhZGVyCiAqIEBjb3B5cmlnaHQgIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwgKGh0dHA6Ly93d3cuY29kZXBsZXguY29tL1BIUEV4Y2VsKQogKiBAbGljZW5zZSAgICBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvb2xkLWxpY2Vuc2VzL2xncGwtMi4xLnR4dAlMR1BMCiAqIEB2ZXJzaW9uICAgIDEuNy43LCAyMDEyLTA1LTE5CiAqLwoKCi8qKgogKiBQSFBFeGNlbF9SZWFkZXJfSVJlYWRGaWx0ZXIKICoKICogQGNhdGVnb3J5ICAgUEhQRXhjZWwKICogQHBhY2thZ2UgICAgUEhQRXhjZWxfUmVhZGVyCiAqIEBjb3B5cmlnaHQgIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwgKGh0dHA6Ly93d3cuY29kZXBsZXguY29tL1BIUEV4Y2VsKQogKi8KaW50ZXJmYWNlIFBIUEV4Y2VsX1JlYWRlcl9JUmVhZEZpbHRlcgp7CgkvKioKCSAqIFNob3VsZCB0aGlzIGNlbGwgYmUgcmVhZD8KCSAqCgkgKiBAcGFyYW0gCSRjb2x1bW4JCVN0cmluZyBjb2x1bW4gaW5kZXgKCSAqIEBwYXJhbSAJJHJvdwkJCVJvdyBpbmRleAoJICogQHBhcmFtCSR3b3Jrc2hlZXROYW1lCU9wdGlvbmFsIHdvcmtzaGVldCBuYW1lCgkgKiBAcmV0dXJuCWJvb2xlYW4KCSAqLwoJcHVibGljIGZ1bmN0aW9uIHJlYWRDZWxsKCRjb2x1bW4sICRyb3csICR3b3Jrc2hlZXROYW1lID0gJycpOwp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Reader/OOCalc.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIFBIUEV4Y2VsCiAqCiAqIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICoKICogQGNhdGVnb3J5ICAgUEhQRXhjZWwKICogQHBhY2thZ2UgICAgUEhQRXhjZWxfUmVhZGVyCiAqIEBjb3B5cmlnaHQgIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwgKGh0dHA6Ly93d3cuY29kZXBsZXguY29tL1BIUEV4Y2VsKQogKiBAbGljZW5zZSAgICBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvb2xkLWxpY2Vuc2VzL2xncGwtMi4xLnR4dAlMR1BMCiAqIEB2ZXJzaW9uICAgIDEuNy43LCAyMDEyLTA1LTE5CiAqLwoKCi8qKiBQSFBFeGNlbCByb290IGRpcmVjdG9yeSAqLwppZiAoIWRlZmluZWQoJ1BIUEVYQ0VMX1JPT1QnKSkgewoJLyoqCgkgKiBAaWdub3JlCgkgKi8KCWRlZmluZSgnUEhQRVhDRUxfUk9PVCcsIGRpcm5hbWUoX19GSUxFX18pIC4gJy8uLi8uLi8nKTsKCXJlcXVpcmUoUEhQRVhDRUxfUk9PVCAuICdQSFBFeGNlbC9BdXRvbG9hZGVyLnBocCcpOwp9CgovKioKICogUEhQRXhjZWxfUmVhZGVyX09PQ2FsYwogKgogKiBAY2F0ZWdvcnkJUEhQRXhjZWwKICogQHBhY2thZ2UJCVBIUEV4Y2VsX1JlYWRlcgogKiBAY29weXJpZ2h0CUNvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwgKGh0dHA6Ly93d3cuY29kZXBsZXguY29tL1BIUEV4Y2VsKQogKi8KY2xhc3MgUEhQRXhjZWxfUmVhZGVyX09PQ2FsYyBpbXBsZW1lbnRzIFBIUEV4Y2VsX1JlYWRlcl9JUmVhZGVyCnsKCS8qKgoJICogUmVhZCBkYXRhIG9ubHk/CgkgKiBJZGVudGlmaWVzIHdoZXRoZXIgdGhlIFJlYWRlciBzaG91bGQgb25seSByZWFkIGRhdGEgdmFsdWVzIGZvciBjZWxscywgYW5kIGlnbm9yZSBhbnkgZm9ybWF0dGluZyBpbmZvcm1hdGlvbjsKCSAqCQlvciB3aGV0aGVyIGl0IHNob3VsZCByZWFkIGJvdGggZGF0YSBhbmQgZm9ybWF0dGluZwoJICoKCSAqIEB2YXIJYm9vbGVhbgoJICovCglwcml2YXRlICRfcmVhZERhdGFPbmx5ID0gZmFsc2U7CgoJLyoqCgkgKiBSZXN0cmljdCB3aGljaCBzaGVldHMgc2hvdWxkIGJlIGxvYWRlZD8KCSAqIFRoaXMgcHJvcGVydHkgaG9sZHMgYW4gYXJyYXkgb2Ygd29ya3NoZWV0IG5hbWVzIHRvIGJlIGxvYWRlZC4gSWYgbnVsbCwgdGhlbiBhbGwgd29ya3NoZWV0cyB3aWxsIGJlIGxvYWRlZC4KCSAqCgkgKiBAdmFyCWFycmF5IG9mIHN0cmluZwoJICovCglwcml2YXRlICRfbG9hZFNoZWV0c09ubHkgPSBudWxsOwoKCS8qKgoJICogRm9ybWF0cwoJICoKCSAqIEB2YXIgYXJyYXkKCSAqLwoJcHJpdmF0ZSAkX3N0eWxlcyA9IGFycmF5KCk7CgoJLyoqCgkgKiBQSFBFeGNlbF9SZWFkZXJfSVJlYWRGaWx0ZXIgaW5zdGFuY2UKCSAqCgkgKiBAdmFyIFBIUEV4Y2VsX1JlYWRlcl9JUmVhZEZpbHRlcgoJICovCglwcml2YXRlICRfcmVhZEZpbHRlciA9IG51bGw7CgoKCS8qKgoJICogQ3JlYXRlIGEgbmV3IFBIUEV4Y2VsX1JlYWRlcl9PT0NhbGMKCSAqLwoJcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCkgewoJCSR0aGlzLT5fcmVhZEZpbHRlciAJPSBuZXcgUEhQRXhjZWxfUmVhZGVyX0RlZmF1bHRSZWFkRmlsdGVyKCk7Cgl9CgoKCS8qKgoJICogUmVhZCBkYXRhIG9ubHk/CgkgKgkJSWYgdGhpcyBpcyB0cnVlLCB0aGVuIHRoZSBSZWFkZXIgd2lsbCBvbmx5IHJlYWQgZGF0YSB2YWx1ZXMgZm9yIGNlbGxzLCBpdCB3aWxsIG5vdCByZWFkIGFueSBmb3JtYXR0aW5nIGluZm9ybWF0aW9uLgoJICoJCUlmIGZhbHNlICh0aGUgZGVmYXVsdCkgaXQgd2lsbCByZWFkIGRhdGEgYW5kIGZvcm1hdHRpbmcuCgkgKgoJICogQHJldHVybglib29sZWFuCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRSZWFkRGF0YU9ubHkoKSB7CgkJcmV0dXJuICR0aGlzLT5fcmVhZERhdGFPbmx5OwoJfQoKCgkvKioKCSAqIFNldCByZWFkIGRhdGEgb25seQoJICoJCVNldCB0byB0cnVlLCB0byBhZHZpc2UgdGhlIFJlYWRlciBvbmx5IHRvIHJlYWQgZGF0YSB2YWx1ZXMgZm9yIGNlbGxzLCBhbmQgdG8gaWdub3JlIGFueSBmb3JtYXR0aW5nIGluZm9ybWF0aW9uLgoJICoJCVNldCB0byBmYWxzZSAodGhlIGRlZmF1bHQpIHRvIGFkdmlzZSB0aGUgUmVhZGVyIHRvIHJlYWQgYm90aCBkYXRhIGFuZCBmb3JtYXR0aW5nIGZvciBjZWxscy4KCSAqCgkgKiBAcGFyYW0JYm9vbGVhbgkkcFZhbHVlCgkgKiBAcmV0dXJuCVBIUEV4Y2VsX1JlYWRlcl9PT0NhbGMKCSAqLwoJcHVibGljIGZ1bmN0aW9uIHNldFJlYWREYXRhT25seSgkcFZhbHVlID0gZmFsc2UpIHsKCQkkdGhpcy0+X3JlYWREYXRhT25seSA9ICRwVmFsdWU7CgkJcmV0dXJuICR0aGlzOwoJfQoKCgkvKioKCSAqIEdldCB3aGljaCBzaGVldHMgdG8gbG9hZAoJICoJCVJldHVybnMgZWl0aGVyIGFuIGFycmF5IG9mIHdvcmtzaGVldCBuYW1lcyAodGhlIGxpc3Qgb2Ygd29ya3NoZWV0cyB0aGF0IHNob3VsZCBiZSBsb2FkZWQpLCBvciBhIG51bGwKCSAqCQkJaW5kaWNhdGluZyB0aGF0IGFsbCB3b3Jrc2hlZXRzIGluIHRoZSB3b3JrYm9vayBzaG91bGQgYmUgbG9hZGVkLgoJICoKCSAqIEByZXR1cm4gbWl4ZWQKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldExvYWRTaGVldHNPbmx5KCkKCXsKCQlyZXR1cm4gJHRoaXMtPl9sb2FkU2hlZXRzT25seTsKCX0KCgoJLyoqCgkgKiBTZXQgd2hpY2ggc2hlZXRzIHRvIGxvYWQKCSAqCgkgKiBAcGFyYW0gbWl4ZWQgJHZhbHVlCgkgKgkJVGhpcyBzaG91bGQgYmUgZWl0aGVyIGFuIGFycmF5IG9mIHdvcmtzaGVldCBuYW1lcyB0byBiZSBsb2FkZWQsIG9yIGEgc3RyaW5nIGNvbnRhaW5pbmcgYSBzaW5nbGUgd29ya3NoZWV0IG5hbWUuCgkgKgkJSWYgTlVMTCwgdGhlbiBpdCB0ZWxscyB0aGUgUmVhZGVyIHRvIHJlYWQgYWxsIHdvcmtzaGVldHMgaW4gdGhlIHdvcmtib29rCgkgKgoJICogQHJldHVybiBQSFBFeGNlbF9SZWFkZXJfT09DYWxjCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBzZXRMb2FkU2hlZXRzT25seSgkdmFsdWUgPSBudWxsKQoJewoJCSR0aGlzLT5fbG9hZFNoZWV0c09ubHkgPSBpc19hcnJheSgkdmFsdWUpID8KCQkJJHZhbHVlIDogYXJyYXkoJHZhbHVlKTsKCQlyZXR1cm4gJHRoaXM7Cgl9CgoKCS8qKgoJICogU2V0IGFsbCBzaGVldHMgdG8gbG9hZAoJICoJCVRlbGxzIHRoZSBSZWFkZXIgdG8gbG9hZCBhbGwgd29ya3NoZWV0cyBmcm9tIHRoZSB3b3JrYm9vay4KCSAqCgkgKiBAcmV0dXJuIFBIUEV4Y2VsX1JlYWRlcl9PT0NhbGMKCSAqLwoJcHVibGljIGZ1bmN0aW9uIHNldExvYWRBbGxTaGVldHMoKQoJewoJCSR0aGlzLT5fbG9hZFNoZWV0c09ubHkgPSBudWxsOwoJCXJldHVybiAkdGhpczsKCX0KCgoJLyoqCgkgKiBSZWFkIGZpbHRlcgoJICoKCSAqIEByZXR1cm4gUEhQRXhjZWxfUmVhZGVyX0lSZWFkRmlsdGVyCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRSZWFkRmlsdGVyKCkgewoJCXJldHVybiAkdGhpcy0+X3JlYWRGaWx0ZXI7Cgl9CgoKCS8qKgoJICogU2V0IHJlYWQgZmlsdGVyCgkgKgoJICogQHBhcmFtIFBIUEV4Y2VsX1JlYWRlcl9JUmVhZEZpbHRlciAkcFZhbHVlCgkgKiBAcmV0dXJuIFBIUEV4Y2VsX1JlYWRlcl9PT0NhbGMKCSAqLwoJcHVibGljIGZ1bmN0aW9uIHNldFJlYWRGaWx0ZXIoUEhQRXhjZWxfUmVhZGVyX0lSZWFkRmlsdGVyICRwVmFsdWUpIHsKCQkkdGhpcy0+X3JlYWRGaWx0ZXIgPSAkcFZhbHVlOwoJCXJldHVybiAkdGhpczsKCX0KCgoJLyoqCgkgKiBDYW4gdGhlIGN1cnJlbnQgUEhQRXhjZWxfUmVhZGVyX0lSZWFkZXIgcmVhZCB0aGUgZmlsZT8KCSAqCgkgKiBAcGFyYW0gCXN0cmluZyAJCSRwRmlsZU5hbWUKCSAqIEByZXR1cm4gCWJvb2xlYW4KCSAqIEB0aHJvd3MgRXhjZXB0aW9uCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBjYW5SZWFkKCRwRmlsZW5hbWUpCgl7CgkJLy8gQ2hlY2sgaWYgZmlsZSBleGlzdHMKCQlpZiAoIWZpbGVfZXhpc3RzKCRwRmlsZW5hbWUpKSB7CgkJCXRocm93IG5ldyBFeGNlcHRpb24oIkNvdWxkIG5vdCBvcGVuICIgLiAkcEZpbGVuYW1lIC4gIiBmb3IgcmVhZGluZyEgRmlsZSBkb2VzIG5vdCBleGlzdC4iKTsKCQl9CgoJCS8vIENoZWNrIGlmIHppcCBjbGFzcyBleGlzdHMKCQlpZiAoIWNsYXNzX2V4aXN0cygnWmlwQXJjaGl2ZScpKSB7CgkJCXRocm93IG5ldyBFeGNlcHRpb24oIlppcEFyY2hpdmUgbGlicmFyeSBpcyBub3QgZW5hYmxlZCIpOwoJCX0KCgkJLy8gTG9hZCBmaWxlCgkJJHppcCA9IG5ldyBaaXBBcmNoaXZlOwoJCWlmICgkemlwLT5vcGVuKCRwRmlsZW5hbWUpID09PSB0cnVlKSB7CgkJCS8vIGNoZWNrIGlmIGl0IGlzIGFuIE9PWE1MIGFyY2hpdmUKCQkJJG1pbWVUeXBlID0gJHppcC0+Z2V0RnJvbU5hbWUoIm1pbWV0eXBlIik7CgoJCQkkemlwLT5jbG9zZSgpOwoKCQkJcmV0dXJuICgkbWltZVR5cGUgPT09ICdhcHBsaWNhdGlvbi92bmQub2FzaXMub3BlbmRvY3VtZW50LnNwcmVhZHNoZWV0Jyk7CgkJfQoKCQlyZXR1cm4gZmFsc2U7Cgl9CgoKCS8qKgoJICogUmVhZHMgbmFtZXMgb2YgdGhlIHdvcmtzaGVldHMgZnJvbSBhIGZpbGUsIHdpdGhvdXQgcGFyc2luZyB0aGUgd2hvbGUgZmlsZSB0byBhIFBIUEV4Y2VsIG9iamVjdAoJICoKCSAqIEBwYXJhbSAJc3RyaW5nIAkJJHBGaWxlbmFtZQoJICogQHRocm93cyAJRXhjZXB0aW9uCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBsaXN0V29ya3NoZWV0TmFtZXMoJHBGaWxlbmFtZSkKCXsKCQkvLyBDaGVjayBpZiBmaWxlIGV4aXN0cwoJCWlmICghZmlsZV9leGlzdHMoJHBGaWxlbmFtZSkpIHsKCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbigiQ291bGQgbm90IG9wZW4gIiAuICRwRmlsZW5hbWUgLiAiIGZvciByZWFkaW5nISBGaWxlIGRvZXMgbm90IGV4aXN0LiIpOwoJCX0KCgkJJHdvcmtzaGVldE5hbWVzID0gYXJyYXkoKTsKCgkJJHppcCA9IG5ldyBaaXBBcmNoaXZlOwoJCWlmICgkemlwLT5vcGVuKCRwRmlsZW5hbWUpID09PSB0cnVlKSB7CgoJCQkkeG1sID0gc2ltcGxleG1sX2xvYWRfc3RyaW5nKCR6aXAtPmdldEZyb21OYW1lKCJjb250ZW50LnhtbCIpKTsKCQkJJG5hbWVzcGFjZXNDb250ZW50ID0gJHhtbC0+Z2V0TmFtZXNwYWNlcyh0cnVlKTsKCgkJCSR3b3JrYm9vayA9ICR4bWwtPmNoaWxkcmVuKCRuYW1lc3BhY2VzQ29udGVudFsnb2ZmaWNlJ10pOwoJCQlmb3JlYWNoKCR3b3JrYm9vay0+Ym9keS0+c3ByZWFkc2hlZXQgYXMgJHdvcmtib29rRGF0YSkgewoJCQkJJHdvcmtib29rRGF0YSA9ICR3b3JrYm9va0RhdGEtPmNoaWxkcmVuKCRuYW1lc3BhY2VzQ29udGVudFsndGFibGUnXSk7CgkJCQlmb3JlYWNoKCR3b3JrYm9va0RhdGEtPnRhYmxlIGFzICR3b3Jrc2hlZXREYXRhU2V0KSB7CgkJCQkJJHdvcmtzaGVldERhdGFBdHRyaWJ1dGVzID0gJHdvcmtzaGVldERhdGFTZXQtPmF0dHJpYnV0ZXMoJG5hbWVzcGFjZXNDb250ZW50Wyd0YWJsZSddKTsKCgkJCQkJJHdvcmtzaGVldE5hbWVzW10gPSAkd29ya3NoZWV0RGF0YUF0dHJpYnV0ZXNbJ25hbWUnXTsKCQkJCX0KCQkJfQoJCX0KCgkJcmV0dXJuICR3b3Jrc2hlZXROYW1lczsKCX0KCgoJLyoqCgkgKiBMb2FkcyBQSFBFeGNlbCBmcm9tIGZpbGUKCSAqCgkgKiBAcGFyYW0gCXN0cmluZyAJCSRwRmlsZW5hbWUKCSAqIEByZXR1cm4gCVBIUEV4Y2VsCgkgKiBAdGhyb3dzIAlFeGNlcHRpb24KCSAqLwoJcHVibGljIGZ1bmN0aW9uIGxvYWQoJHBGaWxlbmFtZSkKCXsKCQkvLyBDcmVhdGUgbmV3IFBIUEV4Y2VsCgkJJG9ialBIUEV4Y2VsID0gbmV3IFBIUEV4Y2VsKCk7CgoJCS8vIExvYWQgaW50byB0aGlzIGluc3RhbmNlCgkJcmV0dXJuICR0aGlzLT5sb2FkSW50b0V4aXN0aW5nKCRwRmlsZW5hbWUsICRvYmpQSFBFeGNlbCk7Cgl9CgoKCXByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGlkZW50aWZ5Rml4ZWRTdHlsZVZhbHVlKCRzdHlsZUxpc3QsJiRzdHlsZUF0dHJpYnV0ZVZhbHVlKSB7CgkJJHN0eWxlQXR0cmlidXRlVmFsdWUgPSBzdHJ0b2xvd2VyKCRzdHlsZUF0dHJpYnV0ZVZhbHVlKTsKCQlmb3JlYWNoKCRzdHlsZUxpc3QgYXMgJHN0eWxlKSB7CgkJCWlmICgkc3R5bGVBdHRyaWJ1dGVWYWx1ZSA9PSBzdHJ0b2xvd2VyKCRzdHlsZSkpIHsKCQkJCSRzdHlsZUF0dHJpYnV0ZVZhbHVlID0gJHN0eWxlOwoJCQkJcmV0dXJuIHRydWU7CgkJCX0KCQl9CgkJcmV0dXJuIGZhbHNlOwoJfQoKCgkvKioKCSAqIFJldHVybiB3b3Jrc2hlZXQgaW5mbyAoTmFtZSwgTGFzdCBDb2x1bW4gTGV0dGVyLCBMYXN0IENvbHVtbiBJbmRleCwgVG90YWwgUm93cywgVG90YWwgQ29sdW1ucykKCSAqCgkgKiBAcGFyYW0gICBzdHJpbmcgICAgICRwRmlsZW5hbWUKCSAqIEB0aHJvd3MgICBFeGNlcHRpb24KCSAqLwoJcHVibGljIGZ1bmN0aW9uIGxpc3RXb3Jrc2hlZXRJbmZvKCRwRmlsZW5hbWUpCgl7CgkJLy8gQ2hlY2sgaWYgZmlsZSBleGlzdHMKCQlpZiAoIWZpbGVfZXhpc3RzKCRwRmlsZW5hbWUpKSB7CgkJCXRocm93IG5ldyBFeGNlcHRpb24oIkNvdWxkIG5vdCBvcGVuICIgLiAkcEZpbGVuYW1lIC4gIiBmb3IgcmVhZGluZyEgRmlsZSBkb2VzIG5vdCBleGlzdC4iKTsKCQl9CgoJCSR3b3Jrc2hlZXRJbmZvID0gYXJyYXkoKTsKCgkJJHppcCA9IG5ldyBaaXBBcmNoaXZlOwoJCWlmICgkemlwLT5vcGVuKCRwRmlsZW5hbWUpID09PSB0cnVlKSB7CgoJCQkkeG1sID0gc2ltcGxleG1sX2xvYWRfc3RyaW5nKCR6aXAtPmdldEZyb21OYW1lKCJjb250ZW50LnhtbCIpKTsKCQkJJG5hbWVzcGFjZXNDb250ZW50ID0gJHhtbC0+Z2V0TmFtZXNwYWNlcyh0cnVlKTsKCgkJCSR3b3JrYm9vayA9ICR4bWwtPmNoaWxkcmVuKCRuYW1lc3BhY2VzQ29udGVudFsnb2ZmaWNlJ10pOwoJCQlmb3JlYWNoKCR3b3JrYm9vay0+Ym9keS0+c3ByZWFkc2hlZXQgYXMgJHdvcmtib29rRGF0YSkgewoJCQkJJHdvcmtib29rRGF0YSA9ICR3b3JrYm9va0RhdGEtPmNoaWxkcmVuKCRuYW1lc3BhY2VzQ29udGVudFsndGFibGUnXSk7CgkJCQlmb3JlYWNoKCR3b3JrYm9va0RhdGEtPnRhYmxlIGFzICR3b3Jrc2hlZXREYXRhU2V0KSB7CgkJCQkJJHdvcmtzaGVldERhdGEgPSAkd29ya3NoZWV0RGF0YVNldC0+Y2hpbGRyZW4oJG5hbWVzcGFjZXNDb250ZW50Wyd0YWJsZSddKTsKCQkJCQkkd29ya3NoZWV0RGF0YUF0dHJpYnV0ZXMgPSAkd29ya3NoZWV0RGF0YVNldC0+YXR0cmlidXRlcygkbmFtZXNwYWNlc0NvbnRlbnRbJ3RhYmxlJ10pOwoKCQkJCQkkdG1wSW5mbyA9IGFycmF5KCk7CgkJCQkJJHRtcEluZm9bJ3dvcmtzaGVldE5hbWUnXSA9ICR3b3Jrc2hlZXREYXRhQXR0cmlidXRlc1snbmFtZSddOwoJCQkJCSR0bXBJbmZvWydsYXN0Q29sdW1uTGV0dGVyJ10gPSAnQSc7CgkJCQkJJHRtcEluZm9bJ2xhc3RDb2x1bW5JbmRleCddID0gMDsKCQkJCQkkdG1wSW5mb1sndG90YWxSb3dzJ10gPSAwOwoJCQkJCSR0bXBJbmZvWyd0b3RhbENvbHVtbnMnXSA9IDA7CgoJCQkJCSRyb3dJbmRleCA9IDA7CgkJCQkJZm9yZWFjaCAoJHdvcmtzaGVldERhdGEgYXMgJGtleSA9PiAkcm93RGF0YSkgewoJCQkJCQkkcm93SGFzRGF0YSA9IGZhbHNlOwoKCQkJCQkJc3dpdGNoICgka2V5KSB7CgkJCQkJCQljYXNlICd0YWJsZS1yb3cnIDoKCQkJCQkJCQkkY29sdW1uSW5kZXggPSAwOwoKCQkJCQkJCQlmb3JlYWNoICgkcm93RGF0YSBhcyAka2V5ID0+ICRjZWxsRGF0YSkgewoJCQkJCQkJCQkkY2VsbEhhc0RhdGEgPSBmYWxzZTsKCgkJCQkJCQkJCSRjZWxsRGF0YVRleHQgPSAkY2VsbERhdGEtPmNoaWxkcmVuKCRuYW1lc3BhY2VzQ29udGVudFsndGV4dCddKTsKCQkJCQkJCQkJJGNlbGxEYXRhT2ZmaWNlQXR0cmlidXRlcyA9ICRjZWxsRGF0YS0+YXR0cmlidXRlcygkbmFtZXNwYWNlc0NvbnRlbnRbJ29mZmljZSddKTsKCQkJCQkJCQkJaWYgKGlzc2V0KCRjZWxsRGF0YVRleHQtPnApKSB7CgkJCQkJCQkJCQlzd2l0Y2ggKCRjZWxsRGF0YU9mZmljZUF0dHJpYnV0ZXNbJ3ZhbHVlLXR5cGUnXSkgewoJCQkJCQkJCQkJCWNhc2UgJ3N0cmluZycgOgoJCQkJCQkJCQkJCWNhc2UgJ2Jvb2xlYW4nIDoKCQkJCQkJCQkJCQljYXNlICdmbG9hdCcgOgoJCQkJCQkJCQkJCWNhc2UgJ2RhdGUnIDoKCQkJCQkJCQkJCQljYXNlICd0aW1lJyA6CgkJCQkJCQkJCQkJCSRjZWxsSGFzRGF0YSA9IHRydWU7CgkJCQkJCQkJCQkJCWJyZWFrOwoJCQkJCQkJCQkJfQoJCQkJCQkJCQl9CgoJCQkJCQkJCQkkY2VsbERhdGFUZXh0ID0gbnVsbDsKCQkJCQkJCQkJJGNlbGxEYXRhT2ZmaWNlQXR0cmlidXRlcyA9IG51bGw7CgoJCQkJCQkJCQlpZiAoJGNlbGxIYXNEYXRhKSB7CgkJCQkJCQkJCQkkdG1wSW5mb1snbGFzdENvbHVtbkluZGV4J10gPSBtYXgoJHRtcEluZm9bJ2xhc3RDb2x1bW5JbmRleCddLCAkY29sdW1uSW5kZXgpOwoJCQkJCQkJCQkJJHJvd0hhc0RhdGEgPSB0cnVlOwoJCQkJCQkJCQl9CgkJCQkJCQkJCSsrJGNvbHVtbkluZGV4OwoJCQkJCQkJCX0KCQkJCQkJCQkrKyRyb3dJbmRleDsKCgkJCQkJCQkJaWYgKCRyb3dIYXNEYXRhKSB7CgkJCQkJCQkJCSR0bXBJbmZvWyd0b3RhbFJvd3MnXSA9IG1heCgkdG1wSW5mb1sndG90YWxSb3dzJ10sICRyb3dJbmRleCk7CgkJCQkJCQkJfQoJCQkJCQkJCWJyZWFrOwoJCQkJCQl9CgkJCQkJfQoKCQkJCQkkdG1wSW5mb1snbGFzdENvbHVtbkxldHRlciddID0gUEhQRXhjZWxfQ2VsbDo6c3RyaW5nRnJvbUNvbHVtbkluZGV4KCR0bXBJbmZvWydsYXN0Q29sdW1uSW5kZXgnXSk7CgkJCQkJJHRtcEluZm9bJ3RvdGFsQ29sdW1ucyddID0gJHRtcEluZm9bJ2xhc3RDb2x1bW5JbmRleCddICsgMTsKCgkJCQkJJHdvcmtzaGVldEluZm9bXSA9ICR0bXBJbmZvOwoJCQkJfQoJCQl9CgkJfQoKCQlyZXR1cm4gJHdvcmtzaGVldEluZm87Cgl9CgoKCS8qKgoJICogTG9hZHMgUEhQRXhjZWwgZnJvbSBmaWxlIGludG8gUEhQRXhjZWwgaW5zdGFuY2UKCSAqCgkgKiBAcGFyYW0gCXN0cmluZyAJCSRwRmlsZW5hbWUKCSAqIEBwYXJhbQlQSFBFeGNlbAkkb2JqUEhQRXhjZWwKCSAqIEByZXR1cm4gCVBIUEV4Y2VsCgkgKiBAdGhyb3dzIAlFeGNlcHRpb24KCSAqLwoJcHVibGljIGZ1bmN0aW9uIGxvYWRJbnRvRXhpc3RpbmcoJHBGaWxlbmFtZSwgUEhQRXhjZWwgJG9ialBIUEV4Y2VsKQoJewoJCS8vIENoZWNrIGlmIGZpbGUgZXhpc3RzCgkJaWYgKCFmaWxlX2V4aXN0cygkcEZpbGVuYW1lKSkgewoJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCJDb3VsZCBub3Qgb3BlbiAiIC4gJHBGaWxlbmFtZSAuICIgZm9yIHJlYWRpbmchIEZpbGUgZG9lcyBub3QgZXhpc3QuIik7CgkJfQoKCQkkdGltZXpvbmVPYmogPSBuZXcgRGF0ZVRpbWVab25lKCdFdXJvcGUvTG9uZG9uJyk7CgkJJEdNVCA9IG5ldyBEYXRlVGltZVpvbmUoJ1VUQycpOwoKCQkkemlwID0gbmV3IFppcEFyY2hpdmU7CgkJaWYgKCR6aXAtPm9wZW4oJHBGaWxlbmFtZSkgPT09IHRydWUpIHsKLy8JCQllY2hvICc8aDE+TWV0YSBJbmZvcm1hdGlvbjwvaDE+JzsKCQkJJHhtbCA9IHNpbXBsZXhtbF9sb2FkX3N0cmluZygkemlwLT5nZXRGcm9tTmFtZSgibWV0YS54bWwiKSk7CgkJCSRuYW1lc3BhY2VzTWV0YSA9ICR4bWwtPmdldE5hbWVzcGFjZXModHJ1ZSk7Ci8vCQkJZWNobyAnPHByZT4nOwovLwkJCXByaW50X3IoJG5hbWVzcGFjZXNNZXRhKTsKLy8JCQllY2hvICc8L3ByZT48aHIgLz4nOwoKCQkJJGRvY1Byb3BzID0gJG9ialBIUEV4Y2VsLT5nZXRQcm9wZXJ0aWVzKCk7CgkJCSRvZmZpY2VQcm9wZXJ0eSA9ICR4bWwtPmNoaWxkcmVuKCRuYW1lc3BhY2VzTWV0YVsnb2ZmaWNlJ10pOwoJCQlmb3JlYWNoKCRvZmZpY2VQcm9wZXJ0eSBhcyAkb2ZmaWNlUHJvcGVydHlEYXRhKSB7CgkJCQkkb2ZmaWNlUHJvcGVydHlEQyA9IGFycmF5KCk7CgkJCQlpZiAoaXNzZXQoJG5hbWVzcGFjZXNNZXRhWydkYyddKSkgewoJCQkJCSRvZmZpY2VQcm9wZXJ0eURDID0gJG9mZmljZVByb3BlcnR5RGF0YS0+Y2hpbGRyZW4oJG5hbWVzcGFjZXNNZXRhWydkYyddKTsKCQkJCX0KCQkJCWZvcmVhY2goJG9mZmljZVByb3BlcnR5REMgYXMgJHByb3BlcnR5TmFtZSA9PiAkcHJvcGVydHlWYWx1ZSkgewoJCQkJCXN3aXRjaCAoJHByb3BlcnR5TmFtZSkgewoJCQkJCQljYXNlICd0aXRsZScgOgoJCQkJCQkJCSRkb2NQcm9wcy0+c2V0VGl0bGUoJHByb3BlcnR5VmFsdWUpOwoJCQkJCQkJCWJyZWFrOwoJCQkJCQljYXNlICdzdWJqZWN0JyA6CgkJCQkJCQkJJGRvY1Byb3BzLT5zZXRTdWJqZWN0KCRwcm9wZXJ0eVZhbHVlKTsKCQkJCQkJCQlicmVhazsKCQkJCQkJY2FzZSAnY3JlYXRvcicgOgoJCQkJCQkJCSRkb2NQcm9wcy0+c2V0Q3JlYXRvcigkcHJvcGVydHlWYWx1ZSk7CgkJCQkJCQkJJGRvY1Byb3BzLT5zZXRMYXN0TW9kaWZpZWRCeSgkcHJvcGVydHlWYWx1ZSk7CgkJCQkJCQkJYnJlYWs7CgkJCQkJCWNhc2UgJ2RhdGUnIDoKCQkJCQkJCQkkY3JlYXRpb25EYXRlID0gc3RydG90aW1lKCRwcm9wZXJ0eVZhbHVlKTsKCQkJCQkJCQkkZG9jUHJvcHMtPnNldENyZWF0ZWQoJGNyZWF0aW9uRGF0ZSk7CgkJCQkJCQkJJGRvY1Byb3BzLT5zZXRNb2RpZmllZCgkY3JlYXRpb25EYXRlKTsKCQkJCQkJCQlicmVhazsKCQkJCQkJY2FzZSAnZGVzY3JpcHRpb24nIDoKCQkJCQkJCQkkZG9jUHJvcHMtPnNldERlc2NyaXB0aW9uKCRwcm9wZXJ0eVZhbHVlKTsKCQkJCQkJCQlicmVhazsKCQkJCQl9CgkJCQl9CgkJCQkkb2ZmaWNlUHJvcGVydHlNZXRhID0gYXJyYXkoKTsKCQkJCWlmIChpc3NldCgkbmFtZXNwYWNlc01ldGFbJ2RjJ10pKSB7CgkJCQkJJG9mZmljZVByb3BlcnR5TWV0YSA9ICRvZmZpY2VQcm9wZXJ0eURhdGEtPmNoaWxkcmVuKCRuYW1lc3BhY2VzTWV0YVsnbWV0YSddKTsKCQkJCX0KCQkJCWZvcmVhY2goJG9mZmljZVByb3BlcnR5TWV0YSBhcyAkcHJvcGVydHlOYW1lID0+ICRwcm9wZXJ0eVZhbHVlKSB7CgkJCQkJJHByb3BlcnR5VmFsdWVBdHRyaWJ1dGVzID0gJHByb3BlcnR5VmFsdWUtPmF0dHJpYnV0ZXMoJG5hbWVzcGFjZXNNZXRhWydtZXRhJ10pOwoJCQkJCXN3aXRjaCAoJHByb3BlcnR5TmFtZSkgewoJCQkJCQljYXNlICdpbml0aWFsLWNyZWF0b3InIDoKCQkJCQkJCQkkZG9jUHJvcHMtPnNldENyZWF0b3IoJHByb3BlcnR5VmFsdWUpOwoJCQkJCQkJCWJyZWFrOwoJCQkJCQljYXNlICdrZXl3b3JkJyA6CgkJCQkJCQkJJGRvY1Byb3BzLT5zZXRLZXl3b3JkcygkcHJvcGVydHlWYWx1ZSk7CgkJCQkJCQkJYnJlYWs7CgkJCQkJCWNhc2UgJ2NyZWF0aW9uLWRhdGUnIDoKCQkJCQkJCQkkY3JlYXRpb25EYXRlID0gc3RydG90aW1lKCRwcm9wZXJ0eVZhbHVlKTsKCQkJCQkJCQkkZG9jUHJvcHMtPnNldENyZWF0ZWQoJGNyZWF0aW9uRGF0ZSk7CgkJCQkJCQkJYnJlYWs7CgkJCQkJCWNhc2UgJ3VzZXItZGVmaW5lZCcgOgoJCQkJCQkJCSRwcm9wZXJ0eVZhbHVlVHlwZSA9IFBIUEV4Y2VsX0RvY3VtZW50UHJvcGVydGllczo6UFJPUEVSVFlfVFlQRV9TVFJJTkc7CgkJCQkJCQkJZm9yZWFjaCAoJHByb3BlcnR5VmFsdWVBdHRyaWJ1dGVzIGFzICRrZXkgPT4gJHZhbHVlKSB7CgkJCQkJCQkJCWlmICgka2V5ID09ICduYW1lJykgewoJCQkJCQkJCQkJJHByb3BlcnR5VmFsdWVOYW1lID0gKHN0cmluZykgJHZhbHVlOwoJCQkJCQkJCQl9IGVsc2VpZigka2V5ID09ICd2YWx1ZS10eXBlJykgewoJCQkJCQkJCQkJc3dpdGNoICgkdmFsdWUpIHsKCQkJCQkJCQkJCQljYXNlICdkYXRlJwk6CgkJCQkJCQkJCQkJCSRwcm9wZXJ0eVZhbHVlID0gUEhQRXhjZWxfRG9jdW1lbnRQcm9wZXJ0aWVzOjpjb252ZXJ0UHJvcGVydHkoJHByb3BlcnR5VmFsdWUsJ2RhdGUnKTsKCQkJCQkJCQkJCQkJJHByb3BlcnR5VmFsdWVUeXBlID0gUEhQRXhjZWxfRG9jdW1lbnRQcm9wZXJ0aWVzOjpQUk9QRVJUWV9UWVBFX0RBVEU7CgkJCQkJCQkJCQkJCWJyZWFrOwoJCQkJCQkJCQkJCWNhc2UgJ2Jvb2xlYW4nCToKCQkJCQkJCQkJCQkJJHByb3BlcnR5VmFsdWUgPSBQSFBFeGNlbF9Eb2N1bWVudFByb3BlcnRpZXM6OmNvbnZlcnRQcm9wZXJ0eSgkcHJvcGVydHlWYWx1ZSwnYm9vbCcpOwoJCQkJCQkJCQkJCQkkcHJvcGVydHlWYWx1ZVR5cGUgPSBQSFBFeGNlbF9Eb2N1bWVudFByb3BlcnRpZXM6OlBST1BFUlRZX1RZUEVfQk9PTEVBTjsKCQkJCQkJCQkJCQkJYnJlYWs7CgkJCQkJCQkJCQkJY2FzZSAnZmxvYXQnCToKCQkJCQkJCQkJCQkJJHByb3BlcnR5VmFsdWUgPSBQSFBFeGNlbF9Eb2N1bWVudFByb3BlcnRpZXM6OmNvbnZlcnRQcm9wZXJ0eSgkcHJvcGVydHlWYWx1ZSwncjQnKTsKCQkJCQkJCQkJCQkJJHByb3BlcnR5VmFsdWVUeXBlID0gUEhQRXhjZWxfRG9jdW1lbnRQcm9wZXJ0aWVzOjpQUk9QRVJUWV9UWVBFX0ZMT0FUOwoJCQkJCQkJCQkJCQlicmVhazsKCQkJCQkJCQkJCQlkZWZhdWx0IDoKCQkJCQkJCQkJCQkJJHByb3BlcnR5VmFsdWVUeXBlID0gUEhQRXhjZWxfRG9jdW1lbnRQcm9wZXJ0aWVzOjpQUk9QRVJUWV9UWVBFX1NUUklORzsKCQkJCQkJCQkJCX0KCQkJCQkJCQkJfQoJCQkJCQkJCX0KCQkJCQkJCQkkZG9jUHJvcHMtPnNldEN1c3RvbVByb3BlcnR5KCRwcm9wZXJ0eVZhbHVlTmFtZSwkcHJvcGVydHlWYWx1ZSwkcHJvcGVydHlWYWx1ZVR5cGUpOwoJCQkJCQkJCWJyZWFrOwoJCQkJCX0KCQkJCX0KCQkJfQoKCi8vCQkJZWNobyAnPGgxPldvcmtib29rIENvbnRlbnQ8L2gxPic7CgkJCSR4bWwgPSBzaW1wbGV4bWxfbG9hZF9zdHJpbmcoJHppcC0+Z2V0RnJvbU5hbWUoImNvbnRlbnQueG1sIikpOwoJCQkkbmFtZXNwYWNlc0NvbnRlbnQgPSAkeG1sLT5nZXROYW1lc3BhY2VzKHRydWUpOwovLwkJCWVjaG8gJzxwcmU+JzsKLy8JCQlwcmludF9yKCRuYW1lc3BhY2VzQ29udGVudCk7Ci8vCQkJZWNobyAnPC9wcmU+PGhyIC8+JzsKCgkJCSR3b3JrYm9vayA9ICR4bWwtPmNoaWxkcmVuKCRuYW1lc3BhY2VzQ29udGVudFsnb2ZmaWNlJ10pOwoJCQlmb3JlYWNoKCR3b3JrYm9vay0+Ym9keS0+c3ByZWFkc2hlZXQgYXMgJHdvcmtib29rRGF0YSkgewoJCQkJJHdvcmtib29rRGF0YSA9ICR3b3JrYm9va0RhdGEtPmNoaWxkcmVuKCRuYW1lc3BhY2VzQ29udGVudFsndGFibGUnXSk7CgkJCQkkd29ya3NoZWV0SUQgPSAwOwoJCQkJZm9yZWFjaCgkd29ya2Jvb2tEYXRhLT50YWJsZSBhcyAkd29ya3NoZWV0RGF0YVNldCkgewoJCQkJCSR3b3Jrc2hlZXREYXRhID0gJHdvcmtzaGVldERhdGFTZXQtPmNoaWxkcmVuKCRuYW1lc3BhY2VzQ29udGVudFsndGFibGUnXSk7Ci8vCQkJCQlwcmludF9yKCR3b3Jrc2hlZXREYXRhKTsKLy8JCQkJCWVjaG8gJzxiciAvPic7CgkJCQkJJHdvcmtzaGVldERhdGFBdHRyaWJ1dGVzID0gJHdvcmtzaGVldERhdGFTZXQtPmF0dHJpYnV0ZXMoJG5hbWVzcGFjZXNDb250ZW50Wyd0YWJsZSddKTsKLy8JCQkJCXByaW50X3IoJHdvcmtzaGVldERhdGFBdHRyaWJ1dGVzKTsKLy8JCQkJCWVjaG8gJzxiciAvPic7CgkJCQkJaWYgKChpc3NldCgkdGhpcy0+X2xvYWRTaGVldHNPbmx5KSkgJiYgKGlzc2V0KCR3b3Jrc2hlZXREYXRhQXR0cmlidXRlc1snbmFtZSddKSkgJiYKCQkJCQkJKCFpbl9hcnJheSgkd29ya3NoZWV0RGF0YUF0dHJpYnV0ZXNbJ25hbWUnXSwgJHRoaXMtPl9sb2FkU2hlZXRzT25seSkpKSB7CgkJCQkJCWNvbnRpbnVlOwoJCQkJCX0KCi8vCQkJCQllY2hvICc8aDI+V29ya3NoZWV0ICcuJHdvcmtzaGVldERhdGFBdHRyaWJ1dGVzWyduYW1lJ10uJzwvaDI+JzsKCQkJCQkvLyBDcmVhdGUgbmV3IFdvcmtzaGVldAoJCQkJCSRvYmpQSFBFeGNlbC0+Y3JlYXRlU2hlZXQoKTsKCQkJCQkkb2JqUEhQRXhjZWwtPnNldEFjdGl2ZVNoZWV0SW5kZXgoJHdvcmtzaGVldElEKTsKCQkJCQlpZiAoaXNzZXQoJHdvcmtzaGVldERhdGFBdHRyaWJ1dGVzWyduYW1lJ10pKSB7CgkJCQkJCSR3b3Jrc2hlZXROYW1lID0gKHN0cmluZykgJHdvcmtzaGVldERhdGFBdHRyaWJ1dGVzWyduYW1lJ107CgkJCQkJCS8vCVVzZSBmYWxzZSBmb3IgJHVwZGF0ZUZvcm11bGFDZWxsUmVmZXJlbmNlcyB0byBwcmV2ZW50IGFkanVzdG1lbnQgb2Ygd29ya3NoZWV0IHJlZmVyZW5jZXMgaW4KCQkJCQkJLy8JCWZvcm11bGEgY2VsbHMuLi4gZHVyaW5nIHRoZSBsb2FkLCBhbGwgZm9ybXVsYWUgc2hvdWxkIGJlIGNvcnJlY3QsIGFuZCB3ZSdyZSBzaW1wbHkKCQkJCQkJLy8JCWJyaW5naW5nIHRoZSB3b3Jrc2hlZXQgbmFtZSBpbiBsaW5lIHdpdGggdGhlIGZvcm11bGEsIG5vdCB0aGUgcmV2ZXJzZQoJCQkJCQkkb2JqUEhQRXhjZWwtPmdldEFjdGl2ZVNoZWV0KCktPnNldFRpdGxlKCR3b3Jrc2hlZXROYW1lLGZhbHNlKTsKCQkJCQl9CgoJCQkJCSRyb3dJRCA9IDE7CgkJCQkJZm9yZWFjaCgkd29ya3NoZWV0RGF0YSBhcyAka2V5ID0+ICRyb3dEYXRhKSB7Ci8vCQkJCQkJZWNobyAnPGI+Jy4ka2V5Lic8L2I+PGJyIC8+JzsKCQkJCQkJc3dpdGNoICgka2V5KSB7CgkJCQkJCQljYXNlICd0YWJsZS1oZWFkZXItcm93cyc6CgkJCQkJCQkJZm9yZWFjaCAoJHJvd0RhdGEgYXMgJGtleT0+JGNlbGxEYXRhKSB7CgkJCQkJCQkJCSRyb3dEYXRhID0gJGNlbGxEYXRhOwoJCQkJCQkJCQlicmVhazsKCQkJCQkJCQl9CgkJCQkJCQljYXNlICd0YWJsZS1yb3cnIDoKCQkJCQkJCQkkY29sdW1uSUQgPSAnQSc7CgkJCQkJCQkJZm9yZWFjaCgkcm93RGF0YSBhcyAka2V5ID0+ICRjZWxsRGF0YSkgewoJCQkJCQkJCQlpZiAoJHRoaXMtPmdldFJlYWRGaWx0ZXIoKSAhPT0gTlVMTCkgewoJCQkJCQkJCQkJaWYgKCEkdGhpcy0+Z2V0UmVhZEZpbHRlcigpLT5yZWFkQ2VsbCgkY29sdW1uSUQsICRyb3dJRCwgJHdvcmtzaGVldE5hbWUpKSB7CgkJCQkJCQkJCQkJY29udGludWU7CgkJCQkJCQkJCQl9CgkJCQkJCQkJCX0KCi8vCQkJCQkJCQkJZWNobyAnPGI+Jy4kY29sdW1uSUQuJHJvd0lELic8L2I+PGJyIC8+JzsKCQkJCQkJCQkJJGNlbGxEYXRhVGV4dCA9ICRjZWxsRGF0YS0+Y2hpbGRyZW4oJG5hbWVzcGFjZXNDb250ZW50Wyd0ZXh0J10pOwoJCQkJCQkJCQkkY2VsbERhdGFPZmZpY2UgPSAkY2VsbERhdGEtPmNoaWxkcmVuKCRuYW1lc3BhY2VzQ29udGVudFsnb2ZmaWNlJ10pOwoJCQkJCQkJCQkkY2VsbERhdGFPZmZpY2VBdHRyaWJ1dGVzID0gJGNlbGxEYXRhLT5hdHRyaWJ1dGVzKCRuYW1lc3BhY2VzQ29udGVudFsnb2ZmaWNlJ10pOwoJCQkJCQkJCQkkY2VsbERhdGFUYWJsZUF0dHJpYnV0ZXMgPSAkY2VsbERhdGEtPmF0dHJpYnV0ZXMoJG5hbWVzcGFjZXNDb250ZW50Wyd0YWJsZSddKTsKCi8vCQkJCQkJCQkJZWNobyAnT2ZmaWNlIEF0dHJpYnV0ZXM6ICc7Ci8vCQkJCQkJCQkJcHJpbnRfcigkY2VsbERhdGFPZmZpY2VBdHRyaWJ1dGVzKTsKLy8JCQkJCQkJCQllY2hvICc8YnIgLz5UYWJsZSBBdHRyaWJ1dGVzOiAnOwovLwkJCQkJCQkJCXByaW50X3IoJGNlbGxEYXRhVGFibGVBdHRyaWJ1dGVzKTsKLy8JCQkJCQkJCQllY2hvICc8YnIgLz5DZWxsIERhdGEgVGV4dCc7Ci8vCQkJCQkJCQkJcHJpbnRfcigkY2VsbERhdGFUZXh0KTsKLy8JCQkJCQkJCQllY2hvICc8YnIgLz4nOwovLwoJCQkJCQkJCQkkdHlwZSA9ICRmb3JtYXR0aW5nID0gJGh5cGVybGluayA9IG51bGw7CgkJCQkJCQkJCSRoYXNDYWxjdWxhdGVkVmFsdWUgPSBmYWxzZTsKCQkJCQkJCQkJJGNlbGxEYXRhRm9ybXVsYSA9ICcnOwoJCQkJCQkJCQlpZiAoaXNzZXQoJGNlbGxEYXRhVGFibGVBdHRyaWJ1dGVzWydmb3JtdWxhJ10pKSB7CgkJCQkJCQkJCQkkY2VsbERhdGFGb3JtdWxhID0gJGNlbGxEYXRhVGFibGVBdHRyaWJ1dGVzWydmb3JtdWxhJ107CgkJCQkJCQkJCQkkaGFzQ2FsY3VsYXRlZFZhbHVlID0gdHJ1ZTsKCQkJCQkJCQkJfQoKCQkJCQkJCQkJaWYgKGlzc2V0KCRjZWxsRGF0YU9mZmljZS0+YW5ub3RhdGlvbikpIHsKLy8JCQkJCQkJCQkJZWNobyAnQ2VsbCBoYXMgY29tbWVudDxiciAvPic7CgkJCQkJCQkJCQkkYW5ub3RhdGlvblRleHQgPSAkY2VsbERhdGFPZmZpY2UtPmFubm90YXRpb24tPmNoaWxkcmVuKCRuYW1lc3BhY2VzQ29udGVudFsndGV4dCddKTsKCQkJCQkJCQkJCSR0ZXh0QXJyYXkgPSBhcnJheSgpOwoJCQkJCQkJCQkJZm9yZWFjaCgkYW5ub3RhdGlvblRleHQgYXMgJHQpIHsKCQkJCQkJCQkJCQlmb3JlYWNoKCR0LT5zcGFuIGFzICR0ZXh0KSB7CgkJCQkJCQkJCQkJCSR0ZXh0QXJyYXlbXSA9IChzdHJpbmcpJHRleHQ7CgkJCQkJCQkJCQkJfQoJCQkJCQkJCQkJfQoJCQkJCQkJCQkJJHRleHQgPSBpbXBsb2RlKCJcbiIsJHRleHRBcnJheSk7Ci8vCQkJCQkJCQkJCWVjaG8gJHRleHQsJzxiciAvPic7CgkJCQkJCQkJCQkkb2JqUEhQRXhjZWwtPmdldEFjdGl2ZVNoZWV0KCktPmdldENvbW1lbnQoICRjb2x1bW5JRC4kcm93SUQgKQovLwkJCQkJCQkJCQkJCQkJCQkJCS0+c2V0QXV0aG9yKCAkYXV0aG9yICkKCQkJCQkJCQkJCQkJCQkJCQkJLT5zZXRUZXh0KCR0aGlzLT5fcGFyc2VSaWNoVGV4dCgkdGV4dCkgKTsKCQkJCQkJCQkJfQoKCQkJCQkJCQkJaWYgKGlzc2V0KCRjZWxsRGF0YVRleHQtPnApKSB7Ci8vCQkJCQkJCQkJCWVjaG8gJ1ZhbHVlIFR5cGUgaXMgJy4kY2VsbERhdGFPZmZpY2VBdHRyaWJ1dGVzWyd2YWx1ZS10eXBlJ10uJzxiciAvPic7CgkJCQkJCQkJCQlzd2l0Y2ggKCRjZWxsRGF0YU9mZmljZUF0dHJpYnV0ZXNbJ3ZhbHVlLXR5cGUnXSkgewoJCQkJCQkJCQkJCWNhc2UgJ3N0cmluZycgOgoJCQkJCQkJCQkJCQkJJHR5cGUgPSBQSFBFeGNlbF9DZWxsX0RhdGFUeXBlOjpUWVBFX1NUUklORzsKCQkJCQkJCQkJCQkJCSRkYXRhVmFsdWUgPSAkY2VsbERhdGFUZXh0LT5wOwoJCQkJCQkJCQkJCQkJaWYgKGlzc2V0KCRkYXRhVmFsdWUtPmEpKSB7CgkJCQkJCQkJCQkJCQkJJGRhdGFWYWx1ZSA9ICRkYXRhVmFsdWUtPmE7CgkJCQkJCQkJCQkJCQkJJGNlbGxYTGlua0F0dHJpYnV0ZXMgPSAkZGF0YVZhbHVlLT5hdHRyaWJ1dGVzKCRuYW1lc3BhY2VzQ29udGVudFsneGxpbmsnXSk7CgkJCQkJCQkJCQkJCQkJJGh5cGVybGluayA9ICRjZWxsWExpbmtBdHRyaWJ1dGVzWydocmVmJ107CgkJCQkJCQkJCQkJCQl9CgkJCQkJCQkJCQkJCQlicmVhazsKCQkJCQkJCQkJCQljYXNlICdib29sZWFuJyA6CgkJCQkJCQkJCQkJCQkkdHlwZSA9IFBIUEV4Y2VsX0NlbGxfRGF0YVR5cGU6OlRZUEVfQk9PTDsKCQkJCQkJCQkJCQkJCSRkYXRhVmFsdWUgPSAoJGNlbGxEYXRhVGV4dC0+cCA9PSAnVFJVRScpID8gVHJ1ZSA6IEZhbHNlOwoJCQkJCQkJCQkJCQkJYnJlYWs7CgkJCQkJCQkJCQkJY2FzZSAnZmxvYXQnIDoKCQkJCQkJCQkJCQkJCSR0eXBlID0gUEhQRXhjZWxfQ2VsbF9EYXRhVHlwZTo6VFlQRV9OVU1FUklDOwoJCQkJCQkJCQkJCQkJJGRhdGFWYWx1ZSA9IChmbG9hdCkgJGNlbGxEYXRhT2ZmaWNlQXR0cmlidXRlc1sndmFsdWUnXTsKCQkJCQkJCQkJCQkJCWlmIChmbG9vcigkZGF0YVZhbHVlKSA9PSAkZGF0YVZhbHVlKSB7CgkJCQkJCQkJCQkJCQkJJGRhdGFWYWx1ZSA9IChpbnRlZ2VyKSAkZGF0YVZhbHVlOwoJCQkJCQkJCQkJCQkJfQoJCQkJCQkJCQkJCQkJYnJlYWs7CgkJCQkJCQkJCQkJY2FzZSAnZGF0ZScgOgoJCQkJCQkJCQkJCQkJJHR5cGUgPSBQSFBFeGNlbF9DZWxsX0RhdGFUeXBlOjpUWVBFX05VTUVSSUM7CgkJCQkJCQkJCQkJCSAgICAkZGF0ZU9iaiA9IG5ldyBEYXRlVGltZSgkY2VsbERhdGFPZmZpY2VBdHRyaWJ1dGVzWydkYXRlLXZhbHVlJ10sICRHTVQpOwoJCQkJCQkJCQkJCQkJJGRhdGVPYmotPnNldFRpbWVab25lKCR0aW1lem9uZU9iaik7CgkJCQkJCQkJCQkJCQlsaXN0KCR5ZWFyLCRtb250aCwkZGF5LCRob3VyLCRtaW51dGUsJHNlY29uZCkgPSBleHBsb2RlKCcgJywkZGF0ZU9iai0+Zm9ybWF0KCdZIG0gZCBIIGkgcycpKTsKCQkJCQkJCQkJCQkJCSRkYXRhVmFsdWUgPSBQSFBFeGNlbF9TaGFyZWRfRGF0ZTo6Rm9ybWF0dGVkUEhQVG9FeGNlbCgkeWVhciwkbW9udGgsJGRheSwkaG91ciwkbWludXRlLCRzZWNvbmQpOwoJCQkJCQkJCQkJCQkJaWYgKCRkYXRhVmFsdWUgIT0gZmxvb3IoJGRhdGFWYWx1ZSkpIHsKCQkJCQkJCQkJCQkJCQkkZm9ybWF0dGluZyA9IFBIUEV4Y2VsX1N0eWxlX051bWJlckZvcm1hdDo6Rk9STUFUX0RBVEVfWExTWDE1LicgJy5QSFBFeGNlbF9TdHlsZV9OdW1iZXJGb3JtYXQ6OkZPUk1BVF9EQVRFX1RJTUU0OwoJCQkJCQkJCQkJCQkJfSBlbHNlIHsKCQkJCQkJCQkJCQkJCQkkZm9ybWF0dGluZyA9IFBIUEV4Y2VsX1N0eWxlX051bWJlckZvcm1hdDo6Rk9STUFUX0RBVEVfWExTWDE1OwoJCQkJCQkJCQkJCQkJfQoJCQkJCQkJCQkJCQkJYnJlYWs7CgkJCQkJCQkJCQkJY2FzZSAndGltZScgOgoJCQkJCQkJCQkJCQkJJHR5cGUgPSBQSFBFeGNlbF9DZWxsX0RhdGFUeXBlOjpUWVBFX05VTUVSSUM7CgkJCQkJCQkJCQkJCQkkZGF0YVZhbHVlID0gUEhQRXhjZWxfU2hhcmVkX0RhdGU6OlBIUFRvRXhjZWwoc3RydG90aW1lKCcwMS0wMS0xOTcwICcuaW1wbG9kZSgnOicsc3NjYW5mKCRjZWxsRGF0YU9mZmljZUF0dHJpYnV0ZXNbJ3RpbWUtdmFsdWUnXSwnUFQlZEglZE0lZFMnKSkpKTsKCQkJCQkJCQkJCQkJCSRmb3JtYXR0aW5nID0gUEhQRXhjZWxfU3R5bGVfTnVtYmVyRm9ybWF0OjpGT1JNQVRfREFURV9USU1FNDsKCQkJCQkJCQkJCQkJCWJyZWFrOwoJCQkJCQkJCQkJfQovLwkJCQkJCQkJCQllY2hvICdEYXRhIHZhbHVlIGlzICcuJGRhdGFWYWx1ZS4nPGJyIC8+JzsKLy8JCQkJCQkJCQkJaWYgKCRoeXBlcmxpbmsgIT09IE5VTEwpIHsKLy8JCQkJCQkJCQkJCWVjaG8gJ0h5cGVybGluayBpcyAnLiRoeXBlcmxpbmsuJzxiciAvPic7Ci8vCQkJCQkJCQkJCX0KCQkJCQkJCQkJfQoKCQkJCQkJCQkJaWYgKCRoYXNDYWxjdWxhdGVkVmFsdWUpIHsKCQkJCQkJCQkJCSR0eXBlID0gUEhQRXhjZWxfQ2VsbF9EYXRhVHlwZTo6VFlQRV9GT1JNVUxBOwovLwkJCQkJCQkJCQllY2hvICdGb3JtdWxhOiAnLiRjZWxsRGF0YUZvcm11bGEuJzxiciAvPic7CgkJCQkJCQkJCQkkY2VsbERhdGFGb3JtdWxhID0gc3Vic3RyKCRjZWxsRGF0YUZvcm11bGEsc3RycG9zKCRjZWxsRGF0YUZvcm11bGEsJzo9JykrMSk7CgkJCQkJCQkJCQkkdGVtcCA9IGV4cGxvZGUoJyInLCRjZWxsRGF0YUZvcm11bGEpOwoJCQkJCQkJCQkJJHRLZXkgPSBmYWxzZTsKCQkJCQkJCQkJCWZvcmVhY2goJHRlbXAgYXMgJiR2YWx1ZSkgewoJCQkJCQkJCQkJCS8vCU9ubHkgcmVwbGFjZSBpbiBhbHRlcm5hdGUgYXJyYXkgZW50cmllcyAoaS5lLiBub24tcXVvdGVkIGJsb2NrcykKCQkJCQkJCQkJCQlpZiAoJHRLZXkgPSAhJHRLZXkpIHsKCQkJCQkJCQkJCQkJJHZhbHVlID0gcHJlZ19yZXBsYWNlKCcvXFtcLiguKik6XC4oLiopXF0vVWknLCckMTokMicsJHZhbHVlKTsKCQkJCQkJCQkJCQkJJHZhbHVlID0gcHJlZ19yZXBsYWNlKCcvXFtcLiguKilcXS9VaScsJyQxJywkdmFsdWUpOwoJCQkJCQkJCQkJCQkkdmFsdWUgPSBQSFBFeGNlbF9DYWxjdWxhdGlvbjo6X3RyYW5zbGF0ZVNlcGFyYXRvcignOycsJywnLCR2YWx1ZSwkaW5CcmFjZXMpOwoJCQkJCQkJCQkJCX0KCQkJCQkJCQkJCX0KCQkJCQkJCQkJCXVuc2V0KCR2YWx1ZSk7CgkJCQkJCQkJCQkvLwlUaGVuIHJlYnVpbGQgdGhlIGZvcm11bGEgc3RyaW5nCgkJCQkJCQkJCQkkY2VsbERhdGFGb3JtdWxhID0gaW1wbG9kZSgnIicsJHRlbXApOwovLwkJCQkJCQkJCQllY2hvICdBZGp1c3RlZCBGb3JtdWxhOiAnLiRjZWxsRGF0YUZvcm11bGEuJzxiciAvPic7CgkJCQkJCQkJCX0KCgkJCQkJCQkJCSRyZXBlYXRzID0gKGlzc2V0KCRjZWxsRGF0YVRhYmxlQXR0cmlidXRlc1snbnVtYmVyLWNvbHVtbnMtcmVwZWF0ZWQnXSkpID8KCQkJCQkJCQkJCSRjZWxsRGF0YVRhYmxlQXR0cmlidXRlc1snbnVtYmVyLWNvbHVtbnMtcmVwZWF0ZWQnXSA6IDE7CgkJCQkJCQkJCWlmICgkdHlwZSAhPT0gTlVMTCkgewoJCQkJCQkJCQkJZm9yICgkaSA9IDA7ICRpIDwgJHJlcGVhdHM7ICsrJGkpIHsKCQkJCQkJCQkJCQlpZiAoJGkgPiAwKSB7CgkJCQkJCQkJCQkJCSsrJGNvbHVtbklEOwoJCQkJCQkJCQkJCX0KCQkJCQkJCQkJCQkkb2JqUEhQRXhjZWwtPmdldEFjdGl2ZVNoZWV0KCktPmdldENlbGwoJGNvbHVtbklELiRyb3dJRCktPnNldFZhbHVlRXhwbGljaXQoKCgkaGFzQ2FsY3VsYXRlZFZhbHVlKSA/ICRjZWxsRGF0YUZvcm11bGEgOiAkZGF0YVZhbHVlKSwkdHlwZSk7CgkJCQkJCQkJCQkJaWYgKCRoYXNDYWxjdWxhdGVkVmFsdWUpIHsKLy8JCQkJCQkJCQkJCQllY2hvICdGb3J1bWxhIHJlc3VsdCBpcyAnLiRkYXRhVmFsdWUuJzxiciAvPic7CgkJCQkJCQkJCQkJCSRvYmpQSFBFeGNlbC0+Z2V0QWN0aXZlU2hlZXQoKS0+Z2V0Q2VsbCgkY29sdW1uSUQuJHJvd0lEKS0+c2V0Q2FsY3VsYXRlZFZhbHVlKCRkYXRhVmFsdWUpOwoJCQkJCQkJCQkJCX0KCQkJCQkJCQkJCQlpZiAoKCRjZWxsRGF0YU9mZmljZUF0dHJpYnV0ZXNbJ3ZhbHVlLXR5cGUnXSA9PSAnZGF0ZScpIHx8CgkJCQkJCQkJCQkJCSgkY2VsbERhdGFPZmZpY2VBdHRyaWJ1dGVzWyd2YWx1ZS10eXBlJ10gPT0gJ3RpbWUnKSkgewoJCQkJCQkJCQkJCQkkb2JqUEhQRXhjZWwtPmdldEFjdGl2ZVNoZWV0KCktPmdldFN0eWxlKCRjb2x1bW5JRC4kcm93SUQpLT5nZXROdW1iZXJGb3JtYXQoKS0+c2V0Rm9ybWF0Q29kZSgkZm9ybWF0dGluZyk7CgkJCQkJCQkJCQkJfQoJCQkJCQkJCQkJCWlmICgkaHlwZXJsaW5rICE9PSBOVUxMKSB7CgkJCQkJCQkJCQkJCSRvYmpQSFBFeGNlbC0+Z2V0QWN0aXZlU2hlZXQoKS0+Z2V0Q2VsbCgkY29sdW1uSUQuJHJvd0lEKS0+Z2V0SHlwZXJsaW5rKCktPnNldFVybCgkaHlwZXJsaW5rKTsKCQkJCQkJCQkJCQl9CgkJCQkJCQkJCQl9CgkJCQkJCQkJCX0KCgkJCQkJCQkJCS8vCU1lcmdlZCBjZWxscwoJCQkJCQkJCQlpZiAoKGlzc2V0KCRjZWxsRGF0YVRhYmxlQXR0cmlidXRlc1snbnVtYmVyLWNvbHVtbnMtc3Bhbm5lZCddKSkgfHwgKGlzc2V0KCRjZWxsRGF0YVRhYmxlQXR0cmlidXRlc1snbnVtYmVyLXJvd3Mtc3Bhbm5lZCddKSkpIHsKCQkJCQkJCQkJCSRjb2x1bW5UbyA9ICRjb2x1bW5JRDsKCQkJCQkJCQkJCWlmIChpc3NldCgkY2VsbERhdGFUYWJsZUF0dHJpYnV0ZXNbJ251bWJlci1jb2x1bW5zLXNwYW5uZWQnXSkpIHsKCQkJCQkJCQkJCQkkY29sdW1uVG8gPSBQSFBFeGNlbF9DZWxsOjpzdHJpbmdGcm9tQ29sdW1uSW5kZXgoUEhQRXhjZWxfQ2VsbDo6Y29sdW1uSW5kZXhGcm9tU3RyaW5nKCRjb2x1bW5JRCkgKyAkY2VsbERhdGFUYWJsZUF0dHJpYnV0ZXNbJ251bWJlci1jb2x1bW5zLXNwYW5uZWQnXSAtMik7CgkJCQkJCQkJCQl9CgkJCQkJCQkJCQkkcm93VG8gPSAkcm93SUQ7CgkJCQkJCQkJCQlpZiAoaXNzZXQoJGNlbGxEYXRhVGFibGVBdHRyaWJ1dGVzWydudW1iZXItcm93cy1zcGFubmVkJ10pKSB7CgkJCQkJCQkJCQkJJHJvd1RvID0gJHJvd1RvICsgJGNlbGxEYXRhVGFibGVBdHRyaWJ1dGVzWydudW1iZXItcm93cy1zcGFubmVkJ10gLSAxOwoJCQkJCQkJCQkJfQoJCQkJCQkJCQkJJGNlbGxSYW5nZSA9ICRjb2x1bW5JRC4kcm93SUQuJzonLiRjb2x1bW5Uby4kcm93VG87CgkJCQkJCQkJCQkkb2JqUEhQRXhjZWwtPmdldEFjdGl2ZVNoZWV0KCktPm1lcmdlQ2VsbHMoJGNlbGxSYW5nZSk7CgkJCQkJCQkJCX0KCgkJCQkJCQkJCSsrJGNvbHVtbklEOwoJCQkJCQkJCX0KCQkJCQkJCQkrKyRyb3dJRDsKCQkJCQkJCQlicmVhazsKCQkJCQkJfQoJCQkJCX0KCQkJCQkrKyR3b3Jrc2hlZXRJRDsKCQkJCX0KCQkJfQoKCQl9CgoJCS8vIFJldHVybgoJCXJldHVybiAkb2JqUEhQRXhjZWw7Cgl9CgoKCXByaXZhdGUgZnVuY3Rpb24gX3BhcnNlUmljaFRleHQoJGlzID0gJycpIHsKCQkkdmFsdWUgPSBuZXcgUEhQRXhjZWxfUmljaFRleHQoKTsKCgkJJHZhbHVlLT5jcmVhdGVUZXh0KCRpcyk7CgoJCXJldHVybiAkdmFsdWU7Cgl9Cgp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Reader/SYLK.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIFBIUEV4Y2VsCiAqCiAqIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICoKICogQGNhdGVnb3J5ICAgUEhQRXhjZWwKICogQHBhY2thZ2UgICAgUEhQRXhjZWxfUmVhZGVyCiAqIEBjb3B5cmlnaHQgIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwgKGh0dHA6Ly93d3cuY29kZXBsZXguY29tL1BIUEV4Y2VsKQogKiBAbGljZW5zZSAgICBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvb2xkLWxpY2Vuc2VzL2xncGwtMi4xLnR4dAlMR1BMCiAqIEB2ZXJzaW9uICAgIDEuNy43LCAyMDEyLTA1LTE5CiAqLwoKCi8qKiBQSFBFeGNlbCByb290IGRpcmVjdG9yeSAqLwppZiAoIWRlZmluZWQoJ1BIUEVYQ0VMX1JPT1QnKSkgewoJLyoqCgkgKiBAaWdub3JlCgkgKi8KCWRlZmluZSgnUEhQRVhDRUxfUk9PVCcsIGRpcm5hbWUoX19GSUxFX18pIC4gJy8uLi8uLi8nKTsKCXJlcXVpcmUoUEhQRVhDRUxfUk9PVCAuICdQSFBFeGNlbC9BdXRvbG9hZGVyLnBocCcpOwp9CgovKioKICogUEhQRXhjZWxfUmVhZGVyX1NZTEsKICoKICogQGNhdGVnb3J5ICAgUEhQRXhjZWwKICogQHBhY2thZ2UgICAgUEhQRXhjZWxfUmVhZGVyCiAqIEBjb3B5cmlnaHQgIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwgKGh0dHA6Ly93d3cuY29kZXBsZXguY29tL1BIUEV4Y2VsKQogKi8KY2xhc3MgUEhQRXhjZWxfUmVhZGVyX1NZTEsgaW1wbGVtZW50cyBQSFBFeGNlbF9SZWFkZXJfSVJlYWRlcgp7CgkvKioKCSAqIElucHV0IGVuY29kaW5nCgkgKgoJICogQHZhciBzdHJpbmcKCSAqLwoJcHJpdmF0ZSAkX2lucHV0RW5jb2RpbmcJPSAnQU5TSSc7CgoJLyoqCgkgKiBTaGVldCBpbmRleCB0byByZWFkCgkgKgoJICogQHZhciBpbnQKCSAqLwoJcHJpdmF0ZSAkX3NoZWV0SW5kZXggCT0gMDsKCgkvKioKCSAqIEZvcm1hdHMKCSAqCgkgKiBAdmFyIGFycmF5CgkgKi8KCXByaXZhdGUgJF9mb3JtYXRzID0gYXJyYXkoKTsKCgkvKioKCSAqIEZvcm1hdCBDb3VudAoJICoKCSAqIEB2YXIgaW50CgkgKi8KCXByaXZhdGUgJF9mb3JtYXQgPSAwOwoKCS8qKgoJICogUEhQRXhjZWxfUmVhZGVyX0lSZWFkRmlsdGVyIGluc3RhbmNlCgkgKgoJICogQHZhciBQSFBFeGNlbF9SZWFkZXJfSVJlYWRGaWx0ZXIKCSAqLwoJcHJpdmF0ZSAkX3JlYWRGaWx0ZXIgPSBudWxsOwoKCgkvKioKCSAqIENyZWF0ZSBhIG5ldyBQSFBFeGNlbF9SZWFkZXJfU1lMSwoJICovCglwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoKSB7CgkJJHRoaXMtPl9yZWFkRmlsdGVyIAk9IG5ldyBQSFBFeGNlbF9SZWFkZXJfRGVmYXVsdFJlYWRGaWx0ZXIoKTsKCX0KCgoJLyoqCgkgKiBDYW4gdGhlIGN1cnJlbnQgUEhQRXhjZWxfUmVhZGVyX0lSZWFkZXIgcmVhZCB0aGUgZmlsZT8KCSAqCgkgKiBAcGFyYW0gCXN0cmluZyAJCSRwRmlsZU5hbWUKCSAqIEByZXR1cm4gCWJvb2xlYW4KCSAqIEB0aHJvd3MgRXhjZXB0aW9uCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBjYW5SZWFkKCRwRmlsZW5hbWUpCgl7CgkJLy8gQ2hlY2sgaWYgZmlsZSBleGlzdHMKCQlpZiAoIWZpbGVfZXhpc3RzKCRwRmlsZW5hbWUpKSB7CgkJCXRocm93IG5ldyBFeGNlcHRpb24oIkNvdWxkIG5vdCBvcGVuICIgLiAkcEZpbGVuYW1lIC4gIiBmb3IgcmVhZGluZyEgRmlsZSBkb2VzIG5vdCBleGlzdC4iKTsKCQl9CgoJCS8vIFJlYWQgc2FtcGxlIGRhdGEgKGZpcnN0IDIgS0Igd2lsbCBkbykKCQkkZmggPSBmb3BlbigkcEZpbGVuYW1lLCAncicpOwoJCSRkYXRhID0gZnJlYWQoJGZoLCAyMDQ4KTsKCQlmY2xvc2UoJGZoKTsKCgkJLy8gQ291bnQgZGVsaW1pdGVycyBpbiBmaWxlCgkJJGRlbGltaXRlckNvdW50ID0gc3Vic3RyX2NvdW50KCRkYXRhLCAnOycpOwoJCWlmICgkZGVsaW1pdGVyQ291bnQgPCAxKSB7CgkJCXJldHVybiBmYWxzZTsKCQl9CgoJCS8vIEFuYWx5emUgZmlyc3QgbGluZSBsb29raW5nIGZvciBJRDsgc2lnbmF0dXJlCgkJJGxpbmVzID0gZXhwbG9kZSgiXG4iLCAkZGF0YSk7CgkJaWYgKHN1YnN0cigkbGluZXNbMF0sMCw0KSAhPSAnSUQ7UCcpIHsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCgkJcmV0dXJuIHRydWU7Cgl9CgoKCS8qKgoJICogUmVhZCBmaWx0ZXIKCSAqCgkgKiBAcmV0dXJuIFBIUEV4Y2VsX1JlYWRlcl9JUmVhZEZpbHRlcgoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0UmVhZEZpbHRlcigpIHsKCQlyZXR1cm4gJHRoaXMtPl9yZWFkRmlsdGVyOwoJfQoKCgkvKioKCSAqIFNldCByZWFkIGZpbHRlcgoJICoKCSAqIEBwYXJhbSBQSFBFeGNlbF9SZWFkZXJfSVJlYWRGaWx0ZXIgJHBWYWx1ZQoJICovCglwdWJsaWMgZnVuY3Rpb24gc2V0UmVhZEZpbHRlcihQSFBFeGNlbF9SZWFkZXJfSVJlYWRGaWx0ZXIgJHBWYWx1ZSkgewoJCSR0aGlzLT5fcmVhZEZpbHRlciA9ICRwVmFsdWU7CgkJcmV0dXJuICR0aGlzOwoJfQoKCgkvKioKCSAqIFNldCBpbnB1dCBlbmNvZGluZwoJICoKCSAqIEBwYXJhbSBzdHJpbmcgJHBWYWx1ZSBJbnB1dCBlbmNvZGluZwoJICovCglwdWJsaWMgZnVuY3Rpb24gc2V0SW5wdXRFbmNvZGluZygkcFZhbHVlID0gJ0FOU0knKQoJewoJCSR0aGlzLT5faW5wdXRFbmNvZGluZyA9ICRwVmFsdWU7CgkJcmV0dXJuICR0aGlzOwoJfQoKCgkvKioKCSAqIEdldCBpbnB1dCBlbmNvZGluZwoJICoKCSAqIEByZXR1cm4gc3RyaW5nCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRJbnB1dEVuY29kaW5nKCkKCXsKCQlyZXR1cm4gJHRoaXMtPl9pbnB1dEVuY29kaW5nOwoJfQoKCgkvKioKCSAqIFJldHVybiB3b3Jrc2hlZXQgaW5mbyAoTmFtZSwgTGFzdCBDb2x1bW4gTGV0dGVyLCBMYXN0IENvbHVtbiBJbmRleCwgVG90YWwgUm93cywgVG90YWwgQ29sdW1ucykKCSAqCgkgKiBAcGFyYW0gICBzdHJpbmcgICAgICRwRmlsZW5hbWUKCSAqIEB0aHJvd3MgICBFeGNlcHRpb24KCSAqLwoJcHVibGljIGZ1bmN0aW9uIGxpc3RXb3Jrc2hlZXRJbmZvKCRwRmlsZW5hbWUpCgl7CgkJLy8gQ2hlY2sgaWYgZmlsZSBleGlzdHMKCQlpZiAoIWZpbGVfZXhpc3RzKCRwRmlsZW5hbWUpKSB7CgkJCXRocm93IG5ldyBFeGNlcHRpb24oIkNvdWxkIG5vdCBvcGVuICIgLiAkcEZpbGVuYW1lIC4gIiBmb3IgcmVhZGluZyEgRmlsZSBkb2VzIG5vdCBleGlzdC4iKTsKCQl9CgoJCS8vIE9wZW4gZmlsZQoJCSRmaWxlSGFuZGxlID0gZm9wZW4oJHBGaWxlbmFtZSwgJ3InKTsKCQlpZiAoJGZpbGVIYW5kbGUgPT09IGZhbHNlKSB7CgkJCXRocm93IG5ldyBFeGNlcHRpb24oIkNvdWxkIG5vdCBvcGVuIGZpbGUgIiAuICRwRmlsZW5hbWUgLiAiIGZvciByZWFkaW5nLiIpOwoJCX0KCgkJJHdvcmtzaGVldEluZm8gPSBhcnJheSgpOwoJCSR3b3Jrc2hlZXRJbmZvWzBdWyd3b3Jrc2hlZXROYW1lJ10gPSAnV29ya3NoZWV0JzsKCQkkd29ya3NoZWV0SW5mb1swXVsnbGFzdENvbHVtbkxldHRlciddID0gJ0EnOwoJCSR3b3Jrc2hlZXRJbmZvWzBdWydsYXN0Q29sdW1uSW5kZXgnXSA9IDA7CgkJJHdvcmtzaGVldEluZm9bMF1bJ3RvdGFsUm93cyddID0gMDsKCQkkd29ya3NoZWV0SW5mb1swXVsndG90YWxDb2x1bW5zJ10gPSAwOwoKCQkvLyBMb29wIHRocm91Z2ggZmlsZQoJCSRyb3dEYXRhID0gYXJyYXkoKTsKCgkJLy8gbG9vcCB0aHJvdWdoIG9uZSByb3cgKGxpbmUpIGF0IGEgdGltZSBpbiB0aGUgZmlsZQoJCSRyb3dJbmRleCA9IDA7CgkJd2hpbGUgKCgkcm93RGF0YSA9IGZnZXRzKCRmaWxlSGFuZGxlKSkgIT09IEZBTFNFKSB7CgkJCSRjb2x1bW5JbmRleCA9IDA7CgoJCQkvLyBjb252ZXJ0IFNZTEsgZW5jb2RlZCAkcm93RGF0YSB0byBVVEYtOAoJCQkkcm93RGF0YSA9IFBIUEV4Y2VsX1NoYXJlZF9TdHJpbmc6OlNZTEt0b1VURjgoJHJvd0RhdGEpOwoKCQkJLy8gZXhwbG9kZSBlYWNoIHJvdyBhdCBzZW1pY29sb25zIHdoaWxlIHRha2luZyBpbnRvIGFjY291bnQgdGhhdCBsaXRlcmFsIHNlbWljb2xvbiAoOykKCQkJLy8gaXMgZXNjYXBlZCBsaWtlIHRoaXMgKDs7KQoJCQkkcm93RGF0YSA9IGV4cGxvZGUoIlx0IixzdHJfcmVwbGFjZSgnPycsJzsnLHN0cl9yZXBsYWNlKCc7JywiXHQiLHN0cl9yZXBsYWNlKCc7OycsJz8nLHJ0cmltKCRyb3dEYXRhKSkpKSk7CgoJCQkkZGF0YVR5cGUgPSBhcnJheV9zaGlmdCgkcm93RGF0YSk7CgkJCWlmICgkZGF0YVR5cGUgPT0gJ0MnKSB7CgkJCQkvLyAgUmVhZCBjZWxsIHZhbHVlIGRhdGEKCQkJCWZvcmVhY2goJHJvd0RhdGEgYXMgJHJvd0RhdHVtKSB7CgkJCQkJc3dpdGNoKCRyb3dEYXR1bXswfSkgewoJCQkJCQljYXNlICdDJyA6CgkJCQkJCWNhc2UgJ1gnIDoKCQkJCQkJCSRjb2x1bW5JbmRleCA9IHN1YnN0cigkcm93RGF0dW0sMSkgLSAxOwoJCQkJCQkJYnJlYWs7CgkJCQkJCWNhc2UgJ1InIDoKCQkJCQkJY2FzZSAnWScgOgoJCQkJCQkJJHJvd0luZGV4ID0gc3Vic3RyKCRyb3dEYXR1bSwxKTsKCQkJCQkJCWJyZWFrOwoJCQkJCX0KCgkJCQkJJHdvcmtzaGVldEluZm9bMF1bJ3RvdGFsUm93cyddID0gbWF4KCR3b3Jrc2hlZXRJbmZvWzBdWyd0b3RhbFJvd3MnXSwgJHJvd0luZGV4KTsKCQkJCQkkd29ya3NoZWV0SW5mb1swXVsnbGFzdENvbHVtbkluZGV4J10gPSBtYXgoJHdvcmtzaGVldEluZm9bMF1bJ2xhc3RDb2x1bW5JbmRleCddLCAkY29sdW1uSW5kZXgpOwoJCQkJfQoJCQl9CgkJfQoKCQkkd29ya3NoZWV0SW5mb1swXVsnbGFzdENvbHVtbkxldHRlciddID0gUEhQRXhjZWxfQ2VsbDo6c3RyaW5nRnJvbUNvbHVtbkluZGV4KCR3b3Jrc2hlZXRJbmZvWzBdWydsYXN0Q29sdW1uSW5kZXgnXSk7CgkJJHdvcmtzaGVldEluZm9bMF1bJ3RvdGFsQ29sdW1ucyddID0gJHdvcmtzaGVldEluZm9bMF1bJ2xhc3RDb2x1bW5JbmRleCddICsgMTsKCgkJLy8gQ2xvc2UgZmlsZQoJCWZjbG9zZSgkZmlsZUhhbmRsZSk7CgoJCXJldHVybiAkd29ya3NoZWV0SW5mbzsKCX0KCgoJLyoqCgkgKiBMb2FkcyBQSFBFeGNlbCBmcm9tIGZpbGUKCSAqCgkgKiBAcGFyYW0gCXN0cmluZyAJCSRwRmlsZW5hbWUKCSAqIEByZXR1cm4gCVBIUEV4Y2VsCgkgKiBAdGhyb3dzIAlFeGNlcHRpb24KCSAqLwoJcHVibGljIGZ1bmN0aW9uIGxvYWQoJHBGaWxlbmFtZSkKCXsKCQkvLyBDcmVhdGUgbmV3IFBIUEV4Y2VsCgkJJG9ialBIUEV4Y2VsID0gbmV3IFBIUEV4Y2VsKCk7CgoJCS8vIExvYWQgaW50byB0aGlzIGluc3RhbmNlCgkJcmV0dXJuICR0aGlzLT5sb2FkSW50b0V4aXN0aW5nKCRwRmlsZW5hbWUsICRvYmpQSFBFeGNlbCk7Cgl9CgoKCS8qKgoJICogTG9hZHMgUEhQRXhjZWwgZnJvbSBmaWxlIGludG8gUEhQRXhjZWwgaW5zdGFuY2UKCSAqCgkgKiBAcGFyYW0gCXN0cmluZyAJCSRwRmlsZW5hbWUKCSAqIEBwYXJhbQlQSFBFeGNlbAkkb2JqUEhQRXhjZWwKCSAqIEByZXR1cm4gCVBIUEV4Y2VsCgkgKiBAdGhyb3dzIAlFeGNlcHRpb24KCSAqLwoJcHVibGljIGZ1bmN0aW9uIGxvYWRJbnRvRXhpc3RpbmcoJHBGaWxlbmFtZSwgUEhQRXhjZWwgJG9ialBIUEV4Y2VsKQoJewoJCS8vIENoZWNrIGlmIGZpbGUgZXhpc3RzCgkJaWYgKCFmaWxlX2V4aXN0cygkcEZpbGVuYW1lKSkgewoJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCJDb3VsZCBub3Qgb3BlbiAiIC4gJHBGaWxlbmFtZSAuICIgZm9yIHJlYWRpbmchIEZpbGUgZG9lcyBub3QgZXhpc3QuIik7CgkJfQoKCQkvLyBDcmVhdGUgbmV3IFBIUEV4Y2VsCgkJd2hpbGUgKCRvYmpQSFBFeGNlbC0+Z2V0U2hlZXRDb3VudCgpIDw9ICR0aGlzLT5fc2hlZXRJbmRleCkgewoJCQkkb2JqUEhQRXhjZWwtPmNyZWF0ZVNoZWV0KCk7CgkJfQoJCSRvYmpQSFBFeGNlbC0+c2V0QWN0aXZlU2hlZXRJbmRleCggJHRoaXMtPl9zaGVldEluZGV4ICk7CgoJCSRmcm9tRm9ybWF0cwk9IGFycmF5KCdcLScsCSdcICcpOwoJCSR0b0Zvcm1hdHMJCT0gYXJyYXkoJy0nLAknICcpOwoKCQkvLyBPcGVuIGZpbGUKCQkkZmlsZUhhbmRsZSA9IGZvcGVuKCRwRmlsZW5hbWUsICdyJyk7CgkJaWYgKCRmaWxlSGFuZGxlID09PSBmYWxzZSkgewoJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCJDb3VsZCBub3Qgb3BlbiBmaWxlICRwRmlsZW5hbWUgZm9yIHJlYWRpbmcuIik7CgkJfQoKCQkvLyBMb29wIHRocm91Z2ggZmlsZQoJCSRyb3dEYXRhID0gYXJyYXkoKTsKCQkkY29sdW1uID0gJHJvdyA9ICcnOwoKCQkvLyBsb29wIHRocm91Z2ggb25lIHJvdyAobGluZSkgYXQgYSB0aW1lIGluIHRoZSBmaWxlCgkJd2hpbGUgKCgkcm93RGF0YSA9IGZnZXRzKCRmaWxlSGFuZGxlKSkgIT09IEZBTFNFKSB7CgoJCQkvLyBjb252ZXJ0IFNZTEsgZW5jb2RlZCAkcm93RGF0YSB0byBVVEYtOAoJCQkkcm93RGF0YSA9IFBIUEV4Y2VsX1NoYXJlZF9TdHJpbmc6OlNZTEt0b1VURjgoJHJvd0RhdGEpOwoKCQkJLy8gZXhwbG9kZSBlYWNoIHJvdyBhdCBzZW1pY29sb25zIHdoaWxlIHRha2luZyBpbnRvIGFjY291bnQgdGhhdCBsaXRlcmFsIHNlbWljb2xvbiAoOykKCQkJLy8gaXMgZXNjYXBlZCBsaWtlIHRoaXMgKDs7KQoJCQkkcm93RGF0YSA9IGV4cGxvZGUoIlx0IixzdHJfcmVwbGFjZSgnwqQnLCc7JyxzdHJfcmVwbGFjZSgnOycsIlx0IixzdHJfcmVwbGFjZSgnOzsnLCfCpCcscnRyaW0oJHJvd0RhdGEpKSkpKTsKCgkJCSRkYXRhVHlwZSA9IGFycmF5X3NoaWZ0KCRyb3dEYXRhKTsKCQkJLy8JUmVhZCBzaGFyZWQgc3R5bGVzCgkJCWlmICgkZGF0YVR5cGUgPT0gJ1AnKSB7CgkJCQkkZm9ybWF0QXJyYXkgPSBhcnJheSgpOwoJCQkJZm9yZWFjaCgkcm93RGF0YSBhcyAkcm93RGF0dW0pIHsKCQkJCQlzd2l0Y2goJHJvd0RhdHVtezB9KSB7CgkJCQkJCWNhc2UgJ1AnIDoJJGZvcm1hdEFycmF5WydudW1iZXJmb3JtYXQnXVsnY29kZSddID0gc3RyX3JlcGxhY2UoJGZyb21Gb3JtYXRzLCR0b0Zvcm1hdHMsc3Vic3RyKCRyb3dEYXR1bSwxKSk7CgkJCQkJCQkJCWJyZWFrOwoJCQkJCQljYXNlICdFJyA6CgkJCQkJCWNhc2UgJ0YnIDoJJGZvcm1hdEFycmF5Wydmb250J11bJ25hbWUnXSA9IHN1YnN0cigkcm93RGF0dW0sMSk7CgkJCQkJCQkJCWJyZWFrOwoJCQkJCQljYXNlICdMJyA6CSRmb3JtYXRBcnJheVsnZm9udCddWydzaXplJ10gPSBzdWJzdHIoJHJvd0RhdHVtLDEpOwoJCQkJCQkJCQlicmVhazsKCQkJCQkJY2FzZSAnUycgOgkkc3R5bGVTZXR0aW5ncyA9IHN1YnN0cigkcm93RGF0dW0sMSk7CgkJCQkJCQkJCWZvciAoJGk9MDskaTxzdHJsZW4oJHN0eWxlU2V0dGluZ3MpOysrJGkpIHsKCQkJCQkJCQkJCXN3aXRjaCAoJHN0eWxlU2V0dGluZ3N7JGl9KSB7CgkJCQkJCQkJCQkJY2FzZSAnSScgOgkkZm9ybWF0QXJyYXlbJ2ZvbnQnXVsnaXRhbGljJ10gPSB0cnVlOwoJCQkJCQkJCQkJCQkJCWJyZWFrOwoJCQkJCQkJCQkJCWNhc2UgJ0QnIDoJJGZvcm1hdEFycmF5Wydmb250J11bJ2JvbGQnXSA9IHRydWU7CgkJCQkJCQkJCQkJCQkJYnJlYWs7CgkJCQkJCQkJCQkJY2FzZSAnVCcgOgkkZm9ybWF0QXJyYXlbJ2JvcmRlcnMnXVsndG9wJ11bJ3N0eWxlJ10gPSBQSFBFeGNlbF9TdHlsZV9Cb3JkZXI6OkJPUkRFUl9USElOOwoJCQkJCQkJCQkJCQkJCWJyZWFrOwoJCQkJCQkJCQkJCWNhc2UgJ0InIDoJJGZvcm1hdEFycmF5Wydib3JkZXJzJ11bJ2JvdHRvbSddWydzdHlsZSddID0gUEhQRXhjZWxfU3R5bGVfQm9yZGVyOjpCT1JERVJfVEhJTjsKCQkJCQkJCQkJCQkJCQlicmVhazsKCQkJCQkJCQkJCQljYXNlICdMJyA6CSRmb3JtYXRBcnJheVsnYm9yZGVycyddWydsZWZ0J11bJ3N0eWxlJ10gPSBQSFBFeGNlbF9TdHlsZV9Cb3JkZXI6OkJPUkRFUl9USElOOwoJCQkJCQkJCQkJCQkJCWJyZWFrOwoJCQkJCQkJCQkJCWNhc2UgJ1InIDoJJGZvcm1hdEFycmF5Wydib3JkZXJzJ11bJ3JpZ2h0J11bJ3N0eWxlJ10gPSBQSFBFeGNlbF9TdHlsZV9Cb3JkZXI6OkJPUkRFUl9USElOOwoJCQkJCQkJCQkJCQkJCWJyZWFrOwoJCQkJCQkJCQkJfQoJCQkJCQkJCQl9CgkJCQkJCQkJCWJyZWFrOwoJCQkJCX0KCQkJCX0KCQkJCSR0aGlzLT5fZm9ybWF0c1snUCcuJHRoaXMtPl9mb3JtYXQrK10gPSAkZm9ybWF0QXJyYXk7CgkJCS8vCVJlYWQgY2VsbCB2YWx1ZSBkYXRhCgkJCX0gZWxzZWlmICgkZGF0YVR5cGUgPT0gJ0MnKSB7CgkJCQkkaGFzQ2FsY3VsYXRlZFZhbHVlID0gZmFsc2U7CgkJCQkkY2VsbERhdGEgPSAkY2VsbERhdGFGb3JtdWxhID0gJyc7CgkJCQlmb3JlYWNoKCRyb3dEYXRhIGFzICRyb3dEYXR1bSkgewoJCQkJCXN3aXRjaCgkcm93RGF0dW17MH0pIHsKCQkJCQkJY2FzZSAnQycgOgoJCQkJCQljYXNlICdYJyA6CSRjb2x1bW4gPSBzdWJzdHIoJHJvd0RhdHVtLDEpOwoJCQkJCQkJCQlicmVhazsKCQkJCQkJY2FzZSAnUicgOgoJCQkJCQljYXNlICdZJyA6CSRyb3cgPSBzdWJzdHIoJHJvd0RhdHVtLDEpOwoJCQkJCQkJCQlicmVhazsKCQkJCQkJY2FzZSAnSycgOgkkY2VsbERhdGEgPSBzdWJzdHIoJHJvd0RhdHVtLDEpOwoJCQkJCQkJCQlicmVhazsKCQkJCQkJY2FzZSAnRScgOgkkY2VsbERhdGFGb3JtdWxhID0gJz0nLnN1YnN0cigkcm93RGF0dW0sMSk7CgkJCQkJCQkJCS8vCUNvbnZlcnQgUjFDMSBzdHlsZSByZWZlcmVuY2VzIHRvIEExIHN0eWxlIHJlZmVyZW5jZXMgKGJ1dCBvbmx5IHdoZW4gbm90IHF1b3RlZCkKCQkJCQkJCQkJJHRlbXAgPSBleHBsb2RlKCciJywkY2VsbERhdGFGb3JtdWxhKTsKCQkJCQkJCQkJJGtleSA9IGZhbHNlOwoJCQkJCQkJCQlmb3JlYWNoKCR0ZW1wIGFzICYkdmFsdWUpIHsKCQkJCQkJCQkJCS8vCU9ubHkgY291bnQvcmVwbGFjZSBpbiBhbHRlcm5hdGUgYXJyYXkgZW50cmllcwoJCQkJCQkJCQkJaWYgKCRrZXkgPSAhJGtleSkgewoJCQkJCQkJCQkJCXByZWdfbWF0Y2hfYWxsKCcvKFIoXFs/LT9cZCpcXT8pKShDKFxbPy0/XGQqXF0/KSkvJywkdmFsdWUsICRjZWxsUmVmZXJlbmNlcyxQUkVHX1NFVF9PUkRFUitQUkVHX09GRlNFVF9DQVBUVVJFKTsKCQkJCQkJCQkJCQkvLwlSZXZlcnNlIHRoZSBtYXRjaGVzIGFycmF5LCBvdGhlcndpc2UgYWxsIG91ciBvZmZzZXRzIHdpbGwgYmVjb21lIGluY29ycmVjdCBpZiB3ZSBtb2RpZnkgb3VyIHdheQoJCQkJCQkJCQkJCS8vCQl0aHJvdWdoIHRoZSBmb3JtdWxhIGZyb20gbGVmdCB0byByaWdodC4gUmV2ZXJzaW5nIG1lYW5zIHRoYXQgd2Ugd29yayByaWdodCB0byBsZWZ0LnRocm91Z2gKCQkJCQkJCQkJCQkvLwkJdGhlIGZvcm11bGEKCQkJCQkJCQkJCQkkY2VsbFJlZmVyZW5jZXMgPSBhcnJheV9yZXZlcnNlKCRjZWxsUmVmZXJlbmNlcyk7CgkJCQkJCQkJCQkJLy8JTG9vcCB0aHJvdWdoIGVhY2ggUjFDMSBzdHlsZSByZWZlcmVuY2UgaW4gdHVybiwgY29udmVydGluZyBpdCB0byBpdHMgQTEgc3R5bGUgZXF1aXZhbGVudCwKCQkJCQkJCQkJCQkvLwkJdGhlbiBtb2RpZnkgdGhlIGZvcm11bGEgdG8gdXNlIHRoYXQgbmV3IHJlZmVyZW5jZQoJCQkJCQkJCQkJCWZvcmVhY2goJGNlbGxSZWZlcmVuY2VzIGFzICRjZWxsUmVmZXJlbmNlKSB7CgkJCQkJCQkJCQkJCSRyb3dSZWZlcmVuY2UgPSAkY2VsbFJlZmVyZW5jZVsyXVswXTsKCQkJCQkJCQkJCQkJLy8JRW1wdHkgUiByZWZlcmVuY2UgaXMgdGhlIGN1cnJlbnQgcm93CgkJCQkJCQkJCQkJCWlmICgkcm93UmVmZXJlbmNlID09ICcnKSAkcm93UmVmZXJlbmNlID0gJHJvdzsKCQkJCQkJCQkJCQkJLy8JQnJhY2tldGVkIFIgcmVmZXJlbmNlcyBhcmUgcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgcm93CgkJCQkJCQkJCQkJCWlmICgkcm93UmVmZXJlbmNlezB9ID09ICdbJykgJHJvd1JlZmVyZW5jZSA9ICRyb3cgKyB0cmltKCRyb3dSZWZlcmVuY2UsJ1tdJyk7CgkJCQkJCQkJCQkJCSRjb2x1bW5SZWZlcmVuY2UgPSAkY2VsbFJlZmVyZW5jZVs0XVswXTsKCQkJCQkJCQkJCQkJLy8JRW1wdHkgQyByZWZlcmVuY2UgaXMgdGhlIGN1cnJlbnQgY29sdW1uCgkJCQkJCQkJCQkJCWlmICgkY29sdW1uUmVmZXJlbmNlID09ICcnKSAkY29sdW1uUmVmZXJlbmNlID0gJGNvbHVtbjsKCQkJCQkJCQkJCQkJLy8JQnJhY2tldGVkIEMgcmVmZXJlbmNlcyBhcmUgcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgY29sdW1uCgkJCQkJCQkJCQkJCWlmICgkY29sdW1uUmVmZXJlbmNlezB9ID09ICdbJykgJGNvbHVtblJlZmVyZW5jZSA9ICRjb2x1bW4gKyB0cmltKCRjb2x1bW5SZWZlcmVuY2UsJ1tdJyk7CgkJCQkJCQkJCQkJCSRBMUNlbGxSZWZlcmVuY2UgPSBQSFBFeGNlbF9DZWxsOjpzdHJpbmdGcm9tQ29sdW1uSW5kZXgoJGNvbHVtblJlZmVyZW5jZS0xKS4kcm93UmVmZXJlbmNlOwoKCQkJCQkJCQkJCQkJJHZhbHVlID0gc3Vic3RyX3JlcGxhY2UoJHZhbHVlLCRBMUNlbGxSZWZlcmVuY2UsJGNlbGxSZWZlcmVuY2VbMF1bMV0sc3RybGVuKCRjZWxsUmVmZXJlbmNlWzBdWzBdKSk7CgkJCQkJCQkJCQkJfQoJCQkJCQkJCQkJfQoJCQkJCQkJCQl9CgkJCQkJCQkJCXVuc2V0KCR2YWx1ZSk7CgkJCQkJCQkJCS8vCVRoZW4gcmVidWlsZCB0aGUgZm9ybXVsYSBzdHJpbmcKCQkJCQkJCQkJJGNlbGxEYXRhRm9ybXVsYSA9IGltcGxvZGUoJyInLCR0ZW1wKTsKCQkJCQkJCQkJJGhhc0NhbGN1bGF0ZWRWYWx1ZSA9IHRydWU7CgkJCQkJCQkJCWJyZWFrOwoJCQkJCX0KCQkJCX0KCQkJCSRjb2x1bW5MZXR0ZXIgPSBQSFBFeGNlbF9DZWxsOjpzdHJpbmdGcm9tQ29sdW1uSW5kZXgoJGNvbHVtbi0xKTsKCQkJCSRjZWxsRGF0YSA9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uOjpfdW53cmFwUmVzdWx0KCRjZWxsRGF0YSk7CgoJCQkJLy8gU2V0IGNlbGwgdmFsdWUKCQkJCSRvYmpQSFBFeGNlbC0+Z2V0QWN0aXZlU2hlZXQoKS0+Z2V0Q2VsbCgkY29sdW1uTGV0dGVyLiRyb3cpLT5zZXRWYWx1ZSgoJGhhc0NhbGN1bGF0ZWRWYWx1ZSkgPyAkY2VsbERhdGFGb3JtdWxhIDogJGNlbGxEYXRhKTsKCQkJCWlmICgkaGFzQ2FsY3VsYXRlZFZhbHVlKSB7CgkJCQkJJGNlbGxEYXRhID0gUEhQRXhjZWxfQ2FsY3VsYXRpb246Ol91bndyYXBSZXN1bHQoJGNlbGxEYXRhKTsKCQkJCQkkb2JqUEhQRXhjZWwtPmdldEFjdGl2ZVNoZWV0KCktPmdldENlbGwoJGNvbHVtbkxldHRlci4kcm93KS0+c2V0Q2FsY3VsYXRlZFZhbHVlKCRjZWxsRGF0YSk7CgkJCQl9CgkJCS8vCVJlYWQgY2VsbCBmb3JtYXR0aW5nCgkJCX0gZWxzZWlmICgkZGF0YVR5cGUgPT0gJ0YnKSB7CgkJCQkkZm9ybWF0U3R5bGUgPSAkY29sdW1uV2lkdGggPSAkc3R5bGVTZXR0aW5ncyA9ICcnOwoJCQkJJHN0eWxlRGF0YSA9IGFycmF5KCk7CgkJCQlmb3JlYWNoKCRyb3dEYXRhIGFzICRyb3dEYXR1bSkgewoJCQkJCXN3aXRjaCgkcm93RGF0dW17MH0pIHsKCQkJCQkJY2FzZSAnQycgOgoJCQkJCQljYXNlICdYJyA6CSRjb2x1bW4gPSBzdWJzdHIoJHJvd0RhdHVtLDEpOwoJCQkJCQkJCQlicmVhazsKCQkJCQkJY2FzZSAnUicgOgoJCQkJCQljYXNlICdZJyA6CSRyb3cgPSBzdWJzdHIoJHJvd0RhdHVtLDEpOwoJCQkJCQkJCQlicmVhazsKCQkJCQkJY2FzZSAnUCcgOgkkZm9ybWF0U3R5bGUgPSAkcm93RGF0dW07CgkJCQkJCQkJCWJyZWFrOwoJCQkJCQljYXNlICdXJyA6CWxpc3QoJHN0YXJ0Q29sLCRlbmRDb2wsJGNvbHVtbldpZHRoKSA9IGV4cGxvZGUoJyAnLHN1YnN0cigkcm93RGF0dW0sMSkpOwoJCQkJCQkJCQlicmVhazsKCQkJCQkJY2FzZSAnUycgOgkkc3R5bGVTZXR0aW5ncyA9IHN1YnN0cigkcm93RGF0dW0sMSk7CgkJCQkJCQkJCWZvciAoJGk9MDskaTxzdHJsZW4oJHN0eWxlU2V0dGluZ3MpOysrJGkpIHsKCQkJCQkJCQkJCXN3aXRjaCAoJHN0eWxlU2V0dGluZ3N7JGl9KSB7CgkJCQkJCQkJCQkJY2FzZSAnSScgOgkkc3R5bGVEYXRhWydmb250J11bJ2l0YWxpYyddID0gdHJ1ZTsKCQkJCQkJCQkJCQkJCQlicmVhazsKCQkJCQkJCQkJCQljYXNlICdEJyA6CSRzdHlsZURhdGFbJ2ZvbnQnXVsnYm9sZCddID0gdHJ1ZTsKCQkJCQkJCQkJCQkJCQlicmVhazsKCQkJCQkJCQkJCQljYXNlICdUJyA6CSRzdHlsZURhdGFbJ2JvcmRlcnMnXVsndG9wJ11bJ3N0eWxlJ10gPSBQSFBFeGNlbF9TdHlsZV9Cb3JkZXI6OkJPUkRFUl9USElOOwoJCQkJCQkJCQkJCQkJCWJyZWFrOwoJCQkJCQkJCQkJCWNhc2UgJ0InIDoJJHN0eWxlRGF0YVsnYm9yZGVycyddWydib3R0b20nXVsnc3R5bGUnXSA9IFBIUEV4Y2VsX1N0eWxlX0JvcmRlcjo6Qk9SREVSX1RISU47CgkJCQkJCQkJCQkJCQkJYnJlYWs7CgkJCQkJCQkJCQkJY2FzZSAnTCcgOgkkc3R5bGVEYXRhWydib3JkZXJzJ11bJ2xlZnQnXVsnc3R5bGUnXSA9IFBIUEV4Y2VsX1N0eWxlX0JvcmRlcjo6Qk9SREVSX1RISU47CgkJCQkJCQkJCQkJCQkJYnJlYWs7CgkJCQkJCQkJCQkJY2FzZSAnUicgOgkkc3R5bGVEYXRhWydib3JkZXJzJ11bJ3JpZ2h0J11bJ3N0eWxlJ10gPSBQSFBFeGNlbF9TdHlsZV9Cb3JkZXI6OkJPUkRFUl9USElOOwoJCQkJCQkJCQkJCQkJCWJyZWFrOwoJCQkJCQkJCQkJfQoJCQkJCQkJCQl9CgkJCQkJCQkJCWJyZWFrOwoJCQkJCX0KCQkJCX0KCQkJCWlmICgoJGZvcm1hdFN0eWxlID4gJycpICYmICgkY29sdW1uID4gJycpICYmICgkcm93ID4gJycpKSB7CgkJCQkJJGNvbHVtbkxldHRlciA9IFBIUEV4Y2VsX0NlbGw6OnN0cmluZ0Zyb21Db2x1bW5JbmRleCgkY29sdW1uLTEpOwoJCQkJCSRvYmpQSFBFeGNlbC0+Z2V0QWN0aXZlU2hlZXQoKS0+Z2V0U3R5bGUoJGNvbHVtbkxldHRlci4kcm93KS0+YXBwbHlGcm9tQXJyYXkoJHRoaXMtPl9mb3JtYXRzWyRmb3JtYXRTdHlsZV0pOwoJCQkJfQoJCQkJaWYgKCghZW1wdHkoJHN0eWxlRGF0YSkpICYmICgkY29sdW1uID4gJycpICYmICgkcm93ID4gJycpKSB7CgkJCQkJJGNvbHVtbkxldHRlciA9IFBIUEV4Y2VsX0NlbGw6OnN0cmluZ0Zyb21Db2x1bW5JbmRleCgkY29sdW1uLTEpOwoJCQkJCSRvYmpQSFBFeGNlbC0+Z2V0QWN0aXZlU2hlZXQoKS0+Z2V0U3R5bGUoJGNvbHVtbkxldHRlci4kcm93KS0+YXBwbHlGcm9tQXJyYXkoJHN0eWxlRGF0YSk7CgkJCQl9CgkJCQlpZiAoJGNvbHVtbldpZHRoID4gJycpIHsKCQkJCQlpZiAoJHN0YXJ0Q29sID09ICRlbmRDb2wpIHsKCQkJCQkJJHN0YXJ0Q29sID0gUEhQRXhjZWxfQ2VsbDo6c3RyaW5nRnJvbUNvbHVtbkluZGV4KCRzdGFydENvbC0xKTsKCQkJCQkJJG9ialBIUEV4Y2VsLT5nZXRBY3RpdmVTaGVldCgpLT5nZXRDb2x1bW5EaW1lbnNpb24oJHN0YXJ0Q29sKS0+c2V0V2lkdGgoJGNvbHVtbldpZHRoKTsKCQkJCQl9IGVsc2UgewoJCQkJCQkkc3RhcnRDb2wgPSBQSFBFeGNlbF9DZWxsOjpzdHJpbmdGcm9tQ29sdW1uSW5kZXgoJHN0YXJ0Q29sLTEpOwoJCQkJCQkkZW5kQ29sID0gUEhQRXhjZWxfQ2VsbDo6c3RyaW5nRnJvbUNvbHVtbkluZGV4KCRlbmRDb2wtMSk7CgkJCQkJCSRvYmpQSFBFeGNlbC0+Z2V0QWN0aXZlU2hlZXQoKS0+Z2V0Q29sdW1uRGltZW5zaW9uKCRzdGFydENvbCktPnNldFdpZHRoKCRjb2x1bW5XaWR0aCk7CgkJCQkJCWRvIHsKCQkJCQkJCSRvYmpQSFBFeGNlbC0+Z2V0QWN0aXZlU2hlZXQoKS0+Z2V0Q29sdW1uRGltZW5zaW9uKCsrJHN0YXJ0Q29sKS0+c2V0V2lkdGgoJGNvbHVtbldpZHRoKTsKCQkJCQkJfSB3aGlsZSAoJHN0YXJ0Q29sICE9ICRlbmRDb2wpOwoJCQkJCX0KCQkJCX0KCQkJfSBlbHNlIHsKCQkJCWZvcmVhY2goJHJvd0RhdGEgYXMgJHJvd0RhdHVtKSB7CgkJCQkJc3dpdGNoKCRyb3dEYXR1bXswfSkgewoJCQkJCQljYXNlICdDJyA6CgkJCQkJCWNhc2UgJ1gnIDoJJGNvbHVtbiA9IHN1YnN0cigkcm93RGF0dW0sMSk7CgkJCQkJCQkJCWJyZWFrOwoJCQkJCQljYXNlICdSJyA6CgkJCQkJCWNhc2UgJ1knIDoJJHJvdyA9IHN1YnN0cigkcm93RGF0dW0sMSk7CgkJCQkJCQkJCWJyZWFrOwoJCQkJCX0KCQkJCX0KCQkJfQoJCX0KCgkJLy8gQ2xvc2UgZmlsZQoJCWZjbG9zZSgkZmlsZUhhbmRsZSk7CgoJCS8vIFJldHVybgoJCXJldHVybiAkb2JqUEhQRXhjZWw7Cgl9CgoKCS8qKgoJICogR2V0IHNoZWV0IGluZGV4CgkgKgoJICogQHJldHVybiBpbnQKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldFNoZWV0SW5kZXgoKSB7CgkJcmV0dXJuICR0aGlzLT5fc2hlZXRJbmRleDsKCX0KCgoJLyoqCgkgKiBTZXQgc2hlZXQgaW5kZXgKCSAqCgkgKiBAcGFyYW0JaW50CQkkcFZhbHVlCQlTaGVldCBpbmRleAoJICogQHJldHVybiBQSFBFeGNlbF9SZWFkZXJfU1lMSwoJICovCglwdWJsaWMgZnVuY3Rpb24gc2V0U2hlZXRJbmRleCgkcFZhbHVlID0gMCkgewoJCSR0aGlzLT5fc2hlZXRJbmRleCA9ICRwVmFsdWU7CgkJcmV0dXJuICR0aGlzOwoJfQoKfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/ReferenceHelper.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIFBIUEV4Y2VsCiAqCiAqIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICoKICogQGNhdGVnb3J5ICAgUEhQRXhjZWwKICogQHBhY2thZ2UJUEhQRXhjZWwKICogQGNvcHlyaWdodCAgQ29weXJpZ2h0IChjKSAyMDA2IC0gMjAxMiBQSFBFeGNlbCAoaHR0cDovL3d3dy5jb2RlcGxleC5jb20vUEhQRXhjZWwpCiAqIEBsaWNlbnNlCWh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9vbGQtbGljZW5zZXMvbGdwbC0yLjEudHh0CUxHUEwKICogQHZlcnNpb24JMS43LjcsIDIwMTItMDUtMTkKICovCgoKLyoqCiAqIFBIUEV4Y2VsX1JlZmVyZW5jZUhlbHBlciAoU2luZ2xldG9uKQogKgogKiBAY2F0ZWdvcnkgICBQSFBFeGNlbAogKiBAcGFja2FnZQlQSFBFeGNlbAogKiBAY29weXJpZ2h0ICBDb3B5cmlnaHQgKGMpIDIwMDYgLSAyMDEyIFBIUEV4Y2VsIChodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9QSFBFeGNlbCkKICovCmNsYXNzIFBIUEV4Y2VsX1JlZmVyZW5jZUhlbHBlcgp7CgkvKioJQ29uc3RhbnRzCQkJCSovCgkvKioJUmVndWxhciBFeHByZXNzaW9ucwkJKi8KCWNvbnN0IFJFRkhFTFBFUl9SRUdFWFBfQ0VMTFJFRgkJPSAnKChcdyp8XCdbXiFdKlwnKSEpPyg/PCFbOmEtelwkXSkoXCQ/W2Etel17MSwzfVwkP1xkKykoPz1bXjohXGRcJ10pJzsKCWNvbnN0IFJFRkhFTFBFUl9SRUdFWFBfQ0VMTFJBTkdFCT0gJygoXHcqfFwnW14hXSpcJykhKT8oXCQ/W2Etel17MSwzfVwkP1xkKyk6KFwkP1thLXpdezEsM31cJD9cZCspJzsKCWNvbnN0IFJFRkhFTFBFUl9SRUdFWFBfUk9XUkFOR0UJCT0gJygoXHcqfFwnW14hXSpcJykhKT8oXCQ/XGQrKTooXCQ/XGQrKSc7Cgljb25zdCBSRUZIRUxQRVJfUkVHRVhQX0NPTFJBTkdFCQk9ICcoKFx3KnxcJ1teIV0qXCcpISk/KFwkP1thLXpdezEsM30pOihcJD9bYS16XXsxLDN9KSc7CgoJLyoqCgkgKiBJbnN0YW5jZSBvZiB0aGlzIGNsYXNzCgkgKgoJICogQHZhciBQSFBFeGNlbF9SZWZlcmVuY2VIZWxwZXIKCSAqLwoJcHJpdmF0ZSBzdGF0aWMgJF9pbnN0YW5jZTsKCgkvKioKCSAqIEdldCBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzCgkgKgoJICogQHJldHVybiBQSFBFeGNlbF9SZWZlcmVuY2VIZWxwZXIKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRJbnN0YW5jZSgpIHsKCQlpZiAoIWlzc2V0KHNlbGY6OiRfaW5zdGFuY2UpIHx8IChzZWxmOjokX2luc3RhbmNlID09PSBOVUxMKSkgewoJCQlzZWxmOjokX2luc3RhbmNlID0gbmV3IFBIUEV4Y2VsX1JlZmVyZW5jZUhlbHBlcigpOwoJCX0KCgkJcmV0dXJuIHNlbGY6OiRfaW5zdGFuY2U7Cgl9CgoJLyoqCgkgKiBDcmVhdGUgYSBuZXcgUEhQRXhjZWxfUmVmZXJlbmNlSGVscGVyCgkgKi8KCXByb3RlY3RlZCBmdW5jdGlvbiBfX2NvbnN0cnVjdCgpIHsKCX0KCgkvKioKCSAqIEluc2VydCBhIG5ldyBjb2x1bW4sIHVwZGF0aW5nIGFsbCBwb3NzaWJsZSByZWxhdGVkIGRhdGEKCSAqCgkgKiBAcGFyYW0JaW50CSRwQmVmb3JlCUluc2VydCBiZWZvcmUgdGhpcyBvbmUKCSAqIEBwYXJhbQlpbnQJJHBOdW1Db2xzCU51bWJlciBvZiBjb2x1bW5zIHRvIGluc2VydAoJICogQHBhcmFtCWludAkkcE51bVJvd3MJTnVtYmVyIG9mIHJvd3MgdG8gaW5zZXJ0CgkgKiBAdGhyb3dzCUV4Y2VwdGlvbgoJICovCglwdWJsaWMgZnVuY3Rpb24gaW5zZXJ0TmV3QmVmb3JlKCRwQmVmb3JlID0gJ0ExJywgJHBOdW1Db2xzID0gMCwgJHBOdW1Sb3dzID0gMCwgUEhQRXhjZWxfV29ya3NoZWV0ICRwU2hlZXQgPSBudWxsKSB7CgkJJGFDZWxsQ29sbGVjdGlvbiA9ICRwU2hlZXQtPmdldENlbGxDb2xsZWN0aW9uKCk7CgoJCS8vIEdldCBjb29yZGluYXRlcyBvZiAkcEJlZm9yZQoJCSRiZWZvcmVDb2x1bW4JPSAnQSc7CgkJJGJlZm9yZVJvdwkJPSAxOwoJCWxpc3QoJGJlZm9yZUNvbHVtbiwgJGJlZm9yZVJvdykgPSBQSFBFeGNlbF9DZWxsOjpjb29yZGluYXRlRnJvbVN0cmluZyggJHBCZWZvcmUgKTsKCgoJCS8vIENsZWFyIGNlbGxzIGlmIHdlIGFyZSByZW1vdmluZyBjb2x1bW5zIG9yIHJvd3MKCQkkaGlnaGVzdENvbHVtbgk9ICRwU2hlZXQtPmdldEhpZ2hlc3RDb2x1bW4oKTsKCQkkaGlnaGVzdFJvdwk9ICRwU2hlZXQtPmdldEhpZ2hlc3RSb3coKTsKCgkJLy8gMS4gQ2xlYXIgY29sdW1uIHN0cmlwcyBpZiB3ZSBhcmUgcmVtb3ZpbmcgY29sdW1ucwoJCWlmICgkcE51bUNvbHMgPCAwICYmIFBIUEV4Y2VsX0NlbGw6OmNvbHVtbkluZGV4RnJvbVN0cmluZygkYmVmb3JlQ29sdW1uKSAtIDIgKyAkcE51bUNvbHMgPiAwKSB7CgkJCWZvciAoJGkgPSAxOyAkaSA8PSAkaGlnaGVzdFJvdyAtIDE7ICsrJGkpIHsKCQkJCWZvciAoJGogPSBQSFBFeGNlbF9DZWxsOjpjb2x1bW5JbmRleEZyb21TdHJpbmcoJGJlZm9yZUNvbHVtbikgLSAxICsgJHBOdW1Db2xzOyAkaiA8PSBQSFBFeGNlbF9DZWxsOjpjb2x1bW5JbmRleEZyb21TdHJpbmcoJGJlZm9yZUNvbHVtbikgLSAyOyArKyRqKSB7CgkJCQkJJGNvb3JkaW5hdGUgPSBQSFBFeGNlbF9DZWxsOjpzdHJpbmdGcm9tQ29sdW1uSW5kZXgoJGopIC4gJGk7CgkJCQkJJHBTaGVldC0+cmVtb3ZlQ29uZGl0aW9uYWxTdHlsZXMoJGNvb3JkaW5hdGUpOwoJCQkJCWlmICgkcFNoZWV0LT5jZWxsRXhpc3RzKCRjb29yZGluYXRlKSkgewoJCQkJCQkkcFNoZWV0LT5nZXRDZWxsKCRjb29yZGluYXRlKS0+c2V0VmFsdWVFeHBsaWNpdCgnJywgUEhQRXhjZWxfQ2VsbF9EYXRhVHlwZTo6VFlQRV9OVUxMKTsKCQkJCQkJJHBTaGVldC0+Z2V0Q2VsbCgkY29vcmRpbmF0ZSktPnNldFhmSW5kZXgoMCk7CgkJCQkJfQoJCQkJfQoJCQl9CgkJfQoKCQkvLyAyLiBDbGVhciByb3cgc3RyaXBzIGlmIHdlIGFyZSByZW1vdmluZyByb3dzCgkJaWYgKCRwTnVtUm93cyA8IDAgJiYgJGJlZm9yZVJvdyAtIDEgKyAkcE51bVJvd3MgPiAwKSB7CgkJCWZvciAoJGkgPSBQSFBFeGNlbF9DZWxsOjpjb2x1bW5JbmRleEZyb21TdHJpbmcoJGJlZm9yZUNvbHVtbikgLSAxOyAkaSA8PSBQSFBFeGNlbF9DZWxsOjpjb2x1bW5JbmRleEZyb21TdHJpbmcoJGhpZ2hlc3RDb2x1bW4pIC0gMTsgKyskaSkgewoJCQkJZm9yICgkaiA9ICRiZWZvcmVSb3cgKyAkcE51bVJvd3M7ICRqIDw9ICRiZWZvcmVSb3cgLSAxOyArKyRqKSB7CgkJCQkJJGNvb3JkaW5hdGUgPSBQSFBFeGNlbF9DZWxsOjpzdHJpbmdGcm9tQ29sdW1uSW5kZXgoJGkpIC4gJGo7CgkJCQkJJHBTaGVldC0+cmVtb3ZlQ29uZGl0aW9uYWxTdHlsZXMoJGNvb3JkaW5hdGUpOwoJCQkJCWlmICgkcFNoZWV0LT5jZWxsRXhpc3RzKCRjb29yZGluYXRlKSkgewoJCQkJCQkkcFNoZWV0LT5nZXRDZWxsKCRjb29yZGluYXRlKS0+c2V0VmFsdWVFeHBsaWNpdCgnJywgUEhQRXhjZWxfQ2VsbF9EYXRhVHlwZTo6VFlQRV9OVUxMKTsKCQkJCQkJJHBTaGVldC0+Z2V0Q2VsbCgkY29vcmRpbmF0ZSktPnNldFhmSW5kZXgoMCk7CgkJCQkJfQoJCQkJfQoJCQl9CgkJfQoKCgkJLy8gTG9vcCB0aHJvdWdoIGNlbGxzLCBib3R0b20tdXAsIGFuZCBjaGFuZ2UgY2VsbCBjb29yZGluYXRlcwoJCXdoaWxlICgoJGNlbGxJRCA9ICgkcE51bUNvbHMgPCAwIHx8ICRwTnVtUm93cyA8IDApID8gYXJyYXlfc2hpZnQoJGFDZWxsQ29sbGVjdGlvbikgOiBhcnJheV9wb3AoJGFDZWxsQ29sbGVjdGlvbikpKSB7CgkJCSRjZWxsID0gJHBTaGVldC0+Z2V0Q2VsbCgkY2VsbElEKTsKCgkJCS8vIE5ldyBjb29yZGluYXRlcwoJCQkkbmV3Q29vcmRpbmF0ZXMgPSBQSFBFeGNlbF9DZWxsOjpzdHJpbmdGcm9tQ29sdW1uSW5kZXgoIFBIUEV4Y2VsX0NlbGw6OmNvbHVtbkluZGV4RnJvbVN0cmluZygkY2VsbC0+Z2V0Q29sdW1uKCkpIC0gMSArICRwTnVtQ29scyApIC4gKCRjZWxsLT5nZXRSb3coKSArICRwTnVtUm93cyk7CgoJCQkvLyBTaG91bGQgdGhlIGNlbGwgYmUgdXBkYXRlZD8gTW92ZSB2YWx1ZSBhbmQgY2VsbFhmIGluZGV4IGZyb20gb25lIGNlbGwgdG8gYW5vdGhlci4KCQkJaWYgKChQSFBFeGNlbF9DZWxsOjpjb2x1bW5JbmRleEZyb21TdHJpbmcoICRjZWxsLT5nZXRDb2x1bW4oKSApID49IFBIUEV4Y2VsX0NlbGw6OmNvbHVtbkluZGV4RnJvbVN0cmluZygkYmVmb3JlQ29sdW1uKSkgJiYKCQkJCSgkY2VsbC0+Z2V0Um93KCkgPj0gJGJlZm9yZVJvdykpIHsKCgkJCQkvLyBVcGRhdGUgY2VsbCBzdHlsZXMKCQkJCSRwU2hlZXQtPmdldENlbGwoJG5ld0Nvb3JkaW5hdGVzKS0+c2V0WGZJbmRleCgkY2VsbC0+Z2V0WGZJbmRleCgpKTsKCQkJCSRjZWxsLT5zZXRYZkluZGV4KDApOwoKCQkJCS8vIEluc2VydCB0aGlzIGNlbGwgYXQgaXRzIG5ldyBsb2NhdGlvbgoJCQkJaWYgKCRjZWxsLT5nZXREYXRhVHlwZSgpID09IFBIUEV4Y2VsX0NlbGxfRGF0YVR5cGU6OlRZUEVfRk9STVVMQSkgewoJCQkJCS8vIEZvcm11bGEgc2hvdWxkIGJlIGFkanVzdGVkCgkJCQkJJHBTaGVldC0+Z2V0Q2VsbCgkbmV3Q29vcmRpbmF0ZXMpCgkJCQkJCSAgIC0+c2V0VmFsdWUoJHRoaXMtPnVwZGF0ZUZvcm11bGFSZWZlcmVuY2VzKCRjZWxsLT5nZXRWYWx1ZSgpLAoJCQkJCQkgICAJCQkJCSRwQmVmb3JlLCAkcE51bUNvbHMsICRwTnVtUm93cywgJHBTaGVldC0+Z2V0VGl0bGUoKSkpOwoJCQkJfSBlbHNlIHsKCQkJCQkvLyBGb3JtdWxhIHNob3VsZCBub3QgYmUgYWRqdXN0ZWQKCQkJCQkkcFNoZWV0LT5nZXRDZWxsKCRuZXdDb29yZGluYXRlcyktPnNldFZhbHVlKCRjZWxsLT5nZXRWYWx1ZSgpKTsKCQkJCX0KCgkJCQkvLyBDbGVhciB0aGUgb3JpZ2luYWwgY2VsbAoJCQkJJHBTaGVldC0+Z2V0Q2VsbCgkY2VsbC0+Z2V0Q29vcmRpbmF0ZSgpKS0+c2V0VmFsdWUoJycpOwoKCQkJfSBlbHNlIHsKCQkJCS8qCVdlIGRvbid0IG5lZWQgdG8gdXBkYXRlIHN0eWxlcyBmb3Igcm93cy9jb2x1bW5zIGJlZm9yZSBvdXIgaW5zZXJ0aW9uIHBvc2l0aW9uLAoJCQkJCQlidXQgd2UgZG8gc3RpbGwgbmVlZCB0byBhZGp1c3QgYW55IGZvcm11bGFlCWluIHRob3NlIGNlbGxzCQkJCQkqLwoJCQkJaWYgKCRjZWxsLT5nZXREYXRhVHlwZSgpID09IFBIUEV4Y2VsX0NlbGxfRGF0YVR5cGU6OlRZUEVfRk9STVVMQSkgewoJCQkJCS8vIEZvcm11bGEgc2hvdWxkIGJlIGFkanVzdGVkCgkJCQkJJGNlbGwtPnNldFZhbHVlKCR0aGlzLT51cGRhdGVGb3JtdWxhUmVmZXJlbmNlcygkY2VsbC0+Z2V0VmFsdWUoKSwKCQkJCQkJCQkJCSRwQmVmb3JlLCAkcE51bUNvbHMsICRwTnVtUm93cywgJHBTaGVldC0+Z2V0VGl0bGUoKSkpOwoJCQkJfQoKCQkJfQoJCX0KCgoJCS8vIER1cGxpY2F0ZSBzdHlsZXMgZm9yIHRoZSBuZXdseSBpbnNlcnRlZCBjZWxscwoJCSRoaWdoZXN0Q29sdW1uCT0gJHBTaGVldC0+Z2V0SGlnaGVzdENvbHVtbigpOwoJCSRoaWdoZXN0Um93CT0gJHBTaGVldC0+Z2V0SGlnaGVzdFJvdygpOwoKCQlpZiAoJHBOdW1Db2xzID4gMCAmJiBQSFBFeGNlbF9DZWxsOjpjb2x1bW5JbmRleEZyb21TdHJpbmcoJGJlZm9yZUNvbHVtbikgLSAyID4gMCkgewoJCQlmb3IgKCRpID0gJGJlZm9yZVJvdzsgJGkgPD0gJGhpZ2hlc3RSb3cgLSAxOyArKyRpKSB7CgoJCQkJLy8gU3R5bGUKCQkJCSRjb29yZGluYXRlID0gUEhQRXhjZWxfQ2VsbDo6c3RyaW5nRnJvbUNvbHVtbkluZGV4KCBQSFBFeGNlbF9DZWxsOjpjb2x1bW5JbmRleEZyb21TdHJpbmcoJGJlZm9yZUNvbHVtbikgLSAyICkgLiAkaTsKCQkJCWlmICgkcFNoZWV0LT5jZWxsRXhpc3RzKCRjb29yZGluYXRlKSkgewoJCQkJCSR4ZkluZGV4ID0gJHBTaGVldC0+Z2V0Q2VsbCgkY29vcmRpbmF0ZSktPmdldFhmSW5kZXgoKTsKCQkJCQkkY29uZGl0aW9uYWxTdHlsZXMgPSAkcFNoZWV0LT5jb25kaXRpb25hbFN0eWxlc0V4aXN0cygkY29vcmRpbmF0ZSkgPwoJCQkJCQkkcFNoZWV0LT5nZXRDb25kaXRpb25hbFN0eWxlcygkY29vcmRpbmF0ZSkgOiBmYWxzZTsKCQkJCQlmb3IgKCRqID0gUEhQRXhjZWxfQ2VsbDo6Y29sdW1uSW5kZXhGcm9tU3RyaW5nKCRiZWZvcmVDb2x1bW4pIC0gMTsgJGogPD0gUEhQRXhjZWxfQ2VsbDo6Y29sdW1uSW5kZXhGcm9tU3RyaW5nKCRiZWZvcmVDb2x1bW4pIC0gMiArICRwTnVtQ29sczsgKyskaikgewoJCQkJCQkkcFNoZWV0LT5nZXRDZWxsQnlDb2x1bW5BbmRSb3coJGosICRpKS0+c2V0WGZJbmRleCgkeGZJbmRleCk7CgkJCQkJCWlmICgkY29uZGl0aW9uYWxTdHlsZXMpIHsKCQkJCQkJCSRjbG9uZWQgPSBhcnJheSgpOwoJCQkJCQkJZm9yZWFjaCAoJGNvbmRpdGlvbmFsU3R5bGVzIGFzICRjb25kaXRpb25hbFN0eWxlKSB7CgkJCQkJCQkJJGNsb25lZFtdID0gY2xvbmUgJGNvbmRpdGlvbmFsU3R5bGU7CgkJCQkJCQl9CgkJCQkJCQkkcFNoZWV0LT5zZXRDb25kaXRpb25hbFN0eWxlcyhQSFBFeGNlbF9DZWxsOjpzdHJpbmdGcm9tQ29sdW1uSW5kZXgoJGopIC4gJGksICRjbG9uZWQpOwoJCQkJCQl9CgkJCQkJfQoJCQkJfQoKCQkJfQoJCX0KCgkJaWYgKCRwTnVtUm93cyA+IDAgJiYgJGJlZm9yZVJvdyAtIDEgPiAwKSB7CgkJCWZvciAoJGkgPSBQSFBFeGNlbF9DZWxsOjpjb2x1bW5JbmRleEZyb21TdHJpbmcoJGJlZm9yZUNvbHVtbikgLSAxOyAkaSA8PSBQSFBFeGNlbF9DZWxsOjpjb2x1bW5JbmRleEZyb21TdHJpbmcoJGhpZ2hlc3RDb2x1bW4pIC0gMTsgKyskaSkgewoKCQkJCS8vIFN0eWxlCgkJCQkkY29vcmRpbmF0ZSA9IFBIUEV4Y2VsX0NlbGw6OnN0cmluZ0Zyb21Db2x1bW5JbmRleCgkaSkgLiAoJGJlZm9yZVJvdyAtIDEpOwoJCQkJaWYgKCRwU2hlZXQtPmNlbGxFeGlzdHMoJGNvb3JkaW5hdGUpKSB7CgkJCQkJJHhmSW5kZXggPSAkcFNoZWV0LT5nZXRDZWxsKCRjb29yZGluYXRlKS0+Z2V0WGZJbmRleCgpOwoJCQkJCSRjb25kaXRpb25hbFN0eWxlcyA9ICRwU2hlZXQtPmNvbmRpdGlvbmFsU3R5bGVzRXhpc3RzKCRjb29yZGluYXRlKSA/CgkJCQkJCSRwU2hlZXQtPmdldENvbmRpdGlvbmFsU3R5bGVzKCRjb29yZGluYXRlKSA6IGZhbHNlOwoJCQkJCWZvciAoJGogPSAkYmVmb3JlUm93OyAkaiA8PSAkYmVmb3JlUm93IC0gMSArICRwTnVtUm93czsgKyskaikgewoJCQkJCQkkcFNoZWV0LT5nZXRDZWxsKFBIUEV4Y2VsX0NlbGw6OnN0cmluZ0Zyb21Db2x1bW5JbmRleCgkaSkgLiAkaiktPnNldFhmSW5kZXgoJHhmSW5kZXgpOwoJCQkJCQlpZiAoJGNvbmRpdGlvbmFsU3R5bGVzKSB7CgkJCQkJCQkkY2xvbmVkID0gYXJyYXkoKTsKCQkJCQkJCWZvcmVhY2ggKCRjb25kaXRpb25hbFN0eWxlcyBhcyAkY29uZGl0aW9uYWxTdHlsZSkgewoJCQkJCQkJCSRjbG9uZWRbXSA9IGNsb25lICRjb25kaXRpb25hbFN0eWxlOwoJCQkJCQkJfQoJCQkJCQkJJHBTaGVldC0+c2V0Q29uZGl0aW9uYWxTdHlsZXMoUEhQRXhjZWxfQ2VsbDo6c3RyaW5nRnJvbUNvbHVtbkluZGV4KCRpKSAuICRqLCAkY2xvbmVkKTsKCQkJCQkJfQoJCQkJCX0KCQkJCX0KCQkJfQoJCX0KCgoJCS8vIFVwZGF0ZSB3b3Jrc2hlZXQ6IGNvbHVtbiBkaW1lbnNpb25zCgkJJGFDb2x1bW5EaW1lbnNpb25zID0gYXJyYXlfcmV2ZXJzZSgkcFNoZWV0LT5nZXRDb2x1bW5EaW1lbnNpb25zKCksIHRydWUpOwoJCWlmICghZW1wdHkoJGFDb2x1bW5EaW1lbnNpb25zKSkgewoJCQlmb3JlYWNoICgkYUNvbHVtbkRpbWVuc2lvbnMgYXMgJG9iakNvbHVtbkRpbWVuc2lvbikgewoJCQkJJG5ld1JlZmVyZW5jZSA9ICR0aGlzLT51cGRhdGVDZWxsUmVmZXJlbmNlKCRvYmpDb2x1bW5EaW1lbnNpb24tPmdldENvbHVtbkluZGV4KCkgLiAnMScsICRwQmVmb3JlLCAkcE51bUNvbHMsICRwTnVtUm93cyk7CgkJCQlsaXN0KCRuZXdSZWZlcmVuY2UpID0gUEhQRXhjZWxfQ2VsbDo6Y29vcmRpbmF0ZUZyb21TdHJpbmcoJG5ld1JlZmVyZW5jZSk7CgkJCQlpZiAoJG9iakNvbHVtbkRpbWVuc2lvbi0+Z2V0Q29sdW1uSW5kZXgoKSAhPSAkbmV3UmVmZXJlbmNlKSB7CgkJCQkJJG9iakNvbHVtbkRpbWVuc2lvbi0+c2V0Q29sdW1uSW5kZXgoJG5ld1JlZmVyZW5jZSk7CgkJCQl9CgkJCX0KCQkJJHBTaGVldC0+cmVmcmVzaENvbHVtbkRpbWVuc2lvbnMoKTsKCQl9CgoKCQkvLyBVcGRhdGUgd29ya3NoZWV0OiByb3cgZGltZW5zaW9ucwoJCSRhUm93RGltZW5zaW9ucyA9IGFycmF5X3JldmVyc2UoJHBTaGVldC0+Z2V0Um93RGltZW5zaW9ucygpLCB0cnVlKTsKCQlpZiAoIWVtcHR5KCRhUm93RGltZW5zaW9ucykpIHsKCQkJZm9yZWFjaCAoJGFSb3dEaW1lbnNpb25zIGFzICRvYmpSb3dEaW1lbnNpb24pIHsKCQkJCSRuZXdSZWZlcmVuY2UgPSAkdGhpcy0+dXBkYXRlQ2VsbFJlZmVyZW5jZSgnQScgLiAkb2JqUm93RGltZW5zaW9uLT5nZXRSb3dJbmRleCgpLCAkcEJlZm9yZSwgJHBOdW1Db2xzLCAkcE51bVJvd3MpOwoJCQkJbGlzdCgsICRuZXdSZWZlcmVuY2UpID0gUEhQRXhjZWxfQ2VsbDo6Y29vcmRpbmF0ZUZyb21TdHJpbmcoJG5ld1JlZmVyZW5jZSk7CgkJCQlpZiAoJG9ialJvd0RpbWVuc2lvbi0+Z2V0Um93SW5kZXgoKSAhPSAkbmV3UmVmZXJlbmNlKSB7CgkJCQkJJG9ialJvd0RpbWVuc2lvbi0+c2V0Um93SW5kZXgoJG5ld1JlZmVyZW5jZSk7CgkJCQl9CgkJCX0KCQkJJHBTaGVldC0+cmVmcmVzaFJvd0RpbWVuc2lvbnMoKTsKCgkJCSRjb3B5RGltZW5zaW9uID0gJHBTaGVldC0+Z2V0Um93RGltZW5zaW9uKCRiZWZvcmVSb3cgLSAxKTsKCQkJZm9yICgkaSA9ICRiZWZvcmVSb3c7ICRpIDw9ICRiZWZvcmVSb3cgLSAxICsgJHBOdW1Sb3dzOyArKyRpKSB7CgkJCQkkbmV3RGltZW5zaW9uID0gJHBTaGVldC0+Z2V0Um93RGltZW5zaW9uKCRpKTsKCQkJCSRuZXdEaW1lbnNpb24tPnNldFJvd0hlaWdodCgkY29weURpbWVuc2lvbi0+Z2V0Um93SGVpZ2h0KCkpOwoJCQkJJG5ld0RpbWVuc2lvbi0+c2V0VmlzaWJsZSgkY29weURpbWVuc2lvbi0+Z2V0VmlzaWJsZSgpKTsKCQkJCSRuZXdEaW1lbnNpb24tPnNldE91dGxpbmVMZXZlbCgkY29weURpbWVuc2lvbi0+Z2V0T3V0bGluZUxldmVsKCkpOwoJCQkJJG5ld0RpbWVuc2lvbi0+c2V0Q29sbGFwc2VkKCRjb3B5RGltZW5zaW9uLT5nZXRDb2xsYXBzZWQoKSk7CgkJCX0KCQl9CgoKCQkvLyBVcGRhdGUgd29ya3NoZWV0OiBicmVha3MKCQkkYUJyZWFrcyA9IGFycmF5X3JldmVyc2UoJHBTaGVldC0+Z2V0QnJlYWtzKCksIHRydWUpOwoJCWZvcmVhY2ggKCRhQnJlYWtzIGFzICRrZXkgPT4gJHZhbHVlKSB7CgkJCSRuZXdSZWZlcmVuY2UgPSAkdGhpcy0+dXBkYXRlQ2VsbFJlZmVyZW5jZSgka2V5LCAkcEJlZm9yZSwgJHBOdW1Db2xzLCAkcE51bVJvd3MpOwoJCQlpZiAoJGtleSAhPSAkbmV3UmVmZXJlbmNlKSB7CgkJCQkkcFNoZWV0LT5zZXRCcmVhayggJG5ld1JlZmVyZW5jZSwgJHZhbHVlICk7CgkJCQkkcFNoZWV0LT5zZXRCcmVhayggJGtleSwgUEhQRXhjZWxfV29ya3NoZWV0OjpCUkVBS19OT05FICk7CgkJCX0KCQl9CgoJCS8vIFVwZGF0ZSB3b3Jrc2hlZXQ6IGNvbW1lbnRzCgkJJGFDb21tZW50cyA9ICRwU2hlZXQtPmdldENvbW1lbnRzKCk7CgkJJGFOZXdDb21tZW50cyA9IGFycmF5KCk7IC8vIHRoZSBuZXcgYXJyYXkgb2YgYWxsIGNvbW1lbnRzCgkJZm9yZWFjaCAoJGFDb21tZW50cyBhcyAka2V5ID0+ICYkdmFsdWUpIHsKCQkJJG5ld1JlZmVyZW5jZSA9ICR0aGlzLT51cGRhdGVDZWxsUmVmZXJlbmNlKCRrZXksICRwQmVmb3JlLCAkcE51bUNvbHMsICRwTnVtUm93cyk7CgkJCSRhTmV3Q29tbWVudHNbJG5ld1JlZmVyZW5jZV0gPSAkdmFsdWU7CgkJfQoJCSRwU2hlZXQtPnNldENvbW1lbnRzKCRhTmV3Q29tbWVudHMpOyAvLyByZXBsYWNlIHRoZSBjb21tZW50cyBhcnJheQoKCQkvLyBVcGRhdGUgd29ya3NoZWV0OiBoeXBlcmxpbmtzCgkJJGFIeXBlcmxpbmtDb2xsZWN0aW9uID0gYXJyYXlfcmV2ZXJzZSgkcFNoZWV0LT5nZXRIeXBlcmxpbmtDb2xsZWN0aW9uKCksIHRydWUpOwoJCWZvcmVhY2ggKCRhSHlwZXJsaW5rQ29sbGVjdGlvbiBhcyAka2V5ID0+ICR2YWx1ZSkgewoJCQkkbmV3UmVmZXJlbmNlID0gJHRoaXMtPnVwZGF0ZUNlbGxSZWZlcmVuY2UoJGtleSwgJHBCZWZvcmUsICRwTnVtQ29scywgJHBOdW1Sb3dzKTsKCQkJaWYgKCRrZXkgIT0gJG5ld1JlZmVyZW5jZSkgewoJCQkJJHBTaGVldC0+c2V0SHlwZXJsaW5rKCAkbmV3UmVmZXJlbmNlLCAkdmFsdWUgKTsKCQkJCSRwU2hlZXQtPnNldEh5cGVybGluayggJGtleSwgbnVsbCApOwoJCQl9CgkJfQoKCgkJLy8gVXBkYXRlIHdvcmtzaGVldDogZGF0YSB2YWxpZGF0aW9ucwoJCSRhRGF0YVZhbGlkYXRpb25Db2xsZWN0aW9uID0gYXJyYXlfcmV2ZXJzZSgkcFNoZWV0LT5nZXREYXRhVmFsaWRhdGlvbkNvbGxlY3Rpb24oKSwgdHJ1ZSk7CgkJZm9yZWFjaCAoJGFEYXRhVmFsaWRhdGlvbkNvbGxlY3Rpb24gYXMgJGtleSA9PiAkdmFsdWUpIHsKCQkJJG5ld1JlZmVyZW5jZSA9ICR0aGlzLT51cGRhdGVDZWxsUmVmZXJlbmNlKCRrZXksICRwQmVmb3JlLCAkcE51bUNvbHMsICRwTnVtUm93cyk7CgkJCWlmICgka2V5ICE9ICRuZXdSZWZlcmVuY2UpIHsKCQkJCSRwU2hlZXQtPnNldERhdGFWYWxpZGF0aW9uKCAkbmV3UmVmZXJlbmNlLCAkdmFsdWUgKTsKCQkJCSRwU2hlZXQtPnNldERhdGFWYWxpZGF0aW9uKCAka2V5LCBudWxsICk7CgkJCX0KCQl9CgoKCQkvLyBVcGRhdGUgd29ya3NoZWV0OiBtZXJnZSBjZWxscwoJCSRhTWVyZ2VDZWxscyA9ICRwU2hlZXQtPmdldE1lcmdlQ2VsbHMoKTsKCQkkYU5ld01lcmdlQ2VsbHMgPSBhcnJheSgpOyAvLyB0aGUgbmV3IGFycmF5IG9mIGFsbCBtZXJnZSBjZWxscwoJCWZvcmVhY2ggKCRhTWVyZ2VDZWxscyBhcyAka2V5ID0+ICYkdmFsdWUpIHsKCQkJJG5ld1JlZmVyZW5jZSA9ICR0aGlzLT51cGRhdGVDZWxsUmVmZXJlbmNlKCRrZXksICRwQmVmb3JlLCAkcE51bUNvbHMsICRwTnVtUm93cyk7CgkJCSRhTmV3TWVyZ2VDZWxsc1skbmV3UmVmZXJlbmNlXSA9ICRuZXdSZWZlcmVuY2U7CgkJfQoJCSRwU2hlZXQtPnNldE1lcmdlQ2VsbHMoJGFOZXdNZXJnZUNlbGxzKTsgLy8gcmVwbGFjZSB0aGUgbWVyZ2UgY2VsbHMgYXJyYXkKCgoJCS8vIFVwZGF0ZSB3b3Jrc2hlZXQ6IHByb3RlY3RlZCBjZWxscwoJCSRhUHJvdGVjdGVkQ2VsbHMgPSBhcnJheV9yZXZlcnNlKCRwU2hlZXQtPmdldFByb3RlY3RlZENlbGxzKCksIHRydWUpOwoJCWZvcmVhY2ggKCRhUHJvdGVjdGVkQ2VsbHMgYXMgJGtleSA9PiAkdmFsdWUpIHsKCQkJJG5ld1JlZmVyZW5jZSA9ICR0aGlzLT51cGRhdGVDZWxsUmVmZXJlbmNlKCRrZXksICRwQmVmb3JlLCAkcE51bUNvbHMsICRwTnVtUm93cyk7CgkJCWlmICgka2V5ICE9ICRuZXdSZWZlcmVuY2UpIHsKCQkJCSRwU2hlZXQtPnByb3RlY3RDZWxscyggJG5ld1JlZmVyZW5jZSwgJHZhbHVlLCB0cnVlICk7CgkJCQkkcFNoZWV0LT51bnByb3RlY3RDZWxscyggJGtleSApOwoJCQl9CgkJfQoKCgkJLy8gVXBkYXRlIHdvcmtzaGVldDogYXV0b2ZpbHRlcgoJCWlmICgkcFNoZWV0LT5nZXRBdXRvRmlsdGVyKCkgIT0gJycpIHsKCQkJJHBTaGVldC0+c2V0QXV0b0ZpbHRlciggJHRoaXMtPnVwZGF0ZUNlbGxSZWZlcmVuY2UoJHBTaGVldC0+Z2V0QXV0b0ZpbHRlcigpLCAkcEJlZm9yZSwgJHBOdW1Db2xzLCAkcE51bVJvd3MpICk7CgkJfQoKCgkJLy8gVXBkYXRlIHdvcmtzaGVldDogZnJlZXplIHBhbmUKCQlpZiAoJHBTaGVldC0+Z2V0RnJlZXplUGFuZSgpICE9ICcnKSB7CgkJCSRwU2hlZXQtPmZyZWV6ZVBhbmUoICR0aGlzLT51cGRhdGVDZWxsUmVmZXJlbmNlKCRwU2hlZXQtPmdldEZyZWV6ZVBhbmUoKSwgJHBCZWZvcmUsICRwTnVtQ29scywgJHBOdW1Sb3dzKSApOwoJCX0KCgoJCS8vIFBhZ2Ugc2V0dXAKCQlpZiAoJHBTaGVldC0+Z2V0UGFnZVNldHVwKCktPmlzUHJpbnRBcmVhU2V0KCkpIHsKCQkJJHBTaGVldC0+Z2V0UGFnZVNldHVwKCktPnNldFByaW50QXJlYSggJHRoaXMtPnVwZGF0ZUNlbGxSZWZlcmVuY2UoJHBTaGVldC0+Z2V0UGFnZVNldHVwKCktPmdldFByaW50QXJlYSgpLCAkcEJlZm9yZSwgJHBOdW1Db2xzLCAkcE51bVJvd3MpICk7CgkJfQoKCgkJLy8gVXBkYXRlIHdvcmtzaGVldDogZHJhd2luZ3MKCQkkYURyYXdpbmdzID0gJHBTaGVldC0+Z2V0RHJhd2luZ0NvbGxlY3Rpb24oKTsKCQlmb3JlYWNoICgkYURyYXdpbmdzIGFzICRvYmpEcmF3aW5nKSB7CgkJCSRuZXdSZWZlcmVuY2UgPSAkdGhpcy0+dXBkYXRlQ2VsbFJlZmVyZW5jZSgkb2JqRHJhd2luZy0+Z2V0Q29vcmRpbmF0ZXMoKSwgJHBCZWZvcmUsICRwTnVtQ29scywgJHBOdW1Sb3dzKTsKCQkJaWYgKCRvYmpEcmF3aW5nLT5nZXRDb29yZGluYXRlcygpICE9ICRuZXdSZWZlcmVuY2UpIHsKCQkJCSRvYmpEcmF3aW5nLT5zZXRDb29yZGluYXRlcygkbmV3UmVmZXJlbmNlKTsKCQkJfQoJCX0KCgoJCS8vIFVwZGF0ZSB3b3JrYm9vazogbmFtZWQgcmFuZ2VzCgkJaWYgKGNvdW50KCRwU2hlZXQtPmdldFBhcmVudCgpLT5nZXROYW1lZFJhbmdlcygpKSA+IDApIHsKCQkJZm9yZWFjaCAoJHBTaGVldC0+Z2V0UGFyZW50KCktPmdldE5hbWVkUmFuZ2VzKCkgYXMgJG5hbWVkUmFuZ2UpIHsKCQkJCWlmICgkbmFtZWRSYW5nZS0+Z2V0V29ya3NoZWV0KCktPmdldEhhc2hDb2RlKCkgPT0gJHBTaGVldC0+Z2V0SGFzaENvZGUoKSkgewoJCQkJCSRuYW1lZFJhbmdlLT5zZXRSYW5nZSgKCQkJCQkJJHRoaXMtPnVwZGF0ZUNlbGxSZWZlcmVuY2UoJG5hbWVkUmFuZ2UtPmdldFJhbmdlKCksICRwQmVmb3JlLCAkcE51bUNvbHMsICRwTnVtUm93cykKCQkJCQkpOwoJCQkJfQoJCQl9CgkJfQoKCQkvLyBHYXJiYWdlIGNvbGxlY3QKCQkkcFNoZWV0LT5nYXJiYWdlQ29sbGVjdCgpOwoJfQoKCS8qKgoJICogVXBkYXRlIHJlZmVyZW5jZXMgd2l0aGluIGZvcm11bGFzCgkgKgoJICogQHBhcmFtCXN0cmluZwkkcEZvcm11bGEJRm9ybXVsYSB0byB1cGRhdGUKCSAqIEBwYXJhbQlpbnQJCSRwQmVmb3JlCUluc2VydCBiZWZvcmUgdGhpcyBvbmUKCSAqIEBwYXJhbQlpbnQJCSRwTnVtQ29scwlOdW1iZXIgb2YgY29sdW1ucyB0byBpbnNlcnQKCSAqIEBwYXJhbQlpbnQJCSRwTnVtUm93cwlOdW1iZXIgb2Ygcm93cyB0byBpbnNlcnQKCSAqIEByZXR1cm4Jc3RyaW5nCVVwZGF0ZWQgZm9ybXVsYQoJICogQHRocm93cwlFeGNlcHRpb24KCSAqLwoJcHVibGljIGZ1bmN0aW9uIHVwZGF0ZUZvcm11bGFSZWZlcmVuY2VzKCRwRm9ybXVsYSA9ICcnLCAkcEJlZm9yZSA9ICdBMScsICRwTnVtQ29scyA9IDAsICRwTnVtUm93cyA9IDAsICRzaGVldE5hbWUgPSAnJykgewoJCS8vCVVwZGF0ZSBjZWxsIHJlZmVyZW5jZXMgaW4gdGhlIGZvcm11bGEKCQkkZm9ybXVsYUJsb2NrcyA9IGV4cGxvZGUoJyInLCRwRm9ybXVsYSk7CgkJJGkgPSBmYWxzZTsKCQlmb3JlYWNoKCRmb3JtdWxhQmxvY2tzIGFzICYkZm9ybXVsYUJsb2NrKSB7CgkJCS8vCUlnbm9yZSBibG9ja3MgdGhhdCB3ZXJlIGVuY2xvc2VkIGluIHF1b3RlcyAoYWx0ZXJuYXRpbmcgZW50cmllcyBpbiB0aGUgJGZvcm11bGFCbG9ja3MgYXJyYXkgYWZ0ZXIgdGhlIGV4cGxvZGUpCgkJCWlmICgkaSA9ICEkaSkgewoJCQkJJGFkanVzdENvdW50ID0gMDsKCQkJCSRuZXdDZWxsVG9rZW5zID0gJGNlbGxUb2tlbnMgPSBhcnJheSgpOwoJCQkJLy8JU2VhcmNoIGZvciByb3cgcmFuZ2VzIChlLmcuICdTaGVldDEnITM6NSBvciAzOjUpIHdpdGggb3Igd2l0aG91dCAkIGFic29sdXRlcyAoZS5nLiAkMzo1KQoJCQkJJG1hdGNoQ291bnQgPSBwcmVnX21hdGNoX2FsbCgnLycuc2VsZjo6UkVGSEVMUEVSX1JFR0VYUF9ST1dSQU5HRS4nL2knLCAnICcuJGZvcm11bGFCbG9jay4nICcsICRtYXRjaGVzLCBQUkVHX1NFVF9PUkRFUik7CgkJCQlpZiAoJG1hdGNoQ291bnQgPiAwKSB7CgkJCQkJZm9yZWFjaCgkbWF0Y2hlcyBhcyAkbWF0Y2gpIHsKCQkJCQkJJGZyb21TdHJpbmcgPSAoJG1hdGNoWzJdID4gJycpID8gJG1hdGNoWzJdLichJyA6ICcnOwoJCQkJCQkkZnJvbVN0cmluZyAuPSAkbWF0Y2hbM10uJzonLiRtYXRjaFs0XTsKCQkJCQkJJG1vZGlmaWVkMyA9IHN1YnN0cigkdGhpcy0+dXBkYXRlQ2VsbFJlZmVyZW5jZSgnJEEnLiRtYXRjaFszXSwkcEJlZm9yZSwkcE51bUNvbHMsJHBOdW1Sb3dzKSwyKTsKCQkJCQkJJG1vZGlmaWVkNCA9IHN1YnN0cigkdGhpcy0+dXBkYXRlQ2VsbFJlZmVyZW5jZSgnJEEnLiRtYXRjaFs0XSwkcEJlZm9yZSwkcE51bUNvbHMsJHBOdW1Sb3dzKSwyKTsKCgkJCQkJCWlmICgkbWF0Y2hbM10uJzonLiRtYXRjaFs0XSAhPT0gJG1vZGlmaWVkMy4nOicuJG1vZGlmaWVkNCkgewoJCQkJCQkJaWYgKCgkbWF0Y2hbMl0gPT0gJycpIHx8ICh0cmltKCRtYXRjaFsyXSwiJyIpID09ICRzaGVldE5hbWUpKSB7CgkJCQkJCQkJJHRvU3RyaW5nID0gKCRtYXRjaFsyXSA+ICcnKSA/ICRtYXRjaFsyXS4nIScgOiAnJzsKCQkJCQkJCQkkdG9TdHJpbmcgLj0gJG1vZGlmaWVkMy4nOicuJG1vZGlmaWVkNDsKCQkJCQkJCQkvLwlNYXggd29ya3NoZWV0IHNpemUgaXMgMSwwNDgsNTc2IHJvd3MgYnkgMTYsMzg0IGNvbHVtbnMgaW4gRXhjZWwgMjAwNywgc28gb3VyIGFkanVzdG1lbnRzIG5lZWQgdG8gYmUgYXQgbGVhc3Qgb25lIGRpZ2l0IG1vcmUKCQkJCQkJCQkkY29sdW1uID0gMTAwMDAwOwoJCQkJCQkJCSRyb3cgPSAxMDAwMDAwMCt0cmltKCRtYXRjaFszXSwnJCcpOwoJCQkJCQkJCSRjZWxsSW5kZXggPSAkY29sdW1uLiRyb3c7CgoJCQkJCQkJCSRuZXdDZWxsVG9rZW5zWyRjZWxsSW5kZXhdID0gcHJlZ19xdW90ZSgkdG9TdHJpbmcpOwoJCQkJCQkJCSRjZWxsVG9rZW5zWyRjZWxsSW5kZXhdID0gJy8oPzwhXGQpJy5wcmVnX3F1b3RlKCRmcm9tU3RyaW5nKS4nKD8hXGQpL2knOwoJCQkJCQkJCSsrJGFkanVzdENvdW50OwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJfQoJCQkJfQoJCQkJLy8JU2VhcmNoIGZvciBjb2x1bW4gcmFuZ2VzIChlLmcuICdTaGVldDEnIUM6RSBvciBDOkUpIHdpdGggb3Igd2l0aG91dCAkIGFic29sdXRlcyAoZS5nLiAkQzpFKQoJCQkJJG1hdGNoQ291bnQgPSBwcmVnX21hdGNoX2FsbCgnLycuc2VsZjo6UkVGSEVMUEVSX1JFR0VYUF9DT0xSQU5HRS4nL2knLCAnICcuJGZvcm11bGFCbG9jay4nICcsICRtYXRjaGVzLCBQUkVHX1NFVF9PUkRFUik7CgkJCQlpZiAoJG1hdGNoQ291bnQgPiAwKSB7CgkJCQkJZm9yZWFjaCgkbWF0Y2hlcyBhcyAkbWF0Y2gpIHsKCQkJCQkJJGZyb21TdHJpbmcgPSAoJG1hdGNoWzJdID4gJycpID8gJG1hdGNoWzJdLichJyA6ICcnOwoJCQkJCQkkZnJvbVN0cmluZyAuPSAkbWF0Y2hbM10uJzonLiRtYXRjaFs0XTsKCQkJCQkJJG1vZGlmaWVkMyA9IHN1YnN0cigkdGhpcy0+dXBkYXRlQ2VsbFJlZmVyZW5jZSgkbWF0Y2hbM10uJyQxJywkcEJlZm9yZSwkcE51bUNvbHMsJHBOdW1Sb3dzKSwwLC0yKTsKCQkJCQkJJG1vZGlmaWVkNCA9IHN1YnN0cigkdGhpcy0+dXBkYXRlQ2VsbFJlZmVyZW5jZSgkbWF0Y2hbNF0uJyQxJywkcEJlZm9yZSwkcE51bUNvbHMsJHBOdW1Sb3dzKSwwLC0yKTsKCgkJCQkJCWlmICgkbWF0Y2hbM10uJzonLiRtYXRjaFs0XSAhPT0gJG1vZGlmaWVkMy4nOicuJG1vZGlmaWVkNCkgewoJCQkJCQkJaWYgKCgkbWF0Y2hbMl0gPT0gJycpIHx8ICh0cmltKCRtYXRjaFsyXSwiJyIpID09ICRzaGVldE5hbWUpKSB7CgkJCQkJCQkJJHRvU3RyaW5nID0gKCRtYXRjaFsyXSA+ICcnKSA/ICRtYXRjaFsyXS4nIScgOiAnJzsKCQkJCQkJCQkkdG9TdHJpbmcgLj0gJG1vZGlmaWVkMy4nOicuJG1vZGlmaWVkNDsKCQkJCQkJCQkvLwlNYXggd29ya3NoZWV0IHNpemUgaXMgMSwwNDgsNTc2IHJvd3MgYnkgMTYsMzg0IGNvbHVtbnMgaW4gRXhjZWwgMjAwNywgc28gb3VyIGFkanVzdG1lbnRzIG5lZWQgdG8gYmUgYXQgbGVhc3Qgb25lIGRpZ2l0IG1vcmUKCQkJCQkJCQkkY29sdW1uID0gUEhQRXhjZWxfQ2VsbDo6Y29sdW1uSW5kZXhGcm9tU3RyaW5nKHRyaW0oJG1hdGNoWzNdLCckJykpICsgMTAwMDAwOwoJCQkJCQkJCSRyb3cgPSAxMDAwMDAwMDsKCQkJCQkJCQkkY2VsbEluZGV4ID0gJGNvbHVtbi4kcm93OwoKCQkJCQkJCQkkbmV3Q2VsbFRva2Vuc1skY2VsbEluZGV4XSA9IHByZWdfcXVvdGUoJHRvU3RyaW5nKTsKCQkJCQkJCQkkY2VsbFRva2Vuc1skY2VsbEluZGV4XSA9ICcvKD88IVtBLVpdKScucHJlZ19xdW90ZSgkZnJvbVN0cmluZykuJyg/IVtBLVpdKS9pJzsKCQkJCQkJCQkrKyRhZGp1c3RDb3VudDsKCQkJCQkJCX0KCQkJCQkJfQoJCQkJCX0KCQkJCX0KCQkJCS8vCVNlYXJjaCBmb3IgY2VsbCByYW5nZXMgKGUuZy4gJ1NoZWV0MSchQTM6QzUgb3IgQTM6QzUpIHdpdGggb3Igd2l0aG91dCAkIGFic29sdXRlcyAoZS5nLiAkQTE6QyQ1KQoJCQkJJG1hdGNoQ291bnQgPSBwcmVnX21hdGNoX2FsbCgnLycuc2VsZjo6UkVGSEVMUEVSX1JFR0VYUF9DRUxMUkFOR0UuJy9pJywgJyAnLiRmb3JtdWxhQmxvY2suJyAnLCAkbWF0Y2hlcywgUFJFR19TRVRfT1JERVIpOwoJCQkJaWYgKCRtYXRjaENvdW50ID4gMCkgewoJCQkJCWZvcmVhY2goJG1hdGNoZXMgYXMgJG1hdGNoKSB7CgkJCQkJCSRmcm9tU3RyaW5nID0gKCRtYXRjaFsyXSA+ICcnKSA/ICRtYXRjaFsyXS4nIScgOiAnJzsKCQkJCQkJJGZyb21TdHJpbmcgLj0gJG1hdGNoWzNdLic6Jy4kbWF0Y2hbNF07CgkJCQkJCSRtb2RpZmllZDMgPSAkdGhpcy0+dXBkYXRlQ2VsbFJlZmVyZW5jZSgkbWF0Y2hbM10sJHBCZWZvcmUsJHBOdW1Db2xzLCRwTnVtUm93cyk7CgkJCQkJCSRtb2RpZmllZDQgPSAkdGhpcy0+dXBkYXRlQ2VsbFJlZmVyZW5jZSgkbWF0Y2hbNF0sJHBCZWZvcmUsJHBOdW1Db2xzLCRwTnVtUm93cyk7CgoJCQkJCQlpZiAoJG1hdGNoWzNdLiRtYXRjaFs0XSAhPT0gJG1vZGlmaWVkMy4kbW9kaWZpZWQ0KSB7CgkJCQkJCQlpZiAoKCRtYXRjaFsyXSA9PSAnJykgfHwgKHRyaW0oJG1hdGNoWzJdLCInIikgPT0gJHNoZWV0TmFtZSkpIHsKCQkJCQkJCQkkdG9TdHJpbmcgPSAoJG1hdGNoWzJdID4gJycpID8gJG1hdGNoWzJdLichJyA6ICcnOwoJCQkJCQkJCSR0b1N0cmluZyAuPSAkbW9kaWZpZWQzLic6Jy4kbW9kaWZpZWQ0OwoJCQkJCQkJCWxpc3QoJGNvbHVtbiwkcm93KSA9IFBIUEV4Y2VsX0NlbGw6OmNvb3JkaW5hdGVGcm9tU3RyaW5nKCRtYXRjaFszXSk7CgkJCQkJCQkJLy8JTWF4IHdvcmtzaGVldCBzaXplIGlzIDEsMDQ4LDU3NiByb3dzIGJ5IDE2LDM4NCBjb2x1bW5zIGluIEV4Y2VsIDIwMDcsIHNvIG91ciBhZGp1c3RtZW50cyBuZWVkIHRvIGJlIGF0IGxlYXN0IG9uZSBkaWdpdCBtb3JlCgkJCQkJCQkJJGNvbHVtbiA9IFBIUEV4Y2VsX0NlbGw6OmNvbHVtbkluZGV4RnJvbVN0cmluZyh0cmltKCRjb2x1bW4sJyQnKSkgKyAxMDAwMDA7CgkJCQkJCQkJJHJvdyA9IHRyaW0oJHJvdywnJCcpICsgMTAwMDAwMDA7CgkJCQkJCQkJJGNlbGxJbmRleCA9ICRjb2x1bW4uJHJvdzsKCgkJCQkJCQkJJG5ld0NlbGxUb2tlbnNbJGNlbGxJbmRleF0gPSBwcmVnX3F1b3RlKCR0b1N0cmluZyk7CgkJCQkJCQkJJGNlbGxUb2tlbnNbJGNlbGxJbmRleF0gPSAnLyg/PCFbQS1aXSknLnByZWdfcXVvdGUoJGZyb21TdHJpbmcpLicoPyFcZCkvaSc7CgkJCQkJCQkJKyskYWRqdXN0Q291bnQ7CgkJCQkJCQl9CgkJCQkJCX0KCQkJCQl9CgkJCQl9CgkJCQkvLwlTZWFyY2ggZm9yIGNlbGwgcmVmZXJlbmNlcyAoZS5nLiAnU2hlZXQxJyFBMyBvciBDNSkgd2l0aCBvciB3aXRob3V0ICQgYWJzb2x1dGVzIChlLmcuICRBMSBvciBDJDUpCgkJCQkkbWF0Y2hDb3VudCA9IHByZWdfbWF0Y2hfYWxsKCcvJy5zZWxmOjpSRUZIRUxQRVJfUkVHRVhQX0NFTExSRUYuJy9pJywgJyAnLiRmb3JtdWxhQmxvY2suJyAnLCAkbWF0Y2hlcywgUFJFR19TRVRfT1JERVIpOwoJCQkJaWYgKCRtYXRjaENvdW50ID4gMCkgewoJCQkJCWZvcmVhY2goJG1hdGNoZXMgYXMgJG1hdGNoKSB7CgkJCQkJCSRmcm9tU3RyaW5nID0gKCRtYXRjaFsyXSA+ICcnKSA/ICRtYXRjaFsyXS4nIScgOiAnJzsKCQkJCQkJJGZyb21TdHJpbmcgLj0gJG1hdGNoWzNdOwoJCQkJCQkkbW9kaWZpZWQzID0gJHRoaXMtPnVwZGF0ZUNlbGxSZWZlcmVuY2UoJG1hdGNoWzNdLCRwQmVmb3JlLCRwTnVtQ29scywkcE51bVJvd3MpOwoKCQkJCQkJaWYgKCRtYXRjaFszXSAhPT0gJG1vZGlmaWVkMykgewoJCQkJCQkJaWYgKCgkbWF0Y2hbMl0gPT0gJycpIHx8ICh0cmltKCRtYXRjaFsyXSwiJyIpID09ICRzaGVldE5hbWUpKSB7CgkJCQkJCQkJJHRvU3RyaW5nID0gKCRtYXRjaFsyXSA+ICcnKSA/ICRtYXRjaFsyXS4nIScgOiAnJzsKCQkJCQkJCQkkdG9TdHJpbmcgLj0gJG1vZGlmaWVkMzsKCQkJCQkJCQlsaXN0KCRjb2x1bW4sJHJvdykgPSBQSFBFeGNlbF9DZWxsOjpjb29yZGluYXRlRnJvbVN0cmluZygkbWF0Y2hbM10pOwoJCQkJCQkJCS8vCU1heCB3b3Jrc2hlZXQgc2l6ZSBpcyAxLDA0OCw1NzYgcm93cyBieSAxNiwzODQgY29sdW1ucyBpbiBFeGNlbCAyMDA3LCBzbyBvdXIgYWRqdXN0bWVudHMgbmVlZCB0byBiZSBhdCBsZWFzdCBvbmUgZGlnaXQgbW9yZQoJCQkJCQkJCSRjb2x1bW4gPSBQSFBFeGNlbF9DZWxsOjpjb2x1bW5JbmRleEZyb21TdHJpbmcodHJpbSgkY29sdW1uLCckJykpICsgMTAwMDAwOwoJCQkJCQkJCSRyb3cgPSB0cmltKCRyb3csJyQnKSArIDEwMDAwMDAwOwoJCQkJCQkJCSRjZWxsSW5kZXggPSAkY29sdW1uLiRyb3c7CgoJCQkJCQkJCSRuZXdDZWxsVG9rZW5zWyRjZWxsSW5kZXhdID0gcHJlZ19xdW90ZSgkdG9TdHJpbmcpOwoJCQkJCQkJCSRjZWxsVG9rZW5zWyRjZWxsSW5kZXhdID0gJy8oPzwhW0EtWl0pJy5wcmVnX3F1b3RlKCRmcm9tU3RyaW5nKS4nKD8hXGQpL2knOwoJCQkJCQkJCSsrJGFkanVzdENvdW50OwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJfQoJCQkJfQoJCQkJaWYgKCRhZGp1c3RDb3VudCA+IDApIHsKCQkJCQlrcnNvcnQoJGNlbGxUb2tlbnMpOwoJCQkJCWtyc29ydCgkbmV3Q2VsbFRva2Vucyk7CgkJCQkJLy8JVXBkYXRlIGNlbGwgcmVmZXJlbmNlcyBpbiB0aGUgZm9ybXVsYQoJCQkJCSRmb3JtdWxhQmxvY2sgPSBzdHJfcmVwbGFjZSgnXFwnLCcnLHByZWdfcmVwbGFjZSgkY2VsbFRva2VucywkbmV3Q2VsbFRva2VucywkZm9ybXVsYUJsb2NrKSk7CgkJCQl9CgkJCX0KCQl9CgkJdW5zZXQoJGZvcm11bGFCbG9jayk7CgoJCS8vCVRoZW4gcmVidWlsZCB0aGUgZm9ybXVsYSBzdHJpbmcKCQlyZXR1cm4gaW1wbG9kZSgnIicsJGZvcm11bGFCbG9ja3MpOwoJfQoKCS8qKgoJICogVXBkYXRlIGNlbGwgcmVmZXJlbmNlCgkgKgoJICogQHBhcmFtCXN0cmluZwkkcENlbGxSYW5nZQkJCUNlbGwgcmFuZ2UKCSAqIEBwYXJhbQlpbnQJCSRwQmVmb3JlCQkJSW5zZXJ0IGJlZm9yZSB0aGlzIG9uZQoJICogQHBhcmFtCWludAkJJHBOdW1Db2xzCQkJTnVtYmVyIG9mIGNvbHVtbnMgdG8gaW5jcmVtZW50CgkgKiBAcGFyYW0JaW50CQkkcE51bVJvd3MJCQlOdW1iZXIgb2Ygcm93cyB0byBpbmNyZW1lbnQKCSAqIEByZXR1cm4Jc3RyaW5nCVVwZGF0ZWQgY2VsbCByYW5nZQoJICogQHRocm93cwlFeGNlcHRpb24KCSAqLwoJcHVibGljIGZ1bmN0aW9uIHVwZGF0ZUNlbGxSZWZlcmVuY2UoJHBDZWxsUmFuZ2UgPSAnQTEnLCAkcEJlZm9yZSA9ICdBMScsICRwTnVtQ29scyA9IDAsICRwTnVtUm93cyA9IDApIHsKCQkvLyBJcyBpdCBpbiBhbm90aGVyIHdvcmtzaGVldD8gV2lsbCBub3QgaGF2ZSB0byB1cGRhdGUgYW55dGhpbmcuCgkJaWYgKHN0cnBvcygkcENlbGxSYW5nZSwgIiEiKSAhPT0gZmFsc2UpIHsKCQkJcmV0dXJuICRwQ2VsbFJhbmdlOwoJCS8vIElzIGl0IGEgcmFuZ2Ugb3IgYSBzaW5nbGUgY2VsbD8KCQl9IGVsc2VpZiAoc3RycG9zKCRwQ2VsbFJhbmdlLCAnOicpID09PSBmYWxzZSAmJiBzdHJwb3MoJHBDZWxsUmFuZ2UsICcsJykgPT09IGZhbHNlKSB7CgkJCS8vIFNpbmdsZSBjZWxsCgkJCXJldHVybiAkdGhpcy0+X3VwZGF0ZVNpbmdsZUNlbGxSZWZlcmVuY2UoJHBDZWxsUmFuZ2UsICRwQmVmb3JlLCAkcE51bUNvbHMsICRwTnVtUm93cyk7CgkJfSBlbHNlaWYgKHN0cnBvcygkcENlbGxSYW5nZSwgJzonKSAhPT0gZmFsc2UgfHwgc3RycG9zKCRwQ2VsbFJhbmdlLCAnLCcpICE9PSBmYWxzZSkgewoJCQkvLyBSYW5nZQoJCQlyZXR1cm4gJHRoaXMtPl91cGRhdGVDZWxsUmFuZ2UoJHBDZWxsUmFuZ2UsICRwQmVmb3JlLCAkcE51bUNvbHMsICRwTnVtUm93cyk7CgkJfSBlbHNlIHsKCQkJLy8gUmV0dXJuIG9yaWdpbmFsCgkJCXJldHVybiAkcENlbGxSYW5nZTsKCQl9Cgl9CgoJLyoqCgkgKiBVcGRhdGUgbmFtZWQgZm9ybXVsYXMgKGkuZS4gY29udGFpbmluZyB3b3Jrc2hlZXQgcmVmZXJlbmNlcyAvIG5hbWVkIHJhbmdlcykKCSAqCgkgKiBAcGFyYW0gUEhQRXhjZWwgJHBQaHBFeGNlbAlPYmplY3QgdG8gdXBkYXRlCgkgKiBAcGFyYW0gc3RyaW5nICRvbGROYW1lCQlPbGQgbmFtZSAobmFtZSB0byByZXBsYWNlKQoJICogQHBhcmFtIHN0cmluZyAkbmV3TmFtZQkJTmV3IG5hbWUKCSAqLwoJcHVibGljIGZ1bmN0aW9uIHVwZGF0ZU5hbWVkRm9ybXVsYXMoUEhQRXhjZWwgJHBQaHBFeGNlbCwgJG9sZE5hbWUgPSAnJywgJG5ld05hbWUgPSAnJykgewoJCWlmICgkb2xkTmFtZSA9PSAnJykgewoJCQlyZXR1cm47CgkJfQoKCQlmb3JlYWNoICgkcFBocEV4Y2VsLT5nZXRXb3Jrc2hlZXRJdGVyYXRvcigpIGFzICRzaGVldCkgewoJCQlmb3JlYWNoICgkc2hlZXQtPmdldENlbGxDb2xsZWN0aW9uKGZhbHNlKSBhcyAkY2VsbElEKSB7CgkJCQkkY2VsbCA9ICRzaGVldC0+Z2V0Q2VsbCgkY2VsbElEKTsKCQkJCWlmICgoJGNlbGwgIT09IE5VTEwpICYmICgkY2VsbC0+Z2V0RGF0YVR5cGUoKSA9PSBQSFBFeGNlbF9DZWxsX0RhdGFUeXBlOjpUWVBFX0ZPUk1VTEEpKSB7CgkJCQkJJGZvcm11bGEgPSAkY2VsbC0+Z2V0VmFsdWUoKTsKCQkJCQlpZiAoc3RycG9zKCRmb3JtdWxhLCAkb2xkTmFtZSkgIT09IGZhbHNlKSB7CgkJCQkJCSRmb3JtdWxhID0gc3RyX3JlcGxhY2UoIiciIC4gJG9sZE5hbWUgLiAiJyEiLCAiJyIgLiAkbmV3TmFtZSAuICInISIsICRmb3JtdWxhKTsKCQkJCQkJJGZvcm11bGEgPSBzdHJfcmVwbGFjZSgkb2xkTmFtZSAuICIhIiwgJG5ld05hbWUgLiAiISIsICRmb3JtdWxhKTsKCQkJCQkJJGNlbGwtPnNldFZhbHVlRXhwbGljaXQoJGZvcm11bGEsIFBIUEV4Y2VsX0NlbGxfRGF0YVR5cGU6OlRZUEVfRk9STVVMQSk7CgkJCQkJfQoJCQkJfQoJCQl9CgkJfQoJfQoKCS8qKgoJICogVXBkYXRlIGNlbGwgcmFuZ2UKCSAqCgkgKiBAcGFyYW0Jc3RyaW5nCSRwQ2VsbFJhbmdlCQkJQ2VsbCByYW5nZQkoZS5nLiAnQjI6RDQnLCAnQjpDJyBvciAnMjozJykKCSAqIEBwYXJhbQlpbnQJCSRwQmVmb3JlCQkJSW5zZXJ0IGJlZm9yZSB0aGlzIG9uZQoJICogQHBhcmFtCWludAkJJHBOdW1Db2xzCQkJTnVtYmVyIG9mIGNvbHVtbnMgdG8gaW5jcmVtZW50CgkgKiBAcGFyYW0JaW50CQkkcE51bVJvd3MJCQlOdW1iZXIgb2Ygcm93cyB0byBpbmNyZW1lbnQKCSAqIEByZXR1cm4Jc3RyaW5nCVVwZGF0ZWQgY2VsbCByYW5nZQoJICogQHRocm93cwlFeGNlcHRpb24KCSAqLwoJcHJpdmF0ZSBmdW5jdGlvbiBfdXBkYXRlQ2VsbFJhbmdlKCRwQ2VsbFJhbmdlID0gJ0ExOkExJywgJHBCZWZvcmUgPSAnQTEnLCAkcE51bUNvbHMgPSAwLCAkcE51bVJvd3MgPSAwKSB7CgkJaWYgKHN0cnBvcygkcENlbGxSYW5nZSwnOicpICE9PSBmYWxzZSB8fCBzdHJwb3MoJHBDZWxsUmFuZ2UsICcsJykgIT09IGZhbHNlKSB7CgkJCS8vIFVwZGF0ZSByYW5nZQoJCQkkcmFuZ2UgPSBQSFBFeGNlbF9DZWxsOjpzcGxpdFJhbmdlKCRwQ2VsbFJhbmdlKTsKCQkJJGljID0gY291bnQoJHJhbmdlKTsKCQkJZm9yICgkaSA9IDA7ICRpIDwgJGljOyArKyRpKSB7CgkJCQkkamMgPSBjb3VudCgkcmFuZ2VbJGldKTsKCQkJCWZvciAoJGogPSAwOyAkaiA8ICRqYzsgKyskaikgewoJCQkJCWlmIChjdHlwZV9hbHBoYSgkcmFuZ2VbJGldWyRqXSkpIHsKCQkJCQkJJHIgPSBQSFBFeGNlbF9DZWxsOjpjb29yZGluYXRlRnJvbVN0cmluZygkdGhpcy0+X3VwZGF0ZVNpbmdsZUNlbGxSZWZlcmVuY2UoJHJhbmdlWyRpXVskal0uJzEnLCAkcEJlZm9yZSwgJHBOdW1Db2xzLCAkcE51bVJvd3MpKTsKCQkJCQkJJHJhbmdlWyRpXVskal0gPSAkclswXTsKCQkJCQl9IGVsc2VpZihjdHlwZV9kaWdpdCgkcmFuZ2VbJGldWyRqXSkpIHsKCQkJCQkJJHIgPSBQSFBFeGNlbF9DZWxsOjpjb29yZGluYXRlRnJvbVN0cmluZygkdGhpcy0+X3VwZGF0ZVNpbmdsZUNlbGxSZWZlcmVuY2UoJ0EnLiRyYW5nZVskaV1bJGpdLCAkcEJlZm9yZSwgJHBOdW1Db2xzLCAkcE51bVJvd3MpKTsKCQkJCQkJJHJhbmdlWyRpXVskal0gPSAkclsxXTsKCQkJCQl9IGVsc2UgewoJCQkJCQkkcmFuZ2VbJGldWyRqXSA9ICR0aGlzLT5fdXBkYXRlU2luZ2xlQ2VsbFJlZmVyZW5jZSgkcmFuZ2VbJGldWyRqXSwgJHBCZWZvcmUsICRwTnVtQ29scywgJHBOdW1Sb3dzKTsKCQkJCQl9CgkJCQl9CgkJCX0KCgkJCS8vIFJlY3JlYXRlIHJhbmdlIHN0cmluZwoJCQlyZXR1cm4gUEhQRXhjZWxfQ2VsbDo6YnVpbGRSYW5nZSgkcmFuZ2UpOwoJCX0gZWxzZSB7CgkJCXRocm93IG5ldyBFeGNlcHRpb24oIk9ubHkgY2VsbCByYW5nZXMgbWF5IGJlIHBhc3NlZCB0byB0aGlzIG1ldGhvZC4iKTsKCQl9Cgl9CgoJLyoqCgkgKiBVcGRhdGUgc2luZ2xlIGNlbGwgcmVmZXJlbmNlCgkgKgoJICogQHBhcmFtCXN0cmluZwkkcENlbGxSZWZlcmVuY2UJCVNpbmdsZSBjZWxsIHJlZmVyZW5jZQoJICogQHBhcmFtCWludAkJJHBCZWZvcmUJCQlJbnNlcnQgYmVmb3JlIHRoaXMgb25lCgkgKiBAcGFyYW0JaW50CQkkcE51bUNvbHMJCQlOdW1iZXIgb2YgY29sdW1ucyB0byBpbmNyZW1lbnQKCSAqIEBwYXJhbQlpbnQJCSRwTnVtUm93cwkJCU51bWJlciBvZiByb3dzIHRvIGluY3JlbWVudAoJICogQHJldHVybglzdHJpbmcJVXBkYXRlZCBjZWxsIHJlZmVyZW5jZQoJICogQHRocm93cwlFeGNlcHRpb24KCSAqLwoJcHJpdmF0ZSBmdW5jdGlvbiBfdXBkYXRlU2luZ2xlQ2VsbFJlZmVyZW5jZSgkcENlbGxSZWZlcmVuY2UgPSAnQTEnLCAkcEJlZm9yZSA9ICdBMScsICRwTnVtQ29scyA9IDAsICRwTnVtUm93cyA9IDApIHsKCQlpZiAoc3RycG9zKCRwQ2VsbFJlZmVyZW5jZSwgJzonKSA9PT0gZmFsc2UgJiYgc3RycG9zKCRwQ2VsbFJlZmVyZW5jZSwgJywnKSA9PT0gZmFsc2UpIHsKCQkJLy8gR2V0IGNvb3JkaW5hdGVzIG9mICRwQmVmb3JlCgkJCWxpc3QoJGJlZm9yZUNvbHVtbiwgJGJlZm9yZVJvdykgPSBQSFBFeGNlbF9DZWxsOjpjb29yZGluYXRlRnJvbVN0cmluZyggJHBCZWZvcmUgKTsKCgkJCS8vIEdldCBjb29yZGluYXRlcyBvZiAkcENlbGxSZWZlcmVuY2UKCQkJbGlzdCgkbmV3Q29sdW1uLCAkbmV3Um93KSA9IFBIUEV4Y2VsX0NlbGw6OmNvb3JkaW5hdGVGcm9tU3RyaW5nKCAkcENlbGxSZWZlcmVuY2UgKTsKCgkJCS8vIFZlcmlmeSB3aGljaCBwYXJ0cyBzaG91bGQgYmUgdXBkYXRlZAoJCQkkdXBkYXRlQ29sdW1uID0gKCgkbmV3Q29sdW1uezB9ICE9ICckJykgJiYgKCRiZWZvcmVDb2x1bW57MH0gIT0gJyQnKSAmJgoJCQkJCQkJIFBIUEV4Y2VsX0NlbGw6OmNvbHVtbkluZGV4RnJvbVN0cmluZygkbmV3Q29sdW1uKSA+PSBQSFBFeGNlbF9DZWxsOjpjb2x1bW5JbmRleEZyb21TdHJpbmcoJGJlZm9yZUNvbHVtbikpOwoKCQkJJHVwZGF0ZVJvdyA9ICgoJG5ld1Jvd3swfSAhPSAnJCcpICYmICgkYmVmb3JlUm93ezB9ICE9ICckJykgJiYKCQkJCQkJICAkbmV3Um93ID49ICRiZWZvcmVSb3cpOwoKCQkJLy8gQ3JlYXRlIG5ldyBjb2x1bW4gcmVmZXJlbmNlCgkJCWlmICgkdXBkYXRlQ29sdW1uKSB7CgkJCQkkbmV3Q29sdW1uCT0gUEhQRXhjZWxfQ2VsbDo6c3RyaW5nRnJvbUNvbHVtbkluZGV4KCBQSFBFeGNlbF9DZWxsOjpjb2x1bW5JbmRleEZyb21TdHJpbmcoJG5ld0NvbHVtbikgLSAxICsgJHBOdW1Db2xzICk7CgkJCX0KCgkJCS8vIENyZWF0ZSBuZXcgcm93IHJlZmVyZW5jZQoJCQlpZiAoJHVwZGF0ZVJvdykgewoJCQkJJG5ld1Jvdwk9ICRuZXdSb3cgKyAkcE51bVJvd3M7CgkJCX0KCgkJCS8vIFJldHVybiBuZXcgcmVmZXJlbmNlCgkJCXJldHVybiAkbmV3Q29sdW1uIC4gJG5ld1JvdzsKCQl9IGVsc2UgewoJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCJPbmx5IHNpbmdsZSBjZWxsIHJlZmVyZW5jZXMgbWF5IGJlIHBhc3NlZCB0byB0aGlzIG1ldGhvZC4iKTsKCQl9Cgl9CgoJLyoqCgkgKiBfX2Nsb25lIGltcGxlbWVudGF0aW9uLiBDbG9uaW5nIHNob3VsZCBub3QgYmUgYWxsb3dlZCBpbiBhIFNpbmdsZXRvbiEKCSAqCgkgKiBAdGhyb3dzCUV4Y2VwdGlvbgoJICovCglwdWJsaWMgZmluYWwgZnVuY3Rpb24gX19jbG9uZSgpIHsKCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCJDbG9uaW5nIGEgU2luZ2xldG9uIGlzIG5vdCBhbGxvd2VkISIpOwoJfQp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/RichText.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIFBIUEV4Y2VsCiAqCiAqIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICoKICogQGNhdGVnb3J5ICAgUEhQRXhjZWwKICogQHBhY2thZ2UgICAgUEhQRXhjZWxfUmljaFRleHQKICogQGNvcHlyaWdodCAgQ29weXJpZ2h0IChjKSAyMDA2IC0gMjAxMiBQSFBFeGNlbCAoaHR0cDovL3d3dy5jb2RlcGxleC5jb20vUEhQRXhjZWwpCiAqIEBsaWNlbnNlICAgIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9vbGQtbGljZW5zZXMvbGdwbC0yLjEudHh0CUxHUEwKICogQHZlcnNpb24gICAgMS43LjcsIDIwMTItMDUtMTkKICovCgoKLyoqCiAqIFBIUEV4Y2VsX1JpY2hUZXh0CiAqCiAqIEBjYXRlZ29yeSAgIFBIUEV4Y2VsCiAqIEBwYWNrYWdlICAgIFBIUEV4Y2VsX1JpY2hUZXh0CiAqIEBjb3B5cmlnaHQgIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwgKGh0dHA6Ly93d3cuY29kZXBsZXguY29tL1BIUEV4Y2VsKQogKi8KY2xhc3MgUEhQRXhjZWxfUmljaFRleHQgaW1wbGVtZW50cyBQSFBFeGNlbF9JQ29tcGFyYWJsZQp7CgkvKioKCSAqIFJpY2ggdGV4dCBlbGVtZW50cwoJICoKCSAqIEB2YXIgUEhQRXhjZWxfUmljaFRleHRfSVRleHRFbGVtZW50W10KCSAqLwoJcHJpdmF0ZSAkX3JpY2hUZXh0RWxlbWVudHM7CgogICAgLyoqCiAgICAgKiBDcmVhdGUgYSBuZXcgUEhQRXhjZWxfUmljaFRleHQgaW5zdGFuY2UKICAgICAqCiAgICAgKiBAcGFyYW0gCVBIUEV4Y2VsX0NlbGwJJHBQYXJlbnQKICAgICAqIEB0aHJvd3MJRXhjZXB0aW9uCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChQSFBFeGNlbF9DZWxsICRwQ2VsbCA9IG51bGwpCiAgICB7CiAgICAJLy8gSW5pdGlhbGlzZSB2YXJpYWJsZXMKICAgIAkkdGhpcy0+X3JpY2hUZXh0RWxlbWVudHMgPSBhcnJheSgpOwoKICAgIAkvLyBSaWNoLVRleHQgc3RyaW5nIGF0dGFjaGVkIHRvIGNlbGw/CiAgICAJaWYgKCRwQ2VsbCAhPT0gTlVMTCkgewoJICAgIAkvLyBBZGQgY2VsbCB0ZXh0IGFuZCBzdHlsZQoJICAgIAlpZiAoJHBDZWxsLT5nZXRWYWx1ZSgpICE9ICIiKSB7CgkgICAgCQkkb2JqUnVuID0gbmV3IFBIUEV4Y2VsX1JpY2hUZXh0X1J1bigkcENlbGwtPmdldFZhbHVlKCkpOwoJICAgIAkJJG9ialJ1bi0+c2V0Rm9udChjbG9uZSAkcENlbGwtPmdldFBhcmVudCgpLT5nZXRTdHlsZSgkcENlbGwtPmdldENvb3JkaW5hdGUoKSktPmdldEZvbnQoKSk7CgkgICAgCQkkdGhpcy0+YWRkVGV4dCgkb2JqUnVuKTsKCSAgICAJfQoKCSAgICAJLy8gU2V0IHBhcmVudCB2YWx1ZQoJICAgIAkkcENlbGwtPnNldFZhbHVlRXhwbGljaXQoJHRoaXMsIFBIUEV4Y2VsX0NlbGxfRGF0YVR5cGU6OlRZUEVfU1RSSU5HKTsKICAgIAl9CiAgICB9CgogICAgLyoqCiAgICAgKiBBZGQgdGV4dAogICAgICoKICAgICAqIEBwYXJhbSAJUEhQRXhjZWxfUmljaFRleHRfSVRleHRFbGVtZW50CQkkcFRleHQJCVJpY2ggdGV4dCBlbGVtZW50CiAgICAgKiBAdGhyb3dzIAlFeGNlcHRpb24KICAgICAqIEByZXR1cm4gUEhQRXhjZWxfUmljaFRleHQKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGFkZFRleHQoUEhQRXhjZWxfUmljaFRleHRfSVRleHRFbGVtZW50ICRwVGV4dCA9IG51bGwpCiAgICB7CiAgICAJJHRoaXMtPl9yaWNoVGV4dEVsZW1lbnRzW10gPSAkcFRleHQ7CiAgICAJcmV0dXJuICR0aGlzOwogICAgfQoKICAgIC8qKgogICAgICogQ3JlYXRlIHRleHQKICAgICAqCiAgICAgKiBAcGFyYW0gCXN0cmluZwkkcFRleHQJVGV4dAogICAgICogQHJldHVybglQSFBFeGNlbF9SaWNoVGV4dF9UZXh0RWxlbWVudAogICAgICogQHRocm93cyAJRXhjZXB0aW9uCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBjcmVhdGVUZXh0KCRwVGV4dCA9ICcnKQogICAgewogICAgCSRvYmpUZXh0ID0gbmV3IFBIUEV4Y2VsX1JpY2hUZXh0X1RleHRFbGVtZW50KCRwVGV4dCk7CiAgICAJJHRoaXMtPmFkZFRleHQoJG9ialRleHQpOwogICAgCXJldHVybiAkb2JqVGV4dDsKICAgIH0KCiAgICAvKioKICAgICAqIENyZWF0ZSB0ZXh0IHJ1bgogICAgICoKICAgICAqIEBwYXJhbSAJc3RyaW5nCSRwVGV4dAlUZXh0CiAgICAgKiBAcmV0dXJuCVBIUEV4Y2VsX1JpY2hUZXh0X1J1bgogICAgICogQHRocm93cyAJRXhjZXB0aW9uCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBjcmVhdGVUZXh0UnVuKCRwVGV4dCA9ICcnKQogICAgewogICAgCSRvYmpUZXh0ID0gbmV3IFBIUEV4Y2VsX1JpY2hUZXh0X1J1bigkcFRleHQpOwogICAgCSR0aGlzLT5hZGRUZXh0KCRvYmpUZXh0KTsKICAgIAlyZXR1cm4gJG9ialRleHQ7CiAgICB9CgogICAgLyoqCiAgICAgKiBHZXQgcGxhaW4gdGV4dAogICAgICoKICAgICAqIEByZXR1cm4gc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRQbGFpblRleHQoKQogICAgewogICAgCS8vIFJldHVybiB2YWx1ZQogICAgCSRyZXR1cm5WYWx1ZSA9ICcnOwoKICAgIAkvLyBMb29wIHRocm91Z2ggYWxsIFBIUEV4Y2VsX1JpY2hUZXh0X0lUZXh0RWxlbWVudAogICAgCWZvcmVhY2ggKCR0aGlzLT5fcmljaFRleHRFbGVtZW50cyBhcyAkdGV4dCkgewogICAgCQkkcmV0dXJuVmFsdWUgLj0gJHRleHQtPmdldFRleHQoKTsKICAgIAl9CgogICAgCS8vIFJldHVybgogICAgCXJldHVybiAkcmV0dXJuVmFsdWU7CiAgICB9CgogICAgLyoqCiAgICAgKiBDb252ZXJ0IHRvIHN0cmluZwogICAgICoKICAgICAqIEByZXR1cm4gc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBfX3RvU3RyaW5nKCkgewogICAgCXJldHVybiAkdGhpcy0+Z2V0UGxhaW5UZXh0KCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBHZXQgUmljaCBUZXh0IGVsZW1lbnRzCiAgICAgKgogICAgICogQHJldHVybiBQSFBFeGNlbF9SaWNoVGV4dF9JVGV4dEVsZW1lbnRbXQogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0UmljaFRleHRFbGVtZW50cygpCiAgICB7CiAgICAJcmV0dXJuICR0aGlzLT5fcmljaFRleHRFbGVtZW50czsKICAgIH0KCiAgICAvKioKICAgICAqIFNldCBSaWNoIFRleHQgZWxlbWVudHMKICAgICAqCiAgICAgKiBAcGFyYW0gCVBIUEV4Y2VsX1JpY2hUZXh0X0lUZXh0RWxlbWVudFtdCSRwRWxlbWVudHMJCUFycmF5IG9mIGVsZW1lbnRzCiAgICAgKiBAdGhyb3dzIAlFeGNlcHRpb24KICAgICAqIEByZXR1cm4gUEhQRXhjZWxfUmljaFRleHQKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHNldFJpY2hUZXh0RWxlbWVudHMoJHBFbGVtZW50cyA9IG51bGwpCiAgICB7CiAgICAJaWYgKGlzX2FycmF5KCRwRWxlbWVudHMpKSB7CiAgICAJCSR0aGlzLT5fcmljaFRleHRFbGVtZW50cyA9ICRwRWxlbWVudHM7CiAgICAJfSBlbHNlIHsKICAgIAkJdGhyb3cgbmV3IEV4Y2VwdGlvbigiSW52YWxpZCBQSFBFeGNlbF9SaWNoVGV4dF9JVGV4dEVsZW1lbnRbXSBhcnJheSBwYXNzZWQuIik7CiAgICAJfQogICAgCXJldHVybiAkdGhpczsKICAgIH0KCgkvKioKCSAqIEdldCBoYXNoIGNvZGUKCSAqCgkgKiBAcmV0dXJuIHN0cmluZwlIYXNoIGNvZGUKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldEhhc2hDb2RlKCkgewoJCSRoYXNoRWxlbWVudHMgPSAnJzsKCQlmb3JlYWNoICgkdGhpcy0+X3JpY2hUZXh0RWxlbWVudHMgYXMgJGVsZW1lbnQpIHsKCQkJJGhhc2hFbGVtZW50cyAuPSAkZWxlbWVudC0+Z2V0SGFzaENvZGUoKTsKCQl9CgogICAgCXJldHVybiBtZDUoCiAgICAJCSAgJGhhc2hFbGVtZW50cwogICAgCQkuIF9fQ0xBU1NfXwogICAgCSk7CiAgICB9CgoJLyoqCgkgKiBJbXBsZW1lbnQgUEhQIF9fY2xvbmUgdG8gY3JlYXRlIGEgZGVlcCBjbG9uZSwgbm90IGp1c3QgYSBzaGFsbG93IGNvcHkuCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBfX2Nsb25lKCkgewoJCSR2YXJzID0gZ2V0X29iamVjdF92YXJzKCR0aGlzKTsKCQlmb3JlYWNoICgkdmFycyBhcyAka2V5ID0+ICR2YWx1ZSkgewoJCQlpZiAoaXNfb2JqZWN0KCR2YWx1ZSkpIHsKCQkJCSR0aGlzLT4ka2V5ID0gY2xvbmUgJHZhbHVlOwoJCQl9IGVsc2UgewoJCQkJJHRoaXMtPiRrZXkgPSAkdmFsdWU7CgkJCX0KCQl9Cgl9Cn0K]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/RichText/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/RichText/ITextElement.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIFBIUEV4Y2VsCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCiAqCiAqIEBjYXRlZ29yeSAgIFBIUEV4Y2VsCiAqIEBwYWNrYWdlICAgIFBIUEV4Y2VsX1JpY2hUZXh0CiAqIEBjb3B5cmlnaHQgIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwgKGh0dHA6Ly93d3cuY29kZXBsZXguY29tL1BIUEV4Y2VsKQogKiBAbGljZW5zZSAgICBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvb2xkLWxpY2Vuc2VzL2xncGwtMi4xLnR4dAlMR1BMCiAqIEB2ZXJzaW9uICAgIDEuNy43LCAyMDEyLTA1LTE5CiAqLwoKCi8qKgogKiBQSFBFeGNlbF9SaWNoVGV4dF9JVGV4dEVsZW1lbnQKICoKICogQGNhdGVnb3J5ICAgUEhQRXhjZWwKICogQHBhY2thZ2UgICAgUEhQRXhjZWxfUmljaFRleHQKICogQGNvcHlyaWdodCAgQ29weXJpZ2h0IChjKSAyMDA2IC0gMjAxMiBQSFBFeGNlbCAoaHR0cDovL3d3dy5jb2RlcGxleC5jb20vUEhQRXhjZWwpCiAqLwppbnRlcmZhY2UgUEhQRXhjZWxfUmljaFRleHRfSVRleHRFbGVtZW50CnsKCS8qKgoJICogR2V0IHRleHQKCSAqCgkgKiBAcmV0dXJuIHN0cmluZwlUZXh0CgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRUZXh0KCk7CgoJLyoqCgkgKiBTZXQgdGV4dAoJICoKCSAqIEBwYXJhbSAJJHBUZXh0IHN0cmluZwlUZXh0CgkgKiBAcmV0dXJuIFBIUEV4Y2VsX1JpY2hUZXh0X0lUZXh0RWxlbWVudAoJICovCglwdWJsaWMgZnVuY3Rpb24gc2V0VGV4dCgkcFRleHQgPSAnJyk7CgoJLyoqCgkgKiBHZXQgZm9udAoJICoKCSAqIEByZXR1cm4gUEhQRXhjZWxfU3R5bGVfRm9udAoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0Rm9udCgpOwoKCS8qKgoJICogR2V0IGhhc2ggY29kZQoJICoKCSAqIEByZXR1cm4gc3RyaW5nCUhhc2ggY29kZQoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0SGFzaENvZGUoKTsKfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/RichText/Run.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIFBIUEV4Y2VsCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCiAqCiAqIEBjYXRlZ29yeSAgIFBIUEV4Y2VsCiAqIEBwYWNrYWdlICAgIFBIUEV4Y2VsX1JpY2hUZXh0CiAqIEBjb3B5cmlnaHQgIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwgKGh0dHA6Ly93d3cuY29kZXBsZXguY29tL1BIUEV4Y2VsKQogKiBAbGljZW5zZSAgICBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvb2xkLWxpY2Vuc2VzL2xncGwtMi4xLnR4dAlMR1BMCiAqIEB2ZXJzaW9uICAgIDEuNy43LCAyMDEyLTA1LTE5CiAqLwoKCi8qKgogKiBQSFBFeGNlbF9SaWNoVGV4dF9SdW4KICoKICogQGNhdGVnb3J5ICAgUEhQRXhjZWwKICogQHBhY2thZ2UgICAgUEhQRXhjZWxfUmljaFRleHQKICogQGNvcHlyaWdodCAgQ29weXJpZ2h0IChjKSAyMDA2IC0gMjAxMiBQSFBFeGNlbCAoaHR0cDovL3d3dy5jb2RlcGxleC5jb20vUEhQRXhjZWwpCiAqLwpjbGFzcyBQSFBFeGNlbF9SaWNoVGV4dF9SdW4gZXh0ZW5kcyBQSFBFeGNlbF9SaWNoVGV4dF9UZXh0RWxlbWVudCBpbXBsZW1lbnRzIFBIUEV4Y2VsX1JpY2hUZXh0X0lUZXh0RWxlbWVudAp7CgkvKioKCSAqIEZvbnQKCSAqCgkgKiBAdmFyIFBIUEV4Y2VsX1N0eWxlX0ZvbnQKCSAqLwoJcHJpdmF0ZSAkX2ZvbnQ7CgogICAgLyoqCiAgICAgKiBDcmVhdGUgYSBuZXcgUEhQRXhjZWxfUmljaFRleHRfUnVuIGluc3RhbmNlCiAgICAgKgogICAgICogQHBhcmFtIAlzdHJpbmcJCSRwVGV4dAkJVGV4dAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJHBUZXh0ID0gJycpCiAgICB7CiAgICAJLy8gSW5pdGlhbGlzZSB2YXJpYWJsZXMKICAgIAkkdGhpcy0+c2V0VGV4dCgkcFRleHQpOwogICAgCSR0aGlzLT5fZm9udCA9IG5ldyBQSFBFeGNlbF9TdHlsZV9Gb250KCk7CiAgICB9CgoJLyoqCgkgKiBHZXQgZm9udAoJICoKCSAqIEByZXR1cm4gUEhQRXhjZWxfU3R5bGVfRm9udAoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0Rm9udCgpIHsKCQlyZXR1cm4gJHRoaXMtPl9mb250OwoJfQoKCS8qKgoJICogU2V0IGZvbnQKCSAqCgkgKiBAcGFyYW0JUEhQRXhjZWxfU3R5bGVfRm9udAkJJHBGb250CQlGb250CgkgKiBAdGhyb3dzIAlFeGNlcHRpb24KCSAqIEByZXR1cm4gUEhQRXhjZWxfUmljaFRleHRfSVRleHRFbGVtZW50CgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBzZXRGb250KFBIUEV4Y2VsX1N0eWxlX0ZvbnQgJHBGb250ID0gbnVsbCkgewoJCSR0aGlzLT5fZm9udCA9ICRwRm9udDsKCQlyZXR1cm4gJHRoaXM7Cgl9CgoJLyoqCgkgKiBHZXQgaGFzaCBjb2RlCgkgKgoJICogQHJldHVybiBzdHJpbmcJSGFzaCBjb2RlCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRIYXNoQ29kZSgpIHsKICAgIAlyZXR1cm4gbWQ1KAogICAgCQkgICR0aGlzLT5nZXRUZXh0KCkKICAgIAkJLiAkdGhpcy0+X2ZvbnQtPmdldEhhc2hDb2RlKCkKICAgIAkJLiBfX0NMQVNTX18KICAgIAkpOwogICAgfQoKCS8qKgoJICogSW1wbGVtZW50IFBIUCBfX2Nsb25lIHRvIGNyZWF0ZSBhIGRlZXAgY2xvbmUsIG5vdCBqdXN0IGEgc2hhbGxvdyBjb3B5LgoJICovCglwdWJsaWMgZnVuY3Rpb24gX19jbG9uZSgpIHsKCQkkdmFycyA9IGdldF9vYmplY3RfdmFycygkdGhpcyk7CgkJZm9yZWFjaCAoJHZhcnMgYXMgJGtleSA9PiAkdmFsdWUpIHsKCQkJaWYgKGlzX29iamVjdCgkdmFsdWUpKSB7CgkJCQkkdGhpcy0+JGtleSA9IGNsb25lICR2YWx1ZTsKCQkJfSBlbHNlIHsKCQkJCSR0aGlzLT4ka2V5ID0gJHZhbHVlOwoJCQl9CgkJfQoJfQp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/RichText/TextElement.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIFBIUEV4Y2VsCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCiAqCiAqIEBjYXRlZ29yeSAgIFBIUEV4Y2VsCiAqIEBwYWNrYWdlICAgIFBIUEV4Y2VsX1JpY2hUZXh0CiAqIEBjb3B5cmlnaHQgIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwgKGh0dHA6Ly93d3cuY29kZXBsZXguY29tL1BIUEV4Y2VsKQogKiBAbGljZW5zZSAgICBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvb2xkLWxpY2Vuc2VzL2xncGwtMi4xLnR4dAlMR1BMCiAqIEB2ZXJzaW9uICAgIDEuNy43LCAyMDEyLTA1LTE5CiAqLwoKCi8qKgogKiBQSFBFeGNlbF9SaWNoVGV4dF9UZXh0RWxlbWVudAogKgogKiBAY2F0ZWdvcnkgICBQSFBFeGNlbAogKiBAcGFja2FnZSAgICBQSFBFeGNlbF9SaWNoVGV4dAogKiBAY29weXJpZ2h0ICBDb3B5cmlnaHQgKGMpIDIwMDYgLSAyMDEyIFBIUEV4Y2VsIChodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9QSFBFeGNlbCkKICovCmNsYXNzIFBIUEV4Y2VsX1JpY2hUZXh0X1RleHRFbGVtZW50IGltcGxlbWVudHMgUEhQRXhjZWxfUmljaFRleHRfSVRleHRFbGVtZW50CnsKCS8qKgoJICogVGV4dAoJICoKCSAqIEB2YXIgc3RyaW5nCgkgKi8KCXByaXZhdGUgJF90ZXh0OwoKICAgIC8qKgogICAgICogQ3JlYXRlIGEgbmV3IFBIUEV4Y2VsX1JpY2hUZXh0X1RleHRFbGVtZW50IGluc3RhbmNlCiAgICAgKgogICAgICogQHBhcmFtIAlzdHJpbmcJCSRwVGV4dAkJVGV4dAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJHBUZXh0ID0gJycpCiAgICB7CiAgICAJLy8gSW5pdGlhbGlzZSB2YXJpYWJsZXMKICAgIAkkdGhpcy0+X3RleHQgPSAkcFRleHQ7CiAgICB9CgoJLyoqCgkgKiBHZXQgdGV4dAoJICoKCSAqIEByZXR1cm4gc3RyaW5nCVRleHQKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldFRleHQoKSB7CgkJcmV0dXJuICR0aGlzLT5fdGV4dDsKCX0KCgkvKioKCSAqIFNldCB0ZXh0CgkgKgoJICogQHBhcmFtIAkkcFRleHQgc3RyaW5nCVRleHQKCSAqIEByZXR1cm4gUEhQRXhjZWxfUmljaFRleHRfSVRleHRFbGVtZW50CgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBzZXRUZXh0KCRwVGV4dCA9ICcnKSB7CgkJJHRoaXMtPl90ZXh0ID0gJHBUZXh0OwoJCXJldHVybiAkdGhpczsKCX0KCgkvKioKCSAqIEdldCBmb250CgkgKgoJICogQHJldHVybiBQSFBFeGNlbF9TdHlsZV9Gb250CgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRGb250KCkgewoJCXJldHVybiBudWxsOwoJfQoKCS8qKgoJICogR2V0IGhhc2ggY29kZQoJICoKCSAqIEByZXR1cm4gc3RyaW5nCUhhc2ggY29kZQoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0SGFzaENvZGUoKSB7CiAgICAJcmV0dXJuIG1kNSgKICAgIAkJICAkdGhpcy0+X3RleHQKICAgIAkJLiBfX0NMQVNTX18KICAgIAkpOwogICAgfQoKCS8qKgoJICogSW1wbGVtZW50IFBIUCBfX2Nsb25lIHRvIGNyZWF0ZSBhIGRlZXAgY2xvbmUsIG5vdCBqdXN0IGEgc2hhbGxvdyBjb3B5LgoJICovCglwdWJsaWMgZnVuY3Rpb24gX19jbG9uZSgpIHsKCQkkdmFycyA9IGdldF9vYmplY3RfdmFycygkdGhpcyk7CgkJZm9yZWFjaCAoJHZhcnMgYXMgJGtleSA9PiAkdmFsdWUpIHsKCQkJaWYgKGlzX29iamVjdCgkdmFsdWUpKSB7CgkJCQkkdGhpcy0+JGtleSA9IGNsb25lICR2YWx1ZTsKCQkJfSBlbHNlIHsKCQkJCSR0aGlzLT4ka2V5ID0gJHZhbHVlOwoJCQl9CgkJfQoJfQp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Settings.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIFBIUEV4Y2VsCiAqCiAqIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICoKICogQGNhdGVnb3J5ICAgUEhQRXhjZWwKICogQHBhY2thZ2UgICAgUEhQRXhjZWxfU2V0dGluZ3MKICogQGNvcHlyaWdodCAgQ29weXJpZ2h0IChjKSAyMDA2IC0gMjAxMiBQSFBFeGNlbCAoaHR0cDovL3d3dy5jb2RlcGxleC5jb20vUEhQRXhjZWwpCiAqIEBsaWNlbnNlICAgIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9vbGQtbGljZW5zZXMvbGdwbC0yLjEudHh0CUxHUEwKICogQHZlcnNpb24gICAgMS43LjcsIDIwMTItMDUtMTkKICovCgovKiogUEhQRXhjZWwgcm9vdCBkaXJlY3RvcnkgKi8KaWYgKCFkZWZpbmVkKCdQSFBFWENFTF9ST09UJykpIHsKCS8qKgoJICogQGlnbm9yZQoJICovCglkZWZpbmUoJ1BIUEVYQ0VMX1JPT1QnLCBkaXJuYW1lKF9fRklMRV9fKSAuICcvLi4vJyk7CglyZXF1aXJlKFBIUEVYQ0VMX1JPT1QgLiAnUEhQRXhjZWwvQXV0b2xvYWRlci5waHAnKTsKfQoKCmNsYXNzIFBIUEV4Y2VsX1NldHRpbmdzCnsKCS8qKgljb25zdGFudHMgKi8KCS8qKglBdmFpbGFibGUgWmlwIGxpYnJhcnkgY2xhc3NlcyAqLwoJY29uc3QgUENMWklQCQk9ICdQSFBFeGNlbF9TaGFyZWRfWmlwQXJjaGl2ZSc7Cgljb25zdCBaSVBBUkNISVZFCT0gJ1ppcEFyY2hpdmUnOwoKCS8qKglPcHRpb25hbCBDaGFydCBSZW5kZXJpbmcgbGlicmFyaWVzICovCiAgICBjb25zdCBDSEFSVF9SRU5ERVJFUl9KUEdSQVBICT0gJ2pwZ3JhcGgnOwoKCS8qKglPcHRpb25hbCBQREYgUmVuZGVyaW5nIGxpYnJhcmllcyAqLwogICAgY29uc3QgUERGX1JFTkRFUkVSX1RDUERGCQk9ICd0Y3BkZic7CiAgICBjb25zdCBQREZfUkVOREVSRVJfRE9NUERGCQk9ICdkb21wZGYnOwogICAgY29uc3QgUERGX1JFTkRFUkVSX01QREYJCQk9ICdtcGRmJzsKCgoJcHJpdmF0ZSBzdGF0aWMgJF9jaGFydFJlbmRlcmVycyA9IGFycmF5KAoJCXNlbGY6OkNIQVJUX1JFTkRFUkVSX0pQR1JBUEgsCgkpOwoKCXByaXZhdGUgc3RhdGljICRfcGRmUmVuZGVyZXJzID0gYXJyYXkoCgkJc2VsZjo6UERGX1JFTkRFUkVSX1RDUERGLAoJCXNlbGY6OlBERl9SRU5ERVJFUl9ET01QREYsCgkJc2VsZjo6UERGX1JFTkRFUkVSX01QREYsCgkpOwoKCgkvKioKCSAqIE5hbWUgb2YgdGhlIGNsYXNzIHVzZWQgZm9yIFppcCBmaWxlIG1hbmFnZW1lbnQKCSAqCQllLmcuCgkgKgkJCVppcEFyY2hpdmUKCSAqCgkgKiBAdmFyIHN0cmluZwoJICovCglwcml2YXRlIHN0YXRpYyAkX3ppcENsYXNzCT0gc2VsZjo6WklQQVJDSElWRTsKCgoJLyoqCgkgKiBOYW1lIG9mIHRoZSBleHRlcm5hbCBMaWJyYXJ5IHVzZWQgZm9yIHJlbmRlcmluZyBjaGFydHMKCSAqCQllLmcuCgkgKgkJCWpwZ3JhcGgKCSAqCgkgKiBAdmFyIHN0cmluZwoJICovCglwcml2YXRlIHN0YXRpYyAkX2NoYXJ0UmVuZGVyZXJOYW1lID0gTlVMTDsKCgkvKioKCSAqIERpcmVjdG9yeSBQYXRoIHRvIHRoZSBleHRlcm5hbCBMaWJyYXJ5IHVzZWQgZm9yIHJlbmRlcmluZyBjaGFydHMKCSAqCgkgKiBAdmFyIHN0cmluZwoJICovCglwcml2YXRlIHN0YXRpYyAkX2NoYXJ0UmVuZGVyZXJQYXRoID0gTlVMTDsKCgoJLyoqCgkgKiBOYW1lIG9mIHRoZSBleHRlcm5hbCBMaWJyYXJ5IHVzZWQgZm9yIHJlbmRlcmluZyBQREYgZmlsZXMKCSAqCQllLmcuCgkgKgkJCW1QREYKCSAqCgkgKiBAdmFyIHN0cmluZwoJICovCglwcml2YXRlIHN0YXRpYyAkX3BkZlJlbmRlcmVyTmFtZSA9IE5VTEw7CgoJLyoqCgkgKiBEaXJlY3RvcnkgUGF0aCB0byB0aGUgZXh0ZXJuYWwgTGlicmFyeSB1c2VkIGZvciByZW5kZXJpbmcgUERGIGZpbGVzCgkgKgoJICogQHZhciBzdHJpbmcKCSAqLwoJcHJpdmF0ZSBzdGF0aWMgJF9wZGZSZW5kZXJlclBhdGggPSBOVUxMOwoKCgkvKioKCSAqIFNldCB0aGUgWmlwIGhhbmRsZXIgQ2xhc3MgdGhhdCBQSFBFeGNlbCBzaG91bGQgdXNlIGZvciBaaXAgZmlsZSBtYW5hZ2VtZW50IChQQ0xaaXAgb3IgWmlwQXJjaGl2ZSkKCSAqCgkgKiBAcGFyYW0JIHN0cmluZwkkemlwQ2xhc3MJCQlUaGUgWmlwIGhhbmRsZXIgY2xhc3MgdGhhdCBQSFBFeGNlbCBzaG91bGQgdXNlIGZvciBaaXAgZmlsZSBtYW5hZ2VtZW50CgkgKgkJCQkJCQkJCQkJZS5nLiBQSFBFeGNlbF9TZXR0aW5nczo6UENMWmlwIG9yIFBIUEV4Y2VsX1NldHRpbmdzOjpaaXBBcmNoaXZlCgkgKiBAcmV0dXJuCSBib29sZWFuCQkJCQlTdWNjZXNzIG9yIGZhaWx1cmUKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBzZXRaaXBDbGFzcygkemlwQ2xhc3MpIHsKCQlpZiAoKCR6aXBDbGFzcyA9PT0gc2VsZjo6UENMWklQKSB8fAoJCQkoJHppcENsYXNzID09PSBzZWxmOjpaSVBBUkNISVZFKSkgewoJCQlzZWxmOjokX3ppcENsYXNzID0gJHppcENsYXNzOwoJCQlyZXR1cm4gVFJVRTsKCQl9CgkJcmV0dXJuIEZBTFNFOwoJfQkvLwlmdW5jdGlvbiBzZXRaaXBDbGFzcygpCgoKCS8qKgoJICogUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBaaXAgaGFuZGxlciBDbGFzcyB0aGF0IFBIUEV4Y2VsIGlzIGNvbmZpZ3VyZWQgdG8gdXNlIChQQ0xaaXAgb3IgWmlwQXJjaGl2ZSkKCSAqCQlmb3IgWmlwIGZpbGUgbWFuYWdlbWVudAoJICoKCSAqIEByZXR1cm4JIHN0cmluZwkJCQkJCU5hbWUgb2YgdGhlIFppcCBoYW5kbGVyIENsYXNzIHRoYXQgUEhQRXhjZWwgaXMgY29uZmlndXJlZCB0byB1c2UKCSAqCQkJCQkJCQkJCQlmb3IgWmlwIGZpbGUgbWFuYWdlbWVudAoJICoJCQkJCQkJCQkJCQllLmcuIFBIUEV4Y2VsX1NldHRpbmdzOjpQQ0xaaXAgb3IgUEhQRXhjZWxfU2V0dGluZ3M6OlppcEFyY2hpdmUKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRaaXBDbGFzcygpIHsKCQlyZXR1cm4gc2VsZjo6JF96aXBDbGFzczsKCX0JLy8JZnVuY3Rpb24gZ2V0WmlwQ2xhc3MoKQoKCgkvKioKCSAqIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgbWV0aG9kIHRoYXQgaXMgY3VycmVudGx5IGNvbmZpZ3VyZWQgZm9yIGNlbGwgY2FjaGVpbmcKCSAqCgkgKiBAcmV0dXJuCXN0cmluZwkJCQlOYW1lIG9mIHRoZSBjYWNoZWluZyBtZXRob2QKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRDYWNoZVN0b3JhZ2VNZXRob2QoKSB7CgkJcmV0dXJuIFBIUEV4Y2VsX0NhY2hlZE9iamVjdFN0b3JhZ2VGYWN0b3J5OjokX2NhY2hlU3RvcmFnZU1ldGhvZDsKCX0JLy8JZnVuY3Rpb24gZ2V0Q2FjaGVTdG9yYWdlTWV0aG9kKCkKCgoJLyoqCgkgKiBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGNsYXNzIHRoYXQgaXMgY3VycmVudGx5IGJlaW5nIHVzZWQgZm9yIGNlbGwgY2FjaGVpbmcKCSAqCgkgKiBAcmV0dXJuCXN0cmluZwkJCQlOYW1lIG9mIHRoZSBjbGFzcyBjdXJyZW50bHkgYmVpbmcgdXNlZCBmb3IgY2FjaGVpbmcKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRDYWNoZVN0b3JhZ2VDbGFzcygpIHsKCQlyZXR1cm4gUEhQRXhjZWxfQ2FjaGVkT2JqZWN0U3RvcmFnZUZhY3Rvcnk6OiRfY2FjaGVTdG9yYWdlQ2xhc3M7Cgl9CS8vCWZ1bmN0aW9uIGdldENhY2hlU3RvcmFnZUNsYXNzKCkKCgoJLyoqCgkgKiBTZXQgdGhlIG1ldGhvZCB0aGF0IHNob3VsZCBiZSB1c2VkIGZvciBjZWxsIGNhY2hlaW5nCgkgKgoJICogQHBhcmFtCXN0cmluZwkkbWV0aG9kCQlOYW1lIG9mIHRoZSBjYWNoZWluZyBtZXRob2QKCSAqIEBwYXJhbQlhcnJheQkkYXJndW1lbnRzCU9wdGlvbmFsIGNvbmZpZ3VyYXRpb24gYXJndW1lbnRzIGZvciB0aGUgY2FjaGVpbmcgbWV0aG9kCgkgKiBAcmV0dXJuCWJvb2xlYW4JCQkJU3VjY2VzcyBvciBmYWlsdXJlCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gc2V0Q2FjaGVTdG9yYWdlTWV0aG9kKCRtZXRob2QgPSBQSFBFeGNlbF9DYWNoZWRPYmplY3RTdG9yYWdlRmFjdG9yeTo6Y2FjaGVfaW5fbWVtb3J5LAoJCQkJCQkJCQkJCQkgJGFyZ3VtZW50cyA9IGFycmF5KCkpIHsKCQlyZXR1cm4gUEhQRXhjZWxfQ2FjaGVkT2JqZWN0U3RvcmFnZUZhY3Rvcnk6OmluaXRpYWxpemUoJG1ldGhvZCwgJGFyZ3VtZW50cyk7Cgl9CS8vCWZ1bmN0aW9uIHNldENhY2hlU3RvcmFnZU1ldGhvZCgpCgoKCS8qKgoJICogU2V0IHRoZSBsb2NhbGUgY29kZSB0byB1c2UgZm9yIGZvcm11bGEgdHJhbnNsYXRpb25zIGFuZCBhbnkgc3BlY2lhbCBmb3JtYXR0aW5nCgkgKgoJICogQHBhcmFtCXN0cmluZwkkbG9jYWxlCQlUaGUgbG9jYWxlIGNvZGUgdG8gdXNlIChlLmcuICJmciIgb3IgInB0X2JyIiBvciAiZW5fdWsiKQoJICogQHJldHVybglib29sZWFuCQkJCVN1Y2Nlc3Mgb3IgZmFpbHVyZQoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHNldExvY2FsZSgkbG9jYWxlPSdlbl91cycpIHsKCQlyZXR1cm4gUEhQRXhjZWxfQ2FsY3VsYXRpb246OmdldEluc3RhbmNlKCktPnNldExvY2FsZSgkbG9jYWxlKTsKCX0JLy8JZnVuY3Rpb24gc2V0TG9jYWxlKCkKCgoJLyoqCgkgKiBTZXQgZGV0YWlscyBvZiB0aGUgZXh0ZXJuYWwgbGlicmFyeSB0aGF0IFBIUEV4Y2VsIHNob3VsZCB1c2UgZm9yIHJlbmRlcmluZyBjaGFydHMKCSAqCgkgKiBAcGFyYW0JIHN0cmluZwkkbGlicmFyeU5hbWUJCUludGVybmFsIHJlZmVyZW5jZSBuYW1lIG9mIHRoZSBsaWJyYXJ5CgkgKgkJCQkJCQkJCQkJZS5nLiBQSFBFeGNlbF9TZXR0aW5nczo6Q0hBUlRfUkVOREVSRVJfSlBHUkFQSAoJICogQHBhcmFtCSBzdHJpbmcJJGxpYnJhcnlCYXNlRGlyCQlEaXJlY3RvcnkgcGF0aCB0byB0aGUgbGlicmFyeSdzIGJhc2UgZm9sZGVyCgkgKiBAcmV0dXJuCSBib29sZWFuCQkJCQlTdWNjZXNzIG9yIGZhaWx1cmUKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBzZXRDaGFydFJlbmRlcmVyKCRsaWJyYXJ5TmFtZSwgJGxpYnJhcnlCYXNlRGlyKSB7CgkJaWYgKCFzZWxmOjpzZXRDaGFydFJlbmRlcmVyTmFtZSgkbGlicmFyeU5hbWUpKQoJCQlyZXR1cm4gRkFMU0U7CgkJcmV0dXJuIHNlbGY6OnNldENoYXJ0UmVuZGVyZXJQYXRoKCRsaWJyYXJ5QmFzZURpcik7Cgl9CS8vCWZ1bmN0aW9uIHNldENoYXJ0UmVuZGVyZXIoKQoKCgkvKioKCSAqIElkZW50aWZ5IHRvIFBIUEV4Y2VsIHRoZSBleHRlcm5hbCBsaWJyYXJ5IHRvIHVzZSBmb3IgcmVuZGVyaW5nIGNoYXJ0cwoJICoKCSAqIEBwYXJhbQkgc3RyaW5nCSRsaWJyYXJ5TmFtZQkJSW50ZXJuYWwgcmVmZXJlbmNlIG5hbWUgb2YgdGhlIGxpYnJhcnkKCSAqCQkJCQkJCQkJCQllLmcuIFBIUEV4Y2VsX1NldHRpbmdzOjpDSEFSVF9SRU5ERVJFUl9KUEdSQVBICgkgKiBAcmV0dXJuCSBib29sZWFuCQkJCQlTdWNjZXNzIG9yIGZhaWx1cmUKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBzZXRDaGFydFJlbmRlcmVyTmFtZSgkbGlicmFyeU5hbWUpIHsKCQlpZiAoIWluX2FycmF5KCRsaWJyYXJ5TmFtZSxzZWxmOjokX2NoYXJ0UmVuZGVyZXJzKSkgewoJCQlyZXR1cm4gRkFMU0U7CgkJfQoKCQlzZWxmOjokX2NoYXJ0UmVuZGVyZXJOYW1lID0gJGxpYnJhcnlOYW1lOwoKCQlyZXR1cm4gVFJVRTsKCX0JLy8JZnVuY3Rpb24gc2V0Q2hhcnRSZW5kZXJlck5hbWUoKQoKCgkvKioKCSAqIFRlbGwgUEhQRXhjZWwgd2hlcmUgdG8gZmluZCB0aGUgZXh0ZXJuYWwgbGlicmFyeSB0byB1c2UgZm9yIHJlbmRlcmluZyBjaGFydHMKCSAqCgkgKiBAcGFyYW0JIHN0cmluZwkkbGlicmFyeUJhc2VEaXIJCURpcmVjdG9yeSBwYXRoIHRvIHRoZSBsaWJyYXJ5J3MgYmFzZSBmb2xkZXIKCSAqIEByZXR1cm4JIGJvb2xlYW4JCQkJCVN1Y2Nlc3Mgb3IgZmFpbHVyZQoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHNldENoYXJ0UmVuZGVyZXJQYXRoKCRsaWJyYXJ5QmFzZURpcikgewoJCXNlbGY6OiRfY2hhcnRSZW5kZXJlclBhdGggPSAkbGlicmFyeUJhc2VEaXI7CgoJCXJldHVybiBUUlVFOwoJfQkvLwlmdW5jdGlvbiBzZXRDaGFydFJlbmRlcmVyUGF0aCgpCgoKCS8qKgoJICogUmV0dXJuIHRoZSBDaGFydCBSZW5kZXJpbmcgTGlicmFyeSB0aGF0IFBIUEV4Y2VsIGlzIGN1cnJlbnRseSBjb25maWd1cmVkIHRvIHVzZSAoZS5nLiBqcGdyYXBoKQoJICoKCSAqIEByZXR1cm4JIHN0cmluZwkJCQkJCUludGVybmFsIHJlZmVyZW5jZSBuYW1lIG9mIHRoZSBDaGFydCBSZW5kZXJpbmcgTGlicmFyeSB0aGF0IFBIUEV4Y2VsIGlzCgkgKgkJCQkJCQkJCQkJY3VycmVudGx5IGNvbmZpZ3VyZWQgdG8gdXNlCgkgKgkJCQkJCQkJCQkJCWUuZy4gUEhQRXhjZWxfU2V0dGluZ3M6OkNIQVJUX1JFTkRFUkVSX0pQR1JBUEgKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRDaGFydFJlbmRlcmVyTmFtZSgpIHsKCQlyZXR1cm4gc2VsZjo6JF9jaGFydFJlbmRlcmVyTmFtZTsKCX0JLy8JZnVuY3Rpb24gZ2V0Q2hhcnRSZW5kZXJlck5hbWUoKQoKCgkvKioKCSAqIFJldHVybiB0aGUgZGlyZWN0b3J5IHBhdGggdG8gdGhlIENoYXJ0IFJlbmRlcmluZyBMaWJyYXJ5IHRoYXQgUEhQRXhjZWwgaXMgY3VycmVudGx5IGNvbmZpZ3VyZWQgdG8gdXNlCgkgKgoJICogQHJldHVybgkgc3RyaW5nCQkJCQkJRGlyZWN0b3J5IFBhdGggdG8gdGhlIENoYXJ0IFJlbmRlcmluZyBMaWJyYXJ5IHRoYXQgUEhQRXhjZWwgaXMKCSAqCQkJCQkJCQkJCQljdXJyZW50bHkgY29uZmlndXJlZCB0byB1c2UKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRDaGFydFJlbmRlcmVyUGF0aCgpIHsKCQlyZXR1cm4gc2VsZjo6JF9jaGFydFJlbmRlcmVyUGF0aDsKCX0JLy8JZnVuY3Rpb24gZ2V0Q2hhcnRSZW5kZXJlclBhdGgoKQoKCgkvKioKCSAqIFNldCBkZXRhaWxzIG9mIHRoZSBleHRlcm5hbCBsaWJyYXJ5IHRoYXQgUEhQRXhjZWwgc2hvdWxkIHVzZSBmb3IgcmVuZGVyaW5nIFBERiBmaWxlcwoJICoKCSAqIEBwYXJhbQkgc3RyaW5nCSRsaWJyYXJ5TmFtZQkJSW50ZXJuYWwgcmVmZXJlbmNlIG5hbWUgb2YgdGhlIGxpYnJhcnkKCSAqCQkJCQkJCQkJCQllLmcuIFBIUEV4Y2VsX1NldHRpbmdzOjpQREZfUkVOREVSRVJfVENQREYsCgkgKgkJCQkJCQkJCQkJCSBQSFBFeGNlbF9TZXR0aW5nczo6UERGX1JFTkRFUkVSX0RPTVBERgoJICoJCQkJCQkJCQkJCSAgb3IgUEhQRXhjZWxfU2V0dGluZ3M6OlBERl9SRU5ERVJFUl9NUERGCgkgKiBAcGFyYW0JIHN0cmluZwkkbGlicmFyeUJhc2VEaXIJCURpcmVjdG9yeSBwYXRoIHRvIHRoZSBsaWJyYXJ5J3MgYmFzZSBmb2xkZXIKCSAqIEByZXR1cm4JIGJvb2xlYW4JCQkJCVN1Y2Nlc3Mgb3IgZmFpbHVyZQoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHNldFBkZlJlbmRlcmVyKCRsaWJyYXJ5TmFtZSwgJGxpYnJhcnlCYXNlRGlyKSB7CgkJaWYgKCFzZWxmOjpzZXRQZGZSZW5kZXJlck5hbWUoJGxpYnJhcnlOYW1lKSkKCQkJcmV0dXJuIEZBTFNFOwoJCXJldHVybiBzZWxmOjpzZXRQZGZSZW5kZXJlclBhdGgoJGxpYnJhcnlCYXNlRGlyKTsKCX0JLy8JZnVuY3Rpb24gc2V0UGRmUmVuZGVyZXIoKQoKCgkvKioKCSAqIElkZW50aWZ5IHRvIFBIUEV4Y2VsIHRoZSBleHRlcm5hbCBsaWJyYXJ5IHRvIHVzZSBmb3IgcmVuZGVyaW5nIFBERiBmaWxlcwoJICoKCSAqIEBwYXJhbQkgc3RyaW5nCSRsaWJyYXJ5TmFtZQkJSW50ZXJuYWwgcmVmZXJlbmNlIG5hbWUgb2YgdGhlIGxpYnJhcnkKCSAqCQkJCQkJCQkJCQllLmcuIFBIUEV4Y2VsX1NldHRpbmdzOjpQREZfUkVOREVSRVJfVENQREYsCgkgKgkJCQkJCQkJCQkJCSBQSFBFeGNlbF9TZXR0aW5nczo6UERGX1JFTkRFUkVSX0RPTVBERgoJICoJCQkJCQkJCQkJCSAgb3IgUEhQRXhjZWxfU2V0dGluZ3M6OlBERl9SRU5ERVJFUl9NUERGCgkgKiBAcmV0dXJuCSBib29sZWFuCQkJCQlTdWNjZXNzIG9yIGZhaWx1cmUKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBzZXRQZGZSZW5kZXJlck5hbWUoJGxpYnJhcnlOYW1lKSB7CgkJaWYgKCFpbl9hcnJheSgkbGlicmFyeU5hbWUsc2VsZjo6JF9wZGZSZW5kZXJlcnMpKSB7CgkJCXJldHVybiBGQUxTRTsKCQl9CgoJCXNlbGY6OiRfcGRmUmVuZGVyZXJOYW1lID0gJGxpYnJhcnlOYW1lOwoKCQlyZXR1cm4gVFJVRTsKCX0JLy8JZnVuY3Rpb24gc2V0UGRmUmVuZGVyZXJOYW1lKCkKCgoJLyoqCgkgKiBUZWxsIFBIUEV4Y2VsIHdoZXJlIHRvIGZpbmQgdGhlIGV4dGVybmFsIGxpYnJhcnkgdG8gdXNlIGZvciByZW5kZXJpbmcgUERGIGZpbGVzCgkgKgoJICogQHBhcmFtCSBzdHJpbmcJJGxpYnJhcnlCYXNlRGlyCQlEaXJlY3RvcnkgcGF0aCB0byB0aGUgbGlicmFyeSdzIGJhc2UgZm9sZGVyCgkgKiBAcmV0dXJuCSBib29sZWFuCQkJCQlTdWNjZXNzIG9yIGZhaWx1cmUKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBzZXRQZGZSZW5kZXJlclBhdGgoJGxpYnJhcnlCYXNlRGlyKSB7CgkJc2VsZjo6JF9wZGZSZW5kZXJlclBhdGggPSAkbGlicmFyeUJhc2VEaXI7CgoJCXJldHVybiBUUlVFOwoJfQkvLwlmdW5jdGlvbiBzZXRQZGZSZW5kZXJlclBhdGgoKQoKCgkvKioKCSAqIFJldHVybiB0aGUgUERGIFJlbmRlcmluZyBMaWJyYXJ5IHRoYXQgUEhQRXhjZWwgaXMgY3VycmVudGx5IGNvbmZpZ3VyZWQgdG8gdXNlIChlLmcuIGRvbXBkZikKCSAqCgkgKiBAcmV0dXJuCSBzdHJpbmcJCQkJCQlJbnRlcm5hbCByZWZlcmVuY2UgbmFtZSBvZiB0aGUgUERGIFJlbmRlcmluZyBMaWJyYXJ5IHRoYXQgUEhQRXhjZWwgaXMKCSAqCQkJCQkJCQkJCQljdXJyZW50bHkgY29uZmlndXJlZCB0byB1c2UKCSAqCQkJCQkJCQkJCQkJZS5nLiBQSFBFeGNlbF9TZXR0aW5nczo6UERGX1JFTkRFUkVSX1RDUERGLAoJICoJCQkJCQkJCQkJCQkJIFBIUEV4Y2VsX1NldHRpbmdzOjpQREZfUkVOREVSRVJfRE9NUERGCgkgKgkJCQkJCQkJCQkJCSAgb3IgUEhQRXhjZWxfU2V0dGluZ3M6OlBERl9SRU5ERVJFUl9NUERGCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0UGRmUmVuZGVyZXJOYW1lKCkgewoJCXJldHVybiBzZWxmOjokX3BkZlJlbmRlcmVyTmFtZTsKCX0JLy8JZnVuY3Rpb24gZ2V0UGRmUmVuZGVyZXJOYW1lKCkKCgoJLyoqCgkgKiBSZXR1cm4gdGhlIGRpcmVjdG9yeSBwYXRoIHRvIHRoZSBQREYgUmVuZGVyaW5nIExpYnJhcnkgdGhhdCBQSFBFeGNlbCBpcyBjdXJyZW50bHkgY29uZmlndXJlZCB0byB1c2UKCSAqCgkgKiBAcmV0dXJuCSBzdHJpbmcJCQkJCQlEaXJlY3RvcnkgUGF0aCB0byB0aGUgUERGIFJlbmRlcmluZyBMaWJyYXJ5IHRoYXQgUEhQRXhjZWwgaXMKCSAqCQkJCQkJCQkJCQljdXJyZW50bHkgY29uZmlndXJlZCB0byB1c2UKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRQZGZSZW5kZXJlclBhdGgoKSB7CgkJcmV0dXJuIHNlbGY6OiRfcGRmUmVuZGVyZXJQYXRoOwoJfQkvLwlmdW5jdGlvbiBnZXRQZGZSZW5kZXJlclBhdGgoKQoKfQ==]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Shared/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Shared/CodePage.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIFBIUEV4Y2VsCiAqCiAqIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICoKICogQGNhdGVnb3J5ICAgUEhQRXhjZWwKICogQHBhY2thZ2UgICAgUEhQRXhjZWxfU2hhcmVkCiAqIEBjb3B5cmlnaHQgIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwgKGh0dHA6Ly93d3cuY29kZXBsZXguY29tL1BIUEV4Y2VsKQogKiBAbGljZW5zZSAgICBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvb2xkLWxpY2Vuc2VzL2xncGwtMi4xLnR4dAlMR1BMCiAqIEB2ZXJzaW9uICAgIDEuNy43LCAyMDEyLTA1LTE5CiAqLwoKCi8qKgogKiBQSFBFeGNlbF9TaGFyZWRfQ29kZVBhZ2UKICoKICogQGNhdGVnb3J5ICAgUEhQRXhjZWwKICogQHBhY2thZ2UgICAgUEhQRXhjZWxfU2hhcmVkCiAqIEBjb3B5cmlnaHQgIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwgKGh0dHA6Ly93d3cuY29kZXBsZXguY29tL1BIUEV4Y2VsKQogKi8KY2xhc3MgUEhQRXhjZWxfU2hhcmVkX0NvZGVQYWdlCnsKCS8qKgoJICogQ29udmVydCBNaWNyb3NvZnQgQ29kZSBQYWdlIElkZW50aWZpZXIgdG8gQ29kZSBQYWdlIE5hbWUgd2hpY2ggaWNvbnYKCSAqIGFuZCBtYnN0cmluZyB1bmRlcnN0YW5kcwoJICoKCSAqIEBwYXJhbSBpbnQgJG51bWJlciBNaWNyb3NvZnQgQ29kZSBQYWdlIEluZGVudGlmaWVyCgkgKiBAcmV0dXJuIHN0cmluZyBDb2RlIFBhZ2UgTmFtZQoJICogQHRocm93cyBFeGNlcHRpb24KCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBOdW1iZXJUb05hbWUoJGNvZGVQYWdlID0gJzEyNTInKQoJewoJCXN3aXRjaCAoJGNvZGVQYWdlKSB7CgkJCWNhc2UgMzY3OglyZXR1cm4gJ0FTQ0lJJzsJCQkJYnJlYWs7CS8vCUFTQ0lJCgkJCWNhc2UgNDM3OglyZXR1cm4gJ0NQNDM3JzsJCQkJYnJlYWs7CS8vCU9FTSBVUwoJCQljYXNlIDcyMDoJdGhyb3cgbmV3IEV4Y2VwdGlvbignQ29kZSBwYWdlIDcyMCBub3Qgc3VwcG9ydGVkLicpOwoJCQkJCQkJCQkJCQkJYnJlYWs7CS8vCU9FTSBBcmFiaWMKCQkJY2FzZSA3Mzc6CXJldHVybiAnQ1A3MzcnOwkJCQlicmVhazsJLy8JT0VNIEdyZWVrCgkJCWNhc2UgNzc1OglyZXR1cm4gJ0NQNzc1JzsJCQkJYnJlYWs7CS8vCU9FTSBCYWx0aWMKCQkJY2FzZSA4NTA6CXJldHVybiAnQ1A4NTAnOwkJCQlicmVhazsJLy8JT0VNIExhdGluIEkKCQkJY2FzZSA4NTI6CXJldHVybiAnQ1A4NTInOwkJCQlicmVhazsJLy8JT0VNIExhdGluIElJIChDZW50cmFsIEV1cm9wZWFuKQoJCQljYXNlIDg1NToJcmV0dXJuICdDUDg1NSc7CQkJCWJyZWFrOwkvLwlPRU0gQ3lyaWxsaWMKCQkJY2FzZSA4NTc6CXJldHVybiAnQ1A4NTcnOwkJCQlicmVhazsJLy8JT0VNIFR1cmtpc2gKCQkJY2FzZSA4NTg6CXJldHVybiAnQ1A4NTgnOwkJCQlicmVhazsJLy8JT0VNIE11bHRpbGluZ3VhbCBMYXRpbiBJIHdpdGggRXVybwoJCQljYXNlIDg2MDoJcmV0dXJuICdDUDg2MCc7CQkJCWJyZWFrOwkvLwlPRU0gUG9ydHVnZXNlCgkJCWNhc2UgODYxOglyZXR1cm4gJ0NQODYxJzsJCQkJYnJlYWs7CS8vCU9FTSBJY2VsYW5kaWMKCQkJY2FzZSA4NjI6CXJldHVybiAnQ1A4NjInOwkJCQlicmVhazsJLy8JT0VNIEhlYnJldwoJCQljYXNlIDg2MzoJcmV0dXJuICdDUDg2Myc7CQkJCWJyZWFrOwkvLwlPRU0gQ2FuYWRpYW4gKEZyZW5jaCkKCQkJY2FzZSA4NjQ6CXJldHVybiAnQ1A4NjQnOwkJCQlicmVhazsJLy8JT0VNIEFyYWJpYwoJCQljYXNlIDg2NToJcmV0dXJuICdDUDg2NSc7CQkJCWJyZWFrOwkvLwlPRU0gTm9yZGljCgkJCWNhc2UgODY2OglyZXR1cm4gJ0NQODY2JzsJCQkJYnJlYWs7CS8vCU9FTSBDeXJpbGxpYyAoUnVzc2lhbikKCQkJY2FzZSA4Njk6CXJldHVybiAnQ1A4NjknOwkJCQlicmVhazsJLy8JT0VNIEdyZWVrIChNb2Rlcm4pCgkJCWNhc2UgODc0OglyZXR1cm4gJ0NQODc0JzsJCQkJYnJlYWs7CS8vCUFOU0kgVGhhaQoJCQljYXNlIDkzMjoJcmV0dXJuICdDUDkzMic7CQkJCWJyZWFrOwkvLwlBTlNJIEphcGFuZXNlIFNoaWZ0LUpJUwoJCQljYXNlIDkzNjoJcmV0dXJuICdDUDkzNic7CQkJCWJyZWFrOwkvLwlBTlNJIENoaW5lc2UgU2ltcGxpZmllZCBHQksKCQkJY2FzZSA5NDk6CXJldHVybiAnQ1A5NDknOwkJCQlicmVhazsJLy8JQU5TSSBLb3JlYW4gKFdhbnN1bmcpCgkJCWNhc2UgOTUwOglyZXR1cm4gJ0NQOTUwJzsJCQkJYnJlYWs7CS8vCUFOU0kgQ2hpbmVzZSBUcmFkaXRpb25hbCBCSUc1CgkJCWNhc2UgMTIwMDoJcmV0dXJuICdVVEYtMTZMRSc7CQkJYnJlYWs7CS8vCVVURi0xNiAoQklGRjgpCgkJCWNhc2UgMTI1MDoJcmV0dXJuICdDUDEyNTAnOwkJCWJyZWFrOwkvLwlBTlNJIExhdGluIElJIChDZW50cmFsIEV1cm9wZWFuKQoJCQljYXNlIDEyNTE6CXJldHVybiAnQ1AxMjUxJzsJCQlicmVhazsJLy8JQU5TSSBDeXJpbGxpYwoJCQljYXNlIDA6CQkvLwlDb2RlUGFnZSBpcyBub3QgYWx3YXlzIGNvcnJlY3RseSBzZXQgd2hlbiB0aGUgeGxzIGZpbGUgd2FzIHNhdmVkIGJ5IEFwcGxlJ3MgTnVtYmVycyBwcm9ncmFtCgkJCWNhc2UgMTI1MjoJcmV0dXJuICdDUDEyNTInOwkJCWJyZWFrOwkvLwlBTlNJIExhdGluIEkgKEJJRkY0LUJJRkY3KQoJCQljYXNlIDEyNTM6CXJldHVybiAnQ1AxMjUzJzsJCQlicmVhazsJLy8JQU5TSSBHcmVlawoJCQljYXNlIDEyNTQ6CXJldHVybiAnQ1AxMjU0JzsJCQlicmVhazsJLy8JQU5TSSBUdXJraXNoCgkJCWNhc2UgMTI1NToJcmV0dXJuICdDUDEyNTUnOwkJCWJyZWFrOwkvLwlBTlNJIEhlYnJldwoJCQljYXNlIDEyNTY6CXJldHVybiAnQ1AxMjU2JzsJCQlicmVhazsJLy8JQU5TSSBBcmFiaWMKCQkJY2FzZSAxMjU3OglyZXR1cm4gJ0NQMTI1Nyc7CQkJYnJlYWs7CS8vCUFOU0kgQmFsdGljCgkJCWNhc2UgMTI1ODoJcmV0dXJuICdDUDEyNTgnOwkJCWJyZWFrOwkvLwlBTlNJIFZpZXRuYW1lc2UKCQkJY2FzZSAxMzYxOglyZXR1cm4gJ0NQMTM2MSc7CQkJYnJlYWs7CS8vCUFOU0kgS29yZWFuIChKb2hhYikKCQkJY2FzZSAxMDAwMDoJcmV0dXJuICdNQUMnOwkJCQlicmVhazsJLy8JQXBwbGUgUm9tYW4KCQkJY2FzZSAxMDAwNjoJcmV0dXJuICdNQUNHUkVFSyc7CQkJYnJlYWs7CS8vCU1hY2ludG9zaCBHcmVlawoJCQljYXNlIDEwMDA3OglyZXR1cm4gJ01BQ0NZUklMTElDJzsJCWJyZWFrOwkvLwlNYWNpbnRvc2ggQ3lyaWxsaWMKCQkJY2FzZSAxMDAyOToJcmV0dXJuICdNQUNDRU5UUkFMRVVST1BFJzsJYnJlYWs7CS8vCU1hY2ludG9zaCBDZW50cmFsIEV1cm9wZQoJCQljYXNlIDEwMDc5OiByZXR1cm4gJ01BQ0lDRUxBTkQnOwkJYnJlYWs7CS8vCU1hY2ludG9zaCBJY2VsYW5kaWMKCQkJY2FzZSAxMDA4MTogcmV0dXJuICdNQUNUVVJLSVNIJzsJCWJyZWFrOwkvLwlNYWNpbnRvc2ggVHVya2lzaAoJCQljYXNlIDMyNzY4OglyZXR1cm4gJ01BQyc7CQkJCWJyZWFrOwkvLwlBcHBsZSBSb21hbgoJCQljYXNlIDMyNzY5Ogl0aHJvdyBuZXcgRXhjZXB0aW9uKCdDb2RlIHBhZ2UgMzI3Njkgbm90IHN1cHBvcnRlZC4nKTsKCQkJCQkJCQkJCQkJCWJyZWFrOwkvLwlBTlNJIExhdGluIEkgKEJJRkYyLUJJRkYzKQoJCQljYXNlIDY1MDAwOglyZXR1cm4gJ1VURi03JzsJCQkJYnJlYWs7CS8vCVVuaWNvZGUgKFVURi03KQoJCQljYXNlIDY1MDAxOglyZXR1cm4gJ1VURi04JzsJCQkJYnJlYWs7CS8vCVVuaWNvZGUgKFVURi04KQoJCX0KCgkJdGhyb3cgbmV3IEV4Y2VwdGlvbignVW5rbm93biBjb2RlcGFnZTogJyAuICRjb2RlUGFnZSk7Cgl9Cgp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Shared/Date.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBQSFBFeGNlbAogKgogKiBDb3B5cmlnaHQgKGMpIDIwMDYgLSAyMDEyIFBIUEV4Y2VsCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCiAqCiAqIEBjYXRlZ29yeSAgIFBIUEV4Y2VsCiAqIEBwYWNrYWdlCVBIUEV4Y2VsX1NoYXJlZAogKiBAY29weXJpZ2h0ICBDb3B5cmlnaHQgKGMpIDIwMDYgLSAyMDEyIFBIUEV4Y2VsIChodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9QSFBFeGNlbCkKICogQGxpY2Vuc2UJaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL29sZC1saWNlbnNlcy9sZ3BsLTIuMS50eHQJTEdQTAogKiBAdmVyc2lvbgkxLjcuNywgMjAxMi0wNS0xOQogKi8KCgovKioKICogUEhQRXhjZWxfU2hhcmVkX0RhdGUKICoKICogQGNhdGVnb3J5ICAgUEhQRXhjZWwKICogQHBhY2thZ2UJUEhQRXhjZWxfU2hhcmVkCiAqIEBjb3B5cmlnaHQgIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwgKGh0dHA6Ly93d3cuY29kZXBsZXguY29tL1BIUEV4Y2VsKQogKi8KY2xhc3MgUEhQRXhjZWxfU2hhcmVkX0RhdGUKewoJLyoqIGNvbnN0YW50cyAqLwoJY29uc3QgQ0FMRU5EQVJfV0lORE9XU18xOTAwID0gMTkwMDsJCS8vCUJhc2UgZGF0ZSBvZiAxc3QgSmFuIDE5MDAgPSAxLjAKCWNvbnN0IENBTEVOREFSX01BQ18xOTA0ID0gMTkwNDsJCQkvLwlCYXNlIGRhdGUgb2YgMm5kIEphbiAxOTA0ID0gMS4wCgoJLyoKCSAqIE5hbWVzIG9mIHRoZSBtb250aHMgb2YgdGhlIHllYXIsIGluZGV4ZWQgYnkgc2hvcnRuYW1lCgkgKiBQbGFubmVkIHVzYWdlIGZvciBsb2NhbGUgc2V0dGluZ3MKCSAqCgkgKiBAcHVibGljCgkgKiBAdmFyCXN0cmluZ1tdCgkgKi8KCXB1YmxpYyBzdGF0aWMgJF9tb250aE5hbWVzID0gYXJyYXkoCSdKYW4nID0+ICdKYW51YXJ5JywKCQkJCQkJCQkJCSdGZWInID0+ICdGZWJydWFyeScsCgkJCQkJCQkJCQknTWFyJyA9PiAnTWFyY2gnLAoJCQkJCQkJCQkJJ0FwcicgPT4gJ0FwcmlsJywKCQkJCQkJCQkJCSdNYXknID0+ICdNYXknLAoJCQkJCQkJCQkJJ0p1bicgPT4gJ0p1bmUnLAoJCQkJCQkJCQkJJ0p1bCcgPT4gJ0p1bHknLAoJCQkJCQkJCQkJJ0F1ZycgPT4gJ0F1Z3VzdCcsCgkJCQkJCQkJCQknU2VwJyA9PiAnU2VwdGVtYmVyJywKCQkJCQkJCQkJCSdPY3QnID0+ICdPY3RvYmVyJywKCQkJCQkJCQkJCSdOb3YnID0+ICdOb3ZlbWJlcicsCgkJCQkJCQkJCQknRGVjJyA9PiAnRGVjZW1iZXInCgkJCQkJCQkJCSAgKTsKCgkvKgoJICogQmFzZSBjYWxlbmRhciB5ZWFyIHRvIHVzZSBmb3IgY2FsY3VsYXRpb25zCgkgKgoJICogQHByaXZhdGUKCSAqIEB2YXIJaW50CgkgKi8KCXByaXZhdGUgc3RhdGljICRFeGNlbEJhc2VEYXRlCT0gc2VsZjo6Q0FMRU5EQVJfV0lORE9XU18xOTAwOwoKCS8qCgkgKiBPYmplY3QgdHlwZSBmb3IgUEhQIERhdGUvVGltZSB2YWx1ZXMKCSAqCgkgKiBAcHJpdmF0ZQoJICogQHZhcglzdHJpbmcKCSAqLwoJcHVibGljIHN0YXRpYyAkZGF0ZVRpbWVPYmplY3RUeXBlCT0gJ0RhdGVUaW1lJzsKCgoJLyoqCgkgKiBTZXQgdGhlIEV4Y2VsIGNhbGVuZGFyIChXaW5kb3dzIDE5MDAgb3IgTWFjIDE5MDQpCgkgKgoJICogQHBhcmFtCSBpbnRlZ2VyCSRiYXNlRGF0ZQkJCUV4Y2VsIGJhc2UgZGF0ZQoJICogQHJldHVybgkgYm9vbGVhbgkJCQkJCVN1Y2Nlc3Mgb3IgZmFpbHVyZQoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHNldEV4Y2VsQ2FsZW5kYXIoJGJhc2VEYXRlKSB7CgkJaWYgKCgkYmFzZURhdGUgPT0gc2VsZjo6Q0FMRU5EQVJfV0lORE9XU18xOTAwKSB8fAoJCQkoJGJhc2VEYXRlID09IHNlbGY6OkNBTEVOREFSX01BQ18xOTA0KSkgewoJCQlzZWxmOjokRXhjZWxCYXNlRGF0ZSA9ICRiYXNlRGF0ZTsKCQkJcmV0dXJuIFRydWU7CgkJfQoJCXJldHVybiBGYWxzZTsKCX0JLy8JZnVuY3Rpb24gc2V0RXhjZWxDYWxlbmRhcigpCgoKCS8qKgoJICogUmV0dXJuIHRoZSBFeGNlbCBjYWxlbmRhciAoV2luZG93cyAxOTAwIG9yIE1hYyAxOTA0KQoJICoKCSAqIEByZXR1cm4JIGludGVnZXIJJGJhc2VEYXRlCQkJRXhjZWwgYmFzZSBkYXRlCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0RXhjZWxDYWxlbmRhcigpIHsKCQlyZXR1cm4gc2VsZjo6JEV4Y2VsQmFzZURhdGU7Cgl9CS8vCWZ1bmN0aW9uIGdldEV4Y2VsQ2FsZW5kYXIoKQoKCgkvKioKCSAqIENvbnZlcnQgYSBkYXRlIGZyb20gRXhjZWwgdG8gUEhQCgkgKgoJICogQHBhcmFtCSBsb25nCSAkZGF0ZVZhbHVlCQlFeGNlbCBkYXRlL3RpbWUgdmFsdWUKCSAqIEByZXR1cm4JIGxvbmcJCQkJCVBIUCBzZXJpYWxpemVkIGRhdGUvdGltZQoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIEV4Y2VsVG9QSFAoJGRhdGVWYWx1ZSA9IDApIHsKCQlpZiAoc2VsZjo6JEV4Y2VsQmFzZURhdGUgPT0gc2VsZjo6Q0FMRU5EQVJfV0lORE9XU18xOTAwKSB7CgkJCSRteUV4Y2VsQmFzZURhdGUgPSAyNTU2OTsKCQkJLy8JQWRqdXN0IGZvciB0aGUgc3B1cmlvdXMgMjktRmViLTE5MDAgKERheSA2MCkKCQkJaWYgKCRkYXRlVmFsdWUgPCA2MCkgewoJCQkJLS0kbXlFeGNlbEJhc2VEYXRlOwoJCQl9CgkJfSBlbHNlIHsKCQkJJG15RXhjZWxCYXNlRGF0ZSA9IDI0MTA3OwoJCX0KCgkJLy8gUGVyZm9ybSBjb252ZXJzaW9uCgkJaWYgKCRkYXRlVmFsdWUgPj0gMSkgewoJCQkkdXRjRGF5cyA9ICRkYXRlVmFsdWUgLSAkbXlFeGNlbEJhc2VEYXRlOwoJCQkkcmV0dXJuVmFsdWUgPSByb3VuZCgkdXRjRGF5cyAqIDg2NDAwKTsKCQkJaWYgKCgkcmV0dXJuVmFsdWUgPD0gUEhQX0lOVF9NQVgpICYmICgkcmV0dXJuVmFsdWUgPj0gLVBIUF9JTlRfTUFYKSkgewoJCQkJJHJldHVyblZhbHVlID0gKGludGVnZXIpICRyZXR1cm5WYWx1ZTsKCQkJfQoJCX0gZWxzZSB7CgkJCSRob3VycyA9IHJvdW5kKCRkYXRlVmFsdWUgKiAyNCk7CgkJCSRtaW5zID0gcm91bmQoJGRhdGVWYWx1ZSAqIDE0NDApIC0gcm91bmQoJGhvdXJzICogNjApOwoJCQkkc2VjcyA9IHJvdW5kKCRkYXRlVmFsdWUgKiA4NjQwMCkgLSByb3VuZCgkaG91cnMgKiAzNjAwKSAtIHJvdW5kKCRtaW5zICogNjApOwoJCQkkcmV0dXJuVmFsdWUgPSAoaW50ZWdlcikgZ21ta3RpbWUoJGhvdXJzLCAkbWlucywgJHNlY3MpOwoJCX0KCgkJLy8gUmV0dXJuCgkJcmV0dXJuICRyZXR1cm5WYWx1ZTsKCX0JLy8JZnVuY3Rpb24gRXhjZWxUb1BIUCgpCgoKCS8qKgoJICogQ29udmVydCBhIGRhdGUgZnJvbSBFeGNlbCB0byBhIFBIUCBEYXRlL1RpbWUgb2JqZWN0CgkgKgoJICogQHBhcmFtCSBsb25nCSAkZGF0ZVZhbHVlCQlFeGNlbCBkYXRlL3RpbWUgdmFsdWUKCSAqIEByZXR1cm4JIGxvbmcJCQkJCVBIUCBkYXRlL3RpbWUgb2JqZWN0CgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gRXhjZWxUb1BIUE9iamVjdCgkZGF0ZVZhbHVlID0gMCkgewoJCSRkYXRlVGltZSA9IHNlbGY6OkV4Y2VsVG9QSFAoJGRhdGVWYWx1ZSk7CgkJJGRheXMgPSBmbG9vcigkZGF0ZVRpbWUgLyA4NjQwMCk7CgkJJHRpbWUgPSByb3VuZCgoKCRkYXRlVGltZSAvIDg2NDAwKSAtICRkYXlzKSAqIDg2NDAwKTsKCQkkaG91cnMgPSByb3VuZCgkdGltZSAvIDM2MDApOwoJCSRtaW51dGVzID0gcm91bmQoJHRpbWUgLyA2MCkgLSAoJGhvdXJzICogNjApOwoJCSRzZWNvbmRzID0gcm91bmQoJHRpbWUpIC0gKCRob3VycyAqIDM2MDApIC0gKCRtaW51dGVzICogNjApOwoKCQkkZGF0ZU9iaiA9IGRhdGVfY3JlYXRlKCcxLUphbi0xOTcwKycuJGRheXMuJyBkYXlzJyk7CgkJJGRhdGVPYmotPnNldFRpbWUoJGhvdXJzLCRtaW51dGVzLCRzZWNvbmRzKTsKCgkJcmV0dXJuICRkYXRlT2JqOwoJfQkvLwlmdW5jdGlvbiBFeGNlbFRvUEhQT2JqZWN0KCkKCgoJLyoqCgkgKiBDb252ZXJ0IGEgZGF0ZSBmcm9tIFBIUCB0byBFeGNlbAoJICoKCSAqIEBwYXJhbQkgbWl4ZWQJCSRkYXRlVmFsdWUJUEhQIHNlcmlhbGl6ZWQgZGF0ZS90aW1lIG9yIGRhdGUgb2JqZWN0CgkgKiBAcmV0dXJuCSBtaXhlZAkJCQkJRXhjZWwgZGF0ZS90aW1lIHZhbHVlCgkgKgkJCQkJCQkJCQlvciBib29sZWFuIEZhbHNlIG9uIGZhaWx1cmUKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBQSFBUb0V4Y2VsKCRkYXRlVmFsdWUgPSAwKSB7CgkJJHNhdmVUaW1lWm9uZSA9IGRhdGVfZGVmYXVsdF90aW1lem9uZV9nZXQoKTsKCQlkYXRlX2RlZmF1bHRfdGltZXpvbmVfc2V0KCdVVEMnKTsKCQkkcmV0VmFsdWUgPSBGYWxzZTsKCQlpZiAoKGlzX29iamVjdCgkZGF0ZVZhbHVlKSkgJiYgKCRkYXRlVmFsdWUgaW5zdGFuY2VvZiBzZWxmOjokZGF0ZVRpbWVPYmplY3RUeXBlKSkgewoJCQkkcmV0VmFsdWUgPSBzZWxmOjpGb3JtYXR0ZWRQSFBUb0V4Y2VsKCAkZGF0ZVZhbHVlLT5mb3JtYXQoJ1knKSwgJGRhdGVWYWx1ZS0+Zm9ybWF0KCdtJyksICRkYXRlVmFsdWUtPmZvcm1hdCgnZCcpLAoJCQkJCQkJCQkJCQkgICAkZGF0ZVZhbHVlLT5mb3JtYXQoJ0gnKSwgJGRhdGVWYWx1ZS0+Zm9ybWF0KCdpJyksICRkYXRlVmFsdWUtPmZvcm1hdCgncycpCgkJCQkJCQkJCQkJCSApOwoJCX0gZWxzZWlmIChpc19udW1lcmljKCRkYXRlVmFsdWUpKSB7CgkJCSRyZXRWYWx1ZSA9IHNlbGY6OkZvcm1hdHRlZFBIUFRvRXhjZWwoIGRhdGUoJ1knLCRkYXRlVmFsdWUpLCBkYXRlKCdtJywkZGF0ZVZhbHVlKSwgZGF0ZSgnZCcsJGRhdGVWYWx1ZSksCgkJCQkJCQkJCQkJCSAgIGRhdGUoJ0gnLCRkYXRlVmFsdWUpLCBkYXRlKCdpJywkZGF0ZVZhbHVlKSwgZGF0ZSgncycsJGRhdGVWYWx1ZSkKCQkJCQkJCQkJCQkJICk7CgkJfQoJCWRhdGVfZGVmYXVsdF90aW1lem9uZV9zZXQoJHNhdmVUaW1lWm9uZSk7CgoJCXJldHVybiAkcmV0VmFsdWU7Cgl9CS8vCWZ1bmN0aW9uIFBIUFRvRXhjZWwoKQoKCgkvKioKCSAqIEZvcm1hdHRlZFBIUFRvRXhjZWwKCSAqCgkgKiBAcGFyYW0JbG9uZwkkeWVhcgoJICogQHBhcmFtCWxvbmcJJG1vbnRoCgkgKiBAcGFyYW0JbG9uZwkkZGF5CgkgKiBAcGFyYW0JbG9uZwkkaG91cnMKCSAqIEBwYXJhbQlsb25nCSRtaW51dGVzCgkgKiBAcGFyYW0JbG9uZwkkc2Vjb25kcwoJICogQHJldHVybiAgbG9uZwkJCQlFeGNlbCBkYXRlL3RpbWUgdmFsdWUKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBGb3JtYXR0ZWRQSFBUb0V4Y2VsKCR5ZWFyLCAkbW9udGgsICRkYXksICRob3Vycz0wLCAkbWludXRlcz0wLCAkc2Vjb25kcz0wKSB7CgkJaWYgKHNlbGY6OiRFeGNlbEJhc2VEYXRlID09IHNlbGY6OkNBTEVOREFSX1dJTkRPV1NfMTkwMCkgewoJCQkvLwoJCQkvLwlGdWRnZSBmYWN0b3IgZm9yIHRoZSBlcnJvbmVvdXMgZmFjdCB0aGF0IHRoZSB5ZWFyIDE5MDAgaXMgdHJlYXRlZCBhcyBhIExlYXAgWWVhciBpbiBNUyBFeGNlbAoJCQkvLwlUaGlzIGFmZmVjdHMgZXZlcnkgZGF0ZSBmb2xsb3dpbmcgMjh0aCBGZWJydWFyeSAxOTAwCgkJCS8vCgkJCSRleGNlbDE5MDBpc0xlYXBZZWFyID0gVHJ1ZTsKCQkJaWYgKCgkeWVhciA9PSAxOTAwKSAmJiAoJG1vbnRoIDw9IDIpKSB7ICRleGNlbDE5MDBpc0xlYXBZZWFyID0gRmFsc2U7IH0KCQkJJG15RXhjZWxCYXNlRGF0ZSA9IDI0MTUwMjA7CgkJfSBlbHNlIHsKCQkJJG15RXhjZWxCYXNlRGF0ZSA9IDI0MTY0ODE7CgkJCSRleGNlbDE5MDBpc0xlYXBZZWFyID0gRmFsc2U7CgkJfQoKCQkvLwlKdWxpYW4gYmFzZSBkYXRlIEFkanVzdG1lbnQKCQlpZiAoJG1vbnRoID4gMikgewoJCQkkbW9udGggLT0gMzsKCQl9IGVsc2UgewoJCQkkbW9udGggKz0gOTsKCQkJLS0keWVhcjsKCQl9CgoJCS8vCUNhbGN1bGF0ZSB0aGUgSnVsaWFuIERhdGUsIHRoZW4gc3VidHJhY3QgdGhlIEV4Y2VsIGJhc2UgZGF0ZSAoSkQgMjQxNTAyMCA9IDMxLURlYy0xODk5IEdpdmluZyBFeGNlbCBEYXRlIG9mIDApCgkJJGNlbnR1cnkgPSBzdWJzdHIoJHllYXIsMCwyKTsKCQkkZGVjYWRlID0gc3Vic3RyKCR5ZWFyLDIsMik7CgkJJGV4Y2VsRGF0ZSA9IGZsb29yKCgxNDYwOTcgKiAkY2VudHVyeSkgLyA0KSArIGZsb29yKCgxNDYxICogJGRlY2FkZSkgLyA0KSArIGZsb29yKCgxNTMgKiAkbW9udGggKyAyKSAvIDUpICsgJGRheSArIDE3MjExMTkgLSAkbXlFeGNlbEJhc2VEYXRlICsgJGV4Y2VsMTkwMGlzTGVhcFllYXI7CgoJCSRleGNlbFRpbWUgPSAoKCRob3VycyAqIDM2MDApICsgKCRtaW51dGVzICogNjApICsgJHNlY29uZHMpIC8gODY0MDA7CgoJCXJldHVybiAoZmxvYXQpICRleGNlbERhdGUgKyAkZXhjZWxUaW1lOwoJfQkvLwlmdW5jdGlvbiBGb3JtYXR0ZWRQSFBUb0V4Y2VsKCkKCgoJLyoqCgkgKiBJcyBhIGdpdmVuIGNlbGwgYSBkYXRlL3RpbWU/CgkgKgoJICogQHBhcmFtCSBQSFBFeGNlbF9DZWxsCSRwQ2VsbAoJICogQHJldHVybgkgYm9vbGVhbgoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGlzRGF0ZVRpbWUoUEhQRXhjZWxfQ2VsbCAkcENlbGwpIHsKCQlyZXR1cm4gc2VsZjo6aXNEYXRlVGltZUZvcm1hdCgkcENlbGwtPmdldFBhcmVudCgpLT5nZXRTdHlsZSgkcENlbGwtPmdldENvb3JkaW5hdGUoKSktPmdldE51bWJlckZvcm1hdCgpKTsKCX0JLy8JZnVuY3Rpb24gaXNEYXRlVGltZSgpCgoKCS8qKgoJICogSXMgYSBnaXZlbiBudW1iZXIgZm9ybWF0IGEgZGF0ZS90aW1lPwoJICoKCSAqIEBwYXJhbQkgUEhQRXhjZWxfU3R5bGVfTnVtYmVyRm9ybWF0CSRwRm9ybWF0CgkgKiBAcmV0dXJuCSBib29sZWFuCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gaXNEYXRlVGltZUZvcm1hdChQSFBFeGNlbF9TdHlsZV9OdW1iZXJGb3JtYXQgJHBGb3JtYXQpIHsKCQlyZXR1cm4gc2VsZjo6aXNEYXRlVGltZUZvcm1hdENvZGUoJHBGb3JtYXQtPmdldEZvcm1hdENvZGUoKSk7Cgl9CS8vCWZ1bmN0aW9uIGlzRGF0ZVRpbWVGb3JtYXQoKQoKCglwcml2YXRlIHN0YXRpYwkkcG9zc2libGVEYXRlRm9ybWF0Q2hhcmFjdGVycyA9ICd5bWRIcyc7CgoJLyoqCgkgKiBJcyBhIGdpdmVuIG51bWJlciBmb3JtYXQgY29kZSBhIGRhdGUvdGltZT8KCSAqCgkgKiBAcGFyYW0JIHN0cmluZwkkcEZvcm1hdENvZGUKCSAqIEByZXR1cm4JIGJvb2xlYW4KCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBpc0RhdGVUaW1lRm9ybWF0Q29kZSgkcEZvcm1hdENvZGUgPSAnJykgewoJCS8vIFN3aXRjaCBvbiBmb3JtYXRjb2RlCgkJc3dpdGNoICgkcEZvcm1hdENvZGUpIHsKCQkJY2FzZSBQSFBFeGNlbF9TdHlsZV9OdW1iZXJGb3JtYXQ6OkZPUk1BVF9EQVRFX1lZWVlNTUREOgoJCQljYXNlIFBIUEV4Y2VsX1N0eWxlX051bWJlckZvcm1hdDo6Rk9STUFUX0RBVEVfWVlZWU1NREQyOgoJCQljYXNlIFBIUEV4Y2VsX1N0eWxlX051bWJlckZvcm1hdDo6Rk9STUFUX0RBVEVfRERNTVlZWVk6CgkJCWNhc2UgUEhQRXhjZWxfU3R5bGVfTnVtYmVyRm9ybWF0OjpGT1JNQVRfREFURV9ETVlTTEFTSDoKCQkJY2FzZSBQSFBFeGNlbF9TdHlsZV9OdW1iZXJGb3JtYXQ6OkZPUk1BVF9EQVRFX0RNWU1JTlVTOgoJCQljYXNlIFBIUEV4Y2VsX1N0eWxlX051bWJlckZvcm1hdDo6Rk9STUFUX0RBVEVfRE1NSU5VUzoKCQkJY2FzZSBQSFBFeGNlbF9TdHlsZV9OdW1iZXJGb3JtYXQ6OkZPUk1BVF9EQVRFX01ZTUlOVVM6CgkJCWNhc2UgUEhQRXhjZWxfU3R5bGVfTnVtYmVyRm9ybWF0OjpGT1JNQVRfREFURV9EQVRFVElNRToKCQkJY2FzZSBQSFBFeGNlbF9TdHlsZV9OdW1iZXJGb3JtYXQ6OkZPUk1BVF9EQVRFX1RJTUUxOgoJCQljYXNlIFBIUEV4Y2VsX1N0eWxlX051bWJlckZvcm1hdDo6Rk9STUFUX0RBVEVfVElNRTI6CgkJCWNhc2UgUEhQRXhjZWxfU3R5bGVfTnVtYmVyRm9ybWF0OjpGT1JNQVRfREFURV9USU1FMzoKCQkJY2FzZSBQSFBFeGNlbF9TdHlsZV9OdW1iZXJGb3JtYXQ6OkZPUk1BVF9EQVRFX1RJTUU0OgoJCQljYXNlIFBIUEV4Y2VsX1N0eWxlX051bWJlckZvcm1hdDo6Rk9STUFUX0RBVEVfVElNRTU6CgkJCWNhc2UgUEhQRXhjZWxfU3R5bGVfTnVtYmVyRm9ybWF0OjpGT1JNQVRfREFURV9USU1FNjoKCQkJY2FzZSBQSFBFeGNlbF9TdHlsZV9OdW1iZXJGb3JtYXQ6OkZPUk1BVF9EQVRFX1RJTUU3OgoJCQljYXNlIFBIUEV4Y2VsX1N0eWxlX051bWJlckZvcm1hdDo6Rk9STUFUX0RBVEVfVElNRTg6CgkJCWNhc2UgUEhQRXhjZWxfU3R5bGVfTnVtYmVyRm9ybWF0OjpGT1JNQVRfREFURV9ZWVlZTU1ERFNMQVNIOgoJCQljYXNlIFBIUEV4Y2VsX1N0eWxlX051bWJlckZvcm1hdDo6Rk9STUFUX0RBVEVfWExTWDE0OgoJCQljYXNlIFBIUEV4Y2VsX1N0eWxlX051bWJlckZvcm1hdDo6Rk9STUFUX0RBVEVfWExTWDE1OgoJCQljYXNlIFBIUEV4Y2VsX1N0eWxlX051bWJlckZvcm1hdDo6Rk9STUFUX0RBVEVfWExTWDE2OgoJCQljYXNlIFBIUEV4Y2VsX1N0eWxlX051bWJlckZvcm1hdDo6Rk9STUFUX0RBVEVfWExTWDE3OgoJCQljYXNlIFBIUEV4Y2VsX1N0eWxlX051bWJlckZvcm1hdDo6Rk9STUFUX0RBVEVfWExTWDIyOgoJCQkJcmV0dXJuIHRydWU7CgkJfQoKCQkvLwlUeXBpY2FsbHkgbnVtYmVyLCBjdXJyZW5jeSBvciBhY2NvdW50aW5nIChvciBvY2Nhc2lvbmFsbHkgZnJhY3Rpb24pIGZvcm1hdHMKCQlpZiAoKHN1YnN0cigkcEZvcm1hdENvZGUsMCwxKSA9PSAnXycpIHx8IChzdWJzdHIoJHBGb3JtYXRDb2RlLDAsMikgPT0gJzAgJykpIHsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCQkvLyBUcnkgY2hlY2tpbmcgZm9yIGFueSBvZiB0aGUgZGF0ZSBmb3JtYXR0aW5nIGNoYXJhY3RlcnMgdGhhdCBkb24ndCBhcHBlYXIgd2l0aGluIHNxdWFyZSBicmFjZXMKCQlpZiAocHJlZ19tYXRjaCgnLyhefFxdKVteXFtdKlsnLnNlbGY6OiRwb3NzaWJsZURhdGVGb3JtYXRDaGFyYWN0ZXJzLiddL2knLCRwRm9ybWF0Q29kZSkpIHsKCQkJLy8JV2UgbWlnaHQgYWxzbyBoYXZlIGEgZm9ybWF0IG1hc2sgY29udGFpbmluZyBxdW90ZWQgc3RyaW5ncy4uLgoJCQkvLwkJd2UgZG9uJ3Qgd2FudCB0byB0ZXN0IGZvciBhbnkgb2Ygb3VyIGNoYXJhY3RlcnMgd2l0aGluIHRoZSBxdW90ZWQgYmxvY2tzCgkJCWlmIChzdHJwb3MoJHBGb3JtYXRDb2RlLCciJykgIT09IGZhbHNlKSB7CgkJCQkkaSA9IGZhbHNlOwoJCQkJZm9yZWFjaChleHBsb2RlKCciJywkcEZvcm1hdENvZGUpIGFzICRzdWJWYWwpIHsKCQkJCQkvLwlPbmx5IHRlc3QgaW4gYWx0ZXJuYXRlIGFycmF5IGVudHJpZXMgKHRoZSBub24tcXVvdGVkIGJsb2NrcykKCQkJCQlpZiAoKCRpID0gISRpKSAmJiAocHJlZ19tYXRjaCgnLyhefFxdKVteXFtdKlsnLnNlbGY6OiRwb3NzaWJsZURhdGVGb3JtYXRDaGFyYWN0ZXJzLiddL2knLCRzdWJWYWwpKSkgewoJCQkJCQlyZXR1cm4gdHJ1ZTsKCQkJCQl9CgkJCQl9CgkJCQlyZXR1cm4gZmFsc2U7CgkJCX0KCQkJcmV0dXJuIHRydWU7CgkJfQoKCQkvLyBObyBkYXRlLi4uCgkJcmV0dXJuIGZhbHNlOwoJfQkvLwlmdW5jdGlvbiBpc0RhdGVUaW1lRm9ybWF0Q29kZSgpCgoKCS8qKgoJICogQ29udmVydCBhIGRhdGUvdGltZSBzdHJpbmcgdG8gRXhjZWwgdGltZQoJICoKCSAqIEBwYXJhbQlzdHJpbmcJJGRhdGVWYWx1ZQkJRXhhbXBsZXM6ICcyMDA5LTEyLTMxJywgJzIwMDktMTItMzEgMTU6NTknLCAnMjAwOS0xMi0zMSAxNTo1OToxMCcKCSAqIEByZXR1cm4JZmxvYXR8ZmFsc2UJCUV4Y2VsIGRhdGUvdGltZSBzZXJpYWwgdmFsdWUKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBzdHJpbmdUb0V4Y2VsKCRkYXRlVmFsdWUgPSAnJykgewoJCWlmIChzdHJsZW4oJGRhdGVWYWx1ZSkgPCAyKQoJCQlyZXR1cm4gZmFsc2U7CgkJaWYgKCFwcmVnX21hdGNoKCcvXihcZHsxLDR9WyBcLlwvXC1dW0EtWl17Myw5fShbIFwuXC9cLV1cZHsxLDR9KT98W0EtWl17Myw5fVsgXC5cL1wtXVxkezEsNH0oWyBcLlwvXC1dXGR7MSw0fSk/fFxkezEsNH1bIFwuXC9cLV1cZHsxLDR9KFsgXC5cL1wtXVxkezEsNH0pPykoIFxkezEsMn06XGR7MSwyfSg6XGR7MSwyfSk/KT8kL2l1JywgJGRhdGVWYWx1ZSkpCgkJCXJldHVybiBmYWxzZTsKCgkJJGRhdGVWYWx1ZU5ldyA9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0RhdGVUaW1lOjpEQVRFVkFMVUUoJGRhdGVWYWx1ZSk7CgoJCWlmICgkZGF0ZVZhbHVlTmV3ID09PSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OlZBTFVFKCkpIHsKCQkJcmV0dXJuIGZhbHNlOwoJCX0gZWxzZSB7CgkJCWlmIChzdHJwb3MoJGRhdGVWYWx1ZSwgJzonKSAhPT0gZmFsc2UpIHsKCQkJCSR0aW1lVmFsdWUgPSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9EYXRlVGltZTo6VElNRVZBTFVFKCRkYXRlVmFsdWUpOwoJCQkJaWYgKCR0aW1lVmFsdWUgPT09IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6VkFMVUUoKSkgewoJCQkJCXJldHVybiBmYWxzZTsKCQkJCX0KCQkJCSRkYXRlVmFsdWVOZXcgKz0gJHRpbWVWYWx1ZTsKCQkJfQoJCQlyZXR1cm4gJGRhdGVWYWx1ZU5ldzsKCQl9CgoKCX0KCn0K]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Shared/Drawing.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIFBIUEV4Y2VsCiAqCiAqIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICoKICogQGNhdGVnb3J5ICAgUEhQRXhjZWwKICogQHBhY2thZ2UgICAgUEhQRXhjZWxfU2hhcmVkCiAqIEBjb3B5cmlnaHQgIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwgKGh0dHA6Ly93d3cuY29kZXBsZXguY29tL1BIUEV4Y2VsKQogKiBAbGljZW5zZSAgICBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvb2xkLWxpY2Vuc2VzL2xncGwtMi4xLnR4dAlMR1BMCiAqIEB2ZXJzaW9uICAgIDEuNy43LCAyMDEyLTA1LTE5CiAqLwoKCi8qKgogKiBQSFBFeGNlbF9TaGFyZWRfRHJhd2luZwogKgogKiBAY2F0ZWdvcnkgICBQSFBFeGNlbAogKiBAcGFja2FnZSAgICBQSFBFeGNlbF9TaGFyZWQKICogQGNvcHlyaWdodCAgQ29weXJpZ2h0IChjKSAyMDA2IC0gMjAxMiBQSFBFeGNlbCAoaHR0cDovL3d3dy5jb2RlcGxleC5jb20vUEhQRXhjZWwpCiAqLwpjbGFzcyBQSFBFeGNlbF9TaGFyZWRfRHJhd2luZwp7CgkvKioKCSAqIENvbnZlcnQgcGl4ZWxzIHRvIEVNVQoJICoKCSAqIEBwYXJhbSAJaW50ICRwVmFsdWUJVmFsdWUgaW4gcGl4ZWxzCgkgKiBAcmV0dXJuIAlpbnQJCQlWYWx1ZSBpbiBFTVUKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBwaXhlbHNUb0VNVSgkcFZhbHVlID0gMCkgewoJCXJldHVybiByb3VuZCgkcFZhbHVlICogOTUyNSk7Cgl9CgoJLyoqCgkgKiBDb252ZXJ0IEVNVSB0byBwaXhlbHMKCSAqCgkgKiBAcGFyYW0gCWludCAkcFZhbHVlCVZhbHVlIGluIEVNVQoJICogQHJldHVybiAJaW50CQkJVmFsdWUgaW4gcGl4ZWxzCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gRU1VVG9QaXhlbHMoJHBWYWx1ZSA9IDApIHsKCQlpZiAoJHBWYWx1ZSAhPSAwKSB7CgkJCXJldHVybiByb3VuZCgkcFZhbHVlIC8gOTUyNSk7CgkJfSBlbHNlIHsKCQkJcmV0dXJuIDA7CgkJfQoJfQoKCS8qKgoJICogQ29udmVydCBwaXhlbHMgdG8gY29sdW1uIHdpZHRoLiBFeGFjdCBhbGdvcml0aG0gbm90IGtub3duLgoJICogQnkgaW5zcGVjdGlvbiBvZiBhIHJlYWwgRXhjZWwgZmlsZSB1c2luZyBDYWxpYnJpIDExLCBvbmUgZmluZHMgMTAwMHB4IH4gMTQyLjg1NTQ2ODc1CgkgKiBUaGlzIGdpdmVzIGEgY29udmVyc2lvbiBmYWN0b3Igb2YgNy4gQWxzbywgd2UgYXNzdW1lIHRoYXQgcGl4ZWxzIGFuZCBmb250IHNpemUgYXJlIHByb3BvcnRpb25hbC4KCSAqCgkgKiBAcGFyYW0gCWludCAkcFZhbHVlCVZhbHVlIGluIHBpeGVscwoJICogQHBhcmFtIAlQSFBFeGNlbF9TdHlsZV9Gb250ICRwRGVmYXVsdEZvbnQJRGVmYXVsdCBmb250IG9mIHRoZSB3b3JrYm9vawoJICogQHJldHVybiAJaW50CQkJVmFsdWUgaW4gY2VsbCBkaW1lbnNpb24KCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBwaXhlbHNUb0NlbGxEaW1lbnNpb24oJHBWYWx1ZSA9IDAsIFBIUEV4Y2VsX1N0eWxlX0ZvbnQgJHBEZWZhdWx0Rm9udCkgewoJCS8vIEZvbnQgbmFtZSBhbmQgc2l6ZQoJCSRuYW1lID0gJHBEZWZhdWx0Rm9udC0+Z2V0TmFtZSgpOwoJCSRzaXplID0gJHBEZWZhdWx0Rm9udC0+Z2V0U2l6ZSgpOwoKCQlpZiAoaXNzZXQoUEhQRXhjZWxfU2hhcmVkX0ZvbnQ6OiRkZWZhdWx0Q29sdW1uV2lkdGhzWyRuYW1lXVskc2l6ZV0pKSB7CgkJCS8vIEV4YWN0IHdpZHRoIGNhbiBiZSBkZXRlcm1pbmVkCgkJCSRjb2xXaWR0aCA9ICRwVmFsdWUKCQkJCSogUEhQRXhjZWxfU2hhcmVkX0ZvbnQ6OiRkZWZhdWx0Q29sdW1uV2lkdGhzWyRuYW1lXVskc2l6ZV1bJ3dpZHRoJ10KCQkJCS8gUEhQRXhjZWxfU2hhcmVkX0ZvbnQ6OiRkZWZhdWx0Q29sdW1uV2lkdGhzWyRuYW1lXVskc2l6ZV1bJ3B4J107CgkJfSBlbHNlIHsKCQkJLy8gV2UgZG9uJ3QgaGF2ZSBkYXRhIGZvciB0aGlzIHBhcnRpY3VsYXIgZm9udCBhbmQgc2l6ZSwgdXNlIGFwcHJveGltYXRpb24gYnkKCQkJLy8gZXh0cmFwb2xhdGluZyBmcm9tIENhbGlicmkgMTEKCQkJJGNvbFdpZHRoID0gJHBWYWx1ZSAqIDExCgkJCQkqIFBIUEV4Y2VsX1NoYXJlZF9Gb250OjokZGVmYXVsdENvbHVtbldpZHRoc1snQ2FsaWJyaSddWzExXVsnd2lkdGgnXQoJCQkJLyBQSFBFeGNlbF9TaGFyZWRfRm9udDo6JGRlZmF1bHRDb2x1bW5XaWR0aHNbJ0NhbGlicmknXVsxMV1bJ3B4J10gLyAkc2l6ZTsKCQl9CgoJCXJldHVybiAkY29sV2lkdGg7Cgl9CgoJLyoqCgkgKiBDb252ZXJ0IGNvbHVtbiB3aWR0aCBmcm9tIChpbnRyaW5zaWMpIEV4Y2VsIHVuaXRzIHRvIHBpeGVscwoJICoKCSAqIEBwYXJhbSAJZmxvYXQJJHBWYWx1ZQkJVmFsdWUgaW4gY2VsbCBkaW1lbnNpb24KCSAqIEBwYXJhbSAJUEhQRXhjZWxfU3R5bGVfRm9udCAkcERlZmF1bHRGb250CURlZmF1bHQgZm9udCBvZiB0aGUgd29ya2Jvb2sKCSAqIEByZXR1cm4gCWludAkJVmFsdWUgaW4gcGl4ZWxzCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gY2VsbERpbWVuc2lvblRvUGl4ZWxzKCRwVmFsdWUgPSAwLCBQSFBFeGNlbF9TdHlsZV9Gb250ICRwRGVmYXVsdEZvbnQpIHsKCQkvLyBGb250IG5hbWUgYW5kIHNpemUKCQkkbmFtZSA9ICRwRGVmYXVsdEZvbnQtPmdldE5hbWUoKTsKCQkkc2l6ZSA9ICRwRGVmYXVsdEZvbnQtPmdldFNpemUoKTsKCgkJaWYgKGlzc2V0KFBIUEV4Y2VsX1NoYXJlZF9Gb250OjokZGVmYXVsdENvbHVtbldpZHRoc1skbmFtZV1bJHNpemVdKSkgewoJCQkvLyBFeGFjdCB3aWR0aCBjYW4gYmUgZGV0ZXJtaW5lZAoJCQkkY29sV2lkdGggPSAkcFZhbHVlCgkJCQkqIFBIUEV4Y2VsX1NoYXJlZF9Gb250OjokZGVmYXVsdENvbHVtbldpZHRoc1skbmFtZV1bJHNpemVdWydweCddCgkJCQkvIFBIUEV4Y2VsX1NoYXJlZF9Gb250OjokZGVmYXVsdENvbHVtbldpZHRoc1skbmFtZV1bJHNpemVdWyd3aWR0aCddOwoKCQl9IGVsc2UgewoJCQkvLyBXZSBkb24ndCBoYXZlIGRhdGEgZm9yIHRoaXMgcGFydGljdWxhciBmb250IGFuZCBzaXplLCB1c2UgYXBwcm94aW1hdGlvbiBieQoJCQkvLyBleHRyYXBvbGF0aW5nIGZyb20gQ2FsaWJyaSAxMQoJCQkkY29sV2lkdGggPSAkcFZhbHVlICogJHNpemUKCQkJCSogUEhQRXhjZWxfU2hhcmVkX0ZvbnQ6OiRkZWZhdWx0Q29sdW1uV2lkdGhzWydDYWxpYnJpJ11bMTFdWydweCddCgkJCQkvIFBIUEV4Y2VsX1NoYXJlZF9Gb250OjokZGVmYXVsdENvbHVtbldpZHRoc1snQ2FsaWJyaSddWzExXVsnd2lkdGgnXSAvIDExOwoJCX0KCgkJLy8gUm91bmQgcGl4ZWxzIHRvIGNsb3Nlc3QgaW50ZWdlcgoJCSRjb2xXaWR0aCA9IChpbnQpIHJvdW5kKCRjb2xXaWR0aCk7CgoJCXJldHVybiAkY29sV2lkdGg7Cgl9CgoJLyoqCgkgKiBDb252ZXJ0IHBpeGVscyB0byBwb2ludHMKCSAqCgkgKiBAcGFyYW0gCWludCAkcFZhbHVlCVZhbHVlIGluIHBpeGVscwoJICogQHJldHVybiAJaW50CQkJVmFsdWUgaW4gcG9pbnRzCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gcGl4ZWxzVG9Qb2ludHMoJHBWYWx1ZSA9IDApIHsKCQlyZXR1cm4gJHBWYWx1ZSAqIDAuNjc3Nzc3Nzc7Cgl9CgoJLyoqCgkgKiBDb252ZXJ0IHBvaW50cyB0byBwaXhlbHMKCSAqCgkgKiBAcGFyYW0gCWludCAkcFZhbHVlCVZhbHVlIGluIHBvaW50cwoJICogQHJldHVybiAJaW50CQkJVmFsdWUgaW4gcGl4ZWxzCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gcG9pbnRzVG9QaXhlbHMoJHBWYWx1ZSA9IDApIHsKCQlpZiAoJHBWYWx1ZSAhPSAwKSB7CgkJCXJldHVybiAoaW50KSBjZWlsKCRwVmFsdWUgKiAxLjMzMzMzMzMzMyk7CgkJfSBlbHNlIHsKCQkJcmV0dXJuIDA7CgkJfQoJfQoKCS8qKgoJICogQ29udmVydCBkZWdyZWVzIHRvIGFuZ2xlCgkgKgoJICogQHBhcmFtIAlpbnQgJHBWYWx1ZQlEZWdyZWVzCgkgKiBAcmV0dXJuIAlpbnQJCQlBbmdsZQoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGRlZ3JlZXNUb0FuZ2xlKCRwVmFsdWUgPSAwKSB7CgkJcmV0dXJuIChpbnQpcm91bmQoJHBWYWx1ZSAqIDYwMDAwKTsKCX0KCgkvKioKCSAqIENvbnZlcnQgYW5nbGUgdG8gZGVncmVlcwoJICoKCSAqIEBwYXJhbSAJaW50ICRwVmFsdWUJQW5nbGUKCSAqIEByZXR1cm4gCWludAkJCURlZ3JlZXMKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBhbmdsZVRvRGVncmVlcygkcFZhbHVlID0gMCkgewoJCWlmICgkcFZhbHVlICE9IDApIHsKCQkJcmV0dXJuIHJvdW5kKCRwVmFsdWUgLyA2MDAwMCk7CgkJfSBlbHNlIHsKCQkJcmV0dXJuIDA7CgkJfQoJfQoKCS8qKgoJICogQ3JlYXRlIGEgbmV3IGltYWdlIGZyb20gZmlsZS4gQnkgYWxleGFuZGVyIGF0IGFsZXhhdXRvIGRvdCBubAoJICoKCSAqIEBsaW5rIGh0dHA6Ly93d3cucGhwLm5ldC9tYW51YWwvZW4vZnVuY3Rpb24uaW1hZ2VjcmVhdGVmcm9td2JtcC5waHAjODYyMTQKCSAqIEBwYXJhbSBzdHJpbmcgJGZpbGVuYW1lIFBhdGggdG8gV2luZG93cyBESUIgKEJNUCkgaW1hZ2UKCSAqIEByZXR1cm4gcmVzb3VyY2UKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBpbWFnZWNyZWF0ZWZyb21ibXAoJHBfc0ZpbGUpCgl7CiAgICAgICAgLy8gICAgTG9hZCB0aGUgaW1hZ2UgaW50byBhIHN0cmluZwogICAgICAgICRmaWxlICAgID0gICAgZm9wZW4oJHBfc0ZpbGUsInJiIik7CiAgICAgICAgJHJlYWQgICAgPSAgICBmcmVhZCgkZmlsZSwxMCk7CiAgICAgICAgd2hpbGUoIWZlb2YoJGZpbGUpJiYoJHJlYWQ8PiIiKSkKICAgICAgICAgICAgJHJlYWQgICAgLj0gICAgZnJlYWQoJGZpbGUsMTAyNCk7CgogICAgICAgICR0ZW1wICAgID0gICAgdW5wYWNrKCJIKiIsJHJlYWQpOwogICAgICAgICRoZXggICAgPSAgICAkdGVtcFsxXTsKICAgICAgICAkaGVhZGVyICAgID0gICAgc3Vic3RyKCRoZXgsMCwxMDgpOwoKICAgICAgICAvLyAgICBQcm9jZXNzIHRoZSBoZWFkZXIKICAgICAgICAvLyAgICBTdHJ1Y3R1cmU6IGh0dHA6Ly93d3cuZmFzdGdyYXBoLmNvbS9oZWxwL2JtcF9oZWFkZXJfZm9ybWF0Lmh0bWwKICAgICAgICBpZiAoc3Vic3RyKCRoZWFkZXIsMCw0KT09IjQyNGQiKQogICAgICAgIHsKICAgICAgICAgICAgLy8gICAgQ3V0IGl0IGluIHBhcnRzIG9mIDIgYnl0ZXMKICAgICAgICAgICAgJGhlYWRlcl9wYXJ0cyAgICA9ICAgIHN0cl9zcGxpdCgkaGVhZGVyLDIpOwoKICAgICAgICAgICAgLy8gICAgR2V0IHRoZSB3aWR0aCAgICAgICAgNCBieXRlcwogICAgICAgICAgICAkd2lkdGggICAgICAgICAgICA9ICAgIGhleGRlYygkaGVhZGVyX3BhcnRzWzE5XS4kaGVhZGVyX3BhcnRzWzE4XSk7CgogICAgICAgICAgICAvLyAgICBHZXQgdGhlIGhlaWdodCAgICAgICAgNCBieXRlcwogICAgICAgICAgICAkaGVpZ2h0ICAgICAgICAgICAgPSAgICBoZXhkZWMoJGhlYWRlcl9wYXJ0c1syM10uJGhlYWRlcl9wYXJ0c1syMl0pOwoKICAgICAgICAgICAgLy8gICAgVW5zZXQgdGhlIGhlYWRlciBwYXJhbXMKICAgICAgICAgICAgdW5zZXQoJGhlYWRlcl9wYXJ0cyk7CiAgICAgICAgfQoKICAgICAgICAvLyAgICBEZWZpbmUgc3RhcnRpbmcgWCBhbmQgWQogICAgICAgICR4ICAgICAgICAgICAgICAgID0gICAgMDsKICAgICAgICAkeSAgICAgICAgICAgICAgICA9ICAgIDE7CgogICAgICAgIC8vICAgIENyZWF0ZSBuZXdpbWFnZQogICAgICAgICRpbWFnZSAgICAgICAgICAgID0gICAgaW1hZ2VjcmVhdGV0cnVlY29sb3IoJHdpZHRoLCRoZWlnaHQpOwoKICAgICAgICAvLyAgICBHcmFiIHRoZSBib2R5IGZyb20gdGhlIGltYWdlCiAgICAgICAgJGJvZHkgICAgICAgICAgICA9ICAgIHN1YnN0cigkaGV4LDEwOCk7CgogICAgICAgIC8vICAgIENhbGN1bGF0ZSBpZiBwYWRkaW5nIGF0IHRoZSBlbmQtbGluZSBpcyBuZWVkZWQKICAgICAgICAvLyAgICBEaXZpZGVkIGJ5IHR3byB0byBrZWVwIG92ZXJ2aWV3LgogICAgICAgIC8vICAgIDEgYnl0ZSA9IDIgSEVYLWNoYXJzCiAgICAgICAgJGJvZHlfc2l6ZSAgICAgICAgPSAgICAoc3RybGVuKCRib2R5KS8yKTsKICAgICAgICAkaGVhZGVyX3NpemUgICAgPSAgICAoJHdpZHRoKiRoZWlnaHQpOwoKICAgICAgICAvLyAgICBVc2UgZW5kLWxpbmUgcGFkZGluZz8gT25seSB3aGVuIG5lZWRlZAogICAgICAgICR1c2VQYWRkaW5nICAgICAgICA9ICAgICgkYm9keV9zaXplPigkaGVhZGVyX3NpemUqMykrNCk7CgogICAgICAgIC8vICAgIFVzaW5nIGEgZm9yLWxvb3Agd2l0aCBpbmRleC1jYWxjdWxhdGlvbiBpbnN0YWlkIG9mIHN0cl9zcGxpdCB0byBhdm9pZCBsYXJnZSBtZW1vcnkgY29uc3VtcHRpb24KICAgICAgICAvLyAgICBDYWxjdWxhdGUgdGhlIG5leHQgRFdPUkQtcG9zaXRpb24gaW4gdGhlIGJvZHkKICAgICAgICBmb3IgKCRpPTA7JGk8JGJvZHlfc2l6ZTskaSs9MykKICAgICAgICB7CiAgICAgICAgICAgIC8vICAgIENhbGN1bGF0ZSBsaW5lLWVuZGluZyBhbmQgcGFkZGluZwogICAgICAgICAgICBpZiAoJHg+PSR3aWR0aCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gICAgSWYgcGFkZGluZyBuZWVkZWQsIGlnbm9yZSBpbWFnZS1wYWRkaW5nCiAgICAgICAgICAgICAgICAvLyAgICBTaGlmdCBpIHRvIHRoZSBlbmRpbmcgb2YgdGhlIGN1cnJlbnQgMzItYml0LWJsb2NrCiAgICAgICAgICAgICAgICBpZiAoJHVzZVBhZGRpbmcpCiAgICAgICAgICAgICAgICAgICAgJGkgICAgKz0gICAgJHdpZHRoJTQ7CgogICAgICAgICAgICAgICAgLy8gICAgUmVzZXQgaG9yaXpvbnRhbCBwb3NpdGlvbgogICAgICAgICAgICAgICAgJHggICAgPSAgICAwOwoKICAgICAgICAgICAgICAgIC8vICAgIFJhaXNlIHRoZSBoZWlnaHQtcG9zaXRpb24gKGJvdHRvbS11cCkKICAgICAgICAgICAgICAgICR5Kys7CgogICAgICAgICAgICAgICAgLy8gICAgUmVhY2hlZCB0aGUgaW1hZ2UtaGVpZ2h0PyBCcmVhayB0aGUgZm9yLWxvb3AKICAgICAgICAgICAgICAgIGlmICgkeT4kaGVpZ2h0KQogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyAgICBDYWxjdWxhdGlvbiBvZiB0aGUgUkdCLXBpeGVsIChkZWZpbmVkIGFzIEJHUiBpbiBpbWFnZS1kYXRhKQogICAgICAgICAgICAvLyAgICBEZWZpbmUgJGlfcG9zIGFzIGFic29sdXRlIHBvc2l0aW9uIGluIHRoZSBib2R5CiAgICAgICAgICAgICRpX3BvcyAgICA9ICAgICRpKjI7CiAgICAgICAgICAgICRyICAgICAgICA9ICAgIGhleGRlYygkYm9keVskaV9wb3MrNF0uJGJvZHlbJGlfcG9zKzVdKTsKICAgICAgICAgICAgJGcgICAgICAgID0gICAgaGV4ZGVjKCRib2R5WyRpX3BvcysyXS4kYm9keVskaV9wb3MrM10pOwogICAgICAgICAgICAkYiAgICAgICAgPSAgICBoZXhkZWMoJGJvZHlbJGlfcG9zXS4kYm9keVskaV9wb3MrMV0pOwoKICAgICAgICAgICAgLy8gICAgQ2FsY3VsYXRlIGFuZCBkcmF3IHRoZSBwaXhlbAogICAgICAgICAgICAkY29sb3IgICAgPSAgICBpbWFnZWNvbG9yYWxsb2NhdGUoJGltYWdlLCRyLCRnLCRiKTsKICAgICAgICAgICAgaW1hZ2VzZXRwaXhlbCgkaW1hZ2UsJHgsJGhlaWdodC0keSwkY29sb3IpOwoKICAgICAgICAgICAgLy8gICAgUmFpc2UgdGhlIGhvcml6b250YWwgcG9zaXRpb24KICAgICAgICAgICAgJHgrKzsKICAgICAgICB9CgogICAgICAgIC8vICAgIFVuc2V0IHRoZSBib2R5IC8gZnJlZSB0aGUgbWVtb3J5CiAgICAgICAgdW5zZXQoJGJvZHkpOwoKICAgICAgICAvLyAgICBSZXR1cm4gaW1hZ2Utb2JqZWN0CiAgICAgICAgcmV0dXJuICRpbWFnZTsKCX0KCn0K]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Shared/Escher.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIFBIUEV4Y2VsCiAqCiAqIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICoKICogQGNhdGVnb3J5ICAgUEhQRXhjZWwKICogQHBhY2thZ2UgICAgUEhQRXhjZWxfU2hhcmVkX0VzY2hlcgogKiBAY29weXJpZ2h0ICBDb3B5cmlnaHQgKGMpIDIwMDYgLSAyMDEyIFBIUEV4Y2VsIChodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9QSFBFeGNlbCkKICogQGxpY2Vuc2UgICAgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL29sZC1saWNlbnNlcy9sZ3BsLTIuMS50eHQJTEdQTAogKiBAdmVyc2lvbiAgICAxLjcuNywgMjAxMi0wNS0xOQogKi8KCi8qKgogKiBQSFBFeGNlbF9TaGFyZWRfRXNjaGVyCiAqCiAqIEBjYXRlZ29yeSAgIFBIUEV4Y2VsCiAqIEBwYWNrYWdlICAgIFBIUEV4Y2VsX1NoYXJlZF9Fc2NoZXIKICogQGNvcHlyaWdodCAgQ29weXJpZ2h0IChjKSAyMDA2IC0gMjAxMiBQSFBFeGNlbCAoaHR0cDovL3d3dy5jb2RlcGxleC5jb20vUEhQRXhjZWwpCiAqLwpjbGFzcyBQSFBFeGNlbF9TaGFyZWRfRXNjaGVyCnsKCS8qKgoJICogRHJhd2luZyBHcm91cCBDb250YWluZXIKCSAqCgkgKiBAdmFyIFBIUEV4Y2VsX1NoYXJlZF9Fc2NoZXJfRGdnQ29udGFpbmVyCgkgKi8KCXByaXZhdGUgJF9kZ2dDb250YWluZXI7CgoJLyoqCgkgKiBEcmF3aW5nIENvbnRhaW5lcgoJICoKCSAqIEB2YXIgUEhQRXhjZWxfU2hhcmVkX0VzY2hlcl9EZ0NvbnRhaW5lcgoJICovCglwcml2YXRlICRfZGdDb250YWluZXI7CgoJLyoqCgkgKiBHZXQgRHJhd2luZyBHcm91cCBDb250YWluZXIKCSAqCgkgKiBAcmV0dXJuIFBIUEV4Y2VsX1NoYXJlZF9Fc2NoZXJfRGdDb250YWluZXIKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldERnZ0NvbnRhaW5lcigpCgl7CgkJcmV0dXJuICR0aGlzLT5fZGdnQ29udGFpbmVyOwoJfQoKCS8qKgoJICogU2V0IERyYXdpbmcgR3JvdXAgQ29udGFpbmVyCgkgKgoJICogQHBhcmFtIFBIUEV4Y2VsX1NoYXJlZF9Fc2NoZXJfRGdnQ29udGFpbmVyICRkZ2dDb250YWluZXIKCSAqLwoJcHVibGljIGZ1bmN0aW9uIHNldERnZ0NvbnRhaW5lcigkZGdnQ29udGFpbmVyKQoJewoJCXJldHVybiAkdGhpcy0+X2RnZ0NvbnRhaW5lciA9ICRkZ2dDb250YWluZXI7Cgl9CgoJLyoqCgkgKiBHZXQgRHJhd2luZyBDb250YWluZXIKCSAqCgkgKiBAcmV0dXJuIFBIUEV4Y2VsX1NoYXJlZF9Fc2NoZXJfRGdDb250YWluZXIKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldERnQ29udGFpbmVyKCkKCXsKCQlyZXR1cm4gJHRoaXMtPl9kZ0NvbnRhaW5lcjsKCX0KCgkvKioKCSAqIFNldCBEcmF3aW5nIENvbnRhaW5lcgoJICoKCSAqIEBwYXJhbSBQSFBFeGNlbF9TaGFyZWRfRXNjaGVyX0RnQ29udGFpbmVyICRkZ0NvbnRhaW5lcgoJICovCglwdWJsaWMgZnVuY3Rpb24gc2V0RGdDb250YWluZXIoJGRnQ29udGFpbmVyKQoJewoJCXJldHVybiAkdGhpcy0+X2RnQ29udGFpbmVyID0gJGRnQ29udGFpbmVyOwoJfQoKfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Shared/Escher/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Shared/Escher/DgContainer.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIFBIUEV4Y2VsCiAqCiAqIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICoKICogQGNhdGVnb3J5ICAgUEhQRXhjZWwKICogQHBhY2thZ2UgICAgUEhQRXhjZWxfU2hhcmVkX0VzY2hlcgogKiBAY29weXJpZ2h0ICBDb3B5cmlnaHQgKGMpIDIwMDYgLSAyMDEyIFBIUEV4Y2VsIChodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9QSFBFeGNlbCkKICogQGxpY2Vuc2UgICAgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL29sZC1saWNlbnNlcy9sZ3BsLTIuMS50eHQJTEdQTAogKiBAdmVyc2lvbiAgICAxLjcuNywgMjAxMi0wNS0xOQogKi8KCi8qKgogKiBQSFBFeGNlbF9TaGFyZWRfRXNjaGVyX0RnQ29udGFpbmVyCiAqCiAqIEBjYXRlZ29yeSAgIFBIUEV4Y2VsCiAqIEBwYWNrYWdlICAgIFBIUEV4Y2VsX1NoYXJlZF9Fc2NoZXIKICogQGNvcHlyaWdodCAgQ29weXJpZ2h0IChjKSAyMDA2IC0gMjAxMiBQSFBFeGNlbCAoaHR0cDovL3d3dy5jb2RlcGxleC5jb20vUEhQRXhjZWwpCiAqLwpjbGFzcyBQSFBFeGNlbF9TaGFyZWRfRXNjaGVyX0RnQ29udGFpbmVyCnsKCS8qKgoJICogRHJhd2luZyBpbmRleCwgMS1iYXNlZC4KCSAqCgkgKiBAdmFyIGludAoJICovCglwcml2YXRlICRfZGdJZDsKCgkvKioKCSAqIExhc3Qgc2hhcGUgaW5kZXggaW4gdGhpcyBkcmF3aW5nCgkgKgoJICogQHZhciBpbnQKCSAqLwoJcHJpdmF0ZSAkX2xhc3RTcElkOwoKCXByaXZhdGUgJF9zcGdyQ29udGFpbmVyID0gbnVsbDsKCglwdWJsaWMgZnVuY3Rpb24gZ2V0RGdJZCgpCgl7CgkJcmV0dXJuICR0aGlzLT5fZGdJZDsKCX0KCglwdWJsaWMgZnVuY3Rpb24gc2V0RGdJZCgkdmFsdWUpCgl7CgkJJHRoaXMtPl9kZ0lkID0gJHZhbHVlOwoJfQoKCXB1YmxpYyBmdW5jdGlvbiBnZXRMYXN0U3BJZCgpCgl7CgkJcmV0dXJuICR0aGlzLT5fbGFzdFNwSWQ7Cgl9CgoJcHVibGljIGZ1bmN0aW9uIHNldExhc3RTcElkKCR2YWx1ZSkKCXsKCQkkdGhpcy0+X2xhc3RTcElkID0gJHZhbHVlOwoJfQoKCXB1YmxpYyBmdW5jdGlvbiBnZXRTcGdyQ29udGFpbmVyKCkKCXsKCQlyZXR1cm4gJHRoaXMtPl9zcGdyQ29udGFpbmVyOwoJfQoKCXB1YmxpYyBmdW5jdGlvbiBzZXRTcGdyQ29udGFpbmVyKCRzcGdyQ29udGFpbmVyKQoJewoJCXJldHVybiAkdGhpcy0+X3NwZ3JDb250YWluZXIgPSAkc3BnckNvbnRhaW5lcjsKCX0KCn0K]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Shared/Escher/DgContainer/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Shared/Escher/DgContainer/SpgrContainer.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIFBIUEV4Y2VsCiAqCiAqIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICoKICogQGNhdGVnb3J5ICAgUEhQRXhjZWwKICogQHBhY2thZ2UgICAgUEhQRXhjZWxfU2hhcmVkX0VzY2hlcgogKiBAY29weXJpZ2h0ICBDb3B5cmlnaHQgKGMpIDIwMDYgLSAyMDEyIFBIUEV4Y2VsIChodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9QSFBFeGNlbCkKICogQGxpY2Vuc2UgICAgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL29sZC1saWNlbnNlcy9sZ3BsLTIuMS50eHQJTEdQTAogKiBAdmVyc2lvbiAgICAxLjcuNywgMjAxMi0wNS0xOQogKi8KCi8qKgogKiBQSFBFeGNlbF9TaGFyZWRfRXNjaGVyX0RnQ29udGFpbmVyX1NwZ3JDb250YWluZXIKICoKICogQGNhdGVnb3J5ICAgUEhQRXhjZWwKICogQHBhY2thZ2UgICAgUEhQRXhjZWxfU2hhcmVkX0VzY2hlcgogKiBAY29weXJpZ2h0ICBDb3B5cmlnaHQgKGMpIDIwMDYgLSAyMDEyIFBIUEV4Y2VsIChodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9QSFBFeGNlbCkKICovCmNsYXNzIFBIUEV4Y2VsX1NoYXJlZF9Fc2NoZXJfRGdDb250YWluZXJfU3BnckNvbnRhaW5lcgp7CgkvKioKCSAqIFBhcmVudCBTaGFwZSBHcm91cCBDb250YWluZXIKCSAqCgkgKiBAdmFyIFBIUEV4Y2VsX1NoYXJlZF9Fc2NoZXJfRGdDb250YWluZXJfU3BnckNvbnRhaW5lcgoJICovCglwcml2YXRlICRfcGFyZW50OwoKCS8qKgoJICogU2hhcGUgQ29udGFpbmVyIGNvbGxlY3Rpb24KCSAqCgkgKiBAdmFyIGFycmF5CgkgKi8KCXByaXZhdGUgJF9jaGlsZHJlbiA9IGFycmF5KCk7CgoJLyoqCgkgKiBTZXQgcGFyZW50IFNoYXBlIEdyb3VwIENvbnRhaW5lcgoJICoKCSAqIEBwYXJhbSBQSFBFeGNlbF9TaGFyZWRfRXNjaGVyX0RnQ29udGFpbmVyX1NwZ3JDb250YWluZXIgJHBhcmVudAoJICovCglwdWJsaWMgZnVuY3Rpb24gc2V0UGFyZW50KCRwYXJlbnQpCgl7CgkJJHRoaXMtPl9wYXJlbnQgPSAkcGFyZW50OwoJfQoKCS8qKgoJICogR2V0IHRoZSBwYXJlbnQgU2hhcGUgR3JvdXAgQ29udGFpbmVyIGlmIGFueQoJICoKCSAqIEByZXR1cm4gUEhQRXhjZWxfU2hhcmVkX0VzY2hlcl9EZ0NvbnRhaW5lcl9TcGdyQ29udGFpbmVyfG51bGwKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldFBhcmVudCgpCgl7CgkJcmV0dXJuICR0aGlzLT5fcGFyZW50OwoJfQoKCS8qKgoJICogQWRkIGEgY2hpbGQuIFRoaXMgd2lsbCBiZSBlaXRoZXIgc3BnckNvbnRhaW5lciBvciBzcENvbnRhaW5lcgoJICoKCSAqIEBwYXJhbSBtaXhlZCAkY2hpbGQKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGFkZENoaWxkKCRjaGlsZCkKCXsKCQkkdGhpcy0+X2NoaWxkcmVuW10gPSAkY2hpbGQ7CgkJJGNoaWxkLT5zZXRQYXJlbnQoJHRoaXMpOwoJfQoKCS8qKgoJICogR2V0IGNvbGxlY3Rpb24gb2YgU2hhcGUgQ29udGFpbmVycwoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0Q2hpbGRyZW4oKQoJewoJCXJldHVybiAkdGhpcy0+X2NoaWxkcmVuOwoJfQoKCS8qKgoJICogUmVjdXJzaXZlbHkgZ2V0IGFsbCBzcENvbnRhaW5lcnMgd2l0aGluIHRoaXMgc3BnckNvbnRhaW5lcgoJICoKCSAqIEByZXR1cm4gUEhQRXhjZWxfU2hhcmVkX0VzY2hlcl9EZ0NvbnRhaW5lcl9TcGdyQ29udGFpbmVyX1NwQ29udGFpbmVyW10KCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldEFsbFNwQ29udGFpbmVycygpCgl7CgkJJGFsbFNwQ29udGFpbmVycyA9IGFycmF5KCk7CgoJCWZvcmVhY2ggKCR0aGlzLT5fY2hpbGRyZW4gYXMgJGNoaWxkKSB7CgkJCWlmICgkY2hpbGQgaW5zdGFuY2VvZiBQSFBFeGNlbF9TaGFyZWRfRXNjaGVyX0RnQ29udGFpbmVyX1NwZ3JDb250YWluZXIpIHsKCQkJCSRhbGxTcENvbnRhaW5lcnMgPSBhcnJheV9tZXJnZSgkYWxsU3BDb250YWluZXJzLCAkY2hpbGQtPmdldEFsbFNwQ29udGFpbmVycygpKTsKCQkJfSBlbHNlIHsKCQkJCSRhbGxTcENvbnRhaW5lcnNbXSA9ICRjaGlsZDsKCQkJfQoJCX0KCgkJcmV0dXJuICRhbGxTcENvbnRhaW5lcnM7Cgl9Cn0K]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Shared/Escher/DgContainer/SpgrContainer/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Shared/Escher/DgContainer/SpgrContainer/SpContainer.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIFBIUEV4Y2VsCiAqCiAqIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICoKICogQGNhdGVnb3J5ICAgUEhQRXhjZWwKICogQHBhY2thZ2UgICAgUEhQRXhjZWxfU2hhcmVkX0VzY2hlcgogKiBAY29weXJpZ2h0ICBDb3B5cmlnaHQgKGMpIDIwMDYgLSAyMDEyIFBIUEV4Y2VsIChodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9QSFBFeGNlbCkKICogQGxpY2Vuc2UgICAgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL29sZC1saWNlbnNlcy9sZ3BsLTIuMS50eHQJTEdQTAogKiBAdmVyc2lvbiAgICAxLjcuNywgMjAxMi0wNS0xOQogKi8KCi8qKgogKiBQSFBFeGNlbF9TaGFyZWRfRXNjaGVyX0RnQ29udGFpbmVyX1NwZ3JDb250YWluZXJfU3BDb250YWluZXIKICoKICogQGNhdGVnb3J5ICAgUEhQRXhjZWwKICogQHBhY2thZ2UgICAgUEhQRXhjZWxfU2hhcmVkX0VzY2hlcgogKiBAY29weXJpZ2h0ICBDb3B5cmlnaHQgKGMpIDIwMDYgLSAyMDEyIFBIUEV4Y2VsIChodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9QSFBFeGNlbCkKICovCmNsYXNzIFBIUEV4Y2VsX1NoYXJlZF9Fc2NoZXJfRGdDb250YWluZXJfU3BnckNvbnRhaW5lcl9TcENvbnRhaW5lcgp7CgkvKioKCSAqIFBhcmVudCBTaGFwZSBHcm91cCBDb250YWluZXIKCSAqCgkgKiBAdmFyIFBIUEV4Y2VsX1NoYXJlZF9Fc2NoZXJfRGdDb250YWluZXJfU3BnckNvbnRhaW5lcgoJICovCglwcml2YXRlICRfcGFyZW50OwoKCS8qKgoJICogSXMgdGhpcyBhIGdyb3VwIHNoYXBlPwoJICoKCSAqIEB2YXIgYm9vbGVhbgoJICovCglwcml2YXRlICRfc3BnciA9IGZhbHNlOwoKCS8qKgoJICogU2hhcGUgdHlwZQoJICoKCSAqIEB2YXIgaW50CgkgKi8KCXByaXZhdGUgJF9zcFR5cGU7CgoJLyoqCgkgKiBTaGFwZSBpbmRleCAodXN1YWxseSBncm91cCBzaGFwZSBoYXMgaW5kZXggMCwgYW5kIHRoZSByZXN0OiAxLDIsMy4uLikKCSAqCgkgKiBAdmFyIGJvb2xlYW4KCSAqLwoJcHJpdmF0ZSAkX3NwSWQ7CgoJLyoqCgkgKiBBcnJheSBvZiBvcHRpb25zCgkgKgoJICogQHZhciBhcnJheQoJICovCglwcml2YXRlICRfT1BUOwoKCS8qKgoJICogQ2VsbCBjb29yZGluYXRlcyBvZiB1cHBlci1sZWZ0IGNvcm5lciBvZiBzaGFwZSwgZS5nLiAnQTEnCgkgKgoJICogQHZhciBzdHJpbmcKCSAqLwoJcHJpdmF0ZSAkX3N0YXJ0Q29vcmRpbmF0ZXM7CgoJLyoqCgkgKiBIb3Jpem9udGFsIG9mZnNldCBvZiB1cHBlci1sZWZ0IGNvcm5lciBvZiBzaGFwZSBtZWFzdXJlZCBpbiAxLzEwMjQgb2YgY29sdW1uIHdpZHRoCgkgKgoJICogQHZhciBpbnQKCSAqLwoJcHJpdmF0ZSAkX3N0YXJ0T2Zmc2V0WDsKCgkvKioKCSAqIFZlcnRpY2FsIG9mZnNldCBvZiB1cHBlci1sZWZ0IGNvcm5lciBvZiBzaGFwZSBtZWFzdXJlZCBpbiAxLzI1NiBvZiByb3cgaGVpZ2h0CgkgKgoJICogQHZhciBpbnQKCSAqLwoJcHJpdmF0ZSAkX3N0YXJ0T2Zmc2V0WTsKCgkvKioKCSAqIENlbGwgY29vcmRpbmF0ZXMgb2YgYm90dG9tLXJpZ2h0IGNvcm5lciBvZiBzaGFwZSwgZS5nLiAnQjInCgkgKgoJICogQHZhciBzdHJpbmcKCSAqLwoJcHJpdmF0ZSAkX2VuZENvb3JkaW5hdGVzOwoKCS8qKgoJICogSG9yaXpvbnRhbCBvZmZzZXQgb2YgYm90dG9tLXJpZ2h0IGNvcm5lciBvZiBzaGFwZSBtZWFzdXJlZCBpbiAxLzEwMjQgb2YgY29sdW1uIHdpZHRoCgkgKgoJICogQHZhciBpbnQKCSAqLwoJcHJpdmF0ZSAkX2VuZE9mZnNldFg7CgoJLyoqCgkgKiBWZXJ0aWNhbCBvZmZzZXQgb2YgYm90dG9tLXJpZ2h0IGNvcm5lciBvZiBzaGFwZSBtZWFzdXJlZCBpbiAxLzI1NiBvZiByb3cgaGVpZ2h0CgkgKgoJICogQHZhciBpbnQKCSAqLwoJcHJpdmF0ZSAkX2VuZE9mZnNldFk7CgoJLyoqCgkgKiBTZXQgcGFyZW50IFNoYXBlIEdyb3VwIENvbnRhaW5lcgoJICoKCSAqIEBwYXJhbSBQSFBFeGNlbF9TaGFyZWRfRXNjaGVyX0RnQ29udGFpbmVyX1NwZ3JDb250YWluZXIgJHBhcmVudAoJICovCglwdWJsaWMgZnVuY3Rpb24gc2V0UGFyZW50KCRwYXJlbnQpCgl7CgkJJHRoaXMtPl9wYXJlbnQgPSAkcGFyZW50OwoJfQoKCS8qKgoJICogR2V0IHRoZSBwYXJlbnQgU2hhcGUgR3JvdXAgQ29udGFpbmVyCgkgKgoJICogQHJldHVybiBQSFBFeGNlbF9TaGFyZWRfRXNjaGVyX0RnQ29udGFpbmVyX1NwZ3JDb250YWluZXIKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldFBhcmVudCgpCgl7CgkJcmV0dXJuICR0aGlzLT5fcGFyZW50OwoJfQoKCS8qKgoJICogU2V0IHdoZXRoZXIgdGhpcyBpcyBhIGdyb3VwIHNoYXBlCgkgKgoJICogQHBhcmFtIGJvb2xlYW4gJHZhbHVlCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBzZXRTcGdyKCR2YWx1ZSA9IGZhbHNlKQoJewoJCSR0aGlzLT5fc3BnciA9ICR2YWx1ZTsKCX0KCgkvKioKCSAqIEdldCB3aGV0aGVyIHRoaXMgaXMgYSBncm91cCBzaGFwZQoJICoKCSAqIEByZXR1cm4gYm9vbGVhbgoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0U3BncigpCgl7CgkJcmV0dXJuICR0aGlzLT5fc3BncjsKCX0KCgkvKioKCSAqIFNldCB0aGUgc2hhcGUgdHlwZQoJICoKCSAqIEBwYXJhbSBpbnQgJHZhbHVlCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBzZXRTcFR5cGUoJHZhbHVlKQoJewoJCSR0aGlzLT5fc3BUeXBlID0gJHZhbHVlOwoJfQoKCS8qKgoJICogR2V0IHRoZSBzaGFwZSB0eXBlCgkgKgoJICogQHJldHVybiBpbnQKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldFNwVHlwZSgpCgl7CgkJcmV0dXJuICR0aGlzLT5fc3BUeXBlOwoJfQoKCS8qKgoJICogU2V0IHRoZSBzaGFwZSBpbmRleAoJICoKCSAqIEBwYXJhbSBpbnQgJHZhbHVlCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBzZXRTcElkKCR2YWx1ZSkKCXsKCQkkdGhpcy0+X3NwSWQgPSAkdmFsdWU7Cgl9CgoJLyoqCgkgKiBHZXQgdGhlIHNoYXBlIGluZGV4CgkgKgoJICogQHJldHVybiBpbnQKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldFNwSWQoKQoJewoJCXJldHVybiAkdGhpcy0+X3NwSWQ7Cgl9CgoJLyoqCgkgKiBTZXQgYW4gb3B0aW9uIGZvciB0aGUgU2hhcGUgR3JvdXAgQ29udGFpbmVyCgkgKgoJICogQHBhcmFtIGludCAkcHJvcGVydHkgVGhlIG51bWJlciBzcGVjaWZpZXMgdGhlIG9wdGlvbgoJICogQHBhcmFtIG1peGVkICR2YWx1ZQoJICovCglwdWJsaWMgZnVuY3Rpb24gc2V0T1BUKCRwcm9wZXJ0eSwgJHZhbHVlKQoJewoJCSR0aGlzLT5fT1BUWyRwcm9wZXJ0eV0gPSAkdmFsdWU7Cgl9CgoJLyoqCgkgKiBHZXQgYW4gb3B0aW9uIGZvciB0aGUgU2hhcGUgR3JvdXAgQ29udGFpbmVyCgkgKgoJICogQHBhcmFtIGludCAkcHJvcGVydHkgVGhlIG51bWJlciBzcGVjaWZpZXMgdGhlIG9wdGlvbgoJICogQHJldHVybiBtaXhlZAoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0T1BUKCRwcm9wZXJ0eSkKCXsKCQlpZiAoaXNzZXQoJHRoaXMtPl9PUFRbJHByb3BlcnR5XSkpIHsKCQkJcmV0dXJuICR0aGlzLT5fT1BUWyRwcm9wZXJ0eV07CgkJfQoJCXJldHVybiBudWxsOwoJfQoKCS8qKgoJICogR2V0IHRoZSBjb2xsZWN0aW9uIG9mIG9wdGlvbnMKCSAqCgkgKiBAcmV0dXJuIGFycmF5CgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRPUFRDb2xsZWN0aW9uKCkKCXsKCQlyZXR1cm4gJHRoaXMtPl9PUFQ7Cgl9CgoJLyoqCgkgKiBTZXQgY2VsbCBjb29yZGluYXRlcyBvZiB1cHBlci1sZWZ0IGNvcm5lciBvZiBzaGFwZQoJICoKCSAqIEBwYXJhbSBzdHJpbmcgJHZhbHVlCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBzZXRTdGFydENvb3JkaW5hdGVzKCR2YWx1ZSA9ICdBMScpCgl7CgkJJHRoaXMtPl9zdGFydENvb3JkaW5hdGVzID0gJHZhbHVlOwoJfQoKCS8qKgoJICogR2V0IGNlbGwgY29vcmRpbmF0ZXMgb2YgdXBwZXItbGVmdCBjb3JuZXIgb2Ygc2hhcGUKCSAqCgkgKiBAcmV0dXJuIHN0cmluZwoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0U3RhcnRDb29yZGluYXRlcygpCgl7CgkJcmV0dXJuICR0aGlzLT5fc3RhcnRDb29yZGluYXRlczsKCX0KCgkvKioKCSAqIFNldCBvZmZzZXQgaW4geC1kaXJlY3Rpb24gb2YgdXBwZXItbGVmdCBjb3JuZXIgb2Ygc2hhcGUgbWVhc3VyZWQgaW4gMS8xMDI0IG9mIGNvbHVtbiB3aWR0aAoJICoKCSAqIEBwYXJhbSBpbnQgJHN0YXJ0T2Zmc2V0WAoJICovCglwdWJsaWMgZnVuY3Rpb24gc2V0U3RhcnRPZmZzZXRYKCRzdGFydE9mZnNldFggPSAwKQoJewoJCSR0aGlzLT5fc3RhcnRPZmZzZXRYID0gJHN0YXJ0T2Zmc2V0WDsKCX0KCgkvKioKCSAqIEdldCBvZmZzZXQgaW4geC1kaXJlY3Rpb24gb2YgdXBwZXItbGVmdCBjb3JuZXIgb2Ygc2hhcGUgbWVhc3VyZWQgaW4gMS8xMDI0IG9mIGNvbHVtbiB3aWR0aAoJICoKCSAqIEByZXR1cm4gaW50CgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRTdGFydE9mZnNldFgoKQoJewoJCXJldHVybiAkdGhpcy0+X3N0YXJ0T2Zmc2V0WDsKCX0KCgkvKioKCSAqIFNldCBvZmZzZXQgaW4geS1kaXJlY3Rpb24gb2YgdXBwZXItbGVmdCBjb3JuZXIgb2Ygc2hhcGUgbWVhc3VyZWQgaW4gMS8yNTYgb2Ygcm93IGhlaWdodAoJICoKCSAqIEBwYXJhbSBpbnQgJHN0YXJ0T2Zmc2V0WQoJICovCglwdWJsaWMgZnVuY3Rpb24gc2V0U3RhcnRPZmZzZXRZKCRzdGFydE9mZnNldFkgPSAwKQoJewoJCSR0aGlzLT5fc3RhcnRPZmZzZXRZID0gJHN0YXJ0T2Zmc2V0WTsKCX0KCgkvKioKCSAqIEdldCBvZmZzZXQgaW4geS1kaXJlY3Rpb24gb2YgdXBwZXItbGVmdCBjb3JuZXIgb2Ygc2hhcGUgbWVhc3VyZWQgaW4gMS8yNTYgb2Ygcm93IGhlaWdodAoJICoKCSAqIEByZXR1cm4gaW50CgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRTdGFydE9mZnNldFkoKQoJewoJCXJldHVybiAkdGhpcy0+X3N0YXJ0T2Zmc2V0WTsKCX0KCgkvKioKCSAqIFNldCBjZWxsIGNvb3JkaW5hdGVzIG9mIGJvdHRvbS1yaWdodCBjb3JuZXIgb2Ygc2hhcGUKCSAqCgkgKiBAcGFyYW0gc3RyaW5nICR2YWx1ZQoJICovCglwdWJsaWMgZnVuY3Rpb24gc2V0RW5kQ29vcmRpbmF0ZXMoJHZhbHVlID0gJ0ExJykKCXsKCQkkdGhpcy0+X2VuZENvb3JkaW5hdGVzID0gJHZhbHVlOwoJfQoKCS8qKgoJICogR2V0IGNlbGwgY29vcmRpbmF0ZXMgb2YgYm90dG9tLXJpZ2h0IGNvcm5lciBvZiBzaGFwZQoJICoKCSAqIEByZXR1cm4gc3RyaW5nCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRFbmRDb29yZGluYXRlcygpCgl7CgkJcmV0dXJuICR0aGlzLT5fZW5kQ29vcmRpbmF0ZXM7Cgl9CgoJLyoqCgkgKiBTZXQgb2Zmc2V0IGluIHgtZGlyZWN0aW9uIG9mIGJvdHRvbS1yaWdodCBjb3JuZXIgb2Ygc2hhcGUgbWVhc3VyZWQgaW4gMS8xMDI0IG9mIGNvbHVtbiB3aWR0aAoJICoKCSAqIEBwYXJhbSBpbnQgJHN0YXJ0T2Zmc2V0WAoJICovCglwdWJsaWMgZnVuY3Rpb24gc2V0RW5kT2Zmc2V0WCgkZW5kT2Zmc2V0WCA9IDApCgl7CgkJJHRoaXMtPl9lbmRPZmZzZXRYID0gJGVuZE9mZnNldFg7Cgl9CgoJLyoqCgkgKiBHZXQgb2Zmc2V0IGluIHgtZGlyZWN0aW9uIG9mIGJvdHRvbS1yaWdodCBjb3JuZXIgb2Ygc2hhcGUgbWVhc3VyZWQgaW4gMS8xMDI0IG9mIGNvbHVtbiB3aWR0aAoJICoKCSAqIEByZXR1cm4gaW50CgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRFbmRPZmZzZXRYKCkKCXsKCQlyZXR1cm4gJHRoaXMtPl9lbmRPZmZzZXRYOwoJfQoKCS8qKgoJICogU2V0IG9mZnNldCBpbiB5LWRpcmVjdGlvbiBvZiBib3R0b20tcmlnaHQgY29ybmVyIG9mIHNoYXBlIG1lYXN1cmVkIGluIDEvMjU2IG9mIHJvdyBoZWlnaHQKCSAqCgkgKiBAcGFyYW0gaW50ICRlbmRPZmZzZXRZCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBzZXRFbmRPZmZzZXRZKCRlbmRPZmZzZXRZID0gMCkKCXsKCQkkdGhpcy0+X2VuZE9mZnNldFkgPSAkZW5kT2Zmc2V0WTsKCX0KCgkvKioKCSAqIEdldCBvZmZzZXQgaW4geS1kaXJlY3Rpb24gb2YgYm90dG9tLXJpZ2h0IGNvcm5lciBvZiBzaGFwZSBtZWFzdXJlZCBpbiAxLzI1NiBvZiByb3cgaGVpZ2h0CgkgKgoJICogQHJldHVybiBpbnQKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldEVuZE9mZnNldFkoKQoJewoJCXJldHVybiAkdGhpcy0+X2VuZE9mZnNldFk7Cgl9CgoJLyoqCgkgKiBHZXQgdGhlIG5lc3RpbmcgbGV2ZWwgb2YgdGhpcyBzcENvbnRhaW5lci4gVGhpcyBpcyB0aGUgbnVtYmVyIG9mIHNwZ3JDb250YWluZXJzIGJldHdlZW4gdGhpcyBzcENvbnRhaW5lciBhbmQKCSAqIHRoZSBkZ0NvbnRhaW5lci4gQSB2YWx1ZSBvZiAxID0gaW1tZWRpYXRlbHkgd2l0aGluIGZpcnN0IHNwZ3JDb250YWluZXIKCSAqIEhpZ2hlciBuZXN0aW5nIGxldmVsIG9jY3VycyBpZiBhbmQgb25seSBpZiBzcENvbnRhaW5lciBpcyBwYXJ0IG9mIGEgc2hhcGUgZ3JvdXAKCSAqCgkgKiBAcmV0dXJuIGludCBOZXN0aW5nIGxldmVsCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXROZXN0aW5nTGV2ZWwoKQoJewoJCSRuZXN0aW5nTGV2ZWwgPSAwOwoKCQkkcGFyZW50ID0gJHRoaXMtPmdldFBhcmVudCgpOwoJCXdoaWxlICgkcGFyZW50IGluc3RhbmNlb2YgUEhQRXhjZWxfU2hhcmVkX0VzY2hlcl9EZ0NvbnRhaW5lcl9TcGdyQ29udGFpbmVyKSB7CgkJCSsrJG5lc3RpbmdMZXZlbDsKCQkJJHBhcmVudCA9ICRwYXJlbnQtPmdldFBhcmVudCgpOwoJCX0KCgkJcmV0dXJuICRuZXN0aW5nTGV2ZWw7Cgl9Cn0K]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Shared/Escher/DggContainer.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIFBIUEV4Y2VsCiAqCiAqIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICoKICogQGNhdGVnb3J5ICAgUEhQRXhjZWwKICogQHBhY2thZ2UgICAgUEhQRXhjZWxfU2hhcmVkX0VzY2hlcgogKiBAY29weXJpZ2h0ICBDb3B5cmlnaHQgKGMpIDIwMDYgLSAyMDEyIFBIUEV4Y2VsIChodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9QSFBFeGNlbCkKICogQGxpY2Vuc2UgICAgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL29sZC1saWNlbnNlcy9sZ3BsLTIuMS50eHQJTEdQTAogKiBAdmVyc2lvbiAgICAxLjcuNywgMjAxMi0wNS0xOQogKi8KCi8qKgogKiBQSFBFeGNlbF9TaGFyZWRfRXNjaGVyX0RnZ0NvbnRhaW5lcgogKgogKiBAY2F0ZWdvcnkgICBQSFBFeGNlbAogKiBAcGFja2FnZSAgICBQSFBFeGNlbF9TaGFyZWRfRXNjaGVyCiAqIEBjb3B5cmlnaHQgIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwgKGh0dHA6Ly93d3cuY29kZXBsZXguY29tL1BIUEV4Y2VsKQogKi8KY2xhc3MgUEhQRXhjZWxfU2hhcmVkX0VzY2hlcl9EZ2dDb250YWluZXIKewoJLyoqCgkgKiBNYXhpbXVtIHNoYXBlIGluZGV4IG9mIGFsbCBzaGFwZXMgaW4gYWxsIGRyYXdpbmdzIGluY3JlYXNlZCBieSBvbmUKCSAqCgkgKiBAdmFyIGludAoJICovCglwcml2YXRlICRfc3BJZE1heDsKCgkvKioKCSAqIFRvdGFsIG51bWJlciBvZiBkcmF3aW5ncyBzYXZlZAoJICoKCSAqIEB2YXIgaW50CgkgKi8KCXByaXZhdGUgJF9jRGdTYXZlZDsKCgkvKioKCSAqIFRvdGFsIG51bWJlciBvZiBzaGFwZXMgc2F2ZWQgKGluY2x1ZGluZyBncm91cCBzaGFwZXMpCgkgKgoJICogQHZhciBpbnQKCSAqLwoJcHJpdmF0ZSAkX2NTcFNhdmVkOwoKCS8qKgoJICogQkxJUCBTdG9yZSBDb250YWluZXIKCSAqCgkgKiBAdmFyIFBIUEV4Y2VsX1NoYXJlZF9Fc2NoZXJfRGdnQ29udGFpbmVyX0JzdG9yZUNvbnRhaW5lcgoJICovCglwcml2YXRlICRfYnN0b3JlQ29udGFpbmVyOwoKCS8qKgoJICogQXJyYXkgb2Ygb3B0aW9ucyBmb3IgdGhlIGRyYXdpbmcgZ3JvdXAKCSAqCgkgKiBAdmFyIGFycmF5CgkgKi8KCXByaXZhdGUgJF9PUFQgPSBhcnJheSgpOwoKCS8qKgoJICogQXJyYXkgb2YgaWRlbnRpZmllciBjbHVzdGVycyBjb250YWluZyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgbWF4aW11bSBzaGFwZSBpZGVudGlmaWVycwoJICoKCSAqIEB2YXIgYXJyYXkKCSAqLwoJcHJpdmF0ZSAkX0lEQ0xzID0gYXJyYXkoKTsKCgkvKioKCSAqIEdldCBtYXhpbXVtIHNoYXBlIGluZGV4IG9mIGFsbCBzaGFwZXMgaW4gYWxsIGRyYXdpbmdzIChwbHVzIG9uZSkKCSAqCgkgKiBAcmV0dXJuIGludAoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0U3BJZE1heCgpCgl7CgkJcmV0dXJuICR0aGlzLT5fc3BJZE1heDsKCX0KCgkvKioKCSAqIFNldCBtYXhpbXVtIHNoYXBlIGluZGV4IG9mIGFsbCBzaGFwZXMgaW4gYWxsIGRyYXdpbmdzIChwbHVzIG9uZSkKCSAqCgkgKiBAcGFyYW0gaW50CgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBzZXRTcElkTWF4KCR2YWx1ZSkKCXsKCQkkdGhpcy0+X3NwSWRNYXggPSAkdmFsdWU7Cgl9CgoJLyoqCgkgKiBHZXQgdG90YWwgbnVtYmVyIG9mIGRyYXdpbmdzIHNhdmVkCgkgKgoJICogQHJldHVybiBpbnQKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldENEZ1NhdmVkKCkKCXsKCQlyZXR1cm4gJHRoaXMtPl9jRGdTYXZlZDsKCX0KCgkvKioKCSAqIFNldCB0b3RhbCBudW1iZXIgb2YgZHJhd2luZ3Mgc2F2ZWQKCSAqCgkgKiBAcGFyYW0gaW50CgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBzZXRDRGdTYXZlZCgkdmFsdWUpCgl7CgkJJHRoaXMtPl9jRGdTYXZlZCA9ICR2YWx1ZTsKCX0KCgkvKioKCSAqIEdldCB0b3RhbCBudW1iZXIgb2Ygc2hhcGVzIHNhdmVkIChpbmNsdWRpbmcgZ3JvdXAgc2hhcGVzKQoJICoKCSAqIEByZXR1cm4gaW50CgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRDU3BTYXZlZCgpCgl7CgkJcmV0dXJuICR0aGlzLT5fY1NwU2F2ZWQ7Cgl9CgoJLyoqCgkgKiBTZXQgdG90YWwgbnVtYmVyIG9mIHNoYXBlcyBzYXZlZCAoaW5jbHVkaW5nIGdyb3VwIHNoYXBlcykKCSAqCgkgKiBAcGFyYW0gaW50CgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBzZXRDU3BTYXZlZCgkdmFsdWUpCgl7CgkJJHRoaXMtPl9jU3BTYXZlZCA9ICR2YWx1ZTsKCX0KCgkvKioKCSAqIEdldCBCTElQIFN0b3JlIENvbnRhaW5lcgoJICoKCSAqIEByZXR1cm4gUEhQRXhjZWxfU2hhcmVkX0VzY2hlcl9EZ2dDb250YWluZXJfQnN0b3JlQ29udGFpbmVyCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRCc3RvcmVDb250YWluZXIoKQoJewoJCXJldHVybiAkdGhpcy0+X2JzdG9yZUNvbnRhaW5lcjsKCX0KCgkvKioKCSAqIFNldCBCTElQIFN0b3JlIENvbnRhaW5lcgoJICoKCSAqIEBwYXJhbSBQSFBFeGNlbF9TaGFyZWRfRXNjaGVyX0RnZ0NvbnRhaW5lcl9Cc3RvcmVDb250YWluZXIgJGJzdG9yZUNvbnRhaW5lcgoJICovCglwdWJsaWMgZnVuY3Rpb24gc2V0QnN0b3JlQ29udGFpbmVyKCRic3RvcmVDb250YWluZXIpCgl7CgkJJHRoaXMtPl9ic3RvcmVDb250YWluZXIgPSAkYnN0b3JlQ29udGFpbmVyOwoJfQoKCS8qKgoJICogU2V0IGFuIG9wdGlvbiBmb3IgdGhlIGRyYXdpbmcgZ3JvdXAKCSAqCgkgKiBAcGFyYW0gaW50ICRwcm9wZXJ0eSBUaGUgbnVtYmVyIHNwZWNpZmllcyB0aGUgb3B0aW9uCgkgKiBAcGFyYW0gbWl4ZWQgJHZhbHVlCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBzZXRPUFQoJHByb3BlcnR5LCAkdmFsdWUpCgl7CgkJJHRoaXMtPl9PUFRbJHByb3BlcnR5XSA9ICR2YWx1ZTsKCX0KCgkvKioKCSAqIEdldCBhbiBvcHRpb24gZm9yIHRoZSBkcmF3aW5nIGdyb3VwCgkgKgoJICogQHBhcmFtIGludCAkcHJvcGVydHkgVGhlIG51bWJlciBzcGVjaWZpZXMgdGhlIG9wdGlvbgoJICogQHJldHVybiBtaXhlZAoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0T1BUKCRwcm9wZXJ0eSkKCXsKCQlpZiAoaXNzZXQoJHRoaXMtPl9PUFRbJHByb3BlcnR5XSkpIHsKCQkJcmV0dXJuICR0aGlzLT5fT1BUWyRwcm9wZXJ0eV07CgkJfQoJCXJldHVybiBudWxsOwoJfQoKCS8qKgoJICogR2V0IGlkZW50aWZpZXIgY2x1c3RlcnMKCSAqCgkgKiBAcmV0dXJuIGFycmF5CgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRJRENMcygpCgl7CgkJcmV0dXJuICR0aGlzLT5fSURDTHM7Cgl9CgoJLyoqCgkgKiBTZXQgaWRlbnRpZmllciBjbHVzdGVycy4gYXJyYXkoPGRyYXdpbmdJZD4gPT4gPG1heCBzaGFwZSBpZD4sIC4uLikKCSAqCgkgKiBAcGFyYW0gYXJyYXkgJHBWYWx1ZQoJICovCglwdWJsaWMgZnVuY3Rpb24gc2V0SURDTHMoJHBWYWx1ZSkKCXsKCQkkdGhpcy0+X0lEQ0xzID0gJHBWYWx1ZTsKCX0KfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Shared/Escher/DggContainer/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Shared/Escher/DggContainer/BstoreContainer.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIFBIUEV4Y2VsCiAqCiAqIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICoKICogQGNhdGVnb3J5ICAgUEhQRXhjZWwKICogQHBhY2thZ2UgICAgUEhQRXhjZWxfU2hhcmVkX0VzY2hlcgogKiBAY29weXJpZ2h0ICBDb3B5cmlnaHQgKGMpIDIwMDYgLSAyMDEyIFBIUEV4Y2VsIChodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9QSFBFeGNlbCkKICogQGxpY2Vuc2UgICAgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL29sZC1saWNlbnNlcy9sZ3BsLTIuMS50eHQJTEdQTAogKiBAdmVyc2lvbiAgICAxLjcuNywgMjAxMi0wNS0xOQogKi8KCi8qKgogKiBQSFBFeGNlbF9TaGFyZWRfRXNjaGVyX0RnZ0NvbnRhaW5lcl9Cc3RvcmVDb250YWluZXIKICoKICogQGNhdGVnb3J5ICAgUEhQRXhjZWwKICogQHBhY2thZ2UgICAgUEhQRXhjZWxfU2hhcmVkX0VzY2hlcgogKiBAY29weXJpZ2h0ICBDb3B5cmlnaHQgKGMpIDIwMDYgLSAyMDEyIFBIUEV4Y2VsIChodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9QSFBFeGNlbCkKICovCmNsYXNzIFBIUEV4Y2VsX1NoYXJlZF9Fc2NoZXJfRGdnQ29udGFpbmVyX0JzdG9yZUNvbnRhaW5lcgp7CgkvKioKCSAqIEJMSVAgU3RvcmUgRW50cmllcy4gRWFjaCBvZiB0aGVtIGhvbGRzIG9uZSBCTElQIChCaWcgTGFyZ2UgSW1hZ2Ugb3IgUGljdHVyZSkKCSAqCgkgKiBAdmFyIGFycmF5CgkgKi8KCXByaXZhdGUgJF9CU0VDb2xsZWN0aW9uID0gYXJyYXkoKTsKCgkvKioKCSAqIEFkZCBhIEJMSVAgU3RvcmUgRW50cnkKCSAqCgkgKiBAcGFyYW0gUEhQRXhjZWxfU2hhcmVkX0VzY2hlcl9EZ2dDb250YWluZXJfQnN0b3JlQ29udGFpbmVyX0JTRSAkQlNFCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBhZGRCU0UoJEJTRSkKCXsKCQkkdGhpcy0+X0JTRUNvbGxlY3Rpb25bXSA9ICRCU0U7CgkJJEJTRS0+c2V0UGFyZW50KCR0aGlzKTsKCX0KCgkvKioKCSAqIEdldCB0aGUgY29sbGVjdGlvbiBvZiBCTElQIFN0b3JlIEVudHJpZXMKCSAqCgkgKiBAcmV0dXJuIFBIUEV4Y2VsX1NoYXJlZF9Fc2NoZXJfRGdnQ29udGFpbmVyX0JzdG9yZUNvbnRhaW5lcl9CU0VbXQoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0QlNFQ29sbGVjdGlvbigpCgl7CgkJcmV0dXJuICR0aGlzLT5fQlNFQ29sbGVjdGlvbjsKCX0KCn0K]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Shared/Escher/DggContainer/BstoreContainer/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Shared/Escher/DggContainer/BstoreContainer/BSE.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIFBIUEV4Y2VsCiAqCiAqIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICoKICogQGNhdGVnb3J5ICAgUEhQRXhjZWwKICogQHBhY2thZ2UgICAgUEhQRXhjZWxfU2hhcmVkX0VzY2hlcgogKiBAY29weXJpZ2h0ICBDb3B5cmlnaHQgKGMpIDIwMDYgLSAyMDEyIFBIUEV4Y2VsIChodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9QSFBFeGNlbCkKICogQGxpY2Vuc2UgICAgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL29sZC1saWNlbnNlcy9sZ3BsLTIuMS50eHQJTEdQTAogKiBAdmVyc2lvbiAgICAxLjcuNywgMjAxMi0wNS0xOQogKi8KCi8qKgogKiBQSFBFeGNlbF9TaGFyZWRfRXNjaGVyX0RnZ0NvbnRhaW5lcl9Cc3RvcmVDb250YWluZXJfQlNFCiAqCiAqIEBjYXRlZ29yeSAgIFBIUEV4Y2VsCiAqIEBwYWNrYWdlICAgIFBIUEV4Y2VsX1NoYXJlZF9Fc2NoZXIKICogQGNvcHlyaWdodCAgQ29weXJpZ2h0IChjKSAyMDA2IC0gMjAxMiBQSFBFeGNlbCAoaHR0cDovL3d3dy5jb2RlcGxleC5jb20vUEhQRXhjZWwpCiAqLwpjbGFzcyBQSFBFeGNlbF9TaGFyZWRfRXNjaGVyX0RnZ0NvbnRhaW5lcl9Cc3RvcmVDb250YWluZXJfQlNFCnsKCWNvbnN0IEJMSVBUWVBFX0VSUk9SCT0gMHgwMDsKCWNvbnN0IEJMSVBUWVBFX1VOS05PV04JPSAweDAxOwoJY29uc3QgQkxJUFRZUEVfRU1GCQk9IDB4MDI7Cgljb25zdCBCTElQVFlQRV9XTUYJCT0gMHgwMzsKCWNvbnN0IEJMSVBUWVBFX1BJQ1QJCT0gMHgwNDsKCWNvbnN0IEJMSVBUWVBFX0pQRUcJCT0gMHgwNTsKCWNvbnN0IEJMSVBUWVBFX1BORwkJPSAweDA2OwoJY29uc3QgQkxJUFRZUEVfRElCCQk9IDB4MDc7Cgljb25zdCBCTElQVFlQRV9USUZGCQk9IDB4MTE7Cgljb25zdCBCTElQVFlQRV9DTVlLSlBFRwk9IDB4MTI7CgoJLyoqCgkgKiBUaGUgcGFyZW50IEJMSVAgU3RvcmUgRW50cnkgQ29udGFpbmVyCgkgKgoJICogQHZhciBQSFBFeGNlbF9TaGFyZWRfRXNjaGVyX0RnZ0NvbnRhaW5lcl9Cc3RvcmVDb250YWluZXIKCSAqLwoJcHJpdmF0ZSAkX3BhcmVudDsKCgkvKioKCSAqIFRoZSBCTElQIChCaWcgTGFyZ2UgSW1hZ2Ugb3IgUGljdHVyZSkKCSAqCgkgKiBAdmFyIFBIUEV4Y2VsX1NoYXJlZF9Fc2NoZXJfRGdnQ29udGFpbmVyX0JzdG9yZUNvbnRhaW5lcl9CU0VfQmxpcAoJICovCglwcml2YXRlICRfYmxpcDsKCgkvKioKCSAqIFRoZSBCTElQIHR5cGUKCSAqCgkgKiBAdmFyIGludAoJICovCglwcml2YXRlICRfYmxpcFR5cGU7CgoJLyoqCgkgKiBTZXQgcGFyZW50IEJMSVAgU3RvcmUgRW50cnkgQ29udGFpbmVyCgkgKgoJICogQHBhcmFtIFBIUEV4Y2VsX1NoYXJlZF9Fc2NoZXJfRGdnQ29udGFpbmVyX0JzdG9yZUNvbnRhaW5lciAkcGFyZW50CgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBzZXRQYXJlbnQoJHBhcmVudCkKCXsKCQkkdGhpcy0+X3BhcmVudCA9ICRwYXJlbnQ7Cgl9CgoJLyoqCgkgKiBHZXQgdGhlIEJMSVAKCSAqCgkgKiBAcmV0dXJuIFBIUEV4Y2VsX1NoYXJlZF9Fc2NoZXJfRGdnQ29udGFpbmVyX0JzdG9yZUNvbnRhaW5lcl9CU0VfQmxpcAoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0QmxpcCgpCgl7CgkJcmV0dXJuICR0aGlzLT5fYmxpcDsKCX0KCgkvKioKCSAqIFNldCB0aGUgQkxJUAoJICoKCSAqIEBwYXJhbSBQSFBFeGNlbF9TaGFyZWRfRXNjaGVyX0RnZ0NvbnRhaW5lcl9Cc3RvcmVDb250YWluZXJfQlNFX0JsaXAgJGJsaXAKCSAqLwoJcHVibGljIGZ1bmN0aW9uIHNldEJsaXAoJGJsaXApCgl7CgkJJHRoaXMtPl9ibGlwID0gJGJsaXA7CgkJJGJsaXAtPnNldFBhcmVudCgkdGhpcyk7Cgl9CgoJLyoqCgkgKiBHZXQgdGhlIEJMSVAgdHlwZQoJICoKCSAqIEByZXR1cm4gaW50CgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRCbGlwVHlwZSgpCgl7CgkJcmV0dXJuICR0aGlzLT5fYmxpcFR5cGU7Cgl9CgoJLyoqCgkgKiBTZXQgdGhlIEJMSVAgdHlwZQoJICoKCSAqIEBwYXJhbSBpbnQKCSAqLwoJcHVibGljIGZ1bmN0aW9uIHNldEJsaXBUeXBlKCRibGlwVHlwZSkKCXsKCQkkdGhpcy0+X2JsaXBUeXBlID0gJGJsaXBUeXBlOwoJfQoKfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Shared/Escher/DggContainer/BstoreContainer/BSE/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Shared/Escher/DggContainer/BstoreContainer/BSE/Blip.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIFBIUEV4Y2VsCiAqCiAqIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICoKICogQGNhdGVnb3J5ICAgUEhQRXhjZWwKICogQHBhY2thZ2UgICAgUEhQRXhjZWxfU2hhcmVkX0VzY2hlcgogKiBAY29weXJpZ2h0ICBDb3B5cmlnaHQgKGMpIDIwMDYgLSAyMDEyIFBIUEV4Y2VsIChodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9QSFBFeGNlbCkKICogQGxpY2Vuc2UgICAgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL29sZC1saWNlbnNlcy9sZ3BsLTIuMS50eHQJTEdQTAogKiBAdmVyc2lvbiAgICAxLjcuNywgMjAxMi0wNS0xOQogKi8KCi8qKgogKiBQSFBFeGNlbF9TaGFyZWRfRXNjaGVyX0RnZ0NvbnRhaW5lcl9Cc3RvcmVDb250YWluZXJfQlNFX0JsaXAKICoKICogQGNhdGVnb3J5ICAgUEhQRXhjZWwKICogQHBhY2thZ2UgICAgUEhQRXhjZWxfU2hhcmVkX0VzY2hlcgogKiBAY29weXJpZ2h0ICBDb3B5cmlnaHQgKGMpIDIwMDYgLSAyMDEyIFBIUEV4Y2VsIChodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9QSFBFeGNlbCkKICovCmNsYXNzIFBIUEV4Y2VsX1NoYXJlZF9Fc2NoZXJfRGdnQ29udGFpbmVyX0JzdG9yZUNvbnRhaW5lcl9CU0VfQmxpcAp7CgkvKioKCSAqIFRoZSBwYXJlbnQgQlNFCgkgKgoJICogQHZhciBQSFBFeGNlbF9TaGFyZWRfRXNjaGVyX0RnZ0NvbnRhaW5lcl9Cc3RvcmVDb250YWluZXJfQlNFCgkgKi8KCXByaXZhdGUgJF9wYXJlbnQ7CgoJLyoqCgkgKiBSYXcgaW1hZ2UgZGF0YQoJICoKCSAqIEB2YXIgc3RyaW5nCgkgKi8KCXByaXZhdGUgJF9kYXRhOwoKCS8qKgoJICogR2V0IHRoZSByYXcgaW1hZ2UgZGF0YQoJICoKCSAqIEByZXR1cm4gc3RyaW5nCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXREYXRhKCkKCXsKCQlyZXR1cm4gJHRoaXMtPl9kYXRhOwoJfQoKCS8qKgoJICogU2V0IHRoZSByYXcgaW1hZ2UgZGF0YQoJICoKCSAqIEBwYXJhbSBzdHJpbmcKCSAqLwoJcHVibGljIGZ1bmN0aW9uIHNldERhdGEoJGRhdGEpCgl7CgkJJHRoaXMtPl9kYXRhID0gJGRhdGE7Cgl9CgoJLyoqCgkgKiBTZXQgcGFyZW50IEJTRQoJICoKCSAqIEBwYXJhbSBQSFBFeGNlbF9TaGFyZWRfRXNjaGVyX0RnZ0NvbnRhaW5lcl9Cc3RvcmVDb250YWluZXJfQlNFICRwYXJlbnQKCSAqLwoJcHVibGljIGZ1bmN0aW9uIHNldFBhcmVudCgkcGFyZW50KQoJewoJCSR0aGlzLT5fcGFyZW50ID0gJHBhcmVudDsKCX0KCgkvKioKCSAqIEdldCBwYXJlbnQgQlNFCgkgKgoJICogQHJldHVybiBQSFBFeGNlbF9TaGFyZWRfRXNjaGVyX0RnZ0NvbnRhaW5lcl9Cc3RvcmVDb250YWluZXJfQlNFICRwYXJlbnQKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldFBhcmVudCgpCgl7CgkJcmV0dXJuICR0aGlzLT5fcGFyZW50OwoJfQoKfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Shared/Excel5.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIFBIUEV4Y2VsCiAqCiAqIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICoKICogQGNhdGVnb3J5ICAgUEhQRXhjZWwKICogQHBhY2thZ2UgICAgUEhQRXhjZWxfU2hhcmVkCiAqIEBjb3B5cmlnaHQgIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwgKGh0dHA6Ly93d3cuY29kZXBsZXguY29tL1BIUEV4Y2VsKQogKiBAbGljZW5zZSAgICBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvb2xkLWxpY2Vuc2VzL2xncGwtMi4xLnR4dAlMR1BMCiAqIEB2ZXJzaW9uICAgIDEuNy43LCAyMDEyLTA1LTE5CiAqLwoKLyoqCiAqIFBIUEV4Y2VsX1NoYXJlZF9FeGNlbDUKICoKICogQGNhdGVnb3J5ICAgUEhQRXhjZWwKICogQHBhY2thZ2UgICAgUEhQRXhjZWxfU2hhcmVkCiAqIEBjb3B5cmlnaHQgIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwgKGh0dHA6Ly93d3cuY29kZXBsZXguY29tL1BIUEV4Y2VsKQogKi8KY2xhc3MgUEhQRXhjZWxfU2hhcmVkX0V4Y2VsNQp7CgkvKioKCSAqIEdldCB0aGUgd2lkdGggb2YgYSBjb2x1bW4gaW4gcGl4ZWxzLiBXZSB1c2UgdGhlIHJlbGF0aW9uc2hpcCB5ID0gY2VpbCg3eCkgd2hlcmUKCSAqIHggaXMgdGhlIHdpZHRoIGluIGludHJpbnNpYyBFeGNlbCB1bml0cyAobWVhc3VyaW5nIHdpZHRoIGluIG51bWJlciBvZiBub3JtYWwgY2hhcmFjdGVycykKCSAqIFRoaXMgaG9sZHMgZm9yIEFyaWFsIDEwCgkgKgoJICogQHBhcmFtIFBIUEV4Y2VsX1dvcmtzaGVldCAkc2hlZXQgVGhlIHNoZWV0CgkgKiBAcGFyYW0gaW50ZWdlciAkY29sIFRoZSBjb2x1bW4KCSAqIEByZXR1cm4gaW50ZWdlciBUaGUgd2lkdGggaW4gcGl4ZWxzCgkqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBzaXplQ29sKCRzaGVldCwgJGNvbCA9ICdBJykKCXsKCQkvLyBkZWZhdWx0IGZvbnQgb2YgdGhlIHdvcmtib29rCgkJJGZvbnQgPSAkc2hlZXQtPmdldFBhcmVudCgpLT5nZXREZWZhdWx0U3R5bGUoKS0+Z2V0Rm9udCgpOwoKCQkkY29sdW1uRGltZW5zaW9ucyA9ICRzaGVldC0+Z2V0Q29sdW1uRGltZW5zaW9ucygpOwoKCQkvLyBmaXJzdCBmaW5kIHRoZSB0cnVlIGNvbHVtbiB3aWR0aCBpbiBwaXhlbHMgKHVuY29sbGFwc2VkIGFuZCB1bmhpZGRlbikKCQlpZiAoIGlzc2V0KCRjb2x1bW5EaW1lbnNpb25zWyRjb2xdKSBhbmQgJGNvbHVtbkRpbWVuc2lvbnNbJGNvbF0tPmdldFdpZHRoKCkgIT0gLTEgKSB7CgoJCQkvLyB0aGVuIHdlIGhhdmUgY29sdW1uIGRpbWVuc2lvbiB3aXRoIGV4cGxpY2l0IHdpZHRoCgkJCSRjb2x1bW5EaW1lbnNpb24gPSAkY29sdW1uRGltZW5zaW9uc1skY29sXTsKCQkJJHdpZHRoID0gJGNvbHVtbkRpbWVuc2lvbi0+Z2V0V2lkdGgoKTsKCQkJJHBpeGVsV2lkdGggPSBQSFBFeGNlbF9TaGFyZWRfRHJhd2luZzo6Y2VsbERpbWVuc2lvblRvUGl4ZWxzKCR3aWR0aCwgJGZvbnQpOwoKCQl9IGVsc2UgaWYgKCRzaGVldC0+Z2V0RGVmYXVsdENvbHVtbkRpbWVuc2lvbigpLT5nZXRXaWR0aCgpICE9IC0xKSB7CgoJCQkvLyB0aGVuIHdlIGhhdmUgZGVmYXVsdCBjb2x1bW4gZGltZW5zaW9uIHdpdGggZXhwbGljaXQgd2lkdGgKCQkJJGRlZmF1bHRDb2x1bW5EaW1lbnNpb24gPSAkc2hlZXQtPmdldERlZmF1bHRDb2x1bW5EaW1lbnNpb24oKTsKCQkJJHdpZHRoID0gJGRlZmF1bHRDb2x1bW5EaW1lbnNpb24tPmdldFdpZHRoKCk7CgkJCSRwaXhlbFdpZHRoID0gUEhQRXhjZWxfU2hhcmVkX0RyYXdpbmc6OmNlbGxEaW1lbnNpb25Ub1BpeGVscygkd2lkdGgsICRmb250KTsKCgkJfSBlbHNlIHsKCgkJCS8vIHdlIGRvbid0IGV2ZW4gaGF2ZSBhbnkgZGVmYXVsdCBjb2x1bW4gZGltZW5zaW9uLiBXaWR0aCBkZXBlbmRzIG9uIGRlZmF1bHQgZm9udAoJCQkkcGl4ZWxXaWR0aCA9IFBIUEV4Y2VsX1NoYXJlZF9Gb250OjpnZXREZWZhdWx0Q29sdW1uV2lkdGhCeUZvbnQoJGZvbnQsIHRydWUpOwoJCX0KCgkJLy8gbm93IGZpbmQgdGhlIGVmZmVjdGl2ZSBjb2x1bW4gd2lkdGggaW4gcGl4ZWxzCgkJaWYgKGlzc2V0KCRjb2x1bW5EaW1lbnNpb25zWyRjb2xdKSBhbmQgISRjb2x1bW5EaW1lbnNpb25zWyRjb2xdLT5nZXRWaXNpYmxlKCkpIHsKCQkJJGVmZmVjdGl2ZVBpeGVsV2lkdGggPSAwOwoJCX0gZWxzZSB7CgkJCSRlZmZlY3RpdmVQaXhlbFdpZHRoID0gJHBpeGVsV2lkdGg7CgkJfQoKCQlyZXR1cm4gJGVmZmVjdGl2ZVBpeGVsV2lkdGg7Cgl9CgoJLyoqCgkgKiBDb252ZXJ0IHRoZSBoZWlnaHQgb2YgYSBjZWxsIGZyb20gdXNlcidzIHVuaXRzIHRvIHBpeGVscy4gQnkgaW50ZXJwb2xhdGlvbgoJICogdGhlIHJlbGF0aW9uc2hpcCBpczogeSA9IDQvM3guIElmIHRoZSBoZWlnaHQgaGFzbid0IGJlZW4gc2V0IGJ5IHRoZSB1c2VyIHdlCgkgKiB1c2UgdGhlIGRlZmF1bHQgdmFsdWUuIElmIHRoZSByb3cgaXMgaGlkZGVuIHdlIHVzZSBhIHZhbHVlIG9mIHplcm8uCgkgKgoJICogQHBhcmFtIFBIUEV4Y2VsX1dvcmtzaGVldCAkc2hlZXQgVGhlIHNoZWV0CgkgKiBAcGFyYW0gaW50ZWdlciAkcm93IFRoZSByb3cgaW5kZXggKDEtYmFzZWQpCgkgKiBAcmV0dXJuIGludGVnZXIgVGhlIHdpZHRoIGluIHBpeGVscwoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHNpemVSb3coJHNoZWV0LCAkcm93ID0gMSkKCXsKCQkvLyBkZWZhdWx0IGZvbnQgb2YgdGhlIHdvcmtib29rCgkJJGZvbnQgPSAkc2hlZXQtPmdldFBhcmVudCgpLT5nZXREZWZhdWx0U3R5bGUoKS0+Z2V0Rm9udCgpOwoKCQkkcm93RGltZW5zaW9ucyA9ICRzaGVldC0+Z2V0Um93RGltZW5zaW9ucygpOwoKCQkvLyBmaXJzdCBmaW5kIHRoZSB0cnVlIHJvdyBoZWlnaHQgaW4gcGl4ZWxzICh1bmNvbGxhcHNlZCBhbmQgdW5oaWRkZW4pCgkJaWYgKCBpc3NldCgkcm93RGltZW5zaW9uc1skcm93XSkgYW5kICRyb3dEaW1lbnNpb25zWyRyb3ddLT5nZXRSb3dIZWlnaHQoKSAhPSAtMSkgewoKCQkJLy8gdGhlbiB3ZSBoYXZlIGEgcm93IGRpbWVuc2lvbgoJCQkkcm93RGltZW5zaW9uID0gJHJvd0RpbWVuc2lvbnNbJHJvd107CgkJCSRyb3dIZWlnaHQgPSAkcm93RGltZW5zaW9uLT5nZXRSb3dIZWlnaHQoKTsKCQkJJHBpeGVsUm93SGVpZ2h0ID0gKGludCkgY2VpbCg0ICogJHJvd0hlaWdodCAvIDMpOyAvLyBoZXJlIHdlIGFzc3VtZSBBcmlhbCAxMAoKCQl9IGVsc2UgaWYgKCRzaGVldC0+Z2V0RGVmYXVsdFJvd0RpbWVuc2lvbigpLT5nZXRSb3dIZWlnaHQoKSAhPSAtMSkgewoKCQkJLy8gdGhlbiB3ZSBoYXZlIGEgZGVmYXVsdCByb3cgZGltZW5zaW9uIHdpdGggZXhwbGljaXQgaGVpZ2h0CgkJCSRkZWZhdWx0Um93RGltZW5zaW9uID0gJHNoZWV0LT5nZXREZWZhdWx0Um93RGltZW5zaW9uKCk7CgkJCSRyb3dIZWlnaHQgPSAkZGVmYXVsdFJvd0RpbWVuc2lvbi0+Z2V0Um93SGVpZ2h0KCk7CgkJCSRwaXhlbFJvd0hlaWdodCA9IFBIUEV4Y2VsX1NoYXJlZF9EcmF3aW5nOjpwb2ludHNUb1BpeGVscygkcm93SGVpZ2h0KTsKCgkJfSBlbHNlIHsKCgkJCS8vIHdlIGRvbid0IGV2ZW4gaGF2ZSBhbnkgZGVmYXVsdCByb3cgZGltZW5zaW9uLiBIZWlnaHQgZGVwZW5kcyBvbiBkZWZhdWx0IGZvbnQKCQkJJHBvaW50Um93SGVpZ2h0ID0gUEhQRXhjZWxfU2hhcmVkX0ZvbnQ6OmdldERlZmF1bHRSb3dIZWlnaHRCeUZvbnQoJGZvbnQpOwoJCQkkcGl4ZWxSb3dIZWlnaHQgPSBQSFBFeGNlbF9TaGFyZWRfRm9udDo6Zm9udFNpemVUb1BpeGVscygkcG9pbnRSb3dIZWlnaHQpOwoKCQl9CgoJCS8vIG5vdyBmaW5kIHRoZSBlZmZlY3RpdmUgcm93IGhlaWdodCBpbiBwaXhlbHMKCQlpZiAoIGlzc2V0KCRyb3dEaW1lbnNpb25zWyRyb3ddKSBhbmQgISRyb3dEaW1lbnNpb25zWyRyb3ddLT5nZXRWaXNpYmxlKCkgKSB7CgkJCSRlZmZlY3RpdmVQaXhlbFJvd0hlaWdodCA9IDA7CgkJfSBlbHNlIHsKCQkJJGVmZmVjdGl2ZVBpeGVsUm93SGVpZ2h0ID0gJHBpeGVsUm93SGVpZ2h0OwoJCX0KCgkJcmV0dXJuICRlZmZlY3RpdmVQaXhlbFJvd0hlaWdodDsKCX0KCgkvKioKCSAqIEdldCB0aGUgaG9yaXpvbnRhbCBkaXN0YW5jZSBpbiBwaXhlbHMgYmV0d2VlbiB0d28gYW5jaG9ycwoJICogVGhlIGRpc3RhbmNlWCBpcyBmb3VuZCBhcyBzdW0gb2YgYWxsIHRoZSBzcGFubmluZyBjb2x1bW5zIHdpZHRocyBtaW51cyBjb3JyZWN0aW9uIGZvciB0aGUgdHdvIG9mZnNldHMKCSAqCgkgKiBAcGFyYW0gUEhQRXhjZWxfV29ya3NoZWV0ICRzaGVldAoJICogQHBhcmFtIHN0cmluZyAkc3RhcnRDb2x1bW4KCSAqIEBwYXJhbSBpbnRlZ2VyICRzdGFydE9mZnNldCBPZmZzZXQgd2l0aGluIHN0YXJ0IGNlbGwgbWVhc3VyZWQgaW4gMS8xMDI0IG9mIHRoZSBjZWxsIHdpZHRoCgkgKiBAcGFyYW0gc3RyaW5nICRlbmRDb2x1bW4KCSAqIEBwYXJhbSBpbnRlZ2VyICRlbmRPZmZzZXQgT2Zmc2V0IHdpdGhpbiBlbmQgY2VsbCBtZWFzdXJlZCBpbiAxLzEwMjQgb2YgdGhlIGNlbGwgd2lkdGgKCSAqIEByZXR1cm4gaW50ZWdlciBIb3Jpem9udGFsIG1lYXN1cmVkIGluIHBpeGVscwoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldERpc3RhbmNlWChQSFBFeGNlbF9Xb3Jrc2hlZXQgJHNoZWV0LCAkc3RhcnRDb2x1bW4gPSAnQScsICRzdGFydE9mZnNldFggPSAwLCAkZW5kQ29sdW1uID0gJ0EnLCAkZW5kT2Zmc2V0WCA9IDApCgl7CgkJJGRpc3RhbmNlWCA9IDA7CgoJCS8vIGFkZCB0aGUgd2lkdGhzIG9mIHRoZSBzcGFubmluZyBjb2x1bW5zCgkJJHN0YXJ0Q29sdW1uSW5kZXggPSBQSFBFeGNlbF9DZWxsOjpjb2x1bW5JbmRleEZyb21TdHJpbmcoJHN0YXJ0Q29sdW1uKSAtIDE7IC8vIDEtYmFzZWQKCQkkZW5kQ29sdW1uSW5kZXggPSBQSFBFeGNlbF9DZWxsOjpjb2x1bW5JbmRleEZyb21TdHJpbmcoJGVuZENvbHVtbikgLSAxOyAvLyAxLWJhc2VkCgkJZm9yICgkaSA9ICRzdGFydENvbHVtbkluZGV4OyAkaSA8PSAkZW5kQ29sdW1uSW5kZXg7ICsrJGkpIHsKCQkJJGRpc3RhbmNlWCArPSBzZWxmOjpzaXplQ29sKCRzaGVldCwgUEhQRXhjZWxfQ2VsbDo6c3RyaW5nRnJvbUNvbHVtbkluZGV4KCRpKSk7CgkJfQoKCQkvLyBjb3JyZWN0IGZvciBvZmZzZXRYIGluIHN0YXJ0Y2VsbAoJCSRkaXN0YW5jZVggLT0gKGludCkgZmxvb3Ioc2VsZjo6c2l6ZUNvbCgkc2hlZXQsICRzdGFydENvbHVtbikgKiAkc3RhcnRPZmZzZXRYIC8gMTAyNCk7CgoJCS8vIGNvcnJlY3QgZm9yIG9mZnNldFggaW4gZW5kY2VsbAoJCSRkaXN0YW5jZVggLT0gKGludCkgZmxvb3Ioc2VsZjo6c2l6ZUNvbCgkc2hlZXQsICRlbmRDb2x1bW4pICogKDEgLSAkZW5kT2Zmc2V0WCAvIDEwMjQpKTsKCgkJcmV0dXJuICRkaXN0YW5jZVg7Cgl9CgoJLyoqCgkgKiBHZXQgdGhlIHZlcnRpY2FsIGRpc3RhbmNlIGluIHBpeGVscyBiZXR3ZWVuIHR3byBhbmNob3JzCgkgKiBUaGUgZGlzdGFuY2VZIGlzIGZvdW5kIGFzIHN1bSBvZiBhbGwgdGhlIHNwYW5uaW5nIHJvd3MgbWludXMgdHdvIG9mZnNldHMKCSAqCgkgKiBAcGFyYW0gUEhQRXhjZWxfV29ya3NoZWV0ICRzaGVldAoJICogQHBhcmFtIHN0cmluZyAkc3RhcnRSb3cgKDEtYmFzZWQpCgkgKiBAcGFyYW0gaW50ZWdlciAkc3RhcnRPZmZzZXQgT2Zmc2V0IHdpdGhpbiBzdGFydCBjZWxsIG1lYXN1cmVkIGluIDEvMjU2IG9mIHRoZSBjZWxsIGhlaWdodAoJICogQHBhcmFtIHN0cmluZyAkZW5kUm93ICgxLWJhc2VkKQoJICogQHBhcmFtIGludGVnZXIgJGVuZE9mZnNldCBPZmZzZXQgd2l0aGluIGVuZCBjZWxsIG1lYXN1cmVkIGluIDEvMjU2IG9mIHRoZSBjZWxsIGhlaWdodAoJICogQHJldHVybiBpbnRlZ2VyIFZlcnRpY2FsIGRpc3RhbmNlIG1lYXN1cmVkIGluIHBpeGVscwoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldERpc3RhbmNlWShQSFBFeGNlbF9Xb3Jrc2hlZXQgJHNoZWV0LCAkc3RhcnRSb3cgPSAxLCAkc3RhcnRPZmZzZXRZID0gMCwgJGVuZFJvdyA9IDEsICRlbmRPZmZzZXRZID0gMCkKCXsKCQkkZGlzdGFuY2VZID0gMDsKCgkJLy8gYWRkIHRoZSB3aWR0aHMgb2YgdGhlIHNwYW5uaW5nIHJvd3MKCQlmb3IgKCRyb3cgPSAkc3RhcnRSb3c7ICRyb3cgPD0gJGVuZFJvdzsgKyskcm93KSB7CgkJCSRkaXN0YW5jZVkgKz0gc2VsZjo6c2l6ZVJvdygkc2hlZXQsICRyb3cpOwoJCX0KCgkJLy8gY29ycmVjdCBmb3Igb2Zmc2V0WCBpbiBzdGFydGNlbGwKCQkkZGlzdGFuY2VZIC09IChpbnQpIGZsb29yKHNlbGY6OnNpemVSb3coJHNoZWV0LCAkc3RhcnRSb3cpICogJHN0YXJ0T2Zmc2V0WSAvIDI1Nik7CgoJCS8vIGNvcnJlY3QgZm9yIG9mZnNldFggaW4gZW5kY2VsbAoJCSRkaXN0YW5jZVkgLT0gKGludCkgZmxvb3Ioc2VsZjo6c2l6ZVJvdygkc2hlZXQsICRlbmRSb3cpICogKDEgLSAkZW5kT2Zmc2V0WSAvIDI1NikpOwoKCQlyZXR1cm4gJGRpc3RhbmNlWTsKCX0KCgkvKioKCSAqIENvbnZlcnQgMS1jZWxsIGFuY2hvciBjb29yZGluYXRlcyB0byAyLWNlbGwgYW5jaG9yIGNvb3JkaW5hdGVzCgkgKiBUaGlzIGZ1bmN0aW9uIGlzIHBvcnRlZCBmcm9tIFBFQVIgU3ByZWFkc2hlZXRfV3JpdGVyX0V4Y2VsIHdpdGggc21hbGwgbW9kaWZpY2F0aW9ucwoJICoKCSAqIENhbGN1bGF0ZSB0aGUgdmVydGljZXMgdGhhdCBkZWZpbmUgdGhlIHBvc2l0aW9uIG9mIHRoZSBpbWFnZSBhcyByZXF1aXJlZCBieQoJICogdGhlIE9CSiByZWNvcmQuCgkgKgoJICoJCSArLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSsKCSAqCQkgfAkgQQkgIHwJICBCCSB8CgkgKiAgICstLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKwoJICogICB8CSB8KHgxLHkxKQkgfAkJCXwKCSAqICAgfCAgMSAgfChBMSkuX19fX19fX3xfX19fX18JICB8CgkgKiAgIHwJIHwJfAkJCSAgfAkgfAoJICogICB8CSB8CXwJCQkgIHwJIHwKCSAqICAgKy0tLS0tKy0tLS18CUJJVE1BUAl8LS0tLS0rCgkgKiAgIHwJIHwJfAkJCSAgfAkgfAoJICogICB8ICAyICB8CXxfX19fX19fX19fX19fXy4JIHwKCSAqICAgfAkgfAkJCXwJCShCMil8CgkgKiAgIHwJIHwJCQl8CSAoeDIseTIpfAoJICogICArLS0tLSArLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSsKCSAqCgkgKiBFeGFtcGxlIG9mIGEgYml0bWFwIHRoYXQgY292ZXJzIHNvbWUgb2YgdGhlIGFyZWEgZnJvbSBjZWxsIEExIHRvIGNlbGwgQjIuCgkgKgoJICogQmFzZWQgb24gdGhlIHdpZHRoIGFuZCBoZWlnaHQgb2YgdGhlIGJpdG1hcCB3ZSBuZWVkIHRvIGNhbGN1bGF0ZSA4IHZhcnM6CgkgKgkgJGNvbF9zdGFydCwgJHJvd19zdGFydCwgJGNvbF9lbmQsICRyb3dfZW5kLCAkeDEsICR5MSwgJHgyLCAkeTIuCgkgKiBUaGUgd2lkdGggYW5kIGhlaWdodCBvZiB0aGUgY2VsbHMgYXJlIGFsc28gdmFyaWFibGUgYW5kIGhhdmUgdG8gYmUgdGFrZW4gaW50bwoJICogYWNjb3VudC4KCSAqIFRoZSB2YWx1ZXMgb2YgJGNvbF9zdGFydCBhbmQgJHJvd19zdGFydCBhcmUgcGFzc2VkIGluIGZyb20gdGhlIGNhbGxpbmcKCSAqIGZ1bmN0aW9uLiBUaGUgdmFsdWVzIG9mICRjb2xfZW5kIGFuZCAkcm93X2VuZCBhcmUgY2FsY3VsYXRlZCBieSBzdWJ0cmFjdGluZwoJICogdGhlIHdpZHRoIGFuZCBoZWlnaHQgb2YgdGhlIGJpdG1hcCBmcm9tIHRoZSB3aWR0aCBhbmQgaGVpZ2h0IG9mIHRoZQoJICogdW5kZXJseWluZyBjZWxscy4KCSAqIFRoZSB2ZXJ0aWNlcyBhcmUgZXhwcmVzc2VkIGFzIGEgcGVyY2VudGFnZSBvZiB0aGUgdW5kZXJseWluZyBjZWxsIHdpZHRoIGFzCgkgKiBmb2xsb3dzIChyaHMgdmFsdWVzIGFyZSBpbiBwaXhlbHMpOgoJICoKCSAqCSAgIHgxID0gWCAvIFcgKjEwMjQKCSAqCSAgIHkxID0gWSAvIEggKjI1NgoJICoJICAgeDIgPSAoWC0xKSAvIFcgKjEwMjQKCSAqCSAgIHkyID0gKFktMSkgLyBIICoyNTYKCSAqCgkgKgkgICBXaGVyZTogIFggaXMgZGlzdGFuY2UgZnJvbSB0aGUgbGVmdCBzaWRlIG9mIHRoZSB1bmRlcmx5aW5nIGNlbGwKCSAqCQkJICAgWSBpcyBkaXN0YW5jZSBmcm9tIHRoZSB0b3Agb2YgdGhlIHVuZGVybHlpbmcgY2VsbAoJICoJCQkgICBXIGlzIHRoZSB3aWR0aCBvZiB0aGUgY2VsbAoJICoJCQkgICBIIGlzIHRoZSBoZWlnaHQgb2YgdGhlIGNlbGwKCSAqCgkgKiBAcGFyYW0gUEhQRXhjZWxfV29ya3NoZWV0ICRzaGVldAoJICogQHBhcmFtIHN0cmluZyAkY29vcmRpbmF0ZXMgRS5nLiAnQTEnCgkgKiBAcGFyYW0gaW50ZWdlciAkb2Zmc2V0WCBIb3Jpem9udGFsIG9mZnNldCBpbiBwaXhlbHMKCSAqIEBwYXJhbSBpbnRlZ2VyICRvZmZzZXRZIFZlcnRpY2FsIG9mZnNldCBpbiBwaXhlbHMKCSAqIEBwYXJhbSBpbnRlZ2VyICR3aWR0aCBXaWR0aCBpbiBwaXhlbHMKCSAqIEBwYXJhbSBpbnRlZ2VyICRoZWlnaHQgSGVpZ2h0IGluIHBpeGVscwoJICogQHJldHVybiBhcnJheQoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIG9uZUFuY2hvcjJ0d29BbmNob3IoJHNoZWV0LCAkY29vcmRpbmF0ZXMsICRvZmZzZXRYLCAkb2Zmc2V0WSwgJHdpZHRoLCAkaGVpZ2h0KQoJewoJCWxpc3QoJGNvbHVtbiwgJHJvdykgPSBQSFBFeGNlbF9DZWxsOjpjb29yZGluYXRlRnJvbVN0cmluZygkY29vcmRpbmF0ZXMpOwoJCSRjb2xfc3RhcnQgPSBQSFBFeGNlbF9DZWxsOjpjb2x1bW5JbmRleEZyb21TdHJpbmcoJGNvbHVtbikgLSAxOwoJCSRyb3dfc3RhcnQgPSAkcm93IC0gMTsKCgkJJHgxID0gJG9mZnNldFg7CgkJJHkxID0gJG9mZnNldFk7CgoJCS8vIEluaXRpYWxpc2UgZW5kIGNlbGwgdG8gdGhlIHNhbWUgYXMgdGhlIHN0YXJ0IGNlbGwKCQkkY29sX2VuZAk9ICRjb2xfc3RhcnQ7ICAvLyBDb2wgY29udGFpbmluZyBsb3dlciByaWdodCBjb3JuZXIgb2Ygb2JqZWN0CgkJJHJvd19lbmQJPSAkcm93X3N0YXJ0OyAgLy8gUm93IGNvbnRhaW5pbmcgYm90dG9tIHJpZ2h0IGNvcm5lciBvZiBvYmplY3QKCgkJLy8gWmVybyB0aGUgc3BlY2lmaWVkIG9mZnNldCBpZiBncmVhdGVyIHRoYW4gdGhlIGNlbGwgZGltZW5zaW9ucwoJCWlmICgkeDEgPj0gc2VsZjo6c2l6ZUNvbCgkc2hlZXQsIFBIUEV4Y2VsX0NlbGw6OnN0cmluZ0Zyb21Db2x1bW5JbmRleCgkY29sX3N0YXJ0KSkpIHsKCQkJJHgxID0gMDsKCQl9CgkJaWYgKCR5MSA+PSBzZWxmOjpzaXplUm93KCRzaGVldCwgJHJvd19zdGFydCArIDEpKSB7CgkJCSR5MSA9IDA7CgkJfQoKCQkkd2lkdGgJICA9ICR3aWR0aCAgKyAkeDEgLTE7CgkJJGhlaWdodAkgPSAkaGVpZ2h0ICsgJHkxIC0xOwoKCQkvLyBTdWJ0cmFjdCB0aGUgdW5kZXJseWluZyBjZWxsIHdpZHRocyB0byBmaW5kIHRoZSBlbmQgY2VsbCBvZiB0aGUgaW1hZ2UKCQl3aGlsZSAoJHdpZHRoID49IHNlbGY6OnNpemVDb2woJHNoZWV0LCBQSFBFeGNlbF9DZWxsOjpzdHJpbmdGcm9tQ29sdW1uSW5kZXgoJGNvbF9lbmQpKSkgewoJCQkkd2lkdGggLT0gc2VsZjo6c2l6ZUNvbCgkc2hlZXQsIFBIUEV4Y2VsX0NlbGw6OnN0cmluZ0Zyb21Db2x1bW5JbmRleCgkY29sX2VuZCkpOwoJCQkrKyRjb2xfZW5kOwoJCX0KCgkJLy8gU3VidHJhY3QgdGhlIHVuZGVybHlpbmcgY2VsbCBoZWlnaHRzIHRvIGZpbmQgdGhlIGVuZCBjZWxsIG9mIHRoZSBpbWFnZQoJCXdoaWxlICgkaGVpZ2h0ID49IHNlbGY6OnNpemVSb3coJHNoZWV0LCAkcm93X2VuZCArIDEpKSB7CgkJCSRoZWlnaHQgLT0gc2VsZjo6c2l6ZVJvdygkc2hlZXQsICRyb3dfZW5kICsgMSk7CgkJCSsrJHJvd19lbmQ7CgkJfQoKCQkvLyBCaXRtYXAgaXNuJ3QgYWxsb3dlZCB0byBzdGFydCBvciBmaW5pc2ggaW4gYSBoaWRkZW4gY2VsbCwgaS5lLiBhIGNlbGwKCQkvLyB3aXRoIHplcm8gaGVpZ2h0IG9yIHdpZHRoLgoJCWlmIChzZWxmOjpzaXplQ29sKCRzaGVldCwgUEhQRXhjZWxfQ2VsbDo6c3RyaW5nRnJvbUNvbHVtbkluZGV4KCRjb2xfc3RhcnQpKSA9PSAwKSB7CgkJCXJldHVybjsKCQl9CgkJaWYgKHNlbGY6OnNpemVDb2woJHNoZWV0LCBQSFBFeGNlbF9DZWxsOjpzdHJpbmdGcm9tQ29sdW1uSW5kZXgoJGNvbF9lbmQpKSAgID09IDApIHsKCQkJcmV0dXJuOwoJCX0KCQlpZiAoc2VsZjo6c2l6ZVJvdygkc2hlZXQsICRyb3dfc3RhcnQgKyAxKSA9PSAwKSB7CgkJCXJldHVybjsKCQl9CgkJaWYgKHNlbGY6OnNpemVSb3coJHNoZWV0LCAkcm93X2VuZCArIDEpICAgPT0gMCkgewoJCQlyZXR1cm47CgkJfQoKCQkvLyBDb252ZXJ0IHRoZSBwaXhlbCB2YWx1ZXMgdG8gdGhlIHBlcmNlbnRhZ2UgdmFsdWUgZXhwZWN0ZWQgYnkgRXhjZWwKCQkkeDEgPSAkeDEJIC8gc2VsZjo6c2l6ZUNvbCgkc2hlZXQsIFBIUEV4Y2VsX0NlbGw6OnN0cmluZ0Zyb21Db2x1bW5JbmRleCgkY29sX3N0YXJ0KSkgICAqIDEwMjQ7CgkJJHkxID0gJHkxCSAvIHNlbGY6OnNpemVSb3coJHNoZWV0LCAkcm93X3N0YXJ0ICsgMSkgICAqICAyNTY7CgkJJHgyID0gKCR3aWR0aCArIDEpICAvIHNlbGY6OnNpemVDb2woJHNoZWV0LCBQSFBFeGNlbF9DZWxsOjpzdHJpbmdGcm9tQ29sdW1uSW5kZXgoJGNvbF9lbmQpKQkgKiAxMDI0OyAvLyBEaXN0YW5jZSB0byByaWdodCBzaWRlIG9mIG9iamVjdAoJCSR5MiA9ICgkaGVpZ2h0ICsgMSkgLyBzZWxmOjpzaXplUm93KCRzaGVldCwgJHJvd19lbmQgKyAxKQkgKiAgMjU2OyAvLyBEaXN0YW5jZSB0byBib3R0b20gb2Ygb2JqZWN0CgoJCSRzdGFydENvb3JkaW5hdGVzID0gUEhQRXhjZWxfQ2VsbDo6c3RyaW5nRnJvbUNvbHVtbkluZGV4KCRjb2xfc3RhcnQpIC4gKCRyb3dfc3RhcnQgKyAxKTsKCQkkZW5kQ29vcmRpbmF0ZXMgPSBQSFBFeGNlbF9DZWxsOjpzdHJpbmdGcm9tQ29sdW1uSW5kZXgoJGNvbF9lbmQpIC4gKCRyb3dfZW5kICsgMSk7CgoJCSR0d29BbmNob3IgPSBhcnJheSgKCQkJJ3N0YXJ0Q29vcmRpbmF0ZXMnID0+ICRzdGFydENvb3JkaW5hdGVzLAoJCQknc3RhcnRPZmZzZXRYJyA9PiAkeDEsCgkJCSdzdGFydE9mZnNldFknID0+ICR5MSwKCQkJJ2VuZENvb3JkaW5hdGVzJyA9PiAkZW5kQ29vcmRpbmF0ZXMsCgkJCSdlbmRPZmZzZXRYJyA9PiAkeDIsCgkJCSdlbmRPZmZzZXRZJyA9PiAkeTIsCgkJKTsKCgkJcmV0dXJuICAkdHdvQW5jaG9yOwoJfQoKfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Shared/File.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIFBIUEV4Y2VsCiAqCiAqIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICoKICogQGNhdGVnb3J5ICAgUEhQRXhjZWwKICogQHBhY2thZ2UgICAgUEhQRXhjZWxfU2hhcmVkCiAqIEBjb3B5cmlnaHQgIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwgKGh0dHA6Ly93d3cuY29kZXBsZXguY29tL1BIUEV4Y2VsKQogKiBAbGljZW5zZSAgICBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvb2xkLWxpY2Vuc2VzL2xncGwtMi4xLnR4dAlMR1BMCiAqIEB2ZXJzaW9uICAgIDEuNy43LCAyMDEyLTA1LTE5CiAqLwoKCi8qKgogKiBQSFBFeGNlbF9TaGFyZWRfRmlsZQogKgogKiBAY2F0ZWdvcnkgICBQSFBFeGNlbAogKiBAcGFja2FnZSAgICBQSFBFeGNlbF9TaGFyZWQKICogQGNvcHlyaWdodCAgQ29weXJpZ2h0IChjKSAyMDA2IC0gMjAxMiBQSFBFeGNlbCAoaHR0cDovL3d3dy5jb2RlcGxleC5jb20vUEhQRXhjZWwpCiAqLwpjbGFzcyBQSFBFeGNlbF9TaGFyZWRfRmlsZQp7CgkvKioKCSAgKiBWZXJpZnkgaWYgYSBmaWxlIGV4aXN0cwoJICAqCgkgICogQHBhcmFtIAlzdHJpbmcJJHBGaWxlbmFtZQlGaWxlbmFtZQoJICAqIEByZXR1cm4gYm9vbAoJICAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBmaWxlX2V4aXN0cygkcEZpbGVuYW1lKSB7CgkJLy8gU2ljayBjb25zdHJ1Y3Rpb24sIGJ1dCBpdCBzZWVtcyB0aGF0CgkJLy8gZmlsZV9leGlzdHMgcmV0dXJucyBzdHJhbmdlIHZhbHVlcyB3aGVuCgkJLy8gZG9pbmcgdGhlIG9yaWdpbmFsIGZpbGVfZXhpc3RzIG9uIFpJUCBhcmNoaXZlcy4uLgoJCWlmICggc3RydG9sb3dlcihzdWJzdHIoJHBGaWxlbmFtZSwgMCwgMykpID09ICd6aXAnICkgewoJCQkvLyBPcGVuIFpJUCBmaWxlIGFuZCB2ZXJpZnkgaWYgdGhlIGZpbGUgZXhpc3RzCgkJCSR6aXBGaWxlIAkJPSBzdWJzdHIoJHBGaWxlbmFtZSwgNiwgc3RycG9zKCRwRmlsZW5hbWUsICcjJykgLSA2KTsKCQkJJGFyY2hpdmVGaWxlIAk9IHN1YnN0cigkcEZpbGVuYW1lLCBzdHJwb3MoJHBGaWxlbmFtZSwgJyMnKSArIDEpOwoKCQkJJHppcCA9IG5ldyBaaXBBcmNoaXZlKCk7CgkJCWlmICgkemlwLT5vcGVuKCR6aXBGaWxlKSA9PT0gdHJ1ZSkgewoJCQkJJHJldHVyblZhbHVlID0gKCR6aXAtPmdldEZyb21OYW1lKCRhcmNoaXZlRmlsZSkgIT09IGZhbHNlKTsKCQkJCSR6aXAtPmNsb3NlKCk7CgkJCQlyZXR1cm4gJHJldHVyblZhbHVlOwoJCQl9IGVsc2UgewoJCQkJcmV0dXJuIGZhbHNlOwoJCQl9CgkJfSBlbHNlIHsKCQkJLy8gUmVndWxhciBmaWxlX2V4aXN0cwoJCQlyZXR1cm4gZmlsZV9leGlzdHMoJHBGaWxlbmFtZSk7CgkJfQoJfQoKCS8qKgoJICogUmV0dXJucyBjYW5vbmljYWxpemVkIGFic29sdXRlIHBhdGhuYW1lLCBhbHNvIGZvciBaSVAgYXJjaGl2ZXMKCSAqCgkgKiBAcGFyYW0gc3RyaW5nICRwRmlsZW5hbWUKCSAqIEByZXR1cm4gc3RyaW5nCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gcmVhbHBhdGgoJHBGaWxlbmFtZSkgewoJCS8vIFJldHVybnZhbHVlCgkJJHJldHVyblZhbHVlID0gJyc7CgoJCS8vIFRyeSB1c2luZyByZWFscGF0aCgpCgkJaWYgKGZpbGVfZXhpc3RzKCRwRmlsZW5hbWUpKSB7CgkJCSRyZXR1cm5WYWx1ZSA9IHJlYWxwYXRoKCRwRmlsZW5hbWUpOwoJCX0KCgkJLy8gRm91bmQgc29tZXRoaW5nPwoJCWlmICgkcmV0dXJuVmFsdWUgPT0gJycgfHwgKCRyZXR1cm5WYWx1ZSA9PT0gTlVMTCkpIHsKCQkJJHBhdGhBcnJheSA9IGV4cGxvZGUoJy8nICwgJHBGaWxlbmFtZSk7CgkJCXdoaWxlKGluX2FycmF5KCcuLicsICRwYXRoQXJyYXkpICYmICRwYXRoQXJyYXlbMF0gIT0gJy4uJykgewoJCQkJZm9yICgkaSA9IDA7ICRpIDwgY291bnQoJHBhdGhBcnJheSk7ICsrJGkpIHsKCQkJCQlpZiAoJHBhdGhBcnJheVskaV0gPT0gJy4uJyAmJiAkaSA+IDApIHsKCQkJCQkJdW5zZXQoJHBhdGhBcnJheVskaV0pOwoJCQkJCQl1bnNldCgkcGF0aEFycmF5WyRpIC0gMV0pOwoJCQkJCQlicmVhazsKCQkJCQl9CgkJCQl9CgkJCX0KCQkJJHJldHVyblZhbHVlID0gaW1wbG9kZSgnLycsICRwYXRoQXJyYXkpOwoJCX0KCgkJLy8gUmV0dXJuCgkJcmV0dXJuICRyZXR1cm5WYWx1ZTsKCX0KCgkvKioKCSAqIEdldCB0aGUgc3lzdGVtcyB0ZW1wb3JhcnkgZGlyZWN0b3J5LgoJICoKCSAqIEByZXR1cm4gc3RyaW5nCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gc3lzX2dldF90ZW1wX2RpcigpCgl7CgkJLy8gc3lzX2dldF90ZW1wX2RpciBpcyBvbmx5IGF2YWlsYWJsZSBzaW5jZSBQSFAgNS4yLjEKCQkvLyBodHRwOi8vcGhwLm5ldC9tYW51YWwvZW4vZnVuY3Rpb24uc3lzLWdldC10ZW1wLWRpci5waHAjOTQxMTkKCgkJaWYgKCAhZnVuY3Rpb25fZXhpc3RzKCdzeXNfZ2V0X3RlbXBfZGlyJykpIHsKCQkJaWYgKCR0ZW1wID0gZ2V0ZW52KCdUTVAnKSApIHsKCQkJCWlmIChmaWxlX2V4aXN0cygkdGVtcCkpIHsgcmV0dXJuIHJlYWxwYXRoKCR0ZW1wKTsgfQoJCQl9CgkJCWlmICgkdGVtcCA9IGdldGVudignVEVNUCcpICkgewoJCQkJaWYgKGZpbGVfZXhpc3RzKCR0ZW1wKSkgeyByZXR1cm4gcmVhbHBhdGgoJHRlbXApOyB9CgkJCX0KCQkJaWYgKCR0ZW1wID0gZ2V0ZW52KCdUTVBESVInKSApIHsKCQkJCWlmIChmaWxlX2V4aXN0cygkdGVtcCkpIHsgcmV0dXJuIHJlYWxwYXRoKCR0ZW1wKTsgfQoJCQl9CgoJCQkvLyB0cmljayBmb3IgY3JlYXRpbmcgYSBmaWxlIGluIHN5c3RlbSdzIHRlbXBvcmFyeSBkaXIKCQkJLy8gd2l0aG91dCBrbm93aW5nIHRoZSBwYXRoIG9mIHRoZSBzeXN0ZW0ncyB0ZW1wb3JhcnkgZGlyCgkJCSR0ZW1wID0gdGVtcG5hbShfX0ZJTEVfXywgJycpOwoJCQlpZiAoZmlsZV9leGlzdHMoJHRlbXApKSB7CgkJCQl1bmxpbmsoJHRlbXApOwoJCQkJcmV0dXJuIHJlYWxwYXRoKGRpcm5hbWUoJHRlbXApKTsKCQkJfQoKCQkJcmV0dXJuIG51bGw7CgkJfQoKCQkvLyB1c2Ugb3JkaW5hcnkgYnVpbHQtaW4gUEhQIGZ1bmN0aW9uCgkJLy8JVGhlcmUgc2hvdWxkIGJlIG5vIHByb2JsZW0gd2l0aCB0aGUgNS4yLjQgU3Vob3NpbiByZWFscGF0aCgpIGJ1ZywgYmVjYXVzZSB0aGlzIGxpbmUgc2hvdWxkIG9ubHkKCQkvLwkJYmUgY2FsbGVkIGlmIHdlJ3JlIHJ1bm5pbmcgNS4yLjEgb3IgZWFybGllcgoJCXJldHVybiByZWFscGF0aChzeXNfZ2V0X3RlbXBfZGlyKCkpOwoJfQoKfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Shared/Font.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIFBIUEV4Y2VsCiAqCiAqIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICoKICogQGNhdGVnb3J5ICAgUEhQRXhjZWwKICogQHBhY2thZ2UgICAgUEhQRXhjZWxfU2hhcmVkCiAqIEBjb3B5cmlnaHQgIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwgKGh0dHA6Ly93d3cuY29kZXBsZXguY29tL1BIUEV4Y2VsKQogKiBAbGljZW5zZSAgICBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvb2xkLWxpY2Vuc2VzL2xncGwtMi4xLnR4dAlMR1BMCiAqIEB2ZXJzaW9uICAgIDEuNy43LCAyMDEyLTA1LTE5CiAqLwoKCi8qKgogKiBQSFBFeGNlbF9TaGFyZWRfRm9udAogKgogKiBAY2F0ZWdvcnkgICBQSFBFeGNlbAogKiBAcGFja2FnZSAgICBQSFBFeGNlbF9TaGFyZWQKICogQGNvcHlyaWdodCAgQ29weXJpZ2h0IChjKSAyMDA2IC0gMjAxMiBQSFBFeGNlbCAoaHR0cDovL3d3dy5jb2RlcGxleC5jb20vUEhQRXhjZWwpCiAqLwpjbGFzcyBQSFBFeGNlbF9TaGFyZWRfRm9udAp7CgkvKiBNZXRob2RzIGZvciByZXNvbHZpbmcgYXV0b3NpemUgdmFsdWUgKi8KCWNvbnN0IEFVVE9TSVpFX01FVEhPRF9BUFBST1gJPSAnYXBwcm94JzsKCWNvbnN0IEFVVE9TSVpFX01FVEhPRF9FWEFDVAkJPSAnZXhhY3QnOwoKCS8qKiBDaGFyYWN0ZXIgc2V0IGNvZGVzIHVzZWQgYnkgQklGRjUtOCBpbiBGb250IHJlY29yZHMgKi8KCWNvbnN0IENIQVJTRVRfQU5TSV9MQVRJTgkJCQk9IDB4MDA7Cgljb25zdCBDSEFSU0VUX1NZU1RFTV9ERUZBVUxUCQkJPSAweDAxOwoJY29uc3QgQ0hBUlNFVF9TWU1CT0wJCQkJCT0gMHgwMjsKCWNvbnN0IENIQVJTRVRfQVBQTEVfUk9NQU4JCQkJPSAweDREOwoJY29uc3QgQ0hBUlNFVF9BTlNJX0pBUEFORVNFX1NISUZUSklTCT0gMHg4MDsKCWNvbnN0IENIQVJTRVRfQU5TSV9LT1JFQU5fSEFOR1VMCQk9IDB4ODE7Cgljb25zdCBDSEFSU0VUX0FOU0lfS09SRUFOX0pPSEFCCQkJPSAweDgyOwoJY29uc3QgQ0hBUlNFVF9BTlNJX0NISU5FU0VfU0lNSVBMSUZJRUQJPSAweDg2OwkJLy8JZ2IyMzEyCgljb25zdCBDSEFSU0VUX0FOU0lfQ0hJTkVTRV9UUkFESVRJT05BTAk9IDB4ODg7CQkvLwliaWc1Cgljb25zdCBDSEFSU0VUX0FOU0lfR1JFRUsJCQkJPSAweEExOwoJY29uc3QgQ0hBUlNFVF9BTlNJX1RVUktJU0gJCQkJPSAweEEyOwoJY29uc3QgQ0hBUlNFVF9BTlNJX1ZJRVROQU1FU0UJCQk9IDB4QTM7Cgljb25zdCBDSEFSU0VUX0FOU0lfSEVCUkVXCQkJCT0gMHhCMTsKCWNvbnN0IENIQVJTRVRfQU5TSV9BUkFCSUMJCQkJPSAweEIyOwoJY29uc3QgQ0hBUlNFVF9BTlNJX0JBTFRJQwkJCQk9IDB4QkE7Cgljb25zdCBDSEFSU0VUX0FOU0lfQ1lSSUxMSUMJCQkJPSAweENDOwoJY29uc3QgQ0hBUlNFVF9BTlNJX1RIQUkJCQkJCT0gMHhERDsKCWNvbnN0IENIQVJTRVRfQU5TSV9MQVRJTl9JSQkJCQk9IDB4RUU7Cgljb25zdCBDSEFSU0VUX09FTV9MQVRJTl9JCQkJCT0gMHhGRjsKCgkvLyAgWFhYOiBDb25zdGFudHMgY3JlYXRlZCEKCS8qKiBGb250IGZpbGVuYW1lcyAqLwoJY29uc3QgQVJJQUwJCQkJCQkJCT0gJ2FyaWFsLnR0Zic7Cgljb25zdCBBUklBTF9CT0xECQkJCQkJPSAnYXJpYWxiZC50dGYnOwoJY29uc3QgQVJJQUxfSVRBTElDCQkJCQkJPSAnYXJpYWxpLnR0Zic7Cgljb25zdCBBUklBTF9CT0xEX0lUQUxJQwkJCQkJPSAnYXJpYWxiaS50dGYnOwoKCWNvbnN0IENBTElCUkkJCQkJCQkJPSAnQ0FMSUJSSS5UVEYnOwoJY29uc3QgQ0FMSUJSSV9CT0xECQkJCQkJPSAnQ0FMSUJSSUIuVFRGJzsKCWNvbnN0IENBTElCUklfSVRBTElDCQkJCQk9ICdDQUxJQlJJSS5UVEYnOwoJY29uc3QgQ0FMSUJSSV9CT0xEX0lUQUxJQwkJCQk9ICdDQUxJQlJJWi5UVEYnOwoKCWNvbnN0IENPTUlDX1NBTlNfTVMJCQkJCQk9ICdjb21pYy50dGYnOwoJY29uc3QgQ09NSUNfU0FOU19NU19CT0xECQkJCT0gJ2NvbWljYmQudHRmJzsKCgljb25zdCBDT1VSSUVSX05FVwkJCQkJCT0gJ2NvdXIudHRmJzsKCWNvbnN0IENPVVJJRVJfTkVXX0JPTEQJCQkJCT0gJ2NvdXJiZC50dGYnOwoJY29uc3QgQ09VUklFUl9ORVdfSVRBTElDCQkJCT0gJ2NvdXJpLnR0Zic7Cgljb25zdCBDT1VSSUVSX05FV19CT0xEX0lUQUxJQwkJCT0gJ2NvdXJiaS50dGYnOwoKCWNvbnN0IEdFT1JHSUEJCQkJCQkJPSAnZ2VvcmdpYS50dGYnOwoJY29uc3QgR0VPUkdJQV9CT0xECQkJCQkJPSAnZ2VvcmdpYWIudHRmJzsKCWNvbnN0IEdFT1JHSUFfSVRBTElDCQkJCQk9ICdnZW9yZ2lhaS50dGYnOwoJY29uc3QgR0VPUkdJQV9CT0xEX0lUQUxJQwkJCQk9ICdnZW9yZ2lhei50dGYnOwoKCWNvbnN0IElNUEFDVAkJCQkJCQk9ICdpbXBhY3QudHRmJzsKCgljb25zdCBMSUJFUkFUSU9OX1NBTlMJCQkJCT0gJ0xpYmVyYXRpb25TYW5zLVJlZ3VsYXIudHRmJzsKCWNvbnN0IExJQkVSQVRJT05fU0FOU19CT0xECQkJCT0gJ0xpYmVyYXRpb25TYW5zLUJvbGQudHRmJzsKCWNvbnN0IExJQkVSQVRJT05fU0FOU19JVEFMSUMJCQk9ICdMaWJlcmF0aW9uU2Fucy1JdGFsaWMudHRmJzsKCWNvbnN0IExJQkVSQVRJT05fU0FOU19CT0xEX0lUQUxJQwkJPSAnTGliZXJhdGlvblNhbnMtQm9sZEl0YWxpYy50dGYnOwoKCWNvbnN0IExVQ0lEQV9DT05TT0xFCQkJCQk9ICdsdWNvbi50dGYnOwoJY29uc3QgTFVDSURBX1NBTlNfVU5JQ09ERQkJCQk9ICdsXzEwNjQ2LnR0Zic7CgoJY29uc3QgTUlDUk9TT0ZUX1NBTlNfU0VSSUYJCQkJPSAnbWljcm9zcy50dGYnOwoKCWNvbnN0IFBBTEFUSU5PX0xJTk9UWVBFCQkJCQk9ICdwYWxhLnR0Zic7Cgljb25zdCBQQUxBVElOT19MSU5PVFlQRV9CT0xECQkJPSAncGFsYWIudHRmJzsKCWNvbnN0IFBBTEFUSU5PX0xJTk9UWVBFX0lUQUxJQwkJCT0gJ3BhbGFpLnR0Zic7Cgljb25zdCBQQUxBVElOT19MSU5PVFlQRV9CT0xEX0lUQUxJQwkJPSAncGFsYWJpLnR0Zic7CgoJY29uc3QgU1lNQk9MCQkJCQkJCT0gJ3N5bWJvbC50dGYnOwoKCWNvbnN0IFRBSE9NQQkJCQkJCQk9ICd0YWhvbWEudHRmJzsKCWNvbnN0IFRBSE9NQV9CT0xECQkJCQkJPSAndGFob21hYmQudHRmJzsKCgljb25zdCBUSU1FU19ORVdfUk9NQU4JCQkJCT0gJ3RpbWVzLnR0Zic7Cgljb25zdCBUSU1FU19ORVdfUk9NQU5fQk9MRAkJCQk9ICd0aW1lc2JkLnR0Zic7Cgljb25zdCBUSU1FU19ORVdfUk9NQU5fSVRBTElDCQkJPSAndGltZXNpLnR0Zic7Cgljb25zdCBUSU1FU19ORVdfUk9NQU5fQk9MRF9JVEFMSUMJCT0gJ3RpbWVzYmkudHRmJzsKCgljb25zdCBUUkVCVUNIRVRfTVMJCQkJCQk9ICd0cmVidWMudHRmJzsKCWNvbnN0IFRSRUJVQ0hFVF9NU19CT0xECQkJCQk9ICd0cmVidWNiZC50dGYnOwoJY29uc3QgVFJFQlVDSEVUX01TX0lUQUxJQwkJCQk9ICd0cmVidWNpdC50dGYnOwoJY29uc3QgVFJFQlVDSEVUX01TX0JPTERfSVRBTElDCQkJPSAndHJlYnVjYmkudHRmJzsKCgljb25zdCBWRVJEQU5BCQkJCQkJCT0gJ3ZlcmRhbmEudHRmJzsKCWNvbnN0IFZFUkRBTkFfQk9MRAkJCQkJCT0gJ3ZlcmRhbmFiLnR0Zic7Cgljb25zdCBWRVJEQU5BX0lUQUxJQwkJCQkJPSAndmVyZGFuYWkudHRmJzsKCWNvbnN0IFZFUkRBTkFfQk9MRF9JVEFMSUMJCQkJPSAndmVyZGFuYXoudHRmJzsKCgkvKioKCSAqIEF1dG9TaXplIG1ldGhvZAoJICoKCSAqIEB2YXIgc3RyaW5nCgkgKi8KCXByaXZhdGUgc3RhdGljICRhdXRvU2l6ZU1ldGhvZCA9IHNlbGY6OkFVVE9TSVpFX01FVEhPRF9BUFBST1g7CgoJLyoqCgkgKiBQYXRoIHRvIGZvbGRlciBjb250YWluaW5nIFRydWVUeXBlIGZvbnQgLnR0ZiBmaWxlcwoJICoKCSAqIEB2YXIgc3RyaW5nCgkgKi8KCXByaXZhdGUgc3RhdGljICR0cnVlVHlwZUZvbnRQYXRoID0gbnVsbDsKCgkvKioKCSAqIEhvdyB3aWRlIGlzIGEgZGVmYXVsdCBjb2x1bW4gZm9yIGEgZ2l2ZW4gZGVmYXVsdCBmb250IGFuZCBzaXplPwoJICogRW1waXJpY2FsIGRhdGEgZm91bmQgYnkgaW5zcGVjdGluZyByZWFsIEV4Y2VsIGZpbGVzIGFuZCByZWFkaW5nIG9mZiB0aGUgcGl4ZWwgd2lkdGgKCSAqIGluIE1pY3Jvc29mdCBPZmZpY2UgRXhjZWwgMjAwNy4KCSAqCgkgKiBAdmFyIGFycmF5CgkgKi8KCXB1YmxpYyBzdGF0aWMgJGRlZmF1bHRDb2x1bW5XaWR0aHMgPSBhcnJheSgKCQknQXJpYWwnID0+IGFycmF5KAoJCQkgMSA9PiBhcnJheSgncHgnID0+IDI0LCAnd2lkdGgnID0+IDEyLjAwMDAwMDAwKSwKCQkJIDIgPT4gYXJyYXkoJ3B4JyA9PiAyNCwgJ3dpZHRoJyA9PiAxMi4wMDAwMDAwMCksCgkJCSAzID0+IGFycmF5KCdweCcgPT4gMzIsICd3aWR0aCcgPT4gMTAuNjY0MDYyNTApLAoJCQkgNCA9PiBhcnJheSgncHgnID0+IDMyLCAnd2lkdGgnID0+IDEwLjY2NDA2MjUwKSwKCQkJIDUgPT4gYXJyYXkoJ3B4JyA9PiA0MCwgJ3dpZHRoJyA9PiAxMC4wMDAwMDAwMCksCgkJCSA2ID0+IGFycmF5KCdweCcgPT4gNDgsICd3aWR0aCcgPT4gIDkuNTk3NjU2MjUpLAoJCQkgNyA9PiBhcnJheSgncHgnID0+IDQ4LCAnd2lkdGgnID0+ICA5LjU5NzY1NjI1KSwKCQkJIDggPT4gYXJyYXkoJ3B4JyA9PiA1NiwgJ3dpZHRoJyA9PiAgOS4zMzIwMzEyNSksCgkJCSA5ID0+IGFycmF5KCdweCcgPT4gNjQsICd3aWR0aCcgPT4gIDkuMTQwNjI1MDApLAoJCQkxMCA9PiBhcnJheSgncHgnID0+IDY0LCAnd2lkdGgnID0+ICA5LjE0MDYyNTAwKSwKCQkpLAoJCSdDYWxpYnJpJyA9PiBhcnJheSgKCQkJIDEgPT4gYXJyYXkoJ3B4JyA9PiAyNCwgJ3dpZHRoJyA9PiAxMi4wMDAwMDAwMCksCgkJCSAyID0+IGFycmF5KCdweCcgPT4gMjQsICd3aWR0aCcgPT4gMTIuMDAwMDAwMDApLAoJCQkgMyA9PiBhcnJheSgncHgnID0+IDMyLCAnd2lkdGgnID0+IDEwLjY2NDA2MjUwKSwKCQkJIDQgPT4gYXJyYXkoJ3B4JyA9PiAzMiwgJ3dpZHRoJyA9PiAxMC42NjQwNjI1MCksCgkJCSA1ID0+IGFycmF5KCdweCcgPT4gNDAsICd3aWR0aCcgPT4gMTAuMDAwMDAwMDApLAoJCQkgNiA9PiBhcnJheSgncHgnID0+IDQ4LCAnd2lkdGgnID0+ICA5LjU5NzY1NjI1KSwKCQkJIDcgPT4gYXJyYXkoJ3B4JyA9PiA0OCwgJ3dpZHRoJyA9PiAgOS41OTc2NTYyNSksCgkJCSA4ID0+IGFycmF5KCdweCcgPT4gNTYsICd3aWR0aCcgPT4gIDkuMzMyMDMxMjUpLAoJCQkgOSA9PiBhcnJheSgncHgnID0+IDU2LCAnd2lkdGgnID0+ICA5LjMzMjAzMTI1KSwKCQkJMTAgPT4gYXJyYXkoJ3B4JyA9PiA2NCwgJ3dpZHRoJyA9PiAgOS4xNDA2MjUwMCksCgkJCTExID0+IGFycmF5KCdweCcgPT4gNjQsICd3aWR0aCcgPT4gIDkuMTQwNjI1MDApLAoJCSksCgkJJ1ZlcmRhbmEnID0+IGFycmF5KAoJCQkgMSA9PiBhcnJheSgncHgnID0+IDI0LCAnd2lkdGgnID0+IDEyLjAwMDAwMDAwKSwKCQkJIDIgPT4gYXJyYXkoJ3B4JyA9PiAyNCwgJ3dpZHRoJyA9PiAxMi4wMDAwMDAwMCksCgkJCSAzID0+IGFycmF5KCdweCcgPT4gMzIsICd3aWR0aCcgPT4gMTAuNjY0MDYyNTApLAoJCQkgNCA9PiBhcnJheSgncHgnID0+IDMyLCAnd2lkdGgnID0+IDEwLjY2NDA2MjUwKSwKCQkJIDUgPT4gYXJyYXkoJ3B4JyA9PiA0MCwgJ3dpZHRoJyA9PiAxMC4wMDAwMDAwMCksCgkJCSA2ID0+IGFycmF5KCdweCcgPT4gNDgsICd3aWR0aCcgPT4gIDkuNTk3NjU2MjUpLAoJCQkgNyA9PiBhcnJheSgncHgnID0+IDQ4LCAnd2lkdGgnID0+ICA5LjU5NzY1NjI1KSwKCQkJIDggPT4gYXJyYXkoJ3B4JyA9PiA2NCwgJ3dpZHRoJyA9PiAgOS4xNDA2MjUwMCksCgkJCSA5ID0+IGFycmF5KCdweCcgPT4gNzIsICd3aWR0aCcgPT4gIDkuMDAwMDAwMDApLAoJCQkxMCA9PiBhcnJheSgncHgnID0+IDcyLCAnd2lkdGgnID0+ICA5LjAwMDAwMDAwKSwKCQkpLAoJKTsKCgkvKioKCSAqIFNldCBhdXRvU2l6ZSBtZXRob2QKCSAqCgkgKiBAcGFyYW0gc3RyaW5nICRwVmFsdWUKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBzZXRBdXRvU2l6ZU1ldGhvZCgkcFZhbHVlID0gJ2FwcHJveCcpCgl7CgkJc2VsZjo6JGF1dG9TaXplTWV0aG9kID0gJHBWYWx1ZTsKCX0KCgkvKioKCSAqIEdldCBhdXRvU2l6ZSBtZXRob2QKCSAqCgkgKiBAcmV0dXJuIHN0cmluZwoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldEF1dG9TaXplTWV0aG9kKCkKCXsKCQlyZXR1cm4gc2VsZjo6JGF1dG9TaXplTWV0aG9kOwoJfQoKCS8qKgoJICogU2V0IHRoZSBwYXRoIHRvIHRoZSBmb2xkZXIgY29udGFpbmluZyAudHRmIGZpbGVzLiBUaGVyZSBzaG91bGQgYmUgYSB0cmFpbGluZyBzbGFzaC4KCSAqIFR5cGljYWwgbG9jYXRpb25zIG9uIHZhcmlvdXQgc29tZSBwbGF0Zm9ybXM6CgkgKgk8dWw+CgkgKgkJPGxpPkM6L1dpbmRvd3MvRm9udHMvPC9saT4KCSAqCQk8bGk+L3Vzci9zaGFyZS9mb250cy90cnVldHlwZS88L2xpPgoJICoJCTxsaT5+Ly5mb250cy88L2xpPgoJICoJPC91bD4KCSAqCgkgKiBAcGFyYW0gc3RyaW5nICRwVmFsdWUKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBzZXRUcnVlVHlwZUZvbnRQYXRoKCRwVmFsdWUgPSAnJykKCXsKCQlzZWxmOjokdHJ1ZVR5cGVGb250UGF0aCA9ICRwVmFsdWU7Cgl9CgoJLyoqCgkgKiBHZXQgdGhlIHBhdGggdG8gdGhlIGZvbGRlciBjb250YWluaW5nIC50dGYgZmlsZXMuCgkgKgoJICogQHJldHVybiBzdHJpbmcKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRUcnVlVHlwZUZvbnRQYXRoKCkKCXsKCQlyZXR1cm4gc2VsZjo6JHRydWVUeXBlRm9udFBhdGg7Cgl9CgoJLyoqCgkgKiBDYWxjdWxhdGUgYW4gKGFwcHJveGltYXRlKSBPcGVuWE1MIGNvbHVtbiB3aWR0aCwgYmFzZWQgb24gZm9udCBzaXplIGFuZCB0ZXh0IGNvbnRhaW5lZAoJICoKCSAqIEBwYXJhbSAJaW50CQkkZm9udFNpemUJCQlGb250IHNpemUgKGluIHBpeGVscyBvciBwb2ludHMpCgkgKiBAcGFyYW0gCWJvb2wJJGZvbnRTaXplSW5QaXhlbHMJSXMgdGhlIGZvbnQgc2l6ZSBzcGVjaWZpZWQgaW4gcGl4ZWxzICh0cnVlKSBvciBpbiBwb2ludHMgKGZhbHNlKSA/CgkgKiBAcGFyYW0gCXN0cmluZwkkY2VsbFRleHQJCQlUZXh0IHRvIGNhbGN1bGF0ZSB3aWR0aAoJICogQHBhcmFtIAlpbnQJCSRyb3RhdGlvbgkJCVJvdGF0aW9uIGFuZ2xlCgkgKiBAcmV0dXJuIAlpbnQJCUNvbHVtbiB3aWR0aAoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGNhbGN1bGF0ZUNvbHVtbldpZHRoKFBIUEV4Y2VsX1N0eWxlX0ZvbnQgJGZvbnQsICRjZWxsVGV4dCA9ICcnLCAkcm90YXRpb24gPSAwLCBQSFBFeGNlbF9TdHlsZV9Gb250ICRkZWZhdWx0Rm9udCA9IG51bGwpIHsKCgkJLy8gSWYgaXQgaXMgcmljaCB0ZXh0LCB1c2UgcGxhaW4gdGV4dAoJCWlmICgkY2VsbFRleHQgaW5zdGFuY2VvZiBQSFBFeGNlbF9SaWNoVGV4dCkgewoJCQkkY2VsbFRleHQgPSAkY2VsbFRleHQtPmdldFBsYWluVGV4dCgpOwoJCX0KCgkJLy8gU3BlY2lhbCBjYXNlIGlmIHRoZXJlIGFyZSBvbmUgb3IgbW9yZSBuZXdsaW5lIGNoYXJhY3RlcnMgKCJcbiIpCgkJaWYgKHN0cnBvcygkY2VsbFRleHQsICJcbiIpICE9PSBmYWxzZSkgewoJCQkkbGluZVRleHRzID0gZXhwbG9kZSgiXG4iLCAkY2VsbFRleHQpOwoJCQkkbGluZVdpdGRocyA9IGFycmF5KCk7CgkJCWZvcmVhY2ggKCRsaW5lVGV4dHMgYXMgJGxpbmVUZXh0KSB7CgkJCQkkbGluZVdpZHRoc1tdID0gc2VsZjo6Y2FsY3VsYXRlQ29sdW1uV2lkdGgoJGZvbnQsICRsaW5lVGV4dCwgJHJvdGF0aW9uID0gMCwgJGRlZmF1bHRGb250KTsKCQkJfQoJCQlyZXR1cm4gbWF4KCRsaW5lV2lkdGhzKTsgLy8gd2lkdGggb2YgbG9uZ2VzdCBsaW5lIGluIGNlbGwKCQl9CgoJCS8vIFRyeSB0byBnZXQgdGhlIGV4YWN0IHRleHQgd2lkdGggaW4gcGl4ZWxzCgkJdHJ5IHsKCQkJLy8gSWYgYXV0b3NpemUgbWV0aG9kIGlzIHNldCB0byAnYXBwcm94JywgdXNlIGFwcHJveGltYXRpb24KCQkJaWYgKHNlbGY6OiRhdXRvU2l6ZU1ldGhvZCA9PSBzZWxmOjpBVVRPU0laRV9NRVRIT0RfQVBQUk9YKSB7CgkJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCdBdXRvU2l6ZSBtZXRob2QgaXMgc2V0IHRvIGFwcHJveCcpOwoJCQl9CgoJCQkvLyBXaWR0aCBvZiB0ZXh0IGluIHBpeGVscyBleGNsLiBwYWRkaW5nCgkJCSRjb2x1bW5XaWR0aCA9IHNlbGY6OmdldFRleHRXaWR0aFBpeGVsc0V4YWN0KCRjZWxsVGV4dCwgJGZvbnQsICRyb3RhdGlvbik7CgoJCQkvLyBFeGNlbCBhZGRzIHNvbWUgcGFkZGluZywgdXNlIDEuMDcgb2YgdGhlIHdpZHRoIG9mIGFuICduJyBnbHlwaAoJCQkkY29sdW1uV2lkdGggKz0gY2VpbChzZWxmOjpnZXRUZXh0V2lkdGhQaXhlbHNFeGFjdCgnMCcsICRmb250LCAwKSAqIDEuMDcpOyAvLyBwaXhlbHMgaW5jbC4gcGFkZGluZwoKCQl9IGNhdGNoIChFeGNlcHRpb24gJGUpIHsKCQkJLy8gV2lkdGggb2YgdGV4dCBpbiBwaXhlbHMgZXhjbC4gcGFkZGluZywgYXBwcm94aW1hdGlvbgoJCQkkY29sdW1uV2lkdGggPSBzZWxmOjpnZXRUZXh0V2lkdGhQaXhlbHNBcHByb3goJGNlbGxUZXh0LCAkZm9udCwgJHJvdGF0aW9uKTsKCgkJCS8vIEV4Y2VsIGFkZHMgc29tZSBwYWRkaW5nLCBqdXN0IHVzZSBhcHByb3ggd2lkdGggb2YgJ24nIGdseXBoCgkJCSRjb2x1bW5XaWR0aCArPSBzZWxmOjpnZXRUZXh0V2lkdGhQaXhlbHNBcHByb3goJ24nLCAkZm9udCwgMCk7CgkJfQoKCQkvLyBDb252ZXJ0IGZyb20gcGl4ZWwgd2lkdGggdG8gY29sdW1uIHdpZHRoCgkJJGNvbHVtbldpZHRoID0gUEhQRXhjZWxfU2hhcmVkX0RyYXdpbmc6OnBpeGVsc1RvQ2VsbERpbWVuc2lvbigkY29sdW1uV2lkdGgsICRkZWZhdWx0Rm9udCk7CgoJCS8vIFJldHVybgoJCXJldHVybiByb3VuZCgkY29sdW1uV2lkdGgsIDYpOwoJfQoKCS8qKgoJICogR2V0IEdEIHRleHQgd2lkdGggaW4gcGl4ZWxzIGZvciBhIHN0cmluZyBvZiB0ZXh0IGluIGEgY2VydGFpbiBmb250IGF0IGEgY2VydGFpbiByb3RhdGlvbiBhbmdsZQoJICoKCSAqIEBwYXJhbSBzdHJpbmcgJHRleHQKCSAqIEBwYXJhbSBQSFBFeGNlbF9TdHlsZV9Gb250CgkgKiBAcGFyYW0gaW50ICRyb3RhdGlvbgoJICogQHJldHVybiBpbnQKCSAqIEB0aHJvd3MgRXhjZXB0aW9uCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0VGV4dFdpZHRoUGl4ZWxzRXhhY3QoJHRleHQsIFBIUEV4Y2VsX1N0eWxlX0ZvbnQgJGZvbnQsICRyb3RhdGlvbiA9IDApIHsKCQlpZiAoIWZ1bmN0aW9uX2V4aXN0cygnaW1hZ2V0dGZiYm94JykpIHsKCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbignR0QgbGlicmFyeSBuZWVkcyB0byBiZSBlbmFibGVkJyk7CgkJfQoKCQkvLyBmb250IHNpemUgc2hvdWxkIHJlYWxseSBiZSBzdXBwbGllZCBpbiBwaXhlbHMgaW4gR0QyLAoJCS8vIGJ1dCBzaW5jZSBHRDIgc2VlbXMgdG8gYXNzdW1lIDcyZHBpLCBwaXhlbHMgYW5kIHBvaW50cyBhcmUgdGhlIHNhbWUKCQkkZm9udEZpbGUgPSBzZWxmOjpnZXRUcnVlVHlwZUZvbnRGaWxlRnJvbUZvbnQoJGZvbnQpOwoJCSR0ZXh0Qm94ID0gaW1hZ2V0dGZiYm94KCRmb250LT5nZXRTaXplKCksICRyb3RhdGlvbiwgJGZvbnRGaWxlLCAkdGV4dCk7CgoJCS8vIEdldCBjb3JuZXJzIHBvc2l0aW9ucwoJCSRsb3dlckxlZnRDb3JuZXJYICA9ICR0ZXh0Qm94WzBdOwoJCSRsb3dlckxlZnRDb3JuZXJZICA9ICR0ZXh0Qm94WzFdOwoJCSRsb3dlclJpZ2h0Q29ybmVyWCA9ICR0ZXh0Qm94WzJdOwoJCSRsb3dlclJpZ2h0Q29ybmVyWSA9ICR0ZXh0Qm94WzNdOwoJCSR1cHBlclJpZ2h0Q29ybmVyWCA9ICR0ZXh0Qm94WzRdOwoJCSR1cHBlclJpZ2h0Q29ybmVyWSA9ICR0ZXh0Qm94WzVdOwoJCSR1cHBlckxlZnRDb3JuZXJYICA9ICR0ZXh0Qm94WzZdOwoJCSR1cHBlckxlZnRDb3JuZXJZICA9ICR0ZXh0Qm94WzddOwoKCQkvLyBDb25zaWRlciB0aGUgcm90YXRpb24gd2hlbiBjYWxjdWxhdGluZyB0aGUgd2lkdGgKCQkkdGV4dFdpZHRoID0gbWF4KCRsb3dlclJpZ2h0Q29ybmVyWCAtICR1cHBlckxlZnRDb3JuZXJYLCAkdXBwZXJSaWdodENvcm5lclggLSAkbG93ZXJMZWZ0Q29ybmVyWCk7CgoJCXJldHVybiAkdGV4dFdpZHRoOwoJfQoKCS8qKgoJICogR2V0IGFwcHJveGltYXRlIHdpZHRoIGluIHBpeGVscyBmb3IgYSBzdHJpbmcgb2YgdGV4dCBpbiBhIGNlcnRhaW4gZm9udCBhdCBhIGNlcnRhaW4gcm90YXRpb24gYW5nbGUKCSAqCgkgKiBAcGFyYW0gc3RyaW5nICRjb2x1bW5UZXh0CgkgKiBAcGFyYW0gUEhQRXhjZWxfU3R5bGVfRm9udCAkZm9udAoJICogQHBhcmFtIGludCAkcm90YXRpb24KCSAqIEByZXR1cm4gaW50IFRleHQgd2lkdGggaW4gcGl4ZWxzIChubyBwYWRkaW5nIGFkZGVkKQoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldFRleHRXaWR0aFBpeGVsc0FwcHJveCgkY29sdW1uVGV4dCwgUEhQRXhjZWxfU3R5bGVfRm9udCAkZm9udCA9IG51bGwsICRyb3RhdGlvbiA9IDApCgl7CgkJJGZvbnROYW1lID0gJGZvbnQtPmdldE5hbWUoKTsKCQkkZm9udFNpemUgPSAkZm9udC0+Z2V0U2l6ZSgpOwoKCQkvLyBDYWxjdWxhdGUgY29sdW1uIHdpZHRoIGluIHBpeGVscy4gV2UgYXNzdW1lIGZpeGVkIGdseXBoIHdpZHRoLiBSZXN1bHQgdmFyaWVzIHdpdGggZm9udCBuYW1lIGFuZCBzaXplLgoJCXN3aXRjaCAoJGZvbnROYW1lKSB7CgkJCWNhc2UgJ0NhbGlicmknOgoJCQkJLy8gdmFsdWUgOC4yNiB3YXMgZm91bmQgdmlhIGludGVycG9sYXRpb24gYnkgaW5zcGVjdGluZyByZWFsIEV4Y2VsIGZpbGVzIHdpdGggQ2FsaWJyaSAxMSBmb250LgoJCQkJJGNvbHVtbldpZHRoID0gKGludCkgKDguMjYgKiBQSFBFeGNlbF9TaGFyZWRfU3RyaW5nOjpDb3VudENoYXJhY3RlcnMoJGNvbHVtblRleHQpKTsKCQkJCSRjb2x1bW5XaWR0aCA9ICRjb2x1bW5XaWR0aCAqICRmb250U2l6ZSAvIDExOyAvLyBleHRyYXBvbGF0ZSBmcm9tIGZvbnQgc2l6ZQoJCQkJYnJlYWs7CgoJCQljYXNlICdBcmlhbCc6CgkJCQkvLyB2YWx1ZSA3IHdhcyBmb3VuZCB2aWEgaW50ZXJwb2xhdGlvbiBieSBpbnNwZWN0aW5nIHJlYWwgRXhjZWwgZmlsZXMgd2l0aCBBcmlhbCAxMCBmb250LgoJCQkJJGNvbHVtbldpZHRoID0gKGludCkgKDcgKiBQSFBFeGNlbF9TaGFyZWRfU3RyaW5nOjpDb3VudENoYXJhY3RlcnMoJGNvbHVtblRleHQpKTsKCQkJCSRjb2x1bW5XaWR0aCA9ICRjb2x1bW5XaWR0aCAqICRmb250U2l6ZSAvIDEwOyAvLyBleHRyYXBvbGF0ZSBmcm9tIGZvbnQgc2l6ZQoJCQkJYnJlYWs7CgoJCQljYXNlICdWZXJkYW5hJzoKCQkJCS8vIHZhbHVlIDggd2FzIGZvdW5kIHZpYSBpbnRlcnBvbGF0aW9uIGJ5IGluc3BlY3RpbmcgcmVhbCBFeGNlbCBmaWxlcyB3aXRoIFZlcmRhbmEgMTAgZm9udC4KCQkJCSRjb2x1bW5XaWR0aCA9IChpbnQpICg4ICogUEhQRXhjZWxfU2hhcmVkX1N0cmluZzo6Q291bnRDaGFyYWN0ZXJzKCRjb2x1bW5UZXh0KSk7CgkJCQkkY29sdW1uV2lkdGggPSAkY29sdW1uV2lkdGggKiAkZm9udFNpemUgLyAxMDsgLy8gZXh0cmFwb2xhdGUgZnJvbSBmb250IHNpemUKCQkJCWJyZWFrOwoKCQkJZGVmYXVsdDoKCQkJCS8vIGp1c3QgYXNzdW1lIENhbGlicmkKCQkJCSRjb2x1bW5XaWR0aCA9IChpbnQpICg4LjI2ICogUEhQRXhjZWxfU2hhcmVkX1N0cmluZzo6Q291bnRDaGFyYWN0ZXJzKCRjb2x1bW5UZXh0KSk7CgkJCQkkY29sdW1uV2lkdGggPSAkY29sdW1uV2lkdGggKiAkZm9udFNpemUgLyAxMTsgLy8gZXh0cmFwb2xhdGUgZnJvbSBmb250IHNpemUKCQkJCWJyZWFrOwoJCX0KCgkJLy8gQ2FsY3VsYXRlIGFwcHJveGltYXRlIHJvdGF0ZWQgY29sdW1uIHdpZHRoCgkJaWYgKCRyb3RhdGlvbiAhPT0gMCkgewoJCQlpZiAoJHJvdGF0aW9uID09IC0xNjUpIHsKCQkJCS8vIHN0YWNrZWQgdGV4dAoJCQkJJGNvbHVtbldpZHRoID0gNDsgLy8gYXBwcm94aW1hdGlvbgoJCQl9IGVsc2UgewoJCQkJLy8gcm90YXRlZCB0ZXh0CgkJCQkkY29sdW1uV2lkdGggPSAkY29sdW1uV2lkdGggKiBjb3MoZGVnMnJhZCgkcm90YXRpb24pKQoJCQkJCQkJCSsgJGZvbnRTaXplICogYWJzKHNpbihkZWcycmFkKCRyb3RhdGlvbikpKSAvIDU7IC8vIGFwcHJveGltYXRpb24KCQkJfQoJCX0KCgkJLy8gcGl4ZWwgd2lkdGggaXMgYW4gaW50ZWdlcgoJCSRjb2x1bW5XaWR0aCA9IChpbnQpICRjb2x1bW5XaWR0aDsKCQlyZXR1cm4gJGNvbHVtbldpZHRoOwoJfQoKCS8qKgoJICogQ2FsY3VsYXRlIGFuIChhcHByb3hpbWF0ZSkgcGl4ZWwgc2l6ZSwgYmFzZWQgb24gYSBmb250IHBvaW50cyBzaXplCgkgKgoJICogQHBhcmFtIAlpbnQJCSRmb250U2l6ZUluUG9pbnRzCUZvbnQgc2l6ZSAoaW4gcG9pbnRzKQoJICogQHJldHVybiAJaW50CQlGb250IHNpemUgKGluIHBpeGVscykKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBmb250U2l6ZVRvUGl4ZWxzKCRmb250U2l6ZUluUG9pbnRzID0gMTEpIHsKCQlyZXR1cm4gKGludCkgKCg0IC8gMykgKiAkZm9udFNpemVJblBvaW50cyk7Cgl9CgoJLyoqCgkgKiBDYWxjdWxhdGUgYW4gKGFwcHJveGltYXRlKSBwaXhlbCBzaXplLCBiYXNlZCBvbiBpbmNoIHNpemUKCSAqCgkgKiBAcGFyYW0gCWludAkJJHNpemVJbkluY2gJRm9udCBzaXplIChpbiBpbmNoKQoJICogQHJldHVybiAJaW50CQlTaXplIChpbiBwaXhlbHMpCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gaW5jaFNpemVUb1BpeGVscygkc2l6ZUluSW5jaCA9IDEpIHsKCQlyZXR1cm4gKCRzaXplSW5JbmNoICogOTYpOwoJfQoKCS8qKgoJICogQ2FsY3VsYXRlIGFuIChhcHByb3hpbWF0ZSkgcGl4ZWwgc2l6ZSwgYmFzZWQgb24gY2VudGltZXRlciBzaXplCgkgKgoJICogQHBhcmFtIAlpbnQJCSRzaXplSW5DbQlGb250IHNpemUgKGluIGNlbnRpbWV0ZXJzKQoJICogQHJldHVybiAJaW50CQlTaXplIChpbiBwaXhlbHMpCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gY2VudGltZXRlclNpemVUb1BpeGVscygkc2l6ZUluQ20gPSAxKSB7CgkJcmV0dXJuICgkc2l6ZUluQ20gKiAzNy43OTUyNzU1OTEpOwoJfQoKCS8qKgoJICogUmV0dXJucyB0aGUgZm9udCBwYXRoIGdpdmVuIHRoZSBmb250CgkgKgoJICogQHBhcmFtIFBIUEV4Y2VsX1N0eWxlX0ZvbnQKCSAqIEByZXR1cm4gc3RyaW5nIFBhdGggdG8gVHJ1ZVR5cGUgZm9udCBmaWxlCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0VHJ1ZVR5cGVGb250RmlsZUZyb21Gb250KCRmb250KSB7CgkJaWYgKCFmaWxlX2V4aXN0cyhzZWxmOjokdHJ1ZVR5cGVGb250UGF0aCkgfHwgIWlzX2RpcihzZWxmOjokdHJ1ZVR5cGVGb250UGF0aCkpIHsKCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbignVmFsaWQgZGlyZWN0b3J5IHRvIFRydWVUeXBlIEZvbnQgZmlsZXMgbm90IHNwZWNpZmllZCcpOwoJCX0KCgkJJG5hbWUJCT0gJGZvbnQtPmdldE5hbWUoKTsKCQkkYm9sZAkJPSAkZm9udC0+Z2V0Qm9sZCgpOwoJCSRpdGFsaWMJCT0gJGZvbnQtPmdldEl0YWxpYygpOwoKCQkvLyBDaGVjayBpZiB3ZSBjYW4gbWFwIGZvbnQgdG8gdHJ1ZSB0eXBlIGZvbnQgZmlsZQoJCXN3aXRjaCAoJG5hbWUpIHsKCQkJY2FzZSAnQXJpYWwnOgoJCQkJJGZvbnRGaWxlID0gKAoJCQkJCSRib2xkID8gKCRpdGFsaWMgPyBzZWxmOjpBUklBTF9CT0xEX0lUQUxJQyA6IHNlbGY6OkFSSUFMX0JPTEQpCgkJCQkJCSAgOiAoJGl0YWxpYyA/IHNlbGY6OkFSSUFMX0lUQUxJQyA6IHNlbGY6OkFSSUFMKQoJCQkJKTsKCQkJCWJyZWFrOwoKCQkJY2FzZSAnQ2FsaWJyaSc6CgkJCQkkZm9udEZpbGUgPSAoCgkJCQkJJGJvbGQgPyAoJGl0YWxpYyA/IHNlbGY6OkNBTElCUklfQk9MRF9JVEFMSUMgOiBzZWxmOjpDQUxJQlJJX0JPTEQpCgkJCQkJCSAgOiAoJGl0YWxpYyA/IHNlbGY6OkNBTElCUklfSVRBTElDIDogc2VsZjo6Q0FMSUJSSSkKCQkJCSk7CgkJCQlicmVhazsKCgkJCWNhc2UgJ0NvdXJpZXIgTmV3JzoKCQkJCSRmb250RmlsZSA9ICgKCQkJCQkkYm9sZCA/ICgkaXRhbGljID8gc2VsZjo6Q09VUklFUl9ORVdfQk9MRF9JVEFMSUMgOiBzZWxmOjpDT1VSSUVSX05FV19CT0xEKQoJCQkJCQkgIDogKCRpdGFsaWMgPyBzZWxmOjpDT1VSSUVSX05FV19JVEFMSUMgOiBzZWxmOjpDT1VSSUVSX05FVykKCQkJCSk7CgkJCQlicmVhazsKCgkJCWNhc2UgJ0NvbWljIFNhbnMgTVMnOgoJCQkJJGZvbnRGaWxlID0gKAoJCQkJCSRib2xkID8gc2VsZjo6Q09NSUNfU0FOU19NU19CT0xEIDogc2VsZjo6Q09NSUNfU0FOU19NUwoJCQkJKTsKCQkJCWJyZWFrOwoKCQkJY2FzZSAnR2VvcmdpYSc6CgkJCQkkZm9udEZpbGUgPSAoCgkJCQkJJGJvbGQgPyAoJGl0YWxpYyA/IHNlbGY6OkdFT1JHSUFfQk9MRF9JVEFMSUMgOiBzZWxmOjpHRU9SR0lBX0JPTEQpCgkJCQkJCSAgOiAoJGl0YWxpYyA/IHNlbGY6OkdFT1JHSUFfSVRBTElDIDogc2VsZjo6R0VPUkdJQSkKCQkJCSk7CgkJCQlicmVhazsKCgkJCWNhc2UgJ0ltcGFjdCc6CgkJCQkkZm9udEZpbGUgPSBzZWxmOjpJTVBBQ1Q7CgkJCQlicmVhazsKCgkJCWNhc2UgJ0xpYmVyYXRpb24gU2Fucyc6CgkJCQkkZm9udEZpbGUgPSAoCgkJCQkJJGJvbGQgPyAoJGl0YWxpYyA/IHNlbGY6OkxJQkVSQVRJT05fU0FOU19CT0xEX0lUQUxJQyA6IHNlbGY6OkxJQkVSQVRJT05fU0FOU19CT0xEKQoJCQkJCQkgIDogKCRpdGFsaWMgPyBzZWxmOjpMSUJFUkFUSU9OX1NBTlNfSVRBTElDIDogc2VsZjo6TElCRVJBVElPTl9TQU5TKQoJCQkJKTsKCQkJCWJyZWFrOwoKCQkJY2FzZSAnTHVjaWRhIENvbnNvbGUnOgoJCQkJJGZvbnRGaWxlID0gc2VsZjo6TFVDSURBX0NPTlNPTEU7CgkJCQlicmVhazsKCgkJCWNhc2UgJ0x1Y2lkYSBTYW5zIFVuaWNvZGUnOgoJCQkJJGZvbnRGaWxlID0gc2VsZjo6TFVDSURBX1NBTlNfVU5JQ09ERTsKCQkJCWJyZWFrOwoKCQkJY2FzZSAnTWljcm9zb2Z0IFNhbnMgU2VyaWYnOgoJCQkJJGZvbnRGaWxlID0gc2VsZjo6TUlDUk9TT0ZUX1NBTlNfU0VSSUY7CgkJCQlicmVhazsKCgkJCWNhc2UgJ1BhbGF0aW5vIExpbm90eXBlJzoKCQkJCSRmb250RmlsZSA9ICgKCQkJCQkkYm9sZCA/ICgkaXRhbGljID8gc2VsZjo6UEFMQVRJTk9fTElOT1RZUEVfQk9MRF9JVEFMSUMgOiBzZWxmOjpQQUxBVElOT19MSU5PVFlQRV9CT0xEKQoJCQkJCQkgIDogKCRpdGFsaWMgPyBzZWxmOjpQQUxBVElOT19MSU5PVFlQRV9JVEFMSUMgOiBzZWxmOjpQQUxBVElOT19MSU5PVFlQRSkKCQkJCSk7CgkJCQlicmVhazsKCgkJCWNhc2UgJ1N5bWJvbCc6CgkJCQkkZm9udEZpbGUgPSBzZWxmOjpTWU1CT0w7CgkJCQlicmVhazsKCgkJCWNhc2UgJ1RhaG9tYSc6CgkJCQkkZm9udEZpbGUgPSAoCgkJCQkJJGJvbGQgPyBzZWxmOjpUQUhPTUFfQk9MRCA6IHNlbGY6OlRBSE9NQQoJCQkJKTsKCQkJCWJyZWFrOwoKCQkJY2FzZSAnVGltZXMgTmV3IFJvbWFuJzoKCQkJCSRmb250RmlsZSA9ICgKCQkJCQkkYm9sZCA/ICgkaXRhbGljID8gc2VsZjo6VElNRVNfTkVXX1JPTUFOX0JPTERfSVRBTElDIDogc2VsZjo6VElNRVNfTkVXX1JPTUFOX0JPTEQpCgkJCQkJCSAgOiAoJGl0YWxpYyA/IHNlbGY6OlRJTUVTX05FV19ST01BTl9JVEFMSUMgOiBzZWxmOjpUSU1FU19ORVdfUk9NQU4pCgkJCQkpOwoJCQkJYnJlYWs7CgoJCQljYXNlICdUcmVidWNoZXQgTVMnOgoJCQkJJGZvbnRGaWxlID0gKAoJCQkJCSRib2xkID8gKCRpdGFsaWMgPyBzZWxmOjpUUkVCVUNIRVRfTVNfQk9MRF9JVEFMSUMgOiBzZWxmOjpUUkVCVUNIRVRfTVNfQk9MRCkKCQkJCQkJICA6ICgkaXRhbGljID8gc2VsZjo6VFJFQlVDSEVUX01TX0lUQUxJQyA6IHNlbGY6OlRSRUJVQ0hFVF9NUykKCQkJCSk7CgkJCQlicmVhazsKCgkJCWNhc2UgJ1ZlcmRhbmEnOgoJCQkJJGZvbnRGaWxlID0gKAoJCQkJCSRib2xkID8gKCRpdGFsaWMgPyBzZWxmOjpWRVJEQU5BX0JPTERfSVRBTElDIDogc2VsZjo6VkVSREFOQV9CT0xEKQoJCQkJCQkgIDogKCRpdGFsaWMgPyBzZWxmOjpWRVJEQU5BX0lUQUxJQyA6IHNlbGY6OlZFUkRBTkEpCgkJCQkpOwoJCQkJYnJlYWs7CgoJCQlkZWZhdWx0OgoJCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbignVW5rbm93biBmb250IG5hbWUgIicuICRuYW1lIC4nIi4gQ2Fubm90IG1hcCB0byBUcnVlVHlwZSBmb250IGZpbGUnKTsKCQkJCWJyZWFrOwoJCX0KCgkJJGZvbnRGaWxlID0gc2VsZjo6JHRydWVUeXBlRm9udFBhdGggLiAkZm9udEZpbGU7CgoJCS8vIENoZWNrIGlmIGZpbGUgYWN0dWFsbHkgZXhpc3RzCgkJaWYgKCFmaWxlX2V4aXN0cygkZm9udEZpbGUpKSB7CgkJCXRocm93IE5ldyBFeGNlcHRpb24oJ1RydWVUeXBlIEZvbnQgZmlsZSBub3QgZm91bmQnKTsKCQl9CgoJCXJldHVybiAkZm9udEZpbGU7Cgl9CgoJLyoqCgkgKiBSZXR1cm5zIHRoZSBhc3NvY2lhdGVkIGNoYXJzZXQgZm9yIHRoZSBmb250IG5hbWUuCgkgKgoJICogQHBhcmFtIHN0cmluZyAkbmFtZSBGb250IG5hbWUKCSAqIEByZXR1cm4gaW50IENoYXJhY3RlciBzZXQgY29kZQoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldENoYXJzZXRGcm9tRm9udE5hbWUoJG5hbWUpCgl7CgkJc3dpdGNoICgkbmFtZSkgewoJCQkvLyBBZGQgbW9yZSBjYXNlcy4gQ2hlY2sgRk9OVCByZWNvcmRzIGluIHJlYWwgRXhjZWwgZmlsZXMuCgkJCWNhc2UgJ0V1Y3Jvc2lhVVBDJzoJCXJldHVybiBzZWxmOjpDSEFSU0VUX0FOU0lfVEhBSTsKCQkJY2FzZSAnV2luZ2RpbmdzJzoJCXJldHVybiBzZWxmOjpDSEFSU0VUX1NZTUJPTDsKCQkJY2FzZSAnV2luZ2RpbmdzIDInOgkJcmV0dXJuIHNlbGY6OkNIQVJTRVRfU1lNQk9MOwoJCQljYXNlICdXaW5nZGluZ3MgMyc6CQlyZXR1cm4gc2VsZjo6Q0hBUlNFVF9TWU1CT0w7CgkJCWRlZmF1bHQ6CQkJCXJldHVybiBzZWxmOjpDSEFSU0VUX0FOU0lfTEFUSU47CgkJfQoJfQoKCS8qKgoJICogR2V0IHRoZSBlZmZlY3RpdmUgY29sdW1uIHdpZHRoIGZvciBjb2x1bW5zIHdpdGhvdXQgYSBjb2x1bW4gZGltZW5zaW9uIG9yIGNvbHVtbiB3aXRoIHdpZHRoIC0xCgkgKiBGb3IgZXhhbXBsZSwgZm9yIENhbGlicmkgMTEgdGhpcyBpcyA5LjE0MDYyNSAoNjQgcHgpCgkgKgoJICogQHBhcmFtIFBIUEV4Y2VsX1N0eWxlX0ZvbnQgJGZvbnQgVGhlIHdvcmtib29rcyBkZWZhdWx0IGZvbnQKCSAqIEBwYXJhbSBib29sZWFuICRwUGl4ZWxzIHRydWUgPSByZXR1cm4gY29sdW1uIHdpZHRoIGluIHBpeGVscywgZmFsc2UgPSByZXR1cm4gaW4gT09YTUwgdW5pdHMKCSAqIEByZXR1cm4gbWl4ZWQgQ29sdW1uIHdpZHRoCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0RGVmYXVsdENvbHVtbldpZHRoQnlGb250KFBIUEV4Y2VsX1N0eWxlX0ZvbnQgJGZvbnQsICRwUGl4ZWxzID0gZmFsc2UpCgl7CgkJaWYgKGlzc2V0KHNlbGY6OiRkZWZhdWx0Q29sdW1uV2lkdGhzWyRmb250LT5nZXROYW1lKCldWyRmb250LT5nZXRTaXplKCldKSkgewoJCQkvLyBFeGFjdCB3aWR0aCBjYW4gYmUgZGV0ZXJtaW5lZAoJCQkkY29sdW1uV2lkdGggPSAkcFBpeGVscyA/CgkJCQlzZWxmOjokZGVmYXVsdENvbHVtbldpZHRoc1skZm9udC0+Z2V0TmFtZSgpXVskZm9udC0+Z2V0U2l6ZSgpXVsncHgnXQoJCQkJCTogc2VsZjo6JGRlZmF1bHRDb2x1bW5XaWR0aHNbJGZvbnQtPmdldE5hbWUoKV1bJGZvbnQtPmdldFNpemUoKV1bJ3dpZHRoJ107CgoJCX0gZWxzZSB7CgkJCS8vIFdlIGRvbid0IGhhdmUgZGF0YSBmb3IgdGhpcyBwYXJ0aWN1bGFyIGZvbnQgYW5kIHNpemUsIHVzZSBhcHByb3hpbWF0aW9uIGJ5CgkJCS8vIGV4dHJhcG9sYXRpbmcgZnJvbSBDYWxpYnJpIDExCgkJCSRjb2x1bW5XaWR0aCA9ICRwUGl4ZWxzID8KCQkJCXNlbGY6OiRkZWZhdWx0Q29sdW1uV2lkdGhzWydDYWxpYnJpJ11bMTFdWydweCddCgkJCQkJOiBzZWxmOjokZGVmYXVsdENvbHVtbldpZHRoc1snQ2FsaWJyaSddWzExXVsnd2lkdGgnXTsKCQkJJGNvbHVtbldpZHRoID0gJGNvbHVtbldpZHRoICogJGZvbnQtPmdldFNpemUoKSAvIDExOwoKCQkJLy8gUm91bmQgcGl4ZWxzIHRvIGNsb3Nlc3QgaW50ZWdlcgoJCQlpZiAoJHBQaXhlbHMpIHsKCQkJCSRjb2x1bW5XaWR0aCA9IChpbnQpIHJvdW5kKCRjb2x1bW5XaWR0aCk7CgkJCX0KCQl9CgoJCXJldHVybiAkY29sdW1uV2lkdGg7Cgl9CgoJLyoqCgkgKiBHZXQgdGhlIGVmZmVjdGl2ZSByb3cgaGVpZ2h0IGZvciByb3dzIHdpdGhvdXQgYSByb3cgZGltZW5zaW9uIG9yIHJvd3Mgd2l0aCBoZWlnaHQgLTEKCSAqIEZvciBleGFtcGxlLCBmb3IgQ2FsaWJyaSAxMSB0aGlzIGlzIDE1IHBvaW50cwoJICoKCSAqIEBwYXJhbSBQSFBFeGNlbF9TdHlsZV9Gb250ICRmb250IFRoZSB3b3JrYm9va3MgZGVmYXVsdCBmb250CgkgKiBAcmV0dXJuIGZsb2F0IFJvdyBoZWlnaHQgaW4gcG9pbnRzCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0RGVmYXVsdFJvd0hlaWdodEJ5Rm9udChQSFBFeGNlbF9TdHlsZV9Gb250ICRmb250KQoJewoJCXN3aXRjaCAoJGZvbnQtPmdldE5hbWUoKSkgewoJCQljYXNlICdBcmlhbCc6CgkJCQlzd2l0Y2ggKCRmb250LT5nZXRTaXplKCkpIHsKCQkJCQljYXNlIDEwOgoJCQkJCQkvLyBpbnNwZWN0aW9uIG9mIEFyaWFsIDEwIHdvcmtib29rIHNheXMgMTIuNzVwdCB+MTdweAoJCQkJCQkkcm93SGVpZ2h0ID0gMTIuNzU7CgkJCQkJCWJyZWFrOwoKCQkJCQljYXNlIDk6CgkJCQkJCS8vIGluc3BlY3Rpb24gb2YgQXJpYWwgOSB3b3JrYm9vayBzYXlzIDEyLjAwcHQgfjE2cHgKCQkJCQkJJHJvd0hlaWdodCA9IDEyOwoJCQkJCQlicmVhazsKCgkJCQkJY2FzZSA4OgoJCQkJCQkvLyBpbnNwZWN0aW9uIG9mIEFyaWFsIDggd29ya2Jvb2sgc2F5cyAxMS4yNXB0IH4xNXB4CgkJCQkJCSRyb3dIZWlnaHQgPSAxMS4yNTsKCQkJCQkJYnJlYWs7CgoJCQkJCWNhc2UgNzoKCQkJCQkJLy8gaW5zcGVjdGlvbiBvZiBBcmlhbCA3IHdvcmtib29rIHNheXMgOS4wMHB0IH4xMnB4CgkJCQkJCSRyb3dIZWlnaHQgPSA5OwoJCQkJCQlicmVhazsKCgkJCQkJY2FzZSA2OgoJCQkJCWNhc2UgNToKCQkJCQkJLy8gaW5zcGVjdGlvbiBvZiBBcmlhbCA1LDYgd29ya2Jvb2sgc2F5cyA4LjI1cHQgfjExcHgKCQkJCQkJJHJvd0hlaWdodCA9IDguMjU7CgkJCQkJCWJyZWFrOwoKCQkJCQljYXNlIDQ6CgkJCQkJCS8vIGluc3BlY3Rpb24gb2YgQXJpYWwgNCB3b3JrYm9vayBzYXlzIDYuNzVwdCB+OXB4CgkJCQkJCSRyb3dIZWlnaHQgPSA2Ljc1OwoJCQkJCQlicmVhazsKCgkJCQkJY2FzZSAzOgoJCQkJCQkvLyBpbnNwZWN0aW9uIG9mIEFyaWFsIDMgd29ya2Jvb2sgc2F5cyA2LjAwcHQgfjhweAoJCQkJCQkkcm93SGVpZ2h0ID0gNjsKCQkJCQkJYnJlYWs7CgoJCQkJCWNhc2UgMjoKCQkJCQljYXNlIDE6CgkJCQkJCS8vIGluc3BlY3Rpb24gb2YgQXJpYWwgMSwyIHdvcmtib29rIHNheXMgNS4yNXB0IH43cHgKCQkJCQkJJHJvd0hlaWdodCA9IDUuMjU7CgkJCQkJCWJyZWFrOwoKCQkJCQlkZWZhdWx0OgoJCQkJCQkvLyB1c2UgQXJpYWwgMTAgd29ya2Jvb2sgYXMgYW4gYXBwcm94aW1hdGlvbiwgZXh0cmFwb2xhdGlvbgoJCQkJCQkkcm93SGVpZ2h0ID0gMTIuNzUgKiAkZm9udC0+Z2V0U2l6ZSgpIC8gMTA7CgkJCQkJCWJyZWFrOwoJCQkJfQoJCQkJYnJlYWs7CgoJCQljYXNlICdDYWxpYnJpJzoKCQkJCXN3aXRjaCAoJGZvbnQtPmdldFNpemUoKSkgewoJCQkJCWNhc2UgMTE6CgkJCQkJCS8vIGluc3BlY3Rpb24gb2YgQ2FsaWJyaSAxMSB3b3JrYm9vayBzYXlzIDE1LjAwcHQgfjIwcHgKCQkJCQkJJHJvd0hlaWdodCA9IDE1OwoJCQkJCQlicmVhazsKCgkJCQkJY2FzZSAxMDoKCQkJCQkJLy8gaW5zcGVjdGlvbiBvZiBDYWxpYnJpIDEwIHdvcmtib29rIHNheXMgMTIuNzVwdCB+MTdweAoJCQkJCQkkcm93SGVpZ2h0ID0gMTIuNzU7CgkJCQkJCWJyZWFrOwoKCQkJCQljYXNlIDk6CgkJCQkJCS8vIGluc3BlY3Rpb24gb2YgQ2FsaWJyaSA5IHdvcmtib29rIHNheXMgMTIuMDBwdCB+MTZweAoJCQkJCQkkcm93SGVpZ2h0ID0gMTI7CgkJCQkJCWJyZWFrOwoKCQkJCQljYXNlIDg6CgkJCQkJCS8vIGluc3BlY3Rpb24gb2YgQ2FsaWJyaSA4IHdvcmtib29rIHNheXMgMTEuMjVwdCB+MTVweAoJCQkJCQkkcm93SGVpZ2h0ID0gMTEuMjU7CgkJCQkJCWJyZWFrOwoKCQkJCQljYXNlIDc6CgkJCQkJCS8vIGluc3BlY3Rpb24gb2YgQ2FsaWJyaSA3IHdvcmtib29rIHNheXMgOS4wMHB0IH4xMnB4CgkJCQkJCSRyb3dIZWlnaHQgPSA5OwoJCQkJCQlicmVhazsKCgkJCQkJY2FzZSA2OgoJCQkJCWNhc2UgNToKCQkJCQkJLy8gaW5zcGVjdGlvbiBvZiBDYWxpYnJpIDUsNiB3b3JrYm9vayBzYXlzIDguMjVwdCB+MTFweAoJCQkJCQkkcm93SGVpZ2h0ID0gOC4yNTsKCQkJCQkJYnJlYWs7CgoJCQkJCWNhc2UgNDoKCQkJCQkJLy8gaW5zcGVjdGlvbiBvZiBDYWxpYnJpIDQgd29ya2Jvb2sgc2F5cyA2Ljc1cHQgfjlweAoJCQkJCQkkcm93SGVpZ2h0ID0gNi43NTsKCQkJCQkJYnJlYWs7CgoJCQkJCWNhc2UgMzoKCQkJCQkJLy8gaW5zcGVjdGlvbiBvZiBDYWxpYnJpIDMgd29ya2Jvb2sgc2F5cyA2LjAwcHQgfjhweAoJCQkJCQkkcm93SGVpZ2h0ID0gNi4wMDsKCQkJCQkJYnJlYWs7CgoJCQkJCWNhc2UgMjoKCQkJCQljYXNlIDE6CgkJCQkJCS8vIGluc3BlY3Rpb24gb2YgQ2FsaWJyaSAxLDIgd29ya2Jvb2sgc2F5cyA1LjI1cHQgfjdweAoJCQkJCQkkcm93SGVpZ2h0ID0gNS4yNTsKCQkJCQkJYnJlYWs7CgoJCQkJCWRlZmF1bHQ6CgkJCQkJCS8vIHVzZSBDYWxpYnJpIDExIHdvcmtib29rIGFzIGFuIGFwcHJveGltYXRpb24sIGV4dHJhcG9sYXRpb24KCQkJCQkJJHJvd0hlaWdodCA9IDE1ICogJGZvbnQtPmdldFNpemUoKSAvIDExOwoJCQkJCQlicmVhazsKCQkJCX0KCQkJCWJyZWFrOwoKCQkJY2FzZSAnVmVyZGFuYSc6CgkJCQlzd2l0Y2ggKCRmb250LT5nZXRTaXplKCkpIHsKCQkJCQljYXNlIDEwOgoJCQkJCQkvLyBpbnNwZWN0aW9uIG9mIFZlcmRhbmEgMTAgd29ya2Jvb2sgc2F5cyAxMi43NXB0IH4xN3B4CgkJCQkJCSRyb3dIZWlnaHQgPSAxMi43NTsKCQkJCQkJYnJlYWs7CgoJCQkJCWNhc2UgOToKCQkJCQkJLy8gaW5zcGVjdGlvbiBvZiBWZXJkYW5hIDkgd29ya2Jvb2sgc2F5cyAxMS4yNXB0IH4xNXB4CgkJCQkJCSRyb3dIZWlnaHQgPSAxMS4yNTsKCQkJCQkJYnJlYWs7CgoJCQkJCWNhc2UgODoKCQkJCQkJLy8gaW5zcGVjdGlvbiBvZiBWZXJkYW5hIDggd29ya2Jvb2sgc2F5cyAxMC41MHB0IH4xNHB4CgkJCQkJCSRyb3dIZWlnaHQgPSAxMC41MDsKCQkJCQkJYnJlYWs7CgoJCQkJCWNhc2UgNzoKCQkJCQkJLy8gaW5zcGVjdGlvbiBvZiBWZXJkYW5hIDcgd29ya2Jvb2sgc2F5cyA5LjAwcHQgfjEycHgKCQkJCQkJJHJvd0hlaWdodCA9IDkuMDA7CgkJCQkJCWJyZWFrOwoKCQkJCQljYXNlIDY6CgkJCQkJY2FzZSA1OgoJCQkJCQkvLyBpbnNwZWN0aW9uIG9mIFZlcmRhbmEgNSw2IHdvcmtib29rIHNheXMgOC4yNXB0IH4xMXB4CgkJCQkJCSRyb3dIZWlnaHQgPSA4LjI1OwoJCQkJCQlicmVhazsKCgkJCQkJY2FzZSA0OgoJCQkJCQkvLyBpbnNwZWN0aW9uIG9mIFZlcmRhbmEgNCB3b3JrYm9vayBzYXlzIDYuNzVwdCB+OXB4CgkJCQkJCSRyb3dIZWlnaHQgPSA2Ljc1OwoJCQkJCQlicmVhazsKCgkJCQkJY2FzZSAzOgoJCQkJCQkvLyBpbnNwZWN0aW9uIG9mIFZlcmRhbmEgMyB3b3JrYm9vayBzYXlzIDYuMDBwdCB+OHB4CgkJCQkJCSRyb3dIZWlnaHQgPSA2OwoJCQkJCQlicmVhazsKCgkJCQkJY2FzZSAyOgoJCQkJCWNhc2UgMToKCQkJCQkJLy8gaW5zcGVjdGlvbiBvZiBWZXJkYW5hIDEsMiB3b3JrYm9vayBzYXlzIDUuMjVwdCB+N3B4CgkJCQkJCSRyb3dIZWlnaHQgPSA1LjI1OwoJCQkJCQlicmVhazsKCgkJCQkJZGVmYXVsdDoKCQkJCQkJLy8gdXNlIFZlcmRhbmEgMTAgd29ya2Jvb2sgYXMgYW4gYXBwcm94aW1hdGlvbiwgZXh0cmFwb2xhdGlvbgoJCQkJCQkkcm93SGVpZ2h0ID0gMTIuNzUgKiAkZm9udC0+Z2V0U2l6ZSgpIC8gMTA7CgkJCQkJCWJyZWFrOwoJCQkJfQoJCQkJYnJlYWs7CgoJCQlkZWZhdWx0OgoJCQkJLy8ganVzdCB1c2UgQ2FsaWJyaSBhcyBhbiBhcHByb3hpbWF0aW9uCgkJCQkkcm93SGVpZ2h0ID0gMTUgKiAkZm9udC0+Z2V0U2l6ZSgpIC8gMTE7CgkJCQlicmVhazsKCQl9CgoJCXJldHVybiAkcm93SGVpZ2h0OwoJfQoKfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Shared/JAMA/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Shared/JAMA/CHANGELOG.TXT</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[TWFyIDEsIDIwMDUgMTE6MTUgQVNUIGJ5IFBNCgorIEZvciBjb25zaXN0ZW5jeSwgcmVuYW1lZCBNYXRoLnBocCB0byBNYXRocy5qYXZhLCB1dGlscyB0byB1dGlsLCAKICB0ZXN0cyB0byB0ZXN0LCBkb2NzIHRvIGRvYyAtIAoKKyBSZW1vdmVkIGNvbmRpdGlvbmFsIGxvZ2ljIGZyb20gdG9wIG9mIE1hdHJpeCBjbGFzcy4KCisgU3dpdGNoZWQgdG8gdXNpbmcgaHlwbyBmdW5jdGlvbiBpbiBNYXRocy5waHAgZm9yIGFsbCBwaHAtaHlwb3QgY2FsbHMuCiAgTk9URSBUTyBTRUxGOiBOZWVkIHRvIG1ha2Ugc3VyZSB0aGF0IGFsbCBkZWNvbXBvc2l0aW9ucyBoYXZlIGJlZW4gCiAgc3dpdGNoZWQgb3ZlciB0byB1c2luZyB0aGUgYnVuZGxlZCBoeXBvLgoKRmViIDI1LCAyMDA1IGF0IDEwOjAwIEFTVCBieSBQTQoKKyBSZWNvbW1lbmQgdXNpbmcgc2ltcGxlciBFcnJvci5waHAgaW5zdGVhZCBvZiBKQU1BX0Vycm9yLnBocCBidXQgCiAgY2FuIGJlIHBlcnN1YWRlZCBvdGhlcndpc2UuCgo=]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Shared/JAMA/CholeskyDecomposition.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqCUBwYWNrYWdlIEpBTUEKICoKICoJQ2hvbGVza3kgZGVjb21wb3NpdGlvbiBjbGFzcwogKgogKglGb3IgYSBzeW1tZXRyaWMsIHBvc2l0aXZlIGRlZmluaXRlIG1hdHJpeCBBLCB0aGUgQ2hvbGVza3kgZGVjb21wb3NpdGlvbgogKglpcyBhbiBsb3dlciB0cmlhbmd1bGFyIG1hdHJpeCBMIHNvIHRoYXQgQSA9IEwqTCcuCiAqCiAqCUlmIHRoZSBtYXRyaXggaXMgbm90IHN5bW1ldHJpYyBvciBwb3NpdGl2ZSBkZWZpbml0ZSwgdGhlIGNvbnN0cnVjdG9yCiAqCXJldHVybnMgYSBwYXJ0aWFsIGRlY29tcG9zaXRpb24gYW5kIHNldHMgYW4gaW50ZXJuYWwgZmxhZyB0aGF0IG1heQogKgliZSBxdWVyaWVkIGJ5IHRoZSBpc1NQRCgpIG1ldGhvZC4KICoKICoJQGF1dGhvciBQYXVsIE1lYWdoZXIKICoJQGF1dGhvciBNaWNoYWVsIEJvbW1hcml0bwogKglAdmVyc2lvbiAxLjIKICovCmNsYXNzIENob2xlc2t5RGVjb21wb3NpdGlvbiB7CgoJLyoqCgkgKglEZWNvbXBvc2l0aW9uIHN0b3JhZ2UKCSAqCUB2YXIgYXJyYXkKCSAqCUBhY2Nlc3MgcHJpdmF0ZQoJICovCglwcml2YXRlICRMID0gYXJyYXkoKTsKCgkvKioKCSAqCU1hdHJpeCByb3cgYW5kIGNvbHVtbiBkaW1lbnNpb24KCSAqCUB2YXIgaW50CgkgKglAYWNjZXNzIHByaXZhdGUKCSAqLwoJcHJpdmF0ZSAkbTsKCgkvKioKCSAqCVN5bW1ldHJpYyBwb3NpdGl2ZSBkZWZpbml0ZSBmbGFnCgkgKglAdmFyIGJvb2xlYW4KCSAqCUBhY2Nlc3MgcHJpdmF0ZQoJICovCglwcml2YXRlICRpc3NwZCA9IHRydWU7CgoKCS8qKgoJICoJQ2hvbGVza3lEZWNvbXBvc2l0aW9uCgkgKgoJICoJQ2xhc3MgY29uc3RydWN0b3IgLSBkZWNvbXBvc2VzIHN5bW1ldHJpYyBwb3NpdGl2ZSBkZWZpbml0ZSBtYXRyaXgKCSAqCUBwYXJhbSBtaXhlZCBNYXRyaXggc3F1YXJlIHN5bW1ldHJpYyBwb3NpdGl2ZSBkZWZpbml0ZSBtYXRyaXgKCSAqLwoJcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRBID0gbnVsbCkgewoJCWlmICgkQSBpbnN0YW5jZW9mIE1hdHJpeCkgewoJCQkkdGhpcy0+TCA9ICRBLT5nZXRBcnJheSgpOwoJCQkkdGhpcy0+bSA9ICRBLT5nZXRSb3dEaW1lbnNpb24oKTsKCgkJCWZvcigkaSA9IDA7ICRpIDwgJHRoaXMtPm07ICsrJGkpIHsKCQkJCWZvcigkaiA9ICRpOyAkaiA8ICR0aGlzLT5tOyArKyRqKSB7CgkJCQkJZm9yKCRzdW0gPSAkdGhpcy0+TFskaV1bJGpdLCAkayA9ICRpIC0gMTsgJGsgPj0gMDsgLS0kaykgewoJCQkJCQkkc3VtIC09ICR0aGlzLT5MWyRpXVska10gKiAkdGhpcy0+TFskal1bJGtdOwoJCQkJCX0KCQkJCQlpZiAoJGkgPT0gJGopIHsKCQkJCQkJaWYgKCRzdW0gPj0gMCkgewoJCQkJCQkJJHRoaXMtPkxbJGldWyRpXSA9IHNxcnQoJHN1bSk7CgkJCQkJCX0gZWxzZSB7CgkJCQkJCQkkdGhpcy0+aXNzcGQgPSBmYWxzZTsKCQkJCQkJfQoJCQkJCX0gZWxzZSB7CgkJCQkJCWlmICgkdGhpcy0+TFskaV1bJGldICE9IDApIHsKCQkJCQkJCSR0aGlzLT5MWyRqXVskaV0gPSAkc3VtIC8gJHRoaXMtPkxbJGldWyRpXTsKCQkJCQkJfQoJCQkJCX0KCQkJCX0KCgkJCQlmb3IgKCRrID0gJGkrMTsgJGsgPCAkdGhpcy0+bTsgKyskaykgewoJCQkJCSR0aGlzLT5MWyRpXVska10gPSAwLjA7CgkJCQl9CgkJCX0KCQl9IGVsc2UgewoJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKEpBTUFFcnJvcihBcmd1bWVudFR5cGVFeGNlcHRpb24pKTsKCQl9Cgl9CS8vCWZ1bmN0aW9uIF9fY29uc3RydWN0KCkKCgoJLyoqCgkgKglJcyB0aGUgbWF0cml4IHN5bW1ldHJpYyBhbmQgcG9zaXRpdmUgZGVmaW5pdGU/CgkgKgoJICoJQHJldHVybiBib29sZWFuCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBpc1NQRCgpIHsKCQlyZXR1cm4gJHRoaXMtPmlzc3BkOwoJfQkvLwlmdW5jdGlvbiBpc1NQRCgpCgoKCS8qKgoJICoJZ2V0TAoJICoKCSAqCVJldHVybiB0cmlhbmd1bGFyIGZhY3Rvci4KCSAqCUByZXR1cm4gTWF0cml4IExvd2VyIHRyaWFuZ3VsYXIgbWF0cml4CgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRMKCkgewoJCXJldHVybiBuZXcgTWF0cml4KCR0aGlzLT5MKTsKCX0JLy8JZnVuY3Rpb24gZ2V0TCgpCgoKCS8qKgoJICoJU29sdmUgQSpYID0gQgoJICoKCSAqCUBwYXJhbSAkQiBSb3ctZXF1YWwgbWF0cml4CgkgKglAcmV0dXJuIE1hdHJpeCBMICogTCcgKiBYID0gQgoJICovCglwdWJsaWMgZnVuY3Rpb24gc29sdmUoJEIgPSBudWxsKSB7CgkJaWYgKCRCIGluc3RhbmNlb2YgTWF0cml4KSB7CgkJCWlmICgkQi0+Z2V0Um93RGltZW5zaW9uKCkgPT0gJHRoaXMtPm0pIHsKCQkJCWlmICgkdGhpcy0+aXNzcGQpIHsKCQkJCQkkWCAgPSAkQi0+Z2V0QXJyYXlDb3B5KCk7CgkJCQkJJG54ID0gJEItPmdldENvbHVtbkRpbWVuc2lvbigpOwoKCQkJCQlmb3IgKCRrID0gMDsgJGsgPCAkdGhpcy0+bTsgKyskaykgewoJCQkJCQlmb3IgKCRpID0gJGsgKyAxOyAkaSA8ICR0aGlzLT5tOyArKyRpKSB7CgkJCQkJCQlmb3IgKCRqID0gMDsgJGogPCAkbng7ICsrJGopIHsKCQkJCQkJCQkkWFskaV1bJGpdIC09ICRYWyRrXVskal0gKiAkdGhpcy0+TFskaV1bJGtdOwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJCWZvciAoJGogPSAwOyAkaiA8ICRueDsgKyskaikgewoJCQkJCQkJJFhbJGtdWyRqXSAvPSAkdGhpcy0+TFska11bJGtdOwoJCQkJCQl9CgkJCQkJfQoKCQkJCQlmb3IgKCRrID0gJHRoaXMtPm0gLSAxOyAkayA+PSAwOyAtLSRrKSB7CgkJCQkJCWZvciAoJGogPSAwOyAkaiA8ICRueDsgKyskaikgewoJCQkJCQkJJFhbJGtdWyRqXSAvPSAkdGhpcy0+TFska11bJGtdOwoJCQkJCQl9CgkJCQkJCWZvciAoJGkgPSAwOyAkaSA8ICRrOyArKyRpKSB7CgkJCQkJCQlmb3IgKCRqID0gMDsgJGogPCAkbng7ICsrJGopIHsKCQkJCQkJCQkkWFskaV1bJGpdIC09ICRYWyRrXVskal0gKiAkdGhpcy0+TFska11bJGldOwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJfQoKCQkJCQlyZXR1cm4gbmV3IE1hdHJpeCgkWCwgJHRoaXMtPm0sICRueCk7CgkJCQl9IGVsc2UgewoJCQkJCXRocm93IG5ldyBFeGNlcHRpb24oSkFNQUVycm9yKE1hdHJpeFNQREV4Y2VwdGlvbikpOwoJCQkJfQoJCQl9IGVsc2UgewoJCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbihKQU1BRXJyb3IoTWF0cml4RGltZW5zaW9uRXhjZXB0aW9uKSk7CgkJCX0KCQl9IGVsc2UgewoJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKEpBTUFFcnJvcihBcmd1bWVudFR5cGVFeGNlcHRpb24pKTsKCQl9Cgl9CS8vCWZ1bmN0aW9uIHNvbHZlKCkKCn0JLy8JY2xhc3MgQ2hvbGVza3lEZWNvbXBvc2l0aW9uCg==]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Shared/JAMA/docs/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Shared/JAMA/docs/docs.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKcmVxdWlyZV9vbmNlICJpbmNsdWRlcy9oZWFkZXIucGhwIjsKcmVxdWlyZV9vbmNlICJpbmNsdWRlcy9uYXZiYXIucGhwIjsKcmVxdWlyZV9vbmNlICJzZWN0aW9ucy9Ib21lLnBocCI7CnJlcXVpcmVfb25jZSAiaW5jbHVkZXMvZm9vdGVyLnBocCI7CQo/Pgo=]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Shared/JAMA/docs/download.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiogU2NyaXB0IHRvIGNyZWF0ZSBSRUdSRVNTIHBhY2thZ2UgZm9yIGRvd25sb2FkCioKKiBAYXV0aG9yIE1pa2UgQm9tbWFyaXRvCiogQGF1dGhvciBQYXVsIE1lYWdoZXIKKiBAdmVyc2lvbiAwLjMKKiBAbW9kaWZpZWQgQXByIDIsIDIwMDYKKgoqIE5vdGU6IFNjcmlwdCByZXF1aXJlcyB0aGUgUEVBUiBBcmNoaXZlX1RhciBwYWNrYWdlIGJlIGluc3RhbGxlZDoKKgoqIEBzZWUgaHR0cDovL3BlYXIucGhwLm5ldC9wYWNrYWdlL0FyY2hpdmVfVGFyCiovCgovLyBuYW1lIGFuZCBkaXJlY3Rvcnkgb2YgcGFja2FnZQokcGtnTmFtZSAgID0gIkpBTUEiOwoKLy8gcm9vdCBvZiBQSFAvTWF0aCBidWlsZCBkaXJlY3RvcnkKJGJ1aWxkRGlyICA9IHN1YnN0cihkaXJuYW1lKF9fRklMRV9fKSwgMCwgLTUgLSBzdHJsZW4oJHBrZ05hbWUpKTsKCi8vIHN3aXRjaCB0byBQSFAvTWF0aCBidWlsZCBkaXJlY3RvcnkKY2hkaXIoJGJ1aWxkRGlyKTsKCiR0YXJOYW1lID0gIiRwa2dOYW1lLnRhci5neiI7ICAKCiR0YXJQYXRoID0gJGJ1aWxkRGlyLiRwa2dOYW1lLiIvZG93bmxvYWRzLyIuJHRhck5hbWU7CgppZigkX0dFVFsnb3AnXSA9PSAiZG93bmxvYWQiKSB7ICAKICAKCXJlcXVpcmVfb25jZSgnQXJjaGl2ZS9UYXIucGhwJyk7ICAKCQoJJHRhciAgID0gbmV3IEFyY2hpdmVfVGFyKCR0YXJQYXRoKTsKCiAgLy8gY3JlYXRlICRwa2dOYW1lIGFyY2hpdmUgdW5kZXIgJHBrZ05hbWUgZm9sZGVyCiAgJGZpbGVzID0gZ2xvYigiJHBrZ05hbWUvKi5waHAiKTsKICAkZmlsZXMgPSBhcnJheV9tZXJnZSgkZmlsZXMsIGdsb2IoIiRwa2dOYW1lLyouVFhUIikpOwogICRmaWxlcyA9IGFycmF5X21lcmdlKCRmaWxlcywgZ2xvYigiJHBrZ05hbWUvZG9jcy8qLnBocCIpKTsKICAkZmlsZXMgPSBhcnJheV9tZXJnZSgkZmlsZXMsIGdsb2IoIiRwa2dOYW1lL2RvY3MvaW5jbHVkZXMvKi5waHAiKSk7CiAgJGZpbGVzID0gYXJyYXlfbWVyZ2UoJGZpbGVzLCBnbG9iKCIkcGtnTmFtZS9leGFtcGxlcy8qLnBocCIpKTsKICAkZmlsZXMgPSBhcnJheV9tZXJnZSgkZmlsZXMsIGdsb2IoIiRwa2dOYW1lL3Rlc3RzLyoucGhwIikpOyAgCiAgJGZpbGVzID0gYXJyYXlfbWVyZ2UoJGZpbGVzLCBnbG9iKCIkcGtnTmFtZS91dGlscy8qLnBocCIpKTsgICAgCiAgCgkkdGFyLT5jcmVhdGUoJGZpbGVzKTsKCQkKCS8vIGNyZWF0ZSB0aGUgZG93bmxvYWQgdXJsCiAgJHdlYkRpciAgPSBzdWJzdHIoJF9TRVJWRVJbJ1BIUF9TRUxGJ10sIDAsIC0xOCk7CiAgJHVybFBhdGggPSAiaHR0cDovLyIuJF9TRVJWRVJbJ0hUVFBfSE9TVCddLiR3ZWJEaXIuIi9kb3dubG9hZHMiOwogIAogIC8vIHJlZGlyZWN0IHRvIGRvd25sb2FkIHVybAoJaGVhZGVyKCJMb2NhdGlvbjogJHVybFBhdGgvJHRhck5hbWUiKTsKCn0KCmluY2x1ZGVfb25jZSAiaW5jbHVkZXMvaGVhZGVyLnBocCI7CmluY2x1ZGVfb25jZSAiaW5jbHVkZXMvbmF2YmFyLnBocCI7Cj8+CjxwPgpEb3dubG9hZCBjdXJyZW50IHZlcnNpb246IAo8L3A+Cjx1bD4KIDxsaT48YSBocmVmPSc8P3BocCBlY2hvICRfU0VSVkVSWydQSFBfU0VMRiddLiI/b3A9ZG93bmxvYWQiOyA/Pic+PD9waHAgZWNobyAkdGFyTmFtZSA/PjwvYT48L2xpPgo8L3VsPgo8P3BocAppbmNsdWRlX29uY2UgImluY2x1ZGVzL2Zvb3Rlci5waHAiOwo/Pgo=]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Shared/JAMA/docs/example.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKaW5jbHVkZV9vbmNlICJpbmNsdWRlcy9oZWFkZXIucGhwIjsKaW5jbHVkZV9vbmNlICJpbmNsdWRlcy9uYXZiYXIucGhwIjsKPz4KPGgyPk1hZ2ljIFNxdWFyZSBFeGFtcGxlPC9oMj4KPHA+ClRoZSBKYW1hIGRpc3RyaWJ1dGlvbiBjb21lcyB3aXRoIGEgbWFnaWMgc3F1YXJlIGV4YW1wbGUgdGhhdCBpcyB1c2VkIHRvIAp0ZXN0IGFuZCBiZW5jaG1hcmsgdGhlIExVLCBRUiwgU1ZEIGFuZCBzeW1tZXRyaWMgRWlnIGRlY29tcG9zaXRpb25zLiAgClRoZSBleGFtcGxlIG91dHB1dHMgYSBtdWx0aS1jb2x1bW4gdGFibGUgd2l0aCB0aGVzZSBjb2x1bW4gaGVhZGluZ3M6CjwvcD4KCjx0YWJsZSBib3JkZXI9JzEnIGNlbGxwYWRkaW5nPSc1JyBjZWxsc3BhY2luZz0nMCcgYWxpZ249J2NlbnRlcic+CiAgPHRyPgogICAgPHRkPjxiPm48L2I+PC90ZD4KICAgIDx0ZD5PcmRlciBvZiBtYWdpYyBzcXVhcmUuPC90ZD4KICA8L3RyPgogIDx0cj4KICAgIDx0ZD48Yj50cmFjZTwvYj48L3RkPgogICAgPHRkPkRpYWdvbmFsIHN1bSwgc2hvdWxkIGJlIHRoZSBtYWdpYyBzdW0sIChuXjMgKyBuKS8yLjwvdGQ+CiAgPC90cj4KICA8dHI+CiAgICA8dGQ+PGI+bWF4X2VpZzwvYj48L3RkPgogICAgPHRkPk1heGltdW0gZWlnZW52YWx1ZSBvZiAoQSArIEEnKS8yLCBzaG91bGQgZXF1YWwgdHJhY2UuPC90ZD4KICA8L3RyPgogIDx0cj4KICAgIDx0ZD48Yj5yYW5rPC9iPjwvdGQ+CiAgICA8dGQ+TGluZWFyIGFsZ2VicmFpYyByYW5rLCBzaG91bGQgZXF1YWwgbiBpZiBuIGlzIG9kZCwgYmUgbGVzcyB0aGFuIG4gaWYgbiBpcyBldmVuLjwvdGQ+CiAgPC90cj4KICA8dHI+CiAgICA8dGQ+PGI+Y29uZDwvYj48L3RkPgogICAgPHRkPkxfMiBjb25kaXRpb24gbnVtYmVyLCByYXRpbyBvZiBzaW5ndWxhciB2YWx1ZXMuPC90ZD4KICA8L3RyPgogIDx0cj4KICAgIDx0ZD48Yj5sdV9yZXM8L2I+PC90ZD4KICAgIDx0ZD50ZXN0IG9mIExVIGZhY3Rvcml6YXRpb24sIG5vcm0xKEwqVS1BKHAsOikpLyhuKmVwcykuPC90ZD4KICA8L3RyPgogIDx0cj4KICAgIDx0ZD48Yj5xcl9yZXM8L2I+PC90ZD4KICAgIDx0ZD50ZXN0IG9mIFFSIGZhY3Rvcml6YXRpb24sIG5vcm0xKFEqUi1BKS8obiplcHMpLjwvdGQ+CiAgPC90cj4KPC90YWJsZT4KPHA+ClJ1bm5pbmcgdGhlIEphdmEtYmFzZWQgdmVyc2lvbiBvZiB0aGUgbWF0aXggc3F1YXJlIGV4YW1wbGUgcHJvZHVjZXMgdGhlc2UgcmVzdWx0czoKPC9wPgoKPHRhYmxlIGJvcmRlcj0nMScgYWxpZ249J2NlbnRlcic+CiAgPHRyPgogICAgPHRoPiBuIDwvdGg+CiAgICA8dGg+IHRyYWNlIDwvdGg+ICAgICAgIAogICAgPHRoPiBtYXhfZWlnIDwvdGg+ICAgCiAgICA8dGg+IHJhbmsgPC90aD4gICAgICAgIAogICAgPHRoPiBjb25kIDwvdGg+ICAgICAgCiAgICA8dGg+IGx1X3JlcyA8L3RoPiAgICAgIAogICAgPHRoPiBxcl9yZXMgPC90aD4KICA8L3RyPgogIDx0cj4KICAgIDx0ZD4zPC90ZD48dGQ+MTU8L3RkPjx0ZD4xNS4wMDA8L3RkPjx0ZD4zPC90ZD48dGQ+NC4zMzA8L3RkPjx0ZD4wLjAwMDwvdGQ+PHRkPjExLjMzMzwvdGQ+CiAgPC90cj4KICA8dHI+CiAgICA8dGQ+NDwvdGQ+PHRkPjM0PC90ZD48dGQ+MzQuMDAwPC90ZD48dGQ+MzwvdGQ+PHRkPiBJbmY8L3RkPjx0ZD4wLjAwMDwvdGQ+PHRkPjEzLjUwMDwvdGQ+CiAgPHRyPgogICAgPHRkPjU8L3RkPjx0ZD42NTwvdGQ+PHRkPjY1LjAwMDwvdGQ+PHRkPjU8L3RkPjx0ZD41LjQ2MjwvdGQ+PHRkPjAuMDAwPC90ZD48dGQ+MTQuNDAwPC90ZD4KICA8L3RyPgogIDx0cj4KICAgIDx0ZD42PC90ZD48dGQ+MTExPC90ZD48dGQ+MTExLjAwMDwvdGQ+PHRkPjU8L3RkPjx0ZD4gSW5mPC90ZD48dGQ+NS4zMzM8L3RkPjx0ZD4xNi4wMDA8L3RkPgogIDwvdHI+CiAgPHRyPgogICAgPHRkPjc8L3RkPjx0ZD4xNzU8L3RkPjx0ZD4xNzUuMDAwPC90ZD48dGQ+NzwvdGQ+PHRkPjcuMTExPC90ZD48dGQ+Mi4yODY8L3RkPjx0ZD4zNy43MTQ8L3RkPgogIDwvdHI+CiAgPHRyPgogICAgPHRkPjg8L3RkPjx0ZD4yNjA8L3RkPjx0ZD4yNjAuMDAwPC90ZD48dGQ+MzwvdGQ+PHRkPiBJbmY8L3RkPjx0ZD4wLjAwMDwvdGQ+PHRkPjU5LjAwMDwvdGQ+CiAgPC90cj4KICA8dHI+CiAgICA8dGQ+OTwvdGQ+PHRkPjM2OTwvdGQ+PHRkPjM2OS4wMDA8L3RkPjx0ZD45PC90ZD48dGQ+OS4xMDI8L3RkPjx0ZD43LjExMTwvdGQ+PHRkPjUzLjMzMzwvdGQ+CiAgPC90cj4KICA8dHI+CiAgICA8dGQ+MTA8L3RkPjx0ZD41MDU8L3RkPjx0ZD41MDUuMDAwPC90ZD48dGQ+NzwvdGQ+PHRkPiBJbmY8L3RkPjx0ZD4zLjIwMDwvdGQ+PHRkPjE1OS4yMDA8L3RkPgogIDwvdHI+CiAgPHRyPgogICAgPHRkPjExPC90ZD48dGQ+NjcxPC90ZD48dGQ+NjcxLjAwMDwvdGQ+PHRkPjExPC90ZD48dGQ+MTEuMTAyPC90ZD48dGQ+Mi45MDk8L3RkPjx0ZD4yMTUuMjczPC90ZD4KICA8L3RyPgogIDx0cj4KICAgIDx0ZD4xMjwvdGQ+PHRkPjg3MDwvdGQ+PHRkPjg3MC4wMDA8L3RkPjx0ZD4zPC90ZD48dGQ+IEluZjwvdGQ+PHRkPjAuMDAwPC90ZD48dGQ+MTg1LjMzMzwvdGQ+CiAgPC90cj4KICA8dHI+CiAgICA8dGQ+MTM8L3RkPjx0ZD4xMTA1PC90ZD48dGQ+MTEwNS4wMDA8L3RkPjx0ZD4xMzwvdGQ+PHRkPjEzLjA2MDwvdGQ+PHRkPjQuOTIzPC90ZD48dGQ+MzEzLjg0NjwvdGQ+CiAgPC90cj4KICA8dHI+CiAgICA8dGQ+MTQ8L3RkPjx0ZD4xMzc5PC90ZD48dGQ+MTM3OS4wMDA8L3RkPjx0ZD45PC90ZD48dGQ+IEluZjwvdGQ+PHRkPjQuNTcxPC90ZD48dGQ+NTQwLjU3MTwvdGQ+CiAgPC90cj4KICA8dHI+CiAgICA8dGQ+MTU8L3RkPjx0ZD4xNjk1PC90ZD48dGQ+MTY5NS4wMDA8L3RkPjx0ZD4xNTwvdGQ+PHRkPjE1LjA2MjwvdGQ+PHRkPjQuMjY3PC90ZD48dGQ+MjQyLjEzMzwvdGQ+CiAgPC90cj4KICA8dHI+CiAgICA8dGQ+MTY8L3RkPjx0ZD4yMDU2PC90ZD48dGQ+MjA1Ni4wMDA8L3RkPjx0ZD4zPC90ZD48dGQ+IEluZjwvdGQ+PHRkPjAuMDAwPC90ZD48dGQ+NDg4LjUwMDwvdGQ+CiAgPC90cj4KICA8dHI+CiAgICA8dGQ+MTc8L3RkPjx0ZD4yNDY1PC90ZD48dGQ+MjQ2NS4wMDA8L3RkPjx0ZD4xNzwvdGQ+PHRkPjE3LjA0MjwvdGQ+PHRkPjcuNTI5PC90ZD48dGQ+MjY3LjI5NDwvdGQ+CiAgPC90cj4KICA8dHI+CiAgICA8dGQ+MTg8L3RkPjx0ZD4yOTI1PC90ZD48dGQ+MjkyNS4wMDA8L3RkPjx0ZD4xMTwvdGQ+PHRkPiBJbmY8L3RkPjx0ZD43LjExMTwvdGQ+PHRkPjUyMC44ODk8L3RkPgogIDwvdHI+CiAgPHRyPgogICAgPHRkPjE5PC90ZD48dGQ+MzQzOTwvdGQ+PHRkPjM0MzkuMDAwPC90ZD48dGQ+MTk8L3RkPjx0ZD4xOS4wNDg8L3RkPjx0ZD4xNi44NDI8L3RkPjx0ZD4zODcuMzY4PC90ZD4KICA8L3RyPgogIDx0cj4KICAgIDx0ZD4yMDwvdGQ+PHRkPjQwMTA8L3RkPjx0ZD40MDEwLjAwMDwvdGQ+PHRkPjM8L3RkPjx0ZD4gSW5mPC90ZD48dGQ+MTQuNDAwPC90ZD48dGQ+NTg0LjgwMDwvdGQ+CiAgPC90cj4KICA8dHI+CiAgICA8dGQ+MjE8L3RkPjx0ZD40NjQxPC90ZD48dGQ+NDY0MS4wMDA8L3RkPjx0ZD4yMTwvdGQ+PHRkPjIxLjAzNTwvdGQ+PHRkPjYuMDk1PC90ZD48dGQ+MTE1OC4wOTU8L3RkPgogIDwvdHI+CiAgPHRyPgogICAgPHRkPjIyPC90ZD48dGQ+NTMzNTwvdGQ+PHRkPjUzMzUuMDAwPC90ZD48dGQ+MTM8L3RkPjx0ZD4gSW5mPC90ZD48dGQ+Ni41NDU8L3RkPjx0ZD4xMTMyLjM2NDwvdGQ+CiAgPC90cj4KICA8dHI+CiAgICA8dGQ+MjM8L3RkPjx0ZD42MDk1PC90ZD48dGQ+NjA5NS4wMDA8L3RkPjx0ZD4yMzwvdGQ+PHRkPjIzLjAzNzwvdGQ+PHRkPjExLjEzMDwvdGQ+PHRkPjEyNjguODcwPC90ZD4KICA8L3RyPgogIDx0cj4KICAgIDx0ZD4yNDwvdGQ+PHRkPjY5MjQ8L3RkPjx0ZD42OTI0LjAwMDwvdGQ+PHRkPjM8L3RkPjx0ZD4gSW5mPC90ZD48dGQ+MTAuNjY3PC90ZD48dGQ+ODI3LjUwMDwvdGQ+CiAgPC90cj4KICA8dHI+CiAgICA8dGQ+MjU8L3RkPjx0ZD43ODI1PC90ZD48dGQ+NzgyNS4wMDA8L3RkPjx0ZD4yNTwvdGQ+PHRkPjI1LjAyOTwvdGQ+PHRkPjM1Ljg0MDwvdGQ+PHRkPjExOTAuNDAwPC90ZD4KICA8L3RyPgogIDx0cj4KICAgIDx0ZD4yNjwvdGQ+PHRkPjg4MDE8L3RkPjx0ZD44ODAxLjAwMDwvdGQ+PHRkPjE1PC90ZD48dGQ+IEluZjwvdGQ+PHRkPjQuOTIzPC90ZD48dGQ+MTg1OS4wNzc8L3RkPgogIDwvdHI+CiAgPHRyPgogICAgPHRkPjI3PC90ZD48dGQ+OTg1NTwvdGQ+PHRkPjk4NTUuMDAwPC90ZD48dGQ+Mjc8L3RkPjx0ZD4yNy4wMzI8L3RkPjx0ZD4zNy45MjY8L3RkPjx0ZD4xMzY1LjMzMzwvdGQ+CiAgPC90cj4KICA8dHI+CiAgICA8dGQ+Mjg8L3RkPjx0ZD4xMDk5MDwvdGQ+PHRkPjEwOTkwLjAwMDwvdGQ+PHRkPjM8L3RkPjx0ZD4gSW5mPC90ZD48dGQ+MzQuMjg2PC90ZD48dGQ+MTM2NS43MTQ8L3RkPgogIDwvdHI+CiAgPHRyPgogICAgPHRkPjI5PC90ZD48dGQ+MTIyMDk8L3RkPjx0ZD4xMjIwOS4wMDA8L3RkPjx0ZD4yOTwvdGQ+PHRkPjI5LjAyNTwvdGQ+PHRkPjMwLjg5NzwvdGQ+PHRkPjE2NDcuNDQ4PC90ZD4KICA8L3RyPgogIDx0cj4KICAgIDx0ZD4zMDwvdGQ+PHRkPjEzNTE1PC90ZD48dGQ+MTM1MTUuMDAwPC90ZD48dGQ+MTc8L3RkPjx0ZD4gSW5mPC90ZD48dGQ+OC41MzM8L3RkPjx0ZD4yNTcxLjczMzwvdGQ+CiAgPC90cj4KICA8dHI+CiAgICA8dGQ+MzE8L3RkPjx0ZD4xNDkxMTwvdGQ+PHRkPjE0OTExLjAwMDwvdGQ+PHRkPjMxPC90ZD48dGQ+MzEuMDI3PC90ZD48dGQ+MzMuMDMyPC90ZD48dGQ+MTQyNi41ODE8L3RkPgogIDwvdHI+CiAgPHRyPgogICAgPHRkPjMyPC90ZD48dGQ+MTY0MDA8L3RkPjx0ZD4xNjQwMC4wMDA8L3RkPjx0ZD4zPC90ZD48dGQ+IEluZjwvdGQ+PHRkPjAuMDAwPC90ZD48dGQ+MTYwMC4xMjU8L3RkPgogIDwvdHI+CjwvdGFibGU+CjxjZW50ZXI+RWxhcHNlZCBUaW1lID0gICAgICAgIDAuNzEwIHNlY29uZHM8L2NlbnRlcj4KCjxwPgpUaGUgbWFnaWMgc3F1YXJlIGV4YW1wbGUgZG9lcyBub3QgZmFyZSB3ZWxsIHdoZW4gPGEgaHJlZj0nLi4vZXhhbXBsZXMvTWFnaWNTcXVhcmVFeGFtcGxlLnBocCc+cnVuIGFzIGEgUEhQIHNjcmlwdDwvYT4uICBGb3IgYSAzMngzMiBtYXRyaXggYXJyYXkgCml0IHRha2VzIGFyb3VuZCBhIHNlY29uZCB0byBjb21wbGV0ZSBqdXN0IHRoZSBsYXN0IHJvdyBvZiBjb21wdXRhdGlvbnMgaW4gdGhlIGFib3ZlIHRhYmxlLiAgCkhvcGVmdWxseSB0aGlzIHJlc3VsdCB3aWxsIHNwdXIgUEhQIGRldmVsb3BlcnMgdG8gZmluZCBvcHRpbWl6YXRpb25zIGFuZCBiZXR0ZXIgYXR0dW5lZCBhbGdvcml0aG1zIAp0byBzcGVlZCB0aGluZ3MgdXAuIE1hdHJpeCBhbGdlYnJhIGlzIGEgZ3JlYXQgdGVzdGluZyBncm91bmQgZm9yIGlkZWFzIGFib3V0IHRpbWUgYW5kIG1lbW9yeSAKcGVyZm9ybWFuY2Ugb3B0aW1hdGlvbi4gIEtlZXAgaW4gcGVyc3BlY3RpdmUgdGhhdCBQSFAgSkFNQSBzY3JpcHRzIGFyZSBzdGlsbCBwbGVudHkgZmFzdCBmb3IgdXNlIGFzIAphIHRvb2wgZm9yIGxlYXJuaW5nIGFib3V0IG1hdHJpeCBhbGdlYnJhIGFuZCBxdWlja2x5IGV4dGVuZGluZyB5b3VyIGtub3dsZWRnZSB3aXRoIG5ldyBzY3JpcHRzIAp0byBhcHBseSBrbm93bGVkZ2UuCjwvcD4gCgo8cD4KVG8gbGVhcm4gbW9yZSBhYm91dCB0aGUgc3ViamVjdCBvZiBtYWdpYyBzcXVhcmVzIHlvdSBjYW4gdmlzaXQgdGhlIDxhIGhyZWY9J2h0dHA6Ly9tYXRoZm9ydW0ub3JnL2FsZWphbmRyZS9tYWdpYy5zcXVhcmUuaHRtbCc+RHJleGVsIE1hdGggRm9ydW0gb24gTWFnaWMgU3F1YXJlczwvYT4uCllvdSBjYW4gYWxzbyBsZWFybiBtb3JlIGJ5IGNhcmVmdWxseSBleGFtaW5pbmcgdGhlIDxjb2RlPk1hZ2ljU3F1YXJlRXhhbXBsZS5waHA8L2NvZGU+IHNvdXJjZSBjb2RlIGJlbG93Lgo8L3A+Cgo8P3BocApoaWdobGlnaHRfZmlsZSgiLi4vZXhhbXBsZXMvTWFnaWNTcXVhcmVFeGFtcGxlLnBocCIpOwppbmNsdWRlX29uY2UgImluY2x1ZGVzL2Zvb3Rlci5waHAiOwkKPz4K]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Shared/JAMA/docs/includes/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Shared/JAMA/docs/includes/credits.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[CTxkaXYgaWQ9ImNyZWRpdHMiPgogIDxwPgogIEJyb3VnaHQgdG8geW91IGJ5OgogIDwvcD4KCTx1bD4KCSAgPGxpPjxhIGhyZWY9Imh0dHA6Ly9tYXRoLm5pc3QuZ292LyI+TmF0aW9uYWwgSW5zdGl0dXRlIG9mIFN0YW5kYXJkcyBhbmQgVGVjaG5vbG9neTwvYT48L2xpPgoJICA8bGk+PGEgaHJlZj0iaHR0cDovL21hdGgubmlzdC5nb3YvIj5NYXRoV29ya3M8L2E+PC9saT4KCSAgPGxpPjxhIGhyZWY9Imh0dHA6Ly9tYXRoLm5pc3QuZ292L2phdmFudW1lcmljcy9qYW1hLyI+SkFNQSA6IEEgSmF2YSBNYXRyaXggUGFja2FnZTwvYT48L2xpPgkKCSAgPGxpPlBhdWwgTWVhZ2hlcjwvbGk+CgkgIDxsaT5NaWNoYWVsIEJvbW1hcml0bzwvbGk+CgkgIDxsaT5MdWthc3ogS2FyYXB1ZGE8L2xpPgoJICA8bGk+QmFydGVrIE1hdG9zaXVrPC9saT4KCTwvdWw+Cgk8L2Rpdj4K]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Shared/JAMA/docs/includes/footer.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[CTwvYm9keT4KPC9odG1sPgo=]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Shared/JAMA/docs/includes/header.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKCSJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgoJPGhlYWQ+CgkJPHRpdGxlPkpBTUEgdjEuMC4xPC90aXRsZT4KCQk8bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iSkFNQSB2MS4wLjEgLSBQb3J0IG9mIHRoZSBwcm9wb3NlZCBzdGFuZGFyZCBKYXZhIE1hdHJpeCBMaWJyYXJ5IHRvIFBIUCIgLz4KCQk8bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9ImluZGV4LCBmb2xsb3ciIC8+CgkJPG1ldGEgbmFtZT0ia2V5d29yZHMiIGNvbnRlbnQ9InBocCwgbWF0cml4LCBtYXRyaXggbGlicmFyeSwgY2hvbGVza3kgZGVjb21wb3NpdGlvbiwgZWlnZW52YWx1ZSBkZWNvbXBvc2l0aW9uLCBlaWdlbnZlY3RvciwgbHUgZGVjb21wb3NpdGlvbiwgcXIgZGVjb21wb3NpdGlvbiwgc2luZ3VsYXIgdmFsdWUgZGVjb21wb3NpdGlvbiIgLz4KCQk8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSJzdHlsZS5jc3MiIC8+Cgk8L2hlYWQ+Cgk8Ym9keT4K]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Shared/JAMA/docs/includes/navbar.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PGNlbnRlcj4KICA8aHIgLz4KICAgIFsgPGEgaHJlZj0iaW5kZXgucGhwIj5pbmRleC5waHA8L2E+IF0gWyA8YSBocmVmPSJkb2NzLnBocCI+ZG9jcy5waHA8L2E+IF0gWyA8YSBocmVmPSJwYWNrYWdlLnBocCI+cGFja2FnZS5waHA8L2E+IF0gWyA8YSBocmVmPSJ0ZXN0LnBocCI+dGVzdC5waHA8L2E+IF0gWyA8YSBocmVmPSJleGFtcGxlLnBocCI+ZXhhbXBsZS5waHA8L2E+IF0gWyA8YSBocmVmPSJkb3dubG9hZC5waHAiPmRvd25sb2FkLnBocDwvYT4gXQogIDxociAvPgo8L2NlbnRlcj4K]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Shared/JAMA/docs/index.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKaW5jbHVkZV9vbmNlICJpbmNsdWRlcy9oZWFkZXIucGhwIjsKaW5jbHVkZV9vbmNlICJpbmNsdWRlcy9uYXZiYXIucGhwIjsKPz4KCjxwPgpKQU1BIGlzIGEgcHJvcG9zZWQgc3RhbmRhcmQgbWF0cml4IGNsYXNzIGZvciBKYXZhLiBUaGUgSkFNQSBpbnRyb2R1Y3Rpb24gCmRlc2NyaWJlcyAiSkFNQSA6IEEgSmF2YSBNYXRyaXggUGFja2FnZSIgaW4gdGhpcyB3YXk6CjwvcD4gCgo8YmxvY2txdW90ZT4KSkFNQSBpcyBhIGJhc2ljIGxpbmVhciBhbGdlYnJhIHBhY2thZ2UgZm9yIEphdmEuIEl0IHByb3ZpZGVzIHVzZXItbGV2ZWwgY2xhc3NlcyBmb3IgCmNvbnN0cnVjdGluZyBhbmQgbWFuaXB1bGF0aW5nIHJlYWwsIGRlbnNlIG1hdHJpY2VzLiAgSXQgaXMgbWVhbnQgdG8gcHJvdmlkZSBzdWZmaWNpZW50IApmdW5jdGlvbmFsaXR5IGZvciByb3V0aW5lIHByb2JsZW1zLCBwYWNrYWdlZCBpbiBhIHdheSB0aGF0IGlzIG5hdHVyYWwgYW5kIHVuZGVyc3RhbmRhYmxlIAp0byBub24tZXhwZXJ0cy4gIEl0IGlzIGludGVuZGVkIHRvIHNlcnZlIGFzIHRoZSBzdGFuZGFyZCBtYXRyaXggY2xhc3MgZm9yIEphdmEsIGFuZCAKd2lsbCBiZSBwcm9wb3NlZCBhcyBzdWNoIHRvIHRoZSBKYXZhIEdyYW5kZSBGb3J1bSBhbmQgdGhlbiB0byBTdW4uICBBIHN0cmFpZ2h0Zm9yd2FyZCAKcHVibGljLWRvbWFpbiByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaGFzIGJlZW4gZGV2ZWxvcGVkIGJ5IHRoZSBNYXRoV29ya3MgYW5kIE5JU1QgYXMgCmEgc3RyYXdtYW4gZm9yIHN1Y2ggYSBjbGFzcy4gIFdlIGFyZSByZWxlYXNpbmcgdGhpcyB2ZXJzaW9uIGluIG9yZGVyIHRvIG9idGFpbiBwdWJsaWMgCmNvbW1lbnQuIFRoZXJlIGlzIG5vIGd1YXJhbnRlZSB0aGF0IGZ1dHVyZSB2ZXJzaW9ucyBvZiBKQU1BIHdpbGwgYmUgY29tcGF0aWJsZSB3aXRoIHRoaXMgb25lLiAgCjwvYmxvY2txdW90ZT4KCjxwPgpUaGUgZGV2ZWxvcG1lbnQgdGVhbSBiZWxvdyBoYXMgc3VjY2Vzc2Z1bGx5IHBvcnRlZCB0aGUgSkFNQSBBUEkgdG8gUEhQLiAgWW91IGNhbiBleHBsb3JlIAp0aGlzIHNpdGUgdG8gbGVhcm4gbW9yZSBhYm91dCB0aGlzIHByb2plY3QgYW5kIGl0J3MgY3VycmVudCBkZXZlbG9wbWVudCBzdGF0dXMuCjwvcD4KCjw/cGhwCmluY2x1ZGVfb25jZSAiaW5jbHVkZXMvY3JlZGl0cy5waHAiOwppbmNsdWRlX29uY2UgImluY2x1ZGVzL2Zvb3Rlci5waHAiOwkKPz4=]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Shared/JAMA/docs/package.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKaW5jbHVkZV9vbmNlICJpbmNsdWRlcy9oZWFkZXIucGhwIjsKaW5jbHVkZV9vbmNlICJpbmNsdWRlcy9uYXZiYXIucGhwIjsKPz4KPHA+ClNvdXJjZSBMaXN0aW5nOgo8L3A+Cjx1bD4KICA8P3BocAogIGNoZGlyKCIuLi8iKTsKICAkZmlsZXMgPSBnbG9iKCIqLnBocCIpOwogICRmaWxlcyA9IGFycmF5X21lcmdlKCRmaWxlcywgZ2xvYigidXRpbC8qLnBocCIpKTsKICBmb3JlYWNoICgkZmlsZXMgYXMgJGZpbGVOYW1lKSB7CiAgICA/PgogIAk8bGk+PGEgaHJlZj0icGFja2FnZS5waHA/dmlldz08P3BocCBlY2hvIHNoYTEoJGZpbGVOYW1lKTs/PiI+PD9waHAgZWNobyAkZmlsZU5hbWU7Pz48L2E+Jm5ic3A7LSZuYnNwOzw/cGhwIGVjaG8gZGF0ZSAoIkYgZCBZIC0gZzppIGEiLCBmaWxlbXRpbWUoJGZpbGVOYW1lKSk7Pz48L2xpPgogICAgPD9waHAKICB9CiAgPz4KPC91bD4KPD9waHAKaWYoIGlzc2V0KCRfUkVRVUVTVFsndmlldyddKSApIHsKCSRoYXNoID0gJF9SRVFVRVNUWyd2aWV3J107CgkkbiA9IGFycmF5X3NlYXJjaCgkaGFzaCwgYXJyYXlfbWFwKHNoYTEsICRmaWxlcykpOwoJJGZpbGVOYW1lID0gJGZpbGVzWyRuXTsKICA/PgogIDxociAvPiAgCglWaWV3aW5nOiA8P3BocCBlY2hvICRmaWxlTmFtZTs/PgkKCTxociAvPgoJPD9waHAKCWhpZ2hsaWdodF9maWxlKCRmaWxlTmFtZSk7Cgk/PgoJPGhyIC8+Cjw/cGhwCn0KaW5jbHVkZV9vbmNlICJpbmNsdWRlcy9mb290ZXIucGhwIjsJCj8+Cgo=]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Shared/JAMA/docs/test.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKaW5jbHVkZV9vbmNlICJpbmNsdWRlcy9oZWFkZXIucGhwIjsKaW5jbHVkZV9vbmNlICJpbmNsdWRlcy9uYXZiYXIucGhwIjsKPz4KPHA+ClRoZSBmaXJzdCBzY3JpcHQgeW91ciBzaG91bGQgcnVuIHdoZW4geW91IGluc3RhbGwgSmFtYSBpcyB0aGUgVGVzdE1hdHJpeC5waHAgc2NyaXB0Lgo8L3A+CjxwPgpUaGlzIHdpbGwgcnVuIHRoZSB1bml0IHRlc3RzIGZvciBtZXRob2RzIGluIHRoZSA8Y29kZT5NYXRyaXgucGhwPC9jb2RlPiBjbGFzcy4gIEJlY2F1c2UKdGhlIE1hdHJpeC5waHAgY2xhc3MgY2FuIGJlIHVzZWQgdG8gaW52b2tlIGFsbCB0aGUgZGVjb21wb3NpdGlvbiBtZXRob2RzIHRoZSA8Y29kZT5UZXN0TWF0cml4LnBocDwvY29kZT4gCnNjcmlwdCBpcyBhIHRlc3Qgc3VpdGUgZm9yIHRoZSB3aG9sZSBKYW1hIHBhY2thZ2UuCjwvcD4KPHA+ClRoZSBvcmlnaW5hbCA8Y29kZT5UZXN0TWF0cml4LmphdmE8L2NvZGU+IGNvZGUgdXNlcyB0cnkvY2F0Y2ggZXJyb3IgaGFuZGxpbmcuICBXZSB3aWxsIApldmVudHVhbGx5IGNyZWF0ZSBhIGJ1aWxkIG9mIEpBTUEgdGhhdCB3aWxsIHRha2UgYWR2YW50YWdlIG9mIFBIUDUncyBuZXcgdHJ5L2NhdGNoIGVycm9yIApoYW5kbGluZyBjYXBhYmlsaXRpZXMuICBUaGlzIHdpbGwgaW1wcm92ZSBvdXIgYWJpbGl0eSB0byByZXBsaWNhdGUgYWxsIHRoZSB1bml0IHRlc3RzIHRoYXQgCmFwcGVhcmVkIGluIHRoZSBvcmlnaW5hbCAoZXhjZXB0IGZvciBzb21lIHByaW50IG1ldGhvZHMgdGhhdCBtYXkgbm90IGJlIHdvcnRoIHBvcnRpbmcpLgo8L3A+CjxwPgpZb3UgY2FuIDxhIGhyZWY9Jy4uL3Rlc3QvVGVzdE1hdHJpeC5waHAnPnJ1biB0aGUgVGVzdE1hdHJpeC5waHAgc2NyaXB0PC9hPiB0byBzZWUgd2hhdCAKdW5pdCB0ZXN0cyBhcmUgY3VycmVudGx5IGltcGxlbWVudGVkLiAgVGhlIHNvdXJjZSBvZiB0aGUgPGNvZGU+VGVzdE1hdHJpeC5waHA8L2NvZGU+IHNjcmlwdCAKaXMgcHJvdmlkZWQgYmVsb3cuICBJdCBpcyB3b3J0aCBzdHVkeWluZyBjYXJlZnVsbHkgZm9yIGFuIGV4YW1wbGUgb2YgaG93IHRvIGRvIG1hdHJpeCBhbGdlYnJhCnByb2dyYW1taW5nIHdpdGggSmFtYS4KPC9wPgo8P3BocApoaWdobGlnaHRfZmlsZSgiLi4vdGVzdC9UZXN0TWF0cml4LnBocCIpOwppbmNsdWRlX29uY2UgImluY2x1ZGVzL2Zvb3Rlci5waHAiOwkKPz4K]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Shared/JAMA/EigenvalueDecomposition.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqCUBwYWNrYWdlIEpBTUEKICoKICoJQ2xhc3MgdG8gb2J0YWluIGVpZ2VudmFsdWVzIGFuZCBlaWdlbnZlY3RvcnMgb2YgYSByZWFsIG1hdHJpeC4KICoKICoJSWYgQSBpcyBzeW1tZXRyaWMsIHRoZW4gQSA9IFYqRCpWJyB3aGVyZSB0aGUgZWlnZW52YWx1ZSBtYXRyaXggRAogKglpcyBkaWFnb25hbCBhbmQgdGhlIGVpZ2VudmVjdG9yIG1hdHJpeCBWIGlzIG9ydGhvZ29uYWwgKGkuZS4KICoJQSA9IFYudGltZXMoRC50aW1lcyhWLnRyYW5zcG9zZSgpKSkgYW5kIFYudGltZXMoVi50cmFuc3Bvc2UoKSkKICoJZXF1YWxzIHRoZSBpZGVudGl0eSBtYXRyaXgpLgogKgogKglJZiBBIGlzIG5vdCBzeW1tZXRyaWMsIHRoZW4gdGhlIGVpZ2VudmFsdWUgbWF0cml4IEQgaXMgYmxvY2sgZGlhZ29uYWwKICoJd2l0aCB0aGUgcmVhbCBlaWdlbnZhbHVlcyBpbiAxLWJ5LTEgYmxvY2tzIGFuZCBhbnkgY29tcGxleCBlaWdlbnZhbHVlcywKICoJbGFtYmRhICsgaSptdSwgaW4gMi1ieS0yIGJsb2NrcywgW2xhbWJkYSwgbXU7IC1tdSwgbGFtYmRhXS4gIFRoZQogKgljb2x1bW5zIG9mIFYgcmVwcmVzZW50IHRoZSBlaWdlbnZlY3RvcnMgaW4gdGhlIHNlbnNlIHRoYXQgQSpWID0gVipELAogKglpLmUuIEEudGltZXMoVikgZXF1YWxzIFYudGltZXMoRCkuICBUaGUgbWF0cml4IFYgbWF5IGJlIGJhZGx5CiAqCWNvbmRpdGlvbmVkLCBvciBldmVuIHNpbmd1bGFyLCBzbyB0aGUgdmFsaWRpdHkgb2YgdGhlIGVxdWF0aW9uCiAqCUEgPSBWKkQqaW52ZXJzZShWKSBkZXBlbmRzIHVwb24gVi5jb25kKCkuCiAqCiAqCUBhdXRob3IgIFBhdWwgTWVhZ2hlcgogKglAbGljZW5zZSBQSFAgdjMuMAogKglAdmVyc2lvbiAxLjEKICovCmNsYXNzIEVpZ2VudmFsdWVEZWNvbXBvc2l0aW9uIHsKCgkvKioKCSAqCVJvdyBhbmQgY29sdW1uIGRpbWVuc2lvbiAoc3F1YXJlIG1hdHJpeCkuCgkgKglAdmFyIGludAoJICovCglwcml2YXRlICRuOwoKCS8qKgoJICoJSW50ZXJuYWwgc3ltbWV0cnkgZmxhZy4KCSAqCUB2YXIgaW50CgkgKi8KCXByaXZhdGUgJGlzc3ltbWV0cmljOwoKCS8qKgoJICoJQXJyYXlzIGZvciBpbnRlcm5hbCBzdG9yYWdlIG9mIGVpZ2VudmFsdWVzLgoJICoJQHZhciBhcnJheQoJICovCglwcml2YXRlICRkID0gYXJyYXkoKTsKCXByaXZhdGUgJGUgPSBhcnJheSgpOwoKCS8qKgoJICoJQXJyYXkgZm9yIGludGVybmFsIHN0b3JhZ2Ugb2YgZWlnZW52ZWN0b3JzLgoJICoJQHZhciBhcnJheQoJICovCglwcml2YXRlICRWID0gYXJyYXkoKTsKCgkvKioKCSoJQXJyYXkgZm9yIGludGVybmFsIHN0b3JhZ2Ugb2Ygbm9uc3ltbWV0cmljIEhlc3NlbmJlcmcgZm9ybS4KCSoJQHZhciBhcnJheQoJKi8KCXByaXZhdGUgJEggPSBhcnJheSgpOwoKCS8qKgoJKglXb3JraW5nIHN0b3JhZ2UgZm9yIG5vbnN5bW1ldHJpYyBhbGdvcml0aG0uCgkqCUB2YXIgYXJyYXkKCSovCglwcml2YXRlICRvcnQ7CgoJLyoqCgkqCVVzZWQgZm9yIGNvbXBsZXggc2NhbGFyIGRpdmlzaW9uLgoJKglAdmFyIGZsb2F0CgkqLwoJcHJpdmF0ZSAkY2RpdnI7Cglwcml2YXRlICRjZGl2aTsKCgoJLyoqCgkgKglTeW1tZXRyaWMgSG91c2Vob2xkZXIgcmVkdWN0aW9uIHRvIHRyaWRpYWdvbmFsIGZvcm0uCgkgKgoJICoJQGFjY2VzcyBwcml2YXRlCgkgKi8KCXByaXZhdGUgZnVuY3Rpb24gdHJlZDIgKCkgewoJCS8vICBUaGlzIGlzIGRlcml2ZWQgZnJvbSB0aGUgQWxnb2wgcHJvY2VkdXJlcyB0cmVkMiBieQoJCS8vICBCb3dkbGVyLCBNYXJ0aW4sIFJlaW5zY2gsIGFuZCBXaWxraW5zb24sIEhhbmRib29rIGZvcgoJCS8vICBBdXRvLiBDb21wLiwgVm9sLmlpLUxpbmVhciBBbGdlYnJhLCBhbmQgdGhlIGNvcnJlc3BvbmRpbmcKCQkvLyAgRm9ydHJhbiBzdWJyb3V0aW5lIGluIEVJU1BBQ0suCgkJJHRoaXMtPmQgPSAkdGhpcy0+VlskdGhpcy0+bi0xXTsKCQkvLyBIb3VzZWhvbGRlciByZWR1Y3Rpb24gdG8gdHJpZGlhZ29uYWwgZm9ybS4KCQlmb3IgKCRpID0gJHRoaXMtPm4tMTsgJGkgPiAwOyAtLSRpKSB7CgkJCSRpXyA9ICRpIC0xOwoJCQkvLyBTY2FsZSB0byBhdm9pZCB1bmRlci9vdmVyZmxvdy4KCQkJJGggPSAkc2NhbGUgPSAwLjA7CgkJCSRzY2FsZSArPSBhcnJheV9zdW0oYXJyYXlfbWFwKGFicywgJHRoaXMtPmQpKTsKCQkJaWYgKCRzY2FsZSA9PSAwLjApIHsKCQkJCSR0aGlzLT5lWyRpXSA9ICR0aGlzLT5kWyRpX107CgkJCQkkdGhpcy0+ZCA9IGFycmF5X3NsaWNlKCR0aGlzLT5WWyRpX10sIDAsICRpXyk7CgkJCQlmb3IgKCRqID0gMDsgJGogPCAkaTsgKyskaikgewoJCQkJCSR0aGlzLT5WWyRqXVskaV0gPSAkdGhpcy0+VlskaV1bJGpdID0gMC4wOwoJCQkJfQoJCQl9IGVsc2UgewoJCQkJLy8gR2VuZXJhdGUgSG91c2Vob2xkZXIgdmVjdG9yLgoJCQkJZm9yICgkayA9IDA7ICRrIDwgJGk7ICsrJGspIHsKCQkJCQkkdGhpcy0+ZFska10gLz0gJHNjYWxlOwoJCQkJCSRoICs9IHBvdygkdGhpcy0+ZFska10sIDIpOwoJCQkJfQoJCQkJJGYgPSAkdGhpcy0+ZFskaV9dOwoJCQkJJGcgPSBzcXJ0KCRoKTsKCQkJCWlmICgkZiA+IDApIHsKCQkJCQkkZyA9IC0kZzsKCQkJCX0KCQkJCSR0aGlzLT5lWyRpXSA9ICRzY2FsZSAqICRnOwoJCQkJJGggPSAkaCAtICRmICogJGc7CgkJCQkkdGhpcy0+ZFskaV9dID0gJGYgLSAkZzsKCQkJCWZvciAoJGogPSAwOyAkaiA8ICRpOyArKyRqKSB7CgkJCQkJJHRoaXMtPmVbJGpdID0gMC4wOwoJCQkJfQoJCQkJLy8gQXBwbHkgc2ltaWxhcml0eSB0cmFuc2Zvcm1hdGlvbiB0byByZW1haW5pbmcgY29sdW1ucy4KCQkJCWZvciAoJGogPSAwOyAkaiA8ICRpOyArKyRqKSB7CgkJCQkJJGYgPSAkdGhpcy0+ZFskal07CgkJCQkJJHRoaXMtPlZbJGpdWyRpXSA9ICRmOwoJCQkJCSRnID0gJHRoaXMtPmVbJGpdICsgJHRoaXMtPlZbJGpdWyRqXSAqICRmOwoJCQkJCWZvciAoJGsgPSAkaisxOyAkayA8PSAkaV87ICsrJGspIHsKCQkJCQkJJGcgKz0gJHRoaXMtPlZbJGtdWyRqXSAqICR0aGlzLT5kWyRrXTsKCQkJCQkJJHRoaXMtPmVbJGtdICs9ICR0aGlzLT5WWyRrXVskal0gKiAkZjsKCQkJCQl9CgkJCQkJJHRoaXMtPmVbJGpdID0gJGc7CgkJCQl9CgkJCQkkZiA9IDAuMDsKCQkJCWZvciAoJGogPSAwOyAkaiA8ICRpOyArKyRqKSB7CgkJCQkJJHRoaXMtPmVbJGpdIC89ICRoOwoJCQkJCSRmICs9ICR0aGlzLT5lWyRqXSAqICR0aGlzLT5kWyRqXTsKCQkJCX0KCQkJCSRoaCA9ICRmIC8gKDIgKiAkaCk7CgkJCQlmb3IgKCRqPTA7ICRqIDwgJGk7ICsrJGopIHsKCQkJCQkkdGhpcy0+ZVskal0gLT0gJGhoICogJHRoaXMtPmRbJGpdOwoJCQkJfQoJCQkJZm9yICgkaiA9IDA7ICRqIDwgJGk7ICsrJGopIHsKCQkJCQkkZiA9ICR0aGlzLT5kWyRqXTsKCQkJCQkkZyA9ICR0aGlzLT5lWyRqXTsKCQkJCQlmb3IgKCRrID0gJGo7ICRrIDw9ICRpXzsgKyskaykgewoJCQkJCQkkdGhpcy0+Vlska11bJGpdIC09ICgkZiAqICR0aGlzLT5lWyRrXSArICRnICogJHRoaXMtPmRbJGtdKTsKCQkJCQl9CgkJCQkJJHRoaXMtPmRbJGpdID0gJHRoaXMtPlZbJGktMV1bJGpdOwoJCQkJCSR0aGlzLT5WWyRpXVskal0gPSAwLjA7CgkJCQl9CgkJCX0KCQkJJHRoaXMtPmRbJGldID0gJGg7CgkJfQoKCQkvLyBBY2N1bXVsYXRlIHRyYW5zZm9ybWF0aW9ucy4KCQlmb3IgKCRpID0gMDsgJGkgPCAkdGhpcy0+bi0xOyArKyRpKSB7CgkJCSR0aGlzLT5WWyR0aGlzLT5uLTFdWyRpXSA9ICR0aGlzLT5WWyRpXVskaV07CgkJCSR0aGlzLT5WWyRpXVskaV0gPSAxLjA7CgkJCSRoID0gJHRoaXMtPmRbJGkrMV07CgkJCWlmICgkaCAhPSAwLjApIHsKCQkJCWZvciAoJGsgPSAwOyAkayA8PSAkaTsgKyskaykgewoJCQkJCSR0aGlzLT5kWyRrXSA9ICR0aGlzLT5WWyRrXVskaSsxXSAvICRoOwoJCQkJfQoJCQkJZm9yICgkaiA9IDA7ICRqIDw9ICRpOyArKyRqKSB7CgkJCQkJJGcgPSAwLjA7CgkJCQkJZm9yICgkayA9IDA7ICRrIDw9ICRpOyArKyRrKSB7CgkJCQkJCSRnICs9ICR0aGlzLT5WWyRrXVskaSsxXSAqICR0aGlzLT5WWyRrXVskal07CgkJCQkJfQoJCQkJCWZvciAoJGsgPSAwOyAkayA8PSAkaTsgKyskaykgewoJCQkJCQkkdGhpcy0+Vlska11bJGpdIC09ICRnICogJHRoaXMtPmRbJGtdOwoJCQkJCX0KCQkJCX0KCQkJfQoJCQlmb3IgKCRrID0gMDsgJGsgPD0gJGk7ICsrJGspIHsKCQkJCSR0aGlzLT5WWyRrXVskaSsxXSA9IDAuMDsKCQkJfQoJCX0KCgkJJHRoaXMtPmQgPSAkdGhpcy0+VlskdGhpcy0+bi0xXTsKCQkkdGhpcy0+VlskdGhpcy0+bi0xXSA9IGFycmF5X2ZpbGwoMCwgJGosIDAuMCk7CgkJJHRoaXMtPlZbJHRoaXMtPm4tMV1bJHRoaXMtPm4tMV0gPSAxLjA7CgkJJHRoaXMtPmVbMF0gPSAwLjA7Cgl9CgoKCS8qKgoJICoJU3ltbWV0cmljIHRyaWRpYWdvbmFsIFFMIGFsZ29yaXRobS4KCSAqCgkgKglUaGlzIGlzIGRlcml2ZWQgZnJvbSB0aGUgQWxnb2wgcHJvY2VkdXJlcyB0cWwyLCBieQoJICoJQm93ZGxlciwgTWFydGluLCBSZWluc2NoLCBhbmQgV2lsa2luc29uLCBIYW5kYm9vayBmb3IKCSAqCUF1dG8uIENvbXAuLCBWb2wuaWktTGluZWFyIEFsZ2VicmEsIGFuZCB0aGUgY29ycmVzcG9uZGluZwoJICoJRm9ydHJhbiBzdWJyb3V0aW5lIGluIEVJU1BBQ0suCgkgKgoJICoJQGFjY2VzcyBwcml2YXRlCgkgKi8KCXByaXZhdGUgZnVuY3Rpb24gdHFsMigpIHsKCQlmb3IgKCRpID0gMTsgJGkgPCAkdGhpcy0+bjsgKyskaSkgewoJCQkkdGhpcy0+ZVskaS0xXSA9ICR0aGlzLT5lWyRpXTsKCQl9CgkJJHRoaXMtPmVbJHRoaXMtPm4tMV0gPSAwLjA7CgkJJGYgPSAwLjA7CgkJJHRzdDEgPSAwLjA7CgkJJGVwcyAgPSBwb3coMi4wLC01Mi4wKTsKCgkJZm9yICgkbCA9IDA7ICRsIDwgJHRoaXMtPm47ICsrJGwpIHsKCQkJLy8gRmluZCBzbWFsbCBzdWJkaWFnb25hbCBlbGVtZW50CgkJCSR0c3QxID0gbWF4KCR0c3QxLCBhYnMoJHRoaXMtPmRbJGxdKSArIGFicygkdGhpcy0+ZVskbF0pKTsKCQkJJG0gPSAkbDsKCQkJd2hpbGUgKCRtIDwgJHRoaXMtPm4pIHsKCQkJCWlmIChhYnMoJHRoaXMtPmVbJG1dKSA8PSAkZXBzICogJHRzdDEpCgkJCQkJYnJlYWs7CgkJCQkrKyRtOwoJCQl9CgkJCS8vIElmIG0gPT0gbCwgJHRoaXMtPmRbbF0gaXMgYW4gZWlnZW52YWx1ZSwKCQkJLy8gb3RoZXJ3aXNlLCBpdGVyYXRlLgoJCQlpZiAoJG0gPiAkbCkgewoJCQkJJGl0ZXIgPSAwOwoJCQkJZG8gewoJCQkJCS8vIENvdWxkIGNoZWNrIGl0ZXJhdGlvbiBjb3VudCBoZXJlLgoJCQkJCSRpdGVyICs9IDE7CgkJCQkJLy8gQ29tcHV0ZSBpbXBsaWNpdCBzaGlmdAoJCQkJCSRnID0gJHRoaXMtPmRbJGxdOwoJCQkJCSRwID0gKCR0aGlzLT5kWyRsKzFdIC0gJGcpIC8gKDIuMCAqICR0aGlzLT5lWyRsXSk7CgkJCQkJJHIgPSBoeXBvKCRwLCAxLjApOwoJCQkJCWlmICgkcCA8IDApCgkJCQkJCSRyICo9IC0xOwoJCQkJCSR0aGlzLT5kWyRsXSA9ICR0aGlzLT5lWyRsXSAvICgkcCArICRyKTsKCQkJCQkkdGhpcy0+ZFskbCsxXSA9ICR0aGlzLT5lWyRsXSAqICgkcCArICRyKTsKCQkJCQkkZGwxID0gJHRoaXMtPmRbJGwrMV07CgkJCQkJJGggPSAkZyAtICR0aGlzLT5kWyRsXTsKCQkJCQlmb3IgKCRpID0gJGwgKyAyOyAkaSA8ICR0aGlzLT5uOyArKyRpKQoJCQkJCQkkdGhpcy0+ZFskaV0gLT0gJGg7CgkJCQkJJGYgKz0gJGg7CgkJCQkJLy8gSW1wbGljaXQgUUwgdHJhbnNmb3JtYXRpb24uCgkJCQkJJHAgPSAkdGhpcy0+ZFskbV07CgkJCQkJJGMgPSAxLjA7CgkJCQkJJGMyID0gJGMzID0gJGM7CgkJCQkJJGVsMSA9ICR0aGlzLT5lWyRsICsgMV07CgkJCQkJJHMgPSAkczIgPSAwLjA7CgkJCQkJZm9yICgkaSA9ICRtLTE7ICRpID49ICRsOyAtLSRpKSB7CgkJCQkJCSRjMyA9ICRjMjsKCQkJCQkJJGMyID0gJGM7CgkJCQkJCSRzMiA9ICRzOwoJCQkJCQkkZyAgPSAkYyAqICR0aGlzLT5lWyRpXTsKCQkJCQkJJGggID0gJGMgKiAkcDsKCQkJCQkJJHIgID0gaHlwbygkcCwgJHRoaXMtPmVbJGldKTsKCQkJCQkJJHRoaXMtPmVbJGkrMV0gPSAkcyAqICRyOwoJCQkJCQkkcyA9ICR0aGlzLT5lWyRpXSAvICRyOwoJCQkJCQkkYyA9ICRwIC8gJHI7CgkJCQkJCSRwID0gJGMgKiAkdGhpcy0+ZFskaV0gLSAkcyAqICRnOwoJCQkJCQkkdGhpcy0+ZFskaSsxXSA9ICRoICsgJHMgKiAoJGMgKiAkZyArICRzICogJHRoaXMtPmRbJGldKTsKCQkJCQkJLy8gQWNjdW11bGF0ZSB0cmFuc2Zvcm1hdGlvbi4KCQkJCQkJZm9yICgkayA9IDA7ICRrIDwgJHRoaXMtPm47ICsrJGspIHsKCQkJCQkJCSRoID0gJHRoaXMtPlZbJGtdWyRpKzFdOwoJCQkJCQkJJHRoaXMtPlZbJGtdWyRpKzFdID0gJHMgKiAkdGhpcy0+Vlska11bJGldICsgJGMgKiAkaDsKCQkJCQkJCSR0aGlzLT5WWyRrXVskaV0gPSAkYyAqICR0aGlzLT5WWyRrXVskaV0gLSAkcyAqICRoOwoJCQkJCQl9CgkJCQkJfQoJCQkJCSRwID0gLSRzICogJHMyICogJGMzICogJGVsMSAqICR0aGlzLT5lWyRsXSAvICRkbDE7CgkJCQkJJHRoaXMtPmVbJGxdID0gJHMgKiAkcDsKCQkJCQkkdGhpcy0+ZFskbF0gPSAkYyAqICRwOwoJCQkJLy8gQ2hlY2sgZm9yIGNvbnZlcmdlbmNlLgoJCQkJfSB3aGlsZSAoYWJzKCR0aGlzLT5lWyRsXSkgPiAkZXBzICogJHRzdDEpOwoJCQl9CgkJCSR0aGlzLT5kWyRsXSA9ICR0aGlzLT5kWyRsXSArICRmOwoJCQkkdGhpcy0+ZVskbF0gPSAwLjA7CgkJfQoKCQkvLyBTb3J0IGVpZ2VudmFsdWVzIGFuZCBjb3JyZXNwb25kaW5nIHZlY3RvcnMuCgkJZm9yICgkaSA9IDA7ICRpIDwgJHRoaXMtPm4gLSAxOyArKyRpKSB7CgkJCSRrID0gJGk7CgkJCSRwID0gJHRoaXMtPmRbJGldOwoJCQlmb3IgKCRqID0gJGkrMTsgJGogPCAkdGhpcy0+bjsgKyskaikgewoJCQkJaWYgKCR0aGlzLT5kWyRqXSA8ICRwKSB7CgkJCQkJJGsgPSAkajsKCQkJCQkkcCA9ICR0aGlzLT5kWyRqXTsKCQkJCX0KCQkJfQoJCQlpZiAoJGsgIT0gJGkpIHsKCQkJCSR0aGlzLT5kWyRrXSA9ICR0aGlzLT5kWyRpXTsKCQkJCSR0aGlzLT5kWyRpXSA9ICRwOwoJCQkJZm9yICgkaiA9IDA7ICRqIDwgJHRoaXMtPm47ICsrJGopIHsKCQkJCQkkcCA9ICR0aGlzLT5WWyRqXVskaV07CgkJCQkJJHRoaXMtPlZbJGpdWyRpXSA9ICR0aGlzLT5WWyRqXVska107CgkJCQkJJHRoaXMtPlZbJGpdWyRrXSA9ICRwOwoJCQkJfQoJCQl9CgkJfQoJfQoKCgkvKioKCSAqCU5vbnN5bW1ldHJpYyByZWR1Y3Rpb24gdG8gSGVzc2VuYmVyZyBmb3JtLgoJICoKCSAqCVRoaXMgaXMgZGVyaXZlZCBmcm9tIHRoZSBBbGdvbCBwcm9jZWR1cmVzIG9ydGhlcyBhbmQgb3J0cmFuLAoJICoJYnkgTWFydGluIGFuZCBXaWxraW5zb24sIEhhbmRib29rIGZvciBBdXRvLiBDb21wLiwKCSAqCVZvbC5paS1MaW5lYXIgQWxnZWJyYSwgYW5kIHRoZSBjb3JyZXNwb25kaW5nCgkgKglGb3J0cmFuIHN1YnJvdXRpbmVzIGluIEVJU1BBQ0suCgkgKgoJICoJQGFjY2VzcyBwcml2YXRlCgkgKi8KCXByaXZhdGUgZnVuY3Rpb24gb3J0aGVzICgpIHsKCQkkbG93ICA9IDA7CgkJJGhpZ2ggPSAkdGhpcy0+bi0xOwoKCQlmb3IgKCRtID0gJGxvdysxOyAkbSA8PSAkaGlnaC0xOyArKyRtKSB7CgkJCS8vIFNjYWxlIGNvbHVtbi4KCQkJJHNjYWxlID0gMC4wOwoJCQlmb3IgKCRpID0gJG07ICRpIDw9ICRoaWdoOyArKyRpKSB7CgkJCQkkc2NhbGUgPSAkc2NhbGUgKyBhYnMoJHRoaXMtPkhbJGldWyRtLTFdKTsKCQkJfQoJCQlpZiAoJHNjYWxlICE9IDAuMCkgewoJCQkJLy8gQ29tcHV0ZSBIb3VzZWhvbGRlciB0cmFuc2Zvcm1hdGlvbi4KCQkJCSRoID0gMC4wOwoJCQkJZm9yICgkaSA9ICRoaWdoOyAkaSA+PSAkbTsgLS0kaSkgewoJCQkJCSR0aGlzLT5vcnRbJGldID0gJHRoaXMtPkhbJGldWyRtLTFdIC8gJHNjYWxlOwoJCQkJCSRoICs9ICR0aGlzLT5vcnRbJGldICogJHRoaXMtPm9ydFskaV07CgkJCQl9CgkJCQkkZyA9IHNxcnQoJGgpOwoJCQkJaWYgKCR0aGlzLT5vcnRbJG1dID4gMCkgewoJCQkJCSRnICo9IC0xOwoJCQkJfQoJCQkJJGggLT0gJHRoaXMtPm9ydFskbV0gKiAkZzsKCQkJCSR0aGlzLT5vcnRbJG1dIC09ICRnOwoJCQkJLy8gQXBwbHkgSG91c2Vob2xkZXIgc2ltaWxhcml0eSB0cmFuc2Zvcm1hdGlvbgoJCQkJLy8gSCA9IChJIC11ICogdScgLyBoKSAqIEggKiAoSSAtdSAqIHUnKSAvIGgpCgkJCQlmb3IgKCRqID0gJG07ICRqIDwgJHRoaXMtPm47ICsrJGopIHsKCQkJCQkkZiA9IDAuMDsKCQkJCQlmb3IgKCRpID0gJGhpZ2g7ICRpID49ICRtOyAtLSRpKSB7CgkJCQkJCSRmICs9ICR0aGlzLT5vcnRbJGldICogJHRoaXMtPkhbJGldWyRqXTsKCQkJCQl9CgkJCQkJJGYgLz0gJGg7CgkJCQkJZm9yICgkaSA9ICRtOyAkaSA8PSAkaGlnaDsgKyskaSkgewoJCQkJCQkkdGhpcy0+SFskaV1bJGpdIC09ICRmICogJHRoaXMtPm9ydFskaV07CgkJCQkJfQoJCQkJfQoJCQkJZm9yICgkaSA9IDA7ICRpIDw9ICRoaWdoOyArKyRpKSB7CgkJCQkJJGYgPSAwLjA7CgkJCQkJZm9yICgkaiA9ICRoaWdoOyAkaiA+PSAkbTsgLS0kaikgewoJCQkJCQkkZiArPSAkdGhpcy0+b3J0WyRqXSAqICR0aGlzLT5IWyRpXVskal07CgkJCQkJfQoJCQkJCSRmID0gJGYgLyAkaDsKCQkJCQlmb3IgKCRqID0gJG07ICRqIDw9ICRoaWdoOyArKyRqKSB7CgkJCQkJCSR0aGlzLT5IWyRpXVskal0gLT0gJGYgKiAkdGhpcy0+b3J0WyRqXTsKCQkJCQl9CgkJCQl9CgkJCQkkdGhpcy0+b3J0WyRtXSA9ICRzY2FsZSAqICR0aGlzLT5vcnRbJG1dOwoJCQkJJHRoaXMtPkhbJG1dWyRtLTFdID0gJHNjYWxlICogJGc7CgkJCX0KCQl9CgoJCS8vIEFjY3VtdWxhdGUgdHJhbnNmb3JtYXRpb25zIChBbGdvbCdzIG9ydHJhbikuCgkJZm9yICgkaSA9IDA7ICRpIDwgJHRoaXMtPm47ICsrJGkpIHsKCQkJZm9yICgkaiA9IDA7ICRqIDwgJHRoaXMtPm47ICsrJGopIHsKCQkJCSR0aGlzLT5WWyRpXVskal0gPSAoJGkgPT0gJGogPyAxLjAgOiAwLjApOwoJCQl9CgkJfQoJCWZvciAoJG0gPSAkaGlnaC0xOyAkbSA+PSAkbG93KzE7IC0tJG0pIHsKCQkJaWYgKCR0aGlzLT5IWyRtXVskbS0xXSAhPSAwLjApIHsKCQkJCWZvciAoJGkgPSAkbSsxOyAkaSA8PSAkaGlnaDsgKyskaSkgewoJCQkJCSR0aGlzLT5vcnRbJGldID0gJHRoaXMtPkhbJGldWyRtLTFdOwoJCQkJfQoJCQkJZm9yICgkaiA9ICRtOyAkaiA8PSAkaGlnaDsgKyskaikgewoJCQkJCSRnID0gMC4wOwoJCQkJCWZvciAoJGkgPSAkbTsgJGkgPD0gJGhpZ2g7ICsrJGkpIHsKCQkJCQkJJGcgKz0gJHRoaXMtPm9ydFskaV0gKiAkdGhpcy0+VlskaV1bJGpdOwoJCQkJCX0KCQkJCQkvLyBEb3VibGUgZGl2aXNpb24gYXZvaWRzIHBvc3NpYmxlIHVuZGVyZmxvdwoJCQkJCSRnID0gKCRnIC8gJHRoaXMtPm9ydFskbV0pIC8gJHRoaXMtPkhbJG1dWyRtLTFdOwoJCQkJCWZvciAoJGkgPSAkbTsgJGkgPD0gJGhpZ2g7ICsrJGkpIHsKCQkJCQkJJHRoaXMtPlZbJGldWyRqXSArPSAkZyAqICR0aGlzLT5vcnRbJGldOwoJCQkJCX0KCQkJCX0KCQkJfQoJCX0KCX0KCgoJLyoqCgkgKglQZXJmb3JtcyBjb21wbGV4IGRpdmlzaW9uLgoJICoKCSAqCUBhY2Nlc3MgcHJpdmF0ZQoJICovCglwcml2YXRlIGZ1bmN0aW9uIGNkaXYoJHhyLCAkeGksICR5ciwgJHlpKSB7CgkJaWYgKGFicygkeXIpID4gYWJzKCR5aSkpIHsKCQkJJHIgPSAkeWkgLyAkeXI7CgkJCSRkID0gJHlyICsgJHIgKiAkeWk7CgkJCSR0aGlzLT5jZGl2ciA9ICgkeHIgKyAkciAqICR4aSkgLyAkZDsKCQkJJHRoaXMtPmNkaXZpID0gKCR4aSAtICRyICogJHhyKSAvICRkOwoJCX0gZWxzZSB7CgkJCSRyID0gJHlyIC8gJHlpOwoJCQkkZCA9ICR5aSArICRyICogJHlyOwoJCQkkdGhpcy0+Y2RpdnIgPSAoJHIgKiAkeHIgKyAkeGkpIC8gJGQ7CgkJCSR0aGlzLT5jZGl2aSA9ICgkciAqICR4aSAtICR4cikgLyAkZDsKCQl9Cgl9CgoKCS8qKgoJICoJTm9uc3ltbWV0cmljIHJlZHVjdGlvbiBmcm9tIEhlc3NlbmJlcmcgdG8gcmVhbCBTY2h1ciBmb3JtLgoJICoKCSAqCUNvZGUgaXMgZGVyaXZlZCBmcm9tIHRoZSBBbGdvbCBwcm9jZWR1cmUgaHFyMiwKCSAqCWJ5IE1hcnRpbiBhbmQgV2lsa2luc29uLCBIYW5kYm9vayBmb3IgQXV0by4gQ29tcC4sCgkgKglWb2wuaWktTGluZWFyIEFsZ2VicmEsIGFuZCB0aGUgY29ycmVzcG9uZGluZwoJICoJRm9ydHJhbiBzdWJyb3V0aW5lIGluIEVJU1BBQ0suCgkgKgoJICoJQGFjY2VzcyBwcml2YXRlCgkgKi8KCXByaXZhdGUgZnVuY3Rpb24gaHFyMiAoKSB7CgkJLy8gIEluaXRpYWxpemUKCQkkbm4gPSAkdGhpcy0+bjsKCQkkbiAgPSAkbm4gLSAxOwoJCSRsb3cgPSAwOwoJCSRoaWdoID0gJG5uIC0gMTsKCQkkZXBzID0gcG93KDIuMCwgLTUyLjApOwoJCSRleHNoaWZ0ID0gMC4wOwoJCSRwID0gJHEgPSAkciA9ICRzID0gJHogPSAwOwoJCS8vIFN0b3JlIHJvb3RzIGlzb2xhdGVkIGJ5IGJhbGFuYyBhbmQgY29tcHV0ZSBtYXRyaXggbm9ybQoJCSRub3JtID0gMC4wOwoKCQlmb3IgKCRpID0gMDsgJGkgPCAkbm47ICsrJGkpIHsKCQkJaWYgKCgkaSA8ICRsb3cpIE9SICgkaSA+ICRoaWdoKSkgewoJCQkJJHRoaXMtPmRbJGldID0gJHRoaXMtPkhbJGldWyRpXTsKCQkJCSR0aGlzLT5lWyRpXSA9IDAuMDsKCQkJfQoJCQlmb3IgKCRqID0gbWF4KCRpLTEsIDApOyAkaiA8ICRubjsgKyskaikgewoJCQkJJG5vcm0gPSAkbm9ybSArIGFicygkdGhpcy0+SFskaV1bJGpdKTsKCQkJfQoJCX0KCgkJLy8gT3V0ZXIgbG9vcCBvdmVyIGVpZ2VudmFsdWUgaW5kZXgKCQkkaXRlciA9IDA7CgkJd2hpbGUgKCRuID49ICRsb3cpIHsKCQkJLy8gTG9vayBmb3Igc2luZ2xlIHNtYWxsIHN1Yi1kaWFnb25hbCBlbGVtZW50CgkJCSRsID0gJG47CgkJCXdoaWxlICgkbCA+ICRsb3cpIHsKCQkJCSRzID0gYWJzKCR0aGlzLT5IWyRsLTFdWyRsLTFdKSArIGFicygkdGhpcy0+SFskbF1bJGxdKTsKCQkJCWlmICgkcyA9PSAwLjApIHsKCQkJCQkkcyA9ICRub3JtOwoJCQkJfQoJCQkJaWYgKGFicygkdGhpcy0+SFskbF1bJGwtMV0pIDwgJGVwcyAqICRzKSB7CgkJCQkJYnJlYWs7CgkJCQl9CgkJCQktLSRsOwoJCQl9CgkJCS8vIENoZWNrIGZvciBjb252ZXJnZW5jZQoJCQkvLyBPbmUgcm9vdCBmb3VuZAoJCQlpZiAoJGwgPT0gJG4pIHsKCQkJCSR0aGlzLT5IWyRuXVskbl0gPSAkdGhpcy0+SFskbl1bJG5dICsgJGV4c2hpZnQ7CgkJCQkkdGhpcy0+ZFskbl0gPSAkdGhpcy0+SFskbl1bJG5dOwoJCQkJJHRoaXMtPmVbJG5dID0gMC4wOwoJCQkJLS0kbjsKCQkJCSRpdGVyID0gMDsKCQkJLy8gVHdvIHJvb3RzIGZvdW5kCgkJCX0gZWxzZSBpZiAoJGwgPT0gJG4tMSkgewoJCQkJJHcgPSAkdGhpcy0+SFskbl1bJG4tMV0gKiAkdGhpcy0+SFskbi0xXVskbl07CgkJCQkkcCA9ICgkdGhpcy0+SFskbi0xXVskbi0xXSAtICR0aGlzLT5IWyRuXVskbl0pIC8gMi4wOwoJCQkJJHEgPSAkcCAqICRwICsgJHc7CgkJCQkkeiA9IHNxcnQoYWJzKCRxKSk7CgkJCQkkdGhpcy0+SFskbl1bJG5dID0gJHRoaXMtPkhbJG5dWyRuXSArICRleHNoaWZ0OwoJCQkJJHRoaXMtPkhbJG4tMV1bJG4tMV0gPSAkdGhpcy0+SFskbi0xXVskbi0xXSArICRleHNoaWZ0OwoJCQkJJHggPSAkdGhpcy0+SFskbl1bJG5dOwoJCQkJLy8gUmVhbCBwYWlyCgkJCQlpZiAoJHEgPj0gMCkgewoJCQkJCWlmICgkcCA+PSAwKSB7CgkJCQkJCSR6ID0gJHAgKyAkejsKCQkJCQl9IGVsc2UgewoJCQkJCQkkeiA9ICRwIC0gJHo7CgkJCQkJfQoJCQkJCSR0aGlzLT5kWyRuLTFdID0gJHggKyAkejsKCQkJCQkkdGhpcy0+ZFskbl0gPSAkdGhpcy0+ZFskbi0xXTsKCQkJCQlpZiAoJHogIT0gMC4wKSB7CgkJCQkJCSR0aGlzLT5kWyRuXSA9ICR4IC0gJHcgLyAkejsKCQkJCQl9CgkJCQkJJHRoaXMtPmVbJG4tMV0gPSAwLjA7CgkJCQkJJHRoaXMtPmVbJG5dID0gMC4wOwoJCQkJCSR4ID0gJHRoaXMtPkhbJG5dWyRuLTFdOwoJCQkJCSRzID0gYWJzKCR4KSArIGFicygkeik7CgkJCQkJJHAgPSAkeCAvICRzOwoJCQkJCSRxID0gJHogLyAkczsKCQkJCQkkciA9IHNxcnQoJHAgKiAkcCArICRxICogJHEpOwoJCQkJCSRwID0gJHAgLyAkcjsKCQkJCQkkcSA9ICRxIC8gJHI7CgkJCQkJLy8gUm93IG1vZGlmaWNhdGlvbgoJCQkJCWZvciAoJGogPSAkbi0xOyAkaiA8ICRubjsgKyskaikgewoJCQkJCQkkeiA9ICR0aGlzLT5IWyRuLTFdWyRqXTsKCQkJCQkJJHRoaXMtPkhbJG4tMV1bJGpdID0gJHEgKiAkeiArICRwICogJHRoaXMtPkhbJG5dWyRqXTsKCQkJCQkJJHRoaXMtPkhbJG5dWyRqXSA9ICRxICogJHRoaXMtPkhbJG5dWyRqXSAtICRwICogJHo7CgkJCQkJfQoJCQkJCS8vIENvbHVtbiBtb2RpZmljYXRpb24KCQkJCQlmb3IgKCRpID0gMDsgJGkgPD0gbjsgKyskaSkgewoJCQkJCQkkeiA9ICR0aGlzLT5IWyRpXVskbi0xXTsKCQkJCQkJJHRoaXMtPkhbJGldWyRuLTFdID0gJHEgKiAkeiArICRwICogJHRoaXMtPkhbJGldWyRuXTsKCQkJCQkJJHRoaXMtPkhbJGldWyRuXSA9ICRxICogJHRoaXMtPkhbJGldWyRuXSAtICRwICogJHo7CgkJCQkJfQoJCQkJCS8vIEFjY3VtdWxhdGUgdHJhbnNmb3JtYXRpb25zCgkJCQkJZm9yICgkaSA9ICRsb3c7ICRpIDw9ICRoaWdoOyArKyRpKSB7CgkJCQkJCSR6ID0gJHRoaXMtPlZbJGldWyRuLTFdOwoJCQkJCQkkdGhpcy0+VlskaV1bJG4tMV0gPSAkcSAqICR6ICsgJHAgKiAkdGhpcy0+VlskaV1bJG5dOwoJCQkJCQkkdGhpcy0+VlskaV1bJG5dID0gJHEgKiAkdGhpcy0+VlskaV1bJG5dIC0gJHAgKiAkejsKCQkJCQl9CgkJCQkvLyBDb21wbGV4IHBhaXIKCQkJCX0gZWxzZSB7CgkJCQkJJHRoaXMtPmRbJG4tMV0gPSAkeCArICRwOwoJCQkJCSR0aGlzLT5kWyRuXSA9ICR4ICsgJHA7CgkJCQkJJHRoaXMtPmVbJG4tMV0gPSAkejsKCQkJCQkkdGhpcy0+ZVskbl0gPSAtJHo7CgkJCQl9CgkJCQkkbiA9ICRuIC0gMjsKCQkJCSRpdGVyID0gMDsKCQkJLy8gTm8gY29udmVyZ2VuY2UgeWV0CgkJCX0gZWxzZSB7CgkJCQkvLyBGb3JtIHNoaWZ0CgkJCQkkeCA9ICR0aGlzLT5IWyRuXVskbl07CgkJCQkkeSA9IDAuMDsKCQkJCSR3ID0gMC4wOwoJCQkJaWYgKCRsIDwgJG4pIHsKCQkJCQkkeSA9ICR0aGlzLT5IWyRuLTFdWyRuLTFdOwoJCQkJCSR3ID0gJHRoaXMtPkhbJG5dWyRuLTFdICogJHRoaXMtPkhbJG4tMV1bJG5dOwoJCQkJfQoJCQkJLy8gV2lsa2luc29uJ3Mgb3JpZ2luYWwgYWQgaG9jIHNoaWZ0CgkJCQlpZiAoJGl0ZXIgPT0gMTApIHsKCQkJCQkkZXhzaGlmdCArPSAkeDsKCQkJCQlmb3IgKCRpID0gJGxvdzsgJGkgPD0gJG47ICsrJGkpIHsKCQkJCQkJJHRoaXMtPkhbJGldWyRpXSAtPSAkeDsKCQkJCQl9CgkJCQkJJHMgPSBhYnMoJHRoaXMtPkhbJG5dWyRuLTFdKSArIGFicygkdGhpcy0+SFskbi0xXVskbi0yXSk7CgkJCQkJJHggPSAkeSA9IDAuNzUgKiAkczsKCQkJCQkkdyA9IC0wLjQzNzUgKiAkcyAqICRzOwoJCQkJfQoJCQkJLy8gTUFUTEFCJ3MgbmV3IGFkIGhvYyBzaGlmdAoJCQkJaWYgKCRpdGVyID09IDMwKSB7CgkJCQkJJHMgPSAoJHkgLSAkeCkgLyAyLjA7CgkJCQkJJHMgPSAkcyAqICRzICsgJHc7CgkJCQkJaWYgKCRzID4gMCkgewoJCQkJCQkkcyA9IHNxcnQoJHMpOwoJCQkJCQlpZiAoJHkgPCAkeCkgewoJCQkJCQkJJHMgPSAtJHM7CgkJCQkJCX0KCQkJCQkJJHMgPSAkeCAtICR3IC8gKCgkeSAtICR4KSAvIDIuMCArICRzKTsKCQkJCQkJZm9yICgkaSA9ICRsb3c7ICRpIDw9ICRuOyArKyRpKSB7CgkJCQkJCQkkdGhpcy0+SFskaV1bJGldIC09ICRzOwoJCQkJCQl9CgkJCQkJCSRleHNoaWZ0ICs9ICRzOwoJCQkJCQkkeCA9ICR5ID0gJHcgPSAwLjk2NDsKCQkJCQl9CgkJCQl9CgkJCQkvLyBDb3VsZCBjaGVjayBpdGVyYXRpb24gY291bnQgaGVyZS4KCQkJCSRpdGVyID0gJGl0ZXIgKyAxOwoJCQkJLy8gTG9vayBmb3IgdHdvIGNvbnNlY3V0aXZlIHNtYWxsIHN1Yi1kaWFnb25hbCBlbGVtZW50cwoJCQkJJG0gPSAkbiAtIDI7CgkJCQl3aGlsZSAoJG0gPj0gJGwpIHsKCQkJCQkkeiA9ICR0aGlzLT5IWyRtXVskbV07CgkJCQkJJHIgPSAkeCAtICR6OwoJCQkJCSRzID0gJHkgLSAkejsKCQkJCQkkcCA9ICgkciAqICRzIC0gJHcpIC8gJHRoaXMtPkhbJG0rMV1bJG1dICsgJHRoaXMtPkhbJG1dWyRtKzFdOwoJCQkJCSRxID0gJHRoaXMtPkhbJG0rMV1bJG0rMV0gLSAkeiAtICRyIC0gJHM7CgkJCQkJJHIgPSAkdGhpcy0+SFskbSsyXVskbSsxXTsKCQkJCQkkcyA9IGFicygkcCkgKyBhYnMoJHEpICsgYWJzKCRyKTsKCQkJCQkkcCA9ICRwIC8gJHM7CgkJCQkJJHEgPSAkcSAvICRzOwoJCQkJCSRyID0gJHIgLyAkczsKCQkJCQlpZiAoJG0gPT0gJGwpIHsKCQkJCQkJYnJlYWs7CgkJCQkJfQoJCQkJCWlmIChhYnMoJHRoaXMtPkhbJG1dWyRtLTFdKSAqIChhYnMoJHEpICsgYWJzKCRyKSkgPAoJCQkJCQkkZXBzICogKGFicygkcCkgKiAoYWJzKCR0aGlzLT5IWyRtLTFdWyRtLTFdKSArIGFicygkeikgKyBhYnMoJHRoaXMtPkhbJG0rMV1bJG0rMV0pKSkpIHsKCQkJCQkJYnJlYWs7CgkJCQkJfQoJCQkJCS0tJG07CgkJCQl9CgkJCQlmb3IgKCRpID0gJG0gKyAyOyAkaSA8PSAkbjsgKyskaSkgewoJCQkJCSR0aGlzLT5IWyRpXVskaS0yXSA9IDAuMDsKCQkJCQlpZiAoJGkgPiAkbSsyKSB7CgkJCQkJCSR0aGlzLT5IWyRpXVskaS0zXSA9IDAuMDsKCQkJCQl9CgkJCQl9CgkJCQkvLyBEb3VibGUgUVIgc3RlcCBpbnZvbHZpbmcgcm93cyBsOm4gYW5kIGNvbHVtbnMgbTpuCgkJCQlmb3IgKCRrID0gJG07ICRrIDw9ICRuLTE7ICsrJGspIHsKCQkJCQkkbm90bGFzdCA9ICgkayAhPSAkbi0xKTsKCQkJCQlpZiAoJGsgIT0gJG0pIHsKCQkJCQkJJHAgPSAkdGhpcy0+SFska11bJGstMV07CgkJCQkJCSRxID0gJHRoaXMtPkhbJGsrMV1bJGstMV07CgkJCQkJCSRyID0gKCRub3RsYXN0ID8gJHRoaXMtPkhbJGsrMl1bJGstMV0gOiAwLjApOwoJCQkJCQkkeCA9IGFicygkcCkgKyBhYnMoJHEpICsgYWJzKCRyKTsKCQkJCQkJaWYgKCR4ICE9IDAuMCkgewoJCQkJCQkJJHAgPSAkcCAvICR4OwoJCQkJCQkJJHEgPSAkcSAvICR4OwoJCQkJCQkJJHIgPSAkciAvICR4OwoJCQkJCQl9CgkJCQkJfQoJCQkJCWlmICgkeCA9PSAwLjApIHsKCQkJCQkJYnJlYWs7CgkJCQkJfQoJCQkJCSRzID0gc3FydCgkcCAqICRwICsgJHEgKiAkcSArICRyICogJHIpOwoJCQkJCWlmICgkcCA8IDApIHsKCQkJCQkJJHMgPSAtJHM7CgkJCQkJfQoJCQkJCWlmICgkcyAhPSAwKSB7CgkJCQkJCWlmICgkayAhPSAkbSkgewoJCQkJCQkJJHRoaXMtPkhbJGtdWyRrLTFdID0gLSRzICogJHg7CgkJCQkJCX0gZWxzZWlmICgkbCAhPSAkbSkgewoJCQkJCQkJJHRoaXMtPkhbJGtdWyRrLTFdID0gLSR0aGlzLT5IWyRrXVskay0xXTsKCQkJCQkJfQoJCQkJCQkkcCA9ICRwICsgJHM7CgkJCQkJCSR4ID0gJHAgLyAkczsKCQkJCQkJJHkgPSAkcSAvICRzOwoJCQkJCQkkeiA9ICRyIC8gJHM7CgkJCQkJCSRxID0gJHEgLyAkcDsKCQkJCQkJJHIgPSAkciAvICRwOwoJCQkJCQkvLyBSb3cgbW9kaWZpY2F0aW9uCgkJCQkJCWZvciAoJGogPSAkazsgJGogPCAkbm47ICsrJGopIHsKCQkJCQkJCSRwID0gJHRoaXMtPkhbJGtdWyRqXSArICRxICogJHRoaXMtPkhbJGsrMV1bJGpdOwoJCQkJCQkJaWYgKCRub3RsYXN0KSB7CgkJCQkJCQkJJHAgPSAkcCArICRyICogJHRoaXMtPkhbJGsrMl1bJGpdOwoJCQkJCQkJCSR0aGlzLT5IWyRrKzJdWyRqXSA9ICR0aGlzLT5IWyRrKzJdWyRqXSAtICRwICogJHo7CgkJCQkJCQl9CgkJCQkJCQkkdGhpcy0+SFska11bJGpdID0gJHRoaXMtPkhbJGtdWyRqXSAtICRwICogJHg7CgkJCQkJCQkkdGhpcy0+SFskaysxXVskal0gPSAkdGhpcy0+SFskaysxXVskal0gLSAkcCAqICR5OwoJCQkJCQl9CgkJCQkJCS8vIENvbHVtbiBtb2RpZmljYXRpb24KCQkJCQkJZm9yICgkaSA9IDA7ICRpIDw9IG1pbigkbiwgJGsrMyk7ICsrJGkpIHsKCQkJCQkJCSRwID0gJHggKiAkdGhpcy0+SFskaV1bJGtdICsgJHkgKiAkdGhpcy0+SFskaV1bJGsrMV07CgkJCQkJCQlpZiAoJG5vdGxhc3QpIHsKCQkJCQkJCQkkcCA9ICRwICsgJHogKiAkdGhpcy0+SFskaV1bJGsrMl07CgkJCQkJCQkJJHRoaXMtPkhbJGldWyRrKzJdID0gJHRoaXMtPkhbJGldWyRrKzJdIC0gJHAgKiAkcjsKCQkJCQkJCX0KCQkJCQkJCSR0aGlzLT5IWyRpXVska10gPSAkdGhpcy0+SFskaV1bJGtdIC0gJHA7CgkJCQkJCQkkdGhpcy0+SFskaV1bJGsrMV0gPSAkdGhpcy0+SFskaV1bJGsrMV0gLSAkcCAqICRxOwoJCQkJCQl9CgkJCQkJCS8vIEFjY3VtdWxhdGUgdHJhbnNmb3JtYXRpb25zCgkJCQkJCWZvciAoJGkgPSAkbG93OyAkaSA8PSAkaGlnaDsgKyskaSkgewoJCQkJCQkJJHAgPSAkeCAqICR0aGlzLT5WWyRpXVska10gKyAkeSAqICR0aGlzLT5WWyRpXVskaysxXTsKCQkJCQkJCWlmICgkbm90bGFzdCkgewoJCQkJCQkJCSRwID0gJHAgKyAkeiAqICR0aGlzLT5WWyRpXVskaysyXTsKCQkJCQkJCQkkdGhpcy0+VlskaV1bJGsrMl0gPSAkdGhpcy0+VlskaV1bJGsrMl0gLSAkcCAqICRyOwoJCQkJCQkJfQoJCQkJCQkJJHRoaXMtPlZbJGldWyRrXSA9ICR0aGlzLT5WWyRpXVska10gLSAkcDsKCQkJCQkJCSR0aGlzLT5WWyRpXVskaysxXSA9ICR0aGlzLT5WWyRpXVskaysxXSAtICRwICogJHE7CgkJCQkJCX0KCQkJCQl9ICAvLyAoJHMgIT0gMCkKCQkJCX0gIC8vIGsgbG9vcAoJCQl9ICAvLyBjaGVjayBjb252ZXJnZW5jZQoJCX0gIC8vIHdoaWxlICgkbiA+PSAkbG93KQoKCQkvLyBCYWNrc3Vic3RpdHV0ZSB0byBmaW5kIHZlY3RvcnMgb2YgdXBwZXIgdHJpYW5ndWxhciBmb3JtCgkJaWYgKCRub3JtID09IDAuMCkgewoJCQlyZXR1cm47CgkJfQoKCQlmb3IgKCRuID0gJG5uLTE7ICRuID49IDA7IC0tJG4pIHsKCQkJJHAgPSAkdGhpcy0+ZFskbl07CgkJCSRxID0gJHRoaXMtPmVbJG5dOwoJCQkvLyBSZWFsIHZlY3RvcgoJCQlpZiAoJHEgPT0gMCkgewoJCQkJJGwgPSAkbjsKCQkJCSR0aGlzLT5IWyRuXVskbl0gPSAxLjA7CgkJCQlmb3IgKCRpID0gJG4tMTsgJGkgPj0gMDsgLS0kaSkgewoJCQkJCSR3ID0gJHRoaXMtPkhbJGldWyRpXSAtICRwOwoJCQkJCSRyID0gMC4wOwoJCQkJCWZvciAoJGogPSAkbDsgJGogPD0gJG47ICsrJGopIHsKCQkJCQkJJHIgPSAkciArICR0aGlzLT5IWyRpXVskal0gKiAkdGhpcy0+SFskal1bJG5dOwoJCQkJCX0KCQkJCQlpZiAoJHRoaXMtPmVbJGldIDwgMC4wKSB7CgkJCQkJCSR6ID0gJHc7CgkJCQkJCSRzID0gJHI7CgkJCQkJfSBlbHNlIHsKCQkJCQkJJGwgPSAkaTsKCQkJCQkJaWYgKCR0aGlzLT5lWyRpXSA9PSAwLjApIHsKCQkJCQkJCWlmICgkdyAhPSAwLjApIHsKCQkJCQkJCQkkdGhpcy0+SFskaV1bJG5dID0gLSRyIC8gJHc7CgkJCQkJCQl9IGVsc2UgewoJCQkJCQkJCSR0aGlzLT5IWyRpXVskbl0gPSAtJHIgLyAoJGVwcyAqICRub3JtKTsKCQkJCQkJCX0KCQkJCQkJLy8gU29sdmUgcmVhbCBlcXVhdGlvbnMKCQkJCQkJfSBlbHNlIHsKCQkJCQkJCSR4ID0gJHRoaXMtPkhbJGldWyRpKzFdOwoJCQkJCQkJJHkgPSAkdGhpcy0+SFskaSsxXVskaV07CgkJCQkJCQkkcSA9ICgkdGhpcy0+ZFskaV0gLSAkcCkgKiAoJHRoaXMtPmRbJGldIC0gJHApICsgJHRoaXMtPmVbJGldICogJHRoaXMtPmVbJGldOwoJCQkJCQkJJHQgPSAoJHggKiAkcyAtICR6ICogJHIpIC8gJHE7CgkJCQkJCQkkdGhpcy0+SFskaV1bJG5dID0gJHQ7CgkJCQkJCQlpZiAoYWJzKCR4KSA+IGFicygkeikpIHsKCQkJCQkJCQkkdGhpcy0+SFskaSsxXVskbl0gPSAoLSRyIC0gJHcgKiAkdCkgLyAkeDsKCQkJCQkJCX0gZWxzZSB7CgkJCQkJCQkJJHRoaXMtPkhbJGkrMV1bJG5dID0gKC0kcyAtICR5ICogJHQpIC8gJHo7CgkJCQkJCQl9CgkJCQkJCX0KCQkJCQkJLy8gT3ZlcmZsb3cgY29udHJvbAoJCQkJCQkkdCA9IGFicygkdGhpcy0+SFskaV1bJG5dKTsKCQkJCQkJaWYgKCgkZXBzICogJHQpICogJHQgPiAxKSB7CgkJCQkJCQlmb3IgKCRqID0gJGk7ICRqIDw9ICRuOyArKyRqKSB7CgkJCQkJCQkJJHRoaXMtPkhbJGpdWyRuXSA9ICR0aGlzLT5IWyRqXVskbl0gLyAkdDsKCQkJCQkJCX0KCQkJCQkJfQoJCQkJCX0KCQkJCX0KCQkJLy8gQ29tcGxleCB2ZWN0b3IKCQkJfSBlbHNlIGlmICgkcSA8IDApIHsKCQkJCSRsID0gJG4tMTsKCQkJCS8vIExhc3QgdmVjdG9yIGNvbXBvbmVudCBpbWFnaW5hcnkgc28gbWF0cml4IGlzIHRyaWFuZ3VsYXIKCQkJCWlmIChhYnMoJHRoaXMtPkhbJG5dWyRuLTFdKSA+IGFicygkdGhpcy0+SFskbi0xXVskbl0pKSB7CgkJCQkJJHRoaXMtPkhbJG4tMV1bJG4tMV0gPSAkcSAvICR0aGlzLT5IWyRuXVskbi0xXTsKCQkJCQkkdGhpcy0+SFskbi0xXVskbl0gPSAtKCR0aGlzLT5IWyRuXVskbl0gLSAkcCkgLyAkdGhpcy0+SFskbl1bJG4tMV07CgkJCQl9IGVsc2UgewoJCQkJCSR0aGlzLT5jZGl2KDAuMCwgLSR0aGlzLT5IWyRuLTFdWyRuXSwgJHRoaXMtPkhbJG4tMV1bJG4tMV0gLSAkcCwgJHEpOwoJCQkJCSR0aGlzLT5IWyRuLTFdWyRuLTFdID0gJHRoaXMtPmNkaXZyOwoJCQkJCSR0aGlzLT5IWyRuLTFdWyRuXSAgID0gJHRoaXMtPmNkaXZpOwoJCQkJfQoJCQkJJHRoaXMtPkhbJG5dWyRuLTFdID0gMC4wOwoJCQkJJHRoaXMtPkhbJG5dWyRuXSA9IDEuMDsKCQkJCWZvciAoJGkgPSAkbi0yOyAkaSA+PSAwOyAtLSRpKSB7CgkJCQkJLy8gZG91YmxlIHJhLHNhLHZyLHZpOwoJCQkJCSRyYSA9IDAuMDsKCQkJCQkkc2EgPSAwLjA7CgkJCQkJZm9yICgkaiA9ICRsOyAkaiA8PSAkbjsgKyskaikgewoJCQkJCQkkcmEgPSAkcmEgKyAkdGhpcy0+SFskaV1bJGpdICogJHRoaXMtPkhbJGpdWyRuLTFdOwoJCQkJCQkkc2EgPSAkc2EgKyAkdGhpcy0+SFskaV1bJGpdICogJHRoaXMtPkhbJGpdWyRuXTsKCQkJCQl9CgkJCQkJJHcgPSAkdGhpcy0+SFskaV1bJGldIC0gJHA7CgkJCQkJaWYgKCR0aGlzLT5lWyRpXSA8IDAuMCkgewoJCQkJCQkkeiA9ICR3OwoJCQkJCQkkciA9ICRyYTsKCQkJCQkJJHMgPSAkc2E7CgkJCQkJfSBlbHNlIHsKCQkJCQkJJGwgPSAkaTsKCQkJCQkJaWYgKCR0aGlzLT5lWyRpXSA9PSAwKSB7CgkJCQkJCQkkdGhpcy0+Y2RpdigtJHJhLCAtJHNhLCAkdywgJHEpOwoJCQkJCQkJJHRoaXMtPkhbJGldWyRuLTFdID0gJHRoaXMtPmNkaXZyOwoJCQkJCQkJJHRoaXMtPkhbJGldWyRuXSAgID0gJHRoaXMtPmNkaXZpOwoJCQkJCQl9IGVsc2UgewoJCQkJCQkJLy8gU29sdmUgY29tcGxleCBlcXVhdGlvbnMKCQkJCQkJCSR4ID0gJHRoaXMtPkhbJGldWyRpKzFdOwoJCQkJCQkJJHkgPSAkdGhpcy0+SFskaSsxXVskaV07CgkJCQkJCQkkdnIgPSAoJHRoaXMtPmRbJGldIC0gJHApICogKCR0aGlzLT5kWyRpXSAtICRwKSArICR0aGlzLT5lWyRpXSAqICR0aGlzLT5lWyRpXSAtICRxICogJHE7CgkJCQkJCQkkdmkgPSAoJHRoaXMtPmRbJGldIC0gJHApICogMi4wICogJHE7CgkJCQkJCQlpZiAoJHZyID09IDAuMCAmICR2aSA9PSAwLjApIHsKCQkJCQkJCQkkdnIgPSAkZXBzICogJG5vcm0gKiAoYWJzKCR3KSArIGFicygkcSkgKyBhYnMoJHgpICsgYWJzKCR5KSArIGFicygkeikpOwoJCQkJCQkJfQoJCQkJCQkJJHRoaXMtPmNkaXYoJHggKiAkciAtICR6ICogJHJhICsgJHEgKiAkc2EsICR4ICogJHMgLSAkeiAqICRzYSAtICRxICogJHJhLCAkdnIsICR2aSk7CgkJCQkJCQkkdGhpcy0+SFskaV1bJG4tMV0gPSAkdGhpcy0+Y2RpdnI7CgkJCQkJCQkkdGhpcy0+SFskaV1bJG5dICAgPSAkdGhpcy0+Y2Rpdmk7CgkJCQkJCQlpZiAoYWJzKCR4KSA+IChhYnMoJHopICsgYWJzKCRxKSkpIHsKCQkJCQkJCQkkdGhpcy0+SFskaSsxXVskbi0xXSA9ICgtJHJhIC0gJHcgKiAkdGhpcy0+SFskaV1bJG4tMV0gKyAkcSAqICR0aGlzLT5IWyRpXVskbl0pIC8gJHg7CgkJCQkJCQkJJHRoaXMtPkhbJGkrMV1bJG5dID0gKC0kc2EgLSAkdyAqICR0aGlzLT5IWyRpXVskbl0gLSAkcSAqICR0aGlzLT5IWyRpXVskbi0xXSkgLyAkeDsKCQkJCQkJCX0gZWxzZSB7CgkJCQkJCQkJJHRoaXMtPmNkaXYoLSRyIC0gJHkgKiAkdGhpcy0+SFskaV1bJG4tMV0sIC0kcyAtICR5ICogJHRoaXMtPkhbJGldWyRuXSwgJHosICRxKTsKCQkJCQkJCQkkdGhpcy0+SFskaSsxXVskbi0xXSA9ICR0aGlzLT5jZGl2cjsKCQkJCQkJCQkkdGhpcy0+SFskaSsxXVskbl0gICA9ICR0aGlzLT5jZGl2aTsKCQkJCQkJCX0KCQkJCQkJfQoJCQkJCQkvLyBPdmVyZmxvdyBjb250cm9sCgkJCQkJCSR0ID0gbWF4KGFicygkdGhpcy0+SFskaV1bJG4tMV0pLGFicygkdGhpcy0+SFskaV1bJG5dKSk7CgkJCQkJCWlmICgoJGVwcyAqICR0KSAqICR0ID4gMSkgewoJCQkJCQkJZm9yICgkaiA9ICRpOyAkaiA8PSAkbjsgKyskaikgewoJCQkJCQkJCSR0aGlzLT5IWyRqXVskbi0xXSA9ICR0aGlzLT5IWyRqXVskbi0xXSAvICR0OwoJCQkJCQkJCSR0aGlzLT5IWyRqXVskbl0gICA9ICR0aGlzLT5IWyRqXVskbl0gLyAkdDsKCQkJCQkJCX0KCQkJCQkJfQoJCQkJCX0gLy8gZW5kIGVsc2UKCQkJCX0gLy8gZW5kIGZvcgoJCQl9IC8vIGVuZCBlbHNlIGZvciBjb21wbGV4IGNhc2UKCQl9IC8vIGVuZCBmb3IKCgkJLy8gVmVjdG9ycyBvZiBpc29sYXRlZCByb290cwoJCWZvciAoJGkgPSAwOyAkaSA8ICRubjsgKyskaSkgewoJCQlpZiAoJGkgPCAkbG93IHwgJGkgPiAkaGlnaCkgewoJCQkJZm9yICgkaiA9ICRpOyAkaiA8ICRubjsgKyskaikgewoJCQkJCSR0aGlzLT5WWyRpXVskal0gPSAkdGhpcy0+SFskaV1bJGpdOwoJCQkJfQoJCQl9CgkJfQoKCQkvLyBCYWNrIHRyYW5zZm9ybWF0aW9uIHRvIGdldCBlaWdlbnZlY3RvcnMgb2Ygb3JpZ2luYWwgbWF0cml4CgkJZm9yICgkaiA9ICRubi0xOyAkaiA+PSAkbG93OyAtLSRqKSB7CgkJCWZvciAoJGkgPSAkbG93OyAkaSA8PSAkaGlnaDsgKyskaSkgewoJCQkJJHogPSAwLjA7CgkJCQlmb3IgKCRrID0gJGxvdzsgJGsgPD0gbWluKCRqLCRoaWdoKTsgKyskaykgewoJCQkJCSR6ID0gJHogKyAkdGhpcy0+VlskaV1bJGtdICogJHRoaXMtPkhbJGtdWyRqXTsKCQkJCX0KCQkJCSR0aGlzLT5WWyRpXVskal0gPSAkejsKCQkJfQoJCX0KCX0gLy8gZW5kIGhxcjIKCgoJLyoqCgkgKglDb25zdHJ1Y3RvcjogQ2hlY2sgZm9yIHN5bW1ldHJ5LCB0aGVuIGNvbnN0cnVjdCB0aGUgZWlnZW52YWx1ZSBkZWNvbXBvc2l0aW9uCgkgKgoJICoJQGFjY2VzcyBwdWJsaWMKCSAqCUBwYXJhbSBBICBTcXVhcmUgbWF0cml4CgkgKglAcmV0dXJuIFN0cnVjdHVyZSB0byBhY2Nlc3MgRCBhbmQgVi4KCSAqLwoJcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRBcmcpIHsKCQkkdGhpcy0+QSA9ICRBcmctPmdldEFycmF5KCk7CgkJJHRoaXMtPm4gPSAkQXJnLT5nZXRDb2x1bW5EaW1lbnNpb24oKTsKCgkJJGlzc3ltbWV0cmljID0gdHJ1ZTsKCQlmb3IgKCRqID0gMDsgKCRqIDwgJHRoaXMtPm4pICYgJGlzc3ltbWV0cmljOyArKyRqKSB7CgkJCWZvciAoJGkgPSAwOyAoJGkgPCAkdGhpcy0+bikgJiAkaXNzeW1tZXRyaWM7ICsrJGkpIHsKCQkJCSRpc3N5bW1ldHJpYyA9ICgkdGhpcy0+QVskaV1bJGpdID09ICR0aGlzLT5BWyRqXVskaV0pOwoJCQl9CgkJfQoKCQlpZiAoJGlzc3ltbWV0cmljKSB7CgkJCSR0aGlzLT5WID0gJHRoaXMtPkE7CgkJCS8vIFRyaWRpYWdvbmFsaXplLgoJCQkkdGhpcy0+dHJlZDIoKTsKCQkJLy8gRGlhZ29uYWxpemUuCgkJCSR0aGlzLT50cWwyKCk7CgkJfSBlbHNlIHsKCQkJJHRoaXMtPkggPSAkdGhpcy0+QTsKCQkJJHRoaXMtPm9ydCA9IGFycmF5KCk7CgkJCS8vIFJlZHVjZSB0byBIZXNzZW5iZXJnIGZvcm0uCgkJCSR0aGlzLT5vcnRoZXMoKTsKCQkJLy8gUmVkdWNlIEhlc3NlbmJlcmcgdG8gcmVhbCBTY2h1ciBmb3JtLgoJCQkkdGhpcy0+aHFyMigpOwoJCX0KCX0KCgoJLyoqCgkgKglSZXR1cm4gdGhlIGVpZ2VudmVjdG9yIG1hdHJpeAoJICoKCSAqCUBhY2Nlc3MgcHVibGljCgkgKglAcmV0dXJuIFYKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldFYoKSB7CgkJcmV0dXJuIG5ldyBNYXRyaXgoJHRoaXMtPlYsICR0aGlzLT5uLCAkdGhpcy0+bik7Cgl9CgoKCS8qKgoJICoJUmV0dXJuIHRoZSByZWFsIHBhcnRzIG9mIHRoZSBlaWdlbnZhbHVlcwoJICoKCSAqCUBhY2Nlc3MgcHVibGljCgkgKglAcmV0dXJuIHJlYWwoZGlhZyhEKSkKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldFJlYWxFaWdlbnZhbHVlcygpIHsKCQlyZXR1cm4gJHRoaXMtPmQ7Cgl9CgoKCS8qKgoJICoJUmV0dXJuIHRoZSBpbWFnaW5hcnkgcGFydHMgb2YgdGhlIGVpZ2VudmFsdWVzCgkgKgoJICoJQGFjY2VzcyBwdWJsaWMKCSAqCUByZXR1cm4gaW1hZyhkaWFnKEQpKQoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0SW1hZ0VpZ2VudmFsdWVzKCkgewoJCXJldHVybiAkdGhpcy0+ZTsKCX0KCgoJLyoqCgkgKglSZXR1cm4gdGhlIGJsb2NrIGRpYWdvbmFsIGVpZ2VudmFsdWUgbWF0cml4CgkgKgoJICoJQGFjY2VzcyBwdWJsaWMKCSAqCUByZXR1cm4gRAoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0RCgpIHsKCQlmb3IgKCRpID0gMDsgJGkgPCAkdGhpcy0+bjsgKyskaSkgewoJCQkkRFskaV0gPSBhcnJheV9maWxsKDAsICR0aGlzLT5uLCAwLjApOwoJCQkkRFskaV1bJGldID0gJHRoaXMtPmRbJGldOwoJCQlpZiAoJHRoaXMtPmVbJGldID09IDApIHsKCQkJCWNvbnRpbnVlOwoJCQl9CgkJCSRvID0gKCR0aGlzLT5lWyRpXSA+IDApID8gJGkgKyAxIDogJGkgLSAxOwoJCQkkRFskaV1bJG9dID0gJHRoaXMtPmVbJGldOwoJCX0KCQlyZXR1cm4gbmV3IE1hdHJpeCgkRCk7Cgl9Cgp9CS8vCWNsYXNzIEVpZ2VudmFsdWVEZWNvbXBvc2l0aW9uCg==]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Shared/JAMA/examples/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Shared/JAMA/examples/benchmark.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCmVycm9yX3JlcG9ydGluZyhFX0FMTCk7CgovKioKICogQHBhY2thZ2UgSkFNQQogKi8KCnJlcXVpcmVfb25jZSAnLi4vTWF0cml4LnBocCc7CnJlcXVpcmVfb25jZSAnU3RhdHMucGhwJzsKCgovKioKICogRXhhbXBsZSBvZiB1c2Ugb2YgTWF0cml4IENsYXNzLCBmZWF0dXJpbmcgbWFnaWMgc3F1YXJlcy4KICovCmNsYXNzIEJlbmNobWFyayB7CglwdWJsaWMgJHN0YXQ7CgoKCS8qKgoJICogU2ltcGxlIGZ1bmN0aW9uIHRvIHJlcGxpY2F0ZSBQSFAgNSBiZWhhdmlvdXIKCSAqLwoJZnVuY3Rpb24gbWljcm90aW1lX2Zsb2F0KCkgewoJCWxpc3QoJHVzZWMsICRzZWMpID0gZXhwbG9kZSgiICIsIG1pY3JvdGltZSgpKTsKCgkJcmV0dXJuICgoZmxvYXQpJHVzZWMgKyAoZmxvYXQpJHNlYyk7Cgl9CS8vCWZ1bmN0aW9uIG1pY3JvdGltZV9mbG9hdCgpCgoKCWZ1bmN0aW9uIGRpc3BsYXlTdGF0cygkdGltZXMgPSBudWxsKSB7CgkJJHRoaXMtPnN0YXQtPnNldERhdGEoJHRpbWVzKTsKCQkkc3RhdHMgPSAkdGhpcy0+c3RhdC0+Y2FsY0Z1bGwoKTsKCgkJZWNobyAnPHRhYmxlIHN0eWxlPSJtYXJnaW4tbGVmdDozMnB4OyI+JzsKCQllY2hvICc8dHI+PHRkIHN0eWxlPSJ0ZXh0LWFsaWduOnJpZ2h0OyI+PGI+bjo8L2I+PHRkIHN0eWxlPSJ0ZXh0LWFsaWduOnJpZ2h0OyI+JyAuICRzdGF0c1snY291bnQnXSAuICcgPC90ZD48L3RyPic7CgkJZWNobyAnPHRyPjx0ZCBzdHlsZT0idGV4dC1hbGlnbjpyaWdodDsiPjxiPk1lYW46PC9iPjx0ZCBzdHlsZT0idGV4dC1hbGlnbjpyaWdodDsiPicgLiAkc3RhdHNbJ21lYW4nXSAuICcgPC90ZD48L3RyPic7CgkJZWNobyAnPHRyPjx0ZCBzdHlsZT0idGV4dC1hbGlnbjpyaWdodDsiPjxiPk1pbi46PC9iPjx0ZCBzdHlsZT0idGV4dC1hbGlnbjpyaWdodDsiPicgLiAkc3RhdHNbJ21pbiddIC4gJyA8L3RkPjwvdHI+JzsKCQllY2hvICc8dHI+PHRkIHN0eWxlPSJ0ZXh0LWFsaWduOnJpZ2h0OyI+PGI+TWF4Ljo8L2I+PHRkIHN0eWxlPSJ0ZXh0LWFsaWduOnJpZ2h0OyI+JyAuICRzdGF0c1snbWF4J10gLiAnIDwvdGQ+PC90cj4nOwoJCWVjaG8gJzx0cj48dGQgc3R5bGU9InRleHQtYWxpZ246cmlnaHQ7Ij48Yj4mc2lnbWE7OjwvYj48dGQgc3R5bGU9InRleHQtYWxpZ246cmlnaHQ7Ij4nIC4gJHN0YXRzWydzdGRldiddIC4gJyA8L3RkPjwvdHI+JzsKCQllY2hvICc8dHI+PHRkIHN0eWxlPSJ0ZXh0LWFsaWduOnJpZ2h0OyI+PGI+VmFyaWFuY2U6PC9iPjx0ZCBzdHlsZT0idGV4dC1hbGlnbjpyaWdodDsiPicgLiAkc3RhdHNbJ3ZhcmlhbmNlJ10gLiAnIDwvdGQ+PC90cj4nOwoJCWVjaG8gJzx0cj48dGQgc3R5bGU9InRleHQtYWxpZ246cmlnaHQ7Ij48Yj5SYW5nZTo8L2I+PHRkIHN0eWxlPSJ0ZXh0LWFsaWduOnJpZ2h0OyI+JyAuICRzdGF0c1sncmFuZ2UnXSAuICcgPC90ZD48L3RyPic7CgkJZWNobyAnPC90YWJsZT4nOwoKCQlyZXR1cm4gJHN0YXRzOwoJfQkvLwlmdW5jdGlvbiBkaXNwbGF5U3RhdHMoKQoKCglmdW5jdGlvbiBydW5FaWcoJG4gPSA0LCAkdCA9IDEwMCkgewoJCSR0aW1lcyA9IGFycmF5KCk7CgoJCWZvciAoJGkgPSAwOyAkaSA8ICR0OyArKyRpKSB7CgkJCSRNID0gTWF0cml4OjpyYW5kb20oJG4sICRuKTsKCQkJJHN0YXJ0X3RpbWUgPSAkdGhpcy0+bWljcm90aW1lX2Zsb2F0KCk7CgkJCSRFID0gbmV3IEVpZ2VudmFsdWVEZWNvbXBvc2l0aW9uKCRNKTsKCQkJJHN0b3BfdGltZSA9ICR0aGlzLT5taWNyb3RpbWVfZmxvYXQoKTsKCQkJJHRpbWVzW10gPSAkc3RvcF90aW1lIC0gJHN0YXJ0X3RpbWU7CgkJfQoKCQlyZXR1cm4gJHRpbWVzOwoJfQkvLwlmdW5jdGlvbiBydW5FaWcoKQoKCglmdW5jdGlvbiBydW5MVSgkbiA9IDQsICR0ID0gMTAwKSB7CgkJJHRpbWVzID0gYXJyYXkoKTsKCgkJZm9yICgkaSA9IDA7ICRpIDwgJHQ7ICsrJGkpIHsKCQkJJE0gPSBNYXRyaXg6OnJhbmRvbSgkbiwgJG4pOwoJCQkkc3RhcnRfdGltZSA9ICR0aGlzLT5taWNyb3RpbWVfZmxvYXQoKTsKCQkJJEUgPSBuZXcgTFVEZWNvbXBvc2l0aW9uKCRNKTsKCQkJJHN0b3BfdGltZSA9ICR0aGlzLT5taWNyb3RpbWVfZmxvYXQoKTsKCQkJJHRpbWVzW10gPSAkc3RvcF90aW1lIC0gJHN0YXJ0X3RpbWU7CgkJfQoKCQlyZXR1cm4gJHRpbWVzOwoJfQkvLwlmdW5jdGlvbiBydW5MVSgpCgoKCWZ1bmN0aW9uIHJ1blFSKCRuID0gNCwgJHQgPSAxMDApIHsKCQkkdGltZXMgPSBhcnJheSgpOwoKCQlmb3IgKCRpID0gMDsgJGkgPCAkdDsgKyskaSkgewoJCQkkTSA9IE1hdHJpeDo6cmFuZG9tKCRuLCAkbik7CgkJCSRzdGFydF90aW1lID0gJHRoaXMtPm1pY3JvdGltZV9mbG9hdCgpOwoJCQkkRSA9IG5ldyBRUkRlY29tcG9zaXRpb24oJE0pOwoJCQkkc3RvcF90aW1lID0gJHRoaXMtPm1pY3JvdGltZV9mbG9hdCgpOwoJCQkkdGltZXNbXSA9ICRzdG9wX3RpbWUgLSAkc3RhcnRfdGltZTsKCQl9CgoJCXJldHVybiAkdGltZXM7Cgl9CS8vCWZ1bmN0aW9uIHJ1blFSKCkKCgoJZnVuY3Rpb24gcnVuQ2hvbGVza3koJG4gPSA0LCAkdCA9IDEwMCkgewoJCSR0aW1lcyA9IGFycmF5KCk7CgoJCWZvciAoJGkgPSAwOyAkaSA8ICR0OyArKyRpKSB7CgkJCSRNID0gTWF0cml4OjpyYW5kb20oJG4sICRuKTsKCQkJJHN0YXJ0X3RpbWUgPSAkdGhpcy0+bWljcm90aW1lX2Zsb2F0KCk7CgkJCSRFID0gbmV3IENob2xlc2t5RGVjb21wb3NpdGlvbigkTSk7CgkJCSRzdG9wX3RpbWUgPSAkdGhpcy0+bWljcm90aW1lX2Zsb2F0KCk7CgkJCSR0aW1lc1tdID0gJHN0b3BfdGltZSAtICRzdGFydF90aW1lOwoJCX0KCgkJcmV0dXJuICR0aW1lczsKCX0JLy8JZnVuY3Rpb24gcnVuQ2hvbGVza3koKQoKCglmdW5jdGlvbiBydW5TVkQoJG4gPSA0LCAkdCA9IDEwMCkgewoJCSR0aW1lcyA9IGFycmF5KCk7CgoJCWZvciAoJGkgPSAwOyAkaSA8ICR0OyArKyRpKSB7CgkJCSRNID0gTWF0cml4OjpyYW5kb20oJG4sICRuKTsKCQkJJHN0YXJ0X3RpbWUgPSAkdGhpcy0+bWljcm90aW1lX2Zsb2F0KCk7CgkJCSRFID0gbmV3IFNpbmd1bGFyVmFsdWVEZWNvbXBvc2l0aW9uKCRNKTsKCQkJJHN0b3BfdGltZSA9ICR0aGlzLT5taWNyb3RpbWVfZmxvYXQoKTsKCQkJJHRpbWVzW10gPSAkc3RvcF90aW1lIC0gJHN0YXJ0X3RpbWU7CgkJfQoKCQlyZXR1cm4gJHRpbWVzOwoJfQkvLwlmdW5jdGlvbiBydW5TVkQoKQoKCglmdW5jdGlvbiBydW4oKSB7CgkJJG4gPSA4OwoJCSR0ID0gMTY7CgkJJHN1bSA9IDA7CgkJZWNobyAiPGI+Q2hvbGVza3kgZGVjb21wb3NpdGlvbjogJHQgcmFuZG9tIHskbn14eyRufSBtYXRyaWNlczwvYj48YnIgLz4iOwoJCSRyID0gJHRoaXMtPmRpc3BsYXlTdGF0cygkdGhpcy0+cnVuQ2hvbGVza3koJG4sICR0KSk7CgkJJHN1bSArPSAkclsnbWVhbiddICogJG47CgoJCWVjaG8gJzxociAvPic7CgoJCWVjaG8gIjxiPkVpZ2VudmFsdWUgZGVjb21wb3NpdGlvbjogJHQgcmFuZG9tIHskbn14eyRufSBtYXRyaWNlczwvYj48YnIgLz4iOwoJCSRyID0gJHRoaXMtPmRpc3BsYXlTdGF0cygkdGhpcy0+cnVuRWlnKCRuLCAkdCkpOwoJCSRzdW0gKz0gJHJbJ21lYW4nXSAqICRuOwoKCQllY2hvICc8aHIgLz4nOwoKCQllY2hvICI8Yj5MVSBkZWNvbXBvc2l0aW9uOiAkdCByYW5kb20geyRufXh7JG59IG1hdHJpY2VzPC9iPjxiciAvPiI7CgkJJHIgPSAkdGhpcy0+ZGlzcGxheVN0YXRzKCR0aGlzLT5ydW5MVSgkbiwgJHQpKTsKCQkkc3VtICs9ICRyWydtZWFuJ10gKiAkbjsKCgkJZWNobyAnPGhyIC8+JzsKCgkJZWNobyAiPGI+UVIgZGVjb21wb3NpdGlvbjogJHQgcmFuZG9tIHskbn14eyRufSBtYXRyaWNlczwvYj48YnIgLz4iOwoJCSRyID0gJHRoaXMtPmRpc3BsYXlTdGF0cygkdGhpcy0+cnVuUVIoJG4sICR0KSk7CgkJJHN1bSArPSAkclsnbWVhbiddICogJG47CgoJCWVjaG8gJzxociAvPic7CgoJCWVjaG8gIjxiPlNpbmd1bGFyIFZhbHVlIGRlY29tcG9zaXRpb246ICR0IHJhbmRvbSB7JG59eHskbn0gbWF0cmljZXM8L2I+PGJyIC8+IjsKCQkkciA9ICR0aGlzLT5kaXNwbGF5U3RhdHMoJHRoaXMtPnJ1blNWRCgkbiwgJHQpKTsKCQkkc3VtICs9ICRyWydtZWFuJ10gKiAkbjsKCgkJcmV0dXJuICRzdW07Cgl9CS8vCWZ1bmN0aW9uIHJ1bigpCgoKCXB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgpIHsKCQkkdGhpcy0+c3RhdCA9IG5ldyBCYXNlKCk7Cgl9CS8vCWZ1bmN0aW9uIEJlbmNobWFyaygpCgp9ICAvLyBjbGFzcyBCZW5jaG1hcmsJCShlbmQgTWFnaWNTcXVhcmVFeGFtcGxlKQoKCiRiZW5jaG1hcmsgPSBuZXcgQmVuY2htYXJrKCk7Cgpzd2l0Y2goJF9SRVFVRVNUWydkZWNvbXBvc2l0aW9uJ10pIHsKCWNhc2UgJ2Nob2xlc2t5JzoKCQkkbSA9IGFycmF5KCk7CgkJZm9yICgkaSA9IDI7ICRpIDw9IDg7ICRpICo9IDIpIHsKCQkJJHQgPSAzMiAvICRpOwoJCQllY2hvICI8Yj5DaG9sZXNreSBkZWNvbXBvc2l0aW9uOiAkdCByYW5kb20geyRpfXh7JGl9IG1hdHJpY2VzPC9iPjxiciAvPiI7CgkJCSRzID0gJGJlbmNobWFyay0+ZGlzcGxheVN0YXRzKCRiZW5jaG1hcmstPnJ1bkNob2xlc2t5KCRpLCAkdCkpOwoJCQkkbVskaV0gPSAkc1snbWVhbiddOwoJCQllY2hvICI8YnIgLz4iOwoJCX0KCQllY2hvICc8cHJlPic7CgkJZm9yZWFjaCgkbSBhcyAkeCA9PiAkeSkgewoJCQllY2hvICIkeFx0IiAuIDEwMDAqJHkgLiAiXG4iOwoJCX0KCQllY2hvICc8L3ByZT4nOwoJCWJyZWFrOwoJY2FzZSAnZWlnZW52YWx1ZSc6CgkJJG0gPSBhcnJheSgpOwoJCWZvciAoJGkgPSAyOyAkaSA8PSA4OyAkaSAqPSAyKSB7CgkJCSR0ID0gMzIgLyAkaTsKCQkJZWNobyAiPGI+RWlnZW52YWx1ZSBkZWNvbXBvc2l0aW9uOiAkdCByYW5kb20geyRpfXh7JGl9IG1hdHJpY2VzPC9iPjxiciAvPiI7CgkJCSRzID0gJGJlbmNobWFyay0+ZGlzcGxheVN0YXRzKCRiZW5jaG1hcmstPnJ1bkVpZygkaSwgJHQpKTsKCQkJJG1bJGldID0gJHNbJ21lYW4nXTsKCQkJZWNobyAiPGJyIC8+IjsKCQl9CgkJZWNobyAnPHByZT4nOwoJCWZvcmVhY2goJG0gYXMgJHggPT4gJHkpIHsKCQkJZWNobyAiJHhcdCIgLiAxMDAwKiR5IC4gIlxuIjsKCQl9CgkJZWNobyAnPC9wcmU+JzsKCQlicmVhazsKCWNhc2UgJ2x1JzoKCQkkbSA9IGFycmF5KCk7CgkJZm9yICgkaSA9IDI7ICRpIDw9IDg7ICRpICo9IDIpIHsKCQkJJHQgPSAzMiAvICRpOwoJCQllY2hvICI8Yj5MVSBkZWNvbXBvc2l0aW9uOiAkdCByYW5kb20geyRpfXh7JGl9IG1hdHJpY2VzPC9iPjxiciAvPiI7CgkJCSRzID0gJGJlbmNobWFyay0+ZGlzcGxheVN0YXRzKCRiZW5jaG1hcmstPnJ1bkxVKCRpLCAkdCkpOwoJCQkkbVskaV0gPSAkc1snbWVhbiddOwoJCQllY2hvICI8YnIgLz4iOwoJCX0KCQllY2hvICc8cHJlPic7CgkJZm9yZWFjaCgkbSBhcyAkeCA9PiAkeSkgewoJCQllY2hvICIkeFx0IiAuIDEwMDAqJHkgLiAiXG4iOwoJCX0KCQllY2hvICc8L3ByZT4nOwoJCWJyZWFrOwoJY2FzZSAncXInOgoJCSRtID0gYXJyYXkoKTsKCQlmb3IgKCRpID0gMjsgJGkgPD0gODsgJGkgKj0gMikgewoJCQkkdCA9IDMyIC8gJGk7CgkJCWVjaG8gIjxiPlFSIGRlY29tcG9zaXRpb246ICR0IHJhbmRvbSB7JGl9eHskaX0gbWF0cmljZXM8L2I+PGJyIC8+IjsKCQkJJHMgPSAkYmVuY2htYXJrLT5kaXNwbGF5U3RhdHMoJGJlbmNobWFyay0+cnVuUVIoJGksICR0KSk7CgkJCSRtWyRpXSA9ICRzWydtZWFuJ107CgkJCWVjaG8gIjxiciAvPiI7CgkJfQoJCWVjaG8gJzxwcmU+JzsKCQlmb3JlYWNoKCRtIGFzICR4ID0+ICR5KSB7CgkJCWVjaG8gIiR4XHQiIC4gMTAwMCokeSAuICJcbiI7CgkJfQoJCWVjaG8gJzwvcHJlPic7CgkJYnJlYWs7CgljYXNlICdzdmQnOgoJCSRtID0gYXJyYXkoKTsKCQlmb3IoJGkgPSAyOyAkaSA8PSA4OyAkaSAqPSAyKSB7CgkJCSR0ID0gMzIgLyAkaTsKCQkJZWNobyAiPGI+U2luZ3VsYXIgdmFsdWUgZGVjb21wb3NpdGlvbjogJHQgcmFuZG9tIHskaX14eyRpfSBtYXRyaWNlczwvYj48YnIgLz4iOwoJCQkkcyA9ICRiZW5jaG1hcmstPmRpc3BsYXlTdGF0cygkYmVuY2htYXJrLT5ydW5TVkQoJGksICR0KSk7CgkJCSRtWyRpXSA9ICRzWydtZWFuJ107CgkJCWVjaG8gIjxiciAvPiI7CgkJfQoJCWVjaG8gJzxwcmU+JzsKCQlmb3JlYWNoKCRtIGFzICR4ID0+ICR5KSB7CgkJCWVjaG8gIiR4XHQiIC4gMTAwMCokeSAuICJcbiI7CgkJfQoJCWVjaG8gJzwvcHJlPic7CgkJYnJlYWs7CgljYXNlICdhbGwnOgoJCSRzID0gJGJlbmNobWFyay0+cnVuKCk7CgkJcHJpbnQoIjxiciAvPjxiPlRvdGFsPGI+OiB7JHN9czxiciAvPiIpOwoJCWJyZWFrOwoJZGVmYXVsdDoKCQk/PgoJCTx1bD4KCQkJPGxpPjxhIGhyZWY9ImJlbmNobWFyay5waHA/ZGVjb21wb3NpdGlvbj1hbGwiPkNvbXBsZXRlIEJlbmNobWFyazwvYT4KCQkJCTx1bD4KCQkJCQk8bGk+PGEgaHJlZj0iYmVuY2htYXJrLnBocD9kZWNvbXBvc2l0aW9uPWNob2xlc2t5Ij5DaG9sZXNreTwvYT48L2xpPgoJCQkJCTxsaT48YSBocmVmPSJiZW5jaG1hcmsucGhwP2RlY29tcG9zaXRpb249ZWlnZW52YWx1ZSI+RWlnZW52YWx1ZTwvYT48L2xpPgoJCQkJCTxsaT48YSBocmVmPSJiZW5jaG1hcmsucGhwP2RlY29tcG9zaXRpb249bHUiPkxVPC9hPjwvbGk+CgkJCQkJPGxpPjxhIGhyZWY9ImJlbmNobWFyay5waHA/ZGVjb21wb3NpdGlvbj1xciI+UVI8L2E+PC9saT4KCQkJCQk8bGk+PGEgaHJlZj0iYmVuY2htYXJrLnBocD9kZWNvbXBvc2l0aW9uPXN2ZCI+U2luZ3VsYXIgVmFsdWU8L2E+PC9saT4KCQkJCTwvdWw+CgkJCTwvbGk+CgkJPC91bD4KCQk8P3BocAoJCWJyZWFrOwp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Shared/JAMA/examples/LagrangeInterpolation.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCnJlcXVpcmVfb25jZSAiLi4vTWF0cml4LnBocCI7CgovKioKICogR2l2ZW4gbiBwb2ludHMgKHgwLHkwKS4uLih4bi0xLHluLTEpLCB0aGUgZm9sbG93aW5nIG1ldGhpZCBjb21wdXRlcwogKiB0aGUgcG9seW5vbWlhbCBmYWN0b3JzIG9mIHRoZSBuLTEndCBkZWdyZWUgcG9seW5vbWlhbCBwYXNzaW5nIHRocm91Z2gKICogdGhlIG4gcG9pbnRzLgogKgogKiBFeGFtcGxlOiBQYXNzaW5nIGluIHRocmVlIHBvaW50cyAoMiwzKSAoMSw0KSBhbmQgKDMsNykgd2lsbCBwcm9kdWNlCiAqIHRoZSByZXN1bHRzIFsyLjUsIC04LjUsIDEwXSB3aGljaCBtZWFucyB0aGF0IHRoZSBwb2ludHMgYXJlIG9uIHRoZQogKiBjdXJ2ZSB5ID0gMi41eMKyIC0gOC41eCArIDEwLgogKgogKiBAc2VlIGh0dHA6Ly9nZW9zb2Z0Lm5vL3NvZnR3YXJlL2xhZ3JhbmdlL0xhZ3JhbmdlSW50ZXJwb2xhdGlvbi5qYXZhLmh0bWwKICogQGF1dGhvciBKYWNvYiBEcmV5ZXIKICogQGF1dGhvciBQYXVsIE1lYWdoZXIgKHBvcnQgdG8gUEhQIGFuZCBtaW5vciBjaGFuZ2VzKQogKgogKiBAcGFyYW0geFtdIGZsb2F0CiAqIEBwYXJhbSB5W10gZmxvYXQKICovCmNsYXNzIExhZ3JhbmdlSW50ZXJwb2xhdGlvbiB7CgoJcHVibGljIGZ1bmN0aW9uIGZpbmRQb2x5bm9taWFsRmFjdG9ycygkeCwgJHkpIHsKCQkkbiA9IGNvdW50KCR4KTsKCgkJJGRhdGEgPSBhcnJheSgpOyAgLy8gZG91YmxlW25dW25dOwoJCSRyaHMgID0gYXJyYXkoKTsgIC8vIGRvdWJsZVtuXTsKCgkJZm9yICgkaSA9IDA7ICRpIDwgJG47ICsrJGkpIHsKCQkJJHYgPSAxOwoJCQlmb3IgKCRqID0gMDsgJGogPCAkbjsgKyskaikgewoJCQkJJGRhdGFbJGldWyRuLSRqLTFdID0gJHY7CgkJCQkkdiAqPSAkeFskaV07CgkJCX0KCQkJJHJoc1skaV0gPSAkeVskaV07CgkJfQoKCQkvLyBTb2x2ZSBtICogcyA9IGIKCQkkbSA9IG5ldyBNYXRyaXgoJGRhdGEpOwoJCSRiID0gbmV3IE1hdHJpeCgkcmhzLCAkbik7CgoJCSRzID0gJG0tPnNvbHZlKCRiKTsKCgkJcmV0dXJuICRzLT5nZXRSb3dQYWNrZWRDb3B5KCk7Cgl9CS8vCWZ1bmN0aW9uIGZpbmRQb2x5bm9taWFsRmFjdG9ycygpCgp9CS8vCWNsYXNzIExhZ3JhbmdlSW50ZXJwb2xhdGlvbgoKCiR4ID0gYXJyYXkoMi4wLCAxLjAsIDMuMCk7CiR5ID0gYXJyYXkoMy4wLCA0LjAsIDcuMCk7CgokbGkgPSBuZXcgTGFncmFuZ2VJbnRlcnBvbGF0aW9uOwokZiA9ICRsaS0+ZmluZFBvbHlub21pYWxGYWN0b3JzKCR4LCAkeSk7CgoKZm9yICgkaSA9IDA7ICRpIDwgMzsgKyskaSkgewoJZWNobyAkZlskaV0uIjxiciAvPiI7Cn0K]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Shared/JAMA/examples/LagrangeInterpolation2.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCnJlcXVpcmVfb25jZSAiLi4vTWF0cml4LnBocCI7CgovKioKICogR2l2ZW4gbiBwb2ludHMgKHgwLHkwKS4uLih4bi0xLHluLTEpLCB0aGUgZm9sbG93aW5nIG1ldGhvZCBjb21wdXRlcwogKiB0aGUgcG9seW5vbWlhbCBmYWN0b3JzIG9mIHRoZSBuLTEndCBkZWdyZWUgcG9seW5vbWlhbCBwYXNzaW5nIHRocm91Z2gKICogdGhlIG4gcG9pbnRzLgogKgogKiBFeGFtcGxlOiBQYXNzaW5nIGluIHRocmVlIHBvaW50cyAoMiwzKSAoMSw0KSBhbmQgKDMsNykgd2lsbCBwcm9kdWNlCiAqIHRoZSByZXN1bHRzIFsyLjUsIC04LjUsIDEwXSB3aGljaCBtZWFucyB0aGF0IHRoZSBwb2ludHMgYXJlIG9uIHRoZQogKiBjdXJ2ZSB5ID0gMi41eMKyIC0gOC41eCArIDEwLgogKgogKiBAc2VlIGh0dHA6Ly9nZW9zb2Z0Lm5vL3NvZnR3YXJlL2xhZ3JhbmdlL0xhZ3JhbmdlSW50ZXJwb2xhdGlvbi5qYXZhLmh0bWwKICogQHNlZSBodHRwOi8vc291cmNlLmZyZWVoZXAub3JnL2pjdnN3ZWIvaWxjL0xDU0lNL3dkdmlldy9sY3NpbS9zcmMvb3JnL2xjc2ltL2ZpdC9wb2x5bm9taWFsL1BvbHlub21pYWxGaXR0ZXIuamF2YQogKiBAYXV0aG9yIEphY29iIERyZXllcgogKiBAYXV0aG9yIFBhdWwgTWVhZ2hlciAocG9ydCB0byBQSFAgYW5kIG1pbm9yIGNoYW5nZXMpCiAqCiAqIEBwYXJhbSB4W10gZmxvYXQKICogQHBhcmFtIHlbXSBmbG9hdAogKi8KY2xhc3MgTGFncmFuZ2VJbnRlcnBvbGF0aW9uIHsKCglwdWJsaWMgZnVuY3Rpb24gZmluZFBvbHlub21pYWxGYWN0b3JzKCR4LCAkeSkgewoJCSRuID0gY291bnQoJHgpOwoKCQkkZGF0YSA9IGFycmF5KCk7ICAvLyBkb3VibGVbbl1bbl07CgkJJHJocyAgPSBhcnJheSgpOyAgLy8gZG91YmxlW25dOwoKCQlmb3IgKCRpID0gMDsgJGkgPCAkbjsgKyskaSkgewoJCQkkdiA9IDE7CgkJCWZvciAoJGogPSAwOyAkaiA8ICRuOyArKyRqKSB7CgkJCQkkZGF0YVskaV1bJG4tJGotMV0gPSAkdjsKCQkJCSR2ICo9ICR4WyRpXTsKCQkJfQoJCQkkcmhzWyRpXSA9ICR5WyRpXTsKCQl9CgoJCS8vIFNvbHZlIG0gKiBzID0gYgoJCSRtID0gbmV3IE1hdHJpeCgkZGF0YSk7CgkJJGIgPSBuZXcgTWF0cml4KCRyaHMsICRuKTsKCgkJJHMgPSAkbS0+c29sdmUoJGIpOwoKCQlyZXR1cm4gJHMtPmdldFJvd1BhY2tlZENvcHkoKTsKCX0JLy8JZnVuY3Rpb24gZmluZFBvbHlub21pYWxGYWN0b3JzKCkKCn0JLy8JY2xhc3MgTGFncmFuZ2VJbnRlcnBvbGF0aW9uCgoKJHggPSBhcnJheSgyLjAsIDEuMCwgMy4wKTsKJHkgPSBhcnJheSgzLjAsIDQuMCwgNy4wKTsKCiRsaSA9IG5ldyBMYWdyYW5nZUludGVycG9sYXRpb247CiRmID0gJGxpLT5maW5kUG9seW5vbWlhbEZhY3RvcnMoJHgsICR5KTsKCmZvciAoJGkgPSAwOyAkaSA8IDM7ICsrJGkpIHsKCWVjaG8gJGZbJGldLiI8YnIgLz4iOwp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Shared/JAMA/examples/LevenbergMarquardt.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8vIExldmVuYmVyZy1NYXJxdWFyZHQgaW4gUEhQCgovLyBodHRwOi8vd3d3LmlkaW9tLmNvbS9+emlsbGEvQ29tcHV0ZXIvSmF2YW51bWVyaWMvTE0uamF2YQoKY2xhc3MgTGV2ZW5iZXJnTWFycXVhcmR0IHsKCgkvKioKCSAqIENhbGN1bGF0ZSB0aGUgY3VycmVudCBzdW0tc3F1YXJlZC1lcnJvcgoJICoKCSAqIENoaS1zcXVhcmVkIGlzIHRoZSBkaXN0cmlidXRpb24gb2Ygc3F1YXJlZCBHYXVzc2lhbiBlcnJvcnMsCgkgKiB0aHVzIHRoZSBuYW1lLgoJICoKCSAqIEBwYXJhbSBkb3VibGVbXVtdICR4CgkgKiBAcGFyYW0gZG91YmxlW10gJGEKCSAqIEBwYXJhbSBkb3VibGVbXSAkeSwKCSAqIEBwYXJhbSBkb3VibGVbXSAkcywKCSAqIEBwYXJhbSBvYmplY3QgJGYKCSAqLwoJZnVuY3Rpb24gY2hpU3F1YXJlZCgkeCwgJGEsICR5LCAkcywgJGYpIHsKCQkkbnB0cyA9IGNvdW50KCR5KTsKCQkkc3VtID0gMC4wOwoKCQlmb3IgKCRpID0gMDsgJGkgPCAkbnB0czsgKyskaSkgewoJCQkkZCA9ICR5WyRpXSAtICRmLT52YWwoJHhbJGldLCAkYSk7CgkJCSRkID0gJGQgLyAkc1skaV07CgkJCSRzdW0gPSAkc3VtICsgKCRkKiRkKTsKCQl9CgoJCXJldHVybiAkc3VtOwoJfQkvLwlmdW5jdGlvbiBjaGlTcXVhcmVkKCkKCgoJLyoqCgkgKiBNaW5pbWl6ZSBFID0gc3VtIHsoeVtrXSAtIGYoeFtrXSxhKSkgLyBzW2tdfV4yCgkgKiBUaGUgaW5kaXZpZHVhbCBlcnJvcnMgYXJlIG9wdGlvbmFsbHkgc2NhbGVkIGJ5IHNba10uCgkgKiBOb3RlIHRoYXQgTE1mdW5jIGltcGxlbWVudHMgdGhlIHZhbHVlIGFuZCBncmFkaWVudCBvZiBmKHgsYSksCgkgKiBOT1QgdGhlIHZhbHVlIGFuZCBncmFkaWVudCBvZiBFIHdpdGggcmVzcGVjdCB0byBhIQoJICoKCSAqIEBwYXJhbSB4IGFycmF5IG9mIGRvbWFpbiBwb2ludHMsIGVhY2ggbWF5IGJlIG11bHRpZGltZW5zaW9uYWwKCSAqIEBwYXJhbSB5IGNvcnJlc3BvbmRpbmcgYXJyYXkgb2YgdmFsdWVzCgkgKiBAcGFyYW0gYSB0aGUgcGFyYW1ldGVycy9zdGF0ZSBvZiB0aGUgbW9kZWwKCSAqIEBwYXJhbSB2YXJ5IGZhbHNlIHRvIGluZGljYXRlIHRoZSBjb3JyZXNwb25kaW5nIGFba10gaXMgdG8gYmUgaGVsZCBmaXhlZAoJICogQHBhcmFtIHMyIHNpZ21hXjIgZm9yIHBvaW50IGkKCSAqIEBwYXJhbSBsYW1iZGEgYmxlbmQgYmV0d2VlbiBzdGVlcGVzdCBkZXNjZW50IChsYW1iZGEgaGlnaCkgYW5kCgkgKglqdW1wIHRvIGJvdHRvbSBvZiBxdWFkcmF0aWMgKGxhbWJkYSB6ZXJvKS4KCSAqIAlTdGFydCB3aXRoIDAuMDAxLgoJICogQHBhcmFtIHRlcm1lcHNpbG9uIHRlcm1pbmF0aW9uIGFjY3VyYWN5ICgwLjAxKQoJICogQHBhcmFtIG1heGl0ZXIJc3RvcCBhbmQgcmV0dXJuIGFmdGVyIHRoaXMgbWFueSBpdGVyYXRpb25zIGlmIG5vdCBkb25lCgkgKiBAcGFyYW0gdmVyYm9zZQlzZXQgdG8gemVybyAobm8gcHJpbnRzKSwgMSwgMgoJICoKCSAqIEByZXR1cm4gdGhlIG5ldyBsYW1iZGEgZm9yIGZ1dHVyZSBpdGVyYXRpb25zLgoJICogIENhbiB1c2UgdGhpcyBhbmQgbWF4aXRlciB0byBpbnRlcmxlYXZlIHRoZSBMTSBkZXNjZW50IHdpdGggc29tZSBvdGhlcgoJICogIHRhc2ssIHNldHRpbmcgbWF4aXRlciB0byBzb21ldGhpbmcgc21hbGwuCgkgKi8KCWZ1bmN0aW9uIHNvbHZlKCR4LCAkYSwgJHksICRzLCAkdmFyeSwgJGYsICRsYW1iZGEsICR0ZXJtZXBzaWxvbiwgJG1heGl0ZXIsICR2ZXJib3NlKSB7CgkJJG5wdHMgPSBjb3VudCgkeSk7CgkJJG5wYXJtID0gY291bnQoJGEpOwoKCQlpZiAoJHZlcmJvc2UgPiAwKSB7CgkJCXByaW50KCJzb2x2ZSB4WyIuY291bnQoJHgpLiJdWyIuY291bnQoJHhbMF0pLiJdIik7CgkJCXByaW50KCIgYVsiLmNvdW50KCRhKS4iXSIpOwoJCQlwcmludGxuKCIgeVsiLmNvdW50KGxlbmd0aCkuIl0iKTsKCQl9CgoJCSRlMCA9ICR0aGlzLT5jaGlTcXVhcmVkKCR4LCAkYSwgJHksICRzLCAkZik7CgoJCS8vZG91YmxlIGxhbWJkYSA9IDAuMDAxOwoJCSRkb25lID0gZmFsc2U7CgoJCS8vIGcgPSBncmFkaWVudCwgSCA9IGhlc3NpYW4sIGQgPSBzdGVwIHRvIG1pbmltdW0KCQkvLyBIIGQgPSAtZywgc29sdmUgZm9yIGQKCQkkSCA9IGFycmF5KCk7CgkJJGcgPSBhcnJheSgpOwoKCQkvL2RvdWJsZVtdIGQgPSBuZXcgZG91YmxlW25wYXJtXTsKCgkJJG9vczIgPSBhcnJheSgpOwoKCQlmb3IoJGkgPSAwOyAkaSA8ICRucHRzOyArKyRpKSB7CgkJCSRvb3MyWyRpXSA9IDEuLygkc1skaV0qJHNbJGldKTsKCQl9CgkJJGl0ZXIgPSAwOwoJCSR0ZXJtID0gMDsJLy8gdGVybWluYXRpb24gY291bnQgdGVzdAoKCQlkbyB7CgkJCSsrJGl0ZXI7CgoJCQkvLyBoZXNzaWFuIGFwcHJveGltYXRpb24KCQkJZm9yKCAkciA9IDA7ICRyIDwgJG5wYXJtOyArKyRyKSB7CgkJCQlmb3IoICRjID0gMDsgJGMgPCAkbnBhcm07ICsrJGMpIHsKCQkJCQlmb3IoICRpID0gMDsgJGkgPCAkbnB0czsgKyskaSkgewoJCQkJCQlpZiAoJGkgPT0gMCkgJEhbJHJdWyRjXSA9IDAuOwoJCQkJCQkkeGkgPSAkeFskaV07CgkJCQkJCSRIWyRyXVskY10gKz0gKCRvb3MyWyRpXSAqICRmLT5ncmFkKCR4aSwgJGEsICRyKSAqICRmLT5ncmFkKCR4aSwgJGEsICRjKSk7CgkJCQkJfSAgLy9ucHRzCgkJCQl9IC8vYwoJCQl9IC8vcgoKCQkJLy8gYm9vc3QgZGlhZ29uYWwgdG93YXJkcyBncmFkaWVudCBkZXNjZW50CgkJCWZvciggJHIgPSAwOyAkciA8ICRucGFybTsgKyskcikKCQkJCSRIWyRyXVskcl0gKj0gKDEuICsgJGxhbWJkYSk7CgoJCQkvLyBncmFkaWVudAoJCQlmb3IoICRyID0gMDsgJHIgPCAkbnBhcm07ICsrJHIpIHsKCQkJCWZvciggJGkgPSAwOyAkaSA8ICRucHRzOyArKyRpKSB7CgkJCQkJaWYgKCRpID09IDApICRnWyRyXSA9IDAuOwoJCQkJCSR4aSA9ICR4WyRpXTsKCQkJCQkkZ1skcl0gKz0gKCRvb3MyWyRpXSAqICgkeVskaV0tJGYtPnZhbCgkeGksJGEpKSAqICRmLT5ncmFkKCR4aSwgJGEsICRyKSk7CgkJCQl9CgkJCX0gLy9ucHRzCgoJCQkvLyBzY2FsZSAoZm9yIGNvbnNpc3RlbmN5IHdpdGggTlIsIG5vdCBuZWNlc3NhcnkpCgkJCWlmICgkZmFsc2UpIHsKCQkJCWZvciggJHIgPSAwOyAkciA8ICRucGFybTsgKyskcikgewoJCQkJCSRnWyRyXSA9IC0wLjUgKiAkZ1skcl07CgkJCQkJZm9yKCAkYyA9IDA7ICRjIDwgJG5wYXJtOyArKyRjKSB7CgkJCQkJCSRIWyRyXVskY10gKj0gMC41OwoJCQkJCX0KCQkJCX0KCQkJfQoKCQkJLy8gc29sdmUgSCBkID0gLWcsIGV2YWx1YXRlIGVycm9yIGF0IG5ldyBsb2NhdGlvbgoJCQkvL2RvdWJsZVtdIGQgPSBEb3VibGVNYXRyaXguc29sdmUoSCwgZyk7Ci8vCQkJZG91YmxlW10gZCA9IChuZXcgTWF0cml4KEgpKS5sdSgpLnNvbHZlKG5ldyBNYXRyaXgoZywgbnBhcm0pKS5nZXRSb3dQYWNrZWRDb3B5KCk7CgkJCS8vZG91YmxlW10gbmEgPSBEb3VibGVWZWN0b3IuYWRkKGEsIGQpOwovLwkJCWRvdWJsZVtdIG5hID0gKG5ldyBNYXRyaXgoYSwgbnBhcm0pKS5wbHVzKG5ldyBNYXRyaXgoZCwgbnBhcm0pKS5nZXRSb3dQYWNrZWRDb3B5KCk7Ci8vCQkJZG91YmxlIGUxID0gY2hpU3F1YXJlZCh4LCBuYSwgeSwgcywgZik7CgovLwkJCWlmICh2ZXJib3NlID4gMCkgewovLwkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlxuXG5pdGVyYXRpb24gIitpdGVyKyIgbGFtYmRhID0gIitsYW1iZGEpOwovLwkJCQlTeXN0ZW0ub3V0LnByaW50KCJhID0gIik7Ci8vCQkJCShuZXcgTWF0cml4KGEsIG5wYXJtKSkucHJpbnQoMTAsIDIpOwovLwkJCQlpZiAodmVyYm9zZSA+IDEpIHsKLy8JCQkJCVN5c3RlbS5vdXQucHJpbnQoIkggPSAiKTsKLy8JCQkJCShuZXcgTWF0cml4KEgpKS5wcmludCgxMCwgMik7Ci8vCQkJCQlTeXN0ZW0ub3V0LnByaW50KCJnID0gIik7Ci8vCQkJCQkobmV3IE1hdHJpeChnLCBucGFybSkpLnByaW50KDEwLCAyKTsKLy8JCQkJCVN5c3RlbS5vdXQucHJpbnQoImQgPSAiKTsKLy8JCQkJCShuZXcgTWF0cml4KGQsIG5wYXJtKSkucHJpbnQoMTAsIDIpOwovLwkJCQl9Ci8vCQkJCVN5c3RlbS5vdXQucHJpbnQoImUwID0gIiArIGUwICsgIjogIik7Ci8vCQkJCVN5c3RlbS5vdXQucHJpbnQoIm1vdmVkIGZyb20gIik7Ci8vCQkJCShuZXcgTWF0cml4KGEsIG5wYXJtKSkucHJpbnQoMTAsIDIpOwovLwkJCQlTeXN0ZW0ub3V0LnByaW50KCJlMSA9ICIgKyBlMSArICI6ICIpOwovLwkJCQlpZiAoZTEgPCBlMCkgewovLwkJCQkJU3lzdGVtLm91dC5wcmludCgidG8gIik7Ci8vCQkJCQkobmV3IE1hdHJpeChuYSwgbnBhcm0pKS5wcmludCgxMCwgMik7Ci8vCQkJCX0gZWxzZSB7Ci8vCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIm1vdmUgcmVqZWN0ZWQiKTsKLy8JCQkJfQovLwkJCX0KCgkJCS8vIHRlcm1pbmF0aW9uIHRlc3QgKHNsaWdodGx5IGRpZmZlcmVudCB0aGFuIE5SKQovLwkJCWlmIChNYXRoLmFicyhlMS1lMCkgPiB0ZXJtZXBzaWxvbikgewovLwkJCQl0ZXJtID0gMDsKLy8JCQl9IGVsc2UgewovLwkJCQl0ZXJtKys7Ci8vCQkJCWlmICh0ZXJtID09IDQpIHsKLy8JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigidGVybWluYXRpbmcgYWZ0ZXIgIiArIGl0ZXIgKyAiIGl0ZXJhdGlvbnMiKTsKLy8JCQkJCWRvbmUgPSB0cnVlOwovLwkJCQl9Ci8vCQkJfQovLwkJCWlmIChpdGVyID49IG1heGl0ZXIpIGRvbmUgPSB0cnVlOwoKCQkJLy8gaW4gdGhlIEMrKyB2ZXJzaW9uLCBmb3VuZCB0aGF0IGNoYW5naW5nIHRoaXMgdG8gZTEgPj0gZTAKCQkJLy8gd2FzIG5vdCBhIGdvb2QgaWRlYS4gIFNlZSBjb21tZW50IHRoZXJlLgoJCQkvLwovLwkJCWlmIChlMSA+IGUwIHx8IERvdWJsZS5pc05hTihlMSkpIHsgLy8gbmV3IGxvY2F0aW9uIHdvcnNlIHRoYW4gYmVmb3JlCi8vCQkJCWxhbWJkYSAqPSAxMC47Ci8vCQkJfSBlbHNlIHsJCS8vIG5ldyBsb2NhdGlvbiBiZXR0ZXIsIGFjY2VwdCBuZXcgcGFyYW1ldGVycwovLwkJCQlsYW1iZGEgKj0gMC4xOwovLwkJCQllMCA9IGUxOwovLwkJCQkvLyBzaW1wbHkgYXNzaWduaW5nIGEgPSBuYSB3aWxsIG5vdCBnZXQgcmVzdWx0cyBjb3BpZWQgYmFjayB0byBjYWxsZXIKLy8JCQkJZm9yKCBpbnQgaSA9IDA7IGkgPCBucGFybTsgaSsrICkgewovLwkJCQkJaWYgKHZhcnlbaV0pIGFbaV0gPSBuYVtpXTsKLy8JCQkJfQovLwkJCX0KCQl9IHdoaWxlKCEkZG9uZSk7CgoJCXJldHVybiAkbGFtYmRhOwoJfQkvLwlmdW5jdGlvbiBzb2x2ZSgpCgp9CS8vCWNsYXNzIExldmVuYmVyZ01hcnF1YXJkdAo=]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Shared/JAMA/examples/LMQuadTest.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIHF1YWRyYXRpYyAocC1vKSdTJ1MocC1vKQogKiBzb2x2ZSBmb3IgbywgUwogKiBTIGlzIGEgc2luZ2xlIHNjYWxlIGZhY3RvcgogKi8KY2xhc3MgTE1RdWFkVGVzdCB7CgoJLyoqCgkgKiBAcGFyYW0gYXJyYXlbXSAkeAoJICogQHBhcmFtIGFycmF5W10gJGEKCSAqLwoJZnVuY3Rpb24gdmFsKCR4LCAkYSkgewoJCWlmIChjb3VudCgkYSkgIT0gMykgZGllICgiV3JvbmcgbnVtYmVyIG9mIGVsZW1lbnRzIGluIGFycmF5IGEiKTsKCQlpZiAoY291bnQoJHgpICE9IDIpIGRpZSAoIldyb25nIG51bWJlciBvZiBlbGVtZW50cyBpbiBhcnJheSB4Iik7CgoJCSRveCA9ICRhWzBdOwoJCSRveSA9ICRhWzFdOwoJCSRzICA9ICRhWzJdOwoKCQkkc2R4ID0gJHMgKiAoJHhbMF0gLSAkb3gpOwoJCSRzZHkgPSAkcyAqICgkeFsxXSAtICRveSk7CgoJCXJldHVybiAoJHNkeCAqICRzZHgpICsgKCRzZHkgKiAkc2R5KTsKICAgfQkvLwlmdW5jdGlvbiB2YWwoKQoKCgkvKioKCSAqIHogPSAocC1vKSdTJ1MocC1vKQoJICogZHovZHAgPSAyUydTKHAtbykKCSAqCgkgKiB6ID0gKHMqKHB4LW94KSleMiArIChzKihweS1veSkpXjIKCSAqIGR6L2RveCA9IC0yKHMqKHB4LW94KSkqcwoJICogZHovZHMgPSAyKnMqWyhweC1veCleMiArIChweS1veSleMl0KCSAqCgkgKiB6ID0gKHMqZHgpXjIgKyAocypkeSleMgoJICogZHovZHMgPSAyKHMqZHgpKmR4ICsgMihzKmR5KSpkeQoJICoKCSAqIEBwYXJhbSBhcnJheVtdICR4CgkgKiBAcGFyYW0gYXJyYXlbXSAkYQoJICogQHBhcmFtIGludCAkYV9rCgkgKiBAcGFyYW0gYXJyYXlbXSAkYQoJICovCglmdW5jdGlvbiBncmFkKCR4LCAkYSwgJGFfaykgewoJCWlmIChjb3VudCgkYSkgIT0gMykgZGllICgiV3JvbmcgbnVtYmVyIG9mIGVsZW1lbnRzIGluIGFycmF5IGEiKTsKCQlpZiAoY291bnQoJHgpICE9IDIpIGRpZSAoIldyb25nIG51bWJlciBvZiBlbGVtZW50cyBpbiBhcnJheSB4Iik7CgkJaWYgKCRhX2sgPCAzKSBkaWUgKCJhX2s9Ii4kYV9rKTsKCgkJJG94ID0gJGFbMF07CgkJJG95ID0gJGFbMV07CgkJJHMgID0gJGFbMl07CgoJCSRkeCA9ICgkeFswXSAtICRveCk7CgkJJGR5ID0gKCR4WzFdIC0gJG95KTsKCgkJaWYgKCRhX2sgPT0gMCkKCQkJcmV0dXJuIC0yLiokcyokcyokZHg7CgkJZWxzZWlmICgkYV9rID09IDEpCgkJCXJldHVybiAtMi4qJHMqJHMqJGR5OwoJCWVsc2UKCQkJcmV0dXJuIDIuKiRzKigkZHgqJGR4ICsgJGR5KiRkeSk7Cgl9CS8vCWZ1bmN0aW9uIGdyYWQoKQoKCgkvKioKCSAqIEByZXR1cm4gYXJyYXlbXSAkYQoJICovCglmdW5jdGlvbiBpbml0aWFsKCkgewoJCSRhWzBdID0gMC4wNTsKCQkkYVsxXSA9IDAuMTsKCQkkYVsyXSA9IDEuMDsKCgkJcmV0dXJuICRhOwoJfQkvLwlmdW5jdGlvbiBpbml0aWFsKCkKCgoJLyoqCgkgKiBAcmV0dXJuIE9iamVjdFtdICRhCgkgKi8KCWZ1bmN0aW9uIHRlc3RkYXRhKCkgewoJCSRucHRzID0gMjU7CgoJCSRhWzBdID0gMC47CgkJJGFbMV0gPSAwLjsKCQkkYVsyXSA9IDAuOTsKCgkJJGkgPSAwOwoKCQlmb3IgKCRyID0gLTI7ICRyIDw9IDI7ICsrJHIpIHsKCQkJZm9yICgkYyA9IC0yOyAkYyA8PSAyOyArKyRjKSB7CgkJCQkkeFskaV1bMF0gPSAkYzsKCQkJCSR4WyRpXVsxXSA9ICRyOwoJCQkJJHlbJGldID0gJHRoaXMtPnZhbCgkeFskaV0sICRhKTsKCQkJCXByaW50KCJRdWFkICIuJGMuIiwiLiRyLiIgLT4gIi4keVskaV0uIjxiciAvPiIpOwoJCQkJJHNbJGldID0gMS47CgkJCQkrKyRpOwoJCQl9CgkJfQoJCXByaW50KCJxdWFkIHg9ICIpOwoKCQkkcXggPSBuZXcgTWF0cml4KCR4KTsKCQkkcXgtPnByaW50KDEwLCAyKTsKCgkJcHJpbnQoInF1YWQgeT0gIik7CgkJJHF5ID0gbmV3IE1hdHJpeCgkeSwgJG5wdHMpOwoJCSRxeS0+cHJpbnQoMTAsIDIpOwoKCQkkb1swXSA9ICR4OwoJCSRvWzFdID0gJGE7CgkJJG9bMl0gPSAkeTsKCQkkb1szXSA9ICRzOwoKCQlyZXR1cm4gJG87Cgl9CS8vCWZ1bmN0aW9uIHRlc3RkYXRhKCkKCn0JLy8JY2xhc3MgTE1RdWFkVGVzdAo=]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Shared/JAMA/examples/MagicSquareExample.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiogQHBhY2thZ2UgSkFNQQoqLwoKcmVxdWlyZV9vbmNlICIuLi9NYXRyaXgucGhwIjsKCi8qKgoqIEV4YW1wbGUgb2YgdXNlIG9mIE1hdHJpeCBDbGFzcywgZmVhdHVyaW5nIG1hZ2ljIHNxdWFyZXMuCiovCmNsYXNzIE1hZ2ljU3F1YXJlRXhhbXBsZSB7CgogIC8qKgogICogR2VuZXJhdGUgbWFnaWMgc3F1YXJlIHRlc3QgbWF0cml4LgogICogQHBhcmFtIGludCBuIGRpbWVuc2lvbiBvZiBtYXRyaXgKICAqLwogIGZ1bmN0aW9uIG1hZ2ljKCRuKSB7CgogICAgLy8gT2RkIG9yZGVyCgogICAgaWYgKCgkbiAlIDIpID09IDEpIHsKICAgICAgJGEgPSAoJG4rMSkvMjsKICAgICAgJGIgPSAoJG4rMSk7CiAgICAgIGZvciAoJGogPSAwOyAkaiA8ICRuOyArKyRqKQogICAgICAgIGZvciAoJGkgPSAwOyAkaSA8ICRuOyArKyRpKQogICAgICAgICAgJE1bJGldWyRqXSA9ICRuKigoJGkrJGorJGEpICUgJG4pICsgKCgkaSsyKiRqKyRiKSAlICRuKSArIDE7CgogICAgLy8gRG91Ymx5IEV2ZW4gT3JkZXIKCiAgICB9IGVsc2UgaWYgKCgkbiAlIDQpID09IDApIHsKICAgICAgZm9yICgkaiA9IDA7ICRqIDwgJG47ICsrJGopIHsKICAgICAgICBmb3IgKCRpID0gMDsgJGkgPCAkbjsgKyskaSkgewogICAgICAgICAgaWYgKCgoJGkrMSkvMiklMiA9PSAoKCRqKzEpLzIpJTIpCiAgICAgICAgICAgICRNWyRpXVskal0gPSAkbiokbi0kbiokaS0kajsKICAgICAgICAgIGVsc2UKICAgICAgICAgICAgJE1bJGldWyRqXSA9ICRuKiRpKyRqKzE7CiAgICAgICAgfQogICAgICB9CgogICAgLy8gU2luZ2x5IEV2ZW4gT3JkZXIKCiAgICB9IGVsc2UgewoKICAgICAgJHAgPSAkbi8yOwogICAgICAkayA9ICgkbi0yKS80OwogICAgICAkQSA9ICR0aGlzLT5tYWdpYygkcCk7CiAgICAgICRNID0gYXJyYXkoKTsKICAgICAgZm9yICgkaiA9IDA7ICRqIDwgJHA7ICsrJGopIHsKICAgICAgICBmb3IgKCRpID0gMDsgJGkgPCAkcDsgKyskaSkgewogICAgICAgICAgJGFpaiA9ICRBLT5nZXQoJGksJGopOwogICAgICAgICAgJE1bJGldWyRqXSAgICAgICA9ICRhaWo7CiAgICAgICAgICAkTVskaV1bJGorJHBdICAgID0gJGFpaiArIDIqJHAqJHA7CiAgICAgICAgICAkTVskaSskcF1bJGpdICAgID0gJGFpaiArIDMqJHAqJHA7CiAgICAgICAgICAkTVskaSskcF1bJGorJHBdID0gJGFpaiArICRwKiRwOwogICAgICAgIH0KICAgICAgfQoKICAgICAgZm9yICgkaSA9IDA7ICRpIDwgJHA7ICsrJGkpIHsKICAgICAgICBmb3IgKCRqID0gMDsgJGogPCAkazsgKyskaikgewogICAgICAgICAgJHQgPSAkTVskaV1bJGpdOwogICAgICAgICAgJE1bJGldWyRqXSA9ICRNWyRpKyRwXVskal07CiAgICAgICAgICAkTVskaSskcF1bJGpdID0gJHQ7CiAgICAgICAgfQogICAgICAgIGZvciAoJGogPSAkbi0kaysxOyAkaiA8ICRuOyArKyRqKSB7CiAgICAgICAgICAkdCA9ICRNWyRpXVskal07CiAgICAgICAgICAkTVskaV1bJGpdID0gJE1bJGkrJHBdWyRqXTsKICAgICAgICAgICRNWyRpKyRwXVskal0gPSAkdDsKICAgICAgICB9CiAgICAgIH0KCiAgICAgICR0ID0gJE1bJGtdWzBdOyAgJE1bJGtdWzBdICA9ICRNWyRrKyRwXVswXTsgICRNWyRrKyRwXVswXSAgPSAkdDsKICAgICAgJHQgPSAkTVska11bJGtdOyAkTVska11bJGtdID0gJE1bJGsrJHBdWyRrXTsgJE1bJGsrJHBdWyRrXSA9ICR0OwoKICAgIH0KCiAgICByZXR1cm4gbmV3IE1hdHJpeCgkTSk7CgogIH0KCiAgLyoqCiAgKiBTaW1wbGUgZnVuY3Rpb24gdG8gcmVwbGljYXRlIFBIUCA1IGJlaGF2aW91cgogICovCiAgZnVuY3Rpb24gbWljcm90aW1lX2Zsb2F0KCkgewogICAgbGlzdCgkdXNlYywgJHNlYykgPSBleHBsb2RlKCIgIiwgbWljcm90aW1lKCkpOwogICAgcmV0dXJuICgoZmxvYXQpJHVzZWMgKyAoZmxvYXQpJHNlYyk7CiAgfQoKICAvKioKICAqIFRlc3RzIExVLCBRUiwgU1ZEIGFuZCBzeW1tZXRyaWMgRWlnIGRlY29tcG9zaXRpb25zLgogICoKICAqICAgbiAgICAgICA9IG9yZGVyIG9mIG1hZ2ljIHNxdWFyZS4KICAqICAgdHJhY2UgICA9IGRpYWdvbmFsIHN1bSwgc2hvdWxkIGJlIHRoZSBtYWdpYyBzdW0sIChuXjMgKyBuKS8yLgogICogICBtYXhfZWlnID0gbWF4aW11bSBlaWdlbnZhbHVlIG9mIChBICsgQScpLzIsIHNob3VsZCBlcXVhbCB0cmFjZS4KICAqICAgcmFuayAgICA9IGxpbmVhciBhbGdlYnJhaWMgcmFuaywgc2hvdWxkIGVxdWFsIG4gaWYgbiBpcyBvZGQsCiAgKiAgICAgICAgICAgICBiZSBsZXNzIHRoYW4gbiBpZiBuIGlzIGV2ZW4uCiAgKiAgIGNvbmQgICAgPSBMXzIgY29uZGl0aW9uIG51bWJlciwgcmF0aW8gb2Ygc2luZ3VsYXIgdmFsdWVzLgogICogICBsdV9yZXMgID0gdGVzdCBvZiBMVSBmYWN0b3JpemF0aW9uLCBub3JtMShMKlUtQShwLDopKS8obiplcHMpLgogICogICBxcl9yZXMgID0gdGVzdCBvZiBRUiBmYWN0b3JpemF0aW9uLCBub3JtMShRKlItQSkvKG4qZXBzKS4KICAqLwogIGZ1bmN0aW9uIG1haW4oKSB7CiAgICA/PgogICAgPHA+VGVzdCBvZiBNYXRyaXggQ2xhc3MsIHVzaW5nIG1hZ2ljIHNxdWFyZXMuPC9wPgogICAgPHA+U2VlIE1hZ2ljU3F1YXJlRXhhbXBsZS5tYWluKCkgZm9yIGFuIGV4cGxhbmF0aW9uLjwvcD4KICAgIDx0YWJsZSBib3JkZXI9JzEnIGNlbGxzcGFjaW5nPScwJyBjZWxscGFkZGluZz0nNCc+CiAgICAgIDx0cj4KICAgICAgICA8dGg+bjwvdGg+CiAgICAgICAgPHRoPnRyYWNlPC90aD4KICAgICAgICA8dGg+bWF4X2VpZzwvdGg+CiAgICAgICAgPHRoPnJhbms8L3RoPgogICAgICAgIDx0aD5jb25kPC90aD4KICAgICAgICA8dGg+bHVfcmVzPC90aD4KICAgICAgICA8dGg+cXJfcmVzPC90aD4KICAgICAgPC90cj4KICAgICAgPD9waHAKICAgICAgJHN0YXJ0X3RpbWUgPSAkdGhpcy0+bWljcm90aW1lX2Zsb2F0KCk7CiAgICAgICRlcHMgPSBwb3coMi4wLC01Mi4wKTsKICAgICAgZm9yICgkbiA9IDM7ICRuIDw9IDY7ICsrJG4pIHsKICAgICAgICBlY2hvICI8dHI+IjsKCiAgICAgICAgZWNobyAiPHRkIGFsaWduPSdyaWdodCc+JG48L3RkPiI7CgogICAgICAgICRNID0gJHRoaXMtPm1hZ2ljKCRuKTsKICAgICAgICAkdCA9IChpbnQpICRNLT50cmFjZSgpOwoKICAgICAgICBlY2hvICI8dGQgYWxpZ249J3JpZ2h0Jz4kdDwvdGQ+IjsKCiAgICAgICAgJE8gPSAkTS0+cGx1cygkTS0+dHJhbnNwb3NlKCkpOwogICAgICAgICRFID0gbmV3IEVpZ2VudmFsdWVEZWNvbXBvc2l0aW9uKCRPLT50aW1lcygwLjUpKTsKICAgICAgICAkZCA9ICRFLT5nZXRSZWFsRWlnZW52YWx1ZXMoKTsKCiAgICAgICAgZWNobyAiPHRkIGFsaWduPSdyaWdodCc+Ii4kZFskbi0xXS4iPC90ZD4iOwoKICAgICAgICAkciA9ICRNLT5yYW5rKCk7CgogICAgICAgIGVjaG8gIjx0ZCBhbGlnbj0ncmlnaHQnPiIuJHIuIjwvdGQ+IjsKCiAgICAgICAgJGMgPSAkTS0+Y29uZCgpOwoKICAgICAgICBpZiAoJGMgPCAxLyRlcHMpCiAgICAgICAgICBlY2hvICI8dGQgYWxpZ249J3JpZ2h0Jz4iLnNwcmludGYoIiUuM2YiLCRjKS4iPC90ZD4iOwogICAgICAgIGVsc2UKICAgICAgICAgIGVjaG8gIjx0ZCBhbGlnbj0ncmlnaHQnPkluZjwvdGQ+IjsKCiAgICAgICAgJExVID0gbmV3IExVRGVjb21wb3NpdGlvbigkTSk7CiAgICAgICAgJEwgPSAkTFUtPmdldEwoKTsKICAgICAgICAkVSA9ICRMVS0+Z2V0VSgpOwogICAgICAgICRwID0gJExVLT5nZXRQaXZvdCgpOwogICAgICAgIC8vIEphdmEgdmVyc2lvbjogUiA9IEwudGltZXMoVSkubWludXMoTS5nZXRNYXRyaXgocCwwLG4tMSkpOwogICAgICAgICRTID0gJEwtPnRpbWVzKCRVKTsKICAgICAgICAkUiA9ICRTLT5taW51cygkTS0+Z2V0TWF0cml4KCRwLDAsJG4tMSkpOwogICAgICAgICRyZXMgPSAkUi0+bm9ybTEoKS8oJG4qJGVwcyk7CgogICAgICAgIGVjaG8gIjx0ZCBhbGlnbj0ncmlnaHQnPiIuc3ByaW50ZigiJS4zZiIsJHJlcykuIjwvdGQ+IjsKCiAgICAgICAgJFFSID0gbmV3IFFSRGVjb21wb3NpdGlvbigkTSk7CiAgICAgICAgJFEgPSAkUVItPmdldFEoKTsKICAgICAgICAkUiA9ICRRUi0+Z2V0UigpOwogICAgICAgICRTID0gJFEtPnRpbWVzKCRSKTsKICAgICAgICAkUiA9ICRTLT5taW51cygkTSk7CiAgICAgICAgJHJlcyA9ICRSLT5ub3JtMSgpLygkbiokZXBzKTsKCiAgICAgICAgZWNobyAiPHRkIGFsaWduPSdyaWdodCc+Ii5zcHJpbnRmKCIlLjNmIiwkcmVzKS4iPC90ZD4iOwoKICAgICAgICBlY2hvICI8L3RyPiI7CgogICAgIH0KICAgICBlY2hvICI8dGFibGU+IjsKICAgICBlY2hvICI8YnIgLz4iOwoKICAgICAkc3RvcF90aW1lID0gJHRoaXMtPm1pY3JvdGltZV9mbG9hdCgpOwogICAgICRldGltZSA9ICRzdG9wX3RpbWUgLSAkc3RhcnRfdGltZTsKCiAgICAgZWNobyAiPHA+RWxhcHNlZCB0aW1lIGlzICIuIHNwcmludGYoIiUuNGYiLCRldGltZSkgLiIgc2Vjb25kcy48L3A+IjsKCiAgfQoKfQoKJG1hZ2ljID0gbmV3IE1hZ2ljU3F1YXJlRXhhbXBsZSgpOwokbWFnaWMtPm1haW4oKTsKCj8+Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Shared/JAMA/examples/polyfit.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKcmVxdWlyZV9vbmNlICIuLi9NYXRyaXgucGhwIjsKLyoKKiBAcGFja2FnZSBKQU1BCiogQGF1dGhvciBNaWNoYWVsIEJvbW1hcml0bwoqIEBhdXRob3IgUGF1bCBNZWFnaGVyCiogQHZlcnNpb24gMC4xCioKKiBGdW5jdGlvbiB0byBmaXQgYW4gb3JkZXIgbiBwb2x5bm9taWFsIGZ1bmN0aW9uIHRocm91Z2gKKiBhIHNlcmllcyBvZiB4LXkgZGF0YSBwb2ludHMgdXNpbmcgbGVhc3Qgc3F1YXJlcy4KKgoqIEBwYXJhbSAkWCBhcnJheSB4IHZhbHVlcwoqIEBwYXJhbSAkWSBhcnJheSB5IHZhbHVlcwoqIEBwYXJhbSAkbiBpbnQgb3JkZXIgb2YgcG9seW5vbWlhbCB0byBiZSB1c2VkIGZvciBmaXR0aW5nCiogQHJldHVybnMgYXJyYXkgJGNvZWZmcyBvZiBwb2x5bm9taWFsIGNvZWZmaWNpZW50cwoqIFByZS1Db25kaXRpb25zOiB0aGUgc3lzdGVtIGlzIG5vdCB1bmRlcmRldGVybWluZWQ6IHNpemVvZigkWCkgPiAkbisxCiovCmZ1bmN0aW9uIHBvbHlmaXQoJFgsICRZLCAkbikgewoJZm9yICgkaSA9IDA7ICRpIDwgc2l6ZW9mKCRYKTsgKyskaSkKCQlmb3IgKCRqID0gMDsgJGogPD0gJG47ICsrJGopCgkJCSRBWyRpXVskal0gPSBwb3coJFhbJGldLCAkaik7Cglmb3IgKCRpPTA7ICRpIDwgc2l6ZW9mKCRZKTsgKyskaSkKCQkkQlskaV0gPSBhcnJheSgkWVskaV0pOwoJJG1hdHJpeEEgPSBuZXcgTWF0cml4KCRBKTsKCSRtYXRyaXhCID0gbmV3IE1hdHJpeCgkQik7CgkkQyA9ICRtYXRyaXhBLT5zb2x2ZSgkbWF0cml4Qik7CglyZXR1cm4gJEMtPmdldE1hdHJpeCgwLCAkbiwgMCwgMSk7Cn0KCmZ1bmN0aW9uIHByaW50cG9seSggJEMgPSBudWxsICkgewoJZm9yKCRpID0gJEMtPm0gLSAxOyAkaSA+PSAwOyAtLSRpKSB7CgkJJHIgPSAkQy0+Z2V0KCRpLCAwKTsKCQlpZiAoIGFicygkcikgPD0gcG93KDEwLCAtOSkgKQoJCQkkciA9IDA7CgkJaWYgKCRpID09ICRDLT5tIC0gMSkKCQkJZWNobyAkciAuICJ4PHN1cD4kaTwvc3VwPiI7CgkJZWxzZSBpZiAoJGkgPCAkQy0+bSAtIDEpCgkJCWVjaG8gIiArICIgLiAkciAuICJ4PHN1cD4kaTwvc3VwPiI7CgkJZWxzZSBpZiAoJGkgPT0gMCkKCQkJZWNobyAiICsgIiAuICRyOwoJfQp9CgokWCA9IGFycmF5KDAsMSwyLDMsNCw1KTsKJFkgPSBhcnJheSg0LDMsMTIsNjcsMjI4LCA1NzkpOwokcG9pbnRzID0gbmV3IE1hdHJpeChhcnJheSgkWCwgJFkpKTsKJHBvaW50cy0+dG9IVE1MKCk7CnByaW50cG9seShwb2x5Zml0KCRYLCAkWSwgNCkpOwoKZWNobyAnPGhyIC8+JzsKCiRYID0gYXJyYXkoMCwxLDIsMyw0LDUpOwokWSA9IGFycmF5KDEsMiw1LDEwLDE3LCAyNik7CiRwb2ludHMgPSBuZXcgTWF0cml4KGFycmF5KCRYLCAkWSkpOwokcG9pbnRzLT50b0hUTUwoKTsKcHJpbnRwb2x5KHBvbHlmaXQoJFgsICRZLCAyKSk7CgplY2hvICc8aHIgLz4nOwoKJFggPSBhcnJheSgwLDEsMiwzLDQsNSw2KTsKJFkgPSBhcnJheSgtOTAsLTEwNCwtMTc4LC0yNTIsLTI2LCAxMTYwLCA0NDQ2KTsKJHBvaW50cyA9IG5ldyBNYXRyaXgoYXJyYXkoJFgsICRZKSk7CiRwb2ludHMtPnRvSFRNTCgpOwpwcmludHBvbHkocG9seWZpdCgkWCwgJFksIDUpKTsKCmVjaG8gJzxociAvPic7CgokWCA9IGFycmF5KDAsMSwyLDMsNCk7CiRZID0gYXJyYXkobXRfcmFuZCgwLCAxMCksIG10X3JhbmQoNDAsIDgwKSwgbXRfcmFuZCgyNDAsIDQwMCksIG10X3JhbmQoMTgwMCwgMjIxNSksIG10X3JhbmQoODAwMCwgOTAwMCkpOwokcG9pbnRzID0gbmV3IE1hdHJpeChhcnJheSgkWCwgJFkpKTsKJHBvaW50cy0+dG9IVE1MKCk7CnByaW50cG9seShwb2x5Zml0KCRYLCAkWSwgMykpOwo/Pgo=]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Shared/JAMA/examples/Stats.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLy8KLy8gKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi8vIHwgUEhQIFZlcnNpb24gNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAovLyArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLy8gfCBDb3B5cmlnaHQgKGMpIDE5OTctMjAwMyBUaGUgUEhQIEdyb3VwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci8vICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwovLyB8IFRoaXMgc291cmNlIGZpbGUgaXMgc3ViamVjdCB0byB2ZXJzaW9uIDIuMCBvZiB0aGUgUEhQIGxpY2Vuc2UsICAgICAgIHwKLy8gfCB0aGF0IGlzIGJ1bmRsZWQgd2l0aCB0aGlzIHBhY2thZ2UgaW4gdGhlIGZpbGUgTElDRU5TRSwgYW5kIGlzICAgICAgICB8Ci8vIHwgYXZhaWxhYmxlIGF0IHRocm91Z2ggdGhlIHdvcmxkLXdpZGUtd2ViIGF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgfAovLyB8IGh0dHA6Ly93d3cucGhwLm5ldC9saWNlbnNlLzJfMDIudHh0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLy8gfCBJZiB5b3UgZGlkIG5vdCByZWNlaXZlIGEgY29weSBvZiB0aGUgUEhQIGxpY2Vuc2UgYW5kIGFyZSB1bmFibGUgdG8gICB8Ci8vIHwgb2J0YWluIGl0IHRocm91Z2ggdGhlIHdvcmxkLXdpZGUtd2ViLCBwbGVhc2Ugc2VuZCBhIG5vdGUgdG8gICAgICAgICAgfAovLyB8IGxpY2Vuc2VAcGhwLm5ldCBzbyB3ZSBjYW4gbWFpbCB5b3UgYSBjb3B5IGltbWVkaWF0ZWx5LiAgICAgICAgICAgICAgIHwKLy8gKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi8vIHwgQXV0aG9yczogSmVzdXMgTS4gQ2FzdGFnbmV0dG8gPGptY2FzdGFnbmV0dG9AcGhwLm5ldD4gICAgICAgICAgICAgICAgfAovLyArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLy8KLy8gJElkOiBTdGF0cy5waHAsdiAxLjE1IDIwMDMvMDYvMDEgMTE6NDA6MzAgam1jYXN0YWduZXR0byBFeHAgJAovLwoKaW5jbHVkZV9vbmNlICdQRUFSLnBocCc7CgovKioKKiBAcGFja2FnZSBNYXRoX1N0YXRzCiovCgovLyBDb25zdGFudHMgZm9yIGRlZmluaW5nIHRoZSBzdGF0aXN0aWNzIHRvIGNhbGN1bGF0ZSAvKnt7eyovCi8qKgoqIFNUQVRTX0JBU0lDIHRvIGdlbmVyYXRlIHRoZSBiYXNpYyBkZXNjcmlwdGl2ZSBzdGF0aXN0aWNzCiovCmRlZmluZSgnU1RBVFNfQkFTSUMnLCAxKTsKLyoqCiogU1RBVFNfRlVMTCB0byBnZW5lcmF0ZSBhbHNvIGhpZ2hlciBtb21lbnRzLCBtb2RlLCBtZWRpYW4sIGV0Yy4KKi8KZGVmaW5lKCdTVEFUU19GVUxMJywgMik7Ci8qfX19Ki8KCi8vIENvbnN0YW50cyBkZXNjcmliaW5nIHRoZSBkYXRhIHNldCBmb3JtYXQgLyp7e3sqLwovKioKKiBTVEFUU19EQVRBX1NJTVBMRSBmb3IgYW4gYXJyYXkgb2YgbnVtZXJpYyB2YWx1ZXMuIFRoaXMgaXMgdGhlIGRlZmF1bHQuCiogZS5nLiAkZGF0YSA9IGFycmF5KDIsMyw0LDUsMSwxLDYpOwoqLwpkZWZpbmUoJ1NUQVRTX0RBVEFfU0lNUExFJywgMCk7Ci8qKgoqIFNUQVRTX0RBVEFfQ1VNTVVMQVRJVkUgZm9yIGFuIGFzc29jaWF0aXZlIGFycmF5IG9mIGZyZXF1ZW5jeSB2YWx1ZXMsCiogd2hlcmUgaW4gZWFjaCBhcnJheSBlbnRyeSwgdGhlIGluZGV4IGlzIHRoZSBkYXRhIHBvaW50IGFuZCB0aGUKKiB2YWx1ZSB0aGUgY291bnQgKGZyZXF1ZW5jeSk6CiogZS5nLiAkZGF0YSA9IGFycmF5KDM9PjQsIDIuMz0+NSwgMS4yNT0+NiwgMC41PT4zKQoqLwpkZWZpbmUoJ1NUQVRTX0RBVEFfQ1VNTVVMQVRJVkUnLCAxKTsKLyp9fX0qLwoKLy8gQ29uc3RhbnRzIGRlZmluaW5nIGhvdyB0byBoYW5kbGUgbnVsbHMgLyp7e3sqLwovKioKKiBTVEFUU19SRUpFQ1RfTlVMTCwgcmVqZWN0IGRhdGEgc2V0cyB3aXRoIG51bGwgdmFsdWVzLiBUaGlzIGlzIHRoZSBkZWZhdWx0LgoqIEFueSBub24tbnVtZXJpYyB2YWx1ZSBpcyBjb25zaWRlcmVkIGEgbnVsbCBpbiB0aGlzIGNvbnRleHQuCiovCmRlZmluZSgnU1RBVFNfUkVKRUNUX05VTEwnLCAtMSk7Ci8qKgoqIFNUQVRTX0lHTk9SRV9OVUxMLCBpZ25vcmUgbnVsbCB2YWx1ZXMgYW5kIHBydW5lIHRoZW0gZnJvbSB0aGUgZGF0YS4KKiBBbnkgbm9uLW51bWVyaWMgdmFsdWUgaXMgY29uc2lkZXJlZCBhIG51bGwgaW4gdGhpcyBjb250ZXh0LgoqLwpkZWZpbmUoJ1NUQVRTX0lHTk9SRV9OVUxMJywgLTIpOwovKioKKiBTVEFUU19VU0VfTlVMTF9BU19aRVJPLCBhc3NpZ24gdGhlIHZhbHVlIG9mIDAgKHplcm8pIHRvIG51bGwgdmFsdWVzLgoqIEFueSBub24tbnVtZXJpYyB2YWx1ZSBpcyBjb25zaWRlcmVkIGEgbnVsbCBpbiB0aGlzIGNvbnRleHQuCiovCmRlZmluZSgnU1RBVFNfVVNFX05VTExfQVNfWkVSTycsIC0zKTsKLyp9fX0qLwoKLyoqCiogQSBjbGFzcyB0byBjYWxjdWxhdGUgZGVzY3JpcHRpdmUgc3RhdGlzdGljcyBmcm9tIGEgZGF0YSBzZXQuCiogRGF0YSBzZXRzIGNhbiBiZSBzaW1wbGUgYXJyYXlzIG9mIGRhdGEsIG9yIGEgY3VtbXVsYXRpdmUgaGFzaC4KKiBUaGUgc2Vjb25kIGZvcm0gaXMgdXNlZnVsIHdoZW4gcGFzc2luZyBsYXJnZSBkYXRhIHNldCwKKiBmb3IgZXhhbXBsZSB0aGUgZGF0YSBzZXQ6CioKKiA8cHJlPgoqICRkYXRhMSA9IGFycmF5ICgxLDIsMSwxLDEsMSwzLDMsNC4xLDMsMiwyLDQuMSwxLDEsMiwzLDMsMiwyLDEsMSwyLDIpOwoqIDwvcHJlPgoqCiogY2FuIGJlIGVweHJlc3NlZCBtb3JlIGNvbXBhY3RseSBhczoKKgoqIDxwcmU+CiogJGRhdGEyID0gYXJyYXkoJzEnPT45LCAnMic9PjgsICczJz0+NSwgJzQuMSc9PjIpOwoqIDwvcHJlPgoqCiogRXhhbXBsZSBvZiB1c2U6CioKKiA8cHJlPgoqIGluY2x1ZGVfb25jZSAnTWF0aC9TdGF0cy5waHAnOwoqICRzID0gbmV3IE1hdGhfU3RhdHMoKTsKKiAkcy0+c2V0RGF0YSgkZGF0YTEpOwoqIC8vIG9yCiogLy8gJHMtPnNldERhdGEoJGRhdGEyLCBTVEFUU19EQVRBX0NVTU1VTEFUSVZFKTsKKiAkc3RhdHMgPSAkcy0+Y2FsY0Jhc2ljKCk7CiogZWNobyAnTWVhbjogJy4kc3RhdHNbJ21lYW4nXS4nIFN0RGV2OiAnLiRzdGF0c1snc3RkZXYnXS4nIDxiciAvPlxuJzsKKgoqIC8vIHVzaW5nIGRhdGEgd2l0aCBudWxscwoqIC8vIGZpcnN0IGlnbm9yaW5nIHRoZW06CiogJGRhdGEzID0gYXJyYXkoMS4yLCAnZm9vJywgMi40LCAzLjEsIDQuMiwgMy4yLCBudWxsLCA1LjEsIDYuMik7CiogJHMtPnNldE51bGxPcHRpb24oU1RBVFNfSUdOT1JFX05VTEwpOwoqICRzLT5zZXREYXRhKCRkYXRhMyk7CiogJHN0YXRzMyA9ICRzLT5jYWxjRnVsbCgpOwoqCiogLy8gYW5kIHRoZW4gYXNzdW1pbmcgbnVsbHMgPT0gMAoqICRzLT5zZXROdWxsT3B0aW9uKFNUQVRTX1VTRV9OVUxMX0FTX1pFUk8pOwoqICRzLT5zZXREYXRhKCRkYXRhMyk7CiogJHN0YXRzMyA9ICRzLT5jYWxjRnVsbCgpOwoqIDwvcHJlPgoqCiogT3JpZ2luYWxseSB0aGlzIGNsYXNzIHdhcyBwYXJ0IG9mIE51bVBIUCAoTnVtZXJpYyBQSFAgcGFja2FnZSkKKgoqIEBhdXRob3IgIEplc3VzIE0uIENhc3RhZ25ldHRvIDxqbWNhc3RhZ25ldHRvQHBocC5uZXQ+CiogQHZlcnNpb24gMC44CiogQGFjY2VzcyAgcHVibGljCiogQHBhY2thZ2UgTWF0aF9TdGF0cwoqLwpjbGFzcyBCYXNlIHsvKnt7eyovCiAgICAvLyBwcm9wZXJ0aWVzIC8qe3t7Ki8KCiAgICAvKioKICAgICAqIFRoZSBzaW1wbGUgb3IgY3VtbXVsYXRpdmUgZGF0YSBzZXQuCiAgICAgKiBOdWxsIGJ5IGRlZmF1bHQuCiAgICAgKgogICAgICogQGFjY2VzcyAgcHJpdmF0ZQogICAgICogQHZhciBhcnJheQogICAgICovCiAgICBwdWJsaWMgJF9kYXRhID0gbnVsbDsKCiAgICAvKioKICAgICAqIEV4cGFuZGVkIGRhdGEgc2V0LiBPbmx5IHNldCB3aGVuIGN1bW11bGF0aXZlIGRhdGEKICAgICAqIGlzIGJlaW5nIHVzZWQuIE51bGwgYnkgZGVmYXVsdC4KICAgICAqCiAgICAgKiBAYWNjZXNzICBwcml2YXRlCiAgICAgKiBAdmFyIGFycmF5CiAgICAgKi8KICAgIHB1YmxpYyAkX2RhdGFFeHBhbmRlZCA9IG51bGw7CgogICAgLyoqCiAgICAgKiBGbGFnIGZvciBkYXRhIHR5cGUsIG9uZSBvZiBTVEFUU19EQVRBX1NJTVBMRSBvcgogICAgICogU1RBVFNfREFUQV9DVU1NVUxBVElWRS4gTnVsbCBieSBkZWZhdWx0LgogICAgICoKICAgICAqIEBhY2Nlc3MgIHByaXZhdGUKICAgICAqIEB2YXIgaW50CiAgICAgKi8KICAgIHB1YmxpYyAkX2RhdGFPcHRpb24gPSBudWxsOwoKICAgIC8qKgogICAgICogRmxhZyBmb3IgbnVsbCBoYW5kbGluZyBvcHRpb25zLiBPbmUgb2YgU1RBVFNfUkVKRUNUX05VTEwsCiAgICAgKiBTVEFUU19JR05PUkVfTlVMTCBvciBTVEFUU19VU0VfTlVMTF9BU19aRVJPCiAgICAgKgogICAgICogQGFjY2VzcyAgcHJpdmF0ZQogICAgICogQHZhciBpbnQKICAgICAqLwogICAgcHVibGljICRfbnVsbE9wdGlvbjsKCiAgICAvKioKICAgICAqIEFycmF5IGZvciBjYWNoaW5nIHJlc3VsdCB2YWx1ZXMsIHNob3VsZCBiZSByZXNldAogICAgICogd2hlbiB1c2luZyBzZXREYXRhKCkKICAgICAqCiAgICAgKiBAYWNjZXNzIHByaXZhdGUKICAgICAqIEB2YXIgYXJyYXkKICAgICAqLwogICAgcHVibGljICRfY2FsY3VsYXRlZFZhbHVlcyA9IGFycmF5KCk7CgogICAgLyp9fX0qLwoKICAgIC8qKgogICAgICogQ29uc3RydWN0b3IgZm9yIHRoZSBjbGFzcwogICAgICoKICAgICAqIEBhY2Nlc3MgIHB1YmxpYwogICAgICogQHBhcmFtICAgb3B0aW9uYWwgICAgaW50ICRudWxsT3B0aW9uIGhvdyB0byBoYW5kbGUgbnVsbCB2YWx1ZXMKICAgICAqIEByZXR1cm4gIG9iamVjdCAgTWF0aF9TdGF0cwogICAgICovCiAgICBmdW5jdGlvbiBNYXRoX1N0YXRzKCRudWxsT3B0aW9uPVNUQVRTX1JFSkVDVF9OVUxMKSB7Lyp7e3sqLwogICAgICAgICR0aGlzLT5fbnVsbE9wdGlvbiA9ICRudWxsT3B0aW9uOwogICAgfS8qfX19Ki8KCiAgICAvKioKICAgICAqIFNldHMgYW5kIHZlcmlmaWVzIHRoZSBkYXRhLCBjaGVja2luZyBmb3IgbnVsbHMgYW5kIHVzaW5nCiAgICAgKiB0aGUgY3VycmVudCBudWxsIGhhbmRsaW5nIG9wdGlvbgogICAgICoKICAgICAqIEBhY2Nlc3MgcHVibGljCiAgICAgKiBAcGFyYW0gICBhcnJheSAgICRhcnIgICAgdGhlIGRhdGEgc2V0CiAgICAgKiBAcGFyYW0gICBvcHRpb25hbCAgICBpbnQgJG9wdCAgICBkYXRhIGZvcm1hdDogU1RBVFNfREFUQV9DVU1NVUxBVElWRSBvciBTVEFUU19EQVRBX1NJTVBMRSAoZGVmYXVsdCkKICAgICAqIEByZXR1cm4gIG1peGVkICAgdHJ1ZSBvbiBzdWNjZXNzLCBhIFBFQVJfRXJyb3Igb2JqZWN0IG90aGVyd2lzZQogICAgICovCiAgICBmdW5jdGlvbiBzZXREYXRhKCRhcnIsICRvcHQ9U1RBVFNfREFUQV9TSU1QTEUpIHsvKnt7eyovCiAgICAgICAgaWYgKCFpc19hcnJheSgkYXJyKSkgewogICAgICAgICAgICByZXR1cm4gUEVBUjo6cmFpc2VFcnJvcignaW52YWxpZCBkYXRhLCBhbiBhcnJheSBvZiBudW1lcmljIGRhdGEgd2FzIGV4cGVjdGVkJyk7CiAgICAgICAgfQogICAgICAgICR0aGlzLT5fZGF0YSA9IG51bGw7CiAgICAgICAgJHRoaXMtPl9kYXRhRXhwYW5kZWQgPSBudWxsOwogICAgICAgICR0aGlzLT5fZGF0YU9wdGlvbiA9IG51bGw7CiAgICAgICAgJHRoaXMtPl9jYWxjdWxhdGVkVmFsdWVzID0gYXJyYXkoKTsKICAgICAgICBpZiAoJG9wdCA9PSBTVEFUU19EQVRBX1NJTVBMRSkgewogICAgICAgICAgICAkdGhpcy0+X2RhdGFPcHRpb24gPSAkb3B0OwogICAgICAgICAgICAkdGhpcy0+X2RhdGEgPSBhcnJheV92YWx1ZXMoJGFycik7CiAgICAgICAgfSBlbHNlIGlmICgkb3B0ID09IFNUQVRTX0RBVEFfQ1VNTVVMQVRJVkUpIHsKICAgICAgICAgICAgJHRoaXMtPl9kYXRhT3B0aW9uID0gJG9wdDsKICAgICAgICAgICAgJHRoaXMtPl9kYXRhID0gJGFycjsKICAgICAgICAgICAgJHRoaXMtPl9kYXRhRXhwYW5kZWQgPSBhcnJheSgpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gJHRoaXMtPl92YWxpZGF0ZSgpOwogICAgfS8qfX19Ki8KCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIGRhdGEgd2hpY2ggbWlnaHQgaGF2ZSBiZWVuIG1vZGlmaWVkCiAgICAgKiBhY2NvcmRpbmcgdG8gdGhlIGN1cnJlbnQgbnVsbCBoYW5kbGluZyBvcHRpb25zLgogICAgICoKICAgICAqIEBhY2Nlc3MgIHB1YmxpYwogICAgICogQHBhcmFtIGJvb2xlYW4gJGV4cGFuZGVkIHdoZXRoZXIgdG8gcmV0dXJuIGEgZXhwYW5kZWQgbGlzdCwgZGVmYXVsdCBpcyBmYWxzZQogICAgICogQHJldHVybiAgbWl4ZWQgICBhcnJheSBvZiBkYXRhIG9uIHN1Y2Nlc3MsIGEgUEVBUl9FcnJvciBvYmplY3Qgb3RoZXJ3aXNlCiAgICAgKiBAc2VlIF92YWxpZGF0ZSgpCiAgICAgKi8KICAgIGZ1bmN0aW9uIGdldERhdGEoJGV4cGFuZGVkPWZhbHNlKSB7Lyp7e3sqLwogICAgICAgIGlmICgkdGhpcy0+X2RhdGEgPT0gbnVsbCkgewogICAgICAgICAgICByZXR1cm4gUEVBUjo6cmFpc2VFcnJvcignZGF0YSBoYXMgbm90IGJlZW4gc2V0Jyk7CiAgICAgICAgfQogICAgICAgIGlmICgkdGhpcy0+X2RhdGFPcHRpb24gPT0gU1RBVFNfREFUQV9DVU1NVUxBVElWRSAmJiAkZXhwYW5kZWQpIHsKICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5fZGF0YUV4cGFuZGVkOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJldHVybiAkdGhpcy0+X2RhdGE7CiAgICAgICAgfQogICAgfS8qfX19Ki8KCiAgICAvKioKICAgICAqIFNldHMgdGhlIG51bGwgaGFuZGxpbmcgb3B0aW9uLgogICAgICogTXVzdCBiZSBjYWxsZWQgYmVmb3JlIGFzc2lnbmluZyBhIG5ldyBkYXRhIHNldCBjb250YWluaW5nIG51bGwgdmFsdWVzCiAgICAgKgogICAgICogQGFjY2VzcyAgcHVibGljCiAgICAgKiBAcmV0dXJuICBtaXhlZCAgIHRydWUgb24gc3VjY2VzcywgYSBQRUFSX0Vycm9yIG9iamVjdCBvdGhlcndpc2UKICAgICAqIEBzZWUgX3ZhbGlkYXRlKCkKICAgICAqLwogICAgZnVuY3Rpb24gc2V0TnVsbE9wdGlvbigkbnVsbE9wdGlvbikgey8qe3t7Ki8KICAgICAgICBpZiAoJG51bGxPcHRpb24gPT0gU1RBVFNfUkVKRUNUX05VTEwKICAgICAgICAgICAgfHwgJG51bGxPcHRpb24gPT0gU1RBVFNfSUdOT1JFX05VTEwKICAgICAgICAgICAgfHwgJG51bGxPcHRpb24gPT0gU1RBVFNfVVNFX05VTExfQVNfWkVSTykgewogICAgICAgICAgICAkdGhpcy0+X251bGxPcHRpb24gPSAkbnVsbE9wdGlvbjsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuIFBFQVI6OnJhaXNlRXJyb3IoJ2ludmFsaWQgbnVsbCBoYW5kbGluZyBvcHRpb24gZXhwZWN0aW5nOiAnLgogICAgICAgICAgICAgICAgICAgICAgICAnU1RBVFNfUkVKRUNUX05VTEwsIFNUQVRTX0lHTk9SRV9OVUxMIG9yIFNUQVRTX1VTRV9OVUxMX0FTX1pFUk8nKTsKICAgICAgICB9CiAgICB9Lyp9fX0qLwoKICAgIC8qKgogICAgICogVHJhbnNmb3JtcyB0aGUgZGF0YSBieSBzdWJzdHJhY3RpbmcgZWFjaCBlbnRyeSBmcm9tIHRoZSBtZWFuIGFuZAogICAgICogZGl2aWRpbmcgYnkgaXRzIHN0YW5kYXJkIGRldmlhdGlvbi4gVGhpcyB3aWxsIHJlc2V0IGFsbCBwcmUtY2FsY3VsYXRlZAogICAgICogdmFsdWVzIHRvIHRoZWlyIG9yaWdpbmFsICh1bnNldCkgZGVmYXVsdHMuCiAgICAgKgogICAgICogQGFjY2VzcyBwdWJsaWMKICAgICAqIEByZXR1cm4gbWl4ZWQgdHJ1ZSBvbiBzdWNjZXNzLCBhIFBFQVJfRXJyb3Igb2JqZWN0IG90aGVyd2lzZQogICAgICogQHNlZSBtZWFuKCkKICAgICAqIEBzZWUgc3REZXYoKQogICAgICogQHNlZSBzZXREYXRhKCkKICAgICAqLwogICAgZnVuY3Rpb24gc3R1ZGVudGl6ZSgpIHsvKnt7eyovCiAgICAgICAgJG1lYW4gPSAkdGhpcy0+bWVhbigpOwogICAgICAgIGlmIChQRUFSOjppc0Vycm9yKCRtZWFuKSkgewogICAgICAgICAgICByZXR1cm4gJG1lYW47CiAgICAgICAgfQogICAgICAgICRzdGQgPSAkdGhpcy0+c3REZXYoKTsKICAgICAgICBpZiAoUEVBUjo6aXNFcnJvcigkc3RkKSkgewogICAgICAgICAgICByZXR1cm4gJHN0ZDsKICAgICAgICB9CiAgICAgICAgaWYgKCRzdGQgPT0gMCkgewogICAgICAgICAgICByZXR1cm4gUEVBUjo6cmFpc2VFcnJvcignY2Fubm90IHN0dWRlbnRpemUgZGF0YSwgc3RhbmRhcmQgZGV2aWF0aW9uIGlzIHplcm8uJyk7CiAgICAgICAgfQogICAgICAgICRhcnIgID0gYXJyYXkoKTsKICAgICAgICBpZiAoJHRoaXMtPl9kYXRhT3B0aW9uID09IFNUQVRTX0RBVEFfQ1VNTVVMQVRJVkUpIHsKICAgICAgICAgICAgZm9yZWFjaCAoJHRoaXMtPl9kYXRhIGFzICR2YWw9PiRmcmVxKSB7CiAgICAgICAgICAgICAgICAkbmV3dmFsID0gKCR2YWwgLSAkbWVhbikgLyAkc3RkOwogICAgICAgICAgICAgICAgJGFyclsiJG5ld3ZhbCJdID0gJGZyZXE7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBmb3JlYWNoICgkdGhpcy0+X2RhdGEgYXMgJHZhbCkgewogICAgICAgICAgICAgICAgJG5ld3ZhbCA9ICgkdmFsIC0gJG1lYW4pIC8gJHN0ZDsKICAgICAgICAgICAgICAgICRhcnJbXSA9ICRuZXd2YWw7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuICR0aGlzLT5zZXREYXRhKCRhcnIsICR0aGlzLT5fZGF0YU9wdGlvbik7CiAgICB9Lyp9fX0qLwoKICAgIC8qKgogICAgICogVHJhbnNmb3JtcyB0aGUgZGF0YSBieSBzdWJzdHJhY3RpbmcgZWFjaCBlbnRyeSBmcm9tIHRoZSBtZWFuLgogICAgICogVGhpcyB3aWxsIHJlc2V0IGFsbCBwcmUtY2FsY3VsYXRlZCB2YWx1ZXMgdG8gdGhlaXIgb3JpZ2luYWwgKHVuc2V0KSBkZWZhdWx0cy4KICAgICAqCiAgICAgKiBAYWNjZXNzIHB1YmxpYwogICAgICogQHJldHVybiBtaXhlZCB0cnVlIG9uIHN1Y2Nlc3MsIGEgUEVBUl9FcnJvciBvYmplY3Qgb3RoZXJ3aXNlCiAgICAgKiBAc2VlIG1lYW4oKQogICAgICogQHNlZSBzZXREYXRhKCkKICAgICAqLwogICAgZnVuY3Rpb24gY2VudGVyKCkgey8qe3t7Ki8KICAgICAgICAkbWVhbiA9ICR0aGlzLT5tZWFuKCk7CiAgICAgICAgaWYgKFBFQVI6OmlzRXJyb3IoJG1lYW4pKSB7CiAgICAgICAgICAgIHJldHVybiAkbWVhbjsKICAgICAgICB9CiAgICAgICAgJGFyciAgPSBhcnJheSgpOwogICAgICAgIGlmICgkdGhpcy0+X2RhdGFPcHRpb24gPT0gU1RBVFNfREFUQV9DVU1NVUxBVElWRSkgewogICAgICAgICAgICBmb3JlYWNoICgkdGhpcy0+X2RhdGEgYXMgJHZhbD0+JGZyZXEpIHsKICAgICAgICAgICAgICAgICRuZXd2YWwgPSAkdmFsIC0gJG1lYW47CiAgICAgICAgICAgICAgICAkYXJyWyIkbmV3dmFsIl0gPSAkZnJlcTsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGZvcmVhY2ggKCR0aGlzLT5fZGF0YSBhcyAkdmFsKSB7CiAgICAgICAgICAgICAgICAkbmV3dmFsID0gJHZhbCAtICRtZWFuOwogICAgICAgICAgICAgICAgJGFycltdID0gJG5ld3ZhbDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gJHRoaXMtPnNldERhdGEoJGFyciwgJHRoaXMtPl9kYXRhT3B0aW9uKTsKICAgIH0vKn19fSovCgogICAgLyoqCiAgICAgKiBDYWxjdWxhdGVzIHRoZSBiYXNpYyBvciBmdWxsIHN0YXRpc3RpY3MgZm9yIHRoZSBkYXRhIHNldAogICAgICoKICAgICAqIEBhY2Nlc3MgIHB1YmxpYwogICAgICogQHBhcmFtICAgaW50ICRtb2RlICAgb25lIG9mIFNUQVRTX0JBU0lDIG9yIFNUQVRTX0ZVTEwKICAgICAqIEBwYXJhbSBib29sZWFuICRyZXR1cm5FcnJvck9iamVjdCB3aGV0aGVyIHRoZSByYXcgUEVBUl9FcnJvciAod2hlbiB0cnVlLCBkZWZhdWx0KSwKICAgICAqICAgICAgICAgICAgICAgICAgb3Igb25seSB0aGUgZXJyb3IgbWVzc2FnZSB3aWxsIGJlIHJldHVybmVkICh3aGVuIGZhbHNlKSwgaWYgYW4gZXJyb3IgaGFwcGVucy4KICAgICAqIEByZXR1cm4gIG1peGVkICAgYW4gYXNzb2NpYXRpdmUgYXJyYXkgb2Ygc3RhdGlzdGljcyBvbiBzdWNjZXNzLCBhIFBFQVJfRXJyb3Igb2JqZWN0IG90aGVyd2lzZQogICAgICogQHNlZSBjYWxjQmFzaWMoKQogICAgICogQHNlZSBjYWxjRnVsbCgpCiAgICAgKi8KICAgIGZ1bmN0aW9uIGNhbGMoJG1vZGUsICRyZXR1cm5FcnJvck9iamVjdD10cnVlKSB7Lyp7e3sqLwogICAgICAgIGlmICgkdGhpcy0+X2RhdGEgPT0gbnVsbCkgewogICAgICAgICAgICByZXR1cm4gUEVBUjo6cmFpc2VFcnJvcignZGF0YSBoYXMgbm90IGJlZW4gc2V0Jyk7CiAgICAgICAgfQogICAgICAgIGlmICgkbW9kZSA9PSBTVEFUU19CQVNJQykgewogICAgICAgICAgICByZXR1cm4gJHRoaXMtPmNhbGNCYXNpYygkcmV0dXJuRXJyb3JPYmplY3QpOwogICAgICAgIH0gZWxzZWlmICgkbW9kZSA9PSBTVEFUU19GVUxMKSB7CiAgICAgICAgICAgIHJldHVybiAkdGhpcy0+Y2FsY0Z1bGwoJHJldHVybkVycm9yT2JqZWN0KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gUEVBUjo6cmFpc2VFcnJvcignaW5jb3JyZWN0IG1vZGUsIGV4cGVjdGVkIFNUQVRTX0JBU0lDIG9yIFNUQVRTX0ZVTEwnKTsKICAgICAgICB9CiAgICB9Lyp9fX0qLwoKICAgIC8qKgogICAgICogQ2FsY3VsYXRlcyBhIGJhc2ljIHNldCBvZiBzdGF0aXN0aWNzCiAgICAgKgogICAgICogQGFjY2VzcyAgcHVibGljCiAgICAgKiBAcGFyYW0gYm9vbGVhbiAkcmV0dXJuRXJyb3JPYmplY3Qgd2hldGhlciB0aGUgcmF3IFBFQVJfRXJyb3IgKHdoZW4gdHJ1ZSwgZGVmYXVsdCksCiAgICAgKiAgICAgICAgICAgICAgICAgIG9yIG9ubHkgdGhlIGVycm9yIG1lc3NhZ2Ugd2lsbCBiZSByZXR1cm5lZCAod2hlbiBmYWxzZSksIGlmIGFuIGVycm9yIGhhcHBlbnMuCiAgICAgKiBAcmV0dXJuICBtaXhlZCAgIGFuIGFzc29jaWF0aXZlIGFycmF5IG9mIHN0YXRpc3RpY3Mgb24gc3VjY2VzcywgYSBQRUFSX0Vycm9yIG9iamVjdCBvdGhlcndpc2UKICAgICAqIEBzZWUgY2FsYygpCiAgICAgKiBAc2VlIGNhbGNGdWxsKCkKICAgICAqLwogICAgZnVuY3Rpb24gY2FsY0Jhc2ljKCRyZXR1cm5FcnJvck9iamVjdD10cnVlKSB7Lyp7e3sqLwogICAgICAgICAgICByZXR1cm4gYXJyYXkgKAogICAgICAgICAgICAgICAgJ21pbicgPT4gJHRoaXMtPl9fZm9ybWF0KCR0aGlzLT5taW4oKSwgJHJldHVybkVycm9yT2JqZWN0KSwKICAgICAgICAgICAgICAgICdtYXgnID0+ICR0aGlzLT5fX2Zvcm1hdCgkdGhpcy0+bWF4KCksICRyZXR1cm5FcnJvck9iamVjdCksCiAgICAgICAgICAgICAgICAnc3VtJyA9PiAkdGhpcy0+X19mb3JtYXQoJHRoaXMtPnN1bSgpLCAkcmV0dXJuRXJyb3JPYmplY3QpLAogICAgICAgICAgICAgICAgJ3N1bTInID0+ICR0aGlzLT5fX2Zvcm1hdCgkdGhpcy0+c3VtMigpLCAkcmV0dXJuRXJyb3JPYmplY3QpLAogICAgICAgICAgICAgICAgJ2NvdW50JyA9PiAkdGhpcy0+X19mb3JtYXQoJHRoaXMtPmNvdW50KCksICRyZXR1cm5FcnJvck9iamVjdCksCiAgICAgICAgICAgICAgICAnbWVhbicgPT4gJHRoaXMtPl9fZm9ybWF0KCR0aGlzLT5tZWFuKCksICRyZXR1cm5FcnJvck9iamVjdCksCiAgICAgICAgICAgICAgICAnc3RkZXYnID0+ICR0aGlzLT5fX2Zvcm1hdCgkdGhpcy0+c3REZXYoKSwgJHJldHVybkVycm9yT2JqZWN0KSwKICAgICAgICAgICAgICAgICd2YXJpYW5jZScgPT4gJHRoaXMtPl9fZm9ybWF0KCR0aGlzLT52YXJpYW5jZSgpLCAkcmV0dXJuRXJyb3JPYmplY3QpLAogICAgICAgICAgICAgICAgJ3JhbmdlJyA9PiAkdGhpcy0+X19mb3JtYXQoJHRoaXMtPnJhbmdlKCksICRyZXR1cm5FcnJvck9iamVjdCkKICAgICAgICAgICAgKTsKICAgIH0vKn19fSovCgogICAgLyoqCiAgICAgKiBDYWxjdWxhdGVzIGEgZnVsbCBzZXQgb2Ygc3RhdGlzdGljcwogICAgICoKICAgICAqIEBhY2Nlc3MgIHB1YmxpYwogICAgICogQHBhcmFtIGJvb2xlYW4gJHJldHVybkVycm9yT2JqZWN0IHdoZXRoZXIgdGhlIHJhdyBQRUFSX0Vycm9yICh3aGVuIHRydWUsIGRlZmF1bHQpLAogICAgICogICAgICAgICAgICAgICAgICBvciBvbmx5IHRoZSBlcnJvciBtZXNzYWdlIHdpbGwgYmUgcmV0dXJuZWQgKHdoZW4gZmFsc2UpLCBpZiBhbiBlcnJvciBoYXBwZW5zLgogICAgICogQHJldHVybiAgbWl4ZWQgICBhbiBhc3NvY2lhdGl2ZSBhcnJheSBvZiBzdGF0aXN0aWNzIG9uIHN1Y2Nlc3MsIGEgUEVBUl9FcnJvciBvYmplY3Qgb3RoZXJ3aXNlCiAgICAgKiBAc2VlIGNhbGMoKQogICAgICogQHNlZSBjYWxjQmFzaWMoKQogICAgICovCiAgICBmdW5jdGlvbiBjYWxjRnVsbCgkcmV0dXJuRXJyb3JPYmplY3Q9dHJ1ZSkgey8qe3t7Ki8KICAgICAgICAgICAgcmV0dXJuIGFycmF5ICgKICAgICAgICAgICAgICAgICdtaW4nID0+ICR0aGlzLT5fX2Zvcm1hdCgkdGhpcy0+bWluKCksICRyZXR1cm5FcnJvck9iamVjdCksCiAgICAgICAgICAgICAgICAnbWF4JyA9PiAkdGhpcy0+X19mb3JtYXQoJHRoaXMtPm1heCgpLCAkcmV0dXJuRXJyb3JPYmplY3QpLAogICAgICAgICAgICAgICAgJ3N1bScgPT4gJHRoaXMtPl9fZm9ybWF0KCR0aGlzLT5zdW0oKSwgJHJldHVybkVycm9yT2JqZWN0KSwKICAgICAgICAgICAgICAgICdzdW0yJyA9PiAkdGhpcy0+X19mb3JtYXQoJHRoaXMtPnN1bTIoKSwgJHJldHVybkVycm9yT2JqZWN0KSwKICAgICAgICAgICAgICAgICdjb3VudCcgPT4gJHRoaXMtPl9fZm9ybWF0KCR0aGlzLT5jb3VudCgpLCAkcmV0dXJuRXJyb3JPYmplY3QpLAogICAgICAgICAgICAgICAgJ21lYW4nID0+ICR0aGlzLT5fX2Zvcm1hdCgkdGhpcy0+bWVhbigpLCAkcmV0dXJuRXJyb3JPYmplY3QpLAogICAgICAgICAgICAgICAgJ21lZGlhbicgPT4gJHRoaXMtPl9fZm9ybWF0KCR0aGlzLT5tZWRpYW4oKSwgJHJldHVybkVycm9yT2JqZWN0KSwKICAgICAgICAgICAgICAgICdtb2RlJyA9PiAkdGhpcy0+X19mb3JtYXQoJHRoaXMtPm1vZGUoKSwgJHJldHVybkVycm9yT2JqZWN0KSwKICAgICAgICAgICAgICAgICdtaWRyYW5nZScgPT4gJHRoaXMtPl9fZm9ybWF0KCR0aGlzLT5taWRyYW5nZSgpLCAkcmV0dXJuRXJyb3JPYmplY3QpLAogICAgICAgICAgICAgICAgJ2dlb21ldHJpY19tZWFuJyA9PiAkdGhpcy0+X19mb3JtYXQoJHRoaXMtPmdlb21ldHJpY01lYW4oKSwgJHJldHVybkVycm9yT2JqZWN0KSwKICAgICAgICAgICAgICAgICdoYXJtb25pY19tZWFuJyA9PiAkdGhpcy0+X19mb3JtYXQoJHRoaXMtPmhhcm1vbmljTWVhbigpLCAkcmV0dXJuRXJyb3JPYmplY3QpLAogICAgICAgICAgICAgICAgJ3N0ZGV2JyA9PiAkdGhpcy0+X19mb3JtYXQoJHRoaXMtPnN0RGV2KCksICRyZXR1cm5FcnJvck9iamVjdCksCiAgICAgICAgICAgICAgICAnYWJzZGV2JyA9PiAkdGhpcy0+X19mb3JtYXQoJHRoaXMtPmFic0RldigpLCAkcmV0dXJuRXJyb3JPYmplY3QpLAogICAgICAgICAgICAgICAgJ3ZhcmlhbmNlJyA9PiAkdGhpcy0+X19mb3JtYXQoJHRoaXMtPnZhcmlhbmNlKCksICRyZXR1cm5FcnJvck9iamVjdCksCiAgICAgICAgICAgICAgICAncmFuZ2UnID0+ICR0aGlzLT5fX2Zvcm1hdCgkdGhpcy0+cmFuZ2UoKSwgJHJldHVybkVycm9yT2JqZWN0KSwKICAgICAgICAgICAgICAgICdzdGRfZXJyb3Jfb2ZfbWVhbicgPT4gJHRoaXMtPl9fZm9ybWF0KCR0aGlzLT5zdGRFcnJvck9mTWVhbigpLCAkcmV0dXJuRXJyb3JPYmplY3QpLAogICAgICAgICAgICAgICAgJ3NrZXduZXNzJyA9PiAkdGhpcy0+X19mb3JtYXQoJHRoaXMtPnNrZXduZXNzKCksICRyZXR1cm5FcnJvck9iamVjdCksCiAgICAgICAgICAgICAgICAna3VydG9zaXMnID0+ICR0aGlzLT5fX2Zvcm1hdCgkdGhpcy0+a3VydG9zaXMoKSwgJHJldHVybkVycm9yT2JqZWN0KSwKICAgICAgICAgICAgICAgICdjb2VmZl9vZl92YXJpYXRpb24nID0+ICR0aGlzLT5fX2Zvcm1hdCgkdGhpcy0+Y29lZmZPZlZhcmlhdGlvbigpLCAkcmV0dXJuRXJyb3JPYmplY3QpLAogICAgICAgICAgICAgICAgJ3NhbXBsZV9jZW50cmFsX21vbWVudHMnID0+IGFycmF5ICgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgPT4gJHRoaXMtPl9fZm9ybWF0KCR0aGlzLT5zYW1wbGVDZW50cmFsTW9tZW50KDEpLCAkcmV0dXJuRXJyb3JPYmplY3QpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgMiA9PiAkdGhpcy0+X19mb3JtYXQoJHRoaXMtPnNhbXBsZUNlbnRyYWxNb21lbnQoMiksICRyZXR1cm5FcnJvck9iamVjdCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAzID0+ICR0aGlzLT5fX2Zvcm1hdCgkdGhpcy0+c2FtcGxlQ2VudHJhbE1vbWVudCgzKSwgJHJldHVybkVycm9yT2JqZWN0KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQgPT4gJHRoaXMtPl9fZm9ybWF0KCR0aGlzLT5zYW1wbGVDZW50cmFsTW9tZW50KDQpLCAkcmV0dXJuRXJyb3JPYmplY3QpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgNSA9PiAkdGhpcy0+X19mb3JtYXQoJHRoaXMtPnNhbXBsZUNlbnRyYWxNb21lbnQoNSksICRyZXR1cm5FcnJvck9iamVjdCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAnc2FtcGxlX3Jhd19tb21lbnRzJyA9PiBhcnJheSAoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAxID0+ICR0aGlzLT5fX2Zvcm1hdCgkdGhpcy0+c2FtcGxlUmF3TW9tZW50KDEpLCAkcmV0dXJuRXJyb3JPYmplY3QpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgMiA9PiAkdGhpcy0+X19mb3JtYXQoJHRoaXMtPnNhbXBsZVJhd01vbWVudCgyKSwgJHJldHVybkVycm9yT2JqZWN0KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMgPT4gJHRoaXMtPl9fZm9ybWF0KCR0aGlzLT5zYW1wbGVSYXdNb21lbnQoMyksICRyZXR1cm5FcnJvck9iamVjdCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA0ID0+ICR0aGlzLT5fX2Zvcm1hdCgkdGhpcy0+c2FtcGxlUmF3TW9tZW50KDQpLCAkcmV0dXJuRXJyb3JPYmplY3QpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgNSA9PiAkdGhpcy0+X19mb3JtYXQoJHRoaXMtPnNhbXBsZVJhd01vbWVudCg1KSwgJHJldHVybkVycm9yT2JqZWN0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICdmcmVxdWVuY3knID0+ICR0aGlzLT5fX2Zvcm1hdCgkdGhpcy0+ZnJlcXVlbmN5KCksICRyZXR1cm5FcnJvck9iamVjdCksCiAgICAgICAgICAgICAgICAncXVhcnRpbGVzJyA9PiAkdGhpcy0+X19mb3JtYXQoJHRoaXMtPnF1YXJ0aWxlcygpLCAkcmV0dXJuRXJyb3JPYmplY3QpLAogICAgICAgICAgICAgICAgJ2ludGVycXVhcnRpbGVfcmFuZ2UnID0+ICR0aGlzLT5fX2Zvcm1hdCgkdGhpcy0+aW50ZXJxdWFydGlsZVJhbmdlKCksICRyZXR1cm5FcnJvck9iamVjdCksCiAgICAgICAgICAgICAgICAnaW50ZXJxdWFydGlsZV9tZWFuJyA9PiAkdGhpcy0+X19mb3JtYXQoJHRoaXMtPmludGVycXVhcnRpbGVNZWFuKCksICRyZXR1cm5FcnJvck9iamVjdCksCiAgICAgICAgICAgICAgICAncXVhcnRpbGVfZGV2aWF0aW9uJyA9PiAkdGhpcy0+X19mb3JtYXQoJHRoaXMtPnF1YXJ0aWxlRGV2aWF0aW9uKCksICRyZXR1cm5FcnJvck9iamVjdCksCiAgICAgICAgICAgICAgICAncXVhcnRpbGVfdmFyaWF0aW9uX2NvZWZmaWNpZW50JyA9PiAkdGhpcy0+X19mb3JtYXQoJHRoaXMtPnF1YXJ0aWxlVmFyaWF0aW9uQ29lZmZpY2llbnQoKSwgJHJldHVybkVycm9yT2JqZWN0KSwKICAgICAgICAgICAgICAgICdxdWFydGlsZV9za2V3bmVzc19jb2VmZmljaWVudCcgPT4gJHRoaXMtPl9fZm9ybWF0KCR0aGlzLT5xdWFydGlsZVNrZXduZXNzQ29lZmZpY2llbnQoKSwgJHJldHVybkVycm9yT2JqZWN0KQogICAgICAgICAgICApOwogICAgfS8qfX19Ki8KCiAgICAvKioKICAgICAqIENhbGN1bGF0ZXMgdGhlIG1pbmltdW0gb2YgYSBkYXRhIHNldC4KICAgICAqIEhhbmRsZXMgY3VtbXVsYXRpdmUgZGF0YSBzZXRzIGNvcnJlY3RseQogICAgICoKICAgICAqIEBhY2Nlc3MgIHB1YmxpYwogICAgICogQHJldHVybiAgbWl4ZWQgICB0aGUgbWluaW11bSB2YWx1ZSBvbiBzdWNjZXNzLCBhIFBFQVJfRXJyb3Igb2JqZWN0IG90aGVyd2lzZQogICAgICogQHNlZSBjYWxjKCkKICAgICAqIEBzZWUgbWF4KCkKICAgICAqLwogICAgZnVuY3Rpb24gbWluKCkgey8qe3t7Ki8KICAgICAgICBpZiAoJHRoaXMtPl9kYXRhID09IG51bGwpIHsKICAgICAgICAgICAgcmV0dXJuIFBFQVI6OnJhaXNlRXJyb3IoJ2RhdGEgaGFzIG5vdCBiZWVuIHNldCcpOwogICAgICAgIH0KICAgICAgICBpZiAoIWFycmF5X2tleV9leGlzdHMoJ21pbicsICR0aGlzLT5fY2FsY3VsYXRlZFZhbHVlcykpIHsKICAgICAgICAgICAgaWYgKCR0aGlzLT5fZGF0YU9wdGlvbiA9PSBTVEFUU19EQVRBX0NVTU1VTEFUSVZFKSB7CiAgICAgICAgICAgICAgICAkbWluID0gbWluKGFycmF5X2tleXMoJHRoaXMtPl9kYXRhKSk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAkbWluID0gbWluKCR0aGlzLT5fZGF0YSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJHRoaXMtPl9jYWxjdWxhdGVkVmFsdWVzWydtaW4nXSA9ICRtaW47CiAgICAgICAgfQogICAgICAgIHJldHVybiAkdGhpcy0+X2NhbGN1bGF0ZWRWYWx1ZXNbJ21pbiddOwogICAgfS8qfX19Ki8KCiAgICAvKioKICAgICAqIENhbGN1bGF0ZXMgdGhlIG1heGltdW0gb2YgYSBkYXRhIHNldC4KICAgICAqIEhhbmRsZXMgY3VtbXVsYXRpdmUgZGF0YSBzZXRzIGNvcnJlY3RseQogICAgICoKICAgICAqIEBhY2Nlc3MgIHB1YmxpYwogICAgICogQHJldHVybiAgbWl4ZWQgICB0aGUgbWF4aW11bSB2YWx1ZSBvbiBzdWNjZXNzLCBhIFBFQVJfRXJyb3Igb2JqZWN0IG90aGVyd2lzZQogICAgICogQHNlZSBjYWxjKCkKICAgICAqIEBzZWUgbWluKCkKICAgICAqLwogICAgZnVuY3Rpb24gbWF4KCkgey8qe3t7Ki8KICAgICAgICBpZiAoJHRoaXMtPl9kYXRhID09IG51bGwpIHsKICAgICAgICAgICAgcmV0dXJuIFBFQVI6OnJhaXNlRXJyb3IoJ2RhdGEgaGFzIG5vdCBiZWVuIHNldCcpOwogICAgICAgIH0KICAgICAgICBpZiAoIWFycmF5X2tleV9leGlzdHMoJ21heCcsICR0aGlzLT5fY2FsY3VsYXRlZFZhbHVlcykpIHsKICAgICAgICAgICAgaWYgKCR0aGlzLT5fZGF0YU9wdGlvbiA9PSBTVEFUU19EQVRBX0NVTU1VTEFUSVZFKSB7CiAgICAgICAgICAgICAgICAkbWF4ID0gbWF4KGFycmF5X2tleXMoJHRoaXMtPl9kYXRhKSk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAkbWF4ID0gbWF4KCR0aGlzLT5fZGF0YSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJHRoaXMtPl9jYWxjdWxhdGVkVmFsdWVzWydtYXgnXSA9ICRtYXg7CiAgICAgICAgfQogICAgICAgIHJldHVybiAkdGhpcy0+X2NhbGN1bGF0ZWRWYWx1ZXNbJ21heCddOwogICAgfS8qfX19Ki8KCiAgICAvKioKICAgICAqIENhbGN1bGF0ZXMgU1VNIHsgeGkgfQogICAgICogSGFuZGxlcyBjdW1tdWxhdGl2ZSBkYXRhIHNldHMgY29ycmVjdGx5CiAgICAgKgogICAgICogQGFjY2VzcyAgcHVibGljCiAgICAgKiBAcmV0dXJuICBtaXhlZCAgIHRoZSBzdW0gb24gc3VjY2VzcywgYSBQRUFSX0Vycm9yIG9iamVjdCBvdGhlcndpc2UKICAgICAqIEBzZWUgY2FsYygpCiAgICAgKiBAc2VlIHN1bTIoKQogICAgICogQHNlZSBzdW1OKCkKICAgICAqLwogICAgZnVuY3Rpb24gc3VtKCkgey8qe3t7Ki8KICAgICAgICBpZiAoIWFycmF5X2tleV9leGlzdHMoJ3N1bScsICR0aGlzLT5fY2FsY3VsYXRlZFZhbHVlcykpIHsKICAgICAgICAgICAgJHN1bSA9ICR0aGlzLT5zdW1OKDEpOwogICAgICAgICAgICBpZiAoUEVBUjo6aXNFcnJvcigkc3VtKSkgewogICAgICAgICAgICAgICAgcmV0dXJuICRzdW07CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAkdGhpcy0+X2NhbGN1bGF0ZWRWYWx1ZXNbJ3N1bSddID0gJHN1bTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gJHRoaXMtPl9jYWxjdWxhdGVkVmFsdWVzWydzdW0nXTsKICAgIH0vKn19fSovCgogICAgLyoqCiAgICAgKiBDYWxjdWxhdGVzIFNVTSB7ICh4aSleMiB9CiAgICAgKiBIYW5kbGVzIGN1bW11bGF0aXZlIGRhdGEgc2V0cyBjb3JyZWN0bHkKICAgICAqCiAgICAgKiBAYWNjZXNzICBwdWJsaWMKICAgICAqIEByZXR1cm4gIG1peGVkICAgdGhlIHN1bSBvbiBzdWNjZXNzLCBhIFBFQVJfRXJyb3Igb2JqZWN0IG90aGVyd2lzZQogICAgICogQHNlZSBjYWxjKCkKICAgICAqIEBzZWUgc3VtKCkKICAgICAqIEBzZWUgc3VtTigpCiAgICAgKi8KICAgIGZ1bmN0aW9uIHN1bTIoKSB7Lyp7e3sqLwogICAgICAgIGlmICghYXJyYXlfa2V5X2V4aXN0cygnc3VtMicsICR0aGlzLT5fY2FsY3VsYXRlZFZhbHVlcykpIHsKICAgICAgICAgICAgJHN1bTIgPSAkdGhpcy0+c3VtTigyKTsKICAgICAgICAgICAgaWYgKFBFQVI6OmlzRXJyb3IoJHN1bTIpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJHN1bTI7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAkdGhpcy0+X2NhbGN1bGF0ZWRWYWx1ZXNbJ3N1bTInXSA9ICRzdW0yOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiAkdGhpcy0+X2NhbGN1bGF0ZWRWYWx1ZXNbJ3N1bTInXTsKICAgIH0vKn19fSovCgogICAgLyoqCiAgICAgKiBDYWxjdWxhdGVzIFNVTSB7ICh4aSlebiB9CiAgICAgKiBIYW5kbGVzIGN1bW11bGF0aXZlIGRhdGEgc2V0cyBjb3JyZWN0bHkKICAgICAqCiAgICAgKiBAYWNjZXNzICBwdWJsaWMKICAgICAqIEBwYXJhbSAgIG51bWVyaWMgJG4gIHRoZSBleHBvbmVudAogICAgICogQHJldHVybiAgbWl4ZWQgICB0aGUgc3VtIG9uIHN1Y2Nlc3MsIGEgUEVBUl9FcnJvciBvYmplY3Qgb3RoZXJ3aXNlCiAgICAgKiBAc2VlIGNhbGMoKQogICAgICogQHNlZSBzdW0oKQogICAgICogQHNlZSBzdW0yKCkKICAgICAqLwogICAgZnVuY3Rpb24gc3VtTigkbikgey8qe3t7Ki8KICAgICAgICBpZiAoJHRoaXMtPl9kYXRhID09IG51bGwpIHsKICAgICAgICAgICAgcmV0dXJuIFBFQVI6OnJhaXNlRXJyb3IoJ2RhdGEgaGFzIG5vdCBiZWVuIHNldCcpOwogICAgICAgIH0KICAgICAgICAkc3VtTiA9IDA7CiAgICAgICAgaWYgKCR0aGlzLT5fZGF0YU9wdGlvbiA9PSBTVEFUU19EQVRBX0NVTU1VTEFUSVZFKSB7CiAgICAgICAgICAgIGZvcmVhY2goJHRoaXMtPl9kYXRhIGFzICR2YWw9PiRmcmVxKSB7CiAgICAgICAgICAgICAgICAkc3VtTiArPSAkZnJlcSAqIHBvdygoZG91YmxlKSR2YWwsIChkb3VibGUpJG4pOwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZm9yZWFjaCgkdGhpcy0+X2RhdGEgYXMgJHZhbCkgewogICAgICAgICAgICAgICAgJHN1bU4gKz0gcG93KChkb3VibGUpJHZhbCwgKGRvdWJsZSkkbik7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuICRzdW1OOwogICAgfS8qfX19Ki8KCiAgICAvKioKICAgICAqIENhbGN1bGF0ZXMgUFJPRCB7ICh4aSkgfSwgKHRoZSBwcm9kdWN0IG9mIGFsbCBvYnNlcnZhdGlvbnMpCiAgICAgKiBIYW5kbGVzIGN1bW11bGF0aXZlIGRhdGEgc2V0cyBjb3JyZWN0bHkKICAgICAqCiAgICAgKiBAYWNjZXNzICBwdWJsaWMKICAgICAqIEByZXR1cm4gIG1peGVkICAgdGhlIHByb2R1Y3Qgb24gc3VjY2VzcywgYSBQRUFSX0Vycm9yIG9iamVjdCBvdGhlcndpc2UKICAgICAqIEBzZWUgcHJvZHVjdE4oKQogICAgICovCiAgICBmdW5jdGlvbiBwcm9kdWN0KCkgey8qe3t7Ki8KICAgICAgICBpZiAoIWFycmF5X2tleV9leGlzdHMoJ3Byb2R1Y3QnLCAkdGhpcy0+X2NhbGN1bGF0ZWRWYWx1ZXMpKSB7CiAgICAgICAgICAgICRwcm9kdWN0ID0gJHRoaXMtPnByb2R1Y3ROKDEpOwogICAgICAgICAgICBpZiAoUEVBUjo6aXNFcnJvcigkcHJvZHVjdCkpIHsKICAgICAgICAgICAgICAgIHJldHVybiAkcHJvZHVjdDsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICR0aGlzLT5fY2FsY3VsYXRlZFZhbHVlc1sncHJvZHVjdCddID0gJHByb2R1Y3Q7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuICR0aGlzLT5fY2FsY3VsYXRlZFZhbHVlc1sncHJvZHVjdCddOwogICAgfS8qfX19Ki8KCiAgICAvKioKICAgICAqIENhbGN1bGF0ZXMgUFJPRCB7ICh4aSlebiB9LCB3aGljaCBpcyB0aGUgcHJvZHVjdCBvZiBhbGwgb2JzZXJ2YXRpb25zCiAgICAgKiBIYW5kbGVzIGN1bW11bGF0aXZlIGRhdGEgc2V0cyBjb3JyZWN0bHkKICAgICAqCiAgICAgKiBAYWNjZXNzICBwdWJsaWMKICAgICAqIEBwYXJhbSAgIG51bWVyaWMgJG4gIHRoZSBleHBvbmVudAogICAgICogQHJldHVybiAgbWl4ZWQgICB0aGUgcHJvZHVjdCBvbiBzdWNjZXNzLCBhIFBFQVJfRXJyb3Igb2JqZWN0IG90aGVyd2lzZQogICAgICogQHNlZSBwcm9kdWN0KCkKICAgICAqLwogICAgZnVuY3Rpb24gcHJvZHVjdE4oJG4pIHsvKnt7eyovCiAgICAgICAgaWYgKCR0aGlzLT5fZGF0YSA9PSBudWxsKSB7CiAgICAgICAgICAgIHJldHVybiBQRUFSOjpyYWlzZUVycm9yKCdkYXRhIGhhcyBub3QgYmVlbiBzZXQnKTsKICAgICAgICB9CiAgICAgICAgJHByb2ROID0gMS4wOwogICAgICAgIGlmICgkdGhpcy0+X2RhdGFPcHRpb24gPT0gU1RBVFNfREFUQV9DVU1NVUxBVElWRSkgewogICAgICAgICAgICBmb3JlYWNoKCR0aGlzLT5fZGF0YSBhcyAkdmFsPT4kZnJlcSkgewogICAgICAgICAgICAgICAgaWYgKCR2YWwgPT0gMCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAwLjA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkcHJvZE4gKj0gJGZyZXEgKiBwb3coKGRvdWJsZSkkdmFsLCAoZG91YmxlKSRuKTsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGZvcmVhY2goJHRoaXMtPl9kYXRhIGFzICR2YWwpIHsKICAgICAgICAgICAgICAgIGlmICgkdmFsID09IDApIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gMC4wOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJHByb2ROICo9IHBvdygoZG91YmxlKSR2YWwsIChkb3VibGUpJG4pOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiAkcHJvZE47CgogICAgfS8qfX19Ki8KCiAgICAvKioKICAgICAqIENhbGN1bGF0ZXMgdGhlIG51bWJlciBvZiBkYXRhIHBvaW50cyBpbiB0aGUgc2V0CiAgICAgKiBIYW5kbGVzIGN1bW11bGF0aXZlIGRhdGEgc2V0cyBjb3JyZWN0bHkKICAgICAqCiAgICAgKiBAYWNjZXNzICBwdWJsaWMKICAgICAqIEByZXR1cm4gIG1peGVkICAgdGhlIGNvdW50IG9uIHN1Y2Nlc3MsIGEgUEVBUl9FcnJvciBvYmplY3Qgb3RoZXJ3aXNlCiAgICAgKiBAc2VlIGNhbGMoKQogICAgICovCiAgICBmdW5jdGlvbiBjb3VudCgpIHsvKnt7eyovCiAgICAgICAgaWYgKCR0aGlzLT5fZGF0YSA9PSBudWxsKSB7CiAgICAgICAgICAgIHJldHVybiBQRUFSOjpyYWlzZUVycm9yKCdkYXRhIGhhcyBub3QgYmVlbiBzZXQnKTsKICAgICAgICB9CiAgICAgICAgaWYgKCFhcnJheV9rZXlfZXhpc3RzKCdjb3VudCcsICR0aGlzLT5fY2FsY3VsYXRlZFZhbHVlcykpIHsKICAgICAgICAgICAgaWYgKCR0aGlzLT5fZGF0YU9wdGlvbiA9PSBTVEFUU19EQVRBX0NVTU1VTEFUSVZFKSB7CiAgICAgICAgICAgICAgICAkY291bnQgPSBjb3VudCgkdGhpcy0+X2RhdGFFeHBhbmRlZCk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAkY291bnQgPSBjb3VudCgkdGhpcy0+X2RhdGEpOwogICAgICAgICAgICB9CiAgICAgICAgICAgICR0aGlzLT5fY2FsY3VsYXRlZFZhbHVlc1snY291bnQnXSA9ICRjb3VudDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICR0aGlzLT5fY2FsY3VsYXRlZFZhbHVlc1snY291bnQnXTsKICAgIH0vKn19fSovCgogICAgLyoqCiAgICAgKiBDYWxjdWxhdGVzIHRoZSBtZWFuIChhdmVyYWdlKSBvZiB0aGUgZGF0YSBwb2ludHMgaW4gdGhlIHNldAogICAgICogSGFuZGxlcyBjdW1tdWxhdGl2ZSBkYXRhIHNldHMgY29ycmVjdGx5CiAgICAgKgogICAgICogQGFjY2VzcyAgcHVibGljCiAgICAgKiBAcmV0dXJuICBtaXhlZCAgIHRoZSBtZWFuIHZhbHVlIG9uIHN1Y2Nlc3MsIGEgUEVBUl9FcnJvciBvYmplY3Qgb3RoZXJ3aXNlCiAgICAgKiBAc2VlIGNhbGMoKQogICAgICogQHNlZSBzdW0oKQogICAgICogQHNlZSBjb3VudCgpCiAgICAgKi8KICAgIGZ1bmN0aW9uIG1lYW4oKSB7Lyp7e3sqLwogICAgICAgIGlmICghYXJyYXlfa2V5X2V4aXN0cygnbWVhbicsICR0aGlzLT5fY2FsY3VsYXRlZFZhbHVlcykpIHsKICAgICAgICAgICAgJHN1bSA9ICR0aGlzLT5zdW0oKTsKICAgICAgICAgICAgaWYgKFBFQVI6OmlzRXJyb3IoJHN1bSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiAkc3VtOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRjb3VudCA9ICR0aGlzLT5jb3VudCgpOwogICAgICAgICAgICBpZiAoUEVBUjo6aXNFcnJvcigkY291bnQpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJGNvdW50OwogICAgICAgICAgICB9CiAgICAgICAgICAgICR0aGlzLT5fY2FsY3VsYXRlZFZhbHVlc1snbWVhbiddID0gJHN1bSAvICRjb3VudDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICR0aGlzLT5fY2FsY3VsYXRlZFZhbHVlc1snbWVhbiddOwogICAgfS8qfX19Ki8KCiAgICAvKioKICAgICAqIENhbGN1bGF0ZXMgdGhlIHJhbmdlIG9mIHRoZSBkYXRhIHNldCA9IG1heCAtIG1pbgogICAgICoKICAgICAqIEBhY2Nlc3MgcHVibGljCiAgICAgKiBAcmV0dXJuIG1peGVkIHRoZSB2YWx1ZSBvZiB0aGUgcmFuZ2Ugb24gc3VjY2VzcywgYSBQRUFSX0Vycm9yIG9iamVjdCBvdGhlcndpc2UuCiAgICAgKi8KICAgIGZ1bmN0aW9uIHJhbmdlKCkgey8qe3t7Ki8KICAgICAgICBpZiAoIWFycmF5X2tleV9leGlzdHMoJ3JhbmdlJywgJHRoaXMtPl9jYWxjdWxhdGVkVmFsdWVzKSkgewogICAgICAgICAgICAkbWluID0gJHRoaXMtPm1pbigpOwogICAgICAgICAgICBpZiAoUEVBUjo6aXNFcnJvcigkbWluKSkgewogICAgICAgICAgICAgICAgcmV0dXJuICRtaW47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJG1heCA9ICR0aGlzLT5tYXgoKTsKICAgICAgICAgICAgaWYgKFBFQVI6OmlzRXJyb3IoJG1heCkpIHsKICAgICAgICAgICAgICAgIHJldHVybiAkbWF4OwogICAgICAgICAgICB9CiAgICAgICAgICAgICR0aGlzLT5fY2FsY3VsYXRlZFZhbHVlc1sncmFuZ2UnXSA9ICRtYXggLSAkbWluOwogICAgICAgIH0KICAgICAgICByZXR1cm4gJHRoaXMtPl9jYWxjdWxhdGVkVmFsdWVzWydyYW5nZSddOwoKICAgIH0vKn19fSovCgogICAgLyoqCiAgICAgKiBDYWxjdWxhdGVzIHRoZSB2YXJpYW5jZSAodW5iaWFzZWQpIG9mIHRoZSBkYXRhIHBvaW50cyBpbiB0aGUgc2V0CiAgICAgKiBIYW5kbGVzIGN1bW11bGF0aXZlIGRhdGEgc2V0cyBjb3JyZWN0bHkKICAgICAqCiAgICAgKiBAYWNjZXNzICBwdWJsaWMKICAgICAqIEByZXR1cm4gIG1peGVkICAgdGhlIHZhcmlhbmNlIHZhbHVlIG9uIHN1Y2Nlc3MsIGEgUEVBUl9FcnJvciBvYmplY3Qgb3RoZXJ3aXNlCiAgICAgKiBAc2VlIGNhbGMoKQogICAgICogQHNlZSBfX3N1bWRpZmYoKQogICAgICogQHNlZSBjb3VudCgpCiAgICAgKi8KICAgIGZ1bmN0aW9uIHZhcmlhbmNlKCkgey8qe3t7Ki8KICAgICAgICBpZiAoIWFycmF5X2tleV9leGlzdHMoJ3ZhcmlhbmNlJywgJHRoaXMtPl9jYWxjdWxhdGVkVmFsdWVzKSkgewogICAgICAgICAgICAkdmFyaWFuY2UgPSAkdGhpcy0+X19jYWxjVmFyaWFuY2UoKTsKICAgICAgICAgICAgaWYgKFBFQVI6OmlzRXJyb3IoJHZhcmlhbmNlKSkgewogICAgICAgICAgICAgICAgcmV0dXJuICR2YXJpYW5jZTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkdGhpcy0+X2NhbGN1bGF0ZWRWYWx1ZXNbJ3ZhcmlhbmNlJ10gPSAkdmFyaWFuY2U7CiAgICAgICAgfQogICAgICAgIHJldHVybiAkdGhpcy0+X2NhbGN1bGF0ZWRWYWx1ZXNbJ3ZhcmlhbmNlJ107CiAgICB9Lyp9fX0qLwoKICAgIC8qKgogICAgICogQ2FsY3VsYXRlcyB0aGUgc3RhbmRhcmQgZGV2aWF0aW9uICh1bmJpYXNlZCkgb2YgdGhlIGRhdGEgcG9pbnRzIGluIHRoZSBzZXQKICAgICAqIEhhbmRsZXMgY3VtbXVsYXRpdmUgZGF0YSBzZXRzIGNvcnJlY3RseQogICAgICoKICAgICAqIEBhY2Nlc3MgIHB1YmxpYwogICAgICogQHJldHVybiAgbWl4ZWQgICB0aGUgc3RhbmRhcmQgZGV2aWF0aW9uIG9uIHN1Y2Nlc3MsIGEgUEVBUl9FcnJvciBvYmplY3Qgb3RoZXJ3aXNlCiAgICAgKiBAc2VlIGNhbGMoKQogICAgICogQHNlZSB2YXJpYW5jZSgpCiAgICAgKi8KICAgIGZ1bmN0aW9uIHN0RGV2KCkgey8qe3t7Ki8KICAgICAgICBpZiAoIWFycmF5X2tleV9leGlzdHMoJ3N0RGV2JywgJHRoaXMtPl9jYWxjdWxhdGVkVmFsdWVzKSkgewogICAgICAgICAgICAkdmFyaWFuY2UgPSAkdGhpcy0+dmFyaWFuY2UoKTsKICAgICAgICAgICAgaWYgKFBFQVI6OmlzRXJyb3IoJHZhcmlhbmNlKSkgewogICAgICAgICAgICAgICAgcmV0dXJuICR2YXJpYW5jZTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkdGhpcy0+X2NhbGN1bGF0ZWRWYWx1ZXNbJ3N0RGV2J10gPSBzcXJ0KCR2YXJpYW5jZSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiAkdGhpcy0+X2NhbGN1bGF0ZWRWYWx1ZXNbJ3N0RGV2J107CiAgICB9Lyp9fX0qLwoKICAgIC8qKgogICAgICogQ2FsY3VsYXRlcyB0aGUgdmFyaWFuY2UgKHVuYmlhc2VkKSBvZiB0aGUgZGF0YSBwb2ludHMgaW4gdGhlIHNldAogICAgICogZ2l2ZW4gYSBmaXhlZCBtZWFuIChhdmVyYWdlKSB2YWx1ZS4gTm90IHVzZWQgaW4gY2FsY0Jhc2ljKCksIGNhbGNGdWxsKCkKICAgICAqIG9yIGNhbGMoKS4KICAgICAqIEhhbmRsZXMgY3VtbXVsYXRpdmUgZGF0YSBzZXRzIGNvcnJlY3RseQogICAgICoKICAgICAqIEBhY2Nlc3MgIHB1YmxpYwogICAgICogQHBhcmFtICAgbnVtZXJpYyAkbWVhbiAgIHRoZSBmaXhlZCBtZWFuIHZhbHVlCiAgICAgKiBAcmV0dXJuICBtaXhlZCAgIHRoZSB2YXJpYW5jZSBvbiBzdWNjZXNzLCBhIFBFQVJfRXJyb3Igb2JqZWN0IG90aGVyd2lzZQogICAgICogQHNlZSBfX3N1bWRpZmYoKQogICAgICogQHNlZSBjb3VudCgpCiAgICAgKiBAc2VlIHZhcmlhbmNlKCkKICAgICAqLwogICAgZnVuY3Rpb24gdmFyaWFuY2VXaXRoTWVhbigkbWVhbikgey8qe3t7Ki8KICAgICAgICByZXR1cm4gJHRoaXMtPl9fY2FsY1ZhcmlhbmNlKCRtZWFuKTsKICAgIH0vKn19fSovCgogICAgLyoqCiAgICAgKiBDYWxjdWxhdGVzIHRoZSBzdGFuZGFyZCBkZXZpYXRpb24gKHVuYmlhc2VkKSBvZiB0aGUgZGF0YSBwb2ludHMgaW4gdGhlIHNldAogICAgICogZ2l2ZW4gYSBmaXhlZCBtZWFuIChhdmVyYWdlKSB2YWx1ZS4gTm90IHVzZWQgaW4gY2FsY0Jhc2ljKCksIGNhbGNGdWxsKCkKICAgICAqIG9yIGNhbGMoKS4KICAgICAqIEhhbmRsZXMgY3VtbXVsYXRpdmUgZGF0YSBzZXRzIGNvcnJlY3RseQogICAgICoKICAgICAqIEBhY2Nlc3MgIHB1YmxpYwogICAgICogQHBhcmFtICAgbnVtZXJpYyAkbWVhbiAgIHRoZSBmaXhlZCBtZWFuIHZhbHVlCiAgICAgKiBAcmV0dXJuICBtaXhlZCAgIHRoZSBzdGFuZGFyZCBkZXZpYXRpb24gb24gc3VjY2VzcywgYSBQRUFSX0Vycm9yIG9iamVjdCBvdGhlcndpc2UKICAgICAqIEBzZWUgdmFyaWFuY2VXaXRoTWVhbigpCiAgICAgKiBAc2VlIHN0RGV2KCkKICAgICAqLwogICAgZnVuY3Rpb24gc3REZXZXaXRoTWVhbigkbWVhbikgey8qe3t7Ki8KICAgICAgICAkdmFyaWFuY2VXTSA9ICR0aGlzLT52YXJpYW5jZVdpdGhNZWFuKCRtZWFuKTsKICAgICAgICBpZiAoUEVBUjo6aXNFcnJvcigkdmFyaWFuY2VXTSkpIHsKICAgICAgICAgICAgcmV0dXJuICR2YXJpYW5jZVdNOwogICAgICAgIH0KICAgICAgICByZXR1cm4gc3FydCgkdmFyaWFuY2VXTSk7CiAgICB9Lyp9fX0qLwoKICAgIC8qKgogICAgICogQ2FsY3VsYXRlcyB0aGUgYWJzb2x1dGUgZGV2aWF0aW9uIG9mIHRoZSBkYXRhIHBvaW50cyBpbiB0aGUgc2V0CiAgICAgKiBIYW5kbGVzIGN1bW11bGF0aXZlIGRhdGEgc2V0cyBjb3JyZWN0bHkKICAgICAqCiAgICAgKiBAYWNjZXNzICBwdWJsaWMKICAgICAqIEByZXR1cm4gIG1peGVkICAgdGhlIGFic29sdXRlIGRldmlhdGlvbiBvbiBzdWNjZXNzLCBhIFBFQVJfRXJyb3Igb2JqZWN0IG90aGVyd2lzZQogICAgICogQHNlZSBjYWxjKCkKICAgICAqIEBzZWUgX19zdW1hYnNkZXYoKQogICAgICogQHNlZSBjb3VudCgpCiAgICAgKiBAc2VlIGFic0RldldpdGhNZWFuKCkKICAgICAqLwogICAgZnVuY3Rpb24gYWJzRGV2KCkgey8qe3t7Ki8KICAgICAgICBpZiAoIWFycmF5X2tleV9leGlzdHMoJ2Fic0RldicsICR0aGlzLT5fY2FsY3VsYXRlZFZhbHVlcykpIHsKICAgICAgICAgICAgJGFic0RldiA9ICR0aGlzLT5fX2NhbGNBYnNvbHV0ZURldmlhdGlvbigpOwogICAgICAgICAgICBpZiAoUEVBUjo6aXNFcnJvcigkYWJzZGV2KSkgewogICAgICAgICAgICAgICAgcmV0dXJuICRhYnNkZXY7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJHRoaXMtPl9jYWxjdWxhdGVkVmFsdWVzWydhYnNEZXYnXSA9ICRhYnNEZXY7CiAgICAgICAgfQogICAgICAgIHJldHVybiAkdGhpcy0+X2NhbGN1bGF0ZWRWYWx1ZXNbJ2Fic0RldiddOwogICAgfS8qfX19Ki8KCiAgICAvKioKICAgICAqIENhbGN1bGF0ZXMgdGhlIGFic29sdXRlIGRldmlhdGlvbiBvZiB0aGUgZGF0YSBwb2ludHMgaW4gdGhlIHNldAogICAgICogZ2l2ZW4gYSBmaXhlZCBtZWFuIChhdmVyYWdlKSB2YWx1ZS4gTm90IHVzZWQgaW4gY2FsY0Jhc2ljKCksIGNhbGNGdWxsKCkKICAgICAqIG9yIGNhbGMoKS4KICAgICAqIEhhbmRsZXMgY3VtbXVsYXRpdmUgZGF0YSBzZXRzIGNvcnJlY3RseQogICAgICoKICAgICAqIEBhY2Nlc3MgIHB1YmxpYwogICAgICogQHBhcmFtICAgbnVtZXJpYyAkbWVhbiAgIHRoZSBmaXhlZCBtZWFuIHZhbHVlCiAgICAgKiBAcmV0dXJuICBtaXhlZCAgIHRoZSBhYnNvbHV0ZSBkZXZpYXRpb24gb24gc3VjY2VzcywgYSBQRUFSX0Vycm9yIG9iamVjdCBvdGhlcndpc2UKICAgICAqIEBzZWUgX19zdW1hYnNkZXYoKQogICAgICogQHNlZSBhYnNEZXYoKQogICAgICovCiAgICBmdW5jdGlvbiBhYnNEZXZXaXRoTWVhbigkbWVhbikgey8qe3t7Ki8KICAgICAgICByZXR1cm4gJHRoaXMtPl9fY2FsY0Fic29sdXRlRGV2aWF0aW9uKCRtZWFuKTsKICAgIH0vKn19fSovCgogICAgLyoqCiAgICAgKiBDYWxjdWxhdGVzIHRoZSBza2V3bmVzcyBvZiB0aGUgZGF0YSBkaXN0cmlidXRpb24gaW4gdGhlIHNldAogICAgICogVGhlIHNrZXduZXNzIG1lYXN1cmVzIHRoZSBkZWdyZWUgb2YgYXN5bW1ldHJ5IG9mIGEgZGlzdHJpYnV0aW9uLAogICAgICogYW5kIGlzIHJlbGF0ZWQgdG8gdGhlIHRoaXJkIGNlbnRyYWwgbW9tZW50IG9mIGEgZGlzdHJpYnV0aW9uLgogICAgICogQSBub3JtYWwgZGlzdHJpYnV0aW9uIGhhcyBhIHNrZXduZXNzID0gMAogICAgICogQSBkaXN0cmlidXRpb24gd2l0aCBhIHRhaWwgb2ZmIHRvd2FyZHMgdGhlIGhpZ2ggZW5kIG9mIHRoZSBzY2FsZQogICAgICogKHBvc2l0aXZlIHNrZXcpIGhhcyBhIHNrZXduZXNzID4gMAogICAgICogQSBkaXN0cmlidXRpb24gd2l0aCBhIHRhaWwgb2ZmIHRvd2FyZHMgdGhlIGxvdyBlbmQgb2YgdGhlIHNjYWxlCiAgICAgKiAobmVnYXRpdmUgc2tldykgaGFzIGEgc2tld25lc3MgPCAwCiAgICAgKiBIYW5kbGVzIGN1bW11bGF0aXZlIGRhdGEgc2V0cyBjb3JyZWN0bHkKICAgICAqCiAgICAgKiBAYWNjZXNzICBwdWJsaWMKICAgICAqIEByZXR1cm4gIG1peGVkICAgdGhlIHNrZXduZXNzIHZhbHVlIG9uIHN1Y2Nlc3MsIGEgUEVBUl9FcnJvciBvYmplY3Qgb3RoZXJ3aXNlCiAgICAgKiBAc2VlIF9fc3VtZGlmZigpCiAgICAgKiBAc2VlIGNvdW50KCkKICAgICAqIEBzZWUgc3REZXYoKQogICAgICogQHNlZSBjYWxjKCkKICAgICAqLwogICAgZnVuY3Rpb24gc2tld25lc3MoKSB7Lyp7e3sqLwogICAgICAgIGlmICghYXJyYXlfa2V5X2V4aXN0cygnc2tld25lc3MnLCAkdGhpcy0+X2NhbGN1bGF0ZWRWYWx1ZXMpKSB7CiAgICAgICAgICAgICRjb3VudCA9ICR0aGlzLT5jb3VudCgpOwogICAgICAgICAgICBpZiAoUEVBUjo6aXNFcnJvcigkY291bnQpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJGNvdW50OwogICAgICAgICAgICB9CiAgICAgICAgICAgICRzdERldiA9ICR0aGlzLT5zdERldigpOwogICAgICAgICAgICBpZiAoUEVBUjo6aXNFcnJvcigkc3REZXYpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJHN0RGV2OwogICAgICAgICAgICB9CiAgICAgICAgICAgICRzdW1kaWZmMyA9ICR0aGlzLT5fX3N1bWRpZmYoMyk7CiAgICAgICAgICAgIGlmIChQRUFSOjppc0Vycm9yKCRzdW1kaWZmMykpIHsKICAgICAgICAgICAgICAgIHJldHVybiAkc3VtZGlmZjM7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJHRoaXMtPl9jYWxjdWxhdGVkVmFsdWVzWydza2V3bmVzcyddID0gKCRzdW1kaWZmMyAvICgkY291bnQgKiBwb3coJHN0RGV2LCAzKSkpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gJHRoaXMtPl9jYWxjdWxhdGVkVmFsdWVzWydza2V3bmVzcyddOwogICAgfS8qfX19Ki8KCiAgICAvKioKICAgICAqIENhbGN1bGF0ZXMgdGhlIGt1cnRvc2lzIG9mIHRoZSBkYXRhIGRpc3RyaWJ1dGlvbiBpbiB0aGUgc2V0CiAgICAgKiBUaGUga3VydG9zaXMgbWVhc3VyZXMgdGhlIGRlZ3JlZXMgb2YgcGVha2VkbmVzcyBvZiBhIGRpc3RyaWJ1dGlvbi4KICAgICAqIEl0IGlzIGFsc28gY2FsbGVkIHRoZSAiZXhjZXNzIiBvciAiZXhjZXNzIGNvZWZmaWNpZW50IiwgYW5kIGlzCiAgICAgKiBhIG5vcm1hbGl6ZWQgZm9ybSBvZiB0aGUgZm91cnRoIGNlbnRyYWwgbW9tZW50IG9mIGEgZGlzdHJpYnV0aW9uLgogICAgICogQSBub3JtYWwgZGlzdHJpYnV0aW9ucyBoYXMga3VydG9zaXMgPSAwCiAgICAgKiBBIG5hcnJvdyBhbmQgcGVha2VkIChsZXB0b2t1cnRpYykgZGlzdHJpYnV0aW9uIGhhcyBhCiAgICAgKiBrdXJ0b3NpcyA+IDAKICAgICAqIEEgZmxhdCBhbmQgd2lkZSAocGxhdHlrdXJ0aWMpIGRpc3RyaWJ1dGlvbiBoYXMgYSBrdXJ0b3NpcyA8IDAKICAgICAqIEhhbmRsZXMgY3VtbXVsYXRpdmUgZGF0YSBzZXRzIGNvcnJlY3RseQogICAgICoKICAgICAqIEBhY2Nlc3MgIHB1YmxpYwogICAgICogQHJldHVybiAgbWl4ZWQgICB0aGUga3VydG9zaXMgdmFsdWUgb24gc3VjY2VzcywgYSBQRUFSX0Vycm9yIG9iamVjdCBvdGhlcndpc2UKICAgICAqIEBzZWUgX19zdW1kaWZmKCkKICAgICAqIEBzZWUgY291bnQoKQogICAgICogQHNlZSBzdERldigpCiAgICAgKiBAc2VlIGNhbGMoKQogICAgICovCiAgICBmdW5jdGlvbiBrdXJ0b3NpcygpIHsvKnt7eyovCiAgICAgICAgaWYgKCFhcnJheV9rZXlfZXhpc3RzKCdrdXJ0b3NpcycsICR0aGlzLT5fY2FsY3VsYXRlZFZhbHVlcykpIHsKICAgICAgICAgICAgJGNvdW50ID0gJHRoaXMtPmNvdW50KCk7CiAgICAgICAgICAgIGlmIChQRUFSOjppc0Vycm9yKCRjb3VudCkpIHsKICAgICAgICAgICAgICAgIHJldHVybiAkY291bnQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJHN0RGV2ID0gJHRoaXMtPnN0RGV2KCk7CiAgICAgICAgICAgIGlmIChQRUFSOjppc0Vycm9yKCRzdERldikpIHsKICAgICAgICAgICAgICAgIHJldHVybiAkc3REZXY7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJHN1bWRpZmY0ID0gJHRoaXMtPl9fc3VtZGlmZig0KTsKICAgICAgICAgICAgaWYgKFBFQVI6OmlzRXJyb3IoJHN1bWRpZmY0KSkgewogICAgICAgICAgICAgICAgcmV0dXJuICRzdW1kaWZmNDsKICAgICAgICAgICAgfQogICAgICAgICAgICAkdGhpcy0+X2NhbGN1bGF0ZWRWYWx1ZXNbJ2t1cnRvc2lzJ10gPSAoJHN1bWRpZmY0IC8gKCRjb3VudCAqIHBvdygkc3REZXYsIDQpKSkgLSAzOwogICAgICAgIH0KICAgICAgICByZXR1cm4gJHRoaXMtPl9jYWxjdWxhdGVkVmFsdWVzWydrdXJ0b3NpcyddOwogICAgfS8qfX19Ki8KCiAgICAvKioKICAgICAqIENhbGN1bGF0ZXMgdGhlIG1lZGlhbiBvZiBhIGRhdGEgc2V0LgogICAgICogVGhlIG1lZGlhbiBpcyB0aGUgdmFsdWUgc3VjaCB0aGF0IGhhbGYgb2YgdGhlIHBvaW50cyBhcmUgYmVsb3cgaXQKICAgICAqIGluIGEgc29ydGVkIGRhdGEgc2V0LgogICAgICogSWYgdGhlIG51bWJlciBvZiB2YWx1ZXMgaXMgb2RkLCBpdCBpcyB0aGUgbWlkZGxlIGl0ZW0uCiAgICAgKiBJZiB0aGUgbnVtYmVyIG9mIHZhbHVlcyBpcyBldmVuLCBpcyB0aGUgYXZlcmFnZSBvZiB0aGUgdHdvIG1pZGRsZSBpdGVtcy4KICAgICAqIEhhbmRsZXMgY3VtbXVsYXRpdmUgZGF0YSBzZXRzIGNvcnJlY3RseQogICAgICoKICAgICAqIEBhY2Nlc3MgIHB1YmxpYwogICAgICogQHJldHVybiAgbWl4ZWQgICB0aGUgbWVkaWFuIHZhbHVlIG9uIHN1Y2Nlc3MsIGEgUEVBUl9FcnJvciBvYmplY3Qgb3RoZXJ3aXNlCiAgICAgKiBAc2VlIGNvdW50KCkKICAgICAqIEBzZWUgY2FsYygpCiAgICAgKi8KICAgIGZ1bmN0aW9uIG1lZGlhbigpIHsvKnt7eyovCiAgICAgICAgaWYgKCR0aGlzLT5fZGF0YSA9PSBudWxsKSB7CiAgICAgICAgICAgIHJldHVybiBQRUFSOjpyYWlzZUVycm9yKCdkYXRhIGhhcyBub3QgYmVlbiBzZXQnKTsKICAgICAgICB9CiAgICAgICAgaWYgKCFhcnJheV9rZXlfZXhpc3RzKCdtZWRpYW4nLCAkdGhpcy0+X2NhbGN1bGF0ZWRWYWx1ZXMpKSB7CiAgICAgICAgICAgIGlmICgkdGhpcy0+X2RhdGFPcHRpb24gPT0gU1RBVFNfREFUQV9DVU1NVUxBVElWRSkgewogICAgICAgICAgICAgICAgJGFyciA9JiAkdGhpcy0+X2RhdGFFeHBhbmRlZDsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICRhcnIgPSYgJHRoaXMtPl9kYXRhOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRuID0gJHRoaXMtPmNvdW50KCk7CiAgICAgICAgICAgIGlmIChQRUFSOjppc0Vycm9yKCRuKSkgewogICAgICAgICAgICAgICAgcmV0dXJuICRuOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRoID0gaW50dmFsKCRuIC8gMik7CiAgICAgICAgICAgIGlmICgkbiAlIDIgPT0gMCkgewogICAgICAgICAgICAgICAgJG1lZGlhbiA9ICgkYXJyWyRoXSArICRhcnJbJGggLSAxXSkgLyAyOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgJG1lZGlhbiA9ICRhcnJbJGggKyAxXTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkdGhpcy0+X2NhbGN1bGF0ZWRWYWx1ZXNbJ21lZGlhbiddID0gJG1lZGlhbjsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICR0aGlzLT5fY2FsY3VsYXRlZFZhbHVlc1snbWVkaWFuJ107CiAgICB9Lyp9fX0qLwoKICAgIC8qKgogICAgICogQ2FsY3VsYXRlcyB0aGUgbW9kZSBvZiBhIGRhdGEgc2V0LgogICAgICogVGhlIG1vZGUgaXMgdGhlIHZhbHVlIHdpdGggdGhlIGhpZ2hlc3QgZnJlcXVlbmN5IGluIHRoZSBkYXRhIHNldC4KICAgICAqIFRoZXJlIGNhbiBiZSBtb3JlIHRoYW4gb25lIG1vZGUuCiAgICAgKiBIYW5kbGVzIGN1bW11bGF0aXZlIGRhdGEgc2V0cyBjb3JyZWN0bHkKICAgICAqCiAgICAgKiBAYWNjZXNzICBwdWJsaWMKICAgICAqIEByZXR1cm4gIG1peGVkICAgYW4gYXJyYXkgb2YgbW9kZSB2YWx1ZSBvbiBzdWNjZXNzLCBhIFBFQVJfRXJyb3Igb2JqZWN0IG90aGVyd2lzZQogICAgICogQHNlZSBmcmVxdWVuY3koKQogICAgICogQHNlZSBjYWxjKCkKICAgICAqLwogICAgZnVuY3Rpb24gbW9kZSgpIHsvKnt7eyovCiAgICAgICAgaWYgKCR0aGlzLT5fZGF0YSA9PSBudWxsKSB7CiAgICAgICAgICAgIHJldHVybiBQRUFSOjpyYWlzZUVycm9yKCdkYXRhIGhhcyBub3QgYmVlbiBzZXQnKTsKICAgICAgICB9CiAgICAgICAgaWYgKCFhcnJheV9rZXlfZXhpc3RzKCdtb2RlJywgJHRoaXMtPl9jYWxjdWxhdGVkVmFsdWVzKSkgewogICAgICAgICAgICBpZiAoJHRoaXMtPl9kYXRhT3B0aW9uID09IFNUQVRTX0RBVEFfQ1VNTVVMQVRJVkUpIHsKICAgICAgICAgICAgICAgICRhcnIgPSAkdGhpcy0+X2RhdGE7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAkYXJyID0gJHRoaXMtPmZyZXF1ZW5jeSgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGFyc29ydCgkYXJyKTsKICAgICAgICAgICAgJG1jb3VudCA9IDE7CiAgICAgICAgICAgIGZvcmVhY2ggKCRhcnIgYXMgJHZhbD0+JGZyZXEpIHsKICAgICAgICAgICAgICAgIGlmICgkbWNvdW50ID09IDEpIHsKICAgICAgICAgICAgICAgICAgICAkbW9kZSA9IGFycmF5KCR2YWwpOwogICAgICAgICAgICAgICAgICAgICRtZnJlcSA9ICRmcmVxOwogICAgICAgICAgICAgICAgICAgICsrJG1jb3VudDsKICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICgkbWZyZXEgPT0gJGZyZXEpCiAgICAgICAgICAgICAgICAgICAgJG1vZGVbXSA9ICR2YWw7CiAgICAgICAgICAgICAgICBpZiAoJG1mcmVxID4gJGZyZXEpCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJHRoaXMtPl9jYWxjdWxhdGVkVmFsdWVzWydtb2RlJ10gPSAkbW9kZTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICR0aGlzLT5fY2FsY3VsYXRlZFZhbHVlc1snbW9kZSddOwogICAgfS8qfX19Ki8KCiAgICAvKioKICAgICAqIENhbGN1bGF0ZXMgdGhlIG1pZHJhbmdlIG9mIGEgZGF0YSBzZXQuCiAgICAgKiBUaGUgbWlkcmFuZ2UgaXMgdGhlIGF2ZXJhZ2Ugb2YgdGhlIG1pbmltdW0gYW5kIG1heGltdW0gb2YgdGhlIGRhdGEgc2V0LgogICAgICogSGFuZGxlcyBjdW1tdWxhdGl2ZSBkYXRhIHNldHMgY29ycmVjdGx5CiAgICAgKgogICAgICogQGFjY2VzcyAgcHVibGljCiAgICAgKiBAcmV0dXJuICBtaXhlZCAgIHRoZSBtaWRyYW5nZSB2YWx1ZSBvbiBzdWNjZXNzLCBhIFBFQVJfRXJyb3Igb2JqZWN0IG90aGVyd2lzZQogICAgICogQHNlZSBtaW4oKQogICAgICogQHNlZSBtYXgoKQogICAgICogQHNlZSBjYWxjKCkKICAgICAqLwogICAgZnVuY3Rpb24gbWlkcmFuZ2UoKSB7Lyp7e3sqLwogICAgICAgIGlmICghYXJyYXlfa2V5X2V4aXN0cygnbWlkcmFuZ2UnLCAkdGhpcy0+X2NhbGN1bGF0ZWRWYWx1ZXMpKSB7CiAgICAgICAgICAgICRtaW4gPSAkdGhpcy0+bWluKCk7CiAgICAgICAgICAgIGlmIChQRUFSOjppc0Vycm9yKCRtaW4pKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJG1pbjsKICAgICAgICAgICAgfQogICAgICAgICAgICAkbWF4ID0gJHRoaXMtPm1heCgpOwogICAgICAgICAgICBpZiAoUEVBUjo6aXNFcnJvcigkbWF4KSkgewogICAgICAgICAgICAgICAgcmV0dXJuICRtYXg7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJHRoaXMtPl9jYWxjdWxhdGVkVmFsdWVzWydtaWRyYW5nZSddID0gKCgkbWF4ICsgJG1pbikgLyAyKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICR0aGlzLT5fY2FsY3VsYXRlZFZhbHVlc1snbWlkcmFuZ2UnXTsKICAgIH0vKn19fSovCgogICAgLyoqCiAgICAgKiBDYWxjdWxhdGVzIHRoZSBnZW9tZXRyaWNhbCBtZWFuIG9mIHRoZSBkYXRhIHBvaW50cyBpbiB0aGUgc2V0CiAgICAgKiBIYW5kbGVzIGN1bW11bGF0aXZlIGRhdGEgc2V0cyBjb3JyZWN0bHkKICAgICAqCiAgICAgKiBAYWNjZXNzIHB1YmxpYwogICAgICogQHJldHVybiBtaXhlZCB0aGUgZ2VvbWV0cmljYWwgbWVhbiB2YWx1ZSBvbiBzdWNjZXNzLCBhIFBFQVJfRXJyb3Igb2JqZWN0IG90aGVyd2lzZQogICAgICogQHNlZSBjYWxjKCkKICAgICAqIEBzZWUgcHJvZHVjdCgpCiAgICAgKiBAc2VlIGNvdW50KCkKICAgICAqLwogICAgZnVuY3Rpb24gZ2VvbWV0cmljTWVhbigpIHsvKnt7eyovCiAgICAgICAgaWYgKCFhcnJheV9rZXlfZXhpc3RzKCdnZW9tZXRyaWNNZWFuJywgJHRoaXMtPl9jYWxjdWxhdGVkVmFsdWVzKSkgewogICAgICAgICAgICAkY291bnQgPSAkdGhpcy0+Y291bnQoKTsKICAgICAgICAgICAgaWYgKFBFQVI6OmlzRXJyb3IoJGNvdW50KSkgewogICAgICAgICAgICAgICAgcmV0dXJuICRjb3VudDsKICAgICAgICAgICAgfQogICAgICAgICAgICAkcHJvZCA9ICR0aGlzLT5wcm9kdWN0KCk7CiAgICAgICAgICAgIGlmIChQRUFSOjppc0Vycm9yKCRwcm9kKSkgewogICAgICAgICAgICAgICAgcmV0dXJuICRwcm9kOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgkcHJvZCA9PSAwLjApIHsKICAgICAgICAgICAgICAgIHJldHVybiAwLjA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCRwcm9kIDwgMCkgewogICAgICAgICAgICAgICAgcmV0dXJuIFBFQVI6OnJhaXNlRXJyb3IoJ1RoZSBwcm9kdWN0IG9mIHRoZSBkYXRhIHNldCBpcyBuZWdhdGl2ZSwgZ2VvbWV0cmljIG1lYW4gdW5kZWZpbmVkLicpOwogICAgICAgICAgICB9CiAgICAgICAgICAgICR0aGlzLT5fY2FsY3VsYXRlZFZhbHVlc1snZ2VvbWV0cmljTWVhbiddID0gcG93KCRwcm9kICwgMSAvICRjb3VudCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiAkdGhpcy0+X2NhbGN1bGF0ZWRWYWx1ZXNbJ2dlb21ldHJpY01lYW4nXTsKICAgIH0vKn19fSovCgogICAgLyoqCiAgICAgKiBDYWxjdWxhdGVzIHRoZSBoYXJtb25pYyBtZWFuIG9mIHRoZSBkYXRhIHBvaW50cyBpbiB0aGUgc2V0CiAgICAgKiBIYW5kbGVzIGN1bW11bGF0aXZlIGRhdGEgc2V0cyBjb3JyZWN0bHkKICAgICAqCiAgICAgKiBAYWNjZXNzIHB1YmxpYwogICAgICogQHJldHVybiBtaXhlZCB0aGUgaGFybW9uaWMgbWVhbiB2YWx1ZSBvbiBzdWNjZXNzLCBhIFBFQVJfRXJyb3Igb2JqZWN0IG90aGVyd2lzZQogICAgICogQHNlZSBjYWxjKCkKICAgICAqIEBzZWUgY291bnQoKQogICAgICovCiAgICBmdW5jdGlvbiBoYXJtb25pY01lYW4oKSB7Lyp7e3sqLwogICAgICAgIGlmICgkdGhpcy0+X2RhdGEgPT0gbnVsbCkgewogICAgICAgICAgICByZXR1cm4gUEVBUjo6cmFpc2VFcnJvcignZGF0YSBoYXMgbm90IGJlZW4gc2V0Jyk7CiAgICAgICAgfQogICAgICAgIGlmICghYXJyYXlfa2V5X2V4aXN0cygnaGFybW9uaWNNZWFuJywgJHRoaXMtPl9jYWxjdWxhdGVkVmFsdWVzKSkgewogICAgICAgICAgICAkY291bnQgPSAkdGhpcy0+Y291bnQoKTsKICAgICAgICAgICAgaWYgKFBFQVI6OmlzRXJyb3IoJGNvdW50KSkgewogICAgICAgICAgICAgICAgcmV0dXJuICRjb3VudDsKICAgICAgICAgICAgfQogICAgICAgICAgICAkaW52c3VtID0gMC4wOwogICAgICAgICAgICBpZiAoJHRoaXMtPl9kYXRhT3B0aW9uID09IFNUQVRTX0RBVEFfQ1VNTVVMQVRJVkUpIHsKICAgICAgICAgICAgICAgIGZvcmVhY2goJHRoaXMtPl9kYXRhIGFzICR2YWw9PiRmcmVxKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCR2YWwgPT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUEVBUjo6cmFpc2VFcnJvcignY2Fubm90IGNhbGN1bGF0ZSBhICcuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2hhcm1vbmljIG1lYW4gd2l0aCBkYXRhIHZhbHVlcyBvZiB6ZXJvLicpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAkaW52c3VtICs9ICRmcmVxIC8gJHZhbDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGZvcmVhY2goJHRoaXMtPl9kYXRhIGFzICR2YWwpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoJHZhbCA9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBQRUFSOjpyYWlzZUVycm9yKCdjYW5ub3QgY2FsY3VsYXRlIGEgJy4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaGFybW9uaWMgbWVhbiB3aXRoIGRhdGEgdmFsdWVzIG9mIHplcm8uJyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICRpbnZzdW0gKz0gMSAvICR2YWw7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJHRoaXMtPl9jYWxjdWxhdGVkVmFsdWVzWydoYXJtb25pY01lYW4nXSA9ICRjb3VudCAvICRpbnZzdW07CiAgICAgICAgfQogICAgICAgIHJldHVybiAkdGhpcy0+X2NhbGN1bGF0ZWRWYWx1ZXNbJ2hhcm1vbmljTWVhbiddOwogICAgfS8qfX19Ki8KCiAgICAvKioKICAgICAqIENhbGN1bGF0ZXMgdGhlIG50aCBjZW50cmFsIG1vbWVudCAobXtufSkgb2YgYSBkYXRhIHNldC4KICAgICAqCiAgICAgKiBUaGUgZGVmaW5pdGlvbiBvZiBhIHNhbXBsZSBjZW50cmFsIG1vbWVudCBpczoKICAgICAqCiAgICAgKiAgICAgbXtufSA9IDEvTiAqIFNVTSB7ICh4aSAtIGF2ZylebiB9CiAgICAgKgogICAgICogd2hlcmU6IE4gPSBzYW1wbGUgc2l6ZSwgYXZnID0gc2FtcGxlIG1lYW4uCiAgICAgKgogICAgICogQGFjY2VzcyBwdWJsaWMKICAgICAqIEBwYXJhbSBpbnRlZ2VyICRuIG1vbWVudCB0byBjYWxjdWxhdGUKICAgICAqIEByZXR1cm4gbWl4ZWQgdGhlIG51bWVyaWMgdmFsdWUgb2YgdGhlIG1vbWVudCBvbiBzdWNjZXNzLCBQRUFSX0Vycm9yIG90aGVyd2lzZQogICAgICovCiAgICBmdW5jdGlvbiBzYW1wbGVDZW50cmFsTW9tZW50KCRuKSB7Lyp7e3sqLwogICAgICAgIGlmICghaXNfaW50KCRuKSB8fCAkbiA8IDEpIHsKICAgICAgICAgICAgcmV0dXJuIFBFQVI6OmlzRXJyb3IoJ21vbWVudCBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlciA+PSAxLicpOwogICAgICAgIH0KCiAgICAgICAgaWYgKCRuID09IDEpIHsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgICAgICRjb3VudCA9ICR0aGlzLT5jb3VudCgpOwogICAgICAgIGlmIChQRUFSOjppc0Vycm9yKCRjb3VudCkpIHsKICAgICAgICAgICAgcmV0dXJuICRjb3VudDsKICAgICAgICB9CiAgICAgICAgaWYgKCRjb3VudCA9PSAwKSB7CiAgICAgICAgICAgIHJldHVybiBQRUFSOjpyYWlzZUVycm9yKCJDYW5ub3QgY2FsY3VsYXRlIHskbn10aCBzYW1wbGUgbW9tZW50LCAiLgogICAgICAgICAgICAgICAgICAgICd0aGVyZSBhcmUgemVybyBkYXRhIGVudHJpZXMnKTsKICAgICAgICB9CiAgICAgICAgJHN1bSA9ICR0aGlzLT5fX3N1bWRpZmYoJG4pOwogICAgICAgIGlmIChQRUFSOjppc0Vycm9yKCRzdW0pKSB7CiAgICAgICAgICAgIHJldHVybiAkc3VtOwogICAgICAgIH0KICAgICAgICByZXR1cm4gKCRzdW0gLyAkY291bnQpOwogICAgfS8qfX19Ki8KCiAgICAvKioKICAgICAqIENhbGN1bGF0ZXMgdGhlIG50aCByYXcgbW9tZW50IChte259KSBvZiBhIGRhdGEgc2V0LgogICAgICoKICAgICAqIFRoZSBkZWZpbml0aW9uIG9mIGEgc2FtcGxlIGNlbnRyYWwgbW9tZW50IGlzOgogICAgICoKICAgICAqICAgICBte259ID0gMS9OICogU1VNIHsgeGlebiB9CiAgICAgKgogICAgICogd2hlcmU6IE4gPSBzYW1wbGUgc2l6ZSwgYXZnID0gc2FtcGxlIG1lYW4uCiAgICAgKgogICAgICogQGFjY2VzcyBwdWJsaWMKICAgICAqIEBwYXJhbSBpbnRlZ2VyICRuIG1vbWVudCB0byBjYWxjdWxhdGUKICAgICAqIEByZXR1cm4gbWl4ZWQgdGhlIG51bWVyaWMgdmFsdWUgb2YgdGhlIG1vbWVudCBvbiBzdWNjZXNzLCBQRUFSX0Vycm9yIG90aGVyd2lzZQogICAgICovCiAgICBmdW5jdGlvbiBzYW1wbGVSYXdNb21lbnQoJG4pIHsvKnt7eyovCiAgICAgICAgaWYgKCFpc19pbnQoJG4pIHx8ICRuIDwgMSkgewogICAgICAgICAgICByZXR1cm4gUEVBUjo6aXNFcnJvcignbW9tZW50IG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyID49IDEuJyk7CiAgICAgICAgfQoKICAgICAgICAkY291bnQgPSAkdGhpcy0+Y291bnQoKTsKICAgICAgICBpZiAoUEVBUjo6aXNFcnJvcigkY291bnQpKSB7CiAgICAgICAgICAgIHJldHVybiAkY291bnQ7CiAgICAgICAgfQogICAgICAgIGlmICgkY291bnQgPT0gMCkgewogICAgICAgICAgICByZXR1cm4gUEVBUjo6cmFpc2VFcnJvcigiQ2Fubm90IGNhbGN1bGF0ZSB7JG59dGggcmF3IG1vbWVudCwgIi4KICAgICAgICAgICAgICAgICAgICAndGhlcmUgYXJlIHplcm8gZGF0YSBlbnRyaWVzLicpOwogICAgICAgIH0KICAgICAgICAkc3VtID0gJHRoaXMtPnN1bU4oJG4pOwogICAgICAgIGlmIChQRUFSOjppc0Vycm9yKCRzdW0pKSB7CiAgICAgICAgICAgIHJldHVybiAkc3VtOwogICAgICAgIH0KICAgICAgICByZXR1cm4gKCRzdW0gLyAkY291bnQpOwogICAgfS8qfX19Ki8KCgogICAgLyoqCiAgICAgKiBDYWxjdWxhdGVzIHRoZSBjb2VmZmljaWVudCBvZiB2YXJpYXRpb24gb2YgYSBkYXRhIHNldC4KICAgICAqIFRoZSBjb2VmZmljaWVudCBvZiB2YXJpYXRpb24gbWVhc3VyZXMgdGhlIHNwcmVhZCBvZiBhIHNldCBvZiBkYXRhCiAgICAgKiBhcyBhIHByb3BvcnRpb24gb2YgaXRzIG1lYW4uIEl0IGlzIG9mdGVuIGV4cHJlc3NlZCBhcyBhIHBlcmNlbnRhZ2UuCiAgICAgKiBIYW5kbGVzIGN1bW11bGF0aXZlIGRhdGEgc2V0cyBjb3JyZWN0bHkKICAgICAqCiAgICAgKiBAYWNjZXNzICBwdWJsaWMKICAgICAqIEByZXR1cm4gIG1peGVkICAgdGhlIGNvZWZmaWNpZW50IG9mIHZhcmlhdGlvbiBvbiBzdWNjZXNzLCBhIFBFQVJfRXJyb3Igb2JqZWN0IG90aGVyd2lzZQogICAgICogQHNlZSBzdERldigpCiAgICAgKiBAc2VlIG1lYW4oKQogICAgICogQHNlZSBjYWxjKCkKICAgICAqLwogICAgZnVuY3Rpb24gY29lZmZPZlZhcmlhdGlvbigpIHsvKnt7eyovCiAgICAgICAgaWYgKCFhcnJheV9rZXlfZXhpc3RzKCdjb2VmZk9mVmFyaWF0aW9uJywgJHRoaXMtPl9jYWxjdWxhdGVkVmFsdWVzKSkgewogICAgICAgICAgICAkbWVhbiA9ICR0aGlzLT5tZWFuKCk7CiAgICAgICAgICAgIGlmIChQRUFSOjppc0Vycm9yKCRtZWFuKSkgewogICAgICAgICAgICAgICAgcmV0dXJuICRtZWFuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgkbWVhbiA9PSAwLjApIHsKICAgICAgICAgICAgICAgIHJldHVybiBQRUFSOjpyYWlzZUVycm9yKCdjYW5ub3QgY2FsY3VsYXRlIHRoZSBjb2VmZmljaWVudCAnLgogICAgICAgICAgICAgICAgICAgICAgICAnb2YgdmFyaWF0aW9uLCBtZWFuIG9mIHNhbXBsZSBpcyB6ZXJvJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJHN0RGV2ID0gJHRoaXMtPnN0RGV2KCk7CiAgICAgICAgICAgIGlmIChQRUFSOjppc0Vycm9yKCRzdERldikpIHsKICAgICAgICAgICAgICAgIHJldHVybiAkc3REZXY7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICR0aGlzLT5fY2FsY3VsYXRlZFZhbHVlc1snY29lZmZPZlZhcmlhdGlvbiddID0gJHN0RGV2IC8gJG1lYW47CiAgICAgICAgfQogICAgICAgIHJldHVybiAkdGhpcy0+X2NhbGN1bGF0ZWRWYWx1ZXNbJ2NvZWZmT2ZWYXJpYXRpb24nXTsKICAgIH0vKn19fSovCgogICAgLyoqCiAgICAgKiBDYWxjdWxhdGVzIHRoZSBzdGFuZGFyZCBlcnJvciBvZiB0aGUgbWVhbi4KICAgICAqIEl0IGlzIHRoZSBzdGFuZGFyZCBkZXZpYXRpb24gb2YgdGhlIHNhbXBsaW5nIGRpc3RyaWJ1dGlvbiBvZgogICAgICogdGhlIG1lYW4uIFRoZSBmb3JtdWxhIGlzOgogICAgICoKICAgICAqIFMuRS4gTWVhbiA9IFNEIC8gKE4pXigxLzIpCiAgICAgKgogICAgICogVGhpcyBmb3JtdWxhIGRvZXMgbm90IGFzc3VtZSBhIG5vcm1hbCBkaXN0cmlidXRpb24sIGFuZCBzaG93cwogICAgICogdGhhdCB0aGUgc2l6ZSBvZiB0aGUgc3RhbmRhcmQgZXJyb3Igb2YgdGhlIG1lYW4gaXMgaW52ZXJzZWx5CiAgICAgKiBwcm9wb3J0aW9uYWwgdG8gdGhlIHNxdWFyZSByb290IG9mIHRoZSBzYW1wbGUgc2l6ZS4KICAgICAqCiAgICAgKiBAYWNjZXNzICBwdWJsaWMKICAgICAqIEByZXR1cm4gIG1peGVkICAgdGhlIHN0YW5kYXJkIGVycm9yIG9mIHRoZSBtZWFuIG9uIHN1Y2Nlc3MsIGEgUEVBUl9FcnJvciBvYmplY3Qgb3RoZXJ3aXNlCiAgICAgKiBAc2VlIHN0RGV2KCkKICAgICAqIEBzZWUgY291bnQoKQogICAgICogQHNlZSBjYWxjKCkKICAgICAqLwogICAgZnVuY3Rpb24gc3RkRXJyb3JPZk1lYW4oKSB7Lyp7e3sqLwogICAgICAgIGlmICghYXJyYXlfa2V5X2V4aXN0cygnc3RkRXJyb3JPZk1lYW4nLCAkdGhpcy0+X2NhbGN1bGF0ZWRWYWx1ZXMpKSB7CiAgICAgICAgICAgICRjb3VudCA9ICR0aGlzLT5jb3VudCgpOwogICAgICAgICAgICBpZiAoUEVBUjo6aXNFcnJvcigkY291bnQpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJGNvdW50OwogICAgICAgICAgICB9CiAgICAgICAgICAgICRzdERldiA9ICR0aGlzLT5zdERldigpOwogICAgICAgICAgICBpZiAoUEVBUjo6aXNFcnJvcigkc3REZXYpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJHN0RGV2OwogICAgICAgICAgICB9CiAgICAgICAgICAgICR0aGlzLT5fY2FsY3VsYXRlZFZhbHVlc1snc3RkRXJyb3JPZk1lYW4nXSA9ICRzdERldiAvIHNxcnQoJGNvdW50KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICR0aGlzLT5fY2FsY3VsYXRlZFZhbHVlc1snc3RkRXJyb3JPZk1lYW4nXTsKICAgIH0vKn19fSovCgogICAgLyoqCiAgICAgKiBDYWxjdWxhdGVzIHRoZSB2YWx1ZSBmcmVxdWVuY3kgdGFibGUgb2YgYSBkYXRhIHNldC4KICAgICAqIEhhbmRsZXMgY3VtbXVsYXRpdmUgZGF0YSBzZXRzIGNvcnJlY3RseQogICAgICoKICAgICAqIEBhY2Nlc3MgIHB1YmxpYwogICAgICogQHJldHVybiAgbWl4ZWQgICBhbiBhc3NvY2lhdGl2ZSBhcnJheSBvZiB2YWx1ZT0+ZnJlcXVlbmN5IGl0ZW1zIG9uIHN1Y2Nlc3MsIGEgUEVBUl9FcnJvciBvYmplY3Qgb3RoZXJ3aXNlCiAgICAgKiBAc2VlIG1pbigpCiAgICAgKiBAc2VlIG1heCgpCiAgICAgKiBAc2VlIGNhbGMoKQogICAgICovCiAgICBmdW5jdGlvbiBmcmVxdWVuY3koKSB7Lyp7e3sqLwogICAgICAgIGlmICgkdGhpcy0+X2RhdGEgPT0gbnVsbCkgewogICAgICAgICAgICByZXR1cm4gUEVBUjo6cmFpc2VFcnJvcignZGF0YSBoYXMgbm90IGJlZW4gc2V0Jyk7CiAgICAgICAgfQogICAgICAgIGlmICghYXJyYXlfa2V5X2V4aXN0cygnZnJlcXVlbmN5JywgJHRoaXMtPl9jYWxjdWxhdGVkVmFsdWVzKSkgewogICAgICAgICAgICBpZiAoJHRoaXMtPl9kYXRhT3B0aW9uID09IFNUQVRTX0RBVEFfQ1VNTVVMQVRJVkUpIHsKICAgICAgICAgICAgICAgICRmcmVxID0gJHRoaXMtPl9kYXRhOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgJGZyZXEgPSBhcnJheSgpOwogICAgICAgICAgICAgICAgZm9yZWFjaCAoJHRoaXMtPl9kYXRhIGFzICR2YWwpIHsKICAgICAgICAgICAgICAgICAgICAkZnJlcVsiJHZhbCJdKys7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBrc29ydCgkZnJlcSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJHRoaXMtPl9jYWxjdWxhdGVkVmFsdWVzWydmcmVxdWVuY3knXSA9ICRmcmVxOwogICAgICAgIH0KICAgICAgICByZXR1cm4gJHRoaXMtPl9jYWxjdWxhdGVkVmFsdWVzWydmcmVxdWVuY3knXTsKICAgIH0vKn19fSovCgogICAgLyoqCiAgICAgKiBUaGUgcXVhcnRpbGVzIGFyZSBkZWZpbmVkIGFzIHRoZSB2YWx1ZXMgdGhhdCBkaXZpZGUgYSBzb3J0ZWQKICAgICAqIGRhdGEgc2V0IGludG8gZm91ciBlcXVhbC1zaXplZCBzdWJzZXRzLCBhbmQgY29ycmVzcG9uZCB0byB0aGUKICAgICAqIDI1dGgsIDUwdGgsIGFuZCA3NXRoIHBlcmNlbnRpbGVzLgogICAgICoKICAgICAqIEBhY2Nlc3MgcHVibGljCiAgICAgKiBAcmV0dXJuIG1peGVkIGFuIGFzc29jaWF0aXZlIGFycmF5IG9mIHF1YXJ0aWxlcyBvbiBzdWNjZXNzLCBhIFBFQVJfRXJyb3Igb3RoZXJ3aXNlCiAgICAgKiBAc2VlIHBlcmNlbnRpbGUoKQogICAgICovCiAgICBmdW5jdGlvbiBxdWFydGlsZXMoKSB7Lyp7e3sqLwogICAgICAgIGlmICghYXJyYXlfa2V5X2V4aXN0cygncXVhcnRpbGVzJywgJHRoaXMtPl9jYWxjdWxhdGVkVmFsdWVzKSkgewogICAgICAgICAgICAkcTEgPSAkdGhpcy0+cGVyY2VudGlsZSgyNSk7CiAgICAgICAgICAgIGlmIChQRUFSOjppc0Vycm9yKCRxMSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiAkcTE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJHEyID0gJHRoaXMtPnBlcmNlbnRpbGUoNTApOwogICAgICAgICAgICBpZiAoUEVBUjo6aXNFcnJvcigkcTIpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJHEyOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRxMyA9ICR0aGlzLT5wZXJjZW50aWxlKDc1KTsKICAgICAgICAgICAgaWYgKFBFQVI6OmlzRXJyb3IoJHEzKSkgewogICAgICAgICAgICAgICAgcmV0dXJuICRxMzsKICAgICAgICAgICAgfQogICAgICAgICAgICAkdGhpcy0+X2NhbGN1bGF0ZWRWYWx1ZXNbJ3F1YXJ0aWxlcyddID0gYXJyYXkgKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzI1JyA9PiAkcTEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnNTAnID0+ICRxMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc3NScgPT4gJHEzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICByZXR1cm4gJHRoaXMtPl9jYWxjdWxhdGVkVmFsdWVzWydxdWFydGlsZXMnXTsKICAgIH0vKn19fSovCgogICAgLyoqCiAgICAgKiBUaGUgaW50ZXJxdWFydGlsZSBtZWFuIGlzIGRlZmluZWQgYXMgdGhlIG1lYW4gb2YgdGhlIHZhbHVlcyBsZWZ0CiAgICAgKiBhZnRlciBkaXNjYXJkaW5nIHRoZSBsb3dlciAyNSUgYW5kIHRvcCAyNSUgcmFua2VkIHZhbHVlcywgaS5lLjoKICAgICAqCiAgICAgKiAgaW50ZXJxdWFydCBtZWFuID0gbWVhbig8UCgyNSksUCg3NSk+KQogICAgICoKICAgICAqICB3aGVyZTogUCA9IHBlcmNlbnRpbGUKICAgICAqCiAgICAgKiBAdG9kbyBuZWVkIHRvIGRvdWJsZSBjaGVjayB0aGUgZXF1YXRpb24KICAgICAqIEBhY2Nlc3MgcHVibGljCiAgICAgKiBAcmV0dXJuIG1peGVkIGEgbnVtZXJpYyB2YWx1ZSBvbiBzdWNjZXNzLCBhIFBFQVJfRXJyb3Igb3RoZXJ3aXNlCiAgICAgKiBAc2VlIHF1YXJ0aWxlcygpCiAgICAgKi8KICAgIGZ1bmN0aW9uIGludGVycXVhcnRpbGVNZWFuKCkgey8qe3t7Ki8KICAgICAgICBpZiAoIWFycmF5X2tleV9leGlzdHMoJ2ludGVycXVhcnRpbGVNZWFuJywgJHRoaXMtPl9jYWxjdWxhdGVkVmFsdWVzKSkgewogICAgICAgICAgICAkcXVhcnQgPSAkdGhpcy0+cXVhcnRpbGVzKCk7CiAgICAgICAgICAgIGlmIChQRUFSOjppc0Vycm9yKCRxdWFydCkpIHsKICAgICAgICAgICAgICAgIHJldHVybiAkcXVhcnQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJHEzID0gJHF1YXJ0Wyc3NSddOwogICAgICAgICAgICAkcTEgPSAkcXVhcnRbJzI1J107CiAgICAgICAgICAgICRzdW0gPSAwOwogICAgICAgICAgICAkbiA9IDA7CiAgICAgICAgICAgIGZvcmVhY2ggKCR0aGlzLT5nZXREYXRhKHRydWUpIGFzICR2YWwpIHsKICAgICAgICAgICAgICAgIGlmICgkdmFsID49ICRxMSAmJiAkdmFsIDw9ICRxMykgewogICAgICAgICAgICAgICAgICAgICRzdW0gKz0gJHZhbDsKICAgICAgICAgICAgICAgICAgICArKyRuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgkbiA9PSAwKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gUEVBUjo6cmFpc2VFcnJvcignZXJyb3IgY2FsY3VsYXRpbmcgaW50ZXJxdWFydGlsZSBtZWFuLCAnLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2VtcHR5IGludGVycXVhcnRpbGUgcmFuZ2Ugb2YgdmFsdWVzLicpOwogICAgICAgICAgICB9CiAgICAgICAgICAgICR0aGlzLT5fY2FsY3VsYXRlZFZhbHVlc1snaW50ZXJxdWFydGlsZU1lYW4nXSA9ICRzdW0gLyAkbjsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICR0aGlzLT5fY2FsY3VsYXRlZFZhbHVlc1snaW50ZXJxdWFydGlsZU1lYW4nXTsKICAgIH0vKn19fSovCgogICAgLyoqCiAgICAgKiBUaGUgaW50ZXJxdWFydGlsZSByYW5nZSBpcyB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0aGUgNzV0aCBhbmQgMjV0aAogICAgICogcGVyY2VudGlsZXMuIEJhc2ljYWxseSB0aGUgcmFuZ2Ugb2YgdGhlIG1pZGRsZSA1MCUgb2YgdGhlIGRhdGEgc2V0LAogICAgICogYW5kIHRodXMgaXMgbm90IGFmZmVjdGVkIGJ5IG91dGxpZXJzIG9yIGV4dHJlbWUgdmFsdWVzLgogICAgICoKICAgICAqICBpbnRlcnF1YXJ0IHJhbmdlID0gUCg3NSkgLSBQKDI1KQogICAgICoKICAgICAqICB3aGVyZTogUCA9IHBlcmNlbnRpbGUKICAgICAqCiAgICAgKiBAYWNjZXNzIHB1YmxpYwogICAgICogQHJldHVybiBtaXhlZCBhIG51bWVyaWMgdmFsdWUgb24gc3VjY2VzcywgYSBQRUFSX0Vycm9yIG90aGVyd2lzZQogICAgICogQHNlZSBxdWFydGlsZXMoKQogICAgICovCiAgICBmdW5jdGlvbiBpbnRlcnF1YXJ0aWxlUmFuZ2UoKSB7Lyp7e3sqLwogICAgICAgIGlmICghYXJyYXlfa2V5X2V4aXN0cygnaW50ZXJxdWFydGlsZVJhbmdlJywgJHRoaXMtPl9jYWxjdWxhdGVkVmFsdWVzKSkgewogICAgICAgICAgICAkcXVhcnQgPSAkdGhpcy0+cXVhcnRpbGVzKCk7CiAgICAgICAgICAgIGlmIChQRUFSOjppc0Vycm9yKCRxdWFydCkpIHsKICAgICAgICAgICAgICAgIHJldHVybiAkcXVhcnQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJHEzID0gJHF1YXJ0Wyc3NSddOwogICAgICAgICAgICAkcTEgPSAkcXVhcnRbJzI1J107CiAgICAgICAgICAgICR0aGlzLT5fY2FsY3VsYXRlZFZhbHVlc1snaW50ZXJxdWFydGlsZVJhbmdlJ10gPSAkcTMgLSAkcTE7CiAgICAgICAgfQogICAgICAgIHJldHVybiAkdGhpcy0+X2NhbGN1bGF0ZWRWYWx1ZXNbJ2ludGVycXVhcnRpbGVSYW5nZSddOwogICAgfS8qfX19Ki8KCiAgICAvKioKICAgICAqIFRoZSBxdWFydGlsZSBkZXZpYXRpb24gaXMgaGFsZiBvZiB0aGUgaW50ZXJxdWFydGlsZSByYW5nZSB2YWx1ZQogICAgICoKICAgICAqICBxdWFydCBkZXYgPSAoUCg3NSkgLSBQKDI1KSkgLyAyCiAgICAgKgogICAgICogIHdoZXJlOiBQID0gcGVyY2VudGlsZQogICAgICoKICAgICAqIEBhY2Nlc3MgcHVibGljCiAgICAgKiBAcmV0dXJuIG1peGVkIGEgbnVtZXJpYyB2YWx1ZSBvbiBzdWNjZXNzLCBhIFBFQVJfRXJyb3Igb3RoZXJ3aXNlCiAgICAgKiBAc2VlIHF1YXJ0aWxlcygpCiAgICAgKiBAc2VlIGludGVycXVhcnRpbGVSYW5nZSgpCiAgICAgKi8KICAgIGZ1bmN0aW9uIHF1YXJ0aWxlRGV2aWF0aW9uKCkgey8qe3t7Ki8KICAgICAgICBpZiAoIWFycmF5X2tleV9leGlzdHMoJ3F1YXJ0aWxlRGV2aWF0aW9uJywgJHRoaXMtPl9jYWxjdWxhdGVkVmFsdWVzKSkgewogICAgICAgICAgICAkaXFyID0gJHRoaXMtPmludGVycXVhcnRpbGVSYW5nZSgpOwogICAgICAgICAgICBpZiAoUEVBUjo6aXNFcnJvcigkaXFyKSkgewogICAgICAgICAgICAgICAgcmV0dXJuICRpcXI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJHRoaXMtPl9jYWxjdWxhdGVkVmFsdWVzWydxdWFydGlsZURldmlhdGlvbiddID0gJGlxciAvIDI7CiAgICAgICAgfQogICAgICAgIHJldHVybiAkdGhpcy0+X2NhbGN1bGF0ZWRWYWx1ZXNbJ3F1YXJ0aWxlRGV2aWF0aW9uJ107CiAgICB9Lyp9fX0qLwoKICAgIC8qKgogICAgICogVGhlIHF1YXJ0aWxlIHZhcmlhdGlvbiBjb2VmZmljaWVudCBpcyBkZWZpbmVzIGFzIGZvbGxvd3M6CiAgICAgKgogICAgICogIHF1YXJ0IHZhciBjb2VmZiA9IDEwMCAqIChQKDc1KSAtIFAoMjUpKSAvIChQKDc1KSArIFAoMjUpKQogICAgICoKICAgICAqICB3aGVyZTogUCA9IHBlcmNlbnRpbGUKICAgICAqCiAgICAgKiBAdG9kbyBuZWVkIHRvIGRvdWJsZSBjaGVjayB0aGUgZXF1YXRpb24KICAgICAqIEBhY2Nlc3MgcHVibGljCiAgICAgKiBAcmV0dXJuIG1peGVkIGEgbnVtZXJpYyB2YWx1ZSBvbiBzdWNjZXNzLCBhIFBFQVJfRXJyb3Igb3RoZXJ3aXNlCiAgICAgKiBAc2VlIHF1YXJ0aWxlcygpCiAgICAgKi8KICAgIGZ1bmN0aW9uIHF1YXJ0aWxlVmFyaWF0aW9uQ29lZmZpY2llbnQoKSB7Lyp7e3sqLwogICAgICAgIGlmICghYXJyYXlfa2V5X2V4aXN0cygncXVhcnRpbGVWYXJpYXRpb25Db2VmZmljaWVudCcsICR0aGlzLT5fY2FsY3VsYXRlZFZhbHVlcykpIHsKICAgICAgICAgICAgJHF1YXJ0ID0gJHRoaXMtPnF1YXJ0aWxlcygpOwogICAgICAgICAgICBpZiAoUEVBUjo6aXNFcnJvcigkcXVhcnQpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJHF1YXJ0OwogICAgICAgICAgICB9CiAgICAgICAgICAgICRxMyA9ICRxdWFydFsnNzUnXTsKICAgICAgICAgICAgJHExID0gJHF1YXJ0WycyNSddOwogICAgICAgICAgICAkZCA9ICRxMyAtICRxMTsKICAgICAgICAgICAgJHMgPSAkcTMgKyAkcTE7CiAgICAgICAgICAgICR0aGlzLT5fY2FsY3VsYXRlZFZhbHVlc1sncXVhcnRpbGVWYXJpYXRpb25Db2VmZmljaWVudCddID0gMTAwICogJGQgLyAkczsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICR0aGlzLT5fY2FsY3VsYXRlZFZhbHVlc1sncXVhcnRpbGVWYXJpYXRpb25Db2VmZmljaWVudCddOwogICAgfS8qfX19Ki8KCiAgICAvKioKICAgICAqIFRoZSBxdWFydGlsZSBza2V3bmVzcyBjb2VmZmljaWVudCAoYWxzbyBrbm93biBhcyBCb3dsZXkgU2tld25lc3MpLAogICAgICogaXMgZGVmaW5lZCBhcyBmb2xsb3dzOgogICAgICoKICAgICAqICBxdWFydCBza2V3bmVzcyBjb2VmZiA9IChQKDI1KSAtIDIqUCg1MCkgKyBQKDc1KSkgLyAoUCg3NSkgLSBQKDI1KSkKICAgICAqCiAgICAgKiAgd2hlcmU6IFAgPSBwZXJjZW50aWxlCiAgICAgKgogICAgICogQHRvZG8gbmVlZCB0byBkb3VibGUgY2hlY2sgdGhlIGVxdWF0aW9uCiAgICAgKiBAYWNjZXNzIHB1YmxpYwogICAgICogQHJldHVybiBtaXhlZCBhIG51bWVyaWMgdmFsdWUgb24gc3VjY2VzcywgYSBQRUFSX0Vycm9yIG90aGVyd2lzZQogICAgICogQHNlZSBxdWFydGlsZXMoKQogICAgICovCiAgICBmdW5jdGlvbiBxdWFydGlsZVNrZXduZXNzQ29lZmZpY2llbnQoKSB7Lyp7e3sqLwogICAgICAgIGlmICghYXJyYXlfa2V5X2V4aXN0cygncXVhcnRpbGVTa2V3bmVzc0NvZWZmaWNpZW50JywgJHRoaXMtPl9jYWxjdWxhdGVkVmFsdWVzKSkgewogICAgICAgICAgICAkcXVhcnQgPSAkdGhpcy0+cXVhcnRpbGVzKCk7CiAgICAgICAgICAgIGlmIChQRUFSOjppc0Vycm9yKCRxdWFydCkpIHsKICAgICAgICAgICAgICAgIHJldHVybiAkcXVhcnQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJHEzID0gJHF1YXJ0Wyc3NSddOwogICAgICAgICAgICAkcTIgPSAkcXVhcnRbJzUwJ107CiAgICAgICAgICAgICRxMSA9ICRxdWFydFsnMjUnXTsKICAgICAgICAgICAgJGQgPSAkcTMgLSAyKiRxMiArICRxMTsKICAgICAgICAgICAgJHMgPSAkcTMgLSAkcTE7CiAgICAgICAgICAgICR0aGlzLT5fY2FsY3VsYXRlZFZhbHVlc1sncXVhcnRpbGVTa2V3bmVzc0NvZWZmaWNpZW50J10gPSAkZCAvICRzOwogICAgICAgIH0KICAgICAgICByZXR1cm4gJHRoaXMtPl9jYWxjdWxhdGVkVmFsdWVzWydxdWFydGlsZVNrZXduZXNzQ29lZmZpY2llbnQnXTsKICAgIH0vKn19fSovCgogICAgLyoqCiAgICAgKiBUaGUgcHRoIHBlcmNlbnRpbGUgaXMgdGhlIHZhbHVlIHN1Y2ggdGhhdCBwJSBvZiB0aGUgYSBzb3J0ZWQgZGF0YSBzZXQKICAgICAqIGlzIHNtYWxsZXIgdGhhbiBpdCwgYW5kICgxMDAgLSBwKSUgb2YgdGhlIGRhdGEgaXMgbGFyZ2VyLgogICAgICoKICAgICAqIEEgcXVpY2sgYWxnb3JpdGhtIHRvIHBpY2sgdGhlIGFwcHJvcHJpYXRlIHZhbHVlIGZyb20gYSBzb3J0ZWQgZGF0YQogICAgICogc2V0IGlzIGFzIGZvbGxvd3M6CiAgICAgKgogICAgICogLSBDb3VudCB0aGUgbnVtYmVyIG9mIHZhbHVlczogbgogICAgICogLSBDYWxjdWxhdGUgdGhlIHBvc2l0aW9uIG9mIHRoZSB2YWx1ZSBpbiB0aGUgZGF0YSBsaXN0OiBpID0gcCAqIChuICsgMSkKICAgICAqIC0gaWYgaSBpcyBhbiBpbnRlZ2VyLCByZXR1cm4gdGhlIGRhdGEgYXQgdGhhdCBwb3NpdGlvbgogICAgICogLSBpZiBpIDwgMSwgcmV0dXJuIHRoZSBtaW5pbXVtIG9mIHRoZSBkYXRhIHNldAogICAgICogLSBpZiBpID4gbiwgcmV0dXJuIHRoZSBtYXhpbXVtIG9mIHRoZSBkYXRhIHNldAogICAgICogLSBvdGhlcndpc2UsIGF2ZXJhZ2UgdGhlIGVudHJpZXMgYXQgYWRqYWNlbnQgcG9zaXRpb25zIHRvIGkKICAgICAqCiAgICAgKiBUaGUgbWVkaWFuIGlzIHRoZSA1MHRoIHBlcmNlbnRpbGUgdmFsdWUuCiAgICAgKgogICAgICogQHRvZG8gbmVlZCB0byBkb3VibGUgY2hlY2sgZ2VuZXJhbGl0eSBvZiB0aGUgYWxnb3JpdGhtCiAgICAgKgogICAgICogQGFjY2VzcyBwdWJsaWMKICAgICAqIEBwYXJhbSBudW1lcmljICRwIHRoZSBwZXJjZW50aWxlIHRvIGVzdGltYXRlLCBlLmcuIDI1IGZvciAyNXRoIHBlcmNlbnRpbGUKICAgICAqIEByZXR1cm4gbWl4ZWQgYSBudW1lcmljIHZhbHVlIG9uIHN1Y2Nlc3MsIGEgUEVBUl9FcnJvciBvdGhlcndpc2UKICAgICAqIEBzZWUgcXVhcnRpbGVzKCkKICAgICAqIEBzZWUgbWVkaWFuKCkKICAgICAqLwogICAgZnVuY3Rpb24gcGVyY2VudGlsZSgkcCkgey8qe3t7Ki8KICAgICAgICAkY291bnQgPSAkdGhpcy0+Y291bnQoKTsKICAgICAgICBpZiAoUEVBUjo6aXNFcnJvcigkY291bnQpKSB7CiAgICAgICAgICAgIHJldHVybiAkY291bnQ7CiAgICAgICAgfQogICAgICAgIGlmICgkdGhpcy0+X2RhdGFPcHRpb24gPT0gU1RBVFNfREFUQV9DVU1NVUxBVElWRSkgewogICAgICAgICAgICAkZGF0YSA9JiAkdGhpcy0+X2RhdGFFeHBhbmRlZDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkZGF0YSA9JiAkdGhpcy0+X2RhdGE7CiAgICAgICAgfQogICAgICAgICRvYnNpZHggPSAkcCAqICgkY291bnQgKyAxKSAvIDEwMDsKICAgICAgICBpZiAoaW50dmFsKCRvYnNpZHgpID09ICRvYnNpZHgpIHsKICAgICAgICAgICAgcmV0dXJuICRkYXRhWygkb2JzaWR4IC0gMSldOwogICAgICAgIH0gZWxzZWlmICgkb2JzaWR4IDwgMSkgewogICAgICAgICAgICByZXR1cm4gJGRhdGFbMF07CiAgICAgICAgfSBlbHNlaWYgKCRvYnNpZHggPiAkY291bnQpIHsKICAgICAgICAgICAgcmV0dXJuICRkYXRhWygkY291bnQgLSAxKV07CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJGxlZnQgPSBmbG9vcigkb2JzaWR4IC0gMSk7CiAgICAgICAgICAgICRyaWdodCA9IGNlaWwoJG9ic2lkeCAtIDEpOwogICAgICAgICAgICByZXR1cm4gKCRkYXRhWyRsZWZ0XSArICRkYXRhWyRyaWdodF0pIC8gMjsKICAgICAgICB9CiAgICB9Lyp9fX0qLwoKICAgIC8vIHByaXZhdGUgbWV0aG9kcwoKICAgIC8qKgogICAgICogVXRpbGl0eSBmdW5jdGlvbiB0byBjYWxjdWxhdGU6IFNVTSB7ICh4aSAtIG1lYW4pXm4gfQogICAgICoKICAgICAqIEBhY2Nlc3MgcHJpdmF0ZQogICAgICogQHBhcmFtICAgbnVtZXJpYyAkcG93ZXIgIHRoZSBleHBvbmVudAogICAgICogQHBhcmFtICAgb3B0aW9uYWwgICAgZG91YmxlICAgJG1lYW4gICB0aGUgZGF0YSBzZXQgbWVhbiB2YWx1ZQogICAgICogQHJldHVybiAgbWl4ZWQgICB0aGUgc3VtIG9uIHN1Y2Nlc3MsIGEgUEVBUl9FcnJvciBvYmplY3Qgb3RoZXJ3aXNlCiAgICAgKgogICAgICogQHNlZSBzdERldigpCiAgICAgKiBAc2VlIHZhcmlhY2VXaXRoTWVhbigpOwogICAgICogQHNlZSBza2V3bmVzcygpOwogICAgICogQHNlZSBrdXJ0b3NpcygpOwogICAgICovCiAgICBmdW5jdGlvbiBfX3N1bWRpZmYoJHBvd2VyLCAkbWVhbj1udWxsKSB7Lyp7e3sqLwogICAgICAgIGlmICgkdGhpcy0+X2RhdGEgPT0gbnVsbCkgewogICAgICAgICAgICByZXR1cm4gUEVBUjo6cmFpc2VFcnJvcignZGF0YSBoYXMgbm90IGJlZW4gc2V0Jyk7CiAgICAgICAgfQogICAgICAgIGlmIChpc19udWxsKCRtZWFuKSkgewogICAgICAgICAgICAkbWVhbiA9ICR0aGlzLT5tZWFuKCk7CiAgICAgICAgICAgIGlmIChQRUFSOjppc0Vycm9yKCRtZWFuKSkgewogICAgICAgICAgICAgICAgcmV0dXJuICRtZWFuOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgICRzZGlmZiA9IDA7CiAgICAgICAgaWYgKCR0aGlzLT5fZGF0YU9wdGlvbiA9PSBTVEFUU19EQVRBX0NVTU1VTEFUSVZFKSB7CiAgICAgICAgICAgIGZvcmVhY2ggKCR0aGlzLT5fZGF0YSBhcyAkdmFsPT4kZnJlcSkgewogICAgICAgICAgICAgICAgJHNkaWZmICs9ICRmcmVxICogcG93KChkb3VibGUpKCR2YWwgLSAkbWVhbiksIChkb3VibGUpJHBvd2VyKTsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGZvcmVhY2ggKCR0aGlzLT5fZGF0YSBhcyAkdmFsKQogICAgICAgICAgICAgICAgJHNkaWZmICs9IHBvdygoZG91YmxlKSgkdmFsIC0gJG1lYW4pLCAoZG91YmxlKSRwb3dlcik7CiAgICAgICAgfQogICAgICAgIHJldHVybiAkc2RpZmY7CiAgICB9Lyp9fX0qLwoKICAgIC8qKgogICAgICogVXRpbGl0eSBmdW5jdGlvbiB0byBjYWxjdWxhdGUgdGhlIHZhcmlhbmNlIHdpdGggb3Igd2l0aG91dAogICAgICogYSBmaXhlZCBtZWFuCiAgICAgKgogICAgICogQGFjY2VzcyBwcml2YXRlCiAgICAgKiBAcGFyYW0gJG1lYW4gdGhlIGZpeGVkIG1lYW4gdG8gdXNlLCBudWxsIGFzIGRlZmF1bHQKICAgICAqIEByZXR1cm4gbWl4ZWQgYSBudW1lcmljIHZhbHVlIG9uIHN1Y2Nlc3MsIGEgUEVBUl9FcnJvciBvdGhlcndpc2UKICAgICAqIEBzZWUgdmFyaWFuY2UoKQogICAgICogQHNlZSB2YXJpYW5jZVdpdGhNZWFuKCkKICAgICAqLwogICAgZnVuY3Rpb24gX19jYWxjVmFyaWFuY2UoJG1lYW4gPSBudWxsKSB7Lyp7e3sqLwogICAgICAgIGlmICgkdGhpcy0+X2RhdGEgPT0gbnVsbCkgewogICAgICAgICAgICByZXR1cm4gUEVBUjo6cmFpc2VFcnJvcignZGF0YSBoYXMgbm90IGJlZW4gc2V0Jyk7CiAgICAgICAgfQogICAgICAgICRzdW1kaWZmMiA9ICR0aGlzLT5fX3N1bWRpZmYoMiwgJG1lYW4pOwogICAgICAgIGlmIChQRUFSOjppc0Vycm9yKCRzdW1kaWZmMikpIHsKICAgICAgICAgICAgcmV0dXJuICRzdW1kaWZmMjsKICAgICAgICB9CiAgICAgICAgJGNvdW50ID0gJHRoaXMtPmNvdW50KCk7CiAgICAgICAgaWYgKFBFQVI6OmlzRXJyb3IoJGNvdW50KSkgewogICAgICAgICAgICByZXR1cm4gJGNvdW50OwogICAgICAgIH0KICAgICAgICBpZiAoJGNvdW50ID09IDEpIHsKICAgICAgICAgICAgcmV0dXJuIFBFQVI6OnJhaXNlRXJyb3IoJ2Nhbm5vdCBjYWxjdWxhdGUgdmFyaWFuY2Ugb2YgYSBzaW5nZSBkYXRhIHBvaW50Jyk7CiAgICAgICAgfQogICAgICAgIHJldHVybiAgKCRzdW1kaWZmMiAvICgkY291bnQgLSAxKSk7CiAgICB9Lyp9fX0qLwoKICAgIC8qKgogICAgICogVXRpbGl0eSBmdW5jdGlvbiB0byBjYWxjdWxhdGUgdGhlIGFic29sdXRlIGRldmlhdGlvbiB3aXRoIG9yIHdpdGhvdXQKICAgICAqIGEgZml4ZWQgbWVhbgogICAgICoKICAgICAqIEBhY2Nlc3MgcHJpdmF0ZQogICAgICogQHBhcmFtICRtZWFuIHRoZSBmaXhlZCBtZWFuIHRvIHVzZSwgbnVsbCBhcyBkZWZhdWx0CiAgICAgKiBAcmV0dXJuIG1peGVkIGEgbnVtZXJpYyB2YWx1ZSBvbiBzdWNjZXNzLCBhIFBFQVJfRXJyb3Igb3RoZXJ3aXNlCiAgICAgKiBAc2VlIGFic0RldigpCiAgICAgKiBAc2VlIGFic0RldldpdGhNZWFuKCkKICAgICAqLwogICAgZnVuY3Rpb24gX19jYWxjQWJzb2x1dGVEZXZpYXRpb24oJG1lYW4gPSBudWxsKSB7Lyp7e3sqLwogICAgICAgIGlmICgkdGhpcy0+X2RhdGEgPT0gbnVsbCkgewogICAgICAgICAgICByZXR1cm4gUEVBUjo6cmFpc2VFcnJvcignZGF0YSBoYXMgbm90IGJlZW4gc2V0Jyk7CiAgICAgICAgfQogICAgICAgICRjb3VudCA9ICR0aGlzLT5jb3VudCgpOwogICAgICAgIGlmIChQRUFSOjppc0Vycm9yKCRjb3VudCkpIHsKICAgICAgICAgICAgcmV0dXJuICRjb3VudDsKICAgICAgICB9CiAgICAgICAgJHN1bWFic2RldiA9ICR0aGlzLT5fX3N1bWFic2RldigkbWVhbik7CiAgICAgICAgaWYgKFBFQVI6OmlzRXJyb3IoJHN1bWFic2RldikpIHsKICAgICAgICAgICAgcmV0dXJuICRzdW1hYnNkZXY7CiAgICAgICAgfQogICAgICAgIHJldHVybiAkc3VtYWJzZGV2IC8gJGNvdW50OwogICAgfS8qfX19Ki8KCiAgICAvKioKICAgICAqIFV0aWxpdHkgZnVuY3Rpb24gdG8gY2FsY3VsYXRlOiBTVU0geyB8IHhpIC0gbWVhbiB8IH0KICAgICAqCiAgICAgKiBAYWNjZXNzICBwcml2YXRlCiAgICAgKiBAcGFyYW0gICBvcHRpb25hbCAgICBkb3VibGUgICAkbWVhbiAgIHRoZSBtZWFuIHZhbHVlIGZvciB0aGUgc2V0IG9yIHBvcHVsYXRpb24KICAgICAqIEByZXR1cm4gIG1peGVkICAgdGhlIHN1bSBvbiBzdWNjZXNzLCBhIFBFQVJfRXJyb3Igb2JqZWN0IG90aGVyd2lzZQogICAgICoKICAgICAqIEBzZWUgYWJzRGV2KCkKICAgICAqIEBzZWUgYWJzRGV2V2l0aE1lYW4oKQogICAgICovCiAgICBmdW5jdGlvbiBfX3N1bWFic2RldigkbWVhbj1udWxsKSB7Lyp7e3sqLwogICAgICAgIGlmICgkdGhpcy0+X2RhdGEgPT0gbnVsbCkgewogICAgICAgICAgICByZXR1cm4gUEVBUjo6cmFpc2VFcnJvcignZGF0YSBoYXMgbm90IGJlZW4gc2V0Jyk7CiAgICAgICAgfQogICAgICAgIGlmIChpc19udWxsKCRtZWFuKSkgewogICAgICAgICAgICAkbWVhbiA9ICR0aGlzLT5tZWFuKCk7CiAgICAgICAgfQogICAgICAgICRzZGV2ID0gMDsKICAgICAgICBpZiAoJHRoaXMtPl9kYXRhT3B0aW9uID09IFNUQVRTX0RBVEFfQ1VNTVVMQVRJVkUpIHsKICAgICAgICAgICAgZm9yZWFjaCAoJHRoaXMtPl9kYXRhIGFzICR2YWw9PiRmcmVxKSB7CiAgICAgICAgICAgICAgICAkc2RldiArPSAkZnJlcSAqIGFicygkdmFsIC0gJG1lYW4pOwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZm9yZWFjaCAoJHRoaXMtPl9kYXRhIGFzICR2YWwpIHsKICAgICAgICAgICAgICAgICRzZGV2ICs9IGFicygkdmFsIC0gJG1lYW4pOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiAkc2RldjsKICAgIH0vKn19fSovCgogICAgLyoqCiAgICAgKiBVdGlsaXR5IGZ1bmN0aW9uIHRvIGZvcm1hdCBhIFBFQVJfRXJyb3IgdG8gYmUgdXNlZCBieSBjYWxjKCksCiAgICAgKiBjYWxjQmFzaWMoKSBhbmQgY2FsY0Z1bGwoKQogICAgICoKICAgICAqIEBhY2Nlc3MgcHJpdmF0ZQogICAgICogQHBhcmFtIG1peGVkICR2IHZhbHVlIHRvIGJlIGZvcm1hdHRlZAogICAgICogQHBhcmFtIGJvb2xlYW4gJHJldHVybkVycm9yT2JqZWN0IHdoZXRoZXIgdGhlIHJhdyBQRUFSX0Vycm9yICh3aGVuIHRydWUsIGRlZmF1bHQpLAogICAgICogICAgICAgICAgICAgICAgICBvciBvbmx5IHRoZSBlcnJvciBtZXNzYWdlIHdpbGwgYmUgcmV0dXJuZWQgKHdoZW4gZmFsc2UpCiAgICAgKiBAcmV0dXJuIG1peGVkIGlmIHRoZSB2YWx1ZSBpcyBhIFBFQVJfRXJyb3Igb2JqZWN0LCBhbmQgJHVzZUVycm9yT2JqZWN0CiAgICAgKiAgICAgICAgICAgICAgaXMgZmFsc2UsIHRoZW4gYSBzdHJpbmcgd2l0aCB0aGUgZXJyb3IgbWVzc2FnZSB3aWxsIGJlIHJldHVybmVkLAogICAgICogICAgICAgICAgICAgIG90aGVyd2lzZSB0aGUgdmFsdWUgd2lsbCBub3QgYmUgbW9kaWZpZWQgYW5kIHJldHVybmVkIGFzIHBhc3NlZC4KICAgICAqLwogICAgZnVuY3Rpb24gX19mb3JtYXQoJHYsICR1c2VFcnJvck9iamVjdD10cnVlKSB7Lyp7e3sqLwogICAgICAgIGlmIChQRUFSOjppc0Vycm9yKCR2KSAmJiAkdXNlRXJyb3JPYmplY3QgPT0gZmFsc2UpIHsKICAgICAgICAgICAgcmV0dXJuICR2LT5nZXRNZXNzYWdlKCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuICR2OwogICAgICAgIH0KICAgIH0vKn19fSovCgogICAgLyoqCiAgICAgKiBVdGlsaXR5IGZ1bmN0aW9uIHRvIHZhbGlkYXRlIHRoZSBkYXRhIGFuZCBtb2RpZnkgaXQKICAgICAqIGFjY29yZGluZyB0byB0aGUgY3VycmVudCBudWxsIGhhbmRsaW5nIG9wdGlvbgogICAgICoKICAgICAqIEBhY2Nlc3MgIHByaXZhdGUKICAgICAqIEByZXR1cm4gIG1peGVkIHRydWUgb24gc3VjY2VzcywgYSBQRUFSX0Vycm9yIG9iamVjdCBvdGhlcndpc2UKICAgICAqCiAgICAgKiBAc2VlIHNldERhdGEoKQogICAgICovCiAgICBmdW5jdGlvbiBfdmFsaWRhdGUoKSB7Lyp7e3sqLwogICAgICAgICRmbGFnID0gKCR0aGlzLT5fZGF0YU9wdGlvbiA9PSBTVEFUU19EQVRBX0NVTU1VTEFUSVZFKTsKICAgICAgICBmb3JlYWNoICgkdGhpcy0+X2RhdGEgYXMgJGtleT0+JHZhbHVlKSB7CiAgICAgICAgICAgICRkID0gKCRmbGFnKSA/ICRrZXkgOiAkdmFsdWU7CiAgICAgICAgICAgICR2ID0gKCRmbGFnKSA/ICR2YWx1ZSA6ICRrZXk7CiAgICAgICAgICAgIGlmICghaXNfbnVtZXJpYygkZCkpIHsKICAgICAgICAgICAgICAgIHN3aXRjaCAoJHRoaXMtPl9udWxsT3B0aW9uKSB7CiAgICAgICAgICAgICAgICAgICAgY2FzZSBTVEFUU19JR05PUkVfTlVMTCA6CiAgICAgICAgICAgICAgICAgICAgICAgIHVuc2V0KCR0aGlzLT5fZGF0YVsiJGtleSJdKTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgY2FzZSBTVEFUU19VU0VfTlVMTF9BU19aRVJPOgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJGZsYWcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2V0KCR0aGlzLT5fZGF0YVsiJGtleSJdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5fZGF0YVswXSArPSAkdjsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5fZGF0YVska2V5XSA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgY2FzZSBTVEFUU19SRUpFQ1RfTlVMTCA6CiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFBFQVI6OnJhaXNlRXJyb3IoJ2RhdGEgcmVqZWN0ZWQsIGNvbnRhaW5zIE5VTEwgdmFsdWVzJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICgkZmxhZykgewogICAgICAgICAgICBrc29ydCgkdGhpcy0+X2RhdGEpOwogICAgICAgICAgICAkdGhpcy0+X2RhdGFFeHBhbmRlZCA9IGFycmF5KCk7CiAgICAgICAgICAgIGZvcmVhY2ggKCR0aGlzLT5fZGF0YSBhcyAkdmFsPT4kZnJlcSkgewogICAgICAgICAgICAgICAgJHRoaXMtPl9kYXRhRXhwYW5kZWQgPSBhcnJheV9wYWQoJHRoaXMtPl9kYXRhRXhwYW5kZWQsIGNvdW50KCR0aGlzLT5fZGF0YUV4cGFuZGVkKSArICRmcmVxLCAkdmFsKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBzb3J0KCR0aGlzLT5fZGF0YUV4cGFuZGVkKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBzb3J0KCR0aGlzLT5fZGF0YSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0cnVlOwogICAgfS8qfX19Ki8KCn0vKn19fSovCgovLyB2aW06IHRzPTQ6c3c9NDpldDoKLy8gdmltNjogZmRsPTE6IGZkbT1tYXJrZXI6Cgo/Pgo=]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Shared/JAMA/examples/tile.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCmluY2x1ZGUgIi4uL01hdHJpeC5waHAiOwoKLyoqCiogVGlsaW5nIG9mIG1hdHJpeCBYIGluIFtyb3dXaXNlIGJ5IGNvbFdpc2VdIGRpbWVuc2lvbi4gVGlsaW5nCiogY3JlYXRlcyBhIGxhcmdlciBtYXRyaXggdGhhbiB0aGUgb3JpZ2luYWwgZGF0YSBYLiBFeGFtcGxlLCBpZgoqIFggaXMgdG8gYmUgdGlsZWQgaW4gYSBbMyB4IDRdIG1hbm5lciwgdGhlbjoKKgoqICAgICAvICAgICAgICAgICAgXAoqICAgICB8IFggIFggIFggIFggfAoqIEMgPSB8IFggIFggIFggIFggfAoqICAgICB8IFggIFggIFggIFggfAoqICAgICBcICAgICAgICAgICAvCioKKiBAcGFyYW0gWCBNYXRyaXgKKiBAcGFyYW0gcm93V2lzZSBpbnQKKiBAcGFyYW0gY29sV2lzZSBpbnQKKiBAcmV0dXJuIE1hdHJpeAoqLwoKZnVuY3Rpb24gdGlsZSgmJFgsICRyb3dXaXNlLCAkY29sV2lzZSl7CgogICR4QXJyYXkgPSAkWC0+Z2V0QXJyYXkoKTsKICBwcmludF9yKCR4QXJyYXkpOwoKICAkY291bnRSb3cgICAgPSAwOwogICRjb3VudENvbHVtbiA9IDA7CgogICRtID0gJFgtPmdldFJvd0RpbWVuc2lvbigpOwogICRuID0gJFgtPmdldENvbHVtbkRpbWVuc2lvbigpOwoKICBpZiggJHJvd1dpc2U8MSB8fCAkY29sV2lzZTwxICl7CiAgICBkaWUoInRpbGUgOiBBcnJheSBpbmRleCBpcyBvdXQtb2YtYm91bmQuIik7CiAgfQoKICAkbmV3Um93RGltID0gJG0qJHJvd1dpc2U7CiAgJG5ld0NvbERpbSA9ICRuKiRjb2xXaXNlOwoKICAkcmVzdWx0ID0gYXJyYXkoKTsKCiAgZm9yKCRpPTAgOyAkaTwkbmV3Um93RGltOyArKyRpKSB7CgogICAgJGhvbGRlciA9IGFycmF5KCk7CgogICAgZm9yKCRqPTAgOyAkajwkbmV3Q29sRGltIDsgKyskaikgewoKICAgICAgJGhvbGRlclskal0gPSAkeEFycmF5WyRjb3VudFJvd11bJGNvdW50Q29sdW1uKytdOwoKICAgICAgLy8gcmVzZXQgdGhlIGNvbHVtbi1pbmRleCB0byB6ZXJvIHRvIGF2b2lkIHJlZmVyZW5jZSB0byBvdXQtb2YtYm91bmQgaW5kZXggaW4geEFycmF5W11bXQoKICAgICAgaWYoJGNvdW50Q29sdW1uID09ICRuKSB7ICRjb3VudENvbHVtbiA9IDA7IH0KCiAgICB9IC8vIGVuZCBmb3IKCiAgICArKyRjb3VudFJvdzsKCiAgICAvLyByZXNldCB0aGUgcm93LWluZGV4IHRvIHplcm8gdG8gYXZvaWQgcmVmZXJlbmNlIHRvIG91dC1vZi1ib3VuZCBpbmRleCBpbiB4QXJyYXlbXVtdCgogICAgaWYoJGNvdW50Um93ID09ICRtKSB7ICRjb3VudFJvdyA9IDA7IH0KCiAgICAkcmVzdWx0WyRpXSA9ICRob2xkZXI7CgogIH0gLy8gZW5kIGZvcgoKICByZXR1cm4gbmV3IE1hdHJpeCgkcmVzdWx0KTsKCn0KCgokWCA9YXJyYXkoMSwyLDMsNCw1LDYsNyw4LDkpOwokblJvdyA9IDM7CiRuQ29sID0gMzsKJHRpbGVkX21hdHJpeCA9IHRpbGUobmV3IE1hdHJpeCgkWCksICRuUm93LCAkbkNvbCk7CmVjaG8gIjxwcmU+IjsKcHJpbnRfcigkdGlsZWRfbWF0cml4KTsKZWNobyAiPC9wcmU+IjsKPz4K]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Shared/JAMA/LUDecomposition.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqCUBwYWNrYWdlIEpBTUEKICoKICoJRm9yIGFuIG0tYnktbiBtYXRyaXggQSB3aXRoIG0gPj0gbiwgdGhlIExVIGRlY29tcG9zaXRpb24gaXMgYW4gbS1ieS1uCiAqCXVuaXQgbG93ZXIgdHJpYW5ndWxhciBtYXRyaXggTCwgYW4gbi1ieS1uIHVwcGVyIHRyaWFuZ3VsYXIgbWF0cml4IFUsCiAqCWFuZCBhIHBlcm11dGF0aW9uIHZlY3RvciBwaXYgb2YgbGVuZ3RoIG0gc28gdGhhdCBBKHBpdiw6KSA9IEwqVS4KICoJSWYgbSA8IG4sIHRoZW4gTCBpcyBtLWJ5LW0gYW5kIFUgaXMgbS1ieS1uLgogKgogKglUaGUgTFUgZGVjb21wb3N0aW9uIHdpdGggcGl2b3RpbmcgYWx3YXlzIGV4aXN0cywgZXZlbiBpZiB0aGUgbWF0cml4IGlzCiAqCXNpbmd1bGFyLCBzbyB0aGUgY29uc3RydWN0b3Igd2lsbCBuZXZlciBmYWlsLiBUaGUgcHJpbWFyeSB1c2Ugb2YgdGhlCiAqCUxVIGRlY29tcG9zaXRpb24gaXMgaW4gdGhlIHNvbHV0aW9uIG9mIHNxdWFyZSBzeXN0ZW1zIG9mIHNpbXVsdGFuZW91cwogKglsaW5lYXIgZXF1YXRpb25zLiBUaGlzIHdpbGwgZmFpbCBpZiBpc05vbnNpbmd1bGFyKCkgcmV0dXJucyBmYWxzZS4KICoKICoJQGF1dGhvciBQYXVsIE1lYWdoZXIKICoJQGF1dGhvciBCYXJ0b3N6IE1hdG9zaXVrCiAqCUBhdXRob3IgTWljaGFlbCBCb21tYXJpdG8KICoJQHZlcnNpb24gMS4xCiAqCUBsaWNlbnNlIFBIUCB2My4wCiAqLwpjbGFzcyBQSFBFeGNlbF9TaGFyZWRfSkFNQV9MVURlY29tcG9zaXRpb24gewoKCWNvbnN0IE1hdHJpeFNpbmd1bGFyRXhjZXB0aW9uCT0gIkNhbiBvbmx5IHBlcmZvcm0gb3BlcmF0aW9uIG9uIHNpbmd1bGFyIG1hdHJpeC4iOwoJY29uc3QgTWF0cml4U3F1YXJlRXhjZXB0aW9uCQk9ICJNaXNtYXRjaGVkIFJvdyBkaW1lbnNpb24iOwoKCS8qKgoJICoJRGVjb21wb3NpdGlvbiBzdG9yYWdlCgkgKglAdmFyIGFycmF5CgkgKi8KCXByaXZhdGUgJExVID0gYXJyYXkoKTsKCgkvKioKCSAqCVJvdyBkaW1lbnNpb24uCgkgKglAdmFyIGludAoJICovCglwcml2YXRlICRtOwoKCS8qKgoJICoJQ29sdW1uIGRpbWVuc2lvbi4KCSAqCUB2YXIgaW50CgkgKi8KCXByaXZhdGUgJG47CgoJLyoqCgkgKglQaXZvdCBzaWduLgoJICoJQHZhciBpbnQKCSAqLwoJcHJpdmF0ZSAkcGl2c2lnbjsKCgkvKioKCSAqCUludGVybmFsIHN0b3JhZ2Ugb2YgcGl2b3QgdmVjdG9yLgoJICoJQHZhciBhcnJheQoJICovCglwcml2YXRlICRwaXYgPSBhcnJheSgpOwoKCgkvKioKCSAqCUxVIERlY29tcG9zaXRpb24gY29uc3RydWN0b3IuCgkgKgoJICoJQHBhcmFtICRBIFJlY3Rhbmd1bGFyIG1hdHJpeAoJICoJQHJldHVybiBTdHJ1Y3R1cmUgdG8gYWNjZXNzIEwsIFUgYW5kIHBpdi4KCSAqLwoJcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRBKSB7CgkJaWYgKCRBIGluc3RhbmNlb2YgUEhQRXhjZWxfU2hhcmVkX0pBTUFfTWF0cml4KSB7CgkJCS8vIFVzZSBhICJsZWZ0LWxvb2tpbmciLCBkb3QtcHJvZHVjdCwgQ3JvdXQvRG9vbGl0dGxlIGFsZ29yaXRobS4KCQkJJHRoaXMtPkxVID0gJEEtPmdldEFycmF5KCk7CgkJCSR0aGlzLT5tICA9ICRBLT5nZXRSb3dEaW1lbnNpb24oKTsKCQkJJHRoaXMtPm4gID0gJEEtPmdldENvbHVtbkRpbWVuc2lvbigpOwoJCQlmb3IgKCRpID0gMDsgJGkgPCAkdGhpcy0+bTsgKyskaSkgewoJCQkJJHRoaXMtPnBpdlskaV0gPSAkaTsKCQkJfQoJCQkkdGhpcy0+cGl2c2lnbiA9IDE7CgkJCSRMVXJvd2kgPSAkTFVjb2xqID0gYXJyYXkoKTsKCgkJCS8vIE91dGVyIGxvb3AuCgkJCWZvciAoJGogPSAwOyAkaiA8ICR0aGlzLT5uOyArKyRqKSB7CgkJCQkvLyBNYWtlIGEgY29weSBvZiB0aGUgai10aCBjb2x1bW4gdG8gbG9jYWxpemUgcmVmZXJlbmNlcy4KCQkJCWZvciAoJGkgPSAwOyAkaSA8ICR0aGlzLT5tOyArKyRpKSB7CgkJCQkJJExVY29salskaV0gPSAmJHRoaXMtPkxVWyRpXVskal07CgkJCQl9CgkJCQkvLyBBcHBseSBwcmV2aW91cyB0cmFuc2Zvcm1hdGlvbnMuCgkJCQlmb3IgKCRpID0gMDsgJGkgPCAkdGhpcy0+bTsgKyskaSkgewoJCQkJCSRMVXJvd2kgPSAkdGhpcy0+TFVbJGldOwoJCQkJCS8vIE1vc3Qgb2YgdGhlIHRpbWUgaXMgc3BlbnQgaW4gdGhlIGZvbGxvd2luZyBkb3QgcHJvZHVjdC4KCQkJCQkka21heCA9IG1pbigkaSwkaik7CgkJCQkJJHMgPSAwLjA7CgkJCQkJZm9yICgkayA9IDA7ICRrIDwgJGttYXg7ICsrJGspIHsKCQkJCQkJJHMgKz0gJExVcm93aVska10gKiAkTFVjb2xqWyRrXTsKCQkJCQl9CgkJCQkJJExVcm93aVskal0gPSAkTFVjb2xqWyRpXSAtPSAkczsKCQkJCX0KCQkJCS8vIEZpbmQgcGl2b3QgYW5kIGV4Y2hhbmdlIGlmIG5lY2Vzc2FyeS4KCQkJCSRwID0gJGo7CgkJCQlmb3IgKCRpID0gJGorMTsgJGkgPCAkdGhpcy0+bTsgKyskaSkgewoJCQkJCWlmIChhYnMoJExVY29salskaV0pID4gYWJzKCRMVWNvbGpbJHBdKSkgewoJCQkJCQkkcCA9ICRpOwoJCQkJCX0KCQkJCX0KCQkJCWlmICgkcCAhPSAkaikgewoJCQkJCWZvciAoJGsgPSAwOyAkayA8ICR0aGlzLT5uOyArKyRrKSB7CgkJCQkJCSR0ID0gJHRoaXMtPkxVWyRwXVska107CgkJCQkJCSR0aGlzLT5MVVskcF1bJGtdID0gJHRoaXMtPkxVWyRqXVska107CgkJCQkJCSR0aGlzLT5MVVskal1bJGtdID0gJHQ7CgkJCQkJfQoJCQkJCSRrID0gJHRoaXMtPnBpdlskcF07CgkJCQkJJHRoaXMtPnBpdlskcF0gPSAkdGhpcy0+cGl2WyRqXTsKCQkJCQkkdGhpcy0+cGl2WyRqXSA9ICRrOwoJCQkJCSR0aGlzLT5waXZzaWduID0gJHRoaXMtPnBpdnNpZ24gKiAtMTsKCQkJCX0KCQkJCS8vIENvbXB1dGUgbXVsdGlwbGllcnMuCgkJCQlpZiAoKCRqIDwgJHRoaXMtPm0pICYmICgkdGhpcy0+TFVbJGpdWyRqXSAhPSAwLjApKSB7CgkJCQkJZm9yICgkaSA9ICRqKzE7ICRpIDwgJHRoaXMtPm07ICsrJGkpIHsKCQkJCQkJJHRoaXMtPkxVWyRpXVskal0gLz0gJHRoaXMtPkxVWyRqXVskal07CgkJCQkJfQoJCQkJfQoJCQl9CgkJfSBlbHNlIHsKCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbihQSFBFeGNlbF9TaGFyZWRfSkFNQV9NYXRyaXg6OkFyZ3VtZW50VHlwZUV4Y2VwdGlvbik7CgkJfQoJfQkvLwlmdW5jdGlvbiBfX2NvbnN0cnVjdCgpCgoKCS8qKgoJICoJR2V0IGxvd2VyIHRyaWFuZ3VsYXIgZmFjdG9yLgoJICoKCSAqCUByZXR1cm4gYXJyYXkgTG93ZXIgdHJpYW5ndWxhciBmYWN0b3IKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldEwoKSB7CgkJZm9yICgkaSA9IDA7ICRpIDwgJHRoaXMtPm07ICsrJGkpIHsKCQkJZm9yICgkaiA9IDA7ICRqIDwgJHRoaXMtPm47ICsrJGopIHsKCQkJCWlmICgkaSA+ICRqKSB7CgkJCQkJJExbJGldWyRqXSA9ICR0aGlzLT5MVVskaV1bJGpdOwoJCQkJfSBlbHNlaWYgKCRpID09ICRqKSB7CgkJCQkJJExbJGldWyRqXSA9IDEuMDsKCQkJCX0gZWxzZSB7CgkJCQkJJExbJGldWyRqXSA9IDAuMDsKCQkJCX0KCQkJfQoJCX0KCQlyZXR1cm4gbmV3IFBIUEV4Y2VsX1NoYXJlZF9KQU1BX01hdHJpeCgkTCk7Cgl9CS8vCWZ1bmN0aW9uIGdldEwoKQoKCgkvKioKCSAqCUdldCB1cHBlciB0cmlhbmd1bGFyIGZhY3Rvci4KCSAqCgkgKglAcmV0dXJuIGFycmF5IFVwcGVyIHRyaWFuZ3VsYXIgZmFjdG9yCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRVKCkgewoJCWZvciAoJGkgPSAwOyAkaSA8ICR0aGlzLT5uOyArKyRpKSB7CgkJCWZvciAoJGogPSAwOyAkaiA8ICR0aGlzLT5uOyArKyRqKSB7CgkJCQlpZiAoJGkgPD0gJGopIHsKCQkJCQkkVVskaV1bJGpdID0gJHRoaXMtPkxVWyRpXVskal07CgkJCQl9IGVsc2UgewoJCQkJCSRVWyRpXVskal0gPSAwLjA7CgkJCQl9CgkJCX0KCQl9CgkJcmV0dXJuIG5ldyBQSFBFeGNlbF9TaGFyZWRfSkFNQV9NYXRyaXgoJFUpOwoJfQkvLwlmdW5jdGlvbiBnZXRVKCkKCgoJLyoqCgkgKglSZXR1cm4gcGl2b3QgcGVybXV0YXRpb24gdmVjdG9yLgoJICoKCSAqCUByZXR1cm4gYXJyYXkgUGl2b3QgdmVjdG9yCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRQaXZvdCgpIHsKCQlyZXR1cm4gJHRoaXMtPnBpdjsKCX0JLy8JZnVuY3Rpb24gZ2V0UGl2b3QoKQoKCgkvKioKCSAqCUFsaWFzIGZvciBnZXRQaXZvdAoJICoKCSAqCUBzZWUgZ2V0UGl2b3QKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldERvdWJsZVBpdm90KCkgewoJCXJldHVybiAkdGhpcy0+Z2V0UGl2b3QoKTsKCX0JLy8JZnVuY3Rpb24gZ2V0RG91YmxlUGl2b3QoKQoKCgkvKioKCSAqCUlzIHRoZSBtYXRyaXggbm9uc2luZ3VsYXI/CgkgKgoJICoJQHJldHVybiB0cnVlIGlmIFUsIGFuZCBoZW5jZSBBLCBpcyBub25zaW5ndWxhci4KCSAqLwoJcHVibGljIGZ1bmN0aW9uIGlzTm9uc2luZ3VsYXIoKSB7CgkJZm9yICgkaiA9IDA7ICRqIDwgJHRoaXMtPm47ICsrJGopIHsKCQkJaWYgKCR0aGlzLT5MVVskal1bJGpdID09IDApIHsKCQkJCXJldHVybiBmYWxzZTsKCQkJfQoJCX0KCQlyZXR1cm4gdHJ1ZTsKCX0JLy8JZnVuY3Rpb24gaXNOb25zaW5ndWxhcigpCgoKCS8qKgoJICoJQ291bnQgZGV0ZXJtaW5hbnRzCgkgKgoJICoJQHJldHVybiBhcnJheSBkIG1hdHJpeCBkZXRlcm5pbmF0CgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBkZXQoKSB7CgkJaWYgKCR0aGlzLT5tID09ICR0aGlzLT5uKSB7CgkJCSRkID0gJHRoaXMtPnBpdnNpZ247CgkJCWZvciAoJGogPSAwOyAkaiA8ICR0aGlzLT5uOyArKyRqKSB7CgkJCQkkZCAqPSAkdGhpcy0+TFVbJGpdWyRqXTsKCQkJfQoJCQlyZXR1cm4gJGQ7CgkJfSBlbHNlIHsKCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbihQSFBFeGNlbF9TaGFyZWRfSkFNQV9NYXRyaXg6Ok1hdHJpeERpbWVuc2lvbkV4Y2VwdGlvbik7CgkJfQoJfQkvLwlmdW5jdGlvbiBkZXQoKQoKCgkvKioKCSAqCVNvbHZlIEEqWCA9IEIKCSAqCgkgKglAcGFyYW0gICRCICBBIE1hdHJpeCB3aXRoIGFzIG1hbnkgcm93cyBhcyBBIGFuZCBhbnkgbnVtYmVyIG9mIGNvbHVtbnMuCgkgKglAcmV0dXJuICBYIHNvIHRoYXQgTCpVKlggPSBCKHBpdiw6KQoJICoJQGV4Y2VwdGlvbiAgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIE1hdHJpeCByb3cgZGltZW5zaW9ucyBtdXN0IGFncmVlLgoJICoJQGV4Y2VwdGlvbiAgUnVudGltZUV4Y2VwdGlvbiAgTWF0cml4IGlzIHNpbmd1bGFyLgoJICovCglwdWJsaWMgZnVuY3Rpb24gc29sdmUoJEIpIHsKCQlpZiAoJEItPmdldFJvd0RpbWVuc2lvbigpID09ICR0aGlzLT5tKSB7CgkJCWlmICgkdGhpcy0+aXNOb25zaW5ndWxhcigpKSB7CgkJCQkvLyBDb3B5IHJpZ2h0IGhhbmQgc2lkZSB3aXRoIHBpdm90aW5nCgkJCQkkbnggPSAkQi0+Z2V0Q29sdW1uRGltZW5zaW9uKCk7CgkJCQkkWCAgPSAkQi0+Z2V0TWF0cml4KCR0aGlzLT5waXYsIDAsICRueC0xKTsKCQkJCS8vIFNvbHZlIEwqWSA9IEIocGl2LDopCgkJCQlmb3IgKCRrID0gMDsgJGsgPCAkdGhpcy0+bjsgKyskaykgewoJCQkJCWZvciAoJGkgPSAkaysxOyAkaSA8ICR0aGlzLT5uOyArKyRpKSB7CgkJCQkJCWZvciAoJGogPSAwOyAkaiA8ICRueDsgKyskaikgewoJCQkJCQkJJFgtPkFbJGldWyRqXSAtPSAkWC0+QVska11bJGpdICogJHRoaXMtPkxVWyRpXVska107CgkJCQkJCX0KCQkJCQl9CgkJCQl9CgkJCQkvLyBTb2x2ZSBVKlggPSBZOwoJCQkJZm9yICgkayA9ICR0aGlzLT5uLTE7ICRrID49IDA7IC0tJGspIHsKCQkJCQlmb3IgKCRqID0gMDsgJGogPCAkbng7ICsrJGopIHsKCQkJCQkJJFgtPkFbJGtdWyRqXSAvPSAkdGhpcy0+TFVbJGtdWyRrXTsKCQkJCQl9CgkJCQkJZm9yICgkaSA9IDA7ICRpIDwgJGs7ICsrJGkpIHsKCQkJCQkJZm9yICgkaiA9IDA7ICRqIDwgJG54OyArKyRqKSB7CgkJCQkJCQkkWC0+QVskaV1bJGpdIC09ICRYLT5BWyRrXVskal0gKiAkdGhpcy0+TFVbJGldWyRrXTsKCQkJCQkJfQoJCQkJCX0KCQkJCX0KCQkJCXJldHVybiAkWDsKCQkJfSBlbHNlIHsKCQkJCXRocm93IG5ldyBFeGNlcHRpb24oc2VsZjo6TWF0cml4U2luZ3VsYXJFeGNlcHRpb24pOwoJCQl9CgkJfSBlbHNlIHsKCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbihzZWxmOjpNYXRyaXhTcXVhcmVFeGNlcHRpb24pOwoJCX0KCX0JLy8JZnVuY3Rpb24gc29sdmUoKQoKfQkvLwljbGFzcyBQSFBFeGNlbF9TaGFyZWRfSkFNQV9MVURlY29tcG9zaXRpb24K]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Shared/JAMA/Matrix.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIEBwYWNrYWdlIEpBTUEKICovCgovKiogUEhQRXhjZWwgcm9vdCBkaXJlY3RvcnkgKi8KaWYgKCFkZWZpbmVkKCdQSFBFWENFTF9ST09UJykpIHsKCS8qKgoJICogQGlnbm9yZQoJICovCglkZWZpbmUoJ1BIUEVYQ0VMX1JPT1QnLCBkaXJuYW1lKF9fRklMRV9fKSAuICcvLi4vLi4vLi4vJyk7CglyZXF1aXJlKFBIUEVYQ0VMX1JPT1QgLiAnUEhQRXhjZWwvQXV0b2xvYWRlci5waHAnKTsKfQoKCi8qCiAqCU1hdHJpeCBjbGFzcwogKgogKglAYXV0aG9yIFBhdWwgTWVhZ2hlcgogKglAYXV0aG9yIE1pY2hhZWwgQm9tbWFyaXRvCiAqCUBhdXRob3IgTHVrYXN6IEthcmFwdWRhCiAqCUBhdXRob3IgQmFydGVrIE1hdG9zaXVrCiAqCUB2ZXJzaW9uIDEuOAogKglAbGljZW5zZSBQSFAgdjMuMAogKglAc2VlIGh0dHA6Ly9tYXRoLm5pc3QuZ292L2phdmFudW1lcmljcy9qYW1hLwogKi8KY2xhc3MgUEhQRXhjZWxfU2hhcmVkX0pBTUFfTWF0cml4IHsKCgoJY29uc3QgUG9seW1vcnBoaWNBcmd1bWVudEV4Y2VwdGlvbgk9ICJJbnZhbGlkIGFyZ3VtZW50IHBhdHRlcm4gZm9yIHBvbHltb3JwaGljIGZ1bmN0aW9uLiI7Cgljb25zdCBBcmd1bWVudFR5cGVFeGNlcHRpb24JCQk9ICJJbnZhbGlkIGFyZ3VtZW50IHR5cGUuIjsKCWNvbnN0IEFyZ3VtZW50Qm91bmRzRXhjZXB0aW9uCQk9ICJJbnZhbGlkIGFyZ3VtZW50IHJhbmdlLiI7Cgljb25zdCBNYXRyaXhEaW1lbnNpb25FeGNlcHRpb24JCT0gIk1hdHJpeCBkaW1lbnNpb25zIGFyZSBub3QgZXF1YWwuIjsKCWNvbnN0IEFycmF5TGVuZ3RoRXhjZXB0aW9uCQkJPSAiQXJyYXkgbGVuZ3RoIG11c3QgYmUgYSBtdWx0aXBsZSBvZiBtLiI7CgoJLyoqCgkgKglNYXRyaXggc3RvcmFnZQoJICoKCSAqCUB2YXIgYXJyYXkKCSAqCUBhY2Nlc3MgcHVibGljCgkgKi8KCXB1YmxpYyAkQSA9IGFycmF5KCk7CgoJLyoqCgkgKglNYXRyaXggcm93IGRpbWVuc2lvbgoJICoKCSAqCUB2YXIgaW50CgkgKglAYWNjZXNzIHByaXZhdGUKCSAqLwoJcHJpdmF0ZSAkbTsKCgkvKioKCSAqCU1hdHJpeCBjb2x1bW4gZGltZW5zaW9uCgkgKgoJICoJQHZhciBpbnQKCSAqCUBhY2Nlc3MgcHJpdmF0ZQoJICovCglwcml2YXRlICRuOwoKCgkvKioKCSAqCVBvbHltb3JwaGljIGNvbnN0cnVjdG9yCgkgKgoJICoJQXMgUEhQIGhhcyBubyBzdXBwb3J0IGZvciBwb2x5bW9ycGhpYyBjb25zdHJ1Y3RvcnMsIHdlIGhhY2sgb3VyIG93biBzb3J0IG9mIHBvbHltb3JwaGlzbSB1c2luZyBmdW5jX251bV9hcmdzLCBmdW5jX2dldF9hcmcsIGFuZCBnZXR0eXBlLiBJbiBlc3NlbmNlLCB3ZSdyZSBqdXN0IGltcGxlbWVudGluZyBhIHNpbXBsZSBSVFRJIGZpbHRlciBhbmQgY2FsbGluZyB0aGUgYXBwcm9wcmlhdGUgY29uc3RydWN0b3IuCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgpIHsKCQlpZiAoZnVuY19udW1fYXJncygpID4gMCkgewoJCQkkYXJncyA9IGZ1bmNfZ2V0X2FyZ3MoKTsKCQkJJG1hdGNoID0gaW1wbG9kZSgiLCIsIGFycmF5X21hcCgnZ2V0dHlwZScsICRhcmdzKSk7CgoJCQlzd2l0Y2goJG1hdGNoKSB7CgkJCQkvL1JlY3Rhbmd1bGFyIG1hdHJpeCAtIG0geCBuIGluaXRpYWxpemVkIGZyb20gMkQgYXJyYXkKCQkJCWNhc2UgJ2FycmF5JzoKCQkJCQkJJHRoaXMtPm0gPSBjb3VudCgkYXJnc1swXSk7CgkJCQkJCSR0aGlzLT5uID0gY291bnQoJGFyZ3NbMF1bMF0pOwoJCQkJCQkkdGhpcy0+QSA9ICRhcmdzWzBdOwoJCQkJCQlicmVhazsKCQkJCS8vU3F1YXJlIG1hdHJpeCAtIG4geCBuCgkJCQljYXNlICdpbnRlZ2VyJzoKCQkJCQkJJHRoaXMtPm0gPSAkYXJnc1swXTsKCQkJCQkJJHRoaXMtPm4gPSAkYXJnc1swXTsKCQkJCQkJJHRoaXMtPkEgPSBhcnJheV9maWxsKDAsICR0aGlzLT5tLCBhcnJheV9maWxsKDAsICR0aGlzLT5uLCAwKSk7CgkJCQkJCWJyZWFrOwoJCQkJLy9SZWN0YW5ndWxhciBtYXRyaXggLSBtIHggbgoJCQkJY2FzZSAnaW50ZWdlcixpbnRlZ2VyJzoKCQkJCQkJJHRoaXMtPm0gPSAkYXJnc1swXTsKCQkJCQkJJHRoaXMtPm4gPSAkYXJnc1sxXTsKCQkJCQkJJHRoaXMtPkEgPSBhcnJheV9maWxsKDAsICR0aGlzLT5tLCBhcnJheV9maWxsKDAsICR0aGlzLT5uLCAwKSk7CgkJCQkJCWJyZWFrOwoJCQkJLy9SZWN0YW5ndWxhciBtYXRyaXggLSBtIHggbiBpbml0aWFsaXplZCBmcm9tIHBhY2tlZCBhcnJheQoJCQkJY2FzZSAnYXJyYXksaW50ZWdlcic6CgkJCQkJCSR0aGlzLT5tID0gJGFyZ3NbMV07CgkJCQkJCWlmICgkdGhpcy0+bSAhPSAwKSB7CgkJCQkJCQkkdGhpcy0+biA9IGNvdW50KCRhcmdzWzBdKSAvICR0aGlzLT5tOwoJCQkJCQl9IGVsc2UgewoJCQkJCQkJJHRoaXMtPm4gPSAwOwoJCQkJCQl9CgkJCQkJCWlmICgoJHRoaXMtPm0gKiAkdGhpcy0+bikgPT0gY291bnQoJGFyZ3NbMF0pKSB7CgkJCQkJCQlmb3IoJGkgPSAwOyAkaSA8ICR0aGlzLT5tOyArKyRpKSB7CgkJCQkJCQkJZm9yKCRqID0gMDsgJGogPCAkdGhpcy0+bjsgKyskaikgewoJCQkJCQkJCQkkdGhpcy0+QVskaV1bJGpdID0gJGFyZ3NbMF1bJGkgKyAkaiAqICR0aGlzLT5tXTsKCQkJCQkJCQl9CgkJCQkJCQl9CgkJCQkJCX0gZWxzZSB7CgkJCQkJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKHNlbGY6OkFycmF5TGVuZ3RoRXhjZXB0aW9uKTsKCQkJCQkJfQoJCQkJCQlicmVhazsKCQkJCWRlZmF1bHQ6CgkJCQkJCXRocm93IG5ldyBFeGNlcHRpb24oc2VsZjo6UG9seW1vcnBoaWNBcmd1bWVudEV4Y2VwdGlvbik7CgkJCQkJCWJyZWFrOwoJCQl9CgkJfSBlbHNlIHsKCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbihzZWxmOjpQb2x5bW9ycGhpY0FyZ3VtZW50RXhjZXB0aW9uKTsKCQl9Cgl9CS8vCWZ1bmN0aW9uIF9fY29uc3RydWN0KCkKCgoJLyoqCgkgKglnZXRBcnJheQoJICoKCSAqCUByZXR1cm4gYXJyYXkgTWF0cml4IGFycmF5CgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRBcnJheSgpIHsKCQlyZXR1cm4gJHRoaXMtPkE7Cgl9CS8vCWZ1bmN0aW9uIGdldEFycmF5KCkKCgoJLyoqCgkgKglnZXRSb3dEaW1lbnNpb24KCSAqCgkgKglAcmV0dXJuIGludCBSb3cgZGltZW5zaW9uCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRSb3dEaW1lbnNpb24oKSB7CgkJcmV0dXJuICR0aGlzLT5tOwoJfQkvLwlmdW5jdGlvbiBnZXRSb3dEaW1lbnNpb24oKQoKCgkvKioKCSAqCWdldENvbHVtbkRpbWVuc2lvbgoJICoKCSAqCUByZXR1cm4gaW50IENvbHVtbiBkaW1lbnNpb24KCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldENvbHVtbkRpbWVuc2lvbigpIHsKCQlyZXR1cm4gJHRoaXMtPm47Cgl9CS8vCWZ1bmN0aW9uIGdldENvbHVtbkRpbWVuc2lvbigpCgoKCS8qKgoJICoJZ2V0CgkgKgoJICoJR2V0IHRoZSBpLGotdGggZWxlbWVudCBvZiB0aGUgbWF0cml4LgoJICoJQHBhcmFtIGludCAkaSBSb3cgcG9zaXRpb24KCSAqCUBwYXJhbSBpbnQgJGogQ29sdW1uIHBvc2l0aW9uCgkgKglAcmV0dXJuIG1peGVkIEVsZW1lbnQgKGludC9mbG9hdC9kb3VibGUpCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXQoJGkgPSBudWxsLCAkaiA9IG51bGwpIHsKCQlyZXR1cm4gJHRoaXMtPkFbJGldWyRqXTsKCX0JLy8JZnVuY3Rpb24gZ2V0KCkKCgoJLyoqCgkgKglnZXRNYXRyaXgKCSAqCgkgKglHZXQgYSBzdWJtYXRyaXgKCSAqCUBwYXJhbSBpbnQgJGkwIEluaXRpYWwgcm93IGluZGV4CgkgKglAcGFyYW0gaW50ICRpRiBGaW5hbCByb3cgaW5kZXgKCSAqCUBwYXJhbSBpbnQgJGowIEluaXRpYWwgY29sdW1uIGluZGV4CgkgKglAcGFyYW0gaW50ICRqRiBGaW5hbCBjb2x1bW4gaW5kZXgKCSAqCUByZXR1cm4gTWF0cml4IFN1Ym1hdHJpeAoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0TWF0cml4KCkgewoJCWlmIChmdW5jX251bV9hcmdzKCkgPiAwKSB7CgkJCSRhcmdzID0gZnVuY19nZXRfYXJncygpOwoJCQkkbWF0Y2ggPSBpbXBsb2RlKCIsIiwgYXJyYXlfbWFwKCdnZXR0eXBlJywgJGFyZ3MpKTsKCgkJCXN3aXRjaCgkbWF0Y2gpIHsKCQkJCS8vQSgkaTAuLi47ICRqMC4uLikKCQkJCWNhc2UgJ2ludGVnZXIsaW50ZWdlcic6CgkJCQkJCWxpc3QoJGkwLCAkajApID0gJGFyZ3M7CgkJCQkJCWlmICgkaTAgPj0gMCkgeyAkbSA9ICR0aGlzLT5tIC0gJGkwOyB9IGVsc2UgeyB0aHJvdyBuZXcgRXhjZXB0aW9uKHNlbGY6OkFyZ3VtZW50Qm91bmRzRXhjZXB0aW9uKTsgfQoJCQkJCQlpZiAoJGowID49IDApIHsgJG4gPSAkdGhpcy0+biAtICRqMDsgfSBlbHNlIHsgdGhyb3cgbmV3IEV4Y2VwdGlvbihzZWxmOjpBcmd1bWVudEJvdW5kc0V4Y2VwdGlvbik7IH0KCQkJCQkJJFIgPSBuZXcgUEhQRXhjZWxfU2hhcmVkX0pBTUFfTWF0cml4KCRtLCAkbik7CgkJCQkJCWZvcigkaSA9ICRpMDsgJGkgPCAkdGhpcy0+bTsgKyskaSkgewoJCQkJCQkJZm9yKCRqID0gJGowOyAkaiA8ICR0aGlzLT5uOyArKyRqKSB7CgkJCQkJCQkJJFItPnNldCgkaSwgJGosICR0aGlzLT5BWyRpXVskal0pOwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJCXJldHVybiAkUjsKCQkJCQkJYnJlYWs7CgkJCQkvL0EoJGkwLi4uJGlGOyAkajAuLi4kakYpCgkJCQljYXNlICdpbnRlZ2VyLGludGVnZXIsaW50ZWdlcixpbnRlZ2VyJzoKCQkJCQkJbGlzdCgkaTAsICRpRiwgJGowLCAkakYpID0gJGFyZ3M7CgkJCQkJCWlmICgoJGlGID4gJGkwKSAmJiAoJHRoaXMtPm0gPj0gJGlGKSAmJiAoJGkwID49IDApKSB7ICRtID0gJGlGIC0gJGkwOyB9IGVsc2UgeyB0aHJvdyBuZXcgRXhjZXB0aW9uKHNlbGY6OkFyZ3VtZW50Qm91bmRzRXhjZXB0aW9uKTsgfQoJCQkJCQlpZiAoKCRqRiA+ICRqMCkgJiYgKCR0aGlzLT5uID49ICRqRikgJiYgKCRqMCA+PSAwKSkgeyAkbiA9ICRqRiAtICRqMDsgfSBlbHNlIHsgdGhyb3cgbmV3IEV4Y2VwdGlvbihzZWxmOjpBcmd1bWVudEJvdW5kc0V4Y2VwdGlvbik7IH0KCQkJCQkJJFIgPSBuZXcgUEhQRXhjZWxfU2hhcmVkX0pBTUFfTWF0cml4KCRtKzEsICRuKzEpOwoJCQkJCQlmb3IoJGkgPSAkaTA7ICRpIDw9ICRpRjsgKyskaSkgewoJCQkJCQkJZm9yKCRqID0gJGowOyAkaiA8PSAkakY7ICsrJGopIHsKCQkJCQkJCQkkUi0+c2V0KCRpIC0gJGkwLCAkaiAtICRqMCwgJHRoaXMtPkFbJGldWyRqXSk7CgkJCQkJCQl9CgkJCQkJCX0KCQkJCQkJcmV0dXJuICRSOwoJCQkJCQlicmVhazsKCQkJCS8vJFIgPSBhcnJheSBvZiByb3cgaW5kaWNlczsgJEMgPSBhcnJheSBvZiBjb2x1bW4gaW5kaWNlcwoJCQkJY2FzZSAnYXJyYXksYXJyYXknOgoJCQkJCQlsaXN0KCRSTCwgJENMKSA9ICRhcmdzOwoJCQkJCQlpZiAoY291bnQoJFJMKSA+IDApIHsgJG0gPSBjb3VudCgkUkwpOyB9IGVsc2UgeyB0aHJvdyBuZXcgRXhjZXB0aW9uKHNlbGY6OkFyZ3VtZW50Qm91bmRzRXhjZXB0aW9uKTsgfQoJCQkJCQlpZiAoY291bnQoJENMKSA+IDApIHsgJG4gPSBjb3VudCgkQ0wpOyB9IGVsc2UgeyB0aHJvdyBuZXcgRXhjZXB0aW9uKHNlbGY6OkFyZ3VtZW50Qm91bmRzRXhjZXB0aW9uKTsgfQoJCQkJCQkkUiA9IG5ldyBQSFBFeGNlbF9TaGFyZWRfSkFNQV9NYXRyaXgoJG0sICRuKTsKCQkJCQkJZm9yKCRpID0gMDsgJGkgPCAkbTsgKyskaSkgewoJCQkJCQkJZm9yKCRqID0gMDsgJGogPCAkbjsgKyskaikgewoJCQkJCQkJCSRSLT5zZXQoJGkgLSAkaTAsICRqIC0gJGowLCAkdGhpcy0+QVskUkxbJGldXVskQ0xbJGpdXSk7CgkJCQkJCQl9CgkJCQkJCX0KCQkJCQkJcmV0dXJuICRSOwoJCQkJCQlicmVhazsKCQkJCS8vJFJMID0gYXJyYXkgb2Ygcm93IGluZGljZXM7ICRDTCA9IGFycmF5IG9mIGNvbHVtbiBpbmRpY2VzCgkJCQljYXNlICdhcnJheSxhcnJheSc6CgkJCQkJCWxpc3QoJFJMLCAkQ0wpID0gJGFyZ3M7CgkJCQkJCWlmIChjb3VudCgkUkwpID4gMCkgeyAkbSA9IGNvdW50KCRSTCk7IH0gZWxzZSB7IHRocm93IG5ldyBFeGNlcHRpb24oc2VsZjo6QXJndW1lbnRCb3VuZHNFeGNlcHRpb24pOyB9CgkJCQkJCWlmIChjb3VudCgkQ0wpID4gMCkgeyAkbiA9IGNvdW50KCRDTCk7IH0gZWxzZSB7IHRocm93IG5ldyBFeGNlcHRpb24oc2VsZjo6QXJndW1lbnRCb3VuZHNFeGNlcHRpb24pOyB9CgkJCQkJCSRSID0gbmV3IFBIUEV4Y2VsX1NoYXJlZF9KQU1BX01hdHJpeCgkbSwgJG4pOwoJCQkJCQlmb3IoJGkgPSAwOyAkaSA8ICRtOyArKyRpKSB7CgkJCQkJCQlmb3IoJGogPSAwOyAkaiA8ICRuOyArKyRqKSB7CgkJCQkJCQkJJFItPnNldCgkaSwgJGosICR0aGlzLT5BWyRSTFskaV1dWyRDTFskal1dKTsKCQkJCQkJCX0KCQkJCQkJfQoJCQkJCQlyZXR1cm4gJFI7CgkJCQkJCWJyZWFrOwoJCQkJLy9BKCRpMC4uLiRpRik7ICRDTCA9IGFycmF5IG9mIGNvbHVtbiBpbmRpY2VzCgkJCQljYXNlICdpbnRlZ2VyLGludGVnZXIsYXJyYXknOgoJCQkJCQlsaXN0KCRpMCwgJGlGLCAkQ0wpID0gJGFyZ3M7CgkJCQkJCWlmICgoJGlGID4gJGkwKSAmJiAoJHRoaXMtPm0gPj0gJGlGKSAmJiAoJGkwID49IDApKSB7ICRtID0gJGlGIC0gJGkwOyB9IGVsc2UgeyB0aHJvdyBuZXcgRXhjZXB0aW9uKHNlbGY6OkFyZ3VtZW50Qm91bmRzRXhjZXB0aW9uKTsgfQoJCQkJCQlpZiAoY291bnQoJENMKSA+IDApIHsgJG4gPSBjb3VudCgkQ0wpOyB9IGVsc2UgeyB0aHJvdyBuZXcgRXhjZXB0aW9uKHNlbGY6OkFyZ3VtZW50Qm91bmRzRXhjZXB0aW9uKTsgfQoJCQkJCQkkUiA9IG5ldyBQSFBFeGNlbF9TaGFyZWRfSkFNQV9NYXRyaXgoJG0sICRuKTsKCQkJCQkJZm9yKCRpID0gJGkwOyAkaSA8ICRpRjsgKyskaSkgewoJCQkJCQkJZm9yKCRqID0gMDsgJGogPCAkbjsgKyskaikgewoJCQkJCQkJCSRSLT5zZXQoJGkgLSAkaTAsICRqLCAkdGhpcy0+QVskUkxbJGldXVskal0pOwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJCXJldHVybiAkUjsKCQkJCQkJYnJlYWs7CgkJCQkvLyRSTCA9IGFycmF5IG9mIHJvdyBpbmRpY2VzCgkJCQljYXNlICdhcnJheSxpbnRlZ2VyLGludGVnZXInOgoJCQkJCQlsaXN0KCRSTCwgJGowLCAkakYpID0gJGFyZ3M7CgkJCQkJCWlmIChjb3VudCgkUkwpID4gMCkgeyAkbSA9IGNvdW50KCRSTCk7IH0gZWxzZSB7IHRocm93IG5ldyBFeGNlcHRpb24oc2VsZjo6QXJndW1lbnRCb3VuZHNFeGNlcHRpb24pOyB9CgkJCQkJCWlmICgoJGpGID49ICRqMCkgJiYgKCR0aGlzLT5uID49ICRqRikgJiYgKCRqMCA+PSAwKSkgeyAkbiA9ICRqRiAtICRqMDsgfSBlbHNlIHsgdGhyb3cgbmV3IEV4Y2VwdGlvbihzZWxmOjpBcmd1bWVudEJvdW5kc0V4Y2VwdGlvbik7IH0KCQkJCQkJJFIgPSBuZXcgUEhQRXhjZWxfU2hhcmVkX0pBTUFfTWF0cml4KCRtLCAkbisxKTsKCQkJCQkJZm9yKCRpID0gMDsgJGkgPCAkbTsgKyskaSkgewoJCQkJCQkJZm9yKCRqID0gJGowOyAkaiA8PSAkakY7ICsrJGopIHsKCQkJCQkJCQkkUi0+c2V0KCRpLCAkaiAtICRqMCwgJHRoaXMtPkFbJFJMWyRpXV1bJGpdKTsKCQkJCQkJCX0KCQkJCQkJfQoJCQkJCQlyZXR1cm4gJFI7CgkJCQkJCWJyZWFrOwoJCQkJZGVmYXVsdDoKCQkJCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbihzZWxmOjpQb2x5bW9ycGhpY0FyZ3VtZW50RXhjZXB0aW9uKTsKCQkJCQkJYnJlYWs7CgkJCX0KCQl9IGVsc2UgewoJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKHNlbGY6OlBvbHltb3JwaGljQXJndW1lbnRFeGNlcHRpb24pOwoJCX0KCX0JLy8JZnVuY3Rpb24gZ2V0TWF0cml4KCkKCgoJLyoqCgkgKgljaGVja01hdHJpeERpbWVuc2lvbnMKCSAqCgkgKglJcyBtYXRyaXggQiB0aGUgc2FtZSBzaXplPwoJICoJQHBhcmFtIE1hdHJpeCAkQiBNYXRyaXggQgoJICoJQHJldHVybiBib29sZWFuCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBjaGVja01hdHJpeERpbWVuc2lvbnMoJEIgPSBudWxsKSB7CgkJaWYgKCRCIGluc3RhbmNlb2YgUEhQRXhjZWxfU2hhcmVkX0pBTUFfTWF0cml4KSB7CgkJCWlmICgoJHRoaXMtPm0gPT0gJEItPmdldFJvd0RpbWVuc2lvbigpKSAmJiAoJHRoaXMtPm4gPT0gJEItPmdldENvbHVtbkRpbWVuc2lvbigpKSkgewoJCQkJcmV0dXJuIHRydWU7CgkJCX0gZWxzZSB7CgkJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKHNlbGY6Ok1hdHJpeERpbWVuc2lvbkV4Y2VwdGlvbik7CgkJCX0KCQl9IGVsc2UgewoJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKHNlbGY6OkFyZ3VtZW50VHlwZUV4Y2VwdGlvbik7CgkJfQoJfQkvLwlmdW5jdGlvbiBjaGVja01hdHJpeERpbWVuc2lvbnMoKQoKCgoJLyoqCgkgKglzZXQKCSAqCgkgKglTZXQgdGhlIGksai10aCBlbGVtZW50IG9mIHRoZSBtYXRyaXguCgkgKglAcGFyYW0gaW50ICRpIFJvdyBwb3NpdGlvbgoJICoJQHBhcmFtIGludCAkaiBDb2x1bW4gcG9zaXRpb24KCSAqCUBwYXJhbSBtaXhlZCAkYyBJbnQvZmxvYXQvZG91YmxlIHZhbHVlCgkgKglAcmV0dXJuIG1peGVkIEVsZW1lbnQgKGludC9mbG9hdC9kb3VibGUpCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBzZXQoJGkgPSBudWxsLCAkaiA9IG51bGwsICRjID0gbnVsbCkgewoJCS8vIE9wdGltaXplZCBzZXQgdmVyc2lvbiBqdXN0IGhhcyB0aGlzCgkJJHRoaXMtPkFbJGldWyRqXSA9ICRjOwoJfQkvLwlmdW5jdGlvbiBzZXQoKQoKCgkvKioKCSAqCWlkZW50aXR5CgkgKgoJICoJR2VuZXJhdGUgYW4gaWRlbnRpdHkgbWF0cml4LgoJICoJQHBhcmFtIGludCAkbSBSb3cgZGltZW5zaW9uCgkgKglAcGFyYW0gaW50ICRuIENvbHVtbiBkaW1lbnNpb24KCSAqCUByZXR1cm4gTWF0cml4IElkZW50aXR5IG1hdHJpeAoJICovCglwdWJsaWMgZnVuY3Rpb24gaWRlbnRpdHkoJG0gPSBudWxsLCAkbiA9IG51bGwpIHsKCQlyZXR1cm4gJHRoaXMtPmRpYWdvbmFsKCRtLCAkbiwgMSk7Cgl9CS8vCWZ1bmN0aW9uIGlkZW50aXR5KCkKCgoJLyoqCgkgKglkaWFnb25hbAoJICoKCSAqCUdlbmVyYXRlIGEgZGlhZ29uYWwgbWF0cml4CgkgKglAcGFyYW0gaW50ICRtIFJvdyBkaW1lbnNpb24KCSAqCUBwYXJhbSBpbnQgJG4gQ29sdW1uIGRpbWVuc2lvbgoJICoJQHBhcmFtIG1peGVkICRjIERpYWdvbmFsIHZhbHVlCgkgKglAcmV0dXJuIE1hdHJpeCBEaWFnb25hbCBtYXRyaXgKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGRpYWdvbmFsKCRtID0gbnVsbCwgJG4gPSBudWxsLCAkYyA9IDEpIHsKCQkkUiA9IG5ldyBQSFBFeGNlbF9TaGFyZWRfSkFNQV9NYXRyaXgoJG0sICRuKTsKCQlmb3IoJGkgPSAwOyAkaSA8ICRtOyArKyRpKSB7CgkJCSRSLT5zZXQoJGksICRpLCAkYyk7CgkJfQoJCXJldHVybiAkUjsKCX0JLy8JZnVuY3Rpb24gZGlhZ29uYWwoKQoKCgkvKioKCSAqCWdldE1hdHJpeEJ5Um93CgkgKgoJICoJR2V0IGEgc3VibWF0cml4IGJ5IHJvdyBpbmRleC9yYW5nZQoJICoJQHBhcmFtIGludCAkaTAgSW5pdGlhbCByb3cgaW5kZXgKCSAqCUBwYXJhbSBpbnQgJGlGIEZpbmFsIHJvdyBpbmRleAoJICoJQHJldHVybiBNYXRyaXggU3VibWF0cml4CgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRNYXRyaXhCeVJvdygkaTAgPSBudWxsLCAkaUYgPSBudWxsKSB7CgkJaWYgKGlzX2ludCgkaTApKSB7CgkJCWlmIChpc19pbnQoJGlGKSkgewoJCQkJcmV0dXJuICR0aGlzLT5nZXRNYXRyaXgoJGkwLCAwLCAkaUYgKyAxLCAkdGhpcy0+bik7CgkJCX0gZWxzZSB7CgkJCQlyZXR1cm4gJHRoaXMtPmdldE1hdHJpeCgkaTAsIDAsICRpMCArIDEsICR0aGlzLT5uKTsKCQkJfQoJCX0gZWxzZSB7CgkJCXRocm93IG5ldyBFeGNlcHRpb24oc2VsZjo6QXJndW1lbnRUeXBlRXhjZXB0aW9uKTsKCQl9Cgl9CS8vCWZ1bmN0aW9uIGdldE1hdHJpeEJ5Um93KCkKCgoJLyoqCgkgKglnZXRNYXRyaXhCeUNvbAoJICoKCSAqCUdldCBhIHN1Ym1hdHJpeCBieSBjb2x1bW4gaW5kZXgvcmFuZ2UKCSAqCUBwYXJhbSBpbnQgJGkwIEluaXRpYWwgY29sdW1uIGluZGV4CgkgKglAcGFyYW0gaW50ICRpRiBGaW5hbCBjb2x1bW4gaW5kZXgKCSAqCUByZXR1cm4gTWF0cml4IFN1Ym1hdHJpeAoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0TWF0cml4QnlDb2woJGowID0gbnVsbCwgJGpGID0gbnVsbCkgewoJCWlmIChpc19pbnQoJGowKSkgewoJCQlpZiAoaXNfaW50KCRqRikpIHsKCQkJCXJldHVybiAkdGhpcy0+Z2V0TWF0cml4KDAsICRqMCwgJHRoaXMtPm0sICRqRiArIDEpOwoJCQl9IGVsc2UgewoJCQkJcmV0dXJuICR0aGlzLT5nZXRNYXRyaXgoMCwgJGowLCAkdGhpcy0+bSwgJGowICsgMSk7CgkJCX0KCQl9IGVsc2UgewoJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKHNlbGY6OkFyZ3VtZW50VHlwZUV4Y2VwdGlvbik7CgkJfQoJfQkvLwlmdW5jdGlvbiBnZXRNYXRyaXhCeUNvbCgpCgoKCS8qKgoJICoJdHJhbnNwb3NlCgkgKgoJICoJVHJhbnBvc2UgbWF0cml4CgkgKglAcmV0dXJuIE1hdHJpeCBUcmFuc3Bvc2VkIG1hdHJpeAoJICovCglwdWJsaWMgZnVuY3Rpb24gdHJhbnNwb3NlKCkgewoJCSRSID0gbmV3IFBIUEV4Y2VsX1NoYXJlZF9KQU1BX01hdHJpeCgkdGhpcy0+biwgJHRoaXMtPm0pOwoJCWZvcigkaSA9IDA7ICRpIDwgJHRoaXMtPm07ICsrJGkpIHsKCQkJZm9yKCRqID0gMDsgJGogPCAkdGhpcy0+bjsgKyskaikgewoJCQkJJFItPnNldCgkaiwgJGksICR0aGlzLT5BWyRpXVskal0pOwoJCQl9CgkJfQoJCXJldHVybiAkUjsKCX0JLy8JZnVuY3Rpb24gdHJhbnNwb3NlKCkKCgoJLyoqCgkgKgl0cmFjZQoJICoKCSAqCVN1bSBvZiBkaWFnb25hbCBlbGVtZW50cwoJICoJQHJldHVybiBmbG9hdCBTdW0gb2YgZGlhZ29uYWwgZWxlbWVudHMKCSAqLwoJcHVibGljIGZ1bmN0aW9uIHRyYWNlKCkgewoJCSRzID0gMDsKCQkkbiA9IG1pbigkdGhpcy0+bSwgJHRoaXMtPm4pOwoJCWZvcigkaSA9IDA7ICRpIDwgJG47ICsrJGkpIHsKCQkJJHMgKz0gJHRoaXMtPkFbJGldWyRpXTsKCQl9CgkJcmV0dXJuICRzOwoJfQkvLwlmdW5jdGlvbiB0cmFjZSgpCgoKCS8qKgoJICoJdW1pbnVzCgkgKgoJICoJVW5hcnkgbWludXMgbWF0cml4IC1BCgkgKglAcmV0dXJuIE1hdHJpeCBVbmFyeSBtaW51cyBtYXRyaXgKCSAqLwoJcHVibGljIGZ1bmN0aW9uIHVtaW51cygpIHsKCX0JLy8JZnVuY3Rpb24gdW1pbnVzKCkKCgoJLyoqCgkgKglwbHVzCgkgKgoJICoJQSArIEIKCSAqCUBwYXJhbSBtaXhlZCAkQiBNYXRyaXgvQXJyYXkKCSAqCUByZXR1cm4gTWF0cml4IFN1bQoJICovCglwdWJsaWMgZnVuY3Rpb24gcGx1cygpIHsKCQlpZiAoZnVuY19udW1fYXJncygpID4gMCkgewoJCQkkYXJncyA9IGZ1bmNfZ2V0X2FyZ3MoKTsKCQkJJG1hdGNoID0gaW1wbG9kZSgiLCIsIGFycmF5X21hcCgnZ2V0dHlwZScsICRhcmdzKSk7CgoJCQlzd2l0Y2goJG1hdGNoKSB7CgkJCQljYXNlICdvYmplY3QnOgoJCQkJCQlpZiAoJGFyZ3NbMF0gaW5zdGFuY2VvZiBQSFBFeGNlbF9TaGFyZWRfSkFNQV9NYXRyaXgpIHsgJE0gPSAkYXJnc1swXTsgfSBlbHNlIHsgdGhyb3cgbmV3IEV4Y2VwdGlvbihzZWxmOjpBcmd1bWVudFR5cGVFeGNlcHRpb24pOyB9CgkJCQkJCWJyZWFrOwoJCQkJY2FzZSAnYXJyYXknOgoJCQkJCQkkTSA9IG5ldyBQSFBFeGNlbF9TaGFyZWRfSkFNQV9NYXRyaXgoJGFyZ3NbMF0pOwoJCQkJCQlicmVhazsKCQkJCWRlZmF1bHQ6CgkJCQkJCXRocm93IG5ldyBFeGNlcHRpb24oc2VsZjo6UG9seW1vcnBoaWNBcmd1bWVudEV4Y2VwdGlvbik7CgkJCQkJCWJyZWFrOwoJCQl9CgkJCSR0aGlzLT5jaGVja01hdHJpeERpbWVuc2lvbnMoJE0pOwoJCQlmb3IoJGkgPSAwOyAkaSA8ICR0aGlzLT5tOyArKyRpKSB7CgkJCQlmb3IoJGogPSAwOyAkaiA8ICR0aGlzLT5uOyArKyRqKSB7CgkJCQkJJE0tPnNldCgkaSwgJGosICRNLT5nZXQoJGksICRqKSArICR0aGlzLT5BWyRpXVskal0pOwoJCQkJfQoJCQl9CgkJCXJldHVybiAkTTsKCQl9IGVsc2UgewoJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKHNlbGY6OlBvbHltb3JwaGljQXJndW1lbnRFeGNlcHRpb24pOwoJCX0KCX0JLy8JZnVuY3Rpb24gcGx1cygpCgoKCS8qKgoJICoJcGx1c0VxdWFscwoJICoKCSAqCUEgPSBBICsgQgoJICoJQHBhcmFtIG1peGVkICRCIE1hdHJpeC9BcnJheQoJICoJQHJldHVybiBNYXRyaXggU3VtCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBwbHVzRXF1YWxzKCkgewoJCWlmIChmdW5jX251bV9hcmdzKCkgPiAwKSB7CgkJCSRhcmdzID0gZnVuY19nZXRfYXJncygpOwoJCQkkbWF0Y2ggPSBpbXBsb2RlKCIsIiwgYXJyYXlfbWFwKCdnZXR0eXBlJywgJGFyZ3MpKTsKCgkJCXN3aXRjaCgkbWF0Y2gpIHsKCQkJCWNhc2UgJ29iamVjdCc6CgkJCQkJCWlmICgkYXJnc1swXSBpbnN0YW5jZW9mIFBIUEV4Y2VsX1NoYXJlZF9KQU1BX01hdHJpeCkgeyAkTSA9ICRhcmdzWzBdOyB9IGVsc2UgeyB0aHJvdyBuZXcgRXhjZXB0aW9uKHNlbGY6OkFyZ3VtZW50VHlwZUV4Y2VwdGlvbik7IH0KCQkJCQkJYnJlYWs7CgkJCQljYXNlICdhcnJheSc6CgkJCQkJCSRNID0gbmV3IFBIUEV4Y2VsX1NoYXJlZF9KQU1BX01hdHJpeCgkYXJnc1swXSk7CgkJCQkJCWJyZWFrOwoJCQkJZGVmYXVsdDoKCQkJCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbihzZWxmOjpQb2x5bW9ycGhpY0FyZ3VtZW50RXhjZXB0aW9uKTsKCQkJCQkJYnJlYWs7CgkJCX0KCQkJJHRoaXMtPmNoZWNrTWF0cml4RGltZW5zaW9ucygkTSk7CgkJCWZvcigkaSA9IDA7ICRpIDwgJHRoaXMtPm07ICsrJGkpIHsKCQkJCWZvcigkaiA9IDA7ICRqIDwgJHRoaXMtPm47ICsrJGopIHsKCQkJCQkkdmFsaWRWYWx1ZXMgPSBUcnVlOwoJCQkJCSR2YWx1ZSA9ICRNLT5nZXQoJGksICRqKTsKCQkJCQlpZiAoKGlzX3N0cmluZygkdGhpcy0+QVskaV1bJGpdKSkgJiYgKHN0cmxlbigkdGhpcy0+QVskaV1bJGpdKSA+IDApICYmICghaXNfbnVtZXJpYygkdGhpcy0+QVskaV1bJGpdKSkpIHsKCQkJCQkJJHRoaXMtPkFbJGldWyRqXSA9IHRyaW0oJHRoaXMtPkFbJGldWyRqXSwnIicpOwoJCQkJCQkkdmFsaWRWYWx1ZXMgJj0gUEhQRXhjZWxfU2hhcmVkX1N0cmluZzo6Y29udmVydFRvTnVtYmVySWZGcmFjdGlvbigkdGhpcy0+QVskaV1bJGpdKTsKCQkJCQl9CgkJCQkJaWYgKChpc19zdHJpbmcoJHZhbHVlKSkgJiYgKHN0cmxlbigkdmFsdWUpID4gMCkgJiYgKCFpc19udW1lcmljKCR2YWx1ZSkpKSB7CgkJCQkJCSR2YWx1ZSA9IHRyaW0oJHZhbHVlLCciJyk7CgkJCQkJCSR2YWxpZFZhbHVlcyAmPSBQSFBFeGNlbF9TaGFyZWRfU3RyaW5nOjpjb252ZXJ0VG9OdW1iZXJJZkZyYWN0aW9uKCR2YWx1ZSk7CgkJCQkJfQoJCQkJCWlmICgkdmFsaWRWYWx1ZXMpIHsKCQkJCQkJJHRoaXMtPkFbJGldWyRqXSArPSAkdmFsdWU7CgkJCQkJfSBlbHNlIHsKCQkJCQkJJHRoaXMtPkFbJGldWyRqXSA9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6TmFOKCk7CgkJCQkJfQoJCQkJfQoJCQl9CgkJCXJldHVybiAkdGhpczsKCQl9IGVsc2UgewoJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKHNlbGY6OlBvbHltb3JwaGljQXJndW1lbnRFeGNlcHRpb24pOwoJCX0KCX0JLy8JZnVuY3Rpb24gcGx1c0VxdWFscygpCgoKCS8qKgoJICoJbWludXMKCSAqCgkgKglBIC0gQgoJICoJQHBhcmFtIG1peGVkICRCIE1hdHJpeC9BcnJheQoJICoJQHJldHVybiBNYXRyaXggU3VtCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBtaW51cygpIHsKCQlpZiAoZnVuY19udW1fYXJncygpID4gMCkgewoJCQkkYXJncyA9IGZ1bmNfZ2V0X2FyZ3MoKTsKCQkJJG1hdGNoID0gaW1wbG9kZSgiLCIsIGFycmF5X21hcCgnZ2V0dHlwZScsICRhcmdzKSk7CgoJCQlzd2l0Y2goJG1hdGNoKSB7CgkJCQljYXNlICdvYmplY3QnOgoJCQkJCQlpZiAoJGFyZ3NbMF0gaW5zdGFuY2VvZiBQSFBFeGNlbF9TaGFyZWRfSkFNQV9NYXRyaXgpIHsgJE0gPSAkYXJnc1swXTsgfSBlbHNlIHsgdGhyb3cgbmV3IEV4Y2VwdGlvbihzZWxmOjpBcmd1bWVudFR5cGVFeGNlcHRpb24pOyB9CgkJCQkJCWJyZWFrOwoJCQkJY2FzZSAnYXJyYXknOgoJCQkJCQkkTSA9IG5ldyBQSFBFeGNlbF9TaGFyZWRfSkFNQV9NYXRyaXgoJGFyZ3NbMF0pOwoJCQkJCQlicmVhazsKCQkJCWRlZmF1bHQ6CgkJCQkJCXRocm93IG5ldyBFeGNlcHRpb24oc2VsZjo6UG9seW1vcnBoaWNBcmd1bWVudEV4Y2VwdGlvbik7CgkJCQkJCWJyZWFrOwoJCQl9CgkJCSR0aGlzLT5jaGVja01hdHJpeERpbWVuc2lvbnMoJE0pOwoJCQlmb3IoJGkgPSAwOyAkaSA8ICR0aGlzLT5tOyArKyRpKSB7CgkJCQlmb3IoJGogPSAwOyAkaiA8ICR0aGlzLT5uOyArKyRqKSB7CgkJCQkJJE0tPnNldCgkaSwgJGosICRNLT5nZXQoJGksICRqKSAtICR0aGlzLT5BWyRpXVskal0pOwoJCQkJfQoJCQl9CgkJCXJldHVybiAkTTsKCQl9IGVsc2UgewoJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKHNlbGY6OlBvbHltb3JwaGljQXJndW1lbnRFeGNlcHRpb24pOwoJCX0KCX0JLy8JZnVuY3Rpb24gbWludXMoKQoKCgkvKioKCSAqCW1pbnVzRXF1YWxzCgkgKgoJICoJQSA9IEEgLSBCCgkgKglAcGFyYW0gbWl4ZWQgJEIgTWF0cml4L0FycmF5CgkgKglAcmV0dXJuIE1hdHJpeCBTdW0KCSAqLwoJcHVibGljIGZ1bmN0aW9uIG1pbnVzRXF1YWxzKCkgewoJCWlmIChmdW5jX251bV9hcmdzKCkgPiAwKSB7CgkJCSRhcmdzID0gZnVuY19nZXRfYXJncygpOwoJCQkkbWF0Y2ggPSBpbXBsb2RlKCIsIiwgYXJyYXlfbWFwKCdnZXR0eXBlJywgJGFyZ3MpKTsKCgkJCXN3aXRjaCgkbWF0Y2gpIHsKCQkJCWNhc2UgJ29iamVjdCc6CgkJCQkJCWlmICgkYXJnc1swXSBpbnN0YW5jZW9mIFBIUEV4Y2VsX1NoYXJlZF9KQU1BX01hdHJpeCkgeyAkTSA9ICRhcmdzWzBdOyB9IGVsc2UgeyB0aHJvdyBuZXcgRXhjZXB0aW9uKHNlbGY6OkFyZ3VtZW50VHlwZUV4Y2VwdGlvbik7IH0KCQkJCQkJYnJlYWs7CgkJCQljYXNlICdhcnJheSc6CgkJCQkJCSRNID0gbmV3IFBIUEV4Y2VsX1NoYXJlZF9KQU1BX01hdHJpeCgkYXJnc1swXSk7CgkJCQkJCWJyZWFrOwoJCQkJZGVmYXVsdDoKCQkJCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbihzZWxmOjpQb2x5bW9ycGhpY0FyZ3VtZW50RXhjZXB0aW9uKTsKCQkJCQkJYnJlYWs7CgkJCX0KCQkJJHRoaXMtPmNoZWNrTWF0cml4RGltZW5zaW9ucygkTSk7CgkJCWZvcigkaSA9IDA7ICRpIDwgJHRoaXMtPm07ICsrJGkpIHsKCQkJCWZvcigkaiA9IDA7ICRqIDwgJHRoaXMtPm47ICsrJGopIHsKCQkJCQkkdmFsaWRWYWx1ZXMgPSBUcnVlOwoJCQkJCSR2YWx1ZSA9ICRNLT5nZXQoJGksICRqKTsKCQkJCQlpZiAoKGlzX3N0cmluZygkdGhpcy0+QVskaV1bJGpdKSkgJiYgKHN0cmxlbigkdGhpcy0+QVskaV1bJGpdKSA+IDApICYmICghaXNfbnVtZXJpYygkdGhpcy0+QVskaV1bJGpdKSkpIHsKCQkJCQkJJHRoaXMtPkFbJGldWyRqXSA9IHRyaW0oJHRoaXMtPkFbJGldWyRqXSwnIicpOwoJCQkJCQkkdmFsaWRWYWx1ZXMgJj0gUEhQRXhjZWxfU2hhcmVkX1N0cmluZzo6Y29udmVydFRvTnVtYmVySWZGcmFjdGlvbigkdGhpcy0+QVskaV1bJGpdKTsKCQkJCQl9CgkJCQkJaWYgKChpc19zdHJpbmcoJHZhbHVlKSkgJiYgKHN0cmxlbigkdmFsdWUpID4gMCkgJiYgKCFpc19udW1lcmljKCR2YWx1ZSkpKSB7CgkJCQkJCSR2YWx1ZSA9IHRyaW0oJHZhbHVlLCciJyk7CgkJCQkJCSR2YWxpZFZhbHVlcyAmPSBQSFBFeGNlbF9TaGFyZWRfU3RyaW5nOjpjb252ZXJ0VG9OdW1iZXJJZkZyYWN0aW9uKCR2YWx1ZSk7CgkJCQkJfQoJCQkJCWlmICgkdmFsaWRWYWx1ZXMpIHsKCQkJCQkJJHRoaXMtPkFbJGldWyRqXSAtPSAkdmFsdWU7CgkJCQkJfSBlbHNlIHsKCQkJCQkJJHRoaXMtPkFbJGldWyRqXSA9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6TmFOKCk7CgkJCQkJfQoJCQkJfQoJCQl9CgkJCXJldHVybiAkdGhpczsKCQl9IGVsc2UgewoJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKHNlbGY6OlBvbHltb3JwaGljQXJndW1lbnRFeGNlcHRpb24pOwoJCX0KCX0JLy8JZnVuY3Rpb24gbWludXNFcXVhbHMoKQoKCgkvKioKCSAqCWFycmF5VGltZXMKCSAqCgkgKglFbGVtZW50LWJ5LWVsZW1lbnQgbXVsdGlwbGljYXRpb24KCSAqCUNpaiA9IEFpaiAqIEJpagoJICoJQHBhcmFtIG1peGVkICRCIE1hdHJpeC9BcnJheQoJICoJQHJldHVybiBNYXRyaXggTWF0cml4IENpagoJICovCglwdWJsaWMgZnVuY3Rpb24gYXJyYXlUaW1lcygpIHsKCQlpZiAoZnVuY19udW1fYXJncygpID4gMCkgewoJCQkkYXJncyA9IGZ1bmNfZ2V0X2FyZ3MoKTsKCQkJJG1hdGNoID0gaW1wbG9kZSgiLCIsIGFycmF5X21hcCgnZ2V0dHlwZScsICRhcmdzKSk7CgoJCQlzd2l0Y2goJG1hdGNoKSB7CgkJCQljYXNlICdvYmplY3QnOgoJCQkJCQlpZiAoJGFyZ3NbMF0gaW5zdGFuY2VvZiBQSFBFeGNlbF9TaGFyZWRfSkFNQV9NYXRyaXgpIHsgJE0gPSAkYXJnc1swXTsgfSBlbHNlIHsgdGhyb3cgbmV3IEV4Y2VwdGlvbihzZWxmOjpBcmd1bWVudFR5cGVFeGNlcHRpb24pOyB9CgkJCQkJCWJyZWFrOwoJCQkJY2FzZSAnYXJyYXknOgoJCQkJCQkkTSA9IG5ldyBQSFBFeGNlbF9TaGFyZWRfSkFNQV9NYXRyaXgoJGFyZ3NbMF0pOwoJCQkJCQlicmVhazsKCQkJCWRlZmF1bHQ6CgkJCQkJCXRocm93IG5ldyBFeGNlcHRpb24oc2VsZjo6UG9seW1vcnBoaWNBcmd1bWVudEV4Y2VwdGlvbik7CgkJCQkJCWJyZWFrOwoJCQl9CgkJCSR0aGlzLT5jaGVja01hdHJpeERpbWVuc2lvbnMoJE0pOwoJCQlmb3IoJGkgPSAwOyAkaSA8ICR0aGlzLT5tOyArKyRpKSB7CgkJCQlmb3IoJGogPSAwOyAkaiA8ICR0aGlzLT5uOyArKyRqKSB7CgkJCQkJJE0tPnNldCgkaSwgJGosICRNLT5nZXQoJGksICRqKSAqICR0aGlzLT5BWyRpXVskal0pOwoJCQkJfQoJCQl9CgkJCXJldHVybiAkTTsKCQl9IGVsc2UgewoJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKHNlbGY6OlBvbHltb3JwaGljQXJndW1lbnRFeGNlcHRpb24pOwoJCX0KCX0JLy8JZnVuY3Rpb24gYXJyYXlUaW1lcygpCgoKCS8qKgoJICoJYXJyYXlUaW1lc0VxdWFscwoJICoKCSAqCUVsZW1lbnQtYnktZWxlbWVudCBtdWx0aXBsaWNhdGlvbgoJICoJQWlqID0gQWlqICogQmlqCgkgKglAcGFyYW0gbWl4ZWQgJEIgTWF0cml4L0FycmF5CgkgKglAcmV0dXJuIE1hdHJpeCBNYXRyaXggQWlqCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBhcnJheVRpbWVzRXF1YWxzKCkgewoJCWlmIChmdW5jX251bV9hcmdzKCkgPiAwKSB7CgkJCSRhcmdzID0gZnVuY19nZXRfYXJncygpOwoJCQkkbWF0Y2ggPSBpbXBsb2RlKCIsIiwgYXJyYXlfbWFwKCdnZXR0eXBlJywgJGFyZ3MpKTsKCgkJCXN3aXRjaCgkbWF0Y2gpIHsKCQkJCWNhc2UgJ29iamVjdCc6CgkJCQkJCWlmICgkYXJnc1swXSBpbnN0YW5jZW9mIFBIUEV4Y2VsX1NoYXJlZF9KQU1BX01hdHJpeCkgeyAkTSA9ICRhcmdzWzBdOyB9IGVsc2UgeyB0aHJvdyBuZXcgRXhjZXB0aW9uKHNlbGY6OkFyZ3VtZW50VHlwZUV4Y2VwdGlvbik7IH0KCQkJCQkJYnJlYWs7CgkJCQljYXNlICdhcnJheSc6CgkJCQkJCSRNID0gbmV3IFBIUEV4Y2VsX1NoYXJlZF9KQU1BX01hdHJpeCgkYXJnc1swXSk7CgkJCQkJCWJyZWFrOwoJCQkJZGVmYXVsdDoKCQkJCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbihzZWxmOjpQb2x5bW9ycGhpY0FyZ3VtZW50RXhjZXB0aW9uKTsKCQkJCQkJYnJlYWs7CgkJCX0KCQkJJHRoaXMtPmNoZWNrTWF0cml4RGltZW5zaW9ucygkTSk7CgkJCWZvcigkaSA9IDA7ICRpIDwgJHRoaXMtPm07ICsrJGkpIHsKCQkJCWZvcigkaiA9IDA7ICRqIDwgJHRoaXMtPm47ICsrJGopIHsKCQkJCQkkdmFsaWRWYWx1ZXMgPSBUcnVlOwoJCQkJCSR2YWx1ZSA9ICRNLT5nZXQoJGksICRqKTsKCQkJCQlpZiAoKGlzX3N0cmluZygkdGhpcy0+QVskaV1bJGpdKSkgJiYgKHN0cmxlbigkdGhpcy0+QVskaV1bJGpdKSA+IDApICYmICghaXNfbnVtZXJpYygkdGhpcy0+QVskaV1bJGpdKSkpIHsKCQkJCQkJJHRoaXMtPkFbJGldWyRqXSA9IHRyaW0oJHRoaXMtPkFbJGldWyRqXSwnIicpOwoJCQkJCQkkdmFsaWRWYWx1ZXMgJj0gUEhQRXhjZWxfU2hhcmVkX1N0cmluZzo6Y29udmVydFRvTnVtYmVySWZGcmFjdGlvbigkdGhpcy0+QVskaV1bJGpdKTsKCQkJCQl9CgkJCQkJaWYgKChpc19zdHJpbmcoJHZhbHVlKSkgJiYgKHN0cmxlbigkdmFsdWUpID4gMCkgJiYgKCFpc19udW1lcmljKCR2YWx1ZSkpKSB7CgkJCQkJCSR2YWx1ZSA9IHRyaW0oJHZhbHVlLCciJyk7CgkJCQkJCSR2YWxpZFZhbHVlcyAmPSBQSFBFeGNlbF9TaGFyZWRfU3RyaW5nOjpjb252ZXJ0VG9OdW1iZXJJZkZyYWN0aW9uKCR2YWx1ZSk7CgkJCQkJfQoJCQkJCWlmICgkdmFsaWRWYWx1ZXMpIHsKCQkJCQkJJHRoaXMtPkFbJGldWyRqXSAqPSAkdmFsdWU7CgkJCQkJfSBlbHNlIHsKCQkJCQkJJHRoaXMtPkFbJGldWyRqXSA9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6TmFOKCk7CgkJCQkJfQoJCQkJfQoJCQl9CgkJCXJldHVybiAkdGhpczsKCQl9IGVsc2UgewoJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKHNlbGY6OlBvbHltb3JwaGljQXJndW1lbnRFeGNlcHRpb24pOwoJCX0KCX0JLy8JZnVuY3Rpb24gYXJyYXlUaW1lc0VxdWFscygpCgoKCS8qKgoJICoJYXJyYXlSaWdodERpdmlkZQoJICoKCSAqCUVsZW1lbnQtYnktZWxlbWVudCByaWdodCBkaXZpc2lvbgoJICoJQSAvIEIKCSAqCUBwYXJhbSBNYXRyaXggJEIgTWF0cml4IEIKCSAqCUByZXR1cm4gTWF0cml4IERpdmlzaW9uIHJlc3VsdAoJICovCglwdWJsaWMgZnVuY3Rpb24gYXJyYXlSaWdodERpdmlkZSgpIHsKCQlpZiAoZnVuY19udW1fYXJncygpID4gMCkgewoJCQkkYXJncyA9IGZ1bmNfZ2V0X2FyZ3MoKTsKCQkJJG1hdGNoID0gaW1wbG9kZSgiLCIsIGFycmF5X21hcCgnZ2V0dHlwZScsICRhcmdzKSk7CgoJCQlzd2l0Y2goJG1hdGNoKSB7CgkJCQljYXNlICdvYmplY3QnOgoJCQkJCQlpZiAoJGFyZ3NbMF0gaW5zdGFuY2VvZiBQSFBFeGNlbF9TaGFyZWRfSkFNQV9NYXRyaXgpIHsgJE0gPSAkYXJnc1swXTsgfSBlbHNlIHsgdGhyb3cgbmV3IEV4Y2VwdGlvbihzZWxmOjpBcmd1bWVudFR5cGVFeGNlcHRpb24pOyB9CgkJCQkJCWJyZWFrOwoJCQkJY2FzZSAnYXJyYXknOgoJCQkJCQkkTSA9IG5ldyBQSFBFeGNlbF9TaGFyZWRfSkFNQV9NYXRyaXgoJGFyZ3NbMF0pOwoJCQkJCQlicmVhazsKCQkJCWRlZmF1bHQ6CgkJCQkJCXRocm93IG5ldyBFeGNlcHRpb24oc2VsZjo6UG9seW1vcnBoaWNBcmd1bWVudEV4Y2VwdGlvbik7CgkJCQkJCWJyZWFrOwoJCQl9CgkJCSR0aGlzLT5jaGVja01hdHJpeERpbWVuc2lvbnMoJE0pOwoJCQlmb3IoJGkgPSAwOyAkaSA8ICR0aGlzLT5tOyArKyRpKSB7CgkJCQlmb3IoJGogPSAwOyAkaiA8ICR0aGlzLT5uOyArKyRqKSB7CgkJCQkJJHZhbGlkVmFsdWVzID0gVHJ1ZTsKCQkJCQkkdmFsdWUgPSAkTS0+Z2V0KCRpLCAkaik7CgkJCQkJaWYgKChpc19zdHJpbmcoJHRoaXMtPkFbJGldWyRqXSkpICYmIChzdHJsZW4oJHRoaXMtPkFbJGldWyRqXSkgPiAwKSAmJiAoIWlzX251bWVyaWMoJHRoaXMtPkFbJGldWyRqXSkpKSB7CgkJCQkJCSR0aGlzLT5BWyRpXVskal0gPSB0cmltKCR0aGlzLT5BWyRpXVskal0sJyInKTsKCQkJCQkJJHZhbGlkVmFsdWVzICY9IFBIUEV4Y2VsX1NoYXJlZF9TdHJpbmc6OmNvbnZlcnRUb051bWJlcklmRnJhY3Rpb24oJHRoaXMtPkFbJGldWyRqXSk7CgkJCQkJfQoJCQkJCWlmICgoaXNfc3RyaW5nKCR2YWx1ZSkpICYmIChzdHJsZW4oJHZhbHVlKSA+IDApICYmICghaXNfbnVtZXJpYygkdmFsdWUpKSkgewoJCQkJCQkkdmFsdWUgPSB0cmltKCR2YWx1ZSwnIicpOwoJCQkJCQkkdmFsaWRWYWx1ZXMgJj0gUEhQRXhjZWxfU2hhcmVkX1N0cmluZzo6Y29udmVydFRvTnVtYmVySWZGcmFjdGlvbigkdmFsdWUpOwoJCQkJCX0KCQkJCQlpZiAoJHZhbGlkVmFsdWVzKSB7CgkJCQkJCWlmICgkdmFsdWUgPT0gMCkgewoJCQkJCQkJLy8JVHJhcCBmb3IgRGl2aWRlIGJ5IFplcm8gZXJyb3IKCQkJCQkJCSRNLT5zZXQoJGksICRqLCAnI0RJVi8wIScpOwoJCQkJCQl9IGVsc2UgewoJCQkJCQkJJE0tPnNldCgkaSwgJGosICR0aGlzLT5BWyRpXVskal0gLyAkdmFsdWUpOwoJCQkJCQl9CgkJCQkJfSBlbHNlIHsKCQkJCQkJJE0tPnNldCgkaSwgJGosIFBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6TmFOKCkpOwoJCQkJCX0KCQkJCX0KCQkJfQoJCQlyZXR1cm4gJE07CgkJfSBlbHNlIHsKCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbihzZWxmOjpQb2x5bW9ycGhpY0FyZ3VtZW50RXhjZXB0aW9uKTsKCQl9Cgl9CS8vCWZ1bmN0aW9uIGFycmF5UmlnaHREaXZpZGUoKQoKCgkvKioKCSAqCWFycmF5UmlnaHREaXZpZGVFcXVhbHMKCSAqCgkgKglFbGVtZW50LWJ5LWVsZW1lbnQgcmlnaHQgZGl2aXNpb24KCSAqCUFpaiA9IEFpaiAvIEJpagoJICoJQHBhcmFtIG1peGVkICRCIE1hdHJpeC9BcnJheQoJICoJQHJldHVybiBNYXRyaXggTWF0cml4IEFpagoJICovCglwdWJsaWMgZnVuY3Rpb24gYXJyYXlSaWdodERpdmlkZUVxdWFscygpIHsKCQlpZiAoZnVuY19udW1fYXJncygpID4gMCkgewoJCQkkYXJncyA9IGZ1bmNfZ2V0X2FyZ3MoKTsKCQkJJG1hdGNoID0gaW1wbG9kZSgiLCIsIGFycmF5X21hcCgnZ2V0dHlwZScsICRhcmdzKSk7CgoJCQlzd2l0Y2goJG1hdGNoKSB7CgkJCQljYXNlICdvYmplY3QnOgoJCQkJCQlpZiAoJGFyZ3NbMF0gaW5zdGFuY2VvZiBQSFBFeGNlbF9TaGFyZWRfSkFNQV9NYXRyaXgpIHsgJE0gPSAkYXJnc1swXTsgfSBlbHNlIHsgdGhyb3cgbmV3IEV4Y2VwdGlvbihzZWxmOjpBcmd1bWVudFR5cGVFeGNlcHRpb24pOyB9CgkJCQkJCWJyZWFrOwoJCQkJY2FzZSAnYXJyYXknOgoJCQkJCQkkTSA9IG5ldyBQSFBFeGNlbF9TaGFyZWRfSkFNQV9NYXRyaXgoJGFyZ3NbMF0pOwoJCQkJCQlicmVhazsKCQkJCWRlZmF1bHQ6CgkJCQkJCXRocm93IG5ldyBFeGNlcHRpb24oc2VsZjo6UG9seW1vcnBoaWNBcmd1bWVudEV4Y2VwdGlvbik7CgkJCQkJCWJyZWFrOwoJCQl9CgkJCSR0aGlzLT5jaGVja01hdHJpeERpbWVuc2lvbnMoJE0pOwoJCQlmb3IoJGkgPSAwOyAkaSA8ICR0aGlzLT5tOyArKyRpKSB7CgkJCQlmb3IoJGogPSAwOyAkaiA8ICR0aGlzLT5uOyArKyRqKSB7CgkJCQkJJHRoaXMtPkFbJGldWyRqXSA9ICR0aGlzLT5BWyRpXVskal0gLyAkTS0+Z2V0KCRpLCAkaik7CgkJCQl9CgkJCX0KCQkJcmV0dXJuICRNOwoJCX0gZWxzZSB7CgkJCXRocm93IG5ldyBFeGNlcHRpb24oc2VsZjo6UG9seW1vcnBoaWNBcmd1bWVudEV4Y2VwdGlvbik7CgkJfQoJfQkvLwlmdW5jdGlvbiBhcnJheVJpZ2h0RGl2aWRlRXF1YWxzKCkKCgoJLyoqCgkgKglhcnJheUxlZnREaXZpZGUKCSAqCgkgKglFbGVtZW50LWJ5LWVsZW1lbnQgTGVmdCBkaXZpc2lvbgoJICoJQSAvIEIKCSAqCUBwYXJhbSBNYXRyaXggJEIgTWF0cml4IEIKCSAqCUByZXR1cm4gTWF0cml4IERpdmlzaW9uIHJlc3VsdAoJICovCglwdWJsaWMgZnVuY3Rpb24gYXJyYXlMZWZ0RGl2aWRlKCkgewoJCWlmIChmdW5jX251bV9hcmdzKCkgPiAwKSB7CgkJCSRhcmdzID0gZnVuY19nZXRfYXJncygpOwoJCQkkbWF0Y2ggPSBpbXBsb2RlKCIsIiwgYXJyYXlfbWFwKCdnZXR0eXBlJywgJGFyZ3MpKTsKCgkJCXN3aXRjaCgkbWF0Y2gpIHsKCQkJCWNhc2UgJ29iamVjdCc6CgkJCQkJCWlmICgkYXJnc1swXSBpbnN0YW5jZW9mIFBIUEV4Y2VsX1NoYXJlZF9KQU1BX01hdHJpeCkgeyAkTSA9ICRhcmdzWzBdOyB9IGVsc2UgeyB0aHJvdyBuZXcgRXhjZXB0aW9uKHNlbGY6OkFyZ3VtZW50VHlwZUV4Y2VwdGlvbik7IH0KCQkJCQkJYnJlYWs7CgkJCQljYXNlICdhcnJheSc6CgkJCQkJCSRNID0gbmV3IFBIUEV4Y2VsX1NoYXJlZF9KQU1BX01hdHJpeCgkYXJnc1swXSk7CgkJCQkJCWJyZWFrOwoJCQkJZGVmYXVsdDoKCQkJCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbihzZWxmOjpQb2x5bW9ycGhpY0FyZ3VtZW50RXhjZXB0aW9uKTsKCQkJCQkJYnJlYWs7CgkJCX0KCQkJJHRoaXMtPmNoZWNrTWF0cml4RGltZW5zaW9ucygkTSk7CgkJCWZvcigkaSA9IDA7ICRpIDwgJHRoaXMtPm07ICsrJGkpIHsKCQkJCWZvcigkaiA9IDA7ICRqIDwgJHRoaXMtPm47ICsrJGopIHsKCQkJCQkkTS0+c2V0KCRpLCAkaiwgJE0tPmdldCgkaSwgJGopIC8gJHRoaXMtPkFbJGldWyRqXSk7CgkJCQl9CgkJCX0KCQkJcmV0dXJuICRNOwoJCX0gZWxzZSB7CgkJCXRocm93IG5ldyBFeGNlcHRpb24oc2VsZjo6UG9seW1vcnBoaWNBcmd1bWVudEV4Y2VwdGlvbik7CgkJfQoJfQkvLwlmdW5jdGlvbiBhcnJheUxlZnREaXZpZGUoKQoKCgkvKioKCSAqCWFycmF5TGVmdERpdmlkZUVxdWFscwoJICoKCSAqCUVsZW1lbnQtYnktZWxlbWVudCBMZWZ0IGRpdmlzaW9uCgkgKglBaWogPSBBaWogLyBCaWoKCSAqCUBwYXJhbSBtaXhlZCAkQiBNYXRyaXgvQXJyYXkKCSAqCUByZXR1cm4gTWF0cml4IE1hdHJpeCBBaWoKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGFycmF5TGVmdERpdmlkZUVxdWFscygpIHsKCQlpZiAoZnVuY19udW1fYXJncygpID4gMCkgewoJCQkkYXJncyA9IGZ1bmNfZ2V0X2FyZ3MoKTsKCQkJJG1hdGNoID0gaW1wbG9kZSgiLCIsIGFycmF5X21hcCgnZ2V0dHlwZScsICRhcmdzKSk7CgoJCQlzd2l0Y2goJG1hdGNoKSB7CgkJCQljYXNlICdvYmplY3QnOgoJCQkJCQlpZiAoJGFyZ3NbMF0gaW5zdGFuY2VvZiBQSFBFeGNlbF9TaGFyZWRfSkFNQV9NYXRyaXgpIHsgJE0gPSAkYXJnc1swXTsgfSBlbHNlIHsgdGhyb3cgbmV3IEV4Y2VwdGlvbihzZWxmOjpBcmd1bWVudFR5cGVFeGNlcHRpb24pOyB9CgkJCQkJCWJyZWFrOwoJCQkJY2FzZSAnYXJyYXknOgoJCQkJCQkkTSA9IG5ldyBQSFBFeGNlbF9TaGFyZWRfSkFNQV9NYXRyaXgoJGFyZ3NbMF0pOwoJCQkJCQlicmVhazsKCQkJCWRlZmF1bHQ6CgkJCQkJCXRocm93IG5ldyBFeGNlcHRpb24oc2VsZjo6UG9seW1vcnBoaWNBcmd1bWVudEV4Y2VwdGlvbik7CgkJCQkJCWJyZWFrOwoJCQl9CgkJCSR0aGlzLT5jaGVja01hdHJpeERpbWVuc2lvbnMoJE0pOwoJCQlmb3IoJGkgPSAwOyAkaSA8ICR0aGlzLT5tOyArKyRpKSB7CgkJCQlmb3IoJGogPSAwOyAkaiA8ICR0aGlzLT5uOyArKyRqKSB7CgkJCQkJJHRoaXMtPkFbJGldWyRqXSA9ICRNLT5nZXQoJGksICRqKSAvICR0aGlzLT5BWyRpXVskal07CgkJCQl9CgkJCX0KCQkJcmV0dXJuICRNOwoJCX0gZWxzZSB7CgkJCXRocm93IG5ldyBFeGNlcHRpb24oc2VsZjo6UG9seW1vcnBoaWNBcmd1bWVudEV4Y2VwdGlvbik7CgkJfQoJfQkvLwlmdW5jdGlvbiBhcnJheUxlZnREaXZpZGVFcXVhbHMoKQoKCgkvKioKCSAqCXRpbWVzCgkgKgoJICoJTWF0cml4IG11bHRpcGxpY2F0aW9uCgkgKglAcGFyYW0gbWl4ZWQgJG4gTWF0cml4L0FycmF5L1NjYWxhcgoJICoJQHJldHVybiBNYXRyaXggUHJvZHVjdAoJICovCglwdWJsaWMgZnVuY3Rpb24gdGltZXMoKSB7CgkJaWYgKGZ1bmNfbnVtX2FyZ3MoKSA+IDApIHsKCQkJJGFyZ3MgID0gZnVuY19nZXRfYXJncygpOwoJCQkkbWF0Y2ggPSBpbXBsb2RlKCIsIiwgYXJyYXlfbWFwKCdnZXR0eXBlJywgJGFyZ3MpKTsKCgkJCXN3aXRjaCgkbWF0Y2gpIHsKCQkJCWNhc2UgJ29iamVjdCc6CgkJCQkJCWlmICgkYXJnc1swXSBpbnN0YW5jZW9mIFBIUEV4Y2VsX1NoYXJlZF9KQU1BX01hdHJpeCkgeyAkQiA9ICRhcmdzWzBdOyB9IGVsc2UgeyB0aHJvdyBuZXcgRXhjZXB0aW9uKHNlbGY6OkFyZ3VtZW50VHlwZUV4Y2VwdGlvbik7IH0KCQkJCQkJaWYgKCR0aGlzLT5uID09ICRCLT5tKSB7CgkJCQkJCQkkQyA9IG5ldyBQSFBFeGNlbF9TaGFyZWRfSkFNQV9NYXRyaXgoJHRoaXMtPm0sICRCLT5uKTsKCQkJCQkJCWZvcigkaiA9IDA7ICRqIDwgJEItPm47ICsrJGopIHsKCQkJCQkJCQlmb3IgKCRrID0gMDsgJGsgPCAkdGhpcy0+bjsgKyskaykgewoJCQkJCQkJCQkkQmNvbGpbJGtdID0gJEItPkFbJGtdWyRqXTsKCQkJCQkJCQl9CgkJCQkJCQkJZm9yKCRpID0gMDsgJGkgPCAkdGhpcy0+bTsgKyskaSkgewoJCQkJCQkJCQkkQXJvd2kgPSAkdGhpcy0+QVskaV07CgkJCQkJCQkJCSRzID0gMDsKCQkJCQkJCQkJZm9yKCRrID0gMDsgJGsgPCAkdGhpcy0+bjsgKyskaykgewoJCQkJCQkJCQkJJHMgKz0gJEFyb3dpWyRrXSAqICRCY29salska107CgkJCQkJCQkJCX0KCQkJCQkJCQkJJEMtPkFbJGldWyRqXSA9ICRzOwoJCQkJCQkJCX0KCQkJCQkJCX0KCQkJCQkJCXJldHVybiAkQzsKCQkJCQkJfSBlbHNlIHsKCQkJCQkJCXRocm93IG5ldyBFeGNlcHRpb24oSkFNQUVycm9yKE1hdHJpeERpbWVuc2lvbk1pc21hdGNoKSk7CgkJCQkJCX0KCQkJCQkJYnJlYWs7CgkJCQljYXNlICdhcnJheSc6CgkJCQkJCSRCID0gbmV3IFBIUEV4Y2VsX1NoYXJlZF9KQU1BX01hdHJpeCgkYXJnc1swXSk7CgkJCQkJCWlmICgkdGhpcy0+biA9PSAkQi0+bSkgewoJCQkJCQkJJEMgPSBuZXcgUEhQRXhjZWxfU2hhcmVkX0pBTUFfTWF0cml4KCR0aGlzLT5tLCAkQi0+bik7CgkJCQkJCQlmb3IoJGkgPSAwOyAkaSA8ICRDLT5tOyArKyRpKSB7CgkJCQkJCQkJZm9yKCRqID0gMDsgJGogPCAkQy0+bjsgKyskaikgewoJCQkJCQkJCQkkcyA9ICIwIjsKCQkJCQkJCQkJZm9yKCRrID0gMDsgJGsgPCAkQy0+bjsgKyskaykgewoJCQkJCQkJCQkJJHMgKz0gJHRoaXMtPkFbJGldWyRrXSAqICRCLT5BWyRrXVskal07CgkJCQkJCQkJCX0KCQkJCQkJCQkJJEMtPkFbJGldWyRqXSA9ICRzOwoJCQkJCQkJCX0KCQkJCQkJCX0KCQkJCQkJCXJldHVybiAkQzsKCQkJCQkJfSBlbHNlIHsKCQkJCQkJCXRocm93IG5ldyBFeGNlcHRpb24oSkFNQUVycm9yKE1hdHJpeERpbWVuc2lvbk1pc21hdGNoKSk7CgkJCQkJCX0KCQkJCQkJcmV0dXJuICRNOwoJCQkJCQlicmVhazsKCQkJCWNhc2UgJ2ludGVnZXInOgoJCQkJCQkkQyA9IG5ldyBQSFBFeGNlbF9TaGFyZWRfSkFNQV9NYXRyaXgoJHRoaXMtPkEpOwoJCQkJCQlmb3IoJGkgPSAwOyAkaSA8ICRDLT5tOyArKyRpKSB7CgkJCQkJCQlmb3IoJGogPSAwOyAkaiA8ICRDLT5uOyArKyRqKSB7CgkJCQkJCQkJJEMtPkFbJGldWyRqXSAqPSAkYXJnc1swXTsKCQkJCQkJCX0KCQkJCQkJfQoJCQkJCQlyZXR1cm4gJEM7CgkJCQkJCWJyZWFrOwoJCQkJY2FzZSAnZG91YmxlJzoKCQkJCQkJJEMgPSBuZXcgUEhQRXhjZWxfU2hhcmVkX0pBTUFfTWF0cml4KCR0aGlzLT5tLCAkdGhpcy0+bik7CgkJCQkJCWZvcigkaSA9IDA7ICRpIDwgJEMtPm07ICsrJGkpIHsKCQkJCQkJCWZvcigkaiA9IDA7ICRqIDwgJEMtPm47ICsrJGopIHsKCQkJCQkJCQkkQy0+QVskaV1bJGpdID0gJGFyZ3NbMF0gKiAkdGhpcy0+QVskaV1bJGpdOwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJCXJldHVybiAkQzsKCQkJCQkJYnJlYWs7CgkJCQljYXNlICdmbG9hdCc6CgkJCQkJCSRDID0gbmV3IFBIUEV4Y2VsX1NoYXJlZF9KQU1BX01hdHJpeCgkdGhpcy0+QSk7CgkJCQkJCWZvcigkaSA9IDA7ICRpIDwgJEMtPm07ICsrJGkpIHsKCQkJCQkJCWZvcigkaiA9IDA7ICRqIDwgJEMtPm47ICsrJGopIHsKCQkJCQkJCQkkQy0+QVskaV1bJGpdICo9ICRhcmdzWzBdOwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJCXJldHVybiAkQzsKCQkJCQkJYnJlYWs7CgkJCQlkZWZhdWx0OgoJCQkJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKHNlbGY6OlBvbHltb3JwaGljQXJndW1lbnRFeGNlcHRpb24pOwoJCQkJCQlicmVhazsKCQkJfQoJCX0gZWxzZSB7CgkJCXRocm93IG5ldyBFeGNlcHRpb24oc2VsZjo6UG9seW1vcnBoaWNBcmd1bWVudEV4Y2VwdGlvbik7CgkJfQoJfQkvLwlmdW5jdGlvbiB0aW1lcygpCgoKCS8qKgoJICoJcG93ZXIKCSAqCgkgKglBID0gQSBeIEIKCSAqCUBwYXJhbSBtaXhlZCAkQiBNYXRyaXgvQXJyYXkKCSAqCUByZXR1cm4gTWF0cml4IFN1bQoJICovCglwdWJsaWMgZnVuY3Rpb24gcG93ZXIoKSB7CgkJaWYgKGZ1bmNfbnVtX2FyZ3MoKSA+IDApIHsKCQkJJGFyZ3MgPSBmdW5jX2dldF9hcmdzKCk7CgkJCSRtYXRjaCA9IGltcGxvZGUoIiwiLCBhcnJheV9tYXAoJ2dldHR5cGUnLCAkYXJncykpOwoKCQkJc3dpdGNoKCRtYXRjaCkgewoJCQkJY2FzZSAnb2JqZWN0JzoKCQkJCQkJaWYgKCRhcmdzWzBdIGluc3RhbmNlb2YgUEhQRXhjZWxfU2hhcmVkX0pBTUFfTWF0cml4KSB7ICRNID0gJGFyZ3NbMF07IH0gZWxzZSB7IHRocm93IG5ldyBFeGNlcHRpb24oc2VsZjo6QXJndW1lbnRUeXBlRXhjZXB0aW9uKTsgfQoJCQkJCQlicmVhazsKCQkJCWNhc2UgJ2FycmF5JzoKCQkJCQkJJE0gPSBuZXcgUEhQRXhjZWxfU2hhcmVkX0pBTUFfTWF0cml4KCRhcmdzWzBdKTsKCQkJCQkJYnJlYWs7CgkJCQlkZWZhdWx0OgoJCQkJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKHNlbGY6OlBvbHltb3JwaGljQXJndW1lbnRFeGNlcHRpb24pOwoJCQkJCQlicmVhazsKCQkJfQoJCQkkdGhpcy0+Y2hlY2tNYXRyaXhEaW1lbnNpb25zKCRNKTsKCQkJZm9yKCRpID0gMDsgJGkgPCAkdGhpcy0+bTsgKyskaSkgewoJCQkJZm9yKCRqID0gMDsgJGogPCAkdGhpcy0+bjsgKyskaikgewoJCQkJCSR2YWxpZFZhbHVlcyA9IFRydWU7CgkJCQkJJHZhbHVlID0gJE0tPmdldCgkaSwgJGopOwoJCQkJCWlmICgoaXNfc3RyaW5nKCR0aGlzLT5BWyRpXVskal0pKSAmJiAoc3RybGVuKCR0aGlzLT5BWyRpXVskal0pID4gMCkgJiYgKCFpc19udW1lcmljKCR0aGlzLT5BWyRpXVskal0pKSkgewoJCQkJCQkkdGhpcy0+QVskaV1bJGpdID0gdHJpbSgkdGhpcy0+QVskaV1bJGpdLCciJyk7CgkJCQkJCSR2YWxpZFZhbHVlcyAmPSBQSFBFeGNlbF9TaGFyZWRfU3RyaW5nOjpjb252ZXJ0VG9OdW1iZXJJZkZyYWN0aW9uKCR0aGlzLT5BWyRpXVskal0pOwoJCQkJCX0KCQkJCQlpZiAoKGlzX3N0cmluZygkdmFsdWUpKSAmJiAoc3RybGVuKCR2YWx1ZSkgPiAwKSAmJiAoIWlzX251bWVyaWMoJHZhbHVlKSkpIHsKCQkJCQkJJHZhbHVlID0gdHJpbSgkdmFsdWUsJyInKTsKCQkJCQkJJHZhbGlkVmFsdWVzICY9IFBIUEV4Y2VsX1NoYXJlZF9TdHJpbmc6OmNvbnZlcnRUb051bWJlcklmRnJhY3Rpb24oJHZhbHVlKTsKCQkJCQl9CgkJCQkJaWYgKCR2YWxpZFZhbHVlcykgewoJCQkJCQkkdGhpcy0+QVskaV1bJGpdID0gcG93KCR0aGlzLT5BWyRpXVskal0sJHZhbHVlKTsKCQkJCQl9IGVsc2UgewoJCQkJCQkkdGhpcy0+QVskaV1bJGpdID0gUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpOYU4oKTsKCQkJCQl9CgkJCQl9CgkJCX0KCQkJcmV0dXJuICR0aGlzOwoJCX0gZWxzZSB7CgkJCXRocm93IG5ldyBFeGNlcHRpb24oc2VsZjo6UG9seW1vcnBoaWNBcmd1bWVudEV4Y2VwdGlvbik7CgkJfQoJfQkvLwlmdW5jdGlvbiBwb3dlcigpCgoKCS8qKgoJICoJY29uY2F0CgkgKgoJICoJQSA9IEEgJiBCCgkgKglAcGFyYW0gbWl4ZWQgJEIgTWF0cml4L0FycmF5CgkgKglAcmV0dXJuIE1hdHJpeCBTdW0KCSAqLwoJcHVibGljIGZ1bmN0aW9uIGNvbmNhdCgpIHsKCQlpZiAoZnVuY19udW1fYXJncygpID4gMCkgewoJCQkkYXJncyA9IGZ1bmNfZ2V0X2FyZ3MoKTsKCQkJJG1hdGNoID0gaW1wbG9kZSgiLCIsIGFycmF5X21hcCgnZ2V0dHlwZScsICRhcmdzKSk7CgoJCQlzd2l0Y2goJG1hdGNoKSB7CgkJCQljYXNlICdvYmplY3QnOgoJCQkJCQlpZiAoJGFyZ3NbMF0gaW5zdGFuY2VvZiBQSFBFeGNlbF9TaGFyZWRfSkFNQV9NYXRyaXgpIHsgJE0gPSAkYXJnc1swXTsgfSBlbHNlIHsgdGhyb3cgbmV3IEV4Y2VwdGlvbihzZWxmOjpBcmd1bWVudFR5cGVFeGNlcHRpb24pOyB9CgkJCQljYXNlICdhcnJheSc6CgkJCQkJCSRNID0gbmV3IFBIUEV4Y2VsX1NoYXJlZF9KQU1BX01hdHJpeCgkYXJnc1swXSk7CgkJCQkJCWJyZWFrOwoJCQkJZGVmYXVsdDoKCQkJCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbihzZWxmOjpQb2x5bW9ycGhpY0FyZ3VtZW50RXhjZXB0aW9uKTsKCQkJCQkJYnJlYWs7CgkJCX0KCQkJJHRoaXMtPmNoZWNrTWF0cml4RGltZW5zaW9ucygkTSk7CgkJCWZvcigkaSA9IDA7ICRpIDwgJHRoaXMtPm07ICsrJGkpIHsKCQkJCWZvcigkaiA9IDA7ICRqIDwgJHRoaXMtPm47ICsrJGopIHsKCQkJCQkkdGhpcy0+QVskaV1bJGpdID0gdHJpbSgkdGhpcy0+QVskaV1bJGpdLCciJykudHJpbSgkTS0+Z2V0KCRpLCAkaiksJyInKTsKCQkJCX0KCQkJfQoJCQlyZXR1cm4gJHRoaXM7CgkJfSBlbHNlIHsKCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbihzZWxmOjpQb2x5bW9ycGhpY0FyZ3VtZW50RXhjZXB0aW9uKTsKCQl9Cgl9CS8vCWZ1bmN0aW9uIGNvbmNhdCgpCgoKCS8qKgoJICoJU29sdmUgQSpYID0gQi4KCSAqCgkgKglAcGFyYW0gTWF0cml4ICRCIFJpZ2h0IGhhbmQgc2lkZQoJICoJQHJldHVybiBNYXRyaXggLi4uIFNvbHV0aW9uIGlmIEEgaXMgc3F1YXJlLCBsZWFzdCBzcXVhcmVzIHNvbHV0aW9uIG90aGVyd2lzZQoJICovCglwdWJsaWMgZnVuY3Rpb24gc29sdmUoJEIpIHsKCQlpZiAoJHRoaXMtPm0gPT0gJHRoaXMtPm4pIHsKCQkJJExVID0gbmV3IFBIUEV4Y2VsX1NoYXJlZF9KQU1BX0xVRGVjb21wb3NpdGlvbigkdGhpcyk7CgkJCXJldHVybiAkTFUtPnNvbHZlKCRCKTsKCQl9IGVsc2UgewoJCQkkUVIgPSBuZXcgUVJEZWNvbXBvc2l0aW9uKCR0aGlzKTsKCQkJcmV0dXJuICRRUi0+c29sdmUoJEIpOwoJCX0KCX0JLy8JZnVuY3Rpb24gc29sdmUoKQoKCgkvKioKCSAqCU1hdHJpeCBpbnZlcnNlIG9yIHBzZXVkb2ludmVyc2UuCgkgKgoJICoJQHJldHVybiBNYXRyaXggLi4uIEludmVyc2UoQSkgaWYgQSBpcyBzcXVhcmUsIHBzZXVkb2ludmVyc2Ugb3RoZXJ3aXNlLgoJICovCglwdWJsaWMgZnVuY3Rpb24gaW52ZXJzZSgpIHsKCQlyZXR1cm4gJHRoaXMtPnNvbHZlKCR0aGlzLT5pZGVudGl0eSgkdGhpcy0+bSwgJHRoaXMtPm0pKTsKCX0JLy8JZnVuY3Rpb24gaW52ZXJzZSgpCgoKCS8qKgoJICoJZGV0CgkgKgoJICoJQ2FsY3VsYXRlIGRldGVybWluYW50CgkgKglAcmV0dXJuIGZsb2F0IERldGVybWluYW50CgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBkZXQoKSB7CgkJJEwgPSBuZXcgUEhQRXhjZWxfU2hhcmVkX0pBTUFfTFVEZWNvbXBvc2l0aW9uKCR0aGlzKTsKCQlyZXR1cm4gJEwtPmRldCgpOwoJfQkvLwlmdW5jdGlvbiBkZXQoKQoKCn0JLy8JY2xhc3MgUEhQRXhjZWxfU2hhcmVkX0pBTUFfTWF0cml4Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Shared/JAMA/QRDecomposition.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqCUBwYWNrYWdlIEpBTUEKICoKICoJRm9yIGFuIG0tYnktbiBtYXRyaXggQSB3aXRoIG0gPj0gbiwgdGhlIFFSIGRlY29tcG9zaXRpb24gaXMgYW4gbS1ieS1uCiAqCW9ydGhvZ29uYWwgbWF0cml4IFEgYW5kIGFuIG4tYnktbiB1cHBlciB0cmlhbmd1bGFyIG1hdHJpeCBSIHNvIHRoYXQKICoJQSA9IFEqUi4KICoKICoJVGhlIFFSIGRlY29tcG9zdGlvbiBhbHdheXMgZXhpc3RzLCBldmVuIGlmIHRoZSBtYXRyaXggZG9lcyBub3QgaGF2ZQogKglmdWxsIHJhbmssIHNvIHRoZSBjb25zdHJ1Y3RvciB3aWxsIG5ldmVyIGZhaWwuICBUaGUgcHJpbWFyeSB1c2Ugb2YgdGhlCiAqCVFSIGRlY29tcG9zaXRpb24gaXMgaW4gdGhlIGxlYXN0IHNxdWFyZXMgc29sdXRpb24gb2Ygbm9uc3F1YXJlIHN5c3RlbXMKICoJb2Ygc2ltdWx0YW5lb3VzIGxpbmVhciBlcXVhdGlvbnMuICBUaGlzIHdpbGwgZmFpbCBpZiBpc0Z1bGxSYW5rKCkKICoJcmV0dXJucyBmYWxzZS4KICoKICoJQGF1dGhvciAgUGF1bCBNZWFnaGVyCiAqCUBsaWNlbnNlIFBIUCB2My4wCiAqCUB2ZXJzaW9uIDEuMQogKi8KY2xhc3MgUEhQRXhjZWxfU2hhcmVkX0pBTUFfUVJEZWNvbXBvc2l0aW9uIHsKCgljb25zdCBNYXRyaXhSYW5rRXhjZXB0aW9uCT0gIkNhbiBvbmx5IHBlcmZvcm0gb3BlcmF0aW9uIG9uIGZ1bGwtcmFuayBtYXRyaXguIjsKCgkvKioKCSAqCUFycmF5IGZvciBpbnRlcm5hbCBzdG9yYWdlIG9mIGRlY29tcG9zaXRpb24uCgkgKglAdmFyIGFycmF5CgkgKi8KCXByaXZhdGUgJFFSID0gYXJyYXkoKTsKCgkvKioKCSAqCVJvdyBkaW1lbnNpb24uCgkgKglAdmFyIGludGVnZXIKCSAqLwoJcHJpdmF0ZSAkbTsKCgkvKioKCSoJQ29sdW1uIGRpbWVuc2lvbi4KCSoJQHZhciBpbnRlZ2VyCgkqLwoJcHJpdmF0ZSAkbjsKCgkvKioKCSAqCUFycmF5IGZvciBpbnRlcm5hbCBzdG9yYWdlIG9mIGRpYWdvbmFsIG9mIFIuCgkgKglAdmFyICBhcnJheQoJICovCglwcml2YXRlICRSZGlhZyA9IGFycmF5KCk7CgoKCS8qKgoJICoJUVIgRGVjb21wb3NpdGlvbiBjb21wdXRlZCBieSBIb3VzZWhvbGRlciByZWZsZWN0aW9ucy4KCSAqCgkgKglAcGFyYW0gbWF0cml4ICRBIFJlY3Rhbmd1bGFyIG1hdHJpeAoJICoJQHJldHVybiBTdHJ1Y3R1cmUgdG8gYWNjZXNzIFIgYW5kIHRoZSBIb3VzZWhvbGRlciB2ZWN0b3JzIGFuZCBjb21wdXRlIFEuCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkQSkgewoJCWlmKCRBIGluc3RhbmNlb2YgUEhQRXhjZWxfU2hhcmVkX0pBTUFfTWF0cml4KSB7CgkJCS8vIEluaXRpYWxpemUuCgkJCSR0aGlzLT5RUiA9ICRBLT5nZXRBcnJheUNvcHkoKTsKCQkJJHRoaXMtPm0gID0gJEEtPmdldFJvd0RpbWVuc2lvbigpOwoJCQkkdGhpcy0+biAgPSAkQS0+Z2V0Q29sdW1uRGltZW5zaW9uKCk7CgkJCS8vIE1haW4gbG9vcC4KCQkJZm9yICgkayA9IDA7ICRrIDwgJHRoaXMtPm47ICsrJGspIHsKCQkJCS8vIENvbXB1dGUgMi1ub3JtIG9mIGstdGggY29sdW1uIHdpdGhvdXQgdW5kZXIvb3ZlcmZsb3cuCgkJCQkkbnJtID0gMC4wOwoJCQkJZm9yICgkaSA9ICRrOyAkaSA8ICR0aGlzLT5tOyArKyRpKSB7CgkJCQkJJG5ybSA9IGh5cG8oJG5ybSwgJHRoaXMtPlFSWyRpXVska10pOwoJCQkJfQoJCQkJaWYgKCRucm0gIT0gMC4wKSB7CgkJCQkJLy8gRm9ybSBrLXRoIEhvdXNlaG9sZGVyIHZlY3Rvci4KCQkJCQlpZiAoJHRoaXMtPlFSWyRrXVska10gPCAwKSB7CgkJCQkJCSRucm0gPSAtJG5ybTsKCQkJCQl9CgkJCQkJZm9yICgkaSA9ICRrOyAkaSA8ICR0aGlzLT5tOyArKyRpKSB7CgkJCQkJCSR0aGlzLT5RUlskaV1bJGtdIC89ICRucm07CgkJCQkJfQoJCQkJCSR0aGlzLT5RUlska11bJGtdICs9IDEuMDsKCQkJCQkvLyBBcHBseSB0cmFuc2Zvcm1hdGlvbiB0byByZW1haW5pbmcgY29sdW1ucy4KCQkJCQlmb3IgKCRqID0gJGsrMTsgJGogPCAkdGhpcy0+bjsgKyskaikgewoJCQkJCQkkcyA9IDAuMDsKCQkJCQkJZm9yICgkaSA9ICRrOyAkaSA8ICR0aGlzLT5tOyArKyRpKSB7CgkJCQkJCQkkcyArPSAkdGhpcy0+UVJbJGldWyRrXSAqICR0aGlzLT5RUlskaV1bJGpdOwoJCQkJCQl9CgkJCQkJCSRzID0gLSRzLyR0aGlzLT5RUlska11bJGtdOwoJCQkJCQlmb3IgKCRpID0gJGs7ICRpIDwgJHRoaXMtPm07ICsrJGkpIHsKCQkJCQkJCSR0aGlzLT5RUlskaV1bJGpdICs9ICRzICogJHRoaXMtPlFSWyRpXVska107CgkJCQkJCX0KCQkJCQl9CgkJCQl9CgkJCQkkdGhpcy0+UmRpYWdbJGtdID0gLSRucm07CgkJCX0KCQl9IGVsc2UgewoJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKFBIUEV4Y2VsX1NoYXJlZF9KQU1BX01hdHJpeDo6QXJndW1lbnRUeXBlRXhjZXB0aW9uKTsKCQl9Cgl9CS8vCWZ1bmN0aW9uIF9fY29uc3RydWN0KCkKCgoJLyoqCgkgKglJcyB0aGUgbWF0cml4IGZ1bGwgcmFuaz8KCSAqCgkgKglAcmV0dXJuIGJvb2xlYW4gdHJ1ZSBpZiBSLCBhbmQgaGVuY2UgQSwgaGFzIGZ1bGwgcmFuaywgZWxzZSBmYWxzZS4KCSAqLwoJcHVibGljIGZ1bmN0aW9uIGlzRnVsbFJhbmsoKSB7CgkJZm9yICgkaiA9IDA7ICRqIDwgJHRoaXMtPm47ICsrJGopIHsKCQkJaWYgKCR0aGlzLT5SZGlhZ1skal0gPT0gMCkgewoJCQkJcmV0dXJuIGZhbHNlOwoJCQl9CgkJfQoJCXJldHVybiB0cnVlOwoJfQkvLwlmdW5jdGlvbiBpc0Z1bGxSYW5rKCkKCgoJLyoqCgkgKglSZXR1cm4gdGhlIEhvdXNlaG9sZGVyIHZlY3RvcnMKCSAqCgkgKglAcmV0dXJuIE1hdHJpeCBMb3dlciB0cmFwZXpvaWRhbCBtYXRyaXggd2hvc2UgY29sdW1ucyBkZWZpbmUgdGhlIHJlZmxlY3Rpb25zCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRIKCkgewoJCWZvciAoJGkgPSAwOyAkaSA8ICR0aGlzLT5tOyArKyRpKSB7CgkJCWZvciAoJGogPSAwOyAkaiA8ICR0aGlzLT5uOyArKyRqKSB7CgkJCQlpZiAoJGkgPj0gJGopIHsKCQkJCQkkSFskaV1bJGpdID0gJHRoaXMtPlFSWyRpXVskal07CgkJCQl9IGVsc2UgewoJCQkJCSRIWyRpXVskal0gPSAwLjA7CgkJCQl9CgkJCX0KCQl9CgkJcmV0dXJuIG5ldyBQSFBFeGNlbF9TaGFyZWRfSkFNQV9NYXRyaXgoJEgpOwoJfQkvLwlmdW5jdGlvbiBnZXRIKCkKCgoJLyoqCgkgKglSZXR1cm4gdGhlIHVwcGVyIHRyaWFuZ3VsYXIgZmFjdG9yCgkgKgoJICoJQHJldHVybiBNYXRyaXggdXBwZXIgdHJpYW5ndWxhciBmYWN0b3IKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldFIoKSB7CgkJZm9yICgkaSA9IDA7ICRpIDwgJHRoaXMtPm47ICsrJGkpIHsKCQkJZm9yICgkaiA9IDA7ICRqIDwgJHRoaXMtPm47ICsrJGopIHsKCQkJCWlmICgkaSA8ICRqKSB7CgkJCQkJJFJbJGldWyRqXSA9ICR0aGlzLT5RUlskaV1bJGpdOwoJCQkJfSBlbHNlaWYgKCRpID09ICRqKSB7CgkJCQkJJFJbJGldWyRqXSA9ICR0aGlzLT5SZGlhZ1skaV07CgkJCQl9IGVsc2UgewoJCQkJCSRSWyRpXVskal0gPSAwLjA7CgkJCQl9CgkJCX0KCQl9CgkJcmV0dXJuIG5ldyBQSFBFeGNlbF9TaGFyZWRfSkFNQV9NYXRyaXgoJFIpOwoJfQkvLwlmdW5jdGlvbiBnZXRSKCkKCgoJLyoqCgkgKglHZW5lcmF0ZSBhbmQgcmV0dXJuIHRoZSAoZWNvbm9teS1zaXplZCkgb3J0aG9nb25hbCBmYWN0b3IKCSAqCgkgKglAcmV0dXJuIE1hdHJpeCBvcnRob2dvbmFsIGZhY3RvcgoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0USgpIHsKCQlmb3IgKCRrID0gJHRoaXMtPm4tMTsgJGsgPj0gMDsgLS0kaykgewoJCQlmb3IgKCRpID0gMDsgJGkgPCAkdGhpcy0+bTsgKyskaSkgewoJCQkJJFFbJGldWyRrXSA9IDAuMDsKCQkJfQoJCQkkUVska11bJGtdID0gMS4wOwoJCQlmb3IgKCRqID0gJGs7ICRqIDwgJHRoaXMtPm47ICsrJGopIHsKCQkJCWlmICgkdGhpcy0+UVJbJGtdWyRrXSAhPSAwKSB7CgkJCQkJJHMgPSAwLjA7CgkJCQkJZm9yICgkaSA9ICRrOyAkaSA8ICR0aGlzLT5tOyArKyRpKSB7CgkJCQkJCSRzICs9ICR0aGlzLT5RUlskaV1bJGtdICogJFFbJGldWyRqXTsKCQkJCQl9CgkJCQkJJHMgPSAtJHMvJHRoaXMtPlFSWyRrXVska107CgkJCQkJZm9yICgkaSA9ICRrOyAkaSA8ICR0aGlzLT5tOyArKyRpKSB7CgkJCQkJCSRRWyRpXVskal0gKz0gJHMgKiAkdGhpcy0+UVJbJGldWyRrXTsKCQkJCQl9CgkJCQl9CgkJCX0KCQl9CgkJLyoKCQlmb3IoJGkgPSAwOyAkaSA8IGNvdW50KCRRKTsgKyskaSkgewoJCQlmb3IoJGogPSAwOyAkaiA8IGNvdW50KCRRKTsgKyskaikgewoJCQkJaWYoISBpc3NldCgkUVskaV1bJGpdKSApIHsKCQkJCQkkUVskaV1bJGpdID0gMDsKCQkJCX0KCQkJfQoJCX0KCQkqLwoJCXJldHVybiBuZXcgUEhQRXhjZWxfU2hhcmVkX0pBTUFfTWF0cml4KCRRKTsKCX0JLy8JZnVuY3Rpb24gZ2V0USgpCgoKCS8qKgoJICoJTGVhc3Qgc3F1YXJlcyBzb2x1dGlvbiBvZiBBKlggPSBCCgkgKgoJICoJQHBhcmFtIE1hdHJpeCAkQiBBIE1hdHJpeCB3aXRoIGFzIG1hbnkgcm93cyBhcyBBIGFuZCBhbnkgbnVtYmVyIG9mIGNvbHVtbnMuCgkgKglAcmV0dXJuIE1hdHJpeCBNYXRyaXggdGhhdCBtaW5pbWl6ZXMgdGhlIHR3byBub3JtIG9mIFEqUipYLUIuCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBzb2x2ZSgkQikgewoJCWlmICgkQi0+Z2V0Um93RGltZW5zaW9uKCkgPT0gJHRoaXMtPm0pIHsKCQkJaWYgKCR0aGlzLT5pc0Z1bGxSYW5rKCkpIHsKCQkJCS8vIENvcHkgcmlnaHQgaGFuZCBzaWRlCgkJCQkkbnggPSAkQi0+Z2V0Q29sdW1uRGltZW5zaW9uKCk7CgkJCQkkWCAgPSAkQi0+Z2V0QXJyYXlDb3B5KCk7CgkJCQkvLyBDb21wdXRlIFkgPSB0cmFuc3Bvc2UoUSkqQgoJCQkJZm9yICgkayA9IDA7ICRrIDwgJHRoaXMtPm47ICsrJGspIHsKCQkJCQlmb3IgKCRqID0gMDsgJGogPCAkbng7ICsrJGopIHsKCQkJCQkJJHMgPSAwLjA7CgkJCQkJCWZvciAoJGkgPSAkazsgJGkgPCAkdGhpcy0+bTsgKyskaSkgewoJCQkJCQkJJHMgKz0gJHRoaXMtPlFSWyRpXVska10gKiAkWFskaV1bJGpdOwoJCQkJCQl9CgkJCQkJCSRzID0gLSRzLyR0aGlzLT5RUlska11bJGtdOwoJCQkJCQlmb3IgKCRpID0gJGs7ICRpIDwgJHRoaXMtPm07ICsrJGkpIHsKCQkJCQkJCSRYWyRpXVskal0gKz0gJHMgKiAkdGhpcy0+UVJbJGldWyRrXTsKCQkJCQkJfQoJCQkJCX0KCQkJCX0KCQkJCS8vIFNvbHZlIFIqWCA9IFk7CgkJCQlmb3IgKCRrID0gJHRoaXMtPm4tMTsgJGsgPj0gMDsgLS0kaykgewoJCQkJCWZvciAoJGogPSAwOyAkaiA8ICRueDsgKyskaikgewoJCQkJCQkkWFska11bJGpdIC89ICR0aGlzLT5SZGlhZ1ska107CgkJCQkJfQoJCQkJCWZvciAoJGkgPSAwOyAkaSA8ICRrOyArKyRpKSB7CgkJCQkJCWZvciAoJGogPSAwOyAkaiA8ICRueDsgKyskaikgewoJCQkJCQkJJFhbJGldWyRqXSAtPSAkWFska11bJGpdKiAkdGhpcy0+UVJbJGldWyRrXTsKCQkJCQkJfQoJCQkJCX0KCQkJCX0KCQkJCSRYID0gbmV3IFBIUEV4Y2VsX1NoYXJlZF9KQU1BX01hdHJpeCgkWCk7CgkJCQlyZXR1cm4gKCRYLT5nZXRNYXRyaXgoMCwgJHRoaXMtPm4tMSwgMCwgJG54KSk7CgkJCX0gZWxzZSB7CgkJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKHNlbGY6Ok1hdHJpeFJhbmtFeGNlcHRpb24pOwoJCQl9CgkJfSBlbHNlIHsKCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbihQSFBFeGNlbF9TaGFyZWRfSkFNQV9NYXRyaXg6Ok1hdHJpeERpbWVuc2lvbkV4Y2VwdGlvbik7CgkJfQoJfQkvLwlmdW5jdGlvbiBzb2x2ZSgpCgp9CS8vCVBIUEV4Y2VsX1NoYXJlZF9KQU1BX2NsYXNzIFFSRGVjb21wb3NpdGlvbgo=]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Shared/JAMA/SingularValueDecomposition.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqCUBwYWNrYWdlIEpBTUEKICoKICoJRm9yIGFuIG0tYnktbiBtYXRyaXggQSB3aXRoIG0gPj0gbiwgdGhlIHNpbmd1bGFyIHZhbHVlIGRlY29tcG9zaXRpb24gaXMKICoJYW4gbS1ieS1uIG9ydGhvZ29uYWwgbWF0cml4IFUsIGFuIG4tYnktbiBkaWFnb25hbCBtYXRyaXggUywgYW5kCiAqCWFuIG4tYnktbiBvcnRob2dvbmFsIG1hdHJpeCBWIHNvIHRoYXQgQSA9IFUqUypWJy4KICoKICoJVGhlIHNpbmd1bGFyIHZhbHVlcywgc2lnbWFbJGtdID0gU1ska11bJGtdLCBhcmUgb3JkZXJlZCBzbyB0aGF0CiAqCXNpZ21hWzBdID49IHNpZ21hWzFdID49IC4uLiA+PSBzaWdtYVtuLTFdLgogKgogKglUaGUgc2luZ3VsYXIgdmFsdWUgZGVjb21wb3N0aW9uIGFsd2F5cyBleGlzdHMsIHNvIHRoZSBjb25zdHJ1Y3RvciB3aWxsCiAqCW5ldmVyIGZhaWwuICBUaGUgbWF0cml4IGNvbmRpdGlvbiBudW1iZXIgYW5kIHRoZSBlZmZlY3RpdmUgbnVtZXJpY2FsCiAqCXJhbmsgY2FuIGJlIGNvbXB1dGVkIGZyb20gdGhpcyBkZWNvbXBvc2l0aW9uLgogKgogKglAYXV0aG9yICBQYXVsIE1lYWdoZXIKICoJQGxpY2Vuc2UgUEhQIHYzLjAKICoJQHZlcnNpb24gMS4xCiAqLwpjbGFzcyBTaW5ndWxhclZhbHVlRGVjb21wb3NpdGlvbiAgewoKCS8qKgoJICoJSW50ZXJuYWwgc3RvcmFnZSBvZiBVLgoJICoJQHZhciBhcnJheQoJICovCglwcml2YXRlICRVID0gYXJyYXkoKTsKCgkvKioKCSAqCUludGVybmFsIHN0b3JhZ2Ugb2YgVi4KCSAqCUB2YXIgYXJyYXkKCSAqLwoJcHJpdmF0ZSAkViA9IGFycmF5KCk7CgoJLyoqCgkgKglJbnRlcm5hbCBzdG9yYWdlIG9mIHNpbmd1bGFyIHZhbHVlcy4KCSAqCUB2YXIgYXJyYXkKCSAqLwoJcHJpdmF0ZSAkcyA9IGFycmF5KCk7CgoJLyoqCgkgKglSb3cgZGltZW5zaW9uLgoJICoJQHZhciBpbnQKCSAqLwoJcHJpdmF0ZSAkbTsKCgkvKioKCSAqCUNvbHVtbiBkaW1lbnNpb24uCgkgKglAdmFyIGludAoJICovCglwcml2YXRlICRuOwoKCgkvKioKCSAqCUNvbnN0cnVjdCB0aGUgc2luZ3VsYXIgdmFsdWUgZGVjb21wb3NpdGlvbgoJICoKCSAqCURlcml2ZWQgZnJvbSBMSU5QQUNLIGNvZGUuCgkgKgoJICoJQHBhcmFtICRBIFJlY3Rhbmd1bGFyIG1hdHJpeAoJICoJQHJldHVybiBTdHJ1Y3R1cmUgdG8gYWNjZXNzIFUsIFMgYW5kIFYuCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkQXJnKSB7CgoJCS8vIEluaXRpYWxpemUuCgkJJEEgPSAkQXJnLT5nZXRBcnJheUNvcHkoKTsKCQkkdGhpcy0+bSA9ICRBcmctPmdldFJvd0RpbWVuc2lvbigpOwoJCSR0aGlzLT5uID0gJEFyZy0+Z2V0Q29sdW1uRGltZW5zaW9uKCk7CgkJJG51ICAgICAgPSBtaW4oJHRoaXMtPm0sICR0aGlzLT5uKTsKCQkkZSAgICAgICA9IGFycmF5KCk7CgkJJHdvcmsgICAgPSBhcnJheSgpOwoJCSR3YW50dSAgID0gdHJ1ZTsKCQkkd2FudHYgICA9IHRydWU7CgkJJG5jdCA9IG1pbigkdGhpcy0+bSAtIDEsICR0aGlzLT5uKTsKCQkkbnJ0ID0gbWF4KDAsIG1pbigkdGhpcy0+biAtIDIsICR0aGlzLT5tKSk7CgoJCS8vIFJlZHVjZSBBIHRvIGJpZGlhZ29uYWwgZm9ybSwgc3RvcmluZyB0aGUgZGlhZ29uYWwgZWxlbWVudHMKCQkvLyBpbiBzIGFuZCB0aGUgc3VwZXItZGlhZ29uYWwgZWxlbWVudHMgaW4gZS4KCQlmb3IgKCRrID0gMDsgJGsgPCBtYXgoJG5jdCwkbnJ0KTsgKyskaykgewoKCQkJaWYgKCRrIDwgJG5jdCkgewoJCQkJLy8gQ29tcHV0ZSB0aGUgdHJhbnNmb3JtYXRpb24gZm9yIHRoZSBrLXRoIGNvbHVtbiBhbmQKCQkJCS8vIHBsYWNlIHRoZSBrLXRoIGRpYWdvbmFsIGluIHNbJGtdLgoJCQkJLy8gQ29tcHV0ZSAyLW5vcm0gb2Ygay10aCBjb2x1bW4gd2l0aG91dCB1bmRlci9vdmVyZmxvdy4KCQkJCSR0aGlzLT5zWyRrXSA9IDA7CgkJCQlmb3IgKCRpID0gJGs7ICRpIDwgJHRoaXMtPm07ICsrJGkpIHsKCQkJCQkkdGhpcy0+c1ska10gPSBoeXBvKCR0aGlzLT5zWyRrXSwgJEFbJGldWyRrXSk7CgkJCQl9CgkJCQlpZiAoJHRoaXMtPnNbJGtdICE9IDAuMCkgewoJCQkJCWlmICgkQVska11bJGtdIDwgMC4wKSB7CgkJCQkJCSR0aGlzLT5zWyRrXSA9IC0kdGhpcy0+c1ska107CgkJCQkJfQoJCQkJCWZvciAoJGkgPSAkazsgJGkgPCAkdGhpcy0+bTsgKyskaSkgewoJCQkJCQkkQVskaV1bJGtdIC89ICR0aGlzLT5zWyRrXTsKCQkJCQl9CgkJCQkJJEFbJGtdWyRrXSArPSAxLjA7CgkJCQl9CgkJCQkkdGhpcy0+c1ska10gPSAtJHRoaXMtPnNbJGtdOwoJCQl9CgoJCQlmb3IgKCRqID0gJGsgKyAxOyAkaiA8ICR0aGlzLT5uOyArKyRqKSB7CgkJCQlpZiAoKCRrIDwgJG5jdCkgJiAoJHRoaXMtPnNbJGtdICE9IDAuMCkpIHsKCQkJCQkvLyBBcHBseSB0aGUgdHJhbnNmb3JtYXRpb24uCgkJCQkJJHQgPSAwOwoJCQkJCWZvciAoJGkgPSAkazsgJGkgPCAkdGhpcy0+bTsgKyskaSkgewoJCQkJCQkkdCArPSAkQVskaV1bJGtdICogJEFbJGldWyRqXTsKCQkJCQl9CgkJCQkJJHQgPSAtJHQgLyAkQVska11bJGtdOwoJCQkJCWZvciAoJGkgPSAkazsgJGkgPCAkdGhpcy0+bTsgKyskaSkgewoJCQkJCQkkQVskaV1bJGpdICs9ICR0ICogJEFbJGldWyRrXTsKCQkJCQl9CgkJCQkJLy8gUGxhY2UgdGhlIGstdGggcm93IG9mIEEgaW50byBlIGZvciB0aGUKCQkJCQkvLyBzdWJzZXF1ZW50IGNhbGN1bGF0aW9uIG9mIHRoZSByb3cgdHJhbnNmb3JtYXRpb24uCgkJCQkJJGVbJGpdID0gJEFbJGtdWyRqXTsKCQkJCX0KCQkJfQoKCQkJaWYgKCR3YW50dSBBTkQgKCRrIDwgJG5jdCkpIHsKCQkJCS8vIFBsYWNlIHRoZSB0cmFuc2Zvcm1hdGlvbiBpbiBVIGZvciBzdWJzZXF1ZW50IGJhY2sKCQkJCS8vIG11bHRpcGxpY2F0aW9uLgoJCQkJZm9yICgkaSA9ICRrOyAkaSA8ICR0aGlzLT5tOyArKyRpKSB7CgkJCQkJJHRoaXMtPlVbJGldWyRrXSA9ICRBWyRpXVska107CgkJCQl9CgkJCX0KCgkJCWlmICgkayA8ICRucnQpIHsKCQkJCS8vIENvbXB1dGUgdGhlIGstdGggcm93IHRyYW5zZm9ybWF0aW9uIGFuZCBwbGFjZSB0aGUKCQkJCS8vIGstdGggc3VwZXItZGlhZ29uYWwgaW4gZVska10uCgkJCQkvLyBDb21wdXRlIDItbm9ybSB3aXRob3V0IHVuZGVyL292ZXJmbG93LgoJCQkJJGVbJGtdID0gMDsKCQkJCWZvciAoJGkgPSAkayArIDE7ICRpIDwgJHRoaXMtPm47ICsrJGkpIHsKCQkJCQkkZVska10gPSBoeXBvKCRlWyRrXSwgJGVbJGldKTsKCQkJCX0KCQkJCWlmICgkZVska10gIT0gMC4wKSB7CgkJCQkJaWYgKCRlWyRrKzFdIDwgMC4wKSB7CgkJCQkJCSRlWyRrXSA9IC0kZVska107CgkJCQkJfQoJCQkJCWZvciAoJGkgPSAkayArIDE7ICRpIDwgJHRoaXMtPm47ICsrJGkpIHsKCQkJCQkJJGVbJGldIC89ICRlWyRrXTsKCQkJCQl9CgkJCQkJJGVbJGsrMV0gKz0gMS4wOwoJCQkJfQoJCQkJJGVbJGtdID0gLSRlWyRrXTsKCQkJCWlmICgoJGsrMSA8ICR0aGlzLT5tKSBBTkQgKCRlWyRrXSAhPSAwLjApKSB7CgkJCQkJLy8gQXBwbHkgdGhlIHRyYW5zZm9ybWF0aW9uLgoJCQkJCWZvciAoJGkgPSAkaysxOyAkaSA8ICR0aGlzLT5tOyArKyRpKSB7CgkJCQkJCSR3b3JrWyRpXSA9IDAuMDsKCQkJCQl9CgkJCQkJZm9yICgkaiA9ICRrKzE7ICRqIDwgJHRoaXMtPm47ICsrJGopIHsKCQkJCQkJZm9yICgkaSA9ICRrKzE7ICRpIDwgJHRoaXMtPm07ICsrJGkpIHsKCQkJCQkJCSR3b3JrWyRpXSArPSAkZVskal0gKiAkQVskaV1bJGpdOwoJCQkJCQl9CgkJCQkJfQoJCQkJCWZvciAoJGogPSAkayArIDE7ICRqIDwgJHRoaXMtPm47ICsrJGopIHsKCQkJCQkJJHQgPSAtJGVbJGpdIC8gJGVbJGsrMV07CgkJCQkJCWZvciAoJGkgPSAkayArIDE7ICRpIDwgJHRoaXMtPm07ICsrJGkpIHsKCQkJCQkJCSRBWyRpXVskal0gKz0gJHQgKiAkd29ya1skaV07CgkJCQkJCX0KCQkJCQl9CgkJCQl9CgkJCQlpZiAoJHdhbnR2KSB7CgkJCQkJLy8gUGxhY2UgdGhlIHRyYW5zZm9ybWF0aW9uIGluIFYgZm9yIHN1YnNlcXVlbnQKCQkJCQkvLyBiYWNrIG11bHRpcGxpY2F0aW9uLgoJCQkJCWZvciAoJGkgPSAkayArIDE7ICRpIDwgJHRoaXMtPm47ICsrJGkpIHsKCQkJCQkJJHRoaXMtPlZbJGldWyRrXSA9ICRlWyRpXTsKCQkJCQl9CgkJCQl9CgkJCX0KCQl9CgoJCS8vIFNldCB1cCB0aGUgZmluYWwgYmlkaWFnb25hbCBtYXRyaXggb3Igb3JkZXIgcC4KCQkkcCA9IG1pbigkdGhpcy0+biwgJHRoaXMtPm0gKyAxKTsKCQlpZiAoJG5jdCA8ICR0aGlzLT5uKSB7CgkJCSR0aGlzLT5zWyRuY3RdID0gJEFbJG5jdF1bJG5jdF07CgkJfQoJCWlmICgkdGhpcy0+bSA8ICRwKSB7CgkJCSR0aGlzLT5zWyRwLTFdID0gMC4wOwoJCX0KCQlpZiAoJG5ydCArIDEgPCAkcCkgewoJCQkkZVskbnJ0XSA9ICRBWyRucnRdWyRwLTFdOwoJCX0KCQkkZVskcC0xXSA9IDAuMDsKCQkvLyBJZiByZXF1aXJlZCwgZ2VuZXJhdGUgVS4KCQlpZiAoJHdhbnR1KSB7CgkJCWZvciAoJGogPSAkbmN0OyAkaiA8ICRudTsgKyskaikgewoJCQkJZm9yICgkaSA9IDA7ICRpIDwgJHRoaXMtPm07ICsrJGkpIHsKCQkJCQkkdGhpcy0+VVskaV1bJGpdID0gMC4wOwoJCQkJfQoJCQkJJHRoaXMtPlVbJGpdWyRqXSA9IDEuMDsKCQkJfQoJCQlmb3IgKCRrID0gJG5jdCAtIDE7ICRrID49IDA7IC0tJGspIHsKCQkJCWlmICgkdGhpcy0+c1ska10gIT0gMC4wKSB7CgkJCQkJZm9yICgkaiA9ICRrICsgMTsgJGogPCAkbnU7ICsrJGopIHsKCQkJCQkJJHQgPSAwOwoJCQkJCQlmb3IgKCRpID0gJGs7ICRpIDwgJHRoaXMtPm07ICsrJGkpIHsKCQkJCQkJCSR0ICs9ICR0aGlzLT5VWyRpXVska10gKiAkdGhpcy0+VVskaV1bJGpdOwoJCQkJCQl9CgkJCQkJCSR0ID0gLSR0IC8gJHRoaXMtPlVbJGtdWyRrXTsKCQkJCQkJZm9yICgkaSA9ICRrOyAkaSA8ICR0aGlzLT5tOyArKyRpKSB7CgkJCQkJCQkkdGhpcy0+VVskaV1bJGpdICs9ICR0ICogJHRoaXMtPlVbJGldWyRrXTsKCQkJCQkJfQoJCQkJCX0KCQkJCQlmb3IgKCRpID0gJGs7ICRpIDwgJHRoaXMtPm07ICsrJGkgKSB7CgkJCQkJCSR0aGlzLT5VWyRpXVska10gPSAtJHRoaXMtPlVbJGldWyRrXTsKCQkJCQl9CgkJCQkJJHRoaXMtPlVbJGtdWyRrXSA9IDEuMCArICR0aGlzLT5VWyRrXVska107CgkJCQkJZm9yICgkaSA9IDA7ICRpIDwgJGsgLSAxOyArKyRpKSB7CgkJCQkJCSR0aGlzLT5VWyRpXVska10gPSAwLjA7CgkJCQkJfQoJCQkJfSBlbHNlIHsKCQkJCQlmb3IgKCRpID0gMDsgJGkgPCAkdGhpcy0+bTsgKyskaSkgewoJCQkJCQkkdGhpcy0+VVskaV1bJGtdID0gMC4wOwoJCQkJCX0KCQkJCQkkdGhpcy0+VVska11bJGtdID0gMS4wOwoJCQkJfQoJCQl9CgkJfQoKCQkvLyBJZiByZXF1aXJlZCwgZ2VuZXJhdGUgVi4KCQlpZiAoJHdhbnR2KSB7CgkJCWZvciAoJGsgPSAkdGhpcy0+biAtIDE7ICRrID49IDA7IC0tJGspIHsKCQkJCWlmICgoJGsgPCAkbnJ0KSBBTkQgKCRlWyRrXSAhPSAwLjApKSB7CgkJCQkJZm9yICgkaiA9ICRrICsgMTsgJGogPCAkbnU7ICsrJGopIHsKCQkJCQkJJHQgPSAwOwoJCQkJCQlmb3IgKCRpID0gJGsgKyAxOyAkaSA8ICR0aGlzLT5uOyArKyRpKSB7CgkJCQkJCQkkdCArPSAkdGhpcy0+VlskaV1bJGtdKiAkdGhpcy0+VlskaV1bJGpdOwoJCQkJCQl9CgkJCQkJCSR0ID0gLSR0IC8gJHRoaXMtPlZbJGsrMV1bJGtdOwoJCQkJCQlmb3IgKCRpID0gJGsgKyAxOyAkaSA8ICR0aGlzLT5uOyArKyRpKSB7CgkJCQkJCQkkdGhpcy0+VlskaV1bJGpdICs9ICR0ICogJHRoaXMtPlZbJGldWyRrXTsKCQkJCQkJfQoJCQkJCX0KCQkJCX0KCQkJCWZvciAoJGkgPSAwOyAkaSA8ICR0aGlzLT5uOyArKyRpKSB7CgkJCQkJJHRoaXMtPlZbJGldWyRrXSA9IDAuMDsKCQkJCX0KCQkJCSR0aGlzLT5WWyRrXVska10gPSAxLjA7CgkJCX0KCQl9CgoJCS8vIE1haW4gaXRlcmF0aW9uIGxvb3AgZm9yIHRoZSBzaW5ndWxhciB2YWx1ZXMuCgkJJHBwICAgPSAkcCAtIDE7CgkJJGl0ZXIgPSAwOwoJCSRlcHMgID0gcG93KDIuMCwgLTUyLjApOwoKCQl3aGlsZSAoJHAgPiAwKSB7CgkJCS8vIEhlcmUgaXMgd2hlcmUgYSB0ZXN0IGZvciB0b28gbWFueSBpdGVyYXRpb25zIHdvdWxkIGdvLgoJCQkvLyBUaGlzIHNlY3Rpb24gb2YgdGhlIHByb2dyYW0gaW5zcGVjdHMgZm9yIG5lZ2xpZ2libGUKCQkJLy8gZWxlbWVudHMgaW4gdGhlIHMgYW5kIGUgYXJyYXlzLiAgT24gY29tcGxldGlvbiB0aGUKCQkJLy8gdmFyaWFibGVzIGthc2UgYW5kIGsgYXJlIHNldCBhcyBmb2xsb3dzOgoJCQkvLyBrYXNlID0gMSAgaWYgcyhwKSBhbmQgZVtrLTFdIGFyZSBuZWdsaWdpYmxlIGFuZCBrPHAKCQkJLy8ga2FzZSA9IDIgIGlmIHMoaykgaXMgbmVnbGlnaWJsZSBhbmQgazxwCgkJCS8vIGthc2UgPSAzICBpZiBlW2stMV0gaXMgbmVnbGlnaWJsZSwgazxwLCBhbmQKCQkJLy8gICAgICAgICAgIHMoayksIC4uLiwgcyhwKSBhcmUgbm90IG5lZ2xpZ2libGUgKHFyIHN0ZXApLgoJCQkvLyBrYXNlID0gNCAgaWYgZShwLTEpIGlzIG5lZ2xpZ2libGUgKGNvbnZlcmdlbmNlKS4KCQkJZm9yICgkayA9ICRwIC0gMjsgJGsgPj0gLTE7IC0tJGspIHsKCQkJCWlmICgkayA9PSAtMSkgewoJCQkJCWJyZWFrOwoJCQkJfQoJCQkJaWYgKGFicygkZVska10pIDw9ICRlcHMgKiAoYWJzKCR0aGlzLT5zWyRrXSkgKyBhYnMoJHRoaXMtPnNbJGsrMV0pKSkgewoJCQkJCSRlWyRrXSA9IDAuMDsKCQkJCQlicmVhazsKCQkJCX0KCQkJfQoJCQlpZiAoJGsgPT0gJHAgLSAyKSB7CgkJCQkka2FzZSA9IDQ7CgkJCX0gZWxzZSB7CgkJCQlmb3IgKCRrcyA9ICRwIC0gMTsgJGtzID49ICRrOyAtLSRrcykgewoJCQkJCWlmICgka3MgPT0gJGspIHsKCQkJCQkJYnJlYWs7CgkJCQkJfQoJCQkJCSR0ID0gKCRrcyAhPSAkcCA/IGFicygkZVska3NdKSA6IDAuKSArICgka3MgIT0gJGsgKyAxID8gYWJzKCRlWyRrcy0xXSkgOiAwLik7CgkJCQkJaWYgKGFicygkdGhpcy0+c1ska3NdKSA8PSAkZXBzICogJHQpICB7CgkJCQkJCSR0aGlzLT5zWyRrc10gPSAwLjA7CgkJCQkJCWJyZWFrOwoJCQkJCX0KCQkJCX0KCQkJCWlmICgka3MgPT0gJGspIHsKCQkJCQkka2FzZSA9IDM7CgkJCQl9IGVsc2UgaWYgKCRrcyA9PSAkcC0xKSB7CgkJCQkJJGthc2UgPSAxOwoJCQkJfSBlbHNlIHsKCQkJCQkka2FzZSA9IDI7CgkJCQkJJGsgPSAka3M7CgkJCQl9CgkJCX0KCQkJKyskazsKCgkJCS8vIFBlcmZvcm0gdGhlIHRhc2sgaW5kaWNhdGVkIGJ5IGthc2UuCgkJCXN3aXRjaCAoJGthc2UpIHsKCQkJCS8vIERlZmxhdGUgbmVnbGlnaWJsZSBzKHApLgoJCQkJY2FzZSAxOgoJCQkJCQkkZiA9ICRlWyRwLTJdOwoJCQkJCQkkZVskcC0yXSA9IDAuMDsKCQkJCQkJZm9yICgkaiA9ICRwIC0gMjsgJGogPj0gJGs7IC0tJGopIHsKCQkJCQkJCSR0ICA9IGh5cG8oJHRoaXMtPnNbJGpdLCRmKTsKCQkJCQkJCSRjcyA9ICR0aGlzLT5zWyRqXSAvICR0OwoJCQkJCQkJJHNuID0gJGYgLyAkdDsKCQkJCQkJCSR0aGlzLT5zWyRqXSA9ICR0OwoJCQkJCQkJaWYgKCRqICE9ICRrKSB7CgkJCQkJCQkJJGYgPSAtJHNuICogJGVbJGotMV07CgkJCQkJCQkJJGVbJGotMV0gPSAkY3MgKiAkZVskai0xXTsKCQkJCQkJCX0KCQkJCQkJCWlmICgkd2FudHYpIHsKCQkJCQkJCQlmb3IgKCRpID0gMDsgJGkgPCAkdGhpcy0+bjsgKyskaSkgewoJCQkJCQkJCQkkdCA9ICRjcyAqICR0aGlzLT5WWyRpXVskal0gKyAkc24gKiAkdGhpcy0+VlskaV1bJHAtMV07CgkJCQkJCQkJCSR0aGlzLT5WWyRpXVskcC0xXSA9IC0kc24gKiAkdGhpcy0+VlskaV1bJGpdICsgJGNzICogJHRoaXMtPlZbJGldWyRwLTFdOwoJCQkJCQkJCQkkdGhpcy0+VlskaV1bJGpdID0gJHQ7CgkJCQkJCQkJfQoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJCWJyZWFrOwoJCQkJLy8gU3BsaXQgYXQgbmVnbGlnaWJsZSBzKGspLgoJCQkJY2FzZSAyOgoJCQkJCQkkZiA9ICRlWyRrLTFdOwoJCQkJCQkkZVskay0xXSA9IDAuMDsKCQkJCQkJZm9yICgkaiA9ICRrOyAkaiA8ICRwOyArKyRqKSB7CgkJCQkJCQkkdCA9IGh5cG8oJHRoaXMtPnNbJGpdLCAkZik7CgkJCQkJCQkkY3MgPSAkdGhpcy0+c1skal0gLyAkdDsKCQkJCQkJCSRzbiA9ICRmIC8gJHQ7CgkJCQkJCQkkdGhpcy0+c1skal0gPSAkdDsKCQkJCQkJCSRmID0gLSRzbiAqICRlWyRqXTsKCQkJCQkJCSRlWyRqXSA9ICRjcyAqICRlWyRqXTsKCQkJCQkJCWlmICgkd2FudHUpIHsKCQkJCQkJCQlmb3IgKCRpID0gMDsgJGkgPCAkdGhpcy0+bTsgKyskaSkgewoJCQkJCQkJCQkkdCA9ICRjcyAqICR0aGlzLT5VWyRpXVskal0gKyAkc24gKiAkdGhpcy0+VVskaV1bJGstMV07CgkJCQkJCQkJCSR0aGlzLT5VWyRpXVskay0xXSA9IC0kc24gKiAkdGhpcy0+VVskaV1bJGpdICsgJGNzICogJHRoaXMtPlVbJGldWyRrLTFdOwoJCQkJCQkJCQkkdGhpcy0+VVskaV1bJGpdID0gJHQ7CgkJCQkJCQkJfQoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJCWJyZWFrOwoJCQkJLy8gUGVyZm9ybSBvbmUgcXIgc3RlcC4KCQkJCWNhc2UgMzoKCQkJCQkJLy8gQ2FsY3VsYXRlIHRoZSBzaGlmdC4KCQkJCQkJJHNjYWxlID0gbWF4KG1heChtYXgobWF4KAoJCQkJCQkJCQlhYnMoJHRoaXMtPnNbJHAtMV0pLGFicygkdGhpcy0+c1skcC0yXSkpLGFicygkZVskcC0yXSkpLAoJCQkJCQkJCQlhYnMoJHRoaXMtPnNbJGtdKSksIGFicygkZVska10pKTsKCQkJCQkJJHNwICAgPSAkdGhpcy0+c1skcC0xXSAvICRzY2FsZTsKCQkJCQkJJHNwbTEgPSAkdGhpcy0+c1skcC0yXSAvICRzY2FsZTsKCQkJCQkJJGVwbTEgPSAkZVskcC0yXSAvICRzY2FsZTsKCQkJCQkJJHNrICAgPSAkdGhpcy0+c1ska10gLyAkc2NhbGU7CgkJCQkJCSRlayAgID0gJGVbJGtdIC8gJHNjYWxlOwoJCQkJCQkkYiAgICA9ICgoJHNwbTEgKyAkc3ApICogKCRzcG0xIC0gJHNwKSArICRlcG0xICogJGVwbTEpIC8gMi4wOwoJCQkJCQkkYyAgICA9ICgkc3AgKiAkZXBtMSkgKiAoJHNwICogJGVwbTEpOwoJCQkJCQkkc2hpZnQgPSAwLjA7CgkJCQkJCWlmICgoJGIgIT0gMC4wKSB8fCAoJGMgIT0gMC4wKSkgewoJCQkJCQkJJHNoaWZ0ID0gc3FydCgkYiAqICRiICsgJGMpOwoJCQkJCQkJaWYgKCRiIDwgMC4wKSB7CgkJCQkJCQkJJHNoaWZ0ID0gLSRzaGlmdDsKCQkJCQkJCX0KCQkJCQkJCSRzaGlmdCA9ICRjIC8gKCRiICsgJHNoaWZ0KTsKCQkJCQkJfQoJCQkJCQkkZiA9ICgkc2sgKyAkc3ApICogKCRzayAtICRzcCkgKyAkc2hpZnQ7CgkJCQkJCSRnID0gJHNrICogJGVrOwoJCQkJCQkvLyBDaGFzZSB6ZXJvcy4KCQkJCQkJZm9yICgkaiA9ICRrOyAkaiA8ICRwLTE7ICsrJGopIHsKCQkJCQkJCSR0ICA9IGh5cG8oJGYsJGcpOwoJCQkJCQkJJGNzID0gJGYvJHQ7CgkJCQkJCQkkc24gPSAkZy8kdDsKCQkJCQkJCWlmICgkaiAhPSAkaykgewoJCQkJCQkJCSRlWyRqLTFdID0gJHQ7CgkJCQkJCQl9CgkJCQkJCQkkZiA9ICRjcyAqICR0aGlzLT5zWyRqXSArICRzbiAqICRlWyRqXTsKCQkJCQkJCSRlWyRqXSA9ICRjcyAqICRlWyRqXSAtICRzbiAqICR0aGlzLT5zWyRqXTsKCQkJCQkJCSRnID0gJHNuICogJHRoaXMtPnNbJGorMV07CgkJCQkJCQkkdGhpcy0+c1skaisxXSA9ICRjcyAqICR0aGlzLT5zWyRqKzFdOwoJCQkJCQkJaWYgKCR3YW50dikgewoJCQkJCQkJCWZvciAoJGkgPSAwOyAkaSA8ICR0aGlzLT5uOyArKyRpKSB7CgkJCQkJCQkJCSR0ID0gJGNzICogJHRoaXMtPlZbJGldWyRqXSArICRzbiAqICR0aGlzLT5WWyRpXVskaisxXTsKCQkJCQkJCQkJJHRoaXMtPlZbJGldWyRqKzFdID0gLSRzbiAqICR0aGlzLT5WWyRpXVskal0gKyAkY3MgKiAkdGhpcy0+VlskaV1bJGorMV07CgkJCQkJCQkJCSR0aGlzLT5WWyRpXVskal0gPSAkdDsKCQkJCQkJCQl9CgkJCQkJCQl9CgkJCQkJCQkkdCA9IGh5cG8oJGYsJGcpOwoJCQkJCQkJJGNzID0gJGYvJHQ7CgkJCQkJCQkkc24gPSAkZy8kdDsKCQkJCQkJCSR0aGlzLT5zWyRqXSA9ICR0OwoJCQkJCQkJJGYgPSAkY3MgKiAkZVskal0gKyAkc24gKiAkdGhpcy0+c1skaisxXTsKCQkJCQkJCSR0aGlzLT5zWyRqKzFdID0gLSRzbiAqICRlWyRqXSArICRjcyAqICR0aGlzLT5zWyRqKzFdOwoJCQkJCQkJJGcgPSAkc24gKiAkZVskaisxXTsKCQkJCQkJCSRlWyRqKzFdID0gJGNzICogJGVbJGorMV07CgkJCQkJCQlpZiAoJHdhbnR1ICYmICgkaiA8ICR0aGlzLT5tIC0gMSkpIHsKCQkJCQkJCQlmb3IgKCRpID0gMDsgJGkgPCAkdGhpcy0+bTsgKyskaSkgewoJCQkJCQkJCQkkdCA9ICRjcyAqICR0aGlzLT5VWyRpXVskal0gKyAkc24gKiAkdGhpcy0+VVskaV1bJGorMV07CgkJCQkJCQkJCSR0aGlzLT5VWyRpXVskaisxXSA9IC0kc24gKiAkdGhpcy0+VVskaV1bJGpdICsgJGNzICogJHRoaXMtPlVbJGldWyRqKzFdOwoJCQkJCQkJCQkkdGhpcy0+VVskaV1bJGpdID0gJHQ7CgkJCQkJCQkJfQoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJCSRlWyRwLTJdID0gJGY7CgkJCQkJCSRpdGVyID0gJGl0ZXIgKyAxOwoJCQkJCQlicmVhazsKCQkJCS8vIENvbnZlcmdlbmNlLgoJCQkJY2FzZSA0OgoJCQkJCQkvLyBNYWtlIHRoZSBzaW5ndWxhciB2YWx1ZXMgcG9zaXRpdmUuCgkJCQkJCWlmICgkdGhpcy0+c1ska10gPD0gMC4wKSB7CgkJCQkJCQkkdGhpcy0+c1ska10gPSAoJHRoaXMtPnNbJGtdIDwgMC4wID8gLSR0aGlzLT5zWyRrXSA6IDAuMCk7CgkJCQkJCQlpZiAoJHdhbnR2KSB7CgkJCQkJCQkJZm9yICgkaSA9IDA7ICRpIDw9ICRwcDsgKyskaSkgewoJCQkJCQkJCQkkdGhpcy0+VlskaV1bJGtdID0gLSR0aGlzLT5WWyRpXVska107CgkJCQkJCQkJfQoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJCS8vIE9yZGVyIHRoZSBzaW5ndWxhciB2YWx1ZXMuCgkJCQkJCXdoaWxlICgkayA8ICRwcCkgewoJCQkJCQkJaWYgKCR0aGlzLT5zWyRrXSA+PSAkdGhpcy0+c1skaysxXSkgewoJCQkJCQkJCWJyZWFrOwoJCQkJCQkJfQoJCQkJCQkJJHQgPSAkdGhpcy0+c1ska107CgkJCQkJCQkkdGhpcy0+c1ska10gPSAkdGhpcy0+c1skaysxXTsKCQkJCQkJCSR0aGlzLT5zWyRrKzFdID0gJHQ7CgkJCQkJCQlpZiAoJHdhbnR2IEFORCAoJGsgPCAkdGhpcy0+biAtIDEpKSB7CgkJCQkJCQkJZm9yICgkaSA9IDA7ICRpIDwgJHRoaXMtPm47ICsrJGkpIHsKCQkJCQkJCQkJJHQgPSAkdGhpcy0+VlskaV1bJGsrMV07CgkJCQkJCQkJCSR0aGlzLT5WWyRpXVskaysxXSA9ICR0aGlzLT5WWyRpXVska107CgkJCQkJCQkJCSR0aGlzLT5WWyRpXVska10gPSAkdDsKCQkJCQkJCQl9CgkJCQkJCQl9CgkJCQkJCQlpZiAoJHdhbnR1IEFORCAoJGsgPCAkdGhpcy0+bS0xKSkgewoJCQkJCQkJCWZvciAoJGkgPSAwOyAkaSA8ICR0aGlzLT5tOyArKyRpKSB7CgkJCQkJCQkJCSR0ID0gJHRoaXMtPlVbJGldWyRrKzFdOwoJCQkJCQkJCQkkdGhpcy0+VVskaV1bJGsrMV0gPSAkdGhpcy0+VVskaV1bJGtdOwoJCQkJCQkJCQkkdGhpcy0+VVskaV1bJGtdID0gJHQ7CgkJCQkJCQkJfQoJCQkJCQkJfQoJCQkJCQkJKyskazsKCQkJCQkJfQoJCQkJCQkkaXRlciA9IDA7CgkJCQkJCS0tJHA7CgkJCQkJCWJyZWFrOwoJCQl9IC8vIGVuZCBzd2l0Y2gKCQl9IC8vIGVuZCB3aGlsZQoKCX0gLy8gZW5kIGNvbnN0cnVjdG9yCgoKCS8qKgoJICoJUmV0dXJuIHRoZSBsZWZ0IHNpbmd1bGFyIHZlY3RvcnMKCSAqCgkgKglAYWNjZXNzIHB1YmxpYwoJICoJQHJldHVybiBVCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRVKCkgewoJCXJldHVybiBuZXcgTWF0cml4KCR0aGlzLT5VLCAkdGhpcy0+bSwgbWluKCR0aGlzLT5tICsgMSwgJHRoaXMtPm4pKTsKCX0KCgoJLyoqCgkgKglSZXR1cm4gdGhlIHJpZ2h0IHNpbmd1bGFyIHZlY3RvcnMKCSAqCgkgKglAYWNjZXNzIHB1YmxpYwoJICoJQHJldHVybiBWCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRWKCkgewoJCXJldHVybiBuZXcgTWF0cml4KCR0aGlzLT5WKTsKCX0KCgoJLyoqCgkgKglSZXR1cm4gdGhlIG9uZS1kaW1lbnNpb25hbCBhcnJheSBvZiBzaW5ndWxhciB2YWx1ZXMKCSAqCgkgKglAYWNjZXNzIHB1YmxpYwoJICoJQHJldHVybiBkaWFnb25hbCBvZiBTLgoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0U2luZ3VsYXJWYWx1ZXMoKSB7CgkJcmV0dXJuICR0aGlzLT5zOwoJfQoKCgkvKioKCSAqCVJldHVybiB0aGUgZGlhZ29uYWwgbWF0cml4IG9mIHNpbmd1bGFyIHZhbHVlcwoJICoKCSAqCUBhY2Nlc3MgcHVibGljCgkgKglAcmV0dXJuIFMKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldFMoKSB7CgkJZm9yICgkaSA9IDA7ICRpIDwgJHRoaXMtPm47ICsrJGkpIHsKCQkJZm9yICgkaiA9IDA7ICRqIDwgJHRoaXMtPm47ICsrJGopIHsKCQkJCSRTWyRpXVskal0gPSAwLjA7CgkJCX0KCQkJJFNbJGldWyRpXSA9ICR0aGlzLT5zWyRpXTsKCQl9CgkJcmV0dXJuIG5ldyBNYXRyaXgoJFMpOwoJfQoKCgkvKioKCSAqCVR3byBub3JtCgkgKgoJICoJQGFjY2VzcyBwdWJsaWMKCSAqCUByZXR1cm4gbWF4KFMpCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBub3JtMigpIHsKCQlyZXR1cm4gJHRoaXMtPnNbMF07Cgl9CgoKCS8qKgoJICoJVHdvIG5vcm0gY29uZGl0aW9uIG51bWJlcgoJICoKCSAqCUBhY2Nlc3MgcHVibGljCgkgKglAcmV0dXJuIG1heChTKS9taW4oUykKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGNvbmQoKSB7CgkJcmV0dXJuICR0aGlzLT5zWzBdIC8gJHRoaXMtPnNbbWluKCR0aGlzLT5tLCAkdGhpcy0+bikgLSAxXTsKCX0KCgoJLyoqCgkgKglFZmZlY3RpdmUgbnVtZXJpY2FsIG1hdHJpeCByYW5rCgkgKgoJICoJQGFjY2VzcyBwdWJsaWMKCSAqCUByZXR1cm4gTnVtYmVyIG9mIG5vbm5lZ2xpZ2libGUgc2luZ3VsYXIgdmFsdWVzLgoJICovCglwdWJsaWMgZnVuY3Rpb24gcmFuaygpIHsKCQkkZXBzID0gcG93KDIuMCwgLTUyLjApOwoJCSR0b2wgPSBtYXgoJHRoaXMtPm0sICR0aGlzLT5uKSAqICR0aGlzLT5zWzBdICogJGVwczsKCQkkciA9IDA7CgkJZm9yICgkaSA9IDA7ICRpIDwgY291bnQoJHRoaXMtPnMpOyArKyRpKSB7CgkJCWlmICgkdGhpcy0+c1skaV0gPiAkdG9sKSB7CgkJCQkrKyRyOwoJCQl9CgkJfQoJCXJldHVybiAkcjsKCX0KCn0JLy8JY2xhc3MgU2luZ3VsYXJWYWx1ZURlY29tcG9zaXRpb24K]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Shared/JAMA/tests/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Shared/JAMA/tests/TestMatrix.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCnJlcXVpcmVfb25jZSAiLi4vTWF0cml4LnBocCI7CgpjbGFzcyBUZXN0TWF0cml4IHsKCiAgZnVuY3Rpb24gVGVzdE1hdHJpeCgpIHsKCiAgICAvLyBkZWZpbmUgdGVzdCB2YXJpYWJsZXMKCiAgICAkZXJyb3JDb3VudCAgID0gMDsKICAgICR3YXJuaW5nQ291bnQgPSAwOwogICAgJGNvbHVtbndpc2UgICA9IGFycmF5KDEuLDIuLDMuLDQuLDUuLDYuLDcuLDguLDkuLDEwLiwxMS4sMTIuKTsKICAgICRyb3d3aXNlICAgICAgPSBhcnJheSgxLiw0Liw3LiwxMC4sMi4sNS4sOC4sMTEuLDMuLDYuLDkuLDEyLik7CiAgICAkYXZhbHMgICAgICAgID0gYXJyYXkoYXJyYXkoMS4sNC4sNy4sMTAuKSxhcnJheSgyLiw1Liw4LiwxMS4pLGFycmF5KDMuLDYuLDkuLDEyLikpOwogICAgJHJhbmtkZWYgICAgICA9ICRhdmFsczsKICAgICR0dmFscyAgICAgICAgPSBhcnJheShhcnJheSgxLiwyLiwzLiksYXJyYXkoNC4sNS4sNi4pLGFycmF5KDcuLDguLDkuKSxhcnJheSgxMC4sMTEuLDEyLikpOwogICAgJHN1YmF2YWxzICAgICA9IGFycmF5KGFycmF5KDUuLDguLDExLiksYXJyYXkoNi4sOS4sMTIuKSk7CiAgICAkcnZhbHMgICAgICAgID0gYXJyYXkoYXJyYXkoMS4sNC4sNy4pLGFycmF5KDIuLDUuLDguLDExLiksYXJyYXkoMy4sNi4sOS4sMTIuKSk7CiAgICAkcHZhbHMgICAgICAgID0gYXJyYXkoYXJyYXkoMS4sMS4sMS4pLGFycmF5KDEuLDIuLDMuKSxhcnJheSgxLiwzLiw2LikpOwogICAgJGl2YWxzICAgICAgICA9IGFycmF5KGFycmF5KDEuLDAuLDAuLDAuKSxhcnJheSgwLiwxLiwwLiwwLiksYXJyYXkoMC4sMC4sMS4sMC4pKTsKICAgICRldmFscyAgICAgICAgPSBhcnJheShhcnJheSgwLiwxLiwwLiwwLiksYXJyYXkoMS4sMC4sMi5lLTcsMC4pLGFycmF5KDAuLC0yLmUtNywwLiwxLiksYXJyYXkoMC4sMC4sMS4sMC4pKTsKICAgICRzcXVhcmUgICAgICAgPSBhcnJheShhcnJheSgxNjYuLDE4OC4sMjEwLiksYXJyYXkoMTg4LiwyMTQuLDI0MC4pLGFycmF5KDIxMC4sMjQwLiwyNzAuKSk7CiAgICAkc3FTb2x1dGlvbiAgID0gYXJyYXkoYXJyYXkoMTMuKSxhcnJheSgxNS4pKTsKICAgICRjb25kbWF0ICAgICAgPSBhcnJheShhcnJheSgxLiwzLiksYXJyYXkoNy4sOS4pKTsKICAgICRyb3dzICAgICAgICAgPSAzOwogICAgJGNvbHMgICAgICAgICA9IDQ7CiAgICAkaW52YWxpZElEICAgID0gNTsgLyogc2hvdWxkIHRyaWdnZXIgYmFkIHNoYXBlIGZvciBjb25zdHJ1Y3Rpb24gd2l0aCB2YWwgICAgICAgICovCiAgICAkcmFnZ2VkciAgICAgID0gMDsgLyogKHJhZ2dlZHIscmFnZ2VkYykgc2hvdWxkIGJlIG91dCBvZiBib3VuZHMgaW4gcmFnZ2VkIGFycmF5ICovCiAgICAkcmFnZ2VkYyAgICAgID0gNDsKICAgICR2YWxpZElEICAgICAgPSAzOyAvKiBsZWFkaW5nIGRpbWVuc2lvbiBvZiBpbnRlbmRlZCB0ZXN0IE1hdHJpY2VzICAgICAgICAgICAgICAgKi8KICAgICRub25jb25mb3JtbGQgPSA0OyAvKiBsZWFkaW5nIGRpbWVuc2lvbiB3aGljaCBpcyB2YWxpZCwgYnV0IG5vbmNvbmZvcm1pbmcgICAgICAgKi8KICAgICRpYiAgICAgICAgICAgPSAxOyAvKiBpbmRleCByYW5nZXMgZm9yIHN1YiBNYXRyaXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgICRpZSAgICAgICAgICAgPSAyOwogICAgJGpiICAgICAgICAgICA9IDE7CiAgICAkamUgICAgICAgICAgID0gMzsKICAgICRyb3dpbmRleHNldCAgICAgICA9IGFycmF5KDEsMik7CiAgICAkYmFkcm93aW5kZXhzZXQgICAgPSBhcnJheSgxLDMpOwogICAgJGNvbHVtbmluZGV4c2V0ICAgID0gYXJyYXkoMSwyLDMpOwogICAgJGJhZGNvbHVtbmluZGV4c2V0ID0gYXJyYXkoMSwyLDQpOwogICAgJGNvbHVtbnN1bW1heCAgICAgID0gMzMuOwogICAgJHJvd3N1bW1heCAgICAgICAgID0gMzAuOwogICAgJHN1bW9mZGlhZ29uYWxzICAgID0gMTU7CiAgICAkc3Vtb2ZzcXVhcmVzICAgICAgPSA2NTA7CgogICAgLyoqCiAgICAqIFRlc3QgbWF0cml4IG1ldGhvZHMKICAgICovCgogICAgLyoqCiAgICAqIENvbnN0cnVjdG9ycyBhbmQgY29uc3RydWN0b3ItbGlrZSBtZXRob2RzOgogICAgKgogICAgKiAgIE1hdHJpeChkb3VibGVbXSwgaW50KQogICAgKiAgIE1hdHJpeChkb3VibGVbXVtdKQogICAgKiAgIE1hdHJpeChpbnQsIGludCkKICAgICogICBNYXRyaXgoaW50LCBpbnQsIGRvdWJsZSkKICAgICogICBNYXRyaXgoaW50LCBpbnQsIGRvdWJsZVtdW10pCiAgICAqICAgY29uc3RydWN0V2l0aENvcHkoZG91YmxlW11bXSkKICAgICogICByYW5kb20oaW50LGludCkKICAgICogICBpZGVudGl0eShpbnQpCiAgICAqLwogICAgZWNobyAiPHA+VGVzdGluZyBjb25zdHJ1Y3RvcnMgYW5kIGNvbnN0cnVjdG9yLWxpa2UgbWV0aG9kcy4uLjwvcD4iOwoKICAgICRBID0gbmV3IE1hdHJpeCgkY29sdW1ud2lzZSwgMyk7CiAgICBpZigkQSBpbnN0YW5jZW9mIE1hdHJpeCkgewogICAgICAkdGhpcy0+dHJ5X3N1Y2Nlc3MoIkNvbHVtbi1wYWNrZWQgY29uc3RydWN0b3IuLi4iKTsKICAgIH0gZWxzZQogICAgICAkZXJyb3JDb3VudCA9ICR0aGlzLT50cnlfZmFpbHVyZSgkZXJyb3JDb3VudCwgIkNvbHVtbi1wYWNrZWQgY29uc3RydWN0b3IuLi4iLCAiVW5hYmxlIHRvIGNvbnN0cnVjdCBNYXRyaXgiKTsKCiAgICAkVCA9IG5ldyBNYXRyaXgoJHR2YWxzKTsKICAgIGlmKCRUIGluc3RhbmNlb2YgTWF0cml4KQogICAgICAkdGhpcy0+dHJ5X3N1Y2Nlc3MoIjJEIGFycmF5IGNvbnN0cnVjdG9yLi4uIik7CiAgICBlbHNlCiAgICAgICRlcnJvckNvdW50ID0gJHRoaXMtPnRyeV9mYWlsdXJlKCRlcnJvckNvdW50LCAiMkQgYXJyYXkgY29uc3RydWN0b3IuLi4iLCAiVW5hYmxlIHRvIGNvbnN0cnVjdCBNYXRyaXgiKTsKCiAgICAkQSA9IG5ldyBNYXRyaXgoJGNvbHVtbndpc2UsICR2YWxpZElEKTsKICAgICRCID0gbmV3IE1hdHJpeCgkYXZhbHMpOwogICAgJHRtcCA9ICRCLT5nZXQoMCwwKTsKICAgICRhdmFsc1swXVswXSA9IDAuMDsKICAgICRDID0gJEItPm1pbnVzKCRBKTsKICAgICRhdmFsc1swXVswXSA9ICR0bXA7CiAgICAkQiA9IE1hdHJpeDo6Y29uc3RydWN0V2l0aENvcHkoJGF2YWxzKTsKICAgICR0bXAgPSAkQi0+Z2V0KDAsMCk7CiAgICAkYXZhbHNbMF1bMF0gPSAwLjA7CiAgICAvKiogY2hlY2sgdGhhdCBjb25zdHJ1Y3RXaXRoQ29weSBiZWhhdmVzIHByb3Blcmx5ICoqLwogICAgaWYgKCAoICR0bXAgLSAkQi0+Z2V0KDAsMCkgKSAhPSAwLjAgKQogICAgICAkZXJyb3JDb3VudCA9ICR0aGlzLT50cnlfZmFpbHVyZSgkZXJyb3JDb3VudCwiY29uc3RydWN0V2l0aENvcHkuLi4gIiwiY29weSBub3QgZWZmZWN0ZWQuLi4gZGF0YSB2aXNpYmxlIG91dHNpZGUiKTsKICAgIGVsc2UKICAgICAgJHRoaXMtPnRyeV9zdWNjZXNzKCJjb25zdHJ1Y3RXaXRoQ29weS4uLiAiLCIiKTsKCiAgICAkSSA9IG5ldyBNYXRyaXgoJGl2YWxzKTsKICAgIGlmICggJHRoaXMtPmNoZWNrTWF0cmljZXMoJEksTWF0cml4OjppZGVudGl0eSgzLDQpKSApCiAgICAgICR0aGlzLT50cnlfc3VjY2VzcygiaWRlbnRpdHkuLi4gIiwiIik7CiAgICBlbHNlCiAgICAgICRlcnJvckNvdW50ID0gJHRoaXMtPnRyeV9mYWlsdXJlKCRlcnJvckNvdW50LCJpZGVudGl0eS4uLiAiLCJpZGVudGl0eSBNYXRyaXggbm90IHN1Y2Nlc3NmdWxseSBjcmVhdGVkIik7CgogICAgLyoqCiAgICAqIEFjY2VzcyBNZXRob2RzOgogICAgKgogICAgKiAgIGdldENvbHVtbkRpbWVuc2lvbigpCiAgICAqICAgZ2V0Um93RGltZW5zaW9uKCkKICAgICogICBnZXRBcnJheSgpCiAgICAqICAgZ2V0QXJyYXlDb3B5KCkKICAgICogICBnZXRDb2x1bW5QYWNrZWRDb3B5KCkKICAgICogICBnZXRSb3dQYWNrZWRDb3B5KCkKICAgICogICBnZXQoaW50LGludCkKICAgICogICBnZXRNYXRyaXgoaW50LGludCxpbnQsaW50KQogICAgKiAgIGdldE1hdHJpeChpbnQsaW50LGludFtdKQogICAgKiAgIGdldE1hdHJpeChpbnRbXSxpbnQsaW50KQogICAgKiAgIGdldE1hdHJpeChpbnRbXSxpbnRbXSkKICAgICogICBzZXQoaW50LGludCxkb3VibGUpCiAgICAqICAgc2V0TWF0cml4KGludCxpbnQsaW50LGludCxNYXRyaXgpCiAgICAqICAgc2V0TWF0cml4KGludCxpbnQsaW50W10sTWF0cml4KQogICAgKiAgIHNldE1hdHJpeChpbnRbXSxpbnQsaW50LE1hdHJpeCkKICAgICogICBzZXRNYXRyaXgoaW50W10saW50W10sTWF0cml4KQogICAgKi8KICAgIHByaW50ICI8cD5UZXN0aW5nIGFjY2VzcyBtZXRob2RzLi4uPC9wPiI7CgoJJEIgPSBuZXcgTWF0cml4KCRhdmFscyk7CglpZigkQi0+Z2V0Um93RGltZW5zaW9uKCkgPT0gJHJvd3MpCgkgICR0aGlzLT50cnlfc3VjY2VzcygiZ2V0Um93RGltZW5zaW9uLi4uIik7CgllbHNlCgkgICRlcnJvckNvdW50ID0gJHRoaXMtPnRyeV9mYWlsdXJlKCRlcnJvckNvdW50LCAiZ2V0Um93RGltZW5zaW9uLi4uIik7CgoJaWYoJEItPmdldENvbHVtbkRpbWVuc2lvbigpID09ICRjb2xzKQoJICAkdGhpcy0+dHJ5X3N1Y2Nlc3MoImdldENvbHVtbkRpbWVuc2lvbi4uLiIpOwoJZWxzZQoJICAkZXJyb3JDb3VudCA9ICR0aGlzLT50cnlfZmFpbHVyZSgkZXJyb3JDb3VudCwgImdldENvbHVtbkRpbWVuc2lvbi4uLiIpOwoKCSRiYXJyYXkgPSAkQi0+Z2V0QXJyYXkoKTsKCWlmKCR0aGlzLT5jaGVja0FycmF5cygkYmFycmF5LCAkYXZhbHMpKQoJICAkdGhpcy0+dHJ5X3N1Y2Nlc3MoImdldEFycmF5Li4uIik7CgllbHNlCgkgICRlcnJvckNvdW50ID0gJHRoaXMtPnRyeV9mYWlsdXJlKCRlcnJvckNvdW50LCAiZ2V0QXJyYXkuLi4iKTsKCgkkYnBhY2tlZCA9ICRCLT5nZXRDb2x1bW5QYWNrZWRDb3B5KCk7CglpZigkdGhpcy0+Y2hlY2tBcnJheXMoJGJwYWNrZWQsICRjb2x1bW53aXNlKSkKCSAgJHRoaXMtPnRyeV9zdWNjZXNzKCJnZXRDb2x1bW5QYWNrZWRDb3B5Li4uIik7CgllbHNlCgkgICRlcnJvckNvdW50ID0gJHRoaXMtPnRyeV9mYWlsdXJlKCRlcnJvckNvdW50LCAiZ2V0Q29sdW1uUGFja2VkQ29weS4uLiIpOwoKCSRicGFja2VkID0gJEItPmdldFJvd1BhY2tlZENvcHkoKTsKCWlmKCR0aGlzLT5jaGVja0FycmF5cygkYnBhY2tlZCwgJHJvd3dpc2UpKQoJICAkdGhpcy0+dHJ5X3N1Y2Nlc3MoImdldFJvd1BhY2tlZENvcHkuLi4iKTsKCWVsc2UKCSAgJGVycm9yQ291bnQgPSAkdGhpcy0+dHJ5X2ZhaWx1cmUoJGVycm9yQ291bnQsICJnZXRSb3dQYWNrZWRDb3B5Li4uIik7CgogICAgLyoqCiAgICAqIEFycmF5LWxpa2UgbWV0aG9kczoKICAgICogICBtaW51cwogICAgKiAgIG1pbnVzRXF1YWxzCiAgICAqICAgcGx1cwogICAgKiAgIHBsdXNFcXVhbHMKICAgICogICBhcnJheUxlZnREaXZpZGUKICAgICogICBhcnJheUxlZnREaXZpZGVFcXVhbHMKICAgICogICBhcnJheVJpZ2h0RGl2aWRlCiAgICAqICAgYXJyYXlSaWdodERpdmlkZUVxdWFscwogICAgKiAgIGFycmF5VGltZXMKICAgICogICBhcnJheVRpbWVzRXF1YWxzCiAgICAqICAgdW1pbnVzCiAgICAqLwogICAgcHJpbnQgIjxwPlRlc3RpbmcgYXJyYXktbGlrZSBtZXRob2RzLi4uPC9wPiI7CgogICAgLyoqCiAgICAqIEkvTyBtZXRob2RzOgogICAgKiAgIHJlYWQKICAgICogICBwcmludAogICAgKiAgIHNlcmlhbGl6YWJsZToKICAgICogICB3cml0ZU9iamVjdAogICAgKiAgIHJlYWRPYmplY3QKICAgICovCiAgICBwcmludCAiPHA+VGVzdGluZyBJL08gbWV0aG9kcy4uLjwvcD4iOwoKICAgIC8qKgogICAgKiBUZXN0IGxpbmVhciBhbGdlYnJhIG1ldGhvZHMKICAgICovCiAgICBlY2hvICI8cD5UZXN0aW5nIGxpbmVhciBhbGdlYnJhIG1ldGhvZHMuLi48cD4iOwoKICAgICRBID0gbmV3IE1hdHJpeCgkY29sdW1ud2lzZSwgMyk7CiAgICBpZiggJHRoaXMtPmNoZWNrTWF0cmljZXMoJEEtPnRyYW5zcG9zZSgpLCAkVCkgKQogICAgICAkdGhpcy0+dHJ5X3N1Y2Nlc3MoIlRyYW5zcG9zZSBjaGVjay4uLiIpOwogICAgZWxzZQogICAgICAkZXJyb3JDb3VudCA9ICR0aGlzLT50cnlfZmFpbHVyZSgkZXJyb3JDb3VudCwgIlRyYW5zcG9zZSBjaGVjay4uLiIsICJNYXRyaWNlcyBhcmUgbm90IGVxdWFsIik7CgogICAgaWYoJHRoaXMtPmNoZWNrU2NhbGFycygkQS0+bm9ybTEoKSwgJGNvbHVtbnN1bW1heCkpCiAgICAgICR0aGlzLT50cnlfc3VjY2VzcygiTWF4aW11bSBjb2x1bW4gc3VtLi4uIik7CiAgICBlbHNlCiAgICAgICRlcnJvckNvdW50ID0gJHRoaXMtPnRyeV9mYWlsdXJlKCRlcnJvckNvdW50LCAiTWF4aW11bSBjb2x1bW4gc3VtLi4uIiwgIkluY29ycmVjdDogIiAuICRBLT5ub3JtMSgpIC4gIiAhPSAiIC4gJGNvbHVtbnN1bW1heCk7CgogICAgaWYoJHRoaXMtPmNoZWNrU2NhbGFycygkQS0+bm9ybUluZigpLCAkcm93c3VtbWF4KSkKICAgICAgJHRoaXMtPnRyeV9zdWNjZXNzKCJNYXhpbXVtIHJvdyBzdW0uLi4iKTsKICAgIGVsc2UKICAgICAgJGVycm9yQ291bnQgPSAkdGhpcy0+dHJ5X2ZhaWx1cmUoJGVycm9yQ291bnQsICJNYXhpbXVtIHJvdyBzdW0uLi4iLCAiSW5jb3JyZWN0OiAiIC4gJEEtPm5vcm1JbmYoKSAuICIgIT0gIiAuICRyb3dzdW1tYXggKTsKCiAgICBpZigkdGhpcy0+Y2hlY2tTY2FsYXJzKCRBLT5ub3JtRigpLCBzcXJ0KCRzdW1vZnNxdWFyZXMpKSkKICAgICAgJHRoaXMtPnRyeV9zdWNjZXNzKCJGcm9iZW5pdXMgbm9ybS4uLiIpOwogICAgZWxzZQogICAgICAkZXJyb3JDb3VudCA9ICR0aGlzLT50cnlfZmFpbHVyZSgkZXJyb3JDb3VudCwgIkZyb2Jlbml1cyBub3JtLi4uIiwgIkluY29ycmVjdDoiIC4gJEEtPm5vcm1GKCkgLiAiICE9ICIgLiBzcXJ0KCRzdW1vZnNxdWFyZXMpKTsKCiAgICBpZigkdGhpcy0+Y2hlY2tTY2FsYXJzKCRBLT50cmFjZSgpLCAkc3Vtb2ZkaWFnb25hbHMpKQogICAgICAkdGhpcy0+dHJ5X3N1Y2Nlc3MoIk1hdHJpeCB0cmFjZS4uLiIpOwogICAgZWxzZQogICAgICAkZXJyb3JDb3VudCA9ICR0aGlzLT50cnlfZmFpbHVyZSgkZXJyb3JDb3VudCwgIk1hdHJpeCB0cmFjZS4uLiIsICJJbmNvcnJlY3Q6ICIgLiAkQS0+dHJhY2UoKSAuICIgIT0gIiAuICRzdW1vZmRpYWdvbmFscyk7CgogICAgJEIgPSAkQS0+Z2V0TWF0cml4KDAsICRBLT5nZXRSb3dEaW1lbnNpb24oKSwgMCwgJEEtPmdldFJvd0RpbWVuc2lvbigpKTsKICAgIGlmKCAkQi0+ZGV0KCkgPT0gMCApCiAgICAgICR0aGlzLT50cnlfc3VjY2VzcygiTWF0cml4IGRldGVybWluYW50Li4uIik7CiAgICBlbHNlCiAgICAgICRlcnJvckNvdW50ID0gJHRoaXMtPnRyeV9mYWlsdXJlKCRlcnJvckNvdW50LCAiTWF0cml4IGRldGVybWluYW50Li4uIiwgIkluY29ycmVjdDogIiAuICRCLT5kZXQoKSAuICIgIT0gIiAuIDApOwoKICAgICRBID0gbmV3IE1hdHJpeCgkY29sdW1ud2lzZSwzKTsKICAgICRTUSA9IG5ldyBNYXRyaXgoJHNxdWFyZSk7CiAgICBpZiAoJHRoaXMtPmNoZWNrTWF0cmljZXMoJFNRLCAkQS0+dGltZXMoJEEtPnRyYW5zcG9zZSgpKSkpCiAgICAgICR0aGlzLT50cnlfc3VjY2VzcygidGltZXMoTWF0cml4KS4uLiIpOwogICAgZWxzZSB7CiAgICAgICRlcnJvckNvdW50ID0gJHRoaXMtPnRyeV9mYWlsdXJlKCRlcnJvckNvdW50LCAidGltZXMoTWF0cml4KS4uLiIsICJVbmFibGUgdG8gbXVsdGlwbHkgbWF0cmljZXMiKTsKICAgICAgJFNRLT50b0hUTUwoKTsKICAgICAgJEFULT50b0hUTUwoKTsKICAgIH0KCiAgICAkQSA9IG5ldyBNYXRyaXgoJGNvbHVtbndpc2UsIDQpOwoKICAgICRRUiA9ICRBLT5xcigpOwogICAgJFIgPSAkUVItPmdldFIoKTsKICAgICRRID0gJFFSLT5nZXRRKCk7CiAgICBpZigkdGhpcy0+Y2hlY2tNYXRyaWNlcygkQSwgJFEtPnRpbWVzKCRSKSkpCiAgICAgICR0aGlzLT50cnlfc3VjY2VzcygiUVJEZWNvbXBvc2l0aW9uLi4uIiwiIik7CiAgICBlbHNlCiAgICAgICRlcnJvckNvdW50ID0gJHRoaXMtPnRyeV9mYWlsdXJlKCRlcnJvckNvdW50LCJRUkRlY29tcG9zaXRpb24uLi4iLCJpbmNvcnJlY3QgcXIgZGVjb21wb3NpdGlvbiBjYWxjdWxhdGlvbiIpOwoKICAgICRBID0gbmV3IE1hdHJpeCgkY29sdW1ud2lzZSwgNCk7CiAgICAkU1ZEID0gJEEtPnN2ZCgpOwogICAgJFUgPSAkU1ZELT5nZXRVKCk7CiAgICAkUyA9ICRTVkQtPmdldFMoKTsKICAgICRWID0gJFNWRC0+Z2V0VigpOwogICAgaWYgKCR0aGlzLT5jaGVja01hdHJpY2VzKCRBLCAkVS0+dGltZXMoJFMtPnRpbWVzKCRWLT50cmFuc3Bvc2UoKSkpKSkKICAgICAgJHRoaXMtPnRyeV9zdWNjZXNzKCJTaW5ndWxhclZhbHVlRGVjb21wb3NpdGlvbi4uLiIsIiIpOwogICAgZWxzZQogICAgICAkZXJyb3JDb3VudCA9ICR0aGlzLT50cnlfZmFpbHVyZSgkZXJyb3JDb3VudCwiU2luZ3VsYXJWYWx1ZURlY29tcG9zaXRpb24uLi4iLCJpbmNvcnJlY3Qgc2luZ3VsYXIgdmFsdWUgZGVjb21wb3NpdGlvbiBjYWxjdWxhdGlvbiIpOwoKICAgICRuID0gJEEtPmdldENvbHVtbkRpbWVuc2lvbigpOwogICAgJEEgPSAkQS0+Z2V0TWF0cml4KDAsJG4tMSwwLCRuLTEpOwogICAgJEEtPnNldCgwLDAsMC4pOwoKICAgICRMVSA9ICRBLT5sdSgpOwogICAgJEwgID0gJExVLT5nZXRMKCk7CiAgICBpZiAoICR0aGlzLT5jaGVja01hdHJpY2VzKCRBLT5nZXRNYXRyaXgoJExVLT5nZXRQaXZvdCgpLDAsJG4tMSksICRMLT50aW1lcygkTFUtPmdldFUoKSkpICkKICAgICAgJHRoaXMtPnRyeV9zdWNjZXNzKCJMVURlY29tcG9zaXRpb24uLi4iLCIiKTsKICAgIGVsc2UKICAgICAgJGVycm9yQ291bnQgPSAkdGhpcy0+dHJ5X2ZhaWx1cmUoJGVycm9yQ291bnQsIkxVRGVjb21wb3NpdGlvbi4uLiIsImluY29ycmVjdCBMVSBkZWNvbXBvc2l0aW9uIGNhbGN1bGF0aW9uIik7CgogICAgJFggPSAkQS0+aW52ZXJzZSgpOwogICAgaWYgKCAkdGhpcy0+Y2hlY2tNYXRyaWNlcygkQS0+dGltZXMoJFgpLE1hdHJpeDo6aWRlbnRpdHkoMywzKSkgKQogICAgICAgJHRoaXMtPnRyeV9zdWNjZXNzKCJpbnZlcnNlKCkuLi4iLCIiKTsKICAgICBlbHNlCiAgICAgICAkZXJyb3JDb3VudCA9ICR0aGlzLT50cnlfZmFpbHVyZSgkZXJyb3JDb3VudCwgImludmVyc2UoKS4uLiIsImluY29ycmVjdCBpbnZlcnNlIGNhbGN1bGF0aW9uIik7CgogICAgJERFRiA9IG5ldyBNYXRyaXgoJHJhbmtkZWYpOwogICAgaWYoJHRoaXMtPmNoZWNrU2NhbGFycygkREVGLT5yYW5rKCksIG1pbigkREVGLT5nZXRSb3dEaW1lbnNpb24oKSwgJERFRi0+Z2V0Q29sdW1uRGltZW5zaW9uKCkpLTEpKQogICAgICAkdGhpcy0+dHJ5X3N1Y2Nlc3MoIlJhbmsuLi4iKTsKICAgIGVsc2UKICAgICAgJHRoaXMtPnRyeV9mYWlsdXJlKCJSYW5rLi4uIiwgImluY29ycmVjdCByYW5rIGNhbGN1bGF0aW9uIik7CgogICAgJEIgPSBuZXcgTWF0cml4KCRjb25kbWF0KTsKICAgICRTVkQgPSAkQi0+c3ZkKCk7CiAgICAkc2luZ3VsYXJ2YWx1ZXMgPSAkU1ZELT5nZXRTaW5ndWxhclZhbHVlcygpOwogICAgaWYoJHRoaXMtPmNoZWNrU2NhbGFycygkQi0+Y29uZCgpLCAkc2luZ3VsYXJ2YWx1ZXNbMF0vJHNpbmd1bGFydmFsdWVzW21pbigkQi0+Z2V0Um93RGltZW5zaW9uKCksICRCLT5nZXRDb2x1bW5EaW1lbnNpb24oKSktMV0pKQogICAgICAkdGhpcy0+dHJ5X3N1Y2Nlc3MoIkNvbmRpdGlvbiBudW1iZXIuLi4iKTsKICAgIGVsc2UKICAgICAgJHRoaXMtPnRyeV9mYWlsdXJlKCJDb25kaXRpb24gbnVtYmVyLi4uIiwgImluY29ycmVjdCBjb25kaXRpb24gbnVtYmVyIGNhbGN1bGF0aW9uIik7CgogICAgJFNVQiA9IG5ldyBNYXRyaXgoJHN1YmF2YWxzKTsKICAgICRPICAgPSBuZXcgTWF0cml4KCRTVUItPmdldFJvd0RpbWVuc2lvbigpLDEsMS4wKTsKICAgICRTT0wgPSBuZXcgTWF0cml4KCRzcVNvbHV0aW9uKTsKICAgICRTUSA9ICRTVUItPmdldE1hdHJpeCgwLCRTVUItPmdldFJvd0RpbWVuc2lvbigpLTEsMCwkU1VCLT5nZXRSb3dEaW1lbnNpb24oKS0xKTsKICAgIGlmICggJHRoaXMtPmNoZWNrTWF0cmljZXMoJFNRLT5zb2x2ZSgkU09MKSwkTykgKQogICAgICAkdGhpcy0+dHJ5X3N1Y2Nlc3MoInNvbHZlKCkuLi4iLCIiKTsKICAgIGVsc2UKICAgICAkZXJyb3JDb3VudCA9ICR0aGlzLT50cnlfZmFpbHVyZSgkZXJyb3JDb3VudCwic29sdmUoKS4uLiIsImluY29ycmVjdCBsdSBzb2x2ZSBjYWxjdWxhdGlvbiIpOwoKICAgICRBID0gbmV3IE1hdHJpeCgkcHZhbHMpOwogICAgJENob2wgPSAkQS0+Y2hvbCgpOwogICAgJEwgPSAkQ2hvbC0+Z2V0TCgpOwogICAgaWYgKCAkdGhpcy0+Y2hlY2tNYXRyaWNlcygkQSwgJEwtPnRpbWVzKCRMLT50cmFuc3Bvc2UoKSkpICkKICAgICAgJHRoaXMtPnRyeV9zdWNjZXNzKCJDaG9sZXNreURlY29tcG9zaXRpb24uLi4iLCIiKTsKICAgIGVsc2UKICAgICAgJGVycm9yQ291bnQgPSAkdGhpcy0+dHJ5X2ZhaWx1cmUoJGVycm9yQ291bnQsIkNob2xlc2t5RGVjb21wb3NpdGlvbi4uLiIsImluY29ycmVjdCBDaG9sZXNreSBkZWNvbXBvc2l0aW9uIGNhbGN1bGF0aW9uIik7CgogICAgJFggPSAkQ2hvbC0+c29sdmUoTWF0cml4OjppZGVudGl0eSgzLDMpKTsKICAgIGlmICggJHRoaXMtPmNoZWNrTWF0cmljZXMoJEEtPnRpbWVzKCRYKSwgTWF0cml4OjppZGVudGl0eSgzLDMpKSApCiAgICAgICR0aGlzLT50cnlfc3VjY2VzcygiQ2hvbGVza3lEZWNvbXBvc2l0aW9uIHNvbHZlKCkuLi4iLCIiKTsKICAgIGVsc2UKICAgICAgJGVycm9yQ291bnQgPSAkdGhpcy0+dHJ5X2ZhaWx1cmUoJGVycm9yQ291bnQsIkNob2xlc2t5RGVjb21wb3NpdGlvbiBzb2x2ZSgpLi4uIiwiaW5jb3JyZWN0IENob2xlc2t5ZGVjb21wb3NpdGlvbiBzb2x2ZSBjYWxjdWxhdGlvbiIpOwoKICAgICRFaWcgPSAkQS0+ZWlnKCk7CiAgICAkRCA9ICRFaWctPmdldEQoKTsKICAgICRWID0gJEVpZy0+Z2V0VigpOwogICAgaWYoICR0aGlzLT5jaGVja01hdHJpY2VzKCRBLT50aW1lcygkViksJFYtPnRpbWVzKCREKSkgKQogICAgICAkdGhpcy0+dHJ5X3N1Y2Nlc3MoIkVpZ2VudmFsdWVEZWNvbXBvc2l0aW9uIChzeW1tZXRyaWMpLi4uIiwiIik7CiAgICBlbHNlCiAgICAgICRlcnJvckNvdW50ID0gJHRoaXMtPnRyeV9mYWlsdXJlKCRlcnJvckNvdW50LCJFaWdlbnZhbHVlRGVjb21wb3NpdGlvbiAoc3ltbWV0cmljKS4uLiIsImluY29ycmVjdCBzeW1tZXRyaWMgRWlnZW52YWx1ZSBkZWNvbXBvc2l0aW9uIGNhbGN1bGF0aW9uIik7CgogICAgJEEgPSBuZXcgTWF0cml4KCRldmFscyk7CiAgICAkRWlnID0gJEEtPmVpZygpOwogICAgJEQgPSAkRWlnLT5nZXREKCk7CiAgICAkViA9ICRFaWctPmdldFYoKTsKICAgIGlmICggJHRoaXMtPmNoZWNrTWF0cmljZXMoJEEtPnRpbWVzKCRWKSwkVi0+dGltZXMoJEQpKSApCiAgICAgICR0aGlzLT50cnlfc3VjY2VzcygiRWlnZW52YWx1ZURlY29tcG9zaXRpb24gKG5vbnN5bW1ldHJpYykuLi4iLCIiKTsKICAgIGVsc2UKICAgICAgJGVycm9yQ291bnQgPSAkdGhpcy0+dHJ5X2ZhaWx1cmUoJGVycm9yQ291bnQsIkVpZ2VudmFsdWVEZWNvbXBvc2l0aW9uIChub25zeW1tZXRyaWMpLi4uIiwiaW5jb3JyZWN0IG5vbnN5bW1ldHJpYyBFaWdlbnZhbHVlIGRlY29tcG9zaXRpb24gY2FsY3VsYXRpb24iKTsKCglwcmludCgiPGI+eyRlcnJvckNvdW50fSB0b3RhbCBlcnJvcnM8L2I+LiIpOwogIH0KCiAgLyoqCiAgKiBQcmludCBhcHByb3ByaWF0ZSBtZXNzYWdlcyBmb3Igc3VjY2Vzc2Z1bCBvdXRjb21lIHRyeQogICogQHBhcmFtIHN0cmluZyAkcwogICogQHBhcmFtIHN0cmluZyAkZQogICovCiAgZnVuY3Rpb24gdHJ5X3N1Y2Nlc3MoJHMsICRlID0gIiIpIHsKICAgIHByaW50ICI+ICIuICRzIC4ic3VjY2VzczxiciAvPiI7CiAgICBpZiAoJGUgIT0gIiIpCiAgICAgIHByaW50ICI+IE1lc3NhZ2U6ICIuICRlIC4iPGJyIC8+IjsKICB9CgogIC8qKgogICogUHJpbnQgYXBwcm9wcmlhdGUgbWVzc2FnZXMgZm9yIHVuc3VjY2Vzc2Z1bCBvdXRjb21lIHRyeQogICogQHBhcmFtIGludCAkY291bnQKICAqIEBwYXJhbSBzdHJpbmcgJHMKICAqIEBwYXJhbSBzdHJpbmcgJGUKICAqIEByZXR1cm4gaW50IGluY3JlbWVudGVkIGNvdW50ZXIKICAqLwogIGZ1bmN0aW9uIHRyeV9mYWlsdXJlKCRjb3VudCwgJHMsICRlPSIiKSB7CiAgICBwcmludCAiPiAiLiAkcyAuIioqKiBmYWlsdXJlICoqKjxiciAvPj4gTWVzc2FnZTogIi4gJGUgLiI8YnIgLz4iOwogICAgcmV0dXJuICsrJGNvdW50OwogIH0KCiAgLyoqCiAgKiBQcmludCBhcHByb3ByaWF0ZSBtZXNzYWdlcyBmb3IgdW5zdWNjZXNzZnVsIG91dGNvbWUgdHJ5CiAgKiBAcGFyYW0gaW50ICRjb3VudAogICogQHBhcmFtIHN0cmluZyAkcwogICogQHBhcmFtIHN0cmluZyAkZQogICogQHJldHVybiBpbnQgaW5jcmVtZW50ZWQgY291bnRlcgogICovCiAgZnVuY3Rpb24gdHJ5X3dhcm5pbmcoJGNvdW50LCAkcywgJGU9IiIpIHsKICAgIHByaW50ICI+ICIuICRzIC4iKioqIHdhcm5pbmcgKioqPGJyIC8+PiBNZXNzYWdlOiAiLiAkZSAuIjxiciAvPiI7CiAgICByZXR1cm4gKyskY291bnQ7CiAgfQoKICAvKioKICAqIENoZWNrIG1hZ25pdHVkZSBvZiBkaWZmZXJlbmNlIG9mICJzY2FsYXJzIi4KICAqIEBwYXJhbSBmbG9hdCAkeAogICogQHBhcmFtIGZsb2F0ICR5CiAgKi8KICBmdW5jdGlvbiBjaGVja1NjYWxhcnMoJHgsICR5KSB7CiAgICAkZXBzID0gcG93KDIuMCwtNTIuMCk7CiAgICBpZiAoJHggPT0gMCAmIGFicygkeSkgPCAxMCokZXBzKSByZXR1cm47CiAgICBpZiAoJHkgPT0gMCAmIGFicygkeCkgPCAxMCokZXBzKSByZXR1cm47CiAgICBpZiAoYWJzKCR4LSR5KSA+IDEwICogJGVwcyAqIG1heChhYnMoJHgpLGFicygkeSkpKQogICAgICByZXR1cm4gZmFsc2U7CiAgICBlbHNlCiAgICAgIHJldHVybiB0cnVlOwogIH0KCiAgLyoqCiAgKiBDaGVjayBub3JtIG9mIGRpZmZlcmVuY2Ugb2YgInZlY3RvcnMiLgogICogQHBhcmFtIGZsb2F0ICR4W10KICAqIEBwYXJhbSBmbG9hdCAkeVtdCiAgKi8KICBmdW5jdGlvbiBjaGVja1ZlY3RvcnMoJHgsICR5KSB7CiAgICAkbnggPSBjb3VudCgkeCk7CiAgICAkbnkgPSBjb3VudCgkeSk7CiAgICBpZiAoJG54ID09ICRueSkKICAgICAgZm9yKCRpPTA7ICRpIDwgJG54OyArKyRpKQogICAgICAgICR0aGlzLT5jaGVja1NjYWxhcnMoJHhbJGldLCR5WyRpXSk7CiAgICBlbHNlCiAgICAgIGRpZSgiQXR0ZW1wdCB0byBjb21wYXJlIHZlY3RvcnMgb2YgZGlmZmVyZW50IGxlbmd0aHMiKTsKICB9CgogIC8qKgogICogQ2hlY2sgbm9ybSBvZiBkaWZmZXJlbmNlIG9mICJhcnJheXMiLgogICogQHBhcmFtIGZsb2F0ICR4W11bXQogICogQHBhcmFtIGZsb2F0ICR5W11bXQogICovCiAgZnVuY3Rpb24gY2hlY2tBcnJheXMoJHgsICR5KSB7CiAgICAkQSA9IG5ldyBNYXRyaXgoJHgpOwogICAgJEIgPSBuZXcgTWF0cml4KCR5KTsKICAgIHJldHVybiAkdGhpcy0+Y2hlY2tNYXRyaWNlcygkQSwkQik7CiAgfQoKICAvKioKICAqIENoZWNrIG5vcm0gb2YgZGlmZmVyZW5jZSBvZiAibWF0cmljZXMiLgogICogQHBhcmFtIG1hdHJpeCAkWAogICogQHBhcmFtIG1hdHJpeCAkWQogICovCiAgZnVuY3Rpb24gY2hlY2tNYXRyaWNlcygkWCA9IG51bGwsICRZID0gbnVsbCkgewogICAgaWYoICRYID09IG51bGwgfHwgJFkgPT0gbnVsbCApCiAgICAgIHJldHVybiBmYWxzZTsKCiAgICAkZXBzID0gcG93KDIuMCwtNTIuMCk7CiAgICBpZiAoJFgtPm5vcm0xKCkgPT0gMC4gJiAkWS0+bm9ybTEoKSA8IDEwKiRlcHMpIHJldHVybiB0cnVlOwogICAgaWYgKCRZLT5ub3JtMSgpID09IDAuICYgJFgtPm5vcm0xKCkgPCAxMCokZXBzKSByZXR1cm4gdHJ1ZTsKCiAgICAkQSA9ICRYLT5taW51cygkWSk7CgogICAgaWYgKCRBLT5ub3JtMSgpID4gMTAwMCAqICRlcHMgKiBtYXgoJFgtPm5vcm0xKCksJFktPm5vcm0xKCkpKQogICAgICBkaWUoIlRoZSBub3JtIG9mIChYLVkpIGlzIHRvbyBsYXJnZTogIi4kQS0+bm9ybTEoKSk7CiAgICBlbHNlCiAgICAgIHJldHVybiB0cnVlOwogIH0KCn0KCiR0ZXN0ID0gbmV3IFRlc3RNYXRyaXg7Cj8+Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Shared/JAMA/utils/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Shared/JAMA/utils/Error.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqCUBwYWNrYWdlIEpBTUEKICoKICoJRXJyb3IgaGFuZGxpbmcKICoJQGF1dGhvciBNaWNoYWVsIEJvbW1hcml0bwogKglAdmVyc2lvbiAwMTI5MjAwNQogKi8KCi8vTGFuZ3VhZ2UgY29uc3RhbnQKZGVmaW5lKCdKQU1BTEFORycsICdFTicpOwoKCi8vQWxsIGVycm9ycyBtYXkgYmUgZGVmaW5lZCBieSB0aGUgZm9sbG93aW5nIGZvcm1hdDoKLy9kZWZpbmUoJ0V4Y2VwdGlvbk5hbWUnLCBOKTsKLy8kZXJyb3JbJ2xhbmcnXVtFeGNlcHRpb25OYW1lXSA9ICdFcnJvciBtZXNzYWdlJzsKJGVycm9yID0gYXJyYXkoKTsKCi8qCkkndmUgdXNlZCBCYWJlbGZpc2ggYW5kIGEgbGl0dGxlIHBvb3Iga25vd2xlZGdlIG9mIFJvbWFuY2UvR2VybWFuaWMgbGFuZ3VhZ2VzIGZvciB0aGUgdHJhbnNsYXRpb25zIGhlcmUuCkZlZWwgZnJlZSB0byBjb3JyZWN0IGFueXRoaW5nIHRoYXQgbG9va3MgYW1pc3MgdG8geW91LgoqLwoKZGVmaW5lKCdQb2x5bW9ycGhpY0FyZ3VtZW50RXhjZXB0aW9uJywgLTEpOwokZXJyb3JbJ0VOJ11bUG9seW1vcnBoaWNBcmd1bWVudEV4Y2VwdGlvbl0gPSAiSW52YWxpZCBhcmd1bWVudCBwYXR0ZXJuIGZvciBwb2x5bW9ycGhpYyBmdW5jdGlvbi4iOwokZXJyb3JbJ0ZSJ11bUG9seW1vcnBoaWNBcmd1bWVudEV4Y2VwdGlvbl0gPSAiTW9kw6hsZSBpbmFkbWlzc2libGUgZCdhcmd1bWVudCBwb3VyIGxhIGZvbmN0aW9uIHBvbHltb3JwaGUuIi4KJGVycm9yWydERSddW1BvbHltb3JwaGljQXJndW1lbnRFeGNlcHRpb25dID0gIlVuenVsw6Rzc2lnZXMgQXJndW1lbnRtdXN0ZXIgZsO8ciBwb2x5bW9ycGhlIEZ1bmt0aW9uLiI7CgpkZWZpbmUoJ0FyZ3VtZW50VHlwZUV4Y2VwdGlvbicsIC0yKTsKJGVycm9yWydFTiddW0FyZ3VtZW50VHlwZUV4Y2VwdGlvbl0gPSAiSW52YWxpZCBhcmd1bWVudCB0eXBlLiI7CiRlcnJvclsnRlInXVtBcmd1bWVudFR5cGVFeGNlcHRpb25dID0gIlR5cGUgaW5hZG1pc3NpYmxlIGQnYXJndW1lbnQuIjsKJGVycm9yWydERSddW0FyZ3VtZW50VHlwZUV4Y2VwdGlvbl0gPSAiVW56dWzDpHNzaWdlIEFyZ3VtZW50YXJ0LiI7CgpkZWZpbmUoJ0FyZ3VtZW50Qm91bmRzRXhjZXB0aW9uJywgLTMpOwokZXJyb3JbJ0VOJ11bQXJndW1lbnRCb3VuZHNFeGNlcHRpb25dID0gIkludmFsaWQgYXJndW1lbnQgcmFuZ2UuIjsKJGVycm9yWydGUiddW0FyZ3VtZW50Qm91bmRzRXhjZXB0aW9uXSA9ICJHYW1tZSBpbmFkbWlzc2libGUgZCdhcmd1bWVudC4iOwokZXJyb3JbJ0RFJ11bQXJndW1lbnRCb3VuZHNFeGNlcHRpb25dID0gIlVuenVsw6Rzc2lnZSBBcmd1bWVudHN0cmVja2UuIjsKCmRlZmluZSgnTWF0cml4RGltZW5zaW9uRXhjZXB0aW9uJywgLTQpOwokZXJyb3JbJ0VOJ11bTWF0cml4RGltZW5zaW9uRXhjZXB0aW9uXSA9ICJNYXRyaXggZGltZW5zaW9ucyBhcmUgbm90IGVxdWFsLiI7CiRlcnJvclsnRlInXVtNYXRyaXhEaW1lbnNpb25FeGNlcHRpb25dID0gIkxlcyBkaW1lbnNpb25zIGRlIE1hdHJpeCBuZSBzb250IHBhcyDDqWdhbGVzLiI7CiRlcnJvclsnREUnXVtNYXRyaXhEaW1lbnNpb25FeGNlcHRpb25dID0gIk1hdHJpeG1hw59lIHNpbmQgbmljaHQgZ2xlaWNoLiI7CgpkZWZpbmUoJ1ByZWNpc2lvbkxvc3NFeGNlcHRpb24nLCAtNSk7CiRlcnJvclsnRU4nXVtQcmVjaXNpb25Mb3NzRXhjZXB0aW9uXSA9ICJTaWduaWZpY2FudCBwcmVjaXNpb24gbG9zcyBkZXRlY3RlZC4iOwokZXJyb3JbJ0ZSJ11bUHJlY2lzaW9uTG9zc0V4Y2VwdGlvbl0gPSAiUGVydGUgc2lnbmlmaWNhdGl2ZSBkZSBwcsOpY2lzaW9uIGTDqXRlY3TDqWUuIjsKJGVycm9yWydERSddW1ByZWNpc2lvbkxvc3NFeGNlcHRpb25dID0gIkJlZGV1dGVuZGVyIFByw6R6aXNpb24gVmVybHVzdCBlcm1pdHRlbHRlLiI7CgpkZWZpbmUoJ01hdHJpeFNQREV4Y2VwdGlvbicsIC02KTsKJGVycm9yWydFTiddW01hdHJpeFNQREV4Y2VwdGlvbl0gPSAiQ2FuIG9ubHkgcGVyZm9ybSBvcGVyYXRpb24gb24gc3ltbWV0cmljIHBvc2l0aXZlIGRlZmluaXRlIG1hdHJpeC4iOwokZXJyb3JbJ0ZSJ11bTWF0cml4U1BERXhjZXB0aW9uXSA9ICJQZXJ0ZSBzaWduaWZpY2F0aXZlIGRlIHByw6ljaXNpb24gZMOpdGVjdMOpZS4iOwokZXJyb3JbJ0RFJ11bTWF0cml4U1BERXhjZXB0aW9uXSA9ICJCZWRldXRlbmRlciBQcsOkemlzaW9uIFZlcmx1c3QgZXJtaXR0ZWx0ZS4iOwoKZGVmaW5lKCdNYXRyaXhTaW5ndWxhckV4Y2VwdGlvbicsIC03KTsKJGVycm9yWydFTiddW01hdHJpeFNpbmd1bGFyRXhjZXB0aW9uXSA9ICJDYW4gb25seSBwZXJmb3JtIG9wZXJhdGlvbiBvbiBzaW5ndWxhciBtYXRyaXguIjsKCmRlZmluZSgnTWF0cml4UmFua0V4Y2VwdGlvbicsIC04KTsKJGVycm9yWydFTiddW01hdHJpeFJhbmtFeGNlcHRpb25dID0gIkNhbiBvbmx5IHBlcmZvcm0gb3BlcmF0aW9uIG9uIGZ1bGwtcmFuayBtYXRyaXguIjsKCmRlZmluZSgnQXJyYXlMZW5ndGhFeGNlcHRpb24nLCAtOSk7CiRlcnJvclsnRU4nXVtBcnJheUxlbmd0aEV4Y2VwdGlvbl0gPSAiQXJyYXkgbGVuZ3RoIG11c3QgYmUgYSBtdWx0aXBsZSBvZiBtLiI7CgpkZWZpbmUoJ1Jvd0xlbmd0aEV4Y2VwdGlvbicsIC0xMCk7CiRlcnJvclsnRU4nXVtSb3dMZW5ndGhFeGNlcHRpb25dID0gIkFsbCByb3dzIG11c3QgaGF2ZSB0aGUgc2FtZSBsZW5ndGguIjsKCi8qKgogKglDdXN0b20gZXJyb3IgaGFuZGxlcgogKglAcGFyYW0gaW50ICRudW0gRXJyb3IgbnVtYmVyCiAqLwpmdW5jdGlvbiBKQU1BRXJyb3IoJGVycm9yTnVtYmVyID0gbnVsbCkgewoJZ2xvYmFsICRlcnJvcjsKCglpZiAoaXNzZXQoJGVycm9yTnVtYmVyKSkgewoJCWlmIChpc3NldCgkZXJyb3JbSkFNQUxBTkddWyRlcnJvck51bWJlcl0pKSB7CgkJCXJldHVybiAkZXJyb3JbSkFNQUxBTkddWyRlcnJvck51bWJlcl07CgkJfSBlbHNlIHsKCQkJcmV0dXJuICRlcnJvclsnRU4nXVskZXJyb3JOdW1iZXJdOwoJCX0KCX0gZWxzZSB7CgkJcmV0dXJuICgiSW52YWxpZCBhcmd1bWVudCB0byBKQU1BRXJyb3IoKSIpOwoJfQp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Shared/JAMA/utils/Maths.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqCUBwYWNrYWdlIEpBTUEKICoKICoJUHl0aGFnb3JlYW4gVGhlb3JlbToKICoKICoJYSA9IDMKICoJYiA9IDQKICoJciA9IHNxcnQoc3F1YXJlKGEpICsgc3F1YXJlKGIpKQogKglyID0gNQogKgogKglyID0gc3FydChhXjIgKyBiXjIpIHdpdGhvdXQgdW5kZXIvb3ZlcmZsb3cuCiAqLwpmdW5jdGlvbiBoeXBvKCRhLCAkYikgewoJaWYgKGFicygkYSkgPiBhYnMoJGIpKSB7CgkJJHIgPSAkYiAvICRhOwoJCSRyID0gYWJzKCRhKSAqIHNxcnQoMSArICRyICogJHIpOwoJfSBlbHNlaWYgKCRiICE9IDApIHsKCQkkciA9ICRhIC8gJGI7CgkJJHIgPSBhYnMoJGIpICogc3FydCgxICsgJHIgKiAkcik7Cgl9IGVsc2UgewoJCSRyID0gMC4wOwoJfQoJcmV0dXJuICRyOwp9CS8vCWZ1bmN0aW9uIGh5cG8oKQoKCi8qKgogKglNaWtlIEJvbW1hcml0bydzIHZlcnNpb24uCiAqCUNvbXB1dGUgbi1kaW1lbnNpb25hbCBoeW90aGVuZXVzZS4KICoKZnVuY3Rpb24gaHlwb3QoKSB7CgkkcyA9IDA7Cglmb3JlYWNoIChmdW5jX2dldF9hcmdzKCkgYXMgJGQpIHsKCQlpZiAoaXNfbnVtZXJpYygkZCkpIHsKCQkJJHMgKz0gcG93KCRkLCAyKTsKCQl9IGVsc2UgewoJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKEpBTUFFcnJvcihBcmd1bWVudFR5cGVFeGNlcHRpb24pKTsKCQl9Cgl9CglyZXR1cm4gc3FydCgkcyk7Cn0KKi8K]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Shared/OLE.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyogdmltOiBzZXQgZXhwYW5kdGFiIHRhYnN0b3A9NCBzaGlmdHdpZHRoPTQ6ICovCi8vICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwovLyB8IFBIUCBWZXJzaW9uIDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLy8gKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi8vIHwgQ29weXJpZ2h0IChjKSAxOTk3LTIwMDIgVGhlIFBIUCBHcm91cCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAovLyArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLy8gfCBUaGlzIHNvdXJjZSBmaWxlIGlzIHN1YmplY3QgdG8gdmVyc2lvbiAyLjAyIG9mIHRoZSBQSFAgbGljZW5zZSwgICAgICB8Ci8vIHwgdGhhdCBpcyBidW5kbGVkIHdpdGggdGhpcyBwYWNrYWdlIGluIHRoZSBmaWxlIExJQ0VOU0UsIGFuZCBpcyAgICAgICAgfAovLyB8IGF2YWlsYWJsZSBhdCB0aHJvdWdoIHRoZSB3b3JsZC13aWRlLXdlYiBhdCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLy8gfCBodHRwOi8vd3d3LnBocC5uZXQvbGljZW5zZS8yXzAyLnR4dC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci8vIHwgSWYgeW91IGRpZCBub3QgcmVjZWl2ZSBhIGNvcHkgb2YgdGhlIFBIUCBsaWNlbnNlIGFuZCBhcmUgdW5hYmxlIHRvICAgfAovLyB8IG9idGFpbiBpdCB0aHJvdWdoIHRoZSB3b3JsZC13aWRlLXdlYiwgcGxlYXNlIHNlbmQgYSBub3RlIHRvICAgICAgICAgIHwKLy8gfCBsaWNlbnNlQHBocC5uZXQgc28gd2UgY2FuIG1haWwgeW91IGEgY29weSBpbW1lZGlhdGVseS4gICAgICAgICAgICAgICB8Ci8vICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwovLyB8IEF1dGhvcjogWGF2aWVyIE5vZ3VlciA8eG5vZ3VlckBwaHAubmV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLy8gfCBCYXNlZCBvbiBPTEU6OlN0b3JhZ2VfTGl0ZSBieSBLYXdhaSwgVGFrYW5vcmkgICAgICAgICAgICAgICAgICAgICAgICB8Ci8vICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwovLwovLyAkSWQ6IE9MRS5waHAsdiAxLjEzIDIwMDcvMDMvMDcgMTQ6Mzg6MjUgc2NobWlkdCBFeHAgJAoKCi8qKgoqIEFycmF5IGZvciBzdG9yaW5nIE9MRSBpbnN0YW5jZXMgdGhhdCBhcmUgYWNjZXNzZWQgZnJvbQoqIE9MRV9DaGFpbmVkQmxvY2tTdHJlYW06OnN0cmVhbV9vcGVuKCkuCiogQHZhciAgYXJyYXkKKi8KJEdMT0JBTFNbJ19PTEVfSU5TVEFOQ0VTJ10gPSBhcnJheSgpOwoKLyoqCiogT0xFIHBhY2thZ2UgYmFzZSBjbGFzcy4KKgoqIEBhdXRob3IgICBYYXZpZXIgTm9ndWVyIDx4bm9ndWVyQHBocC5uZXQ+CiogQGF1dGhvciAgIENocmlzdGlhbiBTY2htaWR0IDxzY2htaWR0QHBocC5uZXQ+CiogQGNhdGVnb3J5ICAgUEhQRXhjZWwKKiBAcGFja2FnZSAgICBQSFBFeGNlbF9TaGFyZWRfT0xFCiovCmNsYXNzIFBIUEV4Y2VsX1NoYXJlZF9PTEUKewoJY29uc3QgT0xFX1BQU19UWVBFX1JPT1QgICA9ICAgICAgNTsKCWNvbnN0IE9MRV9QUFNfVFlQRV9ESVIgICAgPSAgICAgIDE7Cgljb25zdCBPTEVfUFBTX1RZUEVfRklMRSAgID0gICAgICAyOwoJY29uc3QgT0xFX0RBVEFfU0laRV9TTUFMTCA9IDB4MTAwMDsKCWNvbnN0IE9MRV9MT05HX0lOVF9TSVpFICAgPSAgICAgIDQ7Cgljb25zdCBPTEVfUFBTX1NJWkUgICAgICAgID0gICAweDgwOwoKCS8qKgoJICogVGhlIGZpbGUgaGFuZGxlIGZvciByZWFkaW5nIGFuIE9MRSBjb250YWluZXIKCSAqIEB2YXIgcmVzb3VyY2UKCSovCglwdWJsaWMgJF9maWxlX2hhbmRsZTsKCgkvKioKCSogQXJyYXkgb2YgUFBTJ3MgZm91bmQgb24gdGhlIE9MRSBjb250YWluZXIKCSogQHZhciBhcnJheQoJKi8KCXB1YmxpYyAkX2xpc3QgPSBhcnJheSgpOwoKCS8qKgoJICogUm9vdCBkaXJlY3Rvcnkgb2YgT0xFIGNvbnRhaW5lcgoJICogQHZhciBPTEVfUFBTX1Jvb3QKCSovCglwdWJsaWMgJHJvb3Q7CgoJLyoqCgkgKiBCaWcgQmxvY2sgQWxsb2NhdGlvbiBUYWJsZQoJICogQHZhciBhcnJheSAgKGJsb2NrSWQgPT4gbmV4dEJsb2NrSWQpCgkqLwoJcHVibGljICRiYmF0OwoKCS8qKgoJICogU2hvcnQgQmxvY2sgQWxsb2NhdGlvbiBUYWJsZQoJICogQHZhciBhcnJheSAgKGJsb2NrSWQgPT4gbmV4dEJsb2NrSWQpCgkqLwoJcHVibGljICRzYmF0OwoKCS8qKgoJICogU2l6ZSBvZiBiaWcgYmxvY2tzLiBUaGlzIGlzIHVzdWFsbHkgNTEyLgoJICogQHZhciAgaW50ICBudW1iZXIgb2Ygb2N0ZXRzIHBlciBibG9jay4KCSovCglwdWJsaWMgJGJpZ0Jsb2NrU2l6ZTsKCgkvKioKCSAqIFNpemUgb2Ygc21hbGwgYmxvY2tzLiBUaGlzIGlzIHVzdWFsbHkgNjQuCgkgKiBAdmFyICBpbnQgIG51bWJlciBvZiBvY3RldHMgcGVyIGJsb2NrCgkqLwoJcHVibGljICRzbWFsbEJsb2NrU2l6ZTsKCgkvKioKCSAqIFJlYWRzIGFuIE9MRSBjb250YWluZXIgZnJvbSB0aGUgY29udGVudHMgb2YgdGhlIGZpbGUgZ2l2ZW4uCgkgKgoJICogQGFjY2VzIHB1YmxpYwoJICogQHBhcmFtIHN0cmluZyAkZmlsZQoJICogQHJldHVybiBtaXhlZCB0cnVlIG9uIHN1Y2Nlc3MsIFBFQVJfRXJyb3Igb24gZmFpbHVyZQoJKi8KCXB1YmxpYyBmdW5jdGlvbiByZWFkKCRmaWxlKQoJewoJCSRmaCA9IGZvcGVuKCRmaWxlLCAiciIpOwoJCWlmICghJGZoKSB7CgkJCXRocm93IG5ldyBFeGNlcHRpb24oIkNhbid0IG9wZW4gZmlsZSAkZmlsZSIpOwoJCX0KCQkkdGhpcy0+X2ZpbGVfaGFuZGxlID0gJGZoOwoKCQkkc2lnbmF0dXJlID0gZnJlYWQoJGZoLCA4KTsKCQlpZiAoIlx4RDBceENGXHgxMVx4RTBceEExXHhCMVx4MUFceEUxIiAhPSAkc2lnbmF0dXJlKSB7CgkJCXRocm93IG5ldyBFeGNlcHRpb24oIkZpbGUgZG9lc24ndCBzZWVtIHRvIGJlIGFuIE9MRSBjb250YWluZXIuIik7CgkJfQoJCWZzZWVrKCRmaCwgMjgpOwoJCWlmIChmcmVhZCgkZmgsIDIpICE9ICJceEZFXHhGRiIpIHsKCQkJLy8gVGhpcyBzaG91bGRuJ3QgYmUgYSBwcm9ibGVtIGluIHByYWN0aWNlCgkJCXRocm93IG5ldyBFeGNlcHRpb24oIk9ubHkgTGl0dGxlLUVuZGlhbiBlbmNvZGluZyBpcyBzdXBwb3J0ZWQuIik7CgkJfQoJCS8vIFNpemUgb2YgYmxvY2tzIGFuZCBzaG9ydCBibG9ja3MgaW4gYnl0ZXMKCQkkdGhpcy0+YmlnQmxvY2tTaXplID0gcG93KDIsIHNlbGY6Ol9yZWFkSW50MigkZmgpKTsKCQkkdGhpcy0+c21hbGxCbG9ja1NpemUgID0gcG93KDIsIHNlbGY6Ol9yZWFkSW50MigkZmgpKTsKCgkJLy8gU2tpcCBVSUQsIHJldmlzaW9uIG51bWJlciBhbmQgdmVyc2lvbiBudW1iZXIKCQlmc2VlaygkZmgsIDQ0KTsKCQkvLyBOdW1iZXIgb2YgYmxvY2tzIGluIEJpZyBCbG9jayBBbGxvY2F0aW9uIFRhYmxlCgkJJGJiYXRCbG9ja0NvdW50ID0gc2VsZjo6X3JlYWRJbnQ0KCRmaCk7CgoJCS8vIFJvb3QgY2hhaW4gMXN0IGJsb2NrCgkJJGRpcmVjdG9yeUZpcnN0QmxvY2tJZCA9IHNlbGY6Ol9yZWFkSW50NCgkZmgpOwoKCQkvLyBTa2lwIHVudXNlZCBieXRlcwoJCWZzZWVrKCRmaCwgNTYpOwoJCS8vIFN0cmVhbXMgc2hvcnRlciB0aGFuIHRoaXMgYXJlIHN0b3JlZCB1c2luZyBzbWFsbCBibG9ja3MKCQkkdGhpcy0+YmlnQmxvY2tUaHJlc2hvbGQgPSBzZWxmOjpfcmVhZEludDQoJGZoKTsKCQkvLyBCbG9jayBpZCBvZiBmaXJzdCBzZWN0b3IgaW4gU2hvcnQgQmxvY2sgQWxsb2NhdGlvbiBUYWJsZQoJCSRzYmF0Rmlyc3RCbG9ja0lkID0gc2VsZjo6X3JlYWRJbnQ0KCRmaCk7CgkJLy8gTnVtYmVyIG9mIGJsb2NrcyBpbiBTaG9ydCBCbG9jayBBbGxvY2F0aW9uIFRhYmxlCgkJJHNiYmF0QmxvY2tDb3VudCA9IHNlbGY6Ol9yZWFkSW50NCgkZmgpOwoJCS8vIEJsb2NrIGlkIG9mIGZpcnN0IHNlY3RvciBpbiBNYXN0ZXIgQmxvY2sgQWxsb2NhdGlvbiBUYWJsZQoJCSRtYmF0Rmlyc3RCbG9ja0lkID0gc2VsZjo6X3JlYWRJbnQ0KCRmaCk7CgkJLy8gTnVtYmVyIG9mIGJsb2NrcyBpbiBNYXN0ZXIgQmxvY2sgQWxsb2NhdGlvbiBUYWJsZQoJCSRtYmJhdEJsb2NrQ291bnQgPSBzZWxmOjpfcmVhZEludDQoJGZoKTsKCQkkdGhpcy0+YmJhdCA9IGFycmF5KCk7CgoJCS8vIFJlbWFpbmluZyA0ICogMTA5IGJ5dGVzIG9mIGN1cnJlbnQgYmxvY2sgaXMgYmVnaW5uaW5nIG9mIE1hc3RlcgoJCS8vIEJsb2NrIEFsbG9jYXRpb24gVGFibGUKCQkkbWJhdEJsb2NrcyA9IGFycmF5KCk7CgkJZm9yICgkaSA9IDA7ICRpIDwgMTA5OyArKyRpKSB7CgkJCSRtYmF0QmxvY2tzW10gPSBzZWxmOjpfcmVhZEludDQoJGZoKTsKCQl9CgoJCS8vIFJlYWQgcmVzdCBvZiBNYXN0ZXIgQmxvY2sgQWxsb2NhdGlvbiBUYWJsZSAoaWYgYW55IGlzIGxlZnQpCgkJJHBvcyA9ICR0aGlzLT5fZ2V0QmxvY2tPZmZzZXQoJG1iYXRGaXJzdEJsb2NrSWQpOwoJCWZvciAoJGkgPSAwOyAkaSA8ICRtYmJhdEJsb2NrQ291bnQ7ICsrJGkpIHsKCQkJZnNlZWsoJGZoLCAkcG9zKTsKCQkJZm9yICgkaiA9IDA7ICRqIDwgJHRoaXMtPmJpZ0Jsb2NrU2l6ZSAvIDQgLSAxOyArKyRqKSB7CgkJCQkkbWJhdEJsb2Nrc1tdID0gc2VsZjo6X3JlYWRJbnQ0KCRmaCk7CgkJCX0KCQkJLy8gTGFzdCBibG9jayBpZCBpbiBlYWNoIGJsb2NrIHBvaW50cyB0byBuZXh0IGJsb2NrCgkJCSRwb3MgPSAkdGhpcy0+X2dldEJsb2NrT2Zmc2V0KHNlbGY6Ol9yZWFkSW50NCgkZmgpKTsKCQl9CgoJCS8vIFJlYWQgQmlnIEJsb2NrIEFsbG9jYXRpb24gVGFibGUgYWNjb3JkaW5nIHRvIGNoYWluIHNwZWNpZmllZCBieQoJCS8vICRtYmF0QmxvY2tzCgkJZm9yICgkaSA9IDA7ICRpIDwgJGJiYXRCbG9ja0NvdW50OyArKyRpKSB7CgkJCSRwb3MgPSAkdGhpcy0+X2dldEJsb2NrT2Zmc2V0KCRtYmF0QmxvY2tzWyRpXSk7CgkJCWZzZWVrKCRmaCwgJHBvcyk7CgkJCWZvciAoJGogPSAwIDsgJGogPCAkdGhpcy0+YmlnQmxvY2tTaXplIC8gNDsgKyskaikgewoJCQkJJHRoaXMtPmJiYXRbXSA9IHNlbGY6Ol9yZWFkSW50NCgkZmgpOwoJCQl9CgkJfQoKCQkvLyBSZWFkIHNob3J0IGJsb2NrIGFsbG9jYXRpb24gdGFibGUgKFNCQVQpCgkJJHRoaXMtPnNiYXQgPSBhcnJheSgpOwoJCSRzaG9ydEJsb2NrQ291bnQgPSAkc2JiYXRCbG9ja0NvdW50ICogJHRoaXMtPmJpZ0Jsb2NrU2l6ZSAvIDQ7CgkJJHNiYXRGaCA9ICR0aGlzLT5nZXRTdHJlYW0oJHNiYXRGaXJzdEJsb2NrSWQpOwoJCWZvciAoJGJsb2NrSWQgPSAwOyAkYmxvY2tJZCA8ICRzaG9ydEJsb2NrQ291bnQ7ICsrJGJsb2NrSWQpIHsKCQkJJHRoaXMtPnNiYXRbJGJsb2NrSWRdID0gc2VsZjo6X3JlYWRJbnQ0KCRzYmF0RmgpOwoJCX0KCQlmY2xvc2UoJHNiYXRGaCk7CgoJCSR0aGlzLT5fcmVhZFBwc1drcygkZGlyZWN0b3J5Rmlyc3RCbG9ja0lkKTsKCgkJcmV0dXJuIHRydWU7Cgl9CgoJLyoqCgkgKiBAcGFyYW0gIGludCAgYmxvY2sgaWQKCSAqIEBwYXJhbSAgaW50ICBieXRlIG9mZnNldCBmcm9tIGJlZ2lubmluZyBvZiBmaWxlCgkgKiBAYWNjZXNzIHB1YmxpYwoJICovCglwdWJsaWMgZnVuY3Rpb24gX2dldEJsb2NrT2Zmc2V0KCRibG9ja0lkKQoJewoJCXJldHVybiA1MTIgKyAkYmxvY2tJZCAqICR0aGlzLT5iaWdCbG9ja1NpemU7Cgl9CgoJLyoqCgkqIFJldHVybnMgYSBzdHJlYW0gZm9yIHVzZSB3aXRoIGZyZWFkKCkgZXRjLiBFeHRlcm5hbCBjYWxsZXJzIHNob3VsZAoJKiB1c2UgUEhQRXhjZWxfU2hhcmVkX09MRV9QUFNfRmlsZTo6Z2V0U3RyZWFtKCkuCgkqIEBwYXJhbSAgIGludHxQUFMgICBibG9jayBpZCBvciBQUFMKCSogQHJldHVybiAgcmVzb3VyY2UgIHJlYWQtb25seSBzdHJlYW0KCSovCglwdWJsaWMgZnVuY3Rpb24gZ2V0U3RyZWFtKCRibG9ja0lkT3JQcHMpCgl7CgkJc3RhdGljICRpc1JlZ2lzdGVyZWQgPSBmYWxzZTsKCQlpZiAoISRpc1JlZ2lzdGVyZWQpIHsKCQkJc3RyZWFtX3dyYXBwZXJfcmVnaXN0ZXIoJ29sZS1jaGFpbmVkYmxvY2tzdHJlYW0nLAoJCQkJJ1BIUEV4Y2VsX1NoYXJlZF9PTEVfQ2hhaW5lZEJsb2NrU3RyZWFtJyk7CgkJCSRpc1JlZ2lzdGVyZWQgPSB0cnVlOwoJCX0KCgkJLy8gU3RvcmUgY3VycmVudCBpbnN0YW5jZSBpbiBnbG9iYWwgYXJyYXksIHNvIHRoYXQgaXQgY2FuIGJlIGFjY2Vzc2VkCgkJLy8gaW4gT0xFX0NoYWluZWRCbG9ja1N0cmVhbTo6c3RyZWFtX29wZW4oKS4KCQkvLyBPYmplY3QgaXMgcmVtb3ZlZCBmcm9tIHNlbGY6OiRpbnN0YW5jZXMgaW4gT0xFX1N0cmVhbTo6Y2xvc2UoKS4KCQkkR0xPQkFMU1snX09MRV9JTlNUQU5DRVMnXVtdID0gJHRoaXM7CgkJJGluc3RhbmNlSWQgPSBlbmQoYXJyYXlfa2V5cygkR0xPQkFMU1snX09MRV9JTlNUQU5DRVMnXSkpOwoKCQkkcGF0aCA9ICdvbGUtY2hhaW5lZGJsb2Nrc3RyZWFtOi8vb2xlSW5zdGFuY2VJZD0nIC4gJGluc3RhbmNlSWQ7CgkJaWYgKCRibG9ja0lkT3JQcHMgaW5zdGFuY2VvZiBQSFBFeGNlbF9TaGFyZWRfT0xFX1BQUykgewoJCQkkcGF0aCAuPSAnJmJsb2NrSWQ9JyAuICRibG9ja0lkT3JQcHMtPl9TdGFydEJsb2NrOwoJCQkkcGF0aCAuPSAnJnNpemU9JyAuICRibG9ja0lkT3JQcHMtPlNpemU7CgkJfSBlbHNlIHsKCQkJJHBhdGggLj0gJyZibG9ja0lkPScgLiAkYmxvY2tJZE9yUHBzOwoJCX0KCQlyZXR1cm4gZm9wZW4oJHBhdGgsICdyJyk7Cgl9CgoJLyoqCgkgKiBSZWFkcyBhIHNpZ25lZCBjaGFyLgoJICogQHBhcmFtICAgcmVzb3VyY2UgIGZpbGUgaGFuZGxlCgkgKiBAcmV0dXJuICBpbnQKCSAqIEBhY2Nlc3MgcHVibGljCgkgKi8KCXByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIF9yZWFkSW50MSgkZmgpCgl7CgkJbGlzdCgsICR0bXApID0gdW5wYWNrKCJjIiwgZnJlYWQoJGZoLCAxKSk7CgkJcmV0dXJuICR0bXA7Cgl9CgoJLyoqCgkgKiBSZWFkcyBhbiB1bnNpZ25lZCBzaG9ydCAoMiBvY3RldHMpLgoJICogQHBhcmFtICAgcmVzb3VyY2UgIGZpbGUgaGFuZGxlCgkgKiBAcmV0dXJuICBpbnQKCSAqIEBhY2Nlc3MgcHVibGljCgkgKi8KCXByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIF9yZWFkSW50MigkZmgpCgl7CgkJbGlzdCgsICR0bXApID0gdW5wYWNrKCJ2IiwgZnJlYWQoJGZoLCAyKSk7CgkJcmV0dXJuICR0bXA7Cgl9CgoJLyoqCgkgKiBSZWFkcyBhbiB1bnNpZ25lZCBsb25nICg0IG9jdGV0cykuCgkgKiBAcGFyYW0gICByZXNvdXJjZSAgZmlsZSBoYW5kbGUKCSAqIEByZXR1cm4gIGludAoJICogQGFjY2VzcyBwdWJsaWMKCSAqLwoJcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gX3JlYWRJbnQ0KCRmaCkKCXsKCQlsaXN0KCwgJHRtcCkgPSB1bnBhY2soIlYiLCBmcmVhZCgkZmgsIDQpKTsKCQlyZXR1cm4gJHRtcDsKCX0KCgkvKioKCSogR2V0cyBpbmZvcm1hdGlvbiBhYm91dCBhbGwgUFBTJ3Mgb24gdGhlIE9MRSBjb250YWluZXIgZnJvbSB0aGUgUFBTIFdLJ3MKCSogY3JlYXRlcyBhbiBPTEVfUFBTIG9iamVjdCBmb3IgZWFjaCBvbmUuCgkqCgkqIEBhY2Nlc3MgcHVibGljCgkqIEBwYXJhbSAgaW50ZWdlciAgdGhlIGJsb2NrIGlkIG9mIHRoZSBmaXJzdCBibG9jawoJKiBAcmV0dXJuIG1peGVkIHRydWUgb24gc3VjY2VzcywgUEVBUl9FcnJvciBvbiBmYWlsdXJlCgkqLwoJcHVibGljIGZ1bmN0aW9uIF9yZWFkUHBzV2tzKCRibG9ja0lkKQoJewoJCSRmaCA9ICR0aGlzLT5nZXRTdHJlYW0oJGJsb2NrSWQpOwoJCWZvciAoJHBvcyA9IDA7IDsgJHBvcyArPSAxMjgpIHsKCQkJZnNlZWsoJGZoLCAkcG9zLCBTRUVLX1NFVCk7CgkJCSRuYW1lVXRmMTYgPSBmcmVhZCgkZmgsIDY0KTsKCQkJJG5hbWVMZW5ndGggPSBzZWxmOjpfcmVhZEludDIoJGZoKTsKCQkJJG5hbWVVdGYxNiA9IHN1YnN0cigkbmFtZVV0ZjE2LCAwLCAkbmFtZUxlbmd0aCAtIDIpOwoJCQkvLyBTaW1wbGUgY29udmVyc2lvbiBmcm9tIFVURi0xNkxFIHRvIElTTy04ODU5LTEKCQkJJG5hbWUgPSBzdHJfcmVwbGFjZSgiXHgwMCIsICIiLCAkbmFtZVV0ZjE2KTsKCQkJJHR5cGUgPSBzZWxmOjpfcmVhZEludDEoJGZoKTsKCQkJc3dpdGNoICgkdHlwZSkgewoJCQljYXNlIHNlbGY6Ok9MRV9QUFNfVFlQRV9ST09UOgoJCQkJJHBwcyA9IG5ldyBQSFBFeGNlbF9TaGFyZWRfT0xFX1BQU19Sb290KG51bGwsIG51bGwsIGFycmF5KCkpOwoJCQkJJHRoaXMtPnJvb3QgPSAkcHBzOwoJCQkJYnJlYWs7CgkJCWNhc2Ugc2VsZjo6T0xFX1BQU19UWVBFX0RJUjoKCQkJCSRwcHMgPSBuZXcgUEhQRXhjZWxfU2hhcmVkX09MRV9QUFMobnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwKCQkJCQkJCQkgICBudWxsLCBudWxsLCBudWxsLCBudWxsLCBhcnJheSgpKTsKCQkJCWJyZWFrOwoJCQljYXNlIHNlbGY6Ok9MRV9QUFNfVFlQRV9GSUxFOgoJCQkJJHBwcyA9IG5ldyBQSFBFeGNlbF9TaGFyZWRfT0xFX1BQU19GaWxlKCRuYW1lKTsKCQkJCWJyZWFrOwoJCQlkZWZhdWx0OgoJCQkJY29udGludWU7CgkJCX0KCQkJZnNlZWsoJGZoLCAxLCBTRUVLX0NVUik7CgkJCSRwcHMtPlR5cGUgICAgPSAkdHlwZTsKCQkJJHBwcy0+TmFtZSAgICA9ICRuYW1lOwoJCQkkcHBzLT5QcmV2UHBzID0gc2VsZjo6X3JlYWRJbnQ0KCRmaCk7CgkJCSRwcHMtPk5leHRQcHMgPSBzZWxmOjpfcmVhZEludDQoJGZoKTsKCQkJJHBwcy0+RGlyUHBzICA9IHNlbGY6Ol9yZWFkSW50NCgkZmgpOwoJCQlmc2VlaygkZmgsIDIwLCBTRUVLX0NVUik7CgkJCSRwcHMtPlRpbWUxc3QgPSBzZWxmOjpPTEUyTG9jYWxEYXRlKGZyZWFkKCRmaCwgOCkpOwoJCQkkcHBzLT5UaW1lMm5kID0gc2VsZjo6T0xFMkxvY2FsRGF0ZShmcmVhZCgkZmgsIDgpKTsKCQkJJHBwcy0+X1N0YXJ0QmxvY2sgPSBzZWxmOjpfcmVhZEludDQoJGZoKTsKCQkJJHBwcy0+U2l6ZSA9IHNlbGY6Ol9yZWFkSW50NCgkZmgpOwoJCQkkcHBzLT5ObyA9IGNvdW50KCR0aGlzLT5fbGlzdCk7CgkJCSR0aGlzLT5fbGlzdFtdID0gJHBwczsKCgkJCS8vIGNoZWNrIGlmIHRoZSBQUFMgdHJlZSAoc3RhcnRpbmcgZnJvbSByb290KSBpcyBjb21wbGV0ZQoJCQlpZiAoaXNzZXQoJHRoaXMtPnJvb3QpICYmCgkJCQkkdGhpcy0+X3Bwc1RyZWVDb21wbGV0ZSgkdGhpcy0+cm9vdC0+Tm8pKSB7CgoJCQkJYnJlYWs7CgkJCX0KCQl9CgkJZmNsb3NlKCRmaCk7CgoJCS8vIEluaXRpYWxpemUgJHBwcy0+Y2hpbGRyZW4gb24gZGlyZWN0b3JpZXMKCQlmb3JlYWNoICgkdGhpcy0+X2xpc3QgYXMgJHBwcykgewoJCQlpZiAoJHBwcy0+VHlwZSA9PSBzZWxmOjpPTEVfUFBTX1RZUEVfRElSIHx8ICRwcHMtPlR5cGUgPT0gc2VsZjo6T0xFX1BQU19UWVBFX1JPT1QpIHsKCQkJCSRub3MgPSBhcnJheSgkcHBzLT5EaXJQcHMpOwoJCQkJJHBwcy0+Y2hpbGRyZW4gPSBhcnJheSgpOwoJCQkJd2hpbGUgKCRub3MpIHsKCQkJCQkkbm8gPSBhcnJheV9wb3AoJG5vcyk7CgkJCQkJaWYgKCRubyAhPSAtMSkgewoJCQkJCQkkY2hpbGRQcHMgPSAkdGhpcy0+X2xpc3RbJG5vXTsKCQkJCQkJJG5vc1tdID0gJGNoaWxkUHBzLT5QcmV2UHBzOwoJCQkJCQkkbm9zW10gPSAkY2hpbGRQcHMtPk5leHRQcHM7CgkJCQkJCSRwcHMtPmNoaWxkcmVuW10gPSAkY2hpbGRQcHM7CgkJCQkJfQoJCQkJfQoJCQl9CgkJfQoKCQlyZXR1cm4gdHJ1ZTsKCX0KCgkvKioKCSogSXQgY2hlY2tzIHdoZXRoZXIgdGhlIFBQUyB0cmVlIGlzIGNvbXBsZXRlIChhbGwgUFBTJ3MgcmVhZCkKCSogc3RhcnRpbmcgd2l0aCB0aGUgZ2l2ZW4gUFBTIChub3QgbmVjZXNzYXJpbHkgcm9vdCkKCSoKCSogQGFjY2VzcyBwdWJsaWMKCSogQHBhcmFtIGludGVnZXIgJGluZGV4IFRoZSBpbmRleCBvZiB0aGUgUFBTIGZyb20gd2hpY2ggd2UgYXJlIGNoZWNraW5nCgkqIEByZXR1cm4gYm9vbGVhbiBXaGV0aGVyIHRoZSBQUFMgdHJlZSBmb3IgdGhlIGdpdmVuIFBQUyBpcyBjb21wbGV0ZQoJKi8KCXB1YmxpYyBmdW5jdGlvbiBfcHBzVHJlZUNvbXBsZXRlKCRpbmRleCkKCXsKCQlyZXR1cm4gaXNzZXQoJHRoaXMtPl9saXN0WyRpbmRleF0pICYmCgkJCSAgICgkcHBzID0gJHRoaXMtPl9saXN0WyRpbmRleF0pICYmCgkJCSAgICgkcHBzLT5QcmV2UHBzID09IC0xIHx8CgkJCQkkdGhpcy0+X3Bwc1RyZWVDb21wbGV0ZSgkcHBzLT5QcmV2UHBzKSkgJiYKCQkJICAgKCRwcHMtPk5leHRQcHMgPT0gLTEgfHwKCQkJCSR0aGlzLT5fcHBzVHJlZUNvbXBsZXRlKCRwcHMtPk5leHRQcHMpKSAmJgoJCQkgICAoJHBwcy0+RGlyUHBzID09IC0xIHx8CgkJCQkkdGhpcy0+X3Bwc1RyZWVDb21wbGV0ZSgkcHBzLT5EaXJQcHMpKTsKCX0KCgkvKioKCSogQ2hlY2tzIHdoZXRoZXIgYSBQUFMgaXMgYSBGaWxlIFBQUyBvciBub3QuCgkqIElmIHRoZXJlIGlzIG5vIFBQUyBmb3IgdGhlIGluZGV4IGdpdmVuLCBpdCB3aWxsIHJldHVybiBmYWxzZS4KCSoKCSogQGFjY2VzcyBwdWJsaWMKCSogQHBhcmFtIGludGVnZXIgJGluZGV4IFRoZSBpbmRleCBmb3IgdGhlIFBQUwoJKiBAcmV0dXJuIGJvb2wgdHJ1ZSBpZiBpdCdzIGEgRmlsZSBQUFMsIGZhbHNlIG90aGVyd2lzZQoJKi8KCXB1YmxpYyBmdW5jdGlvbiBpc0ZpbGUoJGluZGV4KQoJewoJCWlmIChpc3NldCgkdGhpcy0+X2xpc3RbJGluZGV4XSkpIHsKCQkJcmV0dXJuICgkdGhpcy0+X2xpc3RbJGluZGV4XS0+VHlwZSA9PSBzZWxmOjpPTEVfUFBTX1RZUEVfRklMRSk7CgkJfQoJCXJldHVybiBmYWxzZTsKCX0KCgkvKioKCSogQ2hlY2tzIHdoZXRoZXIgYSBQUFMgaXMgYSBSb290IFBQUyBvciBub3QuCgkqIElmIHRoZXJlIGlzIG5vIFBQUyBmb3IgdGhlIGluZGV4IGdpdmVuLCBpdCB3aWxsIHJldHVybiBmYWxzZS4KCSoKCSogQGFjY2VzcyBwdWJsaWMKCSogQHBhcmFtIGludGVnZXIgJGluZGV4IFRoZSBpbmRleCBmb3IgdGhlIFBQUy4KCSogQHJldHVybiBib29sIHRydWUgaWYgaXQncyBhIFJvb3QgUFBTLCBmYWxzZSBvdGhlcndpc2UKCSovCglwdWJsaWMgZnVuY3Rpb24gaXNSb290KCRpbmRleCkKCXsKCQlpZiAoaXNzZXQoJHRoaXMtPl9saXN0WyRpbmRleF0pKSB7CgkJCXJldHVybiAoJHRoaXMtPl9saXN0WyRpbmRleF0tPlR5cGUgPT0gc2VsZjo6T0xFX1BQU19UWVBFX1JPT1QpOwoJCX0KCQlyZXR1cm4gZmFsc2U7Cgl9CgoJLyoqCgkqIEdpdmVzIHRoZSB0b3RhbCBudW1iZXIgb2YgUFBTJ3MgZm91bmQgaW4gdGhlIE9MRSBjb250YWluZXIuCgkqCgkqIEBhY2Nlc3MgcHVibGljCgkqIEByZXR1cm4gaW50ZWdlciBUaGUgdG90YWwgbnVtYmVyIG9mIFBQUydzIGZvdW5kIGluIHRoZSBPTEUgY29udGFpbmVyCgkqLwoJcHVibGljIGZ1bmN0aW9uIHBwc1RvdGFsKCkKCXsKCQlyZXR1cm4gY291bnQoJHRoaXMtPl9saXN0KTsKCX0KCgkvKioKCSogR2V0cyBkYXRhIGZyb20gYSBQUFMKCSogSWYgdGhlcmUgaXMgbm8gUFBTIGZvciB0aGUgaW5kZXggZ2l2ZW4sIGl0IHdpbGwgcmV0dXJuIGFuIGVtcHR5IHN0cmluZy4KCSoKCSogQGFjY2VzcyBwdWJsaWMKCSogQHBhcmFtIGludGVnZXIgJGluZGV4ICAgIFRoZSBpbmRleCBmb3IgdGhlIFBQUwoJKiBAcGFyYW0gaW50ZWdlciAkcG9zaXRpb24gVGhlIHBvc2l0aW9uIGZyb20gd2hpY2ggdG8gc3RhcnQgcmVhZGluZwoJKiAgICAgICAgICAgICAgICAgICAgICAgICAgKHJlbGF0aXZlIHRvIHRoZSBQUFMpCgkqIEBwYXJhbSBpbnRlZ2VyICRsZW5ndGggICBUaGUgYW1vdW50IG9mIGJ5dGVzIHRvIHJlYWQgKGF0IG1vc3QpCgkqIEByZXR1cm4gc3RyaW5nIFRoZSBiaW5hcnkgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIGRhdGEgcmVxdWVzdGVkCgkqIEBzZWUgT0xFX1BQU19GaWxlOjpnZXRTdHJlYW0oKQoJKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXREYXRhKCRpbmRleCwgJHBvc2l0aW9uLCAkbGVuZ3RoKQoJewoJCS8vIGlmIHBvc2l0aW9uIGlzIG5vdCB2YWxpZCByZXR1cm4gZW1wdHkgc3RyaW5nCgkJaWYgKCFpc3NldCgkdGhpcy0+X2xpc3RbJGluZGV4XSkgfHwgKCRwb3NpdGlvbiA+PSAkdGhpcy0+X2xpc3RbJGluZGV4XS0+U2l6ZSkgfHwgKCRwb3NpdGlvbiA8IDApKSB7CgkJCXJldHVybiAnJzsKCQl9CgkJJGZoID0gJHRoaXMtPmdldFN0cmVhbSgkdGhpcy0+X2xpc3RbJGluZGV4XSk7CgkJJGRhdGEgPSBzdHJlYW1fZ2V0X2NvbnRlbnRzKCRmaCwgJGxlbmd0aCwgJHBvc2l0aW9uKTsKCQlmY2xvc2UoJGZoKTsKCQlyZXR1cm4gJGRhdGE7Cgl9CgoJLyoqCgkqIEdldHMgdGhlIGRhdGEgbGVuZ3RoIGZyb20gYSBQUFMKCSogSWYgdGhlcmUgaXMgbm8gUFBTIGZvciB0aGUgaW5kZXggZ2l2ZW4sIGl0IHdpbGwgcmV0dXJuIDAuCgkqCgkqIEBhY2Nlc3MgcHVibGljCgkqIEBwYXJhbSBpbnRlZ2VyICRpbmRleCAgICBUaGUgaW5kZXggZm9yIHRoZSBQUFMKCSogQHJldHVybiBpbnRlZ2VyIFRoZSBhbW91bnQgb2YgYnl0ZXMgaW4gZGF0YSB0aGUgUFBTIGhhcwoJKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXREYXRhTGVuZ3RoKCRpbmRleCkKCXsKCQlpZiAoaXNzZXQoJHRoaXMtPl9saXN0WyRpbmRleF0pKSB7CgkJCXJldHVybiAkdGhpcy0+X2xpc3RbJGluZGV4XS0+U2l6ZTsKCQl9CgkJcmV0dXJuIDA7Cgl9CgoJLyoqCgkqIFV0aWxpdHkgZnVuY3Rpb24gdG8gdHJhbnNmb3JtIEFTQ0lJIHRleHQgdG8gVW5pY29kZQoJKgoJKiBAYWNjZXNzIHB1YmxpYwoJKiBAc3RhdGljCgkqIEBwYXJhbSBzdHJpbmcgJGFzY2lpIFRoZSBBU0NJSSBzdHJpbmcgdG8gdHJhbnNmb3JtCgkqIEByZXR1cm4gc3RyaW5nIFRoZSBzdHJpbmcgaW4gVW5pY29kZQoJKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gQXNjMlVjcygkYXNjaWkpCgl7CgkJJHJhd25hbWUgPSAnJzsKCQlmb3IgKCRpID0gMDsgJGkgPCBzdHJsZW4oJGFzY2lpKTsgKyskaSkgewoJCQkkcmF3bmFtZSAuPSAkYXNjaWl7JGl9IC4gIlx4MDAiOwoJCX0KCQlyZXR1cm4gJHJhd25hbWU7Cgl9CgoJLyoqCgkqIFV0aWxpdHkgZnVuY3Rpb24KCSogUmV0dXJucyBhIHN0cmluZyBmb3IgdGhlIE9MRSBjb250YWluZXIgd2l0aCB0aGUgZGF0ZSBnaXZlbgoJKgoJKiBAYWNjZXNzIHB1YmxpYwoJKiBAc3RhdGljCgkqIEBwYXJhbSBpbnRlZ2VyICRkYXRlIEEgdGltZXN0YW1wCgkqIEByZXR1cm4gc3RyaW5nIFRoZSBzdHJpbmcgZm9yIHRoZSBPTEUgY29udGFpbmVyCgkqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBMb2NhbERhdGUyT0xFKCRkYXRlID0gbnVsbCkKCXsKCQlpZiAoIWlzc2V0KCRkYXRlKSkgewoJCQlyZXR1cm4gIlx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIjsKCQl9CgoJCS8vIGZhY3RvciB1c2VkIGZvciBzZXBhcmF0aW5nIG51bWJlcnMgaW50byA0IGJ5dGVzIHBhcnRzCgkJJGZhY3RvciA9IHBvdygyLCAzMik7CgoJCS8vIGRheXMgZnJvbSAxLTEtMTYwMSB1bnRpbCB0aGUgYmVnZ2luaW5nIG9mIFVOSVggZXJhCgkJJGRheXMgPSAxMzQ3NzQ7CgkJLy8gY2FsY3VsYXRlIHNlY29uZHMKCQkkYmlnX2RhdGUgPSAkZGF5cyoyNCozNjAwICsgZ21ta3RpbWUoZGF0ZSgiSCIsJGRhdGUpLGRhdGUoImkiLCRkYXRlKSxkYXRlKCJzIiwkZGF0ZSksCgkJCQkJCQkJCQkJIGRhdGUoIm0iLCRkYXRlKSxkYXRlKCJkIiwkZGF0ZSksZGF0ZSgiWSIsJGRhdGUpKTsKCQkvLyBtdWx0aXBseSBqdXN0IHRvIG1ha2UgTVMgaGFwcHkKCQkkYmlnX2RhdGUgKj0gMTAwMDAwMDA7CgoJCSRoaWdoX3BhcnQgPSBmbG9vcigkYmlnX2RhdGUgLyAkZmFjdG9yKTsKCQkvLyBsb3dlciA0IGJ5dGVzCgkJJGxvd19wYXJ0ID0gZmxvb3IoKCgkYmlnX2RhdGUgLyAkZmFjdG9yKSAtICRoaWdoX3BhcnQpICogJGZhY3Rvcik7CgoJCS8vIE1ha2UgSEVYIHN0cmluZwoJCSRyZXMgPSAnJzsKCgkJZm9yICgkaSA9IDA7ICRpIDwgNDsgKyskaSkgewoJCQkkaGV4ID0gJGxvd19wYXJ0ICUgMHgxMDA7CgkJCSRyZXMgLj0gcGFjaygnYycsICRoZXgpOwoJCQkkbG93X3BhcnQgLz0gMHgxMDA7CgkJfQoJCWZvciAoJGkgPSAwOyAkaSA8IDQ7ICsrJGkpIHsKCQkJJGhleCA9ICRoaWdoX3BhcnQgJSAweDEwMDsKCQkJJHJlcyAuPSBwYWNrKCdjJywgJGhleCk7CgkJCSRoaWdoX3BhcnQgLz0gMHgxMDA7CgkJfQoJCXJldHVybiAkcmVzOwoJfQoKCS8qKgoJKiBSZXR1cm5zIGEgdGltZXN0YW1wIGZyb20gYW4gT0xFIGNvbnRhaW5lcidzIGRhdGUKCSoKCSogQGFjY2VzcyBwdWJsaWMKCSogQHN0YXRpYwoJKiBAcGFyYW0gaW50ZWdlciAkc3RyaW5nIEEgYmluYXJ5IHN0cmluZyB3aXRoIHRoZSBlbmNvZGVkIGRhdGUKCSogQHJldHVybiBzdHJpbmcgVGhlIHRpbWVzdGFtcCBjb3JyZXNwb25kaW5nIHRvIHRoZSBzdHJpbmcKCSovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIE9MRTJMb2NhbERhdGUoJHN0cmluZykKCXsKCQlpZiAoc3RybGVuKCRzdHJpbmcpICE9IDgpIHsKCQkJcmV0dXJuIG5ldyBQRUFSX0Vycm9yKCJFeHBlY3RpbmcgOCBieXRlIHN0cmluZyIpOwoJCX0KCgkJLy8gZmFjdG9yIHVzZWQgZm9yIHNlcGFyYXRpbmcgbnVtYmVycyBpbnRvIDQgYnl0ZXMgcGFydHMKCQkkZmFjdG9yID0gcG93KDIsMzIpOwoJCWxpc3QoLCAkaGlnaF9wYXJ0KSA9IHVucGFjaygnVicsIHN1YnN0cigkc3RyaW5nLCA0LCA0KSk7CgkJbGlzdCgsICRsb3dfcGFydCkgPSB1bnBhY2soJ1YnLCBzdWJzdHIoJHN0cmluZywgMCwgNCkpOwoKCQkkYmlnX2RhdGUgPSAoJGhpZ2hfcGFydCAqICRmYWN0b3IpICsgJGxvd19wYXJ0OwoJCS8vIHRyYW5zbGF0ZSB0byBzZWNvbmRzCgkJJGJpZ19kYXRlIC89IDEwMDAwMDAwOwoKCQkvLyBkYXlzIGZyb20gMS0xLTE2MDEgdW50aWwgdGhlIGJlZ2dpbmluZyBvZiBVTklYIGVyYQoJCSRkYXlzID0gMTM0Nzc0OwoKCQkvLyB0cmFuc2xhdGUgdG8gc2Vjb25kcyBmcm9tIGJlZ2dpbmluZyBvZiBVTklYIGVyYQoJCSRiaWdfZGF0ZSAtPSAkZGF5cyAqIDI0ICogMzYwMDsKCQlyZXR1cm4gZmxvb3IoJGJpZ19kYXRlKTsKCX0KfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Shared/OLE/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Shared/OLE/ChainedBlockStream.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIFBIUEV4Y2VsCiAqCiAqIENvcHlyaWdodCAoQykgMjAwNiAtIDIwMTIgUEhQRXhjZWwKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICoKICogQGNhdGVnb3J5ICAgUEhQRXhjZWwKICogQHBhY2thZ2UgICAgUEhQRXhjZWxfU2hhcmVkX09MRQogKiBAY29weXJpZ2h0ICBDb3B5cmlnaHQgKGMpIDIwMDYgLSAyMDA3IENocmlzdGlhbiBTY2htaWR0CiAqIEBsaWNlbnNlICAgIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9vbGQtbGljZW5zZXMvbGdwbC0yLjEudHh0CUxHUEwKICogQHZlcnNpb24gMS43LjcsIDIwMTItMDUtMTkKICovCgovKioKICogUEhQRXhjZWxfU2hhcmVkX09MRV9DaGFpbmVkQmxvY2tTdHJlYW0KICoKICogU3RyZWFtIHdyYXBwZXIgZm9yIHJlYWRpbmcgZGF0YSBzdG9yZWQgaW4gYW4gT0xFIGZpbGUuIEltcGxlbWVudHMgbWV0aG9kcwogKiBmb3IgUEhQJ3Mgc3RyZWFtX3dyYXBwZXJfcmVnaXN0ZXIoKS4gRm9yIGNyZWF0aW5nIHN0cmVhbXMgdXNpbmcgdGhpcwogKiB3cmFwcGVyLCB1c2UgUEhQRXhjZWxfU2hhcmVkX09MRV9QUFNfRmlsZTo6Z2V0U3RyZWFtKCkuCiAqCiAqIEBjYXRlZ29yeSAgIFBIUEV4Y2VsCiAqIEBwYWNrYWdlICAgIFBIUEV4Y2VsX1NoYXJlZF9PTEUKICovCmNsYXNzIFBIUEV4Y2VsX1NoYXJlZF9PTEVfQ2hhaW5lZEJsb2NrU3RyZWFtCnsKCS8qKgoJICogVGhlIE9MRSBjb250YWluZXIgb2YgdGhlIGZpbGUgdGhhdCBpcyBiZWluZyByZWFkLgoJICogQHZhciBPTEUKCSAqLwoJcHVibGljICRvbGU7CgoJLyoqCgkgKiBQYXJhbWV0ZXJzIHNwZWNpZmllZCBieSBmb3BlbigpLgoJICogQHZhciBhcnJheQoJICovCglwdWJsaWMgJHBhcmFtczsKCgkvKioKCSAqIFRoZSBiaW5hcnkgZGF0YSBvZiB0aGUgZmlsZS4KCSAqIEB2YXIgIHN0cmluZwoJICovCglwdWJsaWMgJGRhdGE7CgoJLyoqCgkgKiBUaGUgZmlsZSBwb2ludGVyLgoJICogQHZhciAgaW50ICBieXRlIG9mZnNldAoJICovCglwdWJsaWMgJHBvczsKCgkvKioKCSAqIEltcGxlbWVudHMgc3VwcG9ydCBmb3IgZm9wZW4oKS4KCSAqIEZvciBjcmVhdGluZyBzdHJlYW1zIHVzaW5nIHRoaXMgd3JhcHBlciwgdXNlIE9MRV9QUFNfRmlsZTo6Z2V0U3RyZWFtKCkuCgkgKgoJICogQHBhcmFtCXN0cmluZwkkcGF0aAkJCXJlc291cmNlIG5hbWUgaW5jbHVkaW5nIHNjaGVtZSwgZS5nLgoJICoJCQkJCQkJCQlvbGUtY2hhaW5lZGJsb2Nrc3RyZWFtOi8vb2xlSW5zdGFuY2VJZD0xCgkgKiBAcGFyYW0Jc3RyaW5nCSRtb2RlCQkJb25seSAiciIgaXMgc3VwcG9ydGVkCgkgKiBAcGFyYW0JaW50CQkkb3B0aW9ucwkJbWFzayBvZiBTVFJFQU1fUkVQT1JUX0VSUk9SUyBhbmQgU1RSRUFNX1VTRV9QQVRICgkgKiBAcGFyYW0Jc3RyaW5nICAmJG9wZW5lZFBhdGgJYWJzb2x1dGUgcGF0aCBvZiB0aGUgb3BlbmVkIHN0cmVhbSAob3V0IHBhcmFtZXRlcikKCSAqIEByZXR1cm4JYm9vbCAgICB0cnVlIG9uIHN1Y2Nlc3MKCSAqLwoJcHVibGljIGZ1bmN0aW9uIHN0cmVhbV9vcGVuKCRwYXRoLCAkbW9kZSwgJG9wdGlvbnMsICYkb3BlbmVkUGF0aCkKCXsKCQlpZiAoJG1vZGUgIT0gJ3InKSB7CgkJCWlmICgkb3B0aW9ucyAmIFNUUkVBTV9SRVBPUlRfRVJST1JTKSB7CgkJCQl0cmlnZ2VyX2Vycm9yKCdPbmx5IHJlYWRpbmcgaXMgc3VwcG9ydGVkJywgRV9VU0VSX1dBUk5JTkcpOwoJCQl9CgkJCXJldHVybiBmYWxzZTsKCQl9CgoJCS8vIDI1IGlzIGxlbmd0aCBvZiAib2xlLWNoYWluZWRibG9ja3N0cmVhbTovLyIKCQlwYXJzZV9zdHIoc3Vic3RyKCRwYXRoLCAyNSksICR0aGlzLT5wYXJhbXMpOwoJCWlmICghaXNzZXQoJHRoaXMtPnBhcmFtc1snb2xlSW5zdGFuY2VJZCddLAoJCQkJICAgJHRoaXMtPnBhcmFtc1snYmxvY2tJZCddLAoJCQkJICAgJEdMT0JBTFNbJ19PTEVfSU5TVEFOQ0VTJ11bJHRoaXMtPnBhcmFtc1snb2xlSW5zdGFuY2VJZCddXSkpIHsKCgkJCWlmICgkb3B0aW9ucyAmIFNUUkVBTV9SRVBPUlRfRVJST1JTKSB7CgkJCQl0cmlnZ2VyX2Vycm9yKCdPTEUgc3RyZWFtIG5vdCBmb3VuZCcsIEVfVVNFUl9XQVJOSU5HKTsKCQkJfQoJCQlyZXR1cm4gZmFsc2U7CgkJfQoJCSR0aGlzLT5vbGUgPSAkR0xPQkFMU1snX09MRV9JTlNUQU5DRVMnXVskdGhpcy0+cGFyYW1zWydvbGVJbnN0YW5jZUlkJ11dOwoKCQkkYmxvY2tJZCA9ICR0aGlzLT5wYXJhbXNbJ2Jsb2NrSWQnXTsKCQkkdGhpcy0+ZGF0YSA9ICcnOwoJCWlmIChpc3NldCgkdGhpcy0+cGFyYW1zWydzaXplJ10pICYmCgkJCSR0aGlzLT5wYXJhbXNbJ3NpemUnXSA8ICR0aGlzLT5vbGUtPmJpZ0Jsb2NrVGhyZXNob2xkICYmCgkJCSRibG9ja0lkICE9ICR0aGlzLT5vbGUtPnJvb3QtPl9TdGFydEJsb2NrKSB7CgoJCQkvLyBCbG9jayBpZCByZWZlcnMgdG8gc21hbGwgYmxvY2tzCgkJCSRyb290UG9zID0gJHRoaXMtPm9sZS0+X2dldEJsb2NrT2Zmc2V0KCR0aGlzLT5vbGUtPnJvb3QtPl9TdGFydEJsb2NrKTsKCQkJd2hpbGUgKCRibG9ja0lkICE9IC0yKSB7CgkJCQkkcG9zID0gJHJvb3RQb3MgKyAkYmxvY2tJZCAqICR0aGlzLT5vbGUtPmJpZ0Jsb2NrU2l6ZTsKCQkJCSRibG9ja0lkID0gJHRoaXMtPm9sZS0+c2JhdFskYmxvY2tJZF07CgkJCQlmc2VlaygkdGhpcy0+b2xlLT5fZmlsZV9oYW5kbGUsICRwb3MpOwoJCQkJJHRoaXMtPmRhdGEgLj0gZnJlYWQoJHRoaXMtPm9sZS0+X2ZpbGVfaGFuZGxlLCAkdGhpcy0+b2xlLT5iaWdCbG9ja1NpemUpOwoJCQl9CgkJfSBlbHNlIHsKCQkJLy8gQmxvY2sgaWQgcmVmZXJzIHRvIGJpZyBibG9ja3MKCQkJd2hpbGUgKCRibG9ja0lkICE9IC0yKSB7CgkJCQkkcG9zID0gJHRoaXMtPm9sZS0+X2dldEJsb2NrT2Zmc2V0KCRibG9ja0lkKTsKCQkJCWZzZWVrKCR0aGlzLT5vbGUtPl9maWxlX2hhbmRsZSwgJHBvcyk7CgkJCQkkdGhpcy0+ZGF0YSAuPSBmcmVhZCgkdGhpcy0+b2xlLT5fZmlsZV9oYW5kbGUsICR0aGlzLT5vbGUtPmJpZ0Jsb2NrU2l6ZSk7CgkJCQkkYmxvY2tJZCA9ICR0aGlzLT5vbGUtPmJiYXRbJGJsb2NrSWRdOwoJCQl9CgkJfQoJCWlmIChpc3NldCgkdGhpcy0+cGFyYW1zWydzaXplJ10pKSB7CgkJCSR0aGlzLT5kYXRhID0gc3Vic3RyKCR0aGlzLT5kYXRhLCAwLCAkdGhpcy0+cGFyYW1zWydzaXplJ10pOwoJCX0KCgkJaWYgKCRvcHRpb25zICYgU1RSRUFNX1VTRV9QQVRIKSB7CgkJCSRvcGVuZWRQYXRoID0gJHBhdGg7CgkJfQoKCQlyZXR1cm4gdHJ1ZTsKCX0KCgkvKioKCSAqIEltcGxlbWVudHMgc3VwcG9ydCBmb3IgZmNsb3NlKCkuCgkgKgoJICovCglwdWJsaWMgZnVuY3Rpb24gc3RyZWFtX2Nsb3NlKCkKCXsKCQkkdGhpcy0+b2xlID0gbnVsbDsKCQl1bnNldCgkR0xPQkFMU1snX09MRV9JTlNUQU5DRVMnXSk7Cgl9CgoJLyoqCgkgKiBJbXBsZW1lbnRzIHN1cHBvcnQgZm9yIGZyZWFkKCksIGZnZXRzKCkgZXRjLgoJICoKCSAqIEBwYXJhbSAgIGludAkJJGNvdW50CW1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQKCSAqIEByZXR1cm4gIHN0cmluZwoJICovCglwdWJsaWMgZnVuY3Rpb24gc3RyZWFtX3JlYWQoJGNvdW50KQoJewoJCWlmICgkdGhpcy0+c3RyZWFtX2VvZigpKSB7CgkJCXJldHVybiBmYWxzZTsKCQl9CgkJJHMgPSBzdWJzdHIoJHRoaXMtPmRhdGEsICR0aGlzLT5wb3MsICRjb3VudCk7CgkJJHRoaXMtPnBvcyArPSAkY291bnQ7CgkJcmV0dXJuICRzOwoJfQoKCS8qKgoJICogSW1wbGVtZW50cyBzdXBwb3J0IGZvciBmZW9mKCkuCgkgKgoJICogQHJldHVybiAgYm9vbCAgVFJVRSBpZiB0aGUgZmlsZSBwb2ludGVyIGlzIGF0IEVPRjsgb3RoZXJ3aXNlIEZBTFNFCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBzdHJlYW1fZW9mKCkKCXsKCQkkZW9mID0gJHRoaXMtPnBvcyA+PSBzdHJsZW4oJHRoaXMtPmRhdGEpOwoJCS8vIFdvcmthcm91bmQgZm9yIGJ1ZyBpbiBQSFAgNS4wLng6IGh0dHA6Ly9idWdzLnBocC5uZXQvMjc1MDgKCQlpZiAodmVyc2lvbl9jb21wYXJlKFBIUF9WRVJTSU9OLCAnNS4wJywgJz49JykgJiYKCQkJdmVyc2lvbl9jb21wYXJlKFBIUF9WRVJTSU9OLCAnNS4xJywgJzwnKSkgewoKCQkgICAkZW9mID0gISRlb2Y7CgkJfQoJCXJldHVybiAkZW9mOwoJfQoKCS8qKgoJICogUmV0dXJucyB0aGUgcG9zaXRpb24gb2YgdGhlIGZpbGUgcG9pbnRlciwgaS5lLiBpdHMgb2Zmc2V0IGludG8gdGhlIGZpbGUKCSAqIHN0cmVhbS4gSW1wbGVtZW50cyBzdXBwb3J0IGZvciBmdGVsbCgpLgoJICoKCSAqIEByZXR1cm4gIGludAoJICovCglwdWJsaWMgZnVuY3Rpb24gc3RyZWFtX3RlbGwoKQoJewoJCXJldHVybiAkdGhpcy0+cG9zOwoJfQoKCS8qKgoJICogSW1wbGVtZW50cyBzdXBwb3J0IGZvciBmc2VlaygpLgoJICoKCSAqIEBwYXJhbQlpbnQJCSRvZmZzZXQJYnl0ZSBvZmZzZXQKCSAqIEBwYXJhbQlpbnQJCSR3aGVuY2UJU0VFS19TRVQsIFNFRUtfQ1VSIG9yIFNFRUtfRU5ECgkgKiBAcmV0dXJuCWJvb2wKCSAqLwoJcHVibGljIGZ1bmN0aW9uIHN0cmVhbV9zZWVrKCRvZmZzZXQsICR3aGVuY2UpCgl7CgkJaWYgKCR3aGVuY2UgPT0gU0VFS19TRVQgJiYgJG9mZnNldCA+PSAwKSB7CgkJCSR0aGlzLT5wb3MgPSAkb2Zmc2V0OwoJCX0gZWxzZWlmICgkd2hlbmNlID09IFNFRUtfQ1VSICYmIC0kb2Zmc2V0IDw9ICR0aGlzLT5wb3MpIHsKCQkJJHRoaXMtPnBvcyArPSAkb2Zmc2V0OwoJCX0gZWxzZWlmICgkd2hlbmNlID09IFNFRUtfRU5EICYmIC0kb2Zmc2V0IDw9IHNpemVvZigkdGhpcy0+ZGF0YSkpIHsKCQkJJHRoaXMtPnBvcyA9IHN0cmxlbigkdGhpcy0+ZGF0YSkgKyAkb2Zmc2V0OwoJCX0gZWxzZSB7CgkJCXJldHVybiBmYWxzZTsKCQl9CgkJcmV0dXJuIHRydWU7Cgl9CgoJLyoqCgkgKiBJbXBsZW1lbnRzIHN1cHBvcnQgZm9yIGZzdGF0KCkuIEN1cnJlbnRseSB0aGUgb25seSBzdXBwb3J0ZWQgZmllbGQgaXMKCSAqICJzaXplIi4KCSAqIEByZXR1cm4gIGFycmF5CgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBzdHJlYW1fc3RhdCgpCgl7CgkJcmV0dXJuIGFycmF5KAoJCQknc2l6ZScgPT4gc3RybGVuKCR0aGlzLT5kYXRhKSwKCQkJKTsKCX0KCgkvLyBNZXRob2RzIHVzZWQgYnkgc3RyZWFtX3dyYXBwZXJfcmVnaXN0ZXIoKSB0aGF0IGFyZSBub3QgaW1wbGVtZW50ZWQ6CgkvLyBib29sIHN0cmVhbV9mbHVzaCAoIHZvaWQgKQoJLy8gaW50IHN0cmVhbV93cml0ZSAoIHN0cmluZyBkYXRhICkKCS8vIGJvb2wgcmVuYW1lICggc3RyaW5nIHBhdGhfZnJvbSwgc3RyaW5nIHBhdGhfdG8gKQoJLy8gYm9vbCBta2RpciAoIHN0cmluZyBwYXRoLCBpbnQgbW9kZSwgaW50IG9wdGlvbnMgKQoJLy8gYm9vbCBybWRpciAoIHN0cmluZyBwYXRoLCBpbnQgb3B0aW9ucyApCgkvLyBib29sIGRpcl9vcGVuZGlyICggc3RyaW5nIHBhdGgsIGludCBvcHRpb25zICkKCS8vIGFycmF5IHVybF9zdGF0ICggc3RyaW5nIHBhdGgsIGludCBmbGFncyApCgkvLyBzdHJpbmcgZGlyX3JlYWRkaXIgKCB2b2lkICkKCS8vIGJvb2wgZGlyX3Jld2luZGRpciAoIHZvaWQgKQoJLy8gYm9vbCBkaXJfY2xvc2VkaXIgKCB2b2lkICkKfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Shared/OLE/PPS.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyogdmltOiBzZXQgZXhwYW5kdGFiIHRhYnN0b3A9NCBzaGlmdHdpZHRoPTQ6ICovCi8vICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwovLyB8IFBIUCBWZXJzaW9uIDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLy8gKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi8vIHwgQ29weXJpZ2h0IChjKSAxOTk3LTIwMDIgVGhlIFBIUCBHcm91cCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAovLyArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLy8gfCBUaGlzIHNvdXJjZSBmaWxlIGlzIHN1YmplY3QgdG8gdmVyc2lvbiAyLjAyIG9mIHRoZSBQSFAgbGljZW5zZSwgICAgICB8Ci8vIHwgdGhhdCBpcyBidW5kbGVkIHdpdGggdGhpcyBwYWNrYWdlIGluIHRoZSBmaWxlIExJQ0VOU0UsIGFuZCBpcyAgICAgICAgfAovLyB8IGF2YWlsYWJsZSBhdCB0aHJvdWdoIHRoZSB3b3JsZC13aWRlLXdlYiBhdCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLy8gfCBodHRwOi8vd3d3LnBocC5uZXQvbGljZW5zZS8yXzAyLnR4dC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci8vIHwgSWYgeW91IGRpZCBub3QgcmVjZWl2ZSBhIGNvcHkgb2YgdGhlIFBIUCBsaWNlbnNlIGFuZCBhcmUgdW5hYmxlIHRvICAgfAovLyB8IG9idGFpbiBpdCB0aHJvdWdoIHRoZSB3b3JsZC13aWRlLXdlYiwgcGxlYXNlIHNlbmQgYSBub3RlIHRvICAgICAgICAgIHwKLy8gfCBsaWNlbnNlQHBocC5uZXQgc28gd2UgY2FuIG1haWwgeW91IGEgY29weSBpbW1lZGlhdGVseS4gICAgICAgICAgICAgICB8Ci8vICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwovLyB8IEF1dGhvcjogWGF2aWVyIE5vZ3VlciA8eG5vZ3VlckBwaHAubmV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLy8gfCBCYXNlZCBvbiBPTEU6OlN0b3JhZ2VfTGl0ZSBieSBLYXdhaSwgVGFrYW5vcmkgICAgICAgICAgICAgICAgICAgICAgICB8Ci8vICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwovLwovLyAkSWQ6IFBQUy5waHAsdiAxLjcgMjAwNy8wMi8xMyAyMTowMDo0MiBzY2htaWR0IEV4cCAkCgoKLyoqCiogQ2xhc3MgZm9yIGNyZWF0aW5nIFBQUydzIGZvciBPTEUgY29udGFpbmVycwoqCiogQGF1dGhvciAgIFhhdmllciBOb2d1ZXIgPHhub2d1ZXJAcGhwLm5ldD4KKiBAY2F0ZWdvcnkgUEhQRXhjZWwKKiBAcGFja2FnZSAgUEhQRXhjZWxfU2hhcmVkX09MRQoqLwpjbGFzcyBQSFBFeGNlbF9TaGFyZWRfT0xFX1BQUwp7CgkvKioKCSogVGhlIFBQUyBpbmRleAoJKiBAdmFyIGludGVnZXIKCSovCglwdWJsaWMgJE5vOwoKCS8qKgoJKiBUaGUgUFBTIG5hbWUgKGluIFVuaWNvZGUpCgkqIEB2YXIgc3RyaW5nCgkqLwoJcHVibGljICROYW1lOwoKCS8qKgoJKiBUaGUgUFBTIHR5cGUuIERpciwgUm9vdCBvciBGaWxlCgkqIEB2YXIgaW50ZWdlcgoJKi8KCXB1YmxpYyAkVHlwZTsKCgkvKioKCSogVGhlIGluZGV4IG9mIHRoZSBwcmV2aW91cyBQUFMKCSogQHZhciBpbnRlZ2VyCgkqLwoJcHVibGljICRQcmV2UHBzOwoKCS8qKgoJKiBUaGUgaW5kZXggb2YgdGhlIG5leHQgUFBTCgkqIEB2YXIgaW50ZWdlcgoJKi8KCXB1YmxpYyAkTmV4dFBwczsKCgkvKioKCSogVGhlIGluZGV4IG9mIGl0J3MgZmlyc3QgY2hpbGQgaWYgdGhpcyBpcyBhIERpciBvciBSb290IFBQUwoJKiBAdmFyIGludGVnZXIKCSovCglwdWJsaWMgJERpclBwczsKCgkvKioKCSogQSB0aW1lc3RhbXAKCSogQHZhciBpbnRlZ2VyCgkqLwoJcHVibGljICRUaW1lMXN0OwoKCS8qKgoJKiBBIHRpbWVzdGFtcAoJKiBAdmFyIGludGVnZXIKCSovCglwdWJsaWMgJFRpbWUybmQ7CgoJLyoqCgkqIFN0YXJ0aW5nIGJsb2NrIChzbWFsbCBvciBiaWcpIGZvciB0aGlzIFBQUydzIGRhdGEgIGluc2lkZSB0aGUgY29udGFpbmVyCgkqIEB2YXIgaW50ZWdlcgoJKi8KCXB1YmxpYyAkX1N0YXJ0QmxvY2s7CgoJLyoqCgkqIFRoZSBzaXplIG9mIHRoZSBQUFMncyBkYXRhIChpbiBieXRlcykKCSogQHZhciBpbnRlZ2VyCgkqLwoJcHVibGljICRTaXplOwoKCS8qKgoJKiBUaGUgUFBTJ3MgZGF0YSAob25seSB1c2VkIGlmIGl0J3Mgbm90IHVzaW5nIGEgdGVtcG9yYXJ5IGZpbGUpCgkqIEB2YXIgc3RyaW5nCgkqLwoJcHVibGljICRfZGF0YTsKCgkvKioKCSogQXJyYXkgb2YgY2hpbGQgUFBTJ3MgKG9ubHkgdXNlZCBieSBSb290IGFuZCBEaXIgUFBTJ3MpCgkqIEB2YXIgYXJyYXkKCSovCglwdWJsaWMgJGNoaWxkcmVuID0gYXJyYXkoKTsKCgkvKioKCSogUG9pbnRlciB0byBPTEUgY29udGFpbmVyCgkqIEB2YXIgT0xFCgkqLwoJcHVibGljICRvbGU7CgoJLyoqCgkqIFRoZSBjb25zdHJ1Y3RvcgoJKgoJKiBAYWNjZXNzIHB1YmxpYwoJKiBAcGFyYW0gaW50ZWdlciAkTm8gICBUaGUgUFBTIGluZGV4CgkqIEBwYXJhbSBzdHJpbmcgICRuYW1lIFRoZSBQUFMgbmFtZQoJKiBAcGFyYW0gaW50ZWdlciAkdHlwZSBUaGUgUFBTIHR5cGUuIERpciwgUm9vdCBvciBGaWxlCgkqIEBwYXJhbSBpbnRlZ2VyICRwcmV2IFRoZSBpbmRleCBvZiB0aGUgcHJldmlvdXMgUFBTCgkqIEBwYXJhbSBpbnRlZ2VyICRuZXh0IFRoZSBpbmRleCBvZiB0aGUgbmV4dCBQUFMKCSogQHBhcmFtIGludGVnZXIgJGRpciAgVGhlIGluZGV4IG9mIGl0J3MgZmlyc3QgY2hpbGQgaWYgdGhpcyBpcyBhIERpciBvciBSb290IFBQUwoJKiBAcGFyYW0gaW50ZWdlciAkdGltZV8xc3QgQSB0aW1lc3RhbXAKCSogQHBhcmFtIGludGVnZXIgJHRpbWVfMm5kIEEgdGltZXN0YW1wCgkqIEBwYXJhbSBzdHJpbmcgICRkYXRhICBUaGUgKHVzdWFsbHkgYmluYXJ5KSBzb3VyY2UgZGF0YSBvZiB0aGUgUFBTCgkqIEBwYXJhbSBhcnJheSAgICRjaGlsZHJlbiBBcnJheSBjb250YWluaW5nIGNoaWxkcmVuIFBQUyBmb3IgdGhpcyBQUFMKCSovCglwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJE5vLCAkbmFtZSwgJHR5cGUsICRwcmV2LCAkbmV4dCwgJGRpciwgJHRpbWVfMXN0LCAkdGltZV8ybmQsICRkYXRhLCAkY2hpbGRyZW4pCgl7CgkJJHRoaXMtPk5vICAgICAgPSAkTm87CgkJJHRoaXMtPk5hbWUgICAgPSAkbmFtZTsKCQkkdGhpcy0+VHlwZSAgICA9ICR0eXBlOwoJCSR0aGlzLT5QcmV2UHBzID0gJHByZXY7CgkJJHRoaXMtPk5leHRQcHMgPSAkbmV4dDsKCQkkdGhpcy0+RGlyUHBzICA9ICRkaXI7CgkJJHRoaXMtPlRpbWUxc3QgPSAkdGltZV8xc3Q7CgkJJHRoaXMtPlRpbWUybmQgPSAkdGltZV8ybmQ7CgkJJHRoaXMtPl9kYXRhICAgICAgPSAkZGF0YTsKCQkkdGhpcy0+Y2hpbGRyZW4gICA9ICRjaGlsZHJlbjsKCQlpZiAoJGRhdGEgIT0gJycpIHsKCQkJJHRoaXMtPlNpemUgPSBzdHJsZW4oJGRhdGEpOwoJCX0gZWxzZSB7CgkJCSR0aGlzLT5TaXplID0gMDsKCQl9Cgl9CgoJLyoqCgkqIFJldHVybnMgdGhlIGFtb3VudCBvZiBkYXRhIHNhdmVkIGZvciB0aGlzIFBQUwoJKgoJKiBAYWNjZXNzIHB1YmxpYwoJKiBAcmV0dXJuIGludGVnZXIgVGhlIGFtb3VudCBvZiBkYXRhIChpbiBieXRlcykKCSovCglwdWJsaWMgZnVuY3Rpb24gX0RhdGFMZW4oKQoJewoJCWlmICghaXNzZXQoJHRoaXMtPl9kYXRhKSkgewoJCQlyZXR1cm4gMDsKCQl9CgkJLy9pZiAoaXNzZXQoJHRoaXMtPl9QUFNfRklMRSkpIHsKCQkvLwlmc2VlaygkdGhpcy0+X1BQU19GSUxFLCAwKTsKCQkvLwkkc3RhdHMgPSBmc3RhdCgkdGhpcy0+X1BQU19GSUxFKTsKCQkvLwlyZXR1cm4gJHN0YXRzWzddOwoJCS8vfSBlbHNlIHsKCQkJcmV0dXJuIHN0cmxlbigkdGhpcy0+X2RhdGEpOwoJCS8vfQoJfQoKCS8qKgoJKiBSZXR1cm5zIGEgc3RyaW5nIHdpdGggdGhlIFBQUydzIFdLIChXaGF0IGlzIGEgV0s/KQoJKgoJKiBAYWNjZXNzIHB1YmxpYwoJKiBAcmV0dXJuIHN0cmluZyBUaGUgYmluYXJ5IHN0cmluZwoJKi8KCXB1YmxpYyBmdW5jdGlvbiBfZ2V0UHBzV2soKQoJewoJCSRyZXQgPSBzdHJfcGFkKCR0aGlzLT5OYW1lLDY0LCJceDAwIik7CgoJCSRyZXQgLj0gcGFjaygidiIsIHN0cmxlbigkdGhpcy0+TmFtZSkgKyAyKSAgLy8gNjYKCQkJICAuIHBhY2soImMiLCAkdGhpcy0+VHlwZSkgICAgICAgICAgICAgIC8vIDY3CgkJCSAgLiBwYWNrKCJjIiwgMHgwMCkgLy9VSyAgICAgICAgICAgICAgICAvLyA2OAoJCQkgIC4gcGFjaygiViIsICR0aGlzLT5QcmV2UHBzKSAvL1ByZXYgICAgLy8gNzIKCQkJICAuIHBhY2soIlYiLCAkdGhpcy0+TmV4dFBwcykgLy9OZXh0ICAgIC8vIDc2CgkJCSAgLiBwYWNrKCJWIiwgJHRoaXMtPkRpclBwcykgIC8vRGlyICAgICAvLyA4MAoJCQkgIC4gIlx4MDBceDA5XHgwMlx4MDAiICAgICAgICAgICAgICAgICAgLy8gODQKCQkJICAuICJceDAwXHgwMFx4MDBceDAwIiAgICAgICAgICAgICAgICAgIC8vIDg4CgkJCSAgLiAiXHhjMFx4MDBceDAwXHgwMCIgICAgICAgICAgICAgICAgICAvLyA5MgoJCQkgIC4gIlx4MDBceDAwXHgwMFx4NDYiICAgICAgICAgICAgICAgICAgLy8gOTYgLy8gU2VlbXMgdG8gYmUgb2sgb25seSBmb3IgUm9vdAoJCQkgIC4gIlx4MDBceDAwXHgwMFx4MDAiICAgICAgICAgICAgICAgICAgLy8gMTAwCgkJCSAgLiBQSFBFeGNlbF9TaGFyZWRfT0xFOjpMb2NhbERhdGUyT0xFKCR0aGlzLT5UaW1lMXN0KSAgICAgICAvLyAxMDgKCQkJICAuIFBIUEV4Y2VsX1NoYXJlZF9PTEU6OkxvY2FsRGF0ZTJPTEUoJHRoaXMtPlRpbWUybmQpICAgICAgIC8vIDExNgoJCQkgIC4gcGFjaygiViIsIGlzc2V0KCR0aGlzLT5fU3RhcnRCbG9jayk/CgkJCQkJCSR0aGlzLT5fU3RhcnRCbG9jazowKSAgICAgICAgLy8gMTIwCgkJCSAgLiBwYWNrKCJWIiwgJHRoaXMtPlNpemUpICAgICAgICAgICAgICAgLy8gMTI0CgkJCSAgLiBwYWNrKCJWIiwgMCk7ICAgICAgICAgICAgICAgICAgICAgICAgLy8gMTI4CgkJcmV0dXJuICRyZXQ7Cgl9CgoJLyoqCgkqIFVwZGF0ZXMgaW5kZXggYW5kIHBvaW50ZXJzIHRvIHByZXZpb3VzLCBuZXh0IGFuZCBjaGlsZHJlbiBQUFMncyBmb3IgdGhpcwoJKiBQUFMuIEkgZG9uJ3QgdGhpbmsgaXQnbGwgd29yayB3aXRoIERpciBQUFMncy4KCSoKCSogQGFjY2VzcyBwdWJsaWMKCSogQHBhcmFtIGFycmF5ICYkcmFMaXN0IFJlZmVyZW5jZSB0byB0aGUgYXJyYXkgb2YgUFBTJ3MgZm9yIHRoZSB3aG9sZSBPTEUKCSogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lcgoJKiBAcmV0dXJuIGludGVnZXIgICAgICAgICAgVGhlIGluZGV4IGZvciB0aGlzIFBQUwoJKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gX3NhdmVQcHNTZXRQbnQoJiRyYUxpc3QsICR0b19zYXZlLCAkZGVwdGggPSAwKQoJewoJCWlmICggIWlzX2FycmF5KCR0b19zYXZlKSB8fCAoZW1wdHkoJHRvX3NhdmUpKSApIHsKCQkJcmV0dXJuIDB4RkZGRkZGRkY7CgkJfSBlbHNlaWYoIGNvdW50KCR0b19zYXZlKSA9PSAxICkgewoJCQkkY250ID0gY291bnQoJHJhTGlzdCk7CgkJCS8vIElmIHRoZSBmaXJzdCBlbnRyeSwgaXQncyB0aGUgcm9vdC4uLiBEb24ndCBjbG9uZSBpdCEKCQkJJHJhTGlzdFskY250XSA9ICggJGRlcHRoID09IDAgKSA/ICR0b19zYXZlWzBdIDogY2xvbmUgJHRvX3NhdmVbMF07CgkJCSRyYUxpc3RbJGNudF0tPk5vID0gJGNudDsKCQkJJHJhTGlzdFskY250XS0+UHJldlBwcyA9IDB4RkZGRkZGRkY7CgkJCSRyYUxpc3RbJGNudF0tPk5leHRQcHMgPSAweEZGRkZGRkZGOwoJCQkkcmFMaXN0WyRjbnRdLT5EaXJQcHMgID0gc2VsZjo6X3NhdmVQcHNTZXRQbnQoJHJhTGlzdCwgQCRyYUxpc3RbJGNudF0tPmNoaWxkcmVuLCAkZGVwdGgrKyk7CgkJfSBlbHNlIHsKCQkJJGlQb3MgID0gZmxvb3IoY291bnQoJHRvX3NhdmUpIC8gMik7CgkJCSRhUHJldiA9IGFycmF5X3NsaWNlKCR0b19zYXZlLCAwLCAkaVBvcyk7CgkJCSRhTmV4dCA9IGFycmF5X3NsaWNlKCR0b19zYXZlLCAkaVBvcyArIDEpOwoJCQkkY250ICAgPSBjb3VudCgkcmFMaXN0KTsKCQkJLy8gSWYgdGhlIGZpcnN0IGVudHJ5LCBpdCdzIHRoZSByb290Li4uIERvbid0IGNsb25lIGl0IQoJCQkkcmFMaXN0WyRjbnRdID0gKCAkZGVwdGggPT0gMCApID8gJHRvX3NhdmVbJGlQb3NdIDogY2xvbmUgJHRvX3NhdmVbJGlQb3NdOwoJCQkkcmFMaXN0WyRjbnRdLT5ObyA9ICRjbnQ7CgkJCSRyYUxpc3RbJGNudF0tPlByZXZQcHMgPSBzZWxmOjpfc2F2ZVBwc1NldFBudCgkcmFMaXN0LCAkYVByZXYsICRkZXB0aCsrKTsKCQkJJHJhTGlzdFskY250XS0+TmV4dFBwcyA9IHNlbGY6Ol9zYXZlUHBzU2V0UG50KCRyYUxpc3QsICRhTmV4dCwgJGRlcHRoKyspOwoJCQkkcmFMaXN0WyRjbnRdLT5EaXJQcHMgID0gc2VsZjo6X3NhdmVQcHNTZXRQbnQoJHJhTGlzdCwgQCRyYUxpc3RbJGNudF0tPmNoaWxkcmVuLCAkZGVwdGgrKyk7CgoJCX0KCQlyZXR1cm4gJGNudDsKCX0KfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Shared/OLE/PPS/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Shared/OLE/PPS/File.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyogdmltOiBzZXQgZXhwYW5kdGFiIHRhYnN0b3A9NCBzaGlmdHdpZHRoPTQ6ICovCi8vICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwovLyB8IFBIUCBWZXJzaW9uIDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLy8gKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi8vIHwgQ29weXJpZ2h0IChjKSAxOTk3LTIwMDIgVGhlIFBIUCBHcm91cCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAovLyArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLy8gfCBUaGlzIHNvdXJjZSBmaWxlIGlzIHN1YmplY3QgdG8gdmVyc2lvbiAyLjAyIG9mIHRoZSBQSFAgbGljZW5zZSwgICAgICB8Ci8vIHwgdGhhdCBpcyBidW5kbGVkIHdpdGggdGhpcyBwYWNrYWdlIGluIHRoZSBmaWxlIExJQ0VOU0UsIGFuZCBpcyAgICAgICAgfAovLyB8IGF2YWlsYWJsZSBhdCB0aHJvdWdoIHRoZSB3b3JsZC13aWRlLXdlYiBhdCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLy8gfCBodHRwOi8vd3d3LnBocC5uZXQvbGljZW5zZS8yXzAyLnR4dC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci8vIHwgSWYgeW91IGRpZCBub3QgcmVjZWl2ZSBhIGNvcHkgb2YgdGhlIFBIUCBsaWNlbnNlIGFuZCBhcmUgdW5hYmxlIHRvICAgfAovLyB8IG9idGFpbiBpdCB0aHJvdWdoIHRoZSB3b3JsZC13aWRlLXdlYiwgcGxlYXNlIHNlbmQgYSBub3RlIHRvICAgICAgICAgIHwKLy8gfCBsaWNlbnNlQHBocC5uZXQgc28gd2UgY2FuIG1haWwgeW91IGEgY29weSBpbW1lZGlhdGVseS4gICAgICAgICAgICAgICB8Ci8vICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwovLyB8IEF1dGhvcjogWGF2aWVyIE5vZ3VlciA8eG5vZ3VlckBwaHAubmV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLy8gfCBCYXNlZCBvbiBPTEU6OlN0b3JhZ2VfTGl0ZSBieSBLYXdhaSwgVGFrYW5vcmkgICAgICAgICAgICAgICAgICAgICAgICB8Ci8vICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwovLwovLyAkSWQ6IEZpbGUucGhwLHYgMS4xMSAyMDA3LzAyLzEzIDIxOjAwOjQyIHNjaG1pZHQgRXhwICQKCgovKioKKiBDbGFzcyBmb3IgY3JlYXRpbmcgRmlsZSBQUFMncyBmb3IgT0xFIGNvbnRhaW5lcnMKKgoqIEBhdXRob3IgICBYYXZpZXIgTm9ndWVyIDx4bm9ndWVyQHBocC5uZXQ+CiogQGNhdGVnb3J5IFBIUEV4Y2VsCiogQHBhY2thZ2UgIFBIUEV4Y2VsX1NoYXJlZF9PTEUKKi8KY2xhc3MgUEhQRXhjZWxfU2hhcmVkX09MRV9QUFNfRmlsZSBleHRlbmRzIFBIUEV4Y2VsX1NoYXJlZF9PTEVfUFBTCgl7CgkvKioKCSogVGhlIGNvbnN0cnVjdG9yCgkqCgkqIEBhY2Nlc3MgcHVibGljCgkqIEBwYXJhbSBzdHJpbmcgJG5hbWUgVGhlIG5hbWUgb2YgdGhlIGZpbGUgKGluIFVuaWNvZGUpCgkqIEBzZWUgT0xFOjpBc2MyVWNzKCkKCSovCglwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJG5hbWUpCgl7CgkJcGFyZW50OjpfX2NvbnN0cnVjdCgKCQkJbnVsbCwKCQkJJG5hbWUsCgkJCVBIUEV4Y2VsX1NoYXJlZF9PTEU6Ok9MRV9QUFNfVFlQRV9GSUxFLAoJCQludWxsLAoJCQludWxsLAoJCQludWxsLAoJCQludWxsLAoJCQludWxsLAoJCQknJywKCQkJYXJyYXkoKSk7Cgl9CgoJLyoqCgkqIEluaXRpYWxpemF0aW9uIG1ldGhvZC4gSGFzIHRvIGJlIGNhbGxlZCByaWdodCBhZnRlciBPTEVfUFBTX0ZpbGUoKS4KCSoKCSogQGFjY2VzcyBwdWJsaWMKCSogQHJldHVybiBtaXhlZCB0cnVlIG9uIHN1Y2Nlc3MKCSovCglwdWJsaWMgZnVuY3Rpb24gaW5pdCgpCgl7CgkJcmV0dXJuIHRydWU7Cgl9CgoJLyoqCgkqIEFwcGVuZCBkYXRhIHRvIFBQUwoJKgoJKiBAYWNjZXNzIHB1YmxpYwoJKiBAcGFyYW0gc3RyaW5nICRkYXRhIFRoZSBkYXRhIHRvIGFwcGVuZAoJKi8KCXB1YmxpYyBmdW5jdGlvbiBhcHBlbmQoJGRhdGEpCgl7CgkJJHRoaXMtPl9kYXRhIC49ICRkYXRhOwoJfQoKCS8qKgoJICogUmV0dXJucyBhIHN0cmVhbSBmb3IgcmVhZGluZyB0aGlzIGZpbGUgdXNpbmcgZnJlYWQoKSBldGMuCgkgKiBAcmV0dXJuICByZXNvdXJjZSAgYSByZWFkLW9ubHkgc3RyZWFtCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRTdHJlYW0oKQoJewoJCSR0aGlzLT5vbGUtPmdldFN0cmVhbSgkdGhpcyk7Cgl9Cn0K]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Shared/OLE/PPS/Root.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyogdmltOiBzZXQgZXhwYW5kdGFiIHRhYnN0b3A9NCBzaGlmdHdpZHRoPTQ6ICovCi8vICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwovLyB8IFBIUCBWZXJzaW9uIDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLy8gKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi8vIHwgQ29weXJpZ2h0IChjKSAxOTk3LTIwMDIgVGhlIFBIUCBHcm91cCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAovLyArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLy8gfCBUaGlzIHNvdXJjZSBmaWxlIGlzIHN1YmplY3QgdG8gdmVyc2lvbiAyLjAyIG9mIHRoZSBQSFAgbGljZW5zZSwgICAgICB8Ci8vIHwgdGhhdCBpcyBidW5kbGVkIHdpdGggdGhpcyBwYWNrYWdlIGluIHRoZSBmaWxlIExJQ0VOU0UsIGFuZCBpcyAgICAgICAgfAovLyB8IGF2YWlsYWJsZSBhdCB0aHJvdWdoIHRoZSB3b3JsZC13aWRlLXdlYiBhdCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLy8gfCBodHRwOi8vd3d3LnBocC5uZXQvbGljZW5zZS8yXzAyLnR4dC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci8vIHwgSWYgeW91IGRpZCBub3QgcmVjZWl2ZSBhIGNvcHkgb2YgdGhlIFBIUCBsaWNlbnNlIGFuZCBhcmUgdW5hYmxlIHRvICAgfAovLyB8IG9idGFpbiBpdCB0aHJvdWdoIHRoZSB3b3JsZC13aWRlLXdlYiwgcGxlYXNlIHNlbmQgYSBub3RlIHRvICAgICAgICAgIHwKLy8gfCBsaWNlbnNlQHBocC5uZXQgc28gd2UgY2FuIG1haWwgeW91IGEgY29weSBpbW1lZGlhdGVseS4gICAgICAgICAgICAgICB8Ci8vICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwovLyB8IEF1dGhvcjogWGF2aWVyIE5vZ3VlciA8eG5vZ3VlckBwaHAubmV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLy8gfCBCYXNlZCBvbiBPTEU6OlN0b3JhZ2VfTGl0ZSBieSBLYXdhaSwgVGFrYW5vcmkgICAgICAgICAgICAgICAgICAgICAgICB8Ci8vICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwovLwovLyAkSWQ6IFJvb3QucGhwLHYgMS45IDIwMDUvMDQvMjMgMjE6NTM6NDkgZHVmdXogRXhwICQKCgovKioKKiBDbGFzcyBmb3IgY3JlYXRpbmcgUm9vdCBQUFMncyBmb3IgT0xFIGNvbnRhaW5lcnMKKgoqIEBhdXRob3IgICBYYXZpZXIgTm9ndWVyIDx4bm9ndWVyQHBocC5uZXQ+CiogQGNhdGVnb3J5IFBIUEV4Y2VsCiogQHBhY2thZ2UgIFBIUEV4Y2VsX1NoYXJlZF9PTEUKKi8KY2xhc3MgUEhQRXhjZWxfU2hhcmVkX09MRV9QUFNfUm9vdCBleHRlbmRzIFBIUEV4Y2VsX1NoYXJlZF9PTEVfUFBTCgl7CgoJLyoqCgkgKiBEaXJlY3RvcnkgZm9yIHRlbXBvcmFyeSBmaWxlcwoJICogQHZhciBzdHJpbmcKCSAqLwoJcHJvdGVjdGVkICRfdG1wX2RpcgkJPSBOVUxMOwoKCS8qKgoJICogQHBhcmFtIGludGVnZXIgJHRpbWVfMXN0IEEgdGltZXN0YW1wCgkgKiBAcGFyYW0gaW50ZWdlciAkdGltZV8ybmQgQSB0aW1lc3RhbXAKCSAqLwoJcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCR0aW1lXzFzdCwgJHRpbWVfMm5kLCAkcmFDaGlsZCkKCXsKCQkkdGhpcy0+X3RlbXBEaXIgPSBQSFBFeGNlbF9TaGFyZWRfRmlsZTo6c3lzX2dldF90ZW1wX2RpcigpOwoKCQlwYXJlbnQ6Ol9fY29uc3RydWN0KAoJCSAgIG51bGwsCgkJICAgUEhQRXhjZWxfU2hhcmVkX09MRTo6QXNjMlVjcygnUm9vdCBFbnRyeScpLAoJCSAgIFBIUEV4Y2VsX1NoYXJlZF9PTEU6Ok9MRV9QUFNfVFlQRV9ST09ULAoJCSAgIG51bGwsCgkJICAgbnVsbCwKCQkgICBudWxsLAoJCSAgICR0aW1lXzFzdCwKCQkgICAkdGltZV8ybmQsCgkJICAgbnVsbCwKCQkgICAkcmFDaGlsZCk7Cgl9CgoJLyoqCgkqIE1ldGhvZCBmb3Igc2F2aW5nIHRoZSB3aG9sZSBPTEUgY29udGFpbmVyIChpbmNsdWRpbmcgZmlsZXMpLgoJKiBJbiBmYWN0LCBpZiBjYWxsZWQgd2l0aCBhbiBlbXB0eSBhcmd1bWVudCAob3IgJy0nKSwgaXQgc2F2ZXMgdG8gYQoJKiB0ZW1wb3JhcnkgZmlsZSBhbmQgdGhlbiBvdXRwdXRzIGl0J3MgY29udGVudHMgdG8gc3Rkb3V0LgoJKiBJZiBhIHJlc291cmNlIHBvaW50ZXIgdG8gYSBzdHJlYW0gY3JlYXRlZCBieSBmb3BlbigpIGlzIHBhc3NlZAoJKiBpdCB3aWxsIGJlIHVzZWQsIGJ1dCB5b3UgaGF2ZSB0byBjbG9zZSBzdWNoIHN0cmVhbSBieSB5b3Vyc2VsZi4KCSoKCSogQHBhcmFtIHN0cmluZ3xyZXNvdXJjZSAkZmlsZW5hbWUgVGhlIG5hbWUgb2YgdGhlIGZpbGUgb3Igc3RyZWFtIHdoZXJlIHRvIHNhdmUgdGhlIE9MRSBjb250YWluZXIuCgkqIEBhY2Nlc3MgcHVibGljCgkqIEByZXR1cm4gbWl4ZWQgdHJ1ZSBvbiBzdWNjZXNzCgkqLwoJcHVibGljIGZ1bmN0aW9uIHNhdmUoJGZpbGVuYW1lKQoJewoJCS8vIEluaXRpYWwgU2V0dGluZyBmb3Igc2F2aW5nCgkJJHRoaXMtPl9CSUdfQkxPQ0tfU0laRSAgPSBwb3coMiwKCQkJCQkgICgoaXNzZXQoJHRoaXMtPl9CSUdfQkxPQ0tfU0laRSkpPyBzZWxmOjpfYWRqdXN0MigkdGhpcy0+X0JJR19CTE9DS19TSVpFKSAgOiA5KSk7CgkJJHRoaXMtPl9TTUFMTF9CTE9DS19TSVpFPSBwb3coMiwKCQkJCQkgICgoaXNzZXQoJHRoaXMtPl9TTUFMTF9CTE9DS19TSVpFKSk/ICBzZWxmOjpfYWRqdXN0MigkdGhpcy0+X1NNQUxMX0JMT0NLX1NJWkUpOiA2KSk7CgoJCWlmIChpc19yZXNvdXJjZSgkZmlsZW5hbWUpKSB7CgkJICAgICR0aGlzLT5fRklMRUhfID0gJGZpbGVuYW1lOwoJCX0gZWxzZSBpZiAoJGZpbGVuYW1lID09ICctJyB8fCAkZmlsZW5hbWUgPT0gJycpIHsNCgkJCWlmICgkdGhpcy0+X3RtcF9kaXIgPT09IE5VTEwpDQoJCQkJJHRoaXMtPl90bXBfZGlyID0gUEhQRXhjZWxfU2hhcmVkX0ZpbGU6OnN5c19nZXRfdGVtcF9kaXIoKTsNCgkJCSR0aGlzLT5fdG1wX2ZpbGVuYW1lID0gdGVtcG5hbSgkdGhpcy0+X3RtcF9kaXIsICJPTEVfUFBTX1Jvb3QiKTsNCgkJCSR0aGlzLT5fRklMRUhfID0gZm9wZW4oJHRoaXMtPl90bXBfZmlsZW5hbWUsIncrYiIpOw0KCQkJaWYgKCR0aGlzLT5fRklMRUhfID09IGZhbHNlKSB7DQoJCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbigiQ2FuJ3QgY3JlYXRlIHRlbXBvcmFyeSBmaWxlLiIpOw0KCQkJfQoJCX0gZWxzZSB7CgkJCSR0aGlzLT5fRklMRUhfID0gZm9wZW4oJGZpbGVuYW1lLCAid2IiKTsKCQl9CgkJaWYgKCR0aGlzLT5fRklMRUhfID09IGZhbHNlKSB7CgkJCXRocm93IG5ldyBFeGNlcHRpb24oIkNhbid0IG9wZW4gJGZpbGVuYW1lLiBJdCBtYXkgYmUgaW4gdXNlIG9yIHByb3RlY3RlZC4iKTsKCQl9CgkJLy8gTWFrZSBhbiBhcnJheSBvZiBQUFMncyAoZm9yIFNhdmUpCgkJJGFMaXN0ID0gYXJyYXkoKTsKCQlQSFBFeGNlbF9TaGFyZWRfT0xFX1BQUzo6X3NhdmVQcHNTZXRQbnQoJGFMaXN0LCBhcnJheSgkdGhpcykpOw0KCQkvLyBjYWxjdWxhdGUgdmFsdWVzIGZvciBoZWFkZXIKCQlsaXN0KCRpU0JEY250LCAkaUJCY250LCAkaVBQU2NudCkgPSAkdGhpcy0+X2NhbGNTaXplKCRhTGlzdCk7IC8vLCAkcmhJbmZvKTsKCQkvLyBTYXZlIEhlYWRlcgoJCSR0aGlzLT5fc2F2ZUhlYWRlcigkaVNCRGNudCwgJGlCQmNudCwgJGlQUFNjbnQpOwoKCQkvLyBNYWtlIFNtYWxsIERhdGEgc3RyaW5nICh3cml0ZSBTQkQpCgkJJHRoaXMtPl9kYXRhID0gJHRoaXMtPl9tYWtlU21hbGxEYXRhKCRhTGlzdCk7CgoJCS8vIFdyaXRlIEJCCgkJJHRoaXMtPl9zYXZlQmlnRGF0YSgkaVNCRGNudCwgJGFMaXN0KTsKCQkvLyBXcml0ZSBQUFMKCQkkdGhpcy0+X3NhdmVQcHMoJGFMaXN0KTsKCQkvLyBXcml0ZSBCaWcgQmxvY2sgRGVwb3QgYW5kIEJETGlzdCBhbmQgQWRkaW5nIEhlYWRlciBpbmZvcm1hdGlvbnMKCQkkdGhpcy0+X3NhdmVCYmQoJGlTQkRjbnQsICRpQkJjbnQsICRpUFBTY250KTsKCgkJaWYgKCFpc19yZXNvdXJjZSgkZmlsZW5hbWUpKSB7CiAJCQlmY2xvc2UoJHRoaXMtPl9GSUxFSF8pOwogCQl9CgoJCXJldHVybiB0cnVlOwoJfQoKCS8qKgoJKiBDYWxjdWxhdGUgc29tZSBudW1iZXJzCgkqCgkqIEBhY2Nlc3MgcHVibGljCgkqIEBwYXJhbSBhcnJheSAkcmFMaXN0IFJlZmVyZW5jZSB0byBhbiBhcnJheSBvZiBQUFMncwoJKiBAcmV0dXJuIGFycmF5IFRoZSBhcnJheSBvZiBudW1iZXJzCgkqLwoJcHVibGljIGZ1bmN0aW9uIF9jYWxjU2l6ZSgmJHJhTGlzdCkKCXsKCQkvLyBDYWxjdWxhdGUgQmFzaWMgU2V0dGluZwoJCWxpc3QoJGlTQkRjbnQsICRpQkJjbnQsICRpUFBTY250KSA9IGFycmF5KDAsMCwwKTsKCQkkaVNtYWxsTGVuID0gMDsKCQkkaVNCY250ID0gMDsKCQkkaUNvdW50ID0gY291bnQoJHJhTGlzdCk7CgkJZm9yICgkaSA9IDA7ICRpIDwgJGlDb3VudDsgKyskaSkgewoJCQlpZiAoJHJhTGlzdFskaV0tPlR5cGUgPT0gUEhQRXhjZWxfU2hhcmVkX09MRTo6T0xFX1BQU19UWVBFX0ZJTEUpIHsKCQkJCSRyYUxpc3RbJGldLT5TaXplID0gJHJhTGlzdFskaV0tPl9EYXRhTGVuKCk7CgkJCQlpZiAoJHJhTGlzdFskaV0tPlNpemUgPCBQSFBFeGNlbF9TaGFyZWRfT0xFOjpPTEVfREFUQV9TSVpFX1NNQUxMKSB7CgkJCQkJJGlTQmNudCArPSBmbG9vcigkcmFMaXN0WyRpXS0+U2l6ZSAvICR0aGlzLT5fU01BTExfQkxPQ0tfU0laRSkKCQkJCQkJCQkgICsgKCgkcmFMaXN0WyRpXS0+U2l6ZSAlICR0aGlzLT5fU01BTExfQkxPQ0tfU0laRSk/IDE6IDApOwoJCQkJfSBlbHNlIHsKCQkJCQkkaUJCY250ICs9IChmbG9vcigkcmFMaXN0WyRpXS0+U2l6ZSAvICR0aGlzLT5fQklHX0JMT0NLX1NJWkUpICsKCQkJCQkJKCgkcmFMaXN0WyRpXS0+U2l6ZSAlICR0aGlzLT5fQklHX0JMT0NLX1NJWkUpPyAxOiAwKSk7CgkJCQl9CgkJCX0KCQl9CgkJJGlTbWFsbExlbiA9ICRpU0JjbnQgKiAkdGhpcy0+X1NNQUxMX0JMT0NLX1NJWkU7CgkJJGlTbENudCA9IGZsb29yKCR0aGlzLT5fQklHX0JMT0NLX1NJWkUgLyBQSFBFeGNlbF9TaGFyZWRfT0xFOjpPTEVfTE9OR19JTlRfU0laRSk7CgkJJGlTQkRjbnQgPSBmbG9vcigkaVNCY250IC8gJGlTbENudCkgKyAoKCRpU0JjbnQgJSAkaVNsQ250KT8gMTowKTsKCQkkaUJCY250ICs9ICAoZmxvb3IoJGlTbWFsbExlbiAvICR0aGlzLT5fQklHX0JMT0NLX1NJWkUpICsKCQkJCQkgICgoICRpU21hbGxMZW4gJSAkdGhpcy0+X0JJR19CTE9DS19TSVpFKT8gMTogMCkpOwoJCSRpQ250ID0gY291bnQoJHJhTGlzdCk7CgkJJGlCZENudCA9ICR0aGlzLT5fQklHX0JMT0NLX1NJWkUgLyBQSFBFeGNlbF9TaGFyZWRfT0xFOjpPTEVfUFBTX1NJWkU7CgkJJGlQUFNjbnQgPSAoZmxvb3IoJGlDbnQvJGlCZENudCkgKyAoKCRpQ250ICUgJGlCZENudCk/IDE6IDApKTsKCgkJcmV0dXJuIGFycmF5KCRpU0JEY250LCAkaUJCY250LCAkaVBQU2NudCk7Cgl9CgoJLyoqCgkqIEhlbHBlciBmdW5jdGlvbiBmb3IgY2FjdWxhdGluZyBhIG1hZ2ljIHZhbHVlIGZvciBibG9jayBzaXplcwoJKgoJKiBAYWNjZXNzIHB1YmxpYwoJKiBAcGFyYW0gaW50ZWdlciAkaTIgVGhlIGFyZ3VtZW50CgkqIEBzZWUgc2F2ZSgpCgkqIEByZXR1cm4gaW50ZWdlcgoJKi8KCXByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIF9hZGp1c3QyKCRpMikKCXsKCQkkaVdrID0gbG9nKCRpMikvbG9nKDIpOwoJCXJldHVybiAoJGlXayA+IGZsb29yKCRpV2spKT8gZmxvb3IoJGlXaykrMTokaVdrOwoJfQoKCS8qKgoJKiBTYXZlIE9MRSBoZWFkZXIKCSoKCSogQGFjY2VzcyBwdWJsaWMKCSogQHBhcmFtIGludGVnZXIgJGlTQkRjbnQKCSogQHBhcmFtIGludGVnZXIgJGlCQmNudAoJKiBAcGFyYW0gaW50ZWdlciAkaVBQU2NudAoJKi8KCXB1YmxpYyBmdW5jdGlvbiBfc2F2ZUhlYWRlcigkaVNCRGNudCwgJGlCQmNudCwgJGlQUFNjbnQpCgl7CgkJJEZJTEUgPSAkdGhpcy0+X0ZJTEVIXzsKCgkJLy8gQ2FsY3VsYXRlIEJhc2ljIFNldHRpbmcKCQkkaUJsQ250ID0gJHRoaXMtPl9CSUdfQkxPQ0tfU0laRSAvIFBIUEV4Y2VsX1NoYXJlZF9PTEU6Ok9MRV9MT05HX0lOVF9TSVpFOwoJCSRpMXN0QmRMID0gKCR0aGlzLT5fQklHX0JMT0NLX1NJWkUgLSAweDRDKSAvIFBIUEV4Y2VsX1NoYXJlZF9PTEU6Ok9MRV9MT05HX0lOVF9TSVpFOwoKCQkkaUJkRXhMID0gMDsKCQkkaUFsbCA9ICRpQkJjbnQgKyAkaVBQU2NudCArICRpU0JEY250OwoJCSRpQWxsVyA9ICRpQWxsOwoJCSRpQmRDbnRXID0gZmxvb3IoJGlBbGxXIC8gJGlCbENudCkgKyAoKCRpQWxsVyAlICRpQmxDbnQpPyAxOiAwKTsKCQkkaUJkQ250ID0gZmxvb3IoKCRpQWxsICsgJGlCZENudFcpIC8gJGlCbENudCkgKyAoKCgkaUFsbFcrJGlCZENudFcpICUgJGlCbENudCk/IDE6IDApOwoKCQkvLyBDYWxjdWxhdGUgQkQgY291bnQKCQlpZiAoJGlCZENudCA+ICRpMXN0QmRMKSB7CgkJCXdoaWxlICgxKSB7CgkJCQkrKyRpQmRFeEw7CgkJCQkrKyRpQWxsVzsKCQkJCSRpQmRDbnRXID0gZmxvb3IoJGlBbGxXIC8gJGlCbENudCkgKyAoKCRpQWxsVyAlICRpQmxDbnQpPyAxOiAwKTsKCQkJCSRpQmRDbnQgPSBmbG9vcigoJGlBbGxXICsgJGlCZENudFcpIC8gJGlCbENudCkgKyAoKCgkaUFsbFcrJGlCZENudFcpICUgJGlCbENudCk/IDE6IDApOwoJCQkJaWYgKCRpQmRDbnQgPD0gKCRpQmRFeEwqJGlCbENudCsgJGkxc3RCZEwpKSB7CgkJCQkJYnJlYWs7CgkJCQl9CgkJCX0KCQl9CgoJCS8vIFNhdmUgSGVhZGVyCgkJZndyaXRlKCRGSUxFLAoJCQkJIlx4RDBceENGXHgxMVx4RTBceEExXHhCMVx4MUFceEUxIgoJCQkJLiAiXHgwMFx4MDBceDAwXHgwMCIKCQkJCS4gIlx4MDBceDAwXHgwMFx4MDAiCgkJCQkuICJceDAwXHgwMFx4MDBceDAwIgoJCQkJLiAiXHgwMFx4MDBceDAwXHgwMCIKCQkJCS4gcGFjaygidiIsIDB4M2IpCgkJCQkuIHBhY2soInYiLCAweDAzKQoJCQkJLiBwYWNrKCJ2IiwgLTIpCgkJCQkuIHBhY2soInYiLCA5KQoJCQkJLiBwYWNrKCJ2IiwgNikKCQkJCS4gcGFjaygidiIsIDApCgkJCQkuICJceDAwXHgwMFx4MDBceDAwIgoJCQkJLiAiXHgwMFx4MDBceDAwXHgwMCIKCQkJCS4gcGFjaygiViIsICRpQmRDbnQpCgkJCQkuIHBhY2soIlYiLCAkaUJCY250KyRpU0JEY250KSAvL1JPT1QgU1RBUlQKCQkJCS4gcGFjaygiViIsIDApCgkJCQkuIHBhY2soIlYiLCAweDEwMDApCgkJCQkuIHBhY2soIlYiLCAkaVNCRGNudCA/IDAgOiAtMikgICAgICAgICAgICAgICAgICAvL1NtYWxsIEJsb2NrIERlcG90CgkJCQkuIHBhY2soIlYiLCAkaVNCRGNudCkKCQkgICk7CgkJLy8gRXh0cmEgQkRMaXN0IFN0YXJ0LCBDb3VudAoJCWlmICgkaUJkQ250IDwgJGkxc3RCZEwpIHsKCQkJZndyaXRlKCRGSUxFLAoJCQkJCXBhY2soIlYiLCAtMikgICAgICAvLyBFeHRyYSBCRExpc3QgU3RhcnQKCQkJCQkuIHBhY2soIlYiLCAwKSAgICAgICAgLy8gRXh0cmEgQkRMaXN0IENvdW50CgkJCQkgICk7CgkJfSBlbHNlIHsKCQkJZndyaXRlKCRGSUxFLCBwYWNrKCJWIiwgJGlBbGwrJGlCZENudCkgLiBwYWNrKCJWIiwgJGlCZEV4TCkpOwoJCX0KCgkJLy8gQkRMaXN0CgkJZm9yICgkaSA9IDA7ICRpIDwgJGkxc3RCZEwgJiYgJGkgPCAkaUJkQ250OyArKyRpKSB7CgkJCWZ3cml0ZSgkRklMRSwgcGFjaygiViIsICRpQWxsKyRpKSk7CgkJfQoJCWlmICgkaSA8ICRpMXN0QmRMKSB7CgkJCSRqQiA9ICRpMXN0QmRMIC0gJGk7CgkJCWZvciAoJGogPSAwOyAkaiA8ICRqQjsgKyskaikgewoJCQkJZndyaXRlKCRGSUxFLCAocGFjaygiViIsIC0xKSkpOwoJCQl9CgkJfQoJfQoKCS8qKgoJKiBTYXZpbmcgYmlnIGRhdGEgKFBQUydzIHdpdGggZGF0YSBiaWdnZXIgdGhhbiBQSFBFeGNlbF9TaGFyZWRfT0xFOjpPTEVfREFUQV9TSVpFX1NNQUxMKQoJKgoJKiBAYWNjZXNzIHB1YmxpYwoJKiBAcGFyYW0gaW50ZWdlciAkaVN0QmxrCgkqIEBwYXJhbSBhcnJheSAmJHJhTGlzdCBSZWZlcmVuY2UgdG8gYXJyYXkgb2YgUFBTJ3MKCSovCglwdWJsaWMgZnVuY3Rpb24gX3NhdmVCaWdEYXRhKCRpU3RCbGssICYkcmFMaXN0KQoJewoJCSRGSUxFID0gJHRoaXMtPl9GSUxFSF87CgoJCS8vIGN5Y2xlIHRocm91Z2ggUFBTJ3MKCQkkaUNvdW50ID0gY291bnQoJHJhTGlzdCk7CgkJZm9yICgkaSA9IDA7ICRpIDwgJGlDb3VudDsgKyskaSkgewoJCQlpZiAoJHJhTGlzdFskaV0tPlR5cGUgIT0gUEhQRXhjZWxfU2hhcmVkX09MRTo6T0xFX1BQU19UWVBFX0RJUikgewoJCQkJJHJhTGlzdFskaV0tPlNpemUgPSAkcmFMaXN0WyRpXS0+X0RhdGFMZW4oKTsKCQkJCWlmICgoJHJhTGlzdFskaV0tPlNpemUgPj0gUEhQRXhjZWxfU2hhcmVkX09MRTo6T0xFX0RBVEFfU0laRV9TTUFMTCkgfHwKCQkJCQkoKCRyYUxpc3RbJGldLT5UeXBlID09IFBIUEV4Y2VsX1NoYXJlZF9PTEU6Ok9MRV9QUFNfVFlQRV9ST09UKSAmJiBpc3NldCgkcmFMaXN0WyRpXS0+X2RhdGEpKSkKCQkJCXsKCQkJCQkvLyBXcml0ZSBEYXRhCgkJCQkJLy9pZiAoaXNzZXQoJHJhTGlzdFskaV0tPl9QUFNfRklMRSkpIHsKCQkJCQkvLwkkaUxlbiA9IDA7CgkJCQkJLy8JZnNlZWsoJHJhTGlzdFskaV0tPl9QUFNfRklMRSwgMCk7IC8vIFRvIFRoZSBUb3AKCQkJCQkvLwl3aGlsZSgkc0J1ZmYgPSBmcmVhZCgkcmFMaXN0WyRpXS0+X1BQU19GSUxFLCA0MDk2KSkgewoJCQkJCS8vCQkkaUxlbiArPSBzdHJsZW4oJHNCdWZmKTsKCQkJCQkvLwkJZndyaXRlKCRGSUxFLCAkc0J1ZmYpOwoJCQkJCS8vCX0KCQkJCQkvL30gZWxzZSB7CgkJCQkJCWZ3cml0ZSgkRklMRSwgJHJhTGlzdFskaV0tPl9kYXRhKTsKCQkJCQkvL30KCgkJCQkJaWYgKCRyYUxpc3RbJGldLT5TaXplICUgJHRoaXMtPl9CSUdfQkxPQ0tfU0laRSkgewoJCQkJCQlmd3JpdGUoJEZJTEUsIHN0cl9yZXBlYXQoIlx4MDAiLCAkdGhpcy0+X0JJR19CTE9DS19TSVpFIC0gKCRyYUxpc3RbJGldLT5TaXplICUgJHRoaXMtPl9CSUdfQkxPQ0tfU0laRSkpKTsKCQkJCQl9CgkJCQkJLy8gU2V0IEZvciBQUFMKCQkJCQkkcmFMaXN0WyRpXS0+X1N0YXJ0QmxvY2sgPSAkaVN0QmxrOwoJCQkJCSRpU3RCbGsgKz0KCQkJCQkJCShmbG9vcigkcmFMaXN0WyRpXS0+U2l6ZSAvICR0aGlzLT5fQklHX0JMT0NLX1NJWkUpICsKCQkJCQkJCQkoKCRyYUxpc3RbJGldLT5TaXplICUgJHRoaXMtPl9CSUdfQkxPQ0tfU0laRSk/IDE6IDApKTsKCQkJCX0KCQkJCS8vIENsb3NlIGZpbGUgZm9yIGVhY2ggUFBTLCBhbmQgdW5saW5rIGl0CgkJCQkvL2lmIChpc3NldCgkcmFMaXN0WyRpXS0+X1BQU19GSUxFKSkgewoJCQkJLy8JZmNsb3NlKCRyYUxpc3RbJGldLT5fUFBTX0ZJTEUpOwoJCQkJLy8JJHJhTGlzdFskaV0tPl9QUFNfRklMRSA9IG51bGw7CgkJCQkvLwl1bmxpbmsoJHJhTGlzdFskaV0tPl90bXBfZmlsZW5hbWUpOwoJCQkJLy99CgkJCX0KCQl9Cgl9CgoJLyoqCgkqIGdldCBzbWFsbCBkYXRhIChQUFMncyB3aXRoIGRhdGEgc21hbGxlciB0aGFuIFBIUEV4Y2VsX1NoYXJlZF9PTEU6Ok9MRV9EQVRBX1NJWkVfU01BTEwpCgkqCgkqIEBhY2Nlc3MgcHVibGljCgkqIEBwYXJhbSBhcnJheSAmJHJhTGlzdCBSZWZlcmVuY2UgdG8gYXJyYXkgb2YgUFBTJ3MKCSovCglwdWJsaWMgZnVuY3Rpb24gX21ha2VTbWFsbERhdGEoJiRyYUxpc3QpCgl7CgkJJHNSZXMgPSAnJzsKCQkkRklMRSA9ICR0aGlzLT5fRklMRUhfOwoJCSRpU21CbGsgPSAwOwoKCQkkaUNvdW50ID0gY291bnQoJHJhTGlzdCk7CgkJZm9yICgkaSA9IDA7ICRpIDwgJGlDb3VudDsgKyskaSkgewoJCQkvLyBNYWtlIFNCRCwgc21hbGwgZGF0YSBzdHJpbmcKCQkJaWYgKCRyYUxpc3RbJGldLT5UeXBlID09IFBIUEV4Y2VsX1NoYXJlZF9PTEU6Ok9MRV9QUFNfVFlQRV9GSUxFKSB7CgkJCQlpZiAoJHJhTGlzdFskaV0tPlNpemUgPD0gMCkgewoJCQkJCWNvbnRpbnVlOwoJCQkJfQoJCQkJaWYgKCRyYUxpc3RbJGldLT5TaXplIDwgUEhQRXhjZWxfU2hhcmVkX09MRTo6T0xFX0RBVEFfU0laRV9TTUFMTCkgewoJCQkJCSRpU21iQ250ID0gZmxvb3IoJHJhTGlzdFskaV0tPlNpemUgLyAkdGhpcy0+X1NNQUxMX0JMT0NLX1NJWkUpCgkJCQkJCQkJICArICgoJHJhTGlzdFskaV0tPlNpemUgJSAkdGhpcy0+X1NNQUxMX0JMT0NLX1NJWkUpPyAxOiAwKTsKCQkJCQkvLyBBZGQgdG8gU0JECgkJCQkJJGpCID0gJGlTbWJDbnQgLSAxOwoJCQkJCWZvciAoJGogPSAwOyAkaiA8ICRqQjsgKyskaikgewoJCQkJCQlmd3JpdGUoJEZJTEUsIHBhY2soIlYiLCAkaiskaVNtQmxrKzEpKTsKCQkJCQl9CgkJCQkJZndyaXRlKCRGSUxFLCBwYWNrKCJWIiwgLTIpKTsKCgkJCQkJLy8vLyBBZGQgdG8gRGF0YSBTdHJpbmcodGhpcyB3aWxsIGJlIHdyaXR0ZW4gZm9yIFJvb3RFbnRyeSkKCQkJCQkvL2lmICgkcmFMaXN0WyRpXS0+X1BQU19GSUxFKSB7CgkJCQkJLy8JZnNlZWsoJHJhTGlzdFskaV0tPl9QUFNfRklMRSwgMCk7IC8vIFRvIFRoZSBUb3AKCQkJCQkvLwl3aGlsZSAoJHNCdWZmID0gZnJlYWQoJHJhTGlzdFskaV0tPl9QUFNfRklMRSwgNDA5NikpIHsKCQkJCQkvLwkJJHNSZXMgLj0gJHNCdWZmOwoJCQkJCS8vCX0KCQkJCQkvL30gZWxzZSB7CgkJCQkJCSRzUmVzIC49ICRyYUxpc3RbJGldLT5fZGF0YTsKCQkJCQkvL30KCQkJCQlpZiAoJHJhTGlzdFskaV0tPlNpemUgJSAkdGhpcy0+X1NNQUxMX0JMT0NLX1NJWkUpIHsKCQkJCQkJJHNSZXMgLj0gc3RyX3JlcGVhdCgiXHgwMCIsJHRoaXMtPl9TTUFMTF9CTE9DS19TSVpFIC0gKCRyYUxpc3RbJGldLT5TaXplICUgJHRoaXMtPl9TTUFMTF9CTE9DS19TSVpFKSk7CgkJCQkJfQoJCQkJCS8vIFNldCBmb3IgUFBTCgkJCQkJJHJhTGlzdFskaV0tPl9TdGFydEJsb2NrID0gJGlTbUJsazsKCQkJCQkkaVNtQmxrICs9ICRpU21iQ250OwoJCQkJfQoJCQl9CgkJfQoJCSRpU2JDbnQgPSBmbG9vcigkdGhpcy0+X0JJR19CTE9DS19TSVpFIC8gUEhQRXhjZWxfU2hhcmVkX09MRTo6T0xFX0xPTkdfSU5UX1NJWkUpOwoJCWlmICgkaVNtQmxrICUgJGlTYkNudCkgewoJCQkkaUIgPSAkaVNiQ250IC0gKCRpU21CbGsgJSAkaVNiQ250KTsKCQkJZm9yICgkaSA9IDA7ICRpIDwgJGlCOyArKyRpKSB7CgkJCQlmd3JpdGUoJEZJTEUsIHBhY2soIlYiLCAtMSkpOwoJCQl9CgkJfQoJCXJldHVybiAkc1JlczsKCX0KCgkvKioKCSogU2F2ZXMgYWxsIHRoZSBQUFMncyBXS3MKCSoKCSogQGFjY2VzcyBwdWJsaWMKCSogQHBhcmFtIGFycmF5ICRyYUxpc3QgUmVmZXJlbmNlIHRvIGFuIGFycmF5IHdpdGggYWxsIFBQUydzCgkqLwoJcHVibGljIGZ1bmN0aW9uIF9zYXZlUHBzKCYkcmFMaXN0KQoJewoJCS8vIFNhdmUgZWFjaCBQUFMgV0sKCQkkaUMgPSBjb3VudCgkcmFMaXN0KTsKCQlmb3IgKCRpID0gMDsgJGkgPCAkaUM7ICsrJGkpIHsKCQkJZndyaXRlKCR0aGlzLT5fRklMRUhfLCAkcmFMaXN0WyRpXS0+X2dldFBwc1drKCkpOwoJCX0KCQkvLyBBZGp1c3QgZm9yIEJsb2NrCgkJJGlDbnQgPSBjb3VudCgkcmFMaXN0KTsKCQkkaUJDbnQgPSAkdGhpcy0+X0JJR19CTE9DS19TSVpFIC8gUEhQRXhjZWxfU2hhcmVkX09MRTo6T0xFX1BQU19TSVpFOwoJCWlmICgkaUNudCAlICRpQkNudCkgewoJCQlmd3JpdGUoJHRoaXMtPl9GSUxFSF8sIHN0cl9yZXBlYXQoIlx4MDAiLCgkaUJDbnQgLSAoJGlDbnQgJSAkaUJDbnQpKSAqIFBIUEV4Y2VsX1NoYXJlZF9PTEU6Ok9MRV9QUFNfU0laRSkpOwoJCX0KCX0KCgkvKioKCSogU2F2aW5nIEJpZyBCbG9jayBEZXBvdAoJKgoJKiBAYWNjZXNzIHB1YmxpYwoJKiBAcGFyYW0gaW50ZWdlciAkaVNiZFNpemUKCSogQHBhcmFtIGludGVnZXIgJGlCc2l6ZQoJKiBAcGFyYW0gaW50ZWdlciAkaVBwc0NudAoJKi8KCXB1YmxpYyBmdW5jdGlvbiBfc2F2ZUJiZCgkaVNiZFNpemUsICRpQnNpemUsICRpUHBzQ250KQoJewoJCSRGSUxFID0gJHRoaXMtPl9GSUxFSF87CgkJLy8gQ2FsY3VsYXRlIEJhc2ljIFNldHRpbmcKCQkkaUJiQ250ID0gJHRoaXMtPl9CSUdfQkxPQ0tfU0laRSAvIFBIUEV4Y2VsX1NoYXJlZF9PTEU6Ok9MRV9MT05HX0lOVF9TSVpFOwoJCSRpMXN0QmRMID0gKCR0aGlzLT5fQklHX0JMT0NLX1NJWkUgLSAweDRDKSAvIFBIUEV4Y2VsX1NoYXJlZF9PTEU6Ok9MRV9MT05HX0lOVF9TSVpFOwoKCQkkaUJkRXhMID0gMDsKCQkkaUFsbCA9ICRpQnNpemUgKyAkaVBwc0NudCArICRpU2JkU2l6ZTsKCQkkaUFsbFcgPSAkaUFsbDsKCQkkaUJkQ250VyA9IGZsb29yKCRpQWxsVyAvICRpQmJDbnQpICsgKCgkaUFsbFcgJSAkaUJiQ250KT8gMTogMCk7CgkJJGlCZENudCA9IGZsb29yKCgkaUFsbCArICRpQmRDbnRXKSAvICRpQmJDbnQpICsgKCgoJGlBbGxXKyRpQmRDbnRXKSAlICRpQmJDbnQpPyAxOiAwKTsKCQkvLyBDYWxjdWxhdGUgQkQgY291bnQKCQlpZiAoJGlCZENudCA+JGkxc3RCZEwpIHsKCQkJd2hpbGUgKDEpIHsKCQkJCSsrJGlCZEV4TDsKCQkJCSsrJGlBbGxXOwoJCQkJJGlCZENudFcgPSBmbG9vcigkaUFsbFcgLyAkaUJiQ250KSArICgoJGlBbGxXICUgJGlCYkNudCk/IDE6IDApOwoJCQkJJGlCZENudCA9IGZsb29yKCgkaUFsbFcgKyAkaUJkQ250VykgLyAkaUJiQ250KSArICgoKCRpQWxsVyskaUJkQ250VykgJSAkaUJiQ250KT8gMTogMCk7CgkJCQlpZiAoJGlCZENudCA8PSAoJGlCZEV4TCokaUJiQ250KyAkaTFzdEJkTCkpIHsKCQkJCQlicmVhazsKCQkJCX0KCQkJfQoJCX0KCgkJLy8gTWFraW5nIEJECgkJLy8gU2V0IGZvciBTQkQKCQlpZiAoJGlTYmRTaXplID4gMCkgewoJCQlmb3IgKCRpID0gMDsgJGkgPCAoJGlTYmRTaXplIC0gMSk7ICsrJGkpIHsKCQkJCWZ3cml0ZSgkRklMRSwgcGFjaygiViIsICRpKzEpKTsKCQkJfQoJCQlmd3JpdGUoJEZJTEUsIHBhY2soIlYiLCAtMikpOwoJCX0KCQkvLyBTZXQgZm9yIEIKCQlmb3IgKCRpID0gMDsgJGkgPCAoJGlCc2l6ZSAtIDEpOyArKyRpKSB7CgkJCWZ3cml0ZSgkRklMRSwgcGFjaygiViIsICRpKyRpU2JkU2l6ZSsxKSk7CgkJfQoJCWZ3cml0ZSgkRklMRSwgcGFjaygiViIsIC0yKSk7CgoJCS8vIFNldCBmb3IgUFBTCgkJZm9yICgkaSA9IDA7ICRpIDwgKCRpUHBzQ250IC0gMSk7ICsrJGkpIHsKCQkJZndyaXRlKCRGSUxFLCBwYWNrKCJWIiwgJGkrJGlTYmRTaXplKyRpQnNpemUrMSkpOwoJCX0KCQlmd3JpdGUoJEZJTEUsIHBhY2soIlYiLCAtMikpOwoJCS8vIFNldCBmb3IgQkJEIGl0c2VsZiAoIDB4RkZGRkZGRkQgOiBCQkQpCgkJZm9yICgkaSA9IDA7ICRpIDwgJGlCZENudDsgKyskaSkgewoJCQlmd3JpdGUoJEZJTEUsIHBhY2soIlYiLCAweEZGRkZGRkZEKSk7CgkJfQoJCS8vIFNldCBmb3IgRXh0cmFCRExpc3QKCQlmb3IgKCRpID0gMDsgJGkgPCAkaUJkRXhMOyArKyRpKSB7CgkJCWZ3cml0ZSgkRklMRSwgcGFjaygiViIsIDB4RkZGRkZGRkMpKTsKCQl9CgkJLy8gQWRqdXN0IGZvciBCbG9jawoJCWlmICgoJGlBbGxXICsgJGlCZENudCkgJSAkaUJiQ250KSB7CgkJCSRpQmxvY2sgPSAoJGlCYkNudCAtICgoJGlBbGxXICsgJGlCZENudCkgJSAkaUJiQ250KSk7CgkJCWZvciAoJGkgPSAwOyAkaSA8ICRpQmxvY2s7ICsrJGkpIHsKCQkJCWZ3cml0ZSgkRklMRSwgcGFjaygiViIsIC0xKSk7CgkJCX0KCQl9CgkJLy8gRXh0cmEgQkRMaXN0CgkJaWYgKCRpQmRDbnQgPiAkaTFzdEJkTCkgewoJCQkkaU49MDsKCQkJJGlOYj0wOwoJCQlmb3IgKCRpID0gJGkxc3RCZEw7JGkgPCAkaUJkQ250OyAkaSsrLCArKyRpTikgewoJCQkJaWYgKCRpTiA+PSAoJGlCYkNudCAtIDEpKSB7CgkJCQkJJGlOID0gMDsKCQkJCQkrKyRpTmI7CgkJCQkJZndyaXRlKCRGSUxFLCBwYWNrKCJWIiwgJGlBbGwrJGlCZENudCskaU5iKSk7CgkJCQl9CgkJCQlmd3JpdGUoJEZJTEUsIHBhY2soIlYiLCAkaUJzaXplKyRpU2JkU2l6ZSskaVBwc0NudCskaSkpOwoJCQl9CgkJCWlmICgoJGlCZENudC0kaTFzdEJkTCkgJSAoJGlCYkNudC0xKSkgewoJCQkJJGlCID0gKCRpQmJDbnQgLSAxKSAtICgoJGlCZENudCAtICRpMXN0QmRMKSAlICgkaUJiQ250IC0gMSkpOwoJCQkJZm9yICgkaSA9IDA7ICRpIDwgJGlCOyArKyRpKSB7CgkJCQkJZndyaXRlKCRGSUxFLCBwYWNrKCJWIiwgLTEpKTsKCQkJCX0KCQkJfQoJCQlmd3JpdGUoJEZJTEUsIHBhY2soIlYiLCAtMikpOwoJCX0KCX0KfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Shared/OLERead.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIFBIUEV4Y2VsCiAqCiAqIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICoKICogQGNhdGVnb3J5ICAgUEhQRXhjZWwKICogQHBhY2thZ2UgICAgUEhQRXhjZWxfU2hhcmVkCiAqIEBjb3B5cmlnaHQgIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwgKGh0dHA6Ly93d3cuY29kZXBsZXguY29tL1BIUEV4Y2VsKQogKiBAbGljZW5zZSAgICBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvb2xkLWxpY2Vuc2VzL2xncGwtMi4xLnR4dAlMR1BMCiAqIEB2ZXJzaW9uICAgIDEuNy43LCAyMDEyLTA1LTE5CiAqLwoKZGVmaW5lKCdJREVOVElGSUVSX09MRScsIHBhY2soJ0NDQ0NDQ0NDJywgMHhkMCwgMHhjZiwgMHgxMSwgMHhlMCwgMHhhMSwgMHhiMSwgMHgxYSwgMHhlMSkpOwoKY2xhc3MgUEhQRXhjZWxfU2hhcmVkX09MRVJlYWQgewoJcHJpdmF0ZSAkZGF0YSA9ICcnOwoKCS8vIE9MRSBpZGVudGlmaWVyCgljb25zdCBJREVOVElGSUVSX09MRSA9IElERU5USUZJRVJfT0xFOwoKCS8vIFNpemUgb2YgYSBzZWN0b3IgPSA1MTIgYnl0ZXMKCWNvbnN0IEJJR19CTE9DS19TSVpFCQkJCQk9IDB4MjAwOwoKCS8vIFNpemUgb2YgYSBzaG9ydCBzZWN0b3IgPSA2NCBieXRlcwoJY29uc3QgU01BTExfQkxPQ0tfU0laRQkJCQkJPSAweDQwOwoKCS8vIFNpemUgb2YgYSBkaXJlY3RvcnkgZW50cnkgYWx3YXlzID0gMTI4IGJ5dGVzCgljb25zdCBQUk9QRVJUWV9TVE9SQUdFX0JMT0NLX1NJWkUJCT0gMHg4MDsKCgkvLyBNaW5pbXVtIHNpemUgb2YgYSBzdGFuZGFyZCBzdHJlYW0gPSA0MDk2IGJ5dGVzLCBzdHJlYW1zIHNtYWxsZXIgdGhhbiB0aGlzIGFyZSBzdG9yZWQgYXMgc2hvcnQgc3RyZWFtcwoJY29uc3QgU01BTExfQkxPQ0tfVEhSRVNIT0xECQkJCT0gMHgxMDAwOwoKCS8vIGhlYWRlciBvZmZzZXRzCgljb25zdCBOVU1fQklHX0JMT0NLX0RFUE9UX0JMT0NLU19QT1MJPSAweDJjOwoJY29uc3QgUk9PVF9TVEFSVF9CTE9DS19QT1MJCQkJPSAweDMwOwoJY29uc3QgU01BTExfQkxPQ0tfREVQT1RfQkxPQ0tfUE9TCQk9IDB4M2M7Cgljb25zdCBFWFRFTlNJT05fQkxPQ0tfUE9TCQkJCT0gMHg0NDsKCWNvbnN0IE5VTV9FWFRFTlNJT05fQkxPQ0tfUE9TCQkJPSAweDQ4OwoJY29uc3QgQklHX0JMT0NLX0RFUE9UX0JMT0NLU19QT1MJCT0gMHg0YzsKCgkvLyBwcm9wZXJ0eSBzdG9yYWdlIG9mZnNldHMgKGRpcmVjdG9yeSBvZmZzZXRzKQoJY29uc3QgU0laRV9PRl9OQU1FX1BPUwkJCQkJPSAweDQwOwoJY29uc3QgVFlQRV9QT1MJCQkJCQkJPSAweDQyOwoJY29uc3QgU1RBUlRfQkxPQ0tfUE9TCQkJCQk9IDB4NzQ7Cgljb25zdCBTSVpFX1BPUwkJCQkJCQk9IDB4Nzg7CgoKCglwdWJsaWMgJHdya2Jvb2sJCQkJCQk9IG51bGw7CglwdWJsaWMgJHN1bW1hcnlJbmZvcm1hdGlvbgkJCT0gbnVsbDsKCXB1YmxpYyAkZG9jdW1lbnRTdW1tYXJ5SW5mb3JtYXRpb24JPSBudWxsOwoKCgkvKioKCSAqIFJlYWQgdGhlIGZpbGUKCSAqCgkgKiBAcGFyYW0gJHNGaWxlTmFtZSBzdHJpbmcgRmlsZW5hbWUKCSAqIEB0aHJvd3MgRXhjZXB0aW9uCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiByZWFkKCRzRmlsZU5hbWUpCgl7CgkJLy8gQ2hlY2sgaWYgZmlsZSBleGlzdHMgYW5kIGlzIHJlYWRhYmxlCgkJaWYoIWlzX3JlYWRhYmxlKCRzRmlsZU5hbWUpKSB7CgkJCXRocm93IG5ldyBFeGNlcHRpb24oIkNvdWxkIG5vdCBvcGVuICIgLiAkc0ZpbGVOYW1lIC4gIiBmb3IgcmVhZGluZyEgRmlsZSBkb2VzIG5vdCBleGlzdCwgb3IgaXQgaXMgbm90IHJlYWRhYmxlLiIpOwoJCX0KCgkJLy8gR2V0IHRoZSBmaWxlIGRhdGEKCQkkdGhpcy0+ZGF0YSA9IGZpbGVfZ2V0X2NvbnRlbnRzKCRzRmlsZU5hbWUpOwoKCQkvLyBDaGVjayBPTEUgaWRlbnRpZmllcgoJCWlmIChzdWJzdHIoJHRoaXMtPmRhdGEsIDAsIDgpICE9IHNlbGY6OklERU5USUZJRVJfT0xFKSB7CgkJCXRocm93IG5ldyBFeGNlcHRpb24oJ1RoZSBmaWxlbmFtZSAnIC4gJHNGaWxlTmFtZSAuICcgaXMgbm90IHJlY29nbmlzZWQgYXMgYW4gT0xFIGZpbGUnKTsKCQl9CgoJCS8vIFRvdGFsIG51bWJlciBvZiBzZWN0b3JzIHVzZWQgZm9yIHRoZSBTQVQKCQkkdGhpcy0+bnVtQmlnQmxvY2tEZXBvdEJsb2NrcyA9IHNlbGY6Ol9HZXRJbnQ0ZCgkdGhpcy0+ZGF0YSwgc2VsZjo6TlVNX0JJR19CTE9DS19ERVBPVF9CTE9DS1NfUE9TKTsKCgkJLy8gU2VjSUQgb2YgdGhlIGZpcnN0IHNlY3RvciBvZiB0aGUgZGlyZWN0b3J5IHN0cmVhbQoJCSR0aGlzLT5yb290U3RhcnRCbG9jayA9IHNlbGY6Ol9HZXRJbnQ0ZCgkdGhpcy0+ZGF0YSwgc2VsZjo6Uk9PVF9TVEFSVF9CTE9DS19QT1MpOwoKCQkvLyBTZWNJRCBvZiB0aGUgZmlyc3Qgc2VjdG9yIG9mIHRoZSBTU0FUIChvciAtMiBpZiBub3QgZXh0YW50KQoJCSR0aGlzLT5zYmRTdGFydEJsb2NrID0gc2VsZjo6X0dldEludDRkKCR0aGlzLT5kYXRhLCBzZWxmOjpTTUFMTF9CTE9DS19ERVBPVF9CTE9DS19QT1MpOwoKCQkvLyBTZWNJRCBvZiB0aGUgZmlyc3Qgc2VjdG9yIG9mIHRoZSBNU0FUIChvciAtMiBpZiBubyBhZGRpdGlvbmFsIHNlY3RvcnMgYXJlIHVzZWQpCgkJJHRoaXMtPmV4dGVuc2lvbkJsb2NrID0gc2VsZjo6X0dldEludDRkKCR0aGlzLT5kYXRhLCBzZWxmOjpFWFRFTlNJT05fQkxPQ0tfUE9TKTsKCgkJLy8gVG90YWwgbnVtYmVyIG9mIHNlY3RvcnMgdXNlZCBieSBNU0FUCgkJJHRoaXMtPm51bUV4dGVuc2lvbkJsb2NrcyA9IHNlbGY6Ol9HZXRJbnQ0ZCgkdGhpcy0+ZGF0YSwgc2VsZjo6TlVNX0VYVEVOU0lPTl9CTE9DS19QT1MpOwoKCQkkYmlnQmxvY2tEZXBvdEJsb2NrcyA9IGFycmF5KCk7CgkJJHBvcyA9IHNlbGY6OkJJR19CTE9DS19ERVBPVF9CTE9DS1NfUE9TOwoKCQkkYmJkQmxvY2tzID0gJHRoaXMtPm51bUJpZ0Jsb2NrRGVwb3RCbG9ja3M7CgoJCWlmICgkdGhpcy0+bnVtRXh0ZW5zaW9uQmxvY2tzICE9IDApIHsKCQkJJGJiZEJsb2NrcyA9IChzZWxmOjpCSUdfQkxPQ0tfU0laRSAtIHNlbGY6OkJJR19CTE9DS19ERVBPVF9CTE9DS1NfUE9TKS80OwoJCX0KCgkJZm9yICgkaSA9IDA7ICRpIDwgJGJiZEJsb2NrczsgKyskaSkgewoJCQkgICRiaWdCbG9ja0RlcG90QmxvY2tzWyRpXSA9IHNlbGY6Ol9HZXRJbnQ0ZCgkdGhpcy0+ZGF0YSwgJHBvcyk7CgkJCSAgJHBvcyArPSA0OwoJCX0KCgkJZm9yICgkaiA9IDA7ICRqIDwgJHRoaXMtPm51bUV4dGVuc2lvbkJsb2NrczsgKyskaikgewoJCQkkcG9zID0gKCR0aGlzLT5leHRlbnNpb25CbG9jayArIDEpICogc2VsZjo6QklHX0JMT0NLX1NJWkU7CgkJCSRibG9ja3NUb1JlYWQgPSBtaW4oJHRoaXMtPm51bUJpZ0Jsb2NrRGVwb3RCbG9ja3MgLSAkYmJkQmxvY2tzLCBzZWxmOjpCSUdfQkxPQ0tfU0laRSAvIDQgLSAxKTsKCgkJCWZvciAoJGkgPSAkYmJkQmxvY2tzOyAkaSA8ICRiYmRCbG9ja3MgKyAkYmxvY2tzVG9SZWFkOyArKyRpKSB7CgkJCQkkYmlnQmxvY2tEZXBvdEJsb2Nrc1skaV0gPSBzZWxmOjpfR2V0SW50NGQoJHRoaXMtPmRhdGEsICRwb3MpOwoJCQkJJHBvcyArPSA0OwoJCQl9CgoJCQkkYmJkQmxvY2tzICs9ICRibG9ja3NUb1JlYWQ7CgkJCWlmICgkYmJkQmxvY2tzIDwgJHRoaXMtPm51bUJpZ0Jsb2NrRGVwb3RCbG9ja3MpIHsKCQkJCSR0aGlzLT5leHRlbnNpb25CbG9jayA9IHNlbGY6Ol9HZXRJbnQ0ZCgkdGhpcy0+ZGF0YSwgJHBvcyk7CgkJCX0KCQl9CgoJCSRwb3MgPSAkaW5kZXggPSAwOwoJCSR0aGlzLT5iaWdCbG9ja0NoYWluID0gYXJyYXkoKTsKCgkJJGJicyA9IHNlbGY6OkJJR19CTE9DS19TSVpFIC8gNDsKCQlmb3IgKCRpID0gMDsgJGkgPCAkdGhpcy0+bnVtQmlnQmxvY2tEZXBvdEJsb2NrczsgKyskaSkgewoJCQkkcG9zID0gKCRiaWdCbG9ja0RlcG90QmxvY2tzWyRpXSArIDEpICogc2VsZjo6QklHX0JMT0NLX1NJWkU7CgoJCQlmb3IgKCRqID0gMCA7ICRqIDwgJGJiczsgKyskaikgewoJCQkJJHRoaXMtPmJpZ0Jsb2NrQ2hhaW5bJGluZGV4XSA9IHNlbGY6Ol9HZXRJbnQ0ZCgkdGhpcy0+ZGF0YSwgJHBvcyk7CgkJCQkkcG9zICs9IDQgOwoJCQkJKyskaW5kZXg7CgkJCX0KCQl9CgoJCSRwb3MgPSAkaW5kZXggPSAwOwoJCSRzYmRCbG9jayA9ICR0aGlzLT5zYmRTdGFydEJsb2NrOwoJCSR0aGlzLT5zbWFsbEJsb2NrQ2hhaW4gPSBhcnJheSgpOwoKCQl3aGlsZSAoJHNiZEJsb2NrICE9IC0yKSB7CgkJCSRwb3MgPSAoJHNiZEJsb2NrICsgMSkgKiBzZWxmOjpCSUdfQkxPQ0tfU0laRTsKCgkJCWZvciAoJGogPSAwOyAkaiA8ICRiYnM7ICsrJGopIHsKCQkJCSR0aGlzLT5zbWFsbEJsb2NrQ2hhaW5bJGluZGV4XSA9IHNlbGY6Ol9HZXRJbnQ0ZCgkdGhpcy0+ZGF0YSwgJHBvcyk7CgkJCQkkcG9zICs9IDQ7CgkJCQkrKyRpbmRleDsKCQkJfQoKCQkJJHNiZEJsb2NrID0gJHRoaXMtPmJpZ0Jsb2NrQ2hhaW5bJHNiZEJsb2NrXTsKCQl9CgoJCS8vIHJlYWQgdGhlIGRpcmVjdG9yeSBzdHJlYW0KCQkkYmxvY2sgPSAkdGhpcy0+cm9vdFN0YXJ0QmxvY2s7CgkJJHRoaXMtPmVudHJ5ID0gJHRoaXMtPl9yZWFkRGF0YSgkYmxvY2spOwoKCQkkdGhpcy0+X3JlYWRQcm9wZXJ0eVNldHMoKTsKCX0KCgkvKioKCSAqIEV4dHJhY3QgYmluYXJ5IHN0cmVhbSBkYXRhCgkgKgoJICogQHJldHVybiBzdHJpbmcKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldFN0cmVhbSgkc3RyZWFtKQoJewoJCWlmICgkc3RyZWFtID09PSBOVUxMKSB7CgkJCXJldHVybiBudWxsOwoJCX0KCgkJJHN0cmVhbURhdGEgPSAnJzsKCgkJaWYgKCR0aGlzLT5wcm9wc1skc3RyZWFtXVsnc2l6ZSddIDwgc2VsZjo6U01BTExfQkxPQ0tfVEhSRVNIT0xEKSB7CgkJCSRyb290ZGF0YSA9ICR0aGlzLT5fcmVhZERhdGEoJHRoaXMtPnByb3BzWyR0aGlzLT5yb290ZW50cnldWydzdGFydEJsb2NrJ10pOwoKCQkJJGJsb2NrID0gJHRoaXMtPnByb3BzWyRzdHJlYW1dWydzdGFydEJsb2NrJ107CgoJCQl3aGlsZSAoJGJsb2NrICE9IC0yKSB7CgkgIAkJCSRwb3MgPSAkYmxvY2sgKiBzZWxmOjpTTUFMTF9CTE9DS19TSVpFOwoJCQkJJHN0cmVhbURhdGEgLj0gc3Vic3RyKCRyb290ZGF0YSwgJHBvcywgc2VsZjo6U01BTExfQkxPQ0tfU0laRSk7CgoJCQkJJGJsb2NrID0gJHRoaXMtPnNtYWxsQmxvY2tDaGFpblskYmxvY2tdOwoJCQl9CgoJCQlyZXR1cm4gJHN0cmVhbURhdGE7CgkJfSBlbHNlIHsKCQkJJG51bUJsb2NrcyA9ICR0aGlzLT5wcm9wc1skc3RyZWFtXVsnc2l6ZSddIC8gc2VsZjo6QklHX0JMT0NLX1NJWkU7CgkJCWlmICgkdGhpcy0+cHJvcHNbJHN0cmVhbV1bJ3NpemUnXSAlIHNlbGY6OkJJR19CTE9DS19TSVpFICE9IDApIHsKCQkJCSsrJG51bUJsb2NrczsKCQkJfQoKCQkJaWYgKCRudW1CbG9ja3MgPT0gMCkgcmV0dXJuICcnOwoKCQkJJGJsb2NrID0gJHRoaXMtPnByb3BzWyRzdHJlYW1dWydzdGFydEJsb2NrJ107CgoJCQl3aGlsZSAoJGJsb2NrICE9IC0yKSB7CgkJCQkkcG9zID0gKCRibG9jayArIDEpICogc2VsZjo6QklHX0JMT0NLX1NJWkU7CgkJCQkkc3RyZWFtRGF0YSAuPSBzdWJzdHIoJHRoaXMtPmRhdGEsICRwb3MsIHNlbGY6OkJJR19CTE9DS19TSVpFKTsKCQkJCSRibG9jayA9ICR0aGlzLT5iaWdCbG9ja0NoYWluWyRibG9ja107CgkJCX0KCgkJCXJldHVybiAkc3RyZWFtRGF0YTsKCQl9Cgl9CgoJLyoqCgkgKiBSZWFkIGEgc3RhbmRhcmQgc3RyZWFtIChieSBqb2luaW5nIHNlY3RvcnMgdXNpbmcgaW5mb3JtYXRpb24gZnJvbSBTQVQpCgkgKgoJICogQHBhcmFtIGludCAkYmwgU2VjdG9yIElEIHdoZXJlIHRoZSBzdHJlYW0gc3RhcnRzCgkgKiBAcmV0dXJuIHN0cmluZyBEYXRhIGZvciBzdGFuZGFyZCBzdHJlYW0KCSAqLwoJcHJpdmF0ZSBmdW5jdGlvbiBfcmVhZERhdGEoJGJsKQoJewoJCSRibG9jayA9ICRibDsKCQkkZGF0YSA9ICcnOwoKCQl3aGlsZSAoJGJsb2NrICE9IC0yKSAgewoJCQkkcG9zID0gKCRibG9jayArIDEpICogc2VsZjo6QklHX0JMT0NLX1NJWkU7CgkJCSRkYXRhIC49IHN1YnN0cigkdGhpcy0+ZGF0YSwgJHBvcywgc2VsZjo6QklHX0JMT0NLX1NJWkUpOwoJCQkkYmxvY2sgPSAkdGhpcy0+YmlnQmxvY2tDaGFpblskYmxvY2tdOwoJCX0KCQlyZXR1cm4gJGRhdGE7CgkgfQoKCS8qKgoJICogUmVhZCBlbnRyaWVzIGluIHRoZSBkaXJlY3Rvcnkgc3RyZWFtLgoJICovCglwcml2YXRlIGZ1bmN0aW9uIF9yZWFkUHJvcGVydHlTZXRzKCkgewoJCSRvZmZzZXQgPSAwOwoKCQkvLyBsb29wIHRocm91Z2ggZW50aXJlcywgZWFjaCBlbnRyeSBpcyAxMjggYnl0ZXMKCQkkZW50cnlMZW4gPSBzdHJsZW4oJHRoaXMtPmVudHJ5KTsKCQl3aGlsZSAoJG9mZnNldCA8ICRlbnRyeUxlbikgewoJCQkvLyBlbnRyeSBkYXRhICgxMjggYnl0ZXMpCgkJCSRkID0gc3Vic3RyKCR0aGlzLT5lbnRyeSwgJG9mZnNldCwgc2VsZjo6UFJPUEVSVFlfU1RPUkFHRV9CTE9DS19TSVpFKTsKCgkJCS8vIHNpemUgaW4gYnl0ZXMgb2YgbmFtZQoJCQkkbmFtZVNpemUgPSBvcmQoJGRbc2VsZjo6U0laRV9PRl9OQU1FX1BPU10pIHwgKG9yZCgkZFtzZWxmOjpTSVpFX09GX05BTUVfUE9TKzFdKSA8PCA4KTsKCgkJCS8vIHR5cGUgb2YgZW50cnkKCQkJJHR5cGUgPSBvcmQoJGRbc2VsZjo6VFlQRV9QT1NdKTsKCgkJCS8vIHNlY3RvcklEIG9mIGZpcnN0IHNlY3RvciBvciBzaG9ydCBzZWN0b3IsIGlmIHRoaXMgZW50cnkgcmVmZXJzIHRvIGEgc3RyZWFtICh0aGUgY2FzZSB3aXRoIHdvcmtib29rKQoJCQkvLyBzZWN0b3JJRCBvZiBmaXJzdCBzZWN0b3Igb2YgdGhlIHNob3J0LXN0cmVhbSBjb250YWluZXIgc3RyZWFtLCBpZiB0aGlzIGVudHJ5IGlzIHJvb3QgZW50cnkKCQkJJHN0YXJ0QmxvY2sgPSBzZWxmOjpfR2V0SW50NGQoJGQsIHNlbGY6OlNUQVJUX0JMT0NLX1BPUyk7CgoJCQkkc2l6ZSA9IHNlbGY6Ol9HZXRJbnQ0ZCgkZCwgc2VsZjo6U0laRV9QT1MpOwoKCQkJJG5hbWUgPSBzdHJfcmVwbGFjZSgiXHgwMCIsICIiLCBzdWJzdHIoJGQsMCwkbmFtZVNpemUpKTsKCgkJCSR0aGlzLT5wcm9wc1tdID0gYXJyYXkgKAoJCQkJJ25hbWUnID0+ICRuYW1lLAoJCQkJJ3R5cGUnID0+ICR0eXBlLAoJCQkJJ3N0YXJ0QmxvY2snID0+ICRzdGFydEJsb2NrLAoJCQkJJ3NpemUnID0+ICRzaXplKTsKCgkJCS8vIFdvcmtib29rIGRpcmVjdG9yeSBlbnRyeSAoQklGRjUgdXNlcyBCb29rLCBCSUZGOCB1c2VzIFdvcmtib29rKQoJCQlpZiAoKCRuYW1lID09ICdXb3JrYm9vaycpIHx8ICgkbmFtZSA9PSAnQm9vaycpIHx8ICgkbmFtZSA9PSAnV09SS0JPT0snKSB8fCAoJG5hbWUgPT0gJ0JPT0snKSkgewoJCQkJJHRoaXMtPndya2Jvb2sgPSBjb3VudCgkdGhpcy0+cHJvcHMpIC0gMTsKCQkJfQoKCQkJLy8gUm9vdCBlbnRyeQoJCQlpZiAoJG5hbWUgPT0gJ1Jvb3QgRW50cnknIHx8ICRuYW1lID09ICdST09UIEVOVFJZJyB8fCAkbmFtZSA9PSAnUicpIHsKCQkJCSR0aGlzLT5yb290ZW50cnkgPSBjb3VudCgkdGhpcy0+cHJvcHMpIC0gMTsKCQkJfQoKCQkJLy8gU3VtbWFyeSBpbmZvcm1hdGlvbgoJCQlpZiAoJG5hbWUgPT0gY2hyKDUpIC4gJ1N1bW1hcnlJbmZvcm1hdGlvbicpIHsKLy8JCQkJZWNobyAnU3VtbWFyeSBJbmZvcm1hdGlvbjxiciAvPic7CgkJCQkkdGhpcy0+c3VtbWFyeUluZm9ybWF0aW9uID0gY291bnQoJHRoaXMtPnByb3BzKSAtIDE7CgkJCX0KCgkJCS8vIEFkZGl0aW9uYWwgRG9jdW1lbnQgU3VtbWFyeSBpbmZvcm1hdGlvbgoJCQlpZiAoJG5hbWUgPT0gY2hyKDUpIC4gJ0RvY3VtZW50U3VtbWFyeUluZm9ybWF0aW9uJykgewovLwkJCQllY2hvICdEb2N1bWVudCBTdW1tYXJ5IEluZm9ybWF0aW9uPGJyIC8+JzsKCQkJCSR0aGlzLT5kb2N1bWVudFN1bW1hcnlJbmZvcm1hdGlvbiA9IGNvdW50KCR0aGlzLT5wcm9wcykgLSAxOwoJCQl9CgoJCQkkb2Zmc2V0ICs9IHNlbGY6OlBST1BFUlRZX1NUT1JBR0VfQkxPQ0tfU0laRTsKCQl9CgoJfQoKCS8qKgoJICogUmVhZCA0IGJ5dGVzIG9mIGRhdGEgYXQgc3BlY2lmaWVkIHBvc2l0aW9uCgkgKgoJICogQHBhcmFtIHN0cmluZyAkZGF0YQoJICogQHBhcmFtIGludCAkcG9zCgkgKiBAcmV0dXJuIGludAoJICovCglwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBfR2V0SW50NGQoJGRhdGEsICRwb3MpCgl7CgkJLy8gRklYOiByZXByZXNlbnQgbnVtYmVycyBjb3JyZWN0bHkgb24gNjQtYml0IHN5c3RlbQoJCS8vIGh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvdHJhY2tlci9pbmRleC5waHA/ZnVuYz1kZXRhaWwmYWlkPTE0ODczNzImZ3JvdXBfaWQ9OTkxNjAmYXRpZD02MjMzMzQKCQkvLyBIYWNrZWQgYnkgQW5kcmVhcyBSZWhtIDIwMDYgdG8gZW5zdXJlIGNvcnJlY3QgcmVzdWx0IG9mIHRoZSA8PDI0IGJsb2NrIG9uIDMyIGFuZCA2NGJpdCBzeXN0ZW1zCgkJJF9vcl8yNCA9IG9yZCgkZGF0YVskcG9zICsgM10pOwoJCWlmICgkX29yXzI0ID49IDEyOCkgewoJCQkvLyBuZWdhdGl2ZSBudW1iZXIKCQkJJF9vcmRfMjQgPSAtYWJzKCgyNTYgLSAkX29yXzI0KSA8PCAyNCk7CgkJfSBlbHNlIHsKCQkJJF9vcmRfMjQgPSAoJF9vcl8yNCAmIDEyNykgPDwgMjQ7CgkJfQoJCXJldHVybiBvcmQoJGRhdGFbJHBvc10pIHwgKG9yZCgkZGF0YVskcG9zICsgMV0pIDw8IDgpIHwgKG9yZCgkZGF0YVskcG9zICsgMl0pIDw8IDE2KSB8ICRfb3JkXzI0OwoJfQoKfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Shared/PasswordHasher.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIFBIUEV4Y2VsCiAqCiAqIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICoKICogQGNhdGVnb3J5ICAgUEhQRXhjZWwKICogQHBhY2thZ2UgICAgUEhQRXhjZWxfU2hhcmVkCiAqIEBjb3B5cmlnaHQgIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwgKGh0dHA6Ly93d3cuY29kZXBsZXguY29tL1BIUEV4Y2VsKQogKiBAbGljZW5zZSAgICBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvb2xkLWxpY2Vuc2VzL2xncGwtMi4xLnR4dAlMR1BMCiAqIEB2ZXJzaW9uICAgIDEuNy43LCAyMDEyLTA1LTE5CiAqLwoKCi8qKgogKiBQSFBFeGNlbF9TaGFyZWRfUGFzc3dvcmRIYXNoZXIKICoKICogQGNhdGVnb3J5ICAgUEhQRXhjZWwKICogQHBhY2thZ2UgICAgUEhQRXhjZWxfU2hhcmVkCiAqIEBjb3B5cmlnaHQgIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwgKGh0dHA6Ly93d3cuY29kZXBsZXguY29tL1BIUEV4Y2VsKQogKi8KY2xhc3MgUEhQRXhjZWxfU2hhcmVkX1Bhc3N3b3JkSGFzaGVyCnsKCS8qKgoJICogQ3JlYXRlIGEgcGFzc3dvcmQgaGFzaCBmcm9tIGEgZ2l2ZW4gc3RyaW5nLgoJICoKCSAqIFRoaXMgbWV0aG9kIGlzIGJhc2VkIG9uIHRoZSBhbGdvcml0aG0gcHJvdmlkZWQgYnkKCSAqIERhbmllbCBSZW50eiBvZiBPcGVuT2ZmaWNlIGFuZCB0aGUgUEVBUiBwYWNrYWdlCgkgKiBTcHJlYWRzaGVldF9FeGNlbF9Xcml0ZXIgYnkgWGF2aWVyIE5vZ3VlciA8eG5vZ3VlckByZXplYnJhLmNvbT4uCgkgKgoJICogQHBhcmFtIAlzdHJpbmcJJHBQYXNzd29yZAlQYXNzd29yZCB0byBoYXNoCgkgKiBAcmV0dXJuIAlzdHJpbmcJCQkJSGFzaGVkIHBhc3N3b3JkCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gaGFzaFBhc3N3b3JkKCRwUGFzc3dvcmQgPSAnJykgewogICAgICAgICRwYXNzd29yZCA9IDB4MDAwMDsKICAgICAgICAkaSAgICAgICAgPSAxOyAgICAgICAvLyBjaGFyIHBvc2l0aW9uCgogICAgICAgIC8vIHNwbGl0IHRoZSBwbGFpbiB0ZXh0IHBhc3N3b3JkIGluIGl0cyBjb21wb25lbnQgY2hhcmFjdGVycwogICAgICAgICRjaGFycyA9IHByZWdfc3BsaXQoJy8vJywgJHBQYXNzd29yZCwgLTEsIFBSRUdfU1BMSVRfTk9fRU1QVFkpOwogICAgICAgIGZvcmVhY2ggKCRjaGFycyBhcyAkY2hhcikgewogICAgICAgICAgICAkdmFsdWUgICAgICAgID0gb3JkKCRjaGFyKSA8PCAkaTsgICAvLyBzaGlmdGVkIEFTQ0lJIHZhbHVlCiAgICAgICAgICAgICRyb3RhdGVkX2JpdHMgPSAkdmFsdWUgPj4gMTU7ICAgICAgIC8vIHJvdGF0ZWQgYml0cyBiZXlvbmQgYml0IDE1CiAgICAgICAgICAgICR2YWx1ZSAgICAgICAmPSAweDdmZmY7ICAgICAgICAgICAgIC8vIGZpcnN0IDE1IGJpdHMKICAgICAgICAgICAgJHBhc3N3b3JkICAgIF49ICgkdmFsdWUgfCAkcm90YXRlZF9iaXRzKTsKICAgICAgICAgICAgKyskaTsKICAgICAgICB9CgogICAgICAgICRwYXNzd29yZCBePSBzdHJsZW4oJHBQYXNzd29yZCk7CiAgICAgICAgJHBhc3N3b3JkIF49IDB4Q0U0QjsKCiAgICAgICAgcmV0dXJuKHN0cnRvdXBwZXIoZGVjaGV4KCRwYXNzd29yZCkpKTsKCX0KfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Shared/PCLZip/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Shared/PCLZip/gnu-lgpl.txt</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[CQkgIEdOVSBMRVNTRVIgR0VORVJBTCBQVUJMSUMgTElDRU5TRQ0KCQkgICAgICAgVmVyc2lvbiAyLjEsIEZlYnJ1YXJ5IDE5OTkNCg0KIENvcHlyaWdodCAoQykgMTk5MSwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4NCiAgICAgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQ0KIEV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcw0KIG9mIHRoaXMgbGljZW5zZSBkb2N1bWVudCwgYnV0IGNoYW5naW5nIGl0IGlzIG5vdCBhbGxvd2VkLg0KDQpbVGhpcyBpcyB0aGUgZmlyc3QgcmVsZWFzZWQgdmVyc2lvbiBvZiB0aGUgTGVzc2VyIEdQTC4gIEl0IGFsc28gY291bnRzDQogYXMgdGhlIHN1Y2Nlc3NvciBvZiB0aGUgR05VIExpYnJhcnkgUHVibGljIExpY2Vuc2UsIHZlcnNpb24gMiwgaGVuY2UNCiB0aGUgdmVyc2lvbiBudW1iZXIgMi4xLl0NCg0KCQkJICAgIFByZWFtYmxlDQoNCiAgVGhlIGxpY2Vuc2VzIGZvciBtb3N0IHNvZnR3YXJlIGFyZSBkZXNpZ25lZCB0byB0YWtlIGF3YXkgeW91cg0KZnJlZWRvbSB0byBzaGFyZSBhbmQgY2hhbmdlIGl0LiAgQnkgY29udHJhc3QsIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMNCkxpY2Vuc2VzIGFyZSBpbnRlbmRlZCB0byBndWFyYW50ZWUgeW91ciBmcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UNCmZyZWUgc29mdHdhcmUtLXRvIG1ha2Ugc3VyZSB0aGUgc29mdHdhcmUgaXMgZnJlZSBmb3IgYWxsIGl0cyB1c2Vycy4NCg0KICBUaGlzIGxpY2Vuc2UsIHRoZSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgYXBwbGllcyB0byBzb21lDQpzcGVjaWFsbHkgZGVzaWduYXRlZCBzb2Z0d2FyZSBwYWNrYWdlcy0tdHlwaWNhbGx5IGxpYnJhcmllcy0tb2YgdGhlDQpGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIG90aGVyIGF1dGhvcnMgd2hvIGRlY2lkZSB0byB1c2UgaXQuICBZb3UNCmNhbiB1c2UgaXQgdG9vLCBidXQgd2Ugc3VnZ2VzdCB5b3UgZmlyc3QgdGhpbmsgY2FyZWZ1bGx5IGFib3V0IHdoZXRoZXINCnRoaXMgbGljZW5zZSBvciB0aGUgb3JkaW5hcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyB0aGUgYmV0dGVyDQpzdHJhdGVneSB0byB1c2UgaW4gYW55IHBhcnRpY3VsYXIgY2FzZSwgYmFzZWQgb24gdGhlIGV4cGxhbmF0aW9ucyBiZWxvdy4NCg0KICBXaGVuIHdlIHNwZWFrIG9mIGZyZWUgc29mdHdhcmUsIHdlIGFyZSByZWZlcnJpbmcgdG8gZnJlZWRvbSBvZiB1c2UsDQpub3QgcHJpY2UuICBPdXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZXMgYXJlIGRlc2lnbmVkIHRvIG1ha2Ugc3VyZSB0aGF0DQp5b3UgaGF2ZSB0aGUgZnJlZWRvbSB0byBkaXN0cmlidXRlIGNvcGllcyBvZiBmcmVlIHNvZnR3YXJlIChhbmQgY2hhcmdlDQpmb3IgdGhpcyBzZXJ2aWNlIGlmIHlvdSB3aXNoKTsgdGhhdCB5b3UgcmVjZWl2ZSBzb3VyY2UgY29kZSBvciBjYW4gZ2V0DQppdCBpZiB5b3Ugd2FudCBpdDsgdGhhdCB5b3UgY2FuIGNoYW5nZSB0aGUgc29mdHdhcmUgYW5kIHVzZSBwaWVjZXMgb2YNCml0IGluIG5ldyBmcmVlIHByb2dyYW1zOyBhbmQgdGhhdCB5b3UgYXJlIGluZm9ybWVkIHRoYXQgeW91IGNhbiBkbw0KdGhlc2UgdGhpbmdzLg0KDQogIFRvIHByb3RlY3QgeW91ciByaWdodHMsIHdlIG5lZWQgdG8gbWFrZSByZXN0cmljdGlvbnMgdGhhdCBmb3JiaWQNCmRpc3RyaWJ1dG9ycyB0byBkZW55IHlvdSB0aGVzZSByaWdodHMgb3IgdG8gYXNrIHlvdSB0byBzdXJyZW5kZXIgdGhlc2UNCnJpZ2h0cy4gIFRoZXNlIHJlc3RyaWN0aW9ucyB0cmFuc2xhdGUgdG8gY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIGZvcg0KeW91IGlmIHlvdSBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUgbGlicmFyeSBvciBpZiB5b3UgbW9kaWZ5IGl0Lg0KDQogIEZvciBleGFtcGxlLCBpZiB5b3UgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlIGxpYnJhcnksIHdoZXRoZXIgZ3JhdGlzDQpvciBmb3IgYSBmZWUsIHlvdSBtdXN0IGdpdmUgdGhlIHJlY2lwaWVudHMgYWxsIHRoZSByaWdodHMgdGhhdCB3ZSBnYXZlDQp5b3UuICBZb3UgbXVzdCBtYWtlIHN1cmUgdGhhdCB0aGV5LCB0b28sIHJlY2VpdmUgb3IgY2FuIGdldCB0aGUgc291cmNlDQpjb2RlLiAgSWYgeW91IGxpbmsgb3RoZXIgY29kZSB3aXRoIHRoZSBsaWJyYXJ5LCB5b3UgbXVzdCBwcm92aWRlDQpjb21wbGV0ZSBvYmplY3QgZmlsZXMgdG8gdGhlIHJlY2lwaWVudHMsIHNvIHRoYXQgdGhleSBjYW4gcmVsaW5rIHRoZW0NCndpdGggdGhlIGxpYnJhcnkgYWZ0ZXIgbWFraW5nIGNoYW5nZXMgdG8gdGhlIGxpYnJhcnkgYW5kIHJlY29tcGlsaW5nDQppdC4gIEFuZCB5b3UgbXVzdCBzaG93IHRoZW0gdGhlc2UgdGVybXMgc28gdGhleSBrbm93IHRoZWlyIHJpZ2h0cy4NCg0KICBXZSBwcm90ZWN0IHlvdXIgcmlnaHRzIHdpdGggYSB0d28tc3RlcCBtZXRob2Q6ICgxKSB3ZSBjb3B5cmlnaHQgdGhlDQpsaWJyYXJ5LCBhbmQgKDIpIHdlIG9mZmVyIHlvdSB0aGlzIGxpY2Vuc2UsIHdoaWNoIGdpdmVzIHlvdSBsZWdhbA0KcGVybWlzc2lvbiB0byBjb3B5LCBkaXN0cmlidXRlIGFuZC9vciBtb2RpZnkgdGhlIGxpYnJhcnkuDQoNCiAgVG8gcHJvdGVjdCBlYWNoIGRpc3RyaWJ1dG9yLCB3ZSB3YW50IHRvIG1ha2UgaXQgdmVyeSBjbGVhciB0aGF0DQp0aGVyZSBpcyBubyB3YXJyYW50eSBmb3IgdGhlIGZyZWUgbGlicmFyeS4gIEFsc28sIGlmIHRoZSBsaWJyYXJ5IGlzDQptb2RpZmllZCBieSBzb21lb25lIGVsc2UgYW5kIHBhc3NlZCBvbiwgdGhlIHJlY2lwaWVudHMgc2hvdWxkIGtub3cNCnRoYXQgd2hhdCB0aGV5IGhhdmUgaXMgbm90IHRoZSBvcmlnaW5hbCB2ZXJzaW9uLCBzbyB0aGF0IHRoZSBvcmlnaW5hbA0KYXV0aG9yJ3MgcmVwdXRhdGlvbiB3aWxsIG5vdCBiZSBhZmZlY3RlZCBieSBwcm9ibGVtcyB0aGF0IG1pZ2h0IGJlDQppbnRyb2R1Y2VkIGJ5IG90aGVycy4NCgwNCiAgRmluYWxseSwgc29mdHdhcmUgcGF0ZW50cyBwb3NlIGEgY29uc3RhbnQgdGhyZWF0IHRvIHRoZSBleGlzdGVuY2Ugb2YNCmFueSBmcmVlIHByb2dyYW0uICBXZSB3aXNoIHRvIG1ha2Ugc3VyZSB0aGF0IGEgY29tcGFueSBjYW5ub3QNCmVmZmVjdGl2ZWx5IHJlc3RyaWN0IHRoZSB1c2VycyBvZiBhIGZyZWUgcHJvZ3JhbSBieSBvYnRhaW5pbmcgYQ0KcmVzdHJpY3RpdmUgbGljZW5zZSBmcm9tIGEgcGF0ZW50IGhvbGRlci4gIFRoZXJlZm9yZSwgd2UgaW5zaXN0IHRoYXQNCmFueSBwYXRlbnQgbGljZW5zZSBvYnRhaW5lZCBmb3IgYSB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5IG11c3QgYmUNCmNvbnNpc3RlbnQgd2l0aCB0aGUgZnVsbCBmcmVlZG9tIG9mIHVzZSBzcGVjaWZpZWQgaW4gdGhpcyBsaWNlbnNlLg0KDQogIE1vc3QgR05VIHNvZnR3YXJlLCBpbmNsdWRpbmcgc29tZSBsaWJyYXJpZXMsIGlzIGNvdmVyZWQgYnkgdGhlDQpvcmRpbmFyeSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIFRoaXMgbGljZW5zZSwgdGhlIEdOVSBMZXNzZXINCkdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGFwcGxpZXMgdG8gY2VydGFpbiBkZXNpZ25hdGVkIGxpYnJhcmllcywgYW5kDQppcyBxdWl0ZSBkaWZmZXJlbnQgZnJvbSB0aGUgb3JkaW5hcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIFdlIHVzZQ0KdGhpcyBsaWNlbnNlIGZvciBjZXJ0YWluIGxpYnJhcmllcyBpbiBvcmRlciB0byBwZXJtaXQgbGlua2luZyB0aG9zZQ0KbGlicmFyaWVzIGludG8gbm9uLWZyZWUgcHJvZ3JhbXMuDQoNCiAgV2hlbiBhIHByb2dyYW0gaXMgbGlua2VkIHdpdGggYSBsaWJyYXJ5LCB3aGV0aGVyIHN0YXRpY2FsbHkgb3IgdXNpbmcNCmEgc2hhcmVkIGxpYnJhcnksIHRoZSBjb21iaW5hdGlvbiBvZiB0aGUgdHdvIGlzIGxlZ2FsbHkgc3BlYWtpbmcgYQ0KY29tYmluZWQgd29yaywgYSBkZXJpdmF0aXZlIG9mIHRoZSBvcmlnaW5hbCBsaWJyYXJ5LiAgVGhlIG9yZGluYXJ5DQpHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHRoZXJlZm9yZSBwZXJtaXRzIHN1Y2ggbGlua2luZyBvbmx5IGlmIHRoZQ0KZW50aXJlIGNvbWJpbmF0aW9uIGZpdHMgaXRzIGNyaXRlcmlhIG9mIGZyZWVkb20uICBUaGUgTGVzc2VyIEdlbmVyYWwNClB1YmxpYyBMaWNlbnNlIHBlcm1pdHMgbW9yZSBsYXggY3JpdGVyaWEgZm9yIGxpbmtpbmcgb3RoZXIgY29kZSB3aXRoDQp0aGUgbGlicmFyeS4NCg0KICBXZSBjYWxsIHRoaXMgbGljZW5zZSB0aGUgIkxlc3NlciIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBiZWNhdXNlIGl0DQpkb2VzIExlc3MgdG8gcHJvdGVjdCB0aGUgdXNlcidzIGZyZWVkb20gdGhhbiB0aGUgb3JkaW5hcnkgR2VuZXJhbA0KUHVibGljIExpY2Vuc2UuICBJdCBhbHNvIHByb3ZpZGVzIG90aGVyIGZyZWUgc29mdHdhcmUgZGV2ZWxvcGVycyBMZXNzDQpvZiBhbiBhZHZhbnRhZ2Ugb3ZlciBjb21wZXRpbmcgbm9uLWZyZWUgcHJvZ3JhbXMuICBUaGVzZSBkaXNhZHZhbnRhZ2VzDQphcmUgdGhlIHJlYXNvbiB3ZSB1c2UgdGhlIG9yZGluYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1hbnkNCmxpYnJhcmllcy4gIEhvd2V2ZXIsIHRoZSBMZXNzZXIgbGljZW5zZSBwcm92aWRlcyBhZHZhbnRhZ2VzIGluIGNlcnRhaW4NCnNwZWNpYWwgY2lyY3Vtc3RhbmNlcy4NCg0KICBGb3IgZXhhbXBsZSwgb24gcmFyZSBvY2Nhc2lvbnMsIHRoZXJlIG1heSBiZSBhIHNwZWNpYWwgbmVlZCB0bw0KZW5jb3VyYWdlIHRoZSB3aWRlc3QgcG9zc2libGUgdXNlIG9mIGEgY2VydGFpbiBsaWJyYXJ5LCBzbyB0aGF0IGl0IGJlY29tZXMNCmEgZGUtZmFjdG8gc3RhbmRhcmQuICBUbyBhY2hpZXZlIHRoaXMsIG5vbi1mcmVlIHByb2dyYW1zIG11c3QgYmUNCmFsbG93ZWQgdG8gdXNlIHRoZSBsaWJyYXJ5LiAgQSBtb3JlIGZyZXF1ZW50IGNhc2UgaXMgdGhhdCBhIGZyZWUNCmxpYnJhcnkgZG9lcyB0aGUgc2FtZSBqb2IgYXMgd2lkZWx5IHVzZWQgbm9uLWZyZWUgbGlicmFyaWVzLiAgSW4gdGhpcw0KY2FzZSwgdGhlcmUgaXMgbGl0dGxlIHRvIGdhaW4gYnkgbGltaXRpbmcgdGhlIGZyZWUgbGlicmFyeSB0byBmcmVlDQpzb2Z0d2FyZSBvbmx5LCBzbyB3ZSB1c2UgdGhlIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLg0KDQogIEluIG90aGVyIGNhc2VzLCBwZXJtaXNzaW9uIHRvIHVzZSBhIHBhcnRpY3VsYXIgbGlicmFyeSBpbiBub24tZnJlZQ0KcHJvZ3JhbXMgZW5hYmxlcyBhIGdyZWF0ZXIgbnVtYmVyIG9mIHBlb3BsZSB0byB1c2UgYSBsYXJnZSBib2R5IG9mDQpmcmVlIHNvZnR3YXJlLiAgRm9yIGV4YW1wbGUsIHBlcm1pc3Npb24gdG8gdXNlIHRoZSBHTlUgQyBMaWJyYXJ5IGluDQpub24tZnJlZSBwcm9ncmFtcyBlbmFibGVzIG1hbnkgbW9yZSBwZW9wbGUgdG8gdXNlIHRoZSB3aG9sZSBHTlUNCm9wZXJhdGluZyBzeXN0ZW0sIGFzIHdlbGwgYXMgaXRzIHZhcmlhbnQsIHRoZSBHTlUvTGludXggb3BlcmF0aW5nDQpzeXN0ZW0uDQoNCiAgQWx0aG91Z2ggdGhlIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIExlc3MgcHJvdGVjdGl2ZSBvZiB0aGUNCnVzZXJzJyBmcmVlZG9tLCBpdCBkb2VzIGVuc3VyZSB0aGF0IHRoZSB1c2VyIG9mIGEgcHJvZ3JhbSB0aGF0IGlzDQpsaW5rZWQgd2l0aCB0aGUgTGlicmFyeSBoYXMgdGhlIGZyZWVkb20gYW5kIHRoZSB3aGVyZXdpdGhhbCB0byBydW4NCnRoYXQgcHJvZ3JhbSB1c2luZyBhIG1vZGlmaWVkIHZlcnNpb24gb2YgdGhlIExpYnJhcnkuDQoNCiAgVGhlIHByZWNpc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIGNvcHlpbmcsIGRpc3RyaWJ1dGlvbiBhbmQNCm1vZGlmaWNhdGlvbiBmb2xsb3cuICBQYXkgY2xvc2UgYXR0ZW50aW9uIHRvIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gYQ0KIndvcmsgYmFzZWQgb24gdGhlIGxpYnJhcnkiIGFuZCBhICJ3b3JrIHRoYXQgdXNlcyB0aGUgbGlicmFyeSIuICBUaGUNCmZvcm1lciBjb250YWlucyBjb2RlIGRlcml2ZWQgZnJvbSB0aGUgbGlicmFyeSwgd2hlcmVhcyB0aGUgbGF0dGVyIG11c3QNCmJlIGNvbWJpbmVkIHdpdGggdGhlIGxpYnJhcnkgaW4gb3JkZXIgdG8gcnVuLg0KDA0KCQkgIEdOVSBMRVNTRVIgR0VORVJBTCBQVUJMSUMgTElDRU5TRQ0KICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIENPUFlJTkcsIERJU1RSSUJVVElPTiBBTkQgTU9ESUZJQ0FUSU9ODQoNCiAgMC4gVGhpcyBMaWNlbnNlIEFncmVlbWVudCBhcHBsaWVzIHRvIGFueSBzb2Z0d2FyZSBsaWJyYXJ5IG9yIG90aGVyDQpwcm9ncmFtIHdoaWNoIGNvbnRhaW5zIGEgbm90aWNlIHBsYWNlZCBieSB0aGUgY29weXJpZ2h0IGhvbGRlciBvcg0Kb3RoZXIgYXV0aG9yaXplZCBwYXJ0eSBzYXlpbmcgaXQgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KdGhpcyBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoYWxzbyBjYWxsZWQgInRoaXMgTGljZW5zZSIpLg0KRWFjaCBsaWNlbnNlZSBpcyBhZGRyZXNzZWQgYXMgInlvdSIuDQoNCiAgQSAibGlicmFyeSIgbWVhbnMgYSBjb2xsZWN0aW9uIG9mIHNvZnR3YXJlIGZ1bmN0aW9ucyBhbmQvb3IgZGF0YQ0KcHJlcGFyZWQgc28gYXMgdG8gYmUgY29udmVuaWVudGx5IGxpbmtlZCB3aXRoIGFwcGxpY2F0aW9uIHByb2dyYW1zDQood2hpY2ggdXNlIHNvbWUgb2YgdGhvc2UgZnVuY3Rpb25zIGFuZCBkYXRhKSB0byBmb3JtIGV4ZWN1dGFibGVzLg0KDQogIFRoZSAiTGlicmFyeSIsIGJlbG93LCByZWZlcnMgdG8gYW55IHN1Y2ggc29mdHdhcmUgbGlicmFyeSBvciB3b3JrDQp3aGljaCBoYXMgYmVlbiBkaXN0cmlidXRlZCB1bmRlciB0aGVzZSB0ZXJtcy4gIEEgIndvcmsgYmFzZWQgb24gdGhlDQpMaWJyYXJ5IiBtZWFucyBlaXRoZXIgdGhlIExpYnJhcnkgb3IgYW55IGRlcml2YXRpdmUgd29yayB1bmRlcg0KY29weXJpZ2h0IGxhdzogdGhhdCBpcyB0byBzYXksIGEgd29yayBjb250YWluaW5nIHRoZSBMaWJyYXJ5IG9yIGENCnBvcnRpb24gb2YgaXQsIGVpdGhlciB2ZXJiYXRpbSBvciB3aXRoIG1vZGlmaWNhdGlvbnMgYW5kL29yIHRyYW5zbGF0ZWQNCnN0cmFpZ2h0Zm9yd2FyZGx5IGludG8gYW5vdGhlciBsYW5ndWFnZS4gIChIZXJlaW5hZnRlciwgdHJhbnNsYXRpb24gaXMNCmluY2x1ZGVkIHdpdGhvdXQgbGltaXRhdGlvbiBpbiB0aGUgdGVybSAibW9kaWZpY2F0aW9uIi4pDQoNCiAgIlNvdXJjZSBjb2RlIiBmb3IgYSB3b3JrIG1lYW5zIHRoZSBwcmVmZXJyZWQgZm9ybSBvZiB0aGUgd29yayBmb3INCm1ha2luZyBtb2RpZmljYXRpb25zIHRvIGl0LiAgRm9yIGEgbGlicmFyeSwgY29tcGxldGUgc291cmNlIGNvZGUgbWVhbnMNCmFsbCB0aGUgc291cmNlIGNvZGUgZm9yIGFsbCBtb2R1bGVzIGl0IGNvbnRhaW5zLCBwbHVzIGFueSBhc3NvY2lhdGVkDQppbnRlcmZhY2UgZGVmaW5pdGlvbiBmaWxlcywgcGx1cyB0aGUgc2NyaXB0cyB1c2VkIHRvIGNvbnRyb2wgY29tcGlsYXRpb24NCmFuZCBpbnN0YWxsYXRpb24gb2YgdGhlIGxpYnJhcnkuDQoNCiAgQWN0aXZpdGllcyBvdGhlciB0aGFuIGNvcHlpbmcsIGRpc3RyaWJ1dGlvbiBhbmQgbW9kaWZpY2F0aW9uIGFyZSBub3QNCmNvdmVyZWQgYnkgdGhpcyBMaWNlbnNlOyB0aGV5IGFyZSBvdXRzaWRlIGl0cyBzY29wZS4gIFRoZSBhY3Qgb2YNCnJ1bm5pbmcgYSBwcm9ncmFtIHVzaW5nIHRoZSBMaWJyYXJ5IGlzIG5vdCByZXN0cmljdGVkLCBhbmQgb3V0cHV0IGZyb20NCnN1Y2ggYSBwcm9ncmFtIGlzIGNvdmVyZWQgb25seSBpZiBpdHMgY29udGVudHMgY29uc3RpdHV0ZSBhIHdvcmsgYmFzZWQNCm9uIHRoZSBMaWJyYXJ5IChpbmRlcGVuZGVudCBvZiB0aGUgdXNlIG9mIHRoZSBMaWJyYXJ5IGluIGEgdG9vbCBmb3INCndyaXRpbmcgaXQpLiAgV2hldGhlciB0aGF0IGlzIHRydWUgZGVwZW5kcyBvbiB3aGF0IHRoZSBMaWJyYXJ5IGRvZXMNCmFuZCB3aGF0IHRoZSBwcm9ncmFtIHRoYXQgdXNlcyB0aGUgTGlicmFyeSBkb2VzLg0KICANCiAgMS4gWW91IG1heSBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZiB0aGUgTGlicmFyeSdzDQpjb21wbGV0ZSBzb3VyY2UgY29kZSBhcyB5b3UgcmVjZWl2ZSBpdCwgaW4gYW55IG1lZGl1bSwgcHJvdmlkZWQgdGhhdA0KeW91IGNvbnNwaWN1b3VzbHkgYW5kIGFwcHJvcHJpYXRlbHkgcHVibGlzaCBvbiBlYWNoIGNvcHkgYW4NCmFwcHJvcHJpYXRlIGNvcHlyaWdodCBub3RpY2UgYW5kIGRpc2NsYWltZXIgb2Ygd2FycmFudHk7IGtlZXAgaW50YWN0DQphbGwgdGhlIG5vdGljZXMgdGhhdCByZWZlciB0byB0aGlzIExpY2Vuc2UgYW5kIHRvIHRoZSBhYnNlbmNlIG9mIGFueQ0Kd2FycmFudHk7IGFuZCBkaXN0cmlidXRlIGEgY29weSBvZiB0aGlzIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUNCkxpYnJhcnkuDQoNCiAgWW91IG1heSBjaGFyZ2UgYSBmZWUgZm9yIHRoZSBwaHlzaWNhbCBhY3Qgb2YgdHJhbnNmZXJyaW5nIGEgY29weSwNCmFuZCB5b3UgbWF5IGF0IHlvdXIgb3B0aW9uIG9mZmVyIHdhcnJhbnR5IHByb3RlY3Rpb24gaW4gZXhjaGFuZ2UgZm9yIGENCmZlZS4NCgwNCiAgMi4gWW91IG1heSBtb2RpZnkgeW91ciBjb3B5IG9yIGNvcGllcyBvZiB0aGUgTGlicmFyeSBvciBhbnkgcG9ydGlvbg0Kb2YgaXQsIHRodXMgZm9ybWluZyBhIHdvcmsgYmFzZWQgb24gdGhlIExpYnJhcnksIGFuZCBjb3B5IGFuZA0KZGlzdHJpYnV0ZSBzdWNoIG1vZGlmaWNhdGlvbnMgb3Igd29yayB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbiAxDQphYm92ZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0IGFsbCBvZiB0aGVzZSBjb25kaXRpb25zOg0KDQogICAgYSkgVGhlIG1vZGlmaWVkIHdvcmsgbXVzdCBpdHNlbGYgYmUgYSBzb2Z0d2FyZSBsaWJyYXJ5Lg0KDQogICAgYikgWW91IG11c3QgY2F1c2UgdGhlIGZpbGVzIG1vZGlmaWVkIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzDQogICAgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBmaWxlcyBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4NCg0KICAgIGMpIFlvdSBtdXN0IGNhdXNlIHRoZSB3aG9sZSBvZiB0aGUgd29yayB0byBiZSBsaWNlbnNlZCBhdCBubw0KICAgIGNoYXJnZSB0byBhbGwgdGhpcmQgcGFydGllcyB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLg0KDQogICAgZCkgSWYgYSBmYWNpbGl0eSBpbiB0aGUgbW9kaWZpZWQgTGlicmFyeSByZWZlcnMgdG8gYSBmdW5jdGlvbiBvciBhDQogICAgdGFibGUgb2YgZGF0YSB0byBiZSBzdXBwbGllZCBieSBhbiBhcHBsaWNhdGlvbiBwcm9ncmFtIHRoYXQgdXNlcw0KICAgIHRoZSBmYWNpbGl0eSwgb3RoZXIgdGhhbiBhcyBhbiBhcmd1bWVudCBwYXNzZWQgd2hlbiB0aGUgZmFjaWxpdHkNCiAgICBpcyBpbnZva2VkLCB0aGVuIHlvdSBtdXN0IG1ha2UgYSBnb29kIGZhaXRoIGVmZm9ydCB0byBlbnN1cmUgdGhhdCwNCiAgICBpbiB0aGUgZXZlbnQgYW4gYXBwbGljYXRpb24gZG9lcyBub3Qgc3VwcGx5IHN1Y2ggZnVuY3Rpb24gb3INCiAgICB0YWJsZSwgdGhlIGZhY2lsaXR5IHN0aWxsIG9wZXJhdGVzLCBhbmQgcGVyZm9ybXMgd2hhdGV2ZXIgcGFydCBvZg0KICAgIGl0cyBwdXJwb3NlIHJlbWFpbnMgbWVhbmluZ2Z1bC4NCg0KICAgIChGb3IgZXhhbXBsZSwgYSBmdW5jdGlvbiBpbiBhIGxpYnJhcnkgdG8gY29tcHV0ZSBzcXVhcmUgcm9vdHMgaGFzDQogICAgYSBwdXJwb3NlIHRoYXQgaXMgZW50aXJlbHkgd2VsbC1kZWZpbmVkIGluZGVwZW5kZW50IG9mIHRoZQ0KICAgIGFwcGxpY2F0aW9uLiAgVGhlcmVmb3JlLCBTdWJzZWN0aW9uIDJkIHJlcXVpcmVzIHRoYXQgYW55DQogICAgYXBwbGljYXRpb24tc3VwcGxpZWQgZnVuY3Rpb24gb3IgdGFibGUgdXNlZCBieSB0aGlzIGZ1bmN0aW9uIG11c3QNCiAgICBiZSBvcHRpb25hbDogaWYgdGhlIGFwcGxpY2F0aW9uIGRvZXMgbm90IHN1cHBseSBpdCwgdGhlIHNxdWFyZQ0KICAgIHJvb3QgZnVuY3Rpb24gbXVzdCBzdGlsbCBjb21wdXRlIHNxdWFyZSByb290cy4pDQoNClRoZXNlIHJlcXVpcmVtZW50cyBhcHBseSB0byB0aGUgbW9kaWZpZWQgd29yayBhcyBhIHdob2xlLiAgSWYNCmlkZW50aWZpYWJsZSBzZWN0aW9ucyBvZiB0aGF0IHdvcmsgYXJlIG5vdCBkZXJpdmVkIGZyb20gdGhlIExpYnJhcnksDQphbmQgY2FuIGJlIHJlYXNvbmFibHkgY29uc2lkZXJlZCBpbmRlcGVuZGVudCBhbmQgc2VwYXJhdGUgd29ya3MgaW4NCnRoZW1zZWx2ZXMsIHRoZW4gdGhpcyBMaWNlbnNlLCBhbmQgaXRzIHRlcm1zLCBkbyBub3QgYXBwbHkgdG8gdGhvc2UNCnNlY3Rpb25zIHdoZW4geW91IGRpc3RyaWJ1dGUgdGhlbSBhcyBzZXBhcmF0ZSB3b3Jrcy4gIEJ1dCB3aGVuIHlvdQ0KZGlzdHJpYnV0ZSB0aGUgc2FtZSBzZWN0aW9ucyBhcyBwYXJ0IG9mIGEgd2hvbGUgd2hpY2ggaXMgYSB3b3JrIGJhc2VkDQpvbiB0aGUgTGlicmFyeSwgdGhlIGRpc3RyaWJ1dGlvbiBvZiB0aGUgd2hvbGUgbXVzdCBiZSBvbiB0aGUgdGVybXMgb2YNCnRoaXMgTGljZW5zZSwgd2hvc2UgcGVybWlzc2lvbnMgZm9yIG90aGVyIGxpY2Vuc2VlcyBleHRlbmQgdG8gdGhlDQplbnRpcmUgd2hvbGUsIGFuZCB0aHVzIHRvIGVhY2ggYW5kIGV2ZXJ5IHBhcnQgcmVnYXJkbGVzcyBvZiB3aG8gd3JvdGUNCml0Lg0KDQpUaHVzLCBpdCBpcyBub3QgdGhlIGludGVudCBvZiB0aGlzIHNlY3Rpb24gdG8gY2xhaW0gcmlnaHRzIG9yIGNvbnRlc3QNCnlvdXIgcmlnaHRzIHRvIHdvcmsgd3JpdHRlbiBlbnRpcmVseSBieSB5b3U7IHJhdGhlciwgdGhlIGludGVudCBpcyB0bw0KZXhlcmNpc2UgdGhlIHJpZ2h0IHRvIGNvbnRyb2wgdGhlIGRpc3RyaWJ1dGlvbiBvZiBkZXJpdmF0aXZlIG9yDQpjb2xsZWN0aXZlIHdvcmtzIGJhc2VkIG9uIHRoZSBMaWJyYXJ5Lg0KDQpJbiBhZGRpdGlvbiwgbWVyZSBhZ2dyZWdhdGlvbiBvZiBhbm90aGVyIHdvcmsgbm90IGJhc2VkIG9uIHRoZSBMaWJyYXJ5DQp3aXRoIHRoZSBMaWJyYXJ5IChvciB3aXRoIGEgd29yayBiYXNlZCBvbiB0aGUgTGlicmFyeSkgb24gYSB2b2x1bWUgb2YNCmEgc3RvcmFnZSBvciBkaXN0cmlidXRpb24gbWVkaXVtIGRvZXMgbm90IGJyaW5nIHRoZSBvdGhlciB3b3JrIHVuZGVyDQp0aGUgc2NvcGUgb2YgdGhpcyBMaWNlbnNlLg0KDQogIDMuIFlvdSBtYXkgb3B0IHRvIGFwcGx5IHRoZSB0ZXJtcyBvZiB0aGUgb3JkaW5hcnkgR05VIEdlbmVyYWwgUHVibGljDQpMaWNlbnNlIGluc3RlYWQgb2YgdGhpcyBMaWNlbnNlIHRvIGEgZ2l2ZW4gY29weSBvZiB0aGUgTGlicmFyeS4gIFRvIGRvDQp0aGlzLCB5b3UgbXVzdCBhbHRlciBhbGwgdGhlIG5vdGljZXMgdGhhdCByZWZlciB0byB0aGlzIExpY2Vuc2UsIHNvDQp0aGF0IHRoZXkgcmVmZXIgdG8gdGhlIG9yZGluYXJ5IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCB2ZXJzaW9uIDIsDQppbnN0ZWFkIG9mIHRvIHRoaXMgTGljZW5zZS4gIChJZiBhIG5ld2VyIHZlcnNpb24gdGhhbiB2ZXJzaW9uIDIgb2YgdGhlDQpvcmRpbmFyeSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBoYXMgYXBwZWFyZWQsIHRoZW4geW91IGNhbiBzcGVjaWZ5DQp0aGF0IHZlcnNpb24gaW5zdGVhZCBpZiB5b3Ugd2lzaC4pICBEbyBub3QgbWFrZSBhbnkgb3RoZXIgY2hhbmdlIGluDQp0aGVzZSBub3RpY2VzLg0KDA0KICBPbmNlIHRoaXMgY2hhbmdlIGlzIG1hZGUgaW4gYSBnaXZlbiBjb3B5LCBpdCBpcyBpcnJldmVyc2libGUgZm9yDQp0aGF0IGNvcHksIHNvIHRoZSBvcmRpbmFyeSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcHBsaWVzIHRvIGFsbA0Kc3Vic2VxdWVudCBjb3BpZXMgYW5kIGRlcml2YXRpdmUgd29ya3MgbWFkZSBmcm9tIHRoYXQgY29weS4NCg0KICBUaGlzIG9wdGlvbiBpcyB1c2VmdWwgd2hlbiB5b3Ugd2lzaCB0byBjb3B5IHBhcnQgb2YgdGhlIGNvZGUgb2YNCnRoZSBMaWJyYXJ5IGludG8gYSBwcm9ncmFtIHRoYXQgaXMgbm90IGEgbGlicmFyeS4NCg0KICA0LiBZb3UgbWF5IGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIExpYnJhcnkgKG9yIGEgcG9ydGlvbiBvcg0KZGVyaXZhdGl2ZSBvZiBpdCwgdW5kZXIgU2VjdGlvbiAyKSBpbiBvYmplY3QgY29kZSBvciBleGVjdXRhYmxlIGZvcm0NCnVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9ucyAxIGFuZCAyIGFib3ZlIHByb3ZpZGVkIHRoYXQgeW91IGFjY29tcGFueQ0KaXQgd2l0aCB0aGUgY29tcGxldGUgY29ycmVzcG9uZGluZyBtYWNoaW5lLXJlYWRhYmxlIHNvdXJjZSBjb2RlLCB3aGljaA0KbXVzdCBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbnMgMSBhbmQgMiBhYm92ZSBvbiBhDQptZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgaW50ZXJjaGFuZ2UuDQoNCiAgSWYgZGlzdHJpYnV0aW9uIG9mIG9iamVjdCBjb2RlIGlzIG1hZGUgYnkgb2ZmZXJpbmcgYWNjZXNzIHRvIGNvcHkNCmZyb20gYSBkZXNpZ25hdGVkIHBsYWNlLCB0aGVuIG9mZmVyaW5nIGVxdWl2YWxlbnQgYWNjZXNzIHRvIGNvcHkgdGhlDQpzb3VyY2UgY29kZSBmcm9tIHRoZSBzYW1lIHBsYWNlIHNhdGlzZmllcyB0aGUgcmVxdWlyZW1lbnQgdG8NCmRpc3RyaWJ1dGUgdGhlIHNvdXJjZSBjb2RlLCBldmVuIHRob3VnaCB0aGlyZCBwYXJ0aWVzIGFyZSBub3QNCmNvbXBlbGxlZCB0byBjb3B5IHRoZSBzb3VyY2UgYWxvbmcgd2l0aCB0aGUgb2JqZWN0IGNvZGUuDQoNCiAgNS4gQSBwcm9ncmFtIHRoYXQgY29udGFpbnMgbm8gZGVyaXZhdGl2ZSBvZiBhbnkgcG9ydGlvbiBvZiB0aGUNCkxpYnJhcnksIGJ1dCBpcyBkZXNpZ25lZCB0byB3b3JrIHdpdGggdGhlIExpYnJhcnkgYnkgYmVpbmcgY29tcGlsZWQgb3INCmxpbmtlZCB3aXRoIGl0LCBpcyBjYWxsZWQgYSAid29yayB0aGF0IHVzZXMgdGhlIExpYnJhcnkiLiAgU3VjaCBhDQp3b3JrLCBpbiBpc29sYXRpb24sIGlzIG5vdCBhIGRlcml2YXRpdmUgd29yayBvZiB0aGUgTGlicmFyeSwgYW5kDQp0aGVyZWZvcmUgZmFsbHMgb3V0c2lkZSB0aGUgc2NvcGUgb2YgdGhpcyBMaWNlbnNlLg0KDQogIEhvd2V2ZXIsIGxpbmtpbmcgYSAid29yayB0aGF0IHVzZXMgdGhlIExpYnJhcnkiIHdpdGggdGhlIExpYnJhcnkNCmNyZWF0ZXMgYW4gZXhlY3V0YWJsZSB0aGF0IGlzIGEgZGVyaXZhdGl2ZSBvZiB0aGUgTGlicmFyeSAoYmVjYXVzZSBpdA0KY29udGFpbnMgcG9ydGlvbnMgb2YgdGhlIExpYnJhcnkpLCByYXRoZXIgdGhhbiBhICJ3b3JrIHRoYXQgdXNlcyB0aGUNCmxpYnJhcnkiLiAgVGhlIGV4ZWN1dGFibGUgaXMgdGhlcmVmb3JlIGNvdmVyZWQgYnkgdGhpcyBMaWNlbnNlLg0KU2VjdGlvbiA2IHN0YXRlcyB0ZXJtcyBmb3IgZGlzdHJpYnV0aW9uIG9mIHN1Y2ggZXhlY3V0YWJsZXMuDQoNCiAgV2hlbiBhICJ3b3JrIHRoYXQgdXNlcyB0aGUgTGlicmFyeSIgdXNlcyBtYXRlcmlhbCBmcm9tIGEgaGVhZGVyIGZpbGUNCnRoYXQgaXMgcGFydCBvZiB0aGUgTGlicmFyeSwgdGhlIG9iamVjdCBjb2RlIGZvciB0aGUgd29yayBtYXkgYmUgYQ0KZGVyaXZhdGl2ZSB3b3JrIG9mIHRoZSBMaWJyYXJ5IGV2ZW4gdGhvdWdoIHRoZSBzb3VyY2UgY29kZSBpcyBub3QuDQpXaGV0aGVyIHRoaXMgaXMgdHJ1ZSBpcyBlc3BlY2lhbGx5IHNpZ25pZmljYW50IGlmIHRoZSB3b3JrIGNhbiBiZQ0KbGlua2VkIHdpdGhvdXQgdGhlIExpYnJhcnksIG9yIGlmIHRoZSB3b3JrIGlzIGl0c2VsZiBhIGxpYnJhcnkuICBUaGUNCnRocmVzaG9sZCBmb3IgdGhpcyB0byBiZSB0cnVlIGlzIG5vdCBwcmVjaXNlbHkgZGVmaW5lZCBieSBsYXcuDQoNCiAgSWYgc3VjaCBhbiBvYmplY3QgZmlsZSB1c2VzIG9ubHkgbnVtZXJpY2FsIHBhcmFtZXRlcnMsIGRhdGENCnN0cnVjdHVyZSBsYXlvdXRzIGFuZCBhY2Nlc3NvcnMsIGFuZCBzbWFsbCBtYWNyb3MgYW5kIHNtYWxsIGlubGluZQ0KZnVuY3Rpb25zICh0ZW4gbGluZXMgb3IgbGVzcyBpbiBsZW5ndGgpLCB0aGVuIHRoZSB1c2Ugb2YgdGhlIG9iamVjdA0KZmlsZSBpcyB1bnJlc3RyaWN0ZWQsIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBpdCBpcyBsZWdhbGx5IGEgZGVyaXZhdGl2ZQ0Kd29yay4gIChFeGVjdXRhYmxlcyBjb250YWluaW5nIHRoaXMgb2JqZWN0IGNvZGUgcGx1cyBwb3J0aW9ucyBvZiB0aGUNCkxpYnJhcnkgd2lsbCBzdGlsbCBmYWxsIHVuZGVyIFNlY3Rpb24gNi4pDQoNCiAgT3RoZXJ3aXNlLCBpZiB0aGUgd29yayBpcyBhIGRlcml2YXRpdmUgb2YgdGhlIExpYnJhcnksIHlvdSBtYXkNCmRpc3RyaWJ1dGUgdGhlIG9iamVjdCBjb2RlIGZvciB0aGUgd29yayB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbiA2Lg0KQW55IGV4ZWN1dGFibGVzIGNvbnRhaW5pbmcgdGhhdCB3b3JrIGFsc28gZmFsbCB1bmRlciBTZWN0aW9uIDYsDQp3aGV0aGVyIG9yIG5vdCB0aGV5IGFyZSBsaW5rZWQgZGlyZWN0bHkgd2l0aCB0aGUgTGlicmFyeSBpdHNlbGYuDQoMDQogIDYuIEFzIGFuIGV4Y2VwdGlvbiB0byB0aGUgU2VjdGlvbnMgYWJvdmUsIHlvdSBtYXkgYWxzbyBjb21iaW5lIG9yDQpsaW5rIGEgIndvcmsgdGhhdCB1c2VzIHRoZSBMaWJyYXJ5IiB3aXRoIHRoZSBMaWJyYXJ5IHRvIHByb2R1Y2UgYQ0Kd29yayBjb250YWluaW5nIHBvcnRpb25zIG9mIHRoZSBMaWJyYXJ5LCBhbmQgZGlzdHJpYnV0ZSB0aGF0IHdvcmsNCnVuZGVyIHRlcm1zIG9mIHlvdXIgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHRoZSB0ZXJtcyBwZXJtaXQNCm1vZGlmaWNhdGlvbiBvZiB0aGUgd29yayBmb3IgdGhlIGN1c3RvbWVyJ3Mgb3duIHVzZSBhbmQgcmV2ZXJzZQ0KZW5naW5lZXJpbmcgZm9yIGRlYnVnZ2luZyBzdWNoIG1vZGlmaWNhdGlvbnMuDQoNCiAgWW91IG11c3QgZ2l2ZSBwcm9taW5lbnQgbm90aWNlIHdpdGggZWFjaCBjb3B5IG9mIHRoZSB3b3JrIHRoYXQgdGhlDQpMaWJyYXJ5IGlzIHVzZWQgaW4gaXQgYW5kIHRoYXQgdGhlIExpYnJhcnkgYW5kIGl0cyB1c2UgYXJlIGNvdmVyZWQgYnkNCnRoaXMgTGljZW5zZS4gIFlvdSBtdXN0IHN1cHBseSBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlLiAgSWYgdGhlIHdvcmsNCmR1cmluZyBleGVjdXRpb24gZGlzcGxheXMgY29weXJpZ2h0IG5vdGljZXMsIHlvdSBtdXN0IGluY2x1ZGUgdGhlDQpjb3B5cmlnaHQgbm90aWNlIGZvciB0aGUgTGlicmFyeSBhbW9uZyB0aGVtLCBhcyB3ZWxsIGFzIGEgcmVmZXJlbmNlDQpkaXJlY3RpbmcgdGhlIHVzZXIgdG8gdGhlIGNvcHkgb2YgdGhpcyBMaWNlbnNlLiAgQWxzbywgeW91IG11c3QgZG8gb25lDQpvZiB0aGVzZSB0aGluZ3M6DQoNCiAgICBhKSBBY2NvbXBhbnkgdGhlIHdvcmsgd2l0aCB0aGUgY29tcGxldGUgY29ycmVzcG9uZGluZw0KICAgIG1hY2hpbmUtcmVhZGFibGUgc291cmNlIGNvZGUgZm9yIHRoZSBMaWJyYXJ5IGluY2x1ZGluZyB3aGF0ZXZlcg0KICAgIGNoYW5nZXMgd2VyZSB1c2VkIGluIHRoZSB3b3JrICh3aGljaCBtdXN0IGJlIGRpc3RyaWJ1dGVkIHVuZGVyDQogICAgU2VjdGlvbnMgMSBhbmQgMiBhYm92ZSk7IGFuZCwgaWYgdGhlIHdvcmsgaXMgYW4gZXhlY3V0YWJsZSBsaW5rZWQNCiAgICB3aXRoIHRoZSBMaWJyYXJ5LCB3aXRoIHRoZSBjb21wbGV0ZSBtYWNoaW5lLXJlYWRhYmxlICJ3b3JrIHRoYXQNCiAgICB1c2VzIHRoZSBMaWJyYXJ5IiwgYXMgb2JqZWN0IGNvZGUgYW5kL29yIHNvdXJjZSBjb2RlLCBzbyB0aGF0IHRoZQ0KICAgIHVzZXIgY2FuIG1vZGlmeSB0aGUgTGlicmFyeSBhbmQgdGhlbiByZWxpbmsgdG8gcHJvZHVjZSBhIG1vZGlmaWVkDQogICAgZXhlY3V0YWJsZSBjb250YWluaW5nIHRoZSBtb2RpZmllZCBMaWJyYXJ5LiAgKEl0IGlzIHVuZGVyc3Rvb2QNCiAgICB0aGF0IHRoZSB1c2VyIHdobyBjaGFuZ2VzIHRoZSBjb250ZW50cyBvZiBkZWZpbml0aW9ucyBmaWxlcyBpbiB0aGUNCiAgICBMaWJyYXJ5IHdpbGwgbm90IG5lY2Vzc2FyaWx5IGJlIGFibGUgdG8gcmVjb21waWxlIHRoZSBhcHBsaWNhdGlvbg0KICAgIHRvIHVzZSB0aGUgbW9kaWZpZWQgZGVmaW5pdGlvbnMuKQ0KDQogICAgYikgVXNlIGEgc3VpdGFibGUgc2hhcmVkIGxpYnJhcnkgbWVjaGFuaXNtIGZvciBsaW5raW5nIHdpdGggdGhlDQogICAgTGlicmFyeS4gIEEgc3VpdGFibGUgbWVjaGFuaXNtIGlzIG9uZSB0aGF0ICgxKSB1c2VzIGF0IHJ1biB0aW1lIGENCiAgICBjb3B5IG9mIHRoZSBsaWJyYXJ5IGFscmVhZHkgcHJlc2VudCBvbiB0aGUgdXNlcidzIGNvbXB1dGVyIHN5c3RlbSwNCiAgICByYXRoZXIgdGhhbiBjb3B5aW5nIGxpYnJhcnkgZnVuY3Rpb25zIGludG8gdGhlIGV4ZWN1dGFibGUsIGFuZCAoMikNCiAgICB3aWxsIG9wZXJhdGUgcHJvcGVybHkgd2l0aCBhIG1vZGlmaWVkIHZlcnNpb24gb2YgdGhlIGxpYnJhcnksIGlmDQogICAgdGhlIHVzZXIgaW5zdGFsbHMgb25lLCBhcyBsb25nIGFzIHRoZSBtb2RpZmllZCB2ZXJzaW9uIGlzDQogICAgaW50ZXJmYWNlLWNvbXBhdGlibGUgd2l0aCB0aGUgdmVyc2lvbiB0aGF0IHRoZSB3b3JrIHdhcyBtYWRlIHdpdGguDQoNCiAgICBjKSBBY2NvbXBhbnkgdGhlIHdvcmsgd2l0aCBhIHdyaXR0ZW4gb2ZmZXIsIHZhbGlkIGZvciBhdA0KICAgIGxlYXN0IHRocmVlIHllYXJzLCB0byBnaXZlIHRoZSBzYW1lIHVzZXIgdGhlIG1hdGVyaWFscw0KICAgIHNwZWNpZmllZCBpbiBTdWJzZWN0aW9uIDZhLCBhYm92ZSwgZm9yIGEgY2hhcmdlIG5vIG1vcmUNCiAgICB0aGFuIHRoZSBjb3N0IG9mIHBlcmZvcm1pbmcgdGhpcyBkaXN0cmlidXRpb24uDQoNCiAgICBkKSBJZiBkaXN0cmlidXRpb24gb2YgdGhlIHdvcmsgaXMgbWFkZSBieSBvZmZlcmluZyBhY2Nlc3MgdG8gY29weQ0KICAgIGZyb20gYSBkZXNpZ25hdGVkIHBsYWNlLCBvZmZlciBlcXVpdmFsZW50IGFjY2VzcyB0byBjb3B5IHRoZSBhYm92ZQ0KICAgIHNwZWNpZmllZCBtYXRlcmlhbHMgZnJvbSB0aGUgc2FtZSBwbGFjZS4NCg0KICAgIGUpIFZlcmlmeSB0aGF0IHRoZSB1c2VyIGhhcyBhbHJlYWR5IHJlY2VpdmVkIGEgY29weSBvZiB0aGVzZQ0KICAgIG1hdGVyaWFscyBvciB0aGF0IHlvdSBoYXZlIGFscmVhZHkgc2VudCB0aGlzIHVzZXIgYSBjb3B5Lg0KDQogIEZvciBhbiBleGVjdXRhYmxlLCB0aGUgcmVxdWlyZWQgZm9ybSBvZiB0aGUgIndvcmsgdGhhdCB1c2VzIHRoZQ0KTGlicmFyeSIgbXVzdCBpbmNsdWRlIGFueSBkYXRhIGFuZCB1dGlsaXR5IHByb2dyYW1zIG5lZWRlZCBmb3INCnJlcHJvZHVjaW5nIHRoZSBleGVjdXRhYmxlIGZyb20gaXQuICBIb3dldmVyLCBhcyBhIHNwZWNpYWwgZXhjZXB0aW9uLA0KdGhlIG1hdGVyaWFscyB0byBiZSBkaXN0cmlidXRlZCBuZWVkIG5vdCBpbmNsdWRlIGFueXRoaW5nIHRoYXQgaXMNCm5vcm1hbGx5IGRpc3RyaWJ1dGVkIChpbiBlaXRoZXIgc291cmNlIG9yIGJpbmFyeSBmb3JtKSB3aXRoIHRoZSBtYWpvcg0KY29tcG9uZW50cyAoY29tcGlsZXIsIGtlcm5lbCwgYW5kIHNvIG9uKSBvZiB0aGUgb3BlcmF0aW5nIHN5c3RlbSBvbg0Kd2hpY2ggdGhlIGV4ZWN1dGFibGUgcnVucywgdW5sZXNzIHRoYXQgY29tcG9uZW50IGl0c2VsZiBhY2NvbXBhbmllcw0KdGhlIGV4ZWN1dGFibGUuDQoNCiAgSXQgbWF5IGhhcHBlbiB0aGF0IHRoaXMgcmVxdWlyZW1lbnQgY29udHJhZGljdHMgdGhlIGxpY2Vuc2UNCnJlc3RyaWN0aW9ucyBvZiBvdGhlciBwcm9wcmlldGFyeSBsaWJyYXJpZXMgdGhhdCBkbyBub3Qgbm9ybWFsbHkNCmFjY29tcGFueSB0aGUgb3BlcmF0aW5nIHN5c3RlbS4gIFN1Y2ggYSBjb250cmFkaWN0aW9uIG1lYW5zIHlvdSBjYW5ub3QNCnVzZSBib3RoIHRoZW0gYW5kIHRoZSBMaWJyYXJ5IHRvZ2V0aGVyIGluIGFuIGV4ZWN1dGFibGUgdGhhdCB5b3UNCmRpc3RyaWJ1dGUuDQoMDQogIDcuIFlvdSBtYXkgcGxhY2UgbGlicmFyeSBmYWNpbGl0aWVzIHRoYXQgYXJlIGEgd29yayBiYXNlZCBvbiB0aGUNCkxpYnJhcnkgc2lkZS1ieS1zaWRlIGluIGEgc2luZ2xlIGxpYnJhcnkgdG9nZXRoZXIgd2l0aCBvdGhlciBsaWJyYXJ5DQpmYWNpbGl0aWVzIG5vdCBjb3ZlcmVkIGJ5IHRoaXMgTGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgc3VjaCBhIGNvbWJpbmVkDQpsaWJyYXJ5LCBwcm92aWRlZCB0aGF0IHRoZSBzZXBhcmF0ZSBkaXN0cmlidXRpb24gb2YgdGhlIHdvcmsgYmFzZWQgb24NCnRoZSBMaWJyYXJ5IGFuZCBvZiB0aGUgb3RoZXIgbGlicmFyeSBmYWNpbGl0aWVzIGlzIG90aGVyd2lzZQ0KcGVybWl0dGVkLCBhbmQgcHJvdmlkZWQgdGhhdCB5b3UgZG8gdGhlc2UgdHdvIHRoaW5nczoNCg0KICAgIGEpIEFjY29tcGFueSB0aGUgY29tYmluZWQgbGlicmFyeSB3aXRoIGEgY29weSBvZiB0aGUgc2FtZSB3b3JrDQogICAgYmFzZWQgb24gdGhlIExpYnJhcnksIHVuY29tYmluZWQgd2l0aCBhbnkgb3RoZXIgbGlicmFyeQ0KICAgIGZhY2lsaXRpZXMuICBUaGlzIG11c3QgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQ0KICAgIFNlY3Rpb25zIGFib3ZlLg0KDQogICAgYikgR2l2ZSBwcm9taW5lbnQgbm90aWNlIHdpdGggdGhlIGNvbWJpbmVkIGxpYnJhcnkgb2YgdGhlIGZhY3QNCiAgICB0aGF0IHBhcnQgb2YgaXQgaXMgYSB3b3JrIGJhc2VkIG9uIHRoZSBMaWJyYXJ5LCBhbmQgZXhwbGFpbmluZw0KICAgIHdoZXJlIHRvIGZpbmQgdGhlIGFjY29tcGFueWluZyB1bmNvbWJpbmVkIGZvcm0gb2YgdGhlIHNhbWUgd29yay4NCg0KICA4LiBZb3UgbWF5IG5vdCBjb3B5LCBtb2RpZnksIHN1YmxpY2Vuc2UsIGxpbmsgd2l0aCwgb3IgZGlzdHJpYnV0ZQ0KdGhlIExpYnJhcnkgZXhjZXB0IGFzIGV4cHJlc3NseSBwcm92aWRlZCB1bmRlciB0aGlzIExpY2Vuc2UuICBBbnkNCmF0dGVtcHQgb3RoZXJ3aXNlIHRvIGNvcHksIG1vZGlmeSwgc3VibGljZW5zZSwgbGluayB3aXRoLCBvcg0KZGlzdHJpYnV0ZSB0aGUgTGlicmFyeSBpcyB2b2lkLCBhbmQgd2lsbCBhdXRvbWF0aWNhbGx5IHRlcm1pbmF0ZSB5b3VyDQpyaWdodHMgdW5kZXIgdGhpcyBMaWNlbnNlLiAgSG93ZXZlciwgcGFydGllcyB3aG8gaGF2ZSByZWNlaXZlZCBjb3BpZXMsDQpvciByaWdodHMsIGZyb20geW91IHVuZGVyIHRoaXMgTGljZW5zZSB3aWxsIG5vdCBoYXZlIHRoZWlyIGxpY2Vuc2VzDQp0ZXJtaW5hdGVkIHNvIGxvbmcgYXMgc3VjaCBwYXJ0aWVzIHJlbWFpbiBpbiBmdWxsIGNvbXBsaWFuY2UuDQoNCiAgOS4gWW91IGFyZSBub3QgcmVxdWlyZWQgdG8gYWNjZXB0IHRoaXMgTGljZW5zZSwgc2luY2UgeW91IGhhdmUgbm90DQpzaWduZWQgaXQuICBIb3dldmVyLCBub3RoaW5nIGVsc2UgZ3JhbnRzIHlvdSBwZXJtaXNzaW9uIHRvIG1vZGlmeSBvcg0KZGlzdHJpYnV0ZSB0aGUgTGlicmFyeSBvciBpdHMgZGVyaXZhdGl2ZSB3b3Jrcy4gIFRoZXNlIGFjdGlvbnMgYXJlDQpwcm9oaWJpdGVkIGJ5IGxhdyBpZiB5b3UgZG8gbm90IGFjY2VwdCB0aGlzIExpY2Vuc2UuICBUaGVyZWZvcmUsIGJ5DQptb2RpZnlpbmcgb3IgZGlzdHJpYnV0aW5nIHRoZSBMaWJyYXJ5IChvciBhbnkgd29yayBiYXNlZCBvbiB0aGUNCkxpYnJhcnkpLCB5b3UgaW5kaWNhdGUgeW91ciBhY2NlcHRhbmNlIG9mIHRoaXMgTGljZW5zZSB0byBkbyBzbywgYW5kDQphbGwgaXRzIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciBjb3B5aW5nLCBkaXN0cmlidXRpbmcgb3IgbW9kaWZ5aW5nDQp0aGUgTGlicmFyeSBvciB3b3JrcyBiYXNlZCBvbiBpdC4NCg0KICAxMC4gRWFjaCB0aW1lIHlvdSByZWRpc3RyaWJ1dGUgdGhlIExpYnJhcnkgKG9yIGFueSB3b3JrIGJhc2VkIG9uIHRoZQ0KTGlicmFyeSksIHRoZSByZWNpcGllbnQgYXV0b21hdGljYWxseSByZWNlaXZlcyBhIGxpY2Vuc2UgZnJvbSB0aGUNCm9yaWdpbmFsIGxpY2Vuc29yIHRvIGNvcHksIGRpc3RyaWJ1dGUsIGxpbmsgd2l0aCBvciBtb2RpZnkgdGhlIExpYnJhcnkNCnN1YmplY3QgdG8gdGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMuICBZb3UgbWF5IG5vdCBpbXBvc2UgYW55IGZ1cnRoZXINCnJlc3RyaWN0aW9ucyBvbiB0aGUgcmVjaXBpZW50cycgZXhlcmNpc2Ugb2YgdGhlIHJpZ2h0cyBncmFudGVkIGhlcmVpbi4NCllvdSBhcmUgbm90IHJlc3BvbnNpYmxlIGZvciBlbmZvcmNpbmcgY29tcGxpYW5jZSBieSB0aGlyZCBwYXJ0aWVzIHdpdGgNCnRoaXMgTGljZW5zZS4NCgwNCiAgMTEuIElmLCBhcyBhIGNvbnNlcXVlbmNlIG9mIGEgY291cnQganVkZ21lbnQgb3IgYWxsZWdhdGlvbiBvZiBwYXRlbnQNCmluZnJpbmdlbWVudCBvciBmb3IgYW55IG90aGVyIHJlYXNvbiAobm90IGxpbWl0ZWQgdG8gcGF0ZW50IGlzc3VlcyksDQpjb25kaXRpb25zIGFyZSBpbXBvc2VkIG9uIHlvdSAod2hldGhlciBieSBjb3VydCBvcmRlciwgYWdyZWVtZW50IG9yDQpvdGhlcndpc2UpIHRoYXQgY29udHJhZGljdCB0aGUgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UsIHRoZXkgZG8gbm90DQpleGN1c2UgeW91IGZyb20gdGhlIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlLiAgSWYgeW91IGNhbm5vdA0KZGlzdHJpYnV0ZSBzbyBhcyB0byBzYXRpc2Z5IHNpbXVsdGFuZW91c2x5IHlvdXIgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcw0KTGljZW5zZSBhbmQgYW55IG90aGVyIHBlcnRpbmVudCBvYmxpZ2F0aW9ucywgdGhlbiBhcyBhIGNvbnNlcXVlbmNlIHlvdQ0KbWF5IG5vdCBkaXN0cmlidXRlIHRoZSBMaWJyYXJ5IGF0IGFsbC4gIEZvciBleGFtcGxlLCBpZiBhIHBhdGVudA0KbGljZW5zZSB3b3VsZCBub3QgcGVybWl0IHJveWFsdHktZnJlZSByZWRpc3RyaWJ1dGlvbiBvZiB0aGUgTGlicmFyeSBieQ0KYWxsIHRob3NlIHdobyByZWNlaXZlIGNvcGllcyBkaXJlY3RseSBvciBpbmRpcmVjdGx5IHRocm91Z2ggeW91LCB0aGVuDQp0aGUgb25seSB3YXkgeW91IGNvdWxkIHNhdGlzZnkgYm90aCBpdCBhbmQgdGhpcyBMaWNlbnNlIHdvdWxkIGJlIHRvDQpyZWZyYWluIGVudGlyZWx5IGZyb20gZGlzdHJpYnV0aW9uIG9mIHRoZSBMaWJyYXJ5Lg0KDQpJZiBhbnkgcG9ydGlvbiBvZiB0aGlzIHNlY3Rpb24gaXMgaGVsZCBpbnZhbGlkIG9yIHVuZW5mb3JjZWFibGUgdW5kZXIgYW55DQpwYXJ0aWN1bGFyIGNpcmN1bXN0YW5jZSwgdGhlIGJhbGFuY2Ugb2YgdGhlIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8gYXBwbHksDQphbmQgdGhlIHNlY3Rpb24gYXMgYSB3aG9sZSBpcyBpbnRlbmRlZCB0byBhcHBseSBpbiBvdGhlciBjaXJjdW1zdGFuY2VzLg0KDQpJdCBpcyBub3QgdGhlIHB1cnBvc2Ugb2YgdGhpcyBzZWN0aW9uIHRvIGluZHVjZSB5b3UgdG8gaW5mcmluZ2UgYW55DQpwYXRlbnRzIG9yIG90aGVyIHByb3BlcnR5IHJpZ2h0IGNsYWltcyBvciB0byBjb250ZXN0IHZhbGlkaXR5IG9mIGFueQ0Kc3VjaCBjbGFpbXM7IHRoaXMgc2VjdGlvbiBoYXMgdGhlIHNvbGUgcHVycG9zZSBvZiBwcm90ZWN0aW5nIHRoZQ0KaW50ZWdyaXR5IG9mIHRoZSBmcmVlIHNvZnR3YXJlIGRpc3RyaWJ1dGlvbiBzeXN0ZW0gd2hpY2ggaXMNCmltcGxlbWVudGVkIGJ5IHB1YmxpYyBsaWNlbnNlIHByYWN0aWNlcy4gIE1hbnkgcGVvcGxlIGhhdmUgbWFkZQ0KZ2VuZXJvdXMgY29udHJpYnV0aW9ucyB0byB0aGUgd2lkZSByYW5nZSBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZA0KdGhyb3VnaCB0aGF0IHN5c3RlbSBpbiByZWxpYW5jZSBvbiBjb25zaXN0ZW50IGFwcGxpY2F0aW9uIG9mIHRoYXQNCnN5c3RlbTsgaXQgaXMgdXAgdG8gdGhlIGF1dGhvci9kb25vciB0byBkZWNpZGUgaWYgaGUgb3Igc2hlIGlzIHdpbGxpbmcNCnRvIGRpc3RyaWJ1dGUgc29mdHdhcmUgdGhyb3VnaCBhbnkgb3RoZXIgc3lzdGVtIGFuZCBhIGxpY2Vuc2VlIGNhbm5vdA0KaW1wb3NlIHRoYXQgY2hvaWNlLg0KDQpUaGlzIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8gbWFrZSB0aG9yb3VnaGx5IGNsZWFyIHdoYXQgaXMgYmVsaWV2ZWQgdG8NCmJlIGEgY29uc2VxdWVuY2Ugb2YgdGhlIHJlc3Qgb2YgdGhpcyBMaWNlbnNlLg0KDQogIDEyLiBJZiB0aGUgZGlzdHJpYnV0aW9uIGFuZC9vciB1c2Ugb2YgdGhlIExpYnJhcnkgaXMgcmVzdHJpY3RlZCBpbg0KY2VydGFpbiBjb3VudHJpZXMgZWl0aGVyIGJ5IHBhdGVudHMgb3IgYnkgY29weXJpZ2h0ZWQgaW50ZXJmYWNlcywgdGhlDQpvcmlnaW5hbCBjb3B5cmlnaHQgaG9sZGVyIHdobyBwbGFjZXMgdGhlIExpYnJhcnkgdW5kZXIgdGhpcyBMaWNlbnNlIG1heSBhZGQNCmFuIGV4cGxpY2l0IGdlb2dyYXBoaWNhbCBkaXN0cmlidXRpb24gbGltaXRhdGlvbiBleGNsdWRpbmcgdGhvc2UgY291bnRyaWVzLA0Kc28gdGhhdCBkaXN0cmlidXRpb24gaXMgcGVybWl0dGVkIG9ubHkgaW4gb3IgYW1vbmcgY291bnRyaWVzIG5vdCB0aHVzDQpleGNsdWRlZC4gIEluIHN1Y2ggY2FzZSwgdGhpcyBMaWNlbnNlIGluY29ycG9yYXRlcyB0aGUgbGltaXRhdGlvbiBhcyBpZg0Kd3JpdHRlbiBpbiB0aGUgYm9keSBvZiB0aGlzIExpY2Vuc2UuDQoNCiAgMTMuIFRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gbWF5IHB1Ymxpc2ggcmV2aXNlZCBhbmQvb3IgbmV3DQp2ZXJzaW9ucyBvZiB0aGUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZnJvbSB0aW1lIHRvIHRpbWUuDQpTdWNoIG5ldyB2ZXJzaW9ucyB3aWxsIGJlIHNpbWlsYXIgaW4gc3Bpcml0IHRvIHRoZSBwcmVzZW50IHZlcnNpb24sDQpidXQgbWF5IGRpZmZlciBpbiBkZXRhaWwgdG8gYWRkcmVzcyBuZXcgcHJvYmxlbXMgb3IgY29uY2VybnMuDQoNCkVhY2ggdmVyc2lvbiBpcyBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiAgSWYgdGhlIExpYnJhcnkNCnNwZWNpZmllcyBhIHZlcnNpb24gbnVtYmVyIG9mIHRoaXMgTGljZW5zZSB3aGljaCBhcHBsaWVzIHRvIGl0IGFuZA0KImFueSBsYXRlciB2ZXJzaW9uIiwgeW91IGhhdmUgdGhlIG9wdGlvbiBvZiBmb2xsb3dpbmcgdGhlIHRlcm1zIGFuZA0KY29uZGl0aW9ucyBlaXRoZXIgb2YgdGhhdCB2ZXJzaW9uIG9yIG9mIGFueSBsYXRlciB2ZXJzaW9uIHB1Ymxpc2hlZCBieQ0KdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIElmIHRoZSBMaWJyYXJ5IGRvZXMgbm90IHNwZWNpZnkgYQ0KbGljZW5zZSB2ZXJzaW9uIG51bWJlciwgeW91IG1heSBjaG9vc2UgYW55IHZlcnNpb24gZXZlciBwdWJsaXNoZWQgYnkNCnRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uDQoMDQogIDE0LiBJZiB5b3Ugd2lzaCB0byBpbmNvcnBvcmF0ZSBwYXJ0cyBvZiB0aGUgTGlicmFyeSBpbnRvIG90aGVyIGZyZWUNCnByb2dyYW1zIHdob3NlIGRpc3RyaWJ1dGlvbiBjb25kaXRpb25zIGFyZSBpbmNvbXBhdGlibGUgd2l0aCB0aGVzZSwNCndyaXRlIHRvIHRoZSBhdXRob3IgdG8gYXNrIGZvciBwZXJtaXNzaW9uLiAgRm9yIHNvZnR3YXJlIHdoaWNoIGlzDQpjb3B5cmlnaHRlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB3cml0ZSB0byB0aGUgRnJlZQ0KU29mdHdhcmUgRm91bmRhdGlvbjsgd2Ugc29tZXRpbWVzIG1ha2UgZXhjZXB0aW9ucyBmb3IgdGhpcy4gIE91cg0KZGVjaXNpb24gd2lsbCBiZSBndWlkZWQgYnkgdGhlIHR3byBnb2FscyBvZiBwcmVzZXJ2aW5nIHRoZSBmcmVlIHN0YXR1cw0Kb2YgYWxsIGRlcml2YXRpdmVzIG9mIG91ciBmcmVlIHNvZnR3YXJlIGFuZCBvZiBwcm9tb3RpbmcgdGhlIHNoYXJpbmcNCmFuZCByZXVzZSBvZiBzb2Z0d2FyZSBnZW5lcmFsbHkuDQoNCgkJCSAgICBOTyBXQVJSQU5UWQ0KDQogIDE1LiBCRUNBVVNFIFRIRSBMSUJSQVJZIElTIExJQ0VOU0VEIEZSRUUgT0YgQ0hBUkdFLCBUSEVSRSBJUyBOTw0KV0FSUkFOVFkgRk9SIFRIRSBMSUJSQVJZLCBUTyBUSEUgRVhURU5UIFBFUk1JVFRFRCBCWSBBUFBMSUNBQkxFIExBVy4NCkVYQ0VQVCBXSEVOIE9USEVSV0lTRSBTVEFURUQgSU4gV1JJVElORyBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EL09SDQpPVEhFUiBQQVJUSUVTIFBST1ZJREUgVEhFIExJQlJBUlkgIkFTIElTIiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWQ0KS0lORCwgRUlUSEVSIEVYUFJFU1NFRCBPUiBJTVBMSUVELCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFDQpJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVINClBVUlBPU0UuICBUSEUgRU5USVJFIFJJU0sgQVMgVE8gVEhFIFFVQUxJVFkgQU5EIFBFUkZPUk1BTkNFIE9GIFRIRQ0KTElCUkFSWSBJUyBXSVRIIFlPVS4gIFNIT1VMRCBUSEUgTElCUkFSWSBQUk9WRSBERUZFQ1RJVkUsIFlPVSBBU1NVTUUNClRIRSBDT1NUIE9GIEFMTCBORUNFU1NBUlkgU0VSVklDSU5HLCBSRVBBSVIgT1IgQ09SUkVDVElPTi4NCg0KICAxNi4gSU4gTk8gRVZFTlQgVU5MRVNTIFJFUVVJUkVEIEJZIEFQUExJQ0FCTEUgTEFXIE9SIEFHUkVFRCBUTyBJTg0KV1JJVElORyBXSUxMIEFOWSBDT1BZUklHSFQgSE9MREVSLCBPUiBBTlkgT1RIRVIgUEFSVFkgV0hPIE1BWSBNT0RJRlkNCkFORC9PUiBSRURJU1RSSUJVVEUgVEhFIExJQlJBUlkgQVMgUEVSTUlUVEVEIEFCT1ZFLCBCRSBMSUFCTEUgVE8gWU9VDQpGT1IgREFNQUdFUywgSU5DTFVESU5HIEFOWSBHRU5FUkFMLCBTUEVDSUFMLCBJTkNJREVOVEFMIE9SDQpDT05TRVFVRU5USUFMIERBTUFHRVMgQVJJU0lORyBPVVQgT0YgVEhFIFVTRSBPUiBJTkFCSUxJVFkgVE8gVVNFIFRIRQ0KTElCUkFSWSAoSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBMT1NTIE9GIERBVEEgT1IgREFUQSBCRUlORw0KUkVOREVSRUQgSU5BQ0NVUkFURSBPUiBMT1NTRVMgU1VTVEFJTkVEIEJZIFlPVSBPUiBUSElSRCBQQVJUSUVTIE9SIEENCkZBSUxVUkUgT0YgVEhFIExJQlJBUlkgVE8gT1BFUkFURSBXSVRIIEFOWSBPVEhFUiBTT0ZUV0FSRSksIEVWRU4gSUYNClNVQ0ggSE9MREVSIE9SIE9USEVSIFBBUlRZIEhBUyBCRUVOIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gNCkRBTUFHRVMuDQoNCgkJICAgICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMNCgwNCiAgICAgICAgICAgSG93IHRvIEFwcGx5IFRoZXNlIFRlcm1zIHRvIFlvdXIgTmV3IExpYnJhcmllcw0KDQogIElmIHlvdSBkZXZlbG9wIGEgbmV3IGxpYnJhcnksIGFuZCB5b3Ugd2FudCBpdCB0byBiZSBvZiB0aGUgZ3JlYXRlc3QNCnBvc3NpYmxlIHVzZSB0byB0aGUgcHVibGljLCB3ZSByZWNvbW1lbmQgbWFraW5nIGl0IGZyZWUgc29mdHdhcmUgdGhhdA0KZXZlcnlvbmUgY2FuIHJlZGlzdHJpYnV0ZSBhbmQgY2hhbmdlLiAgWW91IGNhbiBkbyBzbyBieSBwZXJtaXR0aW5nDQpyZWRpc3RyaWJ1dGlvbiB1bmRlciB0aGVzZSB0ZXJtcyAob3IsIGFsdGVybmF0aXZlbHksIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUNCm9yZGluYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UpLg0KDQogIFRvIGFwcGx5IHRoZXNlIHRlcm1zLCBhdHRhY2ggdGhlIGZvbGxvd2luZyBub3RpY2VzIHRvIHRoZSBsaWJyYXJ5LiAgSXQgaXMNCnNhZmVzdCB0byBhdHRhY2ggdGhlbSB0byB0aGUgc3RhcnQgb2YgZWFjaCBzb3VyY2UgZmlsZSB0byBtb3N0IGVmZmVjdGl2ZWx5DQpjb252ZXkgdGhlIGV4Y2x1c2lvbiBvZiB3YXJyYW50eTsgYW5kIGVhY2ggZmlsZSBzaG91bGQgaGF2ZSBhdCBsZWFzdCB0aGUNCiJjb3B5cmlnaHQiIGxpbmUgYW5kIGEgcG9pbnRlciB0byB3aGVyZSB0aGUgZnVsbCBub3RpY2UgaXMgZm91bmQuDQoNCiAgICA8b25lIGxpbmUgdG8gZ2l2ZSB0aGUgbGlicmFyeSdzIG5hbWUgYW5kIGEgYnJpZWYgaWRlYSBvZiB3aGF0IGl0IGRvZXMuPg0KICAgIENvcHlyaWdodCAoQykgPHllYXI+ICA8bmFtZSBvZiBhdXRob3I+DQoNCiAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yDQogICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYw0KICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcg0KICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLg0KDQogICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsDQogICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YNCiAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQ0KICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuDQoNCiAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljDQogICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQ0KICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0ENCg0KQWxzbyBhZGQgaW5mb3JtYXRpb24gb24gaG93IHRvIGNvbnRhY3QgeW91IGJ5IGVsZWN0cm9uaWMgYW5kIHBhcGVyIG1haWwuDQoNCllvdSBzaG91bGQgYWxzbyBnZXQgeW91ciBlbXBsb3llciAoaWYgeW91IHdvcmsgYXMgYSBwcm9ncmFtbWVyKSBvciB5b3VyDQpzY2hvb2wsIGlmIGFueSwgdG8gc2lnbiBhICJjb3B5cmlnaHQgZGlzY2xhaW1lciIgZm9yIHRoZSBsaWJyYXJ5LCBpZg0KbmVjZXNzYXJ5LiAgSGVyZSBpcyBhIHNhbXBsZTsgYWx0ZXIgdGhlIG5hbWVzOg0KDQogIFlveW9keW5lLCBJbmMuLCBoZXJlYnkgZGlzY2xhaW1zIGFsbCBjb3B5cmlnaHQgaW50ZXJlc3QgaW4gdGhlDQogIGxpYnJhcnkgYEZyb2InIChhIGxpYnJhcnkgZm9yIHR3ZWFraW5nIGtub2JzKSB3cml0dGVuIGJ5IEphbWVzIFJhbmRvbSBIYWNrZXIuDQoNCiAgPHNpZ25hdHVyZSBvZiBUeSBDb29uPiwgMSBBcHJpbCAxOTkwDQogIFR5IENvb24sIFByZXNpZGVudCBvZiBWaWNlDQoNClRoYXQncyBhbGwgdGhlcmUgaXMgdG8gaXQhDQoNCg0K]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Shared/PCLZip/pclzip.lib.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyBQaHBDb25jZXB0IExpYnJhcnkgLSBaaXAgTW9kdWxlIDIuOC4yDQovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8gTGljZW5zZSBHTlUvTEdQTCAtIFZpbmNlbnQgQmxhdmV0IC0gQXVndXN0IDIwMDkNCi8vIGh0dHA6Ly93d3cucGhwY29uY2VwdC5uZXQNCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLw0KLy8gUHJlc2VudGF0aW9uIDoNCi8vICAgUGNsWmlwIGlzIGEgUEhQIGxpYnJhcnkgdGhhdCBtYW5hZ2UgWklQIGFyY2hpdmVzLg0KLy8gICBTbyBmYXIgdGVzdHMgc2hvdyB0aGF0IGFyY2hpdmVzIGdlbmVyYXRlZCBieSBQY2xaaXAgYXJlIHJlYWRhYmxlIGJ5DQovLyAgIFdpblppcCBhcHBsaWNhdGlvbiBhbmQgb3RoZXIgdG9vbHMuDQovLw0KLy8gRGVzY3JpcHRpb24gOg0KLy8gICBTZWUgcmVhZG1lLnR4dCBhbmQgaHR0cDovL3d3dy5waHBjb25jZXB0Lm5ldA0KLy8NCi8vIFdhcm5pbmcgOg0KLy8gICBUaGlzIGxpYnJhcnkgYW5kIHRoZSBhc3NvY2lhdGVkIGZpbGVzIGFyZSBub24gY29tbWVyY2lhbCwgbm9uIHByb2Zlc3Npb25hbA0KLy8gICB3b3JrLg0KLy8gICBJdCBzaG91bGQgbm90IGhhdmUgdW5leHBlY3RlZCByZXN1bHRzLiBIb3dldmVyIGlmIGFueSBkYW1hZ2UgaXMgY2F1c2VkIGJ5DQovLyAgIHRoaXMgc29mdHdhcmUgdGhlIGF1dGhvciBjYW4gbm90IGJlIHJlc3BvbnNpYmxlLg0KLy8gICBUaGUgdXNlIG9mIHRoaXMgc29mdHdhcmUgaXMgYXQgdGhlIHJpc2sgb2YgdGhlIHVzZXIuDQovLw0KLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vICRJZDogcGNsemlwLmxpYi5waHAsdiAxLjYwIDIwMDkvMDkvMzAgMjE6MDE6MDQgdmJsYXZldCBFeHAgJA0KLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KICAvLyAtLS0tLSBDb25zdGFudHMNCiAgaWYgKCFkZWZpbmVkKCdQQ0xaSVBfUkVBRF9CTE9DS19TSVpFJykpIHsNCiAgICBkZWZpbmUoICdQQ0xaSVBfUkVBRF9CTE9DS19TSVpFJywgMjA0OCApOw0KICB9DQogIA0KICAvLyAtLS0tLSBGaWxlIGxpc3Qgc2VwYXJhdG9yDQogIC8vIEluIHZlcnNpb24gMS54IG9mIFBjbFppcCwgdGhlIHNlcGFyYXRvciBmb3IgZmlsZSBsaXN0IGlzIGEgc3BhY2UNCiAgLy8gKHdoaWNoIGlzIG5vdCBhIHZlcnkgc21hcnQgY2hvaWNlLCBzcGVjaWZpY2FsbHkgZm9yIHdpbmRvd3MgcGF0aHMgISkuDQogIC8vIEEgYmV0dGVyIHNlcGFyYXRvciBzaG91bGQgYmUgYSBjb21tYSAoLCkuIFRoaXMgY29uc3RhbnQgZ2l2ZXMgeW91IHRoZQ0KICAvLyBhYmlsdHkgdG8gY2hhbmdlIHRoYXQuDQogIC8vIEhvd2V2ZXIgbm90aWNlIHRoYXQgY2hhbmdpbmcgdGhpcyB2YWx1ZSwgbWF5IGhhdmUgaW1wYWN0IG9uIGV4aXN0aW5nDQogIC8vIHNjcmlwdHMsIHVzaW5nIHNwYWNlIHNlcGFyYXRlZCBmaWxlbmFtZXMuDQogIC8vIFJlY29tbWFuZGVkIHZhbHVlcyBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG9sZGVyIHZlcnNpb25zIDoNCiAgLy9kZWZpbmUoICdQQ0xaSVBfU0VQQVJBVE9SJywgJyAnICk7DQogIC8vIFJlY29tbWFuZGVkIHZhbHVlcyBmb3Igc21hcnQgc2VwYXJhdGlvbiBvZiBmaWxlbmFtZXMuDQogIGlmICghZGVmaW5lZCgnUENMWklQX1NFUEFSQVRPUicpKSB7DQogICAgZGVmaW5lKCAnUENMWklQX1NFUEFSQVRPUicsICcsJyApOw0KICB9DQoNCiAgLy8gLS0tLS0gRXJyb3IgY29uZmlndXJhdGlvbg0KICAvLyAwIDogUGNsWmlwIENsYXNzIGludGVncmF0ZWQgZXJyb3IgaGFuZGxpbmcNCiAgLy8gMSA6IFBjbEVycm9yIGV4dGVybmFsIGxpYnJhcnkgZXJyb3IgaGFuZGxpbmcuIEJ5IGVuYWJsaW5nIHRoaXMNCiAgLy8gICAgIHlvdSBtdXN0IGVuc3VyZSB0aGF0IHlvdSBoYXZlIGluY2x1ZGVkIFBjbEVycm9yIGxpYnJhcnkuDQogIC8vIFsyLC4uLl0gOiByZXNlcnZlZCBmb3IgZnV0dXIgdXNlDQogIGlmICghZGVmaW5lZCgnUENMWklQX0VSUk9SX0VYVEVSTkFMJykpIHsNCiAgICBkZWZpbmUoICdQQ0xaSVBfRVJST1JfRVhURVJOQUwnLCAwICk7DQogIH0NCg0KICAvLyAtLS0tLSBPcHRpb25hbCBzdGF0aWMgdGVtcG9yYXJ5IGRpcmVjdG9yeQ0KICAvLyAgICAgICBCeSBkZWZhdWx0IHRlbXBvcmFyeSBmaWxlcyBhcmUgZ2VuZXJhdGVkIGluIHRoZSBzY3JpcHQgY3VycmVudA0KICAvLyAgICAgICBwYXRoLg0KICAvLyAgICAgICBJZiBkZWZpbmVkIDoNCiAgLy8gICAgICAgLSBNVVNUIEJFIHRlcm1pbmF0ZWQgYnkgYSAnLycuDQogIC8vICAgICAgIC0gTVVTVCBiZSBhIHZhbGlkLCBhbHJlYWR5IGNyZWF0ZWQgZGlyZWN0b3J5DQogIC8vICAgICAgIFNhbXBsZXMgOg0KICAvLyBkZWZpbmUoICdQQ0xaSVBfVEVNUE9SQVJZX0RJUicsICcvdGVtcC8nICk7DQogIC8vIGRlZmluZSggJ1BDTFpJUF9URU1QT1JBUllfRElSJywgJ0M6L1RlbXAvJyApOw0KICBpZiAoIWRlZmluZWQoJ1BDTFpJUF9URU1QT1JBUllfRElSJykpIHsNCiAgICBkZWZpbmUoICdQQ0xaSVBfVEVNUE9SQVJZX0RJUicsICcnICk7DQogIH0NCg0KICAvLyAtLS0tLSBPcHRpb25hbCB0aHJlc2hvbGQgcmF0aW8gZm9yIHVzZSBvZiB0ZW1wb3JhcnkgZmlsZXMNCiAgLy8gICAgICAgUGNsemlwIHNlbnNlIHRoZSBzaXplIG9mIHRoZSBmaWxlIHRvIGFkZC9leHRyYWN0IGFuZCBkZWNpZGUgdG8NCiAgLy8gICAgICAgdXNlIG9yIG5vdCB0ZW1wb3JhcnkgZmlsZS4gVGhlIGFsZ29yeXRobSBpcyBsb29raW5nIGZvciANCiAgLy8gICAgICAgbWVtb3J5X2xpbWl0IG9mIFBIUCBhbmQgYXBwbHkgYSByYXRpby4NCiAgLy8gICAgICAgdGhyZXNob2xkID0gbWVtb3J5X2xpbWl0ICogcmF0aW8uDQogIC8vICAgICAgIFJlY29tbWVuZGVkIHZhbHVlcyBhcmUgdW5kZXIgMC41LiBEZWZhdWx0IDAuNDcuDQogIC8vICAgICAgIFNhbXBsZXMgOg0KICAvLyBkZWZpbmUoICdQQ0xaSVBfVEVNUE9SQVJZX0ZJTEVfUkFUSU8nLCAwLjUgKTsNCiAgaWYgKCFkZWZpbmVkKCdQQ0xaSVBfVEVNUE9SQVJZX0ZJTEVfUkFUSU8nKSkgew0KICAgIGRlZmluZSggJ1BDTFpJUF9URU1QT1JBUllfRklMRV9SQVRJTycsIDAuNDcgKTsNCiAgfQ0KDQovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8gKioqKiogVU5ERVIgVEhJUyBMSU5FIE5PVEhJTkcgTkVFRFMgVE8gQkUgTU9ESUZJRUQgKioqKioNCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCiAgLy8gLS0tLS0gR2xvYmFsIHZhcmlhYmxlcw0KICAkZ19wY2x6aXBfdmVyc2lvbiA9ICIyLjguMiI7DQoNCiAgLy8gLS0tLS0gRXJyb3IgY29kZXMNCiAgLy8gICAtMSA6IFVuYWJsZSB0byBvcGVuIGZpbGUgaW4gYmluYXJ5IHdyaXRlIG1vZGUNCiAgLy8gICAtMiA6IFVuYWJsZSB0byBvcGVuIGZpbGUgaW4gYmluYXJ5IHJlYWQgbW9kZQ0KICAvLyAgIC0zIDogSW52YWxpZCBwYXJhbWV0ZXJzDQogIC8vICAgLTQgOiBGaWxlIGRvZXMgbm90IGV4aXN0DQogIC8vICAgLTUgOiBGaWxlbmFtZSBpcyB0b28gbG9uZyAobWF4LiAyNTUpDQogIC8vICAgLTYgOiBOb3QgYSB2YWxpZCB6aXAgZmlsZQ0KICAvLyAgIC03IDogSW52YWxpZCBleHRyYWN0ZWQgZmlsZSBzaXplDQogIC8vICAgLTggOiBVbmFibGUgdG8gY3JlYXRlIGRpcmVjdG9yeQ0KICAvLyAgIC05IDogSW52YWxpZCBhcmNoaXZlIGV4dGVuc2lvbg0KICAvLyAgLTEwIDogSW52YWxpZCBhcmNoaXZlIGZvcm1hdA0KICAvLyAgLTExIDogVW5hYmxlIHRvIGRlbGV0ZSBmaWxlICh1bmxpbmspDQogIC8vICAtMTIgOiBVbmFibGUgdG8gcmVuYW1lIGZpbGUgKHJlbmFtZSkNCiAgLy8gIC0xMyA6IEludmFsaWQgaGVhZGVyIGNoZWNrc3VtDQogIC8vICAtMTQgOiBJbnZhbGlkIGFyY2hpdmUgc2l6ZQ0KICBkZWZpbmUoICdQQ0xaSVBfRVJSX1VTRVJfQUJPUlRFRCcsIDIgKTsNCiAgZGVmaW5lKCAnUENMWklQX0VSUl9OT19FUlJPUicsIDAgKTsNCiAgZGVmaW5lKCAnUENMWklQX0VSUl9XUklURV9PUEVOX0ZBSUwnLCAtMSApOw0KICBkZWZpbmUoICdQQ0xaSVBfRVJSX1JFQURfT1BFTl9GQUlMJywgLTIgKTsNCiAgZGVmaW5lKCAnUENMWklQX0VSUl9JTlZBTElEX1BBUkFNRVRFUicsIC0zICk7DQogIGRlZmluZSggJ1BDTFpJUF9FUlJfTUlTU0lOR19GSUxFJywgLTQgKTsNCiAgZGVmaW5lKCAnUENMWklQX0VSUl9GSUxFTkFNRV9UT09fTE9ORycsIC01ICk7DQogIGRlZmluZSggJ1BDTFpJUF9FUlJfSU5WQUxJRF9aSVAnLCAtNiApOw0KICBkZWZpbmUoICdQQ0xaSVBfRVJSX0JBRF9FWFRSQUNURURfRklMRScsIC03ICk7DQogIGRlZmluZSggJ1BDTFpJUF9FUlJfRElSX0NSRUFURV9GQUlMJywgLTggKTsNCiAgZGVmaW5lKCAnUENMWklQX0VSUl9CQURfRVhURU5TSU9OJywgLTkgKTsNCiAgZGVmaW5lKCAnUENMWklQX0VSUl9CQURfRk9STUFUJywgLTEwICk7DQogIGRlZmluZSggJ1BDTFpJUF9FUlJfREVMRVRFX0ZJTEVfRkFJTCcsIC0xMSApOw0KICBkZWZpbmUoICdQQ0xaSVBfRVJSX1JFTkFNRV9GSUxFX0ZBSUwnLCAtMTIgKTsNCiAgZGVmaW5lKCAnUENMWklQX0VSUl9CQURfQ0hFQ0tTVU0nLCAtMTMgKTsNCiAgZGVmaW5lKCAnUENMWklQX0VSUl9JTlZBTElEX0FSQ0hJVkVfWklQJywgLTE0ICk7DQogIGRlZmluZSggJ1BDTFpJUF9FUlJfTUlTU0lOR19PUFRJT05fVkFMVUUnLCAtMTUgKTsNCiAgZGVmaW5lKCAnUENMWklQX0VSUl9JTlZBTElEX09QVElPTl9WQUxVRScsIC0xNiApOw0KICBkZWZpbmUoICdQQ0xaSVBfRVJSX0FMUkVBRFlfQV9ESVJFQ1RPUlknLCAtMTcgKTsNCiAgZGVmaW5lKCAnUENMWklQX0VSUl9VTlNVUFBPUlRFRF9DT01QUkVTU0lPTicsIC0xOCApOw0KICBkZWZpbmUoICdQQ0xaSVBfRVJSX1VOU1VQUE9SVEVEX0VOQ1JZUFRJT04nLCAtMTkgKTsNCiAgZGVmaW5lKCAnUENMWklQX0VSUl9JTlZBTElEX0FUVFJJQlVURV9WQUxVRScsIC0yMCApOw0KICBkZWZpbmUoICdQQ0xaSVBfRVJSX0RJUkVDVE9SWV9SRVNUUklDVElPTicsIC0yMSApOw0KDQogIC8vIC0tLS0tIE9wdGlvbnMgdmFsdWVzDQogIGRlZmluZSggJ1BDTFpJUF9PUFRfUEFUSCcsIDc3MDAxICk7DQogIGRlZmluZSggJ1BDTFpJUF9PUFRfQUREX1BBVEgnLCA3NzAwMiApOw0KICBkZWZpbmUoICdQQ0xaSVBfT1BUX1JFTU9WRV9QQVRIJywgNzcwMDMgKTsNCiAgZGVmaW5lKCAnUENMWklQX09QVF9SRU1PVkVfQUxMX1BBVEgnLCA3NzAwNCApOw0KICBkZWZpbmUoICdQQ0xaSVBfT1BUX1NFVF9DSE1PRCcsIDc3MDA1ICk7DQogIGRlZmluZSggJ1BDTFpJUF9PUFRfRVhUUkFDVF9BU19TVFJJTkcnLCA3NzAwNiApOw0KICBkZWZpbmUoICdQQ0xaSVBfT1BUX05PX0NPTVBSRVNTSU9OJywgNzcwMDcgKTsNCiAgZGVmaW5lKCAnUENMWklQX09QVF9CWV9OQU1FJywgNzcwMDggKTsNCiAgZGVmaW5lKCAnUENMWklQX09QVF9CWV9JTkRFWCcsIDc3MDA5ICk7DQogIGRlZmluZSggJ1BDTFpJUF9PUFRfQllfRVJFRycsIDc3MDEwICk7DQogIGRlZmluZSggJ1BDTFpJUF9PUFRfQllfUFJFRycsIDc3MDExICk7DQogIGRlZmluZSggJ1BDTFpJUF9PUFRfQ09NTUVOVCcsIDc3MDEyICk7DQogIGRlZmluZSggJ1BDTFpJUF9PUFRfQUREX0NPTU1FTlQnLCA3NzAxMyApOw0KICBkZWZpbmUoICdQQ0xaSVBfT1BUX1BSRVBFTkRfQ09NTUVOVCcsIDc3MDE0ICk7DQogIGRlZmluZSggJ1BDTFpJUF9PUFRfRVhUUkFDVF9JTl9PVVRQVVQnLCA3NzAxNSApOw0KICBkZWZpbmUoICdQQ0xaSVBfT1BUX1JFUExBQ0VfTkVXRVInLCA3NzAxNiApOw0KICBkZWZpbmUoICdQQ0xaSVBfT1BUX1NUT1BfT05fRVJST1InLCA3NzAxNyApOw0KICAvLyBIYXZpbmcgYmlnIHRyb3VibGUgd2l0aCBjcnlwdC4gTmVlZCB0byBtdWx0aXBseSAyIGxvbmcgaW50DQogIC8vIHdoaWNoIGlzIG5vdCBjb3JyZWN0bHkgc3VwcG9ydGVkIGJ5IFBIUCAuLi4NCiAgLy9kZWZpbmUoICdQQ0xaSVBfT1BUX0NSWVBUJywgNzcwMTggKTsNCiAgZGVmaW5lKCAnUENMWklQX09QVF9FWFRSQUNUX0RJUl9SRVNUUklDVElPTicsIDc3MDE5ICk7DQogIGRlZmluZSggJ1BDTFpJUF9PUFRfVEVNUF9GSUxFX1RIUkVTSE9MRCcsIDc3MDIwICk7DQogIGRlZmluZSggJ1BDTFpJUF9PUFRfQUREX1RFTVBfRklMRV9USFJFU0hPTEQnLCA3NzAyMCApOyAvLyBhbGlhcw0KICBkZWZpbmUoICdQQ0xaSVBfT1BUX1RFTVBfRklMRV9PTicsIDc3MDIxICk7DQogIGRlZmluZSggJ1BDTFpJUF9PUFRfQUREX1RFTVBfRklMRV9PTicsIDc3MDIxICk7IC8vIGFsaWFzDQogIGRlZmluZSggJ1BDTFpJUF9PUFRfVEVNUF9GSUxFX09GRicsIDc3MDIyICk7DQogIGRlZmluZSggJ1BDTFpJUF9PUFRfQUREX1RFTVBfRklMRV9PRkYnLCA3NzAyMiApOyAvLyBhbGlhcw0KICANCiAgLy8gLS0tLS0gRmlsZSBkZXNjcmlwdGlvbiBhdHRyaWJ1dGVzDQogIGRlZmluZSggJ1BDTFpJUF9BVFRfRklMRV9OQU1FJywgNzkwMDEgKTsNCiAgZGVmaW5lKCAnUENMWklQX0FUVF9GSUxFX05FV19TSE9SVF9OQU1FJywgNzkwMDIgKTsNCiAgZGVmaW5lKCAnUENMWklQX0FUVF9GSUxFX05FV19GVUxMX05BTUUnLCA3OTAwMyApOw0KICBkZWZpbmUoICdQQ0xaSVBfQVRUX0ZJTEVfTVRJTUUnLCA3OTAwNCApOw0KICBkZWZpbmUoICdQQ0xaSVBfQVRUX0ZJTEVfQ09OVEVOVCcsIDc5MDA1ICk7DQogIGRlZmluZSggJ1BDTFpJUF9BVFRfRklMRV9DT01NRU5UJywgNzkwMDYgKTsNCg0KICAvLyAtLS0tLSBDYWxsIGJhY2tzIHZhbHVlcw0KICBkZWZpbmUoICdQQ0xaSVBfQ0JfUFJFX0VYVFJBQ1QnLCA3ODAwMSApOw0KICBkZWZpbmUoICdQQ0xaSVBfQ0JfUE9TVF9FWFRSQUNUJywgNzgwMDIgKTsNCiAgZGVmaW5lKCAnUENMWklQX0NCX1BSRV9BREQnLCA3ODAwMyApOw0KICBkZWZpbmUoICdQQ0xaSVBfQ0JfUE9TVF9BREQnLCA3ODAwNCApOw0KICAvKiBGb3IgZnV0dXIgdXNlDQogIGRlZmluZSggJ1BDTFpJUF9DQl9QUkVfTElTVCcsIDc4MDA1ICk7DQogIGRlZmluZSggJ1BDTFpJUF9DQl9QT1NUX0xJU1QnLCA3ODAwNiApOw0KICBkZWZpbmUoICdQQ0xaSVBfQ0JfUFJFX0RFTEVURScsIDc4MDA3ICk7DQogIGRlZmluZSggJ1BDTFpJUF9DQl9QT1NUX0RFTEVURScsIDc4MDA4ICk7DQogICovDQoNCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAgLy8gQ2xhc3MgOiBQY2xaaXANCiAgLy8gRGVzY3JpcHRpb24gOg0KICAvLyAgIFBjbFppcCBpcyB0aGUgY2xhc3MgdGhhdCByZXByZXNlbnQgYSBaaXAgYXJjaGl2ZS4NCiAgLy8gICBUaGUgcHVibGljIG1ldGhvZHMgYWxsb3cgdGhlIG1hbmlwdWxhdGlvbiBvZiB0aGUgYXJjaGl2ZS4NCiAgLy8gQXR0cmlidXRlcyA6DQogIC8vICAgQXR0cmlidXRlcyBtdXN0IG5vdCBiZSBhY2Nlc3NlZCBkaXJlY3RseS4NCiAgLy8gTWV0aG9kcyA6DQogIC8vICAgUGNsWmlwKCkgOiBPYmplY3QgY3JlYXRvcg0KICAvLyAgIGNyZWF0ZSgpIDogQ3JlYXRlcyB0aGUgWmlwIGFyY2hpdmUNCiAgLy8gICBsaXN0Q29udGVudCgpIDogTGlzdCB0aGUgY29udGVudCBvZiB0aGUgWmlwIGFyY2hpdmUNCiAgLy8gICBleHRyYWN0KCkgOiBFeHRyYWN0IHRoZSBjb250ZW50IG9mIHRoZSBhcmNoaXZlDQogIC8vICAgcHJvcGVydGllcygpIDogTGlzdCB0aGUgcHJvcGVydGllcyBvZiB0aGUgYXJjaGl2ZQ0KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICBjbGFzcyBQY2xaaXANCiAgew0KICAgIC8vIC0tLS0tIEZpbGVuYW1lIG9mIHRoZSB6aXAgZmlsZQ0KICAgIHZhciAkemlwbmFtZSA9ICcnOw0KDQogICAgLy8gLS0tLS0gRmlsZSBkZXNjcmlwdG9yIG9mIHRoZSB6aXAgZmlsZQ0KICAgIHZhciAkemlwX2ZkID0gMDsNCg0KICAgIC8vIC0tLS0tIEludGVybmFsIGVycm9yIGhhbmRsaW5nDQogICAgdmFyICRlcnJvcl9jb2RlID0gMTsNCiAgICB2YXIgJGVycm9yX3N0cmluZyA9ICcnOw0KICAgIA0KICAgIC8vIC0tLS0tIEN1cnJlbnQgc3RhdHVzIG9mIHRoZSBtYWdpY19xdW90ZXNfcnVudGltZQ0KICAgIC8vIFRoaXMgdmFsdWUgc3RvcmUgdGhlIHBocCBjb25maWd1cmF0aW9uIGZvciBtYWdpY19xdW90ZXMNCiAgICAvLyBUaGUgY2xhc3MgY2FuIHRoZW4gZGlzYWJsZSB0aGUgbWFnaWNfcXVvdGVzIGFuZCByZXNldCBpdCBhZnRlcg0KICAgIHZhciAkbWFnaWNfcXVvdGVzX3N0YXR1czsNCg0KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICAvLyBGdW5jdGlvbiA6IFBjbFppcCgpDQogIC8vIERlc2NyaXB0aW9uIDoNCiAgLy8gICBDcmVhdGVzIGEgUGNsWmlwIG9iamVjdCBhbmQgc2V0IHRoZSBuYW1lIG9mIHRoZSBhc3NvY2lhdGVkIFppcCBhcmNoaXZlDQogIC8vICAgZmlsZW5hbWUuDQogIC8vICAgTm90ZSB0aGF0IG5vIHJlYWwgYWN0aW9uIGlzIHRha2VuLCBpZiB0aGUgYXJjaGl2ZSBkb2VzIG5vdCBleGlzdCBpdCBpcyBub3QNCiAgLy8gICBjcmVhdGVkLiBVc2UgY3JlYXRlKCkgZm9yIHRoYXQuDQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogIGZ1bmN0aW9uIFBjbFppcCgkcF96aXBuYW1lKQ0KICB7DQoNCiAgICAvLyAtLS0tLSBUZXN0cyB0aGUgemxpYg0KICAgIGlmICghZnVuY3Rpb25fZXhpc3RzKCdnem9wZW4nKSkNCiAgICB7DQogICAgICBkaWUoJ0Fib3J0ICcuYmFzZW5hbWUoX19GSUxFX18pLicgOiBNaXNzaW5nIHpsaWIgZXh0ZW5zaW9ucycpOw0KICAgIH0NCg0KICAgIC8vIC0tLS0tIFNldCB0aGUgYXR0cmlidXRlcw0KICAgICR0aGlzLT56aXBuYW1lID0gJHBfemlwbmFtZTsNCiAgICAkdGhpcy0+emlwX2ZkID0gMDsNCiAgICAkdGhpcy0+bWFnaWNfcXVvdGVzX3N0YXR1cyA9IC0xOw0KDQogICAgLy8gLS0tLS0gUmV0dXJuDQogICAgcmV0dXJuOw0KICB9DQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAgLy8gRnVuY3Rpb24gOg0KICAvLyAgIGNyZWF0ZSgkcF9maWxlbGlzdCwgJHBfYWRkX2Rpcj0iIiwgJHBfcmVtb3ZlX2Rpcj0iIikNCiAgLy8gICBjcmVhdGUoJHBfZmlsZWxpc3QsICRwX29wdGlvbiwgJHBfb3B0aW9uX3ZhbHVlLCAuLi4pDQogIC8vIERlc2NyaXB0aW9uIDoNCiAgLy8gICBUaGlzIG1ldGhvZCBzdXBwb3J0cyB0d28gZGlmZmVyZW50IHN5bm9wc2lzLiBUaGUgZmlyc3Qgb25lIGlzIGhpc3RvcmljYWwuDQogIC8vICAgVGhpcyBtZXRob2QgY3JlYXRlcyBhIFppcCBBcmNoaXZlLiBUaGUgWmlwIGZpbGUgaXMgY3JlYXRlZCBpbiB0aGUNCiAgLy8gICBmaWxlc3lzdGVtLiBUaGUgZmlsZXMgYW5kIGRpcmVjdG9yaWVzIGluZGljYXRlZCBpbiAkcF9maWxlbGlzdA0KICAvLyAgIGFyZSBhZGRlZCBpbiB0aGUgYXJjaGl2ZS4gU2VlIHRoZSBwYXJhbWV0ZXJzIGRlc2NyaXB0aW9uIGZvciB0aGUNCiAgLy8gICBzdXBwb3J0ZWQgZm9ybWF0IG9mICRwX2ZpbGVsaXN0Lg0KICAvLyAgIFdoZW4gYSBkaXJlY3RvcnkgaXMgaW4gdGhlIGxpc3QsIHRoZSBkaXJlY3RvcnkgYW5kIGl0cyBjb250ZW50IGlzIGFkZGVkDQogIC8vICAgaW4gdGhlIGFyY2hpdmUuDQogIC8vICAgSW4gdGhpcyBzeW5vcHNpcywgdGhlIGZ1bmN0aW9uIHRha2VzIGFuIG9wdGlvbmFsIHZhcmlhYmxlIGxpc3Qgb2YNCiAgLy8gICBvcHRpb25zLiBTZWUgYmVsbG93IHRoZSBzdXBwb3J0ZWQgb3B0aW9ucy4NCiAgLy8gUGFyYW1ldGVycyA6DQogIC8vICAgJHBfZmlsZWxpc3QgOiBBbiBhcnJheSBjb250YWluaW5nIGZpbGUgb3IgZGlyZWN0b3J5IG5hbWVzLCBvcg0KICAvLyAgICAgICAgICAgICAgICAgYSBzdHJpbmcgY29udGFpbmluZyBvbmUgZmlsZW5hbWUgb3Igb25lIGRpcmVjdG9yeSBuYW1lLCBvcg0KICAvLyAgICAgICAgICAgICAgICAgYSBzdHJpbmcgY29udGFpbmluZyBhIGxpc3Qgb2YgZmlsZW5hbWVzIGFuZC9vciBkaXJlY3RvcnkNCiAgLy8gICAgICAgICAgICAgICAgIG5hbWVzIHNlcGFyYXRlZCBieSBzcGFjZXMuDQogIC8vICAgJHBfYWRkX2RpciA6IEEgcGF0aCB0byBhZGQgYmVmb3JlIHRoZSByZWFsIHBhdGggb2YgdGhlIGFyY2hpdmVkIGZpbGUsDQogIC8vICAgICAgICAgICAgICAgIGluIG9yZGVyIHRvIGhhdmUgaXQgbWVtb3JpemVkIGluIHRoZSBhcmNoaXZlLg0KICAvLyAgICRwX3JlbW92ZV9kaXIgOiBBIHBhdGggdG8gcmVtb3ZlIGZyb20gdGhlIHJlYWwgcGF0aCBvZiB0aGUgZmlsZSB0byBhcmNoaXZlLA0KICAvLyAgICAgICAgICAgICAgICAgICBpbiBvcmRlciB0byBoYXZlIGEgc2hvcnRlciBwYXRoIG1lbW9yaXplZCBpbiB0aGUgYXJjaGl2ZS4NCiAgLy8gICAgICAgICAgICAgICAgICAgV2hlbiAkcF9hZGRfZGlyIGFuZCAkcF9yZW1vdmVfZGlyIGFyZSBzZXQsICRwX3JlbW92ZV9kaXINCiAgLy8gICAgICAgICAgICAgICAgICAgaXMgcmVtb3ZlZCBmaXJzdCwgYmVmb3JlICRwX2FkZF9kaXIgaXMgYWRkZWQuDQogIC8vIE9wdGlvbnMgOg0KICAvLyAgIFBDTFpJUF9PUFRfQUREX1BBVEggOg0KICAvLyAgIFBDTFpJUF9PUFRfUkVNT1ZFX1BBVEggOg0KICAvLyAgIFBDTFpJUF9PUFRfUkVNT1ZFX0FMTF9QQVRIIDoNCiAgLy8gICBQQ0xaSVBfT1BUX0NPTU1FTlQgOg0KICAvLyAgIFBDTFpJUF9DQl9QUkVfQUREIDoNCiAgLy8gICBQQ0xaSVBfQ0JfUE9TVF9BREQgOg0KICAvLyBSZXR1cm4gVmFsdWVzIDoNCiAgLy8gICAwIG9uIGZhaWx1cmUsDQogIC8vICAgVGhlIGxpc3Qgb2YgdGhlIGFkZGVkIGZpbGVzLCB3aXRoIGEgc3RhdHVzIG9mIHRoZSBhZGQgYWN0aW9uLg0KICAvLyAgIChzZWUgUGNsWmlwOjpsaXN0Q29udGVudCgpIGZvciBsaXN0IGVudHJ5IGZvcm1hdCkNCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAgZnVuY3Rpb24gY3JlYXRlKCRwX2ZpbGVsaXN0KQ0KICB7DQogICAgJHZfcmVzdWx0PTE7DQoNCiAgICAvLyAtLS0tLSBSZXNldCB0aGUgZXJyb3IgaGFuZGxlcg0KICAgICR0aGlzLT5wcml2RXJyb3JSZXNldCgpOw0KDQogICAgLy8gLS0tLS0gU2V0IGRlZmF1bHQgdmFsdWVzDQogICAgJHZfb3B0aW9ucyA9IGFycmF5KCk7DQogICAgJHZfb3B0aW9uc1tQQ0xaSVBfT1BUX05PX0NPTVBSRVNTSU9OXSA9IEZBTFNFOw0KDQogICAgLy8gLS0tLS0gTG9vayBmb3IgdmFyaWFibGUgb3B0aW9ucyBhcmd1bWVudHMNCiAgICAkdl9zaXplID0gZnVuY19udW1fYXJncygpOw0KDQogICAgLy8gLS0tLS0gTG9vayBmb3IgYXJndW1lbnRzDQogICAgaWYgKCR2X3NpemUgPiAxKSB7DQogICAgICAvLyAtLS0tLSBHZXQgdGhlIGFyZ3VtZW50cw0KICAgICAgJHZfYXJnX2xpc3QgPSBmdW5jX2dldF9hcmdzKCk7DQoNCiAgICAgIC8vIC0tLS0tIFJlbW92ZSBmcm9tIHRoZSBvcHRpb25zIGxpc3QgdGhlIGZpcnN0IGFyZ3VtZW50DQogICAgICBhcnJheV9zaGlmdCgkdl9hcmdfbGlzdCk7DQogICAgICAkdl9zaXplLS07DQoNCiAgICAgIC8vIC0tLS0tIExvb2sgZm9yIGZpcnN0IGFyZw0KICAgICAgaWYgKChpc19pbnRlZ2VyKCR2X2FyZ19saXN0WzBdKSkgJiYgKCR2X2FyZ19saXN0WzBdID4gNzcwMDApKSB7DQoNCiAgICAgICAgLy8gLS0tLS0gUGFyc2UgdGhlIG9wdGlvbnMNCiAgICAgICAgJHZfcmVzdWx0ID0gJHRoaXMtPnByaXZQYXJzZU9wdGlvbnMoJHZfYXJnX2xpc3QsICR2X3NpemUsICR2X29wdGlvbnMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5IChQQ0xaSVBfT1BUX1JFTU9WRV9QQVRIID0+ICdvcHRpb25hbCcsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQ0xaSVBfT1BUX1JFTU9WRV9BTExfUEFUSCA9PiAnb3B0aW9uYWwnLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUENMWklQX09QVF9BRERfUEFUSCA9PiAnb3B0aW9uYWwnLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUENMWklQX0NCX1BSRV9BREQgPT4gJ29wdGlvbmFsJywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBDTFpJUF9DQl9QT1NUX0FERCA9PiAnb3B0aW9uYWwnLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUENMWklQX09QVF9OT19DT01QUkVTU0lPTiA9PiAnb3B0aW9uYWwnLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUENMWklQX09QVF9DT01NRU5UID0+ICdvcHRpb25hbCcsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQ0xaSVBfT1BUX1RFTVBfRklMRV9USFJFU0hPTEQgPT4gJ29wdGlvbmFsJywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBDTFpJUF9PUFRfVEVNUF9GSUxFX09OID0+ICdvcHRpb25hbCcsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQ0xaSVBfT1BUX1RFTVBfRklMRV9PRkYgPT4gJ29wdGlvbmFsJw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8sIFBDTFpJUF9PUFRfQ1JZUFQgPT4gJ29wdGlvbmFsJw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSk7DQogICAgICAgIGlmICgkdl9yZXN1bHQgIT0gMSkgew0KICAgICAgICAgIHJldHVybiAwOw0KICAgICAgICB9DQogICAgICB9DQoNCiAgICAgIC8vIC0tLS0tIExvb2sgZm9yIDIgYXJncw0KICAgICAgLy8gSGVyZSB3ZSBuZWVkIHRvIHN1cHBvcnQgdGhlIGZpcnN0IGhpc3RvcmljIHN5bm9wc2lzIG9mIHRoZQ0KICAgICAgLy8gbWV0aG9kLg0KICAgICAgZWxzZSB7DQoNCiAgICAgICAgLy8gLS0tLS0gR2V0IHRoZSBmaXJzdCBhcmd1bWVudA0KICAgICAgICAkdl9vcHRpb25zW1BDTFpJUF9PUFRfQUREX1BBVEhdID0gJHZfYXJnX2xpc3RbMF07DQoNCiAgICAgICAgLy8gLS0tLS0gTG9vayBmb3IgdGhlIG9wdGlvbmFsIHNlY29uZCBhcmd1bWVudA0KICAgICAgICBpZiAoJHZfc2l6ZSA9PSAyKSB7DQogICAgICAgICAgJHZfb3B0aW9uc1tQQ0xaSVBfT1BUX1JFTU9WRV9QQVRIXSA9ICR2X2FyZ19saXN0WzFdOw0KICAgICAgICB9DQogICAgICAgIGVsc2UgaWYgKCR2X3NpemUgPiAyKSB7DQogICAgICAgICAgUGNsWmlwOjpwcml2RXJyb3JMb2coUENMWklQX0VSUl9JTlZBTElEX1BBUkFNRVRFUiwNCgkJICAgICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBudW1iZXIgLyB0eXBlIG9mIGFyZ3VtZW50cyIpOw0KICAgICAgICAgIHJldHVybiAwOw0KICAgICAgICB9DQogICAgICB9DQogICAgfQ0KICAgIA0KICAgIC8vIC0tLS0tIExvb2sgZm9yIGRlZmF1bHQgb3B0aW9uIHZhbHVlcw0KICAgICR0aGlzLT5wcml2T3B0aW9uRGVmYXVsdFRocmVzaG9sZCgkdl9vcHRpb25zKTsNCg0KICAgIC8vIC0tLS0tIEluaXQNCiAgICAkdl9zdHJpbmdfbGlzdCA9IGFycmF5KCk7DQogICAgJHZfYXR0X2xpc3QgPSBhcnJheSgpOw0KICAgICR2X2ZpbGVkZXNjcl9saXN0ID0gYXJyYXkoKTsNCiAgICAkcF9yZXN1bHRfbGlzdCA9IGFycmF5KCk7DQogICAgDQogICAgLy8gLS0tLS0gTG9vayBpZiB0aGUgJHBfZmlsZWxpc3QgaXMgcmVhbGx5IGFuIGFycmF5DQogICAgaWYgKGlzX2FycmF5KCRwX2ZpbGVsaXN0KSkgew0KICAgIA0KICAgICAgLy8gLS0tLS0gTG9vayBpZiB0aGUgZmlyc3QgZWxlbWVudCBpcyBhbHNvIGFuIGFycmF5DQogICAgICAvLyAgICAgICBUaGlzIHdpbGwgbWVhbiB0aGF0IHRoaXMgaXMgYSBmaWxlIGRlc2NyaXB0aW9uIGVudHJ5DQogICAgICBpZiAoaXNzZXQoJHBfZmlsZWxpc3RbMF0pICYmIGlzX2FycmF5KCRwX2ZpbGVsaXN0WzBdKSkgew0KICAgICAgICAkdl9hdHRfbGlzdCA9ICRwX2ZpbGVsaXN0Ow0KICAgICAgfQ0KICAgICAgDQogICAgICAvLyAtLS0tLSBUaGUgbGlzdCBpcyBhIGxpc3Qgb2Ygc3RyaW5nIG5hbWVzDQogICAgICBlbHNlIHsNCiAgICAgICAgJHZfc3RyaW5nX2xpc3QgPSAkcF9maWxlbGlzdDsNCiAgICAgIH0NCiAgICB9DQoNCiAgICAvLyAtLS0tLSBMb29rIGlmIHRoZSAkcF9maWxlbGlzdCBpcyBhIHN0cmluZw0KICAgIGVsc2UgaWYgKGlzX3N0cmluZygkcF9maWxlbGlzdCkpIHsNCiAgICAgIC8vIC0tLS0tIENyZWF0ZSBhIGxpc3QgZnJvbSB0aGUgc3RyaW5nDQogICAgICAkdl9zdHJpbmdfbGlzdCA9IGV4cGxvZGUoUENMWklQX1NFUEFSQVRPUiwgJHBfZmlsZWxpc3QpOw0KICAgIH0NCg0KICAgIC8vIC0tLS0tIEludmFsaWQgdmFyaWFibGUgdHlwZSBmb3IgJHBfZmlsZWxpc3QNCiAgICBlbHNlIHsNCiAgICAgIFBjbFppcDo6cHJpdkVycm9yTG9nKFBDTFpJUF9FUlJfSU5WQUxJRF9QQVJBTUVURVIsICJJbnZhbGlkIHZhcmlhYmxlIHR5cGUgcF9maWxlbGlzdCIpOw0KICAgICAgcmV0dXJuIDA7DQogICAgfQ0KICAgIA0KICAgIC8vIC0tLS0tIFJlZm9ybWF0IHRoZSBzdHJpbmcgbGlzdA0KICAgIGlmIChzaXplb2YoJHZfc3RyaW5nX2xpc3QpICE9IDApIHsNCiAgICAgIGZvcmVhY2ggKCR2X3N0cmluZ19saXN0IGFzICR2X3N0cmluZykgew0KICAgICAgICBpZiAoJHZfc3RyaW5nICE9ICcnKSB7DQogICAgICAgICAgJHZfYXR0X2xpc3RbXVtQQ0xaSVBfQVRUX0ZJTEVfTkFNRV0gPSAkdl9zdHJpbmc7DQogICAgICAgIH0NCiAgICAgICAgZWxzZSB7DQogICAgICAgIH0NCiAgICAgIH0NCiAgICB9DQogICAgDQogICAgLy8gLS0tLS0gRm9yIGVhY2ggZmlsZSBpbiB0aGUgbGlzdCBjaGVjayB0aGUgYXR0cmlidXRlcw0KICAgICR2X3N1cHBvcnRlZF9hdHRyaWJ1dGVzDQogICAgPSBhcnJheSAoIFBDTFpJUF9BVFRfRklMRV9OQU1FID0+ICdtYW5kYXRvcnknDQogICAgICAgICAgICAgLFBDTFpJUF9BVFRfRklMRV9ORVdfU0hPUlRfTkFNRSA9PiAnb3B0aW9uYWwnDQogICAgICAgICAgICAgLFBDTFpJUF9BVFRfRklMRV9ORVdfRlVMTF9OQU1FID0+ICdvcHRpb25hbCcNCiAgICAgICAgICAgICAsUENMWklQX0FUVF9GSUxFX01USU1FID0+ICdvcHRpb25hbCcNCiAgICAgICAgICAgICAsUENMWklQX0FUVF9GSUxFX0NPTlRFTlQgPT4gJ29wdGlvbmFsJw0KICAgICAgICAgICAgICxQQ0xaSVBfQVRUX0ZJTEVfQ09NTUVOVCA9PiAnb3B0aW9uYWwnDQoJCQkJCQkpOw0KICAgIGZvcmVhY2ggKCR2X2F0dF9saXN0IGFzICR2X2VudHJ5KSB7DQogICAgICAkdl9yZXN1bHQgPSAkdGhpcy0+cHJpdkZpbGVEZXNjclBhcnNlQXR0KCR2X2VudHJ5LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdl9maWxlZGVzY3JfbGlzdFtdLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdl9vcHRpb25zLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdl9zdXBwb3J0ZWRfYXR0cmlidXRlcyk7DQogICAgICBpZiAoJHZfcmVzdWx0ICE9IDEpIHsNCiAgICAgICAgcmV0dXJuIDA7DQogICAgICB9DQogICAgfQ0KDQogICAgLy8gLS0tLS0gRXhwYW5kIHRoZSBmaWxlbGlzdCAoZXhwYW5kIGRpcmVjdG9yaWVzKQ0KICAgICR2X3Jlc3VsdCA9ICR0aGlzLT5wcml2RmlsZURlc2NyRXhwYW5kKCR2X2ZpbGVkZXNjcl9saXN0LCAkdl9vcHRpb25zKTsNCiAgICBpZiAoJHZfcmVzdWx0ICE9IDEpIHsNCiAgICAgIHJldHVybiAwOw0KICAgIH0NCg0KICAgIC8vIC0tLS0tIENhbGwgdGhlIGNyZWF0ZSBmY3QNCiAgICAkdl9yZXN1bHQgPSAkdGhpcy0+cHJpdkNyZWF0ZSgkdl9maWxlZGVzY3JfbGlzdCwgJHBfcmVzdWx0X2xpc3QsICR2X29wdGlvbnMpOw0KICAgIGlmICgkdl9yZXN1bHQgIT0gMSkgew0KICAgICAgcmV0dXJuIDA7DQogICAgfQ0KDQogICAgLy8gLS0tLS0gUmV0dXJuDQogICAgcmV0dXJuICRwX3Jlc3VsdF9saXN0Ow0KICB9DQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAgLy8gRnVuY3Rpb24gOg0KICAvLyAgIGFkZCgkcF9maWxlbGlzdCwgJHBfYWRkX2Rpcj0iIiwgJHBfcmVtb3ZlX2Rpcj0iIikNCiAgLy8gICBhZGQoJHBfZmlsZWxpc3QsICRwX29wdGlvbiwgJHBfb3B0aW9uX3ZhbHVlLCAuLi4pDQogIC8vIERlc2NyaXB0aW9uIDoNCiAgLy8gICBUaGlzIG1ldGhvZCBzdXBwb3J0cyB0d28gc3lub3BzaXMuIFRoZSBmaXJzdCBvbmUgaXMgaGlzdG9yaWNhbC4NCiAgLy8gICBUaGlzIG1ldGhvZHMgYWRkIHRoZSBsaXN0IG9mIGZpbGVzIGluIGFuIGV4aXN0aW5nIGFyY2hpdmUuDQogIC8vICAgSWYgYSBmaWxlIHdpdGggdGhlIHNhbWUgbmFtZSBhbHJlYWR5IGV4aXN0cywgaXQgaXMgYWRkZWQgYXQgdGhlIGVuZCBvZiB0aGUNCiAgLy8gICBhcmNoaXZlLCB0aGUgZmlyc3Qgb25lIGlzIHN0aWxsIHByZXNlbnQuDQogIC8vICAgSWYgdGhlIGFyY2hpdmUgZG9lcyBub3QgZXhpc3QsIGl0IGlzIGNyZWF0ZWQuDQogIC8vIFBhcmFtZXRlcnMgOg0KICAvLyAgICRwX2ZpbGVsaXN0IDogQW4gYXJyYXkgY29udGFpbmluZyBmaWxlIG9yIGRpcmVjdG9yeSBuYW1lcywgb3INCiAgLy8gICAgICAgICAgICAgICAgIGEgc3RyaW5nIGNvbnRhaW5pbmcgb25lIGZpbGVuYW1lIG9yIG9uZSBkaXJlY3RvcnkgbmFtZSwgb3INCiAgLy8gICAgICAgICAgICAgICAgIGEgc3RyaW5nIGNvbnRhaW5pbmcgYSBsaXN0IG9mIGZpbGVuYW1lcyBhbmQvb3IgZGlyZWN0b3J5DQogIC8vICAgICAgICAgICAgICAgICBuYW1lcyBzZXBhcmF0ZWQgYnkgc3BhY2VzLg0KICAvLyAgICRwX2FkZF9kaXIgOiBBIHBhdGggdG8gYWRkIGJlZm9yZSB0aGUgcmVhbCBwYXRoIG9mIHRoZSBhcmNoaXZlZCBmaWxlLA0KICAvLyAgICAgICAgICAgICAgICBpbiBvcmRlciB0byBoYXZlIGl0IG1lbW9yaXplZCBpbiB0aGUgYXJjaGl2ZS4NCiAgLy8gICAkcF9yZW1vdmVfZGlyIDogQSBwYXRoIHRvIHJlbW92ZSBmcm9tIHRoZSByZWFsIHBhdGggb2YgdGhlIGZpbGUgdG8gYXJjaGl2ZSwNCiAgLy8gICAgICAgICAgICAgICAgICAgaW4gb3JkZXIgdG8gaGF2ZSBhIHNob3J0ZXIgcGF0aCBtZW1vcml6ZWQgaW4gdGhlIGFyY2hpdmUuDQogIC8vICAgICAgICAgICAgICAgICAgIFdoZW4gJHBfYWRkX2RpciBhbmQgJHBfcmVtb3ZlX2RpciBhcmUgc2V0LCAkcF9yZW1vdmVfZGlyDQogIC8vICAgICAgICAgICAgICAgICAgIGlzIHJlbW92ZWQgZmlyc3QsIGJlZm9yZSAkcF9hZGRfZGlyIGlzIGFkZGVkLg0KICAvLyBPcHRpb25zIDoNCiAgLy8gICBQQ0xaSVBfT1BUX0FERF9QQVRIIDoNCiAgLy8gICBQQ0xaSVBfT1BUX1JFTU9WRV9QQVRIIDoNCiAgLy8gICBQQ0xaSVBfT1BUX1JFTU9WRV9BTExfUEFUSCA6DQogIC8vICAgUENMWklQX09QVF9DT01NRU5UIDoNCiAgLy8gICBQQ0xaSVBfT1BUX0FERF9DT01NRU5UIDoNCiAgLy8gICBQQ0xaSVBfT1BUX1BSRVBFTkRfQ09NTUVOVCA6DQogIC8vICAgUENMWklQX0NCX1BSRV9BREQgOg0KICAvLyAgIFBDTFpJUF9DQl9QT1NUX0FERCA6DQogIC8vIFJldHVybiBWYWx1ZXMgOg0KICAvLyAgIDAgb24gZmFpbHVyZSwNCiAgLy8gICBUaGUgbGlzdCBvZiB0aGUgYWRkZWQgZmlsZXMsIHdpdGggYSBzdGF0dXMgb2YgdGhlIGFkZCBhY3Rpb24uDQogIC8vICAgKHNlZSBQY2xaaXA6Omxpc3RDb250ZW50KCkgZm9yIGxpc3QgZW50cnkgZm9ybWF0KQ0KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICBmdW5jdGlvbiBhZGQoJHBfZmlsZWxpc3QpDQogIHsNCiAgICAkdl9yZXN1bHQ9MTsNCg0KICAgIC8vIC0tLS0tIFJlc2V0IHRoZSBlcnJvciBoYW5kbGVyDQogICAgJHRoaXMtPnByaXZFcnJvclJlc2V0KCk7DQoNCiAgICAvLyAtLS0tLSBTZXQgZGVmYXVsdCB2YWx1ZXMNCiAgICAkdl9vcHRpb25zID0gYXJyYXkoKTsNCiAgICAkdl9vcHRpb25zW1BDTFpJUF9PUFRfTk9fQ09NUFJFU1NJT05dID0gRkFMU0U7DQoNCiAgICAvLyAtLS0tLSBMb29rIGZvciB2YXJpYWJsZSBvcHRpb25zIGFyZ3VtZW50cw0KICAgICR2X3NpemUgPSBmdW5jX251bV9hcmdzKCk7DQoNCiAgICAvLyAtLS0tLSBMb29rIGZvciBhcmd1bWVudHMNCiAgICBpZiAoJHZfc2l6ZSA+IDEpIHsNCiAgICAgIC8vIC0tLS0tIEdldCB0aGUgYXJndW1lbnRzDQogICAgICAkdl9hcmdfbGlzdCA9IGZ1bmNfZ2V0X2FyZ3MoKTsNCg0KICAgICAgLy8gLS0tLS0gUmVtb3ZlIGZvcm0gdGhlIG9wdGlvbnMgbGlzdCB0aGUgZmlyc3QgYXJndW1lbnQNCiAgICAgIGFycmF5X3NoaWZ0KCR2X2FyZ19saXN0KTsNCiAgICAgICR2X3NpemUtLTsNCg0KICAgICAgLy8gLS0tLS0gTG9vayBmb3IgZmlyc3QgYXJnDQogICAgICBpZiAoKGlzX2ludGVnZXIoJHZfYXJnX2xpc3RbMF0pKSAmJiAoJHZfYXJnX2xpc3RbMF0gPiA3NzAwMCkpIHsNCg0KICAgICAgICAvLyAtLS0tLSBQYXJzZSB0aGUgb3B0aW9ucw0KICAgICAgICAkdl9yZXN1bHQgPSAkdGhpcy0+cHJpdlBhcnNlT3B0aW9ucygkdl9hcmdfbGlzdCwgJHZfc2l6ZSwgJHZfb3B0aW9ucywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXkgKFBDTFpJUF9PUFRfUkVNT1ZFX1BBVEggPT4gJ29wdGlvbmFsJywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBDTFpJUF9PUFRfUkVNT1ZFX0FMTF9QQVRIID0+ICdvcHRpb25hbCcsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQ0xaSVBfT1BUX0FERF9QQVRIID0+ICdvcHRpb25hbCcsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQ0xaSVBfQ0JfUFJFX0FERCA9PiAnb3B0aW9uYWwnLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUENMWklQX0NCX1BPU1RfQUREID0+ICdvcHRpb25hbCcsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQ0xaSVBfT1BUX05PX0NPTVBSRVNTSU9OID0+ICdvcHRpb25hbCcsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQ0xaSVBfT1BUX0NPTU1FTlQgPT4gJ29wdGlvbmFsJywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBDTFpJUF9PUFRfQUREX0NPTU1FTlQgPT4gJ29wdGlvbmFsJywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBDTFpJUF9PUFRfUFJFUEVORF9DT01NRU5UID0+ICdvcHRpb25hbCcsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQ0xaSVBfT1BUX1RFTVBfRklMRV9USFJFU0hPTEQgPT4gJ29wdGlvbmFsJywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBDTFpJUF9PUFRfVEVNUF9GSUxFX09OID0+ICdvcHRpb25hbCcsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQ0xaSVBfT1BUX1RFTVBfRklMRV9PRkYgPT4gJ29wdGlvbmFsJw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8sIFBDTFpJUF9PUFRfQ1JZUFQgPT4gJ29wdGlvbmFsJw0KCQkJCQkJCQkJCQkJICAgKSk7DQogICAgICAgIGlmICgkdl9yZXN1bHQgIT0gMSkgew0KICAgICAgICAgIHJldHVybiAwOw0KICAgICAgICB9DQogICAgICB9DQoNCiAgICAgIC8vIC0tLS0tIExvb2sgZm9yIDIgYXJncw0KICAgICAgLy8gSGVyZSB3ZSBuZWVkIHRvIHN1cHBvcnQgdGhlIGZpcnN0IGhpc3RvcmljIHN5bm9wc2lzIG9mIHRoZQ0KICAgICAgLy8gbWV0aG9kLg0KICAgICAgZWxzZSB7DQoNCiAgICAgICAgLy8gLS0tLS0gR2V0IHRoZSBmaXJzdCBhcmd1bWVudA0KICAgICAgICAkdl9vcHRpb25zW1BDTFpJUF9PUFRfQUREX1BBVEhdID0gJHZfYWRkX3BhdGggPSAkdl9hcmdfbGlzdFswXTsNCg0KICAgICAgICAvLyAtLS0tLSBMb29rIGZvciB0aGUgb3B0aW9uYWwgc2Vjb25kIGFyZ3VtZW50DQogICAgICAgIGlmICgkdl9zaXplID09IDIpIHsNCiAgICAgICAgICAkdl9vcHRpb25zW1BDTFpJUF9PUFRfUkVNT1ZFX1BBVEhdID0gJHZfYXJnX2xpc3RbMV07DQogICAgICAgIH0NCiAgICAgICAgZWxzZSBpZiAoJHZfc2l6ZSA+IDIpIHsNCiAgICAgICAgICAvLyAtLS0tLSBFcnJvciBsb2cNCiAgICAgICAgICBQY2xaaXA6OnByaXZFcnJvckxvZyhQQ0xaSVBfRVJSX0lOVkFMSURfUEFSQU1FVEVSLCAiSW52YWxpZCBudW1iZXIgLyB0eXBlIG9mIGFyZ3VtZW50cyIpOw0KDQogICAgICAgICAgLy8gLS0tLS0gUmV0dXJuDQogICAgICAgICAgcmV0dXJuIDA7DQogICAgICAgIH0NCiAgICAgIH0NCiAgICB9DQoNCiAgICAvLyAtLS0tLSBMb29rIGZvciBkZWZhdWx0IG9wdGlvbiB2YWx1ZXMNCiAgICAkdGhpcy0+cHJpdk9wdGlvbkRlZmF1bHRUaHJlc2hvbGQoJHZfb3B0aW9ucyk7DQoNCiAgICAvLyAtLS0tLSBJbml0DQogICAgJHZfc3RyaW5nX2xpc3QgPSBhcnJheSgpOw0KICAgICR2X2F0dF9saXN0ID0gYXJyYXkoKTsNCiAgICAkdl9maWxlZGVzY3JfbGlzdCA9IGFycmF5KCk7DQogICAgJHBfcmVzdWx0X2xpc3QgPSBhcnJheSgpOw0KICAgIA0KICAgIC8vIC0tLS0tIExvb2sgaWYgdGhlICRwX2ZpbGVsaXN0IGlzIHJlYWxseSBhbiBhcnJheQ0KICAgIGlmIChpc19hcnJheSgkcF9maWxlbGlzdCkpIHsNCiAgICANCiAgICAgIC8vIC0tLS0tIExvb2sgaWYgdGhlIGZpcnN0IGVsZW1lbnQgaXMgYWxzbyBhbiBhcnJheQ0KICAgICAgLy8gICAgICAgVGhpcyB3aWxsIG1lYW4gdGhhdCB0aGlzIGlzIGEgZmlsZSBkZXNjcmlwdGlvbiBlbnRyeQ0KICAgICAgaWYgKGlzc2V0KCRwX2ZpbGVsaXN0WzBdKSAmJiBpc19hcnJheSgkcF9maWxlbGlzdFswXSkpIHsNCiAgICAgICAgJHZfYXR0X2xpc3QgPSAkcF9maWxlbGlzdDsNCiAgICAgIH0NCiAgICAgIA0KICAgICAgLy8gLS0tLS0gVGhlIGxpc3QgaXMgYSBsaXN0IG9mIHN0cmluZyBuYW1lcw0KICAgICAgZWxzZSB7DQogICAgICAgICR2X3N0cmluZ19saXN0ID0gJHBfZmlsZWxpc3Q7DQogICAgICB9DQogICAgfQ0KDQogICAgLy8gLS0tLS0gTG9vayBpZiB0aGUgJHBfZmlsZWxpc3QgaXMgYSBzdHJpbmcNCiAgICBlbHNlIGlmIChpc19zdHJpbmcoJHBfZmlsZWxpc3QpKSB7DQogICAgICAvLyAtLS0tLSBDcmVhdGUgYSBsaXN0IGZyb20gdGhlIHN0cmluZw0KICAgICAgJHZfc3RyaW5nX2xpc3QgPSBleHBsb2RlKFBDTFpJUF9TRVBBUkFUT1IsICRwX2ZpbGVsaXN0KTsNCiAgICB9DQoNCiAgICAvLyAtLS0tLSBJbnZhbGlkIHZhcmlhYmxlIHR5cGUgZm9yICRwX2ZpbGVsaXN0DQogICAgZWxzZSB7DQogICAgICBQY2xaaXA6OnByaXZFcnJvckxvZyhQQ0xaSVBfRVJSX0lOVkFMSURfUEFSQU1FVEVSLCAiSW52YWxpZCB2YXJpYWJsZSB0eXBlICciLmdldHR5cGUoJHBfZmlsZWxpc3QpLiInIGZvciBwX2ZpbGVsaXN0Iik7DQogICAgICByZXR1cm4gMDsNCiAgICB9DQogICAgDQogICAgLy8gLS0tLS0gUmVmb3JtYXQgdGhlIHN0cmluZyBsaXN0DQogICAgaWYgKHNpemVvZigkdl9zdHJpbmdfbGlzdCkgIT0gMCkgew0KICAgICAgZm9yZWFjaCAoJHZfc3RyaW5nX2xpc3QgYXMgJHZfc3RyaW5nKSB7DQogICAgICAgICR2X2F0dF9saXN0W11bUENMWklQX0FUVF9GSUxFX05BTUVdID0gJHZfc3RyaW5nOw0KICAgICAgfQ0KICAgIH0NCiAgICANCiAgICAvLyAtLS0tLSBGb3IgZWFjaCBmaWxlIGluIHRoZSBsaXN0IGNoZWNrIHRoZSBhdHRyaWJ1dGVzDQogICAgJHZfc3VwcG9ydGVkX2F0dHJpYnV0ZXMNCiAgICA9IGFycmF5ICggUENMWklQX0FUVF9GSUxFX05BTUUgPT4gJ21hbmRhdG9yeScNCiAgICAgICAgICAgICAsUENMWklQX0FUVF9GSUxFX05FV19TSE9SVF9OQU1FID0+ICdvcHRpb25hbCcNCiAgICAgICAgICAgICAsUENMWklQX0FUVF9GSUxFX05FV19GVUxMX05BTUUgPT4gJ29wdGlvbmFsJw0KICAgICAgICAgICAgICxQQ0xaSVBfQVRUX0ZJTEVfTVRJTUUgPT4gJ29wdGlvbmFsJw0KICAgICAgICAgICAgICxQQ0xaSVBfQVRUX0ZJTEVfQ09OVEVOVCA9PiAnb3B0aW9uYWwnDQogICAgICAgICAgICAgLFBDTFpJUF9BVFRfRklMRV9DT01NRU5UID0+ICdvcHRpb25hbCcNCgkJCQkJCSk7DQogICAgZm9yZWFjaCAoJHZfYXR0X2xpc3QgYXMgJHZfZW50cnkpIHsNCiAgICAgICR2X3Jlc3VsdCA9ICR0aGlzLT5wcml2RmlsZURlc2NyUGFyc2VBdHQoJHZfZW50cnksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR2X2ZpbGVkZXNjcl9saXN0W10sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR2X29wdGlvbnMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR2X3N1cHBvcnRlZF9hdHRyaWJ1dGVzKTsNCiAgICAgIGlmICgkdl9yZXN1bHQgIT0gMSkgew0KICAgICAgICByZXR1cm4gMDsNCiAgICAgIH0NCiAgICB9DQoNCiAgICAvLyAtLS0tLSBFeHBhbmQgdGhlIGZpbGVsaXN0IChleHBhbmQgZGlyZWN0b3JpZXMpDQogICAgJHZfcmVzdWx0ID0gJHRoaXMtPnByaXZGaWxlRGVzY3JFeHBhbmQoJHZfZmlsZWRlc2NyX2xpc3QsICR2X29wdGlvbnMpOw0KICAgIGlmICgkdl9yZXN1bHQgIT0gMSkgew0KICAgICAgcmV0dXJuIDA7DQogICAgfQ0KDQogICAgLy8gLS0tLS0gQ2FsbCB0aGUgY3JlYXRlIGZjdA0KICAgICR2X3Jlc3VsdCA9ICR0aGlzLT5wcml2QWRkKCR2X2ZpbGVkZXNjcl9saXN0LCAkcF9yZXN1bHRfbGlzdCwgJHZfb3B0aW9ucyk7DQogICAgaWYgKCR2X3Jlc3VsdCAhPSAxKSB7DQogICAgICByZXR1cm4gMDsNCiAgICB9DQoNCiAgICAvLyAtLS0tLSBSZXR1cm4NCiAgICByZXR1cm4gJHBfcmVzdWx0X2xpc3Q7DQogIH0NCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICAvLyBGdW5jdGlvbiA6IGxpc3RDb250ZW50KCkNCiAgLy8gRGVzY3JpcHRpb24gOg0KICAvLyAgIFRoaXMgcHVibGljIG1ldGhvZCwgZ2l2ZXMgdGhlIGxpc3Qgb2YgdGhlIGZpbGVzIGFuZCBkaXJlY3Rvcmllcywgd2l0aCB0aGVpcg0KICAvLyAgIHByb3BlcnRpZXMuDQogIC8vICAgVGhlIHByb3BlcnRpZXMgb2YgZWFjaCBlbnRyaWVzIGluIHRoZSBsaXN0IGFyZSAodXNlZCBhbHNvIGluIG90aGVyIGZ1bmN0aW9ucykgOg0KICAvLyAgICAgZmlsZW5hbWUgOiBOYW1lIG9mIHRoZSBmaWxlLiBGb3IgYSBjcmVhdGUgb3IgYWRkIGFjdGlvbiBpdCBpcyB0aGUgZmlsZW5hbWUNCiAgLy8gICAgICAgICAgICAgICAgZ2l2ZW4gYnkgdGhlIHVzZXIuIEZvciBhbiBleHRyYWN0IGZ1bmN0aW9uIGl0IGlzIHRoZSBmaWxlbmFtZQ0KICAvLyAgICAgICAgICAgICAgICBvZiB0aGUgZXh0cmFjdGVkIGZpbGUuDQogIC8vICAgICBzdG9yZWRfZmlsZW5hbWUgOiBOYW1lIG9mIHRoZSBmaWxlIC8gZGlyZWN0b3J5IHN0b3JlZCBpbiB0aGUgYXJjaGl2ZS4NCiAgLy8gICAgIHNpemUgOiBTaXplIG9mIHRoZSBzdG9yZWQgZmlsZS4NCiAgLy8gICAgIGNvbXByZXNzZWRfc2l6ZSA6IFNpemUgb2YgdGhlIGZpbGUncyBkYXRhIGNvbXByZXNzZWQgaW4gdGhlIGFyY2hpdmUNCiAgLy8gICAgICAgICAgICAgICAgICAgICAgICh3aXRob3V0IHRoZSBoZWFkZXJzIG92ZXJoZWFkKQ0KICAvLyAgICAgbXRpbWUgOiBMYXN0IGtub3duIG1vZGlmaWNhdGlvbiBkYXRlIG9mIHRoZSBmaWxlIChVTklYIHRpbWVzdGFtcCkNCiAgLy8gICAgIGNvbW1lbnQgOiBDb21tZW50IGFzc29jaWF0ZWQgd2l0aCB0aGUgZmlsZQ0KICAvLyAgICAgZm9sZGVyIDogdHJ1ZSB8IGZhbHNlDQogIC8vICAgICBpbmRleCA6IGluZGV4IG9mIHRoZSBmaWxlIGluIHRoZSBhcmNoaXZlDQogIC8vICAgICBzdGF0dXMgOiBzdGF0dXMgb2YgdGhlIGFjdGlvbiAoZGVwZW5kaW5nIG9mIHRoZSBhY3Rpb24pIDoNCiAgLy8gICAgICAgICAgICAgIFZhbHVlcyBhcmUgOg0KICAvLyAgICAgICAgICAgICAgICBvayA6IE9LICENCiAgLy8gICAgICAgICAgICAgICAgZmlsdGVyZWQgOiB0aGUgZmlsZSAvIGRpciBpcyBub3QgZXh0cmFjdGVkIChmaWx0ZXJlZCBieSB1c2VyKQ0KICAvLyAgICAgICAgICAgICAgICBhbHJlYWR5X2FfZGlyZWN0b3J5IDogdGhlIGZpbGUgY2FuIG5vdCBiZSBleHRyYWN0ZWQgYmVjYXVzZSBhDQogIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3Rvcnkgd2l0aCB0aGUgc2FtZSBuYW1lIGFscmVhZHkgZXhpc3RzDQogIC8vICAgICAgICAgICAgICAgIHdyaXRlX3Byb3RlY3RlZCA6IHRoZSBmaWxlIGNhbiBub3QgYmUgZXh0cmFjdGVkIGJlY2F1c2UgYSBmaWxlDQogIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggdGhlIHNhbWUgbmFtZSBhbHJlYWR5IGV4aXN0cyBhbmQgaXMNCiAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGUgcHJvdGVjdGVkDQogIC8vICAgICAgICAgICAgICAgIG5ld2VyX2V4aXN0IDogdGhlIGZpbGUgd2FzIG5vdCBleHRyYWN0ZWQgYmVjYXVzZSBhIG5ld2VyIGZpbGUgZXhpc3RzDQogIC8vICAgICAgICAgICAgICAgIHBhdGhfY3JlYXRpb25fZmFpbCA6IHRoZSBmaWxlIGlzIG5vdCBleHRyYWN0ZWQgYmVjYXVzZSB0aGUgZm9sZGVyDQogIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvZXMgbm90IGV4aXN0IGFuZCBjYW4gbm90IGJlIGNyZWF0ZWQNCiAgLy8gICAgICAgICAgICAgICAgd3JpdGVfZXJyb3IgOiB0aGUgZmlsZSB3YXMgbm90IGV4dHJhY3RlZCBiZWNhdXNlIHRoZXJlIHdhcyBhDQogIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3Igd2hpbGUgd3JpdGluZyB0aGUgZmlsZQ0KICAvLyAgICAgICAgICAgICAgICByZWFkX2Vycm9yIDogdGhlIGZpbGUgd2FzIG5vdCBleHRyYWN0ZWQgYmVjYXVzZSB0aGVyZSB3YXMgYSBlcnJvcg0KICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgcmVhZGluZyB0aGUgZmlsZQ0KICAvLyAgICAgICAgICAgICAgICBpbnZhbGlkX2hlYWRlciA6IHRoZSBmaWxlIHdhcyBub3QgZXh0cmFjdGVkIGJlY2F1c2Ugb2YgYW4gYXJjaGl2ZQ0KICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCBlcnJvciAoYmFkIGZpbGUgaGVhZGVyKQ0KICAvLyAgIE5vdGUgdGhhdCBlYWNoIHRpbWUgYSBtZXRob2QgY2FuIGNvbnRpbnVlIG9wZXJhdGluZyB3aGVuIHRoZXJlDQogIC8vICAgaXMgYW4gYWN0aW9uIGVycm9yIG9uIGEgZmlsZSwgdGhlIGVycm9yIGlzIG9ubHkgbG9nZ2VkIGluIHRoZSBmaWxlIHN0YXR1cy4NCiAgLy8gUmV0dXJuIFZhbHVlcyA6DQogIC8vICAgMCBvbiBhbiB1bnJlY292ZXJhYmxlIGZhaWx1cmUsDQogIC8vICAgVGhlIGxpc3Qgb2YgdGhlIGZpbGVzIGluIHRoZSBhcmNoaXZlLg0KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICBmdW5jdGlvbiBsaXN0Q29udGVudCgpDQogIHsNCiAgICAkdl9yZXN1bHQ9MTsNCg0KICAgIC8vIC0tLS0tIFJlc2V0IHRoZSBlcnJvciBoYW5kbGVyDQogICAgJHRoaXMtPnByaXZFcnJvclJlc2V0KCk7DQoNCiAgICAvLyAtLS0tLSBDaGVjayBhcmNoaXZlDQogICAgaWYgKCEkdGhpcy0+cHJpdkNoZWNrRm9ybWF0KCkpIHsNCiAgICAgIHJldHVybigwKTsNCiAgICB9DQoNCiAgICAvLyAtLS0tLSBDYWxsIHRoZSBleHRyYWN0aW5nIGZjdA0KICAgICRwX2xpc3QgPSBhcnJheSgpOw0KICAgIGlmICgoJHZfcmVzdWx0ID0gJHRoaXMtPnByaXZMaXN0KCRwX2xpc3QpKSAhPSAxKQ0KICAgIHsNCiAgICAgIHVuc2V0KCRwX2xpc3QpOw0KICAgICAgcmV0dXJuKDApOw0KICAgIH0NCg0KICAgIC8vIC0tLS0tIFJldHVybg0KICAgIHJldHVybiAkcF9saXN0Ow0KICB9DQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAgLy8gRnVuY3Rpb24gOg0KICAvLyAgIGV4dHJhY3QoJHBfcGF0aD0iLi8iLCAkcF9yZW1vdmVfcGF0aD0iIikNCiAgLy8gICBleHRyYWN0KFskcF9vcHRpb24sICRwX29wdGlvbl92YWx1ZSwgLi4uXSkNCiAgLy8gRGVzY3JpcHRpb24gOg0KICAvLyAgIFRoaXMgbWV0aG9kIHN1cHBvcnRzIHR3byBzeW5vcHNpcy4gVGhlIGZpcnN0IG9uZSBpcyBoaXN0b3JpY2FsLg0KICAvLyAgIFRoaXMgbWV0aG9kIGV4dHJhY3QgYWxsIHRoZSBmaWxlcyAvIGRpcmVjdG9yaWVzIGZyb20gdGhlIGFyY2hpdmUgdG8gdGhlDQogIC8vICAgZm9sZGVyIGluZGljYXRlZCBpbiAkcF9wYXRoLg0KICAvLyAgIElmIHlvdSB3YW50IHRvIGlnbm9yZSB0aGUgJ3Jvb3QnIHBhcnQgb2YgcGF0aCBvZiB0aGUgbWVtb3JpemVkIGZpbGVzDQogIC8vICAgeW91IGNhbiBpbmRpY2F0ZSB0aGlzIGluIHRoZSBvcHRpb25hbCAkcF9yZW1vdmVfcGF0aCBwYXJhbWV0ZXIuDQogIC8vICAgQnkgZGVmYXVsdCwgaWYgYSBuZXdlciBmaWxlIHdpdGggdGhlIHNhbWUgbmFtZSBhbHJlYWR5IGV4aXN0cywgdGhlDQogIC8vICAgZmlsZSBpcyBub3QgZXh0cmFjdGVkLg0KICAvLw0KICAvLyAgIElmIGJvdGggUENMWklQX09QVF9QQVRIIGFuZCBQQ0xaSVBfT1BUX0FERF9QQVRIIGFvcHRpb25zDQogIC8vICAgYXJlIHVzZWQsIHRoZSBwYXRoIGluZGljYXRlZCBpbiBQQ0xaSVBfT1BUX0FERF9QQVRIIGlzIGFwcGVuZA0KICAvLyAgIGF0IHRoZSBlbmQgb2YgdGhlIHBhdGggdmFsdWUgb2YgUENMWklQX09QVF9QQVRILg0KICAvLyBQYXJhbWV0ZXJzIDoNCiAgLy8gICAkcF9wYXRoIDogUGF0aCB3aGVyZSB0aGUgZmlsZXMgYW5kIGRpcmVjdG9yaWVzIGFyZSB0byBiZSBleHRyYWN0ZWQNCiAgLy8gICAkcF9yZW1vdmVfcGF0aCA6IEZpcnN0IHBhcnQgKCdyb290JyBwYXJ0KSBvZiB0aGUgbWVtb3JpemVkIHBhdGgNCiAgLy8gICAgICAgICAgICAgICAgICAgIChpZiBhbnkgc2ltaWxhcikgdG8gcmVtb3ZlIHdoaWxlIGV4dHJhY3RpbmcuDQogIC8vIE9wdGlvbnMgOg0KICAvLyAgIFBDTFpJUF9PUFRfUEFUSCA6DQogIC8vICAgUENMWklQX09QVF9BRERfUEFUSCA6DQogIC8vICAgUENMWklQX09QVF9SRU1PVkVfUEFUSCA6DQogIC8vICAgUENMWklQX09QVF9SRU1PVkVfQUxMX1BBVEggOg0KICAvLyAgIFBDTFpJUF9DQl9QUkVfRVhUUkFDVCA6DQogIC8vICAgUENMWklQX0NCX1BPU1RfRVhUUkFDVCA6DQogIC8vIFJldHVybiBWYWx1ZXMgOg0KICAvLyAgIDAgb3IgYSBuZWdhdGl2ZSB2YWx1ZSBvbiBmYWlsdXJlLA0KICAvLyAgIFRoZSBsaXN0IG9mIHRoZSBleHRyYWN0ZWQgZmlsZXMsIHdpdGggYSBzdGF0dXMgb2YgdGhlIGFjdGlvbi4NCiAgLy8gICAoc2VlIFBjbFppcDo6bGlzdENvbnRlbnQoKSBmb3IgbGlzdCBlbnRyeSBmb3JtYXQpDQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogIGZ1bmN0aW9uIGV4dHJhY3QoKQ0KICB7DQogICAgJHZfcmVzdWx0PTE7DQoNCiAgICAvLyAtLS0tLSBSZXNldCB0aGUgZXJyb3IgaGFuZGxlcg0KICAgICR0aGlzLT5wcml2RXJyb3JSZXNldCgpOw0KDQogICAgLy8gLS0tLS0gQ2hlY2sgYXJjaGl2ZQ0KICAgIGlmICghJHRoaXMtPnByaXZDaGVja0Zvcm1hdCgpKSB7DQogICAgICByZXR1cm4oMCk7DQogICAgfQ0KDQogICAgLy8gLS0tLS0gU2V0IGRlZmF1bHQgdmFsdWVzDQogICAgJHZfb3B0aW9ucyA9IGFycmF5KCk7DQovLyAgICAkdl9wYXRoID0gIi4vIjsNCiAgICAkdl9wYXRoID0gJyc7DQogICAgJHZfcmVtb3ZlX3BhdGggPSAiIjsNCiAgICAkdl9yZW1vdmVfYWxsX3BhdGggPSBmYWxzZTsNCg0KICAgIC8vIC0tLS0tIExvb2sgZm9yIHZhcmlhYmxlIG9wdGlvbnMgYXJndW1lbnRzDQogICAgJHZfc2l6ZSA9IGZ1bmNfbnVtX2FyZ3MoKTsNCg0KICAgIC8vIC0tLS0tIERlZmF1bHQgdmFsdWVzIGZvciBvcHRpb24NCiAgICAkdl9vcHRpb25zW1BDTFpJUF9PUFRfRVhUUkFDVF9BU19TVFJJTkddID0gRkFMU0U7DQoNCiAgICAvLyAtLS0tLSBMb29rIGZvciBhcmd1bWVudHMNCiAgICBpZiAoJHZfc2l6ZSA+IDApIHsNCiAgICAgIC8vIC0tLS0tIEdldCB0aGUgYXJndW1lbnRzDQogICAgICAkdl9hcmdfbGlzdCA9IGZ1bmNfZ2V0X2FyZ3MoKTsNCg0KICAgICAgLy8gLS0tLS0gTG9vayBmb3IgZmlyc3QgYXJnDQogICAgICBpZiAoKGlzX2ludGVnZXIoJHZfYXJnX2xpc3RbMF0pKSAmJiAoJHZfYXJnX2xpc3RbMF0gPiA3NzAwMCkpIHsNCg0KICAgICAgICAvLyAtLS0tLSBQYXJzZSB0aGUgb3B0aW9ucw0KICAgICAgICAkdl9yZXN1bHQgPSAkdGhpcy0+cHJpdlBhcnNlT3B0aW9ucygkdl9hcmdfbGlzdCwgJHZfc2l6ZSwgJHZfb3B0aW9ucywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXkgKFBDTFpJUF9PUFRfUEFUSCA9PiAnb3B0aW9uYWwnLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUENMWklQX09QVF9SRU1PVkVfUEFUSCA9PiAnb3B0aW9uYWwnLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUENMWklQX09QVF9SRU1PVkVfQUxMX1BBVEggPT4gJ29wdGlvbmFsJywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBDTFpJUF9PUFRfQUREX1BBVEggPT4gJ29wdGlvbmFsJywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBDTFpJUF9DQl9QUkVfRVhUUkFDVCA9PiAnb3B0aW9uYWwnLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUENMWklQX0NCX1BPU1RfRVhUUkFDVCA9PiAnb3B0aW9uYWwnLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUENMWklQX09QVF9TRVRfQ0hNT0QgPT4gJ29wdGlvbmFsJywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBDTFpJUF9PUFRfQllfTkFNRSA9PiAnb3B0aW9uYWwnLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUENMWklQX09QVF9CWV9FUkVHID0+ICdvcHRpb25hbCcsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQ0xaSVBfT1BUX0JZX1BSRUcgPT4gJ29wdGlvbmFsJywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBDTFpJUF9PUFRfQllfSU5ERVggPT4gJ29wdGlvbmFsJywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBDTFpJUF9PUFRfRVhUUkFDVF9BU19TVFJJTkcgPT4gJ29wdGlvbmFsJywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBDTFpJUF9PUFRfRVhUUkFDVF9JTl9PVVRQVVQgPT4gJ29wdGlvbmFsJywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBDTFpJUF9PUFRfUkVQTEFDRV9ORVdFUiA9PiAnb3B0aW9uYWwnDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsUENMWklQX09QVF9TVE9QX09OX0VSUk9SID0+ICdvcHRpb25hbCcNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICxQQ0xaSVBfT1BUX0VYVFJBQ1RfRElSX1JFU1RSSUNUSU9OID0+ICdvcHRpb25hbCcsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQ0xaSVBfT1BUX1RFTVBfRklMRV9USFJFU0hPTEQgPT4gJ29wdGlvbmFsJywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBDTFpJUF9PUFRfVEVNUF9GSUxFX09OID0+ICdvcHRpb25hbCcsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQ0xaSVBfT1BUX1RFTVBfRklMRV9PRkYgPT4gJ29wdGlvbmFsJw0KCQkJCQkJCQkJCQkJICAgICkpOw0KICAgICAgICBpZiAoJHZfcmVzdWx0ICE9IDEpIHsNCiAgICAgICAgICByZXR1cm4gMDsNCiAgICAgICAgfQ0KDQogICAgICAgIC8vIC0tLS0tIFNldCB0aGUgYXJndW1lbnRzDQogICAgICAgIGlmIChpc3NldCgkdl9vcHRpb25zW1BDTFpJUF9PUFRfUEFUSF0pKSB7DQogICAgICAgICAgJHZfcGF0aCA9ICR2X29wdGlvbnNbUENMWklQX09QVF9QQVRIXTsNCiAgICAgICAgfQ0KICAgICAgICBpZiAoaXNzZXQoJHZfb3B0aW9uc1tQQ0xaSVBfT1BUX1JFTU9WRV9QQVRIXSkpIHsNCiAgICAgICAgICAkdl9yZW1vdmVfcGF0aCA9ICR2X29wdGlvbnNbUENMWklQX09QVF9SRU1PVkVfUEFUSF07DQogICAgICAgIH0NCiAgICAgICAgaWYgKGlzc2V0KCR2X29wdGlvbnNbUENMWklQX09QVF9SRU1PVkVfQUxMX1BBVEhdKSkgew0KICAgICAgICAgICR2X3JlbW92ZV9hbGxfcGF0aCA9ICR2X29wdGlvbnNbUENMWklQX09QVF9SRU1PVkVfQUxMX1BBVEhdOw0KICAgICAgICB9DQogICAgICAgIGlmIChpc3NldCgkdl9vcHRpb25zW1BDTFpJUF9PUFRfQUREX1BBVEhdKSkgew0KICAgICAgICAgIC8vIC0tLS0tIENoZWNrIGZvciAnLycgaW4gbGFzdCBwYXRoIGNoYXINCiAgICAgICAgICBpZiAoKHN0cmxlbigkdl9wYXRoKSA+IDApICYmIChzdWJzdHIoJHZfcGF0aCwgLTEpICE9ICcvJykpIHsNCiAgICAgICAgICAgICR2X3BhdGggLj0gJy8nOw0KICAgICAgICAgIH0NCiAgICAgICAgICAkdl9wYXRoIC49ICR2X29wdGlvbnNbUENMWklQX09QVF9BRERfUEFUSF07DQogICAgICAgIH0NCiAgICAgIH0NCg0KICAgICAgLy8gLS0tLS0gTG9vayBmb3IgMiBhcmdzDQogICAgICAvLyBIZXJlIHdlIG5lZWQgdG8gc3VwcG9ydCB0aGUgZmlyc3QgaGlzdG9yaWMgc3lub3BzaXMgb2YgdGhlDQogICAgICAvLyBtZXRob2QuDQogICAgICBlbHNlIHsNCg0KICAgICAgICAvLyAtLS0tLSBHZXQgdGhlIGZpcnN0IGFyZ3VtZW50DQogICAgICAgICR2X3BhdGggPSAkdl9hcmdfbGlzdFswXTsNCg0KICAgICAgICAvLyAtLS0tLSBMb29rIGZvciB0aGUgb3B0aW9uYWwgc2Vjb25kIGFyZ3VtZW50DQogICAgICAgIGlmICgkdl9zaXplID09IDIpIHsNCiAgICAgICAgICAkdl9yZW1vdmVfcGF0aCA9ICR2X2FyZ19saXN0WzFdOw0KICAgICAgICB9DQogICAgICAgIGVsc2UgaWYgKCR2X3NpemUgPiAyKSB7DQogICAgICAgICAgLy8gLS0tLS0gRXJyb3IgbG9nDQogICAgICAgICAgUGNsWmlwOjpwcml2RXJyb3JMb2coUENMWklQX0VSUl9JTlZBTElEX1BBUkFNRVRFUiwgIkludmFsaWQgbnVtYmVyIC8gdHlwZSBvZiBhcmd1bWVudHMiKTsNCg0KICAgICAgICAgIC8vIC0tLS0tIFJldHVybg0KICAgICAgICAgIHJldHVybiAwOw0KICAgICAgICB9DQogICAgICB9DQogICAgfQ0KDQogICAgLy8gLS0tLS0gTG9vayBmb3IgZGVmYXVsdCBvcHRpb24gdmFsdWVzDQogICAgJHRoaXMtPnByaXZPcHRpb25EZWZhdWx0VGhyZXNob2xkKCR2X29wdGlvbnMpOw0KDQogICAgLy8gLS0tLS0gVHJhY2UNCg0KICAgIC8vIC0tLS0tIENhbGwgdGhlIGV4dHJhY3RpbmcgZmN0DQogICAgJHBfbGlzdCA9IGFycmF5KCk7DQogICAgJHZfcmVzdWx0ID0gJHRoaXMtPnByaXZFeHRyYWN0QnlSdWxlKCRwX2xpc3QsICR2X3BhdGgsICR2X3JlbW92ZV9wYXRoLA0KCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdl9yZW1vdmVfYWxsX3BhdGgsICR2X29wdGlvbnMpOw0KICAgIGlmICgkdl9yZXN1bHQgPCAxKSB7DQogICAgICB1bnNldCgkcF9saXN0KTsNCiAgICAgIHJldHVybigwKTsNCiAgICB9DQoNCiAgICAvLyAtLS0tLSBSZXR1cm4NCiAgICByZXR1cm4gJHBfbGlzdDsNCiAgfQ0KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQoNCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAgLy8gRnVuY3Rpb24gOg0KICAvLyAgIGV4dHJhY3RCeUluZGV4KCRwX2luZGV4LCAkcF9wYXRoPSIuLyIsICRwX3JlbW92ZV9wYXRoPSIiKQ0KICAvLyAgIGV4dHJhY3RCeUluZGV4KCRwX2luZGV4LCBbJHBfb3B0aW9uLCAkcF9vcHRpb25fdmFsdWUsIC4uLl0pDQogIC8vIERlc2NyaXB0aW9uIDoNCiAgLy8gICBUaGlzIG1ldGhvZCBzdXBwb3J0cyB0d28gc3lub3BzaXMuIFRoZSBmaXJzdCBvbmUgaXMgaGlzdG9yaWNhbC4NCiAgLy8gICBUaGlzIG1ldGhvZCBpcyBkb2luZyBhIHBhcnRpYWwgZXh0cmFjdCBvZiB0aGUgYXJjaGl2ZS4NCiAgLy8gICBUaGUgZXh0cmFjdGVkIGZpbGVzIG9yIGZvbGRlcnMgYXJlIGlkZW50aWZpZWQgYnkgdGhlaXIgaW5kZXggaW4gdGhlDQogIC8vICAgYXJjaGl2ZSAoZnJvbSAwIHRvIG4pLg0KICAvLyAgIE5vdGUgdGhhdCBpZiB0aGUgaW5kZXggaWRlbnRpZnkgYSBmb2xkZXIsIG9ubHkgdGhlIGZvbGRlciBlbnRyeSBpcw0KICAvLyAgIGV4dHJhY3RlZCwgbm90IGFsbCB0aGUgZmlsZXMgaW5jbHVkZWQgaW4gdGhlIGFyY2hpdmUuDQogIC8vIFBhcmFtZXRlcnMgOg0KICAvLyAgICRwX2luZGV4IDogQSBzaW5nbGUgaW5kZXggKGludGVnZXIpIG9yIGEgc3RyaW5nIG9mIGluZGV4ZXMgb2YgZmlsZXMgdG8NCiAgLy8gICAgICAgICAgICAgIGV4dHJhY3QuIFRoZSBmb3JtIG9mIHRoZSBzdHJpbmcgaXMgIjAsNC02LDgtMTIiIHdpdGggb25seSBudW1iZXJzDQogIC8vICAgICAgICAgICAgICBhbmQgJy0nIGZvciByYW5nZSBvciAnLCcgdG8gc2VwYXJhdGUgcmFuZ2VzLiBObyBzcGFjZXMgb3IgJzsnDQogIC8vICAgICAgICAgICAgICBhcmUgYWxsb3dlZC4NCiAgLy8gICAkcF9wYXRoIDogUGF0aCB3aGVyZSB0aGUgZmlsZXMgYW5kIGRpcmVjdG9yaWVzIGFyZSB0byBiZSBleHRyYWN0ZWQNCiAgLy8gICAkcF9yZW1vdmVfcGF0aCA6IEZpcnN0IHBhcnQgKCdyb290JyBwYXJ0KSBvZiB0aGUgbWVtb3JpemVkIHBhdGgNCiAgLy8gICAgICAgICAgICAgICAgICAgIChpZiBhbnkgc2ltaWxhcikgdG8gcmVtb3ZlIHdoaWxlIGV4dHJhY3RpbmcuDQogIC8vIE9wdGlvbnMgOg0KICAvLyAgIFBDTFpJUF9PUFRfUEFUSCA6DQogIC8vICAgUENMWklQX09QVF9BRERfUEFUSCA6DQogIC8vICAgUENMWklQX09QVF9SRU1PVkVfUEFUSCA6DQogIC8vICAgUENMWklQX09QVF9SRU1PVkVfQUxMX1BBVEggOg0KICAvLyAgIFBDTFpJUF9PUFRfRVhUUkFDVF9BU19TVFJJTkcgOiBUaGUgZmlsZXMgYXJlIGV4dHJhY3RlZCBhcyBzdHJpbmdzIGFuZA0KICAvLyAgICAgbm90IGFzIGZpbGVzLg0KICAvLyAgICAgVGhlIHJlc3VsdGluZyBjb250ZW50IGlzIGluIGEgbmV3IGZpZWxkICdjb250ZW50JyBpbiB0aGUgZmlsZQ0KICAvLyAgICAgc3RydWN0dXJlLg0KICAvLyAgICAgVGhpcyBvcHRpb24gbXVzdCBiZSB1c2VkIGFsb25lIChhbnkgb3RoZXIgb3B0aW9ucyBhcmUgaWdub3JlZCkuDQogIC8vICAgUENMWklQX0NCX1BSRV9FWFRSQUNUIDoNCiAgLy8gICBQQ0xaSVBfQ0JfUE9TVF9FWFRSQUNUIDoNCiAgLy8gUmV0dXJuIFZhbHVlcyA6DQogIC8vICAgMCBvbiBmYWlsdXJlLA0KICAvLyAgIFRoZSBsaXN0IG9mIHRoZSBleHRyYWN0ZWQgZmlsZXMsIHdpdGggYSBzdGF0dXMgb2YgdGhlIGFjdGlvbi4NCiAgLy8gICAoc2VlIFBjbFppcDo6bGlzdENvbnRlbnQoKSBmb3IgbGlzdCBlbnRyeSBmb3JtYXQpDQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogIC8vZnVuY3Rpb24gZXh0cmFjdEJ5SW5kZXgoJHBfaW5kZXgsIG9wdGlvbnMuLi4pDQogIGZ1bmN0aW9uIGV4dHJhY3RCeUluZGV4KCRwX2luZGV4KQ0KICB7DQogICAgJHZfcmVzdWx0PTE7DQoNCiAgICAvLyAtLS0tLSBSZXNldCB0aGUgZXJyb3IgaGFuZGxlcg0KICAgICR0aGlzLT5wcml2RXJyb3JSZXNldCgpOw0KDQogICAgLy8gLS0tLS0gQ2hlY2sgYXJjaGl2ZQ0KICAgIGlmICghJHRoaXMtPnByaXZDaGVja0Zvcm1hdCgpKSB7DQogICAgICByZXR1cm4oMCk7DQogICAgfQ0KDQogICAgLy8gLS0tLS0gU2V0IGRlZmF1bHQgdmFsdWVzDQogICAgJHZfb3B0aW9ucyA9IGFycmF5KCk7DQovLyAgICAkdl9wYXRoID0gIi4vIjsNCiAgICAkdl9wYXRoID0gJyc7DQogICAgJHZfcmVtb3ZlX3BhdGggPSAiIjsNCiAgICAkdl9yZW1vdmVfYWxsX3BhdGggPSBmYWxzZTsNCg0KICAgIC8vIC0tLS0tIExvb2sgZm9yIHZhcmlhYmxlIG9wdGlvbnMgYXJndW1lbnRzDQogICAgJHZfc2l6ZSA9IGZ1bmNfbnVtX2FyZ3MoKTsNCg0KICAgIC8vIC0tLS0tIERlZmF1bHQgdmFsdWVzIGZvciBvcHRpb24NCiAgICAkdl9vcHRpb25zW1BDTFpJUF9PUFRfRVhUUkFDVF9BU19TVFJJTkddID0gRkFMU0U7DQoNCiAgICAvLyAtLS0tLSBMb29rIGZvciBhcmd1bWVudHMNCiAgICBpZiAoJHZfc2l6ZSA+IDEpIHsNCiAgICAgIC8vIC0tLS0tIEdldCB0aGUgYXJndW1lbnRzDQogICAgICAkdl9hcmdfbGlzdCA9IGZ1bmNfZ2V0X2FyZ3MoKTsNCg0KICAgICAgLy8gLS0tLS0gUmVtb3ZlIGZvcm0gdGhlIG9wdGlvbnMgbGlzdCB0aGUgZmlyc3QgYXJndW1lbnQNCiAgICAgIGFycmF5X3NoaWZ0KCR2X2FyZ19saXN0KTsNCiAgICAgICR2X3NpemUtLTsNCg0KICAgICAgLy8gLS0tLS0gTG9vayBmb3IgZmlyc3QgYXJnDQogICAgICBpZiAoKGlzX2ludGVnZXIoJHZfYXJnX2xpc3RbMF0pKSAmJiAoJHZfYXJnX2xpc3RbMF0gPiA3NzAwMCkpIHsNCg0KICAgICAgICAvLyAtLS0tLSBQYXJzZSB0aGUgb3B0aW9ucw0KICAgICAgICAkdl9yZXN1bHQgPSAkdGhpcy0+cHJpdlBhcnNlT3B0aW9ucygkdl9hcmdfbGlzdCwgJHZfc2l6ZSwgJHZfb3B0aW9ucywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXkgKFBDTFpJUF9PUFRfUEFUSCA9PiAnb3B0aW9uYWwnLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUENMWklQX09QVF9SRU1PVkVfUEFUSCA9PiAnb3B0aW9uYWwnLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUENMWklQX09QVF9SRU1PVkVfQUxMX1BBVEggPT4gJ29wdGlvbmFsJywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBDTFpJUF9PUFRfRVhUUkFDVF9BU19TVFJJTkcgPT4gJ29wdGlvbmFsJywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBDTFpJUF9PUFRfQUREX1BBVEggPT4gJ29wdGlvbmFsJywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBDTFpJUF9DQl9QUkVfRVhUUkFDVCA9PiAnb3B0aW9uYWwnLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUENMWklQX0NCX1BPU1RfRVhUUkFDVCA9PiAnb3B0aW9uYWwnLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUENMWklQX09QVF9TRVRfQ0hNT0QgPT4gJ29wdGlvbmFsJywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBDTFpJUF9PUFRfUkVQTEFDRV9ORVdFUiA9PiAnb3B0aW9uYWwnDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsUENMWklQX09QVF9TVE9QX09OX0VSUk9SID0+ICdvcHRpb25hbCcNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICxQQ0xaSVBfT1BUX0VYVFJBQ1RfRElSX1JFU1RSSUNUSU9OID0+ICdvcHRpb25hbCcsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQ0xaSVBfT1BUX1RFTVBfRklMRV9USFJFU0hPTEQgPT4gJ29wdGlvbmFsJywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBDTFpJUF9PUFRfVEVNUF9GSUxFX09OID0+ICdvcHRpb25hbCcsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQ0xaSVBfT1BUX1RFTVBfRklMRV9PRkYgPT4gJ29wdGlvbmFsJw0KCQkJCQkJCQkJCQkJICAgKSk7DQogICAgICAgIGlmICgkdl9yZXN1bHQgIT0gMSkgew0KICAgICAgICAgIHJldHVybiAwOw0KICAgICAgICB9DQoNCiAgICAgICAgLy8gLS0tLS0gU2V0IHRoZSBhcmd1bWVudHMNCiAgICAgICAgaWYgKGlzc2V0KCR2X29wdGlvbnNbUENMWklQX09QVF9QQVRIXSkpIHsNCiAgICAgICAgICAkdl9wYXRoID0gJHZfb3B0aW9uc1tQQ0xaSVBfT1BUX1BBVEhdOw0KICAgICAgICB9DQogICAgICAgIGlmIChpc3NldCgkdl9vcHRpb25zW1BDTFpJUF9PUFRfUkVNT1ZFX1BBVEhdKSkgew0KICAgICAgICAgICR2X3JlbW92ZV9wYXRoID0gJHZfb3B0aW9uc1tQQ0xaSVBfT1BUX1JFTU9WRV9QQVRIXTsNCiAgICAgICAgfQ0KICAgICAgICBpZiAoaXNzZXQoJHZfb3B0aW9uc1tQQ0xaSVBfT1BUX1JFTU9WRV9BTExfUEFUSF0pKSB7DQogICAgICAgICAgJHZfcmVtb3ZlX2FsbF9wYXRoID0gJHZfb3B0aW9uc1tQQ0xaSVBfT1BUX1JFTU9WRV9BTExfUEFUSF07DQogICAgICAgIH0NCiAgICAgICAgaWYgKGlzc2V0KCR2X29wdGlvbnNbUENMWklQX09QVF9BRERfUEFUSF0pKSB7DQogICAgICAgICAgLy8gLS0tLS0gQ2hlY2sgZm9yICcvJyBpbiBsYXN0IHBhdGggY2hhcg0KICAgICAgICAgIGlmICgoc3RybGVuKCR2X3BhdGgpID4gMCkgJiYgKHN1YnN0cigkdl9wYXRoLCAtMSkgIT0gJy8nKSkgew0KICAgICAgICAgICAgJHZfcGF0aCAuPSAnLyc7DQogICAgICAgICAgfQ0KICAgICAgICAgICR2X3BhdGggLj0gJHZfb3B0aW9uc1tQQ0xaSVBfT1BUX0FERF9QQVRIXTsNCiAgICAgICAgfQ0KICAgICAgICBpZiAoIWlzc2V0KCR2X29wdGlvbnNbUENMWklQX09QVF9FWFRSQUNUX0FTX1NUUklOR10pKSB7DQogICAgICAgICAgJHZfb3B0aW9uc1tQQ0xaSVBfT1BUX0VYVFJBQ1RfQVNfU1RSSU5HXSA9IEZBTFNFOw0KICAgICAgICB9DQogICAgICAgIGVsc2Ugew0KICAgICAgICB9DQogICAgICB9DQoNCiAgICAgIC8vIC0tLS0tIExvb2sgZm9yIDIgYXJncw0KICAgICAgLy8gSGVyZSB3ZSBuZWVkIHRvIHN1cHBvcnQgdGhlIGZpcnN0IGhpc3RvcmljIHN5bm9wc2lzIG9mIHRoZQ0KICAgICAgLy8gbWV0aG9kLg0KICAgICAgZWxzZSB7DQoNCiAgICAgICAgLy8gLS0tLS0gR2V0IHRoZSBmaXJzdCBhcmd1bWVudA0KICAgICAgICAkdl9wYXRoID0gJHZfYXJnX2xpc3RbMF07DQoNCiAgICAgICAgLy8gLS0tLS0gTG9vayBmb3IgdGhlIG9wdGlvbmFsIHNlY29uZCBhcmd1bWVudA0KICAgICAgICBpZiAoJHZfc2l6ZSA9PSAyKSB7DQogICAgICAgICAgJHZfcmVtb3ZlX3BhdGggPSAkdl9hcmdfbGlzdFsxXTsNCiAgICAgICAgfQ0KICAgICAgICBlbHNlIGlmICgkdl9zaXplID4gMikgew0KICAgICAgICAgIC8vIC0tLS0tIEVycm9yIGxvZw0KICAgICAgICAgIFBjbFppcDo6cHJpdkVycm9yTG9nKFBDTFpJUF9FUlJfSU5WQUxJRF9QQVJBTUVURVIsICJJbnZhbGlkIG51bWJlciAvIHR5cGUgb2YgYXJndW1lbnRzIik7DQoNCiAgICAgICAgICAvLyAtLS0tLSBSZXR1cm4NCiAgICAgICAgICByZXR1cm4gMDsNCiAgICAgICAgfQ0KICAgICAgfQ0KICAgIH0NCg0KICAgIC8vIC0tLS0tIFRyYWNlDQoNCiAgICAvLyAtLS0tLSBUcmljaw0KICAgIC8vIEhlcmUgSSB3YW50IHRvIHJldXNlIGV4dHJhY3RCeVJ1bGUoKSwgc28gSSBuZWVkIHRvIHBhcnNlIHRoZSAkcF9pbmRleA0KICAgIC8vIHdpdGggcHJpdlBhcnNlT3B0aW9ucygpDQogICAgJHZfYXJnX3RyaWNrID0gYXJyYXkgKFBDTFpJUF9PUFRfQllfSU5ERVgsICRwX2luZGV4KTsNCiAgICAkdl9vcHRpb25zX3RyaWNrID0gYXJyYXkoKTsNCiAgICAkdl9yZXN1bHQgPSAkdGhpcy0+cHJpdlBhcnNlT3B0aW9ucygkdl9hcmdfdHJpY2ssIHNpemVvZigkdl9hcmdfdHJpY2spLCAkdl9vcHRpb25zX3RyaWNrLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5IChQQ0xaSVBfT1BUX0JZX0lOREVYID0+ICdvcHRpb25hbCcgKSk7DQogICAgaWYgKCR2X3Jlc3VsdCAhPSAxKSB7DQogICAgICAgIHJldHVybiAwOw0KICAgIH0NCiAgICAkdl9vcHRpb25zW1BDTFpJUF9PUFRfQllfSU5ERVhdID0gJHZfb3B0aW9uc190cmlja1tQQ0xaSVBfT1BUX0JZX0lOREVYXTsNCg0KICAgIC8vIC0tLS0tIExvb2sgZm9yIGRlZmF1bHQgb3B0aW9uIHZhbHVlcw0KICAgICR0aGlzLT5wcml2T3B0aW9uRGVmYXVsdFRocmVzaG9sZCgkdl9vcHRpb25zKTsNCg0KICAgIC8vIC0tLS0tIENhbGwgdGhlIGV4dHJhY3RpbmcgZmN0DQogICAgaWYgKCgkdl9yZXN1bHQgPSAkdGhpcy0+cHJpdkV4dHJhY3RCeVJ1bGUoJHBfbGlzdCwgJHZfcGF0aCwgJHZfcmVtb3ZlX3BhdGgsICR2X3JlbW92ZV9hbGxfcGF0aCwgJHZfb3B0aW9ucykpIDwgMSkgew0KICAgICAgICByZXR1cm4oMCk7DQogICAgfQ0KDQogICAgLy8gLS0tLS0gUmV0dXJuDQogICAgcmV0dXJuICRwX2xpc3Q7DQogIH0NCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICAvLyBGdW5jdGlvbiA6DQogIC8vICAgZGVsZXRlKFskcF9vcHRpb24sICRwX29wdGlvbl92YWx1ZSwgLi4uXSkNCiAgLy8gRGVzY3JpcHRpb24gOg0KICAvLyAgIFRoaXMgbWV0aG9kIHJlbW92ZXMgZmlsZXMgZnJvbSB0aGUgYXJjaGl2ZS4NCiAgLy8gICBJZiBubyBwYXJhbWV0ZXJzIGFyZSBnaXZlbiwgdGhlbiBhbGwgdGhlIGFyY2hpdmUgaXMgZW1wdGllZC4NCiAgLy8gUGFyYW1ldGVycyA6DQogIC8vICAgTm9uZSBvciBvcHRpb25hbCBhcmd1bWVudHMuDQogIC8vIE9wdGlvbnMgOg0KICAvLyAgIFBDTFpJUF9PUFRfQllfSU5ERVggOg0KICAvLyAgIFBDTFpJUF9PUFRfQllfTkFNRSA6DQogIC8vICAgUENMWklQX09QVF9CWV9FUkVHIDogDQogIC8vICAgUENMWklQX09QVF9CWV9QUkVHIDoNCiAgLy8gUmV0dXJuIFZhbHVlcyA6DQogIC8vICAgMCBvbiBmYWlsdXJlLA0KICAvLyAgIFRoZSBsaXN0IG9mIHRoZSBmaWxlcyB3aGljaCBhcmUgc3RpbGwgcHJlc2VudCBpbiB0aGUgYXJjaGl2ZS4NCiAgLy8gICAoc2VlIFBjbFppcDo6bGlzdENvbnRlbnQoKSBmb3IgbGlzdCBlbnRyeSBmb3JtYXQpDQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogIGZ1bmN0aW9uIGRlbGV0ZSgpDQogIHsNCiAgICAkdl9yZXN1bHQ9MTsNCg0KICAgIC8vIC0tLS0tIFJlc2V0IHRoZSBlcnJvciBoYW5kbGVyDQogICAgJHRoaXMtPnByaXZFcnJvclJlc2V0KCk7DQoNCiAgICAvLyAtLS0tLSBDaGVjayBhcmNoaXZlDQogICAgaWYgKCEkdGhpcy0+cHJpdkNoZWNrRm9ybWF0KCkpIHsNCiAgICAgIHJldHVybigwKTsNCiAgICB9DQoNCiAgICAvLyAtLS0tLSBTZXQgZGVmYXVsdCB2YWx1ZXMNCiAgICAkdl9vcHRpb25zID0gYXJyYXkoKTsNCg0KICAgIC8vIC0tLS0tIExvb2sgZm9yIHZhcmlhYmxlIG9wdGlvbnMgYXJndW1lbnRzDQogICAgJHZfc2l6ZSA9IGZ1bmNfbnVtX2FyZ3MoKTsNCg0KICAgIC8vIC0tLS0tIExvb2sgZm9yIGFyZ3VtZW50cw0KICAgIGlmICgkdl9zaXplID4gMCkgew0KICAgICAgLy8gLS0tLS0gR2V0IHRoZSBhcmd1bWVudHMNCiAgICAgICR2X2FyZ19saXN0ID0gZnVuY19nZXRfYXJncygpOw0KDQogICAgICAvLyAtLS0tLSBQYXJzZSB0aGUgb3B0aW9ucw0KICAgICAgJHZfcmVzdWx0ID0gJHRoaXMtPnByaXZQYXJzZU9wdGlvbnMoJHZfYXJnX2xpc3QsICR2X3NpemUsICR2X29wdGlvbnMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXkgKFBDTFpJUF9PUFRfQllfTkFNRSA9PiAnb3B0aW9uYWwnLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQ0xaSVBfT1BUX0JZX0VSRUcgPT4gJ29wdGlvbmFsJywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUENMWklQX09QVF9CWV9QUkVHID0+ICdvcHRpb25hbCcsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBDTFpJUF9PUFRfQllfSU5ERVggPT4gJ29wdGlvbmFsJyApKTsNCiAgICAgIGlmICgkdl9yZXN1bHQgIT0gMSkgew0KICAgICAgICAgIHJldHVybiAwOw0KICAgICAgfQ0KICAgIH0NCg0KICAgIC8vIC0tLS0tIE1hZ2ljIHF1b3RlcyB0cmljaw0KICAgICR0aGlzLT5wcml2RGlzYWJsZU1hZ2ljUXVvdGVzKCk7DQoNCiAgICAvLyAtLS0tLSBDYWxsIHRoZSBkZWxldGUgZmN0DQogICAgJHZfbGlzdCA9IGFycmF5KCk7DQogICAgaWYgKCgkdl9yZXN1bHQgPSAkdGhpcy0+cHJpdkRlbGV0ZUJ5UnVsZSgkdl9saXN0LCAkdl9vcHRpb25zKSkgIT0gMSkgew0KICAgICAgJHRoaXMtPnByaXZTd2FwQmFja01hZ2ljUXVvdGVzKCk7DQogICAgICB1bnNldCgkdl9saXN0KTsNCiAgICAgIHJldHVybigwKTsNCiAgICB9DQoNCiAgICAvLyAtLS0tLSBNYWdpYyBxdW90ZXMgdHJpY2sNCiAgICAkdGhpcy0+cHJpdlN3YXBCYWNrTWFnaWNRdW90ZXMoKTsNCg0KICAgIC8vIC0tLS0tIFJldHVybg0KICAgIHJldHVybiAkdl9saXN0Ow0KICB9DQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAgLy8gRnVuY3Rpb24gOiBkZWxldGVCeUluZGV4KCkNCiAgLy8gRGVzY3JpcHRpb24gOg0KICAvLyAgICoqKioqIERlcHJlY2F0ZWQgKioqKioNCiAgLy8gICBkZWxldGUoUENMWklQX09QVF9CWV9JTkRFWCwgJHBfaW5kZXgpIHNob3VsZCBiZSBwcmVmZXJlZC4NCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAgZnVuY3Rpb24gZGVsZXRlQnlJbmRleCgkcF9pbmRleCkNCiAgew0KICAgIA0KICAgICRwX2xpc3QgPSAkdGhpcy0+ZGVsZXRlKFBDTFpJUF9PUFRfQllfSU5ERVgsICRwX2luZGV4KTsNCg0KICAgIC8vIC0tLS0tIFJldHVybg0KICAgIHJldHVybiAkcF9saXN0Ow0KICB9DQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAgLy8gRnVuY3Rpb24gOiBwcm9wZXJ0aWVzKCkNCiAgLy8gRGVzY3JpcHRpb24gOg0KICAvLyAgIFRoaXMgbWV0aG9kIGdpdmVzIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBhcmNoaXZlLg0KICAvLyAgIFRoZSBwcm9wZXJ0aWVzIGFyZSA6DQogIC8vICAgICBuYiA6IE51bWJlciBvZiBmaWxlcyBpbiB0aGUgYXJjaGl2ZQ0KICAvLyAgICAgY29tbWVudCA6IENvbW1lbnQgYXNzb2NpYXRlZCB3aXRoIHRoZSBhcmNoaXZlIGZpbGUNCiAgLy8gICAgIHN0YXR1cyA6IG5vdF9leGlzdCwgb2sNCiAgLy8gUGFyYW1ldGVycyA6DQogIC8vICAgTm9uZQ0KICAvLyBSZXR1cm4gVmFsdWVzIDoNCiAgLy8gICAwIG9uIGZhaWx1cmUsDQogIC8vICAgQW4gYXJyYXkgd2l0aCB0aGUgYXJjaGl2ZSBwcm9wZXJ0aWVzLg0KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICBmdW5jdGlvbiBwcm9wZXJ0aWVzKCkNCiAgew0KDQogICAgLy8gLS0tLS0gUmVzZXQgdGhlIGVycm9yIGhhbmRsZXINCiAgICAkdGhpcy0+cHJpdkVycm9yUmVzZXQoKTsNCg0KICAgIC8vIC0tLS0tIE1hZ2ljIHF1b3RlcyB0cmljaw0KICAgICR0aGlzLT5wcml2RGlzYWJsZU1hZ2ljUXVvdGVzKCk7DQoNCiAgICAvLyAtLS0tLSBDaGVjayBhcmNoaXZlDQogICAgaWYgKCEkdGhpcy0+cHJpdkNoZWNrRm9ybWF0KCkpIHsNCiAgICAgICR0aGlzLT5wcml2U3dhcEJhY2tNYWdpY1F1b3RlcygpOw0KICAgICAgcmV0dXJuKDApOw0KICAgIH0NCg0KICAgIC8vIC0tLS0tIERlZmF1bHQgcHJvcGVydGllcw0KICAgICR2X3Byb3AgPSBhcnJheSgpOw0KICAgICR2X3Byb3BbJ2NvbW1lbnQnXSA9ICcnOw0KICAgICR2X3Byb3BbJ25iJ10gPSAwOw0KICAgICR2X3Byb3BbJ3N0YXR1cyddID0gJ25vdF9leGlzdCc7DQoNCiAgICAvLyAtLS0tLSBMb29rIGlmIGZpbGUgZXhpc3RzDQogICAgaWYgKEBpc19maWxlKCR0aGlzLT56aXBuYW1lKSkNCiAgICB7DQogICAgICAvLyAtLS0tLSBPcGVuIHRoZSB6aXAgZmlsZQ0KICAgICAgaWYgKCgkdGhpcy0+emlwX2ZkID0gQGZvcGVuKCR0aGlzLT56aXBuYW1lLCAncmInKSkgPT0gMCkNCiAgICAgIHsNCiAgICAgICAgJHRoaXMtPnByaXZTd2FwQmFja01hZ2ljUXVvdGVzKCk7DQogICAgICAgIA0KICAgICAgICAvLyAtLS0tLSBFcnJvciBsb2cNCiAgICAgICAgUGNsWmlwOjpwcml2RXJyb3JMb2coUENMWklQX0VSUl9SRUFEX09QRU5fRkFJTCwgJ1VuYWJsZSB0byBvcGVuIGFyY2hpdmUgXCcnLiR0aGlzLT56aXBuYW1lLidcJyBpbiBiaW5hcnkgcmVhZCBtb2RlJyk7DQoNCiAgICAgICAgLy8gLS0tLS0gUmV0dXJuDQogICAgICAgIHJldHVybiAwOw0KICAgICAgfQ0KDQogICAgICAvLyAtLS0tLSBSZWFkIHRoZSBjZW50cmFsIGRpcmVjdG9yeSBpbmZvcm1hdGlvbnMNCiAgICAgICR2X2NlbnRyYWxfZGlyID0gYXJyYXkoKTsNCiAgICAgIGlmICgoJHZfcmVzdWx0ID0gJHRoaXMtPnByaXZSZWFkRW5kQ2VudHJhbERpcigkdl9jZW50cmFsX2RpcikpICE9IDEpDQogICAgICB7DQogICAgICAgICR0aGlzLT5wcml2U3dhcEJhY2tNYWdpY1F1b3RlcygpOw0KICAgICAgICByZXR1cm4gMDsNCiAgICAgIH0NCg0KICAgICAgLy8gLS0tLS0gQ2xvc2UgdGhlIHppcCBmaWxlDQogICAgICAkdGhpcy0+cHJpdkNsb3NlRmQoKTsNCg0KICAgICAgLy8gLS0tLS0gU2V0IHRoZSB1c2VyIGF0dHJpYnV0ZXMNCiAgICAgICR2X3Byb3BbJ2NvbW1lbnQnXSA9ICR2X2NlbnRyYWxfZGlyWydjb21tZW50J107DQogICAgICAkdl9wcm9wWyduYiddID0gJHZfY2VudHJhbF9kaXJbJ2VudHJpZXMnXTsNCiAgICAgICR2X3Byb3BbJ3N0YXR1cyddID0gJ29rJzsNCiAgICB9DQoNCiAgICAvLyAtLS0tLSBNYWdpYyBxdW90ZXMgdHJpY2sNCiAgICAkdGhpcy0+cHJpdlN3YXBCYWNrTWFnaWNRdW90ZXMoKTsNCg0KICAgIC8vIC0tLS0tIFJldHVybg0KICAgIHJldHVybiAkdl9wcm9wOw0KICB9DQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAgLy8gRnVuY3Rpb24gOiBkdXBsaWNhdGUoKQ0KICAvLyBEZXNjcmlwdGlvbiA6DQogIC8vICAgVGhpcyBtZXRob2QgY3JlYXRlcyBhbiBhcmNoaXZlIGJ5IGNvcHlpbmcgdGhlIGNvbnRlbnQgb2YgYW4gb3RoZXIgb25lLiBJZg0KICAvLyAgIHRoZSBhcmNoaXZlIGFscmVhZHkgZXhpc3QsIGl0IGlzIHJlcGxhY2VkIGJ5IHRoZSBuZXcgb25lIHdpdGhvdXQgYW55IHdhcm5pbmcuDQogIC8vIFBhcmFtZXRlcnMgOg0KICAvLyAgICRwX2FyY2hpdmUgOiBUaGUgZmlsZW5hbWUgb2YgYSB2YWxpZCBhcmNoaXZlLCBvcg0KICAvLyAgICAgICAgICAgICAgICBhIHZhbGlkIFBjbFppcCBvYmplY3QuDQogIC8vIFJldHVybiBWYWx1ZXMgOg0KICAvLyAgIDEgb24gc3VjY2Vzcy4NCiAgLy8gICAwIG9yIGEgbmVnYXRpdmUgdmFsdWUgb24gZXJyb3IgKGVycm9yIGNvZGUpLg0KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICBmdW5jdGlvbiBkdXBsaWNhdGUoJHBfYXJjaGl2ZSkNCiAgew0KICAgICR2X3Jlc3VsdCA9IDE7DQoNCiAgICAvLyAtLS0tLSBSZXNldCB0aGUgZXJyb3IgaGFuZGxlcg0KICAgICR0aGlzLT5wcml2RXJyb3JSZXNldCgpOw0KDQogICAgLy8gLS0tLS0gTG9vayBpZiB0aGUgJHBfYXJjaGl2ZSBpcyBhIFBjbFppcCBvYmplY3QNCiAgICBpZiAoKGlzX29iamVjdCgkcF9hcmNoaXZlKSkgJiYgKGdldF9jbGFzcygkcF9hcmNoaXZlKSA9PSAncGNsemlwJykpDQogICAgew0KDQogICAgICAvLyAtLS0tLSBEdXBsaWNhdGUgdGhlIGFyY2hpdmUNCiAgICAgICR2X3Jlc3VsdCA9ICR0aGlzLT5wcml2RHVwbGljYXRlKCRwX2FyY2hpdmUtPnppcG5hbWUpOw0KICAgIH0NCg0KICAgIC8vIC0tLS0tIExvb2sgaWYgdGhlICRwX2FyY2hpdmUgaXMgYSBzdHJpbmcgKHNvIGEgZmlsZW5hbWUpDQogICAgZWxzZSBpZiAoaXNfc3RyaW5nKCRwX2FyY2hpdmUpKQ0KICAgIHsNCg0KICAgICAgLy8gLS0tLS0gQ2hlY2sgdGhhdCAkcF9hcmNoaXZlIGlzIGEgdmFsaWQgemlwIGZpbGUNCiAgICAgIC8vIFRCQyA6IFNob3VsZCBhbHNvIGNoZWNrIHRoZSBhcmNoaXZlIGZvcm1hdA0KICAgICAgaWYgKCFpc19maWxlKCRwX2FyY2hpdmUpKSB7DQogICAgICAgIC8vIC0tLS0tIEVycm9yIGxvZw0KICAgICAgICBQY2xaaXA6OnByaXZFcnJvckxvZyhQQ0xaSVBfRVJSX01JU1NJTkdfRklMRSwgIk5vIGZpbGUgd2l0aCBmaWxlbmFtZSAnIi4kcF9hcmNoaXZlLiInIik7DQogICAgICAgICR2X3Jlc3VsdCA9IFBDTFpJUF9FUlJfTUlTU0lOR19GSUxFOw0KICAgICAgfQ0KICAgICAgZWxzZSB7DQogICAgICAgIC8vIC0tLS0tIER1cGxpY2F0ZSB0aGUgYXJjaGl2ZQ0KICAgICAgICAkdl9yZXN1bHQgPSAkdGhpcy0+cHJpdkR1cGxpY2F0ZSgkcF9hcmNoaXZlKTsNCiAgICAgIH0NCiAgICB9DQoNCiAgICAvLyAtLS0tLSBJbnZhbGlkIHZhcmlhYmxlDQogICAgZWxzZQ0KICAgIHsNCiAgICAgIC8vIC0tLS0tIEVycm9yIGxvZw0KICAgICAgUGNsWmlwOjpwcml2RXJyb3JMb2coUENMWklQX0VSUl9JTlZBTElEX1BBUkFNRVRFUiwgIkludmFsaWQgdmFyaWFibGUgdHlwZSBwX2FyY2hpdmVfdG9fYWRkIik7DQogICAgICAkdl9yZXN1bHQgPSBQQ0xaSVBfRVJSX0lOVkFMSURfUEFSQU1FVEVSOw0KICAgIH0NCg0KICAgIC8vIC0tLS0tIFJldHVybg0KICAgIHJldHVybiAkdl9yZXN1bHQ7DQogIH0NCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICAvLyBGdW5jdGlvbiA6IG1lcmdlKCkNCiAgLy8gRGVzY3JpcHRpb24gOg0KICAvLyAgIFRoaXMgbWV0aG9kIG1lcmdlIHRoZSAkcF9hcmNoaXZlX3RvX2FkZCBhcmNoaXZlIGF0IHRoZSBlbmQgb2YgdGhlIGN1cnJlbnQNCiAgLy8gICBvbmUgKCR0aGlzKS4NCiAgLy8gICBJZiB0aGUgYXJjaGl2ZSAoJHRoaXMpIGRvZXMgbm90IGV4aXN0LCB0aGUgbWVyZ2UgYmVjb21lcyBhIGR1cGxpY2F0ZS4NCiAgLy8gICBJZiB0aGUgJHBfYXJjaGl2ZV90b19hZGQgYXJjaGl2ZSBkb2VzIG5vdCBleGlzdCwgdGhlIG1lcmdlIGlzIGEgc3VjY2Vzcy4NCiAgLy8gUGFyYW1ldGVycyA6DQogIC8vICAgJHBfYXJjaGl2ZV90b19hZGQgOiBJdCBjYW4gYmUgZGlyZWN0bHkgdGhlIGZpbGVuYW1lIG9mIGEgdmFsaWQgemlwIGFyY2hpdmUsDQogIC8vICAgICAgICAgICAgICAgICAgICAgICBvciBhIFBjbFppcCBvYmplY3QgYXJjaGl2ZS4NCiAgLy8gUmV0dXJuIFZhbHVlcyA6DQogIC8vICAgMSBvbiBzdWNjZXNzLA0KICAvLyAgIDAgb3IgbmVnYXRpdmUgdmFsdWVzIG9uIGVycm9yIChzZWUgYmVsb3cpLg0KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICBmdW5jdGlvbiBtZXJnZSgkcF9hcmNoaXZlX3RvX2FkZCkNCiAgew0KICAgICR2X3Jlc3VsdCA9IDE7DQoNCiAgICAvLyAtLS0tLSBSZXNldCB0aGUgZXJyb3IgaGFuZGxlcg0KICAgICR0aGlzLT5wcml2RXJyb3JSZXNldCgpOw0KDQogICAgLy8gLS0tLS0gQ2hlY2sgYXJjaGl2ZQ0KICAgIGlmICghJHRoaXMtPnByaXZDaGVja0Zvcm1hdCgpKSB7DQogICAgICByZXR1cm4oMCk7DQogICAgfQ0KDQogICAgLy8gLS0tLS0gTG9vayBpZiB0aGUgJHBfYXJjaGl2ZV90b19hZGQgaXMgYSBQY2xaaXAgb2JqZWN0DQogICAgaWYgKChpc19vYmplY3QoJHBfYXJjaGl2ZV90b19hZGQpKSAmJiAoZ2V0X2NsYXNzKCRwX2FyY2hpdmVfdG9fYWRkKSA9PSAncGNsemlwJykpDQogICAgew0KDQogICAgICAvLyAtLS0tLSBNZXJnZSB0aGUgYXJjaGl2ZQ0KICAgICAgJHZfcmVzdWx0ID0gJHRoaXMtPnByaXZNZXJnZSgkcF9hcmNoaXZlX3RvX2FkZCk7DQogICAgfQ0KDQogICAgLy8gLS0tLS0gTG9vayBpZiB0aGUgJHBfYXJjaGl2ZV90b19hZGQgaXMgYSBzdHJpbmcgKHNvIGEgZmlsZW5hbWUpDQogICAgZWxzZSBpZiAoaXNfc3RyaW5nKCRwX2FyY2hpdmVfdG9fYWRkKSkNCiAgICB7DQoNCiAgICAgIC8vIC0tLS0tIENyZWF0ZSBhIHRlbXBvcmFyeSBhcmNoaXZlDQogICAgICAkdl9vYmplY3RfYXJjaGl2ZSA9IG5ldyBQY2xaaXAoJHBfYXJjaGl2ZV90b19hZGQpOw0KDQogICAgICAvLyAtLS0tLSBNZXJnZSB0aGUgYXJjaGl2ZQ0KICAgICAgJHZfcmVzdWx0ID0gJHRoaXMtPnByaXZNZXJnZSgkdl9vYmplY3RfYXJjaGl2ZSk7DQogICAgfQ0KDQogICAgLy8gLS0tLS0gSW52YWxpZCB2YXJpYWJsZQ0KICAgIGVsc2UNCiAgICB7DQogICAgICAvLyAtLS0tLSBFcnJvciBsb2cNCiAgICAgIFBjbFppcDo6cHJpdkVycm9yTG9nKFBDTFpJUF9FUlJfSU5WQUxJRF9QQVJBTUVURVIsICJJbnZhbGlkIHZhcmlhYmxlIHR5cGUgcF9hcmNoaXZlX3RvX2FkZCIpOw0KICAgICAgJHZfcmVzdWx0ID0gUENMWklQX0VSUl9JTlZBTElEX1BBUkFNRVRFUjsNCiAgICB9DQoNCiAgICAvLyAtLS0tLSBSZXR1cm4NCiAgICByZXR1cm4gJHZfcmVzdWx0Ow0KICB9DQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCg0KDQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogIC8vIEZ1bmN0aW9uIDogZXJyb3JDb2RlKCkNCiAgLy8gRGVzY3JpcHRpb24gOg0KICAvLyBQYXJhbWV0ZXJzIDoNCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAgZnVuY3Rpb24gZXJyb3JDb2RlKCkNCiAgew0KICAgIGlmIChQQ0xaSVBfRVJST1JfRVhURVJOQUwgPT0gMSkgew0KICAgICAgcmV0dXJuKFBjbEVycm9yQ29kZSgpKTsNCiAgICB9DQogICAgZWxzZSB7DQogICAgICByZXR1cm4oJHRoaXMtPmVycm9yX2NvZGUpOw0KICAgIH0NCiAgfQ0KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogIC8vIEZ1bmN0aW9uIDogZXJyb3JOYW1lKCkNCiAgLy8gRGVzY3JpcHRpb24gOg0KICAvLyBQYXJhbWV0ZXJzIDoNCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAgZnVuY3Rpb24gZXJyb3JOYW1lKCRwX3dpdGhfY29kZT1mYWxzZSkNCiAgew0KICAgICR2X25hbWUgPSBhcnJheSAoIFBDTFpJUF9FUlJfTk9fRVJST1IgPT4gJ1BDTFpJUF9FUlJfTk9fRVJST1InLA0KICAgICAgICAgICAgICAgICAgICAgIFBDTFpJUF9FUlJfV1JJVEVfT1BFTl9GQUlMID0+ICdQQ0xaSVBfRVJSX1dSSVRFX09QRU5fRkFJTCcsDQogICAgICAgICAgICAgICAgICAgICAgUENMWklQX0VSUl9SRUFEX09QRU5fRkFJTCA9PiAnUENMWklQX0VSUl9SRUFEX09QRU5fRkFJTCcsDQogICAgICAgICAgICAgICAgICAgICAgUENMWklQX0VSUl9JTlZBTElEX1BBUkFNRVRFUiA9PiAnUENMWklQX0VSUl9JTlZBTElEX1BBUkFNRVRFUicsDQogICAgICAgICAgICAgICAgICAgICAgUENMWklQX0VSUl9NSVNTSU5HX0ZJTEUgPT4gJ1BDTFpJUF9FUlJfTUlTU0lOR19GSUxFJywNCiAgICAgICAgICAgICAgICAgICAgICBQQ0xaSVBfRVJSX0ZJTEVOQU1FX1RPT19MT05HID0+ICdQQ0xaSVBfRVJSX0ZJTEVOQU1FX1RPT19MT05HJywNCiAgICAgICAgICAgICAgICAgICAgICBQQ0xaSVBfRVJSX0lOVkFMSURfWklQID0+ICdQQ0xaSVBfRVJSX0lOVkFMSURfWklQJywNCiAgICAgICAgICAgICAgICAgICAgICBQQ0xaSVBfRVJSX0JBRF9FWFRSQUNURURfRklMRSA9PiAnUENMWklQX0VSUl9CQURfRVhUUkFDVEVEX0ZJTEUnLA0KICAgICAgICAgICAgICAgICAgICAgIFBDTFpJUF9FUlJfRElSX0NSRUFURV9GQUlMID0+ICdQQ0xaSVBfRVJSX0RJUl9DUkVBVEVfRkFJTCcsDQogICAgICAgICAgICAgICAgICAgICAgUENMWklQX0VSUl9CQURfRVhURU5TSU9OID0+ICdQQ0xaSVBfRVJSX0JBRF9FWFRFTlNJT04nLA0KICAgICAgICAgICAgICAgICAgICAgIFBDTFpJUF9FUlJfQkFEX0ZPUk1BVCA9PiAnUENMWklQX0VSUl9CQURfRk9STUFUJywNCiAgICAgICAgICAgICAgICAgICAgICBQQ0xaSVBfRVJSX0RFTEVURV9GSUxFX0ZBSUwgPT4gJ1BDTFpJUF9FUlJfREVMRVRFX0ZJTEVfRkFJTCcsDQogICAgICAgICAgICAgICAgICAgICAgUENMWklQX0VSUl9SRU5BTUVfRklMRV9GQUlMID0+ICdQQ0xaSVBfRVJSX1JFTkFNRV9GSUxFX0ZBSUwnLA0KICAgICAgICAgICAgICAgICAgICAgIFBDTFpJUF9FUlJfQkFEX0NIRUNLU1VNID0+ICdQQ0xaSVBfRVJSX0JBRF9DSEVDS1NVTScsDQogICAgICAgICAgICAgICAgICAgICAgUENMWklQX0VSUl9JTlZBTElEX0FSQ0hJVkVfWklQID0+ICdQQ0xaSVBfRVJSX0lOVkFMSURfQVJDSElWRV9aSVAnLA0KICAgICAgICAgICAgICAgICAgICAgIFBDTFpJUF9FUlJfTUlTU0lOR19PUFRJT05fVkFMVUUgPT4gJ1BDTFpJUF9FUlJfTUlTU0lOR19PUFRJT05fVkFMVUUnLA0KICAgICAgICAgICAgICAgICAgICAgIFBDTFpJUF9FUlJfSU5WQUxJRF9PUFRJT05fVkFMVUUgPT4gJ1BDTFpJUF9FUlJfSU5WQUxJRF9PUFRJT05fVkFMVUUnLA0KICAgICAgICAgICAgICAgICAgICAgIFBDTFpJUF9FUlJfVU5TVVBQT1JURURfQ09NUFJFU1NJT04gPT4gJ1BDTFpJUF9FUlJfVU5TVVBQT1JURURfQ09NUFJFU1NJT04nLA0KICAgICAgICAgICAgICAgICAgICAgIFBDTFpJUF9FUlJfVU5TVVBQT1JURURfRU5DUllQVElPTiA9PiAnUENMWklQX0VSUl9VTlNVUFBPUlRFRF9FTkNSWVBUSU9OJw0KICAgICAgICAgICAgICAgICAgICAgICxQQ0xaSVBfRVJSX0lOVkFMSURfQVRUUklCVVRFX1ZBTFVFID0+ICdQQ0xaSVBfRVJSX0lOVkFMSURfQVRUUklCVVRFX1ZBTFVFJw0KICAgICAgICAgICAgICAgICAgICAgICxQQ0xaSVBfRVJSX0RJUkVDVE9SWV9SRVNUUklDVElPTiA9PiAnUENMWklQX0VSUl9ESVJFQ1RPUllfUkVTVFJJQ1RJT04nDQogICAgICAgICAgICAgICAgICAgICk7DQoNCiAgICBpZiAoaXNzZXQoJHZfbmFtZVskdGhpcy0+ZXJyb3JfY29kZV0pKSB7DQogICAgICAkdl92YWx1ZSA9ICR2X25hbWVbJHRoaXMtPmVycm9yX2NvZGVdOw0KICAgIH0NCiAgICBlbHNlIHsNCiAgICAgICR2X3ZhbHVlID0gJ05vTmFtZSc7DQogICAgfQ0KDQogICAgaWYgKCRwX3dpdGhfY29kZSkgew0KICAgICAgcmV0dXJuKCR2X3ZhbHVlLicgKCcuJHRoaXMtPmVycm9yX2NvZGUuJyknKTsNCiAgICB9DQogICAgZWxzZSB7DQogICAgICByZXR1cm4oJHZfdmFsdWUpOw0KICAgIH0NCiAgfQ0KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogIC8vIEZ1bmN0aW9uIDogZXJyb3JJbmZvKCkNCiAgLy8gRGVzY3JpcHRpb24gOg0KICAvLyBQYXJhbWV0ZXJzIDoNCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAgZnVuY3Rpb24gZXJyb3JJbmZvKCRwX2Z1bGw9ZmFsc2UpDQogIHsNCiAgICBpZiAoUENMWklQX0VSUk9SX0VYVEVSTkFMID09IDEpIHsNCiAgICAgIHJldHVybihQY2xFcnJvclN0cmluZygpKTsNCiAgICB9DQogICAgZWxzZSB7DQogICAgICBpZiAoJHBfZnVsbCkgew0KICAgICAgICByZXR1cm4oJHRoaXMtPmVycm9yTmFtZSh0cnVlKS4iIDogIi4kdGhpcy0+ZXJyb3Jfc3RyaW5nKTsNCiAgICAgIH0NCiAgICAgIGVsc2Ugew0KICAgICAgICByZXR1cm4oJHRoaXMtPmVycm9yX3N0cmluZy4iIFtjb2RlICIuJHRoaXMtPmVycm9yX2NvZGUuIl0iKTsNCiAgICAgIH0NCiAgICB9DQogIH0NCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KDQovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8gKioqKiogVU5ERVIgVEhJUyBMSU5FIEFSRSBERUZJTkVEIFBSSVZBVEUgSU5URVJOQUwgRlVOQ1RJT05TICoqKioqDQovLyAqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioNCi8vICoqKioqICAgICAgIFRIRVNFUyBGVU5DVElPTlMgTVVTVCBOT1QgQkUgVVNFRCBESVJFQ1RMWSAgICAgICAqKioqKg0KLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KDQoNCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAgLy8gRnVuY3Rpb24gOiBwcml2Q2hlY2tGb3JtYXQoKQ0KICAvLyBEZXNjcmlwdGlvbiA6DQogIC8vICAgVGhpcyBtZXRob2QgY2hlY2sgdGhhdCB0aGUgYXJjaGl2ZSBleGlzdHMgYW5kIGlzIGEgdmFsaWQgemlwIGFyY2hpdmUuDQogIC8vICAgU2V2ZXJhbCBsZXZlbCBvZiBjaGVjayBleGlzdHMuIChmdXR1cikNCiAgLy8gUGFyYW1ldGVycyA6DQogIC8vICAgJHBfbGV2ZWwgOiBMZXZlbCBvZiBjaGVjay4gRGVmYXVsdCAwLg0KICAvLyAgICAgICAgICAgICAgMCA6IENoZWNrIHRoZSBmaXJzdCBieXRlcyAobWFnaWMgY29kZXMpIChkZWZhdWx0IHZhbHVlKSkNCiAgLy8gICAgICAgICAgICAgIDEgOiAwICsgQ2hlY2sgdGhlIGNlbnRyYWwgZGlyZWN0b3J5IChmdXR1cikNCiAgLy8gICAgICAgICAgICAgIDIgOiAxICsgQ2hlY2sgZWFjaCBmaWxlIGhlYWRlciAoZnV0dXIpDQogIC8vIFJldHVybiBWYWx1ZXMgOg0KICAvLyAgIHRydWUgb24gc3VjY2VzcywNCiAgLy8gICBmYWxzZSBvbiBlcnJvciwgdGhlIGVycm9yIGNvZGUgaXMgc2V0Lg0KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICBmdW5jdGlvbiBwcml2Q2hlY2tGb3JtYXQoJHBfbGV2ZWw9MCkNCiAgew0KICAgICR2X3Jlc3VsdCA9IHRydWU7DQoNCgkvLyAtLS0tLSBSZXNldCB0aGUgZmlsZSBzeXN0ZW0gY2FjaGUNCiAgICBjbGVhcnN0YXRjYWNoZSgpOw0KDQogICAgLy8gLS0tLS0gUmVzZXQgdGhlIGVycm9yIGhhbmRsZXINCiAgICAkdGhpcy0+cHJpdkVycm9yUmVzZXQoKTsNCg0KICAgIC8vIC0tLS0tIExvb2sgaWYgdGhlIGZpbGUgZXhpdHMNCiAgICBpZiAoIWlzX2ZpbGUoJHRoaXMtPnppcG5hbWUpKSB7DQogICAgICAvLyAtLS0tLSBFcnJvciBsb2cNCiAgICAgIFBjbFppcDo6cHJpdkVycm9yTG9nKFBDTFpJUF9FUlJfTUlTU0lOR19GSUxFLCAiTWlzc2luZyBhcmNoaXZlIGZpbGUgJyIuJHRoaXMtPnppcG5hbWUuIiciKTsNCiAgICAgIHJldHVybihmYWxzZSk7DQogICAgfQ0KDQogICAgLy8gLS0tLS0gQ2hlY2sgdGhhdCB0aGUgZmlsZSBpcyByZWFkZWFibGUNCiAgICBpZiAoIWlzX3JlYWRhYmxlKCR0aGlzLT56aXBuYW1lKSkgew0KICAgICAgLy8gLS0tLS0gRXJyb3IgbG9nDQogICAgICBQY2xaaXA6OnByaXZFcnJvckxvZyhQQ0xaSVBfRVJSX1JFQURfT1BFTl9GQUlMLCAiVW5hYmxlIHRvIHJlYWQgYXJjaGl2ZSAnIi4kdGhpcy0+emlwbmFtZS4iJyIpOw0KICAgICAgcmV0dXJuKGZhbHNlKTsNCiAgICB9DQoNCiAgICAvLyAtLS0tLSBDaGVjayB0aGUgbWFnaWMgY29kZQ0KICAgIC8vIFRCQw0KDQogICAgLy8gLS0tLS0gQ2hlY2sgdGhlIGNlbnRyYWwgaGVhZGVyDQogICAgLy8gVEJDDQoNCiAgICAvLyAtLS0tLSBDaGVjayBlYWNoIGZpbGUgaGVhZGVyDQogICAgLy8gVEJDDQoNCiAgICAvLyAtLS0tLSBSZXR1cm4NCiAgICByZXR1cm4gJHZfcmVzdWx0Ow0KICB9DQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAgLy8gRnVuY3Rpb24gOiBwcml2UGFyc2VPcHRpb25zKCkNCiAgLy8gRGVzY3JpcHRpb24gOg0KICAvLyAgIFRoaXMgaW50ZXJuYWwgbWV0aG9kcyByZWFkcyB0aGUgdmFyaWFibGUgbGlzdCBvZiBhcmd1bWVudHMgKCRwX29wdGlvbnNfbGlzdCwNCiAgLy8gICAkcF9zaXplKSBhbmQgZ2VuZXJhdGUgYW4gYXJyYXkgd2l0aCB0aGUgb3B0aW9ucyBhbmQgdmFsdWVzICgkdl9yZXN1bHRfbGlzdCkuDQogIC8vICAgJHZfcmVxdWVzdGVkX29wdGlvbnMgY29udGFpbnMgdGhlIG9wdGlvbnMgdGhhdCBjYW4gYmUgcHJlc2VudCBhbmQgdGhvc2UgdGhhdA0KICAvLyAgIG11c3QgYmUgcHJlc2VudC4NCiAgLy8gICAkdl9yZXF1ZXN0ZWRfb3B0aW9ucyBpcyBhbiBhcnJheSwgd2l0aCB0aGUgb3B0aW9uIHZhbHVlIGFzIGtleSwgYW5kICdvcHRpb25hbCcsDQogIC8vICAgb3IgJ21hbmRhdG9yeScgYXMgdmFsdWUuDQogIC8vIFBhcmFtZXRlcnMgOg0KICAvLyAgIFNlZSBhYm92ZS4NCiAgLy8gUmV0dXJuIFZhbHVlcyA6DQogIC8vICAgMSBvbiBzdWNjZXNzLg0KICAvLyAgIDAgb24gZmFpbHVyZS4NCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAgZnVuY3Rpb24gcHJpdlBhcnNlT3B0aW9ucygmJHBfb3B0aW9uc19saXN0LCAkcF9zaXplLCAmJHZfcmVzdWx0X2xpc3QsICR2X3JlcXVlc3RlZF9vcHRpb25zPWZhbHNlKQ0KICB7DQogICAgJHZfcmVzdWx0PTE7DQogICAgDQogICAgLy8gLS0tLS0gUmVhZCB0aGUgb3B0aW9ucw0KICAgICRpPTA7DQogICAgd2hpbGUgKCRpPCRwX3NpemUpIHsNCg0KICAgICAgLy8gLS0tLS0gQ2hlY2sgaWYgdGhlIG9wdGlvbiBpcyBzdXBwb3J0ZWQNCiAgICAgIGlmICghaXNzZXQoJHZfcmVxdWVzdGVkX29wdGlvbnNbJHBfb3B0aW9uc19saXN0WyRpXV0pKSB7DQogICAgICAgIC8vIC0tLS0tIEVycm9yIGxvZw0KICAgICAgICBQY2xaaXA6OnByaXZFcnJvckxvZyhQQ0xaSVBfRVJSX0lOVkFMSURfUEFSQU1FVEVSLCAiSW52YWxpZCBvcHRpb25hbCBwYXJhbWV0ZXIgJyIuJHBfb3B0aW9uc19saXN0WyRpXS4iJyBmb3IgdGhpcyBtZXRob2QiKTsNCg0KICAgICAgICAvLyAtLS0tLSBSZXR1cm4NCiAgICAgICAgcmV0dXJuIFBjbFppcDo6ZXJyb3JDb2RlKCk7DQogICAgICB9DQoNCiAgICAgIC8vIC0tLS0tIExvb2sgZm9yIG5leHQgb3B0aW9uDQogICAgICBzd2l0Y2ggKCRwX29wdGlvbnNfbGlzdFskaV0pIHsNCiAgICAgICAgLy8gLS0tLS0gTG9vayBmb3Igb3B0aW9ucyB0aGF0IHJlcXVlc3QgYSBwYXRoIHZhbHVlDQogICAgICAgIGNhc2UgUENMWklQX09QVF9QQVRIIDoNCiAgICAgICAgY2FzZSBQQ0xaSVBfT1BUX1JFTU9WRV9QQVRIIDoNCiAgICAgICAgY2FzZSBQQ0xaSVBfT1BUX0FERF9QQVRIIDoNCiAgICAgICAgICAvLyAtLS0tLSBDaGVjayB0aGUgbnVtYmVyIG9mIHBhcmFtZXRlcnMNCiAgICAgICAgICBpZiAoKCRpKzEpID49ICRwX3NpemUpIHsNCiAgICAgICAgICAgIC8vIC0tLS0tIEVycm9yIGxvZw0KICAgICAgICAgICAgUGNsWmlwOjpwcml2RXJyb3JMb2coUENMWklQX0VSUl9NSVNTSU5HX09QVElPTl9WQUxVRSwgIk1pc3NpbmcgcGFyYW1ldGVyIHZhbHVlIGZvciBvcHRpb24gJyIuUGNsWmlwVXRpbE9wdGlvblRleHQoJHBfb3B0aW9uc19saXN0WyRpXSkuIiciKTsNCg0KICAgICAgICAgICAgLy8gLS0tLS0gUmV0dXJuDQogICAgICAgICAgICByZXR1cm4gUGNsWmlwOjplcnJvckNvZGUoKTsNCiAgICAgICAgICB9DQoNCiAgICAgICAgICAvLyAtLS0tLSBHZXQgdGhlIHZhbHVlDQogICAgICAgICAgJHZfcmVzdWx0X2xpc3RbJHBfb3B0aW9uc19saXN0WyRpXV0gPSBQY2xaaXBVdGlsVHJhbnNsYXRlV2luUGF0aCgkcF9vcHRpb25zX2xpc3RbJGkrMV0sIEZBTFNFKTsNCiAgICAgICAgICAkaSsrOw0KICAgICAgICBicmVhazsNCg0KICAgICAgICBjYXNlIFBDTFpJUF9PUFRfVEVNUF9GSUxFX1RIUkVTSE9MRCA6DQogICAgICAgICAgLy8gLS0tLS0gQ2hlY2sgdGhlIG51bWJlciBvZiBwYXJhbWV0ZXJzDQogICAgICAgICAgaWYgKCgkaSsxKSA+PSAkcF9zaXplKSB7DQogICAgICAgICAgICBQY2xaaXA6OnByaXZFcnJvckxvZyhQQ0xaSVBfRVJSX01JU1NJTkdfT1BUSU9OX1ZBTFVFLCAiTWlzc2luZyBwYXJhbWV0ZXIgdmFsdWUgZm9yIG9wdGlvbiAnIi5QY2xaaXBVdGlsT3B0aW9uVGV4dCgkcF9vcHRpb25zX2xpc3RbJGldKS4iJyIpOw0KICAgICAgICAgICAgcmV0dXJuIFBjbFppcDo6ZXJyb3JDb2RlKCk7DQogICAgICAgICAgfQ0KICAgICAgICAgIA0KICAgICAgICAgIC8vIC0tLS0tIENoZWNrIGZvciBpbmNvbXBhdGlibGUgb3B0aW9ucw0KICAgICAgICAgIGlmIChpc3NldCgkdl9yZXN1bHRfbGlzdFtQQ0xaSVBfT1BUX1RFTVBfRklMRV9PRkZdKSkgew0KICAgICAgICAgICAgUGNsWmlwOjpwcml2RXJyb3JMb2coUENMWklQX0VSUl9JTlZBTElEX1BBUkFNRVRFUiwgIk9wdGlvbiAnIi5QY2xaaXBVdGlsT3B0aW9uVGV4dCgkcF9vcHRpb25zX2xpc3RbJGldKS4iJyBjYW4gbm90IGJlIHVzZWQgd2l0aCBvcHRpb24gJ1BDTFpJUF9PUFRfVEVNUF9GSUxFX09GRiciKTsNCiAgICAgICAgICAgIHJldHVybiBQY2xaaXA6OmVycm9yQ29kZSgpOw0KICAgICAgICAgIH0NCiAgICAgICAgICANCiAgICAgICAgICAvLyAtLS0tLSBDaGVjayB0aGUgdmFsdWUNCiAgICAgICAgICAkdl92YWx1ZSA9ICRwX29wdGlvbnNfbGlzdFskaSsxXTsNCiAgICAgICAgICBpZiAoKCFpc19pbnRlZ2VyKCR2X3ZhbHVlKSkgfHwgKCR2X3ZhbHVlPDApKSB7DQogICAgICAgICAgICBQY2xaaXA6OnByaXZFcnJvckxvZyhQQ0xaSVBfRVJSX0lOVkFMSURfT1BUSU9OX1ZBTFVFLCAiSW50ZWdlciBleHBlY3RlZCBmb3Igb3B0aW9uICciLlBjbFppcFV0aWxPcHRpb25UZXh0KCRwX29wdGlvbnNfbGlzdFskaV0pLiInIik7DQogICAgICAgICAgICByZXR1cm4gUGNsWmlwOjplcnJvckNvZGUoKTsNCiAgICAgICAgICB9DQoNCiAgICAgICAgICAvLyAtLS0tLSBHZXQgdGhlIHZhbHVlIChhbmQgY29udmVydCBpdCBpbiBieXRlcykNCiAgICAgICAgICAkdl9yZXN1bHRfbGlzdFskcF9vcHRpb25zX2xpc3RbJGldXSA9ICR2X3ZhbHVlKjEwNDg1NzY7DQogICAgICAgICAgJGkrKzsNCiAgICAgICAgYnJlYWs7DQoNCiAgICAgICAgY2FzZSBQQ0xaSVBfT1BUX1RFTVBfRklMRV9PTiA6DQogICAgICAgICAgLy8gLS0tLS0gQ2hlY2sgZm9yIGluY29tcGF0aWJsZSBvcHRpb25zDQogICAgICAgICAgaWYgKGlzc2V0KCR2X3Jlc3VsdF9saXN0W1BDTFpJUF9PUFRfVEVNUF9GSUxFX09GRl0pKSB7DQogICAgICAgICAgICBQY2xaaXA6OnByaXZFcnJvckxvZyhQQ0xaSVBfRVJSX0lOVkFMSURfUEFSQU1FVEVSLCAiT3B0aW9uICciLlBjbFppcFV0aWxPcHRpb25UZXh0KCRwX29wdGlvbnNfbGlzdFskaV0pLiInIGNhbiBub3QgYmUgdXNlZCB3aXRoIG9wdGlvbiAnUENMWklQX09QVF9URU1QX0ZJTEVfT0ZGJyIpOw0KICAgICAgICAgICAgcmV0dXJuIFBjbFppcDo6ZXJyb3JDb2RlKCk7DQogICAgICAgICAgfQ0KICAgICAgICAgIA0KICAgICAgICAgICR2X3Jlc3VsdF9saXN0WyRwX29wdGlvbnNfbGlzdFskaV1dID0gdHJ1ZTsNCiAgICAgICAgYnJlYWs7DQoNCiAgICAgICAgY2FzZSBQQ0xaSVBfT1BUX1RFTVBfRklMRV9PRkYgOg0KICAgICAgICAgIC8vIC0tLS0tIENoZWNrIGZvciBpbmNvbXBhdGlibGUgb3B0aW9ucw0KICAgICAgICAgIGlmIChpc3NldCgkdl9yZXN1bHRfbGlzdFtQQ0xaSVBfT1BUX1RFTVBfRklMRV9PTl0pKSB7DQogICAgICAgICAgICBQY2xaaXA6OnByaXZFcnJvckxvZyhQQ0xaSVBfRVJSX0lOVkFMSURfUEFSQU1FVEVSLCAiT3B0aW9uICciLlBjbFppcFV0aWxPcHRpb25UZXh0KCRwX29wdGlvbnNfbGlzdFskaV0pLiInIGNhbiBub3QgYmUgdXNlZCB3aXRoIG9wdGlvbiAnUENMWklQX09QVF9URU1QX0ZJTEVfT04nIik7DQogICAgICAgICAgICByZXR1cm4gUGNsWmlwOjplcnJvckNvZGUoKTsNCiAgICAgICAgICB9DQogICAgICAgICAgLy8gLS0tLS0gQ2hlY2sgZm9yIGluY29tcGF0aWJsZSBvcHRpb25zDQogICAgICAgICAgaWYgKGlzc2V0KCR2X3Jlc3VsdF9saXN0W1BDTFpJUF9PUFRfVEVNUF9GSUxFX1RIUkVTSE9MRF0pKSB7DQogICAgICAgICAgICBQY2xaaXA6OnByaXZFcnJvckxvZyhQQ0xaSVBfRVJSX0lOVkFMSURfUEFSQU1FVEVSLCAiT3B0aW9uICciLlBjbFppcFV0aWxPcHRpb25UZXh0KCRwX29wdGlvbnNfbGlzdFskaV0pLiInIGNhbiBub3QgYmUgdXNlZCB3aXRoIG9wdGlvbiAnUENMWklQX09QVF9URU1QX0ZJTEVfVEhSRVNIT0xEJyIpOw0KICAgICAgICAgICAgcmV0dXJuIFBjbFppcDo6ZXJyb3JDb2RlKCk7DQogICAgICAgICAgfQ0KICAgICAgICAgIA0KICAgICAgICAgICR2X3Jlc3VsdF9saXN0WyRwX29wdGlvbnNfbGlzdFskaV1dID0gdHJ1ZTsNCiAgICAgICAgYnJlYWs7DQoNCiAgICAgICAgY2FzZSBQQ0xaSVBfT1BUX0VYVFJBQ1RfRElSX1JFU1RSSUNUSU9OIDoNCiAgICAgICAgICAvLyAtLS0tLSBDaGVjayB0aGUgbnVtYmVyIG9mIHBhcmFtZXRlcnMNCiAgICAgICAgICBpZiAoKCRpKzEpID49ICRwX3NpemUpIHsNCiAgICAgICAgICAgIC8vIC0tLS0tIEVycm9yIGxvZw0KICAgICAgICAgICAgUGNsWmlwOjpwcml2RXJyb3JMb2coUENMWklQX0VSUl9NSVNTSU5HX09QVElPTl9WQUxVRSwgIk1pc3NpbmcgcGFyYW1ldGVyIHZhbHVlIGZvciBvcHRpb24gJyIuUGNsWmlwVXRpbE9wdGlvblRleHQoJHBfb3B0aW9uc19saXN0WyRpXSkuIiciKTsNCg0KICAgICAgICAgICAgLy8gLS0tLS0gUmV0dXJuDQogICAgICAgICAgICByZXR1cm4gUGNsWmlwOjplcnJvckNvZGUoKTsNCiAgICAgICAgICB9DQoNCiAgICAgICAgICAvLyAtLS0tLSBHZXQgdGhlIHZhbHVlDQogICAgICAgICAgaWYgKCAgIGlzX3N0cmluZygkcF9vcHRpb25zX2xpc3RbJGkrMV0pDQogICAgICAgICAgICAgICYmICgkcF9vcHRpb25zX2xpc3RbJGkrMV0gIT0gJycpKSB7DQogICAgICAgICAgICAkdl9yZXN1bHRfbGlzdFskcF9vcHRpb25zX2xpc3RbJGldXSA9IFBjbFppcFV0aWxUcmFuc2xhdGVXaW5QYXRoKCRwX29wdGlvbnNfbGlzdFskaSsxXSwgRkFMU0UpOw0KICAgICAgICAgICAgJGkrKzsNCiAgICAgICAgICB9DQogICAgICAgICAgZWxzZSB7DQogICAgICAgICAgfQ0KICAgICAgICBicmVhazsNCg0KICAgICAgICAvLyAtLS0tLSBMb29rIGZvciBvcHRpb25zIHRoYXQgcmVxdWVzdCBhbiBhcnJheSBvZiBzdHJpbmcgZm9yIHZhbHVlDQogICAgICAgIGNhc2UgUENMWklQX09QVF9CWV9OQU1FIDoNCiAgICAgICAgICAvLyAtLS0tLSBDaGVjayB0aGUgbnVtYmVyIG9mIHBhcmFtZXRlcnMNCiAgICAgICAgICBpZiAoKCRpKzEpID49ICRwX3NpemUpIHsNCiAgICAgICAgICAgIC8vIC0tLS0tIEVycm9yIGxvZw0KICAgICAgICAgICAgUGNsWmlwOjpwcml2RXJyb3JMb2coUENMWklQX0VSUl9NSVNTSU5HX09QVElPTl9WQUxVRSwgIk1pc3NpbmcgcGFyYW1ldGVyIHZhbHVlIGZvciBvcHRpb24gJyIuUGNsWmlwVXRpbE9wdGlvblRleHQoJHBfb3B0aW9uc19saXN0WyRpXSkuIiciKTsNCg0KICAgICAgICAgICAgLy8gLS0tLS0gUmV0dXJuDQogICAgICAgICAgICByZXR1cm4gUGNsWmlwOjplcnJvckNvZGUoKTsNCiAgICAgICAgICB9DQoNCiAgICAgICAgICAvLyAtLS0tLSBHZXQgdGhlIHZhbHVlDQogICAgICAgICAgaWYgKGlzX3N0cmluZygkcF9vcHRpb25zX2xpc3RbJGkrMV0pKSB7DQogICAgICAgICAgICAgICR2X3Jlc3VsdF9saXN0WyRwX29wdGlvbnNfbGlzdFskaV1dWzBdID0gJHBfb3B0aW9uc19saXN0WyRpKzFdOw0KICAgICAgICAgIH0NCiAgICAgICAgICBlbHNlIGlmIChpc19hcnJheSgkcF9vcHRpb25zX2xpc3RbJGkrMV0pKSB7DQogICAgICAgICAgICAgICR2X3Jlc3VsdF9saXN0WyRwX29wdGlvbnNfbGlzdFskaV1dID0gJHBfb3B0aW9uc19saXN0WyRpKzFdOw0KICAgICAgICAgIH0NCiAgICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgIC8vIC0tLS0tIEVycm9yIGxvZw0KICAgICAgICAgICAgUGNsWmlwOjpwcml2RXJyb3JMb2coUENMWklQX0VSUl9JTlZBTElEX09QVElPTl9WQUxVRSwgIldyb25nIHBhcmFtZXRlciB2YWx1ZSBmb3Igb3B0aW9uICciLlBjbFppcFV0aWxPcHRpb25UZXh0KCRwX29wdGlvbnNfbGlzdFskaV0pLiInIik7DQoNCiAgICAgICAgICAgIC8vIC0tLS0tIFJldHVybg0KICAgICAgICAgICAgcmV0dXJuIFBjbFppcDo6ZXJyb3JDb2RlKCk7DQogICAgICAgICAgfQ0KICAgICAgICAgICRpKys7DQogICAgICAgIGJyZWFrOw0KDQogICAgICAgIC8vIC0tLS0tIExvb2sgZm9yIG9wdGlvbnMgdGhhdCByZXF1ZXN0IGFuIEVSRUcgb3IgUFJFRyBleHByZXNzaW9uDQogICAgICAgIGNhc2UgUENMWklQX09QVF9CWV9FUkVHIDoNCiAgICAgICAgICAvLyBlcmVnKCkgaXMgZGVwcmVjYXRlZCBzdGFydGluZyB3aXRoIFBIUCA1LjMuIE1vdmUgUENMWklQX09QVF9CWV9FUkVHDQogICAgICAgICAgLy8gdG8gUENMWklQX09QVF9CWV9QUkVHDQogICAgICAgICAgJHBfb3B0aW9uc19saXN0WyRpXSA9IFBDTFpJUF9PUFRfQllfUFJFRzsNCiAgICAgICAgY2FzZSBQQ0xaSVBfT1BUX0JZX1BSRUcgOg0KICAgICAgICAvL2Nhc2UgUENMWklQX09QVF9DUllQVCA6DQogICAgICAgICAgLy8gLS0tLS0gQ2hlY2sgdGhlIG51bWJlciBvZiBwYXJhbWV0ZXJzDQogICAgICAgICAgaWYgKCgkaSsxKSA+PSAkcF9zaXplKSB7DQogICAgICAgICAgICAvLyAtLS0tLSBFcnJvciBsb2cNCiAgICAgICAgICAgIFBjbFppcDo6cHJpdkVycm9yTG9nKFBDTFpJUF9FUlJfTUlTU0lOR19PUFRJT05fVkFMVUUsICJNaXNzaW5nIHBhcmFtZXRlciB2YWx1ZSBmb3Igb3B0aW9uICciLlBjbFppcFV0aWxPcHRpb25UZXh0KCRwX29wdGlvbnNfbGlzdFskaV0pLiInIik7DQoNCiAgICAgICAgICAgIC8vIC0tLS0tIFJldHVybg0KICAgICAgICAgICAgcmV0dXJuIFBjbFppcDo6ZXJyb3JDb2RlKCk7DQogICAgICAgICAgfQ0KDQogICAgICAgICAgLy8gLS0tLS0gR2V0IHRoZSB2YWx1ZQ0KICAgICAgICAgIGlmIChpc19zdHJpbmcoJHBfb3B0aW9uc19saXN0WyRpKzFdKSkgew0KICAgICAgICAgICAgICAkdl9yZXN1bHRfbGlzdFskcF9vcHRpb25zX2xpc3RbJGldXSA9ICRwX29wdGlvbnNfbGlzdFskaSsxXTsNCiAgICAgICAgICB9DQogICAgICAgICAgZWxzZSB7DQogICAgICAgICAgICAvLyAtLS0tLSBFcnJvciBsb2cNCiAgICAgICAgICAgIFBjbFppcDo6cHJpdkVycm9yTG9nKFBDTFpJUF9FUlJfSU5WQUxJRF9PUFRJT05fVkFMVUUsICJXcm9uZyBwYXJhbWV0ZXIgdmFsdWUgZm9yIG9wdGlvbiAnIi5QY2xaaXBVdGlsT3B0aW9uVGV4dCgkcF9vcHRpb25zX2xpc3RbJGldKS4iJyIpOw0KDQogICAgICAgICAgICAvLyAtLS0tLSBSZXR1cm4NCiAgICAgICAgICAgIHJldHVybiBQY2xaaXA6OmVycm9yQ29kZSgpOw0KICAgICAgICAgIH0NCiAgICAgICAgICAkaSsrOw0KICAgICAgICBicmVhazsNCg0KICAgICAgICAvLyAtLS0tLSBMb29rIGZvciBvcHRpb25zIHRoYXQgdGFrZXMgYSBzdHJpbmcNCiAgICAgICAgY2FzZSBQQ0xaSVBfT1BUX0NPTU1FTlQgOg0KICAgICAgICBjYXNlIFBDTFpJUF9PUFRfQUREX0NPTU1FTlQgOg0KICAgICAgICBjYXNlIFBDTFpJUF9PUFRfUFJFUEVORF9DT01NRU5UIDoNCiAgICAgICAgICAvLyAtLS0tLSBDaGVjayB0aGUgbnVtYmVyIG9mIHBhcmFtZXRlcnMNCiAgICAgICAgICBpZiAoKCRpKzEpID49ICRwX3NpemUpIHsNCiAgICAgICAgICAgIC8vIC0tLS0tIEVycm9yIGxvZw0KICAgICAgICAgICAgUGNsWmlwOjpwcml2RXJyb3JMb2coUENMWklQX0VSUl9NSVNTSU5HX09QVElPTl9WQUxVRSwNCgkJCSAgICAgICAgICAgICAgICAgICAgICJNaXNzaW5nIHBhcmFtZXRlciB2YWx1ZSBmb3Igb3B0aW9uICciDQoJCQkJCQkJCSAuUGNsWmlwVXRpbE9wdGlvblRleHQoJHBfb3B0aW9uc19saXN0WyRpXSkNCgkJCQkJCQkJIC4iJyIpOw0KDQogICAgICAgICAgICAvLyAtLS0tLSBSZXR1cm4NCiAgICAgICAgICAgIHJldHVybiBQY2xaaXA6OmVycm9yQ29kZSgpOw0KICAgICAgICAgIH0NCg0KICAgICAgICAgIC8vIC0tLS0tIEdldCB0aGUgdmFsdWUNCiAgICAgICAgICBpZiAoaXNfc3RyaW5nKCRwX29wdGlvbnNfbGlzdFskaSsxXSkpIHsNCiAgICAgICAgICAgICAgJHZfcmVzdWx0X2xpc3RbJHBfb3B0aW9uc19saXN0WyRpXV0gPSAkcF9vcHRpb25zX2xpc3RbJGkrMV07DQogICAgICAgICAgfQ0KICAgICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgLy8gLS0tLS0gRXJyb3IgbG9nDQogICAgICAgICAgICBQY2xaaXA6OnByaXZFcnJvckxvZyhQQ0xaSVBfRVJSX0lOVkFMSURfT1BUSU9OX1ZBTFVFLA0KCQkJICAgICAgICAgICAgICAgICAgICAgIldyb25nIHBhcmFtZXRlciB2YWx1ZSBmb3Igb3B0aW9uICciDQoJCQkJCQkJCSAuUGNsWmlwVXRpbE9wdGlvblRleHQoJHBfb3B0aW9uc19saXN0WyRpXSkNCgkJCQkJCQkJIC4iJyIpOw0KDQogICAgICAgICAgICAvLyAtLS0tLSBSZXR1cm4NCiAgICAgICAgICAgIHJldHVybiBQY2xaaXA6OmVycm9yQ29kZSgpOw0KICAgICAgICAgIH0NCiAgICAgICAgICAkaSsrOw0KICAgICAgICBicmVhazsNCg0KICAgICAgICAvLyAtLS0tLSBMb29rIGZvciBvcHRpb25zIHRoYXQgcmVxdWVzdCBhbiBhcnJheSBvZiBpbmRleA0KICAgICAgICBjYXNlIFBDTFpJUF9PUFRfQllfSU5ERVggOg0KICAgICAgICAgIC8vIC0tLS0tIENoZWNrIHRoZSBudW1iZXIgb2YgcGFyYW1ldGVycw0KICAgICAgICAgIGlmICgoJGkrMSkgPj0gJHBfc2l6ZSkgew0KICAgICAgICAgICAgLy8gLS0tLS0gRXJyb3IgbG9nDQogICAgICAgICAgICBQY2xaaXA6OnByaXZFcnJvckxvZyhQQ0xaSVBfRVJSX01JU1NJTkdfT1BUSU9OX1ZBTFVFLCAiTWlzc2luZyBwYXJhbWV0ZXIgdmFsdWUgZm9yIG9wdGlvbiAnIi5QY2xaaXBVdGlsT3B0aW9uVGV4dCgkcF9vcHRpb25zX2xpc3RbJGldKS4iJyIpOw0KDQogICAgICAgICAgICAvLyAtLS0tLSBSZXR1cm4NCiAgICAgICAgICAgIHJldHVybiBQY2xaaXA6OmVycm9yQ29kZSgpOw0KICAgICAgICAgIH0NCg0KICAgICAgICAgIC8vIC0tLS0tIEdldCB0aGUgdmFsdWUNCiAgICAgICAgICAkdl93b3JrX2xpc3QgPSBhcnJheSgpOw0KICAgICAgICAgIGlmIChpc19zdHJpbmcoJHBfb3B0aW9uc19saXN0WyRpKzFdKSkgew0KDQogICAgICAgICAgICAgIC8vIC0tLS0tIFJlbW92ZSBzcGFjZXMNCiAgICAgICAgICAgICAgJHBfb3B0aW9uc19saXN0WyRpKzFdID0gc3RydHIoJHBfb3B0aW9uc19saXN0WyRpKzFdLCAnICcsICcnKTsNCg0KICAgICAgICAgICAgICAvLyAtLS0tLSBQYXJzZSBpdGVtcw0KICAgICAgICAgICAgICAkdl93b3JrX2xpc3QgPSBleHBsb2RlKCIsIiwgJHBfb3B0aW9uc19saXN0WyRpKzFdKTsNCiAgICAgICAgICB9DQogICAgICAgICAgZWxzZSBpZiAoaXNfaW50ZWdlcigkcF9vcHRpb25zX2xpc3RbJGkrMV0pKSB7DQogICAgICAgICAgICAgICR2X3dvcmtfbGlzdFswXSA9ICRwX29wdGlvbnNfbGlzdFskaSsxXS4nLScuJHBfb3B0aW9uc19saXN0WyRpKzFdOw0KICAgICAgICAgIH0NCiAgICAgICAgICBlbHNlIGlmIChpc19hcnJheSgkcF9vcHRpb25zX2xpc3RbJGkrMV0pKSB7DQogICAgICAgICAgICAgICR2X3dvcmtfbGlzdCA9ICRwX29wdGlvbnNfbGlzdFskaSsxXTsNCiAgICAgICAgICB9DQogICAgICAgICAgZWxzZSB7DQogICAgICAgICAgICAvLyAtLS0tLSBFcnJvciBsb2cNCiAgICAgICAgICAgIFBjbFppcDo6cHJpdkVycm9yTG9nKFBDTFpJUF9FUlJfSU5WQUxJRF9PUFRJT05fVkFMVUUsICJWYWx1ZSBtdXN0IGJlIGludGVnZXIsIHN0cmluZyBvciBhcnJheSBmb3Igb3B0aW9uICciLlBjbFppcFV0aWxPcHRpb25UZXh0KCRwX29wdGlvbnNfbGlzdFskaV0pLiInIik7DQoNCiAgICAgICAgICAgIC8vIC0tLS0tIFJldHVybg0KICAgICAgICAgICAgcmV0dXJuIFBjbFppcDo6ZXJyb3JDb2RlKCk7DQogICAgICAgICAgfQ0KICAgICAgICAgIA0KICAgICAgICAgIC8vIC0tLS0tIFJlZHVjZSB0aGUgaW5kZXggbGlzdA0KICAgICAgICAgIC8vIGVhY2ggaW5kZXggaXRlbSBpbiB0aGUgbGlzdCBtdXN0IGJlIGEgY291cGxlIHdpdGggYSBzdGFydCBhbmQNCiAgICAgICAgICAvLyBhbiBlbmQgdmFsdWUgOiBbMCwzXSwgWzUtNV0sIFs4LTEwXSwgLi4uDQogICAgICAgICAgLy8gLS0tLS0gQ2hlY2sgdGhlIGZvcm1hdCBvZiBlYWNoIGl0ZW0NCiAgICAgICAgICAkdl9zb3J0X2ZsYWc9ZmFsc2U7DQogICAgICAgICAgJHZfc29ydF92YWx1ZT0wOw0KICAgICAgICAgIGZvciAoJGo9MDsgJGo8c2l6ZW9mKCR2X3dvcmtfbGlzdCk7ICRqKyspIHsNCiAgICAgICAgICAgICAgLy8gLS0tLS0gRXhwbG9kZSB0aGUgaXRlbQ0KICAgICAgICAgICAgICAkdl9pdGVtX2xpc3QgPSBleHBsb2RlKCItIiwgJHZfd29ya19saXN0WyRqXSk7DQogICAgICAgICAgICAgICR2X3NpemVfaXRlbV9saXN0ID0gc2l6ZW9mKCR2X2l0ZW1fbGlzdCk7DQogICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAvLyAtLS0tLSBUQkMgOiBIZXJlIHdlIG1pZ2h0IGNoZWNrIHRoYXQgZWFjaCBpdGVtIGlzIGENCiAgICAgICAgICAgICAgLy8gcmVhbCBpbnRlZ2VyIC4uLg0KICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgLy8gLS0tLS0gTG9vayBmb3Igc2luZ2xlIHZhbHVlDQogICAgICAgICAgICAgIGlmICgkdl9zaXplX2l0ZW1fbGlzdCA9PSAxKSB7DQogICAgICAgICAgICAgICAgICAvLyAtLS0tLSBTZXQgdGhlIG9wdGlvbiB2YWx1ZQ0KICAgICAgICAgICAgICAgICAgJHZfcmVzdWx0X2xpc3RbJHBfb3B0aW9uc19saXN0WyRpXV1bJGpdWydzdGFydCddID0gJHZfaXRlbV9saXN0WzBdOw0KICAgICAgICAgICAgICAgICAgJHZfcmVzdWx0X2xpc3RbJHBfb3B0aW9uc19saXN0WyRpXV1bJGpdWydlbmQnXSA9ICR2X2l0ZW1fbGlzdFswXTsNCiAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICBlbHNlaWYgKCR2X3NpemVfaXRlbV9saXN0ID09IDIpIHsNCiAgICAgICAgICAgICAgICAgIC8vIC0tLS0tIFNldCB0aGUgb3B0aW9uIHZhbHVlDQogICAgICAgICAgICAgICAgICAkdl9yZXN1bHRfbGlzdFskcF9vcHRpb25zX2xpc3RbJGldXVskal1bJ3N0YXJ0J10gPSAkdl9pdGVtX2xpc3RbMF07DQogICAgICAgICAgICAgICAgICAkdl9yZXN1bHRfbGlzdFskcF9vcHRpb25zX2xpc3RbJGldXVskal1bJ2VuZCddID0gJHZfaXRlbV9saXN0WzFdOw0KICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgICAgICAgLy8gLS0tLS0gRXJyb3IgbG9nDQogICAgICAgICAgICAgICAgICBQY2xaaXA6OnByaXZFcnJvckxvZyhQQ0xaSVBfRVJSX0lOVkFMSURfT1BUSU9OX1ZBTFVFLCAiVG9vIG1hbnkgdmFsdWVzIGluIGluZGV4IHJhbmdlIGZvciBvcHRpb24gJyIuUGNsWmlwVXRpbE9wdGlvblRleHQoJHBfb3B0aW9uc19saXN0WyRpXSkuIiciKTsNCg0KICAgICAgICAgICAgICAgICAgLy8gLS0tLS0gUmV0dXJuDQogICAgICAgICAgICAgICAgICByZXR1cm4gUGNsWmlwOjplcnJvckNvZGUoKTsNCiAgICAgICAgICAgICAgfQ0KDQoNCiAgICAgICAgICAgICAgLy8gLS0tLS0gTG9vayBmb3IgbGlzdCBzb3J0DQogICAgICAgICAgICAgIGlmICgkdl9yZXN1bHRfbGlzdFskcF9vcHRpb25zX2xpc3RbJGldXVskal1bJ3N0YXJ0J10gPCAkdl9zb3J0X3ZhbHVlKSB7DQogICAgICAgICAgICAgICAgICAkdl9zb3J0X2ZsYWc9dHJ1ZTsNCg0KICAgICAgICAgICAgICAgICAgLy8gLS0tLS0gVEJDIDogQW4gYXV0b21hdGljIHNvcnQgc2hvdWxkIGJlIHdyaXRlbiAuLi4NCiAgICAgICAgICAgICAgICAgIC8vIC0tLS0tIEVycm9yIGxvZw0KICAgICAgICAgICAgICAgICAgUGNsWmlwOjpwcml2RXJyb3JMb2coUENMWklQX0VSUl9JTlZBTElEX09QVElPTl9WQUxVRSwgIkludmFsaWQgb3JkZXIgb2YgaW5kZXggcmFuZ2UgZm9yIG9wdGlvbiAnIi5QY2xaaXBVdGlsT3B0aW9uVGV4dCgkcF9vcHRpb25zX2xpc3RbJGldKS4iJyIpOw0KDQogICAgICAgICAgICAgICAgICAvLyAtLS0tLSBSZXR1cm4NCiAgICAgICAgICAgICAgICAgIHJldHVybiBQY2xaaXA6OmVycm9yQ29kZSgpOw0KICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICR2X3NvcnRfdmFsdWUgPSAkdl9yZXN1bHRfbGlzdFskcF9vcHRpb25zX2xpc3RbJGldXVskal1bJ3N0YXJ0J107DQogICAgICAgICAgfQ0KICAgICAgICAgIA0KICAgICAgICAgIC8vIC0tLS0tIFNvcnQgdGhlIGl0ZW1zDQogICAgICAgICAgaWYgKCR2X3NvcnRfZmxhZykgew0KICAgICAgICAgICAgICAvLyBUQkMgOiBUbyBCZSBDb21wbGV0ZWQNCiAgICAgICAgICB9DQoNCiAgICAgICAgICAvLyAtLS0tLSBOZXh0IG9wdGlvbg0KICAgICAgICAgICRpKys7DQogICAgICAgIGJyZWFrOw0KDQogICAgICAgIC8vIC0tLS0tIExvb2sgZm9yIG9wdGlvbnMgdGhhdCByZXF1ZXN0IG5vIHZhbHVlDQogICAgICAgIGNhc2UgUENMWklQX09QVF9SRU1PVkVfQUxMX1BBVEggOg0KICAgICAgICBjYXNlIFBDTFpJUF9PUFRfRVhUUkFDVF9BU19TVFJJTkcgOg0KICAgICAgICBjYXNlIFBDTFpJUF9PUFRfTk9fQ09NUFJFU1NJT04gOg0KICAgICAgICBjYXNlIFBDTFpJUF9PUFRfRVhUUkFDVF9JTl9PVVRQVVQgOg0KICAgICAgICBjYXNlIFBDTFpJUF9PUFRfUkVQTEFDRV9ORVdFUiA6DQogICAgICAgIGNhc2UgUENMWklQX09QVF9TVE9QX09OX0VSUk9SIDoNCiAgICAgICAgICAkdl9yZXN1bHRfbGlzdFskcF9vcHRpb25zX2xpc3RbJGldXSA9IHRydWU7DQogICAgICAgIGJyZWFrOw0KDQogICAgICAgIC8vIC0tLS0tIExvb2sgZm9yIG9wdGlvbnMgdGhhdCByZXF1ZXN0IGFuIG9jdGFsIHZhbHVlDQogICAgICAgIGNhc2UgUENMWklQX09QVF9TRVRfQ0hNT0QgOg0KICAgICAgICAgIC8vIC0tLS0tIENoZWNrIHRoZSBudW1iZXIgb2YgcGFyYW1ldGVycw0KICAgICAgICAgIGlmICgoJGkrMSkgPj0gJHBfc2l6ZSkgew0KICAgICAgICAgICAgLy8gLS0tLS0gRXJyb3IgbG9nDQogICAgICAgICAgICBQY2xaaXA6OnByaXZFcnJvckxvZyhQQ0xaSVBfRVJSX01JU1NJTkdfT1BUSU9OX1ZBTFVFLCAiTWlzc2luZyBwYXJhbWV0ZXIgdmFsdWUgZm9yIG9wdGlvbiAnIi5QY2xaaXBVdGlsT3B0aW9uVGV4dCgkcF9vcHRpb25zX2xpc3RbJGldKS4iJyIpOw0KDQogICAgICAgICAgICAvLyAtLS0tLSBSZXR1cm4NCiAgICAgICAgICAgIHJldHVybiBQY2xaaXA6OmVycm9yQ29kZSgpOw0KICAgICAgICAgIH0NCg0KICAgICAgICAgIC8vIC0tLS0tIEdldCB0aGUgdmFsdWUNCiAgICAgICAgICAkdl9yZXN1bHRfbGlzdFskcF9vcHRpb25zX2xpc3RbJGldXSA9ICRwX29wdGlvbnNfbGlzdFskaSsxXTsNCiAgICAgICAgICAkaSsrOw0KICAgICAgICBicmVhazsNCg0KICAgICAgICAvLyAtLS0tLSBMb29rIGZvciBvcHRpb25zIHRoYXQgcmVxdWVzdCBhIGNhbGwtYmFjaw0KICAgICAgICBjYXNlIFBDTFpJUF9DQl9QUkVfRVhUUkFDVCA6DQogICAgICAgIGNhc2UgUENMWklQX0NCX1BPU1RfRVhUUkFDVCA6DQogICAgICAgIGNhc2UgUENMWklQX0NCX1BSRV9BREQgOg0KICAgICAgICBjYXNlIFBDTFpJUF9DQl9QT1NUX0FERCA6DQogICAgICAgIC8qIGZvciBmdXR1ciB1c2UNCiAgICAgICAgY2FzZSBQQ0xaSVBfQ0JfUFJFX0RFTEVURSA6DQogICAgICAgIGNhc2UgUENMWklQX0NCX1BPU1RfREVMRVRFIDoNCiAgICAgICAgY2FzZSBQQ0xaSVBfQ0JfUFJFX0xJU1QgOg0KICAgICAgICBjYXNlIFBDTFpJUF9DQl9QT1NUX0xJU1QgOg0KICAgICAgICAqLw0KICAgICAgICAgIC8vIC0tLS0tIENoZWNrIHRoZSBudW1iZXIgb2YgcGFyYW1ldGVycw0KICAgICAgICAgIGlmICgoJGkrMSkgPj0gJHBfc2l6ZSkgew0KICAgICAgICAgICAgLy8gLS0tLS0gRXJyb3IgbG9nDQogICAgICAgICAgICBQY2xaaXA6OnByaXZFcnJvckxvZyhQQ0xaSVBfRVJSX01JU1NJTkdfT1BUSU9OX1ZBTFVFLCAiTWlzc2luZyBwYXJhbWV0ZXIgdmFsdWUgZm9yIG9wdGlvbiAnIi5QY2xaaXBVdGlsT3B0aW9uVGV4dCgkcF9vcHRpb25zX2xpc3RbJGldKS4iJyIpOw0KDQogICAgICAgICAgICAvLyAtLS0tLSBSZXR1cm4NCiAgICAgICAgICAgIHJldHVybiBQY2xaaXA6OmVycm9yQ29kZSgpOw0KICAgICAgICAgIH0NCg0KICAgICAgICAgIC8vIC0tLS0tIEdldCB0aGUgdmFsdWUNCiAgICAgICAgICAkdl9mdW5jdGlvbl9uYW1lID0gJHBfb3B0aW9uc19saXN0WyRpKzFdOw0KDQogICAgICAgICAgLy8gLS0tLS0gQ2hlY2sgdGhhdCB0aGUgdmFsdWUgaXMgYSB2YWxpZCBleGlzdGluZyBmdW5jdGlvbg0KICAgICAgICAgIGlmICghZnVuY3Rpb25fZXhpc3RzKCR2X2Z1bmN0aW9uX25hbWUpKSB7DQogICAgICAgICAgICAvLyAtLS0tLSBFcnJvciBsb2cNCiAgICAgICAgICAgIFBjbFppcDo6cHJpdkVycm9yTG9nKFBDTFpJUF9FUlJfSU5WQUxJRF9PUFRJT05fVkFMVUUsICJGdW5jdGlvbiAnIi4kdl9mdW5jdGlvbl9uYW1lLiIoKScgaXMgbm90IGFuIGV4aXN0aW5nIGZ1bmN0aW9uIGZvciBvcHRpb24gJyIuUGNsWmlwVXRpbE9wdGlvblRleHQoJHBfb3B0aW9uc19saXN0WyRpXSkuIiciKTsNCg0KICAgICAgICAgICAgLy8gLS0tLS0gUmV0dXJuDQogICAgICAgICAgICByZXR1cm4gUGNsWmlwOjplcnJvckNvZGUoKTsNCiAgICAgICAgICB9DQoNCiAgICAgICAgICAvLyAtLS0tLSBTZXQgdGhlIGF0dHJpYnV0ZQ0KICAgICAgICAgICR2X3Jlc3VsdF9saXN0WyRwX29wdGlvbnNfbGlzdFskaV1dID0gJHZfZnVuY3Rpb25fbmFtZTsNCiAgICAgICAgICAkaSsrOw0KICAgICAgICBicmVhazsNCg0KICAgICAgICBkZWZhdWx0IDoNCiAgICAgICAgICAvLyAtLS0tLSBFcnJvciBsb2cNCiAgICAgICAgICBQY2xaaXA6OnByaXZFcnJvckxvZyhQQ0xaSVBfRVJSX0lOVkFMSURfUEFSQU1FVEVSLA0KCQkgICAgICAgICAgICAgICAgICAgICAgICJVbmtub3duIHBhcmFtZXRlciAnIg0KCQkJCQkJCSAgIC4kcF9vcHRpb25zX2xpc3RbJGldLiInIik7DQoNCiAgICAgICAgICAvLyAtLS0tLSBSZXR1cm4NCiAgICAgICAgICByZXR1cm4gUGNsWmlwOjplcnJvckNvZGUoKTsNCiAgICAgIH0NCg0KICAgICAgLy8gLS0tLS0gTmV4dCBvcHRpb25zDQogICAgICAkaSsrOw0KICAgIH0NCg0KICAgIC8vIC0tLS0tIExvb2sgZm9yIG1hbmRhdG9yeSBvcHRpb25zDQogICAgaWYgKCR2X3JlcXVlc3RlZF9vcHRpb25zICE9PSBmYWxzZSkgew0KICAgICAgZm9yICgka2V5PXJlc2V0KCR2X3JlcXVlc3RlZF9vcHRpb25zKTsgJGtleT1rZXkoJHZfcmVxdWVzdGVkX29wdGlvbnMpOyAka2V5PW5leHQoJHZfcmVxdWVzdGVkX29wdGlvbnMpKSB7DQogICAgICAgIC8vIC0tLS0tIExvb2sgZm9yIG1hbmRhdG9yeSBvcHRpb24NCiAgICAgICAgaWYgKCR2X3JlcXVlc3RlZF9vcHRpb25zWyRrZXldID09ICdtYW5kYXRvcnknKSB7DQogICAgICAgICAgLy8gLS0tLS0gTG9vayBpZiBwcmVzZW50DQogICAgICAgICAgaWYgKCFpc3NldCgkdl9yZXN1bHRfbGlzdFska2V5XSkpIHsNCiAgICAgICAgICAgIC8vIC0tLS0tIEVycm9yIGxvZw0KICAgICAgICAgICAgUGNsWmlwOjpwcml2RXJyb3JMb2coUENMWklQX0VSUl9JTlZBTElEX1BBUkFNRVRFUiwgIk1pc3NpbmcgbWFuZGF0b3J5IHBhcmFtZXRlciAiLlBjbFppcFV0aWxPcHRpb25UZXh0KCRrZXkpLiIoIi4ka2V5LiIpIik7DQoNCiAgICAgICAgICAgIC8vIC0tLS0tIFJldHVybg0KICAgICAgICAgICAgcmV0dXJuIFBjbFppcDo6ZXJyb3JDb2RlKCk7DQogICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICB9DQogICAgfQ0KICAgIA0KICAgIC8vIC0tLS0tIExvb2sgZm9yIGRlZmF1bHQgdmFsdWVzDQogICAgaWYgKCFpc3NldCgkdl9yZXN1bHRfbGlzdFtQQ0xaSVBfT1BUX1RFTVBfRklMRV9USFJFU0hPTERdKSkgew0KICAgICAgDQogICAgfQ0KDQogICAgLy8gLS0tLS0gUmV0dXJuDQogICAgcmV0dXJuICR2X3Jlc3VsdDsNCiAgfQ0KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogIC8vIEZ1bmN0aW9uIDogcHJpdk9wdGlvbkRlZmF1bHRUaHJlc2hvbGQoKQ0KICAvLyBEZXNjcmlwdGlvbiA6DQogIC8vIFBhcmFtZXRlcnMgOg0KICAvLyBSZXR1cm4gVmFsdWVzIDoNCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAgZnVuY3Rpb24gcHJpdk9wdGlvbkRlZmF1bHRUaHJlc2hvbGQoJiRwX29wdGlvbnMpDQogIHsNCiAgICAkdl9yZXN1bHQ9MTsNCiAgICANCiAgICBpZiAoaXNzZXQoJHBfb3B0aW9uc1tQQ0xaSVBfT1BUX1RFTVBfRklMRV9USFJFU0hPTERdKQ0KICAgICAgICB8fCBpc3NldCgkcF9vcHRpb25zW1BDTFpJUF9PUFRfVEVNUF9GSUxFX09GRl0pKSB7DQogICAgICByZXR1cm4gJHZfcmVzdWx0Ow0KICAgIH0NCiAgICANCiAgICAvLyAtLS0tLSBHZXQgJ21lbW9yeV9saW1pdCcgY29uZmlndXJhdGlvbiB2YWx1ZQ0KICAgICR2X21lbW9yeV9saW1pdCA9IGluaV9nZXQoJ21lbW9yeV9saW1pdCcpOw0KICAgICR2X21lbW9yeV9saW1pdCA9IHRyaW0oJHZfbWVtb3J5X2xpbWl0KTsNCiAgICAkbGFzdCA9IHN0cnRvbG93ZXIoc3Vic3RyKCR2X21lbW9yeV9saW1pdCwgLTEpKTsNCiANCiAgICBpZigkbGFzdCA9PSAnZycpDQogICAgICAgIC8vJHZfbWVtb3J5X2xpbWl0ID0gJHZfbWVtb3J5X2xpbWl0KjEwMjQqMTAyNCoxMDI0Ow0KICAgICAgICAkdl9tZW1vcnlfbGltaXQgPSAkdl9tZW1vcnlfbGltaXQqMTA3Mzc0MTgyNDsNCiAgICBpZigkbGFzdCA9PSAnbScpDQogICAgICAgIC8vJHZfbWVtb3J5X2xpbWl0ID0gJHZfbWVtb3J5X2xpbWl0KjEwMjQqMTAyNDsNCiAgICAgICAgJHZfbWVtb3J5X2xpbWl0ID0gJHZfbWVtb3J5X2xpbWl0KjEwNDg1NzY7DQogICAgaWYoJGxhc3QgPT0gJ2snKQ0KICAgICAgICAkdl9tZW1vcnlfbGltaXQgPSAkdl9tZW1vcnlfbGltaXQqMTAyNDsNCiAgICAgICAgICAgIA0KICAgICRwX29wdGlvbnNbUENMWklQX09QVF9URU1QX0ZJTEVfVEhSRVNIT0xEXSA9IGZsb29yKCR2X21lbW9yeV9saW1pdCpQQ0xaSVBfVEVNUE9SQVJZX0ZJTEVfUkFUSU8pOw0KICAgIA0KDQogICAgLy8gLS0tLS0gU2FuaXR5IGNoZWNrIDogTm8gdGhyZXNob2xkIGlmIHZhbHVlIGxvd2VyIHRoYW4gMU0NCiAgICBpZiAoJHBfb3B0aW9uc1tQQ0xaSVBfT1BUX1RFTVBfRklMRV9USFJFU0hPTERdIDwgMTA0ODU3Nikgew0KICAgICAgdW5zZXQoJHBfb3B0aW9uc1tQQ0xaSVBfT1BUX1RFTVBfRklMRV9USFJFU0hPTERdKTsNCiAgICB9DQogICAgICAgICAgDQogICAgLy8gLS0tLS0gUmV0dXJuDQogICAgcmV0dXJuICR2X3Jlc3VsdDsNCiAgfQ0KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogIC8vIEZ1bmN0aW9uIDogcHJpdkZpbGVEZXNjclBhcnNlQXR0KCkNCiAgLy8gRGVzY3JpcHRpb24gOg0KICAvLyBQYXJhbWV0ZXJzIDoNCiAgLy8gUmV0dXJuIFZhbHVlcyA6DQogIC8vICAgMSBvbiBzdWNjZXNzLg0KICAvLyAgIDAgb24gZmFpbHVyZS4NCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAgZnVuY3Rpb24gcHJpdkZpbGVEZXNjclBhcnNlQXR0KCYkcF9maWxlX2xpc3QsICYkcF9maWxlZGVzY3IsICR2X29wdGlvbnMsICR2X3JlcXVlc3RlZF9vcHRpb25zPWZhbHNlKQ0KICB7DQogICAgJHZfcmVzdWx0PTE7DQogICAgDQogICAgLy8gLS0tLS0gRm9yIGVhY2ggZmlsZSBpbiB0aGUgbGlzdCBjaGVjayB0aGUgYXR0cmlidXRlcw0KICAgIGZvcmVhY2ggKCRwX2ZpbGVfbGlzdCBhcyAkdl9rZXkgPT4gJHZfdmFsdWUpIHsNCiAgICANCiAgICAgIC8vIC0tLS0tIENoZWNrIGlmIHRoZSBvcHRpb24gaXMgc3VwcG9ydGVkDQogICAgICBpZiAoIWlzc2V0KCR2X3JlcXVlc3RlZF9vcHRpb25zWyR2X2tleV0pKSB7DQogICAgICAgIC8vIC0tLS0tIEVycm9yIGxvZw0KICAgICAgICBQY2xaaXA6OnByaXZFcnJvckxvZyhQQ0xaSVBfRVJSX0lOVkFMSURfUEFSQU1FVEVSLCAiSW52YWxpZCBmaWxlIGF0dHJpYnV0ZSAnIi4kdl9rZXkuIicgZm9yIHRoaXMgZmlsZSIpOw0KDQogICAgICAgIC8vIC0tLS0tIFJldHVybg0KICAgICAgICByZXR1cm4gUGNsWmlwOjplcnJvckNvZGUoKTsNCiAgICAgIH0NCg0KICAgICAgLy8gLS0tLS0gTG9vayBmb3IgYXR0cmlidXRlDQogICAgICBzd2l0Y2ggKCR2X2tleSkgew0KICAgICAgICBjYXNlIFBDTFpJUF9BVFRfRklMRV9OQU1FIDoNCiAgICAgICAgICBpZiAoIWlzX3N0cmluZygkdl92YWx1ZSkpIHsNCiAgICAgICAgICAgIFBjbFppcDo6cHJpdkVycm9yTG9nKFBDTFpJUF9FUlJfSU5WQUxJRF9BVFRSSUJVVEVfVkFMVUUsICJJbnZhbGlkIHR5cGUgIi5nZXR0eXBlKCR2X3ZhbHVlKS4iLiBTdHJpbmcgZXhwZWN0ZWQgZm9yIGF0dHJpYnV0ZSAnIi5QY2xaaXBVdGlsT3B0aW9uVGV4dCgkdl9rZXkpLiInIik7DQogICAgICAgICAgICByZXR1cm4gUGNsWmlwOjplcnJvckNvZGUoKTsNCiAgICAgICAgICB9DQoNCiAgICAgICAgICAkcF9maWxlZGVzY3JbJ2ZpbGVuYW1lJ10gPSBQY2xaaXBVdGlsUGF0aFJlZHVjdGlvbigkdl92YWx1ZSk7DQogICAgICAgICAgDQogICAgICAgICAgaWYgKCRwX2ZpbGVkZXNjclsnZmlsZW5hbWUnXSA9PSAnJykgew0KICAgICAgICAgICAgUGNsWmlwOjpwcml2RXJyb3JMb2coUENMWklQX0VSUl9JTlZBTElEX0FUVFJJQlVURV9WQUxVRSwgIkludmFsaWQgZW1wdHkgZmlsZW5hbWUgZm9yIGF0dHJpYnV0ZSAnIi5QY2xaaXBVdGlsT3B0aW9uVGV4dCgkdl9rZXkpLiInIik7DQogICAgICAgICAgICByZXR1cm4gUGNsWmlwOjplcnJvckNvZGUoKTsNCiAgICAgICAgICB9DQoNCiAgICAgICAgYnJlYWs7DQoNCiAgICAgICAgY2FzZSBQQ0xaSVBfQVRUX0ZJTEVfTkVXX1NIT1JUX05BTUUgOg0KICAgICAgICAgIGlmICghaXNfc3RyaW5nKCR2X3ZhbHVlKSkgew0KICAgICAgICAgICAgUGNsWmlwOjpwcml2RXJyb3JMb2coUENMWklQX0VSUl9JTlZBTElEX0FUVFJJQlVURV9WQUxVRSwgIkludmFsaWQgdHlwZSAiLmdldHR5cGUoJHZfdmFsdWUpLiIuIFN0cmluZyBleHBlY3RlZCBmb3IgYXR0cmlidXRlICciLlBjbFppcFV0aWxPcHRpb25UZXh0KCR2X2tleSkuIiciKTsNCiAgICAgICAgICAgIHJldHVybiBQY2xaaXA6OmVycm9yQ29kZSgpOw0KICAgICAgICAgIH0NCg0KICAgICAgICAgICRwX2ZpbGVkZXNjclsnbmV3X3Nob3J0X25hbWUnXSA9IFBjbFppcFV0aWxQYXRoUmVkdWN0aW9uKCR2X3ZhbHVlKTsNCg0KICAgICAgICAgIGlmICgkcF9maWxlZGVzY3JbJ25ld19zaG9ydF9uYW1lJ10gPT0gJycpIHsNCiAgICAgICAgICAgIFBjbFppcDo6cHJpdkVycm9yTG9nKFBDTFpJUF9FUlJfSU5WQUxJRF9BVFRSSUJVVEVfVkFMVUUsICJJbnZhbGlkIGVtcHR5IHNob3J0IGZpbGVuYW1lIGZvciBhdHRyaWJ1dGUgJyIuUGNsWmlwVXRpbE9wdGlvblRleHQoJHZfa2V5KS4iJyIpOw0KICAgICAgICAgICAgcmV0dXJuIFBjbFppcDo6ZXJyb3JDb2RlKCk7DQogICAgICAgICAgfQ0KICAgICAgICBicmVhazsNCg0KICAgICAgICBjYXNlIFBDTFpJUF9BVFRfRklMRV9ORVdfRlVMTF9OQU1FIDoNCiAgICAgICAgICBpZiAoIWlzX3N0cmluZygkdl92YWx1ZSkpIHsNCiAgICAgICAgICAgIFBjbFppcDo6cHJpdkVycm9yTG9nKFBDTFpJUF9FUlJfSU5WQUxJRF9BVFRSSUJVVEVfVkFMVUUsICJJbnZhbGlkIHR5cGUgIi5nZXR0eXBlKCR2X3ZhbHVlKS4iLiBTdHJpbmcgZXhwZWN0ZWQgZm9yIGF0dHJpYnV0ZSAnIi5QY2xaaXBVdGlsT3B0aW9uVGV4dCgkdl9rZXkpLiInIik7DQogICAgICAgICAgICByZXR1cm4gUGNsWmlwOjplcnJvckNvZGUoKTsNCiAgICAgICAgICB9DQoNCiAgICAgICAgICAkcF9maWxlZGVzY3JbJ25ld19mdWxsX25hbWUnXSA9IFBjbFppcFV0aWxQYXRoUmVkdWN0aW9uKCR2X3ZhbHVlKTsNCg0KICAgICAgICAgIGlmICgkcF9maWxlZGVzY3JbJ25ld19mdWxsX25hbWUnXSA9PSAnJykgew0KICAgICAgICAgICAgUGNsWmlwOjpwcml2RXJyb3JMb2coUENMWklQX0VSUl9JTlZBTElEX0FUVFJJQlVURV9WQUxVRSwgIkludmFsaWQgZW1wdHkgZnVsbCBmaWxlbmFtZSBmb3IgYXR0cmlidXRlICciLlBjbFppcFV0aWxPcHRpb25UZXh0KCR2X2tleSkuIiciKTsNCiAgICAgICAgICAgIHJldHVybiBQY2xaaXA6OmVycm9yQ29kZSgpOw0KICAgICAgICAgIH0NCiAgICAgICAgYnJlYWs7DQoNCiAgICAgICAgLy8gLS0tLS0gTG9vayBmb3Igb3B0aW9ucyB0aGF0IHRha2VzIGEgc3RyaW5nDQogICAgICAgIGNhc2UgUENMWklQX0FUVF9GSUxFX0NPTU1FTlQgOg0KICAgICAgICAgIGlmICghaXNfc3RyaW5nKCR2X3ZhbHVlKSkgew0KICAgICAgICAgICAgUGNsWmlwOjpwcml2RXJyb3JMb2coUENMWklQX0VSUl9JTlZBTElEX0FUVFJJQlVURV9WQUxVRSwgIkludmFsaWQgdHlwZSAiLmdldHR5cGUoJHZfdmFsdWUpLiIuIFN0cmluZyBleHBlY3RlZCBmb3IgYXR0cmlidXRlICciLlBjbFppcFV0aWxPcHRpb25UZXh0KCR2X2tleSkuIiciKTsNCiAgICAgICAgICAgIHJldHVybiBQY2xaaXA6OmVycm9yQ29kZSgpOw0KICAgICAgICAgIH0NCg0KICAgICAgICAgICRwX2ZpbGVkZXNjclsnY29tbWVudCddID0gJHZfdmFsdWU7DQogICAgICAgIGJyZWFrOw0KDQogICAgICAgIGNhc2UgUENMWklQX0FUVF9GSUxFX01USU1FIDoNCiAgICAgICAgICBpZiAoIWlzX2ludGVnZXIoJHZfdmFsdWUpKSB7DQogICAgICAgICAgICBQY2xaaXA6OnByaXZFcnJvckxvZyhQQ0xaSVBfRVJSX0lOVkFMSURfQVRUUklCVVRFX1ZBTFVFLCAiSW52YWxpZCB0eXBlICIuZ2V0dHlwZSgkdl92YWx1ZSkuIi4gSW50ZWdlciBleHBlY3RlZCBmb3IgYXR0cmlidXRlICciLlBjbFppcFV0aWxPcHRpb25UZXh0KCR2X2tleSkuIiciKTsNCiAgICAgICAgICAgIHJldHVybiBQY2xaaXA6OmVycm9yQ29kZSgpOw0KICAgICAgICAgIH0NCg0KICAgICAgICAgICRwX2ZpbGVkZXNjclsnbXRpbWUnXSA9ICR2X3ZhbHVlOw0KICAgICAgICBicmVhazsNCg0KICAgICAgICBjYXNlIFBDTFpJUF9BVFRfRklMRV9DT05URU5UIDoNCiAgICAgICAgICAkcF9maWxlZGVzY3JbJ2NvbnRlbnQnXSA9ICR2X3ZhbHVlOw0KICAgICAgICBicmVhazsNCg0KICAgICAgICBkZWZhdWx0IDoNCiAgICAgICAgICAvLyAtLS0tLSBFcnJvciBsb2cNCiAgICAgICAgICBQY2xaaXA6OnByaXZFcnJvckxvZyhQQ0xaSVBfRVJSX0lOVkFMSURfUEFSQU1FVEVSLA0KCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAiVW5rbm93biBwYXJhbWV0ZXIgJyIuJHZfa2V5LiInIik7DQoNCiAgICAgICAgICAvLyAtLS0tLSBSZXR1cm4NCiAgICAgICAgICByZXR1cm4gUGNsWmlwOjplcnJvckNvZGUoKTsNCiAgICAgIH0NCg0KICAgICAgLy8gLS0tLS0gTG9vayBmb3IgbWFuZGF0b3J5IG9wdGlvbnMNCiAgICAgIGlmICgkdl9yZXF1ZXN0ZWRfb3B0aW9ucyAhPT0gZmFsc2UpIHsNCiAgICAgICAgZm9yICgka2V5PXJlc2V0KCR2X3JlcXVlc3RlZF9vcHRpb25zKTsgJGtleT1rZXkoJHZfcmVxdWVzdGVkX29wdGlvbnMpOyAka2V5PW5leHQoJHZfcmVxdWVzdGVkX29wdGlvbnMpKSB7DQogICAgICAgICAgLy8gLS0tLS0gTG9vayBmb3IgbWFuZGF0b3J5IG9wdGlvbg0KICAgICAgICAgIGlmICgkdl9yZXF1ZXN0ZWRfb3B0aW9uc1ska2V5XSA9PSAnbWFuZGF0b3J5Jykgew0KICAgICAgICAgICAgLy8gLS0tLS0gTG9vayBpZiBwcmVzZW50DQogICAgICAgICAgICBpZiAoIWlzc2V0KCRwX2ZpbGVfbGlzdFska2V5XSkpIHsNCiAgICAgICAgICAgICAgUGNsWmlwOjpwcml2RXJyb3JMb2coUENMWklQX0VSUl9JTlZBTElEX1BBUkFNRVRFUiwgIk1pc3NpbmcgbWFuZGF0b3J5IHBhcmFtZXRlciAiLlBjbFppcFV0aWxPcHRpb25UZXh0KCRrZXkpLiIoIi4ka2V5LiIpIik7DQogICAgICAgICAgICAgIHJldHVybiBQY2xaaXA6OmVycm9yQ29kZSgpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgfQ0KICAgIA0KICAgIC8vIGVuZCBmb3JlYWNoDQogICAgfQ0KICAgIA0KICAgIC8vIC0tLS0tIFJldHVybg0KICAgIHJldHVybiAkdl9yZXN1bHQ7DQogIH0NCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICAvLyBGdW5jdGlvbiA6IHByaXZGaWxlRGVzY3JFeHBhbmQoKQ0KICAvLyBEZXNjcmlwdGlvbiA6DQogIC8vICAgVGhpcyBtZXRob2QgbG9vayBmb3IgZWFjaCBpdGVtIG9mIHRoZSBsaXN0IHRvIHNlZSBpZiBpdHMgYSBmaWxlLCBhIGZvbGRlcg0KICAvLyAgIG9yIGEgc3RyaW5nIHRvIGJlIGFkZGVkIGFzIGZpbGUuIEZvciBhbnkgb3RoZXIgdHlwZSBvZiBmaWxlcyAobGluaywgb3RoZXIpDQogIC8vICAganVzdCBpZ25vcmUgdGhlIGl0ZW0uDQogIC8vICAgVGhlbiBwcmVwYXJlIHRoZSBpbmZvcm1hdGlvbiB0aGF0IHdpbGwgYmUgc3RvcmVkIGZvciB0aGF0IGZpbGUuDQogIC8vICAgV2hlbiBpdHMgYSBmb2xkZXIsIGV4cGFuZCB0aGUgZm9sZGVyIHdpdGggYWxsIHRoZSBmaWxlcyB0aGF0IGFyZSBpbiB0aGF0IA0KICAvLyAgIGZvbGRlciAocmVjdXJzaXZlbHkpLg0KICAvLyBQYXJhbWV0ZXJzIDoNCiAgLy8gUmV0dXJuIFZhbHVlcyA6DQogIC8vICAgMSBvbiBzdWNjZXNzLg0KICAvLyAgIDAgb24gZmFpbHVyZS4NCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAgZnVuY3Rpb24gcHJpdkZpbGVEZXNjckV4cGFuZCgmJHBfZmlsZWRlc2NyX2xpc3QsICYkcF9vcHRpb25zKQ0KICB7DQogICAgJHZfcmVzdWx0PTE7DQogICAgDQogICAgLy8gLS0tLS0gQ3JlYXRlIGEgcmVzdWx0IGxpc3QNCiAgICAkdl9yZXN1bHRfbGlzdCA9IGFycmF5KCk7DQogICAgDQogICAgLy8gLS0tLS0gTG9vayBlYWNoIGVudHJ5DQogICAgZm9yICgkaT0wOyAkaTxzaXplb2YoJHBfZmlsZWRlc2NyX2xpc3QpOyAkaSsrKSB7DQogICAgICANCiAgICAgIC8vIC0tLS0tIEdldCBmaWxlZGVzY3INCiAgICAgICR2X2Rlc2NyID0gJHBfZmlsZWRlc2NyX2xpc3RbJGldOw0KICAgICAgDQogICAgICAvLyAtLS0tLSBSZWR1Y2UgdGhlIGZpbGVuYW1lDQogICAgICAkdl9kZXNjclsnZmlsZW5hbWUnXSA9IFBjbFppcFV0aWxUcmFuc2xhdGVXaW5QYXRoKCR2X2Rlc2NyWydmaWxlbmFtZSddLCBmYWxzZSk7DQogICAgICAkdl9kZXNjclsnZmlsZW5hbWUnXSA9IFBjbFppcFV0aWxQYXRoUmVkdWN0aW9uKCR2X2Rlc2NyWydmaWxlbmFtZSddKTsNCiAgICAgIA0KICAgICAgLy8gLS0tLS0gTG9vayBmb3IgcmVhbCBmaWxlIG9yIGZvbGRlcg0KICAgICAgaWYgKGZpbGVfZXhpc3RzKCR2X2Rlc2NyWydmaWxlbmFtZSddKSkgew0KICAgICAgICBpZiAoQGlzX2ZpbGUoJHZfZGVzY3JbJ2ZpbGVuYW1lJ10pKSB7DQogICAgICAgICAgJHZfZGVzY3JbJ3R5cGUnXSA9ICdmaWxlJzsNCiAgICAgICAgfQ0KICAgICAgICBlbHNlIGlmIChAaXNfZGlyKCR2X2Rlc2NyWydmaWxlbmFtZSddKSkgew0KICAgICAgICAgICR2X2Rlc2NyWyd0eXBlJ10gPSAnZm9sZGVyJzsNCiAgICAgICAgfQ0KICAgICAgICBlbHNlIGlmIChAaXNfbGluaygkdl9kZXNjclsnZmlsZW5hbWUnXSkpIHsNCiAgICAgICAgICAvLyBza2lwDQogICAgICAgICAgY29udGludWU7DQogICAgICAgIH0NCiAgICAgICAgZWxzZSB7DQogICAgICAgICAgLy8gc2tpcA0KICAgICAgICAgIGNvbnRpbnVlOw0KICAgICAgICB9DQogICAgICB9DQogICAgICANCiAgICAgIC8vIC0tLS0tIExvb2sgZm9yIHN0cmluZyBhZGRlZCBhcyBmaWxlDQogICAgICBlbHNlIGlmIChpc3NldCgkdl9kZXNjclsnY29udGVudCddKSkgew0KICAgICAgICAkdl9kZXNjclsndHlwZSddID0gJ3ZpcnR1YWxfZmlsZSc7DQogICAgICB9DQogICAgICANCiAgICAgIC8vIC0tLS0tIE1pc3NpbmcgZmlsZQ0KICAgICAgZWxzZSB7DQogICAgICAgIC8vIC0tLS0tIEVycm9yIGxvZw0KICAgICAgICBQY2xaaXA6OnByaXZFcnJvckxvZyhQQ0xaSVBfRVJSX01JU1NJTkdfRklMRSwgIkZpbGUgJyIuJHZfZGVzY3JbJ2ZpbGVuYW1lJ10uIicgZG9lcyBub3QgZXhpc3QiKTsNCg0KICAgICAgICAvLyAtLS0tLSBSZXR1cm4NCiAgICAgICAgcmV0dXJuIFBjbFppcDo6ZXJyb3JDb2RlKCk7DQogICAgICB9DQogICAgICANCiAgICAgIC8vIC0tLS0tIENhbGN1bGF0ZSB0aGUgc3RvcmVkIGZpbGVuYW1lDQogICAgICAkdGhpcy0+cHJpdkNhbGN1bGF0ZVN0b3JlZEZpbGVuYW1lKCR2X2Rlc2NyLCAkcF9vcHRpb25zKTsNCiAgICAgIA0KICAgICAgLy8gLS0tLS0gQWRkIHRoZSBkZXNjcmlwdG9yIGluIHJlc3VsdCBsaXN0DQogICAgICAkdl9yZXN1bHRfbGlzdFtzaXplb2YoJHZfcmVzdWx0X2xpc3QpXSA9ICR2X2Rlc2NyOw0KICAgICAgDQogICAgICAvLyAtLS0tLSBMb29rIGZvciBmb2xkZXINCiAgICAgIGlmICgkdl9kZXNjclsndHlwZSddID09ICdmb2xkZXInKSB7DQogICAgICAgIC8vIC0tLS0tIExpc3Qgb2YgaXRlbXMgaW4gZm9sZGVyDQogICAgICAgICR2X2Rpcmxpc3RfZGVzY3IgPSBhcnJheSgpOw0KICAgICAgICAkdl9kaXJsaXN0X25iID0gMDsNCiAgICAgICAgaWYgKCR2X2ZvbGRlcl9oYW5kbGVyID0gQG9wZW5kaXIoJHZfZGVzY3JbJ2ZpbGVuYW1lJ10pKSB7DQogICAgICAgICAgd2hpbGUgKCgkdl9pdGVtX2hhbmRsZXIgPSBAcmVhZGRpcigkdl9mb2xkZXJfaGFuZGxlcikpICE9PSBmYWxzZSkgew0KDQogICAgICAgICAgICAvLyAtLS0tLSBTa2lwICcuJyBhbmQgJy4uJw0KICAgICAgICAgICAgaWYgKCgkdl9pdGVtX2hhbmRsZXIgPT0gJy4nKSB8fCAoJHZfaXRlbV9oYW5kbGVyID09ICcuLicpKSB7DQogICAgICAgICAgICAgICAgY29udGludWU7DQogICAgICAgICAgICB9DQogICAgICAgICAgICANCiAgICAgICAgICAgIC8vIC0tLS0tIENvbXBvc2UgdGhlIGZ1bGwgZmlsZW5hbWUNCiAgICAgICAgICAgICR2X2Rpcmxpc3RfZGVzY3JbJHZfZGlybGlzdF9uYl1bJ2ZpbGVuYW1lJ10gPSAkdl9kZXNjclsnZmlsZW5hbWUnXS4nLycuJHZfaXRlbV9oYW5kbGVyOw0KICAgICAgICAgICAgDQogICAgICAgICAgICAvLyAtLS0tLSBMb29rIGZvciBkaWZmZXJlbnQgc3RvcmVkIGZpbGVuYW1lDQogICAgICAgICAgICAvLyBCZWNhdXNlIHRoZSBuYW1lIG9mIHRoZSBmb2xkZXIgd2FzIGNoYW5nZWQsIHRoZSBuYW1lIG9mIHRoZQ0KICAgICAgICAgICAgLy8gZmlsZXMvc3ViLWZvbGRlcnMgYWxzbyBjaGFuZ2UNCiAgICAgICAgICAgIGlmICgoJHZfZGVzY3JbJ3N0b3JlZF9maWxlbmFtZSddICE9ICR2X2Rlc2NyWydmaWxlbmFtZSddKQ0KICAgICAgICAgICAgICAgICAmJiAoIWlzc2V0KCRwX29wdGlvbnNbUENMWklQX09QVF9SRU1PVkVfQUxMX1BBVEhdKSkpIHsNCiAgICAgICAgICAgICAgaWYgKCR2X2Rlc2NyWydzdG9yZWRfZmlsZW5hbWUnXSAhPSAnJykgew0KICAgICAgICAgICAgICAgICR2X2Rpcmxpc3RfZGVzY3JbJHZfZGlybGlzdF9uYl1bJ25ld19mdWxsX25hbWUnXSA9ICR2X2Rlc2NyWydzdG9yZWRfZmlsZW5hbWUnXS4nLycuJHZfaXRlbV9oYW5kbGVyOw0KICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgICAgICR2X2Rpcmxpc3RfZGVzY3JbJHZfZGlybGlzdF9uYl1bJ25ld19mdWxsX25hbWUnXSA9ICR2X2l0ZW1faGFuZGxlcjsNCiAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgDQogICAgICAgICAgICAkdl9kaXJsaXN0X25iKys7DQogICAgICAgICAgfQ0KICAgICAgICAgIA0KICAgICAgICAgIEBjbG9zZWRpcigkdl9mb2xkZXJfaGFuZGxlcik7DQogICAgICAgIH0NCiAgICAgICAgZWxzZSB7DQogICAgICAgICAgLy8gVEJDIDogdW5hYmxlIHRvIG9wZW4gZm9sZGVyIGluIHJlYWQgbW9kZQ0KICAgICAgICB9DQogICAgICAgIA0KICAgICAgICAvLyAtLS0tLSBFeHBhbmQgZWFjaCBlbGVtZW50IG9mIHRoZSBsaXN0DQogICAgICAgIGlmICgkdl9kaXJsaXN0X25iICE9IDApIHsNCiAgICAgICAgICAvLyAtLS0tLSBFeHBhbmQNCiAgICAgICAgICBpZiAoKCR2X3Jlc3VsdCA9ICR0aGlzLT5wcml2RmlsZURlc2NyRXhwYW5kKCR2X2Rpcmxpc3RfZGVzY3IsICRwX29wdGlvbnMpKSAhPSAxKSB7DQogICAgICAgICAgICByZXR1cm4gJHZfcmVzdWx0Ow0KICAgICAgICAgIH0NCiAgICAgICAgICANCiAgICAgICAgICAvLyAtLS0tLSBDb25jYXQgdGhlIHJlc3VsdGluZyBsaXN0DQogICAgICAgICAgJHZfcmVzdWx0X2xpc3QgPSBhcnJheV9tZXJnZSgkdl9yZXN1bHRfbGlzdCwgJHZfZGlybGlzdF9kZXNjcik7DQogICAgICAgIH0NCiAgICAgICAgZWxzZSB7DQogICAgICAgIH0NCiAgICAgICAgICANCiAgICAgICAgLy8gLS0tLS0gRnJlZSBsb2NhbCBhcnJheQ0KICAgICAgICB1bnNldCgkdl9kaXJsaXN0X2Rlc2NyKTsNCiAgICAgIH0NCiAgICB9DQogICAgDQogICAgLy8gLS0tLS0gR2V0IHRoZSByZXN1bHQgbGlzdA0KICAgICRwX2ZpbGVkZXNjcl9saXN0ID0gJHZfcmVzdWx0X2xpc3Q7DQoNCiAgICAvLyAtLS0tLSBSZXR1cm4NCiAgICByZXR1cm4gJHZfcmVzdWx0Ow0KICB9DQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAgLy8gRnVuY3Rpb24gOiBwcml2Q3JlYXRlKCkNCiAgLy8gRGVzY3JpcHRpb24gOg0KICAvLyBQYXJhbWV0ZXJzIDoNCiAgLy8gUmV0dXJuIFZhbHVlcyA6DQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogIGZ1bmN0aW9uIHByaXZDcmVhdGUoJHBfZmlsZWRlc2NyX2xpc3QsICYkcF9yZXN1bHRfbGlzdCwgJiRwX29wdGlvbnMpDQogIHsNCiAgICAkdl9yZXN1bHQ9MTsNCiAgICAkdl9saXN0X2RldGFpbCA9IGFycmF5KCk7DQogICAgDQogICAgLy8gLS0tLS0gTWFnaWMgcXVvdGVzIHRyaWNrDQogICAgJHRoaXMtPnByaXZEaXNhYmxlTWFnaWNRdW90ZXMoKTsNCg0KICAgIC8vIC0tLS0tIE9wZW4gdGhlIGZpbGUgaW4gd3JpdGUgbW9kZQ0KICAgIGlmICgoJHZfcmVzdWx0ID0gJHRoaXMtPnByaXZPcGVuRmQoJ3diJykpICE9IDEpDQogICAgew0KICAgICAgLy8gLS0tLS0gUmV0dXJuDQogICAgICByZXR1cm4gJHZfcmVzdWx0Ow0KICAgIH0NCg0KICAgIC8vIC0tLS0tIEFkZCB0aGUgbGlzdCBvZiBmaWxlcw0KICAgICR2X3Jlc3VsdCA9ICR0aGlzLT5wcml2QWRkTGlzdCgkcF9maWxlZGVzY3JfbGlzdCwgJHBfcmVzdWx0X2xpc3QsICRwX29wdGlvbnMpOw0KDQogICAgLy8gLS0tLS0gQ2xvc2UNCiAgICAkdGhpcy0+cHJpdkNsb3NlRmQoKTsNCg0KICAgIC8vIC0tLS0tIE1hZ2ljIHF1b3RlcyB0cmljaw0KICAgICR0aGlzLT5wcml2U3dhcEJhY2tNYWdpY1F1b3RlcygpOw0KDQogICAgLy8gLS0tLS0gUmV0dXJuDQogICAgcmV0dXJuICR2X3Jlc3VsdDsNCiAgfQ0KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogIC8vIEZ1bmN0aW9uIDogcHJpdkFkZCgpDQogIC8vIERlc2NyaXB0aW9uIDoNCiAgLy8gUGFyYW1ldGVycyA6DQogIC8vIFJldHVybiBWYWx1ZXMgOg0KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICBmdW5jdGlvbiBwcml2QWRkKCRwX2ZpbGVkZXNjcl9saXN0LCAmJHBfcmVzdWx0X2xpc3QsICYkcF9vcHRpb25zKQ0KICB7DQogICAgJHZfcmVzdWx0PTE7DQogICAgJHZfbGlzdF9kZXRhaWwgPSBhcnJheSgpOw0KDQogICAgLy8gLS0tLS0gTG9vayBpZiB0aGUgYXJjaGl2ZSBleGlzdHMgb3IgaXMgZW1wdHkNCiAgICBpZiAoKCFpc19maWxlKCR0aGlzLT56aXBuYW1lKSkgfHwgKGZpbGVzaXplKCR0aGlzLT56aXBuYW1lKSA9PSAwKSkNCiAgICB7DQoNCiAgICAgIC8vIC0tLS0tIERvIGEgY3JlYXRlDQogICAgICAkdl9yZXN1bHQgPSAkdGhpcy0+cHJpdkNyZWF0ZSgkcF9maWxlZGVzY3JfbGlzdCwgJHBfcmVzdWx0X2xpc3QsICRwX29wdGlvbnMpOw0KDQogICAgICAvLyAtLS0tLSBSZXR1cm4NCiAgICAgIHJldHVybiAkdl9yZXN1bHQ7DQogICAgfQ0KICAgIC8vIC0tLS0tIE1hZ2ljIHF1b3RlcyB0cmljaw0KICAgICR0aGlzLT5wcml2RGlzYWJsZU1hZ2ljUXVvdGVzKCk7DQoNCiAgICAvLyAtLS0tLSBPcGVuIHRoZSB6aXAgZmlsZQ0KICAgIGlmICgoJHZfcmVzdWx0PSR0aGlzLT5wcml2T3BlbkZkKCdyYicpKSAhPSAxKQ0KICAgIHsNCiAgICAgIC8vIC0tLS0tIE1hZ2ljIHF1b3RlcyB0cmljaw0KICAgICAgJHRoaXMtPnByaXZTd2FwQmFja01hZ2ljUXVvdGVzKCk7DQoNCiAgICAgIC8vIC0tLS0tIFJldHVybg0KICAgICAgcmV0dXJuICR2X3Jlc3VsdDsNCiAgICB9DQoNCiAgICAvLyAtLS0tLSBSZWFkIHRoZSBjZW50cmFsIGRpcmVjdG9yeSBpbmZvcm1hdGlvbnMNCiAgICAkdl9jZW50cmFsX2RpciA9IGFycmF5KCk7DQogICAgaWYgKCgkdl9yZXN1bHQgPSAkdGhpcy0+cHJpdlJlYWRFbmRDZW50cmFsRGlyKCR2X2NlbnRyYWxfZGlyKSkgIT0gMSkNCiAgICB7DQogICAgICAkdGhpcy0+cHJpdkNsb3NlRmQoKTsNCiAgICAgICR0aGlzLT5wcml2U3dhcEJhY2tNYWdpY1F1b3RlcygpOw0KICAgICAgcmV0dXJuICR2X3Jlc3VsdDsNCiAgICB9DQoNCiAgICAvLyAtLS0tLSBHbyB0byBiZWdpbm5pbmcgb2YgRmlsZQ0KICAgIEByZXdpbmQoJHRoaXMtPnppcF9mZCk7DQoNCiAgICAvLyAtLS0tLSBDcmVhdGVzIGEgdGVtcG9yYXkgZmlsZQ0KICAgICR2X3ppcF90ZW1wX25hbWUgPSBQQ0xaSVBfVEVNUE9SQVJZX0RJUi51bmlxaWQoJ3BjbHppcC0nKS4nLnRtcCc7DQoNCiAgICAvLyAtLS0tLSBPcGVuIHRoZSB0ZW1wb3JhcnkgZmlsZSBpbiB3cml0ZSBtb2RlDQogICAgaWYgKCgkdl96aXBfdGVtcF9mZCA9IEBmb3Blbigkdl96aXBfdGVtcF9uYW1lLCAnd2InKSkgPT0gMCkNCiAgICB7DQogICAgICAkdGhpcy0+cHJpdkNsb3NlRmQoKTsNCiAgICAgICR0aGlzLT5wcml2U3dhcEJhY2tNYWdpY1F1b3RlcygpOw0KDQogICAgICBQY2xaaXA6OnByaXZFcnJvckxvZyhQQ0xaSVBfRVJSX1JFQURfT1BFTl9GQUlMLCAnVW5hYmxlIHRvIG9wZW4gdGVtcG9yYXJ5IGZpbGUgXCcnLiR2X3ppcF90ZW1wX25hbWUuJ1wnIGluIGJpbmFyeSB3cml0ZSBtb2RlJyk7DQoNCiAgICAgIC8vIC0tLS0tIFJldHVybg0KICAgICAgcmV0dXJuIFBjbFppcDo6ZXJyb3JDb2RlKCk7DQogICAgfQ0KDQogICAgLy8gLS0tLS0gQ29weSB0aGUgZmlsZXMgZnJvbSB0aGUgYXJjaGl2ZSB0byB0aGUgdGVtcG9yYXJ5IGZpbGUNCiAgICAvLyBUQkMgOiBIZXJlIEkgc2hvdWxkIGJldHRlciBhcHBlbmQgdGhlIGZpbGUgYW5kIGdvIGJhY2sgdG8gZXJhc2UgdGhlIGNlbnRyYWwgZGlyDQogICAgJHZfc2l6ZSA9ICR2X2NlbnRyYWxfZGlyWydvZmZzZXQnXTsNCiAgICB3aGlsZSAoJHZfc2l6ZSAhPSAwKQ0KICAgIHsNCiAgICAgICR2X3JlYWRfc2l6ZSA9ICgkdl9zaXplIDwgUENMWklQX1JFQURfQkxPQ0tfU0laRSA/ICR2X3NpemUgOiBQQ0xaSVBfUkVBRF9CTE9DS19TSVpFKTsNCiAgICAgICR2X2J1ZmZlciA9IGZyZWFkKCR0aGlzLT56aXBfZmQsICR2X3JlYWRfc2l6ZSk7DQogICAgICBAZndyaXRlKCR2X3ppcF90ZW1wX2ZkLCAkdl9idWZmZXIsICR2X3JlYWRfc2l6ZSk7DQogICAgICAkdl9zaXplIC09ICR2X3JlYWRfc2l6ZTsNCiAgICB9DQoNCiAgICAvLyAtLS0tLSBTd2FwIHRoZSBmaWxlIGRlc2NyaXB0b3INCiAgICAvLyBIZXJlIGlzIGEgdHJpY2sgOiBJIHN3YXAgdGhlIHRlbXBvcmFyeSBmZCB3aXRoIHRoZSB6aXAgZmQsIGluIG9yZGVyIHRvIHVzZQ0KICAgIC8vIHRoZSBmb2xsb3dpbmcgbWV0aG9kcyBvbiB0aGUgdGVtcG9yYXJ5IGZpbCBhbmQgbm90IHRoZSByZWFsIGFyY2hpdmUNCiAgICAkdl9zd2FwID0gJHRoaXMtPnppcF9mZDsNCiAgICAkdGhpcy0+emlwX2ZkID0gJHZfemlwX3RlbXBfZmQ7DQogICAgJHZfemlwX3RlbXBfZmQgPSAkdl9zd2FwOw0KDQogICAgLy8gLS0tLS0gQWRkIHRoZSBmaWxlcw0KICAgICR2X2hlYWRlcl9saXN0ID0gYXJyYXkoKTsNCiAgICBpZiAoKCR2X3Jlc3VsdCA9ICR0aGlzLT5wcml2QWRkRmlsZUxpc3QoJHBfZmlsZWRlc2NyX2xpc3QsICR2X2hlYWRlcl9saXN0LCAkcF9vcHRpb25zKSkgIT0gMSkNCiAgICB7DQogICAgICBmY2xvc2UoJHZfemlwX3RlbXBfZmQpOw0KICAgICAgJHRoaXMtPnByaXZDbG9zZUZkKCk7DQogICAgICBAdW5saW5rKCR2X3ppcF90ZW1wX25hbWUpOw0KICAgICAgJHRoaXMtPnByaXZTd2FwQmFja01hZ2ljUXVvdGVzKCk7DQoNCiAgICAgIC8vIC0tLS0tIFJldHVybg0KICAgICAgcmV0dXJuICR2X3Jlc3VsdDsNCiAgICB9DQoNCiAgICAvLyAtLS0tLSBTdG9yZSB0aGUgb2Zmc2V0IG9mIHRoZSBjZW50cmFsIGRpcg0KICAgICR2X29mZnNldCA9IEBmdGVsbCgkdGhpcy0+emlwX2ZkKTsNCg0KICAgIC8vIC0tLS0tIENvcHkgdGhlIGJsb2NrIG9mIGZpbGUgaGVhZGVycyBmcm9tIHRoZSBvbGQgYXJjaGl2ZQ0KICAgICR2X3NpemUgPSAkdl9jZW50cmFsX2Rpclsnc2l6ZSddOw0KICAgIHdoaWxlICgkdl9zaXplICE9IDApDQogICAgew0KICAgICAgJHZfcmVhZF9zaXplID0gKCR2X3NpemUgPCBQQ0xaSVBfUkVBRF9CTE9DS19TSVpFID8gJHZfc2l6ZSA6IFBDTFpJUF9SRUFEX0JMT0NLX1NJWkUpOw0KICAgICAgJHZfYnVmZmVyID0gQGZyZWFkKCR2X3ppcF90ZW1wX2ZkLCAkdl9yZWFkX3NpemUpOw0KICAgICAgQGZ3cml0ZSgkdGhpcy0+emlwX2ZkLCAkdl9idWZmZXIsICR2X3JlYWRfc2l6ZSk7DQogICAgICAkdl9zaXplIC09ICR2X3JlYWRfc2l6ZTsNCiAgICB9DQoNCiAgICAvLyAtLS0tLSBDcmVhdGUgdGhlIENlbnRyYWwgRGlyIGZpbGVzIGhlYWRlcg0KICAgIGZvciAoJGk9MCwgJHZfY291bnQ9MDsgJGk8c2l6ZW9mKCR2X2hlYWRlcl9saXN0KTsgJGkrKykNCiAgICB7DQogICAgICAvLyAtLS0tLSBDcmVhdGUgdGhlIGZpbGUgaGVhZGVyDQogICAgICBpZiAoJHZfaGVhZGVyX2xpc3RbJGldWydzdGF0dXMnXSA9PSAnb2snKSB7DQogICAgICAgIGlmICgoJHZfcmVzdWx0ID0gJHRoaXMtPnByaXZXcml0ZUNlbnRyYWxGaWxlSGVhZGVyKCR2X2hlYWRlcl9saXN0WyRpXSkpICE9IDEpIHsNCiAgICAgICAgICBmY2xvc2UoJHZfemlwX3RlbXBfZmQpOw0KICAgICAgICAgICR0aGlzLT5wcml2Q2xvc2VGZCgpOw0KICAgICAgICAgIEB1bmxpbmsoJHZfemlwX3RlbXBfbmFtZSk7DQogICAgICAgICAgJHRoaXMtPnByaXZTd2FwQmFja01hZ2ljUXVvdGVzKCk7DQoNCiAgICAgICAgICAvLyAtLS0tLSBSZXR1cm4NCiAgICAgICAgICByZXR1cm4gJHZfcmVzdWx0Ow0KICAgICAgICB9DQogICAgICAgICR2X2NvdW50Kys7DQogICAgICB9DQoNCiAgICAgIC8vIC0tLS0tIFRyYW5zZm9ybSB0aGUgaGVhZGVyIHRvIGEgJ3VzYWJsZScgaW5mbw0KICAgICAgJHRoaXMtPnByaXZDb252ZXJ0SGVhZGVyMkZpbGVJbmZvKCR2X2hlYWRlcl9saXN0WyRpXSwgJHBfcmVzdWx0X2xpc3RbJGldKTsNCiAgICB9DQoNCiAgICAvLyAtLS0tLSBaaXAgZmlsZSBjb21tZW50DQogICAgJHZfY29tbWVudCA9ICR2X2NlbnRyYWxfZGlyWydjb21tZW50J107DQogICAgaWYgKGlzc2V0KCRwX29wdGlvbnNbUENMWklQX09QVF9DT01NRU5UXSkpIHsNCiAgICAgICR2X2NvbW1lbnQgPSAkcF9vcHRpb25zW1BDTFpJUF9PUFRfQ09NTUVOVF07DQogICAgfQ0KICAgIGlmIChpc3NldCgkcF9vcHRpb25zW1BDTFpJUF9PUFRfQUREX0NPTU1FTlRdKSkgew0KICAgICAgJHZfY29tbWVudCA9ICR2X2NvbW1lbnQuJHBfb3B0aW9uc1tQQ0xaSVBfT1BUX0FERF9DT01NRU5UXTsNCiAgICB9DQogICAgaWYgKGlzc2V0KCRwX29wdGlvbnNbUENMWklQX09QVF9QUkVQRU5EX0NPTU1FTlRdKSkgew0KICAgICAgJHZfY29tbWVudCA9ICRwX29wdGlvbnNbUENMWklQX09QVF9QUkVQRU5EX0NPTU1FTlRdLiR2X2NvbW1lbnQ7DQogICAgfQ0KDQogICAgLy8gLS0tLS0gQ2FsY3VsYXRlIHRoZSBzaXplIG9mIHRoZSBjZW50cmFsIGhlYWRlcg0KICAgICR2X3NpemUgPSBAZnRlbGwoJHRoaXMtPnppcF9mZCktJHZfb2Zmc2V0Ow0KDQogICAgLy8gLS0tLS0gQ3JlYXRlIHRoZSBjZW50cmFsIGRpciBmb290ZXINCiAgICBpZiAoKCR2X3Jlc3VsdCA9ICR0aGlzLT5wcml2V3JpdGVDZW50cmFsSGVhZGVyKCR2X2NvdW50KyR2X2NlbnRyYWxfZGlyWydlbnRyaWVzJ10sICR2X3NpemUsICR2X29mZnNldCwgJHZfY29tbWVudCkpICE9IDEpDQogICAgew0KICAgICAgLy8gLS0tLS0gUmVzZXQgdGhlIGZpbGUgbGlzdA0KICAgICAgdW5zZXQoJHZfaGVhZGVyX2xpc3QpOw0KICAgICAgJHRoaXMtPnByaXZTd2FwQmFja01hZ2ljUXVvdGVzKCk7DQoNCiAgICAgIC8vIC0tLS0tIFJldHVybg0KICAgICAgcmV0dXJuICR2X3Jlc3VsdDsNCiAgICB9DQoNCiAgICAvLyAtLS0tLSBTd2FwIGJhY2sgdGhlIGZpbGUgZGVzY3JpcHRvcg0KICAgICR2X3N3YXAgPSAkdGhpcy0+emlwX2ZkOw0KICAgICR0aGlzLT56aXBfZmQgPSAkdl96aXBfdGVtcF9mZDsNCiAgICAkdl96aXBfdGVtcF9mZCA9ICR2X3N3YXA7DQoNCiAgICAvLyAtLS0tLSBDbG9zZQ0KICAgICR0aGlzLT5wcml2Q2xvc2VGZCgpOw0KDQogICAgLy8gLS0tLS0gQ2xvc2UgdGhlIHRlbXBvcmFyeSBmaWxlDQogICAgQGZjbG9zZSgkdl96aXBfdGVtcF9mZCk7DQoNCiAgICAvLyAtLS0tLSBNYWdpYyBxdW90ZXMgdHJpY2sNCiAgICAkdGhpcy0+cHJpdlN3YXBCYWNrTWFnaWNRdW90ZXMoKTsNCg0KICAgIC8vIC0tLS0tIERlbGV0ZSB0aGUgemlwIGZpbGUNCiAgICAvLyBUQkMgOiBJIHNob3VsZCB0ZXN0IHRoZSByZXN1bHQgLi4uDQogICAgQHVubGluaygkdGhpcy0+emlwbmFtZSk7DQoNCiAgICAvLyAtLS0tLSBSZW5hbWUgdGhlIHRlbXBvcmFyeSBmaWxlDQogICAgLy8gVEJDIDogSSBzaG91bGQgdGVzdCB0aGUgcmVzdWx0IC4uLg0KICAgIC8vQHJlbmFtZSgkdl96aXBfdGVtcF9uYW1lLCAkdGhpcy0+emlwbmFtZSk7DQogICAgUGNsWmlwVXRpbFJlbmFtZSgkdl96aXBfdGVtcF9uYW1lLCAkdGhpcy0+emlwbmFtZSk7DQoNCiAgICAvLyAtLS0tLSBSZXR1cm4NCiAgICByZXR1cm4gJHZfcmVzdWx0Ow0KICB9DQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAgLy8gRnVuY3Rpb24gOiBwcml2T3BlbkZkKCkNCiAgLy8gRGVzY3JpcHRpb24gOg0KICAvLyBQYXJhbWV0ZXJzIDoNCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAgZnVuY3Rpb24gcHJpdk9wZW5GZCgkcF9tb2RlKQ0KICB7DQogICAgJHZfcmVzdWx0PTE7DQoNCiAgICAvLyAtLS0tLSBMb29rIGlmIGFscmVhZHkgb3Blbg0KICAgIGlmICgkdGhpcy0+emlwX2ZkICE9IDApDQogICAgew0KICAgICAgLy8gLS0tLS0gRXJyb3IgbG9nDQogICAgICBQY2xaaXA6OnByaXZFcnJvckxvZyhQQ0xaSVBfRVJSX1JFQURfT1BFTl9GQUlMLCAnWmlwIGZpbGUgXCcnLiR0aGlzLT56aXBuYW1lLidcJyBhbHJlYWR5IG9wZW4nKTsNCg0KICAgICAgLy8gLS0tLS0gUmV0dXJuDQogICAgICByZXR1cm4gUGNsWmlwOjplcnJvckNvZGUoKTsNCiAgICB9DQoNCiAgICAvLyAtLS0tLSBPcGVuIHRoZSB6aXAgZmlsZQ0KICAgIGlmICgoJHRoaXMtPnppcF9mZCA9IEBmb3BlbigkdGhpcy0+emlwbmFtZSwgJHBfbW9kZSkpID09IDApDQogICAgew0KICAgICAgLy8gLS0tLS0gRXJyb3IgbG9nDQogICAgICBQY2xaaXA6OnByaXZFcnJvckxvZyhQQ0xaSVBfRVJSX1JFQURfT1BFTl9GQUlMLCAnVW5hYmxlIHRvIG9wZW4gYXJjaGl2ZSBcJycuJHRoaXMtPnppcG5hbWUuJ1wnIGluICcuJHBfbW9kZS4nIG1vZGUnKTsNCg0KICAgICAgLy8gLS0tLS0gUmV0dXJuDQogICAgICByZXR1cm4gUGNsWmlwOjplcnJvckNvZGUoKTsNCiAgICB9DQoNCiAgICAvLyAtLS0tLSBSZXR1cm4NCiAgICByZXR1cm4gJHZfcmVzdWx0Ow0KICB9DQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAgLy8gRnVuY3Rpb24gOiBwcml2Q2xvc2VGZCgpDQogIC8vIERlc2NyaXB0aW9uIDoNCiAgLy8gUGFyYW1ldGVycyA6DQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogIGZ1bmN0aW9uIHByaXZDbG9zZUZkKCkNCiAgew0KICAgICR2X3Jlc3VsdD0xOw0KDQogICAgaWYgKCR0aGlzLT56aXBfZmQgIT0gMCkNCiAgICAgIEBmY2xvc2UoJHRoaXMtPnppcF9mZCk7DQogICAgJHRoaXMtPnppcF9mZCA9IDA7DQoNCiAgICAvLyAtLS0tLSBSZXR1cm4NCiAgICByZXR1cm4gJHZfcmVzdWx0Ow0KICB9DQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAgLy8gRnVuY3Rpb24gOiBwcml2QWRkTGlzdCgpDQogIC8vIERlc2NyaXB0aW9uIDoNCiAgLy8gICAkcF9hZGRfZGlyIGFuZCAkcF9yZW1vdmVfZGlyIHdpbGwgZ2l2ZSB0aGUgYWJpbGl0eSB0byBtZW1vcml6ZSBhIHBhdGggd2hpY2ggaXMNCiAgLy8gICBkaWZmZXJlbnQgZnJvbSB0aGUgcmVhbCBwYXRoIG9mIHRoZSBmaWxlLiBUaGlzIGlzIHVzZWZ1bGwgaWYgeW91IHdhbnQgdG8gaGF2ZSBQY2xUYXINCiAgLy8gICBydW5uaW5nIGluIGFueSBkaXJlY3RvcnksIGFuZCBtZW1vcml6ZSByZWxhdGl2ZSBwYXRoIGZyb20gYW4gb3RoZXIgZGlyZWN0b3J5Lg0KICAvLyBQYXJhbWV0ZXJzIDoNCiAgLy8gICAkcF9saXN0IDogQW4gYXJyYXkgY29udGFpbmluZyB0aGUgZmlsZSBvciBkaXJlY3RvcnkgbmFtZXMgdG8gYWRkIGluIHRoZSB0YXINCiAgLy8gICAkcF9yZXN1bHRfbGlzdCA6IGxpc3Qgb2YgYWRkZWQgZmlsZXMgd2l0aCB0aGVpciBwcm9wZXJ0aWVzIChzcGVjaWFsbHkgdGhlIHN0YXR1cyBmaWVsZCkNCiAgLy8gICAkcF9hZGRfZGlyIDogUGF0aCB0byBhZGQgaW4gdGhlIGZpbGVuYW1lIHBhdGggYXJjaGl2ZWQNCiAgLy8gICAkcF9yZW1vdmVfZGlyIDogUGF0aCB0byByZW1vdmUgaW4gdGhlIGZpbGVuYW1lIHBhdGggYXJjaGl2ZWQNCiAgLy8gUmV0dXJuIFZhbHVlcyA6DQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyAgZnVuY3Rpb24gcHJpdkFkZExpc3QoJHBfbGlzdCwgJiRwX3Jlc3VsdF9saXN0LCAkcF9hZGRfZGlyLCAkcF9yZW1vdmVfZGlyLCAkcF9yZW1vdmVfYWxsX2RpciwgJiRwX29wdGlvbnMpDQogIGZ1bmN0aW9uIHByaXZBZGRMaXN0KCRwX2ZpbGVkZXNjcl9saXN0LCAmJHBfcmVzdWx0X2xpc3QsICYkcF9vcHRpb25zKQ0KICB7DQogICAgJHZfcmVzdWx0PTE7DQoNCiAgICAvLyAtLS0tLSBBZGQgdGhlIGZpbGVzDQogICAgJHZfaGVhZGVyX2xpc3QgPSBhcnJheSgpOw0KICAgIGlmICgoJHZfcmVzdWx0ID0gJHRoaXMtPnByaXZBZGRGaWxlTGlzdCgkcF9maWxlZGVzY3JfbGlzdCwgJHZfaGVhZGVyX2xpc3QsICRwX29wdGlvbnMpKSAhPSAxKQ0KICAgIHsNCiAgICAgIC8vIC0tLS0tIFJldHVybg0KICAgICAgcmV0dXJuICR2X3Jlc3VsdDsNCiAgICB9DQoNCiAgICAvLyAtLS0tLSBTdG9yZSB0aGUgb2Zmc2V0IG9mIHRoZSBjZW50cmFsIGRpcg0KICAgICR2X29mZnNldCA9IEBmdGVsbCgkdGhpcy0+emlwX2ZkKTsNCg0KICAgIC8vIC0tLS0tIENyZWF0ZSB0aGUgQ2VudHJhbCBEaXIgZmlsZXMgaGVhZGVyDQogICAgZm9yICgkaT0wLCR2X2NvdW50PTA7ICRpPHNpemVvZigkdl9oZWFkZXJfbGlzdCk7ICRpKyspDQogICAgew0KICAgICAgLy8gLS0tLS0gQ3JlYXRlIHRoZSBmaWxlIGhlYWRlcg0KICAgICAgaWYgKCR2X2hlYWRlcl9saXN0WyRpXVsnc3RhdHVzJ10gPT0gJ29rJykgew0KICAgICAgICBpZiAoKCR2X3Jlc3VsdCA9ICR0aGlzLT5wcml2V3JpdGVDZW50cmFsRmlsZUhlYWRlcigkdl9oZWFkZXJfbGlzdFskaV0pKSAhPSAxKSB7DQogICAgICAgICAgLy8gLS0tLS0gUmV0dXJuDQogICAgICAgICAgcmV0dXJuICR2X3Jlc3VsdDsNCiAgICAgICAgfQ0KICAgICAgICAkdl9jb3VudCsrOw0KICAgICAgfQ0KDQogICAgICAvLyAtLS0tLSBUcmFuc2Zvcm0gdGhlIGhlYWRlciB0byBhICd1c2FibGUnIGluZm8NCiAgICAgICR0aGlzLT5wcml2Q29udmVydEhlYWRlcjJGaWxlSW5mbygkdl9oZWFkZXJfbGlzdFskaV0sICRwX3Jlc3VsdF9saXN0WyRpXSk7DQogICAgfQ0KDQogICAgLy8gLS0tLS0gWmlwIGZpbGUgY29tbWVudA0KICAgICR2X2NvbW1lbnQgPSAnJzsNCiAgICBpZiAoaXNzZXQoJHBfb3B0aW9uc1tQQ0xaSVBfT1BUX0NPTU1FTlRdKSkgew0KICAgICAgJHZfY29tbWVudCA9ICRwX29wdGlvbnNbUENMWklQX09QVF9DT01NRU5UXTsNCiAgICB9DQoNCiAgICAvLyAtLS0tLSBDYWxjdWxhdGUgdGhlIHNpemUgb2YgdGhlIGNlbnRyYWwgaGVhZGVyDQogICAgJHZfc2l6ZSA9IEBmdGVsbCgkdGhpcy0+emlwX2ZkKS0kdl9vZmZzZXQ7DQoNCiAgICAvLyAtLS0tLSBDcmVhdGUgdGhlIGNlbnRyYWwgZGlyIGZvb3Rlcg0KICAgIGlmICgoJHZfcmVzdWx0ID0gJHRoaXMtPnByaXZXcml0ZUNlbnRyYWxIZWFkZXIoJHZfY291bnQsICR2X3NpemUsICR2X29mZnNldCwgJHZfY29tbWVudCkpICE9IDEpDQogICAgew0KICAgICAgLy8gLS0tLS0gUmVzZXQgdGhlIGZpbGUgbGlzdA0KICAgICAgdW5zZXQoJHZfaGVhZGVyX2xpc3QpOw0KDQogICAgICAvLyAtLS0tLSBSZXR1cm4NCiAgICAgIHJldHVybiAkdl9yZXN1bHQ7DQogICAgfQ0KDQogICAgLy8gLS0tLS0gUmV0dXJuDQogICAgcmV0dXJuICR2X3Jlc3VsdDsNCiAgfQ0KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogIC8vIEZ1bmN0aW9uIDogcHJpdkFkZEZpbGVMaXN0KCkNCiAgLy8gRGVzY3JpcHRpb24gOg0KICAvLyBQYXJhbWV0ZXJzIDoNCiAgLy8gICAkcF9maWxlZGVzY3JfbGlzdCA6IEFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIGZpbGUgZGVzY3JpcHRpb24gDQogIC8vICAgICAgICAgICAgICAgICAgICAgIG9yIGRpcmVjdG9yeSBuYW1lcyB0byBhZGQgaW4gdGhlIHppcA0KICAvLyAgICRwX3Jlc3VsdF9saXN0IDogbGlzdCBvZiBhZGRlZCBmaWxlcyB3aXRoIHRoZWlyIHByb3BlcnRpZXMgKHNwZWNpYWxseSB0aGUgc3RhdHVzIGZpZWxkKQ0KICAvLyBSZXR1cm4gVmFsdWVzIDoNCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAgZnVuY3Rpb24gcHJpdkFkZEZpbGVMaXN0KCRwX2ZpbGVkZXNjcl9saXN0LCAmJHBfcmVzdWx0X2xpc3QsICYkcF9vcHRpb25zKQ0KICB7DQogICAgJHZfcmVzdWx0PTE7DQogICAgJHZfaGVhZGVyID0gYXJyYXkoKTsNCg0KICAgIC8vIC0tLS0tIFJlY3VwZXJhdGUgdGhlIGN1cnJlbnQgbnVtYmVyIG9mIGVsdCBpbiBsaXN0DQogICAgJHZfbmIgPSBzaXplb2YoJHBfcmVzdWx0X2xpc3QpOw0KDQogICAgLy8gLS0tLS0gTG9vcCBvbiB0aGUgZmlsZXMNCiAgICBmb3IgKCRqPTA7ICgkajxzaXplb2YoJHBfZmlsZWRlc2NyX2xpc3QpKSAmJiAoJHZfcmVzdWx0PT0xKTsgJGorKykgew0KICAgICAgLy8gLS0tLS0gRm9ybWF0IHRoZSBmaWxlbmFtZQ0KICAgICAgJHBfZmlsZWRlc2NyX2xpc3RbJGpdWydmaWxlbmFtZSddDQogICAgICA9IFBjbFppcFV0aWxUcmFuc2xhdGVXaW5QYXRoKCRwX2ZpbGVkZXNjcl9saXN0WyRqXVsnZmlsZW5hbWUnXSwgZmFsc2UpOw0KICAgICAgDQoNCiAgICAgIC8vIC0tLS0tIFNraXAgZW1wdHkgZmlsZSBuYW1lcw0KICAgICAgLy8gVEJDIDogQ2FuIHRoaXMgYmUgcG9zc2libGUgPyBub3QgY2hlY2tlZCBpbiBEZXNjclBhcnNlQXR0ID8NCiAgICAgIGlmICgkcF9maWxlZGVzY3JfbGlzdFskal1bJ2ZpbGVuYW1lJ10gPT0gIiIpIHsNCiAgICAgICAgY29udGludWU7DQogICAgICB9DQoNCiAgICAgIC8vIC0tLS0tIENoZWNrIHRoZSBmaWxlbmFtZQ0KICAgICAgaWYgKCAgICgkcF9maWxlZGVzY3JfbGlzdFskal1bJ3R5cGUnXSAhPSAndmlydHVhbF9maWxlJykNCiAgICAgICAgICAmJiAoIWZpbGVfZXhpc3RzKCRwX2ZpbGVkZXNjcl9saXN0WyRqXVsnZmlsZW5hbWUnXSkpKSB7DQogICAgICAgIFBjbFppcDo6cHJpdkVycm9yTG9nKFBDTFpJUF9FUlJfTUlTU0lOR19GSUxFLCAiRmlsZSAnIi4kcF9maWxlZGVzY3JfbGlzdFskal1bJ2ZpbGVuYW1lJ10uIicgZG9lcyBub3QgZXhpc3QiKTsNCiAgICAgICAgcmV0dXJuIFBjbFppcDo6ZXJyb3JDb2RlKCk7DQogICAgICB9DQoNCiAgICAgIC8vIC0tLS0tIExvb2sgaWYgaXQgaXMgYSBmaWxlIG9yIGEgZGlyIHdpdGggbm8gYWxsIHBhdGggcmVtb3ZlIG9wdGlvbg0KICAgICAgLy8gb3IgYSBkaXIgd2l0aCBhbGwgaXRzIHBhdGggcmVtb3ZlZA0KLy8gICAgICBpZiAoICAgKGlzX2ZpbGUoJHBfZmlsZWRlc2NyX2xpc3RbJGpdWydmaWxlbmFtZSddKSkNCi8vICAgICAgICAgIHx8ICggICBpc19kaXIoJHBfZmlsZWRlc2NyX2xpc3RbJGpdWydmaWxlbmFtZSddKQ0KICAgICAgaWYgKCAgICgkcF9maWxlZGVzY3JfbGlzdFskal1bJ3R5cGUnXSA9PSAnZmlsZScpDQogICAgICAgICAgfHwgKCRwX2ZpbGVkZXNjcl9saXN0WyRqXVsndHlwZSddID09ICd2aXJ0dWFsX2ZpbGUnKQ0KICAgICAgICAgIHx8ICggICAoJHBfZmlsZWRlc2NyX2xpc3RbJGpdWyd0eXBlJ10gPT0gJ2ZvbGRlcicpDQogICAgICAgICAgICAgICYmICggICAhaXNzZXQoJHBfb3B0aW9uc1tQQ0xaSVBfT1BUX1JFTU9WRV9BTExfUEFUSF0pDQogICAgICAgICAgICAgICAgICB8fCAhJHBfb3B0aW9uc1tQQ0xaSVBfT1BUX1JFTU9WRV9BTExfUEFUSF0pKQ0KICAgICAgICAgICkgew0KDQogICAgICAgIC8vIC0tLS0tIEFkZCB0aGUgZmlsZQ0KICAgICAgICAkdl9yZXN1bHQgPSAkdGhpcy0+cHJpdkFkZEZpbGUoJHBfZmlsZWRlc2NyX2xpc3RbJGpdLCAkdl9oZWFkZXIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcF9vcHRpb25zKTsNCiAgICAgICAgaWYgKCR2X3Jlc3VsdCAhPSAxKSB7DQogICAgICAgICAgcmV0dXJuICR2X3Jlc3VsdDsNCiAgICAgICAgfQ0KDQogICAgICAgIC8vIC0tLS0tIFN0b3JlIHRoZSBmaWxlIGluZm9zDQogICAgICAgICRwX3Jlc3VsdF9saXN0WyR2X25iKytdID0gJHZfaGVhZGVyOw0KICAgICAgfQ0KICAgIH0NCg0KICAgIC8vIC0tLS0tIFJldHVybg0KICAgIHJldHVybiAkdl9yZXN1bHQ7DQogIH0NCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICAvLyBGdW5jdGlvbiA6IHByaXZBZGRGaWxlKCkNCiAgLy8gRGVzY3JpcHRpb24gOg0KICAvLyBQYXJhbWV0ZXJzIDoNCiAgLy8gUmV0dXJuIFZhbHVlcyA6DQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogIGZ1bmN0aW9uIHByaXZBZGRGaWxlKCRwX2ZpbGVkZXNjciwgJiRwX2hlYWRlciwgJiRwX29wdGlvbnMpDQogIHsNCiAgICAkdl9yZXN1bHQ9MTsNCiAgICANCiAgICAvLyAtLS0tLSBXb3JraW5nIHZhcmlhYmxlDQogICAgJHBfZmlsZW5hbWUgPSAkcF9maWxlZGVzY3JbJ2ZpbGVuYW1lJ107DQoNCiAgICAvLyBUQkMgOiBBbHJlYWR5IGRvbmUgaW4gdGhlIGZpbGVBdHQgY2hlY2sgLi4uID8NCiAgICBpZiAoJHBfZmlsZW5hbWUgPT0gIiIpIHsNCiAgICAgIC8vIC0tLS0tIEVycm9yIGxvZw0KICAgICAgUGNsWmlwOjpwcml2RXJyb3JMb2coUENMWklQX0VSUl9JTlZBTElEX1BBUkFNRVRFUiwgIkludmFsaWQgZmlsZSBsaXN0IHBhcmFtZXRlciAoaW52YWxpZCBvciBlbXB0eSBsaXN0KSIpOw0KDQogICAgICAvLyAtLS0tLSBSZXR1cm4NCiAgICAgIHJldHVybiBQY2xaaXA6OmVycm9yQ29kZSgpOw0KICAgIH0NCiAgDQogICAgLy8gLS0tLS0gTG9vayBmb3IgYSBzdG9yZWQgZGlmZmVyZW50IGZpbGVuYW1lIA0KICAgIC8qIFRCQyA6IFJlbW92ZWQNCiAgICBpZiAoaXNzZXQoJHBfZmlsZWRlc2NyWydzdG9yZWRfZmlsZW5hbWUnXSkpIHsNCiAgICAgICR2X3N0b3JlZF9maWxlbmFtZSA9ICRwX2ZpbGVkZXNjclsnc3RvcmVkX2ZpbGVuYW1lJ107DQogICAgfQ0KICAgIGVsc2Ugew0KICAgICAgJHZfc3RvcmVkX2ZpbGVuYW1lID0gJHBfZmlsZWRlc2NyWydzdG9yZWRfZmlsZW5hbWUnXTsNCiAgICB9DQogICAgKi8NCg0KICAgIC8vIC0tLS0tIFNldCB0aGUgZmlsZSBwcm9wZXJ0aWVzDQogICAgY2xlYXJzdGF0Y2FjaGUoKTsNCiAgICAkcF9oZWFkZXJbJ3ZlcnNpb24nXSA9IDIwOw0KICAgICRwX2hlYWRlclsndmVyc2lvbl9leHRyYWN0ZWQnXSA9IDEwOw0KICAgICRwX2hlYWRlclsnZmxhZyddID0gMDsNCiAgICAkcF9oZWFkZXJbJ2NvbXByZXNzaW9uJ10gPSAwOw0KICAgICRwX2hlYWRlclsnY3JjJ10gPSAwOw0KICAgICRwX2hlYWRlclsnY29tcHJlc3NlZF9zaXplJ10gPSAwOw0KICAgICRwX2hlYWRlclsnZmlsZW5hbWVfbGVuJ10gPSBzdHJsZW4oJHBfZmlsZW5hbWUpOw0KICAgICRwX2hlYWRlclsnZXh0cmFfbGVuJ10gPSAwOw0KICAgICRwX2hlYWRlclsnZGlzayddID0gMDsNCiAgICAkcF9oZWFkZXJbJ2ludGVybmFsJ10gPSAwOw0KICAgICRwX2hlYWRlclsnb2Zmc2V0J10gPSAwOw0KICAgICRwX2hlYWRlclsnZmlsZW5hbWUnXSA9ICRwX2ZpbGVuYW1lOw0KLy8gVEJDIDogUmVtb3ZlZCAgICAkcF9oZWFkZXJbJ3N0b3JlZF9maWxlbmFtZSddID0gJHZfc3RvcmVkX2ZpbGVuYW1lOw0KICAgICRwX2hlYWRlclsnc3RvcmVkX2ZpbGVuYW1lJ10gPSAkcF9maWxlZGVzY3JbJ3N0b3JlZF9maWxlbmFtZSddOw0KICAgICRwX2hlYWRlclsnZXh0cmEnXSA9ICcnOw0KICAgICRwX2hlYWRlclsnc3RhdHVzJ10gPSAnb2snOw0KICAgICRwX2hlYWRlclsnaW5kZXgnXSA9IC0xOw0KDQogICAgLy8gLS0tLS0gTG9vayBmb3IgcmVndWxhciBmaWxlDQogICAgaWYgKCRwX2ZpbGVkZXNjclsndHlwZSddPT0nZmlsZScpIHsNCiAgICAgICRwX2hlYWRlclsnZXh0ZXJuYWwnXSA9IDB4MDAwMDAwMDA7DQogICAgICAkcF9oZWFkZXJbJ3NpemUnXSA9IGZpbGVzaXplKCRwX2ZpbGVuYW1lKTsNCiAgICB9DQogICAgDQogICAgLy8gLS0tLS0gTG9vayBmb3IgcmVndWxhciBmb2xkZXINCiAgICBlbHNlIGlmICgkcF9maWxlZGVzY3JbJ3R5cGUnXT09J2ZvbGRlcicpIHsNCiAgICAgICRwX2hlYWRlclsnZXh0ZXJuYWwnXSA9IDB4MDAwMDAwMTA7DQogICAgICAkcF9oZWFkZXJbJ210aW1lJ10gPSBmaWxlbXRpbWUoJHBfZmlsZW5hbWUpOw0KICAgICAgJHBfaGVhZGVyWydzaXplJ10gPSBmaWxlc2l6ZSgkcF9maWxlbmFtZSk7DQogICAgfQ0KICAgIA0KICAgIC8vIC0tLS0tIExvb2sgZm9yIHZpcnR1YWwgZmlsZQ0KICAgIGVsc2UgaWYgKCRwX2ZpbGVkZXNjclsndHlwZSddID09ICd2aXJ0dWFsX2ZpbGUnKSB7DQogICAgICAkcF9oZWFkZXJbJ2V4dGVybmFsJ10gPSAweDAwMDAwMDAwOw0KICAgICAgJHBfaGVhZGVyWydzaXplJ10gPSBzdHJsZW4oJHBfZmlsZWRlc2NyWydjb250ZW50J10pOw0KICAgIH0NCiAgICANCg0KICAgIC8vIC0tLS0tIExvb2sgZm9yIGZpbGV0aW1lDQogICAgaWYgKGlzc2V0KCRwX2ZpbGVkZXNjclsnbXRpbWUnXSkpIHsNCiAgICAgICRwX2hlYWRlclsnbXRpbWUnXSA9ICRwX2ZpbGVkZXNjclsnbXRpbWUnXTsNCiAgICB9DQogICAgZWxzZSBpZiAoJHBfZmlsZWRlc2NyWyd0eXBlJ10gPT0gJ3ZpcnR1YWxfZmlsZScpIHsNCiAgICAgICRwX2hlYWRlclsnbXRpbWUnXSA9IHRpbWUoKTsNCiAgICB9DQogICAgZWxzZSB7DQogICAgICAkcF9oZWFkZXJbJ210aW1lJ10gPSBmaWxlbXRpbWUoJHBfZmlsZW5hbWUpOw0KICAgIH0NCg0KICAgIC8vIC0tLS0tLSBMb29rIGZvciBmaWxlIGNvbW1lbnQNCiAgICBpZiAoaXNzZXQoJHBfZmlsZWRlc2NyWydjb21tZW50J10pKSB7DQogICAgICAkcF9oZWFkZXJbJ2NvbW1lbnRfbGVuJ10gPSBzdHJsZW4oJHBfZmlsZWRlc2NyWydjb21tZW50J10pOw0KICAgICAgJHBfaGVhZGVyWydjb21tZW50J10gPSAkcF9maWxlZGVzY3JbJ2NvbW1lbnQnXTsNCiAgICB9DQogICAgZWxzZSB7DQogICAgICAkcF9oZWFkZXJbJ2NvbW1lbnRfbGVuJ10gPSAwOw0KICAgICAgJHBfaGVhZGVyWydjb21tZW50J10gPSAnJzsNCiAgICB9DQoNCiAgICAvLyAtLS0tLSBMb29rIGZvciBwcmUtYWRkIGNhbGxiYWNrDQogICAgaWYgKGlzc2V0KCRwX29wdGlvbnNbUENMWklQX0NCX1BSRV9BRERdKSkgew0KDQogICAgICAvLyAtLS0tLSBHZW5lcmF0ZSBhIGxvY2FsIGluZm9ybWF0aW9uDQogICAgICAkdl9sb2NhbF9oZWFkZXIgPSBhcnJheSgpOw0KICAgICAgJHRoaXMtPnByaXZDb252ZXJ0SGVhZGVyMkZpbGVJbmZvKCRwX2hlYWRlciwgJHZfbG9jYWxfaGVhZGVyKTsNCg0KICAgICAgLy8gLS0tLS0gQ2FsbCB0aGUgY2FsbGJhY2sNCiAgICAgIC8vIEhlcmUgSSBkbyBub3QgdXNlIGNhbGxfdXNlcl9mdW5jKCkgYmVjYXVzZSBJIG5lZWQgdG8gc2VuZCBhIHJlZmVyZW5jZSB0byB0aGUNCiAgICAgIC8vIGhlYWRlci4NCi8vICAgICAgZXZhbCgnJHZfcmVzdWx0ID0gJy4kcF9vcHRpb25zW1BDTFpJUF9DQl9QUkVfQUREXS4nKFBDTFpJUF9DQl9QUkVfQURELCAkdl9sb2NhbF9oZWFkZXIpOycpOw0KICAgICAgJHZfcmVzdWx0ID0gJHBfb3B0aW9uc1tQQ0xaSVBfQ0JfUFJFX0FERF0oUENMWklQX0NCX1BSRV9BREQsICR2X2xvY2FsX2hlYWRlcik7DQogICAgICBpZiAoJHZfcmVzdWx0ID09IDApIHsNCiAgICAgICAgLy8gLS0tLS0gQ2hhbmdlIHRoZSBmaWxlIHN0YXR1cw0KICAgICAgICAkcF9oZWFkZXJbJ3N0YXR1cyddID0gInNraXBwZWQiOw0KICAgICAgICAkdl9yZXN1bHQgPSAxOw0KICAgICAgfQ0KDQogICAgICAvLyAtLS0tLSBVcGRhdGUgdGhlIGluZm9ybWF0aW9ucw0KICAgICAgLy8gT25seSBzb21lIGZpZWxkcyBjYW4gYmUgbW9kaWZpZWQNCiAgICAgIGlmICgkcF9oZWFkZXJbJ3N0b3JlZF9maWxlbmFtZSddICE9ICR2X2xvY2FsX2hlYWRlclsnc3RvcmVkX2ZpbGVuYW1lJ10pIHsNCiAgICAgICAgJHBfaGVhZGVyWydzdG9yZWRfZmlsZW5hbWUnXSA9IFBjbFppcFV0aWxQYXRoUmVkdWN0aW9uKCR2X2xvY2FsX2hlYWRlclsnc3RvcmVkX2ZpbGVuYW1lJ10pOw0KICAgICAgfQ0KICAgIH0NCg0KICAgIC8vIC0tLS0tIExvb2sgZm9yIGVtcHR5IHN0b3JlZCBmaWxlbmFtZQ0KICAgIGlmICgkcF9oZWFkZXJbJ3N0b3JlZF9maWxlbmFtZSddID09ICIiKSB7DQogICAgICAkcF9oZWFkZXJbJ3N0YXR1cyddID0gImZpbHRlcmVkIjsNCiAgICB9DQogICAgDQogICAgLy8gLS0tLS0gQ2hlY2sgdGhlIHBhdGggbGVuZ3RoDQogICAgaWYgKHN0cmxlbigkcF9oZWFkZXJbJ3N0b3JlZF9maWxlbmFtZSddKSA+IDB4RkYpIHsNCiAgICAgICRwX2hlYWRlclsnc3RhdHVzJ10gPSAnZmlsZW5hbWVfdG9vX2xvbmcnOw0KICAgIH0NCg0KICAgIC8vIC0tLS0tIExvb2sgaWYgbm8gZXJyb3IsIG9yIGZpbGUgbm90IHNraXBwZWQNCiAgICBpZiAoJHBfaGVhZGVyWydzdGF0dXMnXSA9PSAnb2snKSB7DQoNCiAgICAgIC8vIC0tLS0tIExvb2sgZm9yIGEgZmlsZQ0KICAgICAgaWYgKCRwX2ZpbGVkZXNjclsndHlwZSddID09ICdmaWxlJykgew0KICAgICAgICAvLyAtLS0tLSBMb29rIGZvciB1c2luZyB0ZW1wb3JhcnkgZmlsZSB0byB6aXANCiAgICAgICAgaWYgKCAoIWlzc2V0KCRwX29wdGlvbnNbUENMWklQX09QVF9URU1QX0ZJTEVfT0ZGXSkpIA0KICAgICAgICAgICAgJiYgKGlzc2V0KCRwX29wdGlvbnNbUENMWklQX09QVF9URU1QX0ZJTEVfT05dKQ0KICAgICAgICAgICAgICAgIHx8IChpc3NldCgkcF9vcHRpb25zW1BDTFpJUF9PUFRfVEVNUF9GSUxFX1RIUkVTSE9MRF0pDQogICAgICAgICAgICAgICAgICAgICYmICgkcF9vcHRpb25zW1BDTFpJUF9PUFRfVEVNUF9GSUxFX1RIUkVTSE9MRF0gPD0gJHBfaGVhZGVyWydzaXplJ10pKSApICkgew0KICAgICAgICAgICR2X3Jlc3VsdCA9ICR0aGlzLT5wcml2QWRkRmlsZVVzaW5nVGVtcEZpbGUoJHBfZmlsZWRlc2NyLCAkcF9oZWFkZXIsICRwX29wdGlvbnMpOw0KICAgICAgICAgIGlmICgkdl9yZXN1bHQgPCBQQ0xaSVBfRVJSX05PX0VSUk9SKSB7DQogICAgICAgICAgICByZXR1cm4gJHZfcmVzdWx0Ow0KICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICANCiAgICAgICAgLy8gLS0tLS0gVXNlICJpbiBtZW1vcnkiIHppcCBhbGdvDQogICAgICAgIGVsc2Ugew0KDQogICAgICAgIC8vIC0tLS0tIE9wZW4gdGhlIHNvdXJjZSBmaWxlDQogICAgICAgIGlmICgoJHZfZmlsZSA9IEBmb3BlbigkcF9maWxlbmFtZSwgInJiIikpID09IDApIHsNCiAgICAgICAgICBQY2xaaXA6OnByaXZFcnJvckxvZyhQQ0xaSVBfRVJSX1JFQURfT1BFTl9GQUlMLCAiVW5hYmxlIHRvIG9wZW4gZmlsZSAnJHBfZmlsZW5hbWUnIGluIGJpbmFyeSByZWFkIG1vZGUiKTsNCiAgICAgICAgICByZXR1cm4gUGNsWmlwOjplcnJvckNvZGUoKTsNCiAgICAgICAgfQ0KDQogICAgICAgIC8vIC0tLS0tIFJlYWQgdGhlIGZpbGUgY29udGVudA0KICAgICAgICAkdl9jb250ZW50ID0gQGZyZWFkKCR2X2ZpbGUsICRwX2hlYWRlclsnc2l6ZSddKTsNCg0KICAgICAgICAvLyAtLS0tLSBDbG9zZSB0aGUgZmlsZQ0KICAgICAgICBAZmNsb3NlKCR2X2ZpbGUpOw0KDQogICAgICAgIC8vIC0tLS0tIENhbGN1bGF0ZSB0aGUgQ1JDDQogICAgICAgICRwX2hlYWRlclsnY3JjJ10gPSBAY3JjMzIoJHZfY29udGVudCk7DQogICAgICAgIA0KICAgICAgICAvLyAtLS0tLSBMb29rIGZvciBubyBjb21wcmVzc2lvbg0KICAgICAgICBpZiAoJHBfb3B0aW9uc1tQQ0xaSVBfT1BUX05PX0NPTVBSRVNTSU9OXSkgew0KICAgICAgICAgIC8vIC0tLS0tIFNldCBoZWFkZXIgcGFyYW1ldGVycw0KICAgICAgICAgICRwX2hlYWRlclsnY29tcHJlc3NlZF9zaXplJ10gPSAkcF9oZWFkZXJbJ3NpemUnXTsNCiAgICAgICAgICAkcF9oZWFkZXJbJ2NvbXByZXNzaW9uJ10gPSAwOw0KICAgICAgICB9DQogICAgICAgIA0KICAgICAgICAvLyAtLS0tLSBMb29rIGZvciBub3JtYWwgY29tcHJlc3Npb24NCiAgICAgICAgZWxzZSB7DQogICAgICAgICAgLy8gLS0tLS0gQ29tcHJlc3MgdGhlIGNvbnRlbnQNCiAgICAgICAgICAkdl9jb250ZW50ID0gQGd6ZGVmbGF0ZSgkdl9jb250ZW50KTsNCg0KICAgICAgICAgIC8vIC0tLS0tIFNldCBoZWFkZXIgcGFyYW1ldGVycw0KICAgICAgICAgICRwX2hlYWRlclsnY29tcHJlc3NlZF9zaXplJ10gPSBzdHJsZW4oJHZfY29udGVudCk7DQogICAgICAgICAgJHBfaGVhZGVyWydjb21wcmVzc2lvbiddID0gODsNCiAgICAgICAgfQ0KICAgICAgICANCiAgICAgICAgLy8gLS0tLS0gQ2FsbCB0aGUgaGVhZGVyIGdlbmVyYXRpb24NCiAgICAgICAgaWYgKCgkdl9yZXN1bHQgPSAkdGhpcy0+cHJpdldyaXRlRmlsZUhlYWRlcigkcF9oZWFkZXIpKSAhPSAxKSB7DQogICAgICAgICAgQGZjbG9zZSgkdl9maWxlKTsNCiAgICAgICAgICByZXR1cm4gJHZfcmVzdWx0Ow0KICAgICAgICB9DQoNCiAgICAgICAgLy8gLS0tLS0gV3JpdGUgdGhlIGNvbXByZXNzZWQgKG9yIG5vdCkgY29udGVudA0KICAgICAgICBAZndyaXRlKCR0aGlzLT56aXBfZmQsICR2X2NvbnRlbnQsICRwX2hlYWRlclsnY29tcHJlc3NlZF9zaXplJ10pOw0KDQogICAgICAgIH0NCg0KICAgICAgfQ0KDQogICAgICAvLyAtLS0tLSBMb29rIGZvciBhIHZpcnR1YWwgZmlsZSAoYSBmaWxlIGZyb20gc3RyaW5nKQ0KICAgICAgZWxzZSBpZiAoJHBfZmlsZWRlc2NyWyd0eXBlJ10gPT0gJ3ZpcnR1YWxfZmlsZScpIHsNCiAgICAgICAgICANCiAgICAgICAgJHZfY29udGVudCA9ICRwX2ZpbGVkZXNjclsnY29udGVudCddOw0KDQogICAgICAgIC8vIC0tLS0tIENhbGN1bGF0ZSB0aGUgQ1JDDQogICAgICAgICRwX2hlYWRlclsnY3JjJ10gPSBAY3JjMzIoJHZfY29udGVudCk7DQogICAgICAgIA0KICAgICAgICAvLyAtLS0tLSBMb29rIGZvciBubyBjb21wcmVzc2lvbg0KICAgICAgICBpZiAoJHBfb3B0aW9uc1tQQ0xaSVBfT1BUX05PX0NPTVBSRVNTSU9OXSkgew0KICAgICAgICAgIC8vIC0tLS0tIFNldCBoZWFkZXIgcGFyYW1ldGVycw0KICAgICAgICAgICRwX2hlYWRlclsnY29tcHJlc3NlZF9zaXplJ10gPSAkcF9oZWFkZXJbJ3NpemUnXTsNCiAgICAgICAgICAkcF9oZWFkZXJbJ2NvbXByZXNzaW9uJ10gPSAwOw0KICAgICAgICB9DQogICAgICAgIA0KICAgICAgICAvLyAtLS0tLSBMb29rIGZvciBub3JtYWwgY29tcHJlc3Npb24NCiAgICAgICAgZWxzZSB7DQogICAgICAgICAgLy8gLS0tLS0gQ29tcHJlc3MgdGhlIGNvbnRlbnQNCiAgICAgICAgICAkdl9jb250ZW50ID0gQGd6ZGVmbGF0ZSgkdl9jb250ZW50KTsNCg0KICAgICAgICAgIC8vIC0tLS0tIFNldCBoZWFkZXIgcGFyYW1ldGVycw0KICAgICAgICAgICRwX2hlYWRlclsnY29tcHJlc3NlZF9zaXplJ10gPSBzdHJsZW4oJHZfY29udGVudCk7DQogICAgICAgICAgJHBfaGVhZGVyWydjb21wcmVzc2lvbiddID0gODsNCiAgICAgICAgfQ0KICAgICAgICANCiAgICAgICAgLy8gLS0tLS0gQ2FsbCB0aGUgaGVhZGVyIGdlbmVyYXRpb24NCiAgICAgICAgaWYgKCgkdl9yZXN1bHQgPSAkdGhpcy0+cHJpdldyaXRlRmlsZUhlYWRlcigkcF9oZWFkZXIpKSAhPSAxKSB7DQogICAgICAgICAgQGZjbG9zZSgkdl9maWxlKTsNCiAgICAgICAgICByZXR1cm4gJHZfcmVzdWx0Ow0KICAgICAgICB9DQoNCiAgICAgICAgLy8gLS0tLS0gV3JpdGUgdGhlIGNvbXByZXNzZWQgKG9yIG5vdCkgY29udGVudA0KICAgICAgICBAZndyaXRlKCR0aGlzLT56aXBfZmQsICR2X2NvbnRlbnQsICRwX2hlYWRlclsnY29tcHJlc3NlZF9zaXplJ10pOw0KICAgICAgfQ0KDQogICAgICAvLyAtLS0tLSBMb29rIGZvciBhIGRpcmVjdG9yeQ0KICAgICAgZWxzZSBpZiAoJHBfZmlsZWRlc2NyWyd0eXBlJ10gPT0gJ2ZvbGRlcicpIHsNCiAgICAgICAgLy8gLS0tLS0gTG9vayBmb3IgZGlyZWN0b3J5IGxhc3QgJy8nDQogICAgICAgIGlmIChAc3Vic3RyKCRwX2hlYWRlclsnc3RvcmVkX2ZpbGVuYW1lJ10sIC0xKSAhPSAnLycpIHsNCiAgICAgICAgICAkcF9oZWFkZXJbJ3N0b3JlZF9maWxlbmFtZSddIC49ICcvJzsNCiAgICAgICAgfQ0KDQogICAgICAgIC8vIC0tLS0tIFNldCB0aGUgZmlsZSBwcm9wZXJ0aWVzDQogICAgICAgICRwX2hlYWRlclsnc2l6ZSddID0gMDsNCiAgICAgICAgLy8kcF9oZWFkZXJbJ2V4dGVybmFsJ10gPSAweDQxRkYwMDEwOyAgIC8vIFZhbHVlIGZvciBhIGZvbGRlciA6IHRvIGJlIGNoZWNrZWQNCiAgICAgICAgJHBfaGVhZGVyWydleHRlcm5hbCddID0gMHgwMDAwMDAxMDsgICAvLyBWYWx1ZSBmb3IgYSBmb2xkZXIgOiB0byBiZSBjaGVja2VkDQoNCiAgICAgICAgLy8gLS0tLS0gQ2FsbCB0aGUgaGVhZGVyIGdlbmVyYXRpb24NCiAgICAgICAgaWYgKCgkdl9yZXN1bHQgPSAkdGhpcy0+cHJpdldyaXRlRmlsZUhlYWRlcigkcF9oZWFkZXIpKSAhPSAxKQ0KICAgICAgICB7DQogICAgICAgICAgcmV0dXJuICR2X3Jlc3VsdDsNCiAgICAgICAgfQ0KICAgICAgfQ0KICAgIH0NCg0KICAgIC8vIC0tLS0tIExvb2sgZm9yIHBvc3QtYWRkIGNhbGxiYWNrDQogICAgaWYgKGlzc2V0KCRwX29wdGlvbnNbUENMWklQX0NCX1BPU1RfQUREXSkpIHsNCg0KICAgICAgLy8gLS0tLS0gR2VuZXJhdGUgYSBsb2NhbCBpbmZvcm1hdGlvbg0KICAgICAgJHZfbG9jYWxfaGVhZGVyID0gYXJyYXkoKTsNCiAgICAgICR0aGlzLT5wcml2Q29udmVydEhlYWRlcjJGaWxlSW5mbygkcF9oZWFkZXIsICR2X2xvY2FsX2hlYWRlcik7DQoNCiAgICAgIC8vIC0tLS0tIENhbGwgdGhlIGNhbGxiYWNrDQogICAgICAvLyBIZXJlIEkgZG8gbm90IHVzZSBjYWxsX3VzZXJfZnVuYygpIGJlY2F1c2UgSSBuZWVkIHRvIHNlbmQgYSByZWZlcmVuY2UgdG8gdGhlDQogICAgICAvLyBoZWFkZXIuDQovLyAgICAgIGV2YWwoJyR2X3Jlc3VsdCA9ICcuJHBfb3B0aW9uc1tQQ0xaSVBfQ0JfUE9TVF9BRERdLicoUENMWklQX0NCX1BPU1RfQURELCAkdl9sb2NhbF9oZWFkZXIpOycpOw0KICAgICAgJHZfcmVzdWx0ID0gJHBfb3B0aW9uc1tQQ0xaSVBfQ0JfUE9TVF9BRERdKFBDTFpJUF9DQl9QT1NUX0FERCwgJHZfbG9jYWxfaGVhZGVyKTsNCiAgICAgIGlmICgkdl9yZXN1bHQgPT0gMCkgew0KICAgICAgICAvLyAtLS0tLSBJZ25vcmVkDQogICAgICAgICR2X3Jlc3VsdCA9IDE7DQogICAgICB9DQoNCiAgICAgIC8vIC0tLS0tIFVwZGF0ZSB0aGUgaW5mb3JtYXRpb25zDQogICAgICAvLyBOb3RoaW5nIGNhbiBiZSBtb2RpZmllZA0KICAgIH0NCg0KICAgIC8vIC0tLS0tIFJldHVybg0KICAgIHJldHVybiAkdl9yZXN1bHQ7DQogIH0NCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICAvLyBGdW5jdGlvbiA6IHByaXZBZGRGaWxlVXNpbmdUZW1wRmlsZSgpDQogIC8vIERlc2NyaXB0aW9uIDoNCiAgLy8gUGFyYW1ldGVycyA6DQogIC8vIFJldHVybiBWYWx1ZXMgOg0KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICBmdW5jdGlvbiBwcml2QWRkRmlsZVVzaW5nVGVtcEZpbGUoJHBfZmlsZWRlc2NyLCAmJHBfaGVhZGVyLCAmJHBfb3B0aW9ucykNCiAgew0KICAgICR2X3Jlc3VsdD1QQ0xaSVBfRVJSX05PX0VSUk9SOw0KICAgIA0KICAgIC8vIC0tLS0tIFdvcmtpbmcgdmFyaWFibGUNCiAgICAkcF9maWxlbmFtZSA9ICRwX2ZpbGVkZXNjclsnZmlsZW5hbWUnXTsNCg0KDQogICAgLy8gLS0tLS0gT3BlbiB0aGUgc291cmNlIGZpbGUNCiAgICBpZiAoKCR2X2ZpbGUgPSBAZm9wZW4oJHBfZmlsZW5hbWUsICJyYiIpKSA9PSAwKSB7DQogICAgICBQY2xaaXA6OnByaXZFcnJvckxvZyhQQ0xaSVBfRVJSX1JFQURfT1BFTl9GQUlMLCAiVW5hYmxlIHRvIG9wZW4gZmlsZSAnJHBfZmlsZW5hbWUnIGluIGJpbmFyeSByZWFkIG1vZGUiKTsNCiAgICAgIHJldHVybiBQY2xaaXA6OmVycm9yQ29kZSgpOw0KICAgIH0NCg0KICAgIC8vIC0tLS0tIENyZWF0ZXMgYSBjb21wcmVzc2VkIHRlbXBvcmFyeSBmaWxlDQogICAgJHZfZ3ppcF90ZW1wX25hbWUgPSBQQ0xaSVBfVEVNUE9SQVJZX0RJUi51bmlxaWQoJ3BjbHppcC0nKS4nLmd6JzsNCiAgICBpZiAoKCR2X2ZpbGVfY29tcHJlc3NlZCA9IEBnem9wZW4oJHZfZ3ppcF90ZW1wX25hbWUsICJ3YiIpKSA9PSAwKSB7DQogICAgICBmY2xvc2UoJHZfZmlsZSk7DQogICAgICBQY2xaaXA6OnByaXZFcnJvckxvZyhQQ0xaSVBfRVJSX1dSSVRFX09QRU5fRkFJTCwgJ1VuYWJsZSB0byBvcGVuIHRlbXBvcmFyeSBmaWxlIFwnJy4kdl9nemlwX3RlbXBfbmFtZS4nXCcgaW4gYmluYXJ5IHdyaXRlIG1vZGUnKTsNCiAgICAgIHJldHVybiBQY2xaaXA6OmVycm9yQ29kZSgpOw0KICAgIH0NCg0KICAgIC8vIC0tLS0tIFJlYWQgdGhlIGZpbGUgYnkgUENMWklQX1JFQURfQkxPQ0tfU0laRSBvY3RldHMgYmxvY2tzDQogICAgJHZfc2l6ZSA9IGZpbGVzaXplKCRwX2ZpbGVuYW1lKTsNCiAgICB3aGlsZSAoJHZfc2l6ZSAhPSAwKSB7DQogICAgICAkdl9yZWFkX3NpemUgPSAoJHZfc2l6ZSA8IFBDTFpJUF9SRUFEX0JMT0NLX1NJWkUgPyAkdl9zaXplIDogUENMWklQX1JFQURfQkxPQ0tfU0laRSk7DQogICAgICAkdl9idWZmZXIgPSBAZnJlYWQoJHZfZmlsZSwgJHZfcmVhZF9zaXplKTsNCiAgICAgIC8vJHZfYmluYXJ5X2RhdGEgPSBwYWNrKCdhJy4kdl9yZWFkX3NpemUsICR2X2J1ZmZlcik7DQogICAgICBAZ3pwdXRzKCR2X2ZpbGVfY29tcHJlc3NlZCwgJHZfYnVmZmVyLCAkdl9yZWFkX3NpemUpOw0KICAgICAgJHZfc2l6ZSAtPSAkdl9yZWFkX3NpemU7DQogICAgfQ0KDQogICAgLy8gLS0tLS0gQ2xvc2UgdGhlIGZpbGUNCiAgICBAZmNsb3NlKCR2X2ZpbGUpOw0KICAgIEBnemNsb3NlKCR2X2ZpbGVfY29tcHJlc3NlZCk7DQoNCiAgICAvLyAtLS0tLSBDaGVjayB0aGUgbWluaW11bSBmaWxlIHNpemUNCiAgICBpZiAoZmlsZXNpemUoJHZfZ3ppcF90ZW1wX25hbWUpIDwgMTgpIHsNCiAgICAgIFBjbFppcDo6cHJpdkVycm9yTG9nKFBDTFpJUF9FUlJfQkFEX0ZPUk1BVCwgJ2d6aXAgdGVtcG9yYXJ5IGZpbGUgXCcnLiR2X2d6aXBfdGVtcF9uYW1lLidcJyBoYXMgaW52YWxpZCBmaWxlc2l6ZSAtIHNob3VsZCBiZSBtaW5pbXVtIDE4IGJ5dGVzJyk7DQogICAgICByZXR1cm4gUGNsWmlwOjplcnJvckNvZGUoKTsNCiAgICB9DQoNCiAgICAvLyAtLS0tLSBFeHRyYWN0IHRoZSBjb21wcmVzc2VkIGF0dHJpYnV0ZXMNCiAgICBpZiAoKCR2X2ZpbGVfY29tcHJlc3NlZCA9IEBmb3Blbigkdl9nemlwX3RlbXBfbmFtZSwgInJiIikpID09IDApIHsNCiAgICAgIFBjbFppcDo6cHJpdkVycm9yTG9nKFBDTFpJUF9FUlJfUkVBRF9PUEVOX0ZBSUwsICdVbmFibGUgdG8gb3BlbiB0ZW1wb3JhcnkgZmlsZSBcJycuJHZfZ3ppcF90ZW1wX25hbWUuJ1wnIGluIGJpbmFyeSByZWFkIG1vZGUnKTsNCiAgICAgIHJldHVybiBQY2xaaXA6OmVycm9yQ29kZSgpOw0KICAgIH0NCg0KICAgIC8vIC0tLS0tIFJlYWQgdGhlIGd6aXAgZmlsZSBoZWFkZXINCiAgICAkdl9iaW5hcnlfZGF0YSA9IEBmcmVhZCgkdl9maWxlX2NvbXByZXNzZWQsIDEwKTsNCiAgICAkdl9kYXRhX2hlYWRlciA9IHVucGFjaygnYTFpZDEvYTFpZDIvYTFjbS9hMWZsYWcvVm10aW1lL2ExeGZsL2Exb3MnLCAkdl9iaW5hcnlfZGF0YSk7DQoNCiAgICAvLyAtLS0tLSBDaGVjayBzb21lIHBhcmFtZXRlcnMNCiAgICAkdl9kYXRhX2hlYWRlclsnb3MnXSA9IGJpbjJoZXgoJHZfZGF0YV9oZWFkZXJbJ29zJ10pOw0KDQogICAgLy8gLS0tLS0gUmVhZCB0aGUgZ3ppcCBmaWxlIGZvb3Rlcg0KICAgIEBmc2Vlaygkdl9maWxlX2NvbXByZXNzZWQsIGZpbGVzaXplKCR2X2d6aXBfdGVtcF9uYW1lKS04KTsNCiAgICAkdl9iaW5hcnlfZGF0YSA9IEBmcmVhZCgkdl9maWxlX2NvbXByZXNzZWQsIDgpOw0KICAgICR2X2RhdGFfZm9vdGVyID0gdW5wYWNrKCdWY3JjL1Zjb21wcmVzc2VkX3NpemUnLCAkdl9iaW5hcnlfZGF0YSk7DQoNCiAgICAvLyAtLS0tLSBTZXQgdGhlIGF0dHJpYnV0ZXMNCiAgICAkcF9oZWFkZXJbJ2NvbXByZXNzaW9uJ10gPSBvcmQoJHZfZGF0YV9oZWFkZXJbJ2NtJ10pOw0KICAgIC8vJHBfaGVhZGVyWydtdGltZSddID0gJHZfZGF0YV9oZWFkZXJbJ210aW1lJ107DQogICAgJHBfaGVhZGVyWydjcmMnXSA9ICR2X2RhdGFfZm9vdGVyWydjcmMnXTsNCiAgICAkcF9oZWFkZXJbJ2NvbXByZXNzZWRfc2l6ZSddID0gZmlsZXNpemUoJHZfZ3ppcF90ZW1wX25hbWUpLTE4Ow0KDQogICAgLy8gLS0tLS0gQ2xvc2UgdGhlIGZpbGUNCiAgICBAZmNsb3NlKCR2X2ZpbGVfY29tcHJlc3NlZCk7DQoNCiAgICAvLyAtLS0tLSBDYWxsIHRoZSBoZWFkZXIgZ2VuZXJhdGlvbg0KICAgIGlmICgoJHZfcmVzdWx0ID0gJHRoaXMtPnByaXZXcml0ZUZpbGVIZWFkZXIoJHBfaGVhZGVyKSkgIT0gMSkgew0KICAgICAgcmV0dXJuICR2X3Jlc3VsdDsNCiAgICB9DQoNCiAgICAvLyAtLS0tLSBBZGQgdGhlIGNvbXByZXNzZWQgZGF0YQ0KICAgIGlmICgoJHZfZmlsZV9jb21wcmVzc2VkID0gQGZvcGVuKCR2X2d6aXBfdGVtcF9uYW1lLCAicmIiKSkgPT0gMCkNCiAgICB7DQogICAgICBQY2xaaXA6OnByaXZFcnJvckxvZyhQQ0xaSVBfRVJSX1JFQURfT1BFTl9GQUlMLCAnVW5hYmxlIHRvIG9wZW4gdGVtcG9yYXJ5IGZpbGUgXCcnLiR2X2d6aXBfdGVtcF9uYW1lLidcJyBpbiBiaW5hcnkgcmVhZCBtb2RlJyk7DQogICAgICByZXR1cm4gUGNsWmlwOjplcnJvckNvZGUoKTsNCiAgICB9DQoNCiAgICAvLyAtLS0tLSBSZWFkIHRoZSBmaWxlIGJ5IFBDTFpJUF9SRUFEX0JMT0NLX1NJWkUgb2N0ZXRzIGJsb2Nrcw0KICAgIGZzZWVrKCR2X2ZpbGVfY29tcHJlc3NlZCwgMTApOw0KICAgICR2X3NpemUgPSAkcF9oZWFkZXJbJ2NvbXByZXNzZWRfc2l6ZSddOw0KICAgIHdoaWxlICgkdl9zaXplICE9IDApDQogICAgew0KICAgICAgJHZfcmVhZF9zaXplID0gKCR2X3NpemUgPCBQQ0xaSVBfUkVBRF9CTE9DS19TSVpFID8gJHZfc2l6ZSA6IFBDTFpJUF9SRUFEX0JMT0NLX1NJWkUpOw0KICAgICAgJHZfYnVmZmVyID0gQGZyZWFkKCR2X2ZpbGVfY29tcHJlc3NlZCwgJHZfcmVhZF9zaXplKTsNCiAgICAgIC8vJHZfYmluYXJ5X2RhdGEgPSBwYWNrKCdhJy4kdl9yZWFkX3NpemUsICR2X2J1ZmZlcik7DQogICAgICBAZndyaXRlKCR0aGlzLT56aXBfZmQsICR2X2J1ZmZlciwgJHZfcmVhZF9zaXplKTsNCiAgICAgICR2X3NpemUgLT0gJHZfcmVhZF9zaXplOw0KICAgIH0NCg0KICAgIC8vIC0tLS0tIENsb3NlIHRoZSBmaWxlDQogICAgQGZjbG9zZSgkdl9maWxlX2NvbXByZXNzZWQpOw0KDQogICAgLy8gLS0tLS0gVW5saW5rIHRoZSB0ZW1wb3JhcnkgZmlsZQ0KICAgIEB1bmxpbmsoJHZfZ3ppcF90ZW1wX25hbWUpOw0KICAgIA0KICAgIC8vIC0tLS0tIFJldHVybg0KICAgIHJldHVybiAkdl9yZXN1bHQ7DQogIH0NCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICAvLyBGdW5jdGlvbiA6IHByaXZDYWxjdWxhdGVTdG9yZWRGaWxlbmFtZSgpDQogIC8vIERlc2NyaXB0aW9uIDoNCiAgLy8gICBCYXNlZCBvbiBmaWxlIGRlc2NyaXB0b3IgcHJvcGVydGllcyBhbmQgZ2xvYmFsIG9wdGlvbnMsIHRoaXMgbWV0aG9kDQogIC8vICAgY2FsY3VsYXRlIHRoZSBmaWxlbmFtZSB0aGF0IHdpbGwgYmUgc3RvcmVkIGluIHRoZSBhcmNoaXZlLg0KICAvLyBQYXJhbWV0ZXJzIDoNCiAgLy8gUmV0dXJuIFZhbHVlcyA6DQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogIGZ1bmN0aW9uIHByaXZDYWxjdWxhdGVTdG9yZWRGaWxlbmFtZSgmJHBfZmlsZWRlc2NyLCAmJHBfb3B0aW9ucykNCiAgew0KICAgICR2X3Jlc3VsdD0xOw0KICAgIA0KICAgIC8vIC0tLS0tIFdvcmtpbmcgdmFyaWFibGVzDQogICAgJHBfZmlsZW5hbWUgPSAkcF9maWxlZGVzY3JbJ2ZpbGVuYW1lJ107DQogICAgaWYgKGlzc2V0KCRwX29wdGlvbnNbUENMWklQX09QVF9BRERfUEFUSF0pKSB7DQogICAgICAkcF9hZGRfZGlyID0gJHBfb3B0aW9uc1tQQ0xaSVBfT1BUX0FERF9QQVRIXTsNCiAgICB9DQogICAgZWxzZSB7DQogICAgICAkcF9hZGRfZGlyID0gJyc7DQogICAgfQ0KICAgIGlmIChpc3NldCgkcF9vcHRpb25zW1BDTFpJUF9PUFRfUkVNT1ZFX1BBVEhdKSkgew0KICAgICAgJHBfcmVtb3ZlX2RpciA9ICRwX29wdGlvbnNbUENMWklQX09QVF9SRU1PVkVfUEFUSF07DQogICAgfQ0KICAgIGVsc2Ugew0KICAgICAgJHBfcmVtb3ZlX2RpciA9ICcnOw0KICAgIH0NCiAgICBpZiAoaXNzZXQoJHBfb3B0aW9uc1tQQ0xaSVBfT1BUX1JFTU9WRV9BTExfUEFUSF0pKSB7DQogICAgICAkcF9yZW1vdmVfYWxsX2RpciA9ICRwX29wdGlvbnNbUENMWklQX09QVF9SRU1PVkVfQUxMX1BBVEhdOw0KICAgIH0NCiAgICBlbHNlIHsNCiAgICAgICRwX3JlbW92ZV9hbGxfZGlyID0gMDsNCiAgICB9DQoNCg0KICAgIC8vIC0tLS0tIExvb2sgZm9yIGZ1bGwgbmFtZSBjaGFuZ2UNCiAgICBpZiAoaXNzZXQoJHBfZmlsZWRlc2NyWyduZXdfZnVsbF9uYW1lJ10pKSB7DQogICAgICAvLyAtLS0tLSBSZW1vdmUgZHJpdmUgbGV0dGVyIGlmIGFueQ0KICAgICAgJHZfc3RvcmVkX2ZpbGVuYW1lID0gUGNsWmlwVXRpbFRyYW5zbGF0ZVdpblBhdGgoJHBfZmlsZWRlc2NyWyduZXdfZnVsbF9uYW1lJ10pOw0KICAgIH0NCiAgICANCiAgICAvLyAtLS0tLSBMb29rIGZvciBwYXRoIGFuZC9vciBzaG9ydCBuYW1lIGNoYW5nZQ0KICAgIGVsc2Ugew0KDQogICAgICAvLyAtLS0tLSBMb29rIGZvciBzaG9ydCBuYW1lIGNoYW5nZQ0KICAgICAgLy8gSXRzIHdoZW4gd2UgY2FobmdlIGp1c3QgdGhlIGZpbGVuYW1lIGJ1dCBub3QgdGhlIHBhdGgNCiAgICAgIGlmIChpc3NldCgkcF9maWxlZGVzY3JbJ25ld19zaG9ydF9uYW1lJ10pKSB7DQogICAgICAgICR2X3BhdGhfaW5mbyA9IHBhdGhpbmZvKCRwX2ZpbGVuYW1lKTsNCiAgICAgICAgJHZfZGlyID0gJyc7DQogICAgICAgIGlmICgkdl9wYXRoX2luZm9bJ2Rpcm5hbWUnXSAhPSAnJykgew0KICAgICAgICAgICR2X2RpciA9ICR2X3BhdGhfaW5mb1snZGlybmFtZSddLicvJzsNCiAgICAgICAgfQ0KICAgICAgICAkdl9zdG9yZWRfZmlsZW5hbWUgPSAkdl9kaXIuJHBfZmlsZWRlc2NyWyduZXdfc2hvcnRfbmFtZSddOw0KICAgICAgfQ0KICAgICAgZWxzZSB7DQogICAgICAgIC8vIC0tLS0tIENhbGN1bGF0ZSB0aGUgc3RvcmVkIGZpbGVuYW1lDQogICAgICAgICR2X3N0b3JlZF9maWxlbmFtZSA9ICRwX2ZpbGVuYW1lOw0KICAgICAgfQ0KDQogICAgICAvLyAtLS0tLSBMb29rIGZvciBhbGwgcGF0aCB0byByZW1vdmUNCiAgICAgIGlmICgkcF9yZW1vdmVfYWxsX2Rpcikgew0KICAgICAgICAkdl9zdG9yZWRfZmlsZW5hbWUgPSBiYXNlbmFtZSgkcF9maWxlbmFtZSk7DQogICAgICB9DQogICAgICAvLyAtLS0tLSBMb29rIGZvciBwYXJ0aWFsIHBhdGggcmVtb3ZlDQogICAgICBlbHNlIGlmICgkcF9yZW1vdmVfZGlyICE9ICIiKSB7DQogICAgICAgIGlmIChzdWJzdHIoJHBfcmVtb3ZlX2RpciwgLTEpICE9ICcvJykNCiAgICAgICAgICAkcF9yZW1vdmVfZGlyIC49ICIvIjsNCg0KICAgICAgICBpZiAoICAgKHN1YnN0cigkcF9maWxlbmFtZSwgMCwgMikgPT0gIi4vIikNCiAgICAgICAgICAgIHx8IChzdWJzdHIoJHBfcmVtb3ZlX2RpciwgMCwgMikgPT0gIi4vIikpIHsNCiAgICAgICAgICAgIA0KICAgICAgICAgIGlmICggICAoc3Vic3RyKCRwX2ZpbGVuYW1lLCAwLCAyKSA9PSAiLi8iKQ0KICAgICAgICAgICAgICAmJiAoc3Vic3RyKCRwX3JlbW92ZV9kaXIsIDAsIDIpICE9ICIuLyIpKSB7DQogICAgICAgICAgICAkcF9yZW1vdmVfZGlyID0gIi4vIi4kcF9yZW1vdmVfZGlyOw0KICAgICAgICAgIH0NCiAgICAgICAgICBpZiAoICAgKHN1YnN0cigkcF9maWxlbmFtZSwgMCwgMikgIT0gIi4vIikNCiAgICAgICAgICAgICAgJiYgKHN1YnN0cigkcF9yZW1vdmVfZGlyLCAwLCAyKSA9PSAiLi8iKSkgew0KICAgICAgICAgICAgJHBfcmVtb3ZlX2RpciA9IHN1YnN0cigkcF9yZW1vdmVfZGlyLCAyKTsNCiAgICAgICAgICB9DQogICAgICAgIH0NCg0KICAgICAgICAkdl9jb21wYXJlID0gUGNsWmlwVXRpbFBhdGhJbmNsdXNpb24oJHBfcmVtb3ZlX2RpciwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR2X3N0b3JlZF9maWxlbmFtZSk7DQogICAgICAgIGlmICgkdl9jb21wYXJlID4gMCkgew0KICAgICAgICAgIGlmICgkdl9jb21wYXJlID09IDIpIHsNCiAgICAgICAgICAgICR2X3N0b3JlZF9maWxlbmFtZSA9ICIiOw0KICAgICAgICAgIH0NCiAgICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgICR2X3N0b3JlZF9maWxlbmFtZSA9IHN1YnN0cigkdl9zdG9yZWRfZmlsZW5hbWUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RybGVuKCRwX3JlbW92ZV9kaXIpKTsNCiAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgIH0NCiAgICAgIA0KICAgICAgLy8gLS0tLS0gUmVtb3ZlIGRyaXZlIGxldHRlciBpZiBhbnkNCiAgICAgICR2X3N0b3JlZF9maWxlbmFtZSA9IFBjbFppcFV0aWxUcmFuc2xhdGVXaW5QYXRoKCR2X3N0b3JlZF9maWxlbmFtZSk7DQogICAgICANCiAgICAgIC8vIC0tLS0tIExvb2sgZm9yIHBhdGggdG8gYWRkDQogICAgICBpZiAoJHBfYWRkX2RpciAhPSAiIikgew0KICAgICAgICBpZiAoc3Vic3RyKCRwX2FkZF9kaXIsIC0xKSA9PSAiLyIpDQogICAgICAgICAgJHZfc3RvcmVkX2ZpbGVuYW1lID0gJHBfYWRkX2Rpci4kdl9zdG9yZWRfZmlsZW5hbWU7DQogICAgICAgIGVsc2UNCiAgICAgICAgICAkdl9zdG9yZWRfZmlsZW5hbWUgPSAkcF9hZGRfZGlyLiIvIi4kdl9zdG9yZWRfZmlsZW5hbWU7DQogICAgICB9DQogICAgfQ0KDQogICAgLy8gLS0tLS0gRmlsZW5hbWUgKHJlZHVjZSB0aGUgcGF0aCBvZiBzdG9yZWQgbmFtZSkNCiAgICAkdl9zdG9yZWRfZmlsZW5hbWUgPSBQY2xaaXBVdGlsUGF0aFJlZHVjdGlvbigkdl9zdG9yZWRfZmlsZW5hbWUpOw0KICAgICRwX2ZpbGVkZXNjclsnc3RvcmVkX2ZpbGVuYW1lJ10gPSAkdl9zdG9yZWRfZmlsZW5hbWU7DQogICAgDQogICAgLy8gLS0tLS0gUmV0dXJuDQogICAgcmV0dXJuICR2X3Jlc3VsdDsNCiAgfQ0KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogIC8vIEZ1bmN0aW9uIDogcHJpdldyaXRlRmlsZUhlYWRlcigpDQogIC8vIERlc2NyaXB0aW9uIDoNCiAgLy8gUGFyYW1ldGVycyA6DQogIC8vIFJldHVybiBWYWx1ZXMgOg0KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICBmdW5jdGlvbiBwcml2V3JpdGVGaWxlSGVhZGVyKCYkcF9oZWFkZXIpDQogIHsNCiAgICAkdl9yZXN1bHQ9MTsNCg0KICAgIC8vIC0tLS0tIFN0b3JlIHRoZSBvZmZzZXQgcG9zaXRpb24gb2YgdGhlIGZpbGUNCiAgICAkcF9oZWFkZXJbJ29mZnNldCddID0gZnRlbGwoJHRoaXMtPnppcF9mZCk7DQoNCiAgICAvLyAtLS0tLSBUcmFuc2Zvcm0gVU5JWCBtdGltZSB0byBET1MgZm9ybWF0IG1kYXRlL210aW1lDQogICAgJHZfZGF0ZSA9IGdldGRhdGUoJHBfaGVhZGVyWydtdGltZSddKTsNCiAgICAkdl9tdGltZSA9ICgkdl9kYXRlWydob3VycyddPDwxMSkgKyAoJHZfZGF0ZVsnbWludXRlcyddPDw1KSArICR2X2RhdGVbJ3NlY29uZHMnXS8yOw0KICAgICR2X21kYXRlID0gKCgkdl9kYXRlWyd5ZWFyJ10tMTk4MCk8PDkpICsgKCR2X2RhdGVbJ21vbiddPDw1KSArICR2X2RhdGVbJ21kYXknXTsNCg0KICAgIC8vIC0tLS0tIFBhY2tlZCBkYXRhDQogICAgJHZfYmluYXJ5X2RhdGEgPSBwYWNrKCJWdnZ2dnZWVlZ2diIsIDB4MDQwMzRiNTAsDQoJICAgICAgICAgICAgICAgICAgICAgICRwX2hlYWRlclsndmVyc2lvbl9leHRyYWN0ZWQnXSwgJHBfaGVhZGVyWydmbGFnJ10sDQogICAgICAgICAgICAgICAgICAgICAgICAgICRwX2hlYWRlclsnY29tcHJlc3Npb24nXSwgJHZfbXRpbWUsICR2X21kYXRlLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAkcF9oZWFkZXJbJ2NyYyddLCAkcF9oZWFkZXJbJ2NvbXByZXNzZWRfc2l6ZSddLA0KCQkJCQkJICAkcF9oZWFkZXJbJ3NpemUnXSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgc3RybGVuKCRwX2hlYWRlclsnc3RvcmVkX2ZpbGVuYW1lJ10pLA0KCQkJCQkJICAkcF9oZWFkZXJbJ2V4dHJhX2xlbiddKTsNCg0KICAgIC8vIC0tLS0tIFdyaXRlIHRoZSBmaXJzdCAxNDggYnl0ZXMgb2YgdGhlIGhlYWRlciBpbiB0aGUgYXJjaGl2ZQ0KICAgIGZwdXRzKCR0aGlzLT56aXBfZmQsICR2X2JpbmFyeV9kYXRhLCAzMCk7DQoNCiAgICAvLyAtLS0tLSBXcml0ZSB0aGUgdmFyaWFibGUgZmllbGRzDQogICAgaWYgKHN0cmxlbigkcF9oZWFkZXJbJ3N0b3JlZF9maWxlbmFtZSddKSAhPSAwKQ0KICAgIHsNCiAgICAgIGZwdXRzKCR0aGlzLT56aXBfZmQsICRwX2hlYWRlclsnc3RvcmVkX2ZpbGVuYW1lJ10sIHN0cmxlbigkcF9oZWFkZXJbJ3N0b3JlZF9maWxlbmFtZSddKSk7DQogICAgfQ0KICAgIGlmICgkcF9oZWFkZXJbJ2V4dHJhX2xlbiddICE9IDApDQogICAgew0KICAgICAgZnB1dHMoJHRoaXMtPnppcF9mZCwgJHBfaGVhZGVyWydleHRyYSddLCAkcF9oZWFkZXJbJ2V4dHJhX2xlbiddKTsNCiAgICB9DQoNCiAgICAvLyAtLS0tLSBSZXR1cm4NCiAgICByZXR1cm4gJHZfcmVzdWx0Ow0KICB9DQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAgLy8gRnVuY3Rpb24gOiBwcml2V3JpdGVDZW50cmFsRmlsZUhlYWRlcigpDQogIC8vIERlc2NyaXB0aW9uIDoNCiAgLy8gUGFyYW1ldGVycyA6DQogIC8vIFJldHVybiBWYWx1ZXMgOg0KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICBmdW5jdGlvbiBwcml2V3JpdGVDZW50cmFsRmlsZUhlYWRlcigmJHBfaGVhZGVyKQ0KICB7DQogICAgJHZfcmVzdWx0PTE7DQoNCiAgICAvLyBUQkMNCiAgICAvL2ZvcihyZXNldCgkcF9oZWFkZXIpOyAka2V5ID0ga2V5KCRwX2hlYWRlcik7IG5leHQoJHBfaGVhZGVyKSkgew0KICAgIC8vfQ0KDQogICAgLy8gLS0tLS0gVHJhbnNmb3JtIFVOSVggbXRpbWUgdG8gRE9TIGZvcm1hdCBtZGF0ZS9tdGltZQ0KICAgICR2X2RhdGUgPSBnZXRkYXRlKCRwX2hlYWRlclsnbXRpbWUnXSk7DQogICAgJHZfbXRpbWUgPSAoJHZfZGF0ZVsnaG91cnMnXTw8MTEpICsgKCR2X2RhdGVbJ21pbnV0ZXMnXTw8NSkgKyAkdl9kYXRlWydzZWNvbmRzJ10vMjsNCiAgICAkdl9tZGF0ZSA9ICgoJHZfZGF0ZVsneWVhciddLTE5ODApPDw5KSArICgkdl9kYXRlWydtb24nXTw8NSkgKyAkdl9kYXRlWydtZGF5J107DQoNCg0KICAgIC8vIC0tLS0tIFBhY2tlZCBkYXRhDQogICAgJHZfYmluYXJ5X2RhdGEgPSBwYWNrKCJWdnZ2dnZ2VlZWdnZ2dnZWViIsIDB4MDIwMTRiNTAsDQoJICAgICAgICAgICAgICAgICAgICAgICRwX2hlYWRlclsndmVyc2lvbiddLCAkcF9oZWFkZXJbJ3ZlcnNpb25fZXh0cmFjdGVkJ10sDQogICAgICAgICAgICAgICAgICAgICAgICAgICRwX2hlYWRlclsnZmxhZyddLCAkcF9oZWFkZXJbJ2NvbXByZXNzaW9uJ10sDQoJCQkJCQkgICR2X210aW1lLCAkdl9tZGF0ZSwgJHBfaGVhZGVyWydjcmMnXSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgJHBfaGVhZGVyWydjb21wcmVzc2VkX3NpemUnXSwgJHBfaGVhZGVyWydzaXplJ10sDQogICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmxlbigkcF9oZWFkZXJbJ3N0b3JlZF9maWxlbmFtZSddKSwNCgkJCQkJCSAgJHBfaGVhZGVyWydleHRyYV9sZW4nXSwgJHBfaGVhZGVyWydjb21tZW50X2xlbiddLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAkcF9oZWFkZXJbJ2Rpc2snXSwgJHBfaGVhZGVyWydpbnRlcm5hbCddLA0KCQkJCQkJICAkcF9oZWFkZXJbJ2V4dGVybmFsJ10sICRwX2hlYWRlclsnb2Zmc2V0J10pOw0KDQogICAgLy8gLS0tLS0gV3JpdGUgdGhlIDQyIGJ5dGVzIG9mIHRoZSBoZWFkZXIgaW4gdGhlIHppcCBmaWxlDQogICAgZnB1dHMoJHRoaXMtPnppcF9mZCwgJHZfYmluYXJ5X2RhdGEsIDQ2KTsNCg0KICAgIC8vIC0tLS0tIFdyaXRlIHRoZSB2YXJpYWJsZSBmaWVsZHMNCiAgICBpZiAoc3RybGVuKCRwX2hlYWRlclsnc3RvcmVkX2ZpbGVuYW1lJ10pICE9IDApDQogICAgew0KICAgICAgZnB1dHMoJHRoaXMtPnppcF9mZCwgJHBfaGVhZGVyWydzdG9yZWRfZmlsZW5hbWUnXSwgc3RybGVuKCRwX2hlYWRlclsnc3RvcmVkX2ZpbGVuYW1lJ10pKTsNCiAgICB9DQogICAgaWYgKCRwX2hlYWRlclsnZXh0cmFfbGVuJ10gIT0gMCkNCiAgICB7DQogICAgICBmcHV0cygkdGhpcy0+emlwX2ZkLCAkcF9oZWFkZXJbJ2V4dHJhJ10sICRwX2hlYWRlclsnZXh0cmFfbGVuJ10pOw0KICAgIH0NCiAgICBpZiAoJHBfaGVhZGVyWydjb21tZW50X2xlbiddICE9IDApDQogICAgew0KICAgICAgZnB1dHMoJHRoaXMtPnppcF9mZCwgJHBfaGVhZGVyWydjb21tZW50J10sICRwX2hlYWRlclsnY29tbWVudF9sZW4nXSk7DQogICAgfQ0KDQogICAgLy8gLS0tLS0gUmV0dXJuDQogICAgcmV0dXJuICR2X3Jlc3VsdDsNCiAgfQ0KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogIC8vIEZ1bmN0aW9uIDogcHJpdldyaXRlQ2VudHJhbEhlYWRlcigpDQogIC8vIERlc2NyaXB0aW9uIDoNCiAgLy8gUGFyYW1ldGVycyA6DQogIC8vIFJldHVybiBWYWx1ZXMgOg0KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICBmdW5jdGlvbiBwcml2V3JpdGVDZW50cmFsSGVhZGVyKCRwX25iX2VudHJpZXMsICRwX3NpemUsICRwX29mZnNldCwgJHBfY29tbWVudCkNCiAgew0KICAgICR2X3Jlc3VsdD0xOw0KDQogICAgLy8gLS0tLS0gUGFja2VkIGRhdGENCiAgICAkdl9iaW5hcnlfZGF0YSA9IHBhY2soIlZ2dnZ2VlZ2IiwgMHgwNjA1NGI1MCwgMCwgMCwgJHBfbmJfZW50cmllcywNCgkgICAgICAgICAgICAgICAgICAgICAgJHBfbmJfZW50cmllcywgJHBfc2l6ZSwNCgkJCQkJCSAgJHBfb2Zmc2V0LCBzdHJsZW4oJHBfY29tbWVudCkpOw0KDQogICAgLy8gLS0tLS0gV3JpdGUgdGhlIDIyIGJ5dGVzIG9mIHRoZSBoZWFkZXIgaW4gdGhlIHppcCBmaWxlDQogICAgZnB1dHMoJHRoaXMtPnppcF9mZCwgJHZfYmluYXJ5X2RhdGEsIDIyKTsNCg0KICAgIC8vIC0tLS0tIFdyaXRlIHRoZSB2YXJpYWJsZSBmaWVsZHMNCiAgICBpZiAoc3RybGVuKCRwX2NvbW1lbnQpICE9IDApDQogICAgew0KICAgICAgZnB1dHMoJHRoaXMtPnppcF9mZCwgJHBfY29tbWVudCwgc3RybGVuKCRwX2NvbW1lbnQpKTsNCiAgICB9DQoNCiAgICAvLyAtLS0tLSBSZXR1cm4NCiAgICByZXR1cm4gJHZfcmVzdWx0Ow0KICB9DQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAgLy8gRnVuY3Rpb24gOiBwcml2TGlzdCgpDQogIC8vIERlc2NyaXB0aW9uIDoNCiAgLy8gUGFyYW1ldGVycyA6DQogIC8vIFJldHVybiBWYWx1ZXMgOg0KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICBmdW5jdGlvbiBwcml2TGlzdCgmJHBfbGlzdCkNCiAgew0KICAgICR2X3Jlc3VsdD0xOw0KDQogICAgLy8gLS0tLS0gTWFnaWMgcXVvdGVzIHRyaWNrDQogICAgJHRoaXMtPnByaXZEaXNhYmxlTWFnaWNRdW90ZXMoKTsNCg0KICAgIC8vIC0tLS0tIE9wZW4gdGhlIHppcCBmaWxlDQogICAgaWYgKCgkdGhpcy0+emlwX2ZkID0gQGZvcGVuKCR0aGlzLT56aXBuYW1lLCAncmInKSkgPT0gMCkNCiAgICB7DQogICAgICAvLyAtLS0tLSBNYWdpYyBxdW90ZXMgdHJpY2sNCiAgICAgICR0aGlzLT5wcml2U3dhcEJhY2tNYWdpY1F1b3RlcygpOw0KICAgICAgDQogICAgICAvLyAtLS0tLSBFcnJvciBsb2cNCiAgICAgIFBjbFppcDo6cHJpdkVycm9yTG9nKFBDTFpJUF9FUlJfUkVBRF9PUEVOX0ZBSUwsICdVbmFibGUgdG8gb3BlbiBhcmNoaXZlIFwnJy4kdGhpcy0+emlwbmFtZS4nXCcgaW4gYmluYXJ5IHJlYWQgbW9kZScpOw0KDQogICAgICAvLyAtLS0tLSBSZXR1cm4NCiAgICAgIHJldHVybiBQY2xaaXA6OmVycm9yQ29kZSgpOw0KICAgIH0NCg0KICAgIC8vIC0tLS0tIFJlYWQgdGhlIGNlbnRyYWwgZGlyZWN0b3J5IGluZm9ybWF0aW9ucw0KICAgICR2X2NlbnRyYWxfZGlyID0gYXJyYXkoKTsNCiAgICBpZiAoKCR2X3Jlc3VsdCA9ICR0aGlzLT5wcml2UmVhZEVuZENlbnRyYWxEaXIoJHZfY2VudHJhbF9kaXIpKSAhPSAxKQ0KICAgIHsNCiAgICAgICR0aGlzLT5wcml2U3dhcEJhY2tNYWdpY1F1b3RlcygpOw0KICAgICAgcmV0dXJuICR2X3Jlc3VsdDsNCiAgICB9DQoNCiAgICAvLyAtLS0tLSBHbyB0byBiZWdpbm5pbmcgb2YgQ2VudHJhbCBEaXINCiAgICBAcmV3aW5kKCR0aGlzLT56aXBfZmQpOw0KICAgIGlmIChAZnNlZWsoJHRoaXMtPnppcF9mZCwgJHZfY2VudHJhbF9kaXJbJ29mZnNldCddKSkNCiAgICB7DQogICAgICAkdGhpcy0+cHJpdlN3YXBCYWNrTWFnaWNRdW90ZXMoKTsNCg0KICAgICAgLy8gLS0tLS0gRXJyb3IgbG9nDQogICAgICBQY2xaaXA6OnByaXZFcnJvckxvZyhQQ0xaSVBfRVJSX0lOVkFMSURfQVJDSElWRV9aSVAsICdJbnZhbGlkIGFyY2hpdmUgc2l6ZScpOw0KDQogICAgICAvLyAtLS0tLSBSZXR1cm4NCiAgICAgIHJldHVybiBQY2xaaXA6OmVycm9yQ29kZSgpOw0KICAgIH0NCg0KICAgIC8vIC0tLS0tIFJlYWQgZWFjaCBlbnRyeQ0KICAgIGZvciAoJGk9MDsgJGk8JHZfY2VudHJhbF9kaXJbJ2VudHJpZXMnXTsgJGkrKykNCiAgICB7DQogICAgICAvLyAtLS0tLSBSZWFkIHRoZSBmaWxlIGhlYWRlcg0KICAgICAgaWYgKCgkdl9yZXN1bHQgPSAkdGhpcy0+cHJpdlJlYWRDZW50cmFsRmlsZUhlYWRlcigkdl9oZWFkZXIpKSAhPSAxKQ0KICAgICAgew0KICAgICAgICAkdGhpcy0+cHJpdlN3YXBCYWNrTWFnaWNRdW90ZXMoKTsNCiAgICAgICAgcmV0dXJuICR2X3Jlc3VsdDsNCiAgICAgIH0NCiAgICAgICR2X2hlYWRlclsnaW5kZXgnXSA9ICRpOw0KDQogICAgICAvLyAtLS0tLSBHZXQgdGhlIG9ubHkgaW50ZXJlc3RpbmcgYXR0cmlidXRlcw0KICAgICAgJHRoaXMtPnByaXZDb252ZXJ0SGVhZGVyMkZpbGVJbmZvKCR2X2hlYWRlciwgJHBfbGlzdFskaV0pOw0KICAgICAgdW5zZXQoJHZfaGVhZGVyKTsNCiAgICB9DQoNCiAgICAvLyAtLS0tLSBDbG9zZSB0aGUgemlwIGZpbGUNCiAgICAkdGhpcy0+cHJpdkNsb3NlRmQoKTsNCg0KICAgIC8vIC0tLS0tIE1hZ2ljIHF1b3RlcyB0cmljaw0KICAgICR0aGlzLT5wcml2U3dhcEJhY2tNYWdpY1F1b3RlcygpOw0KDQogICAgLy8gLS0tLS0gUmV0dXJuDQogICAgcmV0dXJuICR2X3Jlc3VsdDsNCiAgfQ0KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogIC8vIEZ1bmN0aW9uIDogcHJpdkNvbnZlcnRIZWFkZXIyRmlsZUluZm8oKQ0KICAvLyBEZXNjcmlwdGlvbiA6DQogIC8vICAgVGhpcyBmdW5jdGlvbiB0YWtlcyB0aGUgZmlsZSBpbmZvcm1hdGlvbnMgZnJvbSB0aGUgY2VudHJhbCBkaXJlY3RvcnkNCiAgLy8gICBlbnRyaWVzIGFuZCBleHRyYWN0IHRoZSBpbnRlcmVzdGluZyBwYXJhbWV0ZXJzIHRoYXQgd2lsbCBiZSBnaXZlbiBiYWNrLg0KICAvLyAgIFRoZSByZXN1bHRpbmcgZmlsZSBpbmZvcyBhcmUgc2V0IGluIHRoZSBhcnJheSAkcF9pbmZvDQogIC8vICAgICAkcF9pbmZvWydmaWxlbmFtZSddIDogRmlsZW5hbWUgd2l0aCBmdWxsIHBhdGguIEdpdmVuIGJ5IHVzZXIgKGFkZCksDQogIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFjdGVkIGluIHRoZSBmaWxlc3lzdGVtIChleHRyYWN0KS4NCiAgLy8gICAgICRwX2luZm9bJ3N0b3JlZF9maWxlbmFtZSddIDogU3RvcmVkIGZpbGVuYW1lIGluIHRoZSBhcmNoaXZlLg0KICAvLyAgICAgJHBfaW5mb1snc2l6ZSddID0gU2l6ZSBvZiB0aGUgZmlsZS4NCiAgLy8gICAgICRwX2luZm9bJ2NvbXByZXNzZWRfc2l6ZSddID0gQ29tcHJlc3NlZCBzaXplIG9mIHRoZSBmaWxlLg0KICAvLyAgICAgJHBfaW5mb1snbXRpbWUnXSA9IExhc3QgbW9kaWZpY2F0aW9uIGRhdGUgb2YgdGhlIGZpbGUuDQogIC8vICAgICAkcF9pbmZvWydjb21tZW50J10gPSBDb21tZW50IGFzc29jaWF0ZWQgd2l0aCB0aGUgZmlsZS4NCiAgLy8gICAgICRwX2luZm9bJ2ZvbGRlciddID0gdHJ1ZS9mYWxzZSA6IGluZGljYXRlcyBpZiB0aGUgZW50cnkgaXMgYSBmb2xkZXIgb3Igbm90Lg0KICAvLyAgICAgJHBfaW5mb1snc3RhdHVzJ10gPSBzdGF0dXMgb2YgdGhlIGFjdGlvbiBvbiB0aGUgZmlsZS4NCiAgLy8gICAgICRwX2luZm9bJ2NyYyddID0gQ1JDIG9mIHRoZSBmaWxlIGNvbnRlbnQuDQogIC8vIFBhcmFtZXRlcnMgOg0KICAvLyBSZXR1cm4gVmFsdWVzIDoNCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAgZnVuY3Rpb24gcHJpdkNvbnZlcnRIZWFkZXIyRmlsZUluZm8oJHBfaGVhZGVyLCAmJHBfaW5mbykNCiAgew0KICAgICR2X3Jlc3VsdD0xOw0KDQogICAgLy8gLS0tLS0gR2V0IHRoZSBpbnRlcmVzdGluZyBhdHRyaWJ1dGVzDQogICAgJHZfdGVtcF9wYXRoID0gUGNsWmlwVXRpbFBhdGhSZWR1Y3Rpb24oJHBfaGVhZGVyWydmaWxlbmFtZSddKTsNCiAgICAkcF9pbmZvWydmaWxlbmFtZSddID0gJHZfdGVtcF9wYXRoOw0KICAgICR2X3RlbXBfcGF0aCA9IFBjbFppcFV0aWxQYXRoUmVkdWN0aW9uKCRwX2hlYWRlclsnc3RvcmVkX2ZpbGVuYW1lJ10pOw0KICAgICRwX2luZm9bJ3N0b3JlZF9maWxlbmFtZSddID0gJHZfdGVtcF9wYXRoOw0KICAgICRwX2luZm9bJ3NpemUnXSA9ICRwX2hlYWRlclsnc2l6ZSddOw0KICAgICRwX2luZm9bJ2NvbXByZXNzZWRfc2l6ZSddID0gJHBfaGVhZGVyWydjb21wcmVzc2VkX3NpemUnXTsNCiAgICAkcF9pbmZvWydtdGltZSddID0gJHBfaGVhZGVyWydtdGltZSddOw0KICAgICRwX2luZm9bJ2NvbW1lbnQnXSA9ICRwX2hlYWRlclsnY29tbWVudCddOw0KICAgICRwX2luZm9bJ2ZvbGRlciddID0gKCgkcF9oZWFkZXJbJ2V4dGVybmFsJ10mMHgwMDAwMDAxMCk9PTB4MDAwMDAwMTApOw0KICAgICRwX2luZm9bJ2luZGV4J10gPSAkcF9oZWFkZXJbJ2luZGV4J107DQogICAgJHBfaW5mb1snc3RhdHVzJ10gPSAkcF9oZWFkZXJbJ3N0YXR1cyddOw0KICAgICRwX2luZm9bJ2NyYyddID0gJHBfaGVhZGVyWydjcmMnXTsNCg0KICAgIC8vIC0tLS0tIFJldHVybg0KICAgIHJldHVybiAkdl9yZXN1bHQ7DQogIH0NCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICAvLyBGdW5jdGlvbiA6IHByaXZFeHRyYWN0QnlSdWxlKCkNCiAgLy8gRGVzY3JpcHRpb24gOg0KICAvLyAgIEV4dHJhY3QgYSBmaWxlIG9yIGRpcmVjdG9yeSBkZXBlbmRpbmcgb2YgcnVsZXMgKGJ5IGluZGV4LCBieSBuYW1lLCAuLi4pDQogIC8vIFBhcmFtZXRlcnMgOg0KICAvLyAgICRwX2ZpbGVfbGlzdCA6IEFuIGFycmF5IHdoZXJlIHdpbGwgYmUgcGxhY2VkIHRoZSBwcm9wZXJ0aWVzIG9mIGVhY2gNCiAgLy8gICAgICAgICAgICAgICAgICBleHRyYWN0ZWQgZmlsZQ0KICAvLyAgICRwX3BhdGggOiBQYXRoIHRvIGFkZCB3aGlsZSB3cml0aW5nIHRoZSBleHRyYWN0ZWQgZmlsZXMNCiAgLy8gICAkcF9yZW1vdmVfcGF0aCA6IFBhdGggdG8gcmVtb3ZlIChmcm9tIHRoZSBmaWxlIG1lbW9yaXplZCBwYXRoKSB3aGlsZSB3cml0aW5nIHRoZQ0KICAvLyAgICAgICAgICAgICAgICAgICAgZXh0cmFjdGVkIGZpbGVzLiBJZiB0aGUgcGF0aCBkb2VzIG5vdCBtYXRjaCB0aGUgZmlsZSBwYXRoLA0KICAvLyAgICAgICAgICAgICAgICAgICAgdGhlIGZpbGUgaXMgZXh0cmFjdGVkIHdpdGggaXRzIG1lbW9yaXplZCBwYXRoLg0KICAvLyAgICAgICAgICAgICAgICAgICAgJHBfcmVtb3ZlX3BhdGggZG9lcyBub3QgYXBwbHkgdG8gJ2xpc3QnIG1vZGUuDQogIC8vICAgICAgICAgICAgICAgICAgICAkcF9wYXRoIGFuZCAkcF9yZW1vdmVfcGF0aCBhcmUgY29tbXVsYXRpdmUuDQogIC8vIFJldHVybiBWYWx1ZXMgOg0KICAvLyAgIDEgb24gc3VjY2VzcywwIG9yIGxlc3Mgb24gZXJyb3IgKHNlZSBlcnJvciBjb2RlIGxpc3QpDQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogIGZ1bmN0aW9uIHByaXZFeHRyYWN0QnlSdWxlKCYkcF9maWxlX2xpc3QsICRwX3BhdGgsICRwX3JlbW92ZV9wYXRoLCAkcF9yZW1vdmVfYWxsX3BhdGgsICYkcF9vcHRpb25zKQ0KICB7DQogICAgJHZfcmVzdWx0PTE7DQoNCiAgICAvLyAtLS0tLSBNYWdpYyBxdW90ZXMgdHJpY2sNCiAgICAkdGhpcy0+cHJpdkRpc2FibGVNYWdpY1F1b3RlcygpOw0KDQogICAgLy8gLS0tLS0gQ2hlY2sgdGhlIHBhdGgNCiAgICBpZiAoICAgKCRwX3BhdGggPT0gIiIpDQoJICAgIHx8ICggICAoc3Vic3RyKCRwX3BhdGgsIDAsIDEpICE9ICIvIikNCgkJICAgICYmIChzdWJzdHIoJHBfcGF0aCwgMCwgMykgIT0gIi4uLyIpDQoJCQkmJiAoc3Vic3RyKCRwX3BhdGgsMSwyKSE9IjovIikpKQ0KICAgICAgJHBfcGF0aCA9ICIuLyIuJHBfcGF0aDsNCg0KICAgIC8vIC0tLS0tIFJlZHVjZSB0aGUgcGF0aCBsYXN0IChhbmQgZHVwbGljYXRlZCkgJy8nDQogICAgaWYgKCgkcF9wYXRoICE9ICIuLyIpICYmICgkcF9wYXRoICE9ICIvIikpDQogICAgew0KICAgICAgLy8gLS0tLS0gTG9vayBmb3IgdGhlIHBhdGggZW5kICcvJw0KICAgICAgd2hpbGUgKHN1YnN0cigkcF9wYXRoLCAtMSkgPT0gIi8iKQ0KICAgICAgew0KICAgICAgICAkcF9wYXRoID0gc3Vic3RyKCRwX3BhdGgsIDAsIHN0cmxlbigkcF9wYXRoKS0xKTsNCiAgICAgIH0NCiAgICB9DQoNCiAgICAvLyAtLS0tLSBMb29rIGZvciBwYXRoIHRvIHJlbW92ZSBmb3JtYXQgKHNob3VsZCBlbmQgYnkgLykNCiAgICBpZiAoKCRwX3JlbW92ZV9wYXRoICE9ICIiKSAmJiAoc3Vic3RyKCRwX3JlbW92ZV9wYXRoLCAtMSkgIT0gJy8nKSkNCiAgICB7DQogICAgICAkcF9yZW1vdmVfcGF0aCAuPSAnLyc7DQogICAgfQ0KICAgICRwX3JlbW92ZV9wYXRoX3NpemUgPSBzdHJsZW4oJHBfcmVtb3ZlX3BhdGgpOw0KDQogICAgLy8gLS0tLS0gT3BlbiB0aGUgemlwIGZpbGUNCiAgICBpZiAoKCR2X3Jlc3VsdCA9ICR0aGlzLT5wcml2T3BlbkZkKCdyYicpKSAhPSAxKQ0KICAgIHsNCiAgICAgICR0aGlzLT5wcml2U3dhcEJhY2tNYWdpY1F1b3RlcygpOw0KICAgICAgcmV0dXJuICR2X3Jlc3VsdDsNCiAgICB9DQoNCiAgICAvLyAtLS0tLSBSZWFkIHRoZSBjZW50cmFsIGRpcmVjdG9yeSBpbmZvcm1hdGlvbnMNCiAgICAkdl9jZW50cmFsX2RpciA9IGFycmF5KCk7DQogICAgaWYgKCgkdl9yZXN1bHQgPSAkdGhpcy0+cHJpdlJlYWRFbmRDZW50cmFsRGlyKCR2X2NlbnRyYWxfZGlyKSkgIT0gMSkNCiAgICB7DQogICAgICAvLyAtLS0tLSBDbG9zZSB0aGUgemlwIGZpbGUNCiAgICAgICR0aGlzLT5wcml2Q2xvc2VGZCgpOw0KICAgICAgJHRoaXMtPnByaXZTd2FwQmFja01hZ2ljUXVvdGVzKCk7DQoNCiAgICAgIHJldHVybiAkdl9yZXN1bHQ7DQogICAgfQ0KDQogICAgLy8gLS0tLS0gU3RhcnQgYXQgYmVnaW5uaW5nIG9mIENlbnRyYWwgRGlyDQogICAgJHZfcG9zX2VudHJ5ID0gJHZfY2VudHJhbF9kaXJbJ29mZnNldCddOw0KDQogICAgLy8gLS0tLS0gUmVhZCBlYWNoIGVudHJ5DQogICAgJGpfc3RhcnQgPSAwOw0KICAgIGZvciAoJGk9MCwgJHZfbmJfZXh0cmFjdGVkPTA7ICRpPCR2X2NlbnRyYWxfZGlyWydlbnRyaWVzJ107ICRpKyspDQogICAgew0KDQogICAgICAvLyAtLS0tLSBSZWFkIG5leHQgQ2VudHJhbCBkaXIgZW50cnkNCiAgICAgIEByZXdpbmQoJHRoaXMtPnppcF9mZCk7DQogICAgICBpZiAoQGZzZWVrKCR0aGlzLT56aXBfZmQsICR2X3Bvc19lbnRyeSkpDQogICAgICB7DQogICAgICAgIC8vIC0tLS0tIENsb3NlIHRoZSB6aXAgZmlsZQ0KICAgICAgICAkdGhpcy0+cHJpdkNsb3NlRmQoKTsNCiAgICAgICAgJHRoaXMtPnByaXZTd2FwQmFja01hZ2ljUXVvdGVzKCk7DQoNCiAgICAgICAgLy8gLS0tLS0gRXJyb3IgbG9nDQogICAgICAgIFBjbFppcDo6cHJpdkVycm9yTG9nKFBDTFpJUF9FUlJfSU5WQUxJRF9BUkNISVZFX1pJUCwgJ0ludmFsaWQgYXJjaGl2ZSBzaXplJyk7DQoNCiAgICAgICAgLy8gLS0tLS0gUmV0dXJuDQogICAgICAgIHJldHVybiBQY2xaaXA6OmVycm9yQ29kZSgpOw0KICAgICAgfQ0KDQogICAgICAvLyAtLS0tLSBSZWFkIHRoZSBmaWxlIGhlYWRlcg0KICAgICAgJHZfaGVhZGVyID0gYXJyYXkoKTsNCiAgICAgIGlmICgoJHZfcmVzdWx0ID0gJHRoaXMtPnByaXZSZWFkQ2VudHJhbEZpbGVIZWFkZXIoJHZfaGVhZGVyKSkgIT0gMSkNCiAgICAgIHsNCiAgICAgICAgLy8gLS0tLS0gQ2xvc2UgdGhlIHppcCBmaWxlDQogICAgICAgICR0aGlzLT5wcml2Q2xvc2VGZCgpOw0KICAgICAgICAkdGhpcy0+cHJpdlN3YXBCYWNrTWFnaWNRdW90ZXMoKTsNCg0KICAgICAgICByZXR1cm4gJHZfcmVzdWx0Ow0KICAgICAgfQ0KDQogICAgICAvLyAtLS0tLSBTdG9yZSB0aGUgaW5kZXgNCiAgICAgICR2X2hlYWRlclsnaW5kZXgnXSA9ICRpOw0KDQogICAgICAvLyAtLS0tLSBTdG9yZSB0aGUgZmlsZSBwb3NpdGlvbg0KICAgICAgJHZfcG9zX2VudHJ5ID0gZnRlbGwoJHRoaXMtPnppcF9mZCk7DQoNCiAgICAgIC8vIC0tLS0tIExvb2sgZm9yIHRoZSBzcGVjaWZpYyBleHRyYWN0IHJ1bGVzDQogICAgICAkdl9leHRyYWN0ID0gZmFsc2U7DQoNCiAgICAgIC8vIC0tLS0tIExvb2sgZm9yIGV4dHJhY3QgYnkgbmFtZSBydWxlDQogICAgICBpZiAoICAgKGlzc2V0KCRwX29wdGlvbnNbUENMWklQX09QVF9CWV9OQU1FXSkpDQogICAgICAgICAgJiYgKCRwX29wdGlvbnNbUENMWklQX09QVF9CWV9OQU1FXSAhPSAwKSkgew0KDQogICAgICAgICAgLy8gLS0tLS0gTG9vayBpZiB0aGUgZmlsZW5hbWUgaXMgaW4gdGhlIGxpc3QNCiAgICAgICAgICBmb3IgKCRqPTA7ICgkajxzaXplb2YoJHBfb3B0aW9uc1tQQ0xaSVBfT1BUX0JZX05BTUVdKSkgJiYgKCEkdl9leHRyYWN0KTsgJGorKykgew0KDQogICAgICAgICAgICAgIC8vIC0tLS0tIExvb2sgZm9yIGEgZGlyZWN0b3J5DQogICAgICAgICAgICAgIGlmIChzdWJzdHIoJHBfb3B0aW9uc1tQQ0xaSVBfT1BUX0JZX05BTUVdWyRqXSwgLTEpID09ICIvIikgew0KDQogICAgICAgICAgICAgICAgICAvLyAtLS0tLSBMb29rIGlmIHRoZSBkaXJlY3RvcnkgaXMgaW4gdGhlIGZpbGVuYW1lIHBhdGgNCiAgICAgICAgICAgICAgICAgIGlmICggICAoc3RybGVuKCR2X2hlYWRlclsnc3RvcmVkX2ZpbGVuYW1lJ10pID4gc3RybGVuKCRwX29wdGlvbnNbUENMWklQX09QVF9CWV9OQU1FXVskal0pKQ0KICAgICAgICAgICAgICAgICAgICAgICYmIChzdWJzdHIoJHZfaGVhZGVyWydzdG9yZWRfZmlsZW5hbWUnXSwgMCwgc3RybGVuKCRwX29wdGlvbnNbUENMWklQX09QVF9CWV9OQU1FXVskal0pKSA9PSAkcF9vcHRpb25zW1BDTFpJUF9PUFRfQllfTkFNRV1bJGpdKSkgew0KICAgICAgICAgICAgICAgICAgICAgICR2X2V4dHJhY3QgPSB0cnVlOw0KICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgIC8vIC0tLS0tIExvb2sgZm9yIGEgZmlsZW5hbWUNCiAgICAgICAgICAgICAgZWxzZWlmICgkdl9oZWFkZXJbJ3N0b3JlZF9maWxlbmFtZSddID09ICRwX29wdGlvbnNbUENMWklQX09QVF9CWV9OQU1FXVskal0pIHsNCiAgICAgICAgICAgICAgICAgICR2X2V4dHJhY3QgPSB0cnVlOw0KICAgICAgICAgICAgICB9DQogICAgICAgICAgfQ0KICAgICAgfQ0KDQogICAgICAvLyAtLS0tLSBMb29rIGZvciBleHRyYWN0IGJ5IGVyZWcgcnVsZQ0KICAgICAgLy8gZXJlZygpIGlzIGRlcHJlY2F0ZWQgd2l0aCBQSFAgNS4zDQogICAgICAvKiANCiAgICAgIGVsc2UgaWYgKCAgIChpc3NldCgkcF9vcHRpb25zW1BDTFpJUF9PUFRfQllfRVJFR10pKQ0KICAgICAgICAgICAgICAgJiYgKCRwX29wdGlvbnNbUENMWklQX09QVF9CWV9FUkVHXSAhPSAiIikpIHsNCg0KICAgICAgICAgIGlmIChlcmVnKCRwX29wdGlvbnNbUENMWklQX09QVF9CWV9FUkVHXSwgJHZfaGVhZGVyWydzdG9yZWRfZmlsZW5hbWUnXSkpIHsNCiAgICAgICAgICAgICAgJHZfZXh0cmFjdCA9IHRydWU7DQogICAgICAgICAgfQ0KICAgICAgfQ0KICAgICAgKi8NCg0KICAgICAgLy8gLS0tLS0gTG9vayBmb3IgZXh0cmFjdCBieSBwcmVnIHJ1bGUNCiAgICAgIGVsc2UgaWYgKCAgIChpc3NldCgkcF9vcHRpb25zW1BDTFpJUF9PUFRfQllfUFJFR10pKQ0KICAgICAgICAgICAgICAgJiYgKCRwX29wdGlvbnNbUENMWklQX09QVF9CWV9QUkVHXSAhPSAiIikpIHsNCg0KICAgICAgICAgIGlmIChwcmVnX21hdGNoKCRwX29wdGlvbnNbUENMWklQX09QVF9CWV9QUkVHXSwgJHZfaGVhZGVyWydzdG9yZWRfZmlsZW5hbWUnXSkpIHsNCiAgICAgICAgICAgICAgJHZfZXh0cmFjdCA9IHRydWU7DQogICAgICAgICAgfQ0KICAgICAgfQ0KDQogICAgICAvLyAtLS0tLSBMb29rIGZvciBleHRyYWN0IGJ5IGluZGV4IHJ1bGUNCiAgICAgIGVsc2UgaWYgKCAgIChpc3NldCgkcF9vcHRpb25zW1BDTFpJUF9PUFRfQllfSU5ERVhdKSkNCiAgICAgICAgICAgICAgICYmICgkcF9vcHRpb25zW1BDTFpJUF9PUFRfQllfSU5ERVhdICE9IDApKSB7DQogICAgICAgICAgDQogICAgICAgICAgLy8gLS0tLS0gTG9vayBpZiB0aGUgaW5kZXggaXMgaW4gdGhlIGxpc3QNCiAgICAgICAgICBmb3IgKCRqPSRqX3N0YXJ0OyAoJGo8c2l6ZW9mKCRwX29wdGlvbnNbUENMWklQX09QVF9CWV9JTkRFWF0pKSAmJiAoISR2X2V4dHJhY3QpOyAkaisrKSB7DQoNCiAgICAgICAgICAgICAgaWYgKCgkaT49JHBfb3B0aW9uc1tQQ0xaSVBfT1BUX0JZX0lOREVYXVskal1bJ3N0YXJ0J10pICYmICgkaTw9JHBfb3B0aW9uc1tQQ0xaSVBfT1BUX0JZX0lOREVYXVskal1bJ2VuZCddKSkgew0KICAgICAgICAgICAgICAgICAgJHZfZXh0cmFjdCA9IHRydWU7DQogICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgaWYgKCRpPj0kcF9vcHRpb25zW1BDTFpJUF9PUFRfQllfSU5ERVhdWyRqXVsnZW5kJ10pIHsNCiAgICAgICAgICAgICAgICAgICRqX3N0YXJ0ID0gJGorMTsNCiAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgIGlmICgkcF9vcHRpb25zW1BDTFpJUF9PUFRfQllfSU5ERVhdWyRqXVsnc3RhcnQnXT4kaSkgew0KICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgIH0NCiAgICAgICAgICB9DQogICAgICB9DQoNCiAgICAgIC8vIC0tLS0tIExvb2sgZm9yIG5vIHJ1bGUsIHdoaWNoIG1lYW5zIGV4dHJhY3QgYWxsIHRoZSBhcmNoaXZlDQogICAgICBlbHNlIHsNCiAgICAgICAgICAkdl9leHRyYWN0ID0gdHJ1ZTsNCiAgICAgIH0NCg0KCSAgLy8gLS0tLS0gQ2hlY2sgY29tcHJlc3Npb24gbWV0aG9kDQoJICBpZiAoICAgKCR2X2V4dHJhY3QpDQoJICAgICAgJiYgKCAgICgkdl9oZWFkZXJbJ2NvbXByZXNzaW9uJ10gIT0gOCkNCgkJICAgICAgJiYgKCR2X2hlYWRlclsnY29tcHJlc3Npb24nXSAhPSAwKSkpIHsNCiAgICAgICAgICAkdl9oZWFkZXJbJ3N0YXR1cyddID0gJ3Vuc3VwcG9ydGVkX2NvbXByZXNzaW9uJzsNCg0KICAgICAgICAgIC8vIC0tLS0tIExvb2sgZm9yIFBDTFpJUF9PUFRfU1RPUF9PTl9FUlJPUg0KICAgICAgICAgIGlmICggICAoaXNzZXQoJHBfb3B0aW9uc1tQQ0xaSVBfT1BUX1NUT1BfT05fRVJST1JdKSkNCgkJICAgICAgJiYgKCRwX29wdGlvbnNbUENMWklQX09QVF9TVE9QX09OX0VSUk9SXT09PXRydWUpKSB7DQoNCiAgICAgICAgICAgICAgJHRoaXMtPnByaXZTd2FwQmFja01hZ2ljUXVvdGVzKCk7DQogICAgICAgICAgICAgIA0KICAgICAgICAgICAgICBQY2xaaXA6OnByaXZFcnJvckxvZyhQQ0xaSVBfRVJSX1VOU1VQUE9SVEVEX0NPTVBSRVNTSU9OLA0KCQkJICAgICAgICAgICAgICAgICAgICAgICAiRmlsZW5hbWUgJyIuJHZfaGVhZGVyWydzdG9yZWRfZmlsZW5hbWUnXS4iJyBpcyAiDQoJCQkJICAJICAgIAkgIAkgICAuImNvbXByZXNzZWQgYnkgYW4gdW5zdXBwb3J0ZWQgY29tcHJlc3Npb24gIg0KCQkJCSAgCSAgICAJICAJICAgLiJtZXRob2QgKCIuJHZfaGVhZGVyWydjb21wcmVzc2lvbiddLiIpICIpOw0KDQogICAgICAgICAgICAgIHJldHVybiBQY2xaaXA6OmVycm9yQ29kZSgpOw0KCQkgIH0NCgkgIH0NCgkgIA0KCSAgLy8gLS0tLS0gQ2hlY2sgZW5jcnlwdGVkIGZpbGVzDQoJICBpZiAoKCR2X2V4dHJhY3QpICYmICgoJHZfaGVhZGVyWydmbGFnJ10gJiAxKSA9PSAxKSkgew0KICAgICAgICAgICR2X2hlYWRlclsnc3RhdHVzJ10gPSAndW5zdXBwb3J0ZWRfZW5jcnlwdGlvbic7DQoNCiAgICAgICAgICAvLyAtLS0tLSBMb29rIGZvciBQQ0xaSVBfT1BUX1NUT1BfT05fRVJST1INCiAgICAgICAgICBpZiAoICAgKGlzc2V0KCRwX29wdGlvbnNbUENMWklQX09QVF9TVE9QX09OX0VSUk9SXSkpDQoJCSAgICAgICYmICgkcF9vcHRpb25zW1BDTFpJUF9PUFRfU1RPUF9PTl9FUlJPUl09PT10cnVlKSkgew0KDQogICAgICAgICAgICAgICR0aGlzLT5wcml2U3dhcEJhY2tNYWdpY1F1b3RlcygpOw0KDQogICAgICAgICAgICAgIFBjbFppcDo6cHJpdkVycm9yTG9nKFBDTFpJUF9FUlJfVU5TVVBQT1JURURfRU5DUllQVElPTiwNCgkJCSAgICAgICAgICAgICAgICAgICAgICAgIlVuc3VwcG9ydGVkIGVuY3J5cHRpb24gZm9yICINCgkJCQkgIAkgICAgCSAgCSAgIC4iIGZpbGVuYW1lICciLiR2X2hlYWRlclsnc3RvcmVkX2ZpbGVuYW1lJ10NCgkJCQkJCQkJICAgLiInIik7DQoNCiAgICAgICAgICAgICAgcmV0dXJuIFBjbFppcDo6ZXJyb3JDb2RlKCk7DQoJCSAgfQ0KICAgIH0NCg0KICAgICAgLy8gLS0tLS0gTG9vayBmb3IgcmVhbCBleHRyYWN0aW9uDQogICAgICBpZiAoKCR2X2V4dHJhY3QpICYmICgkdl9oZWFkZXJbJ3N0YXR1cyddICE9ICdvaycpKSB7DQogICAgICAgICAgJHZfcmVzdWx0ID0gJHRoaXMtPnByaXZDb252ZXJ0SGVhZGVyMkZpbGVJbmZvKCR2X2hlYWRlciwNCgkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRwX2ZpbGVfbGlzdFskdl9uYl9leHRyYWN0ZWQrK10pOw0KICAgICAgICAgIGlmICgkdl9yZXN1bHQgIT0gMSkgew0KICAgICAgICAgICAgICAkdGhpcy0+cHJpdkNsb3NlRmQoKTsNCiAgICAgICAgICAgICAgJHRoaXMtPnByaXZTd2FwQmFja01hZ2ljUXVvdGVzKCk7DQogICAgICAgICAgICAgIHJldHVybiAkdl9yZXN1bHQ7DQogICAgICAgICAgfQ0KDQogICAgICAgICAgJHZfZXh0cmFjdCA9IGZhbHNlOw0KICAgICAgfQ0KICAgICAgDQogICAgICAvLyAtLS0tLSBMb29rIGZvciByZWFsIGV4dHJhY3Rpb24NCiAgICAgIGlmICgkdl9leHRyYWN0KQ0KICAgICAgew0KDQogICAgICAgIC8vIC0tLS0tIEdvIHRvIHRoZSBmaWxlIHBvc2l0aW9uDQogICAgICAgIEByZXdpbmQoJHRoaXMtPnppcF9mZCk7DQogICAgICAgIGlmIChAZnNlZWsoJHRoaXMtPnppcF9mZCwgJHZfaGVhZGVyWydvZmZzZXQnXSkpDQogICAgICAgIHsNCiAgICAgICAgICAvLyAtLS0tLSBDbG9zZSB0aGUgemlwIGZpbGUNCiAgICAgICAgICAkdGhpcy0+cHJpdkNsb3NlRmQoKTsNCg0KICAgICAgICAgICR0aGlzLT5wcml2U3dhcEJhY2tNYWdpY1F1b3RlcygpOw0KDQogICAgICAgICAgLy8gLS0tLS0gRXJyb3IgbG9nDQogICAgICAgICAgUGNsWmlwOjpwcml2RXJyb3JMb2coUENMWklQX0VSUl9JTlZBTElEX0FSQ0hJVkVfWklQLCAnSW52YWxpZCBhcmNoaXZlIHNpemUnKTsNCg0KICAgICAgICAgIC8vIC0tLS0tIFJldHVybg0KICAgICAgICAgIHJldHVybiBQY2xaaXA6OmVycm9yQ29kZSgpOw0KICAgICAgICB9DQoNCiAgICAgICAgLy8gLS0tLS0gTG9vayBmb3IgZXh0cmFjdGlvbiBhcyBzdHJpbmcNCiAgICAgICAgaWYgKCRwX29wdGlvbnNbUENMWklQX09QVF9FWFRSQUNUX0FTX1NUUklOR10pIHsNCg0KICAgICAgICAgICR2X3N0cmluZyA9ICcnOw0KDQogICAgICAgICAgLy8gLS0tLS0gRXh0cmFjdGluZyB0aGUgZmlsZQ0KICAgICAgICAgICR2X3Jlc3VsdDEgPSAkdGhpcy0+cHJpdkV4dHJhY3RGaWxlQXNTdHJpbmcoJHZfaGVhZGVyLCAkdl9zdHJpbmcsICRwX29wdGlvbnMpOw0KICAgICAgICAgIGlmICgkdl9yZXN1bHQxIDwgMSkgew0KICAgICAgICAgICAgJHRoaXMtPnByaXZDbG9zZUZkKCk7DQogICAgICAgICAgICAkdGhpcy0+cHJpdlN3YXBCYWNrTWFnaWNRdW90ZXMoKTsNCiAgICAgICAgICAgIHJldHVybiAkdl9yZXN1bHQxOw0KICAgICAgICAgIH0NCg0KICAgICAgICAgIC8vIC0tLS0tIEdldCB0aGUgb25seSBpbnRlcmVzdGluZyBhdHRyaWJ1dGVzDQogICAgICAgICAgaWYgKCgkdl9yZXN1bHQgPSAkdGhpcy0+cHJpdkNvbnZlcnRIZWFkZXIyRmlsZUluZm8oJHZfaGVhZGVyLCAkcF9maWxlX2xpc3RbJHZfbmJfZXh0cmFjdGVkXSkpICE9IDEpDQogICAgICAgICAgew0KICAgICAgICAgICAgLy8gLS0tLS0gQ2xvc2UgdGhlIHppcCBmaWxlDQogICAgICAgICAgICAkdGhpcy0+cHJpdkNsb3NlRmQoKTsNCiAgICAgICAgICAgICR0aGlzLT5wcml2U3dhcEJhY2tNYWdpY1F1b3RlcygpOw0KDQogICAgICAgICAgICByZXR1cm4gJHZfcmVzdWx0Ow0KICAgICAgICAgIH0NCg0KICAgICAgICAgIC8vIC0tLS0tIFNldCB0aGUgZmlsZSBjb250ZW50DQogICAgICAgICAgJHBfZmlsZV9saXN0WyR2X25iX2V4dHJhY3RlZF1bJ2NvbnRlbnQnXSA9ICR2X3N0cmluZzsNCg0KICAgICAgICAgIC8vIC0tLS0tIE5leHQgZXh0cmFjdGVkIGZpbGUNCiAgICAgICAgICAkdl9uYl9leHRyYWN0ZWQrKzsNCiAgICAgICAgICANCiAgICAgICAgICAvLyAtLS0tLSBMb29rIGZvciB1c2VyIGNhbGxiYWNrIGFib3J0DQogICAgICAgICAgaWYgKCR2X3Jlc3VsdDEgPT0gMikgew0KICAgICAgICAgIAlicmVhazsNCiAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgLy8gLS0tLS0gTG9vayBmb3IgZXh0cmFjdGlvbiBpbiBzdGFuZGFyZCBvdXRwdXQNCiAgICAgICAgZWxzZWlmICggICAoaXNzZXQoJHBfb3B0aW9uc1tQQ0xaSVBfT1BUX0VYVFJBQ1RfSU5fT1VUUFVUXSkpDQoJCSAgICAgICAgJiYgKCRwX29wdGlvbnNbUENMWklQX09QVF9FWFRSQUNUX0lOX09VVFBVVF0pKSB7DQogICAgICAgICAgLy8gLS0tLS0gRXh0cmFjdGluZyB0aGUgZmlsZSBpbiBzdGFuZGFyZCBvdXRwdXQNCiAgICAgICAgICAkdl9yZXN1bHQxID0gJHRoaXMtPnByaXZFeHRyYWN0RmlsZUluT3V0cHV0KCR2X2hlYWRlciwgJHBfb3B0aW9ucyk7DQogICAgICAgICAgaWYgKCR2X3Jlc3VsdDEgPCAxKSB7DQogICAgICAgICAgICAkdGhpcy0+cHJpdkNsb3NlRmQoKTsNCiAgICAgICAgICAgICR0aGlzLT5wcml2U3dhcEJhY2tNYWdpY1F1b3RlcygpOw0KICAgICAgICAgICAgcmV0dXJuICR2X3Jlc3VsdDE7DQogICAgICAgICAgfQ0KDQogICAgICAgICAgLy8gLS0tLS0gR2V0IHRoZSBvbmx5IGludGVyZXN0aW5nIGF0dHJpYnV0ZXMNCiAgICAgICAgICBpZiAoKCR2X3Jlc3VsdCA9ICR0aGlzLT5wcml2Q29udmVydEhlYWRlcjJGaWxlSW5mbygkdl9oZWFkZXIsICRwX2ZpbGVfbGlzdFskdl9uYl9leHRyYWN0ZWQrK10pKSAhPSAxKSB7DQogICAgICAgICAgICAkdGhpcy0+cHJpdkNsb3NlRmQoKTsNCiAgICAgICAgICAgICR0aGlzLT5wcml2U3dhcEJhY2tNYWdpY1F1b3RlcygpOw0KICAgICAgICAgICAgcmV0dXJuICR2X3Jlc3VsdDsNCiAgICAgICAgICB9DQoNCiAgICAgICAgICAvLyAtLS0tLSBMb29rIGZvciB1c2VyIGNhbGxiYWNrIGFib3J0DQogICAgICAgICAgaWYgKCR2X3Jlc3VsdDEgPT0gMikgew0KICAgICAgICAgIAlicmVhazsNCiAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgLy8gLS0tLS0gTG9vayBmb3Igbm9ybWFsIGV4dHJhY3Rpb24NCiAgICAgICAgZWxzZSB7DQogICAgICAgICAgLy8gLS0tLS0gRXh0cmFjdGluZyB0aGUgZmlsZQ0KICAgICAgICAgICR2X3Jlc3VsdDEgPSAkdGhpcy0+cHJpdkV4dHJhY3RGaWxlKCR2X2hlYWRlciwNCgkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcF9wYXRoLCAkcF9yZW1vdmVfcGF0aCwNCgkJCQkJCQkJCQkJICAkcF9yZW1vdmVfYWxsX3BhdGgsDQoJCQkJCQkJCQkJCSAgJHBfb3B0aW9ucyk7DQogICAgICAgICAgaWYgKCR2X3Jlc3VsdDEgPCAxKSB7DQogICAgICAgICAgICAkdGhpcy0+cHJpdkNsb3NlRmQoKTsNCiAgICAgICAgICAgICR0aGlzLT5wcml2U3dhcEJhY2tNYWdpY1F1b3RlcygpOw0KICAgICAgICAgICAgcmV0dXJuICR2X3Jlc3VsdDE7DQogICAgICAgICAgfQ0KDQogICAgICAgICAgLy8gLS0tLS0gR2V0IHRoZSBvbmx5IGludGVyZXN0aW5nIGF0dHJpYnV0ZXMNCiAgICAgICAgICBpZiAoKCR2X3Jlc3VsdCA9ICR0aGlzLT5wcml2Q29udmVydEhlYWRlcjJGaWxlSW5mbygkdl9oZWFkZXIsICRwX2ZpbGVfbGlzdFskdl9uYl9leHRyYWN0ZWQrK10pKSAhPSAxKQ0KICAgICAgICAgIHsNCiAgICAgICAgICAgIC8vIC0tLS0tIENsb3NlIHRoZSB6aXAgZmlsZQ0KICAgICAgICAgICAgJHRoaXMtPnByaXZDbG9zZUZkKCk7DQogICAgICAgICAgICAkdGhpcy0+cHJpdlN3YXBCYWNrTWFnaWNRdW90ZXMoKTsNCg0KICAgICAgICAgICAgcmV0dXJuICR2X3Jlc3VsdDsNCiAgICAgICAgICB9DQoNCiAgICAgICAgICAvLyAtLS0tLSBMb29rIGZvciB1c2VyIGNhbGxiYWNrIGFib3J0DQogICAgICAgICAgaWYgKCR2X3Jlc3VsdDEgPT0gMikgew0KICAgICAgICAgIAlicmVhazsNCiAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgIH0NCiAgICB9DQoNCiAgICAvLyAtLS0tLSBDbG9zZSB0aGUgemlwIGZpbGUNCiAgICAkdGhpcy0+cHJpdkNsb3NlRmQoKTsNCiAgICAkdGhpcy0+cHJpdlN3YXBCYWNrTWFnaWNRdW90ZXMoKTsNCg0KICAgIC8vIC0tLS0tIFJldHVybg0KICAgIHJldHVybiAkdl9yZXN1bHQ7DQogIH0NCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICAvLyBGdW5jdGlvbiA6IHByaXZFeHRyYWN0RmlsZSgpDQogIC8vIERlc2NyaXB0aW9uIDoNCiAgLy8gUGFyYW1ldGVycyA6DQogIC8vIFJldHVybiBWYWx1ZXMgOg0KICAvLw0KICAvLyAxIDogLi4uID8NCiAgLy8gUENMWklQX0VSUl9VU0VSX0FCT1JURUQoMikgOiBVc2VyIGFzayBmb3IgZXh0cmFjdGlvbiBzdG9wIGluIGNhbGxiYWNrDQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogIGZ1bmN0aW9uIHByaXZFeHRyYWN0RmlsZSgmJHBfZW50cnksICRwX3BhdGgsICRwX3JlbW92ZV9wYXRoLCAkcF9yZW1vdmVfYWxsX3BhdGgsICYkcF9vcHRpb25zKQ0KICB7DQogICAgJHZfcmVzdWx0PTE7DQoNCiAgICAvLyAtLS0tLSBSZWFkIHRoZSBmaWxlIGhlYWRlcg0KICAgIGlmICgoJHZfcmVzdWx0ID0gJHRoaXMtPnByaXZSZWFkRmlsZUhlYWRlcigkdl9oZWFkZXIpKSAhPSAxKQ0KICAgIHsNCiAgICAgIC8vIC0tLS0tIFJldHVybg0KICAgICAgcmV0dXJuICR2X3Jlc3VsdDsNCiAgICB9DQoNCg0KICAgIC8vIC0tLS0tIENoZWNrIHRoYXQgdGhlIGZpbGUgaGVhZGVyIGlzIGNvaGVyZW50IHdpdGggJHBfZW50cnkgaW5mbw0KICAgIGlmICgkdGhpcy0+cHJpdkNoZWNrRmlsZUhlYWRlcnMoJHZfaGVhZGVyLCAkcF9lbnRyeSkgIT0gMSkgew0KICAgICAgICAvLyBUQkMNCiAgICB9DQoNCiAgICAvLyAtLS0tLSBMb29rIGZvciBhbGwgcGF0aCB0byByZW1vdmUNCiAgICBpZiAoJHBfcmVtb3ZlX2FsbF9wYXRoID09IHRydWUpIHsNCiAgICAgICAgLy8gLS0tLS0gTG9vayBmb3IgZm9sZGVyIGVudHJ5IHRoYXQgbm90IG5lZWQgdG8gYmUgZXh0cmFjdGVkDQogICAgICAgIGlmICgoJHBfZW50cnlbJ2V4dGVybmFsJ10mMHgwMDAwMDAxMCk9PTB4MDAwMDAwMTApIHsNCg0KICAgICAgICAgICAgJHBfZW50cnlbJ3N0YXR1cyddID0gImZpbHRlcmVkIjsNCg0KICAgICAgICAgICAgcmV0dXJuICR2X3Jlc3VsdDsNCiAgICAgICAgfQ0KDQogICAgICAgIC8vIC0tLS0tIEdldCB0aGUgYmFzZW5hbWUgb2YgdGhlIHBhdGgNCiAgICAgICAgJHBfZW50cnlbJ2ZpbGVuYW1lJ10gPSBiYXNlbmFtZSgkcF9lbnRyeVsnZmlsZW5hbWUnXSk7DQogICAgfQ0KDQogICAgLy8gLS0tLS0gTG9vayBmb3IgcGF0aCB0byByZW1vdmUNCiAgICBlbHNlIGlmICgkcF9yZW1vdmVfcGF0aCAhPSAiIikNCiAgICB7DQogICAgICBpZiAoUGNsWmlwVXRpbFBhdGhJbmNsdXNpb24oJHBfcmVtb3ZlX3BhdGgsICRwX2VudHJ5WydmaWxlbmFtZSddKSA9PSAyKQ0KICAgICAgew0KDQogICAgICAgIC8vIC0tLS0tIENoYW5nZSB0aGUgZmlsZSBzdGF0dXMNCiAgICAgICAgJHBfZW50cnlbJ3N0YXR1cyddID0gImZpbHRlcmVkIjsNCg0KICAgICAgICAvLyAtLS0tLSBSZXR1cm4NCiAgICAgICAgcmV0dXJuICR2X3Jlc3VsdDsNCiAgICAgIH0NCg0KICAgICAgJHBfcmVtb3ZlX3BhdGhfc2l6ZSA9IHN0cmxlbigkcF9yZW1vdmVfcGF0aCk7DQogICAgICBpZiAoc3Vic3RyKCRwX2VudHJ5WydmaWxlbmFtZSddLCAwLCAkcF9yZW1vdmVfcGF0aF9zaXplKSA9PSAkcF9yZW1vdmVfcGF0aCkNCiAgICAgIHsNCg0KICAgICAgICAvLyAtLS0tLSBSZW1vdmUgdGhlIHBhdGgNCiAgICAgICAgJHBfZW50cnlbJ2ZpbGVuYW1lJ10gPSBzdWJzdHIoJHBfZW50cnlbJ2ZpbGVuYW1lJ10sICRwX3JlbW92ZV9wYXRoX3NpemUpOw0KDQogICAgICB9DQogICAgfQ0KDQogICAgLy8gLS0tLS0gQWRkIHRoZSBwYXRoDQogICAgaWYgKCRwX3BhdGggIT0gJycpIHsNCiAgICAgICRwX2VudHJ5WydmaWxlbmFtZSddID0gJHBfcGF0aC4iLyIuJHBfZW50cnlbJ2ZpbGVuYW1lJ107DQogICAgfQ0KICAgIA0KICAgIC8vIC0tLS0tIENoZWNrIGEgYmFzZV9kaXJfcmVzdHJpY3Rpb24NCiAgICBpZiAoaXNzZXQoJHBfb3B0aW9uc1tQQ0xaSVBfT1BUX0VYVFJBQ1RfRElSX1JFU1RSSUNUSU9OXSkpIHsNCiAgICAgICR2X2luY2x1c2lvbg0KICAgICAgPSBQY2xaaXBVdGlsUGF0aEluY2x1c2lvbigkcF9vcHRpb25zW1BDTFpJUF9PUFRfRVhUUkFDVF9ESVJfUkVTVFJJQ1RJT05dLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcF9lbnRyeVsnZmlsZW5hbWUnXSk7IA0KICAgICAgaWYgKCR2X2luY2x1c2lvbiA9PSAwKSB7DQoNCiAgICAgICAgUGNsWmlwOjpwcml2RXJyb3JMb2coUENMWklQX0VSUl9ESVJFQ1RPUllfUkVTVFJJQ1RJT04sDQoJCQkgICAgICAgICAgICAgICAgICAgICAiRmlsZW5hbWUgJyIuJHBfZW50cnlbJ2ZpbGVuYW1lJ10uIicgaXMgIg0KCQkJCQkJCQkgLiJvdXRzaWRlIFBDTFpJUF9PUFRfRVhUUkFDVF9ESVJfUkVTVFJJQ1RJT04iKTsNCg0KICAgICAgICByZXR1cm4gUGNsWmlwOjplcnJvckNvZGUoKTsNCiAgICAgIH0NCiAgICB9DQoNCiAgICAvLyAtLS0tLSBMb29rIGZvciBwcmUtZXh0cmFjdCBjYWxsYmFjaw0KICAgIGlmIChpc3NldCgkcF9vcHRpb25zW1BDTFpJUF9DQl9QUkVfRVhUUkFDVF0pKSB7DQoNCiAgICAgIC8vIC0tLS0tIEdlbmVyYXRlIGEgbG9jYWwgaW5mb3JtYXRpb24NCiAgICAgICR2X2xvY2FsX2hlYWRlciA9IGFycmF5KCk7DQogICAgICAkdGhpcy0+cHJpdkNvbnZlcnRIZWFkZXIyRmlsZUluZm8oJHBfZW50cnksICR2X2xvY2FsX2hlYWRlcik7DQoNCiAgICAgIC8vIC0tLS0tIENhbGwgdGhlIGNhbGxiYWNrDQogICAgICAvLyBIZXJlIEkgZG8gbm90IHVzZSBjYWxsX3VzZXJfZnVuYygpIGJlY2F1c2UgSSBuZWVkIHRvIHNlbmQgYSByZWZlcmVuY2UgdG8gdGhlDQogICAgICAvLyBoZWFkZXIuDQovLyAgICAgIGV2YWwoJyR2X3Jlc3VsdCA9ICcuJHBfb3B0aW9uc1tQQ0xaSVBfQ0JfUFJFX0VYVFJBQ1RdLicoUENMWklQX0NCX1BSRV9FWFRSQUNULCAkdl9sb2NhbF9oZWFkZXIpOycpOw0KICAgICAgJHZfcmVzdWx0ID0gJHBfb3B0aW9uc1tQQ0xaSVBfQ0JfUFJFX0VYVFJBQ1RdKFBDTFpJUF9DQl9QUkVfRVhUUkFDVCwgJHZfbG9jYWxfaGVhZGVyKTsNCiAgICAgIGlmICgkdl9yZXN1bHQgPT0gMCkgew0KICAgICAgICAvLyAtLS0tLSBDaGFuZ2UgdGhlIGZpbGUgc3RhdHVzDQogICAgICAgICRwX2VudHJ5WydzdGF0dXMnXSA9ICJza2lwcGVkIjsNCiAgICAgICAgJHZfcmVzdWx0ID0gMTsNCiAgICAgIH0NCiAgICAgIA0KICAgICAgLy8gLS0tLS0gTG9vayBmb3IgYWJvcnQgcmVzdWx0DQogICAgICBpZiAoJHZfcmVzdWx0ID09IDIpIHsNCiAgICAgICAgLy8gLS0tLS0gVGhpcyBzdGF0dXMgaXMgaW50ZXJuYWwgYW5kIHdpbGwgYmUgY2hhbmdlZCBpbiAnc2tpcHBlZCcNCiAgICAgICAgJHBfZW50cnlbJ3N0YXR1cyddID0gImFib3J0ZWQiOw0KICAgICAgCSR2X3Jlc3VsdCA9IFBDTFpJUF9FUlJfVVNFUl9BQk9SVEVEOw0KICAgICAgfQ0KDQogICAgICAvLyAtLS0tLSBVcGRhdGUgdGhlIGluZm9ybWF0aW9ucw0KICAgICAgLy8gT25seSBzb21lIGZpZWxkcyBjYW4gYmUgbW9kaWZpZWQNCiAgICAgICRwX2VudHJ5WydmaWxlbmFtZSddID0gJHZfbG9jYWxfaGVhZGVyWydmaWxlbmFtZSddOw0KICAgIH0NCg0KDQogICAgLy8gLS0tLS0gTG9vayBpZiBleHRyYWN0aW9uIHNob3VsZCBiZSBkb25lDQogICAgaWYgKCRwX2VudHJ5WydzdGF0dXMnXSA9PSAnb2snKSB7DQoNCiAgICAvLyAtLS0tLSBMb29rIGZvciBzcGVjaWZpYyBhY3Rpb25zIHdoaWxlIHRoZSBmaWxlIGV4aXN0DQogICAgaWYgKGZpbGVfZXhpc3RzKCRwX2VudHJ5WydmaWxlbmFtZSddKSkNCiAgICB7DQoNCiAgICAgIC8vIC0tLS0tIExvb2sgaWYgZmlsZSBpcyBhIGRpcmVjdG9yeQ0KICAgICAgaWYgKGlzX2RpcigkcF9lbnRyeVsnZmlsZW5hbWUnXSkpDQogICAgICB7DQoNCiAgICAgICAgLy8gLS0tLS0gQ2hhbmdlIHRoZSBmaWxlIHN0YXR1cw0KICAgICAgICAkcF9lbnRyeVsnc3RhdHVzJ10gPSAiYWxyZWFkeV9hX2RpcmVjdG9yeSI7DQogICAgICAgIA0KICAgICAgICAvLyAtLS0tLSBMb29rIGZvciBQQ0xaSVBfT1BUX1NUT1BfT05fRVJST1INCiAgICAgICAgLy8gRm9yIGhpc3RvcmljYWwgcmVhc29uIGZpcnN0IFBjbFppcCBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdCBzdG9wDQogICAgICAgIC8vIHdoZW4gdGhpcyBraW5kIG9mIGVycm9yIG9jY3Vycy4NCiAgICAgICAgaWYgKCAgIChpc3NldCgkcF9vcHRpb25zW1BDTFpJUF9PUFRfU1RPUF9PTl9FUlJPUl0pKQ0KCQkgICAgJiYgKCRwX29wdGlvbnNbUENMWklQX09QVF9TVE9QX09OX0VSUk9SXT09PXRydWUpKSB7DQoNCiAgICAgICAgICAgIFBjbFppcDo6cHJpdkVycm9yTG9nKFBDTFpJUF9FUlJfQUxSRUFEWV9BX0RJUkVDVE9SWSwNCgkJCSAgICAgICAgICAgICAgICAgICAgICJGaWxlbmFtZSAnIi4kcF9lbnRyeVsnZmlsZW5hbWUnXS4iJyBpcyAiDQoJCQkJCQkJCSAuImFscmVhZHkgdXNlZCBieSBhbiBleGlzdGluZyBkaXJlY3RvcnkiKTsNCg0KICAgICAgICAgICAgcmV0dXJuIFBjbFppcDo6ZXJyb3JDb2RlKCk7DQoJCSAgICB9DQogICAgICB9DQogICAgICAvLyAtLS0tLSBMb29rIGlmIGZpbGUgaXMgd3JpdGUgcHJvdGVjdGVkDQogICAgICBlbHNlIGlmICghaXNfd3JpdGVhYmxlKCRwX2VudHJ5WydmaWxlbmFtZSddKSkNCiAgICAgIHsNCg0KICAgICAgICAvLyAtLS0tLSBDaGFuZ2UgdGhlIGZpbGUgc3RhdHVzDQogICAgICAgICRwX2VudHJ5WydzdGF0dXMnXSA9ICJ3cml0ZV9wcm90ZWN0ZWQiOw0KDQogICAgICAgIC8vIC0tLS0tIExvb2sgZm9yIFBDTFpJUF9PUFRfU1RPUF9PTl9FUlJPUg0KICAgICAgICAvLyBGb3IgaGlzdG9yaWNhbCByZWFzb24gZmlyc3QgUGNsWmlwIGltcGxlbWVudGF0aW9uIGRvZXMgbm90IHN0b3ANCiAgICAgICAgLy8gd2hlbiB0aGlzIGtpbmQgb2YgZXJyb3Igb2NjdXJzLg0KICAgICAgICBpZiAoICAgKGlzc2V0KCRwX29wdGlvbnNbUENMWklQX09QVF9TVE9QX09OX0VSUk9SXSkpDQoJCSAgICAmJiAoJHBfb3B0aW9uc1tQQ0xaSVBfT1BUX1NUT1BfT05fRVJST1JdPT09dHJ1ZSkpIHsNCg0KICAgICAgICAgICAgUGNsWmlwOjpwcml2RXJyb3JMb2coUENMWklQX0VSUl9XUklURV9PUEVOX0ZBSUwsDQoJCQkgICAgICAgICAgICAgICAgICAgICAiRmlsZW5hbWUgJyIuJHBfZW50cnlbJ2ZpbGVuYW1lJ10uIicgZXhpc3RzICINCgkJCQkJCQkJIC4iYW5kIGlzIHdyaXRlIHByb3RlY3RlZCIpOw0KDQogICAgICAgICAgICByZXR1cm4gUGNsWmlwOjplcnJvckNvZGUoKTsNCgkJICAgIH0NCiAgICAgIH0NCg0KICAgICAgLy8gLS0tLS0gTG9vayBpZiB0aGUgZXh0cmFjdGVkIGZpbGUgaXMgb2xkZXINCiAgICAgIGVsc2UgaWYgKGZpbGVtdGltZSgkcF9lbnRyeVsnZmlsZW5hbWUnXSkgPiAkcF9lbnRyeVsnbXRpbWUnXSkNCiAgICAgIHsNCiAgICAgICAgLy8gLS0tLS0gQ2hhbmdlIHRoZSBmaWxlIHN0YXR1cw0KICAgICAgICBpZiAoICAgKGlzc2V0KCRwX29wdGlvbnNbUENMWklQX09QVF9SRVBMQUNFX05FV0VSXSkpDQoJCSAgICAmJiAoJHBfb3B0aW9uc1tQQ0xaSVBfT1BUX1JFUExBQ0VfTkVXRVJdPT09dHJ1ZSkpIHsNCgkgIAkgIH0NCgkJICAgIGVsc2Ugew0KICAgICAgICAgICAgJHBfZW50cnlbJ3N0YXR1cyddID0gIm5ld2VyX2V4aXN0IjsNCg0KICAgICAgICAgICAgLy8gLS0tLS0gTG9vayBmb3IgUENMWklQX09QVF9TVE9QX09OX0VSUk9SDQogICAgICAgICAgICAvLyBGb3IgaGlzdG9yaWNhbCByZWFzb24gZmlyc3QgUGNsWmlwIGltcGxlbWVudGF0aW9uIGRvZXMgbm90IHN0b3ANCiAgICAgICAgICAgIC8vIHdoZW4gdGhpcyBraW5kIG9mIGVycm9yIG9jY3Vycy4NCiAgICAgICAgICAgIGlmICggICAoaXNzZXQoJHBfb3B0aW9uc1tQQ0xaSVBfT1BUX1NUT1BfT05fRVJST1JdKSkNCgkJICAgICAgICAmJiAoJHBfb3B0aW9uc1tQQ0xaSVBfT1BUX1NUT1BfT05fRVJST1JdPT09dHJ1ZSkpIHsNCg0KICAgICAgICAgICAgICAgIFBjbFppcDo6cHJpdkVycm9yTG9nKFBDTFpJUF9FUlJfV1JJVEVfT1BFTl9GQUlMLA0KCQkJICAgICAgICAgICAgICJOZXdlciB2ZXJzaW9uIG9mICciLiRwX2VudHJ5WydmaWxlbmFtZSddLiInIGV4aXN0cyAiDQoJCQkJCSAgICAuImFuZCBvcHRpb24gUENMWklQX09QVF9SRVBMQUNFX05FV0VSIGlzIG5vdCBzZWxlY3RlZCIpOw0KDQogICAgICAgICAgICAgICAgcmV0dXJuIFBjbFppcDo6ZXJyb3JDb2RlKCk7DQoJCSAgICAgIH0NCgkJICAgIH0NCiAgICAgIH0NCiAgICAgIGVsc2Ugew0KICAgICAgfQ0KICAgIH0NCg0KICAgIC8vIC0tLS0tIENoZWNrIHRoZSBkaXJlY3RvcnkgYXZhaWxhYmlsaXR5IGFuZCBjcmVhdGUgaXQgaWYgbmVjZXNzYXJ5DQogICAgZWxzZSB7DQogICAgICBpZiAoKCgkcF9lbnRyeVsnZXh0ZXJuYWwnXSYweDAwMDAwMDEwKT09MHgwMDAwMDAxMCkgfHwgKHN1YnN0cigkcF9lbnRyeVsnZmlsZW5hbWUnXSwgLTEpID09ICcvJykpDQogICAgICAgICR2X2Rpcl90b19jaGVjayA9ICRwX2VudHJ5WydmaWxlbmFtZSddOw0KICAgICAgZWxzZSBpZiAoIXN0cnN0cigkcF9lbnRyeVsnZmlsZW5hbWUnXSwgIi8iKSkNCiAgICAgICAgJHZfZGlyX3RvX2NoZWNrID0gIiI7DQogICAgICBlbHNlDQogICAgICAgICR2X2Rpcl90b19jaGVjayA9IGRpcm5hbWUoJHBfZW50cnlbJ2ZpbGVuYW1lJ10pOw0KDQogICAgICAgIGlmICgoJHZfcmVzdWx0ID0gJHRoaXMtPnByaXZEaXJDaGVjaygkdl9kaXJfdG9fY2hlY2ssICgoJHBfZW50cnlbJ2V4dGVybmFsJ10mMHgwMDAwMDAxMCk9PTB4MDAwMDAwMTApKSkgIT0gMSkgew0KICANCiAgICAgICAgICAvLyAtLS0tLSBDaGFuZ2UgdGhlIGZpbGUgc3RhdHVzDQogICAgICAgICAgJHBfZW50cnlbJ3N0YXR1cyddID0gInBhdGhfY3JlYXRpb25fZmFpbCI7DQogIA0KICAgICAgICAgIC8vIC0tLS0tIFJldHVybg0KICAgICAgICAgIC8vcmV0dXJuICR2X3Jlc3VsdDsNCiAgICAgICAgICAkdl9yZXN1bHQgPSAxOw0KICAgICAgICB9DQogICAgICB9DQogICAgfQ0KDQogICAgLy8gLS0tLS0gTG9vayBpZiBleHRyYWN0aW9uIHNob3VsZCBiZSBkb25lDQogICAgaWYgKCRwX2VudHJ5WydzdGF0dXMnXSA9PSAnb2snKSB7DQoNCiAgICAgIC8vIC0tLS0tIERvIHRoZSBleHRyYWN0aW9uIChpZiBub3QgYSBmb2xkZXIpDQogICAgICBpZiAoISgoJHBfZW50cnlbJ2V4dGVybmFsJ10mMHgwMDAwMDAxMCk9PTB4MDAwMDAwMTApKQ0KICAgICAgew0KICAgICAgICAvLyAtLS0tLSBMb29rIGZvciBub3QgY29tcHJlc3NlZCBmaWxlDQogICAgICAgIGlmICgkcF9lbnRyeVsnY29tcHJlc3Npb24nXSA9PSAwKSB7DQoNCiAgICAJCSAgLy8gLS0tLS0gT3BlbmluZyBkZXN0aW5hdGlvbiBmaWxlDQogICAgICAgICAgaWYgKCgkdl9kZXN0X2ZpbGUgPSBAZm9wZW4oJHBfZW50cnlbJ2ZpbGVuYW1lJ10sICd3YicpKSA9PSAwKQ0KICAgICAgICAgIHsNCg0KICAgICAgICAgICAgLy8gLS0tLS0gQ2hhbmdlIHRoZSBmaWxlIHN0YXR1cw0KICAgICAgICAgICAgJHBfZW50cnlbJ3N0YXR1cyddID0gIndyaXRlX2Vycm9yIjsNCg0KICAgICAgICAgICAgLy8gLS0tLS0gUmV0dXJuDQogICAgICAgICAgICByZXR1cm4gJHZfcmVzdWx0Ow0KICAgICAgICAgIH0NCg0KDQogICAgICAgICAgLy8gLS0tLS0gUmVhZCB0aGUgZmlsZSBieSBQQ0xaSVBfUkVBRF9CTE9DS19TSVpFIG9jdGV0cyBibG9ja3MNCiAgICAgICAgICAkdl9zaXplID0gJHBfZW50cnlbJ2NvbXByZXNzZWRfc2l6ZSddOw0KICAgICAgICAgIHdoaWxlICgkdl9zaXplICE9IDApDQogICAgICAgICAgew0KICAgICAgICAgICAgJHZfcmVhZF9zaXplID0gKCR2X3NpemUgPCBQQ0xaSVBfUkVBRF9CTE9DS19TSVpFID8gJHZfc2l6ZSA6IFBDTFpJUF9SRUFEX0JMT0NLX1NJWkUpOw0KICAgICAgICAgICAgJHZfYnVmZmVyID0gQGZyZWFkKCR0aGlzLT56aXBfZmQsICR2X3JlYWRfc2l6ZSk7DQogICAgICAgICAgICAvKiBUcnkgdG8gc3BlZWQgdXAgdGhlIGNvZGUNCiAgICAgICAgICAgICR2X2JpbmFyeV9kYXRhID0gcGFjaygnYScuJHZfcmVhZF9zaXplLCAkdl9idWZmZXIpOw0KICAgICAgICAgICAgQGZ3cml0ZSgkdl9kZXN0X2ZpbGUsICR2X2JpbmFyeV9kYXRhLCAkdl9yZWFkX3NpemUpOw0KICAgICAgICAgICAgKi8NCiAgICAgICAgICAgIEBmd3JpdGUoJHZfZGVzdF9maWxlLCAkdl9idWZmZXIsICR2X3JlYWRfc2l6ZSk7ICAgICAgICAgICAgDQogICAgICAgICAgICAkdl9zaXplIC09ICR2X3JlYWRfc2l6ZTsNCiAgICAgICAgICB9DQoNCiAgICAgICAgICAvLyAtLS0tLSBDbG9zaW5nIHRoZSBkZXN0aW5hdGlvbiBmaWxlDQogICAgICAgICAgZmNsb3NlKCR2X2Rlc3RfZmlsZSk7DQoNCiAgICAgICAgICAvLyAtLS0tLSBDaGFuZ2UgdGhlIGZpbGUgbXRpbWUNCiAgICAgICAgICB0b3VjaCgkcF9lbnRyeVsnZmlsZW5hbWUnXSwgJHBfZW50cnlbJ210aW1lJ10pOw0KICAgICAgICAgIA0KDQogICAgICAgIH0NCiAgICAgICAgZWxzZSB7DQogICAgICAgICAgLy8gLS0tLS0gVEJDDQogICAgICAgICAgLy8gTmVlZCB0byBiZSBmaW5pc2hlZA0KICAgICAgICAgIGlmICgoJHBfZW50cnlbJ2ZsYWcnXSAmIDEpID09IDEpIHsNCiAgICAgICAgICAgIFBjbFppcDo6cHJpdkVycm9yTG9nKFBDTFpJUF9FUlJfVU5TVVBQT1JURURfRU5DUllQVElPTiwgJ0ZpbGUgXCcnLiRwX2VudHJ5WydmaWxlbmFtZSddLidcJyBpcyBlbmNyeXB0ZWQuIEVuY3J5cHRlZCBmaWxlcyBhcmUgbm90IHN1cHBvcnRlZC4nKTsNCiAgICAgICAgICAgIHJldHVybiBQY2xaaXA6OmVycm9yQ29kZSgpOw0KICAgICAgICAgIH0NCg0KDQogICAgICAgICAgLy8gLS0tLS0gTG9vayBmb3IgdXNpbmcgdGVtcG9yYXJ5IGZpbGUgdG8gdW56aXANCiAgICAgICAgICBpZiAoICghaXNzZXQoJHBfb3B0aW9uc1tQQ0xaSVBfT1BUX1RFTVBfRklMRV9PRkZdKSkgDQogICAgICAgICAgICAgICYmIChpc3NldCgkcF9vcHRpb25zW1BDTFpJUF9PUFRfVEVNUF9GSUxFX09OXSkNCiAgICAgICAgICAgICAgICAgIHx8IChpc3NldCgkcF9vcHRpb25zW1BDTFpJUF9PUFRfVEVNUF9GSUxFX1RIUkVTSE9MRF0pDQogICAgICAgICAgICAgICAgICAgICAgJiYgKCRwX29wdGlvbnNbUENMWklQX09QVF9URU1QX0ZJTEVfVEhSRVNIT0xEXSA8PSAkcF9lbnRyeVsnc2l6ZSddKSkgKSApIHsNCiAgICAgICAgICAgICR2X3Jlc3VsdCA9ICR0aGlzLT5wcml2RXh0cmFjdEZpbGVVc2luZ1RlbXBGaWxlKCRwX2VudHJ5LCAkcF9vcHRpb25zKTsNCiAgICAgICAgICAgIGlmICgkdl9yZXN1bHQgPCBQQ0xaSVBfRVJSX05PX0VSUk9SKSB7DQogICAgICAgICAgICAgIHJldHVybiAkdl9yZXN1bHQ7DQogICAgICAgICAgICB9DQogICAgICAgICAgfQ0KICAgICAgICAgIA0KICAgICAgICAgIC8vIC0tLS0tIExvb2sgZm9yIGV4dHJhY3QgaW4gbWVtb3J5DQogICAgICAgICAgZWxzZSB7DQoNCiAgICAgICAgICANCiAgICAgICAgICAgIC8vIC0tLS0tIFJlYWQgdGhlIGNvbXByZXNzZWQgZmlsZSBpbiBhIGJ1ZmZlciAob25lIHNob3QpDQogICAgICAgICAgICAkdl9idWZmZXIgPSBAZnJlYWQoJHRoaXMtPnppcF9mZCwgJHBfZW50cnlbJ2NvbXByZXNzZWRfc2l6ZSddKTsNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgLy8gLS0tLS0gRGVjb21wcmVzcyB0aGUgZmlsZQ0KICAgICAgICAgICAgJHZfZmlsZV9jb250ZW50ID0gQGd6aW5mbGF0ZSgkdl9idWZmZXIpOw0KICAgICAgICAgICAgdW5zZXQoJHZfYnVmZmVyKTsNCiAgICAgICAgICAgIGlmICgkdl9maWxlX2NvbnRlbnQgPT09IEZBTFNFKSB7DQogIA0KICAgICAgICAgICAgICAvLyAtLS0tLSBDaGFuZ2UgdGhlIGZpbGUgc3RhdHVzDQogICAgICAgICAgICAgIC8vIFRCQw0KICAgICAgICAgICAgICAkcF9lbnRyeVsnc3RhdHVzJ10gPSAiZXJyb3IiOw0KICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgcmV0dXJuICR2X3Jlc3VsdDsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIA0KICAgICAgICAgICAgLy8gLS0tLS0gT3BlbmluZyBkZXN0aW5hdGlvbiBmaWxlDQogICAgICAgICAgICBpZiAoKCR2X2Rlc3RfZmlsZSA9IEBmb3BlbigkcF9lbnRyeVsnZmlsZW5hbWUnXSwgJ3diJykpID09IDApIHsNCiAgDQogICAgICAgICAgICAgIC8vIC0tLS0tIENoYW5nZSB0aGUgZmlsZSBzdGF0dXMNCiAgICAgICAgICAgICAgJHBfZW50cnlbJ3N0YXR1cyddID0gIndyaXRlX2Vycm9yIjsNCiAgDQogICAgICAgICAgICAgIHJldHVybiAkdl9yZXN1bHQ7DQogICAgICAgICAgICB9DQogIA0KICAgICAgICAgICAgLy8gLS0tLS0gV3JpdGUgdGhlIHVuY29tcHJlc3NlZCBkYXRhDQogICAgICAgICAgICBAZndyaXRlKCR2X2Rlc3RfZmlsZSwgJHZfZmlsZV9jb250ZW50LCAkcF9lbnRyeVsnc2l6ZSddKTsNCiAgICAgICAgICAgIHVuc2V0KCR2X2ZpbGVfY29udGVudCk7DQogIA0KICAgICAgICAgICAgLy8gLS0tLS0gQ2xvc2luZyB0aGUgZGVzdGluYXRpb24gZmlsZQ0KICAgICAgICAgICAgQGZjbG9zZSgkdl9kZXN0X2ZpbGUpOw0KICAgICAgICAgICAgDQogICAgICAgICAgfQ0KDQogICAgICAgICAgLy8gLS0tLS0gQ2hhbmdlIHRoZSBmaWxlIG10aW1lDQogICAgICAgICAgQHRvdWNoKCRwX2VudHJ5WydmaWxlbmFtZSddLCAkcF9lbnRyeVsnbXRpbWUnXSk7DQogICAgICAgIH0NCg0KICAgICAgICAvLyAtLS0tLSBMb29rIGZvciBjaG1vZCBvcHRpb24NCiAgICAgICAgaWYgKGlzc2V0KCRwX29wdGlvbnNbUENMWklQX09QVF9TRVRfQ0hNT0RdKSkgew0KDQogICAgICAgICAgLy8gLS0tLS0gQ2hhbmdlIHRoZSBtb2RlIG9mIHRoZSBmaWxlDQogICAgICAgICAgQGNobW9kKCRwX2VudHJ5WydmaWxlbmFtZSddLCAkcF9vcHRpb25zW1BDTFpJUF9PUFRfU0VUX0NITU9EXSk7DQogICAgICAgIH0NCg0KICAgICAgfQ0KICAgIH0NCg0KICAJLy8gLS0tLS0gQ2hhbmdlIGFib3J0IHN0YXR1cw0KICAJaWYgKCRwX2VudHJ5WydzdGF0dXMnXSA9PSAiYWJvcnRlZCIpIHsNCiAgICAgICAgJHBfZW50cnlbJ3N0YXR1cyddID0gInNraXBwZWQiOw0KICAJfQ0KCQ0KICAgIC8vIC0tLS0tIExvb2sgZm9yIHBvc3QtZXh0cmFjdCBjYWxsYmFjaw0KICAgIGVsc2VpZiAoaXNzZXQoJHBfb3B0aW9uc1tQQ0xaSVBfQ0JfUE9TVF9FWFRSQUNUXSkpIHsNCg0KICAgICAgLy8gLS0tLS0gR2VuZXJhdGUgYSBsb2NhbCBpbmZvcm1hdGlvbg0KICAgICAgJHZfbG9jYWxfaGVhZGVyID0gYXJyYXkoKTsNCiAgICAgICR0aGlzLT5wcml2Q29udmVydEhlYWRlcjJGaWxlSW5mbygkcF9lbnRyeSwgJHZfbG9jYWxfaGVhZGVyKTsNCg0KICAgICAgLy8gLS0tLS0gQ2FsbCB0aGUgY2FsbGJhY2sNCiAgICAgIC8vIEhlcmUgSSBkbyBub3QgdXNlIGNhbGxfdXNlcl9mdW5jKCkgYmVjYXVzZSBJIG5lZWQgdG8gc2VuZCBhIHJlZmVyZW5jZSB0byB0aGUNCiAgICAgIC8vIGhlYWRlci4NCi8vICAgICAgZXZhbCgnJHZfcmVzdWx0ID0gJy4kcF9vcHRpb25zW1BDTFpJUF9DQl9QT1NUX0VYVFJBQ1RdLicoUENMWklQX0NCX1BPU1RfRVhUUkFDVCwgJHZfbG9jYWxfaGVhZGVyKTsnKTsNCiAgICAgICR2X3Jlc3VsdCA9ICRwX29wdGlvbnNbUENMWklQX0NCX1BPU1RfRVhUUkFDVF0oUENMWklQX0NCX1BPU1RfRVhUUkFDVCwgJHZfbG9jYWxfaGVhZGVyKTsNCg0KICAgICAgLy8gLS0tLS0gTG9vayBmb3IgYWJvcnQgcmVzdWx0DQogICAgICBpZiAoJHZfcmVzdWx0ID09IDIpIHsNCiAgICAgIAkkdl9yZXN1bHQgPSBQQ0xaSVBfRVJSX1VTRVJfQUJPUlRFRDsNCiAgICAgIH0NCiAgICB9DQoNCiAgICAvLyAtLS0tLSBSZXR1cm4NCiAgICByZXR1cm4gJHZfcmVzdWx0Ow0KICB9DQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAgLy8gRnVuY3Rpb24gOiBwcml2RXh0cmFjdEZpbGVVc2luZ1RlbXBGaWxlKCkNCiAgLy8gRGVzY3JpcHRpb24gOg0KICAvLyBQYXJhbWV0ZXJzIDoNCiAgLy8gUmV0dXJuIFZhbHVlcyA6DQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogIGZ1bmN0aW9uIHByaXZFeHRyYWN0RmlsZVVzaW5nVGVtcEZpbGUoJiRwX2VudHJ5LCAmJHBfb3B0aW9ucykNCiAgew0KICAgICR2X3Jlc3VsdD0xOw0KICAgICAgICANCiAgICAvLyAtLS0tLSBDcmVhdGVzIGEgdGVtcG9yYXJ5IGZpbGUNCiAgICAkdl9nemlwX3RlbXBfbmFtZSA9IFBDTFpJUF9URU1QT1JBUllfRElSLnVuaXFpZCgncGNsemlwLScpLicuZ3onOw0KICAgIGlmICgoJHZfZGVzdF9maWxlID0gQGZvcGVuKCR2X2d6aXBfdGVtcF9uYW1lLCAid2IiKSkgPT0gMCkgew0KICAgICAgZmNsb3NlKCR2X2ZpbGUpOw0KICAgICAgUGNsWmlwOjpwcml2RXJyb3JMb2coUENMWklQX0VSUl9XUklURV9PUEVOX0ZBSUwsICdVbmFibGUgdG8gb3BlbiB0ZW1wb3JhcnkgZmlsZSBcJycuJHZfZ3ppcF90ZW1wX25hbWUuJ1wnIGluIGJpbmFyeSB3cml0ZSBtb2RlJyk7DQogICAgICByZXR1cm4gUGNsWmlwOjplcnJvckNvZGUoKTsNCiAgICB9DQoNCg0KICAgIC8vIC0tLS0tIFdyaXRlIGd6IGZpbGUgZm9ybWF0IGhlYWRlcg0KICAgICR2X2JpbmFyeV9kYXRhID0gcGFjaygndmExYTFWYTFhMScsIDB4OGIxZiwgQ2hyKCRwX2VudHJ5Wydjb21wcmVzc2lvbiddKSwgQ2hyKDB4MDApLCB0aW1lKCksIENocigweDAwKSwgQ2hyKDMpKTsNCiAgICBAZndyaXRlKCR2X2Rlc3RfZmlsZSwgJHZfYmluYXJ5X2RhdGEsIDEwKTsNCg0KICAgIC8vIC0tLS0tIFJlYWQgdGhlIGZpbGUgYnkgUENMWklQX1JFQURfQkxPQ0tfU0laRSBvY3RldHMgYmxvY2tzDQogICAgJHZfc2l6ZSA9ICRwX2VudHJ5Wydjb21wcmVzc2VkX3NpemUnXTsNCiAgICB3aGlsZSAoJHZfc2l6ZSAhPSAwKQ0KICAgIHsNCiAgICAgICR2X3JlYWRfc2l6ZSA9ICgkdl9zaXplIDwgUENMWklQX1JFQURfQkxPQ0tfU0laRSA/ICR2X3NpemUgOiBQQ0xaSVBfUkVBRF9CTE9DS19TSVpFKTsNCiAgICAgICR2X2J1ZmZlciA9IEBmcmVhZCgkdGhpcy0+emlwX2ZkLCAkdl9yZWFkX3NpemUpOw0KICAgICAgLy8kdl9iaW5hcnlfZGF0YSA9IHBhY2soJ2EnLiR2X3JlYWRfc2l6ZSwgJHZfYnVmZmVyKTsNCiAgICAgIEBmd3JpdGUoJHZfZGVzdF9maWxlLCAkdl9idWZmZXIsICR2X3JlYWRfc2l6ZSk7DQogICAgICAkdl9zaXplIC09ICR2X3JlYWRfc2l6ZTsNCiAgICB9DQoNCiAgICAvLyAtLS0tLSBXcml0ZSBneiBmaWxlIGZvcm1hdCBmb290ZXINCiAgICAkdl9iaW5hcnlfZGF0YSA9IHBhY2soJ1ZWJywgJHBfZW50cnlbJ2NyYyddLCAkcF9lbnRyeVsnc2l6ZSddKTsNCiAgICBAZndyaXRlKCR2X2Rlc3RfZmlsZSwgJHZfYmluYXJ5X2RhdGEsIDgpOw0KDQogICAgLy8gLS0tLS0gQ2xvc2UgdGhlIHRlbXBvcmFyeSBmaWxlDQogICAgQGZjbG9zZSgkdl9kZXN0X2ZpbGUpOw0KDQogICAgLy8gLS0tLS0gT3BlbmluZyBkZXN0aW5hdGlvbiBmaWxlDQogICAgaWYgKCgkdl9kZXN0X2ZpbGUgPSBAZm9wZW4oJHBfZW50cnlbJ2ZpbGVuYW1lJ10sICd3YicpKSA9PSAwKSB7DQogICAgICAkcF9lbnRyeVsnc3RhdHVzJ10gPSAid3JpdGVfZXJyb3IiOw0KICAgICAgcmV0dXJuICR2X3Jlc3VsdDsNCiAgICB9DQoNCiAgICAvLyAtLS0tLSBPcGVuIHRoZSB0ZW1wb3JhcnkgZ3ogZmlsZQ0KICAgIGlmICgoJHZfc3JjX2ZpbGUgPSBAZ3pvcGVuKCR2X2d6aXBfdGVtcF9uYW1lLCAncmInKSkgPT0gMCkgew0KICAgICAgQGZjbG9zZSgkdl9kZXN0X2ZpbGUpOw0KICAgICAgJHBfZW50cnlbJ3N0YXR1cyddID0gInJlYWRfZXJyb3IiOw0KICAgICAgUGNsWmlwOjpwcml2RXJyb3JMb2coUENMWklQX0VSUl9SRUFEX09QRU5fRkFJTCwgJ1VuYWJsZSB0byBvcGVuIHRlbXBvcmFyeSBmaWxlIFwnJy4kdl9nemlwX3RlbXBfbmFtZS4nXCcgaW4gYmluYXJ5IHJlYWQgbW9kZScpOw0KICAgICAgcmV0dXJuIFBjbFppcDo6ZXJyb3JDb2RlKCk7DQogICAgfQ0KDQoNCiAgICAvLyAtLS0tLSBSZWFkIHRoZSBmaWxlIGJ5IFBDTFpJUF9SRUFEX0JMT0NLX1NJWkUgb2N0ZXRzIGJsb2Nrcw0KICAgICR2X3NpemUgPSAkcF9lbnRyeVsnc2l6ZSddOw0KICAgIHdoaWxlICgkdl9zaXplICE9IDApIHsNCiAgICAgICR2X3JlYWRfc2l6ZSA9ICgkdl9zaXplIDwgUENMWklQX1JFQURfQkxPQ0tfU0laRSA/ICR2X3NpemUgOiBQQ0xaSVBfUkVBRF9CTE9DS19TSVpFKTsNCiAgICAgICR2X2J1ZmZlciA9IEBnenJlYWQoJHZfc3JjX2ZpbGUsICR2X3JlYWRfc2l6ZSk7DQogICAgICAvLyR2X2JpbmFyeV9kYXRhID0gcGFjaygnYScuJHZfcmVhZF9zaXplLCAkdl9idWZmZXIpOw0KICAgICAgQGZ3cml0ZSgkdl9kZXN0X2ZpbGUsICR2X2J1ZmZlciwgJHZfcmVhZF9zaXplKTsNCiAgICAgICR2X3NpemUgLT0gJHZfcmVhZF9zaXplOw0KICAgIH0NCiAgICBAZmNsb3NlKCR2X2Rlc3RfZmlsZSk7DQogICAgQGd6Y2xvc2UoJHZfc3JjX2ZpbGUpOw0KDQogICAgLy8gLS0tLS0gRGVsZXRlIHRoZSB0ZW1wb3JhcnkgZmlsZQ0KICAgIEB1bmxpbmsoJHZfZ3ppcF90ZW1wX25hbWUpOw0KICAgIA0KICAgIC8vIC0tLS0tIFJldHVybg0KICAgIHJldHVybiAkdl9yZXN1bHQ7DQogIH0NCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICAvLyBGdW5jdGlvbiA6IHByaXZFeHRyYWN0RmlsZUluT3V0cHV0KCkNCiAgLy8gRGVzY3JpcHRpb24gOg0KICAvLyBQYXJhbWV0ZXJzIDoNCiAgLy8gUmV0dXJuIFZhbHVlcyA6DQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogIGZ1bmN0aW9uIHByaXZFeHRyYWN0RmlsZUluT3V0cHV0KCYkcF9lbnRyeSwgJiRwX29wdGlvbnMpDQogIHsNCiAgICAkdl9yZXN1bHQ9MTsNCg0KICAgIC8vIC0tLS0tIFJlYWQgdGhlIGZpbGUgaGVhZGVyDQogICAgaWYgKCgkdl9yZXN1bHQgPSAkdGhpcy0+cHJpdlJlYWRGaWxlSGVhZGVyKCR2X2hlYWRlcikpICE9IDEpIHsNCiAgICAgIHJldHVybiAkdl9yZXN1bHQ7DQogICAgfQ0KDQoNCiAgICAvLyAtLS0tLSBDaGVjayB0aGF0IHRoZSBmaWxlIGhlYWRlciBpcyBjb2hlcmVudCB3aXRoICRwX2VudHJ5IGluZm8NCiAgICBpZiAoJHRoaXMtPnByaXZDaGVja0ZpbGVIZWFkZXJzKCR2X2hlYWRlciwgJHBfZW50cnkpICE9IDEpIHsNCiAgICAgICAgLy8gVEJDDQogICAgfQ0KDQogICAgLy8gLS0tLS0gTG9vayBmb3IgcHJlLWV4dHJhY3QgY2FsbGJhY2sNCiAgICBpZiAoaXNzZXQoJHBfb3B0aW9uc1tQQ0xaSVBfQ0JfUFJFX0VYVFJBQ1RdKSkgew0KDQogICAgICAvLyAtLS0tLSBHZW5lcmF0ZSBhIGxvY2FsIGluZm9ybWF0aW9uDQogICAgICAkdl9sb2NhbF9oZWFkZXIgPSBhcnJheSgpOw0KICAgICAgJHRoaXMtPnByaXZDb252ZXJ0SGVhZGVyMkZpbGVJbmZvKCRwX2VudHJ5LCAkdl9sb2NhbF9oZWFkZXIpOw0KDQogICAgICAvLyAtLS0tLSBDYWxsIHRoZSBjYWxsYmFjaw0KICAgICAgLy8gSGVyZSBJIGRvIG5vdCB1c2UgY2FsbF91c2VyX2Z1bmMoKSBiZWNhdXNlIEkgbmVlZCB0byBzZW5kIGEgcmVmZXJlbmNlIHRvIHRoZQ0KICAgICAgLy8gaGVhZGVyLg0KLy8gICAgICBldmFsKCckdl9yZXN1bHQgPSAnLiRwX29wdGlvbnNbUENMWklQX0NCX1BSRV9FWFRSQUNUXS4nKFBDTFpJUF9DQl9QUkVfRVhUUkFDVCwgJHZfbG9jYWxfaGVhZGVyKTsnKTsNCiAgICAgICR2X3Jlc3VsdCA9ICRwX29wdGlvbnNbUENMWklQX0NCX1BSRV9FWFRSQUNUXShQQ0xaSVBfQ0JfUFJFX0VYVFJBQ1QsICR2X2xvY2FsX2hlYWRlcik7DQogICAgICBpZiAoJHZfcmVzdWx0ID09IDApIHsNCiAgICAgICAgLy8gLS0tLS0gQ2hhbmdlIHRoZSBmaWxlIHN0YXR1cw0KICAgICAgICAkcF9lbnRyeVsnc3RhdHVzJ10gPSAic2tpcHBlZCI7DQogICAgICAgICR2X3Jlc3VsdCA9IDE7DQogICAgICB9DQoNCiAgICAgIC8vIC0tLS0tIExvb2sgZm9yIGFib3J0IHJlc3VsdA0KICAgICAgaWYgKCR2X3Jlc3VsdCA9PSAyKSB7DQogICAgICAgIC8vIC0tLS0tIFRoaXMgc3RhdHVzIGlzIGludGVybmFsIGFuZCB3aWxsIGJlIGNoYW5nZWQgaW4gJ3NraXBwZWQnDQogICAgICAgICRwX2VudHJ5WydzdGF0dXMnXSA9ICJhYm9ydGVkIjsNCiAgICAgIAkkdl9yZXN1bHQgPSBQQ0xaSVBfRVJSX1VTRVJfQUJPUlRFRDsNCiAgICAgIH0NCg0KICAgICAgLy8gLS0tLS0gVXBkYXRlIHRoZSBpbmZvcm1hdGlvbnMNCiAgICAgIC8vIE9ubHkgc29tZSBmaWVsZHMgY2FuIGJlIG1vZGlmaWVkDQogICAgICAkcF9lbnRyeVsnZmlsZW5hbWUnXSA9ICR2X2xvY2FsX2hlYWRlclsnZmlsZW5hbWUnXTsNCiAgICB9DQoNCiAgICAvLyAtLS0tLSBUcmFjZQ0KDQogICAgLy8gLS0tLS0gTG9vayBpZiBleHRyYWN0aW9uIHNob3VsZCBiZSBkb25lDQogICAgaWYgKCRwX2VudHJ5WydzdGF0dXMnXSA9PSAnb2snKSB7DQoNCiAgICAgIC8vIC0tLS0tIERvIHRoZSBleHRyYWN0aW9uIChpZiBub3QgYSBmb2xkZXIpDQogICAgICBpZiAoISgoJHBfZW50cnlbJ2V4dGVybmFsJ10mMHgwMDAwMDAxMCk9PTB4MDAwMDAwMTApKSB7DQogICAgICAgIC8vIC0tLS0tIExvb2sgZm9yIG5vdCBjb21wcmVzc2VkIGZpbGUNCiAgICAgICAgaWYgKCRwX2VudHJ5Wydjb21wcmVzc2VkX3NpemUnXSA9PSAkcF9lbnRyeVsnc2l6ZSddKSB7DQoNCiAgICAgICAgICAvLyAtLS0tLSBSZWFkIHRoZSBmaWxlIGluIGEgYnVmZmVyIChvbmUgc2hvdCkNCiAgICAgICAgICAkdl9idWZmZXIgPSBAZnJlYWQoJHRoaXMtPnppcF9mZCwgJHBfZW50cnlbJ2NvbXByZXNzZWRfc2l6ZSddKTsNCg0KICAgICAgICAgIC8vIC0tLS0tIFNlbmQgdGhlIGZpbGUgdG8gdGhlIG91dHB1dA0KICAgICAgICAgIGVjaG8gJHZfYnVmZmVyOw0KICAgICAgICAgIHVuc2V0KCR2X2J1ZmZlcik7DQogICAgICAgIH0NCiAgICAgICAgZWxzZSB7DQoNCiAgICAgICAgICAvLyAtLS0tLSBSZWFkIHRoZSBjb21wcmVzc2VkIGZpbGUgaW4gYSBidWZmZXIgKG9uZSBzaG90KQ0KICAgICAgICAgICR2X2J1ZmZlciA9IEBmcmVhZCgkdGhpcy0+emlwX2ZkLCAkcF9lbnRyeVsnY29tcHJlc3NlZF9zaXplJ10pOw0KICAgICAgICAgIA0KICAgICAgICAgIC8vIC0tLS0tIERlY29tcHJlc3MgdGhlIGZpbGUNCiAgICAgICAgICAkdl9maWxlX2NvbnRlbnQgPSBnemluZmxhdGUoJHZfYnVmZmVyKTsNCiAgICAgICAgICB1bnNldCgkdl9idWZmZXIpOw0KDQogICAgICAgICAgLy8gLS0tLS0gU2VuZCB0aGUgZmlsZSB0byB0aGUgb3V0cHV0DQogICAgICAgICAgZWNobyAkdl9maWxlX2NvbnRlbnQ7DQogICAgICAgICAgdW5zZXQoJHZfZmlsZV9jb250ZW50KTsNCiAgICAgICAgfQ0KICAgICAgfQ0KICAgIH0NCg0KCS8vIC0tLS0tIENoYW5nZSBhYm9ydCBzdGF0dXMNCglpZiAoJHBfZW50cnlbJ3N0YXR1cyddID09ICJhYm9ydGVkIikgew0KICAgICAgJHBfZW50cnlbJ3N0YXR1cyddID0gInNraXBwZWQiOw0KCX0NCg0KICAgIC8vIC0tLS0tIExvb2sgZm9yIHBvc3QtZXh0cmFjdCBjYWxsYmFjaw0KICAgIGVsc2VpZiAoaXNzZXQoJHBfb3B0aW9uc1tQQ0xaSVBfQ0JfUE9TVF9FWFRSQUNUXSkpIHsNCg0KICAgICAgLy8gLS0tLS0gR2VuZXJhdGUgYSBsb2NhbCBpbmZvcm1hdGlvbg0KICAgICAgJHZfbG9jYWxfaGVhZGVyID0gYXJyYXkoKTsNCiAgICAgICR0aGlzLT5wcml2Q29udmVydEhlYWRlcjJGaWxlSW5mbygkcF9lbnRyeSwgJHZfbG9jYWxfaGVhZGVyKTsNCg0KICAgICAgLy8gLS0tLS0gQ2FsbCB0aGUgY2FsbGJhY2sNCiAgICAgIC8vIEhlcmUgSSBkbyBub3QgdXNlIGNhbGxfdXNlcl9mdW5jKCkgYmVjYXVzZSBJIG5lZWQgdG8gc2VuZCBhIHJlZmVyZW5jZSB0byB0aGUNCiAgICAgIC8vIGhlYWRlci4NCi8vICAgICAgZXZhbCgnJHZfcmVzdWx0ID0gJy4kcF9vcHRpb25zW1BDTFpJUF9DQl9QT1NUX0VYVFJBQ1RdLicoUENMWklQX0NCX1BPU1RfRVhUUkFDVCwgJHZfbG9jYWxfaGVhZGVyKTsnKTsNCiAgICAgICR2X3Jlc3VsdCA9ICRwX29wdGlvbnNbUENMWklQX0NCX1BPU1RfRVhUUkFDVF0oUENMWklQX0NCX1BPU1RfRVhUUkFDVCwgJHZfbG9jYWxfaGVhZGVyKTsNCg0KICAgICAgLy8gLS0tLS0gTG9vayBmb3IgYWJvcnQgcmVzdWx0DQogICAgICBpZiAoJHZfcmVzdWx0ID09IDIpIHsNCiAgICAgIAkkdl9yZXN1bHQgPSBQQ0xaSVBfRVJSX1VTRVJfQUJPUlRFRDsNCiAgICAgIH0NCiAgICB9DQoNCiAgICByZXR1cm4gJHZfcmVzdWx0Ow0KICB9DQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAgLy8gRnVuY3Rpb24gOiBwcml2RXh0cmFjdEZpbGVBc1N0cmluZygpDQogIC8vIERlc2NyaXB0aW9uIDoNCiAgLy8gUGFyYW1ldGVycyA6DQogIC8vIFJldHVybiBWYWx1ZXMgOg0KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICBmdW5jdGlvbiBwcml2RXh0cmFjdEZpbGVBc1N0cmluZygmJHBfZW50cnksICYkcF9zdHJpbmcsICYkcF9vcHRpb25zKQ0KICB7DQogICAgJHZfcmVzdWx0PTE7DQoNCiAgICAvLyAtLS0tLSBSZWFkIHRoZSBmaWxlIGhlYWRlcg0KICAgICR2X2hlYWRlciA9IGFycmF5KCk7DQogICAgaWYgKCgkdl9yZXN1bHQgPSAkdGhpcy0+cHJpdlJlYWRGaWxlSGVhZGVyKCR2X2hlYWRlcikpICE9IDEpDQogICAgew0KICAgICAgLy8gLS0tLS0gUmV0dXJuDQogICAgICByZXR1cm4gJHZfcmVzdWx0Ow0KICAgIH0NCg0KDQogICAgLy8gLS0tLS0gQ2hlY2sgdGhhdCB0aGUgZmlsZSBoZWFkZXIgaXMgY29oZXJlbnQgd2l0aCAkcF9lbnRyeSBpbmZvDQogICAgaWYgKCR0aGlzLT5wcml2Q2hlY2tGaWxlSGVhZGVycygkdl9oZWFkZXIsICRwX2VudHJ5KSAhPSAxKSB7DQogICAgICAgIC8vIFRCQw0KICAgIH0NCg0KICAgIC8vIC0tLS0tIExvb2sgZm9yIHByZS1leHRyYWN0IGNhbGxiYWNrDQogICAgaWYgKGlzc2V0KCRwX29wdGlvbnNbUENMWklQX0NCX1BSRV9FWFRSQUNUXSkpIHsNCg0KICAgICAgLy8gLS0tLS0gR2VuZXJhdGUgYSBsb2NhbCBpbmZvcm1hdGlvbg0KICAgICAgJHZfbG9jYWxfaGVhZGVyID0gYXJyYXkoKTsNCiAgICAgICR0aGlzLT5wcml2Q29udmVydEhlYWRlcjJGaWxlSW5mbygkcF9lbnRyeSwgJHZfbG9jYWxfaGVhZGVyKTsNCg0KICAgICAgLy8gLS0tLS0gQ2FsbCB0aGUgY2FsbGJhY2sNCiAgICAgIC8vIEhlcmUgSSBkbyBub3QgdXNlIGNhbGxfdXNlcl9mdW5jKCkgYmVjYXVzZSBJIG5lZWQgdG8gc2VuZCBhIHJlZmVyZW5jZSB0byB0aGUNCiAgICAgIC8vIGhlYWRlci4NCi8vICAgICAgZXZhbCgnJHZfcmVzdWx0ID0gJy4kcF9vcHRpb25zW1BDTFpJUF9DQl9QUkVfRVhUUkFDVF0uJyhQQ0xaSVBfQ0JfUFJFX0VYVFJBQ1QsICR2X2xvY2FsX2hlYWRlcik7Jyk7DQogICAgICAkdl9yZXN1bHQgPSAkcF9vcHRpb25zW1BDTFpJUF9DQl9QUkVfRVhUUkFDVF0oUENMWklQX0NCX1BSRV9FWFRSQUNULCAkdl9sb2NhbF9oZWFkZXIpOw0KICAgICAgaWYgKCR2X3Jlc3VsdCA9PSAwKSB7DQogICAgICAgIC8vIC0tLS0tIENoYW5nZSB0aGUgZmlsZSBzdGF0dXMNCiAgICAgICAgJHBfZW50cnlbJ3N0YXR1cyddID0gInNraXBwZWQiOw0KICAgICAgICAkdl9yZXN1bHQgPSAxOw0KICAgICAgfQ0KICAgICAgDQogICAgICAvLyAtLS0tLSBMb29rIGZvciBhYm9ydCByZXN1bHQNCiAgICAgIGlmICgkdl9yZXN1bHQgPT0gMikgew0KICAgICAgICAvLyAtLS0tLSBUaGlzIHN0YXR1cyBpcyBpbnRlcm5hbCBhbmQgd2lsbCBiZSBjaGFuZ2VkIGluICdza2lwcGVkJw0KICAgICAgICAkcF9lbnRyeVsnc3RhdHVzJ10gPSAiYWJvcnRlZCI7DQogICAgICAJJHZfcmVzdWx0ID0gUENMWklQX0VSUl9VU0VSX0FCT1JURUQ7DQogICAgICB9DQoNCiAgICAgIC8vIC0tLS0tIFVwZGF0ZSB0aGUgaW5mb3JtYXRpb25zDQogICAgICAvLyBPbmx5IHNvbWUgZmllbGRzIGNhbiBiZSBtb2RpZmllZA0KICAgICAgJHBfZW50cnlbJ2ZpbGVuYW1lJ10gPSAkdl9sb2NhbF9oZWFkZXJbJ2ZpbGVuYW1lJ107DQogICAgfQ0KDQoNCiAgICAvLyAtLS0tLSBMb29rIGlmIGV4dHJhY3Rpb24gc2hvdWxkIGJlIGRvbmUNCiAgICBpZiAoJHBfZW50cnlbJ3N0YXR1cyddID09ICdvaycpIHsNCg0KICAgICAgLy8gLS0tLS0gRG8gdGhlIGV4dHJhY3Rpb24gKGlmIG5vdCBhIGZvbGRlcikNCiAgICAgIGlmICghKCgkcF9lbnRyeVsnZXh0ZXJuYWwnXSYweDAwMDAwMDEwKT09MHgwMDAwMDAxMCkpIHsNCiAgICAgICAgLy8gLS0tLS0gTG9vayBmb3Igbm90IGNvbXByZXNzZWQgZmlsZQ0KICAvLyAgICAgIGlmICgkcF9lbnRyeVsnY29tcHJlc3NlZF9zaXplJ10gPT0gJHBfZW50cnlbJ3NpemUnXSkNCiAgICAgICAgaWYgKCRwX2VudHJ5Wydjb21wcmVzc2lvbiddID09IDApIHsNCiAgDQogICAgICAgICAgLy8gLS0tLS0gUmVhZGluZyB0aGUgZmlsZQ0KICAgICAgICAgICRwX3N0cmluZyA9IEBmcmVhZCgkdGhpcy0+emlwX2ZkLCAkcF9lbnRyeVsnY29tcHJlc3NlZF9zaXplJ10pOw0KICAgICAgICB9DQogICAgICAgIGVsc2Ugew0KICANCiAgICAgICAgICAvLyAtLS0tLSBSZWFkaW5nIHRoZSBmaWxlDQogICAgICAgICAgJHZfZGF0YSA9IEBmcmVhZCgkdGhpcy0+emlwX2ZkLCAkcF9lbnRyeVsnY29tcHJlc3NlZF9zaXplJ10pOw0KICAgICAgICAgIA0KICAgICAgICAgIC8vIC0tLS0tIERlY29tcHJlc3MgdGhlIGZpbGUNCiAgICAgICAgICBpZiAoKCRwX3N0cmluZyA9IEBnemluZmxhdGUoJHZfZGF0YSkpID09PSBGQUxTRSkgew0KICAgICAgICAgICAgICAvLyBUQkMNCiAgICAgICAgICB9DQogICAgICAgIH0NCiAgDQogICAgICAgIC8vIC0tLS0tIFRyYWNlDQogICAgICB9DQogICAgICBlbHNlIHsNCiAgICAgICAgICAvLyBUQkMgOiBlcnJvciA6IGNhbiBub3QgZXh0cmFjdCBhIGZvbGRlciBpbiBhIHN0cmluZw0KICAgICAgfQ0KICAgICAgDQogICAgfQ0KDQogIAkvLyAtLS0tLSBDaGFuZ2UgYWJvcnQgc3RhdHVzDQogIAlpZiAoJHBfZW50cnlbJ3N0YXR1cyddID09ICJhYm9ydGVkIikgew0KICAgICAgICAkcF9lbnRyeVsnc3RhdHVzJ10gPSAic2tpcHBlZCI7DQogIAl9DQoJDQogICAgLy8gLS0tLS0gTG9vayBmb3IgcG9zdC1leHRyYWN0IGNhbGxiYWNrDQogICAgZWxzZWlmIChpc3NldCgkcF9vcHRpb25zW1BDTFpJUF9DQl9QT1NUX0VYVFJBQ1RdKSkgew0KDQogICAgICAvLyAtLS0tLSBHZW5lcmF0ZSBhIGxvY2FsIGluZm9ybWF0aW9uDQogICAgICAkdl9sb2NhbF9oZWFkZXIgPSBhcnJheSgpOw0KICAgICAgJHRoaXMtPnByaXZDb252ZXJ0SGVhZGVyMkZpbGVJbmZvKCRwX2VudHJ5LCAkdl9sb2NhbF9oZWFkZXIpOw0KICAgICAgDQogICAgICAvLyAtLS0tLSBTd2FwIHRoZSBjb250ZW50IHRvIGhlYWRlcg0KICAgICAgJHZfbG9jYWxfaGVhZGVyWydjb250ZW50J10gPSAkcF9zdHJpbmc7DQogICAgICAkcF9zdHJpbmcgPSAnJzsNCg0KICAgICAgLy8gLS0tLS0gQ2FsbCB0aGUgY2FsbGJhY2sNCiAgICAgIC8vIEhlcmUgSSBkbyBub3QgdXNlIGNhbGxfdXNlcl9mdW5jKCkgYmVjYXVzZSBJIG5lZWQgdG8gc2VuZCBhIHJlZmVyZW5jZSB0byB0aGUNCiAgICAgIC8vIGhlYWRlci4NCi8vICAgICAgZXZhbCgnJHZfcmVzdWx0ID0gJy4kcF9vcHRpb25zW1BDTFpJUF9DQl9QT1NUX0VYVFJBQ1RdLicoUENMWklQX0NCX1BPU1RfRVhUUkFDVCwgJHZfbG9jYWxfaGVhZGVyKTsnKTsNCiAgICAgICR2X3Jlc3VsdCA9ICRwX29wdGlvbnNbUENMWklQX0NCX1BPU1RfRVhUUkFDVF0oUENMWklQX0NCX1BPU1RfRVhUUkFDVCwgJHZfbG9jYWxfaGVhZGVyKTsNCg0KICAgICAgLy8gLS0tLS0gU3dhcCBiYWNrIHRoZSBjb250ZW50IHRvIGhlYWRlcg0KICAgICAgJHBfc3RyaW5nID0gJHZfbG9jYWxfaGVhZGVyWydjb250ZW50J107DQogICAgICB1bnNldCgkdl9sb2NhbF9oZWFkZXJbJ2NvbnRlbnQnXSk7DQoNCiAgICAgIC8vIC0tLS0tIExvb2sgZm9yIGFib3J0IHJlc3VsdA0KICAgICAgaWYgKCR2X3Jlc3VsdCA9PSAyKSB7DQogICAgICAJJHZfcmVzdWx0ID0gUENMWklQX0VSUl9VU0VSX0FCT1JURUQ7DQogICAgICB9DQogICAgfQ0KDQogICAgLy8gLS0tLS0gUmV0dXJuDQogICAgcmV0dXJuICR2X3Jlc3VsdDsNCiAgfQ0KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogIC8vIEZ1bmN0aW9uIDogcHJpdlJlYWRGaWxlSGVhZGVyKCkNCiAgLy8gRGVzY3JpcHRpb24gOg0KICAvLyBQYXJhbWV0ZXJzIDoNCiAgLy8gUmV0dXJuIFZhbHVlcyA6DQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogIGZ1bmN0aW9uIHByaXZSZWFkRmlsZUhlYWRlcigmJHBfaGVhZGVyKQ0KICB7DQogICAgJHZfcmVzdWx0PTE7DQoNCiAgICAvLyAtLS0tLSBSZWFkIHRoZSA0IGJ5dGVzIHNpZ25hdHVyZQ0KICAgICR2X2JpbmFyeV9kYXRhID0gQGZyZWFkKCR0aGlzLT56aXBfZmQsIDQpOw0KICAgICR2X2RhdGEgPSB1bnBhY2soJ1ZpZCcsICR2X2JpbmFyeV9kYXRhKTsNCg0KICAgIC8vIC0tLS0tIENoZWNrIHNpZ25hdHVyZQ0KICAgIGlmICgkdl9kYXRhWydpZCddICE9IDB4MDQwMzRiNTApDQogICAgew0KDQogICAgICAvLyAtLS0tLSBFcnJvciBsb2cNCiAgICAgIFBjbFppcDo6cHJpdkVycm9yTG9nKFBDTFpJUF9FUlJfQkFEX0ZPUk1BVCwgJ0ludmFsaWQgYXJjaGl2ZSBzdHJ1Y3R1cmUnKTsNCg0KICAgICAgLy8gLS0tLS0gUmV0dXJuDQogICAgICByZXR1cm4gUGNsWmlwOjplcnJvckNvZGUoKTsNCiAgICB9DQoNCiAgICAvLyAtLS0tLSBSZWFkIHRoZSBmaXJzdCA0MiBieXRlcyBvZiB0aGUgaGVhZGVyDQogICAgJHZfYmluYXJ5X2RhdGEgPSBmcmVhZCgkdGhpcy0+emlwX2ZkLCAyNik7DQoNCiAgICAvLyAtLS0tLSBMb29rIGZvciBpbnZhbGlkIGJsb2NrIHNpemUNCiAgICBpZiAoc3RybGVuKCR2X2JpbmFyeV9kYXRhKSAhPSAyNikNCiAgICB7DQogICAgICAkcF9oZWFkZXJbJ2ZpbGVuYW1lJ10gPSAiIjsNCiAgICAgICRwX2hlYWRlclsnc3RhdHVzJ10gPSAiaW52YWxpZF9oZWFkZXIiOw0KDQogICAgICAvLyAtLS0tLSBFcnJvciBsb2cNCiAgICAgIFBjbFppcDo6cHJpdkVycm9yTG9nKFBDTFpJUF9FUlJfQkFEX0ZPUk1BVCwgIkludmFsaWQgYmxvY2sgc2l6ZSA6ICIuc3RybGVuKCR2X2JpbmFyeV9kYXRhKSk7DQoNCiAgICAgIC8vIC0tLS0tIFJldHVybg0KICAgICAgcmV0dXJuIFBjbFppcDo6ZXJyb3JDb2RlKCk7DQogICAgfQ0KDQogICAgLy8gLS0tLS0gRXh0cmFjdCB0aGUgdmFsdWVzDQogICAgJHZfZGF0YSA9IHVucGFjaygndnZlcnNpb24vdmZsYWcvdmNvbXByZXNzaW9uL3ZtdGltZS92bWRhdGUvVmNyYy9WY29tcHJlc3NlZF9zaXplL1ZzaXplL3ZmaWxlbmFtZV9sZW4vdmV4dHJhX2xlbicsICR2X2JpbmFyeV9kYXRhKTsNCg0KICAgIC8vIC0tLS0tIEdldCBmaWxlbmFtZQ0KICAgICRwX2hlYWRlclsnZmlsZW5hbWUnXSA9IGZyZWFkKCR0aGlzLT56aXBfZmQsICR2X2RhdGFbJ2ZpbGVuYW1lX2xlbiddKTsNCg0KICAgIC8vIC0tLS0tIEdldCBleHRyYV9maWVsZHMNCiAgICBpZiAoJHZfZGF0YVsnZXh0cmFfbGVuJ10gIT0gMCkgew0KICAgICAgJHBfaGVhZGVyWydleHRyYSddID0gZnJlYWQoJHRoaXMtPnppcF9mZCwgJHZfZGF0YVsnZXh0cmFfbGVuJ10pOw0KICAgIH0NCiAgICBlbHNlIHsNCiAgICAgICRwX2hlYWRlclsnZXh0cmEnXSA9ICcnOw0KICAgIH0NCg0KICAgIC8vIC0tLS0tIEV4dHJhY3QgcHJvcGVydGllcw0KICAgICRwX2hlYWRlclsndmVyc2lvbl9leHRyYWN0ZWQnXSA9ICR2X2RhdGFbJ3ZlcnNpb24nXTsNCiAgICAkcF9oZWFkZXJbJ2NvbXByZXNzaW9uJ10gPSAkdl9kYXRhWydjb21wcmVzc2lvbiddOw0KICAgICRwX2hlYWRlclsnc2l6ZSddID0gJHZfZGF0YVsnc2l6ZSddOw0KICAgICRwX2hlYWRlclsnY29tcHJlc3NlZF9zaXplJ10gPSAkdl9kYXRhWydjb21wcmVzc2VkX3NpemUnXTsNCiAgICAkcF9oZWFkZXJbJ2NyYyddID0gJHZfZGF0YVsnY3JjJ107DQogICAgJHBfaGVhZGVyWydmbGFnJ10gPSAkdl9kYXRhWydmbGFnJ107DQogICAgJHBfaGVhZGVyWydmaWxlbmFtZV9sZW4nXSA9ICR2X2RhdGFbJ2ZpbGVuYW1lX2xlbiddOw0KDQogICAgLy8gLS0tLS0gUmVjdXBlcmF0ZSBkYXRlIGluIFVOSVggZm9ybWF0DQogICAgJHBfaGVhZGVyWydtZGF0ZSddID0gJHZfZGF0YVsnbWRhdGUnXTsNCiAgICAkcF9oZWFkZXJbJ210aW1lJ10gPSAkdl9kYXRhWydtdGltZSddOw0KICAgIGlmICgkcF9oZWFkZXJbJ21kYXRlJ10gJiYgJHBfaGVhZGVyWydtdGltZSddKQ0KICAgIHsNCiAgICAgIC8vIC0tLS0tIEV4dHJhY3QgdGltZQ0KICAgICAgJHZfaG91ciA9ICgkcF9oZWFkZXJbJ210aW1lJ10gJiAweEY4MDApID4+IDExOw0KICAgICAgJHZfbWludXRlID0gKCRwX2hlYWRlclsnbXRpbWUnXSAmIDB4MDdFMCkgPj4gNTsNCiAgICAgICR2X3NlY29uZGUgPSAoJHBfaGVhZGVyWydtdGltZSddICYgMHgwMDFGKSoyOw0KDQogICAgICAvLyAtLS0tLSBFeHRyYWN0IGRhdGUNCiAgICAgICR2X3llYXIgPSAoKCRwX2hlYWRlclsnbWRhdGUnXSAmIDB4RkUwMCkgPj4gOSkgKyAxOTgwOw0KICAgICAgJHZfbW9udGggPSAoJHBfaGVhZGVyWydtZGF0ZSddICYgMHgwMUUwKSA+PiA1Ow0KICAgICAgJHZfZGF5ID0gJHBfaGVhZGVyWydtZGF0ZSddICYgMHgwMDFGOw0KDQogICAgICAvLyAtLS0tLSBHZXQgVU5JWCBkYXRlIGZvcm1hdA0KICAgICAgJHBfaGVhZGVyWydtdGltZSddID0gQG1rdGltZSgkdl9ob3VyLCAkdl9taW51dGUsICR2X3NlY29uZGUsICR2X21vbnRoLCAkdl9kYXksICR2X3llYXIpOw0KDQogICAgfQ0KICAgIGVsc2UNCiAgICB7DQogICAgICAkcF9oZWFkZXJbJ210aW1lJ10gPSB0aW1lKCk7DQogICAgfQ0KDQogICAgLy8gVEJDDQogICAgLy9mb3IocmVzZXQoJHZfZGF0YSk7ICRrZXkgPSBrZXkoJHZfZGF0YSk7IG5leHQoJHZfZGF0YSkpIHsNCiAgICAvL30NCg0KICAgIC8vIC0tLS0tIFNldCB0aGUgc3RvcmVkIGZpbGVuYW1lDQogICAgJHBfaGVhZGVyWydzdG9yZWRfZmlsZW5hbWUnXSA9ICRwX2hlYWRlclsnZmlsZW5hbWUnXTsNCg0KICAgIC8vIC0tLS0tIFNldCB0aGUgc3RhdHVzIGZpZWxkDQogICAgJHBfaGVhZGVyWydzdGF0dXMnXSA9ICJvayI7DQoNCiAgICAvLyAtLS0tLSBSZXR1cm4NCiAgICByZXR1cm4gJHZfcmVzdWx0Ow0KICB9DQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAgLy8gRnVuY3Rpb24gOiBwcml2UmVhZENlbnRyYWxGaWxlSGVhZGVyKCkNCiAgLy8gRGVzY3JpcHRpb24gOg0KICAvLyBQYXJhbWV0ZXJzIDoNCiAgLy8gUmV0dXJuIFZhbHVlcyA6DQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogIGZ1bmN0aW9uIHByaXZSZWFkQ2VudHJhbEZpbGVIZWFkZXIoJiRwX2hlYWRlcikNCiAgew0KICAgICR2X3Jlc3VsdD0xOw0KDQogICAgLy8gLS0tLS0gUmVhZCB0aGUgNCBieXRlcyBzaWduYXR1cmUNCiAgICAkdl9iaW5hcnlfZGF0YSA9IEBmcmVhZCgkdGhpcy0+emlwX2ZkLCA0KTsNCiAgICAkdl9kYXRhID0gdW5wYWNrKCdWaWQnLCAkdl9iaW5hcnlfZGF0YSk7DQoNCiAgICAvLyAtLS0tLSBDaGVjayBzaWduYXR1cmUNCiAgICBpZiAoJHZfZGF0YVsnaWQnXSAhPSAweDAyMDE0YjUwKQ0KICAgIHsNCg0KICAgICAgLy8gLS0tLS0gRXJyb3IgbG9nDQogICAgICBQY2xaaXA6OnByaXZFcnJvckxvZyhQQ0xaSVBfRVJSX0JBRF9GT1JNQVQsICdJbnZhbGlkIGFyY2hpdmUgc3RydWN0dXJlJyk7DQoNCiAgICAgIC8vIC0tLS0tIFJldHVybg0KICAgICAgcmV0dXJuIFBjbFppcDo6ZXJyb3JDb2RlKCk7DQogICAgfQ0KDQogICAgLy8gLS0tLS0gUmVhZCB0aGUgZmlyc3QgNDIgYnl0ZXMgb2YgdGhlIGhlYWRlcg0KICAgICR2X2JpbmFyeV9kYXRhID0gZnJlYWQoJHRoaXMtPnppcF9mZCwgNDIpOw0KDQogICAgLy8gLS0tLS0gTG9vayBmb3IgaW52YWxpZCBibG9jayBzaXplDQogICAgaWYgKHN0cmxlbigkdl9iaW5hcnlfZGF0YSkgIT0gNDIpDQogICAgew0KICAgICAgJHBfaGVhZGVyWydmaWxlbmFtZSddID0gIiI7DQogICAgICAkcF9oZWFkZXJbJ3N0YXR1cyddID0gImludmFsaWRfaGVhZGVyIjsNCg0KICAgICAgLy8gLS0tLS0gRXJyb3IgbG9nDQogICAgICBQY2xaaXA6OnByaXZFcnJvckxvZyhQQ0xaSVBfRVJSX0JBRF9GT1JNQVQsICJJbnZhbGlkIGJsb2NrIHNpemUgOiAiLnN0cmxlbigkdl9iaW5hcnlfZGF0YSkpOw0KDQogICAgICAvLyAtLS0tLSBSZXR1cm4NCiAgICAgIHJldHVybiBQY2xaaXA6OmVycm9yQ29kZSgpOw0KICAgIH0NCg0KICAgIC8vIC0tLS0tIEV4dHJhY3QgdGhlIHZhbHVlcw0KICAgICRwX2hlYWRlciA9IHVucGFjaygndnZlcnNpb24vdnZlcnNpb25fZXh0cmFjdGVkL3ZmbGFnL3Zjb21wcmVzc2lvbi92bXRpbWUvdm1kYXRlL1ZjcmMvVmNvbXByZXNzZWRfc2l6ZS9Wc2l6ZS92ZmlsZW5hbWVfbGVuL3ZleHRyYV9sZW4vdmNvbW1lbnRfbGVuL3ZkaXNrL3ZpbnRlcm5hbC9WZXh0ZXJuYWwvVm9mZnNldCcsICR2X2JpbmFyeV9kYXRhKTsNCg0KICAgIC8vIC0tLS0tIEdldCBmaWxlbmFtZQ0KICAgIGlmICgkcF9oZWFkZXJbJ2ZpbGVuYW1lX2xlbiddICE9IDApDQogICAgICAkcF9oZWFkZXJbJ2ZpbGVuYW1lJ10gPSBmcmVhZCgkdGhpcy0+emlwX2ZkLCAkcF9oZWFkZXJbJ2ZpbGVuYW1lX2xlbiddKTsNCiAgICBlbHNlDQogICAgICAkcF9oZWFkZXJbJ2ZpbGVuYW1lJ10gPSAnJzsNCg0KICAgIC8vIC0tLS0tIEdldCBleHRyYQ0KICAgIGlmICgkcF9oZWFkZXJbJ2V4dHJhX2xlbiddICE9IDApDQogICAgICAkcF9oZWFkZXJbJ2V4dHJhJ10gPSBmcmVhZCgkdGhpcy0+emlwX2ZkLCAkcF9oZWFkZXJbJ2V4dHJhX2xlbiddKTsNCiAgICBlbHNlDQogICAgICAkcF9oZWFkZXJbJ2V4dHJhJ10gPSAnJzsNCg0KICAgIC8vIC0tLS0tIEdldCBjb21tZW50DQogICAgaWYgKCRwX2hlYWRlclsnY29tbWVudF9sZW4nXSAhPSAwKQ0KICAgICAgJHBfaGVhZGVyWydjb21tZW50J10gPSBmcmVhZCgkdGhpcy0+emlwX2ZkLCAkcF9oZWFkZXJbJ2NvbW1lbnRfbGVuJ10pOw0KICAgIGVsc2UNCiAgICAgICRwX2hlYWRlclsnY29tbWVudCddID0gJyc7DQoNCiAgICAvLyAtLS0tLSBFeHRyYWN0IHByb3BlcnRpZXMNCg0KICAgIC8vIC0tLS0tIFJlY3VwZXJhdGUgZGF0ZSBpbiBVTklYIGZvcm1hdA0KICAgIC8vaWYgKCRwX2hlYWRlclsnbWRhdGUnXSAmJiAkcF9oZWFkZXJbJ210aW1lJ10pDQogICAgLy8gVEJDIDogYnVnIDogdGhpcyB3YXMgaWdub3JpbmcgdGltZSB3aXRoIDAvMC8wDQogICAgaWYgKDEpDQogICAgew0KICAgICAgLy8gLS0tLS0gRXh0cmFjdCB0aW1lDQogICAgICAkdl9ob3VyID0gKCRwX2hlYWRlclsnbXRpbWUnXSAmIDB4RjgwMCkgPj4gMTE7DQogICAgICAkdl9taW51dGUgPSAoJHBfaGVhZGVyWydtdGltZSddICYgMHgwN0UwKSA+PiA1Ow0KICAgICAgJHZfc2Vjb25kZSA9ICgkcF9oZWFkZXJbJ210aW1lJ10gJiAweDAwMUYpKjI7DQoNCiAgICAgIC8vIC0tLS0tIEV4dHJhY3QgZGF0ZQ0KICAgICAgJHZfeWVhciA9ICgoJHBfaGVhZGVyWydtZGF0ZSddICYgMHhGRTAwKSA+PiA5KSArIDE5ODA7DQogICAgICAkdl9tb250aCA9ICgkcF9oZWFkZXJbJ21kYXRlJ10gJiAweDAxRTApID4+IDU7DQogICAgICAkdl9kYXkgPSAkcF9oZWFkZXJbJ21kYXRlJ10gJiAweDAwMUY7DQoNCiAgICAgIC8vIC0tLS0tIEdldCBVTklYIGRhdGUgZm9ybWF0DQogICAgICAkcF9oZWFkZXJbJ210aW1lJ10gPSBAbWt0aW1lKCR2X2hvdXIsICR2X21pbnV0ZSwgJHZfc2Vjb25kZSwgJHZfbW9udGgsICR2X2RheSwgJHZfeWVhcik7DQoNCiAgICB9DQogICAgZWxzZQ0KICAgIHsNCiAgICAgICRwX2hlYWRlclsnbXRpbWUnXSA9IHRpbWUoKTsNCiAgICB9DQoNCiAgICAvLyAtLS0tLSBTZXQgdGhlIHN0b3JlZCBmaWxlbmFtZQ0KICAgICRwX2hlYWRlclsnc3RvcmVkX2ZpbGVuYW1lJ10gPSAkcF9oZWFkZXJbJ2ZpbGVuYW1lJ107DQoNCiAgICAvLyAtLS0tLSBTZXQgZGVmYXVsdCBzdGF0dXMgdG8gb2sNCiAgICAkcF9oZWFkZXJbJ3N0YXR1cyddID0gJ29rJzsNCg0KICAgIC8vIC0tLS0tIExvb2sgaWYgaXQgaXMgYSBkaXJlY3RvcnkNCiAgICBpZiAoc3Vic3RyKCRwX2hlYWRlclsnZmlsZW5hbWUnXSwgLTEpID09ICcvJykgew0KICAgICAgLy8kcF9oZWFkZXJbJ2V4dGVybmFsJ10gPSAweDQxRkYwMDEwOw0KICAgICAgJHBfaGVhZGVyWydleHRlcm5hbCddID0gMHgwMDAwMDAxMDsNCiAgICB9DQoNCg0KICAgIC8vIC0tLS0tIFJldHVybg0KICAgIHJldHVybiAkdl9yZXN1bHQ7DQogIH0NCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICAvLyBGdW5jdGlvbiA6IHByaXZDaGVja0ZpbGVIZWFkZXJzKCkNCiAgLy8gRGVzY3JpcHRpb24gOg0KICAvLyBQYXJhbWV0ZXJzIDoNCiAgLy8gUmV0dXJuIFZhbHVlcyA6DQogIC8vICAgMSBvbiBzdWNjZXNzLA0KICAvLyAgIDAgb24gZXJyb3I7DQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogIGZ1bmN0aW9uIHByaXZDaGVja0ZpbGVIZWFkZXJzKCYkcF9sb2NhbF9oZWFkZXIsICYkcF9jZW50cmFsX2hlYWRlcikNCiAgew0KICAgICR2X3Jlc3VsdD0xOw0KDQogIAkvLyAtLS0tLSBDaGVjayB0aGUgc3RhdGljIHZhbHVlcw0KICAJLy8gVEJDDQogIAlpZiAoJHBfbG9jYWxfaGVhZGVyWydmaWxlbmFtZSddICE9ICRwX2NlbnRyYWxfaGVhZGVyWydmaWxlbmFtZSddKSB7DQogIAl9DQogIAlpZiAoJHBfbG9jYWxfaGVhZGVyWyd2ZXJzaW9uX2V4dHJhY3RlZCddICE9ICRwX2NlbnRyYWxfaGVhZGVyWyd2ZXJzaW9uX2V4dHJhY3RlZCddKSB7DQogIAl9DQogIAlpZiAoJHBfbG9jYWxfaGVhZGVyWydmbGFnJ10gIT0gJHBfY2VudHJhbF9oZWFkZXJbJ2ZsYWcnXSkgew0KICAJfQ0KICAJaWYgKCRwX2xvY2FsX2hlYWRlclsnY29tcHJlc3Npb24nXSAhPSAkcF9jZW50cmFsX2hlYWRlclsnY29tcHJlc3Npb24nXSkgew0KICAJfQ0KICAJaWYgKCRwX2xvY2FsX2hlYWRlclsnbXRpbWUnXSAhPSAkcF9jZW50cmFsX2hlYWRlclsnbXRpbWUnXSkgew0KICAJfQ0KICAJaWYgKCRwX2xvY2FsX2hlYWRlclsnZmlsZW5hbWVfbGVuJ10gIT0gJHBfY2VudHJhbF9oZWFkZXJbJ2ZpbGVuYW1lX2xlbiddKSB7DQogIAl9DQogIA0KICAJLy8gLS0tLS0gTG9vayBmb3IgZmxhZyBiaXQgMw0KICAJaWYgKCgkcF9sb2NhbF9oZWFkZXJbJ2ZsYWcnXSAmIDgpID09IDgpIHsNCiAgICAgICAgICAkcF9sb2NhbF9oZWFkZXJbJ3NpemUnXSA9ICRwX2NlbnRyYWxfaGVhZGVyWydzaXplJ107DQogICAgICAgICAgJHBfbG9jYWxfaGVhZGVyWydjb21wcmVzc2VkX3NpemUnXSA9ICRwX2NlbnRyYWxfaGVhZGVyWydjb21wcmVzc2VkX3NpemUnXTsNCiAgICAgICAgICAkcF9sb2NhbF9oZWFkZXJbJ2NyYyddID0gJHBfY2VudHJhbF9oZWFkZXJbJ2NyYyddOw0KICAJfQ0KDQogICAgLy8gLS0tLS0gUmV0dXJuDQogICAgcmV0dXJuICR2X3Jlc3VsdDsNCiAgfQ0KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogIC8vIEZ1bmN0aW9uIDogcHJpdlJlYWRFbmRDZW50cmFsRGlyKCkNCiAgLy8gRGVzY3JpcHRpb24gOg0KICAvLyBQYXJhbWV0ZXJzIDoNCiAgLy8gUmV0dXJuIFZhbHVlcyA6DQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogIGZ1bmN0aW9uIHByaXZSZWFkRW5kQ2VudHJhbERpcigmJHBfY2VudHJhbF9kaXIpDQogIHsNCiAgICAkdl9yZXN1bHQ9MTsNCg0KICAgIC8vIC0tLS0tIEdvIHRvIHRoZSBlbmQgb2YgdGhlIHppcCBmaWxlDQogICAgJHZfc2l6ZSA9IGZpbGVzaXplKCR0aGlzLT56aXBuYW1lKTsNCiAgICBAZnNlZWsoJHRoaXMtPnppcF9mZCwgJHZfc2l6ZSk7DQogICAgaWYgKEBmdGVsbCgkdGhpcy0+emlwX2ZkKSAhPSAkdl9zaXplKQ0KICAgIHsNCiAgICAgIC8vIC0tLS0tIEVycm9yIGxvZw0KICAgICAgUGNsWmlwOjpwcml2RXJyb3JMb2coUENMWklQX0VSUl9CQURfRk9STUFULCAnVW5hYmxlIHRvIGdvIHRvIHRoZSBlbmQgb2YgdGhlIGFyY2hpdmUgXCcnLiR0aGlzLT56aXBuYW1lLidcJycpOw0KDQogICAgICAvLyAtLS0tLSBSZXR1cm4NCiAgICAgIHJldHVybiBQY2xaaXA6OmVycm9yQ29kZSgpOw0KICAgIH0NCg0KICAgIC8vIC0tLS0tIEZpcnN0IHRyeSA6IGxvb2sgaWYgdGhpcyBpcyBhbiBhcmNoaXZlIHdpdGggbm8gY29tbWVudGFyaWVzIChtb3N0IG9mIHRoZSB0aW1lKQ0KICAgIC8vIGluIHRoaXMgY2FzZSB0aGUgZW5kIG9mIGNlbnRyYWwgZGlyIGlzIGF0IDIyIGJ5dGVzIG9mIHRoZSBmaWxlIGVuZA0KICAgICR2X2ZvdW5kID0gMDsNCiAgICBpZiAoJHZfc2l6ZSA+IDI2KSB7DQogICAgICBAZnNlZWsoJHRoaXMtPnppcF9mZCwgJHZfc2l6ZS0yMik7DQogICAgICBpZiAoKCR2X3BvcyA9IEBmdGVsbCgkdGhpcy0+emlwX2ZkKSkgIT0gKCR2X3NpemUtMjIpKQ0KICAgICAgew0KICAgICAgICAvLyAtLS0tLSBFcnJvciBsb2cNCiAgICAgICAgUGNsWmlwOjpwcml2RXJyb3JMb2coUENMWklQX0VSUl9CQURfRk9STUFULCAnVW5hYmxlIHRvIHNlZWsgYmFjayB0byB0aGUgbWlkZGxlIG9mIHRoZSBhcmNoaXZlIFwnJy4kdGhpcy0+emlwbmFtZS4nXCcnKTsNCg0KICAgICAgICAvLyAtLS0tLSBSZXR1cm4NCiAgICAgICAgcmV0dXJuIFBjbFppcDo6ZXJyb3JDb2RlKCk7DQogICAgICB9DQoNCiAgICAgIC8vIC0tLS0tIFJlYWQgZm9yIGJ5dGVzDQogICAgICAkdl9iaW5hcnlfZGF0YSA9IEBmcmVhZCgkdGhpcy0+emlwX2ZkLCA0KTsNCiAgICAgICR2X2RhdGEgPSBAdW5wYWNrKCdWaWQnLCAkdl9iaW5hcnlfZGF0YSk7DQoNCiAgICAgIC8vIC0tLS0tIENoZWNrIHNpZ25hdHVyZQ0KICAgICAgaWYgKCR2X2RhdGFbJ2lkJ10gPT0gMHgwNjA1NGI1MCkgew0KICAgICAgICAkdl9mb3VuZCA9IDE7DQogICAgICB9DQoNCiAgICAgICR2X3BvcyA9IGZ0ZWxsKCR0aGlzLT56aXBfZmQpOw0KICAgIH0NCg0KICAgIC8vIC0tLS0tIEdvIGJhY2sgdG8gdGhlIG1heGltdW0gcG9zc2libGUgc2l6ZSBvZiB0aGUgQ2VudHJhbCBEaXIgRW5kIFJlY29yZA0KICAgIGlmICghJHZfZm91bmQpIHsNCiAgICAgICR2X21heGltdW1fc2l6ZSA9IDY1NTU3OyAvLyAweEZGRkYgKyAyMjsNCiAgICAgIGlmICgkdl9tYXhpbXVtX3NpemUgPiAkdl9zaXplKQ0KICAgICAgICAkdl9tYXhpbXVtX3NpemUgPSAkdl9zaXplOw0KICAgICAgQGZzZWVrKCR0aGlzLT56aXBfZmQsICR2X3NpemUtJHZfbWF4aW11bV9zaXplKTsNCiAgICAgIGlmIChAZnRlbGwoJHRoaXMtPnppcF9mZCkgIT0gKCR2X3NpemUtJHZfbWF4aW11bV9zaXplKSkNCiAgICAgIHsNCiAgICAgICAgLy8gLS0tLS0gRXJyb3IgbG9nDQogICAgICAgIFBjbFppcDo6cHJpdkVycm9yTG9nKFBDTFpJUF9FUlJfQkFEX0ZPUk1BVCwgJ1VuYWJsZSB0byBzZWVrIGJhY2sgdG8gdGhlIG1pZGRsZSBvZiB0aGUgYXJjaGl2ZSBcJycuJHRoaXMtPnppcG5hbWUuJ1wnJyk7DQoNCiAgICAgICAgLy8gLS0tLS0gUmV0dXJuDQogICAgICAgIHJldHVybiBQY2xaaXA6OmVycm9yQ29kZSgpOw0KICAgICAgfQ0KDQogICAgICAvLyAtLS0tLSBSZWFkIGJ5dGUgcGVyIGJ5dGUgaW4gb3JkZXIgdG8gZmluZCB0aGUgc2lnbmF0dXJlDQogICAgICAkdl9wb3MgPSBmdGVsbCgkdGhpcy0+emlwX2ZkKTsNCiAgICAgICR2X2J5dGVzID0gMHgwMDAwMDAwMDsNCiAgICAgIHdoaWxlICgkdl9wb3MgPCAkdl9zaXplKQ0KICAgICAgew0KICAgICAgICAvLyAtLS0tLSBSZWFkIGEgYnl0ZQ0KICAgICAgICAkdl9ieXRlID0gQGZyZWFkKCR0aGlzLT56aXBfZmQsIDEpOw0KDQogICAgICAgIC8vIC0tLS0tICBBZGQgdGhlIGJ5dGUNCiAgICAgICAgLy8kdl9ieXRlcyA9ICgkdl9ieXRlcyA8PCA4KSB8IE9yZCgkdl9ieXRlKTsNCiAgICAgICAgLy8gTm90ZSB3ZSBtYXNrIHRoZSBvbGQgdmFsdWUgZG93biBzdWNoIHRoYXQgb25jZSBzaGlmdGVkIHdlIGNhbiBuZXZlciBlbmQgdXAgd2l0aCBtb3JlIHRoYW4gYSAzMmJpdCBudW1iZXIgDQogICAgICAgIC8vIE90aGVyd2lzZSBvbiBzeXN0ZW1zIHdoZXJlIHdlIGhhdmUgNjRiaXQgaW50ZWdlcnMgdGhlIGNoZWNrIGJlbG93IGZvciB0aGUgbWFnaWMgbnVtYmVyIHdpbGwgZmFpbC4gDQogICAgICAgICR2X2J5dGVzID0gKCAoJHZfYnl0ZXMgJiAweEZGRkZGRikgPDwgOCkgfCBPcmQoJHZfYnl0ZSk7IA0KDQogICAgICAgIC8vIC0tLS0tIENvbXBhcmUgdGhlIGJ5dGVzDQogICAgICAgIGlmICgkdl9ieXRlcyA9PSAweDUwNGIwNTA2KQ0KICAgICAgICB7DQogICAgICAgICAgJHZfcG9zKys7DQogICAgICAgICAgYnJlYWs7DQogICAgICAgIH0NCg0KICAgICAgICAkdl9wb3MrKzsNCiAgICAgIH0NCg0KICAgICAgLy8gLS0tLS0gTG9vayBpZiBub3QgZm91bmQgZW5kIG9mIGNlbnRyYWwgZGlyDQogICAgICBpZiAoJHZfcG9zID09ICR2X3NpemUpDQogICAgICB7DQoNCiAgICAgICAgLy8gLS0tLS0gRXJyb3IgbG9nDQogICAgICAgIFBjbFppcDo6cHJpdkVycm9yTG9nKFBDTFpJUF9FUlJfQkFEX0ZPUk1BVCwgIlVuYWJsZSB0byBmaW5kIEVuZCBvZiBDZW50cmFsIERpciBSZWNvcmQgc2lnbmF0dXJlIik7DQoNCiAgICAgICAgLy8gLS0tLS0gUmV0dXJuDQogICAgICAgIHJldHVybiBQY2xaaXA6OmVycm9yQ29kZSgpOw0KICAgICAgfQ0KICAgIH0NCg0KICAgIC8vIC0tLS0tIFJlYWQgdGhlIGZpcnN0IDE4IGJ5dGVzIG9mIHRoZSBoZWFkZXINCiAgICAkdl9iaW5hcnlfZGF0YSA9IGZyZWFkKCR0aGlzLT56aXBfZmQsIDE4KTsNCg0KICAgIC8vIC0tLS0tIExvb2sgZm9yIGludmFsaWQgYmxvY2sgc2l6ZQ0KICAgIGlmIChzdHJsZW4oJHZfYmluYXJ5X2RhdGEpICE9IDE4KQ0KICAgIHsNCg0KICAgICAgLy8gLS0tLS0gRXJyb3IgbG9nDQogICAgICBQY2xaaXA6OnByaXZFcnJvckxvZyhQQ0xaSVBfRVJSX0JBRF9GT1JNQVQsICJJbnZhbGlkIEVuZCBvZiBDZW50cmFsIERpciBSZWNvcmQgc2l6ZSA6ICIuc3RybGVuKCR2X2JpbmFyeV9kYXRhKSk7DQoNCiAgICAgIC8vIC0tLS0tIFJldHVybg0KICAgICAgcmV0dXJuIFBjbFppcDo6ZXJyb3JDb2RlKCk7DQogICAgfQ0KDQogICAgLy8gLS0tLS0gRXh0cmFjdCB0aGUgdmFsdWVzDQogICAgJHZfZGF0YSA9IHVucGFjaygndmRpc2svdmRpc2tfc3RhcnQvdmRpc2tfZW50cmllcy92ZW50cmllcy9Wc2l6ZS9Wb2Zmc2V0L3Zjb21tZW50X3NpemUnLCAkdl9iaW5hcnlfZGF0YSk7DQoNCiAgICAvLyAtLS0tLSBDaGVjayB0aGUgZ2xvYmFsIHNpemUNCiAgICBpZiAoKCR2X3BvcyArICR2X2RhdGFbJ2NvbW1lbnRfc2l6ZSddICsgMTgpICE9ICR2X3NpemUpIHsNCg0KCSAgLy8gLS0tLS0gUmVtb3ZlZCBpbiByZWxlYXNlIDIuMiBzZWUgcmVhZG1lIGZpbGUNCgkgIC8vIFRoZSBjaGVjayBvZiB0aGUgZmlsZSBzaXplIGlzIGEgbGl0dGxlIHRvbyBzdHJpY3QuDQoJICAvLyBTb21lIGJ1Z3Mgd2hlcmUgZm91bmQgd2hlbiBhIHppcCBpcyBlbmNyeXB0ZWQvZGVjcnlwdGVkIHdpdGggJ2NyeXB0Jy4NCgkgIC8vIFdoaWxlIGRlY3J5cHRlZCwgemlwIGhhcyB0cmFpbmluZyAwIGJ5dGVzDQoJICBpZiAoMCkgew0KICAgICAgLy8gLS0tLS0gRXJyb3IgbG9nDQogICAgICBQY2xaaXA6OnByaXZFcnJvckxvZyhQQ0xaSVBfRVJSX0JBRF9GT1JNQVQsDQoJICAgICAgICAgICAgICAgICAgICAgICAnVGhlIGNlbnRyYWwgZGlyIGlzIG5vdCBhdCB0aGUgZW5kIG9mIHRoZSBhcmNoaXZlLicNCgkJCQkJCSAgIC4nIFNvbWUgdHJhaWxpbmcgYnl0ZXMgZXhpc3RzIGFmdGVyIHRoZSBhcmNoaXZlLicpOw0KDQogICAgICAvLyAtLS0tLSBSZXR1cm4NCiAgICAgIHJldHVybiBQY2xaaXA6OmVycm9yQ29kZSgpOw0KCSAgfQ0KICAgIH0NCg0KICAgIC8vIC0tLS0tIEdldCBjb21tZW50DQogICAgaWYgKCR2X2RhdGFbJ2NvbW1lbnRfc2l6ZSddICE9IDApIHsNCiAgICAgICRwX2NlbnRyYWxfZGlyWydjb21tZW50J10gPSBmcmVhZCgkdGhpcy0+emlwX2ZkLCAkdl9kYXRhWydjb21tZW50X3NpemUnXSk7DQogICAgfQ0KICAgIGVsc2UNCiAgICAgICRwX2NlbnRyYWxfZGlyWydjb21tZW50J10gPSAnJzsNCg0KICAgICRwX2NlbnRyYWxfZGlyWydlbnRyaWVzJ10gPSAkdl9kYXRhWydlbnRyaWVzJ107DQogICAgJHBfY2VudHJhbF9kaXJbJ2Rpc2tfZW50cmllcyddID0gJHZfZGF0YVsnZGlza19lbnRyaWVzJ107DQogICAgJHBfY2VudHJhbF9kaXJbJ29mZnNldCddID0gJHZfZGF0YVsnb2Zmc2V0J107DQogICAgJHBfY2VudHJhbF9kaXJbJ3NpemUnXSA9ICR2X2RhdGFbJ3NpemUnXTsNCiAgICAkcF9jZW50cmFsX2RpclsnZGlzayddID0gJHZfZGF0YVsnZGlzayddOw0KICAgICRwX2NlbnRyYWxfZGlyWydkaXNrX3N0YXJ0J10gPSAkdl9kYXRhWydkaXNrX3N0YXJ0J107DQoNCiAgICAvLyBUQkMNCiAgICAvL2ZvcihyZXNldCgkcF9jZW50cmFsX2Rpcik7ICRrZXkgPSBrZXkoJHBfY2VudHJhbF9kaXIpOyBuZXh0KCRwX2NlbnRyYWxfZGlyKSkgew0KICAgIC8vfQ0KDQogICAgLy8gLS0tLS0gUmV0dXJuDQogICAgcmV0dXJuICR2X3Jlc3VsdDsNCiAgfQ0KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogIC8vIEZ1bmN0aW9uIDogcHJpdkRlbGV0ZUJ5UnVsZSgpDQogIC8vIERlc2NyaXB0aW9uIDoNCiAgLy8gUGFyYW1ldGVycyA6DQogIC8vIFJldHVybiBWYWx1ZXMgOg0KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICBmdW5jdGlvbiBwcml2RGVsZXRlQnlSdWxlKCYkcF9yZXN1bHRfbGlzdCwgJiRwX29wdGlvbnMpDQogIHsNCiAgICAkdl9yZXN1bHQ9MTsNCiAgICAkdl9saXN0X2RldGFpbCA9IGFycmF5KCk7DQoNCiAgICAvLyAtLS0tLSBPcGVuIHRoZSB6aXAgZmlsZQ0KICAgIGlmICgoJHZfcmVzdWx0PSR0aGlzLT5wcml2T3BlbkZkKCdyYicpKSAhPSAxKQ0KICAgIHsNCiAgICAgIC8vIC0tLS0tIFJldHVybg0KICAgICAgcmV0dXJuICR2X3Jlc3VsdDsNCiAgICB9DQoNCiAgICAvLyAtLS0tLSBSZWFkIHRoZSBjZW50cmFsIGRpcmVjdG9yeSBpbmZvcm1hdGlvbnMNCiAgICAkdl9jZW50cmFsX2RpciA9IGFycmF5KCk7DQogICAgaWYgKCgkdl9yZXN1bHQgPSAkdGhpcy0+cHJpdlJlYWRFbmRDZW50cmFsRGlyKCR2X2NlbnRyYWxfZGlyKSkgIT0gMSkNCiAgICB7DQogICAgICAkdGhpcy0+cHJpdkNsb3NlRmQoKTsNCiAgICAgIHJldHVybiAkdl9yZXN1bHQ7DQogICAgfQ0KDQogICAgLy8gLS0tLS0gR28gdG8gYmVnaW5uaW5nIG9mIEZpbGUNCiAgICBAcmV3aW5kKCR0aGlzLT56aXBfZmQpOw0KDQogICAgLy8gLS0tLS0gU2NhbiBhbGwgdGhlIGZpbGVzDQogICAgLy8gLS0tLS0gU3RhcnQgYXQgYmVnaW5uaW5nIG9mIENlbnRyYWwgRGlyDQogICAgJHZfcG9zX2VudHJ5ID0gJHZfY2VudHJhbF9kaXJbJ29mZnNldCddOw0KICAgIEByZXdpbmQoJHRoaXMtPnppcF9mZCk7DQogICAgaWYgKEBmc2VlaygkdGhpcy0+emlwX2ZkLCAkdl9wb3NfZW50cnkpKQ0KICAgIHsNCiAgICAgIC8vIC0tLS0tIENsb3NlIHRoZSB6aXAgZmlsZQ0KICAgICAgJHRoaXMtPnByaXZDbG9zZUZkKCk7DQoNCiAgICAgIC8vIC0tLS0tIEVycm9yIGxvZw0KICAgICAgUGNsWmlwOjpwcml2RXJyb3JMb2coUENMWklQX0VSUl9JTlZBTElEX0FSQ0hJVkVfWklQLCAnSW52YWxpZCBhcmNoaXZlIHNpemUnKTsNCg0KICAgICAgLy8gLS0tLS0gUmV0dXJuDQogICAgICByZXR1cm4gUGNsWmlwOjplcnJvckNvZGUoKTsNCiAgICB9DQoNCiAgICAvLyAtLS0tLSBSZWFkIGVhY2ggZW50cnkNCiAgICAkdl9oZWFkZXJfbGlzdCA9IGFycmF5KCk7DQogICAgJGpfc3RhcnQgPSAwOw0KICAgIGZvciAoJGk9MCwgJHZfbmJfZXh0cmFjdGVkPTA7ICRpPCR2X2NlbnRyYWxfZGlyWydlbnRyaWVzJ107ICRpKyspDQogICAgew0KDQogICAgICAvLyAtLS0tLSBSZWFkIHRoZSBmaWxlIGhlYWRlcg0KICAgICAgJHZfaGVhZGVyX2xpc3RbJHZfbmJfZXh0cmFjdGVkXSA9IGFycmF5KCk7DQogICAgICBpZiAoKCR2X3Jlc3VsdCA9ICR0aGlzLT5wcml2UmVhZENlbnRyYWxGaWxlSGVhZGVyKCR2X2hlYWRlcl9saXN0WyR2X25iX2V4dHJhY3RlZF0pKSAhPSAxKQ0KICAgICAgew0KICAgICAgICAvLyAtLS0tLSBDbG9zZSB0aGUgemlwIGZpbGUNCiAgICAgICAgJHRoaXMtPnByaXZDbG9zZUZkKCk7DQoNCiAgICAgICAgcmV0dXJuICR2X3Jlc3VsdDsNCiAgICAgIH0NCg0KDQogICAgICAvLyAtLS0tLSBTdG9yZSB0aGUgaW5kZXgNCiAgICAgICR2X2hlYWRlcl9saXN0WyR2X25iX2V4dHJhY3RlZF1bJ2luZGV4J10gPSAkaTsNCg0KICAgICAgLy8gLS0tLS0gTG9vayBmb3IgdGhlIHNwZWNpZmljIGV4dHJhY3QgcnVsZXMNCiAgICAgICR2X2ZvdW5kID0gZmFsc2U7DQoNCiAgICAgIC8vIC0tLS0tIExvb2sgZm9yIGV4dHJhY3QgYnkgbmFtZSBydWxlDQogICAgICBpZiAoICAgKGlzc2V0KCRwX29wdGlvbnNbUENMWklQX09QVF9CWV9OQU1FXSkpDQogICAgICAgICAgJiYgKCRwX29wdGlvbnNbUENMWklQX09QVF9CWV9OQU1FXSAhPSAwKSkgew0KDQogICAgICAgICAgLy8gLS0tLS0gTG9vayBpZiB0aGUgZmlsZW5hbWUgaXMgaW4gdGhlIGxpc3QNCiAgICAgICAgICBmb3IgKCRqPTA7ICgkajxzaXplb2YoJHBfb3B0aW9uc1tQQ0xaSVBfT1BUX0JZX05BTUVdKSkgJiYgKCEkdl9mb3VuZCk7ICRqKyspIHsNCg0KICAgICAgICAgICAgICAvLyAtLS0tLSBMb29rIGZvciBhIGRpcmVjdG9yeQ0KICAgICAgICAgICAgICBpZiAoc3Vic3RyKCRwX29wdGlvbnNbUENMWklQX09QVF9CWV9OQU1FXVskal0sIC0xKSA9PSAiLyIpIHsNCg0KICAgICAgICAgICAgICAgICAgLy8gLS0tLS0gTG9vayBpZiB0aGUgZGlyZWN0b3J5IGlzIGluIHRoZSBmaWxlbmFtZSBwYXRoDQogICAgICAgICAgICAgICAgICBpZiAoICAgKHN0cmxlbigkdl9oZWFkZXJfbGlzdFskdl9uYl9leHRyYWN0ZWRdWydzdG9yZWRfZmlsZW5hbWUnXSkgPiBzdHJsZW4oJHBfb3B0aW9uc1tQQ0xaSVBfT1BUX0JZX05BTUVdWyRqXSkpDQogICAgICAgICAgICAgICAgICAgICAgJiYgKHN1YnN0cigkdl9oZWFkZXJfbGlzdFskdl9uYl9leHRyYWN0ZWRdWydzdG9yZWRfZmlsZW5hbWUnXSwgMCwgc3RybGVuKCRwX29wdGlvbnNbUENMWklQX09QVF9CWV9OQU1FXVskal0pKSA9PSAkcF9vcHRpb25zW1BDTFpJUF9PUFRfQllfTkFNRV1bJGpdKSkgew0KICAgICAgICAgICAgICAgICAgICAgICR2X2ZvdW5kID0gdHJ1ZTsNCiAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgIGVsc2VpZiAoICAgKCgkdl9oZWFkZXJfbGlzdFskdl9uYl9leHRyYWN0ZWRdWydleHRlcm5hbCddJjB4MDAwMDAwMTApPT0weDAwMDAwMDEwKSAvKiBJbmRpY2F0ZXMgYSBmb2xkZXIgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgKCR2X2hlYWRlcl9saXN0WyR2X25iX2V4dHJhY3RlZF1bJ3N0b3JlZF9maWxlbmFtZSddLicvJyA9PSAkcF9vcHRpb25zW1BDTFpJUF9PUFRfQllfTkFNRV1bJGpdKSkgew0KICAgICAgICAgICAgICAgICAgICAgICR2X2ZvdW5kID0gdHJ1ZTsNCiAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAvLyAtLS0tLSBMb29rIGZvciBhIGZpbGVuYW1lDQogICAgICAgICAgICAgIGVsc2VpZiAoJHZfaGVhZGVyX2xpc3RbJHZfbmJfZXh0cmFjdGVkXVsnc3RvcmVkX2ZpbGVuYW1lJ10gPT0gJHBfb3B0aW9uc1tQQ0xaSVBfT1BUX0JZX05BTUVdWyRqXSkgew0KICAgICAgICAgICAgICAgICAgJHZfZm91bmQgPSB0cnVlOw0KICAgICAgICAgICAgICB9DQogICAgICAgICAgfQ0KICAgICAgfQ0KDQogICAgICAvLyAtLS0tLSBMb29rIGZvciBleHRyYWN0IGJ5IGVyZWcgcnVsZQ0KICAgICAgLy8gZXJlZygpIGlzIGRlcHJlY2F0ZWQgd2l0aCBQSFAgNS4zDQogICAgICAvKg0KICAgICAgZWxzZSBpZiAoICAgKGlzc2V0KCRwX29wdGlvbnNbUENMWklQX09QVF9CWV9FUkVHXSkpDQogICAgICAgICAgICAgICAmJiAoJHBfb3B0aW9uc1tQQ0xaSVBfT1BUX0JZX0VSRUddICE9ICIiKSkgew0KDQogICAgICAgICAgaWYgKGVyZWcoJHBfb3B0aW9uc1tQQ0xaSVBfT1BUX0JZX0VSRUddLCAkdl9oZWFkZXJfbGlzdFskdl9uYl9leHRyYWN0ZWRdWydzdG9yZWRfZmlsZW5hbWUnXSkpIHsNCiAgICAgICAgICAgICAgJHZfZm91bmQgPSB0cnVlOw0KICAgICAgICAgIH0NCiAgICAgIH0NCiAgICAgICovDQoNCiAgICAgIC8vIC0tLS0tIExvb2sgZm9yIGV4dHJhY3QgYnkgcHJlZyBydWxlDQogICAgICBlbHNlIGlmICggICAoaXNzZXQoJHBfb3B0aW9uc1tQQ0xaSVBfT1BUX0JZX1BSRUddKSkNCiAgICAgICAgICAgICAgICYmICgkcF9vcHRpb25zW1BDTFpJUF9PUFRfQllfUFJFR10gIT0gIiIpKSB7DQoNCiAgICAgICAgICBpZiAocHJlZ19tYXRjaCgkcF9vcHRpb25zW1BDTFpJUF9PUFRfQllfUFJFR10sICR2X2hlYWRlcl9saXN0WyR2X25iX2V4dHJhY3RlZF1bJ3N0b3JlZF9maWxlbmFtZSddKSkgew0KICAgICAgICAgICAgICAkdl9mb3VuZCA9IHRydWU7DQogICAgICAgICAgfQ0KICAgICAgfQ0KDQogICAgICAvLyAtLS0tLSBMb29rIGZvciBleHRyYWN0IGJ5IGluZGV4IHJ1bGUNCiAgICAgIGVsc2UgaWYgKCAgIChpc3NldCgkcF9vcHRpb25zW1BDTFpJUF9PUFRfQllfSU5ERVhdKSkNCiAgICAgICAgICAgICAgICYmICgkcF9vcHRpb25zW1BDTFpJUF9PUFRfQllfSU5ERVhdICE9IDApKSB7DQoNCiAgICAgICAgICAvLyAtLS0tLSBMb29rIGlmIHRoZSBpbmRleCBpcyBpbiB0aGUgbGlzdA0KICAgICAgICAgIGZvciAoJGo9JGpfc3RhcnQ7ICgkajxzaXplb2YoJHBfb3B0aW9uc1tQQ0xaSVBfT1BUX0JZX0lOREVYXSkpICYmICghJHZfZm91bmQpOyAkaisrKSB7DQoNCiAgICAgICAgICAgICAgaWYgKCgkaT49JHBfb3B0aW9uc1tQQ0xaSVBfT1BUX0JZX0lOREVYXVskal1bJ3N0YXJ0J10pICYmICgkaTw9JHBfb3B0aW9uc1tQQ0xaSVBfT1BUX0JZX0lOREVYXVskal1bJ2VuZCddKSkgew0KICAgICAgICAgICAgICAgICAgJHZfZm91bmQgPSB0cnVlOw0KICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgIGlmICgkaT49JHBfb3B0aW9uc1tQQ0xaSVBfT1BUX0JZX0lOREVYXVskal1bJ2VuZCddKSB7DQogICAgICAgICAgICAgICAgICAkal9zdGFydCA9ICRqKzE7DQogICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICBpZiAoJHBfb3B0aW9uc1tQQ0xaSVBfT1BUX0JZX0lOREVYXVskal1bJ3N0YXJ0J10+JGkpIHsNCiAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICB9DQogICAgICAgICAgfQ0KICAgICAgfQ0KICAgICAgZWxzZSB7DQogICAgICAJJHZfZm91bmQgPSB0cnVlOw0KICAgICAgfQ0KDQogICAgICAvLyAtLS0tLSBMb29rIGZvciBkZWxldGlvbg0KICAgICAgaWYgKCR2X2ZvdW5kKQ0KICAgICAgew0KICAgICAgICB1bnNldCgkdl9oZWFkZXJfbGlzdFskdl9uYl9leHRyYWN0ZWRdKTsNCiAgICAgIH0NCiAgICAgIGVsc2UNCiAgICAgIHsNCiAgICAgICAgJHZfbmJfZXh0cmFjdGVkKys7DQogICAgICB9DQogICAgfQ0KDQogICAgLy8gLS0tLS0gTG9vayBpZiBzb21ldGhpbmcgbmVlZCB0byBiZSBkZWxldGVkDQogICAgaWYgKCR2X25iX2V4dHJhY3RlZCA+IDApIHsNCg0KICAgICAgICAvLyAtLS0tLSBDcmVhdGVzIGEgdGVtcG9yYXkgZmlsZQ0KICAgICAgICAkdl96aXBfdGVtcF9uYW1lID0gUENMWklQX1RFTVBPUkFSWV9ESVIudW5pcWlkKCdwY2x6aXAtJykuJy50bXAnOw0KDQogICAgICAgIC8vIC0tLS0tIENyZWF0ZXMgYSB0ZW1wb3JhcnkgemlwIGFyY2hpdmUNCiAgICAgICAgJHZfdGVtcF96aXAgPSBuZXcgUGNsWmlwKCR2X3ppcF90ZW1wX25hbWUpOw0KDQogICAgICAgIC8vIC0tLS0tIE9wZW4gdGhlIHRlbXBvcmFyeSB6aXAgZmlsZSBpbiB3cml0ZSBtb2RlDQogICAgICAgIGlmICgoJHZfcmVzdWx0ID0gJHZfdGVtcF96aXAtPnByaXZPcGVuRmQoJ3diJykpICE9IDEpIHsNCiAgICAgICAgICAgICR0aGlzLT5wcml2Q2xvc2VGZCgpOw0KDQogICAgICAgICAgICAvLyAtLS0tLSBSZXR1cm4NCiAgICAgICAgICAgIHJldHVybiAkdl9yZXN1bHQ7DQogICAgICAgIH0NCg0KICAgICAgICAvLyAtLS0tLSBMb29rIHdoaWNoIGZpbGUgbmVlZCB0byBiZSBrZXB0DQogICAgICAgIGZvciAoJGk9MDsgJGk8c2l6ZW9mKCR2X2hlYWRlcl9saXN0KTsgJGkrKykgew0KDQogICAgICAgICAgICAvLyAtLS0tLSBDYWxjdWxhdGUgdGhlIHBvc2l0aW9uIG9mIHRoZSBoZWFkZXINCiAgICAgICAgICAgIEByZXdpbmQoJHRoaXMtPnppcF9mZCk7DQogICAgICAgICAgICBpZiAoQGZzZWVrKCR0aGlzLT56aXBfZmQsICAkdl9oZWFkZXJfbGlzdFskaV1bJ29mZnNldCddKSkgew0KICAgICAgICAgICAgICAgIC8vIC0tLS0tIENsb3NlIHRoZSB6aXAgZmlsZQ0KICAgICAgICAgICAgICAgICR0aGlzLT5wcml2Q2xvc2VGZCgpOw0KICAgICAgICAgICAgICAgICR2X3RlbXBfemlwLT5wcml2Q2xvc2VGZCgpOw0KICAgICAgICAgICAgICAgIEB1bmxpbmsoJHZfemlwX3RlbXBfbmFtZSk7DQoNCiAgICAgICAgICAgICAgICAvLyAtLS0tLSBFcnJvciBsb2cNCiAgICAgICAgICAgICAgICBQY2xaaXA6OnByaXZFcnJvckxvZyhQQ0xaSVBfRVJSX0lOVkFMSURfQVJDSElWRV9aSVAsICdJbnZhbGlkIGFyY2hpdmUgc2l6ZScpOw0KDQogICAgICAgICAgICAgICAgLy8gLS0tLS0gUmV0dXJuDQogICAgICAgICAgICAgICAgcmV0dXJuIFBjbFppcDo6ZXJyb3JDb2RlKCk7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIC8vIC0tLS0tIFJlYWQgdGhlIGZpbGUgaGVhZGVyDQogICAgICAgICAgICAkdl9sb2NhbF9oZWFkZXIgPSBhcnJheSgpOw0KICAgICAgICAgICAgaWYgKCgkdl9yZXN1bHQgPSAkdGhpcy0+cHJpdlJlYWRGaWxlSGVhZGVyKCR2X2xvY2FsX2hlYWRlcikpICE9IDEpIHsNCiAgICAgICAgICAgICAgICAvLyAtLS0tLSBDbG9zZSB0aGUgemlwIGZpbGUNCiAgICAgICAgICAgICAgICAkdGhpcy0+cHJpdkNsb3NlRmQoKTsNCiAgICAgICAgICAgICAgICAkdl90ZW1wX3ppcC0+cHJpdkNsb3NlRmQoKTsNCiAgICAgICAgICAgICAgICBAdW5saW5rKCR2X3ppcF90ZW1wX25hbWUpOw0KDQogICAgICAgICAgICAgICAgLy8gLS0tLS0gUmV0dXJuDQogICAgICAgICAgICAgICAgcmV0dXJuICR2X3Jlc3VsdDsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIA0KICAgICAgICAgICAgLy8gLS0tLS0gQ2hlY2sgdGhhdCBsb2NhbCBmaWxlIGhlYWRlciBpcyBzYW1lIGFzIGNlbnRyYWwgZmlsZSBoZWFkZXINCiAgICAgICAgICAgIGlmICgkdGhpcy0+cHJpdkNoZWNrRmlsZUhlYWRlcnMoJHZfbG9jYWxfaGVhZGVyLA0KCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdl9oZWFkZXJfbGlzdFskaV0pICE9IDEpIHsNCiAgICAgICAgICAgICAgICAvLyBUQkMNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHVuc2V0KCR2X2xvY2FsX2hlYWRlcik7DQoNCiAgICAgICAgICAgIC8vIC0tLS0tIFdyaXRlIHRoZSBmaWxlIGhlYWRlcg0KICAgICAgICAgICAgaWYgKCgkdl9yZXN1bHQgPSAkdl90ZW1wX3ppcC0+cHJpdldyaXRlRmlsZUhlYWRlcigkdl9oZWFkZXJfbGlzdFskaV0pKSAhPSAxKSB7DQogICAgICAgICAgICAgICAgLy8gLS0tLS0gQ2xvc2UgdGhlIHppcCBmaWxlDQogICAgICAgICAgICAgICAgJHRoaXMtPnByaXZDbG9zZUZkKCk7DQogICAgICAgICAgICAgICAgJHZfdGVtcF96aXAtPnByaXZDbG9zZUZkKCk7DQogICAgICAgICAgICAgICAgQHVubGluaygkdl96aXBfdGVtcF9uYW1lKTsNCg0KICAgICAgICAgICAgICAgIC8vIC0tLS0tIFJldHVybg0KICAgICAgICAgICAgICAgIHJldHVybiAkdl9yZXN1bHQ7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIC8vIC0tLS0tIFJlYWQvd3JpdGUgdGhlIGRhdGEgYmxvY2sNCiAgICAgICAgICAgIGlmICgoJHZfcmVzdWx0ID0gUGNsWmlwVXRpbENvcHlCbG9jaygkdGhpcy0+emlwX2ZkLCAkdl90ZW1wX3ppcC0+emlwX2ZkLCAkdl9oZWFkZXJfbGlzdFskaV1bJ2NvbXByZXNzZWRfc2l6ZSddKSkgIT0gMSkgew0KICAgICAgICAgICAgICAgIC8vIC0tLS0tIENsb3NlIHRoZSB6aXAgZmlsZQ0KICAgICAgICAgICAgICAgICR0aGlzLT5wcml2Q2xvc2VGZCgpOw0KICAgICAgICAgICAgICAgICR2X3RlbXBfemlwLT5wcml2Q2xvc2VGZCgpOw0KICAgICAgICAgICAgICAgIEB1bmxpbmsoJHZfemlwX3RlbXBfbmFtZSk7DQoNCiAgICAgICAgICAgICAgICAvLyAtLS0tLSBSZXR1cm4NCiAgICAgICAgICAgICAgICByZXR1cm4gJHZfcmVzdWx0Ow0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgLy8gLS0tLS0gU3RvcmUgdGhlIG9mZnNldCBvZiB0aGUgY2VudHJhbCBkaXINCiAgICAgICAgJHZfb2Zmc2V0ID0gQGZ0ZWxsKCR2X3RlbXBfemlwLT56aXBfZmQpOw0KDQogICAgICAgIC8vIC0tLS0tIFJlLUNyZWF0ZSB0aGUgQ2VudHJhbCBEaXIgZmlsZXMgaGVhZGVyDQogICAgICAgIGZvciAoJGk9MDsgJGk8c2l6ZW9mKCR2X2hlYWRlcl9saXN0KTsgJGkrKykgew0KICAgICAgICAgICAgLy8gLS0tLS0gQ3JlYXRlIHRoZSBmaWxlIGhlYWRlcg0KICAgICAgICAgICAgaWYgKCgkdl9yZXN1bHQgPSAkdl90ZW1wX3ppcC0+cHJpdldyaXRlQ2VudHJhbEZpbGVIZWFkZXIoJHZfaGVhZGVyX2xpc3RbJGldKSkgIT0gMSkgew0KICAgICAgICAgICAgICAgICR2X3RlbXBfemlwLT5wcml2Q2xvc2VGZCgpOw0KICAgICAgICAgICAgICAgICR0aGlzLT5wcml2Q2xvc2VGZCgpOw0KICAgICAgICAgICAgICAgIEB1bmxpbmsoJHZfemlwX3RlbXBfbmFtZSk7DQoNCiAgICAgICAgICAgICAgICAvLyAtLS0tLSBSZXR1cm4NCiAgICAgICAgICAgICAgICByZXR1cm4gJHZfcmVzdWx0Ow0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAvLyAtLS0tLSBUcmFuc2Zvcm0gdGhlIGhlYWRlciB0byBhICd1c2FibGUnIGluZm8NCiAgICAgICAgICAgICR2X3RlbXBfemlwLT5wcml2Q29udmVydEhlYWRlcjJGaWxlSW5mbygkdl9oZWFkZXJfbGlzdFskaV0sICRwX3Jlc3VsdF9saXN0WyRpXSk7DQogICAgICAgIH0NCg0KDQogICAgICAgIC8vIC0tLS0tIFppcCBmaWxlIGNvbW1lbnQNCiAgICAgICAgJHZfY29tbWVudCA9ICcnOw0KICAgICAgICBpZiAoaXNzZXQoJHBfb3B0aW9uc1tQQ0xaSVBfT1BUX0NPTU1FTlRdKSkgew0KICAgICAgICAgICR2X2NvbW1lbnQgPSAkcF9vcHRpb25zW1BDTFpJUF9PUFRfQ09NTUVOVF07DQogICAgICAgIH0NCg0KICAgICAgICAvLyAtLS0tLSBDYWxjdWxhdGUgdGhlIHNpemUgb2YgdGhlIGNlbnRyYWwgaGVhZGVyDQogICAgICAgICR2X3NpemUgPSBAZnRlbGwoJHZfdGVtcF96aXAtPnppcF9mZCktJHZfb2Zmc2V0Ow0KDQogICAgICAgIC8vIC0tLS0tIENyZWF0ZSB0aGUgY2VudHJhbCBkaXIgZm9vdGVyDQogICAgICAgIGlmICgoJHZfcmVzdWx0ID0gJHZfdGVtcF96aXAtPnByaXZXcml0ZUNlbnRyYWxIZWFkZXIoc2l6ZW9mKCR2X2hlYWRlcl9saXN0KSwgJHZfc2l6ZSwgJHZfb2Zmc2V0LCAkdl9jb21tZW50KSkgIT0gMSkgew0KICAgICAgICAgICAgLy8gLS0tLS0gUmVzZXQgdGhlIGZpbGUgbGlzdA0KICAgICAgICAgICAgdW5zZXQoJHZfaGVhZGVyX2xpc3QpOw0KICAgICAgICAgICAgJHZfdGVtcF96aXAtPnByaXZDbG9zZUZkKCk7DQogICAgICAgICAgICAkdGhpcy0+cHJpdkNsb3NlRmQoKTsNCiAgICAgICAgICAgIEB1bmxpbmsoJHZfemlwX3RlbXBfbmFtZSk7DQoNCiAgICAgICAgICAgIC8vIC0tLS0tIFJldHVybg0KICAgICAgICAgICAgcmV0dXJuICR2X3Jlc3VsdDsNCiAgICAgICAgfQ0KDQogICAgICAgIC8vIC0tLS0tIENsb3NlDQogICAgICAgICR2X3RlbXBfemlwLT5wcml2Q2xvc2VGZCgpOw0KICAgICAgICAkdGhpcy0+cHJpdkNsb3NlRmQoKTsNCg0KICAgICAgICAvLyAtLS0tLSBEZWxldGUgdGhlIHppcCBmaWxlDQogICAgICAgIC8vIFRCQyA6IEkgc2hvdWxkIHRlc3QgdGhlIHJlc3VsdCAuLi4NCiAgICAgICAgQHVubGluaygkdGhpcy0+emlwbmFtZSk7DQoNCiAgICAgICAgLy8gLS0tLS0gUmVuYW1lIHRoZSB0ZW1wb3JhcnkgZmlsZQ0KICAgICAgICAvLyBUQkMgOiBJIHNob3VsZCB0ZXN0IHRoZSByZXN1bHQgLi4uDQogICAgICAgIC8vQHJlbmFtZSgkdl96aXBfdGVtcF9uYW1lLCAkdGhpcy0+emlwbmFtZSk7DQogICAgICAgIFBjbFppcFV0aWxSZW5hbWUoJHZfemlwX3RlbXBfbmFtZSwgJHRoaXMtPnppcG5hbWUpOw0KICAgIA0KICAgICAgICAvLyAtLS0tLSBEZXN0cm95IHRoZSB0ZW1wb3JhcnkgYXJjaGl2ZQ0KICAgICAgICB1bnNldCgkdl90ZW1wX3ppcCk7DQogICAgfQ0KICAgIA0KICAgIC8vIC0tLS0tIFJlbW92ZSBldmVyeSBmaWxlcyA6IHJlc2V0IHRoZSBmaWxlDQogICAgZWxzZSBpZiAoJHZfY2VudHJhbF9kaXJbJ2VudHJpZXMnXSAhPSAwKSB7DQogICAgICAgICR0aGlzLT5wcml2Q2xvc2VGZCgpOw0KDQogICAgICAgIGlmICgoJHZfcmVzdWx0ID0gJHRoaXMtPnByaXZPcGVuRmQoJ3diJykpICE9IDEpIHsNCiAgICAgICAgICByZXR1cm4gJHZfcmVzdWx0Ow0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKCgkdl9yZXN1bHQgPSAkdGhpcy0+cHJpdldyaXRlQ2VudHJhbEhlYWRlcigwLCAwLCAwLCAnJykpICE9IDEpIHsNCiAgICAgICAgICByZXR1cm4gJHZfcmVzdWx0Ow0KICAgICAgICB9DQoNCiAgICAgICAgJHRoaXMtPnByaXZDbG9zZUZkKCk7DQogICAgfQ0KDQogICAgLy8gLS0tLS0gUmV0dXJuDQogICAgcmV0dXJuICR2X3Jlc3VsdDsNCiAgfQ0KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogIC8vIEZ1bmN0aW9uIDogcHJpdkRpckNoZWNrKCkNCiAgLy8gRGVzY3JpcHRpb24gOg0KICAvLyAgIENoZWNrIGlmIGEgZGlyZWN0b3J5IGV4aXN0cywgaWYgbm90IGl0IGNyZWF0ZXMgaXQgYW5kIGFsbCB0aGUgcGFyZW50cyBkaXJlY3RvcnkNCiAgLy8gICB3aGljaCBtYXkgYmUgdXNlZnVsLg0KICAvLyBQYXJhbWV0ZXJzIDoNCiAgLy8gICAkcF9kaXIgOiBEaXJlY3RvcnkgcGF0aCB0byBjaGVjay4NCiAgLy8gUmV0dXJuIFZhbHVlcyA6DQogIC8vICAgIDEgOiBPSw0KICAvLyAgIC0xIDogVW5hYmxlIHRvIGNyZWF0ZSBkaXJlY3RvcnkNCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAgZnVuY3Rpb24gcHJpdkRpckNoZWNrKCRwX2RpciwgJHBfaXNfZGlyPWZhbHNlKQ0KICB7DQogICAgJHZfcmVzdWx0ID0gMTsNCg0KDQogICAgLy8gLS0tLS0gUmVtb3ZlIHRoZSBmaW5hbCAnLycNCiAgICBpZiAoKCRwX2lzX2RpcikgJiYgKHN1YnN0cigkcF9kaXIsIC0xKT09Jy8nKSkNCiAgICB7DQogICAgICAkcF9kaXIgPSBzdWJzdHIoJHBfZGlyLCAwLCBzdHJsZW4oJHBfZGlyKS0xKTsNCiAgICB9DQoNCiAgICAvLyAtLS0tLSBDaGVjayB0aGUgZGlyZWN0b3J5IGF2YWlsYWJpbGl0eQ0KICAgIGlmICgoaXNfZGlyKCRwX2RpcikpIHx8ICgkcF9kaXIgPT0gIiIpKQ0KICAgIHsNCiAgICAgIHJldHVybiAxOw0KICAgIH0NCg0KICAgIC8vIC0tLS0tIEV4dHJhY3QgcGFyZW50IGRpcmVjdG9yeQ0KICAgICRwX3BhcmVudF9kaXIgPSBkaXJuYW1lKCRwX2Rpcik7DQoNCiAgICAvLyAtLS0tLSBKdXN0IGEgY2hlY2sNCiAgICBpZiAoJHBfcGFyZW50X2RpciAhPSAkcF9kaXIpDQogICAgew0KICAgICAgLy8gLS0tLS0gTG9vayBmb3IgcGFyZW50IGRpcmVjdG9yeQ0KICAgICAgaWYgKCRwX3BhcmVudF9kaXIgIT0gIiIpDQogICAgICB7DQogICAgICAgIGlmICgoJHZfcmVzdWx0ID0gJHRoaXMtPnByaXZEaXJDaGVjaygkcF9wYXJlbnRfZGlyKSkgIT0gMSkNCiAgICAgICAgew0KICAgICAgICAgIHJldHVybiAkdl9yZXN1bHQ7DQogICAgICAgIH0NCiAgICAgIH0NCiAgICB9DQoNCiAgICAvLyAtLS0tLSBDcmVhdGUgdGhlIGRpcmVjdG9yeQ0KICAgIGlmICghQG1rZGlyKCRwX2RpciwgMDc3NykpDQogICAgew0KICAgICAgLy8gLS0tLS0gRXJyb3IgbG9nDQogICAgICBQY2xaaXA6OnByaXZFcnJvckxvZyhQQ0xaSVBfRVJSX0RJUl9DUkVBVEVfRkFJTCwgIlVuYWJsZSB0byBjcmVhdGUgZGlyZWN0b3J5ICckcF9kaXInIik7DQoNCiAgICAgIC8vIC0tLS0tIFJldHVybg0KICAgICAgcmV0dXJuIFBjbFppcDo6ZXJyb3JDb2RlKCk7DQogICAgfQ0KDQogICAgLy8gLS0tLS0gUmV0dXJuDQogICAgcmV0dXJuICR2X3Jlc3VsdDsNCiAgfQ0KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogIC8vIEZ1bmN0aW9uIDogcHJpdk1lcmdlKCkNCiAgLy8gRGVzY3JpcHRpb24gOg0KICAvLyAgIElmICRwX2FyY2hpdmVfdG9fYWRkIGRvZXMgbm90IGV4aXN0LCB0aGUgZnVuY3Rpb24gZXhpdCB3aXRoIGEgc3VjY2VzcyByZXN1bHQuDQogIC8vIFBhcmFtZXRlcnMgOg0KICAvLyBSZXR1cm4gVmFsdWVzIDoNCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAgZnVuY3Rpb24gcHJpdk1lcmdlKCYkcF9hcmNoaXZlX3RvX2FkZCkNCiAgew0KICAgICR2X3Jlc3VsdD0xOw0KDQogICAgLy8gLS0tLS0gTG9vayBpZiB0aGUgYXJjaGl2ZV90b19hZGQgZXhpc3RzDQogICAgaWYgKCFpc19maWxlKCRwX2FyY2hpdmVfdG9fYWRkLT56aXBuYW1lKSkNCiAgICB7DQoNCiAgICAgIC8vIC0tLS0tIE5vdGhpbmcgdG8gbWVyZ2UsIHNvIG1lcmdlIGlzIGEgc3VjY2Vzcw0KICAgICAgJHZfcmVzdWx0ID0gMTsNCg0KICAgICAgLy8gLS0tLS0gUmV0dXJuDQogICAgICByZXR1cm4gJHZfcmVzdWx0Ow0KICAgIH0NCg0KICAgIC8vIC0tLS0tIExvb2sgaWYgdGhlIGFyY2hpdmUgZXhpc3RzDQogICAgaWYgKCFpc19maWxlKCR0aGlzLT56aXBuYW1lKSkNCiAgICB7DQoNCiAgICAgIC8vIC0tLS0tIERvIGEgZHVwbGljYXRlDQogICAgICAkdl9yZXN1bHQgPSAkdGhpcy0+cHJpdkR1cGxpY2F0ZSgkcF9hcmNoaXZlX3RvX2FkZC0+emlwbmFtZSk7DQoNCiAgICAgIC8vIC0tLS0tIFJldHVybg0KICAgICAgcmV0dXJuICR2X3Jlc3VsdDsNCiAgICB9DQoNCiAgICAvLyAtLS0tLSBPcGVuIHRoZSB6aXAgZmlsZQ0KICAgIGlmICgoJHZfcmVzdWx0PSR0aGlzLT5wcml2T3BlbkZkKCdyYicpKSAhPSAxKQ0KICAgIHsNCiAgICAgIC8vIC0tLS0tIFJldHVybg0KICAgICAgcmV0dXJuICR2X3Jlc3VsdDsNCiAgICB9DQoNCiAgICAvLyAtLS0tLSBSZWFkIHRoZSBjZW50cmFsIGRpcmVjdG9yeSBpbmZvcm1hdGlvbnMNCiAgICAkdl9jZW50cmFsX2RpciA9IGFycmF5KCk7DQogICAgaWYgKCgkdl9yZXN1bHQgPSAkdGhpcy0+cHJpdlJlYWRFbmRDZW50cmFsRGlyKCR2X2NlbnRyYWxfZGlyKSkgIT0gMSkNCiAgICB7DQogICAgICAkdGhpcy0+cHJpdkNsb3NlRmQoKTsNCiAgICAgIHJldHVybiAkdl9yZXN1bHQ7DQogICAgfQ0KDQogICAgLy8gLS0tLS0gR28gdG8gYmVnaW5uaW5nIG9mIEZpbGUNCiAgICBAcmV3aW5kKCR0aGlzLT56aXBfZmQpOw0KDQogICAgLy8gLS0tLS0gT3BlbiB0aGUgYXJjaGl2ZV90b19hZGQgZmlsZQ0KICAgIGlmICgoJHZfcmVzdWx0PSRwX2FyY2hpdmVfdG9fYWRkLT5wcml2T3BlbkZkKCdyYicpKSAhPSAxKQ0KICAgIHsNCiAgICAgICR0aGlzLT5wcml2Q2xvc2VGZCgpOw0KDQogICAgICAvLyAtLS0tLSBSZXR1cm4NCiAgICAgIHJldHVybiAkdl9yZXN1bHQ7DQogICAgfQ0KDQogICAgLy8gLS0tLS0gUmVhZCB0aGUgY2VudHJhbCBkaXJlY3RvcnkgaW5mb3JtYXRpb25zDQogICAgJHZfY2VudHJhbF9kaXJfdG9fYWRkID0gYXJyYXkoKTsNCiAgICBpZiAoKCR2X3Jlc3VsdCA9ICRwX2FyY2hpdmVfdG9fYWRkLT5wcml2UmVhZEVuZENlbnRyYWxEaXIoJHZfY2VudHJhbF9kaXJfdG9fYWRkKSkgIT0gMSkNCiAgICB7DQogICAgICAkdGhpcy0+cHJpdkNsb3NlRmQoKTsNCiAgICAgICRwX2FyY2hpdmVfdG9fYWRkLT5wcml2Q2xvc2VGZCgpOw0KDQogICAgICByZXR1cm4gJHZfcmVzdWx0Ow0KICAgIH0NCg0KICAgIC8vIC0tLS0tIEdvIHRvIGJlZ2lubmluZyBvZiBGaWxlDQogICAgQHJld2luZCgkcF9hcmNoaXZlX3RvX2FkZC0+emlwX2ZkKTsNCg0KICAgIC8vIC0tLS0tIENyZWF0ZXMgYSB0ZW1wb3JheSBmaWxlDQogICAgJHZfemlwX3RlbXBfbmFtZSA9IFBDTFpJUF9URU1QT1JBUllfRElSLnVuaXFpZCgncGNsemlwLScpLicudG1wJzsNCg0KICAgIC8vIC0tLS0tIE9wZW4gdGhlIHRlbXBvcmFyeSBmaWxlIGluIHdyaXRlIG1vZGUNCiAgICBpZiAoKCR2X3ppcF90ZW1wX2ZkID0gQGZvcGVuKCR2X3ppcF90ZW1wX25hbWUsICd3YicpKSA9PSAwKQ0KICAgIHsNCiAgICAgICR0aGlzLT5wcml2Q2xvc2VGZCgpOw0KICAgICAgJHBfYXJjaGl2ZV90b19hZGQtPnByaXZDbG9zZUZkKCk7DQoNCiAgICAgIFBjbFppcDo6cHJpdkVycm9yTG9nKFBDTFpJUF9FUlJfUkVBRF9PUEVOX0ZBSUwsICdVbmFibGUgdG8gb3BlbiB0ZW1wb3JhcnkgZmlsZSBcJycuJHZfemlwX3RlbXBfbmFtZS4nXCcgaW4gYmluYXJ5IHdyaXRlIG1vZGUnKTsNCg0KICAgICAgLy8gLS0tLS0gUmV0dXJuDQogICAgICByZXR1cm4gUGNsWmlwOjplcnJvckNvZGUoKTsNCiAgICB9DQoNCiAgICAvLyAtLS0tLSBDb3B5IHRoZSBmaWxlcyBmcm9tIHRoZSBhcmNoaXZlIHRvIHRoZSB0ZW1wb3JhcnkgZmlsZQ0KICAgIC8vIFRCQyA6IEhlcmUgSSBzaG91bGQgYmV0dGVyIGFwcGVuZCB0aGUgZmlsZSBhbmQgZ28gYmFjayB0byBlcmFzZSB0aGUgY2VudHJhbCBkaXINCiAgICAkdl9zaXplID0gJHZfY2VudHJhbF9kaXJbJ29mZnNldCddOw0KICAgIHdoaWxlICgkdl9zaXplICE9IDApDQogICAgew0KICAgICAgJHZfcmVhZF9zaXplID0gKCR2X3NpemUgPCBQQ0xaSVBfUkVBRF9CTE9DS19TSVpFID8gJHZfc2l6ZSA6IFBDTFpJUF9SRUFEX0JMT0NLX1NJWkUpOw0KICAgICAgJHZfYnVmZmVyID0gZnJlYWQoJHRoaXMtPnppcF9mZCwgJHZfcmVhZF9zaXplKTsNCiAgICAgIEBmd3JpdGUoJHZfemlwX3RlbXBfZmQsICR2X2J1ZmZlciwgJHZfcmVhZF9zaXplKTsNCiAgICAgICR2X3NpemUgLT0gJHZfcmVhZF9zaXplOw0KICAgIH0NCg0KICAgIC8vIC0tLS0tIENvcHkgdGhlIGZpbGVzIGZyb20gdGhlIGFyY2hpdmVfdG9fYWRkIGludG8gdGhlIHRlbXBvcmFyeSBmaWxlDQogICAgJHZfc2l6ZSA9ICR2X2NlbnRyYWxfZGlyX3RvX2FkZFsnb2Zmc2V0J107DQogICAgd2hpbGUgKCR2X3NpemUgIT0gMCkNCiAgICB7DQogICAgICAkdl9yZWFkX3NpemUgPSAoJHZfc2l6ZSA8IFBDTFpJUF9SRUFEX0JMT0NLX1NJWkUgPyAkdl9zaXplIDogUENMWklQX1JFQURfQkxPQ0tfU0laRSk7DQogICAgICAkdl9idWZmZXIgPSBmcmVhZCgkcF9hcmNoaXZlX3RvX2FkZC0+emlwX2ZkLCAkdl9yZWFkX3NpemUpOw0KICAgICAgQGZ3cml0ZSgkdl96aXBfdGVtcF9mZCwgJHZfYnVmZmVyLCAkdl9yZWFkX3NpemUpOw0KICAgICAgJHZfc2l6ZSAtPSAkdl9yZWFkX3NpemU7DQogICAgfQ0KDQogICAgLy8gLS0tLS0gU3RvcmUgdGhlIG9mZnNldCBvZiB0aGUgY2VudHJhbCBkaXINCiAgICAkdl9vZmZzZXQgPSBAZnRlbGwoJHZfemlwX3RlbXBfZmQpOw0KDQogICAgLy8gLS0tLS0gQ29weSB0aGUgYmxvY2sgb2YgZmlsZSBoZWFkZXJzIGZyb20gdGhlIG9sZCBhcmNoaXZlDQogICAgJHZfc2l6ZSA9ICR2X2NlbnRyYWxfZGlyWydzaXplJ107DQogICAgd2hpbGUgKCR2X3NpemUgIT0gMCkNCiAgICB7DQogICAgICAkdl9yZWFkX3NpemUgPSAoJHZfc2l6ZSA8IFBDTFpJUF9SRUFEX0JMT0NLX1NJWkUgPyAkdl9zaXplIDogUENMWklQX1JFQURfQkxPQ0tfU0laRSk7DQogICAgICAkdl9idWZmZXIgPSBAZnJlYWQoJHRoaXMtPnppcF9mZCwgJHZfcmVhZF9zaXplKTsNCiAgICAgIEBmd3JpdGUoJHZfemlwX3RlbXBfZmQsICR2X2J1ZmZlciwgJHZfcmVhZF9zaXplKTsNCiAgICAgICR2X3NpemUgLT0gJHZfcmVhZF9zaXplOw0KICAgIH0NCg0KICAgIC8vIC0tLS0tIENvcHkgdGhlIGJsb2NrIG9mIGZpbGUgaGVhZGVycyBmcm9tIHRoZSBhcmNoaXZlX3RvX2FkZA0KICAgICR2X3NpemUgPSAkdl9jZW50cmFsX2Rpcl90b19hZGRbJ3NpemUnXTsNCiAgICB3aGlsZSAoJHZfc2l6ZSAhPSAwKQ0KICAgIHsNCiAgICAgICR2X3JlYWRfc2l6ZSA9ICgkdl9zaXplIDwgUENMWklQX1JFQURfQkxPQ0tfU0laRSA/ICR2X3NpemUgOiBQQ0xaSVBfUkVBRF9CTE9DS19TSVpFKTsNCiAgICAgICR2X2J1ZmZlciA9IEBmcmVhZCgkcF9hcmNoaXZlX3RvX2FkZC0+emlwX2ZkLCAkdl9yZWFkX3NpemUpOw0KICAgICAgQGZ3cml0ZSgkdl96aXBfdGVtcF9mZCwgJHZfYnVmZmVyLCAkdl9yZWFkX3NpemUpOw0KICAgICAgJHZfc2l6ZSAtPSAkdl9yZWFkX3NpemU7DQogICAgfQ0KDQogICAgLy8gLS0tLS0gTWVyZ2UgdGhlIGZpbGUgY29tbWVudHMNCiAgICAkdl9jb21tZW50ID0gJHZfY2VudHJhbF9kaXJbJ2NvbW1lbnQnXS4nICcuJHZfY2VudHJhbF9kaXJfdG9fYWRkWydjb21tZW50J107DQoNCiAgICAvLyAtLS0tLSBDYWxjdWxhdGUgdGhlIHNpemUgb2YgdGhlIChuZXcpIGNlbnRyYWwgaGVhZGVyDQogICAgJHZfc2l6ZSA9IEBmdGVsbCgkdl96aXBfdGVtcF9mZCktJHZfb2Zmc2V0Ow0KDQogICAgLy8gLS0tLS0gU3dhcCB0aGUgZmlsZSBkZXNjcmlwdG9yDQogICAgLy8gSGVyZSBpcyBhIHRyaWNrIDogSSBzd2FwIHRoZSB0ZW1wb3JhcnkgZmQgd2l0aCB0aGUgemlwIGZkLCBpbiBvcmRlciB0byB1c2UNCiAgICAvLyB0aGUgZm9sbG93aW5nIG1ldGhvZHMgb24gdGhlIHRlbXBvcmFyeSBmaWwgYW5kIG5vdCB0aGUgcmVhbCBhcmNoaXZlIGZkDQogICAgJHZfc3dhcCA9ICR0aGlzLT56aXBfZmQ7DQogICAgJHRoaXMtPnppcF9mZCA9ICR2X3ppcF90ZW1wX2ZkOw0KICAgICR2X3ppcF90ZW1wX2ZkID0gJHZfc3dhcDsNCg0KICAgIC8vIC0tLS0tIENyZWF0ZSB0aGUgY2VudHJhbCBkaXIgZm9vdGVyDQogICAgaWYgKCgkdl9yZXN1bHQgPSAkdGhpcy0+cHJpdldyaXRlQ2VudHJhbEhlYWRlcigkdl9jZW50cmFsX2RpclsnZW50cmllcyddKyR2X2NlbnRyYWxfZGlyX3RvX2FkZFsnZW50cmllcyddLCAkdl9zaXplLCAkdl9vZmZzZXQsICR2X2NvbW1lbnQpKSAhPSAxKQ0KICAgIHsNCiAgICAgICR0aGlzLT5wcml2Q2xvc2VGZCgpOw0KICAgICAgJHBfYXJjaGl2ZV90b19hZGQtPnByaXZDbG9zZUZkKCk7DQogICAgICBAZmNsb3NlKCR2X3ppcF90ZW1wX2ZkKTsNCiAgICAgICR0aGlzLT56aXBfZmQgPSBudWxsOw0KDQogICAgICAvLyAtLS0tLSBSZXNldCB0aGUgZmlsZSBsaXN0DQogICAgICB1bnNldCgkdl9oZWFkZXJfbGlzdCk7DQoNCiAgICAgIC8vIC0tLS0tIFJldHVybg0KICAgICAgcmV0dXJuICR2X3Jlc3VsdDsNCiAgICB9DQoNCiAgICAvLyAtLS0tLSBTd2FwIGJhY2sgdGhlIGZpbGUgZGVzY3JpcHRvcg0KICAgICR2X3N3YXAgPSAkdGhpcy0+emlwX2ZkOw0KICAgICR0aGlzLT56aXBfZmQgPSAkdl96aXBfdGVtcF9mZDsNCiAgICAkdl96aXBfdGVtcF9mZCA9ICR2X3N3YXA7DQoNCiAgICAvLyAtLS0tLSBDbG9zZQ0KICAgICR0aGlzLT5wcml2Q2xvc2VGZCgpOw0KICAgICRwX2FyY2hpdmVfdG9fYWRkLT5wcml2Q2xvc2VGZCgpOw0KDQogICAgLy8gLS0tLS0gQ2xvc2UgdGhlIHRlbXBvcmFyeSBmaWxlDQogICAgQGZjbG9zZSgkdl96aXBfdGVtcF9mZCk7DQoNCiAgICAvLyAtLS0tLSBEZWxldGUgdGhlIHppcCBmaWxlDQogICAgLy8gVEJDIDogSSBzaG91bGQgdGVzdCB0aGUgcmVzdWx0IC4uLg0KICAgIEB1bmxpbmsoJHRoaXMtPnppcG5hbWUpOw0KDQogICAgLy8gLS0tLS0gUmVuYW1lIHRoZSB0ZW1wb3JhcnkgZmlsZQ0KICAgIC8vIFRCQyA6IEkgc2hvdWxkIHRlc3QgdGhlIHJlc3VsdCAuLi4NCiAgICAvL0ByZW5hbWUoJHZfemlwX3RlbXBfbmFtZSwgJHRoaXMtPnppcG5hbWUpOw0KICAgIFBjbFppcFV0aWxSZW5hbWUoJHZfemlwX3RlbXBfbmFtZSwgJHRoaXMtPnppcG5hbWUpOw0KDQogICAgLy8gLS0tLS0gUmV0dXJuDQogICAgcmV0dXJuICR2X3Jlc3VsdDsNCiAgfQ0KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogIC8vIEZ1bmN0aW9uIDogcHJpdkR1cGxpY2F0ZSgpDQogIC8vIERlc2NyaXB0aW9uIDoNCiAgLy8gUGFyYW1ldGVycyA6DQogIC8vIFJldHVybiBWYWx1ZXMgOg0KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICBmdW5jdGlvbiBwcml2RHVwbGljYXRlKCRwX2FyY2hpdmVfZmlsZW5hbWUpDQogIHsNCiAgICAkdl9yZXN1bHQ9MTsNCg0KICAgIC8vIC0tLS0tIExvb2sgaWYgdGhlICRwX2FyY2hpdmVfZmlsZW5hbWUgZXhpc3RzDQogICAgaWYgKCFpc19maWxlKCRwX2FyY2hpdmVfZmlsZW5hbWUpKQ0KICAgIHsNCg0KICAgICAgLy8gLS0tLS0gTm90aGluZyB0byBkdXBsaWNhdGUsIHNvIGR1cGxpY2F0ZSBpcyBhIHN1Y2Nlc3MuDQogICAgICAkdl9yZXN1bHQgPSAxOw0KDQogICAgICAvLyAtLS0tLSBSZXR1cm4NCiAgICAgIHJldHVybiAkdl9yZXN1bHQ7DQogICAgfQ0KDQogICAgLy8gLS0tLS0gT3BlbiB0aGUgemlwIGZpbGUNCiAgICBpZiAoKCR2X3Jlc3VsdD0kdGhpcy0+cHJpdk9wZW5GZCgnd2InKSkgIT0gMSkNCiAgICB7DQogICAgICAvLyAtLS0tLSBSZXR1cm4NCiAgICAgIHJldHVybiAkdl9yZXN1bHQ7DQogICAgfQ0KDQogICAgLy8gLS0tLS0gT3BlbiB0aGUgdGVtcG9yYXJ5IGZpbGUgaW4gd3JpdGUgbW9kZQ0KICAgIGlmICgoJHZfemlwX3RlbXBfZmQgPSBAZm9wZW4oJHBfYXJjaGl2ZV9maWxlbmFtZSwgJ3JiJykpID09IDApDQogICAgew0KICAgICAgJHRoaXMtPnByaXZDbG9zZUZkKCk7DQoNCiAgICAgIFBjbFppcDo6cHJpdkVycm9yTG9nKFBDTFpJUF9FUlJfUkVBRF9PUEVOX0ZBSUwsICdVbmFibGUgdG8gb3BlbiBhcmNoaXZlIGZpbGUgXCcnLiRwX2FyY2hpdmVfZmlsZW5hbWUuJ1wnIGluIGJpbmFyeSB3cml0ZSBtb2RlJyk7DQoNCiAgICAgIC8vIC0tLS0tIFJldHVybg0KICAgICAgcmV0dXJuIFBjbFppcDo6ZXJyb3JDb2RlKCk7DQogICAgfQ0KDQogICAgLy8gLS0tLS0gQ29weSB0aGUgZmlsZXMgZnJvbSB0aGUgYXJjaGl2ZSB0byB0aGUgdGVtcG9yYXJ5IGZpbGUNCiAgICAvLyBUQkMgOiBIZXJlIEkgc2hvdWxkIGJldHRlciBhcHBlbmQgdGhlIGZpbGUgYW5kIGdvIGJhY2sgdG8gZXJhc2UgdGhlIGNlbnRyYWwgZGlyDQogICAgJHZfc2l6ZSA9IGZpbGVzaXplKCRwX2FyY2hpdmVfZmlsZW5hbWUpOw0KICAgIHdoaWxlICgkdl9zaXplICE9IDApDQogICAgew0KICAgICAgJHZfcmVhZF9zaXplID0gKCR2X3NpemUgPCBQQ0xaSVBfUkVBRF9CTE9DS19TSVpFID8gJHZfc2l6ZSA6IFBDTFpJUF9SRUFEX0JMT0NLX1NJWkUpOw0KICAgICAgJHZfYnVmZmVyID0gZnJlYWQoJHZfemlwX3RlbXBfZmQsICR2X3JlYWRfc2l6ZSk7DQogICAgICBAZndyaXRlKCR0aGlzLT56aXBfZmQsICR2X2J1ZmZlciwgJHZfcmVhZF9zaXplKTsNCiAgICAgICR2X3NpemUgLT0gJHZfcmVhZF9zaXplOw0KICAgIH0NCg0KICAgIC8vIC0tLS0tIENsb3NlDQogICAgJHRoaXMtPnByaXZDbG9zZUZkKCk7DQoNCiAgICAvLyAtLS0tLSBDbG9zZSB0aGUgdGVtcG9yYXJ5IGZpbGUNCiAgICBAZmNsb3NlKCR2X3ppcF90ZW1wX2ZkKTsNCg0KICAgIC8vIC0tLS0tIFJldHVybg0KICAgIHJldHVybiAkdl9yZXN1bHQ7DQogIH0NCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICAvLyBGdW5jdGlvbiA6IHByaXZFcnJvckxvZygpDQogIC8vIERlc2NyaXB0aW9uIDoNCiAgLy8gUGFyYW1ldGVycyA6DQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogIGZ1bmN0aW9uIHByaXZFcnJvckxvZygkcF9lcnJvcl9jb2RlPTAsICRwX2Vycm9yX3N0cmluZz0nJykNCiAgew0KICAgIGlmIChQQ0xaSVBfRVJST1JfRVhURVJOQUwgPT0gMSkgew0KICAgICAgUGNsRXJyb3IoJHBfZXJyb3JfY29kZSwgJHBfZXJyb3Jfc3RyaW5nKTsNCiAgICB9DQogICAgZWxzZSB7DQogICAgICAkdGhpcy0+ZXJyb3JfY29kZSA9ICRwX2Vycm9yX2NvZGU7DQogICAgICAkdGhpcy0+ZXJyb3Jfc3RyaW5nID0gJHBfZXJyb3Jfc3RyaW5nOw0KICAgIH0NCiAgfQ0KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogIC8vIEZ1bmN0aW9uIDogcHJpdkVycm9yUmVzZXQoKQ0KICAvLyBEZXNjcmlwdGlvbiA6DQogIC8vIFBhcmFtZXRlcnMgOg0KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICBmdW5jdGlvbiBwcml2RXJyb3JSZXNldCgpDQogIHsNCiAgICBpZiAoUENMWklQX0VSUk9SX0VYVEVSTkFMID09IDEpIHsNCiAgICAgIFBjbEVycm9yUmVzZXQoKTsNCiAgICB9DQogICAgZWxzZSB7DQogICAgICAkdGhpcy0+ZXJyb3JfY29kZSA9IDA7DQogICAgICAkdGhpcy0+ZXJyb3Jfc3RyaW5nID0gJyc7DQogICAgfQ0KICB9DQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAgLy8gRnVuY3Rpb24gOiBwcml2RGlzYWJsZU1hZ2ljUXVvdGVzKCkNCiAgLy8gRGVzY3JpcHRpb24gOg0KICAvLyBQYXJhbWV0ZXJzIDoNCiAgLy8gUmV0dXJuIFZhbHVlcyA6DQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogIGZ1bmN0aW9uIHByaXZEaXNhYmxlTWFnaWNRdW90ZXMoKQ0KICB7DQogICAgJHZfcmVzdWx0PTE7DQoNCiAgICAvLyAtLS0tLSBMb29rIGlmIGZ1bmN0aW9uIGV4aXN0cw0KICAgIGlmICggICAoIWZ1bmN0aW9uX2V4aXN0cygiZ2V0X21hZ2ljX3F1b3Rlc19ydW50aW1lIikpDQoJICAgIHx8ICghZnVuY3Rpb25fZXhpc3RzKCJzZXRfbWFnaWNfcXVvdGVzX3J1bnRpbWUiKSkpIHsNCiAgICAgIHJldHVybiAkdl9yZXN1bHQ7DQoJfQ0KDQogICAgLy8gLS0tLS0gTG9vayBpZiBhbHJlYWR5IGRvbmUNCiAgICBpZiAoJHRoaXMtPm1hZ2ljX3F1b3Rlc19zdGF0dXMgIT0gLTEpIHsNCiAgICAgIHJldHVybiAkdl9yZXN1bHQ7DQoJfQ0KDQoJLy8gLS0tLS0gR2V0IGFuZCBtZW1vcml6ZSB0aGUgbWFnaWNfcXVvdGUgdmFsdWUNCgkkdGhpcy0+bWFnaWNfcXVvdGVzX3N0YXR1cyA9IEBnZXRfbWFnaWNfcXVvdGVzX3J1bnRpbWUoKTsNCg0KCS8vIC0tLS0tIERpc2FibGUgbWFnaWNfcXVvdGVzDQoJaWYgKCR0aGlzLT5tYWdpY19xdW90ZXNfc3RhdHVzID09IDEpIHsNCgkgIEBzZXRfbWFnaWNfcXVvdGVzX3J1bnRpbWUoMCk7DQoJfQ0KDQogICAgLy8gLS0tLS0gUmV0dXJuDQogICAgcmV0dXJuICR2X3Jlc3VsdDsNCiAgfQ0KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogIC8vIEZ1bmN0aW9uIDogcHJpdlN3YXBCYWNrTWFnaWNRdW90ZXMoKQ0KICAvLyBEZXNjcmlwdGlvbiA6DQogIC8vIFBhcmFtZXRlcnMgOg0KICAvLyBSZXR1cm4gVmFsdWVzIDoNCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAgZnVuY3Rpb24gcHJpdlN3YXBCYWNrTWFnaWNRdW90ZXMoKQ0KICB7DQogICAgJHZfcmVzdWx0PTE7DQoNCiAgICAvLyAtLS0tLSBMb29rIGlmIGZ1bmN0aW9uIGV4aXN0cw0KICAgIGlmICggICAoIWZ1bmN0aW9uX2V4aXN0cygiZ2V0X21hZ2ljX3F1b3Rlc19ydW50aW1lIikpDQoJICAgIHx8ICghZnVuY3Rpb25fZXhpc3RzKCJzZXRfbWFnaWNfcXVvdGVzX3J1bnRpbWUiKSkpIHsNCiAgICAgIHJldHVybiAkdl9yZXN1bHQ7DQoJfQ0KDQogICAgLy8gLS0tLS0gTG9vayBpZiBzb21ldGhpbmcgdG8gZG8NCiAgICBpZiAoJHRoaXMtPm1hZ2ljX3F1b3Rlc19zdGF0dXMgIT0gLTEpIHsNCiAgICAgIHJldHVybiAkdl9yZXN1bHQ7DQoJfQ0KDQoJLy8gLS0tLS0gU3dhcCBiYWNrIG1hZ2ljX3F1b3Rlcw0KCWlmICgkdGhpcy0+bWFnaWNfcXVvdGVzX3N0YXR1cyA9PSAxKSB7DQogIAkgIEBzZXRfbWFnaWNfcXVvdGVzX3J1bnRpbWUoJHRoaXMtPm1hZ2ljX3F1b3Rlc19zdGF0dXMpOw0KCX0NCg0KICAgIC8vIC0tLS0tIFJldHVybg0KICAgIHJldHVybiAkdl9yZXN1bHQ7DQogIH0NCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KICB9DQogIC8vIEVuZCBvZiBjbGFzcw0KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogIC8vIEZ1bmN0aW9uIDogUGNsWmlwVXRpbFBhdGhSZWR1Y3Rpb24oKQ0KICAvLyBEZXNjcmlwdGlvbiA6DQogIC8vIFBhcmFtZXRlcnMgOg0KICAvLyBSZXR1cm4gVmFsdWVzIDoNCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAgZnVuY3Rpb24gUGNsWmlwVXRpbFBhdGhSZWR1Y3Rpb24oJHBfZGlyKQ0KICB7DQogICAgJHZfcmVzdWx0ID0gIiI7DQoNCiAgICAvLyAtLS0tLSBMb29rIGZvciBub3QgZW1wdHkgcGF0aA0KICAgIGlmICgkcF9kaXIgIT0gIiIpIHsNCiAgICAgIC8vIC0tLS0tIEV4cGxvZGUgcGF0aCBieSBkaXJlY3RvcnkgbmFtZXMNCiAgICAgICR2X2xpc3QgPSBleHBsb2RlKCIvIiwgJHBfZGlyKTsNCg0KICAgICAgLy8gLS0tLS0gU3R1ZHkgZGlyZWN0b3JpZXMgZnJvbSBsYXN0IHRvIGZpcnN0DQogICAgICAkdl9za2lwID0gMDsNCiAgICAgIGZvciAoJGk9c2l6ZW9mKCR2X2xpc3QpLTE7ICRpPj0wOyAkaS0tKSB7DQogICAgICAgIC8vIC0tLS0tIExvb2sgZm9yIGN1cnJlbnQgcGF0aA0KICAgICAgICBpZiAoJHZfbGlzdFskaV0gPT0gIi4iKSB7DQogICAgICAgICAgLy8gLS0tLS0gSWdub3JlIHRoaXMgZGlyZWN0b3J5DQogICAgICAgICAgLy8gU2hvdWxkIGJlIHRoZSBmaXJzdCAkaT0wLCBidXQgbm8gY2hlY2sgaXMgZG9uZQ0KICAgICAgICB9DQogICAgICAgIGVsc2UgaWYgKCR2X2xpc3RbJGldID09ICIuLiIpIHsNCgkJICAkdl9za2lwKys7DQogICAgICAgIH0NCiAgICAgICAgZWxzZSBpZiAoJHZfbGlzdFskaV0gPT0gIiIpIHsNCgkJICAvLyAtLS0tLSBGaXJzdCAnLycgaS5lLiByb290IHNsYXNoDQoJCSAgaWYgKCRpID09IDApIHsNCiAgICAgICAgICAgICR2X3Jlc3VsdCA9ICIvIi4kdl9yZXN1bHQ7DQoJCSAgICBpZiAoJHZfc2tpcCA+IDApIHsNCgkJICAgICAgICAvLyAtLS0tLSBJdCBpcyBhbiBpbnZhbGlkIHBhdGgsIHNvIHRoZSBwYXRoIGlzIG5vdCBtb2RpZmllZA0KCQkgICAgICAgIC8vIFRCQw0KCQkgICAgICAgICR2X3Jlc3VsdCA9ICRwX2RpcjsNCiAgICAgICAgICAgICAgICAkdl9za2lwID0gMDsNCgkJICAgIH0NCgkJICB9DQoJCSAgLy8gLS0tLS0gTGFzdCAnLycgaS5lLiBpbmRpY2F0ZXMgYSBkaXJlY3RvcnkNCgkJICBlbHNlIGlmICgkaSA9PSAoc2l6ZW9mKCR2X2xpc3QpLTEpKSB7DQogICAgICAgICAgICAkdl9yZXN1bHQgPSAkdl9saXN0WyRpXTsNCgkJICB9DQoJCSAgLy8gLS0tLS0gRG91YmxlICcvJyBpbnNpZGUgdGhlIHBhdGgNCgkJICBlbHNlIHsNCiAgICAgICAgICAgIC8vIC0tLS0tIElnbm9yZSBvbmx5IHRoZSBkb3VibGUgJy8vJyBpbiBwYXRoLA0KICAgICAgICAgICAgLy8gYnV0IG5vdCB0aGUgZmlyc3QgYW5kIGxhc3QgJy8nDQoJCSAgfQ0KICAgICAgICB9DQogICAgICAgIGVsc2Ugew0KCQkgIC8vIC0tLS0tIExvb2sgZm9yIGl0ZW0gdG8gc2tpcA0KCQkgIGlmICgkdl9za2lwID4gMCkgew0KCQkgICAgJHZfc2tpcC0tOw0KCQkgIH0NCgkJICBlbHNlIHsNCiAgICAgICAgICAgICR2X3Jlc3VsdCA9ICR2X2xpc3RbJGldLigkaSE9KHNpemVvZigkdl9saXN0KS0xKT8iLyIuJHZfcmVzdWx0OiIiKTsNCgkJICB9DQogICAgICAgIH0NCiAgICAgIH0NCiAgICAgIA0KICAgICAgLy8gLS0tLS0gTG9vayBmb3Igc2tpcA0KICAgICAgaWYgKCR2X3NraXAgPiAwKSB7DQogICAgICAgIHdoaWxlICgkdl9za2lwID4gMCkgew0KICAgICAgICAgICAgJHZfcmVzdWx0ID0gJy4uLycuJHZfcmVzdWx0Ow0KICAgICAgICAgICAgJHZfc2tpcC0tOw0KICAgICAgICB9DQogICAgICB9DQogICAgfQ0KDQogICAgLy8gLS0tLS0gUmV0dXJuDQogICAgcmV0dXJuICR2X3Jlc3VsdDsNCiAgfQ0KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogIC8vIEZ1bmN0aW9uIDogUGNsWmlwVXRpbFBhdGhJbmNsdXNpb24oKQ0KICAvLyBEZXNjcmlwdGlvbiA6DQogIC8vICAgVGhpcyBmdW5jdGlvbiBpbmRpY2F0ZXMgaWYgdGhlIHBhdGggJHBfcGF0aCBpcyB1bmRlciB0aGUgJHBfZGlyIHRyZWUuIE9yLA0KICAvLyAgIHNhaWQgaW4gYW4gb3RoZXIgd2F5LCBpZiB0aGUgZmlsZSBvciBzdWItZGlyICRwX3BhdGggaXMgaW5zaWRlIHRoZSBkaXINCiAgLy8gICAkcF9kaXIuDQogIC8vICAgVGhlIGZ1bmN0aW9uIGluZGljYXRlcyBhbHNvIGlmIHRoZSBwYXRoIGlzIGV4YWN0bHkgdGhlIHNhbWUgYXMgdGhlIGRpci4NCiAgLy8gICBUaGlzIGZ1bmN0aW9uIHN1cHBvcnRzIHBhdGggd2l0aCBkdXBsaWNhdGVkICcvJyBsaWtlICcvLycsIGJ1dCBkb2VzIG5vdA0KICAvLyAgIHN1cHBvcnQgJy4nIG9yICcuLicgc3RhdGVtZW50cy4NCiAgLy8gUGFyYW1ldGVycyA6DQogIC8vIFJldHVybiBWYWx1ZXMgOg0KICAvLyAgIDAgaWYgJHBfcGF0aCBpcyBub3QgaW5zaWRlIGRpcmVjdG9yeSAkcF9kaXINCiAgLy8gICAxIGlmICRwX3BhdGggaXMgaW5zaWRlIGRpcmVjdG9yeSAkcF9kaXINCiAgLy8gICAyIGlmICRwX3BhdGggaXMgZXhhY3RseSB0aGUgc2FtZSBhcyAkcF9kaXINCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAgZnVuY3Rpb24gUGNsWmlwVXRpbFBhdGhJbmNsdXNpb24oJHBfZGlyLCAkcF9wYXRoKQ0KICB7DQogICAgJHZfcmVzdWx0ID0gMTsNCiAgICANCiAgICAvLyAtLS0tLSBMb29rIGZvciBwYXRoIGJlZ2lubmluZyBieSAuLw0KICAgIGlmICggICAoJHBfZGlyID09ICcuJykNCiAgICAgICAgfHwgKChzdHJsZW4oJHBfZGlyKSA+PTIpICYmIChzdWJzdHIoJHBfZGlyLCAwLCAyKSA9PSAnLi8nKSkpIHsNCiAgICAgICRwX2RpciA9IFBjbFppcFV0aWxUcmFuc2xhdGVXaW5QYXRoKGdldGN3ZCgpLCBGQUxTRSkuJy8nLnN1YnN0cigkcF9kaXIsIDEpOw0KICAgIH0NCiAgICBpZiAoICAgKCRwX3BhdGggPT0gJy4nKQ0KICAgICAgICB8fCAoKHN0cmxlbigkcF9wYXRoKSA+PTIpICYmIChzdWJzdHIoJHBfcGF0aCwgMCwgMikgPT0gJy4vJykpKSB7DQogICAgICAkcF9wYXRoID0gUGNsWmlwVXRpbFRyYW5zbGF0ZVdpblBhdGgoZ2V0Y3dkKCksIEZBTFNFKS4nLycuc3Vic3RyKCRwX3BhdGgsIDEpOw0KICAgIH0NCg0KICAgIC8vIC0tLS0tIEV4cGxvZGUgZGlyIGFuZCBwYXRoIGJ5IGRpcmVjdG9yeSBzZXBhcmF0b3INCiAgICAkdl9saXN0X2RpciA9IGV4cGxvZGUoIi8iLCAkcF9kaXIpOw0KICAgICR2X2xpc3RfZGlyX3NpemUgPSBzaXplb2YoJHZfbGlzdF9kaXIpOw0KICAgICR2X2xpc3RfcGF0aCA9IGV4cGxvZGUoIi8iLCAkcF9wYXRoKTsNCiAgICAkdl9saXN0X3BhdGhfc2l6ZSA9IHNpemVvZigkdl9saXN0X3BhdGgpOw0KDQogICAgLy8gLS0tLS0gU3R1ZHkgZGlyZWN0b3JpZXMgcGF0aHMNCiAgICAkaSA9IDA7DQogICAgJGogPSAwOw0KICAgIHdoaWxlICgoJGkgPCAkdl9saXN0X2Rpcl9zaXplKSAmJiAoJGogPCAkdl9saXN0X3BhdGhfc2l6ZSkgJiYgKCR2X3Jlc3VsdCkpIHsNCg0KICAgICAgLy8gLS0tLS0gTG9vayBmb3IgZW1wdHkgZGlyIChwYXRoIHJlZHVjdGlvbikNCiAgICAgIGlmICgkdl9saXN0X2RpclskaV0gPT0gJycpIHsNCiAgICAgICAgJGkrKzsNCiAgICAgICAgY29udGludWU7DQogICAgICB9DQogICAgICBpZiAoJHZfbGlzdF9wYXRoWyRqXSA9PSAnJykgew0KICAgICAgICAkaisrOw0KICAgICAgICBjb250aW51ZTsNCiAgICAgIH0NCg0KICAgICAgLy8gLS0tLS0gQ29tcGFyZSB0aGUgaXRlbXMNCiAgICAgIGlmICgoJHZfbGlzdF9kaXJbJGldICE9ICR2X2xpc3RfcGF0aFskal0pICYmICgkdl9saXN0X2RpclskaV0gIT0gJycpICYmICggJHZfbGlzdF9wYXRoWyRqXSAhPSAnJykpICB7DQogICAgICAgICR2X3Jlc3VsdCA9IDA7DQogICAgICB9DQoNCiAgICAgIC8vIC0tLS0tIE5leHQgaXRlbXMNCiAgICAgICRpKys7DQogICAgICAkaisrOw0KICAgIH0NCg0KICAgIC8vIC0tLS0tIExvb2sgaWYgZXZlcnl0aGluZyBzZWVtcyB0byBiZSB0aGUgc2FtZQ0KICAgIGlmICgkdl9yZXN1bHQpIHsNCiAgICAgIC8vIC0tLS0tIFNraXAgYWxsIHRoZSBlbXB0eSBpdGVtcw0KICAgICAgd2hpbGUgKCgkaiA8ICR2X2xpc3RfcGF0aF9zaXplKSAmJiAoJHZfbGlzdF9wYXRoWyRqXSA9PSAnJykpICRqKys7DQogICAgICB3aGlsZSAoKCRpIDwgJHZfbGlzdF9kaXJfc2l6ZSkgJiYgKCR2X2xpc3RfZGlyWyRpXSA9PSAnJykpICRpKys7DQoNCiAgICAgIGlmICgoJGkgPj0gJHZfbGlzdF9kaXJfc2l6ZSkgJiYgKCRqID49ICR2X2xpc3RfcGF0aF9zaXplKSkgew0KICAgICAgICAvLyAtLS0tLSBUaGVyZSBhcmUgZXhhY3RseSB0aGUgc2FtZQ0KICAgICAgICAkdl9yZXN1bHQgPSAyOw0KICAgICAgfQ0KICAgICAgZWxzZSBpZiAoJGkgPCAkdl9saXN0X2Rpcl9zaXplKSB7DQogICAgICAgIC8vIC0tLS0tIFRoZSBwYXRoIGlzIHNob3J0ZXIgdGhhbiB0aGUgZGlyDQogICAgICAgICR2X3Jlc3VsdCA9IDA7DQogICAgICB9DQogICAgfQ0KDQogICAgLy8gLS0tLS0gUmV0dXJuDQogICAgcmV0dXJuICR2X3Jlc3VsdDsNCiAgfQ0KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogIC8vIEZ1bmN0aW9uIDogUGNsWmlwVXRpbENvcHlCbG9jaygpDQogIC8vIERlc2NyaXB0aW9uIDoNCiAgLy8gUGFyYW1ldGVycyA6DQogIC8vICAgJHBfbW9kZSA6IHJlYWQvd3JpdGUgY29tcHJlc3Npb24gbW9kZQ0KICAvLyAgICAgICAgICAgICAwIDogc3JjICYgZGVzdCBub3JtYWwNCiAgLy8gICAgICAgICAgICAgMSA6IHNyYyBnemlwLCBkZXN0IG5vcm1hbA0KICAvLyAgICAgICAgICAgICAyIDogc3JjIG5vcm1hbCwgZGVzdCBnemlwDQogIC8vICAgICAgICAgICAgIDMgOiBzcmMgJiBkZXN0IGd6aXANCiAgLy8gUmV0dXJuIFZhbHVlcyA6DQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogIGZ1bmN0aW9uIFBjbFppcFV0aWxDb3B5QmxvY2soJHBfc3JjLCAkcF9kZXN0LCAkcF9zaXplLCAkcF9tb2RlPTApDQogIHsNCiAgICAkdl9yZXN1bHQgPSAxOw0KDQogICAgaWYgKCRwX21vZGU9PTApDQogICAgew0KICAgICAgd2hpbGUgKCRwX3NpemUgIT0gMCkNCiAgICAgIHsNCiAgICAgICAgJHZfcmVhZF9zaXplID0gKCRwX3NpemUgPCBQQ0xaSVBfUkVBRF9CTE9DS19TSVpFID8gJHBfc2l6ZSA6IFBDTFpJUF9SRUFEX0JMT0NLX1NJWkUpOw0KICAgICAgICAkdl9idWZmZXIgPSBAZnJlYWQoJHBfc3JjLCAkdl9yZWFkX3NpemUpOw0KICAgICAgICBAZndyaXRlKCRwX2Rlc3QsICR2X2J1ZmZlciwgJHZfcmVhZF9zaXplKTsNCiAgICAgICAgJHBfc2l6ZSAtPSAkdl9yZWFkX3NpemU7DQogICAgICB9DQogICAgfQ0KICAgIGVsc2UgaWYgKCRwX21vZGU9PTEpDQogICAgew0KICAgICAgd2hpbGUgKCRwX3NpemUgIT0gMCkNCiAgICAgIHsNCiAgICAgICAgJHZfcmVhZF9zaXplID0gKCRwX3NpemUgPCBQQ0xaSVBfUkVBRF9CTE9DS19TSVpFID8gJHBfc2l6ZSA6IFBDTFpJUF9SRUFEX0JMT0NLX1NJWkUpOw0KICAgICAgICAkdl9idWZmZXIgPSBAZ3pyZWFkKCRwX3NyYywgJHZfcmVhZF9zaXplKTsNCiAgICAgICAgQGZ3cml0ZSgkcF9kZXN0LCAkdl9idWZmZXIsICR2X3JlYWRfc2l6ZSk7DQogICAgICAgICRwX3NpemUgLT0gJHZfcmVhZF9zaXplOw0KICAgICAgfQ0KICAgIH0NCiAgICBlbHNlIGlmICgkcF9tb2RlPT0yKQ0KICAgIHsNCiAgICAgIHdoaWxlICgkcF9zaXplICE9IDApDQogICAgICB7DQogICAgICAgICR2X3JlYWRfc2l6ZSA9ICgkcF9zaXplIDwgUENMWklQX1JFQURfQkxPQ0tfU0laRSA/ICRwX3NpemUgOiBQQ0xaSVBfUkVBRF9CTE9DS19TSVpFKTsNCiAgICAgICAgJHZfYnVmZmVyID0gQGZyZWFkKCRwX3NyYywgJHZfcmVhZF9zaXplKTsNCiAgICAgICAgQGd6d3JpdGUoJHBfZGVzdCwgJHZfYnVmZmVyLCAkdl9yZWFkX3NpemUpOw0KICAgICAgICAkcF9zaXplIC09ICR2X3JlYWRfc2l6ZTsNCiAgICAgIH0NCiAgICB9DQogICAgZWxzZSBpZiAoJHBfbW9kZT09MykNCiAgICB7DQogICAgICB3aGlsZSAoJHBfc2l6ZSAhPSAwKQ0KICAgICAgew0KICAgICAgICAkdl9yZWFkX3NpemUgPSAoJHBfc2l6ZSA8IFBDTFpJUF9SRUFEX0JMT0NLX1NJWkUgPyAkcF9zaXplIDogUENMWklQX1JFQURfQkxPQ0tfU0laRSk7DQogICAgICAgICR2X2J1ZmZlciA9IEBnenJlYWQoJHBfc3JjLCAkdl9yZWFkX3NpemUpOw0KICAgICAgICBAZ3p3cml0ZSgkcF9kZXN0LCAkdl9idWZmZXIsICR2X3JlYWRfc2l6ZSk7DQogICAgICAgICRwX3NpemUgLT0gJHZfcmVhZF9zaXplOw0KICAgICAgfQ0KICAgIH0NCg0KICAgIC8vIC0tLS0tIFJldHVybg0KICAgIHJldHVybiAkdl9yZXN1bHQ7DQogIH0NCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICAvLyBGdW5jdGlvbiA6IFBjbFppcFV0aWxSZW5hbWUoKQ0KICAvLyBEZXNjcmlwdGlvbiA6DQogIC8vICAgVGhpcyBmdW5jdGlvbiB0cmllcyB0byBkbyBhIHNpbXBsZSByZW5hbWUoKSBmdW5jdGlvbi4gSWYgaXQgZmFpbHMsIGl0DQogIC8vICAgdHJpZXMgdG8gY29weSB0aGUgJHBfc3JjIGZpbGUgaW4gYSBuZXcgJHBfZGVzdCBmaWxlIGFuZCB0aGVuIHVubGluayB0aGUNCiAgLy8gICBmaXJzdCBvbmUuDQogIC8vIFBhcmFtZXRlcnMgOg0KICAvLyAgICRwX3NyYyA6IE9sZCBmaWxlbmFtZQ0KICAvLyAgICRwX2Rlc3QgOiBOZXcgZmlsZW5hbWUNCiAgLy8gUmV0dXJuIFZhbHVlcyA6DQogIC8vICAgMSBvbiBzdWNjZXNzLCAwIG9uIGZhaWx1cmUuDQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogIGZ1bmN0aW9uIFBjbFppcFV0aWxSZW5hbWUoJHBfc3JjLCAkcF9kZXN0KQ0KICB7DQogICAgJHZfcmVzdWx0ID0gMTsNCg0KICAgIC8vIC0tLS0tIFRyeSB0byByZW5hbWUgdGhlIGZpbGVzDQogICAgaWYgKCFAcmVuYW1lKCRwX3NyYywgJHBfZGVzdCkpIHsNCg0KICAgICAgLy8gLS0tLS0gVHJ5IHRvIGNvcHkgJiB1bmxpbmsgdGhlIHNyYw0KICAgICAgaWYgKCFAY29weSgkcF9zcmMsICRwX2Rlc3QpKSB7DQogICAgICAgICR2X3Jlc3VsdCA9IDA7DQogICAgICB9DQogICAgICBlbHNlIGlmICghQHVubGluaygkcF9zcmMpKSB7DQogICAgICAgICR2X3Jlc3VsdCA9IDA7DQogICAgICB9DQogICAgfQ0KDQogICAgLy8gLS0tLS0gUmV0dXJuDQogICAgcmV0dXJuICR2X3Jlc3VsdDsNCiAgfQ0KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogIC8vIEZ1bmN0aW9uIDogUGNsWmlwVXRpbE9wdGlvblRleHQoKQ0KICAvLyBEZXNjcmlwdGlvbiA6DQogIC8vICAgVHJhbnNsYXRlIG9wdGlvbiB2YWx1ZSBpbiB0ZXh0LiBNYWlubHkgZm9yIGRlYnVnIHB1cnBvc2UuDQogIC8vIFBhcmFtZXRlcnMgOg0KICAvLyAgICRwX29wdGlvbiA6IHRoZSBvcHRpb24gdmFsdWUuDQogIC8vIFJldHVybiBWYWx1ZXMgOg0KICAvLyAgIFRoZSBvcHRpb24gdGV4dCB2YWx1ZS4NCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAgZnVuY3Rpb24gUGNsWmlwVXRpbE9wdGlvblRleHQoJHBfb3B0aW9uKQ0KICB7DQogICAgDQogICAgJHZfbGlzdCA9IGdldF9kZWZpbmVkX2NvbnN0YW50cygpOw0KICAgIGZvciAocmVzZXQoJHZfbGlzdCk7ICR2X2tleSA9IGtleSgkdl9saXN0KTsgbmV4dCgkdl9saXN0KSkgew0KCSAgICAkdl9wcmVmaXggPSBzdWJzdHIoJHZfa2V5LCAwLCAxMCk7DQoJICAgIGlmICgoICAgKCR2X3ByZWZpeCA9PSAnUENMWklQX09QVCcpDQogICAgICAgICAgIHx8ICgkdl9wcmVmaXggPT0gJ1BDTFpJUF9DQl8nKQ0KICAgICAgICAgICB8fCAoJHZfcHJlZml4ID09ICdQQ0xaSVBfQVRUJykpDQoJICAgICAgICAmJiAoJHZfbGlzdFskdl9rZXldID09ICRwX29wdGlvbikpIHsNCiAgICAgICAgcmV0dXJuICR2X2tleTsNCgkgICAgfQ0KICAgIH0NCiAgICANCiAgICAkdl9yZXN1bHQgPSAnVW5rbm93bic7DQoNCiAgICByZXR1cm4gJHZfcmVzdWx0Ow0KICB9DQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAgLy8gRnVuY3Rpb24gOiBQY2xaaXBVdGlsVHJhbnNsYXRlV2luUGF0aCgpDQogIC8vIERlc2NyaXB0aW9uIDoNCiAgLy8gICBUcmFuc2xhdGUgd2luZG93cyBwYXRoIGJ5IHJlcGxhY2luZyAnXCcgYnkgJy8nIGFuZCBvcHRpb25hbGx5IHJlbW92aW5nDQogIC8vICAgZHJpdmUgbGV0dGVyLg0KICAvLyBQYXJhbWV0ZXJzIDoNCiAgLy8gICAkcF9wYXRoIDogcGF0aCB0byB0cmFuc2xhdGUuDQogIC8vICAgJHBfcmVtb3ZlX2Rpc2tfbGV0dGVyIDogdHJ1ZSB8IGZhbHNlDQogIC8vIFJldHVybiBWYWx1ZXMgOg0KICAvLyAgIFRoZSBwYXRoIHRyYW5zbGF0ZWQuDQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogIGZ1bmN0aW9uIFBjbFppcFV0aWxUcmFuc2xhdGVXaW5QYXRoKCRwX3BhdGgsICRwX3JlbW92ZV9kaXNrX2xldHRlcj10cnVlKQ0KICB7DQogICAgaWYgKHN0cmlzdHIocGhwX3VuYW1lKCksICd3aW5kb3dzJykpIHsNCiAgICAgIC8vIC0tLS0tIExvb2sgZm9yIHBvdGVudGlhbCBkaXNrIGxldHRlcg0KICAgICAgaWYgKCgkcF9yZW1vdmVfZGlza19sZXR0ZXIpICYmICgoJHZfcG9zaXRpb24gPSBzdHJwb3MoJHBfcGF0aCwgJzonKSkgIT0gZmFsc2UpKSB7DQogICAgICAgICAgJHBfcGF0aCA9IHN1YnN0cigkcF9wYXRoLCAkdl9wb3NpdGlvbisxKTsNCiAgICAgIH0NCiAgICAgIC8vIC0tLS0tIENoYW5nZSBwb3RlbnRpYWwgd2luZG93cyBkaXJlY3Rvcnkgc2VwYXJhdG9yDQogICAgICBpZiAoKHN0cnBvcygkcF9wYXRoLCAnXFwnKSA+IDApIHx8IChzdWJzdHIoJHBfcGF0aCwgMCwxKSA9PSAnXFwnKSkgew0KICAgICAgICAgICRwX3BhdGggPSBzdHJ0cigkcF9wYXRoLCAnXFwnLCAnLycpOw0KICAgICAgfQ0KICAgIH0NCiAgICByZXR1cm4gJHBfcGF0aDsNCiAgfQ0KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQoNCj8+DQo=]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Shared/PCLZip/readme.txt</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vIFBjbFppcCAyLjguMiAtIHJlYWRtZS50eHQNCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyBMaWNlbnNlIEdOVS9MR1BMIC0gQXVndXN0IDIwMDkNCi8vIFZpbmNlbnQgQmxhdmV0IC0gdmluY2VudEBwaHBjb25jZXB0Lm5ldA0KLy8gaHR0cDovL3d3dy5waHBjb25jZXB0Lm5ldA0KLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vICRJZDogcmVhZG1lLnR4dCx2IDEuNjAgMjAwOS8wOS8zMCAyMDozNToyMSB2YmxhdmV0IEV4cCAkDQovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQoNCg0KMCAtIFNvbW1haXJlDQo9PT09PT09PT09PT0NCiAgICAxIC0gSW50cm9kdWN0aW9uDQogICAgMiAtIFdoYXQncyBuZXcNCiAgICAzIC0gQ29ycmVjdGVkIGJ1Z3MNCiAgICA0IC0gS25vd24gYnVncyBvciBsaW1pdGF0aW9ucw0KICAgIDUgLSBMaWNlbnNlDQogICAgNiAtIFdhcm5pbmcNCiAgICA3IC0gRG9jdW1lbnRhdGlvbg0KICAgIDggLSBBdXRob3INCiAgICA5IC0gQ29udHJpYnV0ZQ0KDQoxIC0gSW50cm9kdWN0aW9uDQo9PT09PT09PT09PT09PT09DQoNCiAgUGNsWmlwIGlzIGEgbGlicmFyeSB0aGF0IGFsbG93IHlvdSB0byBtYW5hZ2UgYSBaaXAgYXJjaGl2ZS4NCg0KICBGdWxsIGRvY3VtZW50YXRpb24gYWJvdXQgUGNsWmlwIGNhbiBiZSBmb3VuZCBoZXJlIDogaHR0cDovL3d3dy5waHBjb25jZXB0Lm5ldC9wY2x6aXANCg0KMiAtIFdoYXQncyBuZXcNCj09PT09PT09PT09PT09DQoNCiAgVmVyc2lvbiAyLjguMiA6DQogICAgLSBQQ0xaSVBfQ0JfUFJFX0VYVFJBQ1QgYW5kIFBDTFpJUF9DQl9QT1NUX0VYVFJBQ1QgYXJlIG5vdyBzdXBwb3J0ZWQgd2l0aCANCiAgICAgIGV4dHJhY3Rpb24gYXMgYSBzdHJpbmcgKFBDTFpJUF9PUFRfRVhUUkFDVF9BU19TVFJJTkcpLiBUaGUgc3RyaW5nDQogICAgICBjYW4gYWxzbyBiZSBtb2RpZmllZCBpbiB0aGUgcG9zdC1leHRyYWN0IGNhbGwgYmFjay4NCiAgICAqKkJ1Z3MgY29ycmVjdGlvbiA6DQogICAgLSBQQ0xaSVBfT1BUX1JFTU9WRV9BTExfUEFUSCB3YXMgbm90IHdvcmtpbmcgY29ycmVjdGx5ICAgIA0KICAgIC0gUmVtb3ZlIHVzZSBvZiBldmFsKCkgYW5kIGRvIGRpcmVjdCBjYWxsIHRvIGNhbGxiYWNrIGZ1bmN0aW9ucw0KICAgIC0gQ29ycmVjdCBzdXBwb3J0IG9mIDY0Yml0cyBzeXN0ZW1zIChUaGFua3MgdG8gV29yZFByZXNzIHRlYW0pDQoNCiAgVmVyc2lvbiAyLjguMSA6DQogICAgLSBNb3ZlIG9wdGlvbiBQQ0xaSVBfT1BUX0JZX0VSRUcgdG8gUENMWklQX09QVF9CWV9QUkVHIGJlY2F1c2UgZXJlZygpIGlzDQogICAgICBkZXByZWNhdGVkIGluIFBIUCA1LjMuIFdoZW4gdXNpbmcgb3B0aW9uIFBDTFpJUF9PUFRfQllfRVJFRywgUGNsWmlwIHdpbGwNCiAgICAgIGF1dG9tYXRpY2FsbHkgcmVwbGFjZSBpdCBieSBQQ0xaSVBfT1BUX0JZX1BSRUcuDQogIA0KICBWZXJzaW9uIDIuOCA6DQogICAgLSBJbXByb3ZlIGV4dHJhY3Rpb24gb2YgemlwIGFyY2hpdmUgZm9yIGxhcmdlIGZpbGVzIGJ5IHVzaW5nIHRlbXBvcmFyeSBmaWxlcw0KICAgICAgVGhpcyBmZWF0dXJlIGlzIHdvcmtpbmcgbGlrZSB0aGUgb25lIGRlZmluZWQgaW4gcjIuNy4NCiAgICAgIE9wdGlvbnMgYXJlIHJlbmFtZWQgOiBQQ0xaSVBfT1BUX1RFTVBfRklMRV9PTiwgUENMWklQX09QVF9URU1QX0ZJTEVfT0ZGLA0KICAgICAgUENMWklQX09QVF9URU1QX0ZJTEVfVEhSRVNIT0xEDQogICAgLSBBZGQgYSByYXRpbyBjb25zdGFudCBQQ0xaSVBfVEVNUE9SQVJZX0ZJTEVfUkFUSU8gdG8gY29uZmlndXJlIHRoZSBhdXRvDQogICAgICBzZW5zZSBvZiB0ZW1wb3JhcnkgZmlsZSB1c2UuDQogICAgLSBCdWcgY29ycmVjdGlvbiA6IFJlZHVjZSBmaWxlcGF0aCBpbiByZXR1cm5lZCBmaWxlIGxpc3QgdG8gcmVtb3ZlIGVubm95aW5nDQogICAgICAnLi8vJyBwcmVhbWJ1bGUgaW4gZmlsZSBwYXRoLg0KDQogIFZlcnNpb24gMi43IDoNCiAgICAtIEltcHJvdmUgY3JlYXRpb24gb2YgemlwIGFyY2hpdmUgZm9yIGxhcmdlIGZpbGVzIDoNCiAgICAgIFBjbFppcCB3aWxsIG5vdyBhdXRvc2Vuc2UgdGhlIGNvbmZpZ3VyZWQgbWVtb3J5IGFuZCB1c2UgdGVtcG9yYXJ5IGZpbGVzDQogICAgICB3aGVuIGxhcmdlIGZpbGUgaXMgc3VzcGVjdGVkLg0KICAgICAgVGhpcyBmZWF0dXJlIGNhbiBhbHNvIG5lIHRyaWdnZXJlZCBieSBtYW51YWwgb3B0aW9ucyBpbiBjcmVhdGUoKSBhbmQgYWRkKCkNCiAgICAgIG1ldGhvZHMuICdQQ0xaSVBfT1BUX0FERF9URU1QX0ZJTEVfT04nIGZvcmNlIHRoZSB1c2Ugb2YgdGVtcG9yYXJ5IGZpbGVzLA0KICAgICAgJ1BDTFpJUF9PUFRfQUREX1RFTVBfRklMRV9PRkYnIGRpc2FibGUgdGhlIGF1dG9zZW5zZSB0ZWNobmljLCANCiAgICAgICdQQ0xaSVBfT1BUX0FERF9URU1QX0ZJTEVfVEhSRVNIT0xEJyBhbGxvdyBmb3IgY29uZmlndXJhdGlvbiBvZiBhIHNpemUNCiAgICAgIHRocmVzaG9sZCB0byB1c2UgdGVtcG9yYXJ5IGZpbGVzLg0KICAgICAgVXNpbmcgInRlbXBvcmFyeSBmaWxlcyIgcmF0aGVyIHRoYW4gIm1lbW9yeSIgbWlnaHQgdGFrZSBtb3JlIHRpbWUsIGJ1dA0KICAgICAgbWlnaHQgZ2l2ZSB0aGUgYWJpbGl0eSB0byB6aXAgdmVyeSBsYXJnZSBmaWxlcyA6DQogICAgICBUZXN0ZWQgb24gbXkgd2luIGxhcHRvcCB3aXRoIGEgODhNbyBmaWxlIDoNCiAgICAgICAgWmlwICJpbi1tZW1vcnkiIDogMThzZWMgKG1heF9leGVjdXRpb25fdGltZT0zMCwgbWVtb3J5X2xpbWl0PTE4ME1vKQ0KICAgICAgICBaaXAgInRtcG9yYXJ5LWZpbGVzIiA6IDIzc2VjIChtYXhfZXhlY3V0aW9uX3RpbWU9MzAsIG1lbW9yeV9saW1pdD0zME1vKQ0KICAgIC0gUmVwbGFjZSB1c2Ugb2YgbWt0aW1lKCkgYnkgdGltZSgpIHRvIGxpbWl0IHRoZSBFX1NUUklDVCBlcnJvciBtZXNzYWdlcy4NCiAgICAtIEJ1ZyBjb3JyZWN0aW9uIDogV2hlbiBhZGRpbmcgZmlsZXMgd2l0aCBmdWxsIHdpbmRvd3MgcGF0aCAoZHJpdmUgbGV0dGVyKQ0KICAgICAgUGNsWmlwIGlzIG5vdyB3b3JraW5nLiBCZWZvcmUsIGlmIHRoZSBkcml2ZSBsZXR0ZXIgaXMgbm90IHRoZSBkZWZhdWx0DQogICAgICBwYXRoLCBQY2xaaXAgd2FzIG5vdCBhYmxlIHRvIGFkZCB0aGUgZmlsZS4NCg0KICBWZXJzaW9uIDIuNiA6DQogICAgLSBDb2RlIG9wdGltaXNhdGlvbg0KICAgIC0gTmV3IGF0dHJpYnV0ZXMgUENMWklQX0FUVF9GSUxFX0NPTU1FTlQgZ2l2ZXMgdGhlIGFiaWxpdHkgdG8NCiAgICAgIGFkZCBhIGNvbW1lbnQgZm9yIGEgc3BlY2lmaWMgZmlsZS4gKERvbid0IHJlYWxseSBrbm93IGlmIHRoaXMgaXMgdXNlZnVsbCkNCiAgICAtIE5ldyBhdHRyaWJ1dGUgUENMWklQX0FUVF9GSUxFX0NPTlRFTlQgZ2l2ZXMgdGhlIGFiaWxpdHkgdG8gYWRkIGEgc3RyaW5nIA0KICAgICAgYXMgYSBmaWxlLg0KICAgIC0gTmV3IGF0dHJpYnV0ZSBQQ0xaSVBfQVRUX0ZJTEVfTVRJTUUgbW9kaWZ5IHRoZSB0aW1lc3RhbXAgYXNzb2NpYXRlZCB3aXRoDQogICAgICBhIGZpbGUuDQogICAgLSBDb3JyZWN0IGEgYnVnLiBGaWxlcyBhcmNoaXZlZCB3aXRoIGEgdGltZXN0YW1wIHdpdGggMGgwbTBzIHdlcmUgZXh0cmFjdGVkDQogICAgICB3aXRoIGN1cnJlbnQgdGltZQ0KICAgIC0gQWRkIENSQyB2YWx1ZSBpbiB0aGUgaW5mb3JtYXRpb25zIHJldHVybmVkIGJhY2sgZm9yIGVhY2ggZmlsZSBhZnRlciBhbg0KICAgICAgYWN0aW9uLg0KICAgIC0gQWRkIG1pc3NpbmcgY2xvc2VkaXIoKSBzdGF0ZW1lbnQuDQogICAgLSBXaGVuIGFkZGluZyBhIGZvbGRlciwgYW5kIHJlbW92aW5nIHRoZSBwYXRoIG9mIHRoaXMgZm9sZGVyLCBmaWxlcyB3ZXJlDQogICAgICBpbmNvcnJlY3RseSBhZGRlZCB3aXRoIGEgJy8nIGF0IHRoZSBiZWdpbm5pbmcuIFdoaWNoIG1lYW5zIGZpbGVzIGFyZSANCiAgICAgIHJlbGF0ZWQgdG8gcm9vdCBpbiB1bml4IHN5c3RlbXMuIENvcnJlY3RlZC4NCiAgICAtIEFkZCBjb25kaXRpb25hbCBpZiBiZWZvcmUgY29uc3RhbnQgZGVmaW5pdGlvbi4gVGhpcyB3aWxsIGFsbG93IHVzZXJzDQogICAgICB0byByZWRlZmluZSBjb25zdGFudHMgd2l0aG91dCBjaGFuZ2luZyB0aGUgZmlsZSwgYW5kIHRoZW4gaW1wcm92ZQ0KICAgICAgdXBncmFkZSBvZiBwY2x6aXAgY29kZSBmb3IgbmV3IHZlcnNpb25zLg0KICANCiAgVmVyc2lvbiAyLjUgOg0KICAgIC0gSW50cm9kdWNlIHRoZSBhYmlsaXR5IHRvIGFkZCBmaWxlL2ZvbGRlciB3aXRoIGluZGl2aWR1YWwgcHJvcGVydGllcyAoZmlsZSBkZXNjcmlwdG9yKS4NCiAgICAgIFRoaXMgZ2l2ZXMgZm9yIGV4YW1wbGUgdGhlIGFiaWxpdHkgdG8gY2hhbmdlIHRoZSBmaWxlbmFtZSBvZiBhIHppcHBlZCBmaWxlLg0KICAgICAgLiBBYmxlIHRvIGFkZCBmaWxlcyBpbmRpdmlkdWFsbHkNCiAgICAgIC4gQWJsZSB0byBjaGFuZ2UgZnVsbCBuYW1lDQogICAgICAuIEFibGUgdG8gY2hhbmdlIHNob3J0IG5hbWUNCiAgICAgIC4gQ29tcGF0aWJsZSB3aXRoIGdsb2JhbCBvcHRpb25zDQogICAgLSBOZXcgYXR0cmlidXRlcyA6IFBDTFpJUF9BVFRfRklMRV9OQU1FLCBQQ0xaSVBfQVRUX0ZJTEVfTkVXX1NIT1JUX05BTUUsIFBDTFpJUF9BVFRfRklMRV9ORVdfRlVMTF9OQU1FDQogICAgLSBOZXcgZXJyb3IgY29kZSA6IFBDTFpJUF9FUlJfSU5WQUxJRF9BVFRSSUJVVEVfVkFMVUUNCiAgICAtIEFkZCBhIHNlY3VyaXR5IGNvbnRyb2wgZmVhdHVyZS4gUGNsWmlwIGNhbiBleHRyYWN0IGFueSBmaWxlIGluIGFueSBmb2xkZXINCiAgICAgIG9mIGEgc3lzdGVtLiBQZW9wbGUgbWF5IHVzZSB0aGlzIHRvIHVwbG9hZCBhIHppcCBmaWxlIGFuZCB0cnkgdG8gb3ZlcnJpZGUNCiAgICAgIGEgc3lzdGVtIGZpbGUuIFRoZSBQQ0xaSVBfT1BUX0VYVFJBQ1RfRElSX1JFU1RSSUNUSU9OIHdpbGwgZ2l2ZSB0aGUNCiAgICAgIGFiaWxpdHkgdG8gZm9yZ2l2ZSBhbnkgZGlyZWN0b3J5IHRyYW5zdmVyc2FsIGJlaGF2aW9yLg0KICAgIC0gTmV3IFBDTFpJUF9PUFRfRVhUUkFDVF9ESVJfUkVTVFJJQ1RJT04gOiBjaGVjayBleHRyYWN0aW9uIHBhdGgNCiAgICAtIE5ldyBlcnJvciBjb2RlIDogUENMWklQX0VSUl9ESVJFQ1RPUllfUkVTVFJJQ1RJT04NCiAgICAtIE1vZGlmaWNhdGlvbiBpbiBQY2xaaXBVdGlsUGF0aEluY2x1c2lvbigpIDogZGlyIGFuZCBwYXRoIGJlZ2lubmluZyB3aXRoIC4vIHdpbGwgYmUgcHJlcGVuZA0KICAgICAgYnkgY3VycmVudCBwYXRoIChnZXRjd2QoKSkNCiAgDQogIFZlcnNpb24gMi40IDoNCiAgICAtIENvZGUgaW1wcm92bWVudCA6IHRyeSB0byBzcGVlZCB1cCB0aGUgY29kZSBieSByZW1vdmluZyB1bnVzZWZ1bGwgY2FsbCB0byBwYWNrKCkNCiAgICAtIENvcnJlY3QgYnVnIGluIGRlbGV0ZSgpIDogZGVsZXRlKCkgc2hvdWxkIGJlIGNhbGxlZCB3aXRoIG5vIGFyZ3VtZW50LiBUaGlzIHdhcyBub3QNCiAgICAgIHRoZSBjYXNlIGluIDIuMy4gVGhpcyBpcyBjb3JyZWN0ZWQgaW4gMi40Lg0KICAgIC0gQ29ycmVjdCBhIGJ1ZyBpbiBwYXRoX2luY2x1c2lvbiBmdW5jdGlvbi4gV2hlbiB0aGUgcGF0aCBoYXMgc2V2ZXJhbCAnLi4vLi4vJywgdGhlDQogICAgICByZXN1bHQgd2FzIGJhZC4NCiAgICAtIEFkZCBhIGNoZWNrIGZvciBtYWdpY19xdW90ZXNfcnVudGltZSBjb25maWd1cmF0aW9uLiBJZiBlbmFibGVkLCBQY2xaaXAgd2lsbCANCiAgICAgIGRpc2FibGUgaXQgd2hpbGUgd29ya2luZyBhbmQgZGV0IGl0IGJhY2sgdG8gaXRzIG9yaWdpbmFsIHZhbHVlLg0KICAgICAgVGhpcyByZXNvbHZlIGEgbG90cyBvZiBiYWQgZm9ybWF0ZWQgYXJjaGl2ZSBlcnJvcnMuDQogICAgLSBCdWcgY29ycmVjdGlvbiA6IFBjbFppcCBub3cgY29ycmVjdGx5IHVuemlwIGZpbGUgaW4gc29tZSBzcGVjaWZpYyBzaXR1YXRpb24sDQogICAgICB3aGVuIGNvbXByZXNzZWQgY29udGVudCBoYXMgc2FtZSBzaXplIGFzIHVuY29tcHJlc3NlZCBjb250ZW50Lg0KICAgIC0gQnVnIGNvcnJlY3Rpb24gOiBXaGVuIHNlbGVjdGluZyBvcHRpb24gJ1BDTFpJUF9PUFRfUkVNT1ZFX0FMTF9QQVRIJywgDQogICAgICBkaXJlY3RvcmllcyBhcmUgbm90IGFueSBtb3JlIGNyZWF0ZWQuDQogICAgLSBDb2RlIGltcHJvdm1lbnQgOiBjb3JyZWN0IHVuY2xvc2VkIG9wZW5kaXIoKSwgYmV0dGVyIGhhbmRsaW5nIG9mIC4gYW5kIC4uIGluDQogICAgICBsb29wcy4NCg0KDQogIFZlcnNpb24gMi4zIDoNCiAgICAtIENvcnJlY3QgYSBidWcgd2l0aCBQSFA1IDogYWZmZWN0aW5nIHRoZSB2YWx1ZSAweEZFNDlGRkUwIHRvIGEgdmFyaWFibGUgZG9lcyBub3QNCiAgICAgIGdpdmUgdGhlIHNhbWUgcmVzdWx0IGluIFBIUDQgYW5kIFBIUDUgLi4uLg0KDQogIFZlcnNpb24gMi4yIDoNCiAgICAtIFRyeSBkZXZlbG9wbWVudCBvZiBQQ0xaSVBfT1BUX0NSWVBUIC4uLi4uDQogICAgICBIb3dldmVyIHRoaXMgYmVjb21lcyB0byBhIHN0b3AuIFRvIGNyeXB0L2RlY3J5cHQgSSBuZWVkIHRvIG11bHRpcGx5IDIgbG9uZyBpbnRlZ2VycywNCiAgICAgIHRoZSByZXN1bHQgKGdyZWF0ZXIgdGhhbiBhIGxvbmcpIGlzIG5vdCBzdXBwb3J0ZWQgYnkgUEhQLiBFdmVuIHRoZSB1c2Ugb2YgYmNtYXRoDQogICAgICBmdW5jdGlvbnMgZG9lcyBub3QgaGVscC4gSSBkaWQgbm90IGZpbmQgeWV0IGEgc29sdXRpb24gLi4uOw0KICAgIC0gQWRkIG1pc3NpbmcgJy8nIGF0IGVuZCBvZiBkaXJlY3RvcnkgZW50cmllcw0KICAgIC0gQ2hlY2sgaXMgYSBmaWxlIGlzIGVuY3J5cHRlZCBvciBub3QuIFJldHVybnMgc3RhdHVzICd1bnN1cHBvcnRlZF9lbmNyeXB0aW9uJyBhbmQvb3INCiAgICAgIGVycm9yIGNvZGUgUENMWklQX0VSUl9VTlNVUFBPUlRFRF9FTkNSWVBUSU9OLg0KICAgIC0gQ29ycmVjdGVkIDogQmFkICJ2ZXJzaW9uIG5lZWQgdG8gZXh0cmFjdCIgZmllbGQgaW4gbG9jYWwgZmlsZSBoZWFkZXINCiAgICAtIEFkZCBwcml2YXRlIG1ldGhvZCBwcml2Q2hlY2tGaWxlSGVhZGVycygpIGluIG9yZGVyIHRvIGNoZWNrIGxvY2FsIGFuZCBjZW50cmFsDQogICAgICBmaWxlIGhlYWRlcnMuIFBjbFppcCBpcyBub3cgc3VwcG9ydGluZyBwdXJwb3NlIGJpdCBmbGFnIGJpdCAzLiBQdXJwb3NlIGJpdCBmbGFnIGJpdCAzIGdpdmVzDQogICAgICB0aGUgYWJpbGl0eSB0byBoYXZlIGEgbG9jYWwgZmlsZSBoZWFkZXIgd2l0aG91dCBzaXplLCBjb21wcmVzc2VkIHNpemUgYW5kIGNyYyBmaWxsZWQuDQogICAgLSBBZGQgYSBnZW5lcmljIHN0YXR1cyAnZXJyb3InIGZvciBmaWxlIHN0YXR1cw0KICAgIC0gQWRkIGNvbnRyb2wgb2YgY29tcHJlc3Npb24gdHlwZS4gUGNsWmlwIG9ubHkgc3VwcG9ydCBkZWZsYXRlIGNvbXByZXNzaW9uIG1ldGhvZC4NCiAgICAgIEJlZm9yZSB2Mi4yLCBQY2xaaXAgZG9lcyBub3QgY2hlY2sgdGhlIGNvbXByZXNzaW9uIG1ldGhvZCB1c2VkIGluIGFuIGFyY2hpdmUgd2hpbGUNCiAgICAgIGV4dHJhY3RpbmcuIFdpdGggdjIuMiBQY2xaaXAgcmV0dXJucyBhIG5ldyBlcnJvciBzdGF0dXMgZm9yIGEgZmlsZSB1c2luZyBhbiB1bnN1cHBvcnRlZA0KICAgICAgY29tcHJlc3Npb24gbWV0aG9kLiBOZXcgc3RhdHVzIGlzICJ1bnN1cHBvcnRlZF9jb21wcmVzc2lvbiIuIE5ldyBlcnJvciBjb2RlIGlzDQogICAgICBQQ0xaSVBfRVJSX1VOU1VQUE9SVEVEX0NPTVBSRVNTSU9OLg0KICAgIC0gQWRkIG9wdGlvbmFsIGF0dHJpYnV0ZSBQQ0xaSVBfT1BUX1NUT1BfT05fRVJST1IuIFRoaXMgd2lsbCBzdG9wIHRoZSBleHRyYWN0IG9mIGZpbGVzDQogICAgICB3aGVuIGVycm9ycyBsaWtlICdhIGZvbGRlciB3aXRoIHNhbWUgbmFtZSBleGlzdHMnIG9yICdhIG5ld2VyIGZpbGUgZXhpc3RzJyBvcg0KICAgICAgJ2Egd3JpdGUgcHJvdGVjdGVkIGZpbGUnIGV4aXN0cywgcmF0aGVyIHRoYW4gc2V0IGEgc3RhdHVzIGZvciB0aGUgY29uY2VybmluZyBmaWxlDQogICAgICBhbmQgcmVzdW1lIHRoZSBleHRyYWN0IG9mIHRoZSB6aXAuDQogICAgLSBBZGQgb3B0aW9uYWwgYXR0cmlidXRlIFBDTFpJUF9PUFRfUkVQTEFDRV9ORVdFUi4gVGhpcyB3aWxsIGZvcmNlLCBkdXJpbmcgYW4gZXh0cmFjdCcgdGhlDQogICAgICByZXBsYWNlbWVudCBvZiB0aGUgZmlsZSwgZXZlbiBpZiBhICBuZXdlciB2ZXJzaW9uIG9mIHRoZSBmaWxlIGV4aXN0cy4NCiAgICAgIE5vdGUgdGhhdCB0b2RheSBpZiBhIGZpbGUgd2l0aCB0aGUgc2FtZSBuYW1lIGFscmVhZHkgZXhpc3RzIGJ1dCBpcyBvbGRlciBpdCB3aWxsIGJlDQogICAgICByZXBsYWNlZCBieSB0aGUgZXh0cmFjdGVkIG9uZS4NCiAgICAtIEltcHJvdmUgUGNsWmlwVXRpbE9wdGlvbigpDQogICAgLSBTdXBwb3J0IG9mIHppcCBhcmNoaXZlIHdpdGggdHJhaWxpbmcgYnl0ZXMuIEJlZm9yZSAyLjIsIFBjbFppcCBjaGVja3MgdGhhdCB0aGUgY2VudHJhbA0KICAgICAgZGlyZWN0b3J5IHN0cnVjdHVyZSBpcyB0aGUgbGFzdCBkYXRhIGluIHRoZSBhcmNoaXZlLiBDcnlwdCBlbmNyeXB0aW9uL2RlY3J5cHRpb24gb2YNCiAgICAgIHppcCBhcmNoaXZlIHB1dCB0cmFpbGluZyAwIGJ5dGVzIGFmdGVyIGRlY3J5cHRpb24uIFBjbFppcCBpcyBub3cgc3VwcG9ydGluZyB0aGlzLg0KDQogIFZlcnNpb24gMi4xIDoNCiAgICAtIEFkZCB0aGUgYWJpbGl0eSB0byBhYm9ydCB0aGUgZXh0cmFjdGlvbiBieSB1c2luZyBhIHVzZXIgY2FsbGJhY2sgZnVuY3Rpb24uDQogICAgICBUaGUgdXNlciBjYW4gbm93IHJldHVybiB0aGUgdmFsdWUgJzInIGluIGl0cyBjYWxsYmFjayB3aGljaCBpbmRpY2F0ZXMgdG8gc3RvcCB0aGUNCiAgICAgIGV4dHJhY3Rpb24uIEZvciBhIHByZSBjYWxsLWJhY2sgZXh0cmFjdCBpcyBzdG9wcGVkIGJlZm9yZSB0aGUgZXh0cmF0aW9uIG9mIHRoZSBjdXJyZW50DQogICAgICBmaWxlLiBGb3IgYSBwb3N0IGNhbGwgYmFjaywgdGhlIGV4dHJhY3Rpb24gaXMgc3RvcHBlZCBhZnRlci4NCiAgICAtIEFkZCB0aGUgYWJpbGl0eSB0byBleHRyYWN0IGEgZmlsZSAob3Igc2V2ZXJhbCBmaWxlcykgZGlyZWN0bHkgaW4gdGhlIHN0YW5kYXJkIG91dHB1dC4NCiAgICAgIFRoaXMgaXMgZG9uZSBieSB0aGUgbmV3IHBhcmFtZXRlciBQQ0xaSVBfT1BUX0VYVFJBQ1RfSU5fT1VUUFVUIHdpdGggbWV0aG9kIGV4dHJhY3QoKS4NCiAgICAtIEFkZCBzdXBwb3J0IGZvciBwYXJhbWV0ZXJzIFBDTFpJUF9PUFRfQ09NTUVOVCwgUENMWklQX09QVF9BRERfQ09NTUVOVCwNCiAgICAgIFBDTFpJUF9PUFRfUFJFUEVORF9DT01NRU5ULiBUaGlzIHdpbGwgY3JlYXRlLCByZXBsYWNlLCBhZGQsIG9yIHByZXBlbmQgY29tbWVudHMNCiAgICAgIGluIHRoZSB6aXAgYXJjaGl2ZS4NCiAgICAtIFdoZW4gbWVyZ2luZyB0d28gYXJjaGl2ZXMsIHRoZSBjb21tZW50cyBhcmUgbm90IGFueSBtb3JlIGxvc3QsIGJ1dCBtZXJnZWQsIHdpdGggYSANCiAgICAgIGJsYW5rIHNwYWNlIHNlcGFyYXRvci4NCiAgICAtIENvcnJlY3RlZCBidWcgOiBGaWxlcyBhcmUgbm90IGRlbGV0ZWQgd2hlbiBhbGwgZmlsZXMgYXJlIGFza2VkIHRvIGJlIGRlbGV0ZWQuDQogICAgLSBDb3JyZWN0ZWQgYnVnIDogRm9sZGVycyB3aXRoIG5hbWUgJzAnIG1hZGUgUGNsWmlwIHRvIGFib3J0IHRoZSBjcmVhdGUgb3IgYWRkIGZlYXR1cmUuDQoNCg0KICBWZXJzaW9uIDIuMCA6DQogICAgKioqKiogV2FybmluZyA6IFNvbWUgbmV3IGZlYXR1cmVzIG1heSBicmVhayB0aGUgYmFja3dhcmQgY29tcGF0aWJpbGl0eSBmb3IgeW91ciBzY3JpcHRzLg0KICAgICAgICAgICAgICAgICAgICBQbGVhc2UgY2FyZWZ1bGx5IHJlYWQgdGhlIHJlYWRtZSBmaWxlLg0KICAgIC0gQWRkIHRoZSBhYmlsaXR5IHRvIGRlbGV0ZSBieSBJbmRleCwgbmFtZSBhbmQgcmVndWxhciBleHByZXNzaW9uLiBUaGlzIGZlYXR1cmUgaXMgDQogICAgICBwZXJmb3JtZWQgYnkgdGhlIG1ldGhvZCBkZWxldGUoKSwgd2hpY2ggdXNlcyB0aGUgb3B0aW9uYWwgcGFyYW1ldGVycw0KICAgICAgUENMWklQX09QVF9CWV9JTkRFWCwgUENMWklQX09QVF9CWV9OQU1FLCBQQ0xaSVBfT1BUX0JZX0VSRUcgb3IgUENMWklQX09QVF9CWV9QUkVHLg0KICAgIC0gQWRkIHRoZSBhYmlsaXR5IHRvIGV4dHJhY3QgYnkgcmVndWxhciBleHByZXNzaW9uLiBUbyBleHRyYWN0IGJ5IHJlZ2V4cCB5b3UgbXVzdCB1c2UgdGhlIG1ldGhvZA0KICAgICAgZXh0cmFjdCgpLCB3aXRoIHRoZSBvcHRpb24gUENMWklQX09QVF9CWV9FUkVHIG9yIFBDTFpJUF9PUFRfQllfUFJFRyANCiAgICAgIChkZXBlbmRpbmcgaWYgeW91IHdhbnQgdG8gdXNlIGVyZWcoKSBvciBwcmVnX21hdGNoKCkgc3ludGF4KSBmb2xsb3dlZCBieSB0aGUgDQogICAgICByZWd1bGFyIGV4cHJlc3Npb24gcGF0dGVybi4NCiAgICAtIEFkZCB0aGUgYWJpbGl0eSB0byBleHRyYWN0IGJ5IGluZGV4LCBkaXJlY3RseSB3aXRoIHRoZSBleHRyYWN0KCkgbWV0aG9kLiBUaGlzIGlzIGENCiAgICAgIGNvZGUgaW1wcm92bWVudCBvZiB0aGUgZXh0cmFjdEJ5SW5kZXgoKSBtZXRob2QuDQogICAgLSBBZGQgdGhlIGFiaWxpdHkgdG8gZXh0cmFjdCBieSBuYW1lLiBUbyBleHRyYWN0IGJ5IG5hbWUgeW91IG11c3QgdXNlIHRoZSBtZXRob2QNCiAgICAgIGV4dHJhY3QoKSwgd2l0aCB0aGUgb3B0aW9uIFBDTFpJUF9PUFRfQllfTkFNRSBmb2xsb3dlZCBieSB0aGUgZmlsZW5hbWUgdG8NCiAgICAgIGV4dHJhY3Qgb3IgYW4gYXJyYXkgb2YgZmlsZW5hbWVzIHRvIGV4dHJhY3QuIFRvIGV4dHJhY3QgYWxsIGEgZm9sZGVyLCB1c2UgdGhlIGZvbGRlcg0KICAgICAgbmFtZSByYXRoZXIgdGhhbiB0aGUgZmlsZW5hbWUgd2l0aCBhICcvJyBhdCB0aGUgZW5kLg0KICAgIC0gQWRkIHRoZSBhYmlsaXR5IHRvIGFkZCBmaWxlcyB3aXRob3V0IGNvbXByZXNzaW9uLiBUaGlzIGlzIGRvbmUgd2l0aCBhIG5ldyBhdHRyaWJ1dGUNCiAgICAgIHdoaWNoIGlzIFBDTFpJUF9PUFRfTk9fQ09NUFJFU1NJT04uDQogICAgLSBBZGQgdGhlIGF0dHJpYnV0ZSBQQ0xaSVBfT1BUX0VYVFJBQ1RfQVNfU1RSSU5HLCB3aGljaCBhbGxvdyB0byBleHRyYWN0IGEgZmlsZSBkaXJlY3RseQ0KICAgICAgaW4gYSBzdHJpbmcgd2l0aG91dCB1c2luZyBhbnkgZmlsZSAob3IgdGVtcG9yYXJ5IGZpbGUpLg0KICAgIC0gQWRkIGNvbnN0YW50IFBDTFpJUF9TRVBBUkFUT1IgZm9yIHN0YXRpYyBjb25maWd1cmF0aW9uIG9mIGZpbGVuYW1lIHNlcGFyYXRvcnMgaW4gYSBzaW5nbGUgc3RyaW5nLg0KICAgICAgVGhlIGRlZmF1bHQgc2VwYXJhdG9yIGlzIG5vdyBhIGNvbW1hICgsKSBhbmQgbm90IGFueSBtb3JlIGEgYmxhbmsgc3BhY2UuDQogICAgICBUSElTIEJSRUFLIFRIRSBCQUNLV0FSRCBDT01QQVRJQklMSVRZIDogUGxlYXNlIGNoZWNrIGlmIHRoaXMgbWF5IGhhdmUgYW4gaW1wYWN0IHdpdGgNCiAgICAgIHlvdXIgc2NyaXB0Lg0KICAgIC0gSW1wcm92ZSBhbGdvcnl0aG0gcGVyZm9ybWFuY2UgYnkgcmVtb3ZpbmcgdGhlIHVzZSBvZiB0ZW1wb3JhcnkgZmlsZXMgd2hlbiBhZGRpbmcgb3IgDQogICAgICBleHRyYWN0aW5nIGZpbGVzIGluIGFuIGFyY2hpdmUuDQogICAgLSBBZGQgKGNvcnJlY3QpIGRldGVjdGlvbiBvZiBlbXB0eSBmaWxlbmFtZSB6aXBwaW5nLiBUaGlzIGNhbiBvY2N1cnMgd2hlbiB0aGUgcmVtb3ZlZA0KICAgICAgcGF0aCBpcyB0aGUgc2FtZQ0KICAgICAgYXMgYSB6aXBwZWQgZGlyLiBUaGUgZGlyIGlzIG5vdCB6aXBwZWQgKFsnc3RhdHVzJ10gPSBmaWx0ZXJlZCksIG9ubHkgaXRzIGNvbnRlbnQuDQogICAgLSBBZGQgYmV0dGVyIHN1cHBvcnQgZm9yIHdpbmRvd3MgcGF0aHMgKHRoYW5rcyBmb3IgaGVscCBmcm9tIG1hbnVzQG1hbnVzZnJlZWRvbS5jb20pLg0KICAgIC0gQ29ycmVjdGVkIGJ1ZyA6IFdoZW4gdGhlIGFyY2hpdmUgZmlsZSBhbHJlYWR5IGV4aXN0cyB3aXRoIHNpemU9MCwgdGhlIGFkZCgpIG1ldGhvZA0KICAgICAgZmFpbHMuIENvcnJlY3RlZCBpbiAyLjAuDQogICAgLSBSZW1vdmUgdGhlIHVzZSBvZiBPU19XSU5ET1dTIGNvbnN0YW50LiBVc2UgcGhwX3VuYW1lKCkgZnVuY3Rpb24gcmF0aGVyLg0KICAgIC0gQ29udHJvbCB0aGUgb3JkZXIgb2YgaW5kZXggcmFuZ2VzIGluIGV4dHJhY3QgYnkgaW5kZXggZmVhdHVyZS4NCiAgICAtIENoYW5nZSB0aGUgaW50ZXJuYWwgbWFuYWdlbWVudCBvZiBmb2xkZXJzIChiZXR0ZXIgaGFuZGxpbmcgb2YgaW50ZXJuYWwgZmxhZykuDQoNCg0KICBWZXJzaW9uIDEuMyA6DQogICAgLSBSZW1vdmluZyB0aGUgZG91YmxlIGluY2x1ZGUgY2hlY2suIFRoaXMgaXMgbm93IGRvbmUgYnkgaW5jbHVkZV9vbmNlKCkgYW5kIHJlcXVpcmVfb25jZSgpDQogICAgICBQSFAgZGlyZWN0aXZlcy4NCiAgICAtIENoYW5naW5nIHRoZSBlcnJvciBoYW5kbGluZyBtZWNhbmlzbSA6IFJlbW92ZSB0aGUgdXNlIG9mIGFuIGV4dGVybmFsIGVycm9yIGxpYnJhcnkuDQogICAgICBUaGUgZm9ybWVyIFBjbEVycm9yLi4uKCkgZnVuY3Rpb25zIGFyZSByZXBsYWNlZCBieSBpbnRlcm5hbCBlcXVpdmFsZW50IG1ldGhvZHMuDQogICAgICBCeSBjaGFuZ2luZyB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgUENMWklQX0VSUk9SX0VYVEVSTkFMIHlvdSBjYW4gc3RpbGwgdXNlIHRoZSBmb3JtZXIgbGlicmFyeS4NCiAgICAgIEludHJvZHVjaW5nIHRoZSB1c2Ugb2YgY29uc3RhbnRzIGZvciBlcnJvciBjb2RlcyByYXRoZXIgdGhhbiBpbnRlZ2VyIHZhbHVlcy4gVGhpcyB3aWxsIGhlbHANCiAgICAgIGluIGZ1dHVyIGltcHJvdm1lbnQuDQogICAgICBJbnRyb2R1Y3Rpb24gb2YgZXJyb3IgaGFuZGxpbmcgZnVuY3Rpb25zIGxpa2UgZXJyb3JDb2RlKCksIGVycm9yTmFtZSgpIGFuZCBlcnJvckluZm8oKS4NCiAgICAtIFJlbW92ZSB0aGUgZGVwcmVjYXRlZCB1c2Ugb2YgY2FsbGluZyBmdW5jdGlvbiB3aXRoIGFyZ3VtZW50cyBwYXNzZWQgYnkgcmVmZXJlbmNlLg0KICAgIC0gQWRkIHRoZSBjYWxsaW5nIG9mIGV4dHJhY3QoKSwgZXh0cmFjdEJ5SW5kZXgoKSwgY3JlYXRlKCkgYW5kIGFkZCgpIGZ1bmN0aW9ucw0KICAgICAgd2l0aCB2YXJpYWJsZSBvcHRpb25zIHJhdGhlciB0aGFuIGZpeGVkIGFyZ3VtZW50cy4NCiAgICAtIEFkZCB0aGUgYWJpbGl0eSB0byByZW1vdmUgYWxsIHRoZSBmaWxlIHBhdGggd2hpbGUgZXh0cmFjdGluZyBvciBhZGRpbmcsDQogICAgICB3aXRob3V0IGFueSBuZWVkIHRvIHNwZWNpZnkgdGhlIHBhdGggdG8gcmVtb3ZlLg0KICAgICAgVGhpcyBpcyBhdmFpbGFibGUgZm9yIGV4dHJhY3QoKSwgZXh0cmFjdEJ5SW5kZXgoKSwgY3JlYXRlKCkgYW5kIGFkZCgpIGZ1bmN0aW9uUyBieSB1c2luZw0KICAgICAgdGhlIG5ldyB2YXJpYWJsZSBvcHRpb25zIHBhcmFtZXRlcnMgOg0KICAgICAgLSBQQ0xaSVBfT1BUX1JFTU9WRV9BTExfUEFUSCA6IGJ5IGluZGljYXRpbmcgdGhpcyBvcHRpb24gd2hpbGUgY2FsbGluZyB0aGUgZmN0Lg0KICAgIC0gQWJpbGl0eSB0byBjaGFuZ2UgdGhlIG1vZGUgb2YgYSBmaWxlIGFmdGVyIHRoZSBleHRyYWN0aW9uIChjaG1vZCgpKS4NCiAgICAgIFRoaXMgaXMgYXZhaWxhYmxlIGZvciBleHRyYWN0KCkgYW5kIGV4dHJhY3RCeUluZGV4KCkgZnVuY3Rpb25TIGJ5IHVzaW5nDQogICAgICB0aGUgbmV3IHZhcmlhYmxlIG9wdGlvbnMgcGFyYW1ldGVycy4NCiAgICAgIC0gUENMWklQX09QVF9TRVRfQ0hNT0QgOiBieSBzZXR0aW5nIHRoZSB2YWx1ZSBvZiB0aGlzIG9wdGlvbi4NCiAgICAtIEFiaWxpdHkgdG8gZGVmaW5pdGlvbiBjYWxsLWJhY2sgb3B0aW9ucy4gVGhlc2UgY2FsbC1iYWNrIHdpbGwgYmUgY2FsbGVkIGR1cmluZyB0aGUgYWRkaW5nLA0KICAgICAgb3IgdGhlIGV4dHJhY3Rpbmcgb2YgZmlsZSAoZXh0cmFjdCgpLCBleHRyYWN0QnlJbmRleCgpLCBjcmVhdGUoKSBhbmQgYWRkKCkgZnVuY3Rpb25zKSA6DQogICAgICAtIFBDTFpJUF9DQl9QUkVfRVhUUkFDVCA6IHdpbGwgYmUgY2FsbGVkIGJlZm9yZSBlYWNoIGV4dHJhY3Rpb24gb2YgYSBmaWxlLiBUaGUgdXNlcg0KICAgICAgICBjYW4gdHJpZ2VycmVkIHRoZSBjaGFuZ2UgdGhlIGZpbGVuYW1lIG9mIHRoZSBleHRyYWN0ZWQgZmlsZS4gVGhlIHVzZXIgY2FuIHRyaWdnZXJlZCB0aGUNCiAgICAgICAgc2tpcCBvZiB0aGUgZXh0cmFjdGlvbi4gVGhpcyBpcyBhZGRpbmcgYSAnc2tpcHBlZCcgc3RhdHVzIGluIHRoZSBmaWxlIGxpc3QgcmVzdWx0IHZhbHVlLg0KICAgICAgLSBQQ0xaSVBfQ0JfUE9TVF9FWFRSQUNUIDogd2lsbCBiZSBjYWxsZWQgYWZ0ZXIgZWFjaCBleHRyYWN0aW9uIG9mIGEgZmlsZS4NCiAgICAgICAgTm90aGluZyBjYW4gYmUgdHJpZ2dlcmVkIGZyb20gdGhhdCBwb2ludC4NCiAgICAgIC0gUENMWklQX0NCX1BSRV9BREQgOiB3aWxsIGJlIGNhbGxlZCBiZWZvcmUgZWFjaCBhZGQgb2YgYSBmaWxlLiBUaGUgdXNlcg0KICAgICAgICBjYW4gdHJpZ2VycmVkIHRoZSBjaGFuZ2UgdGhlIHN0b3JlZCBmaWxlbmFtZSBvZiB0aGUgYWRkZWQgZmlsZS4gVGhlIHVzZXIgY2FuIHRyaWdnZXJlZCB0aGUNCiAgICAgICAgc2tpcCBvZiB0aGUgYWRkLiBUaGlzIGlzIGFkZGluZyBhICdza2lwcGVkJyBzdGF0dXMgaW4gdGhlIGZpbGUgbGlzdCByZXN1bHQgdmFsdWUuDQogICAgICAtIFBDTFpJUF9DQl9QT1NUX0FERCA6IHdpbGwgYmUgY2FsbGVkIGFmdGVyIGVhY2ggYWRkIG9mIGEgZmlsZS4NCiAgICAgICAgTm90aGluZyBjYW4gYmUgdHJpZ2dlcmVkIGZyb20gdGhhdCBwb2ludC4NCiAgICAtIFR3byBzdGF0dXMgYXJlIGFkZGVkIGluIHRoZSBmaWxlIGxpc3QgcmV0dXJuZWQgYXMgZnVuY3Rpb24gcmVzdWx0IDogc2tpcHBlZCAmIGZpbGVuYW1lX3Rvb19sb25nDQogICAgICAnc2tpcHBlZCcgaXMgdXNlZCB3aGVuIGEgY2FsbC1iYWNrIGZ1bmN0aW9uIGFzayBmb3Igc2tpcHBpbmcgdGhlIGZpbGUuDQogICAgICAnZmlsZW5hbWVfdG9vX2xvbmcnIGlzIHVzZWQgd2hpbGUgYWRkaW5nIGEgZmlsZSB3aXRoIGEgdG9vIGxvbmcgZmlsZW5hbWUgdG8gYXJjaGl2ZSAodGhlIGZpbGUgaXMNCiAgICAgIG5vdCBhZGRlZCkNCiAgICAtIEFkZGluZyB0aGUgZnVuY3Rpb24gUGNsWmlwVXRpbFBhdGhJbmNsdXNpb24oKSwgdGhhdCBjaGVjayB0aGUgaW5jbHVzaW9uIG9mIGEgcGF0aCBpbnRvDQogICAgICBhIGRpcmVjdG9yeS4NCiAgICAtIEFkZCBhIGNoZWNrIG9mIHRoZSBwcmVzZW5jZSBvZiB0aGUgYXJjaGl2ZSBmaWxlIGJlZm9yZSBzb21lIGFjdGlvbnMgKGxpa2UgbGlzdCwgLi4uKQ0KICAgIC0gQWRkIHRoZSBpbml0aWFsaXNhdGlvbiBvZiBmaWVsZCAiaW5kZXgiIGluIGhlYWRlciBhcnJheS4gVGhpcyBtZWFucyB0aGF0IGJ5DQogICAgICBkZWZhdWx0IGluZGV4IHdpbGwgYmUgLTEgd2hlbiBub3QgZXhwbGljaXRseSBzZXQgYnkgdGhlIG1ldGhvZHMuDQoNCiAgVmVyc2lvbiAxLjIgOg0KICAgIC0gQWRkaW5nIGEgZHVwbGljYXRlIGZ1bmN0aW9uLg0KICAgIC0gQWRkaW5nIGEgbWVyZ2UgZnVuY3Rpb24uIFRoZSBtZXJnZSBmdW5jdGlvbiBpcyBhICJxdWljayBtZXJnZSIgZnVuY3Rpb24sDQogICAgICBpdCBqdXN0IGFwcGVuZCB0aGUgY29udGVudCBvZiBhbiBhcmNoaXZlIGF0IHRoZSBlbmQgb2YgdGhlIGZpcnN0IG9uZS4gVGhlcmUNCiAgICAgIGlzIG5vIGNoZWNrIGZvciBkdXBsaWNhdGUgZmlsZXMgb3IgbW9yZSByZWNlbnQgZmlsZXMuDQogICAgLSBJbXByb3ZlIHRoZSBzZWFyY2ggb2YgdGhlIGNlbnRyYWwgZGlyZWN0b3J5IGVuZC4NCg0KICBWZXJzaW9uIDEuMS4yIDoNCg0KICAgIC0gQ2hhbmdpbmcgdGhlIGxpY2Vuc2Ugb2YgUGNsWmlwLiBQY2xaaXAgaXMgbm93IHJlbGVhc2VkIHVuZGVyIHRoZSBHTlUgLyBMR1BMIGxpY2Vuc2UNCiAgICAgIChzZWUgTGljZW5zZSBzZWN0aW9uKS4NCiAgICAtIEFkZGluZyB0aGUgb3B0aW9uYWwgc3VwcG9ydCBvZiBhIHN0YXRpYyB0ZW1wb3JhcnkgZGlyZWN0b3J5LiBZb3Ugd2lsbCBuZWVkIHRvIGNvbmZpZ3VyZQ0KICAgICAgdGhlIGNvbnN0YW50IFBDTFpJUF9URU1QT1JBUllfRElSIGlmIHlvdSB3YW50IHRvIHVzZSB0aGlzIGZlYXR1cmUuDQogICAgLSBJbXByb3ZpbmcgdGhlIHJlbmFtZSgpIGZ1bmN0aW9uLiBJbiBzb21lIGNhc2VzIHJlbmFtZSgpIGRvZXMgbm90IHdvcmsgKGRpZmZlcmVudA0KICAgICAgRmlsZXN5c3RlbXMpLCBzbyBpdCB3aWxsIGJlIHJlcGxhY2VkIGJ5IGEgY29weSgpICsgdW5saW5rKCkgZnVuY3Rpb25zLg0KDQogIFZlcnNpb24gMS4xLjEgOg0KDQogICAgLSBNYWludGVuYW5jZSByZWxlYXNlLCBubyBuZXcgZmVhdHVyZS4NCg0KICBWZXJzaW9uIDEuMSA6DQoNCiAgICAtIE5ldyBtZXRob2QgQWRkKCkgOiBhZGRpbmcgZmlsZXMgaW4gdGhlIGFyY2hpdmUNCiAgICAtIE5ldyBtZXRob2QgRXh0cmFjdEJ5SW5kZXgoKSA6IHBhcnRpYWwgZXh0cmFjdCBvZiB0aGUgYXJjaGl2ZSwgZmlsZXMgYXJlIGlkZW50aWZpZWQgYnkNCiAgICAgIHRoZWlyIGluZGV4IGluIHRoZSBhcmNoaXZlDQogICAgLSBOZXcgbWV0aG9kIERlbGV0ZUJ5SW5kZXgoKSA6IGRlbGV0ZSBzb21lIGZpbGVzL2ZvbGRlciBlbnRyaWVzIGZyb20gdGhlIGFyY2hpdmUsDQogICAgICBmaWxlcyBhcmUgaWRlbnRpZmllZCBieSB0aGVpciBpbmRleCBpbiB0aGUgYXJjaGl2ZS4NCiAgICAtIEFkZGluZyBhIHRlc3Qgb2YgdGhlIHpsaWIgZXh0ZW5zaW9uIHByZXNlbmNlLiBJZiBub3QgcHJlc2VudCBhYm9ydCB0aGUgc2NyaXB0Lg0KDQogIFZlcnNpb24gMS4wLjEgOg0KDQogICAgLSBObyBuZXcgZmVhdHVyZQ0KDQoNCjMgLSBDb3JyZWN0ZWQgYnVncw0KPT09PT09PT09PT09PT09PT09DQoNCiAgQ29ycmVjdGVkIGluIFZlcnNpb24gMi4wIDoNCiAgICAtIENvcnJlY3RlZCA6IER1cmluZyBhbiBleHRyYWN0aW9uLCBpZiBhIGNhbGwtYmFjayBmdWNudGlvbiBpcyB1c2VkIGFuZCB0cnkgdG8gc2tpcA0KICAgICAgICAgICAgICAgICAgYSBmaWxlLCBhbGwgdGhlIGV4dHJhY3Rpb24gcHJvY2VzcyBpcyBzdG9wcGVkLiANCg0KICBDb3JyZWN0ZWQgaW4gVmVyc2lvbiAxLjMgOg0KICAgIC0gQ29ycmVjdGVkIDogU3VwcG9ydCBvZiBzdGF0aWMgc3lub3BzaXMgZm9yIG1ldGhvZCBleHRyYWN0KCkgaXMgYnJva2VuLg0KICAgIC0gQ29ycmVjdGVkIDogaW52YWxpZCBzaXplIG9mIGFyY2hpdmUgY29udGVudCBmaWVsZCAoMHhGRikgc2hvdWxkIGJlICgweEZGRkYpLg0KICAgIC0gQ29ycmVjdGVkIDogV2hlbiBhbiBleHRyYWN0IGlzIGRvbmUgd2l0aCBhIHJlbW92ZV9wYXRoIHBhcmFtZXRlciwgdGhlIGVudHJ5IGZvcg0KICAgICAgdGhlIGRpcmVjdG9yeSB3aXRoIGV4YWN0bHkgdGhlIHNhbWUgcGF0aCBpcyBub3Qgc2tpcHBlZC9maWx0ZXJlZC4NCiAgICAtIENvcnJlY3RlZCA6IGV4dHJhY3RCeUluZGV4KCkgYW5kIGRlbGV0ZUJ5SW5kZXgoKSB3ZXJlIG5vdCBtYW5hZ2luZyBpbmRleCBpbiB0aGUNCiAgICAgIHJpZ2h0IHdheS4gRm9yIGV4YW1wbGUgaW5kZXhlcyAnMSwzLTUsMTEnIHdpbGwgb25seSBleHRyYWN0IGZpbGVzIDEgYW5kIDExLiBUaGlzDQogICAgICBpcyBkdWUgdG8gYSBzb3J0IG9mIHRoZSBpbmRleCByZXN1bHRpbmcgdGFibGUgdGhhdCBwdXRzIDExIGJlZm9yZSAzLTUgKHNvcnQgb24NCiAgICAgIHN0cmluZyBhbmQgbm90IGludGVyZ2VyKS4gVGhlIHNvcnQgaXMgdGVtcG9yYXJpbGx5IHJlbW92ZWQsIHRoaXMgbWVhbnMgdGhhdA0KICAgICAgeW91IG11c3QgcHJvdmlkZSBhIHNvcnRlZCBsaXN0IG9mIGluZGV4IHJhbmdlcy4NCg0KICBDb3JyZWN0ZWQgaW4gVmVyc2lvbiAxLjIgOg0KDQogICAgLSBOb3RoaW5nLg0KDQogIENvcnJlY3RlZCBpbiBWZXJzaW9uIDEuMS4yIDoNCg0KICAgIC0gQ29ycmVjdGVkIDogV2luemlwIGlzIHVuYWJsZSB0byBkZWxldGUgb3IgYWRkIG5ldyBmaWxlcyBpbiBhIFBjbFppcCBjcmVhdGVkIGFyY2hpdmVzLg0KDQogIENvcnJlY3RlZCBpbiBWZXJzaW9uIDEuMS4xIDoNCg0KICAgIC0gQ29ycmVjdGVkIDogV2hlbiBhcmNoaXZlZCBmaWxlIGlzIG5vdCBjb21wcmVzc2VkICgwJSBjb21wcmVzc2lvbiksIHRoZQ0KICAgICAgZXh0cmFjdCBtZXRob2QgZmFpbHMuDQoNCiAgQ29ycmVjdGVkIGluIFZlcnNpb24gMS4xIDoNCg0KICAgIC0gQ29ycmVjdGVkIDogQWRkaW5nIGEgY29tcGxldGUgdHJlZSBvZiBmb2xkZXIgbWF5IHJlc3VsdCBpbiBhIGJhZCBhcmNoaXZlDQogICAgICBjcmVhdGlvbi4NCg0KICBDb3JyZWN0ZWQgaW4gVmVyc2lvbiAxLjAuMSA6DQoNCiAgICAtIENvcnJlY3RlZCA6IEVycm9yIHdoaWxlIGNvbXByZXNzaW5nIGZpbGVzIGdyZWF0ZXIgdGhhbiBQQ0xaSVBfUkVBRF9CTE9DS19TSVpFIChkZWZhdWx0PTEwMjQpLg0KDQoNCjQgLSBLbm93biBidWdzIG9yIGxpbWl0YXRpb25zDQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KDQogIFBsZWFzZSBwdWJsaXNoIGJ1Z3MgcmVwb3J0cyBpbiBTb3VyY2VGb3JnZSA6DQogICAgaHR0cDovL3NvdXJjZWZvcmdlLm5ldC90cmFja2VyLz9ncm91cF9pZD00MDI1NCZhdGlkPTQyNzU2NA0KDQogIEluIFZlcnNpb24gMi54IDoNCiAgICAtIFBjbFppcCBkb2VzIG9ubHkgc3VwcG9ydCBmaWxlIHVuY29tcHJlc3NlZCBvciBjb21wcmVzc2VkIHdpdGggZGVmbGF0ZSAoY29tcHJlc3Npb24gbWV0aG9kIDgpDQogICAgLSBQY2xaaXAgZG9lcyBub3Qgc3VwcG9ydCBwYXNzd29yZCBwcm90ZWN0ZWQgemlwIGFyY2hpdmUNCiAgICAtIFNvbWUgY29uY2VybiB3ZXJlIHNlZW4gd2hlbiBjaGFuZ2luZyBtdGltZSBvZiBhIGZpbGUgd2hpbGUgYXJjaGl2aW5nLiANCiAgICAgIFNlZW1zIHRvIGJlIGxpbmtlZCB0byBEYXlsaWdodCBTYXZpbmcgVGltZSAoUGNsVGVzdF9jaGFuZ2luZ19tdGltZSkuDQoNCiAgSW4gVmVyc2lvbiAxLjIgOg0KDQogICAgLSBtZXJnZSgpIG1ldGhvZHMgZG9lcyBub3QgY2hlY2sgZm9yIGR1cGxpY2F0ZSBmaWxlcyBvciBsYXN0IGRhdGUgb2YgbW9kaWZpY2F0aW9ucy4NCg0KICBJbiBWZXJzaW9uIDEuMSA6DQoNCiAgICAtIExpbWl0YXRpb24gOiBVc2luZyAnZXh0cmFjdCcgZmllbGRzIGluIHRoZSBmaWxlIGhlYWRlciBpbiB0aGUgemlwIGFyY2hpdmUgaXMgbm90IHN1cHBvcnRlZC4NCiAgICAtIFdpblppcCBpcyB1bmFibGUgdG8gZGVsZXRlIGEgc2luZ2xlIGZpbGUgaW4gYSBQY2xaaXAgY3JlYXRlZCBhcmNoaXZlLiBJdCBpcyBhbHNvIHVuYWJsZSB0bw0KICAgICAgYWRkIGEgZmlsZSBpbiBhIFBjbFppcCBjcmVhdGVkIGFyY2hpdmUuIChDb3JyZWN0ZWQgaW4gdi4xLjIpDQoNCiAgSW4gVmVyc2lvbiAxLjAuMSA6DQoNCiAgICAtIEFkZGluZyBhIGNvbXBsZXRlIHRyZWUgb2YgZm9sZGVyIG1heSByZXN1bHQgaW4gYSBiYWQgYXJjaGl2ZQ0KICAgICAgY3JlYXRpb24uIChDb3JyZWN0ZWQgaW4gVi4xLjEpLg0KICAgIC0gUGF0aCBnaXZlbiB0byBtZXRob2RzIG11c3QgYmUgaW4gdGhlIHVuaXggZm9ybWF0ICgvKSBhbmQgbm90IHRoZSBXaW5kb3dzIGZvcm1hdCAoXCkuDQogICAgICBXb3JrYXJvdW5kIDogVXNlIG9ubHkgLyBkaXJlY3Rvcnkgc2VwYXJhdG9ycy4NCiAgICAtIFBjbFppcCBpcyB1c2luZyB0ZW1wb3JhcnkgZmlsZXMgdGhhdCBhcmUgc29tZXRpbWUgdGhlIG5hbWUgb2YgdGhlIGZpbGUgd2l0aCBhIC50bXAgb3IgLmd6DQogICAgICBhZGRlZCBzdWZmaXguIEZpbGVzIHdpdGggdGhlc2UgbmFtZXMgbWF5IGFscmVhZHkgZXhpc3QgYW5kIG1heSBiZSBvdmVyd3JpdHRlbi4NCiAgICAgIFdvcmthcm91bmQgOiBub25lLg0KICAgIC0gUGNsWmlwIGRvZXMgbm90IGNoZWNrIGlmIHRoZSB6bGliIGV4dGVuc2lvbiBpcyBwcmVzZW50LiBJZiBpdCBpcyBhYnNlbnQsIHRoZSB6aXANCiAgICAgIGZpbGUgaXMgbm90IGNyZWF0ZWQgYW5kIHRoZSBsaWIgYWJvcnQgd2l0aG91dCB3YXJuaW5nLg0KICAgICAgV29ya2Fyb3VuZCA6IGVuYWJsZSB0aGUgemxpYiBleHRlbnNpb24gb24gdGhlIHBocCBpbnN0YWxsDQoNCiAgSW4gVmVyc2lvbiAxLjAgOg0KDQogICAgLSBFcnJvciB3aGlsZSBjb21wcmVzc2luZyBmaWxlcyBncmVhdGVyIHRoYW4gUENMWklQX1JFQURfQkxPQ0tfU0laRSAoZGVmYXVsdD0xMDI0KS4NCiAgICAgIChDb3JyZWN0ZWQgaW4gdi4xLjAuMSkNCiAgICAtIExpbWl0YXRpb24gOiBNdWx0aS1kaXNrIHppcCBhcmNoaXZlIGFyZSBub3Qgc3VwcG9ydGVkLg0KDQoNCjUgLSBMaWNlbnNlDQo9PT09PT09PT09PQ0KDQogIFNpbmNlIHZlcnNpb24gMS4xLjIsIFBjbFppcCBMaWJyYXJ5IGlzIHJlbGVhc2VkIHVuZGVyIEdOVS9MR1BMIGxpY2Vuc2UuDQogIFRoaXMgbGlicmFyeSBpcyBmcmVlLCBzbyB5b3UgY2FuIHVzZSBpdCBhdCBubyBjb3N0Lg0KDQogIEhPV0VWRVIsIGlmIHlvdSByZWxlYXNlIGEgc2NyaXB0LCBhbiBhcHBsaWNhdGlvbiwgYSBsaWJyYXJ5IG9yIGFueSBraW5kIG9mDQogIGNvZGUgdXNpbmcgUGNsWmlwIGxpYnJhcnkgKG9yIGEgcGFydCBvZiBpdCksIFlPVSBNVVNUIDoNCiAgLSBJbmRpY2F0ZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiAob3IgYSByZWFkbWUgZmlsZSksIHRoYXQgeW91ciB3b3JrDQogICAgdXNlcyBQY2xaaXAgTGlicmFyeSwgYW5kIG1ha2UgYSByZWZlcmVuY2UgdG8gdGhlIGF1dGhvciBhbmQgdGhlIHdlYiBzaXRlDQogICAgaHR0cDovL3d3dy5waHBjb25jZXB0Lm5ldA0KICAtIEdpdmVzIHRoZSBhYmlsaXR5IHRvIHRoZSBmaW5hbCB1c2VyIHRvIHVwZGF0ZSB0aGUgUGNsWmlwIGxpYmFyeS4NCg0KICBJIHdpbGwgYWxzbyBhcHByZWNpYXRlIHRoYXQgeW91IHNlbmQgbWUgYSBtYWlsICh2aW5jZW50QHBocGNvbmNlcHQubmV0KSwganVzdCB0bw0KICBiZSBhd2FyZSB0aGF0IHNvbWVvbmUgaXMgdXNpbmcgUGNsWmlwLg0KDQogIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IEdOVS9MR1BMIGxpY2Vuc2UgOiBodHRwOi8vd3d3LmdudS5vcmcNCg0KNiAtIFdhcm5pbmcNCj09PT09PT09PT09PT09PT09DQoNCiAgVGhpcyBsaWJyYXJ5IGFuZCB0aGUgYXNzb2NpYXRlZCBmaWxlcyBhcmUgbm9uIGNvbW1lcmNpYWwsIG5vbiBwcm9mZXNzaW9uYWwgd29yay4NCiAgSXQgc2hvdWxkIG5vdCBoYXZlIHVuZXhwZWN0ZWQgcmVzdWx0cy4gSG93ZXZlciBpZiBhbnkgZGFtYWdlIGlzIGNhdXNlZCBieSB0aGlzIHNvZnR3YXJlDQogIHRoZSBhdXRob3IgY2FuIG5vdCBiZSByZXNwb25zaWJsZS4NCiAgVGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGlzIGF0IHRoZSByaXNrIG9mIHRoZSB1c2VyLg0KDQo3IC0gRG9jdW1lbnRhdGlvbg0KPT09PT09PT09PT09PT09PT0NCiAgUGNsWmlwIFVzZXIgTWFudWVsIGlzIGF2YWlsYWJsZSBpbiBFbmdsaXNoIG9uIFBocENvbmNlcHQgOiBodHRwOi8vd3d3LnBocGNvbmNlcHQubmV0L3BjbHppcC9tYW4vZW4vaW5kZXgucGhwDQogIEEgUnVzc2lhbiB0cmFuc2xhdGlvbiB3YXMgZG9uZSBieSBGZXNrb3YgS3V6bWEgOiBodHRwOi8vcGhwLnJ1c3NvZmlsZS5ydS9ydS9hdXRob3JzL3Vuc29ydC96aXAvDQoNCjggLSBBdXRob3INCj09PT09PT09PT0NCg0KICBUaGlzIHNvZnR3YXJlIHdhcyB3cml0dGVuIGJ5IFZpbmNlbnQgQmxhdmV0ICh2aW5jZW50QHBocGNvbmNlcHQubmV0KSBvbiBpdHMgbGVhc3VyZSB0aW1lLg0KDQo5IC0gQ29udHJpYnV0ZQ0KPT09PT09PT09PT09PT0NCiAgSWYgeW91IHdhbnQgdG8gY29udHJpYnV0ZSB0byB0aGUgZGV2ZWxvcG1lbnQgb2YgUGNsWmlwLCBwbGVhc2UgY29udGFjdCB2aW5jZW50QHBocGNvbmNlcHQubmV0Lg0KICBJZiB5b3UgY2FuIGhlbHAgaW4gZmluYW5jaW5nIFBocENvbmNlcHQgaG9zdGluZyBzZXJ2aWNlLCBwbGVhc2UgZ28gdG8NCiAgaHR0cDovL3d3dy5waHBjb25jZXB0Lm5ldC9zb3V0aWVuLnBocA0K]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Shared/String.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIFBIUEV4Y2VsCiAqCiAqIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICoKICogQGNhdGVnb3J5ICAgUEhQRXhjZWwKICogQHBhY2thZ2UgICAgUEhQRXhjZWxfU2hhcmVkCiAqIEBjb3B5cmlnaHQgIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwgKGh0dHA6Ly93d3cuY29kZXBsZXguY29tL1BIUEV4Y2VsKQogKiBAbGljZW5zZSAgICBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvb2xkLWxpY2Vuc2VzL2xncGwtMi4xLnR4dAlMR1BMCiAqIEB2ZXJzaW9uICAgIDEuNy43LCAyMDEyLTA1LTE5CiAqLwoKCi8qKgogKiBQSFBFeGNlbF9TaGFyZWRfU3RyaW5nCiAqCiAqIEBjYXRlZ29yeSAgIFBIUEV4Y2VsCiAqIEBwYWNrYWdlICAgIFBIUEV4Y2VsX1NoYXJlZAogKiBAY29weXJpZ2h0ICBDb3B5cmlnaHQgKGMpIDIwMDYgLSAyMDEyIFBIUEV4Y2VsIChodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9QSFBFeGNlbCkKICovCmNsYXNzIFBIUEV4Y2VsX1NoYXJlZF9TdHJpbmcKewoJLyoqCUNvbnN0YW50cwkJCQkqLwoJLyoqCVJlZ3VsYXIgRXhwcmVzc2lvbnMJCSovCgkvLwlGcmFjdGlvbgoJY29uc3QgU1RSSU5HX1JFR0VYUF9GUkFDVElPTgk9ICcoLT8pKFxkKylccysoXGQrXC9cZCspJzsKCgoJLyoqCgkgKiBDb250cm9sIGNoYXJhY3RlcnMgYXJyYXkKCSAqCgkgKiBAdmFyIHN0cmluZ1tdCgkgKi8KCXByaXZhdGUgc3RhdGljICRfY29udHJvbENoYXJhY3RlcnMgPSBhcnJheSgpOwoKCS8qKgoJICogU1lMSyBDaGFyYWN0ZXJzIGFycmF5CgkgKgoJICogJHZhciBhcnJheQoJICovCglwcml2YXRlIHN0YXRpYyAkX1NZTEtDaGFyYWN0ZXJzID0gYXJyYXkoKTsKCgkvKioKCSAqIERlY2ltYWwgc2VwYXJhdG9yCgkgKgoJICogQHZhciBzdHJpbmcKCSAqLwoJcHJpdmF0ZSBzdGF0aWMgJF9kZWNpbWFsU2VwYXJhdG9yOwoKCS8qKgoJICogVGhvdXNhbmRzIHNlcGFyYXRvcgoJICoKCSAqIEB2YXIgc3RyaW5nCgkgKi8KCXByaXZhdGUgc3RhdGljICRfdGhvdXNhbmRzU2VwYXJhdG9yOwoKCS8qKgoJICogQ3VycmVuY3kgY29kZQoJICoKCSAqIEB2YXIgc3RyaW5nCgkgKi8KCXByaXZhdGUgc3RhdGljICRfY3VycmVuY3lDb2RlOwoKCS8qKgoJICogSXMgbWJzdHJpbmcgZXh0ZW5zaW9uIGF2YWxhYmxlPwoJICoKCSAqIEB2YXIgYm9vbGVhbgoJICovCglwcml2YXRlIHN0YXRpYyAkX2lzTWJzdHJpbmdFbmFibGVkOwoKCS8qKgoJICogSXMgaWNvbnYgZXh0ZW5zaW9uIGF2YWxhYmxlPwoJICoKCSAqIEB2YXIgYm9vbGVhbgoJICovCglwcml2YXRlIHN0YXRpYyAkX2lzSWNvbnZFbmFibGVkOwoKCS8qKgoJICogQnVpbGQgY29udHJvbCBjaGFyYWN0ZXJzIGFycmF5CgkgKi8KCXByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIF9idWlsZENvbnRyb2xDaGFyYWN0ZXJzKCkgewoJCWZvciAoJGkgPSAwOyAkaSA8PSAzMTsgKyskaSkgewoJCQlpZiAoJGkgIT0gOSAmJiAkaSAhPSAxMCAmJiAkaSAhPSAxMykgewoJCQkJJGZpbmQgPSAnX3gnIC4gc3ByaW50ZignJTA0cycgLCBzdHJ0b3VwcGVyKGRlY2hleCgkaSkpKSAuICdfJzsKCQkJCSRyZXBsYWNlID0gY2hyKCRpKTsKCQkJCXNlbGY6OiRfY29udHJvbENoYXJhY3RlcnNbJGZpbmRdID0gJHJlcGxhY2U7CgkJCX0KCQl9Cgl9CgoJLyoqCgkgKiBCdWlsZCBTWUxLIGNoYXJhY3RlcnMgYXJyYXkKCSAqLwoJcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gX2J1aWxkU1lMS0NoYXJhY3RlcnMoKQoJewoJCXNlbGY6OiRfU1lMS0NoYXJhY3RlcnMgPSBhcnJheSgKCQkJIlx4MUIgMCIgID0+IGNocigwKSwKCQkJIlx4MUIgMSIgID0+IGNocigxKSwKCQkJIlx4MUIgMiIgID0+IGNocigyKSwKCQkJIlx4MUIgMyIgID0+IGNocigzKSwKCQkJIlx4MUIgNCIgID0+IGNocig0KSwKCQkJIlx4MUIgNSIgID0+IGNocig1KSwKCQkJIlx4MUIgNiIgID0+IGNocig2KSwKCQkJIlx4MUIgNyIgID0+IGNocig3KSwKCQkJIlx4MUIgOCIgID0+IGNocig4KSwKCQkJIlx4MUIgOSIgID0+IGNocig5KSwKCQkJIlx4MUIgOiIgID0+IGNocigxMCksCgkJCSJceDFCIDsiICA9PiBjaHIoMTEpLAoJCQkiXHgxQiA8IiAgPT4gY2hyKDEyKSwKCQkJIlx4MUIgOiIgID0+IGNocigxMyksCgkJCSJceDFCID4iICA9PiBjaHIoMTQpLAoJCQkiXHgxQiA/IiAgPT4gY2hyKDE1KSwKCQkJIlx4MUIhMCIgID0+IGNocigxNiksCgkJCSJceDFCITEiICA9PiBjaHIoMTcpLAoJCQkiXHgxQiEyIiAgPT4gY2hyKDE4KSwKCQkJIlx4MUIhMyIgID0+IGNocigxOSksCgkJCSJceDFCITQiICA9PiBjaHIoMjApLAoJCQkiXHgxQiE1IiAgPT4gY2hyKDIxKSwKCQkJIlx4MUIhNiIgID0+IGNocigyMiksCgkJCSJceDFCITciICA9PiBjaHIoMjMpLAoJCQkiXHgxQiE4IiAgPT4gY2hyKDI0KSwKCQkJIlx4MUIhOSIgID0+IGNocigyNSksCgkJCSJceDFCIToiICA9PiBjaHIoMjYpLAoJCQkiXHgxQiE7IiAgPT4gY2hyKDI3KSwKCQkJIlx4MUIhPCIgID0+IGNocigyOCksCgkJCSJceDFCIT0iICA9PiBjaHIoMjkpLAoJCQkiXHgxQiE+IiAgPT4gY2hyKDMwKSwKCQkJIlx4MUIhPyIgID0+IGNocigzMSksCgkJCSJceDFCJz8iICA9PiBjaHIoMTI3KSwKCQkJIlx4MUIoMCIgID0+ICfigqwnLCAvLyAxMjggaW4gQ1AxMjUyCgkJCSJceDFCKDIiICA9PiAn4oCaJywgLy8gMTMwIGluIENQMTI1MgoJCQkiXHgxQigzIiAgPT4gJ8aSJywgLy8gMTMxIGluIENQMTI1MgoJCQkiXHgxQig0IiAgPT4gJ+KAnicsIC8vIDEzMiBpbiBDUDEyNTIKCQkJIlx4MUIoNSIgID0+ICfigKYnLCAvLyAxMzMgaW4gQ1AxMjUyCgkJCSJceDFCKDYiICA9PiAn4oCgJywgLy8gMTM0IGluIENQMTI1MgoJCQkiXHgxQig3IiAgPT4gJ+KAoScsIC8vIDEzNSBpbiBDUDEyNTIKCQkJIlx4MUIoOCIgID0+ICfLhicsIC8vIDEzNiBpbiBDUDEyNTIKCQkJIlx4MUIoOSIgID0+ICfigLAnLCAvLyAxMzcgaW4gQ1AxMjUyCgkJCSJceDFCKDoiICA9PiAnxaAnLCAvLyAxMzggaW4gQ1AxMjUyCgkJCSJceDFCKDsiICA9PiAn4oC5JywgLy8gMTM5IGluIENQMTI1MgoJCQkiXHgxQk5qIiAgPT4gJ8WSJywgLy8gMTQwIGluIENQMTI1MgoJCQkiXHgxQig+IiAgPT4gJ8W9JywgLy8gMTQyIGluIENQMTI1MgoJCQkiXHgxQikxIiAgPT4gJ+KAmCcsIC8vIDE0NSBpbiBDUDEyNTIKCQkJIlx4MUIpMiIgID0+ICfigJknLCAvLyAxNDYgaW4gQ1AxMjUyCgkJCSJceDFCKTMiICA9PiAn4oCcJywgLy8gMTQ3IGluIENQMTI1MgoJCQkiXHgxQik0IiAgPT4gJ+KAnScsIC8vIDE0OCBpbiBDUDEyNTIKCQkJIlx4MUIpNSIgID0+ICfigKInLCAvLyAxNDkgaW4gQ1AxMjUyCgkJCSJceDFCKTYiICA9PiAn4oCTJywgLy8gMTUwIGluIENQMTI1MgoJCQkiXHgxQik3IiAgPT4gJ+KAlCcsIC8vIDE1MSBpbiBDUDEyNTIKCQkJIlx4MUIpOCIgID0+ICfLnCcsIC8vIDE1MiBpbiBDUDEyNTIKCQkJIlx4MUIpOSIgID0+ICfihKInLCAvLyAxNTMgaW4gQ1AxMjUyCgkJCSJceDFCKToiICA9PiAnxaEnLCAvLyAxNTQgaW4gQ1AxMjUyCgkJCSJceDFCKTsiICA9PiAn4oC6JywgLy8gMTU1IGluIENQMTI1MgoJCQkiXHgxQk56IiAgPT4gJ8WTJywgLy8gMTU2IGluIENQMTI1MgoJCQkiXHgxQik+IiAgPT4gJ8W+JywgLy8gMTU4IGluIENQMTI1MgoJCQkiXHgxQik/IiAgPT4gJ8W4JywgLy8gMTU5IGluIENQMTI1MgoJCQkiXHgxQiowIiAgPT4gJ8KgJywgLy8gMTYwIGluIENQMTI1MgoJCQkiXHgxQk4hIiAgPT4gJ8KhJywgLy8gMTYxIGluIENQMTI1MgoJCQkiXHgxQk5cIiIgPT4gJ8KiJywgLy8gMTYyIGluIENQMTI1MgoJCQkiXHgxQk4jIiAgPT4gJ8KjJywgLy8gMTYzIGluIENQMTI1MgoJCQkiXHgxQk4oIiAgPT4gJ8KkJywgLy8gMTY0IGluIENQMTI1MgoJCQkiXHgxQk4lIiAgPT4gJ8KlJywgLy8gMTY1IGluIENQMTI1MgoJCQkiXHgxQio2IiAgPT4gJ8KmJywgLy8gMTY2IGluIENQMTI1MgoJCQkiXHgxQk4nIiAgPT4gJ8KnJywgLy8gMTY3IGluIENQMTI1MgoJCQkiXHgxQk5IICIgPT4gJ8KoJywgLy8gMTY4IGluIENQMTI1MgoJCQkiXHgxQk5TIiAgPT4gJ8KpJywgLy8gMTY5IGluIENQMTI1MgoJCQkiXHgxQk5jIiAgPT4gJ8KqJywgLy8gMTcwIGluIENQMTI1MgoJCQkiXHgxQk4rIiAgPT4gJ8KrJywgLy8gMTcxIGluIENQMTI1MgoJCQkiXHgxQio8IiAgPT4gJ8KsJywgLy8gMTcyIGluIENQMTI1MgoJCQkiXHgxQio9IiAgPT4gJ8KtJywgLy8gMTczIGluIENQMTI1MgoJCQkiXHgxQk5SIiAgPT4gJ8KuJywgLy8gMTc0IGluIENQMTI1MgoJCQkiXHgxQio/IiAgPT4gJ8KvJywgLy8gMTc1IGluIENQMTI1MgoJCQkiXHgxQk4wIiAgPT4gJ8KwJywgLy8gMTc2IGluIENQMTI1MgoJCQkiXHgxQk4xIiAgPT4gJ8KxJywgLy8gMTc3IGluIENQMTI1MgoJCQkiXHgxQk4yIiAgPT4gJ8KyJywgLy8gMTc4IGluIENQMTI1MgoJCQkiXHgxQk4zIiAgPT4gJ8KzJywgLy8gMTc5IGluIENQMTI1MgoJCQkiXHgxQk5CICIgPT4gJ8K0JywgLy8gMTgwIGluIENQMTI1MgoJCQkiXHgxQk41IiAgPT4gJ8K1JywgLy8gMTgxIGluIENQMTI1MgoJCQkiXHgxQk42IiAgPT4gJ8K2JywgLy8gMTgyIGluIENQMTI1MgoJCQkiXHgxQk43IiAgPT4gJ8K3JywgLy8gMTgzIGluIENQMTI1MgoJCQkiXHgxQis4IiAgPT4gJ8K4JywgLy8gMTg0IGluIENQMTI1MgoJCQkiXHgxQk5RIiAgPT4gJ8K5JywgLy8gMTg1IGluIENQMTI1MgoJCQkiXHgxQk5rIiAgPT4gJ8K6JywgLy8gMTg2IGluIENQMTI1MgoJCQkiXHgxQk47IiAgPT4gJ8K7JywgLy8gMTg3IGluIENQMTI1MgoJCQkiXHgxQk48IiAgPT4gJ8K8JywgLy8gMTg4IGluIENQMTI1MgoJCQkiXHgxQk49IiAgPT4gJ8K9JywgLy8gMTg5IGluIENQMTI1MgoJCQkiXHgxQk4+IiAgPT4gJ8K+JywgLy8gMTkwIGluIENQMTI1MgoJCQkiXHgxQk4/IiAgPT4gJ8K/JywgLy8gMTkxIGluIENQMTI1MgoJCQkiXHgxQk5BQSIgPT4gJ8OAJywgLy8gMTkyIGluIENQMTI1MgoJCQkiXHgxQk5CQSIgPT4gJ8OBJywgLy8gMTkzIGluIENQMTI1MgoJCQkiXHgxQk5DQSIgPT4gJ8OCJywgLy8gMTk0IGluIENQMTI1MgoJCQkiXHgxQk5EQSIgPT4gJ8ODJywgLy8gMTk1IGluIENQMTI1MgoJCQkiXHgxQk5IQSIgPT4gJ8OEJywgLy8gMTk2IGluIENQMTI1MgoJCQkiXHgxQk5KQSIgPT4gJ8OFJywgLy8gMTk3IGluIENQMTI1MgoJCQkiXHgxQk5hIiAgPT4gJ8OGJywgLy8gMTk4IGluIENQMTI1MgoJCQkiXHgxQk5LQyIgPT4gJ8OHJywgLy8gMTk5IGluIENQMTI1MgoJCQkiXHgxQk5BRSIgPT4gJ8OIJywgLy8gMjAwIGluIENQMTI1MgoJCQkiXHgxQk5CRSIgPT4gJ8OJJywgLy8gMjAxIGluIENQMTI1MgoJCQkiXHgxQk5DRSIgPT4gJ8OKJywgLy8gMjAyIGluIENQMTI1MgoJCQkiXHgxQk5IRSIgPT4gJ8OLJywgLy8gMjAzIGluIENQMTI1MgoJCQkiXHgxQk5BSSIgPT4gJ8OMJywgLy8gMjA0IGluIENQMTI1MgoJCQkiXHgxQk5CSSIgPT4gJ8ONJywgLy8gMjA1IGluIENQMTI1MgoJCQkiXHgxQk5DSSIgPT4gJ8OOJywgLy8gMjA2IGluIENQMTI1MgoJCQkiXHgxQk5ISSIgPT4gJ8OPJywgLy8gMjA3IGluIENQMTI1MgoJCQkiXHgxQk5iIiAgPT4gJ8OQJywgLy8gMjA4IGluIENQMTI1MgoJCQkiXHgxQk5ETiIgPT4gJ8ORJywgLy8gMjA5IGluIENQMTI1MgoJCQkiXHgxQk5BTyIgPT4gJ8OSJywgLy8gMjEwIGluIENQMTI1MgoJCQkiXHgxQk5CTyIgPT4gJ8OTJywgLy8gMjExIGluIENQMTI1MgoJCQkiXHgxQk5DTyIgPT4gJ8OUJywgLy8gMjEyIGluIENQMTI1MgoJCQkiXHgxQk5ETyIgPT4gJ8OVJywgLy8gMjEzIGluIENQMTI1MgoJCQkiXHgxQk5ITyIgPT4gJ8OWJywgLy8gMjE0IGluIENQMTI1MgoJCQkiXHgxQi03IiAgPT4gJ8OXJywgLy8gMjE1IGluIENQMTI1MgoJCQkiXHgxQk5pIiAgPT4gJ8OYJywgLy8gMjE2IGluIENQMTI1MgoJCQkiXHgxQk5BVSIgPT4gJ8OZJywgLy8gMjE3IGluIENQMTI1MgoJCQkiXHgxQk5CVSIgPT4gJ8OaJywgLy8gMjE4IGluIENQMTI1MgoJCQkiXHgxQk5DVSIgPT4gJ8ObJywgLy8gMjE5IGluIENQMTI1MgoJCQkiXHgxQk5IVSIgPT4gJ8OcJywgLy8gMjIwIGluIENQMTI1MgoJCQkiXHgxQi09IiAgPT4gJ8OdJywgLy8gMjIxIGluIENQMTI1MgoJCQkiXHgxQk5sIiAgPT4gJ8OeJywgLy8gMjIyIGluIENQMTI1MgoJCQkiXHgxQk57IiAgPT4gJ8OfJywgLy8gMjIzIGluIENQMTI1MgoJCQkiXHgxQk5BYSIgPT4gJ8OgJywgLy8gMjI0IGluIENQMTI1MgoJCQkiXHgxQk5CYSIgPT4gJ8OhJywgLy8gMjI1IGluIENQMTI1MgoJCQkiXHgxQk5DYSIgPT4gJ8OiJywgLy8gMjI2IGluIENQMTI1MgoJCQkiXHgxQk5EYSIgPT4gJ8OjJywgLy8gMjI3IGluIENQMTI1MgoJCQkiXHgxQk5IYSIgPT4gJ8OkJywgLy8gMjI4IGluIENQMTI1MgoJCQkiXHgxQk5KYSIgPT4gJ8OlJywgLy8gMjI5IGluIENQMTI1MgoJCQkiXHgxQk5xIiAgPT4gJ8OmJywgLy8gMjMwIGluIENQMTI1MgoJCQkiXHgxQk5LYyIgPT4gJ8OnJywgLy8gMjMxIGluIENQMTI1MgoJCQkiXHgxQk5BZSIgPT4gJ8OoJywgLy8gMjMyIGluIENQMTI1MgoJCQkiXHgxQk5CZSIgPT4gJ8OpJywgLy8gMjMzIGluIENQMTI1MgoJCQkiXHgxQk5DZSIgPT4gJ8OqJywgLy8gMjM0IGluIENQMTI1MgoJCQkiXHgxQk5IZSIgPT4gJ8OrJywgLy8gMjM1IGluIENQMTI1MgoJCQkiXHgxQk5BaSIgPT4gJ8OsJywgLy8gMjM2IGluIENQMTI1MgoJCQkiXHgxQk5CaSIgPT4gJ8OtJywgLy8gMjM3IGluIENQMTI1MgoJCQkiXHgxQk5DaSIgPT4gJ8OuJywgLy8gMjM4IGluIENQMTI1MgoJCQkiXHgxQk5IaSIgPT4gJ8OvJywgLy8gMjM5IGluIENQMTI1MgoJCQkiXHgxQk5zIiAgPT4gJ8OwJywgLy8gMjQwIGluIENQMTI1MgoJCQkiXHgxQk5EbiIgPT4gJ8OxJywgLy8gMjQxIGluIENQMTI1MgoJCQkiXHgxQk5BbyIgPT4gJ8OyJywgLy8gMjQyIGluIENQMTI1MgoJCQkiXHgxQk5CbyIgPT4gJ8OzJywgLy8gMjQzIGluIENQMTI1MgoJCQkiXHgxQk5DbyIgPT4gJ8O0JywgLy8gMjQ0IGluIENQMTI1MgoJCQkiXHgxQk5EbyIgPT4gJ8O1JywgLy8gMjQ1IGluIENQMTI1MgoJCQkiXHgxQk5IbyIgPT4gJ8O2JywgLy8gMjQ2IGluIENQMTI1MgoJCQkiXHgxQi83IiAgPT4gJ8O3JywgLy8gMjQ3IGluIENQMTI1MgoJCQkiXHgxQk55IiAgPT4gJ8O4JywgLy8gMjQ4IGluIENQMTI1MgoJCQkiXHgxQk5BdSIgPT4gJ8O5JywgLy8gMjQ5IGluIENQMTI1MgoJCQkiXHgxQk5CdSIgPT4gJ8O6JywgLy8gMjUwIGluIENQMTI1MgoJCQkiXHgxQk5DdSIgPT4gJ8O7JywgLy8gMjUxIGluIENQMTI1MgoJCQkiXHgxQk5IdSIgPT4gJ8O8JywgLy8gMjUyIGluIENQMTI1MgoJCQkiXHgxQi89IiAgPT4gJ8O9JywgLy8gMjUzIGluIENQMTI1MgoJCQkiXHgxQk58IiAgPT4gJ8O+JywgLy8gMjU0IGluIENQMTI1MgoJCQkiXHgxQk5IeSIgPT4gJ8O/JywgLy8gMjU1IGluIENQMTI1MgoJCSk7Cgl9CgoJLyoqCgkgKiBHZXQgd2hldGhlciBtYnN0cmluZyBleHRlbnNpb24gaXMgYXZhaWxhYmxlCgkgKgoJICogQHJldHVybiBib29sZWFuCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0SXNNYnN0cmluZ0VuYWJsZWQoKQoJewoJCWlmIChpc3NldChzZWxmOjokX2lzTWJzdHJpbmdFbmFibGVkKSkgewoJCQlyZXR1cm4gc2VsZjo6JF9pc01ic3RyaW5nRW5hYmxlZDsKCQl9CgoJCXNlbGY6OiRfaXNNYnN0cmluZ0VuYWJsZWQgPSBmdW5jdGlvbl9leGlzdHMoJ21iX2NvbnZlcnRfZW5jb2RpbmcnKSA/CgkJCXRydWUgOiBmYWxzZTsKCgkJcmV0dXJuIHNlbGY6OiRfaXNNYnN0cmluZ0VuYWJsZWQ7Cgl9CgoJLyoqCgkgKiBHZXQgd2hldGhlciBpY29udiBleHRlbnNpb24gaXMgYXZhaWxhYmxlCgkgKgoJICogQHJldHVybiBib29sZWFuCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0SXNJY29udkVuYWJsZWQoKQoJewoJCWlmIChpc3NldChzZWxmOjokX2lzSWNvbnZFbmFibGVkKSkgewoJCQlyZXR1cm4gc2VsZjo6JF9pc0ljb252RW5hYmxlZDsKCQl9CgoJCS8vIEZhaWwgaWYgaWNvbnYgZG9lc24ndCBleGlzdAoJCWlmICghZnVuY3Rpb25fZXhpc3RzKCdpY29udicpKSB7CgkJCXNlbGY6OiRfaXNJY29udkVuYWJsZWQgPSBmYWxzZTsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCgkJLy8gU29tZXRpbWVzIGljb252IGlzIG5vdCB3b3JraW5nLCBhbmQgZS5nLiBpY29udignVVRGLTgnLCAnVVRGLTE2TEUnLCAneCcpIGp1c3QgcmV0dXJucyBmYWxzZSwKCQlpZiAoIUBpY29udignVVRGLTgnLCAnVVRGLTE2TEUnLCAneCcpKSB7CgkJCXNlbGY6OiRfaXNJY29udkVuYWJsZWQgPSBmYWxzZTsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCgkJLy8gU29tZXRpbWVzIGljb252X3N1YnN0cignQScsIDAsIDEsICdVVEYtOCcpIGp1c3QgcmV0dXJucyBmYWxzZSBpbiBQSFAgNS4yLjAKCQkvLyB3ZSBjYW5ub3QgdXNlIGljb252IGluIHRoYXQgY2FzZSBlaXRoZXIgKGh0dHA6Ly9idWdzLnBocC5uZXQvYnVnLnBocD9pZD0zNzc3MykKCQlpZiAoIUBpY29udl9zdWJzdHIoJ0EnLCAwLCAxLCAnVVRGLTgnKSkgewoJCQlzZWxmOjokX2lzSWNvbnZFbmFibGVkID0gZmFsc2U7CgkJCXJldHVybiBmYWxzZTsKCQl9CgoJCS8vIENVU1RPTTogSUJNIEFJWCBpY29udigpIGRvZXMgbm90IHdvcmsKCQlpZiAoIGRlZmluZWQoJ1BIUF9PUycpICYmIEBzdHJpc3RyKFBIUF9PUywgJ0FJWCcpCgkJCQkmJiBkZWZpbmVkKCdJQ09OVl9JTVBMJykgJiYgKEBzdHJjYXNlY21wKElDT05WX0lNUEwsICd1bmtub3duJykgPT0gMCkKCQkJCSYmIGRlZmluZWQoJ0lDT05WX1ZFUlNJT04nKSAmJiAoQHN0cmNhc2VjbXAoSUNPTlZfVkVSU0lPTiwgJ3Vua25vd24nKSA9PSAwKSApCgkJewoJCQlzZWxmOjokX2lzSWNvbnZFbmFibGVkID0gZmFsc2U7CgkJCXJldHVybiBmYWxzZTsKCQl9CgoJCS8vIElmIHdlIHJlYWNoIGhlcmUgbm8gcHJvYmxlbXMgd2VyZSBkZXRlY3RlZCB3aXRoIGljb252CgkJc2VsZjo6JF9pc0ljb252RW5hYmxlZCA9IHRydWU7CgkJcmV0dXJuIHRydWU7Cgl9CgoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBidWlsZENoYXJhY3RlclNldHMoKSB7CgkJaWYoZW1wdHkoc2VsZjo6JF9jb250cm9sQ2hhcmFjdGVycykpIHsKCQkJc2VsZjo6X2J1aWxkQ29udHJvbENoYXJhY3RlcnMoKTsKCQl9CgkJaWYoZW1wdHkoc2VsZjo6JF9TWUxLQ2hhcmFjdGVycykpIHsKCQkJc2VsZjo6X2J1aWxkU1lMS0NoYXJhY3RlcnMoKTsKCQl9Cgl9CgoJLyoqCgkgKiBDb252ZXJ0IGZyb20gT3BlblhNTCBlc2NhcGVkIGNvbnRyb2wgY2hhcmFjdGVyIHRvIFBIUCBjb250cm9sIGNoYXJhY3RlcgoJICoKCSAqIEV4Y2VsIDIwMDcgdGVhbToKCSAqIC0tLS0tLS0tLS0tLS0tLS0KCSAqIFRoYXQncyBjb3JyZWN0LCBjb250cm9sIGNoYXJhY3RlcnMgYXJlIHN0b3JlZCBkaXJlY3RseSBpbiB0aGUgc2hhcmVkLXN0cmluZ3MgdGFibGUuCgkgKiBXZSBkbyBlbmNvZGUgY2hhcmFjdGVycyB0aGF0IGNhbm5vdCBiZSByZXByZXNlbnRlZCBpbiBYTUwgdXNpbmcgdGhlIGZvbGxvd2luZyBlc2NhcGUgc2VxdWVuY2U6CgkgKiBfeEhISEhfIHdoZXJlIEggcmVwcmVzZW50cyBhIGhleGFkZWNpbWFsIGNoYXJhY3RlciBpbiB0aGUgY2hhcmFjdGVyJ3MgdmFsdWUuLi4KCSAqIFNvIHlvdSBjb3VsZCBlbmQgdXAgd2l0aCBzb21ldGhpbmcgbGlrZSBfeDAwMDhfIGluIGEgc3RyaW5nIChlaXRoZXIgaW4gYSBjZWxsIHZhbHVlICg8dj4pCgkgKiBlbGVtZW50IG9yIGluIHRoZSBzaGFyZWQgc3RyaW5nIDx0PiBlbGVtZW50LgoJICoKCSAqIEBwYXJhbSAJc3RyaW5nCSR2YWx1ZQlWYWx1ZSB0byB1bmVzY2FwZQoJICogQHJldHVybiAJc3RyaW5nCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gQ29udHJvbENoYXJhY3Rlck9PWE1MMlBIUCgkdmFsdWUgPSAnJykgewoJCXJldHVybiBzdHJfcmVwbGFjZSggYXJyYXlfa2V5cyhzZWxmOjokX2NvbnRyb2xDaGFyYWN0ZXJzKSwgYXJyYXlfdmFsdWVzKHNlbGY6OiRfY29udHJvbENoYXJhY3RlcnMpLCAkdmFsdWUgKTsKCX0KCgkvKioKCSAqIENvbnZlcnQgZnJvbSBQSFAgY29udHJvbCBjaGFyYWN0ZXIgdG8gT3BlblhNTCBlc2NhcGVkIGNvbnRyb2wgY2hhcmFjdGVyCgkgKgoJICogRXhjZWwgMjAwNyB0ZWFtOgoJICogLS0tLS0tLS0tLS0tLS0tLQoJICogVGhhdCdzIGNvcnJlY3QsIGNvbnRyb2wgY2hhcmFjdGVycyBhcmUgc3RvcmVkIGRpcmVjdGx5IGluIHRoZSBzaGFyZWQtc3RyaW5ncyB0YWJsZS4KCSAqIFdlIGRvIGVuY29kZSBjaGFyYWN0ZXJzIHRoYXQgY2Fubm90IGJlIHJlcHJlc2VudGVkIGluIFhNTCB1c2luZyB0aGUgZm9sbG93aW5nIGVzY2FwZSBzZXF1ZW5jZToKCSAqIF94SEhISF8gd2hlcmUgSCByZXByZXNlbnRzIGEgaGV4YWRlY2ltYWwgY2hhcmFjdGVyIGluIHRoZSBjaGFyYWN0ZXIncyB2YWx1ZS4uLgoJICogU28geW91IGNvdWxkIGVuZCB1cCB3aXRoIHNvbWV0aGluZyBsaWtlIF94MDAwOF8gaW4gYSBzdHJpbmcgKGVpdGhlciBpbiBhIGNlbGwgdmFsdWUgKDx2PikKCSAqIGVsZW1lbnQgb3IgaW4gdGhlIHNoYXJlZCBzdHJpbmcgPHQ+IGVsZW1lbnQuCgkgKgoJICogQHBhcmFtIAlzdHJpbmcJJHZhbHVlCVZhbHVlIHRvIGVzY2FwZQoJICogQHJldHVybiAJc3RyaW5nCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gQ29udHJvbENoYXJhY3RlclBIUDJPT1hNTCgkdmFsdWUgPSAnJykgewoJCXJldHVybiBzdHJfcmVwbGFjZSggYXJyYXlfdmFsdWVzKHNlbGY6OiRfY29udHJvbENoYXJhY3RlcnMpLCBhcnJheV9rZXlzKHNlbGY6OiRfY29udHJvbENoYXJhY3RlcnMpLCAkdmFsdWUgKTsKCX0KCgkvKioKCSAqIFRyeSB0byBzYW5pdGl6ZSBVVEY4LCBzdHJpcHBpbmcgaW52YWxpZCBieXRlIHNlcXVlbmNlcy4gTm90IHBlcmZlY3QuIERvZXMgbm90IHN1cnJvZ2F0ZSBjaGFyYWN0ZXJzLgoJICoKCSAqIEBwYXJhbSBzdHJpbmcgJHZhbHVlCgkgKiBAcmV0dXJuIHN0cmluZwoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIFNhbml0aXplVVRGOCgkdmFsdWUpCgl7CgkJaWYgKHNlbGY6OmdldElzSWNvbnZFbmFibGVkKCkpIHsKCQkJJHZhbHVlID0gQGljb252KCdVVEYtOCcsICdVVEYtOCcsICR2YWx1ZSk7CgkJCXJldHVybiAkdmFsdWU7CgkJfQoKCQlpZiAoc2VsZjo6Z2V0SXNNYnN0cmluZ0VuYWJsZWQoKSkgewoJCQkkdmFsdWUgPSBtYl9jb252ZXJ0X2VuY29kaW5nKCR2YWx1ZSwgJ1VURi04JywgJ1VURi04Jyk7CgkJCXJldHVybiAkdmFsdWU7CgkJfQoKCQkvLyBlbHNlLCBubyBjb252ZXJzaW9uCgkJcmV0dXJuICR2YWx1ZTsKCX0KCgkvKioKCSAqIENoZWNrIGlmIGEgc3RyaW5nIGNvbnRhaW5zIFVURjggZGF0YQoJICoKCSAqIEBwYXJhbSBzdHJpbmcgJHZhbHVlCgkgKiBAcmV0dXJuIGJvb2xlYW4KCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBJc1VURjgoJHZhbHVlID0gJycpIHsKCQlyZXR1cm4gdXRmOF9lbmNvZGUodXRmOF9kZWNvZGUoJHZhbHVlKSkgPT09ICR2YWx1ZTsKCX0KCgkvKioKCSAqIEZvcm1hdHMgYSBudW1lcmljIHZhbHVlIGFzIGEgc3RyaW5nIGZvciBvdXRwdXQgaW4gdmFyaW91cyBvdXRwdXQgd3JpdGVycyBmb3JjaW5nCgkgKiBwb2ludCBhcyBkZWNpbWFsIHNlcGFyYXRvciBpbiBjYXNlIGxvY2FsZSBpcyBvdGhlciB0aGFuIEVuZ2xpc2guCgkgKgoJICogQHBhcmFtIG1peGVkICR2YWx1ZQoJICogQHJldHVybiBzdHJpbmcKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBGb3JtYXROdW1iZXIoJHZhbHVlKSB7CgkJaWYgKGlzX2Zsb2F0KCR2YWx1ZSkpIHsKCQkJcmV0dXJuIHN0cl9yZXBsYWNlKCcsJywgJy4nLCAkdmFsdWUpOwoJCX0KCQlyZXR1cm4gKHN0cmluZykgJHZhbHVlOwoJfQoKCS8qKgoJICogQ29udmVydHMgYSBVVEYtOCBzdHJpbmcgaW50byBCSUZGOCBVbmljb2RlIHN0cmluZyBkYXRhICg4LWJpdCBzdHJpbmcgbGVuZ3RoKQoJICogV3JpdGVzIHRoZSBzdHJpbmcgdXNpbmcgdW5jb21wcmVzc2VkIG5vdGF0aW9uLCBubyByaWNoIHRleHQsIG5vIEFzaWFuIHBob25ldGljcwoJICogSWYgbWJzdHJpbmcgZXh0ZW5zaW9uIGlzIG5vdCBhdmFpbGFibGUsIEFTQ0lJIGlzIGFzc3VtZWQsIGFuZCBjb21wcmVzc2VkIG5vdGF0aW9uIGlzIHVzZWQKCSAqIGFsdGhvdWdoIHRoaXMgd2lsbCBnaXZlIHdyb25nIHJlc3VsdHMgZm9yIG5vbi1BU0NJSSBzdHJpbmdzCgkgKiBzZWUgT3Blbk9mZmljZS5vcmcncyBEb2N1bWVudGF0aW9uIG9mIHRoZSBNaWNyb3NvZnQgRXhjZWwgRmlsZSBGb3JtYXQsIHNlY3QuIDIuNS4zCgkgKgoJICogQHBhcmFtIHN0cmluZyAkdmFsdWUgVVRGLTggZW5jb2RlZCBzdHJpbmcKCSAqIEByZXR1cm4gc3RyaW5nCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gVVRGOHRvQklGRjhVbmljb2RlU2hvcnQoJHZhbHVlLCAkYXJyY1J1bnMgPSBhcnJheSgpKQoJewoJCS8vIGNoYXJhY3RlciBjb3VudAoJCSRsbiA9IHNlbGY6OkNvdW50Q2hhcmFjdGVycygkdmFsdWUsICdVVEYtOCcpOwoKCQkvLyBvcHRpb24gZmxhZ3MKCQlpZihlbXB0eSgkYXJyY1J1bnMpKXsKCQkJJG9wdCA9IChzZWxmOjpnZXRJc0ljb252RW5hYmxlZCgpIHx8IHNlbGY6OmdldElzTWJzdHJpbmdFbmFibGVkKCkpID8KCQkJCTB4MDAwMSA6IDB4MDAwMDsKCQkJJGRhdGEgPSBwYWNrKCdDQycsICRsbiwgJG9wdCk7CgkJCS8vIGNoYXJhY3RlcnMKCQkJJGRhdGEgLj0gc2VsZjo6Q29udmVydEVuY29kaW5nKCR2YWx1ZSwgJ1VURi0xNkxFJywgJ1VURi04Jyk7CgkJfQoJCWVsc2UgewoJCQkkZGF0YSA9IHBhY2soJ3ZDJywgJGxuLCAweDA4KTsKCQkJJGRhdGEgLj0gcGFjaygndicsIGNvdW50KCRhcnJjUnVucykpOwoJCQkvLyBjaGFyYWN0ZXJzCgkJCSRkYXRhIC49ICR2YWx1ZTsKCQkJZm9yZWFjaCAoJGFycmNSdW5zIGFzICRjUnVuKXsKCQkJCSRkYXRhIC49IHBhY2soJ3YnLCAkY1J1blsnc3RybGVuJ10pOwoJCQkJJGRhdGEgLj0gcGFjaygndicsICRjUnVuWydmb250aWR4J10pOwoJCQl9CgkJfQoJCXJldHVybiAkZGF0YTsKCX0KCgkvKioKCSAqIENvbnZlcnRzIGEgVVRGLTggc3RyaW5nIGludG8gQklGRjggVW5pY29kZSBzdHJpbmcgZGF0YSAoMTYtYml0IHN0cmluZyBsZW5ndGgpCgkgKiBXcml0ZXMgdGhlIHN0cmluZyB1c2luZyB1bmNvbXByZXNzZWQgbm90YXRpb24sIG5vIHJpY2ggdGV4dCwgbm8gQXNpYW4gcGhvbmV0aWNzCgkgKiBJZiBtYnN0cmluZyBleHRlbnNpb24gaXMgbm90IGF2YWlsYWJsZSwgQVNDSUkgaXMgYXNzdW1lZCwgYW5kIGNvbXByZXNzZWQgbm90YXRpb24gaXMgdXNlZAoJICogYWx0aG91Z2ggdGhpcyB3aWxsIGdpdmUgd3JvbmcgcmVzdWx0cyBmb3Igbm9uLUFTQ0lJIHN0cmluZ3MKCSAqIHNlZSBPcGVuT2ZmaWNlLm9yZydzIERvY3VtZW50YXRpb24gb2YgdGhlIE1pY3Jvc29mdCBFeGNlbCBGaWxlIEZvcm1hdCwgc2VjdC4gMi41LjMKCSAqCgkgKiBAcGFyYW0gc3RyaW5nICR2YWx1ZSBVVEYtOCBlbmNvZGVkIHN0cmluZwoJICogQHJldHVybiBzdHJpbmcKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBVVEY4dG9CSUZGOFVuaWNvZGVMb25nKCR2YWx1ZSkKCXsKCQkvLyBjaGFyYWN0ZXIgY291bnQKCQkkbG4gPSBzZWxmOjpDb3VudENoYXJhY3RlcnMoJHZhbHVlLCAnVVRGLTgnKTsKCgkJLy8gb3B0aW9uIGZsYWdzCgkJJG9wdCA9IChzZWxmOjpnZXRJc0ljb252RW5hYmxlZCgpIHx8IHNlbGY6OmdldElzTWJzdHJpbmdFbmFibGVkKCkpID8KCQkJMHgwMDAxIDogMHgwMDAwOwoKCQkvLyBjaGFyYWN0ZXJzCgkJJGNoYXJzID0gc2VsZjo6Q29udmVydEVuY29kaW5nKCR2YWx1ZSwgJ1VURi0xNkxFJywgJ1VURi04Jyk7CgoJCSRkYXRhID0gcGFjaygndkMnLCAkbG4sICRvcHQpIC4gJGNoYXJzOwoJCXJldHVybiAkZGF0YTsKCX0KCgkvKioKCSAqIENvbnZlcnQgc3RyaW5nIGZyb20gb25lIGVuY29kaW5nIHRvIGFub3RoZXIuIEZpcnN0IHRyeSBpY29udiwgdGhlbiBtYnN0cmluZywgb3Igbm8gY29udmVydGlvbgoJICoKCSAqIEBwYXJhbSBzdHJpbmcgJHZhbHVlCgkgKiBAcGFyYW0gc3RyaW5nICR0byBFbmNvZGluZyB0byBjb252ZXJ0IHRvLCBlLmcuICdVVEYtOCcKCSAqIEBwYXJhbSBzdHJpbmcgJGZyb20gRW5jb2RpbmcgdG8gY29udmVydCBmcm9tLCBlLmcuICdVVEYtMTZMRScKCSAqIEByZXR1cm4gc3RyaW5nCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gQ29udmVydEVuY29kaW5nKCR2YWx1ZSwgJHRvLCAkZnJvbSkKCXsKCQlpZiAoc2VsZjo6Z2V0SXNJY29udkVuYWJsZWQoKSkgewoJCQkkdmFsdWUgPSBpY29udigkZnJvbSwgJHRvLCAkdmFsdWUpOwoJCQlyZXR1cm4gJHZhbHVlOwoJCX0KCgkJaWYgKHNlbGY6OmdldElzTWJzdHJpbmdFbmFibGVkKCkpIHsKCQkJJHZhbHVlID0gbWJfY29udmVydF9lbmNvZGluZygkdmFsdWUsICR0bywgJGZyb20pOwoJCQlyZXR1cm4gJHZhbHVlOwoJCX0KCQlpZigkZnJvbSA9PSAnVVRGLTE2TEUnKXsKCQkJcmV0dXJuIHNlbGY6OnV0ZjE2X2RlY29kZSgkdmFsdWUsIGZhbHNlKTsKCQl9ZWxzZSBpZigkZnJvbSA9PSAnVVRGLTE2QkUnKXsKCQkJcmV0dXJuIHNlbGY6OnV0ZjE2X2RlY29kZSgkdmFsdWUpOwoJCX0KCQkvLyBlbHNlLCBubyBjb252ZXJzaW9uCgkJcmV0dXJuICR2YWx1ZTsKCX0KCgkvKioKCSAqIERlY29kZSBVVEYtMTYgZW5jb2RlZCBzdHJpbmdzLgoJICoKCSAqIENhbiBoYW5kbGUgYm90aCBCT00nZWQgZGF0YSBhbmQgdW4tQk9NJ2VkIGRhdGEuCgkgKiBBc3N1bWVzIEJpZy1FbmRpYW4gYnl0ZSBvcmRlciBpZiBubyBCT00gaXMgYXZhaWxhYmxlLgoJICogVGhpcyBmdW5jdGlvbiB3YXMgdGFrZW4gZnJvbSBodHRwOi8vcGhwLm5ldC9tYW51YWwvZW4vZnVuY3Rpb24udXRmOC1kZWNvZGUucGhwCgkgKiBhbmQgJGJvbV9iZSBwYXJhbWV0ZXIgYWRkZWQuCgkgKgoJICogQHBhcmFtICAgc3RyaW5nICAkc3RyICBVVEYtMTYgZW5jb2RlZCBkYXRhIHRvIGRlY29kZS4KCSAqIEByZXR1cm4gIHN0cmluZyAgVVRGLTggLyBJU08gZW5jb2RlZCBkYXRhLgoJICogQGFjY2VzcyAgcHVibGljCgkgKiBAdmVyc2lvbiAwLjIgLyAyMDEwLTA1LTEzCgkgKiBAYXV0aG9yICBSYXNtdXMgQW5kZXJzc29uIHtAbGluayBodHRwOi8vcmFzbXVzYW5kZXJzc29uLnNlL30KCSAqIEBhdXRob3IgdmFkaWs1NgoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHV0ZjE2X2RlY29kZSggJHN0ciwgJGJvbV9iZT10cnVlICkgewoJCWlmKCBzdHJsZW4oJHN0cikgPCAyICkgcmV0dXJuICRzdHI7CgkJJGMwID0gb3JkKCRzdHJ7MH0pOwoJCSRjMSA9IG9yZCgkc3RyezF9KTsKCQlpZiggJGMwID09IDB4ZmUgJiYgJGMxID09IDB4ZmYgKSB7ICRzdHIgPSBzdWJzdHIoJHN0ciwyKTsgfQoJCWVsc2VpZiggJGMwID09IDB4ZmYgJiYgJGMxID09IDB4ZmUgKSB7ICRzdHIgPSBzdWJzdHIoJHN0ciwyKTsgJGJvbV9iZSA9IGZhbHNlOyB9CgkJJGxlbiA9IHN0cmxlbigkc3RyKTsKCQkkbmV3c3RyID0gJyc7CgkJZm9yKCRpPTA7JGk8JGxlbjskaSs9MikgewoJCQlpZiggJGJvbV9iZSApIHsgJHZhbCA9IG9yZCgkc3RyeyRpfSkgICA8PCA0OyAkdmFsICs9IG9yZCgkc3RyeyRpKzF9KTsgfQoJCQllbHNlIHsgICAgICAgICR2YWwgPSBvcmQoJHN0cnskaSsxfSkgPDwgNDsgJHZhbCArPSBvcmQoJHN0cnskaX0pOyB9CgkJCSRuZXdzdHIgLj0gKCR2YWwgPT0gMHgyMjgpID8gIlxuIiA6IGNocigkdmFsKTsKCQl9CgkJcmV0dXJuICRuZXdzdHI7Cgl9CgoJLyoqCgkgKiBHZXQgY2hhcmFjdGVyIGNvdW50LiBGaXJzdCB0cnkgbWJzdHJpbmcsIHRoZW4gaWNvbnYsIGZpbmFsbHkgc3RybGVuCgkgKgoJICogQHBhcmFtIHN0cmluZyAkdmFsdWUKCSAqIEBwYXJhbSBzdHJpbmcgJGVuYyBFbmNvZGluZwoJICogQHJldHVybiBpbnQgQ2hhcmFjdGVyIGNvdW50CgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gQ291bnRDaGFyYWN0ZXJzKCR2YWx1ZSwgJGVuYyA9ICdVVEYtOCcpCgl7CgkJaWYgKHNlbGY6OmdldElzSWNvbnZFbmFibGVkKCkpIHsKCQkJcmV0dXJuIGljb252X3N0cmxlbigkdmFsdWUsICRlbmMpOwoJCX0KCgkJaWYgKHNlbGY6OmdldElzTWJzdHJpbmdFbmFibGVkKCkpIHsKCQkJcmV0dXJuIG1iX3N0cmxlbigkdmFsdWUsICRlbmMpOwoJCX0KCgkJLy8gZWxzZSBzdHJsZW4KCQlyZXR1cm4gc3RybGVuKCR2YWx1ZSk7Cgl9CgoJLyoqCgkgKiBHZXQgYSBzdWJzdHJpbmcgb2YgYSBVVEYtOCBlbmNvZGVkIHN0cmluZwoJICoKCSAqIEBwYXJhbSBzdHJpbmcgJHBWYWx1ZSBVVEYtOCBlbmNvZGVkIHN0cmluZwoJICogQHBhcmFtIGludCAkc3RhcnQgU3RhcnQgb2Zmc2V0CgkgKiBAcGFyYW0gaW50ICRsZW5ndGggTWF4aW11bSBudW1iZXIgb2YgY2hhcmFjdGVycyBpbiBzdWJzdHJpbmcKCSAqIEByZXR1cm4gc3RyaW5nCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gU3Vic3RyaW5nKCRwVmFsdWUgPSAnJywgJHBTdGFydCA9IDAsICRwTGVuZ3RoID0gMCkKCXsKCQlpZiAoc2VsZjo6Z2V0SXNJY29udkVuYWJsZWQoKSkgewoJCQlyZXR1cm4gaWNvbnZfc3Vic3RyKCRwVmFsdWUsICRwU3RhcnQsICRwTGVuZ3RoLCAnVVRGLTgnKTsKCQl9CgoJCWlmIChzZWxmOjpnZXRJc01ic3RyaW5nRW5hYmxlZCgpKSB7CgkJCXJldHVybiBtYl9zdWJzdHIoJHBWYWx1ZSwgJHBTdGFydCwgJHBMZW5ndGgsICdVVEYtOCcpOwoJCX0KCgkJLy8gZWxzZSBzdWJzdHIKCQlyZXR1cm4gc3Vic3RyKCRwVmFsdWUsICRwU3RhcnQsICRwTGVuZ3RoKTsKCX0KCgoJLyoqCgkgKiBJZGVudGlmeSB3aGV0aGVyIGEgc3RyaW5nIGNvbnRhaW5zIGEgZnJhY3Rpb25hbCBudW1lcmljIHZhbHVlLAoJICogICAgYW5kIGNvbnZlcnQgaXQgdG8gYSBudW1lcmljIGlmIGl0IGlzCgkgKgoJICogQHBhcmFtIHN0cmluZyAmJG9wZXJhbmQgc3RyaW5nIHZhbHVlIHRvIHRlc3QKCSAqIEByZXR1cm4gYm9vbGVhbgoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGNvbnZlcnRUb051bWJlcklmRnJhY3Rpb24oJiRvcGVyYW5kKSB7CgkJaWYgKHByZWdfbWF0Y2goJy9eJy5zZWxmOjpTVFJJTkdfUkVHRVhQX0ZSQUNUSU9OLickL2knLCAkb3BlcmFuZCwgJG1hdGNoKSkgewoJCQkkc2lnbiA9ICgkbWF0Y2hbMV0gPT0gJy0nKSA/ICctJyA6ICcrJzsKCQkJJGZyYWN0aW9uRm9ybXVsYSA9ICc9Jy4kc2lnbi4kbWF0Y2hbMl0uJHNpZ24uJG1hdGNoWzNdOwoJCQkkb3BlcmFuZCA9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uOjpnZXRJbnN0YW5jZSgpLT5fY2FsY3VsYXRlRm9ybXVsYVZhbHVlKCRmcmFjdGlvbkZvcm11bGEpOwoJCQlyZXR1cm4gdHJ1ZTsKCQl9CgkJcmV0dXJuIGZhbHNlOwoJfQkvLwlmdW5jdGlvbiBjb252ZXJ0VG9OdW1iZXJJZkZyYWN0aW9uKCkKCgkvKioKCSAqIEdldCB0aGUgZGVjaW1hbCBzZXBhcmF0b3IuIElmIGl0IGhhcyBub3QgeWV0IGJlZW4gc2V0IGV4cGxpY2l0bHksIHRyeSB0byBvYnRhaW4gbnVtYmVyCgkgKiBmb3JtYXR0aW5nIGluZm9ybWF0aW9uIGZyb20gbG9jYWxlLgoJICoKCSAqIEByZXR1cm4gc3RyaW5nCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0RGVjaW1hbFNlcGFyYXRvcigpCgl7CgkJaWYgKCFpc3NldChzZWxmOjokX2RlY2ltYWxTZXBhcmF0b3IpKSB7CgkJCSRsb2NhbGVjb252ID0gbG9jYWxlY29udigpOwoJCQlzZWxmOjokX2RlY2ltYWxTZXBhcmF0b3IgPSAkbG9jYWxlY29udlsnZGVjaW1hbF9wb2ludCddICE9ICcnCgkJCQk/ICRsb2NhbGVjb252WydkZWNpbWFsX3BvaW50J10gOiAkbG9jYWxlY29udlsnbW9uX2RlY2ltYWxfcG9pbnQnXTsKCgkJCWlmIChzZWxmOjokX2RlY2ltYWxTZXBhcmF0b3IgPT0gJycpIHsKCQkJCS8vIERlZmF1bHQgdG8gLgoJCQkJc2VsZjo6JF9kZWNpbWFsU2VwYXJhdG9yID0gJy4nOwoJCQl9CgkJfQoJCXJldHVybiBzZWxmOjokX2RlY2ltYWxTZXBhcmF0b3I7Cgl9CgoJLyoqCgkgKiBTZXQgdGhlIGRlY2ltYWwgc2VwYXJhdG9yLiBPbmx5IHVzZWQgYnkgUEhQRXhjZWxfU3R5bGVfTnVtYmVyRm9ybWF0Ojp0b0Zvcm1hdHRlZFN0cmluZygpCgkgKiB0byBmb3JtYXQgb3V0cHV0IGJ5IFBIUEV4Y2VsX1dyaXRlcl9IVE1MIGFuZCBQSFBFeGNlbF9Xcml0ZXJfUERGCgkgKgoJICogQHBhcmFtIHN0cmluZyAkcFZhbHVlIENoYXJhY3RlciBmb3IgZGVjaW1hbCBzZXBhcmF0b3IKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBzZXREZWNpbWFsU2VwYXJhdG9yKCRwVmFsdWUgPSAnLicpCgl7CgkJc2VsZjo6JF9kZWNpbWFsU2VwYXJhdG9yID0gJHBWYWx1ZTsKCX0KCgkvKioKCSAqIEdldCB0aGUgdGhvdXNhbmRzIHNlcGFyYXRvci4gSWYgaXQgaGFzIG5vdCB5ZXQgYmVlbiBzZXQgZXhwbGljaXRseSwgdHJ5IHRvIG9idGFpbiBudW1iZXIKCSAqIGZvcm1hdHRpbmcgaW5mb3JtYXRpb24gZnJvbSBsb2NhbGUuCgkgKgoJICogQHJldHVybiBzdHJpbmcKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRUaG91c2FuZHNTZXBhcmF0b3IoKQoJewoJCWlmICghaXNzZXQoc2VsZjo6JF90aG91c2FuZHNTZXBhcmF0b3IpKSB7CgkJCSRsb2NhbGVjb252ID0gbG9jYWxlY29udigpOwoJCQlzZWxmOjokX3Rob3VzYW5kc1NlcGFyYXRvciA9ICRsb2NhbGVjb252Wyd0aG91c2FuZHNfc2VwJ10gIT0gJycKCQkJCT8gJGxvY2FsZWNvbnZbJ3Rob3VzYW5kc19zZXAnXSA6ICRsb2NhbGVjb252Wydtb25fdGhvdXNhbmRzX3NlcCddOwoJCX0KCQlyZXR1cm4gc2VsZjo6JF90aG91c2FuZHNTZXBhcmF0b3I7Cgl9CgoJLyoqCgkgKiBTZXQgdGhlIHRob3VzYW5kcyBzZXBhcmF0b3IuIE9ubHkgdXNlZCBieSBQSFBFeGNlbF9TdHlsZV9OdW1iZXJGb3JtYXQ6OnRvRm9ybWF0dGVkU3RyaW5nKCkKCSAqIHRvIGZvcm1hdCBvdXRwdXQgYnkgUEhQRXhjZWxfV3JpdGVyX0hUTUwgYW5kIFBIUEV4Y2VsX1dyaXRlcl9QREYKCSAqCgkgKiBAcGFyYW0gc3RyaW5nICRwVmFsdWUgQ2hhcmFjdGVyIGZvciB0aG91c2FuZHMgc2VwYXJhdG9yCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gc2V0VGhvdXNhbmRzU2VwYXJhdG9yKCRwVmFsdWUgPSAnLCcpCgl7CgkJc2VsZjo6JF90aG91c2FuZHNTZXBhcmF0b3IgPSAkcFZhbHVlOwoJfQoKCS8qKgoJICoJR2V0IHRoZSBjdXJyZW5jeSBjb2RlLiBJZiBpdCBoYXMgbm90IHlldCBiZWVuIHNldCBleHBsaWNpdGx5LCB0cnkgdG8gb2J0YWluIHRoZQoJICoJCXN5bWJvbCBpbmZvcm1hdGlvbiBmcm9tIGxvY2FsZS4KCSAqCgkgKiBAcmV0dXJuIHN0cmluZwoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldEN1cnJlbmN5Q29kZSgpCgl7CgkJaWYgKCFpc3NldChzZWxmOjokX2N1cnJlbmN5Q29kZSkpIHsKCQkJJGxvY2FsZWNvbnYgPSBsb2NhbGVjb252KCk7CgkJCXNlbGY6OiRfY3VycmVuY3lDb2RlID0gJGxvY2FsZWNvbnZbJ2N1cnJlbmN5X3N5bWJvbCddICE9ICcnCgkJCQk/ICRsb2NhbGVjb252WydjdXJyZW5jeV9zeW1ib2wnXSA6ICRsb2NhbGVjb252WydpbnRfY3Vycl9zeW1ib2wnXTsKCgkJCWlmIChzZWxmOjokX2N1cnJlbmN5Q29kZSA9PSAnJykgewoJCQkJLy8gRGVmYXVsdCB0byAkCgkJCQlzZWxmOjokX2N1cnJlbmN5Q29kZSA9ICckJzsKCQkJfQoJCX0KCQlyZXR1cm4gc2VsZjo6JF9jdXJyZW5jeUNvZGU7Cgl9CgoJLyoqCgkgKiBTZXQgdGhlIGN1cnJlbmN5IGNvZGUuIE9ubHkgdXNlZCBieSBQSFBFeGNlbF9TdHlsZV9OdW1iZXJGb3JtYXQ6OnRvRm9ybWF0dGVkU3RyaW5nKCkKCSAqCQl0byBmb3JtYXQgb3V0cHV0IGJ5IFBIUEV4Y2VsX1dyaXRlcl9IVE1MIGFuZCBQSFBFeGNlbF9Xcml0ZXJfUERGCgkgKgoJICogQHBhcmFtIHN0cmluZyAkcFZhbHVlIENoYXJhY3RlciBmb3IgY3VycmVuY3kgY29kZQoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHNldEN1cnJlbmN5Q29kZSgkcFZhbHVlID0gJyQnKQoJewoJCXNlbGY6OiRfY3VycmVuY3lDb2RlID0gJHBWYWx1ZTsKCX0KCgkvKioKCSAqIENvbnZlcnQgU1lMSyBlbmNvZGVkIHN0cmluZyB0byBVVEYtOAoJICoKCSAqIEBwYXJhbSBzdHJpbmcgJHBWYWx1ZQoJICogQHJldHVybiBzdHJpbmcgVVRGLTggZW5jb2RlZCBzdHJpbmcKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBTWUxLdG9VVEY4KCRwVmFsdWUgPSAnJykKCXsKCQkvLyBJZiB0aGVyZSBpcyBubyBlc2NhcGUgY2hhcmFjdGVyIGluIHRoZSBzdHJpbmcgdGhlcmUgaXMgbm90aGluZyB0byBkbwoJCWlmIChzdHJwb3MoJHBWYWx1ZSwgJxsnKSA9PT0gZmFsc2UpIHsKCQkJcmV0dXJuICRwVmFsdWU7CgkJfQoKCQlmb3JlYWNoIChzZWxmOjokX1NZTEtDaGFyYWN0ZXJzIGFzICRrID0+ICR2KSB7CgkJCSRwVmFsdWUgPSBzdHJfcmVwbGFjZSgkaywgJHYsICRwVmFsdWUpOwoJCX0KCgkJcmV0dXJuICRwVmFsdWU7Cgl9CgoJLyoqCgkgKiBSZXRyaWV2ZSBhbnkgbGVhZGluZyBudW1lcmljIHBhcnQgb2YgYSBzdHJpbmcsIG9yIHJldHVybiB0aGUgZnVsbCBzdHJpbmcgaWYgbm8gbGVhZGluZyBudW1lcmljCgkgKgkoaGFuZGxlcyBiYXNpYyBpbnRlZ2VyIG9yIGZsb2F0LCBidXQgbm90IGV4cG9uZW50IG9yIG5vbiBkZWNpbWFsKQoJICoKCSAqIEBwYXJhbQlzdHJpbmcJJHZhbHVlCgkgKiBAcmV0dXJuCW1peGVkCXN0cmluZyBvciBvbmx5IHRoZSBsZWFkaW5nIG51bWVyaWMgcGFydCBvZiB0aGUgc3RyaW5nCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gdGVzdFN0cmluZ0FzTnVtZXJpYygkdmFsdWUpCgl7CgkJaWYgKGlzX251bWVyaWMoJHZhbHVlKSkKCQkJcmV0dXJuICR2YWx1ZTsKCQkkdiA9IGZsb2F0dmFsKCR2YWx1ZSk7CgkJcmV0dXJuIChpc19udW1lcmljKHN1YnN0cigkdmFsdWUsMCxzdHJsZW4oJHYpKSkpID8gJHYgOiAkdmFsdWU7Cgl9Cn0K]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Shared/trend/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Shared/trend/bestFitClass.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIFBIUEV4Y2VsCiAqCiAqIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICoKICogQGNhdGVnb3J5ICAgUEhQRXhjZWwKICogQHBhY2thZ2UgICAgUEhQRXhjZWxfU2hhcmVkX1RyZW5kCiAqIEBjb3B5cmlnaHQgIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwgKGh0dHA6Ly93d3cuY29kZXBsZXguY29tL1BIUEV4Y2VsKQogKiBAbGljZW5zZSAgICBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvb2xkLWxpY2Vuc2VzL2xncGwtMi4xLnR4dAlMR1BMCiAqIEB2ZXJzaW9uICAgIDEuNy43LCAyMDEyLTA1LTE5CiAqLwoKCi8qKgogKiBQSFBFeGNlbF9CZXN0X0ZpdAogKgogKiBAY2F0ZWdvcnkgICBQSFBFeGNlbAogKiBAcGFja2FnZSAgICBQSFBFeGNlbF9TaGFyZWRfVHJlbmQKICogQGNvcHlyaWdodCAgQ29weXJpZ2h0IChjKSAyMDA2IC0gMjAxMiBQSFBFeGNlbCAoaHR0cDovL3d3dy5jb2RlcGxleC5jb20vUEhQRXhjZWwpCiAqLwpjbGFzcyBQSFBFeGNlbF9CZXN0X0ZpdAp7CgkvKioKCSAqIEluZGljYXRvciBmbGFnIGZvciBhIGNhbGN1bGF0aW9uIGVycm9yCgkgKgoJICogQHZhcglib29sZWFuCgkgKiovCglwcm90ZWN0ZWQgJF9lcnJvcgkJCQk9IEZhbHNlOwoKCS8qKgoJICogQWxnb3JpdGhtIHR5cGUgdG8gdXNlIGZvciBiZXN0LWZpdAoJICoKCSAqIEB2YXIJc3RyaW5nCgkgKiovCglwcm90ZWN0ZWQgJF9iZXN0Rml0VHlwZQkJCT0gJ3VuZGV0ZXJtaW5lZCc7CgoJLyoqCgkgKiBOdW1iZXIgb2YgZW50cmllcyBpbiB0aGUgc2V0cyBvZiB4LSBhbmQgeS12YWx1ZSBhcnJheXMKCSAqCgkgKiBAdmFyCWludAoJICoqLwoJcHJvdGVjdGVkICRfdmFsdWVDb3VudAkJCT0gMDsKCgkvKioKCSAqIFgtdmFsdWUgZGF0YXNlcmllcyBvZiB2YWx1ZXMKCSAqCgkgKiBAdmFyCWZsb2F0W10KCSAqKi8KCXByb3RlY3RlZCAkX3hWYWx1ZXMJCQkJPSBhcnJheSgpOwoKCS8qKgoJICogWS12YWx1ZSBkYXRhc2VyaWVzIG9mIHZhbHVlcwoJICoKCSAqIEB2YXIJZmxvYXRbXQoJICoqLwoJcHJvdGVjdGVkICRfeVZhbHVlcwkJCQk9IGFycmF5KCk7CgoJLyoqCgkgKiBGbGFnIGluZGljYXRpbmcgd2hldGhlciB2YWx1ZXMgc2hvdWxkIGJlIGFkanVzdGVkIHRvIFk9MAoJICoKCSAqIEB2YXIJYm9vbGVhbgoJICoqLwoJcHJvdGVjdGVkICRfYWRqdXN0VG9aZXJvCQk9IEZhbHNlOwoKCS8qKgoJICogWS12YWx1ZSBzZXJpZXMgb2YgYmVzdC1maXQgdmFsdWVzCgkgKgoJICogQHZhcglmbG9hdFtdCgkgKiovCglwcm90ZWN0ZWQgJF95QmVzdEZpdFZhbHVlcwkJPSBhcnJheSgpOwoKCXByb3RlY3RlZCAkX2dvb2RuZXNzT2ZGaXQgCQk9IDE7CgoJcHJvdGVjdGVkICRfc3RkZXZPZlJlc2lkdWFscwk9IDA7CgoJcHJvdGVjdGVkICRfY292YXJpYW5jZQkJCT0gMDsKCglwcm90ZWN0ZWQgJF9jb3JyZWxhdGlvbgkJCT0gMDsKCglwcm90ZWN0ZWQgJF9TU1JlZ3Jlc3Npb24JCT0gMDsKCglwcm90ZWN0ZWQgJF9TU1Jlc2lkdWFscwkJCT0gMDsKCglwcm90ZWN0ZWQgJF9ERlJlc2lkdWFscwkJCT0gMDsKCglwcm90ZWN0ZWQgJF9GCQkJCQk9IDA7CgoJcHJvdGVjdGVkICRfc2xvcGUJCQkJPSAwOwoKCXByb3RlY3RlZCAkX3Nsb3BlU0UJCQkJPSAwOwoKCXByb3RlY3RlZCAkX2ludGVyc2VjdAkJCT0gMDsKCglwcm90ZWN0ZWQgJF9pbnRlcnNlY3RTRQkJCT0gMDsKCglwcm90ZWN0ZWQgJF9Yb2Zmc2V0CQkJCT0gMDsKCglwcm90ZWN0ZWQgJF9Zb2Zmc2V0CQkJCT0gMDsKCgoJcHVibGljIGZ1bmN0aW9uIGdldEVycm9yKCkgewoJCXJldHVybiAkdGhpcy0+X2Vycm9yOwoJfQkvLwlmdW5jdGlvbiBnZXRCZXN0Rml0VHlwZSgpCgoKCXB1YmxpYyBmdW5jdGlvbiBnZXRCZXN0Rml0VHlwZSgpIHsKCQlyZXR1cm4gJHRoaXMtPl9iZXN0Rml0VHlwZTsKCX0JLy8JZnVuY3Rpb24gZ2V0QmVzdEZpdFR5cGUoKQoKCgkvKioKCSAqIFJldHVybiB0aGUgWS1WYWx1ZSBmb3IgYSBzcGVjaWZpZWQgdmFsdWUgb2YgWAoJICoKCSAqIEBwYXJhbQkgZmxvYXQJCSR4VmFsdWUJCQlYLVZhbHVlCgkgKiBAcmV0dXJuCSBmbG9hdAkJCQkJCVktVmFsdWUKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldFZhbHVlT2ZZRm9yWCgkeFZhbHVlKSB7CgkJcmV0dXJuIEZhbHNlOwoJfQkvLwlmdW5jdGlvbiBnZXRWYWx1ZU9mWUZvclgoKQoKCgkvKioKCSAqIFJldHVybiB0aGUgWC1WYWx1ZSBmb3IgYSBzcGVjaWZpZWQgdmFsdWUgb2YgWQoJICoKCSAqIEBwYXJhbQkgZmxvYXQJCSR5VmFsdWUJCQlZLVZhbHVlCgkgKiBAcmV0dXJuCSBmbG9hdAkJCQkJCVgtVmFsdWUKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldFZhbHVlT2ZYRm9yWSgkeVZhbHVlKSB7CgkJcmV0dXJuIEZhbHNlOwoJfQkvLwlmdW5jdGlvbiBnZXRWYWx1ZU9mWEZvclkoKQoKCgkvKioKCSAqIFJldHVybiB0aGUgb3JpZ2luYWwgc2V0IG9mIFgtVmFsdWVzCgkgKgoJICogQHJldHVybgkgZmxvYXRbXQkJCQlYLVZhbHVlcwoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0WFZhbHVlcygpIHsKCQlyZXR1cm4gJHRoaXMtPl94VmFsdWVzOwoJfQkvLwlmdW5jdGlvbiBnZXRWYWx1ZU9mWEZvclkoKQoKCgkvKioKCSAqIFJldHVybiB0aGUgRXF1YXRpb24gb2YgdGhlIGJlc3QtZml0IGxpbmUKCSAqCgkgKiBAcGFyYW0JIGludAkJJGRwCQlOdW1iZXIgb2YgcGxhY2VzIG9mIGRlY2ltYWwgcHJlY2lzaW9uIHRvIGRpc3BsYXkKCSAqIEByZXR1cm4JIHN0cmluZwoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0RXF1YXRpb24oJGRwPTApIHsKCQlyZXR1cm4gRmFsc2U7Cgl9CS8vCWZ1bmN0aW9uIGdldEVxdWF0aW9uKCkKCgoJLyoqCgkgKiBSZXR1cm4gdGhlIFNsb3BlIG9mIHRoZSBsaW5lCgkgKgoJICogQHBhcmFtCSBpbnQJCSRkcAkJTnVtYmVyIG9mIHBsYWNlcyBvZiBkZWNpbWFsIHByZWNpc2lvbiB0byBkaXNwbGF5CgkgKiBAcmV0dXJuCSBzdHJpbmcKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldFNsb3BlKCRkcD0wKSB7CgkJaWYgKCRkcCAhPSAwKSB7CgkJCXJldHVybiByb3VuZCgkdGhpcy0+X3Nsb3BlLCRkcCk7CgkJfQoJCXJldHVybiAkdGhpcy0+X3Nsb3BlOwoJfQkvLwlmdW5jdGlvbiBnZXRTbG9wZSgpCgoKCS8qKgoJICogUmV0dXJuIHRoZSBzdGFuZGFyZCBlcnJvciBvZiB0aGUgU2xvcGUKCSAqCgkgKiBAcGFyYW0JIGludAkJJGRwCQlOdW1iZXIgb2YgcGxhY2VzIG9mIGRlY2ltYWwgcHJlY2lzaW9uIHRvIGRpc3BsYXkKCSAqIEByZXR1cm4JIHN0cmluZwoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0U2xvcGVTRSgkZHA9MCkgewoJCWlmICgkZHAgIT0gMCkgewoJCQlyZXR1cm4gcm91bmQoJHRoaXMtPl9zbG9wZVNFLCRkcCk7CgkJfQoJCXJldHVybiAkdGhpcy0+X3Nsb3BlU0U7Cgl9CS8vCWZ1bmN0aW9uIGdldFNsb3BlU0UoKQoKCgkvKioKCSAqIFJldHVybiB0aGUgVmFsdWUgb2YgWCB3aGVyZSBpdCBpbnRlcnNlY3RzIFkgPSAwCgkgKgoJICogQHBhcmFtCSBpbnQJCSRkcAkJTnVtYmVyIG9mIHBsYWNlcyBvZiBkZWNpbWFsIHByZWNpc2lvbiB0byBkaXNwbGF5CgkgKiBAcmV0dXJuCSBzdHJpbmcKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldEludGVyc2VjdCgkZHA9MCkgewoJCWlmICgkZHAgIT0gMCkgewoJCQlyZXR1cm4gcm91bmQoJHRoaXMtPl9pbnRlcnNlY3QsJGRwKTsKCQl9CgkJcmV0dXJuICR0aGlzLT5faW50ZXJzZWN0OwoJfQkvLwlmdW5jdGlvbiBnZXRJbnRlcnNlY3QoKQoKCgkvKioKCSAqIFJldHVybiB0aGUgc3RhbmRhcmQgZXJyb3Igb2YgdGhlIEludGVyc2VjdAoJICoKCSAqIEBwYXJhbQkgaW50CQkkZHAJCU51bWJlciBvZiBwbGFjZXMgb2YgZGVjaW1hbCBwcmVjaXNpb24gdG8gZGlzcGxheQoJICogQHJldHVybgkgc3RyaW5nCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRJbnRlcnNlY3RTRSgkZHA9MCkgewoJCWlmICgkZHAgIT0gMCkgewoJCQlyZXR1cm4gcm91bmQoJHRoaXMtPl9pbnRlcnNlY3RTRSwkZHApOwoJCX0KCQlyZXR1cm4gJHRoaXMtPl9pbnRlcnNlY3RTRTsKCX0JLy8JZnVuY3Rpb24gZ2V0SW50ZXJzZWN0U0UoKQoKCgkvKioKCSAqIFJldHVybiB0aGUgZ29vZG5lc3Mgb2YgZml0IGZvciB0aGlzIHJlZ3Jlc3Npb24KCSAqCgkgKiBAcGFyYW0JIGludAkJJGRwCQlOdW1iZXIgb2YgcGxhY2VzIG9mIGRlY2ltYWwgcHJlY2lzaW9uIHRvIHJldHVybgoJICogQHJldHVybgkgZmxvYXQKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldEdvb2RuZXNzT2ZGaXQoJGRwPTApIHsKCQlpZiAoJGRwICE9IDApIHsKCQkJcmV0dXJuIHJvdW5kKCR0aGlzLT5fZ29vZG5lc3NPZkZpdCwkZHApOwoJCX0KCQlyZXR1cm4gJHRoaXMtPl9nb29kbmVzc09mRml0OwoJfQkvLwlmdW5jdGlvbiBnZXRHb29kbmVzc09mRml0KCkKCgoJcHVibGljIGZ1bmN0aW9uIGdldEdvb2RuZXNzT2ZGaXRQZXJjZW50KCRkcD0wKSB7CgkJaWYgKCRkcCAhPSAwKSB7CgkJCXJldHVybiByb3VuZCgkdGhpcy0+X2dvb2RuZXNzT2ZGaXQgKiAxMDAsJGRwKTsKCQl9CgkJcmV0dXJuICR0aGlzLT5fZ29vZG5lc3NPZkZpdCAqIDEwMDsKCX0JLy8JZnVuY3Rpb24gZ2V0R29vZG5lc3NPZkZpdFBlcmNlbnQoKQoKCgkvKioKCSAqIFJldHVybiB0aGUgc3RhbmRhcmQgZGV2aWF0aW9uIG9mIHRoZSByZXNpZHVhbHMgZm9yIHRoaXMgcmVncmVzc2lvbgoJICoKCSAqIEBwYXJhbQkgaW50CQkkZHAJCU51bWJlciBvZiBwbGFjZXMgb2YgZGVjaW1hbCBwcmVjaXNpb24gdG8gcmV0dXJuCgkgKiBAcmV0dXJuCSBmbG9hdAoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0U3RkZXZPZlJlc2lkdWFscygkZHA9MCkgewoJCWlmICgkZHAgIT0gMCkgewoJCQlyZXR1cm4gcm91bmQoJHRoaXMtPl9zdGRldk9mUmVzaWR1YWxzLCRkcCk7CgkJfQoJCXJldHVybiAkdGhpcy0+X3N0ZGV2T2ZSZXNpZHVhbHM7Cgl9CS8vCWZ1bmN0aW9uIGdldFN0ZGV2T2ZSZXNpZHVhbHMoKQoKCglwdWJsaWMgZnVuY3Rpb24gZ2V0U1NSZWdyZXNzaW9uKCRkcD0wKSB7CgkJaWYgKCRkcCAhPSAwKSB7CgkJCXJldHVybiByb3VuZCgkdGhpcy0+X1NTUmVncmVzc2lvbiwkZHApOwoJCX0KCQlyZXR1cm4gJHRoaXMtPl9TU1JlZ3Jlc3Npb247Cgl9CS8vCWZ1bmN0aW9uIGdldFNTUmVncmVzc2lvbigpCgoKCXB1YmxpYyBmdW5jdGlvbiBnZXRTU1Jlc2lkdWFscygkZHA9MCkgewoJCWlmICgkZHAgIT0gMCkgewoJCQlyZXR1cm4gcm91bmQoJHRoaXMtPl9TU1Jlc2lkdWFscywkZHApOwoJCX0KCQlyZXR1cm4gJHRoaXMtPl9TU1Jlc2lkdWFsczsKCX0JLy8JZnVuY3Rpb24gZ2V0U1NSZXNpZHVhbHMoKQoKCglwdWJsaWMgZnVuY3Rpb24gZ2V0REZSZXNpZHVhbHMoJGRwPTApIHsKCQlpZiAoJGRwICE9IDApIHsKCQkJcmV0dXJuIHJvdW5kKCR0aGlzLT5fREZSZXNpZHVhbHMsJGRwKTsKCQl9CgkJcmV0dXJuICR0aGlzLT5fREZSZXNpZHVhbHM7Cgl9CS8vCWZ1bmN0aW9uIGdldERGUmVzaWR1YWxzKCkKCgoJcHVibGljIGZ1bmN0aW9uIGdldEYoJGRwPTApIHsKCQlpZiAoJGRwICE9IDApIHsKCQkJcmV0dXJuIHJvdW5kKCR0aGlzLT5fRiwkZHApOwoJCX0KCQlyZXR1cm4gJHRoaXMtPl9GOwoJfQkvLwlmdW5jdGlvbiBnZXRGKCkKCgoJcHVibGljIGZ1bmN0aW9uIGdldENvdmFyaWFuY2UoJGRwPTApIHsKCQlpZiAoJGRwICE9IDApIHsKCQkJcmV0dXJuIHJvdW5kKCR0aGlzLT5fY292YXJpYW5jZSwkZHApOwoJCX0KCQlyZXR1cm4gJHRoaXMtPl9jb3ZhcmlhbmNlOwoJfQkvLwlmdW5jdGlvbiBnZXRDb3ZhcmlhbmNlKCkKCgoJcHVibGljIGZ1bmN0aW9uIGdldENvcnJlbGF0aW9uKCRkcD0wKSB7CgkJaWYgKCRkcCAhPSAwKSB7CgkJCXJldHVybiByb3VuZCgkdGhpcy0+X2NvcnJlbGF0aW9uLCRkcCk7CgkJfQoJCXJldHVybiAkdGhpcy0+X2NvcnJlbGF0aW9uOwoJfQkvLwlmdW5jdGlvbiBnZXRDb3JyZWxhdGlvbigpCgoKCXB1YmxpYyBmdW5jdGlvbiBnZXRZQmVzdEZpdFZhbHVlcygpIHsKCQlyZXR1cm4gJHRoaXMtPl95QmVzdEZpdFZhbHVlczsKCX0JLy8JZnVuY3Rpb24gZ2V0WUJlc3RGaXRWYWx1ZXMoKQoKCglwcm90ZWN0ZWQgZnVuY3Rpb24gX2NhbGN1bGF0ZUdvb2RuZXNzT2ZGaXQoJHN1bVgsJHN1bVksJHN1bVgyLCRzdW1ZMiwkc3VtWFksJG1lYW5YLCRtZWFuWSwgJGNvbnN0KSB7CgkJJFNTcmVzID0gJFNTY292ID0gJFNTY29yID0gJFNTdG90ID0gJFNTc2V4ID0gMC4wOwoJCWZvcmVhY2goJHRoaXMtPl94VmFsdWVzIGFzICR4S2V5ID0+ICR4VmFsdWUpIHsKCQkJJGJlc3RGaXRZID0gJHRoaXMtPl95QmVzdEZpdFZhbHVlc1skeEtleV0gPSAkdGhpcy0+Z2V0VmFsdWVPZllGb3JYKCR4VmFsdWUpOwoKCQkJJFNTcmVzICs9ICgkdGhpcy0+X3lWYWx1ZXNbJHhLZXldIC0gJGJlc3RGaXRZKSAqICgkdGhpcy0+X3lWYWx1ZXNbJHhLZXldIC0gJGJlc3RGaXRZKTsKCQkJaWYgKCRjb25zdCkgewoJCQkJJFNTdG90ICs9ICgkdGhpcy0+X3lWYWx1ZXNbJHhLZXldIC0gJG1lYW5ZKSAqICgkdGhpcy0+X3lWYWx1ZXNbJHhLZXldIC0gJG1lYW5ZKTsKCQkJfSBlbHNlIHsKCQkJCSRTU3RvdCArPSAkdGhpcy0+X3lWYWx1ZXNbJHhLZXldICogJHRoaXMtPl95VmFsdWVzWyR4S2V5XTsKCQkJfQoJCQkkU1Njb3YgKz0gKCR0aGlzLT5feFZhbHVlc1skeEtleV0gLSAkbWVhblgpICogKCR0aGlzLT5feVZhbHVlc1skeEtleV0gLSAkbWVhblkpOwoJCQlpZiAoJGNvbnN0KSB7CgkJCQkkU1NzZXggKz0gKCR0aGlzLT5feFZhbHVlc1skeEtleV0gLSAkbWVhblgpICogKCR0aGlzLT5feFZhbHVlc1skeEtleV0gLSAkbWVhblgpOwoJCQl9IGVsc2UgewoJCQkJJFNTc2V4ICs9ICR0aGlzLT5feFZhbHVlc1skeEtleV0gKiAkdGhpcy0+X3hWYWx1ZXNbJHhLZXldOwoJCQl9CgkJfQoKCQkkdGhpcy0+X1NTUmVzaWR1YWxzID0gJFNTcmVzOwoJCSR0aGlzLT5fREZSZXNpZHVhbHMgPSAkdGhpcy0+X3ZhbHVlQ291bnQgLSAxIC0gJGNvbnN0OwoKCQlpZiAoJHRoaXMtPl9ERlJlc2lkdWFscyA9PSAwLjApIHsKCQkJJHRoaXMtPl9zdGRldk9mUmVzaWR1YWxzID0gMC4wOwoJCX0gZWxzZSB7CgkJCSR0aGlzLT5fc3RkZXZPZlJlc2lkdWFscyA9IHNxcnQoJFNTcmVzIC8gJHRoaXMtPl9ERlJlc2lkdWFscyk7CgkJfQoJCWlmICgoJFNTdG90ID09IDAuMCkgfHwgKCRTU3JlcyA9PSAkU1N0b3QpKSB7CgkJCSR0aGlzLT5fZ29vZG5lc3NPZkZpdCA9IDE7CgkJfSBlbHNlIHsKCQkJJHRoaXMtPl9nb29kbmVzc09mRml0ID0gMSAtICgkU1NyZXMgLyAkU1N0b3QpOwoJCX0KCgkJJHRoaXMtPl9TU1JlZ3Jlc3Npb24gPSAkdGhpcy0+X2dvb2RuZXNzT2ZGaXQgKiAkU1N0b3Q7CgkJJHRoaXMtPl9jb3ZhcmlhbmNlID0gJFNTY292IC8gJHRoaXMtPl92YWx1ZUNvdW50OwoJCSR0aGlzLT5fY29ycmVsYXRpb24gPSAoJHRoaXMtPl92YWx1ZUNvdW50ICogJHN1bVhZIC0gJHN1bVggKiAkc3VtWSkgLyBzcXJ0KCgkdGhpcy0+X3ZhbHVlQ291bnQgKiAkc3VtWDIgLSBwb3coJHN1bVgsMikpICogKCR0aGlzLT5fdmFsdWVDb3VudCAqICRzdW1ZMiAtIHBvdygkc3VtWSwyKSkpOwoJCSR0aGlzLT5fc2xvcGVTRSA9ICR0aGlzLT5fc3RkZXZPZlJlc2lkdWFscyAvIHNxcnQoJFNTc2V4KTsKCQkkdGhpcy0+X2ludGVyc2VjdFNFID0gJHRoaXMtPl9zdGRldk9mUmVzaWR1YWxzICogc3FydCgxIC8gKCR0aGlzLT5fdmFsdWVDb3VudCAtICgkc3VtWCAqICRzdW1YKSAvICRzdW1YMikpOwoJCWlmICgkdGhpcy0+X1NTUmVzaWR1YWxzICE9IDAuMCkgewoJCQlpZiAoJHRoaXMtPl9ERlJlc2lkdWFscyA9PSAwLjApIHsKCQkJCSR0aGlzLT5fRiA9IDAuMDsKCQkJfSBlbHNlIHsKCQkJCSR0aGlzLT5fRiA9ICR0aGlzLT5fU1NSZWdyZXNzaW9uIC8gKCR0aGlzLT5fU1NSZXNpZHVhbHMgLyAkdGhpcy0+X0RGUmVzaWR1YWxzKTsKCQkJfQoJCX0gZWxzZSB7CgkJCWlmICgkdGhpcy0+X0RGUmVzaWR1YWxzID09IDAuMCkgewoJCQkJJHRoaXMtPl9GID0gMC4wOwoJCQl9IGVsc2UgewoJCQkJJHRoaXMtPl9GID0gJHRoaXMtPl9TU1JlZ3Jlc3Npb24gLyAkdGhpcy0+X0RGUmVzaWR1YWxzOwoJCQl9CgkJfQoJfQkvLwlmdW5jdGlvbiBfY2FsY3VsYXRlR29vZG5lc3NPZkZpdCgpCgoKCXByb3RlY3RlZCBmdW5jdGlvbiBfbGVhc3RTcXVhcmVGaXQoJHlWYWx1ZXMsICR4VmFsdWVzLCAkY29uc3QpIHsKCQkvLyBjYWxjdWxhdGUgc3VtcwoJCSR4X3N1bSA9IGFycmF5X3N1bSgkeFZhbHVlcyk7CgkJJHlfc3VtID0gYXJyYXlfc3VtKCR5VmFsdWVzKTsKCQkkbWVhblggPSAkeF9zdW0gLyAkdGhpcy0+X3ZhbHVlQ291bnQ7CgkJJG1lYW5ZID0gJHlfc3VtIC8gJHRoaXMtPl92YWx1ZUNvdW50OwoJCSRtQmFzZSA9ICRtRGl2aXNvciA9ICR4eF9zdW0gPSAkeHlfc3VtID0gJHl5X3N1bSA9IDAuMDsKCQlmb3IoJGkgPSAwOyAkaSA8ICR0aGlzLT5fdmFsdWVDb3VudDsgKyskaSkgewoJCQkkeHlfc3VtICs9ICR4VmFsdWVzWyRpXSAqICR5VmFsdWVzWyRpXTsKCQkJJHh4X3N1bSArPSAkeFZhbHVlc1skaV0gKiAkeFZhbHVlc1skaV07CgkJCSR5eV9zdW0gKz0gJHlWYWx1ZXNbJGldICogJHlWYWx1ZXNbJGldOwoKCQkJaWYgKCRjb25zdCkgewoJCQkJJG1CYXNlICs9ICgkeFZhbHVlc1skaV0gLSAkbWVhblgpICogKCR5VmFsdWVzWyRpXSAtICRtZWFuWSk7CgkJCQkkbURpdmlzb3IgKz0gKCR4VmFsdWVzWyRpXSAtICRtZWFuWCkgKiAoJHhWYWx1ZXNbJGldIC0gJG1lYW5YKTsKCQkJfSBlbHNlIHsKCQkJCSRtQmFzZSArPSAkeFZhbHVlc1skaV0gKiAkeVZhbHVlc1skaV07CgkJCQkkbURpdmlzb3IgKz0gJHhWYWx1ZXNbJGldICogJHhWYWx1ZXNbJGldOwoJCQl9CgkJfQoKCQkvLyBjYWxjdWxhdGUgc2xvcGUKLy8JCSR0aGlzLT5fc2xvcGUgPSAoKCR0aGlzLT5fdmFsdWVDb3VudCAqICR4eV9zdW0pIC0gKCR4X3N1bSAqICR5X3N1bSkpIC8gKCgkdGhpcy0+X3ZhbHVlQ291bnQgKiAkeHhfc3VtKSAtICgkeF9zdW0gKiAkeF9zdW0pKTsKCQkkdGhpcy0+X3Nsb3BlID0gJG1CYXNlIC8gJG1EaXZpc29yOwoKCQkvLyBjYWxjdWxhdGUgaW50ZXJzZWN0Ci8vCQkkdGhpcy0+X2ludGVyc2VjdCA9ICgkeV9zdW0gLSAoJHRoaXMtPl9zbG9wZSAqICR4X3N1bSkpIC8gJHRoaXMtPl92YWx1ZUNvdW50OwoJCWlmICgkY29uc3QpIHsKCQkJJHRoaXMtPl9pbnRlcnNlY3QgPSAkbWVhblkgLSAoJHRoaXMtPl9zbG9wZSAqICRtZWFuWCk7CgkJfSBlbHNlIHsKCQkJJHRoaXMtPl9pbnRlcnNlY3QgPSAwOwoJCX0KCgkJJHRoaXMtPl9jYWxjdWxhdGVHb29kbmVzc09mRml0KCR4X3N1bSwkeV9zdW0sJHh4X3N1bSwkeXlfc3VtLCR4eV9zdW0sJG1lYW5YLCRtZWFuWSwkY29uc3QpOwoJfQkvLwlmdW5jdGlvbiBfbGVhc3RTcXVhcmVGaXQoKQoKCgkvKioKCSAqIERlZmluZSB0aGUgcmVncmVzc2lvbgoJICoKCSAqIEBwYXJhbQlmbG9hdFtdCQkkeVZhbHVlcwlUaGUgc2V0IG9mIFktdmFsdWVzIGZvciB0aGlzIHJlZ3Jlc3Npb24KCSAqIEBwYXJhbQlmbG9hdFtdCQkkeFZhbHVlcwlUaGUgc2V0IG9mIFgtdmFsdWVzIGZvciB0aGlzIHJlZ3Jlc3Npb24KCSAqIEBwYXJhbQlib29sZWFuCQkkY29uc3QKCSAqLwoJZnVuY3Rpb24gX19jb25zdHJ1Y3QoJHlWYWx1ZXMsICR4VmFsdWVzPWFycmF5KCksICRjb25zdD1UcnVlKSB7CgkJLy8JQ2FsY3VsYXRlIG51bWJlciBvZiBwb2ludHMKCQkkblkgPSBjb3VudCgkeVZhbHVlcyk7CgkJJG5YID0gY291bnQoJHhWYWx1ZXMpOwoKCQkvLwlEZWZpbmUgWCBWYWx1ZXMgaWYgbmVjZXNzYXJ5CgkJaWYgKCRuWCA9PSAwKSB7CgkJCSR4VmFsdWVzID0gcmFuZ2UoMSwkblkpOwoJCQkkblggPSAkblk7CgkJfSBlbHNlaWYgKCRuWSAhPSAkblgpIHsKCQkJLy8JRW5zdXJlIGJvdGggYXJyYXlzIG9mIHBvaW50cyBhcmUgdGhlIHNhbWUgc2l6ZQoJCQkkdGhpcy0+X2Vycm9yID0gVHJ1ZTsKCQkJcmV0dXJuIEZhbHNlOwoJCX0KCgkJJHRoaXMtPl92YWx1ZUNvdW50ID0gJG5ZOwoJCSR0aGlzLT5feFZhbHVlcyA9ICR4VmFsdWVzOwoJCSR0aGlzLT5feVZhbHVlcyA9ICR5VmFsdWVzOwoJfQkvLwlmdW5jdGlvbiBfX2NvbnN0cnVjdCgpCgp9CS8vCWNsYXNzIGJlc3RGaXQK]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Shared/trend/exponentialBestFitClass.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIFBIUEV4Y2VsCiAqCiAqIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICoKICogQGNhdGVnb3J5ICAgUEhQRXhjZWwKICogQHBhY2thZ2UgICAgUEhQRXhjZWxfU2hhcmVkX1RyZW5kCiAqIEBjb3B5cmlnaHQgIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwgKGh0dHA6Ly93d3cuY29kZXBsZXguY29tL1BIUEV4Y2VsKQogKiBAbGljZW5zZSAgICBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvb2xkLWxpY2Vuc2VzL2xncGwtMi4xLnR4dAlMR1BMCiAqIEB2ZXJzaW9uICAgIDEuNy43LCAyMDEyLTA1LTE5CiAqLwoKCnJlcXVpcmVfb25jZShQSFBFWENFTF9ST09UIC4gJ1BIUEV4Y2VsL1NoYXJlZC90cmVuZC9iZXN0Rml0Q2xhc3MucGhwJyk7CgoKLyoqCiAqIFBIUEV4Y2VsX0V4cG9uZW50aWFsX0Jlc3RfRml0CiAqCiAqIEBjYXRlZ29yeSAgIFBIUEV4Y2VsCiAqIEBwYWNrYWdlICAgIFBIUEV4Y2VsX1NoYXJlZF9UcmVuZAogKiBAY29weXJpZ2h0ICBDb3B5cmlnaHQgKGMpIDIwMDYgLSAyMDEyIFBIUEV4Y2VsIChodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9QSFBFeGNlbCkKICovCmNsYXNzIFBIUEV4Y2VsX0V4cG9uZW50aWFsX0Jlc3RfRml0IGV4dGVuZHMgUEhQRXhjZWxfQmVzdF9GaXQKewoJLyoqCgkgKiBBbGdvcml0aG0gdHlwZSB0byB1c2UgZm9yIGJlc3QtZml0CgkgKiAoTmFtZSBvZiB0aGlzIHRyZW5kIGNsYXNzKQoJICoKCSAqIEB2YXIJc3RyaW5nCgkgKiovCglwcm90ZWN0ZWQgJF9iZXN0Rml0VHlwZQkJPSAnZXhwb25lbnRpYWwnOwoKCgkvKioKCSAqIFJldHVybiB0aGUgWS1WYWx1ZSBmb3IgYSBzcGVjaWZpZWQgdmFsdWUgb2YgWAoJICoKCSAqIEBwYXJhbQkgZmxvYXQJCSR4VmFsdWUJCQlYLVZhbHVlCgkgKiBAcmV0dXJuCSBmbG9hdAkJCQkJCVktVmFsdWUKCSAqKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRWYWx1ZU9mWUZvclgoJHhWYWx1ZSkgewoJCXJldHVybiAkdGhpcy0+Z2V0SW50ZXJzZWN0KCkgKiBwb3coJHRoaXMtPmdldFNsb3BlKCksKCR4VmFsdWUgLSAkdGhpcy0+X1hvZmZzZXQpKTsKCX0JLy8JZnVuY3Rpb24gZ2V0VmFsdWVPZllGb3JYKCkKCgoJLyoqCgkgKiBSZXR1cm4gdGhlIFgtVmFsdWUgZm9yIGEgc3BlY2lmaWVkIHZhbHVlIG9mIFkKCSAqCgkgKiBAcGFyYW0JIGZsb2F0CQkkeVZhbHVlCQkJWS1WYWx1ZQoJICogQHJldHVybgkgZmxvYXQJCQkJCQlYLVZhbHVlCgkgKiovCglwdWJsaWMgZnVuY3Rpb24gZ2V0VmFsdWVPZlhGb3JZKCR5VmFsdWUpIHsKCQlyZXR1cm4gbG9nKCgkeVZhbHVlICsgJHRoaXMtPl9Zb2Zmc2V0KSAvICR0aGlzLT5nZXRJbnRlcnNlY3QoKSkgLyBsb2coJHRoaXMtPmdldFNsb3BlKCkpOwoJfQkvLwlmdW5jdGlvbiBnZXRWYWx1ZU9mWEZvclkoKQoKCgkvKioKCSAqIFJldHVybiB0aGUgRXF1YXRpb24gb2YgdGhlIGJlc3QtZml0IGxpbmUKCSAqCgkgKiBAcGFyYW0JIGludAkJJGRwCQlOdW1iZXIgb2YgcGxhY2VzIG9mIGRlY2ltYWwgcHJlY2lzaW9uIHRvIGRpc3BsYXkKCSAqIEByZXR1cm4JIHN0cmluZwoJICoqLwoJcHVibGljIGZ1bmN0aW9uIGdldEVxdWF0aW9uKCRkcD0wKSB7CgkJJHNsb3BlID0gJHRoaXMtPmdldFNsb3BlKCRkcCk7CgkJJGludGVyc2VjdCA9ICR0aGlzLT5nZXRJbnRlcnNlY3QoJGRwKTsKCgkJcmV0dXJuICdZID0gJy4kaW50ZXJzZWN0LicgKiAnLiRzbG9wZS4nXlgnOwoJfQkvLwlmdW5jdGlvbiBnZXRFcXVhdGlvbigpCgoKCS8qKgoJICogUmV0dXJuIHRoZSBTbG9wZSBvZiB0aGUgbGluZQoJICoKCSAqIEBwYXJhbQkgaW50CQkkZHAJCU51bWJlciBvZiBwbGFjZXMgb2YgZGVjaW1hbCBwcmVjaXNpb24gdG8gZGlzcGxheQoJICogQHJldHVybgkgc3RyaW5nCgkgKiovCglwdWJsaWMgZnVuY3Rpb24gZ2V0U2xvcGUoJGRwPTApIHsKCQlpZiAoJGRwICE9IDApIHsKCQkJcmV0dXJuIHJvdW5kKGV4cCgkdGhpcy0+X3Nsb3BlKSwkZHApOwoJCX0KCQlyZXR1cm4gZXhwKCR0aGlzLT5fc2xvcGUpOwoJfQkvLwlmdW5jdGlvbiBnZXRTbG9wZSgpCgoKCS8qKgoJICogUmV0dXJuIHRoZSBWYWx1ZSBvZiBYIHdoZXJlIGl0IGludGVyc2VjdHMgWSA9IDAKCSAqCgkgKiBAcGFyYW0JIGludAkJJGRwCQlOdW1iZXIgb2YgcGxhY2VzIG9mIGRlY2ltYWwgcHJlY2lzaW9uIHRvIGRpc3BsYXkKCSAqIEByZXR1cm4JIHN0cmluZwoJICoqLwoJcHVibGljIGZ1bmN0aW9uIGdldEludGVyc2VjdCgkZHA9MCkgewoJCWlmICgkZHAgIT0gMCkgewoJCQlyZXR1cm4gcm91bmQoZXhwKCR0aGlzLT5faW50ZXJzZWN0KSwkZHApOwoJCX0KCQlyZXR1cm4gZXhwKCR0aGlzLT5faW50ZXJzZWN0KTsKCX0JLy8JZnVuY3Rpb24gZ2V0SW50ZXJzZWN0KCkKCgoJLyoqCgkgKiBFeGVjdXRlIHRoZSByZWdyZXNzaW9uIGFuZCBjYWxjdWxhdGUgdGhlIGdvb2RuZXNzIG9mIGZpdCBmb3IgYSBzZXQgb2YgWCBhbmQgWSBkYXRhIHZhbHVlcwoJICoKCSAqIEBwYXJhbQkgZmxvYXRbXQkkeVZhbHVlcwlUaGUgc2V0IG9mIFktdmFsdWVzIGZvciB0aGlzIHJlZ3Jlc3Npb24KCSAqIEBwYXJhbQkgZmxvYXRbXQkkeFZhbHVlcwlUaGUgc2V0IG9mIFgtdmFsdWVzIGZvciB0aGlzIHJlZ3Jlc3Npb24KCSAqIEBwYXJhbQkgYm9vbGVhbgkkY29uc3QKCSAqLwoJcHJpdmF0ZSBmdW5jdGlvbiBfZXhwb25lbnRpYWxfcmVncmVzc2lvbigkeVZhbHVlcywgJHhWYWx1ZXMsICRjb25zdCkgewoJCWZvcmVhY2goJHlWYWx1ZXMgYXMgJiR2YWx1ZSkgewoJCQlpZiAoJHZhbHVlIDwgMC4wKSB7CgkJCQkkdmFsdWUgPSAwIC0gbG9nKGFicygkdmFsdWUpKTsKCQkJfSBlbHNlaWYgKCR2YWx1ZSA+IDAuMCkgewoJCQkJJHZhbHVlID0gbG9nKCR2YWx1ZSk7CgkJCX0KCQl9CgkJdW5zZXQoJHZhbHVlKTsKCgkJJHRoaXMtPl9sZWFzdFNxdWFyZUZpdCgkeVZhbHVlcywgJHhWYWx1ZXMsICRjb25zdCk7Cgl9CS8vCWZ1bmN0aW9uIF9leHBvbmVudGlhbF9yZWdyZXNzaW9uKCkKCgoJLyoqCgkgKiBEZWZpbmUgdGhlIHJlZ3Jlc3Npb24gYW5kIGNhbGN1bGF0ZSB0aGUgZ29vZG5lc3Mgb2YgZml0IGZvciBhIHNldCBvZiBYIGFuZCBZIGRhdGEgdmFsdWVzCgkgKgoJICogQHBhcmFtCWZsb2F0W10JCSR5VmFsdWVzCVRoZSBzZXQgb2YgWS12YWx1ZXMgZm9yIHRoaXMgcmVncmVzc2lvbgoJICogQHBhcmFtCWZsb2F0W10JCSR4VmFsdWVzCVRoZSBzZXQgb2YgWC12YWx1ZXMgZm9yIHRoaXMgcmVncmVzc2lvbgoJICogQHBhcmFtCWJvb2xlYW4JCSRjb25zdAoJICovCglmdW5jdGlvbiBfX2NvbnN0cnVjdCgkeVZhbHVlcywgJHhWYWx1ZXM9YXJyYXkoKSwgJGNvbnN0PVRydWUpIHsKCQlpZiAocGFyZW50OjpfX2NvbnN0cnVjdCgkeVZhbHVlcywgJHhWYWx1ZXMpICE9PSBGYWxzZSkgewoJCQkkdGhpcy0+X2V4cG9uZW50aWFsX3JlZ3Jlc3Npb24oJHlWYWx1ZXMsICR4VmFsdWVzLCAkY29uc3QpOwoJCX0KCX0JLy8JZnVuY3Rpb24gX19jb25zdHJ1Y3QoKQoKfQkvLwljbGFzcyBleHBvbmVudGlhbEJlc3RGaXQ=]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Shared/trend/linearBestFitClass.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIFBIUEV4Y2VsCiAqCiAqIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICoKICogQGNhdGVnb3J5ICAgUEhQRXhjZWwKICogQHBhY2thZ2UgICAgUEhQRXhjZWxfU2hhcmVkX1RyZW5kCiAqIEBjb3B5cmlnaHQgIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwgKGh0dHA6Ly93d3cuY29kZXBsZXguY29tL1BIUEV4Y2VsKQogKiBAbGljZW5zZSAgICBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvb2xkLWxpY2Vuc2VzL2xncGwtMi4xLnR4dAlMR1BMCiAqIEB2ZXJzaW9uICAgIDEuNy43LCAyMDEyLTA1LTE5CiAqLwoKCnJlcXVpcmVfb25jZShQSFBFWENFTF9ST09UIC4gJ1BIUEV4Y2VsL1NoYXJlZC90cmVuZC9iZXN0Rml0Q2xhc3MucGhwJyk7CgoKLyoqCiAqIFBIUEV4Y2VsX0xpbmVhcl9CZXN0X0ZpdAogKgogKiBAY2F0ZWdvcnkgICBQSFBFeGNlbAogKiBAcGFja2FnZSAgICBQSFBFeGNlbF9TaGFyZWRfVHJlbmQKICogQGNvcHlyaWdodCAgQ29weXJpZ2h0IChjKSAyMDA2IC0gMjAxMiBQSFBFeGNlbCAoaHR0cDovL3d3dy5jb2RlcGxleC5jb20vUEhQRXhjZWwpCiAqLwpjbGFzcyBQSFBFeGNlbF9MaW5lYXJfQmVzdF9GaXQgZXh0ZW5kcyBQSFBFeGNlbF9CZXN0X0ZpdAp7CgkvKioKCSAqIEFsZ29yaXRobSB0eXBlIHRvIHVzZSBmb3IgYmVzdC1maXQKCSAqIChOYW1lIG9mIHRoaXMgdHJlbmQgY2xhc3MpCgkgKgoJICogQHZhcglzdHJpbmcKCSAqKi8KCXByb3RlY3RlZCAkX2Jlc3RGaXRUeXBlCQk9ICdsaW5lYXInOwoKCgkvKioKCSAqIFJldHVybiB0aGUgWS1WYWx1ZSBmb3IgYSBzcGVjaWZpZWQgdmFsdWUgb2YgWAoJICoKCSAqIEBwYXJhbQkgZmxvYXQJCSR4VmFsdWUJCQlYLVZhbHVlCgkgKiBAcmV0dXJuCSBmbG9hdAkJCQkJCVktVmFsdWUKCSAqKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRWYWx1ZU9mWUZvclgoJHhWYWx1ZSkgewoJCXJldHVybiAkdGhpcy0+Z2V0SW50ZXJzZWN0KCkgKyAkdGhpcy0+Z2V0U2xvcGUoKSAqICR4VmFsdWU7Cgl9CS8vCWZ1bmN0aW9uIGdldFZhbHVlT2ZZRm9yWCgpCgoKCS8qKgoJICogUmV0dXJuIHRoZSBYLVZhbHVlIGZvciBhIHNwZWNpZmllZCB2YWx1ZSBvZiBZCgkgKgoJICogQHBhcmFtCSBmbG9hdAkJJHlWYWx1ZQkJCVktVmFsdWUKCSAqIEByZXR1cm4JIGZsb2F0CQkJCQkJWC1WYWx1ZQoJICoqLwoJcHVibGljIGZ1bmN0aW9uIGdldFZhbHVlT2ZYRm9yWSgkeVZhbHVlKSB7CgkJcmV0dXJuICgkeVZhbHVlIC0gJHRoaXMtPmdldEludGVyc2VjdCgpKSAvICR0aGlzLT5nZXRTbG9wZSgpOwoJfQkvLwlmdW5jdGlvbiBnZXRWYWx1ZU9mWEZvclkoKQoKCgkvKioKCSAqIFJldHVybiB0aGUgRXF1YXRpb24gb2YgdGhlIGJlc3QtZml0IGxpbmUKCSAqCgkgKiBAcGFyYW0JIGludAkJJGRwCQlOdW1iZXIgb2YgcGxhY2VzIG9mIGRlY2ltYWwgcHJlY2lzaW9uIHRvIGRpc3BsYXkKCSAqIEByZXR1cm4JIHN0cmluZwoJICoqLwoJcHVibGljIGZ1bmN0aW9uIGdldEVxdWF0aW9uKCRkcD0wKSB7CgkJJHNsb3BlID0gJHRoaXMtPmdldFNsb3BlKCRkcCk7CgkJJGludGVyc2VjdCA9ICR0aGlzLT5nZXRJbnRlcnNlY3QoJGRwKTsKCgkJcmV0dXJuICdZID0gJy4kaW50ZXJzZWN0LicgKyAnLiRzbG9wZS4nICogWCc7Cgl9CS8vCWZ1bmN0aW9uIGdldEVxdWF0aW9uKCkKCgoJLyoqCgkgKiBFeGVjdXRlIHRoZSByZWdyZXNzaW9uIGFuZCBjYWxjdWxhdGUgdGhlIGdvb2RuZXNzIG9mIGZpdCBmb3IgYSBzZXQgb2YgWCBhbmQgWSBkYXRhIHZhbHVlcwoJICoKCSAqIEBwYXJhbQkgZmxvYXRbXQkkeVZhbHVlcwlUaGUgc2V0IG9mIFktdmFsdWVzIGZvciB0aGlzIHJlZ3Jlc3Npb24KCSAqIEBwYXJhbQkgZmxvYXRbXQkkeFZhbHVlcwlUaGUgc2V0IG9mIFgtdmFsdWVzIGZvciB0aGlzIHJlZ3Jlc3Npb24KCSAqIEBwYXJhbQkgYm9vbGVhbgkkY29uc3QKCSAqLwoJcHJpdmF0ZSBmdW5jdGlvbiBfbGluZWFyX3JlZ3Jlc3Npb24oJHlWYWx1ZXMsICR4VmFsdWVzLCAkY29uc3QpIHsKCQkkdGhpcy0+X2xlYXN0U3F1YXJlRml0KCR5VmFsdWVzLCAkeFZhbHVlcywkY29uc3QpOwoJfQkvLwlmdW5jdGlvbiBfbGluZWFyX3JlZ3Jlc3Npb24oKQoKCgkvKioKCSAqIERlZmluZSB0aGUgcmVncmVzc2lvbiBhbmQgY2FsY3VsYXRlIHRoZSBnb29kbmVzcyBvZiBmaXQgZm9yIGEgc2V0IG9mIFggYW5kIFkgZGF0YSB2YWx1ZXMKCSAqCgkgKiBAcGFyYW0JZmxvYXRbXQkJJHlWYWx1ZXMJVGhlIHNldCBvZiBZLXZhbHVlcyBmb3IgdGhpcyByZWdyZXNzaW9uCgkgKiBAcGFyYW0JZmxvYXRbXQkJJHhWYWx1ZXMJVGhlIHNldCBvZiBYLXZhbHVlcyBmb3IgdGhpcyByZWdyZXNzaW9uCgkgKiBAcGFyYW0JYm9vbGVhbgkJJGNvbnN0CgkgKi8KCWZ1bmN0aW9uIF9fY29uc3RydWN0KCR5VmFsdWVzLCAkeFZhbHVlcz1hcnJheSgpLCAkY29uc3Q9VHJ1ZSkgewoJCWlmIChwYXJlbnQ6Ol9fY29uc3RydWN0KCR5VmFsdWVzLCAkeFZhbHVlcykgIT09IEZhbHNlKSB7CgkJCSR0aGlzLT5fbGluZWFyX3JlZ3Jlc3Npb24oJHlWYWx1ZXMsICR4VmFsdWVzLCAkY29uc3QpOwoJCX0KCX0JLy8JZnVuY3Rpb24gX19jb25zdHJ1Y3QoKQoKfQkvLwljbGFzcyBsaW5lYXJCZXN0Rml0]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Shared/trend/logarithmicBestFitClass.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIFBIUEV4Y2VsCiAqCiAqIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICoKICogQGNhdGVnb3J5ICAgUEhQRXhjZWwKICogQHBhY2thZ2UgICAgUEhQRXhjZWxfU2hhcmVkX1RyZW5kCiAqIEBjb3B5cmlnaHQgIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwgKGh0dHA6Ly93d3cuY29kZXBsZXguY29tL1BIUEV4Y2VsKQogKiBAbGljZW5zZSAgICBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvb2xkLWxpY2Vuc2VzL2xncGwtMi4xLnR4dAlMR1BMCiAqIEB2ZXJzaW9uICAgIDEuNy43LCAyMDEyLTA1LTE5CiAqLwoKCnJlcXVpcmVfb25jZShQSFBFWENFTF9ST09UIC4gJ1BIUEV4Y2VsL1NoYXJlZC90cmVuZC9iZXN0Rml0Q2xhc3MucGhwJyk7CgoKLyoqCiAqIFBIUEV4Y2VsX0xvZ2FyaXRobWljX0Jlc3RfRml0CiAqCiAqIEBjYXRlZ29yeSAgIFBIUEV4Y2VsCiAqIEBwYWNrYWdlICAgIFBIUEV4Y2VsX1NoYXJlZF9UcmVuZAogKiBAY29weXJpZ2h0ICBDb3B5cmlnaHQgKGMpIDIwMDYgLSAyMDEyIFBIUEV4Y2VsIChodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9QSFBFeGNlbCkKICovCmNsYXNzIFBIUEV4Y2VsX0xvZ2FyaXRobWljX0Jlc3RfRml0IGV4dGVuZHMgUEhQRXhjZWxfQmVzdF9GaXQKewoJLyoqCgkgKiBBbGdvcml0aG0gdHlwZSB0byB1c2UgZm9yIGJlc3QtZml0CgkgKiAoTmFtZSBvZiB0aGlzIHRyZW5kIGNsYXNzKQoJICoKCSAqIEB2YXIJc3RyaW5nCgkgKiovCglwcm90ZWN0ZWQgJF9iZXN0Rml0VHlwZQkJPSAnbG9nYXJpdGhtaWMnOwoKCgkvKioKCSAqIFJldHVybiB0aGUgWS1WYWx1ZSBmb3IgYSBzcGVjaWZpZWQgdmFsdWUgb2YgWAoJICoKCSAqIEBwYXJhbQkgZmxvYXQJCSR4VmFsdWUJCQlYLVZhbHVlCgkgKiBAcmV0dXJuCSBmbG9hdAkJCQkJCVktVmFsdWUKCSAqKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRWYWx1ZU9mWUZvclgoJHhWYWx1ZSkgewoJCXJldHVybiAkdGhpcy0+Z2V0SW50ZXJzZWN0KCkgKyAkdGhpcy0+Z2V0U2xvcGUoKSAqIGxvZygkeFZhbHVlIC0gJHRoaXMtPl9Yb2Zmc2V0KTsKCX0JLy8JZnVuY3Rpb24gZ2V0VmFsdWVPZllGb3JYKCkKCgoJLyoqCgkgKiBSZXR1cm4gdGhlIFgtVmFsdWUgZm9yIGEgc3BlY2lmaWVkIHZhbHVlIG9mIFkKCSAqCgkgKiBAcGFyYW0JIGZsb2F0CQkkeVZhbHVlCQkJWS1WYWx1ZQoJICogQHJldHVybgkgZmxvYXQJCQkJCQlYLVZhbHVlCgkgKiovCglwdWJsaWMgZnVuY3Rpb24gZ2V0VmFsdWVPZlhGb3JZKCR5VmFsdWUpIHsKCQlyZXR1cm4gZXhwKCgkeVZhbHVlIC0gJHRoaXMtPmdldEludGVyc2VjdCgpKSAvICR0aGlzLT5nZXRTbG9wZSgpKTsKCX0JLy8JZnVuY3Rpb24gZ2V0VmFsdWVPZlhGb3JZKCkKCgoJLyoqCgkgKiBSZXR1cm4gdGhlIEVxdWF0aW9uIG9mIHRoZSBiZXN0LWZpdCBsaW5lCgkgKgoJICogQHBhcmFtCSBpbnQJCSRkcAkJTnVtYmVyIG9mIHBsYWNlcyBvZiBkZWNpbWFsIHByZWNpc2lvbiB0byBkaXNwbGF5CgkgKiBAcmV0dXJuCSBzdHJpbmcKCSAqKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRFcXVhdGlvbigkZHA9MCkgewoJCSRzbG9wZSA9ICR0aGlzLT5nZXRTbG9wZSgkZHApOwoJCSRpbnRlcnNlY3QgPSAkdGhpcy0+Z2V0SW50ZXJzZWN0KCRkcCk7CgoJCXJldHVybiAnWSA9ICcuJGludGVyc2VjdC4nICsgJy4kc2xvcGUuJyAqIGxvZyhYKSc7Cgl9CS8vCWZ1bmN0aW9uIGdldEVxdWF0aW9uKCkKCgoJLyoqCgkgKiBFeGVjdXRlIHRoZSByZWdyZXNzaW9uIGFuZCBjYWxjdWxhdGUgdGhlIGdvb2RuZXNzIG9mIGZpdCBmb3IgYSBzZXQgb2YgWCBhbmQgWSBkYXRhIHZhbHVlcwoJICoKCSAqIEBwYXJhbQkgZmxvYXRbXQkkeVZhbHVlcwlUaGUgc2V0IG9mIFktdmFsdWVzIGZvciB0aGlzIHJlZ3Jlc3Npb24KCSAqIEBwYXJhbQkgZmxvYXRbXQkkeFZhbHVlcwlUaGUgc2V0IG9mIFgtdmFsdWVzIGZvciB0aGlzIHJlZ3Jlc3Npb24KCSAqIEBwYXJhbQkgYm9vbGVhbgkkY29uc3QKCSAqLwoJcHJpdmF0ZSBmdW5jdGlvbiBfbG9nYXJpdGhtaWNfcmVncmVzc2lvbigkeVZhbHVlcywgJHhWYWx1ZXMsICRjb25zdCkgewoJCWZvcmVhY2goJHhWYWx1ZXMgYXMgJiR2YWx1ZSkgewoJCQlpZiAoJHZhbHVlIDwgMC4wKSB7CgkJCQkkdmFsdWUgPSAwIC0gbG9nKGFicygkdmFsdWUpKTsKCQkJfSBlbHNlaWYgKCR2YWx1ZSA+IDAuMCkgewoJCQkJJHZhbHVlID0gbG9nKCR2YWx1ZSk7CgkJCX0KCQl9CgkJdW5zZXQoJHZhbHVlKTsKCgkJJHRoaXMtPl9sZWFzdFNxdWFyZUZpdCgkeVZhbHVlcywgJHhWYWx1ZXMsICRjb25zdCk7Cgl9CS8vCWZ1bmN0aW9uIF9sb2dhcml0aG1pY19yZWdyZXNzaW9uKCkKCgoJLyoqCgkgKiBEZWZpbmUgdGhlIHJlZ3Jlc3Npb24gYW5kIGNhbGN1bGF0ZSB0aGUgZ29vZG5lc3Mgb2YgZml0IGZvciBhIHNldCBvZiBYIGFuZCBZIGRhdGEgdmFsdWVzCgkgKgoJICogQHBhcmFtCWZsb2F0W10JCSR5VmFsdWVzCVRoZSBzZXQgb2YgWS12YWx1ZXMgZm9yIHRoaXMgcmVncmVzc2lvbgoJICogQHBhcmFtCWZsb2F0W10JCSR4VmFsdWVzCVRoZSBzZXQgb2YgWC12YWx1ZXMgZm9yIHRoaXMgcmVncmVzc2lvbgoJICogQHBhcmFtCWJvb2xlYW4JCSRjb25zdAoJICovCglmdW5jdGlvbiBfX2NvbnN0cnVjdCgkeVZhbHVlcywgJHhWYWx1ZXM9YXJyYXkoKSwgJGNvbnN0PVRydWUpIHsKCQlpZiAocGFyZW50OjpfX2NvbnN0cnVjdCgkeVZhbHVlcywgJHhWYWx1ZXMpICE9PSBGYWxzZSkgewoJCQkkdGhpcy0+X2xvZ2FyaXRobWljX3JlZ3Jlc3Npb24oJHlWYWx1ZXMsICR4VmFsdWVzLCAkY29uc3QpOwoJCX0KCX0JLy8JZnVuY3Rpb24gX19jb25zdHJ1Y3QoKQoKfQkvLwljbGFzcyBsb2dhcml0aG1pY0Jlc3RGaXQ=]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Shared/trend/polynomialBestFitClass.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIFBIUEV4Y2VsCiAqCiAqIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICoKICogQGNhdGVnb3J5ICAgUEhQRXhjZWwKICogQHBhY2thZ2UgICAgUEhQRXhjZWxfU2hhcmVkX1RyZW5kCiAqIEBjb3B5cmlnaHQgIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwgKGh0dHA6Ly93d3cuY29kZXBsZXguY29tL1BIUEV4Y2VsKQogKiBAbGljZW5zZSAgICBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvb2xkLWxpY2Vuc2VzL2xncGwtMi4xLnR4dAlMR1BMCiAqIEB2ZXJzaW9uICAgIDEuNy43LCAyMDEyLTA1LTE5CiAqLwoKCnJlcXVpcmVfb25jZSBQSFBFWENFTF9ST09UIC4gJ1BIUEV4Y2VsL1NoYXJlZC90cmVuZC9iZXN0Rml0Q2xhc3MucGhwJzsKcmVxdWlyZV9vbmNlIFBIUEVYQ0VMX1JPT1QgLiAnUEhQRXhjZWwvU2hhcmVkL0pBTUEvTWF0cml4LnBocCc7CgoKLyoqCiAqIFBIUEV4Y2VsX1BvbHlub21pYWxfQmVzdF9GaXQKICoKICogQGNhdGVnb3J5ICAgUEhQRXhjZWwKICogQHBhY2thZ2UgICAgUEhQRXhjZWxfU2hhcmVkX1RyZW5kCiAqIEBjb3B5cmlnaHQgIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwgKGh0dHA6Ly93d3cuY29kZXBsZXguY29tL1BIUEV4Y2VsKQogKi8KY2xhc3MgUEhQRXhjZWxfUG9seW5vbWlhbF9CZXN0X0ZpdCBleHRlbmRzIFBIUEV4Y2VsX0Jlc3RfRml0CnsKCS8qKgoJICogQWxnb3JpdGhtIHR5cGUgdG8gdXNlIGZvciBiZXN0LWZpdAoJICogKE5hbWUgb2YgdGhpcyB0cmVuZCBjbGFzcykKCSAqCgkgKiBAdmFyCXN0cmluZwoJICoqLwoJcHJvdGVjdGVkICRfYmVzdEZpdFR5cGUJCT0gJ3BvbHlub21pYWwnOwoKCS8qKgoJICogUG9seW5vbWlhbCBvcmRlcgoJICoKCSAqIEBwcm90ZWN0ZWQKCSAqIEB2YXIJaW50CgkgKiovCglwcm90ZWN0ZWQgJF9vcmRlcgkJCT0gMDsKCgoJLyoqCgkgKiBSZXR1cm4gdGhlIG9yZGVyIG9mIHRoaXMgcG9seW5vbWlhbAoJICoKCSAqIEByZXR1cm4JIGludAoJICoqLwoJcHVibGljIGZ1bmN0aW9uIGdldE9yZGVyKCkgewoJCXJldHVybiAkdGhpcy0+X29yZGVyOwoJfQkvLwlmdW5jdGlvbiBnZXRPcmRlcigpCgoKCS8qKgoJICogUmV0dXJuIHRoZSBZLVZhbHVlIGZvciBhIHNwZWNpZmllZCB2YWx1ZSBvZiBYCgkgKgoJICogQHBhcmFtCSBmbG9hdAkJJHhWYWx1ZQkJCVgtVmFsdWUKCSAqIEByZXR1cm4JIGZsb2F0CQkJCQkJWS1WYWx1ZQoJICoqLwoJcHVibGljIGZ1bmN0aW9uIGdldFZhbHVlT2ZZRm9yWCgkeFZhbHVlKSB7CgkJJHJldFZhbCA9ICR0aGlzLT5nZXRJbnRlcnNlY3QoKTsKCQkkc2xvcGUgPSAkdGhpcy0+Z2V0U2xvcGUoKTsKCQlmb3JlYWNoKCRzbG9wZSBhcyAka2V5ID0+ICR2YWx1ZSkgewoJCQlpZiAoJHZhbHVlICE9IDAuMCkgewoJCQkJJHJldFZhbCArPSAkdmFsdWUgKiBwb3coJHhWYWx1ZSwgJGtleSArIDEpOwoJCQl9CgkJfQoJCXJldHVybiAkcmV0VmFsOwoJfQkvLwlmdW5jdGlvbiBnZXRWYWx1ZU9mWUZvclgoKQoKCgkvKioKCSAqIFJldHVybiB0aGUgWC1WYWx1ZSBmb3IgYSBzcGVjaWZpZWQgdmFsdWUgb2YgWQoJICoKCSAqIEBwYXJhbQkgZmxvYXQJCSR5VmFsdWUJCQlZLVZhbHVlCgkgKiBAcmV0dXJuCSBmbG9hdAkJCQkJCVgtVmFsdWUKCSAqKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRWYWx1ZU9mWEZvclkoJHlWYWx1ZSkgewoJCXJldHVybiAoJHlWYWx1ZSAtICR0aGlzLT5nZXRJbnRlcnNlY3QoKSkgLyAkdGhpcy0+Z2V0U2xvcGUoKTsKCX0JLy8JZnVuY3Rpb24gZ2V0VmFsdWVPZlhGb3JZKCkKCgoJLyoqCgkgKiBSZXR1cm4gdGhlIEVxdWF0aW9uIG9mIHRoZSBiZXN0LWZpdCBsaW5lCgkgKgoJICogQHBhcmFtCSBpbnQJCSRkcAkJTnVtYmVyIG9mIHBsYWNlcyBvZiBkZWNpbWFsIHByZWNpc2lvbiB0byBkaXNwbGF5CgkgKiBAcmV0dXJuCSBzdHJpbmcKCSAqKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRFcXVhdGlvbigkZHA9MCkgewoJCSRzbG9wZSA9ICR0aGlzLT5nZXRTbG9wZSgkZHApOwoJCSRpbnRlcnNlY3QgPSAkdGhpcy0+Z2V0SW50ZXJzZWN0KCRkcCk7CgoJCSRlcXVhdGlvbiA9ICdZID0gJy4kaW50ZXJzZWN0OwoJCWZvcmVhY2goJHNsb3BlIGFzICRrZXkgPT4gJHZhbHVlKSB7CgkJCWlmICgkdmFsdWUgIT0gMC4wKSB7CgkJCQkkZXF1YXRpb24gLj0gJyArICcuJHZhbHVlLicgKiBYJzsKCQkJCWlmICgka2V5ID4gMCkgewoJCQkJCSRlcXVhdGlvbiAuPSAnXicuKCRrZXkgKyAxKTsKCQkJCX0KCQkJfQoJCX0KCQlyZXR1cm4gJGVxdWF0aW9uOwoJfQkvLwlmdW5jdGlvbiBnZXRFcXVhdGlvbigpCgoKCS8qKgoJICogUmV0dXJuIHRoZSBTbG9wZSBvZiB0aGUgbGluZQoJICoKCSAqIEBwYXJhbQkgaW50CQkkZHAJCU51bWJlciBvZiBwbGFjZXMgb2YgZGVjaW1hbCBwcmVjaXNpb24gdG8gZGlzcGxheQoJICogQHJldHVybgkgc3RyaW5nCgkgKiovCglwdWJsaWMgZnVuY3Rpb24gZ2V0U2xvcGUoJGRwPTApIHsKCQlpZiAoJGRwICE9IDApIHsKCQkJJGNvZWZmaWNpZW50cyA9IGFycmF5KCk7CgkJCWZvcmVhY2goJHRoaXMtPl9zbG9wZSBhcyAkY29lZmZpY2llbnQpIHsKCQkJCSRjb2VmZmljaWVudHNbXSA9IHJvdW5kKCRjb2VmZmljaWVudCwkZHApOwoJCQl9CgkJCXJldHVybiAkY29lZmZpY2llbnRzOwoJCX0KCQlyZXR1cm4gJHRoaXMtPl9zbG9wZTsKCX0JLy8JZnVuY3Rpb24gZ2V0U2xvcGUoKQoKCglwdWJsaWMgZnVuY3Rpb24gZ2V0Q29lZmZpY2llbnRzKCRkcD0wKSB7CgkJcmV0dXJuIGFycmF5X21lcmdlKGFycmF5KCR0aGlzLT5nZXRJbnRlcnNlY3QoJGRwKSksJHRoaXMtPmdldFNsb3BlKCRkcCkpOwoJfQkvLwlmdW5jdGlvbiBnZXRDb2VmZmljaWVudHMoKQoKCgkvKioKCSAqIEV4ZWN1dGUgdGhlIHJlZ3Jlc3Npb24gYW5kIGNhbGN1bGF0ZSB0aGUgZ29vZG5lc3Mgb2YgZml0IGZvciBhIHNldCBvZiBYIGFuZCBZIGRhdGEgdmFsdWVzCgkgKgoJICogQHBhcmFtCWludAkJCSRvcmRlcgkJT3JkZXIgb2YgUG9seW5vbWlhbCBmb3IgdGhpcyByZWdyZXNzaW9uCgkgKiBAcGFyYW0JZmxvYXRbXQkJJHlWYWx1ZXMJVGhlIHNldCBvZiBZLXZhbHVlcyBmb3IgdGhpcyByZWdyZXNzaW9uCgkgKiBAcGFyYW0JZmxvYXRbXQkJJHhWYWx1ZXMJVGhlIHNldCBvZiBYLXZhbHVlcyBmb3IgdGhpcyByZWdyZXNzaW9uCgkgKiBAcGFyYW0JYm9vbGVhbgkJJGNvbnN0CgkgKi8KCXByaXZhdGUgZnVuY3Rpb24gX3BvbHlub21pYWxfcmVncmVzc2lvbigkb3JkZXIsICR5VmFsdWVzLCAkeFZhbHVlcywgJGNvbnN0KSB7CgkJLy8gY2FsY3VsYXRlIHN1bXMKCQkkeF9zdW0gPSBhcnJheV9zdW0oJHhWYWx1ZXMpOwoJCSR5X3N1bSA9IGFycmF5X3N1bSgkeVZhbHVlcyk7CgkJJHh4X3N1bSA9ICR4eV9zdW0gPSAwOwoJCWZvcigkaSA9IDA7ICRpIDwgJHRoaXMtPl92YWx1ZUNvdW50OyArKyRpKSB7CgkJCSR4eV9zdW0gKz0gJHhWYWx1ZXNbJGldICogJHlWYWx1ZXNbJGldOwoJCQkkeHhfc3VtICs9ICR4VmFsdWVzWyRpXSAqICR4VmFsdWVzWyRpXTsKCQkJJHl5X3N1bSArPSAkeVZhbHVlc1skaV0gKiAkeVZhbHVlc1skaV07CgkJfQoJCS8qCgkJICoJVGhpcyByb3V0aW5lIHVzZXMgbG9naWMgZnJvbSB0aGUgUEhQIHBvcnQgb2YgcG9seWZpdCB2ZXJzaW9uIDAuMQoJCSAqCXdyaXR0ZW4gYnkgTWljaGFlbCBCb21tYXJpdG8gYW5kIFBhdWwgTWVhZ2hlcgoJCSAqCgkJICoJVGhlIGZ1bmN0aW9uIGZpdHMgYSBwb2x5bm9taWFsIGZ1bmN0aW9uIG9mIG9yZGVyICRvcmRlciB0aHJvdWdoCgkJICoJYSBzZXJpZXMgb2YgeC15IGRhdGEgcG9pbnRzIHVzaW5nIGxlYXN0IHNxdWFyZXMuCgkJICoKCQkgKi8KCQlmb3IgKCRpID0gMDsgJGkgPCAkdGhpcy0+X3ZhbHVlQ291bnQ7ICsrJGkpIHsKCQkJZm9yICgkaiA9IDA7ICRqIDw9ICRvcmRlcjsgKyskaikgewoJCQkJJEFbJGldWyRqXSA9IHBvdygkeFZhbHVlc1skaV0sICRqKTsKCQkJfQoJCX0KCQlmb3IgKCRpPTA7ICRpIDwgJHRoaXMtPl92YWx1ZUNvdW50OyArKyRpKSB7CgkJCSRCWyRpXSA9IGFycmF5KCR5VmFsdWVzWyRpXSk7CgkJfQoJCSRtYXRyaXhBID0gbmV3IE1hdHJpeCgkQSk7CgkJJG1hdHJpeEIgPSBuZXcgTWF0cml4KCRCKTsKCQkkQyA9ICRtYXRyaXhBLT5zb2x2ZSgkbWF0cml4Qik7CgoJCSRjb2VmZmljaWVudHMgPSBhcnJheSgpOwoJCWZvcigkaSA9IDA7ICRpIDwgJEMtPm07ICsrJGkpIHsKCQkJJHIgPSAkQy0+Z2V0KCRpLCAwKTsKCQkJaWYgKGFicygkcikgPD0gcG93KDEwLCAtOSkpIHsKCQkJCSRyID0gMDsKCQkJfQoJCQkkY29lZmZpY2llbnRzW10gPSAkcjsKCQl9CgoJCSR0aGlzLT5faW50ZXJzZWN0ID0gYXJyYXlfc2hpZnQoJGNvZWZmaWNpZW50cyk7CgkJJHRoaXMtPl9zbG9wZSA9ICRjb2VmZmljaWVudHM7CgoJCSR0aGlzLT5fY2FsY3VsYXRlR29vZG5lc3NPZkZpdCgkeF9zdW0sJHlfc3VtLCR4eF9zdW0sJHl5X3N1bSwkeHlfc3VtKTsKCQlmb3JlYWNoKCR0aGlzLT5feFZhbHVlcyBhcyAkeEtleSA9PiAkeFZhbHVlKSB7CgkJCSR0aGlzLT5feUJlc3RGaXRWYWx1ZXNbJHhLZXldID0gJHRoaXMtPmdldFZhbHVlT2ZZRm9yWCgkeFZhbHVlKTsKCQl9Cgl9CS8vCWZ1bmN0aW9uIF9wb2x5bm9taWFsX3JlZ3Jlc3Npb24oKQoKCgkvKioKCSAqIERlZmluZSB0aGUgcmVncmVzc2lvbiBhbmQgY2FsY3VsYXRlIHRoZSBnb29kbmVzcyBvZiBmaXQgZm9yIGEgc2V0IG9mIFggYW5kIFkgZGF0YSB2YWx1ZXMKCSAqCgkgKiBAcGFyYW0JaW50CQkJJG9yZGVyCQlPcmRlciBvZiBQb2x5bm9taWFsIGZvciB0aGlzIHJlZ3Jlc3Npb24KCSAqIEBwYXJhbQlmbG9hdFtdCQkkeVZhbHVlcwlUaGUgc2V0IG9mIFktdmFsdWVzIGZvciB0aGlzIHJlZ3Jlc3Npb24KCSAqIEBwYXJhbQlmbG9hdFtdCQkkeFZhbHVlcwlUaGUgc2V0IG9mIFgtdmFsdWVzIGZvciB0aGlzIHJlZ3Jlc3Npb24KCSAqIEBwYXJhbQlib29sZWFuCQkkY29uc3QKCSAqLwoJZnVuY3Rpb24gX19jb25zdHJ1Y3QoJG9yZGVyLCAkeVZhbHVlcywgJHhWYWx1ZXM9YXJyYXkoKSwgJGNvbnN0PVRydWUpIHsKCQlpZiAocGFyZW50OjpfX2NvbnN0cnVjdCgkeVZhbHVlcywgJHhWYWx1ZXMpICE9PSBGYWxzZSkgewoJCQlpZiAoJG9yZGVyIDwgJHRoaXMtPl92YWx1ZUNvdW50KSB7CgkJCQkkdGhpcy0+X2Jlc3RGaXRUeXBlIC49ICdfJy4kb3JkZXI7CgkJCQkkdGhpcy0+X29yZGVyID0gJG9yZGVyOwoJCQkJJHRoaXMtPl9wb2x5bm9taWFsX3JlZ3Jlc3Npb24oJG9yZGVyLCAkeVZhbHVlcywgJHhWYWx1ZXMsICRjb25zdCk7CgkJCQlpZiAoKCR0aGlzLT5nZXRHb29kbmVzc09mRml0KCkgPCAwLjApIHx8ICgkdGhpcy0+Z2V0R29vZG5lc3NPZkZpdCgpID4gMS4wKSkgewoJCQkJCSR0aGlzLT5fZXJyb3IgPSBUcnVlOwoJCQkJfQoJCQl9IGVsc2UgewoJCQkJJHRoaXMtPl9lcnJvciA9IFRydWU7CgkJCX0KCQl9Cgl9CS8vCWZ1bmN0aW9uIF9fY29uc3RydWN0KCkKCn0JLy8JY2xhc3MgcG9seW5vbWlhbEJlc3RGaXQ=]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Shared/trend/powerBestFitClass.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIFBIUEV4Y2VsCiAqCiAqIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICoKICogQGNhdGVnb3J5ICAgUEhQRXhjZWwKICogQHBhY2thZ2UgICAgUEhQRXhjZWxfU2hhcmVkX1RyZW5kCiAqIEBjb3B5cmlnaHQgIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwgKGh0dHA6Ly93d3cuY29kZXBsZXguY29tL1BIUEV4Y2VsKQogKiBAbGljZW5zZSAgICBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvb2xkLWxpY2Vuc2VzL2xncGwtMi4xLnR4dAlMR1BMCiAqIEB2ZXJzaW9uICAgIDEuNy43LCAyMDEyLTA1LTE5CiAqLwoKCnJlcXVpcmVfb25jZSBQSFBFWENFTF9ST09UIC4gJ1BIUEV4Y2VsL1NoYXJlZC90cmVuZC9iZXN0Rml0Q2xhc3MucGhwJzsKCgovKioKICogUEhQRXhjZWxfUG93ZXJfQmVzdF9GaXQKICoKICogQGNhdGVnb3J5ICAgUEhQRXhjZWwKICogQHBhY2thZ2UgICAgUEhQRXhjZWxfU2hhcmVkX1RyZW5kCiAqIEBjb3B5cmlnaHQgIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwgKGh0dHA6Ly93d3cuY29kZXBsZXguY29tL1BIUEV4Y2VsKQogKi8KY2xhc3MgUEhQRXhjZWxfUG93ZXJfQmVzdF9GaXQgZXh0ZW5kcyBQSFBFeGNlbF9CZXN0X0ZpdAp7CgkvKioKCSAqIEFsZ29yaXRobSB0eXBlIHRvIHVzZSBmb3IgYmVzdC1maXQKCSAqIChOYW1lIG9mIHRoaXMgdHJlbmQgY2xhc3MpCgkgKgoJICogQHZhcglzdHJpbmcKCSAqKi8KCXByb3RlY3RlZCAkX2Jlc3RGaXRUeXBlCQk9ICdwb3dlcic7CgoKCS8qKgoJICogUmV0dXJuIHRoZSBZLVZhbHVlIGZvciBhIHNwZWNpZmllZCB2YWx1ZSBvZiBYCgkgKgoJICogQHBhcmFtCSBmbG9hdAkJJHhWYWx1ZQkJCVgtVmFsdWUKCSAqIEByZXR1cm4JIGZsb2F0CQkJCQkJWS1WYWx1ZQoJICoqLwoJcHVibGljIGZ1bmN0aW9uIGdldFZhbHVlT2ZZRm9yWCgkeFZhbHVlKSB7CgkJcmV0dXJuICR0aGlzLT5nZXRJbnRlcnNlY3QoKSAqIHBvdygoJHhWYWx1ZSAtICR0aGlzLT5fWG9mZnNldCksJHRoaXMtPmdldFNsb3BlKCkpOwoJfQkvLwlmdW5jdGlvbiBnZXRWYWx1ZU9mWUZvclgoKQoKCgkvKioKCSAqIFJldHVybiB0aGUgWC1WYWx1ZSBmb3IgYSBzcGVjaWZpZWQgdmFsdWUgb2YgWQoJICoKCSAqIEBwYXJhbQkgZmxvYXQJCSR5VmFsdWUJCQlZLVZhbHVlCgkgKiBAcmV0dXJuCSBmbG9hdAkJCQkJCVgtVmFsdWUKCSAqKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRWYWx1ZU9mWEZvclkoJHlWYWx1ZSkgewoJCXJldHVybiBwb3coKCgkeVZhbHVlICsgJHRoaXMtPl9Zb2Zmc2V0KSAvICR0aGlzLT5nZXRJbnRlcnNlY3QoKSksKDEgLyAkdGhpcy0+Z2V0U2xvcGUoKSkpOwoJfQkvLwlmdW5jdGlvbiBnZXRWYWx1ZU9mWEZvclkoKQoKCgkvKioKCSAqIFJldHVybiB0aGUgRXF1YXRpb24gb2YgdGhlIGJlc3QtZml0IGxpbmUKCSAqCgkgKiBAcGFyYW0JIGludAkJJGRwCQlOdW1iZXIgb2YgcGxhY2VzIG9mIGRlY2ltYWwgcHJlY2lzaW9uIHRvIGRpc3BsYXkKCSAqIEByZXR1cm4JIHN0cmluZwoJICoqLwoJcHVibGljIGZ1bmN0aW9uIGdldEVxdWF0aW9uKCRkcD0wKSB7CgkJJHNsb3BlID0gJHRoaXMtPmdldFNsb3BlKCRkcCk7CgkJJGludGVyc2VjdCA9ICR0aGlzLT5nZXRJbnRlcnNlY3QoJGRwKTsKCgkJcmV0dXJuICdZID0gJy4kaW50ZXJzZWN0LicgKiBYXicuJHNsb3BlOwoJfQkvLwlmdW5jdGlvbiBnZXRFcXVhdGlvbigpCgoKCS8qKgoJICogUmV0dXJuIHRoZSBWYWx1ZSBvZiBYIHdoZXJlIGl0IGludGVyc2VjdHMgWSA9IDAKCSAqCgkgKiBAcGFyYW0JIGludAkJJGRwCQlOdW1iZXIgb2YgcGxhY2VzIG9mIGRlY2ltYWwgcHJlY2lzaW9uIHRvIGRpc3BsYXkKCSAqIEByZXR1cm4JIHN0cmluZwoJICoqLwoJcHVibGljIGZ1bmN0aW9uIGdldEludGVyc2VjdCgkZHA9MCkgewoJCWlmICgkZHAgIT0gMCkgewoJCQlyZXR1cm4gcm91bmQoZXhwKCR0aGlzLT5faW50ZXJzZWN0KSwkZHApOwoJCX0KCQlyZXR1cm4gZXhwKCR0aGlzLT5faW50ZXJzZWN0KTsKCX0JLy8JZnVuY3Rpb24gZ2V0SW50ZXJzZWN0KCkKCgoJLyoqCgkgKiBFeGVjdXRlIHRoZSByZWdyZXNzaW9uIGFuZCBjYWxjdWxhdGUgdGhlIGdvb2RuZXNzIG9mIGZpdCBmb3IgYSBzZXQgb2YgWCBhbmQgWSBkYXRhIHZhbHVlcwoJICoKCSAqIEBwYXJhbQkgZmxvYXRbXQkkeVZhbHVlcwlUaGUgc2V0IG9mIFktdmFsdWVzIGZvciB0aGlzIHJlZ3Jlc3Npb24KCSAqIEBwYXJhbQkgZmxvYXRbXQkkeFZhbHVlcwlUaGUgc2V0IG9mIFgtdmFsdWVzIGZvciB0aGlzIHJlZ3Jlc3Npb24KCSAqIEBwYXJhbQkgYm9vbGVhbgkkY29uc3QKCSAqLwoJcHJpdmF0ZSBmdW5jdGlvbiBfcG93ZXJfcmVncmVzc2lvbigkeVZhbHVlcywgJHhWYWx1ZXMsICRjb25zdCkgewoJCWZvcmVhY2goJHhWYWx1ZXMgYXMgJiR2YWx1ZSkgewoJCQlpZiAoJHZhbHVlIDwgMC4wKSB7CgkJCQkkdmFsdWUgPSAwIC0gbG9nKGFicygkdmFsdWUpKTsKCQkJfSBlbHNlaWYgKCR2YWx1ZSA+IDAuMCkgewoJCQkJJHZhbHVlID0gbG9nKCR2YWx1ZSk7CgkJCX0KCQl9CgkJdW5zZXQoJHZhbHVlKTsKCQlmb3JlYWNoKCR5VmFsdWVzIGFzICYkdmFsdWUpIHsKCQkJaWYgKCR2YWx1ZSA8IDAuMCkgewoJCQkJJHZhbHVlID0gMCAtIGxvZyhhYnMoJHZhbHVlKSk7CgkJCX0gZWxzZWlmICgkdmFsdWUgPiAwLjApIHsKCQkJCSR2YWx1ZSA9IGxvZygkdmFsdWUpOwoJCQl9CgkJfQoJCXVuc2V0KCR2YWx1ZSk7CgoJCSR0aGlzLT5fbGVhc3RTcXVhcmVGaXQoJHlWYWx1ZXMsICR4VmFsdWVzLCAkY29uc3QpOwoJfQkvLwlmdW5jdGlvbiBfcG93ZXJfcmVncmVzc2lvbigpCgoKCS8qKgoJICogRGVmaW5lIHRoZSByZWdyZXNzaW9uIGFuZCBjYWxjdWxhdGUgdGhlIGdvb2RuZXNzIG9mIGZpdCBmb3IgYSBzZXQgb2YgWCBhbmQgWSBkYXRhIHZhbHVlcwoJICoKCSAqIEBwYXJhbQkgZmxvYXRbXQkkeVZhbHVlcwlUaGUgc2V0IG9mIFktdmFsdWVzIGZvciB0aGlzIHJlZ3Jlc3Npb24KCSAqIEBwYXJhbQkgZmxvYXRbXQkkeFZhbHVlcwlUaGUgc2V0IG9mIFgtdmFsdWVzIGZvciB0aGlzIHJlZ3Jlc3Npb24KCSAqIEBwYXJhbQkgYm9vbGVhbgkkY29uc3QKCSAqLwoJZnVuY3Rpb24gX19jb25zdHJ1Y3QoJHlWYWx1ZXMsICR4VmFsdWVzPWFycmF5KCksICRjb25zdD1UcnVlKSB7CgkJaWYgKHBhcmVudDo6X19jb25zdHJ1Y3QoJHlWYWx1ZXMsICR4VmFsdWVzKSAhPT0gRmFsc2UpIHsKCQkJJHRoaXMtPl9wb3dlcl9yZWdyZXNzaW9uKCR5VmFsdWVzLCAkeFZhbHVlcywgJGNvbnN0KTsKCQl9Cgl9CS8vCWZ1bmN0aW9uIF9fY29uc3RydWN0KCkKCn0JLy8JY2xhc3MgcG93ZXJCZXN0Rml0]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Shared/trend/trendClass.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIFBIUEV4Y2VsCiAqCiAqIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICoKICogQGNhdGVnb3J5ICAgUEhQRXhjZWwKICogQHBhY2thZ2UgICAgUEhQRXhjZWxfU2hhcmVkX1RyZW5kCiAqIEBjb3B5cmlnaHQgIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwgKGh0dHA6Ly93d3cuY29kZXBsZXguY29tL1BIUEV4Y2VsKQogKiBAbGljZW5zZSAgICBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvb2xkLWxpY2Vuc2VzL2xncGwtMi4xLnR4dAlMR1BMCiAqIEB2ZXJzaW9uICAgIDEuNy43LCAyMDEyLTA1LTE5CiAqLwoKCnJlcXVpcmVfb25jZSBQSFBFWENFTF9ST09UIC4gJ1BIUEV4Y2VsL1NoYXJlZC90cmVuZC9saW5lYXJCZXN0Rml0Q2xhc3MucGhwJzsKcmVxdWlyZV9vbmNlIFBIUEVYQ0VMX1JPT1QgLiAnUEhQRXhjZWwvU2hhcmVkL3RyZW5kL2xvZ2FyaXRobWljQmVzdEZpdENsYXNzLnBocCc7CnJlcXVpcmVfb25jZSBQSFBFWENFTF9ST09UIC4gJ1BIUEV4Y2VsL1NoYXJlZC90cmVuZC9leHBvbmVudGlhbEJlc3RGaXRDbGFzcy5waHAnOwpyZXF1aXJlX29uY2UgUEhQRVhDRUxfUk9PVCAuICdQSFBFeGNlbC9TaGFyZWQvdHJlbmQvcG93ZXJCZXN0Rml0Q2xhc3MucGhwJzsKcmVxdWlyZV9vbmNlIFBIUEVYQ0VMX1JPT1QgLiAnUEhQRXhjZWwvU2hhcmVkL3RyZW5kL3BvbHlub21pYWxCZXN0Rml0Q2xhc3MucGhwJzsKCgovKioKICogUEhQRXhjZWxfdHJlbmRDbGFzcwogKgogKiBAY2F0ZWdvcnkgICBQSFBFeGNlbAogKiBAcGFja2FnZSAgICBQSFBFeGNlbF9TaGFyZWRfVHJlbmQKICogQGNvcHlyaWdodCAgQ29weXJpZ2h0IChjKSAyMDA2IC0gMjAxMiBQSFBFeGNlbCAoaHR0cDovL3d3dy5jb2RlcGxleC5jb20vUEhQRXhjZWwpCiAqLwpjbGFzcyB0cmVuZENsYXNzCnsKCWNvbnN0IFRSRU5EX0xJTkVBUgkJCQk9ICdMaW5lYXInOwoJY29uc3QgVFJFTkRfTE9HQVJJVEhNSUMJCQk9ICdMb2dhcml0aG1pYyc7Cgljb25zdCBUUkVORF9FWFBPTkVOVElBTAkJCT0gJ0V4cG9uZW50aWFsJzsKCWNvbnN0IFRSRU5EX1BPV0VSCQkJCT0gJ1Bvd2VyJzsKCWNvbnN0IFRSRU5EX1BPTFlOT01JQUxfMgkJPSAnUG9seW5vbWlhbF8yJzsKCWNvbnN0IFRSRU5EX1BPTFlOT01JQUxfMwkJPSAnUG9seW5vbWlhbF8zJzsKCWNvbnN0IFRSRU5EX1BPTFlOT01JQUxfNAkJPSAnUG9seW5vbWlhbF80JzsKCWNvbnN0IFRSRU5EX1BPTFlOT01JQUxfNQkJPSAnUG9seW5vbWlhbF81JzsKCWNvbnN0IFRSRU5EX1BPTFlOT01JQUxfNgkJPSAnUG9seW5vbWlhbF82JzsKCWNvbnN0IFRSRU5EX0JFU1RfRklUCQkJPSAnQmVzdGZpdCc7Cgljb25zdCBUUkVORF9CRVNUX0ZJVF9OT19QT0xZCT0gJ0Jlc3RmaXRfbm9fUG9seW5vbWlhbHMnOwoKCS8qKgoJICogTmFtZXMgb2YgdGhlIGJlc3QtZml0IHRyZW5kIGFuYWx5c2lzIG1ldGhvZHMKCSAqCgkgKiBAdmFyIHN0cmluZ1tdCgkgKiovCglwcml2YXRlIHN0YXRpYyAkX3RyZW5kVHlwZXMgPSBhcnJheSggc2VsZjo6VFJFTkRfTElORUFSLAoJCQkJCQkJCQkJIHNlbGY6OlRSRU5EX0xPR0FSSVRITUlDLAoJCQkJCQkJCQkJIHNlbGY6OlRSRU5EX0VYUE9ORU5USUFMLAoJCQkJCQkJCQkJIHNlbGY6OlRSRU5EX1BPV0VSCgkJCQkJCQkJCSAgICk7CgkvKioKCSAqIE5hbWVzIG9mIHRoZSBiZXN0LWZpdCB0cmVuZCBwb2x5bm9taWFsIG9yZGVycwoJICoKCSAqIEB2YXIgc3RyaW5nW10KCSAqKi8KCXByaXZhdGUgc3RhdGljICRfdHJlbmRUeXBlUG9seU9yZGVycyA9IGFycmF5KCBzZWxmOjpUUkVORF9QT0xZTk9NSUFMXzIsCgkJCQkJCQkJCQkJCSAgc2VsZjo6VFJFTkRfUE9MWU5PTUlBTF8zLAoJCQkJCQkJCQkJCQkgIHNlbGY6OlRSRU5EX1BPTFlOT01JQUxfNCwKCQkJCQkJCQkJCQkJICBzZWxmOjpUUkVORF9QT0xZTk9NSUFMXzUsCgkJCQkJCQkJCQkJCSAgc2VsZjo6VFJFTkRfUE9MWU5PTUlBTF82CgkJCQkJCQkJCQkJICAgICk7CgoJLyoqCgkgKiBDYWNoZWQgcmVzdWx0cyBmb3IgZWFjaCBtZXRob2Qgd2hlbiB0cnlpbmcgdG8gaWRlbnRpZnkgd2hpY2ggcHJvdmlkZXMgdGhlIGJlc3QgZml0CgkgKgoJICogQHZhciBQSFBFeGNlbF9CZXN0X0ZpdFtdCgkgKiovCglwcml2YXRlIHN0YXRpYyAkX3RyZW5kQ2FjaGUgPSBhcnJheSgpOwoKCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGNhbGN1bGF0ZSgkdHJlbmRUeXBlPXNlbGY6OlRSRU5EX0JFU1RfRklULCAkeVZhbHVlcywgJHhWYWx1ZXM9YXJyYXkoKSwgJGNvbnN0PVRydWUpIHsKCQkvLwlDYWxjdWxhdGUgbnVtYmVyIG9mIHBvaW50cyBpbiBlYWNoIGRhdGFzZXQKCQkkblkgPSBjb3VudCgkeVZhbHVlcyk7CgkJJG5YID0gY291bnQoJHhWYWx1ZXMpOwoKCQkvLwlEZWZpbmUgWCBWYWx1ZXMgaWYgbmVjZXNzYXJ5CgkJaWYgKCRuWCA9PSAwKSB7CgkJCSR4VmFsdWVzID0gcmFuZ2UoMSwkblkpOwoJCQkkblggPSAkblk7CgkJfSBlbHNlaWYgKCRuWSAhPSAkblgpIHsKCQkJLy8JRW5zdXJlIGJvdGggYXJyYXlzIG9mIHBvaW50cyBhcmUgdGhlIHNhbWUgc2l6ZQoJCQl0cmlnZ2VyX2Vycm9yKCJ0cmVuZCgpOiBOdW1iZXIgb2YgZWxlbWVudHMgaW4gY29vcmRpbmF0ZSBhcnJheXMgZG8gbm90IG1hdGNoLiIsIEVfVVNFUl9FUlJPUik7CgkJfQoKCQkka2V5ID0gbWQ1KCR0cmVuZFR5cGUuJGNvbnN0LnNlcmlhbGl6ZSgkeVZhbHVlcykuc2VyaWFsaXplKCR4VmFsdWVzKSk7CgkJLy8JRGV0ZXJtaW5lIHdoaWNoIHRyZW5kIG1ldGhvZCBoYXMgYmVlbiByZXF1ZXN0ZWQKCQlzd2l0Y2ggKCR0cmVuZFR5cGUpIHsKCQkJLy8JSW5zdGFudGlhdGUgYW5kIHJldHVybiB0aGUgY2xhc3MgZm9yIHRoZSByZXF1ZXN0ZWQgdHJlbmQgbWV0aG9kCgkJCWNhc2Ugc2VsZjo6VFJFTkRfTElORUFSIDoKCQkJY2FzZSBzZWxmOjpUUkVORF9MT0dBUklUSE1JQyA6CgkJCWNhc2Ugc2VsZjo6VFJFTkRfRVhQT05FTlRJQUwgOgoJCQljYXNlIHNlbGY6OlRSRU5EX1BPV0VSIDoKCQkJCWlmICghaXNzZXQoc2VsZjo6JF90cmVuZENhY2hlWyRrZXldKSkgewoJCQkJCSRjbGFzc05hbWUgPSAnUEhQRXhjZWxfJy4kdHJlbmRUeXBlLidfQmVzdF9GaXQnOwoJCQkJCXNlbGY6OiRfdHJlbmRDYWNoZVska2V5XSA9IG5ldyAkY2xhc3NOYW1lKCR5VmFsdWVzLCR4VmFsdWVzLCRjb25zdCk7CgkJCQl9CgkJCQlyZXR1cm4gc2VsZjo6JF90cmVuZENhY2hlWyRrZXldOwoJCQkJYnJlYWs7CgkJCWNhc2Ugc2VsZjo6VFJFTkRfUE9MWU5PTUlBTF8yCToKCQkJY2FzZSBzZWxmOjpUUkVORF9QT0xZTk9NSUFMXzMJOgoJCQljYXNlIHNlbGY6OlRSRU5EX1BPTFlOT01JQUxfNAk6CgkJCWNhc2Ugc2VsZjo6VFJFTkRfUE9MWU5PTUlBTF81CToKCQkJY2FzZSBzZWxmOjpUUkVORF9QT0xZTk9NSUFMXzYJOgoJCQkJaWYgKCFpc3NldChzZWxmOjokX3RyZW5kQ2FjaGVbJGtleV0pKSB7CgkJCQkJJG9yZGVyID0gc3Vic3RyKCR0cmVuZFR5cGUsLTEpOwoJCQkJCXNlbGY6OiRfdHJlbmRDYWNoZVska2V5XSA9IG5ldyBQSFBFeGNlbF9Qb2x5bm9taWFsX0Jlc3RfRml0KCRvcmRlciwkeVZhbHVlcywkeFZhbHVlcywkY29uc3QpOwoJCQkJfQoJCQkJcmV0dXJuIHNlbGY6OiRfdHJlbmRDYWNoZVska2V5XTsKCQkJCWJyZWFrOwoJCQljYXNlIHNlbGY6OlRSRU5EX0JFU1RfRklUCQkJOgoJCQljYXNlIHNlbGY6OlRSRU5EX0JFU1RfRklUX05PX1BPTFkJOgoJCQkJLy8JSWYgdGhlIHJlcXVlc3QgaXMgdG8gZGV0ZXJtaW5lIHRoZSBiZXN0IGZpdCByZWdyZXNzaW9uLCB0aGVuIHdlIHRlc3QgZWFjaCB0cmVuZCBsaW5lIGluIHR1cm4KCQkJCS8vCVN0YXJ0IGJ5IGdlbmVyYXRpbmcgYW4gaW5zdGFuY2Ugb2YgZWFjaCBhdmFpbGFibGUgdHJlbmQgbWV0aG9kCgkJCQlmb3JlYWNoKHNlbGY6OiRfdHJlbmRUeXBlcyBhcyAkdHJlbmRNZXRob2QpIHsKCQkJCQkkY2xhc3NOYW1lID0gJ1BIUEV4Y2VsXycuJHRyZW5kTWV0aG9kLidCZXN0Rml0JzsKCQkJCQkkYmVzdEZpdFskdHJlbmRNZXRob2RdID0gbmV3ICRjbGFzc05hbWUoJHlWYWx1ZXMsJHhWYWx1ZXMsJGNvbnN0KTsKCQkJCQkkYmVzdEZpdFZhbHVlWyR0cmVuZE1ldGhvZF0gPSAkYmVzdEZpdFskdHJlbmRNZXRob2RdLT5nZXRHb29kbmVzc09mRml0KCk7CgkJCQl9CgkJCQlpZiAoJHRyZW5kVHlwZSAhPSBzZWxmOjpUUkVORF9CRVNUX0ZJVF9OT19QT0xZKSB7CgkJCQkJZm9yZWFjaChzZWxmOjokX3RyZW5kVHlwZVBvbHlPcmRlcnMgYXMgJHRyZW5kTWV0aG9kKSB7CgkJCQkJCSRvcmRlciA9IHN1YnN0cigkdHJlbmRNZXRob2QsLTEpOwoJCQkJCQkkYmVzdEZpdFskdHJlbmRNZXRob2RdID0gbmV3IFBIUEV4Y2VsX1BvbHlub21pYWxfQmVzdF9GaXQoJG9yZGVyLCR5VmFsdWVzLCR4VmFsdWVzLCRjb25zdCk7CgkJCQkJCWlmICgkYmVzdEZpdFskdHJlbmRNZXRob2RdLT5nZXRFcnJvcigpKSB7CgkJCQkJCQl1bnNldCgkYmVzdEZpdFskdHJlbmRNZXRob2RdKTsKCQkJCQkJfSBlbHNlIHsKCQkJCQkJCSRiZXN0Rml0VmFsdWVbJHRyZW5kTWV0aG9kXSA9ICRiZXN0Rml0WyR0cmVuZE1ldGhvZF0tPmdldEdvb2RuZXNzT2ZGaXQoKTsKCQkJCQkJfQoJCQkJCX0KCQkJCX0KCQkJCS8vCURldGVybWluZSB3aGljaCBvZiBvdXIgdHJlbmQgbGluZXMgaXMgdGhlIGJlc3QgZml0LCBhbmQgdGhlbiB3ZSByZXR1cm4gdGhlIGluc3RhbmNlIG9mIHRoYXQgdHJlbmQgY2xhc3MKCQkJCWFyc29ydCgkYmVzdEZpdFZhbHVlKTsKCQkJCSRiZXN0Rml0VHlwZSA9IGtleSgkYmVzdEZpdFZhbHVlKTsKCQkJCXJldHVybiAkYmVzdEZpdFskYmVzdEZpdFR5cGVdOwoJCQkJYnJlYWs7CgkJCWRlZmF1bHQJOgoJCQkJcmV0dXJuIGZhbHNlOwoJCX0KCX0JLy8JZnVuY3Rpb24gY2FsY3VsYXRlKCkKCn0JLy8JY2xhc3MgdHJlbmRDbGFzcw==]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Shared/XMLWriter.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIFBIUEV4Y2VsCiAqCiAqIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICoKICogQGNhdGVnb3J5ICAgUEhQRXhjZWwKICogQHBhY2thZ2UJUEhQRXhjZWxfU2hhcmVkCiAqIEBjb3B5cmlnaHQgIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwgKGh0dHA6Ly93d3cuY29kZXBsZXguY29tL1BIUEV4Y2VsKQogKiBAbGljZW5zZQlodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvb2xkLWxpY2Vuc2VzL2xncGwtMi4xLnR4dAlMR1BMCiAqIEB2ZXJzaW9uCTEuNy43LCAyMDEyLTA1LTE5CiAqLwoKaWYgKCFkZWZpbmVkKCdEQVRFX1czQycpKSB7CiAgZGVmaW5lKCdEQVRFX1czQycsICdZLW0tZFxUSDppOnNQJyk7Cn0KCmlmICghZGVmaW5lZCgnREVCVUdNT0RFX0VOQUJMRUQnKSkgewogIGRlZmluZSgnREVCVUdNT0RFX0VOQUJMRUQnLCBmYWxzZSk7Cn0KCgovKioKICogUEhQRXhjZWxfU2hhcmVkX1hNTFdyaXRlcgogKgogKiBAY2F0ZWdvcnkgICBQSFBFeGNlbAogKiBAcGFja2FnZQlQSFBFeGNlbF9TaGFyZWQKICogQGNvcHlyaWdodCAgQ29weXJpZ2h0IChjKSAyMDA2IC0gMjAxMiBQSFBFeGNlbCAoaHR0cDovL3d3dy5jb2RlcGxleC5jb20vUEhQRXhjZWwpCiAqLwpjbGFzcyBQSFBFeGNlbF9TaGFyZWRfWE1MV3JpdGVyIGV4dGVuZHMgWE1MV3JpdGVyIHsKCS8qKiBUZW1wb3Jhcnkgc3RvcmFnZSBtZXRob2QgKi8KCWNvbnN0IFNUT1JBR0VfTUVNT1JZCT0gMTsKCWNvbnN0IFNUT1JBR0VfRElTSwkJPSAyOwoKCS8qKgoJICogVGVtcG9yYXJ5IGZpbGVuYW1lCgkgKgoJICogQHZhciBzdHJpbmcKCSAqLwoJcHJpdmF0ZSAkX3RlbXBGaWxlTmFtZSA9ICcnOwoKCS8qKgoJICogQ3JlYXRlIGEgbmV3IFBIUEV4Y2VsX1NoYXJlZF9YTUxXcml0ZXIgaW5zdGFuY2UKCSAqCgkgKiBAcGFyYW0gaW50CQkkcFRlbXBvcmFyeVN0b3JhZ2UJCQlUZW1wb3Jhcnkgc3RvcmFnZSBsb2NhdGlvbgoJICogQHBhcmFtIHN0cmluZwkkcFRlbXBvcmFyeVN0b3JhZ2VGb2xkZXIJVGVtcG9yYXJ5IHN0b3JhZ2UgZm9sZGVyCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkcFRlbXBvcmFyeVN0b3JhZ2UgPSBzZWxmOjpTVE9SQUdFX01FTU9SWSwgJHBUZW1wb3JhcnlTdG9yYWdlRm9sZGVyID0gTlVMTCkgewoJCS8vIE9wZW4gdGVtcG9yYXJ5IHN0b3JhZ2UKCQlpZiAoJHBUZW1wb3JhcnlTdG9yYWdlID09IHNlbGY6OlNUT1JBR0VfTUVNT1JZKSB7CgkJCSR0aGlzLT5vcGVuTWVtb3J5KCk7CgkJfSBlbHNlIHsKCQkJLy8gQ3JlYXRlIHRlbXBvcmFyeSBmaWxlbmFtZQoJCQlpZiAoJHBUZW1wb3JhcnlTdG9yYWdlRm9sZGVyID09PSBOVUxMKQoJCQkJJHBUZW1wb3JhcnlTdG9yYWdlRm9sZGVyID0gUEhQRXhjZWxfU2hhcmVkX0ZpbGU6OnN5c19nZXRfdGVtcF9kaXIoKTsKCQkJJHRoaXMtPl90ZW1wRmlsZU5hbWUgPSBAdGVtcG5hbSgkcFRlbXBvcmFyeVN0b3JhZ2VGb2xkZXIsICd4bWwnKTsKCgkJCS8vIE9wZW4gc3RvcmFnZQoJCQlpZiAoJHRoaXMtPm9wZW5VcmkoJHRoaXMtPl90ZW1wRmlsZU5hbWUpID09PSBmYWxzZSkgewoJCQkJLy8gRmFsbGJhY2sgdG8gbWVtb3J5Li4uCgkJCQkkdGhpcy0+b3Blbk1lbW9yeSgpOwoJCQl9CgkJfQoKCQkvLyBTZXQgZGVmYXVsdCB2YWx1ZXMKCQlpZiAoREVCVUdNT0RFX0VOQUJMRUQpIHsKCQkJJHRoaXMtPnNldEluZGVudCh0cnVlKTsKCQl9Cgl9CgoJLyoqCgkgKiBEZXN0cnVjdG9yCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBfX2Rlc3RydWN0KCkgewoJCS8vIFVubGluayB0ZW1wb3JhcnkgZmlsZXMKCQlpZiAoJHRoaXMtPl90ZW1wRmlsZU5hbWUgIT0gJycpIHsKCQkJQHVubGluaygkdGhpcy0+X3RlbXBGaWxlTmFtZSk7CgkJfQoJfQoKCS8qKgoJICogR2V0IHdyaXR0ZW4gZGF0YQoJICoKCSAqIEByZXR1cm4gJGRhdGEKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldERhdGEoKSB7CgkJaWYgKCR0aGlzLT5fdGVtcEZpbGVOYW1lID09ICcnKSB7CgkJCXJldHVybiAkdGhpcy0+b3V0cHV0TWVtb3J5KHRydWUpOwoJCX0gZWxzZSB7CgkJCSR0aGlzLT5mbHVzaCgpOwoJCQlyZXR1cm4gZmlsZV9nZXRfY29udGVudHMoJHRoaXMtPl90ZW1wRmlsZU5hbWUpOwoJCX0KCX0KCgkvKioKCSAqIEZhbGxiYWNrIG1ldGhvZCBmb3Igd3JpdGVSYXcsIGludHJvZHVjZWQgaW4gUEhQIDUuMgoJICoKCSAqIEBwYXJhbSBzdHJpbmcgJHRleHQKCSAqIEByZXR1cm4gc3RyaW5nCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiB3cml0ZVJhd0RhdGEoJHRleHQpCgl7CgkJaWYgKG1ldGhvZF9leGlzdHMoJHRoaXMsICd3cml0ZVJhdycpKSB7CgkJCXJldHVybiAkdGhpcy0+d3JpdGVSYXcoaHRtbHNwZWNpYWxjaGFycygkdGV4dCkpOwoJCX0KCgkJcmV0dXJuICR0aGlzLT50ZXh0KCR0ZXh0KTsKCX0KfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Shared/ZipArchive.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIFBIUEV4Y2VsCiAqCiAqIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICoKICogQGNhdGVnb3J5ICAgUEhQRXhjZWwKICogQHBhY2thZ2UgICAgUEhQRXhjZWxfU2hhcmVkX1ppcEFyY2hpdmUKICogQGNvcHlyaWdodCAgQ29weXJpZ2h0IChjKSAyMDA2IC0gMjAxMiBQSFBFeGNlbCAoaHR0cDovL3d3dy5jb2RlcGxleC5jb20vUEhQRXhjZWwpCiAqIEBsaWNlbnNlICAgIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9vbGQtbGljZW5zZXMvbGdwbC0yLjEudHh0CUxHUEwKICogQHZlcnNpb24gICAgMS43LjcsIDIwMTItMDUtMTkKICovCgpyZXF1aXJlX29uY2UgUEhQRVhDRUxfUk9PVCAuICdQSFBFeGNlbC9TaGFyZWQvUENMWmlwL3BjbHppcC5saWIucGhwJzsKCgovKioKICogUEhQRXhjZWxfU2hhcmVkX1ppcEFyY2hpdmUKICoKICogQGNhdGVnb3J5ICAgUEhQRXhjZWwKICogQHBhY2thZ2UgICAgUEhQRXhjZWxfU2hhcmVkX1ppcEFyY2hpdmUKICogQGNvcHlyaWdodCAgQ29weXJpZ2h0IChjKSAyMDA2IC0gMjAxMiBQSFBFeGNlbCAoaHR0cDovL3d3dy5jb2RlcGxleC5jb20vUEhQRXhjZWwpCiAqLwpjbGFzcyBQSFBFeGNlbF9TaGFyZWRfWmlwQXJjaGl2ZQp7CgoJLyoqCWNvbnN0YW50cyAqLwoJY29uc3QgT1ZFUldSSVRFCQk9ICdPVkVSV1JJVEUnOwoJY29uc3QgQ1JFQVRFCQk9ICdDUkVBVEUnOwoKCgkvKioKCSAqIFRlbXBvcmFyeSBzdG9yYWdlIGRpcmVjdG9yeQoJICoKCSAqIEB2YXIgc3RyaW5nCgkgKi8KCXByaXZhdGUgJF90ZW1wRGlyOwoKCS8qKgoJICogWmlwIEFyY2hpdmUgU3RyZWFtIEhhbmRsZQoJICoKCSAqIEB2YXIgc3RyaW5nCgkgKi8KCXByaXZhdGUgJF96aXA7CgoKICAgIC8qKgoJICogT3BlbiBhIG5ldyB6aXAgYXJjaGl2ZQoJICoKCSAqIEBwYXJhbQlzdHJpbmcJJGZpbGVOYW1lCUZpbGVuYW1lIGZvciB0aGUgemlwIGFyY2hpdmUKCSAqIEByZXR1cm4JYm9vbGVhbgogICAgICovCglwdWJsaWMgZnVuY3Rpb24gb3BlbigkZmlsZU5hbWUpCgl7CgkJJHRoaXMtPl90ZW1wRGlyID0gUEhQRXhjZWxfU2hhcmVkX0ZpbGU6OnN5c19nZXRfdGVtcF9kaXIoKTsKCgkJJHRoaXMtPl96aXAgPSBuZXcgUGNsWmlwKCRmaWxlTmFtZSk7CgoJCXJldHVybiB0cnVlOwoJfQoKCiAgICAvKioKCSAqIENsb3NlIHRoaXMgemlwIGFyY2hpdmUKCSAqCiAgICAgKi8KCXB1YmxpYyBmdW5jdGlvbiBjbG9zZSgpCgl7Cgl9CgoKICAgIC8qKgoJICogQWRkIGEgbmV3IGZpbGUgdG8gdGhlIHppcCBhcmNoaXZlIGZyb20gYSBzdHJpbmcgb2YgcmF3IGRhdGEuCgkgKgoJICogQHBhcmFtCXN0cmluZwkkbG9jYWxuYW1lCQlEaXJlY3RvcnkvTmFtZSBvZiB0aGUgZmlsZSB0byBhZGQgdG8gdGhlIHppcCBhcmNoaXZlCgkgKiBAcGFyYW0Jc3RyaW5nCSRjb250ZW50cwkJU3RyaW5nIG9mIGRhdGEgdG8gYWRkIHRvIHRoZSB6aXAgYXJjaGl2ZQogICAgICovCglwdWJsaWMgZnVuY3Rpb24gYWRkRnJvbVN0cmluZygkbG9jYWxuYW1lLCAkY29udGVudHMpCgl7CgkJJGZpbGVuYW1lUGFydHMgPSBwYXRoaW5mbygkbG9jYWxuYW1lKTsKCgkJJGhhbmRsZSA9IGZvcGVuKCR0aGlzLT5fdGVtcERpci4nLycuJGZpbGVuYW1lUGFydHNbImJhc2VuYW1lIl0sICJ3YiIpOwoJCWZ3cml0ZSgkaGFuZGxlLCAkY29udGVudHMpOwoJCWZjbG9zZSgkaGFuZGxlKTsKCgkJJHJlcyA9ICR0aGlzLT5femlwLT5hZGQoJHRoaXMtPl90ZW1wRGlyLicvJy4kZmlsZW5hbWVQYXJ0c1siYmFzZW5hbWUiXSwKCQkJCQkJCQlQQ0xaSVBfT1BUX1JFTU9WRV9QQVRILCAkdGhpcy0+X3RlbXBEaXIsCgkJCQkJCQkJUENMWklQX09QVF9BRERfUEFUSCwgJGZpbGVuYW1lUGFydHNbImRpcm5hbWUiXQoJCQkJCQkJICAgKTsKCQlpZiAoJHJlcyA9PSAwKSB7CgkJCXRocm93IG5ldyBFeGNlcHRpb24oIkVycm9yIHppcHBpbmcgZmlsZXMgOiAiIC4gJHRoaXMtPl96aXAtPmVycm9ySW5mbyh0cnVlKSk7CgkJfQoKCQl1bmxpbmsoJHRoaXMtPl90ZW1wRGlyLicvJy4kZmlsZW5hbWVQYXJ0c1siYmFzZW5hbWUiXSk7Cgl9Cgp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Shared/ZipStreamWrapper.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIFBIUEV4Y2VsCiAqCiAqIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICoKICogQGNhdGVnb3J5ICAgUEhQRXhjZWwKICogQHBhY2thZ2UgICAgUEhQRXhjZWxfU2hhcmVkCiAqIEBjb3B5cmlnaHQgIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwgKGh0dHA6Ly93d3cuY29kZXBsZXguY29tL1BIUEV4Y2VsKQogKiBAbGljZW5zZSAgICBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvb2xkLWxpY2Vuc2VzL2xncGwtMi4xLnR4dAlMR1BMCiAqIEB2ZXJzaW9uICAgIDEuNy43LCAyMDEyLTA1LTE5CiAqLwoKCi8qKgogKiBQSFBFeGNlbF9TaGFyZWRfWmlwU3RyZWFtV3JhcHBlcgogKgogKiBAY2F0ZWdvcnkgICBQSFBFeGNlbAogKiBAcGFja2FnZSAgICBQSFBFeGNlbF9TaGFyZWQKICogQGNvcHlyaWdodCAgQ29weXJpZ2h0IChjKSAyMDA2IC0gMjAxMiBQSFBFeGNlbCAoaHR0cDovL3d3dy5jb2RlcGxleC5jb20vUEhQRXhjZWwpCiAqLwpjbGFzcyBQSFBFeGNlbF9TaGFyZWRfWmlwU3RyZWFtV3JhcHBlciB7CgkvKioKCSAqIEludGVybmFsIFppcEFjcmhpdmUKCSAqCgkgKiBAdmFyIFppcEFjcmhpdmUKCSAqLwogICAgcHJpdmF0ZSAkX2FyY2hpdmU7CgogICAgLyoqCiAgICAgKiBGaWxlbmFtZSBpbiBaaXBBY3JoaXZlCiAgICAgKgogICAgICogQHZhciBzdHJpbmcKICAgICAqLwogICAgcHJpdmF0ZSAkX2ZpbGVOYW1lSW5BcmNoaXZlID0gJyc7CgogICAgLyoqCiAgICAgKiBQb3NpdGlvbiBpbiBmaWxlCiAgICAgKgogICAgICogQHZhciBpbnQKICAgICAqLwogICAgcHJpdmF0ZSAkX3Bvc2l0aW9uID0gMDsKCiAgICAvKioKICAgICAqIERhdGEKICAgICAqCiAgICAgKiBAdmFyIG1peGVkCiAgICAgKi8KICAgIHByaXZhdGUgJF9kYXRhID0gJyc7CgogICAgLyoqCiAgICAgKiBSZWdpc3RlciB3cmFwcGVyCiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gcmVnaXN0ZXIoKSB7CgkJQHN0cmVhbV93cmFwcGVyX3VucmVnaXN0ZXIoInppcCIpOwoJCUBzdHJlYW1fd3JhcHBlcl9yZWdpc3RlcigiemlwIiwgX19DTEFTU19fKTsKICAgIH0KCiAgICAvKioKCSAqIEltcGxlbWVudHMgc3VwcG9ydCBmb3IgZm9wZW4oKS4KCSAqCgkgKiBAcGFyYW0Jc3RyaW5nCSRwYXRoCQkJcmVzb3VyY2UgbmFtZSBpbmNsdWRpbmcgc2NoZW1lLCBlLmcuCgkgKiBAcGFyYW0Jc3RyaW5nCSRtb2RlCQkJb25seSAiciIgaXMgc3VwcG9ydGVkCgkgKiBAcGFyYW0JaW50CQkkb3B0aW9ucwkJbWFzayBvZiBTVFJFQU1fUkVQT1JUX0VSUk9SUyBhbmQgU1RSRUFNX1VTRV9QQVRICgkgKiBAcGFyYW0Jc3RyaW5nICAmJG9wZW5lZFBhdGgJYWJzb2x1dGUgcGF0aCBvZiB0aGUgb3BlbmVkIHN0cmVhbSAob3V0IHBhcmFtZXRlcikKCSAqIEByZXR1cm4JYm9vbCAgICB0cnVlIG9uIHN1Y2Nlc3MKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHN0cmVhbV9vcGVuKCRwYXRoLCAkbW9kZSwgJG9wdGlvbnMsICYkb3BlbmVkX3BhdGgpIHsKICAgICAgICAvLyBDaGVjayBmb3IgbW9kZQogICAgICAgIGlmICgkbW9kZXswfSAhPSAncicpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbignTW9kZSAnIC4gJG1vZGUgLiAnIGlzIG5vdCBzdXBwb3J0ZWQuIE9ubHkgcmVhZCBtb2RlIGlzIHN1cHBvcnRlZC4nKTsKICAgICAgICB9CgoJCSRwb3MgPSBzdHJycG9zKCRwYXRoLCAnIycpOwoJCSR1cmxbJ2hvc3QnXSA9IHN1YnN0cigkcGF0aCwgNiwgJHBvcyAtIDYpOyAvLyA2OiBzdHJsZW4oJ3ppcDovLycpCgkJJHVybFsnZnJhZ21lbnQnXSA9IHN1YnN0cigkcGF0aCwgJHBvcyArIDEpOwoKICAgICAgICAvLyBPcGVuIGFyY2hpdmUKICAgICAgICAkdGhpcy0+X2FyY2hpdmUgPSBuZXcgWmlwQXJjaGl2ZSgpOwogICAgICAgICR0aGlzLT5fYXJjaGl2ZS0+b3BlbigkdXJsWydob3N0J10pOwoKICAgICAgICAkdGhpcy0+X2ZpbGVOYW1lSW5BcmNoaXZlID0gJHVybFsnZnJhZ21lbnQnXTsKICAgICAgICAkdGhpcy0+X3Bvc2l0aW9uID0gMDsKICAgICAgICAkdGhpcy0+X2RhdGEgPSAkdGhpcy0+X2FyY2hpdmUtPmdldEZyb21OYW1lKCAkdGhpcy0+X2ZpbGVOYW1lSW5BcmNoaXZlICk7CgogICAgICAgIHJldHVybiB0cnVlOwogICAgfQoKICAgIC8qKgoJICogSW1wbGVtZW50cyBzdXBwb3J0IGZvciBmc3RhdCgpLgoJICoKCSAqIEByZXR1cm4gIGJvb2xlYW4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHN0cmVhbV9zdGF0KCkgewogICAgICAgIHJldHVybiAkdGhpcy0+X2FyY2hpdmUtPnN0YXROYW1lKCAkdGhpcy0+X2ZpbGVOYW1lSW5BcmNoaXZlICk7CiAgICB9CgogICAgLyoqCgkgKiBJbXBsZW1lbnRzIHN1cHBvcnQgZm9yIGZyZWFkKCksIGZnZXRzKCkgZXRjLgoJICoKCSAqIEBwYXJhbSAgIGludAkJJGNvdW50CW1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQKCSAqIEByZXR1cm4gIHN0cmluZwogICAgICovCiAgICBmdW5jdGlvbiBzdHJlYW1fcmVhZCgkY291bnQpIHsKICAgICAgICAkcmV0ID0gc3Vic3RyKCR0aGlzLT5fZGF0YSwgJHRoaXMtPl9wb3NpdGlvbiwgJGNvdW50KTsKICAgICAgICAkdGhpcy0+X3Bvc2l0aW9uICs9IHN0cmxlbigkcmV0KTsKICAgICAgICByZXR1cm4gJHJldDsKICAgIH0KCiAgICAvKioKCSAqIFJldHVybnMgdGhlIHBvc2l0aW9uIG9mIHRoZSBmaWxlIHBvaW50ZXIsIGkuZS4gaXRzIG9mZnNldCBpbnRvIHRoZSBmaWxlCgkgKiBzdHJlYW0uIEltcGxlbWVudHMgc3VwcG9ydCBmb3IgZnRlbGwoKS4KCSAqCgkgKiBAcmV0dXJuICBpbnQKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHN0cmVhbV90ZWxsKCkgewogICAgICAgIHJldHVybiAkdGhpcy0+X3Bvc2l0aW9uOwogICAgfQoKICAgIC8qKgogICAgICogRU9GIHN0cmVhbQoJICoKCSAqIEByZXR1cm4JYm9vbAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gc3RyZWFtX2VvZigpIHsKICAgICAgICByZXR1cm4gJHRoaXMtPl9wb3NpdGlvbiA+PSBzdHJsZW4oJHRoaXMtPl9kYXRhKTsKICAgIH0KCiAgICAvKioKICAgICAqIFNlZWsgc3RyZWFtCgkgKgoJICogQHBhcmFtCWludAkJJG9mZnNldAlieXRlIG9mZnNldAoJICogQHBhcmFtCWludAkJJHdoZW5jZQlTRUVLX1NFVCwgU0VFS19DVVIgb3IgU0VFS19FTkQKCSAqIEByZXR1cm4JYm9vbAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gc3RyZWFtX3NlZWsoJG9mZnNldCwgJHdoZW5jZSkgewogICAgICAgIHN3aXRjaCAoJHdoZW5jZSkgewogICAgICAgICAgICBjYXNlIFNFRUtfU0VUOgogICAgICAgICAgICAgICAgaWYgKCRvZmZzZXQgPCBzdHJsZW4oJHRoaXMtPl9kYXRhKSAmJiAkb2Zmc2V0ID49IDApIHsKICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPl9wb3NpdGlvbiA9ICRvZmZzZXQ7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlIFNFRUtfQ1VSOgogICAgICAgICAgICAgICAgaWYgKCRvZmZzZXQgPj0gMCkgewogICAgICAgICAgICAgICAgICAgICAkdGhpcy0+X3Bvc2l0aW9uICs9ICRvZmZzZXQ7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlIFNFRUtfRU5EOgogICAgICAgICAgICAgICAgaWYgKHN0cmxlbigkdGhpcy0+X2RhdGEpICsgJG9mZnNldCA+PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5fcG9zaXRpb24gPSBzdHJsZW4oJHRoaXMtPl9kYXRhKSArICRvZmZzZXQ7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgIH0KfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Style.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIFBIUEV4Y2VsCiAqCiAqIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICoKICogQGNhdGVnb3J5ICAgUEhQRXhjZWwKICogQHBhY2thZ2UgICAgUEhQRXhjZWxfU3R5bGUKICogQGNvcHlyaWdodCAgQ29weXJpZ2h0IChjKSAyMDA2IC0gMjAxMiBQSFBFeGNlbCAoaHR0cDovL3d3dy5jb2RlcGxleC5jb20vUEhQRXhjZWwpCiAqIEBsaWNlbnNlICAgIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9vbGQtbGljZW5zZXMvbGdwbC0yLjEudHh0CUxHUEwKICogQHZlcnNpb24gICAgMS43LjcsIDIwMTItMDUtMTkKICovCgoKLyoqCiAqIFBIUEV4Y2VsX1N0eWxlCiAqCiAqIEBjYXRlZ29yeSAgIFBIUEV4Y2VsCiAqIEBwYWNrYWdlICAgIFBIUEV4Y2VsX1N0eWxlCiAqIEBjb3B5cmlnaHQgIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwgKGh0dHA6Ly93d3cuY29kZXBsZXguY29tL1BIUEV4Y2VsKQogKi8KY2xhc3MgUEhQRXhjZWxfU3R5bGUgaW1wbGVtZW50cyBQSFBFeGNlbF9JQ29tcGFyYWJsZQp7CgkvKioKCSAqIEZvbnQKCSAqCgkgKiBAdmFyIFBIUEV4Y2VsX1N0eWxlX0ZvbnQKCSAqLwoJcHJpdmF0ZSAkX2ZvbnQ7CgoJLyoqCgkgKiBGaWxsCgkgKgoJICogQHZhciBQSFBFeGNlbF9TdHlsZV9GaWxsCgkgKi8KCXByaXZhdGUgJF9maWxsOwoKCS8qKgoJICogQm9yZGVycwoJICoKCSAqIEB2YXIgUEhQRXhjZWxfU3R5bGVfQm9yZGVycwoJICovCglwcml2YXRlICRfYm9yZGVyczsKCgkvKioKCSAqIEFsaWdubWVudAoJICoKCSAqIEB2YXIgUEhQRXhjZWxfU3R5bGVfQWxpZ25tZW50CgkgKi8KCXByaXZhdGUgJF9hbGlnbm1lbnQ7CgoJLyoqCgkgKiBOdW1iZXIgRm9ybWF0CgkgKgoJICogQHZhciBQSFBFeGNlbF9TdHlsZV9OdW1iZXJGb3JtYXQKCSAqLwoJcHJpdmF0ZSAkX251bWJlckZvcm1hdDsKCgkvKioKCSAqIENvbmRpdGlvbmFsIHN0eWxlcwoJICoKCSAqIEB2YXIgUEhQRXhjZWxfU3R5bGVfQ29uZGl0aW9uYWxbXQoJICovCglwcml2YXRlICRfY29uZGl0aW9uYWxTdHlsZXM7CgoJLyoqCgkgKiBQcm90ZWN0aW9uCgkgKgoJICogQHZhciBQSFBFeGNlbF9TdHlsZV9Qcm90ZWN0aW9uCgkgKi8KCXByaXZhdGUgJF9wcm90ZWN0aW9uOwoKCS8qKgoJICogU3R5bGUgc3VwZXJ2aXNvcj8KCSAqCgkgKiBAdmFyIGJvb2xlYW4KCSAqLwoJcHJpdmF0ZSAkX2lzU3VwZXJ2aXNvcjsKCgkvKioKCSAqIFBhcmVudC4gT25seSB1c2VkIGZvciBzdHlsZSBzdXBlcnZpc29yCgkgKgoJICogQHZhciBQSFBFeGNlbAoJICovCglwcml2YXRlICRfcGFyZW50OwoKCS8qKgoJICogSW5kZXggb2Ygc3R5bGUgaW4gY29sbGVjdGlvbi4gT25seSB1c2VkIGZvciByZWFsIHN0eWxlLgoJICoKCSAqIEB2YXIgaW50CgkgKi8KCXByaXZhdGUgJF9pbmRleDsKCiAgICAvKioKICAgICAqIENyZWF0ZSBhIG5ldyBQSFBFeGNlbF9TdHlsZQoJICoKCSAqIEBwYXJhbSBib29sZWFuICRpc1N1cGVydmlzb3IKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRpc1N1cGVydmlzb3IgPSBmYWxzZSkKICAgIHsKICAgIAkvLyBTdXBlcnZpc29yPwoJCSR0aGlzLT5faXNTdXBlcnZpc29yID0gJGlzU3VwZXJ2aXNvcjsKCgkJLy8gSW5pdGlhbGlzZSB2YWx1ZXMKICAgIAkkdGhpcy0+X2NvbmRpdGlvbmFsU3R5bGVzIAk9IGFycmF5KCk7CgkJJHRoaXMtPl9mb250CQkJCT0gbmV3IFBIUEV4Y2VsX1N0eWxlX0ZvbnQoJGlzU3VwZXJ2aXNvcik7CgkJJHRoaXMtPl9maWxsCQkJCT0gbmV3IFBIUEV4Y2VsX1N0eWxlX0ZpbGwoJGlzU3VwZXJ2aXNvcik7CgkJJHRoaXMtPl9ib3JkZXJzCQkJCT0gbmV3IFBIUEV4Y2VsX1N0eWxlX0JvcmRlcnMoJGlzU3VwZXJ2aXNvcik7CgkJJHRoaXMtPl9hbGlnbm1lbnQJCQk9IG5ldyBQSFBFeGNlbF9TdHlsZV9BbGlnbm1lbnQoJGlzU3VwZXJ2aXNvcik7CgkJJHRoaXMtPl9udW1iZXJGb3JtYXQJCT0gbmV3IFBIUEV4Y2VsX1N0eWxlX051bWJlckZvcm1hdCgkaXNTdXBlcnZpc29yKTsKCQkkdGhpcy0+X3Byb3RlY3Rpb24JCQk9IG5ldyBQSFBFeGNlbF9TdHlsZV9Qcm90ZWN0aW9uKCRpc1N1cGVydmlzb3IpOwoKCQkvLyBiaW5kIHBhcmVudCBpZiB3ZSBhcmUgYSBzdXBlcnZpc29yCgkJaWYgKCRpc1N1cGVydmlzb3IpIHsKCQkJJHRoaXMtPl9mb250LT5iaW5kUGFyZW50KCR0aGlzKTsKCQkJJHRoaXMtPl9maWxsLT5iaW5kUGFyZW50KCR0aGlzKTsKCQkJJHRoaXMtPl9ib3JkZXJzLT5iaW5kUGFyZW50KCR0aGlzKTsKCQkJJHRoaXMtPl9hbGlnbm1lbnQtPmJpbmRQYXJlbnQoJHRoaXMpOwoJCQkkdGhpcy0+X251bWJlckZvcm1hdC0+YmluZFBhcmVudCgkdGhpcyk7CgkJCSR0aGlzLT5fcHJvdGVjdGlvbi0+YmluZFBhcmVudCgkdGhpcyk7CgkJfQogICAgfQoKCS8qKgoJICogQmluZCBwYXJlbnQuIE9ubHkgdXNlZCBmb3Igc3VwZXJ2aXNvcgoJICoKCSAqIEBwYXJhbSBQSFBFeGNlbCAkcGFyZW50CgkgKiBAcmV0dXJuIFBIUEV4Y2VsX1N0eWxlCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBiaW5kUGFyZW50KCRwYXJlbnQpCgl7CgkJJHRoaXMtPl9wYXJlbnQgPSAkcGFyZW50OwoJCXJldHVybiAkdGhpczsKCX0KCgkvKioKCSAqIElzIHRoaXMgYSBzdXBlcnZpc29yIG9yIGEgcmVhbCBzdHlsZSBjb21wb25lbnQ/CgkgKgoJICogQHJldHVybiBib29sZWFuCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRJc1N1cGVydmlzb3IoKQoJewoJCXJldHVybiAkdGhpcy0+X2lzU3VwZXJ2aXNvcjsKCX0KCgkvKioKCSAqIEdldCB0aGUgc2hhcmVkIHN0eWxlIGNvbXBvbmVudCBmb3IgdGhlIGN1cnJlbnRseSBhY3RpdmUgY2VsbCBpbiBjdXJyZW50bHkgYWN0aXZlIHNoZWV0LgoJICogT25seSB1c2VkIGZvciBzdHlsZSBzdXBlcnZpc29yCgkgKgoJICogQHJldHVybiBQSFBFeGNlbF9TdHlsZQoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0U2hhcmVkQ29tcG9uZW50KCkKCXsKCQkkYWN0aXZlU2hlZXQgPSAkdGhpcy0+Z2V0QWN0aXZlU2hlZXQoKTsKCQkkc2VsZWN0ZWRDZWxsID0gJHRoaXMtPmdldEFjdGl2ZUNlbGwoKTsgLy8gZS5nLiAnQTEnCgoJCWlmICgkYWN0aXZlU2hlZXQtPmNlbGxFeGlzdHMoJHNlbGVjdGVkQ2VsbCkpIHsKCQkJJHhmSW5kZXggPSAkYWN0aXZlU2hlZXQtPmdldENlbGwoJHNlbGVjdGVkQ2VsbCktPmdldFhmSW5kZXgoKTsKCQl9IGVsc2UgewoJCQkkeGZJbmRleCA9IDA7CgkJfQoKCQlyZXR1cm4gJHRoaXMtPl9wYXJlbnQtPmdldENlbGxYZkJ5SW5kZXgoJHhmSW5kZXgpOwoJfQoKCS8qKgoJICogR2V0IHRoZSBjdXJyZW50bHkgYWN0aXZlIHNoZWV0LiBPbmx5IHVzZWQgZm9yIHN1cGVydmlzb3IKCSAqCgkgKiBAcmV0dXJuIFBIUEV4Y2VsX1dvcmtzaGVldAoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0QWN0aXZlU2hlZXQoKQoJewoJCXJldHVybiAkdGhpcy0+X3BhcmVudC0+Z2V0QWN0aXZlU2hlZXQoKTsKCX0KCgkvKioKCSAqIEdldCB0aGUgY3VycmVudGx5IGFjdGl2ZSBjZWxsIGNvb3JkaW5hdGUgaW4gY3VycmVudGx5IGFjdGl2ZSBzaGVldC4KCSAqIE9ubHkgdXNlZCBmb3Igc3VwZXJ2aXNvcgoJICoKCSAqIEByZXR1cm4gc3RyaW5nIEUuZy4gJ0ExJwoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0U2VsZWN0ZWRDZWxscygpCgl7CgkJcmV0dXJuICR0aGlzLT5fcGFyZW50LT5nZXRBY3RpdmVTaGVldCgpLT5nZXRTZWxlY3RlZENlbGxzKCk7Cgl9CgoJLyoqCgkgKiBHZXQgdGhlIGN1cnJlbnRseSBhY3RpdmUgY2VsbCBjb29yZGluYXRlIGluIGN1cnJlbnRseSBhY3RpdmUgc2hlZXQuCgkgKiBPbmx5IHVzZWQgZm9yIHN1cGVydmlzb3IKCSAqCgkgKiBAcmV0dXJuIHN0cmluZyBFLmcuICdBMScKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldEFjdGl2ZUNlbGwoKQoJewoJCXJldHVybiAkdGhpcy0+X3BhcmVudC0+Z2V0QWN0aXZlU2hlZXQoKS0+Z2V0QWN0aXZlQ2VsbCgpOwoJfQoKCS8qKgoJICogR2V0IHBhcmVudC4gT25seSB1c2VkIGZvciBzdHlsZSBzdXBlcnZpc29yCgkgKgoJICogQHJldHVybiBQSFBFeGNlbAoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0UGFyZW50KCkKCXsKCQlyZXR1cm4gJHRoaXMtPl9wYXJlbnQ7Cgl9CgogICAgLyoqCiAgICAgKiBBcHBseSBzdHlsZXMgZnJvbSBhcnJheQogICAgICoKICAgICAqIDxjb2RlPgogICAgICogJG9ialBIUEV4Y2VsLT5nZXRBY3RpdmVTaGVldCgpLT5nZXRTdHlsZSgnQjInKS0+YXBwbHlGcm9tQXJyYXkoCiAgICAgKiAJCWFycmF5KAogICAgICogCQkJJ2ZvbnQnICAgID0+IGFycmF5KAogICAgICogCQkJCSduYW1lJyAgICAgID0+ICdBcmlhbCcsCiAgICAgKiAJCQkJJ2JvbGQnICAgICAgPT4gdHJ1ZSwKICAgICAqIAkJCQknaXRhbGljJyAgICA9PiBmYWxzZSwKICAgICAqIAkJCQkndW5kZXJsaW5lJyA9PiBQSFBFeGNlbF9TdHlsZV9Gb250OjpVTkRFUkxJTkVfRE9VQkxFLAogICAgICogCQkJCSdzdHJpa2UnICAgID0+IGZhbHNlLAogICAgICogCQkJCSdjb2xvcicgICAgID0+IGFycmF5KAogICAgICogCQkJCQkncmdiJyA9PiAnODA4MDgwJwogICAgICogCQkJCSkKICAgICAqIAkJCSksCiAgICAgKiAJCQknYm9yZGVycycgPT4gYXJyYXkoCiAgICAgKiAJCQkJJ2JvdHRvbScgICAgID0+IGFycmF5KAogICAgICogCQkJCQknc3R5bGUnID0+IFBIUEV4Y2VsX1N0eWxlX0JvcmRlcjo6Qk9SREVSX0RBU0hET1QsCiAgICAgKiAJCQkJCSdjb2xvcicgPT4gYXJyYXkoCiAgICAgKiAJCQkJCQkncmdiJyA9PiAnODA4MDgwJwogICAgICogCQkJCQkpCiAgICAgKiAJCQkJKSwKICAgICAqIAkJCQkndG9wJyAgICAgPT4gYXJyYXkoCiAgICAgKiAJCQkJCSdzdHlsZScgPT4gUEhQRXhjZWxfU3R5bGVfQm9yZGVyOjpCT1JERVJfREFTSERPVCwKICAgICAqIAkJCQkJJ2NvbG9yJyA9PiBhcnJheSgKICAgICAqIAkJCQkJCSdyZ2InID0+ICc4MDgwODAnCiAgICAgKiAJCQkJCSkKICAgICAqIAkJCQkpCiAgICAgKiAJCQkpCiAgICAgKiAJCSkKICAgICAqICk7CiAgICAgKiA8L2NvZGU+CiAgICAgKgogICAgICogQHBhcmFtCWFycmF5CSRwU3R5bGVzCUFycmF5IGNvbnRhaW5pbmcgc3R5bGUgaW5mb3JtYXRpb24KICAgICAqIEBwYXJhbSAJYm9vbGVhbgkJJHBBZHZhbmNlZAlBZHZhbmNlZCBtb2RlIGZvciBzZXR0aW5nIGJvcmRlcnMuCiAgICAgKiBAdGhyb3dzCUV4Y2VwdGlvbgogICAgICogQHJldHVybiBQSFBFeGNlbF9TdHlsZQogICAgICovCglwdWJsaWMgZnVuY3Rpb24gYXBwbHlGcm9tQXJyYXkoJHBTdHlsZXMgPSBudWxsLCAkcEFkdmFuY2VkID0gdHJ1ZSkgewoJCWlmIChpc19hcnJheSgkcFN0eWxlcykpIHsKCQkJaWYgKCR0aGlzLT5faXNTdXBlcnZpc29yKSB7CgoJCQkJJHBSYW5nZSA9ICR0aGlzLT5nZXRTZWxlY3RlZENlbGxzKCk7CgoJCQkJLy8gVXBwZXJjYXNlIGNvb3JkaW5hdGUKCQkJCSRwUmFuZ2UgPSBzdHJ0b3VwcGVyKCRwUmFuZ2UpOwoKCQkJCS8vIElzIGl0IGEgY2VsbCByYW5nZSBvciBhIHNpbmdsZSBjZWxsPwoJCQkJaWYgKHN0cnBvcygkcFJhbmdlLCAnOicpID09PSBmYWxzZSkgewoJCQkJCSRyYW5nZUEgPSAkcFJhbmdlOwoJCQkJCSRyYW5nZUIgPSAkcFJhbmdlOwoJCQkJfSBlbHNlIHsKCQkJCQlsaXN0KCRyYW5nZUEsICRyYW5nZUIpID0gZXhwbG9kZSgnOicsICRwUmFuZ2UpOwoJCQkJfQoKCQkJCS8vIENhbGN1bGF0ZSByYW5nZSBvdXRlciBib3JkZXJzCgkJCQkkcmFuZ2VTdGFydCA9IFBIUEV4Y2VsX0NlbGw6OmNvb3JkaW5hdGVGcm9tU3RyaW5nKCRyYW5nZUEpOwoJCQkJJHJhbmdlRW5kIAk9IFBIUEV4Y2VsX0NlbGw6OmNvb3JkaW5hdGVGcm9tU3RyaW5nKCRyYW5nZUIpOwoKCQkJCS8vIFRyYW5zbGF0ZSBjb2x1bW4gaW50byBpbmRleAoJCQkJJHJhbmdlU3RhcnRbMF0JPSBQSFBFeGNlbF9DZWxsOjpjb2x1bW5JbmRleEZyb21TdHJpbmcoJHJhbmdlU3RhcnRbMF0pIC0gMTsKCQkJCSRyYW5nZUVuZFswXQk9IFBIUEV4Y2VsX0NlbGw6OmNvbHVtbkluZGV4RnJvbVN0cmluZygkcmFuZ2VFbmRbMF0pIC0gMTsKCgkJCQkvLyBNYWtlIHN1cmUgd2UgY2FuIGxvb3AgdXB3YXJkcyBvbiByb3dzIGFuZCBjb2x1bW5zCgkJCQlpZiAoJHJhbmdlU3RhcnRbMF0gPiAkcmFuZ2VFbmRbMF0gJiYgJHJhbmdlU3RhcnRbMV0gPiAkcmFuZ2VFbmRbMV0pIHsKCQkJCQkkdG1wID0gJHJhbmdlU3RhcnQ7CgkJCQkJJHJhbmdlU3RhcnQgPSAkcmFuZ2VFbmQ7CgkJCQkJJHJhbmdlRW5kID0gJHRtcDsKCQkJCX0KCgkJCQkvLyBBRFZBTkNFRCBNT0RFOgoKCQkJCWlmICgkcEFkdmFuY2VkICYmIGlzc2V0KCRwU3R5bGVzWydib3JkZXJzJ10pKSB7CgoJCQkJCS8vICdhbGxib3JkZXJzJyBpcyBhIHNob3J0aGFuZCBwcm9wZXJ0eSBmb3IgJ291dGxpbmUnIGFuZCAnaW5zaWRlJyBhbmQKCQkJCQkvLwkJaXQgYXBwbGllcyB0byBjb21wb25lbnRzIHRoYXQgaGF2ZSBub3QgYmVlbiBzZXQgZXhwbGljaXRseQoJCQkJCWlmIChpc3NldCgkcFN0eWxlc1snYm9yZGVycyddWydhbGxib3JkZXJzJ10pKSB7CgkJCQkJCWZvcmVhY2ggKGFycmF5KCdvdXRsaW5lJywgJ2luc2lkZScpIGFzICRjb21wb25lbnQpIHsKCQkJCQkJCWlmICghaXNzZXQoJHBTdHlsZXNbJ2JvcmRlcnMnXVskY29tcG9uZW50XSkpIHsKCQkJCQkJCQkkcFN0eWxlc1snYm9yZGVycyddWyRjb21wb25lbnRdID0gJHBTdHlsZXNbJ2JvcmRlcnMnXVsnYWxsYm9yZGVycyddOwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJCXVuc2V0KCRwU3R5bGVzWydib3JkZXJzJ11bJ2FsbGJvcmRlcnMnXSk7IC8vIG5vdCBuZWVkZWQgYW55IG1vcmUKCQkJCQl9CgoJCQkJCS8vICdvdXRsaW5lJyBpcyBhIHNob3J0aGFuZCBwcm9wZXJ0eSBmb3IgJ3RvcCcsICdyaWdodCcsICdib3R0b20nLCAnbGVmdCcKCQkJCQkvLwkJaXQgYXBwbGllcyB0byBjb21wb25lbnRzIHRoYXQgaGF2ZSBub3QgYmVlbiBzZXQgZXhwbGljaXRseQoJCQkJCWlmIChpc3NldCgkcFN0eWxlc1snYm9yZGVycyddWydvdXRsaW5lJ10pKSB7CgkJCQkJCWZvcmVhY2ggKGFycmF5KCd0b3AnLCAncmlnaHQnLCAnYm90dG9tJywgJ2xlZnQnKSBhcyAkY29tcG9uZW50KSB7CgkJCQkJCQlpZiAoIWlzc2V0KCRwU3R5bGVzWydib3JkZXJzJ11bJGNvbXBvbmVudF0pKSB7CgkJCQkJCQkJJHBTdHlsZXNbJ2JvcmRlcnMnXVskY29tcG9uZW50XSA9ICRwU3R5bGVzWydib3JkZXJzJ11bJ291dGxpbmUnXTsKCQkJCQkJCX0KCQkJCQkJfQoJCQkJCQl1bnNldCgkcFN0eWxlc1snYm9yZGVycyddWydvdXRsaW5lJ10pOyAvLyBub3QgbmVlZGVkIGFueSBtb3JlCgkJCQkJfQoKCQkJCQkvLyAnaW5zaWRlJyBpcyBhIHNob3J0aGFuZCBwcm9wZXJ0eSBmb3IgJ3ZlcnRpY2FsJyBhbmQgJ2hvcml6b250YWwnCgkJCQkJLy8JCWl0IGFwcGxpZXMgdG8gY29tcG9uZW50cyB0aGF0IGhhdmUgbm90IGJlZW4gc2V0IGV4cGxpY2l0bHkKCQkJCQlpZiAoaXNzZXQoJHBTdHlsZXNbJ2JvcmRlcnMnXVsnaW5zaWRlJ10pKSB7CgkJCQkJCWZvcmVhY2ggKGFycmF5KCd2ZXJ0aWNhbCcsICdob3Jpem9udGFsJykgYXMgJGNvbXBvbmVudCkgewoJCQkJCQkJaWYgKCFpc3NldCgkcFN0eWxlc1snYm9yZGVycyddWyRjb21wb25lbnRdKSkgewoJCQkJCQkJCSRwU3R5bGVzWydib3JkZXJzJ11bJGNvbXBvbmVudF0gPSAkcFN0eWxlc1snYm9yZGVycyddWydpbnNpZGUnXTsKCQkJCQkJCX0KCQkJCQkJfQoJCQkJCQl1bnNldCgkcFN0eWxlc1snYm9yZGVycyddWydpbnNpZGUnXSk7IC8vIG5vdCBuZWVkZWQgYW55IG1vcmUKCQkJCQl9CgoJCQkJCS8vIHdpZHRoIGFuZCBoZWlnaHQgY2hhcmFjdGVyaXN0aWNzIG9mIHNlbGVjdGlvbiwgMSwgMiwgb3IgMyAoZm9yIDMgb3IgbW9yZSkKCQkJCQkkeE1heCA9IG1pbigkcmFuZ2VFbmRbMF0gLSAkcmFuZ2VTdGFydFswXSArIDEsIDMpOwoJCQkJCSR5TWF4ID0gbWluKCRyYW5nZUVuZFsxXSAtICRyYW5nZVN0YXJ0WzFdICsgMSwgMyk7CgoJCQkJCS8vIGxvb3AgdGhyb3VnaCB1cCB0byAzIHggMyA9IDkgcmVnaW9ucwoJCQkJCWZvciAoJHggPSAxOyAkeCA8PSAkeE1heDsgKyskeCkgewoJCQkJCQkvLyBzdGFydCBjb2x1bW4gaW5kZXggZm9yIHJlZ2lvbgoJCQkJCQkkY29sU3RhcnQgPSAoJHggPT0gMykgPwoJCQkJCQkJUEhQRXhjZWxfQ2VsbDo6c3RyaW5nRnJvbUNvbHVtbkluZGV4KCRyYW5nZUVuZFswXSkKCQkJCQkJCQk6IFBIUEV4Y2VsX0NlbGw6OnN0cmluZ0Zyb21Db2x1bW5JbmRleCgkcmFuZ2VTdGFydFswXSArICR4IC0gMSk7CgoJCQkJCQkvLyBlbmQgY29sdW1uIGluZGV4IGZvciByZWdpb24KCQkJCQkJJGNvbEVuZCA9ICgkeCA9PSAxKSA/CgkJCQkJCQlQSFBFeGNlbF9DZWxsOjpzdHJpbmdGcm9tQ29sdW1uSW5kZXgoJHJhbmdlU3RhcnRbMF0pCgkJCQkJCQkJOiBQSFBFeGNlbF9DZWxsOjpzdHJpbmdGcm9tQ29sdW1uSW5kZXgoJHJhbmdlRW5kWzBdIC0gJHhNYXggKyAkeCk7CgoJCQkJCQlmb3IgKCR5ID0gMTsgJHkgPD0gJHlNYXg7ICsrJHkpIHsKCgkJCQkJCQkvLyB3aGljaCBlZGdlcyBhcmUgdG91Y2hpbmcgdGhlIHJlZ2lvbgoJCQkJCQkJJGVkZ2VzID0gYXJyYXkoKTsKCgkJCQkJCQkvLyBhcmUgd2UgYXQgbGVmdCBlZGdlCgkJCQkJCQlpZiAoJHggPT0gMSkgewoJCQkJCQkJCSRlZGdlc1tdID0gJ2xlZnQnOwoJCQkJCQkJfQoKCQkJCQkJCS8vIGFyZSB3ZSBhdCByaWdodCBlZGdlCgkJCQkJCQlpZiAoJHggPT0gJHhNYXgpIHsKCQkJCQkJCQkkZWRnZXNbXSA9ICdyaWdodCc7CgkJCQkJCQl9CgoJCQkJCQkJLy8gYXJlIHdlIGF0IHRvcCBlZGdlPwoJCQkJCQkJaWYgKCR5ID09IDEpIHsKCQkJCQkJCQkkZWRnZXNbXSA9ICd0b3AnOwoJCQkJCQkJfQoKCQkJCQkJCS8vIGFyZSB3ZSBhdCBib3R0b20gZWRnZT8KCQkJCQkJCWlmICgkeSA9PSAkeU1heCkgewoJCQkJCQkJCSRlZGdlc1tdID0gJ2JvdHRvbSc7CgkJCQkJCQl9CgoJCQkJCQkJLy8gc3RhcnQgcm93IGluZGV4IGZvciByZWdpb24KCQkJCQkJCSRyb3dTdGFydCA9ICgkeSA9PSAzKSA/CgkJCQkJCQkJJHJhbmdlRW5kWzFdIDogJHJhbmdlU3RhcnRbMV0gKyAkeSAtIDE7CgoJCQkJCQkJLy8gZW5kIHJvdyBpbmRleCBmb3IgcmVnaW9uCgkJCQkJCQkkcm93RW5kID0gKCR5ID09IDEpID8KCQkJCQkJCQkkcmFuZ2VTdGFydFsxXSA6ICRyYW5nZUVuZFsxXSAtICR5TWF4ICsgJHk7CgoJCQkJCQkJLy8gYnVpbGQgcmFuZ2UgZm9yIHJlZ2lvbgoJCQkJCQkJJHJhbmdlID0gJGNvbFN0YXJ0IC4gJHJvd1N0YXJ0IC4gJzonIC4gJGNvbEVuZCAuICRyb3dFbmQ7CgoJCQkJCQkJLy8gcmV0cmlldmUgcmVsZXZhbnQgc3R5bGUgYXJyYXkgZm9yIHJlZ2lvbgoJCQkJCQkJJHJlZ2lvblN0eWxlcyA9ICRwU3R5bGVzOwoJCQkJCQkJdW5zZXQoJHJlZ2lvblN0eWxlc1snYm9yZGVycyddWydpbnNpZGUnXSk7CgoJCQkJCQkJLy8gd2hhdCBhcmUgdGhlIGlubmVyIGVkZ2VzIG9mIHRoZSByZWdpb24gd2hlbiBsb29raW5nIGF0IHRoZSBzZWxlY3Rpb24KCQkJCQkJCSRpbm5lckVkZ2VzID0gYXJyYXlfZGlmZiggYXJyYXkoJ3RvcCcsICdyaWdodCcsICdib3R0b20nLCAnbGVmdCcpLCAkZWRnZXMgKTsKCgkJCQkJCQkvLyBpbm5lciBlZGdlcyB0aGF0IGFyZSBub3QgdG91Y2hpbmcgdGhlIHJlZ2lvbiBzaG91bGQgdGFrZSB0aGUgJ2luc2lkZScgYm9yZGVyIHByb3BlcnRpZXMgaWYgdGhleSBoYXZlIGJlZW4gc2V0CgkJCQkJCQlmb3JlYWNoICgkaW5uZXJFZGdlcyBhcyAkaW5uZXJFZGdlKSB7CgkJCQkJCQkJc3dpdGNoICgkaW5uZXJFZGdlKSB7CgkJCQkJCQkJCWNhc2UgJ3RvcCc6CgkJCQkJCQkJCWNhc2UgJ2JvdHRvbSc6CgkJCQkJCQkJCQkvLyBzaG91bGQgcGljayB1cCAnaG9yaXpvbnRhbCcgYm9yZGVyIHByb3BlcnR5IGlmIHNldAoJCQkJCQkJCQkJaWYgKGlzc2V0KCRwU3R5bGVzWydib3JkZXJzJ11bJ2hvcml6b250YWwnXSkpIHsKCQkJCQkJCQkJCQkkcmVnaW9uU3R5bGVzWydib3JkZXJzJ11bJGlubmVyRWRnZV0gPSAkcFN0eWxlc1snYm9yZGVycyddWydob3Jpem9udGFsJ107CgkJCQkJCQkJCQl9IGVsc2UgewoJCQkJCQkJCQkJCXVuc2V0KCRyZWdpb25TdHlsZXNbJ2JvcmRlcnMnXVskaW5uZXJFZGdlXSk7CgkJCQkJCQkJCQl9CgkJCQkJCQkJCQlicmVhazsKCQkJCQkJCQkJY2FzZSAnbGVmdCc6CgkJCQkJCQkJCWNhc2UgJ3JpZ2h0JzoKCQkJCQkJCQkJCS8vIHNob3VsZCBwaWNrIHVwICd2ZXJ0aWNhbCcgYm9yZGVyIHByb3BlcnR5IGlmIHNldAoJCQkJCQkJCQkJaWYgKGlzc2V0KCRwU3R5bGVzWydib3JkZXJzJ11bJ3ZlcnRpY2FsJ10pKSB7CgkJCQkJCQkJCQkJJHJlZ2lvblN0eWxlc1snYm9yZGVycyddWyRpbm5lckVkZ2VdID0gJHBTdHlsZXNbJ2JvcmRlcnMnXVsndmVydGljYWwnXTsKCQkJCQkJCQkJCX0gZWxzZSB7CgkJCQkJCQkJCQkJdW5zZXQoJHJlZ2lvblN0eWxlc1snYm9yZGVycyddWyRpbm5lckVkZ2VdKTsKCQkJCQkJCQkJCX0KCQkJCQkJCQkJCWJyZWFrOwoJCQkJCQkJCX0KCQkJCQkJCX0KCgkJCQkJCQkvLyBhcHBseSByZWdpb24gc3R5bGUgdG8gcmVnaW9uIGJ5IGNhbGxpbmcgYXBwbHlGcm9tQXJyYXkoKSBpbiBzaW1wbGUgbW9kZQoJCQkJCQkJJHRoaXMtPmdldEFjdGl2ZVNoZWV0KCktPmdldFN0eWxlKCRyYW5nZSktPmFwcGx5RnJvbUFycmF5KCRyZWdpb25TdHlsZXMsIGZhbHNlKTsKCQkJCQkJfQoJCQkJCX0KCQkJCQlyZXR1cm4gJHRoaXM7CgkJCQl9CgoJCQkJLy8gU0lNUExFIE1PREU6CgoJCQkJLy8gU2VsZWN0aW9uIHR5cGUsIGluc3BlY3QKCQkJCWlmIChwcmVnX21hdGNoKCcvXltBLVpdKzE6W0EtWl0rMTA0ODU3NiQvJywgJHBSYW5nZSkpIHsKCQkJCQkkc2VsZWN0aW9uVHlwZSA9ICdDT0xVTU4nOwoJCQkJfSBlbHNlIGlmIChwcmVnX21hdGNoKCcvXkFbMC05XSs6WEZEWzAtOV0rJC8nLCAkcFJhbmdlKSkgewoJCQkJCSRzZWxlY3Rpb25UeXBlID0gJ1JPVyc7CgkJCQl9IGVsc2UgewoJCQkJCSRzZWxlY3Rpb25UeXBlID0gJ0NFTEwnOwoJCQkJfQoKCQkJCS8vIEZpcnN0IGxvb3AgdGhyb3VnaCBjb2x1bW5zLCByb3dzLCBvciBjZWxscyB0byBmaW5kIG91dCB3aGljaCBzdHlsZXMgYXJlIGFmZmVjdGVkIGJ5IHRoaXMgb3BlcmF0aW9uCgkJCQlzd2l0Y2ggKCRzZWxlY3Rpb25UeXBlKSB7CgkJCQkJY2FzZSAnQ09MVU1OJzoKCQkJCQkJJG9sZFhmSW5kZXhlcyA9IGFycmF5KCk7CgkJCQkJCWZvciAoJGNvbCA9ICRyYW5nZVN0YXJ0WzBdOyAkY29sIDw9ICRyYW5nZUVuZFswXTsgKyskY29sKSB7CgkJCQkJCQkkb2xkWGZJbmRleGVzWyR0aGlzLT5nZXRBY3RpdmVTaGVldCgpLT5nZXRDb2x1bW5EaW1lbnNpb25CeUNvbHVtbigkY29sKS0+Z2V0WGZJbmRleCgpXSA9IHRydWU7CgkJCQkJCX0KCQkJCQkJYnJlYWs7CgoJCQkJCWNhc2UgJ1JPVyc6CgkJCQkJCSRvbGRYZkluZGV4ZXMgPSBhcnJheSgpOwoJCQkJCQlmb3IgKCRyb3cgPSAkcmFuZ2VTdGFydFsxXTsgJHJvdyA8PSAkcmFuZ2VFbmRbMV07ICsrJHJvdykgewoJCQkJCQkJaWYgKCR0aGlzLT5nZXRBY3RpdmVTaGVldCgpLT5nZXRSb3dEaW1lbnNpb24oJHJvdyktPmdldFhmSW5kZXgoKSA9PSBudWxsKSB7CgkJCQkJCQkJJG9sZFhmSW5kZXhlc1swXSA9IHRydWU7IC8vIHJvdyB3aXRob3V0IGV4cGxpY2l0IHN0eWxlIHNob3VsZCBiZSBmb3JtYXR0ZWQgYmFzZWQgb24gZGVmYXVsdCBzdHlsZQoJCQkJCQkJfSBlbHNlIHsKCQkJCQkJCQkkb2xkWGZJbmRleGVzWyR0aGlzLT5nZXRBY3RpdmVTaGVldCgpLT5nZXRSb3dEaW1lbnNpb24oJHJvdyktPmdldFhmSW5kZXgoKV0gPSB0cnVlOwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJCWJyZWFrOwoKCQkJCQljYXNlICdDRUxMJzoKCQkJCQkJJG9sZFhmSW5kZXhlcyA9IGFycmF5KCk7CgkJCQkJCWZvciAoJGNvbCA9ICRyYW5nZVN0YXJ0WzBdOyAkY29sIDw9ICRyYW5nZUVuZFswXTsgKyskY29sKSB7CgkJCQkJCQlmb3IgKCRyb3cgPSAkcmFuZ2VTdGFydFsxXTsgJHJvdyA8PSAkcmFuZ2VFbmRbMV07ICsrJHJvdykgewoJCQkJCQkJCSRvbGRYZkluZGV4ZXNbJHRoaXMtPmdldEFjdGl2ZVNoZWV0KCktPmdldENlbGxCeUNvbHVtbkFuZFJvdygkY29sLCAkcm93KS0+Z2V0WGZJbmRleCgpXSA9IHRydWU7CgkJCQkJCQl9CgkJCQkJCX0KCQkJCQkJYnJlYWs7CgkJCQl9CgoJCQkJLy8gY2xvbmUgZWFjaCBvZiB0aGUgYWZmZWN0ZWQgc3R5bGVzLCBhcHBseSB0aGUgc3R5bGUgYXJycmF5LCBhbmQgYWRkIHRoZSBuZXcgc3R5bGVzIHRvIHRoZSB3b3JrYm9vawoJCQkJJHdvcmtib29rID0gJHRoaXMtPmdldEFjdGl2ZVNoZWV0KCktPmdldFBhcmVudCgpOwoJCQkJZm9yZWFjaCAoJG9sZFhmSW5kZXhlcyBhcyAkb2xkWGZJbmRleCA9PiAkZHVtbXkpIHsKCQkJCQkkc3R5bGUgPSAkd29ya2Jvb2stPmdldENlbGxYZkJ5SW5kZXgoJG9sZFhmSW5kZXgpOwoJCQkJCSRuZXdTdHlsZSA9IGNsb25lICRzdHlsZTsKCQkJCQkkbmV3U3R5bGUtPmFwcGx5RnJvbUFycmF5KCRwU3R5bGVzKTsKCgkJCQkJaWYgKCRleGlzdGluZ1N0eWxlID0gJHdvcmtib29rLT5nZXRDZWxsWGZCeUhhc2hDb2RlKCRuZXdTdHlsZS0+Z2V0SGFzaENvZGUoKSkpIHsKCQkJCQkJLy8gdGhlcmUgaXMgYWxyZWFkeSBzdWNoIGNlbGwgWGYgaW4gb3VyIGNvbGxlY3Rpb24KCQkJCQkJJG5ld1hmSW5kZXhlc1skb2xkWGZJbmRleF0gPSAkZXhpc3RpbmdTdHlsZS0+Z2V0SW5kZXgoKTsKCQkJCQl9IGVsc2UgewoJCQkJCQkvLyB3ZSBkb24ndCBoYXZlIHN1Y2ggYSBjZWxsIFhmLCBuZWVkIHRvIGFkZAoJCQkJCQkkd29ya2Jvb2stPmFkZENlbGxYZigkbmV3U3R5bGUpOwoJCQkJCQkkbmV3WGZJbmRleGVzWyRvbGRYZkluZGV4XSA9ICRuZXdTdHlsZS0+Z2V0SW5kZXgoKTsKCQkJCQl9CgkJCQl9CgoJCQkJLy8gTG9vcCB0aHJvdWdoIGNvbHVtbnMsIHJvd3MsIG9yIGNlbGxzIGFnYWluIGFuZCB1cGRhdGUgdGhlIFhGIGluZGV4CgkJCQlzd2l0Y2ggKCRzZWxlY3Rpb25UeXBlKSB7CgkJCQkJY2FzZSAnQ09MVU1OJzoKCQkJCQkJZm9yICgkY29sID0gJHJhbmdlU3RhcnRbMF07ICRjb2wgPD0gJHJhbmdlRW5kWzBdOyArKyRjb2wpIHsKCQkJCQkJCSRjb2x1bW5EaW1lbnNpb24gPSAkdGhpcy0+Z2V0QWN0aXZlU2hlZXQoKS0+Z2V0Q29sdW1uRGltZW5zaW9uQnlDb2x1bW4oJGNvbCk7CgkJCQkJCQkkb2xkWGZJbmRleCA9ICRjb2x1bW5EaW1lbnNpb24tPmdldFhmSW5kZXgoKTsKCQkJCQkJCSRjb2x1bW5EaW1lbnNpb24tPnNldFhmSW5kZXgoJG5ld1hmSW5kZXhlc1skb2xkWGZJbmRleF0pOwoJCQkJCQl9CgkJCQkJCWJyZWFrOwoKCQkJCQljYXNlICdST1cnOgoJCQkJCQlmb3IgKCRyb3cgPSAkcmFuZ2VTdGFydFsxXTsgJHJvdyA8PSAkcmFuZ2VFbmRbMV07ICsrJHJvdykgewoJCQkJCQkJJHJvd0RpbWVuc2lvbiA9ICR0aGlzLT5nZXRBY3RpdmVTaGVldCgpLT5nZXRSb3dEaW1lbnNpb24oJHJvdyk7CgkJCQkJCQkkb2xkWGZJbmRleCA9ICRyb3dEaW1lbnNpb24tPmdldFhmSW5kZXgoKSA9PT0gbnVsbCA/CgkJCQkJCQkJMCA6ICRyb3dEaW1lbnNpb24tPmdldFhmSW5kZXgoKTsgLy8gcm93IHdpdGhvdXQgZXhwbGljaXQgc3R5bGUgc2hvdWxkIGJlIGZvcm1hdHRlZCBiYXNlZCBvbiBkZWZhdWx0IHN0eWxlCgkJCQkJCQkkcm93RGltZW5zaW9uLT5zZXRYZkluZGV4KCRuZXdYZkluZGV4ZXNbJG9sZFhmSW5kZXhdKTsKCQkJCQkJfQoJCQkJCQlicmVhazsKCgkJCQkJY2FzZSAnQ0VMTCc6CgkJCQkJCWZvciAoJGNvbCA9ICRyYW5nZVN0YXJ0WzBdOyAkY29sIDw9ICRyYW5nZUVuZFswXTsgKyskY29sKSB7CgkJCQkJCQlmb3IgKCRyb3cgPSAkcmFuZ2VTdGFydFsxXTsgJHJvdyA8PSAkcmFuZ2VFbmRbMV07ICsrJHJvdykgewoJCQkJCQkJCSRjZWxsID0gJHRoaXMtPmdldEFjdGl2ZVNoZWV0KCktPmdldENlbGxCeUNvbHVtbkFuZFJvdygkY29sLCAkcm93KTsKCQkJCQkJCQkkb2xkWGZJbmRleCA9ICRjZWxsLT5nZXRYZkluZGV4KCk7CgkJCQkJCQkJJGNlbGwtPnNldFhmSW5kZXgoJG5ld1hmSW5kZXhlc1skb2xkWGZJbmRleF0pOwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJCWJyZWFrOwoJCQkJfQoKCQkJfSBlbHNlIHsKCQkJCS8vIG5vdCBhIHN1cGVydmlzb3IsIGp1c3QgYXBwbHkgdGhlIHN0eWxlIGFycmF5IGRpcmVjdGx5IG9uIHN0eWxlIG9iamVjdAoJCQkJaWYgKGFycmF5X2tleV9leGlzdHMoJ2ZpbGwnLCAkcFN0eWxlcykpIHsKCQkJCQkkdGhpcy0+Z2V0RmlsbCgpLT5hcHBseUZyb21BcnJheSgkcFN0eWxlc1snZmlsbCddKTsKCQkJCX0KCQkJCWlmIChhcnJheV9rZXlfZXhpc3RzKCdmb250JywgJHBTdHlsZXMpKSB7CgkJCQkJJHRoaXMtPmdldEZvbnQoKS0+YXBwbHlGcm9tQXJyYXkoJHBTdHlsZXNbJ2ZvbnQnXSk7CgkJCQl9CgkJCQlpZiAoYXJyYXlfa2V5X2V4aXN0cygnYm9yZGVycycsICRwU3R5bGVzKSkgewoJCQkJCSR0aGlzLT5nZXRCb3JkZXJzKCktPmFwcGx5RnJvbUFycmF5KCRwU3R5bGVzWydib3JkZXJzJ10pOwoJCQkJfQoJCQkJaWYgKGFycmF5X2tleV9leGlzdHMoJ2FsaWdubWVudCcsICRwU3R5bGVzKSkgewoJCQkJCSR0aGlzLT5nZXRBbGlnbm1lbnQoKS0+YXBwbHlGcm9tQXJyYXkoJHBTdHlsZXNbJ2FsaWdubWVudCddKTsKCQkJCX0KCQkJCWlmIChhcnJheV9rZXlfZXhpc3RzKCdudW1iZXJmb3JtYXQnLCAkcFN0eWxlcykpIHsKCQkJCQkkdGhpcy0+Z2V0TnVtYmVyRm9ybWF0KCktPmFwcGx5RnJvbUFycmF5KCRwU3R5bGVzWydudW1iZXJmb3JtYXQnXSk7CgkJCQl9CgkJCQlpZiAoYXJyYXlfa2V5X2V4aXN0cygncHJvdGVjdGlvbicsICRwU3R5bGVzKSkgewoJCQkJCSR0aGlzLT5nZXRQcm90ZWN0aW9uKCktPmFwcGx5RnJvbUFycmF5KCRwU3R5bGVzWydwcm90ZWN0aW9uJ10pOwoJCQkJfQoJCQl9CgkJfSBlbHNlIHsKCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbigiSW52YWxpZCBzdHlsZSBhcnJheSBwYXNzZWQuIik7CgkJfQoJCXJldHVybiAkdGhpczsKCX0KCiAgICAvKioKICAgICAqIEdldCBGaWxsCiAgICAgKgogICAgICogQHJldHVybiBQSFBFeGNlbF9TdHlsZV9GaWxsCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRGaWxsKCkgewoJCXJldHVybiAkdGhpcy0+X2ZpbGw7CiAgICB9CgogICAgLyoqCiAgICAgKiBHZXQgRm9udAogICAgICoKICAgICAqIEByZXR1cm4gUEhQRXhjZWxfU3R5bGVfRm9udAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0Rm9udCgpIHsKCQlyZXR1cm4gJHRoaXMtPl9mb250OwogICAgfQoKCS8qKgoJICogU2V0IGZvbnQKCSAqCgkgKiBAcGFyYW0gUEhQRXhjZWxfU3R5bGVfRm9udCAkZm9udAoJICogQHJldHVybiBQSFBFeGNlbF9TdHlsZQoJICovCglwdWJsaWMgZnVuY3Rpb24gc2V0Rm9udChQSFBFeGNlbF9TdHlsZV9Gb250ICRmb250KQoJewoJCSR0aGlzLT5fZm9udCA9ICRmb250OwoJCXJldHVybiAkdGhpczsKCX0KCiAgICAvKioKICAgICAqIEdldCBCb3JkZXJzCiAgICAgKgogICAgICogQHJldHVybiBQSFBFeGNlbF9TdHlsZV9Cb3JkZXJzCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRCb3JkZXJzKCkgewoJCXJldHVybiAkdGhpcy0+X2JvcmRlcnM7CiAgICB9CgogICAgLyoqCiAgICAgKiBHZXQgQWxpZ25tZW50CiAgICAgKgogICAgICogQHJldHVybiBQSFBFeGNlbF9TdHlsZV9BbGlnbm1lbnQKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldEFsaWdubWVudCgpIHsKCQlyZXR1cm4gJHRoaXMtPl9hbGlnbm1lbnQ7CiAgICB9CgogICAgLyoqCiAgICAgKiBHZXQgTnVtYmVyIEZvcm1hdAogICAgICoKICAgICAqIEByZXR1cm4gUEhQRXhjZWxfU3R5bGVfTnVtYmVyRm9ybWF0CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXROdW1iZXJGb3JtYXQoKSB7CgkJcmV0dXJuICR0aGlzLT5fbnVtYmVyRm9ybWF0OwogICAgfQoKICAgIC8qKgogICAgICogR2V0IENvbmRpdGlvbmFsIFN0eWxlcy4gT25seSB1c2VkIG9uIHN1cGVydmlzb3IuCiAgICAgKgogICAgICogQHJldHVybiBQSFBFeGNlbF9TdHlsZV9Db25kaXRpb25hbFtdCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRDb25kaXRpb25hbFN0eWxlcygpIHsKCQlyZXR1cm4gJHRoaXMtPmdldEFjdGl2ZVNoZWV0KCktPmdldENvbmRpdGlvbmFsU3R5bGVzKCR0aGlzLT5nZXRBY3RpdmVDZWxsKCkpOwogICAgfQoKICAgIC8qKgogICAgICogU2V0IENvbmRpdGlvbmFsIFN0eWxlcy4gT25seSB1c2VkIG9uIHN1cGVydmlzb3IuCiAgICAgKgogICAgICogQHBhcmFtIFBIUEV4Y2VsX1N0eWxlX0NvbmRpdGlvbmFsW10JJHBWYWx1ZQlBcnJheSBvZiBjb25kdGlvbmFsIHN0eWxlcwogICAgICogQHJldHVybiBQSFBFeGNlbF9TdHlsZQogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gc2V0Q29uZGl0aW9uYWxTdHlsZXMoJHBWYWx1ZSA9IG51bGwpIHsKCQlpZiAoaXNfYXJyYXkoJHBWYWx1ZSkpIHsKCQkJJHRoaXMtPmdldEFjdGl2ZVNoZWV0KCktPnNldENvbmRpdGlvbmFsU3R5bGVzKCR0aGlzLT5nZXRTZWxlY3RlZENlbGxzKCksICRwVmFsdWUpOwoJCX0KCQlyZXR1cm4gJHRoaXM7CiAgICB9CgogICAgLyoqCiAgICAgKiBHZXQgUHJvdGVjdGlvbgogICAgICoKICAgICAqIEByZXR1cm4gUEhQRXhjZWxfU3R5bGVfUHJvdGVjdGlvbgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0UHJvdGVjdGlvbigpIHsKCQlyZXR1cm4gJHRoaXMtPl9wcm90ZWN0aW9uOwogICAgfQoKCS8qKgoJICogR2V0IGhhc2ggY29kZQoJICoKCSAqIEByZXR1cm4gc3RyaW5nCUhhc2ggY29kZQoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0SGFzaENvZGUoKSB7CgkJJGhhc2hDb25kaXRpb25hbHMgPSAnJzsKCQlmb3JlYWNoICgkdGhpcy0+X2NvbmRpdGlvbmFsU3R5bGVzIGFzICRjb25kaXRpb25hbCkgewoJCQkkaGFzaENvbmRpdGlvbmFscyAuPSAkY29uZGl0aW9uYWwtPmdldEhhc2hDb2RlKCk7CgkJfQoKICAgIAlyZXR1cm4gbWQ1KAogICAgCQkgICR0aGlzLT5fZmlsbC0+Z2V0SGFzaENvZGUoKQogICAgCQkuICR0aGlzLT5fZm9udC0+Z2V0SGFzaENvZGUoKQogICAgCQkuICR0aGlzLT5fYm9yZGVycy0+Z2V0SGFzaENvZGUoKQogICAgCQkuICR0aGlzLT5fYWxpZ25tZW50LT5nZXRIYXNoQ29kZSgpCiAgICAJCS4gJHRoaXMtPl9udW1iZXJGb3JtYXQtPmdldEhhc2hDb2RlKCkKICAgIAkJLiAkaGFzaENvbmRpdGlvbmFscwogICAgCQkuICR0aGlzLT5fcHJvdGVjdGlvbi0+Z2V0SGFzaENvZGUoKQogICAgCQkuIF9fQ0xBU1NfXwogICAgCSk7CiAgICB9CgoJLyoqCgkgKiBHZXQgb3duIGluZGV4IGluIHN0eWxlIGNvbGxlY3Rpb24KCSAqCgkgKiBAcmV0dXJuIGludAoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0SW5kZXgoKQoJewoJCXJldHVybiAkdGhpcy0+X2luZGV4OwoJfQoKCS8qKgoJICogU2V0IG93biBpbmRleCBpbiBzdHlsZSBjb2xsZWN0aW9uCgkgKgoJICogQHBhcmFtIGludCAkcFZhbHVlCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBzZXRJbmRleCgkcFZhbHVlKQoJewoJCSR0aGlzLT5faW5kZXggPSAkcFZhbHVlOwoJfQoKCS8qKgoJICogSW1wbGVtZW50IFBIUCBfX2Nsb25lIHRvIGNyZWF0ZSBhIGRlZXAgY2xvbmUsIG5vdCBqdXN0IGEgc2hhbGxvdyBjb3B5LgoJICovCglwdWJsaWMgZnVuY3Rpb24gX19jbG9uZSgpIHsKCQkkdmFycyA9IGdldF9vYmplY3RfdmFycygkdGhpcyk7CgkJZm9yZWFjaCAoJHZhcnMgYXMgJGtleSA9PiAkdmFsdWUpIHsKCQkJaWYgKChpc19vYmplY3QoJHZhbHVlKSkgJiYgKCRrZXkgIT0gJ19wYXJlbnQnKSkgewoJCQkJJHRoaXMtPiRrZXkgPSBjbG9uZSAkdmFsdWU7CgkJCX0gZWxzZSB7CgkJCQkkdGhpcy0+JGtleSA9ICR2YWx1ZTsKCQkJfQoJCX0KCX0KfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Style/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Style/Alignment.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIFBIUEV4Y2VsCiAqCiAqIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICoKICogQGNhdGVnb3J5ICAgUEhQRXhjZWwKICogQHBhY2thZ2UJUEhQRXhjZWxfU3R5bGUKICogQGNvcHlyaWdodCAgQ29weXJpZ2h0IChjKSAyMDA2IC0gMjAxMiBQSFBFeGNlbCAoaHR0cDovL3d3dy5jb2RlcGxleC5jb20vUEhQRXhjZWwpCiAqIEBsaWNlbnNlCWh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9vbGQtbGljZW5zZXMvbGdwbC0yLjEudHh0CUxHUEwKICogQHZlcnNpb24JMS43LjcsIDIwMTItMDUtMTkKICovCgoKLyoqCiAqIFBIUEV4Y2VsX1N0eWxlX0FsaWdubWVudAogKgogKiBAY2F0ZWdvcnkgICBQSFBFeGNlbAogKiBAcGFja2FnZQlQSFBFeGNlbF9TdHlsZQogKiBAY29weXJpZ2h0ICBDb3B5cmlnaHQgKGMpIDIwMDYgLSAyMDEyIFBIUEV4Y2VsIChodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9QSFBFeGNlbCkKICovCmNsYXNzIFBIUEV4Y2VsX1N0eWxlX0FsaWdubWVudCBpbXBsZW1lbnRzIFBIUEV4Y2VsX0lDb21wYXJhYmxlCnsKCS8qIEhvcml6b250YWwgYWxpZ25tZW50IHN0eWxlcyAqLwoJY29uc3QgSE9SSVpPTlRBTF9HRU5FUkFMCQkJCT0gJ2dlbmVyYWwnOwoJY29uc3QgSE9SSVpPTlRBTF9MRUZUCQkJCQk9ICdsZWZ0JzsKCWNvbnN0IEhPUklaT05UQUxfUklHSFQJCQkJCT0gJ3JpZ2h0JzsKCWNvbnN0IEhPUklaT05UQUxfQ0VOVEVSCQkJCQk9ICdjZW50ZXInOwoJY29uc3QgSE9SSVpPTlRBTF9DRU5URVJfQ09OVElOVU9VUwkJPSAnY2VudGVyQ29udGludW91cyc7Cgljb25zdCBIT1JJWk9OVEFMX0pVU1RJRlkJCQkJPSAnanVzdGlmeSc7CgoJLyogVmVydGljYWwgYWxpZ25tZW50IHN0eWxlcyAqLwoJY29uc3QgVkVSVElDQUxfQk9UVE9NCQkJCQk9ICdib3R0b20nOwoJY29uc3QgVkVSVElDQUxfVE9QCQkJCQkJPSAndG9wJzsKCWNvbnN0IFZFUlRJQ0FMX0NFTlRFUgkJCQkJPSAnY2VudGVyJzsKCWNvbnN0IFZFUlRJQ0FMX0pVU1RJRlkJCQkJCT0gJ2p1c3RpZnknOwoKCS8qKgoJICogSG9yaXpvbnRhbAoJICoKCSAqIEB2YXIgc3RyaW5nCgkgKi8KCXByaXZhdGUgJF9ob3Jpem9udGFsCT0gUEhQRXhjZWxfU3R5bGVfQWxpZ25tZW50OjpIT1JJWk9OVEFMX0dFTkVSQUw7CgoJLyoqCgkgKiBWZXJ0aWNhbAoJICoKCSAqIEB2YXIgc3RyaW5nCgkgKi8KCXByaXZhdGUgJF92ZXJ0aWNhbAkJPSBQSFBFeGNlbF9TdHlsZV9BbGlnbm1lbnQ6OlZFUlRJQ0FMX0JPVFRPTTsKCgkvKioKCSAqIFRleHQgcm90YXRpb24KCSAqCgkgKiBAdmFyIGludAoJICovCglwcml2YXRlICRfdGV4dFJvdGF0aW9uCT0gMDsKCgkvKioKCSAqIFdyYXAgdGV4dAoJICoKCSAqIEB2YXIgYm9vbGVhbgoJICovCglwcml2YXRlICRfd3JhcFRleHQJCT0gZmFsc2U7CgoJLyoqCgkgKiBTaHJpbmsgdG8gZml0CgkgKgoJICogQHZhciBib29sZWFuCgkgKi8KCXByaXZhdGUgJF9zaHJpbmtUb0ZpdAk9IGZhbHNlOwoKCS8qKgoJICogSW5kZW50IC0gb25seSBwb3NzaWJsZSB3aXRoIGhvcml6b250YWwgYWxpZ25tZW50IGxlZnQgYW5kIHJpZ2h0CgkgKgoJICogQHZhciBpbnQKCSAqLwoJcHJpdmF0ZSAkX2luZGVudAkJPSAwOwoKCS8qKgoJICogUGFyZW50IEJvcmRlcnMKCSAqCgkgKiBAdmFyIF9wYXJlbnRQcm9wZXJ0eU5hbWUgc3RyaW5nCgkgKi8KCXByaXZhdGUgJF9wYXJlbnRQcm9wZXJ0eU5hbWU7CgoJLyoqCgkgKiBTdXBlcnZpc29yPwoJICoKCSAqIEB2YXIgYm9vbGVhbgoJICovCglwcml2YXRlICRfaXNTdXBlcnZpc29yOwoKCS8qKgoJICogUGFyZW50LiBPbmx5IHVzZWQgZm9yIHN1cGVydmlzb3IKCSAqCgkgKiBAdmFyIFBIUEV4Y2VsX1N0eWxlCgkgKi8KCXByaXZhdGUgJF9wYXJlbnQ7CgoJLyoqCgkgKiBDcmVhdGUgYSBuZXcgUEhQRXhjZWxfU3R5bGVfQWxpZ25tZW50CgkgKgoJICogQHBhcmFtCWJvb2xlYW4JJGlzU3VwZXJ2aXNvcglGbGFnIGluZGljYXRpbmcgaWYgdGhpcyBpcyBhIHN1cGVydmlzb3Igb3Igbm90CgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkaXNTdXBlcnZpc29yID0gZmFsc2UpCgl7CgkJLy8gU3VwZXJ2aXNvcj8KCQkkdGhpcy0+X2lzU3VwZXJ2aXNvciA9ICRpc1N1cGVydmlzb3I7Cgl9CgoJLyoqCgkgKiBCaW5kIHBhcmVudC4gT25seSB1c2VkIGZvciBzdXBlcnZpc29yCgkgKgoJICogQHBhcmFtIFBIUEV4Y2VsICRwYXJlbnQKCSAqIEByZXR1cm4gUEhQRXhjZWxfU3R5bGVfQWxpZ25tZW50CgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBiaW5kUGFyZW50KCRwYXJlbnQpCgl7CgkJJHRoaXMtPl9wYXJlbnQgPSAkcGFyZW50OwoJCXJldHVybiAkdGhpczsKCX0KCgkvKioKCSAqIElzIHRoaXMgYSBzdXBlcnZpc29yIG9yIGEgcmVhbCBzdHlsZSBjb21wb25lbnQ/CgkgKgoJICogQHJldHVybiBib29sZWFuCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRJc1N1cGVydmlzb3IoKQoJewoJCXJldHVybiAkdGhpcy0+X2lzU3VwZXJ2aXNvcjsKCX0KCgkvKioKCSAqIEdldCB0aGUgc2hhcmVkIHN0eWxlIGNvbXBvbmVudCBmb3IgdGhlIGN1cnJlbnRseSBhY3RpdmUgY2VsbCBpbiBjdXJyZW50bHkgYWN0aXZlIHNoZWV0LgoJICogT25seSB1c2VkIGZvciBzdHlsZSBzdXBlcnZpc29yCgkgKgoJICogQHJldHVybiBQSFBFeGNlbF9TdHlsZV9BbGlnbm1lbnQKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldFNoYXJlZENvbXBvbmVudCgpCgl7CgkJcmV0dXJuICR0aGlzLT5fcGFyZW50LT5nZXRTaGFyZWRDb21wb25lbnQoKS0+Z2V0QWxpZ25tZW50KCk7Cgl9CgoJLyoqCgkgKiBHZXQgdGhlIGN1cnJlbnRseSBhY3RpdmUgc2hlZXQuIE9ubHkgdXNlZCBmb3Igc3VwZXJ2aXNvcgoJICoKCSAqIEByZXR1cm4gUEhQRXhjZWxfV29ya3NoZWV0CgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRBY3RpdmVTaGVldCgpCgl7CgkJcmV0dXJuICR0aGlzLT5fcGFyZW50LT5nZXRBY3RpdmVTaGVldCgpOwoJfQoKCS8qKgoJICogR2V0IHRoZSBjdXJyZW50bHkgYWN0aXZlIGNlbGwgY29vcmRpbmF0ZSBpbiBjdXJyZW50bHkgYWN0aXZlIHNoZWV0LgoJICogT25seSB1c2VkIGZvciBzdXBlcnZpc29yCgkgKgoJICogQHJldHVybiBzdHJpbmcgRS5nLiAnQTEnCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRTZWxlY3RlZENlbGxzKCkKCXsKCQlyZXR1cm4gJHRoaXMtPmdldEFjdGl2ZVNoZWV0KCktPmdldFNlbGVjdGVkQ2VsbHMoKTsKCX0KCgkvKioKCSAqIEdldCB0aGUgY3VycmVudGx5IGFjdGl2ZSBjZWxsIGNvb3JkaW5hdGUgaW4gY3VycmVudGx5IGFjdGl2ZSBzaGVldC4KCSAqIE9ubHkgdXNlZCBmb3Igc3VwZXJ2aXNvcgoJICoKCSAqIEByZXR1cm4gc3RyaW5nIEUuZy4gJ0ExJwoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0QWN0aXZlQ2VsbCgpCgl7CgkJcmV0dXJuICR0aGlzLT5nZXRBY3RpdmVTaGVldCgpLT5nZXRBY3RpdmVDZWxsKCk7Cgl9CgoJLyoqCgkgKiBCdWlsZCBzdHlsZSBhcnJheSBmcm9tIHN1YmNvbXBvbmVudHMKCSAqCgkgKiBAcGFyYW0gYXJyYXkgJGFycmF5CgkgKiBAcmV0dXJuIGFycmF5CgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRTdHlsZUFycmF5KCRhcnJheSkKCXsKCQlyZXR1cm4gYXJyYXkoJ2FsaWdubWVudCcgPT4gJGFycmF5KTsKCX0KCgkvKioKCSAqIEFwcGx5IHN0eWxlcyBmcm9tIGFycmF5CgkgKgoJICogPGNvZGU+CgkgKiAkb2JqUEhQRXhjZWwtPmdldEFjdGl2ZVNoZWV0KCktPmdldFN0eWxlKCdCMicpLT5nZXRBbGlnbm1lbnQoKS0+YXBwbHlGcm9tQXJyYXkoCgkgKgkJYXJyYXkoCgkgKgkJCSdob3Jpem9udGFsJyA9PiBQSFBFeGNlbF9TdHlsZV9BbGlnbm1lbnQ6OkhPUklaT05UQUxfQ0VOVEVSLAoJICoJCQkndmVydGljYWwnICAgPT4gUEhQRXhjZWxfU3R5bGVfQWxpZ25tZW50OjpWRVJUSUNBTF9DRU5URVIsCgkgKgkJCSdyb3RhdGlvbicgICA9PiAwLAoJICoJCQknd3JhcCcJICAgPT4gdHJ1ZQoJICoJCSkKCSAqICk7CgkgKiA8L2NvZGU+CgkgKgoJICogQHBhcmFtCWFycmF5CSRwU3R5bGVzCUFycmF5IGNvbnRhaW5pbmcgc3R5bGUgaW5mb3JtYXRpb24KCSAqIEB0aHJvd3MJRXhjZXB0aW9uCgkgKiBAcmV0dXJuIFBIUEV4Y2VsX1N0eWxlX0FsaWdubWVudAoJICovCglwdWJsaWMgZnVuY3Rpb24gYXBwbHlGcm9tQXJyYXkoJHBTdHlsZXMgPSBudWxsKSB7CgkJaWYgKGlzX2FycmF5KCRwU3R5bGVzKSkgewoJCQlpZiAoJHRoaXMtPl9pc1N1cGVydmlzb3IpIHsKCQkJCSR0aGlzLT5nZXRBY3RpdmVTaGVldCgpLT5nZXRTdHlsZSgkdGhpcy0+Z2V0U2VsZWN0ZWRDZWxscygpKS0+YXBwbHlGcm9tQXJyYXkoJHRoaXMtPmdldFN0eWxlQXJyYXkoJHBTdHlsZXMpKTsKCQkJfSBlbHNlIHsKCQkJCWlmIChhcnJheV9rZXlfZXhpc3RzKCdob3Jpem9udGFsJywgJHBTdHlsZXMpKSB7CgkJCQkJJHRoaXMtPnNldEhvcml6b250YWwoJHBTdHlsZXNbJ2hvcml6b250YWwnXSk7CgkJCQl9CgkJCQlpZiAoYXJyYXlfa2V5X2V4aXN0cygndmVydGljYWwnLCAkcFN0eWxlcykpIHsKCQkJCQkkdGhpcy0+c2V0VmVydGljYWwoJHBTdHlsZXNbJ3ZlcnRpY2FsJ10pOwoJCQkJfQoJCQkJaWYgKGFycmF5X2tleV9leGlzdHMoJ3JvdGF0aW9uJywgJHBTdHlsZXMpKSB7CgkJCQkJJHRoaXMtPnNldFRleHRSb3RhdGlvbigkcFN0eWxlc1sncm90YXRpb24nXSk7CgkJCQl9CgkJCQlpZiAoYXJyYXlfa2V5X2V4aXN0cygnd3JhcCcsICRwU3R5bGVzKSkgewoJCQkJCSR0aGlzLT5zZXRXcmFwVGV4dCgkcFN0eWxlc1snd3JhcCddKTsKCQkJCX0KCQkJCWlmIChhcnJheV9rZXlfZXhpc3RzKCdzaHJpbmtUb0ZpdCcsICRwU3R5bGVzKSkgewoJCQkJCSR0aGlzLT5zZXRTaHJpbmtUb0ZpdCgkcFN0eWxlc1snc2hyaW5rVG9GaXQnXSk7CgkJCQl9CgkJCQlpZiAoYXJyYXlfa2V5X2V4aXN0cygnaW5kZW50JywgJHBTdHlsZXMpKSB7CgkJCQkJJHRoaXMtPnNldEluZGVudCgkcFN0eWxlc1snaW5kZW50J10pOwoJCQkJfQoJCQl9CgkJfSBlbHNlIHsKCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbigiSW52YWxpZCBzdHlsZSBhcnJheSBwYXNzZWQuIik7CgkJfQoJCXJldHVybiAkdGhpczsKCX0KCgkvKioKCSAqIEdldCBIb3Jpem9udGFsCgkgKgoJICogQHJldHVybiBzdHJpbmcKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldEhvcml6b250YWwoKSB7CgkJaWYgKCR0aGlzLT5faXNTdXBlcnZpc29yKSB7CgkJCXJldHVybiAkdGhpcy0+Z2V0U2hhcmVkQ29tcG9uZW50KCktPmdldEhvcml6b250YWwoKTsKCQl9CgkJcmV0dXJuICR0aGlzLT5faG9yaXpvbnRhbDsKCX0KCgkvKioKCSAqIFNldCBIb3Jpem9udGFsCgkgKgoJICogQHBhcmFtIHN0cmluZyAkcFZhbHVlCgkgKiBAcmV0dXJuIFBIUEV4Y2VsX1N0eWxlX0FsaWdubWVudAoJICovCglwdWJsaWMgZnVuY3Rpb24gc2V0SG9yaXpvbnRhbCgkcFZhbHVlID0gUEhQRXhjZWxfU3R5bGVfQWxpZ25tZW50OjpIT1JJWk9OVEFMX0dFTkVSQUwpIHsKCQlpZiAoJHBWYWx1ZSA9PSAnJykgewoJCQkkcFZhbHVlID0gUEhQRXhjZWxfU3R5bGVfQWxpZ25tZW50OjpIT1JJWk9OVEFMX0dFTkVSQUw7CgkJfQoKCQlpZiAoJHRoaXMtPl9pc1N1cGVydmlzb3IpIHsKCQkJJHN0eWxlQXJyYXkgPSAkdGhpcy0+Z2V0U3R5bGVBcnJheShhcnJheSgnaG9yaXpvbnRhbCcgPT4gJHBWYWx1ZSkpOwoJCQkkdGhpcy0+Z2V0QWN0aXZlU2hlZXQoKS0+Z2V0U3R5bGUoJHRoaXMtPmdldFNlbGVjdGVkQ2VsbHMoKSktPmFwcGx5RnJvbUFycmF5KCRzdHlsZUFycmF5KTsKCQl9CgkJZWxzZSB7CgkJCSR0aGlzLT5faG9yaXpvbnRhbCA9ICRwVmFsdWU7CgkJfQoJCXJldHVybiAkdGhpczsKCX0KCgkvKioKCSAqIEdldCBWZXJ0aWNhbAoJICoKCSAqIEByZXR1cm4gc3RyaW5nCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRWZXJ0aWNhbCgpIHsKCQlpZiAoJHRoaXMtPl9pc1N1cGVydmlzb3IpIHsKCQkJcmV0dXJuICR0aGlzLT5nZXRTaGFyZWRDb21wb25lbnQoKS0+Z2V0VmVydGljYWwoKTsKCQl9CgkJcmV0dXJuICR0aGlzLT5fdmVydGljYWw7Cgl9CgoJLyoqCgkgKiBTZXQgVmVydGljYWwKCSAqCgkgKiBAcGFyYW0gc3RyaW5nICRwVmFsdWUKCSAqIEByZXR1cm4gUEhQRXhjZWxfU3R5bGVfQWxpZ25tZW50CgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBzZXRWZXJ0aWNhbCgkcFZhbHVlID0gUEhQRXhjZWxfU3R5bGVfQWxpZ25tZW50OjpWRVJUSUNBTF9CT1RUT00pIHsKCQlpZiAoJHBWYWx1ZSA9PSAnJykgewoJCQkkcFZhbHVlID0gUEhQRXhjZWxfU3R5bGVfQWxpZ25tZW50OjpWRVJUSUNBTF9CT1RUT007CgkJfQoKCQlpZiAoJHRoaXMtPl9pc1N1cGVydmlzb3IpIHsKCQkJJHN0eWxlQXJyYXkgPSAkdGhpcy0+Z2V0U3R5bGVBcnJheShhcnJheSgndmVydGljYWwnID0+ICRwVmFsdWUpKTsKCQkJJHRoaXMtPmdldEFjdGl2ZVNoZWV0KCktPmdldFN0eWxlKCR0aGlzLT5nZXRTZWxlY3RlZENlbGxzKCkpLT5hcHBseUZyb21BcnJheSgkc3R5bGVBcnJheSk7CgkJfSBlbHNlIHsKCQkJJHRoaXMtPl92ZXJ0aWNhbCA9ICRwVmFsdWU7CgkJfQoJCXJldHVybiAkdGhpczsKCX0KCgkvKioKCSAqIEdldCBUZXh0Um90YXRpb24KCSAqCgkgKiBAcmV0dXJuIGludAoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0VGV4dFJvdGF0aW9uKCkgewoJCWlmICgkdGhpcy0+X2lzU3VwZXJ2aXNvcikgewoJCQlyZXR1cm4gJHRoaXMtPmdldFNoYXJlZENvbXBvbmVudCgpLT5nZXRUZXh0Um90YXRpb24oKTsKCQl9CgkJcmV0dXJuICR0aGlzLT5fdGV4dFJvdGF0aW9uOwoJfQoKCS8qKgoJICogU2V0IFRleHRSb3RhdGlvbgoJICoKCSAqIEBwYXJhbSBpbnQgJHBWYWx1ZQoJICogQHRocm93cyBFeGNlcHRpb24KCSAqIEByZXR1cm4gUEhQRXhjZWxfU3R5bGVfQWxpZ25tZW50CgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBzZXRUZXh0Um90YXRpb24oJHBWYWx1ZSA9IDApIHsKCQkvLyBFeGNlbDIwMDcgdmFsdWUgMjU1ID0+IFBIUEV4Y2VsIHZhbHVlIC0xNjUKCQlpZiAoJHBWYWx1ZSA9PSAyNTUpIHsKCQkJJHBWYWx1ZSA9IC0xNjU7CgkJfQoKCQkvLyBTZXQgcm90YXRpb24KCQlpZiAoICgkcFZhbHVlID49IC05MCAmJiAkcFZhbHVlIDw9IDkwKSB8fCAkcFZhbHVlID09IC0xNjUgKSB7CgkJCWlmICgkdGhpcy0+X2lzU3VwZXJ2aXNvcikgewoJCQkJJHN0eWxlQXJyYXkgPSAkdGhpcy0+Z2V0U3R5bGVBcnJheShhcnJheSgncm90YXRpb24nID0+ICRwVmFsdWUpKTsKCQkJCSR0aGlzLT5nZXRBY3RpdmVTaGVldCgpLT5nZXRTdHlsZSgkdGhpcy0+Z2V0U2VsZWN0ZWRDZWxscygpKS0+YXBwbHlGcm9tQXJyYXkoJHN0eWxlQXJyYXkpOwoJCQl9IGVsc2UgewoJCQkJJHRoaXMtPl90ZXh0Um90YXRpb24gPSAkcFZhbHVlOwoJCQl9CgkJfSBlbHNlIHsKCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbigiVGV4dCByb3RhdGlvbiBzaG91bGQgYmUgYSB2YWx1ZSBiZXR3ZWVuIC05MCBhbmQgOTAuIik7CgkJfQoKCQlyZXR1cm4gJHRoaXM7Cgl9CgoJLyoqCgkgKiBHZXQgV3JhcCBUZXh0CgkgKgoJICogQHJldHVybiBib29sZWFuCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRXcmFwVGV4dCgpIHsKCQlpZiAoJHRoaXMtPl9pc1N1cGVydmlzb3IpIHsKCQkJcmV0dXJuICR0aGlzLT5nZXRTaGFyZWRDb21wb25lbnQoKS0+Z2V0V3JhcFRleHQoKTsKCQl9CgkJcmV0dXJuICR0aGlzLT5fd3JhcFRleHQ7Cgl9CgoJLyoqCgkgKiBTZXQgV3JhcCBUZXh0CgkgKgoJICogQHBhcmFtIGJvb2xlYW4gJHBWYWx1ZQoJICogQHJldHVybiBQSFBFeGNlbF9TdHlsZV9BbGlnbm1lbnQKCSAqLwoJcHVibGljIGZ1bmN0aW9uIHNldFdyYXBUZXh0KCRwVmFsdWUgPSBmYWxzZSkgewoJCWlmICgkcFZhbHVlID09ICcnKSB7CgkJCSRwVmFsdWUgPSBmYWxzZTsKCQl9CgkJaWYgKCR0aGlzLT5faXNTdXBlcnZpc29yKSB7CgkJCSRzdHlsZUFycmF5ID0gJHRoaXMtPmdldFN0eWxlQXJyYXkoYXJyYXkoJ3dyYXAnID0+ICRwVmFsdWUpKTsKCQkJJHRoaXMtPmdldEFjdGl2ZVNoZWV0KCktPmdldFN0eWxlKCR0aGlzLT5nZXRTZWxlY3RlZENlbGxzKCkpLT5hcHBseUZyb21BcnJheSgkc3R5bGVBcnJheSk7CgkJfSBlbHNlIHsKCQkJJHRoaXMtPl93cmFwVGV4dCA9ICRwVmFsdWU7CgkJfQoJCXJldHVybiAkdGhpczsKCX0KCgkvKioKCSAqIEdldCBTaHJpbmsgdG8gZml0CgkgKgoJICogQHJldHVybiBib29sZWFuCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRTaHJpbmtUb0ZpdCgpIHsKCQlpZiAoJHRoaXMtPl9pc1N1cGVydmlzb3IpIHsKCQkJcmV0dXJuICR0aGlzLT5nZXRTaGFyZWRDb21wb25lbnQoKS0+Z2V0U2hyaW5rVG9GaXQoKTsKCQl9CgkJcmV0dXJuICR0aGlzLT5fc2hyaW5rVG9GaXQ7Cgl9CgoJLyoqCgkgKiBTZXQgU2hyaW5rIHRvIGZpdAoJICoKCSAqIEBwYXJhbSBib29sZWFuICRwVmFsdWUKCSAqIEByZXR1cm4gUEhQRXhjZWxfU3R5bGVfQWxpZ25tZW50CgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBzZXRTaHJpbmtUb0ZpdCgkcFZhbHVlID0gZmFsc2UpIHsKCQlpZiAoJHBWYWx1ZSA9PSAnJykgewoJCQkkcFZhbHVlID0gZmFsc2U7CgkJfQoJCWlmICgkdGhpcy0+X2lzU3VwZXJ2aXNvcikgewoJCQkkc3R5bGVBcnJheSA9ICR0aGlzLT5nZXRTdHlsZUFycmF5KGFycmF5KCdzaHJpbmtUb0ZpdCcgPT4gJHBWYWx1ZSkpOwoJCQkkdGhpcy0+Z2V0QWN0aXZlU2hlZXQoKS0+Z2V0U3R5bGUoJHRoaXMtPmdldFNlbGVjdGVkQ2VsbHMoKSktPmFwcGx5RnJvbUFycmF5KCRzdHlsZUFycmF5KTsKCQl9IGVsc2UgewoJCQkkdGhpcy0+X3Nocmlua1RvRml0ID0gJHBWYWx1ZTsKCQl9CgkJcmV0dXJuICR0aGlzOwoJfQoKCS8qKgoJICogR2V0IGluZGVudAoJICoKCSAqIEByZXR1cm4gaW50CgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRJbmRlbnQoKSB7CgkJaWYgKCR0aGlzLT5faXNTdXBlcnZpc29yKSB7CgkJCXJldHVybiAkdGhpcy0+Z2V0U2hhcmVkQ29tcG9uZW50KCktPmdldEluZGVudCgpOwoJCX0KCQlyZXR1cm4gJHRoaXMtPl9pbmRlbnQ7Cgl9CgoJLyoqCgkgKiBTZXQgaW5kZW50CgkgKgoJICogQHBhcmFtIGludCAkcFZhbHVlCgkgKiBAcmV0dXJuIFBIUEV4Y2VsX1N0eWxlX0FsaWdubWVudAoJICovCglwdWJsaWMgZnVuY3Rpb24gc2V0SW5kZW50KCRwVmFsdWUgPSAwKSB7CgkJaWYgKCRwVmFsdWUgPiAwKSB7CgkJCWlmICgkdGhpcy0+Z2V0SG9yaXpvbnRhbCgpICE9IHNlbGY6OkhPUklaT05UQUxfR0VORVJBTCAmJiAkdGhpcy0+Z2V0SG9yaXpvbnRhbCgpICE9IHNlbGY6OkhPUklaT05UQUxfTEVGVCAmJiAkdGhpcy0+Z2V0SG9yaXpvbnRhbCgpICE9IHNlbGY6OkhPUklaT05UQUxfUklHSFQpIHsKCQkJCSRwVmFsdWUgPSAwOyAvLyBpbmRlbnQgbm90IHN1cHBvcnRlZAoJCQl9CgkJfQoJCWlmICgkdGhpcy0+X2lzU3VwZXJ2aXNvcikgewoJCQkkc3R5bGVBcnJheSA9ICR0aGlzLT5nZXRTdHlsZUFycmF5KGFycmF5KCdpbmRlbnQnID0+ICRwVmFsdWUpKTsKCQkJJHRoaXMtPmdldEFjdGl2ZVNoZWV0KCktPmdldFN0eWxlKCR0aGlzLT5nZXRTZWxlY3RlZENlbGxzKCkpLT5hcHBseUZyb21BcnJheSgkc3R5bGVBcnJheSk7CgkJfSBlbHNlIHsKCQkJJHRoaXMtPl9pbmRlbnQgPSAkcFZhbHVlOwoJCX0KCQlyZXR1cm4gJHRoaXM7Cgl9CgoJLyoqCgkgKiBHZXQgaGFzaCBjb2RlCgkgKgoJICogQHJldHVybiBzdHJpbmcJSGFzaCBjb2RlCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRIYXNoQ29kZSgpIHsKCQlpZiAoJHRoaXMtPl9pc1N1cGVydmlzb3IpIHsKCQkJcmV0dXJuICR0aGlzLT5nZXRTaGFyZWRDb21wb25lbnQoKS0+Z2V0SGFzaENvZGUoKTsKCQl9CgkJcmV0dXJuIG1kNSgKCQkJICAkdGhpcy0+X2hvcml6b250YWwKCQkJLiAkdGhpcy0+X3ZlcnRpY2FsCgkJCS4gJHRoaXMtPl90ZXh0Um90YXRpb24KCQkJLiAoJHRoaXMtPl93cmFwVGV4dCA/ICd0JyA6ICdmJykKCQkJLiAoJHRoaXMtPl9zaHJpbmtUb0ZpdCA/ICd0JyA6ICdmJykKCQkJLiAkdGhpcy0+X2luZGVudAoJCQkuIF9fQ0xBU1NfXwoJCSk7Cgl9CgoJLyoqCgkgKiBJbXBsZW1lbnQgUEhQIF9fY2xvbmUgdG8gY3JlYXRlIGEgZGVlcCBjbG9uZSwgbm90IGp1c3QgYSBzaGFsbG93IGNvcHkuCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBfX2Nsb25lKCkgewoJCSR2YXJzID0gZ2V0X29iamVjdF92YXJzKCR0aGlzKTsKCQlmb3JlYWNoICgkdmFycyBhcyAka2V5ID0+ICR2YWx1ZSkgewoJCQlpZiAoKGlzX29iamVjdCgkdmFsdWUpKSAmJiAoJGtleSAhPSAnX3BhcmVudCcpKSB7CgkJCQkkdGhpcy0+JGtleSA9IGNsb25lICR2YWx1ZTsKCQkJfSBlbHNlIHsKCQkJCSR0aGlzLT4ka2V5ID0gJHZhbHVlOwoJCQl9CgkJfQoJfQp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Style/Border.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIFBIUEV4Y2VsCiAqCiAqIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICoKICogQGNhdGVnb3J5ICAgUEhQRXhjZWwKICogQHBhY2thZ2UJUEhQRXhjZWxfU3R5bGUKICogQGNvcHlyaWdodCAgQ29weXJpZ2h0IChjKSAyMDA2IC0gMjAxMiBQSFBFeGNlbCAoaHR0cDovL3d3dy5jb2RlcGxleC5jb20vUEhQRXhjZWwpCiAqIEBsaWNlbnNlCWh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9vbGQtbGljZW5zZXMvbGdwbC0yLjEudHh0CUxHUEwKICogQHZlcnNpb24JMS43LjcsIDIwMTItMDUtMTkKICovCgoKLyoqCiAqIFBIUEV4Y2VsX1N0eWxlX0JvcmRlcgogKgogKiBAY2F0ZWdvcnkgICBQSFBFeGNlbAogKiBAcGFja2FnZQlQSFBFeGNlbF9TdHlsZQogKiBAY29weXJpZ2h0ICBDb3B5cmlnaHQgKGMpIDIwMDYgLSAyMDEyIFBIUEV4Y2VsIChodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9QSFBFeGNlbCkKICovCmNsYXNzIFBIUEV4Y2VsX1N0eWxlX0JvcmRlciBpbXBsZW1lbnRzIFBIUEV4Y2VsX0lDb21wYXJhYmxlCnsKCS8qIEJvcmRlciBzdHlsZSAqLwoJY29uc3QgQk9SREVSX05PTkUJCQkJPSAnbm9uZSc7Cgljb25zdCBCT1JERVJfREFTSERPVAkJCT0gJ2Rhc2hEb3QnOwoJY29uc3QgQk9SREVSX0RBU0hET1RET1QJCQk9ICdkYXNoRG90RG90JzsKCWNvbnN0IEJPUkRFUl9EQVNIRUQJCQkJPSAnZGFzaGVkJzsKCWNvbnN0IEJPUkRFUl9ET1RURUQJCQkJPSAnZG90dGVkJzsKCWNvbnN0IEJPUkRFUl9ET1VCTEUJCQkJPSAnZG91YmxlJzsKCWNvbnN0IEJPUkRFUl9IQUlSCQkJCT0gJ2hhaXInOwoJY29uc3QgQk9SREVSX01FRElVTQkJCQk9ICdtZWRpdW0nOwoJY29uc3QgQk9SREVSX01FRElVTURBU0hET1QJCT0gJ21lZGl1bURhc2hEb3QnOwoJY29uc3QgQk9SREVSX01FRElVTURBU0hET1RET1QJPSAnbWVkaXVtRGFzaERvdERvdCc7Cgljb25zdCBCT1JERVJfTUVESVVNREFTSEVECQk9ICdtZWRpdW1EYXNoZWQnOwoJY29uc3QgQk9SREVSX1NMQU5UREFTSERPVAkJPSAnc2xhbnREYXNoRG90JzsKCWNvbnN0IEJPUkRFUl9USElDSwkJCQk9ICd0aGljayc7Cgljb25zdCBCT1JERVJfVEhJTgkJCQk9ICd0aGluJzsKCgkvKioKCSAqIEJvcmRlciBzdHlsZQoJICoKCSAqIEB2YXIgc3RyaW5nCgkgKi8KCXByaXZhdGUgJF9ib3JkZXJTdHlsZQk9IFBIUEV4Y2VsX1N0eWxlX0JvcmRlcjo6Qk9SREVSX05PTkU7CgoJLyoqCgkgKiBCb3JkZXIgY29sb3IKCSAqCgkgKiBAdmFyIFBIUEV4Y2VsX1N0eWxlX0NvbG9yCgkgKi8KCXByaXZhdGUgJF9jb2xvcjsKCgkvKioKCSAqIFN1cGVydmlzb3I/CgkgKgoJICogQHZhciBib29sZWFuCgkgKi8KCXByaXZhdGUgJF9pc1N1cGVydmlzb3I7CgoJLyoqCgkgKiBQYXJlbnQuIE9ubHkgdXNlZCBmb3Igc3VwZXJ2aXNvcgoJICoKCSAqIEB2YXIgUEhQRXhjZWxfU3R5bGVfQm9yZGVycwoJICovCglwcml2YXRlICRfcGFyZW50OwoKCS8qKgoJICogUGFyZW50IHByb3BlcnR5IG5hbWUKCSAqCgkgKiBAdmFyIHN0cmluZwoJICovCglwcml2YXRlICRfcGFyZW50UHJvcGVydHlOYW1lOwoKCS8qKgoJICogQ3JlYXRlIGEgbmV3IFBIUEV4Y2VsX1N0eWxlX0JvcmRlcgoJICoKCSAqIEBwYXJhbQlib29sZWFuCSRpc1N1cGVydmlzb3IJRmxhZyBpbmRpY2F0aW5nIGlmIHRoaXMgaXMgYSBzdXBlcnZpc29yIG9yIG5vdAoJICovCglwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJGlzU3VwZXJ2aXNvciA9IGZhbHNlKQoJewoJCS8vIFN1cGVydmlzb3I/CgkJJHRoaXMtPl9pc1N1cGVydmlzb3IgPSAkaXNTdXBlcnZpc29yOwoKCQkvLyBJbml0aWFsaXNlIHZhbHVlcwoJCSR0aGlzLT5fY29sb3IJCQk9IG5ldyBQSFBFeGNlbF9TdHlsZV9Db2xvcihQSFBFeGNlbF9TdHlsZV9Db2xvcjo6Q09MT1JfQkxBQ0ssICRpc1N1cGVydmlzb3IpOwoKCQkvLyBiaW5kIHBhcmVudCBpZiB3ZSBhcmUgYSBzdXBlcnZpc29yCgkJaWYgKCRpc1N1cGVydmlzb3IpIHsKCQkJJHRoaXMtPl9jb2xvci0+YmluZFBhcmVudCgkdGhpcywgJ19jb2xvcicpOwoJCX0KCX0KCgkvKioKCSAqIEJpbmQgcGFyZW50LiBPbmx5IHVzZWQgZm9yIHN1cGVydmlzb3IKCSAqCgkgKiBAcGFyYW0gUEhQRXhjZWxfU3R5bGVfQm9yZGVycyAkcGFyZW50CgkgKiBAcGFyYW0gc3RyaW5nICRwYXJlbnRQcm9wZXJ0eU5hbWUKCSAqIEByZXR1cm4gUEhQRXhjZWxfU3R5bGVfQm9yZGVyCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBiaW5kUGFyZW50KCRwYXJlbnQsICRwYXJlbnRQcm9wZXJ0eU5hbWUpCgl7CgkJJHRoaXMtPl9wYXJlbnQgPSAkcGFyZW50OwoJCSR0aGlzLT5fcGFyZW50UHJvcGVydHlOYW1lID0gJHBhcmVudFByb3BlcnR5TmFtZTsKCQlyZXR1cm4gJHRoaXM7Cgl9CgoJLyoqCgkgKiBJcyB0aGlzIGEgc3VwZXJ2aXNvciBvciBhIHJlYWwgc3R5bGUgY29tcG9uZW50PwoJICoKCSAqIEByZXR1cm4gYm9vbGVhbgoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0SXNTdXBlcnZpc29yKCkKCXsKCQlyZXR1cm4gJHRoaXMtPl9pc1N1cGVydmlzb3I7Cgl9CgoJLyoqCgkgKiBHZXQgdGhlIHNoYXJlZCBzdHlsZSBjb21wb25lbnQgZm9yIHRoZSBjdXJyZW50bHkgYWN0aXZlIGNlbGwgaW4gY3VycmVudGx5IGFjdGl2ZSBzaGVldC4KCSAqIE9ubHkgdXNlZCBmb3Igc3R5bGUgc3VwZXJ2aXNvcgoJICoKCSAqIEByZXR1cm4gUEhQRXhjZWxfU3R5bGVfQm9yZGVyCgkgKiBAdGhyb3dzIEV4Y2VwdGlvbgoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0U2hhcmVkQ29tcG9uZW50KCkKCXsKCQlzd2l0Y2ggKCR0aGlzLT5fcGFyZW50UHJvcGVydHlOYW1lKSB7CgkJCWNhc2UgJ19hbGxCb3JkZXJzJzoKCQkJY2FzZSAnX2hvcml6b250YWwnOgoJCQljYXNlICdfaW5zaWRlJzoKCQkJY2FzZSAnX291dGxpbmUnOgoJCQljYXNlICdfdmVydGljYWwnOgoJCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbignQ2Fubm90IGdldCBzaGFyZWQgY29tcG9uZW50IGZvciBhIHBzZXVkby1ib3JkZXIuJyk7CgkJCQlicmVhazsKCgkJCWNhc2UgJ19ib3R0b20nOgoJCQkJcmV0dXJuICR0aGlzLT5fcGFyZW50LT5nZXRTaGFyZWRDb21wb25lbnQoKS0+Z2V0Qm90dG9tKCk7CgkJCQlicmVhazsKCgkJCWNhc2UgJ19kaWFnb25hbCc6CgkJCQlyZXR1cm4gJHRoaXMtPl9wYXJlbnQtPmdldFNoYXJlZENvbXBvbmVudCgpLT5nZXREaWFnb25hbCgpOwoJCQkJYnJlYWs7CgoJCQljYXNlICdfbGVmdCc6CgkJCQlyZXR1cm4gJHRoaXMtPl9wYXJlbnQtPmdldFNoYXJlZENvbXBvbmVudCgpLT5nZXRMZWZ0KCk7CgkJCQlicmVhazsKCgkJCWNhc2UgJ19yaWdodCc6CgkJCQlyZXR1cm4gJHRoaXMtPl9wYXJlbnQtPmdldFNoYXJlZENvbXBvbmVudCgpLT5nZXRSaWdodCgpOwoJCQkJYnJlYWs7CgoJCQljYXNlICdfdG9wJzoKCQkJCXJldHVybiAkdGhpcy0+X3BhcmVudC0+Z2V0U2hhcmVkQ29tcG9uZW50KCktPmdldFRvcCgpOwoJCQkJYnJlYWs7CgoJCX0KCX0KCgkvKioKCSAqIEdldCB0aGUgY3VycmVudGx5IGFjdGl2ZSBzaGVldC4gT25seSB1c2VkIGZvciBzdXBlcnZpc29yCgkgKgoJICogQHJldHVybiBQSFBFeGNlbF9Xb3Jrc2hlZXQKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldEFjdGl2ZVNoZWV0KCkKCXsKCQlyZXR1cm4gJHRoaXMtPl9wYXJlbnQtPmdldEFjdGl2ZVNoZWV0KCk7Cgl9CgoJLyoqCgkgKiBHZXQgdGhlIGN1cnJlbnRseSBhY3RpdmUgY2VsbCBjb29yZGluYXRlIGluIGN1cnJlbnRseSBhY3RpdmUgc2hlZXQuCgkgKiBPbmx5IHVzZWQgZm9yIHN1cGVydmlzb3IKCSAqCgkgKiBAcmV0dXJuIHN0cmluZyBFLmcuICdBMScKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldFNlbGVjdGVkQ2VsbHMoKQoJewoJCXJldHVybiAkdGhpcy0+Z2V0QWN0aXZlU2hlZXQoKS0+Z2V0U2VsZWN0ZWRDZWxscygpOwoJfQoKCS8qKgoJICogR2V0IHRoZSBjdXJyZW50bHkgYWN0aXZlIGNlbGwgY29vcmRpbmF0ZSBpbiBjdXJyZW50bHkgYWN0aXZlIHNoZWV0LgoJICogT25seSB1c2VkIGZvciBzdXBlcnZpc29yCgkgKgoJICogQHJldHVybiBzdHJpbmcgRS5nLiAnQTEnCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRBY3RpdmVDZWxsKCkKCXsKCQlyZXR1cm4gJHRoaXMtPmdldEFjdGl2ZVNoZWV0KCktPmdldEFjdGl2ZUNlbGwoKTsKCX0KCgkvKioKCSAqIEJ1aWxkIHN0eWxlIGFycmF5IGZyb20gc3ViY29tcG9uZW50cwoJICoKCSAqIEBwYXJhbSBhcnJheSAkYXJyYXkKCSAqIEByZXR1cm4gYXJyYXkKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldFN0eWxlQXJyYXkoJGFycmF5KQoJewoJCXN3aXRjaCAoJHRoaXMtPl9wYXJlbnRQcm9wZXJ0eU5hbWUpIHsKCQljYXNlICdfYWxsQm9yZGVycyc6CgkJCSRrZXkgPSAnYWxsYm9yZGVycyc7CgkJCWJyZWFrOwoKCQljYXNlICdfYm90dG9tJzoKCQkJJGtleSA9ICdib3R0b20nOwoJCQlicmVhazsKCgkJY2FzZSAnX2RpYWdvbmFsJzoKCQkJJGtleSA9ICdkaWFnb25hbCc7CgkJCWJyZWFrOwoKCQljYXNlICdfaG9yaXpvbnRhbCc6CgkJCSRrZXkgPSAnaG9yaXpvbnRhbCc7CgkJCWJyZWFrOwoKCQljYXNlICdfaW5zaWRlJzoKCQkJJGtleSA9ICdpbnNpZGUnOwoJCQlicmVhazsKCgkJY2FzZSAnX2xlZnQnOgoJCQkka2V5ID0gJ2xlZnQnOwoJCQlicmVhazsKCgkJY2FzZSAnX291dGxpbmUnOgoJCQkka2V5ID0gJ291dGxpbmUnOwoJCQlicmVhazsKCgkJY2FzZSAnX3JpZ2h0JzoKCQkJJGtleSA9ICdyaWdodCc7CgkJCWJyZWFrOwoKCQljYXNlICdfdG9wJzoKCQkJJGtleSA9ICd0b3AnOwoJCQlicmVhazsKCgkJY2FzZSAnX3ZlcnRpY2FsJzoKCQkJJGtleSA9ICd2ZXJ0aWNhbCc7CgkJCWJyZWFrOwoJCX0KCQlyZXR1cm4gJHRoaXMtPl9wYXJlbnQtPmdldFN0eWxlQXJyYXkoYXJyYXkoJGtleSA9PiAkYXJyYXkpKTsKCX0KCgkvKioKCSAqIEFwcGx5IHN0eWxlcyBmcm9tIGFycmF5CgkgKgoJICogPGNvZGU+CgkgKiAkb2JqUEhQRXhjZWwtPmdldEFjdGl2ZVNoZWV0KCktPmdldFN0eWxlKCdCMicpLT5nZXRCb3JkZXJzKCktPmdldFRvcCgpLT5hcHBseUZyb21BcnJheSgKCSAqCQlhcnJheSgKCSAqCQkJJ3N0eWxlJyA9PiBQSFBFeGNlbF9TdHlsZV9Cb3JkZXI6OkJPUkRFUl9EQVNIRE9ULAoJICoJCQknY29sb3InID0+IGFycmF5KAoJICoJCQkJJ3JnYicgPT4gJzgwODA4MCcKCSAqCQkJKQoJICoJCSkKCSAqICk7CgkgKiA8L2NvZGU+CgkgKgoJICogQHBhcmFtCWFycmF5CSRwU3R5bGVzCUFycmF5IGNvbnRhaW5pbmcgc3R5bGUgaW5mb3JtYXRpb24KCSAqIEB0aHJvd3MJRXhjZXB0aW9uCgkgKiBAcmV0dXJuIFBIUEV4Y2VsX1N0eWxlX0JvcmRlcgoJICovCglwdWJsaWMgZnVuY3Rpb24gYXBwbHlGcm9tQXJyYXkoJHBTdHlsZXMgPSBudWxsKSB7CgkJaWYgKGlzX2FycmF5KCRwU3R5bGVzKSkgewoJCQlpZiAoJHRoaXMtPl9pc1N1cGVydmlzb3IpIHsKCQkJCSR0aGlzLT5nZXRBY3RpdmVTaGVldCgpLT5nZXRTdHlsZSgkdGhpcy0+Z2V0U2VsZWN0ZWRDZWxscygpKS0+YXBwbHlGcm9tQXJyYXkoJHRoaXMtPmdldFN0eWxlQXJyYXkoJHBTdHlsZXMpKTsKCQkJfSBlbHNlIHsKCQkJCWlmIChhcnJheV9rZXlfZXhpc3RzKCdzdHlsZScsICRwU3R5bGVzKSkgewoJCQkJCSR0aGlzLT5zZXRCb3JkZXJTdHlsZSgkcFN0eWxlc1snc3R5bGUnXSk7CgkJCQl9CgkJCQlpZiAoYXJyYXlfa2V5X2V4aXN0cygnY29sb3InLCAkcFN0eWxlcykpIHsKCQkJCQkkdGhpcy0+Z2V0Q29sb3IoKS0+YXBwbHlGcm9tQXJyYXkoJHBTdHlsZXNbJ2NvbG9yJ10pOwoJCQkJfQoJCQl9CgkJfSBlbHNlIHsKCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbigiSW52YWxpZCBzdHlsZSBhcnJheSBwYXNzZWQuIik7CgkJfQoJCXJldHVybiAkdGhpczsKCX0KCgkvKioKCSAqIEdldCBCb3JkZXIgc3R5bGUKCSAqCgkgKiBAcmV0dXJuIHN0cmluZwoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0Qm9yZGVyU3R5bGUoKSB7CgkJaWYgKCR0aGlzLT5faXNTdXBlcnZpc29yKSB7CgkJCXJldHVybiAkdGhpcy0+Z2V0U2hhcmVkQ29tcG9uZW50KCktPmdldEJvcmRlclN0eWxlKCk7CgkJfQoJCXJldHVybiAkdGhpcy0+X2JvcmRlclN0eWxlOwoJfQoKCS8qKgoJICogU2V0IEJvcmRlciBzdHlsZQoJICoKCSAqIEBwYXJhbSBzdHJpbmcgJHBWYWx1ZQoJICogQHJldHVybiBQSFBFeGNlbF9TdHlsZV9Cb3JkZXIKCSAqLwoJcHVibGljIGZ1bmN0aW9uIHNldEJvcmRlclN0eWxlKCRwVmFsdWUgPSBQSFBFeGNlbF9TdHlsZV9Cb3JkZXI6OkJPUkRFUl9OT05FKSB7CgoJCWlmICgkcFZhbHVlID09ICcnKSB7CgkJCSRwVmFsdWUgPSBQSFBFeGNlbF9TdHlsZV9Cb3JkZXI6OkJPUkRFUl9OT05FOwoJCX0KCQlpZiAoJHRoaXMtPl9pc1N1cGVydmlzb3IpIHsKCQkJJHN0eWxlQXJyYXkgPSAkdGhpcy0+Z2V0U3R5bGVBcnJheShhcnJheSgnc3R5bGUnID0+ICRwVmFsdWUpKTsKCQkJJHRoaXMtPmdldEFjdGl2ZVNoZWV0KCktPmdldFN0eWxlKCR0aGlzLT5nZXRTZWxlY3RlZENlbGxzKCkpLT5hcHBseUZyb21BcnJheSgkc3R5bGVBcnJheSk7CgkJfSBlbHNlIHsKCQkJJHRoaXMtPl9ib3JkZXJTdHlsZSA9ICRwVmFsdWU7CgkJfQoJCXJldHVybiAkdGhpczsKCX0KCgkvKioKCSAqIEdldCBCb3JkZXIgQ29sb3IKCSAqCgkgKiBAcmV0dXJuIFBIUEV4Y2VsX1N0eWxlX0NvbG9yCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRDb2xvcigpIHsKCQlyZXR1cm4gJHRoaXMtPl9jb2xvcjsKCX0KCgkvKioKCSAqIFNldCBCb3JkZXIgQ29sb3IKCSAqCgkgKiBAcGFyYW0JUEhQRXhjZWxfU3R5bGVfQ29sb3IgJHBWYWx1ZQoJICogQHRocm93cwlFeGNlcHRpb24KCSAqIEByZXR1cm4gUEhQRXhjZWxfU3R5bGVfQm9yZGVyCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBzZXRDb2xvcihQSFBFeGNlbF9TdHlsZV9Db2xvciAkcFZhbHVlID0gbnVsbCkgewoJCS8vIG1ha2Ugc3VyZSBwYXJhbWV0ZXIgaXMgYSByZWFsIGNvbG9yIGFuZCBub3QgYSBzdXBlcnZpc29yCgkJJGNvbG9yID0gJHBWYWx1ZS0+Z2V0SXNTdXBlcnZpc29yKCkgPyAkcFZhbHVlLT5nZXRTaGFyZWRDb21wb25lbnQoKSA6ICRwVmFsdWU7CgoJCWlmICgkdGhpcy0+X2lzU3VwZXJ2aXNvcikgewoJCQkkc3R5bGVBcnJheSA9ICR0aGlzLT5nZXRDb2xvcigpLT5nZXRTdHlsZUFycmF5KGFycmF5KCdhcmdiJyA9PiAkY29sb3ItPmdldEFSR0IoKSkpOwoJCQkkdGhpcy0+Z2V0QWN0aXZlU2hlZXQoKS0+Z2V0U3R5bGUoJHRoaXMtPmdldFNlbGVjdGVkQ2VsbHMoKSktPmFwcGx5RnJvbUFycmF5KCRzdHlsZUFycmF5KTsKCQl9IGVsc2UgewoJCQkkdGhpcy0+X2NvbG9yID0gJGNvbG9yOwoJCX0KCQlyZXR1cm4gJHRoaXM7Cgl9CgoJLyoqCgkgKiBHZXQgaGFzaCBjb2RlCgkgKgoJICogQHJldHVybiBzdHJpbmcJSGFzaCBjb2RlCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRIYXNoQ29kZSgpIHsKCQlpZiAoJHRoaXMtPl9pc1N1cGVydmlzb3IpIHsKCQkJcmV0dXJuICR0aGlzLT5nZXRTaGFyZWRDb21wb25lbnQoKS0+Z2V0SGFzaENvZGUoKTsKCQl9CgkJcmV0dXJuIG1kNSgKCQkJICAkdGhpcy0+X2JvcmRlclN0eWxlCgkJCS4gJHRoaXMtPl9jb2xvci0+Z2V0SGFzaENvZGUoKQoJCQkuIF9fQ0xBU1NfXwoJCSk7Cgl9CgoJLyoqCgkgKiBJbXBsZW1lbnQgUEhQIF9fY2xvbmUgdG8gY3JlYXRlIGEgZGVlcCBjbG9uZSwgbm90IGp1c3QgYSBzaGFsbG93IGNvcHkuCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBfX2Nsb25lKCkgewoJCSR2YXJzID0gZ2V0X29iamVjdF92YXJzKCR0aGlzKTsKCQlmb3JlYWNoICgkdmFycyBhcyAka2V5ID0+ICR2YWx1ZSkgewoJCQlpZiAoKGlzX29iamVjdCgkdmFsdWUpKSAmJiAoJGtleSAhPSAnX3BhcmVudCcpKSB7CgkJCQkkdGhpcy0+JGtleSA9IGNsb25lICR2YWx1ZTsKCQkJfSBlbHNlIHsKCQkJCSR0aGlzLT4ka2V5ID0gJHZhbHVlOwoJCQl9CgkJfQoJfQp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Style/Borders.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIFBIUEV4Y2VsCiAqCiAqIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICoKICogQGNhdGVnb3J5ICAgUEhQRXhjZWwKICogQHBhY2thZ2UgICAgUEhQRXhjZWxfU3R5bGUKICogQGNvcHlyaWdodCAgQ29weXJpZ2h0IChjKSAyMDA2IC0gMjAxMiBQSFBFeGNlbCAoaHR0cDovL3d3dy5jb2RlcGxleC5jb20vUEhQRXhjZWwpCiAqIEBsaWNlbnNlICAgIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9vbGQtbGljZW5zZXMvbGdwbC0yLjEudHh0CUxHUEwKICogQHZlcnNpb24gICAgMS43LjcsIDIwMTItMDUtMTkKICovCgoKLyoqCiAqIFBIUEV4Y2VsX1N0eWxlX0JvcmRlcnMKICoKICogQGNhdGVnb3J5ICAgUEhQRXhjZWwKICogQHBhY2thZ2UgICAgUEhQRXhjZWxfU3R5bGUKICogQGNvcHlyaWdodCAgQ29weXJpZ2h0IChjKSAyMDA2IC0gMjAxMiBQSFBFeGNlbCAoaHR0cDovL3d3dy5jb2RlcGxleC5jb20vUEhQRXhjZWwpCiAqLwpjbGFzcyBQSFBFeGNlbF9TdHlsZV9Cb3JkZXJzIGltcGxlbWVudHMgUEhQRXhjZWxfSUNvbXBhcmFibGUKewoJLyogRGlhZ29uYWwgZGlyZWN0aW9ucyAqLwoJY29uc3QgRElBR09OQUxfTk9ORQkJPSAwOwoJY29uc3QgRElBR09OQUxfVVAJCT0gMTsKCWNvbnN0IERJQUdPTkFMX0RPV04JCT0gMjsKCWNvbnN0IERJQUdPTkFMX0JPVEgJCT0gMzsKCgkvKioKCSAqIExlZnQKCSAqCgkgKiBAdmFyIFBIUEV4Y2VsX1N0eWxlX0JvcmRlcgoJICovCglwcml2YXRlICRfbGVmdDsKCgkvKioKCSAqIFJpZ2h0CgkgKgoJICogQHZhciBQSFBFeGNlbF9TdHlsZV9Cb3JkZXIKCSAqLwoJcHJpdmF0ZSAkX3JpZ2h0OwoKCS8qKgoJICogVG9wCgkgKgoJICogQHZhciBQSFBFeGNlbF9TdHlsZV9Cb3JkZXIKCSAqLwoJcHJpdmF0ZSAkX3RvcDsKCgkvKioKCSAqIEJvdHRvbQoJICoKCSAqIEB2YXIgUEhQRXhjZWxfU3R5bGVfQm9yZGVyCgkgKi8KCXByaXZhdGUgJF9ib3R0b207CgoJLyoqCgkgKiBEaWFnb25hbAoJICoKCSAqIEB2YXIgUEhQRXhjZWxfU3R5bGVfQm9yZGVyCgkgKi8KCXByaXZhdGUgJF9kaWFnb25hbDsKCgkvKioKCSAqIERpYWdvbmFsRGlyZWN0aW9uCgkgKgoJICogQHZhciBpbnQKCSAqLwoJcHJpdmF0ZSAkX2RpYWdvbmFsRGlyZWN0aW9uOwoKCS8qKgoJICogQWxsIGJvcmRlcnMgcHNlZG8tYm9yZGVyLiBPbmx5IGFwcGxpZXMgdG8gc3VwZXJ2aXNvci4KCSAqCgkgKiBAdmFyIFBIUEV4Y2VsX1N0eWxlX0JvcmRlcgoJICovCglwcml2YXRlICRfYWxsQm9yZGVyczsKCgkvKioKCSAqIE91dGxpbmUgcHNlZG8tYm9yZGVyLiBPbmx5IGFwcGxpZXMgdG8gc3VwZXJ2aXNvci4KCSAqCgkgKiBAdmFyIFBIUEV4Y2VsX1N0eWxlX0JvcmRlcgoJICovCglwcml2YXRlICRfb3V0bGluZTsKCgkvKioKCSAqIEluc2lkZSBwc2Vkby1ib3JkZXIuIE9ubHkgYXBwbGllcyB0byBzdXBlcnZpc29yLgoJICoKCSAqIEB2YXIgUEhQRXhjZWxfU3R5bGVfQm9yZGVyCgkgKi8KCXByaXZhdGUgJF9pbnNpZGU7CgoJLyoqCgkgKiBWZXJ0aWNhbCBwc2V1ZG8tYm9yZGVyLiBPbmx5IGFwcGxpZXMgdG8gc3VwZXJ2aXNvci4KCSAqCgkgKiBAdmFyIFBIUEV4Y2VsX1N0eWxlX0JvcmRlcgoJICovCglwcml2YXRlICRfdmVydGljYWw7CgoJLyoqCgkgKiBIb3Jpem9udGFsIHBzZXVkby1ib3JkZXIuIE9ubHkgYXBwbGllcyB0byBzdXBlcnZpc29yLgoJICoKCSAqIEB2YXIgUEhQRXhjZWxfU3R5bGVfQm9yZGVyCgkgKi8KCXByaXZhdGUgJF9ob3Jpem9udGFsOwoKCS8qKgoJICogUGFyZW50IEJvcmRlcnMKCSAqCgkgKiBAdmFyIF9wYXJlbnRQcm9wZXJ0eU5hbWUgc3RyaW5nCgkgKi8KCXByaXZhdGUgJF9wYXJlbnRQcm9wZXJ0eU5hbWU7CgoJLyoqCgkgKiBTdXBlcnZpc29yPwoJICoKCSAqIEB2YXIgYm9vbGVhbgoJICovCglwcml2YXRlICRfaXNTdXBlcnZpc29yOwoKCS8qKgoJICogUGFyZW50LiBPbmx5IHVzZWQgZm9yIHN1cGVydmlzb3IKCSAqCgkgKiBAdmFyIFBIUEV4Y2VsX1N0eWxlCgkgKi8KCXByaXZhdGUgJF9wYXJlbnQ7CgoJLyoqCiAgICAgKiBDcmVhdGUgYSBuZXcgUEhQRXhjZWxfU3R5bGVfQm9yZGVycwoJICoKCSAqIEBwYXJhbQlib29sZWFuCSRpc1N1cGVydmlzb3IJRmxhZyBpbmRpY2F0aW5nIGlmIHRoaXMgaXMgYSBzdXBlcnZpc29yIG9yIG5vdAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJGlzU3VwZXJ2aXNvciA9IGZhbHNlKQogICAgewogICAgCS8vIFN1cGVydmlzb3I/CgkJJHRoaXMtPl9pc1N1cGVydmlzb3IgPSAkaXNTdXBlcnZpc29yOwoKICAgIAkvLyBJbml0aWFsaXNlIHZhbHVlcwogICAgCSR0aGlzLT5fbGVmdAkJCQk9IG5ldyBQSFBFeGNlbF9TdHlsZV9Cb3JkZXIoJGlzU3VwZXJ2aXNvcik7CiAgICAJJHRoaXMtPl9yaWdodAkJCQk9IG5ldyBQSFBFeGNlbF9TdHlsZV9Cb3JkZXIoJGlzU3VwZXJ2aXNvcik7CiAgICAJJHRoaXMtPl90b3AJCQkJCT0gbmV3IFBIUEV4Y2VsX1N0eWxlX0JvcmRlcigkaXNTdXBlcnZpc29yKTsKICAgIAkkdGhpcy0+X2JvdHRvbQkJCQk9IG5ldyBQSFBFeGNlbF9TdHlsZV9Cb3JkZXIoJGlzU3VwZXJ2aXNvcik7CiAgICAJJHRoaXMtPl9kaWFnb25hbAkJCT0gbmV3IFBIUEV4Y2VsX1N0eWxlX0JvcmRlcigkaXNTdXBlcnZpc29yKTsKCQkkdGhpcy0+X2RpYWdvbmFsRGlyZWN0aW9uCT0gUEhQRXhjZWxfU3R5bGVfQm9yZGVyczo6RElBR09OQUxfTk9ORTsKCgkJLy8gU3BlY2lhbGx5IGZvciBzdXBlcnZpc29yCgkJaWYgKCRpc1N1cGVydmlzb3IpIHsKCQkJLy8gSW5pdGlhbGl6ZSBwc2V1ZG8tYm9yZGVycwoJCQkkdGhpcy0+X2FsbEJvcmRlcnMJCQk9IG5ldyBQSFBFeGNlbF9TdHlsZV9Cb3JkZXIodHJ1ZSk7CgkJCSR0aGlzLT5fb3V0bGluZQkJCQk9IG5ldyBQSFBFeGNlbF9TdHlsZV9Cb3JkZXIodHJ1ZSk7CgkJCSR0aGlzLT5faW5zaWRlCQkJCT0gbmV3IFBIUEV4Y2VsX1N0eWxlX0JvcmRlcih0cnVlKTsKCQkJJHRoaXMtPl92ZXJ0aWNhbAkJCT0gbmV3IFBIUEV4Y2VsX1N0eWxlX0JvcmRlcih0cnVlKTsKCQkJJHRoaXMtPl9ob3Jpem9udGFsCQkJPSBuZXcgUEhQRXhjZWxfU3R5bGVfQm9yZGVyKHRydWUpOwoKCQkJLy8gYmluZCBwYXJlbnQgaWYgd2UgYXJlIGEgc3VwZXJ2aXNvcgoJCQkkdGhpcy0+X2xlZnQtPmJpbmRQYXJlbnQoJHRoaXMsICdfbGVmdCcpOwoJCQkkdGhpcy0+X3JpZ2h0LT5iaW5kUGFyZW50KCR0aGlzLCAnX3JpZ2h0Jyk7CgkJCSR0aGlzLT5fdG9wLT5iaW5kUGFyZW50KCR0aGlzLCAnX3RvcCcpOwoJCQkkdGhpcy0+X2JvdHRvbS0+YmluZFBhcmVudCgkdGhpcywgJ19ib3R0b20nKTsKCQkJJHRoaXMtPl9kaWFnb25hbC0+YmluZFBhcmVudCgkdGhpcywgJ19kaWFnb25hbCcpOwoJCQkkdGhpcy0+X2FsbEJvcmRlcnMtPmJpbmRQYXJlbnQoJHRoaXMsICdfYWxsQm9yZGVycycpOwoJCQkkdGhpcy0+X291dGxpbmUtPmJpbmRQYXJlbnQoJHRoaXMsICdfb3V0bGluZScpOwoJCQkkdGhpcy0+X2luc2lkZS0+YmluZFBhcmVudCgkdGhpcywgJ19pbnNpZGUnKTsKCQkJJHRoaXMtPl92ZXJ0aWNhbC0+YmluZFBhcmVudCgkdGhpcywgJ192ZXJ0aWNhbCcpOwoJCQkkdGhpcy0+X2hvcml6b250YWwtPmJpbmRQYXJlbnQoJHRoaXMsICdfaG9yaXpvbnRhbCcpOwoJCX0KICAgIH0KCgkvKioKCSAqIEJpbmQgcGFyZW50LiBPbmx5IHVzZWQgZm9yIHN1cGVydmlzb3IKCSAqCgkgKiBAcGFyYW0gUEhQRXhjZWxfU3R5bGUgJHBhcmVudAoJICogQHJldHVybiBQSFBFeGNlbF9TdHlsZV9Cb3JkZXJzCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBiaW5kUGFyZW50KCRwYXJlbnQpCgl7CgkJJHRoaXMtPl9wYXJlbnQgPSAkcGFyZW50OwoJCXJldHVybiAkdGhpczsKCX0KCgkvKioKCSAqIElzIHRoaXMgYSBzdXBlcnZpc29yIG9yIGEgcmVhbCBzdHlsZSBjb21wb25lbnQ/CgkgKgoJICogQHJldHVybiBib29sZWFuCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRJc1N1cGVydmlzb3IoKQoJewoJCXJldHVybiAkdGhpcy0+X2lzU3VwZXJ2aXNvcjsKCX0KCgkvKioKCSAqIEdldCB0aGUgc2hhcmVkIHN0eWxlIGNvbXBvbmVudCBmb3IgdGhlIGN1cnJlbnRseSBhY3RpdmUgY2VsbCBpbiBjdXJyZW50bHkgYWN0aXZlIHNoZWV0LgoJICogT25seSB1c2VkIGZvciBzdHlsZSBzdXBlcnZpc29yCgkgKgoJICogQHJldHVybiBQSFBFeGNlbF9TdHlsZV9Cb3JkZXJzCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRTaGFyZWRDb21wb25lbnQoKQoJewoJCXJldHVybiAkdGhpcy0+X3BhcmVudC0+Z2V0U2hhcmVkQ29tcG9uZW50KCktPmdldEJvcmRlcnMoKTsKCX0KCgkvKioKCSAqIEdldCB0aGUgY3VycmVudGx5IGFjdGl2ZSBzaGVldC4gT25seSB1c2VkIGZvciBzdXBlcnZpc29yCgkgKgoJICogQHJldHVybiBQSFBFeGNlbF9Xb3Jrc2hlZXQKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldEFjdGl2ZVNoZWV0KCkKCXsKCQlyZXR1cm4gJHRoaXMtPl9wYXJlbnQtPmdldEFjdGl2ZVNoZWV0KCk7Cgl9CgoJLyoqCgkgKiBHZXQgdGhlIGN1cnJlbnRseSBhY3RpdmUgY2VsbCBjb29yZGluYXRlIGluIGN1cnJlbnRseSBhY3RpdmUgc2hlZXQuCgkgKiBPbmx5IHVzZWQgZm9yIHN1cGVydmlzb3IKCSAqCgkgKiBAcmV0dXJuIHN0cmluZyBFLmcuICdBMScKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldFNlbGVjdGVkQ2VsbHMoKQoJewoJCXJldHVybiAkdGhpcy0+Z2V0QWN0aXZlU2hlZXQoKS0+Z2V0U2VsZWN0ZWRDZWxscygpOwoJfQoKCS8qKgoJICogR2V0IHRoZSBjdXJyZW50bHkgYWN0aXZlIGNlbGwgY29vcmRpbmF0ZSBpbiBjdXJyZW50bHkgYWN0aXZlIHNoZWV0LgoJICogT25seSB1c2VkIGZvciBzdXBlcnZpc29yCgkgKgoJICogQHJldHVybiBzdHJpbmcgRS5nLiAnQTEnCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRBY3RpdmVDZWxsKCkKCXsKCQlyZXR1cm4gJHRoaXMtPmdldEFjdGl2ZVNoZWV0KCktPmdldEFjdGl2ZUNlbGwoKTsKCX0KCgkvKioKCSAqIEJ1aWxkIHN0eWxlIGFycmF5IGZyb20gc3ViY29tcG9uZW50cwoJICoKCSAqIEBwYXJhbSBhcnJheSAkYXJyYXkKCSAqIEByZXR1cm4gYXJyYXkKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldFN0eWxlQXJyYXkoJGFycmF5KQoJewoJCXJldHVybiBhcnJheSgnYm9yZGVycycgPT4gJGFycmF5KTsKCX0KCgkvKioKICAgICAqIEFwcGx5IHN0eWxlcyBmcm9tIGFycmF5CiAgICAgKgogICAgICogPGNvZGU+CiAgICAgKiAkb2JqUEhQRXhjZWwtPmdldEFjdGl2ZVNoZWV0KCktPmdldFN0eWxlKCdCMicpLT5nZXRCb3JkZXJzKCktPmFwcGx5RnJvbUFycmF5KAogICAgICogCQlhcnJheSgKICAgICAqIAkJCSdib3R0b20nICAgICA9PiBhcnJheSgKICAgICAqIAkJCQknc3R5bGUnID0+IFBIUEV4Y2VsX1N0eWxlX0JvcmRlcjo6Qk9SREVSX0RBU0hET1QsCiAgICAgKiAJCQkJJ2NvbG9yJyA9PiBhcnJheSgKICAgICAqIAkJCQkJJ3JnYicgPT4gJzgwODA4MCcKICAgICAqIAkJCQkpCiAgICAgKiAJCQkpLAogICAgICogCQkJJ3RvcCcgICAgID0+IGFycmF5KAogICAgICogCQkJCSdzdHlsZScgPT4gUEhQRXhjZWxfU3R5bGVfQm9yZGVyOjpCT1JERVJfREFTSERPVCwKICAgICAqIAkJCQknY29sb3InID0+IGFycmF5KAogICAgICogCQkJCQkncmdiJyA9PiAnODA4MDgwJwogICAgICogCQkJCSkKICAgICAqIAkJCSkKICAgICAqIAkJKQogICAgICogKTsKICAgICAqIDwvY29kZT4KICAgICAqIDxjb2RlPgogICAgICogJG9ialBIUEV4Y2VsLT5nZXRBY3RpdmVTaGVldCgpLT5nZXRTdHlsZSgnQjInKS0+Z2V0Qm9yZGVycygpLT5hcHBseUZyb21BcnJheSgKICAgICAqIAkJYXJyYXkoCiAgICAgKiAJCQknYWxsYm9yZGVycycgPT4gYXJyYXkoCiAgICAgKiAJCQkJJ3N0eWxlJyA9PiBQSFBFeGNlbF9TdHlsZV9Cb3JkZXI6OkJPUkRFUl9EQVNIRE9ULAogICAgICogCQkJCSdjb2xvcicgPT4gYXJyYXkoCiAgICAgKiAJCQkJCSdyZ2InID0+ICc4MDgwODAnCiAgICAgKiAJCQkJKQogICAgICogCQkJKQogICAgICogCQkpCiAgICAgKiApOwogICAgICogPC9jb2RlPgogICAgICoKICAgICAqIEBwYXJhbQlhcnJheQkkcFN0eWxlcwlBcnJheSBjb250YWluaW5nIHN0eWxlIGluZm9ybWF0aW9uCiAgICAgKiBAdGhyb3dzCUV4Y2VwdGlvbgogICAgICogQHJldHVybiBQSFBFeGNlbF9TdHlsZV9Cb3JkZXJzCiAgICAgKi8KCXB1YmxpYyBmdW5jdGlvbiBhcHBseUZyb21BcnJheSgkcFN0eWxlcyA9IG51bGwpIHsKCQlpZiAoaXNfYXJyYXkoJHBTdHlsZXMpKSB7CgkJCWlmICgkdGhpcy0+X2lzU3VwZXJ2aXNvcikgewoJCQkJJHRoaXMtPmdldEFjdGl2ZVNoZWV0KCktPmdldFN0eWxlKCR0aGlzLT5nZXRTZWxlY3RlZENlbGxzKCkpLT5hcHBseUZyb21BcnJheSgkdGhpcy0+Z2V0U3R5bGVBcnJheSgkcFN0eWxlcykpOwoJCQl9IGVsc2UgewoJCQkJaWYgKGFycmF5X2tleV9leGlzdHMoJ2xlZnQnLCAkcFN0eWxlcykpIHsKCQkJCQkkdGhpcy0+Z2V0TGVmdCgpLT5hcHBseUZyb21BcnJheSgkcFN0eWxlc1snbGVmdCddKTsKCQkJCX0KCQkJCWlmIChhcnJheV9rZXlfZXhpc3RzKCdyaWdodCcsICRwU3R5bGVzKSkgewoJCQkJCSR0aGlzLT5nZXRSaWdodCgpLT5hcHBseUZyb21BcnJheSgkcFN0eWxlc1sncmlnaHQnXSk7CgkJCQl9CgkJCQlpZiAoYXJyYXlfa2V5X2V4aXN0cygndG9wJywgJHBTdHlsZXMpKSB7CgkJCQkJJHRoaXMtPmdldFRvcCgpLT5hcHBseUZyb21BcnJheSgkcFN0eWxlc1sndG9wJ10pOwoJCQkJfQoJCQkJaWYgKGFycmF5X2tleV9leGlzdHMoJ2JvdHRvbScsICRwU3R5bGVzKSkgewoJCQkJCSR0aGlzLT5nZXRCb3R0b20oKS0+YXBwbHlGcm9tQXJyYXkoJHBTdHlsZXNbJ2JvdHRvbSddKTsKCQkJCX0KCQkJCWlmIChhcnJheV9rZXlfZXhpc3RzKCdkaWFnb25hbCcsICRwU3R5bGVzKSkgewoJCQkJCSR0aGlzLT5nZXREaWFnb25hbCgpLT5hcHBseUZyb21BcnJheSgkcFN0eWxlc1snZGlhZ29uYWwnXSk7CgkJCQl9CgkJCQlpZiAoYXJyYXlfa2V5X2V4aXN0cygnZGlhZ29uYWxkaXJlY3Rpb24nLCAkcFN0eWxlcykpIHsKCQkJCQkkdGhpcy0+c2V0RGlhZ29uYWxEaXJlY3Rpb24oJHBTdHlsZXNbJ2RpYWdvbmFsZGlyZWN0aW9uJ10pOwoJCQkJfQoJCQkJaWYgKGFycmF5X2tleV9leGlzdHMoJ2FsbGJvcmRlcnMnLCAkcFN0eWxlcykpIHsKCQkJCQkkdGhpcy0+Z2V0TGVmdCgpLT5hcHBseUZyb21BcnJheSgkcFN0eWxlc1snYWxsYm9yZGVycyddKTsKCQkJCQkkdGhpcy0+Z2V0UmlnaHQoKS0+YXBwbHlGcm9tQXJyYXkoJHBTdHlsZXNbJ2FsbGJvcmRlcnMnXSk7CgkJCQkJJHRoaXMtPmdldFRvcCgpLT5hcHBseUZyb21BcnJheSgkcFN0eWxlc1snYWxsYm9yZGVycyddKTsKCQkJCQkkdGhpcy0+Z2V0Qm90dG9tKCktPmFwcGx5RnJvbUFycmF5KCRwU3R5bGVzWydhbGxib3JkZXJzJ10pOwoJCQkJfQoJCQl9CgkJfSBlbHNlIHsKCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbigiSW52YWxpZCBzdHlsZSBhcnJheSBwYXNzZWQuIik7CgkJfQoJCXJldHVybiAkdGhpczsKCX0KCiAgICAvKioKICAgICAqIEdldCBMZWZ0CiAgICAgKgogICAgICogQHJldHVybiBQSFBFeGNlbF9TdHlsZV9Cb3JkZXIKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldExlZnQoKSB7CgkJcmV0dXJuICR0aGlzLT5fbGVmdDsKICAgIH0KCiAgICAvKioKICAgICAqIEdldCBSaWdodAogICAgICoKICAgICAqIEByZXR1cm4gUEhQRXhjZWxfU3R5bGVfQm9yZGVyCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRSaWdodCgpIHsKCQlyZXR1cm4gJHRoaXMtPl9yaWdodDsKICAgIH0KCiAgICAvKioKICAgICAqIEdldCBUb3AKICAgICAqCiAgICAgKiBAcmV0dXJuIFBIUEV4Y2VsX1N0eWxlX0JvcmRlcgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0VG9wKCkgewoJCXJldHVybiAkdGhpcy0+X3RvcDsKICAgIH0KCiAgICAvKioKICAgICAqIEdldCBCb3R0b20KICAgICAqCiAgICAgKiBAcmV0dXJuIFBIUEV4Y2VsX1N0eWxlX0JvcmRlcgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0Qm90dG9tKCkgewoJCXJldHVybiAkdGhpcy0+X2JvdHRvbTsKICAgIH0KCiAgICAvKioKICAgICAqIEdldCBEaWFnb25hbAogICAgICoKICAgICAqIEByZXR1cm4gUEhQRXhjZWxfU3R5bGVfQm9yZGVyCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXREaWFnb25hbCgpIHsKCQlyZXR1cm4gJHRoaXMtPl9kaWFnb25hbDsKICAgIH0KCiAgICAvKioKICAgICAqIEdldCBBbGxCb3JkZXJzIChwc2V1ZG8tYm9yZGVyKS4gT25seSBhcHBsaWVzIHRvIHN1cGVydmlzb3IuCiAgICAgKgogICAgICogQHJldHVybiBQSFBFeGNlbF9TdHlsZV9Cb3JkZXIKICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRBbGxCb3JkZXJzKCkgewoJCWlmICghJHRoaXMtPl9pc1N1cGVydmlzb3IpIHsKCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbignQ2FuIG9ubHkgZ2V0IHBzZXVkby1ib3JkZXIgZm9yIHN1cGVydmlzb3IuJyk7CgkJfQoJCXJldHVybiAkdGhpcy0+X2FsbEJvcmRlcnM7CiAgICB9CgogICAgLyoqCiAgICAgKiBHZXQgT3V0bGluZSAocHNldWRvLWJvcmRlcikuIE9ubHkgYXBwbGllcyB0byBzdXBlcnZpc29yLgogICAgICoKICAgICAqIEByZXR1cm4gYm9vbGVhbgogICAgICogQHRocm93cyBFeGNlcHRpb24KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldE91dGxpbmUoKSB7CgkJaWYgKCEkdGhpcy0+X2lzU3VwZXJ2aXNvcikgewoJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCdDYW4gb25seSBnZXQgcHNldWRvLWJvcmRlciBmb3Igc3VwZXJ2aXNvci4nKTsKCQl9CiAgICAJcmV0dXJuICR0aGlzLT5fb3V0bGluZTsKICAgIH0KCiAgICAvKioKICAgICAqIEdldCBJbnNpZGUgKHBzZXVkby1ib3JkZXIpLiBPbmx5IGFwcGxpZXMgdG8gc3VwZXJ2aXNvci4KICAgICAqCiAgICAgKiBAcmV0dXJuIGJvb2xlYW4KICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRJbnNpZGUoKSB7CgkJaWYgKCEkdGhpcy0+X2lzU3VwZXJ2aXNvcikgewoJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCdDYW4gb25seSBnZXQgcHNldWRvLWJvcmRlciBmb3Igc3VwZXJ2aXNvci4nKTsKCQl9CiAgICAJcmV0dXJuICR0aGlzLT5faW5zaWRlOwogICAgfQoKICAgIC8qKgogICAgICogR2V0IFZlcnRpY2FsIChwc2V1ZG8tYm9yZGVyKS4gT25seSBhcHBsaWVzIHRvIHN1cGVydmlzb3IuCiAgICAgKgogICAgICogQHJldHVybiBQSFBFeGNlbF9TdHlsZV9Cb3JkZXIKICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRWZXJ0aWNhbCgpIHsKCQlpZiAoISR0aGlzLT5faXNTdXBlcnZpc29yKSB7CgkJCXRocm93IG5ldyBFeGNlcHRpb24oJ0NhbiBvbmx5IGdldCBwc2V1ZG8tYm9yZGVyIGZvciBzdXBlcnZpc29yLicpOwoJCX0KCQlyZXR1cm4gJHRoaXMtPl92ZXJ0aWNhbDsKICAgIH0KCiAgICAvKioKICAgICAqIEdldCBIb3Jpem9udGFsIChwc2V1ZG8tYm9yZGVyKS4gT25seSBhcHBsaWVzIHRvIHN1cGVydmlzb3IuCiAgICAgKgogICAgICogQHJldHVybiBQSFBFeGNlbF9TdHlsZV9Cb3JkZXIKICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRIb3Jpem9udGFsKCkgewoJCWlmICghJHRoaXMtPl9pc1N1cGVydmlzb3IpIHsKCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbignQ2FuIG9ubHkgZ2V0IHBzZXVkby1ib3JkZXIgZm9yIHN1cGVydmlzb3IuJyk7CgkJfQoJCXJldHVybiAkdGhpcy0+X2hvcml6b250YWw7CiAgICB9CgogICAgLyoqCiAgICAgKiBHZXQgRGlhZ29uYWxEaXJlY3Rpb24KICAgICAqCiAgICAgKiBAcmV0dXJuIGludAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0RGlhZ29uYWxEaXJlY3Rpb24oKSB7CgkJaWYgKCR0aGlzLT5faXNTdXBlcnZpc29yKSB7CgkJCXJldHVybiAkdGhpcy0+Z2V0U2hhcmVkQ29tcG9uZW50KCktPmdldERpYWdvbmFsRGlyZWN0aW9uKCk7CgkJfQogICAgCXJldHVybiAkdGhpcy0+X2RpYWdvbmFsRGlyZWN0aW9uOwogICAgfQoKICAgIC8qKgogICAgICogU2V0IERpYWdvbmFsRGlyZWN0aW9uCiAgICAgKgogICAgICogQHBhcmFtIGludCAkcFZhbHVlCiAgICAgKiBAcmV0dXJuIFBIUEV4Y2VsX1N0eWxlX0JvcmRlcnMKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHNldERpYWdvbmFsRGlyZWN0aW9uKCRwVmFsdWUgPSBQSFBFeGNlbF9TdHlsZV9Cb3JkZXJzOjpESUFHT05BTF9OT05FKSB7CiAgICAgICAgaWYgKCRwVmFsdWUgPT0gJycpIHsKICAgIAkJJHBWYWx1ZSA9IFBIUEV4Y2VsX1N0eWxlX0JvcmRlcnM6OkRJQUdPTkFMX05PTkU7CiAgICAJfQoJCWlmICgkdGhpcy0+X2lzU3VwZXJ2aXNvcikgewoJCQkkc3R5bGVBcnJheSA9ICR0aGlzLT5nZXRTdHlsZUFycmF5KGFycmF5KCdkaWFnb25hbGRpcmVjdGlvbicgPT4gJHBWYWx1ZSkpOwoJCQkkdGhpcy0+Z2V0QWN0aXZlU2hlZXQoKS0+Z2V0U3R5bGUoJHRoaXMtPmdldFNlbGVjdGVkQ2VsbHMoKSktPmFwcGx5RnJvbUFycmF5KCRzdHlsZUFycmF5KTsKCQl9IGVsc2UgewoJCQkkdGhpcy0+X2RpYWdvbmFsRGlyZWN0aW9uID0gJHBWYWx1ZTsKCQl9CgkJcmV0dXJuICR0aGlzOwogICAgfQoKCS8qKgoJICogR2V0IGhhc2ggY29kZQoJICoKCSAqIEByZXR1cm4gc3RyaW5nCUhhc2ggY29kZQoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0SGFzaENvZGUoKSB7CgkJaWYgKCR0aGlzLT5faXNTdXBlcnZpc29yKSB7CgkJCXJldHVybiAkdGhpcy0+Z2V0U2hhcmVkQ29tcG9uZW50KCktPmdldEhhc2hjb2RlKCk7CgkJfQogICAgCXJldHVybiBtZDUoCiAgICAJCSAgJHRoaXMtPmdldExlZnQoKS0+Z2V0SGFzaENvZGUoKQogICAgCQkuICR0aGlzLT5nZXRSaWdodCgpLT5nZXRIYXNoQ29kZSgpCiAgICAJCS4gJHRoaXMtPmdldFRvcCgpLT5nZXRIYXNoQ29kZSgpCiAgICAJCS4gJHRoaXMtPmdldEJvdHRvbSgpLT5nZXRIYXNoQ29kZSgpCiAgICAJCS4gJHRoaXMtPmdldERpYWdvbmFsKCktPmdldEhhc2hDb2RlKCkKICAgIAkJLiAkdGhpcy0+Z2V0RGlhZ29uYWxEaXJlY3Rpb24oKQogICAgCQkuIF9fQ0xBU1NfXwogICAgCSk7CiAgICB9CgoJLyoqCgkgKiBJbXBsZW1lbnQgUEhQIF9fY2xvbmUgdG8gY3JlYXRlIGEgZGVlcCBjbG9uZSwgbm90IGp1c3QgYSBzaGFsbG93IGNvcHkuCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBfX2Nsb25lKCkgewoJCSR2YXJzID0gZ2V0X29iamVjdF92YXJzKCR0aGlzKTsKCQlmb3JlYWNoICgkdmFycyBhcyAka2V5ID0+ICR2YWx1ZSkgewoJCQlpZiAoKGlzX29iamVjdCgkdmFsdWUpKSAmJiAoJGtleSAhPSAnX3BhcmVudCcpKSB7CgkJCQkkdGhpcy0+JGtleSA9IGNsb25lICR2YWx1ZTsKCQkJfSBlbHNlIHsKCQkJCSR0aGlzLT4ka2V5ID0gJHZhbHVlOwoJCQl9CgkJfQoJfQp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Style/Color.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIFBIUEV4Y2VsCiAqCiAqIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICoKICogQGNhdGVnb3J5ICAgUEhQRXhjZWwKICogQHBhY2thZ2UJUEhQRXhjZWxfU3R5bGUKICogQGNvcHlyaWdodCBDb3B5cmlnaHQgKGMpIDIwMDYgLSAyMDEyIFBIUEV4Y2VsIChodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9QSFBFeGNlbCkKICogQGxpY2Vuc2UgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL29sZC1saWNlbnNlcy9sZ3BsLTIuMS50eHQJTEdQTAogKiBAdmVyc2lvbiAxLjcuNywgMjAxMi0wNS0xOQogKi8KCgovKioKICogUEhQRXhjZWxfU3R5bGVfQ29sb3IKICoKICogQGNhdGVnb3J5ICAgUEhQRXhjZWwKICogQHBhY2thZ2UJUEhQRXhjZWxfU3R5bGUKICogQGNvcHlyaWdodCAgQ29weXJpZ2h0IChjKSAyMDA2IC0gMjAxMiBQSFBFeGNlbCAoaHR0cDovL3d3dy5jb2RlcGxleC5jb20vUEhQRXhjZWwpCiAqLwpjbGFzcyBQSFBFeGNlbF9TdHlsZV9Db2xvciBpbXBsZW1lbnRzIFBIUEV4Y2VsX0lDb21wYXJhYmxlCnsKCS8qIENvbG9ycyAqLwoJY29uc3QgQ09MT1JfQkxBQ0sJCQkJCQk9ICdGRjAwMDAwMCc7Cgljb25zdCBDT0xPUl9XSElURQkJCQkJCT0gJ0ZGRkZGRkZGJzsKCWNvbnN0IENPTE9SX1JFRAkJCQkJCQk9ICdGRkZGMDAwMCc7Cgljb25zdCBDT0xPUl9EQVJLUkVECQkJCQkJPSAnRkY4MDAwMDAnOwoJY29uc3QgQ09MT1JfQkxVRQkJCQkJCT0gJ0ZGMDAwMEZGJzsKCWNvbnN0IENPTE9SX0RBUktCTFVFCQkJCQk9ICdGRjAwMDA4MCc7Cgljb25zdCBDT0xPUl9HUkVFTgkJCQkJCT0gJ0ZGMDBGRjAwJzsKCWNvbnN0IENPTE9SX0RBUktHUkVFTgkJCQkJPSAnRkYwMDgwMDAnOwoJY29uc3QgQ09MT1JfWUVMTE9XCQkJCQkJPSAnRkZGRkZGMDAnOwoJY29uc3QgQ09MT1JfREFSS1lFTExPVwkJCQkJPSAnRkY4MDgwMDAnOwoKCS8qKgoJICogSW5kZXhlZCBjb2xvcnMgYXJyYXkKCSAqCgkgKiBAdmFyIGFycmF5CgkgKi8KCXByaXZhdGUgc3RhdGljICRfaW5kZXhlZENvbG9yczsKCgkvKioKCSAqIEFSR0IgLSBBbHBoYSBSR0IKCSAqCgkgKiBAdmFyIHN0cmluZwoJICovCglwcml2YXRlICRfYXJnYjsKCgkvKioKCSAqIFN1cGVydmlzb3I/CgkgKgoJICogQHZhciBib29sZWFuCgkgKi8KCXByaXZhdGUgJF9pc1N1cGVydmlzb3I7CgoJLyoqCgkgKiBQYXJlbnQuIE9ubHkgdXNlZCBmb3Igc3VwZXJ2aXNvcgoJICoKCSAqIEB2YXIgbWl4ZWQKCSAqLwoJcHJpdmF0ZSAkX3BhcmVudDsKCgkvKioKCSAqIFBhcmVudCBwcm9wZXJ0eSBuYW1lCgkgKgoJICogQHZhciBzdHJpbmcKCSAqLwoJcHJpdmF0ZSAkX3BhcmVudFByb3BlcnR5TmFtZTsKCgoJLyoqCgkgKiBDcmVhdGUgYSBuZXcgUEhQRXhjZWxfU3R5bGVfQ29sb3IKCSAqCgkgKiBAcGFyYW0Jc3RyaW5nCSRwQVJHQgkJCUFSR0IgdmFsdWUgZm9yIHRoZSBjb2xvdXIKCSAqIEBwYXJhbQlib29sZWFuCSRpc1N1cGVydmlzb3IJRmxhZyBpbmRpY2F0aW5nIGlmIHRoaXMgaXMgYSBzdXBlcnZpc29yIG9yIG5vdAoJICovCglwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJHBBUkdCID0gUEhQRXhjZWxfU3R5bGVfQ29sb3I6OkNPTE9SX0JMQUNLLCAkaXNTdXBlcnZpc29yID0gZmFsc2UpCgl7CgkJLy8JU3VwZXJ2aXNvcj8KCQkkdGhpcy0+X2lzU3VwZXJ2aXNvciA9ICRpc1N1cGVydmlzb3I7CgoJCS8vCUluaXRpYWxpc2UgdmFsdWVzCgkJJHRoaXMtPl9hcmdiID0gJHBBUkdCOwoJfQoKCS8qKgoJICogQmluZCBwYXJlbnQuIE9ubHkgdXNlZCBmb3Igc3VwZXJ2aXNvcgoJICoKCSAqIEBwYXJhbSBtaXhlZCAkcGFyZW50CgkgKiBAcGFyYW0gc3RyaW5nICRwYXJlbnRQcm9wZXJ0eU5hbWUKCSAqIEByZXR1cm4gUEhQRXhjZWxfU3R5bGVfQ29sb3IKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGJpbmRQYXJlbnQoJHBhcmVudCwgJHBhcmVudFByb3BlcnR5TmFtZSkKCXsKCQkkdGhpcy0+X3BhcmVudCA9ICRwYXJlbnQ7CgkJJHRoaXMtPl9wYXJlbnRQcm9wZXJ0eU5hbWUgPSAkcGFyZW50UHJvcGVydHlOYW1lOwoJCXJldHVybiAkdGhpczsKCX0KCgkvKioKCSAqIElzIHRoaXMgYSBzdXBlcnZpc29yIG9yIGEgcmVhbCBzdHlsZSBjb21wb25lbnQ/CgkgKgoJICogQHJldHVybiBib29sZWFuCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRJc1N1cGVydmlzb3IoKQoJewoJCXJldHVybiAkdGhpcy0+X2lzU3VwZXJ2aXNvcjsKCX0KCgkvKioKCSAqIEdldCB0aGUgc2hhcmVkIHN0eWxlIGNvbXBvbmVudCBmb3IgdGhlIGN1cnJlbnRseSBhY3RpdmUgY2VsbCBpbiBjdXJyZW50bHkgYWN0aXZlIHNoZWV0LgoJICogT25seSB1c2VkIGZvciBzdHlsZSBzdXBlcnZpc29yCgkgKgoJICogQHJldHVybiBQSFBFeGNlbF9TdHlsZV9Db2xvcgoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0U2hhcmVkQ29tcG9uZW50KCkKCXsKCQlzd2l0Y2ggKCR0aGlzLT5fcGFyZW50UHJvcGVydHlOYW1lKSB7CgkJY2FzZSAnX2VuZENvbG9yJzoKCQkJcmV0dXJuICR0aGlzLT5fcGFyZW50LT5nZXRTaGFyZWRDb21wb25lbnQoKS0+Z2V0RW5kQ29sb3IoKTsKCQkJYnJlYWs7CgoJCWNhc2UgJ19jb2xvcic6CgkJCXJldHVybiAkdGhpcy0+X3BhcmVudC0+Z2V0U2hhcmVkQ29tcG9uZW50KCktPmdldENvbG9yKCk7CgkJCWJyZWFrOwoKCQljYXNlICdfc3RhcnRDb2xvcic6CgkJCXJldHVybiAkdGhpcy0+X3BhcmVudC0+Z2V0U2hhcmVkQ29tcG9uZW50KCktPmdldFN0YXJ0Q29sb3IoKTsKCQkJYnJlYWs7CgkJfQoJfQoKCS8qKgoJICogR2V0IHRoZSBjdXJyZW50bHkgYWN0aXZlIHNoZWV0LiBPbmx5IHVzZWQgZm9yIHN1cGVydmlzb3IKCSAqCgkgKiBAcmV0dXJuIFBIUEV4Y2VsX1dvcmtzaGVldAoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0QWN0aXZlU2hlZXQoKQoJewoJCXJldHVybiAkdGhpcy0+X3BhcmVudC0+Z2V0QWN0aXZlU2hlZXQoKTsKCX0KCgkvKioKCSAqIEdldCB0aGUgY3VycmVudGx5IGFjdGl2ZSBjZWxsIGNvb3JkaW5hdGUgaW4gY3VycmVudGx5IGFjdGl2ZSBzaGVldC4KCSAqIE9ubHkgdXNlZCBmb3Igc3VwZXJ2aXNvcgoJICoKCSAqIEByZXR1cm4gc3RyaW5nIEUuZy4gJ0ExJwoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0U2VsZWN0ZWRDZWxscygpCgl7CgkJcmV0dXJuICR0aGlzLT5nZXRBY3RpdmVTaGVldCgpLT5nZXRTZWxlY3RlZENlbGxzKCk7Cgl9CgoJLyoqCgkgKiBHZXQgdGhlIGN1cnJlbnRseSBhY3RpdmUgY2VsbCBjb29yZGluYXRlIGluIGN1cnJlbnRseSBhY3RpdmUgc2hlZXQuCgkgKiBPbmx5IHVzZWQgZm9yIHN1cGVydmlzb3IKCSAqCgkgKiBAcmV0dXJuIHN0cmluZyBFLmcuICdBMScKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldEFjdGl2ZUNlbGwoKQoJewoJCXJldHVybiAkdGhpcy0+Z2V0QWN0aXZlU2hlZXQoKS0+Z2V0QWN0aXZlQ2VsbCgpOwoJfQoKCS8qKgoJICogQnVpbGQgc3R5bGUgYXJyYXkgZnJvbSBzdWJjb21wb25lbnRzCgkgKgoJICogQHBhcmFtIGFycmF5ICRhcnJheQoJICogQHJldHVybiBhcnJheQoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0U3R5bGVBcnJheSgkYXJyYXkpCgl7CgkJc3dpdGNoICgkdGhpcy0+X3BhcmVudFByb3BlcnR5TmFtZSkgewoJCWNhc2UgJ19lbmRDb2xvcic6CgkJCSRrZXkgPSAnZW5kY29sb3InOwoJCQlicmVhazsKCgkJY2FzZSAnX2NvbG9yJzoKCQkJJGtleSA9ICdjb2xvcic7CgkJCWJyZWFrOwoKCQljYXNlICdfc3RhcnRDb2xvcic6CgkJCSRrZXkgPSAnc3RhcnRjb2xvcic7CgkJCWJyZWFrOwoKCQl9CgkJcmV0dXJuICR0aGlzLT5fcGFyZW50LT5nZXRTdHlsZUFycmF5KGFycmF5KCRrZXkgPT4gJGFycmF5KSk7Cgl9CgoJLyoqCgkgKiBBcHBseSBzdHlsZXMgZnJvbSBhcnJheQoJICoKCSAqIDxjb2RlPgoJICogJG9ialBIUEV4Y2VsLT5nZXRBY3RpdmVTaGVldCgpLT5nZXRTdHlsZSgnQjInKS0+Z2V0Rm9udCgpLT5nZXRDb2xvcigpLT5hcHBseUZyb21BcnJheSggYXJyYXkoJ3JnYicgPT4gJzgwODA4MCcpICk7CgkgKiA8L2NvZGU+CgkgKgoJICogQHBhcmFtCWFycmF5CSRwU3R5bGVzCUFycmF5IGNvbnRhaW5pbmcgc3R5bGUgaW5mb3JtYXRpb24KCSAqIEB0aHJvd3MJRXhjZXB0aW9uCgkgKiBAcmV0dXJuIFBIUEV4Y2VsX1N0eWxlX0NvbG9yCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBhcHBseUZyb21BcnJheSgkcFN0eWxlcyA9IG51bGwpIHsKCQlpZiAoaXNfYXJyYXkoJHBTdHlsZXMpKSB7CgkJCWlmICgkdGhpcy0+X2lzU3VwZXJ2aXNvcikgewoJCQkJJHRoaXMtPmdldEFjdGl2ZVNoZWV0KCktPmdldFN0eWxlKCR0aGlzLT5nZXRTZWxlY3RlZENlbGxzKCkpLT5hcHBseUZyb21BcnJheSgkdGhpcy0+Z2V0U3R5bGVBcnJheSgkcFN0eWxlcykpOwoJCQl9IGVsc2UgewoJCQkJaWYgKGFycmF5X2tleV9leGlzdHMoJ3JnYicsICRwU3R5bGVzKSkgewoJCQkJCSR0aGlzLT5zZXRSR0IoJHBTdHlsZXNbJ3JnYiddKTsKCQkJCX0KCQkJCWlmIChhcnJheV9rZXlfZXhpc3RzKCdhcmdiJywgJHBTdHlsZXMpKSB7CgkJCQkJJHRoaXMtPnNldEFSR0IoJHBTdHlsZXNbJ2FyZ2InXSk7CgkJCQl9CgkJCX0KCQl9IGVsc2UgewoJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCJJbnZhbGlkIHN0eWxlIGFycmF5IHBhc3NlZC4iKTsKCQl9CgkJcmV0dXJuICR0aGlzOwoJfQoKCS8qKgoJICogR2V0IEFSR0IKCSAqCgkgKiBAcmV0dXJuIHN0cmluZwoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0QVJHQigpIHsKCQlpZiAoJHRoaXMtPl9pc1N1cGVydmlzb3IpIHsKCQkJcmV0dXJuICR0aGlzLT5nZXRTaGFyZWRDb21wb25lbnQoKS0+Z2V0QVJHQigpOwoJCX0KCQlyZXR1cm4gJHRoaXMtPl9hcmdiOwoJfQoKCS8qKgoJICogU2V0IEFSR0IKCSAqCgkgKiBAcGFyYW0gc3RyaW5nICRwVmFsdWUKCSAqIEByZXR1cm4gUEhQRXhjZWxfU3R5bGVfQ29sb3IKCSAqLwoJcHVibGljIGZ1bmN0aW9uIHNldEFSR0IoJHBWYWx1ZSA9IFBIUEV4Y2VsX1N0eWxlX0NvbG9yOjpDT0xPUl9CTEFDSykgewoJCWlmICgkcFZhbHVlID09ICcnKSB7CgkJCSRwVmFsdWUgPSBQSFBFeGNlbF9TdHlsZV9Db2xvcjo6Q09MT1JfQkxBQ0s7CgkJfQoJCWlmICgkdGhpcy0+X2lzU3VwZXJ2aXNvcikgewoJCQkkc3R5bGVBcnJheSA9ICR0aGlzLT5nZXRTdHlsZUFycmF5KGFycmF5KCdhcmdiJyA9PiAkcFZhbHVlKSk7CgkJCSR0aGlzLT5nZXRBY3RpdmVTaGVldCgpLT5nZXRTdHlsZSgkdGhpcy0+Z2V0U2VsZWN0ZWRDZWxscygpKS0+YXBwbHlGcm9tQXJyYXkoJHN0eWxlQXJyYXkpOwoJCX0gZWxzZSB7CgkJCSR0aGlzLT5fYXJnYiA9ICRwVmFsdWU7CgkJfQoJCXJldHVybiAkdGhpczsKCX0KCgkvKioKCSAqIEdldCBSR0IKCSAqCgkgKiBAcmV0dXJuIHN0cmluZwoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0UkdCKCkgewoJCWlmICgkdGhpcy0+X2lzU3VwZXJ2aXNvcikgewoJCQlyZXR1cm4gJHRoaXMtPmdldFNoYXJlZENvbXBvbmVudCgpLT5nZXRSR0IoKTsKCQl9CgkJcmV0dXJuIHN1YnN0cigkdGhpcy0+X2FyZ2IsIDIpOwoJfQoKCS8qKgoJICogU2V0IFJHQgoJICoKCSAqIEBwYXJhbQlzdHJpbmcJJHBWYWx1ZQlSR0IgdmFsdWUKCSAqIEByZXR1cm4gUEhQRXhjZWxfU3R5bGVfQ29sb3IKCSAqLwoJcHVibGljIGZ1bmN0aW9uIHNldFJHQigkcFZhbHVlID0gJzAwMDAwMCcpIHsKCQlpZiAoJHBWYWx1ZSA9PSAnJykgewoJCQkkcFZhbHVlID0gJzAwMDAwMCc7CgkJfQoJCWlmICgkdGhpcy0+X2lzU3VwZXJ2aXNvcikgewoJCQkkc3R5bGVBcnJheSA9ICR0aGlzLT5nZXRTdHlsZUFycmF5KGFycmF5KCdhcmdiJyA9PiAnRkYnIC4gJHBWYWx1ZSkpOwoJCQkkdGhpcy0+Z2V0QWN0aXZlU2hlZXQoKS0+Z2V0U3R5bGUoJHRoaXMtPmdldFNlbGVjdGVkQ2VsbHMoKSktPmFwcGx5RnJvbUFycmF5KCRzdHlsZUFycmF5KTsKCQl9IGVsc2UgewoJCQkkdGhpcy0+X2FyZ2IgPSAnRkYnIC4gJHBWYWx1ZTsKCQl9CgkJcmV0dXJuICR0aGlzOwoJfQoKCS8qKgoJICogR2V0IGEgc3BlY2lmaWVkIGNvbG91ciBjb21wb25lbnQgb2YgYW4gUkdCIHZhbHVlCgkgKgoJICogQHByaXZhdGUKCSAqIEBwYXJhbQlzdHJpbmcJCSRSR0IJCVRoZSBjb2xvdXIgYXMgYW4gUkdCIHZhbHVlIChlLmcuIEZGMDBDQ0NDIG9yIENDRERFRQoJICogQHBhcmFtCWludAkJCSRvZmZzZXQJCVBvc2l0aW9uIHdpdGhpbiB0aGUgUkdCIHZhbHVlIHRvIGV4dHJhY3QKCSAqIEBwYXJhbQlib29sZWFuCQkkaGV4CQlGbGFnIGluZGljYXRpbmcgd2hldGhlciB0aGUgY29tcG9uZW50IHNob3VsZCBiZSByZXR1cm5lZCBhcyBhIGhleCBvciBhCgkgKgkJCQkJCQkJCWRlY2ltYWwgdmFsdWUKCSAqIEByZXR1cm4Jc3RyaW5nCQlUaGUgZXh0cmFjdGVkIGNvbG91ciBjb21wb25lbnQKCSAqLwoJcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gX2dldENvbG91ckNvbXBvbmVudCgkUkdCLCRvZmZzZXQsJGhleD10cnVlKSB7CgkJJGNvbG91ciA9IHN1YnN0cigkUkdCLCRvZmZzZXQsMik7CgkJaWYgKCEkaGV4KQoJCQkkY29sb3VyID0gaGV4ZGVjKCRjb2xvdXIpOwoJCXJldHVybiAkY29sb3VyOwoJfQoKCS8qKgoJICogR2V0IHRoZSByZWQgY29sb3VyIGNvbXBvbmVudCBvZiBhbiBSR0IgdmFsdWUKCSAqCgkgKiBAcGFyYW0Jc3RyaW5nCQkkUkdCCQlUaGUgY29sb3VyIGFzIGFuIFJHQiB2YWx1ZSAoZS5nLiBGRjAwQ0NDQyBvciBDQ0RERUUKCSAqIEBwYXJhbQlib29sZWFuCQkkaGV4CQlGbGFnIGluZGljYXRpbmcgd2hldGhlciB0aGUgY29tcG9uZW50IHNob3VsZCBiZSByZXR1cm5lZCBhcyBhIGhleCBvciBhCgkgKgkJCQkJCQkJCWRlY2ltYWwgdmFsdWUKCSAqIEByZXR1cm4Jc3RyaW5nCQlUaGUgcmVkIGNvbG91ciBjb21wb25lbnQKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRSZWQoJFJHQiwkaGV4PXRydWUpIHsKCQlpZiAoc3RybGVuKCRSR0IpID09IDgpIHsKCQkJcmV0dXJuIHNlbGY6Ol9nZXRDb2xvdXJDb21wb25lbnQoJFJHQiwyLCRoZXgpOwoJCX0gZWxzZWlmIChzdHJsZW4oJFJHQikgPT0gNikgewoJCQlyZXR1cm4gc2VsZjo6X2dldENvbG91ckNvbXBvbmVudCgkUkdCLDAsJGhleCk7CgkJfQoJfQoKCS8qKgoJICogR2V0IHRoZSBncmVlbiBjb2xvdXIgY29tcG9uZW50IG9mIGFuIFJHQiB2YWx1ZQoJICoKCSAqIEBwYXJhbQlzdHJpbmcJCSRSR0IJCVRoZSBjb2xvdXIgYXMgYW4gUkdCIHZhbHVlIChlLmcuIEZGMDBDQ0NDIG9yIENDRERFRQoJICogQHBhcmFtCWJvb2xlYW4JCSRoZXgJCUZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBjb21wb25lbnQgc2hvdWxkIGJlIHJldHVybmVkIGFzIGEgaGV4IG9yIGEKCSAqCQkJCQkJCQkJZGVjaW1hbCB2YWx1ZQoJICogQHJldHVybglzdHJpbmcJCVRoZSBncmVlbiBjb2xvdXIgY29tcG9uZW50CgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0R3JlZW4oJFJHQiwkaGV4PXRydWUpIHsKCQlpZiAoc3RybGVuKCRSR0IpID09IDgpIHsKCQkJcmV0dXJuIHNlbGY6Ol9nZXRDb2xvdXJDb21wb25lbnQoJFJHQiw0LCRoZXgpOwoJCX0gZWxzZWlmIChzdHJsZW4oJFJHQikgPT0gNikgewoJCQlyZXR1cm4gc2VsZjo6X2dldENvbG91ckNvbXBvbmVudCgkUkdCLDIsJGhleCk7CgkJfQoJfQoKCS8qKgoJICogR2V0IHRoZSBibHVlIGNvbG91ciBjb21wb25lbnQgb2YgYW4gUkdCIHZhbHVlCgkgKgoJICogQHBhcmFtCXN0cmluZwkJJFJHQgkJVGhlIGNvbG91ciBhcyBhbiBSR0IgdmFsdWUgKGUuZy4gRkYwMENDQ0Mgb3IgQ0NEREVFCgkgKiBAcGFyYW0JYm9vbGVhbgkJJGhleAkJRmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGNvbXBvbmVudCBzaG91bGQgYmUgcmV0dXJuZWQgYXMgYSBoZXggb3IgYQoJICoJCQkJCQkJCQlkZWNpbWFsIHZhbHVlCgkgKiBAcmV0dXJuCXN0cmluZwkJVGhlIGJsdWUgY29sb3VyIGNvbXBvbmVudAoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldEJsdWUoJFJHQiwkaGV4PXRydWUpIHsKCQlpZiAoc3RybGVuKCRSR0IpID09IDgpIHsKCQkJcmV0dXJuIHNlbGY6Ol9nZXRDb2xvdXJDb21wb25lbnQoJFJHQiw2LCRoZXgpOwoJCX0gZWxzZWlmIChzdHJsZW4oJFJHQikgPT0gNikgewoJCQlyZXR1cm4gc2VsZjo6X2dldENvbG91ckNvbXBvbmVudCgkUkdCLDQsJGhleCk7CgkJfQoJfQoKCS8qKgoJICogQWRqdXN0IHRoZSBicmlnaHRuZXNzIG9mIGEgY29sb3IKCSAqCgkgKiBAcGFyYW0Jc3RyaW5nCQkkaGV4CVRoZSBjb2xvdXIgYXMgYW4gUkdCIHZhbHVlIChlLmcuIEZGMDBDQ0NDIG9yIENDRERFRQoJICogQHBhcmFtCWZsb2F0CQkkYWRqdXN0UGVyY2VudGFnZQlUaGUgcGVyY2VudGFnZSBieSB3aGljaCB0byBhZGp1c3QgdGhlIGNvbG91ciBhcyBhIGZsb2F0IGZyb20gLTEgdG8gMQoJICogQHJldHVybglzdHJpbmcJCVRoZSBhZGp1c3RlZCBjb2xvdXIgYXMgYW4gUkdCIHZhbHVlIChlLmcuIEZGMDBDQ0NDIG9yIENDRERFRQoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGNoYW5nZUJyaWdodG5lc3MoJGhleCwgJGFkanVzdFBlcmNlbnRhZ2UpIHsKCQkkcmVkCT0gc2VsZjo6Z2V0UmVkKCRoZXgsZmFsc2UpOwoJCSRncmVlbgk9IHNlbGY6OmdldEdyZWVuKCRoZXgsZmFsc2UpOwoJCSRibHVlCT0gc2VsZjo6Z2V0Qmx1ZSgkaGV4LGZhbHNlKTsKCQlpZiAoJGFkanVzdFBlcmNlbnRhZ2UgPiAwKSB7CgkJCSRyZWQJKz0gKDI1NSAtICRyZWQpICogJGFkanVzdFBlcmNlbnRhZ2U7CgkJCSRncmVlbgkrPSAoMjU1IC0gJGdyZWVuKSAqICRhZGp1c3RQZXJjZW50YWdlOwoJCQkkYmx1ZQkrPSAoMjU1IC0gJGJsdWUpICogJGFkanVzdFBlcmNlbnRhZ2U7CgkJfSBlbHNlIHsKCQkJJHJlZAkrPSAkcmVkICogJGFkanVzdFBlcmNlbnRhZ2U7CgkJCSRncmVlbgkrPSAkZ3JlZW4gKiAkYWRqdXN0UGVyY2VudGFnZTsKCQkJJGJsdWUJKz0gJGJsdWUgKiAkYWRqdXN0UGVyY2VudGFnZTsKCQl9CgoJCWlmICgkcmVkIDwgMCkgJHJlZCA9IDA7CgkJZWxzZWlmICgkcmVkID4gMjU1KSAkcmVkID0gMjU1OwoJCWlmICgkZ3JlZW4gPCAwKSAkZ3JlZW4gPSAwOwoJCWVsc2VpZiAoJGdyZWVuID4gMjU1KSAkZ3JlZW4gPSAyNTU7CgkJaWYgKCRibHVlIDwgMCkgJGJsdWUgPSAwOwoJCWVsc2VpZiAoJGJsdWUgPiAyNTUpICRibHVlID0gMjU1OwoKCQlyZXR1cm4gc3RydG91cHBlcigJc3RyX3BhZChkZWNoZXgoJHJlZCksIDIsICcwJywgMCkgLgoJCQkJCQkJc3RyX3BhZChkZWNoZXgoJGdyZWVuKSwgMiwgJzAnLCAwKSAuCgkJCQkJCQlzdHJfcGFkKGRlY2hleCgkYmx1ZSksIDIsICcwJywgMCkKCQkJCQkJICk7Cgl9CgoJLyoqCgkgKiBHZXQgaW5kZXhlZCBjb2xvcgoJICoKCSAqIEBwYXJhbQlpbnQJCQkkcEluZGV4CQkJSW5kZXggZW50cnkgcG9pbnQgaW50byB0aGUgY29sb3VyIGFycmF5CgkgKiBAcGFyYW0JYm9vbGVhbgkJJGJhY2tncm91bmQJCUZsYWcgdG8gaW5kaWNhdGUgd2hldGhlciBkZWZhdWx0IGJhY2tncm91bmQgb3IgZm9yZWdyb3VuZCBjb2xvdXIKCSAqCQkJCQkJCQkJCQlzaG91bGQgYmUgcmV0dXJuZWQgaWYgdGhlIGluZGV4ZWQgY29sb3VyIGRvZXNuJ3QgZXhpc3QKCSAqIEByZXR1cm4JUEhQRXhjZWxfU3R5bGVfQ29sb3IKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBpbmRleGVkQ29sb3IoJHBJbmRleCwgJGJhY2tncm91bmQ9ZmFsc2UpIHsKCQkvLyBDbGVhbiBwYXJhbWV0ZXIKCQkkcEluZGV4ID0gaW50dmFsKCRwSW5kZXgpOwoKCQkvLyBJbmRleGVkIGNvbG9ycwoJCWlmIChpc19udWxsKHNlbGY6OiRfaW5kZXhlZENvbG9ycykpIHsKCQkJc2VsZjo6JF9pbmRleGVkQ29sb3JzID0gYXJyYXkoCgkJCQkJMQk9PiAnRkYwMDAwMDAnLAkvLwlTeXN0ZW0gQ29sb3VyICMxIC0gQmxhY2sKCQkJCQkyCT0+ICdGRkZGRkZGRicsCS8vCVN5c3RlbSBDb2xvdXIgIzIgLSBXaGl0ZQoJCQkJCTMJPT4gJ0ZGRkYwMDAwJywJLy8JU3lzdGVtIENvbG91ciAjMyAtIFJlZAoJCQkJCTQJPT4gJ0ZGMDBGRjAwJywJLy8JU3lzdGVtIENvbG91ciAjNCAtIEdyZWVuCgkJCQkJNQk9PiAnRkYwMDAwRkYnLAkvLwlTeXN0ZW0gQ29sb3VyICM1IC0gQmx1ZQoJCQkJCTYJPT4gJ0ZGRkZGRjAwJywJLy8JU3lzdGVtIENvbG91ciAjNiAtIFllbGxvdwoJCQkJCTcJPT4gJ0ZGRkYwMEZGJywJLy8JU3lzdGVtIENvbG91ciAjNy0gTWFnZW50YQoJCQkJCTgJPT4gJ0ZGMDBGRkZGJywJLy8JU3lzdGVtIENvbG91ciAjOC0gQ3lhbgoJCQkJCTkJPT4gJ0ZGODAwMDAwJywJLy8JU3RhbmRhcmQgQ29sb3VyICM5CgkJCQkJMTAJPT4gJ0ZGMDA4MDAwJywJLy8JU3RhbmRhcmQgQ29sb3VyICMxMAoJCQkJCTExCT0+ICdGRjAwMDA4MCcsCS8vCVN0YW5kYXJkIENvbG91ciAjMTEKCQkJCQkxMgk9PiAnRkY4MDgwMDAnLAkvLwlTdGFuZGFyZCBDb2xvdXIgIzEyCgkJCQkJMTMJPT4gJ0ZGODAwMDgwJywJLy8JU3RhbmRhcmQgQ29sb3VyICMxMwoJCQkJCTE0CT0+ICdGRjAwODA4MCcsCS8vCVN0YW5kYXJkIENvbG91ciAjMTQKCQkJCQkxNQk9PiAnRkZDMEMwQzAnLAkvLwlTdGFuZGFyZCBDb2xvdXIgIzE1CgkJCQkJMTYJPT4gJ0ZGODA4MDgwJywJLy8JU3RhbmRhcmQgQ29sb3VyICMxNgoJCQkJCTE3CT0+ICdGRjk5OTlGRicsCS8vCUNoYXJ0IEZpbGwgQ29sb3VyICMxNwoJCQkJCTE4CT0+ICdGRjk5MzM2NicsCS8vCUNoYXJ0IEZpbGwgQ29sb3VyICMxOAoJCQkJCTE5CT0+ICdGRkZGRkZDQycsCS8vCUNoYXJ0IEZpbGwgQ29sb3VyICMxOQoJCQkJCTIwCT0+ICdGRkNDRkZGRicsCS8vCUNoYXJ0IEZpbGwgQ29sb3VyICMyMAoJCQkJCTIxCT0+ICdGRjY2MDA2NicsCS8vCUNoYXJ0IEZpbGwgQ29sb3VyICMyMQoJCQkJCTIyCT0+ICdGRkZGODA4MCcsCS8vCUNoYXJ0IEZpbGwgQ29sb3VyICMyMgoJCQkJCTIzCT0+ICdGRjAwNjZDQycsCS8vCUNoYXJ0IEZpbGwgQ29sb3VyICMyMwoJCQkJCTI0CT0+ICdGRkNDQ0NGRicsCS8vCUNoYXJ0IEZpbGwgQ29sb3VyICMyNAoJCQkJCTI1CT0+ICdGRjAwMDA4MCcsCS8vCUNoYXJ0IExpbmUgQ29sb3VyICMyNQoJCQkJCTI2CT0+ICdGRkZGMDBGRicsCS8vCUNoYXJ0IExpbmUgQ29sb3VyICMyNgoJCQkJCTI3CT0+ICdGRkZGRkYwMCcsCS8vCUNoYXJ0IExpbmUgQ29sb3VyICMyNwoJCQkJCTI4CT0+ICdGRjAwRkZGRicsCS8vCUNoYXJ0IExpbmUgQ29sb3VyICMyOAoJCQkJCTI5CT0+ICdGRjgwMDA4MCcsCS8vCUNoYXJ0IExpbmUgQ29sb3VyICMyOQoJCQkJCTMwCT0+ICdGRjgwMDAwMCcsCS8vCUNoYXJ0IExpbmUgQ29sb3VyICMzMAoJCQkJCTMxCT0+ICdGRjAwODA4MCcsCS8vCUNoYXJ0IExpbmUgQ29sb3VyICMzMQoJCQkJCTMyCT0+ICdGRjAwMDBGRicsCS8vCUNoYXJ0IExpbmUgQ29sb3VyICMzMgoJCQkJCTMzCT0+ICdGRjAwQ0NGRicsCS8vCVN0YW5kYXJkIENvbG91ciAjMzMKCQkJCQkzNAk9PiAnRkZDQ0ZGRkYnLAkvLwlTdGFuZGFyZCBDb2xvdXIgIzM0CgkJCQkJMzUJPT4gJ0ZGQ0NGRkNDJywJLy8JU3RhbmRhcmQgQ29sb3VyICMzNQoJCQkJCTM2CT0+ICdGRkZGRkY5OScsCS8vCVN0YW5kYXJkIENvbG91ciAjMzYKCQkJCQkzNwk9PiAnRkY5OUNDRkYnLAkvLwlTdGFuZGFyZCBDb2xvdXIgIzM3CgkJCQkJMzgJPT4gJ0ZGRkY5OUNDJywJLy8JU3RhbmRhcmQgQ29sb3VyICMzOAoJCQkJCTM5CT0+ICdGRkNDOTlGRicsCS8vCVN0YW5kYXJkIENvbG91ciAjMzkKCQkJCQk0MAk9PiAnRkZGRkNDOTknLAkvLwlTdGFuZGFyZCBDb2xvdXIgIzQwCgkJCQkJNDEJPT4gJ0ZGMzM2NkZGJywJLy8JU3RhbmRhcmQgQ29sb3VyICM0MQoJCQkJCTQyCT0+ICdGRjMzQ0NDQycsCS8vCVN0YW5kYXJkIENvbG91ciAjNDIKCQkJCQk0Mwk9PiAnRkY5OUNDMDAnLAkvLwlTdGFuZGFyZCBDb2xvdXIgIzQzCgkJCQkJNDQJPT4gJ0ZGRkZDQzAwJywJLy8JU3RhbmRhcmQgQ29sb3VyICM0NAoJCQkJCTQ1CT0+ICdGRkZGOTkwMCcsCS8vCVN0YW5kYXJkIENvbG91ciAjNDUKCQkJCQk0Ngk9PiAnRkZGRjY2MDAnLAkvLwlTdGFuZGFyZCBDb2xvdXIgIzQ2CgkJCQkJNDcJPT4gJ0ZGNjY2Njk5JywJLy8JU3RhbmRhcmQgQ29sb3VyICM0NwoJCQkJCTQ4CT0+ICdGRjk2OTY5NicsCS8vCVN0YW5kYXJkIENvbG91ciAjNDgKCQkJCQk0OQk9PiAnRkYwMDMzNjYnLAkvLwlTdGFuZGFyZCBDb2xvdXIgIzQ5CgkJCQkJNTAJPT4gJ0ZGMzM5OTY2JywJLy8JU3RhbmRhcmQgQ29sb3VyICM1MAoJCQkJCTUxCT0+ICdGRjAwMzMwMCcsCS8vCVN0YW5kYXJkIENvbG91ciAjNTEKCQkJCQk1Mgk9PiAnRkYzMzMzMDAnLAkvLwlTdGFuZGFyZCBDb2xvdXIgIzUyCgkJCQkJNTMJPT4gJ0ZGOTkzMzAwJywJLy8JU3RhbmRhcmQgQ29sb3VyICM1MwoJCQkJCTU0CT0+ICdGRjk5MzM2NicsCS8vCVN0YW5kYXJkIENvbG91ciAjNTQKCQkJCQk1NQk9PiAnRkYzMzMzOTknLAkvLwlTdGFuZGFyZCBDb2xvdXIgIzU1CgkJCQkJNTYJPT4gJ0ZGMzMzMzMzJwkvLwlTdGFuZGFyZCBDb2xvdXIgIzU2CgkJCQkpOwoJCX0KCgkJaWYgKGFycmF5X2tleV9leGlzdHMoJHBJbmRleCwgc2VsZjo6JF9pbmRleGVkQ29sb3JzKSkgewoJCQlyZXR1cm4gbmV3IFBIUEV4Y2VsX1N0eWxlX0NvbG9yKHNlbGY6OiRfaW5kZXhlZENvbG9yc1skcEluZGV4XSk7CgkJfQoKCQlpZiAoJGJhY2tncm91bmQpIHsKCQkJcmV0dXJuIG5ldyBQSFBFeGNlbF9TdHlsZV9Db2xvcignRkZGRkZGRkYnKTsKCQl9CgkJcmV0dXJuIG5ldyBQSFBFeGNlbF9TdHlsZV9Db2xvcignRkYwMDAwMDAnKTsKCX0KCgkvKioKCSAqIEdldCBoYXNoIGNvZGUKCSAqCgkgKiBAcmV0dXJuIHN0cmluZwlIYXNoIGNvZGUKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldEhhc2hDb2RlKCkgewoJCWlmICgkdGhpcy0+X2lzU3VwZXJ2aXNvcikgewoJCQlyZXR1cm4gJHRoaXMtPmdldFNoYXJlZENvbXBvbmVudCgpLT5nZXRIYXNoQ29kZSgpOwoJCX0KCQlyZXR1cm4gbWQ1KAoJCQkgICR0aGlzLT5fYXJnYgoJCQkuIF9fQ0xBU1NfXwoJCSk7Cgl9CgoJLyoqCgkgKiBJbXBsZW1lbnQgUEhQIF9fY2xvbmUgdG8gY3JlYXRlIGEgZGVlcCBjbG9uZSwgbm90IGp1c3QgYSBzaGFsbG93IGNvcHkuCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBfX2Nsb25lKCkgewoJCSR2YXJzID0gZ2V0X29iamVjdF92YXJzKCR0aGlzKTsKCQlmb3JlYWNoICgkdmFycyBhcyAka2V5ID0+ICR2YWx1ZSkgewoJCQlpZiAoKGlzX29iamVjdCgkdmFsdWUpKSAmJiAoJGtleSAhPSAnX3BhcmVudCcpKSB7CgkJCQkkdGhpcy0+JGtleSA9IGNsb25lICR2YWx1ZTsKCQkJfSBlbHNlIHsKCQkJCSR0aGlzLT4ka2V5ID0gJHZhbHVlOwoJCQl9CgkJfQoJfQp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Style/Conditional.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIFBIUEV4Y2VsCiAqCiAqIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICoKICogQGNhdGVnb3J5ICAgUEhQRXhjZWwKICogQHBhY2thZ2UgICAgUEhQRXhjZWxfU3R5bGUKICogQGNvcHlyaWdodCAgQ29weXJpZ2h0IChjKSAyMDA2IC0gMjAxMiBQSFBFeGNlbCAoaHR0cDovL3d3dy5jb2RlcGxleC5jb20vUEhQRXhjZWwpCiAqIEBsaWNlbnNlICAgIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9vbGQtbGljZW5zZXMvbGdwbC0yLjEudHh0CUxHUEwKICogQHZlcnNpb24gICAgMS43LjcsIDIwMTItMDUtMTkKICovCgoKLyoqCiAqIFBIUEV4Y2VsX1N0eWxlX0NvbmRpdGlvbmFsCiAqCiAqIEBjYXRlZ29yeSAgIFBIUEV4Y2VsCiAqIEBwYWNrYWdlICAgIFBIUEV4Y2VsX1N0eWxlCiAqIEBjb3B5cmlnaHQgIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwgKGh0dHA6Ly93d3cuY29kZXBsZXguY29tL1BIUEV4Y2VsKQogKi8KY2xhc3MgUEhQRXhjZWxfU3R5bGVfQ29uZGl0aW9uYWwgaW1wbGVtZW50cyBQSFBFeGNlbF9JQ29tcGFyYWJsZQp7CgkvKiBDb25kaXRpb24gdHlwZXMgKi8KCWNvbnN0IENPTkRJVElPTl9OT05FCQkJCQk9ICdub25lJzsKCWNvbnN0IENPTkRJVElPTl9DRUxMSVMJCQkJCT0gJ2NlbGxJcyc7Cgljb25zdCBDT05ESVRJT05fQ09OVEFJTlNURVhUCQkJPSAnY29udGFpbnNUZXh0JzsKCWNvbnN0IENPTkRJVElPTl9FWFBSRVNTSU9OIAkJCQk9ICdleHByZXNzaW9uJzsKCgkvKiBPcGVyYXRvciB0eXBlcyAqLwoJY29uc3QgT1BFUkFUT1JfTk9ORQkJCQkJCT0gJyc7Cgljb25zdCBPUEVSQVRPUl9CRUdJTlNXSVRICQkJCT0gJ2JlZ2luc1dpdGgnOwoJY29uc3QgT1BFUkFUT1JfRU5EU1dJVEgJCQkJCT0gJ2VuZHNXaXRoJzsKCWNvbnN0IE9QRVJBVE9SX0VRVUFMCQkJCQk9ICdlcXVhbCc7Cgljb25zdCBPUEVSQVRPUl9HUkVBVEVSVEhBTgkJCQk9ICdncmVhdGVyVGhhbic7Cgljb25zdCBPUEVSQVRPUl9HUkVBVEVSVEhBTk9SRVFVQUwJCT0gJ2dyZWF0ZXJUaGFuT3JFcXVhbCc7Cgljb25zdCBPUEVSQVRPUl9MRVNTVEhBTgkJCQkJPSAnbGVzc1RoYW4nOwoJY29uc3QgT1BFUkFUT1JfTEVTU1RIQU5PUkVRVUFMCQkJPSAnbGVzc1RoYW5PckVxdWFsJzsKCWNvbnN0IE9QRVJBVE9SX05PVEVRVUFMCQkJCQk9ICdub3RFcXVhbCc7Cgljb25zdCBPUEVSQVRPUl9DT05UQUlOU1RFWFQJCQkJPSAnY29udGFpbnNUZXh0JzsKCWNvbnN0IE9QRVJBVE9SX05PVENPTlRBSU5TCQkJCT0gJ25vdENvbnRhaW5zJzsKCWNvbnN0IE9QRVJBVE9SX0JFVFdFRU4JCQkJCT0gJ2JldHdlZW4nOwoKCS8qKgoJICogQ29uZGl0aW9uIHR5cGUKCSAqCgkgKiBAdmFyIGludAoJICovCglwcml2YXRlICRfY29uZGl0aW9uVHlwZTsKCgkvKioKCSAqIE9wZXJhdG9yIHR5cGUKCSAqCgkgKiBAdmFyIGludAoJICovCglwcml2YXRlICRfb3BlcmF0b3JUeXBlOwoKCS8qKgoJICogVGV4dAoJICoKCSAqIEB2YXIgc3RyaW5nCgkgKi8KCXByaXZhdGUgJF90ZXh0OwoKCS8qKgoJICogQ29uZGl0aW9uCgkgKgoJICogQHZhciBzdHJpbmdbXQoJICovCglwcml2YXRlICRfY29uZGl0aW9uID0gYXJyYXkoKTsKCgkvKioKCSAqIFN0eWxlCgkgKgoJICogQHZhciBQSFBFeGNlbF9TdHlsZQoJICovCglwcml2YXRlICRfc3R5bGU7CgogICAgLyoqCiAgICAgKiBDcmVhdGUgYSBuZXcgUEhQRXhjZWxfU3R5bGVfQ29uZGl0aW9uYWwKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCkKICAgIHsKICAgIAkvLyBJbml0aWFsaXNlIHZhbHVlcwogICAgCSR0aGlzLT5fY29uZGl0aW9uVHlwZQkJPSBQSFBFeGNlbF9TdHlsZV9Db25kaXRpb25hbDo6Q09ORElUSU9OX05PTkU7CiAgICAJJHRoaXMtPl9vcGVyYXRvclR5cGUJCT0gUEhQRXhjZWxfU3R5bGVfQ29uZGl0aW9uYWw6Ok9QRVJBVE9SX05PTkU7CiAgICAJJHRoaXMtPl90ZXh0ICAgIAkJCT0gbnVsbDsKICAgIAkkdGhpcy0+X2NvbmRpdGlvbgkJCT0gYXJyYXkoKTsKICAgIAkkdGhpcy0+X3N0eWxlCQkJCT0gbmV3IFBIUEV4Y2VsX1N0eWxlKCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBHZXQgQ29uZGl0aW9uIHR5cGUKICAgICAqCiAgICAgKiBAcmV0dXJuIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0Q29uZGl0aW9uVHlwZSgpIHsKICAgIAlyZXR1cm4gJHRoaXMtPl9jb25kaXRpb25UeXBlOwogICAgfQoKICAgIC8qKgogICAgICogU2V0IENvbmRpdGlvbiB0eXBlCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyAkcFZhbHVlCVBIUEV4Y2VsX1N0eWxlX0NvbmRpdGlvbmFsIGNvbmRpdGlvbiB0eXBlCiAgICAgKiBAcmV0dXJuIFBIUEV4Y2VsX1N0eWxlX0NvbmRpdGlvbmFsCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBzZXRDb25kaXRpb25UeXBlKCRwVmFsdWUgPSBQSFBFeGNlbF9TdHlsZV9Db25kaXRpb25hbDo6Q09ORElUSU9OX05PTkUpIHsKICAgIAkkdGhpcy0+X2NvbmRpdGlvblR5cGUgPSAkcFZhbHVlOwogICAgCXJldHVybiAkdGhpczsKICAgIH0KCiAgICAvKioKICAgICAqIEdldCBPcGVyYXRvciB0eXBlCiAgICAgKgogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldE9wZXJhdG9yVHlwZSgpIHsKICAgIAlyZXR1cm4gJHRoaXMtPl9vcGVyYXRvclR5cGU7CiAgICB9CgogICAgLyoqCiAgICAgKiBTZXQgT3BlcmF0b3IgdHlwZQogICAgICoKICAgICAqIEBwYXJhbSBzdHJpbmcgJHBWYWx1ZQlQSFBFeGNlbF9TdHlsZV9Db25kaXRpb25hbCBvcGVyYXRvciB0eXBlCiAgICAgKiBAcmV0dXJuIFBIUEV4Y2VsX1N0eWxlX0NvbmRpdGlvbmFsCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBzZXRPcGVyYXRvclR5cGUoJHBWYWx1ZSA9IFBIUEV4Y2VsX1N0eWxlX0NvbmRpdGlvbmFsOjpPUEVSQVRPUl9OT05FKSB7CiAgICAJJHRoaXMtPl9vcGVyYXRvclR5cGUgPSAkcFZhbHVlOwogICAgCXJldHVybiAkdGhpczsKICAgIH0KCiAgICAvKioKICAgICAqIEdldCB0ZXh0CiAgICAgKgogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldFRleHQoKSB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5fdGV4dDsKICAgIH0KCiAgICAvKioKICAgICAqIFNldCB0ZXh0CiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyAkdmFsdWUKICAgICAqIEByZXR1cm4gUEhQRXhjZWxfU3R5bGVfQ29uZGl0aW9uYWwKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHNldFRleHQoJHZhbHVlID0gbnVsbCkgewogICAgICAgICAgICR0aGlzLT5fdGV4dCA9ICR2YWx1ZTsKICAgICAgICAgICByZXR1cm4gJHRoaXM7CiAgICB9CgogICAgLyoqCiAgICAgKiBHZXQgQ29uZGl0aW9uCiAgICAgKgogICAgICogQGRlcHJlY2F0ZWQgRGVwcmVjYXRlZCwgdXNlIGdldENvbmRpdGlvbnMgaW5zdGVhZAogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldENvbmRpdGlvbigpIHsKICAgIAlpZiAoaXNzZXQoJHRoaXMtPl9jb25kaXRpb25bMF0pKSB7CiAgICAJCXJldHVybiAkdGhpcy0+X2NvbmRpdGlvblswXTsKICAgIAl9CgogICAgCXJldHVybiAnJzsKICAgIH0KCiAgICAvKioKICAgICAqIFNldCBDb25kaXRpb24KICAgICAqCiAgICAgKiBAZGVwcmVjYXRlZCBEZXByZWNhdGVkLCB1c2Ugc2V0Q29uZGl0aW9ucyBpbnN0ZWFkCiAgICAgKiBAcGFyYW0gc3RyaW5nICRwVmFsdWUJQ29uZGl0aW9uCiAgICAgKiBAcmV0dXJuIFBIUEV4Y2VsX1N0eWxlX0NvbmRpdGlvbmFsCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBzZXRDb25kaXRpb24oJHBWYWx1ZSA9ICcnKSB7CiAgICAJaWYgKCFpc19hcnJheSgkcFZhbHVlKSkKICAgIAkJJHBWYWx1ZSA9IGFycmF5KCRwVmFsdWUpOwoKICAgIAlyZXR1cm4gJHRoaXMtPnNldENvbmRpdGlvbnMoJHBWYWx1ZSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBHZXQgQ29uZGl0aW9ucwogICAgICoKICAgICAqIEByZXR1cm4gc3RyaW5nW10KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldENvbmRpdGlvbnMoKSB7CiAgICAJcmV0dXJuICR0aGlzLT5fY29uZGl0aW9uOwogICAgfQoKICAgIC8qKgogICAgICogU2V0IENvbmRpdGlvbnMKICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nW10gJHBWYWx1ZQlDb25kaXRpb24KICAgICAqIEByZXR1cm4gUEhQRXhjZWxfU3R5bGVfQ29uZGl0aW9uYWwKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHNldENvbmRpdGlvbnMoJHBWYWx1ZSkgewogICAgCWlmICghaXNfYXJyYXkoJHBWYWx1ZSkpCiAgICAJCSRwVmFsdWUgPSBhcnJheSgkcFZhbHVlKTsKCiAgICAJJHRoaXMtPl9jb25kaXRpb24gPSAkcFZhbHVlOwogICAgCXJldHVybiAkdGhpczsKICAgIH0KCiAgICAvKioKICAgICAqIEFkZCBDb25kaXRpb24KICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nICRwVmFsdWUJQ29uZGl0aW9uCiAgICAgKiBAcmV0dXJuIFBIUEV4Y2VsX1N0eWxlX0NvbmRpdGlvbmFsCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBhZGRDb25kaXRpb24oJHBWYWx1ZSA9ICcnKSB7CiAgICAJJHRoaXMtPl9jb25kaXRpb25bXSA9ICRwVmFsdWU7CiAgICAJcmV0dXJuICR0aGlzOwogICAgfQoKICAgIC8qKgogICAgICogR2V0IFN0eWxlCiAgICAgKgogICAgICogQHJldHVybiBQSFBFeGNlbF9TdHlsZQogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0U3R5bGUoKSB7CiAgICAJcmV0dXJuICR0aGlzLT5fc3R5bGU7CiAgICB9CgogICAgLyoqCiAgICAgKiBTZXQgU3R5bGUKICAgICAqCiAgICAgKiBAcGFyYW0gCVBIUEV4Y2VsX1N0eWxlICRwVmFsdWUKICAgICAqIEB0aHJvd3MgCUV4Y2VwdGlvbgogICAgICogQHJldHVybiBQSFBFeGNlbF9TdHlsZV9Db25kaXRpb25hbAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gc2V0U3R5bGUoUEhQRXhjZWxfU3R5bGUgJHBWYWx1ZSA9IG51bGwpIHsKICAgCQkkdGhpcy0+X3N0eWxlID0gJHBWYWx1ZTsKICAgCQlyZXR1cm4gJHRoaXM7CiAgICB9CgoJLyoqCgkgKiBHZXQgaGFzaCBjb2RlCgkgKgoJICogQHJldHVybiBzdHJpbmcJSGFzaCBjb2RlCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRIYXNoQ29kZSgpIHsKICAgIAlyZXR1cm4gbWQ1KAogICAgCQkgICR0aGlzLT5fY29uZGl0aW9uVHlwZQogICAgCQkuICR0aGlzLT5fb3BlcmF0b3JUeXBlCiAgICAJCS4gaW1wbG9kZSgnOycsICR0aGlzLT5fY29uZGl0aW9uKQogICAgCQkuICR0aGlzLT5fc3R5bGUtPmdldEhhc2hDb2RlKCkKICAgIAkJLiBfX0NMQVNTX18KICAgIAkpOwogICAgfQoKCS8qKgoJICogSW1wbGVtZW50IFBIUCBfX2Nsb25lIHRvIGNyZWF0ZSBhIGRlZXAgY2xvbmUsIG5vdCBqdXN0IGEgc2hhbGxvdyBjb3B5LgoJICovCglwdWJsaWMgZnVuY3Rpb24gX19jbG9uZSgpIHsKCQkkdmFycyA9IGdldF9vYmplY3RfdmFycygkdGhpcyk7CgkJZm9yZWFjaCAoJHZhcnMgYXMgJGtleSA9PiAkdmFsdWUpIHsKCQkJaWYgKGlzX29iamVjdCgkdmFsdWUpKSB7CgkJCQkkdGhpcy0+JGtleSA9IGNsb25lICR2YWx1ZTsKCQkJfSBlbHNlIHsKCQkJCSR0aGlzLT4ka2V5ID0gJHZhbHVlOwoJCQl9CgkJfQoJfQp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Style/Fill.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIFBIUEV4Y2VsCiAqCiAqIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICoKICogQGNhdGVnb3J5ICAgUEhQRXhjZWwKICogQHBhY2thZ2UJUEhQRXhjZWxfU3R5bGUKICogQGNvcHlyaWdodCAgQ29weXJpZ2h0IChjKSAyMDA2IC0gMjAxMiBQSFBFeGNlbCAoaHR0cDovL3d3dy5jb2RlcGxleC5jb20vUEhQRXhjZWwpCiAqIEBsaWNlbnNlCWh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9vbGQtbGljZW5zZXMvbGdwbC0yLjEudHh0CUxHUEwKICogQHZlcnNpb24JMS43LjcsIDIwMTItMDUtMTkKICovCgoKLyoqCiAqIFBIUEV4Y2VsX1N0eWxlX0ZpbGwKICoKICogQGNhdGVnb3J5ICAgUEhQRXhjZWwKICogQHBhY2thZ2UJUEhQRXhjZWxfU3R5bGUKICogQGNvcHlyaWdodCAgQ29weXJpZ2h0IChjKSAyMDA2IC0gMjAxMiBQSFBFeGNlbCAoaHR0cDovL3d3dy5jb2RlcGxleC5jb20vUEhQRXhjZWwpCiAqLwpjbGFzcyBQSFBFeGNlbF9TdHlsZV9GaWxsIGltcGxlbWVudHMgUEhQRXhjZWxfSUNvbXBhcmFibGUKewoJLyogRmlsbCB0eXBlcyAqLwoJY29uc3QgRklMTF9OT05FCQkJCQkJCT0gJ25vbmUnOwoJY29uc3QgRklMTF9TT0xJRAkJCQkJCT0gJ3NvbGlkJzsKCWNvbnN0IEZJTExfR1JBRElFTlRfTElORUFSCQkJCT0gJ2xpbmVhcic7Cgljb25zdCBGSUxMX0dSQURJRU5UX1BBVEgJCQkJPSAncGF0aCc7Cgljb25zdCBGSUxMX1BBVFRFUk5fREFSS0RPV04JCQkJPSAnZGFya0Rvd24nOwoJY29uc3QgRklMTF9QQVRURVJOX0RBUktHUkFZCQkJCT0gJ2RhcmtHcmF5JzsKCWNvbnN0IEZJTExfUEFUVEVSTl9EQVJLR1JJRAkJCQk9ICdkYXJrR3JpZCc7Cgljb25zdCBGSUxMX1BBVFRFUk5fREFSS0hPUklaT05UQUwJCT0gJ2RhcmtIb3Jpem9udGFsJzsKCWNvbnN0IEZJTExfUEFUVEVSTl9EQVJLVFJFTExJUwkJCT0gJ2RhcmtUcmVsbGlzJzsKCWNvbnN0IEZJTExfUEFUVEVSTl9EQVJLVVAJCQkJPSAnZGFya1VwJzsKCWNvbnN0IEZJTExfUEFUVEVSTl9EQVJLVkVSVElDQUwJCQk9ICdkYXJrVmVydGljYWwnOwoJY29uc3QgRklMTF9QQVRURVJOX0dSQVkwNjI1CQkJCT0gJ2dyYXkwNjI1JzsKCWNvbnN0IEZJTExfUEFUVEVSTl9HUkFZMTI1CQkJCT0gJ2dyYXkxMjUnOwoJY29uc3QgRklMTF9QQVRURVJOX0xJR0hURE9XTgkJCT0gJ2xpZ2h0RG93bic7Cgljb25zdCBGSUxMX1BBVFRFUk5fTElHSFRHUkFZCQkJPSAnbGlnaHRHcmF5JzsKCWNvbnN0IEZJTExfUEFUVEVSTl9MSUdIVEdSSUQJCQk9ICdsaWdodEdyaWQnOwoJY29uc3QgRklMTF9QQVRURVJOX0xJR0hUSE9SSVpPTlRBTAkJPSAnbGlnaHRIb3Jpem9udGFsJzsKCWNvbnN0IEZJTExfUEFUVEVSTl9MSUdIVFRSRUxMSVMJCQk9ICdsaWdodFRyZWxsaXMnOwoJY29uc3QgRklMTF9QQVRURVJOX0xJR0hUVVAJCQkJPSAnbGlnaHRVcCc7Cgljb25zdCBGSUxMX1BBVFRFUk5fTElHSFRWRVJUSUNBTAkJPSAnbGlnaHRWZXJ0aWNhbCc7Cgljb25zdCBGSUxMX1BBVFRFUk5fTUVESVVNR1JBWQkJCT0gJ21lZGl1bUdyYXknOwoKCS8qKgoJICogRmlsbCB0eXBlCgkgKgoJICogQHZhciBzdHJpbmcKCSAqLwoJcHJpdmF0ZSAkX2ZpbGxUeXBlCT0gUEhQRXhjZWxfU3R5bGVfRmlsbDo6RklMTF9OT05FOwoKCS8qKgoJICogUm90YXRpb24KCSAqCgkgKiBAdmFyIGRvdWJsZQoJICovCglwcml2YXRlICRfcm90YXRpb24JPSAwOwoKCS8qKgoJICogU3RhcnQgY29sb3IKCSAqCgkgKiBAdmFyIFBIUEV4Y2VsX1N0eWxlX0NvbG9yCgkgKi8KCXByaXZhdGUgJF9zdGFydENvbG9yOwoKCS8qKgoJICogRW5kIGNvbG9yCgkgKgoJICogQHZhciBQSFBFeGNlbF9TdHlsZV9Db2xvcgoJICovCglwcml2YXRlICRfZW5kQ29sb3I7CgoJLyoqCgkgKiBQYXJlbnQgQm9yZGVycwoJICoKCSAqIEB2YXIgX3BhcmVudFByb3BlcnR5TmFtZSBzdHJpbmcKCSAqLwoJcHJpdmF0ZSAkX3BhcmVudFByb3BlcnR5TmFtZTsKCgkvKioKCSAqIFN1cGVydmlzb3I/CgkgKgoJICogQHZhciBib29sZWFuCgkgKi8KCXByaXZhdGUgJF9pc1N1cGVydmlzb3I7CgoJLyoqCgkgKiBQYXJlbnQuIE9ubHkgdXNlZCBmb3Igc3VwZXJ2aXNvcgoJICoKCSAqIEB2YXIgUEhQRXhjZWxfU3R5bGUKCSAqLwoJcHJpdmF0ZSAkX3BhcmVudDsKCgkvKioKCSAqIENyZWF0ZSBhIG5ldyBQSFBFeGNlbF9TdHlsZV9GaWxsCgkgKgoJICogQHBhcmFtCWJvb2xlYW4JJGlzU3VwZXJ2aXNvcglGbGFnIGluZGljYXRpbmcgaWYgdGhpcyBpcyBhIHN1cGVydmlzb3Igb3Igbm90CgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkaXNTdXBlcnZpc29yID0gZmFsc2UpCgl7CgkJLy8gU3VwZXJ2aXNvcj8KCQkkdGhpcy0+X2lzU3VwZXJ2aXNvciA9ICRpc1N1cGVydmlzb3I7CgoJCS8vIEluaXRpYWxpc2UgdmFsdWVzCgkJJHRoaXMtPl9zdGFydENvbG9yCQkJPSBuZXcgUEhQRXhjZWxfU3R5bGVfQ29sb3IoUEhQRXhjZWxfU3R5bGVfQ29sb3I6OkNPTE9SX1dISVRFLCAkaXNTdXBlcnZpc29yKTsKCQkkdGhpcy0+X2VuZENvbG9yCQkJPSBuZXcgUEhQRXhjZWxfU3R5bGVfQ29sb3IoUEhQRXhjZWxfU3R5bGVfQ29sb3I6OkNPTE9SX0JMQUNLLCAkaXNTdXBlcnZpc29yKTsKCgkJLy8gYmluZCBwYXJlbnQgaWYgd2UgYXJlIGEgc3VwZXJ2aXNvcgoJCWlmICgkaXNTdXBlcnZpc29yKSB7CgkJCSR0aGlzLT5fc3RhcnRDb2xvci0+YmluZFBhcmVudCgkdGhpcywgJ19zdGFydENvbG9yJyk7CgkJCSR0aGlzLT5fZW5kQ29sb3ItPmJpbmRQYXJlbnQoJHRoaXMsICdfZW5kQ29sb3InKTsKCQl9Cgl9CgoJLyoqCgkgKiBCaW5kIHBhcmVudC4gT25seSB1c2VkIGZvciBzdXBlcnZpc29yCgkgKgoJICogQHBhcmFtIFBIUEV4Y2VsX1N0eWxlICRwYXJlbnQKCSAqIEByZXR1cm4gUEhQRXhjZWxfU3R5bGVfRmlsbAoJICovCglwdWJsaWMgZnVuY3Rpb24gYmluZFBhcmVudCgkcGFyZW50KQoJewoJCSR0aGlzLT5fcGFyZW50ID0gJHBhcmVudDsKCQlyZXR1cm4gJHRoaXM7Cgl9CgoJLyoqCgkgKiBJcyB0aGlzIGEgc3VwZXJ2aXNvciBvciBhIHJlYWwgc3R5bGUgY29tcG9uZW50PwoJICoKCSAqIEByZXR1cm4gYm9vbGVhbgoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0SXNTdXBlcnZpc29yKCkKCXsKCQlyZXR1cm4gJHRoaXMtPl9pc1N1cGVydmlzb3I7Cgl9CgoJLyoqCgkgKiBHZXQgdGhlIHNoYXJlZCBzdHlsZSBjb21wb25lbnQgZm9yIHRoZSBjdXJyZW50bHkgYWN0aXZlIGNlbGwgaW4gY3VycmVudGx5IGFjdGl2ZSBzaGVldC4KCSAqIE9ubHkgdXNlZCBmb3Igc3R5bGUgc3VwZXJ2aXNvcgoJICoKCSAqIEByZXR1cm4gUEhQRXhjZWxfU3R5bGVfRmlsbAoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0U2hhcmVkQ29tcG9uZW50KCkKCXsKCQlyZXR1cm4gJHRoaXMtPl9wYXJlbnQtPmdldFNoYXJlZENvbXBvbmVudCgpLT5nZXRGaWxsKCk7Cgl9CgoJLyoqCgkgKiBHZXQgdGhlIGN1cnJlbnRseSBhY3RpdmUgc2hlZXQuIE9ubHkgdXNlZCBmb3Igc3VwZXJ2aXNvcgoJICoKCSAqIEByZXR1cm4gUEhQRXhjZWxfV29ya3NoZWV0CgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRBY3RpdmVTaGVldCgpCgl7CgkJcmV0dXJuICR0aGlzLT5fcGFyZW50LT5nZXRBY3RpdmVTaGVldCgpOwoJfQoKCS8qKgoJICogR2V0IHRoZSBjdXJyZW50bHkgYWN0aXZlIGNlbGwgY29vcmRpbmF0ZSBpbiBjdXJyZW50bHkgYWN0aXZlIHNoZWV0LgoJICogT25seSB1c2VkIGZvciBzdXBlcnZpc29yCgkgKgoJICogQHJldHVybiBzdHJpbmcgRS5nLiAnQTEnCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRTZWxlY3RlZENlbGxzKCkKCXsKCQlyZXR1cm4gJHRoaXMtPmdldEFjdGl2ZVNoZWV0KCktPmdldFNlbGVjdGVkQ2VsbHMoKTsKCX0KCgkvKioKCSAqIEdldCB0aGUgY3VycmVudGx5IGFjdGl2ZSBjZWxsIGNvb3JkaW5hdGUgaW4gY3VycmVudGx5IGFjdGl2ZSBzaGVldC4KCSAqIE9ubHkgdXNlZCBmb3Igc3VwZXJ2aXNvcgoJICoKCSAqIEByZXR1cm4gc3RyaW5nIEUuZy4gJ0ExJwoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0QWN0aXZlQ2VsbCgpCgl7CgkJcmV0dXJuICR0aGlzLT5nZXRBY3RpdmVTaGVldCgpLT5nZXRBY3RpdmVDZWxsKCk7Cgl9CgoJLyoqCgkgKiBCdWlsZCBzdHlsZSBhcnJheSBmcm9tIHN1YmNvbXBvbmVudHMKCSAqCgkgKiBAcGFyYW0gYXJyYXkgJGFycmF5CgkgKiBAcmV0dXJuIGFycmF5CgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRTdHlsZUFycmF5KCRhcnJheSkKCXsKCQlyZXR1cm4gYXJyYXkoJ2ZpbGwnID0+ICRhcnJheSk7Cgl9CgoJLyoqCgkgKiBBcHBseSBzdHlsZXMgZnJvbSBhcnJheQoJICoKCSAqIDxjb2RlPgoJICogJG9ialBIUEV4Y2VsLT5nZXRBY3RpdmVTaGVldCgpLT5nZXRTdHlsZSgnQjInKS0+Z2V0RmlsbCgpLT5hcHBseUZyb21BcnJheSgKCSAqCQlhcnJheSgKCSAqCQkJJ3R5cGUnCSAgID0+IFBIUEV4Y2VsX1N0eWxlX0ZpbGw6OkZJTExfR1JBRElFTlRfTElORUFSLAoJICoJCQkncm90YXRpb24nICAgPT4gMCwKCSAqCQkJJ3N0YXJ0Y29sb3InID0+IGFycmF5KAoJICoJCQkJJ3JnYicgPT4gJzAwMDAwMCcKCSAqCQkJKSwKCSAqCQkJJ2VuZGNvbG9yJyAgID0+IGFycmF5KAoJICoJCQkJJ2FyZ2InID0+ICdGRkZGRkZGRicKCSAqCQkJKQoJICoJCSkKCSAqICk7CgkgKiA8L2NvZGU+CgkgKgoJICogQHBhcmFtCWFycmF5CSRwU3R5bGVzCUFycmF5IGNvbnRhaW5pbmcgc3R5bGUgaW5mb3JtYXRpb24KCSAqIEB0aHJvd3MJRXhjZXB0aW9uCgkgKiBAcmV0dXJuIFBIUEV4Y2VsX1N0eWxlX0ZpbGwKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGFwcGx5RnJvbUFycmF5KCRwU3R5bGVzID0gbnVsbCkgewoJCWlmIChpc19hcnJheSgkcFN0eWxlcykpIHsKCQkJaWYgKCR0aGlzLT5faXNTdXBlcnZpc29yKSB7CgkJCQkkdGhpcy0+Z2V0QWN0aXZlU2hlZXQoKS0+Z2V0U3R5bGUoJHRoaXMtPmdldFNlbGVjdGVkQ2VsbHMoKSktPmFwcGx5RnJvbUFycmF5KCR0aGlzLT5nZXRTdHlsZUFycmF5KCRwU3R5bGVzKSk7CgkJCX0gZWxzZSB7CgkJCQlpZiAoYXJyYXlfa2V5X2V4aXN0cygndHlwZScsICRwU3R5bGVzKSkgewoJCQkJCSR0aGlzLT5zZXRGaWxsVHlwZSgkcFN0eWxlc1sndHlwZSddKTsKCQkJCX0KCQkJCWlmIChhcnJheV9rZXlfZXhpc3RzKCdyb3RhdGlvbicsICRwU3R5bGVzKSkgewoJCQkJCSR0aGlzLT5zZXRSb3RhdGlvbigkcFN0eWxlc1sncm90YXRpb24nXSk7CgkJCQl9CgkJCQlpZiAoYXJyYXlfa2V5X2V4aXN0cygnc3RhcnRjb2xvcicsICRwU3R5bGVzKSkgewoJCQkJCSR0aGlzLT5nZXRTdGFydENvbG9yKCktPmFwcGx5RnJvbUFycmF5KCRwU3R5bGVzWydzdGFydGNvbG9yJ10pOwoJCQkJfQoJCQkJaWYgKGFycmF5X2tleV9leGlzdHMoJ2VuZGNvbG9yJywgJHBTdHlsZXMpKSB7CgkJCQkJJHRoaXMtPmdldEVuZENvbG9yKCktPmFwcGx5RnJvbUFycmF5KCRwU3R5bGVzWydlbmRjb2xvciddKTsKCQkJCX0KCQkJCWlmIChhcnJheV9rZXlfZXhpc3RzKCdjb2xvcicsICRwU3R5bGVzKSkgewoJCQkJCSR0aGlzLT5nZXRTdGFydENvbG9yKCktPmFwcGx5RnJvbUFycmF5KCRwU3R5bGVzWydjb2xvciddKTsKCQkJCX0KCQkJfQoJCX0gZWxzZSB7CgkJCXRocm93IG5ldyBFeGNlcHRpb24oIkludmFsaWQgc3R5bGUgYXJyYXkgcGFzc2VkLiIpOwoJCX0KCQlyZXR1cm4gJHRoaXM7Cgl9CgoJLyoqCgkgKiBHZXQgRmlsbCBUeXBlCgkgKgoJICogQHJldHVybiBzdHJpbmcKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldEZpbGxUeXBlKCkgewoJCWlmICgkdGhpcy0+X2lzU3VwZXJ2aXNvcikgewoJCQlyZXR1cm4gJHRoaXMtPmdldFNoYXJlZENvbXBvbmVudCgpLT5nZXRGaWxsVHlwZSgpOwoJCX0KCQlyZXR1cm4gJHRoaXMtPl9maWxsVHlwZTsKCX0KCgkvKioKCSAqIFNldCBGaWxsIFR5cGUKCSAqCgkgKiBAcGFyYW0gc3RyaW5nICRwVmFsdWUJUEhQRXhjZWxfU3R5bGVfRmlsbCBmaWxsIHR5cGUKCSAqIEByZXR1cm4gUEhQRXhjZWxfU3R5bGVfRmlsbAoJICovCglwdWJsaWMgZnVuY3Rpb24gc2V0RmlsbFR5cGUoJHBWYWx1ZSA9IFBIUEV4Y2VsX1N0eWxlX0ZpbGw6OkZJTExfTk9ORSkgewoJCWlmICgkdGhpcy0+X2lzU3VwZXJ2aXNvcikgewoJCQkkc3R5bGVBcnJheSA9ICR0aGlzLT5nZXRTdHlsZUFycmF5KGFycmF5KCd0eXBlJyA9PiAkcFZhbHVlKSk7CgkJCSR0aGlzLT5nZXRBY3RpdmVTaGVldCgpLT5nZXRTdHlsZSgkdGhpcy0+Z2V0U2VsZWN0ZWRDZWxscygpKS0+YXBwbHlGcm9tQXJyYXkoJHN0eWxlQXJyYXkpOwoJCX0gZWxzZSB7CgkJCSR0aGlzLT5fZmlsbFR5cGUgPSAkcFZhbHVlOwoJCX0KCQlyZXR1cm4gJHRoaXM7Cgl9CgoJLyoqCgkgKiBHZXQgUm90YXRpb24KCSAqCgkgKiBAcmV0dXJuIGRvdWJsZQoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0Um90YXRpb24oKSB7CgkJaWYgKCR0aGlzLT5faXNTdXBlcnZpc29yKSB7CgkJCXJldHVybiAkdGhpcy0+Z2V0U2hhcmVkQ29tcG9uZW50KCktPmdldFJvdGF0aW9uKCk7CgkJfQoJCXJldHVybiAkdGhpcy0+X3JvdGF0aW9uOwoJfQoKCS8qKgoJICogU2V0IFJvdGF0aW9uCgkgKgoJICogQHBhcmFtIGRvdWJsZSAkcFZhbHVlCgkgKiBAcmV0dXJuIFBIUEV4Y2VsX1N0eWxlX0ZpbGwKCSAqLwoJcHVibGljIGZ1bmN0aW9uIHNldFJvdGF0aW9uKCRwVmFsdWUgPSAwKSB7CgkJaWYgKCR0aGlzLT5faXNTdXBlcnZpc29yKSB7CgkJCSRzdHlsZUFycmF5ID0gJHRoaXMtPmdldFN0eWxlQXJyYXkoYXJyYXkoJ3JvdGF0aW9uJyA9PiAkcFZhbHVlKSk7CgkJCSR0aGlzLT5nZXRBY3RpdmVTaGVldCgpLT5nZXRTdHlsZSgkdGhpcy0+Z2V0U2VsZWN0ZWRDZWxscygpKS0+YXBwbHlGcm9tQXJyYXkoJHN0eWxlQXJyYXkpOwoJCX0gZWxzZSB7CgkJCSR0aGlzLT5fcm90YXRpb24gPSAkcFZhbHVlOwoJCX0KCQlyZXR1cm4gJHRoaXM7Cgl9CgoJLyoqCgkgKiBHZXQgU3RhcnQgQ29sb3IKCSAqCgkgKiBAcmV0dXJuIFBIUEV4Y2VsX1N0eWxlX0NvbG9yCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRTdGFydENvbG9yKCkgewoJCXJldHVybiAkdGhpcy0+X3N0YXJ0Q29sb3I7Cgl9CgoJLyoqCgkgKiBTZXQgU3RhcnQgQ29sb3IKCSAqCgkgKiBAcGFyYW0JUEhQRXhjZWxfU3R5bGVfQ29sb3IgJHBWYWx1ZQoJICogQHRocm93cwlFeGNlcHRpb24KCSAqIEByZXR1cm4gUEhQRXhjZWxfU3R5bGVfRmlsbAoJICovCglwdWJsaWMgZnVuY3Rpb24gc2V0U3RhcnRDb2xvcihQSFBFeGNlbF9TdHlsZV9Db2xvciAkcFZhbHVlID0gbnVsbCkgewoJCS8vIG1ha2Ugc3VyZSBwYXJhbWV0ZXIgaXMgYSByZWFsIGNvbG9yIGFuZCBub3QgYSBzdXBlcnZpc29yCgkJJGNvbG9yID0gJHBWYWx1ZS0+Z2V0SXNTdXBlcnZpc29yKCkgPyAkcFZhbHVlLT5nZXRTaGFyZWRDb21wb25lbnQoKSA6ICRwVmFsdWU7CgoJCWlmICgkdGhpcy0+X2lzU3VwZXJ2aXNvcikgewoJCQkkc3R5bGVBcnJheSA9ICR0aGlzLT5nZXRTdGFydENvbG9yKCktPmdldFN0eWxlQXJyYXkoYXJyYXkoJ2FyZ2InID0+ICRjb2xvci0+Z2V0QVJHQigpKSk7CgkJCSR0aGlzLT5nZXRBY3RpdmVTaGVldCgpLT5nZXRTdHlsZSgkdGhpcy0+Z2V0U2VsZWN0ZWRDZWxscygpKS0+YXBwbHlGcm9tQXJyYXkoJHN0eWxlQXJyYXkpOwoJCX0gZWxzZSB7CgkJCSR0aGlzLT5fc3RhcnRDb2xvciA9ICRjb2xvcjsKCQl9CgkJcmV0dXJuICR0aGlzOwoJfQoKCS8qKgoJICogR2V0IEVuZCBDb2xvcgoJICoKCSAqIEByZXR1cm4gUEhQRXhjZWxfU3R5bGVfQ29sb3IKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldEVuZENvbG9yKCkgewoJCXJldHVybiAkdGhpcy0+X2VuZENvbG9yOwoJfQoKCS8qKgoJICogU2V0IEVuZCBDb2xvcgoJICoKCSAqIEBwYXJhbQlQSFBFeGNlbF9TdHlsZV9Db2xvciAkcFZhbHVlCgkgKiBAdGhyb3dzCUV4Y2VwdGlvbgoJICogQHJldHVybiBQSFBFeGNlbF9TdHlsZV9GaWxsCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBzZXRFbmRDb2xvcihQSFBFeGNlbF9TdHlsZV9Db2xvciAkcFZhbHVlID0gbnVsbCkgewoJCS8vIG1ha2Ugc3VyZSBwYXJhbWV0ZXIgaXMgYSByZWFsIGNvbG9yIGFuZCBub3QgYSBzdXBlcnZpc29yCgkJJGNvbG9yID0gJHBWYWx1ZS0+Z2V0SXNTdXBlcnZpc29yKCkgPyAkcFZhbHVlLT5nZXRTaGFyZWRDb21wb25lbnQoKSA6ICRwVmFsdWU7CgoJCWlmICgkdGhpcy0+X2lzU3VwZXJ2aXNvcikgewoJCQkkc3R5bGVBcnJheSA9ICR0aGlzLT5nZXRFbmRDb2xvcigpLT5nZXRTdHlsZUFycmF5KGFycmF5KCdhcmdiJyA9PiAkY29sb3ItPmdldEFSR0IoKSkpOwoJCQkkdGhpcy0+Z2V0QWN0aXZlU2hlZXQoKS0+Z2V0U3R5bGUoJHRoaXMtPmdldFNlbGVjdGVkQ2VsbHMoKSktPmFwcGx5RnJvbUFycmF5KCRzdHlsZUFycmF5KTsKCQl9IGVsc2UgewoJCQkkdGhpcy0+X2VuZENvbG9yID0gJGNvbG9yOwoJCX0KCQlyZXR1cm4gJHRoaXM7Cgl9CgoJLyoqCgkgKiBHZXQgaGFzaCBjb2RlCgkgKgoJICogQHJldHVybiBzdHJpbmcJSGFzaCBjb2RlCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRIYXNoQ29kZSgpIHsKCQlpZiAoJHRoaXMtPl9pc1N1cGVydmlzb3IpIHsKCQkJcmV0dXJuICR0aGlzLT5nZXRTaGFyZWRDb21wb25lbnQoKS0+Z2V0SGFzaENvZGUoKTsKCQl9CgkJcmV0dXJuIG1kNSgKCQkJICAkdGhpcy0+Z2V0RmlsbFR5cGUoKQoJCQkuICR0aGlzLT5nZXRSb3RhdGlvbigpCgkJCS4gJHRoaXMtPmdldFN0YXJ0Q29sb3IoKS0+Z2V0SGFzaENvZGUoKQoJCQkuICR0aGlzLT5nZXRFbmRDb2xvcigpLT5nZXRIYXNoQ29kZSgpCgkJCS4gX19DTEFTU19fCgkJKTsKCX0KCgkvKioKCSAqIEltcGxlbWVudCBQSFAgX19jbG9uZSB0byBjcmVhdGUgYSBkZWVwIGNsb25lLCBub3QganVzdCBhIHNoYWxsb3cgY29weS4KCSAqLwoJcHVibGljIGZ1bmN0aW9uIF9fY2xvbmUoKSB7CgkJJHZhcnMgPSBnZXRfb2JqZWN0X3ZhcnMoJHRoaXMpOwoJCWZvcmVhY2ggKCR2YXJzIGFzICRrZXkgPT4gJHZhbHVlKSB7CgkJCWlmICgoaXNfb2JqZWN0KCR2YWx1ZSkpICYmICgka2V5ICE9ICdfcGFyZW50JykpIHsKCQkJCSR0aGlzLT4ka2V5ID0gY2xvbmUgJHZhbHVlOwoJCQl9IGVsc2UgewoJCQkJJHRoaXMtPiRrZXkgPSAkdmFsdWU7CgkJCX0KCQl9Cgl9Cn0K]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Style/Font.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIFBIUEV4Y2VsCiAqCiAqIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICoKICogQGNhdGVnb3J5ICAgUEhQRXhjZWwKICogQHBhY2thZ2UJUEhQRXhjZWxfU3R5bGUKICogQGNvcHlyaWdodCAgQ29weXJpZ2h0IChjKSAyMDA2IC0gMjAxMiBQSFBFeGNlbCAoaHR0cDovL3d3dy5jb2RlcGxleC5jb20vUEhQRXhjZWwpCiAqIEBsaWNlbnNlCWh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9vbGQtbGljZW5zZXMvbGdwbC0yLjEudHh0CUxHUEwKICogQHZlcnNpb24JMS43LjcsIDIwMTItMDUtMTkKICovCgoKLyoqCiAqIFBIUEV4Y2VsX1N0eWxlX0ZvbnQKICoKICogQGNhdGVnb3J5ICAgUEhQRXhjZWwKICogQHBhY2thZ2UJUEhQRXhjZWxfU3R5bGUKICogQGNvcHlyaWdodCAgQ29weXJpZ2h0IChjKSAyMDA2IC0gMjAxMiBQSFBFeGNlbCAoaHR0cDovL3d3dy5jb2RlcGxleC5jb20vUEhQRXhjZWwpCiAqLwpjbGFzcyBQSFBFeGNlbF9TdHlsZV9Gb250IGltcGxlbWVudHMgUEhQRXhjZWxfSUNvbXBhcmFibGUKewoJLyogVW5kZXJsaW5lIHR5cGVzICovCgljb25zdCBVTkRFUkxJTkVfTk9ORQkJCQkJPSAnbm9uZSc7Cgljb25zdCBVTkRFUkxJTkVfRE9VQkxFCQkJCQk9ICdkb3VibGUnOwoJY29uc3QgVU5ERVJMSU5FX0RPVUJMRUFDQ09VTlRJTkcJCT0gJ2RvdWJsZUFjY291bnRpbmcnOwoJY29uc3QgVU5ERVJMSU5FX1NJTkdMRQkJCQkJPSAnc2luZ2xlJzsKCWNvbnN0IFVOREVSTElORV9TSU5HTEVBQ0NPVU5USU5HCQk9ICdzaW5nbGVBY2NvdW50aW5nJzsKCgkvKioKCSAqIEZvbnQgTmFtZQoJICoKCSAqIEB2YXIgc3RyaW5nCgkgKi8KCXByaXZhdGUgJF9uYW1lCQkJPSAnQ2FsaWJyaSc7CgoJLyoqCgkgKiBGb250IFNpemUKCSAqCgkgKiBAdmFyIGZsb2F0CgkgKi8KCXByaXZhdGUgJF9zaXplCQkJPSAxMTsKCgkvKioKCSAqIEJvbGQKCSAqCgkgKiBAdmFyIGJvb2xlYW4KCSAqLwoJcHJpdmF0ZSAkX2JvbGQJCQk9IGZhbHNlOwoKCS8qKgoJICogSXRhbGljCgkgKgoJICogQHZhciBib29sZWFuCgkgKi8KCXByaXZhdGUgJF9pdGFsaWMJCT0gZmFsc2U7CgoJLyoqCgkgKiBTdXBlcnNjcmlwdAoJICoKCSAqIEB2YXIgYm9vbGVhbgoJICovCglwcml2YXRlICRfc3VwZXJTY3JpcHQJPSBmYWxzZTsKCgkvKioKCSAqIFN1YnNjcmlwdAoJICoKCSAqIEB2YXIgYm9vbGVhbgoJICovCglwcml2YXRlICRfc3ViU2NyaXB0CQk9IGZhbHNlOwoKCS8qKgoJICogVW5kZXJsaW5lCgkgKgoJICogQHZhciBzdHJpbmcKCSAqLwoJcHJpdmF0ZSAkX3VuZGVybGluZQkJPSBQSFBFeGNlbF9TdHlsZV9Gb250OjpVTkRFUkxJTkVfTk9ORTsKCgkvKioKCSAqIFN0cmlrZXRocm91Z2gKCSAqCgkgKiBAdmFyIGJvb2xlYW4KCSAqLwoJcHJpdmF0ZSAkX3N0cmlrZXRocm91Z2gJPSBmYWxzZTsKCgkvKioKCSAqIEZvcmVncm91bmQgY29sb3IKCSAqCgkgKiBAdmFyIFBIUEV4Y2VsX1N0eWxlX0NvbG9yCgkgKi8KCXByaXZhdGUgJF9jb2xvcjsKCgkvKioKCSAqIFBhcmVudCBCb3JkZXJzCgkgKgoJICogQHZhciBfcGFyZW50UHJvcGVydHlOYW1lIHN0cmluZwoJICovCglwcml2YXRlICRfcGFyZW50UHJvcGVydHlOYW1lOwoKCS8qKgoJICogU3VwZXJ2aXNvcj8KCSAqCgkgKiBAdmFyIGJvb2xlYW4KCSAqLwoJcHJpdmF0ZSAkX2lzU3VwZXJ2aXNvcjsKCgkvKioKCSAqIFBhcmVudC4gT25seSB1c2VkIGZvciBzdXBlcnZpc29yCgkgKgoJICogQHZhciBQSFBFeGNlbF9TdHlsZQoJICovCglwcml2YXRlICRfcGFyZW50OwoKCS8qKgoJICogQ3JlYXRlIGEgbmV3IFBIUEV4Y2VsX1N0eWxlX0ZvbnQKCSAqCgkgKiBAcGFyYW0JYm9vbGVhbgkkaXNTdXBlcnZpc29yCUZsYWcgaW5kaWNhdGluZyBpZiB0aGlzIGlzIGEgc3VwZXJ2aXNvciBvciBub3QKCSAqLwoJcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRpc1N1cGVydmlzb3IgPSBmYWxzZSkKCXsKCQkvLyBTdXBlcnZpc29yPwoJCSR0aGlzLT5faXNTdXBlcnZpc29yID0gJGlzU3VwZXJ2aXNvcjsKCgkJLy8gSW5pdGlhbGlzZSB2YWx1ZXMKCQkkdGhpcy0+X2NvbG9yCQkJCT0gbmV3IFBIUEV4Y2VsX1N0eWxlX0NvbG9yKFBIUEV4Y2VsX1N0eWxlX0NvbG9yOjpDT0xPUl9CTEFDSywgJGlzU3VwZXJ2aXNvcik7CgoJCS8vIGJpbmQgcGFyZW50IGlmIHdlIGFyZSBhIHN1cGVydmlzb3IKCQlpZiAoJGlzU3VwZXJ2aXNvcikgewoJCQkkdGhpcy0+X2NvbG9yLT5iaW5kUGFyZW50KCR0aGlzLCAnX2NvbG9yJyk7CgkJfQoJfQoKCS8qKgoJICogQmluZCBwYXJlbnQuIE9ubHkgdXNlZCBmb3Igc3VwZXJ2aXNvcgoJICoKCSAqIEBwYXJhbSBQSFBFeGNlbF9TdHlsZSAkcGFyZW50CgkgKiBAcmV0dXJuIFBIUEV4Y2VsX1N0eWxlX0ZvbnQKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGJpbmRQYXJlbnQoJHBhcmVudCkKCXsKCQkkdGhpcy0+X3BhcmVudCA9ICRwYXJlbnQ7Cgl9CgoJLyoqCgkgKiBJcyB0aGlzIGEgc3VwZXJ2aXNvciBvciBhIHJlYWwgc3R5bGUgY29tcG9uZW50PwoJICoKCSAqIEByZXR1cm4gYm9vbGVhbgoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0SXNTdXBlcnZpc29yKCkKCXsKCQlyZXR1cm4gJHRoaXMtPl9pc1N1cGVydmlzb3I7Cgl9CgoJLyoqCgkgKiBHZXQgdGhlIHNoYXJlZCBzdHlsZSBjb21wb25lbnQgZm9yIHRoZSBjdXJyZW50bHkgYWN0aXZlIGNlbGwgaW4gY3VycmVudGx5IGFjdGl2ZSBzaGVldC4KCSAqIE9ubHkgdXNlZCBmb3Igc3R5bGUgc3VwZXJ2aXNvcgoJICoKCSAqIEByZXR1cm4gUEhQRXhjZWxfU3R5bGVfRm9udAoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0U2hhcmVkQ29tcG9uZW50KCkKCXsKCQlyZXR1cm4gJHRoaXMtPl9wYXJlbnQtPmdldFNoYXJlZENvbXBvbmVudCgpLT5nZXRGb250KCk7Cgl9CgoJLyoqCgkgKiBHZXQgdGhlIGN1cnJlbnRseSBhY3RpdmUgc2hlZXQuIE9ubHkgdXNlZCBmb3Igc3VwZXJ2aXNvcgoJICoKCSAqIEByZXR1cm4gUEhQRXhjZWxfV29ya3NoZWV0CgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRBY3RpdmVTaGVldCgpCgl7CgkJcmV0dXJuICR0aGlzLT5fcGFyZW50LT5nZXRBY3RpdmVTaGVldCgpOwoJfQoKCS8qKgoJICogR2V0IHRoZSBjdXJyZW50bHkgYWN0aXZlIGNlbGwgY29vcmRpbmF0ZSBpbiBjdXJyZW50bHkgYWN0aXZlIHNoZWV0LgoJICogT25seSB1c2VkIGZvciBzdXBlcnZpc29yCgkgKgoJICogQHJldHVybiBzdHJpbmcgRS5nLiAnQTEnCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRTZWxlY3RlZENlbGxzKCkKCXsKCQlyZXR1cm4gJHRoaXMtPmdldEFjdGl2ZVNoZWV0KCktPmdldFNlbGVjdGVkQ2VsbHMoKTsKCX0KCgkvKioKCSAqIEdldCB0aGUgY3VycmVudGx5IGFjdGl2ZSBjZWxsIGNvb3JkaW5hdGUgaW4gY3VycmVudGx5IGFjdGl2ZSBzaGVldC4KCSAqIE9ubHkgdXNlZCBmb3Igc3VwZXJ2aXNvcgoJICoKCSAqIEByZXR1cm4gc3RyaW5nIEUuZy4gJ0ExJwoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0QWN0aXZlQ2VsbCgpCgl7CgkJcmV0dXJuICR0aGlzLT5nZXRBY3RpdmVTaGVldCgpLT5nZXRBY3RpdmVDZWxsKCk7Cgl9CgoJLyoqCgkgKiBCdWlsZCBzdHlsZSBhcnJheSBmcm9tIHN1YmNvbXBvbmVudHMKCSAqCgkgKiBAcGFyYW0gYXJyYXkgJGFycmF5CgkgKiBAcmV0dXJuIGFycmF5CgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRTdHlsZUFycmF5KCRhcnJheSkKCXsKCQlyZXR1cm4gYXJyYXkoJ2ZvbnQnID0+ICRhcnJheSk7Cgl9CgoJLyoqCgkgKiBBcHBseSBzdHlsZXMgZnJvbSBhcnJheQoJICoKCSAqIDxjb2RlPgoJICogJG9ialBIUEV4Y2VsLT5nZXRBY3RpdmVTaGVldCgpLT5nZXRTdHlsZSgnQjInKS0+Z2V0Rm9udCgpLT5hcHBseUZyb21BcnJheSgKCSAqCQlhcnJheSgKCSAqCQkJJ25hbWUnCSAgPT4gJ0FyaWFsJywKCSAqCQkJJ2JvbGQnCSAgPT4gdHJ1ZSwKCSAqCQkJJ2l0YWxpYycJPT4gZmFsc2UsCgkgKgkJCSd1bmRlcmxpbmUnID0+IFBIUEV4Y2VsX1N0eWxlX0ZvbnQ6OlVOREVSTElORV9ET1VCTEUsCgkgKgkJCSdzdHJpa2UnCT0+IGZhbHNlLAoJICoJCQknY29sb3InCSA9PiBhcnJheSgKCSAqCQkJCSdyZ2InID0+ICc4MDgwODAnCgkgKgkJCSkKCSAqCQkpCgkgKiApOwoJICogPC9jb2RlPgoJICoKCSAqIEBwYXJhbQlhcnJheQkkcFN0eWxlcwlBcnJheSBjb250YWluaW5nIHN0eWxlIGluZm9ybWF0aW9uCgkgKiBAdGhyb3dzCUV4Y2VwdGlvbgoJICogQHJldHVybiBQSFBFeGNlbF9TdHlsZV9Gb250CgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBhcHBseUZyb21BcnJheSgkcFN0eWxlcyA9IG51bGwpIHsKCQlpZiAoaXNfYXJyYXkoJHBTdHlsZXMpKSB7CgkJCWlmICgkdGhpcy0+X2lzU3VwZXJ2aXNvcikgewoJCQkJJHRoaXMtPmdldEFjdGl2ZVNoZWV0KCktPmdldFN0eWxlKCR0aGlzLT5nZXRTZWxlY3RlZENlbGxzKCkpLT5hcHBseUZyb21BcnJheSgkdGhpcy0+Z2V0U3R5bGVBcnJheSgkcFN0eWxlcykpOwoJCQl9IGVsc2UgewoJCQkJaWYgKGFycmF5X2tleV9leGlzdHMoJ25hbWUnLCAkcFN0eWxlcykpIHsKCQkJCQkkdGhpcy0+c2V0TmFtZSgkcFN0eWxlc1snbmFtZSddKTsKCQkJCX0KCQkJCWlmIChhcnJheV9rZXlfZXhpc3RzKCdib2xkJywgJHBTdHlsZXMpKSB7CgkJCQkJJHRoaXMtPnNldEJvbGQoJHBTdHlsZXNbJ2JvbGQnXSk7CgkJCQl9CgkJCQlpZiAoYXJyYXlfa2V5X2V4aXN0cygnaXRhbGljJywgJHBTdHlsZXMpKSB7CgkJCQkJJHRoaXMtPnNldEl0YWxpYygkcFN0eWxlc1snaXRhbGljJ10pOwoJCQkJfQoJCQkJaWYgKGFycmF5X2tleV9leGlzdHMoJ3N1cGVyU2NyaXB0JywgJHBTdHlsZXMpKSB7CgkJCQkJJHRoaXMtPnNldFN1cGVyU2NyaXB0KCRwU3R5bGVzWydzdXBlclNjcmlwdCddKTsKCQkJCX0KCQkJCWlmIChhcnJheV9rZXlfZXhpc3RzKCdzdWJTY3JpcHQnLCAkcFN0eWxlcykpIHsKCQkJCQkkdGhpcy0+c2V0U3ViU2NyaXB0KCRwU3R5bGVzWydzdWJTY3JpcHQnXSk7CgkJCQl9CgkJCQlpZiAoYXJyYXlfa2V5X2V4aXN0cygndW5kZXJsaW5lJywgJHBTdHlsZXMpKSB7CgkJCQkJJHRoaXMtPnNldFVuZGVybGluZSgkcFN0eWxlc1sndW5kZXJsaW5lJ10pOwoJCQkJfQoJCQkJaWYgKGFycmF5X2tleV9leGlzdHMoJ3N0cmlrZScsICRwU3R5bGVzKSkgewoJCQkJCSR0aGlzLT5zZXRTdHJpa2V0aHJvdWdoKCRwU3R5bGVzWydzdHJpa2UnXSk7CgkJCQl9CgkJCQlpZiAoYXJyYXlfa2V5X2V4aXN0cygnY29sb3InLCAkcFN0eWxlcykpIHsKCQkJCQkkdGhpcy0+Z2V0Q29sb3IoKS0+YXBwbHlGcm9tQXJyYXkoJHBTdHlsZXNbJ2NvbG9yJ10pOwoJCQkJfQoJCQkJaWYgKGFycmF5X2tleV9leGlzdHMoJ3NpemUnLCAkcFN0eWxlcykpIHsKCQkJCQkkdGhpcy0+c2V0U2l6ZSgkcFN0eWxlc1snc2l6ZSddKTsKCQkJCX0KCQkJfQoJCX0gZWxzZSB7CgkJCXRocm93IG5ldyBFeGNlcHRpb24oIkludmFsaWQgc3R5bGUgYXJyYXkgcGFzc2VkLiIpOwoJCX0KCQlyZXR1cm4gJHRoaXM7Cgl9CgoJLyoqCgkgKiBHZXQgTmFtZQoJICoKCSAqIEByZXR1cm4gc3RyaW5nCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXROYW1lKCkgewoJCWlmICgkdGhpcy0+X2lzU3VwZXJ2aXNvcikgewoJCQlyZXR1cm4gJHRoaXMtPmdldFNoYXJlZENvbXBvbmVudCgpLT5nZXROYW1lKCk7CgkJfQoJCXJldHVybiAkdGhpcy0+X25hbWU7Cgl9CgoJLyoqCgkgKiBTZXQgTmFtZQoJICoKCSAqIEBwYXJhbSBzdHJpbmcgJHBWYWx1ZQoJICogQHJldHVybiBQSFBFeGNlbF9TdHlsZV9Gb250CgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBzZXROYW1lKCRwVmFsdWUgPSAnQ2FsaWJyaScpIHsKICAJCWlmICgkcFZhbHVlID09ICcnKSB7CgkJCSRwVmFsdWUgPSAnQ2FsaWJyaSc7CgkJfQoJCWlmICgkdGhpcy0+X2lzU3VwZXJ2aXNvcikgewoJCQkkc3R5bGVBcnJheSA9ICR0aGlzLT5nZXRTdHlsZUFycmF5KGFycmF5KCduYW1lJyA9PiAkcFZhbHVlKSk7CgkJCSR0aGlzLT5nZXRBY3RpdmVTaGVldCgpLT5nZXRTdHlsZSgkdGhpcy0+Z2V0U2VsZWN0ZWRDZWxscygpKS0+YXBwbHlGcm9tQXJyYXkoJHN0eWxlQXJyYXkpOwoJCX0gZWxzZSB7CgkJCSR0aGlzLT5fbmFtZSA9ICRwVmFsdWU7CgkJfQoJCXJldHVybiAkdGhpczsKCX0KCgkvKioKCSAqIEdldCBTaXplCgkgKgoJICogQHJldHVybiBkb3VibGUKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldFNpemUoKSB7CgkJaWYgKCR0aGlzLT5faXNTdXBlcnZpc29yKSB7CgkJCXJldHVybiAkdGhpcy0+Z2V0U2hhcmVkQ29tcG9uZW50KCktPmdldFNpemUoKTsKCQl9CgkJcmV0dXJuICR0aGlzLT5fc2l6ZTsKCX0KCgkvKioKCSAqIFNldCBTaXplCgkgKgoJICogQHBhcmFtIGRvdWJsZSAkcFZhbHVlCgkgKiBAcmV0dXJuIFBIUEV4Y2VsX1N0eWxlX0ZvbnQKCSAqLwoJcHVibGljIGZ1bmN0aW9uIHNldFNpemUoJHBWYWx1ZSA9IDEwKSB7CgkJaWYgKCRwVmFsdWUgPT0gJycpIHsKCQkJJHBWYWx1ZSA9IDEwOwoJCX0KCQlpZiAoJHRoaXMtPl9pc1N1cGVydmlzb3IpIHsKCQkJJHN0eWxlQXJyYXkgPSAkdGhpcy0+Z2V0U3R5bGVBcnJheShhcnJheSgnc2l6ZScgPT4gJHBWYWx1ZSkpOwoJCQkkdGhpcy0+Z2V0QWN0aXZlU2hlZXQoKS0+Z2V0U3R5bGUoJHRoaXMtPmdldFNlbGVjdGVkQ2VsbHMoKSktPmFwcGx5RnJvbUFycmF5KCRzdHlsZUFycmF5KTsKCQl9IGVsc2UgewoJCQkkdGhpcy0+X3NpemUgPSAkcFZhbHVlOwoJCX0KCQlyZXR1cm4gJHRoaXM7Cgl9CgoJLyoqCgkgKiBHZXQgQm9sZAoJICoKCSAqIEByZXR1cm4gYm9vbGVhbgoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0Qm9sZCgpIHsKCQlpZiAoJHRoaXMtPl9pc1N1cGVydmlzb3IpIHsKCQkJcmV0dXJuICR0aGlzLT5nZXRTaGFyZWRDb21wb25lbnQoKS0+Z2V0Qm9sZCgpOwoJCX0KCQlyZXR1cm4gJHRoaXMtPl9ib2xkOwoJfQoKCS8qKgoJICogU2V0IEJvbGQKCSAqCgkgKiBAcGFyYW0gYm9vbGVhbiAkcFZhbHVlCgkgKiBAcmV0dXJuIFBIUEV4Y2VsX1N0eWxlX0ZvbnQKCSAqLwoJcHVibGljIGZ1bmN0aW9uIHNldEJvbGQoJHBWYWx1ZSA9IGZhbHNlKSB7CgkJaWYgKCRwVmFsdWUgPT0gJycpIHsKCQkJJHBWYWx1ZSA9IGZhbHNlOwoJCX0KCQlpZiAoJHRoaXMtPl9pc1N1cGVydmlzb3IpIHsKCQkJJHN0eWxlQXJyYXkgPSAkdGhpcy0+Z2V0U3R5bGVBcnJheShhcnJheSgnYm9sZCcgPT4gJHBWYWx1ZSkpOwoJCQkkdGhpcy0+Z2V0QWN0aXZlU2hlZXQoKS0+Z2V0U3R5bGUoJHRoaXMtPmdldFNlbGVjdGVkQ2VsbHMoKSktPmFwcGx5RnJvbUFycmF5KCRzdHlsZUFycmF5KTsKCQl9IGVsc2UgewoJCQkkdGhpcy0+X2JvbGQgPSAkcFZhbHVlOwoJCX0KCQlyZXR1cm4gJHRoaXM7Cgl9CgoJLyoqCgkgKiBHZXQgSXRhbGljCgkgKgoJICogQHJldHVybiBib29sZWFuCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRJdGFsaWMoKSB7CgkJaWYgKCR0aGlzLT5faXNTdXBlcnZpc29yKSB7CgkJCXJldHVybiAkdGhpcy0+Z2V0U2hhcmVkQ29tcG9uZW50KCktPmdldEl0YWxpYygpOwoJCX0KCQlyZXR1cm4gJHRoaXMtPl9pdGFsaWM7Cgl9CgoJLyoqCgkgKiBTZXQgSXRhbGljCgkgKgoJICogQHBhcmFtIGJvb2xlYW4gJHBWYWx1ZQoJICogQHJldHVybiBQSFBFeGNlbF9TdHlsZV9Gb250CgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBzZXRJdGFsaWMoJHBWYWx1ZSA9IGZhbHNlKSB7CgkJaWYgKCRwVmFsdWUgPT0gJycpIHsKCQkJJHBWYWx1ZSA9IGZhbHNlOwoJCX0KCQlpZiAoJHRoaXMtPl9pc1N1cGVydmlzb3IpIHsKCQkJJHN0eWxlQXJyYXkgPSAkdGhpcy0+Z2V0U3R5bGVBcnJheShhcnJheSgnaXRhbGljJyA9PiAkcFZhbHVlKSk7CgkJCSR0aGlzLT5nZXRBY3RpdmVTaGVldCgpLT5nZXRTdHlsZSgkdGhpcy0+Z2V0U2VsZWN0ZWRDZWxscygpKS0+YXBwbHlGcm9tQXJyYXkoJHN0eWxlQXJyYXkpOwoJCX0gZWxzZSB7CgkJCSR0aGlzLT5faXRhbGljID0gJHBWYWx1ZTsKCQl9CgkJcmV0dXJuICR0aGlzOwoJfQoKCS8qKgoJICogR2V0IFN1cGVyU2NyaXB0CgkgKgoJICogQHJldHVybiBib29sZWFuCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRTdXBlclNjcmlwdCgpIHsKCQlpZiAoJHRoaXMtPl9pc1N1cGVydmlzb3IpIHsKCQkJcmV0dXJuICR0aGlzLT5nZXRTaGFyZWRDb21wb25lbnQoKS0+Z2V0U3VwZXJTY3JpcHQoKTsKCQl9CgkJcmV0dXJuICR0aGlzLT5fc3VwZXJTY3JpcHQ7Cgl9CgoJLyoqCgkgKiBTZXQgU3VwZXJTY3JpcHQKCSAqCgkgKiBAcGFyYW0gYm9vbGVhbiAkcFZhbHVlCgkgKiBAcmV0dXJuIFBIUEV4Y2VsX1N0eWxlX0ZvbnQKCSAqLwoJcHVibGljIGZ1bmN0aW9uIHNldFN1cGVyU2NyaXB0KCRwVmFsdWUgPSBmYWxzZSkgewoJCWlmICgkcFZhbHVlID09ICcnKSB7CgkJCSRwVmFsdWUgPSBmYWxzZTsKCQl9CgkJaWYgKCR0aGlzLT5faXNTdXBlcnZpc29yKSB7CgkJCSRzdHlsZUFycmF5ID0gJHRoaXMtPmdldFN0eWxlQXJyYXkoYXJyYXkoJ3N1cGVyU2NyaXB0JyA9PiAkcFZhbHVlKSk7CgkJCSR0aGlzLT5nZXRBY3RpdmVTaGVldCgpLT5nZXRTdHlsZSgkdGhpcy0+Z2V0U2VsZWN0ZWRDZWxscygpKS0+YXBwbHlGcm9tQXJyYXkoJHN0eWxlQXJyYXkpOwoJCX0gZWxzZSB7CgkJCSR0aGlzLT5fc3VwZXJTY3JpcHQgPSAkcFZhbHVlOwoJCQkkdGhpcy0+X3N1YlNjcmlwdCA9ICEkcFZhbHVlOwoJCX0KCQlyZXR1cm4gJHRoaXM7Cgl9CgoJCS8qKgoJICogR2V0IFN1YlNjcmlwdAoJICoKCSAqIEByZXR1cm4gYm9vbGVhbgoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0U3ViU2NyaXB0KCkgewoJCWlmICgkdGhpcy0+X2lzU3VwZXJ2aXNvcikgewoJCQlyZXR1cm4gJHRoaXMtPmdldFNoYXJlZENvbXBvbmVudCgpLT5nZXRTdWJTY3JpcHQoKTsKCQl9CgkJcmV0dXJuICR0aGlzLT5fc3ViU2NyaXB0OwoJfQoKCS8qKgoJICogU2V0IFN1YlNjcmlwdAoJICoKCSAqIEBwYXJhbSBib29sZWFuICRwVmFsdWUKCSAqIEByZXR1cm4gUEhQRXhjZWxfU3R5bGVfRm9udAoJICovCglwdWJsaWMgZnVuY3Rpb24gc2V0U3ViU2NyaXB0KCRwVmFsdWUgPSBmYWxzZSkgewoJCWlmICgkcFZhbHVlID09ICcnKSB7CgkJCSRwVmFsdWUgPSBmYWxzZTsKCQl9CgkJaWYgKCR0aGlzLT5faXNTdXBlcnZpc29yKSB7CgkJCSRzdHlsZUFycmF5ID0gJHRoaXMtPmdldFN0eWxlQXJyYXkoYXJyYXkoJ3N1YlNjcmlwdCcgPT4gJHBWYWx1ZSkpOwoJCQkkdGhpcy0+Z2V0QWN0aXZlU2hlZXQoKS0+Z2V0U3R5bGUoJHRoaXMtPmdldFNlbGVjdGVkQ2VsbHMoKSktPmFwcGx5RnJvbUFycmF5KCRzdHlsZUFycmF5KTsKCQl9IGVsc2UgewoJCQkkdGhpcy0+X3N1YlNjcmlwdCA9ICRwVmFsdWU7CgkJCSR0aGlzLT5fc3VwZXJTY3JpcHQgPSAhJHBWYWx1ZTsKCQl9CgkJcmV0dXJuICR0aGlzOwoJfQoKCS8qKgoJICogR2V0IFVuZGVybGluZQoJICoKCSAqIEByZXR1cm4gc3RyaW5nCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRVbmRlcmxpbmUoKSB7CgkJaWYgKCR0aGlzLT5faXNTdXBlcnZpc29yKSB7CgkJCXJldHVybiAkdGhpcy0+Z2V0U2hhcmVkQ29tcG9uZW50KCktPmdldFVuZGVybGluZSgpOwoJCX0KCQlyZXR1cm4gJHRoaXMtPl91bmRlcmxpbmU7Cgl9CgoJLyoqCgkgKiBTZXQgVW5kZXJsaW5lCgkgKgoJICogQHBhcmFtIHN0cmluZyAkcFZhbHVlCVBIUEV4Y2VsX1N0eWxlX0ZvbnQgdW5kZXJsaW5lIHR5cGUKCSAqIEByZXR1cm4gUEhQRXhjZWxfU3R5bGVfRm9udAoJICovCglwdWJsaWMgZnVuY3Rpb24gc2V0VW5kZXJsaW5lKCRwVmFsdWUgPSBQSFBFeGNlbF9TdHlsZV9Gb250OjpVTkRFUkxJTkVfTk9ORSkgewoJCWlmICgkcFZhbHVlID09ICcnKSB7CgkJCSRwVmFsdWUgPSBQSFBFeGNlbF9TdHlsZV9Gb250OjpVTkRFUkxJTkVfTk9ORTsKCQl9CgkJaWYgKCR0aGlzLT5faXNTdXBlcnZpc29yKSB7CgkJCSRzdHlsZUFycmF5ID0gJHRoaXMtPmdldFN0eWxlQXJyYXkoYXJyYXkoJ3VuZGVybGluZScgPT4gJHBWYWx1ZSkpOwoJCQkkdGhpcy0+Z2V0QWN0aXZlU2hlZXQoKS0+Z2V0U3R5bGUoJHRoaXMtPmdldFNlbGVjdGVkQ2VsbHMoKSktPmFwcGx5RnJvbUFycmF5KCRzdHlsZUFycmF5KTsKCQl9IGVsc2UgewoJCQkkdGhpcy0+X3VuZGVybGluZSA9ICRwVmFsdWU7CgkJfQoJCXJldHVybiAkdGhpczsKCX0KCgkvKioKCSAqIEdldCBTdHJpa2V0cm91Z2gKCSAqCgkgKiBAZGVwcmVjYXRlZCBVc2UgZ2V0U3RyaWtldGhyb3VnaCgpIGluc3RlYWQuCgkgKiBAcmV0dXJuIGJvb2xlYW4KCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldFN0cmlrZXRyb3VnaCgpIHsKCQlyZXR1cm4gJHRoaXMtPmdldFN0cmlrZXRocm91Z2goKTsKCX0KCgkvKioKCSAqIFNldCBTdHJpa2V0cm91Z2gKCSAqCgkgKiBAZGVwcmVjYXRlZCBVc2Ugc2V0U3RyaWtldGhyb3VnaCgpIGluc3RlYWQuCgkgKiBAcGFyYW0gYm9vbGVhbiAkcFZhbHVlCgkgKiBAcmV0dXJuIFBIUEV4Y2VsX1N0eWxlX0ZvbnQKCSAqLwoJcHVibGljIGZ1bmN0aW9uIHNldFN0cmlrZXRyb3VnaCgkcFZhbHVlID0gZmFsc2UpIHsKCQlyZXR1cm4gJHRoaXMtPnNldFN0cmlrZXRocm91Z2goJHBWYWx1ZSk7Cgl9CgoJLyoqCgkgKiBHZXQgU3RyaWtldGhyb3VnaAoJICoKCSAqIEByZXR1cm4gYm9vbGVhbgoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0U3RyaWtldGhyb3VnaCgpIHsKCQlpZiAoJHRoaXMtPl9pc1N1cGVydmlzb3IpIHsKCQkJcmV0dXJuICR0aGlzLT5nZXRTaGFyZWRDb21wb25lbnQoKS0+Z2V0U3RyaWtldGhyb3VnaCgpOwoJCX0KCQlyZXR1cm4gJHRoaXMtPl9zdHJpa2V0aHJvdWdoOwoJfQoKCS8qKgoJICogU2V0IFN0cmlrZXRocm91Z2gKCSAqCgkgKiBAcGFyYW0gYm9vbGVhbiAkcFZhbHVlCgkgKiBAcmV0dXJuIFBIUEV4Y2VsX1N0eWxlX0ZvbnQKCSAqLwoJcHVibGljIGZ1bmN0aW9uIHNldFN0cmlrZXRocm91Z2goJHBWYWx1ZSA9IGZhbHNlKSB7CgkJaWYgKCRwVmFsdWUgPT0gJycpIHsKCQkJJHBWYWx1ZSA9IGZhbHNlOwoJCX0KCQlpZiAoJHRoaXMtPl9pc1N1cGVydmlzb3IpIHsKCQkJJHN0eWxlQXJyYXkgPSAkdGhpcy0+Z2V0U3R5bGVBcnJheShhcnJheSgnc3RyaWtlJyA9PiAkcFZhbHVlKSk7CgkJCSR0aGlzLT5nZXRBY3RpdmVTaGVldCgpLT5nZXRTdHlsZSgkdGhpcy0+Z2V0U2VsZWN0ZWRDZWxscygpKS0+YXBwbHlGcm9tQXJyYXkoJHN0eWxlQXJyYXkpOwoJCX0gZWxzZSB7CgkJCSR0aGlzLT5fc3RyaWtldGhyb3VnaCA9ICRwVmFsdWU7CgkJfQoJCXJldHVybiAkdGhpczsKCX0KCgkvKioKCSAqIEdldCBDb2xvcgoJICoKCSAqIEByZXR1cm4gUEhQRXhjZWxfU3R5bGVfQ29sb3IKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldENvbG9yKCkgewoJCXJldHVybiAkdGhpcy0+X2NvbG9yOwoJfQoKCS8qKgoJICogU2V0IENvbG9yCgkgKgoJICogQHBhcmFtCVBIUEV4Y2VsX1N0eWxlX0NvbG9yICRwVmFsdWUKCSAqIEB0aHJvd3MJRXhjZXB0aW9uCgkgKiBAcmV0dXJuIFBIUEV4Y2VsX1N0eWxlX0ZvbnQKCSAqLwoJcHVibGljIGZ1bmN0aW9uIHNldENvbG9yKFBIUEV4Y2VsX1N0eWxlX0NvbG9yICRwVmFsdWUgPSBudWxsKSB7CgkJLy8gbWFrZSBzdXJlIHBhcmFtZXRlciBpcyBhIHJlYWwgY29sb3IgYW5kIG5vdCBhIHN1cGVydmlzb3IKCQkkY29sb3IgPSAkcFZhbHVlLT5nZXRJc1N1cGVydmlzb3IoKSA/ICRwVmFsdWUtPmdldFNoYXJlZENvbXBvbmVudCgpIDogJHBWYWx1ZTsKCgkJaWYgKCR0aGlzLT5faXNTdXBlcnZpc29yKSB7CgkJCSRzdHlsZUFycmF5ID0gJHRoaXMtPmdldENvbG9yKCktPmdldFN0eWxlQXJyYXkoYXJyYXkoJ2FyZ2InID0+ICRjb2xvci0+Z2V0QVJHQigpKSk7CgkJCSR0aGlzLT5nZXRBY3RpdmVTaGVldCgpLT5nZXRTdHlsZSgkdGhpcy0+Z2V0U2VsZWN0ZWRDZWxscygpKS0+YXBwbHlGcm9tQXJyYXkoJHN0eWxlQXJyYXkpOwoJCX0gZWxzZSB7CgkJCSR0aGlzLT5fY29sb3IgPSAkY29sb3I7CgkJfQoJCXJldHVybiAkdGhpczsKCX0KCgkvKioKCSAqIEdldCBoYXNoIGNvZGUKCSAqCgkgKiBAcmV0dXJuIHN0cmluZwlIYXNoIGNvZGUKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldEhhc2hDb2RlKCkgewoJCWlmICgkdGhpcy0+X2lzU3VwZXJ2aXNvcikgewoJCQlyZXR1cm4gJHRoaXMtPmdldFNoYXJlZENvbXBvbmVudCgpLT5nZXRIYXNoQ29kZSgpOwoJCX0KCQlyZXR1cm4gbWQ1KAoJCQkgICR0aGlzLT5fbmFtZQoJCQkuICR0aGlzLT5fc2l6ZQoJCQkuICgkdGhpcy0+X2JvbGQgPyAndCcgOiAnZicpCgkJCS4gKCR0aGlzLT5faXRhbGljID8gJ3QnIDogJ2YnKQoJCQkuICgkdGhpcy0+X3N1cGVyU2NyaXB0ID8gJ3QnIDogJ2YnKQoJCQkuICgkdGhpcy0+X3N1YlNjcmlwdCA/ICd0JyA6ICdmJykKCQkJLiAkdGhpcy0+X3VuZGVybGluZQoJCQkuICgkdGhpcy0+X3N0cmlrZXRocm91Z2ggPyAndCcgOiAnZicpCgkJCS4gJHRoaXMtPl9jb2xvci0+Z2V0SGFzaENvZGUoKQoJCQkuIF9fQ0xBU1NfXwoJCSk7Cgl9CgoJLyoqCgkgKiBJbXBsZW1lbnQgUEhQIF9fY2xvbmUgdG8gY3JlYXRlIGEgZGVlcCBjbG9uZSwgbm90IGp1c3QgYSBzaGFsbG93IGNvcHkuCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBfX2Nsb25lKCkgewoJCSR2YXJzID0gZ2V0X29iamVjdF92YXJzKCR0aGlzKTsKCQlmb3JlYWNoICgkdmFycyBhcyAka2V5ID0+ICR2YWx1ZSkgewoJCQlpZiAoKGlzX29iamVjdCgkdmFsdWUpKSAmJiAoJGtleSAhPSAnX3BhcmVudCcpKSB7CgkJCQkkdGhpcy0+JGtleSA9IGNsb25lICR2YWx1ZTsKCQkJfSBlbHNlIHsKCQkJCSR0aGlzLT4ka2V5ID0gJHZhbHVlOwoJCQl9CgkJfQoJfQp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Style/NumberFormat.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIFBIUEV4Y2VsCiAqCiAqIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICoKICogQGNhdGVnb3J5ICAgUEhQRXhjZWwKICogQHBhY2thZ2UJUEhQRXhjZWxfU3R5bGUKICogQGNvcHlyaWdodCAgQ29weXJpZ2h0IChjKSAyMDA2IC0gMjAxMiBQSFBFeGNlbCAoaHR0cDovL3d3dy5jb2RlcGxleC5jb20vUEhQRXhjZWwpCiAqIEBsaWNlbnNlCWh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9vbGQtbGljZW5zZXMvbGdwbC0yLjEudHh0CUxHUEwKICogQHZlcnNpb24JMS43LjcsIDIwMTItMDUtMTkKICovCgoKLyoqCiAqIFBIUEV4Y2VsX1N0eWxlX051bWJlckZvcm1hdAogKgogKiBAY2F0ZWdvcnkgICBQSFBFeGNlbAogKiBAcGFja2FnZQlQSFBFeGNlbF9TdHlsZQogKiBAY29weXJpZ2h0ICBDb3B5cmlnaHQgKGMpIDIwMDYgLSAyMDEyIFBIUEV4Y2VsIChodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9QSFBFeGNlbCkKICovCmNsYXNzIFBIUEV4Y2VsX1N0eWxlX051bWJlckZvcm1hdCBpbXBsZW1lbnRzIFBIUEV4Y2VsX0lDb21wYXJhYmxlCnsKCS8qIFByZS1kZWZpbmVkIGZvcm1hdHMgKi8KCWNvbnN0IEZPUk1BVF9HRU5FUkFMCQkJCQk9ICdHZW5lcmFsJzsKCgljb25zdCBGT1JNQVRfVEVYVAkJCQkJCT0gJ0AnOwoKCWNvbnN0IEZPUk1BVF9OVU1CRVIJCQkJCQk9ICcwJzsKCWNvbnN0IEZPUk1BVF9OVU1CRVJfMDAJCQkJCT0gJzAuMDAnOwoJY29uc3QgRk9STUFUX05VTUJFUl9DT01NQV9TRVBBUkFURUQxCT0gJyMsIyMwLjAwJzsKCWNvbnN0IEZPUk1BVF9OVU1CRVJfQ09NTUFfU0VQQVJBVEVEMgk9ICcjLCMjMC4wMF8tJzsKCgljb25zdCBGT1JNQVRfUEVSQ0VOVEFHRQkJCQkJPSAnMCUnOwoJY29uc3QgRk9STUFUX1BFUkNFTlRBR0VfMDAJCQkJPSAnMC4wMCUnOwoKCWNvbnN0IEZPUk1BVF9EQVRFX1lZWVlNTUREMgkJCQk9ICd5eXl5LW1tLWRkJzsKCWNvbnN0IEZPUk1BVF9EQVRFX1lZWVlNTURECQkJCT0gJ3l5LW1tLWRkJzsKCWNvbnN0IEZPUk1BVF9EQVRFX0RETU1ZWVlZCQkJCT0gJ2RkL21tL3l5JzsKCWNvbnN0IEZPUk1BVF9EQVRFX0RNWVNMQVNICQkJCT0gJ2QvbS95JzsKCWNvbnN0IEZPUk1BVF9EQVRFX0RNWU1JTlVTCQkJCT0gJ2QtbS15JzsKCWNvbnN0IEZPUk1BVF9EQVRFX0RNTUlOVVMJCQkJPSAnZC1tJzsKCWNvbnN0IEZPUk1BVF9EQVRFX01ZTUlOVVMJCQkJPSAnbS15JzsKCWNvbnN0IEZPUk1BVF9EQVRFX1hMU1gxNAkJCQk9ICdtbS1kZC15eSc7Cgljb25zdCBGT1JNQVRfREFURV9YTFNYMTUJCQkJPSAnZC1tbW0teXknOwoJY29uc3QgRk9STUFUX0RBVEVfWExTWDE2CQkJCT0gJ2QtbW1tJzsKCWNvbnN0IEZPUk1BVF9EQVRFX1hMU1gxNwkJCQk9ICdtbW0teXknOwoJY29uc3QgRk9STUFUX0RBVEVfWExTWDIyCQkJCT0gJ20vZC95eSBoOm1tJzsKCWNvbnN0IEZPUk1BVF9EQVRFX0RBVEVUSU1FCQkJCT0gJ2QvbS95IGg6bW0nOwoJY29uc3QgRk9STUFUX0RBVEVfVElNRTEJCQkJCT0gJ2g6bW0gQU0vUE0nOwoJY29uc3QgRk9STUFUX0RBVEVfVElNRTIJCQkJCT0gJ2g6bW06c3MgQU0vUE0nOwoJY29uc3QgRk9STUFUX0RBVEVfVElNRTMJCQkJCT0gJ2g6bW0nOwoJY29uc3QgRk9STUFUX0RBVEVfVElNRTQJCQkJCT0gJ2g6bW06c3MnOwoJY29uc3QgRk9STUFUX0RBVEVfVElNRTUJCQkJCT0gJ21tOnNzJzsKCWNvbnN0IEZPUk1BVF9EQVRFX1RJTUU2CQkJCQk9ICdoOm1tOnNzJzsKCWNvbnN0IEZPUk1BVF9EQVRFX1RJTUU3CQkJCQk9ICdpOnMuUyc7Cgljb25zdCBGT1JNQVRfREFURV9USU1FOAkJCQkJPSAnaDptbTpzcztAJzsKCWNvbnN0IEZPUk1BVF9EQVRFX1lZWVlNTUREU0xBU0gJCQk9ICd5eS9tbS9kZDtAJzsKCgljb25zdCBGT1JNQVRfQ1VSUkVOQ1lfVVNEX1NJTVBMRQkJPSAnIiQiIywjIzAuMDBfLSc7Cgljb25zdCBGT1JNQVRfQ1VSUkVOQ1lfVVNECQkJCT0gJyQjLCMjMF8tJzsKCWNvbnN0IEZPUk1BVF9DVVJSRU5DWV9FVVJfU0lNUExFCQk9ICdbJEVVUiBdIywjIzAuMDBfLSc7CgoJLyoqCgkgKiBFeGNlbCBidWlsdC1pbiBudW1iZXIgZm9ybWF0cwoJICoKCSAqIEB2YXIgYXJyYXkKCSAqLwoJcHJpdmF0ZSBzdGF0aWMgJF9idWlsdEluRm9ybWF0czsKCgkvKioKCSAqIEV4Y2VsIGJ1aWx0LWluIG51bWJlciBmb3JtYXRzIChmbGlwcGVkLCBmb3IgZmFzdGVyIGxvb2t1cHMpCgkgKgoJICogQHZhciBhcnJheQoJICovCglwcml2YXRlIHN0YXRpYyAkX2ZsaXBwZWRCdWlsdEluRm9ybWF0czsKCgkvKioKCSAqIEZvcm1hdCBDb2RlCgkgKgoJICogQHZhciBzdHJpbmcKCSAqLwoJcHJpdmF0ZSAkX2Zvcm1hdENvZGUJPQlQSFBFeGNlbF9TdHlsZV9OdW1iZXJGb3JtYXQ6OkZPUk1BVF9HRU5FUkFMOwoKCS8qKgoJICogQnVpbHQtaW4gZm9ybWF0IENvZGUKCSAqCgkgKiBAdmFyIHN0cmluZwoJICovCglwcml2YXRlICRfYnVpbHRJbkZvcm1hdENvZGUJPSAwOwoKCS8qKgoJICogUGFyZW50IEJvcmRlcnMKCSAqCgkgKiBAdmFyIF9wYXJlbnRQcm9wZXJ0eU5hbWUgc3RyaW5nCgkgKi8KCXByaXZhdGUgJF9wYXJlbnRQcm9wZXJ0eU5hbWU7CgoJLyoqCgkgKiBTdXBlcnZpc29yPwoJICoKCSAqIEB2YXIgYm9vbGVhbgoJICovCglwcml2YXRlICRfaXNTdXBlcnZpc29yOwoKCS8qKgoJICogUGFyZW50LiBPbmx5IHVzZWQgZm9yIHN1cGVydmlzb3IKCSAqCgkgKiBAdmFyIFBIUEV4Y2VsX1N0eWxlCgkgKi8KCXByaXZhdGUgJF9wYXJlbnQ7CgoJLyoqCgkgKiBDcmVhdGUgYSBuZXcgUEhQRXhjZWxfU3R5bGVfTnVtYmVyRm9ybWF0CgkgKgoJICogQHBhcmFtCWJvb2xlYW4JJGlzU3VwZXJ2aXNvcglGbGFnIGluZGljYXRpbmcgaWYgdGhpcyBpcyBhIHN1cGVydmlzb3Igb3Igbm90CgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkaXNTdXBlcnZpc29yID0gZmFsc2UpCgl7CgkJLy8gU3VwZXJ2aXNvcj8KCQkkdGhpcy0+X2lzU3VwZXJ2aXNvciA9ICRpc1N1cGVydmlzb3I7Cgl9CgoJLyoqCgkgKiBCaW5kIHBhcmVudC4gT25seSB1c2VkIGZvciBzdXBlcnZpc29yCgkgKgoJICogQHBhcmFtIFBIUEV4Y2VsX1N0eWxlICRwYXJlbnQKCSAqIEByZXR1cm4gUEhQRXhjZWxfU3R5bGVfTnVtYmVyRm9ybWF0CgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBiaW5kUGFyZW50KCRwYXJlbnQpCgl7CgkJJHRoaXMtPl9wYXJlbnQgPSAkcGFyZW50OwoJfQoKCS8qKgoJICogSXMgdGhpcyBhIHN1cGVydmlzb3Igb3IgYSByZWFsIHN0eWxlIGNvbXBvbmVudD8KCSAqCgkgKiBAcmV0dXJuIGJvb2xlYW4KCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldElzU3VwZXJ2aXNvcigpCgl7CgkJcmV0dXJuICR0aGlzLT5faXNTdXBlcnZpc29yOwoJfQoKCS8qKgoJICogR2V0IHRoZSBzaGFyZWQgc3R5bGUgY29tcG9uZW50IGZvciB0aGUgY3VycmVudGx5IGFjdGl2ZSBjZWxsIGluIGN1cnJlbnRseSBhY3RpdmUgc2hlZXQuCgkgKiBPbmx5IHVzZWQgZm9yIHN0eWxlIHN1cGVydmlzb3IKCSAqCgkgKiBAcmV0dXJuIFBIUEV4Y2VsX1N0eWxlX051bWJlckZvcm1hdAoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0U2hhcmVkQ29tcG9uZW50KCkKCXsKCQlyZXR1cm4gJHRoaXMtPl9wYXJlbnQtPmdldFNoYXJlZENvbXBvbmVudCgpLT5nZXROdW1iZXJGb3JtYXQoKTsKCX0KCgkvKioKCSAqIEdldCB0aGUgY3VycmVudGx5IGFjdGl2ZSBzaGVldC4gT25seSB1c2VkIGZvciBzdXBlcnZpc29yCgkgKgoJICogQHJldHVybiBQSFBFeGNlbF9Xb3Jrc2hlZXQKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldEFjdGl2ZVNoZWV0KCkKCXsKCQlyZXR1cm4gJHRoaXMtPl9wYXJlbnQtPmdldEFjdGl2ZVNoZWV0KCk7Cgl9CgoJLyoqCgkgKiBHZXQgdGhlIGN1cnJlbnRseSBhY3RpdmUgY2VsbCBjb29yZGluYXRlIGluIGN1cnJlbnRseSBhY3RpdmUgc2hlZXQuCgkgKiBPbmx5IHVzZWQgZm9yIHN1cGVydmlzb3IKCSAqCgkgKiBAcmV0dXJuIHN0cmluZyBFLmcuICdBMScKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldFNlbGVjdGVkQ2VsbHMoKQoJewoJCXJldHVybiAkdGhpcy0+Z2V0QWN0aXZlU2hlZXQoKS0+Z2V0U2VsZWN0ZWRDZWxscygpOwoJfQoKCS8qKgoJICogR2V0IHRoZSBjdXJyZW50bHkgYWN0aXZlIGNlbGwgY29vcmRpbmF0ZSBpbiBjdXJyZW50bHkgYWN0aXZlIHNoZWV0LgoJICogT25seSB1c2VkIGZvciBzdXBlcnZpc29yCgkgKgoJICogQHJldHVybiBzdHJpbmcgRS5nLiAnQTEnCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRBY3RpdmVDZWxsKCkKCXsKCQlyZXR1cm4gJHRoaXMtPmdldEFjdGl2ZVNoZWV0KCktPmdldEFjdGl2ZUNlbGwoKTsKCX0KCgkvKioKCSAqIEJ1aWxkIHN0eWxlIGFycmF5IGZyb20gc3ViY29tcG9uZW50cwoJICoKCSAqIEBwYXJhbSBhcnJheSAkYXJyYXkKCSAqIEByZXR1cm4gYXJyYXkKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldFN0eWxlQXJyYXkoJGFycmF5KQoJewoJCXJldHVybiBhcnJheSgnbnVtYmVyZm9ybWF0JyA9PiAkYXJyYXkpOwoJfQoKCS8qKgoJICogQXBwbHkgc3R5bGVzIGZyb20gYXJyYXkKCSAqCgkgKiA8Y29kZT4KCSAqICRvYmpQSFBFeGNlbC0+Z2V0QWN0aXZlU2hlZXQoKS0+Z2V0U3R5bGUoJ0IyJyktPmdldE51bWJlckZvcm1hdCgpLT5hcHBseUZyb21BcnJheSgKCSAqCQlhcnJheSgKCSAqCQkJJ2NvZGUnID0+IFBIUEV4Y2VsX1N0eWxlX051bWJlckZvcm1hdDo6Rk9STUFUX0NVUlJFTkNZX0VVUl9TSU1QTEUKCSAqCQkpCgkgKiApOwoJICogPC9jb2RlPgoJICoKCSAqIEBwYXJhbQlhcnJheQkkcFN0eWxlcwlBcnJheSBjb250YWluaW5nIHN0eWxlIGluZm9ybWF0aW9uCgkgKiBAdGhyb3dzCUV4Y2VwdGlvbgoJICogQHJldHVybiBQSFBFeGNlbF9TdHlsZV9OdW1iZXJGb3JtYXQKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGFwcGx5RnJvbUFycmF5KCRwU3R5bGVzID0gbnVsbCkKCXsKCQlpZiAoaXNfYXJyYXkoJHBTdHlsZXMpKSB7CgkJCWlmICgkdGhpcy0+X2lzU3VwZXJ2aXNvcikgewoJCQkJJHRoaXMtPmdldEFjdGl2ZVNoZWV0KCktPmdldFN0eWxlKCR0aGlzLT5nZXRTZWxlY3RlZENlbGxzKCkpLT5hcHBseUZyb21BcnJheSgkdGhpcy0+Z2V0U3R5bGVBcnJheSgkcFN0eWxlcykpOwoJCQl9IGVsc2UgewoJCQkJaWYgKGFycmF5X2tleV9leGlzdHMoJ2NvZGUnLCAkcFN0eWxlcykpIHsKCQkJCQkkdGhpcy0+c2V0Rm9ybWF0Q29kZSgkcFN0eWxlc1snY29kZSddKTsKCQkJCX0KCQkJfQoJCX0gZWxzZSB7CgkJCXRocm93IG5ldyBFeGNlcHRpb24oIkludmFsaWQgc3R5bGUgYXJyYXkgcGFzc2VkLiIpOwoJCX0KCQlyZXR1cm4gJHRoaXM7Cgl9CgoJLyoqCgkgKiBHZXQgRm9ybWF0IENvZGUKCSAqCgkgKiBAcmV0dXJuIHN0cmluZwoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0Rm9ybWF0Q29kZSgpCgl7CgkJaWYgKCR0aGlzLT5faXNTdXBlcnZpc29yKSB7CgkJCXJldHVybiAkdGhpcy0+Z2V0U2hhcmVkQ29tcG9uZW50KCktPmdldEZvcm1hdENvZGUoKTsKCQl9CgkJaWYgKCR0aGlzLT5fYnVpbHRJbkZvcm1hdENvZGUgIT09IGZhbHNlKQoJCXsKCQkJcmV0dXJuIHNlbGY6OmJ1aWx0SW5Gb3JtYXRDb2RlKCR0aGlzLT5fYnVpbHRJbkZvcm1hdENvZGUpOwoJCX0KCQlyZXR1cm4gJHRoaXMtPl9mb3JtYXRDb2RlOwoJfQoKCS8qKgoJICogU2V0IEZvcm1hdCBDb2RlCgkgKgoJICogQHBhcmFtIHN0cmluZyAkcFZhbHVlCgkgKiBAcmV0dXJuIFBIUEV4Y2VsX1N0eWxlX051bWJlckZvcm1hdAoJICovCglwdWJsaWMgZnVuY3Rpb24gc2V0Rm9ybWF0Q29kZSgkcFZhbHVlID0gUEhQRXhjZWxfU3R5bGVfTnVtYmVyRm9ybWF0OjpGT1JNQVRfR0VORVJBTCkKCXsKCQlpZiAoJHBWYWx1ZSA9PSAnJykgewoJCQkkcFZhbHVlID0gUEhQRXhjZWxfU3R5bGVfTnVtYmVyRm9ybWF0OjpGT1JNQVRfR0VORVJBTDsKCQl9CgkJaWYgKCR0aGlzLT5faXNTdXBlcnZpc29yKSB7CgkJCSRzdHlsZUFycmF5ID0gJHRoaXMtPmdldFN0eWxlQXJyYXkoYXJyYXkoJ2NvZGUnID0+ICRwVmFsdWUpKTsKCQkJJHRoaXMtPmdldEFjdGl2ZVNoZWV0KCktPmdldFN0eWxlKCR0aGlzLT5nZXRTZWxlY3RlZENlbGxzKCkpLT5hcHBseUZyb21BcnJheSgkc3R5bGVBcnJheSk7CgkJfSBlbHNlIHsKCQkJJHRoaXMtPl9mb3JtYXRDb2RlID0gJHBWYWx1ZTsKCQkJJHRoaXMtPl9idWlsdEluRm9ybWF0Q29kZSA9IHNlbGY6OmJ1aWx0SW5Gb3JtYXRDb2RlSW5kZXgoJHBWYWx1ZSk7CgkJfQoJCXJldHVybiAkdGhpczsKCX0KCgkvKioKCSAqIEdldCBCdWlsdC1JbiBGb3JtYXQgQ29kZQoJICoKCSAqIEByZXR1cm4gaW50CgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRCdWlsdEluRm9ybWF0Q29kZSgpCgl7CgkJaWYgKCR0aGlzLT5faXNTdXBlcnZpc29yKSB7CgkJCXJldHVybiAkdGhpcy0+Z2V0U2hhcmVkQ29tcG9uZW50KCktPmdldEJ1aWx0SW5Gb3JtYXRDb2RlKCk7CgkJfQoJCXJldHVybiAkdGhpcy0+X2J1aWx0SW5Gb3JtYXRDb2RlOwoJfQoKCS8qKgoJICogU2V0IEJ1aWx0LUluIEZvcm1hdCBDb2RlCgkgKgoJICogQHBhcmFtIGludCAkcFZhbHVlCgkgKiBAcmV0dXJuIFBIUEV4Y2VsX1N0eWxlX051bWJlckZvcm1hdAoJICovCglwdWJsaWMgZnVuY3Rpb24gc2V0QnVpbHRJbkZvcm1hdENvZGUoJHBWYWx1ZSA9IDApCgl7CgoJCWlmICgkdGhpcy0+X2lzU3VwZXJ2aXNvcikgewoJCQkkc3R5bGVBcnJheSA9ICR0aGlzLT5nZXRTdHlsZUFycmF5KGFycmF5KCdjb2RlJyA9PiBzZWxmOjpidWlsdEluRm9ybWF0Q29kZSgkcFZhbHVlKSkpOwoJCQkkdGhpcy0+Z2V0QWN0aXZlU2hlZXQoKS0+Z2V0U3R5bGUoJHRoaXMtPmdldFNlbGVjdGVkQ2VsbHMoKSktPmFwcGx5RnJvbUFycmF5KCRzdHlsZUFycmF5KTsKCQl9IGVsc2UgewoJCQkkdGhpcy0+X2J1aWx0SW5Gb3JtYXRDb2RlID0gJHBWYWx1ZTsKCQkJJHRoaXMtPl9mb3JtYXRDb2RlID0gc2VsZjo6YnVpbHRJbkZvcm1hdENvZGUoJHBWYWx1ZSk7CgkJfQoJCXJldHVybiAkdGhpczsKCX0KCgkvKioKCSAqIEZpbGwgYnVpbHQtaW4gZm9ybWF0IGNvZGVzCgkgKi8KCXByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGZpbGxCdWlsdEluRm9ybWF0Q29kZXMoKQoJewoJCS8vIEJ1aWx0LWluIGZvcm1hdCBjb2RlcwoJCWlmIChpc19udWxsKHNlbGY6OiRfYnVpbHRJbkZvcm1hdHMpKSB7CgkJCXNlbGY6OiRfYnVpbHRJbkZvcm1hdHMgPSBhcnJheSgpOwoKCQkJLy8gR2VuZXJhbAoJCQlzZWxmOjokX2J1aWx0SW5Gb3JtYXRzWzBdID0gUEhQRXhjZWxfU3R5bGVfTnVtYmVyRm9ybWF0OjpGT1JNQVRfR0VORVJBTDsKCQkJc2VsZjo6JF9idWlsdEluRm9ybWF0c1sxXSA9ICcwJzsKCQkJc2VsZjo6JF9idWlsdEluRm9ybWF0c1syXSA9ICcwLjAwJzsKCQkJc2VsZjo6JF9idWlsdEluRm9ybWF0c1szXSA9ICcjLCMjMCc7CgkJCXNlbGY6OiRfYnVpbHRJbkZvcm1hdHNbNF0gPSAnIywjIzAuMDAnOwoKCQkJc2VsZjo6JF9idWlsdEluRm9ybWF0c1s5XSA9ICcwJSc7CgkJCXNlbGY6OiRfYnVpbHRJbkZvcm1hdHNbMTBdID0gJzAuMDAlJzsKCQkJc2VsZjo6JF9idWlsdEluRm9ybWF0c1sxMV0gPSAnMC4wMEUrMDAnOwoJCQlzZWxmOjokX2J1aWx0SW5Gb3JtYXRzWzEyXSA9ICcjID8vPyc7CgkJCXNlbGY6OiRfYnVpbHRJbkZvcm1hdHNbMTNdID0gJyMgPz8vPz8nOwoJCQlzZWxmOjokX2J1aWx0SW5Gb3JtYXRzWzE0XSA9ICdtbS1kZC15eSc7CgkJCXNlbGY6OiRfYnVpbHRJbkZvcm1hdHNbMTVdID0gJ2QtbW1tLXl5JzsKCQkJc2VsZjo6JF9idWlsdEluRm9ybWF0c1sxNl0gPSAnZC1tbW0nOwoJCQlzZWxmOjokX2J1aWx0SW5Gb3JtYXRzWzE3XSA9ICdtbW0teXknOwoJCQlzZWxmOjokX2J1aWx0SW5Gb3JtYXRzWzE4XSA9ICdoOm1tIEFNL1BNJzsKCQkJc2VsZjo6JF9idWlsdEluRm9ybWF0c1sxOV0gPSAnaDptbTpzcyBBTS9QTSc7CgkJCXNlbGY6OiRfYnVpbHRJbkZvcm1hdHNbMjBdID0gJ2g6bW0nOwoJCQlzZWxmOjokX2J1aWx0SW5Gb3JtYXRzWzIxXSA9ICdoOm1tOnNzJzsKCQkJc2VsZjo6JF9idWlsdEluRm9ybWF0c1syMl0gPSAnbS9kL3l5IGg6bW0nOwoKCQkJc2VsZjo6JF9idWlsdEluRm9ybWF0c1szN10gPSAnIywjIzAgOygjLCMjMCknOwoJCQlzZWxmOjokX2J1aWx0SW5Gb3JtYXRzWzM4XSA9ICcjLCMjMCA7W1JlZF0oIywjIzApJzsKCQkJc2VsZjo6JF9idWlsdEluRm9ybWF0c1szOV0gPSAnIywjIzAuMDA7KCMsIyMwLjAwKSc7CgkJCXNlbGY6OiRfYnVpbHRJbkZvcm1hdHNbNDBdID0gJyMsIyMwLjAwO1tSZWRdKCMsIyMwLjAwKSc7CgoJCQlzZWxmOjokX2J1aWx0SW5Gb3JtYXRzWzQ0XSA9ICdfKCIkIiogIywjIzAuMDBfKTtfKCIkIiogXCgjLCMjMC4wMFwpO18oIiQiKiAiLSI/P18pO18oQF8pJzsKCQkJc2VsZjo6JF9idWlsdEluRm9ybWF0c1s0NV0gPSAnbW06c3MnOwoJCQlzZWxmOjokX2J1aWx0SW5Gb3JtYXRzWzQ2XSA9ICdbaF06bW06c3MnOwoJCQlzZWxmOjokX2J1aWx0SW5Gb3JtYXRzWzQ3XSA9ICdtbXNzLjAnOwoJCQlzZWxmOjokX2J1aWx0SW5Gb3JtYXRzWzQ4XSA9ICcjIzAuMEUrMCc7CgkJCXNlbGY6OiRfYnVpbHRJbkZvcm1hdHNbNDldID0gJ0AnOwoKCQkJLy8gQ0hUCgkJCXNlbGY6OiRfYnVpbHRJbkZvcm1hdHNbMjddID0gJ1skLTQwNF1lL20vZCc7CgkJCXNlbGY6OiRfYnVpbHRJbkZvcm1hdHNbMzBdID0gJ20vZC95eSc7CgkJCXNlbGY6OiRfYnVpbHRJbkZvcm1hdHNbMzZdID0gJ1skLTQwNF1lL20vZCc7CgkJCXNlbGY6OiRfYnVpbHRJbkZvcm1hdHNbNTBdID0gJ1skLTQwNF1lL20vZCc7CgkJCXNlbGY6OiRfYnVpbHRJbkZvcm1hdHNbNTddID0gJ1skLTQwNF1lL20vZCc7CgoJCQkvLyBUSEEKCQkJc2VsZjo6JF9idWlsdEluRm9ybWF0c1s1OV0gPSAndDAnOwoJCQlzZWxmOjokX2J1aWx0SW5Gb3JtYXRzWzYwXSA9ICd0MC4wMCc7CgkJCXNlbGY6OiRfYnVpbHRJbkZvcm1hdHNbNjFdID0gJ3QjLCMjMCc7CgkJCXNlbGY6OiRfYnVpbHRJbkZvcm1hdHNbNjJdID0gJ3QjLCMjMC4wMCc7CgkJCXNlbGY6OiRfYnVpbHRJbkZvcm1hdHNbNjddID0gJ3QwJSc7CgkJCXNlbGY6OiRfYnVpbHRJbkZvcm1hdHNbNjhdID0gJ3QwLjAwJSc7CgkJCXNlbGY6OiRfYnVpbHRJbkZvcm1hdHNbNjldID0gJ3QjID8vPyc7CgkJCXNlbGY6OiRfYnVpbHRJbkZvcm1hdHNbNzBdID0gJ3QjID8/Lz8/JzsKCgkJCS8vIEZsaXAgYXJyYXkgKGZvciBmYXN0ZXIgbG9va3VwcykKCQkJc2VsZjo6JF9mbGlwcGVkQnVpbHRJbkZvcm1hdHMgPSBhcnJheV9mbGlwKHNlbGY6OiRfYnVpbHRJbkZvcm1hdHMpOwoJCX0KCX0KCgkvKioKCSAqIEdldCBidWlsdC1pbiBmb3JtYXQgY29kZQoJICoKCSAqIEBwYXJhbQlpbnQJCSRwSW5kZXgKCSAqIEByZXR1cm4Jc3RyaW5nCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gYnVpbHRJbkZvcm1hdENvZGUoJHBJbmRleCkKCXsKCQkvLyBDbGVhbiBwYXJhbWV0ZXIKCQkkcEluZGV4ID0gaW50dmFsKCRwSW5kZXgpOwoKCQkvLyBFbnN1cmUgYnVpbHQtaW4gZm9ybWF0IGNvZGVzIGFyZSBhdmFpbGFibGUKCQlzZWxmOjpmaWxsQnVpbHRJbkZvcm1hdENvZGVzKCk7CgoJCS8vIExvb2t1cCBmb3JtYXQgY29kZQoJCWlmIChpc3NldChzZWxmOjokX2J1aWx0SW5Gb3JtYXRzWyRwSW5kZXhdKSkgewoJCQlyZXR1cm4gc2VsZjo6JF9idWlsdEluRm9ybWF0c1skcEluZGV4XTsKCQl9CgoJCXJldHVybiAnJzsKCX0KCgkvKioKCSAqIEdldCBidWlsdC1pbiBmb3JtYXQgY29kZSBpbmRleAoJICoKCSAqIEBwYXJhbQlzdHJpbmcJCSRmb3JtYXRDb2RlCgkgKiBAcmV0dXJuCWludHxib29sZWFuCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gYnVpbHRJbkZvcm1hdENvZGVJbmRleCgkZm9ybWF0Q29kZSkKCXsKCQkvLyBFbnN1cmUgYnVpbHQtaW4gZm9ybWF0IGNvZGVzIGFyZSBhdmFpbGFibGUKCQlzZWxmOjpmaWxsQnVpbHRJbkZvcm1hdENvZGVzKCk7CgoJCS8vIExvb2t1cCBmb3JtYXQgY29kZQoJCWlmIChpc3NldChzZWxmOjokX2ZsaXBwZWRCdWlsdEluRm9ybWF0c1skZm9ybWF0Q29kZV0pKSB7CgkJCXJldHVybiBzZWxmOjokX2ZsaXBwZWRCdWlsdEluRm9ybWF0c1skZm9ybWF0Q29kZV07CgkJfQoKCQlyZXR1cm4gZmFsc2U7Cgl9CgoJLyoqCgkgKiBHZXQgaGFzaCBjb2RlCgkgKgoJICogQHJldHVybiBzdHJpbmcJSGFzaCBjb2RlCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRIYXNoQ29kZSgpCgl7CgkJaWYgKCR0aGlzLT5faXNTdXBlcnZpc29yKSB7CgkJCXJldHVybiAkdGhpcy0+Z2V0U2hhcmVkQ29tcG9uZW50KCktPmdldEhhc2hDb2RlKCk7CgkJfQoJCXJldHVybiBtZDUoCgkJCSAgJHRoaXMtPl9mb3JtYXRDb2RlCgkJCS4gJHRoaXMtPl9idWlsdEluRm9ybWF0Q29kZQoJCQkuIF9fQ0xBU1NfXwoJCSk7Cgl9CgoJLyoqCgkgKiBJbXBsZW1lbnQgUEhQIF9fY2xvbmUgdG8gY3JlYXRlIGEgZGVlcCBjbG9uZSwgbm90IGp1c3QgYSBzaGFsbG93IGNvcHkuCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBfX2Nsb25lKCkKCXsKCQkkdmFycyA9IGdldF9vYmplY3RfdmFycygkdGhpcyk7CgkJZm9yZWFjaCAoJHZhcnMgYXMgJGtleSA9PiAkdmFsdWUpIHsKCQkJaWYgKChpc19vYmplY3QoJHZhbHVlKSkgJiYgKCRrZXkgIT0gJ19wYXJlbnQnKSkgewoJCQkJJHRoaXMtPiRrZXkgPSBjbG9uZSAkdmFsdWU7CgkJCX0gZWxzZSB7CgkJCQkkdGhpcy0+JGtleSA9ICR2YWx1ZTsKCQkJfQoJCX0KCX0KCgkvKioKCSAqIFNlYXJjaC9yZXBsYWNlIHZhbHVlcyB0byBjb252ZXJ0IEV4Y2VsIGRhdGUvdGltZSBmb3JtYXQgbWFza3MgdG8gUEhQIGZvcm1hdCBtYXNrcwoJICoKCSAqIEB2YXIgYXJyYXkKCSAqLwoJcHJpdmF0ZSBzdGF0aWMgJF9kYXRlRm9ybWF0UmVwbGFjZW1lbnRzID0gYXJyYXkoCgkJCS8vIGZpcnN0IHJlbW92ZSBlc2NhcGVzIHJlbGF0ZWQgdG8gbm9uLWZvcm1hdCBjaGFyYWN0ZXJzCgkJCSdcXCcJPT4gJycsCgkJCS8vCTEyLWhvdXIgc3VmZml4CgkJCSdhbS9wbScJPT4gJ0EnLAoJCQkvLwk0LWRpZ2l0IHllYXIKCQkJJ3l5eXknCT0+ICdZJywKCQkJLy8JMi1kaWdpdCB5ZWFyCgkJCSd5eScJPT4gJ3knLAoJCQkvLwlmaXJzdCBsZXR0ZXIgb2YgbW9udGggLSBubyBwaHAgZXF1aXZhbGVudAoJCQknbW1tbW0nCT0+ICdNJywKCQkJLy8JZnVsbCBtb250aCBuYW1lCgkJCSdtbW1tJwk9PiAnRicsCgkJCS8vCXNob3J0IG1vbnRoIG5hbWUKCQkJJ21tbScJPT4gJ00nLAoJCQkvLwltbSBpcyBtaW51dGVzIGlmIHRpbWUgb3IgbW9udGggdy9sZWFkaW5nIHplcm8KCQkJJzptbScJPT4gJzppJywKCQkJLy8JbW9udGggbGVhZGluZyB6ZXJvCgkJCSdtbScJPT4gJ20nLAoJCQkvLwltb250aCBubyBsZWFkaW5nIHplcm8KCQkJJ20nCQk9PiAnbicsCgkJCS8vCWZ1bGwgZGF5IG9mIHdlZWsgbmFtZQoJCQknZGRkZCcJPT4gJ2wnLAoJCQkvLwlzaG9ydCBkYXkgb2Ygd2VlayBuYW1lCgkJCSdkZGQnCT0+ICdEJywKCQkJLy8JZGF5cyBsZWFkaW5nIHplcm8KCQkJJ2RkJwk9PiAnZCcsCgkJCS8vCWRheXMgbm8gbGVhZGluZyB6ZXJvCgkJCSdkJwkJPT4gJ2onLAoJCQkvLwlzZWNvbmRzCgkJCSdzcycJPT4gJ3MnLAoJCQkvLwlmcmFjdGlvbmFsIHNlY29uZHMgLSBubyBwaHAgZXF1aXZhbGVudAoJCQknLnMnCT0+ICcnCgkJKTsKCS8qKgoJICogU2VhcmNoL3JlcGxhY2UgdmFsdWVzIHRvIGNvbnZlcnQgRXhjZWwgZGF0ZS90aW1lIGZvcm1hdCBtYXNrcyBob3VycyB0byBQSFAgZm9ybWF0IG1hc2tzICgyNCBociBjbG9jaykKCSAqCgkgKiBAdmFyIGFycmF5CgkgKi8KCXByaXZhdGUgc3RhdGljICRfZGF0ZUZvcm1hdFJlcGxhY2VtZW50czI0ID0gYXJyYXkoCgkJCSdoaCcJPT4gJ0gnLAoJCQknaCcJCT0+ICdHJwoJCSk7CgkvKioKCSAqIFNlYXJjaC9yZXBsYWNlIHZhbHVlcyB0byBjb252ZXJ0IEV4Y2VsIGRhdGUvdGltZSBmb3JtYXQgbWFza3MgaG91cnMgdG8gUEhQIGZvcm1hdCBtYXNrcyAoMTIgaHIgY2xvY2spCgkgKgoJICogQHZhciBhcnJheQoJICovCglwcml2YXRlIHN0YXRpYyAkX2RhdGVGb3JtYXRSZXBsYWNlbWVudHMxMiA9IGFycmF5KAoJCQknaGgnCT0+ICdoJywKCQkJJ2gnCQk9PiAnZycKCQkpOwoKCS8qKgoJICogQ29udmVydCBhIHZhbHVlIGluIGEgcHJlLWRlZmluZWQgZm9ybWF0IHRvIGEgUEhQIHN0cmluZwoJICoKCSAqIEBwYXJhbSBtaXhlZAkkdmFsdWUJCVZhbHVlIHRvIGZvcm1hdAoJICogQHBhcmFtIHN0cmluZwkkZm9ybWF0CQlGb3JtYXQgY29kZQoJICogQHBhcmFtIGFycmF5CQkkY2FsbEJhY2sJQ2FsbGJhY2sgZnVuY3Rpb24gZm9yIGFkZGl0aW9uYWwgZm9ybWF0dGluZyBvZiBzdHJpbmcKCSAqIEByZXR1cm4gc3RyaW5nCUZvcm1hdHRlZCBzdHJpbmcKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiB0b0Zvcm1hdHRlZFN0cmluZygkdmFsdWUgPSAnJywgJGZvcm1hdCA9ICcnLCAkY2FsbEJhY2sgPSBudWxsKQoJewoJCS8vIEZvciBub3cgd2UgZG8gbm90IHRyZWF0IHN0cmluZ3MgYWx0aG91Z2ggc2VjdGlvbiA0IG9mIGEgZm9ybWF0IGNvZGUgYWZmZWN0cyBzdHJpbmdzCgkJaWYgKCFpc19udW1lcmljKCR2YWx1ZSkpIHJldHVybiAkdmFsdWU7CgoJCS8vIEZvciAnR2VuZXJhbCcgZm9ybWF0IGNvZGUsIHdlIGp1c3QgcGFzcyB0aGUgdmFsdWUgYWx0aG91Z2ggdGhpcyBpcyBub3QgZW50aXJlbHkgdGhlIHdheSBFeGNlbCBkb2VzIGl0LAoJCS8vIGl0IHNlZW1zIHRvIHJvdW5kIG51bWJlcnMgdG8gYSB0b3RhbCBvZiAxMCBkaWdpdHMuCgkJaWYgKCgkZm9ybWF0ID09PSBQSFBFeGNlbF9TdHlsZV9OdW1iZXJGb3JtYXQ6OkZPUk1BVF9HRU5FUkFMKSB8fCAoJGZvcm1hdCA9PT0gUEhQRXhjZWxfU3R5bGVfTnVtYmVyRm9ybWF0OjpGT1JNQVRfVEVYVCkpIHsKCQkJcmV0dXJuICR2YWx1ZTsKCQl9CgoJCS8vIEdldCB0aGUgc2VjdGlvbnMsIHRoZXJlIGNhbiBiZSB1cCB0byBmb3VyIHNlY3Rpb25zCgkJJHNlY3Rpb25zID0gZXhwbG9kZSgnOycsICRmb3JtYXQpOwoKCQkvLyBGZXRjaCB0aGUgcmVsZXZhbnQgc2VjdGlvbiBkZXBlbmRpbmcgb24gd2hldGhlciBudW1iZXIgaXMgcG9zaXRpdmUsIG5lZ2F0aXZlLCBvciB6ZXJvPwoJCS8vIFRleHQgbm90IHN1cHBvcnRlZCB5ZXQuCgkJLy8gSGVyZSBpcyBob3cgdGhlIHNlY3Rpb25zIGFwcGx5IHRvIHZhcmlvdXMgdmFsdWVzIGluIEV4Y2VsOgoJCS8vICAgMSBzZWN0aW9uOiAgIFtQT1NJVElWRS9ORUdBVElWRS9aRVJPL1RFWFRdCgkJLy8gICAyIHNlY3Rpb25zOiAgW1BPU0lUSVZFL1pFUk8vVEVYVF0gW05FR0FUSVZFXQoJCS8vICAgMyBzZWN0aW9uczogIFtQT1NJVElWRS9URVhUXSBbTkVHQVRJVkVdIFtaRVJPXQoJCS8vICAgNCBzZWN0aW9uczogIFtQT1NJVElWRV0gW05FR0FUSVZFXSBbWkVST10gW1RFWFRdCgkJc3dpdGNoIChjb3VudCgkc2VjdGlvbnMpKSB7CgkJCWNhc2UgMToKCQkJCSRmb3JtYXQgPSAkc2VjdGlvbnNbMF07CgkJCQlicmVhazsKCgkJCWNhc2UgMjoKCQkJCSRmb3JtYXQgPSAoJHZhbHVlID49IDApID8gJHNlY3Rpb25zWzBdIDogJHNlY3Rpb25zWzFdOwoJCQkJJHZhbHVlID0gYWJzKCR2YWx1ZSk7IC8vIFVzZSB0aGUgYWJzb2x1dGUgdmFsdWUKCQkJCWJyZWFrOwoKCQkJY2FzZSAzOgoJCQkJJGZvcm1hdCA9ICgkdmFsdWUgPiAwKSA/CgkJCQkJJHNlY3Rpb25zWzBdIDogKCAoJHZhbHVlIDwgMCkgPwoJCQkJCQkkc2VjdGlvbnNbMV0gOiAkc2VjdGlvbnNbMl0pOwoJCQkJJHZhbHVlID0gYWJzKCR2YWx1ZSk7IC8vIFVzZSB0aGUgYWJzb2x1dGUgdmFsdWUKCQkJCWJyZWFrOwoKCQkJY2FzZSA0OgoJCQkJJGZvcm1hdCA9ICgkdmFsdWUgPiAwKSA/CgkJCQkJJHNlY3Rpb25zWzBdIDogKCAoJHZhbHVlIDwgMCkgPwoJCQkJCQkkc2VjdGlvbnNbMV0gOiAkc2VjdGlvbnNbMl0pOwoJCQkJJHZhbHVlID0gYWJzKCR2YWx1ZSk7IC8vIFVzZSB0aGUgYWJzb2x1dGUgdmFsdWUKCQkJCWJyZWFrOwoKCQkJZGVmYXVsdDoKCQkJCS8vIHNvbWV0aGluZyBpcyB3cm9uZywganVzdCB1c2UgZmlyc3Qgc2VjdGlvbgoJCQkJJGZvcm1hdCA9ICRzZWN0aW9uc1swXTsKCQkJCWJyZWFrOwoJCX0KCgkJLy8gU2F2ZSBmb3JtYXQgd2l0aCBjb2xvciBpbmZvcm1hdGlvbiBmb3IgbGF0ZXIgdXNlIGJlbG93CgkJJGZvcm1hdENvbG9yID0gJGZvcm1hdDsKCgkJLy8gU3RyaXAgY29sb3IgaW5mb3JtYXRpb24KCQkkY29sb3JfcmVnZXggPSAnL15cXFtbYS16QS1aXStcXF0vJzsKCQkkZm9ybWF0ID0gcHJlZ19yZXBsYWNlKCRjb2xvcl9yZWdleCwgJycsICRmb3JtYXQpOwoKCQkvLyBMZXQncyBiZWdpbiBpbnNwZWN0aW5nIHRoZSBmb3JtYXQgYW5kIGNvbnZlcnRpbmcgdGhlIHZhbHVlIHRvIGEgZm9ybWF0dGVkIHN0cmluZwoJCWlmIChwcmVnX21hdGNoKCcvXihcW1wkW0EtWl0qLVswLTlBLUZdKlxdKSpbaG1zZHldL2knLCAkZm9ybWF0KSkgeyAvLyBkYXRldGltZSBmb3JtYXQKCQkJLy8gZHZjOiBjb252ZXJ0IEV4Y2VsIGZvcm1hdHMgdG8gUEhQIGRhdGUgZm9ybWF0cwoKCQkJLy8gc3RyaXAgb2ZmIGZpcnN0IHBhcnQgY29udGFpbmluZyBlLmcuIFskLUY4MDBdIG9yIFskVVNELTQwOV0KCQkJLy8gZ2VuZXJhbCBzeW50YXg6IFskPEN1cnJlbmN5IHN0cmluZz4tPGxhbmd1YWdlIGluZm8+XQoJCQkvLyBsYW5ndWFnZSBpbmZvIGlzIGluIGhleGFkZWNpbWFsCgkJCSRmb3JtYXQgPSBwcmVnX3JlcGxhY2UoJy9eKFxbXCRbQS1aXSotWzAtOUEtRl0qXF0pL2knLCAnJywgJGZvcm1hdCk7CgoJCQkvLyBPcGVuT2ZmaWNlLm9yZyB1c2VzIHVwcGVyLWNhc2UgbnVtYmVyIGZvcm1hdHMsIGUuZy4gJ1lZWVknLCBjb252ZXJ0IHRvIGxvd2VyLWNhc2UKCQkJJGZvcm1hdCA9IHN0cnRvbG93ZXIoJGZvcm1hdCk7CgoJCQkkZm9ybWF0ID0gc3RydHIoJGZvcm1hdCxzZWxmOjokX2RhdGVGb3JtYXRSZXBsYWNlbWVudHMpOwoJCQlpZiAoIXN0cnBvcygkZm9ybWF0LCdBJykpIHsJLy8gMjQtaG91ciB0aW1lIGZvcm1hdAoJCQkJJGZvcm1hdCA9IHN0cnRyKCRmb3JtYXQsc2VsZjo6JF9kYXRlRm9ybWF0UmVwbGFjZW1lbnRzMjQpOwoJCQl9IGVsc2UgewkJCQkJLy8gMTItaG91ciB0aW1lIGZvcm1hdAoJCQkJJGZvcm1hdCA9IHN0cnRyKCRmb3JtYXQsc2VsZjo6JF9kYXRlRm9ybWF0UmVwbGFjZW1lbnRzMTIpOwoJCQl9CgoJCQkkZGF0ZU9iaiA9IFBIUEV4Y2VsX1NoYXJlZF9EYXRlOjpFeGNlbFRvUEhQT2JqZWN0KCR2YWx1ZSk7CgkJCSR2YWx1ZSA9ICRkYXRlT2JqLT5mb3JtYXQoJGZvcm1hdCk7CgoJCX0gZWxzZSBpZiAocHJlZ19tYXRjaCgnLyUkLycsICRmb3JtYXQpKSB7IC8vICUgbnVtYmVyIGZvcm1hdAoJCQlpZiAoJGZvcm1hdCA9PT0gc2VsZjo6Rk9STUFUX1BFUkNFTlRBR0UpIHsKCQkJCSR2YWx1ZSA9IHJvdW5kKCAoMTAwICogJHZhbHVlKSwgMCkgLiAnJSc7CgkJCX0gZWxzZSB7CgkJCQlpZiAocHJlZ19tYXRjaCgnL1wuWyMwXSsvaScsICRmb3JtYXQsICRtKSkgewoJCQkJCSRzID0gc3Vic3RyKCRtWzBdLCAwLCAxKSAuIChzdHJsZW4oJG1bMF0pIC0gMSk7CgkJCQkJJGZvcm1hdCA9IHN0cl9yZXBsYWNlKCRtWzBdLCAkcywgJGZvcm1hdCk7CgkJCQl9CgkJCQlpZiAocHJlZ19tYXRjaCgnL15bIzBdKy8nLCAkZm9ybWF0LCAkbSkpIHsKCQkJCQkkZm9ybWF0ID0gc3RyX3JlcGxhY2UoJG1bMF0sIHN0cmxlbigkbVswXSksICRmb3JtYXQpOwoJCQkJfQoJCQkJJGZvcm1hdCA9ICclJyAuIHN0cl9yZXBsYWNlKCclJywgJ2YlJScsICRmb3JtYXQpOwoKCQkJCSR2YWx1ZSA9IHNwcmludGYoJGZvcm1hdCwgMTAwICogJHZhbHVlKTsKCQkJfQoKCQl9IGVsc2UgewoJCQlpZiAoJGZvcm1hdCA9PT0gc2VsZjo6Rk9STUFUX0NVUlJFTkNZX0VVUl9TSU1QTEUpIHsKCQkJCSR2YWx1ZSA9ICdFVVIgJyAuIHNwcmludGYoJyUxLjJmJywgJHZhbHVlKTsKCgkJCX0gZWxzZSB7CgkJCQkvLyBJbiBFeGNlbCBmb3JtYXRzLCAiXyIgaXMgdXNlZCB0byBhZGQgc3BhY2luZywgd2hpY2ggd2UgY2FuJ3QgZG8gaW4gSFRNTAoJCQkJJGZvcm1hdCA9IHByZWdfcmVwbGFjZSgnL18uLycsICcnLCAkZm9ybWF0KTsKCgkJCQkvLyBTb21lIG5vbi1udW1iZXIgY2hhcmFjdGVycyBhcmUgZXNjYXBlZCB3aXRoIFwsIHdoaWNoIHdlIGRvbid0IG5lZWQKCQkJCSRmb3JtYXQgPSBwcmVnX3JlcGxhY2UoIi9cXFxcLyIsICcnLCAkZm9ybWF0KTsKCgkJCQkvLyBTb21lIG5vbi1udW1iZXIgc3RyaW5ncyBhcmUgcXVvdGVkLCBzbyB3ZSdsbCBnZXQgcmlkIG9mIHRoZSBxdW90ZXMsIGxpa2V3aXNlIGFueSBwb3NpdGlvbmFsICogc3ltYm9scwoJCQkJJGZvcm1hdCA9IHN0cl9yZXBsYWNlKGFycmF5KCciJywnKicpLCAnJywgJGZvcm1hdCk7CgoJCQkJLy8gRmluZCBvdXQgaWYgd2UgbmVlZCB0aG91c2FuZHMgc2VwYXJhdG9yCgkJCQkvLyBUaGlzIGlzIGluZGljYXRlZCBieSBhIGNvbW1hIGVuY2xvc2VkIGJ5IGEgZGlnaXQgcGxhY2Vob2xkZXI6CgkJCQkvLwkJIywjICAgb3IgICAwLDAKCQkJCSR1c2VUaG91c2FuZHMgPSBwcmVnX21hdGNoKCcvKCMsI3wwLDApLycsICRmb3JtYXQpOwoJCQkJaWYgKCR1c2VUaG91c2FuZHMpIHsKCQkJCQkkZm9ybWF0ID0gcHJlZ19yZXBsYWNlKCcvMCwwLycsICcwMCcsICRmb3JtYXQpOwoJCQkJCSRmb3JtYXQgPSBwcmVnX3JlcGxhY2UoJy8jLCMvJywgJyMjJywgJGZvcm1hdCk7CgkJCQl9CgoJCQkJLy8gU2NhbGUgdGhvdXNhbmRzLCBtaWxsaW9ucywuLi4KCQkJCS8vIFRoaXMgaXMgaW5kaWNhdGVkIGJ5IGEgbnVtYmVyIG9mIGNvbW1hcyBhZnRlciBhIGRpZ2l0IHBsYWNlaG9sZGVyOgoJCQkJLy8JCSMsICAgb3IJMC4wLCwKCQkJCSRzY2FsZSA9IDE7IC8vIHNhbWUgYXMgbm8gc2NhbGUKCQkJCSRtYXRjaGVzID0gYXJyYXkoKTsKCQkJCWlmIChwcmVnX21hdGNoKCcvKCN8MCkoLCspLycsICRmb3JtYXQsICRtYXRjaGVzKSkgewoJCQkJCSRzY2FsZSA9IHBvdygxMDAwLCBzdHJsZW4oJG1hdGNoZXNbMl0pKTsKCgkJCQkJLy8gc3RyaXAgdGhlIGNvbW1hcwoJCQkJCSRmb3JtYXQgPSBwcmVnX3JlcGxhY2UoJy8wLCsvJywgJzAnLCAkZm9ybWF0KTsKCQkJCQkkZm9ybWF0ID0gcHJlZ19yZXBsYWNlKCcvIywrLycsICcjJywgJGZvcm1hdCk7CgkJCQl9CgoJCQkJaWYgKHByZWdfbWF0Y2goJy8jPy4qXD9cL1w/LycsICRmb3JtYXQsICRtKSkgewoJCQkJCS8vZWNobyAnRm9ybWF0IG1hc2sgaXMgZnJhY3Rpb25hbCAnLiRmb3JtYXQuJyA8YnIgLz4nOwoJCQkJCWlmICgkdmFsdWUgIT0gKGludCkkdmFsdWUpIHsKCQkJCQkJJHNpZ24gPSAoJHZhbHVlIDwgMCkgPyAnLScgOiAnJzsKCgkJCQkJCSRpbnRlZ2VyUGFydCA9IGZsb29yKGFicygkdmFsdWUpKTsKCQkJCQkJJGRlY2ltYWxQYXJ0ID0gdHJpbShmbW9kKGFicygkdmFsdWUpLDEpLCcwLicpOwoJCQkJCQkkZGVjaW1hbExlbmd0aCA9IHN0cmxlbigkZGVjaW1hbFBhcnQpOwoJCQkJCQkkZGVjaW1hbERpdmlzb3IgPSBwb3coMTAsJGRlY2ltYWxMZW5ndGgpOwoKCQkJCQkJJEdDRCA9IFBIUEV4Y2VsX0NhbGN1bGF0aW9uX01hdGhUcmlnOjpHQ0QoJGRlY2ltYWxQYXJ0LCRkZWNpbWFsRGl2aXNvcik7CgoJCQkJCQkkYWRqdXN0ZWREZWNpbWFsUGFydCA9ICRkZWNpbWFsUGFydC8kR0NEOwoJCQkJCQkkYWRqdXN0ZWREZWNpbWFsRGl2aXNvciA9ICRkZWNpbWFsRGl2aXNvci8kR0NEOwoKCQkJCQkJaWYgKChzdHJwb3MoJGZvcm1hdCwnMCcpICE9PSBmYWxzZSkgfHwgKHN0cnBvcygkZm9ybWF0LCcjJykgIT09IGZhbHNlKSB8fCAoc3Vic3RyKCRmb3JtYXQsMCwzKSA9PSAnPyA/JykpIHsKCQkJCQkJCWlmICgkaW50ZWdlclBhcnQgPT0gMCkgeyAkaW50ZWdlclBhcnQgPSAnJzsgfQoJCQkJCQkJJHZhbHVlID0gIiRzaWduJGludGVnZXJQYXJ0ICRhZGp1c3RlZERlY2ltYWxQYXJ0LyRhZGp1c3RlZERlY2ltYWxEaXZpc29yIjsKCQkJCQkJfSBlbHNlIHsKCQkJCQkJCSRhZGp1c3RlZERlY2ltYWxQYXJ0ICs9ICRpbnRlZ2VyUGFydCAqICRhZGp1c3RlZERlY2ltYWxEaXZpc29yOwoJCQkJCQkJJHZhbHVlID0gIiRzaWduJGFkanVzdGVkRGVjaW1hbFBhcnQvJGFkanVzdGVkRGVjaW1hbERpdmlzb3IiOwoJCQkJCQl9CgkJCQkJfQoKCQkJCX0gZWxzZSB7CgkJCQkJLy8gSGFuZGxlIHRoZSBudW1iZXIgaXRzZWxmCgoJCQkJCS8vIHNjYWxlIG51bWJlcgoJCQkJCSR2YWx1ZSA9ICR2YWx1ZSAvICRzY2FsZTsKCgkJCQkJLy8gU3RyaXAgIwoJCQkJCSRmb3JtYXQgPSBwcmVnX3JlcGxhY2UoJy9cXCMvJywgJycsICRmb3JtYXQpOwoKCQkJCQkkbiA9ICIvXFtbXlxdXStcXS8iOwoJCQkJCSRtID0gcHJlZ19yZXBsYWNlKCRuLCAnJywgJGZvcm1hdCk7CgkJCQkJJG51bWJlcl9yZWdleCA9ICIvKDArKShcLj8pKDAqKS8iOwoJCQkJCWlmIChwcmVnX21hdGNoKCRudW1iZXJfcmVnZXgsICRtLCAkbWF0Y2hlcykpIHsKCQkJCQkJJGxlZnQgPSAkbWF0Y2hlc1sxXTsKCQkJCQkJJGRlYyA9ICRtYXRjaGVzWzJdOwoJCQkJCQkkcmlnaHQgPSAkbWF0Y2hlc1szXTsKCgkJCQkJCS8vIG1pbmltdW4gd2lkdGggb2YgZm9ybWF0dGVkIG51bWJlciAoaW5jbHVkaW5nIGRvdCkKCQkJCQkJJG1pbldpZHRoID0gc3RybGVuKCRsZWZ0KSArIHN0cmxlbigkZGVjKSArIHN0cmxlbigkcmlnaHQpOwoKCQkJCQkJaWYgKCR1c2VUaG91c2FuZHMpIHsKCQkJCQkJCSR2YWx1ZSA9IG51bWJlcl9mb3JtYXQoCgkJCQkJCQkJCQkkdmFsdWUKCQkJCQkJCQkJCSwgc3RybGVuKCRyaWdodCkKCQkJCQkJCQkJCSwgUEhQRXhjZWxfU2hhcmVkX1N0cmluZzo6Z2V0RGVjaW1hbFNlcGFyYXRvcigpCgkJCQkJCQkJCQksIFBIUEV4Y2VsX1NoYXJlZF9TdHJpbmc6OmdldFRob3VzYW5kc1NlcGFyYXRvcigpCgkJCQkJCQkJCSk7CgkJCQkJCX0gZWxzZSB7CgkJCQkJCQkkc3ByaW50Zl9wYXR0ZXJuID0gIiUwJG1pbldpZHRoLiIgLiBzdHJsZW4oJHJpZ2h0KSAuICJmIjsKCQkJCQkJCSR2YWx1ZSA9IHNwcmludGYoJHNwcmludGZfcGF0dGVybiwgJHZhbHVlKTsKCQkJCQkJfQoKCQkJCQkJJHZhbHVlID0gcHJlZ19yZXBsYWNlKCRudW1iZXJfcmVnZXgsICR2YWx1ZSwgJGZvcm1hdCk7CgkJCQkJfQoJCQkJfQoJCQkJaWYgKHByZWdfbWF0Y2goJy9cW1wkKC4qKVxdL3UnLCAkZm9ybWF0LCAkbSkpIHsKCQkJCQkvLwlDdXJyZW5jeSBvciBBY2NvdW50aW5nCgkJCQkJJGN1cnJlbmN5Rm9ybWF0ID0gJG1bMF07CgkJCQkJJGN1cnJlbmN5Q29kZSA9ICRtWzFdOwoJCQkJCWxpc3QoJGN1cnJlbmN5Q29kZSkgPSBleHBsb2RlKCctJywkY3VycmVuY3lDb2RlKTsKCQkJCQlpZiAoJGN1cnJlbmN5Q29kZSA9PSAnJykgewoJCQkJCQkkY3VycmVuY3lDb2RlID0gUEhQRXhjZWxfU2hhcmVkX1N0cmluZzo6Z2V0Q3VycmVuY3lDb2RlKCk7CgkJCQkJfQoJCQkJCSR2YWx1ZSA9IHByZWdfcmVwbGFjZSgnL1xbXCQoW15cXV0qKVxdL3UnLCRjdXJyZW5jeUNvZGUsJHZhbHVlKTsKCQkJCX0KCQkJfQoJCX0KCgkJLy8gQWRkaXRpb25hbCBmb3JtYXR0aW5nIHByb3ZpZGVkIGJ5IGNhbGxiYWNrIGZ1bmN0aW9uCgkJaWYgKCRjYWxsQmFjayAhPT0gbnVsbCkgewoJCQlsaXN0KCR3cml0ZXJJbnN0YW5jZSwgJGZ1bmN0aW9uKSA9ICRjYWxsQmFjazsKCQkJJHZhbHVlID0gJHdyaXRlckluc3RhbmNlLT4kZnVuY3Rpb24oJHZhbHVlLCAkZm9ybWF0Q29sb3IpOwoJCX0KCgkJcmV0dXJuICR2YWx1ZTsKCX0KCn0K]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Style/Protection.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIFBIUEV4Y2VsCiAqCiAqIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICoKICogQGNhdGVnb3J5ICAgUEhQRXhjZWwKICogQHBhY2thZ2UgICAgUEhQRXhjZWxfU3R5bGUKICogQGNvcHlyaWdodCAgQ29weXJpZ2h0IChjKSAyMDA2IC0gMjAxMiBQSFBFeGNlbCAoaHR0cDovL3d3dy5jb2RlcGxleC5jb20vUEhQRXhjZWwpCiAqIEBsaWNlbnNlICAgIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9vbGQtbGljZW5zZXMvbGdwbC0yLjEudHh0CUxHUEwKICogQHZlcnNpb24gICAgMS40LjUsIDIwMDctMDgtMjMKICovCgoKLyoqCiAqIFBIUEV4Y2VsX1N0eWxlX1Byb3RlY3Rpb24KICoKICogQGNhdGVnb3J5ICAgUEhQRXhjZWwKICogQHBhY2thZ2UgICAgUEhQRXhjZWxfU3R5bGUKICogQGNvcHlyaWdodCAgQ29weXJpZ2h0IChjKSAyMDA2IC0gMjAxMiBQSFBFeGNlbCAoaHR0cDovL3d3dy5jb2RlcGxleC5jb20vUEhQRXhjZWwpCiAqLwpjbGFzcyBQSFBFeGNlbF9TdHlsZV9Qcm90ZWN0aW9uIGltcGxlbWVudHMgUEhQRXhjZWxfSUNvbXBhcmFibGUKewoJLyoqIFByb3RlY3Rpb24gc3R5bGVzICovCgljb25zdCBQUk9URUNUSU9OX0lOSEVSSVQJCT0gJ2luaGVyaXQnOwoJY29uc3QgUFJPVEVDVElPTl9QUk9URUNURUQJCT0gJ3Byb3RlY3RlZCc7Cgljb25zdCBQUk9URUNUSU9OX1VOUFJPVEVDVEVECT0gJ3VucHJvdGVjdGVkJzsKCgkvKioKCSAqIExvY2tlZAoJICoKCSAqIEB2YXIgc3RyaW5nCgkgKi8KCXByaXZhdGUgJF9sb2NrZWQ7CgoJLyoqCgkgKiBIaWRkZW4KCSAqCgkgKiBAdmFyIHN0cmluZwoJICovCglwcml2YXRlICRfaGlkZGVuOwoKCS8qKgoJICogUGFyZW50IEJvcmRlcnMKCSAqCgkgKiBAdmFyIF9wYXJlbnRQcm9wZXJ0eU5hbWUgc3RyaW5nCgkgKi8KCXByaXZhdGUgJF9wYXJlbnRQcm9wZXJ0eU5hbWU7CgoJLyoqCgkgKiBTdXBlcnZpc29yPwoJICoKCSAqIEB2YXIgYm9vbGVhbgoJICovCglwcml2YXRlICRfaXNTdXBlcnZpc29yOwoKCS8qKgoJICogUGFyZW50LiBPbmx5IHVzZWQgZm9yIHN1cGVydmlzb3IKCSAqCgkgKiBAdmFyIFBIUEV4Y2VsX1N0eWxlCgkgKi8KCXByaXZhdGUgJF9wYXJlbnQ7CgogICAgLyoqCiAgICAgKiBDcmVhdGUgYSBuZXcgUEhQRXhjZWxfU3R5bGVfUHJvdGVjdGlvbgoJICoKCSAqIEBwYXJhbQlib29sZWFuCSRpc1N1cGVydmlzb3IJRmxhZyBpbmRpY2F0aW5nIGlmIHRoaXMgaXMgYSBzdXBlcnZpc29yIG9yIG5vdAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJGlzU3VwZXJ2aXNvciA9IGZhbHNlKQogICAgewogICAgCS8vIFN1cGVydmlzb3I/CgkJJHRoaXMtPl9pc1N1cGVydmlzb3IgPSAkaXNTdXBlcnZpc29yOwoKICAgIAkvLyBJbml0aWFsaXNlIHZhbHVlcwogICAgCSR0aGlzLT5fbG9ja2VkCQkJPSBzZWxmOjpQUk9URUNUSU9OX0lOSEVSSVQ7CiAgICAJJHRoaXMtPl9oaWRkZW4JCQk9IHNlbGY6OlBST1RFQ1RJT05fSU5IRVJJVDsKICAgIH0KCgkvKioKCSAqIEJpbmQgcGFyZW50LiBPbmx5IHVzZWQgZm9yIHN1cGVydmlzb3IKCSAqCgkgKiBAcGFyYW0gUEhQRXhjZWxfU3R5bGUgJHBhcmVudAoJICogQHJldHVybiBQSFBFeGNlbF9TdHlsZV9Qcm90ZWN0aW9uCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBiaW5kUGFyZW50KCRwYXJlbnQpCgl7CgkJJHRoaXMtPl9wYXJlbnQgPSAkcGFyZW50OwoJCXJldHVybiAkdGhpczsKCX0KCgkvKioKCSAqIElzIHRoaXMgYSBzdXBlcnZpc29yIG9yIGEgcmVhbCBzdHlsZSBjb21wb25lbnQ/CgkgKgoJICogQHJldHVybiBib29sZWFuCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRJc1N1cGVydmlzb3IoKQoJewoJCXJldHVybiAkdGhpcy0+X2lzU3VwZXJ2aXNvcjsKCX0KCgkvKioKCSAqIEdldCB0aGUgc2hhcmVkIHN0eWxlIGNvbXBvbmVudCBmb3IgdGhlIGN1cnJlbnRseSBhY3RpdmUgY2VsbCBpbiBjdXJyZW50bHkgYWN0aXZlIHNoZWV0LgoJICogT25seSB1c2VkIGZvciBzdHlsZSBzdXBlcnZpc29yCgkgKgoJICogQHJldHVybiBQSFBFeGNlbF9TdHlsZV9Qcm90ZWN0aW9uCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRTaGFyZWRDb21wb25lbnQoKQoJewoJCXJldHVybiAkdGhpcy0+X3BhcmVudC0+Z2V0U2hhcmVkQ29tcG9uZW50KCktPmdldFByb3RlY3Rpb24oKTsKCX0KCgkvKioKCSAqIEdldCB0aGUgY3VycmVudGx5IGFjdGl2ZSBzaGVldC4gT25seSB1c2VkIGZvciBzdXBlcnZpc29yCgkgKgoJICogQHJldHVybiBQSFBFeGNlbF9Xb3Jrc2hlZXQKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldEFjdGl2ZVNoZWV0KCkKCXsKCQlyZXR1cm4gJHRoaXMtPl9wYXJlbnQtPmdldEFjdGl2ZVNoZWV0KCk7Cgl9CgoJLyoqCgkgKiBHZXQgdGhlIGN1cnJlbnRseSBhY3RpdmUgY2VsbCBjb29yZGluYXRlIGluIGN1cnJlbnRseSBhY3RpdmUgc2hlZXQuCgkgKiBPbmx5IHVzZWQgZm9yIHN1cGVydmlzb3IKCSAqCgkgKiBAcmV0dXJuIHN0cmluZyBFLmcuICdBMScKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldFNlbGVjdGVkQ2VsbHMoKQoJewoJCXJldHVybiAkdGhpcy0+Z2V0QWN0aXZlU2hlZXQoKS0+Z2V0U2VsZWN0ZWRDZWxscygpOwoJfQoKCS8qKgoJICogR2V0IHRoZSBjdXJyZW50bHkgYWN0aXZlIGNlbGwgY29vcmRpbmF0ZSBpbiBjdXJyZW50bHkgYWN0aXZlIHNoZWV0LgoJICogT25seSB1c2VkIGZvciBzdXBlcnZpc29yCgkgKgoJICogQHJldHVybiBzdHJpbmcgRS5nLiAnQTEnCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRBY3RpdmVDZWxsKCkKCXsKCQlyZXR1cm4gJHRoaXMtPmdldEFjdGl2ZVNoZWV0KCktPmdldEFjdGl2ZUNlbGwoKTsKCX0KCgkvKioKCSAqIEJ1aWxkIHN0eWxlIGFycmF5IGZyb20gc3ViY29tcG9uZW50cwoJICoKCSAqIEBwYXJhbSBhcnJheSAkYXJyYXkKCSAqIEByZXR1cm4gYXJyYXkKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldFN0eWxlQXJyYXkoJGFycmF5KQoJewoJCXJldHVybiBhcnJheSgncHJvdGVjdGlvbicgPT4gJGFycmF5KTsKCX0KCiAgICAvKioKICAgICAqIEFwcGx5IHN0eWxlcyBmcm9tIGFycmF5CiAgICAgKgogICAgICogPGNvZGU+CiAgICAgKiAkb2JqUEhQRXhjZWwtPmdldEFjdGl2ZVNoZWV0KCktPmdldFN0eWxlKCdCMicpLT5nZXRMb2NrZWQoKS0+YXBwbHlGcm9tQXJyYXkoIGFycmF5KCdsb2NrZWQnID0+IHRydWUsICdoaWRkZW4nID0+IGZhbHNlKSApOwogICAgICogPC9jb2RlPgogICAgICoKICAgICAqIEBwYXJhbQlhcnJheQkkcFN0eWxlcwlBcnJheSBjb250YWluaW5nIHN0eWxlIGluZm9ybWF0aW9uCiAgICAgKiBAdGhyb3dzCUV4Y2VwdGlvbgogICAgICogQHJldHVybiBQSFBFeGNlbF9TdHlsZV9Qcm90ZWN0aW9uCiAgICAgKi8KCXB1YmxpYyBmdW5jdGlvbiBhcHBseUZyb21BcnJheSgkcFN0eWxlcyA9IG51bGwpIHsKCQlpZiAoaXNfYXJyYXkoJHBTdHlsZXMpKSB7CgkJCWlmICgkdGhpcy0+X2lzU3VwZXJ2aXNvcikgewoJCQkJJHRoaXMtPmdldEFjdGl2ZVNoZWV0KCktPmdldFN0eWxlKCR0aGlzLT5nZXRTZWxlY3RlZENlbGxzKCkpLT5hcHBseUZyb21BcnJheSgkdGhpcy0+Z2V0U3R5bGVBcnJheSgkcFN0eWxlcykpOwoJCQl9IGVsc2UgewoJCQkJaWYgKGFycmF5X2tleV9leGlzdHMoJ2xvY2tlZCcsICRwU3R5bGVzKSkgewoJCQkJCSR0aGlzLT5zZXRMb2NrZWQoJHBTdHlsZXNbJ2xvY2tlZCddKTsKCQkJCX0KCQkJCWlmIChhcnJheV9rZXlfZXhpc3RzKCdoaWRkZW4nLCAkcFN0eWxlcykpIHsKCQkJCQkkdGhpcy0+c2V0SGlkZGVuKCRwU3R5bGVzWydoaWRkZW4nXSk7CgkJCQl9CgkJCX0KCQl9IGVsc2UgewoJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCJJbnZhbGlkIHN0eWxlIGFycmF5IHBhc3NlZC4iKTsKCQl9CgkJcmV0dXJuICR0aGlzOwoJfQoKICAgIC8qKgogICAgICogR2V0IGxvY2tlZAogICAgICoKICAgICAqIEByZXR1cm4gc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRMb2NrZWQoKSB7CgkJaWYgKCR0aGlzLT5faXNTdXBlcnZpc29yKSB7CgkJCXJldHVybiAkdGhpcy0+Z2V0U2hhcmVkQ29tcG9uZW50KCktPmdldExvY2tlZCgpOwoJCX0KICAgIAlyZXR1cm4gJHRoaXMtPl9sb2NrZWQ7CiAgICB9CgogICAgLyoqCiAgICAgKiBTZXQgbG9ja2VkCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyAkcFZhbHVlCiAgICAgKiBAcmV0dXJuIFBIUEV4Y2VsX1N0eWxlX1Byb3RlY3Rpb24KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHNldExvY2tlZCgkcFZhbHVlID0gc2VsZjo6UFJPVEVDVElPTl9JTkhFUklUKSB7CgkJaWYgKCR0aGlzLT5faXNTdXBlcnZpc29yKSB7CgkJCSRzdHlsZUFycmF5ID0gJHRoaXMtPmdldFN0eWxlQXJyYXkoYXJyYXkoJ2xvY2tlZCcgPT4gJHBWYWx1ZSkpOwoJCQkkdGhpcy0+Z2V0QWN0aXZlU2hlZXQoKS0+Z2V0U3R5bGUoJHRoaXMtPmdldFNlbGVjdGVkQ2VsbHMoKSktPmFwcGx5RnJvbUFycmF5KCRzdHlsZUFycmF5KTsKCQl9IGVsc2UgewoJCQkkdGhpcy0+X2xvY2tlZCA9ICRwVmFsdWU7CgkJfQoJCXJldHVybiAkdGhpczsKICAgIH0KCiAgICAvKioKICAgICAqIEdldCBoaWRkZW4KICAgICAqCiAgICAgKiBAcmV0dXJuIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0SGlkZGVuKCkgewoJCWlmICgkdGhpcy0+X2lzU3VwZXJ2aXNvcikgewoJCQlyZXR1cm4gJHRoaXMtPmdldFNoYXJlZENvbXBvbmVudCgpLT5nZXRIaWRkZW4oKTsKCQl9CiAgICAJcmV0dXJuICR0aGlzLT5faGlkZGVuOwogICAgfQoKICAgIC8qKgogICAgICogU2V0IGhpZGRlbgogICAgICoKICAgICAqIEBwYXJhbSBzdHJpbmcgJHBWYWx1ZQogICAgICogQHJldHVybiBQSFBFeGNlbF9TdHlsZV9Qcm90ZWN0aW9uCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBzZXRIaWRkZW4oJHBWYWx1ZSA9IHNlbGY6OlBST1RFQ1RJT05fSU5IRVJJVCkgewoJCWlmICgkdGhpcy0+X2lzU3VwZXJ2aXNvcikgewoJCQkkc3R5bGVBcnJheSA9ICR0aGlzLT5nZXRTdHlsZUFycmF5KGFycmF5KCdoaWRkZW4nID0+ICRwVmFsdWUpKTsKCQkJJHRoaXMtPmdldEFjdGl2ZVNoZWV0KCktPmdldFN0eWxlKCR0aGlzLT5nZXRTZWxlY3RlZENlbGxzKCkpLT5hcHBseUZyb21BcnJheSgkc3R5bGVBcnJheSk7CgkJfSBlbHNlIHsKCQkJJHRoaXMtPl9oaWRkZW4gPSAkcFZhbHVlOwoJCX0KCQlyZXR1cm4gJHRoaXM7CiAgICB9CgoJLyoqCgkgKiBHZXQgaGFzaCBjb2RlCgkgKgoJICogQHJldHVybiBzdHJpbmcJSGFzaCBjb2RlCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRIYXNoQ29kZSgpIHsKCQlpZiAoJHRoaXMtPl9pc1N1cGVydmlzb3IpIHsKCQkJcmV0dXJuICR0aGlzLT5nZXRTaGFyZWRDb21wb25lbnQoKS0+Z2V0SGFzaENvZGUoKTsKCQl9CiAgICAJcmV0dXJuIG1kNSgKICAgIAkJICAkdGhpcy0+X2xvY2tlZAogICAgCQkuICR0aGlzLT5faGlkZGVuCiAgICAJCS4gX19DTEFTU19fCiAgICAJKTsKICAgIH0KCgkvKioKCSAqIEltcGxlbWVudCBQSFAgX19jbG9uZSB0byBjcmVhdGUgYSBkZWVwIGNsb25lLCBub3QganVzdCBhIHNoYWxsb3cgY29weS4KCSAqLwoJcHVibGljIGZ1bmN0aW9uIF9fY2xvbmUoKSB7CgkJJHZhcnMgPSBnZXRfb2JqZWN0X3ZhcnMoJHRoaXMpOwoJCWZvcmVhY2ggKCR2YXJzIGFzICRrZXkgPT4gJHZhbHVlKSB7CgkJCWlmICgoaXNfb2JqZWN0KCR2YWx1ZSkpICYmICgka2V5ICE9ICdfcGFyZW50JykpIHsKCQkJCSR0aGlzLT4ka2V5ID0gY2xvbmUgJHZhbHVlOwoJCQl9IGVsc2UgewoJCQkJJHRoaXMtPiRrZXkgPSAkdmFsdWU7CgkJCX0KCQl9Cgl9Cn0K]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Worksheet.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIFBIUEV4Y2VsCiAqCiAqIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICoKICogQGNhdGVnb3J5ICAgUEhQRXhjZWwKICogQHBhY2thZ2UJUEhQRXhjZWxfV29ya3NoZWV0CiAqIEBjb3B5cmlnaHQgIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwgKGh0dHA6Ly93d3cuY29kZXBsZXguY29tL1BIUEV4Y2VsKQogKiBAbGljZW5zZQlodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvb2xkLWxpY2Vuc2VzL2xncGwtMi4xLnR4dAlMR1BMCiAqIEB2ZXJzaW9uCTEuNy43LCAyMDEyLTA1LTE5CiAqLwoKCi8qKgogKiBQSFBFeGNlbF9Xb3Jrc2hlZXQKICoKICogQGNhdGVnb3J5ICAgUEhQRXhjZWwKICogQHBhY2thZ2UJUEhQRXhjZWxfV29ya3NoZWV0CiAqIEBjb3B5cmlnaHQgIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwgKGh0dHA6Ly93d3cuY29kZXBsZXguY29tL1BIUEV4Y2VsKQogKi8KY2xhc3MgUEhQRXhjZWxfV29ya3NoZWV0IGltcGxlbWVudHMgUEhQRXhjZWxfSUNvbXBhcmFibGUKewoJLyogQnJlYWsgdHlwZXMgKi8KCWNvbnN0IEJSRUFLX05PTkUJPSAwOwoJY29uc3QgQlJFQUtfUk9XCQk9IDE7Cgljb25zdCBCUkVBS19DT0xVTU4JPSAyOwoKCS8qIFNoZWV0IHN0YXRlICovCgljb25zdCBTSEVFVFNUQVRFX1ZJU0lCTEUJPSAndmlzaWJsZSc7Cgljb25zdCBTSEVFVFNUQVRFX0hJRERFTgk9ICdoaWRkZW4nOwoJY29uc3QgU0hFRVRTVEFURV9WRVJZSElEREVOID0gJ3ZlcnlIaWRkZW4nOwoKCS8qKgoJICogSW52YWxpZCBjaGFyYWN0ZXJzIGluIHNoZWV0IHRpdGxlCgkgKgoJICogQHZhciBhcnJheQoJICovCglwcml2YXRlIHN0YXRpYyAkX2ludmFsaWRDaGFyYWN0ZXJzID0gYXJyYXkoJyonLCAnOicsICcvJywgJ1xcJywgJz8nLCAnWycsICddJyk7CgoJLyoqCgkgKiBQYXJlbnQgc3ByZWFkc2hlZXQKCSAqCgkgKiBAdmFyIFBIUEV4Y2VsCgkgKi8KCXByaXZhdGUgJF9wYXJlbnQ7CgoJLyoqCgkgKiBDYWNoZWFibGUgY29sbGVjdGlvbiBvZiBjZWxscwoJICoKCSAqIEB2YXIgUEhQRXhjZWxfQ2FjaGVkT2JqZWN0U3RvcmFnZV94eHgKCSAqLwoJcHJpdmF0ZSAkX2NlbGxDb2xsZWN0aW9uID0gbnVsbDsKCgkvKioKCSAqIENvbGxlY3Rpb24gb2Ygcm93IGRpbWVuc2lvbnMKCSAqCgkgKiBAdmFyIFBIUEV4Y2VsX1dvcmtzaGVldF9Sb3dEaW1lbnNpb25bXQoJICovCglwcml2YXRlICRfcm93RGltZW5zaW9ucyA9IGFycmF5KCk7CgoJLyoqCgkgKiBEZWZhdWx0IHJvdyBkaW1lbnNpb24KCSAqCgkgKiBAdmFyIFBIUEV4Y2VsX1dvcmtzaGVldF9Sb3dEaW1lbnNpb24KCSAqLwoJcHJpdmF0ZSAkX2RlZmF1bHRSb3dEaW1lbnNpb24gPSBudWxsOwoKCS8qKgoJICogQ29sbGVjdGlvbiBvZiBjb2x1bW4gZGltZW5zaW9ucwoJICoKCSAqIEB2YXIgUEhQRXhjZWxfV29ya3NoZWV0X0NvbHVtbkRpbWVuc2lvbltdCgkgKi8KCXByaXZhdGUgJF9jb2x1bW5EaW1lbnNpb25zID0gYXJyYXkoKTsKCgkvKioKCSAqIERlZmF1bHQgY29sdW1uIGRpbWVuc2lvbgoJICoKCSAqIEB2YXIgUEhQRXhjZWxfV29ya3NoZWV0X0NvbHVtbkRpbWVuc2lvbgoJICovCglwcml2YXRlICRfZGVmYXVsdENvbHVtbkRpbWVuc2lvbiA9IG51bGw7CgoJLyoqCgkgKiBDb2xsZWN0aW9uIG9mIGRyYXdpbmdzCgkgKgoJICogQHZhciBQSFBFeGNlbF9Xb3Jrc2hlZXRfQmFzZURyYXdpbmdbXQoJICovCglwcml2YXRlICRfZHJhd2luZ0NvbGxlY3Rpb24gPSBudWxsOwoKCS8qKgoJICogQ29sbGVjdGlvbiBvZiBDaGFydCBvYmplY3RzCgkgKgoJICogQHZhciBQSFBFeGNlbF9DaGFydFtdCgkgKi8KCXByaXZhdGUgJF9jaGFydENvbGxlY3Rpb24gPSBhcnJheSgpOwoKCS8qKgoJICogV29ya3NoZWV0IHRpdGxlCgkgKgoJICogQHZhciBzdHJpbmcKCSAqLwoJcHJpdmF0ZSAkX3RpdGxlOwoKCS8qKgoJICogU2hlZXQgc3RhdGUKCSAqCgkgKiBAdmFyIHN0cmluZwoJICovCglwcml2YXRlICRfc2hlZXRTdGF0ZTsKCgkvKioKCSAqIFBhZ2Ugc2V0dXAKCSAqCgkgKiBAdmFyIFBIUEV4Y2VsX1dvcmtzaGVldF9QYWdlU2V0dXAKCSAqLwoJcHJpdmF0ZSAkX3BhZ2VTZXR1cDsKCgkvKioKCSAqIFBhZ2UgbWFyZ2lucwoJICoKCSAqIEB2YXIgUEhQRXhjZWxfV29ya3NoZWV0X1BhZ2VNYXJnaW5zCgkgKi8KCXByaXZhdGUgJF9wYWdlTWFyZ2luczsKCgkvKioKCSAqIFBhZ2UgaGVhZGVyL2Zvb3RlcgoJICoKCSAqIEB2YXIgUEhQRXhjZWxfV29ya3NoZWV0X0hlYWRlckZvb3RlcgoJICovCglwcml2YXRlICRfaGVhZGVyRm9vdGVyOwoKCS8qKgoJICogU2hlZXQgdmlldwoJICoKCSAqIEB2YXIgUEhQRXhjZWxfV29ya3NoZWV0X1NoZWV0VmlldwoJICovCglwcml2YXRlICRfc2hlZXRWaWV3OwoKCS8qKgoJICogUHJvdGVjdGlvbgoJICoKCSAqIEB2YXIgUEhQRXhjZWxfV29ya3NoZWV0X1Byb3RlY3Rpb24KCSAqLwoJcHJpdmF0ZSAkX3Byb3RlY3Rpb247CgoJLyoqCgkgKiBDb2xsZWN0aW9uIG9mIHN0eWxlcwoJICoKCSAqIEB2YXIgUEhQRXhjZWxfU3R5bGVbXQoJICovCglwcml2YXRlICRfc3R5bGVzID0gYXJyYXkoKTsKCgkvKioKCSAqIENvbmRpdGlvbmFsIHN0eWxlcy4gSW5kZXhlZCBieSBjZWxsIGNvb3JkaW5hdGUsIGUuZy4gJ0ExJwoJICoKCSAqIEB2YXIgYXJyYXkKCSAqLwoJcHJpdmF0ZSAkX2NvbmRpdGlvbmFsU3R5bGVzQ29sbGVjdGlvbiA9IGFycmF5KCk7CgoJLyoqCgkgKiBJcyB0aGUgY3VycmVudCBjZWxsIGNvbGxlY3Rpb24gc29ydGVkIGFscmVhZHk/CgkgKgoJICogQHZhciBib29sZWFuCgkgKi8KCXByaXZhdGUgJF9jZWxsQ29sbGVjdGlvbklzU29ydGVkID0gZmFsc2U7CgoJLyoqCgkgKiBDb2xsZWN0aW9uIG9mIGJyZWFrcwoJICoKCSAqIEB2YXIgYXJyYXkKCSAqLwoJcHJpdmF0ZSAkX2JyZWFrcyA9IGFycmF5KCk7CgoJLyoqCgkgKiBDb2xsZWN0aW9uIG9mIG1lcmdlZCBjZWxsIHJhbmdlcwoJICoKCSAqIEB2YXIgYXJyYXkKCSAqLwoJcHJpdmF0ZSAkX21lcmdlQ2VsbHMgPSBhcnJheSgpOwoKCS8qKgoJICogQ29sbGVjdGlvbiBvZiBwcm90ZWN0ZWQgY2VsbCByYW5nZXMKCSAqCgkgKiBAdmFyIGFycmF5CgkgKi8KCXByaXZhdGUgJF9wcm90ZWN0ZWRDZWxscyA9IGFycmF5KCk7CgoJLyoqCgkgKiBBdXRvZmlsdGVyIFJhbmdlCgkgKgoJICogQHZhciBzdHJpbmcKCSAqLwoJcHJpdmF0ZSAkX2F1dG9GaWx0ZXIgPSAnJzsKCgkvKioKCSAqIEZyZWV6ZSBwYW5lCgkgKgoJICogQHZhciBzdHJpbmcKCSAqLwoJcHJpdmF0ZSAkX2ZyZWV6ZVBhbmUgPSAnJzsKCgkvKioKCSAqIFNob3cgZ3JpZGxpbmVzPwoJICoKCSAqIEB2YXIgYm9vbGVhbgoJICovCglwcml2YXRlICRfc2hvd0dyaWRsaW5lcyA9IHRydWU7CgoJLyoqCgkqIFByaW50IGdyaWRsaW5lcz8KCSoKCSogQHZhciBib29sZWFuCgkqLwoJcHJpdmF0ZSAkX3ByaW50R3JpZGxpbmVzID0gZmFsc2U7CgoJLyoqCgkqIFNob3cgcm93IGFuZCBjb2x1bW4gaGVhZGVycz8KCSoKCSogQHZhciBib29sZWFuCgkqLwoJcHJpdmF0ZSAkX3Nob3dSb3dDb2xIZWFkZXJzID0gdHJ1ZTsKCgkvKioKCSAqIFNob3cgc3VtbWFyeSBiZWxvdz8gKFJvdy9Db2x1bW4gb3V0bGluZSkKCSAqCgkgKiBAdmFyIGJvb2xlYW4KCSAqLwoJcHJpdmF0ZSAkX3Nob3dTdW1tYXJ5QmVsb3cgPSB0cnVlOwoKCS8qKgoJICogU2hvdyBzdW1tYXJ5IHJpZ2h0PyAoUm93L0NvbHVtbiBvdXRsaW5lKQoJICoKCSAqIEB2YXIgYm9vbGVhbgoJICovCglwcml2YXRlICRfc2hvd1N1bW1hcnlSaWdodCA9IHRydWU7CgoJLyoqCgkgKiBDb2xsZWN0aW9uIG9mIGNvbW1lbnRzCgkgKgoJICogQHZhciBQSFBFeGNlbF9Db21tZW50W10KCSAqLwoJcHJpdmF0ZSAkX2NvbW1lbnRzID0gYXJyYXkoKTsKCgkvKioKCSAqIEFjdGl2ZSBjZWxsLiAoT25seSBvbmUhKQoJICoKCSAqIEB2YXIgc3RyaW5nCgkgKi8KCXByaXZhdGUgJF9hY3RpdmVDZWxsID0gJ0ExJzsKCgkvKioKCSAqIFNlbGVjdGVkIGNlbGxzCgkgKgoJICogQHZhciBzdHJpbmcKCSAqLwoJcHJpdmF0ZSAkX3NlbGVjdGVkQ2VsbHMgPSAnQTEnOwoKCS8qKgoJICogQ2FjaGVkIGhpZ2hlc3QgY29sdW1uCgkgKgoJICogQHZhciBzdHJpbmcKCSAqLwoJcHJpdmF0ZSAkX2NhY2hlZEhpZ2hlc3RDb2x1bW4gPSAnQSc7CgoJLyoqCgkgKiBDYWNoZWQgaGlnaGVzdCByb3cKCSAqCgkgKiBAdmFyIGludAoJICovCglwcml2YXRlICRfY2FjaGVkSGlnaGVzdFJvdyA9IDE7CgoJLyoqCgkgKiBSaWdodC10by1sZWZ0PwoJICoKCSAqIEB2YXIgYm9vbGVhbgoJICovCglwcml2YXRlICRfcmlnaHRUb0xlZnQgPSBmYWxzZTsKCgkvKioKCSAqIEh5cGVybGlua3MuIEluZGV4ZWQgYnkgY2VsbCBjb29yZGluYXRlLCBlLmcuICdBMScKCSAqCgkgKiBAdmFyIGFycmF5CgkgKi8KCXByaXZhdGUgJF9oeXBlcmxpbmtDb2xsZWN0aW9uID0gYXJyYXkoKTsKCgkvKioKCSAqIERhdGEgdmFsaWRhdGlvbiBvYmplY3RzLiBJbmRleGVkIGJ5IGNlbGwgY29vcmRpbmF0ZSwgZS5nLiAnQTEnCgkgKgoJICogQHZhciBhcnJheQoJICovCglwcml2YXRlICRfZGF0YVZhbGlkYXRpb25Db2xsZWN0aW9uID0gYXJyYXkoKTsKCgkvKioKCSAqIFRhYiBjb2xvcgoJICoKCSAqIEB2YXIgUEhQRXhjZWxfU3R5bGVfQ29sb3IKCSAqLwoJcHJpdmF0ZSAkX3RhYkNvbG9yOwoKCS8qKgoJICogRGlydHkgZmxhZwoJICoKCSAqIEB2YXIgYm9vbGVhbgoJICovCglwcml2YXRlICRfZGlydHkJPSB0cnVlOwoKCS8qKgoJICogSGFzaAoJICoKCSAqIEB2YXIgc3RyaW5nCgkgKi8KCXByaXZhdGUgJF9oYXNoCT0gbnVsbDsKCgkvKioKCSAqIENyZWF0ZSBhIG5ldyB3b3Jrc2hlZXQKCSAqCgkgKiBAcGFyYW0gUEhQRXhjZWwJCSRwUGFyZW50CgkgKiBAcGFyYW0gc3RyaW5nCQkkcFRpdGxlCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChQSFBFeGNlbCAkcFBhcmVudCA9IG51bGwsICRwVGl0bGUgPSAnV29ya3NoZWV0JykKCXsKCQkvLyBTZXQgcGFyZW50IGFuZCB0aXRsZQoJCSR0aGlzLT5fcGFyZW50ID0gJHBQYXJlbnQ7CgkJJHRoaXMtPnNldFRpdGxlKCRwVGl0bGUsIEZBTFNFKTsKCQkkdGhpcy0+c2V0U2hlZXRTdGF0ZShQSFBFeGNlbF9Xb3Jrc2hlZXQ6OlNIRUVUU1RBVEVfVklTSUJMRSk7CgoJCSR0aGlzLT5fY2VsbENvbGxlY3Rpb24JCT0gUEhQRXhjZWxfQ2FjaGVkT2JqZWN0U3RvcmFnZUZhY3Rvcnk6OmdldEluc3RhbmNlKCR0aGlzKTsKCgkJLy8gU2V0IHBhZ2Ugc2V0dXAKCQkkdGhpcy0+X3BhZ2VTZXR1cAkJCT0gbmV3IFBIUEV4Y2VsX1dvcmtzaGVldF9QYWdlU2V0dXAoKTsKCgkJLy8gU2V0IHBhZ2UgbWFyZ2lucwoJCSR0aGlzLT5fcGFnZU1hcmdpbnMJCQk9IG5ldyBQSFBFeGNlbF9Xb3Jrc2hlZXRfUGFnZU1hcmdpbnMoKTsKCgkJLy8gU2V0IHBhZ2UgaGVhZGVyL2Zvb3RlcgoJCSR0aGlzLT5faGVhZGVyRm9vdGVyCQk9IG5ldyBQSFBFeGNlbF9Xb3Jrc2hlZXRfSGVhZGVyRm9vdGVyKCk7CgoJCS8vIFNldCBzaGVldCB2aWV3CgkJJHRoaXMtPl9zaGVldFZpZXcJCQk9IG5ldyBQSFBFeGNlbF9Xb3Jrc2hlZXRfU2hlZXRWaWV3KCk7CgoJCS8vIERyYXdpbmcgY29sbGVjdGlvbgoJCSR0aGlzLT5fZHJhd2luZ0NvbGxlY3Rpb24JPSBuZXcgQXJyYXlPYmplY3QoKTsKCiAgICAJLy8gQ2hhcnQgY29sbGVjdGlvbgogICAgCSR0aGlzLT5fY2hhcnRDb2xsZWN0aW9uIAk9IG5ldyBBcnJheU9iamVjdCgpOwoKCQkvLyBQcm90ZWN0aW9uCgkJJHRoaXMtPl9wcm90ZWN0aW9uCQkJPSBuZXcgUEhQRXhjZWxfV29ya3NoZWV0X1Byb3RlY3Rpb24oKTsKCgkJLy8gRGVmYXVsdCByb3cgZGltZW5zaW9uCgkJJHRoaXMtPl9kZWZhdWx0Um93RGltZW5zaW9uID0gbmV3IFBIUEV4Y2VsX1dvcmtzaGVldF9Sb3dEaW1lbnNpb24obnVsbCk7CgoJCS8vIERlZmF1bHQgY29sdW1uIGRpbWVuc2lvbgoJCSR0aGlzLT5fZGVmYXVsdENvbHVtbkRpbWVuc2lvbiA9IG5ldyBQSFBFeGNlbF9Xb3Jrc2hlZXRfQ29sdW1uRGltZW5zaW9uKG51bGwpOwoJfQoKCgkvKioKCSAqIERpc2Nvbm5lY3QgYWxsIGNlbGxzIGZyb20gdGhpcyBQSFBFeGNlbF9Xb3Jrc2hlZXQgb2JqZWN0LAoJICogICAgdHlwaWNhbGx5IHNvIHRoYXQgdGhlIHdvcmtzaGVldCBvYmplY3QgY2FuIGJlIHVuc2V0CgkgKgoJICovCglwdWJsaWMgZnVuY3Rpb24gZGlzY29ubmVjdENlbGxzKCkgewoJCSR0aGlzLT5fY2VsbENvbGxlY3Rpb24tPnVuc2V0V29ya3NoZWV0Q2VsbHMoKTsKCQkkdGhpcy0+X2NlbGxDb2xsZWN0aW9uID0gbnVsbDsKCgkJLy8JZGV0YWNoIG91cnNlbGYgZnJvbSB0aGUgd29ya2Jvb2ssIHNvIHRoYXQgaXQgY2FuIHRoZW4gZGVsZXRlIHRoaXMgd29ya3NoZWV0IHN1Y2Nlc3NmdWxseQoJCSR0aGlzLT5fcGFyZW50ID0gbnVsbDsKCX0KCgkvKioKCSAqIFJldHVybiB0aGUgY2FjaGUgY29udHJvbGxlciBmb3IgdGhlIGNlbGwgY29sbGVjdGlvbgoJICoKCSAqIEByZXR1cm4gUEhQRXhjZWxfQ2FjaGVkT2JqZWN0U3RvcmFnZV94eHgKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldENlbGxDYWNoZUNvbnRyb2xsZXIoKSB7CgkJcmV0dXJuICR0aGlzLT5fY2VsbENvbGxlY3Rpb247Cgl9CS8vCWZ1bmN0aW9uIGdldENlbGxDYWNoZUNvbnRyb2xsZXIoKQoKCgkvKioKCSAqIEdldCBhcnJheSBvZiBpbnZhbGlkIGNoYXJhY3RlcnMgZm9yIHNoZWV0IHRpdGxlCgkgKgoJICogQHJldHVybiBhcnJheQoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldEludmFsaWRDaGFyYWN0ZXJzKCkKCXsKCQlyZXR1cm4gc2VsZjo6JF9pbnZhbGlkQ2hhcmFjdGVyczsKCX0KCgkvKioKCSAqIENoZWNrIHNoZWV0IHRpdGxlIGZvciB2YWxpZCBFeGNlbCBzeW50YXgKCSAqCgkgKiBAcGFyYW0gc3RyaW5nICRwVmFsdWUgVGhlIHN0cmluZyB0byBjaGVjawoJICogQHJldHVybiBzdHJpbmcgVGhlIHZhbGlkIHN0cmluZwoJICogQHRocm93cyBFeGNlcHRpb24KCSAqLwoJcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gX2NoZWNrU2hlZXRUaXRsZSgkcFZhbHVlKQoJewoJCS8vIFNvbWUgb2YgdGhlIHByaW50YWJsZSBBU0NJSSBjaGFyYWN0ZXJzIGFyZSBpbnZhbGlkOiAgKiA6IC8gXCA/IFsgXQoJCWlmIChzdHJfcmVwbGFjZShzZWxmOjokX2ludmFsaWRDaGFyYWN0ZXJzLCAnJywgJHBWYWx1ZSkgIT09ICRwVmFsdWUpIHsKCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbignSW52YWxpZCBjaGFyYWN0ZXIgZm91bmQgaW4gc2hlZXQgdGl0bGUnKTsKCQl9CgoJCS8vIE1heGltdW0gMzEgY2hhcmFjdGVycyBhbGxvd2VkIGZvciBzaGVldCB0aXRsZQoJCWlmIChQSFBFeGNlbF9TaGFyZWRfU3RyaW5nOjpDb3VudENoYXJhY3RlcnMoJHBWYWx1ZSkgPiAzMSkgewoJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCdNYXhpbXVtIDMxIGNoYXJhY3RlcnMgYWxsb3dlZCBpbiBzaGVldCB0aXRsZS4nKTsKCQl9CgoJCXJldHVybiAkcFZhbHVlOwoJfQoKCS8qKgoJICogR2V0IGNvbGxlY3Rpb24gb2YgY2VsbHMKCSAqCgkgKiBAcGFyYW0gYm9vbGVhbiAkcFNvcnRlZCBBbHNvIHNvcnQgdGhlIGNlbGwgY29sbGVjdGlvbj8KCSAqIEByZXR1cm4gUEhQRXhjZWxfQ2VsbFtdCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRDZWxsQ29sbGVjdGlvbigkcFNvcnRlZCA9IHRydWUpCgl7CgkJaWYgKCRwU29ydGVkKSB7CgkJCS8vIFJlLW9yZGVyIGNlbGwgY29sbGVjdGlvbgoJCQlyZXR1cm4gJHRoaXMtPnNvcnRDZWxsQ29sbGVjdGlvbigpOwoJCX0KCQlpZiAoJHRoaXMtPl9jZWxsQ29sbGVjdGlvbiAhPT0gTlVMTCkgewoJCQlyZXR1cm4gJHRoaXMtPl9jZWxsQ29sbGVjdGlvbi0+Z2V0Q2VsbExpc3QoKTsKCQl9CgkJcmV0dXJuIGFycmF5KCk7Cgl9CgoJLyoqCgkgKiBTb3J0IGNvbGxlY3Rpb24gb2YgY2VsbHMKCSAqCgkgKiBAcmV0dXJuIFBIUEV4Y2VsX1dvcmtzaGVldAoJICovCglwdWJsaWMgZnVuY3Rpb24gc29ydENlbGxDb2xsZWN0aW9uKCkKCXsKCQlpZiAoJHRoaXMtPl9jZWxsQ29sbGVjdGlvbiAhPT0gTlVMTCkgewoJCQlyZXR1cm4gJHRoaXMtPl9jZWxsQ29sbGVjdGlvbi0+Z2V0U29ydGVkQ2VsbExpc3QoKTsKCQl9CgkJcmV0dXJuIGFycmF5KCk7Cgl9CgoJLyoqCgkgKiBHZXQgY29sbGVjdGlvbiBvZiByb3cgZGltZW5zaW9ucwoJICoKCSAqIEByZXR1cm4gUEhQRXhjZWxfV29ya3NoZWV0X1Jvd0RpbWVuc2lvbltdCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRSb3dEaW1lbnNpb25zKCkKCXsKCQlyZXR1cm4gJHRoaXMtPl9yb3dEaW1lbnNpb25zOwoJfQoKCS8qKgoJICogR2V0IGRlZmF1bHQgcm93IGRpbWVuc2lvbgoJICoKCSAqIEByZXR1cm4gUEhQRXhjZWxfV29ya3NoZWV0X1Jvd0RpbWVuc2lvbgoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0RGVmYXVsdFJvd0RpbWVuc2lvbigpCgl7CgkJcmV0dXJuICR0aGlzLT5fZGVmYXVsdFJvd0RpbWVuc2lvbjsKCX0KCgkvKioKCSAqIEdldCBjb2xsZWN0aW9uIG9mIGNvbHVtbiBkaW1lbnNpb25zCgkgKgoJICogQHJldHVybiBQSFBFeGNlbF9Xb3Jrc2hlZXRfQ29sdW1uRGltZW5zaW9uW10KCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldENvbHVtbkRpbWVuc2lvbnMoKQoJewoJCXJldHVybiAkdGhpcy0+X2NvbHVtbkRpbWVuc2lvbnM7Cgl9CgoJLyoqCgkgKiBHZXQgZGVmYXVsdCBjb2x1bW4gZGltZW5zaW9uCgkgKgoJICogQHJldHVybiBQSFBFeGNlbF9Xb3Jrc2hlZXRfQ29sdW1uRGltZW5zaW9uCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXREZWZhdWx0Q29sdW1uRGltZW5zaW9uKCkKCXsKCQlyZXR1cm4gJHRoaXMtPl9kZWZhdWx0Q29sdW1uRGltZW5zaW9uOwoJfQoKCS8qKgoJICogR2V0IGNvbGxlY3Rpb24gb2YgZHJhd2luZ3MKCSAqCgkgKiBAcmV0dXJuIFBIUEV4Y2VsX1dvcmtzaGVldF9CYXNlRHJhd2luZ1tdCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXREcmF3aW5nQ29sbGVjdGlvbigpCgl7CgkJcmV0dXJuICR0aGlzLT5fZHJhd2luZ0NvbGxlY3Rpb247Cgl9CgoJLyoqCgkgKiBHZXQgY29sbGVjdGlvbiBvZiBjaGFydHMKCSAqCgkgKiBAcmV0dXJuIFBIUEV4Y2VsX0NoYXJ0W10KCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldENoYXJ0Q29sbGVjdGlvbigpCgl7CgkJcmV0dXJuICR0aGlzLT5fY2hhcnRDb2xsZWN0aW9uOwoJfQoKCS8qKgoJICogQWRkIGNoYXJ0CgkgKgoJICogQHBhcmFtIFBIUEV4Y2VsX0NoYXJ0ICRwQ2hhcnQKCSAqIEBwYXJhbSBpbnR8bnVsbCAkaUNoYXJ0SW5kZXggSW5kZXggd2hlcmUgY2hhcnQgc2hvdWxkIGdvICgwLDEsLi4uLCBvciBudWxsIGZvciBsYXN0KQoJICogQHJldHVybiBQSFBFeGNlbF9DaGFydAoJICogQHRocm93cyBFeGNlcHRpb24KCSAqLwoJcHVibGljIGZ1bmN0aW9uIGFkZENoYXJ0KFBIUEV4Y2VsX0NoYXJ0ICRwQ2hhcnQgPSBudWxsLCAkaUNoYXJ0SW5kZXggPSBudWxsKQoJewoJCWlmIChpc19udWxsKCRpQ2hhcnRJbmRleCkpIHsKCQkJJHRoaXMtPl9jaGFydENvbGxlY3Rpb25bXSA9ICRwQ2hhcnQ7CgkJfSBlbHNlIHsKCQkJLy8gSW5zZXJ0IHRoZSBjaGFydCBhdCB0aGUgcmVxdWVzdGVkIGluZGV4CgkJCWFycmF5X3NwbGljZSgkdGhpcy0+X2NoYXJ0Q29sbGVjdGlvbiwgJGlDaGFydEluZGV4LCAwLCBhcnJheSgkcENoYXJ0KSk7CgkJfQoKCQlyZXR1cm4gJHBDaGFydDsKCX0KCgkvKioKCSAqIFJldHVybiB0aGUgY291bnQgb2YgY2hhcnRzIG9uIHRoaXMgd29ya3NoZWV0CgkgKgoJICogQHJldHVybiBpbnQJCVRoZSBudW1iZXIgb2YgY2hhcnRzCgkgKiBAdGhyb3dzIEV4Y2VwdGlvbgoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0Q2hhcnRDb3VudCgpCgl7CgkJcmV0dXJuIGNvdW50KCR0aGlzLT5fY2hhcnRDb2xsZWN0aW9uKTsKCX0KCgkvKioKCSAqIEdldCBhIGNoYXJ0IGJ5IGl0cyBpbmRleCBwb3NpdGlvbgoJICoKCSAqIEBwYXJhbQlzdHJpbmcJJGluZGV4CQkJQ2hhcnQgaW5kZXggcG9zaXRpb24KCSAqIEByZXR1cm4JZmFsc2V8UEhQRXhjZWxfQ2hhcnQKCSAqIEB0aHJvd3MgRXhjZXB0aW9uCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRDaGFydEJ5SW5kZXgoJGluZGV4ID0gbnVsbCkKCXsKCQkkY2hhcnRDb3VudCA9IGNvdW50KCR0aGlzLT5fY2hhcnRDb2xsZWN0aW9uKTsKCQlpZiAoJGNoYXJ0Q291bnQgPT0gMCkgewoJCQlyZXR1cm4gZmFsc2U7CgkJfQoJCWlmIChpc19udWxsKCRpbmRleCkpIHsKCQkJJGluZGV4ID0gLS0kY2hhcnRDb3VudDsKCQl9CgkJaWYgKCFpc3NldCgkdGhpcy0+X2NoYXJ0Q29sbGVjdGlvblskaW5kZXhdKSkgewoJCQlyZXR1cm4gZmFsc2U7CgkJfQoKCQlyZXR1cm4gJHRoaXMtPl9jaGFydENvbGxlY3Rpb25bJGluZGV4XTsKCX0KCgkvKioKCSAqIFJldHVybiBhbiBhcnJheSBvZiB0aGUgbmFtZXMgb2YgY2hhcnRzIG9uIHRoaXMgd29ya3NoZWV0CgkgKgoJICogQHJldHVybiBzdHJpbmdbXQkJVGhlIG5hbWVzIG9mIGNoYXJ0cwoJICogQHRocm93cyBFeGNlcHRpb24KCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldENoYXJ0TmFtZXMoKQoJewoJCSRjaGFydE5hbWVzID0gYXJyYXkoKTsKCQlmb3JlYWNoKCR0aGlzLT5fY2hhcnRDb2xsZWN0aW9uIGFzICRjaGFydCkgewoJCQkkY2hhcnROYW1lc1tdID0gJGNoYXJ0LT5nZXROYW1lKCk7CgkJfQoJCXJldHVybiAkY2hhcnROYW1lczsKCX0KCgkvKioKCSAqIEdldCBhIGNoYXJ0IGJ5IG5hbWUKCSAqCgkgKiBAcGFyYW0Jc3RyaW5nCSRjaGFydE5hbWUJCUNoYXJ0IG5hbWUKCSAqIEByZXR1cm4JZmFsc2V8UEhQRXhjZWxfQ2hhcnQKCSAqIEB0aHJvd3MgRXhjZXB0aW9uCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRDaGFydEJ5TmFtZSgkY2hhcnROYW1lID0gJycpCgl7CgkJJGNoYXJ0Q291bnQgPSBjb3VudCgkdGhpcy0+X2NoYXJ0Q29sbGVjdGlvbik7CgkJaWYgKCRjaGFydENvdW50ID09IDApIHsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCQlmb3JlYWNoKCR0aGlzLT5fY2hhcnRDb2xsZWN0aW9uIGFzICRpbmRleCA9PiAkY2hhcnQpIHsKCQkJaWYgKCRjaGFydC0+Z2V0TmFtZSgpID09ICRjaGFydE5hbWUpIHsKCQkJCXJldHVybiAkdGhpcy0+X2NoYXJ0Q29sbGVjdGlvblskaW5kZXhdOwoJCQl9CgkJfQoJCXJldHVybiBmYWxzZTsKCX0KCgkvKioKCSAqIFJlZnJlc2ggY29sdW1uIGRpbWVuc2lvbnMKCSAqCgkgKiBAcmV0dXJuIFBIUEV4Y2VsX1dvcmtzaGVldAoJICovCglwdWJsaWMgZnVuY3Rpb24gcmVmcmVzaENvbHVtbkRpbWVuc2lvbnMoKQoJewoJCSRjdXJyZW50Q29sdW1uRGltZW5zaW9ucyA9ICR0aGlzLT5nZXRDb2x1bW5EaW1lbnNpb25zKCk7CgkJJG5ld0NvbHVtbkRpbWVuc2lvbnMgPSBhcnJheSgpOwoKCQlmb3JlYWNoICgkY3VycmVudENvbHVtbkRpbWVuc2lvbnMgYXMgJG9iakNvbHVtbkRpbWVuc2lvbikgewoJCQkkbmV3Q29sdW1uRGltZW5zaW9uc1skb2JqQ29sdW1uRGltZW5zaW9uLT5nZXRDb2x1bW5JbmRleCgpXSA9ICRvYmpDb2x1bW5EaW1lbnNpb247CgkJfQoKCQkkdGhpcy0+X2NvbHVtbkRpbWVuc2lvbnMgPSAkbmV3Q29sdW1uRGltZW5zaW9uczsKCgkJcmV0dXJuICR0aGlzOwoJfQoKCS8qKgoJICogUmVmcmVzaCByb3cgZGltZW5zaW9ucwoJICoKCSAqIEByZXR1cm4gUEhQRXhjZWxfV29ya3NoZWV0CgkgKi8KCXB1YmxpYyBmdW5jdGlvbiByZWZyZXNoUm93RGltZW5zaW9ucygpCgl7CgkJJGN1cnJlbnRSb3dEaW1lbnNpb25zID0gJHRoaXMtPmdldFJvd0RpbWVuc2lvbnMoKTsKCQkkbmV3Um93RGltZW5zaW9ucyA9IGFycmF5KCk7CgoJCWZvcmVhY2ggKCRjdXJyZW50Um93RGltZW5zaW9ucyBhcyAkb2JqUm93RGltZW5zaW9uKSB7CgkJCSRuZXdSb3dEaW1lbnNpb25zWyRvYmpSb3dEaW1lbnNpb24tPmdldFJvd0luZGV4KCldID0gJG9ialJvd0RpbWVuc2lvbjsKCQl9CgoJCSR0aGlzLT5fcm93RGltZW5zaW9ucyA9ICRuZXdSb3dEaW1lbnNpb25zOwoKCQlyZXR1cm4gJHRoaXM7Cgl9CgoJLyoqCgkgKiBDYWxjdWxhdGUgd29ya3NoZWV0IGRpbWVuc2lvbgoJICoKCSAqIEByZXR1cm4gc3RyaW5nICBTdHJpbmcgY29udGFpbmluZyB0aGUgZGltZW5zaW9uIG9mIHRoaXMgd29ya3NoZWV0CgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBjYWxjdWxhdGVXb3Jrc2hlZXREaW1lbnNpb24oKQoJewoJCS8vIFJldHVybgoJCXJldHVybiAnQTEnIC4gJzonIC4gICR0aGlzLT5nZXRIaWdoZXN0Q29sdW1uKCkgLiAkdGhpcy0+Z2V0SGlnaGVzdFJvdygpOwoJfQoKCS8qKgoJICogQ2FsY3VsYXRlIHdvcmtzaGVldCBkYXRhIGRpbWVuc2lvbgoJICoKCSAqIEByZXR1cm4gc3RyaW5nICBTdHJpbmcgY29udGFpbmluZyB0aGUgZGltZW5zaW9uIG9mIHRoaXMgd29ya3NoZWV0IHRoYXQgYWN0dWFsbHkgY29udGFpbiBkYXRhCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBjYWxjdWxhdGVXb3Jrc2hlZXREYXRhRGltZW5zaW9uKCkKCXsKCQkvLyBSZXR1cm4KCQlyZXR1cm4gJ0ExJyAuICc6JyAuICAkdGhpcy0+Z2V0SGlnaGVzdERhdGFDb2x1bW4oKSAuICR0aGlzLT5nZXRIaWdoZXN0RGF0YVJvdygpOwoJfQoKCS8qKgoJICogQ2FsY3VsYXRlIHdpZHRocyBmb3IgYXV0by1zaXplIGNvbHVtbnMKCSAqCgkgKiBAcGFyYW0gIGJvb2xlYW4gICRjYWxjdWxhdGVNZXJnZUNlbGxzICBDYWxjdWxhdGUgbWVyZ2UgY2VsbCB3aWR0aAoJICogQHJldHVybiBQSFBFeGNlbF9Xb3Jrc2hlZXQ7CgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBjYWxjdWxhdGVDb2x1bW5XaWR0aHMoJGNhbGN1bGF0ZU1lcmdlQ2VsbHMgPSBmYWxzZSkKCXsKCQkvLyBpbml0aWFsaXplICRhdXRvU2l6ZXMgYXJyYXkKCQkkYXV0b1NpemVzID0gYXJyYXkoKTsKCQlmb3JlYWNoICgkdGhpcy0+Z2V0Q29sdW1uRGltZW5zaW9ucygpIGFzICRjb2xEaW1lbnNpb24pIHsKCQkJaWYgKCRjb2xEaW1lbnNpb24tPmdldEF1dG9TaXplKCkpIHsKCQkJCSRhdXRvU2l6ZXNbJGNvbERpbWVuc2lvbi0+Z2V0Q29sdW1uSW5kZXgoKV0gPSAtMTsKCQkJfQoJCX0KCgkJLy8gVGhlcmUgaXMgb25seSBzb21ldGhpbmcgdG8gZG8gaWYgdGhlcmUgYXJlIHNvbWUgYXV0by1zaXplIGNvbHVtbnMKCQlpZiAoIWVtcHR5KCRhdXRvU2l6ZXMpKSB7CgoJCQkvLyBidWlsZCBsaXN0IG9mIGNlbGxzIHJlZmVyZW5jZXMgdGhhdCBwYXJ0aWNpcGF0ZSBpbiBhIG1lcmdlCgkJCSRpc01lcmdlQ2VsbCA9IGFycmF5KCk7CgkJCWZvcmVhY2ggKCR0aGlzLT5nZXRNZXJnZUNlbGxzKCkgYXMgJGNlbGxzKSB7CgkJCQlmb3JlYWNoIChQSFBFeGNlbF9DZWxsOjpleHRyYWN0QWxsQ2VsbFJlZmVyZW5jZXNJblJhbmdlKCRjZWxscykgYXMgJGNlbGxSZWZlcmVuY2UpIHsKCQkJCQkkaXNNZXJnZUNlbGxbJGNlbGxSZWZlcmVuY2VdID0gdHJ1ZTsKCQkJCX0KCQkJfQoKCQkJLy8gbG9vcCB0aHJvdWdoIGFsbCBjZWxscyBpbiB0aGUgd29ya3NoZWV0CgkJCWZvcmVhY2ggKCR0aGlzLT5nZXRDZWxsQ29sbGVjdGlvbihmYWxzZSkgYXMgJGNlbGxJRCkgewoJCQkJJGNlbGwgPSAkdGhpcy0+Z2V0Q2VsbCgkY2VsbElEKTsKCQkJCWlmIChpc3NldCgkYXV0b1NpemVzWyRjZWxsLT5nZXRDb2x1bW4oKV0pKSB7CgkJCQkJLy8gRGV0ZXJtaW5lIHdpZHRoIGlmIGNlbGwgZG9lcyBub3QgcGFydGljaXBhdGUgaW4gYSBtZXJnZQoJCQkJCWlmICghaXNzZXQoJGlzTWVyZ2VDZWxsWyRjZWxsLT5nZXRDb29yZGluYXRlKCldKSkgewoJCQkJCQkvLyBDYWxjdWxhdGVkIHZhbHVlCgkJCQkJCSRjZWxsVmFsdWUgPSAkY2VsbC0+Z2V0Q2FsY3VsYXRlZFZhbHVlKCk7CgoJCQkJCQkvLyBUbyBmb3JtYXR0ZWQgc3RyaW5nCgkJCQkJCSRjZWxsVmFsdWUgPSBQSFBFeGNlbF9TdHlsZV9OdW1iZXJGb3JtYXQ6OnRvRm9ybWF0dGVkU3RyaW5nKCRjZWxsVmFsdWUsICR0aGlzLT5nZXRQYXJlbnQoKS0+Z2V0Q2VsbFhmQnlJbmRleCgkY2VsbC0+Z2V0WGZJbmRleCgpKS0+Z2V0TnVtYmVyRm9ybWF0KCktPmdldEZvcm1hdENvZGUoKSk7CgoJCQkJCQkkYXV0b1NpemVzWyRjZWxsLT5nZXRDb2x1bW4oKV0gPSBtYXgoCgkJCQkJCQkoZmxvYXQpJGF1dG9TaXplc1skY2VsbC0+Z2V0Q29sdW1uKCldLAoJCQkJCQkJKGZsb2F0KVBIUEV4Y2VsX1NoYXJlZF9Gb250OjpjYWxjdWxhdGVDb2x1bW5XaWR0aCgKCQkJCQkJCQkkdGhpcy0+Z2V0UGFyZW50KCktPmdldENlbGxYZkJ5SW5kZXgoJGNlbGwtPmdldFhmSW5kZXgoKSktPmdldEZvbnQoKSwKCQkJCQkJCQkkY2VsbFZhbHVlLAoJCQkJCQkJCSR0aGlzLT5nZXRQYXJlbnQoKS0+Z2V0Q2VsbFhmQnlJbmRleCgkY2VsbC0+Z2V0WGZJbmRleCgpKS0+Z2V0QWxpZ25tZW50KCktPmdldFRleHRSb3RhdGlvbigpLAoJCQkJCQkJCSR0aGlzLT5nZXREZWZhdWx0U3R5bGUoKS0+Z2V0Rm9udCgpCgkJCQkJCQkpCgkJCQkJCSk7CgkJCQkJfQoJCQkJfQoJCQl9CgoJCQkvLyBhZGp1c3QgY29sdW1uIHdpZHRocwoJCQlmb3JlYWNoICgkYXV0b1NpemVzIGFzICRjb2x1bW5JbmRleCA9PiAkd2lkdGgpIHsKCQkJCWlmICgkd2lkdGggPT0gLTEpICR3aWR0aCA9ICR0aGlzLT5nZXREZWZhdWx0Q29sdW1uRGltZW5zaW9uKCktPmdldFdpZHRoKCk7CgkJCQkkdGhpcy0+Z2V0Q29sdW1uRGltZW5zaW9uKCRjb2x1bW5JbmRleCktPnNldFdpZHRoKCR3aWR0aCk7CgkJCX0KCQl9CgoJCXJldHVybiAkdGhpczsKCX0KCgkvKioKCSAqIEdldCBwYXJlbnQKCSAqCgkgKiBAcmV0dXJuIFBIUEV4Y2VsCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRQYXJlbnQoKSB7CgkJcmV0dXJuICR0aGlzLT5fcGFyZW50OwoJfQoKCS8qKgoJICogUmUtYmluZCBwYXJlbnQKCSAqCgkgKiBAcGFyYW0gUEhQRXhjZWwgJHBhcmVudAoJICogQHJldHVybiBQSFBFeGNlbF9Xb3Jrc2hlZXQKCSAqLwoJcHVibGljIGZ1bmN0aW9uIHJlYmluZFBhcmVudChQSFBFeGNlbCAkcGFyZW50KSB7CgkJJG5hbWVkUmFuZ2VzID0gJHRoaXMtPl9wYXJlbnQtPmdldE5hbWVkUmFuZ2VzKCk7CgkJZm9yZWFjaCAoJG5hbWVkUmFuZ2VzIGFzICRuYW1lZFJhbmdlKSB7CgkJCSRwYXJlbnQtPmFkZE5hbWVkUmFuZ2UoJG5hbWVkUmFuZ2UpOwoJCX0KCgkJJHRoaXMtPl9wYXJlbnQtPnJlbW92ZVNoZWV0QnlJbmRleCgKCQkJJHRoaXMtPl9wYXJlbnQtPmdldEluZGV4KCR0aGlzKQoJCSk7CgkJJHRoaXMtPl9wYXJlbnQgPSAkcGFyZW50OwoKCQlyZXR1cm4gJHRoaXM7Cgl9CgoJLyoqCgkgKiBHZXQgdGl0bGUKCSAqCgkgKiBAcmV0dXJuIHN0cmluZwoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0VGl0bGUoKQoJewoJCXJldHVybiAkdGhpcy0+X3RpdGxlOwoJfQoKCS8qKgoJICogU2V0IHRpdGxlCgkgKgoJICogQHBhcmFtIHN0cmluZyAkcFZhbHVlIFN0cmluZyBjb250YWluaW5nIHRoZSBkaW1lbnNpb24gb2YgdGhpcyB3b3Jrc2hlZXQKCSAqIEBwYXJhbSBzdHJpbmcgJHVwZGF0ZUZvcm11bGFDZWxsUmVmZXJlbmNlcyBib29sZWFuIEZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIGNlbGwgcmVmZXJlbmNlcyBpbiBmb3JtdWxhZSBzaG91bGQKCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlIHVwZGF0ZWQgdG8gcmVmbGVjdCB0aGUgbmV3IHNoZWV0IG5hbWUuCgkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHNob3VsZCBiZSBsZWZ0IGFzIHRoZSBkZWZhdWx0IHRydWUsIHVubGVzcyB5b3UgYXJlCgkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZXJ0YWluIHRoYXQgbm8gZm9ybXVsYSBjZWxscyBvbiBhbnkgd29ya3NoZWV0IGNvbnRhaW4KCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZXMgdG8gdGhpcyB3b3Jrc2hlZXQKCSAqIEByZXR1cm4gUEhQRXhjZWxfV29ya3NoZWV0CgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBzZXRUaXRsZSgkcFZhbHVlID0gJ1dvcmtzaGVldCcsICR1cGRhdGVGb3JtdWxhQ2VsbFJlZmVyZW5jZXMgPSB0cnVlKQoJewoJCS8vIElzIHRoaXMgYSAncmVuYW1lJyBvciBub3Q/CgkJaWYgKCR0aGlzLT5nZXRUaXRsZSgpID09ICRwVmFsdWUpIHsKCQkJcmV0dXJuICR0aGlzOwoJCX0KCgkJLy8gU3ludGF4IGNoZWNrCgkJc2VsZjo6X2NoZWNrU2hlZXRUaXRsZSgkcFZhbHVlKTsKCgkJLy8gT2xkIHRpdGxlCgkJJG9sZFRpdGxlID0gJHRoaXMtPmdldFRpdGxlKCk7CgoJCS8vIElzIHRoZXJlIGFscmVhZHkgc3VjaCBzaGVldCBuYW1lPwoJCWlmICgkdGhpcy0+Z2V0UGFyZW50KCktPmdldFNoZWV0QnlOYW1lKCRwVmFsdWUpKSB7CgkJCS8vIFVzZSBuYW1lLCBidXQgYXBwZW5kIHdpdGggbG93ZXN0IHBvc3NpYmxlIGludGVnZXIKCgkJCWlmIChQSFBFeGNlbF9TaGFyZWRfU3RyaW5nOjpDb3VudENoYXJhY3RlcnMoJHBWYWx1ZSkgPiAyOSkgewoJCQkJJHBWYWx1ZSA9IFBIUEV4Y2VsX1NoYXJlZF9TdHJpbmc6OlN1YnN0cmluZygkcFZhbHVlLDAsMjkpOwoJCQl9CgkJCSRpID0gMTsKCQkJd2hpbGUgKCR0aGlzLT5nZXRQYXJlbnQoKS0+Z2V0U2hlZXRCeU5hbWUoJHBWYWx1ZSAuICcgJyAuICRpKSkgewoJCQkJKyskaTsKCQkJCWlmICgkaSA9PSAxMCkgewoJCQkJCWlmIChQSFBFeGNlbF9TaGFyZWRfU3RyaW5nOjpDb3VudENoYXJhY3RlcnMoJHBWYWx1ZSkgPiAyOCkgewoJCQkJCQkkcFZhbHVlID0gUEhQRXhjZWxfU2hhcmVkX1N0cmluZzo6U3Vic3RyaW5nKCRwVmFsdWUsMCwyOCk7CgkJCQkJfQoJCQkJfSBlbHNlaWYgKCRpID09IDEwMCkgewoJCQkJCWlmIChQSFBFeGNlbF9TaGFyZWRfU3RyaW5nOjpDb3VudENoYXJhY3RlcnMoJHBWYWx1ZSkgPiAyNykgewoJCQkJCQkkcFZhbHVlID0gUEhQRXhjZWxfU2hhcmVkX1N0cmluZzo6U3Vic3RyaW5nKCRwVmFsdWUsMCwyNyk7CgkJCQkJfQoJCQkJfQoJCQl9CgoJCQkkYWx0VGl0bGUgPSAkcFZhbHVlIC4gJyAnIC4gJGk7CgkJCXJldHVybiAkdGhpcy0+c2V0VGl0bGUoJGFsdFRpdGxlLCR1cGRhdGVGb3JtdWxhQ2VsbFJlZmVyZW5jZXMpOwoJCX0KCgkJLy8gU2V0IHRpdGxlCgkJJHRoaXMtPl90aXRsZSA9ICRwVmFsdWU7CgkJJHRoaXMtPl9kaXJ0eSA9IHRydWU7CgoJCS8vIE5ldyB0aXRsZQoJCSRuZXdUaXRsZSA9ICR0aGlzLT5nZXRUaXRsZSgpOwoJCWlmICgkdXBkYXRlRm9ybXVsYUNlbGxSZWZlcmVuY2VzKQoJCQlQSFBFeGNlbF9SZWZlcmVuY2VIZWxwZXI6OmdldEluc3RhbmNlKCktPnVwZGF0ZU5hbWVkRm9ybXVsYXMoJHRoaXMtPmdldFBhcmVudCgpLCAkb2xkVGl0bGUsICRuZXdUaXRsZSk7CgoJCXJldHVybiAkdGhpczsKCX0KCgkvKioKCSAqIEdldCBzaGVldCBzdGF0ZQoJICoKCSAqIEByZXR1cm4gc3RyaW5nIFNoZWV0IHN0YXRlICh2aXNpYmxlLCBoaWRkZW4sIHZlcnlIaWRkZW4pCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRTaGVldFN0YXRlKCkgewoJCXJldHVybiAkdGhpcy0+X3NoZWV0U3RhdGU7Cgl9CgoJLyoqCgkgKiBTZXQgc2hlZXQgc3RhdGUKCSAqCgkgKiBAcGFyYW0gc3RyaW5nICR2YWx1ZSBTaGVldCBzdGF0ZSAodmlzaWJsZSwgaGlkZGVuLCB2ZXJ5SGlkZGVuKQoJICogQHJldHVybiBQSFBFeGNlbF9Xb3Jrc2hlZXQKCSAqLwoJcHVibGljIGZ1bmN0aW9uIHNldFNoZWV0U3RhdGUoJHZhbHVlID0gUEhQRXhjZWxfV29ya3NoZWV0OjpTSEVFVFNUQVRFX1ZJU0lCTEUpIHsKCQkkdGhpcy0+X3NoZWV0U3RhdGUgPSAkdmFsdWU7CgkJcmV0dXJuICR0aGlzOwoJfQoKCS8qKgoJICogR2V0IHBhZ2Ugc2V0dXAKCSAqCgkgKiBAcmV0dXJuIFBIUEV4Y2VsX1dvcmtzaGVldF9QYWdlU2V0dXAKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldFBhZ2VTZXR1cCgpCgl7CgkJcmV0dXJuICR0aGlzLT5fcGFnZVNldHVwOwoJfQoKCS8qKgoJICogU2V0IHBhZ2Ugc2V0dXAKCSAqCgkgKiBAcGFyYW0gUEhQRXhjZWxfV29ya3NoZWV0X1BhZ2VTZXR1cAkkcFZhbHVlCgkgKiBAcmV0dXJuIFBIUEV4Y2VsX1dvcmtzaGVldAoJICovCglwdWJsaWMgZnVuY3Rpb24gc2V0UGFnZVNldHVwKFBIUEV4Y2VsX1dvcmtzaGVldF9QYWdlU2V0dXAgJHBWYWx1ZSkKCXsKCQkkdGhpcy0+X3BhZ2VTZXR1cCA9ICRwVmFsdWU7CgkJcmV0dXJuICR0aGlzOwoJfQoKCS8qKgoJICogR2V0IHBhZ2UgbWFyZ2lucwoJICoKCSAqIEByZXR1cm4gUEhQRXhjZWxfV29ya3NoZWV0X1BhZ2VNYXJnaW5zCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRQYWdlTWFyZ2lucygpCgl7CgkJcmV0dXJuICR0aGlzLT5fcGFnZU1hcmdpbnM7Cgl9CgoJLyoqCgkgKiBTZXQgcGFnZSBtYXJnaW5zCgkgKgoJICogQHBhcmFtIFBIUEV4Y2VsX1dvcmtzaGVldF9QYWdlTWFyZ2lucwkkcFZhbHVlCgkgKiBAcmV0dXJuIFBIUEV4Y2VsX1dvcmtzaGVldAoJICovCglwdWJsaWMgZnVuY3Rpb24gc2V0UGFnZU1hcmdpbnMoUEhQRXhjZWxfV29ya3NoZWV0X1BhZ2VNYXJnaW5zICRwVmFsdWUpCgl7CgkJJHRoaXMtPl9wYWdlTWFyZ2lucyA9ICRwVmFsdWU7CgkJcmV0dXJuICR0aGlzOwoJfQoKCS8qKgoJICogR2V0IHBhZ2UgaGVhZGVyL2Zvb3RlcgoJICoKCSAqIEByZXR1cm4gUEhQRXhjZWxfV29ya3NoZWV0X0hlYWRlckZvb3RlcgoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0SGVhZGVyRm9vdGVyKCkKCXsKCQlyZXR1cm4gJHRoaXMtPl9oZWFkZXJGb290ZXI7Cgl9CgoJLyoqCgkgKiBTZXQgcGFnZSBoZWFkZXIvZm9vdGVyCgkgKgoJICogQHBhcmFtIFBIUEV4Y2VsX1dvcmtzaGVldF9IZWFkZXJGb290ZXIJJHBWYWx1ZQoJICogQHJldHVybiBQSFBFeGNlbF9Xb3Jrc2hlZXQKCSAqLwoJcHVibGljIGZ1bmN0aW9uIHNldEhlYWRlckZvb3RlcihQSFBFeGNlbF9Xb3Jrc2hlZXRfSGVhZGVyRm9vdGVyICRwVmFsdWUpCgl7CgkJJHRoaXMtPl9oZWFkZXJGb290ZXIgPSAkcFZhbHVlOwoJCXJldHVybiAkdGhpczsKCX0KCgkvKioKCSAqIEdldCBzaGVldCB2aWV3CgkgKgoJICogQHJldHVybiBQSFBFeGNlbF9Xb3Jrc2hlZXRfSGVhZGVyRm9vdGVyCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRTaGVldFZpZXcoKQoJewoJCXJldHVybiAkdGhpcy0+X3NoZWV0VmlldzsKCX0KCgkvKioKCSAqIFNldCBzaGVldCB2aWV3CgkgKgoJICogQHBhcmFtIFBIUEV4Y2VsX1dvcmtzaGVldF9TaGVldFZpZXcJJHBWYWx1ZQoJICogQHJldHVybiBQSFBFeGNlbF9Xb3Jrc2hlZXQKCSAqLwoJcHVibGljIGZ1bmN0aW9uIHNldFNoZWV0VmlldyhQSFBFeGNlbF9Xb3Jrc2hlZXRfU2hlZXRWaWV3ICRwVmFsdWUpCgl7CgkJJHRoaXMtPl9zaGVldFZpZXcgPSAkcFZhbHVlOwoJCXJldHVybiAkdGhpczsKCX0KCgkvKioKCSAqIEdldCBQcm90ZWN0aW9uCgkgKgoJICogQHJldHVybiBQSFBFeGNlbF9Xb3Jrc2hlZXRfUHJvdGVjdGlvbgoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0UHJvdGVjdGlvbigpCgl7CgkJcmV0dXJuICR0aGlzLT5fcHJvdGVjdGlvbjsKCX0KCgkvKioKCSAqIFNldCBQcm90ZWN0aW9uCgkgKgoJICogQHBhcmFtIFBIUEV4Y2VsX1dvcmtzaGVldF9Qcm90ZWN0aW9uCSRwVmFsdWUKCSAqIEByZXR1cm4gUEhQRXhjZWxfV29ya3NoZWV0CgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBzZXRQcm90ZWN0aW9uKFBIUEV4Y2VsX1dvcmtzaGVldF9Qcm90ZWN0aW9uICRwVmFsdWUpCgl7CgkJJHRoaXMtPl9wcm90ZWN0aW9uID0gJHBWYWx1ZTsKCQkkdGhpcy0+X2RpcnR5ID0gdHJ1ZTsKCgkJcmV0dXJuICR0aGlzOwoJfQoKCS8qKgoJICogR2V0IGhpZ2hlc3Qgd29ya3NoZWV0IGNvbHVtbgoJICoKCSAqIEByZXR1cm4gc3RyaW5nIEhpZ2hlc3QgY29sdW1uIG5hbWUKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldEhpZ2hlc3RDb2x1bW4oKQoJewoJCXJldHVybiAkdGhpcy0+X2NhY2hlZEhpZ2hlc3RDb2x1bW47Cgl9CgoJLyoqCgkgKiBHZXQgaGlnaGVzdCB3b3Jrc2hlZXQgY29sdW1uIHRoYXQgY29udGFpbnMgZGF0YQoJICoKCSAqIEByZXR1cm4gc3RyaW5nIEhpZ2hlc3QgY29sdW1uIG5hbWUgdGhhdCBjb250YWlucyBkYXRhCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRIaWdoZXN0RGF0YUNvbHVtbigpCgl7CgkJcmV0dXJuICR0aGlzLT5fY2VsbENvbGxlY3Rpb24tPmdldEhpZ2hlc3RDb2x1bW4oKTsKCX0KCgkvKioKCSAqIEdldCBoaWdoZXN0IHdvcmtzaGVldCByb3cKCSAqCgkgKiBAcmV0dXJuIGludCBIaWdoZXN0IHJvdyBudW1iZXIKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldEhpZ2hlc3RSb3coKQoJewoJCXJldHVybiAkdGhpcy0+X2NhY2hlZEhpZ2hlc3RSb3c7Cgl9CgoJLyoqCgkgKiBHZXQgaGlnaGVzdCB3b3Jrc2hlZXQgcm93IHRoYXQgY29udGFpbnMgZGF0YQoJICoKCSAqIEByZXR1cm4gc3RyaW5nIEhpZ2hlc3Qgcm93IG51bWJlciB0aGF0IGNvbnRhaW5zIGRhdGEKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldEhpZ2hlc3REYXRhUm93KCkKCXsKCQlyZXR1cm4gJHRoaXMtPl9jZWxsQ29sbGVjdGlvbi0+Z2V0SGlnaGVzdFJvdygpOwoJfQoKCS8qKgoJICogR2V0IGhpZ2hlc3Qgd29ya3NoZWV0IGNvbHVtbiBhbmQgaGlnaGVzdCByb3cgdGhhdCBoYXZlIGNlbGwgcmVjb3JkcwoJICoKCSAqIEByZXR1cm4gYXJyYXkgSGlnaGVzdCBjb2x1bW4gbmFtZSBhbmQgaGlnaGVzdCByb3cgbnVtYmVyCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRIaWdoZXN0Um93QW5kQ29sdW1uKCkKCXsKCQlyZXR1cm4gJHRoaXMtPl9jZWxsQ29sbGVjdGlvbi0+Z2V0SGlnaGVzdFJvd0FuZENvbHVtbigpOwoJfQoKCS8qKgoJICogU2V0IGEgY2VsbCB2YWx1ZQoJICoKCSAqIEBwYXJhbSBzdHJpbmcJJHBDb29yZGluYXRlCUNvb3JkaW5hdGUgb2YgdGhlIGNlbGwKCSAqIEBwYXJhbSBtaXhlZAkkcFZhbHVlCQkJVmFsdWUgb2YgdGhlIGNlbGwKCSAqIEBwYXJhbSBib29sCQkkcmV0dXJuQ2VsbAkJUmV0dXJuIHRoZSB3b3Jrc2hlZXQgKGZhbHNlLCBkZWZhdWx0KSBvciB0aGUgY2VsbCAodHJ1ZSkKCSAqIEByZXR1cm4gUEhQRXhjZWxfV29ya3NoZWV0fFBIUEV4Y2VsX0NlbGwJRGVwZW5kaW5nIG9uIHRoZSBsYXN0IHBhcmFtZXRlciBiZWluZyBzcGVjaWZpZWQKCSAqLwoJcHVibGljIGZ1bmN0aW9uIHNldENlbGxWYWx1ZSgkcENvb3JkaW5hdGUgPSAnQTEnLCAkcFZhbHVlID0gbnVsbCwgJHJldHVybkNlbGwgPSBmYWxzZSkKCXsKCQkkY2VsbCA9ICR0aGlzLT5nZXRDZWxsKCRwQ29vcmRpbmF0ZSktPnNldFZhbHVlKCRwVmFsdWUpOwoKCQlpZiAoJHJldHVybkNlbGwpIHsKCQkJcmV0dXJuICRjZWxsOwoJCX0KCQlyZXR1cm4gJHRoaXM7Cgl9CgoJLyoqCgkgKiBTZXQgYSBjZWxsIHZhbHVlIGJ5IHVzaW5nIG51bWVyaWMgY2VsbCBjb29yZGluYXRlcwoJICoKCSAqIEBwYXJhbSBzdHJpbmcJJHBDb2x1bW4JCU51bWVyaWMgY29sdW1uIGNvb3JkaW5hdGUgb2YgdGhlIGNlbGwKCSAqIEBwYXJhbSBzdHJpbmcJJHBSb3cJCQlOdW1lcmljIHJvdyBjb29yZGluYXRlIG9mIHRoZSBjZWxsCgkgKiBAcGFyYW0gbWl4ZWQJCSRwVmFsdWUJCQlWYWx1ZSBvZiB0aGUgY2VsbAoJICogQHBhcmFtIGJvb2wJCSRyZXR1cm5DZWxsCQlSZXR1cm4gdGhlIHdvcmtzaGVldCAoZmFsc2UsIGRlZmF1bHQpIG9yIHRoZSBjZWxsICh0cnVlKQoJICogQHJldHVybiBQSFBFeGNlbF9Xb3Jrc2hlZXR8UEhQRXhjZWxfQ2VsbAlEZXBlbmRpbmcgb24gdGhlIGxhc3QgcGFyYW1ldGVyIGJlaW5nIHNwZWNpZmllZAoJICovCglwdWJsaWMgZnVuY3Rpb24gc2V0Q2VsbFZhbHVlQnlDb2x1bW5BbmRSb3coJHBDb2x1bW4gPSAwLCAkcFJvdyA9IDEsICRwVmFsdWUgPSBudWxsLCAkcmV0dXJuQ2VsbCA9IGZhbHNlKQoJewoJCSRjZWxsID0gJHRoaXMtPmdldENlbGwoUEhQRXhjZWxfQ2VsbDo6c3RyaW5nRnJvbUNvbHVtbkluZGV4KCRwQ29sdW1uKSAuICRwUm93KS0+c2V0VmFsdWUoJHBWYWx1ZSk7CgoJCWlmICgkcmV0dXJuQ2VsbCkgewoJCQlyZXR1cm4gJGNlbGw7CgkJfQoJCXJldHVybiAkdGhpczsKCX0KCgkvKioKCSAqIFNldCBhIGNlbGwgdmFsdWUKCSAqCgkgKiBAcGFyYW0gc3RyaW5nCSRwQ29vcmRpbmF0ZQlDb29yZGluYXRlIG9mIHRoZSBjZWxsCgkgKiBAcGFyYW0gbWl4ZWQJJHBWYWx1ZQkJCVZhbHVlIG9mIHRoZSBjZWxsCgkgKiBAcGFyYW0gc3RyaW5nCSRwRGF0YVR5cGUJCUV4cGxpY2l0IGRhdGEgdHlwZQoJICogQHJldHVybiBQSFBFeGNlbF9Xb3Jrc2hlZXQKCSAqLwoJcHVibGljIGZ1bmN0aW9uIHNldENlbGxWYWx1ZUV4cGxpY2l0KCRwQ29vcmRpbmF0ZSA9ICdBMScsICRwVmFsdWUgPSBudWxsLCAkcERhdGFUeXBlID0gUEhQRXhjZWxfQ2VsbF9EYXRhVHlwZTo6VFlQRV9TVFJJTkcpCgl7CgkJLy8gU2V0IHZhbHVlCgkJJHRoaXMtPmdldENlbGwoJHBDb29yZGluYXRlKS0+c2V0VmFsdWVFeHBsaWNpdCgkcFZhbHVlLCAkcERhdGFUeXBlKTsKCQlyZXR1cm4gJHRoaXM7Cgl9CgoJLyoqCgkgKiBTZXQgYSBjZWxsIHZhbHVlIGJ5IHVzaW5nIG51bWVyaWMgY2VsbCBjb29yZGluYXRlcwoJICoKCSAqIEBwYXJhbSBzdHJpbmcJJHBDb2x1bW4JCU51bWVyaWMgY29sdW1uIGNvb3JkaW5hdGUgb2YgdGhlIGNlbGwKCSAqIEBwYXJhbSBzdHJpbmcJJHBSb3cJCQlOdW1lcmljIHJvdyBjb29yZGluYXRlIG9mIHRoZSBjZWxsCgkgKiBAcGFyYW0gbWl4ZWQJCSRwVmFsdWUJCQlWYWx1ZSBvZiB0aGUgY2VsbAoJICogQHBhcmFtIHN0cmluZwkkcERhdGFUeXBlCQlFeHBsaWNpdCBkYXRhIHR5cGUKCSAqIEByZXR1cm4gUEhQRXhjZWxfV29ya3NoZWV0CgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBzZXRDZWxsVmFsdWVFeHBsaWNpdEJ5Q29sdW1uQW5kUm93KCRwQ29sdW1uID0gMCwgJHBSb3cgPSAxLCAkcFZhbHVlID0gbnVsbCwgJHBEYXRhVHlwZSA9IFBIUEV4Y2VsX0NlbGxfRGF0YVR5cGU6OlRZUEVfU1RSSU5HKQoJewoJCXJldHVybiAkdGhpcy0+Z2V0Q2VsbChQSFBFeGNlbF9DZWxsOjpzdHJpbmdGcm9tQ29sdW1uSW5kZXgoJHBDb2x1bW4pIC4gJHBSb3cpLT5zZXRWYWx1ZUV4cGxpY2l0KCRwVmFsdWUsICRwRGF0YVR5cGUpOwoJfQoKCS8qKgoJICogR2V0IGNlbGwgYXQgYSBzcGVjaWZpYyBjb29yZGluYXRlCgkgKgoJICogQHBhcmFtCXN0cmluZwkJCSRwQ29vcmRpbmF0ZQlDb29yZGluYXRlIG9mIHRoZSBjZWxsCgkgKiBAdGhyb3dzCUV4Y2VwdGlvbgoJICogQHJldHVybglQSFBFeGNlbF9DZWxsCUNlbGwgdGhhdCB3YXMgZm91bmQKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldENlbGwoJHBDb29yZGluYXRlID0gJ0ExJykKCXsKCQkvLyBDaGVjayBjZWxsIGNvbGxlY3Rpb24KCQlpZiAoJHRoaXMtPl9jZWxsQ29sbGVjdGlvbi0+aXNEYXRhU2V0KCRwQ29vcmRpbmF0ZSkpIHsKCQkJcmV0dXJuICR0aGlzLT5fY2VsbENvbGxlY3Rpb24tPmdldENhY2hlRGF0YSgkcENvb3JkaW5hdGUpOwoJCX0KCgkJLy8gV29ya3NoZWV0IHJlZmVyZW5jZT8KCQlpZiAoc3RycG9zKCRwQ29vcmRpbmF0ZSwgJyEnKSAhPT0gZmFsc2UpIHsKCQkJJHdvcmtzaGVldFJlZmVyZW5jZSA9IFBIUEV4Y2VsX1dvcmtzaGVldDo6ZXh0cmFjdFNoZWV0VGl0bGUoJHBDb29yZGluYXRlLCB0cnVlKTsKCQkJcmV0dXJuICR0aGlzLT5nZXRQYXJlbnQoKS0+Z2V0U2hlZXRCeU5hbWUoJHdvcmtzaGVldFJlZmVyZW5jZVswXSktPmdldENlbGwoJHdvcmtzaGVldFJlZmVyZW5jZVsxXSk7CgkJfQoKCQkvLyBOYW1lZCByYW5nZT8KCQlpZiAoKCFwcmVnX21hdGNoKCcvXicuUEhQRXhjZWxfQ2FsY3VsYXRpb246OkNBTENVTEFUSU9OX1JFR0VYUF9DRUxMUkVGLickL2knLCAkcENvb3JkaW5hdGUsICRtYXRjaGVzKSkgJiYKCQkJKHByZWdfbWF0Y2goJy9eJy5QSFBFeGNlbF9DYWxjdWxhdGlvbjo6Q0FMQ1VMQVRJT05fUkVHRVhQX05BTUVEUkFOR0UuJyQvaScsICRwQ29vcmRpbmF0ZSwgJG1hdGNoZXMpKSkgewoJCQkkbmFtZWRSYW5nZSA9IFBIUEV4Y2VsX05hbWVkUmFuZ2U6OnJlc29sdmVSYW5nZSgkcENvb3JkaW5hdGUsICR0aGlzKTsKCQkJaWYgKCRuYW1lZFJhbmdlICE9PSBOVUxMKSB7CgkJCQkkcENvb3JkaW5hdGUgPSAkbmFtZWRSYW5nZS0+Z2V0UmFuZ2UoKTsKCQkJCXJldHVybiAkbmFtZWRSYW5nZS0+Z2V0V29ya3NoZWV0KCktPmdldENlbGwoJHBDb29yZGluYXRlKTsKCQkJfQoJCX0KCgkJLy8gVXBwZXJjYXNlIGNvb3JkaW5hdGUKCQkkcENvb3JkaW5hdGUgPSBzdHJ0b3VwcGVyKCRwQ29vcmRpbmF0ZSk7CgoJCWlmIChzdHJwb3MoJHBDb29yZGluYXRlLCc6JykgIT09IGZhbHNlIHx8IHN0cnBvcygkcENvb3JkaW5hdGUsJywnKSAhPT0gZmFsc2UpIHsKCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbignQ2VsbCBjb29yZGluYXRlIGNhbiBub3QgYmUgYSByYW5nZSBvZiBjZWxscy4nKTsKCQl9IGVsc2VpZiAoc3RycG9zKCRwQ29vcmRpbmF0ZSwnJCcpICE9PSBmYWxzZSkgewoJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCdDZWxsIGNvb3JkaW5hdGUgbXVzdCBub3QgYmUgYWJzb2x1dGUuJyk7CgkJfSBlbHNlIHsKCQkJLy8gQ3JlYXRlIG5ldyBjZWxsIG9iamVjdAoKCQkJLy8gQ29vcmRpbmF0ZXMKCQkJJGFDb29yZGluYXRlcyA9IFBIUEV4Y2VsX0NlbGw6OmNvb3JkaW5hdGVGcm9tU3RyaW5nKCRwQ29vcmRpbmF0ZSk7CgoJCQkkY2VsbCA9ICR0aGlzLT5fY2VsbENvbGxlY3Rpb24tPmFkZENhY2hlRGF0YSgkcENvb3JkaW5hdGUsbmV3IFBIUEV4Y2VsX0NlbGwoJGFDb29yZGluYXRlc1swXSwgJGFDb29yZGluYXRlc1sxXSwgbnVsbCwgUEhQRXhjZWxfQ2VsbF9EYXRhVHlwZTo6VFlQRV9OVUxMLCAkdGhpcykpOwoJCQkkdGhpcy0+X2NlbGxDb2xsZWN0aW9uSXNTb3J0ZWQgPSBmYWxzZTsKCgkJCWlmIChQSFBFeGNlbF9DZWxsOjpjb2x1bW5JbmRleEZyb21TdHJpbmcoJHRoaXMtPl9jYWNoZWRIaWdoZXN0Q29sdW1uKSA8IFBIUEV4Y2VsX0NlbGw6OmNvbHVtbkluZGV4RnJvbVN0cmluZygkYUNvb3JkaW5hdGVzWzBdKSkKCQkJCSR0aGlzLT5fY2FjaGVkSGlnaGVzdENvbHVtbiA9ICRhQ29vcmRpbmF0ZXNbMF07CgoJCQkkdGhpcy0+X2NhY2hlZEhpZ2hlc3RSb3cgPSBtYXgoJHRoaXMtPl9jYWNoZWRIaWdoZXN0Um93LCRhQ29vcmRpbmF0ZXNbMV0pOwoKCQkJLy8gQ2VsbCBuZWVkcyBhcHByb3ByaWF0ZSB4ZkluZGV4CgkJCSRyb3dEaW1lbnNpb25zCT0gJHRoaXMtPmdldFJvd0RpbWVuc2lvbnMoKTsKCQkJJGNvbHVtbkRpbWVuc2lvbnMgPSAkdGhpcy0+Z2V0Q29sdW1uRGltZW5zaW9ucygpOwoKCQkJaWYgKCBpc3NldCgkcm93RGltZW5zaW9uc1skYUNvb3JkaW5hdGVzWzFdXSkgJiYgJHJvd0RpbWVuc2lvbnNbJGFDb29yZGluYXRlc1sxXV0tPmdldFhmSW5kZXgoKSAhPT0gbnVsbCApIHsKCQkJCS8vIHRoZW4gdGhlcmUgaXMgYSByb3cgZGltZW5zaW9uIHdpdGggZXhwbGljaXQgc3R5bGUsIGFzc2lnbiBpdCB0byB0aGUgY2VsbAoJCQkJJGNlbGwtPnNldFhmSW5kZXgoJHJvd0RpbWVuc2lvbnNbJGFDb29yZGluYXRlc1sxXV0tPmdldFhmSW5kZXgoKSk7CgkJCX0gZWxzZSBpZiAoIGlzc2V0KCRjb2x1bW5EaW1lbnNpb25zWyRhQ29vcmRpbmF0ZXNbMF1dKSApIHsKCQkJCS8vIHRoZW4gdGhlcmUgaXMgYSBjb2x1bW4gZGltZW5zaW9uLCBhc3NpZ24gaXQgdG8gdGhlIGNlbGwKCQkJCSRjZWxsLT5zZXRYZkluZGV4KCRjb2x1bW5EaW1lbnNpb25zWyRhQ29vcmRpbmF0ZXNbMF1dLT5nZXRYZkluZGV4KCkpOwoJCQl9IGVsc2UgewoJCQkJLy8gc2V0IHRvIGRlZmF1bHQgaW5kZXgKCQkJCSRjZWxsLT5zZXRYZkluZGV4KDApOwoJCQl9CgoJCQlyZXR1cm4gJGNlbGw7CgkJfQoJfQoKCS8qKgoJICogR2V0IGNlbGwgYXQgYSBzcGVjaWZpYyBjb29yZGluYXRlIGJ5IHVzaW5nIG51bWVyaWMgY2VsbCBjb29yZGluYXRlcwoJICoKCSAqIEBwYXJhbQlzdHJpbmcgJHBDb2x1bW4JCU51bWVyaWMgY29sdW1uIGNvb3JkaW5hdGUgb2YgdGhlIGNlbGwKCSAqIEBwYXJhbQlzdHJpbmcgJHBSb3cJCU51bWVyaWMgcm93IGNvb3JkaW5hdGUgb2YgdGhlIGNlbGwKCSAqIEByZXR1cm4JUEhQRXhjZWxfQ2VsbAkJQ2VsbCB0aGF0IHdhcyBmb3VuZAoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0Q2VsbEJ5Q29sdW1uQW5kUm93KCRwQ29sdW1uID0gMCwgJHBSb3cgPSAxKQoJewoJCSRjb2x1bW5MZXR0ZXIgPSBQSFBFeGNlbF9DZWxsOjpzdHJpbmdGcm9tQ29sdW1uSW5kZXgoJHBDb2x1bW4pOwoJCSRjb29yZGluYXRlID0gJGNvbHVtbkxldHRlciAuICRwUm93OwoKCQlpZiAoISR0aGlzLT5fY2VsbENvbGxlY3Rpb24tPmlzRGF0YVNldCgkY29vcmRpbmF0ZSkpIHsKCQkJJGNlbGwgPSAkdGhpcy0+X2NlbGxDb2xsZWN0aW9uLT5hZGRDYWNoZURhdGEoJGNvb3JkaW5hdGUsIG5ldyBQSFBFeGNlbF9DZWxsKCRjb2x1bW5MZXR0ZXIsICRwUm93LCBudWxsLCBQSFBFeGNlbF9DZWxsX0RhdGFUeXBlOjpUWVBFX05VTEwsICR0aGlzKSk7CgkJCSR0aGlzLT5fY2VsbENvbGxlY3Rpb25Jc1NvcnRlZCA9IGZhbHNlOwoKCQkJaWYgKFBIUEV4Y2VsX0NlbGw6OmNvbHVtbkluZGV4RnJvbVN0cmluZygkdGhpcy0+X2NhY2hlZEhpZ2hlc3RDb2x1bW4pIDwgJHBDb2x1bW4pCgkJCQkkdGhpcy0+X2NhY2hlZEhpZ2hlc3RDb2x1bW4gPSAkY29sdW1uTGV0dGVyOwoKCQkJJHRoaXMtPl9jYWNoZWRIaWdoZXN0Um93ID0gbWF4KCR0aGlzLT5fY2FjaGVkSGlnaGVzdFJvdywkcFJvdyk7CgoJCQlyZXR1cm4gJGNlbGw7CgkJfQoKCQlyZXR1cm4gJHRoaXMtPl9jZWxsQ29sbGVjdGlvbi0+Z2V0Q2FjaGVEYXRhKCRjb29yZGluYXRlKTsKCX0KCgkvKioKCSAqIENlbGwgYXQgYSBzcGVjaWZpYyBjb29yZGluYXRlIGV4aXN0cz8KCSAqCgkgKiBAcGFyYW0Jc3RyaW5nCQkJJHBDb29yZGluYXRlCUNvb3JkaW5hdGUgb2YgdGhlIGNlbGwKCSAqIEB0aHJvd3MJRXhjZXB0aW9uCgkgKiBAcmV0dXJuCWJvb2xlYW4KCSAqLwoJcHVibGljIGZ1bmN0aW9uIGNlbGxFeGlzdHMoJHBDb29yZGluYXRlID0gJ0ExJykKCXsKCQkvLyBXb3Jrc2hlZXQgcmVmZXJlbmNlPwoJCWlmIChzdHJwb3MoJHBDb29yZGluYXRlLCAnIScpICE9PSBmYWxzZSkgewoJCQkkd29ya3NoZWV0UmVmZXJlbmNlID0gUEhQRXhjZWxfV29ya3NoZWV0OjpleHRyYWN0U2hlZXRUaXRsZSgkcENvb3JkaW5hdGUsIHRydWUpOwoJCQlyZXR1cm4gJHRoaXMtPmdldFBhcmVudCgpLT5nZXRTaGVldEJ5TmFtZSgkd29ya3NoZWV0UmVmZXJlbmNlWzBdKS0+Y2VsbEV4aXN0cygkd29ya3NoZWV0UmVmZXJlbmNlWzFdKTsKCQl9CgoJCS8vIE5hbWVkIHJhbmdlPwoJCWlmICgoIXByZWdfbWF0Y2goJy9eJy5QSFBFeGNlbF9DYWxjdWxhdGlvbjo6Q0FMQ1VMQVRJT05fUkVHRVhQX0NFTExSRUYuJyQvaScsICRwQ29vcmRpbmF0ZSwgJG1hdGNoZXMpKSAmJgoJCQkocHJlZ19tYXRjaCgnL14nLlBIUEV4Y2VsX0NhbGN1bGF0aW9uOjpDQUxDVUxBVElPTl9SRUdFWFBfTkFNRURSQU5HRS4nJC9pJywgJHBDb29yZGluYXRlLCAkbWF0Y2hlcykpKSB7CgkJCSRuYW1lZFJhbmdlID0gUEhQRXhjZWxfTmFtZWRSYW5nZTo6cmVzb2x2ZVJhbmdlKCRwQ29vcmRpbmF0ZSwgJHRoaXMpOwoJCQlpZiAoJG5hbWVkUmFuZ2UgIT09IE5VTEwpIHsKCQkJCSRwQ29vcmRpbmF0ZSA9ICRuYW1lZFJhbmdlLT5nZXRSYW5nZSgpOwoJCQkJaWYgKCR0aGlzLT5nZXRIYXNoQ29kZSgpICE9ICRuYW1lZFJhbmdlLT5nZXRXb3Jrc2hlZXQoKS0+Z2V0SGFzaENvZGUoKSkgewoJCQkJCWlmICghJG5hbWVkUmFuZ2UtPmdldExvY2FsT25seSgpKSB7CgkJCQkJCXJldHVybiAkbmFtZWRSYW5nZS0+Z2V0V29ya3NoZWV0KCktPmNlbGxFeGlzdHMoJHBDb29yZGluYXRlKTsKCQkJCQl9IGVsc2UgewoJCQkJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCdOYW1lZCByYW5nZSAnIC4gJG5hbWVkUmFuZ2UtPmdldE5hbWUoKSAuICcgaXMgbm90IGFjY2Vzc2libGUgZnJvbSB3aXRoaW4gc2hlZXQgJyAuICR0aGlzLT5nZXRUaXRsZSgpKTsKCQkJCQl9CgkJCQl9CgkJCX0KCQl9CgoJCS8vIFVwcGVyY2FzZSBjb29yZGluYXRlCgkJJHBDb29yZGluYXRlID0gc3RydG91cHBlcigkcENvb3JkaW5hdGUpOwoKCQlpZiAoc3RycG9zKCRwQ29vcmRpbmF0ZSwnOicpICE9PSBmYWxzZSB8fCBzdHJwb3MoJHBDb29yZGluYXRlLCcsJykgIT09IGZhbHNlKSB7CgkJCXRocm93IG5ldyBFeGNlcHRpb24oJ0NlbGwgY29vcmRpbmF0ZSBjYW4gbm90IGJlIGEgcmFuZ2Ugb2YgY2VsbHMuJyk7CgkJfSBlbHNlaWYgKHN0cnBvcygkcENvb3JkaW5hdGUsJyQnKSAhPT0gZmFsc2UpIHsKCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbignQ2VsbCBjb29yZGluYXRlIG11c3Qgbm90IGJlIGFic29sdXRlLicpOwoJCX0gZWxzZSB7CgkJCS8vIENvb3JkaW5hdGVzCgkJCSRhQ29vcmRpbmF0ZXMgPSBQSFBFeGNlbF9DZWxsOjpjb29yZGluYXRlRnJvbVN0cmluZygkcENvb3JkaW5hdGUpOwoKCQkJLy8gQ2VsbCBleGlzdHM/CgkJCXJldHVybiAkdGhpcy0+X2NlbGxDb2xsZWN0aW9uLT5pc0RhdGFTZXQoJHBDb29yZGluYXRlKTsKCQl9Cgl9CgoJLyoqCgkgKiBDZWxsIGF0IGEgc3BlY2lmaWMgY29vcmRpbmF0ZSBieSB1c2luZyBudW1lcmljIGNlbGwgY29vcmRpbmF0ZXMgZXhpc3RzPwoJICoKCSAqIEBwYXJhbQlzdHJpbmcgJHBDb2x1bW4JCU51bWVyaWMgY29sdW1uIGNvb3JkaW5hdGUgb2YgdGhlIGNlbGwKCSAqIEBwYXJhbQlzdHJpbmcgJHBSb3cJCU51bWVyaWMgcm93IGNvb3JkaW5hdGUgb2YgdGhlIGNlbGwKCSAqIEByZXR1cm4JYm9vbGVhbgoJICovCglwdWJsaWMgZnVuY3Rpb24gY2VsbEV4aXN0c0J5Q29sdW1uQW5kUm93KCRwQ29sdW1uID0gMCwgJHBSb3cgPSAxKQoJewoJCXJldHVybiAkdGhpcy0+Y2VsbEV4aXN0cyhQSFBFeGNlbF9DZWxsOjpzdHJpbmdGcm9tQ29sdW1uSW5kZXgoJHBDb2x1bW4pIC4gJHBSb3cpOwoJfQoKCS8qKgoJICogR2V0IHJvdyBkaW1lbnNpb24gYXQgYSBzcGVjaWZpYyByb3cKCSAqCgkgKiBAcGFyYW0gaW50ICRwUm93CU51bWVyaWMgaW5kZXggb2YgdGhlIHJvdwoJICogQHJldHVybiBQSFBFeGNlbF9Xb3Jrc2hlZXRfUm93RGltZW5zaW9uCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRSb3dEaW1lbnNpb24oJHBSb3cgPSAxKQoJewoJCS8vIEZvdW5kCgkJJGZvdW5kID0gbnVsbDsKCgkJLy8gR2V0IHJvdyBkaW1lbnNpb24KCQlpZiAoIWlzc2V0KCR0aGlzLT5fcm93RGltZW5zaW9uc1skcFJvd10pKSB7CgkJCSR0aGlzLT5fcm93RGltZW5zaW9uc1skcFJvd10gPSBuZXcgUEhQRXhjZWxfV29ya3NoZWV0X1Jvd0RpbWVuc2lvbigkcFJvdyk7CgoJCQkkdGhpcy0+X2NhY2hlZEhpZ2hlc3RSb3cgPSBtYXgoJHRoaXMtPl9jYWNoZWRIaWdoZXN0Um93LCRwUm93KTsKCQl9CgkJcmV0dXJuICR0aGlzLT5fcm93RGltZW5zaW9uc1skcFJvd107Cgl9CgoJLyoqCgkgKiBHZXQgY29sdW1uIGRpbWVuc2lvbiBhdCBhIHNwZWNpZmljIGNvbHVtbgoJICoKCSAqIEBwYXJhbSBzdHJpbmcgJHBDb2x1bW4JU3RyaW5nIGluZGV4IG9mIHRoZSBjb2x1bW4KCSAqIEByZXR1cm4gUEhQRXhjZWxfV29ya3NoZWV0X0NvbHVtbkRpbWVuc2lvbgoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0Q29sdW1uRGltZW5zaW9uKCRwQ29sdW1uID0gJ0EnKQoJewoJCS8vIFVwcGVyY2FzZSBjb29yZGluYXRlCgkJJHBDb2x1bW4gPSBzdHJ0b3VwcGVyKCRwQ29sdW1uKTsKCgkJLy8gRmV0Y2ggZGltZW5zaW9ucwoJCWlmICghaXNzZXQoJHRoaXMtPl9jb2x1bW5EaW1lbnNpb25zWyRwQ29sdW1uXSkpIHsKCQkJJHRoaXMtPl9jb2x1bW5EaW1lbnNpb25zWyRwQ29sdW1uXSA9IG5ldyBQSFBFeGNlbF9Xb3Jrc2hlZXRfQ29sdW1uRGltZW5zaW9uKCRwQ29sdW1uKTsKCgkJCWlmIChQSFBFeGNlbF9DZWxsOjpjb2x1bW5JbmRleEZyb21TdHJpbmcoJHRoaXMtPl9jYWNoZWRIaWdoZXN0Q29sdW1uKSA8IFBIUEV4Y2VsX0NlbGw6OmNvbHVtbkluZGV4RnJvbVN0cmluZygkcENvbHVtbikpCgkJCQkkdGhpcy0+X2NhY2hlZEhpZ2hlc3RDb2x1bW4gPSAkcENvbHVtbjsKCQl9CgkJcmV0dXJuICR0aGlzLT5fY29sdW1uRGltZW5zaW9uc1skcENvbHVtbl07Cgl9CgoJLyoqCgkgKiBHZXQgY29sdW1uIGRpbWVuc2lvbiBhdCBhIHNwZWNpZmljIGNvbHVtbiBieSB1c2luZyBudW1lcmljIGNlbGwgY29vcmRpbmF0ZXMKCSAqCgkgKiBAcGFyYW0Jc3RyaW5nICRwQ29sdW1uCQlOdW1lcmljIGNvbHVtbiBjb29yZGluYXRlIG9mIHRoZSBjZWxsCgkgKiBAcmV0dXJuCVBIUEV4Y2VsX1dvcmtzaGVldF9Db2x1bW5EaW1lbnNpb24KCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldENvbHVtbkRpbWVuc2lvbkJ5Q29sdW1uKCRwQ29sdW1uID0gMCkKCXsKCQlyZXR1cm4gJHRoaXMtPmdldENvbHVtbkRpbWVuc2lvbihQSFBFeGNlbF9DZWxsOjpzdHJpbmdGcm9tQ29sdW1uSW5kZXgoJHBDb2x1bW4pKTsKCX0KCgkvKioKCSAqIEdldCBzdHlsZXMKCSAqCgkgKiBAcmV0dXJuIFBIUEV4Y2VsX1N0eWxlW10KCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldFN0eWxlcygpCgl7CgkJcmV0dXJuICR0aGlzLT5fc3R5bGVzOwoJfQoKCS8qKgoJICogR2V0IGRlZmF1bHQgc3R5bGUgb2Ygd29ya2JvcmsuCgkgKgoJICogQGRlcHJlY2F0ZWQKCSAqIEByZXR1cm4JUEhQRXhjZWxfU3R5bGUKCSAqIEB0aHJvd3MJRXhjZXB0aW9uCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXREZWZhdWx0U3R5bGUoKQoJewoJCXJldHVybiAkdGhpcy0+X3BhcmVudC0+Z2V0RGVmYXVsdFN0eWxlKCk7Cgl9CgoJLyoqCgkgKiBTZXQgZGVmYXVsdCBzdHlsZSAtIHNob3VsZCBvbmx5IGJlIHVzZWQgYnkgUEhQRXhjZWxfSVJlYWRlciBpbXBsZW1lbnRhdGlvbnMhCgkgKgoJICogQGRlcHJlY2F0ZWQKCSAqIEBwYXJhbQlQSFBFeGNlbF9TdHlsZQkkcFZhbHVlCgkgKiBAdGhyb3dzCUV4Y2VwdGlvbgoJICogQHJldHVybiBQSFBFeGNlbF9Xb3Jrc2hlZXQKCSAqLwoJcHVibGljIGZ1bmN0aW9uIHNldERlZmF1bHRTdHlsZShQSFBFeGNlbF9TdHlsZSAkcFZhbHVlKQoJewoJCSR0aGlzLT5fcGFyZW50LT5nZXREZWZhdWx0U3R5bGUoKS0+YXBwbHlGcm9tQXJyYXkoYXJyYXkoCgkJCSdmb250JyA9PiBhcnJheSgKCQkJCSduYW1lJyA9PiAkcFZhbHVlLT5nZXRGb250KCktPmdldE5hbWUoKSwKCQkJCSdzaXplJyA9PiAkcFZhbHVlLT5nZXRGb250KCktPmdldFNpemUoKSwKCQkJKSwKCQkpKTsKCQlyZXR1cm4gJHRoaXM7Cgl9CgoJLyoqCgkgKiBHZXQgc3R5bGUgZm9yIGNlbGwKCSAqCgkgKiBAcGFyYW0Jc3RyaW5nCSRwQ2VsbENvb3JkaW5hdGUJQ2VsbCBjb29yZGluYXRlIHRvIGdldCBzdHlsZSBmb3IKCSAqIEByZXR1cm4JUEhQRXhjZWxfU3R5bGUKCSAqIEB0aHJvd3MJRXhjZXB0aW9uCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRTdHlsZSgkcENlbGxDb29yZGluYXRlID0gJ0ExJykKCXsKCQkvLyBzZXQgdGhpcyBzaGVldCBhcyBhY3RpdmUKCQkkdGhpcy0+X3BhcmVudC0+c2V0QWN0aXZlU2hlZXRJbmRleCgkdGhpcy0+X3BhcmVudC0+Z2V0SW5kZXgoJHRoaXMpKTsKCgkJLy8gc2V0IGNlbGwgY29vcmRpbmF0ZSBhcyBhY3RpdmUKCQkkdGhpcy0+c2V0U2VsZWN0ZWRDZWxscygkcENlbGxDb29yZGluYXRlKTsKCgkJcmV0dXJuICR0aGlzLT5fcGFyZW50LT5nZXRDZWxsWGZTdXBlcnZpc29yKCk7Cgl9CgoJLyoqCgkgKiBHZXQgY29uZGl0aW9uYWwgc3R5bGVzIGZvciBhIGNlbGwKCSAqCgkgKiBAcGFyYW0gc3RyaW5nICRwQ29vcmRpbmF0ZQoJICogQHJldHVybiBQSFBFeGNlbF9TdHlsZV9Db25kaXRpb25hbFtdCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRDb25kaXRpb25hbFN0eWxlcygkcENvb3JkaW5hdGUgPSAnQTEnKQoJewoJCWlmICghaXNzZXQoJHRoaXMtPl9jb25kaXRpb25hbFN0eWxlc0NvbGxlY3Rpb25bJHBDb29yZGluYXRlXSkpIHsKCQkJJHRoaXMtPl9jb25kaXRpb25hbFN0eWxlc0NvbGxlY3Rpb25bJHBDb29yZGluYXRlXSA9IGFycmF5KCk7CgkJfQoJCXJldHVybiAkdGhpcy0+X2NvbmRpdGlvbmFsU3R5bGVzQ29sbGVjdGlvblskcENvb3JkaW5hdGVdOwoJfQoKCS8qKgoJICogRG8gY29uZGl0aW9uYWwgc3R5bGVzIGV4aXN0IGZvciB0aGlzIGNlbGw/CgkgKgoJICogQHBhcmFtIHN0cmluZyAkcENvb3JkaW5hdGUKCSAqIEByZXR1cm4gYm9vbGVhbgoJICovCglwdWJsaWMgZnVuY3Rpb24gY29uZGl0aW9uYWxTdHlsZXNFeGlzdHMoJHBDb29yZGluYXRlID0gJ0ExJykKCXsKCQlpZiAoaXNzZXQoJHRoaXMtPl9jb25kaXRpb25hbFN0eWxlc0NvbGxlY3Rpb25bJHBDb29yZGluYXRlXSkpIHsKCQkJcmV0dXJuIHRydWU7CgkJfQoJCXJldHVybiBmYWxzZTsKCX0KCgkvKioKCSAqIFJlbW92ZXMgY29uZGl0aW9uYWwgc3R5bGVzIGZvciBhIGNlbGwKCSAqCgkgKiBAcGFyYW0gc3RyaW5nICRwQ29vcmRpbmF0ZQoJICogQHJldHVybiBQSFBFeGNlbF9Xb3Jrc2hlZXQKCSAqLwoJcHVibGljIGZ1bmN0aW9uIHJlbW92ZUNvbmRpdGlvbmFsU3R5bGVzKCRwQ29vcmRpbmF0ZSA9ICdBMScpCgl7CgkJdW5zZXQoJHRoaXMtPl9jb25kaXRpb25hbFN0eWxlc0NvbGxlY3Rpb25bJHBDb29yZGluYXRlXSk7CgkJcmV0dXJuICR0aGlzOwoJfQoKCS8qKgoJICogR2V0IGNvbGxlY3Rpb24gb2YgY29uZGl0aW9uYWwgc3R5bGVzCgkgKgoJICogQHJldHVybiBhcnJheQoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0Q29uZGl0aW9uYWxTdHlsZXNDb2xsZWN0aW9uKCkKCXsKCQlyZXR1cm4gJHRoaXMtPl9jb25kaXRpb25hbFN0eWxlc0NvbGxlY3Rpb247Cgl9CgoJLyoqCgkgKiBTZXQgY29uZGl0aW9uYWwgc3R5bGVzCgkgKgoJICogQHBhcmFtICRwQ29vcmRpbmF0ZSBzdHJpbmcgRS5nLiAnQTEnCgkgKiBAcGFyYW0gJHBWYWx1ZSBQSFBFeGNlbF9TdHlsZV9Db25kaXRpb25hbFtdCgkgKiBAcmV0dXJuIFBIUEV4Y2VsX1dvcmtzaGVldAoJICovCglwdWJsaWMgZnVuY3Rpb24gc2V0Q29uZGl0aW9uYWxTdHlsZXMoJHBDb29yZGluYXRlID0gJ0ExJywgJHBWYWx1ZSkKCXsKCQkkdGhpcy0+X2NvbmRpdGlvbmFsU3R5bGVzQ29sbGVjdGlvblskcENvb3JkaW5hdGVdID0gJHBWYWx1ZTsKCQlyZXR1cm4gJHRoaXM7Cgl9CgoJLyoqCgkgKiBHZXQgc3R5bGUgZm9yIGNlbGwgYnkgdXNpbmcgbnVtZXJpYyBjZWxsIGNvb3JkaW5hdGVzCgkgKgoJICogQHBhcmFtCWludCAkcENvbHVtbglOdW1lcmljIGNvbHVtbiBjb29yZGluYXRlIG9mIHRoZSBjZWxsCgkgKiBAcGFyYW0JaW50ICRwUm93CQlOdW1lcmljIHJvdyBjb29yZGluYXRlIG9mIHRoZSBjZWxsCgkgKiBAcmV0dXJuCVBIUEV4Y2VsX1N0eWxlCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRTdHlsZUJ5Q29sdW1uQW5kUm93KCRwQ29sdW1uID0gMCwgJHBSb3cgPSAxKQoJewoJCXJldHVybiAkdGhpcy0+Z2V0U3R5bGUoUEhQRXhjZWxfQ2VsbDo6c3RyaW5nRnJvbUNvbHVtbkluZGV4KCRwQ29sdW1uKSAuICRwUm93KTsKCX0KCgkvKioKCSAqIFNldCBzaGFyZWQgY2VsbCBzdHlsZSB0byBhIHJhbmdlIG9mIGNlbGxzCgkgKgoJICogUGxlYXNlIG5vdGUgdGhhdCB0aGlzIHdpbGwgb3ZlcndyaXRlIGV4aXN0aW5nIGNlbGwgc3R5bGVzIGZvciBjZWxscyBpbiByYW5nZSEKCSAqCgkgKiBAZGVwcmVjYXRlZAoJICogQHBhcmFtCVBIUEV4Y2VsX1N0eWxlCSRwU2hhcmVkQ2VsbFN0eWxlCUNlbGwgc3R5bGUgdG8gc2hhcmUKCSAqIEBwYXJhbQlzdHJpbmcJCQkkcFJhbmdlCQkJCVJhbmdlIG9mIGNlbGxzIChpLmUuICJBMTpCMTAiKSwgb3IganVzdCBvbmUgY2VsbCAoaS5lLiAiQTEiKQoJICogQHRocm93cwlFeGNlcHRpb24KCSAqIEByZXR1cm4gUEhQRXhjZWxfV29ya3NoZWV0CgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBzZXRTaGFyZWRTdHlsZShQSFBFeGNlbF9TdHlsZSAkcFNoYXJlZENlbGxTdHlsZSA9IG51bGwsICRwUmFuZ2UgPSAnJykKCXsKCQkkdGhpcy0+ZHVwbGljYXRlU3R5bGUoJHBTaGFyZWRDZWxsU3R5bGUsICRwUmFuZ2UpOwoJCXJldHVybiAkdGhpczsKCX0KCgkvKioKCSAqIER1cGxpY2F0ZSBjZWxsIHN0eWxlIHRvIGEgcmFuZ2Ugb2YgY2VsbHMKCSAqCgkgKiBQbGVhc2Ugbm90ZSB0aGF0IHRoaXMgd2lsbCBvdmVyd3JpdGUgZXhpc3RpbmcgY2VsbCBzdHlsZXMgZm9yIGNlbGxzIGluIHJhbmdlIQoJICoKCSAqIEBwYXJhbQlQSFBFeGNlbF9TdHlsZQkkcENlbGxTdHlsZQlDZWxsIHN0eWxlIHRvIGR1cGxpY2F0ZQoJICogQHBhcmFtCXN0cmluZwkJCSRwUmFuZ2UJCVJhbmdlIG9mIGNlbGxzIChpLmUuICJBMTpCMTAiKSwgb3IganVzdCBvbmUgY2VsbCAoaS5lLiAiQTEiKQoJICogQHRocm93cwlFeGNlcHRpb24KCSAqIEByZXR1cm4gUEhQRXhjZWxfV29ya3NoZWV0CgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBkdXBsaWNhdGVTdHlsZShQSFBFeGNlbF9TdHlsZSAkcENlbGxTdHlsZSA9IG51bGwsICRwUmFuZ2UgPSAnJykKCXsKCQkvLyBtYWtlIHN1cmUgd2UgaGF2ZSBhIHJlYWwgc3R5bGUgYW5kIG5vdCBzdXBlcnZpc29yCgkJJHN0eWxlID0gJHBDZWxsU3R5bGUtPmdldElzU3VwZXJ2aXNvcigpID8gJHBDZWxsU3R5bGUtPmdldFNoYXJlZENvbXBvbmVudCgpIDogJHBDZWxsU3R5bGU7CgoJCS8vIEFkZCB0aGUgc3R5bGUgdG8gdGhlIHdvcmtib29rIGlmIG5lY2Vzc2FyeQoJCSR3b3JrYm9vayA9ICR0aGlzLT5fcGFyZW50OwoJCWlmICgkZXhpc3RpbmdTdHlsZSA9ICR0aGlzLT5fcGFyZW50LT5nZXRDZWxsWGZCeUhhc2hDb2RlKCRwQ2VsbFN0eWxlLT5nZXRIYXNoQ29kZSgpKSkgewoJCQkvLyB0aGVyZSBpcyBhbHJlYWR5IHN1Y2ggY2VsbCBYZiBpbiBvdXIgY29sbGVjdGlvbgoJCQkkeGZJbmRleCA9ICRleGlzdGluZ1N0eWxlLT5nZXRJbmRleCgpOwoJCX0gZWxzZSB7CgkJCS8vIHdlIGRvbid0IGhhdmUgc3VjaCBhIGNlbGwgWGYsIG5lZWQgdG8gYWRkCgkJCSR3b3JrYm9vay0+YWRkQ2VsbFhmKCRwQ2VsbFN0eWxlKTsKCQkJJHhmSW5kZXggPSAkcENlbGxTdHlsZS0+Z2V0SW5kZXgoKTsKCQl9CgoJCS8vIFVwcGVyY2FzZSBjb29yZGluYXRlCgkJJHBSYW5nZSA9IHN0cnRvdXBwZXIoJHBSYW5nZSk7CgoJCS8vIElzIGl0IGEgY2VsbCByYW5nZSBvciBhIHNpbmdsZSBjZWxsPwoJCSRyYW5nZUEJPSAnJzsKCQkkcmFuZ2VCCT0gJyc7CgkJaWYgKHN0cnBvcygkcFJhbmdlLCAnOicpID09PSBmYWxzZSkgewoJCQkkcmFuZ2VBID0gJHBSYW5nZTsKCQkJJHJhbmdlQiA9ICRwUmFuZ2U7CgkJfSBlbHNlIHsKCQkJbGlzdCgkcmFuZ2VBLCAkcmFuZ2VCKSA9IGV4cGxvZGUoJzonLCAkcFJhbmdlKTsKCQl9CgoJCS8vIENhbGN1bGF0ZSByYW5nZSBvdXRlciBib3JkZXJzCgkJJHJhbmdlU3RhcnQgPSBQSFBFeGNlbF9DZWxsOjpjb29yZGluYXRlRnJvbVN0cmluZygkcmFuZ2VBKTsKCQkkcmFuZ2VFbmQJPSBQSFBFeGNlbF9DZWxsOjpjb29yZGluYXRlRnJvbVN0cmluZygkcmFuZ2VCKTsKCgkJLy8gVHJhbnNsYXRlIGNvbHVtbiBpbnRvIGluZGV4CgkJJHJhbmdlU3RhcnRbMF0JPSBQSFBFeGNlbF9DZWxsOjpjb2x1bW5JbmRleEZyb21TdHJpbmcoJHJhbmdlU3RhcnRbMF0pIC0gMTsKCQkkcmFuZ2VFbmRbMF0JPSBQSFBFeGNlbF9DZWxsOjpjb2x1bW5JbmRleEZyb21TdHJpbmcoJHJhbmdlRW5kWzBdKSAtIDE7CgoJCS8vIE1ha2Ugc3VyZSB3ZSBjYW4gbG9vcCB1cHdhcmRzIG9uIHJvd3MgYW5kIGNvbHVtbnMKCQlpZiAoJHJhbmdlU3RhcnRbMF0gPiAkcmFuZ2VFbmRbMF0gJiYgJHJhbmdlU3RhcnRbMV0gPiAkcmFuZ2VFbmRbMV0pIHsKCQkJJHRtcCA9ICRyYW5nZVN0YXJ0OwoJCQkkcmFuZ2VTdGFydCA9ICRyYW5nZUVuZDsKCQkJJHJhbmdlRW5kID0gJHRtcDsKCQl9CgoJCS8vIExvb3AgdGhyb3VnaCBjZWxscyBhbmQgYXBwbHkgc3R5bGVzCgkJZm9yICgkY29sID0gJHJhbmdlU3RhcnRbMF07ICRjb2wgPD0gJHJhbmdlRW5kWzBdOyArKyRjb2wpIHsKCQkJZm9yICgkcm93ID0gJHJhbmdlU3RhcnRbMV07ICRyb3cgPD0gJHJhbmdlRW5kWzFdOyArKyRyb3cpIHsKCQkJCSR0aGlzLT5nZXRDZWxsKFBIUEV4Y2VsX0NlbGw6OnN0cmluZ0Zyb21Db2x1bW5JbmRleCgkY29sKSAuICRyb3cpLT5zZXRYZkluZGV4KCR4ZkluZGV4KTsKCQkJfQoJCX0KCgkJcmV0dXJuICR0aGlzOwoJfQoKCS8qKgoJICogRHVwbGljYXRlIGNvbmRpdGlvbmFsIHN0eWxlIHRvIGEgcmFuZ2Ugb2YgY2VsbHMKCSAqCgkgKiBQbGVhc2Ugbm90ZSB0aGF0IHRoaXMgd2lsbCBvdmVyd3JpdGUgZXhpc3RpbmcgY2VsbCBzdHlsZXMgZm9yIGNlbGxzIGluIHJhbmdlIQoJICoKCSAqIEBwYXJhbQlhcnJheSBvZiBQSFBFeGNlbF9TdHlsZV9Db25kaXRpb25hbAkkcENlbGxTdHlsZQlDZWxsIHN0eWxlIHRvIGR1cGxpY2F0ZQoJICogQHBhcmFtCXN0cmluZwkJCQkJCQkJJHBSYW5nZQkJUmFuZ2Ugb2YgY2VsbHMgKGkuZS4gIkExOkIxMCIpLCBvciBqdXN0IG9uZSBjZWxsIChpLmUuICJBMSIpCgkgKiBAdGhyb3dzCUV4Y2VwdGlvbgoJICogQHJldHVybiBQSFBFeGNlbF9Xb3Jrc2hlZXQKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGR1cGxpY2F0ZUNvbmRpdGlvbmFsU3R5bGUoYXJyYXkgJHBDZWxsU3R5bGUgPSBudWxsLCAkcFJhbmdlID0gJycpCgl7CgkJZm9yZWFjaCgkcENlbGxTdHlsZSBhcyAkY2VsbFN0eWxlKSB7CgkJCWlmICghaXNfYSgkY2VsbFN0eWxlLCdQSFBFeGNlbF9TdHlsZV9Db25kaXRpb25hbCcpKSB7CgkJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCdTdHlsZSBpcyBub3QgYSBjb25kaXRpb25hbCBzdHlsZScpOwoJCQl9CgkJfQoKCQkvLyBVcHBlcmNhc2UgY29vcmRpbmF0ZQoJCSRwUmFuZ2UgPSBzdHJ0b3VwcGVyKCRwUmFuZ2UpOwoKCQkvLyBJcyBpdCBhIGNlbGwgcmFuZ2Ugb3IgYSBzaW5nbGUgY2VsbD8KCQkkcmFuZ2VBCT0gJyc7CgkJJHJhbmdlQgk9ICcnOwoJCWlmIChzdHJwb3MoJHBSYW5nZSwgJzonKSA9PT0gZmFsc2UpIHsKCQkJJHJhbmdlQSA9ICRwUmFuZ2U7CgkJCSRyYW5nZUIgPSAkcFJhbmdlOwoJCX0gZWxzZSB7CgkJCWxpc3QoJHJhbmdlQSwgJHJhbmdlQikgPSBleHBsb2RlKCc6JywgJHBSYW5nZSk7CgkJfQoKCQkvLyBDYWxjdWxhdGUgcmFuZ2Ugb3V0ZXIgYm9yZGVycwoJCSRyYW5nZVN0YXJ0ID0gUEhQRXhjZWxfQ2VsbDo6Y29vcmRpbmF0ZUZyb21TdHJpbmcoJHJhbmdlQSk7CgkJJHJhbmdlRW5kCT0gUEhQRXhjZWxfQ2VsbDo6Y29vcmRpbmF0ZUZyb21TdHJpbmcoJHJhbmdlQik7CgoJCS8vIFRyYW5zbGF0ZSBjb2x1bW4gaW50byBpbmRleAoJCSRyYW5nZVN0YXJ0WzBdCT0gUEhQRXhjZWxfQ2VsbDo6Y29sdW1uSW5kZXhGcm9tU3RyaW5nKCRyYW5nZVN0YXJ0WzBdKSAtIDE7CgkJJHJhbmdlRW5kWzBdCT0gUEhQRXhjZWxfQ2VsbDo6Y29sdW1uSW5kZXhGcm9tU3RyaW5nKCRyYW5nZUVuZFswXSkgLSAxOwoKCQkvLyBNYWtlIHN1cmUgd2UgY2FuIGxvb3AgdXB3YXJkcyBvbiByb3dzIGFuZCBjb2x1bW5zCgkJaWYgKCRyYW5nZVN0YXJ0WzBdID4gJHJhbmdlRW5kWzBdICYmICRyYW5nZVN0YXJ0WzFdID4gJHJhbmdlRW5kWzFdKSB7CgkJCSR0bXAgPSAkcmFuZ2VTdGFydDsKCQkJJHJhbmdlU3RhcnQgPSAkcmFuZ2VFbmQ7CgkJCSRyYW5nZUVuZCA9ICR0bXA7CgkJfQoKCQkvLyBMb29wIHRocm91Z2ggY2VsbHMgYW5kIGFwcGx5IHN0eWxlcwoJCWZvciAoJGNvbCA9ICRyYW5nZVN0YXJ0WzBdOyAkY29sIDw9ICRyYW5nZUVuZFswXTsgKyskY29sKSB7CgkJCWZvciAoJHJvdyA9ICRyYW5nZVN0YXJ0WzFdOyAkcm93IDw9ICRyYW5nZUVuZFsxXTsgKyskcm93KSB7CgkJCQkkdGhpcy0+c2V0Q29uZGl0aW9uYWxTdHlsZXMoUEhQRXhjZWxfQ2VsbDo6c3RyaW5nRnJvbUNvbHVtbkluZGV4KCRjb2wpIC4gJHJvdywgJHBDZWxsU3R5bGUpOwoJCQl9CgkJfQoKCQlyZXR1cm4gJHRoaXM7Cgl9CgoJLyoqCgkgKiBEdXBsaWNhdGUgY2VsbCBzdHlsZSBhcnJheSB0byBhIHJhbmdlIG9mIGNlbGxzCgkgKgoJICogUGxlYXNlIG5vdGUgdGhhdCB0aGlzIHdpbGwgb3ZlcndyaXRlIGV4aXN0aW5nIGNlbGwgc3R5bGVzIGZvciBjZWxscyBpbiByYW5nZSwKCSAqIGlmIHRoZXkgYXJlIGluIHRoZSBzdHlsZXMgYXJyYXkuIEZvciBleGFtcGxlLCBpZiB5b3UgZGVjaWRlIHRvIHNldCBhIHJhbmdlIG9mCgkgKiBjZWxscyB0byBmb250IGJvbGQsIG9ubHkgaW5jbHVkZSBmb250IGJvbGQgaW4gdGhlIHN0eWxlcyBhcnJheS4KCSAqCgkgKiBAZGVwcmVjYXRlZAoJICogQHBhcmFtCWFycmF5CQkJJHBTdHlsZXMJQXJyYXkgY29udGFpbmluZyBzdHlsZSBpbmZvcm1hdGlvbgoJICogQHBhcmFtCXN0cmluZwkJCSRwUmFuZ2UJCVJhbmdlIG9mIGNlbGxzIChpLmUuICJBMTpCMTAiKSwgb3IganVzdCBvbmUgY2VsbCAoaS5lLiAiQTEiKQoJICogQHBhcmFtCWJvb2xlYW4JCQkkcEFkdmFuY2VkCUFkdmFuY2VkIG1vZGUgZm9yIHNldHRpbmcgYm9yZGVycy4KCSAqIEB0aHJvd3MJRXhjZXB0aW9uCgkgKiBAcmV0dXJuIFBIUEV4Y2VsX1dvcmtzaGVldAoJICovCglwdWJsaWMgZnVuY3Rpb24gZHVwbGljYXRlU3R5bGVBcnJheSgkcFN0eWxlcyA9IG51bGwsICRwUmFuZ2UgPSAnJywgJHBBZHZhbmNlZCA9IHRydWUpCgl7CgkJJHRoaXMtPmdldFN0eWxlKCRwUmFuZ2UpLT5hcHBseUZyb21BcnJheSgkcFN0eWxlcywgJHBBZHZhbmNlZCk7CgkJcmV0dXJuICR0aGlzOwoJfQoKCS8qKgoJICogU2V0IGJyZWFrIG9uIGEgY2VsbAoJICoKCSAqIEBwYXJhbQlzdHJpbmcJCQkkcENlbGwJCUNlbGwgY29vcmRpbmF0ZSAoZS5nLiBBMSkKCSAqIEBwYXJhbQlpbnQJCQkJJHBCcmVhawkJQnJlYWsgdHlwZSAodHlwZSBvZiBQSFBFeGNlbF9Xb3Jrc2hlZXQ6OkJSRUFLXyopCgkgKiBAdGhyb3dzCUV4Y2VwdGlvbgoJICogQHJldHVybiBQSFBFeGNlbF9Xb3Jrc2hlZXQKCSAqLwoJcHVibGljIGZ1bmN0aW9uIHNldEJyZWFrKCRwQ2VsbCA9ICdBMScsICRwQnJlYWsgPSBQSFBFeGNlbF9Xb3Jrc2hlZXQ6OkJSRUFLX05PTkUpCgl7CgkJLy8gVXBwZXJjYXNlIGNvb3JkaW5hdGUKCQkkcENlbGwgPSBzdHJ0b3VwcGVyKCRwQ2VsbCk7CgoJCWlmICgkcENlbGwgIT0gJycpIHsKCQkJJHRoaXMtPl9icmVha3NbJHBDZWxsXSA9ICRwQnJlYWs7CgkJfSBlbHNlIHsKCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbignTm8gY2VsbCBjb29yZGluYXRlIHNwZWNpZmllZC4nKTsKCQl9CgoJCXJldHVybiAkdGhpczsKCX0KCgkvKioKCSAqIFNldCBicmVhayBvbiBhIGNlbGwgYnkgdXNpbmcgbnVtZXJpYyBjZWxsIGNvb3JkaW5hdGVzCgkgKgoJICogQHBhcmFtCWludGVnZXIJJHBDb2x1bW4JTnVtZXJpYyBjb2x1bW4gY29vcmRpbmF0ZSBvZiB0aGUgY2VsbAoJICogQHBhcmFtCWludGVnZXIJJHBSb3cJCU51bWVyaWMgcm93IGNvb3JkaW5hdGUgb2YgdGhlIGNlbGwKCSAqIEBwYXJhbQlpbnRlZ2VyCSRwQnJlYWsJCUJyZWFrIHR5cGUgKHR5cGUgb2YgUEhQRXhjZWxfV29ya3NoZWV0OjpCUkVBS18qKQoJICogQHRocm93cwlFeGNlcHRpb24KCSAqIEByZXR1cm4gUEhQRXhjZWxfV29ya3NoZWV0CgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBzZXRCcmVha0J5Q29sdW1uQW5kUm93KCRwQ29sdW1uID0gMCwgJHBSb3cgPSAxLCAkcEJyZWFrID0gUEhQRXhjZWxfV29ya3NoZWV0OjpCUkVBS19OT05FKQoJewoJCXJldHVybiAkdGhpcy0+c2V0QnJlYWsoUEhQRXhjZWxfQ2VsbDo6c3RyaW5nRnJvbUNvbHVtbkluZGV4KCRwQ29sdW1uKSAuICRwUm93LCAkcEJyZWFrKTsKCX0KCgkvKioKCSAqIEdldCBicmVha3MKCSAqCgkgKiBAcmV0dXJuIGFycmF5W10KCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldEJyZWFrcygpCgl7CgkJcmV0dXJuICR0aGlzLT5fYnJlYWtzOwoJfQoKCS8qKgoJICogU2V0IG1lcmdlIG9uIGEgY2VsbCByYW5nZQoJICoKCSAqIEBwYXJhbQlzdHJpbmcJCQkkcFJhbmdlCQlDZWxsIHJhbmdlIChlLmcuIEExOkUxKQoJICogQHRocm93cwlFeGNlcHRpb24KCSAqIEByZXR1cm4gUEhQRXhjZWxfV29ya3NoZWV0CgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBtZXJnZUNlbGxzKCRwUmFuZ2UgPSAnQTE6QTEnKQoJewoJCS8vIFVwcGVyY2FzZSBjb29yZGluYXRlCgkJJHBSYW5nZSA9IHN0cnRvdXBwZXIoJHBSYW5nZSk7CgoJCWlmIChzdHJwb3MoJHBSYW5nZSwnOicpICE9PSBmYWxzZSkgewoJCQkkdGhpcy0+X21lcmdlQ2VsbHNbJHBSYW5nZV0gPSAkcFJhbmdlOwoKCQkJLy8gbWFrZSBzdXJlIGNlbGxzIGFyZSBjcmVhdGVkCgoJCQkvLyBnZXQgdGhlIGNlbGxzIGluIHRoZSByYW5nZQoJCQkkYVJlZmVyZW5jZXMgPSBQSFBFeGNlbF9DZWxsOjpleHRyYWN0QWxsQ2VsbFJlZmVyZW5jZXNJblJhbmdlKCRwUmFuZ2UpOwoKCQkJLy8gY3JlYXRlIHVwcGVyIGxlZnQgY2VsbCBpZiBpdCBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0CgkJCSR1cHBlckxlZnQgPSAkYVJlZmVyZW5jZXNbMF07CgkJCWlmICghJHRoaXMtPmNlbGxFeGlzdHMoJHVwcGVyTGVmdCkpIHsKCQkJCSR0aGlzLT5nZXRDZWxsKCR1cHBlckxlZnQpLT5zZXRWYWx1ZUV4cGxpY2l0KG51bGwsIFBIUEV4Y2VsX0NlbGxfRGF0YVR5cGU6OlRZUEVfTlVMTCk7CgkJCX0KCgkJCS8vIGNyZWF0ZSBvciBibGFuayBvdXQgdGhlIHJlc3Qgb2YgdGhlIGNlbGxzIGluIHRoZSByYW5nZQoJCQkkY291bnQgPSBjb3VudCgkYVJlZmVyZW5jZXMpOwoJCQlmb3IgKCRpID0gMTsgJGkgPCAkY291bnQ7ICRpKyspIHsKCQkJCSR0aGlzLT5nZXRDZWxsKCRhUmVmZXJlbmNlc1skaV0pLT5zZXRWYWx1ZUV4cGxpY2l0KG51bGwsIFBIUEV4Y2VsX0NlbGxfRGF0YVR5cGU6OlRZUEVfTlVMTCk7CgkJCX0KCgkJfSBlbHNlIHsKCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbignTWVyZ2UgbXVzdCBiZSBzZXQgb24gYSByYW5nZSBvZiBjZWxscy4nKTsKCQl9CgoJCXJldHVybiAkdGhpczsKCX0KCgkvKioKCSAqIFNldCBtZXJnZSBvbiBhIGNlbGwgcmFuZ2UgYnkgdXNpbmcgbnVtZXJpYyBjZWxsIGNvb3JkaW5hdGVzCgkgKgoJICogQHBhcmFtCWludCAkcENvbHVtbjEJTnVtZXJpYyBjb2x1bW4gY29vcmRpbmF0ZSBvZiB0aGUgZmlyc3QgY2VsbAoJICogQHBhcmFtCWludCAkcFJvdzEJCU51bWVyaWMgcm93IGNvb3JkaW5hdGUgb2YgdGhlIGZpcnN0IGNlbGwKCSAqIEBwYXJhbQlpbnQgJHBDb2x1bW4yCU51bWVyaWMgY29sdW1uIGNvb3JkaW5hdGUgb2YgdGhlIGxhc3QgY2VsbAoJICogQHBhcmFtCWludCAkcFJvdzIJCU51bWVyaWMgcm93IGNvb3JkaW5hdGUgb2YgdGhlIGxhc3QgY2VsbAoJICogQHRocm93cwlFeGNlcHRpb24KCSAqIEByZXR1cm4gUEhQRXhjZWxfV29ya3NoZWV0CgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBtZXJnZUNlbGxzQnlDb2x1bW5BbmRSb3coJHBDb2x1bW4xID0gMCwgJHBSb3cxID0gMSwgJHBDb2x1bW4yID0gMCwgJHBSb3cyID0gMSkKCXsKCQkkY2VsbFJhbmdlID0gUEhQRXhjZWxfQ2VsbDo6c3RyaW5nRnJvbUNvbHVtbkluZGV4KCRwQ29sdW1uMSkgLiAkcFJvdzEgLiAnOicgLiBQSFBFeGNlbF9DZWxsOjpzdHJpbmdGcm9tQ29sdW1uSW5kZXgoJHBDb2x1bW4yKSAuICRwUm93MjsKCQlyZXR1cm4gJHRoaXMtPm1lcmdlQ2VsbHMoJGNlbGxSYW5nZSk7Cgl9CgoJLyoqCgkgKiBSZW1vdmUgbWVyZ2Ugb24gYSBjZWxsIHJhbmdlCgkgKgoJICogQHBhcmFtCXN0cmluZwkJCSRwUmFuZ2UJCUNlbGwgcmFuZ2UgKGUuZy4gQTE6RTEpCgkgKiBAdGhyb3dzCUV4Y2VwdGlvbgoJICogQHJldHVybiBQSFBFeGNlbF9Xb3Jrc2hlZXQKCSAqLwoJcHVibGljIGZ1bmN0aW9uIHVubWVyZ2VDZWxscygkcFJhbmdlID0gJ0ExOkExJykKCXsKCQkvLyBVcHBlcmNhc2UgY29vcmRpbmF0ZQoJCSRwUmFuZ2UgPSBzdHJ0b3VwcGVyKCRwUmFuZ2UpOwoKCQlpZiAoc3RycG9zKCRwUmFuZ2UsJzonKSAhPT0gZmFsc2UpIHsKCQkJaWYgKGlzc2V0KCR0aGlzLT5fbWVyZ2VDZWxsc1skcFJhbmdlXSkpIHsKCQkJCXVuc2V0KCR0aGlzLT5fbWVyZ2VDZWxsc1skcFJhbmdlXSk7CgkJCX0gZWxzZSB7CgkJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCdDZWxsIHJhbmdlICcgLiAkcFJhbmdlIC4gJyBub3Qga25vd24gYXMgbWVyZ2VkLicpOwoJCQl9CgkJfSBlbHNlIHsKCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbignTWVyZ2UgY2FuIG9ubHkgYmUgcmVtb3ZlZCBmcm9tIGEgcmFuZ2Ugb2YgY2VsbHMuJyk7CgkJfQoKCQlyZXR1cm4gJHRoaXM7Cgl9CgoJLyoqCgkgKiBSZW1vdmUgbWVyZ2Ugb24gYSBjZWxsIHJhbmdlIGJ5IHVzaW5nIG51bWVyaWMgY2VsbCBjb29yZGluYXRlcwoJICoKCSAqIEBwYXJhbQlpbnQgJHBDb2x1bW4xCU51bWVyaWMgY29sdW1uIGNvb3JkaW5hdGUgb2YgdGhlIGZpcnN0IGNlbGwKCSAqIEBwYXJhbQlpbnQgJHBSb3cxCQlOdW1lcmljIHJvdyBjb29yZGluYXRlIG9mIHRoZSBmaXJzdCBjZWxsCgkgKiBAcGFyYW0JaW50ICRwQ29sdW1uMglOdW1lcmljIGNvbHVtbiBjb29yZGluYXRlIG9mIHRoZSBsYXN0IGNlbGwKCSAqIEBwYXJhbQlpbnQgJHBSb3cyCQlOdW1lcmljIHJvdyBjb29yZGluYXRlIG9mIHRoZSBsYXN0IGNlbGwKCSAqIEB0aHJvd3MJRXhjZXB0aW9uCgkgKiBAcmV0dXJuIFBIUEV4Y2VsX1dvcmtzaGVldAoJICovCglwdWJsaWMgZnVuY3Rpb24gdW5tZXJnZUNlbGxzQnlDb2x1bW5BbmRSb3coJHBDb2x1bW4xID0gMCwgJHBSb3cxID0gMSwgJHBDb2x1bW4yID0gMCwgJHBSb3cyID0gMSkKCXsKCQkkY2VsbFJhbmdlID0gUEhQRXhjZWxfQ2VsbDo6c3RyaW5nRnJvbUNvbHVtbkluZGV4KCRwQ29sdW1uMSkgLiAkcFJvdzEgLiAnOicgLiBQSFBFeGNlbF9DZWxsOjpzdHJpbmdGcm9tQ29sdW1uSW5kZXgoJHBDb2x1bW4yKSAuICRwUm93MjsKCQlyZXR1cm4gJHRoaXMtPnVubWVyZ2VDZWxscygkY2VsbFJhbmdlKTsKCX0KCgkvKioKCSAqIEdldCBtZXJnZSBjZWxscyBhcnJheS4KCSAqCgkgKiBAcmV0dXJuIGFycmF5W10KCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldE1lcmdlQ2VsbHMoKQoJewoJCXJldHVybiAkdGhpcy0+X21lcmdlQ2VsbHM7Cgl9CgoJLyoqCgkgKiBTZXQgbWVyZ2UgY2VsbHMgYXJyYXkgZm9yIHRoZSBlbnRpcmUgc2hlZXQuIFVzZSBpbnN0ZWFkIG1lcmdlQ2VsbHMoKSB0byBtZXJnZQoJICogYSBzaW5nbGUgY2VsbCByYW5nZS4KCSAqCgkgKiBAcGFyYW0gYXJyYXkKCSAqLwoJcHVibGljIGZ1bmN0aW9uIHNldE1lcmdlQ2VsbHMoJHBWYWx1ZSA9IGFycmF5KCkpCgl7CgkJJHRoaXMtPl9tZXJnZUNlbGxzID0gJHBWYWx1ZTsKCgkJcmV0dXJuICR0aGlzOwoJfQoKCS8qKgoJICogU2V0IHByb3RlY3Rpb24gb24gYSBjZWxsIHJhbmdlCgkgKgoJICogQHBhcmFtCXN0cmluZwkJCSRwUmFuZ2UJCQkJQ2VsbCAoZS5nLiBBMSkgb3IgY2VsbCByYW5nZSAoZS5nLiBBMTpFMSkKCSAqIEBwYXJhbQlzdHJpbmcJCQkkcFBhc3N3b3JkCQkJUGFzc3dvcmQgdG8gdW5sb2NrIHRoZSBwcm90ZWN0aW9uCgkgKiBAcGFyYW0JYm9vbGVhbgkJJHBBbHJlYWR5SGFzaGVkCUlmIHRoZSBwYXNzd29yZCBoYXMgYWxyZWFkeSBiZWVuIGhhc2hlZCwgc2V0IHRoaXMgdG8gdHJ1ZQoJICogQHRocm93cwlFeGNlcHRpb24KCSAqIEByZXR1cm4gUEhQRXhjZWxfV29ya3NoZWV0CgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBwcm90ZWN0Q2VsbHMoJHBSYW5nZSA9ICdBMScsICRwUGFzc3dvcmQgPSAnJywgJHBBbHJlYWR5SGFzaGVkID0gZmFsc2UpCgl7CgkJLy8gVXBwZXJjYXNlIGNvb3JkaW5hdGUKCQkkcFJhbmdlID0gc3RydG91cHBlcigkcFJhbmdlKTsKCgkJaWYgKCEkcEFscmVhZHlIYXNoZWQpIHsKCQkJJHBQYXNzd29yZCA9IFBIUEV4Y2VsX1NoYXJlZF9QYXNzd29yZEhhc2hlcjo6aGFzaFBhc3N3b3JkKCRwUGFzc3dvcmQpOwoJCX0KCQkkdGhpcy0+X3Byb3RlY3RlZENlbGxzWyRwUmFuZ2VdID0gJHBQYXNzd29yZDsKCgkJcmV0dXJuICR0aGlzOwoJfQoKCS8qKgoJICogU2V0IHByb3RlY3Rpb24gb24gYSBjZWxsIHJhbmdlIGJ5IHVzaW5nIG51bWVyaWMgY2VsbCBjb29yZGluYXRlcwoJICoKCSAqIEBwYXJhbQlpbnQJJHBDb2x1bW4xCQkJTnVtZXJpYyBjb2x1bW4gY29vcmRpbmF0ZSBvZiB0aGUgZmlyc3QgY2VsbAoJICogQHBhcmFtCWludAkkcFJvdzEJCQkJTnVtZXJpYyByb3cgY29vcmRpbmF0ZSBvZiB0aGUgZmlyc3QgY2VsbAoJICogQHBhcmFtCWludAkkcENvbHVtbjIJCQlOdW1lcmljIGNvbHVtbiBjb29yZGluYXRlIG9mIHRoZSBsYXN0IGNlbGwKCSAqIEBwYXJhbQlpbnQJJHBSb3cyCQkJCU51bWVyaWMgcm93IGNvb3JkaW5hdGUgb2YgdGhlIGxhc3QgY2VsbAoJICogQHBhcmFtCXN0cmluZwkkcFBhc3N3b3JkCQkJUGFzc3dvcmQgdG8gdW5sb2NrIHRoZSBwcm90ZWN0aW9uCgkgKiBAcGFyYW0JYm9vbGVhbiAkcEFscmVhZHlIYXNoZWQJSWYgdGhlIHBhc3N3b3JkIGhhcyBhbHJlYWR5IGJlZW4gaGFzaGVkLCBzZXQgdGhpcyB0byB0cnVlCgkgKiBAdGhyb3dzCUV4Y2VwdGlvbgoJICogQHJldHVybiBQSFBFeGNlbF9Xb3Jrc2hlZXQKCSAqLwoJcHVibGljIGZ1bmN0aW9uIHByb3RlY3RDZWxsc0J5Q29sdW1uQW5kUm93KCRwQ29sdW1uMSA9IDAsICRwUm93MSA9IDEsICRwQ29sdW1uMiA9IDAsICRwUm93MiA9IDEsICRwUGFzc3dvcmQgPSAnJywgJHBBbHJlYWR5SGFzaGVkID0gZmFsc2UpCgl7CgkJJGNlbGxSYW5nZSA9IFBIUEV4Y2VsX0NlbGw6OnN0cmluZ0Zyb21Db2x1bW5JbmRleCgkcENvbHVtbjEpIC4gJHBSb3cxIC4gJzonIC4gUEhQRXhjZWxfQ2VsbDo6c3RyaW5nRnJvbUNvbHVtbkluZGV4KCRwQ29sdW1uMikgLiAkcFJvdzI7CgkJcmV0dXJuICR0aGlzLT5wcm90ZWN0Q2VsbHMoJGNlbGxSYW5nZSwgJHBQYXNzd29yZCwgJHBBbHJlYWR5SGFzaGVkKTsKCX0KCgkvKioKCSAqIFJlbW92ZSBwcm90ZWN0aW9uIG9uIGEgY2VsbCByYW5nZQoJICoKCSAqIEBwYXJhbQlzdHJpbmcJCQkkcFJhbmdlCQlDZWxsIChlLmcuIEExKSBvciBjZWxsIHJhbmdlIChlLmcuIEExOkUxKQoJICogQHRocm93cwlFeGNlcHRpb24KCSAqIEByZXR1cm4gUEhQRXhjZWxfV29ya3NoZWV0CgkgKi8KCXB1YmxpYyBmdW5jdGlvbiB1bnByb3RlY3RDZWxscygkcFJhbmdlID0gJ0ExJykKCXsKCQkvLyBVcHBlcmNhc2UgY29vcmRpbmF0ZQoJCSRwUmFuZ2UgPSBzdHJ0b3VwcGVyKCRwUmFuZ2UpOwoKCQlpZiAoaXNzZXQoJHRoaXMtPl9wcm90ZWN0ZWRDZWxsc1skcFJhbmdlXSkpIHsKCQkJdW5zZXQoJHRoaXMtPl9wcm90ZWN0ZWRDZWxsc1skcFJhbmdlXSk7CgkJfSBlbHNlIHsKCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbignQ2VsbCByYW5nZSAnIC4gJHBSYW5nZSAuICcgbm90IGtub3duIGFzIHByb3RlY3RlZC4nKTsKCQl9CgkJcmV0dXJuICR0aGlzOwoJfQoKCS8qKgoJICogUmVtb3ZlIHByb3RlY3Rpb24gb24gYSBjZWxsIHJhbmdlIGJ5IHVzaW5nIG51bWVyaWMgY2VsbCBjb29yZGluYXRlcwoJICoKCSAqIEBwYXJhbQlpbnQJJHBDb2x1bW4xCQkJTnVtZXJpYyBjb2x1bW4gY29vcmRpbmF0ZSBvZiB0aGUgZmlyc3QgY2VsbAoJICogQHBhcmFtCWludAkkcFJvdzEJCQkJTnVtZXJpYyByb3cgY29vcmRpbmF0ZSBvZiB0aGUgZmlyc3QgY2VsbAoJICogQHBhcmFtCWludAkkcENvbHVtbjIJCQlOdW1lcmljIGNvbHVtbiBjb29yZGluYXRlIG9mIHRoZSBsYXN0IGNlbGwKCSAqIEBwYXJhbQlpbnQJJHBSb3cyCQkJCU51bWVyaWMgcm93IGNvb3JkaW5hdGUgb2YgdGhlIGxhc3QgY2VsbAoJICogQHBhcmFtCXN0cmluZwkkcFBhc3N3b3JkCQkJUGFzc3dvcmQgdG8gdW5sb2NrIHRoZSBwcm90ZWN0aW9uCgkgKiBAcGFyYW0JYm9vbGVhbiAkcEFscmVhZHlIYXNoZWQJSWYgdGhlIHBhc3N3b3JkIGhhcyBhbHJlYWR5IGJlZW4gaGFzaGVkLCBzZXQgdGhpcyB0byB0cnVlCgkgKiBAdGhyb3dzCUV4Y2VwdGlvbgoJICogQHJldHVybiBQSFBFeGNlbF9Xb3Jrc2hlZXQKCSAqLwoJcHVibGljIGZ1bmN0aW9uIHVucHJvdGVjdENlbGxzQnlDb2x1bW5BbmRSb3coJHBDb2x1bW4xID0gMCwgJHBSb3cxID0gMSwgJHBDb2x1bW4yID0gMCwgJHBSb3cyID0gMSwgJHBQYXNzd29yZCA9ICcnLCAkcEFscmVhZHlIYXNoZWQgPSBmYWxzZSkKCXsKCQkkY2VsbFJhbmdlID0gUEhQRXhjZWxfQ2VsbDo6c3RyaW5nRnJvbUNvbHVtbkluZGV4KCRwQ29sdW1uMSkgLiAkcFJvdzEgLiAnOicgLiBQSFBFeGNlbF9DZWxsOjpzdHJpbmdGcm9tQ29sdW1uSW5kZXgoJHBDb2x1bW4yKSAuICRwUm93MjsKCQlyZXR1cm4gJHRoaXMtPnVucHJvdGVjdENlbGxzKCRjZWxsUmFuZ2UsICRwUGFzc3dvcmQsICRwQWxyZWFkeUhhc2hlZCk7Cgl9CgoJLyoqCgkgKiBHZXQgcHJvdGVjdGVkIGNlbGxzCgkgKgoJICogQHJldHVybiBhcnJheVtdCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRQcm90ZWN0ZWRDZWxscygpCgl7CgkJcmV0dXJuICR0aGlzLT5fcHJvdGVjdGVkQ2VsbHM7Cgl9CgoJLyoqCgkgKiBHZXQgQXV0b2ZpbHRlciBSYW5nZQoJICoKCSAqIEByZXR1cm4gc3RyaW5nCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRBdXRvRmlsdGVyKCkKCXsKCQlyZXR1cm4gJHRoaXMtPl9hdXRvRmlsdGVyOwoJfQoKCS8qKgoJICogU2V0IEF1dG9maWx0ZXIgUmFuZ2UKCSAqCgkgKiBAcGFyYW0Jc3RyaW5nCQkkcFJhbmdlCQlDZWxsIHJhbmdlIChpLmUuIEExOkUxMCkKCSAqIEB0aHJvd3MJRXhjZXB0aW9uCgkgKiBAcmV0dXJuIFBIUEV4Y2VsX1dvcmtzaGVldAoJICovCglwdWJsaWMgZnVuY3Rpb24gc2V0QXV0b0ZpbHRlcigkcFJhbmdlID0gJycpCgl7CgkJLy8gVXBwZXJjYXNlIGNvb3JkaW5hdGUKCQkkcFJhbmdlID0gc3RydG91cHBlcigkcFJhbmdlKTsKCgkJaWYgKHN0cnBvcygkcFJhbmdlLCc6JykgIT09IGZhbHNlKSB7CgkJCSR0aGlzLT5fYXV0b0ZpbHRlciA9ICRwUmFuZ2U7CgkJCSR0aGlzLT5fZGlydHkgPSB0cnVlOwoJCX0gZWxzZSB7CgkJCXRocm93IG5ldyBFeGNlcHRpb24oJ0F1dG9maWx0ZXIgbXVzdCBiZSBzZXQgb24gYSByYW5nZSBvZiBjZWxscy4nKTsKCQl9CgkJcmV0dXJuICR0aGlzOwoJfQoKCS8qKgoJICogU2V0IEF1dG9maWx0ZXIgUmFuZ2UgYnkgdXNpbmcgbnVtZXJpYyBjZWxsIGNvb3JkaW5hdGVzCgkgKgoJICogQHBhcmFtCWludAkkcENvbHVtbjEJTnVtZXJpYyBjb2x1bW4gY29vcmRpbmF0ZSBvZiB0aGUgZmlyc3QgY2VsbAoJICogQHBhcmFtCWludAkkcFJvdzEJCU51bWVyaWMgcm93IGNvb3JkaW5hdGUgb2YgdGhlIGZpcnN0IGNlbGwKCSAqIEBwYXJhbQlpbnQJJHBDb2x1bW4yCU51bWVyaWMgY29sdW1uIGNvb3JkaW5hdGUgb2YgdGhlIHNlY29uZCBjZWxsCgkgKiBAcGFyYW0JaW50CSRwUm93MgkJTnVtZXJpYyByb3cgY29vcmRpbmF0ZSBvZiB0aGUgc2Vjb25kIGNlbGwKCSAqIEB0aHJvd3MJRXhjZXB0aW9uCgkgKiBAcmV0dXJuIFBIUEV4Y2VsX1dvcmtzaGVldAoJICovCglwdWJsaWMgZnVuY3Rpb24gc2V0QXV0b0ZpbHRlckJ5Q29sdW1uQW5kUm93KCRwQ29sdW1uMSA9IDAsICRwUm93MSA9IDEsICRwQ29sdW1uMiA9IDAsICRwUm93MiA9IDEpCgl7CgkJcmV0dXJuICR0aGlzLT5zZXRBdXRvRmlsdGVyKAoJCQlQSFBFeGNlbF9DZWxsOjpzdHJpbmdGcm9tQ29sdW1uSW5kZXgoJHBDb2x1bW4xKSAuICRwUm93MQoJCQkuICc6JyAuCgkJCVBIUEV4Y2VsX0NlbGw6OnN0cmluZ0Zyb21Db2x1bW5JbmRleCgkcENvbHVtbjIpIC4gJHBSb3cyCgkJKTsKCX0KCiAgICAvKioKICAgICAqIFJlbW92ZSBhdXRvZmlsdGVyCiAgICAgKgogICAgICogQHJldHVybiBQSFBFeGNlbF9Xb3Jrc2hlZXQKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHJlbW92ZUF1dG9GaWx0ZXIoKQogICAgewogICAgCSR0aGlzLT5fYXV0b0ZpbHRlciA9ICcnOwogICAgCXJldHVybiAkdGhpczsKICAgIH0KCgkvKioKCSAqIEdldCBGcmVlemUgUGFuZQoJICoKCSAqIEByZXR1cm4gc3RyaW5nCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRGcmVlemVQYW5lKCkKCXsKCQlyZXR1cm4gJHRoaXMtPl9mcmVlemVQYW5lOwoJfQoKCS8qKgoJICogRnJlZXplIFBhbmUKCSAqCgkgKiBAcGFyYW0Jc3RyaW5nCQkkcENlbGwJCUNlbGwgKGkuZS4gQTEpCgkgKiBAdGhyb3dzCUV4Y2VwdGlvbgoJICogQHJldHVybiBQSFBFeGNlbF9Xb3Jrc2hlZXQKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGZyZWV6ZVBhbmUoJHBDZWxsID0gJycpCgl7CgkJLy8gVXBwZXJjYXNlIGNvb3JkaW5hdGUKCQkkcENlbGwgPSBzdHJ0b3VwcGVyKCRwQ2VsbCk7CgoJCWlmIChzdHJwb3MoJHBDZWxsLCc6JykgPT09IGZhbHNlICYmIHN0cnBvcygkcENlbGwsJywnKSA9PT0gZmFsc2UpIHsKCQkJJHRoaXMtPl9mcmVlemVQYW5lID0gJHBDZWxsOwoJCX0gZWxzZSB7CgkJCXRocm93IG5ldyBFeGNlcHRpb24oJ0ZyZWV6ZSBwYW5lIGNhbiBub3QgYmUgc2V0IG9uIGEgcmFuZ2Ugb2YgY2VsbHMuJyk7CgkJfQoJCXJldHVybiAkdGhpczsKCX0KCgkvKioKCSAqIEZyZWV6ZSBQYW5lIGJ5IHVzaW5nIG51bWVyaWMgY2VsbCBjb29yZGluYXRlcwoJICoKCSAqIEBwYXJhbQlpbnQJJHBDb2x1bW4JTnVtZXJpYyBjb2x1bW4gY29vcmRpbmF0ZSBvZiB0aGUgY2VsbAoJICogQHBhcmFtCWludAkkcFJvdwkJTnVtZXJpYyByb3cgY29vcmRpbmF0ZSBvZiB0aGUgY2VsbAoJICogQHRocm93cwlFeGNlcHRpb24KCSAqIEByZXR1cm4gUEhQRXhjZWxfV29ya3NoZWV0CgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBmcmVlemVQYW5lQnlDb2x1bW5BbmRSb3coJHBDb2x1bW4gPSAwLCAkcFJvdyA9IDEpCgl7CgkJcmV0dXJuICR0aGlzLT5mcmVlemVQYW5lKFBIUEV4Y2VsX0NlbGw6OnN0cmluZ0Zyb21Db2x1bW5JbmRleCgkcENvbHVtbikgLiAkcFJvdyk7Cgl9CgoJLyoqCgkgKiBVbmZyZWV6ZSBQYW5lCgkgKgoJICogQHJldHVybiBQSFBFeGNlbF9Xb3Jrc2hlZXQKCSAqLwoJcHVibGljIGZ1bmN0aW9uIHVuZnJlZXplUGFuZSgpCgl7CgkJcmV0dXJuICR0aGlzLT5mcmVlemVQYW5lKCcnKTsKCX0KCgkvKioKCSAqIEluc2VydCBhIG5ldyByb3csIHVwZGF0aW5nIGFsbCBwb3NzaWJsZSByZWxhdGVkIGRhdGEKCSAqCgkgKiBAcGFyYW0JaW50CSRwQmVmb3JlCUluc2VydCBiZWZvcmUgdGhpcyBvbmUKCSAqIEBwYXJhbQlpbnQJJHBOdW1Sb3dzCU51bWJlciBvZiByb3dzIHRvIGluc2VydAoJICogQHRocm93cwlFeGNlcHRpb24KCSAqIEByZXR1cm4gUEhQRXhjZWxfV29ya3NoZWV0CgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBpbnNlcnROZXdSb3dCZWZvcmUoJHBCZWZvcmUgPSAxLCAkcE51bVJvd3MgPSAxKSB7CgkJaWYgKCRwQmVmb3JlID49IDEpIHsKCQkJJG9ialJlZmVyZW5jZUhlbHBlciA9IFBIUEV4Y2VsX1JlZmVyZW5jZUhlbHBlcjo6Z2V0SW5zdGFuY2UoKTsKCQkJJG9ialJlZmVyZW5jZUhlbHBlci0+aW5zZXJ0TmV3QmVmb3JlKCdBJyAuICRwQmVmb3JlLCAwLCAkcE51bVJvd3MsICR0aGlzKTsKCQl9IGVsc2UgewoJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCJSb3dzIGNhbiBvbmx5IGJlIGluc2VydGVkIGJlZm9yZSBhdCBsZWFzdCByb3cgMS4iKTsKCQl9CgkJcmV0dXJuICR0aGlzOwoJfQoKCS8qKgoJICogSW5zZXJ0IGEgbmV3IGNvbHVtbiwgdXBkYXRpbmcgYWxsIHBvc3NpYmxlIHJlbGF0ZWQgZGF0YQoJICoKCSAqIEBwYXJhbQlpbnQJJHBCZWZvcmUJSW5zZXJ0IGJlZm9yZSB0aGlzIG9uZQoJICogQHBhcmFtCWludAkkcE51bUNvbHMJTnVtYmVyIG9mIGNvbHVtbnMgdG8gaW5zZXJ0CgkgKiBAdGhyb3dzCUV4Y2VwdGlvbgoJICogQHJldHVybiBQSFBFeGNlbF9Xb3Jrc2hlZXQKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGluc2VydE5ld0NvbHVtbkJlZm9yZSgkcEJlZm9yZSA9ICdBJywgJHBOdW1Db2xzID0gMSkgewoJCWlmICghaXNfbnVtZXJpYygkcEJlZm9yZSkpIHsKCQkJJG9ialJlZmVyZW5jZUhlbHBlciA9IFBIUEV4Y2VsX1JlZmVyZW5jZUhlbHBlcjo6Z2V0SW5zdGFuY2UoKTsKCQkJJG9ialJlZmVyZW5jZUhlbHBlci0+aW5zZXJ0TmV3QmVmb3JlKCRwQmVmb3JlIC4gJzEnLCAkcE51bUNvbHMsIDAsICR0aGlzKTsKCQl9IGVsc2UgewoJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCJDb2x1bW4gcmVmZXJlbmNlcyBzaG91bGQgbm90IGJlIG51bWVyaWMuIik7CgkJfQoJCXJldHVybiAkdGhpczsKCX0KCgkvKioKCSAqIEluc2VydCBhIG5ldyBjb2x1bW4sIHVwZGF0aW5nIGFsbCBwb3NzaWJsZSByZWxhdGVkIGRhdGEKCSAqCgkgKiBAcGFyYW0JaW50CSRwQmVmb3JlCUluc2VydCBiZWZvcmUgdGhpcyBvbmUgKG51bWVyaWMgY29sdW1uIGNvb3JkaW5hdGUgb2YgdGhlIGNlbGwpCgkgKiBAcGFyYW0JaW50CSRwTnVtQ29scwlOdW1iZXIgb2YgY29sdW1ucyB0byBpbnNlcnQKCSAqIEB0aHJvd3MJRXhjZXB0aW9uCgkgKiBAcmV0dXJuIFBIUEV4Y2VsX1dvcmtzaGVldAoJICovCglwdWJsaWMgZnVuY3Rpb24gaW5zZXJ0TmV3Q29sdW1uQmVmb3JlQnlJbmRleCgkcEJlZm9yZSA9IDAsICRwTnVtQ29scyA9IDEpIHsKCQlpZiAoJHBCZWZvcmUgPj0gMCkgewoJCQlyZXR1cm4gJHRoaXMtPmluc2VydE5ld0NvbHVtbkJlZm9yZShQSFBFeGNlbF9DZWxsOjpzdHJpbmdGcm9tQ29sdW1uSW5kZXgoJHBCZWZvcmUpLCAkcE51bUNvbHMpOwoJCX0gZWxzZSB7CgkJCXRocm93IG5ldyBFeGNlcHRpb24oIkNvbHVtbnMgY2FuIG9ubHkgYmUgaW5zZXJ0ZWQgYmVmb3JlIGF0IGxlYXN0IGNvbHVtbiBBICgwKS4iKTsKCQl9Cgl9CgoJLyoqCgkgKiBEZWxldGUgYSByb3csIHVwZGF0aW5nIGFsbCBwb3NzaWJsZSByZWxhdGVkIGRhdGEKCSAqCgkgKiBAcGFyYW0JaW50CSRwUm93CQlSZW1vdmUgc3RhcnRpbmcgd2l0aCB0aGlzIG9uZQoJICogQHBhcmFtCWludAkkcE51bVJvd3MJTnVtYmVyIG9mIHJvd3MgdG8gcmVtb3ZlCgkgKiBAdGhyb3dzCUV4Y2VwdGlvbgoJICogQHJldHVybiBQSFBFeGNlbF9Xb3Jrc2hlZXQKCSAqLwoJcHVibGljIGZ1bmN0aW9uIHJlbW92ZVJvdygkcFJvdyA9IDEsICRwTnVtUm93cyA9IDEpIHsKCQlpZiAoJHBSb3cgPj0gMSkgewoJCQkkb2JqUmVmZXJlbmNlSGVscGVyID0gUEhQRXhjZWxfUmVmZXJlbmNlSGVscGVyOjpnZXRJbnN0YW5jZSgpOwoJCQkkb2JqUmVmZXJlbmNlSGVscGVyLT5pbnNlcnROZXdCZWZvcmUoJ0EnIC4gKCRwUm93ICsgJHBOdW1Sb3dzKSwgMCwgLSRwTnVtUm93cywgJHRoaXMpOwoJCX0gZWxzZSB7CgkJCXRocm93IG5ldyBFeGNlcHRpb24oIlJvd3MgdG8gYmUgZGVsZXRlZCBzaG91bGQgYXQgbGVhc3Qgc3RhcnQgZnJvbSByb3cgMS4iKTsKCQl9CgkJcmV0dXJuICR0aGlzOwoJfQoKCS8qKgoJICogUmVtb3ZlIGEgY29sdW1uLCB1cGRhdGluZyBhbGwgcG9zc2libGUgcmVsYXRlZCBkYXRhCgkgKgoJICogQHBhcmFtCWludAkkcENvbHVtbglSZW1vdmUgc3RhcnRpbmcgd2l0aCB0aGlzIG9uZQoJICogQHBhcmFtCWludAkkcE51bUNvbHMJTnVtYmVyIG9mIGNvbHVtbnMgdG8gcmVtb3ZlCgkgKiBAdGhyb3dzCUV4Y2VwdGlvbgoJICogQHJldHVybiBQSFBFeGNlbF9Xb3Jrc2hlZXQKCSAqLwoJcHVibGljIGZ1bmN0aW9uIHJlbW92ZUNvbHVtbigkcENvbHVtbiA9ICdBJywgJHBOdW1Db2xzID0gMSkgewoJCWlmICghaXNfbnVtZXJpYygkcENvbHVtbikpIHsKCQkJJHBDb2x1bW4gPSBQSFBFeGNlbF9DZWxsOjpzdHJpbmdGcm9tQ29sdW1uSW5kZXgoUEhQRXhjZWxfQ2VsbDo6Y29sdW1uSW5kZXhGcm9tU3RyaW5nKCRwQ29sdW1uKSAtIDEgKyAkcE51bUNvbHMpOwoJCQkkb2JqUmVmZXJlbmNlSGVscGVyID0gUEhQRXhjZWxfUmVmZXJlbmNlSGVscGVyOjpnZXRJbnN0YW5jZSgpOwoJCQkkb2JqUmVmZXJlbmNlSGVscGVyLT5pbnNlcnROZXdCZWZvcmUoJHBDb2x1bW4gLiAnMScsIC0kcE51bUNvbHMsIDAsICR0aGlzKTsKCQl9IGVsc2UgewoJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCJDb2x1bW4gcmVmZXJlbmNlcyBzaG91bGQgbm90IGJlIG51bWVyaWMuIik7CgkJfQoJCXJldHVybiAkdGhpczsKCX0KCgkvKioKCSAqIFJlbW92ZSBhIGNvbHVtbiwgdXBkYXRpbmcgYWxsIHBvc3NpYmxlIHJlbGF0ZWQgZGF0YQoJICoKCSAqIEBwYXJhbQlpbnQJJHBDb2x1bW4JUmVtb3ZlIHN0YXJ0aW5nIHdpdGggdGhpcyBvbmUgKG51bWVyaWMgY29sdW1uIGNvb3JkaW5hdGUgb2YgdGhlIGNlbGwpCgkgKiBAcGFyYW0JaW50CSRwTnVtQ29scwlOdW1iZXIgb2YgY29sdW1ucyB0byByZW1vdmUKCSAqIEB0aHJvd3MJRXhjZXB0aW9uCgkgKiBAcmV0dXJuIFBIUEV4Y2VsX1dvcmtzaGVldAoJICovCglwdWJsaWMgZnVuY3Rpb24gcmVtb3ZlQ29sdW1uQnlJbmRleCgkcENvbHVtbiA9IDAsICRwTnVtQ29scyA9IDEpIHsKCQlpZiAoJHBDb2x1bW4gPj0gMCkgewoJCQlyZXR1cm4gJHRoaXMtPnJlbW92ZUNvbHVtbihQSFBFeGNlbF9DZWxsOjpzdHJpbmdGcm9tQ29sdW1uSW5kZXgoJHBDb2x1bW4pLCAkcE51bUNvbHMpOwoJCX0gZWxzZSB7CgkJCXRocm93IG5ldyBFeGNlcHRpb24oIkNvbHVtbnMgdG8gYmUgZGVsZXRlZCBzaG91bGQgYXQgbGVhc3Qgc3RhcnQgZnJvbSBjb2x1bW4gMCIpOwoJCX0KCX0KCgkvKioKCSAqIFNob3cgZ3JpZGxpbmVzPwoJICoKCSAqIEByZXR1cm4gYm9vbGVhbgoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0U2hvd0dyaWRsaW5lcygpIHsKCQlyZXR1cm4gJHRoaXMtPl9zaG93R3JpZGxpbmVzOwoJfQoKCS8qKgoJICogU2V0IHNob3cgZ3JpZGxpbmVzCgkgKgoJICogQHBhcmFtIGJvb2xlYW4gJHBWYWx1ZQlTaG93IGdyaWRsaW5lcyAodHJ1ZS9mYWxzZSkKCSAqIEByZXR1cm4gUEhQRXhjZWxfV29ya3NoZWV0CgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBzZXRTaG93R3JpZGxpbmVzKCRwVmFsdWUgPSBmYWxzZSkgewoJCSR0aGlzLT5fc2hvd0dyaWRsaW5lcyA9ICRwVmFsdWU7CgkJcmV0dXJuICR0aGlzOwoJfQoKCS8qKgoJKiBQcmludCBncmlkbGluZXM/CgkqCgkqIEByZXR1cm4gYm9vbGVhbgoJKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRQcmludEdyaWRsaW5lcygpIHsKCQlyZXR1cm4gJHRoaXMtPl9wcmludEdyaWRsaW5lczsKCX0KCgkvKioKCSogU2V0IHByaW50IGdyaWRsaW5lcwoJKgoJKiBAcGFyYW0gYm9vbGVhbiAkcFZhbHVlIFByaW50IGdyaWRsaW5lcyAodHJ1ZS9mYWxzZSkKCSogQHJldHVybiBQSFBFeGNlbF9Xb3Jrc2hlZXQKCSovCglwdWJsaWMgZnVuY3Rpb24gc2V0UHJpbnRHcmlkbGluZXMoJHBWYWx1ZSA9IGZhbHNlKSB7CgkJJHRoaXMtPl9wcmludEdyaWRsaW5lcyA9ICRwVmFsdWU7CgkJcmV0dXJuICR0aGlzOwoJfQoKCS8qKgoJKiBTaG93IHJvdyBhbmQgY29sdW1uIGhlYWRlcnM/CgkqCgkqIEByZXR1cm4gYm9vbGVhbgoJKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRTaG93Um93Q29sSGVhZGVycygpIHsKCQlyZXR1cm4gJHRoaXMtPl9zaG93Um93Q29sSGVhZGVyczsKCX0KCgkvKioKCSogU2V0IHNob3cgcm93IGFuZCBjb2x1bW4gaGVhZGVycwoJKgoJKiBAcGFyYW0gYm9vbGVhbiAkcFZhbHVlIFNob3cgcm93IGFuZCBjb2x1bW4gaGVhZGVycyAodHJ1ZS9mYWxzZSkKCSogQHJldHVybiBQSFBFeGNlbF9Xb3Jrc2hlZXQKCSovCglwdWJsaWMgZnVuY3Rpb24gc2V0U2hvd1Jvd0NvbEhlYWRlcnMoJHBWYWx1ZSA9IGZhbHNlKSB7CgkJJHRoaXMtPl9zaG93Um93Q29sSGVhZGVycyA9ICRwVmFsdWU7CgkJcmV0dXJuICR0aGlzOwoJfQoKCS8qKgoJICogU2hvdyBzdW1tYXJ5IGJlbG93PyAoUm93L0NvbHVtbiBvdXRsaW5pbmcpCgkgKgoJICogQHJldHVybiBib29sZWFuCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRTaG93U3VtbWFyeUJlbG93KCkgewoJCXJldHVybiAkdGhpcy0+X3Nob3dTdW1tYXJ5QmVsb3c7Cgl9CgoJLyoqCgkgKiBTZXQgc2hvdyBzdW1tYXJ5IGJlbG93CgkgKgoJICogQHBhcmFtIGJvb2xlYW4gJHBWYWx1ZQlTaG93IHN1bW1hcnkgYmVsb3cgKHRydWUvZmFsc2UpCgkgKiBAcmV0dXJuIFBIUEV4Y2VsX1dvcmtzaGVldAoJICovCglwdWJsaWMgZnVuY3Rpb24gc2V0U2hvd1N1bW1hcnlCZWxvdygkcFZhbHVlID0gdHJ1ZSkgewoJCSR0aGlzLT5fc2hvd1N1bW1hcnlCZWxvdyA9ICRwVmFsdWU7CgkJcmV0dXJuICR0aGlzOwoJfQoKCS8qKgoJICogU2hvdyBzdW1tYXJ5IHJpZ2h0PyAoUm93L0NvbHVtbiBvdXRsaW5pbmcpCgkgKgoJICogQHJldHVybiBib29sZWFuCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRTaG93U3VtbWFyeVJpZ2h0KCkgewoJCXJldHVybiAkdGhpcy0+X3Nob3dTdW1tYXJ5UmlnaHQ7Cgl9CgoJLyoqCgkgKiBTZXQgc2hvdyBzdW1tYXJ5IHJpZ2h0CgkgKgoJICogQHBhcmFtIGJvb2xlYW4gJHBWYWx1ZQlTaG93IHN1bW1hcnkgcmlnaHQgKHRydWUvZmFsc2UpCgkgKiBAcmV0dXJuIFBIUEV4Y2VsX1dvcmtzaGVldAoJICovCglwdWJsaWMgZnVuY3Rpb24gc2V0U2hvd1N1bW1hcnlSaWdodCgkcFZhbHVlID0gdHJ1ZSkgewoJCSR0aGlzLT5fc2hvd1N1bW1hcnlSaWdodCA9ICRwVmFsdWU7CgkJcmV0dXJuICR0aGlzOwoJfQoKCS8qKgoJICogR2V0IGNvbW1lbnRzCgkgKgoJICogQHJldHVybiBQSFBFeGNlbF9Db21tZW50W10KCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldENvbW1lbnRzKCkKCXsKCQlyZXR1cm4gJHRoaXMtPl9jb21tZW50czsKCX0KCgkvKioKCSAqIFNldCBjb21tZW50cyBhcnJheSBmb3IgdGhlIGVudGlyZSBzaGVldC4KCSAqCgkgKiBAcGFyYW0gYXJyYXkgb2YgUEhQRXhjZWxfQ29tbWVudAoJICogQHJldHVybiBQSFBFeGNlbF9Xb3Jrc2hlZXQKCSAqLwoJcHVibGljIGZ1bmN0aW9uIHNldENvbW1lbnRzKCRwVmFsdWUgPSBhcnJheSgpKQoJewoJCSR0aGlzLT5fY29tbWVudHMgPSAkcFZhbHVlOwoKCQlyZXR1cm4gJHRoaXM7Cgl9CgoJLyoqCgkgKiBHZXQgY29tbWVudCBmb3IgY2VsbAoJICoKCSAqIEBwYXJhbQlzdHJpbmcJJHBDZWxsQ29vcmRpbmF0ZQlDZWxsIGNvb3JkaW5hdGUgdG8gZ2V0IGNvbW1lbnQgZm9yCgkgKiBAcmV0dXJuCVBIUEV4Y2VsX0NvbW1lbnQKCSAqIEB0aHJvd3MJRXhjZXB0aW9uCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRDb21tZW50KCRwQ2VsbENvb3JkaW5hdGUgPSAnQTEnKQoJewoJCS8vIFVwcGVyY2FzZSBjb29yZGluYXRlCgkJJHBDZWxsQ29vcmRpbmF0ZSA9IHN0cnRvdXBwZXIoJHBDZWxsQ29vcmRpbmF0ZSk7CgoJCWlmIChzdHJwb3MoJHBDZWxsQ29vcmRpbmF0ZSwnOicpICE9PSBmYWxzZSB8fCBzdHJwb3MoJHBDZWxsQ29vcmRpbmF0ZSwnLCcpICE9PSBmYWxzZSkgewoJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCdDZWxsIGNvb3JkaW5hdGUgc3RyaW5nIGNhbiBub3QgYmUgYSByYW5nZSBvZiBjZWxscy4nKTsKCQl9IGVsc2UgaWYgKHN0cnBvcygkcENlbGxDb29yZGluYXRlLCckJykgIT09IGZhbHNlKSB7CgkJCXRocm93IG5ldyBFeGNlcHRpb24oJ0NlbGwgY29vcmRpbmF0ZSBzdHJpbmcgbXVzdCBub3QgYmUgYWJzb2x1dGUuJyk7CgkJfSBlbHNlIGlmICgkcENlbGxDb29yZGluYXRlID09ICcnKSB7CgkJCXRocm93IG5ldyBFeGNlcHRpb24oJ0NlbGwgY29vcmRpbmF0ZSBjYW4gbm90IGJlIHplcm8tbGVuZ3RoIHN0cmluZy4nKTsKCQl9IGVsc2UgewoJCQkvLyBDaGVjayBpZiB3ZSBhbHJlYWR5IGhhdmUgYSBjb21tZW50IGZvciB0aGlzIGNlbGwuCgkJCS8vIElmIG5vdCwgY3JlYXRlIGEgbmV3IGNvbW1lbnQuCgkJCWlmIChpc3NldCgkdGhpcy0+X2NvbW1lbnRzWyRwQ2VsbENvb3JkaW5hdGVdKSkgewoJCQkJcmV0dXJuICR0aGlzLT5fY29tbWVudHNbJHBDZWxsQ29vcmRpbmF0ZV07CgkJCX0gZWxzZSB7CgkJCQkkbmV3Q29tbWVudCA9IG5ldyBQSFBFeGNlbF9Db21tZW50KCk7CgkJCQkkdGhpcy0+X2NvbW1lbnRzWyRwQ2VsbENvb3JkaW5hdGVdID0gJG5ld0NvbW1lbnQ7CgkJCQlyZXR1cm4gJG5ld0NvbW1lbnQ7CgkJCX0KCQl9Cgl9CgoJLyoqCgkgKiBHZXQgY29tbWVudCBmb3IgY2VsbCBieSB1c2luZyBudW1lcmljIGNlbGwgY29vcmRpbmF0ZXMKCSAqCgkgKiBAcGFyYW0JaW50ICRwQ29sdW1uCU51bWVyaWMgY29sdW1uIGNvb3JkaW5hdGUgb2YgdGhlIGNlbGwKCSAqIEBwYXJhbQlpbnQgJHBSb3cJCU51bWVyaWMgcm93IGNvb3JkaW5hdGUgb2YgdGhlIGNlbGwKCSAqIEByZXR1cm4JUEhQRXhjZWxfQ29tbWVudAoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0Q29tbWVudEJ5Q29sdW1uQW5kUm93KCRwQ29sdW1uID0gMCwgJHBSb3cgPSAxKQoJewoJCXJldHVybiAkdGhpcy0+Z2V0Q29tbWVudChQSFBFeGNlbF9DZWxsOjpzdHJpbmdGcm9tQ29sdW1uSW5kZXgoJHBDb2x1bW4pIC4gJHBSb3cpOwoJfQoKCS8qKgoJICogR2V0IHNlbGVjdGVkIGNlbGwKCSAqCgkgKiBAZGVwcmVjYXRlZAoJICogQHJldHVybiBzdHJpbmcKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldFNlbGVjdGVkQ2VsbCgpCgl7CgkJcmV0dXJuICR0aGlzLT5nZXRTZWxlY3RlZENlbGxzKCk7Cgl9CgoJLyoqCgkgKiBHZXQgYWN0aXZlIGNlbGwKCSAqCgkgKiBAcmV0dXJuIHN0cmluZyBFeGFtcGxlOiAnQTEnCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRBY3RpdmVDZWxsKCkKCXsKCQlyZXR1cm4gJHRoaXMtPl9hY3RpdmVDZWxsOwoJfQoKCS8qKgoJICogR2V0IHNlbGVjdGVkIGNlbGxzCgkgKgoJICogQHJldHVybiBzdHJpbmcKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldFNlbGVjdGVkQ2VsbHMoKQoJewoJCXJldHVybiAkdGhpcy0+X3NlbGVjdGVkQ2VsbHM7Cgl9CgoJLyoqCgkgKiBTZWxlY3RlZCBjZWxsCgkgKgoJICogQHBhcmFtCXN0cmluZwkJJHBDb29yZGluYXRlCUNlbGwgKGkuZS4gQTEpCgkgKiBAcmV0dXJuIFBIUEV4Y2VsX1dvcmtzaGVldAoJICovCglwdWJsaWMgZnVuY3Rpb24gc2V0U2VsZWN0ZWRDZWxsKCRwQ29vcmRpbmF0ZSA9ICdBMScpCgl7CgkJcmV0dXJuICR0aGlzLT5zZXRTZWxlY3RlZENlbGxzKCRwQ29vcmRpbmF0ZSk7Cgl9CgoJLyoqCgkgKiBTZWxlY3QgYSByYW5nZSBvZiBjZWxscy4KCSAqCgkgKiBAcGFyYW0Jc3RyaW5nCQkkcENvb3JkaW5hdGUJQ2VsbCByYW5nZSwgZXhhbXBsZXM6ICdBMScsICdCMjpHNScsICdBOkMnLCAnMzo2JwoJICogQHRocm93cwlFeGNlcHRpb24KCSAqIEByZXR1cm4gUEhQRXhjZWxfV29ya3NoZWV0CgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBzZXRTZWxlY3RlZENlbGxzKCRwQ29vcmRpbmF0ZSA9ICdBMScpCgl7CgkJLy8gVXBwZXJjYXNlIGNvb3JkaW5hdGUKCQkkcENvb3JkaW5hdGUgPSBzdHJ0b3VwcGVyKCRwQ29vcmRpbmF0ZSk7CgoJCS8vIENvbnZlcnQgJ0EnIHRvICdBOkEnCgkJJHBDb29yZGluYXRlID0gcHJlZ19yZXBsYWNlKCcvXihbQS1aXSspJC8nLCAnJHsxfTokezF9JywgJHBDb29yZGluYXRlKTsKCgkJLy8gQ29udmVydCAnMScgdG8gJzE6MScKCQkkcENvb3JkaW5hdGUgPSBwcmVnX3JlcGxhY2UoJy9eKFswLTldKykkLycsICckezF9OiR7MX0nLCAkcENvb3JkaW5hdGUpOwoKCQkvLyBDb252ZXJ0ICdBOkMnIHRvICdBMTpDMTA0ODU3NicKCQkkcENvb3JkaW5hdGUgPSBwcmVnX3JlcGxhY2UoJy9eKFtBLVpdKyk6KFtBLVpdKykkLycsICckezF9MTokezJ9MTA0ODU3NicsICRwQ29vcmRpbmF0ZSk7CgoJCS8vIENvbnZlcnQgJzE6MycgdG8gJ0ExOlhGRDMnCgkJJHBDb29yZGluYXRlID0gcHJlZ19yZXBsYWNlKCcvXihbMC05XSspOihbMC05XSspJC8nLCAnQSR7MX06WEZEJHsyfScsICRwQ29vcmRpbmF0ZSk7CgoJCWlmIChzdHJwb3MoJHBDb29yZGluYXRlLCc6JykgIT09IGZhbHNlIHx8IHN0cnBvcygkcENvb3JkaW5hdGUsJywnKSAhPT0gZmFsc2UpIHsKCQkJbGlzdCgkZmlyc3QsICkgPSBQSFBFeGNlbF9DZWxsOjpzcGxpdFJhbmdlKCRwQ29vcmRpbmF0ZSk7CgkJCSR0aGlzLT5fYWN0aXZlQ2VsbCA9ICRmaXJzdFswXTsKCQl9IGVsc2UgewoJCQkkdGhpcy0+X2FjdGl2ZUNlbGwgPSAkcENvb3JkaW5hdGU7CgkJfQoJCSR0aGlzLT5fc2VsZWN0ZWRDZWxscyA9ICRwQ29vcmRpbmF0ZTsKCQlyZXR1cm4gJHRoaXM7Cgl9CgoJLyoqCgkgKiBTZWxlY3RlZCBjZWxsIGJ5IHVzaW5nIG51bWVyaWMgY2VsbCBjb29yZGluYXRlcwoJICoKCSAqIEBwYXJhbQlpbnQJJHBDb2x1bW4JTnVtZXJpYyBjb2x1bW4gY29vcmRpbmF0ZSBvZiB0aGUgY2VsbAoJICogQHBhcmFtCWludAkkcFJvdwkJTnVtZXJpYyByb3cgY29vcmRpbmF0ZSBvZiB0aGUgY2VsbAoJICogQHRocm93cwlFeGNlcHRpb24KCSAqIEByZXR1cm4gUEhQRXhjZWxfV29ya3NoZWV0CgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBzZXRTZWxlY3RlZENlbGxCeUNvbHVtbkFuZFJvdygkcENvbHVtbiA9IDAsICRwUm93ID0gMSkKCXsKCQlyZXR1cm4gJHRoaXMtPnNldFNlbGVjdGVkQ2VsbHMoUEhQRXhjZWxfQ2VsbDo6c3RyaW5nRnJvbUNvbHVtbkluZGV4KCRwQ29sdW1uKSAuICRwUm93KTsKCX0KCgkvKioKCSAqIEdldCByaWdodC10by1sZWZ0CgkgKgoJICogQHJldHVybiBib29sZWFuCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRSaWdodFRvTGVmdCgpIHsKCQlyZXR1cm4gJHRoaXMtPl9yaWdodFRvTGVmdDsKCX0KCgkvKioKCSAqIFNldCByaWdodC10by1sZWZ0CgkgKgoJICogQHBhcmFtCWJvb2xlYW4JJHZhbHVlCVJpZ2h0LXRvLWxlZnQgdHJ1ZS9mYWxzZQoJICogQHJldHVybiBQSFBFeGNlbF9Xb3Jrc2hlZXQKCSAqLwoJcHVibGljIGZ1bmN0aW9uIHNldFJpZ2h0VG9MZWZ0KCR2YWx1ZSA9IGZhbHNlKSB7CgkJJHRoaXMtPl9yaWdodFRvTGVmdCA9ICR2YWx1ZTsKCQlyZXR1cm4gJHRoaXM7Cgl9CgoJLyoqCgkgKiBGaWxsIHdvcmtzaGVldCBmcm9tIHZhbHVlcyBpbiBhcnJheQoJICoKCSAqIEBwYXJhbQlhcnJheQkkc291cmNlCQkJCQlTb3VyY2UgYXJyYXkKCSAqIEBwYXJhbQltaXhlZAkkbnVsbFZhbHVlCQkJCVZhbHVlIGluIHNvdXJjZSBhcnJheSB0aGF0IHN0YW5kcyBmb3IgYmxhbmsgY2VsbAoJICogQHBhcmFtCXN0cmluZwkkc3RhcnRDZWxsCQkJCUluc2VydCBhcnJheSBzdGFydGluZyBmcm9tIHRoaXMgY2VsbCBhZGRyZXNzIGFzIHRoZSB0b3AgbGVmdCBjb29yZGluYXRlCgkgKiBAcGFyYW0JYm9vbGVhbgkkc3RyaWN0TnVsbENvbXBhcmlzb24JQXBwbHkgc3RyaWN0IGNvbXBhcmlzb24gd2hlbiB0ZXN0aW5nIGZvciBudWxsIHZhbHVlcyBpbiB0aGUgYXJyYXkKCSAqIEB0aHJvd3MgRXhjZXB0aW9uCgkgKiBAcmV0dXJuIFBIUEV4Y2VsX1dvcmtzaGVldAoJICovCglwdWJsaWMgZnVuY3Rpb24gZnJvbUFycmF5KCRzb3VyY2UgPSBudWxsLCAkbnVsbFZhbHVlID0gbnVsbCwgJHN0YXJ0Q2VsbCA9ICdBMScsICRzdHJpY3ROdWxsQ29tcGFyaXNvbiA9IGZhbHNlKSB7CgkJaWYgKGlzX2FycmF5KCRzb3VyY2UpKSB7CgkJCS8vCUNvbnZlcnQgYSAxLUQgYXJyYXkgdG8gMi1EIChmb3IgZWFzZSBvZiBsb29waW5nKQoJCQlpZiAoIWlzX2FycmF5KGVuZCgkc291cmNlKSkpIHsKCQkJCSRzb3VyY2UgPSBhcnJheSgkc291cmNlKTsKCQkJfQoKCQkJLy8gc3RhcnQgY29vcmRpbmF0ZQoJCQlsaXN0ICgkc3RhcnRDb2x1bW4sICRzdGFydFJvdykgPSBQSFBFeGNlbF9DZWxsOjpjb29yZGluYXRlRnJvbVN0cmluZygkc3RhcnRDZWxsKTsKCgkJCS8vIExvb3AgdGhyb3VnaCAkc291cmNlCgkJCWZvcmVhY2ggKCRzb3VyY2UgYXMgJHJvd0RhdGEpIHsKCQkJCSRjdXJyZW50Q29sdW1uID0gJHN0YXJ0Q29sdW1uOwoJCQkJZm9yZWFjaCgkcm93RGF0YSBhcyAkY2VsbFZhbHVlKSB7CgkJCQkJaWYgKCRzdHJpY3ROdWxsQ29tcGFyaXNvbikgewoJCQkJCQlpZiAoJGNlbGxWYWx1ZSAhPT0gJG51bGxWYWx1ZSkgewoJCQkJCQkJLy8gU2V0IGNlbGwgdmFsdWUKCQkJCQkJCSR0aGlzLT5nZXRDZWxsKCRjdXJyZW50Q29sdW1uIC4gJHN0YXJ0Um93KS0+c2V0VmFsdWUoJGNlbGxWYWx1ZSk7CgkJCQkJCX0KCQkJCQl9IGVsc2UgewoJCQkJCQlpZiAoJGNlbGxWYWx1ZSAhPSAkbnVsbFZhbHVlKSB7CgkJCQkJCQkvLyBTZXQgY2VsbCB2YWx1ZQoJCQkJCQkJJHRoaXMtPmdldENlbGwoJGN1cnJlbnRDb2x1bW4gLiAkc3RhcnRSb3cpLT5zZXRWYWx1ZSgkY2VsbFZhbHVlKTsKCQkJCQkJfQoJCQkJCX0KCQkJCQkrKyRjdXJyZW50Q29sdW1uOwoJCQkJfQoJCQkJKyskc3RhcnRSb3c7CgkJCX0KCQl9IGVsc2UgewoJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCJQYXJhbWV0ZXIgXCRzb3VyY2Ugc2hvdWxkIGJlIGFuIGFycmF5LiIpOwoJCX0KCQlyZXR1cm4gJHRoaXM7Cgl9CgoJLyoqCgkgKiBDcmVhdGUgYXJyYXkgZnJvbSBhIHJhbmdlIG9mIGNlbGxzCgkgKgoJICogQHBhcmFtCXN0cmluZwkkcFJhbmdlCQkJCQlSYW5nZSBvZiBjZWxscyAoaS5lLiAiQTE6QjEwIiksIG9yIGp1c3Qgb25lIGNlbGwgKGkuZS4gIkExIikKCSAqIEBwYXJhbQltaXhlZAkkbnVsbFZhbHVlCQkJCVZhbHVlIHJldHVybmVkIGluIHRoZSBhcnJheSBlbnRyeSBpZiBhIGNlbGwgZG9lc24ndCBleGlzdAoJICogQHBhcmFtCWJvb2xlYW4JJGNhbGN1bGF0ZUZvcm11bGFzCQlTaG91bGQgZm9ybXVsYXMgYmUgY2FsY3VsYXRlZD8KCSAqIEBwYXJhbQlib29sZWFuCSRmb3JtYXREYXRhCQkJCVNob3VsZCBmb3JtYXR0aW5nIGJlIGFwcGxpZWQgdG8gY2VsbCB2YWx1ZXM/CgkgKiBAcGFyYW0JYm9vbGVhbgkkcmV0dXJuQ2VsbFJlZgkJCUZhbHNlIC0gUmV0dXJuIGEgc2ltcGxlIGFycmF5IG9mIHJvd3MgYW5kIGNvbHVtbnMgaW5kZXhlZCBieSBudW1iZXIgY291bnRpbmcgZnJvbSB6ZXJvCgkgKgkJCQkJCQkJCQkJVHJ1ZSAtIFJldHVybiByb3dzIGFuZCBjb2x1bW5zIGluZGV4ZWQgYnkgdGhlaXIgYWN0dWFsIHJvdyBhbmQgY29sdW1uIElEcwoJICogQHJldHVybiBhcnJheQoJICovCglwdWJsaWMgZnVuY3Rpb24gcmFuZ2VUb0FycmF5KCRwUmFuZ2UgPSAnQTEnLCAkbnVsbFZhbHVlID0gbnVsbCwgJGNhbGN1bGF0ZUZvcm11bGFzID0gdHJ1ZSwgJGZvcm1hdERhdGEgPSB0cnVlLCAkcmV0dXJuQ2VsbFJlZiA9IGZhbHNlKSB7CgkJLy8gUmV0dXJudmFsdWUKCQkkcmV0dXJuVmFsdWUgPSBhcnJheSgpOwoKCQkvLwlJZGVudGlmeSB0aGUgcmFuZ2UgdGhhdCB3ZSBuZWVkIHRvIGV4dHJhY3QgZnJvbSB0aGUgd29ya3NoZWV0CgkJbGlzdCgkcmFuZ2VTdGFydCwgJHJhbmdlRW5kKSA9IFBIUEV4Y2VsX0NlbGw6OnJhbmdlQm91bmRhcmllcygkcFJhbmdlKTsKCQkkbWluQ29sID0gUEhQRXhjZWxfQ2VsbDo6c3RyaW5nRnJvbUNvbHVtbkluZGV4KCRyYW5nZVN0YXJ0WzBdIC0xKTsKCQkkbWluUm93ID0gJHJhbmdlU3RhcnRbMV07CgkJJG1heENvbCA9IFBIUEV4Y2VsX0NlbGw6OnN0cmluZ0Zyb21Db2x1bW5JbmRleCgkcmFuZ2VFbmRbMF0gLTEpOwoJCSRtYXhSb3cgPSAkcmFuZ2VFbmRbMV07CgoJCSRtYXhDb2wrKzsKCgkJLy8gTG9vcCB0aHJvdWdoIHJvd3MKCQkkciA9IC0xOwoJCWZvciAoJHJvdyA9ICRtaW5Sb3c7ICRyb3cgPD0gJG1heFJvdzsgKyskcm93KSB7CgkJCSRyUmVmID0gKCRyZXR1cm5DZWxsUmVmKSA/ICRyb3cgOiArKyRyOwoJCQkkYyA9IC0xOwoJCQkvLyBMb29wIHRocm91Z2ggY29sdW1ucyBpbiB0aGUgY3VycmVudCByb3cKCQkJZm9yICgkY29sID0gJG1pbkNvbDsgJGNvbCAhPSAkbWF4Q29sOyArKyRjb2wpIHsKCQkJCSRjUmVmID0gKCRyZXR1cm5DZWxsUmVmKSA/ICRjb2wgOiArKyRjOwoJCQkJLy8JVXNpbmcgZ2V0Q2VsbCgpIHdpbGwgY3JlYXRlIGEgbmV3IGNlbGwgaWYgaXQgZG9lc24ndCBhbHJlYWR5IGV4aXN0LiBXZSBkb24ndCB3YW50IHRoYXQgdG8gaGFwcGVuCgkJCQkvLwkJc28gd2UgdGVzdCBhbmQgcmV0cmlldmUgZGlyZWN0bHkgYWdhaW5zdCBfY2VsbENvbGxlY3Rpb24KCQkJCWlmICgkdGhpcy0+X2NlbGxDb2xsZWN0aW9uLT5pc0RhdGFTZXQoJGNvbC4kcm93KSkgewoJCQkJCS8vIENlbGwgZXhpc3RzCgkJCQkJJGNlbGwgPSAkdGhpcy0+X2NlbGxDb2xsZWN0aW9uLT5nZXRDYWNoZURhdGEoJGNvbC4kcm93KTsKCQkJCQlpZiAoJGNlbGwtPmdldFZhbHVlKCkgIT09IG51bGwpIHsKCQkJCQkJaWYgKCRjZWxsLT5nZXRWYWx1ZSgpIGluc3RhbmNlb2YgUEhQRXhjZWxfUmljaFRleHQpIHsKCQkJCQkJCSRyZXR1cm5WYWx1ZVskclJlZl1bJGNSZWZdID0gJGNlbGwtPmdldFZhbHVlKCktPmdldFBsYWluVGV4dCgpOwoJCQkJCQl9IGVsc2UgewoJCQkJCQkJaWYgKCRjYWxjdWxhdGVGb3JtdWxhcykgewoJCQkJCQkJCSRyZXR1cm5WYWx1ZVskclJlZl1bJGNSZWZdID0gJGNlbGwtPmdldENhbGN1bGF0ZWRWYWx1ZSgpOwoJCQkJCQkJfSBlbHNlIHsKCQkJCQkJCQkkcmV0dXJuVmFsdWVbJHJSZWZdWyRjUmVmXSA9ICRjZWxsLT5nZXRWYWx1ZSgpOwoJCQkJCQkJfQoJCQkJCQl9CgoJCQkJCQlpZiAoJGZvcm1hdERhdGEpIHsKCQkJCQkJCSRzdHlsZSA9ICR0aGlzLT5fcGFyZW50LT5nZXRDZWxsWGZCeUluZGV4KCRjZWxsLT5nZXRYZkluZGV4KCkpOwoJCQkJCQkJJHJldHVyblZhbHVlWyRyUmVmXVskY1JlZl0gPSBQSFBFeGNlbF9TdHlsZV9OdW1iZXJGb3JtYXQ6OnRvRm9ybWF0dGVkU3RyaW5nKCRyZXR1cm5WYWx1ZVskclJlZl1bJGNSZWZdLCAkc3R5bGUtPmdldE51bWJlckZvcm1hdCgpLT5nZXRGb3JtYXRDb2RlKCkpOwoJCQkJCQl9CgkJCQkJfSBlbHNlIHsKCQkJCQkJLy8gQ2VsbCBob2xkcyBhIE5VTEwKCQkJCQkJJHJldHVyblZhbHVlWyRyUmVmXVskY1JlZl0gPSAkbnVsbFZhbHVlOwoJCQkJCX0KCQkJCX0gZWxzZSB7CgkJCQkJLy8gQ2VsbCBkb2Vzbid0IGV4aXN0CgkJCQkJJHJldHVyblZhbHVlWyRyUmVmXVskY1JlZl0gPSAkbnVsbFZhbHVlOwoJCQkJfQoJCQl9CgkJfQoKCQkvLyBSZXR1cm4KCQlyZXR1cm4gJHJldHVyblZhbHVlOwoJfQoKCgkvKioKCSAqIENyZWF0ZSBhcnJheSBmcm9tIGEgcmFuZ2Ugb2YgY2VsbHMKCSAqCgkgKiBAcGFyYW0Jc3RyaW5nCSRwTmFtZWRSYW5nZQkJCU5hbWUgb2YgdGhlIE5hbWVkIFJhbmdlCgkgKiBAcGFyYW0JbWl4ZWQJJG51bGxWYWx1ZQkJCQlWYWx1ZSByZXR1cm5lZCBpbiB0aGUgYXJyYXkgZW50cnkgaWYgYSBjZWxsIGRvZXNuJ3QgZXhpc3QKCSAqIEBwYXJhbQlib29sZWFuCSRjYWxjdWxhdGVGb3JtdWxhcwkJU2hvdWxkIGZvcm11bGFzIGJlIGNhbGN1bGF0ZWQ/CgkgKiBAcGFyYW0JYm9vbGVhbgkkZm9ybWF0RGF0YQkJCQlTaG91bGQgZm9ybWF0dGluZyBiZSBhcHBsaWVkIHRvIGNlbGwgdmFsdWVzPwoJICogQHBhcmFtCWJvb2xlYW4JJHJldHVybkNlbGxSZWYJCQlGYWxzZSAtIFJldHVybiBhIHNpbXBsZSBhcnJheSBvZiByb3dzIGFuZCBjb2x1bW5zIGluZGV4ZWQgYnkgbnVtYmVyIGNvdW50aW5nIGZyb20gemVybwoJICoJCQkJCQkJCQkJCVRydWUgLSBSZXR1cm4gcm93cyBhbmQgY29sdW1ucyBpbmRleGVkIGJ5IHRoZWlyIGFjdHVhbCByb3cgYW5kIGNvbHVtbiBJRHMKCSAqIEByZXR1cm4gYXJyYXkKCSAqIEB0aHJvd3MgRXhjZXB0aW9uCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBuYW1lZFJhbmdlVG9BcnJheSgkcE5hbWVkUmFuZ2UgPSAnJywgJG51bGxWYWx1ZSA9IG51bGwsICRjYWxjdWxhdGVGb3JtdWxhcyA9IHRydWUsICRmb3JtYXREYXRhID0gdHJ1ZSwgJHJldHVybkNlbGxSZWYgPSBmYWxzZSkgewoJCSRuYW1lZFJhbmdlID0gUEhQRXhjZWxfTmFtZWRSYW5nZTo6cmVzb2x2ZVJhbmdlKCRwTmFtZWRSYW5nZSwgJHRoaXMpOwoJCWlmICgkbmFtZWRSYW5nZSAhPT0gTlVMTCkgewoJCQkkcFdvcmtTaGVldCA9ICRuYW1lZFJhbmdlLT5nZXRXb3Jrc2hlZXQoKTsKCQkJJHBDZWxsUmFuZ2UgPSAkbmFtZWRSYW5nZS0+Z2V0UmFuZ2UoKTsKCgkJCXJldHVybiAkcFdvcmtTaGVldC0+cmFuZ2VUb0FycmF5KAkkcENlbGxSYW5nZSwKCQkJCQkJCQkJCQkJJG51bGxWYWx1ZSwgJGNhbGN1bGF0ZUZvcm11bGFzLCAkZm9ybWF0RGF0YSwgJHJldHVybkNlbGxSZWYpOwoJCX0KCgkJdGhyb3cgbmV3IEV4Y2VwdGlvbignTmFtZWQgUmFuZ2UgJy4kcE5hbWVkUmFuZ2UuJyBkb2VzIG5vdCBleGlzdC4nKTsKCX0KCgoJLyoqCgkgKiBDcmVhdGUgYXJyYXkgZnJvbSB3b3Jrc2hlZXQKCSAqCgkgKiBAcGFyYW0JbWl4ZWQJJG51bGxWYWx1ZQkJCQlWYWx1ZSByZXR1cm5lZCBpbiB0aGUgYXJyYXkgZW50cnkgaWYgYSBjZWxsIGRvZXNuJ3QgZXhpc3QKCSAqIEBwYXJhbQlib29sZWFuCSRjYWxjdWxhdGVGb3JtdWxhcwkJU2hvdWxkIGZvcm11bGFzIGJlIGNhbGN1bGF0ZWQ/CgkgKiBAcGFyYW0JYm9vbGVhbgkkZm9ybWF0RGF0YQkJCQlTaG91bGQgZm9ybWF0dGluZyBiZSBhcHBsaWVkIHRvIGNlbGwgdmFsdWVzPwoJICogQHBhcmFtCWJvb2xlYW4JJHJldHVybkNlbGxSZWYJCQlGYWxzZSAtIFJldHVybiBhIHNpbXBsZSBhcnJheSBvZiByb3dzIGFuZCBjb2x1bW5zIGluZGV4ZWQgYnkgbnVtYmVyIGNvdW50aW5nIGZyb20gemVybwoJICoJCQkJCQkJCQkJCVRydWUgLSBSZXR1cm4gcm93cyBhbmQgY29sdW1ucyBpbmRleGVkIGJ5IHRoZWlyIGFjdHVhbCByb3cgYW5kIGNvbHVtbiBJRHMKCSAqIEByZXR1cm4gYXJyYXkKCSAqLwoJcHVibGljIGZ1bmN0aW9uIHRvQXJyYXkoJG51bGxWYWx1ZSA9IG51bGwsICRjYWxjdWxhdGVGb3JtdWxhcyA9IHRydWUsICRmb3JtYXREYXRhID0gdHJ1ZSwgJHJldHVybkNlbGxSZWYgPSBmYWxzZSkgewoJCS8vIEdhcmJhZ2UgY29sbGVjdC4uLgoJCSR0aGlzLT5nYXJiYWdlQ29sbGVjdCgpOwoKCQkvLwlJZGVudGlmeSB0aGUgcmFuZ2UgdGhhdCB3ZSBuZWVkIHRvIGV4dHJhY3QgZnJvbSB0aGUgd29ya3NoZWV0CgkJJG1heENvbCA9ICR0aGlzLT5nZXRIaWdoZXN0Q29sdW1uKCk7CgkJJG1heFJvdyA9ICR0aGlzLT5nZXRIaWdoZXN0Um93KCk7CgkJLy8gUmV0dXJuCgkJcmV0dXJuICR0aGlzLT5yYW5nZVRvQXJyYXkoCSdBMTonLiRtYXhDb2wuJG1heFJvdywKCQkJCQkJCQkJJG51bGxWYWx1ZSwgJGNhbGN1bGF0ZUZvcm11bGFzLCAkZm9ybWF0RGF0YSwgJHJldHVybkNlbGxSZWYpOwoJfQoKCS8qKgoJICogR2V0IHJvdyBpdGVyYXRvcgoJICoKICAgICAqIEBwYXJhbSAgaW50ZWdlciAgICAgICAgICAgICAgICAgICAgICAgICAgICRzdGFydFJvdyAgICBUaGUgcm93IG51bWJlciBhdCB3aGljaCB0byBzdGFydCBpdGVyYXRpbmcKCSAqIEByZXR1cm4gUEhQRXhjZWxfV29ya3NoZWV0X1Jvd0l0ZXJhdG9yCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRSb3dJdGVyYXRvcigkc3RhcnRSb3cgPSAxKSB7CgkJcmV0dXJuIG5ldyBQSFBFeGNlbF9Xb3Jrc2hlZXRfUm93SXRlcmF0b3IoJHRoaXMsJHN0YXJ0Um93KTsKCX0KCgkvKioKCSAqIFJ1biBQSFBFeGNlbCBnYXJhYmFnZSBjb2xsZWN0b3IuCgkgKgoJICogQHJldHVybiBQSFBFeGNlbF9Xb3Jrc2hlZXQKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdhcmJhZ2VDb2xsZWN0KCkgewoJCS8vIEJ1aWxkIGEgcmVmZXJlbmNlIHRhYmxlIGZyb20gaW1hZ2VzCi8vCQkkaW1hZ2VDb29yZGluYXRlcyA9IGFycmF5KCk7Ci8vCQkkaXRlcmF0b3IgPSAkdGhpcy0+Z2V0RHJhd2luZ0NvbGxlY3Rpb24oKS0+Z2V0SXRlcmF0b3IoKTsKLy8JCXdoaWxlICgkaXRlcmF0b3ItPnZhbGlkKCkpIHsKLy8JCQkkaW1hZ2VDb29yZGluYXRlc1skaXRlcmF0b3ItPmN1cnJlbnQoKS0+Z2V0Q29vcmRpbmF0ZXMoKV0gPSB0cnVlOwovLwovLwkJCSRpdGVyYXRvci0+bmV4dCgpOwovLwkJfQovLwoJCS8vIExvb2t1cCBoaWdoZXN0IGNvbHVtbiBhbmQgaGlnaGVzdCByb3cgaWYgY2VsbHMgYXJlIGNsZWFuZWQKCQkkY29sUm93ID0gJHRoaXMtPl9jZWxsQ29sbGVjdGlvbi0+Z2V0SGlnaGVzdFJvd0FuZENvbHVtbigpOwoJCSRoaWdoZXN0Um93ID0gJGNvbFJvd1sncm93J107CgkJJGhpZ2hlc3RDb2x1bW4gPSBQSFBFeGNlbF9DZWxsOjpjb2x1bW5JbmRleEZyb21TdHJpbmcoJGNvbFJvd1snY29sdW1uJ10pOwoKCQkvLyBMb29wIHRocm91Z2ggY29sdW1uIGRpbWVuc2lvbnMKCQlmb3JlYWNoICgkdGhpcy0+X2NvbHVtbkRpbWVuc2lvbnMgYXMgJGRpbWVuc2lvbikgewoJCQkkaGlnaGVzdENvbHVtbiA9IG1heCgkaGlnaGVzdENvbHVtbixQSFBFeGNlbF9DZWxsOjpjb2x1bW5JbmRleEZyb21TdHJpbmcoJGRpbWVuc2lvbi0+Z2V0Q29sdW1uSW5kZXgoKSkpOwoJCX0KCgkJLy8gTG9vcCB0aHJvdWdoIHJvdyBkaW1lbnNpb25zCgkJZm9yZWFjaCAoJHRoaXMtPl9yb3dEaW1lbnNpb25zIGFzICRkaW1lbnNpb24pIHsKCQkJJGhpZ2hlc3RSb3cgPSBtYXgoJGhpZ2hlc3RSb3csJGRpbWVuc2lvbi0+Z2V0Um93SW5kZXgoKSk7CgkJfQoKCQkvLyBDYWNoZSB2YWx1ZXMKCQlpZiAoJGhpZ2hlc3RDb2x1bW4gPCAwKSB7CgkJCSR0aGlzLT5fY2FjaGVkSGlnaGVzdENvbHVtbiA9ICdBJzsKCQl9IGVsc2UgewoJCQkkdGhpcy0+X2NhY2hlZEhpZ2hlc3RDb2x1bW4gPSBQSFBFeGNlbF9DZWxsOjpzdHJpbmdGcm9tQ29sdW1uSW5kZXgoLS0kaGlnaGVzdENvbHVtbik7CgkJfQoJCSR0aGlzLT5fY2FjaGVkSGlnaGVzdFJvdyA9ICRoaWdoZXN0Um93OwoKCQkvLyBSZXR1cm4KCQlyZXR1cm4gJHRoaXM7Cgl9CgoJLyoqCgkgKiBHZXQgaGFzaCBjb2RlCgkgKgoJICogQHJldHVybiBzdHJpbmcJSGFzaCBjb2RlCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRIYXNoQ29kZSgpIHsKCQlpZiAoJHRoaXMtPl9kaXJ0eSkgewoJCQkkdGhpcy0+X2hhc2ggPSBtZDUoICR0aGlzLT5fdGl0bGUgLgoJCQkJCQkJCSR0aGlzLT5fYXV0b0ZpbHRlciAuCgkJCQkJCQkJKCR0aGlzLT5fcHJvdGVjdGlvbi0+aXNQcm90ZWN0aW9uRW5hYmxlZCgpID8gJ3QnIDogJ2YnKSAuCgkJCQkJCQkJX19DTEFTU19fCgkJCQkJCQkgICk7CgkJCSR0aGlzLT5fZGlydHkgPSBmYWxzZTsKCQl9CgkJcmV0dXJuICR0aGlzLT5faGFzaDsKCX0KCgkvKioKCSAqIEV4dHJhY3Qgd29ya3NoZWV0IHRpdGxlIGZyb20gcmFuZ2UuCgkgKgoJICogRXhhbXBsZTogZXh0cmFjdFNoZWV0VGl0bGUoInRlc3RTaGVldCFBMSIpID09PiAnQTEnCgkgKiBFeGFtcGxlOiBleHRyYWN0U2hlZXRUaXRsZSgiJ3Rlc3RTaGVldCAxJyFBMSIsIHRydWUpID09PiBhcnJheSgndGVzdFNoZWV0IDEnLCAnQTEnKTsKCSAqCgkgKiBAcGFyYW0gc3RyaW5nICRwUmFuZ2UJUmFuZ2UgdG8gZXh0cmFjdCB0aXRsZSBmcm9tCgkgKiBAcGFyYW0gYm9vbCAkcmV0dXJuUmFuZ2UJUmV0dXJuIHJhbmdlPyAoc2VlIGV4YW1wbGUpCgkgKiBAcmV0dXJuIG1peGVkCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZXh0cmFjdFNoZWV0VGl0bGUoJHBSYW5nZSwgJHJldHVyblJhbmdlID0gZmFsc2UpIHsKCQkvLyBTaGVldCB0aXRsZSBpbmNsdWRlZD8KCQlpZiAoKCRzZXAgPSBzdHJwb3MoJHBSYW5nZSwgJyEnKSkgPT09IGZhbHNlKSB7CgkJCXJldHVybiAnJzsKCQl9CgoJCWlmICgkcmV0dXJuUmFuZ2UpIHsKCQkJcmV0dXJuIGFycmF5KCB0cmltKHN1YnN0cigkcFJhbmdlLCAwLCAkc2VwKSwiJyIpLAoJCQkJCQkgIHN1YnN0cigkcFJhbmdlLCAkc2VwICsgMSkKCQkJCQkJKTsKCQl9CgoJCXJldHVybiBzdWJzdHIoJHBSYW5nZSwgJHNlcCArIDEpOwoJfQoKCS8qKgoJICogR2V0IGh5cGVybGluawoJICoKCSAqIEBwYXJhbSBzdHJpbmcgJHBDZWxsQ29vcmRpbmF0ZQlDZWxsIGNvb3JkaW5hdGUgdG8gZ2V0IGh5cGVybGluayBmb3IKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldEh5cGVybGluaygkcENlbGxDb29yZGluYXRlID0gJ0ExJykKCXsKCQkvLyByZXR1cm4gaHlwZXJsaW5rIGlmIHdlIGFscmVhZHkgaGF2ZSBvbmUKCQlpZiAoaXNzZXQoJHRoaXMtPl9oeXBlcmxpbmtDb2xsZWN0aW9uWyRwQ2VsbENvb3JkaW5hdGVdKSkgewoJCQlyZXR1cm4gJHRoaXMtPl9oeXBlcmxpbmtDb2xsZWN0aW9uWyRwQ2VsbENvb3JkaW5hdGVdOwoJCX0KCgkJLy8gZWxzZSBjcmVhdGUgaHlwZXJsaW5rCgkJJHRoaXMtPl9oeXBlcmxpbmtDb2xsZWN0aW9uWyRwQ2VsbENvb3JkaW5hdGVdID0gbmV3IFBIUEV4Y2VsX0NlbGxfSHlwZXJsaW5rKCk7CgkJcmV0dXJuICR0aGlzLT5faHlwZXJsaW5rQ29sbGVjdGlvblskcENlbGxDb29yZGluYXRlXTsKCX0KCgkvKioKCSAqIFNldCBoeXBlcmxuawoJICoKCSAqIEBwYXJhbSBzdHJpbmcgJHBDZWxsQ29vcmRpbmF0ZQlDZWxsIGNvb3JkaW5hdGUgdG8gaW5zZXJ0IGh5cGVybGluawoJICogQHBhcmFtCVBIUEV4Y2VsX0NlbGxfSHlwZXJsaW5rCSRwSHlwZXJsaW5rCgkgKiBAcmV0dXJuIFBIUEV4Y2VsX1dvcmtzaGVldAoJICovCglwdWJsaWMgZnVuY3Rpb24gc2V0SHlwZXJsaW5rKCRwQ2VsbENvb3JkaW5hdGUgPSAnQTEnLCBQSFBFeGNlbF9DZWxsX0h5cGVybGluayAkcEh5cGVybGluayA9IG51bGwpCgl7CgkJaWYgKCRwSHlwZXJsaW5rID09PSBudWxsKSB7CgkJCXVuc2V0KCR0aGlzLT5faHlwZXJsaW5rQ29sbGVjdGlvblskcENlbGxDb29yZGluYXRlXSk7CgkJfSBlbHNlIHsKCQkJJHRoaXMtPl9oeXBlcmxpbmtDb2xsZWN0aW9uWyRwQ2VsbENvb3JkaW5hdGVdID0gJHBIeXBlcmxpbms7CgkJfQoJCXJldHVybiAkdGhpczsKCX0KCgkvKioKCSAqIEh5cGVybGluayBhdCBhIHNwZWNpZmljIGNvb3JkaW5hdGUgZXhpc3RzPwoJICoKCSAqIEBwYXJhbSBzdHJpbmcgJHBDb29yZGluYXRlCgkgKiBAcmV0dXJuIGJvb2xlYW4KCSAqLwoJcHVibGljIGZ1bmN0aW9uIGh5cGVybGlua0V4aXN0cygkcENvb3JkaW5hdGUgPSAnQTEnKQoJewoJCXJldHVybiBpc3NldCgkdGhpcy0+X2h5cGVybGlua0NvbGxlY3Rpb25bJHBDb29yZGluYXRlXSk7Cgl9CgoJLyoqCgkgKiBHZXQgY29sbGVjdGlvbiBvZiBoeXBlcmxpbmtzCgkgKgoJICogQHJldHVybiBQSFBFeGNlbF9DZWxsX0h5cGVybGlua1tdCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRIeXBlcmxpbmtDb2xsZWN0aW9uKCkKCXsKCQlyZXR1cm4gJHRoaXMtPl9oeXBlcmxpbmtDb2xsZWN0aW9uOwoJfQoKCS8qKgoJICogR2V0IGRhdGEgdmFsaWRhdGlvbgoJICoKCSAqIEBwYXJhbSBzdHJpbmcgJHBDZWxsQ29vcmRpbmF0ZQlDZWxsIGNvb3JkaW5hdGUgdG8gZ2V0IGRhdGEgdmFsaWRhdGlvbiBmb3IKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldERhdGFWYWxpZGF0aW9uKCRwQ2VsbENvb3JkaW5hdGUgPSAnQTEnKQoJewoJCS8vIHJldHVybiBkYXRhIHZhbGlkYXRpb24gaWYgd2UgYWxyZWFkeSBoYXZlIG9uZQoJCWlmIChpc3NldCgkdGhpcy0+X2RhdGFWYWxpZGF0aW9uQ29sbGVjdGlvblskcENlbGxDb29yZGluYXRlXSkpIHsKCQkJcmV0dXJuICR0aGlzLT5fZGF0YVZhbGlkYXRpb25Db2xsZWN0aW9uWyRwQ2VsbENvb3JkaW5hdGVdOwoJCX0KCgkJLy8gZWxzZSBjcmVhdGUgZGF0YSB2YWxpZGF0aW9uCgkJJHRoaXMtPl9kYXRhVmFsaWRhdGlvbkNvbGxlY3Rpb25bJHBDZWxsQ29vcmRpbmF0ZV0gPSBuZXcgUEhQRXhjZWxfQ2VsbF9EYXRhVmFsaWRhdGlvbigpOwoJCXJldHVybiAkdGhpcy0+X2RhdGFWYWxpZGF0aW9uQ29sbGVjdGlvblskcENlbGxDb29yZGluYXRlXTsKCX0KCgkvKioKCSAqIFNldCBkYXRhIHZhbGlkYXRpb24KCSAqCgkgKiBAcGFyYW0gc3RyaW5nICRwQ2VsbENvb3JkaW5hdGUJQ2VsbCBjb29yZGluYXRlIHRvIGluc2VydCBkYXRhIHZhbGlkYXRpb24KCSAqIEBwYXJhbQlQSFBFeGNlbF9DZWxsX0RhdGFWYWxpZGF0aW9uCSRwRGF0YVZhbGlkYXRpb24KCSAqIEByZXR1cm4gUEhQRXhjZWxfV29ya3NoZWV0CgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBzZXREYXRhVmFsaWRhdGlvbigkcENlbGxDb29yZGluYXRlID0gJ0ExJywgUEhQRXhjZWxfQ2VsbF9EYXRhVmFsaWRhdGlvbiAkcERhdGFWYWxpZGF0aW9uID0gbnVsbCkKCXsKCQlpZiAoJHBEYXRhVmFsaWRhdGlvbiA9PT0gbnVsbCkgewoJCQl1bnNldCgkdGhpcy0+X2RhdGFWYWxpZGF0aW9uQ29sbGVjdGlvblskcENlbGxDb29yZGluYXRlXSk7CgkJfSBlbHNlIHsKCQkJJHRoaXMtPl9kYXRhVmFsaWRhdGlvbkNvbGxlY3Rpb25bJHBDZWxsQ29vcmRpbmF0ZV0gPSAkcERhdGFWYWxpZGF0aW9uOwoJCX0KCQlyZXR1cm4gJHRoaXM7Cgl9CgoJLyoqCgkgKiBEYXRhIHZhbGlkYXRpb24gYXQgYSBzcGVjaWZpYyBjb29yZGluYXRlIGV4aXN0cz8KCSAqCgkgKiBAcGFyYW0gc3RyaW5nICRwQ29vcmRpbmF0ZQoJICogQHJldHVybiBib29sZWFuCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBkYXRhVmFsaWRhdGlvbkV4aXN0cygkcENvb3JkaW5hdGUgPSAnQTEnKQoJewoJCXJldHVybiBpc3NldCgkdGhpcy0+X2RhdGFWYWxpZGF0aW9uQ29sbGVjdGlvblskcENvb3JkaW5hdGVdKTsKCX0KCgkvKioKCSAqIEdldCBjb2xsZWN0aW9uIG9mIGRhdGEgdmFsaWRhdGlvbnMKCSAqCgkgKiBAcmV0dXJuIFBIUEV4Y2VsX0NlbGxfRGF0YVZhbGlkYXRpb25bXQoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0RGF0YVZhbGlkYXRpb25Db2xsZWN0aW9uKCkKCXsKCQlyZXR1cm4gJHRoaXMtPl9kYXRhVmFsaWRhdGlvbkNvbGxlY3Rpb247Cgl9CgoJLyoqCgkgKiBBY2NlcHRzIGEgcmFuZ2UsIHJldHVybmluZyBpdCBhcyBhIHJhbmdlIHRoYXQgZmFsbHMgd2l0aGluIHRoZSBjdXJyZW50IGhpZ2hlc3Qgcm93IGFuZCBjb2x1bW4gb2YgdGhlIHdvcmtzaGVldAoJICoKCSAqIEBwYXJhbQlzdHJpbmcJJHJhbmdlCgkgKiBAcmV0dXJuCXN0cmluZwlBZGp1c3RlZCByYW5nZSB2YWx1ZQoJICovCglwdWJsaWMgZnVuY3Rpb24gc2hyaW5rUmFuZ2VUb0ZpdCgkcmFuZ2UpIHsKCQkkbWF4Q29sID0gJHRoaXMtPmdldEhpZ2hlc3RDb2x1bW4oKTsKCQkkbWF4Um93ID0gJHRoaXMtPmdldEhpZ2hlc3RSb3coKTsKCQkkbWF4Q29sID0gUEhQRXhjZWxfQ2VsbDo6Y29sdW1uSW5kZXhGcm9tU3RyaW5nKCRtYXhDb2wpOwoKCQkkcmFuZ2VCbG9ja3MgPSBleHBsb2RlKCcgJywkcmFuZ2UpOwoJCWZvcmVhY2ggKCRyYW5nZUJsb2NrcyBhcyAmJHJhbmdlU2V0KSB7CgkJCSRyYW5nZUJvdW5kYXJpZXMgPSBQSFBFeGNlbF9DZWxsOjpnZXRSYW5nZUJvdW5kYXJpZXMoJHJhbmdlU2V0KTsKCgkJCWlmIChQSFBFeGNlbF9DZWxsOjpjb2x1bW5JbmRleEZyb21TdHJpbmcoJHJhbmdlQm91bmRhcmllc1swXVswXSkgPiAkbWF4Q29sKSB7ICRyYW5nZUJvdW5kYXJpZXNbMF1bMF0gPSBQSFBFeGNlbF9DZWxsOjpzdHJpbmdGcm9tQ29sdW1uSW5kZXgoJG1heENvbCk7IH0KCQkJaWYgKCRyYW5nZUJvdW5kYXJpZXNbMF1bMV0gPiAkbWF4Um93KSB7ICRyYW5nZUJvdW5kYXJpZXNbMF1bMV0gPSAkbWF4Um93OyB9CgkJCWlmIChQSFBFeGNlbF9DZWxsOjpjb2x1bW5JbmRleEZyb21TdHJpbmcoJHJhbmdlQm91bmRhcmllc1sxXVswXSkgPiAkbWF4Q29sKSB7ICRyYW5nZUJvdW5kYXJpZXNbMV1bMF0gPSBQSFBFeGNlbF9DZWxsOjpzdHJpbmdGcm9tQ29sdW1uSW5kZXgoJG1heENvbCk7IH0KCQkJaWYgKCRyYW5nZUJvdW5kYXJpZXNbMV1bMV0gPiAkbWF4Um93KSB7ICRyYW5nZUJvdW5kYXJpZXNbMV1bMV0gPSAkbWF4Um93OyB9CgkJCSRyYW5nZVNldCA9ICRyYW5nZUJvdW5kYXJpZXNbMF1bMF0uJHJhbmdlQm91bmRhcmllc1swXVsxXS4nOicuJHJhbmdlQm91bmRhcmllc1sxXVswXS4kcmFuZ2VCb3VuZGFyaWVzWzFdWzFdOwoJCX0KCQl1bnNldCgkcmFuZ2VTZXQpOwoJCSRzdFJhbmdlID0gaW1wbG9kZSgnICcsJHJhbmdlQmxvY2tzKTsKCgkJcmV0dXJuICRzdFJhbmdlOwoJfQoKCgkvKioKCSAqIEdldCB0YWIgY29sb3IKCSAqCgkgKiBAcmV0dXJuIFBIUEV4Y2VsX1N0eWxlX0NvbG9yCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRUYWJDb2xvcigpCgl7CgkJaWYgKCR0aGlzLT5fdGFiQ29sb3IgPT09IE5VTEwpCgkJCSR0aGlzLT5fdGFiQ29sb3IgPSBuZXcgUEhQRXhjZWxfU3R5bGVfQ29sb3IoKTsKCgkJcmV0dXJuICR0aGlzLT5fdGFiQ29sb3I7Cgl9CgoJLyoqCgkgKiBSZXNldCB0YWIgY29sb3IKCSAqCgkgKiBAcmV0dXJuIFBIUEV4Y2VsX1dvcmtzaGVldAoJICovCglwdWJsaWMgZnVuY3Rpb24gcmVzZXRUYWJDb2xvcigpCgl7CgkJJHRoaXMtPl90YWJDb2xvciA9IG51bGw7CgkJdW5zZXQoJHRoaXMtPl90YWJDb2xvcik7CgoJCXJldHVybiAkdGhpczsKCX0KCgkvKioKCSAqIFRhYiBjb2xvciBzZXQ/CgkgKgoJICogQHJldHVybiBib29sZWFuCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBpc1RhYkNvbG9yU2V0KCkKCXsKCQlyZXR1cm4gKCR0aGlzLT5fdGFiQ29sb3IgIT09IE5VTEwpOwoJfQoKCS8qKgoJICogQ29weSB3b3Jrc2hlZXQgKCE9IGNsb25lISkKCSAqCgkgKiBAcmV0dXJuIFBIUEV4Y2VsX1dvcmtzaGVldAoJICovCglwdWJsaWMgZnVuY3Rpb24gY29weSgpIHsKCQkkY29waWVkID0gY2xvbmUgJHRoaXM7CgoJCXJldHVybiAkY29waWVkOwoJfQoKCS8qKgoJICogSW1wbGVtZW50IFBIUCBfX2Nsb25lIHRvIGNyZWF0ZSBhIGRlZXAgY2xvbmUsIG5vdCBqdXN0IGEgc2hhbGxvdyBjb3B5LgoJICovCglwdWJsaWMgZnVuY3Rpb24gX19jbG9uZSgpIHsKCQlmb3JlYWNoICgkdGhpcyBhcyAka2V5ID0+ICR2YWwpIHsKCQkJaWYgKCRrZXkgPT0gJ19wYXJlbnQnKSB7CgkJCQljb250aW51ZTsKCQkJfQoKCQkJaWYgKGlzX29iamVjdCgkdmFsKSB8fCAoaXNfYXJyYXkoJHZhbCkpKSB7CgkJCQlpZiAoJGtleSA9PSAnX2NlbGxDb2xsZWN0aW9uJykgewoJCQkJCSRuZXdDb2xsZWN0aW9uID0gY2xvbmUgJHRoaXMtPl9jZWxsQ29sbGVjdGlvbjsKCQkJCQkkbmV3Q29sbGVjdGlvbi0+Y29weUNlbGxDb2xsZWN0aW9uKCR0aGlzKTsKCQkJCQkkdGhpcy0+X2NlbGxDb2xsZWN0aW9uID0gJG5ld0NvbGxlY3Rpb247CgkJCQl9IGVsc2VpZiAoJGtleSA9PSAnX2RyYXdpbmdDb2xsZWN0aW9uJykgewoJCQkJCSRuZXdDb2xsZWN0aW9uID0gY2xvbmUgJHRoaXMtPl9kcmF3aW5nQ29sbGVjdGlvbjsKCQkJCQkkdGhpcy0+X2RyYXdpbmdDb2xsZWN0aW9uID0gJG5ld0NvbGxlY3Rpb247CgkJCQl9IGVsc2UgewoJCQkJCSR0aGlzLT57JGtleX0gPSB1bnNlcmlhbGl6ZShzZXJpYWxpemUoJHZhbCkpOwoJCQkJfQoJCQl9CgkJfQoJfQp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Worksheet/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Worksheet/BaseDrawing.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIFBIUEV4Y2VsCiAqCiAqIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICoKICogQGNhdGVnb3J5ICAgUEhQRXhjZWwKICogQHBhY2thZ2UgICAgUEhQRXhjZWxfV29ya3NoZWV0CiAqIEBjb3B5cmlnaHQgIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwgKGh0dHA6Ly93d3cuY29kZXBsZXguY29tL1BIUEV4Y2VsKQogKiBAbGljZW5zZSAgICBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvb2xkLWxpY2Vuc2VzL2xncGwtMi4xLnR4dAlMR1BMCiAqIEB2ZXJzaW9uICAgIDEuNy43LCAyMDEyLTA1LTE5CiAqLwoKCi8qKgogKiBQSFBFeGNlbF9Xb3Jrc2hlZXRfQmFzZURyYXdpbmcKICoKICogQGNhdGVnb3J5ICAgUEhQRXhjZWwKICogQHBhY2thZ2UgICAgUEhQRXhjZWxfV29ya3NoZWV0CiAqIEBjb3B5cmlnaHQgIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwgKGh0dHA6Ly93d3cuY29kZXBsZXguY29tL1BIUEV4Y2VsKQogKi8KY2xhc3MgUEhQRXhjZWxfV29ya3NoZWV0X0Jhc2VEcmF3aW5nIGltcGxlbWVudHMgUEhQRXhjZWxfSUNvbXBhcmFibGUKewoJLyoqCgkgKiBJbWFnZSBjb3VudGVyCgkgKgoJICogQHZhciBpbnQKCSAqLwoJcHJpdmF0ZSBzdGF0aWMgJF9pbWFnZUNvdW50ZXIgPSAwOwoKCS8qKgoJICogSW1hZ2UgaW5kZXgKCSAqCgkgKiBAdmFyIGludAoJICovCglwcml2YXRlICRfaW1hZ2VJbmRleCA9IDA7CgoJLyoqCgkgKiBOYW1lCgkgKgoJICogQHZhciBzdHJpbmcKCSAqLwoJcHJvdGVjdGVkICRfbmFtZTsKCgkvKioKCSAqIERlc2NyaXB0aW9uCgkgKgoJICogQHZhciBzdHJpbmcKCSAqLwoJcHJvdGVjdGVkICRfZGVzY3JpcHRpb247CgoJLyoqCgkgKiBXb3Jrc2hlZXQKCSAqCgkgKiBAdmFyIFBIUEV4Y2VsX1dvcmtzaGVldAoJICovCglwcm90ZWN0ZWQgJF93b3Jrc2hlZXQ7CgoJLyoqCgkgKiBDb29yZGluYXRlcwoJICoKCSAqIEB2YXIgc3RyaW5nCgkgKi8KCXByb3RlY3RlZCAkX2Nvb3JkaW5hdGVzOwoKCS8qKgoJICogT2Zmc2V0IFgKCSAqCgkgKiBAdmFyIGludAoJICovCglwcm90ZWN0ZWQgJF9vZmZzZXRYOwoKCS8qKgoJICogT2Zmc2V0IFkKCSAqCgkgKiBAdmFyIGludAoJICovCglwcm90ZWN0ZWQgJF9vZmZzZXRZOwoKCS8qKgoJICogV2lkdGgKCSAqCgkgKiBAdmFyIGludAoJICovCglwcm90ZWN0ZWQgJF93aWR0aDsKCgkvKioKCSAqIEhlaWdodAoJICoKCSAqIEB2YXIgaW50CgkgKi8KCXByb3RlY3RlZCAkX2hlaWdodDsKCgkvKioKCSAqIFByb3BvcnRpb25hbCByZXNpemUKCSAqCgkgKiBAdmFyIGJvb2xlYW4KCSAqLwoJcHJvdGVjdGVkICRfcmVzaXplUHJvcG9ydGlvbmFsOwoKCS8qKgoJICogUm90YXRpb24KCSAqCgkgKiBAdmFyIGludAoJICovCglwcm90ZWN0ZWQgJF9yb3RhdGlvbjsKCgkvKioKCSAqIFNoYWRvdwoJICoKCSAqIEB2YXIgUEhQRXhjZWxfV29ya3NoZWV0X0RyYXdpbmdfU2hhZG93CgkgKi8KCXByb3RlY3RlZCAkX3NoYWRvdzsKCiAgICAvKioKICAgICAqIENyZWF0ZSBhIG5ldyBQSFBFeGNlbF9Xb3Jrc2hlZXRfQmFzZURyYXdpbmcKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCkKICAgIHsKICAgIAkvLyBJbml0aWFsaXNlIHZhbHVlcwogICAgCSR0aGlzLT5fbmFtZQkJCQk9ICcnOwogICAgCSR0aGlzLT5fZGVzY3JpcHRpb24JCQk9ICcnOwogICAgCSR0aGlzLT5fd29ya3NoZWV0CQkJPSBudWxsOwogICAgCSR0aGlzLT5fY29vcmRpbmF0ZXMJCQk9ICdBMSc7CiAgICAJJHRoaXMtPl9vZmZzZXRYCQkJCT0gMDsKICAgIAkkdGhpcy0+X29mZnNldFkJCQkJPSAwOwogICAgCSR0aGlzLT5fd2lkdGgJCQkJPSAwOwogICAgCSR0aGlzLT5faGVpZ2h0CQkJCT0gMDsKICAgIAkkdGhpcy0+X3Jlc2l6ZVByb3BvcnRpb25hbAk9IHRydWU7CiAgICAJJHRoaXMtPl9yb3RhdGlvbgkJCT0gMDsKICAgIAkkdGhpcy0+X3NoYWRvdwkJCQk9IG5ldyBQSFBFeGNlbF9Xb3Jrc2hlZXRfRHJhd2luZ19TaGFkb3coKTsKCgkJLy8gU2V0IGltYWdlIGluZGV4CgkJc2VsZjo6JF9pbWFnZUNvdW50ZXIrKzsKCQkkdGhpcy0+X2ltYWdlSW5kZXggCQkJPSBzZWxmOjokX2ltYWdlQ291bnRlcjsKICAgIH0KCiAgICAvKioKICAgICAqIEdldCBpbWFnZSBpbmRleAogICAgICoKICAgICAqIEByZXR1cm4gaW50CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRJbWFnZUluZGV4KCkgewogICAgCXJldHVybiAkdGhpcy0+X2ltYWdlSW5kZXg7CiAgICB9CgogICAgLyoqCiAgICAgKiBHZXQgTmFtZQogICAgICoKICAgICAqIEByZXR1cm4gc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXROYW1lKCkgewogICAgCXJldHVybiAkdGhpcy0+X25hbWU7CiAgICB9CgogICAgLyoqCiAgICAgKiBTZXQgTmFtZQogICAgICoKICAgICAqIEBwYXJhbSBzdHJpbmcgJHBWYWx1ZQogICAgICogQHJldHVybiBQSFBFeGNlbF9Xb3Jrc2hlZXRfQmFzZURyYXdpbmcKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHNldE5hbWUoJHBWYWx1ZSA9ICcnKSB7CiAgICAJJHRoaXMtPl9uYW1lID0gJHBWYWx1ZTsKICAgIAlyZXR1cm4gJHRoaXM7CiAgICB9CgogICAgLyoqCiAgICAgKiBHZXQgRGVzY3JpcHRpb24KICAgICAqCiAgICAgKiBAcmV0dXJuIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0RGVzY3JpcHRpb24oKSB7CiAgICAJcmV0dXJuICR0aGlzLT5fZGVzY3JpcHRpb247CiAgICB9CgogICAgLyoqCiAgICAgKiBTZXQgRGVzY3JpcHRpb24KICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nICRwVmFsdWUKICAgICAqIEByZXR1cm4gUEhQRXhjZWxfV29ya3NoZWV0X0Jhc2VEcmF3aW5nCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBzZXREZXNjcmlwdGlvbigkcFZhbHVlID0gJycpIHsKICAgIAkkdGhpcy0+X2Rlc2NyaXB0aW9uID0gJHBWYWx1ZTsKICAgIAlyZXR1cm4gJHRoaXM7CiAgICB9CgogICAgLyoqCiAgICAgKiBHZXQgV29ya3NoZWV0CiAgICAgKgogICAgICogQHJldHVybiBQSFBFeGNlbF9Xb3Jrc2hlZXQKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldFdvcmtzaGVldCgpIHsKICAgIAlyZXR1cm4gJHRoaXMtPl93b3Jrc2hlZXQ7CiAgICB9CgogICAgLyoqCiAgICAgKiBTZXQgV29ya3NoZWV0CiAgICAgKgogICAgICogQHBhcmFtIAlQSFBFeGNlbF9Xb3Jrc2hlZXQgCSRwVmFsdWUKICAgICAqIEBwYXJhbSAJYm9vbAkJCQkkcE92ZXJyaWRlT2xkCUlmIGEgV29ya3NoZWV0IGhhcyBhbHJlYWR5IGJlZW4gYXNzaWduZWQsIG92ZXJ3cml0ZSBpdCBhbmQgcmVtb3ZlIGltYWdlIGZyb20gb2xkIFdvcmtzaGVldD8KICAgICAqIEB0aHJvd3MgCUV4Y2VwdGlvbgogICAgICogQHJldHVybiBQSFBFeGNlbF9Xb3Jrc2hlZXRfQmFzZURyYXdpbmcKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHNldFdvcmtzaGVldChQSFBFeGNlbF9Xb3Jrc2hlZXQgJHBWYWx1ZSA9IG51bGwsICRwT3ZlcnJpZGVPbGQgPSBmYWxzZSkgewogICAgCWlmIChpc19udWxsKCR0aGlzLT5fd29ya3NoZWV0KSkgewogICAgCQkvLyBBZGQgZHJhd2luZyB0byBQSFBFeGNlbF9Xb3Jrc2hlZXQKCSAgICAJJHRoaXMtPl93b3Jrc2hlZXQgPSAkcFZhbHVlOwoJICAgIAkkdGhpcy0+X3dvcmtzaGVldC0+Z2V0Q2VsbCgkdGhpcy0+X2Nvb3JkaW5hdGVzKTsKCSAgICAJJHRoaXMtPl93b3Jrc2hlZXQtPmdldERyYXdpbmdDb2xsZWN0aW9uKCktPmFwcGVuZCgkdGhpcyk7CiAgICAJfSBlbHNlIHsKICAgIAkJaWYgKCRwT3ZlcnJpZGVPbGQpIHsKICAgIAkJCS8vIFJlbW92ZSBkcmF3aW5nIGZyb20gb2xkIFBIUEV4Y2VsX1dvcmtzaGVldAogICAgCQkJJGl0ZXJhdG9yID0gJHRoaXMtPl93b3Jrc2hlZXQtPmdldERyYXdpbmdDb2xsZWN0aW9uKCktPmdldEl0ZXJhdG9yKCk7CgogICAgCQkJd2hpbGUgKCRpdGVyYXRvci0+dmFsaWQoKSkgewogICAgCQkJCWlmICgkaXRlcmF0b3ItPmN1cnJlbnQoKS0+Z2V0SGFzaENvZGUoKSA9PSAkdGhpcy0+Z2V0SGFzaENvZGUoKSkgewogICAgCQkJCQkkdGhpcy0+X3dvcmtzaGVldC0+Z2V0RHJhd2luZ0NvbGxlY3Rpb24oKS0+b2Zmc2V0VW5zZXQoICRpdGVyYXRvci0+a2V5KCkgKTsKICAgIAkJCQkJJHRoaXMtPl93b3Jrc2hlZXQgPSBudWxsOwogICAgCQkJCQlicmVhazsKICAgIAkJCQl9CiAgICAJCQl9CgogICAgCQkJLy8gU2V0IG5ldyBQSFBFeGNlbF9Xb3Jrc2hlZXQKICAgIAkJCSR0aGlzLT5zZXRXb3Jrc2hlZXQoJHBWYWx1ZSk7CiAgICAJCX0gZWxzZSB7CiAgICAJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCJBIFBIUEV4Y2VsX1dvcmtzaGVldCBoYXMgYWxyZWFkeSBiZWVuIGFzc2lnbmVkLiBEcmF3aW5ncyBjYW4gb25seSBleGlzdCBvbiBvbmUgUEhQRXhjZWxfV29ya3NoZWV0LiIpOwogICAgCQl9CiAgICAJfQogICAgCXJldHVybiAkdGhpczsKICAgIH0KCiAgICAvKioKICAgICAqIEdldCBDb29yZGluYXRlcwogICAgICoKICAgICAqIEByZXR1cm4gc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRDb29yZGluYXRlcygpIHsKICAgIAlyZXR1cm4gJHRoaXMtPl9jb29yZGluYXRlczsKICAgIH0KCiAgICAvKioKICAgICAqIFNldCBDb29yZGluYXRlcwogICAgICoKICAgICAqIEBwYXJhbSBzdHJpbmcgJHBWYWx1ZQogICAgICogQHJldHVybiBQSFBFeGNlbF9Xb3Jrc2hlZXRfQmFzZURyYXdpbmcKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHNldENvb3JkaW5hdGVzKCRwVmFsdWUgPSAnQTEnKSB7CiAgICAJJHRoaXMtPl9jb29yZGluYXRlcyA9ICRwVmFsdWU7CiAgICAJcmV0dXJuICR0aGlzOwogICAgfQoKICAgIC8qKgogICAgICogR2V0IE9mZnNldFgKICAgICAqCiAgICAgKiBAcmV0dXJuIGludAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0T2Zmc2V0WCgpIHsKICAgIAlyZXR1cm4gJHRoaXMtPl9vZmZzZXRYOwogICAgfQoKICAgIC8qKgogICAgICogU2V0IE9mZnNldFgKICAgICAqCiAgICAgKiBAcGFyYW0gaW50ICRwVmFsdWUKICAgICAqIEByZXR1cm4gUEhQRXhjZWxfV29ya3NoZWV0X0Jhc2VEcmF3aW5nCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBzZXRPZmZzZXRYKCRwVmFsdWUgPSAwKSB7CiAgICAJJHRoaXMtPl9vZmZzZXRYID0gJHBWYWx1ZTsKICAgIAlyZXR1cm4gJHRoaXM7CiAgICB9CgogICAgLyoqCiAgICAgKiBHZXQgT2Zmc2V0WQogICAgICoKICAgICAqIEByZXR1cm4gaW50CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRPZmZzZXRZKCkgewogICAgCXJldHVybiAkdGhpcy0+X29mZnNldFk7CiAgICB9CgogICAgLyoqCiAgICAgKiBTZXQgT2Zmc2V0WQogICAgICoKICAgICAqIEBwYXJhbSBpbnQgJHBWYWx1ZQogICAgICogQHJldHVybiBQSFBFeGNlbF9Xb3Jrc2hlZXRfQmFzZURyYXdpbmcKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHNldE9mZnNldFkoJHBWYWx1ZSA9IDApIHsKICAgIAkkdGhpcy0+X29mZnNldFkgPSAkcFZhbHVlOwogICAgCXJldHVybiAkdGhpczsKICAgIH0KCiAgICAvKioKICAgICAqIEdldCBXaWR0aAogICAgICoKICAgICAqIEByZXR1cm4gaW50CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRXaWR0aCgpIHsKICAgIAlyZXR1cm4gJHRoaXMtPl93aWR0aDsKICAgIH0KCiAgICAvKioKICAgICAqIFNldCBXaWR0aAogICAgICoKICAgICAqIEBwYXJhbSBpbnQgJHBWYWx1ZQogICAgICogQHJldHVybiBQSFBFeGNlbF9Xb3Jrc2hlZXRfQmFzZURyYXdpbmcKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHNldFdpZHRoKCRwVmFsdWUgPSAwKSB7CiAgICAJLy8gUmVzaXplIHByb3BvcnRpb25hbD8KICAgIAlpZiAoJHRoaXMtPl9yZXNpemVQcm9wb3J0aW9uYWwgJiYgJHBWYWx1ZSAhPSAwKSB7CiAgICAJCSRyYXRpbyA9ICR0aGlzLT5faGVpZ2h0IC8gJHRoaXMtPl93aWR0aDsKICAgIAkJJHRoaXMtPl9oZWlnaHQgPSByb3VuZCgkcmF0aW8gKiAkcFZhbHVlKTsKICAgIAl9CgogICAgCS8vIFNldCB3aWR0aAogICAgCSR0aGlzLT5fd2lkdGggPSAkcFZhbHVlOwoKICAgIAlyZXR1cm4gJHRoaXM7CiAgICB9CgogICAgLyoqCiAgICAgKiBHZXQgSGVpZ2h0CiAgICAgKgogICAgICogQHJldHVybiBpbnQKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldEhlaWdodCgpIHsKICAgIAlyZXR1cm4gJHRoaXMtPl9oZWlnaHQ7CiAgICB9CgogICAgLyoqCiAgICAgKiBTZXQgSGVpZ2h0CiAgICAgKgogICAgICogQHBhcmFtIGludCAkcFZhbHVlCiAgICAgKiBAcmV0dXJuIFBIUEV4Y2VsX1dvcmtzaGVldF9CYXNlRHJhd2luZwogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gc2V0SGVpZ2h0KCRwVmFsdWUgPSAwKSB7CiAgICAJLy8gUmVzaXplIHByb3BvcnRpb25hbD8KICAgIAlpZiAoJHRoaXMtPl9yZXNpemVQcm9wb3J0aW9uYWwgJiYgJHBWYWx1ZSAhPSAwKSB7CiAgICAJCSRyYXRpbyA9ICR0aGlzLT5fd2lkdGggLyAkdGhpcy0+X2hlaWdodDsKICAgIAkJJHRoaXMtPl93aWR0aCA9IHJvdW5kKCRyYXRpbyAqICRwVmFsdWUpOwogICAgCX0KCiAgICAJLy8gU2V0IGhlaWdodAogICAgCSR0aGlzLT5faGVpZ2h0ID0gJHBWYWx1ZTsKCiAgICAJcmV0dXJuICR0aGlzOwogICAgfQoKICAgIC8qKgogICAgICogU2V0IHdpZHRoIGFuZCBoZWlnaHQgd2l0aCBwcm9wb3J0aW9uYWwgcmVzaXplCgkgKiBFeGFtcGxlOgoJICogPGNvZGU+CgkgKiAkb2JqRHJhd2luZy0+c2V0UmVzaXplUHJvcG9ydGlvbmFsKHRydWUpOwoJICogJG9iakRyYXdpbmctPnNldFdpZHRoQW5kSGVpZ2h0KDE2MCwxMjApOwoJICogPC9jb2RlPgoJICoKICAgICAqIEBhdXRob3IgVmluY2VudEBsdW8gTVNOOmtlbGVfMTAwQGhvdG1haWwuY29tCiAgICAgKiBAcGFyYW0gaW50ICR3aWR0aAogICAgICogQHBhcmFtIGludCAkaGVpZ2h0CiAgICAgKiBAcmV0dXJuIFBIUEV4Y2VsX1dvcmtzaGVldF9CYXNlRHJhd2luZwogICAgICovCglwdWJsaWMgZnVuY3Rpb24gc2V0V2lkdGhBbmRIZWlnaHQoJHdpZHRoID0gMCwgJGhlaWdodCA9IDApIHsKCQkkeHJhdGlvID0gJHdpZHRoIC8gJHRoaXMtPl93aWR0aDsKCQkkeXJhdGlvID0gJGhlaWdodCAvICR0aGlzLT5faGVpZ2h0OwoJCWlmICgkdGhpcy0+X3Jlc2l6ZVByb3BvcnRpb25hbCAmJiAhKCR3aWR0aCA9PSAwIHx8ICRoZWlnaHQgPT0gMCkpIHsKCQkJaWYgKCgkeHJhdGlvICogJHRoaXMtPl9oZWlnaHQpIDwgJGhlaWdodCkgewoJCQkJJHRoaXMtPl9oZWlnaHQgPSBjZWlsKCR4cmF0aW8gKiAkdGhpcy0+X2hlaWdodCk7CgkJCQkkdGhpcy0+X3dpZHRoICA9ICR3aWR0aDsKCQkJfSBlbHNlIHsKCQkJCSR0aGlzLT5fd2lkdGgJPSBjZWlsKCR5cmF0aW8gKiAkdGhpcy0+X3dpZHRoKTsKCQkJCSR0aGlzLT5faGVpZ2h0CT0gJGhlaWdodDsKCQkJfQoJCX0KCQlyZXR1cm4gJHRoaXM7Cgl9CgogICAgLyoqCiAgICAgKiBHZXQgUmVzaXplUHJvcG9ydGlvbmFsCiAgICAgKgogICAgICogQHJldHVybiBib29sZWFuCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRSZXNpemVQcm9wb3J0aW9uYWwoKSB7CiAgICAJcmV0dXJuICR0aGlzLT5fcmVzaXplUHJvcG9ydGlvbmFsOwogICAgfQoKICAgIC8qKgogICAgICogU2V0IFJlc2l6ZVByb3BvcnRpb25hbAogICAgICoKICAgICAqIEBwYXJhbSBib29sZWFuICRwVmFsdWUKICAgICAqIEByZXR1cm4gUEhQRXhjZWxfV29ya3NoZWV0X0Jhc2VEcmF3aW5nCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBzZXRSZXNpemVQcm9wb3J0aW9uYWwoJHBWYWx1ZSA9IHRydWUpIHsKICAgIAkkdGhpcy0+X3Jlc2l6ZVByb3BvcnRpb25hbCA9ICRwVmFsdWU7CiAgICAJcmV0dXJuICR0aGlzOwogICAgfQoKICAgIC8qKgogICAgICogR2V0IFJvdGF0aW9uCiAgICAgKgogICAgICogQHJldHVybiBpbnQKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldFJvdGF0aW9uKCkgewogICAgCXJldHVybiAkdGhpcy0+X3JvdGF0aW9uOwogICAgfQoKICAgIC8qKgogICAgICogU2V0IFJvdGF0aW9uCiAgICAgKgogICAgICogQHBhcmFtIGludCAkcFZhbHVlCiAgICAgKiBAcmV0dXJuIFBIUEV4Y2VsX1dvcmtzaGVldF9CYXNlRHJhd2luZwogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gc2V0Um90YXRpb24oJHBWYWx1ZSA9IDApIHsKICAgIAkkdGhpcy0+X3JvdGF0aW9uID0gJHBWYWx1ZTsKICAgIAlyZXR1cm4gJHRoaXM7CiAgICB9CgogICAgLyoqCiAgICAgKiBHZXQgU2hhZG93CiAgICAgKgogICAgICogQHJldHVybiBQSFBFeGNlbF9Xb3Jrc2hlZXRfRHJhd2luZ19TaGFkb3cKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldFNoYWRvdygpIHsKICAgIAlyZXR1cm4gJHRoaXMtPl9zaGFkb3c7CiAgICB9CgogICAgLyoqCiAgICAgKiBTZXQgU2hhZG93CiAgICAgKgogICAgICogQHBhcmFtIAlQSFBFeGNlbF9Xb3Jrc2hlZXRfRHJhd2luZ19TaGFkb3cgJHBWYWx1ZQogICAgICogQHRocm93cyAJRXhjZXB0aW9uCiAgICAgKiBAcmV0dXJuIFBIUEV4Y2VsX1dvcmtzaGVldF9CYXNlRHJhd2luZwogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gc2V0U2hhZG93KFBIUEV4Y2VsX1dvcmtzaGVldF9EcmF3aW5nX1NoYWRvdyAkcFZhbHVlID0gbnVsbCkgewogICAJCSR0aGlzLT5fc2hhZG93ID0gJHBWYWx1ZTsKICAgCQlyZXR1cm4gJHRoaXM7CiAgICB9CgoJLyoqCgkgKiBHZXQgaGFzaCBjb2RlCgkgKgoJICogQHJldHVybiBzdHJpbmcJSGFzaCBjb2RlCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRIYXNoQ29kZSgpIHsKICAgIAlyZXR1cm4gbWQ1KAogICAgCQkgICR0aGlzLT5fbmFtZQogICAgCQkuICR0aGlzLT5fZGVzY3JpcHRpb24KICAgIAkJLiAkdGhpcy0+X3dvcmtzaGVldC0+Z2V0SGFzaENvZGUoKQogICAgCQkuICR0aGlzLT5fY29vcmRpbmF0ZXMKICAgIAkJLiAkdGhpcy0+X29mZnNldFgKICAgIAkJLiAkdGhpcy0+X29mZnNldFkKICAgIAkJLiAkdGhpcy0+X3dpZHRoCiAgICAJCS4gJHRoaXMtPl9oZWlnaHQKICAgIAkJLiAkdGhpcy0+X3JvdGF0aW9uCiAgICAJCS4gJHRoaXMtPl9zaGFkb3ctPmdldEhhc2hDb2RlKCkKICAgIAkJLiBfX0NMQVNTX18KICAgIAkpOwogICAgfQoKCS8qKgoJICogSW1wbGVtZW50IFBIUCBfX2Nsb25lIHRvIGNyZWF0ZSBhIGRlZXAgY2xvbmUsIG5vdCBqdXN0IGEgc2hhbGxvdyBjb3B5LgoJICovCglwdWJsaWMgZnVuY3Rpb24gX19jbG9uZSgpIHsKCQkkdmFycyA9IGdldF9vYmplY3RfdmFycygkdGhpcyk7CgkJZm9yZWFjaCAoJHZhcnMgYXMgJGtleSA9PiAkdmFsdWUpIHsKCQkJaWYgKGlzX29iamVjdCgkdmFsdWUpKSB7CgkJCQkkdGhpcy0+JGtleSA9IGNsb25lICR2YWx1ZTsKCQkJfSBlbHNlIHsKCQkJCSR0aGlzLT4ka2V5ID0gJHZhbHVlOwoJCQl9CgkJfQoJfQp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Worksheet/CellIterator.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIFBIUEV4Y2VsCiAqCiAqIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICoKICogQGNhdGVnb3J5ICAgUEhQRXhjZWwKICogQHBhY2thZ2UgICAgUEhQRXhjZWxfV29ya3NoZWV0CiAqIEBjb3B5cmlnaHQgIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwgKGh0dHA6Ly93d3cuY29kZXBsZXguY29tL1BIUEV4Y2VsKQogKiBAbGljZW5zZSAgICBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvb2xkLWxpY2Vuc2VzL2xncGwtMi4xLnR4dAlMR1BMCiAqIEB2ZXJzaW9uICAgIDEuNy43LCAyMDEyLTA1LTE5CiAqLwoKCi8qKgogKiBQSFBFeGNlbF9Xb3Jrc2hlZXRfQ2VsbEl0ZXJhdG9yCiAqCiAqIFVzZWQgdG8gaXRlcmF0ZSByb3dzIGluIGEgUEhQRXhjZWxfV29ya3NoZWV0CiAqCiAqIEBjYXRlZ29yeSAgIFBIUEV4Y2VsCiAqIEBwYWNrYWdlICAgIFBIUEV4Y2VsX1dvcmtzaGVldAogKiBAY29weXJpZ2h0ICBDb3B5cmlnaHQgKGMpIDIwMDYgLSAyMDEyIFBIUEV4Y2VsIChodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9QSFBFeGNlbCkKICovCmNsYXNzIFBIUEV4Y2VsX1dvcmtzaGVldF9DZWxsSXRlcmF0b3IgaW1wbGVtZW50cyBJdGVyYXRvcgp7CgkvKioKCSAqIFBIUEV4Y2VsX1dvcmtzaGVldCB0byBpdGVyYXRlCgkgKgoJICogQHZhciBQSFBFeGNlbF9Xb3Jrc2hlZXQKCSAqLwoJcHJpdmF0ZSAkX3N1YmplY3Q7CgoJLyoqCgkgKiBSb3cgaW5kZXgKCSAqCgkgKiBAdmFyIGludAoJICovCglwcml2YXRlICRfcm93SW5kZXg7CgoJLyoqCgkgKiBDdXJyZW50IGl0ZXJhdG9yIHBvc2l0aW9uCgkgKgoJICogQHZhciBpbnQKCSAqLwoJcHJpdmF0ZSAkX3Bvc2l0aW9uID0gMDsKCgkvKioKCSAqIExvb3Agb25seSBleGlzdGluZyBjZWxscwoJICoKCSAqIEB2YXIgYm9vbGVhbgoJICovCglwcml2YXRlICRfb25seUV4aXN0aW5nQ2VsbHMgPSB0cnVlOwoKCS8qKgoJICogQ3JlYXRlIGEgbmV3IGNlbGwgaXRlcmF0b3IKCSAqCgkgKiBAcGFyYW0gUEhQRXhjZWxfV29ya3NoZWV0IAkJJHN1YmplY3QKCSAqIEBwYXJhbSBpbnQJCQkJCQkkcm93SW5kZXgKCSAqLwoJcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KFBIUEV4Y2VsX1dvcmtzaGVldCAkc3ViamVjdCA9IG51bGwsICRyb3dJbmRleCA9IDEpIHsKCQkvLyBTZXQgc3ViamVjdCBhbmQgcm93IGluZGV4CgkJJHRoaXMtPl9zdWJqZWN0IAk9ICRzdWJqZWN0OwoJCSR0aGlzLT5fcm93SW5kZXggCT0gJHJvd0luZGV4OwoJfQoKCS8qKgoJICogRGVzdHJ1Y3RvcgoJICovCglwdWJsaWMgZnVuY3Rpb24gX19kZXN0cnVjdCgpIHsKCQl1bnNldCgkdGhpcy0+X3N1YmplY3QpOwoJfQoKCS8qKgoJICogUmV3aW5kIGl0ZXJhdG9yCgkgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiByZXdpbmQoKSB7CiAgICAgICAgJHRoaXMtPl9wb3NpdGlvbiA9IDA7CiAgICB9CgogICAgLyoqCiAgICAgKiBDdXJyZW50IFBIUEV4Y2VsX0NlbGwKICAgICAqCiAgICAgKiBAcmV0dXJuIFBIUEV4Y2VsX0NlbGwKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGN1cnJlbnQoKSB7CgkJcmV0dXJuICR0aGlzLT5fc3ViamVjdC0+Z2V0Q2VsbEJ5Q29sdW1uQW5kUm93KCR0aGlzLT5fcG9zaXRpb24sICR0aGlzLT5fcm93SW5kZXgpOwogICAgfQoKICAgIC8qKgogICAgICogQ3VycmVudCBrZXkKICAgICAqCiAgICAgKiBAcmV0dXJuIGludAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24ga2V5KCkgewogICAgICAgIHJldHVybiAkdGhpcy0+X3Bvc2l0aW9uOwogICAgfQoKICAgIC8qKgogICAgICogTmV4dCB2YWx1ZQogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gbmV4dCgpIHsKICAgICAgICArKyR0aGlzLT5fcG9zaXRpb247CiAgICB9CgogICAgLyoqCiAgICAgKiBBcmUgdGhlcmUgYW55IG1vcmUgUEhQRXhjZWxfQ2VsbCBpbnN0YW5jZXMgYXZhaWxhYmxlPwogICAgICoKICAgICAqIEByZXR1cm4gYm9vbGVhbgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gdmFsaWQoKSB7CiAgICAgICAgLy8gY29sdW1uSW5kZXhGcm9tU3RyaW5nKCkgcmV0dXJucyBhbiBpbmRleCBiYXNlZCBhdCBvbmUsCiAgICAgICAgLy8gdHJlYXQgaXQgYXMgYSBjb3VudCB3aGVuIGNvbXBhcmluZyBpdCB0byB0aGUgYmFzZSB6ZXJvCiAgICAgICAgLy8gcG9zaXRpb24uCiAgICAgICAgJGNvbHVtbkNvdW50ID0gUEhQRXhjZWxfQ2VsbDo6Y29sdW1uSW5kZXhGcm9tU3RyaW5nKCR0aGlzLT5fc3ViamVjdC0+Z2V0SGlnaGVzdENvbHVtbigpKTsKCiAgICAgICAgaWYgKCR0aGlzLT5fb25seUV4aXN0aW5nQ2VsbHMpIHsKICAgICAgICAgICAgLy8gSWYgd2UgYXJlbid0IGxvb2tpbmcgYXQgYW4gZXhpc3RpbmcgY2VsbCwgZWl0aGVyCiAgICAgICAgICAgIC8vIGJlY2F1c2UgdGhlIGZpcnN0IGNvbHVtbiBkb2Vzbid0IGV4aXN0IG9yIG5leHQoKSBoYXMKICAgICAgICAgICAgLy8gYmVlbiBjYWxsZWQgb250byBhIG5vbmV4aXN0ZW50IGNlbGwsIHRoZW4gbG9vcCB1bnRpbCB3ZQogICAgICAgICAgICAvLyBmaW5kIG9uZSwgb3IgcGFzcyB0aGUgbGFzdCBjb2x1bW4uCiAgICAgICAgICAgIHdoaWxlICgkdGhpcy0+X3Bvc2l0aW9uIDwgJGNvbHVtbkNvdW50ICYmCiAgICAgICAgICAgICAgICAgICAhJHRoaXMtPl9zdWJqZWN0LT5jZWxsRXhpc3RzQnlDb2x1bW5BbmRSb3coJHRoaXMtPl9wb3NpdGlvbiwgJHRoaXMtPl9yb3dJbmRleCkpIHsKICAgICAgICAgICAgICAgICsrJHRoaXMtPl9wb3NpdGlvbjsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICR0aGlzLT5fcG9zaXRpb24gPCAkY29sdW1uQ291bnQ7CiAgICB9CgoJLyoqCgkgKiBHZXQgbG9vcCBvbmx5IGV4aXN0aW5nIGNlbGxzCgkgKgoJICogQHJldHVybiBib29sZWFuCgkgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRJdGVyYXRlT25seUV4aXN0aW5nQ2VsbHMoKSB7CiAgICAJcmV0dXJuICR0aGlzLT5fb25seUV4aXN0aW5nQ2VsbHM7CiAgICB9CgoJLyoqCgkgKiBTZXQgdGhlIGl0ZXJhdG9yIHRvIGxvb3Agb25seSBleGlzdGluZyBjZWxscwoJICoKCSAqIEBwYXJhbQlib29sZWFuCQkkdmFsdWUKCSAqLwogICAgcHVibGljIGZ1bmN0aW9uIHNldEl0ZXJhdGVPbmx5RXhpc3RpbmdDZWxscygkdmFsdWUgPSB0cnVlKSB7CiAgICAJJHRoaXMtPl9vbmx5RXhpc3RpbmdDZWxscyA9ICR2YWx1ZTsKICAgIH0KfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Worksheet/ColumnDimension.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIFBIUEV4Y2VsCiAqCiAqIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICoKICogQGNhdGVnb3J5ICAgUEhQRXhjZWwKICogQHBhY2thZ2UgICAgUEhQRXhjZWxfV29ya3NoZWV0CiAqIEBjb3B5cmlnaHQgIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwgKGh0dHA6Ly93d3cuY29kZXBsZXguY29tL1BIUEV4Y2VsKQogKiBAbGljZW5zZSAgICBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvb2xkLWxpY2Vuc2VzL2xncGwtMi4xLnR4dAlMR1BMCiAqIEB2ZXJzaW9uICAgIDEuNy43LCAyMDEyLTA1LTE5CiAqLwoKCi8qKgogKiBQSFBFeGNlbF9Xb3Jrc2hlZXRfQ29sdW1uRGltZW5zaW9uCiAqCiAqIEBjYXRlZ29yeSAgIFBIUEV4Y2VsCiAqIEBwYWNrYWdlICAgIFBIUEV4Y2VsX1dvcmtzaGVldAogKiBAY29weXJpZ2h0ICBDb3B5cmlnaHQgKGMpIDIwMDYgLSAyMDEyIFBIUEV4Y2VsIChodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9QSFBFeGNlbCkKICovCmNsYXNzIFBIUEV4Y2VsX1dvcmtzaGVldF9Db2x1bW5EaW1lbnNpb24KewoJLyoqCgkgKiBDb2x1bW4gaW5kZXgKCSAqCgkgKiBAdmFyIGludAoJICovCglwcml2YXRlICRfY29sdW1uSW5kZXg7CgoJLyoqCgkgKiBDb2x1bW4gd2lkdGgKCSAqCgkgKiBXaGVuIHRoaXMgaXMgc2V0IHRvIGEgbmVnYXRpdmUgdmFsdWUsIHRoZSBjb2x1bW4gd2lkdGggc2hvdWxkIGJlIGlnbm9yZWQgYnkgSVdyaXRlcgoJICoKCSAqIEB2YXIgZG91YmxlCgkgKi8KCXByaXZhdGUgJF93aWR0aAkJCT0gLTE7CgoJLyoqCgkgKiBBdXRvIHNpemU/CgkgKgoJICogQHZhciBib29sCgkgKi8KCXByaXZhdGUgJF9hdXRvU2l6ZQkJPSBmYWxzZTsKCgkvKioKCSAqIFZpc2libGU/CgkgKgoJICogQHZhciBib29sCgkgKi8KCXByaXZhdGUgJF92aXNpYmxlCQk9IHRydWU7CgoJLyoqCgkgKiBPdXRsaW5lIGxldmVsCgkgKgoJICogQHZhciBpbnQKCSAqLwoJcHJpdmF0ZSAkX291dGxpbmVMZXZlbAk9IDA7CgoJLyoqCgkgKiBDb2xsYXBzZWQKCSAqCgkgKiBAdmFyIGJvb2wKCSAqLwoJcHJpdmF0ZSAkX2NvbGxhcHNlZAkJPSBmYWxzZTsKCgkvKioKCSAqIEluZGV4IHRvIGNlbGxYZgoJICoKCSAqIEB2YXIgaW50CgkgKi8KCXByaXZhdGUgJF94ZkluZGV4OwoKICAgIC8qKgogICAgICogQ3JlYXRlIGEgbmV3IFBIUEV4Y2VsX1dvcmtzaGVldF9Db2x1bW5EaW1lbnNpb24KICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nICRwSW5kZXggQ2hhcmFjdGVyIGNvbHVtbiBpbmRleAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJHBJbmRleCA9ICdBJykKICAgIHsKICAgIAkvLyBJbml0aWFsaXNlIHZhbHVlcwogICAgCSR0aGlzLT5fY29sdW1uSW5kZXgJCT0gJHBJbmRleDsKCgkJLy8gc2V0IGRlZmF1bHQgaW5kZXggdG8gY2VsbFhmCgkJJHRoaXMtPl94ZkluZGV4ID0gMDsKICAgIH0KCiAgICAvKioKICAgICAqIEdldCBDb2x1bW5JbmRleAogICAgICoKICAgICAqIEByZXR1cm4gc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRDb2x1bW5JbmRleCgpIHsKICAgIAlyZXR1cm4gJHRoaXMtPl9jb2x1bW5JbmRleDsKICAgIH0KCiAgICAvKioKICAgICAqIFNldCBDb2x1bW5JbmRleAogICAgICoKICAgICAqIEBwYXJhbSBzdHJpbmcgJHBWYWx1ZQogICAgICogQHJldHVybiBQSFBFeGNlbF9Xb3Jrc2hlZXRfQ29sdW1uRGltZW5zaW9uCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBzZXRDb2x1bW5JbmRleCgkcFZhbHVlKSB7CiAgICAJJHRoaXMtPl9jb2x1bW5JbmRleCA9ICRwVmFsdWU7CiAgICAJcmV0dXJuICR0aGlzOwogICAgfQoKICAgIC8qKgogICAgICogR2V0IFdpZHRoCiAgICAgKgogICAgICogQHJldHVybiBkb3VibGUKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldFdpZHRoKCkgewogICAgCXJldHVybiAkdGhpcy0+X3dpZHRoOwogICAgfQoKICAgIC8qKgogICAgICogU2V0IFdpZHRoCiAgICAgKgogICAgICogQHBhcmFtIGRvdWJsZSAkcFZhbHVlCiAgICAgKiBAcmV0dXJuIFBIUEV4Y2VsX1dvcmtzaGVldF9Db2x1bW5EaW1lbnNpb24KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHNldFdpZHRoKCRwVmFsdWUgPSAtMSkgewogICAgCSR0aGlzLT5fd2lkdGggPSAkcFZhbHVlOwogICAgCXJldHVybiAkdGhpczsKICAgIH0KCiAgICAvKioKICAgICAqIEdldCBBdXRvIFNpemUKICAgICAqCiAgICAgKiBAcmV0dXJuIGJvb2wKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldEF1dG9TaXplKCkgewogICAgCXJldHVybiAkdGhpcy0+X2F1dG9TaXplOwogICAgfQoKICAgIC8qKgogICAgICogU2V0IEF1dG8gU2l6ZQogICAgICoKICAgICAqIEBwYXJhbSBib29sICRwVmFsdWUKICAgICAqIEByZXR1cm4gUEhQRXhjZWxfV29ya3NoZWV0X0NvbHVtbkRpbWVuc2lvbgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gc2V0QXV0b1NpemUoJHBWYWx1ZSA9IGZhbHNlKSB7CiAgICAJJHRoaXMtPl9hdXRvU2l6ZSA9ICRwVmFsdWU7CiAgICAJcmV0dXJuICR0aGlzOwogICAgfQoKICAgIC8qKgogICAgICogR2V0IFZpc2libGUKICAgICAqCiAgICAgKiBAcmV0dXJuIGJvb2wKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldFZpc2libGUoKSB7CiAgICAJcmV0dXJuICR0aGlzLT5fdmlzaWJsZTsKICAgIH0KCiAgICAvKioKICAgICAqIFNldCBWaXNpYmxlCiAgICAgKgogICAgICogQHBhcmFtIGJvb2wgJHBWYWx1ZQogICAgICogQHJldHVybiBQSFBFeGNlbF9Xb3Jrc2hlZXRfQ29sdW1uRGltZW5zaW9uCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBzZXRWaXNpYmxlKCRwVmFsdWUgPSB0cnVlKSB7CiAgICAJJHRoaXMtPl92aXNpYmxlID0gJHBWYWx1ZTsKICAgIAlyZXR1cm4gJHRoaXM7CiAgICB9CgogICAgLyoqCiAgICAgKiBHZXQgT3V0bGluZSBMZXZlbAogICAgICoKICAgICAqIEByZXR1cm4gaW50CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRPdXRsaW5lTGV2ZWwoKSB7CiAgICAJcmV0dXJuICR0aGlzLT5fb3V0bGluZUxldmVsOwogICAgfQoKICAgIC8qKgogICAgICogU2V0IE91dGxpbmUgTGV2ZWwKICAgICAqCiAgICAgKiBWYWx1ZSBtdXN0IGJlIGJldHdlZW4gMCBhbmQgNwogICAgICoKICAgICAqIEBwYXJhbSBpbnQgJHBWYWx1ZQogICAgICogQHRocm93cyBFeGNlcHRpb24KICAgICAqIEByZXR1cm4gUEhQRXhjZWxfV29ya3NoZWV0X0NvbHVtbkRpbWVuc2lvbgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gc2V0T3V0bGluZUxldmVsKCRwVmFsdWUpIHsKICAgIAlpZiAoJHBWYWx1ZSA8IDAgfHwgJHBWYWx1ZSA+IDcpIHsKICAgIAkJdGhyb3cgbmV3IEV4Y2VwdGlvbigiT3V0bGluZSBsZXZlbCBtdXN0IHJhbmdlIGJldHdlZW4gMCBhbmQgNy4iKTsKICAgIAl9CgogICAgCSR0aGlzLT5fb3V0bGluZUxldmVsID0gJHBWYWx1ZTsKICAgIAlyZXR1cm4gJHRoaXM7CiAgICB9CgogICAgLyoqCiAgICAgKiBHZXQgQ29sbGFwc2VkCiAgICAgKgogICAgICogQHJldHVybiBib29sCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRDb2xsYXBzZWQoKSB7CiAgICAJcmV0dXJuICR0aGlzLT5fY29sbGFwc2VkOwogICAgfQoKICAgIC8qKgogICAgICogU2V0IENvbGxhcHNlZAogICAgICoKICAgICAqIEBwYXJhbSBib29sICRwVmFsdWUKICAgICAqIEByZXR1cm4gUEhQRXhjZWxfV29ya3NoZWV0X0NvbHVtbkRpbWVuc2lvbgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gc2V0Q29sbGFwc2VkKCRwVmFsdWUgPSB0cnVlKSB7CiAgICAJJHRoaXMtPl9jb2xsYXBzZWQgPSAkcFZhbHVlOwogICAgCXJldHVybiAkdGhpczsKICAgIH0KCgkvKioKCSAqIEdldCBpbmRleCB0byBjZWxsWGYKCSAqCgkgKiBAcmV0dXJuIGludAoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0WGZJbmRleCgpCgl7CgkJcmV0dXJuICR0aGlzLT5feGZJbmRleDsKCX0KCgkvKioKCSAqIFNldCBpbmRleCB0byBjZWxsWGYKCSAqCgkgKiBAcGFyYW0gaW50ICRwVmFsdWUKCSAqIEByZXR1cm4gUEhQRXhjZWxfV29ya3NoZWV0X0NvbHVtbkRpbWVuc2lvbgoJICovCglwdWJsaWMgZnVuY3Rpb24gc2V0WGZJbmRleCgkcFZhbHVlID0gMCkKCXsKCQkkdGhpcy0+X3hmSW5kZXggPSAkcFZhbHVlOwoJCXJldHVybiAkdGhpczsKCX0KCgkvKioKCSAqIEltcGxlbWVudCBQSFAgX19jbG9uZSB0byBjcmVhdGUgYSBkZWVwIGNsb25lLCBub3QganVzdCBhIHNoYWxsb3cgY29weS4KCSAqLwoJcHVibGljIGZ1bmN0aW9uIF9fY2xvbmUoKSB7CgkJJHZhcnMgPSBnZXRfb2JqZWN0X3ZhcnMoJHRoaXMpOwoJCWZvcmVhY2ggKCR2YXJzIGFzICRrZXkgPT4gJHZhbHVlKSB7CgkJCWlmIChpc19vYmplY3QoJHZhbHVlKSkgewoJCQkJJHRoaXMtPiRrZXkgPSBjbG9uZSAkdmFsdWU7CgkJCX0gZWxzZSB7CgkJCQkkdGhpcy0+JGtleSA9ICR2YWx1ZTsKCQkJfQoJCX0KCX0KCn0K]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Worksheet/Drawing.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIFBIUEV4Y2VsCiAqCiAqIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICoKICogQGNhdGVnb3J5ICAgUEhQRXhjZWwKICogQHBhY2thZ2UgICAgUEhQRXhjZWxfV29ya3NoZWV0X0RyYXdpbmcKICogQGNvcHlyaWdodCAgQ29weXJpZ2h0IChjKSAyMDA2IC0gMjAxMiBQSFBFeGNlbCAoaHR0cDovL3d3dy5jb2RlcGxleC5jb20vUEhQRXhjZWwpCiAqIEBsaWNlbnNlICAgIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9vbGQtbGljZW5zZXMvbGdwbC0yLjEudHh0CUxHUEwKICogQHZlcnNpb24gICAgMS43LjcsIDIwMTItMDUtMTkKICovCgoKLyoqCiAqIFBIUEV4Y2VsX1dvcmtzaGVldF9EcmF3aW5nCiAqCiAqIEBjYXRlZ29yeSAgIFBIUEV4Y2VsCiAqIEBwYWNrYWdlICAgIFBIUEV4Y2VsX1dvcmtzaGVldF9EcmF3aW5nCiAqIEBjb3B5cmlnaHQgIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwgKGh0dHA6Ly93d3cuY29kZXBsZXguY29tL1BIUEV4Y2VsKQogKi8KY2xhc3MgUEhQRXhjZWxfV29ya3NoZWV0X0RyYXdpbmcgZXh0ZW5kcyBQSFBFeGNlbF9Xb3Jrc2hlZXRfQmFzZURyYXdpbmcgaW1wbGVtZW50cyBQSFBFeGNlbF9JQ29tcGFyYWJsZQp7CgkvKioKCSAqIFBhdGgKCSAqCgkgKiBAdmFyIHN0cmluZwoJICovCglwcml2YXRlICRfcGF0aDsKCiAgICAvKioKICAgICAqIENyZWF0ZSBhIG5ldyBQSFBFeGNlbF9Xb3Jrc2hlZXRfRHJhd2luZwogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoKQogICAgewogICAgCS8vIEluaXRpYWxpc2UgdmFsdWVzCiAgICAJJHRoaXMtPl9wYXRoCQkJCT0gJyc7CgogICAgCS8vIEluaXRpYWxpemUgcGFyZW50CiAgICAJcGFyZW50OjpfX2NvbnN0cnVjdCgpOwogICAgfQoKICAgIC8qKgogICAgICogR2V0IEZpbGVuYW1lCiAgICAgKgogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldEZpbGVuYW1lKCkgewogICAgCXJldHVybiBiYXNlbmFtZSgkdGhpcy0+X3BhdGgpOwogICAgfQoKICAgIC8qKgogICAgICogR2V0IGluZGV4ZWQgZmlsZW5hbWUgKHVzaW5nIGltYWdlIGluZGV4KQogICAgICoKICAgICAqIEByZXR1cm4gc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRJbmRleGVkRmlsZW5hbWUoKSB7CiAgICAJJGZpbGVOYW1lID0gJHRoaXMtPmdldEZpbGVuYW1lKCk7CiAgICAJJGZpbGVOYW1lID0gc3RyX3JlcGxhY2UoJyAnLCAnXycsICRmaWxlTmFtZSk7CiAgICAJcmV0dXJuIHN0cl9yZXBsYWNlKCcuJyAuICR0aGlzLT5nZXRFeHRlbnNpb24oKSwgJycsICRmaWxlTmFtZSkgLiAkdGhpcy0+Z2V0SW1hZ2VJbmRleCgpIC4gJy4nIC4gJHRoaXMtPmdldEV4dGVuc2lvbigpOwogICAgfQoKICAgIC8qKgogICAgICogR2V0IEV4dGVuc2lvbgogICAgICoKICAgICAqIEByZXR1cm4gc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRFeHRlbnNpb24oKSB7CiAgICAJJGV4cGxvZGVkID0gZXhwbG9kZSgiLiIsIGJhc2VuYW1lKCR0aGlzLT5fcGF0aCkpOwogICAgCXJldHVybiAkZXhwbG9kZWRbY291bnQoJGV4cGxvZGVkKSAtIDFdOwogICAgfQoKICAgIC8qKgogICAgICogR2V0IFBhdGgKICAgICAqCiAgICAgKiBAcmV0dXJuIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0UGF0aCgpIHsKICAgIAlyZXR1cm4gJHRoaXMtPl9wYXRoOwogICAgfQoKICAgIC8qKgogICAgICogU2V0IFBhdGgKICAgICAqCiAgICAgKiBAcGFyYW0gCXN0cmluZyAJCSRwVmFsdWUJCQlGaWxlIHBhdGgKICAgICAqIEBwYXJhbSAJYm9vbGVhbgkJJHBWZXJpZnlGaWxlCVZlcmlmeSBmaWxlCiAgICAgKiBAdGhyb3dzIAlFeGNlcHRpb24KICAgICAqIEByZXR1cm4gUEhQRXhjZWxfV29ya3NoZWV0X0RyYXdpbmcKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHNldFBhdGgoJHBWYWx1ZSA9ICcnLCAkcFZlcmlmeUZpbGUgPSB0cnVlKSB7CiAgICAJaWYgKCRwVmVyaWZ5RmlsZSkgewoJICAgIAlpZiAoZmlsZV9leGlzdHMoJHBWYWx1ZSkpIHsKCSAgICAJCSR0aGlzLT5fcGF0aCA9ICRwVmFsdWU7CgoJICAgIAkJaWYgKCR0aGlzLT5fd2lkdGggPT0gMCAmJiAkdGhpcy0+X2hlaWdodCA9PSAwKSB7CgkgICAgCQkJLy8gR2V0IHdpZHRoL2hlaWdodAoJICAgIAkJCWxpc3QoJHRoaXMtPl93aWR0aCwgJHRoaXMtPl9oZWlnaHQpID0gZ2V0aW1hZ2VzaXplKCRwVmFsdWUpOwoJICAgIAkJfQoJICAgIAl9IGVsc2UgewoJICAgIAkJdGhyb3cgbmV3IEV4Y2VwdGlvbigiRmlsZSAkcFZhbHVlIG5vdCBmb3VuZCEiKTsKCSAgICAJfQogICAgCX0gZWxzZSB7CiAgICAJCSR0aGlzLT5fcGF0aCA9ICRwVmFsdWU7CiAgICAJfQogICAgCXJldHVybiAkdGhpczsKICAgIH0KCgkvKioKCSAqIEdldCBoYXNoIGNvZGUKCSAqCgkgKiBAcmV0dXJuIHN0cmluZwlIYXNoIGNvZGUKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldEhhc2hDb2RlKCkgewogICAgCXJldHVybiBtZDUoCiAgICAJCSAgJHRoaXMtPl9wYXRoCiAgICAJCS4gcGFyZW50OjpnZXRIYXNoQ29kZSgpCiAgICAJCS4gX19DTEFTU19fCiAgICAJKTsKICAgIH0KCgkvKioKCSAqIEltcGxlbWVudCBQSFAgX19jbG9uZSB0byBjcmVhdGUgYSBkZWVwIGNsb25lLCBub3QganVzdCBhIHNoYWxsb3cgY29weS4KCSAqLwoJcHVibGljIGZ1bmN0aW9uIF9fY2xvbmUoKSB7CgkJJHZhcnMgPSBnZXRfb2JqZWN0X3ZhcnMoJHRoaXMpOwoJCWZvcmVhY2ggKCR2YXJzIGFzICRrZXkgPT4gJHZhbHVlKSB7CgkJCWlmIChpc19vYmplY3QoJHZhbHVlKSkgewoJCQkJJHRoaXMtPiRrZXkgPSBjbG9uZSAkdmFsdWU7CgkJCX0gZWxzZSB7CgkJCQkkdGhpcy0+JGtleSA9ICR2YWx1ZTsKCQkJfQoJCX0KCX0KfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Worksheet/Drawing/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Worksheet/Drawing/Shadow.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIFBIUEV4Y2VsCiAqCiAqIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICoKICogQGNhdGVnb3J5ICAgUEhQRXhjZWwKICogQHBhY2thZ2UgICAgUEhQRXhjZWxfV29ya3NoZWV0X0RyYXdpbmcKICogQGNvcHlyaWdodCAgQ29weXJpZ2h0IChjKSAyMDA2IC0gMjAxMiBQSFBFeGNlbCAoaHR0cDovL3d3dy5jb2RlcGxleC5jb20vUEhQRXhjZWwpCiAqIEBsaWNlbnNlICAgIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9vbGQtbGljZW5zZXMvbGdwbC0yLjEudHh0CUxHUEwKICogQHZlcnNpb24gICAgMS43LjcsIDIwMTItMDUtMTkKICovCgoKLyoqCiAqIFBIUEV4Y2VsX1dvcmtzaGVldF9EcmF3aW5nX1NoYWRvdwogKgogKiBAY2F0ZWdvcnkgICBQSFBFeGNlbAogKiBAcGFja2FnZSAgICBQSFBFeGNlbF9Xb3Jrc2hlZXRfRHJhd2luZwogKiBAY29weXJpZ2h0ICBDb3B5cmlnaHQgKGMpIDIwMDYgLSAyMDEyIFBIUEV4Y2VsIChodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9QSFBFeGNlbCkKICovCmNsYXNzIFBIUEV4Y2VsX1dvcmtzaGVldF9EcmF3aW5nX1NoYWRvdyBpbXBsZW1lbnRzIFBIUEV4Y2VsX0lDb21wYXJhYmxlCnsKCS8qIFNoYWRvdyBhbGlnbm1lbnQgKi8KCWNvbnN0IFNIQURPV19CT1RUT00JCQkJCQkJPSAnYic7Cgljb25zdCBTSEFET1dfQk9UVE9NX0xFRlQJCQkJCT0gJ2JsJzsKCWNvbnN0IFNIQURPV19CT1RUT01fUklHSFQJCQkJCT0gJ2JyJzsKCWNvbnN0IFNIQURPV19DRU5URVIJCQkJCQkJPSAnY3RyJzsKCWNvbnN0IFNIQURPV19MRUZUCQkJCQkJCT0gJ2wnOwoJY29uc3QgU0hBRE9XX1RPUAkJCQkJCQk9ICd0JzsKCWNvbnN0IFNIQURPV19UT1BfTEVGVAkJCQkJCT0gJ3RsJzsKCWNvbnN0IFNIQURPV19UT1BfUklHSFQJCQkJCQk9ICd0cic7CgoJLyoqCgkgKiBWaXNpYmxlCgkgKgoJICogQHZhciBib29sZWFuCgkgKi8KCXByaXZhdGUgJF92aXNpYmxlOwoKCS8qKgoJICogQmx1ciByYWRpdXMKCSAqCgkgKiBEZWZhdWx0cyB0byA2CgkgKgoJICogQHZhciBpbnQKCSAqLwoJcHJpdmF0ZSAkX2JsdXJSYWRpdXM7CgoJLyoqCgkgKiBTaGFkb3cgZGlzdGFuY2UKCSAqCgkgKiBEZWZhdWx0cyB0byAyCgkgKgoJICogQHZhciBpbnQKCSAqLwoJcHJpdmF0ZSAkX2Rpc3RhbmNlOwoKCS8qKgoJICogU2hhZG93IGRpcmVjdGlvbiAoaW4gZGVncmVlcykKCSAqCgkgKiBAdmFyIGludAoJICovCglwcml2YXRlICRfZGlyZWN0aW9uOwoKCS8qKgoJICogU2hhZG93IGFsaWdubWVudAoJICoKCSAqIEB2YXIgaW50CgkgKi8KCXByaXZhdGUgJF9hbGlnbm1lbnQ7CgoJLyoqCgkgKiBDb2xvcgoJICoKCSAqIEB2YXIgUEhQRXhjZWxfU3R5bGVfQ29sb3IKCSAqLwoJcHJpdmF0ZSAkX2NvbG9yOwoKCS8qKgoJICogQWxwaGEKCSAqCgkgKiBAdmFyIGludAoJICovCglwcml2YXRlICRfYWxwaGE7CgogICAgLyoqCiAgICAgKiBDcmVhdGUgYSBuZXcgUEhQRXhjZWxfV29ya3NoZWV0X0RyYXdpbmdfU2hhZG93CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgpCiAgICB7CiAgICAJLy8gSW5pdGlhbGlzZSB2YWx1ZXMKICAgIAkkdGhpcy0+X3Zpc2libGUJCQkJPSBmYWxzZTsKICAgIAkkdGhpcy0+X2JsdXJSYWRpdXMJCQk9IDY7CiAgICAJJHRoaXMtPl9kaXN0YW5jZQkJCT0gMjsKICAgIAkkdGhpcy0+X2RpcmVjdGlvbgkJCT0gMDsKICAgIAkkdGhpcy0+X2FsaWdubWVudAkJCT0gUEhQRXhjZWxfV29ya3NoZWV0X0RyYXdpbmdfU2hhZG93OjpTSEFET1dfQk9UVE9NX1JJR0hUOwogICAgCSR0aGlzLT5fY29sb3IJCQkJPSBuZXcgUEhQRXhjZWxfU3R5bGVfQ29sb3IoUEhQRXhjZWxfU3R5bGVfQ29sb3I6OkNPTE9SX0JMQUNLKTsKICAgIAkkdGhpcy0+X2FscGhhCQkJCT0gNTA7CiAgICB9CgogICAgLyoqCiAgICAgKiBHZXQgVmlzaWJsZQogICAgICoKICAgICAqIEByZXR1cm4gYm9vbGVhbgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0VmlzaWJsZSgpIHsKICAgIAlyZXR1cm4gJHRoaXMtPl92aXNpYmxlOwogICAgfQoKICAgIC8qKgogICAgICogU2V0IFZpc2libGUKICAgICAqCiAgICAgKiBAcGFyYW0gYm9vbGVhbiAkcFZhbHVlCiAgICAgKiBAcmV0dXJuIFBIUEV4Y2VsX1dvcmtzaGVldF9EcmF3aW5nX1NoYWRvdwogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gc2V0VmlzaWJsZSgkcFZhbHVlID0gZmFsc2UpIHsKICAgIAkkdGhpcy0+X3Zpc2libGUgPSAkcFZhbHVlOwogICAgCXJldHVybiAkdGhpczsKICAgIH0KCiAgICAvKioKICAgICAqIEdldCBCbHVyIHJhZGl1cwogICAgICoKICAgICAqIEByZXR1cm4gaW50CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRCbHVyUmFkaXVzKCkgewogICAgCXJldHVybiAkdGhpcy0+X2JsdXJSYWRpdXM7CiAgICB9CgogICAgLyoqCiAgICAgKiBTZXQgQmx1ciByYWRpdXMKICAgICAqCiAgICAgKiBAcGFyYW0gaW50ICRwVmFsdWUKICAgICAqIEByZXR1cm4gUEhQRXhjZWxfV29ya3NoZWV0X0RyYXdpbmdfU2hhZG93CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBzZXRCbHVyUmFkaXVzKCRwVmFsdWUgPSA2KSB7CiAgICAJJHRoaXMtPl9ibHVyUmFkaXVzID0gJHBWYWx1ZTsKICAgIAlyZXR1cm4gJHRoaXM7CiAgICB9CgogICAgLyoqCiAgICAgKiBHZXQgU2hhZG93IGRpc3RhbmNlCiAgICAgKgogICAgICogQHJldHVybiBpbnQKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldERpc3RhbmNlKCkgewogICAgCXJldHVybiAkdGhpcy0+X2Rpc3RhbmNlOwogICAgfQoKICAgIC8qKgogICAgICogU2V0IFNoYWRvdyBkaXN0YW5jZQogICAgICoKICAgICAqIEBwYXJhbSBpbnQgJHBWYWx1ZQogICAgICogQHJldHVybiBQSFBFeGNlbF9Xb3Jrc2hlZXRfRHJhd2luZ19TaGFkb3cKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHNldERpc3RhbmNlKCRwVmFsdWUgPSAyKSB7CiAgICAJJHRoaXMtPl9kaXN0YW5jZSA9ICRwVmFsdWU7CiAgICAJcmV0dXJuICR0aGlzOwogICAgfQoKICAgIC8qKgogICAgICogR2V0IFNoYWRvdyBkaXJlY3Rpb24gKGluIGRlZ3JlZXMpCiAgICAgKgogICAgICogQHJldHVybiBpbnQKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldERpcmVjdGlvbigpIHsKICAgIAlyZXR1cm4gJHRoaXMtPl9kaXJlY3Rpb247CiAgICB9CgogICAgLyoqCiAgICAgKiBTZXQgU2hhZG93IGRpcmVjdGlvbiAoaW4gZGVncmVlcykKICAgICAqCiAgICAgKiBAcGFyYW0gaW50ICRwVmFsdWUKICAgICAqIEByZXR1cm4gUEhQRXhjZWxfV29ya3NoZWV0X0RyYXdpbmdfU2hhZG93CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBzZXREaXJlY3Rpb24oJHBWYWx1ZSA9IDApIHsKICAgIAkkdGhpcy0+X2RpcmVjdGlvbiA9ICRwVmFsdWU7CiAgICAJcmV0dXJuICR0aGlzOwogICAgfQoKICAgLyoqCiAgICAgKiBHZXQgU2hhZG93IGFsaWdubWVudAogICAgICoKICAgICAqIEByZXR1cm4gaW50CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRBbGlnbm1lbnQoKSB7CiAgICAJcmV0dXJuICR0aGlzLT5fYWxpZ25tZW50OwogICAgfQoKICAgIC8qKgogICAgICogU2V0IFNoYWRvdyBhbGlnbm1lbnQKICAgICAqCiAgICAgKiBAcGFyYW0gaW50ICRwVmFsdWUKICAgICAqIEByZXR1cm4gUEhQRXhjZWxfV29ya3NoZWV0X0RyYXdpbmdfU2hhZG93CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBzZXRBbGlnbm1lbnQoJHBWYWx1ZSA9IDApIHsKICAgIAkkdGhpcy0+X2FsaWdubWVudCA9ICRwVmFsdWU7CiAgICAJcmV0dXJuICR0aGlzOwogICAgfQoKICAgLyoqCiAgICAgKiBHZXQgQ29sb3IKICAgICAqCiAgICAgKiBAcmV0dXJuIFBIUEV4Y2VsX1N0eWxlX0NvbG9yCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRDb2xvcigpIHsKICAgIAlyZXR1cm4gJHRoaXMtPl9jb2xvcjsKICAgIH0KCiAgICAvKioKICAgICAqIFNldCBDb2xvcgogICAgICoKICAgICAqIEBwYXJhbSAJUEhQRXhjZWxfU3R5bGVfQ29sb3IgJHBWYWx1ZQogICAgICogQHRocm93cyAJRXhjZXB0aW9uCiAgICAgKiBAcmV0dXJuIFBIUEV4Y2VsX1dvcmtzaGVldF9EcmF3aW5nX1NoYWRvdwogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gc2V0Q29sb3IoUEhQRXhjZWxfU3R5bGVfQ29sb3IgJHBWYWx1ZSA9IG51bGwpIHsKICAgCQkkdGhpcy0+X2NvbG9yID0gJHBWYWx1ZTsKICAgCQlyZXR1cm4gJHRoaXM7CiAgICB9CgogICAvKioKICAgICAqIEdldCBBbHBoYQogICAgICoKICAgICAqIEByZXR1cm4gaW50CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRBbHBoYSgpIHsKICAgIAlyZXR1cm4gJHRoaXMtPl9hbHBoYTsKICAgIH0KCiAgICAvKioKICAgICAqIFNldCBBbHBoYQogICAgICoKICAgICAqIEBwYXJhbSBpbnQgJHBWYWx1ZQogICAgICogQHJldHVybiBQSFBFeGNlbF9Xb3Jrc2hlZXRfRHJhd2luZ19TaGFkb3cKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHNldEFscGhhKCRwVmFsdWUgPSAwKSB7CiAgICAJJHRoaXMtPl9hbHBoYSA9ICRwVmFsdWU7CiAgICAJcmV0dXJuICR0aGlzOwogICAgfQoKCS8qKgoJICogR2V0IGhhc2ggY29kZQoJICoKCSAqIEByZXR1cm4gc3RyaW5nCUhhc2ggY29kZQoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0SGFzaENvZGUoKSB7CiAgICAJcmV0dXJuIG1kNSgKICAgIAkJICAoJHRoaXMtPl92aXNpYmxlID8gJ3QnIDogJ2YnKQogICAgCQkuICR0aGlzLT5fYmx1clJhZGl1cwogICAgCQkuICR0aGlzLT5fZGlzdGFuY2UKICAgIAkJLiAkdGhpcy0+X2RpcmVjdGlvbgogICAgCQkuICR0aGlzLT5fYWxpZ25tZW50CiAgICAJCS4gJHRoaXMtPl9jb2xvci0+Z2V0SGFzaENvZGUoKQogICAgCQkuICR0aGlzLT5fYWxwaGEKICAgIAkJLiBfX0NMQVNTX18KICAgIAkpOwogICAgfQoKCS8qKgoJICogSW1wbGVtZW50IFBIUCBfX2Nsb25lIHRvIGNyZWF0ZSBhIGRlZXAgY2xvbmUsIG5vdCBqdXN0IGEgc2hhbGxvdyBjb3B5LgoJICovCglwdWJsaWMgZnVuY3Rpb24gX19jbG9uZSgpIHsKCQkkdmFycyA9IGdldF9vYmplY3RfdmFycygkdGhpcyk7CgkJZm9yZWFjaCAoJHZhcnMgYXMgJGtleSA9PiAkdmFsdWUpIHsKCQkJaWYgKGlzX29iamVjdCgkdmFsdWUpKSB7CgkJCQkkdGhpcy0+JGtleSA9IGNsb25lICR2YWx1ZTsKCQkJfSBlbHNlIHsKCQkJCSR0aGlzLT4ka2V5ID0gJHZhbHVlOwoJCQl9CgkJfQoJfQp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Worksheet/HeaderFooter.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIFBIUEV4Y2VsCiAqCiAqIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICoKICogQGNhdGVnb3J5ICAgUEhQRXhjZWwKICogQHBhY2thZ2UgICAgUEhQRXhjZWxfV29ya3NoZWV0CiAqIEBjb3B5cmlnaHQgIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwgKGh0dHA6Ly93d3cuY29kZXBsZXguY29tL1BIUEV4Y2VsKQogKiBAbGljZW5zZSAgICBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvb2xkLWxpY2Vuc2VzL2xncGwtMi4xLnR4dAlMR1BMCiAqIEB2ZXJzaW9uICAgIDEuNy43LCAyMDEyLTA1LTE5CiAqLwoKCi8qKgogKiBQSFBFeGNlbF9Xb3Jrc2hlZXRfSGVhZGVyRm9vdGVyCiAqCiAqIDxjb2RlPgogKiBIZWFkZXIvRm9vdGVyIEZvcm1hdHRpbmcgU3ludGF4IHRha2VuIGZyb20gT2ZmaWNlIE9wZW4gWE1MIFBhcnQgNCAtIE1hcmt1cCBMYW5ndWFnZSBSZWZlcmVuY2UsIHBhZ2UgMTk3MDoKICoKICogVGhlcmUgYXJlIGEgbnVtYmVyIG9mIGZvcm1hdHRpbmcgY29kZXMgdGhhdCBjYW4gYmUgd3JpdHRlbiBpbmxpbmUgd2l0aCB0aGUgYWN0dWFsIGhlYWRlciAvIGZvb3RlciB0ZXh0LCB3aGljaAogKiBhZmZlY3QgdGhlIGZvcm1hdHRpbmcgaW4gdGhlIGhlYWRlciBvciBmb290ZXIuCiAqCiAqIEV4YW1wbGU6IFRoaXMgZXhhbXBsZSBzaG93cyB0aGUgdGV4dCAiQ2VudGVyIEJvbGQgSGVhZGVyIiBvbiB0aGUgZmlyc3QgbGluZSAoY2VudGVyIHNlY3Rpb24pLCBhbmQgdGhlIGRhdGUgb24KICogdGhlIHNlY29uZCBsaW5lIChjZW50ZXIgc2VjdGlvbikuCiAqIAkJJkNDZW50ZXIgJiItLEJvbGQiQm9sZCYiLSxSZWd1bGFyIkhlYWRlcl94MDAwQV8mRAogKgogKiBHZW5lcmFsIFJ1bGVzOgogKiBUaGVyZSBpcyBubyByZXF1aXJlZCBvcmRlciBpbiB3aGljaCB0aGVzZSBjb2RlcyBtdXN0IGFwcGVhci4KICoKICogVGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgdGhlIGZvbGxvd2luZyBjb2RlcyB0dXJucyB0aGUgZm9ybWF0dGluZyBPTiwgdGhlIHNlY29uZCBvY2N1cnJlbmNlIHR1cm5zIGl0IE9GRiBhZ2FpbjoKICogLSBzdHJpa2V0aHJvdWdoCiAqIC0gc3VwZXJzY3JpcHQKICogLSBzdWJzY3JpcHQKICogU3VwZXJzY3JpcHQgYW5kIHN1YnNjcmlwdCBjYW5ub3QgYm90aCBiZSBPTiBhdCBzYW1lIHRpbWUuIFdoaWNoZXZlciBjb21lcyBmaXJzdCB3aW5zIGFuZCB0aGUgb3RoZXIgaXMgaWdub3JlZCwKICogd2hpbGUgdGhlIGZpcnN0IGlzIE9OLgogKiAmTCAtIGNvZGUgZm9yICJsZWZ0IHNlY3Rpb24iICh0aGVyZSBhcmUgdGhyZWUgaGVhZGVyIC8gZm9vdGVyIGxvY2F0aW9ucywgImxlZnQiLCAiY2VudGVyIiwgYW5kICJyaWdodCIpLiBXaGVuCiAqIHR3byBvciBtb3JlIG9jY3VycmVuY2VzIG9mIHRoaXMgc2VjdGlvbiBtYXJrZXIgZXhpc3QsIHRoZSBjb250ZW50cyBmcm9tIGFsbCBtYXJrZXJzIGFyZSBjb25jYXRlbmF0ZWQsIGluIHRoZQogKiBvcmRlciBvZiBhcHBlYXJhbmNlLCBhbmQgcGxhY2VkIGludG8gdGhlIGxlZnQgc2VjdGlvbi4KICogJlAgLSBjb2RlIGZvciAiY3VycmVudCBwYWdlICMiCiAqICZOIC0gY29kZSBmb3IgInRvdGFsIHBhZ2VzIgogKiAmZm9udCBzaXplIC0gY29kZSBmb3IgInRleHQgZm9udCBzaXplIiwgd2hlcmUgZm9udCBzaXplIGlzIGEgZm9udCBzaXplIGluIHBvaW50cy4KICogJksgLSBjb2RlIGZvciAidGV4dCBmb250IGNvbG9yIgogKiBSR0IgQ29sb3IgaXMgc3BlY2lmaWVkIGFzIFJSR0dCQgogKiBUaGVtZSBDb2xvciBpcyBzcGVjaWZlZCBhcyBUVFNOTiB3aGVyZSBUVCBpcyB0aGUgdGhlbWUgY29sb3IgSWQsIFMgaXMgZWl0aGVyICIrIiBvciAiLSIgb2YgdGhlIHRpbnQvc2hhZGUKICogdmFsdWUsIE5OIGlzIHRoZSB0aW50L3NoYWRlIHZhbHVlLgogKiAmUyAtIGNvZGUgZm9yICJ0ZXh0IHN0cmlrZXRocm91Z2giIG9uIC8gb2ZmCiAqICZYIC0gY29kZSBmb3IgInRleHQgc3VwZXIgc2NyaXB0IiBvbiAvIG9mZgogKiAmWSAtIGNvZGUgZm9yICJ0ZXh0IHN1YnNjcmlwdCIgb24gLyBvZmYKICogJkMgLSBjb2RlIGZvciAiY2VudGVyIHNlY3Rpb24iLiBXaGVuIHR3byBvciBtb3JlIG9jY3VycmVuY2VzIG9mIHRoaXMgc2VjdGlvbiBtYXJrZXIgZXhpc3QsIHRoZSBjb250ZW50cwogKiBmcm9tIGFsbCBtYXJrZXJzIGFyZSBjb25jYXRlbmF0ZWQsIGluIHRoZSBvcmRlciBvZiBhcHBlYXJhbmNlLCBhbmQgcGxhY2VkIGludG8gdGhlIGNlbnRlciBzZWN0aW9uLgogKgogKiAmRCAtIGNvZGUgZm9yICJkYXRlIgogKiAmVCAtIGNvZGUgZm9yICJ0aW1lIgogKiAmRyAtIGNvZGUgZm9yICJwaWN0dXJlIGFzIGJhY2tncm91bmQiCiAqICZVIC0gY29kZSBmb3IgInRleHQgc2luZ2xlIHVuZGVybGluZSIKICogJkUgLSBjb2RlIGZvciAiZG91YmxlIHVuZGVybGluZSIKICogJlIgLSBjb2RlIGZvciAicmlnaHQgc2VjdGlvbiIuIFdoZW4gdHdvIG9yIG1vcmUgb2NjdXJyZW5jZXMgb2YgdGhpcyBzZWN0aW9uIG1hcmtlciBleGlzdCwgdGhlIGNvbnRlbnRzCiAqIGZyb20gYWxsIG1hcmtlcnMgYXJlIGNvbmNhdGVuYXRlZCwgaW4gdGhlIG9yZGVyIG9mIGFwcGVhcmFuY2UsIGFuZCBwbGFjZWQgaW50byB0aGUgcmlnaHQgc2VjdGlvbi4KICogJlogLSBjb2RlIGZvciAidGhpcyB3b3JrYm9vaydzIGZpbGUgcGF0aCIKICogJkYgLSBjb2RlIGZvciAidGhpcyB3b3JrYm9vaydzIGZpbGUgbmFtZSIKICogJkEgLSBjb2RlIGZvciAic2hlZXQgdGFiIG5hbWUiCiAqICYrIC0gY29kZSBmb3IgYWRkIHRvIHBhZ2UgIy4KICogJi0gLSBjb2RlIGZvciBzdWJ0cmFjdCBmcm9tIHBhZ2UgIy4KICogJiJmb250IG5hbWUsZm9udCB0eXBlIiAtIGNvZGUgZm9yICJ0ZXh0IGZvbnQgbmFtZSIgYW5kICJ0ZXh0IGZvbnQgdHlwZSIsIHdoZXJlIGZvbnQgbmFtZSBhbmQgZm9udCB0eXBlCiAqIGFyZSBzdHJpbmdzIHNwZWNpZnlpbmcgdGhlIG5hbWUgYW5kIHR5cGUgb2YgdGhlIGZvbnQsIHNlcGFyYXRlZCBieSBhIGNvbW1hLiBXaGVuIGEgaHlwaGVuIGFwcGVhcnMgaW4gZm9udAogKiBuYW1lLCBpdCBtZWFucyAibm9uZSBzcGVjaWZpZWQiLiBCb3RoIG9mIGZvbnQgbmFtZSBhbmQgZm9udCB0eXBlIGNhbiBiZSBsb2NhbGl6ZWQgdmFsdWVzLgogKiAmIi0sQm9sZCIgLSBjb2RlIGZvciAiYm9sZCBmb250IHN0eWxlIgogKiAmQiAtIGFsc28gbWVhbnMgImJvbGQgZm9udCBzdHlsZSIuCiAqICYiLSxSZWd1bGFyIiAtIGNvZGUgZm9yICJyZWd1bGFyIGZvbnQgc3R5bGUiCiAqICYiLSxJdGFsaWMiIC0gY29kZSBmb3IgIml0YWxpYyBmb250IHN0eWxlIgogKiAmSSAtIGFsc28gbWVhbnMgIml0YWxpYyBmb250IHN0eWxlIgogKiAmIi0sQm9sZCBJdGFsaWMiIGNvZGUgZm9yICJib2xkIGl0YWxpYyBmb250IHN0eWxlIgogKiAmTyAtIGNvZGUgZm9yICJvdXRsaW5lIHN0eWxlIgogKiAmSCAtIGNvZGUgZm9yICJzaGFkb3cgc3R5bGUiCiAqIDwvY29kZT4KICoKICogQGNhdGVnb3J5ICAgUEhQRXhjZWwKICogQHBhY2thZ2UgICAgUEhQRXhjZWxfV29ya3NoZWV0CiAqIEBjb3B5cmlnaHQgIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwgKGh0dHA6Ly93d3cuY29kZXBsZXguY29tL1BIUEV4Y2VsKQogKi8KY2xhc3MgUEhQRXhjZWxfV29ya3NoZWV0X0hlYWRlckZvb3Rlcgp7CgkvKiBIZWFkZXIvZm9vdGVyIGltYWdlIGxvY2F0aW9uICovCgljb25zdCBJTUFHRV9IRUFERVJfTEVGVAkJCQkJCQk9ICdMSCc7Cgljb25zdCBJTUFHRV9IRUFERVJfQ0VOVEVSCQkJCQkJPSAnQ0gnOwoJY29uc3QgSU1BR0VfSEVBREVSX1JJR0hUCQkJCQkJPSAnUkgnOwoJY29uc3QgSU1BR0VfRk9PVEVSX0xFRlQJCQkJCQkJPSAnTEYnOwoJY29uc3QgSU1BR0VfRk9PVEVSX0NFTlRFUgkJCQkJCT0gJ0NGJzsKCWNvbnN0IElNQUdFX0ZPT1RFUl9SSUdIVAkJCQkJCT0gJ1JGJzsKCgkvKioKCSAqIE9kZEhlYWRlcgoJICoKCSAqIEB2YXIgc3RyaW5nCgkgKi8KCXByaXZhdGUgJF9vZGRIZWFkZXIJCQk9ICcnOwoKCS8qKgoJICogT2RkRm9vdGVyCgkgKgoJICogQHZhciBzdHJpbmcKCSAqLwoJcHJpdmF0ZSAkX29kZEZvb3RlcgkJCT0gJyc7CgoJLyoqCgkgKiBFdmVuSGVhZGVyCgkgKgoJICogQHZhciBzdHJpbmcKCSAqLwoJcHJpdmF0ZSAkX2V2ZW5IZWFkZXIJCT0gJyc7CgoJLyoqCgkgKiBFdmVuRm9vdGVyCgkgKgoJICogQHZhciBzdHJpbmcKCSAqLwoJcHJpdmF0ZSAkX2V2ZW5Gb290ZXIJCT0gJyc7CgoJLyoqCgkgKiBGaXJzdEhlYWRlcgoJICoKCSAqIEB2YXIgc3RyaW5nCgkgKi8KCXByaXZhdGUgJF9maXJzdEhlYWRlcgkJPSAnJzsKCgkvKioKCSAqIEZpcnN0Rm9vdGVyCgkgKgoJICogQHZhciBzdHJpbmcKCSAqLwoJcHJpdmF0ZSAkX2ZpcnN0Rm9vdGVyCQk9ICcnOwoKCS8qKgoJICogRGlmZmVyZW50IGhlYWRlciBmb3IgT2RkL0V2ZW4sIGRlZmF1bHRzIHRvIGZhbHNlCgkgKgoJICogQHZhciBib29sZWFuCgkgKi8KCXByaXZhdGUgJF9kaWZmZXJlbnRPZGRFdmVuCT0gZmFsc2U7CgoJLyoqCgkgKiBEaWZmZXJlbnQgaGVhZGVyIGZvciBmaXJzdCBwYWdlLCBkZWZhdWx0cyB0byBmYWxzZQoJICoKCSAqIEB2YXIgYm9vbGVhbgoJICovCglwcml2YXRlICRfZGlmZmVyZW50Rmlyc3QJPSBmYWxzZTsKCgkvKioKCSAqIFNjYWxlIHdpdGggZG9jdW1lbnQsIGRlZmF1bHRzIHRvIHRydWUKCSAqCgkgKiBAdmFyIGJvb2xlYW4KCSAqLwoJcHJpdmF0ZSAkX3NjYWxlV2l0aERvY3VtZW50CT0gdHJ1ZTsKCgkvKioKCSAqIEFsaWduIHdpdGggbWFyZ2lucywgZGVmYXVsdHMgdG8gdHJ1ZQoJICoKCSAqIEB2YXIgYm9vbGVhbgoJICovCglwcml2YXRlICRfYWxpZ25XaXRoTWFyZ2lucwk9IHRydWU7CgoJLyoqCgkgKiBIZWFkZXIvZm9vdGVyIGltYWdlcwoJICoKCSAqIEB2YXIgUEhQRXhjZWxfV29ya3NoZWV0X0hlYWRlckZvb3RlckRyYXdpbmdbXQoJICovCglwcml2YXRlICRfaGVhZGVyRm9vdGVySW1hZ2VzID0gYXJyYXkoKTsKCiAgICAvKioKICAgICAqIENyZWF0ZSBhIG5ldyBQSFBFeGNlbF9Xb3Jrc2hlZXRfSGVhZGVyRm9vdGVyCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgpCiAgICB7CiAgICB9CgogICAgLyoqCiAgICAgKiBHZXQgT2RkSGVhZGVyCiAgICAgKgogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldE9kZEhlYWRlcigpIHsKICAgIAlyZXR1cm4gJHRoaXMtPl9vZGRIZWFkZXI7CiAgICB9CgogICAgLyoqCiAgICAgKiBTZXQgT2RkSGVhZGVyCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyAkcFZhbHVlCiAgICAgKiBAcmV0dXJuIFBIUEV4Y2VsX1dvcmtzaGVldF9IZWFkZXJGb290ZXIKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHNldE9kZEhlYWRlcigkcFZhbHVlKSB7CiAgICAJJHRoaXMtPl9vZGRIZWFkZXIgPSAkcFZhbHVlOwogICAgCXJldHVybiAkdGhpczsKICAgIH0KCiAgICAvKioKICAgICAqIEdldCBPZGRGb290ZXIKICAgICAqCiAgICAgKiBAcmV0dXJuIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0T2RkRm9vdGVyKCkgewogICAgCXJldHVybiAkdGhpcy0+X29kZEZvb3RlcjsKICAgIH0KCiAgICAvKioKICAgICAqIFNldCBPZGRGb290ZXIKICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nICRwVmFsdWUKICAgICAqIEByZXR1cm4gUEhQRXhjZWxfV29ya3NoZWV0X0hlYWRlckZvb3RlcgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gc2V0T2RkRm9vdGVyKCRwVmFsdWUpIHsKICAgIAkkdGhpcy0+X29kZEZvb3RlciA9ICRwVmFsdWU7CiAgICAJcmV0dXJuICR0aGlzOwogICAgfQoKICAgIC8qKgogICAgICogR2V0IEV2ZW5IZWFkZXIKICAgICAqCiAgICAgKiBAcmV0dXJuIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0RXZlbkhlYWRlcigpIHsKICAgIAlyZXR1cm4gJHRoaXMtPl9ldmVuSGVhZGVyOwogICAgfQoKICAgIC8qKgogICAgICogU2V0IEV2ZW5IZWFkZXIKICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nICRwVmFsdWUKICAgICAqIEByZXR1cm4gUEhQRXhjZWxfV29ya3NoZWV0X0hlYWRlckZvb3RlcgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gc2V0RXZlbkhlYWRlcigkcFZhbHVlKSB7CiAgICAJJHRoaXMtPl9ldmVuSGVhZGVyID0gJHBWYWx1ZTsKICAgIAlyZXR1cm4gJHRoaXM7CiAgICB9CgogICAgLyoqCiAgICAgKiBHZXQgRXZlbkZvb3RlcgogICAgICoKICAgICAqIEByZXR1cm4gc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRFdmVuRm9vdGVyKCkgewogICAgCXJldHVybiAkdGhpcy0+X2V2ZW5Gb290ZXI7CiAgICB9CgogICAgLyoqCiAgICAgKiBTZXQgRXZlbkZvb3RlcgogICAgICoKICAgICAqIEBwYXJhbSBzdHJpbmcgJHBWYWx1ZQogICAgICogQHJldHVybiBQSFBFeGNlbF9Xb3Jrc2hlZXRfSGVhZGVyRm9vdGVyCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBzZXRFdmVuRm9vdGVyKCRwVmFsdWUpIHsKICAgIAkkdGhpcy0+X2V2ZW5Gb290ZXIgPSAkcFZhbHVlOwogICAgCXJldHVybiAkdGhpczsKICAgIH0KCiAgICAvKioKICAgICAqIEdldCBGaXJzdEhlYWRlcgogICAgICoKICAgICAqIEByZXR1cm4gc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRGaXJzdEhlYWRlcigpIHsKICAgIAlyZXR1cm4gJHRoaXMtPl9maXJzdEhlYWRlcjsKICAgIH0KCiAgICAvKioKICAgICAqIFNldCBGaXJzdEhlYWRlcgogICAgICoKICAgICAqIEBwYXJhbSBzdHJpbmcgJHBWYWx1ZQogICAgICogQHJldHVybiBQSFBFeGNlbF9Xb3Jrc2hlZXRfSGVhZGVyRm9vdGVyCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBzZXRGaXJzdEhlYWRlcigkcFZhbHVlKSB7CiAgICAJJHRoaXMtPl9maXJzdEhlYWRlciA9ICRwVmFsdWU7CiAgICAJcmV0dXJuICR0aGlzOwogICAgfQoKICAgIC8qKgogICAgICogR2V0IEZpcnN0Rm9vdGVyCiAgICAgKgogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldEZpcnN0Rm9vdGVyKCkgewogICAgCXJldHVybiAkdGhpcy0+X2ZpcnN0Rm9vdGVyOwogICAgfQoKICAgIC8qKgogICAgICogU2V0IEZpcnN0Rm9vdGVyCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyAkcFZhbHVlCiAgICAgKiBAcmV0dXJuIFBIUEV4Y2VsX1dvcmtzaGVldF9IZWFkZXJGb290ZXIKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHNldEZpcnN0Rm9vdGVyKCRwVmFsdWUpIHsKICAgIAkkdGhpcy0+X2ZpcnN0Rm9vdGVyID0gJHBWYWx1ZTsKICAgIAlyZXR1cm4gJHRoaXM7CiAgICB9CgogICAgLyoqCiAgICAgKiBHZXQgRGlmZmVyZW50T2RkRXZlbgogICAgICoKICAgICAqIEByZXR1cm4gYm9vbGVhbgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0RGlmZmVyZW50T2RkRXZlbigpIHsKICAgIAlyZXR1cm4gJHRoaXMtPl9kaWZmZXJlbnRPZGRFdmVuOwogICAgfQoKICAgIC8qKgogICAgICogU2V0IERpZmZlcmVudE9kZEV2ZW4KICAgICAqCiAgICAgKiBAcGFyYW0gYm9vbGVhbiAkcFZhbHVlCiAgICAgKiBAcmV0dXJuIFBIUEV4Y2VsX1dvcmtzaGVldF9IZWFkZXJGb290ZXIKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHNldERpZmZlcmVudE9kZEV2ZW4oJHBWYWx1ZSA9IGZhbHNlKSB7CiAgICAJJHRoaXMtPl9kaWZmZXJlbnRPZGRFdmVuID0gJHBWYWx1ZTsKICAgIAlyZXR1cm4gJHRoaXM7CiAgICB9CgogICAgLyoqCiAgICAgKiBHZXQgRGlmZmVyZW50Rmlyc3QKICAgICAqCiAgICAgKiBAcmV0dXJuIGJvb2xlYW4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldERpZmZlcmVudEZpcnN0KCkgewogICAgCXJldHVybiAkdGhpcy0+X2RpZmZlcmVudEZpcnN0OwogICAgfQoKICAgIC8qKgogICAgICogU2V0IERpZmZlcmVudEZpcnN0CiAgICAgKgogICAgICogQHBhcmFtIGJvb2xlYW4gJHBWYWx1ZQogICAgICogQHJldHVybiBQSFBFeGNlbF9Xb3Jrc2hlZXRfSGVhZGVyRm9vdGVyCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBzZXREaWZmZXJlbnRGaXJzdCgkcFZhbHVlID0gZmFsc2UpIHsKICAgIAkkdGhpcy0+X2RpZmZlcmVudEZpcnN0ID0gJHBWYWx1ZTsKICAgIAlyZXR1cm4gJHRoaXM7CiAgICB9CgogICAgLyoqCiAgICAgKiBHZXQgU2NhbGVXaXRoRG9jdW1lbnQKICAgICAqCiAgICAgKiBAcmV0dXJuIGJvb2xlYW4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldFNjYWxlV2l0aERvY3VtZW50KCkgewogICAgCXJldHVybiAkdGhpcy0+X3NjYWxlV2l0aERvY3VtZW50OwogICAgfQoKICAgIC8qKgogICAgICogU2V0IFNjYWxlV2l0aERvY3VtZW50CiAgICAgKgogICAgICogQHBhcmFtIGJvb2xlYW4gJHBWYWx1ZQogICAgICogQHJldHVybiBQSFBFeGNlbF9Xb3Jrc2hlZXRfSGVhZGVyRm9vdGVyCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBzZXRTY2FsZVdpdGhEb2N1bWVudCgkcFZhbHVlID0gdHJ1ZSkgewogICAgCSR0aGlzLT5fc2NhbGVXaXRoRG9jdW1lbnQgPSAkcFZhbHVlOwogICAgCXJldHVybiAkdGhpczsKICAgIH0KCiAgICAvKioKICAgICAqIEdldCBBbGlnbldpdGhNYXJnaW5zCiAgICAgKgogICAgICogQHJldHVybiBib29sZWFuCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRBbGlnbldpdGhNYXJnaW5zKCkgewogICAgCXJldHVybiAkdGhpcy0+X2FsaWduV2l0aE1hcmdpbnM7CiAgICB9CgogICAgLyoqCiAgICAgKiBTZXQgQWxpZ25XaXRoTWFyZ2lucwogICAgICoKICAgICAqIEBwYXJhbSBib29sZWFuICRwVmFsdWUKICAgICAqIEByZXR1cm4gUEhQRXhjZWxfV29ya3NoZWV0X0hlYWRlckZvb3RlcgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gc2V0QWxpZ25XaXRoTWFyZ2lucygkcFZhbHVlID0gdHJ1ZSkgewogICAgCSR0aGlzLT5fYWxpZ25XaXRoTWFyZ2lucyA9ICRwVmFsdWU7CiAgICAJcmV0dXJuICR0aGlzOwogICAgfQoKICAgIC8qKgogICAgICogQWRkIGhlYWRlci9mb290ZXIgaW1hZ2UKICAgICAqCiAgICAgKiBAcGFyYW0gUEhQRXhjZWxfV29ya3NoZWV0X0hlYWRlckZvb3RlckRyYXdpbmcgJGltYWdlCiAgICAgKiBAcGFyYW0gc3RyaW5nICRsb2NhdGlvbgogICAgICogQHRocm93cyBFeGNlcHRpb24KICAgICAqIEByZXR1cm4gUEhQRXhjZWxfV29ya3NoZWV0X0hlYWRlckZvb3RlcgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gYWRkSW1hZ2UoUEhQRXhjZWxfV29ya3NoZWV0X0hlYWRlckZvb3RlckRyYXdpbmcgJGltYWdlID0gbnVsbCwgJGxvY2F0aW9uID0gc2VsZjo6SU1BR0VfSEVBREVSX0xFRlQpIHsKICAgIAkkdGhpcy0+X2hlYWRlckZvb3RlckltYWdlc1skbG9jYXRpb25dID0gJGltYWdlOwogICAgCXJldHVybiAkdGhpczsKICAgIH0KCiAgICAvKioKICAgICAqIFJlbW92ZSBoZWFkZXIvZm9vdGVyIGltYWdlCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyAkbG9jYXRpb24KICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCiAgICAgKiBAcmV0dXJuIFBIUEV4Y2VsX1dvcmtzaGVldF9IZWFkZXJGb290ZXIKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHJlbW92ZUltYWdlKCRsb2NhdGlvbiA9IHNlbGY6OklNQUdFX0hFQURFUl9MRUZUKSB7CiAgICAJaWYgKGlzc2V0KCR0aGlzLT5faGVhZGVyRm9vdGVySW1hZ2VzWyRsb2NhdGlvbl0pKSB7CiAgICAJCXVuc2V0KCR0aGlzLT5faGVhZGVyRm9vdGVySW1hZ2VzWyRsb2NhdGlvbl0pOwogICAgCX0KICAgIAlyZXR1cm4gJHRoaXM7CiAgICB9CgogICAgLyoqCiAgICAgKiBTZXQgaGVhZGVyL2Zvb3RlciBpbWFnZXMKICAgICAqCiAgICAgKiBAcGFyYW0gUEhQRXhjZWxfV29ya3NoZWV0X0hlYWRlckZvb3RlckRyYXdpbmdbXSAkaW1hZ2VzCiAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgogICAgICogQHJldHVybiBQSFBFeGNlbF9Xb3Jrc2hlZXRfSGVhZGVyRm9vdGVyCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBzZXRJbWFnZXMoJGltYWdlcykgewogICAgCWlmICghaXNfYXJyYXkoJGltYWdlcykpIHsKICAgIAkJdGhyb3cgbmV3IEV4Y2VwdGlvbignSW52YWxpZCBwYXJhbWV0ZXIhJyk7CiAgICAJfQoKICAgIAkkdGhpcy0+X2hlYWRlckZvb3RlckltYWdlcyA9ICRpbWFnZXM7CiAgICAJcmV0dXJuICR0aGlzOwogICAgfQoKICAgIC8qKgogICAgICogR2V0IGhlYWRlci9mb290ZXIgaW1hZ2VzCiAgICAgKgogICAgICogQHJldHVybiBQSFBFeGNlbF9Xb3Jrc2hlZXRfSGVhZGVyRm9vdGVyRHJhd2luZ1tdCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRJbWFnZXMoKSB7CiAgICAJLy8gU29ydCBhcnJheQogICAgCSRpbWFnZXMgPSBhcnJheSgpOwogICAgCWlmIChpc3NldCgkdGhpcy0+X2hlYWRlckZvb3RlckltYWdlc1tzZWxmOjpJTUFHRV9IRUFERVJfTEVGVF0pKSAJJGltYWdlc1tzZWxmOjpJTUFHRV9IRUFERVJfTEVGVF0gPSAJCSR0aGlzLT5faGVhZGVyRm9vdGVySW1hZ2VzW3NlbGY6OklNQUdFX0hFQURFUl9MRUZUXTsKICAgIAlpZiAoaXNzZXQoJHRoaXMtPl9oZWFkZXJGb290ZXJJbWFnZXNbc2VsZjo6SU1BR0VfSEVBREVSX0NFTlRFUl0pKSAJJGltYWdlc1tzZWxmOjpJTUFHRV9IRUFERVJfQ0VOVEVSXSA9IAkkdGhpcy0+X2hlYWRlckZvb3RlckltYWdlc1tzZWxmOjpJTUFHRV9IRUFERVJfQ0VOVEVSXTsKICAgIAlpZiAoaXNzZXQoJHRoaXMtPl9oZWFkZXJGb290ZXJJbWFnZXNbc2VsZjo6SU1BR0VfSEVBREVSX1JJR0hUXSkpIAkkaW1hZ2VzW3NlbGY6OklNQUdFX0hFQURFUl9SSUdIVF0gPSAJJHRoaXMtPl9oZWFkZXJGb290ZXJJbWFnZXNbc2VsZjo6SU1BR0VfSEVBREVSX1JJR0hUXTsKICAgIAlpZiAoaXNzZXQoJHRoaXMtPl9oZWFkZXJGb290ZXJJbWFnZXNbc2VsZjo6SU1BR0VfRk9PVEVSX0xFRlRdKSkgCSRpbWFnZXNbc2VsZjo6SU1BR0VfRk9PVEVSX0xFRlRdID0gCQkkdGhpcy0+X2hlYWRlckZvb3RlckltYWdlc1tzZWxmOjpJTUFHRV9GT09URVJfTEVGVF07CiAgICAJaWYgKGlzc2V0KCR0aGlzLT5faGVhZGVyRm9vdGVySW1hZ2VzW3NlbGY6OklNQUdFX0ZPT1RFUl9DRU5URVJdKSkgCSRpbWFnZXNbc2VsZjo6SU1BR0VfRk9PVEVSX0NFTlRFUl0gPSAJJHRoaXMtPl9oZWFkZXJGb290ZXJJbWFnZXNbc2VsZjo6SU1BR0VfRk9PVEVSX0NFTlRFUl07CiAgICAJaWYgKGlzc2V0KCR0aGlzLT5faGVhZGVyRm9vdGVySW1hZ2VzW3NlbGY6OklNQUdFX0ZPT1RFUl9SSUdIVF0pKSAJJGltYWdlc1tzZWxmOjpJTUFHRV9GT09URVJfUklHSFRdID0gCSR0aGlzLT5faGVhZGVyRm9vdGVySW1hZ2VzW3NlbGY6OklNQUdFX0ZPT1RFUl9SSUdIVF07CiAgICAJJHRoaXMtPl9oZWFkZXJGb290ZXJJbWFnZXMgPSAkaW1hZ2VzOwoKICAgIAlyZXR1cm4gJHRoaXMtPl9oZWFkZXJGb290ZXJJbWFnZXM7CiAgICB9CgoJLyoqCgkgKiBJbXBsZW1lbnQgUEhQIF9fY2xvbmUgdG8gY3JlYXRlIGEgZGVlcCBjbG9uZSwgbm90IGp1c3QgYSBzaGFsbG93IGNvcHkuCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBfX2Nsb25lKCkgewoJCSR2YXJzID0gZ2V0X29iamVjdF92YXJzKCR0aGlzKTsKCQlmb3JlYWNoICgkdmFycyBhcyAka2V5ID0+ICR2YWx1ZSkgewoJCQlpZiAoaXNfb2JqZWN0KCR2YWx1ZSkpIHsKCQkJCSR0aGlzLT4ka2V5ID0gY2xvbmUgJHZhbHVlOwoJCQl9IGVsc2UgewoJCQkJJHRoaXMtPiRrZXkgPSAkdmFsdWU7CgkJCX0KCQl9Cgl9Cn0K]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Worksheet/HeaderFooterDrawing.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIFBIUEV4Y2VsCiAqCiAqIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICoKICogQGNhdGVnb3J5ICAgUEhQRXhjZWwKICogQHBhY2thZ2UgICAgUEhQRXhjZWxfV29ya3NoZWV0CiAqIEBjb3B5cmlnaHQgIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwgKGh0dHA6Ly93d3cuY29kZXBsZXguY29tL1BIUEV4Y2VsKQogKiBAbGljZW5zZSAgICBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvb2xkLWxpY2Vuc2VzL2xncGwtMi4xLnR4dAlMR1BMCiAqIEB2ZXJzaW9uICAgIDEuNy43LCAyMDEyLTA1LTE5CiAqLwoKCi8qKgogKiBQSFBFeGNlbF9Xb3Jrc2hlZXRfSGVhZGVyRm9vdGVyRHJhd2luZwogKgogKiBAY2F0ZWdvcnkgICBQSFBFeGNlbAogKiBAcGFja2FnZSAgICBQSFBFeGNlbF9Xb3Jrc2hlZXQKICogQGNvcHlyaWdodCAgQ29weXJpZ2h0IChjKSAyMDA2IC0gMjAxMiBQSFBFeGNlbCAoaHR0cDovL3d3dy5jb2RlcGxleC5jb20vUEhQRXhjZWwpCiAqLwpjbGFzcyBQSFBFeGNlbF9Xb3Jrc2hlZXRfSGVhZGVyRm9vdGVyRHJhd2luZyBleHRlbmRzIFBIUEV4Y2VsX1dvcmtzaGVldF9EcmF3aW5nIGltcGxlbWVudHMgUEhQRXhjZWxfSUNvbXBhcmFibGUKewoJLyoqCgkgKiBQYXRoCgkgKgoJICogQHZhciBzdHJpbmcKCSAqLwoJcHJpdmF0ZSAkX3BhdGg7CgoJLyoqCgkgKiBOYW1lCgkgKgoJICogQHZhciBzdHJpbmcKCSAqLwoJcHJvdGVjdGVkICRfbmFtZTsKCgkvKioKCSAqIE9mZnNldCBYCgkgKgoJICogQHZhciBpbnQKCSAqLwoJcHJvdGVjdGVkICRfb2Zmc2V0WDsKCgkvKioKCSAqIE9mZnNldCBZCgkgKgoJICogQHZhciBpbnQKCSAqLwoJcHJvdGVjdGVkICRfb2Zmc2V0WTsKCgkvKioKCSAqIFdpZHRoCgkgKgoJICogQHZhciBpbnQKCSAqLwoJcHJvdGVjdGVkICRfd2lkdGg7CgoJLyoqCgkgKiBIZWlnaHQKCSAqCgkgKiBAdmFyIGludAoJICovCglwcm90ZWN0ZWQgJF9oZWlnaHQ7CgoJLyoqCgkgKiBQcm9wb3J0aW9uYWwgcmVzaXplCgkgKgoJICogQHZhciBib29sZWFuCgkgKi8KCXByb3RlY3RlZCAkX3Jlc2l6ZVByb3BvcnRpb25hbDsKCiAgICAvKioKICAgICAqIENyZWF0ZSBhIG5ldyBQSFBFeGNlbF9Xb3Jrc2hlZXRfSGVhZGVyRm9vdGVyRHJhd2luZwogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoKQogICAgewogICAgCS8vIEluaXRpYWxpc2UgdmFsdWVzCiAgICAJJHRoaXMtPl9wYXRoCQkJCT0gJyc7CiAgICAJJHRoaXMtPl9uYW1lCQkJCT0gJyc7CiAgICAJJHRoaXMtPl9vZmZzZXRYCQkJCT0gMDsKICAgIAkkdGhpcy0+X29mZnNldFkJCQkJPSAwOwogICAgCSR0aGlzLT5fd2lkdGgJCQkJPSAwOwogICAgCSR0aGlzLT5faGVpZ2h0CQkJCT0gMDsKICAgIAkkdGhpcy0+X3Jlc2l6ZVByb3BvcnRpb25hbAk9IHRydWU7CiAgICB9CgogICAgLyoqCiAgICAgKiBHZXQgTmFtZQogICAgICoKICAgICAqIEByZXR1cm4gc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXROYW1lKCkgewogICAgCXJldHVybiAkdGhpcy0+X25hbWU7CiAgICB9CgogICAgLyoqCiAgICAgKiBTZXQgTmFtZQogICAgICoKICAgICAqIEBwYXJhbSBzdHJpbmcgJHBWYWx1ZQogICAgICogQHJldHVybiBQSFBFeGNlbF9Xb3Jrc2hlZXRfSGVhZGVyRm9vdGVyRHJhd2luZwogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gc2V0TmFtZSgkcFZhbHVlID0gJycpIHsKICAgIAkkdGhpcy0+X25hbWUgPSAkcFZhbHVlOwogICAgCXJldHVybiAkdGhpczsKICAgIH0KCiAgICAvKioKICAgICAqIEdldCBPZmZzZXRYCiAgICAgKgogICAgICogQHJldHVybiBpbnQKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldE9mZnNldFgoKSB7CiAgICAJcmV0dXJuICR0aGlzLT5fb2Zmc2V0WDsKICAgIH0KCiAgICAvKioKICAgICAqIFNldCBPZmZzZXRYCiAgICAgKgogICAgICogQHBhcmFtIGludCAkcFZhbHVlCiAgICAgKiBAcmV0dXJuIFBIUEV4Y2VsX1dvcmtzaGVldF9IZWFkZXJGb290ZXJEcmF3aW5nCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBzZXRPZmZzZXRYKCRwVmFsdWUgPSAwKSB7CiAgICAJJHRoaXMtPl9vZmZzZXRYID0gJHBWYWx1ZTsKICAgIAlyZXR1cm4gJHRoaXM7CiAgICB9CgogICAgLyoqCiAgICAgKiBHZXQgT2Zmc2V0WQogICAgICoKICAgICAqIEByZXR1cm4gaW50CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRPZmZzZXRZKCkgewogICAgCXJldHVybiAkdGhpcy0+X29mZnNldFk7CiAgICB9CgogICAgLyoqCiAgICAgKiBTZXQgT2Zmc2V0WQogICAgICoKICAgICAqIEBwYXJhbSBpbnQgJHBWYWx1ZQogICAgICogQHJldHVybiBQSFBFeGNlbF9Xb3Jrc2hlZXRfSGVhZGVyRm9vdGVyRHJhd2luZwogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gc2V0T2Zmc2V0WSgkcFZhbHVlID0gMCkgewogICAgCSR0aGlzLT5fb2Zmc2V0WSA9ICRwVmFsdWU7CiAgICAJcmV0dXJuICR0aGlzOwogICAgfQoKICAgIC8qKgogICAgICogR2V0IFdpZHRoCiAgICAgKgogICAgICogQHJldHVybiBpbnQKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldFdpZHRoKCkgewogICAgCXJldHVybiAkdGhpcy0+X3dpZHRoOwogICAgfQoKICAgIC8qKgogICAgICogU2V0IFdpZHRoCiAgICAgKgogICAgICogQHBhcmFtIGludCAkcFZhbHVlCiAgICAgKiBAcmV0dXJuIFBIUEV4Y2VsX1dvcmtzaGVldF9IZWFkZXJGb290ZXJEcmF3aW5nCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBzZXRXaWR0aCgkcFZhbHVlID0gMCkgewogICAgCS8vIFJlc2l6ZSBwcm9wb3J0aW9uYWw/CiAgICAJaWYgKCR0aGlzLT5fcmVzaXplUHJvcG9ydGlvbmFsICYmICRwVmFsdWUgIT0gMCkgewogICAgCQkkcmF0aW8gPSAkdGhpcy0+X3dpZHRoIC8gJHRoaXMtPl9oZWlnaHQ7CiAgICAJCSR0aGlzLT5faGVpZ2h0ID0gcm91bmQoJHJhdGlvICogJHBWYWx1ZSk7CiAgICAJfQoKICAgIAkvLyBTZXQgd2lkdGgKICAgIAkkdGhpcy0+X3dpZHRoID0gJHBWYWx1ZTsKCiAgICAJcmV0dXJuICR0aGlzOwogICAgfQoKICAgIC8qKgogICAgICogR2V0IEhlaWdodAogICAgICoKICAgICAqIEByZXR1cm4gaW50CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRIZWlnaHQoKSB7CiAgICAJcmV0dXJuICR0aGlzLT5faGVpZ2h0OwogICAgfQoKICAgIC8qKgogICAgICogU2V0IEhlaWdodAogICAgICoKICAgICAqIEBwYXJhbSBpbnQgJHBWYWx1ZQogICAgICogQHJldHVybiBQSFBFeGNlbF9Xb3Jrc2hlZXRfSGVhZGVyRm9vdGVyRHJhd2luZwogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gc2V0SGVpZ2h0KCRwVmFsdWUgPSAwKSB7CiAgICAJLy8gUmVzaXplIHByb3BvcnRpb25hbD8KICAgIAlpZiAoJHRoaXMtPl9yZXNpemVQcm9wb3J0aW9uYWwgJiYgJHBWYWx1ZSAhPSAwKSB7CiAgICAJCSRyYXRpbyA9ICR0aGlzLT5fd2lkdGggLyAkdGhpcy0+X2hlaWdodDsKICAgIAkJJHRoaXMtPl93aWR0aCA9IHJvdW5kKCRyYXRpbyAqICRwVmFsdWUpOwogICAgCX0KCiAgICAJLy8gU2V0IGhlaWdodAogICAgCSR0aGlzLT5faGVpZ2h0ID0gJHBWYWx1ZTsKCiAgICAJcmV0dXJuICR0aGlzOwogICAgfQoKICAgIC8qKgogICAgICogU2V0IHdpZHRoIGFuZCBoZWlnaHQgd2l0aCBwcm9wb3J0aW9uYWwgcmVzaXplCgkgKiBFeGFtcGxlOgoJICogPGNvZGU+CiAgICAgKiAkb2JqRHJhd2luZy0+c2V0UmVzaXplUHJvcG9ydGlvbmFsKHRydWUpOwogICAgICogJG9iakRyYXdpbmctPnNldFdpZHRoQW5kSGVpZ2h0KDE2MCwxMjApOwoJICogPC9jb2RlPgoJICoKICAgICAqIEBhdXRob3IgVmluY2VudEBsdW8gTVNOOmtlbGVfMTAwQGhvdG1haWwuY29tCiAgICAgKiBAcGFyYW0gaW50ICR3aWR0aAogICAgICogQHBhcmFtIGludCAkaGVpZ2h0CiAgICAgKiBAcmV0dXJuIFBIUEV4Y2VsX1dvcmtzaGVldF9IZWFkZXJGb290ZXJEcmF3aW5nCiAgICAgKi8KCXB1YmxpYyBmdW5jdGlvbiBzZXRXaWR0aEFuZEhlaWdodCgkd2lkdGggPSAwLCAkaGVpZ2h0ID0gMCkgewoJCSR4cmF0aW8gPSAkd2lkdGggLyAkdGhpcy0+X3dpZHRoOwoJCSR5cmF0aW8gPSAkaGVpZ2h0IC8gJHRoaXMtPl9oZWlnaHQ7CgkJaWYgKCR0aGlzLT5fcmVzaXplUHJvcG9ydGlvbmFsICYmICEoJHdpZHRoID09IDAgfHwgJGhlaWdodCA9PSAwKSkgewoJCQlpZiAoKCR4cmF0aW8gKiAkdGhpcy0+X2hlaWdodCkgPCAkaGVpZ2h0KSB7CgkJCQkkdGhpcy0+X2hlaWdodCA9IGNlaWwoJHhyYXRpbyAqICR0aGlzLT5faGVpZ2h0KTsKCQkJCSR0aGlzLT5fd2lkdGggID0gJHdpZHRoOwoJCQl9IGVsc2UgewoJCQkJJHRoaXMtPl93aWR0aAk9IGNlaWwoJHlyYXRpbyAqICR0aGlzLT5fd2lkdGgpOwoJCQkJJHRoaXMtPl9oZWlnaHQJPSAkaGVpZ2h0OwoJCQl9CgkJfQoJCXJldHVybiAkdGhpczsKCX0KCiAgICAvKioKICAgICAqIEdldCBSZXNpemVQcm9wb3J0aW9uYWwKICAgICAqCiAgICAgKiBAcmV0dXJuIGJvb2xlYW4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldFJlc2l6ZVByb3BvcnRpb25hbCgpIHsKICAgIAlyZXR1cm4gJHRoaXMtPl9yZXNpemVQcm9wb3J0aW9uYWw7CiAgICB9CgogICAgLyoqCiAgICAgKiBTZXQgUmVzaXplUHJvcG9ydGlvbmFsCiAgICAgKgogICAgICogQHBhcmFtIGJvb2xlYW4gJHBWYWx1ZQogICAgICogQHJldHVybiBQSFBFeGNlbF9Xb3Jrc2hlZXRfSGVhZGVyRm9vdGVyRHJhd2luZwogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gc2V0UmVzaXplUHJvcG9ydGlvbmFsKCRwVmFsdWUgPSB0cnVlKSB7CiAgICAJJHRoaXMtPl9yZXNpemVQcm9wb3J0aW9uYWwgPSAkcFZhbHVlOwogICAgCXJldHVybiAkdGhpczsKICAgIH0KCiAgICAvKioKICAgICAqIEdldCBGaWxlbmFtZQogICAgICoKICAgICAqIEByZXR1cm4gc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRGaWxlbmFtZSgpIHsKICAgIAlyZXR1cm4gYmFzZW5hbWUoJHRoaXMtPl9wYXRoKTsKICAgIH0KCiAgICAvKioKICAgICAqIEdldCBFeHRlbnNpb24KICAgICAqCiAgICAgKiBAcmV0dXJuIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0RXh0ZW5zaW9uKCkgewogICAgICAgICRwYXJ0cyA9IGV4cGxvZGUoIi4iLCBiYXNlbmFtZSgkdGhpcy0+X3BhdGgpKTsKICAgICAgICByZXR1cm4gZW5kKCRwYXJ0cyk7CiAgICB9CgogICAgLyoqCiAgICAgKiBHZXQgUGF0aAogICAgICoKICAgICAqIEByZXR1cm4gc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRQYXRoKCkgewogICAgCXJldHVybiAkdGhpcy0+X3BhdGg7CiAgICB9CgogICAgLyoqCiAgICAgKiBTZXQgUGF0aAogICAgICoKICAgICAqIEBwYXJhbSAJc3RyaW5nIAkJJHBWYWx1ZQkJCUZpbGUgcGF0aAogICAgICogQHBhcmFtIAlib29sZWFuCQkkcFZlcmlmeUZpbGUJVmVyaWZ5IGZpbGUKICAgICAqIEB0aHJvd3MgCUV4Y2VwdGlvbgogICAgICogQHJldHVybiBQSFBFeGNlbF9Xb3Jrc2hlZXRfSGVhZGVyRm9vdGVyRHJhd2luZwogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gc2V0UGF0aCgkcFZhbHVlID0gJycsICRwVmVyaWZ5RmlsZSA9IHRydWUpIHsKICAgIAlpZiAoJHBWZXJpZnlGaWxlKSB7CgkgICAgCWlmIChmaWxlX2V4aXN0cygkcFZhbHVlKSkgewoJICAgIAkJJHRoaXMtPl9wYXRoID0gJHBWYWx1ZTsKCgkgICAgCQlpZiAoJHRoaXMtPl93aWR0aCA9PSAwICYmICR0aGlzLT5faGVpZ2h0ID09IDApIHsKCSAgICAJCQkvLyBHZXQgd2lkdGgvaGVpZ2h0CgkgICAgCQkJbGlzdCgkdGhpcy0+X3dpZHRoLCAkdGhpcy0+X2hlaWdodCkgPSBnZXRpbWFnZXNpemUoJHBWYWx1ZSk7CgkgICAgCQl9CgkgICAgCX0gZWxzZSB7CgkgICAgCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCJGaWxlICRwVmFsdWUgbm90IGZvdW5kISIpOwoJICAgIAl9CiAgICAJfSBlbHNlIHsKICAgIAkJJHRoaXMtPl9wYXRoID0gJHBWYWx1ZTsKICAgIAl9CiAgICAJcmV0dXJuICR0aGlzOwogICAgfQoKCS8qKgoJICogR2V0IGhhc2ggY29kZQoJICoKCSAqIEByZXR1cm4gc3RyaW5nCUhhc2ggY29kZQoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0SGFzaENvZGUoKSB7CiAgICAJcmV0dXJuIG1kNSgKICAgIAkJICAkdGhpcy0+X3BhdGgKICAgIAkJLiAkdGhpcy0+X25hbWUKICAgIAkJLiAkdGhpcy0+X29mZnNldFgKICAgIAkJLiAkdGhpcy0+X29mZnNldFkKICAgIAkJLiAkdGhpcy0+X3dpZHRoCiAgICAJCS4gJHRoaXMtPl9oZWlnaHQKICAgIAkJLiBfX0NMQVNTX18KICAgIAkpOwogICAgfQoKCS8qKgoJICogSW1wbGVtZW50IFBIUCBfX2Nsb25lIHRvIGNyZWF0ZSBhIGRlZXAgY2xvbmUsIG5vdCBqdXN0IGEgc2hhbGxvdyBjb3B5LgoJICovCglwdWJsaWMgZnVuY3Rpb24gX19jbG9uZSgpIHsKCQkkdmFycyA9IGdldF9vYmplY3RfdmFycygkdGhpcyk7CgkJZm9yZWFjaCAoJHZhcnMgYXMgJGtleSA9PiAkdmFsdWUpIHsKCQkJaWYgKGlzX29iamVjdCgkdmFsdWUpKSB7CgkJCQkkdGhpcy0+JGtleSA9IGNsb25lICR2YWx1ZTsKCQkJfSBlbHNlIHsKCQkJCSR0aGlzLT4ka2V5ID0gJHZhbHVlOwoJCQl9CgkJfQoJfQp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Worksheet/MemoryDrawing.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIFBIUEV4Y2VsCiAqCiAqIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICoKICogQGNhdGVnb3J5ICAgUEhQRXhjZWwKICogQHBhY2thZ2UgICAgUEhQRXhjZWxfV29ya3NoZWV0CiAqIEBjb3B5cmlnaHQgIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwgKGh0dHA6Ly93d3cuY29kZXBsZXguY29tL1BIUEV4Y2VsKQogKiBAbGljZW5zZSAgICBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvb2xkLWxpY2Vuc2VzL2xncGwtMi4xLnR4dAlMR1BMCiAqIEB2ZXJzaW9uICAgIDEuNy43LCAyMDEyLTA1LTE5CiAqLwoKCi8qKgogKiBQSFBFeGNlbF9Xb3Jrc2hlZXRfTWVtb3J5RHJhd2luZwogKgogKiBAY2F0ZWdvcnkgICBQSFBFeGNlbAogKiBAcGFja2FnZSAgICBQSFBFeGNlbF9Xb3Jrc2hlZXQKICogQGNvcHlyaWdodCAgQ29weXJpZ2h0IChjKSAyMDA2IC0gMjAxMiBQSFBFeGNlbCAoaHR0cDovL3d3dy5jb2RlcGxleC5jb20vUEhQRXhjZWwpCiAqLwpjbGFzcyBQSFBFeGNlbF9Xb3Jrc2hlZXRfTWVtb3J5RHJhd2luZyBleHRlbmRzIFBIUEV4Y2VsX1dvcmtzaGVldF9CYXNlRHJhd2luZyBpbXBsZW1lbnRzIFBIUEV4Y2VsX0lDb21wYXJhYmxlCnsKCS8qIFJlbmRlcmluZyBmdW5jdGlvbnMgKi8KCWNvbnN0IFJFTkRFUklOR19ERUZBVUxUCQkJCQk9ICdpbWFnZXBuZyc7Cgljb25zdCBSRU5ERVJJTkdfUE5HCQkJCQkJPSAnaW1hZ2VwbmcnOwoJY29uc3QgUkVOREVSSU5HX0dJRgkJCQkJCT0gJ2ltYWdlZ2lmJzsKCWNvbnN0IFJFTkRFUklOR19KUEVHCQkJCQk9ICdpbWFnZWpwZWcnOwoKCS8qIE1JTUUgdHlwZXMgKi8KCWNvbnN0IE1JTUVUWVBFX0RFRkFVTFQJCQkJCT0gJ2ltYWdlL3BuZyc7Cgljb25zdCBNSU1FVFlQRV9QTkcJCQkJCQk9ICdpbWFnZS9wbmcnOwoJY29uc3QgTUlNRVRZUEVfR0lGCQkJCQkJPSAnaW1hZ2UvZ2lmJzsKCWNvbnN0IE1JTUVUWVBFX0pQRUcJCQkJCQk9ICdpbWFnZS9qcGVnJzsKCgkvKioKCSAqIEltYWdlIHJlc291cmNlCgkgKgoJICogQHZhciByZXNvdXJjZQoJICovCglwcml2YXRlICRfaW1hZ2VSZXNvdXJjZTsKCgkvKioKCSAqIFJlbmRlcmluZyBmdW5jdGlvbgoJICoKCSAqIEB2YXIgc3RyaW5nCgkgKi8KCXByaXZhdGUgJF9yZW5kZXJpbmdGdW5jdGlvbjsKCgkvKioKCSAqIE1pbWUgdHlwZQoJICoKCSAqIEB2YXIgc3RyaW5nCgkgKi8KCXByaXZhdGUgJF9taW1lVHlwZTsKCgkvKioKCSAqIFVuaXF1ZSBuYW1lCgkgKgoJICogQHZhciBzdHJpbmcKCSAqLwoJcHJpdmF0ZSAkX3VuaXF1ZU5hbWU7CgogICAgLyoqCiAgICAgKiBDcmVhdGUgYSBuZXcgUEhQRXhjZWxfV29ya3NoZWV0X01lbW9yeURyYXdpbmcKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCkKICAgIHsKICAgIAkvLyBJbml0aWFsaXNlIHZhbHVlcwogICAgCSR0aGlzLT5faW1hZ2VSZXNvdXJjZQkJPSBudWxsOwogICAgCSR0aGlzLT5fcmVuZGVyaW5nRnVuY3Rpb24gCT0gc2VsZjo6UkVOREVSSU5HX0RFRkFVTFQ7CiAgICAJJHRoaXMtPl9taW1lVHlwZQkJCT0gc2VsZjo6TUlNRVRZUEVfREVGQVVMVDsKICAgIAkkdGhpcy0+X3VuaXF1ZU5hbWUJCQk9IG1kNShyYW5kKDAsIDk5OTkpLiB0aW1lKCkgLiByYW5kKDAsIDk5OTkpKTsKCiAgICAJLy8gSW5pdGlhbGl6ZSBwYXJlbnQKICAgIAlwYXJlbnQ6Ol9fY29uc3RydWN0KCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBHZXQgaW1hZ2UgcmVzb3VyY2UKICAgICAqCiAgICAgKiBAcmV0dXJuIHJlc291cmNlCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRJbWFnZVJlc291cmNlKCkgewogICAgCXJldHVybiAkdGhpcy0+X2ltYWdlUmVzb3VyY2U7CiAgICB9CgogICAgLyoqCiAgICAgKiBTZXQgaW1hZ2UgcmVzb3VyY2UKICAgICAqCiAgICAgKiBAcGFyYW0JJHZhbHVlIHJlc291cmNlCiAgICAgKiBAcmV0dXJuIFBIUEV4Y2VsX1dvcmtzaGVldF9NZW1vcnlEcmF3aW5nCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBzZXRJbWFnZVJlc291cmNlKCR2YWx1ZSA9IG51bGwpIHsKICAgIAkkdGhpcy0+X2ltYWdlUmVzb3VyY2UgPSAkdmFsdWU7CgogICAgCWlmICghaXNfbnVsbCgkdGhpcy0+X2ltYWdlUmVzb3VyY2UpKSB7CgkgICAgCS8vIEdldCB3aWR0aC9oZWlnaHQKCSAgICAJJHRoaXMtPl93aWR0aAk9IGltYWdlc3goJHRoaXMtPl9pbWFnZVJlc291cmNlKTsKCSAgICAJJHRoaXMtPl9oZWlnaHQJPSBpbWFnZXN5KCR0aGlzLT5faW1hZ2VSZXNvdXJjZSk7CiAgICAJfQogICAgCXJldHVybiAkdGhpczsKICAgIH0KCiAgICAvKioKICAgICAqIEdldCByZW5kZXJpbmcgZnVuY3Rpb24KICAgICAqCiAgICAgKiBAcmV0dXJuIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0UmVuZGVyaW5nRnVuY3Rpb24oKSB7CiAgICAJcmV0dXJuICR0aGlzLT5fcmVuZGVyaW5nRnVuY3Rpb247CiAgICB9CgogICAgLyoqCiAgICAgKiBTZXQgcmVuZGVyaW5nIGZ1bmN0aW9uCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyAkdmFsdWUKICAgICAqIEByZXR1cm4gUEhQRXhjZWxfV29ya3NoZWV0X01lbW9yeURyYXdpbmcKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHNldFJlbmRlcmluZ0Z1bmN0aW9uKCR2YWx1ZSA9IFBIUEV4Y2VsX1dvcmtzaGVldF9NZW1vcnlEcmF3aW5nOjpSRU5ERVJJTkdfREVGQVVMVCkgewogICAgCSR0aGlzLT5fcmVuZGVyaW5nRnVuY3Rpb24gPSAkdmFsdWU7CiAgICAJcmV0dXJuICR0aGlzOwogICAgfQoKICAgIC8qKgogICAgICogR2V0IG1pbWUgdHlwZQogICAgICoKICAgICAqIEByZXR1cm4gc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRNaW1lVHlwZSgpIHsKICAgIAlyZXR1cm4gJHRoaXMtPl9taW1lVHlwZTsKICAgIH0KCiAgICAvKioKICAgICAqIFNldCBtaW1lIHR5cGUKICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nICR2YWx1ZQogICAgICogQHJldHVybiBQSFBFeGNlbF9Xb3Jrc2hlZXRfTWVtb3J5RHJhd2luZwogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gc2V0TWltZVR5cGUoJHZhbHVlID0gUEhQRXhjZWxfV29ya3NoZWV0X01lbW9yeURyYXdpbmc6Ok1JTUVUWVBFX0RFRkFVTFQpIHsKICAgIAkkdGhpcy0+X21pbWVUeXBlID0gJHZhbHVlOwogICAgCXJldHVybiAkdGhpczsKICAgIH0KCiAgICAvKioKICAgICAqIEdldCBpbmRleGVkIGZpbGVuYW1lICh1c2luZyBpbWFnZSBpbmRleCkKICAgICAqCiAgICAgKiBAcmV0dXJuIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0SW5kZXhlZEZpbGVuYW1lKCkgewoJCSRleHRlbnNpb24gCT0gc3RydG9sb3dlcigkdGhpcy0+Z2V0TWltZVR5cGUoKSk7CgkJJGV4dGVuc2lvbiAJPSBleHBsb2RlKCcvJywgJGV4dGVuc2lvbik7CgkJJGV4dGVuc2lvbiAJPSAkZXh0ZW5zaW9uWzFdOwoKICAgIAlyZXR1cm4gJHRoaXMtPl91bmlxdWVOYW1lIC4gJHRoaXMtPmdldEltYWdlSW5kZXgoKSAuICcuJyAuICRleHRlbnNpb247CiAgICB9CgoJLyoqCgkgKiBHZXQgaGFzaCBjb2RlCgkgKgoJICogQHJldHVybiBzdHJpbmcJSGFzaCBjb2RlCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRIYXNoQ29kZSgpIHsKICAgIAlyZXR1cm4gbWQ1KAogICAgCQkgICR0aGlzLT5fcmVuZGVyaW5nRnVuY3Rpb24KICAgIAkJLiAkdGhpcy0+X21pbWVUeXBlCiAgICAJCS4gJHRoaXMtPl91bmlxdWVOYW1lCiAgICAJCS4gcGFyZW50OjpnZXRIYXNoQ29kZSgpCiAgICAJCS4gX19DTEFTU19fCiAgICAJKTsKICAgIH0KCgkvKioKCSAqIEltcGxlbWVudCBQSFAgX19jbG9uZSB0byBjcmVhdGUgYSBkZWVwIGNsb25lLCBub3QganVzdCBhIHNoYWxsb3cgY29weS4KCSAqLwoJcHVibGljIGZ1bmN0aW9uIF9fY2xvbmUoKSB7CgkJJHZhcnMgPSBnZXRfb2JqZWN0X3ZhcnMoJHRoaXMpOwoJCWZvcmVhY2ggKCR2YXJzIGFzICRrZXkgPT4gJHZhbHVlKSB7CgkJCWlmIChpc19vYmplY3QoJHZhbHVlKSkgewoJCQkJJHRoaXMtPiRrZXkgPSBjbG9uZSAkdmFsdWU7CgkJCX0gZWxzZSB7CgkJCQkkdGhpcy0+JGtleSA9ICR2YWx1ZTsKCQkJfQoJCX0KCX0KfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Worksheet/PageMargins.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIFBIUEV4Y2VsCiAqCiAqIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICoKICogQGNhdGVnb3J5ICAgUEhQRXhjZWwKICogQHBhY2thZ2UgICAgUEhQRXhjZWxfV29ya3NoZWV0CiAqIEBjb3B5cmlnaHQgIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwgKGh0dHA6Ly93d3cuY29kZXBsZXguY29tL1BIUEV4Y2VsKQogKiBAbGljZW5zZSAgICBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvb2xkLWxpY2Vuc2VzL2xncGwtMi4xLnR4dAlMR1BMCiAqIEB2ZXJzaW9uICAgIDEuNy43LCAyMDEyLTA1LTE5CiAqLwoKCi8qKgogKiBQSFBFeGNlbF9Xb3Jrc2hlZXRfUGFnZU1hcmdpbnMKICoKICogQGNhdGVnb3J5ICAgUEhQRXhjZWwKICogQHBhY2thZ2UgICAgUEhQRXhjZWxfV29ya3NoZWV0CiAqIEBjb3B5cmlnaHQgIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwgKGh0dHA6Ly93d3cuY29kZXBsZXguY29tL1BIUEV4Y2VsKQogKi8KY2xhc3MgUEhQRXhjZWxfV29ya3NoZWV0X1BhZ2VNYXJnaW5zCnsKCS8qKgoJICogTGVmdAoJICoKCSAqIEB2YXIgZG91YmxlCgkgKi8KCXByaXZhdGUgJF9sZWZ0CQk9IDAuNzsKCgkvKioKCSAqIFJpZ2h0CgkgKgoJICogQHZhciBkb3VibGUKCSAqLwoJcHJpdmF0ZSAkX3JpZ2h0CQk9IDAuNzsKCgkvKioKCSAqIFRvcAoJICoKCSAqIEB2YXIgZG91YmxlCgkgKi8KCXByaXZhdGUgJF90b3AJCT0gMC43NTsKCgkvKioKCSAqIEJvdHRvbQoJICoKCSAqIEB2YXIgZG91YmxlCgkgKi8KCXByaXZhdGUgJF9ib3R0b20JPSAwLjc1OwoKCS8qKgoJICogSGVhZGVyCgkgKgoJICogQHZhciBkb3VibGUKCSAqLwoJcHJpdmF0ZSAkX2hlYWRlciAJPSAwLjM7CgoJLyoqCgkgKiBGb290ZXIKCSAqCgkgKiBAdmFyIGRvdWJsZQoJICovCglwcml2YXRlICRfZm9vdGVyIAk9IDAuMzsKCiAgICAvKioKICAgICAqIENyZWF0ZSBhIG5ldyBQSFBFeGNlbF9Xb3Jrc2hlZXRfUGFnZU1hcmdpbnMKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCkKICAgIHsKICAgIH0KCiAgICAvKioKICAgICAqIEdldCBMZWZ0CiAgICAgKgogICAgICogQHJldHVybiBkb3VibGUKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldExlZnQoKSB7CiAgICAJcmV0dXJuICR0aGlzLT5fbGVmdDsKICAgIH0KCiAgICAvKioKICAgICAqIFNldCBMZWZ0CiAgICAgKgogICAgICogQHBhcmFtIGRvdWJsZSAkcFZhbHVlCiAgICAgKiBAcmV0dXJuIFBIUEV4Y2VsX1dvcmtzaGVldF9QYWdlTWFyZ2lucwogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gc2V0TGVmdCgkcFZhbHVlKSB7CiAgICAJJHRoaXMtPl9sZWZ0ID0gJHBWYWx1ZTsKICAgIAlyZXR1cm4gJHRoaXM7CiAgICB9CgogICAgLyoqCiAgICAgKiBHZXQgUmlnaHQKICAgICAqCiAgICAgKiBAcmV0dXJuIGRvdWJsZQogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0UmlnaHQoKSB7CiAgICAJcmV0dXJuICR0aGlzLT5fcmlnaHQ7CiAgICB9CgogICAgLyoqCiAgICAgKiBTZXQgUmlnaHQKICAgICAqCiAgICAgKiBAcGFyYW0gZG91YmxlICRwVmFsdWUKICAgICAqIEByZXR1cm4gUEhQRXhjZWxfV29ya3NoZWV0X1BhZ2VNYXJnaW5zCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBzZXRSaWdodCgkcFZhbHVlKSB7CiAgICAJJHRoaXMtPl9yaWdodCA9ICRwVmFsdWU7CiAgICAJcmV0dXJuICR0aGlzOwogICAgfQoKICAgIC8qKgogICAgICogR2V0IFRvcAogICAgICoKICAgICAqIEByZXR1cm4gZG91YmxlCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRUb3AoKSB7CiAgICAJcmV0dXJuICR0aGlzLT5fdG9wOwogICAgfQoKICAgIC8qKgogICAgICogU2V0IFRvcAogICAgICoKICAgICAqIEBwYXJhbSBkb3VibGUgJHBWYWx1ZQogICAgICogQHJldHVybiBQSFBFeGNlbF9Xb3Jrc2hlZXRfUGFnZU1hcmdpbnMKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHNldFRvcCgkcFZhbHVlKSB7CiAgICAJJHRoaXMtPl90b3AgPSAkcFZhbHVlOwogICAgCXJldHVybiAkdGhpczsKICAgIH0KCiAgICAvKioKICAgICAqIEdldCBCb3R0b20KICAgICAqCiAgICAgKiBAcmV0dXJuIGRvdWJsZQogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0Qm90dG9tKCkgewogICAgCXJldHVybiAkdGhpcy0+X2JvdHRvbTsKICAgIH0KCiAgICAvKioKICAgICAqIFNldCBCb3R0b20KICAgICAqCiAgICAgKiBAcGFyYW0gZG91YmxlICRwVmFsdWUKICAgICAqIEByZXR1cm4gUEhQRXhjZWxfV29ya3NoZWV0X1BhZ2VNYXJnaW5zCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBzZXRCb3R0b20oJHBWYWx1ZSkgewogICAgCSR0aGlzLT5fYm90dG9tID0gJHBWYWx1ZTsKICAgIAlyZXR1cm4gJHRoaXM7CiAgICB9CgogICAgLyoqCiAgICAgKiBHZXQgSGVhZGVyCiAgICAgKgogICAgICogQHJldHVybiBkb3VibGUKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldEhlYWRlcigpIHsKICAgIAlyZXR1cm4gJHRoaXMtPl9oZWFkZXI7CiAgICB9CgogICAgLyoqCiAgICAgKiBTZXQgSGVhZGVyCiAgICAgKgogICAgICogQHBhcmFtIGRvdWJsZSAkcFZhbHVlCiAgICAgKiBAcmV0dXJuIFBIUEV4Y2VsX1dvcmtzaGVldF9QYWdlTWFyZ2lucwogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gc2V0SGVhZGVyKCRwVmFsdWUpIHsKICAgIAkkdGhpcy0+X2hlYWRlciA9ICRwVmFsdWU7CiAgICAJcmV0dXJuICR0aGlzOwogICAgfQoKICAgIC8qKgogICAgICogR2V0IEZvb3RlcgogICAgICoKICAgICAqIEByZXR1cm4gZG91YmxlCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRGb290ZXIoKSB7CiAgICAJcmV0dXJuICR0aGlzLT5fZm9vdGVyOwogICAgfQoKICAgIC8qKgogICAgICogU2V0IEZvb3RlcgogICAgICoKICAgICAqIEBwYXJhbSBkb3VibGUgJHBWYWx1ZQogICAgICogQHJldHVybiBQSFBFeGNlbF9Xb3Jrc2hlZXRfUGFnZU1hcmdpbnMKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHNldEZvb3RlcigkcFZhbHVlKSB7CiAgICAJJHRoaXMtPl9mb290ZXIgPSAkcFZhbHVlOwogICAgCXJldHVybiAkdGhpczsKICAgIH0KCgkvKioKCSAqIEltcGxlbWVudCBQSFAgX19jbG9uZSB0byBjcmVhdGUgYSBkZWVwIGNsb25lLCBub3QganVzdCBhIHNoYWxsb3cgY29weS4KCSAqLwoJcHVibGljIGZ1bmN0aW9uIF9fY2xvbmUoKSB7CgkJJHZhcnMgPSBnZXRfb2JqZWN0X3ZhcnMoJHRoaXMpOwoJCWZvcmVhY2ggKCR2YXJzIGFzICRrZXkgPT4gJHZhbHVlKSB7CgkJCWlmIChpc19vYmplY3QoJHZhbHVlKSkgewoJCQkJJHRoaXMtPiRrZXkgPSBjbG9uZSAkdmFsdWU7CgkJCX0gZWxzZSB7CgkJCQkkdGhpcy0+JGtleSA9ICR2YWx1ZTsKCQkJfQoJCX0KCX0KfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Worksheet/PageSetup.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIFBIUEV4Y2VsCiAqCiAqIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICoKICogQGNhdGVnb3J5ICAgUEhQRXhjZWwKICogQHBhY2thZ2UgICAgUEhQRXhjZWxfV29ya3NoZWV0CiAqIEBjb3B5cmlnaHQgIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwgKGh0dHA6Ly93d3cuY29kZXBsZXguY29tL1BIUEV4Y2VsKQogKiBAbGljZW5zZSAgICBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvb2xkLWxpY2Vuc2VzL2xncGwtMi4xLnR4dAlMR1BMCiAqIEB2ZXJzaW9uICAgIDEuNy43LCAyMDEyLTA1LTE5CiAqLwoKCi8qKgogKiBQSFBFeGNlbF9Xb3Jrc2hlZXRfUGFnZVNldHVwCiAqCiAqIDxjb2RlPgogKiBQYXBlciBzaXplIHRha2VuIGZyb20gT2ZmaWNlIE9wZW4gWE1MIFBhcnQgNCAtIE1hcmt1cCBMYW5ndWFnZSBSZWZlcmVuY2UsIHBhZ2UgMTk4ODoKICoKICogMSA9IExldHRlciBwYXBlciAoOC41IGluLiBieSAxMSBpbi4pCiAqIDIgPSBMZXR0ZXIgc21hbGwgcGFwZXIgKDguNSBpbi4gYnkgMTEgaW4uKQogKiAzID0gVGFibG9pZCBwYXBlciAoMTEgaW4uIGJ5IDE3IGluLikKICogNCA9IExlZGdlciBwYXBlciAoMTcgaW4uIGJ5IDExIGluLikKICogNSA9IExlZ2FsIHBhcGVyICg4LjUgaW4uIGJ5IDE0IGluLikKICogNiA9IFN0YXRlbWVudCBwYXBlciAoNS41IGluLiBieSA4LjUgaW4uKQogKiA3ID0gRXhlY3V0aXZlIHBhcGVyICg3LjI1IGluLiBieSAxMC41IGluLikKICogOCA9IEEzIHBhcGVyICgyOTcgbW0gYnkgNDIwIG1tKQogKiA5ID0gQTQgcGFwZXIgKDIxMCBtbSBieSAyOTcgbW0pCiAqIDEwID0gQTQgc21hbGwgcGFwZXIgKDIxMCBtbSBieSAyOTcgbW0pCiAqIDExID0gQTUgcGFwZXIgKDE0OCBtbSBieSAyMTAgbW0pCiAqIDEyID0gQjQgcGFwZXIgKDI1MCBtbSBieSAzNTMgbW0pCiAqIDEzID0gQjUgcGFwZXIgKDE3NiBtbSBieSAyNTAgbW0pCiAqIDE0ID0gRm9saW8gcGFwZXIgKDguNSBpbi4gYnkgMTMgaW4uKQogKiAxNSA9IFF1YXJ0byBwYXBlciAoMjE1IG1tIGJ5IDI3NSBtbSkKICogMTYgPSBTdGFuZGFyZCBwYXBlciAoMTAgaW4uIGJ5IDE0IGluLikKICogMTcgPSBTdGFuZGFyZCBwYXBlciAoMTEgaW4uIGJ5IDE3IGluLikKICogMTggPSBOb3RlIHBhcGVyICg4LjUgaW4uIGJ5IDExIGluLikKICogMTkgPSAjOSBlbnZlbG9wZSAoMy44NzUgaW4uIGJ5IDguODc1IGluLikKICogMjAgPSAjMTAgZW52ZWxvcGUgKDQuMTI1IGluLiBieSA5LjUgaW4uKQogKiAyMSA9ICMxMSBlbnZlbG9wZSAoNC41IGluLiBieSAxMC4zNzUgaW4uKQogKiAyMiA9ICMxMiBlbnZlbG9wZSAoNC43NSBpbi4gYnkgMTEgaW4uKQogKiAyMyA9ICMxNCBlbnZlbG9wZSAoNSBpbi4gYnkgMTEuNSBpbi4pCiAqIDI0ID0gQyBwYXBlciAoMTcgaW4uIGJ5IDIyIGluLikKICogMjUgPSBEIHBhcGVyICgyMiBpbi4gYnkgMzQgaW4uKQogKiAyNiA9IEUgcGFwZXIgKDM0IGluLiBieSA0NCBpbi4pCiAqIDI3ID0gREwgZW52ZWxvcGUgKDExMCBtbSBieSAyMjAgbW0pCiAqIDI4ID0gQzUgZW52ZWxvcGUgKDE2MiBtbSBieSAyMjkgbW0pCiAqIDI5ID0gQzMgZW52ZWxvcGUgKDMyNCBtbSBieSA0NTggbW0pCiAqIDMwID0gQzQgZW52ZWxvcGUgKDIyOSBtbSBieSAzMjQgbW0pCiAqIDMxID0gQzYgZW52ZWxvcGUgKDExNCBtbSBieSAxNjIgbW0pCiAqIDMyID0gQzY1IGVudmVsb3BlICgxMTQgbW0gYnkgMjI5IG1tKQogKiAzMyA9IEI0IGVudmVsb3BlICgyNTAgbW0gYnkgMzUzIG1tKQogKiAzNCA9IEI1IGVudmVsb3BlICgxNzYgbW0gYnkgMjUwIG1tKQogKiAzNSA9IEI2IGVudmVsb3BlICgxNzYgbW0gYnkgMTI1IG1tKQogKiAzNiA9IEl0YWx5IGVudmVsb3BlICgxMTAgbW0gYnkgMjMwIG1tKQogKiAzNyA9IE1vbmFyY2ggZW52ZWxvcGUgKDMuODc1IGluLiBieSA3LjUgaW4uKS4KICogMzggPSA2IDMvNCBlbnZlbG9wZSAoMy42MjUgaW4uIGJ5IDYuNSBpbi4pCiAqIDM5ID0gVVMgc3RhbmRhcmQgZmFuZm9sZCAoMTQuODc1IGluLiBieSAxMSBpbi4pCiAqIDQwID0gR2VybWFuIHN0YW5kYXJkIGZhbmZvbGQgKDguNSBpbi4gYnkgMTIgaW4uKQogKiA0MSA9IEdlcm1hbiBsZWdhbCBmYW5mb2xkICg4LjUgaW4uIGJ5IDEzIGluLikKICogNDIgPSBJU08gQjQgKDI1MCBtbSBieSAzNTMgbW0pCiAqIDQzID0gSmFwYW5lc2UgZG91YmxlIHBvc3RjYXJkICgyMDAgbW0gYnkgMTQ4IG1tKQogKiA0NCA9IFN0YW5kYXJkIHBhcGVyICg5IGluLiBieSAxMSBpbi4pCiAqIDQ1ID0gU3RhbmRhcmQgcGFwZXIgKDEwIGluLiBieSAxMSBpbi4pCiAqIDQ2ID0gU3RhbmRhcmQgcGFwZXIgKDE1IGluLiBieSAxMSBpbi4pCiAqIDQ3ID0gSW52aXRlIGVudmVsb3BlICgyMjAgbW0gYnkgMjIwIG1tKQogKiA1MCA9IExldHRlciBleHRyYSBwYXBlciAoOS4yNzUgaW4uIGJ5IDEyIGluLikKICogNTEgPSBMZWdhbCBleHRyYSBwYXBlciAoOS4yNzUgaW4uIGJ5IDE1IGluLikKICogNTIgPSBUYWJsb2lkIGV4dHJhIHBhcGVyICgxMS42OSBpbi4gYnkgMTggaW4uKQogKiA1MyA9IEE0IGV4dHJhIHBhcGVyICgyMzYgbW0gYnkgMzIyIG1tKQogKiA1NCA9IExldHRlciB0cmFuc3ZlcnNlIHBhcGVyICg4LjI3NSBpbi4gYnkgMTEgaW4uKQogKiA1NSA9IEE0IHRyYW5zdmVyc2UgcGFwZXIgKDIxMCBtbSBieSAyOTcgbW0pCiAqIDU2ID0gTGV0dGVyIGV4dHJhIHRyYW5zdmVyc2UgcGFwZXIgKDkuMjc1IGluLiBieSAxMiBpbi4pCiAqIDU3ID0gU3VwZXJBL1N1cGVyQS9BNCBwYXBlciAoMjI3IG1tIGJ5IDM1NiBtbSkKICogNTggPSBTdXBlckIvU3VwZXJCL0EzIHBhcGVyICgzMDUgbW0gYnkgNDg3IG1tKQogKiA1OSA9IExldHRlciBwbHVzIHBhcGVyICg4LjUgaW4uIGJ5IDEyLjY5IGluLikKICogNjAgPSBBNCBwbHVzIHBhcGVyICgyMTAgbW0gYnkgMzMwIG1tKQogKiA2MSA9IEE1IHRyYW5zdmVyc2UgcGFwZXIgKDE0OCBtbSBieSAyMTAgbW0pCiAqIDYyID0gSklTIEI1IHRyYW5zdmVyc2UgcGFwZXIgKDE4MiBtbSBieSAyNTcgbW0pCiAqIDYzID0gQTMgZXh0cmEgcGFwZXIgKDMyMiBtbSBieSA0NDUgbW0pCiAqIDY0ID0gQTUgZXh0cmEgcGFwZXIgKDE3NCBtbSBieSAyMzUgbW0pCiAqIDY1ID0gSVNPIEI1IGV4dHJhIHBhcGVyICgyMDEgbW0gYnkgMjc2IG1tKQogKiA2NiA9IEEyIHBhcGVyICg0MjAgbW0gYnkgNTk0IG1tKQogKiA2NyA9IEEzIHRyYW5zdmVyc2UgcGFwZXIgKDI5NyBtbSBieSA0MjAgbW0pCiAqIDY4ID0gQTMgZXh0cmEgdHJhbnN2ZXJzZSBwYXBlciAoMzIyIG1tIGJ5IDQ0NSBtbSkKICogPC9jb2RlPgogKgogKiBAY2F0ZWdvcnkgICBQSFBFeGNlbAogKiBAcGFja2FnZSAgICBQSFBFeGNlbF9Xb3Jrc2hlZXQKICogQGNvcHlyaWdodCAgQ29weXJpZ2h0IChjKSAyMDA2IC0gMjAxMiBQSFBFeGNlbCAoaHR0cDovL3d3dy5jb2RlcGxleC5jb20vUEhQRXhjZWwpCiAqLwpjbGFzcyBQSFBFeGNlbF9Xb3Jrc2hlZXRfUGFnZVNldHVwCnsKCS8qIFBhcGVyIHNpemUgKi8KCWNvbnN0IFBBUEVSU0laRV9MRVRURVIJCQkJCQkJPSAxOwoJY29uc3QgUEFQRVJTSVpFX0xFVFRFUl9TTUFMTAkJCQkJPSAyOwoJY29uc3QgUEFQRVJTSVpFX1RBQkxPSUQJCQkJCQkJPSAzOwoJY29uc3QgUEFQRVJTSVpFX0xFREdFUgkJCQkJCQk9IDQ7Cgljb25zdCBQQVBFUlNJWkVfTEVHQUwJCQkJCQkJPSA1OwoJY29uc3QgUEFQRVJTSVpFX1NUQVRFTUVOVAkJCQkJCT0gNjsKCWNvbnN0IFBBUEVSU0laRV9FWEVDVVRJVkUJCQkJCQk9IDc7Cgljb25zdCBQQVBFUlNJWkVfQTMJCQkJCQkJCT0gODsKCWNvbnN0IFBBUEVSU0laRV9BNAkJCQkJCQkJPSA5OwoJY29uc3QgUEFQRVJTSVpFX0E0X1NNQUxMCQkJCQkJPSAxMDsKCWNvbnN0IFBBUEVSU0laRV9BNQkJCQkJCQkJPSAxMTsKCWNvbnN0IFBBUEVSU0laRV9CNAkJCQkJCQkJPSAxMjsKCWNvbnN0IFBBUEVSU0laRV9CNQkJCQkJCQkJPSAxMzsKCWNvbnN0IFBBUEVSU0laRV9GT0xJTwkJCQkJCQk9IDE0OwoJY29uc3QgUEFQRVJTSVpFX1FVQVJUTwkJCQkJCQk9IDE1OwoJY29uc3QgUEFQRVJTSVpFX1NUQU5EQVJEXzEJCQkJCQk9IDE2OwoJY29uc3QgUEFQRVJTSVpFX1NUQU5EQVJEXzIJCQkJCQk9IDE3OwoJY29uc3QgUEFQRVJTSVpFX05PVEUJCQkJCQkJPSAxODsKCWNvbnN0IFBBUEVSU0laRV9OTzlfRU5WRUxPUEUJCQkJCT0gMTk7Cgljb25zdCBQQVBFUlNJWkVfTk8xMF9FTlZFTE9QRQkJCQkJPSAyMDsKCWNvbnN0IFBBUEVSU0laRV9OTzExX0VOVkVMT1BFCQkJCQk9IDIxOwoJY29uc3QgUEFQRVJTSVpFX05PMTJfRU5WRUxPUEUJCQkJCT0gMjI7Cgljb25zdCBQQVBFUlNJWkVfTk8xNF9FTlZFTE9QRQkJCQkJPSAyMzsKCWNvbnN0IFBBUEVSU0laRV9DCQkJCQkJCQk9IDI0OwoJY29uc3QgUEFQRVJTSVpFX0QJCQkJCQkJCT0gMjU7Cgljb25zdCBQQVBFUlNJWkVfRQkJCQkJCQkJPSAyNjsKCWNvbnN0IFBBUEVSU0laRV9ETF9FTlZFTE9QRQkJCQkJCT0gMjc7Cgljb25zdCBQQVBFUlNJWkVfQzVfRU5WRUxPUEUJCQkJCQk9IDI4OwoJY29uc3QgUEFQRVJTSVpFX0MzX0VOVkVMT1BFCQkJCQkJPSAyOTsKCWNvbnN0IFBBUEVSU0laRV9DNF9FTlZFTE9QRQkJCQkJCT0gMzA7Cgljb25zdCBQQVBFUlNJWkVfQzZfRU5WRUxPUEUJCQkJCQk9IDMxOwoJY29uc3QgUEFQRVJTSVpFX0M2NV9FTlZFTE9QRQkJCQkJPSAzMjsKCWNvbnN0IFBBUEVSU0laRV9CNF9FTlZFTE9QRQkJCQkJCT0gMzM7Cgljb25zdCBQQVBFUlNJWkVfQjVfRU5WRUxPUEUJCQkJCQk9IDM0OwoJY29uc3QgUEFQRVJTSVpFX0I2X0VOVkVMT1BFCQkJCQkJPSAzNTsKCWNvbnN0IFBBUEVSU0laRV9JVEFMWV9FTlZFTE9QRQkJCQkJPSAzNjsKCWNvbnN0IFBBUEVSU0laRV9NT05BUkNIX0VOVkVMT1BFCQkJCT0gMzc7Cgljb25zdCBQQVBFUlNJWkVfNl8zXzRfRU5WRUxPUEUJCQkJCT0gMzg7Cgljb25zdCBQQVBFUlNJWkVfVVNfU1RBTkRBUkRfRkFORk9MRAkJCQk9IDM5OwoJY29uc3QgUEFQRVJTSVpFX0dFUk1BTl9TVEFOREFSRF9GQU5GT0xECQkJPSA0MDsKCWNvbnN0IFBBUEVSU0laRV9HRVJNQU5fTEVHQUxfRkFORk9MRAkJCT0gNDE7Cgljb25zdCBQQVBFUlNJWkVfSVNPX0I0CQkJCQkJCT0gNDI7Cgljb25zdCBQQVBFUlNJWkVfSkFQQU5FU0VfRE9VQkxFX1BPU1RDQVJECQk9IDQzOwoJY29uc3QgUEFQRVJTSVpFX1NUQU5EQVJEX1BBUEVSXzEJCQkJPSA0NDsKCWNvbnN0IFBBUEVSU0laRV9TVEFOREFSRF9QQVBFUl8yCQkJCT0gNDU7Cgljb25zdCBQQVBFUlNJWkVfU1RBTkRBUkRfUEFQRVJfMwkJCQk9IDQ2OwoJY29uc3QgUEFQRVJTSVpFX0lOVklURV9FTlZFTE9QRQkJCQkJPSA0NzsKCWNvbnN0IFBBUEVSU0laRV9MRVRURVJfRVhUUkFfUEFQRVIJCQkJPSA0ODsKCWNvbnN0IFBBUEVSU0laRV9MRUdBTF9FWFRSQV9QQVBFUgkJCQk9IDQ5OwoJY29uc3QgUEFQRVJTSVpFX1RBQkxPSURfRVhUUkFfUEFQRVIJCQkJPSA1MDsKCWNvbnN0IFBBUEVSU0laRV9BNF9FWFRSQV9QQVBFUgkJCQkJPSA1MTsKCWNvbnN0IFBBUEVSU0laRV9MRVRURVJfVFJBTlNWRVJTRV9QQVBFUgkJCT0gNTI7Cgljb25zdCBQQVBFUlNJWkVfQTRfVFJBTlNWRVJTRV9QQVBFUgkJCQk9IDUzOwoJY29uc3QgUEFQRVJTSVpFX0xFVFRFUl9FWFRSQV9UUkFOU1ZFUlNFX1BBUEVSCT0gNTQ7Cgljb25zdCBQQVBFUlNJWkVfU1VQRVJBX1NVUEVSQV9BNF9QQVBFUgkJCT0gNTU7Cgljb25zdCBQQVBFUlNJWkVfU1VQRVJCX1NVUEVSQl9BM19QQVBFUgkJCT0gNTY7Cgljb25zdCBQQVBFUlNJWkVfTEVUVEVSX1BMVVNfUEFQRVIJCQkJPSA1NzsKCWNvbnN0IFBBUEVSU0laRV9BNF9QTFVTX1BBUEVSCQkJCQk9IDU4OwoJY29uc3QgUEFQRVJTSVpFX0E1X1RSQU5TVkVSU0VfUEFQRVIJCQkJPSA1OTsKCWNvbnN0IFBBUEVSU0laRV9KSVNfQjVfVFJBTlNWRVJTRV9QQVBFUgkJCT0gNjA7Cgljb25zdCBQQVBFUlNJWkVfQTNfRVhUUkFfUEFQRVIJCQkJCT0gNjE7Cgljb25zdCBQQVBFUlNJWkVfQTVfRVhUUkFfUEFQRVIJCQkJCT0gNjI7Cgljb25zdCBQQVBFUlNJWkVfSVNPX0I1X0VYVFJBX1BBUEVSCQkJCT0gNjM7Cgljb25zdCBQQVBFUlNJWkVfQTJfUEFQRVIJCQkJCQk9IDY0OwoJY29uc3QgUEFQRVJTSVpFX0EzX1RSQU5TVkVSU0VfUEFQRVIJCQkJPSA2NTsKCWNvbnN0IFBBUEVSU0laRV9BM19FWFRSQV9UUkFOU1ZFUlNFX1BBUEVSCQk9IDY2OwoKCS8qIFBhZ2Ugb3JpZW50YXRpb24gKi8KCWNvbnN0IE9SSUVOVEFUSU9OX0RFRkFVTFQJPSAnZGVmYXVsdCc7Cgljb25zdCBPUklFTlRBVElPTl9MQU5EU0NBUEUJPSAnbGFuZHNjYXBlJzsKCWNvbnN0IE9SSUVOVEFUSU9OX1BPUlRSQUlUCT0gJ3BvcnRyYWl0JzsKCgkvKiBQcmludCBSYW5nZSBTZXQgTWV0aG9kICovCgljb25zdCBTRVRQUklOVFJBTkdFX09WRVJXUklURQk9ICdPJzsKCWNvbnN0IFNFVFBSSU5UUkFOR0VfSU5TRVJUCQk9ICdJJzsKCgoJLyoqCgkgKiBQYXBlciBzaXplCgkgKgoJICogQHZhciBpbnQKCSAqLwoJcHJpdmF0ZSAkX3BhcGVyU2l6ZQkJPSBQSFBFeGNlbF9Xb3Jrc2hlZXRfUGFnZVNldHVwOjpQQVBFUlNJWkVfTEVUVEVSOwoKCS8qKgoJICogT3JpZW50YXRpb24KCSAqCgkgKiBAdmFyIHN0cmluZwoJICovCglwcml2YXRlICRfb3JpZW50YXRpb24JPSBQSFBFeGNlbF9Xb3Jrc2hlZXRfUGFnZVNldHVwOjpPUklFTlRBVElPTl9ERUZBVUxUOwoKCS8qKgoJICogU2NhbGUgKFByaW50IFNjYWxlKQoJICoKCSAqIFByaW50IHNjYWxpbmcuIFZhbGlkIHZhbHVlcyByYW5nZSBmcm9tIDEwIHRvIDQwMAoJICogVGhpcyBzZXR0aW5nIGlzIG92ZXJyaWRkZW4gd2hlbiBmaXRUb1dpZHRoIGFuZC9vciBmaXRUb0hlaWdodCBhcmUgaW4gdXNlCgkgKgoJICogQHZhciBpbnQ/CgkgKi8KCXByaXZhdGUgJF9zY2FsZQkJCT0gMTAwOwoKCS8qKgoJICAqIEZpdCBUbyBQYWdlCgkgICogV2hldGhlciBzY2FsZSBvciBmaXRUb1dpdGggLyBmaXRUb0hlaWdodCBhcHBsaWVzCgkgICoKCSAgKiBAdmFyIGJvb2xlYW4KCSAgKi8KCXByaXZhdGUgJF9maXRUb1BhZ2UJCT0gRkFMU0U7CgoJLyoqCgkgICogRml0IFRvIEhlaWdodAoJICAqIE51bWJlciBvZiB2ZXJ0aWNhbCBwYWdlcyB0byBmaXQgb24KCSAgKgoJICAqIEB2YXIgaW50PwoJICAqLwoJcHJpdmF0ZSAkX2ZpdFRvSGVpZ2h0CT0gMTsKCgkvKioKCSAgKiBGaXQgVG8gV2lkdGgKCSAgKiBOdW1iZXIgb2YgaG9yaXpvbnRhbCBwYWdlcyB0byBmaXQgb24KCSAgKgoJICAqIEB2YXIgaW50PwoJICAqLwoJcHJpdmF0ZSAkX2ZpdFRvV2lkdGgJPSAxOwoKCS8qKgoJICogQ29sdW1ucyB0byByZXBlYXQgYXQgbGVmdAoJICoKCSAqIEB2YXIgYXJyYXkgQ29udGFpbmluZyBzdGFydCBjb2x1bW4gYW5kIGVuZCBjb2x1bW4sIGVtcHR5IGFycmF5IGlmIG9wdGlvbiB1bnNldAoJICovCglwcml2YXRlICRfY29sdW1uc1RvUmVwZWF0QXRMZWZ0ID0gYXJyYXkoJycsICcnKTsKCgkvKioKCSAqIFJvd3MgdG8gcmVwZWF0IGF0IHRvcAoJICoKCSAqIEB2YXIgYXJyYXkgQ29udGFpbmluZyBzdGFydCByb3cgbnVtYmVyIGFuZCBlbmQgcm93IG51bWJlciwgZW1wdHkgYXJyYXkgaWYgb3B0aW9uIHVuc2V0CgkgKi8KCXByaXZhdGUgJF9yb3dzVG9SZXBlYXRBdFRvcCA9IGFycmF5KDAsIDApOwoKCS8qKgoJICogQ2VudGVyIHBhZ2UgaG9yaXpvbnRhbGx5CgkgKgoJICogQHZhciBib29sZWFuCgkgKi8KCXByaXZhdGUgJF9ob3Jpem9udGFsQ2VudGVyZWQgPSBGQUxTRTsKCgkvKioKCSAqIENlbnRlciBwYWdlIHZlcnRpY2FsbHkKCSAqCgkgKiBAdmFyIGJvb2xlYW4KCSAqLwoJcHJpdmF0ZSAkX3ZlcnRpY2FsQ2VudGVyZWQgPSBGQUxTRTsKCgkvKioKCSAqIFByaW50IGFyZWEKCSAqCgkgKiBAdmFyIHN0cmluZwoJICovCglwcml2YXRlICRfcHJpbnRBcmVhID0gTlVMTDsKCgkvKioKCSAqIEZpcnN0IHBhZ2UgbnVtYmVyCgkgKgoJICogQHZhciBpbnQKCSAqLwoJcHJpdmF0ZSAkX2ZpcnN0UGFnZU51bWJlciA9IE5VTEw7CgogICAgLyoqCiAgICAgKiBDcmVhdGUgYSBuZXcgUEhQRXhjZWxfV29ya3NoZWV0X1BhZ2VTZXR1cAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoKQogICAgewogICAgfQoKICAgIC8qKgogICAgICogR2V0IFBhcGVyIFNpemUKICAgICAqCiAgICAgKiBAcmV0dXJuIGludAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0UGFwZXJTaXplKCkgewogICAgCXJldHVybiAkdGhpcy0+X3BhcGVyU2l6ZTsKICAgIH0KCiAgICAvKioKICAgICAqIFNldCBQYXBlciBTaXplCiAgICAgKgogICAgICogQHBhcmFtIGludCAkcFZhbHVlCiAgICAgKiBAcmV0dXJuIFBIUEV4Y2VsX1dvcmtzaGVldF9QYWdlU2V0dXAKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHNldFBhcGVyU2l6ZSgkcFZhbHVlID0gUEhQRXhjZWxfV29ya3NoZWV0X1BhZ2VTZXR1cDo6UEFQRVJTSVpFX0xFVFRFUikgewogICAgCSR0aGlzLT5fcGFwZXJTaXplID0gJHBWYWx1ZTsKICAgIAlyZXR1cm4gJHRoaXM7CiAgICB9CgogICAgLyoqCiAgICAgKiBHZXQgT3JpZW50YXRpb24KICAgICAqCiAgICAgKiBAcmV0dXJuIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0T3JpZW50YXRpb24oKSB7CiAgICAJcmV0dXJuICR0aGlzLT5fb3JpZW50YXRpb247CiAgICB9CgogICAgLyoqCiAgICAgKiBTZXQgT3JpZW50YXRpb24KICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nICRwVmFsdWUKICAgICAqIEByZXR1cm4gUEhQRXhjZWxfV29ya3NoZWV0X1BhZ2VTZXR1cAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gc2V0T3JpZW50YXRpb24oJHBWYWx1ZSA9IFBIUEV4Y2VsX1dvcmtzaGVldF9QYWdlU2V0dXA6Ok9SSUVOVEFUSU9OX0RFRkFVTFQpIHsKICAgIAkkdGhpcy0+X29yaWVudGF0aW9uID0gJHBWYWx1ZTsKICAgIAlyZXR1cm4gJHRoaXM7CiAgICB9CgoJLyoqCgkgKiBHZXQgU2NhbGUKCSAqCgkgKiBAcmV0dXJuIGludD8KCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldFNjYWxlKCkgewoJCXJldHVybiAkdGhpcy0+X3NjYWxlOwoJfQoKCS8qKgoJICogU2V0IFNjYWxlCgkgKgoJICogUHJpbnQgc2NhbGluZy4gVmFsaWQgdmFsdWVzIHJhbmdlIGZyb20gMTAgdG8gNDAwCgkgKiBUaGlzIHNldHRpbmcgaXMgb3ZlcnJpZGRlbiB3aGVuIGZpdFRvV2lkdGggYW5kL29yIGZpdFRvSGVpZ2h0IGFyZSBpbiB1c2UKCSAqCgkgKiBAcGFyYW0gCWludD8JJHBWYWx1ZQoJICogQHBhcmFtIGJvb2xlYW4JJHBVcGRhdGUJVXBkYXRlIGZpdFRvUGFnZSBzbyBzY2FsaW5nIGFwcGxpZXMgcmF0aGVyIHRoYW4gZml0VG9IZWlnaHQgLyBmaXRUb1dpZHRoCgkgKiBAcmV0dXJuIFBIUEV4Y2VsX1dvcmtzaGVldF9QYWdlU2V0dXAKCSAqIEB0aHJvd3MgCUV4Y2VwdGlvbgoJICovCglwdWJsaWMgZnVuY3Rpb24gc2V0U2NhbGUoJHBWYWx1ZSA9IDEwMCwgJHBVcGRhdGUgPSB0cnVlKSB7CgkJLy8gTWljcm9zb2Z0IE9mZmljZSBFeGNlbCAyMDA3IG9ubHkgYWxsb3dzIHNldHRpbmcgYSBzY2FsZSBiZXR3ZWVuIDEwIGFuZCA0MDAgdmlhIHRoZSB1c2VyIGludGVyZmFjZSwKCQkvLyBidXQgaXQgaXMgYXBwYXJlbnRseSBzdGlsbCBhYmxlIHRvIGhhbmRsZSBhbnkgc2NhbGUgPj0gMCwgd2hlcmUgMCByZXN1bHRzIGluIDEwMAoJCWlmICgoJHBWYWx1ZSA+PSAwKSB8fCBpc19udWxsKCRwVmFsdWUpKSB7CgkJCSR0aGlzLT5fc2NhbGUgPSAkcFZhbHVlOwoJCQlpZiAoJHBVcGRhdGUpIHsKCQkJCSR0aGlzLT5fZml0VG9QYWdlID0gZmFsc2U7CgkJCX0KCQl9IGVsc2UgewoJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCJTY2FsZSBtdXN0IG5vdCBiZSBuZWdhdGl2ZSIpOwoJCX0KCQlyZXR1cm4gJHRoaXM7Cgl9CgoJLyoqCgkgKiBHZXQgRml0IFRvIFBhZ2UKCSAqCgkgKiBAcmV0dXJuIGJvb2xlYW4KCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldEZpdFRvUGFnZSgpIHsKCQlyZXR1cm4gJHRoaXMtPl9maXRUb1BhZ2U7Cgl9CgoJLyoqCgkgKiBTZXQgRml0IFRvIFBhZ2UKCSAqCgkgKiBAcGFyYW0gYm9vbGVhbiAkcFZhbHVlCgkgKiBAcmV0dXJuIFBIUEV4Y2VsX1dvcmtzaGVldF9QYWdlU2V0dXAKCSAqLwoJcHVibGljIGZ1bmN0aW9uIHNldEZpdFRvUGFnZSgkcFZhbHVlID0gVFJVRSkgewoJCSR0aGlzLT5fZml0VG9QYWdlID0gJHBWYWx1ZTsKCQlyZXR1cm4gJHRoaXM7Cgl9CgoJLyoqCgkgKiBHZXQgRml0IFRvIEhlaWdodAoJICoKCSAqIEByZXR1cm4gaW50PwoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0Rml0VG9IZWlnaHQoKSB7CgkJcmV0dXJuICR0aGlzLT5fZml0VG9IZWlnaHQ7Cgl9CgoJLyoqCgkgKiBTZXQgRml0IFRvIEhlaWdodAoJICoKCSAqIEBwYXJhbSBpbnQ/ICRwVmFsdWUKCSAqIEBwYXJhbSBib29sZWFuICRwVXBkYXRlIFVwZGF0ZSBmaXRUb1BhZ2Ugc28gaXQgYXBwbGllcyByYXRoZXIgdGhhbiBzY2FsaW5nCgkgKiBAcmV0dXJuIFBIUEV4Y2VsX1dvcmtzaGVldF9QYWdlU2V0dXAKCSAqLwoJcHVibGljIGZ1bmN0aW9uIHNldEZpdFRvSGVpZ2h0KCRwVmFsdWUgPSAxLCAkcFVwZGF0ZSA9IFRSVUUpIHsKCQkkdGhpcy0+X2ZpdFRvSGVpZ2h0ID0gJHBWYWx1ZTsKCQlpZiAoJHBVcGRhdGUpIHsKCQkJJHRoaXMtPl9maXRUb1BhZ2UgPSBUUlVFOwoJCX0KCQlyZXR1cm4gJHRoaXM7Cgl9CgoJLyoqCgkgKiBHZXQgRml0IFRvIFdpZHRoCgkgKgoJICogQHJldHVybiBpbnQ/CgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRGaXRUb1dpZHRoKCkgewoJCXJldHVybiAkdGhpcy0+X2ZpdFRvV2lkdGg7Cgl9CgoJLyoqCgkgKiBTZXQgRml0IFRvIFdpZHRoCgkgKgoJICogQHBhcmFtIGludD8gJHBWYWx1ZQoJICogQHBhcmFtIGJvb2xlYW4gJHBVcGRhdGUgVXBkYXRlIGZpdFRvUGFnZSBzbyBpdCBhcHBsaWVzIHJhdGhlciB0aGFuIHNjYWxpbmcKCSAqIEByZXR1cm4gUEhQRXhjZWxfV29ya3NoZWV0X1BhZ2VTZXR1cAoJICovCglwdWJsaWMgZnVuY3Rpb24gc2V0Rml0VG9XaWR0aCgkcFZhbHVlID0gMSwgJHBVcGRhdGUgPSBUUlVFKSB7CgkJJHRoaXMtPl9maXRUb1dpZHRoID0gJHBWYWx1ZTsKCQlpZiAoJHBVcGRhdGUpIHsKCQkJJHRoaXMtPl9maXRUb1BhZ2UgPSBUUlVFOwoJCX0KCQlyZXR1cm4gJHRoaXM7Cgl9CgoJLyoqCgkgKiBJcyBDb2x1bW5zIHRvIHJlcGVhdCBhdCBsZWZ0IHNldD8KCSAqCgkgKiBAcmV0dXJuIGJvb2xlYW4KCSAqLwoJcHVibGljIGZ1bmN0aW9uIGlzQ29sdW1uc1RvUmVwZWF0QXRMZWZ0U2V0KCkgewoJCWlmIChpc19hcnJheSgkdGhpcy0+X2NvbHVtbnNUb1JlcGVhdEF0TGVmdCkpIHsKCQkJaWYgKCR0aGlzLT5fY29sdW1uc1RvUmVwZWF0QXRMZWZ0WzBdICE9ICcnICYmICR0aGlzLT5fY29sdW1uc1RvUmVwZWF0QXRMZWZ0WzFdICE9ICcnKSB7CgkJCQlyZXR1cm4gdHJ1ZTsKCQkJfQoJCX0KCgkJcmV0dXJuIGZhbHNlOwoJfQoKCS8qKgoJICogR2V0IENvbHVtbnMgdG8gcmVwZWF0IGF0IGxlZnQKCSAqCgkgKiBAcmV0dXJuIGFycmF5IENvbnRhaW5pbmcgc3RhcnQgY29sdW1uIGFuZCBlbmQgY29sdW1uLCBlbXB0eSBhcnJheSBpZiBvcHRpb24gdW5zZXQKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldENvbHVtbnNUb1JlcGVhdEF0TGVmdCgpIHsKCQlyZXR1cm4gJHRoaXMtPl9jb2x1bW5zVG9SZXBlYXRBdExlZnQ7Cgl9CgoJLyoqCgkgKiBTZXQgQ29sdW1ucyB0byByZXBlYXQgYXQgbGVmdAoJICoKCSAqIEBwYXJhbSBhcnJheSAkcFZhbHVlIENvbnRhaW5pbmcgc3RhcnQgY29sdW1uIGFuZCBlbmQgY29sdW1uLCBlbXB0eSBhcnJheSBpZiBvcHRpb24gdW5zZXQKCSAqIEByZXR1cm4gUEhQRXhjZWxfV29ya3NoZWV0X1BhZ2VTZXR1cAoJICovCglwdWJsaWMgZnVuY3Rpb24gc2V0Q29sdW1uc1RvUmVwZWF0QXRMZWZ0KCRwVmFsdWUgPSBudWxsKSB7CgkJaWYgKGlzX2FycmF5KCRwVmFsdWUpKSB7CgkJCSR0aGlzLT5fY29sdW1uc1RvUmVwZWF0QXRMZWZ0ID0gJHBWYWx1ZTsKCQl9CgkJcmV0dXJuICR0aGlzOwoJfQoKCS8qKgoJICogU2V0IENvbHVtbnMgdG8gcmVwZWF0IGF0IGxlZnQgYnkgc3RhcnQgYW5kIGVuZAoJICoKCSAqIEBwYXJhbSBzdHJpbmcgJHBTdGFydAoJICogQHBhcmFtIHN0cmluZyAkcEVuZAoJICogQHJldHVybiBQSFBFeGNlbF9Xb3Jrc2hlZXRfUGFnZVNldHVwCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBzZXRDb2x1bW5zVG9SZXBlYXRBdExlZnRCeVN0YXJ0QW5kRW5kKCRwU3RhcnQgPSAnQScsICRwRW5kID0gJ0EnKSB7CgkJJHRoaXMtPl9jb2x1bW5zVG9SZXBlYXRBdExlZnQgPSBhcnJheSgkcFN0YXJ0LCAkcEVuZCk7CgkJcmV0dXJuICR0aGlzOwoJfQoKCS8qKgoJICogSXMgUm93cyB0byByZXBlYXQgYXQgdG9wIHNldD8KCSAqCgkgKiBAcmV0dXJuIGJvb2xlYW4KCSAqLwoJcHVibGljIGZ1bmN0aW9uIGlzUm93c1RvUmVwZWF0QXRUb3BTZXQoKSB7CgkJaWYgKGlzX2FycmF5KCR0aGlzLT5fcm93c1RvUmVwZWF0QXRUb3ApKSB7CgkJCWlmICgkdGhpcy0+X3Jvd3NUb1JlcGVhdEF0VG9wWzBdICE9IDAgJiYgJHRoaXMtPl9yb3dzVG9SZXBlYXRBdFRvcFsxXSAhPSAwKSB7CgkJCQlyZXR1cm4gdHJ1ZTsKCQkJfQoJCX0KCgkJcmV0dXJuIGZhbHNlOwoJfQoKCS8qKgoJICogR2V0IFJvd3MgdG8gcmVwZWF0IGF0IHRvcAoJICoKCSAqIEByZXR1cm4gYXJyYXkgQ29udGFpbmluZyBzdGFydCBjb2x1bW4gYW5kIGVuZCBjb2x1bW4sIGVtcHR5IGFycmF5IGlmIG9wdGlvbiB1bnNldAoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0Um93c1RvUmVwZWF0QXRUb3AoKSB7CgkJcmV0dXJuICR0aGlzLT5fcm93c1RvUmVwZWF0QXRUb3A7Cgl9CgoJLyoqCgkgKiBTZXQgUm93cyB0byByZXBlYXQgYXQgdG9wCgkgKgoJICogQHBhcmFtIGFycmF5CSRwVmFsdWUJQ29udGFpbmluZyBzdGFydCBjb2x1bW4gYW5kIGVuZCBjb2x1bW4sIGVtcHR5IGFycmF5IGlmIG9wdGlvbiB1bnNldAoJICogQHJldHVybiBQSFBFeGNlbF9Xb3Jrc2hlZXRfUGFnZVNldHVwCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBzZXRSb3dzVG9SZXBlYXRBdFRvcCgkcFZhbHVlID0gbnVsbCkgewoJCWlmIChpc19hcnJheSgkcFZhbHVlKSkgewoJCQkkdGhpcy0+X3Jvd3NUb1JlcGVhdEF0VG9wID0gJHBWYWx1ZTsKCQl9CgkJcmV0dXJuICR0aGlzOwoJfQoKCS8qKgoJICogU2V0IFJvd3MgdG8gcmVwZWF0IGF0IHRvcCBieSBzdGFydCBhbmQgZW5kCgkgKgoJICogQHBhcmFtIGludCAkcFN0YXJ0CgkgKiBAcGFyYW0gaW50ICRwRW5kCgkgKiBAcmV0dXJuIFBIUEV4Y2VsX1dvcmtzaGVldF9QYWdlU2V0dXAKCSAqLwoJcHVibGljIGZ1bmN0aW9uIHNldFJvd3NUb1JlcGVhdEF0VG9wQnlTdGFydEFuZEVuZCgkcFN0YXJ0ID0gMSwgJHBFbmQgPSAxKSB7CgkJJHRoaXMtPl9yb3dzVG9SZXBlYXRBdFRvcCA9IGFycmF5KCRwU3RhcnQsICRwRW5kKTsKCQlyZXR1cm4gJHRoaXM7Cgl9CgoJLyoqCgkgKiBHZXQgY2VudGVyIHBhZ2UgaG9yaXpvbnRhbGx5CgkgKgoJICogQHJldHVybiBib29sCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRIb3Jpem9udGFsQ2VudGVyZWQoKSB7CgkJcmV0dXJuICR0aGlzLT5faG9yaXpvbnRhbENlbnRlcmVkOwoJfQoKCS8qKgoJICogU2V0IGNlbnRlciBwYWdlIGhvcml6b250YWxseQoJICoKCSAqIEBwYXJhbSBib29sICR2YWx1ZQoJICogQHJldHVybiBQSFBFeGNlbF9Xb3Jrc2hlZXRfUGFnZVNldHVwCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBzZXRIb3Jpem9udGFsQ2VudGVyZWQoJHZhbHVlID0gZmFsc2UpIHsKCQkkdGhpcy0+X2hvcml6b250YWxDZW50ZXJlZCA9ICR2YWx1ZTsKCQlyZXR1cm4gJHRoaXM7Cgl9CgoJLyoqCgkgKiBHZXQgY2VudGVyIHBhZ2UgdmVydGljYWxseQoJICoKCSAqIEByZXR1cm4gYm9vbAoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0VmVydGljYWxDZW50ZXJlZCgpIHsKCQlyZXR1cm4gJHRoaXMtPl92ZXJ0aWNhbENlbnRlcmVkOwoJfQoKCS8qKgoJICogU2V0IGNlbnRlciBwYWdlIHZlcnRpY2FsbHkKCSAqCgkgKiBAcGFyYW0gYm9vbCAkdmFsdWUKCSAqIEByZXR1cm4gUEhQRXhjZWxfV29ya3NoZWV0X1BhZ2VTZXR1cAoJICovCglwdWJsaWMgZnVuY3Rpb24gc2V0VmVydGljYWxDZW50ZXJlZCgkdmFsdWUgPSBmYWxzZSkgewoJCSR0aGlzLT5fdmVydGljYWxDZW50ZXJlZCA9ICR2YWx1ZTsKCQlyZXR1cm4gJHRoaXM7Cgl9CgoJLyoqCgkgKglHZXQgcHJpbnQgYXJlYQoJICoKCSAqIEBwYXJhbQlpbnQJCSRpbmRleAlJZGVudGlmaWVyIGZvciBhIHNwZWNpZmljIHByaW50IGFyZWEgcmFuZ2UgaWYgc2V2ZXJhbCByYW5nZXMgaGF2ZSBiZWVuIHNldAoJICoJCQkJCQkJRGVmYXVsdCBiZWhhdmlvdXIsIG9yIGEgaW5kZXggdmFsdWUgb2YgMCwgd2lsbCByZXR1cm4gYWxsIHJhbmdlcyBhcyBhIGNvbW1hLXNlcGFyYXRlZCBzdHJpbmcKCSAqCQkJCQkJCU90aGVyd2lzZSwgdGhlIHNwZWNpZmljIHJhbmdlIGlkZW50aWZpZWQgYnkgdGhlIHZhbHVlIG9mICRpbmRleCB3aWxsIGJlIHJldHVybmVkCgkgKgkJCQkJCQlQcmludCBhcmVhcyBhcmUgbnVtYmVyZWQgZnJvbSAxCgkgKiBAdGhyb3dzCUV4Y2VwdGlvbgoJICogQHJldHVybglzdHJpbmcKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldFByaW50QXJlYSgkaW5kZXggPSAwKSB7CgkJaWYgKCRpbmRleCA9PSAwKSB7CgkJCXJldHVybiAkdGhpcy0+X3ByaW50QXJlYTsKCQl9CgkJJHByaW50QXJlYXMgPSBleHBsb2RlKCcsJywkdGhpcy0+X3ByaW50QXJlYSk7CgkJaWYgKGlzc2V0KCRwcmludEFyZWFzWyRpbmRleC0xXSkpIHsKCQkJcmV0dXJuICRwcmludEFyZWFzWyRpbmRleC0xXTsKCQl9CgkJdGhyb3cgbmV3IEV4Y2VwdGlvbigiUmVxdWVzdGVkIFByaW50IEFyZWEgZG9lcyBub3QgZXhpc3QiKTsKCX0KCgkvKioKCSAqIElzIHByaW50IGFyZWEgc2V0PwoJICoKCSAqIEBwYXJhbQlpbnQJCSRpbmRleAlJZGVudGlmaWVyIGZvciBhIHNwZWNpZmljIHByaW50IGFyZWEgcmFuZ2UgaWYgc2V2ZXJhbCByYW5nZXMgaGF2ZSBiZWVuIHNldAoJICoJCQkJCQkJRGVmYXVsdCBiZWhhdmlvdXIsIG9yIGFuIGluZGV4IHZhbHVlIG9mIDAsIHdpbGwgaWRlbnRpZnkgd2hldGhlciBhbnkgcHJpbnQgcmFuZ2UgaXMgc2V0CgkgKgkJCQkJCQlPdGhlcndpc2UsIGV4aXN0ZW5jZSBvZiB0aGUgcmFuZ2UgaWRlbnRpZmllZCBieSB0aGUgdmFsdWUgb2YgJGluZGV4IHdpbGwgYmUgcmV0dXJuZWQKCSAqCQkJCQkJCVByaW50IGFyZWFzIGFyZSBudW1iZXJlZCBmcm9tIDEKCSAqIEByZXR1cm4JYm9vbGVhbgoJICovCglwdWJsaWMgZnVuY3Rpb24gaXNQcmludEFyZWFTZXQoJGluZGV4ID0gMCkgewoJCWlmICgkaW5kZXggPT0gMCkgewoJCQlyZXR1cm4gIWlzX251bGwoJHRoaXMtPl9wcmludEFyZWEpOwoJCX0KCQkkcHJpbnRBcmVhcyA9IGV4cGxvZGUoJywnLCR0aGlzLT5fcHJpbnRBcmVhKTsKCQlyZXR1cm4gaXNzZXQoJHByaW50QXJlYXNbJGluZGV4LTFdKTsKCX0KCgkvKioKCSAqIENsZWFyIGEgcHJpbnQgYXJlYQoJICoKCSAqIEBwYXJhbQlpbnQJCSRpbmRleAlJZGVudGlmaWVyIGZvciBhIHNwZWNpZmljIHByaW50IGFyZWEgcmFuZ2UgaWYgc2V2ZXJhbCByYW5nZXMgaGF2ZSBiZWVuIHNldAoJICoJCQkJCQkJRGVmYXVsdCBiZWhhdmlvdXIsIG9yIGFuIGluZGV4IHZhbHVlIG9mIDAsIHdpbGwgY2xlYXIgYWxsIHByaW50IHJhbmdlcyB0aGF0IGFyZSBzZXQKCSAqCQkJCQkJCU90aGVyd2lzZSwgdGhlIHJhbmdlIGlkZW50aWZpZWQgYnkgdGhlIHZhbHVlIG9mICRpbmRleCB3aWxsIGJlIHJlbW92ZWQgZnJvbSB0aGUgc2VyaWVzCgkgKgkJCQkJCQlQcmludCBhcmVhcyBhcmUgbnVtYmVyZWQgZnJvbSAxCgkgKiBAcmV0dXJuCVBIUEV4Y2VsX1dvcmtzaGVldF9QYWdlU2V0dXAKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGNsZWFyUHJpbnRBcmVhKCRpbmRleCA9IDApIHsKCQlpZiAoJGluZGV4ID09IDApIHsKCQkJJHRoaXMtPl9wcmludEFyZWEgPSBOVUxMOwoJCX0gZWxzZSB7CgkJCSRwcmludEFyZWFzID0gZXhwbG9kZSgnLCcsJHRoaXMtPl9wcmludEFyZWEpOwoJCQlpZiAoaXNzZXQoJHByaW50QXJlYXNbJGluZGV4LTFdKSkgewoJCQkJdW5zZXQoJHByaW50QXJlYXNbJGluZGV4LTFdKTsKCQkJCSR0aGlzLT5fcHJpbnRBcmVhID0gaW1wbG9kZSgnLCcsJHByaW50QXJlYXMpOwoJCQl9CgkJfQoKICAgIAlyZXR1cm4gJHRoaXM7Cgl9CgoJLyoqCgkgKiBTZXQgcHJpbnQgYXJlYS4gZS5nLiAnQTE6RDEwJyBvciAnQTE6RDEwLEc1Ok0yMCcKCSAqCgkgKiBAcGFyYW0Jc3RyaW5nCSR2YWx1ZQoJICogQHBhcmFtCWludAkJJGluZGV4CUlkZW50aWZpZXIgZm9yIGEgc3BlY2lmaWMgcHJpbnQgYXJlYSByYW5nZSBhbGxvd2luZyBzZXZlcmFsIHJhbmdlcyB0byBiZSBzZXQKCSAqCQkJCQkJCVdoZW4gdGhlIG1ldGhvZCBpcyAiTyJ2ZXJ3cml0ZSwgdGhlbiBhIHBvc2l0aXZlIGludGVnZXIgaW5kZXggd2lsbCBvdmVyd3JpdGUgdGhhdCBpbmRleGVkCgkgKgkJCQkJCQkJZW50cnkgaW4gdGhlIHByaW50IGFyZWFzIGxpc3Q7IGEgbmVnYXRpdmUgaW5kZXggdmFsdWUgd2lsbCBpZGVudGlmeSB3aGljaCBlbnRyeSB0bwoJICoJCQkJCQkJCW92ZXJ3cml0ZSB3b3JraW5nIGJhY3dhcmQgdGhyb3VnaCB0aGUgcHJpbnQgYXJlYSB0byB0aGUgbGlzdCwgd2l0aCB0aGUgbGFzdCBlbnRyeSBhcyAtMS4KCSAqCQkJCQkJCQlTcGVjaWZ5aW5nIGFuIGluZGV4IHZhbHVlIG9mIDAsIHdpbGwgb3ZlcndyaXRlIDxiPmFsbDwvYj4gZXhpc3RpbmcgcHJpbnQgcmFuZ2VzLgoJICoJCQkJCQkJV2hlbiB0aGUgbWV0aG9kIGlzICJJIm5zZXJ0LCB0aGVuIGEgcG9zaXRpdmUgaW5kZXggd2lsbCBpbnNlcnQgYWZ0ZXIgdGhhdCBpbmRleGVkIGVudHJ5IGluCgkgKgkJCQkJCQkJdGhlIHByaW50IGFyZWFzIGxpc3QsIHdoaWxlIGEgbmVnYXRpdmUgaW5kZXggd2lsbCBpbnNlcnQgYmVmb3JlIHRoZSBpbmRleGVkIGVudHJ5LgoJICoJCQkJCQkJCVNwZWNpZnlpbmcgYW4gaW5kZXggdmFsdWUgb2YgMCwgd2lsbCBhbHdheXMgYXBwZW5kIHRoZSBuZXcgcHJpbnQgcmFuZ2UgYXQgdGhlIGVuZCBvZiB0aGUKCSAqCQkJCQkJCQlsaXN0LgoJICoJCQkJCQkJUHJpbnQgYXJlYXMgYXJlIG51bWJlcmVkIGZyb20gMQoJICogQHBhcmFtCXN0cmluZwkkbWV0aG9kCURldGVybWluZXMgdGhlIG1ldGhvZCB1c2VkIHdoZW4gc2V0dGluZyBtdWx0aXBsZSBwcmludCBhcmVhcwoJICoJCQkJCQkJRGVmYXVsdCBiZWhhdmlvdXIsIG9yIHRoZSAiTyIgbWV0aG9kLCBvdmVyd3JpdGVzIGV4aXN0aW5nIHByaW50IGFyZWEKCSAqCQkJCQkJCVRoZSAiSSIgbWV0aG9kLCBpbnNlcnRzIHRoZSBuZXcgcHJpbnQgYXJlYSBiZWZvcmUgYW55IHNwZWNpZmllZCBpbmRleCwgb3IgYXQgdGhlIGVuZCBvZiB0aGUgbGlzdAoJICogQHJldHVybglQSFBFeGNlbF9Xb3Jrc2hlZXRfUGFnZVNldHVwCgkgKiBAdGhyb3dzCUV4Y2VwdGlvbgoJICovCglwdWJsaWMgZnVuY3Rpb24gc2V0UHJpbnRBcmVhKCR2YWx1ZSwgJGluZGV4ID0gMCwgJG1ldGhvZCA9IHNlbGY6OlNFVFBSSU5UUkFOR0VfT1ZFUldSSVRFKSB7CgkJaWYgKHN0cnBvcygkdmFsdWUsJyEnKSAhPT0gZmFsc2UpIHsKCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbignQ2VsbCBjb29yZGluYXRlIG11c3Qgbm90IHNwZWNpZnkgYSB3b3Jrc2hlZXQuJyk7CgkJfSBlbHNlaWYgKHN0cnBvcygkdmFsdWUsJzonKSA9PT0gZmFsc2UpIHsKCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbignQ2VsbCBjb29yZGluYXRlIG11c3QgYmUgYSByYW5nZSBvZiBjZWxscy4nKTsKCQl9IGVsc2VpZiAoc3RycG9zKCR2YWx1ZSwnJCcpICE9PSBmYWxzZSkgewoJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCdDZWxsIGNvb3JkaW5hdGUgbXVzdCBub3QgYmUgYWJzb2x1dGUuJyk7CgkJfQoJCSR2YWx1ZSA9IHN0cnRvdXBwZXIoJHZhbHVlKTsKCgkJaWYgKCRtZXRob2QgPT0gc2VsZjo6U0VUUFJJTlRSQU5HRV9PVkVSV1JJVEUpIHsKCQkJaWYgKCRpbmRleCA9PSAwKSB7CgkJCQkkdGhpcy0+X3ByaW50QXJlYSA9ICR2YWx1ZTsKCQkJfSBlbHNlIHsKCQkJCSRwcmludEFyZWFzID0gZXhwbG9kZSgnLCcsJHRoaXMtPl9wcmludEFyZWEpOwoJCQkJaWYoJGluZGV4IDwgMCkgewoJCQkJCSRpbmRleCA9IGNvdW50KCRwcmludEFyZWFzKSAtIGFicygkaW5kZXgpICsgMTsKCQkJCX0KCQkJCWlmICgoJGluZGV4IDw9IDApIHx8ICgkaW5kZXggPiBjb3VudCgkcHJpbnRBcmVhcykpKSB7CgkJICAgIAkJdGhyb3cgbmV3IEV4Y2VwdGlvbignSW52YWxpZCBpbmRleCBmb3Igc2V0dGluZyBwcmludCByYW5nZS4nKTsKCQkJCX0KCQkJCSRwcmludEFyZWFzWyRpbmRleC0xXSA9ICR2YWx1ZTsKCQkJCSR0aGlzLT5fcHJpbnRBcmVhID0gaW1wbG9kZSgnLCcsJHByaW50QXJlYXMpOwoJCQl9CgkJfSBlbHNlaWYoJG1ldGhvZCA9PSBzZWxmOjpTRVRQUklOVFJBTkdFX0lOU0VSVCkgewoJCQlpZiAoJGluZGV4ID09IDApIHsKCQkJCSR0aGlzLT5fcHJpbnRBcmVhIC49ICgkdGhpcy0+X3ByaW50QXJlYSA9PSAnJykgPyAkdmFsdWUgOiAnLCcuJHZhbHVlOwoJCQl9IGVsc2UgewoJCQkJJHByaW50QXJlYXMgPSBleHBsb2RlKCcsJywkdGhpcy0+X3ByaW50QXJlYSk7CgkJCQlpZigkaW5kZXggPCAwKSB7CgkJCQkJJGluZGV4ID0gYWJzKCRpbmRleCkgLSAxOwoJCQkJfQoJCQkJaWYgKCRpbmRleCA+IGNvdW50KCRwcmludEFyZWFzKSkgewoJCSAgICAJCXRocm93IG5ldyBFeGNlcHRpb24oJ0ludmFsaWQgaW5kZXggZm9yIHNldHRpbmcgcHJpbnQgcmFuZ2UuJyk7CgkJCQl9CgkJCQkkcHJpbnRBcmVhcyA9IGFycmF5X21lcmdlKGFycmF5X3NsaWNlKCRwcmludEFyZWFzLDAsJGluZGV4KSxhcnJheSgkdmFsdWUpLGFycmF5X3NsaWNlKCRwcmludEFyZWFzLCRpbmRleCkpOwoJCQkJJHRoaXMtPl9wcmludEFyZWEgPSBpbXBsb2RlKCcsJywkcHJpbnRBcmVhcyk7CgkJCX0KCQl9IGVsc2UgewogICAgCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCdJbnZhbGlkIG1ldGhvZCBmb3Igc2V0dGluZyBwcmludCByYW5nZS4nKTsKCQl9CgogICAgCXJldHVybiAkdGhpczsKCX0KCgkvKioKCSAqIEFkZCBhIG5ldyBwcmludCBhcmVhIChlLmcuICdBMTpEMTAnIG9yICdBMTpEMTAsRzU6TTIwJykgdG8gdGhlIGxpc3Qgb2YgcHJpbnQgYXJlYXMKCSAqCgkgKiBAcGFyYW0Jc3RyaW5nCSR2YWx1ZQoJICogQHBhcmFtCWludAkJJGluZGV4CUlkZW50aWZpZXIgZm9yIGEgc3BlY2lmaWMgcHJpbnQgYXJlYSByYW5nZSBhbGxvd2luZyBzZXZlcmFsIHJhbmdlcyB0byBiZSBzZXQKCSAqCQkJCQkJCUEgcG9zaXRpdmUgaW5kZXggd2lsbCBpbnNlcnQgYWZ0ZXIgdGhhdCBpbmRleGVkIGVudHJ5IGluIHRoZSBwcmludCBhcmVhcyBsaXN0LCB3aGlsZSBhCgkgKgkJCQkJCQkJbmVnYXRpdmUgaW5kZXggd2lsbCBpbnNlcnQgYmVmb3JlIHRoZSBpbmRleGVkIGVudHJ5LgoJICoJCQkJCQkJCVNwZWNpZnlpbmcgYW4gaW5kZXggdmFsdWUgb2YgMCwgd2lsbCBhbHdheXMgYXBwZW5kIHRoZSBuZXcgcHJpbnQgcmFuZ2UgYXQgdGhlIGVuZCBvZiB0aGUKCSAqCQkJCQkJCQlsaXN0LgoJICoJCQkJCQkJUHJpbnQgYXJlYXMgYXJlIG51bWJlcmVkIGZyb20gMQoJICogQHJldHVybglQSFBFeGNlbF9Xb3Jrc2hlZXRfUGFnZVNldHVwCgkgKiBAdGhyb3dzCUV4Y2VwdGlvbgoJICovCglwdWJsaWMgZnVuY3Rpb24gYWRkUHJpbnRBcmVhKCR2YWx1ZSwgJGluZGV4ID0gLTEpIHsKCQlyZXR1cm4gJHRoaXMtPnNldFByaW50QXJlYSgkdmFsdWUsICRpbmRleCwgc2VsZjo6U0VUUFJJTlRSQU5HRV9JTlNFUlQpOwoJfQoKCS8qKgoJICogU2V0IHByaW50IGFyZWEKCSAqCgkgKiBAcGFyYW0JaW50CQkkY29sdW1uMQlDb2x1bW4gMQoJICogQHBhcmFtCWludAkJJHJvdzEJCVJvdyAxCgkgKiBAcGFyYW0JaW50CQkkY29sdW1uMglDb2x1bW4gMgoJICogQHBhcmFtCWludAkJJHJvdzIJCVJvdyAyCgkgKiBAcGFyYW0JaW50CQkkaW5kZXgJCUlkZW50aWZpZXIgZm9yIGEgc3BlY2lmaWMgcHJpbnQgYXJlYSByYW5nZSBhbGxvd2luZyBzZXZlcmFsIHJhbmdlcyB0byBiZSBzZXQKCSAqCQkJCQkJCQlXaGVuIHRoZSBtZXRob2QgaXMgIk8idmVyd3JpdGUsIHRoZW4gYSBwb3NpdGl2ZSBpbnRlZ2VyIGluZGV4IHdpbGwgb3ZlcndyaXRlIHRoYXQgaW5kZXhlZAoJICoJCQkJCQkJCQllbnRyeSBpbiB0aGUgcHJpbnQgYXJlYXMgbGlzdDsgYSBuZWdhdGl2ZSBpbmRleCB2YWx1ZSB3aWxsIGlkZW50aWZ5IHdoaWNoIGVudHJ5IHRvCgkgKgkJCQkJCQkJCW92ZXJ3cml0ZSB3b3JraW5nIGJhY3dhcmQgdGhyb3VnaCB0aGUgcHJpbnQgYXJlYSB0byB0aGUgbGlzdCwgd2l0aCB0aGUgbGFzdCBlbnRyeSBhcyAtMS4KCSAqCQkJCQkJCQkJU3BlY2lmeWluZyBhbiBpbmRleCB2YWx1ZSBvZiAwLCB3aWxsIG92ZXJ3cml0ZSA8Yj5hbGw8L2I+IGV4aXN0aW5nIHByaW50IHJhbmdlcy4KCSAqCQkJCQkJCQlXaGVuIHRoZSBtZXRob2QgaXMgIkkibnNlcnQsIHRoZW4gYSBwb3NpdGl2ZSBpbmRleCB3aWxsIGluc2VydCBhZnRlciB0aGF0IGluZGV4ZWQgZW50cnkgaW4KCSAqCQkJCQkJCQkJdGhlIHByaW50IGFyZWFzIGxpc3QsIHdoaWxlIGEgbmVnYXRpdmUgaW5kZXggd2lsbCBpbnNlcnQgYmVmb3JlIHRoZSBpbmRleGVkIGVudHJ5LgoJICoJCQkJCQkJCQlTcGVjaWZ5aW5nIGFuIGluZGV4IHZhbHVlIG9mIDAsIHdpbGwgYWx3YXlzIGFwcGVuZCB0aGUgbmV3IHByaW50IHJhbmdlIGF0IHRoZSBlbmQgb2YgdGhlCgkgKgkJCQkJCQkJCWxpc3QuCgkgKgkJCQkJCQkJUHJpbnQgYXJlYXMgYXJlIG51bWJlcmVkIGZyb20gMQoJICogQHBhcmFtCXN0cmluZwkkbWV0aG9kCQlEZXRlcm1pbmVzIHRoZSBtZXRob2QgdXNlZCB3aGVuIHNldHRpbmcgbXVsdGlwbGUgcHJpbnQgYXJlYXMKCSAqCQkJCQkJCQlEZWZhdWx0IGJlaGF2aW91ciwgb3IgdGhlICJPIiBtZXRob2QsIG92ZXJ3cml0ZXMgZXhpc3RpbmcgcHJpbnQgYXJlYQoJICoJCQkJCQkJCVRoZSAiSSIgbWV0aG9kLCBpbnNlcnRzIHRoZSBuZXcgcHJpbnQgYXJlYSBiZWZvcmUgYW55IHNwZWNpZmllZCBpbmRleCwgb3IgYXQgdGhlIGVuZCBvZiB0aGUgbGlzdAoJICogQHJldHVybglQSFBFeGNlbF9Xb3Jrc2hlZXRfUGFnZVNldHVwCgkgKiBAdGhyb3dzCUV4Y2VwdGlvbgoJICovCiAgICBwdWJsaWMgZnVuY3Rpb24gc2V0UHJpbnRBcmVhQnlDb2x1bW5BbmRSb3coJGNvbHVtbjEsICRyb3cxLCAkY29sdW1uMiwgJHJvdzIsICRpbmRleCA9IDAsICRtZXRob2QgPSBzZWxmOjpTRVRQUklOVFJBTkdFX09WRVJXUklURSkKICAgIHsKICAgIAlyZXR1cm4gJHRoaXMtPnNldFByaW50QXJlYShQSFBFeGNlbF9DZWxsOjpzdHJpbmdGcm9tQ29sdW1uSW5kZXgoJGNvbHVtbjEpIC4gJHJvdzEgLiAnOicgLiBQSFBFeGNlbF9DZWxsOjpzdHJpbmdGcm9tQ29sdW1uSW5kZXgoJGNvbHVtbjIpIC4gJHJvdzIsICRpbmRleCwgJG1ldGhvZCk7CiAgICB9CgoJLyoqCgkgKiBBZGQgYSBuZXcgcHJpbnQgYXJlYSB0byB0aGUgbGlzdCBvZiBwcmludCBhcmVhcwoJICoKCSAqIEBwYXJhbQlpbnQJCSRjb2x1bW4xCVN0YXJ0IENvbHVtbiBmb3IgdGhlIHByaW50IGFyZWEKCSAqIEBwYXJhbQlpbnQJCSRyb3cxCQlTdGFydCBSb3cgZm9yIHRoZSBwcmludCBhcmVhCgkgKiBAcGFyYW0JaW50CQkkY29sdW1uMglFbmQgQ29sdW1uIGZvciB0aGUgcHJpbnQgYXJlYQoJICogQHBhcmFtCWludAkJJHJvdzIJCUVuZCBSb3cgZm9yIHRoZSBwcmludCBhcmVhCgkgKiBAcGFyYW0JaW50CQkkaW5kZXgJCUlkZW50aWZpZXIgZm9yIGEgc3BlY2lmaWMgcHJpbnQgYXJlYSByYW5nZSBhbGxvd2luZyBzZXZlcmFsIHJhbmdlcyB0byBiZSBzZXQKCSAqCQkJCQkJCQlBIHBvc2l0aXZlIGluZGV4IHdpbGwgaW5zZXJ0IGFmdGVyIHRoYXQgaW5kZXhlZCBlbnRyeSBpbiB0aGUgcHJpbnQgYXJlYXMgbGlzdCwgd2hpbGUgYQoJICoJCQkJCQkJCQluZWdhdGl2ZSBpbmRleCB3aWxsIGluc2VydCBiZWZvcmUgdGhlIGluZGV4ZWQgZW50cnkuCgkgKgkJCQkJCQkJCVNwZWNpZnlpbmcgYW4gaW5kZXggdmFsdWUgb2YgMCwgd2lsbCBhbHdheXMgYXBwZW5kIHRoZSBuZXcgcHJpbnQgcmFuZ2UgYXQgdGhlIGVuZCBvZiB0aGUKCSAqCQkJCQkJCQkJbGlzdC4KCSAqCQkJCQkJCQlQcmludCBhcmVhcyBhcmUgbnVtYmVyZWQgZnJvbSAxCgkgKiBAcmV0dXJuCVBIUEV4Y2VsX1dvcmtzaGVldF9QYWdlU2V0dXAKCSAqIEB0aHJvd3MJRXhjZXB0aW9uCgkgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBhZGRQcmludEFyZWFCeUNvbHVtbkFuZFJvdygkY29sdW1uMSwgJHJvdzEsICRjb2x1bW4yLCAkcm93MiwgJGluZGV4ID0gLTEpCiAgICB7CiAgICAJcmV0dXJuICR0aGlzLT5zZXRQcmludEFyZWEoUEhQRXhjZWxfQ2VsbDo6c3RyaW5nRnJvbUNvbHVtbkluZGV4KCRjb2x1bW4xKSAuICRyb3cxIC4gJzonIC4gUEhQRXhjZWxfQ2VsbDo6c3RyaW5nRnJvbUNvbHVtbkluZGV4KCRjb2x1bW4yKSAuICRyb3cyLCAkaW5kZXgsIHNlbGY6OlNFVFBSSU5UUkFOR0VfSU5TRVJUKTsKCX0KCgkvKioKCSAqIEdldCBmaXJzdCBwYWdlIG51bWJlcgoJICoKCSAqIEByZXR1cm4gaW50CgkgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRGaXJzdFBhZ2VOdW1iZXIoKSB7CgkJcmV0dXJuICR0aGlzLT5fZmlyc3RQYWdlTnVtYmVyOwogICAgfQoKICAgIC8qKgogICAgICogU2V0IGZpcnN0IHBhZ2UgbnVtYmVyCiAgICAgKgogICAgICogQHBhcmFtIGludCAkdmFsdWUKICAgICAqIEByZXR1cm4gUEhQRXhjZWxfV29ya3NoZWV0X0hlYWRlckZvb3RlcgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gc2V0Rmlyc3RQYWdlTnVtYmVyKCR2YWx1ZSA9IG51bGwpIHsKCQkkdGhpcy0+X2ZpcnN0UGFnZU51bWJlciA9ICR2YWx1ZTsKCQlyZXR1cm4gJHRoaXM7CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXNldCBmaXJzdCBwYWdlIG51bWJlcgogICAgICoKICAgICAqIEByZXR1cm4gUEhQRXhjZWxfV29ya3NoZWV0X0hlYWRlckZvb3RlcgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gcmVzZXRGaXJzdFBhZ2VOdW1iZXIoKSB7CgkJcmV0dXJuICR0aGlzLT5zZXRGaXJzdFBhZ2VOdW1iZXIobnVsbCk7CiAgICB9CgoJLyoqCgkgKiBJbXBsZW1lbnQgUEhQIF9fY2xvbmUgdG8gY3JlYXRlIGEgZGVlcCBjbG9uZSwgbm90IGp1c3QgYSBzaGFsbG93IGNvcHkuCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBfX2Nsb25lKCkgewoJCSR2YXJzID0gZ2V0X29iamVjdF92YXJzKCR0aGlzKTsKCQlmb3JlYWNoICgkdmFycyBhcyAka2V5ID0+ICR2YWx1ZSkgewoJCQlpZiAoaXNfb2JqZWN0KCR2YWx1ZSkpIHsKCQkJCSR0aGlzLT4ka2V5ID0gY2xvbmUgJHZhbHVlOwoJCQl9IGVsc2UgewoJCQkJJHRoaXMtPiRrZXkgPSAkdmFsdWU7CgkJCX0KCQl9Cgl9Cn0K]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Worksheet/Protection.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIFBIUEV4Y2VsCiAqCiAqIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICoKICogQGNhdGVnb3J5ICAgUEhQRXhjZWwKICogQHBhY2thZ2UgICAgUEhQRXhjZWxfV29ya3NoZWV0CiAqIEBjb3B5cmlnaHQgIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwgKGh0dHA6Ly93d3cuY29kZXBsZXguY29tL1BIUEV4Y2VsKQogKiBAbGljZW5zZSAgICBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvb2xkLWxpY2Vuc2VzL2xncGwtMi4xLnR4dAlMR1BMCiAqIEB2ZXJzaW9uICAgIDEuNy43LCAyMDEyLTA1LTE5CiAqLwoKCi8qKgogKiBQSFBFeGNlbF9Xb3Jrc2hlZXRfUHJvdGVjdGlvbgogKgogKiBAY2F0ZWdvcnkgICBQSFBFeGNlbAogKiBAcGFja2FnZSAgICBQSFBFeGNlbF9Xb3Jrc2hlZXQKICogQGNvcHlyaWdodCAgQ29weXJpZ2h0IChjKSAyMDA2IC0gMjAxMiBQSFBFeGNlbCAoaHR0cDovL3d3dy5jb2RlcGxleC5jb20vUEhQRXhjZWwpCiAqLwpjbGFzcyBQSFBFeGNlbF9Xb3Jrc2hlZXRfUHJvdGVjdGlvbgp7CgkvKioKCSAqIFNoZWV0CgkgKgoJICogQHZhciBib29sZWFuCgkgKi8KCXByaXZhdGUgJF9zaGVldAkJCQkJPSBmYWxzZTsKCgkvKioKCSAqIE9iamVjdHMKCSAqCgkgKiBAdmFyIGJvb2xlYW4KCSAqLwoJcHJpdmF0ZSAkX29iamVjdHMJCQkJPSBmYWxzZTsKCgkvKioKCSAqIFNjZW5hcmlvcwoJICoKCSAqIEB2YXIgYm9vbGVhbgoJICovCglwcml2YXRlICRfc2NlbmFyaW9zCQkJCT0gZmFsc2U7CgoJLyoqCgkgKiBGb3JtYXQgY2VsbHMKCSAqCgkgKiBAdmFyIGJvb2xlYW4KCSAqLwoJcHJpdmF0ZSAkX2Zvcm1hdENlbGxzCQkJPSBmYWxzZTsKCgkvKioKCSAqIEZvcm1hdCBjb2x1bW5zCgkgKgoJICogQHZhciBib29sZWFuCgkgKi8KCXByaXZhdGUgJF9mb3JtYXRDb2x1bW5zCQkJPSBmYWxzZTsKCgkvKioKCSAqIEZvcm1hdCByb3dzCgkgKgoJICogQHZhciBib29sZWFuCgkgKi8KCXByaXZhdGUgJF9mb3JtYXRSb3dzCQkJPSBmYWxzZTsKCgkvKioKCSAqIEluc2VydCBjb2x1bW5zCgkgKgoJICogQHZhciBib29sZWFuCgkgKi8KCXByaXZhdGUgJF9pbnNlcnRDb2x1bW5zCQkJPSBmYWxzZTsKCgkvKioKCSAqIEluc2VydCByb3dzCgkgKgoJICogQHZhciBib29sZWFuCgkgKi8KCXByaXZhdGUgJF9pbnNlcnRSb3dzCQkJPSBmYWxzZTsKCgkvKioKCSAqIEluc2VydCBoeXBlcmxpbmtzCgkgKgoJICogQHZhciBib29sZWFuCgkgKi8KCXByaXZhdGUgJF9pbnNlcnRIeXBlcmxpbmtzCQk9IGZhbHNlOwoKCS8qKgoJICogRGVsZXRlIGNvbHVtbnMKCSAqCgkgKiBAdmFyIGJvb2xlYW4KCSAqLwoJcHJpdmF0ZSAkX2RlbGV0ZUNvbHVtbnMJCQk9IGZhbHNlOwoKCS8qKgoJICogRGVsZXRlIHJvd3MKCSAqCgkgKiBAdmFyIGJvb2xlYW4KCSAqLwoJcHJpdmF0ZSAkX2RlbGV0ZVJvd3MJCQk9IGZhbHNlOwoKCS8qKgoJICogU2VsZWN0IGxvY2tlZCBjZWxscwoJICoKCSAqIEB2YXIgYm9vbGVhbgoJICovCglwcml2YXRlICRfc2VsZWN0TG9ja2VkQ2VsbHMJCT0gZmFsc2U7CgoJLyoqCgkgKiBTb3J0CgkgKgoJICogQHZhciBib29sZWFuCgkgKi8KCXByaXZhdGUgJF9zb3J0CQkJCQk9IGZhbHNlOwoKCS8qKgoJICogQXV0b0ZpbHRlcgoJICoKCSAqIEB2YXIgYm9vbGVhbgoJICovCglwcml2YXRlICRfYXV0b0ZpbHRlcgkJCT0gZmFsc2U7CgoJLyoqCgkgKiBQaXZvdCB0YWJsZXMKCSAqCgkgKiBAdmFyIGJvb2xlYW4KCSAqLwoJcHJpdmF0ZSAkX3Bpdm90VGFibGVzCQkJPSBmYWxzZTsKCgkvKioKCSAqIFNlbGVjdCB1bmxvY2tlZCBjZWxscwoJICoKCSAqIEB2YXIgYm9vbGVhbgoJICovCglwcml2YXRlICRfc2VsZWN0VW5sb2NrZWRDZWxscwk9IGZhbHNlOwoKCS8qKgoJICogUGFzc3dvcmQKCSAqCgkgKiBAdmFyIHN0cmluZwoJICovCglwcml2YXRlICRfcGFzc3dvcmQJCQkJPSAnJzsKCiAgICAvKioKICAgICAqIENyZWF0ZSBhIG5ldyBQSFBFeGNlbF9Xb3Jrc2hlZXRfUHJvdGVjdGlvbgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoKQogICAgewogICAgfQoKICAgIC8qKgogICAgICogSXMgc29tZSBzb3J0IG9mIHByb3RlY3Rpb24gZW5hYmxlZD8KICAgICAqCiAgICAgKiBAcmV0dXJuIGJvb2xlYW4KICAgICAqLwogICAgZnVuY3Rpb24gaXNQcm90ZWN0aW9uRW5hYmxlZCgpIHsKICAgIAlyZXR1cm4gCSR0aGlzLT5fc2hlZXQgfHwKCQkJCSR0aGlzLT5fb2JqZWN0cyB8fAoJCQkJJHRoaXMtPl9zY2VuYXJpb3MgfHwKCQkJCSR0aGlzLT5fZm9ybWF0Q2VsbHMgfHwKCQkJCSR0aGlzLT5fZm9ybWF0Q29sdW1ucyB8fAoJCQkJJHRoaXMtPl9mb3JtYXRSb3dzIHx8CgkJCQkkdGhpcy0+X2luc2VydENvbHVtbnMgfHwKCQkJCSR0aGlzLT5faW5zZXJ0Um93cyB8fAoJCQkJJHRoaXMtPl9pbnNlcnRIeXBlcmxpbmtzIHx8CgkJCQkkdGhpcy0+X2RlbGV0ZUNvbHVtbnMgfHwKCQkJCSR0aGlzLT5fZGVsZXRlUm93cyB8fAoJCQkJJHRoaXMtPl9zZWxlY3RMb2NrZWRDZWxscyB8fAoJCQkJJHRoaXMtPl9zb3J0IHx8CgkJCQkkdGhpcy0+X2F1dG9GaWx0ZXIgfHwKCQkJCSR0aGlzLT5fcGl2b3RUYWJsZXMgfHwKCQkJCSR0aGlzLT5fc2VsZWN0VW5sb2NrZWRDZWxsczsKICAgIH0KCiAgICAvKioKICAgICAqIEdldCBTaGVldAogICAgICoKICAgICAqIEByZXR1cm4gYm9vbGVhbgogICAgICovCiAgICBmdW5jdGlvbiBnZXRTaGVldCgpIHsKICAgIAlyZXR1cm4gJHRoaXMtPl9zaGVldDsKICAgIH0KCiAgICAvKioKICAgICAqIFNldCBTaGVldAogICAgICoKICAgICAqIEBwYXJhbSBib29sZWFuICRwVmFsdWUKICAgICAqIEByZXR1cm4gUEhQRXhjZWxfV29ya3NoZWV0X1Byb3RlY3Rpb24KICAgICAqLwogICAgZnVuY3Rpb24gc2V0U2hlZXQoJHBWYWx1ZSA9IGZhbHNlKSB7CiAgICAJJHRoaXMtPl9zaGVldCA9ICRwVmFsdWU7CiAgICAJcmV0dXJuICR0aGlzOwogICAgfQoKICAgIC8qKgogICAgICogR2V0IE9iamVjdHMKICAgICAqCiAgICAgKiBAcmV0dXJuIGJvb2xlYW4KICAgICAqLwogICAgZnVuY3Rpb24gZ2V0T2JqZWN0cygpIHsKICAgIAlyZXR1cm4gJHRoaXMtPl9vYmplY3RzOwogICAgfQoKICAgIC8qKgogICAgICogU2V0IE9iamVjdHMKICAgICAqCiAgICAgKiBAcGFyYW0gYm9vbGVhbiAkcFZhbHVlCiAgICAgKiBAcmV0dXJuIFBIUEV4Y2VsX1dvcmtzaGVldF9Qcm90ZWN0aW9uCiAgICAgKi8KICAgIGZ1bmN0aW9uIHNldE9iamVjdHMoJHBWYWx1ZSA9IGZhbHNlKSB7CiAgICAJJHRoaXMtPl9vYmplY3RzID0gJHBWYWx1ZTsKICAgIAlyZXR1cm4gJHRoaXM7CiAgICB9CgogICAgLyoqCiAgICAgKiBHZXQgU2NlbmFyaW9zCiAgICAgKgogICAgICogQHJldHVybiBib29sZWFuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGdldFNjZW5hcmlvcygpIHsKICAgIAlyZXR1cm4gJHRoaXMtPl9zY2VuYXJpb3M7CiAgICB9CgogICAgLyoqCiAgICAgKiBTZXQgU2NlbmFyaW9zCiAgICAgKgogICAgICogQHBhcmFtIGJvb2xlYW4gJHBWYWx1ZQogICAgICogQHJldHVybiBQSFBFeGNlbF9Xb3Jrc2hlZXRfUHJvdGVjdGlvbgogICAgICovCiAgICBmdW5jdGlvbiBzZXRTY2VuYXJpb3MoJHBWYWx1ZSA9IGZhbHNlKSB7CiAgICAJJHRoaXMtPl9zY2VuYXJpb3MgPSAkcFZhbHVlOwogICAgCXJldHVybiAkdGhpczsKICAgIH0KCiAgICAvKioKICAgICAqIEdldCBGb3JtYXRDZWxscwogICAgICoKICAgICAqIEByZXR1cm4gYm9vbGVhbgogICAgICovCiAgICBmdW5jdGlvbiBnZXRGb3JtYXRDZWxscygpIHsKICAgIAlyZXR1cm4gJHRoaXMtPl9mb3JtYXRDZWxsczsKICAgIH0KCiAgICAvKioKICAgICAqIFNldCBGb3JtYXRDZWxscwogICAgICoKICAgICAqIEBwYXJhbSBib29sZWFuICRwVmFsdWUKICAgICAqIEByZXR1cm4gUEhQRXhjZWxfV29ya3NoZWV0X1Byb3RlY3Rpb24KICAgICAqLwogICAgZnVuY3Rpb24gc2V0Rm9ybWF0Q2VsbHMoJHBWYWx1ZSA9IGZhbHNlKSB7CiAgICAJJHRoaXMtPl9mb3JtYXRDZWxscyA9ICRwVmFsdWU7CiAgICAJcmV0dXJuICR0aGlzOwogICAgfQoKICAgIC8qKgogICAgICogR2V0IEZvcm1hdENvbHVtbnMKICAgICAqCiAgICAgKiBAcmV0dXJuIGJvb2xlYW4KICAgICAqLwogICAgZnVuY3Rpb24gZ2V0Rm9ybWF0Q29sdW1ucygpIHsKICAgIAlyZXR1cm4gJHRoaXMtPl9mb3JtYXRDb2x1bW5zOwogICAgfQoKICAgIC8qKgogICAgICogU2V0IEZvcm1hdENvbHVtbnMKICAgICAqCiAgICAgKiBAcGFyYW0gYm9vbGVhbiAkcFZhbHVlCiAgICAgKiBAcmV0dXJuIFBIUEV4Y2VsX1dvcmtzaGVldF9Qcm90ZWN0aW9uCiAgICAgKi8KICAgIGZ1bmN0aW9uIHNldEZvcm1hdENvbHVtbnMoJHBWYWx1ZSA9IGZhbHNlKSB7CiAgICAJJHRoaXMtPl9mb3JtYXRDb2x1bW5zID0gJHBWYWx1ZTsKICAgIAlyZXR1cm4gJHRoaXM7CiAgICB9CgogICAgLyoqCiAgICAgKiBHZXQgRm9ybWF0Um93cwogICAgICoKICAgICAqIEByZXR1cm4gYm9vbGVhbgogICAgICovCiAgICBmdW5jdGlvbiBnZXRGb3JtYXRSb3dzKCkgewogICAgCXJldHVybiAkdGhpcy0+X2Zvcm1hdFJvd3M7CiAgICB9CgogICAgLyoqCiAgICAgKiBTZXQgRm9ybWF0Um93cwogICAgICoKICAgICAqIEBwYXJhbSBib29sZWFuICRwVmFsdWUKICAgICAqIEByZXR1cm4gUEhQRXhjZWxfV29ya3NoZWV0X1Byb3RlY3Rpb24KICAgICAqLwogICAgZnVuY3Rpb24gc2V0Rm9ybWF0Um93cygkcFZhbHVlID0gZmFsc2UpIHsKICAgIAkkdGhpcy0+X2Zvcm1hdFJvd3MgPSAkcFZhbHVlOwogICAgCXJldHVybiAkdGhpczsKICAgIH0KCiAgICAvKioKICAgICAqIEdldCBJbnNlcnRDb2x1bW5zCiAgICAgKgogICAgICogQHJldHVybiBib29sZWFuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGdldEluc2VydENvbHVtbnMoKSB7CiAgICAJcmV0dXJuICR0aGlzLT5faW5zZXJ0Q29sdW1uczsKICAgIH0KCiAgICAvKioKICAgICAqIFNldCBJbnNlcnRDb2x1bW5zCiAgICAgKgogICAgICogQHBhcmFtIGJvb2xlYW4gJHBWYWx1ZQogICAgICogQHJldHVybiBQSFBFeGNlbF9Xb3Jrc2hlZXRfUHJvdGVjdGlvbgogICAgICovCiAgICBmdW5jdGlvbiBzZXRJbnNlcnRDb2x1bW5zKCRwVmFsdWUgPSBmYWxzZSkgewogICAgCSR0aGlzLT5faW5zZXJ0Q29sdW1ucyA9ICRwVmFsdWU7CiAgICAJcmV0dXJuICR0aGlzOwogICAgfQoKICAgIC8qKgogICAgICogR2V0IEluc2VydFJvd3MKICAgICAqCiAgICAgKiBAcmV0dXJuIGJvb2xlYW4KICAgICAqLwogICAgZnVuY3Rpb24gZ2V0SW5zZXJ0Um93cygpIHsKICAgIAlyZXR1cm4gJHRoaXMtPl9pbnNlcnRSb3dzOwogICAgfQoKICAgIC8qKgogICAgICogU2V0IEluc2VydFJvd3MKICAgICAqCiAgICAgKiBAcGFyYW0gYm9vbGVhbiAkcFZhbHVlCiAgICAgKiBAcmV0dXJuIFBIUEV4Y2VsX1dvcmtzaGVldF9Qcm90ZWN0aW9uCiAgICAgKi8KICAgIGZ1bmN0aW9uIHNldEluc2VydFJvd3MoJHBWYWx1ZSA9IGZhbHNlKSB7CiAgICAJJHRoaXMtPl9pbnNlcnRSb3dzID0gJHBWYWx1ZTsKICAgIAlyZXR1cm4gJHRoaXM7CiAgICB9CgogICAgLyoqCiAgICAgKiBHZXQgSW5zZXJ0SHlwZXJsaW5rcwogICAgICoKICAgICAqIEByZXR1cm4gYm9vbGVhbgogICAgICovCiAgICBmdW5jdGlvbiBnZXRJbnNlcnRIeXBlcmxpbmtzKCkgewogICAgCXJldHVybiAkdGhpcy0+X2luc2VydEh5cGVybGlua3M7CiAgICB9CgogICAgLyoqCiAgICAgKiBTZXQgSW5zZXJ0SHlwZXJsaW5rcwogICAgICoKICAgICAqIEBwYXJhbSBib29sZWFuICRwVmFsdWUKICAgICAqIEByZXR1cm4gUEhQRXhjZWxfV29ya3NoZWV0X1Byb3RlY3Rpb24KICAgICAqLwogICAgZnVuY3Rpb24gc2V0SW5zZXJ0SHlwZXJsaW5rcygkcFZhbHVlID0gZmFsc2UpIHsKICAgIAkkdGhpcy0+X2luc2VydEh5cGVybGlua3MgPSAkcFZhbHVlOwogICAgCXJldHVybiAkdGhpczsKICAgIH0KCiAgICAvKioKICAgICAqIEdldCBEZWxldGVDb2x1bW5zCiAgICAgKgogICAgICogQHJldHVybiBib29sZWFuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGdldERlbGV0ZUNvbHVtbnMoKSB7CiAgICAJcmV0dXJuICR0aGlzLT5fZGVsZXRlQ29sdW1uczsKICAgIH0KCiAgICAvKioKICAgICAqIFNldCBEZWxldGVDb2x1bW5zCiAgICAgKgogICAgICogQHBhcmFtIGJvb2xlYW4gJHBWYWx1ZQogICAgICogQHJldHVybiBQSFBFeGNlbF9Xb3Jrc2hlZXRfUHJvdGVjdGlvbgogICAgICovCiAgICBmdW5jdGlvbiBzZXREZWxldGVDb2x1bW5zKCRwVmFsdWUgPSBmYWxzZSkgewogICAgCSR0aGlzLT5fZGVsZXRlQ29sdW1ucyA9ICRwVmFsdWU7CiAgICAJcmV0dXJuICR0aGlzOwogICAgfQoKICAgIC8qKgogICAgICogR2V0IERlbGV0ZVJvd3MKICAgICAqCiAgICAgKiBAcmV0dXJuIGJvb2xlYW4KICAgICAqLwogICAgZnVuY3Rpb24gZ2V0RGVsZXRlUm93cygpIHsKICAgIAlyZXR1cm4gJHRoaXMtPl9kZWxldGVSb3dzOwogICAgfQoKICAgIC8qKgogICAgICogU2V0IERlbGV0ZVJvd3MKICAgICAqCiAgICAgKiBAcGFyYW0gYm9vbGVhbiAkcFZhbHVlCiAgICAgKiBAcmV0dXJuIFBIUEV4Y2VsX1dvcmtzaGVldF9Qcm90ZWN0aW9uCiAgICAgKi8KICAgIGZ1bmN0aW9uIHNldERlbGV0ZVJvd3MoJHBWYWx1ZSA9IGZhbHNlKSB7CiAgICAJJHRoaXMtPl9kZWxldGVSb3dzID0gJHBWYWx1ZTsKICAgIAlyZXR1cm4gJHRoaXM7CiAgICB9CgogICAgLyoqCiAgICAgKiBHZXQgU2VsZWN0TG9ja2VkQ2VsbHMKICAgICAqCiAgICAgKiBAcmV0dXJuIGJvb2xlYW4KICAgICAqLwogICAgZnVuY3Rpb24gZ2V0U2VsZWN0TG9ja2VkQ2VsbHMoKSB7CiAgICAJcmV0dXJuICR0aGlzLT5fc2VsZWN0TG9ja2VkQ2VsbHM7CiAgICB9CgogICAgLyoqCiAgICAgKiBTZXQgU2VsZWN0TG9ja2VkQ2VsbHMKICAgICAqCiAgICAgKiBAcGFyYW0gYm9vbGVhbiAkcFZhbHVlCiAgICAgKiBAcmV0dXJuIFBIUEV4Y2VsX1dvcmtzaGVldF9Qcm90ZWN0aW9uCiAgICAgKi8KICAgIGZ1bmN0aW9uIHNldFNlbGVjdExvY2tlZENlbGxzKCRwVmFsdWUgPSBmYWxzZSkgewogICAgCSR0aGlzLT5fc2VsZWN0TG9ja2VkQ2VsbHMgPSAkcFZhbHVlOwogICAgCXJldHVybiAkdGhpczsKICAgIH0KCiAgICAvKioKICAgICAqIEdldCBTb3J0CiAgICAgKgogICAgICogQHJldHVybiBib29sZWFuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGdldFNvcnQoKSB7CiAgICAJcmV0dXJuICR0aGlzLT5fc29ydDsKICAgIH0KCiAgICAvKioKICAgICAqIFNldCBTb3J0CiAgICAgKgogICAgICogQHBhcmFtIGJvb2xlYW4gJHBWYWx1ZQogICAgICogQHJldHVybiBQSFBFeGNlbF9Xb3Jrc2hlZXRfUHJvdGVjdGlvbgogICAgICovCiAgICBmdW5jdGlvbiBzZXRTb3J0KCRwVmFsdWUgPSBmYWxzZSkgewogICAgCSR0aGlzLT5fc29ydCA9ICRwVmFsdWU7CiAgICAJcmV0dXJuICR0aGlzOwogICAgfQoKICAgIC8qKgogICAgICogR2V0IEF1dG9GaWx0ZXIKICAgICAqCiAgICAgKiBAcmV0dXJuIGJvb2xlYW4KICAgICAqLwogICAgZnVuY3Rpb24gZ2V0QXV0b0ZpbHRlcigpIHsKICAgIAlyZXR1cm4gJHRoaXMtPl9hdXRvRmlsdGVyOwogICAgfQoKICAgIC8qKgogICAgICogU2V0IEF1dG9GaWx0ZXIKICAgICAqCiAgICAgKiBAcGFyYW0gYm9vbGVhbiAkcFZhbHVlCiAgICAgKiBAcmV0dXJuIFBIUEV4Y2VsX1dvcmtzaGVldF9Qcm90ZWN0aW9uCiAgICAgKi8KICAgIGZ1bmN0aW9uIHNldEF1dG9GaWx0ZXIoJHBWYWx1ZSA9IGZhbHNlKSB7CiAgICAJJHRoaXMtPl9hdXRvRmlsdGVyID0gJHBWYWx1ZTsKICAgIAlyZXR1cm4gJHRoaXM7CiAgICB9CgogICAgLyoqCiAgICAgKiBHZXQgUGl2b3RUYWJsZXMKICAgICAqCiAgICAgKiBAcmV0dXJuIGJvb2xlYW4KICAgICAqLwogICAgZnVuY3Rpb24gZ2V0UGl2b3RUYWJsZXMoKSB7CiAgICAJcmV0dXJuICR0aGlzLT5fcGl2b3RUYWJsZXM7CiAgICB9CgogICAgLyoqCiAgICAgKiBTZXQgUGl2b3RUYWJsZXMKICAgICAqCiAgICAgKiBAcGFyYW0gYm9vbGVhbiAkcFZhbHVlCiAgICAgKiBAcmV0dXJuIFBIUEV4Y2VsX1dvcmtzaGVldF9Qcm90ZWN0aW9uCiAgICAgKi8KICAgIGZ1bmN0aW9uIHNldFBpdm90VGFibGVzKCRwVmFsdWUgPSBmYWxzZSkgewogICAgCSR0aGlzLT5fcGl2b3RUYWJsZXMgPSAkcFZhbHVlOwogICAgCXJldHVybiAkdGhpczsKICAgIH0KCiAgICAvKioKICAgICAqIEdldCBTZWxlY3RVbmxvY2tlZENlbGxzCiAgICAgKgogICAgICogQHJldHVybiBib29sZWFuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGdldFNlbGVjdFVubG9ja2VkQ2VsbHMoKSB7CiAgICAJcmV0dXJuICR0aGlzLT5fc2VsZWN0VW5sb2NrZWRDZWxsczsKICAgIH0KCiAgICAvKioKICAgICAqIFNldCBTZWxlY3RVbmxvY2tlZENlbGxzCiAgICAgKgogICAgICogQHBhcmFtIGJvb2xlYW4gJHBWYWx1ZQogICAgICogQHJldHVybiBQSFBFeGNlbF9Xb3Jrc2hlZXRfUHJvdGVjdGlvbgogICAgICovCiAgICBmdW5jdGlvbiBzZXRTZWxlY3RVbmxvY2tlZENlbGxzKCRwVmFsdWUgPSBmYWxzZSkgewogICAgCSR0aGlzLT5fc2VsZWN0VW5sb2NrZWRDZWxscyA9ICRwVmFsdWU7CiAgICAJcmV0dXJuICR0aGlzOwogICAgfQoKICAgIC8qKgogICAgICogR2V0IFBhc3N3b3JkIChoYXNoZWQpCiAgICAgKgogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgZnVuY3Rpb24gZ2V0UGFzc3dvcmQoKSB7CiAgICAJcmV0dXJuICR0aGlzLT5fcGFzc3dvcmQ7CiAgICB9CgogICAgLyoqCiAgICAgKiBTZXQgUGFzc3dvcmQKICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nIAkkcFZhbHVlCiAgICAgKiBAcGFyYW0gYm9vbGVhbiAJJHBBbHJlYWR5SGFzaGVkIElmIHRoZSBwYXNzd29yZCBoYXMgYWxyZWFkeSBiZWVuIGhhc2hlZCwgc2V0IHRoaXMgdG8gdHJ1ZQogICAgICogQHJldHVybiBQSFBFeGNlbF9Xb3Jrc2hlZXRfUHJvdGVjdGlvbgogICAgICovCiAgICBmdW5jdGlvbiBzZXRQYXNzd29yZCgkcFZhbHVlID0gJycsICRwQWxyZWFkeUhhc2hlZCA9IGZhbHNlKSB7CiAgICAJaWYgKCEkcEFscmVhZHlIYXNoZWQpIHsKICAgIAkJJHBWYWx1ZSA9IFBIUEV4Y2VsX1NoYXJlZF9QYXNzd29yZEhhc2hlcjo6aGFzaFBhc3N3b3JkKCRwVmFsdWUpOwogICAgCX0KCQkkdGhpcy0+X3Bhc3N3b3JkID0gJHBWYWx1ZTsKCQlyZXR1cm4gJHRoaXM7CiAgICB9CgoJLyoqCgkgKiBJbXBsZW1lbnQgUEhQIF9fY2xvbmUgdG8gY3JlYXRlIGEgZGVlcCBjbG9uZSwgbm90IGp1c3QgYSBzaGFsbG93IGNvcHkuCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBfX2Nsb25lKCkgewoJCSR2YXJzID0gZ2V0X29iamVjdF92YXJzKCR0aGlzKTsKCQlmb3JlYWNoICgkdmFycyBhcyAka2V5ID0+ICR2YWx1ZSkgewoJCQlpZiAoaXNfb2JqZWN0KCR2YWx1ZSkpIHsKCQkJCSR0aGlzLT4ka2V5ID0gY2xvbmUgJHZhbHVlOwoJCQl9IGVsc2UgewoJCQkJJHRoaXMtPiRrZXkgPSAkdmFsdWU7CgkJCX0KCQl9Cgl9Cn0K]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Worksheet/Row.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIFBIUEV4Y2VsCiAqCiAqIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICoKICogQGNhdGVnb3J5ICAgUEhQRXhjZWwKICogQHBhY2thZ2UgICAgUEhQRXhjZWxfV29ya3NoZWV0CiAqIEBjb3B5cmlnaHQgIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwgKGh0dHA6Ly93d3cuY29kZXBsZXguY29tL1BIUEV4Y2VsKQogKiBAbGljZW5zZSAgICBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvb2xkLWxpY2Vuc2VzL2xncGwtMi4xLnR4dAlMR1BMCiAqIEB2ZXJzaW9uICAgIDEuNy43LCAyMDEyLTA1LTE5CiAqLwoKCi8qKgogKiBQSFBFeGNlbF9Xb3Jrc2hlZXRfUm93CiAqCiAqIFJlcHJlc2VudHMgYSByb3cgaW4gUEhQRXhjZWxfV29ya3NoZWV0LCB1c2VkIGJ5IFBIUEV4Y2VsX1dvcmtzaGVldF9Sb3dJdGVyYXRvcgogKgogKiBAY2F0ZWdvcnkgICBQSFBFeGNlbAogKiBAcGFja2FnZSAgICBQSFBFeGNlbF9Xb3Jrc2hlZXQKICogQGNvcHlyaWdodCAgQ29weXJpZ2h0IChjKSAyMDA2IC0gMjAxMiBQSFBFeGNlbCAoaHR0cDovL3d3dy5jb2RlcGxleC5jb20vUEhQRXhjZWwpCiAqLwpjbGFzcyBQSFBFeGNlbF9Xb3Jrc2hlZXRfUm93CnsKCS8qKgoJICogUEhQRXhjZWxfV29ya3NoZWV0CgkgKgoJICogQHZhciBQSFBFeGNlbF9Xb3Jrc2hlZXQKCSAqLwoJcHJpdmF0ZSAkX3BhcmVudDsKCgkvKioKCSAqIFJvdyBpbmRleAoJICoKCSAqIEB2YXIgaW50CgkgKi8KCXByaXZhdGUgJF9yb3dJbmRleCA9IDA7CgoJLyoqCgkgKiBDcmVhdGUgYSBuZXcgcm93CgkgKgoJICogQHBhcmFtIFBIUEV4Y2VsX1dvcmtzaGVldCAJCSRwYXJlbnQKCSAqIEBwYXJhbSBpbnQJCQkJCQkkcm93SW5kZXgKCSAqLwoJcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KFBIUEV4Y2VsX1dvcmtzaGVldCAkcGFyZW50ID0gbnVsbCwgJHJvd0luZGV4ID0gMSkgewoJCS8vIFNldCBwYXJlbnQgYW5kIHJvdyBpbmRleAoJCSR0aGlzLT5fcGFyZW50IAkJPSAkcGFyZW50OwoJCSR0aGlzLT5fcm93SW5kZXggCT0gJHJvd0luZGV4OwoJfQoKCS8qKgoJICogRGVzdHJ1Y3RvcgoJICovCglwdWJsaWMgZnVuY3Rpb24gX19kZXN0cnVjdCgpIHsKCQl1bnNldCgkdGhpcy0+X3BhcmVudCk7Cgl9CgoJLyoqCgkgKiBHZXQgcm93IGluZGV4CgkgKgoJICogQHJldHVybiBpbnQKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldFJvd0luZGV4KCkgewoJCXJldHVybiAkdGhpcy0+X3Jvd0luZGV4OwoJfQoKCS8qKgoJICogR2V0IGNlbGwgaXRlcmF0b3IKCSAqCgkgKiBAcmV0dXJuIFBIUEV4Y2VsX1dvcmtzaGVldF9DZWxsSXRlcmF0b3IKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldENlbGxJdGVyYXRvcigpIHsKCQlyZXR1cm4gbmV3IFBIUEV4Y2VsX1dvcmtzaGVldF9DZWxsSXRlcmF0b3IoJHRoaXMtPl9wYXJlbnQsICR0aGlzLT5fcm93SW5kZXgpOwoJfQp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Worksheet/RowDimension.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIFBIUEV4Y2VsCiAqCiAqIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICoKICogQGNhdGVnb3J5ICAgUEhQRXhjZWwKICogQHBhY2thZ2UgICAgUEhQRXhjZWxfV29ya3NoZWV0CiAqIEBjb3B5cmlnaHQgIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwgKGh0dHA6Ly93d3cuY29kZXBsZXguY29tL1BIUEV4Y2VsKQogKiBAbGljZW5zZSAgICBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvb2xkLWxpY2Vuc2VzL2xncGwtMi4xLnR4dAlMR1BMCiAqIEB2ZXJzaW9uICAgIDEuNy43LCAyMDEyLTA1LTE5CiAqLwoKCi8qKgogKiBQSFBFeGNlbF9Xb3Jrc2hlZXRfUm93RGltZW5zaW9uCiAqCiAqIEBjYXRlZ29yeSAgIFBIUEV4Y2VsCiAqIEBwYWNrYWdlICAgIFBIUEV4Y2VsX1dvcmtzaGVldAogKiBAY29weXJpZ2h0ICBDb3B5cmlnaHQgKGMpIDIwMDYgLSAyMDEyIFBIUEV4Y2VsIChodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9QSFBFeGNlbCkKICovCmNsYXNzIFBIUEV4Y2VsX1dvcmtzaGVldF9Sb3dEaW1lbnNpb24KewoJLyoqCgkgKiBSb3cgaW5kZXgKCSAqCgkgKiBAdmFyIGludAoJICovCglwcml2YXRlICRfcm93SW5kZXg7CgoJLyoqCgkgKiBSb3cgaGVpZ2h0IChpbiBwdCkKCSAqCgkgKiBXaGVuIHRoaXMgaXMgc2V0IHRvIGEgbmVnYXRpdmUgdmFsdWUsIHRoZSByb3cgaGVpZ2h0IHNob3VsZCBiZSBpZ25vcmVkIGJ5IElXcml0ZXIKCSAqCgkgKiBAdmFyIGRvdWJsZQoJICovCglwcml2YXRlICRfcm93SGVpZ2h0CQk9IC0xOwoKCS8qKgoJICogVmlzaWJsZT8KCSAqCgkgKiBAdmFyIGJvb2wKCSAqLwoJcHJpdmF0ZSAkX3Zpc2libGUJCT0gdHJ1ZTsKCgkvKioKCSAqIE91dGxpbmUgbGV2ZWwKCSAqCgkgKiBAdmFyIGludAoJICovCglwcml2YXRlICRfb3V0bGluZUxldmVsCT0gMDsKCgkvKioKCSAqIENvbGxhcHNlZAoJICoKCSAqIEB2YXIgYm9vbAoJICovCglwcml2YXRlICRfY29sbGFwc2VkCQk9IGZhbHNlOwoKCS8qKgoJICogSW5kZXggdG8gY2VsbFhmLiBOdWxsIHZhbHVlIG1lYW5zIHJvdyBoYXMgbm8gZXhwbGljaXQgY2VsbFhmIGZvcm1hdC4KCSAqCgkgKiBAdmFyIGludHxudWxsCgkgKi8KCXByaXZhdGUgJF94ZkluZGV4OwoKICAgIC8qKgogICAgICogQ3JlYXRlIGEgbmV3IFBIUEV4Y2VsX1dvcmtzaGVldF9Sb3dEaW1lbnNpb24KICAgICAqCiAgICAgKiBAcGFyYW0gaW50ICRwSW5kZXggTnVtZXJpYyByb3cgaW5kZXgKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRwSW5kZXggPSAwKQogICAgewogICAgCS8vIEluaXRpYWxpc2UgdmFsdWVzCiAgICAJJHRoaXMtPl9yb3dJbmRleAkJPSAkcEluZGV4OwoKCQkvLyBzZXQgcm93IGRpbWVuc2lvbiBhcyB1bmZvcm1hdHRlZCBieSBkZWZhdWx0CgkJJHRoaXMtPl94ZkluZGV4ID0gbnVsbDsKICAgIH0KCiAgICAvKioKICAgICAqIEdldCBSb3cgSW5kZXgKICAgICAqCiAgICAgKiBAcmV0dXJuIGludAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0Um93SW5kZXgoKSB7CiAgICAJcmV0dXJuICR0aGlzLT5fcm93SW5kZXg7CiAgICB9CgogICAgLyoqCiAgICAgKiBTZXQgUm93IEluZGV4CiAgICAgKgogICAgICogQHBhcmFtIGludCAkcFZhbHVlCiAgICAgKiBAcmV0dXJuIFBIUEV4Y2VsX1dvcmtzaGVldF9Sb3dEaW1lbnNpb24KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHNldFJvd0luZGV4KCRwVmFsdWUpIHsKICAgIAkkdGhpcy0+X3Jvd0luZGV4ID0gJHBWYWx1ZTsKICAgIAlyZXR1cm4gJHRoaXM7CiAgICB9CgogICAgLyoqCiAgICAgKiBHZXQgUm93IEhlaWdodAogICAgICoKICAgICAqIEByZXR1cm4gZG91YmxlCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRSb3dIZWlnaHQoKSB7CiAgICAJcmV0dXJuICR0aGlzLT5fcm93SGVpZ2h0OwogICAgfQoKICAgIC8qKgogICAgICogU2V0IFJvdyBIZWlnaHQKICAgICAqCiAgICAgKiBAcGFyYW0gZG91YmxlICRwVmFsdWUKICAgICAqIEByZXR1cm4gUEhQRXhjZWxfV29ya3NoZWV0X1Jvd0RpbWVuc2lvbgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gc2V0Um93SGVpZ2h0KCRwVmFsdWUgPSAtMSkgewogICAgCSR0aGlzLT5fcm93SGVpZ2h0ID0gJHBWYWx1ZTsKICAgIAlyZXR1cm4gJHRoaXM7CiAgICB9CgogICAgLyoqCiAgICAgKiBHZXQgVmlzaWJsZQogICAgICoKICAgICAqIEByZXR1cm4gYm9vbAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0VmlzaWJsZSgpIHsKICAgIAlyZXR1cm4gJHRoaXMtPl92aXNpYmxlOwogICAgfQoKICAgIC8qKgogICAgICogU2V0IFZpc2libGUKICAgICAqCiAgICAgKiBAcGFyYW0gYm9vbCAkcFZhbHVlCiAgICAgKiBAcmV0dXJuIFBIUEV4Y2VsX1dvcmtzaGVldF9Sb3dEaW1lbnNpb24KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHNldFZpc2libGUoJHBWYWx1ZSA9IHRydWUpIHsKICAgIAkkdGhpcy0+X3Zpc2libGUgPSAkcFZhbHVlOwogICAgCXJldHVybiAkdGhpczsKICAgIH0KCiAgICAvKioKICAgICAqIEdldCBPdXRsaW5lIExldmVsCiAgICAgKgogICAgICogQHJldHVybiBpbnQKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldE91dGxpbmVMZXZlbCgpIHsKICAgIAlyZXR1cm4gJHRoaXMtPl9vdXRsaW5lTGV2ZWw7CiAgICB9CgogICAgLyoqCiAgICAgKiBTZXQgT3V0bGluZSBMZXZlbAogICAgICoKICAgICAqIFZhbHVlIG11c3QgYmUgYmV0d2VlbiAwIGFuZCA3CiAgICAgKgogICAgICogQHBhcmFtIGludCAkcFZhbHVlCiAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgogICAgICogQHJldHVybiBQSFBFeGNlbF9Xb3Jrc2hlZXRfUm93RGltZW5zaW9uCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBzZXRPdXRsaW5lTGV2ZWwoJHBWYWx1ZSkgewogICAgCWlmICgkcFZhbHVlIDwgMCB8fCAkcFZhbHVlID4gNykgewogICAgCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCJPdXRsaW5lIGxldmVsIG11c3QgcmFuZ2UgYmV0d2VlbiAwIGFuZCA3LiIpOwogICAgCX0KCiAgICAJJHRoaXMtPl9vdXRsaW5lTGV2ZWwgPSAkcFZhbHVlOwogICAgCXJldHVybiAkdGhpczsKICAgIH0KCiAgICAvKioKICAgICAqIEdldCBDb2xsYXBzZWQKICAgICAqCiAgICAgKiBAcmV0dXJuIGJvb2wKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldENvbGxhcHNlZCgpIHsKICAgIAlyZXR1cm4gJHRoaXMtPl9jb2xsYXBzZWQ7CiAgICB9CgogICAgLyoqCiAgICAgKiBTZXQgQ29sbGFwc2VkCiAgICAgKgogICAgICogQHBhcmFtIGJvb2wgJHBWYWx1ZQogICAgICogQHJldHVybiBQSFBFeGNlbF9Xb3Jrc2hlZXRfUm93RGltZW5zaW9uCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBzZXRDb2xsYXBzZWQoJHBWYWx1ZSA9IHRydWUpIHsKICAgIAkkdGhpcy0+X2NvbGxhcHNlZCA9ICRwVmFsdWU7CiAgICAJcmV0dXJuICR0aGlzOwogICAgfQoKCS8qKgoJICogR2V0IGluZGV4IHRvIGNlbGxYZgoJICoKCSAqIEByZXR1cm4gaW50CgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRYZkluZGV4KCkKCXsKCQlyZXR1cm4gJHRoaXMtPl94ZkluZGV4OwoJfQoKCS8qKgoJICogU2V0IGluZGV4IHRvIGNlbGxYZgoJICoKCSAqIEBwYXJhbSBpbnQgJHBWYWx1ZQoJICogQHJldHVybiBQSFBFeGNlbF9Xb3Jrc2hlZXRfUm93RGltZW5zaW9uCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBzZXRYZkluZGV4KCRwVmFsdWUgPSAwKQoJewoJCSR0aGlzLT5feGZJbmRleCA9ICRwVmFsdWU7CgkJcmV0dXJuICR0aGlzOwoJfQoKCS8qKgoJICogSW1wbGVtZW50IFBIUCBfX2Nsb25lIHRvIGNyZWF0ZSBhIGRlZXAgY2xvbmUsIG5vdCBqdXN0IGEgc2hhbGxvdyBjb3B5LgoJICovCglwdWJsaWMgZnVuY3Rpb24gX19jbG9uZSgpIHsKCQkkdmFycyA9IGdldF9vYmplY3RfdmFycygkdGhpcyk7CgkJZm9yZWFjaCAoJHZhcnMgYXMgJGtleSA9PiAkdmFsdWUpIHsKCQkJaWYgKGlzX29iamVjdCgkdmFsdWUpKSB7CgkJCQkkdGhpcy0+JGtleSA9IGNsb25lICR2YWx1ZTsKCQkJfSBlbHNlIHsKCQkJCSR0aGlzLT4ka2V5ID0gJHZhbHVlOwoJCQl9CgkJfQoJfQp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Worksheet/RowIterator.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIFBIUEV4Y2VsCiAqCiAqIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICoKICogQGNhdGVnb3J5ICAgUEhQRXhjZWwKICogQHBhY2thZ2UJUEhQRXhjZWxfV29ya3NoZWV0CiAqIEBjb3B5cmlnaHQgIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwgKGh0dHA6Ly93d3cuY29kZXBsZXguY29tL1BIUEV4Y2VsKQogKiBAbGljZW5zZQlodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvb2xkLWxpY2Vuc2VzL2xncGwtMi4xLnR4dAlMR1BMCiAqIEB2ZXJzaW9uCTEuNy43LCAyMDEyLTA1LTE5CiAqLwoKCi8qKgogKiBQSFBFeGNlbF9Xb3Jrc2hlZXRfUm93SXRlcmF0b3IKICoKICogVXNlZCB0byBpdGVyYXRlIHJvd3MgaW4gYSBQSFBFeGNlbF9Xb3Jrc2hlZXQKICoKICogQGNhdGVnb3J5ICAgUEhQRXhjZWwKICogQHBhY2thZ2UJUEhQRXhjZWxfV29ya3NoZWV0CiAqIEBjb3B5cmlnaHQgIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwgKGh0dHA6Ly93d3cuY29kZXBsZXguY29tL1BIUEV4Y2VsKQogKi8KY2xhc3MgUEhQRXhjZWxfV29ya3NoZWV0X1Jvd0l0ZXJhdG9yIGltcGxlbWVudHMgSXRlcmF0b3IKewoJLyoqCgkgKiBQSFBFeGNlbF9Xb3Jrc2hlZXQgdG8gaXRlcmF0ZQoJICoKCSAqIEB2YXIgUEhQRXhjZWxfV29ya3NoZWV0CgkgKi8KCXByaXZhdGUgJF9zdWJqZWN0OwoKCS8qKgoJICogQ3VycmVudCBpdGVyYXRvciBwb3NpdGlvbgoJICoKCSAqIEB2YXIgaW50CgkgKi8KCXByaXZhdGUgJF9wb3NpdGlvbiA9IDE7CgoJLyoqCgkgKiBTdGFydCBwb3NpdGlvbgoJICoKCSAqIEB2YXIgaW50CgkgKi8KCXByaXZhdGUgJF9zdGFydFJvdyA9IDE7CgoKCS8qKgoJICogQ3JlYXRlIGEgbmV3IHJvdyBpdGVyYXRvcgoJICoKCSAqIEBwYXJhbQlQSFBFeGNlbF9Xb3Jrc2hlZXQJJHN1YmplY3QJVGhlIHdvcmtzaGVldCB0byBpdGVyYXRlIG92ZXIKCSAqIEBwYXJhbQlpbnRlZ2VyCQkJCSRzdGFydFJvdwlUaGUgcm93IG51bWJlciBhdCB3aGljaCB0byBzdGFydCBpdGVyYXRpbmcKCSAqLwoJcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KFBIUEV4Y2VsX1dvcmtzaGVldCAkc3ViamVjdCA9IG51bGwsICRzdGFydFJvdyA9IDEpIHsKCQkvLyBTZXQgc3ViamVjdAoJCSR0aGlzLT5fc3ViamVjdCA9ICRzdWJqZWN0OwoJCSR0aGlzLT5yZXNldFN0YXJ0KCRzdGFydFJvdyk7Cgl9CgoJLyoqCgkgKiBEZXN0cnVjdG9yCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBfX2Rlc3RydWN0KCkgewoJCXVuc2V0KCR0aGlzLT5fc3ViamVjdCk7Cgl9CgoJLyoqCgkgKiAoUmUpU2V0IHRoZSBzdGFydCByb3cgYW5kIHRoZSBjdXJyZW50IHJvdyBwb2ludGVyCgkgKgoJICogQHBhcmFtIGludGVnZXIJJHN0YXJ0Um93CVRoZSByb3cgbnVtYmVyIGF0IHdoaWNoIHRvIHN0YXJ0IGl0ZXJhdGluZwoJICovCglwdWJsaWMgZnVuY3Rpb24gcmVzZXRTdGFydCgkc3RhcnRSb3cgPSAxKSB7CgkJJHRoaXMtPl9zdGFydFJvdyA9ICRzdGFydFJvdzsKCQkkdGhpcy0+c2Vlaygkc3RhcnRSb3cpOwoJfQoKCS8qKgoJICogU2V0IHRoZSByb3cgcG9pbnRlciB0byB0aGUgc2VsZWN0ZWQgcm93CgkgKgoJICogQHBhcmFtIGludGVnZXIJJHJvdwlUaGUgcm93IG51bWJlciB0byBzZXQgdGhlIGN1cnJlbnQgcG9pbnRlciBhdAoJICovCglwdWJsaWMgZnVuY3Rpb24gc2Vlaygkcm93ID0gMSkgewoJCSR0aGlzLT5fcG9zaXRpb24gPSAkcm93OwoJfQoKCS8qKgoJICogUmV3aW5kIHRoZSBpdGVyYXRvciB0byB0aGUgc3RhcnRpbmcgcm93CgkgKi8KCXB1YmxpYyBmdW5jdGlvbiByZXdpbmQoKSB7CgkJJHRoaXMtPl9wb3NpdGlvbiA9ICR0aGlzLT5fc3RhcnRSb3c7Cgl9CgoJLyoqCgkgKiBSZXR1cm4gdGhlIGN1cnJlbnQgcm93IGluIHRoaXMgd29ya3NoZWV0CgkgKgoJICogQHJldHVybiBQSFBFeGNlbF9Xb3Jrc2hlZXRfUm93CgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBjdXJyZW50KCkgewoJCXJldHVybiBuZXcgUEhQRXhjZWxfV29ya3NoZWV0X1JvdygkdGhpcy0+X3N1YmplY3QsICR0aGlzLT5fcG9zaXRpb24pOwoJfQoKCS8qKgoJICogUmV0dXJuIHRoZSBjdXJyZW50IGl0ZXJhdG9yIGtleQoJICoKCSAqIEByZXR1cm4gaW50CgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBrZXkoKSB7CgkJcmV0dXJuICR0aGlzLT5fcG9zaXRpb247Cgl9CgoJLyoqCgkgKiBTZXQgdGhlIGl0ZXJhdG9yIHRvIGl0cyBuZXh0IHZhbHVlCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBuZXh0KCkgewoJCSsrJHRoaXMtPl9wb3NpdGlvbjsKCX0KCgkvKioKCSAqIFNldCB0aGUgaXRlcmF0b3IgdG8gaXRzIHByZXZpb3VzIHZhbHVlCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBwcmV2KCkgewoJCWlmICgkdGhpcy0+X3Bvc2l0aW9uID4gMSkKCQkJLS0kdGhpcy0+X3Bvc2l0aW9uOwoJfQoKCS8qKgoJICogSW5kaWNhdGUgaWYgbW9yZSByb3dzIGV4aXN0IGluIHRoZSB3b3Jrc2hlZXQKCSAqCgkgKiBAcmV0dXJuIGJvb2xlYW4KCSAqLwoJcHVibGljIGZ1bmN0aW9uIHZhbGlkKCkgewoJCXJldHVybiAkdGhpcy0+X3Bvc2l0aW9uIDw9ICR0aGlzLT5fc3ViamVjdC0+Z2V0SGlnaGVzdFJvdygpOwoJfQp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Worksheet/SheetView.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIFBIUEV4Y2VsCiAqCiAqIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICoKICogQGNhdGVnb3J5ICAgUEhQRXhjZWwKICogQHBhY2thZ2UgICAgUEhQRXhjZWxfV29ya3NoZWV0CiAqIEBjb3B5cmlnaHQgIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwgKGh0dHA6Ly93d3cuY29kZXBsZXguY29tL1BIUEV4Y2VsKQogKiBAbGljZW5zZSAgICBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvb2xkLWxpY2Vuc2VzL2xncGwtMi4xLnR4dAlMR1BMCiAqIEB2ZXJzaW9uICAgIDEuNy43LCAyMDEyLTA1LTE5CiAqLwoKCi8qKgogKiBQSFBFeGNlbF9Xb3Jrc2hlZXRfU2hlZXRWaWV3CiAqCiAqIEBjYXRlZ29yeSAgIFBIUEV4Y2VsCiAqIEBwYWNrYWdlICAgIFBIUEV4Y2VsX1dvcmtzaGVldAogKiBAY29weXJpZ2h0ICBDb3B5cmlnaHQgKGMpIDIwMDYgLSAyMDEyIFBIUEV4Y2VsIChodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9QSFBFeGNlbCkKICovCmNsYXNzIFBIUEV4Y2VsX1dvcmtzaGVldF9TaGVldFZpZXcKewoJLyoqCgkgKiBab29tU2NhbGUKCSAqCgkgKiBWYWxpZCB2YWx1ZXMgcmFuZ2UgZnJvbSAxMCB0byA0MDAuCgkgKgoJICogQHZhciBpbnQKCSAqLwoJcHJpdmF0ZSAkX3pvb21TY2FsZQkJCT0gMTAwOwoKCS8qKgoJICogWm9vbVNjYWxlTm9ybWFsCgkgKgoJICogVmFsaWQgdmFsdWVzIHJhbmdlIGZyb20gMTAgdG8gNDAwLgoJICoKCSAqIEB2YXIgaW50CgkgKi8KCXByaXZhdGUgJF96b29tU2NhbGVOb3JtYWwJPSAxMDA7CgogICAgLyoqCiAgICAgKiBDcmVhdGUgYSBuZXcgUEhQRXhjZWxfV29ya3NoZWV0X1NoZWV0VmlldwogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoKQogICAgewogICAgfQoKCS8qKgoJICogR2V0IFpvb21TY2FsZQoJICoKCSAqIEByZXR1cm4gaW50CgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRab29tU2NhbGUoKSB7CgkJcmV0dXJuICR0aGlzLT5fem9vbVNjYWxlOwoJfQoKCS8qKgoJICogU2V0IFpvb21TY2FsZQoJICoKCSAqIFZhbGlkIHZhbHVlcyByYW5nZSBmcm9tIDEwIHRvIDQwMC4KCSAqCgkgKiBAcGFyYW0gCWludCAJJHBWYWx1ZQoJICogQHRocm93cyAJRXhjZXB0aW9uCgkgKiBAcmV0dXJuIFBIUEV4Y2VsX1dvcmtzaGVldF9TaGVldFZpZXcKCSAqLwoJcHVibGljIGZ1bmN0aW9uIHNldFpvb21TY2FsZSgkcFZhbHVlID0gMTAwKSB7CgkJLy8gTWljcm9zb2Z0IE9mZmljZSBFeGNlbCAyMDA3IG9ubHkgYWxsb3dzIHNldHRpbmcgYSBzY2FsZSBiZXR3ZWVuIDEwIGFuZCA0MDAgdmlhIHRoZSB1c2VyIGludGVyZmFjZSwKCQkvLyBidXQgaXQgaXMgYXBwYXJlbnRseSBzdGlsbCBhYmxlIHRvIGhhbmRsZSBhbnkgc2NhbGUgPj0gMQoJCWlmICgoJHBWYWx1ZSA+PSAxKSB8fCBpc19udWxsKCRwVmFsdWUpKSB7CgkJCSR0aGlzLT5fem9vbVNjYWxlID0gJHBWYWx1ZTsKCQl9IGVsc2UgewoJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCJTY2FsZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAxLiIpOwoJCX0KCQlyZXR1cm4gJHRoaXM7Cgl9CgoJLyoqCgkgKiBHZXQgWm9vbVNjYWxlTm9ybWFsCgkgKgoJICogQHJldHVybiBpbnQKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldFpvb21TY2FsZU5vcm1hbCgpIHsKCQlyZXR1cm4gJHRoaXMtPl96b29tU2NhbGVOb3JtYWw7Cgl9CgoJLyoqCgkgKiBTZXQgWm9vbVNjYWxlCgkgKgoJICogVmFsaWQgdmFsdWVzIHJhbmdlIGZyb20gMTAgdG8gNDAwLgoJICoKCSAqIEBwYXJhbSAJaW50IAkkcFZhbHVlCgkgKiBAdGhyb3dzIAlFeGNlcHRpb24KCSAqIEByZXR1cm4gUEhQRXhjZWxfV29ya3NoZWV0X1NoZWV0VmlldwoJICovCglwdWJsaWMgZnVuY3Rpb24gc2V0Wm9vbVNjYWxlTm9ybWFsKCRwVmFsdWUgPSAxMDApIHsKCQlpZiAoKCRwVmFsdWUgPj0gMSkgfHwgaXNfbnVsbCgkcFZhbHVlKSkgewoJCQkkdGhpcy0+X3pvb21TY2FsZU5vcm1hbCA9ICRwVmFsdWU7CgkJfSBlbHNlIHsKCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbigiU2NhbGUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gMS4iKTsKCQl9CgkJcmV0dXJuICR0aGlzOwoJfQoKCS8qKgoJICogSW1wbGVtZW50IFBIUCBfX2Nsb25lIHRvIGNyZWF0ZSBhIGRlZXAgY2xvbmUsIG5vdCBqdXN0IGEgc2hhbGxvdyBjb3B5LgoJICovCglwdWJsaWMgZnVuY3Rpb24gX19jbG9uZSgpIHsKCQkkdmFycyA9IGdldF9vYmplY3RfdmFycygkdGhpcyk7CgkJZm9yZWFjaCAoJHZhcnMgYXMgJGtleSA9PiAkdmFsdWUpIHsKCQkJaWYgKGlzX29iamVjdCgkdmFsdWUpKSB7CgkJCQkkdGhpcy0+JGtleSA9IGNsb25lICR2YWx1ZTsKCQkJfSBlbHNlIHsKCQkJCSR0aGlzLT4ka2V5ID0gJHZhbHVlOwoJCQl9CgkJfQoJfQp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/WorksheetIterator.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIFBIUEV4Y2VsCiAqCiAqIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICoKICogQGNhdGVnb3J5ICAgUEhQRXhjZWwKICogQHBhY2thZ2UgICAgUEhQRXhjZWwKICogQGNvcHlyaWdodCAgQ29weXJpZ2h0IChjKSAyMDA2IC0gMjAxMiBQSFBFeGNlbCAoaHR0cDovL3d3dy5jb2RlcGxleC5jb20vUEhQRXhjZWwpCiAqIEBsaWNlbnNlICAgIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9vbGQtbGljZW5zZXMvbGdwbC0yLjEudHh0CUxHUEwKICogQHZlcnNpb24gICAgMS43LjcsIDIwMTItMDUtMTkKICovCgoKLyoqCiAqIFBIUEV4Y2VsX1dvcmtzaGVldEl0ZXJhdG9yCiAqCiAqIFVzZWQgdG8gaXRlcmF0ZSB3b3Jrc2hlZXRzIGluIFBIUEV4Y2VsCiAqCiAqIEBjYXRlZ29yeSAgIFBIUEV4Y2VsCiAqIEBwYWNrYWdlICAgIFBIUEV4Y2VsCiAqIEBjb3B5cmlnaHQgIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwgKGh0dHA6Ly93d3cuY29kZXBsZXguY29tL1BIUEV4Y2VsKQogKi8KY2xhc3MgUEhQRXhjZWxfV29ya3NoZWV0SXRlcmF0b3IgaW1wbGVtZW50cyBJdGVyYXRvcgp7CgkvKioKCSAqIFNwcmVhZHNoZWV0IHRvIGl0ZXJhdGUKCSAqCgkgKiBAdmFyIFBIUEV4Y2VsCgkgKi8KCXByaXZhdGUgJF9zdWJqZWN0OwoKCS8qKgoJICogQ3VycmVudCBpdGVyYXRvciBwb3NpdGlvbgoJICoKCSAqIEB2YXIgaW50CgkgKi8KCXByaXZhdGUgJF9wb3NpdGlvbiA9IDA7CgoJLyoqCgkgKiBDcmVhdGUgYSBuZXcgd29ya3NoZWV0IGl0ZXJhdG9yCgkgKgoJICogQHBhcmFtIFBIUEV4Y2VsIAkJJHN1YmplY3QKCSAqLwoJcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KFBIUEV4Y2VsICRzdWJqZWN0ID0gbnVsbCkgewoJCS8vIFNldCBzdWJqZWN0CgkJJHRoaXMtPl9zdWJqZWN0ID0gJHN1YmplY3Q7Cgl9CgoJLyoqCgkgKiBEZXN0cnVjdG9yCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBfX2Rlc3RydWN0KCkgewoJCXVuc2V0KCR0aGlzLT5fc3ViamVjdCk7Cgl9CgoJLyoqCgkgKiBSZXdpbmQgaXRlcmF0b3IKCSAqLwogICAgcHVibGljIGZ1bmN0aW9uIHJld2luZCgpIHsKICAgICAgICAkdGhpcy0+X3Bvc2l0aW9uID0gMDsKICAgIH0KCiAgICAvKioKICAgICAqIEN1cnJlbnQgUEhQRXhjZWxfV29ya3NoZWV0CiAgICAgKgogICAgICogQHJldHVybiBQSFBFeGNlbF9Xb3Jrc2hlZXQKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGN1cnJlbnQoKSB7CiAgICAJcmV0dXJuICR0aGlzLT5fc3ViamVjdC0+Z2V0U2hlZXQoJHRoaXMtPl9wb3NpdGlvbik7CiAgICB9CgogICAgLyoqCiAgICAgKiBDdXJyZW50IGtleQogICAgICoKICAgICAqIEByZXR1cm4gaW50CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBrZXkoKSB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5fcG9zaXRpb247CiAgICB9CgogICAgLyoqCiAgICAgKiBOZXh0IHZhbHVlCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBuZXh0KCkgewogICAgICAgICsrJHRoaXMtPl9wb3NpdGlvbjsKICAgIH0KCiAgICAvKioKICAgICAqIE1vcmUgUEhQRXhjZWxfV29ya3NoZWV0IGluc3RhbmNlcyBhdmFpbGFibGU/CiAgICAgKgogICAgICogQHJldHVybiBib29sZWFuCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiB2YWxpZCgpIHsKICAgICAgICByZXR1cm4gJHRoaXMtPl9wb3NpdGlvbiA8ICR0aGlzLT5fc3ViamVjdC0+Z2V0U2hlZXRDb3VudCgpOwogICAgfQp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Writer/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Writer/CSV.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIFBIUEV4Y2VsCiAqCiAqIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICoKICogQGNhdGVnb3J5ICAgUEhQRXhjZWwKICogQHBhY2thZ2UJUEhQRXhjZWxfV3JpdGVyCiAqIEBjb3B5cmlnaHQgIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwgKGh0dHA6Ly93d3cuY29kZXBsZXguY29tL1BIUEV4Y2VsKQogKiBAbGljZW5zZQlodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvb2xkLWxpY2Vuc2VzL2xncGwtMi4xLnR4dAlMR1BMCiAqIEB2ZXJzaW9uCTEuNy43LCAyMDEyLTA1LTE5CiAqLwoKCi8qKgogKiBQSFBFeGNlbF9Xcml0ZXJfQ1NWCiAqCiAqIEBjYXRlZ29yeSAgIFBIUEV4Y2VsCiAqIEBwYWNrYWdlCVBIUEV4Y2VsX1dyaXRlcgogKiBAY29weXJpZ2h0ICBDb3B5cmlnaHQgKGMpIDIwMDYgLSAyMDEyIFBIUEV4Y2VsIChodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9QSFBFeGNlbCkKICovCmNsYXNzIFBIUEV4Y2VsX1dyaXRlcl9DU1YgaW1wbGVtZW50cyBQSFBFeGNlbF9Xcml0ZXJfSVdyaXRlciB7CgkvKioKCSAqIFBIUEV4Y2VsIG9iamVjdAoJICoKCSAqIEB2YXIgUEhQRXhjZWwKCSAqLwoJcHJpdmF0ZSAkX3BocEV4Y2VsOwoKCS8qKgoJICogRGVsaW1pdGVyCgkgKgoJICogQHZhciBzdHJpbmcKCSAqLwoJcHJpdmF0ZSAkX2RlbGltaXRlcgk9ICcsJzsKCgkvKioKCSAqIEVuY2xvc3VyZQoJICoKCSAqIEB2YXIgc3RyaW5nCgkgKi8KCXByaXZhdGUgJF9lbmNsb3N1cmUJPSAnIic7CgoJLyoqCgkgKiBMaW5lIGVuZGluZwoJICoKCSAqIEB2YXIgc3RyaW5nCgkgKi8KCXByaXZhdGUgJF9saW5lRW5kaW5nCT0gUEhQX0VPTDsKCgkvKioKCSAqIFNoZWV0IGluZGV4IHRvIHdyaXRlCgkgKgoJICogQHZhciBpbnQKCSAqLwoJcHJpdmF0ZSAkX3NoZWV0SW5kZXgJPSAwOwoKCS8qKgoJICogUHJlLWNhbGN1bGF0ZSBmb3JtdWxhcwoJICoKCSAqIEB2YXIgYm9vbGVhbgoJICovCglwcml2YXRlICRfcHJlQ2FsY3VsYXRlRm9ybXVsYXMgPSB0cnVlOwoKCS8qKgoJICogV2hldGhlciB0byB3cml0ZSBhIEJPTSAoZm9yIFVURjgpLgoJICoKCSAqIEB2YXIgYm9vbGVhbgoJICovCglwcml2YXRlICRfdXNlQk9NID0gZmFsc2U7CgoJLyoqCgkgKiBDcmVhdGUgYSBuZXcgUEhQRXhjZWxfV3JpdGVyX0NTVgoJICoKCSAqIEBwYXJhbQlQSFBFeGNlbAkkcGhwRXhjZWwJUEhQRXhjZWwgb2JqZWN0CgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChQSFBFeGNlbCAkcGhwRXhjZWwpIHsKCQkkdGhpcy0+X3BocEV4Y2VsCT0gJHBocEV4Y2VsOwoJfQoKCS8qKgoJICogU2F2ZSBQSFBFeGNlbCB0byBmaWxlCgkgKgoJICogQHBhcmFtCXN0cmluZwkJJHBGaWxlbmFtZQoJICogQHRocm93cwlFeGNlcHRpb24KCSAqLwoJcHVibGljIGZ1bmN0aW9uIHNhdmUoJHBGaWxlbmFtZSA9IG51bGwpIHsKCQkvLyBGZXRjaCBzaGVldAoJCSRzaGVldCA9ICR0aGlzLT5fcGhwRXhjZWwtPmdldFNoZWV0KCR0aGlzLT5fc2hlZXRJbmRleCk7CgoJCSRzYXZlRGVidWdMb2cgPSBQSFBFeGNlbF9DYWxjdWxhdGlvbjo6Z2V0SW5zdGFuY2UoKS0+d3JpdGVEZWJ1Z0xvZzsKCQlQSFBFeGNlbF9DYWxjdWxhdGlvbjo6Z2V0SW5zdGFuY2UoKS0+d3JpdGVEZWJ1Z0xvZyA9IGZhbHNlOwoJCSRzYXZlQXJyYXlSZXR1cm5UeXBlID0gUEhQRXhjZWxfQ2FsY3VsYXRpb246OmdldEFycmF5UmV0dXJuVHlwZSgpOwoJCVBIUEV4Y2VsX0NhbGN1bGF0aW9uOjpzZXRBcnJheVJldHVyblR5cGUoUEhQRXhjZWxfQ2FsY3VsYXRpb246OlJFVFVSTl9BUlJBWV9BU19WQUxVRSk7CgoJCS8vIE9wZW4gZmlsZQoJCSRmaWxlSGFuZGxlID0gZm9wZW4oJHBGaWxlbmFtZSwgJ3diKycpOwoJCWlmICgkZmlsZUhhbmRsZSA9PT0gZmFsc2UpIHsKCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbigiQ291bGQgbm90IG9wZW4gZmlsZSAkcEZpbGVuYW1lIGZvciB3cml0aW5nLiIpOwoJCX0KCgkJaWYgKCR0aGlzLT5fdXNlQk9NKSB7CgkJCS8vIFdyaXRlIHRoZSBVVEYtOCBCT00gY29kZQoJCQlmd3JpdGUoJGZpbGVIYW5kbGUsICJceEVGXHhCQlx4QkYiKTsKCQl9CgoJCS8vCUlkZW50aWZ5IHRoZSByYW5nZSB0aGF0IHdlIG5lZWQgdG8gZXh0cmFjdCBmcm9tIHRoZSB3b3Jrc2hlZXQKCQkkbWF4Q29sID0gJHNoZWV0LT5nZXRIaWdoZXN0Q29sdW1uKCk7CgkJJG1heFJvdyA9ICRzaGVldC0+Z2V0SGlnaGVzdFJvdygpOwoKCQkvLyBXcml0ZSByb3dzIHRvIGZpbGUKCQlmb3IoJHJvdyA9IDE7ICRyb3cgPD0gJG1heFJvdzsgKyskcm93KSB7CgkJCS8vIENvbnZlcnQgdGhlIHJvdyB0byBhbiBhcnJheS4uLgoJCQkkY2VsbHNBcnJheSA9ICRzaGVldC0+cmFuZ2VUb0FycmF5KCdBJy4kcm93Lic6Jy4kbWF4Q29sLiRyb3csJycsICR0aGlzLT5fcHJlQ2FsY3VsYXRlRm9ybXVsYXMpOwoJCQkvLyAuLi4gYW5kIHdyaXRlIHRvIHRoZSBmaWxlCgkJCSR0aGlzLT5fd3JpdGVMaW5lKCRmaWxlSGFuZGxlLCAkY2VsbHNBcnJheVswXSk7CgkJfQoKCQkvLyBDbG9zZSBmaWxlCgkJZmNsb3NlKCRmaWxlSGFuZGxlKTsKCgkJUEhQRXhjZWxfQ2FsY3VsYXRpb246OnNldEFycmF5UmV0dXJuVHlwZSgkc2F2ZUFycmF5UmV0dXJuVHlwZSk7CgkJUEhQRXhjZWxfQ2FsY3VsYXRpb246OmdldEluc3RhbmNlKCktPndyaXRlRGVidWdMb2cgPSAkc2F2ZURlYnVnTG9nOwoJfQoKCS8qKgoJICogR2V0IGRlbGltaXRlcgoJICoKCSAqIEByZXR1cm4gc3RyaW5nCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXREZWxpbWl0ZXIoKSB7CgkJcmV0dXJuICR0aGlzLT5fZGVsaW1pdGVyOwoJfQoKCS8qKgoJICogU2V0IGRlbGltaXRlcgoJICoKCSAqIEBwYXJhbQlzdHJpbmcJJHBWYWx1ZQkJRGVsaW1pdGVyLCBkZWZhdWx0cyB0byAsCgkgKiBAcmV0dXJuIFBIUEV4Y2VsX1dyaXRlcl9DU1YKCSAqLwoJcHVibGljIGZ1bmN0aW9uIHNldERlbGltaXRlcigkcFZhbHVlID0gJywnKSB7CgkJJHRoaXMtPl9kZWxpbWl0ZXIgPSAkcFZhbHVlOwoJCXJldHVybiAkdGhpczsKCX0KCgkvKioKCSAqIEdldCBlbmNsb3N1cmUKCSAqCgkgKiBAcmV0dXJuIHN0cmluZwoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0RW5jbG9zdXJlKCkgewoJCXJldHVybiAkdGhpcy0+X2VuY2xvc3VyZTsKCX0KCgkvKioKCSAqIFNldCBlbmNsb3N1cmUKCSAqCgkgKiBAcGFyYW0Jc3RyaW5nCSRwVmFsdWUJCUVuY2xvc3VyZSwgZGVmYXVsdHMgdG8gIgoJICogQHJldHVybiBQSFBFeGNlbF9Xcml0ZXJfQ1NWCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBzZXRFbmNsb3N1cmUoJHBWYWx1ZSA9ICciJykgewoJCWlmICgkcFZhbHVlID09ICcnKSB7CgkJCSRwVmFsdWUgPSBudWxsOwoJCX0KCQkkdGhpcy0+X2VuY2xvc3VyZSA9ICRwVmFsdWU7CgkJcmV0dXJuICR0aGlzOwoJfQoKCS8qKgoJICogR2V0IGxpbmUgZW5kaW5nCgkgKgoJICogQHJldHVybiBzdHJpbmcKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldExpbmVFbmRpbmcoKSB7CgkJcmV0dXJuICR0aGlzLT5fbGluZUVuZGluZzsKCX0KCgkvKioKCSAqIFNldCBsaW5lIGVuZGluZwoJICoKCSAqIEBwYXJhbQlzdHJpbmcJJHBWYWx1ZQkJTGluZSBlbmRpbmcsIGRlZmF1bHRzIHRvIE9TIGxpbmUgZW5kaW5nIChQSFBfRU9MKQoJICogQHJldHVybiBQSFBFeGNlbF9Xcml0ZXJfQ1NWCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBzZXRMaW5lRW5kaW5nKCRwVmFsdWUgPSBQSFBfRU9MKSB7CgkJJHRoaXMtPl9saW5lRW5kaW5nID0gJHBWYWx1ZTsKCQlyZXR1cm4gJHRoaXM7Cgl9CgoJLyoqCgkgKiBHZXQgd2hldGhlciBCT00gc2hvdWxkIGJlIHVzZWQKCSAqCgkgKiBAcmV0dXJuIGJvb2xlYW4KCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldFVzZUJPTSgpIHsKCQlyZXR1cm4gJHRoaXMtPl91c2VCT007Cgl9CgoJLyoqCgkgKiBTZXQgd2hldGhlciBCT00gc2hvdWxkIGJlIHVzZWQKCSAqCgkgKiBAcGFyYW0JYm9vbGVhbgkkcFZhbHVlCQlVc2UgVVRGLTggYnl0ZS1vcmRlciBtYXJrPyBEZWZhdWx0cyB0byBmYWxzZQoJICogQHJldHVybiBQSFBFeGNlbF9Xcml0ZXJfQ1NWCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBzZXRVc2VCT00oJHBWYWx1ZSA9IGZhbHNlKSB7CgkJJHRoaXMtPl91c2VCT00gPSAkcFZhbHVlOwoJCXJldHVybiAkdGhpczsKCX0KCgkvKioKCSAqIEdldCBzaGVldCBpbmRleAoJICoKCSAqIEByZXR1cm4gaW50CgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRTaGVldEluZGV4KCkgewoJCXJldHVybiAkdGhpcy0+X3NoZWV0SW5kZXg7Cgl9CgoJLyoqCgkgKiBTZXQgc2hlZXQgaW5kZXgKCSAqCgkgKiBAcGFyYW0JaW50CQkkcFZhbHVlCQlTaGVldCBpbmRleAoJICogQHJldHVybiBQSFBFeGNlbF9Xcml0ZXJfQ1NWCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBzZXRTaGVldEluZGV4KCRwVmFsdWUgPSAwKSB7CgkJJHRoaXMtPl9zaGVldEluZGV4ID0gJHBWYWx1ZTsKCQlyZXR1cm4gJHRoaXM7Cgl9CgoJLyoqCgkgKiBXcml0ZSBsaW5lIHRvIENTViBmaWxlCgkgKgoJICogQHBhcmFtCW1peGVkCSRwRmlsZUhhbmRsZQlQSFAgZmlsZWhhbmRsZQoJICogQHBhcmFtCWFycmF5CSRwVmFsdWVzCQlBcnJheSBjb250YWluaW5nIHZhbHVlcyBpbiBhIHJvdwoJICogQHRocm93cwlFeGNlcHRpb24KCSAqLwoJcHJpdmF0ZSBmdW5jdGlvbiBfd3JpdGVMaW5lKCRwRmlsZUhhbmRsZSA9IG51bGwsICRwVmFsdWVzID0gbnVsbCkgewoJCWlmIChpc19hcnJheSgkcFZhbHVlcykpIHsKCQkJLy8gTm8gbGVhZGluZyBkZWxpbWl0ZXIKCQkJJHdyaXRlRGVsaW1pdGVyID0gZmFsc2U7CgoJCQkvLyBCdWlsZCB0aGUgbGluZQoJCQkkbGluZSA9ICcnOwoKCQkJZm9yZWFjaCAoJHBWYWx1ZXMgYXMgJGVsZW1lbnQpIHsKCQkJCS8vIEVzY2FwZSBlbmNsb3N1cmVzCgkJCQkkZWxlbWVudCA9IHN0cl9yZXBsYWNlKCR0aGlzLT5fZW5jbG9zdXJlLCAkdGhpcy0+X2VuY2xvc3VyZSAuICR0aGlzLT5fZW5jbG9zdXJlLCAkZWxlbWVudCk7CgoJCQkJLy8gQWRkIGRlbGltaXRlcgoJCQkJaWYgKCR3cml0ZURlbGltaXRlcikgewoJCQkJCSRsaW5lIC49ICR0aGlzLT5fZGVsaW1pdGVyOwoJCQkJfSBlbHNlIHsKCQkJCQkkd3JpdGVEZWxpbWl0ZXIgPSB0cnVlOwoJCQkJfQoKCQkJCS8vIEFkZCBlbmNsb3NlZCBzdHJpbmcKCQkJCSRsaW5lIC49ICR0aGlzLT5fZW5jbG9zdXJlIC4gJGVsZW1lbnQgLiAkdGhpcy0+X2VuY2xvc3VyZTsKCQkJfQoKCQkJLy8gQWRkIGxpbmUgZW5kaW5nCgkJCSRsaW5lIC49ICR0aGlzLT5fbGluZUVuZGluZzsKCgkJCS8vIFdyaXRlIHRvIGZpbGUKCQkJZndyaXRlKCRwRmlsZUhhbmRsZSwgJGxpbmUpOwoJCX0gZWxzZSB7CgkJCXRocm93IG5ldyBFeGNlcHRpb24oIkludmFsaWQgcGFyYW1ldGVycyBwYXNzZWQuIik7CgkJfQoJfQoKCS8qKgoJICogR2V0IFByZS1DYWxjdWxhdGUgRm9ybXVsYXMKCSAqCgkgKiBAcmV0dXJuIGJvb2xlYW4KCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldFByZUNhbGN1bGF0ZUZvcm11bGFzKCkgewoJCXJldHVybiAkdGhpcy0+X3ByZUNhbGN1bGF0ZUZvcm11bGFzOwoJfQoKCS8qKgoJICogU2V0IFByZS1DYWxjdWxhdGUgRm9ybXVsYXMKCSAqCgkgKiBAcGFyYW0gYm9vbGVhbiAkcFZhbHVlCVByZS1DYWxjdWxhdGUgRm9ybXVsYXM/CgkgKiBAcmV0dXJuIFBIUEV4Y2VsX1dyaXRlcl9DU1YKCSAqLwoJcHVibGljIGZ1bmN0aW9uIHNldFByZUNhbGN1bGF0ZUZvcm11bGFzKCRwVmFsdWUgPSB0cnVlKSB7CgkJJHRoaXMtPl9wcmVDYWxjdWxhdGVGb3JtdWxhcyA9ICRwVmFsdWU7CgkJcmV0dXJuICR0aGlzOwoJfQp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Writer/Excel5.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIFBIUEV4Y2VsCiAqCiAqIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICoKICogQGNhdGVnb3J5ICAgUEhQRXhjZWwKICogQHBhY2thZ2UgICAgUEhQRXhjZWxfV3JpdGVyX0V4Y2VsNQogKiBAY29weXJpZ2h0ICBDb3B5cmlnaHQgKGMpIDIwMDYgLSAyMDEyIFBIUEV4Y2VsIChodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9QSFBFeGNlbCkKICogQGxpY2Vuc2UJaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL29sZC1saWNlbnNlcy9sZ3BsLTIuMS50eHQJTEdQTAogKiBAdmVyc2lvbgkxLjcuNywgMjAxMi0wNS0xOQogKi8KCgovKioKICogUEhQRXhjZWxfV3JpdGVyX0V4Y2VsNQogKgogKiBAY2F0ZWdvcnkgICBQSFBFeGNlbAogKiBAcGFja2FnZSAgICBQSFBFeGNlbF9Xcml0ZXJfRXhjZWw1CiAqIEBjb3B5cmlnaHQgIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwgKGh0dHA6Ly93d3cuY29kZXBsZXguY29tL1BIUEV4Y2VsKQogKi8KY2xhc3MgUEhQRXhjZWxfV3JpdGVyX0V4Y2VsNSBpbXBsZW1lbnRzIFBIUEV4Y2VsX1dyaXRlcl9JV3JpdGVyCnsKCS8qKgoJICogUHJlLWNhbGN1bGF0ZSBmb3JtdWxhcwoJICoKCSAqIEB2YXIgYm9vbGVhbgoJICovCglwcml2YXRlICRfcHJlQ2FsY3VsYXRlRm9ybXVsYXMJPSB0cnVlOwoKCS8qKgoJICogUEhQRXhjZWwgb2JqZWN0CgkgKgoJICogQHZhciBQSFBFeGNlbAoJICovCglwcml2YXRlICRfcGhwRXhjZWw7CgoJLyoqCgkgKiBUb3RhbCBudW1iZXIgb2Ygc2hhcmVkIHN0cmluZ3MgaW4gd29ya2Jvb2sKCSAqCgkgKiBAdmFyIGludAoJICovCglwcml2YXRlICRfc3RyX3RvdGFsCQk9IDA7CgoJLyoqCgkgKiBOdW1iZXIgb2YgdW5pcXVlIHNoYXJlZCBzdHJpbmdzIGluIHdvcmtib29rCgkgKgoJICogQHZhciBpbnQKCSAqLwoJcHJpdmF0ZSAkX3N0cl91bmlxdWUJPSAwOwoKCS8qKgoJICogQXJyYXkgb2YgdW5pcXVlIHNoYXJlZCBzdHJpbmdzIGluIHdvcmtib29rCgkgKgoJICogQHZhciBhcnJheQoJICovCglwcml2YXRlICRfc3RyX3RhYmxlCQk9IGFycmF5KCk7CgoJLyoqCgkgKiBDb2xvciBjYWNoZS4gTWFwcGluZyBiZXR3ZWVuIFJHQiB2YWx1ZSBhbmQgY29sb3IgaW5kZXguCgkgKgoJICogQHZhciBhcnJheQoJICovCglwcml2YXRlICRfY29sb3JzOwoKCS8qKgoJICogRm9ybXVsYSBwYXJzZXIKCSAqCgkgKiBAdmFyIFBIUEV4Y2VsX1dyaXRlcl9FeGNlbDVfUGFyc2VyCgkgKi8KCXByaXZhdGUgJF9wYXJzZXI7CgoJLyoqCgkgKiBJZGVudGlmaWVyIGNsdXN0ZXJzIGZvciBkcmF3aW5ncy4gVXNlZCBpbiBNU09EUkFXSU5HR1JPVVAgcmVjb3JkLgoJICoKCSAqIEB2YXIgYXJyYXkKCSAqLwoJcHJpdmF0ZSAkX0lEQ0xzOwoKCS8qKgoJICogQmFzaWMgT0xFIG9iamVjdCBzdW1tYXJ5IGluZm9ybWF0aW9uCgkgKgoJICogQHZhciBhcnJheQoJICovCglwcml2YXRlICRfc3VtbWFyeUluZm9ybWF0aW9uOwoKCS8qKgoJICogRXh0ZW5kZWQgT0xFIG9iamVjdCBkb2N1bWVudCBzdW1tYXJ5IGluZm9ybWF0aW9uCgkgKgoJICogQHZhciBhcnJheQoJICovCglwcml2YXRlICRfZG9jdW1lbnRTdW1tYXJ5SW5mb3JtYXRpb247CgoJLyoqCgkgKiBDcmVhdGUgYSBuZXcgUEhQRXhjZWxfV3JpdGVyX0V4Y2VsNQoJICoKCSAqIEBwYXJhbQlQSFBFeGNlbAkkcGhwRXhjZWwJUEhQRXhjZWwgb2JqZWN0CgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChQSFBFeGNlbCAkcGhwRXhjZWwpIHsKCQkkdGhpcy0+X3BocEV4Y2VsCT0gJHBocEV4Y2VsOwoKCQkkdGhpcy0+X3BhcnNlcgkJPSBuZXcgUEhQRXhjZWxfV3JpdGVyX0V4Y2VsNV9QYXJzZXIoKTsKCX0KCgkvKioKCSAqIFNhdmUgUEhQRXhjZWwgdG8gZmlsZQoJICoKCSAqIEBwYXJhbQlzdHJpbmcJCSRwRmlsZW5hbWUKCSAqIEB0aHJvd3MJRXhjZXB0aW9uCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBzYXZlKCRwRmlsZW5hbWUgPSBudWxsKSB7CgoJCS8vIGdhcmJhZ2UgY29sbGVjdAoJCSR0aGlzLT5fcGhwRXhjZWwtPmdhcmJhZ2VDb2xsZWN0KCk7CgoJCSRzYXZlRGVidWdMb2cgPSBQSFBFeGNlbF9DYWxjdWxhdGlvbjo6Z2V0SW5zdGFuY2UoKS0+d3JpdGVEZWJ1Z0xvZzsKCQlQSFBFeGNlbF9DYWxjdWxhdGlvbjo6Z2V0SW5zdGFuY2UoKS0+d3JpdGVEZWJ1Z0xvZyA9IGZhbHNlOwoJCSRzYXZlRGF0ZVJldHVyblR5cGUgPSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmdldFJldHVybkRhdGVUeXBlKCk7CgkJUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpzZXRSZXR1cm5EYXRlVHlwZShQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OlJFVFVSTkRBVEVfRVhDRUwpOwoKCQkvLyBpbml0aWFsaXplIGNvbG9ycyBhcnJheQoJCSR0aGlzLT5fY29sb3JzICAgICAgICAgID0gYXJyYXkoKTsKCgkJLy8gSW5pdGlhbGlzZSB3b3JrYm9vayB3cml0ZXIKCQkkdGhpcy0+X3dyaXRlcldvcmtib29rID0gbmV3IFBIUEV4Y2VsX1dyaXRlcl9FeGNlbDVfV29ya2Jvb2soJHRoaXMtPl9waHBFeGNlbCwKCQkJCQkJCQkJCQkJCQkJCQkgJHRoaXMtPl9zdHJfdG90YWwsICR0aGlzLT5fc3RyX3VuaXF1ZSwgJHRoaXMtPl9zdHJfdGFibGUsCgkJCQkJCQkJCQkJCQkJCQkJICR0aGlzLT5fY29sb3JzLCAkdGhpcy0+X3BhcnNlcik7CgoJCS8vIEluaXRpYWxpc2Ugd29ya3NoZWV0IHdyaXRlcnMKCQkkY291bnRTaGVldHMgPSAkdGhpcy0+X3BocEV4Y2VsLT5nZXRTaGVldENvdW50KCk7CgkJZm9yICgkaSA9IDA7ICRpIDwgJGNvdW50U2hlZXRzOyArKyRpKSB7CgkJCSR0aGlzLT5fd3JpdGVyV29ya3NoZWV0c1skaV0gPSBuZXcgUEhQRXhjZWxfV3JpdGVyX0V4Y2VsNV9Xb3Jrc2hlZXQoJHRoaXMtPl9zdHJfdG90YWwsICR0aGlzLT5fc3RyX3VuaXF1ZSwKCQkJCQkJCQkJCQkJCQkJCQkJCSAgICR0aGlzLT5fc3RyX3RhYmxlLCAkdGhpcy0+X2NvbG9ycywKCQkJCQkJCQkJCQkJCQkJCQkJCSAgICR0aGlzLT5fcGFyc2VyLAoJCQkJCQkJCQkJCQkJCQkJCQkJICAgJHRoaXMtPl9wcmVDYWxjdWxhdGVGb3JtdWxhcywKCQkJCQkJCQkJCQkJCQkJCQkJCSAgICR0aGlzLT5fcGhwRXhjZWwtPmdldFNoZWV0KCRpKSk7CgkJfQoKCQkvLyBidWlsZCBFc2NoZXIgb2JqZWN0cy4gRXNjaGVyIG9iamVjdHMgZm9yIHdvcmtib29rcyBuZWVkcyB0byBiZSBidWlsZCBiZWZvcmUgRXNjaGVyIG9iamVjdCBmb3Igd29ya2Jvb2suCgkJJHRoaXMtPl9idWlsZFdvcmtzaGVldEVzY2hlcnMoKTsKCQkkdGhpcy0+X2J1aWxkV29ya2Jvb2tFc2NoZXIoKTsKCgkJLy8gYWRkIDE1IGlkZW50aWNhbCBjZWxsIHN0eWxlIFhmcwoJCS8vIGZvciBub3csIHdlIHVzZSB0aGUgZmlyc3QgY2VsbFhmIGluc3RlYWQgb2YgY2VsbFN0eWxlWGYKCQkkY2VsbFhmQ29sbGVjdGlvbiA9ICR0aGlzLT5fcGhwRXhjZWwtPmdldENlbGxYZkNvbGxlY3Rpb24oKTsKCQlmb3IgKCRpID0gMDsgJGkgPCAxNTsgKyskaSkgewoJCQkkdGhpcy0+X3dyaXRlcldvcmtib29rLT5hZGRYZldyaXRlcigkY2VsbFhmQ29sbGVjdGlvblswXSwgdHJ1ZSk7CgkJfQoKCQkvLyBhZGQgYWxsIHRoZSBjZWxsIFhmcwoJCWZvcmVhY2ggKCR0aGlzLT5fcGhwRXhjZWwtPmdldENlbGxYZkNvbGxlY3Rpb24oKSBhcyAkc3R5bGUpIHsKCQkJJHRoaXMtPl93cml0ZXJXb3JrYm9vay0+YWRkWGZXcml0ZXIoJHN0eWxlLCBmYWxzZSk7CgkJfQoKCQkvLyBhZGQgZm9udHMgZnJvbSByaWNoIHRleHQgZWxlZW1udHMKCQlmb3IgKCRpID0gMDsgJGkgPCAkY291bnRTaGVldHM7ICsrJGkpIHsKCQkJZm9yZWFjaCAoJHRoaXMtPl93cml0ZXJXb3Jrc2hlZXRzWyRpXS0+X3BocFNoZWV0LT5nZXRDZWxsQ29sbGVjdGlvbigpIGFzICRjZWxsSUQpIHsKCQkJCSRjZWxsID0gJHRoaXMtPl93cml0ZXJXb3Jrc2hlZXRzWyRpXS0+X3BocFNoZWV0LT5nZXRDZWxsKCRjZWxsSUQpOwoJCQkJJGNWYWwgPSAkY2VsbC0+Z2V0VmFsdWUoKTsKCQkJCWlmICgkY1ZhbCBpbnN0YW5jZW9mIFBIUEV4Y2VsX1JpY2hUZXh0KSB7CgkJCQkJJGVsZW1lbnRzID0gJGNWYWwtPmdldFJpY2hUZXh0RWxlbWVudHMoKTsKCQkJCQlmb3JlYWNoICgkZWxlbWVudHMgYXMgJGVsZW1lbnQpIHsKCQkJCQkJaWYgKCRlbGVtZW50IGluc3RhbmNlb2YgUEhQRXhjZWxfUmljaFRleHRfUnVuKSB7CgkJCQkJCQkkZm9udCA9ICRlbGVtZW50LT5nZXRGb250KCk7CgkJCQkJCQkkdGhpcy0+X3dyaXRlcldvcmtzaGVldHNbJGldLT5fZm50SGFzaEluZGV4WyRmb250LT5nZXRIYXNoQ29kZSgpXSA9ICR0aGlzLT5fd3JpdGVyV29ya2Jvb2stPl9hZGRGb250KCRmb250KTsKCQkJCQkJfQoJCQkJCX0KCQkJCX0KCQkJfQoJCX0KCgkJLy8gaW5pdGlhbGl6ZSBPTEUgZmlsZQoJCSR3b3JrYm9va1N0cmVhbU5hbWUgPSAnV29ya2Jvb2snOwoJCSRPTEUgPSBuZXcgUEhQRXhjZWxfU2hhcmVkX09MRV9QUFNfRmlsZShQSFBFeGNlbF9TaGFyZWRfT0xFOjpBc2MyVWNzKCR3b3JrYm9va1N0cmVhbU5hbWUpKTsKCgkJLy8gV3JpdGUgdGhlIHdvcmtzaGVldCBzdHJlYW1zIGJlZm9yZSB0aGUgZ2xvYmFsIHdvcmtib29rIHN0cmVhbSwKCQkvLyBiZWNhdXNlIHRoZSBieXRlIHNpemVzIG9mIHRoZXNlIGFyZSBuZWVkZWQgaW4gdGhlIGdsb2JhbCB3b3JrYm9vayBzdHJlYW0KCQkkd29ya3NoZWV0U2l6ZXMgPSBhcnJheSgpOwoJCWZvciAoJGkgPSAwOyAkaSA8ICRjb3VudFNoZWV0czsgKyskaSkgewoJCQkkdGhpcy0+X3dyaXRlcldvcmtzaGVldHNbJGldLT5jbG9zZSgpOwoJCQkkd29ya3NoZWV0U2l6ZXNbXSA9ICR0aGlzLT5fd3JpdGVyV29ya3NoZWV0c1skaV0tPl9kYXRhc2l6ZTsKCQl9CgoJCS8vIGFkZCBiaW5hcnkgZGF0YSBmb3IgZ2xvYmFsIHdvcmtib29rIHN0cmVhbQoJCSRPTEUtPmFwcGVuZCggJHRoaXMtPl93cml0ZXJXb3JrYm9vay0+d3JpdGVXb3JrYm9vaygkd29ya3NoZWV0U2l6ZXMpICk7CgoJCS8vIGFkZCBiaW5hcnkgZGF0YSBmb3Igc2hlZXQgc3RyZWFtcwoJCWZvciAoJGkgPSAwOyAkaSA8ICRjb3VudFNoZWV0czsgKyskaSkgewoJCQkkT0xFLT5hcHBlbmQoJHRoaXMtPl93cml0ZXJXb3Jrc2hlZXRzWyRpXS0+Z2V0RGF0YSgpKTsKCQl9CgoJCSR0aGlzLT5fZG9jdW1lbnRTdW1tYXJ5SW5mb3JtYXRpb24gPSAkdGhpcy0+X3dyaXRlRG9jdW1lbnRTdW1tYXJ5SW5mb3JtYXRpb24oKTsKCQkvLyBpbml0aWFsaXplIE9MRSBEb2N1bWVudCBTdW1tYXJ5IEluZm9ybWF0aW9uCgkJaWYoaXNzZXQoJHRoaXMtPl9kb2N1bWVudFN1bW1hcnlJbmZvcm1hdGlvbikgJiYgIWVtcHR5KCR0aGlzLT5fZG9jdW1lbnRTdW1tYXJ5SW5mb3JtYXRpb24pKXsKCQkJJE9MRV9Eb2N1bWVudFN1bW1hcnlJbmZvcm1hdGlvbiA9IG5ldyBQSFBFeGNlbF9TaGFyZWRfT0xFX1BQU19GaWxlKFBIUEV4Y2VsX1NoYXJlZF9PTEU6OkFzYzJVY3MoY2hyKDUpIC4gJ0RvY3VtZW50U3VtbWFyeUluZm9ybWF0aW9uJykpOwoJCQkkT0xFX0RvY3VtZW50U3VtbWFyeUluZm9ybWF0aW9uLT5hcHBlbmQoJHRoaXMtPl9kb2N1bWVudFN1bW1hcnlJbmZvcm1hdGlvbik7CgkJfQoKCQkkdGhpcy0+X3N1bW1hcnlJbmZvcm1hdGlvbiA9ICR0aGlzLT5fd3JpdGVTdW1tYXJ5SW5mb3JtYXRpb24oKTsKCQkvLyBpbml0aWFsaXplIE9MRSBTdW1tYXJ5IEluZm9ybWF0aW9uCgkJaWYoaXNzZXQoJHRoaXMtPl9zdW1tYXJ5SW5mb3JtYXRpb24pICYmICFlbXB0eSgkdGhpcy0+X3N1bW1hcnlJbmZvcm1hdGlvbikpewoJCSAgJE9MRV9TdW1tYXJ5SW5mb3JtYXRpb24gPSBuZXcgUEhQRXhjZWxfU2hhcmVkX09MRV9QUFNfRmlsZShQSFBFeGNlbF9TaGFyZWRfT0xFOjpBc2MyVWNzKGNocig1KSAuICdTdW1tYXJ5SW5mb3JtYXRpb24nKSk7CgkJICAkT0xFX1N1bW1hcnlJbmZvcm1hdGlvbi0+YXBwZW5kKCR0aGlzLT5fc3VtbWFyeUluZm9ybWF0aW9uKTsKCQl9CgoJCS8vIGRlZmluZSBPTEUgUGFydHMKCQkkYXJyUm9vdERhdGEgPSBhcnJheSgkT0xFKTsKCQkvLyBpbml0aWFsaXplIE9MRSBQcm9wZXJ0aWVzIGZpbGUKCQlpZihpc3NldCgkT0xFX1N1bW1hcnlJbmZvcm1hdGlvbikpewoJCQkkYXJyUm9vdERhdGFbXSA9ICRPTEVfU3VtbWFyeUluZm9ybWF0aW9uOwoJCX0KCQkvLyBpbml0aWFsaXplIE9MRSBFeHRlbmRlZCBQcm9wZXJ0aWVzIGZpbGUKCQlpZihpc3NldCgkT0xFX0RvY3VtZW50U3VtbWFyeUluZm9ybWF0aW9uKSl7CgkJCSRhcnJSb290RGF0YVtdID0gJE9MRV9Eb2N1bWVudFN1bW1hcnlJbmZvcm1hdGlvbjsKCQl9CgoJCSRyb290ID0gbmV3IFBIUEV4Y2VsX1NoYXJlZF9PTEVfUFBTX1Jvb3QodGltZSgpLCB0aW1lKCksICRhcnJSb290RGF0YSk7CgkJLy8gc2F2ZSB0aGUgT0xFIGZpbGUKCQkkcmVzID0gJHJvb3QtPnNhdmUoJHBGaWxlbmFtZSk7CgoJCVBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6c2V0UmV0dXJuRGF0ZVR5cGUoJHNhdmVEYXRlUmV0dXJuVHlwZSk7CgkJUEhQRXhjZWxfQ2FsY3VsYXRpb246OmdldEluc3RhbmNlKCktPndyaXRlRGVidWdMb2cgPSAkc2F2ZURlYnVnTG9nOwoJfQoKCS8qKgoJICogU2V0IHRlbXBvcmFyeSBzdG9yYWdlIGRpcmVjdG9yeQoJICoKCSAqIEBkZXByZWNhdGVkCgkgKiBAcGFyYW0Jc3RyaW5nCSRwVmFsdWUJCVRlbXBvcmFyeSBzdG9yYWdlIGRpcmVjdG9yeQoJICogQHRocm93cwlFeGNlcHRpb24JRXhjZXB0aW9uIHdoZW4gZGlyZWN0b3J5IGRvZXMgbm90IGV4aXN0CgkgKiBAcmV0dXJuIFBIUEV4Y2VsX1dyaXRlcl9FeGNlbDUKCSAqLwoJcHVibGljIGZ1bmN0aW9uIHNldFRlbXBEaXIoJHBWYWx1ZSA9ICcnKSB7CgkJcmV0dXJuICR0aGlzOwoJfQoKCS8qKgoJICogR2V0IFByZS1DYWxjdWxhdGUgRm9ybXVsYXMKCSAqCgkgKiBAcmV0dXJuIGJvb2xlYW4KCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldFByZUNhbGN1bGF0ZUZvcm11bGFzKCkgewoJCXJldHVybiAkdGhpcy0+X3ByZUNhbGN1bGF0ZUZvcm11bGFzOwoJfQoKCS8qKgoJICogU2V0IFByZS1DYWxjdWxhdGUgRm9ybXVsYXMKCSAqCgkgKiBAcGFyYW0gYm9vbGVhbiAkcFZhbHVlCVByZS1DYWxjdWxhdGUgRm9ybXVsYXM/CgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBzZXRQcmVDYWxjdWxhdGVGb3JtdWxhcygkcFZhbHVlID0gdHJ1ZSkgewoJCSR0aGlzLT5fcHJlQ2FsY3VsYXRlRm9ybXVsYXMgPSAkcFZhbHVlOwoJfQoKCS8qKgoJICogQnVpbGQgdGhlIFdvcmtzaGVldCBFc2NoZXIgb2JqZWN0cwoJICoKCSAqLwoJcHJpdmF0ZSBmdW5jdGlvbiBfYnVpbGRXb3Jrc2hlZXRFc2NoZXJzKCkKCXsKCQkvLyAxLWJhc2VkIGluZGV4IHRvIEJzdG9yZUNvbnRhaW5lcgoJCSRibGlwSW5kZXggPSAwOwoKCQlmb3JlYWNoICgkdGhpcy0+X3BocEV4Y2VsLT5nZXRBbGxzaGVldHMoKSBhcyAkc2hlZXQpIHsKCQkJLy8gc2hlZXQgaW5kZXgKCQkJJHNoZWV0SW5kZXggPSAkc2hlZXQtPmdldFBhcmVudCgpLT5nZXRJbmRleCgkc2hlZXQpOwoKCQkJJGVzY2hlciA9IG51bGw7CgoJCQkvLyBjaGVjayBpZiB0aGVyZSBhcmUgYW55IHNoYXBlcyBmb3IgdGhpcyBzaGVldAoJCQlpZiAoY291bnQoJHNoZWV0LT5nZXREcmF3aW5nQ29sbGVjdGlvbigpKSA9PSAwKSB7CgkJCQljb250aW51ZTsKCQkJfQoKCQkJLy8gY3JlYXRlIGludGVybWVkaWF0ZSBFc2NoZXIgb2JqZWN0CgkJCSRlc2NoZXIgPSBuZXcgUEhQRXhjZWxfU2hhcmVkX0VzY2hlcigpOwoKCQkJLy8gZGdDb250YWluZXIKCQkJJGRnQ29udGFpbmVyID0gbmV3IFBIUEV4Y2VsX1NoYXJlZF9Fc2NoZXJfRGdDb250YWluZXIoKTsKCgkJCS8vIHNldCB0aGUgZHJhd2luZyBpbmRleCAod2UgdXNlIHNoZWV0IGluZGV4ICsgMSkKCQkJJGRnSWQgPSAkc2hlZXQtPmdldFBhcmVudCgpLT5nZXRJbmRleCgkc2hlZXQpICsgMTsKCQkJJGRnQ29udGFpbmVyLT5zZXREZ0lkKCRkZ0lkKTsKCQkJJGVzY2hlci0+c2V0RGdDb250YWluZXIoJGRnQ29udGFpbmVyKTsKCgkJCS8vIHNwZ3JDb250YWluZXIKCQkJJHNwZ3JDb250YWluZXIgPSBuZXcgUEhQRXhjZWxfU2hhcmVkX0VzY2hlcl9EZ0NvbnRhaW5lcl9TcGdyQ29udGFpbmVyKCk7CgkJCSRkZ0NvbnRhaW5lci0+c2V0U3BnckNvbnRhaW5lcigkc3BnckNvbnRhaW5lcik7CgoJCQkvLyBhZGQgb25lIHNoYXBlIHdoaWNoIGlzIHRoZSBncm91cCBzaGFwZQoJCQkkc3BDb250YWluZXIgPSBuZXcgUEhQRXhjZWxfU2hhcmVkX0VzY2hlcl9EZ0NvbnRhaW5lcl9TcGdyQ29udGFpbmVyX1NwQ29udGFpbmVyKCk7CgkJCSRzcENvbnRhaW5lci0+c2V0U3Bncih0cnVlKTsKCQkJJHNwQ29udGFpbmVyLT5zZXRTcFR5cGUoMCk7CgkJCSRzcENvbnRhaW5lci0+c2V0U3BJZCgoJHNoZWV0LT5nZXRQYXJlbnQoKS0+Z2V0SW5kZXgoJHNoZWV0KSArIDEpIDw8IDEwKTsKCQkJJHNwZ3JDb250YWluZXItPmFkZENoaWxkKCRzcENvbnRhaW5lcik7CgoJCQkvLyBhZGQgdGhlIHNoYXBlcwoKCQkJJGNvdW50U2hhcGVzWyRzaGVldEluZGV4XSA9IDA7IC8vIGNvdW50IG51bWJlciBvZiBzaGFwZXMgKG1pbnVzIGdyb3VwIHNoYXBlKSwgaW4gc2hlZXQKCgkJCWZvcmVhY2ggKCRzaGVldC0+Z2V0RHJhd2luZ0NvbGxlY3Rpb24oKSBhcyAkZHJhd2luZykgewoJCQkJKyskYmxpcEluZGV4OwoKCQkJCSsrJGNvdW50U2hhcGVzWyRzaGVldEluZGV4XTsKCgkJCQkvLyBhZGQgdGhlIHNoYXBlCgkJCQkkc3BDb250YWluZXIgPSBuZXcgUEhQRXhjZWxfU2hhcmVkX0VzY2hlcl9EZ0NvbnRhaW5lcl9TcGdyQ29udGFpbmVyX1NwQ29udGFpbmVyKCk7CgoJCQkJLy8gc2V0IHRoZSBzaGFwZSB0eXBlCgkJCQkkc3BDb250YWluZXItPnNldFNwVHlwZSgweDAwNEIpOwoKCQkJCS8vIHNldCB0aGUgc2hhcGUgaW5kZXggKHdlIGNvbWJpbmUgMS1iYXNlZCBzaGVldCBpbmRleCBhbmQgJGNvdW50U2hhcGVzIHRvIGNyZWF0ZSB1bmlxdWUgc2hhcGUgaW5kZXgpCgkJCQkkcmVkdWNlZFNwSWQgPSAkY291bnRTaGFwZXNbJHNoZWV0SW5kZXhdOwoJCQkJJHNwSWQgPSAkcmVkdWNlZFNwSWQKCQkJCQl8ICgkc2hlZXQtPmdldFBhcmVudCgpLT5nZXRJbmRleCgkc2hlZXQpICsgMSkgPDwgMTA7CgkJCQkkc3BDb250YWluZXItPnNldFNwSWQoJHNwSWQpOwoKCQkJCS8vIGtlZXAgdHJhY2sgb2YgbGFzdCByZWR1Y2VkU3BJZAoJCQkJJGxhc3RSZWR1Y2VkU3BJZCA9ICRyZWR1Y2VkU3BJZDsKCgkJCQkvLyBrZWVwIHRyYWNrIG9mIGxhc3Qgc3BJZAoJCQkJJGxhc3RTcElkID0gJHNwSWQ7CgoJCQkJLy8gc2V0IHRoZSBCTElQIGluZGV4CgkJCQkkc3BDb250YWluZXItPnNldE9QVCgweDQxMDQsICRibGlwSW5kZXgpOwoKCQkJCS8vIHNldCBjb29yZGluYXRlcyBhbmQgb2Zmc2V0cywgY2xpZW50IGFuY2hvcgoJCQkJJGNvb3JkaW5hdGVzID0gJGRyYXdpbmctPmdldENvb3JkaW5hdGVzKCk7CgkJCQkkb2Zmc2V0WCA9ICRkcmF3aW5nLT5nZXRPZmZzZXRYKCk7CgkJCQkkb2Zmc2V0WSA9ICRkcmF3aW5nLT5nZXRPZmZzZXRZKCk7CgkJCQkkd2lkdGggPSAkZHJhd2luZy0+Z2V0V2lkdGgoKTsKCQkJCSRoZWlnaHQgPSAkZHJhd2luZy0+Z2V0SGVpZ2h0KCk7CgoJCQkJJHR3b0FuY2hvciA9IFBIUEV4Y2VsX1NoYXJlZF9FeGNlbDU6Om9uZUFuY2hvcjJ0d29BbmNob3IoJHNoZWV0LCAkY29vcmRpbmF0ZXMsICRvZmZzZXRYLCAkb2Zmc2V0WSwgJHdpZHRoLCAkaGVpZ2h0KTsKCgkJCQkkc3BDb250YWluZXItPnNldFN0YXJ0Q29vcmRpbmF0ZXMoJHR3b0FuY2hvclsnc3RhcnRDb29yZGluYXRlcyddKTsKCQkJCSRzcENvbnRhaW5lci0+c2V0U3RhcnRPZmZzZXRYKCR0d29BbmNob3JbJ3N0YXJ0T2Zmc2V0WCddKTsKCQkJCSRzcENvbnRhaW5lci0+c2V0U3RhcnRPZmZzZXRZKCR0d29BbmNob3JbJ3N0YXJ0T2Zmc2V0WSddKTsKCQkJCSRzcENvbnRhaW5lci0+c2V0RW5kQ29vcmRpbmF0ZXMoJHR3b0FuY2hvclsnZW5kQ29vcmRpbmF0ZXMnXSk7CgkJCQkkc3BDb250YWluZXItPnNldEVuZE9mZnNldFgoJHR3b0FuY2hvclsnZW5kT2Zmc2V0WCddKTsKCQkJCSRzcENvbnRhaW5lci0+c2V0RW5kT2Zmc2V0WSgkdHdvQW5jaG9yWydlbmRPZmZzZXRZJ10pOwoKCQkJCSRzcGdyQ29udGFpbmVyLT5hZGRDaGlsZCgkc3BDb250YWluZXIpOwoJCQl9CgoJCQkvLyBpZGVudGlmaWVyIGNsdXN0ZXJzLCB1c2VkIGZvciB3b3JrYm9vayBFc2NoZXIgb2JqZWN0CgkJCSR0aGlzLT5fSURDTHNbJGRnSWRdID0gJGxhc3RSZWR1Y2VkU3BJZDsKCgkJCS8vIHNldCBsYXN0IHNoYXBlIGluZGV4CgkJCSRkZ0NvbnRhaW5lci0+c2V0TGFzdFNwSWQoJGxhc3RTcElkKTsKCgkJCS8vIHNldCB0aGUgRXNjaGVyIG9iamVjdAoJCQkkdGhpcy0+X3dyaXRlcldvcmtzaGVldHNbJHNoZWV0SW5kZXhdLT5zZXRFc2NoZXIoJGVzY2hlcik7CgkJfQoJfQoKCS8qKgoJICogQnVpbGQgdGhlIEVzY2hlciBvYmplY3QgY29ycmVzcG9uZGluZyB0byB0aGUgTVNPRFJBV0lOR0dST1VQIHJlY29yZAoJICovCglwcml2YXRlIGZ1bmN0aW9uIF9idWlsZFdvcmtib29rRXNjaGVyKCkKCXsKCQkkZXNjaGVyID0gbnVsbDsKCgkJLy8gYW55IGRyYXdpbmdzIGluIHRoaXMgd29ya2Jvb2s/CgkJJGZvdW5kID0gZmFsc2U7CgkJZm9yZWFjaCAoJHRoaXMtPl9waHBFeGNlbC0+Z2V0QWxsU2hlZXRzKCkgYXMgJHNoZWV0KSB7CgkJCWlmIChjb3VudCgkc2hlZXQtPmdldERyYXdpbmdDb2xsZWN0aW9uKCkpID4gMCkgewoJCQkJJGZvdW5kID0gdHJ1ZTsKCQkJCWJyZWFrOwoJCQl9CgkJfQoKCQkvLyBub3RoaW5nIHRvIGRvIGlmIHRoZXJlIGFyZSBubyBkcmF3aW5ncwoJCWlmICghJGZvdW5kKSB7CgkJCXJldHVybjsKCQl9CgoJCS8vIGlmIHdlIHJlYWNoIGhlcmUsIHRoZW4gdGhlcmUgYXJlIGRyYXdpbmdzIGluIHRoZSB3b3JrYm9vawoJCSRlc2NoZXIgPSBuZXcgUEhQRXhjZWxfU2hhcmVkX0VzY2hlcigpOwoKCQkvLyBkZ2dDb250YWluZXIKCQkkZGdnQ29udGFpbmVyID0gbmV3IFBIUEV4Y2VsX1NoYXJlZF9Fc2NoZXJfRGdnQ29udGFpbmVyKCk7CgkJJGVzY2hlci0+c2V0RGdnQ29udGFpbmVyKCRkZ2dDb250YWluZXIpOwoKCQkvLyBzZXQgSURDTHMgKGlkZW50aWZpZXIgY2x1c3RlcnMpCgkJJGRnZ0NvbnRhaW5lci0+c2V0SURDTHMoJHRoaXMtPl9JRENMcyk7CgoJCS8vIHRoaXMgbG9vcCBpcyBmb3IgZGV0ZXJtaW5pbmcgbWF4aW11bSBzaGFwZSBpZGVudGlmaWVyIG9mIGFsbCBkcmF3aW5nCgkJJHNwSWRNYXggPSAwOwoJCSR0b3RhbENvdW50U2hhcGVzID0gMDsKCQkkY291bnREcmF3aW5ncyA9IDA7CgoJCWZvcmVhY2ggKCR0aGlzLT5fcGhwRXhjZWwtPmdldEFsbHNoZWV0cygpIGFzICRzaGVldCkgewoJCQkkc2hlZXRDb3VudFNoYXBlcyA9IDA7IC8vIGNvdW50IG51bWJlciBvZiBzaGFwZXMgKG1pbnVzIGdyb3VwIHNoYXBlKSwgaW4gc2hlZXQKCgkJCWlmIChjb3VudCgkc2hlZXQtPmdldERyYXdpbmdDb2xsZWN0aW9uKCkpID4gMCkgewoJCQkJKyskY291bnREcmF3aW5nczsKCgkJCQlmb3JlYWNoICgkc2hlZXQtPmdldERyYXdpbmdDb2xsZWN0aW9uKCkgYXMgJGRyYXdpbmcpIHsKCQkJCQkrKyRzaGVldENvdW50U2hhcGVzOwoJCQkJCSsrJHRvdGFsQ291bnRTaGFwZXM7CgoJCQkJCSRzcElkID0gJHNoZWV0Q291bnRTaGFwZXMKCQkJCQkJfCAoJHRoaXMtPl9waHBFeGNlbC0+Z2V0SW5kZXgoJHNoZWV0KSArIDEpIDw8IDEwOwoJCQkJCSRzcElkTWF4ID0gbWF4KCRzcElkLCAkc3BJZE1heCk7CgkJCQl9CgkJCX0KCQl9CgoJCSRkZ2dDb250YWluZXItPnNldFNwSWRNYXgoJHNwSWRNYXggKyAxKTsKCQkkZGdnQ29udGFpbmVyLT5zZXRDRGdTYXZlZCgkY291bnREcmF3aW5ncyk7CgkJJGRnZ0NvbnRhaW5lci0+c2V0Q1NwU2F2ZWQoJHRvdGFsQ291bnRTaGFwZXMgKyAkY291bnREcmF3aW5ncyk7IC8vIHRvdGFsIG51bWJlciBvZiBzaGFwZXMgaW5jbC4gb25lIGdyb3VwIHNoYXBlcyBwZXIgZHJhd2luZwoKCQkvLyBic3RvcmVDb250YWluZXIKCQkkYnN0b3JlQ29udGFpbmVyID0gbmV3IFBIUEV4Y2VsX1NoYXJlZF9Fc2NoZXJfRGdnQ29udGFpbmVyX0JzdG9yZUNvbnRhaW5lcigpOwoJCSRkZ2dDb250YWluZXItPnNldEJzdG9yZUNvbnRhaW5lcigkYnN0b3JlQ29udGFpbmVyKTsKCgkJLy8gdGhlIEJTRSdzIChhbGwgdGhlIGltYWdlcykKCQlmb3JlYWNoICgkdGhpcy0+X3BocEV4Y2VsLT5nZXRBbGxzaGVldHMoKSBhcyAkc2hlZXQpIHsKCQkJZm9yZWFjaCAoJHNoZWV0LT5nZXREcmF3aW5nQ29sbGVjdGlvbigpIGFzICRkcmF3aW5nKSB7CgkJCQlpZiAoJGRyYXdpbmcgaW5zdGFuY2VvZiBQSFBFeGNlbF9Xb3Jrc2hlZXRfRHJhd2luZykgewoKCQkJCQkkZmlsZW5hbWUgPSAkZHJhd2luZy0+Z2V0UGF0aCgpOwoKCQkJCQlsaXN0KCRpbWFnZXN4LCAkaW1hZ2VzeSwgJGltYWdlRm9ybWF0KSA9IGdldGltYWdlc2l6ZSgkZmlsZW5hbWUpOwoKCQkJCQlzd2l0Y2ggKCRpbWFnZUZvcm1hdCkgewoKCQkJCQljYXNlIDE6IC8vIEdJRiwgbm90IHN1cHBvcnRlZCBieSBCSUZGOCwgd2UgY29udmVydCB0byBQTkcKCQkJCQkJJGJsaXBUeXBlID0gUEhQRXhjZWxfU2hhcmVkX0VzY2hlcl9EZ2dDb250YWluZXJfQnN0b3JlQ29udGFpbmVyX0JTRTo6QkxJUFRZUEVfUE5HOwoJCQkJCQlvYl9zdGFydCgpOwoJCQkJCQlpbWFnZXBuZyhpbWFnZWNyZWF0ZWZyb21naWYoJGZpbGVuYW1lKSk7CgkJCQkJCSRibGlwRGF0YSA9IG9iX2dldF9jb250ZW50cygpOwoJCQkJCQlvYl9lbmRfY2xlYW4oKTsKCQkJCQkJYnJlYWs7CgoJCQkJCWNhc2UgMjogLy8gSlBFRwoJCQkJCQkkYmxpcFR5cGUgPSBQSFBFeGNlbF9TaGFyZWRfRXNjaGVyX0RnZ0NvbnRhaW5lcl9Cc3RvcmVDb250YWluZXJfQlNFOjpCTElQVFlQRV9KUEVHOwoJCQkJCQkkYmxpcERhdGEgPSBmaWxlX2dldF9jb250ZW50cygkZmlsZW5hbWUpOwoJCQkJCQlicmVhazsKCgkJCQkJY2FzZSAzOiAvLyBQTkcKCQkJCQkJJGJsaXBUeXBlID0gUEhQRXhjZWxfU2hhcmVkX0VzY2hlcl9EZ2dDb250YWluZXJfQnN0b3JlQ29udGFpbmVyX0JTRTo6QkxJUFRZUEVfUE5HOwoJCQkJCQkkYmxpcERhdGEgPSBmaWxlX2dldF9jb250ZW50cygkZmlsZW5hbWUpOwoJCQkJCQlicmVhazsKCgkJCQkJY2FzZSA2OiAvLyBXaW5kb3dzIERJQiAoQk1QKSwgd2UgY29udmVydCB0byBQTkcKCQkJCQkJJGJsaXBUeXBlID0gUEhQRXhjZWxfU2hhcmVkX0VzY2hlcl9EZ2dDb250YWluZXJfQnN0b3JlQ29udGFpbmVyX0JTRTo6QkxJUFRZUEVfUE5HOwoJCQkJCQlvYl9zdGFydCgpOwoJCQkJCQlpbWFnZXBuZyhQSFBFeGNlbF9TaGFyZWRfRHJhd2luZzo6aW1hZ2VjcmVhdGVmcm9tYm1wKCRmaWxlbmFtZSkpOwoJCQkJCQkkYmxpcERhdGEgPSBvYl9nZXRfY29udGVudHMoKTsKCQkJCQkJb2JfZW5kX2NsZWFuKCk7CgkJCQkJCWJyZWFrOwoKCQkJCQlkZWZhdWx0OiBjb250aW51ZSAyOwoKCQkJCQl9CgoJCQkJCSRibGlwID0gbmV3IFBIUEV4Y2VsX1NoYXJlZF9Fc2NoZXJfRGdnQ29udGFpbmVyX0JzdG9yZUNvbnRhaW5lcl9CU0VfQmxpcCgpOwoJCQkJCSRibGlwLT5zZXREYXRhKCRibGlwRGF0YSk7CgoJCQkJCSRCU0UgPSBuZXcgUEhQRXhjZWxfU2hhcmVkX0VzY2hlcl9EZ2dDb250YWluZXJfQnN0b3JlQ29udGFpbmVyX0JTRSgpOwoJCQkJCSRCU0UtPnNldEJsaXBUeXBlKCRibGlwVHlwZSk7CgkJCQkJJEJTRS0+c2V0QmxpcCgkYmxpcCk7CgoJCQkJCSRic3RvcmVDb250YWluZXItPmFkZEJTRSgkQlNFKTsKCgkJCQl9IGVsc2UgaWYgKCRkcmF3aW5nIGluc3RhbmNlb2YgUEhQRXhjZWxfV29ya3NoZWV0X01lbW9yeURyYXdpbmcpIHsKCgkJCQkJc3dpdGNoICgkZHJhd2luZy0+Z2V0UmVuZGVyaW5nRnVuY3Rpb24oKSkgewoKCQkJCQljYXNlIFBIUEV4Y2VsX1dvcmtzaGVldF9NZW1vcnlEcmF3aW5nOjpSRU5ERVJJTkdfSlBFRzoKCQkJCQkJJGJsaXBUeXBlID0gUEhQRXhjZWxfU2hhcmVkX0VzY2hlcl9EZ2dDb250YWluZXJfQnN0b3JlQ29udGFpbmVyX0JTRTo6QkxJUFRZUEVfSlBFRzsKCQkJCQkJJHJlbmRlcmluZ0Z1bmN0aW9uID0gJ2ltYWdlanBlZyc7CgkJCQkJCWJyZWFrOwoKCQkJCQljYXNlIFBIUEV4Y2VsX1dvcmtzaGVldF9NZW1vcnlEcmF3aW5nOjpSRU5ERVJJTkdfR0lGOgoJCQkJCWNhc2UgUEhQRXhjZWxfV29ya3NoZWV0X01lbW9yeURyYXdpbmc6OlJFTkRFUklOR19QTkc6CgkJCQkJY2FzZSBQSFBFeGNlbF9Xb3Jrc2hlZXRfTWVtb3J5RHJhd2luZzo6UkVOREVSSU5HX0RFRkFVTFQ6CgkJCQkJCSRibGlwVHlwZSA9IFBIUEV4Y2VsX1NoYXJlZF9Fc2NoZXJfRGdnQ29udGFpbmVyX0JzdG9yZUNvbnRhaW5lcl9CU0U6OkJMSVBUWVBFX1BORzsKCQkJCQkJJHJlbmRlcmluZ0Z1bmN0aW9uID0gJ2ltYWdlcG5nJzsKCQkJCQkJYnJlYWs7CgoJCQkJCX0KCgkJCQkJb2Jfc3RhcnQoKTsKCQkJCQljYWxsX3VzZXJfZnVuYygkcmVuZGVyaW5nRnVuY3Rpb24sICRkcmF3aW5nLT5nZXRJbWFnZVJlc291cmNlKCkpOwoJCQkJCSRibGlwRGF0YSA9IG9iX2dldF9jb250ZW50cygpOwoJCQkJCW9iX2VuZF9jbGVhbigpOwoKCQkJCQkkYmxpcCA9IG5ldyBQSFBFeGNlbF9TaGFyZWRfRXNjaGVyX0RnZ0NvbnRhaW5lcl9Cc3RvcmVDb250YWluZXJfQlNFX0JsaXAoKTsKCQkJCQkkYmxpcC0+c2V0RGF0YSgkYmxpcERhdGEpOwoKCQkJCQkkQlNFID0gbmV3IFBIUEV4Y2VsX1NoYXJlZF9Fc2NoZXJfRGdnQ29udGFpbmVyX0JzdG9yZUNvbnRhaW5lcl9CU0UoKTsKCQkJCQkkQlNFLT5zZXRCbGlwVHlwZSgkYmxpcFR5cGUpOwoJCQkJCSRCU0UtPnNldEJsaXAoJGJsaXApOwoKCQkJCQkkYnN0b3JlQ29udGFpbmVyLT5hZGRCU0UoJEJTRSk7CgkJCQl9CgkJCX0KCQl9CgoJCS8vIFNldCB0aGUgRXNjaGVyIG9iamVjdAoJCSR0aGlzLT5fd3JpdGVyV29ya2Jvb2stPnNldEVzY2hlcigkZXNjaGVyKTsKCX0KCgkvKioKCSAqIEJ1aWxkIHRoZSBPTEUgUGFydCBmb3IgRG9jdW1lbnRTdW1tYXJ5IEluZm9ybWF0aW9uCgkgKiBAcmV0dXJuIHN0cmluZwoJICovCglwcml2YXRlIGZ1bmN0aW9uIF93cml0ZURvY3VtZW50U3VtbWFyeUluZm9ybWF0aW9uKCl7CgoJCS8vIG9mZnNldDogMDsgc2l6ZTogMjsgbXVzdCBiZSAweEZFIDB4RkYgKFVURi0xNiBMRSBieXRlIG9yZGVyIG1hcmspCgkJJGRhdGEgPSBwYWNrKCd2JywgMHhGRkZFKTsKCQkvLyBvZmZzZXQ6IDI7IHNpemU6IDI7CgkJJGRhdGEgLj0gcGFjaygndicsIDB4MDAwMCk7CgkJLy8gb2Zmc2V0OiA0OyBzaXplOiAyOyBPUyB2ZXJzaW9uCgkJJGRhdGEgLj0gcGFjaygndicsIDB4MDEwNik7CgkJLy8gb2Zmc2V0OiA2OyBzaXplOiAyOyBPUyBpbmRpY2F0b3IKCQkkZGF0YSAuPSBwYWNrKCd2JywgMHgwMDAyKTsKCQkvLyBvZmZzZXQ6IDg7IHNpemU6IDE2CgkJJGRhdGEgLj0gcGFjaygnVlZWVicsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDApOwoJCS8vIG9mZnNldDogMjQ7IHNpemU6IDQ7IHNlY3Rpb24gY291bnQKCQkkZGF0YSAuPSBwYWNrKCdWJywgMHgwMDAxKTsKCgkJLy8gb2Zmc2V0OiAyODsgc2l6ZTogMTY7IGZpcnN0IHNlY3Rpb24ncyBjbGFzcyBpZDogMDIgZDUgY2QgZDUgOWMgMmUgMWIgMTAgOTMgOTcgMDggMDAgMmIgMmMgZjkgYWUKCQkkZGF0YSAuPSBwYWNrKCd2dnZ2dnZ2dicsIDB4RDUwMiwgMHhENUNELCAweDJFOUMsIDB4MTAxQiwgMHg5NzkzLCAweDAwMDgsIDB4MkMyQiwgMHhBRUY5KTsKCQkvLyBvZmZzZXQ6IDQ0OyBzaXplOiA0OyBvZmZzZXQgb2YgdGhlIHN0YXJ0CgkJJGRhdGEgLj0gcGFjaygnVicsIDB4MzApOwoKCQkvLyBTRUNUSU9OCgkJJGRhdGFTZWN0aW9uID0gYXJyYXkoKTsKCQkkZGF0YVNlY3Rpb25fTnVtUHJvcHMgPSAwOwoJCSRkYXRhU2VjdGlvbl9TdW1tYXJ5ID0gJyc7CgkJJGRhdGFTZWN0aW9uX0NvbnRlbnQgPSAnJzsKCgkJLy8gR0tQSUREU0lfQ09ERVBBR0U6IENvZGVQYWdlCgkJJGRhdGFTZWN0aW9uW10gPSBhcnJheSgnc3VtbWFyeSc9PiBhcnJheSgncGFjaycgPT4gJ1YnLCAnZGF0YScgPT4gMHgwMSksCgkJCQkJCQkgICAnb2Zmc2V0JyA9PiBhcnJheSgncGFjaycgPT4gJ1YnKSwKCQkJCQkJCSAgICd0eXBlJyAJPT4gYXJyYXkoJ3BhY2snID0+ICdWJywgJ2RhdGEnID0+IDB4MDIpLCAvLyAyIGJ5dGUgc2lnbmVkIGludGVnZXIKCQkJCQkJCSAgICdkYXRhJwk9PiBhcnJheSgnZGF0YScgPT4gMTI1MikpOwoJCSRkYXRhU2VjdGlvbl9OdW1Qcm9wcysrOwoKCQkvLyBHS1BJRERTSV9DQVRFR09SWSA6IENhdGVnb3J5CgkJaWYoJHRoaXMtPl9waHBFeGNlbC0+Z2V0UHJvcGVydGllcygpLT5nZXRDYXRlZ29yeSgpKXsKCQkJJGRhdGFQcm9wID0gJHRoaXMtPl9waHBFeGNlbC0+Z2V0UHJvcGVydGllcygpLT5nZXRDYXRlZ29yeSgpOwoJCQkkZGF0YVByb3AgPSAnVGVzdCByZXN1bHQgZmlsZSc7CgkJCSRkYXRhU2VjdGlvbltdID0gYXJyYXkoJ3N1bW1hcnknPT4gYXJyYXkoJ3BhY2snID0+ICdWJywgJ2RhdGEnID0+IDB4MDIpLAoJCQkJCQkJCSAgICdvZmZzZXQnID0+IGFycmF5KCdwYWNrJyA9PiAnVicpLAoJCQkJCQkJCSAgICd0eXBlJyAJPT4gYXJyYXkoJ3BhY2snID0+ICdWJywgJ2RhdGEnID0+IDB4MUUpLAoJCQkJCQkJCSAgICdkYXRhJwk9PiBhcnJheSgnZGF0YScgPT4gJGRhdGFQcm9wLCAnbGVuZ3RoJyA9PiBzdHJsZW4oJGRhdGFQcm9wKSkpOwoJCQkkZGF0YVNlY3Rpb25fTnVtUHJvcHMrKzsKCQl9CgkJLy8gR0tQSUREU0lfVkVSU0lPTiA6VmVyc2lvbiBvZiB0aGUgYXBwbGljYXRpb24gdGhhdCB3cm90ZSB0aGUgcHJvcGVydHkgc3RvcmFnZQoJCSRkYXRhU2VjdGlvbltdID0gYXJyYXkoJ3N1bW1hcnknPT4gYXJyYXkoJ3BhY2snID0+ICdWJywgJ2RhdGEnID0+IDB4MTcpLAoJCQkJCQkJICAgJ29mZnNldCcgPT4gYXJyYXkoJ3BhY2snID0+ICdWJyksCgkJCQkJCQkgICAndHlwZScgCT0+IGFycmF5KCdwYWNrJyA9PiAnVicsICdkYXRhJyA9PiAweDAzKSwKCQkJCQkJCSAgICdkYXRhJwk9PiBhcnJheSgncGFjaycgPT4gJ1YnLCAnZGF0YScgPT4gMHgwMDBDMDAwMCkpOwoJCSRkYXRhU2VjdGlvbl9OdW1Qcm9wcysrOwoJCS8vIEdLUElERFNJX1NDQUxFIDogRkFMU0UKCQkkZGF0YVNlY3Rpb25bXSA9IGFycmF5KCdzdW1tYXJ5Jz0+IGFycmF5KCdwYWNrJyA9PiAnVicsICdkYXRhJyA9PiAweDBCKSwKCQkJCQkJCSAgICdvZmZzZXQnID0+IGFycmF5KCdwYWNrJyA9PiAnVicpLAoJCQkJCQkJICAgJ3R5cGUnIAk9PiBhcnJheSgncGFjaycgPT4gJ1YnLCAnZGF0YScgPT4gMHgwQiksCgkJCQkJCQkgICAnZGF0YScJPT4gYXJyYXkoJ2RhdGEnID0+IGZhbHNlKSk7CgkJJGRhdGFTZWN0aW9uX051bVByb3BzKys7CgkJLy8gR0tQSUREU0lfTElOS1NESVJUWSA6IFRydWUgaWYgYW55IG9mIHRoZSB2YWx1ZXMgZm9yIHRoZSBsaW5rZWQgcHJvcGVydGllcyBoYXZlIGNoYW5nZWQgb3V0c2lkZSBvZiB0aGUgYXBwbGljYXRpb24KCQkkZGF0YVNlY3Rpb25bXSA9IGFycmF5KCdzdW1tYXJ5Jz0+IGFycmF5KCdwYWNrJyA9PiAnVicsICdkYXRhJyA9PiAweDEwKSwKCQkJCQkJCSAgICdvZmZzZXQnID0+IGFycmF5KCdwYWNrJyA9PiAnVicpLAoJCQkJCQkJICAgJ3R5cGUnIAk9PiBhcnJheSgncGFjaycgPT4gJ1YnLCAnZGF0YScgPT4gMHgwQiksCgkJCQkJCQkgICAnZGF0YScJPT4gYXJyYXkoJ2RhdGEnID0+IGZhbHNlKSk7CgkJJGRhdGFTZWN0aW9uX051bVByb3BzKys7CgkJLy8gR0tQSUREU0lfU0hBUkVET0MgOiBGQUxTRQoJCSRkYXRhU2VjdGlvbltdID0gYXJyYXkoJ3N1bW1hcnknPT4gYXJyYXkoJ3BhY2snID0+ICdWJywgJ2RhdGEnID0+IDB4MTMpLAoJCQkJCQkJICAgJ29mZnNldCcgPT4gYXJyYXkoJ3BhY2snID0+ICdWJyksCgkJCQkJCQkgICAndHlwZScgCT0+IGFycmF5KCdwYWNrJyA9PiAnVicsICdkYXRhJyA9PiAweDBCKSwKCQkJCQkJCSAgICdkYXRhJwk9PiBhcnJheSgnZGF0YScgPT4gZmFsc2UpKTsKCQkkZGF0YVNlY3Rpb25fTnVtUHJvcHMrKzsKCQkvLyBHS1BJRERTSV9IWVBFUkxJTktTQ0hBTkdFRCA6IFRydWUgaWYgYW55IG9mIHRoZSB2YWx1ZXMgZm9yIHRoZSBfUElEX0xJTktTIChoeXBlcmxpbmsgdGV4dCkgaGF2ZSBjaGFuZ2VkIG91dHNpZGUgb2YgdGhlIGFwcGxpY2F0aW9uCgkJJGRhdGFTZWN0aW9uW10gPSBhcnJheSgnc3VtbWFyeSc9PiBhcnJheSgncGFjaycgPT4gJ1YnLCAnZGF0YScgPT4gMHgxNiksCgkJCQkJCQkgICAnb2Zmc2V0JyA9PiBhcnJheSgncGFjaycgPT4gJ1YnKSwKCQkJCQkJCSAgICd0eXBlJyAJPT4gYXJyYXkoJ3BhY2snID0+ICdWJywgJ2RhdGEnID0+IDB4MEIpLAoJCQkJCQkJICAgJ2RhdGEnCT0+IGFycmF5KCdkYXRhJyA9PiBmYWxzZSkpOwoJCSRkYXRhU2VjdGlvbl9OdW1Qcm9wcysrOwoKCQkvLyBHS1BJRERTSV9ET0NTUEFSVFMKCQkvLyBNUy1PU0hBUkVEIHA3NSAoMi4zLjMuMi4yLjEpCgkJLy8gU3RydWN0dXJlIGlzIFZ0VmVjVW5hbGlnbmVkTHBzdHJWYWx1ZSAoMi4zLjMuMS45KQoJCS8vIGNFbGVtZW50cwoJCSRkYXRhUHJvcCA9IHBhY2soJ3YnLCAweDAwMDEpOwoJCSRkYXRhUHJvcCAuPSBwYWNrKCd2JywgMHgwMDAwKTsKCQkvLyBhcnJheSBvZiBVbmFsaWduZWRMcHN0cgoJCSAgLy8gY2NoCgkJICAkZGF0YVByb3AgLj0gcGFjaygndicsIDB4MDAwQSk7CgkJICAkZGF0YVByb3AgLj0gcGFjaygndicsIDB4MDAwMCk7CgkJICAvLyB2YWx1ZQoJCSAgJGRhdGFQcm9wIC49ICdXb3Jrc2hlZXQnLmNocigwKTsKCgkJJGRhdGFTZWN0aW9uW10gPSBhcnJheSgnc3VtbWFyeSc9PiBhcnJheSgncGFjaycgPT4gJ1YnLCAnZGF0YScgPT4gMHgwRCksCgkJCQkJCQkgICAnb2Zmc2V0JyA9PiBhcnJheSgncGFjaycgPT4gJ1YnKSwKCQkJCQkJCSAgICd0eXBlJyAJPT4gYXJyYXkoJ3BhY2snID0+ICdWJywgJ2RhdGEnID0+IDB4MTAxRSksCgkJCQkJCQkgICAnZGF0YScJPT4gYXJyYXkoJ2RhdGEnID0+ICRkYXRhUHJvcCwgJ2xlbmd0aCcgPT4gc3RybGVuKCRkYXRhUHJvcCkpKTsKCQkkZGF0YVNlY3Rpb25fTnVtUHJvcHMrKzsKCgkJLy8gR0tQSUREU0lfSEVBRElOR1BBSVIKCQkvLyBWdFZlY0hlYWRpbmdQYWlyVmFsdWUKCQkgIC8vIGNFbGVtZW50cwoJCSAgJGRhdGFQcm9wID0gcGFjaygndicsIDB4MDAwMik7CgkJICAkZGF0YVByb3AgLj0gcGFjaygndicsIDB4MDAwMCk7CgkJICAvLyBBcnJheSBvZiB2dEhlYWRpbmdQYWlyCgkJICAgIC8vIHZ0VW5hbGlnbmVkU3RyaW5nIC0gaGVhZGluZ1N0cmluZwoJCSAgICAgIC8vIHN0cmluZ1R5cGUKCQkgICAgICAkZGF0YVByb3AgLj0gcGFjaygndicsIDB4MDAxRSk7CgkJICAgICAgLy8gcGFkZGluZwoJCSAgICAgICRkYXRhUHJvcCAuPSBwYWNrKCd2JywgMHgwMDAwKTsKCQkgICAgICAvLyBVbmFsaWduZWRMcHN0cgoJCSAgICAgICAgLy8gY2NoCgkJICAgICAgICAkZGF0YVByb3AgLj0gcGFjaygndicsIDB4MDAxMyk7CgkJICAgICAgICAkZGF0YVByb3AgLj0gcGFjaygndicsIDB4MDAwMCk7CgkJICAgICAgICAvLyB2YWx1ZQoJCSAgICAgICAgJGRhdGFQcm9wIC49ICdGZXVpbGxlcyBkZSBjYWxjdWwnOwoJCSAgICAvLyB2dFVuYWxpZ25lZFN0cmluZyAtIGhlYWRpbmdQYXJ0cwoJCSAgICAgIC8vIHdUeXBlIDogMHgwMDAzID0gMzIgYml0IHNpZ25lZCBpbnRlZ2VyCgkJICAgICAgJGRhdGFQcm9wIC49IHBhY2soJ3YnLCAweDAzMDApOwoJCSAgICAgIC8vIHBhZGRpbmcKCQkgICAgICAkZGF0YVByb3AgLj0gcGFjaygndicsIDB4MDAwMCk7CgkJICAgICAgLy8gdmFsdWUKCQkgICAgICAkZGF0YVByb3AgLj0gcGFjaygndicsIDB4MDEwMCk7CgkJICAgICAgJGRhdGFQcm9wIC49IHBhY2soJ3YnLCAweDAwMDApOwoJCQkgICRkYXRhUHJvcCAuPSBwYWNrKCd2JywgMHgwMDAwKTsKCQkgICAgICAkZGF0YVByb3AgLj0gcGFjaygndicsIDB4MDAwMCk7CgogICAgICAgICRkYXRhU2VjdGlvbltdID0gYXJyYXkoJ3N1bW1hcnknPT4gYXJyYXkoJ3BhY2snID0+ICdWJywgJ2RhdGEnID0+IDB4MEMpLAogICAgICAgIAkJCQkJICAgJ29mZnNldCcgPT4gYXJyYXkoJ3BhY2snID0+ICdWJyksCiAgICAgICAgCQkJCQkgICAndHlwZScgCT0+IGFycmF5KCdwYWNrJyA9PiAnVicsICdkYXRhJyA9PiAweDEwMEMpLAogICAgICAgIAkJCQkJICAgJ2RhdGEnCT0+IGFycmF5KCdkYXRhJyA9PiAkZGF0YVByb3AsICdsZW5ndGgnID0+IHN0cmxlbigkZGF0YVByb3ApKSk7CiAgICAgICAgJGRhdGFTZWN0aW9uX051bVByb3BzKys7CgoJCS8vIAkJNCAJU2VjdGlvbiBMZW5ndGgKCQkvLwkJNCAJUHJvcGVydHkgY291bnQKCQkvLwkJOCAqICRkYXRhU2VjdGlvbl9OdW1Qcm9wcyAoOCA9ICBJRCAoNCkgKyBPZmZTZXQoNCkpCgkJJGRhdGFTZWN0aW9uX0NvbnRlbnRfT2Zmc2V0ID0gOCArICRkYXRhU2VjdGlvbl9OdW1Qcm9wcyAqIDg7CgkJZm9yZWFjaCAoJGRhdGFTZWN0aW9uIGFzICRkYXRhUHJvcCl7CgkJCS8vIFN1bW1hcnkKCQkJJGRhdGFTZWN0aW9uX1N1bW1hcnkgLj0gcGFjaygkZGF0YVByb3BbJ3N1bW1hcnknXVsncGFjayddLCAkZGF0YVByb3BbJ3N1bW1hcnknXVsnZGF0YSddKTsKCQkJLy8gT2Zmc2V0CgkJCSRkYXRhU2VjdGlvbl9TdW1tYXJ5IC49IHBhY2soJGRhdGFQcm9wWydvZmZzZXQnXVsncGFjayddLCAkZGF0YVNlY3Rpb25fQ29udGVudF9PZmZzZXQpOwoJCQkvLyBEYXRhVHlwZQoJCQkkZGF0YVNlY3Rpb25fQ29udGVudCAuPSBwYWNrKCRkYXRhUHJvcFsndHlwZSddWydwYWNrJ10sICRkYXRhUHJvcFsndHlwZSddWydkYXRhJ10pOwoJCQkvLyBEYXRhCgkJCWlmKCRkYXRhUHJvcFsndHlwZSddWydkYXRhJ10gPT0gMHgwMil7IC8vIDIgYnl0ZSBzaWduZWQgaW50ZWdlcgoJCQkJJGRhdGFTZWN0aW9uX0NvbnRlbnQgLj0gcGFjaygnVicsICRkYXRhUHJvcFsnZGF0YSddWydkYXRhJ10pOwoKCQkJCSRkYXRhU2VjdGlvbl9Db250ZW50X09mZnNldCArPSA0ICsgNDsKCQkJfQoJCQllbHNlaWYoJGRhdGFQcm9wWyd0eXBlJ11bJ2RhdGEnXSA9PSAweDAzKXsgLy8gNCBieXRlIHNpZ25lZCBpbnRlZ2VyCgkJCQkkZGF0YVNlY3Rpb25fQ29udGVudCAuPSBwYWNrKCdWJywgJGRhdGFQcm9wWydkYXRhJ11bJ2RhdGEnXSk7CgoJCQkJJGRhdGFTZWN0aW9uX0NvbnRlbnRfT2Zmc2V0ICs9IDQgKyA0OwoJCQl9CgkJCWVsc2VpZigkZGF0YVByb3BbJ3R5cGUnXVsnZGF0YSddID09IDB4MEIpeyAvLyBCb29sZWFuCgkJCQlpZigkZGF0YVByb3BbJ2RhdGEnXVsnZGF0YSddID09IGZhbHNlKXsKCQkJCQkkZGF0YVNlY3Rpb25fQ29udGVudCAuPSBwYWNrKCdWJywgMHgwMDAwKTsKCQkJCX0gZWxzZSB7CgkJCQkJJGRhdGFTZWN0aW9uX0NvbnRlbnQgLj0gcGFjaygnVicsIDB4MDAwMSk7CgkJCQl9CgkJCQkkZGF0YVNlY3Rpb25fQ29udGVudF9PZmZzZXQgKz0gNCArIDQ7CgkJCX0KCQkJZWxzZWlmKCRkYXRhUHJvcFsndHlwZSddWydkYXRhJ10gPT0gMHgxRSl7IC8vIG51bGwtdGVybWluYXRlZCBzdHJpbmcgcHJlcGVuZGVkIGJ5IGR3b3JkIHN0cmluZyBsZW5ndGgKCQkJCS8vIE51bGwtdGVybWluYXRlZCBzdHJpbmcKCQkJCSRkYXRhUHJvcFsnZGF0YSddWydkYXRhJ10gLj0gY2hyKDApOwoJCQkJJGRhdGFQcm9wWydkYXRhJ11bJ2xlbmd0aCddICs9IDE7CgkJCQkvLyBDb21wbGV0ZSB0aGUgc3RyaW5nIHdpdGggbnVsbCBzdHJpbmcgZm9yIGJlaW5nIGEgJTQKCQkJCSRkYXRhUHJvcFsnZGF0YSddWydsZW5ndGgnXSA9ICRkYXRhUHJvcFsnZGF0YSddWydsZW5ndGgnXSArICgoNCAtICRkYXRhUHJvcFsnZGF0YSddWydsZW5ndGgnXSAlIDQpPT00ID8gMCA6ICg0IC0gJGRhdGFQcm9wWydkYXRhJ11bJ2xlbmd0aCddICUgNCkpOwoJCQkJJGRhdGFQcm9wWydkYXRhJ11bJ2RhdGEnXSA9IHN0cl9wYWQoJGRhdGFQcm9wWydkYXRhJ11bJ2RhdGEnXSwgJGRhdGFQcm9wWydkYXRhJ11bJ2xlbmd0aCddLCBjaHIoMCksIFNUUl9QQURfUklHSFQpOwoKCQkJCSRkYXRhU2VjdGlvbl9Db250ZW50IC49IHBhY2soJ1YnLCAkZGF0YVByb3BbJ2RhdGEnXVsnbGVuZ3RoJ10pOwoJCQkJJGRhdGFTZWN0aW9uX0NvbnRlbnQgLj0gJGRhdGFQcm9wWydkYXRhJ11bJ2RhdGEnXTsKCgkJCQkkZGF0YVNlY3Rpb25fQ29udGVudF9PZmZzZXQgKz0gNCArIDQgKyBzdHJsZW4oJGRhdGFQcm9wWydkYXRhJ11bJ2RhdGEnXSk7CgkJCX0KCQkJZWxzZWlmKCRkYXRhUHJvcFsndHlwZSddWydkYXRhJ10gPT0gMHg0MCl7IC8vIEZpbGV0aW1lICg2NC1iaXQgdmFsdWUgcmVwcmVzZW50aW5nIHRoZSBudW1iZXIgb2YgMTAwLW5hbm9zZWNvbmQgaW50ZXJ2YWxzIHNpbmNlIEphbnVhcnkgMSwgMTYwMSkKCQkJCSRkYXRhU2VjdGlvbl9Db250ZW50IC49ICRkYXRhUHJvcFsnZGF0YSddWydkYXRhJ107CgoJCQkJJGRhdGFTZWN0aW9uX0NvbnRlbnRfT2Zmc2V0ICs9IDQgKyA4OwoJCQl9CgkJCWVsc2UgewoJCQkJLy8gRGF0YSBUeXBlIE5vdCBVc2VkIGF0IHRoZSBtb21lbnQKCQkJCSRkYXRhU2VjdGlvbl9Db250ZW50IC49ICRkYXRhUHJvcFsnZGF0YSddWydkYXRhJ107CgoJCQkJJGRhdGFTZWN0aW9uX0NvbnRlbnRfT2Zmc2V0ICs9IDQgKyAkZGF0YVByb3BbJ2RhdGEnXVsnbGVuZ3RoJ107CgkJCX0KCQl9CgkJLy8gTm93ICRkYXRhU2VjdGlvbl9Db250ZW50X09mZnNldCBjb250YWlucyB0aGUgc2l6ZSBvZiB0aGUgY29udGVudAoKCQkvLyBzZWN0aW9uIGhlYWRlcgoJCS8vIG9mZnNldDogJHNlY09mZnNldDsgc2l6ZTogNDsgc2VjdGlvbiBsZW5ndGgKCQkvLyAJCSsgeCAgU2l6ZSBvZiB0aGUgY29udGVudCAoc3VtbWFyeSArIGNvbnRlbnQpCgkJJGRhdGEgLj0gcGFjaygnVicsICRkYXRhU2VjdGlvbl9Db250ZW50X09mZnNldCk7CgkJLy8gb2Zmc2V0OiAkc2VjT2Zmc2V0KzQ7IHNpemU6IDQ7IHByb3BlcnR5IGNvdW50CgkJJGRhdGEgLj0gcGFjaygnVicsICRkYXRhU2VjdGlvbl9OdW1Qcm9wcyk7CgkJLy8gU2VjdGlvbiBTdW1tYXJ5CgkJJGRhdGEgLj0gJGRhdGFTZWN0aW9uX1N1bW1hcnk7CgkJLy8gU2VjdGlvbiBDb250ZW50CgkJJGRhdGEgLj0gJGRhdGFTZWN0aW9uX0NvbnRlbnQ7CgoJCXJldHVybiAkZGF0YTsKCX0KCgkvKioKCSAqIEJ1aWxkIHRoZSBPTEUgUGFydCBmb3IgU3VtbWFyeSBJbmZvcm1hdGlvbgoJICogQHJldHVybiBzdHJpbmcKCSAqLwoJcHJpdmF0ZSBmdW5jdGlvbiBfd3JpdGVTdW1tYXJ5SW5mb3JtYXRpb24oKXsKCQkvLyBvZmZzZXQ6IDA7IHNpemU6IDI7IG11c3QgYmUgMHhGRSAweEZGIChVVEYtMTYgTEUgYnl0ZSBvcmRlciBtYXJrKQoJCSRkYXRhID0gcGFjaygndicsIDB4RkZGRSk7CgkJLy8gb2Zmc2V0OiAyOyBzaXplOiAyOwoJCSRkYXRhIC49IHBhY2soJ3YnLCAweDAwMDApOwoJCS8vIG9mZnNldDogNDsgc2l6ZTogMjsgT1MgdmVyc2lvbgoJCSRkYXRhIC49IHBhY2soJ3YnLCAweDAxMDYpOwoJCS8vIG9mZnNldDogNjsgc2l6ZTogMjsgT1MgaW5kaWNhdG9yCgkJJGRhdGEgLj0gcGFjaygndicsIDB4MDAwMik7CgkJLy8gb2Zmc2V0OiA4OyBzaXplOiAxNgoJCSRkYXRhIC49IHBhY2soJ1ZWVlYnLCAweDAwLCAweDAwLCAweDAwLCAweDAwKTsKCQkvLyBvZmZzZXQ6IDI0OyBzaXplOiA0OyBzZWN0aW9uIGNvdW50CgkJJGRhdGEgLj0gcGFjaygnVicsIDB4MDAwMSk7CgoJCS8vIG9mZnNldDogMjg7IHNpemU6IDE2OyBmaXJzdCBzZWN0aW9uJ3MgY2xhc3MgaWQ6IGUwIDg1IDlmIGYyIGY5IDRmIDY4IDEwIGFiIDkxIDA4IDAwIDJiIDI3IGIzIGQ5CgkJJGRhdGEgLj0gcGFjaygndnZ2dnZ2dnYnLCAweDg1RTAsIDB4RjI5RiwgMHg0RkY5LCAweDEwNjgsIDB4OTFBQiwgMHgwMDA4LCAweDI3MkIsIDB4RDlCMyk7CgkJLy8gb2Zmc2V0OiA0NDsgc2l6ZTogNDsgb2Zmc2V0IG9mIHRoZSBzdGFydAoJCSRkYXRhIC49IHBhY2soJ1YnLCAweDMwKTsKCgkJLy8gU0VDVElPTgoJCSRkYXRhU2VjdGlvbiA9IGFycmF5KCk7CgkJJGRhdGFTZWN0aW9uX051bVByb3BzID0gMDsKCQkkZGF0YVNlY3Rpb25fU3VtbWFyeSA9ICcnOwoJCSRkYXRhU2VjdGlvbl9Db250ZW50ID0gJyc7CgoJCS8vIENvZGVQYWdlIDogQ1AtMTI1MgoJCSRkYXRhU2VjdGlvbltdID0gYXJyYXkoJ3N1bW1hcnknPT4gYXJyYXkoJ3BhY2snID0+ICdWJywgJ2RhdGEnID0+IDB4MDEpLAoJCQkJCQkJICAgJ29mZnNldCcgPT4gYXJyYXkoJ3BhY2snID0+ICdWJyksCgkJCQkJCQkgICAndHlwZScgCT0+IGFycmF5KCdwYWNrJyA9PiAnVicsICdkYXRhJyA9PiAweDAyKSwgLy8gMiBieXRlIHNpZ25lZCBpbnRlZ2VyCgkJCQkJCQkgICAnZGF0YScJPT4gYXJyYXkoJ2RhdGEnID0+IDEyNTIpKTsKCQkkZGF0YVNlY3Rpb25fTnVtUHJvcHMrKzsKCgkJLy8JVGl0bGUKCQlpZigkdGhpcy0+X3BocEV4Y2VsLT5nZXRQcm9wZXJ0aWVzKCktPmdldFRpdGxlKCkpewoJCQkkZGF0YVByb3AgPSAkdGhpcy0+X3BocEV4Y2VsLT5nZXRQcm9wZXJ0aWVzKCktPmdldFRpdGxlKCk7CgkJCSRkYXRhU2VjdGlvbltdID0gYXJyYXkoJ3N1bW1hcnknPT4gYXJyYXkoJ3BhY2snID0+ICdWJywgJ2RhdGEnID0+IDB4MDIpLAoJCQkJCQkJCSAgICdvZmZzZXQnID0+IGFycmF5KCdwYWNrJyA9PiAnVicpLAoJCQkJCQkJCSAgICd0eXBlJyAJPT4gYXJyYXkoJ3BhY2snID0+ICdWJywgJ2RhdGEnID0+IDB4MUUpLCAvLyBudWxsLXRlcm1pbmF0ZWQgc3RyaW5nIHByZXBlbmRlZCBieSBkd29yZCBzdHJpbmcgbGVuZ3RoCgkJCQkJCQkJICAgJ2RhdGEnCT0+IGFycmF5KCdkYXRhJyA9PiAkZGF0YVByb3AsICdsZW5ndGgnID0+IHN0cmxlbigkZGF0YVByb3ApKSk7CgkJCSRkYXRhU2VjdGlvbl9OdW1Qcm9wcysrOwoJCX0KCQkvLwlTdWJqZWN0CgkJaWYoJHRoaXMtPl9waHBFeGNlbC0+Z2V0UHJvcGVydGllcygpLT5nZXRTdWJqZWN0KCkpewoJCQkkZGF0YVByb3AgPSAkdGhpcy0+X3BocEV4Y2VsLT5nZXRQcm9wZXJ0aWVzKCktPmdldFN1YmplY3QoKTsKCQkJJGRhdGFTZWN0aW9uW10gPSBhcnJheSgnc3VtbWFyeSc9PiBhcnJheSgncGFjaycgPT4gJ1YnLCAnZGF0YScgPT4gMHgwMyksCgkJCQkJCQkJICAgJ29mZnNldCcgPT4gYXJyYXkoJ3BhY2snID0+ICdWJyksCgkJCQkJCQkJICAgJ3R5cGUnIAk9PiBhcnJheSgncGFjaycgPT4gJ1YnLCAnZGF0YScgPT4gMHgxRSksIC8vIG51bGwtdGVybWluYXRlZCBzdHJpbmcgcHJlcGVuZGVkIGJ5IGR3b3JkIHN0cmluZyBsZW5ndGgKCQkJCQkJCQkgICAnZGF0YScJPT4gYXJyYXkoJ2RhdGEnID0+ICRkYXRhUHJvcCwgJ2xlbmd0aCcgPT4gc3RybGVuKCRkYXRhUHJvcCkpKTsKCQkJJGRhdGFTZWN0aW9uX051bVByb3BzKys7CgkJfQoJCS8vCUF1dGhvciAoQ3JlYXRvcikKCQlpZigkdGhpcy0+X3BocEV4Y2VsLT5nZXRQcm9wZXJ0aWVzKCktPmdldENyZWF0b3IoKSl7CgkJCSRkYXRhUHJvcCA9ICR0aGlzLT5fcGhwRXhjZWwtPmdldFByb3BlcnRpZXMoKS0+Z2V0Q3JlYXRvcigpOwoJCQkkZGF0YVNlY3Rpb25bXSA9IGFycmF5KCdzdW1tYXJ5Jz0+IGFycmF5KCdwYWNrJyA9PiAnVicsICdkYXRhJyA9PiAweDA0KSwKCQkJCQkJCQkgICAnb2Zmc2V0JyA9PiBhcnJheSgncGFjaycgPT4gJ1YnKSwKCQkJCQkJCQkgICAndHlwZScgCT0+IGFycmF5KCdwYWNrJyA9PiAnVicsICdkYXRhJyA9PiAweDFFKSwgLy8gbnVsbC10ZXJtaW5hdGVkIHN0cmluZyBwcmVwZW5kZWQgYnkgZHdvcmQgc3RyaW5nIGxlbmd0aAoJCQkJCQkJCSAgICdkYXRhJwk9PiBhcnJheSgnZGF0YScgPT4gJGRhdGFQcm9wLCAnbGVuZ3RoJyA9PiBzdHJsZW4oJGRhdGFQcm9wKSkpOwoJCQkkZGF0YVNlY3Rpb25fTnVtUHJvcHMrKzsKCQl9CgkJLy8JS2V5d29yZHMKCQlpZigkdGhpcy0+X3BocEV4Y2VsLT5nZXRQcm9wZXJ0aWVzKCktPmdldEtleXdvcmRzKCkpewoJCQkkZGF0YVByb3AgPSAkdGhpcy0+X3BocEV4Y2VsLT5nZXRQcm9wZXJ0aWVzKCktPmdldEtleXdvcmRzKCk7CgkJCSRkYXRhU2VjdGlvbltdID0gYXJyYXkoJ3N1bW1hcnknPT4gYXJyYXkoJ3BhY2snID0+ICdWJywgJ2RhdGEnID0+IDB4MDUpLAoJCQkJCQkJCSAgICdvZmZzZXQnID0+IGFycmF5KCdwYWNrJyA9PiAnVicpLAoJCQkJCQkJCSAgICd0eXBlJyAJPT4gYXJyYXkoJ3BhY2snID0+ICdWJywgJ2RhdGEnID0+IDB4MUUpLCAvLyBudWxsLXRlcm1pbmF0ZWQgc3RyaW5nIHByZXBlbmRlZCBieSBkd29yZCBzdHJpbmcgbGVuZ3RoCgkJCQkJCQkJICAgJ2RhdGEnCT0+IGFycmF5KCdkYXRhJyA9PiAkZGF0YVByb3AsICdsZW5ndGgnID0+IHN0cmxlbigkZGF0YVByb3ApKSk7CgkJCSRkYXRhU2VjdGlvbl9OdW1Qcm9wcysrOwoJCX0KCQkvLwlDb21tZW50cyAoRGVzY3JpcHRpb24pCgkJaWYoJHRoaXMtPl9waHBFeGNlbC0+Z2V0UHJvcGVydGllcygpLT5nZXREZXNjcmlwdGlvbigpKXsKCQkJJGRhdGFQcm9wID0gJHRoaXMtPl9waHBFeGNlbC0+Z2V0UHJvcGVydGllcygpLT5nZXREZXNjcmlwdGlvbigpOwoJCQkkZGF0YVNlY3Rpb25bXSA9IGFycmF5KCdzdW1tYXJ5Jz0+IGFycmF5KCdwYWNrJyA9PiAnVicsICdkYXRhJyA9PiAweDA2KSwKCQkJCQkJCQkgICAnb2Zmc2V0JyA9PiBhcnJheSgncGFjaycgPT4gJ1YnKSwKCQkJCQkJCQkgICAndHlwZScgCT0+IGFycmF5KCdwYWNrJyA9PiAnVicsICdkYXRhJyA9PiAweDFFKSwgLy8gbnVsbC10ZXJtaW5hdGVkIHN0cmluZyBwcmVwZW5kZWQgYnkgZHdvcmQgc3RyaW5nIGxlbmd0aAoJCQkJCQkJCSAgICdkYXRhJwk9PiBhcnJheSgnZGF0YScgPT4gJGRhdGFQcm9wLCAnbGVuZ3RoJyA9PiBzdHJsZW4oJGRhdGFQcm9wKSkpOwoJCQkkZGF0YVNlY3Rpb25fTnVtUHJvcHMrKzsKCQl9CgkJLy8JTGFzdCBTYXZlZCBCeSAoTGFzdE1vZGlmaWVkQnkpCgkJaWYoJHRoaXMtPl9waHBFeGNlbC0+Z2V0UHJvcGVydGllcygpLT5nZXRMYXN0TW9kaWZpZWRCeSgpKXsKCQkJJGRhdGFQcm9wID0gJHRoaXMtPl9waHBFeGNlbC0+Z2V0UHJvcGVydGllcygpLT5nZXRMYXN0TW9kaWZpZWRCeSgpOwoJCQkkZGF0YVNlY3Rpb25bXSA9IGFycmF5KCdzdW1tYXJ5Jz0+IGFycmF5KCdwYWNrJyA9PiAnVicsICdkYXRhJyA9PiAweDA4KSwKCQkJCQkJCQkgICAnb2Zmc2V0JyA9PiBhcnJheSgncGFjaycgPT4gJ1YnKSwKCQkJCQkJCQkgICAndHlwZScgCT0+IGFycmF5KCdwYWNrJyA9PiAnVicsICdkYXRhJyA9PiAweDFFKSwgLy8gbnVsbC10ZXJtaW5hdGVkIHN0cmluZyBwcmVwZW5kZWQgYnkgZHdvcmQgc3RyaW5nIGxlbmd0aAoJCQkJCQkJCSAgICdkYXRhJwk9PiBhcnJheSgnZGF0YScgPT4gJGRhdGFQcm9wLCAnbGVuZ3RoJyA9PiBzdHJsZW4oJGRhdGFQcm9wKSkpOwoJCQkkZGF0YVNlY3Rpb25fTnVtUHJvcHMrKzsKCQl9CgkJLy8JQ3JlYXRlZCBEYXRlL1RpbWUKCQlpZigkdGhpcy0+X3BocEV4Y2VsLT5nZXRQcm9wZXJ0aWVzKCktPmdldENyZWF0ZWQoKSl7CgkJCSRkYXRhUHJvcCA9ICR0aGlzLT5fcGhwRXhjZWwtPmdldFByb3BlcnRpZXMoKS0+Z2V0Q3JlYXRlZCgpOwoJCQkkZGF0YVNlY3Rpb25bXSA9IGFycmF5KCdzdW1tYXJ5Jz0+IGFycmF5KCdwYWNrJyA9PiAnVicsICdkYXRhJyA9PiAweDBDKSwKCQkJCQkJCQkgICAnb2Zmc2V0JyA9PiBhcnJheSgncGFjaycgPT4gJ1YnKSwKCQkJCQkJCQkgICAndHlwZScgCT0+IGFycmF5KCdwYWNrJyA9PiAnVicsICdkYXRhJyA9PiAweDQwKSwgLy8gRmlsZXRpbWUgKDY0LWJpdCB2YWx1ZSByZXByZXNlbnRpbmcgdGhlIG51bWJlciBvZiAxMDAtbmFub3NlY29uZCBpbnRlcnZhbHMgc2luY2UgSmFudWFyeSAxLCAxNjAxKQoJCQkJCQkJCSAgICdkYXRhJwk9PiBhcnJheSgnZGF0YScgPT4gUEhQRXhjZWxfU2hhcmVkX09MRTo6TG9jYWxEYXRlMk9MRSgkZGF0YVByb3ApKSk7CgkJCSRkYXRhU2VjdGlvbl9OdW1Qcm9wcysrOwoJCX0KCQkvLwlNb2RpZmllZCBEYXRlL1RpbWUKCQlpZigkdGhpcy0+X3BocEV4Y2VsLT5nZXRQcm9wZXJ0aWVzKCktPmdldE1vZGlmaWVkKCkpewoJCQkkZGF0YVByb3AgPSAkdGhpcy0+X3BocEV4Y2VsLT5nZXRQcm9wZXJ0aWVzKCktPmdldE1vZGlmaWVkKCk7CgkJCSRkYXRhU2VjdGlvbltdID0gYXJyYXkoJ3N1bW1hcnknPT4gYXJyYXkoJ3BhY2snID0+ICdWJywgJ2RhdGEnID0+IDB4MEQpLAoJCQkJCQkJCSAgICdvZmZzZXQnID0+IGFycmF5KCdwYWNrJyA9PiAnVicpLAoJCQkJCQkJCSAgICd0eXBlJyAJPT4gYXJyYXkoJ3BhY2snID0+ICdWJywgJ2RhdGEnID0+IDB4NDApLCAvLyBGaWxldGltZSAoNjQtYml0IHZhbHVlIHJlcHJlc2VudGluZyB0aGUgbnVtYmVyIG9mIDEwMC1uYW5vc2Vjb25kIGludGVydmFscyBzaW5jZSBKYW51YXJ5IDEsIDE2MDEpCgkJCQkJCQkJICAgJ2RhdGEnCT0+IGFycmF5KCdkYXRhJyA9PiBQSFBFeGNlbF9TaGFyZWRfT0xFOjpMb2NhbERhdGUyT0xFKCRkYXRhUHJvcCkpKTsKCQkJJGRhdGFTZWN0aW9uX051bVByb3BzKys7CgkJfQoJCS8vCVNlY3VyaXR5CgkJJGRhdGFTZWN0aW9uW10gPSBhcnJheSgnc3VtbWFyeSc9PiBhcnJheSgncGFjaycgPT4gJ1YnLCAnZGF0YScgPT4gMHgxMyksCgkJCQkJCQkgICAnb2Zmc2V0JyA9PiBhcnJheSgncGFjaycgPT4gJ1YnKSwKCQkJCQkJCSAgICd0eXBlJyAJPT4gYXJyYXkoJ3BhY2snID0+ICdWJywgJ2RhdGEnID0+IDB4MDMpLCAvLyA0IGJ5dGUgc2lnbmVkIGludGVnZXIKCQkJCQkJCSAgICdkYXRhJwk9PiBhcnJheSgnZGF0YScgPT4gMHgwMCkpOwoJCSRkYXRhU2VjdGlvbl9OdW1Qcm9wcysrOwoKCgkJLy8gCQk0IAlTZWN0aW9uIExlbmd0aAoJCS8vCQk0IAlQcm9wZXJ0eSBjb3VudAoJCS8vCQk4ICogJGRhdGFTZWN0aW9uX051bVByb3BzICg4ID0gIElEICg0KSArIE9mZlNldCg0KSkKCQkkZGF0YVNlY3Rpb25fQ29udGVudF9PZmZzZXQgPSA4ICsgJGRhdGFTZWN0aW9uX051bVByb3BzICogODsKCQlmb3JlYWNoICgkZGF0YVNlY3Rpb24gYXMgJGRhdGFQcm9wKXsKCQkJLy8gU3VtbWFyeQoJCQkkZGF0YVNlY3Rpb25fU3VtbWFyeSAuPSBwYWNrKCRkYXRhUHJvcFsnc3VtbWFyeSddWydwYWNrJ10sICRkYXRhUHJvcFsnc3VtbWFyeSddWydkYXRhJ10pOwoJCQkvLyBPZmZzZXQKCQkJJGRhdGFTZWN0aW9uX1N1bW1hcnkgLj0gcGFjaygkZGF0YVByb3BbJ29mZnNldCddWydwYWNrJ10sICRkYXRhU2VjdGlvbl9Db250ZW50X09mZnNldCk7CgkJCS8vIERhdGFUeXBlCgkJCSRkYXRhU2VjdGlvbl9Db250ZW50IC49IHBhY2soJGRhdGFQcm9wWyd0eXBlJ11bJ3BhY2snXSwgJGRhdGFQcm9wWyd0eXBlJ11bJ2RhdGEnXSk7CgkJCS8vIERhdGEKCQkJaWYoJGRhdGFQcm9wWyd0eXBlJ11bJ2RhdGEnXSA9PSAweDAyKXsgLy8gMiBieXRlIHNpZ25lZCBpbnRlZ2VyCgkJCQkkZGF0YVNlY3Rpb25fQ29udGVudCAuPSBwYWNrKCdWJywgJGRhdGFQcm9wWydkYXRhJ11bJ2RhdGEnXSk7CgoJCQkJJGRhdGFTZWN0aW9uX0NvbnRlbnRfT2Zmc2V0ICs9IDQgKyA0OwoJCQl9CgkJCWVsc2VpZigkZGF0YVByb3BbJ3R5cGUnXVsnZGF0YSddID09IDB4MDMpeyAvLyA0IGJ5dGUgc2lnbmVkIGludGVnZXIKCQkJCSRkYXRhU2VjdGlvbl9Db250ZW50IC49IHBhY2soJ1YnLCAkZGF0YVByb3BbJ2RhdGEnXVsnZGF0YSddKTsKCgkJCQkkZGF0YVNlY3Rpb25fQ29udGVudF9PZmZzZXQgKz0gNCArIDQ7CgkJCX0KCQkJZWxzZWlmKCRkYXRhUHJvcFsndHlwZSddWydkYXRhJ10gPT0gMHgxRSl7IC8vIG51bGwtdGVybWluYXRlZCBzdHJpbmcgcHJlcGVuZGVkIGJ5IGR3b3JkIHN0cmluZyBsZW5ndGgKCQkJCS8vIE51bGwtdGVybWluYXRlZCBzdHJpbmcKCQkJCSRkYXRhUHJvcFsnZGF0YSddWydkYXRhJ10gLj0gY2hyKDApOwoJCQkJJGRhdGFQcm9wWydkYXRhJ11bJ2xlbmd0aCddICs9IDE7CgkJCQkvLyBDb21wbGV0ZSB0aGUgc3RyaW5nIHdpdGggbnVsbCBzdHJpbmcgZm9yIGJlaW5nIGEgJTQKCQkJCSRkYXRhUHJvcFsnZGF0YSddWydsZW5ndGgnXSA9ICRkYXRhUHJvcFsnZGF0YSddWydsZW5ndGgnXSArICgoNCAtICRkYXRhUHJvcFsnZGF0YSddWydsZW5ndGgnXSAlIDQpPT00ID8gMCA6ICg0IC0gJGRhdGFQcm9wWydkYXRhJ11bJ2xlbmd0aCddICUgNCkpOwoJCQkJJGRhdGFQcm9wWydkYXRhJ11bJ2RhdGEnXSA9IHN0cl9wYWQoJGRhdGFQcm9wWydkYXRhJ11bJ2RhdGEnXSwgJGRhdGFQcm9wWydkYXRhJ11bJ2xlbmd0aCddLCBjaHIoMCksIFNUUl9QQURfUklHSFQpOwoKCQkJCSRkYXRhU2VjdGlvbl9Db250ZW50IC49IHBhY2soJ1YnLCAkZGF0YVByb3BbJ2RhdGEnXVsnbGVuZ3RoJ10pOwoJCQkJJGRhdGFTZWN0aW9uX0NvbnRlbnQgLj0gJGRhdGFQcm9wWydkYXRhJ11bJ2RhdGEnXTsKCgkJCQkkZGF0YVNlY3Rpb25fQ29udGVudF9PZmZzZXQgKz0gNCArIDQgKyBzdHJsZW4oJGRhdGFQcm9wWydkYXRhJ11bJ2RhdGEnXSk7CgkJCX0KCQkJZWxzZWlmKCRkYXRhUHJvcFsndHlwZSddWydkYXRhJ10gPT0gMHg0MCl7IC8vIEZpbGV0aW1lICg2NC1iaXQgdmFsdWUgcmVwcmVzZW50aW5nIHRoZSBudW1iZXIgb2YgMTAwLW5hbm9zZWNvbmQgaW50ZXJ2YWxzIHNpbmNlIEphbnVhcnkgMSwgMTYwMSkKCQkJCSRkYXRhU2VjdGlvbl9Db250ZW50IC49ICRkYXRhUHJvcFsnZGF0YSddWydkYXRhJ107CgoJCQkJJGRhdGFTZWN0aW9uX0NvbnRlbnRfT2Zmc2V0ICs9IDQgKyA4OwoJCQl9CgkJCWVsc2UgewoJCQkJLy8gRGF0YSBUeXBlIE5vdCBVc2VkIGF0IHRoZSBtb21lbnQKCQkJfQoJCX0KCQkvLyBOb3cgJGRhdGFTZWN0aW9uX0NvbnRlbnRfT2Zmc2V0IGNvbnRhaW5zIHRoZSBzaXplIG9mIHRoZSBjb250ZW50CgoJCS8vIHNlY3Rpb24gaGVhZGVyCgkJLy8gb2Zmc2V0OiAkc2VjT2Zmc2V0OyBzaXplOiA0OyBzZWN0aW9uIGxlbmd0aAoJCS8vIAkJKyB4ICBTaXplIG9mIHRoZSBjb250ZW50IChzdW1tYXJ5ICsgY29udGVudCkKCQkkZGF0YSAuPSBwYWNrKCdWJywgJGRhdGFTZWN0aW9uX0NvbnRlbnRfT2Zmc2V0KTsKCQkvLyBvZmZzZXQ6ICRzZWNPZmZzZXQrNDsgc2l6ZTogNDsgcHJvcGVydHkgY291bnQKCQkkZGF0YSAuPSBwYWNrKCdWJywgJGRhdGFTZWN0aW9uX051bVByb3BzKTsKCQkvLyBTZWN0aW9uIFN1bW1hcnkKCQkkZGF0YSAuPSAkZGF0YVNlY3Rpb25fU3VtbWFyeTsKCQkvLyBTZWN0aW9uIENvbnRlbnQKCQkkZGF0YSAuPSAkZGF0YVNlY3Rpb25fQ29udGVudDsKCgkJcmV0dXJuICRkYXRhOwoJfQp9]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Writer/Excel5/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Writer/Excel5/BIFFwriter.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIFBIUEV4Y2VsCiAqCiAqIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICoKICogQGNhdGVnb3J5ICAgUEhQRXhjZWwKICogQHBhY2thZ2UgICAgUEhQRXhjZWxfV3JpdGVyX0V4Y2VsNQogKiBAY29weXJpZ2h0ICBDb3B5cmlnaHQgKGMpIDIwMDYgLSAyMDEyIFBIUEV4Y2VsIChodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9QSFBFeGNlbCkKICogQGxpY2Vuc2UgICAgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL29sZC1saWNlbnNlcy9sZ3BsLTIuMS50eHQJTEdQTAogKiBAdmVyc2lvbiAgICAxLjcuNywgMjAxMi0wNS0xOQogKi8KCi8vIE9yaWdpbmFsIGZpbGUgaGVhZGVyIG9mIFBFQVI6OlNwcmVhZHNoZWV0X0V4Y2VsX1dyaXRlcl9CSUZGd3JpdGVyICh1c2VkIGFzIHRoZSBiYXNlIGZvciB0aGlzIGNsYXNzKToKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gKiAgTW9kdWxlIHdyaXR0ZW4vcG9ydGVkIGJ5IFhhdmllciBOb2d1ZXIgPHhub2d1ZXJAcmV6ZWJyYS5jb20+Ci8vICoKLy8gKiAgVGhlIG1ham9yaXR5IG9mIHRoaXMgaXMgX05PVF8gbXkgY29kZS4gIEkgc2ltcGx5IHBvcnRlZCBpdCBmcm9tIHRoZQovLyAqICBQRVJMIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIG1vZHVsZS4KLy8gKgovLyAqICBUaGUgYXV0aG9yIG9mIHRoZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCBtb2R1bGUgaXMgSm9obiBNY05hbWFyYQovLyAqICA8am1jbmFtYXJhQGNwYW4ub3JnPgovLyAqCi8vICogIEkgX0RPXyBtYWludGFpbiB0aGlzIGNvZGUsIGFuZCBKb2huIE1jTmFtYXJhIGhhcyBub3RoaW5nIHRvIGRvIHdpdGggdGhlCi8vICogIHBvcnRpbmcgb2YgdGhpcyBjb2RlIHRvIFBIUC4gIEFueSBxdWVzdGlvbnMgZGlyZWN0bHkgcmVsYXRlZCB0byB0aGlzCi8vICogIGNsYXNzIGxpYnJhcnkgc2hvdWxkIGJlIGRpcmVjdGVkIHRvIG1lLgovLyAqCi8vICogIExpY2Vuc2UgSW5mb3JtYXRpb246Ci8vICoKLy8gKiAgICBTcHJlYWRzaGVldF9FeGNlbF9Xcml0ZXI6ICBBIGxpYnJhcnkgZm9yIGdlbmVyYXRpbmcgRXhjZWwgU3ByZWFkc2hlZXRzCi8vICogICAgQ29weXJpZ2h0IChjKSAyMDAyLTIwMDMgWGF2aWVyIE5vZ3VlciB4bm9ndWVyQHJlemVicmEuY29tCi8vICoKLy8gKiAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi8vICogICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwovLyAqICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgovLyAqICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgovLyAqCi8vICogICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi8vICogICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLy8gKiAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQovLyAqICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi8vICoKLy8gKiAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi8vICogICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQovLyAqICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKLy8gKi8KCgovKioKICogUEhQRXhjZWxfV3JpdGVyX0V4Y2VsNV9CSUZGd3JpdGVyCiAqCiAqIEBjYXRlZ29yeSAgIFBIUEV4Y2VsCiAqIEBwYWNrYWdlICAgIFBIUEV4Y2VsX1dyaXRlcl9FeGNlbDUKICogQGNvcHlyaWdodCAgQ29weXJpZ2h0IChjKSAyMDA2IC0gMjAxMiBQSFBFeGNlbCAoaHR0cDovL3d3dy5jb2RlcGxleC5jb20vUEhQRXhjZWwpCiAqLwpjbGFzcyBQSFBFeGNlbF9Xcml0ZXJfRXhjZWw1X0JJRkZ3cml0ZXIKewoJLyoqCgkgKiBUaGUgYnl0ZSBvcmRlciBvZiB0aGlzIGFyY2hpdGVjdHVyZS4gMCA9PiBsaXR0bGUgZW5kaWFuLCAxID0+IGJpZyBlbmRpYW4KCSAqIEB2YXIgaW50ZWdlcgoJICovCglwcml2YXRlIHN0YXRpYyAkX2J5dGVfb3JkZXI7CgoJLyoqCgkgKiBUaGUgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIGRhdGEgb2YgdGhlIEJJRkYgc3RyZWFtCgkgKiBAdmFyIHN0cmluZwoJICovCglwdWJsaWMgJF9kYXRhOwoKCS8qKgoJICogVGhlIHNpemUgb2YgdGhlIGRhdGEgaW4gYnl0ZXMuIFNob3VsZCBiZSB0aGUgc2FtZSBhcyBzdHJsZW4oJHRoaXMtPl9kYXRhKQoJICogQHZhciBpbnRlZ2VyCgkgKi8KCXB1YmxpYyAkX2RhdGFzaXplOwoKCS8qKgoJICogVGhlIG1heGltdW0gbGVuZ3RoIGZvciBhIEJJRkYgcmVjb3JkIChleGNsdWRpbmcgcmVjb3JkIGhlYWRlciBhbmQgbGVuZ3RoIGZpZWxkKS4gU2VlIF9hZGRDb250aW51ZSgpCgkgKiBAdmFyIGludGVnZXIKCSAqIEBzZWUgX2FkZENvbnRpbnVlKCkKCSAqLwoJcHVibGljICRfbGltaXQJPSA4MjI0OwoKCS8qKgoJICogQ29uc3RydWN0b3IKCSAqLwoJcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCkKCXsKCQkkdGhpcy0+X2RhdGEgICAgICAgPSAnJzsKCQkkdGhpcy0+X2RhdGFzaXplICAgPSAwOwovLwkJJHRoaXMtPl9saW1pdCAgICAgID0gODIyNDsKCX0KCgkvKioKCSAqIERldGVybWluZSB0aGUgYnl0ZSBvcmRlciBhbmQgc3RvcmUgaXQgYXMgY2xhc3MgZGF0YSB0byBhdm9pZAoJICogcmVjYWxjdWxhdGluZyBpdCBmb3IgZWFjaCBjYWxsIHRvIG5ldygpLgoJICoKCSAqIEByZXR1cm4gaW50CgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0Qnl0ZU9yZGVyKCkKCXsKCQlpZiAoIWlzc2V0KHNlbGY6OiRfYnl0ZV9vcmRlcikpIHsKCQkJLy8gQ2hlY2sgaWYgInBhY2siIGdpdmVzIHRoZSByZXF1aXJlZCBJRUVFIDY0Yml0IGZsb2F0CgkJCSR0ZXN0c3RyID0gcGFjaygiZCIsIDEuMjM0NSk7CgkJCSRudW1iZXIgID0gcGFjaygiQzgiLCAweDhELCAweDk3LCAweDZFLCAweDEyLCAweDgzLCAweEMwLCAweEYzLCAweDNGKTsKCQkJaWYgKCRudW1iZXIgPT0gJHRlc3RzdHIpIHsKCQkJCSRieXRlX29yZGVyID0gMDsgICAgLy8gTGl0dGxlIEVuZGlhbgoJCQl9IGVsc2VpZiAoJG51bWJlciA9PSBzdHJyZXYoJHRlc3RzdHIpKXsKCQkJCSRieXRlX29yZGVyID0gMTsgICAgLy8gQmlnIEVuZGlhbgoJCQl9IGVsc2UgewoJCQkJLy8gR2l2ZSB1cC4gSSdsbCBmaXggdGhpcyBpbiBhIGxhdGVyIHZlcnNpb24uCgkJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCJSZXF1aXJlZCBmbG9hdGluZyBwb2ludCBmb3JtYXQgbm90IHN1cHBvcnRlZCBvbiB0aGlzIHBsYXRmb3JtLiIpOwoJCQl9CgkJCXNlbGY6OiRfYnl0ZV9vcmRlciA9ICRieXRlX29yZGVyOwoJCX0KCgkJcmV0dXJuIHNlbGY6OiRfYnl0ZV9vcmRlcjsKCX0KCgkvKioKCSAqIEdlbmVyYWwgc3RvcmFnZSBmdW5jdGlvbgoJICoKCSAqIEBwYXJhbSBzdHJpbmcgJGRhdGEgYmluYXJ5IGRhdGEgdG8gYXBwZW5kCgkgKiBAYWNjZXNzIHByaXZhdGUKCSAqLwoJZnVuY3Rpb24gX2FwcGVuZCgkZGF0YSkKCXsKCQlpZiAoc3RybGVuKCRkYXRhKSAtIDQgPiAkdGhpcy0+X2xpbWl0KSB7CgkJCSRkYXRhID0gJHRoaXMtPl9hZGRDb250aW51ZSgkZGF0YSk7CgkJfQoJCSR0aGlzLT5fZGF0YQkJLj0gJGRhdGE7CgkJJHRoaXMtPl9kYXRhc2l6ZQkrPSBzdHJsZW4oJGRhdGEpOwoJfQoKCS8qKgoJICogR2VuZXJhbCBzdG9yYWdlIGZ1bmN0aW9uIGxpa2UgX2FwcGVuZCwgYnV0IHJldHVybnMgc3RyaW5nIGluc3RlYWQgb2YgbW9kaWZ5aW5nICR0aGlzLT5fZGF0YQoJICoKCSAqIEBwYXJhbSBzdHJpbmcgJGRhdGEgYmluYXJ5IGRhdGEgdG8gd3JpdGUKCSAqIEByZXR1cm4gc3RyaW5nCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiB3cml0ZURhdGEoJGRhdGEpCgl7CgkJaWYgKHN0cmxlbigkZGF0YSkgLSA0ID4gJHRoaXMtPl9saW1pdCkgewoJCQkkZGF0YSA9ICR0aGlzLT5fYWRkQ29udGludWUoJGRhdGEpOwoJCX0KCQkkdGhpcy0+X2RhdGFzaXplICs9IHN0cmxlbigkZGF0YSk7CgoJCXJldHVybiAkZGF0YTsKCX0KCgkvKioKCSAqIFdyaXRlcyBFeGNlbCBCT0YgcmVjb3JkIHRvIGluZGljYXRlIHRoZSBiZWdpbm5pbmcgb2YgYSBzdHJlYW0gb3IKCSAqIHN1Yi1zdHJlYW0gaW4gdGhlIEJJRkYgZmlsZS4KCSAqCgkgKiBAcGFyYW0gIGludGVnZXIgJHR5cGUgVHlwZSBvZiBCSUZGIGZpbGUgdG8gd3JpdGU6IDB4MDAwNSBXb3JrYm9vaywKCSAqICAgICAgICAgICAgICAgICAgICAgICAweDAwMTAgV29ya3NoZWV0LgoJICogQGFjY2VzcyBwcml2YXRlCgkgKi8KCWZ1bmN0aW9uIF9zdG9yZUJvZigkdHlwZSkKCXsKCQkkcmVjb3JkICA9IDB4MDgwOTsJCQkvLyBSZWNvcmQgaWRlbnRpZmllcgkoQklGRjUtQklGRjgpCgkJJGxlbmd0aCAgPSAweDAwMTA7CgoJCS8vIGJ5IGluc3BlY3Rpb24gb2YgcmVhbCBmaWxlcywgTVMgT2ZmaWNlIEV4Y2VsIDIwMDcgd3JpdGVzIHRoZSBmb2xsb3dpbmcKCQkkdW5rbm93biA9IHBhY2soIlZWIiwgMHgwMDAxMDBEMSwgMHgwMDAwMDQwNik7CgoJCSRidWlsZCAgID0gMHgwREJCOwkJCS8vCUV4Y2VsIDk3CgkJJHllYXIgICAgPSAweDA3Q0M7CQkJLy8JRXhjZWwgOTcKCgkJJHZlcnNpb24gPSAweDA2MDA7CQkJLy8JQklGRjgKCgkJJGhlYWRlciAgPSBwYWNrKCJ2diIsICAgJHJlY29yZCwgJGxlbmd0aCk7CgkJJGRhdGEgICAgPSBwYWNrKCJ2dnZ2IiwgJHZlcnNpb24sICR0eXBlLCAkYnVpbGQsICR5ZWFyKTsKCQkkdGhpcy0+X2FwcGVuZCgkaGVhZGVyIC4gJGRhdGEgLiAkdW5rbm93bik7Cgl9CgoJLyoqCgkgKiBXcml0ZXMgRXhjZWwgRU9GIHJlY29yZCB0byBpbmRpY2F0ZSB0aGUgZW5kIG9mIGEgQklGRiBzdHJlYW0uCgkgKgoJICogQGFjY2VzcyBwcml2YXRlCgkgKi8KCWZ1bmN0aW9uIF9zdG9yZUVvZigpCgl7CgkJJHJlY29yZCAgICA9IDB4MDAwQTsgICAvLyBSZWNvcmQgaWRlbnRpZmllcgoJCSRsZW5ndGggICAgPSAweDAwMDA7ICAgLy8gTnVtYmVyIG9mIGJ5dGVzIHRvIGZvbGxvdwoKCQkkaGVhZGVyICAgID0gcGFjaygidnYiLCAkcmVjb3JkLCAkbGVuZ3RoKTsKCQkkdGhpcy0+X2FwcGVuZCgkaGVhZGVyKTsKCX0KCgkvKioKCSAqIFdyaXRlcyBFeGNlbCBFT0YgcmVjb3JkIHRvIGluZGljYXRlIHRoZSBlbmQgb2YgYSBCSUZGIHN0cmVhbS4KCSAqCgkgKiBAYWNjZXNzIHByaXZhdGUKCSAqLwoJcHVibGljIGZ1bmN0aW9uIHdyaXRlRW9mKCkKCXsKCQkkcmVjb3JkICAgID0gMHgwMDBBOyAgIC8vIFJlY29yZCBpZGVudGlmaWVyCgkJJGxlbmd0aCAgICA9IDB4MDAwMDsgICAvLyBOdW1iZXIgb2YgYnl0ZXMgdG8gZm9sbG93CgkJJGhlYWRlciAgICA9IHBhY2soInZ2IiwgJHJlY29yZCwgJGxlbmd0aCk7CgkJcmV0dXJuICR0aGlzLT53cml0ZURhdGEoJGhlYWRlcik7Cgl9CgoJLyoqCgkgKiBFeGNlbCBsaW1pdHMgdGhlIHNpemUgb2YgQklGRiByZWNvcmRzLiBJbiBFeGNlbCA1IHRoZSBsaW1pdCBpcyAyMDg0IGJ5dGVzLiBJbgoJICogRXhjZWwgOTcgdGhlIGxpbWl0IGlzIDgyMjggYnl0ZXMuIFJlY29yZHMgdGhhdCBhcmUgbG9uZ2VyIHRoYW4gdGhlc2UgbGltaXRzCgkgKiBtdXN0IGJlIHNwbGl0IHVwIGludG8gQ09OVElOVUUgYmxvY2tzLgoJICoKCSAqIFRoaXMgZnVuY3Rpb24gdGFrZXMgYSBsb25nIEJJRkYgcmVjb3JkIGFuZCBpbnNlcnRzIENPTlRJTlVFIHJlY29yZHMgYXMKCSAqIG5lY2Vzc2FyeS4KCSAqCgkgKiBAcGFyYW0gIHN0cmluZyAgJGRhdGEgVGhlIG9yaWdpbmFsIGJpbmFyeSBkYXRhIHRvIGJlIHdyaXR0ZW4KCSAqIEByZXR1cm4gc3RyaW5nICAgICAgICBBIHZlcnkgY29udmVuaWVudCBzdHJpbmcgb2YgY29udGludWUgYmxvY2tzCgkgKiBAYWNjZXNzIHByaXZhdGUKCSAqLwoJZnVuY3Rpb24gX2FkZENvbnRpbnVlKCRkYXRhKQoJewoJCSRsaW1pdCAgPSAkdGhpcy0+X2xpbWl0OwoJCSRyZWNvcmQgPSAweDAwM0M7ICAgICAgICAgLy8gUmVjb3JkIGlkZW50aWZpZXIKCgkJLy8gVGhlIGZpcnN0IDIwODAvODIyNCBieXRlcyByZW1haW4gaW50YWN0LiBIb3dldmVyLCB3ZSBoYXZlIHRvIGNoYW5nZQoJCS8vIHRoZSBsZW5ndGggZmllbGQgb2YgdGhlIHJlY29yZC4KCQkkdG1wID0gc3Vic3RyKCRkYXRhLCAwLCAyKSAuIHBhY2soInYiLCAkbGltaXQpIC4gc3Vic3RyKCRkYXRhLCA0LCAkbGltaXQpOwoKCQkkaGVhZGVyID0gcGFjaygidnYiLCAkcmVjb3JkLCAkbGltaXQpOyAgLy8gSGVhZGVycyBmb3IgY29udGludWUgcmVjb3JkcwoKCQkvLyBSZXRyaWV2ZSBjaHVua3Mgb2YgMjA4MC84MjI0IGJ5dGVzICs0IGZvciB0aGUgaGVhZGVyLgoJCSRkYXRhX2xlbmd0aCA9IHN0cmxlbigkZGF0YSk7CgkJZm9yICgkaSA9ICRsaW1pdCArIDQ7ICRpIDwgKCRkYXRhX2xlbmd0aCAtICRsaW1pdCk7ICRpICs9ICRsaW1pdCkgewoJCQkkdG1wIC49ICRoZWFkZXI7CgkJCSR0bXAgLj0gc3Vic3RyKCRkYXRhLCAkaSwgJGxpbWl0KTsKCQl9CgoJCS8vIFJldHJpZXZlIHRoZSBsYXN0IGNodW5rIG9mIGRhdGEKCQkkaGVhZGVyICA9IHBhY2soInZ2IiwgJHJlY29yZCwgc3RybGVuKCRkYXRhKSAtICRpKTsKCQkkdG1wICAgIC49ICRoZWFkZXI7CgkJJHRtcCAgICAuPSBzdWJzdHIoJGRhdGEsICRpLCBzdHJsZW4oJGRhdGEpIC0gJGkpOwoKCQlyZXR1cm4gJHRtcDsKCX0KCn0K]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Writer/Excel5/Escher.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIFBIUEV4Y2VsCiAqCiAqIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICoKICogQGNhdGVnb3J5ICAgUEhQRXhjZWwKICogQHBhY2thZ2UgICAgUEhQRXhjZWxfV3JpdGVyX0V4Y2VsNQogKiBAY29weXJpZ2h0ICBDb3B5cmlnaHQgKGMpIDIwMDYgLSAyMDEyIFBIUEV4Y2VsIChodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9QSFBFeGNlbCkKICogQGxpY2Vuc2UgICAgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL29sZC1saWNlbnNlcy9sZ3BsLTIuMS50eHQJTEdQTAogKiBAdmVyc2lvbiAgICAxLjcuNywgMjAxMi0wNS0xOQogKi8KCgovKioKICogUEhQRXhjZWxfU2hhcmVkX0VzY2hlcl9EZ2dDb250YWluZXJfQnN0b3JlQ29udGFpbmVyCiAqCiAqIEBjYXRlZ29yeSAgIFBIUEV4Y2VsCiAqIEBwYWNrYWdlICAgIFBIUEV4Y2VsX1dyaXRlcl9FeGNlbDUKICogQGNvcHlyaWdodCAgQ29weXJpZ2h0IChjKSAyMDA2IC0gMjAxMiBQSFBFeGNlbCAoaHR0cDovL3d3dy5jb2RlcGxleC5jb20vUEhQRXhjZWwpCiAqLwpjbGFzcyBQSFBFeGNlbF9Xcml0ZXJfRXhjZWw1X0VzY2hlcgp7CgkvKioKCSAqIFRoZSBvYmplY3Qgd2UgYXJlIHdyaXRpbmcKCSAqLwoJcHJpdmF0ZSAkX29iamVjdDsKCgkvKioKCSAqIFRoZSB3cml0dGVuIGJpbmFyeSBkYXRhCgkgKi8KCXByaXZhdGUgJF9kYXRhOwoKCS8qKgoJICogU2hhcGUgb2Zmc2V0cy4gUG9zaXRpb25zIGluIGJpbmFyeSBzdHJlYW0gd2hlcmUgYSBuZXcgc2hhcGUgcmVjb3JkIGJlZ2lucwoJICoKCSAqIEB2YXIgYXJyYXkKCSAqLwoJcHJpdmF0ZSAkX3NwT2Zmc2V0czsKCgoJLyoqCgkgKiBDb25zdHJ1Y3RvcgoJICoKCSAqIEBwYXJhbSBtaXhlZAoJICovCglwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJG9iamVjdCkKCXsKCQkkdGhpcy0+X29iamVjdCA9ICRvYmplY3Q7Cgl9CgoJLyoqCgkgKiBQcm9jZXNzIHRoZSBvYmplY3QgdG8gYmUgd3JpdHRlbgoJICovCglwdWJsaWMgZnVuY3Rpb24gY2xvc2UoKQoJewoJCS8vIGluaXRpYWxpemUKCQkkdGhpcy0+X2RhdGEgPSAnJzsKCgkJc3dpdGNoIChnZXRfY2xhc3MoJHRoaXMtPl9vYmplY3QpKSB7CgoJCWNhc2UgJ1BIUEV4Y2VsX1NoYXJlZF9Fc2NoZXInOgoJCQlpZiAoJGRnZ0NvbnRhaW5lciA9ICR0aGlzLT5fb2JqZWN0LT5nZXREZ2dDb250YWluZXIoKSkgewoJCQkJJHdyaXRlciA9IG5ldyBQSFBFeGNlbF9Xcml0ZXJfRXhjZWw1X0VzY2hlcigkZGdnQ29udGFpbmVyKTsKCQkJCSR0aGlzLT5fZGF0YSA9ICR3cml0ZXItPmNsb3NlKCk7CgkJCX0gZWxzZSBpZiAoJGRnQ29udGFpbmVyID0gJHRoaXMtPl9vYmplY3QtPmdldERnQ29udGFpbmVyKCkpIHsKCQkJCSR3cml0ZXIgPSBuZXcgUEhQRXhjZWxfV3JpdGVyX0V4Y2VsNV9Fc2NoZXIoJGRnQ29udGFpbmVyKTsKCQkJCSR0aGlzLT5fZGF0YSA9ICR3cml0ZXItPmNsb3NlKCk7CgkJCQkkdGhpcy0+X3NwT2Zmc2V0cyA9ICR3cml0ZXItPmdldFNwT2Zmc2V0cygpOwoJCQl9CgkJCWJyZWFrOwoKCQljYXNlICdQSFBFeGNlbF9TaGFyZWRfRXNjaGVyX0RnZ0NvbnRhaW5lcic6CgkJCS8vIHRoaXMgaXMgYSBjb250YWluZXIgcmVjb3JkCgoJCQkvLyBpbml0aWFsaXplCgkJCSRpbm5lckRhdGEgPSAnJzsKCgkJCS8vIHdyaXRlIHRoZSBkZ2cKCQkJJHJlY1ZlcgkJCT0gMHgwOwoJCQkkcmVjSW5zdGFuY2UJPSAweDAwMDA7CgkJCSRyZWNUeXBlCQk9IDB4RjAwNjsKCgkJCSRyZWNWZXJJbnN0YW5jZSAgPSAkcmVjVmVyOwoJCQkkcmVjVmVySW5zdGFuY2UgfD0gJHJlY0luc3RhbmNlIDw8IDQ7CgoJCQkvLyBkZ2cgZGF0YQoJCQkkZGdnRGF0YSA9CgkJCQlwYWNrKCdWVlZWJwoJCQkJCSwgJHRoaXMtPl9vYmplY3QtPmdldFNwSWRNYXgoKSAvLyBtYXhpbXVtIHNoYXBlIGlkZW50aWZpZXIgaW5jcmVhc2VkIGJ5IG9uZQoJCQkJCSwgJHRoaXMtPl9vYmplY3QtPmdldENEZ1NhdmVkKCkgKyAxIC8vIG51bWJlciBvZiBmaWxlIGlkZW50aWZpZXIgY2x1c3RlcnMgaW5jcmVhc2VkIGJ5IG9uZQoJCQkJCSwgJHRoaXMtPl9vYmplY3QtPmdldENTcFNhdmVkKCkKCQkJCQksICR0aGlzLT5fb2JqZWN0LT5nZXRDRGdTYXZlZCgpIC8vIGNvdW50IHRvdGFsIG51bWJlciBvZiBkcmF3aW5ncyBzYXZlZAoJCQkJKTsKCgkJCS8vIGFkZCBmaWxlIGlkZW50aWZpZXIgY2x1c3RlcnMgKG9uZSBwZXIgZHJhd2luZykKCQkJJElEQ0xzID0gJHRoaXMtPl9vYmplY3QtPmdldElEQ0xzKCk7CgoJCQlmb3JlYWNoICgkSURDTHMgYXMgJGRnSWQgPT4gJG1heFJlZHVjZWRTcElkKSB7CgkJCQkkZGdnRGF0YSAuPSBwYWNrKCdWVicsICRkZ0lkLCAkbWF4UmVkdWNlZFNwSWQgKyAxKTsKCQkJfQoKCQkJJGhlYWRlciA9IHBhY2soJ3Z2VicsICRyZWNWZXJJbnN0YW5jZSwgJHJlY1R5cGUsIHN0cmxlbigkZGdnRGF0YSkpOwoJCQkkaW5uZXJEYXRhIC49ICRoZWFkZXIgLiAkZGdnRGF0YTsKCgkJCS8vIHdyaXRlIHRoZSBic3RvcmVDb250YWluZXIKCQkJaWYgKCRic3RvcmVDb250YWluZXIgPSAkdGhpcy0+X29iamVjdC0+Z2V0QnN0b3JlQ29udGFpbmVyKCkpIHsKCQkJCSR3cml0ZXIgPSBuZXcgUEhQRXhjZWxfV3JpdGVyX0V4Y2VsNV9Fc2NoZXIoJGJzdG9yZUNvbnRhaW5lcik7CgkJCQkkaW5uZXJEYXRhIC49ICR3cml0ZXItPmNsb3NlKCk7CgkJCX0KCgkJCS8vIHdyaXRlIHRoZSByZWNvcmQKCQkJJHJlY1ZlcgkJCT0gMHhGOwoJCQkkcmVjSW5zdGFuY2UJPSAweDAwMDA7CgkJCSRyZWNUeXBlCQk9IDB4RjAwMDsKCQkJJGxlbmd0aAkJCT0gc3RybGVuKCRpbm5lckRhdGEpOwoKCQkJJHJlY1Zlckluc3RhbmNlICA9ICRyZWNWZXI7CgkJCSRyZWNWZXJJbnN0YW5jZSB8PSAkcmVjSW5zdGFuY2UgPDwgNDsKCgkJCSRoZWFkZXIgPSBwYWNrKCd2dlYnLCAkcmVjVmVySW5zdGFuY2UsICRyZWNUeXBlLCAkbGVuZ3RoKTsKCgkJCSR0aGlzLT5fZGF0YSA9ICRoZWFkZXIgLiAkaW5uZXJEYXRhOwoJCQlicmVhazsKCgkJY2FzZSAnUEhQRXhjZWxfU2hhcmVkX0VzY2hlcl9EZ2dDb250YWluZXJfQnN0b3JlQ29udGFpbmVyJzoKCQkJLy8gdGhpcyBpcyBhIGNvbnRhaW5lciByZWNvcmQKCgkJCS8vIGluaXRpYWxpemUKCQkJJGlubmVyRGF0YSA9ICcnOwoKCQkJLy8gdHJlYXQgdGhlIGlubmVyIGRhdGEKCQkJaWYgKCRCU0VDb2xsZWN0aW9uID0gJHRoaXMtPl9vYmplY3QtPmdldEJTRUNvbGxlY3Rpb24oKSkgewoJCQkJZm9yZWFjaCAoJEJTRUNvbGxlY3Rpb24gYXMgJEJTRSkgewoJCQkJCSR3cml0ZXIgPSBuZXcgUEhQRXhjZWxfV3JpdGVyX0V4Y2VsNV9Fc2NoZXIoJEJTRSk7CgkJCQkJJGlubmVyRGF0YSAuPSAkd3JpdGVyLT5jbG9zZSgpOwoJCQkJfQoJCQl9CgoJCQkvLyB3cml0ZSB0aGUgcmVjb3JkCgkJCSRyZWNWZXIJCQk9IDB4RjsKCQkJJHJlY0luc3RhbmNlCT0gY291bnQoJHRoaXMtPl9vYmplY3QtPmdldEJTRUNvbGxlY3Rpb24oKSk7CgkJCSRyZWNUeXBlCQk9IDB4RjAwMTsKCQkJJGxlbmd0aAkJCT0gc3RybGVuKCRpbm5lckRhdGEpOwoKCQkJJHJlY1Zlckluc3RhbmNlICA9ICRyZWNWZXI7CgkJCSRyZWNWZXJJbnN0YW5jZSB8PSAkcmVjSW5zdGFuY2UgPDwgNDsKCgkJCSRoZWFkZXIgPSBwYWNrKCd2dlYnLCAkcmVjVmVySW5zdGFuY2UsICRyZWNUeXBlLCAkbGVuZ3RoKTsKCgkJCSR0aGlzLT5fZGF0YSA9ICRoZWFkZXIgLiAkaW5uZXJEYXRhOwoJCQlicmVhazsKCgkJY2FzZSAnUEhQRXhjZWxfU2hhcmVkX0VzY2hlcl9EZ2dDb250YWluZXJfQnN0b3JlQ29udGFpbmVyX0JTRSc6CgkJCS8vIHRoaXMgaXMgYSBzZW1pLWNvbnRhaW5lciByZWNvcmQKCgkJCS8vIGluaXRpYWxpemUKCQkJJGlubmVyRGF0YSA9ICcnOwoKCQkJLy8gaGVyZSB3ZSB0cmVhdCB0aGUgaW5uZXIgZGF0YQoJCQlpZiAoJGJsaXAgPSAkdGhpcy0+X29iamVjdC0+Z2V0QmxpcCgpKSB7CgkJCQkkd3JpdGVyID0gbmV3IFBIUEV4Y2VsX1dyaXRlcl9FeGNlbDVfRXNjaGVyKCRibGlwKTsKCQkJCSRpbm5lckRhdGEgLj0gJHdyaXRlci0+Y2xvc2UoKTsKCQkJfQoKCQkJLy8gaW5pdGlhbGl6ZQoJCQkkZGF0YSA9ICcnOwoKCQkJJGJ0V2luMzIgPSAkdGhpcy0+X29iamVjdC0+Z2V0QmxpcFR5cGUoKTsKCQkJJGJ0TWFjT1MgPSAkdGhpcy0+X29iamVjdC0+Z2V0QmxpcFR5cGUoKTsKCQkJJGRhdGEgLj0gcGFjaygnQ0MnLCAkYnRXaW4zMiwgJGJ0TWFjT1MpOwoKCQkJJHJnYlVpZCA9IHBhY2soJ1ZWVlYnLCAwLDAsMCwwKTsgLy8gdG9kbwoJCQkkZGF0YSAuPSAkcmdiVWlkOwoKCQkJJHRhZyA9IDA7CgkJCSRzaXplID0gc3RybGVuKCRpbm5lckRhdGEpOwoJCQkkY1JlZiA9IDE7CgkJCSRmb0RlbGF5ID0gMDsgLy90b2RvCgkJCSR1bnVzZWQxID0gMHgwOwoJCQkkY2JOYW1lID0gMHgwOwoJCQkkdW51c2VkMiA9IDB4MDsKCQkJJHVudXNlZDMgPSAweDA7CgkJCSRkYXRhIC49IHBhY2soJ3ZWVlZDQ0NDJywgJHRhZywgJHNpemUsICRjUmVmLCAkZm9EZWxheSwgJHVudXNlZDEsICRjYk5hbWUsICR1bnVzZWQyLCAkdW51c2VkMyk7CgoJCQkkZGF0YSAuPSAkaW5uZXJEYXRhOwoKCQkJLy8gd3JpdGUgdGhlIHJlY29yZAoJCQkkcmVjVmVyCQkJPSAweDI7CgkJCSRyZWNJbnN0YW5jZQk9ICR0aGlzLT5fb2JqZWN0LT5nZXRCbGlwVHlwZSgpOwoJCQkkcmVjVHlwZQkJPSAweEYwMDc7CgkJCSRsZW5ndGgJCQk9IHN0cmxlbigkZGF0YSk7CgoJCQkkcmVjVmVySW5zdGFuY2UgID0gJHJlY1ZlcjsKCQkJJHJlY1Zlckluc3RhbmNlIHw9CSRyZWNJbnN0YW5jZSA8PCA0OwoKCQkJJGhlYWRlciA9IHBhY2soJ3Z2VicsICRyZWNWZXJJbnN0YW5jZSwgJHJlY1R5cGUsICRsZW5ndGgpOwoKCQkJJHRoaXMtPl9kYXRhID0gJGhlYWRlcjsKCgkJCSR0aGlzLT5fZGF0YSAuPSAkZGF0YTsKCQkJYnJlYWs7CgoJCWNhc2UgJ1BIUEV4Y2VsX1NoYXJlZF9Fc2NoZXJfRGdnQ29udGFpbmVyX0JzdG9yZUNvbnRhaW5lcl9CU0VfQmxpcCc6CgkJCS8vIHRoaXMgaXMgYW4gYXRvbSByZWNvcmQKCgkJCS8vIHdyaXRlIHRoZSByZWNvcmQKCQkJc3dpdGNoICgkdGhpcy0+X29iamVjdC0+Z2V0UGFyZW50KCktPmdldEJsaXBUeXBlKCkpIHsKCgkJCWNhc2UgUEhQRXhjZWxfU2hhcmVkX0VzY2hlcl9EZ2dDb250YWluZXJfQnN0b3JlQ29udGFpbmVyX0JTRTo6QkxJUFRZUEVfSlBFRzoKCQkJCS8vIGluaXRpYWxpemUKCQkJCSRpbm5lckRhdGEgPSAnJzsKCgkJCQkkcmdiVWlkMSA9IHBhY2soJ1ZWVlYnLCAwLDAsMCwwKTsgLy8gdG9kbwoJCQkJJGlubmVyRGF0YSAuPSAkcmdiVWlkMTsKCgkJCQkkdGFnID0gMHhGRjsgLy8gdG9kbwoJCQkJJGlubmVyRGF0YSAuPSBwYWNrKCdDJywgJHRhZyk7CgoJCQkJJGlubmVyRGF0YSAuPSAkdGhpcy0+X29iamVjdC0+Z2V0RGF0YSgpOwoKCQkJCSRyZWNWZXIJCQk9IDB4MDsKCQkJCSRyZWNJbnN0YW5jZQk9IDB4NDZBOwoJCQkJJHJlY1R5cGUJCT0gMHhGMDFEOwoJCQkJJGxlbmd0aAkJCT0gc3RybGVuKCRpbm5lckRhdGEpOwoKCQkJCSRyZWNWZXJJbnN0YW5jZSAgPSAkcmVjVmVyOwoJCQkJJHJlY1Zlckluc3RhbmNlIHw9CSRyZWNJbnN0YW5jZSA8PCA0OwoKCQkJCSRoZWFkZXIgPSBwYWNrKCd2dlYnLCAkcmVjVmVySW5zdGFuY2UsICRyZWNUeXBlLCAkbGVuZ3RoKTsKCgkJCQkkdGhpcy0+X2RhdGEgPSAkaGVhZGVyOwoKCQkJCSR0aGlzLT5fZGF0YSAuPSAkaW5uZXJEYXRhOwoJCQkJYnJlYWs7CgoJCQljYXNlIFBIUEV4Y2VsX1NoYXJlZF9Fc2NoZXJfRGdnQ29udGFpbmVyX0JzdG9yZUNvbnRhaW5lcl9CU0U6OkJMSVBUWVBFX1BORzoKCQkJCS8vIGluaXRpYWxpemUKCQkJCSRpbm5lckRhdGEgPSAnJzsKCgkJCQkkcmdiVWlkMSA9IHBhY2soJ1ZWVlYnLCAwLDAsMCwwKTsgLy8gdG9kbwoJCQkJJGlubmVyRGF0YSAuPSAkcmdiVWlkMTsKCgkJCQkkdGFnID0gMHhGRjsgLy8gdG9kbwoJCQkJJGlubmVyRGF0YSAuPSBwYWNrKCdDJywgJHRhZyk7CgoJCQkJJGlubmVyRGF0YSAuPSAkdGhpcy0+X29iamVjdC0+Z2V0RGF0YSgpOwoKCQkJCSRyZWNWZXIJCQk9IDB4MDsKCQkJCSRyZWNJbnN0YW5jZQk9IDB4NkUwOwoJCQkJJHJlY1R5cGUJCT0gMHhGMDFFOwoJCQkJJGxlbmd0aAkJCT0gc3RybGVuKCRpbm5lckRhdGEpOwoKCQkJCSRyZWNWZXJJbnN0YW5jZSAgPSAkcmVjVmVyOwoJCQkJJHJlY1Zlckluc3RhbmNlIHw9CSRyZWNJbnN0YW5jZSA8PCA0OwoKCQkJCSRoZWFkZXIgPSBwYWNrKCd2dlYnLCAkcmVjVmVySW5zdGFuY2UsICRyZWNUeXBlLCAkbGVuZ3RoKTsKCgkJCQkkdGhpcy0+X2RhdGEgPSAkaGVhZGVyOwoKCQkJCSR0aGlzLT5fZGF0YSAuPSAkaW5uZXJEYXRhOwoJCQkJYnJlYWs7CgoJCQl9CgkJCWJyZWFrOwoKCQljYXNlICdQSFBFeGNlbF9TaGFyZWRfRXNjaGVyX0RnQ29udGFpbmVyJzoKCQkJLy8gdGhpcyBpcyBhIGNvbnRhaW5lciByZWNvcmQKCgkJCS8vIGluaXRpYWxpemUKCQkJJGlubmVyRGF0YSA9ICcnOwoKCQkJLy8gd3JpdGUgdGhlIGRnCgkJCSRyZWNWZXIJCQk9IDB4MDsKCQkJJHJlY0luc3RhbmNlCT0gJHRoaXMtPl9vYmplY3QtPmdldERnSWQoKTsKCQkJJHJlY1R5cGUJCT0gMHhGMDA4OwoJCQkkbGVuZ3RoCQkJPSA4OwoKCQkJJHJlY1Zlckluc3RhbmNlICA9ICRyZWNWZXI7CgkJCSRyZWNWZXJJbnN0YW5jZSB8PSAkcmVjSW5zdGFuY2UgPDwgNDsKCgkJCSRoZWFkZXIgPSBwYWNrKCd2dlYnLCAkcmVjVmVySW5zdGFuY2UsICRyZWNUeXBlLCAkbGVuZ3RoKTsKCgkJCS8vIG51bWJlciBvZiBzaGFwZXMgaW4gdGhpcyBkcmF3aW5nIChpbmNsdWRpbmcgZ3JvdXAgc2hhcGUpCgkJCSRjb3VudFNoYXBlcyA9IGNvdW50KCR0aGlzLT5fb2JqZWN0LT5nZXRTcGdyQ29udGFpbmVyKCktPmdldENoaWxkcmVuKCkpOwoJCQkkaW5uZXJEYXRhIC49ICRoZWFkZXIgLiBwYWNrKCdWVicsICRjb3VudFNoYXBlcywgJHRoaXMtPl9vYmplY3QtPmdldExhc3RTcElkKCkpOwoJCQkvLyRpbm5lckRhdGEgLj0gJGhlYWRlciAuIHBhY2soJ1ZWJywgMCwgMCk7CgoJCQkvLyB3cml0ZSB0aGUgc3BnckNvbnRhaW5lcgoJCQlpZiAoJHNwZ3JDb250YWluZXIgPSAkdGhpcy0+X29iamVjdC0+Z2V0U3BnckNvbnRhaW5lcigpKSB7CgkJCQkkd3JpdGVyID0gbmV3IFBIUEV4Y2VsX1dyaXRlcl9FeGNlbDVfRXNjaGVyKCRzcGdyQ29udGFpbmVyKTsKCQkJCSRpbm5lckRhdGEgLj0gJHdyaXRlci0+Y2xvc2UoKTsKCgkJCQkvLyBnZXQgdGhlIHNoYXBlIG9mZnNldHMgcmVsYXRpdmUgdG8gdGhlIHNwZ3JDb250YWluZXIgcmVjb3JkCgkJCQkkc3BPZmZzZXRzID0gJHdyaXRlci0+Z2V0U3BPZmZzZXRzKCk7CgoJCQkJLy8gc2F2ZSB0aGUgc2hhcGUgb2Zmc2V0cyByZWxhdGl2ZSB0byBkZ0NvbnRhaW5lcgoJCQkJZm9yZWFjaCAoJHNwT2Zmc2V0cyBhcyAmICRzcE9mZnNldCkgewoJCQkJCSRzcE9mZnNldCArPSAyNDsgLy8gYWRkIGxlbmd0aCBvZiBkZ0NvbnRhaW5lciBoZWFkZXIgZGF0YSAoOCBieXRlcykgcGx1cyBkZyBkYXRhICgxNiBieXRlcykKCQkJCX0KCgkJCQkkdGhpcy0+X3NwT2Zmc2V0cyA9ICRzcE9mZnNldHM7CgkJCX0KCgkJCS8vIHdyaXRlIHRoZSByZWNvcmQKCQkJJHJlY1ZlcgkJCT0gMHhGOwoJCQkkcmVjSW5zdGFuY2UJPSAweDAwMDA7CgkJCSRyZWNUeXBlCQk9IDB4RjAwMjsKCQkJJGxlbmd0aAkJCT0gc3RybGVuKCRpbm5lckRhdGEpOwoKCQkJJHJlY1Zlckluc3RhbmNlICA9ICRyZWNWZXI7CgkJCSRyZWNWZXJJbnN0YW5jZSB8PSAkcmVjSW5zdGFuY2UgPDwgNDsKCgkJCSRoZWFkZXIgPSBwYWNrKCd2dlYnLCAkcmVjVmVySW5zdGFuY2UsICRyZWNUeXBlLCAkbGVuZ3RoKTsKCgkJCSR0aGlzLT5fZGF0YSA9ICRoZWFkZXIgLiAkaW5uZXJEYXRhOwoJCQlicmVhazsKCgkJY2FzZSAnUEhQRXhjZWxfU2hhcmVkX0VzY2hlcl9EZ0NvbnRhaW5lcl9TcGdyQ29udGFpbmVyJzoKCQkJLy8gdGhpcyBpcyBhIGNvbnRhaW5lciByZWNvcmQKCgkJCS8vIGluaXRpYWxpemUKCQkJJGlubmVyRGF0YSA9ICcnOwoKCQkJLy8gaW5pdGlhbGl6ZSBzcGFwZSBvZmZzZXRzCgkJCSR0b3RhbFNpemUgPSA4OwoJCQkkc3BPZmZzZXRzID0gYXJyYXkoKTsKCgkJCS8vIHRyZWF0IHRoZSBpbm5lciBkYXRhCgkJCWZvcmVhY2ggKCR0aGlzLT5fb2JqZWN0LT5nZXRDaGlsZHJlbigpIGFzICRzcENvbnRhaW5lcikgewoJCQkJJHdyaXRlciA9IG5ldyBQSFBFeGNlbF9Xcml0ZXJfRXhjZWw1X0VzY2hlcigkc3BDb250YWluZXIpOwoJCQkJJHNwRGF0YSA9ICR3cml0ZXItPmNsb3NlKCk7CgkJCQkkaW5uZXJEYXRhIC49ICRzcERhdGE7CgoJCQkJLy8gc2F2ZSB0aGUgc2hhcGUgb2Zmc2V0cyAod2hlcmUgbmV3IHNoYXBlIHJlY29yZHMgYmVnaW4pCgkJCQkkdG90YWxTaXplICs9IHN0cmxlbigkc3BEYXRhKTsKCQkJCSRzcE9mZnNldHNbXSA9ICR0b3RhbFNpemU7CgkJCX0KCgkJCS8vIHdyaXRlIHRoZSByZWNvcmQKCQkJJHJlY1ZlcgkJCT0gMHhGOwoJCQkkcmVjSW5zdGFuY2UJPSAweDAwMDA7CgkJCSRyZWNUeXBlCQk9IDB4RjAwMzsKCQkJJGxlbmd0aAkJCT0gc3RybGVuKCRpbm5lckRhdGEpOwoKCQkJJHJlY1Zlckluc3RhbmNlICA9ICRyZWNWZXI7CgkJCSRyZWNWZXJJbnN0YW5jZSB8PSAkcmVjSW5zdGFuY2UgPDwgNDsKCgkJCSRoZWFkZXIgPSBwYWNrKCd2dlYnLCAkcmVjVmVySW5zdGFuY2UsICRyZWNUeXBlLCAkbGVuZ3RoKTsKCgkJCSR0aGlzLT5fZGF0YSA9ICRoZWFkZXIgLiAkaW5uZXJEYXRhOwoJCQkkdGhpcy0+X3NwT2Zmc2V0cyA9ICRzcE9mZnNldHM7CgkJCWJyZWFrOwoKCQljYXNlICdQSFBFeGNlbF9TaGFyZWRfRXNjaGVyX0RnQ29udGFpbmVyX1NwZ3JDb250YWluZXJfU3BDb250YWluZXInOgoJCQkvLyBpbml0aWFsaXplCgkJCSRkYXRhID0gJyc7CgoJCQkvLyBidWlsZCB0aGUgZGF0YQoKCQkJLy8gd3JpdGUgZ3JvdXAgc2hhcGUgcmVjb3JkLCBpZiBuZWNlc3Nhcnk/CgkJCWlmICgkdGhpcy0+X29iamVjdC0+Z2V0U3BncigpKSB7CgkJCQkkcmVjVmVyCQkJPSAweDE7CgkJCQkkcmVjSW5zdGFuY2UJPSAweDAwMDA7CgkJCQkkcmVjVHlwZQkJPSAweEYwMDk7CgkJCQkkbGVuZ3RoCQkJPSAweDAwMDAwMDEwOwoKCQkJCSRyZWNWZXJJbnN0YW5jZSAgPSAkcmVjVmVyOwoJCQkJJHJlY1Zlckluc3RhbmNlIHw9ICRyZWNJbnN0YW5jZSA8PCA0OwoKCQkJCSRoZWFkZXIgPSBwYWNrKCd2dlYnLCAkcmVjVmVySW5zdGFuY2UsICRyZWNUeXBlLCAkbGVuZ3RoKTsKCgkJCQkkZGF0YSAuPSAkaGVhZGVyIC4gcGFjaygnVlZWVicsIDAsMCwwLDApOwoJCQl9CgoJCQkvLyB3cml0ZSB0aGUgc2hhcGUgcmVjb3JkCgkJCSRyZWNWZXIJCQk9IDB4MjsKCQkJJHJlY0luc3RhbmNlCT0gJHRoaXMtPl9vYmplY3QtPmdldFNwVHlwZSgpOyAvLyBzaGFwZSB0eXBlCgkJCSRyZWNUeXBlCQk9IDB4RjAwQTsKCQkJJGxlbmd0aAkJCT0gMHgwMDAwMDAwODsKCgkJCSRyZWNWZXJJbnN0YW5jZSAgPSAkcmVjVmVyOwoJCQkkcmVjVmVySW5zdGFuY2UgfD0gJHJlY0luc3RhbmNlIDw8IDQ7CgoJCQkkaGVhZGVyID0gcGFjaygndnZWJywgJHJlY1Zlckluc3RhbmNlLCAkcmVjVHlwZSwgJGxlbmd0aCk7CgoJCQkkZGF0YSAuPSAkaGVhZGVyIC4gcGFjaygnVlYnLCAkdGhpcy0+X29iamVjdC0+Z2V0U3BJZCgpLCAkdGhpcy0+X29iamVjdC0+Z2V0U3BncigpID8gMHgwMDA1IDogMHgwQTAwKTsKCgoJCQkvLyB0aGUgb3B0aW9ucwoJCQlpZiAoJHRoaXMtPl9vYmplY3QtPmdldE9QVENvbGxlY3Rpb24oKSkgewoJCQkJJG9wdERhdGEgPSAnJzsKCgkJCQkkcmVjVmVyCQkJPSAweDM7CgkJCQkkcmVjSW5zdGFuY2UJPSBjb3VudCgkdGhpcy0+X29iamVjdC0+Z2V0T1BUQ29sbGVjdGlvbigpKTsKCQkJCSRyZWNUeXBlCQk9IDB4RjAwQjsKCQkJCWZvcmVhY2ggKCR0aGlzLT5fb2JqZWN0LT5nZXRPUFRDb2xsZWN0aW9uKCkgYXMgJHByb3BlcnR5ID0+ICR2YWx1ZSkgewoJCQkJCSRvcHREYXRhIC49IHBhY2soJ3ZWJywgJHByb3BlcnR5LCAkdmFsdWUpOwoJCQkJfQoJCQkJJGxlbmd0aAkJCT0gc3RybGVuKCRvcHREYXRhKTsKCgkJCQkkcmVjVmVySW5zdGFuY2UgID0gJHJlY1ZlcjsKCQkJCSRyZWNWZXJJbnN0YW5jZSB8PSAkcmVjSW5zdGFuY2UgPDwgNDsKCgkJCQkkaGVhZGVyID0gcGFjaygndnZWJywgJHJlY1Zlckluc3RhbmNlLCAkcmVjVHlwZSwgJGxlbmd0aCk7CgkJCQkkZGF0YSAuPSAkaGVhZGVyIC4gJG9wdERhdGE7CgkJCX0KCgkJCS8vIHRoZSBjbGllbnQgYW5jaG9yCgkJCWlmICgkdGhpcy0+X29iamVjdC0+Z2V0U3RhcnRDb29yZGluYXRlcygpKSB7CgkJCQkkY2xpZW50QW5jaG9yRGF0YSA9ICcnOwoKCQkJCSRyZWNWZXIJCQk9IDB4MDsKCQkJCSRyZWNJbnN0YW5jZQk9IDB4MDsKCQkJCSRyZWNUeXBlCQk9IDB4RjAxMDsKCgkJCQkvLyBzdGFydCBjb29yZGluYXRlcwoJCQkJbGlzdCgkY29sdW1uLCAkcm93KSA9IFBIUEV4Y2VsX0NlbGw6OmNvb3JkaW5hdGVGcm9tU3RyaW5nKCR0aGlzLT5fb2JqZWN0LT5nZXRTdGFydENvb3JkaW5hdGVzKCkpOwoJCQkJJGMxID0gUEhQRXhjZWxfQ2VsbDo6Y29sdW1uSW5kZXhGcm9tU3RyaW5nKCRjb2x1bW4pIC0gMTsKCQkJCSRyMSA9ICRyb3cgLSAxOwoKCQkJCS8vIHN0YXJ0IG9mZnNldFgKCQkJCSRzdGFydE9mZnNldFggPSAkdGhpcy0+X29iamVjdC0+Z2V0U3RhcnRPZmZzZXRYKCk7CgoJCQkJLy8gc3RhcnQgb2Zmc2V0WQoJCQkJJHN0YXJ0T2Zmc2V0WSA9ICR0aGlzLT5fb2JqZWN0LT5nZXRTdGFydE9mZnNldFkoKTsKCgkJCQkvLyBlbmQgY29vcmRpbmF0ZXMKCQkJCWxpc3QoJGNvbHVtbiwgJHJvdykgPSBQSFBFeGNlbF9DZWxsOjpjb29yZGluYXRlRnJvbVN0cmluZygkdGhpcy0+X29iamVjdC0+Z2V0RW5kQ29vcmRpbmF0ZXMoKSk7CgkJCQkkYzIgPSBQSFBFeGNlbF9DZWxsOjpjb2x1bW5JbmRleEZyb21TdHJpbmcoJGNvbHVtbikgLSAxOwoJCQkJJHIyID0gJHJvdyAtIDE7CgoJCQkJLy8gZW5kIG9mZnNldFgKCQkJCSRlbmRPZmZzZXRYID0gJHRoaXMtPl9vYmplY3QtPmdldEVuZE9mZnNldFgoKTsKCgkJCQkvLyBlbmQgb2Zmc2V0WQoJCQkJJGVuZE9mZnNldFkgPSAkdGhpcy0+X29iamVjdC0+Z2V0RW5kT2Zmc2V0WSgpOwoKCQkJCSRjbGllbnRBbmNob3JEYXRhID0gcGFjaygndnZ2dnZ2dnZ2JywgMHgwMiwKCQkJCQkkYzEsICRzdGFydE9mZnNldFgsICRyMSwgJHN0YXJ0T2Zmc2V0WSwKCQkJCQkkYzIsICRlbmRPZmZzZXRYLCAkcjIsICRlbmRPZmZzZXRZKTsKCgkJCQkkbGVuZ3RoCQkJPSBzdHJsZW4oJGNsaWVudEFuY2hvckRhdGEpOwoKCQkJCSRyZWNWZXJJbnN0YW5jZSAgPSAkcmVjVmVyOwoJCQkJJHJlY1Zlckluc3RhbmNlIHw9ICRyZWNJbnN0YW5jZSA8PCA0OwoKCQkJCSRoZWFkZXIgPSBwYWNrKCd2dlYnLCAkcmVjVmVySW5zdGFuY2UsICRyZWNUeXBlLCAkbGVuZ3RoKTsKCQkJCSRkYXRhIC49ICRoZWFkZXIgLiAkY2xpZW50QW5jaG9yRGF0YTsKCQkJfQoKCQkJLy8gdGhlIGNsaWVudCBkYXRhLCBqdXN0IGVtcHR5IGZvciBub3cKCQkJaWYgKCEkdGhpcy0+X29iamVjdC0+Z2V0U3BncigpKSB7CgkJCQkkY2xpZW50RGF0YURhdGEgPSAnJzsKCgkJCQkkcmVjVmVyCQkJPSAweDA7CgkJCQkkcmVjSW5zdGFuY2UJPSAweDA7CgkJCQkkcmVjVHlwZQkJPSAweEYwMTE7CgoJCQkJJGxlbmd0aCA9IHN0cmxlbigkY2xpZW50RGF0YURhdGEpOwoKCQkJCSRyZWNWZXJJbnN0YW5jZSAgPSAkcmVjVmVyOwoJCQkJJHJlY1Zlckluc3RhbmNlIHw9ICRyZWNJbnN0YW5jZSA8PCA0OwoKCQkJCSRoZWFkZXIgPSBwYWNrKCd2dlYnLCAkcmVjVmVySW5zdGFuY2UsICRyZWNUeXBlLCAkbGVuZ3RoKTsKCQkJCSRkYXRhIC49ICRoZWFkZXIgLiAkY2xpZW50RGF0YURhdGE7CgkJCX0KCgkJCS8vIHdyaXRlIHRoZSByZWNvcmQKCQkJJHJlY1ZlcgkJCT0gMHhGOwoJCQkkcmVjSW5zdGFuY2UJPSAweDAwMDA7CgkJCSRyZWNUeXBlCQk9IDB4RjAwNDsKCQkJJGxlbmd0aAkJCT0gc3RybGVuKCRkYXRhKTsKCgkJCSRyZWNWZXJJbnN0YW5jZSAgPSAkcmVjVmVyOwoJCQkkcmVjVmVySW5zdGFuY2UgfD0gJHJlY0luc3RhbmNlIDw8IDQ7CgoJCQkkaGVhZGVyID0gcGFjaygndnZWJywgJHJlY1Zlckluc3RhbmNlLCAkcmVjVHlwZSwgJGxlbmd0aCk7CgoJCQkkdGhpcy0+X2RhdGEgPSAkaGVhZGVyIC4gJGRhdGE7CgkJCWJyZWFrOwoKCQl9CgoJCXJldHVybiAkdGhpcy0+X2RhdGE7Cgl9CgoJLyoqCgkgKiBHZXRzIHRoZSBzaGFwZSBvZmZzZXRzCgkgKgoJICogQHJldHVybiBhcnJheQoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0U3BPZmZzZXRzKCkKCXsKCQlyZXR1cm4gJHRoaXMtPl9zcE9mZnNldHM7Cgl9Cgp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Writer/Excel5/Font.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIFBIUEV4Y2VsCiAqCiAqIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICoKICogQGNhdGVnb3J5ICAgUEhQRXhjZWwKICogQHBhY2thZ2UgICAgUEhQRXhjZWxfV3JpdGVyX0V4Y2VsNQogKiBAY29weXJpZ2h0ICBDb3B5cmlnaHQgKGMpIDIwMDYgLSAyMDEyIFBIUEV4Y2VsIChodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9QSFBFeGNlbCkKICogQGxpY2Vuc2UgICAgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL29sZC1saWNlbnNlcy9sZ3BsLTIuMS50eHQJTEdQTAogKiBAdmVyc2lvbiAgICAxLjcuNywgMjAxMi0wNS0xOQogKi8KCgovKioKICogUEhQRXhjZWxfV3JpdGVyX0V4Y2VsNV9Gb250CiAqCiAqIEBjYXRlZ29yeSAgIFBIUEV4Y2VsCiAqIEBwYWNrYWdlICAgIFBIUEV4Y2VsX1dyaXRlcl9FeGNlbDUKICogQGNvcHlyaWdodCAgQ29weXJpZ2h0IChjKSAyMDA2IC0gMjAxMiBQSFBFeGNlbCAoaHR0cDovL3d3dy5jb2RlcGxleC5jb20vUEhQRXhjZWwpCiAqLwpjbGFzcyBQSFBFeGNlbF9Xcml0ZXJfRXhjZWw1X0ZvbnQKewoJLyoqCgkgKiBDb2xvciBpbmRleAoJICoKCSAqIEB2YXIgaW50CgkgKi8KCXByaXZhdGUgJF9jb2xvckluZGV4OwoKCS8qKgoJICogRm9udAoJICoKCSAqIEB2YXIgUEhQRXhjZWxfU3R5bGVfRm9udAoJICovCglwcml2YXRlICRfZm9udDsKCgkvKioKCSAqIENvbnN0cnVjdG9yCgkgKgoJICogQHBhcmFtIFBIUEV4Y2VsX1N0eWxlX0ZvbnQgJGZvbnQKCSAqLwoJcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KFBIUEV4Y2VsX1N0eWxlX0ZvbnQgJGZvbnQgPSBudWxsKQoJewoJCSR0aGlzLT5fY29sb3JJbmRleCA9IDB4N0ZGRjsKCQkkdGhpcy0+X2ZvbnQgPSAkZm9udDsKCX0KCgkvKioKCSAqIFNldCB0aGUgY29sb3IgaW5kZXgKCSAqCgkgKiBAcGFyYW0gaW50ICRjb2xvckluZGV4CgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBzZXRDb2xvckluZGV4KCRjb2xvckluZGV4KQoJewoJCSR0aGlzLT5fY29sb3JJbmRleCA9ICRjb2xvckluZGV4OwoJfQoKCS8qKgoJICogR2V0IGZvbnQgcmVjb3JkIGRhdGEKCSAqCgkgKiBAcmV0dXJuIHN0cmluZwoJICovCglwdWJsaWMgZnVuY3Rpb24gd3JpdGVGb250KCkKCXsKCQkkZm9udF9vdXRsaW5lID0gMDsKCQkkZm9udF9zaGFkb3cgPSAwOwoKCQkkaWN2ID0gJHRoaXMtPl9jb2xvckluZGV4OyAvLyBJbmRleCB0byBjb2xvciBwYWxldHRlCgkJaWYgKCR0aGlzLT5fZm9udC0+Z2V0U3VwZXJTY3JpcHQoKSkgewoJCQkkc3NzID0gMTsKCQl9IGVsc2UgaWYgKCR0aGlzLT5fZm9udC0+Z2V0U3ViU2NyaXB0KCkpIHsKCQkJJHNzcyA9IDI7CgkJfSBlbHNlIHsKCQkJJHNzcyA9IDA7CgkJfQoJCSRiRmFtaWx5ID0gMDsgLy8gRm9udCBmYW1pbHkKCQkkYkNoYXJTZXQgPSBQSFBFeGNlbF9TaGFyZWRfRm9udDo6Z2V0Q2hhcnNldEZyb21Gb250TmFtZSgkdGhpcy0+X2ZvbnQtPmdldE5hbWUoKSk7IC8vIENoYXJhY3RlciBzZXQKCgkJJHJlY29yZCA9IDB4MzE7CQkvLyBSZWNvcmQgaWRlbnRpZmllcgoJCSRyZXNlcnZlZCA9IDB4MDA7CS8vIFJlc2VydmVkCgkJJGdyYml0ID0gMHgwMDsJCS8vIEZvbnQgYXR0cmlidXRlcwoJCWlmICgkdGhpcy0+X2ZvbnQtPmdldEl0YWxpYygpKSB7CgkJCSRncmJpdCB8PSAweDAyOwoJCX0KCQlpZiAoJHRoaXMtPl9mb250LT5nZXRTdHJpa2V0aHJvdWdoKCkpIHsKCQkJJGdyYml0IHw9IDB4MDg7CgkJfQoJCWlmICgkZm9udF9vdXRsaW5lKSB7CgkJCSRncmJpdCB8PSAweDEwOwoJCX0KCQlpZiAoJGZvbnRfc2hhZG93KSB7CgkJCSRncmJpdCB8PSAweDIwOwoJCX0KCgkJJGRhdGEgPSBwYWNrKCJ2dnZ2dkNDQ0MiLAoJCQkkdGhpcy0+X2ZvbnQtPmdldFNpemUoKSAqIDIwLAkJCQkJCS8vCUZvbnRzaXplIChpbiB0d2lwcykKCQkJJGdyYml0LAoJCQkkaWN2LAkJCQkJCQkJCQkJCS8vCUNvbG91cgoJCQlzZWxmOjpfbWFwQm9sZCgkdGhpcy0+X2ZvbnQtPmdldEJvbGQoKSksCQkJLy8JRm9udCB3ZWlnaHQKCQkJJHNzcywJCQkJCQkJCQkJCQkvLwlTdXBlcnNjcmlwdC9TdWJzY3JpcHQKCQkJc2VsZjo6X21hcFVuZGVybGluZSgkdGhpcy0+X2ZvbnQtPmdldFVuZGVybGluZSgpKSwKCQkJJGJGYW1pbHksCgkJCSRiQ2hhclNldCwKCQkJJHJlc2VydmVkCgkJKTsKCQkkZGF0YSAuPSBQSFBFeGNlbF9TaGFyZWRfU3RyaW5nOjpVVEY4dG9CSUZGOFVuaWNvZGVTaG9ydCgkdGhpcy0+X2ZvbnQtPmdldE5hbWUoKSk7CgoJCSRsZW5ndGggPSBzdHJsZW4oJGRhdGEpOwoJCSRoZWFkZXIgPSBwYWNrKCJ2diIsICRyZWNvcmQsICRsZW5ndGgpOwoKCQlyZXR1cm4oJGhlYWRlciAuICRkYXRhKTsKCX0KCgkvKioKCSAqIE1hcCB0byBCSUZGNS1CSUZGOCBjb2RlcyBmb3IgYm9sZAoJICoKCSAqIEBwYXJhbSBib29sZWFuICRib2xkCgkgKiBAcmV0dXJuIGludAoJICovCglwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBfbWFwQm9sZCgkYm9sZCkgewoJCWlmICgkYm9sZCkgewoJCQlyZXR1cm4gMHgyQkM7CS8vCTcwMCA9IEJvbGQgZm9udCB3ZWlnaHQKCQl9CgkJcmV0dXJuIDB4MTkwOwkJLy8JNDAwID0gTm9ybWFsIGZvbnQgd2VpZ2h0Cgl9CgoJLyoqCgkgKiBNYXAgb2YgQklGRjItQklGRjggY29kZXMgZm9yIHVuZGVybGluZSBzdHlsZXMKCSAqIEBzdGF0aWMJYXJyYXkgb2YgaW50CgkgKgoJICovCglwcml2YXRlIHN0YXRpYyAkX21hcFVuZGVybGluZSA9IGFycmF5KAlQSFBFeGNlbF9TdHlsZV9Gb250OjpVTkRFUkxJTkVfTk9ORQkJCQkJPT4gMHgwMCwKCQkJCQkJCQkJCQlQSFBFeGNlbF9TdHlsZV9Gb250OjpVTkRFUkxJTkVfU0lOR0xFCQkJCT0+IDB4MDEsCgkJCQkJCQkJCQkJUEhQRXhjZWxfU3R5bGVfRm9udDo6VU5ERVJMSU5FX0RPVUJMRQkJCQk9PiAweDAyLAoJCQkJCQkJCQkJCVBIUEV4Y2VsX1N0eWxlX0ZvbnQ6OlVOREVSTElORV9TSU5HTEVBQ0NPVU5USU5HCQk9PiAweDIxLAoJCQkJCQkJCQkJCVBIUEV4Y2VsX1N0eWxlX0ZvbnQ6OlVOREVSTElORV9ET1VCTEVBQ0NPVU5USU5HCQk9PiAweDIyLAoJCQkJCQkJCQkJICk7CgkvKioKCSAqIE1hcCB1bmRlcmxpbmUKCSAqCgkgKiBAcGFyYW0gc3RyaW5nCgkgKiBAcmV0dXJuIGludAoJICovCglwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBfbWFwVW5kZXJsaW5lKCR1bmRlcmxpbmUpIHsKCQlpZiAoaXNzZXQoc2VsZjo6JF9tYXBVbmRlcmxpbmVbJHVuZGVybGluZV0pKQoJCQlyZXR1cm4gc2VsZjo6JF9tYXBVbmRlcmxpbmVbJHVuZGVybGluZV07CgkJcmV0dXJuIDB4MDA7Cgl9Cgp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Writer/Excel5/Parser.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIFBIUEV4Y2VsCiAqCiAqIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICoKICogQGNhdGVnb3J5ICAgUEhQRXhjZWwKICogQHBhY2thZ2UgICAgUEhQRXhjZWxfV3JpdGVyX0V4Y2VsNQogKiBAY29weXJpZ2h0ICBDb3B5cmlnaHQgKGMpIDIwMDYgLSAyMDEyIFBIUEV4Y2VsIChodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9QSFBFeGNlbCkKICogQGxpY2Vuc2UgICAgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL29sZC1saWNlbnNlcy9sZ3BsLTIuMS50eHQJTEdQTAogKiBAdmVyc2lvbiAgICAxLjcuNywgMjAxMi0wNS0xOQogKi8KCi8vIE9yaWdpbmFsIGZpbGUgaGVhZGVyIG9mIFBFQVI6OlNwcmVhZHNoZWV0X0V4Y2VsX1dyaXRlcl9QYXJzZXIgKHVzZWQgYXMgdGhlIGJhc2UgZm9yIHRoaXMgY2xhc3MpOgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyAqICBDbGFzcyBmb3IgcGFyc2luZyBFeGNlbCBmb3JtdWxhcwovLyAqCi8vICogIExpY2Vuc2UgSW5mb3JtYXRpb246Ci8vICoKLy8gKiAgICBTcHJlYWRzaGVldF9FeGNlbF9Xcml0ZXI6ICBBIGxpYnJhcnkgZm9yIGdlbmVyYXRpbmcgRXhjZWwgU3ByZWFkc2hlZXRzCi8vICogICAgQ29weXJpZ2h0IChjKSAyMDAyLTIwMDMgWGF2aWVyIE5vZ3VlciB4bm9ndWVyQHJlemVicmEuY29tCi8vICoKLy8gKiAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi8vICogICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwovLyAqICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgovLyAqICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgovLyAqCi8vICogICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi8vICogICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLy8gKiAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQovLyAqICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi8vICoKLy8gKiAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi8vICogICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQovLyAqICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKLy8gKi8KCgovKioKICogUEhQRXhjZWxfV3JpdGVyX0V4Y2VsNV9QYXJzZXIKICoKICogQGNhdGVnb3J5ICAgUEhQRXhjZWwKICogQHBhY2thZ2UgICAgUEhQRXhjZWxfV3JpdGVyX0V4Y2VsNQogKiBAY29weXJpZ2h0ICBDb3B5cmlnaHQgKGMpIDIwMDYgLSAyMDEyIFBIUEV4Y2VsIChodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9QSFBFeGNlbCkKICovCmNsYXNzIFBIUEV4Y2VsX1dyaXRlcl9FeGNlbDVfUGFyc2VyCnsKCS8qKglDb25zdGFudHMJCQkJKi8KCS8vIFNoZWV0IHRpdGxlIGluIHVucXVvdGVkIGZvcm0KCS8vIEludmFsaWQgc2hlZXQgdGl0bGUgY2hhcmFjdGVycyBjYW5ub3Qgb2NjdXIgaW4gdGhlIHNoZWV0IHRpdGxlOgoJLy8gCQkqOi9cP1tdCgkvLyBNb3Jlb3ZlciwgdGhlcmUgYXJlIHZhbGlkIHNoZWV0IHRpdGxlIGNoYXJhY3RlcnMgdGhhdCBjYW5ub3Qgb2NjdXIgaW4gdW5xdW90ZWQgZm9ybSAodGhlcmUgbWF5IGJlIG1vcmU/KQoJLy8gKy0lICdeJjw+PSw7IygpInt9Cgljb25zdCBSRUdFWF9TSEVFVF9USVRMRV9VTlFVT1RFRCA9ICdbXlwqXDpcL1xcXFxcP1xbXF1cK1wtXCUgXFxcJ1xeXCZcPFw+XD1cLFw7XCNcKFwpXCJce1x9XSsnOwoKCS8vIFNoZWV0IHRpdGxlIGluIHF1b3RlZCBmb3JtICh3aXRob3V0IHN1cnJvdW5kaW5nIHF1b3RlcykKCS8vIEludmFsaWQgc2hlZXQgdGl0bGUgY2hhcmFjdGVycyBjYW5ub3Qgb2NjdXIgaW4gdGhlIHNoZWV0IHRpdGxlOgoJLy8gKjovXD9bXQkJCQkJKHVzdWFsIGludmFsaWQgc2hlZXQgdGl0bGUgY2hhcmFjdGVycykKCS8vIFNpbmdsZSBxdW90ZSBpcyByZXByZXNlbnRlZCBhcyBhIHBhaXIgJycKCWNvbnN0IFJFR0VYX1NIRUVUX1RJVExFX1FVT1RFRCA9ICcoKFteXCpcOlwvXFxcXFw/XFtcXVxcXCddKSt8KFxcXCdcXFwnKSspKyc7CgoJLyoqCgkgKiBUaGUgaW5kZXggb2YgdGhlIGNoYXJhY3RlciB3ZSBhcmUgY3VycmVudGx5IGxvb2tpbmcgYXQKCSAqIEB2YXIgaW50ZWdlcgoJICovCglwdWJsaWMgJF9jdXJyZW50X2NoYXI7CgoJLyoqCgkgKiBUaGUgdG9rZW4gd2UgYXJlIHdvcmtpbmcgb24uCgkgKiBAdmFyIHN0cmluZwoJICovCglwdWJsaWMgJF9jdXJyZW50X3Rva2VuOwoKCS8qKgoJICogVGhlIGZvcm11bGEgdG8gcGFyc2UKCSAqIEB2YXIgc3RyaW5nCgkgKi8KCXB1YmxpYyAkX2Zvcm11bGE7CgoJLyoqCgkgKiBUaGUgY2hhcmFjdGVyIGFoZWFkIG9mIHRoZSBjdXJyZW50IGNoYXIKCSAqIEB2YXIgc3RyaW5nCgkgKi8KCXB1YmxpYyAkX2xvb2thaGVhZDsKCgkvKioKCSAqIFRoZSBwYXJzZSB0cmVlIHRvIGJlIGdlbmVyYXRlZAoJICogQHZhciBzdHJpbmcKCSAqLwoJcHVibGljICRfcGFyc2VfdHJlZTsKCgkvKioKCSAqIEFycmF5IG9mIGV4dGVybmFsIHNoZWV0cwoJICogQHZhciBhcnJheQoJICovCglwdWJsaWMgJF9leHRfc2hlZXRzOwoKCS8qKgoJICogQXJyYXkgb2Ygc2hlZXQgcmVmZXJlbmNlcyBpbiB0aGUgZm9ybSBvZiBSRUYgc3RydWN0dXJlcwoJICogQHZhciBhcnJheQoJICovCglwdWJsaWMgJF9yZWZlcmVuY2VzOwoKCS8qKgoJICogVGhlIGNsYXNzIGNvbnN0cnVjdG9yCgkgKgoJICovCglwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoKQoJewoJCSR0aGlzLT5fY3VycmVudF9jaGFyICA9IDA7CgkJJHRoaXMtPl9jdXJyZW50X3Rva2VuID0gJyc7ICAgICAgIC8vIFRoZSB0b2tlbiB3ZSBhcmUgd29ya2luZyBvbi4KCQkkdGhpcy0+X2Zvcm11bGEgICAgICAgPSAnJzsgICAgICAgLy8gVGhlIGZvcm11bGEgdG8gcGFyc2UuCgkJJHRoaXMtPl9sb29rYWhlYWQgICAgID0gJyc7ICAgICAgIC8vIFRoZSBjaGFyYWN0ZXIgYWhlYWQgb2YgdGhlIGN1cnJlbnQgY2hhci4KCQkkdGhpcy0+X3BhcnNlX3RyZWUgICAgPSAnJzsgICAgICAgLy8gVGhlIHBhcnNlIHRyZWUgdG8gYmUgZ2VuZXJhdGVkLgoJCSR0aGlzLT5faW5pdGlhbGl6ZUhhc2hlcygpOyAgICAgIC8vIEluaXRpYWxpemUgdGhlIGhhc2hlczogcHRnJ3MgYW5kIGZ1bmN0aW9uJ3MgcHRnJ3MKCQkkdGhpcy0+X2V4dF9zaGVldHMgPSBhcnJheSgpOwoJCSR0aGlzLT5fcmVmZXJlbmNlcyA9IGFycmF5KCk7Cgl9CgoJLyoqCgkgKiBJbml0aWFsaXplIHRoZSBwdGcgYW5kIGZ1bmN0aW9uIGhhc2hlcy4KCSAqCgkgKiBAYWNjZXNzIHByaXZhdGUKCSAqLwoJZnVuY3Rpb24gX2luaXRpYWxpemVIYXNoZXMoKQoJewoJCS8vIFRoZSBFeGNlbCBwdGcgaW5kaWNlcwoJCSR0aGlzLT5wdGcgPSBhcnJheSgKCQkJJ3B0Z0V4cCcgICAgICAgPT4gMHgwMSwKCQkJJ3B0Z1RibCcgICAgICAgPT4gMHgwMiwKCQkJJ3B0Z0FkZCcgICAgICAgPT4gMHgwMywKCQkJJ3B0Z1N1YicgICAgICAgPT4gMHgwNCwKCQkJJ3B0Z011bCcgICAgICAgPT4gMHgwNSwKCQkJJ3B0Z0RpdicgICAgICAgPT4gMHgwNiwKCQkJJ3B0Z1Bvd2VyJyAgICAgPT4gMHgwNywKCQkJJ3B0Z0NvbmNhdCcgICAgPT4gMHgwOCwKCQkJJ3B0Z0xUJyAgICAgICAgPT4gMHgwOSwKCQkJJ3B0Z0xFJyAgICAgICAgPT4gMHgwQSwKCQkJJ3B0Z0VRJyAgICAgICAgPT4gMHgwQiwKCQkJJ3B0Z0dFJyAgICAgICAgPT4gMHgwQywKCQkJJ3B0Z0dUJyAgICAgICAgPT4gMHgwRCwKCQkJJ3B0Z05FJyAgICAgICAgPT4gMHgwRSwKCQkJJ3B0Z0lzZWN0JyAgICAgPT4gMHgwRiwKCQkJJ3B0Z1VuaW9uJyAgICAgPT4gMHgxMCwKCQkJJ3B0Z1JhbmdlJyAgICAgPT4gMHgxMSwKCQkJJ3B0Z1VwbHVzJyAgICAgPT4gMHgxMiwKCQkJJ3B0Z1VtaW51cycgICAgPT4gMHgxMywKCQkJJ3B0Z1BlcmNlbnQnICAgPT4gMHgxNCwKCQkJJ3B0Z1BhcmVuJyAgICAgPT4gMHgxNSwKCQkJJ3B0Z01pc3NBcmcnICAgPT4gMHgxNiwKCQkJJ3B0Z1N0cicgICAgICAgPT4gMHgxNywKCQkJJ3B0Z0F0dHInICAgICAgPT4gMHgxOSwKCQkJJ3B0Z1NoZWV0JyAgICAgPT4gMHgxQSwKCQkJJ3B0Z0VuZFNoZWV0JyAgPT4gMHgxQiwKCQkJJ3B0Z0VycicgICAgICAgPT4gMHgxQywKCQkJJ3B0Z0Jvb2wnICAgICAgPT4gMHgxRCwKCQkJJ3B0Z0ludCcgICAgICAgPT4gMHgxRSwKCQkJJ3B0Z051bScgICAgICAgPT4gMHgxRiwKCQkJJ3B0Z0FycmF5JyAgICAgPT4gMHgyMCwKCQkJJ3B0Z0Z1bmMnICAgICAgPT4gMHgyMSwKCQkJJ3B0Z0Z1bmNWYXInICAgPT4gMHgyMiwKCQkJJ3B0Z05hbWUnICAgICAgPT4gMHgyMywKCQkJJ3B0Z1JlZicgICAgICAgPT4gMHgyNCwKCQkJJ3B0Z0FyZWEnICAgICAgPT4gMHgyNSwKCQkJJ3B0Z01lbUFyZWEnICAgPT4gMHgyNiwKCQkJJ3B0Z01lbUVycicgICAgPT4gMHgyNywKCQkJJ3B0Z01lbU5vTWVtJyAgPT4gMHgyOCwKCQkJJ3B0Z01lbUZ1bmMnICAgPT4gMHgyOSwKCQkJJ3B0Z1JlZkVycicgICAgPT4gMHgyQSwKCQkJJ3B0Z0FyZWFFcnInICAgPT4gMHgyQiwKCQkJJ3B0Z1JlZk4nICAgICAgPT4gMHgyQywKCQkJJ3B0Z0FyZWFOJyAgICAgPT4gMHgyRCwKCQkJJ3B0Z01lbUFyZWFOJyAgPT4gMHgyRSwKCQkJJ3B0Z01lbU5vTWVtTicgPT4gMHgyRiwKCQkJJ3B0Z05hbWVYJyAgICAgPT4gMHgzOSwKCQkJJ3B0Z1JlZjNkJyAgICAgPT4gMHgzQSwKCQkJJ3B0Z0FyZWEzZCcgICAgPT4gMHgzQiwKCQkJJ3B0Z1JlZkVycjNkJyAgPT4gMHgzQywKCQkJJ3B0Z0FyZWFFcnIzZCcgPT4gMHgzRCwKCQkJJ3B0Z0FycmF5VicgICAgPT4gMHg0MCwKCQkJJ3B0Z0Z1bmNWJyAgICAgPT4gMHg0MSwKCQkJJ3B0Z0Z1bmNWYXJWJyAgPT4gMHg0MiwKCQkJJ3B0Z05hbWVWJyAgICAgPT4gMHg0MywKCQkJJ3B0Z1JlZlYnICAgICAgPT4gMHg0NCwKCQkJJ3B0Z0FyZWFWJyAgICAgPT4gMHg0NSwKCQkJJ3B0Z01lbUFyZWFWJyAgPT4gMHg0NiwKCQkJJ3B0Z01lbUVyclYnICAgPT4gMHg0NywKCQkJJ3B0Z01lbU5vTWVtVicgPT4gMHg0OCwKCQkJJ3B0Z01lbUZ1bmNWJyAgPT4gMHg0OSwKCQkJJ3B0Z1JlZkVyclYnICAgPT4gMHg0QSwKCQkJJ3B0Z0FyZWFFcnJWJyAgPT4gMHg0QiwKCQkJJ3B0Z1JlZk5WJyAgICAgPT4gMHg0QywKCQkJJ3B0Z0FyZWFOVicgICAgPT4gMHg0RCwKCQkJJ3B0Z01lbUFyZWFOVicgPT4gMHg0RSwKCQkJJ3B0Z01lbU5vTWVtTicgPT4gMHg0RiwKCQkJJ3B0Z0Z1bmNDRVYnICAgPT4gMHg1OCwKCQkJJ3B0Z05hbWVYVicgICAgPT4gMHg1OSwKCQkJJ3B0Z1JlZjNkVicgICAgPT4gMHg1QSwKCQkJJ3B0Z0FyZWEzZFYnICAgPT4gMHg1QiwKCQkJJ3B0Z1JlZkVycjNkVicgPT4gMHg1QywKCQkJJ3B0Z0FyZWFFcnIzZCcgPT4gMHg1RCwKCQkJJ3B0Z0FycmF5QScgICAgPT4gMHg2MCwKCQkJJ3B0Z0Z1bmNBJyAgICAgPT4gMHg2MSwKCQkJJ3B0Z0Z1bmNWYXJBJyAgPT4gMHg2MiwKCQkJJ3B0Z05hbWVBJyAgICAgPT4gMHg2MywKCQkJJ3B0Z1JlZkEnICAgICAgPT4gMHg2NCwKCQkJJ3B0Z0FyZWFBJyAgICAgPT4gMHg2NSwKCQkJJ3B0Z01lbUFyZWFBJyAgPT4gMHg2NiwKCQkJJ3B0Z01lbUVyckEnICAgPT4gMHg2NywKCQkJJ3B0Z01lbU5vTWVtQScgPT4gMHg2OCwKCQkJJ3B0Z01lbUZ1bmNBJyAgPT4gMHg2OSwKCQkJJ3B0Z1JlZkVyckEnICAgPT4gMHg2QSwKCQkJJ3B0Z0FyZWFFcnJBJyAgPT4gMHg2QiwKCQkJJ3B0Z1JlZk5BJyAgICAgPT4gMHg2QywKCQkJJ3B0Z0FyZWFOQScgICAgPT4gMHg2RCwKCQkJJ3B0Z01lbUFyZWFOQScgPT4gMHg2RSwKCQkJJ3B0Z01lbU5vTWVtTicgPT4gMHg2RiwKCQkJJ3B0Z0Z1bmNDRUEnICAgPT4gMHg3OCwKCQkJJ3B0Z05hbWVYQScgICAgPT4gMHg3OSwKCQkJJ3B0Z1JlZjNkQScgICAgPT4gMHg3QSwKCQkJJ3B0Z0FyZWEzZEEnICAgPT4gMHg3QiwKCQkJJ3B0Z1JlZkVycjNkQScgPT4gMHg3QywKCQkJJ3B0Z0FyZWFFcnIzZCcgPT4gMHg3RAoJCQkpOwoKCQkvLyBUaGFua3MgdG8gTWljaGFlbCBNZWVrcyBhbmQgR251bWVyaWMgZm9yIHRoZSBpbml0aWFsIGFyZyB2YWx1ZXMuCgkJLy8KCQkvLyBUaGUgZm9sbG93aW5nIGhhc2ggd2FzIGdlbmVyYXRlZCBieSAiZnVuY3Rpb25fbG9jYWxlLnBsIiBpbiB0aGUgZGlzdHJvLgoJCS8vIFJlZmVyIHRvIGZ1bmN0aW9uX2xvY2FsZS5wbCBmb3Igbm9uLUVuZ2xpc2ggZnVuY3Rpb24gbmFtZXMuCgkJLy8KCQkvLyBUaGUgYXJyYXkgZWxlbWVudHMgYXJlIGFzIGZvbGxvdzoKCQkvLyBwdGc6ICAgVGhlIEV4Y2VsIGZ1bmN0aW9uIHB0ZyBjb2RlLgoJCS8vIGFyZ3M6ICBUaGUgbnVtYmVyIG9mIGFyZ3VtZW50cyB0aGF0IHRoZSBmdW5jdGlvbiB0YWtlczoKCQkvLyAgICAgICAgICAgPj0wIGlzIGEgZml4ZWQgbnVtYmVyIG9mIGFyZ3VtZW50cy4KCQkvLyAgICAgICAgICAgLTEgIGlzIGEgdmFyaWFibGUgIG51bWJlciBvZiBhcmd1bWVudHMuCgkJLy8gY2xhc3M6IFRoZSByZWZlcmVuY2UsIHZhbHVlIG9yIGFycmF5IGNsYXNzIG9mIHRoZSBmdW5jdGlvbiBhcmdzLgoJCS8vIHZvbDogICBUaGUgZnVuY3Rpb24gaXMgdm9sYXRpbGUuCgkJLy8KCQkkdGhpcy0+X2Z1bmN0aW9ucyA9IGFycmF5KAoJCQkgIC8vIGZ1bmN0aW9uICAgICAgICAgICAgICAgICAgcHRnICBhcmdzICBjbGFzcyAgdm9sCgkJCSAgJ0NPVU5UJyAgICAgICAgICAgPT4gYXJyYXkoICAgMCwgICAtMSwgICAgMCwgICAgMCApLAoJCQkgICdJRicgICAgICAgICAgICAgID0+IGFycmF5KCAgIDEsICAgLTEsICAgIDEsICAgIDAgKSwKCQkJICAnSVNOQScgICAgICAgICAgICA9PiBhcnJheSggICAyLCAgICAxLCAgICAxLCAgICAwICksCgkJCSAgJ0lTRVJST1InICAgICAgICAgPT4gYXJyYXkoICAgMywgICAgMSwgICAgMSwgICAgMCApLAoJCQkgICdTVU0nICAgICAgICAgICAgID0+IGFycmF5KCAgIDQsICAgLTEsICAgIDAsICAgIDAgKSwKCQkJICAnQVZFUkFHRScgICAgICAgICA9PiBhcnJheSggICA1LCAgIC0xLCAgICAwLCAgICAwICksCgkJCSAgJ01JTicgICAgICAgICAgICAgPT4gYXJyYXkoICAgNiwgICAtMSwgICAgMCwgICAgMCApLAoJCQkgICdNQVgnICAgICAgICAgICAgID0+IGFycmF5KCAgIDcsICAgLTEsICAgIDAsICAgIDAgKSwKCQkJICAnUk9XJyAgICAgICAgICAgICA9PiBhcnJheSggICA4LCAgIC0xLCAgICAwLCAgICAwICksCgkJCSAgJ0NPTFVNTicgICAgICAgICAgPT4gYXJyYXkoICAgOSwgICAtMSwgICAgMCwgICAgMCApLAoJCQkgICdOQScgICAgICAgICAgICAgID0+IGFycmF5KCAgMTAsICAgIDAsICAgIDAsICAgIDAgKSwKCQkJICAnTlBWJyAgICAgICAgICAgICA9PiBhcnJheSggIDExLCAgIC0xLCAgICAxLCAgICAwICksCgkJCSAgJ1NUREVWJyAgICAgICAgICAgPT4gYXJyYXkoICAxMiwgICAtMSwgICAgMCwgICAgMCApLAoJCQkgICdET0xMQVInICAgICAgICAgID0+IGFycmF5KCAgMTMsICAgLTEsICAgIDEsICAgIDAgKSwKCQkJICAnRklYRUQnICAgICAgICAgICA9PiBhcnJheSggIDE0LCAgIC0xLCAgICAxLCAgICAwICksCgkJCSAgJ1NJTicgICAgICAgICAgICAgPT4gYXJyYXkoICAxNSwgICAgMSwgICAgMSwgICAgMCApLAoJCQkgICdDT1MnICAgICAgICAgICAgID0+IGFycmF5KCAgMTYsICAgIDEsICAgIDEsICAgIDAgKSwKCQkJICAnVEFOJyAgICAgICAgICAgICA9PiBhcnJheSggIDE3LCAgICAxLCAgICAxLCAgICAwICksCgkJCSAgJ0FUQU4nICAgICAgICAgICAgPT4gYXJyYXkoICAxOCwgICAgMSwgICAgMSwgICAgMCApLAoJCQkgICdQSScgICAgICAgICAgICAgID0+IGFycmF5KCAgMTksICAgIDAsICAgIDEsICAgIDAgKSwKCQkJICAnU1FSVCcgICAgICAgICAgICA9PiBhcnJheSggIDIwLCAgICAxLCAgICAxLCAgICAwICksCgkJCSAgJ0VYUCcgICAgICAgICAgICAgPT4gYXJyYXkoICAyMSwgICAgMSwgICAgMSwgICAgMCApLAoJCQkgICdMTicgICAgICAgICAgICAgID0+IGFycmF5KCAgMjIsICAgIDEsICAgIDEsICAgIDAgKSwKCQkJICAnTE9HMTAnICAgICAgICAgICA9PiBhcnJheSggIDIzLCAgICAxLCAgICAxLCAgICAwICksCgkJCSAgJ0FCUycgICAgICAgICAgICAgPT4gYXJyYXkoICAyNCwgICAgMSwgICAgMSwgICAgMCApLAoJCQkgICdJTlQnICAgICAgICAgICAgID0+IGFycmF5KCAgMjUsICAgIDEsICAgIDEsICAgIDAgKSwKCQkJICAnU0lHTicgICAgICAgICAgICA9PiBhcnJheSggIDI2LCAgICAxLCAgICAxLCAgICAwICksCgkJCSAgJ1JPVU5EJyAgICAgICAgICAgPT4gYXJyYXkoICAyNywgICAgMiwgICAgMSwgICAgMCApLAoJCQkgICdMT09LVVAnICAgICAgICAgID0+IGFycmF5KCAgMjgsICAgLTEsICAgIDAsICAgIDAgKSwKCQkJICAnSU5ERVgnICAgICAgICAgICA9PiBhcnJheSggIDI5LCAgIC0xLCAgICAwLCAgICAxICksCgkJCSAgJ1JFUFQnICAgICAgICAgICAgPT4gYXJyYXkoICAzMCwgICAgMiwgICAgMSwgICAgMCApLAoJCQkgICdNSUQnICAgICAgICAgICAgID0+IGFycmF5KCAgMzEsICAgIDMsICAgIDEsICAgIDAgKSwKCQkJICAnTEVOJyAgICAgICAgICAgICA9PiBhcnJheSggIDMyLCAgICAxLCAgICAxLCAgICAwICksCgkJCSAgJ1ZBTFVFJyAgICAgICAgICAgPT4gYXJyYXkoICAzMywgICAgMSwgICAgMSwgICAgMCApLAoJCQkgICdUUlVFJyAgICAgICAgICAgID0+IGFycmF5KCAgMzQsICAgIDAsICAgIDEsICAgIDAgKSwKCQkJICAnRkFMU0UnICAgICAgICAgICA9PiBhcnJheSggIDM1LCAgICAwLCAgICAxLCAgICAwICksCgkJCSAgJ0FORCcgICAgICAgICAgICAgPT4gYXJyYXkoICAzNiwgICAtMSwgICAgMCwgICAgMCApLAoJCQkgICdPUicgICAgICAgICAgICAgID0+IGFycmF5KCAgMzcsICAgLTEsICAgIDAsICAgIDAgKSwKCQkJICAnTk9UJyAgICAgICAgICAgICA9PiBhcnJheSggIDM4LCAgICAxLCAgICAxLCAgICAwICksCgkJCSAgJ01PRCcgICAgICAgICAgICAgPT4gYXJyYXkoICAzOSwgICAgMiwgICAgMSwgICAgMCApLAoJCQkgICdEQ09VTlQnICAgICAgICAgID0+IGFycmF5KCAgNDAsICAgIDMsICAgIDAsICAgIDAgKSwKCQkJICAnRFNVTScgICAgICAgICAgICA9PiBhcnJheSggIDQxLCAgICAzLCAgICAwLCAgICAwICksCgkJCSAgJ0RBVkVSQUdFJyAgICAgICAgPT4gYXJyYXkoICA0MiwgICAgMywgICAgMCwgICAgMCApLAoJCQkgICdETUlOJyAgICAgICAgICAgID0+IGFycmF5KCAgNDMsICAgIDMsICAgIDAsICAgIDAgKSwKCQkJICAnRE1BWCcgICAgICAgICAgICA9PiBhcnJheSggIDQ0LCAgICAzLCAgICAwLCAgICAwICksCgkJCSAgJ0RTVERFVicgICAgICAgICAgPT4gYXJyYXkoICA0NSwgICAgMywgICAgMCwgICAgMCApLAoJCQkgICdWQVInICAgICAgICAgICAgID0+IGFycmF5KCAgNDYsICAgLTEsICAgIDAsICAgIDAgKSwKCQkJICAnRFZBUicgICAgICAgICAgICA9PiBhcnJheSggIDQ3LCAgICAzLCAgICAwLCAgICAwICksCgkJCSAgJ1RFWFQnICAgICAgICAgICAgPT4gYXJyYXkoICA0OCwgICAgMiwgICAgMSwgICAgMCApLAoJCQkgICdMSU5FU1QnICAgICAgICAgID0+IGFycmF5KCAgNDksICAgLTEsICAgIDAsICAgIDAgKSwKCQkJICAnVFJFTkQnICAgICAgICAgICA9PiBhcnJheSggIDUwLCAgIC0xLCAgICAwLCAgICAwICksCgkJCSAgJ0xPR0VTVCcgICAgICAgICAgPT4gYXJyYXkoICA1MSwgICAtMSwgICAgMCwgICAgMCApLAoJCQkgICdHUk9XVEgnICAgICAgICAgID0+IGFycmF5KCAgNTIsICAgLTEsICAgIDAsICAgIDAgKSwKCQkJICAnUFYnICAgICAgICAgICAgICA9PiBhcnJheSggIDU2LCAgIC0xLCAgICAxLCAgICAwICksCgkJCSAgJ0ZWJyAgICAgICAgICAgICAgPT4gYXJyYXkoICA1NywgICAtMSwgICAgMSwgICAgMCApLAoJCQkgICdOUEVSJyAgICAgICAgICAgID0+IGFycmF5KCAgNTgsICAgLTEsICAgIDEsICAgIDAgKSwKCQkJICAnUE1UJyAgICAgICAgICAgICA9PiBhcnJheSggIDU5LCAgIC0xLCAgICAxLCAgICAwICksCgkJCSAgJ1JBVEUnICAgICAgICAgICAgPT4gYXJyYXkoICA2MCwgICAtMSwgICAgMSwgICAgMCApLAoJCQkgICdNSVJSJyAgICAgICAgICAgID0+IGFycmF5KCAgNjEsICAgIDMsICAgIDAsICAgIDAgKSwKCQkJICAnSVJSJyAgICAgICAgICAgICA9PiBhcnJheSggIDYyLCAgIC0xLCAgICAwLCAgICAwICksCgkJCSAgJ1JBTkQnICAgICAgICAgICAgPT4gYXJyYXkoICA2MywgICAgMCwgICAgMSwgICAgMSApLAoJCQkgICdNQVRDSCcgICAgICAgICAgID0+IGFycmF5KCAgNjQsICAgLTEsICAgIDAsICAgIDAgKSwKCQkJICAnREFURScgICAgICAgICAgICA9PiBhcnJheSggIDY1LCAgICAzLCAgICAxLCAgICAwICksCgkJCSAgJ1RJTUUnICAgICAgICAgICAgPT4gYXJyYXkoICA2NiwgICAgMywgICAgMSwgICAgMCApLAoJCQkgICdEQVknICAgICAgICAgICAgID0+IGFycmF5KCAgNjcsICAgIDEsICAgIDEsICAgIDAgKSwKCQkJICAnTU9OVEgnICAgICAgICAgICA9PiBhcnJheSggIDY4LCAgICAxLCAgICAxLCAgICAwICksCgkJCSAgJ1lFQVInICAgICAgICAgICAgPT4gYXJyYXkoICA2OSwgICAgMSwgICAgMSwgICAgMCApLAoJCQkgICdXRUVLREFZJyAgICAgICAgID0+IGFycmF5KCAgNzAsICAgLTEsICAgIDEsICAgIDAgKSwKCQkJICAnSE9VUicgICAgICAgICAgICA9PiBhcnJheSggIDcxLCAgICAxLCAgICAxLCAgICAwICksCgkJCSAgJ01JTlVURScgICAgICAgICAgPT4gYXJyYXkoICA3MiwgICAgMSwgICAgMSwgICAgMCApLAoJCQkgICdTRUNPTkQnICAgICAgICAgID0+IGFycmF5KCAgNzMsICAgIDEsICAgIDEsICAgIDAgKSwKCQkJICAnTk9XJyAgICAgICAgICAgICA9PiBhcnJheSggIDc0LCAgICAwLCAgICAxLCAgICAxICksCgkJCSAgJ0FSRUFTJyAgICAgICAgICAgPT4gYXJyYXkoICA3NSwgICAgMSwgICAgMCwgICAgMSApLAoJCQkgICdST1dTJyAgICAgICAgICAgID0+IGFycmF5KCAgNzYsICAgIDEsICAgIDAsICAgIDEgKSwKCQkJICAnQ09MVU1OUycgICAgICAgICA9PiBhcnJheSggIDc3LCAgICAxLCAgICAwLCAgICAxICksCgkJCSAgJ09GRlNFVCcgICAgICAgICAgPT4gYXJyYXkoICA3OCwgICAtMSwgICAgMCwgICAgMSApLAoJCQkgICdTRUFSQ0gnICAgICAgICAgID0+IGFycmF5KCAgODIsICAgLTEsICAgIDEsICAgIDAgKSwKCQkJICAnVFJBTlNQT1NFJyAgICAgICA9PiBhcnJheSggIDgzLCAgICAxLCAgICAxLCAgICAwICksCgkJCSAgJ1RZUEUnICAgICAgICAgICAgPT4gYXJyYXkoICA4NiwgICAgMSwgICAgMSwgICAgMCApLAoJCQkgICdBVEFOMicgICAgICAgICAgID0+IGFycmF5KCAgOTcsICAgIDIsICAgIDEsICAgIDAgKSwKCQkJICAnQVNJTicgICAgICAgICAgICA9PiBhcnJheSggIDk4LCAgICAxLCAgICAxLCAgICAwICksCgkJCSAgJ0FDT1MnICAgICAgICAgICAgPT4gYXJyYXkoICA5OSwgICAgMSwgICAgMSwgICAgMCApLAoJCQkgICdDSE9PU0UnICAgICAgICAgID0+IGFycmF5KCAxMDAsICAgLTEsICAgIDEsICAgIDAgKSwKCQkJICAnSExPT0tVUCcgICAgICAgICA9PiBhcnJheSggMTAxLCAgIC0xLCAgICAwLCAgICAwICksCgkJCSAgJ1ZMT09LVVAnICAgICAgICAgPT4gYXJyYXkoIDEwMiwgICAtMSwgICAgMCwgICAgMCApLAoJCQkgICdJU1JFRicgICAgICAgICAgID0+IGFycmF5KCAxMDUsICAgIDEsICAgIDAsICAgIDAgKSwKCQkJICAnTE9HJyAgICAgICAgICAgICA9PiBhcnJheSggMTA5LCAgIC0xLCAgICAxLCAgICAwICksCgkJCSAgJ0NIQVInICAgICAgICAgICAgPT4gYXJyYXkoIDExMSwgICAgMSwgICAgMSwgICAgMCApLAoJCQkgICdMT1dFUicgICAgICAgICAgID0+IGFycmF5KCAxMTIsICAgIDEsICAgIDEsICAgIDAgKSwKCQkJICAnVVBQRVInICAgICAgICAgICA9PiBhcnJheSggMTEzLCAgICAxLCAgICAxLCAgICAwICksCgkJCSAgJ1BST1BFUicgICAgICAgICAgPT4gYXJyYXkoIDExNCwgICAgMSwgICAgMSwgICAgMCApLAoJCQkgICdMRUZUJyAgICAgICAgICAgID0+IGFycmF5KCAxMTUsICAgLTEsICAgIDEsICAgIDAgKSwKCQkJICAnUklHSFQnICAgICAgICAgICA9PiBhcnJheSggMTE2LCAgIC0xLCAgICAxLCAgICAwICksCgkJCSAgJ0VYQUNUJyAgICAgICAgICAgPT4gYXJyYXkoIDExNywgICAgMiwgICAgMSwgICAgMCApLAoJCQkgICdUUklNJyAgICAgICAgICAgID0+IGFycmF5KCAxMTgsICAgIDEsICAgIDEsICAgIDAgKSwKCQkJICAnUkVQTEFDRScgICAgICAgICA9PiBhcnJheSggMTE5LCAgICA0LCAgICAxLCAgICAwICksCgkJCSAgJ1NVQlNUSVRVVEUnICAgICAgPT4gYXJyYXkoIDEyMCwgICAtMSwgICAgMSwgICAgMCApLAoJCQkgICdDT0RFJyAgICAgICAgICAgID0+IGFycmF5KCAxMjEsICAgIDEsICAgIDEsICAgIDAgKSwKCQkJICAnRklORCcgICAgICAgICAgICA9PiBhcnJheSggMTI0LCAgIC0xLCAgICAxLCAgICAwICksCgkJCSAgJ0NFTEwnICAgICAgICAgICAgPT4gYXJyYXkoIDEyNSwgICAtMSwgICAgMCwgICAgMSApLAoJCQkgICdJU0VSUicgICAgICAgICAgID0+IGFycmF5KCAxMjYsICAgIDEsICAgIDEsICAgIDAgKSwKCQkJICAnSVNURVhUJyAgICAgICAgICA9PiBhcnJheSggMTI3LCAgICAxLCAgICAxLCAgICAwICksCgkJCSAgJ0lTTlVNQkVSJyAgICAgICAgPT4gYXJyYXkoIDEyOCwgICAgMSwgICAgMSwgICAgMCApLAoJCQkgICdJU0JMQU5LJyAgICAgICAgID0+IGFycmF5KCAxMjksICAgIDEsICAgIDEsICAgIDAgKSwKCQkJICAnVCcgICAgICAgICAgICAgICA9PiBhcnJheSggMTMwLCAgICAxLCAgICAwLCAgICAwICksCgkJCSAgJ04nICAgICAgICAgICAgICAgPT4gYXJyYXkoIDEzMSwgICAgMSwgICAgMCwgICAgMCApLAoJCQkgICdEQVRFVkFMVUUnICAgICAgID0+IGFycmF5KCAxNDAsICAgIDEsICAgIDEsICAgIDAgKSwKCQkJICAnVElNRVZBTFVFJyAgICAgICA9PiBhcnJheSggMTQxLCAgICAxLCAgICAxLCAgICAwICksCgkJCSAgJ1NMTicgICAgICAgICAgICAgPT4gYXJyYXkoIDE0MiwgICAgMywgICAgMSwgICAgMCApLAoJCQkgICdTWUQnICAgICAgICAgICAgID0+IGFycmF5KCAxNDMsICAgIDQsICAgIDEsICAgIDAgKSwKCQkJICAnRERCJyAgICAgICAgICAgICA9PiBhcnJheSggMTQ0LCAgIC0xLCAgICAxLCAgICAwICksCgkJCSAgJ0lORElSRUNUJyAgICAgICAgPT4gYXJyYXkoIDE0OCwgICAtMSwgICAgMSwgICAgMSApLAoJCQkgICdDQUxMJyAgICAgICAgICAgID0+IGFycmF5KCAxNTAsICAgLTEsICAgIDEsICAgIDAgKSwKCQkJICAnQ0xFQU4nICAgICAgICAgICA9PiBhcnJheSggMTYyLCAgICAxLCAgICAxLCAgICAwICksCgkJCSAgJ01ERVRFUk0nICAgICAgICAgPT4gYXJyYXkoIDE2MywgICAgMSwgICAgMiwgICAgMCApLAoJCQkgICdNSU5WRVJTRScgICAgICAgID0+IGFycmF5KCAxNjQsICAgIDEsICAgIDIsICAgIDAgKSwKCQkJICAnTU1VTFQnICAgICAgICAgICA9PiBhcnJheSggMTY1LCAgICAyLCAgICAyLCAgICAwICksCgkJCSAgJ0lQTVQnICAgICAgICAgICAgPT4gYXJyYXkoIDE2NywgICAtMSwgICAgMSwgICAgMCApLAoJCQkgICdQUE1UJyAgICAgICAgICAgID0+IGFycmF5KCAxNjgsICAgLTEsICAgIDEsICAgIDAgKSwKCQkJICAnQ09VTlRBJyAgICAgICAgICA9PiBhcnJheSggMTY5LCAgIC0xLCAgICAwLCAgICAwICksCgkJCSAgJ1BST0RVQ1QnICAgICAgICAgPT4gYXJyYXkoIDE4MywgICAtMSwgICAgMCwgICAgMCApLAoJCQkgICdGQUNUJyAgICAgICAgICAgID0+IGFycmF5KCAxODQsICAgIDEsICAgIDEsICAgIDAgKSwKCQkJICAnRFBST0RVQ1QnICAgICAgICA9PiBhcnJheSggMTg5LCAgICAzLCAgICAwLCAgICAwICksCgkJCSAgJ0lTTk9OVEVYVCcgICAgICAgPT4gYXJyYXkoIDE5MCwgICAgMSwgICAgMSwgICAgMCApLAoJCQkgICdTVERFVlAnICAgICAgICAgID0+IGFycmF5KCAxOTMsICAgLTEsICAgIDAsICAgIDAgKSwKCQkJICAnVkFSUCcgICAgICAgICAgICA9PiBhcnJheSggMTk0LCAgIC0xLCAgICAwLCAgICAwICksCgkJCSAgJ0RTVERFVlAnICAgICAgICAgPT4gYXJyYXkoIDE5NSwgICAgMywgICAgMCwgICAgMCApLAoJCQkgICdEVkFSUCcgICAgICAgICAgID0+IGFycmF5KCAxOTYsICAgIDMsICAgIDAsICAgIDAgKSwKCQkJICAnVFJVTkMnICAgICAgICAgICA9PiBhcnJheSggMTk3LCAgIC0xLCAgICAxLCAgICAwICksCgkJCSAgJ0lTTE9HSUNBTCcgICAgICAgPT4gYXJyYXkoIDE5OCwgICAgMSwgICAgMSwgICAgMCApLAoJCQkgICdEQ09VTlRBJyAgICAgICAgID0+IGFycmF5KCAxOTksICAgIDMsICAgIDAsICAgIDAgKSwKCQkJICAnVVNET0xMQVInICAgICAgICA9PiBhcnJheSggMjA0LCAgIC0xLCAgICAxLCAgICAwICksCgkJCSAgJ0ZJTkRCJyAgICAgICAgICAgPT4gYXJyYXkoIDIwNSwgICAtMSwgICAgMSwgICAgMCApLAoJCQkgICdTRUFSQ0hCJyAgICAgICAgID0+IGFycmF5KCAyMDYsICAgLTEsICAgIDEsICAgIDAgKSwKCQkJICAnUkVQTEFDRUInICAgICAgICA9PiBhcnJheSggMjA3LCAgICA0LCAgICAxLCAgICAwICksCgkJCSAgJ0xFRlRCJyAgICAgICAgICAgPT4gYXJyYXkoIDIwOCwgICAtMSwgICAgMSwgICAgMCApLAoJCQkgICdSSUdIVEInICAgICAgICAgID0+IGFycmF5KCAyMDksICAgLTEsICAgIDEsICAgIDAgKSwKCQkJICAnTUlEQicgICAgICAgICAgICA9PiBhcnJheSggMjEwLCAgICAzLCAgICAxLCAgICAwICksCgkJCSAgJ0xFTkInICAgICAgICAgICAgPT4gYXJyYXkoIDIxMSwgICAgMSwgICAgMSwgICAgMCApLAoJCQkgICdST1VORFVQJyAgICAgICAgID0+IGFycmF5KCAyMTIsICAgIDIsICAgIDEsICAgIDAgKSwKCQkJICAnUk9VTkRET1dOJyAgICAgICA9PiBhcnJheSggMjEzLCAgICAyLCAgICAxLCAgICAwICksCgkJCSAgJ0FTQycgICAgICAgICAgICAgPT4gYXJyYXkoIDIxNCwgICAgMSwgICAgMSwgICAgMCApLAoJCQkgICdEQkNTJyAgICAgICAgICAgID0+IGFycmF5KCAyMTUsICAgIDEsICAgIDEsICAgIDAgKSwKCQkJICAnUkFOSycgICAgICAgICAgICA9PiBhcnJheSggMjE2LCAgIC0xLCAgICAwLCAgICAwICksCgkJCSAgJ0FERFJFU1MnICAgICAgICAgPT4gYXJyYXkoIDIxOSwgICAtMSwgICAgMSwgICAgMCApLAoJCQkgICdEQVlTMzYwJyAgICAgICAgID0+IGFycmF5KCAyMjAsICAgLTEsICAgIDEsICAgIDAgKSwKCQkJICAnVE9EQVknICAgICAgICAgICA9PiBhcnJheSggMjIxLCAgICAwLCAgICAxLCAgICAxICksCgkJCSAgJ1ZEQicgICAgICAgICAgICAgPT4gYXJyYXkoIDIyMiwgICAtMSwgICAgMSwgICAgMCApLAoJCQkgICdNRURJQU4nICAgICAgICAgID0+IGFycmF5KCAyMjcsICAgLTEsICAgIDAsICAgIDAgKSwKCQkJICAnU1VNUFJPRFVDVCcgICAgICA9PiBhcnJheSggMjI4LCAgIC0xLCAgICAyLCAgICAwICksCgkJCSAgJ1NJTkgnICAgICAgICAgICAgPT4gYXJyYXkoIDIyOSwgICAgMSwgICAgMSwgICAgMCApLAoJCQkgICdDT1NIJyAgICAgICAgICAgID0+IGFycmF5KCAyMzAsICAgIDEsICAgIDEsICAgIDAgKSwKCQkJICAnVEFOSCcgICAgICAgICAgICA9PiBhcnJheSggMjMxLCAgICAxLCAgICAxLCAgICAwICksCgkJCSAgJ0FTSU5IJyAgICAgICAgICAgPT4gYXJyYXkoIDIzMiwgICAgMSwgICAgMSwgICAgMCApLAoJCQkgICdBQ09TSCcgICAgICAgICAgID0+IGFycmF5KCAyMzMsICAgIDEsICAgIDEsICAgIDAgKSwKCQkJICAnQVRBTkgnICAgICAgICAgICA9PiBhcnJheSggMjM0LCAgICAxLCAgICAxLCAgICAwICksCgkJCSAgJ0RHRVQnICAgICAgICAgICAgPT4gYXJyYXkoIDIzNSwgICAgMywgICAgMCwgICAgMCApLAoJCQkgICdJTkZPJyAgICAgICAgICAgID0+IGFycmF5KCAyNDQsICAgIDEsICAgIDEsICAgIDEgKSwKCQkJICAnREInICAgICAgICAgICAgICA9PiBhcnJheSggMjQ3LCAgIC0xLCAgICAxLCAgICAwICksCgkJCSAgJ0ZSRVFVRU5DWScgICAgICAgPT4gYXJyYXkoIDI1MiwgICAgMiwgICAgMCwgICAgMCApLAoJCQkgICdFUlJPUi5UWVBFJyAgICAgID0+IGFycmF5KCAyNjEsICAgIDEsICAgIDEsICAgIDAgKSwKCQkJICAnUkVHSVNURVIuSUQnICAgICA9PiBhcnJheSggMjY3LCAgIC0xLCAgICAxLCAgICAwICksCgkJCSAgJ0FWRURFVicgICAgICAgICAgPT4gYXJyYXkoIDI2OSwgICAtMSwgICAgMCwgICAgMCApLAoJCQkgICdCRVRBRElTVCcgICAgICAgID0+IGFycmF5KCAyNzAsICAgLTEsICAgIDEsICAgIDAgKSwKCQkJICAnR0FNTUFMTicgICAgICAgICA9PiBhcnJheSggMjcxLCAgICAxLCAgICAxLCAgICAwICksCgkJCSAgJ0JFVEFJTlYnICAgICAgICAgPT4gYXJyYXkoIDI3MiwgICAtMSwgICAgMSwgICAgMCApLAoJCQkgICdCSU5PTURJU1QnICAgICAgID0+IGFycmF5KCAyNzMsICAgIDQsICAgIDEsICAgIDAgKSwKCQkJICAnQ0hJRElTVCcgICAgICAgICA9PiBhcnJheSggMjc0LCAgICAyLCAgICAxLCAgICAwICksCgkJCSAgJ0NISUlOVicgICAgICAgICAgPT4gYXJyYXkoIDI3NSwgICAgMiwgICAgMSwgICAgMCApLAoJCQkgICdDT01CSU4nICAgICAgICAgID0+IGFycmF5KCAyNzYsICAgIDIsICAgIDEsICAgIDAgKSwKCQkJICAnQ09ORklERU5DRScgICAgICA9PiBhcnJheSggMjc3LCAgICAzLCAgICAxLCAgICAwICksCgkJCSAgJ0NSSVRCSU5PTScgICAgICAgPT4gYXJyYXkoIDI3OCwgICAgMywgICAgMSwgICAgMCApLAoJCQkgICdFVkVOJyAgICAgICAgICAgID0+IGFycmF5KCAyNzksICAgIDEsICAgIDEsICAgIDAgKSwKCQkJICAnRVhQT05ESVNUJyAgICAgICA9PiBhcnJheSggMjgwLCAgICAzLCAgICAxLCAgICAwICksCgkJCSAgJ0ZESVNUJyAgICAgICAgICAgPT4gYXJyYXkoIDI4MSwgICAgMywgICAgMSwgICAgMCApLAoJCQkgICdGSU5WJyAgICAgICAgICAgID0+IGFycmF5KCAyODIsICAgIDMsICAgIDEsICAgIDAgKSwKCQkJICAnRklTSEVSJyAgICAgICAgICA9PiBhcnJheSggMjgzLCAgICAxLCAgICAxLCAgICAwICksCgkJCSAgJ0ZJU0hFUklOVicgICAgICAgPT4gYXJyYXkoIDI4NCwgICAgMSwgICAgMSwgICAgMCApLAoJCQkgICdGTE9PUicgICAgICAgICAgID0+IGFycmF5KCAyODUsICAgIDIsICAgIDEsICAgIDAgKSwKCQkJICAnR0FNTUFESVNUJyAgICAgICA9PiBhcnJheSggMjg2LCAgICA0LCAgICAxLCAgICAwICksCgkJCSAgJ0dBTU1BSU5WJyAgICAgICAgPT4gYXJyYXkoIDI4NywgICAgMywgICAgMSwgICAgMCApLAoJCQkgICdDRUlMSU5HJyAgICAgICAgID0+IGFycmF5KCAyODgsICAgIDIsICAgIDEsICAgIDAgKSwKCQkJICAnSFlQR0VPTURJU1QnICAgICA9PiBhcnJheSggMjg5LCAgICA0LCAgICAxLCAgICAwICksCgkJCSAgJ0xPR05PUk1ESVNUJyAgICAgPT4gYXJyYXkoIDI5MCwgICAgMywgICAgMSwgICAgMCApLAoJCQkgICdMT0dJTlYnICAgICAgICAgID0+IGFycmF5KCAyOTEsICAgIDMsICAgIDEsICAgIDAgKSwKCQkJICAnTkVHQklOT01ESVNUJyAgICA9PiBhcnJheSggMjkyLCAgICAzLCAgICAxLCAgICAwICksCgkJCSAgJ05PUk1ESVNUJyAgICAgICAgPT4gYXJyYXkoIDI5MywgICAgNCwgICAgMSwgICAgMCApLAoJCQkgICdOT1JNU0RJU1QnICAgICAgID0+IGFycmF5KCAyOTQsICAgIDEsICAgIDEsICAgIDAgKSwKCQkJICAnTk9STUlOVicgICAgICAgICA9PiBhcnJheSggMjk1LCAgICAzLCAgICAxLCAgICAwICksCgkJCSAgJ05PUk1TSU5WJyAgICAgICAgPT4gYXJyYXkoIDI5NiwgICAgMSwgICAgMSwgICAgMCApLAoJCQkgICdTVEFOREFSRElaRScgICAgID0+IGFycmF5KCAyOTcsICAgIDMsICAgIDEsICAgIDAgKSwKCQkJICAnT0REJyAgICAgICAgICAgICA9PiBhcnJheSggMjk4LCAgICAxLCAgICAxLCAgICAwICksCgkJCSAgJ1BFUk1VVCcgICAgICAgICAgPT4gYXJyYXkoIDI5OSwgICAgMiwgICAgMSwgICAgMCApLAoJCQkgICdQT0lTU09OJyAgICAgICAgID0+IGFycmF5KCAzMDAsICAgIDMsICAgIDEsICAgIDAgKSwKCQkJICAnVERJU1QnICAgICAgICAgICA9PiBhcnJheSggMzAxLCAgICAzLCAgICAxLCAgICAwICksCgkJCSAgJ1dFSUJVTEwnICAgICAgICAgPT4gYXJyYXkoIDMwMiwgICAgNCwgICAgMSwgICAgMCApLAoJCQkgICdTVU1YTVkyJyAgICAgICAgID0+IGFycmF5KCAzMDMsICAgIDIsICAgIDIsICAgIDAgKSwKCQkJICAnU1VNWDJNWTInICAgICAgICA9PiBhcnJheSggMzA0LCAgICAyLCAgICAyLCAgICAwICksCgkJCSAgJ1NVTVgyUFkyJyAgICAgICAgPT4gYXJyYXkoIDMwNSwgICAgMiwgICAgMiwgICAgMCApLAoJCQkgICdDSElURVNUJyAgICAgICAgID0+IGFycmF5KCAzMDYsICAgIDIsICAgIDIsICAgIDAgKSwKCQkJICAnQ09SUkVMJyAgICAgICAgICA9PiBhcnJheSggMzA3LCAgICAyLCAgICAyLCAgICAwICksCgkJCSAgJ0NPVkFSJyAgICAgICAgICAgPT4gYXJyYXkoIDMwOCwgICAgMiwgICAgMiwgICAgMCApLAoJCQkgICdGT1JFQ0FTVCcgICAgICAgID0+IGFycmF5KCAzMDksICAgIDMsICAgIDIsICAgIDAgKSwKCQkJICAnRlRFU1QnICAgICAgICAgICA9PiBhcnJheSggMzEwLCAgICAyLCAgICAyLCAgICAwICksCgkJCSAgJ0lOVEVSQ0VQVCcgICAgICAgPT4gYXJyYXkoIDMxMSwgICAgMiwgICAgMiwgICAgMCApLAoJCQkgICdQRUFSU09OJyAgICAgICAgID0+IGFycmF5KCAzMTIsICAgIDIsICAgIDIsICAgIDAgKSwKCQkJICAnUlNRJyAgICAgICAgICAgICA9PiBhcnJheSggMzEzLCAgICAyLCAgICAyLCAgICAwICksCgkJCSAgJ1NURVlYJyAgICAgICAgICAgPT4gYXJyYXkoIDMxNCwgICAgMiwgICAgMiwgICAgMCApLAoJCQkgICdTTE9QRScgICAgICAgICAgID0+IGFycmF5KCAzMTUsICAgIDIsICAgIDIsICAgIDAgKSwKCQkJICAnVFRFU1QnICAgICAgICAgICA9PiBhcnJheSggMzE2LCAgICA0LCAgICAyLCAgICAwICksCgkJCSAgJ1BST0InICAgICAgICAgICAgPT4gYXJyYXkoIDMxNywgICAtMSwgICAgMiwgICAgMCApLAoJCQkgICdERVZTUScgICAgICAgICAgID0+IGFycmF5KCAzMTgsICAgLTEsICAgIDAsICAgIDAgKSwKCQkJICAnR0VPTUVBTicgICAgICAgICA9PiBhcnJheSggMzE5LCAgIC0xLCAgICAwLCAgICAwICksCgkJCSAgJ0hBUk1FQU4nICAgICAgICAgPT4gYXJyYXkoIDMyMCwgICAtMSwgICAgMCwgICAgMCApLAoJCQkgICdTVU1TUScgICAgICAgICAgID0+IGFycmF5KCAzMjEsICAgLTEsICAgIDAsICAgIDAgKSwKCQkJICAnS1VSVCcgICAgICAgICAgICA9PiBhcnJheSggMzIyLCAgIC0xLCAgICAwLCAgICAwICksCgkJCSAgJ1NLRVcnICAgICAgICAgICAgPT4gYXJyYXkoIDMyMywgICAtMSwgICAgMCwgICAgMCApLAoJCQkgICdaVEVTVCcgICAgICAgICAgID0+IGFycmF5KCAzMjQsICAgLTEsICAgIDAsICAgIDAgKSwKCQkJICAnTEFSR0UnICAgICAgICAgICA9PiBhcnJheSggMzI1LCAgICAyLCAgICAwLCAgICAwICksCgkJCSAgJ1NNQUxMJyAgICAgICAgICAgPT4gYXJyYXkoIDMyNiwgICAgMiwgICAgMCwgICAgMCApLAoJCQkgICdRVUFSVElMRScgICAgICAgID0+IGFycmF5KCAzMjcsICAgIDIsICAgIDAsICAgIDAgKSwKCQkJICAnUEVSQ0VOVElMRScgICAgICA9PiBhcnJheSggMzI4LCAgICAyLCAgICAwLCAgICAwICksCgkJCSAgJ1BFUkNFTlRSQU5LJyAgICAgPT4gYXJyYXkoIDMyOSwgICAtMSwgICAgMCwgICAgMCApLAoJCQkgICdNT0RFJyAgICAgICAgICAgID0+IGFycmF5KCAzMzAsICAgLTEsICAgIDIsICAgIDAgKSwKCQkJICAnVFJJTU1FQU4nICAgICAgICA9PiBhcnJheSggMzMxLCAgICAyLCAgICAwLCAgICAwICksCgkJCSAgJ1RJTlYnICAgICAgICAgICAgPT4gYXJyYXkoIDMzMiwgICAgMiwgICAgMSwgICAgMCApLAoJCQkgICdDT05DQVRFTkFURScgICAgID0+IGFycmF5KCAzMzYsICAgLTEsICAgIDEsICAgIDAgKSwKCQkJICAnUE9XRVInICAgICAgICAgICA9PiBhcnJheSggMzM3LCAgICAyLCAgICAxLCAgICAwICksCgkJCSAgJ1JBRElBTlMnICAgICAgICAgPT4gYXJyYXkoIDM0MiwgICAgMSwgICAgMSwgICAgMCApLAoJCQkgICdERUdSRUVTJyAgICAgICAgID0+IGFycmF5KCAzNDMsICAgIDEsICAgIDEsICAgIDAgKSwKCQkJICAnU1VCVE9UQUwnICAgICAgICA9PiBhcnJheSggMzQ0LCAgIC0xLCAgICAwLCAgICAwICksCgkJCSAgJ1NVTUlGJyAgICAgICAgICAgPT4gYXJyYXkoIDM0NSwgICAtMSwgICAgMCwgICAgMCApLAoJCQkgICdDT1VOVElGJyAgICAgICAgID0+IGFycmF5KCAzNDYsICAgIDIsICAgIDAsICAgIDAgKSwKCQkJICAnQ09VTlRCTEFOSycgICAgICA9PiBhcnJheSggMzQ3LCAgICAxLCAgICAwLCAgICAwICksCgkJCSAgJ0lTUE1UJyAgICAgICAgICAgPT4gYXJyYXkoIDM1MCwgICAgNCwgICAgMSwgICAgMCApLAoJCQkgICdEQVRFRElGJyAgICAgICAgID0+IGFycmF5KCAzNTEsICAgIDMsICAgIDEsICAgIDAgKSwKCQkJICAnREFURVNUUklORycgICAgICA9PiBhcnJheSggMzUyLCAgICAxLCAgICAxLCAgICAwICksCgkJCSAgJ05VTUJFUlNUUklORycgICAgPT4gYXJyYXkoIDM1MywgICAgMiwgICAgMSwgICAgMCApLAoJCQkgICdST01BTicgICAgICAgICAgID0+IGFycmF5KCAzNTQsICAgLTEsICAgIDEsICAgIDAgKSwKCQkJICAnR0VUUElWT1REQVRBJyAgICA9PiBhcnJheSggMzU4LCAgIC0xLCAgICAwLCAgICAwICksCgkJCSAgJ0hZUEVSTElOSycgICAgICAgPT4gYXJyYXkoIDM1OSwgICAtMSwgICAgMSwgICAgMCApLAoJCQkgICdQSE9ORVRJQycgICAgICAgID0+IGFycmF5KCAzNjAsICAgIDEsICAgIDAsICAgIDAgKSwKCQkJICAnQVZFUkFHRUEnICAgICAgICA9PiBhcnJheSggMzYxLCAgIC0xLCAgICAwLCAgICAwICksCgkJCSAgJ01BWEEnICAgICAgICAgICAgPT4gYXJyYXkoIDM2MiwgICAtMSwgICAgMCwgICAgMCApLAoJCQkgICdNSU5BJyAgICAgICAgICAgID0+IGFycmF5KCAzNjMsICAgLTEsICAgIDAsICAgIDAgKSwKCQkJICAnU1RERVZQQScgICAgICAgICA9PiBhcnJheSggMzY0LCAgIC0xLCAgICAwLCAgICAwICksCgkJCSAgJ1ZBUlBBJyAgICAgICAgICAgPT4gYXJyYXkoIDM2NSwgICAtMSwgICAgMCwgICAgMCApLAoJCQkgICdTVERFVkEnICAgICAgICAgID0+IGFycmF5KCAzNjYsICAgLTEsICAgIDAsICAgIDAgKSwKCQkJICAnVkFSQScgICAgICAgICAgICA9PiBhcnJheSggMzY3LCAgIC0xLCAgICAwLCAgICAwICksCgkJCSAgJ0JBSFRURVhUJyAgICAgICAgPT4gYXJyYXkoIDM2OCwgICAgMSwgICAgMCwgICAgMCApLAoJCQkgICk7Cgl9CgoJLyoqCgkgKiBDb252ZXJ0IGEgdG9rZW4gdG8gdGhlIHByb3BlciBwdGcgdmFsdWUuCgkgKgoJICogQGFjY2VzcyBwcml2YXRlCgkgKiBAcGFyYW0gbWl4ZWQgJHRva2VuIFRoZSB0b2tlbiB0byBjb252ZXJ0LgoJICogQHJldHVybiBtaXhlZCB0aGUgY29udmVydGVkIHRva2VuIG9uIHN1Y2Nlc3MKCSAqLwoJZnVuY3Rpb24gX2NvbnZlcnQoJHRva2VuKQoJewoJCWlmIChwcmVnX21hdGNoKCIvXCIoW15cIl18XCJcIil7MCwyNTV9XCIvIiwgJHRva2VuKSkgewoJCQlyZXR1cm4gJHRoaXMtPl9jb252ZXJ0U3RyaW5nKCR0b2tlbik7CgoJCX0gZWxzZWlmIChpc19udW1lcmljKCR0b2tlbikpIHsKCQkJcmV0dXJuICR0aGlzLT5fY29udmVydE51bWJlcigkdG9rZW4pOwoKCQkvLyBtYXRjaCByZWZlcmVuY2VzIGxpa2UgQTEgb3IgJEEkMQoJCX0gZWxzZWlmIChwcmVnX21hdGNoKCcvXlwkPyhbQS1JYS1pXT9bQS1aYS16XSlcJD8oXGQrKSQvJywkdG9rZW4pKSB7CgkJCXJldHVybiAkdGhpcy0+X2NvbnZlcnRSZWYyZCgkdG9rZW4pOwoKCQkvLyBtYXRjaCBleHRlcm5hbCByZWZlcmVuY2VzIGxpa2UgU2hlZXQxIUExIG9yIFNoZWV0MTpTaGVldDIhQTEgb3IgU2hlZXQxISRBJDEgb3IgU2hlZXQxOlNoZWV0MiEkQSQxCgkJfSBlbHNlaWYgKHByZWdfbWF0Y2goIi9eIiAuIHNlbGY6OlJFR0VYX1NIRUVUX1RJVExFX1VOUVVPVEVEIC4gIihcOiIgLiBzZWxmOjpSRUdFWF9TSEVFVF9USVRMRV9VTlFVT1RFRCAuICIpP1whXFwkP1tBLUlhLWldP1tBLVphLXpdXFwkPyhcZCspJC91IiwkdG9rZW4pKSB7CgkJCXJldHVybiAkdGhpcy0+X2NvbnZlcnRSZWYzZCgkdG9rZW4pOwoKCQkvLyBtYXRjaCBleHRlcm5hbCByZWZlcmVuY2VzIGxpa2UgJ1NoZWV0MSchQTEgb3IgJ1NoZWV0MTpTaGVldDInIUExIG9yICdTaGVldDEnISRBJDEgb3IgJ1NoZWV0MTpTaGVldDInISRBJDEKCQl9IGVsc2VpZiAocHJlZ19tYXRjaCgiL14nIiAuIHNlbGY6OlJFR0VYX1NIRUVUX1RJVExFX1FVT1RFRCAuICIoXDoiIC4gc2VsZjo6UkVHRVhfU0hFRVRfVElUTEVfUVVPVEVEIC4gIik/J1whXFwkP1tBLUlhLWldP1tBLVphLXpdXFwkPyhcZCspJC91IiwkdG9rZW4pKSB7CgkJCXJldHVybiAkdGhpcy0+X2NvbnZlcnRSZWYzZCgkdG9rZW4pOwoKCQkvLyBtYXRjaCByYW5nZXMgbGlrZSBBMTpCMiBvciAkQSQxOiRCJDIKCQl9IGVsc2VpZiAocHJlZ19tYXRjaCgnL14oXCQpP1tBLUlhLWldP1tBLVphLXpdKFwkKT8oXGQrKVw6KFwkKT9bQS1JYS1pXT9bQS1aYS16XShcJCk/KFxkKykkLycsICR0b2tlbikpIHsKCQkJcmV0dXJuICR0aGlzLT5fY29udmVydFJhbmdlMmQoJHRva2VuKTsKCgkJLy8gbWF0Y2ggZXh0ZXJuYWwgcmFuZ2VzIGxpa2UgU2hlZXQxIUExOkIyIG9yIFNoZWV0MTpTaGVldDIhQTE6QjIgb3IgU2hlZXQxISRBJDE6JEIkMiBvciBTaGVldDE6U2hlZXQyISRBJDE6JEIkMgoJCX0gZWxzZWlmIChwcmVnX21hdGNoKCIvXiIgLiBzZWxmOjpSRUdFWF9TSEVFVF9USVRMRV9VTlFVT1RFRCAuICIoXDoiIC4gc2VsZjo6UkVHRVhfU0hFRVRfVElUTEVfVU5RVU9URUQgLiAiKT9cIVxcJD8oW0EtSWEtaV0/W0EtWmEtel0pP1xcJD8oXGQrKVw6XFwkPyhbQS1JYS1pXT9bQS1aYS16XSk/XFwkPyhcZCspJC91IiwkdG9rZW4pKSB7CgkJCXJldHVybiAkdGhpcy0+X2NvbnZlcnRSYW5nZTNkKCR0b2tlbik7CgoJCS8vIG1hdGNoIGV4dGVybmFsIHJhbmdlcyBsaWtlICdTaGVldDEnIUExOkIyIG9yICdTaGVldDE6U2hlZXQyJyFBMTpCMiBvciAnU2hlZXQxJyEkQSQxOiRCJDIgb3IgJ1NoZWV0MTpTaGVldDInISRBJDE6JEIkMgoJCX0gZWxzZWlmIChwcmVnX21hdGNoKCIvXiciIC4gc2VsZjo6UkVHRVhfU0hFRVRfVElUTEVfUVVPVEVEIC4gIihcOiIgLiBzZWxmOjpSRUdFWF9TSEVFVF9USVRMRV9RVU9URUQgLiAiKT8nXCFcXCQ/KFtBLUlhLWldP1tBLVphLXpdKT9cXCQ/KFxkKylcOlxcJD8oW0EtSWEtaV0/W0EtWmEtel0pP1xcJD8oXGQrKSQvdSIsJHRva2VuKSkgewoJCQlyZXR1cm4gJHRoaXMtPl9jb252ZXJ0UmFuZ2UzZCgkdG9rZW4pOwoKCQkvLyBvcGVyYXRvcnMgKGluY2x1ZGluZyBwYXJlbnRoZXNlcykKCQl9IGVsc2VpZiAoaXNzZXQoJHRoaXMtPnB0Z1skdG9rZW5dKSkgewoJCQlyZXR1cm4gcGFjaygiQyIsICR0aGlzLT5wdGdbJHRva2VuXSk7CgogICAgICAgIC8vIG1hdGNoIGVycm9yIGNvZGVzCgkJfSBlbHNlaWYgKHByZWdfbWF0Y2goIi9eI1tBLVowXC9dezMsNX1bIT9dezF9JC8iLCAkdG9rZW4pIG9yICR0b2tlbiA9PSAnI04vQScpIHsKCQkgICAgcmV0dXJuICR0aGlzLT5fY29udmVydEVycm9yKCR0b2tlbik7CgoJCS8vIGNvbW1lbnRlZCBzbyBhcmd1bWVudCBudW1iZXIgY2FuIGJlIHByb2Nlc3NlZCBjb3JyZWN0bHkuIFNlZSB0b1JldmVyc2VQb2xpc2goKS4KCQkvKmVsc2VpZiAocHJlZ19tYXRjaCgiL1tBLVowLTlceGMwLVx4ZGNcLl0rLyIsJHRva2VuKSkKCQl7CgkJCXJldHVybigkdGhpcy0+X2NvbnZlcnRGdW5jdGlvbigkdG9rZW4sJHRoaXMtPl9mdW5jX2FyZ3MpKTsKCQl9Ki8KCgkJLy8gaWYgaXQncyBhbiBhcmd1bWVudCwgaWdub3JlIHRoZSB0b2tlbiAodGhlIGFyZ3VtZW50IHJlbWFpbnMpCgkJfSBlbHNlaWYgKCR0b2tlbiA9PSAnYXJnJykgewoJCQlyZXR1cm4gJyc7CgkJfQoKCQkvLyBUT0RPOiB1c2UgcmVhbCBlcnJvciBjb2RlcwoJCXRocm93IG5ldyBFeGNlcHRpb24oIlVua25vd24gdG9rZW4gJHRva2VuIik7Cgl9CgoJLyoqCgkgKiBDb252ZXJ0IGEgbnVtYmVyIHRva2VuIHRvIHB0Z0ludCBvciBwdGdOdW0KCSAqCgkgKiBAYWNjZXNzIHByaXZhdGUKCSAqIEBwYXJhbSBtaXhlZCAkbnVtIGFuIGludGVnZXIgb3IgZG91YmxlIGZvciBjb252ZXJzaW9uIHRvIGl0cyBwdGcgdmFsdWUKCSAqLwoJZnVuY3Rpb24gX2NvbnZlcnROdW1iZXIoJG51bSkKCXsKCQkvLyBJbnRlZ2VyIGluIHRoZSByYW5nZSAwLi4yKioxNi0xCgkJaWYgKChwcmVnX21hdGNoKCIvXlxkKyQvIiwgJG51bSkpIGFuZCAoJG51bSA8PSA2NTUzNSkpIHsKCQkJcmV0dXJuIHBhY2soIkN2IiwgJHRoaXMtPnB0Z1sncHRnSW50J10sICRudW0pOwoJCX0gZWxzZSB7IC8vIEEgZmxvYXQKCQkJaWYgKFBIUEV4Y2VsX1dyaXRlcl9FeGNlbDVfQklGRndyaXRlcjo6Z2V0Qnl0ZU9yZGVyKCkpIHsgLy8gaWYgaXQncyBCaWcgRW5kaWFuCgkJCQkkbnVtID0gc3RycmV2KCRudW0pOwoJCQl9CgkJCXJldHVybiBwYWNrKCJDZCIsICR0aGlzLT5wdGdbJ3B0Z051bSddLCAkbnVtKTsKCQl9Cgl9CgoJLyoqCgkgKiBDb252ZXJ0IGEgc3RyaW5nIHRva2VuIHRvIHB0Z1N0cgoJICoKCSAqIEBhY2Nlc3MgcHJpdmF0ZQoJICogQHBhcmFtIHN0cmluZyAkc3RyaW5nIEEgc3RyaW5nIGZvciBjb252ZXJzaW9uIHRvIGl0cyBwdGcgdmFsdWUuCgkgKiBAcmV0dXJuIG1peGVkIHRoZSBjb252ZXJ0ZWQgdG9rZW4gb24gc3VjY2VzcwoJICovCglmdW5jdGlvbiBfY29udmVydFN0cmluZygkc3RyaW5nKQoJewoJCS8vIGNob3AgYXdheSBiZWdnaW5pbmcgYW5kIGVuZGluZyBxdW90ZXMKCQkkc3RyaW5nID0gc3Vic3RyKCRzdHJpbmcsIDEsIHN0cmxlbigkc3RyaW5nKSAtIDIpOwoJCWlmIChzdHJsZW4oJHN0cmluZykgPiAyNTUpIHsKCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbigiU3RyaW5nIGlzIHRvbyBsb25nIik7CgkJfQoKCQlyZXR1cm4gcGFjaygnQycsICR0aGlzLT5wdGdbJ3B0Z1N0ciddKSAuIFBIUEV4Y2VsX1NoYXJlZF9TdHJpbmc6OlVURjh0b0JJRkY4VW5pY29kZVNob3J0KCRzdHJpbmcpOwoJfQoKCS8qKgoJICogQ29udmVydCBhIGZ1bmN0aW9uIHRvIGEgcHRnRnVuYyBvciBwdGdGdW5jVmFyViBkZXBlbmRpbmcgb24gdGhlIG51bWJlciBvZgoJICogYXJncyB0aGF0IGl0IHRha2VzLgoJICoKCSAqIEBhY2Nlc3MgcHJpdmF0ZQoJICogQHBhcmFtIHN0cmluZyAgJHRva2VuICAgIFRoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbiBmb3IgY29udmVydGlvbiB0byBwdGcgdmFsdWUuCgkgKiBAcGFyYW0gaW50ZWdlciAkbnVtX2FyZ3MgVGhlIG51bWJlciBvZiBhcmd1bWVudHMgdGhlIGZ1bmN0aW9uIHJlY2VpdmVzLgoJICogQHJldHVybiBzdHJpbmcgVGhlIHBhY2tlZCBwdGcgZm9yIHRoZSBmdW5jdGlvbgoJICovCglmdW5jdGlvbiBfY29udmVydEZ1bmN0aW9uKCR0b2tlbiwgJG51bV9hcmdzKQoJewoJCSRhcmdzICAgICA9ICR0aGlzLT5fZnVuY3Rpb25zWyR0b2tlbl1bMV07Ci8vCQkkdm9sYXRpbGUgPSAkdGhpcy0+X2Z1bmN0aW9uc1skdG9rZW5dWzNdOwoKCQkvLyBGaXhlZCBudW1iZXIgb2YgYXJncyBlZy4gVElNRSgkaSwkaiwkaykuCgkJaWYgKCRhcmdzID49IDApIHsKCQkJcmV0dXJuIHBhY2soIkN2IiwgJHRoaXMtPnB0Z1sncHRnRnVuY1YnXSwgJHRoaXMtPl9mdW5jdGlvbnNbJHRva2VuXVswXSk7CgkJfQoJCS8vIFZhcmlhYmxlIG51bWJlciBvZiBhcmdzIGVnLiBTVU0oJGksJGosJGssIC4uKS4KCQlpZiAoJGFyZ3MgPT0gLTEpIHsKCQkJcmV0dXJuIHBhY2soIkNDdiIsICR0aGlzLT5wdGdbJ3B0Z0Z1bmNWYXJWJ10sICRudW1fYXJncywgJHRoaXMtPl9mdW5jdGlvbnNbJHRva2VuXVswXSk7CgkJfQoJfQoKCS8qKgoJICogQ29udmVydCBhbiBFeGNlbCByYW5nZSBzdWNoIGFzIEExOkQ0IHRvIGEgcHRnUmVmVi4KCSAqCgkgKiBAYWNjZXNzIHByaXZhdGUKCSAqIEBwYXJhbSBzdHJpbmcJJHJhbmdlCUFuIEV4Y2VsIHJhbmdlIGluIHRoZSBBMTpBMgoJICogQHBhcmFtIGludAkJJGNsYXNzCgkgKi8KCWZ1bmN0aW9uIF9jb252ZXJ0UmFuZ2UyZCgkcmFuZ2UsICRjbGFzcz0wKQoJewoKCQkvLyBUT0RPOiBwb3NzaWJsZSBjbGFzcyB2YWx1ZSAwLDEsMiBjaGVjayBGb3JtdWxhLnBtCgkJLy8gU3BsaXQgdGhlIHJhbmdlIGludG8gMiBjZWxsIHJlZnMKCQlpZiAocHJlZ19tYXRjaCgnL14oXCQpPyhbQS1JYS1pXT9bQS1aYS16XSkoXCQpPyhcZCspXDooXCQpPyhbQS1JYS1pXT9bQS1aYS16XSkoXCQpPyhcZCspJC8nLCAkcmFuZ2UpKSB7CgkJCWxpc3QoJGNlbGwxLCAkY2VsbDIpID0gZXhwbG9kZSgnOicsICRyYW5nZSk7CgkJfSBlbHNlIHsKCQkJLy8gVE9ETzogdXNlIHJlYWwgZXJyb3IgY29kZXMKCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbigiVW5rbm93biByYW5nZSBzZXBhcmF0b3IiKTsKCQl9CgoJCS8vIENvbnZlcnQgdGhlIGNlbGwgcmVmZXJlbmNlcwoJCWxpc3QoJHJvdzEsICRjb2wxKSA9ICR0aGlzLT5fY2VsbFRvUGFja2VkUm93Y29sKCRjZWxsMSk7CgkJbGlzdCgkcm93MiwgJGNvbDIpID0gJHRoaXMtPl9jZWxsVG9QYWNrZWRSb3djb2woJGNlbGwyKTsKCgkJLy8gVGhlIHB0ZyB2YWx1ZSBkZXBlbmRzIG9uIHRoZSBjbGFzcyBvZiB0aGUgcHRnLgoJCWlmICgkY2xhc3MgPT0gMCkgewoJCQkkcHRnQXJlYSA9IHBhY2soIkMiLCAkdGhpcy0+cHRnWydwdGdBcmVhJ10pOwoJCX0gZWxzZWlmICgkY2xhc3MgPT0gMSkgewoJCQkkcHRnQXJlYSA9IHBhY2soIkMiLCAkdGhpcy0+cHRnWydwdGdBcmVhViddKTsKCQl9IGVsc2VpZiAoJGNsYXNzID09IDIpIHsKCQkJJHB0Z0FyZWEgPSBwYWNrKCJDIiwgJHRoaXMtPnB0Z1sncHRnQXJlYUEnXSk7CgkJfSBlbHNlIHsKCQkJLy8gVE9ETzogdXNlIHJlYWwgZXJyb3IgY29kZXMKCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbigiVW5rbm93biBjbGFzcyAkY2xhc3MiKTsKCQl9CgkJcmV0dXJuICRwdGdBcmVhIC4gJHJvdzEgLiAkcm93MiAuICRjb2wxLiAkY29sMjsKCX0KCgkvKioKCSAqIENvbnZlcnQgYW4gRXhjZWwgM2QgcmFuZ2Ugc3VjaCBhcyAiU2hlZXQxIUExOkQ0IiBvciAiU2hlZXQxOlNoZWV0MiFBMTpENCIgdG8KCSAqIGEgcHRnQXJlYTNkLgoJICoKCSAqIEBhY2Nlc3MgcHJpdmF0ZQoJICogQHBhcmFtIHN0cmluZyAkdG9rZW4gQW4gRXhjZWwgcmFuZ2UgaW4gdGhlIFNoZWV0MSFBMTpBMiBmb3JtYXQuCgkgKiBAcmV0dXJuIG1peGVkIFRoZSBwYWNrZWQgcHRnQXJlYTNkIHRva2VuIG9uIHN1Y2Nlc3MuCgkgKi8KCWZ1bmN0aW9uIF9jb252ZXJ0UmFuZ2UzZCgkdG9rZW4pCgl7Ci8vCQkkY2xhc3MgPSAwOyAvLyBmb3JtdWxhcyBsaWtlIFNoZWV0MSEkQSQxOiRBJDIgaW4gbGlzdCB0eXBlIGRhdGEgdmFsaWRhdGlvbiBuZWVkIHRoaXMgY2xhc3MgKDB4M0IpCgoJCS8vIFNwbGl0IHRoZSByZWYgYXQgdGhlICEgc3ltYm9sCgkJbGlzdCgkZXh0X3JlZiwgJHJhbmdlKSA9IGV4cGxvZGUoJyEnLCAkdG9rZW4pOwoKCQkvLyBDb252ZXJ0IHRoZSBleHRlcm5hbCByZWZlcmVuY2UgcGFydCAoZGlmZmVyZW50IGZvciBCSUZGOCkKCQkkZXh0X3JlZiA9ICR0aGlzLT5fZ2V0UmVmSW5kZXgoJGV4dF9yZWYpOwoKCQkvLyBTcGxpdCB0aGUgcmFuZ2UgaW50byAyIGNlbGwgcmVmcwoJCWxpc3QoJGNlbGwxLCAkY2VsbDIpID0gZXhwbG9kZSgnOicsICRyYW5nZSk7CgoJCS8vIENvbnZlcnQgdGhlIGNlbGwgcmVmZXJlbmNlcwoJCWlmIChwcmVnX21hdGNoKCIvXihcXCQpP1tBLUlhLWldP1tBLVphLXpdKFxcJCk/KFxkKykkLyIsICRjZWxsMSkpIHsKCQkJbGlzdCgkcm93MSwgJGNvbDEpID0gJHRoaXMtPl9jZWxsVG9QYWNrZWRSb3djb2woJGNlbGwxKTsKCQkJbGlzdCgkcm93MiwgJGNvbDIpID0gJHRoaXMtPl9jZWxsVG9QYWNrZWRSb3djb2woJGNlbGwyKTsKCQl9IGVsc2UgeyAvLyBJdCdzIGEgcm93cyByYW5nZSAobGlrZSAyNjoyNykKCQkJIGxpc3QoJHJvdzEsICRjb2wxLCAkcm93MiwgJGNvbDIpID0gJHRoaXMtPl9yYW5nZVRvUGFja2VkUmFuZ2UoJGNlbGwxLic6Jy4kY2VsbDIpOwoJCX0KCgkJLy8gVGhlIHB0ZyB2YWx1ZSBkZXBlbmRzIG9uIHRoZSBjbGFzcyBvZiB0aGUgcHRnLgovLwkJaWYgKCRjbGFzcyA9PSAwKSB7CgkJCSRwdGdBcmVhID0gcGFjaygiQyIsICR0aGlzLT5wdGdbJ3B0Z0FyZWEzZCddKTsKLy8JCX0gZWxzZWlmICgkY2xhc3MgPT0gMSkgewovLwkJCSRwdGdBcmVhID0gcGFjaygiQyIsICR0aGlzLT5wdGdbJ3B0Z0FyZWEzZFYnXSk7Ci8vCQl9IGVsc2VpZiAoJGNsYXNzID09IDIpIHsKLy8JCQkkcHRnQXJlYSA9IHBhY2soIkMiLCAkdGhpcy0+cHRnWydwdGdBcmVhM2RBJ10pOwovLwkJfSBlbHNlIHsKLy8JCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCJVbmtub3duIGNsYXNzICRjbGFzcyIpOwovLwkJfQoKCQlyZXR1cm4gJHB0Z0FyZWEgLiAkZXh0X3JlZiAuICRyb3cxIC4gJHJvdzIgLiAkY29sMS4gJGNvbDI7Cgl9CgoJLyoqCgkgKiBDb252ZXJ0IGFuIEV4Y2VsIHJlZmVyZW5jZSBzdWNoIGFzIEExLCAkQjIsIEMkMyBvciAkRCQ0IHRvIGEgcHRnUmVmVi4KCSAqCgkgKiBAYWNjZXNzIHByaXZhdGUKCSAqIEBwYXJhbSBzdHJpbmcgJGNlbGwgQW4gRXhjZWwgY2VsbCByZWZlcmVuY2UKCSAqIEByZXR1cm4gc3RyaW5nIFRoZSBjZWxsIGluIHBhY2tlZCgpIGZvcm1hdCB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIHB0ZwoJICovCglmdW5jdGlvbiBfY29udmVydFJlZjJkKCRjZWxsKQoJewovLwkJJGNsYXNzID0gMjsgLy8gYXMgZmFyIGFzIEkga25vdywgdGhpcyBpcyBtYWdpY2suCgoJCS8vIENvbnZlcnQgdGhlIGNlbGwgcmVmZXJlbmNlCgkJJGNlbGxfYXJyYXkgPSAkdGhpcy0+X2NlbGxUb1BhY2tlZFJvd2NvbCgkY2VsbCk7CgkJbGlzdCgkcm93LCAkY29sKSA9ICRjZWxsX2FycmF5OwoKCQkvLyBUaGUgcHRnIHZhbHVlIGRlcGVuZHMgb24gdGhlIGNsYXNzIG9mIHRoZSBwdGcuCi8vCQlpZiAoJGNsYXNzID09IDApIHsKLy8JCQkkcHRnUmVmID0gcGFjaygiQyIsICR0aGlzLT5wdGdbJ3B0Z1JlZiddKTsKLy8JCX0gZWxzZWlmICgkY2xhc3MgPT0gMSkgewovLwkJCSRwdGdSZWYgPSBwYWNrKCJDIiwgJHRoaXMtPnB0Z1sncHRnUmVmViddKTsKLy8JCX0gZWxzZWlmICgkY2xhc3MgPT0gMikgewoJCQkkcHRnUmVmID0gcGFjaygiQyIsICR0aGlzLT5wdGdbJ3B0Z1JlZkEnXSk7Ci8vCQl9IGVsc2UgewovLwkJCS8vIFRPRE86IHVzZSByZWFsIGVycm9yIGNvZGVzCi8vCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbigiVW5rbm93biBjbGFzcyAkY2xhc3MiKTsKLy8JCX0KCQlyZXR1cm4gJHB0Z1JlZi4kcm93LiRjb2w7Cgl9CgoJLyoqCgkgKiBDb252ZXJ0IGFuIEV4Y2VsIDNkIHJlZmVyZW5jZSBzdWNoIGFzICJTaGVldDEhQTEiIG9yICJTaGVldDE6U2hlZXQyIUExIiB0byBhCgkgKiBwdGdSZWYzZC4KCSAqCgkgKiBAYWNjZXNzIHByaXZhdGUKCSAqIEBwYXJhbSBzdHJpbmcgJGNlbGwgQW4gRXhjZWwgY2VsbCByZWZlcmVuY2UKCSAqIEByZXR1cm4gbWl4ZWQgVGhlIHBhY2tlZCBwdGdSZWYzZCB0b2tlbiBvbiBzdWNjZXNzLgoJICovCglmdW5jdGlvbiBfY29udmVydFJlZjNkKCRjZWxsKQoJewovLwkJJGNsYXNzID0gMjsgLy8gYXMgZmFyIGFzIEkga25vdywgdGhpcyBpcyBtYWdpY2suCgoJCS8vIFNwbGl0IHRoZSByZWYgYXQgdGhlICEgc3ltYm9sCgkJbGlzdCgkZXh0X3JlZiwgJGNlbGwpID0gZXhwbG9kZSgnIScsICRjZWxsKTsKCgkJLy8gQ29udmVydCB0aGUgZXh0ZXJuYWwgcmVmZXJlbmNlIHBhcnQgKGRpZmZlcmVudCBmb3IgQklGRjgpCgkJJGV4dF9yZWYgPSAkdGhpcy0+X2dldFJlZkluZGV4KCRleHRfcmVmKTsKCgkJLy8gQ29udmVydCB0aGUgY2VsbCByZWZlcmVuY2UgcGFydAoJCWxpc3QoJHJvdywgJGNvbCkgPSAkdGhpcy0+X2NlbGxUb1BhY2tlZFJvd2NvbCgkY2VsbCk7CgoJCS8vIFRoZSBwdGcgdmFsdWUgZGVwZW5kcyBvbiB0aGUgY2xhc3Mgb2YgdGhlIHB0Zy4KLy8JCWlmICgkY2xhc3MgPT0gMCkgewovLwkJCSRwdGdSZWYgPSBwYWNrKCJDIiwgJHRoaXMtPnB0Z1sncHRnUmVmM2QnXSk7Ci8vCQl9IGVsc2VpZiAoJGNsYXNzID09IDEpIHsKLy8JCQkkcHRnUmVmID0gcGFjaygiQyIsICR0aGlzLT5wdGdbJ3B0Z1JlZjNkViddKTsKLy8JCX0gZWxzZWlmICgkY2xhc3MgPT0gMikgewoJCQkkcHRnUmVmID0gcGFjaygiQyIsICR0aGlzLT5wdGdbJ3B0Z1JlZjNkQSddKTsKLy8JCX0gZWxzZSB7Ci8vCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbigiVW5rbm93biBjbGFzcyAkY2xhc3MiKTsKLy8JCX0KCgkJcmV0dXJuICRwdGdSZWYgLiAkZXh0X3JlZi4gJHJvdyAuICRjb2w7Cgl9CgogICAgLyoqCiAgICAgKiBDb252ZXJ0IGFuIGVycm9yIGNvZGUgdG8gYSBwdGdFcnIKICAgICAqCiAgICAgKiBAYWNjZXNzCXByaXZhdGUKCSAqIEBwYXJhbQlzdHJpbmcJJGVycm9yQ29kZQlUaGUgZXJyb3IgY29kZSBmb3IgY29udmVyc2lvbiB0byBpdHMgcHRnIHZhbHVlCiAgICAgKiBAcmV0dXJuCXN0cmluZwkJCQlUaGUgZXJyb3IgY29kZSBwdGdFcnIKICAgICAqLwogICAgZnVuY3Rpb24gX2NvbnZlcnRFcnJvcigkZXJyb3JDb2RlKQogICAgewoJCXN3aXRjaCAoJGVycm9yQ29kZSkgewoJCQljYXNlICcjTlVMTCEnOglyZXR1cm4gcGFjaygiQyIsIDB4MDApOwoJCQljYXNlICcjRElWLzAhJzoJcmV0dXJuIHBhY2soIkMiLCAweDA3KTsKCQkJY2FzZSAnI1ZBTFVFISc6CXJldHVybiBwYWNrKCJDIiwgMHgwRik7CgkJCWNhc2UgJyNSRUYhJzoJcmV0dXJuIHBhY2soIkMiLCAweDE3KTsKCQkJY2FzZSAnI05BTUU/JzoJcmV0dXJuIHBhY2soIkMiLCAweDFEKTsKCQkJY2FzZSAnI05VTSEnOglyZXR1cm4gcGFjaygiQyIsIDB4MjQpOwoJCQljYXNlICcjTi9BJzoJcmV0dXJuIHBhY2soIkMiLCAweDJBKTsKCQl9CgkJcmV0dXJuIHBhY2soIkMiLCAweEZGKTsKICAgIH0KCgkvKioKCSAqIENvbnZlcnQgdGhlIHNoZWV0IG5hbWUgcGFydCBvZiBhbiBleHRlcm5hbCByZWZlcmVuY2UsIGZvciBleGFtcGxlICJTaGVldDEiIG9yCgkgKiAiU2hlZXQxOlNoZWV0MiIsIHRvIGEgcGFja2VkIHN0cnVjdHVyZS4KCSAqCgkgKiBAYWNjZXNzCXByaXZhdGUKCSAqIEBwYXJhbQlzdHJpbmcJJGV4dF9yZWYJVGhlIG5hbWUgb2YgdGhlIGV4dGVybmFsIHJlZmVyZW5jZQoJICogQHJldHVybglzdHJpbmcJCQkJVGhlIHJlZmVyZW5jZSBpbmRleCBpbiBwYWNrZWQoKSBmb3JtYXQKCSAqLwoJZnVuY3Rpb24gX3BhY2tFeHRSZWYoJGV4dF9yZWYpCgl7CgkJJGV4dF9yZWYgPSBwcmVnX3JlcGxhY2UoIi9eJy8iLCAnJywgJGV4dF9yZWYpOyAvLyBSZW1vdmUgbGVhZGluZyAgJyBpZiBhbnkuCgkJJGV4dF9yZWYgPSBwcmVnX3JlcGxhY2UoIi8nJC8iLCAnJywgJGV4dF9yZWYpOyAvLyBSZW1vdmUgdHJhaWxpbmcgJyBpZiBhbnkuCgoJCS8vIENoZWNrIGlmIHRoZXJlIGlzIGEgc2hlZXQgcmFuZ2UgZWcuLCBTaGVldDE6U2hlZXQyLgoJCWlmIChwcmVnX21hdGNoKCIvOi8iLCAkZXh0X3JlZikpIHsKCQkJbGlzdCgkc2hlZXRfbmFtZTEsICRzaGVldF9uYW1lMikgPSBleHBsb2RlKCc6JywgJGV4dF9yZWYpOwoKCQkJJHNoZWV0MSA9ICR0aGlzLT5fZ2V0U2hlZXRJbmRleCgkc2hlZXRfbmFtZTEpOwoJCQlpZiAoJHNoZWV0MSA9PSAtMSkgewoJCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbigiVW5rbm93biBzaGVldCBuYW1lICRzaGVldF9uYW1lMSBpbiBmb3JtdWxhIik7CgkJCX0KCQkJJHNoZWV0MiA9ICR0aGlzLT5fZ2V0U2hlZXRJbmRleCgkc2hlZXRfbmFtZTIpOwoJCQlpZiAoJHNoZWV0MiA9PSAtMSkgewoJCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbigiVW5rbm93biBzaGVldCBuYW1lICRzaGVldF9uYW1lMiBpbiBmb3JtdWxhIik7CgkJCX0KCgkJCS8vIFJldmVyc2UgbWF4IGFuZCBtaW4gc2hlZXQgbnVtYmVycyBpZiBuZWNlc3NhcnkKCQkJaWYgKCRzaGVldDEgPiAkc2hlZXQyKSB7CgkJCQlsaXN0KCRzaGVldDEsICRzaGVldDIpID0gYXJyYXkoJHNoZWV0MiwgJHNoZWV0MSk7CgkJCX0KCQl9IGVsc2UgeyAvLyBTaW5nbGUgc2hlZXQgbmFtZSBvbmx5LgoJCQkkc2hlZXQxID0gJHRoaXMtPl9nZXRTaGVldEluZGV4KCRleHRfcmVmKTsKCQkJaWYgKCRzaGVldDEgPT0gLTEpIHsKCQkJCXRocm93IG5ldyBFeGNlcHRpb24oIlVua25vd24gc2hlZXQgbmFtZSAkZXh0X3JlZiBpbiBmb3JtdWxhIik7CgkJCX0KCQkJJHNoZWV0MiA9ICRzaGVldDE7CgkJfQoKCQkvLyBSZWZlcmVuY2VzIGFyZSBzdG9yZWQgcmVsYXRpdmUgdG8gMHhGRkZGLgoJCSRvZmZzZXQgPSAtMSAtICRzaGVldDE7CgoJCXJldHVybiBwYWNrKCd2ZHZ2JywgJG9mZnNldCwgMHgwMCwgJHNoZWV0MSwgJHNoZWV0Mik7Cgl9CgoJLyoqCgkgKiBMb29rIHVwIHRoZSBSRUYgaW5kZXggdGhhdCBjb3JyZXNwb25kcyB0byBhbiBleHRlcm5hbCBzaGVldCBuYW1lCgkgKiAob3IgcmFuZ2UpLiBJZiBpdCBkb2Vzbid0IGV4aXN0IHlldCBhZGQgaXQgdG8gdGhlIHdvcmtib29rJ3MgcmVmZXJlbmNlcwoJICogYXJyYXkuIEl0IGFzc3VtZXMgYWxsIHNoZWV0IG5hbWVzIGdpdmVuIG11c3QgZXhpc3QuCgkgKgoJICogQGFjY2VzcyBwcml2YXRlCgkgKiBAcGFyYW0gc3RyaW5nICRleHRfcmVmIFRoZSBuYW1lIG9mIHRoZSBleHRlcm5hbCByZWZlcmVuY2UKCSAqIEByZXR1cm4gbWl4ZWQgVGhlIHJlZmVyZW5jZSBpbmRleCBpbiBwYWNrZWQoKSBmb3JtYXQgb24gc3VjY2VzcwoJICovCglmdW5jdGlvbiBfZ2V0UmVmSW5kZXgoJGV4dF9yZWYpCgl7CgkJJGV4dF9yZWYgPSBwcmVnX3JlcGxhY2UoIi9eJy8iLCAnJywgJGV4dF9yZWYpOyAvLyBSZW1vdmUgbGVhZGluZyAgJyBpZiBhbnkuCgkJJGV4dF9yZWYgPSBwcmVnX3JlcGxhY2UoIi8nJC8iLCAnJywgJGV4dF9yZWYpOyAvLyBSZW1vdmUgdHJhaWxpbmcgJyBpZiBhbnkuCgkJJGV4dF9yZWYgPSBzdHJfcmVwbGFjZSgnXCdcJycsICdcJycsICRleHRfcmVmKTsgLy8gUmVwbGFjZSBlc2NhcGVkICcnIHdpdGggJwoKCQkvLyBDaGVjayBpZiB0aGVyZSBpcyBhIHNoZWV0IHJhbmdlIGVnLiwgU2hlZXQxOlNoZWV0Mi4KCQlpZiAocHJlZ19tYXRjaCgiLzovIiwgJGV4dF9yZWYpKSB7CgkJCWxpc3QoJHNoZWV0X25hbWUxLCAkc2hlZXRfbmFtZTIpID0gZXhwbG9kZSgnOicsICRleHRfcmVmKTsKCgkJCSRzaGVldDEgPSAkdGhpcy0+X2dldFNoZWV0SW5kZXgoJHNoZWV0X25hbWUxKTsKCQkJaWYgKCRzaGVldDEgPT0gLTEpIHsKCQkJCXRocm93IG5ldyBFeGNlcHRpb24oIlVua25vd24gc2hlZXQgbmFtZSAkc2hlZXRfbmFtZTEgaW4gZm9ybXVsYSIpOwoJCQl9CgkJCSRzaGVldDIgPSAkdGhpcy0+X2dldFNoZWV0SW5kZXgoJHNoZWV0X25hbWUyKTsKCQkJaWYgKCRzaGVldDIgPT0gLTEpIHsKCQkJCXRocm93IG5ldyBFeGNlcHRpb24oIlVua25vd24gc2hlZXQgbmFtZSAkc2hlZXRfbmFtZTIgaW4gZm9ybXVsYSIpOwoJCQl9CgoJCQkvLyBSZXZlcnNlIG1heCBhbmQgbWluIHNoZWV0IG51bWJlcnMgaWYgbmVjZXNzYXJ5CgkJCWlmICgkc2hlZXQxID4gJHNoZWV0MikgewoJCQkJbGlzdCgkc2hlZXQxLCAkc2hlZXQyKSA9IGFycmF5KCRzaGVldDIsICRzaGVldDEpOwoJCQl9CgkJfSBlbHNlIHsgLy8gU2luZ2xlIHNoZWV0IG5hbWUgb25seS4KCQkJJHNoZWV0MSA9ICR0aGlzLT5fZ2V0U2hlZXRJbmRleCgkZXh0X3JlZik7CgkJCWlmICgkc2hlZXQxID09IC0xKSB7CgkJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCJVbmtub3duIHNoZWV0IG5hbWUgJGV4dF9yZWYgaW4gZm9ybXVsYSIpOwoJCQl9CgkJCSRzaGVldDIgPSAkc2hlZXQxOwoJCX0KCgkJLy8gYXNzdW1lIGFsbCByZWZlcmVuY2VzIGJlbG9uZyB0byB0aGlzIGRvY3VtZW50CgkJJHN1cGJvb2tfaW5kZXggPSAweDAwOwoJCSRyZWYgPSBwYWNrKCd2dnYnLCAkc3VwYm9va19pbmRleCwgJHNoZWV0MSwgJHNoZWV0Mik7CgkJJHRvdGFsX3JlZmVyZW5jZXMgPSBjb3VudCgkdGhpcy0+X3JlZmVyZW5jZXMpOwoJCSRpbmRleCA9IC0xOwoJCWZvciAoJGkgPSAwOyAkaSA8ICR0b3RhbF9yZWZlcmVuY2VzOyArKyRpKSB7CgkJCWlmICgkcmVmID09ICR0aGlzLT5fcmVmZXJlbmNlc1skaV0pIHsKCQkJCSRpbmRleCA9ICRpOwoJCQkJYnJlYWs7CgkJCX0KCQl9CgkJLy8gaWYgUkVGIHdhcyBub3QgZm91bmQgYWRkIGl0IHRvIHJlZmVyZW5jZXMgYXJyYXkKCQlpZiAoJGluZGV4ID09IC0xKSB7CgkJCSR0aGlzLT5fcmVmZXJlbmNlc1skdG90YWxfcmVmZXJlbmNlc10gPSAkcmVmOwoJCQkkaW5kZXggPSAkdG90YWxfcmVmZXJlbmNlczsKCQl9CgoJCXJldHVybiBwYWNrKCd2JywgJGluZGV4KTsKCX0KCgkvKioKCSAqIExvb2sgdXAgdGhlIGluZGV4IHRoYXQgY29ycmVzcG9uZHMgdG8gYW4gZXh0ZXJuYWwgc2hlZXQgbmFtZS4gVGhlIGhhc2ggb2YKCSAqIHNoZWV0IG5hbWVzIGlzIHVwZGF0ZWQgYnkgdGhlIGFkZHdvcmtzaGVldCgpIG1ldGhvZCBvZiB0aGUKCSAqIFBIUEV4Y2VsX1dyaXRlcl9FeGNlbDVfV29ya2Jvb2sgY2xhc3MuCgkgKgoJICogQGFjY2Vzcwlwcml2YXRlCgkgKiBAcGFyYW0Jc3RyaW5nCSRzaGVldF9uYW1lCQlTaGVldCBuYW1lCgkgKiBAcmV0dXJuCWludGVnZXIJCQkJCVRoZSBzaGVldCBpbmRleCwgLTEgaWYgdGhlIHNoZWV0IHdhcyBub3QgZm91bmQKCSAqLwoJZnVuY3Rpb24gX2dldFNoZWV0SW5kZXgoJHNoZWV0X25hbWUpCgl7CgkJaWYgKCFpc3NldCgkdGhpcy0+X2V4dF9zaGVldHNbJHNoZWV0X25hbWVdKSkgewoJCQlyZXR1cm4gLTE7CgkJfSBlbHNlIHsKCQkJcmV0dXJuICR0aGlzLT5fZXh0X3NoZWV0c1skc2hlZXRfbmFtZV07CgkJfQoJfQoKCS8qKgoJICogVGhpcyBtZXRob2QgaXMgdXNlZCB0byB1cGRhdGUgdGhlIGFycmF5IG9mIHNoZWV0IG5hbWVzLiBJdCBpcwoJICogY2FsbGVkIGJ5IHRoZSBhZGRXb3Jrc2hlZXQoKSBtZXRob2Qgb2YgdGhlCgkgKiBQSFBFeGNlbF9Xcml0ZXJfRXhjZWw1X1dvcmtib29rIGNsYXNzLgoJICoKCSAqIEBhY2Nlc3MgcHVibGljCgkgKiBAc2VlIFBIUEV4Y2VsX1dyaXRlcl9FeGNlbDVfV29ya2Jvb2s6OmFkZFdvcmtzaGVldCgpCgkgKiBAcGFyYW0gc3RyaW5nICAkbmFtZSAgVGhlIG5hbWUgb2YgdGhlIHdvcmtzaGVldCBiZWluZyBhZGRlZAoJICogQHBhcmFtIGludGVnZXIgJGluZGV4IFRoZSBpbmRleCBvZiB0aGUgd29ya3NoZWV0IGJlaW5nIGFkZGVkCgkgKi8KCWZ1bmN0aW9uIHNldEV4dFNoZWV0KCRuYW1lLCAkaW5kZXgpCgl7CgkJJHRoaXMtPl9leHRfc2hlZXRzWyRuYW1lXSA9ICRpbmRleDsKCX0KCgkvKioKCSAqIHBhY2soKSByb3cgYW5kIGNvbHVtbiBpbnRvIHRoZSByZXF1aXJlZCAzIG9yIDQgYnl0ZSBmb3JtYXQuCgkgKgoJICogQGFjY2VzcyBwcml2YXRlCgkgKiBAcGFyYW0gc3RyaW5nICRjZWxsIFRoZSBFeGNlbCBjZWxsIHJlZmVyZW5jZSB0byBiZSBwYWNrZWQKCSAqIEByZXR1cm4gYXJyYXkgQXJyYXkgY29udGFpbmluZyB0aGUgcm93IGFuZCBjb2x1bW4gaW4gcGFja2VkKCkgZm9ybWF0CgkgKi8KCWZ1bmN0aW9uIF9jZWxsVG9QYWNrZWRSb3djb2woJGNlbGwpCgl7CgkJJGNlbGwgPSBzdHJ0b3VwcGVyKCRjZWxsKTsKCQlsaXN0KCRyb3csICRjb2wsICRyb3dfcmVsLCAkY29sX3JlbCkgPSAkdGhpcy0+X2NlbGxUb1Jvd2NvbCgkY2VsbCk7CgkJaWYgKCRjb2wgPj0gMjU2KSB7CgkJCXRocm93IG5ldyBFeGNlcHRpb24oIkNvbHVtbiBpbjogJGNlbGwgZ3JlYXRlciB0aGFuIDI1NSIpOwoJCX0KCQkvLyBGSVhNRTogY2hhbmdlIGZvciBCSUZGOAoJCWlmICgkcm93ID49IDE2Mzg0KSB7CgkJCXRocm93IG5ldyBFeGNlcHRpb24oIlJvdyBpbjogJGNlbGwgZ3JlYXRlciB0aGFuIDE2Mzg0ICIpOwoJCX0KCgkJLy8gU2V0IHRoZSBoaWdoIGJpdHMgdG8gaW5kaWNhdGUgaWYgcm93IG9yIGNvbCBhcmUgcmVsYXRpdmUuCgkJJGNvbCB8PSAkY29sX3JlbCA8PCAxNDsKCQkkY29sIHw9ICRyb3dfcmVsIDw8IDE1OwoJCSRjb2wgPSBwYWNrKCd2JywgJGNvbCk7CgoJCSRyb3cgPSBwYWNrKCd2JywgJHJvdyk7CgoJCXJldHVybiBhcnJheSgkcm93LCAkY29sKTsKCX0KCgkvKioKCSAqIHBhY2soKSByb3cgcmFuZ2UgaW50byB0aGUgcmVxdWlyZWQgMyBvciA0IGJ5dGUgZm9ybWF0LgoJICogSnVzdCB1c2luZyBtYXhpbXVtIGNvbC9yb3dzLCB3aGljaCBpcyBwcm9iYWJseSBub3QgdGhlIGNvcnJlY3Qgc29sdXRpb24KCSAqCgkgKiBAYWNjZXNzIHByaXZhdGUKCSAqIEBwYXJhbSBzdHJpbmcgJHJhbmdlIFRoZSBFeGNlbCByYW5nZSB0byBiZSBwYWNrZWQKCSAqIEByZXR1cm4gYXJyYXkgQXJyYXkgY29udGFpbmluZyAocm93MSxjb2wxLHJvdzIsY29sMikgaW4gcGFja2VkKCkgZm9ybWF0CgkgKi8KCWZ1bmN0aW9uIF9yYW5nZVRvUGFja2VkUmFuZ2UoJHJhbmdlKQoJewoJCXByZWdfbWF0Y2goJy8oXCQpPyhcZCspXDooXCQpPyhcZCspLycsICRyYW5nZSwgJG1hdGNoKTsKCQkvLyByZXR1cm4gYWJzb2x1dGUgcm93cyBpZiB0aGVyZSBpcyBhICQgaW4gdGhlIHJlZgoJCSRyb3cxX3JlbCA9IGVtcHR5KCRtYXRjaFsxXSkgPyAxIDogMDsKCQkkcm93MSAgICAgPSAkbWF0Y2hbMl07CgkJJHJvdzJfcmVsID0gZW1wdHkoJG1hdGNoWzNdKSA/IDEgOiAwOwoJCSRyb3cyICAgICA9ICRtYXRjaFs0XTsKCQkvLyBDb252ZXJ0IDEtaW5kZXggdG8gemVyby1pbmRleAoJCS0tJHJvdzE7CgkJLS0kcm93MjsKCQkvLyBUcmljayBwb29yIGlub2NlbnQgRXhjZWwKCQkkY29sMSA9IDA7CgkJJGNvbDIgPSAxNjM4MzsgLy8gRklYTUU6IG1heGltdW0gcG9zc2libGUgdmFsdWUgZm9yIEV4Y2VsIDUgKGNoYW5nZSB0aGlzISEhKQoKCQkvLyBGSVhNRTogdGhpcyBjaGFuZ2VzIGZvciBCSUZGOAoJCWlmICgoJHJvdzEgPj0gMTYzODQpIG9yICgkcm93MiA+PSAxNjM4NCkpIHsKCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbigiUm93IGluOiAkcmFuZ2UgZ3JlYXRlciB0aGFuIDE2Mzg0ICIpOwoJCX0KCgkJLy8gU2V0IHRoZSBoaWdoIGJpdHMgdG8gaW5kaWNhdGUgaWYgcm93cyBhcmUgcmVsYXRpdmUuCgkJJGNvbDEgfD0gJHJvdzFfcmVsIDw8IDE1OwoJCSRjb2wyIHw9ICRyb3cyX3JlbCA8PCAxNTsKCQkkY29sMSA9IHBhY2soJ3YnLCAkY29sMSk7CgkJJGNvbDIgPSBwYWNrKCd2JywgJGNvbDIpOwoKCQkkcm93MSA9IHBhY2soJ3YnLCAkcm93MSk7CgkJJHJvdzIgPSBwYWNrKCd2JywgJHJvdzIpOwoKCQlyZXR1cm4gYXJyYXkoJHJvdzEsICRjb2wxLCAkcm93MiwgJGNvbDIpOwoJfQoKCS8qKgoJICogQ29udmVydCBhbiBFeGNlbCBjZWxsIHJlZmVyZW5jZSBzdWNoIGFzIEExIG9yICRCMiBvciBDJDMgb3IgJEQkNCB0byBhIHplcm8KCSAqIGluZGV4ZWQgcm93IGFuZCBjb2x1bW4gbnVtYmVyLiBBbHNvIHJldHVybnMgdHdvICgwLDEpIHZhbHVlcyB0byBpbmRpY2F0ZQoJICogd2hldGhlciB0aGUgcm93IG9yIGNvbHVtbiBhcmUgcmVsYXRpdmUgcmVmZXJlbmNlcy4KCSAqCgkgKiBAYWNjZXNzIHByaXZhdGUKCSAqIEBwYXJhbSBzdHJpbmcgJGNlbGwgVGhlIEV4Y2VsIGNlbGwgcmVmZXJlbmNlIGluIEExIGZvcm1hdC4KCSAqIEByZXR1cm4gYXJyYXkKCSAqLwoJZnVuY3Rpb24gX2NlbGxUb1Jvd2NvbCgkY2VsbCkKCXsKCQlwcmVnX21hdGNoKCcvKFwkKT8oW0EtSV0/W0EtWl0pKFwkKT8oXGQrKS8nLCRjZWxsLCRtYXRjaCk7CgkJLy8gcmV0dXJuIGFic29sdXRlIGNvbHVtbiBpZiB0aGVyZSBpcyBhICQgaW4gdGhlIHJlZgoJCSRjb2xfcmVsID0gZW1wdHkoJG1hdGNoWzFdKSA/IDEgOiAwOwoJCSRjb2xfcmVmID0gJG1hdGNoWzJdOwoJCSRyb3dfcmVsID0gZW1wdHkoJG1hdGNoWzNdKSA/IDEgOiAwOwoJCSRyb3cgICAgID0gJG1hdGNoWzRdOwoKCQkvLyBDb252ZXJ0IGJhc2UyNiBjb2x1bW4gc3RyaW5nIHRvIGEgbnVtYmVyLgoJCSRleHBuICAgPSBzdHJsZW4oJGNvbF9yZWYpIC0gMTsKCQkkY29sICAgID0gMDsKCQkkY29sX3JlZl9sZW5ndGggPSBzdHJsZW4oJGNvbF9yZWYpOwoJCWZvciAoJGkgPSAwOyAkaSA8ICRjb2xfcmVmX2xlbmd0aDsgKyskaSkgewoJCQkkY29sICs9IChvcmQoJGNvbF9yZWZ7JGl9KSAtIDY0KSAqIHBvdygyNiwgJGV4cG4pOwoJCQktLSRleHBuOwoJCX0KCgkJLy8gQ29udmVydCAxLWluZGV4IHRvIHplcm8taW5kZXgKCQktLSRyb3c7CgkJLS0kY29sOwoKCQlyZXR1cm4gYXJyYXkoJHJvdywgJGNvbCwgJHJvd19yZWwsICRjb2xfcmVsKTsKCX0KCgkvKioKCSAqIEFkdmFuY2UgdG8gdGhlIG5leHQgdmFsaWQgdG9rZW4uCgkgKgoJICogQGFjY2VzcyBwcml2YXRlCgkgKi8KCWZ1bmN0aW9uIF9hZHZhbmNlKCkKCXsKCQkkaSA9ICR0aGlzLT5fY3VycmVudF9jaGFyOwoJCSRmb3JtdWxhX2xlbmd0aCA9IHN0cmxlbigkdGhpcy0+X2Zvcm11bGEpOwoJCS8vIGVhdCB1cCB3aGl0ZSBzcGFjZXMKCQlpZiAoJGkgPCAkZm9ybXVsYV9sZW5ndGgpIHsKCQkJd2hpbGUgKCR0aGlzLT5fZm9ybXVsYXskaX0gPT0gIiAiKSB7CgkJCQkrKyRpOwoJCQl9CgoJCQlpZiAoJGkgPCAoJGZvcm11bGFfbGVuZ3RoIC0gMSkpIHsKCQkJCSR0aGlzLT5fbG9va2FoZWFkID0gJHRoaXMtPl9mb3JtdWxheyRpKzF9OwoJCQl9CgkJCSR0b2tlbiA9ICcnOwoJCX0KCgkJd2hpbGUgKCRpIDwgJGZvcm11bGFfbGVuZ3RoKSB7CgkJCSR0b2tlbiAuPSAkdGhpcy0+X2Zvcm11bGF7JGl9OwoKCQkJaWYgKCRpIDwgKCRmb3JtdWxhX2xlbmd0aCAtIDEpKSB7CgkJCQkkdGhpcy0+X2xvb2thaGVhZCA9ICR0aGlzLT5fZm9ybXVsYXskaSsxfTsKCQkJfSBlbHNlIHsKCQkJCSR0aGlzLT5fbG9va2FoZWFkID0gJyc7CgkJCX0KCgkJCWlmICgkdGhpcy0+X21hdGNoKCR0b2tlbikgIT0gJycpIHsKCQkJCS8vaWYgKCRpIDwgc3RybGVuKCR0aGlzLT5fZm9ybXVsYSkgLSAxKSB7CgkJCQkvLyAgICAkdGhpcy0+X2xvb2thaGVhZCA9ICR0aGlzLT5fZm9ybXVsYXskaSsxfTsKCQkJCS8vfQoJCQkJJHRoaXMtPl9jdXJyZW50X2NoYXIgPSAkaSArIDE7CgkJCQkkdGhpcy0+X2N1cnJlbnRfdG9rZW4gPSAkdG9rZW47CgkJCQlyZXR1cm4gMTsKCQkJfQoKCQkJaWYgKCRpIDwgKCRmb3JtdWxhX2xlbmd0aCAtIDIpKSB7CgkJCQkkdGhpcy0+X2xvb2thaGVhZCA9ICR0aGlzLT5fZm9ybXVsYXskaSsyfTsKCQkJfSBlbHNlIHsgLy8gaWYgd2UgcnVuIG91dCBvZiBjaGFyYWN0ZXJzIF9sb29rYWhlYWQgYmVjb21lcyBlbXB0eQoJCQkJJHRoaXMtPl9sb29rYWhlYWQgPSAnJzsKCQkJfQoJCQkrKyRpOwoJCX0KCQkvL2RpZSgiTGV4aWNhbCBlcnJvciAiLiR0aGlzLT5fY3VycmVudF9jaGFyKTsKCX0KCgkvKioKCSAqIENoZWNrcyBpZiBpdCdzIGEgdmFsaWQgdG9rZW4uCgkgKgoJICogQGFjY2VzcyBwcml2YXRlCgkgKiBAcGFyYW0gbWl4ZWQgJHRva2VuIFRoZSB0b2tlbiB0byBjaGVjay4KCSAqIEByZXR1cm4gbWl4ZWQgICAgICAgVGhlIGNoZWNrZWQgdG9rZW4gb3IgZmFsc2Ugb24gZmFpbHVyZQoJICovCglmdW5jdGlvbiBfbWF0Y2goJHRva2VuKQoJewoJCXN3aXRjaCgkdG9rZW4pIHsKCQkJY2FzZSAiKyI6CgkJCWNhc2UgIi0iOgoJCQljYXNlICIqIjoKCQkJY2FzZSAiLyI6CgkJCWNhc2UgIigiOgoJCQljYXNlICIpIjoKCQkJY2FzZSAiLCI6CgkJCWNhc2UgIjsiOgoJCQljYXNlICI+PSI6CgkJCWNhc2UgIjw9IjoKCQkJY2FzZSAiPSI6CgkJCWNhc2UgIjw+IjoKCQkJY2FzZSAiXiI6CgkJCWNhc2UgIiYiOgoJCQljYXNlICIlIjoKCQkJCXJldHVybiAkdG9rZW47CgkJCQlicmVhazsKCQkJY2FzZSAiPiI6CgkJCQlpZiAoJHRoaXMtPl9sb29rYWhlYWQgPT0gJz0nKSB7IC8vIGl0J3MgYSBHRSB0b2tlbgoJCQkJCWJyZWFrOwoJCQkJfQoJCQkJcmV0dXJuICR0b2tlbjsKCQkJCWJyZWFrOwoJCQljYXNlICI8IjoKCQkJCS8vIGl0J3MgYSBMRSBvciBhIE5FIHRva2VuCgkJCQlpZiAoKCR0aGlzLT5fbG9va2FoZWFkID09ICc9Jykgb3IgKCR0aGlzLT5fbG9va2FoZWFkID09ICc+JykpIHsKCQkJCQlicmVhazsKCQkJCX0KCQkJCXJldHVybiAkdG9rZW47CgkJCQlicmVhazsKCQkJZGVmYXVsdDoKCQkJCS8vIGlmIGl0J3MgYSByZWZlcmVuY2UgQTEgb3IgJEEkMSBvciAkQTEgb3IgQSQxCgkJCQlpZiAocHJlZ19tYXRjaCgnL15cJD9bQS1JYS1pXT9bQS1aYS16XVwkP1swLTldKyQvJywkdG9rZW4pIGFuZAoJCQkJICAgIXByZWdfbWF0Y2goIi9bMC05XS8iLCR0aGlzLT5fbG9va2FoZWFkKSBhbmQKCQkJCSAgICgkdGhpcy0+X2xvb2thaGVhZCAhPSAnOicpIGFuZCAoJHRoaXMtPl9sb29rYWhlYWQgIT0gJy4nKSBhbmQKCQkJCSAgICgkdGhpcy0+X2xvb2thaGVhZCAhPSAnIScpKQoJCQkJewoJCQkJCXJldHVybiAkdG9rZW47CgkJCQl9CgkJCQkvLyBJZiBpdCdzIGFuIGV4dGVybmFsIHJlZmVyZW5jZSAoU2hlZXQxIUExIG9yIFNoZWV0MTpTaGVldDIhQTEgb3IgU2hlZXQxISRBJDEgb3IgU2hlZXQxOlNoZWV0MiEkQSQxKQoJCQkJZWxzZWlmIChwcmVnX21hdGNoKCIvXiIgLiBzZWxmOjpSRUdFWF9TSEVFVF9USVRMRV9VTlFVT1RFRCAuICIoXDoiIC4gc2VsZjo6UkVHRVhfU0hFRVRfVElUTEVfVU5RVU9URUQgLiAiKT9cIVxcJD9bQS1JYS1pXT9bQS1aYS16XVxcJD9bMC05XSskL3UiLCR0b2tlbikgYW5kCgkJCQkJICAgIXByZWdfbWF0Y2goIi9bMC05XS8iLCR0aGlzLT5fbG9va2FoZWFkKSBhbmQKCQkJCQkgICAoJHRoaXMtPl9sb29rYWhlYWQgIT0gJzonKSBhbmQgKCR0aGlzLT5fbG9va2FoZWFkICE9ICcuJykpCgkJCQl7CgkJCQkJcmV0dXJuICR0b2tlbjsKCQkJCX0KCQkJCS8vIElmIGl0J3MgYW4gZXh0ZXJuYWwgcmVmZXJlbmNlICgnU2hlZXQxJyFBMSBvciAnU2hlZXQxOlNoZWV0MichQTEgb3IgJ1NoZWV0MSchJEEkMSBvciAnU2hlZXQxOlNoZWV0MichJEEkMSkKCQkJCWVsc2VpZiAocHJlZ19tYXRjaCgiL14nIiAuIHNlbGY6OlJFR0VYX1NIRUVUX1RJVExFX1FVT1RFRCAuICIoXDoiIC4gc2VsZjo6UkVHRVhfU0hFRVRfVElUTEVfUVVPVEVEIC4gIik/J1whXFwkP1tBLUlhLWldP1tBLVphLXpdXFwkP1swLTldKyQvdSIsJHRva2VuKSBhbmQKCQkJCQkgICAhcHJlZ19tYXRjaCgiL1swLTldLyIsJHRoaXMtPl9sb29rYWhlYWQpIGFuZAoJCQkJCSAgICgkdGhpcy0+X2xvb2thaGVhZCAhPSAnOicpIGFuZCAoJHRoaXMtPl9sb29rYWhlYWQgIT0gJy4nKSkKCQkJCXsKCQkJCQlyZXR1cm4gJHRva2VuOwoJCQkJfQoJCQkJLy8gaWYgaXQncyBhIHJhbmdlIEExOkEyIG9yICRBJDE6JEEkMgoJCQkJZWxzZWlmIChwcmVnX21hdGNoKCcvXihcJCk/W0EtSWEtaV0/W0EtWmEtel0oXCQpP1swLTldKzooXCQpP1tBLUlhLWldP1tBLVphLXpdKFwkKT9bMC05XSskLycsICR0b2tlbikgYW5kCgkJCQkJICAgIXByZWdfbWF0Y2goIi9bMC05XS8iLCR0aGlzLT5fbG9va2FoZWFkKSkKCQkJCXsKCQkJCQlyZXR1cm4gJHRva2VuOwoJCQkJfQoJCQkJLy8gSWYgaXQncyBhbiBleHRlcm5hbCByYW5nZSBsaWtlIFNoZWV0MSFBMTpCMiBvciBTaGVldDE6U2hlZXQyIUExOkIyIG9yIFNoZWV0MSEkQSQxOiRCJDIgb3IgU2hlZXQxOlNoZWV0MiEkQSQxOiRCJDIKCQkJCWVsc2VpZiAocHJlZ19tYXRjaCgiL14iIC4gc2VsZjo6UkVHRVhfU0hFRVRfVElUTEVfVU5RVU9URUQgLiAiKFw6IiAuIHNlbGY6OlJFR0VYX1NIRUVUX1RJVExFX1VOUVVPVEVEIC4gIik/XCFcXCQ/KFtBLUlhLWldP1tBLVphLXpdKT9cXCQ/WzAtOV0rOlxcJD8oW0EtSWEtaV0/W0EtWmEtel0pP1xcJD9bMC05XSskL3UiLCR0b2tlbikgYW5kCgkJCQkJICAgIXByZWdfbWF0Y2goIi9bMC05XS8iLCR0aGlzLT5fbG9va2FoZWFkKSkKCQkJCXsKCQkJCQlyZXR1cm4gJHRva2VuOwoJCQkJfQoJCQkJLy8gSWYgaXQncyBhbiBleHRlcm5hbCByYW5nZSBsaWtlICdTaGVldDEnIUExOkIyIG9yICdTaGVldDE6U2hlZXQyJyFBMTpCMiBvciAnU2hlZXQxJyEkQSQxOiRCJDIgb3IgJ1NoZWV0MTpTaGVldDInISRBJDE6JEIkMgoJCQkJZWxzZWlmIChwcmVnX21hdGNoKCIvXiciIC4gc2VsZjo6UkVHRVhfU0hFRVRfVElUTEVfUVVPVEVEIC4gIihcOiIgLiBzZWxmOjpSRUdFWF9TSEVFVF9USVRMRV9RVU9URUQgLiAiKT8nXCFcXCQ/KFtBLUlhLWldP1tBLVphLXpdKT9cXCQ/WzAtOV0rOlxcJD8oW0EtSWEtaV0/W0EtWmEtel0pP1xcJD9bMC05XSskL3UiLCR0b2tlbikgYW5kCgkJCQkJICAgIXByZWdfbWF0Y2goIi9bMC05XS8iLCR0aGlzLT5fbG9va2FoZWFkKSkKCQkJCXsKCQkJCQlyZXR1cm4gJHRva2VuOwoJCQkJfQoJCQkJLy8gSWYgaXQncyBhIG51bWJlciAoY2hlY2sgdGhhdCBpdCdzIG5vdCBhIHNoZWV0IG5hbWUgb3IgcmFuZ2UpCgkJCQllbHNlaWYgKGlzX251bWVyaWMoJHRva2VuKSBhbmQKCQkJCQkJKCFpc19udW1lcmljKCR0b2tlbi4kdGhpcy0+X2xvb2thaGVhZCkgb3IgKCR0aGlzLT5fbG9va2FoZWFkID09ICcnKSkgYW5kCgkJCQkJCSgkdGhpcy0+X2xvb2thaGVhZCAhPSAnIScpIGFuZCAoJHRoaXMtPl9sb29rYWhlYWQgIT0gJzonKSkKCQkJCXsKCQkJCQlyZXR1cm4gJHRva2VuOwoJCQkJfQoJCQkJLy8gSWYgaXQncyBhIHN0cmluZyAob2YgbWF4aW11bSAyNTUgY2hhcmFjdGVycykKCQkJCWVsc2VpZiAocHJlZ19tYXRjaCgiL1wiKFteXCJdfFwiXCIpezAsMjU1fVwiLyIsJHRva2VuKSBhbmQgJHRoaXMtPl9sb29rYWhlYWQgIT0gJyInIGFuZCAoc3Vic3RyX2NvdW50KCR0b2tlbiwgJyInKSUyID09IDApKQoJCQkJewoJCQkJCXJldHVybiAkdG9rZW47CgkJCQl9CgkJCSAgICAvLyBJZiBpdCdzIGFuIGVycm9yIGNvZGUKCQkJICAgIGVsc2VpZiAocHJlZ19tYXRjaCgiL14jW0EtWjBcL117Myw1fVshP117MX0kLyIsICR0b2tlbikgb3IgJHRva2VuID09ICcjTi9BJykKCQkJICAgIHsKCQkJICAgICAgICByZXR1cm4gJHRva2VuOwoJCQkgICAgfQoJCQkJLy8gaWYgaXQncyBhIGZ1bmN0aW9uIGNhbGwKCQkJCWVsc2VpZiAocHJlZ19tYXRjaCgiL15bQS1aMC05XHhjMC1ceGRjXC5dKyQvaSIsJHRva2VuKSBhbmQgKCR0aGlzLT5fbG9va2FoZWFkID09ICIoIikpCgkJCQl7CgkJCQkJcmV0dXJuICR0b2tlbjsKCQkJCX0KCQkJCS8vCUl0J3MgYW4gYXJndW1lbnQgb2Ygc29tZSBkZXNjcmlwdGlvbiAoZS5nLiBhIG5hbWVkIHJhbmdlKSwKCQkJCS8vCQlwcmVjaXNlIG5hdHVyZSB5ZXQgdG8gYmUgZGV0ZXJtaW5lZAoJCQkJZWxzZWlmKHN1YnN0cigkdG9rZW4sLTEpID09ICcpJykgewoJCQkJCXJldHVybiAkdG9rZW47CgkJCQl9CgkJCQlyZXR1cm4gJyc7CgkJfQoJfQoKCS8qKgoJICogVGhlIHBhcnNpbmcgbWV0aG9kLiBJdCBwYXJzZXMgYSBmb3JtdWxhLgoJICoKCSAqIEBhY2Nlc3MgcHVibGljCgkgKiBAcGFyYW0gc3RyaW5nICRmb3JtdWxhIFRoZSBmb3JtdWxhIHRvIHBhcnNlLCB3aXRob3V0IHRoZSBpbml0aWFsIGVxdWFsCgkgKiAgICAgICAgICAgICAgICAgICAgICAgIHNpZ24gKD0pLgoJICogQHJldHVybiBtaXhlZCB0cnVlIG9uIHN1Y2Nlc3MKCSAqLwoJZnVuY3Rpb24gcGFyc2UoJGZvcm11bGEpCgl7CgkJJHRoaXMtPl9jdXJyZW50X2NoYXIgPSAwOwoJCSR0aGlzLT5fZm9ybXVsYSAgICAgID0gJGZvcm11bGE7CgkJJHRoaXMtPl9sb29rYWhlYWQgICAgPSBpc3NldCgkZm9ybXVsYXsxfSkgPyAkZm9ybXVsYXsxfSA6ICcnOwoJCSR0aGlzLT5fYWR2YW5jZSgpOwoJCSR0aGlzLT5fcGFyc2VfdHJlZSAgID0gJHRoaXMtPl9jb25kaXRpb24oKTsKCQlyZXR1cm4gdHJ1ZTsKCX0KCgkvKioKCSAqIEl0IHBhcnNlcyBhIGNvbmRpdGlvbi4gSXQgYXNzdW1lcyB0aGUgZm9sbG93aW5nIHJ1bGU6CgkgKiBDb25kIC0+IEV4cHIgWygiPiIgfCAiPCIpIEV4cHJdCgkgKgoJICogQGFjY2VzcyBwcml2YXRlCgkgKiBAcmV0dXJuIG1peGVkIFRoZSBwYXJzZWQgcHRnJ2QgdHJlZSBvbiBzdWNjZXNzCgkgKi8KCWZ1bmN0aW9uIF9jb25kaXRpb24oKQoJewoJCSRyZXN1bHQgPSAkdGhpcy0+X2V4cHJlc3Npb24oKTsKCQlpZiAoJHRoaXMtPl9jdXJyZW50X3Rva2VuID09ICI8IikgewoJCQkkdGhpcy0+X2FkdmFuY2UoKTsKCQkJJHJlc3VsdDIgPSAkdGhpcy0+X2V4cHJlc3Npb24oKTsKCQkJJHJlc3VsdCA9ICR0aGlzLT5fY3JlYXRlVHJlZSgncHRnTFQnLCAkcmVzdWx0LCAkcmVzdWx0Mik7CgkJfSBlbHNlaWYgKCR0aGlzLT5fY3VycmVudF90b2tlbiA9PSAiPiIpIHsKCQkJJHRoaXMtPl9hZHZhbmNlKCk7CgkJCSRyZXN1bHQyID0gJHRoaXMtPl9leHByZXNzaW9uKCk7CgkJCSRyZXN1bHQgPSAkdGhpcy0+X2NyZWF0ZVRyZWUoJ3B0Z0dUJywgJHJlc3VsdCwgJHJlc3VsdDIpOwoJCX0gZWxzZWlmICgkdGhpcy0+X2N1cnJlbnRfdG9rZW4gPT0gIjw9IikgewoJCQkkdGhpcy0+X2FkdmFuY2UoKTsKCQkJJHJlc3VsdDIgPSAkdGhpcy0+X2V4cHJlc3Npb24oKTsKCQkJJHJlc3VsdCA9ICR0aGlzLT5fY3JlYXRlVHJlZSgncHRnTEUnLCAkcmVzdWx0LCAkcmVzdWx0Mik7CgkJfSBlbHNlaWYgKCR0aGlzLT5fY3VycmVudF90b2tlbiA9PSAiPj0iKSB7CgkJCSR0aGlzLT5fYWR2YW5jZSgpOwoJCQkkcmVzdWx0MiA9ICR0aGlzLT5fZXhwcmVzc2lvbigpOwoJCQkkcmVzdWx0ID0gJHRoaXMtPl9jcmVhdGVUcmVlKCdwdGdHRScsICRyZXN1bHQsICRyZXN1bHQyKTsKCQl9IGVsc2VpZiAoJHRoaXMtPl9jdXJyZW50X3Rva2VuID09ICI9IikgewoJCQkkdGhpcy0+X2FkdmFuY2UoKTsKCQkJJHJlc3VsdDIgPSAkdGhpcy0+X2V4cHJlc3Npb24oKTsKCQkJJHJlc3VsdCA9ICR0aGlzLT5fY3JlYXRlVHJlZSgncHRnRVEnLCAkcmVzdWx0LCAkcmVzdWx0Mik7CgkJfSBlbHNlaWYgKCR0aGlzLT5fY3VycmVudF90b2tlbiA9PSAiPD4iKSB7CgkJCSR0aGlzLT5fYWR2YW5jZSgpOwoJCQkkcmVzdWx0MiA9ICR0aGlzLT5fZXhwcmVzc2lvbigpOwoJCQkkcmVzdWx0ID0gJHRoaXMtPl9jcmVhdGVUcmVlKCdwdGdORScsICRyZXN1bHQsICRyZXN1bHQyKTsKCQl9IGVsc2VpZiAoJHRoaXMtPl9jdXJyZW50X3Rva2VuID09ICImIikgewoJCSAgICAkdGhpcy0+X2FkdmFuY2UoKTsKCQkgICAgJHJlc3VsdDIgPSAkdGhpcy0+X2V4cHJlc3Npb24oKTsKCQkgICAgJHJlc3VsdCA9ICR0aGlzLT5fY3JlYXRlVHJlZSgncHRnQ29uY2F0JywgJHJlc3VsdCwgJHJlc3VsdDIpOwoJCX0KCQlyZXR1cm4gJHJlc3VsdDsKCX0KCgkvKioKCSAqIEl0IHBhcnNlcyBhIGV4cHJlc3Npb24uIEl0IGFzc3VtZXMgdGhlIGZvbGxvd2luZyBydWxlOgoJICogRXhwciAtPiBUZXJtIFsoIisiIHwgIi0iKSBUZXJtXQoJICogICAgICAtPiAic3RyaW5nIgoJICogICAgICAtPiAiLSIgVGVybSA6IE5lZ2F0aXZlIHZhbHVlCgkgKiAgICAgIC0+ICIrIiBUZXJtIDogUG9zaXRpdmUgdmFsdWUKCSAqICAgICAgLT4gRXJyb3IgY29kZQoJICoKCSAqIEBhY2Nlc3MgcHJpdmF0ZQoJICogQHJldHVybiBtaXhlZCBUaGUgcGFyc2VkIHB0ZydkIHRyZWUgb24gc3VjY2VzcwoJICovCglmdW5jdGlvbiBfZXhwcmVzc2lvbigpCgl7CgkJLy8gSWYgaXQncyBhIHN0cmluZyByZXR1cm4gYSBzdHJpbmcgbm9kZQoJCWlmIChwcmVnX21hdGNoKCIvXCIoW15cIl18XCJcIil7MCwyNTV9XCIvIiwgJHRoaXMtPl9jdXJyZW50X3Rva2VuKSkgewoJCQkkdG1wID0gc3RyX3JlcGxhY2UoJyIiJywgJyInLCAkdGhpcy0+X2N1cnJlbnRfdG9rZW4pOwoJCQlpZiAoKCR0bXAgPT0gJyInKSB8fCAoJHRtcCA9PSAnJykpICR0bXAgPSAnIiInOwkvLwlUcmFwIGZvciAiIiB0aGF0IGhhcyBiZWVuIHVzZWQgZm9yIGFuIGVtcHR5IHN0cmluZwoJCQkkcmVzdWx0ID0gJHRoaXMtPl9jcmVhdGVUcmVlKCR0bXAsICcnLCAnJyk7CgkJCSR0aGlzLT5fYWR2YW5jZSgpOwoJCQlyZXR1cm4gJHJlc3VsdDsKICAgICAgICAvLyBJZiBpdCdzIGFuIGVycm9yIGNvZGUKICAgICAgICB9IGVsc2VpZiAocHJlZ19tYXRjaCgiL14jW0EtWjBcL117Myw1fVshP117MX0kLyIsICR0aGlzLT5fY3VycmVudF90b2tlbikgb3IgJHRoaXMtPl9jdXJyZW50X3Rva2VuID09ICcjTi9BJyl7CgkJICAgICRyZXN1bHQgPSAkdGhpcy0+X2NyZWF0ZVRyZWUoJHRoaXMtPl9jdXJyZW50X3Rva2VuLCAncHRnRXJyJywgJycpOwoJCSAgICAkdGhpcy0+X2FkdmFuY2UoKTsKCQkgICAgcmV0dXJuICRyZXN1bHQ7CgkJLy8gSWYgaXQncyBhIG5lZ2F0aXZlIHZhbHVlCiAgICAgICAgfSBlbHNlaWYgKCR0aGlzLT5fY3VycmVudF90b2tlbiA9PSAiLSIpIHsKCQkJLy8gY2F0Y2ggIi0iIFRlcm0KCQkJJHRoaXMtPl9hZHZhbmNlKCk7CgkJCSRyZXN1bHQyID0gJHRoaXMtPl9leHByZXNzaW9uKCk7CgkJCSRyZXN1bHQgPSAkdGhpcy0+X2NyZWF0ZVRyZWUoJ3B0Z1VtaW51cycsICRyZXN1bHQyLCAnJyk7CgkJCXJldHVybiAkcmVzdWx0OwogICAgICAgIC8vIElmIGl0J3MgYSBwb3NpdGl2ZSB2YWx1ZQoJCX0gZWxzZWlmICgkdGhpcy0+X2N1cnJlbnRfdG9rZW4gPT0gIisiKSB7CgkJCS8vIGNhdGNoICIrIiBUZXJtCgkJCSR0aGlzLT5fYWR2YW5jZSgpOwoJCQkkcmVzdWx0MiA9ICR0aGlzLT5fZXhwcmVzc2lvbigpOwoJCQkkcmVzdWx0ID0gJHRoaXMtPl9jcmVhdGVUcmVlKCdwdGdVcGx1cycsICRyZXN1bHQyLCAnJyk7CgkJCXJldHVybiAkcmVzdWx0OwoJCX0KCQkkcmVzdWx0ID0gJHRoaXMtPl90ZXJtKCk7CgkJd2hpbGUgKCgkdGhpcy0+X2N1cnJlbnRfdG9rZW4gPT0gIisiKSBvcgoJCQkgICAoJHRoaXMtPl9jdXJyZW50X3Rva2VuID09ICItIikgb3IKCQkJICAgKCR0aGlzLT5fY3VycmVudF90b2tlbiA9PSAiXiIpKSB7CgkJLyoqLwoJCQlpZiAoJHRoaXMtPl9jdXJyZW50X3Rva2VuID09ICIrIikgewoJCQkJJHRoaXMtPl9hZHZhbmNlKCk7CgkJCQkkcmVzdWx0MiA9ICR0aGlzLT5fdGVybSgpOwoJCQkJJHJlc3VsdCA9ICR0aGlzLT5fY3JlYXRlVHJlZSgncHRnQWRkJywgJHJlc3VsdCwgJHJlc3VsdDIpOwoJCQl9IGVsc2VpZiAoJHRoaXMtPl9jdXJyZW50X3Rva2VuID09ICItIikgewoJCQkJJHRoaXMtPl9hZHZhbmNlKCk7CgkJCQkkcmVzdWx0MiA9ICR0aGlzLT5fdGVybSgpOwoJCQkJJHJlc3VsdCA9ICR0aGlzLT5fY3JlYXRlVHJlZSgncHRnU3ViJywgJHJlc3VsdCwgJHJlc3VsdDIpOwoJCQl9IGVsc2UgewoJCQkJJHRoaXMtPl9hZHZhbmNlKCk7CgkJCQkkcmVzdWx0MiA9ICR0aGlzLT5fdGVybSgpOwoJCQkJJHJlc3VsdCA9ICR0aGlzLT5fY3JlYXRlVHJlZSgncHRnUG93ZXInLCAkcmVzdWx0LCAkcmVzdWx0Mik7CgkJCX0KCQl9CgkJcmV0dXJuICRyZXN1bHQ7Cgl9CgoJLyoqCgkgKiBUaGlzIGZ1bmN0aW9uIGp1c3QgaW50cm9kdWNlcyBhIHB0Z1BhcmVuIGVsZW1lbnQgaW4gdGhlIHRyZWUsIHNvIHRoYXQgRXhjZWwKCSAqIGRvZXNuJ3QgZ2V0IGNvbmZ1c2VkIHdoZW4gd29ya2luZyB3aXRoIGEgcGFyZW50aGVzaXplZCBmb3JtdWxhIGFmdGVyd2FyZHMuCgkgKgoJICogQGFjY2VzcyBwcml2YXRlCgkgKiBAc2VlIF9mYWN0KCkKCSAqIEByZXR1cm4gYXJyYXkgVGhlIHBhcnNlZCBwdGcnZCB0cmVlCgkgKi8KCWZ1bmN0aW9uIF9wYXJlbnRoZXNpemVkRXhwcmVzc2lvbigpCgl7CgkJJHJlc3VsdCA9ICR0aGlzLT5fY3JlYXRlVHJlZSgncHRnUGFyZW4nLCAkdGhpcy0+X2V4cHJlc3Npb24oKSwgJycpOwoJCXJldHVybiAkcmVzdWx0OwoJfQoKCS8qKgoJICogSXQgcGFyc2VzIGEgdGVybS4gSXQgYXNzdW1lcyB0aGUgZm9sbG93aW5nIHJ1bGU6CgkgKiBUZXJtIC0+IEZhY3QgWygiKiIgfCAiLyIpIEZhY3RdCgkgKgoJICogQGFjY2VzcyBwcml2YXRlCgkgKiBAcmV0dXJuIG1peGVkIFRoZSBwYXJzZWQgcHRnJ2QgdHJlZSBvbiBzdWNjZXNzCgkgKi8KCWZ1bmN0aW9uIF90ZXJtKCkKCXsKCQkkcmVzdWx0ID0gJHRoaXMtPl9mYWN0KCk7CgkJd2hpbGUgKCgkdGhpcy0+X2N1cnJlbnRfdG9rZW4gPT0gIioiKSBvcgoJCQkgICAoJHRoaXMtPl9jdXJyZW50X3Rva2VuID09ICIvIikpIHsKCQkvKiovCgkJCWlmICgkdGhpcy0+X2N1cnJlbnRfdG9rZW4gPT0gIioiKSB7CgkJCQkkdGhpcy0+X2FkdmFuY2UoKTsKCQkJCSRyZXN1bHQyID0gJHRoaXMtPl9mYWN0KCk7CgkJCQkkcmVzdWx0ID0gJHRoaXMtPl9jcmVhdGVUcmVlKCdwdGdNdWwnLCAkcmVzdWx0LCAkcmVzdWx0Mik7CgkJCX0gZWxzZSB7CgkJCQkkdGhpcy0+X2FkdmFuY2UoKTsKCQkJCSRyZXN1bHQyID0gJHRoaXMtPl9mYWN0KCk7CgkJCQkkcmVzdWx0ID0gJHRoaXMtPl9jcmVhdGVUcmVlKCdwdGdEaXYnLCAkcmVzdWx0LCAkcmVzdWx0Mik7CgkJCX0KCQl9CgkJcmV0dXJuICRyZXN1bHQ7Cgl9CgoJLyoqCgkgKiBJdCBwYXJzZXMgYSBmYWN0b3IuIEl0IGFzc3VtZXMgdGhlIGZvbGxvd2luZyBydWxlOgoJICogRmFjdCAtPiAoIEV4cHIgKQoJICogICAgICAgfCBDZWxsUmVmCgkgKiAgICAgICB8IENlbGxSYW5nZQoJICogICAgICAgfCBOdW1iZXIKCSAqICAgICAgIHwgRnVuY3Rpb24KCSAqCgkgKiBAYWNjZXNzIHByaXZhdGUKCSAqIEByZXR1cm4gbWl4ZWQgVGhlIHBhcnNlZCBwdGcnZCB0cmVlIG9uIHN1Y2Nlc3MKCSAqLwoJZnVuY3Rpb24gX2ZhY3QoKQoJewoJCWlmICgkdGhpcy0+X2N1cnJlbnRfdG9rZW4gPT0gIigiKSB7CgkJCSR0aGlzLT5fYWR2YW5jZSgpOyAgICAgICAgIC8vIGVhdCB0aGUgIigiCgkJCSRyZXN1bHQgPSAkdGhpcy0+X3BhcmVudGhlc2l6ZWRFeHByZXNzaW9uKCk7CgkJCWlmICgkdGhpcy0+X2N1cnJlbnRfdG9rZW4gIT0gIikiKSB7CgkJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCInKScgdG9rZW4gZXhwZWN0ZWQuIik7CgkJCX0KCQkJJHRoaXMtPl9hZHZhbmNlKCk7ICAgICAgICAgLy8gZWF0IHRoZSAiKSIKCQkJcmV0dXJuICRyZXN1bHQ7CgkJfQoJCS8vIGlmIGl0J3MgYSByZWZlcmVuY2UKCQlpZiAocHJlZ19tYXRjaCgnL15cJD9bQS1JYS1pXT9bQS1aYS16XVwkP1swLTldKyQvJywkdGhpcy0+X2N1cnJlbnRfdG9rZW4pKQoJCXsKCQkJJHJlc3VsdCA9ICR0aGlzLT5fY3JlYXRlVHJlZSgkdGhpcy0+X2N1cnJlbnRfdG9rZW4sICcnLCAnJyk7CgkJCSR0aGlzLT5fYWR2YW5jZSgpOwoJCQlyZXR1cm4gJHJlc3VsdDsKCQl9CgkJLy8gSWYgaXQncyBhbiBleHRlcm5hbCByZWZlcmVuY2UgKFNoZWV0MSFBMSBvciBTaGVldDE6U2hlZXQyIUExIG9yIFNoZWV0MSEkQSQxIG9yIFNoZWV0MTpTaGVldDIhJEEkMSkKCQllbHNlaWYgKHByZWdfbWF0Y2goIi9eIiAuIHNlbGY6OlJFR0VYX1NIRUVUX1RJVExFX1VOUVVPVEVEIC4gIihcOiIgLiBzZWxmOjpSRUdFWF9TSEVFVF9USVRMRV9VTlFVT1RFRCAuICIpP1whXFwkP1tBLUlhLWldP1tBLVphLXpdXFwkP1swLTldKyQvdSIsJHRoaXMtPl9jdXJyZW50X3Rva2VuKSkKCQl7CgkJCSRyZXN1bHQgPSAkdGhpcy0+X2NyZWF0ZVRyZWUoJHRoaXMtPl9jdXJyZW50X3Rva2VuLCAnJywgJycpOwoJCQkkdGhpcy0+X2FkdmFuY2UoKTsKCQkJcmV0dXJuICRyZXN1bHQ7CgkJfQoJCS8vIElmIGl0J3MgYW4gZXh0ZXJuYWwgcmVmZXJlbmNlICgnU2hlZXQxJyFBMSBvciAnU2hlZXQxOlNoZWV0MichQTEgb3IgJ1NoZWV0MSchJEEkMSBvciAnU2hlZXQxOlNoZWV0MichJEEkMSkKCQllbHNlaWYgKHByZWdfbWF0Y2goIi9eJyIgLiBzZWxmOjpSRUdFWF9TSEVFVF9USVRMRV9RVU9URUQgLiAiKFw6IiAuIHNlbGY6OlJFR0VYX1NIRUVUX1RJVExFX1FVT1RFRCAuICIpPydcIVxcJD9bQS1JYS1pXT9bQS1aYS16XVxcJD9bMC05XSskL3UiLCR0aGlzLT5fY3VycmVudF90b2tlbikpCgkJewoJCQkkcmVzdWx0ID0gJHRoaXMtPl9jcmVhdGVUcmVlKCR0aGlzLT5fY3VycmVudF90b2tlbiwgJycsICcnKTsKCQkJJHRoaXMtPl9hZHZhbmNlKCk7CgkJCXJldHVybiAkcmVzdWx0OwoJCX0KCQkvLyBpZiBpdCdzIGEgcmFuZ2UgQTE6QjIgb3IgJEEkMTokQiQyCgkJZWxzZWlmIChwcmVnX21hdGNoKCcvXihcJCk/W0EtSWEtaV0/W0EtWmEtel0oXCQpP1swLTldKzooXCQpP1tBLUlhLWldP1tBLVphLXpdKFwkKT9bMC05XSskLycsJHRoaXMtPl9jdXJyZW50X3Rva2VuKSBvcgoJCQkJcHJlZ19tYXRjaCgnL14oXCQpP1tBLUlhLWldP1tBLVphLXpdKFwkKT9bMC05XStcLlwuKFwkKT9bQS1JYS1pXT9bQS1aYS16XShcJCk/WzAtOV0rJC8nLCR0aGlzLT5fY3VycmVudF90b2tlbikpCgkJewoJCQkvLyBtdXN0IGJlIGFuIGVycm9yPwoJCQkkcmVzdWx0ID0gJHRoaXMtPl9jcmVhdGVUcmVlKCR0aGlzLT5fY3VycmVudF90b2tlbiwgJycsICcnKTsKCQkJJHRoaXMtPl9hZHZhbmNlKCk7CgkJCXJldHVybiAkcmVzdWx0OwoJCX0KCQkvLyBJZiBpdCdzIGFuIGV4dGVybmFsIHJhbmdlIChTaGVldDEhQTE6QjIgb3IgU2hlZXQxOlNoZWV0MiFBMTpCMiBvciBTaGVldDEhJEEkMTokQiQyIG9yIFNoZWV0MTpTaGVldDIhJEEkMTokQiQyKQoJCWVsc2VpZiAocHJlZ19tYXRjaCgiL14iIC4gc2VsZjo6UkVHRVhfU0hFRVRfVElUTEVfVU5RVU9URUQgLiAiKFw6IiAuIHNlbGY6OlJFR0VYX1NIRUVUX1RJVExFX1VOUVVPVEVEIC4gIik/XCFcXCQ/KFtBLUlhLWldP1tBLVphLXpdKT9cXCQ/WzAtOV0rOlxcJD8oW0EtSWEtaV0/W0EtWmEtel0pP1xcJD9bMC05XSskL3UiLCR0aGlzLT5fY3VycmVudF90b2tlbikpCgkJewoJCQkvLyBtdXN0IGJlIGFuIGVycm9yPwoJCQkvLyRyZXN1bHQgPSAkdGhpcy0+X2N1cnJlbnRfdG9rZW47CgkJCSRyZXN1bHQgPSAkdGhpcy0+X2NyZWF0ZVRyZWUoJHRoaXMtPl9jdXJyZW50X3Rva2VuLCAnJywgJycpOwoJCQkkdGhpcy0+X2FkdmFuY2UoKTsKCQkJcmV0dXJuICRyZXN1bHQ7CgkJfQoJCS8vIElmIGl0J3MgYW4gZXh0ZXJuYWwgcmFuZ2UgKCdTaGVldDEnIUExOkIyIG9yICdTaGVldDEnIUExOkIyIG9yICdTaGVldDEnISRBJDE6JEIkMiBvciAnU2hlZXQxJyEkQSQxOiRCJDIpCgkJZWxzZWlmIChwcmVnX21hdGNoKCIvXiciIC4gc2VsZjo6UkVHRVhfU0hFRVRfVElUTEVfUVVPVEVEIC4gIihcOiIgLiBzZWxmOjpSRUdFWF9TSEVFVF9USVRMRV9RVU9URUQgLiAiKT8nXCFcXCQ/KFtBLUlhLWldP1tBLVphLXpdKT9cXCQ/WzAtOV0rOlxcJD8oW0EtSWEtaV0/W0EtWmEtel0pP1xcJD9bMC05XSskL3UiLCR0aGlzLT5fY3VycmVudF90b2tlbikpCgkJewoJCQkvLyBtdXN0IGJlIGFuIGVycm9yPwoJCQkvLyRyZXN1bHQgPSAkdGhpcy0+X2N1cnJlbnRfdG9rZW47CgkJCSRyZXN1bHQgPSAkdGhpcy0+X2NyZWF0ZVRyZWUoJHRoaXMtPl9jdXJyZW50X3Rva2VuLCAnJywgJycpOwoJCQkkdGhpcy0+X2FkdmFuY2UoKTsKCQkJcmV0dXJuICRyZXN1bHQ7CgkJfQoJCS8vIElmIGl0J3MgYSBudW1iZXIgb3IgYSBwZXJjZW50CgkJZWxzZWlmIChpc19udW1lcmljKCR0aGlzLT5fY3VycmVudF90b2tlbikpCgkJewoJCSAgICBpZigkdGhpcy0+X2xvb2thaGVhZCA9PSAnJScpewoJCSAgICAgICAgJHJlc3VsdCA9ICR0aGlzLT5fY3JlYXRlVHJlZSgncHRnUGVyY2VudCcsICR0aGlzLT5fY3VycmVudF90b2tlbiwgJycpOwoJCSAgICB9IGVsc2UgewoJCSAgICAgICAgJHJlc3VsdCA9ICR0aGlzLT5fY3JlYXRlVHJlZSgkdGhpcy0+X2N1cnJlbnRfdG9rZW4sICcnLCAnJyk7CgkJICAgIH0KCQkgICAgJHRoaXMtPl9hZHZhbmNlKCk7CgkJICAgIHJldHVybiAkcmVzdWx0OwoJCX0KCQkvLyBpZiBpdCdzIGEgZnVuY3Rpb24gY2FsbAoJCWVsc2VpZiAocHJlZ19tYXRjaCgiL15bQS1aMC05XHhjMC1ceGRjXC5dKyQvaSIsJHRoaXMtPl9jdXJyZW50X3Rva2VuKSkKCQl7CgkJCSRyZXN1bHQgPSAkdGhpcy0+X2Z1bmMoKTsKCQkJcmV0dXJuICRyZXN1bHQ7CgkJfQoJCXRocm93IG5ldyBFeGNlcHRpb24oIlN5bnRheCBlcnJvcjogIi4kdGhpcy0+X2N1cnJlbnRfdG9rZW4uCgkJCQkJCQkJICIsIGxvb2thaGVhZDogIi4kdGhpcy0+X2xvb2thaGVhZC4KCQkJCQkJCQkgIiwgY3VycmVudCBjaGFyOiAiLiR0aGlzLT5fY3VycmVudF9jaGFyKTsKCX0KCgkvKioKCSAqIEl0IHBhcnNlcyBhIGZ1bmN0aW9uIGNhbGwuIEl0IGFzc3VtZXMgdGhlIGZvbGxvd2luZyBydWxlOgoJICogRnVuYyAtPiAoIEV4cHIgWyxFeHByXSogKQoJICoKCSAqIEBhY2Nlc3MgcHJpdmF0ZQoJICogQHJldHVybiBtaXhlZCBUaGUgcGFyc2VkIHB0ZydkIHRyZWUgb24gc3VjY2VzcwoJICovCglmdW5jdGlvbiBfZnVuYygpCgl7CgkJJG51bV9hcmdzID0gMDsgLy8gbnVtYmVyIG9mIGFyZ3VtZW50cyByZWNlaXZlZAoJCSRmdW5jdGlvbiA9IHN0cnRvdXBwZXIoJHRoaXMtPl9jdXJyZW50X3Rva2VuKTsKCQkkcmVzdWx0ICAgPSAnJzsgLy8gaW5pdGlhbGl6ZSByZXN1bHQKCQkkdGhpcy0+X2FkdmFuY2UoKTsKCQkkdGhpcy0+X2FkdmFuY2UoKTsgICAgICAgICAvLyBlYXQgdGhlICIoIgoJCXdoaWxlICgkdGhpcy0+X2N1cnJlbnRfdG9rZW4gIT0gJyknKSB7CgkJLyoqLwoJCQlpZiAoJG51bV9hcmdzID4gMCkgewoJCQkJaWYgKCR0aGlzLT5fY3VycmVudF90b2tlbiA9PSAiLCIgb3IKCQkJCQkkdGhpcy0+X2N1cnJlbnRfdG9rZW4gPT0gIjsiKQoJCQkJewoJCQkJCSR0aGlzLT5fYWR2YW5jZSgpOyAgLy8gZWF0IHRoZSAiLCIgb3IgIjsiCgkJCQl9IGVsc2UgewoJCQkJCXRocm93IG5ldyBFeGNlcHRpb24oIlN5bnRheCBlcnJvcjogY29tbWEgZXhwZWN0ZWQgaW4gIi4KCQkJCQkJCQkJICAiZnVuY3Rpb24gJGZ1bmN0aW9uLCBhcmcgI3skbnVtX2FyZ3N9Iik7CgkJCQl9CgkJCQkkcmVzdWx0MiA9ICR0aGlzLT5fY29uZGl0aW9uKCk7CgkJCQkkcmVzdWx0ID0gJHRoaXMtPl9jcmVhdGVUcmVlKCdhcmcnLCAkcmVzdWx0LCAkcmVzdWx0Mik7CgkJCX0gZWxzZSB7IC8vIGZpcnN0IGFyZ3VtZW50CgkJCQkkcmVzdWx0MiA9ICR0aGlzLT5fY29uZGl0aW9uKCk7CgkJCQkkcmVzdWx0ID0gJHRoaXMtPl9jcmVhdGVUcmVlKCdhcmcnLCAnJywgJHJlc3VsdDIpOwoJCQl9CgkJCSsrJG51bV9hcmdzOwoJCX0KCQlpZiAoIWlzc2V0KCR0aGlzLT5fZnVuY3Rpb25zWyRmdW5jdGlvbl0pKSB7CgkJCXRocm93IG5ldyBFeGNlcHRpb24oIkZ1bmN0aW9uICRmdW5jdGlvbigpIGRvZXNuJ3QgZXhpc3QiKTsKCQl9CgkJJGFyZ3MgPSAkdGhpcy0+X2Z1bmN0aW9uc1skZnVuY3Rpb25dWzFdOwoJCS8vIElmIGZpeGVkIG51bWJlciBvZiBhcmdzIGVnLiBUSU1FKCRpLCRqLCRrKS4gQ2hlY2sgdGhhdCB0aGUgbnVtYmVyIG9mIGFyZ3MgaXMgdmFsaWQuCgkJaWYgKCgkYXJncyA+PSAwKSBhbmQgKCRhcmdzICE9ICRudW1fYXJncykpIHsKCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbigiSW5jb3JyZWN0IG51bWJlciBvZiBhcmd1bWVudHMgaW4gZnVuY3Rpb24gJGZ1bmN0aW9uKCkgIik7CgkJfQoKCQkkcmVzdWx0ID0gJHRoaXMtPl9jcmVhdGVUcmVlKCRmdW5jdGlvbiwgJHJlc3VsdCwgJG51bV9hcmdzKTsKCQkkdGhpcy0+X2FkdmFuY2UoKTsgICAgICAgICAvLyBlYXQgdGhlICIpIgoJCXJldHVybiAkcmVzdWx0OwoJfQoKCS8qKgoJICogQ3JlYXRlcyBhIHRyZWUuIEluIGZhY3QgYW4gYXJyYXkgd2hpY2ggbWF5IGhhdmUgb25lIG9yIHR3byBhcnJheXMgKHN1Yi10cmVlcykKCSAqIGFzIGVsZW1lbnRzLgoJICoKCSAqIEBhY2Nlc3MgcHJpdmF0ZQoJICogQHBhcmFtIG1peGVkICR2YWx1ZSBUaGUgdmFsdWUgb2YgdGhpcyBub2RlLgoJICogQHBhcmFtIG1peGVkICRsZWZ0ICBUaGUgbGVmdCBhcnJheSAoc3ViLXRyZWUpIG9yIGEgZmluYWwgbm9kZS4KCSAqIEBwYXJhbSBtaXhlZCAkcmlnaHQgVGhlIHJpZ2h0IGFycmF5IChzdWItdHJlZSkgb3IgYSBmaW5hbCBub2RlLgoJICogQHJldHVybiBhcnJheSBBIHRyZWUKCSAqLwoJZnVuY3Rpb24gX2NyZWF0ZVRyZWUoJHZhbHVlLCAkbGVmdCwgJHJpZ2h0KQoJewoJCXJldHVybiBhcnJheSgndmFsdWUnID0+ICR2YWx1ZSwgJ2xlZnQnID0+ICRsZWZ0LCAncmlnaHQnID0+ICRyaWdodCk7Cgl9CgoJLyoqCgkgKiBCdWlsZHMgYSBzdHJpbmcgY29udGFpbmluZyB0aGUgdHJlZSBpbiByZXZlcnNlIHBvbGlzaCBub3RhdGlvbiAoV2hhdCB5b3UKCSAqIHdvdWxkIHVzZSBpbiBhIEhQIGNhbGN1bGF0b3Igc3RhY2spLgoJICogVGhlIGZvbGxvd2luZyB0cmVlOgoJICoKCSAqICAgICsKCSAqICAgLyBcCgkgKiAgMiAgIDMKCSAqCgkgKiBwcm9kdWNlczogIjIzKyIKCSAqCgkgKiBUaGUgZm9sbG93aW5nIHRyZWU6CgkgKgoJICogICAgKwoJICogICAvIFwKCSAqICAzICAgKgoJICogICAgIC8gXAoJICogICAgNiAgIEExCgkgKgoJICogcHJvZHVjZXM6ICIzNkExKisiCgkgKgoJICogSW4gZmFjdCBhbGwgb3BlcmFuZHMsIGZ1bmN0aW9ucywgcmVmZXJlbmNlcywgZXRjLi4uIGFyZSB3cml0dGVuIGFzIHB0ZydzCgkgKgoJICogQGFjY2VzcyBwdWJsaWMKCSAqIEBwYXJhbSBhcnJheSAkdHJlZSBUaGUgb3B0aW9uYWwgdHJlZSB0byBjb252ZXJ0LgoJICogQHJldHVybiBzdHJpbmcgVGhlIHRyZWUgaW4gcmV2ZXJzZSBwb2xpc2ggbm90YXRpb24KCSAqLwoJZnVuY3Rpb24gdG9SZXZlcnNlUG9saXNoKCR0cmVlID0gYXJyYXkoKSkKCXsKCQkkcG9saXNoID0gIiI7IC8vIHRoZSBzdHJpbmcgd2UgYXJlIGdvaW5nIHRvIHJldHVybgoJCWlmIChlbXB0eSgkdHJlZSkpIHsgLy8gSWYgaXQncyB0aGUgZmlyc3QgY2FsbCB1c2UgX3BhcnNlX3RyZWUKCQkJJHRyZWUgPSAkdGhpcy0+X3BhcnNlX3RyZWU7CgkJfQoKCQlpZiAoaXNfYXJyYXkoJHRyZWVbJ2xlZnQnXSkpIHsKCQkJJGNvbnZlcnRlZF90cmVlID0gJHRoaXMtPnRvUmV2ZXJzZVBvbGlzaCgkdHJlZVsnbGVmdCddKTsKCQkJJHBvbGlzaCAuPSAkY29udmVydGVkX3RyZWU7CgkJfSBlbHNlaWYgKCR0cmVlWydsZWZ0J10gIT0gJycpIHsgLy8gSXQncyBhIGZpbmFsIG5vZGUKCQkJJGNvbnZlcnRlZF90cmVlID0gJHRoaXMtPl9jb252ZXJ0KCR0cmVlWydsZWZ0J10pOwoJCQkkcG9saXNoIC49ICRjb252ZXJ0ZWRfdHJlZTsKCQl9CgkJaWYgKGlzX2FycmF5KCR0cmVlWydyaWdodCddKSkgewoJCQkkY29udmVydGVkX3RyZWUgPSAkdGhpcy0+dG9SZXZlcnNlUG9saXNoKCR0cmVlWydyaWdodCddKTsKCQkJJHBvbGlzaCAuPSAkY29udmVydGVkX3RyZWU7CgkJfSBlbHNlaWYgKCR0cmVlWydyaWdodCddICE9ICcnKSB7IC8vIEl0J3MgYSBmaW5hbCBub2RlCgkJCSRjb252ZXJ0ZWRfdHJlZSA9ICR0aGlzLT5fY29udmVydCgkdHJlZVsncmlnaHQnXSk7CgkJCSRwb2xpc2ggLj0gJGNvbnZlcnRlZF90cmVlOwoJCX0KCQkvLyBpZiBpdCdzIGEgZnVuY3Rpb24gY29udmVydCBpdCBoZXJlIChzbyB3ZSBjYW4gc2V0IGl0J3MgYXJndW1lbnRzKQoJCWlmIChwcmVnX21hdGNoKCIvXltBLVowLTlceGMwLVx4ZGNcLl0rJC8iLCR0cmVlWyd2YWx1ZSddKSBhbmQKCQkJIXByZWdfbWF0Y2goJy9eKFtBLUlhLWldP1tBLVphLXpdKShcZCspJC8nLCR0cmVlWyd2YWx1ZSddKSBhbmQKCQkJIXByZWdfbWF0Y2goIi9eW0EtSWEtaV0/W0EtWmEtel0oXGQrKVwuXC5bQS1JYS1pXT9bQS1aYS16XShcZCspJC8iLCR0cmVlWyd2YWx1ZSddKSBhbmQKCQkJIWlzX251bWVyaWMoJHRyZWVbJ3ZhbHVlJ10pIGFuZAoJCQkhaXNzZXQoJHRoaXMtPnB0Z1skdHJlZVsndmFsdWUnXV0pKQoJCXsKCQkJLy8gbGVmdCBzdWJ0cmVlIGZvciBhIGZ1bmN0aW9uIGlzIGFsd2F5cyBhbiBhcnJheS4KCQkJaWYgKCR0cmVlWydsZWZ0J10gIT0gJycpIHsKCQkJCSRsZWZ0X3RyZWUgPSAkdGhpcy0+dG9SZXZlcnNlUG9saXNoKCR0cmVlWydsZWZ0J10pOwoJCQl9IGVsc2UgewoJCQkJJGxlZnRfdHJlZSA9ICcnOwoJCQl9CgkJCS8vIGFkZCBpdCdzIGxlZnQgc3VidHJlZSBhbmQgcmV0dXJuLgoJCQlyZXR1cm4gJGxlZnRfdHJlZS4kdGhpcy0+X2NvbnZlcnRGdW5jdGlvbigkdHJlZVsndmFsdWUnXSwgJHRyZWVbJ3JpZ2h0J10pOwoJCX0gZWxzZSB7CgkJCSRjb252ZXJ0ZWRfdHJlZSA9ICR0aGlzLT5fY29udmVydCgkdHJlZVsndmFsdWUnXSk7CgkJfQoJCSRwb2xpc2ggLj0gJGNvbnZlcnRlZF90cmVlOwoJCXJldHVybiAkcG9saXNoOwoJfQoKfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Writer/Excel5/Workbook.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIFBIUEV4Y2VsCiAqCiAqIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICoKICogQGNhdGVnb3J5ICAgUEhQRXhjZWwKICogQHBhY2thZ2UgICAgUEhQRXhjZWxfV3JpdGVyX0V4Y2VsNQogKiBAY29weXJpZ2h0ICBDb3B5cmlnaHQgKGMpIDIwMDYgLSAyMDEyIFBIUEV4Y2VsIChodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9QSFBFeGNlbCkKICogQGxpY2Vuc2UgICAgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL29sZC1saWNlbnNlcy9sZ3BsLTIuMS50eHQJTEdQTAogKiBAdmVyc2lvbiAgICAxLjcuNywgMjAxMi0wNS0xOQogKi8KCi8vIE9yaWdpbmFsIGZpbGUgaGVhZGVyIG9mIFBFQVI6OlNwcmVhZHNoZWV0X0V4Y2VsX1dyaXRlcl9Xb3JrYm9vayAodXNlZCBhcyB0aGUgYmFzZSBmb3IgdGhpcyBjbGFzcyk6Ci8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIC8qCi8vICogIE1vZHVsZSB3cml0dGVuL3BvcnRlZCBieSBYYXZpZXIgTm9ndWVyIDx4bm9ndWVyQHJlemVicmEuY29tPgovLyAqCi8vICogIFRoZSBtYWpvcml0eSBvZiB0aGlzIGlzIF9OT1RfIG15IGNvZGUuICBJIHNpbXBseSBwb3J0ZWQgaXQgZnJvbSB0aGUKLy8gKiAgUEVSTCBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCBtb2R1bGUuCi8vICoKLy8gKiAgVGhlIGF1dGhvciBvZiB0aGUgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgbW9kdWxlIGlzIEpvaG4gTWNOYW1hcmEKLy8gKiAgPGptY25hbWFyYUBjcGFuLm9yZz4KLy8gKgovLyAqICBJIF9ET18gbWFpbnRhaW4gdGhpcyBjb2RlLCBhbmQgSm9obiBNY05hbWFyYSBoYXMgbm90aGluZyB0byBkbyB3aXRoIHRoZQovLyAqICBwb3J0aW5nIG9mIHRoaXMgY29kZSB0byBQSFAuICBBbnkgcXVlc3Rpb25zIGRpcmVjdGx5IHJlbGF0ZWQgdG8gdGhpcwovLyAqICBjbGFzcyBsaWJyYXJ5IHNob3VsZCBiZSBkaXJlY3RlZCB0byBtZS4KLy8gKgovLyAqICBMaWNlbnNlIEluZm9ybWF0aW9uOgovLyAqCi8vICogICAgU3ByZWFkc2hlZXRfRXhjZWxfV3JpdGVyOiAgQSBsaWJyYXJ5IGZvciBnZW5lcmF0aW5nIEV4Y2VsIFNwcmVhZHNoZWV0cwovLyAqICAgIENvcHlyaWdodCAoYykgMjAwMi0yMDAzIFhhdmllciBOb2d1ZXIgeG5vZ3VlckByZXplYnJhLmNvbQovLyAqCi8vICogICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgovLyAqICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLy8gKiAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLy8gKiAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLy8gKgovLyAqICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAovLyAqICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi8vICogICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLy8gKiAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgovLyAqCi8vICogICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwovLyAqICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLy8gKiAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCi8vICovCgoKLyoqCiAqIFBIUEV4Y2VsX1dyaXRlcl9FeGNlbDVfV29ya2Jvb2sKICoKICogQGNhdGVnb3J5ICAgUEhQRXhjZWwKICogQHBhY2thZ2UgICAgUEhQRXhjZWxfV3JpdGVyX0V4Y2VsNQogKiBAY29weXJpZ2h0ICBDb3B5cmlnaHQgKGMpIDIwMDYgLSAyMDEyIFBIUEV4Y2VsIChodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9QSFBFeGNlbCkKICovCmNsYXNzIFBIUEV4Y2VsX1dyaXRlcl9FeGNlbDVfV29ya2Jvb2sgZXh0ZW5kcyBQSFBFeGNlbF9Xcml0ZXJfRXhjZWw1X0JJRkZ3cml0ZXIKewoJLyoqCgkgKiBGb3JtdWxhIHBhcnNlcgoJICoKCSAqIEB2YXIgUEhQRXhjZWxfV3JpdGVyX0V4Y2VsNV9QYXJzZXIKCSAqLwoJcHJpdmF0ZSAkX3BhcnNlcjsKCgkvKioKCSAqIFRoZSBCSUZGIGZpbGUgc2l6ZSBmb3IgdGhlIHdvcmtib29rLgoJICogQHZhciBpbnRlZ2VyCgkgKiBAc2VlIF9jYWxjU2hlZXRPZmZzZXRzKCkKCSAqLwoJcHVibGljICRfYmlmZnNpemU7CgoJLyoqCgkgKiBYRiBXcml0ZXJzCgkgKiBAdmFyIFBIUEV4Y2VsX1dyaXRlcl9FeGNlbDVfWGZbXQoJICovCglwcml2YXRlICRfeGZXcml0ZXJzID0gYXJyYXkoKTsKCgkvKioKCSAqIEFycmF5IGNvbnRhaW5pbmcgdGhlIGNvbG91ciBwYWxldHRlCgkgKiBAdmFyIGFycmF5CgkgKi8KCXB1YmxpYyAkX3BhbGV0dGU7CgoJLyoqCgkgKiBUaGUgY29kZXBhZ2UgaW5kaWNhdGVzIHRoZSB0ZXh0IGVuY29kaW5nIHVzZWQgZm9yIHN0cmluZ3MKCSAqIEB2YXIgaW50ZWdlcgoJICovCglwdWJsaWMgJF9jb2RlcGFnZTsKCgkvKioKCSAqIFRoZSBjb3VudHJ5IGNvZGUgdXNlZCBmb3IgbG9jYWxpemF0aW9uCgkgKiBAdmFyIGludGVnZXIKCSAqLwoJcHVibGljICRfY291bnRyeV9jb2RlOwoKCS8qKgoJICogV29ya2Jvb2sKCSAqIEB2YXIgUEhQRXhjZWwKCSAqLwoJcHJpdmF0ZSAkX3BocEV4Y2VsOwoKCS8qKgoJICogRm9udHMgd3JpdGVycwoJICoKCSAqIEB2YXIgUEhQRXhjZWxfV3JpdGVyX0V4Y2VsNV9Gb250W10KCSAqLwoJcHJpdmF0ZSAkX2ZvbnRXcml0ZXJzID0gYXJyYXkoKTsKCgkvKioKCSAqIEFkZGVkIGZvbnRzLiBNYXBzIGZyb20gZm9udCdzIGhhc2ggPT4gaW5kZXggaW4gd29ya2Jvb2sKCSAqCgkgKiBAdmFyIGFycmF5CgkgKi8KCXByaXZhdGUgJF9hZGRlZEZvbnRzID0gYXJyYXkoKTsKCgkvKioKCSAqIFNoYXJlZCBudW1iZXIgZm9ybWF0cwoJICoKCSAqIEB2YXIgYXJyYXkKCSAqLwoJcHJpdmF0ZSAkX251bWJlckZvcm1hdHMgPSBhcnJheSgpOwoKCS8qKgoJICogQWRkZWQgbnVtYmVyIGZvcm1hdHMuIE1hcHMgZnJvbSBudW1iZXJGb3JtYXQncyBoYXNoID0+IGluZGV4IGluIHdvcmtib29rCgkgKgoJICogQHZhciBhcnJheQoJICovCglwcml2YXRlICRfYWRkZWROdW1iZXJGb3JtYXRzID0gYXJyYXkoKTsKCgkvKioKCSAqIFNpemVzIG9mIHRoZSBiaW5hcnkgd29ya3NoZWV0IHN0cmVhbXMKCSAqCgkgKiBAdmFyIGFycmF5CgkgKi8KCXByaXZhdGUgJF93b3Jrc2hlZXRTaXplcyA9IGFycmF5KCk7CgoJLyoqCgkgKiBPZmZzZXRzIG9mIHRoZSBiaW5hcnkgd29ya3NoZWV0IHN0cmVhbXMgcmVsYXRpdmUgdG8gdGhlIHN0YXJ0IG9mIHRoZSBnbG9iYWwgd29ya2Jvb2sgc3RyZWFtCgkgKgoJICogQHZhciBhcnJheQoJICovCglwcml2YXRlICRfd29ya3NoZWV0T2Zmc2V0cyA9IGFycmF5KCk7CgoJLyoqCgkgKiBUb3RhbCBudW1iZXIgb2Ygc2hhcmVkIHN0cmluZ3MgaW4gd29ya2Jvb2sKCSAqCgkgKiBAdmFyIGludAoJICovCglwcml2YXRlICRfc3RyX3RvdGFsOwoKCS8qKgoJICogTnVtYmVyIG9mIHVuaXF1ZSBzaGFyZWQgc3RyaW5ncyBpbiB3b3JrYm9vawoJICoKCSAqIEB2YXIgaW50CgkgKi8KCXByaXZhdGUgJF9zdHJfdW5pcXVlOwoKCS8qKgoJICogQXJyYXkgb2YgdW5pcXVlIHNoYXJlZCBzdHJpbmdzIGluIHdvcmtib29rCgkgKgoJICogQHZhciBhcnJheQoJICovCglwcml2YXRlICRfc3RyX3RhYmxlOwoKCS8qKgoJICogQ29sb3IgY2FjaGUKCSAqLwoJcHJpdmF0ZSAkX2NvbG9yczsKCgkvKioKCSAqIEVzY2hlciBvYmplY3QgY29ycmVzcG9uZGluZyB0byBNU09EUkFXSU5HR1JPVVAKCSAqCgkgKiBAdmFyIFBIUEV4Y2VsX1NoYXJlZF9Fc2NoZXIKCSAqLwoJcHJpdmF0ZSAkX2VzY2hlcjsKCgoJLyoqCgkgKiBDbGFzcyBjb25zdHJ1Y3RvcgoJICoKCSAqIEBwYXJhbSBQSFBFeGNlbAkkcGhwRXhjZWwJCVRoZSBXb3JrYm9vawoJICogQHBhcmFtIGludAkJJiRzdHJfdG90YWwJCVRvdGFsIG51bWJlciBvZiBzdHJpbmdzCgkgKiBAcGFyYW0gaW50CQkmJHN0cl91bmlxdWUJVG90YWwgbnVtYmVyIG9mIHVuaXF1ZSBzdHJpbmdzCgkgKiBAcGFyYW0gYXJyYXkJCSYkc3RyX3RhYmxlCQlTdHJpbmcgVGFibGUKCSAqIEBwYXJhbSBhcnJheQkJJiRjb2xvcnMJCUNvbG91ciBUYWJsZQoJICogQHBhcmFtIG1peGVkCQkkcGFyc2VyCQkJVGhlIGZvcm11bGEgcGFyc2VyIGNyZWF0ZWQgZm9yIHRoZSBXb3JrYm9vawoJICovCglwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoUEhQRXhjZWwgJHBocEV4Y2VsID0gbnVsbCwKCQkJCQkJCQkmJHN0cl90b3RhbCwgJiRzdHJfdW5pcXVlLCAmJHN0cl90YWJsZSwgJiRjb2xvcnMsCgkJCQkJCQkJJHBhcnNlciApCgl7CgkJLy8gSXQgbmVlZHMgdG8gY2FsbCBpdHMgcGFyZW50J3MgY29uc3RydWN0b3IgZXhwbGljaXRseQoJCXBhcmVudDo6X19jb25zdHJ1Y3QoKTsKCgkJJHRoaXMtPl9wYXJzZXIgICAgICAgICAgID0gJHBhcnNlcjsKCQkkdGhpcy0+X2JpZmZzaXplICAgICAgICAgPSAwOwoJCSR0aGlzLT5fcGFsZXR0ZSAgICAgICAgICA9IGFycmF5KCk7CgkJJHRoaXMtPl9jb3VudHJ5X2NvZGUgICAgID0gLTE7CgoJCSR0aGlzLT5fc3RyX3RvdGFsICAgICAgID0gJiRzdHJfdG90YWw7CgkJJHRoaXMtPl9zdHJfdW5pcXVlICAgICAgPSAmJHN0cl91bmlxdWU7CgkJJHRoaXMtPl9zdHJfdGFibGUgICAgICAgPSAmJHN0cl90YWJsZTsKCQkkdGhpcy0+X2NvbG9ycyAgICAgICAgICA9ICYkY29sb3JzOwoJCSR0aGlzLT5fc2V0UGFsZXR0ZVhsOTcoKTsKCgkJJHRoaXMtPl9waHBFeGNlbCA9ICRwaHBFeGNlbDsKCgkJLy8gc2V0IEJJRkZ3cml0ZXIgbGltaXQgZm9yIENPTlRJTlVFIHJlY29yZHMKCQkvLwkJJHRoaXMtPl9saW1pdCA9IDgyMjQ7CgkJJHRoaXMtPl9jb2RlcGFnZSA9IDB4MDRCMDsKCgkJLy8gQWRkIGVtcHR5IHNoZWV0cyBhbmQgQnVpbGQgY29sb3IgY2FjaGUKCQkkY291bnRTaGVldHMgPSAkcGhwRXhjZWwtPmdldFNoZWV0Q291bnQoKTsKCQlmb3IgKCRpID0gMDsgJGkgPCAkY291bnRTaGVldHM7ICsrJGkpIHsKCQkJJHBocFNoZWV0ID0gJHBocEV4Y2VsLT5nZXRTaGVldCgkaSk7CgoJCQkkdGhpcy0+X3BhcnNlci0+c2V0RXh0U2hlZXQoJHBocFNoZWV0LT5nZXRUaXRsZSgpLCAkaSk7ICAvLyBSZWdpc3RlciB3b3Jrc2hlZXQgbmFtZSB3aXRoIHBhcnNlcgoKCQkJJHN1cGJvb2tfaW5kZXggPSAweDAwOwoJCQkkcmVmID0gcGFjaygndnZ2JywgJHN1cGJvb2tfaW5kZXgsICRpLCAkaSk7CgkJCSR0aGlzLT5fcGFyc2VyLT5fcmVmZXJlbmNlc1tdID0gJHJlZjsgIC8vIFJlZ2lzdGVyIHJlZmVyZW5jZSB3aXRoIHBhcnNlcgoKCQkJLy8gU2hlZXQgdGFiIGNvbG9ycz8KCQkJaWYgKCRwaHBTaGVldC0+aXNUYWJDb2xvclNldCgpKSB7CgkJCQkkdGhpcy0+X2FkZENvbG9yKCRwaHBTaGVldC0+Z2V0VGFiQ29sb3IoKS0+Z2V0UkdCKCkpOwoJCQl9CgkJfQoKCX0KCgkvKioKCSAqIEFkZCBhIG5ldyBYRiB3cml0ZXIKCSAqCgkgKiBAcGFyYW0gUEhQRXhjZWxfU3R5bGUKCSAqIEBwYXJhbSBib29sZWFuIElzIGl0IGEgc3R5bGUgWEY/CgkgKiBAcmV0dXJuIGludCBJbmRleCB0byBYRiByZWNvcmQKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGFkZFhmV3JpdGVyKCRzdHlsZSwgJGlzU3R5bGVYZiA9IGZhbHNlKQoJewoJCSR4ZldyaXRlciA9IG5ldyBQSFBFeGNlbF9Xcml0ZXJfRXhjZWw1X1hmKCRzdHlsZSk7CgkJJHhmV3JpdGVyLT5zZXRJc1N0eWxlWGYoJGlzU3R5bGVYZik7CgoJCS8vIEFkZCB0aGUgZm9udCBpZiBub3QgYWxyZWFkeSBhZGRlZAoJCSRmb250SW5kZXggPSAkdGhpcy0+X2FkZEZvbnQoJHN0eWxlLT5nZXRGb250KCkpOwoKCQkvLyBBc3NpZ24gdGhlIGZvbnQgaW5kZXggdG8gdGhlIHhmIHJlY29yZAoJCSR4ZldyaXRlci0+c2V0Rm9udEluZGV4KCRmb250SW5kZXgpOwoKCQkvLyBCYWNrZ3JvdW5kIGNvbG9ycywgYmVzdCB0byB0cmVhdCB0aGVzZSBhZnRlciB0aGUgZm9udCBzbyBibGFjayB3aWxsIGNvbWUgYWZ0ZXIgd2hpdGUgaW4gY3VzdG9tIHBhbGV0dGUKCQkkeGZXcml0ZXItPnNldEZnQ29sb3IoJHRoaXMtPl9hZGRDb2xvcigkc3R5bGUtPmdldEZpbGwoKS0+Z2V0U3RhcnRDb2xvcigpLT5nZXRSR0IoKSkpOwoJCSR4ZldyaXRlci0+c2V0QmdDb2xvcigkdGhpcy0+X2FkZENvbG9yKCRzdHlsZS0+Z2V0RmlsbCgpLT5nZXRFbmRDb2xvcigpLT5nZXRSR0IoKSkpOwoJCSR4ZldyaXRlci0+c2V0Qm90dG9tQ29sb3IoJHRoaXMtPl9hZGRDb2xvcigkc3R5bGUtPmdldEJvcmRlcnMoKS0+Z2V0Qm90dG9tKCktPmdldENvbG9yKCktPmdldFJHQigpKSk7CgkJJHhmV3JpdGVyLT5zZXRUb3BDb2xvcigkdGhpcy0+X2FkZENvbG9yKCRzdHlsZS0+Z2V0Qm9yZGVycygpLT5nZXRUb3AoKS0+Z2V0Q29sb3IoKS0+Z2V0UkdCKCkpKTsKCQkkeGZXcml0ZXItPnNldFJpZ2h0Q29sb3IoJHRoaXMtPl9hZGRDb2xvcigkc3R5bGUtPmdldEJvcmRlcnMoKS0+Z2V0UmlnaHQoKS0+Z2V0Q29sb3IoKS0+Z2V0UkdCKCkpKTsKCQkkeGZXcml0ZXItPnNldExlZnRDb2xvcigkdGhpcy0+X2FkZENvbG9yKCRzdHlsZS0+Z2V0Qm9yZGVycygpLT5nZXRMZWZ0KCktPmdldENvbG9yKCktPmdldFJHQigpKSk7CgkJJHhmV3JpdGVyLT5zZXREaWFnQ29sb3IoJHRoaXMtPl9hZGRDb2xvcigkc3R5bGUtPmdldEJvcmRlcnMoKS0+Z2V0RGlhZ29uYWwoKS0+Z2V0Q29sb3IoKS0+Z2V0UkdCKCkpKTsKCgkJLy8gQWRkIHRoZSBudW1iZXIgZm9ybWF0IGlmIGl0IGlzIG5vdCBhIGJ1aWx0LWluIG9uZSBhbmQgbm90IGFscmVhZHkgYWRkZWQKCQlpZiAoJHN0eWxlLT5nZXROdW1iZXJGb3JtYXQoKS0+Z2V0QnVpbHRJbkZvcm1hdENvZGUoKSA9PT0gZmFsc2UpIHsKCQkJJG51bWJlckZvcm1hdEhhc2hDb2RlID0gJHN0eWxlLT5nZXROdW1iZXJGb3JtYXQoKS0+Z2V0SGFzaENvZGUoKTsKCgkJCWlmIChpc3NldCgkdGhpcy0+X2FkZGVkTnVtYmVyRm9ybWF0c1skbnVtYmVyRm9ybWF0SGFzaENvZGVdKSkgewoJCQkJJG51bWJlckZvcm1hdEluZGV4ID0gJHRoaXMtPl9hZGRlZE51bWJlckZvcm1hdHNbJG51bWJlckZvcm1hdEhhc2hDb2RlXTsKCQkJfSBlbHNlIHsKCQkJCSRudW1iZXJGb3JtYXRJbmRleCA9IDE2NCArIGNvdW50KCR0aGlzLT5fbnVtYmVyRm9ybWF0cyk7CgkJCQkkdGhpcy0+X251bWJlckZvcm1hdHNbJG51bWJlckZvcm1hdEluZGV4XSA9ICRzdHlsZS0+Z2V0TnVtYmVyRm9ybWF0KCk7CgkJCQkkdGhpcy0+X2FkZGVkTnVtYmVyRm9ybWF0c1skbnVtYmVyRm9ybWF0SGFzaENvZGVdID0gJG51bWJlckZvcm1hdEluZGV4OwoJCQl9CgkJfSBlbHNlIHsKCQkJJG51bWJlckZvcm1hdEluZGV4ID0gKGludCkgJHN0eWxlLT5nZXROdW1iZXJGb3JtYXQoKS0+Z2V0QnVpbHRJbkZvcm1hdENvZGUoKTsKCQl9CgoJCS8vIEFzc2lnbiB0aGUgbnVtYmVyIGZvcm1hdCBpbmRleCB0byB4ZiByZWNvcmQKCQkkeGZXcml0ZXItPnNldE51bWJlckZvcm1hdEluZGV4KCRudW1iZXJGb3JtYXRJbmRleCk7CgoJCSR0aGlzLT5feGZXcml0ZXJzW10gPSAkeGZXcml0ZXI7CgoJCSR4ZkluZGV4ID0gY291bnQoJHRoaXMtPl94ZldyaXRlcnMpIC0gMTsKCQlyZXR1cm4gJHhmSW5kZXg7Cgl9CgoJLyoqCgkgKiBBZGQgYSBmb250IHRvIGFkZGVkIGZvbnRzCgkgKgoJICogQHBhcmFtIFBIUEV4Y2VsX1N0eWxlX0ZvbnQgJGZvbnQKCSAqIEByZXR1cm4gaW50IEluZGV4IHRvIEZPTlQgcmVjb3JkCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBfYWRkRm9udChQSFBFeGNlbF9TdHlsZV9Gb250ICRmb250KQoJewoJCSRmb250SGFzaENvZGUgPSAkZm9udC0+Z2V0SGFzaENvZGUoKTsKCQlpZihpc3NldCgkdGhpcy0+X2FkZGVkRm9udHNbJGZvbnRIYXNoQ29kZV0pKXsKCQkJJGZvbnRJbmRleCA9ICR0aGlzLT5fYWRkZWRGb250c1skZm9udEhhc2hDb2RlXTsKCQl9IGVsc2UgewoJCQkkY291bnRGb250cyA9IGNvdW50KCR0aGlzLT5fZm9udFdyaXRlcnMpOwoJCQkkZm9udEluZGV4ID0gKCRjb3VudEZvbnRzIDwgNCkgPyAkY291bnRGb250cyA6ICRjb3VudEZvbnRzICsgMTsKCgkJCSRmb250V3JpdGVyID0gbmV3IFBIUEV4Y2VsX1dyaXRlcl9FeGNlbDVfRm9udCgkZm9udCk7CgkJCSRmb250V3JpdGVyLT5zZXRDb2xvckluZGV4KCR0aGlzLT5fYWRkQ29sb3IoJGZvbnQtPmdldENvbG9yKCktPmdldFJHQigpKSk7CgkJCSR0aGlzLT5fZm9udFdyaXRlcnNbXSA9ICRmb250V3JpdGVyOwoKCQkJJHRoaXMtPl9hZGRlZEZvbnRzWyRmb250SGFzaENvZGVdID0gJGZvbnRJbmRleDsKCQl9CgkJcmV0dXJuICRmb250SW5kZXg7Cgl9CgkvKioKCSAqIEFsdGVyIGNvbG9yIHBhbGV0dGUgYWRkaW5nIGEgY3VzdG9tIGNvbG9yCgkgKgoJICogQHBhcmFtIHN0cmluZyAkcmdiIEUuZy4gJ0ZGMDBBQScKCSAqIEByZXR1cm4gaW50IENvbG9yIGluZGV4CgkgKi8KCXByaXZhdGUgZnVuY3Rpb24gX2FkZENvbG9yKCRyZ2IpIHsKCQlpZiAoIWlzc2V0KCR0aGlzLT5fY29sb3JzWyRyZ2JdKSkgewoJCQlpZiAoY291bnQoJHRoaXMtPl9jb2xvcnMpIDwgNTcpIHsKCQkJCS8vIHRoZW4gd2UgYWRkIGEgY3VzdG9tIGNvbG9yIGFsdGVyaW5nIHRoZSBwYWxldHRlCgkJCQkkY29sb3JJbmRleCA9IDggKyBjb3VudCgkdGhpcy0+X2NvbG9ycyk7CgkJCQkkdGhpcy0+X3BhbGV0dGVbJGNvbG9ySW5kZXhdID0KCQkJCQlhcnJheSgKCQkJCQkJaGV4ZGVjKHN1YnN0cigkcmdiLCAwLCAyKSksCgkJCQkJCWhleGRlYyhzdWJzdHIoJHJnYiwgMiwgMikpLAoJCQkJCQloZXhkZWMoc3Vic3RyKCRyZ2IsIDQpKSwKCQkJCQkJMAoJCQkJCSk7CgkJCQkkdGhpcy0+X2NvbG9yc1skcmdiXSA9ICRjb2xvckluZGV4OwoJCQl9IGVsc2UgewoJCQkJLy8gbm8gcm9vbSBmb3IgbW9yZSBjdXN0b20gY29sb3JzLCBqdXN0IG1hcCB0byBibGFjawoJCQkJJGNvbG9ySW5kZXggPSAwOwoJCQl9CgkJfSBlbHNlIHsKCQkJLy8gZmV0Y2ggYWxyZWFkeSBhZGRlZCBjdXN0b20gY29sb3IKCQkJJGNvbG9ySW5kZXggPSAkdGhpcy0+X2NvbG9yc1skcmdiXTsKCQl9CgoJCXJldHVybiAkY29sb3JJbmRleDsKCX0KCgkvKioKCSAqIFNldHMgdGhlIGNvbG91ciBwYWxldHRlIHRvIHRoZSBFeGNlbCA5NysgZGVmYXVsdC4KCSAqCgkgKiBAYWNjZXNzIHByaXZhdGUKCSAqLwoJZnVuY3Rpb24gX3NldFBhbGV0dGVYbDk3KCkKCXsKCQkkdGhpcy0+X3BhbGV0dGUgPSBhcnJheSgKCQkJMHgwOCA9PiBhcnJheSgweDAwLCAweDAwLCAweDAwLCAweDAwKSwKCQkJMHgwOSA9PiBhcnJheSgweGZmLCAweGZmLCAweGZmLCAweDAwKSwKCQkJMHgwQSA9PiBhcnJheSgweGZmLCAweDAwLCAweDAwLCAweDAwKSwKCQkJMHgwQiA9PiBhcnJheSgweDAwLCAweGZmLCAweDAwLCAweDAwKSwKCQkJMHgwQyA9PiBhcnJheSgweDAwLCAweDAwLCAweGZmLCAweDAwKSwKCQkJMHgwRCA9PiBhcnJheSgweGZmLCAweGZmLCAweDAwLCAweDAwKSwKCQkJMHgwRSA9PiBhcnJheSgweGZmLCAweDAwLCAweGZmLCAweDAwKSwKCQkJMHgwRiA9PiBhcnJheSgweDAwLCAweGZmLCAweGZmLCAweDAwKSwKCQkJMHgxMCA9PiBhcnJheSgweDgwLCAweDAwLCAweDAwLCAweDAwKSwKCQkJMHgxMSA9PiBhcnJheSgweDAwLCAweDgwLCAweDAwLCAweDAwKSwKCQkJMHgxMiA9PiBhcnJheSgweDAwLCAweDAwLCAweDgwLCAweDAwKSwKCQkJMHgxMyA9PiBhcnJheSgweDgwLCAweDgwLCAweDAwLCAweDAwKSwKCQkJMHgxNCA9PiBhcnJheSgweDgwLCAweDAwLCAweDgwLCAweDAwKSwKCQkJMHgxNSA9PiBhcnJheSgweDAwLCAweDgwLCAweDgwLCAweDAwKSwKCQkJMHgxNiA9PiBhcnJheSgweGMwLCAweGMwLCAweGMwLCAweDAwKSwKCQkJMHgxNyA9PiBhcnJheSgweDgwLCAweDgwLCAweDgwLCAweDAwKSwKCQkJMHgxOCA9PiBhcnJheSgweDk5LCAweDk5LCAweGZmLCAweDAwKSwKCQkJMHgxOSA9PiBhcnJheSgweDk5LCAweDMzLCAweDY2LCAweDAwKSwKCQkJMHgxQSA9PiBhcnJheSgweGZmLCAweGZmLCAweGNjLCAweDAwKSwKCQkJMHgxQiA9PiBhcnJheSgweGNjLCAweGZmLCAweGZmLCAweDAwKSwKCQkJMHgxQyA9PiBhcnJheSgweDY2LCAweDAwLCAweDY2LCAweDAwKSwKCQkJMHgxRCA9PiBhcnJheSgweGZmLCAweDgwLCAweDgwLCAweDAwKSwKCQkJMHgxRSA9PiBhcnJheSgweDAwLCAweDY2LCAweGNjLCAweDAwKSwKCQkJMHgxRiA9PiBhcnJheSgweGNjLCAweGNjLCAweGZmLCAweDAwKSwKCQkJMHgyMCA9PiBhcnJheSgweDAwLCAweDAwLCAweDgwLCAweDAwKSwKCQkJMHgyMSA9PiBhcnJheSgweGZmLCAweDAwLCAweGZmLCAweDAwKSwKCQkJMHgyMiA9PiBhcnJheSgweGZmLCAweGZmLCAweDAwLCAweDAwKSwKCQkJMHgyMyA9PiBhcnJheSgweDAwLCAweGZmLCAweGZmLCAweDAwKSwKCQkJMHgyNCA9PiBhcnJheSgweDgwLCAweDAwLCAweDgwLCAweDAwKSwKCQkJMHgyNSA9PiBhcnJheSgweDgwLCAweDAwLCAweDAwLCAweDAwKSwKCQkJMHgyNiA9PiBhcnJheSgweDAwLCAweDgwLCAweDgwLCAweDAwKSwKCQkJMHgyNyA9PiBhcnJheSgweDAwLCAweDAwLCAweGZmLCAweDAwKSwKCQkJMHgyOCA9PiBhcnJheSgweDAwLCAweGNjLCAweGZmLCAweDAwKSwKCQkJMHgyOSA9PiBhcnJheSgweGNjLCAweGZmLCAweGZmLCAweDAwKSwKCQkJMHgyQSA9PiBhcnJheSgweGNjLCAweGZmLCAweGNjLCAweDAwKSwKCQkJMHgyQiA9PiBhcnJheSgweGZmLCAweGZmLCAweDk5LCAweDAwKSwKCQkJMHgyQyA9PiBhcnJheSgweDk5LCAweGNjLCAweGZmLCAweDAwKSwKCQkJMHgyRCA9PiBhcnJheSgweGZmLCAweDk5LCAweGNjLCAweDAwKSwKCQkJMHgyRSA9PiBhcnJheSgweGNjLCAweDk5LCAweGZmLCAweDAwKSwKCQkJMHgyRiA9PiBhcnJheSgweGZmLCAweGNjLCAweDk5LCAweDAwKSwKCQkJMHgzMCA9PiBhcnJheSgweDMzLCAweDY2LCAweGZmLCAweDAwKSwKCQkJMHgzMSA9PiBhcnJheSgweDMzLCAweGNjLCAweGNjLCAweDAwKSwKCQkJMHgzMiA9PiBhcnJheSgweDk5LCAweGNjLCAweDAwLCAweDAwKSwKCQkJMHgzMyA9PiBhcnJheSgweGZmLCAweGNjLCAweDAwLCAweDAwKSwKCQkJMHgzNCA9PiBhcnJheSgweGZmLCAweDk5LCAweDAwLCAweDAwKSwKCQkJMHgzNSA9PiBhcnJheSgweGZmLCAweDY2LCAweDAwLCAweDAwKSwKCQkJMHgzNiA9PiBhcnJheSgweDY2LCAweDY2LCAweDk5LCAweDAwKSwKCQkJMHgzNyA9PiBhcnJheSgweDk2LCAweDk2LCAweDk2LCAweDAwKSwKCQkJMHgzOCA9PiBhcnJheSgweDAwLCAweDMzLCAweDY2LCAweDAwKSwKCQkJMHgzOSA9PiBhcnJheSgweDMzLCAweDk5LCAweDY2LCAweDAwKSwKCQkJMHgzQSA9PiBhcnJheSgweDAwLCAweDMzLCAweDAwLCAweDAwKSwKCQkJMHgzQiA9PiBhcnJheSgweDMzLCAweDMzLCAweDAwLCAweDAwKSwKCQkJMHgzQyA9PiBhcnJheSgweDk5LCAweDMzLCAweDAwLCAweDAwKSwKCQkJMHgzRCA9PiBhcnJheSgweDk5LCAweDMzLCAweDY2LCAweDAwKSwKCQkJMHgzRSA9PiBhcnJheSgweDMzLCAweDMzLCAweDk5LCAweDAwKSwKCQkJMHgzRiA9PiBhcnJheSgweDMzLCAweDMzLCAweDMzLCAweDAwKSwKCQkpOwoJfQoKCS8qKgoJICogQXNzZW1ibGUgd29ya3NoZWV0cyBpbnRvIGEgd29ya2Jvb2sgYW5kIHNlbmQgdGhlIEJJRkYgZGF0YSB0byBhbiBPTEUKCSAqIHN0b3JhZ2UuCgkgKgoJICogQHBhcmFtCWFycmF5CSRwV29ya3NoZWV0U2l6ZXMJVGhlIHNpemVzIGluIGJ5dGVzIG9mIHRoZSBiaW5hcnkgd29ya3NoZWV0IHN0cmVhbXMKCSAqIEByZXR1cm4Jc3RyaW5nCUJpbmFyeSBkYXRhIGZvciB3b3JrYm9vayBzdHJlYW0KCSAqLwoJcHVibGljIGZ1bmN0aW9uIHdyaXRlV29ya2Jvb2soJHBXb3Jrc2hlZXRTaXplcyA9IG51bGwpCgl7CgkJJHRoaXMtPl93b3Jrc2hlZXRTaXplcyA9ICRwV29ya3NoZWV0U2l6ZXM7CgoJCS8vIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHNlbGVjdGVkIHdvcmtzaGVldCB0YWJzIGFuZCBjYWxsIHRoZSBmaW5hbGl6YXRpb24KCQkvLyBtZXRob2RzIGZvciBlYWNoIHdvcmtzaGVldAoJCSR0b3RhbF93b3Jrc2hlZXRzID0gJHRoaXMtPl9waHBFeGNlbC0+Z2V0U2hlZXRDb3VudCgpOwoKCQkvLyBBZGQgcGFydCAxIG9mIHRoZSBXb3JrYm9vayBnbG9iYWxzLCB3aGF0IGdvZXMgYmVmb3JlIHRoZSBTSEVFVCByZWNvcmRzCgkJJHRoaXMtPl9zdG9yZUJvZigweDAwMDUpOwoJCSR0aGlzLT5fd3JpdGVDb2RlcGFnZSgpOwoJCSR0aGlzLT5fd3JpdGVXaW5kb3cxKCk7CgoJCSR0aGlzLT5fd3JpdGVEYXRlbW9kZSgpOwoJCSR0aGlzLT5fd3JpdGVBbGxGb250cygpOwoJCSR0aGlzLT5fd3JpdGVBbGxOdW1Gb3JtYXRzKCk7CgkJJHRoaXMtPl93cml0ZUFsbFhmcygpOwoJCSR0aGlzLT5fd3JpdGVBbGxTdHlsZXMoKTsKCQkkdGhpcy0+X3dyaXRlUGFsZXR0ZSgpOwoKCQkvLyBQcmVwYXJlIHBhcnQgMyBvZiB0aGUgd29ya2Jvb2sgZ2xvYmFsIHN0cmVhbSwgd2hhdCBnb2VzIGFmdGVyIHRoZSBTSEVFVCByZWNvcmRzCgkJJHBhcnQzID0gJyc7CgkJaWYgKCR0aGlzLT5fY291bnRyeV9jb2RlICE9IC0xKSB7CgkJCSRwYXJ0MyAuPSAkdGhpcy0+X3dyaXRlQ291bnRyeSgpOwoJCX0KCQkkcGFydDMgLj0gJHRoaXMtPl93cml0ZVJlY2FsY0lkKCk7CgoJCSRwYXJ0MyAuPSAkdGhpcy0+X3dyaXRlU3VwYm9va0ludGVybmFsKCk7CgkJLyogVE9ETzogc3RvcmUgZXh0ZXJuYWwgU1VQQk9PSyByZWNvcmRzIGFuZCBYQ1QgYW5kIENSTiByZWNvcmRzCgkJaW4gY2FzZSBvZiBleHRlcm5hbCByZWZlcmVuY2VzIGZvciBCSUZGOCAqLwoJCSRwYXJ0MyAuPSAkdGhpcy0+X3dyaXRlRXh0ZXJuc2hlZXRCaWZmOCgpOwoJCSRwYXJ0MyAuPSAkdGhpcy0+X3dyaXRlQWxsRGVmaW5lZE5hbWVzQmlmZjgoKTsKCQkkcGFydDMgLj0gJHRoaXMtPl93cml0ZU1zb0RyYXdpbmdHcm91cCgpOwoJCSRwYXJ0MyAuPSAkdGhpcy0+X3dyaXRlU2hhcmVkU3RyaW5nc1RhYmxlKCk7CgoJCSRwYXJ0MyAuPSAkdGhpcy0+d3JpdGVFb2YoKTsKCgkJLy8gQWRkIHBhcnQgMiBvZiB0aGUgV29ya2Jvb2sgZ2xvYmFscywgdGhlIFNIRUVUIHJlY29yZHMKCQkkdGhpcy0+X2NhbGNTaGVldE9mZnNldHMoKTsKCQlmb3IgKCRpID0gMDsgJGkgPCAkdG90YWxfd29ya3NoZWV0czsgKyskaSkgewoJCQkkdGhpcy0+X3dyaXRlQm91bmRzaGVldCgkdGhpcy0+X3BocEV4Y2VsLT5nZXRTaGVldCgkaSksICR0aGlzLT5fd29ya3NoZWV0T2Zmc2V0c1skaV0pOwoJCX0KCgkJLy8gQWRkIHBhcnQgMyBvZiB0aGUgV29ya2Jvb2sgZ2xvYmFscwoJCSR0aGlzLT5fZGF0YSAuPSAkcGFydDM7CgoJCXJldHVybiAkdGhpcy0+X2RhdGE7Cgl9CgoJLyoqCgkgKiBDYWxjdWxhdGUgb2Zmc2V0cyBmb3IgV29ya3NoZWV0IEJPRiByZWNvcmRzLgoJICoKCSAqIEBhY2Nlc3MgcHJpdmF0ZQoJICovCglmdW5jdGlvbiBfY2FsY1NoZWV0T2Zmc2V0cygpCgl7CgkJJGJvdW5kc2hlZXRfbGVuZ3RoID0gMTA7ICAvLyBmaXhlZCBsZW5ndGggZm9yIGEgQk9VTkRTSEVFVCByZWNvcmQKCgkJLy8gc2l6ZSBvZiBXb3JrYm9vayBnbG9iYWxzIHBhcnQgMSArIDMKCQkkb2Zmc2V0ICAgICAgICAgICAgPSAkdGhpcy0+X2RhdGFzaXplOwoKCQkvLyBhZGQgc2l6ZSBvZiBXb3JrYm9vayBnbG9iYWxzIHBhcnQgMiwgdGhlIGxlbmd0aCBvZiB0aGUgU0hFRVQgcmVjb3JkcwoJCSR0b3RhbF93b3Jrc2hlZXRzID0gY291bnQoJHRoaXMtPl9waHBFeGNlbC0+Z2V0QWxsU2hlZXRzKCkpOwoJCWZvcmVhY2ggKCR0aGlzLT5fcGhwRXhjZWwtPmdldFdvcmtzaGVldEl0ZXJhdG9yKCkgYXMgJHNoZWV0KSB7CgkJCSRvZmZzZXQgKz0gJGJvdW5kc2hlZXRfbGVuZ3RoICsgc3RybGVuKFBIUEV4Y2VsX1NoYXJlZF9TdHJpbmc6OlVURjh0b0JJRkY4VW5pY29kZVNob3J0KCRzaGVldC0+Z2V0VGl0bGUoKSkpOwoJCX0KCgkJLy8gYWRkIHRoZSBzaXplcyBvZiBlYWNoIG9mIHRoZSBTaGVldCBzdWJzdHJlYW1zLCByZXNwZWN0aXZlbHkKCQlmb3IgKCRpID0gMDsgJGkgPCAkdG90YWxfd29ya3NoZWV0czsgKyskaSkgewoJCQkkdGhpcy0+X3dvcmtzaGVldE9mZnNldHNbJGldID0gJG9mZnNldDsKCQkJJG9mZnNldCArPSAkdGhpcy0+X3dvcmtzaGVldFNpemVzWyRpXTsKCQl9CgkJJHRoaXMtPl9iaWZmc2l6ZSA9ICRvZmZzZXQ7Cgl9CgoJLyoqCgkgKiBTdG9yZSB0aGUgRXhjZWwgRk9OVCByZWNvcmRzLgoJICovCglwcml2YXRlIGZ1bmN0aW9uIF93cml0ZUFsbEZvbnRzKCkKCXsKCQlmb3JlYWNoICgkdGhpcy0+X2ZvbnRXcml0ZXJzIGFzICRmb250V3JpdGVyKSB7CgkJCSR0aGlzLT5fYXBwZW5kKCRmb250V3JpdGVyLT53cml0ZUZvbnQoKSk7CgkJfQoJfQoKCS8qKgoJICogU3RvcmUgdXNlciBkZWZpbmVkIG51bWVyaWNhbCBmb3JtYXRzIGkuZS4gRk9STUFUIHJlY29yZHMKCSAqLwoJcHJpdmF0ZSBmdW5jdGlvbiBfd3JpdGVBbGxOdW1Gb3JtYXRzKCkKCXsKCQlmb3JlYWNoICgkdGhpcy0+X251bWJlckZvcm1hdHMgYXMgJG51bWJlckZvcm1hdEluZGV4ID0+ICRudW1iZXJGb3JtYXQpIHsKCQkJJHRoaXMtPl93cml0ZU51bUZvcm1hdCgkbnVtYmVyRm9ybWF0LT5nZXRGb3JtYXRDb2RlKCksICRudW1iZXJGb3JtYXRJbmRleCk7CgkJfQoJfQoKCS8qKgoJICogV3JpdGUgYWxsIFhGIHJlY29yZHMuCgkgKi8KCXByaXZhdGUgZnVuY3Rpb24gX3dyaXRlQWxsWGZzKCkKCXsKCQlmb3JlYWNoICgkdGhpcy0+X3hmV3JpdGVycyBhcyAkeGZXcml0ZXIpIHsKCQkJJHRoaXMtPl9hcHBlbmQoJHhmV3JpdGVyLT53cml0ZVhmKCkpOwoJCX0KCX0KCgkvKioKCSAqIFdyaXRlIGFsbCBTVFlMRSByZWNvcmRzLgoJICovCglwcml2YXRlIGZ1bmN0aW9uIF93cml0ZUFsbFN0eWxlcygpCgl7CgkJJHRoaXMtPl93cml0ZVN0eWxlKCk7Cgl9CgoJLyoqCgkgKiBXcml0ZSB0aGUgRVhURVJOQ09VTlQgYW5kIEVYVEVSTlNIRUVUIHJlY29yZHMuIFRoZXNlIGFyZSB1c2VkIGFzIGluZGV4ZXMgZm9yCgkgKiB0aGUgTkFNRSByZWNvcmRzLgoJICovCglwcml2YXRlIGZ1bmN0aW9uIF93cml0ZUV4dGVybnMoKQoJewoJCSRjb3VudFNoZWV0cyA9ICR0aGlzLT5fcGhwRXhjZWwtPmdldFNoZWV0Q291bnQoKTsKCQkvLyBDcmVhdGUgRVhURVJOQ09VTlQgd2l0aCBudW1iZXIgb2Ygd29ya3NoZWV0cwoJCSR0aGlzLT5fd3JpdGVFeHRlcm5jb3VudCgkY291bnRTaGVldHMpOwoKCQkvLyBDcmVhdGUgRVhURVJOU0hFRVQgZm9yIGVhY2ggd29ya3NoZWV0CgkJZm9yICgkaSA9IDA7ICRpIDwgJGNvdW50U2hlZXRzOyArKyRpKSB7CgkJCSR0aGlzLT5fd3JpdGVFeHRlcm5zaGVldCgkdGhpcy0+X3BocEV4Y2VsLT5nZXRTaGVldCgkaSktPmdldFRpdGxlKCkpOwoJCX0KCX0KCgkvKioKCSAqIFdyaXRlIHRoZSBOQU1FIHJlY29yZCB0byBkZWZpbmUgdGhlIHByaW50IGFyZWEgYW5kIHRoZSByZXBlYXQgcm93cyBhbmQgY29scy4KCSAqLwoJcHJpdmF0ZSBmdW5jdGlvbiBfd3JpdGVOYW1lcygpCgl7CgkJLy8gdG90YWwgbnVtYmVyIG9mIHNoZWV0cwoJCSR0b3RhbF93b3Jrc2hlZXRzID0gJHRoaXMtPl9waHBFeGNlbC0+Z2V0U2hlZXRDb3VudCgpOwoKCQkvLyBDcmVhdGUgdGhlIHByaW50IGFyZWEgTkFNRSByZWNvcmRzCgkJZm9yICgkaSA9IDA7ICRpIDwgJHRvdGFsX3dvcmtzaGVldHM7ICsrJGkpIHsKCQkJJHNoZWV0U2V0dXAgPSAkdGhpcy0+X3BocEV4Y2VsLT5nZXRTaGVldCgkaSktPmdldFBhZ2VTZXR1cCgpOwoJCQkvLyBXcml0ZSBhIE5hbWUgcmVjb3JkIGlmIHRoZSBwcmludCBhcmVhIGhhcyBiZWVuIGRlZmluZWQKCQkJaWYgKCRzaGVldFNldHVwLT5pc1ByaW50QXJlYVNldCgpKSB7CgkJCQkvLyBQcmludCBhcmVhCgkJCQkkcHJpbnRBcmVhID0gUEhQRXhjZWxfQ2VsbDo6c3BsaXRSYW5nZSgkc2hlZXRTZXR1cC0+Z2V0UHJpbnRBcmVhKCkpOwoJCQkJJHByaW50QXJlYSA9ICRwcmludEFyZWFbMF07CgkJCQkkcHJpbnRBcmVhWzBdID0gUEhQRXhjZWxfQ2VsbDo6Y29vcmRpbmF0ZUZyb21TdHJpbmcoJHByaW50QXJlYVswXSk7CgkJCQkkcHJpbnRBcmVhWzFdID0gUEhQRXhjZWxfQ2VsbDo6Y29vcmRpbmF0ZUZyb21TdHJpbmcoJHByaW50QXJlYVsxXSk7CgoJCQkJJHByaW50X3Jvd21pbiA9ICRwcmludEFyZWFbMF1bMV0gLSAxOwoJCQkJJHByaW50X3Jvd21heCA9ICRwcmludEFyZWFbMV1bMV0gLSAxOwoJCQkJJHByaW50X2NvbG1pbiA9IFBIUEV4Y2VsX0NlbGw6OmNvbHVtbkluZGV4RnJvbVN0cmluZygkcHJpbnRBcmVhWzBdWzBdKSAtIDE7CgkJCQkkcHJpbnRfY29sbWF4ID0gUEhQRXhjZWxfQ2VsbDo6Y29sdW1uSW5kZXhGcm9tU3RyaW5nKCRwcmludEFyZWFbMV1bMF0pIC0gMTsKCgkJCQkkdGhpcy0+X3dyaXRlTmFtZVNob3J0KAoJCQkJCSRpLCAvLyBzaGVldCBpbmRleAoJCQkJCTB4MDYsIC8vIE5BTUUgdHlwZQoJCQkJCSRwcmludF9yb3dtaW4sCgkJCQkJJHByaW50X3Jvd21heCwKCQkJCQkkcHJpbnRfY29sbWluLAoJCQkJCSRwcmludF9jb2xtYXgKCQkJCQkpOwoJCQl9CgkJfQoKCQkvLyBDcmVhdGUgdGhlIHByaW50IHRpdGxlIE5BTUUgcmVjb3JkcwoJCWZvciAoJGkgPSAwOyAkaSA8ICR0b3RhbF93b3Jrc2hlZXRzOyArKyRpKSB7CgkJCSRzaGVldFNldHVwID0gJHRoaXMtPl9waHBFeGNlbC0+Z2V0U2hlZXQoJGkpLT5nZXRQYWdlU2V0dXAoKTsKCgkJCS8vIHNpbXVsdGFuZW91cyByZXBlYXRDb2x1bW5zIHJlcGVhdFJvd3MKCQkJaWYgKCRzaGVldFNldHVwLT5pc0NvbHVtbnNUb1JlcGVhdEF0TGVmdFNldCgpICYmICRzaGVldFNldHVwLT5pc1Jvd3NUb1JlcGVhdEF0VG9wU2V0KCkpIHsKCQkJCSRyZXBlYXQgPSAkc2hlZXRTZXR1cC0+Z2V0Q29sdW1uc1RvUmVwZWF0QXRMZWZ0KCk7CgkJCQkkY29sbWluID0gUEhQRXhjZWxfQ2VsbDo6Y29sdW1uSW5kZXhGcm9tU3RyaW5nKCRyZXBlYXRbMF0pIC0gMTsKCQkJCSRjb2xtYXggPSBQSFBFeGNlbF9DZWxsOjpjb2x1bW5JbmRleEZyb21TdHJpbmcoJHJlcGVhdFsxXSkgLSAxOwoKCQkJCSRyZXBlYXQgPSAkc2hlZXRTZXR1cC0+Z2V0Um93c1RvUmVwZWF0QXRUb3AoKTsKCQkJCSRyb3dtaW4gPSAkcmVwZWF0WzBdIC0gMTsKCQkJCSRyb3dtYXggPSAkcmVwZWF0WzFdIC0gMTsKCgkJCQkkdGhpcy0+X3dyaXRlTmFtZUxvbmcoCgkJCQkJJGksIC8vIHNoZWV0IGluZGV4CgkJCQkJMHgwNywgLy8gTkFNRSB0eXBlCgkJCQkJJHJvd21pbiwKCQkJCQkkcm93bWF4LAoJCQkJCSRjb2xtaW4sCgkJCQkJJGNvbG1heAoJCQkJCSk7CgoJCQkvLyAoZXhjbHVzaXZlKSBlaXRoZXIgcmVwZWF0Q29sdW1ucyBvciByZXBlYXRSb3dzCgkJCX0gZWxzZSBpZiAoJHNoZWV0U2V0dXAtPmlzQ29sdW1uc1RvUmVwZWF0QXRMZWZ0U2V0KCkgfHwgJHNoZWV0U2V0dXAtPmlzUm93c1RvUmVwZWF0QXRUb3BTZXQoKSkgewoKCQkJCS8vIENvbHVtbnMgdG8gcmVwZWF0CgkJCQlpZiAoJHNoZWV0U2V0dXAtPmlzQ29sdW1uc1RvUmVwZWF0QXRMZWZ0U2V0KCkpIHsKCQkJCQkkcmVwZWF0ID0gJHNoZWV0U2V0dXAtPmdldENvbHVtbnNUb1JlcGVhdEF0TGVmdCgpOwoJCQkJCSRjb2xtaW4gPSBQSFBFeGNlbF9DZWxsOjpjb2x1bW5JbmRleEZyb21TdHJpbmcoJHJlcGVhdFswXSkgLSAxOwoJCQkJCSRjb2xtYXggPSBQSFBFeGNlbF9DZWxsOjpjb2x1bW5JbmRleEZyb21TdHJpbmcoJHJlcGVhdFsxXSkgLSAxOwoJCQkJfSBlbHNlIHsKCQkJCQkkY29sbWluID0gMDsKCQkJCQkkY29sbWF4ID0gMjU1OwoJCQkJfQoKCQkJCS8vIFJvd3MgdG8gcmVwZWF0CgkJCQlpZiAoJHNoZWV0U2V0dXAtPmlzUm93c1RvUmVwZWF0QXRUb3BTZXQoKSkgewoJCQkJCSRyZXBlYXQgPSAkc2hlZXRTZXR1cC0+Z2V0Um93c1RvUmVwZWF0QXRUb3AoKTsKCQkJCQkkcm93bWluID0gJHJlcGVhdFswXSAtIDE7CgkJCQkJJHJvd21heCA9ICRyZXBlYXRbMV0gLSAxOwoJCQkJfSBlbHNlIHsKCQkJCQkkcm93bWluID0gMDsKCQkJCQkkcm93bWF4ID0gMTYzODM7CgkJCQl9CgoJCQkJJHRoaXMtPl93cml0ZU5hbWVTaG9ydCgKCQkJCQkkaSwgLy8gc2hlZXQgaW5kZXgKCQkJCQkweDA3LCAvLyBOQU1FIHR5cGUKCQkJCQkkcm93bWluLAoJCQkJCSRyb3dtYXgsCgkJCQkJJGNvbG1pbiwKCQkJCQkkY29sbWF4CgkJCQkJKTsKCQkJfQoJCX0KCX0KCgkvKioKCSAqIFdyaXRlcyBhbGwgdGhlIERFRklORUROQU1FIHJlY29yZHMgKEJJRkY4KS4KCSAqIFNvIGZhciB0aGlzIGlzIG9ubHkgdXNlZCBmb3IgcmVwZWF0aW5nIHJvd3MvY29sdW1ucyAocHJpbnQgdGl0bGVzKSBhbmQgcHJpbnQgYXJlYXMKCSAqLwoJcHJpdmF0ZSBmdW5jdGlvbiBfd3JpdGVBbGxEZWZpbmVkTmFtZXNCaWZmOCgpCgl7CgkJJGNodW5rID0gJyc7CgoJCS8vIE5hbWVkIHJhbmdlcwoJCWlmIChjb3VudCgkdGhpcy0+X3BocEV4Y2VsLT5nZXROYW1lZFJhbmdlcygpKSA+IDApIHsKCQkJLy8gTG9vcCBuYW1lZCByYW5nZXMKCQkJJG5hbWVkUmFuZ2VzID0gJHRoaXMtPl9waHBFeGNlbC0+Z2V0TmFtZWRSYW5nZXMoKTsKCQkJZm9yZWFjaCAoJG5hbWVkUmFuZ2VzIGFzICRuYW1lZFJhbmdlKSB7CgoJCQkJLy8gQ3JlYXRlIGFic29sdXRlIGNvb3JkaW5hdGUKCQkJCSRyYW5nZSA9IFBIUEV4Y2VsX0NlbGw6OnNwbGl0UmFuZ2UoJG5hbWVkUmFuZ2UtPmdldFJhbmdlKCkpOwoJCQkJZm9yICgkaSA9IDA7ICRpIDwgY291bnQoJHJhbmdlKTsgJGkrKykgewoJCQkJCSRyYW5nZVskaV1bMF0gPSAnXCcnIC4gc3RyX3JlcGxhY2UoIiciLCAiJyciLCAkbmFtZWRSYW5nZS0+Z2V0V29ya3NoZWV0KCktPmdldFRpdGxlKCkpIC4gJ1wnIScgLiBQSFBFeGNlbF9DZWxsOjphYnNvbHV0ZUNvb3JkaW5hdGUoJHJhbmdlWyRpXVswXSk7CgkJCQkJaWYgKGlzc2V0KCRyYW5nZVskaV1bMV0pKSB7CgkJCQkJCSRyYW5nZVskaV1bMV0gPSBQSFBFeGNlbF9DZWxsOjphYnNvbHV0ZUNvb3JkaW5hdGUoJHJhbmdlWyRpXVsxXSk7CgkJCQkJfQoJCQkJfQoJCQkJJHJhbmdlID0gUEhQRXhjZWxfQ2VsbDo6YnVpbGRSYW5nZSgkcmFuZ2UpOyAvLyBlLmcuIFNoZWV0MSEkQSQxOiRCJDIKCgkJCQkvLyBwYXJzZSBmb3JtdWxhCgkJCQl0cnkgewoJCQkJCSRlcnJvciA9ICR0aGlzLT5fcGFyc2VyLT5wYXJzZSgkcmFuZ2UpOwoJCQkJCSRmb3JtdWxhRGF0YSA9ICR0aGlzLT5fcGFyc2VyLT50b1JldmVyc2VQb2xpc2goKTsKCgkJCQkJLy8gbWFrZSBzdXJlIHRSZWYzZCBpcyBvZiB0eXBlIHRSZWYzZFIgKDB4M0EpCgkJCQkJaWYgKGlzc2V0KCRmb3JtdWxhRGF0YXswfSkgYW5kICgkZm9ybXVsYURhdGF7MH0gPT0gIlx4N0EiIG9yICRmb3JtdWxhRGF0YXswfSA9PSAiXHg1QSIpKSB7CgkJCQkJCSRmb3JtdWxhRGF0YSA9ICJceDNBIiAuIHN1YnN0cigkZm9ybXVsYURhdGEsIDEpOwoJCQkJCX0KCgkJCQkJaWYgKCRuYW1lZFJhbmdlLT5nZXRMb2NhbE9ubHkoKSkgewoJCQkJCQkvLyBsb2NhbCBzY29wZQoJCQkJCQkkc2NvcGUgPSAkdGhpcy0+X3BocEV4Y2VsLT5nZXRJbmRleCgkbmFtZWRSYW5nZS0+Z2V0U2NvcGUoKSkgKyAxOwoJCQkJCX0gZWxzZSB7CgkJCQkJCS8vIGdsb2JhbCBzY29wZQoJCQkJCQkkc2NvcGUgPSAwOwoJCQkJCX0KCQkJCQkkY2h1bmsgLj0gJHRoaXMtPndyaXRlRGF0YSgkdGhpcy0+X3dyaXRlRGVmaW5lZE5hbWVCaWZmOCgkbmFtZWRSYW5nZS0+Z2V0TmFtZSgpLCAkZm9ybXVsYURhdGEsICRzY29wZSwgZmFsc2UpKTsKCgkJCQl9IGNhdGNoKEV4Y2VwdGlvbiAkZSkgewoJCQkJCS8vIGRvIG5vdGhpbmcKCQkJCX0KCQkJfQoJCX0KCgkJLy8gdG90YWwgbnVtYmVyIG9mIHNoZWV0cwoJCSR0b3RhbF93b3Jrc2hlZXRzID0gJHRoaXMtPl9waHBFeGNlbC0+Z2V0U2hlZXRDb3VudCgpOwoKCQkvLyB3cml0ZSB0aGUgcHJpbnQgdGl0bGVzIChyZXBlYXRpbmcgcm93cywgY29sdW1ucyksIGlmIGFueQoJCWZvciAoJGkgPSAwOyAkaSA8ICR0b3RhbF93b3Jrc2hlZXRzOyArKyRpKSB7CgkJCSRzaGVldFNldHVwID0gJHRoaXMtPl9waHBFeGNlbC0+Z2V0U2hlZXQoJGkpLT5nZXRQYWdlU2V0dXAoKTsKCQkJLy8gc2ltdWx0YW5lb3VzIHJlcGVhdENvbHVtbnMgcmVwZWF0Um93cwoJCQlpZiAoJHNoZWV0U2V0dXAtPmlzQ29sdW1uc1RvUmVwZWF0QXRMZWZ0U2V0KCkgJiYgJHNoZWV0U2V0dXAtPmlzUm93c1RvUmVwZWF0QXRUb3BTZXQoKSkgewoJCQkJJHJlcGVhdCA9ICRzaGVldFNldHVwLT5nZXRDb2x1bW5zVG9SZXBlYXRBdExlZnQoKTsKCQkJCSRjb2xtaW4gPSBQSFBFeGNlbF9DZWxsOjpjb2x1bW5JbmRleEZyb21TdHJpbmcoJHJlcGVhdFswXSkgLSAxOwoJCQkJJGNvbG1heCA9IFBIUEV4Y2VsX0NlbGw6OmNvbHVtbkluZGV4RnJvbVN0cmluZygkcmVwZWF0WzFdKSAtIDE7CgoJCQkJJHJlcGVhdCA9ICRzaGVldFNldHVwLT5nZXRSb3dzVG9SZXBlYXRBdFRvcCgpOwoJCQkJJHJvd21pbiA9ICRyZXBlYXRbMF0gLSAxOwoJCQkJJHJvd21heCA9ICRyZXBlYXRbMV0gLSAxOwoKCQkJCS8vIGNvbnN0cnVjdCBmb3JtdWxhIGRhdGEgbWFudWFsbHkKCQkJCSRmb3JtdWxhRGF0YSA9IHBhY2soJ0N2JywgMHgyOSwgMHgxNyk7IC8vIHRNZW1GdW5jCgkJCQkkZm9ybXVsYURhdGEgLj0gcGFjaygnQ3Z2dnZ2JywgMHgzQiwgJGksIDAsIDY1NTM1LCAkY29sbWluLCAkY29sbWF4KTsgLy8gdEFyZWEzZAoJCQkJJGZvcm11bGFEYXRhIC49IHBhY2soJ0N2dnZ2dicsIDB4M0IsICRpLCAkcm93bWluLCAkcm93bWF4LCAwLCAyNTUpOyAvLyB0QXJlYTNkCgkJCQkkZm9ybXVsYURhdGEgLj0gcGFjaygnQycsIDB4MTApOyAvLyB0TGlzdAoKCQkJCS8vIHN0b3JlIHRoZSBERUZJTkVETkFNRSByZWNvcmQKCQkJCSRjaHVuayAuPSAkdGhpcy0+d3JpdGVEYXRhKCR0aGlzLT5fd3JpdGVEZWZpbmVkTmFtZUJpZmY4KHBhY2soJ0MnLCAweDA3KSwgJGZvcm11bGFEYXRhLCAkaSArIDEsIHRydWUpKTsKCgkJCS8vIChleGNsdXNpdmUpIGVpdGhlciByZXBlYXRDb2x1bW5zIG9yIHJlcGVhdFJvd3MKCQkJfSBlbHNlIGlmICgkc2hlZXRTZXR1cC0+aXNDb2x1bW5zVG9SZXBlYXRBdExlZnRTZXQoKSB8fCAkc2hlZXRTZXR1cC0+aXNSb3dzVG9SZXBlYXRBdFRvcFNldCgpKSB7CgoJCQkJLy8gQ29sdW1ucyB0byByZXBlYXQKCQkJCWlmICgkc2hlZXRTZXR1cC0+aXNDb2x1bW5zVG9SZXBlYXRBdExlZnRTZXQoKSkgewoJCQkJCSRyZXBlYXQgPSAkc2hlZXRTZXR1cC0+Z2V0Q29sdW1uc1RvUmVwZWF0QXRMZWZ0KCk7CgkJCQkJJGNvbG1pbiA9IFBIUEV4Y2VsX0NlbGw6OmNvbHVtbkluZGV4RnJvbVN0cmluZygkcmVwZWF0WzBdKSAtIDE7CgkJCQkJJGNvbG1heCA9IFBIUEV4Y2VsX0NlbGw6OmNvbHVtbkluZGV4RnJvbVN0cmluZygkcmVwZWF0WzFdKSAtIDE7CgkJCQl9IGVsc2UgewoJCQkJCSRjb2xtaW4gPSAwOwoJCQkJCSRjb2xtYXggPSAyNTU7CgkJCQl9CgkJCQkvLyBSb3dzIHRvIHJlcGVhdAoJCQkJaWYgKCRzaGVldFNldHVwLT5pc1Jvd3NUb1JlcGVhdEF0VG9wU2V0KCkpIHsKCQkJCQkkcmVwZWF0ID0gJHNoZWV0U2V0dXAtPmdldFJvd3NUb1JlcGVhdEF0VG9wKCk7CgkJCQkJJHJvd21pbiA9ICRyZXBlYXRbMF0gLSAxOwoJCQkJCSRyb3dtYXggPSAkcmVwZWF0WzFdIC0gMTsKCQkJCX0gZWxzZSB7CgkJCQkJJHJvd21pbiA9IDA7CgkJCQkJJHJvd21heCA9IDY1NTM1OwoJCQkJfQoKCQkJCS8vIGNvbnN0cnVjdCBmb3JtdWxhIGRhdGEgbWFudWFsbHkgYmVjYXVzZSBwYXJzZXIgZG9lcyBub3QgcmVjb2duaXplIGFic29sdXRlIDNkIGNlbGwgcmVmZXJlbmNlcwoJCQkJJGZvcm11bGFEYXRhID0gcGFjaygnQ3Z2dnZ2JywgMHgzQiwgJGksICRyb3dtaW4sICRyb3dtYXgsICRjb2xtaW4sICRjb2xtYXgpOwoKCQkJCS8vIHN0b3JlIHRoZSBERUZJTkVETkFNRSByZWNvcmQKCQkJCSRjaHVuayAuPSAkdGhpcy0+d3JpdGVEYXRhKCR0aGlzLT5fd3JpdGVEZWZpbmVkTmFtZUJpZmY4KHBhY2soJ0MnLCAweDA3KSwgJGZvcm11bGFEYXRhLCAkaSArIDEsIHRydWUpKTsKCQkJfQoJCX0KCgkJLy8gd3JpdGUgdGhlIHByaW50IGFyZWFzLCBpZiBhbnkKCQlmb3IgKCRpID0gMDsgJGkgPCAkdG90YWxfd29ya3NoZWV0czsgKyskaSkgewoJCQkkc2hlZXRTZXR1cCA9ICR0aGlzLT5fcGhwRXhjZWwtPmdldFNoZWV0KCRpKS0+Z2V0UGFnZVNldHVwKCk7CgkJCWlmICgkc2hlZXRTZXR1cC0+aXNQcmludEFyZWFTZXQoKSkgewoJCQkJLy8gUHJpbnQgYXJlYSwgZS5nLiBBMzpKNixIMTpYMjAKCQkJCSRwcmludEFyZWEgPSBQSFBFeGNlbF9DZWxsOjpzcGxpdFJhbmdlKCRzaGVldFNldHVwLT5nZXRQcmludEFyZWEoKSk7CgkJCQkkY291bnRQcmludEFyZWEgPSBjb3VudCgkcHJpbnRBcmVhKTsKCgkJCQkkZm9ybXVsYURhdGEgPSAnJzsKCQkJCWZvciAoJGogPSAwOyAkaiA8ICRjb3VudFByaW50QXJlYTsgKyskaikgewoJCQkJCSRwcmludEFyZWFSZWN0ID0gJHByaW50QXJlYVskal07IC8vIGUuZy4gQTM6SjYKCQkJCQkkcHJpbnRBcmVhUmVjdFswXSA9IFBIUEV4Y2VsX0NlbGw6OmNvb3JkaW5hdGVGcm9tU3RyaW5nKCRwcmludEFyZWFSZWN0WzBdKTsKCQkJCQkkcHJpbnRBcmVhUmVjdFsxXSA9IFBIUEV4Y2VsX0NlbGw6OmNvb3JkaW5hdGVGcm9tU3RyaW5nKCRwcmludEFyZWFSZWN0WzFdKTsKCgkJCQkJJHByaW50X3Jvd21pbiA9ICRwcmludEFyZWFSZWN0WzBdWzFdIC0gMTsKCQkJCQkkcHJpbnRfcm93bWF4ID0gJHByaW50QXJlYVJlY3RbMV1bMV0gLSAxOwoJCQkJCSRwcmludF9jb2xtaW4gPSBQSFBFeGNlbF9DZWxsOjpjb2x1bW5JbmRleEZyb21TdHJpbmcoJHByaW50QXJlYVJlY3RbMF1bMF0pIC0gMTsKCQkJCQkkcHJpbnRfY29sbWF4ID0gUEhQRXhjZWxfQ2VsbDo6Y29sdW1uSW5kZXhGcm9tU3RyaW5nKCRwcmludEFyZWFSZWN0WzFdWzBdKSAtIDE7CgoJCQkJCS8vIGNvbnN0cnVjdCBmb3JtdWxhIGRhdGEgbWFudWFsbHkgYmVjYXVzZSBwYXJzZXIgZG9lcyBub3QgcmVjb2duaXplIGFic29sdXRlIDNkIGNlbGwgcmVmZXJlbmNlcwoJCQkJCSRmb3JtdWxhRGF0YSAuPSBwYWNrKCdDdnZ2dnYnLCAweDNCLCAkaSwgJHByaW50X3Jvd21pbiwgJHByaW50X3Jvd21heCwgJHByaW50X2NvbG1pbiwgJHByaW50X2NvbG1heCk7CgoJCQkJCWlmICgkaiA+IDApIHsKCQkJCQkJJGZvcm11bGFEYXRhIC49IHBhY2soJ0MnLCAweDEwKTsgLy8gbGlzdCBvcGVyYXRvciB0b2tlbiAnLCcKCQkJCQl9CgkJCQl9CgoJCQkJLy8gc3RvcmUgdGhlIERFRklORUROQU1FIHJlY29yZAoJCQkJJGNodW5rIC49ICR0aGlzLT53cml0ZURhdGEoJHRoaXMtPl93cml0ZURlZmluZWROYW1lQmlmZjgocGFjaygnQycsIDB4MDYpLCAkZm9ybXVsYURhdGEsICRpICsgMSwgdHJ1ZSkpOwoJCQl9CgkJfQoKCQlyZXR1cm4gJGNodW5rOwoJfQoKCS8qKgoJICogV3JpdGUgYSBERUZJTkVETkFNRSByZWNvcmQgZm9yIEJJRkY4IHVzaW5nIGV4cGxpY2l0IGJpbmFyeSBmb3JtdWxhIGRhdGEKCSAqCgkgKiBAcGFyYW0Jc3RyaW5nCQkkbmFtZQkJCVRoZSBuYW1lIGluIFVURi04CgkgKiBAcGFyYW0Jc3RyaW5nCQkkZm9ybXVsYURhdGEJVGhlIGJpbmFyeSBmb3JtdWxhIGRhdGEKCSAqIEBwYXJhbQlzdHJpbmcJCSRzaGVldEluZGV4CQkxLWJhc2VkIHNoZWV0IGluZGV4IHRoZSBkZWZpbmVkIG5hbWUgYXBwbGllcyB0by4gMCA9IGdsb2JhbAoJICogQHBhcmFtCWJvb2xlYW4JCSRpc0J1aWx0SW4JCUJ1aWx0LWluIG5hbWU/CgkgKiBAcmV0dXJuCXN0cmluZwlDb21wbGV0ZSBiaW5hcnkgcmVjb3JkIGRhdGEKCSAqLwoJcHJpdmF0ZSBmdW5jdGlvbiBfd3JpdGVEZWZpbmVkTmFtZUJpZmY4KCRuYW1lLCAkZm9ybXVsYURhdGEsICRzaGVldEluZGV4ID0gMCwgJGlzQnVpbHRJbiA9IGZhbHNlKQoJewoJCSRyZWNvcmQgPSAweDAwMTg7CgoJCS8vIG9wdGlvbiBmbGFncwoJCSRvcHRpb25zID0gJGlzQnVpbHRJbiA/IDB4MjAgOiAweDAwOwoKCQkvLyBsZW5ndGggb2YgdGhlIG5hbWUsIGNoYXJhY3RlciBjb3VudAoJCSRubGVuID0gUEhQRXhjZWxfU2hhcmVkX1N0cmluZzo6Q291bnRDaGFyYWN0ZXJzKCRuYW1lKTsKCgkJLy8gbmFtZSB3aXRoIHN0cmlwcGVkIGxlbmd0aCBmaWVsZAoJCSRuYW1lID0gc3Vic3RyKFBIUEV4Y2VsX1NoYXJlZF9TdHJpbmc6OlVURjh0b0JJRkY4VW5pY29kZUxvbmcoJG5hbWUpLCAyKTsKCgkJLy8gc2l6ZSBvZiB0aGUgZm9ybXVsYSAoaW4gYnl0ZXMpCgkJJHN6ID0gc3RybGVuKCRmb3JtdWxhRGF0YSk7CgoJCS8vIGNvbWJpbmUgdGhlIHBhcnRzCgkJJGRhdGEgPSBwYWNrKCd2Q0N2dnZDQ0NDJywgJG9wdGlvbnMsIDAsICRubGVuLCAkc3osIDAsICRzaGVldEluZGV4LCAwLCAwLCAwLCAwKQoJCQkuICRuYW1lIC4gJGZvcm11bGFEYXRhOwoJCSRsZW5ndGggPSBzdHJsZW4oJGRhdGEpOwoKCQkkaGVhZGVyID0gcGFjaygndnYnLCAkcmVjb3JkLCAkbGVuZ3RoKTsKCgkJcmV0dXJuICRoZWFkZXIgLiAkZGF0YTsKCX0KCgkvKioKCSAqIFN0b3JlcyB0aGUgQ09ERVBBR0UgYmlmZiByZWNvcmQuCgkgKi8KCXByaXZhdGUgZnVuY3Rpb24gX3dyaXRlQ29kZXBhZ2UoKQoJewoJCSRyZWNvcmQgICAgICAgICAgPSAweDAwNDI7ICAgICAgICAgICAgIC8vIFJlY29yZCBpZGVudGlmaWVyCgkJJGxlbmd0aCAgICAgICAgICA9IDB4MDAwMjsgICAgICAgICAgICAgLy8gTnVtYmVyIG9mIGJ5dGVzIHRvIGZvbGxvdwoJCSRjdiAgICAgICAgICAgICAgPSAkdGhpcy0+X2NvZGVwYWdlOyAgIC8vIFRoZSBjb2RlIHBhZ2UKCgkJJGhlYWRlciAgICAgICAgICA9IHBhY2soJ3Z2JywgJHJlY29yZCwgJGxlbmd0aCk7CgkJJGRhdGEgICAgICAgICAgICA9IHBhY2soJ3YnLCAgJGN2KTsKCgkJJHRoaXMtPl9hcHBlbmQoJGhlYWRlciAuICRkYXRhKTsKCX0KCgkvKioKCSAqIFdyaXRlIEV4Y2VsIEJJRkYgV0lORE9XMSByZWNvcmQuCgkgKi8KCXByaXZhdGUgZnVuY3Rpb24gX3dyaXRlV2luZG93MSgpCgl7CgkJJHJlY29yZCAgICA9IDB4MDAzRDsgICAgICAgICAgICAgICAgIC8vIFJlY29yZCBpZGVudGlmaWVyCgkJJGxlbmd0aCAgICA9IDB4MDAxMjsgICAgICAgICAgICAgICAgIC8vIE51bWJlciBvZiBieXRlcyB0byBmb2xsb3cKCgkJJHhXbiAgICAgICA9IDB4MDAwMDsgICAgICAgICAgICAgICAgIC8vIEhvcml6b250YWwgcG9zaXRpb24gb2Ygd2luZG93CgkJJHlXbiAgICAgICA9IDB4MDAwMDsgICAgICAgICAgICAgICAgIC8vIFZlcnRpY2FsIHBvc2l0aW9uIG9mIHdpbmRvdwoJCSRkeFduICAgICAgPSAweDI1QkM7ICAgICAgICAgICAgICAgICAvLyBXaWR0aCBvZiB3aW5kb3cKCQkkZHlXbiAgICAgID0gMHgxNTcyOyAgICAgICAgICAgICAgICAgLy8gSGVpZ2h0IG9mIHdpbmRvdwoKCQkkZ3JiaXQgICAgID0gMHgwMDM4OyAgICAgICAgICAgICAgICAgLy8gT3B0aW9uIGZsYWdzCgoJCS8vIG5vdCBzdXBwb3J0ZWQgYnkgUEhQRXhjZWwsIHNvIHRoZXJlIGlzIG9ubHkgb25lIHNlbGVjdGVkIHNoZWV0LCB0aGUgYWN0aXZlCgkJJGN0YWJzZWwgICA9IDE7ICAgICAgIC8vIE51bWJlciBvZiB3b3JrYm9vayB0YWJzIHNlbGVjdGVkCgoJCSR3VGFiUmF0aW8gPSAweDAyNTg7ICAgICAgICAgICAgICAgICAvLyBUYWIgdG8gc2Nyb2xsYmFyIHJhdGlvCgoJCS8vIG5vdCBzdXBwb3J0ZWQgYnkgUEhQRXhjZWwsIHNldCB0byAwCgkJJGl0YWJGaXJzdCA9IDA7ICAgICAvLyAxc3QgZGlzcGxheWVkIHdvcmtzaGVldAoJCSRpdGFiQ3VyICAgPSAkdGhpcy0+X3BocEV4Y2VsLT5nZXRBY3RpdmVTaGVldEluZGV4KCk7ICAgIC8vIEFjdGl2ZSB3b3Jrc2hlZXQKCgkJJGhlYWRlciAgICA9IHBhY2soInZ2IiwgICAgICAgICRyZWNvcmQsICRsZW5ndGgpOwoJCSRkYXRhICAgICAgPSBwYWNrKCJ2dnZ2dnZ2dnYiLCAkeFduLCAkeVduLCAkZHhXbiwgJGR5V24sCgkJCQkJCQkJCSAgICRncmJpdCwKCQkJCQkJCQkJICAgJGl0YWJDdXIsICRpdGFiRmlyc3QsCgkJCQkJCQkJCSAgICRjdGFic2VsLCAkd1RhYlJhdGlvKTsKCQkkdGhpcy0+X2FwcGVuZCgkaGVhZGVyIC4gJGRhdGEpOwoJfQoKCS8qKgoJICogV3JpdGVzIEV4Y2VsIEJJRkYgQk9VTkRTSEVFVCByZWNvcmQuCgkgKgoJICogQHBhcmFtIFBIUEV4Y2VsX1dvcmtzaGVldCAgJHNoZWV0IFdvcmtzaGVldCBuYW1lCgkgKiBAcGFyYW0gaW50ZWdlciAkb2Zmc2V0ICAgIExvY2F0aW9uIG9mIHdvcmtzaGVldCBCT0YKCSAqLwoJcHJpdmF0ZSBmdW5jdGlvbiBfd3JpdGVCb3VuZHNoZWV0KCRzaGVldCwgJG9mZnNldCkKCXsKCQkkc2hlZXRuYW1lID0gJHNoZWV0LT5nZXRUaXRsZSgpOwoJCSRyZWNvcmQgICAgPSAweDAwODU7ICAgICAgICAgICAgICAgICAgICAvLyBSZWNvcmQgaWRlbnRpZmllcgoKCQkvLyBzaGVldCBzdGF0ZQoJCXN3aXRjaCAoJHNoZWV0LT5nZXRTaGVldFN0YXRlKCkpIHsKCQkJY2FzZSBQSFBFeGNlbF9Xb3Jrc2hlZXQ6OlNIRUVUU1RBVEVfVklTSUJMRToJJHNzID0gMHgwMDsgYnJlYWs7CgkJCWNhc2UgUEhQRXhjZWxfV29ya3NoZWV0OjpTSEVFVFNUQVRFX0hJRERFTjoJCSRzcyA9IDB4MDE7IGJyZWFrOwoJCQljYXNlIFBIUEV4Y2VsX1dvcmtzaGVldDo6U0hFRVRTVEFURV9WRVJZSElEREVOOgkkc3MgPSAweDAyOyBicmVhazsKCQkJZGVmYXVsdDogJHNzID0gMHgwMDsgYnJlYWs7CgkJfQoKCQkvLyBzaGVldCB0eXBlCgkJJHN0ID0gMHgwMDsKCgkJJGdyYml0ICAgICA9IDB4MDAwMDsgICAgICAgICAgICAgICAgICAgIC8vIFZpc2liaWxpdHkgYW5kIHNoZWV0IHR5cGUKCgkJJGRhdGEgICAgICA9IHBhY2soIlZDQyIsICRvZmZzZXQsICRzcywgJHN0KTsKCQkkZGF0YSAuPSBQSFBFeGNlbF9TaGFyZWRfU3RyaW5nOjpVVEY4dG9CSUZGOFVuaWNvZGVTaG9ydCgkc2hlZXRuYW1lKTsKCgkJJGxlbmd0aCA9IHN0cmxlbigkZGF0YSk7CgkJJGhlYWRlciA9IHBhY2soInZ2IiwgICRyZWNvcmQsICRsZW5ndGgpOwoJCSR0aGlzLT5fYXBwZW5kKCRoZWFkZXIgLiAkZGF0YSk7Cgl9CgoJLyoqCgkgKiBXcml0ZSBJbnRlcm5hbCBTVVBCT09LIHJlY29yZAoJICovCglwcml2YXRlIGZ1bmN0aW9uIF93cml0ZVN1cGJvb2tJbnRlcm5hbCgpCgl7CgkJJHJlY29yZCAgICA9IDB4MDFBRTsgICAvLyBSZWNvcmQgaWRlbnRpZmllcgoJCSRsZW5ndGggICAgPSAweDAwMDQ7ICAgLy8gQnl0ZXMgdG8gZm9sbG93CgoJCSRoZWFkZXIgICAgPSBwYWNrKCJ2diIsICRyZWNvcmQsICRsZW5ndGgpOwoJCSRkYXRhICAgICAgPSBwYWNrKCJ2diIsICR0aGlzLT5fcGhwRXhjZWwtPmdldFNoZWV0Q291bnQoKSwgMHgwNDAxKTsKCQlyZXR1cm4gJHRoaXMtPndyaXRlRGF0YSgkaGVhZGVyIC4gJGRhdGEpOwoJfQoKCS8qKgoJICogV3JpdGVzIHRoZSBFeGNlbCBCSUZGIEVYVEVSTlNIRUVUIHJlY29yZC4gVGhlc2UgcmVmZXJlbmNlcyBhcmUgdXNlZCBieQoJICogZm9ybXVsYXMuCgkgKgoJICovCglwcml2YXRlIGZ1bmN0aW9uIF93cml0ZUV4dGVybnNoZWV0QmlmZjgoKQoJewoJCSR0b3RhbF9yZWZlcmVuY2VzID0gY291bnQoJHRoaXMtPl9wYXJzZXItPl9yZWZlcmVuY2VzKTsKCQkkcmVjb3JkICAgPSAweDAwMTc7ICAgICAgICAgICAgICAgICAgICAgLy8gUmVjb3JkIGlkZW50aWZpZXIKCQkkbGVuZ3RoICAgPSAyICsgNiAqICR0b3RhbF9yZWZlcmVuY2VzOyAgLy8gTnVtYmVyIG9mIGJ5dGVzIHRvIGZvbGxvdwoKCQkkc3VwYm9va19pbmRleCA9IDA7ICAgICAgICAgICAvLyBGSVhNRTogb25seSB1c2luZyBpbnRlcm5hbCBTVVBCT09LIHJlY29yZAoJCSRoZWFkZXIgICAgICAgICAgID0gcGFjaygidnYiLCAgJHJlY29yZCwgJGxlbmd0aCk7CgkJJGRhdGEgICAgICAgICAgICAgPSBwYWNrKCd2JywgJHRvdGFsX3JlZmVyZW5jZXMpOwoJCWZvciAoJGkgPSAwOyAkaSA8ICR0b3RhbF9yZWZlcmVuY2VzOyArKyRpKSB7CgkJCSRkYXRhIC49ICR0aGlzLT5fcGFyc2VyLT5fcmVmZXJlbmNlc1skaV07CgkJfQoJCXJldHVybiAkdGhpcy0+d3JpdGVEYXRhKCRoZWFkZXIgLiAkZGF0YSk7Cgl9CgoJLyoqCgkgKiBXcml0ZSBFeGNlbCBCSUZGIFNUWUxFIHJlY29yZHMuCgkgKi8KCXByaXZhdGUgZnVuY3Rpb24gX3dyaXRlU3R5bGUoKQoJewoJCSRyZWNvcmQgICAgPSAweDAyOTM7ICAgLy8gUmVjb3JkIGlkZW50aWZpZXIKCQkkbGVuZ3RoICAgID0gMHgwMDA0OyAgIC8vIEJ5dGVzIHRvIGZvbGxvdwoKCQkkaXhmZSAgICAgID0gMHg4MDAwOyAgLy8gSW5kZXggdG8gY2VsbCBzdHlsZSBYRgoJCSRCdWlsdEluICAgPSAweDAwOyAgICAgLy8gQnVpbHQtaW4gc3R5bGUKCQkkaUxldmVsICAgID0gMHhmZjsgICAgIC8vIE91dGxpbmUgc3R5bGUgbGV2ZWwKCgkJJGhlYWRlciAgICA9IHBhY2soInZ2IiwgICRyZWNvcmQsICRsZW5ndGgpOwoJCSRkYXRhICAgICAgPSBwYWNrKCJ2Q0MiLCAkaXhmZSwgJEJ1aWx0SW4sICRpTGV2ZWwpOwoJCSR0aGlzLT5fYXBwZW5kKCRoZWFkZXIgLiAkZGF0YSk7Cgl9CgoJLyoqCgkgKiBXcml0ZXMgRXhjZWwgRk9STUFUIHJlY29yZCBmb3Igbm9uICJidWlsdC1pbiIgbnVtZXJpY2FsIGZvcm1hdHMuCgkgKgoJICogQHBhcmFtIHN0cmluZyAgJGZvcm1hdCBDdXN0b20gZm9ybWF0IHN0cmluZwoJICogQHBhcmFtIGludGVnZXIgJGlmbXQgICBGb3JtYXQgaW5kZXggY29kZQoJICovCglwcml2YXRlIGZ1bmN0aW9uIF93cml0ZU51bUZvcm1hdCgkZm9ybWF0LCAkaWZtdCkKCXsKCQkkcmVjb3JkICAgID0gMHgwNDFFOyAgICAgICAgICAgICAgICAgICAgICAvLyBSZWNvcmQgaWRlbnRpZmllcgoKCQkkbnVtYmVyRm9ybWF0U3RyaW5nID0gUEhQRXhjZWxfU2hhcmVkX1N0cmluZzo6VVRGOHRvQklGRjhVbmljb2RlTG9uZygkZm9ybWF0KTsKCQkkbGVuZ3RoICAgID0gMiArIHN0cmxlbigkbnVtYmVyRm9ybWF0U3RyaW5nKTsgICAgICAvLyBOdW1iZXIgb2YgYnl0ZXMgdG8gZm9sbG93CgoKCQkkaGVhZGVyICAgID0gcGFjaygidnYiLCAkcmVjb3JkLCAkbGVuZ3RoKTsKCQkkZGF0YSAgICAgID0gcGFjaygidiIsICRpZm10KSAuICAkbnVtYmVyRm9ybWF0U3RyaW5nOwoJCSR0aGlzLT5fYXBwZW5kKCRoZWFkZXIgLiAkZGF0YSk7Cgl9CgoJLyoqCgkgKiBXcml0ZSBEQVRFTU9ERSByZWNvcmQgdG8gaW5kaWNhdGUgdGhlIGRhdGUgc3lzdGVtIGluIHVzZSAoMTkwNCBvciAxOTAwKS4KCSAqLwoJcHJpdmF0ZSBmdW5jdGlvbiBfd3JpdGVEYXRlbW9kZSgpCgl7CgkJJHJlY29yZCAgICA9IDB4MDAyMjsgICAgICAgICAvLyBSZWNvcmQgaWRlbnRpZmllcgoJCSRsZW5ndGggICAgPSAweDAwMDI7ICAgICAgICAgLy8gQnl0ZXMgdG8gZm9sbG93CgoJCSRmMTkwNCAgICAgPSAoUEhQRXhjZWxfU2hhcmVkX0RhdGU6OmdldEV4Y2VsQ2FsZW5kYXIoKSA9PSBQSFBFeGNlbF9TaGFyZWRfRGF0ZTo6Q0FMRU5EQVJfTUFDXzE5MDQpID8KCQkJMSA6IDA7ICAgLy8gRmxhZyBmb3IgMTkwNCBkYXRlIHN5c3RlbQoKCQkkaGVhZGVyICAgID0gcGFjaygidnYiLCAkcmVjb3JkLCAkbGVuZ3RoKTsKCQkkZGF0YSAgICAgID0gcGFjaygidiIsICRmMTkwNCk7CgkJJHRoaXMtPl9hcHBlbmQoJGhlYWRlciAuICRkYXRhKTsKCX0KCgkvKioKCSAqIFdyaXRlIEJJRkYgcmVjb3JkIEVYVEVSTkNPVU5UIHRvIGluZGljYXRlIHRoZSBudW1iZXIgb2YgZXh0ZXJuYWwgc2hlZXQKCSAqIHJlZmVyZW5jZXMgaW4gdGhlIHdvcmtib29rLgoJICoKCSAqIEV4Y2VsIG9ubHkgc3RvcmVzIHJlZmVyZW5jZXMgdG8gZXh0ZXJuYWwgc2hlZXRzIHRoYXQgYXJlIHVzZWQgaW4gTkFNRS4KCSAqIFRoZSB3b3JrYm9vayBOQU1FIHJlY29yZCBpcyByZXF1aXJlZCB0byBkZWZpbmUgdGhlIHByaW50IGFyZWEgYW5kIHRoZSByZXBlYXQKCSAqIHJvd3MgYW5kIGNvbHVtbnMuCgkgKgoJICogQSBzaW1pbGFyIG1ldGhvZCBpcyB1c2VkIGluIFdvcmtzaGVldC5waHAgZm9yIGEgc2xpZ2h0bHkgZGlmZmVyZW50IHB1cnBvc2UuCgkgKgoJICogQHBhcmFtIGludGVnZXIgJGN4YWxzIE51bWJlciBvZiBleHRlcm5hbCByZWZlcmVuY2VzCgkgKi8KCXByaXZhdGUgZnVuY3Rpb24gX3dyaXRlRXh0ZXJuY291bnQoJGN4YWxzKQoJewoJCSRyZWNvcmQgICA9IDB4MDAxNjsgICAgICAgICAgLy8gUmVjb3JkIGlkZW50aWZpZXIKCQkkbGVuZ3RoICAgPSAweDAwMDI7ICAgICAgICAgIC8vIE51bWJlciBvZiBieXRlcyB0byBmb2xsb3cKCgkJJGhlYWRlciAgID0gcGFjaygidnYiLCAkcmVjb3JkLCAkbGVuZ3RoKTsKCQkkZGF0YSAgICAgPSBwYWNrKCJ2IiwgICRjeGFscyk7CgkJJHRoaXMtPl9hcHBlbmQoJGhlYWRlciAuICRkYXRhKTsKCX0KCgkvKioKCSAqIFdyaXRlcyB0aGUgRXhjZWwgQklGRiBFWFRFUk5TSEVFVCByZWNvcmQuIFRoZXNlIHJlZmVyZW5jZXMgYXJlIHVzZWQgYnkKCSAqIGZvcm11bGFzLiBOQU1FIHJlY29yZCBpcyByZXF1aXJlZCB0byBkZWZpbmUgdGhlIHByaW50IGFyZWEgYW5kIHRoZSByZXBlYXQKCSAqIHJvd3MgYW5kIGNvbHVtbnMuCgkgKgoJICogQSBzaW1pbGFyIG1ldGhvZCBpcyB1c2VkIGluIFdvcmtzaGVldC5waHAgZm9yIGEgc2xpZ2h0bHkgZGlmZmVyZW50IHB1cnBvc2UuCgkgKgoJICogQHBhcmFtIHN0cmluZyAkc2hlZXRuYW1lIFdvcmtzaGVldCBuYW1lCgkgKi8KCXByaXZhdGUgZnVuY3Rpb24gX3dyaXRlRXh0ZXJuc2hlZXQoJHNoZWV0bmFtZSkKCXsKCQkkcmVjb3JkICAgICAgPSAweDAwMTc7ICAgICAgICAgICAgICAgICAgICAgLy8gUmVjb3JkIGlkZW50aWZpZXIKCQkkbGVuZ3RoICAgICAgPSAweDAyICsgc3RybGVuKCRzaGVldG5hbWUpOyAgLy8gTnVtYmVyIG9mIGJ5dGVzIHRvIGZvbGxvdwoKCQkkY2NoICAgICAgICAgPSBzdHJsZW4oJHNoZWV0bmFtZSk7ICAgICAgICAgLy8gTGVuZ3RoIG9mIHNoZWV0IG5hbWUKCQkkcmdjaCAgICAgICAgPSAweDAzOyAgICAgICAgICAgICAgICAgICAgICAgLy8gRmlsZW5hbWUgZW5jb2RpbmcKCgkJJGhlYWRlciAgICAgID0gcGFjaygidnYiLCAgJHJlY29yZCwgJGxlbmd0aCk7CgkJJGRhdGEgICAgICAgID0gcGFjaygiQ0MiLCAkY2NoLCAkcmdjaCk7CgkJJHRoaXMtPl9hcHBlbmQoJGhlYWRlciAuICRkYXRhIC4gJHNoZWV0bmFtZSk7Cgl9CgoJLyoqCgkgKiBTdG9yZSB0aGUgTkFNRSByZWNvcmQgaW4gdGhlIHNob3J0IGZvcm1hdCB0aGF0IGlzIHVzZWQgZm9yIHN0b3JpbmcgdGhlIHByaW50CgkgKiBhcmVhLCByZXBlYXQgcm93cyBvbmx5IGFuZCByZXBlYXQgY29sdW1ucyBvbmx5LgoJICoKCSAqIEBwYXJhbSBpbnRlZ2VyICRpbmRleCAgU2hlZXQgaW5kZXgKCSAqIEBwYXJhbSBpbnRlZ2VyICR0eXBlICAgQnVpbHQtaW4gbmFtZSB0eXBlCgkgKiBAcGFyYW0gaW50ZWdlciAkcm93bWluIFN0YXJ0IHJvdwoJICogQHBhcmFtIGludGVnZXIgJHJvd21heCBFbmQgcm93CgkgKiBAcGFyYW0gaW50ZWdlciAkY29sbWluIFN0YXJ0IGNvbHVtCgkgKiBAcGFyYW0gaW50ZWdlciAkY29sbWF4IEVuZCBjb2x1bW4KCSAqLwoJcHJpdmF0ZSBmdW5jdGlvbiBfd3JpdGVOYW1lU2hvcnQoJGluZGV4LCAkdHlwZSwgJHJvd21pbiwgJHJvd21heCwgJGNvbG1pbiwgJGNvbG1heCkKCXsKCQkkcmVjb3JkICAgICAgICAgID0gMHgwMDE4OyAgICAgICAvLyBSZWNvcmQgaWRlbnRpZmllcgoJCSRsZW5ndGggICAgICAgICAgPSAweDAwMjQ7ICAgICAgIC8vIE51bWJlciBvZiBieXRlcyB0byBmb2xsb3cKCgkJJGdyYml0ICAgICAgICAgICA9IDB4MDAyMDsgICAgICAgLy8gT3B0aW9uIGZsYWdzCgkJJGNoS2V5ICAgICAgICAgICA9IDB4MDA7ICAgICAgICAgLy8gS2V5Ym9hcmQgc2hvcnRjdXQKCQkkY2NoICAgICAgICAgICAgID0gMHgwMTsgICAgICAgICAvLyBMZW5ndGggb2YgdGV4dCBuYW1lCgkJJGNjZSAgICAgICAgICAgICA9IDB4MDAxNTsgICAgICAgLy8gTGVuZ3RoIG9mIHRleHQgZGVmaW5pdGlvbgoJCSRpeGFscyAgICAgICAgICAgPSAkaW5kZXggKyAxOyAgIC8vIFNoZWV0IGluZGV4CgkJJGl0YWIgICAgICAgICAgICA9ICRpeGFsczsgICAgICAgLy8gRXF1YWwgdG8gaXhhbHMKCQkkY2NoQ3VzdE1lbnUgICAgID0gMHgwMDsgICAgICAgICAvLyBMZW5ndGggb2YgY3VzdCBtZW51IHRleHQKCQkkY2NoRGVzY3JpcHRpb24gID0gMHgwMDsgICAgICAgICAvLyBMZW5ndGggb2YgZGVzY3JpcHRpb24gdGV4dAoJCSRjY2hIZWxwdG9waWMgICAgPSAweDAwOyAgICAgICAgIC8vIExlbmd0aCBvZiBoZWxwIHRvcGljIHRleHQKCQkkY2NoU3RhdHVzdGV4dCAgID0gMHgwMDsgICAgICAgICAvLyBMZW5ndGggb2Ygc3RhdHVzIGJhciB0ZXh0CgkJJHJnY2ggICAgICAgICAgICA9ICR0eXBlOyAgICAgICAgLy8gQnVpbHQtaW4gbmFtZSB0eXBlCgoJCSR1bmtub3duMDMgICAgICAgPSAweDNiOwoJCSR1bmtub3duMDQgICAgICAgPSAweGZmZmYtJGluZGV4OwoJCSR1bmtub3duMDUgICAgICAgPSAweDAwMDA7CgkJJHVua25vd24wNiAgICAgICA9IDB4MDAwMDsKCQkkdW5rbm93bjA3ICAgICAgID0gMHgxMDg3OwoJCSR1bmtub3duMDggICAgICAgPSAweDgwMDU7CgoJCSRoZWFkZXIgICAgICAgICAgICAgPSBwYWNrKCJ2diIsICRyZWNvcmQsICRsZW5ndGgpOwoJCSRkYXRhICAgICAgICAgICAgICAgPSBwYWNrKCJ2IiwgJGdyYml0KTsKCQkkZGF0YSAgICAgICAgICAgICAgLj0gcGFjaygiQyIsICRjaEtleSk7CgkJJGRhdGEgICAgICAgICAgICAgIC49IHBhY2soIkMiLCAkY2NoKTsKCQkkZGF0YSAgICAgICAgICAgICAgLj0gcGFjaygidiIsICRjY2UpOwoJCSRkYXRhICAgICAgICAgICAgICAuPSBwYWNrKCJ2IiwgJGl4YWxzKTsKCQkkZGF0YSAgICAgICAgICAgICAgLj0gcGFjaygidiIsICRpdGFiKTsKCQkkZGF0YSAgICAgICAgICAgICAgLj0gcGFjaygiQyIsICRjY2hDdXN0TWVudSk7CgkJJGRhdGEgICAgICAgICAgICAgIC49IHBhY2soIkMiLCAkY2NoRGVzY3JpcHRpb24pOwoJCSRkYXRhICAgICAgICAgICAgICAuPSBwYWNrKCJDIiwgJGNjaEhlbHB0b3BpYyk7CgkJJGRhdGEgICAgICAgICAgICAgIC49IHBhY2soIkMiLCAkY2NoU3RhdHVzdGV4dCk7CgkJJGRhdGEgICAgICAgICAgICAgIC49IHBhY2soIkMiLCAkcmdjaCk7CgkJJGRhdGEgICAgICAgICAgICAgIC49IHBhY2soIkMiLCAkdW5rbm93bjAzKTsKCQkkZGF0YSAgICAgICAgICAgICAgLj0gcGFjaygidiIsICR1bmtub3duMDQpOwoJCSRkYXRhICAgICAgICAgICAgICAuPSBwYWNrKCJ2IiwgJHVua25vd24wNSk7CgkJJGRhdGEgICAgICAgICAgICAgIC49IHBhY2soInYiLCAkdW5rbm93bjA2KTsKCQkkZGF0YSAgICAgICAgICAgICAgLj0gcGFjaygidiIsICR1bmtub3duMDcpOwoJCSRkYXRhICAgICAgICAgICAgICAuPSBwYWNrKCJ2IiwgJHVua25vd24wOCk7CgkJJGRhdGEgICAgICAgICAgICAgIC49IHBhY2soInYiLCAkaW5kZXgpOwoJCSRkYXRhICAgICAgICAgICAgICAuPSBwYWNrKCJ2IiwgJGluZGV4KTsKCQkkZGF0YSAgICAgICAgICAgICAgLj0gcGFjaygidiIsICRyb3dtaW4pOwoJCSRkYXRhICAgICAgICAgICAgICAuPSBwYWNrKCJ2IiwgJHJvd21heCk7CgkJJGRhdGEgICAgICAgICAgICAgIC49IHBhY2soIkMiLCAkY29sbWluKTsKCQkkZGF0YSAgICAgICAgICAgICAgLj0gcGFjaygiQyIsICRjb2xtYXgpOwoJCSR0aGlzLT5fYXBwZW5kKCRoZWFkZXIgLiAkZGF0YSk7Cgl9CgoJLyoqCgkgKiBTdG9yZSB0aGUgTkFNRSByZWNvcmQgaW4gdGhlIGxvbmcgZm9ybWF0IHRoYXQgaXMgdXNlZCBmb3Igc3RvcmluZyB0aGUgcmVwZWF0CgkgKiByb3dzIGFuZCBjb2x1bW5zIHdoZW4gYm90aCBhcmUgc3BlY2lmaWVkLiBUaGlzIHNoYXJlcyBhIGxvdCBvZiBjb2RlIHdpdGgKCSAqIF93cml0ZU5hbWVTaG9ydCgpIGJ1dCB3ZSB1c2UgYSBzZXBhcmF0ZSBtZXRob2QgdG8ga2VlcCB0aGUgY29kZSBjbGVhbi4KCSAqIENvZGUgYWJzdHJhY3Rpb24gZm9yIHJldXNlIGNhbiBiZSBjYXJyaWVkIHRvbyBmYXIsIGFuZCBJIHNob3VsZCBrbm93LiA7LSkKCSAqCgkgKiBAcGFyYW0gaW50ZWdlciAkaW5kZXggU2hlZXQgaW5kZXgKCSAqIEBwYXJhbSBpbnRlZ2VyICR0eXBlICBCdWlsdC1pbiBuYW1lIHR5cGUKCSAqIEBwYXJhbSBpbnRlZ2VyICRyb3dtaW4gU3RhcnQgcm93CgkgKiBAcGFyYW0gaW50ZWdlciAkcm93bWF4IEVuZCByb3cKCSAqIEBwYXJhbSBpbnRlZ2VyICRjb2xtaW4gU3RhcnQgY29sdW0KCSAqIEBwYXJhbSBpbnRlZ2VyICRjb2xtYXggRW5kIGNvbHVtbgoJICovCglwcml2YXRlIGZ1bmN0aW9uIF93cml0ZU5hbWVMb25nKCRpbmRleCwgJHR5cGUsICRyb3dtaW4sICRyb3dtYXgsICRjb2xtaW4sICRjb2xtYXgpCgl7CgkJJHJlY29yZCAgICAgICAgICA9IDB4MDAxODsgICAgICAgLy8gUmVjb3JkIGlkZW50aWZpZXIKCQkkbGVuZ3RoICAgICAgICAgID0gMHgwMDNkOyAgICAgICAvLyBOdW1iZXIgb2YgYnl0ZXMgdG8gZm9sbG93CgkJJGdyYml0ICAgICAgICAgICA9IDB4MDAyMDsgICAgICAgLy8gT3B0aW9uIGZsYWdzCgkJJGNoS2V5ICAgICAgICAgICA9IDB4MDA7ICAgICAgICAgLy8gS2V5Ym9hcmQgc2hvcnRjdXQKCQkkY2NoICAgICAgICAgICAgID0gMHgwMTsgICAgICAgICAvLyBMZW5ndGggb2YgdGV4dCBuYW1lCgkJJGNjZSAgICAgICAgICAgICA9IDB4MDAyZTsgICAgICAgLy8gTGVuZ3RoIG9mIHRleHQgZGVmaW5pdGlvbgoJCSRpeGFscyAgICAgICAgICAgPSAkaW5kZXggKyAxOyAgIC8vIFNoZWV0IGluZGV4CgkJJGl0YWIgICAgICAgICAgICA9ICRpeGFsczsgICAgICAgLy8gRXF1YWwgdG8gaXhhbHMKCQkkY2NoQ3VzdE1lbnUgICAgID0gMHgwMDsgICAgICAgICAvLyBMZW5ndGggb2YgY3VzdCBtZW51IHRleHQKCQkkY2NoRGVzY3JpcHRpb24gID0gMHgwMDsgICAgICAgICAvLyBMZW5ndGggb2YgZGVzY3JpcHRpb24gdGV4dAoJCSRjY2hIZWxwdG9waWMgICAgPSAweDAwOyAgICAgICAgIC8vIExlbmd0aCBvZiBoZWxwIHRvcGljIHRleHQKCQkkY2NoU3RhdHVzdGV4dCAgID0gMHgwMDsgICAgICAgICAvLyBMZW5ndGggb2Ygc3RhdHVzIGJhciB0ZXh0CgkJJHJnY2ggICAgICAgICAgICA9ICR0eXBlOyAgICAgICAgLy8gQnVpbHQtaW4gbmFtZSB0eXBlCgoJCSR1bmtub3duMDEgICAgICAgPSAweDI5OwoJCSR1bmtub3duMDIgICAgICAgPSAweDAwMmI7CgkJJHVua25vd24wMyAgICAgICA9IDB4M2I7CgkJJHVua25vd24wNCAgICAgICA9IDB4ZmZmZi0kaW5kZXg7CgkJJHVua25vd24wNSAgICAgICA9IDB4MDAwMDsKCQkkdW5rbm93bjA2ICAgICAgID0gMHgwMDAwOwoJCSR1bmtub3duMDcgICAgICAgPSAweDEwODc7CgkJJHVua25vd24wOCAgICAgICA9IDB4ODAwODsKCgkJJGhlYWRlciAgICAgICAgICAgICA9IHBhY2soInZ2IiwgICRyZWNvcmQsICRsZW5ndGgpOwoJCSRkYXRhICAgICAgICAgICAgICAgPSBwYWNrKCJ2IiwgJGdyYml0KTsKCQkkZGF0YSAgICAgICAgICAgICAgLj0gcGFjaygiQyIsICRjaEtleSk7CgkJJGRhdGEgICAgICAgICAgICAgIC49IHBhY2soIkMiLCAkY2NoKTsKCQkkZGF0YSAgICAgICAgICAgICAgLj0gcGFjaygidiIsICRjY2UpOwoJCSRkYXRhICAgICAgICAgICAgICAuPSBwYWNrKCJ2IiwgJGl4YWxzKTsKCQkkZGF0YSAgICAgICAgICAgICAgLj0gcGFjaygidiIsICRpdGFiKTsKCQkkZGF0YSAgICAgICAgICAgICAgLj0gcGFjaygiQyIsICRjY2hDdXN0TWVudSk7CgkJJGRhdGEgICAgICAgICAgICAgIC49IHBhY2soIkMiLCAkY2NoRGVzY3JpcHRpb24pOwoJCSRkYXRhICAgICAgICAgICAgICAuPSBwYWNrKCJDIiwgJGNjaEhlbHB0b3BpYyk7CgkJJGRhdGEgICAgICAgICAgICAgIC49IHBhY2soIkMiLCAkY2NoU3RhdHVzdGV4dCk7CgkJJGRhdGEgICAgICAgICAgICAgIC49IHBhY2soIkMiLCAkcmdjaCk7CgkJJGRhdGEgICAgICAgICAgICAgIC49IHBhY2soIkMiLCAkdW5rbm93bjAxKTsKCQkkZGF0YSAgICAgICAgICAgICAgLj0gcGFjaygidiIsICR1bmtub3duMDIpOwoJCS8vIENvbHVtbiBkZWZpbml0aW9uCgkJJGRhdGEgICAgICAgICAgICAgIC49IHBhY2soIkMiLCAkdW5rbm93bjAzKTsKCQkkZGF0YSAgICAgICAgICAgICAgLj0gcGFjaygidiIsICR1bmtub3duMDQpOwoJCSRkYXRhICAgICAgICAgICAgICAuPSBwYWNrKCJ2IiwgJHVua25vd24wNSk7CgkJJGRhdGEgICAgICAgICAgICAgIC49IHBhY2soInYiLCAkdW5rbm93bjA2KTsKCQkkZGF0YSAgICAgICAgICAgICAgLj0gcGFjaygidiIsICR1bmtub3duMDcpOwoJCSRkYXRhICAgICAgICAgICAgICAuPSBwYWNrKCJ2IiwgJHVua25vd24wOCk7CgkJJGRhdGEgICAgICAgICAgICAgIC49IHBhY2soInYiLCAkaW5kZXgpOwoJCSRkYXRhICAgICAgICAgICAgICAuPSBwYWNrKCJ2IiwgJGluZGV4KTsKCQkkZGF0YSAgICAgICAgICAgICAgLj0gcGFjaygidiIsIDB4MDAwMCk7CgkJJGRhdGEgICAgICAgICAgICAgIC49IHBhY2soInYiLCAweDNmZmYpOwoJCSRkYXRhICAgICAgICAgICAgICAuPSBwYWNrKCJDIiwgJGNvbG1pbik7CgkJJGRhdGEgICAgICAgICAgICAgIC49IHBhY2soIkMiLCAkY29sbWF4KTsKCQkvLyBSb3cgZGVmaW5pdGlvbgoJCSRkYXRhICAgICAgICAgICAgICAuPSBwYWNrKCJDIiwgJHVua25vd24wMyk7CgkJJGRhdGEgICAgICAgICAgICAgIC49IHBhY2soInYiLCAkdW5rbm93bjA0KTsKCQkkZGF0YSAgICAgICAgICAgICAgLj0gcGFjaygidiIsICR1bmtub3duMDUpOwoJCSRkYXRhICAgICAgICAgICAgICAuPSBwYWNrKCJ2IiwgJHVua25vd24wNik7CgkJJGRhdGEgICAgICAgICAgICAgIC49IHBhY2soInYiLCAkdW5rbm93bjA3KTsKCQkkZGF0YSAgICAgICAgICAgICAgLj0gcGFjaygidiIsICR1bmtub3duMDgpOwoJCSRkYXRhICAgICAgICAgICAgICAuPSBwYWNrKCJ2IiwgJGluZGV4KTsKCQkkZGF0YSAgICAgICAgICAgICAgLj0gcGFjaygidiIsICRpbmRleCk7CgkJJGRhdGEgICAgICAgICAgICAgIC49IHBhY2soInYiLCAkcm93bWluKTsKCQkkZGF0YSAgICAgICAgICAgICAgLj0gcGFjaygidiIsICRyb3dtYXgpOwoJCSRkYXRhICAgICAgICAgICAgICAuPSBwYWNrKCJDIiwgMHgwMCk7CgkJJGRhdGEgICAgICAgICAgICAgIC49IHBhY2soIkMiLCAweGZmKTsKCQkvLyBFbmQgb2YgZGF0YQoJCSRkYXRhICAgICAgICAgICAgICAuPSBwYWNrKCJDIiwgMHgxMCk7CgkJJHRoaXMtPl9hcHBlbmQoJGhlYWRlciAuICRkYXRhKTsKCX0KCgkvKioKCSAqIFN0b3JlcyB0aGUgQ09VTlRSWSByZWNvcmQgZm9yIGxvY2FsaXphdGlvbgoJICoKCSAqIEByZXR1cm4gc3RyaW5nCgkgKi8KCXByaXZhdGUgZnVuY3Rpb24gX3dyaXRlQ291bnRyeSgpCgl7CgkJJHJlY29yZCAgICAgICAgICA9IDB4MDA4QzsgICAgLy8gUmVjb3JkIGlkZW50aWZpZXIKCQkkbGVuZ3RoICAgICAgICAgID0gNDsgICAgICAgICAvLyBOdW1iZXIgb2YgYnl0ZXMgdG8gZm9sbG93CgoJCSRoZWFkZXIgPSBwYWNrKCd2dicsICAkcmVjb3JkLCAkbGVuZ3RoKTsKCQkvKiB1c2luZyB0aGUgc2FtZSBjb3VudHJ5IGNvZGUgYWx3YXlzIGZvciBzaW1wbGljaXR5ICovCgkJJGRhdGEgPSBwYWNrKCd2dicsICR0aGlzLT5fY291bnRyeV9jb2RlLCAkdGhpcy0+X2NvdW50cnlfY29kZSk7CgkJLy8kdGhpcy0+X2FwcGVuZCgkaGVhZGVyIC4gJGRhdGEpOwoJCXJldHVybiAkdGhpcy0+d3JpdGVEYXRhKCRoZWFkZXIgLiAkZGF0YSk7Cgl9CgoJLyoqCgkgKiBXcml0ZSB0aGUgUkVDQUxDSUQgcmVjb3JkCgkgKgoJICogQHJldHVybiBzdHJpbmcKCSAqLwoJcHJpdmF0ZSBmdW5jdGlvbiBfd3JpdGVSZWNhbGNJZCgpCgl7CgkJJHJlY29yZCA9IDB4MDFDMTsgICAgLy8gUmVjb3JkIGlkZW50aWZpZXIKCQkkbGVuZ3RoID0gODsgICAgICAgICAvLyBOdW1iZXIgb2YgYnl0ZXMgdG8gZm9sbG93CgoJCSRoZWFkZXIgPSBwYWNrKCd2dicsICAkcmVjb3JkLCAkbGVuZ3RoKTsKCgkJLy8gYnkgaW5zcGVjdGlvbiBvZiByZWFsIEV4Y2VsIGZpbGVzLCBNUyBPZmZpY2UgRXhjZWwgMjAwNyB3cml0ZXMgdGhpcwoJCSRkYXRhID0gcGFjaygnVlYnLCAweDAwMDAwMUMxLCAweDAwMDAxRTY2Nyk7CgoJCXJldHVybiAkdGhpcy0+d3JpdGVEYXRhKCRoZWFkZXIgLiAkZGF0YSk7Cgl9CgoJLyoqCgkgKiBTdG9yZXMgdGhlIFBBTEVUVEUgYmlmZiByZWNvcmQuCgkgKi8KCXByaXZhdGUgZnVuY3Rpb24gX3dyaXRlUGFsZXR0ZSgpCgl7CgkJJGFyZWYgICAgICAgICAgICA9ICR0aGlzLT5fcGFsZXR0ZTsKCgkJJHJlY29yZCAgICAgICAgICA9IDB4MDA5MjsgICAgICAgICAgICAgICAgIC8vIFJlY29yZCBpZGVudGlmaWVyCgkJJGxlbmd0aCAgICAgICAgICA9IDIgKyA0ICogY291bnQoJGFyZWYpOyAgIC8vIE51bWJlciBvZiBieXRlcyB0byBmb2xsb3cKCQkkY2N2ICAgICAgICAgICAgID0gICAgICAgICBjb3VudCgkYXJlZik7ICAgLy8gTnVtYmVyIG9mIFJHQiB2YWx1ZXMgdG8gZm9sbG93CgkJJGRhdGEgPSAnJzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBSR0IgZGF0YQoKCQkvLyBQYWNrIHRoZSBSR0IgZGF0YQoJCWZvcmVhY2ggKCRhcmVmIGFzICRjb2xvcikgewoJCQlmb3JlYWNoICgkY29sb3IgYXMgJGJ5dGUpIHsKCQkJCSRkYXRhIC49IHBhY2soIkMiLCRieXRlKTsKCQkJfQoJCX0KCgkJJGhlYWRlciA9IHBhY2soInZ2diIsICAkcmVjb3JkLCAkbGVuZ3RoLCAkY2N2KTsKCQkkdGhpcy0+X2FwcGVuZCgkaGVhZGVyIC4gJGRhdGEpOwoJfQoKCS8qKgoJICogSGFuZGxpbmcgb2YgdGhlIFNTVCBjb250aW51ZSBibG9ja3MgaXMgY29tcGxpY2F0ZWQgYnkgdGhlIG5lZWQgdG8gaW5jbHVkZSBhbgoJICogYWRkaXRpb25hbCBjb250aW51YXRpb24gYnl0ZSBkZXBlbmRpbmcgb24gd2hldGhlciB0aGUgc3RyaW5nIGlzIHNwbGl0IGJldHdlZW4KCSAqIGJsb2NrcyBvciB3aGV0aGVyIGl0IHN0YXJ0cyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBibG9jay4gKFRoZXJlIGFyZSBhbHNvCgkgKiBhZGRpdGlvbmFsIGNvbXBsaWNhdGlvbnMgdGhhdCB3aWxsIGFyaXNlIGxhdGVyIHdoZW4vaWYgUmljaCBTdHJpbmdzIGFyZQoJICogc3VwcG9ydGVkKS4KCSAqCgkgKiBUaGUgRXhjZWwgZG9jdW1lbnRhdGlvbiBzYXlzIHRoYXQgdGhlIFNTVCByZWNvcmQgc2hvdWxkIGJlIGZvbGxvd2VkIGJ5IGFuCgkgKiBFWFRTU1QgcmVjb3JkLiBUaGUgRVhUU1NUIHJlY29yZCBpcyBhIGhhc2ggdGFibGUgdGhhdCBpcyB1c2VkIHRvIG9wdGltaXNlCgkgKiBhY2Nlc3MgdG8gU1NULiBIb3dldmVyLCBkZXNwaXRlIHRoZSBkb2N1bWVudGF0aW9uIGl0IGRvZXNuJ3Qgc2VlbSB0byBiZQoJICogcmVxdWlyZWQgc28gd2Ugd2lsbCBpZ25vcmUgaXQuCgkgKgoJICogQHJldHVybiBzdHJpbmcgQmluYXJ5IGRhdGEKCSAqLwoJcHJpdmF0ZSBmdW5jdGlvbiBfd3JpdGVTaGFyZWRTdHJpbmdzVGFibGUoKQoJewoJCS8vIG1heGltdW0gc2l6ZSBvZiByZWNvcmQgZGF0YSAoZXhjbHVkaW5nIHJlY29yZCBoZWFkZXIpCgkJJGNvbnRpbnVlX2xpbWl0ID0gODIyNDsKCgkJLy8gaW5pdGlhbGl6ZSBhcnJheSBvZiByZWNvcmQgZGF0YSBibG9ja3MKCQkkcmVjb3JkRGF0YXMgPSBhcnJheSgpOwoKCQkvLyBzdGFydCBTU1QgcmVjb3JkIGRhdGEgYmxvY2sgd2l0aCB0b3RhbCBudW1iZXIgb2Ygc3RyaW5ncywgdG90YWwgbnVtYmVyIG9mIHVuaXF1ZSBzdHJpbmdzCgkJJHJlY29yZERhdGEgPSBwYWNrKCJWViIsICR0aGlzLT5fc3RyX3RvdGFsLCAkdGhpcy0+X3N0cl91bmlxdWUpOwoKCQkvLyBsb29wIHRocm91Z2ggYWxsICh1bmlxdWUpIHN0cmluZ3MgaW4gc2hhcmVkIHN0cmluZ3MgdGFibGUKCQlmb3JlYWNoIChhcnJheV9rZXlzKCR0aGlzLT5fc3RyX3RhYmxlKSBhcyAkc3RyaW5nKSB7CgoJCQkvLyBoZXJlICRzdHJpbmcgaXMgYSBCSUZGOCBlbmNvZGVkIHN0cmluZwoKCQkJLy8gbGVuZ3RoID0gY2hhcmFjdGVyIGNvdW50CgkJCSRoZWFkZXJpbmZvID0gdW5wYWNrKCJ2bGVuZ3RoL0NlbmNvZGluZyIsICRzdHJpbmcpOwoKCQkJLy8gY3VycmVudGx5LCB0aGlzIGlzIGFsd2F5cyAxID0gdW5jb21wcmVzc2VkCgkJCSRlbmNvZGluZyA9ICRoZWFkZXJpbmZvWyJlbmNvZGluZyJdOwoKCQkJLy8gaW5pdGlhbGl6ZSBmaW5pc2hlZCB3cml0aW5nIGN1cnJlbnQgJHN0cmluZwoJCQkkZmluaXNoZWQgPSBmYWxzZTsKCgkJCXdoaWxlICgkZmluaXNoZWQgPT09IGZhbHNlKSB7CgoJCQkJLy8gbm9ybWFsbHksIHRoZXJlIHdpbGwgYmUgb25seSBvbmUgY3ljbGUsIGJ1dCBpZiBzdHJpbmcgY2Fubm90IGltbWVkaWF0ZWx5IGJlIHdyaXR0ZW4gYXMgaXMKCQkJCS8vIHRoZXJlIHdpbGwgYmUgbmVlZCBmb3IgbW9yZSB0aGFuIG9uZSBjeWxjbGUsIGlmIHN0cmluZyBsb25nZXIgdGhhbiBvbmUgcmVjb3JkIGRhdGEgYmxvY2ssIHRoZXJlCgkJCQkvLyBtYXkgYmUgbmVlZCBmb3IgZXZlbiBtb3JlIGN5Y2xlcwoKCQkJCWlmIChzdHJsZW4oJHJlY29yZERhdGEpICsgc3RybGVuKCRzdHJpbmcpIDw9ICRjb250aW51ZV9saW1pdCkgewoJCQkJCS8vIHRoZW4gd2UgY2FuIHdyaXRlIHRoZSBzdHJpbmcgKG9yIHJlbWFpbmRlciBvZiBzdHJpbmcpIHdpdGhvdXQgYW55IHByb2JsZW1zCgkJCQkJJHJlY29yZERhdGEgLj0gJHN0cmluZzsKCgkJCQkJaWYgKHN0cmxlbigkcmVjb3JkRGF0YSkgKyBzdHJsZW4oJHN0cmluZykgPT0gJGNvbnRpbnVlX2xpbWl0KSB7CgkJCQkJCS8vIHdlIGNsb3NlIHRoZSByZWNvcmQgZGF0YSBibG9jaywgYW5kIGluaXRpYWxpemUgYSBuZXcgb25lCgkJCQkJCSRyZWNvcmREYXRhc1tdID0gJHJlY29yZERhdGE7CgkJCQkJCSRyZWNvcmREYXRhID0gJyc7CgkJCQkJfQoKCQkJCQkvLyB3ZSBhcmUgZmluaXNoZWQgd3JpdGluZyB0aGlzIHN0cmluZwoJCQkJCSRmaW5pc2hlZCA9IHRydWU7CgkJCQl9IGVsc2UgewoJCQkJCS8vIHNwZWNpYWwgdHJlYXRtZW50IHdyaXRpbmcgdGhlIHN0cmluZyAob3IgcmVtYWluZGVyIG9mIHRoZSBzdHJpbmcpCgkJCQkJLy8gSWYgdGhlIHN0cmluZyBpcyB2ZXJ5IGxvbmcgaXQgbWF5IG5lZWQgdG8gYmUgd3JpdHRlbiBpbiBtb3JlIHRoYW4gb25lIENPTlRJTlVFIHJlY29yZC4KCgkJCQkJLy8gY2hlY2sgaG93IG1hbnkgYnl0ZXMgbW9yZSB0aGVyZSBpcyByb29tIGZvciBpbiB0aGUgY3VycmVudCByZWNvcmQKCQkJCQkkc3BhY2VfcmVtYWluaW5nID0gJGNvbnRpbnVlX2xpbWl0IC0gc3RybGVuKCRyZWNvcmREYXRhKTsKCgkJCQkJLy8gbWluaW11bSBzcGFjZSBuZWVkZWQKCQkJCQkvLyB1bmNvbXByZXNzZWQ6IDIgYnl0ZSBzdHJpbmcgbGVuZ3RoIGxlbmd0aCBmaWVsZCArIDEgYnl0ZSBvcHRpb24gZmxhZ3MgKyAyIGJ5dGUgY2hhcmFjdGVyCgkJCQkJLy8gY29tcHJlc3NlZDogICAyIGJ5dGUgc3RyaW5nIGxlbmd0aCBsZW5ndGggZmllbGQgKyAxIGJ5dGUgb3B0aW9uIGZsYWdzICsgMSBieXRlIGNoYXJhY3RlcgoJCQkJCSRtaW5fc3BhY2VfbmVlZGVkID0gKCRlbmNvZGluZyA9PSAxKSA/IDUgOiA0OwoKCQkJCQkvLyBXZSBoYXZlIHR3byBjYXNlcwoJCQkJCS8vIDEuIHNwYWNlIHJlbWFpbmluZyBpcyBsZXNzIHRoYW4gbWluaW11bSBzcGFjZSBuZWVkZWQKCQkJCQkvLwkJaGVyZSB3ZSBtdXN0IHdhc3RlIHRoZSBzcGFjZSByZW1haW5pbmcgYW5kIG1vdmUgdG8gbmV4dCByZWNvcmQgZGF0YSBibG9jawoJCQkJCS8vIDIuIHNwYWNlIHJlbWFpbmluZyBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gbWluaW11bSBzcGFjZSBuZWVkZWQKCQkJCQkvLwkJaGVyZSB3ZSB3cml0ZSBhcyBtdWNoIGFzIHdlIGNhbiBpbiB0aGUgY3VycmVudCBibG9jaywgdGhlbiBtb3ZlIHRvIG5leHQgcmVjb3JkIGRhdGEgYmxvY2sKCgkJCQkJLy8gMS4gc3BhY2UgcmVtYWluaW5nIGlzIGxlc3MgdGhhbiBtaW5pbXVtIHNwYWNlIG5lZWRlZAoJCQkJCWlmICgkc3BhY2VfcmVtYWluaW5nIDwgJG1pbl9zcGFjZV9uZWVkZWQpIHsKCQkJCQkJLy8gd2UgY2xvc2UgdGhlIGJsb2NrLCBzdG9yZSB0aGUgYmxvY2sgZGF0YQoJCQkJCQkkcmVjb3JkRGF0YXNbXSA9ICRyZWNvcmREYXRhOwoKCQkJCQkJLy8gYW5kIHN0YXJ0IG5ldyByZWNvcmQgZGF0YSBibG9jayB3aGVyZSB3ZSBzdGFydCB3cml0aW5nIHRoZSBzdHJpbmcKCQkJCQkJJHJlY29yZERhdGEgPSAnJzsKCgkJCQkJLy8gMi4gc3BhY2UgcmVtYWluaW5nIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBtaW5pbXVtIHNwYWNlIG5lZWRlZAoJCQkJCX0gZWxzZSB7CgkJCQkJCS8vIGluaXRpYWxpemUgZWZmZWN0aXZlIHJlbWFpbmluZyBzcGFjZSwgZm9yIFVuaWNvZGUgc3RyaW5ncyB0aGlzIG1heSBuZWVkIHRvIGJlIHJlZHVjZWQgYnkgMSwgc2VlIGJlbG93CgkJCQkJCSRlZmZlY3RpdmVfc3BhY2VfcmVtYWluaW5nID0gJHNwYWNlX3JlbWFpbmluZzsKCgkJCQkJCS8vIGZvciB1bmNvbXByZXNzZWQgc3RyaW5ncywgc29tZXRpbWVzIGVmZmVjdGl2ZSBzcGFjZSByZW1haW5pbmcgaXMgcmVkdWNlZCBieSAxCgkJCQkJCWlmICggJGVuY29kaW5nID09IDEgJiYgKHN0cmxlbigkc3RyaW5nKSAtICRzcGFjZV9yZW1haW5pbmcpICUgMiA9PSAxICkgewoJCQkJCQkJLS0kZWZmZWN0aXZlX3NwYWNlX3JlbWFpbmluZzsKCQkJCQkJfQoKCQkJCQkJLy8gb25lIGJsb2NrIGZpbmluc2hlZCwgc3RvcmUgdGhlIGJsb2NrIGRhdGEKCQkJCQkJJHJlY29yZERhdGEgLj0gc3Vic3RyKCRzdHJpbmcsIDAsICRlZmZlY3RpdmVfc3BhY2VfcmVtYWluaW5nKTsKCgkJCQkJCSRzdHJpbmcgPSBzdWJzdHIoJHN0cmluZywgJGVmZmVjdGl2ZV9zcGFjZV9yZW1haW5pbmcpOyAvLyBmb3IgbmV4dCBjeWNsZSBpbiB3aGlsZSBsb29wCgkJCQkJCSRyZWNvcmREYXRhc1tdID0gJHJlY29yZERhdGE7CgoJCQkJCQkvLyBzdGFydCBuZXcgcmVjb3JkIGRhdGEgYmxvY2sgd2l0aCB0aGUgcmVwZWF0ZWQgb3B0aW9uIGZsYWdzCgkJCQkJCSRyZWNvcmREYXRhID0gcGFjaygnQycsICRlbmNvZGluZyk7CgkJCQkJfQoJCQkJfQoJCQl9CgkJfQoKCQkvLyBTdG9yZSB0aGUgbGFzdCByZWNvcmQgZGF0YSBibG9jayB1bmxlc3MgaXQgaXMgZW1wdHkKCQkvLyBpZiB0aGVyZSB3YXMgbm8gbmVlZCBmb3IgYW55IGNvbnRpbnVlIHJlY29yZHMsIHRoaXMgd2lsbCBiZSB0aGUgZm9yIFNTVCByZWNvcmQgZGF0YSBibG9jayBpdHNlbGYKCQlpZiAoc3RybGVuKCRyZWNvcmREYXRhKSA+IDApIHsKCQkJJHJlY29yZERhdGFzW10gPSAkcmVjb3JkRGF0YTsKCQl9CgoJCS8vIGNvbWJpbmUgaW50byBvbmUgY2h1bmsgd2l0aCBhbGwgdGhlIGJsb2NrcyBTU1QsIENPTlRJTlVFLC4uLgoJCSRjaHVuayA9ICcnOwoJCWZvcmVhY2ggKCRyZWNvcmREYXRhcyBhcyAkaSA9PiAkcmVjb3JkRGF0YSkgewoJCQkvLyBmaXJzdCBibG9jayBzaG91bGQgaGF2ZSB0aGUgU1NUIHJlY29yZCBoZWFkZXIsIHJlbWFpbmcgc2hvdWxkIGhhdmUgQ09OVElOVUUgaGVhZGVyCgkJCSRyZWNvcmQgPSAoJGkgPT0gMCkgPyAweDAwRkMgOiAweDAwM0M7CgoJCQkkaGVhZGVyID0gcGFjaygidnYiLCAkcmVjb3JkLCBzdHJsZW4oJHJlY29yZERhdGEpKTsKCQkJJGRhdGEgPSAkaGVhZGVyIC4gJHJlY29yZERhdGE7CgoJCQkkY2h1bmsgLj0gJHRoaXMtPndyaXRlRGF0YSgkZGF0YSk7CgkJfQoKCQlyZXR1cm4gJGNodW5rOwoJfQoKCS8qKgoJICogV3JpdGVzIHRoZSBNU09EUkFXSU5HR1JPVVAgcmVjb3JkIGlmIG5lZWRlZC4gUG9zc2libHkgc3BsaXQgdXNpbmcgQ09OVElOVUUgcmVjb3Jkcy4KCSAqLwoJcHJpdmF0ZSBmdW5jdGlvbiBfd3JpdGVNc29EcmF3aW5nR3JvdXAoKQoJewoJCS8vIHdyaXRlIHRoZSBFc2NoZXIgc3RyZWFtIGlmIG5lY2Vzc2FyeQoJCWlmIChpc3NldCgkdGhpcy0+X2VzY2hlcikpIHsKCQkJJHdyaXRlciA9IG5ldyBQSFBFeGNlbF9Xcml0ZXJfRXhjZWw1X0VzY2hlcigkdGhpcy0+X2VzY2hlcik7CgkJCSRkYXRhID0gJHdyaXRlci0+Y2xvc2UoKTsKCgkJCSRyZWNvcmQgPSAweDAwRUI7CgkJCSRsZW5ndGggPSBzdHJsZW4oJGRhdGEpOwoJCQkkaGVhZGVyID0gcGFjaygidnYiLCAgJHJlY29yZCwgJGxlbmd0aCk7CgoJCQlyZXR1cm4gJHRoaXMtPndyaXRlRGF0YSgkaGVhZGVyIC4gJGRhdGEpOwoKCQl9IGVsc2UgewoJCQlyZXR1cm4gJyc7CgkJfQoJfQoKCS8qKgoJICogR2V0IEVzY2hlciBvYmplY3QKCSAqCgkgKiBAcmV0dXJuIFBIUEV4Y2VsX1NoYXJlZF9Fc2NoZXIKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldEVzY2hlcigpCgl7CgkJcmV0dXJuICR0aGlzLT5fZXNjaGVyOwoJfQoKCS8qKgoJICogU2V0IEVzY2hlciBvYmplY3QKCSAqCgkgKiBAcGFyYW0gUEhQRXhjZWxfU2hhcmVkX0VzY2hlciAkcFZhbHVlCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBzZXRFc2NoZXIoUEhQRXhjZWxfU2hhcmVkX0VzY2hlciAkcFZhbHVlID0gbnVsbCkKCXsKCQkkdGhpcy0+X2VzY2hlciA9ICRwVmFsdWU7Cgl9Cgp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Writer/Excel5/Worksheet.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIFBIUEV4Y2VsCiAqCiAqIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICoKICogQGNhdGVnb3J5ICAgUEhQRXhjZWwKICogQHBhY2thZ2UgICAgUEhQRXhjZWxfV3JpdGVyX0V4Y2VsNQogKiBAY29weXJpZ2h0ICBDb3B5cmlnaHQgKGMpIDIwMDYgLSAyMDEyIFBIUEV4Y2VsIChodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9QSFBFeGNlbCkKICogQGxpY2Vuc2UgICAgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL29sZC1saWNlbnNlcy9sZ3BsLTIuMS50eHQJTEdQTAogKiBAdmVyc2lvbiAgICAxLjcuNywgMjAxMi0wNS0xOQogKi8KCi8vIE9yaWdpbmFsIGZpbGUgaGVhZGVyIG9mIFBFQVI6OlNwcmVhZHNoZWV0X0V4Y2VsX1dyaXRlcl9Xb3Jrc2hlZXQgKHVzZWQgYXMgdGhlIGJhc2UgZm9yIHRoaXMgY2xhc3MpOgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyAvKgovLyAqICBNb2R1bGUgd3JpdHRlbi9wb3J0ZWQgYnkgWGF2aWVyIE5vZ3VlciA8eG5vZ3VlckByZXplYnJhLmNvbT4KLy8gKgovLyAqICBUaGUgbWFqb3JpdHkgb2YgdGhpcyBpcyBfTk9UXyBteSBjb2RlLiAgSSBzaW1wbHkgcG9ydGVkIGl0IGZyb20gdGhlCi8vICogIFBFUkwgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgbW9kdWxlLgovLyAqCi8vICogIFRoZSBhdXRob3Igb2YgdGhlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIG1vZHVsZSBpcyBKb2huIE1jTmFtYXJhCi8vICogIDxqbWNuYW1hcmFAY3Bhbi5vcmc+Ci8vICoKLy8gKiAgSSBfRE9fIG1haW50YWluIHRoaXMgY29kZSwgYW5kIEpvaG4gTWNOYW1hcmEgaGFzIG5vdGhpbmcgdG8gZG8gd2l0aCB0aGUKLy8gKiAgcG9ydGluZyBvZiB0aGlzIGNvZGUgdG8gUEhQLiAgQW55IHF1ZXN0aW9ucyBkaXJlY3RseSByZWxhdGVkIHRvIHRoaXMKLy8gKiAgY2xhc3MgbGlicmFyeSBzaG91bGQgYmUgZGlyZWN0ZWQgdG8gbWUuCi8vICoKLy8gKiAgTGljZW5zZSBJbmZvcm1hdGlvbjoKLy8gKgovLyAqICAgIFNwcmVhZHNoZWV0X0V4Y2VsX1dyaXRlcjogIEEgbGlicmFyeSBmb3IgZ2VuZXJhdGluZyBFeGNlbCBTcHJlYWRzaGVldHMKLy8gKiAgICBDb3B5cmlnaHQgKGMpIDIwMDItMjAwMyBYYXZpZXIgTm9ndWVyIHhub2d1ZXJAcmV6ZWJyYS5jb20KLy8gKgovLyAqICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLy8gKiAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi8vICogICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi8vICogICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi8vICoKLy8gKiAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLy8gKiAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgovLyAqICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi8vICogICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLy8gKgovLyAqICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLy8gKiAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi8vICogICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQovLyAqLwoKCi8qKgogKiBQSFBFeGNlbF9Xcml0ZXJfRXhjZWw1X1dvcmtzaGVldAogKgogKiBAY2F0ZWdvcnkgICBQSFBFeGNlbAogKiBAcGFja2FnZSAgICBQSFBFeGNlbF9Xcml0ZXJfRXhjZWw1CiAqIEBjb3B5cmlnaHQgIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwgKGh0dHA6Ly93d3cuY29kZXBsZXguY29tL1BIUEV4Y2VsKQogKi8KY2xhc3MgUEhQRXhjZWxfV3JpdGVyX0V4Y2VsNV9Xb3Jrc2hlZXQgZXh0ZW5kcyBQSFBFeGNlbF9Xcml0ZXJfRXhjZWw1X0JJRkZ3cml0ZXIKewoJLyoqCgkgKiBGb3JtdWxhIHBhcnNlcgoJICoKCSAqIEB2YXIgUEhQRXhjZWxfV3JpdGVyX0V4Y2VsNV9QYXJzZXIKCSAqLwoJcHJpdmF0ZSAkX3BhcnNlcjsKCgkvKioKCSAqIE1heGltdW0gbnVtYmVyIG9mIGNoYXJhY3RlcnMgZm9yIGEgc3RyaW5nIChMQUJFTCByZWNvcmQgaW4gQklGRjUpCgkgKiBAdmFyIGludGVnZXIKCSAqLwoJcHVibGljICRfeGxzX3N0cm1heDsKCgkvKioKCSAqIEFycmF5IGNvbnRhaW5pbmcgZm9ybWF0IGluZm9ybWF0aW9uIGZvciBjb2x1bW5zCgkgKiBAdmFyIGFycmF5CgkgKi8KCXB1YmxpYyAkX2NvbGluZm87CgoJLyoqCgkgKiBBcnJheSBjb250YWluaW5nIHRoZSBzZWxlY3RlZCBhcmVhIGZvciB0aGUgd29ya3NoZWV0CgkgKiBAdmFyIGFycmF5CgkgKi8KCXB1YmxpYyAkX3NlbGVjdGlvbjsKCgkvKioKCSAqIFRoZSBhY3RpdmUgcGFuZSBmb3IgdGhlIHdvcmtzaGVldAoJICogQHZhciBpbnRlZ2VyCgkgKi8KCXB1YmxpYyAkX2FjdGl2ZV9wYW5lOwoKCS8qKgoJICogV2hldGhlciB0byB1c2Ugb3V0bGluZS4KCSAqIEB2YXIgaW50ZWdlcgoJICovCglwdWJsaWMgJF9vdXRsaW5lX29uOwoKCS8qKgoJICogQXV0byBvdXRsaW5lIHN0eWxlcy4KCSAqIEB2YXIgYm9vbAoJICovCglwdWJsaWMgJF9vdXRsaW5lX3N0eWxlOwoKCS8qKgoJICogV2hldGhlciB0byBoYXZlIG91dGxpbmUgc3VtbWFyeSBiZWxvdy4KCSAqIEB2YXIgYm9vbAoJICovCglwdWJsaWMgJF9vdXRsaW5lX2JlbG93OwoKCS8qKgoJICogV2hldGhlciB0byBoYXZlIG91dGxpbmUgc3VtbWFyeSBhdCB0aGUgcmlnaHQuCgkgKiBAdmFyIGJvb2wKCSAqLwoJcHVibGljICRfb3V0bGluZV9yaWdodDsKCgkvKioKCSAqIFJlZmVyZW5jZSB0byB0aGUgdG90YWwgbnVtYmVyIG9mIHN0cmluZ3MgaW4gdGhlIHdvcmtib29rCgkgKiBAdmFyIGludGVnZXIKCSAqLwoJcHVibGljICRfc3RyX3RvdGFsOwoKCS8qKgoJICogUmVmZXJlbmNlIHRvIHRoZSBudW1iZXIgb2YgdW5pcXVlIHN0cmluZ3MgaW4gdGhlIHdvcmtib29rCgkgKiBAdmFyIGludGVnZXIKCSAqLwoJcHVibGljICRfc3RyX3VuaXF1ZTsKCgkvKioKCSAqIFJlZmVyZW5jZSB0byB0aGUgYXJyYXkgY29udGFpbmluZyBhbGwgdGhlIHVuaXF1ZSBzdHJpbmdzIGluIHRoZSB3b3JrYm9vawoJICogQHZhciBhcnJheQoJICovCglwdWJsaWMgJF9zdHJfdGFibGU7CgoJLyoqCgkgKiBDb2xvciBjYWNoZQoJICovCglwcml2YXRlICRfY29sb3JzOwoKCS8qKgoJICogSW5kZXggb2YgZmlyc3QgdXNlZCByb3cgKGF0IGxlYXN0IDApCgkgKiBAdmFyIGludAoJICovCglwcml2YXRlICRfZmlyc3RSb3dJbmRleDsKCgkvKioKCSAqIEluZGV4IG9mIGxhc3QgdXNlZCByb3cuIChubyB1c2VkIHJvd3MgbWVhbnMgLTEpCgkgKiBAdmFyIGludAoJICovCglwcml2YXRlICRfbGFzdFJvd0luZGV4OwoKCS8qKgoJICogSW5kZXggb2YgZmlyc3QgdXNlZCBjb2x1bW4gKGF0IGxlYXN0IDApCgkgKiBAdmFyIGludAoJICovCglwcml2YXRlICRfZmlyc3RDb2x1bW5JbmRleDsKCgkvKioKCSAqIEluZGV4IG9mIGxhc3QgdXNlZCBjb2x1bW4gKG5vIHVzZWQgY29sdW1ucyBtZWFucyAtMSkKCSAqIEB2YXIgaW50CgkgKi8KCXByaXZhdGUgJF9sYXN0Q29sdW1uSW5kZXg7CgoJLyoqCgkgKiBTaGVldCBvYmplY3QKCSAqIEB2YXIgUEhQRXhjZWxfV29ya3NoZWV0CgkgKi8KCXB1YmxpYyAkX3BocFNoZWV0OwoKCS8qKgoJICogQ291bnQgY2VsbCBzdHlsZSBYZnMKCSAqCgkgKiBAdmFyIGludAoJICovCglwcml2YXRlICRfY291bnRDZWxsU3R5bGVYZnM7CgoJLyoqCgkgKiBFc2NoZXIgb2JqZWN0IGNvcnJlc3BvbmRpbmcgdG8gTVNPRFJBV0lORwoJICoKCSAqIEB2YXIgUEhQRXhjZWxfU2hhcmVkX0VzY2hlcgoJICovCglwcml2YXRlICRfZXNjaGVyOwoKCS8qKgoJICogQXJyYXkgb2YgZm9udCBoYXNoZXMgYXNzb2NpYXRlZCB0byBGT05UIHJlY29yZHMgaW5kZXgKCSAqCgkgKiBAdmFyIGFycmF5CgkgKi8KCXB1YmxpYyAkX2ZudEhhc2hJbmRleDsKCgkvKioKCSAqIENvbnN0cnVjdG9yCgkgKgoJICogQHBhcmFtIGludAkJJiRzdHJfdG90YWwJCVRvdGFsIG51bWJlciBvZiBzdHJpbmdzCgkgKiBAcGFyYW0gaW50CQkmJHN0cl91bmlxdWUJVG90YWwgbnVtYmVyIG9mIHVuaXF1ZSBzdHJpbmdzCgkgKiBAcGFyYW0gYXJyYXkJCSYkc3RyX3RhYmxlCQlTdHJpbmcgVGFibGUKCSAqIEBwYXJhbSBhcnJheQkJJiRjb2xvcnMJCUNvbG91ciBUYWJsZQoJICogQHBhcmFtIG1peGVkCQkkcGFyc2VyCQkJVGhlIGZvcm11bGEgcGFyc2VyIGNyZWF0ZWQgZm9yIHRoZSBXb3JrYm9vawoJICogQHBhcmFtIGJvb2xlYW4JJHByZUNhbGN1bGF0ZUZvcm11bGFzCUZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIGZvcm11bGFzIHNob3VsZCBiZSBjYWxjdWxhdGVkIG9yIGp1c3Qgd3JpdHRlbgoJICogQHBhcmFtIHN0cmluZwkkcGhwU2hlZXQJCVRoZSB3b3Jrc2hlZXQgdG8gd3JpdGUKCSAqIEBwYXJhbSBQSFBFeGNlbF9Xb3Jrc2hlZXQgJHBocFNoZWV0CgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgmJHN0cl90b3RhbCwgJiRzdHJfdW5pcXVlLCAmJHN0cl90YWJsZSwgJiRjb2xvcnMsCgkJCQkJCQkJJHBhcnNlciwgJHByZUNhbGN1bGF0ZUZvcm11bGFzLCAkcGhwU2hlZXQpCgl7CgkJLy8gSXQgbmVlZHMgdG8gY2FsbCBpdHMgcGFyZW50J3MgY29uc3RydWN0b3IgZXhwbGljaXRseQoJCXBhcmVudDo6X19jb25zdHJ1Y3QoKTsKCgkJLy8gY2hhbmdlIEJJRkZ3cml0ZXIgbGltaXQgZm9yIENPTlRJTlVFIHJlY29yZHMKLy8JCSR0aGlzLT5fbGltaXQgPSA4MjI0OwoKCgkJJHRoaXMtPl9wcmVDYWxjdWxhdGVGb3JtdWxhcyA9ICRwcmVDYWxjdWxhdGVGb3JtdWxhczsKCQkkdGhpcy0+X3N0cl90b3RhbAkJPSAmJHN0cl90b3RhbDsKCQkkdGhpcy0+X3N0cl91bmlxdWUJCT0gJiRzdHJfdW5pcXVlOwoJCSR0aGlzLT5fc3RyX3RhYmxlCQk9ICYkc3RyX3RhYmxlOwoJCSR0aGlzLT5fY29sb3JzCQkJPSAmJGNvbG9yczsKCQkkdGhpcy0+X3BhcnNlcgkJCT0gJHBhcnNlcjsKCgkJJHRoaXMtPl9waHBTaGVldCA9ICRwaHBTaGVldDsKCgkJLy8kdGhpcy0+ZXh0X3NoZWV0cwkJPSBhcnJheSgpOwoJCS8vJHRoaXMtPm9mZnNldAkJCT0gMDsKCQkkdGhpcy0+X3hsc19zdHJtYXgJCT0gMjU1OwoJCSR0aGlzLT5fY29saW5mbwkJCT0gYXJyYXkoKTsKCQkkdGhpcy0+X3NlbGVjdGlvbgkJPSBhcnJheSgwLDAsMCwwKTsKCQkkdGhpcy0+X2FjdGl2ZV9wYW5lCQk9IDM7CgoJCSR0aGlzLT5fcHJpbnRfaGVhZGVycwkJPSAwOwoKCQkkdGhpcy0+X291dGxpbmVfc3R5bGUJCT0gMDsKCQkkdGhpcy0+X291dGxpbmVfYmVsb3cJCT0gMTsKCQkkdGhpcy0+X291dGxpbmVfcmlnaHQJCT0gMTsKCQkkdGhpcy0+X291dGxpbmVfb24JCQk9IDE7CgoJCSR0aGlzLT5fZm50SGFzaEluZGV4CT0gYXJyYXkoKTsKCgkJLy8gY2FsY3VsYXRlIHZhbHVlcyBmb3IgRElNRU5TSU9OUyByZWNvcmQKCQkkbWluUiA9IDE7CgkJJG1pbkMgPSAnQSc7CgoJCSRtYXhSICA9ICR0aGlzLT5fcGhwU2hlZXQtPmdldEhpZ2hlc3RSb3coKTsKCQkkbWF4QyA9ICR0aGlzLT5fcGhwU2hlZXQtPmdldEhpZ2hlc3RDb2x1bW4oKTsKCgkJLy8gRGV0ZXJtaW5lIGxvd2VzdCBhbmQgaGlnaGVzdCBjb2x1bW4gYW5kIHJvdwovLwkJJHRoaXMtPl9maXJzdFJvd0luZGV4ID0gKCRtaW5SID4gNjU1MzUpID8gNjU1MzUgOiAkbWluUjsKCQkkdGhpcy0+X2xhc3RSb3dJbmRleCA9ICgkbWF4UiA+IDY1NTM1KSA/IDY1NTM1IDogJG1heFIgOwoKCQkkdGhpcy0+X2ZpcnN0Q29sdW1uSW5kZXgJPSBQSFBFeGNlbF9DZWxsOjpjb2x1bW5JbmRleEZyb21TdHJpbmcoJG1pbkMpOwoJCSR0aGlzLT5fbGFzdENvbHVtbkluZGV4CQk9IFBIUEV4Y2VsX0NlbGw6OmNvbHVtbkluZGV4RnJvbVN0cmluZygkbWF4Qyk7CgovLwkJaWYgKCR0aGlzLT5fZmlyc3RDb2x1bW5JbmRleCA+IDI1NSkgJHRoaXMtPl9maXJzdENvbHVtbkluZGV4ID0gMjU1OwoJCWlmICgkdGhpcy0+X2xhc3RDb2x1bW5JbmRleCA+IDI1NSkgJHRoaXMtPl9sYXN0Q29sdW1uSW5kZXggPSAyNTU7CgoJCSR0aGlzLT5fY291bnRDZWxsU3R5bGVYZnMgPSBjb3VudCgkcGhwU2hlZXQtPmdldFBhcmVudCgpLT5nZXRDZWxsU3R5bGVYZkNvbGxlY3Rpb24oKSk7Cgl9CgoJLyoqCgkgKiBBZGQgZGF0YSB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSB3b3JrYm9vayAobm90ZSB0aGUgcmV2ZXJzZSBvcmRlcikKCSAqIGFuZCB0byB0aGUgZW5kIG9mIHRoZSB3b3JrYm9vay4KCSAqCgkgKiBAYWNjZXNzIHB1YmxpYwoJICogQHNlZSBQSFBFeGNlbF9Xcml0ZXJfRXhjZWw1X1dvcmtib29rOjpzdG9yZVdvcmtib29rKCkKCSAqLwoJZnVuY3Rpb24gY2xvc2UoKQoJewoJCSRfcGhwU2hlZXQgPSAkdGhpcy0+X3BocFNoZWV0OwoKCQkkbnVtX3NoZWV0cyA9ICRfcGhwU2hlZXQtPmdldFBhcmVudCgpLT5nZXRTaGVldENvdW50KCk7CgoJCS8vIFdyaXRlIEJPRiByZWNvcmQKCQkkdGhpcy0+X3N0b3JlQm9mKDB4MDAxMCk7CgoJCS8vIFdyaXRlIFBSSU5USEVBREVSUwoJCSR0aGlzLT5fd3JpdGVQcmludEhlYWRlcnMoKTsKCgkJLy8gV3JpdGUgUFJJTlRHUklETElORVMKCQkkdGhpcy0+X3dyaXRlUHJpbnRHcmlkbGluZXMoKTsKCgkJLy8gV3JpdGUgR1JJRFNFVAoJCSR0aGlzLT5fd3JpdGVHcmlkc2V0KCk7CgoJCS8vIENhbGN1bGF0ZSBjb2x1bW4gd2lkdGhzCgkJJF9waHBTaGVldC0+Y2FsY3VsYXRlQ29sdW1uV2lkdGhzKCk7CgoJCS8vIENvbHVtbiBkaW1lbnNpb25zCgkJaWYgKCgkZGVmYXVsdFdpZHRoID0gJF9waHBTaGVldC0+Z2V0RGVmYXVsdENvbHVtbkRpbWVuc2lvbigpLT5nZXRXaWR0aCgpKSA8IDApIHsKCQkJJGRlZmF1bHRXaWR0aCA9IFBIUEV4Y2VsX1NoYXJlZF9Gb250OjpnZXREZWZhdWx0Q29sdW1uV2lkdGhCeUZvbnQoJF9waHBTaGVldC0+Z2V0UGFyZW50KCktPmdldERlZmF1bHRTdHlsZSgpLT5nZXRGb250KCkpOwoJCX0KCgkJJGNvbHVtbkRpbWVuc2lvbnMgPSAkX3BocFNoZWV0LT5nZXRDb2x1bW5EaW1lbnNpb25zKCk7CgkJJG1heENvbCA9ICR0aGlzLT5fbGFzdENvbHVtbkluZGV4IC0xOwoJCWZvciAoJGkgPSAwOyAkaSA8PSAkbWF4Q29sOyArKyRpKSB7CgkJCSRoaWRkZW4gPSAwOwoJCQkkbGV2ZWwgPSAwOwoJCQkkeGZJbmRleCA9IDE1OyAvLyB0aGVyZSBhcmUgMTUgY2VsbCBzdHlsZSBYZnMKCgkJCSR3aWR0aCA9ICRkZWZhdWx0V2lkdGg7CgoJCQkkY29sdW1uTGV0dGVyID0gUEhQRXhjZWxfQ2VsbDo6c3RyaW5nRnJvbUNvbHVtbkluZGV4KCRpKTsKCQkJaWYgKGlzc2V0KCRjb2x1bW5EaW1lbnNpb25zWyRjb2x1bW5MZXR0ZXJdKSkgewoJCQkJJGNvbHVtbkRpbWVuc2lvbiA9ICRjb2x1bW5EaW1lbnNpb25zWyRjb2x1bW5MZXR0ZXJdOwoJCQkJaWYgKCRjb2x1bW5EaW1lbnNpb24tPmdldFdpZHRoKCkgPj0gMCkgewoJCQkJCSR3aWR0aCA9ICRjb2x1bW5EaW1lbnNpb24tPmdldFdpZHRoKCk7CgkJCQl9CgkJCQkkaGlkZGVuID0gJGNvbHVtbkRpbWVuc2lvbi0+Z2V0VmlzaWJsZSgpID8gMCA6IDE7CgkJCQkkbGV2ZWwgPSAkY29sdW1uRGltZW5zaW9uLT5nZXRPdXRsaW5lTGV2ZWwoKTsKCQkJCSR4ZkluZGV4ID0gJGNvbHVtbkRpbWVuc2lvbi0+Z2V0WGZJbmRleCgpICsgMTU7IC8vIHRoZXJlIGFyZSAxNSBjZWxsIHN0eWxlIFhmcwoJCQl9CgoJCQkvLyBDb21wb25lbnRzIG9mIF9jb2xpbmZvOgoJCQkvLyAkZmlyc3Rjb2wgZmlyc3QgY29sdW1uIG9uIHRoZSByYW5nZQoJCQkvLyAkbGFzdGNvbCAgbGFzdCBjb2x1bW4gb24gdGhlIHJhbmdlCgkJCS8vICR3aWR0aAl3aWR0aCB0byBzZXQKCQkJLy8gJHhmSW5kZXggIFRoZSBvcHRpb25hbCBjZWxsIHN0eWxlIFhmIGluZGV4IHRvIGFwcGx5IHRvIHRoZSBjb2x1bW5zCgkJCS8vICRoaWRkZW4gICBUaGUgb3B0aW9uYWwgaGlkZGVuIGF0cmlidXRlCgkJCS8vICRsZXZlbAlUaGUgb3B0aW9uYWwgb3V0bGluZSBsZXZlbAoJCQkkdGhpcy0+X2NvbGluZm9bXSA9IGFycmF5KCRpLCAkaSwgJHdpZHRoLCAkeGZJbmRleCwgJGhpZGRlbiwgJGxldmVsKTsKCQl9CgoJCS8vIFdyaXRlIEdVVFMKCQkkdGhpcy0+X3dyaXRlR3V0cygpOwoKCQkvLyBXcml0ZSBERUZBVUxUUk9XSEVJR0hUCgkJJHRoaXMtPl93cml0ZURlZmF1bHRSb3dIZWlnaHQoKTsKCgkJLy8gV3JpdGUgV1NCT09MCgkJJHRoaXMtPl93cml0ZVdzYm9vbCgpOwoKCQkvLyBXcml0ZSBob3Jpem9udGFsIGFuZCB2ZXJ0aWNhbCBwYWdlIGJyZWFrcwoJCSR0aGlzLT5fd3JpdGVCcmVha3MoKTsKCgkJLy8gV3JpdGUgcGFnZSBoZWFkZXIKCQkkdGhpcy0+X3dyaXRlSGVhZGVyKCk7CgoJCS8vIFdyaXRlIHBhZ2UgZm9vdGVyCgkJJHRoaXMtPl93cml0ZUZvb3RlcigpOwoKCQkvLyBXcml0ZSBwYWdlIGhvcml6b250YWwgY2VudGVyaW5nCgkJJHRoaXMtPl93cml0ZUhjZW50ZXIoKTsKCgkJLy8gV3JpdGUgcGFnZSB2ZXJ0aWNhbCBjZW50ZXJpbmcKCQkkdGhpcy0+X3dyaXRlVmNlbnRlcigpOwoKCQkvLyBXcml0ZSBsZWZ0IG1hcmdpbgoJCSR0aGlzLT5fd3JpdGVNYXJnaW5MZWZ0KCk7CgoJCS8vIFdyaXRlIHJpZ2h0IG1hcmdpbgoJCSR0aGlzLT5fd3JpdGVNYXJnaW5SaWdodCgpOwoKCQkvLyBXcml0ZSB0b3AgbWFyZ2luCgkJJHRoaXMtPl93cml0ZU1hcmdpblRvcCgpOwoKCQkvLyBXcml0ZSBib3R0b20gbWFyZ2luCgkJJHRoaXMtPl93cml0ZU1hcmdpbkJvdHRvbSgpOwoKCQkvLyBXcml0ZSBwYWdlIHNldHVwCgkJJHRoaXMtPl93cml0ZVNldHVwKCk7CgoJCS8vIFdyaXRlIHNoZWV0IHByb3RlY3Rpb24KCQkkdGhpcy0+X3dyaXRlUHJvdGVjdCgpOwoKCQkvLyBXcml0ZSBTQ0VOUFJPVEVDVAoJCSR0aGlzLT5fd3JpdGVTY2VuUHJvdGVjdCgpOwoKCQkvLyBXcml0ZSBPQkpFQ1RQUk9URUNUCgkJJHRoaXMtPl93cml0ZU9iamVjdFByb3RlY3QoKTsKCgkJLy8gV3JpdGUgc2hlZXQgcGFzc3dvcmQKCQkkdGhpcy0+X3dyaXRlUGFzc3dvcmQoKTsKCgkJLy8gV3JpdGUgREVGQ09MV0lEVEggcmVjb3JkCgkJJHRoaXMtPl93cml0ZURlZmNvbCgpOwoKCQkvLyBXcml0ZSB0aGUgQ09MSU5GTyByZWNvcmRzIGlmIHRoZXkgZXhpc3QKCQlpZiAoIWVtcHR5KCR0aGlzLT5fY29saW5mbykpIHsKCQkJJGNvbGNvdW50ID0gY291bnQoJHRoaXMtPl9jb2xpbmZvKTsKCQkJZm9yICgkaSA9IDA7ICRpIDwgJGNvbGNvdW50OyArKyRpKSB7CgkJCQkkdGhpcy0+X3dyaXRlQ29saW5mbygkdGhpcy0+X2NvbGluZm9bJGldKTsKCQkJfQoJCX0KCgkJLy8gV3JpdGUgc2hlZXQgZGltZW5zaW9ucwoJCSR0aGlzLT5fd3JpdGVEaW1lbnNpb25zKCk7CgoJCS8vIFJvdyBkaW1lbnNpb25zCgkJZm9yZWFjaCAoJF9waHBTaGVldC0+Z2V0Um93RGltZW5zaW9ucygpIGFzICRyb3dEaW1lbnNpb24pIHsKCQkJJHhmSW5kZXggPSAkcm93RGltZW5zaW9uLT5nZXRYZkluZGV4KCkgKyAxNTsgLy8gdGhlcmUgYXJlIDE1IGNlbGxYZnMKCQkJJHRoaXMtPl93cml0ZVJvdyggJHJvd0RpbWVuc2lvbi0+Z2V0Um93SW5kZXgoKSAtIDEsICRyb3dEaW1lbnNpb24tPmdldFJvd0hlaWdodCgpLCAkeGZJbmRleCwgKCRyb3dEaW1lbnNpb24tPmdldFZpc2libGUoKSA/ICcwJyA6ICcxJyksICRyb3dEaW1lbnNpb24tPmdldE91dGxpbmVMZXZlbCgpICk7CgkJfQoKCQkvLyBXcml0ZSBDZWxscwoJCWZvcmVhY2ggKCRfcGhwU2hlZXQtPmdldENlbGxDb2xsZWN0aW9uKCkgYXMgJGNlbGxJRCkgewoJCQkkY2VsbCA9ICRfcGhwU2hlZXQtPmdldENlbGwoJGNlbGxJRCk7CgkJCSRyb3cgPSAkY2VsbC0+Z2V0Um93KCkgLSAxOwoJCQkkY29sdW1uID0gUEhQRXhjZWxfQ2VsbDo6Y29sdW1uSW5kZXhGcm9tU3RyaW5nKCRjZWxsLT5nZXRDb2x1bW4oKSkgLSAxOwoKCQkJLy8gRG9uJ3QgYnJlYWsgRXhjZWwhCi8vCQkJaWYgKCRyb3cgKyAxID4gNjU1MzYgb3IgJGNvbHVtbiArIDEgPiAyNTYpIHsKCQkJaWYgKCRyb3cgPiA2NTUzNSB8fCAkY29sdW1uID4gMjU1KSB7CgkJCQlicmVhazsKCQkJfQoKCQkJLy8gV3JpdGUgY2VsbCB2YWx1ZQoJCQkkeGZJbmRleCA9ICRjZWxsLT5nZXRYZkluZGV4KCkgKyAxNTsgLy8gdGhlcmUgYXJlIDE1IGNlbGwgc3R5bGUgWGZzCgoJCQkkY1ZhbCA9ICRjZWxsLT5nZXRWYWx1ZSgpOwoJCQlpZiAoJGNWYWwgaW5zdGFuY2VvZiBQSFBFeGNlbF9SaWNoVGV4dCkgewoJCQkJLy8gJHRoaXMtPl93cml0ZVN0cmluZygkcm93LCAkY29sdW1uLCAkY1ZhbC0+Z2V0UGxhaW5UZXh0KCksICR4ZkluZGV4KTsKCQkJCSRhcnJjUnVuID0gYXJyYXkoKTsKCQkJCSRzdHJfbGVuID0gc3RybGVuKCRjVmFsLT5nZXRQbGFpblRleHQoKSk7CgkJCQkkc3RyX3BvcyA9IDA7CgkJCQkkZWxlbWVudHMgPSAkY1ZhbC0+Z2V0UmljaFRleHRFbGVtZW50cygpOwoJCQkJZm9yZWFjaCAoJGVsZW1lbnRzIGFzICRlbGVtZW50KSB7CgkJCQkJLy8gRk9OVCBJbmRleAoJCQkJCWlmICgkZWxlbWVudCBpbnN0YW5jZW9mIFBIUEV4Y2VsX1JpY2hUZXh0X1J1bikgewoJCQkJCQkkc3RyX2ZvbnRpZHggPSAkdGhpcy0+X2ZudEhhc2hJbmRleFskZWxlbWVudC0+Z2V0Rm9udCgpLT5nZXRIYXNoQ29kZSgpXTsKCQkJCQl9CgkJCQkJZWxzZSB7CgkJCQkJCSRzdHJfZm9udGlkeCA9IDA7CgkJCQkJfQoJCQkJCSRhcnJjUnVuW10gPSBhcnJheSgnc3RybGVuJyA9PiAkc3RyX3BvcywgJ2ZvbnRpZHgnID0+ICRzdHJfZm9udGlkeCk7CgkJCQkJLy8gUG9zaXRpb24gRlJPTQoJCQkJCSRzdHJfcG9zICs9IHN0cmxlbigkZWxlbWVudC0+Z2V0VGV4dCgpKTsKCQkJCX0KCQkJCSR0aGlzLT5fd3JpdGVSaWNoVGV4dFN0cmluZygkcm93LCAkY29sdW1uLCAkY1ZhbC0+Z2V0UGxhaW5UZXh0KCksICR4ZkluZGV4LCAkYXJyY1J1bik7CgkJCX0gZWxzZSB7CgkJCQlzd2l0Y2ggKCRjZWxsLT5nZXREYXRhdHlwZSgpKSB7CgkJCQkJY2FzZSBQSFBFeGNlbF9DZWxsX0RhdGFUeXBlOjpUWVBFX1NUUklORzoKCQkJCQljYXNlIFBIUEV4Y2VsX0NlbGxfRGF0YVR5cGU6OlRZUEVfTlVMTDoKCQkJCQkJaWYgKCRjVmFsID09PSAnJyB8fCAkY1ZhbCA9PT0gbnVsbCkgewoJCQkJCQkJJHRoaXMtPl93cml0ZUJsYW5rKCRyb3csICRjb2x1bW4sICR4ZkluZGV4KTsKCQkJCQkJfSBlbHNlIHsKCQkJCQkJCSR0aGlzLT5fd3JpdGVTdHJpbmcoJHJvdywgJGNvbHVtbiwgJGNWYWwsICR4ZkluZGV4KTsKCQkJCQkJfQoJCQkJCQlicmVhazsKCgkJCQkJY2FzZSBQSFBFeGNlbF9DZWxsX0RhdGFUeXBlOjpUWVBFX05VTUVSSUM6CgkJCQkJCSR0aGlzLT5fd3JpdGVOdW1iZXIoJHJvdywgJGNvbHVtbiwgJGNWYWwsICR4ZkluZGV4KTsKCQkJCQkJYnJlYWs7CgoJCQkJCWNhc2UgUEhQRXhjZWxfQ2VsbF9EYXRhVHlwZTo6VFlQRV9GT1JNVUxBOgoJCQkJCQkkY2FsY3VsYXRlZFZhbHVlID0gJHRoaXMtPl9wcmVDYWxjdWxhdGVGb3JtdWxhcyA/CgkJCQkJCQkkY2VsbC0+Z2V0Q2FsY3VsYXRlZFZhbHVlKCkgOiBudWxsOwoJCQkJCQkkdGhpcy0+X3dyaXRlRm9ybXVsYSgkcm93LCAkY29sdW1uLCAkY1ZhbCwgJHhmSW5kZXgsICRjYWxjdWxhdGVkVmFsdWUpOwoJCQkJCQlicmVhazsKCgkJCQkJY2FzZSBQSFBFeGNlbF9DZWxsX0RhdGFUeXBlOjpUWVBFX0JPT0w6CgkJCQkJCSR0aGlzLT5fd3JpdGVCb29sRXJyKCRyb3csICRjb2x1bW4sICRjVmFsLCAwLCAkeGZJbmRleCk7CgkJCQkJCWJyZWFrOwoKCQkJCQljYXNlIFBIUEV4Y2VsX0NlbGxfRGF0YVR5cGU6OlRZUEVfRVJST1I6CgkJCQkJCSR0aGlzLT5fd3JpdGVCb29sRXJyKCRyb3csICRjb2x1bW4sIHNlbGY6Ol9tYXBFcnJvckNvZGUoJGNWYWwpLCAxLCAkeGZJbmRleCk7CgkJCQkJCWJyZWFrOwoKCQkJCX0KCQkJfQoJCX0KCgkJLy8gQXBwZW5kCgkJJHRoaXMtPl93cml0ZU1zb0RyYXdpbmcoKTsKCgkJJHRoaXMtPl93cml0ZVdpbmRvdzIoKTsKCQkkdGhpcy0+X3dyaXRlWm9vbSgpOwoJCWlmICgkX3BocFNoZWV0LT5nZXRGcmVlemVQYW5lKCkpIHsKCQkJJHRoaXMtPl93cml0ZVBhbmVzKCk7CgkJfQoJCSR0aGlzLT5fd3JpdGVTZWxlY3Rpb24oKTsKCQkkdGhpcy0+X3dyaXRlTWVyZ2VkQ2VsbHMoKTsKCgkJLy8gSHlwZXJsaW5rcwoJCWZvcmVhY2ggKCRfcGhwU2hlZXQtPmdldEh5cGVyTGlua0NvbGxlY3Rpb24oKSBhcyAkY29vcmRpbmF0ZSA9PiAkaHlwZXJsaW5rKSB7CgkJCWxpc3QoJGNvbHVtbiwgJHJvdykgPSBQSFBFeGNlbF9DZWxsOjpjb29yZGluYXRlRnJvbVN0cmluZygkY29vcmRpbmF0ZSk7CgoJCQkkdXJsID0gJGh5cGVybGluay0+Z2V0VXJsKCk7CgoJCQlpZiAoIHN0cnBvcygkdXJsLCAnc2hlZXQ6Ly8nKSAhPT0gZmFsc2UgKSB7CgkJCQkvLyBpbnRlcm5hbCB0byBjdXJyZW50IHdvcmtib29rCgkJCQkkdXJsID0gc3RyX3JlcGxhY2UoJ3NoZWV0Oi8vJywgJ2ludGVybmFsOicsICR1cmwpOwoKCQkJfSBlbHNlIGlmICggcHJlZ19tYXRjaCgnL14oaHR0cDp8aHR0cHM6fGZ0cDp8bWFpbHRvOikvJywgJHVybCkgKSB7CgkJCQkvLyBVUkwKCQkJCS8vICR1cmwgPSAkdXJsOwoKCQkJfSBlbHNlIHsKCQkJCS8vIGV4dGVybmFsIChsb2NhbCBmaWxlKQoJCQkJJHVybCA9ICdleHRlcm5hbDonIC4gJHVybDsKCQkJfQoKCQkJJHRoaXMtPl93cml0ZVVybCgkcm93IC0gMSwgUEhQRXhjZWxfQ2VsbDo6Y29sdW1uSW5kZXhGcm9tU3RyaW5nKCRjb2x1bW4pIC0gMSwgJHVybCk7CgkJfQoKCQkkdGhpcy0+X3dyaXRlRGF0YVZhbGlkaXR5KCk7CgkJJHRoaXMtPl93cml0ZVNoZWV0TGF5b3V0KCk7CgkJJHRoaXMtPl93cml0ZVNoZWV0UHJvdGVjdGlvbigpOwoJCSR0aGlzLT5fd3JpdGVSYW5nZVByb3RlY3Rpb24oKTsKCgkJJHRoaXMtPl9zdG9yZUVvZigpOwoJfQoKCS8qKgoJICogV3JpdGUgYSBjZWxsIHJhbmdlIGFkZHJlc3MgaW4gQklGRjgKCSAqIGFsd2F5cyBmaXhlZCByYW5nZQoJICogU2VlIHNlY3Rpb24gMi41LjE0IGluIE9wZW5PZmZpY2Uub3JnJ3MgRG9jdW1lbnRhdGlvbiBvZiB0aGUgTWljcm9zb2Z0IEV4Y2VsIEZpbGUgRm9ybWF0CgkgKgoJICogQHBhcmFtIHN0cmluZyAkcmFuZ2UgRS5nLiAnQTEnIG9yICdBMTpCNicKCSAqIEByZXR1cm4gc3RyaW5nIEJpbmFyeSBkYXRhCgkgKi8KCXByaXZhdGUgZnVuY3Rpb24gX3dyaXRlQklGRjhDZWxsUmFuZ2VBZGRyZXNzRml4ZWQoJHJhbmdlID0gJ0ExJykKCXsKCQkkZXhwbG9kZXMgPSBleHBsb2RlKCc6JywgJHJhbmdlKTsKCgkJLy8gZXh0cmFjdCBmaXJzdCBjZWxsLCBlLmcuICdBMScKCQkkZmlyc3RDZWxsID0gJGV4cGxvZGVzWzBdOwoKCQkvLyBleHRyYWN0IGxhc3QgY2VsbCwgZS5nLiAnQjYnCgkJaWYgKGNvdW50KCRleHBsb2RlcykgPT0gMSkgewoJCQkkbGFzdENlbGwgPSAkZmlyc3RDZWxsOwoJCX0gZWxzZSB7CgkJCSRsYXN0Q2VsbCA9ICRleHBsb2Rlc1sxXTsKCQl9CgoJCSRmaXJzdENlbGxDb29yZGluYXRlcyA9IFBIUEV4Y2VsX0NlbGw6OmNvb3JkaW5hdGVGcm9tU3RyaW5nKCRmaXJzdENlbGwpOyAvLyBlLmcuIGFycmF5KDAsIDEpCgkJJGxhc3RDZWxsQ29vcmRpbmF0ZXMgID0gUEhQRXhjZWxfQ2VsbDo6Y29vcmRpbmF0ZUZyb21TdHJpbmcoJGxhc3RDZWxsKTsgIC8vIGUuZy4gYXJyYXkoMSwgNikKCgkJcmV0dXJuKHBhY2soJ3Z2dnYnLAoJCQkkZmlyc3RDZWxsQ29vcmRpbmF0ZXNbMV0gLSAxLAoJCQkkbGFzdENlbGxDb29yZGluYXRlc1sxXSAtIDEsCgkJCVBIUEV4Y2VsX0NlbGw6OmNvbHVtbkluZGV4RnJvbVN0cmluZygkZmlyc3RDZWxsQ29vcmRpbmF0ZXNbMF0pIC0gMSwKCQkJUEhQRXhjZWxfQ2VsbDo6Y29sdW1uSW5kZXhGcm9tU3RyaW5nKCRsYXN0Q2VsbENvb3JkaW5hdGVzWzBdKSAtIDEKCQkpKTsKCX0KCgkvKioKCSAqIFJldHJpZXZlcyBkYXRhIGZyb20gbWVtb3J5IGluIG9uZSBjaHVuaywgb3IgZnJvbSBkaXNrIGluICRidWZmZXIKCSAqIHNpemVkIGNodW5rcy4KCSAqCgkgKiBAcmV0dXJuIHN0cmluZyBUaGUgZGF0YQoJICovCglmdW5jdGlvbiBnZXREYXRhKCkKCXsKCQkkYnVmZmVyID0gNDA5NjsKCgkJLy8gUmV0dXJuIGRhdGEgc3RvcmVkIGluIG1lbW9yeQoJCWlmIChpc3NldCgkdGhpcy0+X2RhdGEpKSB7CgkJCSR0bXAgICA9ICR0aGlzLT5fZGF0YTsKCQkJdW5zZXQoJHRoaXMtPl9kYXRhKTsKCQkJcmV0dXJuICR0bXA7CgkJfQoJCS8vIE5vIGRhdGEgdG8gcmV0dXJuCgkJcmV0dXJuIGZhbHNlOwoJfQoKCS8qKgoJICogU2V0IHRoZSBvcHRpb24gdG8gcHJpbnQgdGhlIHJvdyBhbmQgY29sdW1uIGhlYWRlcnMgb24gdGhlIHByaW50ZWQgcGFnZS4KCSAqCgkgKiBAYWNjZXNzIHB1YmxpYwoJICogQHBhcmFtIGludGVnZXIgJHByaW50IFdoZXRoZXIgdG8gcHJpbnQgdGhlIGhlYWRlcnMgb3Igbm90LiBEZWZhdWx0cyB0byAxIChwcmludCkuCgkgKi8KCWZ1bmN0aW9uIHByaW50Um93Q29sSGVhZGVycygkcHJpbnQgPSAxKQoJewoJCSR0aGlzLT5fcHJpbnRfaGVhZGVycyA9ICRwcmludDsKCX0KCgkvKioKCSAqIFRoaXMgbWV0aG9kIHNldHMgdGhlIHByb3BlcnRpZXMgZm9yIG91dGxpbmluZyBhbmQgZ3JvdXBpbmcuIFRoZSBkZWZhdWx0cwoJICogY29ycmVzcG9uZCB0byBFeGNlbCdzIGRlZmF1bHRzLgoJICoKCSAqIEBwYXJhbSBib29sICR2aXNpYmxlCgkgKiBAcGFyYW0gYm9vbCAkc3ltYm9sc19iZWxvdwoJICogQHBhcmFtIGJvb2wgJHN5bWJvbHNfcmlnaHQKCSAqIEBwYXJhbSBib29sICRhdXRvX3N0eWxlCgkgKi8KCWZ1bmN0aW9uIHNldE91dGxpbmUoJHZpc2libGUgPSB0cnVlLCAkc3ltYm9sc19iZWxvdyA9IHRydWUsICRzeW1ib2xzX3JpZ2h0ID0gdHJ1ZSwgJGF1dG9fc3R5bGUgPSBmYWxzZSkKCXsKCQkkdGhpcy0+X291dGxpbmVfb24JPSAkdmlzaWJsZTsKCQkkdGhpcy0+X291dGxpbmVfYmVsb3cgPSAkc3ltYm9sc19iZWxvdzsKCQkkdGhpcy0+X291dGxpbmVfcmlnaHQgPSAkc3ltYm9sc19yaWdodDsKCQkkdGhpcy0+X291dGxpbmVfc3R5bGUgPSAkYXV0b19zdHlsZTsKCgkJLy8gRW5zdXJlIHRoaXMgaXMgYSBib29sZWFuIHZhbGUgZm9yIFdpbmRvdzIKCQlpZiAoJHRoaXMtPl9vdXRsaW5lX29uKSB7CgkJCSR0aGlzLT5fb3V0bGluZV9vbiA9IDE7CgkJfQoJIH0KCgkvKioKCSAqIFdyaXRlIGEgZG91YmxlIHRvIHRoZSBzcGVjaWZpZWQgcm93IGFuZCBjb2x1bW4gKHplcm8gaW5kZXhlZCkuCgkgKiBBbiBpbnRlZ2VyIGNhbiBiZSB3cml0dGVuIGFzIGEgZG91YmxlLiBFeGNlbCB3aWxsIGRpc3BsYXkgYW4KCSAqIGludGVnZXIuICRmb3JtYXQgaXMgb3B0aW9uYWwuCgkgKgoJICogUmV0dXJucyAgMCA6IG5vcm1hbCB0ZXJtaW5hdGlvbgoJICoJCSAtMiA6IHJvdyBvciBjb2x1bW4gb3V0IG9mIHJhbmdlCgkgKgoJICogQHBhcmFtIGludGVnZXIgJHJvdwlaZXJvIGluZGV4ZWQgcm93CgkgKiBAcGFyYW0gaW50ZWdlciAkY29sCVplcm8gaW5kZXhlZCBjb2x1bW4KCSAqIEBwYXJhbSBmbG9hdCAgICRudW0JVGhlIG51bWJlciB0byB3cml0ZQoJICogQHBhcmFtIG1peGVkICAgJHhmSW5kZXggVGhlIG9wdGlvbmFsIFhGIGZvcm1hdAoJICogQHJldHVybiBpbnRlZ2VyCgkgKi8KCXByaXZhdGUgZnVuY3Rpb24gX3dyaXRlTnVtYmVyKCRyb3csICRjb2wsICRudW0sICR4ZkluZGV4KQoJewoJCSRyZWNvcmQJPSAweDAyMDM7CQkJCSAvLyBSZWNvcmQgaWRlbnRpZmllcgoJCSRsZW5ndGgJPSAweDAwMEU7CQkJCSAvLyBOdW1iZXIgb2YgYnl0ZXMgdG8gZm9sbG93CgoJCSRoZWFkZXIJCT0gcGFjaygidnYiLCAgJHJlY29yZCwgJGxlbmd0aCk7CgkJJGRhdGEJCT0gcGFjaygidnZ2IiwgJHJvdywgJGNvbCwgJHhmSW5kZXgpOwoJCSR4bF9kb3VibGUJPSBwYWNrKCJkIiwgICAkbnVtKTsKCQlpZiAoc2VsZjo6Z2V0Qnl0ZU9yZGVyKCkpIHsgLy8gaWYgaXQncyBCaWcgRW5kaWFuCgkJCSR4bF9kb3VibGUgPSBzdHJyZXYoJHhsX2RvdWJsZSk7CgkJfQoKCQkkdGhpcy0+X2FwcGVuZCgkaGVhZGVyLiRkYXRhLiR4bF9kb3VibGUpOwoJCXJldHVybigwKTsKCX0KCgkvKioKCSAqIFdyaXRlIGEgTEFCRUxTU1QgcmVjb3JkIG9yIGEgTEFCRUwgcmVjb3JkLiBXaGljaCBvbmUgZGVwZW5kcyBvbiBCSUZGIHZlcnNpb24KCSAqCgkgKiBAcGFyYW0gaW50ICRyb3cgUm93IGluZGV4ICgwLWJhc2VkKQoJICogQHBhcmFtIGludCAkY29sIENvbHVtbiBpbmRleCAoMC1iYXNlZCkKCSAqIEBwYXJhbSBzdHJpbmcgJHN0ciBUaGUgc3RyaW5nCgkgKiBAcGFyYW0gaW50ICR4ZkluZGV4IEluZGV4IHRvIFhGIHJlY29yZAoJICovCglwcml2YXRlIGZ1bmN0aW9uIF93cml0ZVN0cmluZygkcm93LCAkY29sLCAkc3RyLCAkeGZJbmRleCkKCXsKCQkkdGhpcy0+X3dyaXRlTGFiZWxTc3QoJHJvdywgJGNvbCwgJHN0ciwgJHhmSW5kZXgpOwoJfQoJLyoqCgkgKiBXcml0ZSBhIExBQkVMU1NUIHJlY29yZCBvciBhIExBQkVMIHJlY29yZC4gV2hpY2ggb25lIGRlcGVuZHMgb24gQklGRiB2ZXJzaW9uCgkgKiBJdCBkaWZmZXJzIGZyb20gX3dyaXRlU3RyaW5nIGJ5IHRoZSB3cml0aW5nIG9mIHJpY2ggdGV4dCBzdHJpbmdzLgoJICogQHBhcmFtIGludCAkcm93IFJvdyBpbmRleCAoMC1iYXNlZCkKCSAqIEBwYXJhbSBpbnQgJGNvbCBDb2x1bW4gaW5kZXggKDAtYmFzZWQpCgkgKiBAcGFyYW0gc3RyaW5nICRzdHIgVGhlIHN0cmluZwoJICogQHBhcmFtIG1peGVkICAgJHhmSW5kZXggVGhlIFhGIGZvcm1hdCBpbmRleCBmb3IgdGhlIGNlbGwKCSAqIEBwYXJhbSBhcnJheSAkYXJyY1J1biBJbmRleCB0byBGb250IHJlY29yZCBhbmQgY2hhcmFjdGVycyBiZWdpbm5pbmcKCSAqLwoJcHJpdmF0ZSBmdW5jdGlvbiBfd3JpdGVSaWNoVGV4dFN0cmluZygkcm93LCAkY29sLCAkc3RyLCAkeGZJbmRleCwgJGFycmNSdW4pewoJCSRyZWNvcmQJPSAweDAwRkQ7CQkJCSAgIC8vIFJlY29yZCBpZGVudGlmaWVyCgkJJGxlbmd0aAk9IDB4MDAwQTsJCQkJICAgLy8gQnl0ZXMgdG8gZm9sbG93CgoJCSRzdHIgPSBQSFBFeGNlbF9TaGFyZWRfU3RyaW5nOjpVVEY4dG9CSUZGOFVuaWNvZGVTaG9ydCgkc3RyLCAkYXJyY1J1bik7CgoJCS8qIGNoZWNrIGlmIHN0cmluZyBpcyBhbHJlYWR5IHByZXNlbnQgKi8KCQlpZiAoIWlzc2V0KCR0aGlzLT5fc3RyX3RhYmxlWyRzdHJdKSkgewoJCQkkdGhpcy0+X3N0cl90YWJsZVskc3RyXSA9ICR0aGlzLT5fc3RyX3VuaXF1ZSsrOwoJCX0KCQkkdGhpcy0+X3N0cl90b3RhbCsrOwoKCQkkaGVhZGVyCT0gcGFjaygndnYnLCAgICRyZWNvcmQsICRsZW5ndGgpOwoJCSRkYXRhCT0gcGFjaygndnZ2VicsICRyb3csICRjb2wsICR4ZkluZGV4LCAkdGhpcy0+X3N0cl90YWJsZVskc3RyXSk7CgkJJHRoaXMtPl9hcHBlbmQoJGhlYWRlci4kZGF0YSk7Cgl9CgoJLyoqCgkgKiBXcml0ZSBhIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIHJvdyBhbmQgY29sdW1uICh6ZXJvIGluZGV4ZWQpLgoJICogTk9URTogdGhlcmUgaXMgYW4gRXhjZWwgNSBkZWZpbmVkIGxpbWl0IG9mIDI1NSBjaGFyYWN0ZXJzLgoJICogJGZvcm1hdCBpcyBvcHRpb25hbC4KCSAqIFJldHVybnMgIDAgOiBub3JtYWwgdGVybWluYXRpb24KCSAqCQkgLTIgOiByb3cgb3IgY29sdW1uIG91dCBvZiByYW5nZQoJICoJCSAtMyA6IGxvbmcgc3RyaW5nIHRydW5jYXRlZCB0byAyNTUgY2hhcnMKCSAqCgkgKiBAYWNjZXNzIHB1YmxpYwoJICogQHBhcmFtIGludGVnZXIgJHJvdwlaZXJvIGluZGV4ZWQgcm93CgkgKiBAcGFyYW0gaW50ZWdlciAkY29sCVplcm8gaW5kZXhlZCBjb2x1bW4KCSAqIEBwYXJhbSBzdHJpbmcgICRzdHIJVGhlIHN0cmluZyB0byB3cml0ZQoJICogQHBhcmFtIG1peGVkICAgJHhmSW5kZXggVGhlIFhGIGZvcm1hdCBpbmRleCBmb3IgdGhlIGNlbGwKCSAqIEByZXR1cm4gaW50ZWdlcgoJICovCglwcml2YXRlIGZ1bmN0aW9uIF93cml0ZUxhYmVsKCRyb3csICRjb2wsICRzdHIsICR4ZkluZGV4KQoJewoJCSRzdHJsZW4JPSBzdHJsZW4oJHN0cik7CgkJJHJlY29yZAk9IDB4MDIwNDsJCQkJICAgLy8gUmVjb3JkIGlkZW50aWZpZXIKCQkkbGVuZ3RoCT0gMHgwMDA4ICsgJHN0cmxlbjsJCSAvLyBCeXRlcyB0byBmb2xsb3cKCgkJJHN0cl9lcnJvciA9IDA7CgoJCWlmICgkc3RybGVuID4gJHRoaXMtPl94bHNfc3RybWF4KSB7IC8vIExBQkVMIG11c3QgYmUgPCAyNTUgY2hhcnMKCQkJJHN0cgk9IHN1YnN0cigkc3RyLCAwLCAkdGhpcy0+X3hsc19zdHJtYXgpOwoJCQkkbGVuZ3RoCT0gMHgwMDA4ICsgJHRoaXMtPl94bHNfc3RybWF4OwoJCQkkc3RybGVuCT0gJHRoaXMtPl94bHNfc3RybWF4OwoJCQkkc3RyX2Vycm9yID0gLTM7CgkJfQoKCQkkaGVhZGVyCT0gcGFjaygidnYiLCAgICRyZWNvcmQsICRsZW5ndGgpOwoJCSRkYXRhCT0gcGFjaygidnZ2diIsICRyb3csICRjb2wsICR4ZkluZGV4LCAkc3RybGVuKTsKCQkkdGhpcy0+X2FwcGVuZCgkaGVhZGVyIC4gJGRhdGEgLiAkc3RyKTsKCQlyZXR1cm4oJHN0cl9lcnJvcik7Cgl9CgoJLyoqCgkgKiBXcml0ZSBhIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIHJvdyBhbmQgY29sdW1uICh6ZXJvIGluZGV4ZWQpLgoJICogVGhpcyBpcyB0aGUgQklGRjggdmVyc2lvbiAobm8gMjU1IGNoYXJzIGxpbWl0KS4KCSAqICRmb3JtYXQgaXMgb3B0aW9uYWwuCgkgKiBSZXR1cm5zICAwIDogbm9ybWFsIHRlcm1pbmF0aW9uCgkgKgkJIC0yIDogcm93IG9yIGNvbHVtbiBvdXQgb2YgcmFuZ2UKCSAqCQkgLTMgOiBsb25nIHN0cmluZyB0cnVuY2F0ZWQgdG8gMjU1IGNoYXJzCgkgKgoJICogQGFjY2VzcyBwdWJsaWMKCSAqIEBwYXJhbSBpbnRlZ2VyICRyb3cJWmVybyBpbmRleGVkIHJvdwoJICogQHBhcmFtIGludGVnZXIgJGNvbAlaZXJvIGluZGV4ZWQgY29sdW1uCgkgKiBAcGFyYW0gc3RyaW5nICAkc3RyCVRoZSBzdHJpbmcgdG8gd3JpdGUKCSAqIEBwYXJhbSBtaXhlZCAgICR4ZkluZGV4IFRoZSBYRiBmb3JtYXQgaW5kZXggZm9yIHRoZSBjZWxsCgkgKiBAcmV0dXJuIGludGVnZXIKCSAqLwoJcHJpdmF0ZSBmdW5jdGlvbiBfd3JpdGVMYWJlbFNzdCgkcm93LCAkY29sLCAkc3RyLCAkeGZJbmRleCkKCXsKCQkkcmVjb3JkCT0gMHgwMEZEOwkJCQkgICAvLyBSZWNvcmQgaWRlbnRpZmllcgoJCSRsZW5ndGgJPSAweDAwMEE7CQkJCSAgIC8vIEJ5dGVzIHRvIGZvbGxvdwoKCQkkc3RyID0gUEhQRXhjZWxfU2hhcmVkX1N0cmluZzo6VVRGOHRvQklGRjhVbmljb2RlTG9uZygkc3RyKTsKCgkJLyogY2hlY2sgaWYgc3RyaW5nIGlzIGFscmVhZHkgcHJlc2VudCAqLwoJCWlmICghaXNzZXQoJHRoaXMtPl9zdHJfdGFibGVbJHN0cl0pKSB7CgkJCSR0aGlzLT5fc3RyX3RhYmxlWyRzdHJdID0gJHRoaXMtPl9zdHJfdW5pcXVlKys7CgkJfQoJCSR0aGlzLT5fc3RyX3RvdGFsKys7CgoJCSRoZWFkZXIJPSBwYWNrKCd2dicsICAgJHJlY29yZCwgJGxlbmd0aCk7CgkJJGRhdGEJPSBwYWNrKCd2dnZWJywgJHJvdywgJGNvbCwgJHhmSW5kZXgsICR0aGlzLT5fc3RyX3RhYmxlWyRzdHJdKTsKCQkkdGhpcy0+X2FwcGVuZCgkaGVhZGVyLiRkYXRhKTsKCX0KCgkvKioKCSAqIFdyaXRlcyBhIG5vdGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBjZWxsIGdpdmVuIGJ5IHRoZSByb3cgYW5kIGNvbHVtbi4KCSAqIE5PVEUgcmVjb3JkcyBkb24ndCBoYXZlIGEgbGVuZ3RoIGxpbWl0LgoJICoKCSAqIEBwYXJhbSBpbnRlZ2VyICRyb3cJWmVybyBpbmRleGVkIHJvdwoJICogQHBhcmFtIGludGVnZXIgJGNvbAlaZXJvIGluZGV4ZWQgY29sdW1uCgkgKiBAcGFyYW0gc3RyaW5nICAkbm90ZSAgIFRoZSBub3RlIHRvIHdyaXRlCgkgKi8KCXByaXZhdGUgZnVuY3Rpb24gX3dyaXRlTm90ZSgkcm93LCAkY29sLCAkbm90ZSkKCXsKCQkkbm90ZV9sZW5ndGgJPSBzdHJsZW4oJG5vdGUpOwoJCSRyZWNvcmQJCQk9IDB4MDAxQzsJCQkvLyBSZWNvcmQgaWRlbnRpZmllcgoJCSRtYXhfbGVuZ3RoCQk9IDIwNDg7CQkJCS8vIE1heGltdW4gbGVuZ3RoIGZvciBhIE5PVEUgcmVjb3JkCgoJCS8vIExlbmd0aCBmb3IgdGhpcyByZWNvcmQgaXMgbm8gbW9yZSB0aGFuIDIwNDggKyA2CgkJJGxlbmd0aAk9IDB4MDAwNiArIG1pbigkbm90ZV9sZW5ndGgsIDIwNDgpOwoJCSRoZWFkZXIJPSBwYWNrKCJ2diIsICAgJHJlY29yZCwgJGxlbmd0aCk7CgkJJGRhdGEJPSBwYWNrKCJ2dnYiLCAkcm93LCAkY29sLCAkbm90ZV9sZW5ndGgpOwoJCSR0aGlzLT5fYXBwZW5kKCRoZWFkZXIgLiAkZGF0YSAuIHN1YnN0cigkbm90ZSwgMCwgMjA0OCkpOwoKCQlmb3IgKCRpID0gJG1heF9sZW5ndGg7ICRpIDwgJG5vdGVfbGVuZ3RoOyAkaSArPSAkbWF4X2xlbmd0aCkgewoJCQkkY2h1bmsgID0gc3Vic3RyKCRub3RlLCAkaSwgJG1heF9sZW5ndGgpOwoJCQkkbGVuZ3RoID0gMHgwMDA2ICsgc3RybGVuKCRjaHVuayk7CgkJCSRoZWFkZXIgPSBwYWNrKCJ2diIsICAgJHJlY29yZCwgJGxlbmd0aCk7CgkJCSRkYXRhICAgPSBwYWNrKCJ2dnYiLCAtMSwgMCwgc3RybGVuKCRjaHVuaykpOwoJCQkkdGhpcy0+X2FwcGVuZCgkaGVhZGVyLiRkYXRhLiRjaHVuayk7CgkJfQoJCXJldHVybigwKTsKCX0KCgkvKioKCSAqIFdyaXRlIGEgYmxhbmsgY2VsbCB0byB0aGUgc3BlY2lmaWVkIHJvdyBhbmQgY29sdW1uICh6ZXJvIGluZGV4ZWQpLgoJICogQSBibGFuayBjZWxsIGlzIHVzZWQgdG8gc3BlY2lmeSBmb3JtYXR0aW5nIHdpdGhvdXQgYWRkaW5nIGEgc3RyaW5nCgkgKiBvciBhIG51bWJlci4KCSAqCgkgKiBBIGJsYW5rIGNlbGwgd2l0aG91dCBhIGZvcm1hdCBzZXJ2ZXMgbm8gcHVycG9zZS4gVGhlcmVmb3JlLCB3ZSBkb24ndCB3cml0ZQoJICogYSBCTEFOSyByZWNvcmQgdW5sZXNzIGEgZm9ybWF0IGlzIHNwZWNpZmllZC4KCSAqCgkgKiBSZXR1cm5zICAwIDogbm9ybWFsIHRlcm1pbmF0aW9uIChpbmNsdWRpbmcgbm8gZm9ybWF0KQoJICoJCSAtMSA6IGluc3VmZmljaWVudCBudW1iZXIgb2YgYXJndW1lbnRzCgkgKgkJIC0yIDogcm93IG9yIGNvbHVtbiBvdXQgb2YgcmFuZ2UKCSAqCgkgKiBAcGFyYW0gaW50ZWdlciAkcm93CVplcm8gaW5kZXhlZCByb3cKCSAqIEBwYXJhbSBpbnRlZ2VyICRjb2wJWmVybyBpbmRleGVkIGNvbHVtbgoJICogQHBhcmFtIG1peGVkICAgJHhmSW5kZXggVGhlIFhGIGZvcm1hdCBpbmRleAoJICovCglmdW5jdGlvbiBfd3JpdGVCbGFuaygkcm93LCAkY29sLCAkeGZJbmRleCkKCXsKCQkkcmVjb3JkCT0gMHgwMjAxOwkJCQkgLy8gUmVjb3JkIGlkZW50aWZpZXIKCQkkbGVuZ3RoCT0gMHgwMDA2OwkJCQkgLy8gTnVtYmVyIG9mIGJ5dGVzIHRvIGZvbGxvdwoKCQkkaGVhZGVyCT0gcGFjaygidnYiLCAgJHJlY29yZCwgJGxlbmd0aCk7CgkJJGRhdGEJICA9IHBhY2soInZ2diIsICRyb3csICRjb2wsICR4ZkluZGV4KTsKCQkkdGhpcy0+X2FwcGVuZCgkaGVhZGVyIC4gJGRhdGEpOwoJCXJldHVybiAwOwoJfQoKCS8qKgoJICogV3JpdGUgYSBib29sZWFuIG9yIGFuIGVycm9yIHR5cGUgdG8gdGhlIHNwZWNpZmllZCByb3cgYW5kIGNvbHVtbiAoemVybyBpbmRleGVkKQoJICoKCSAqIEBwYXJhbSBpbnQgJHJvdyBSb3cgaW5kZXggKDAtYmFzZWQpCgkgKiBAcGFyYW0gaW50ICRjb2wgQ29sdW1uIGluZGV4ICgwLWJhc2VkKQoJICogQHBhcmFtIGludCAkdmFsdWUKCSAqIEBwYXJhbSBib29sZWFuICRpc0Vycm9yIEVycm9yIG9yIEJvb2xlYW4/CgkgKiBAcGFyYW0gaW50ICR4ZkluZGV4CgkgKi8KCXByaXZhdGUgZnVuY3Rpb24gX3dyaXRlQm9vbEVycigkcm93LCAkY29sLCAkdmFsdWUsICRpc0Vycm9yLCAkeGZJbmRleCkKCXsKCQkkcmVjb3JkID0gMHgwMjA1OwoJCSRsZW5ndGggPSA4OwoKCQkkaGVhZGVyCT0gcGFjaygidnYiLCAgJHJlY29yZCwgJGxlbmd0aCk7CgkJJGRhdGEJICA9IHBhY2soInZ2dkNDIiwgJHJvdywgJGNvbCwgJHhmSW5kZXgsICR2YWx1ZSwgJGlzRXJyb3IpOwoJCSR0aGlzLT5fYXBwZW5kKCRoZWFkZXIgLiAkZGF0YSk7CgkJcmV0dXJuIDA7Cgl9CgoJLyoqCgkgKiBXcml0ZSBhIGZvcm11bGEgdG8gdGhlIHNwZWNpZmllZCByb3cgYW5kIGNvbHVtbiAoemVybyBpbmRleGVkKS4KCSAqIFRoZSB0ZXh0dWFsIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBmb3JtdWxhIGlzIHBhc3NlZCB0byB0aGUgcGFyc2VyIGluCgkgKiBQYXJzZXIucGhwIHdoaWNoIHJldHVybnMgYSBwYWNrZWQgYmluYXJ5IHN0cmluZy4KCSAqCgkgKiBSZXR1cm5zICAwIDogbm9ybWFsIHRlcm1pbmF0aW9uCgkgKgkJIC0xIDogZm9ybXVsYSBlcnJvcnMgKGJhZCBmb3JtdWxhKQoJICoJCSAtMiA6IHJvdyBvciBjb2x1bW4gb3V0IG9mIHJhbmdlCgkgKgoJICogQHBhcmFtIGludGVnZXIgJHJvdwkgWmVybyBpbmRleGVkIHJvdwoJICogQHBhcmFtIGludGVnZXIgJGNvbAkgWmVybyBpbmRleGVkIGNvbHVtbgoJICogQHBhcmFtIHN0cmluZyAgJGZvcm11bGEgVGhlIGZvcm11bGEgdGV4dCBzdHJpbmcKCSAqIEBwYXJhbSBtaXhlZCAgICR4ZkluZGV4ICBUaGUgWEYgZm9ybWF0IGluZGV4CgkgKiBAcGFyYW0gbWl4ZWQgICAkY2FsY3VsYXRlZFZhbHVlICBDYWxjdWxhdGVkIHZhbHVlCgkgKiBAcmV0dXJuIGludGVnZXIKCSAqLwoJcHJpdmF0ZSBmdW5jdGlvbiBfd3JpdGVGb3JtdWxhKCRyb3csICRjb2wsICRmb3JtdWxhLCAkeGZJbmRleCwgJGNhbGN1bGF0ZWRWYWx1ZSkKCXsKCQkkcmVjb3JkCT0gMHgwMDA2OwkgLy8gUmVjb3JkIGlkZW50aWZpZXIKCgkJLy8gSW5pdGlhbGl6ZSBwb3NzaWJsZSBhZGRpdGlvbmFsIHZhbHVlIGZvciBTVFJJTkcgcmVjb3JkIHRoYXQgc2hvdWxkIGJlIHdyaXR0ZW4gYWZ0ZXIgdGhlIEZPUk1VTEEgcmVjb3JkPwoJCSRzdHJpbmdWYWx1ZSA9IG51bGw7CgoJCS8vIGNhbGN1bGF0ZWQgdmFsdWUKCQlpZiAoaXNzZXQoJGNhbGN1bGF0ZWRWYWx1ZSkpIHsKCQkJLy8gU2luY2Ugd2UgY2FuJ3QgeWV0IGdldCB0aGUgZGF0YSB0eXBlIG9mIHRoZSBjYWxjdWxhdGVkIHZhbHVlLAoJCQkvLyB3ZSB1c2UgYmVzdCBlZmZvcnQgdG8gZGV0ZXJtaW5lIGRhdGEgdHlwZQoJCQlpZiAoaXNfYm9vbCgkY2FsY3VsYXRlZFZhbHVlKSkgewoJCQkJLy8gQm9vbGVhbiB2YWx1ZQoJCQkJJG51bSA9IHBhY2soJ0NDQ3ZDdicsIDB4MDEsIDB4MDAsIChpbnQpJGNhbGN1bGF0ZWRWYWx1ZSwgMHgwMCwgMHgwMCwgMHhGRkZGKTsKCQkJfSBlbHNlaWYgKGlzX2ludCgkY2FsY3VsYXRlZFZhbHVlKSB8fCBpc19mbG9hdCgkY2FsY3VsYXRlZFZhbHVlKSkgewoJCQkJLy8gTnVtZXJpYyB2YWx1ZQoJCQkJJG51bSA9IHBhY2soJ2QnLCAkY2FsY3VsYXRlZFZhbHVlKTsKCQkJfSBlbHNlaWYgKGlzX3N0cmluZygkY2FsY3VsYXRlZFZhbHVlKSkgewoJCQkJaWYgKGFycmF5X2tleV9leGlzdHMoJGNhbGN1bGF0ZWRWYWx1ZSwgUEhQRXhjZWxfQ2VsbF9EYXRhVHlwZTo6Z2V0RXJyb3JDb2RlcygpKSkgewoJCQkJCS8vIEVycm9yIHZhbHVlCgkJCQkJJG51bSA9IHBhY2soJ0NDQ3ZDdicsIDB4MDIsIDB4MDAsIHNlbGY6Ol9tYXBFcnJvckNvZGUoJGNhbGN1bGF0ZWRWYWx1ZSksIDB4MDAsIDB4MDAsIDB4RkZGRik7CgkJCQl9IGVsc2VpZiAoJGNhbGN1bGF0ZWRWYWx1ZSA9PT0gJycpIHsKCQkJCQkvLyBFbXB0eSBzdHJpbmcgKGFuZCBCSUZGOCkKCQkJCQkkbnVtID0gcGFjaygnQ0NDdkN2JywgMHgwMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRkZGKTsKCQkJCX0gZWxzZSB7CgkJCQkJLy8gTm9uLWVtcHR5IHN0cmluZyB2YWx1ZSAob3IgZW1wdHkgc3RyaW5nIEJJRkY1KQoJCQkJCSRzdHJpbmdWYWx1ZSA9ICRjYWxjdWxhdGVkVmFsdWU7CgkJCQkJJG51bSA9IHBhY2soJ0NDQ3ZDdicsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkZGRik7CgkJCQl9CgkJCX0gZWxzZSB7CgkJCQkvLyBXZSBhcmUgcmVhbGx5IG5vdCBzdXBwb3NlZCB0byByZWFjaCBoZXJlCgkJCQkkbnVtID0gcGFjaygnZCcsIDB4MDApOwoJCQl9CgkJfSBlbHNlIHsKCQkJJG51bSA9IHBhY2soJ2QnLCAweDAwKTsKCQl9CgoJCSRncmJpdAkJPSAweDAzOwkJCQkvLyBPcHRpb24gZmxhZ3MKCQkkdW5rbm93bgk9IDB4MDAwMDsJCQkvLyBNdXN0IGJlIHplcm8KCgkJLy8gU3RyaXAgdGhlICc9JyBvciAnQCcgc2lnbiBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmb3JtdWxhIHN0cmluZwoJCWlmICgkZm9ybXVsYXswfSA9PSAnPScpIHsKCQkJJGZvcm11bGEgPSBzdWJzdHIoJGZvcm11bGEsMSk7CgkJfSBlbHNlIHsKCQkJLy8gRXJyb3IgaGFuZGxpbmcKCQkJJHRoaXMtPl93cml0ZVN0cmluZygkcm93LCAkY29sLCAnVW5yZWNvZ25pc2VkIGNoYXJhY3RlciBmb3IgZm9ybXVsYScpOwoJCQlyZXR1cm4gLTE7CgkJfQoKCQkvLyBQYXJzZSB0aGUgZm9ybXVsYSB1c2luZyB0aGUgcGFyc2VyIGluIFBhcnNlci5waHAKCQl0cnkgewoJCQkkZXJyb3IgPSAkdGhpcy0+X3BhcnNlci0+cGFyc2UoJGZvcm11bGEpOwoJCQkkZm9ybXVsYSA9ICR0aGlzLT5fcGFyc2VyLT50b1JldmVyc2VQb2xpc2goKTsKCgkJCSRmb3JtbGVuCT0gc3RybGVuKCRmb3JtdWxhKTsJLy8gTGVuZ3RoIG9mIHRoZSBiaW5hcnkgc3RyaW5nCgkJCSRsZW5ndGgJID0gMHgxNiArICRmb3JtbGVuOwkgLy8gTGVuZ3RoIG9mIHRoZSByZWNvcmQgZGF0YQoKCQkJJGhlYWRlcgk9IHBhY2soInZ2IiwJICAkcmVjb3JkLCAkbGVuZ3RoKTsKCgkJCSRkYXRhCSAgPSBwYWNrKCJ2dnYiLCAkcm93LCAkY29sLCAkeGZJbmRleCkKCQkJCQkJLiAkbnVtCgkJCQkJCS4gcGFjaygidlZ2IiwgJGdyYml0LCAkdW5rbm93biwgJGZvcm1sZW4pOwoJCQkkdGhpcy0+X2FwcGVuZCgkaGVhZGVyIC4gJGRhdGEgLiAkZm9ybXVsYSk7CgoJCQkvLyBBcHBlbmQgYWxzbyBhIFNUUklORyByZWNvcmQgaWYgbmVjZXNzYXJ5CgkJCWlmICgkc3RyaW5nVmFsdWUgIT09IG51bGwpIHsKCQkJCSR0aGlzLT5fd3JpdGVTdHJpbmdSZWNvcmQoJHN0cmluZ1ZhbHVlKTsKCQkJfQoKCQkJcmV0dXJuIDA7CgoJCX0gY2F0Y2ggKEV4Y2VwdGlvbiAkZSkgewoJCQkvLyBkbyBub3RoaW5nCgkJfQoKCX0KCgkvKioKCSAqIFdyaXRlIGEgU1RSSU5HIHJlY29yZC4gVGhpcwoJICoKCSAqIEBwYXJhbSBzdHJpbmcgJHN0cmluZ1ZhbHVlCgkgKi8KCXByaXZhdGUgZnVuY3Rpb24gX3dyaXRlU3RyaW5nUmVjb3JkKCRzdHJpbmdWYWx1ZSkKCXsKCQkkcmVjb3JkID0gMHgwMjA3OwkgLy8gUmVjb3JkIGlkZW50aWZpZXIKCQkkZGF0YSA9IFBIUEV4Y2VsX1NoYXJlZF9TdHJpbmc6OlVURjh0b0JJRkY4VW5pY29kZUxvbmcoJHN0cmluZ1ZhbHVlKTsKCgkJJGxlbmd0aCA9IHN0cmxlbigkZGF0YSk7CgkJJGhlYWRlciA9IHBhY2soJ3Z2JywgJHJlY29yZCwgJGxlbmd0aCk7CgoJCSR0aGlzLT5fYXBwZW5kKCRoZWFkZXIgLiAkZGF0YSk7Cgl9CgoJLyoqCgkgKiBXcml0ZSBhIGh5cGVybGluay4KCSAqIFRoaXMgaXMgY29tcHJpc2VkIG9mIHR3byBlbGVtZW50czogdGhlIHZpc2libGUgbGFiZWwgYW5kCgkgKiB0aGUgaW52aXNpYmxlIGxpbmsuIFRoZSB2aXNpYmxlIGxhYmVsIGlzIHRoZSBzYW1lIGFzIHRoZSBsaW5rIHVubGVzcyBhbgoJICogYWx0ZXJuYXRpdmUgc3RyaW5nIGlzIHNwZWNpZmllZC4gVGhlIGxhYmVsIGlzIHdyaXR0ZW4gdXNpbmcgdGhlCgkgKiBfd3JpdGVTdHJpbmcoKSBtZXRob2QuIFRoZXJlZm9yZSB0aGUgMjU1IGNoYXJhY3RlcnMgc3RyaW5nIGxpbWl0IGFwcGxpZXMuCgkgKiAkc3RyaW5nIGFuZCAkZm9ybWF0IGFyZSBvcHRpb25hbC4KCSAqCgkgKiBUaGUgaHlwZXJsaW5rIGNhbiBiZSB0byBhIGh0dHAsIGZ0cCwgbWFpbCwgaW50ZXJuYWwgc2hlZXQgKG5vdCB5ZXQpLCBvciBleHRlcm5hbAoJICogZGlyZWN0b3J5IHVybC4KCSAqCgkgKiBSZXR1cm5zICAwIDogbm9ybWFsIHRlcm1pbmF0aW9uCgkgKgkJIC0yIDogcm93IG9yIGNvbHVtbiBvdXQgb2YgcmFuZ2UKCSAqCQkgLTMgOiBsb25nIHN0cmluZyB0cnVuY2F0ZWQgdG8gMjU1IGNoYXJzCgkgKgoJICogQHBhcmFtIGludGVnZXIgJHJvdwlSb3cKCSAqIEBwYXJhbSBpbnRlZ2VyICRjb2wJQ29sdW1uCgkgKiBAcGFyYW0gc3RyaW5nICAkdXJsCVVSTCBzdHJpbmcKCSAqIEByZXR1cm4gaW50ZWdlcgoJICovCglwcml2YXRlIGZ1bmN0aW9uIF93cml0ZVVybCgkcm93LCAkY29sLCAkdXJsKQoJewoJCS8vIEFkZCBzdGFydCByb3cgYW5kIGNvbCB0byBhcmcgbGlzdAoJCXJldHVybigkdGhpcy0+X3dyaXRlVXJsUmFuZ2UoJHJvdywgJGNvbCwgJHJvdywgJGNvbCwgJHVybCkpOwoJfQoKCS8qKgoJICogVGhpcyBpcyB0aGUgbW9yZSBnZW5lcmFsIGZvcm0gb2YgX3dyaXRlVXJsKCkuIEl0IGFsbG93cyBhIGh5cGVybGluayB0byBiZQoJICogd3JpdHRlbiB0byBhIHJhbmdlIG9mIGNlbGxzLiBUaGlzIGZ1bmN0aW9uIGFsc28gZGVjaWRlcyB0aGUgdHlwZSBvZiBoeXBlcmxpbmsKCSAqIHRvIGJlIHdyaXR0ZW4uIFRoZXNlIGFyZSBlaXRoZXIsIFdlYiAoaHR0cCwgZnRwLCBtYWlsdG8pLCBJbnRlcm5hbAoJICogKFNoZWV0MSFBMSkgb3IgZXh0ZXJuYWwgKCdjOlx0ZW1wXGZvby54bHMjU2hlZXQxIUExJykuCgkgKgoJICogQGFjY2VzcyBwcml2YXRlCgkgKiBAc2VlIF93cml0ZVVybCgpCgkgKiBAcGFyYW0gaW50ZWdlciAkcm93MSAgIFN0YXJ0IHJvdwoJICogQHBhcmFtIGludGVnZXIgJGNvbDEgICBTdGFydCBjb2x1bW4KCSAqIEBwYXJhbSBpbnRlZ2VyICRyb3cyICAgRW5kIHJvdwoJICogQHBhcmFtIGludGVnZXIgJGNvbDIgICBFbmQgY29sdW1uCgkgKiBAcGFyYW0gc3RyaW5nICAkdXJsCVVSTCBzdHJpbmcKCSAqIEByZXR1cm4gaW50ZWdlcgoJICovCglmdW5jdGlvbiBfd3JpdGVVcmxSYW5nZSgkcm93MSwgJGNvbDEsICRyb3cyLCAkY29sMiwgJHVybCkKCXsKCQkvLyBDaGVjayBmb3IgaW50ZXJuYWwvZXh0ZXJuYWwgc2hlZXQgbGlua3Mgb3IgZGVmYXVsdCB0byB3ZWIgbGluawoJCWlmIChwcmVnX21hdGNoKCdbXmludGVybmFsOl0nLCAkdXJsKSkgewoJCQlyZXR1cm4oJHRoaXMtPl93cml0ZVVybEludGVybmFsKCRyb3cxLCAkY29sMSwgJHJvdzIsICRjb2wyLCAkdXJsKSk7CgkJfQoJCWlmIChwcmVnX21hdGNoKCdbXmV4dGVybmFsOl0nLCAkdXJsKSkgewoJCQlyZXR1cm4oJHRoaXMtPl93cml0ZVVybEV4dGVybmFsKCRyb3cxLCAkY29sMSwgJHJvdzIsICRjb2wyLCAkdXJsKSk7CgkJfQoJCXJldHVybigkdGhpcy0+X3dyaXRlVXJsV2ViKCRyb3cxLCAkY29sMSwgJHJvdzIsICRjb2wyLCAkdXJsKSk7Cgl9CgoJLyoqCgkgKiBVc2VkIHRvIHdyaXRlIGh0dHAsIGZ0cCBhbmQgbWFpbHRvIGh5cGVybGlua3MuCgkgKiBUaGUgbGluayB0eXBlICgkb3B0aW9ucykgaXMgMHgwMyBpcyB0aGUgc2FtZSBhcyBhYnNvbHV0ZSBkaXIgcmVmIHdpdGhvdXQKCSAqIHNoZWV0LiBIb3dldmVyIGl0IGlzIGRpZmZlcmVudGlhdGVkIGJ5IHRoZSAkdW5rbm93bjIgZGF0YSBzdHJlYW0uCgkgKgoJICogQGFjY2VzcyBwcml2YXRlCgkgKiBAc2VlIF93cml0ZVVybCgpCgkgKiBAcGFyYW0gaW50ZWdlciAkcm93MSAgIFN0YXJ0IHJvdwoJICogQHBhcmFtIGludGVnZXIgJGNvbDEgICBTdGFydCBjb2x1bW4KCSAqIEBwYXJhbSBpbnRlZ2VyICRyb3cyICAgRW5kIHJvdwoJICogQHBhcmFtIGludGVnZXIgJGNvbDIgICBFbmQgY29sdW1uCgkgKiBAcGFyYW0gc3RyaW5nICAkdXJsCVVSTCBzdHJpbmcKCSAqIEByZXR1cm4gaW50ZWdlcgoJICovCglmdW5jdGlvbiBfd3JpdGVVcmxXZWIoJHJvdzEsICRjb2wxLCAkcm93MiwgJGNvbDIsICR1cmwpCgl7CgkJJHJlY29yZAkgID0gMHgwMUI4OwkJCQkJICAgLy8gUmVjb3JkIGlkZW50aWZpZXIKCQkkbGVuZ3RoCSAgPSAweDAwMDAwOwkJCQkJICAvLyBCeXRlcyB0byBmb2xsb3cKCgkJLy8gUGFjayB0aGUgdW5kb2N1bWVudGVkIHBhcnRzIG9mIHRoZSBoeXBlcmxpbmsgc3RyZWFtCgkJJHVua25vd24xCT0gcGFjaygiSCoiLCAiRDBDOUVBNzlGOUJBQ0UxMThDODIwMEFBMDA0QkE5MEIwMjAwMDAwMCIpOwoJCSR1bmtub3duMgk9IHBhY2soIkgqIiwgIkUwQzlFQTc5RjlCQUNFMTE4QzgyMDBBQTAwNEJBOTBCIik7CgoJCS8vIFBhY2sgdGhlIG9wdGlvbiBmbGFncwoJCSRvcHRpb25zCSA9IHBhY2soIlYiLCAweDAzKTsKCgkJLy8gQ29udmVydCBVUkwgdG8gYSBudWxsIHRlcm1pbmF0ZWQgd2NoYXIgc3RyaW5nCgkJJHVybAkJID0gam9pbigiXDAiLCBwcmVnX3NwbGl0KCInJyIsICR1cmwsIC0xLCBQUkVHX1NQTElUX05PX0VNUFRZKSk7CgkJJHVybAkJID0gJHVybCAuICJcMFwwXDAiOwoKCQkvLyBQYWNrIHRoZSBsZW5ndGggb2YgdGhlIFVSTAoJCSR1cmxfbGVuCSA9IHBhY2soIlYiLCBzdHJsZW4oJHVybCkpOwoKCQkvLyBDYWxjdWxhdGUgdGhlIGRhdGEgbGVuZ3RoCgkJJGxlbmd0aAkgID0gMHgzNCArIHN0cmxlbigkdXJsKTsKCgkJLy8gUGFjayB0aGUgaGVhZGVyIGRhdGEKCQkkaGVhZGVyCSAgPSBwYWNrKCJ2diIsICAgJHJlY29yZCwgJGxlbmd0aCk7CgkJJGRhdGEJCT0gcGFjaygidnZ2diIsICRyb3cxLCAkcm93MiwgJGNvbDEsICRjb2wyKTsKCgkJLy8gV3JpdGUgdGhlIHBhY2tlZCBkYXRhCgkJJHRoaXMtPl9hcHBlbmQoJGhlYWRlciAuICRkYXRhIC4KCQkJCQkgICAkdW5rbm93bjEgLiAkb3B0aW9ucyAuCgkJCQkJICAgJHVua25vd24yIC4gJHVybF9sZW4gLiAkdXJsKTsKCQlyZXR1cm4gMDsKCX0KCgkvKioKCSAqIFVzZWQgdG8gd3JpdGUgaW50ZXJuYWwgcmVmZXJlbmNlIGh5cGVybGlua3Mgc3VjaCBhcyAiU2hlZXQxIUExIi4KCSAqCgkgKiBAYWNjZXNzIHByaXZhdGUKCSAqIEBzZWUgX3dyaXRlVXJsKCkKCSAqIEBwYXJhbSBpbnRlZ2VyICRyb3cxICAgU3RhcnQgcm93CgkgKiBAcGFyYW0gaW50ZWdlciAkY29sMSAgIFN0YXJ0IGNvbHVtbgoJICogQHBhcmFtIGludGVnZXIgJHJvdzIgICBFbmQgcm93CgkgKiBAcGFyYW0gaW50ZWdlciAkY29sMiAgIEVuZCBjb2x1bW4KCSAqIEBwYXJhbSBzdHJpbmcgICR1cmwJVVJMIHN0cmluZwoJICogQHJldHVybiBpbnRlZ2VyCgkgKi8KCWZ1bmN0aW9uIF93cml0ZVVybEludGVybmFsKCRyb3cxLCAkY29sMSwgJHJvdzIsICRjb2wyLCAkdXJsKQoJewoJCSRyZWNvcmQJICA9IDB4MDFCODsJCQkJCSAgIC8vIFJlY29yZCBpZGVudGlmaWVyCgkJJGxlbmd0aAkgID0gMHgwMDAwMDsJCQkJCSAgLy8gQnl0ZXMgdG8gZm9sbG93CgoJCS8vIFN0cmlwIFVSTCB0eXBlCgkJJHVybCA9IHByZWdfcmVwbGFjZSgnL15pbnRlcm5hbDovJywgJycsICR1cmwpOwoKCQkvLyBQYWNrIHRoZSB1bmRvY3VtZW50ZWQgcGFydHMgb2YgdGhlIGh5cGVybGluayBzdHJlYW0KCQkkdW5rbm93bjEJPSBwYWNrKCJIKiIsICJEMEM5RUE3OUY5QkFDRTExOEM4MjAwQUEwMDRCQTkwQjAyMDAwMDAwIik7CgoJCS8vIFBhY2sgdGhlIG9wdGlvbiBmbGFncwoJCSRvcHRpb25zCSA9IHBhY2soIlYiLCAweDA4KTsKCgkJLy8gQ29udmVydCB0aGUgVVJMIHR5cGUgYW5kIHRvIGEgbnVsbCB0ZXJtaW5hdGVkIHdjaGFyIHN0cmluZwoJCSR1cmwgLj0gIlwwIjsKCgkJLy8gY2hhcmFjdGVyIGNvdW50CgkJJHVybF9sZW4gPSBQSFBFeGNlbF9TaGFyZWRfU3RyaW5nOjpDb3VudENoYXJhY3RlcnMoJHVybCk7CgkJJHVybF9sZW4gPSBwYWNrKCdWJywgJHVybF9sZW4pOwoKCQkkdXJsID0gUEhQRXhjZWxfU2hhcmVkX1N0cmluZzo6Q29udmVydEVuY29kaW5nKCR1cmwsICdVVEYtMTZMRScsICdVVEYtOCcpOwoKCQkvLyBDYWxjdWxhdGUgdGhlIGRhdGEgbGVuZ3RoCgkJJGxlbmd0aAkgID0gMHgyNCArIHN0cmxlbigkdXJsKTsKCgkJLy8gUGFjayB0aGUgaGVhZGVyIGRhdGEKCQkkaGVhZGVyCSAgPSBwYWNrKCJ2diIsICAgJHJlY29yZCwgJGxlbmd0aCk7CgkJJGRhdGEJCT0gcGFjaygidnZ2diIsICRyb3cxLCAkcm93MiwgJGNvbDEsICRjb2wyKTsKCgkJLy8gV3JpdGUgdGhlIHBhY2tlZCBkYXRhCgkJJHRoaXMtPl9hcHBlbmQoJGhlYWRlciAuICRkYXRhIC4KCQkJCQkgICAkdW5rbm93bjEgLiAkb3B0aW9ucyAuCgkJCQkJICAgJHVybF9sZW4gLiAkdXJsKTsKCQlyZXR1cm4gMDsKCX0KCgkvKioKCSAqIFdyaXRlIGxpbmtzIHRvIGV4dGVybmFsIGRpcmVjdG9yeSBuYW1lcyBzdWNoIGFzICdjOlxmb28ueGxzJywKCSAqIGM6XGZvby54bHMjU2hlZXQxIUExJywgJy4uLy4uL2Zvby54bHMnLiBhbmQgJy4uLy4uL2Zvby54bHMjU2hlZXQxIUExJy4KCSAqCgkgKiBOb3RlOiBFeGNlbCB3cml0ZXMgc29tZSByZWxhdGl2ZSBsaW5rcyB3aXRoIHRoZSAkZGlyX2xvbmcgc3RyaW5nLiBXZSBpZ25vcmUKCSAqIHRoZXNlIGNhc2VzIGZvciB0aGUgc2FrZSBvZiBzaW1wbGVyIGNvZGUuCgkgKgoJICogQGFjY2VzcyBwcml2YXRlCgkgKiBAc2VlIF93cml0ZVVybCgpCgkgKiBAcGFyYW0gaW50ZWdlciAkcm93MSAgIFN0YXJ0IHJvdwoJICogQHBhcmFtIGludGVnZXIgJGNvbDEgICBTdGFydCBjb2x1bW4KCSAqIEBwYXJhbSBpbnRlZ2VyICRyb3cyICAgRW5kIHJvdwoJICogQHBhcmFtIGludGVnZXIgJGNvbDIgICBFbmQgY29sdW1uCgkgKiBAcGFyYW0gc3RyaW5nICAkdXJsCVVSTCBzdHJpbmcKCSAqIEByZXR1cm4gaW50ZWdlcgoJICovCglmdW5jdGlvbiBfd3JpdGVVcmxFeHRlcm5hbCgkcm93MSwgJGNvbDEsICRyb3cyLCAkY29sMiwgJHVybCkKCXsKCQkvLyBOZXR3b3JrIGRyaXZlcyBhcmUgZGlmZmVyZW50LiBXZSB3aWxsIGhhbmRsZSB0aGVtIHNlcGFyYXRlbHkKCQkvLyBNUy9Ob3ZlbGwgbmV0d29yayBkcml2ZXMgYW5kIHNoYXJlcyBzdGFydCB3aXRoIFxcCgkJaWYgKHByZWdfbWF0Y2goJ1teZXh0ZXJuYWw6XFxcXF0nLCAkdXJsKSkgewoJCQlyZXR1cm47IC8vKCR0aGlzLT5fd3JpdGVVcmxFeHRlcm5hbF9uZXQoJHJvdzEsICRjb2wxLCAkcm93MiwgJGNvbDIsICR1cmwsICRzdHIsICRmb3JtYXQpKTsKCQl9CgoJCSRyZWNvcmQJICA9IDB4MDFCODsJCQkJCSAgIC8vIFJlY29yZCBpZGVudGlmaWVyCgkJJGxlbmd0aAkgID0gMHgwMDAwMDsJCQkJCSAgLy8gQnl0ZXMgdG8gZm9sbG93CgoJCS8vIFN0cmlwIFVSTCB0eXBlIGFuZCBjaGFuZ2UgVW5peCBkaXIgc2VwYXJhdG9yIHRvIERvcyBzdHlsZSAoaWYgbmVlZGVkKQoJCS8vCgkJJHVybCA9IHByZWdfcmVwbGFjZSgnL15leHRlcm5hbDovJywgJycsICR1cmwpOwoJCSR1cmwgPSBwcmVnX3JlcGxhY2UoJy9cLy8nLCAiXFwiLCAkdXJsKTsKCgkJLy8gRGV0ZXJtaW5lIGlmIHRoZSBsaW5rIGlzIHJlbGF0aXZlIG9yIGFic29sdXRlOgoJCS8vICAgcmVsYXRpdmUgaWYgbGluayBjb250YWlucyBubyBkaXIgc2VwYXJhdG9yLCAic29tZWZpbGUueGxzIgoJCS8vICAgcmVsYXRpdmUgaWYgbGluayBzdGFydHMgd2l0aCB1cC1kaXIsICIuLlwuLlxzb21lZmlsZS54bHMiCgkJLy8gICBvdGhlcndpc2UsIGFic29sdXRlCgoJCSRhYnNvbHV0ZSA9IDB4MDA7IC8vIHJlbGF0aXZlIHBhdGgKCQlpZiAoIHByZWdfbWF0Y2goJy9eW0EtWl06LycsICR1cmwpICkgewoJCQkkYWJzb2x1dGUgPSAweDAyOyAvLyBhYnNvbHV0ZSBwYXRoIG9uIFdpbmRvd3MsIGUuZy4gQzpcLi4uCgkJfQoJCSRsaW5rX3R5cGUJCQkgICA9IDB4MDEgfCAkYWJzb2x1dGU7CgoJCS8vIERldGVybWluZSBpZiB0aGUgbGluayBjb250YWlucyBhIHNoZWV0IHJlZmVyZW5jZSBhbmQgY2hhbmdlIHNvbWUgb2YgdGhlCgkJLy8gcGFyYW1ldGVycyBhY2NvcmRpbmdseS4KCQkvLyBTcGxpdCB0aGUgZGlyIG5hbWUgYW5kIHNoZWV0IG5hbWUgKGlmIGl0IGV4aXN0cykKCQkkZGlyX2xvbmcgPSAkdXJsOwoJCWlmIChwcmVnX21hdGNoKCIvXCMvIiwgJHVybCkpIHsKCQkJJGxpbmtfdHlwZSB8PSAweDA4OwoJCX0KCgoJCS8vIFBhY2sgdGhlIGxpbmsgdHlwZQoJCSRsaW5rX3R5cGUgICA9IHBhY2soIlYiLCAkbGlua190eXBlKTsKCgkJLy8gQ2FsY3VsYXRlIHRoZSB1cC1sZXZlbCBkaXIgY291bnQgZS5nLi4gKC4uXC4uXC4uXCA9PSAzKQoJCSR1cF9jb3VudAk9IHByZWdfbWF0Y2hfYWxsKCIvXC5cLlxcXC8iLCAkZGlyX2xvbmcsICR1c2VsZXNzKTsKCQkkdXBfY291bnQJPSBwYWNrKCJ2IiwgJHVwX2NvdW50KTsKCgkJLy8gU3RvcmUgdGhlIHNob3J0IGRvcyBkaXIgbmFtZSAobnVsbCB0ZXJtaW5hdGVkKQoJCSRkaXJfc2hvcnQgICA9IHByZWdfcmVwbGFjZSgiL1wuXC5cXFwvIiwgJycsICRkaXJfbG9uZykgLiAiXDAiOwoKCQkvLyBTdG9yZSB0aGUgbG9uZyBkaXIgbmFtZSBhcyBhIHdjaGFyIHN0cmluZyAobm9uLW51bGwgdGVybWluYXRlZCkKCQkkZGlyX2xvbmcJICAgPSAkZGlyX2xvbmcgLiAiXDAiOwoKCQkvLyBQYWNrIHRoZSBsZW5ndGhzIG9mIHRoZSBkaXIgc3RyaW5ncwoJCSRkaXJfc2hvcnRfbGVuID0gcGFjaygiViIsIHN0cmxlbigkZGlyX3Nob3J0KQkgICk7CgkJJGRpcl9sb25nX2xlbiAgPSBwYWNrKCJWIiwgc3RybGVuKCRkaXJfbG9uZykJICAgKTsKCQkkc3RyZWFtX2xlbgk9IHBhY2soIlYiLCAwKTsvL3N0cmxlbigkZGlyX2xvbmcpICsgMHgwNik7CgoJCS8vIFBhY2sgdGhlIHVuZG9jdW1lbnRlZCBwYXJ0cyBvZiB0aGUgaHlwZXJsaW5rIHN0cmVhbQoJCSR1bmtub3duMSA9IHBhY2soIkgqIiwnRDBDOUVBNzlGOUJBQ0UxMThDODIwMEFBMDA0QkE5MEIwMjAwMDAwMCcJICAgKTsKCQkkdW5rbm93bjIgPSBwYWNrKCJIKiIsJzAzMDMwMDAwMDAwMDAwMDBDMDAwMDAwMDAwMDAwMDQ2JwkJCSAgICk7CgkJJHVua25vd24zID0gcGFjaygiSCoiLCdGRkZGQURERTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCcpOwoJCSR1bmtub3duNCA9IHBhY2soInYiLCAgMHgwMwkJCQkJCQkJCQkJKTsKCgkJLy8gUGFjayB0aGUgbWFpbiBkYXRhIHN0cmVhbQoJCSRkYXRhCQk9IHBhY2soInZ2dnYiLCAkcm93MSwgJHJvdzIsICRjb2wxLCAkY29sMikgLgoJCQkJCQkgICR1bmtub3duMQkgLgoJCQkJCQkgICRsaW5rX3R5cGUJLgoJCQkJCQkgICR1bmtub3duMgkgLgoJCQkJCQkgICR1cF9jb3VudAkgLgoJCQkJCQkgICRkaXJfc2hvcnRfbGVuLgoJCQkJCQkgICRkaXJfc2hvcnQJLgoJCQkJCQkgICR1bmtub3duMwkgLgoJCQkJCQkgICRzdHJlYW1fbGVuICAgOy8qLgoJCQkJCQkgICRkaXJfbG9uZ19sZW4gLgoJCQkJCQkgICR1bmtub3duNAkgLgoJCQkJCQkgICRkaXJfbG9uZwkgLgoJCQkJCQkgICRzaGVldF9sZW4JLgoJCQkJCQkgICRzaGVldAkJOyovCgoJCS8vIFBhY2sgdGhlIGhlYWRlciBkYXRhCgkJJGxlbmd0aCAgID0gc3RybGVuKCRkYXRhKTsKCQkkaGVhZGVyICAgPSBwYWNrKCJ2diIsICRyZWNvcmQsICRsZW5ndGgpOwoKCQkvLyBXcml0ZSB0aGUgcGFja2VkIGRhdGEKCQkkdGhpcy0+X2FwcGVuZCgkaGVhZGVyLiAkZGF0YSk7CgkJcmV0dXJuIDA7Cgl9CgoJLyoqCgkgKiBUaGlzIG1ldGhvZCBpcyB1c2VkIHRvIHNldCB0aGUgaGVpZ2h0IGFuZCBmb3JtYXQgZm9yIGEgcm93LgoJICoKCSAqIEBwYXJhbSBpbnRlZ2VyICRyb3cJVGhlIHJvdyB0byBzZXQKCSAqIEBwYXJhbSBpbnRlZ2VyICRoZWlnaHQgSGVpZ2h0IHdlIGFyZSBnaXZpbmcgdG8gdGhlIHJvdy4KCSAqCQkJCQkJVXNlIG51bGwgdG8gc2V0IFhGIHdpdGhvdXQgc2V0dGluZyBoZWlnaHQKCSAqIEBwYXJhbSBpbnRlZ2VyICR4ZkluZGV4ICBUaGUgb3B0aW9uYWwgY2VsbCBzdHlsZSBYZiBpbmRleCB0byBhcHBseSB0byB0aGUgY29sdW1ucwoJICogQHBhcmFtIGJvb2wJJGhpZGRlbiBUaGUgb3B0aW9uYWwgaGlkZGVuIGF0dHJpYnV0ZQoJICogQHBhcmFtIGludGVnZXIgJGxldmVsICBUaGUgb3B0aW9uYWwgb3V0bGluZSBsZXZlbCBmb3Igcm93LCBpbiByYW5nZSBbMCw3XQoJICovCglwcml2YXRlIGZ1bmN0aW9uIF93cml0ZVJvdygkcm93LCAkaGVpZ2h0LCAkeGZJbmRleCwgJGhpZGRlbiA9IGZhbHNlLCAkbGV2ZWwgPSAwKQoJewoJCSRyZWNvcmQJICA9IDB4MDIwODsJCQkgICAvLyBSZWNvcmQgaWRlbnRpZmllcgoJCSRsZW5ndGgJICA9IDB4MDAxMDsJCQkgICAvLyBOdW1iZXIgb2YgYnl0ZXMgdG8gZm9sbG93CgoJCSRjb2xNaWMJICA9IDB4MDAwMDsJCQkgICAvLyBGaXJzdCBkZWZpbmVkIGNvbHVtbgoJCSRjb2xNYWMJICA9IDB4MDAwMDsJCQkgICAvLyBMYXN0IGRlZmluZWQgY29sdW1uCgkJJGlyd01hYwkgID0gMHgwMDAwOwkJCSAgIC8vIFVzZWQgYnkgRXhjZWwgdG8gb3B0aW1pc2UgbG9hZGluZwoJCSRyZXNlcnZlZAk9IDB4MDAwMDsJCQkgICAvLyBSZXNlcnZlZAoJCSRncmJpdAkgICA9IDB4MDAwMDsJCQkgICAvLyBPcHRpb24gZmxhZ3MKCQkkaXhmZQkJPSAkeGZJbmRleDsKCgkJaWYgKCAkaGVpZ2h0IDwgMCApewoJCQkkaGVpZ2h0ID0gbnVsbDsKCQl9CgoJCS8vIFVzZSBfd3JpdGVSb3coJHJvdywgbnVsbCwgJFhGKSB0byBzZXQgWEYgZm9ybWF0IHdpdGhvdXQgc2V0dGluZyBoZWlnaHQKCQlpZiAoJGhlaWdodCAhPSBudWxsKSB7CgkJCSRtaXlSdyA9ICRoZWlnaHQgKiAyMDsgIC8vIHJvdyBoZWlnaHQKCQl9IGVsc2UgewoJCQkkbWl5UncgPSAweGZmOwkJICAvLyBkZWZhdWx0IHJvdyBoZWlnaHQgaXMgMjU2CgkJfQoKCQkvLyBTZXQgdGhlIG9wdGlvbnMgZmxhZ3MuIGZVbnN5bmNlZCBpcyB1c2VkIHRvIHNob3cgdGhhdCB0aGUgZm9udCBhbmQgcm93CgkJLy8gaGVpZ2h0cyBhcmUgbm90IGNvbXBhdGlibGUuIFRoaXMgaXMgdXN1YWxseSB0aGUgY2FzZSBmb3IgV3JpdGVFeGNlbC4KCQkvLyBUaGUgY29sbGFwc2VkIGZsYWcgMHgxMCBkb2Vzbid0IHNlZW0gdG8gYmUgdXNlZCB0byBpbmRpY2F0ZSB0aGF0IGEgcm93CgkJLy8gaXMgY29sbGFwc2VkLiBJbnN0ZWFkIGl0IGlzIHVzZWQgdG8gaW5kaWNhdGUgdGhhdCB0aGUgcHJldmlvdXMgcm93IGlzCgkJLy8gY29sbGFwc2VkLiBUaGUgemVybyBoZWlnaHQgZmxhZywgMHgyMCwgaXMgdXNlZCB0byBjb2xsYXBzZSBhIHJvdy4KCgkJJGdyYml0IHw9ICRsZXZlbDsKCQlpZiAoJGhpZGRlbikgewoJCQkkZ3JiaXQgfD0gMHgwMDIwOwoJCX0KCQlpZiAoJGhlaWdodCAhPT0gbnVsbCkgewoJCQkkZ3JiaXQgfD0gMHgwMDQwOyAvLyBmVW5zeW5jZWQKCQl9CgkJaWYgKCR4ZkluZGV4ICE9PSAweEYpIHsKCQkJJGdyYml0IHw9IDB4MDA4MDsKCQl9CgkJJGdyYml0IHw9IDB4MDEwMDsKCgkJJGhlYWRlciAgID0gcGFjaygidnYiLAkgICAkcmVjb3JkLCAkbGVuZ3RoKTsKCQkkZGF0YQkgPSBwYWNrKCJ2dnZ2dnZ2diIsICRyb3csICRjb2xNaWMsICRjb2xNYWMsICRtaXlSdywKCQkJCQkJCQkJICRpcndNYWMsJHJlc2VydmVkLCAkZ3JiaXQsICRpeGZlKTsKCQkkdGhpcy0+X2FwcGVuZCgkaGVhZGVyLiRkYXRhKTsKCX0KCgkvKioKCSAqIFdyaXRlcyBFeGNlbCBESU1FTlNJT05TIHRvIGRlZmluZSB0aGUgYXJlYSBpbiB3aGljaCB0aGVyZSBpcyBkYXRhLgoJICovCglwcml2YXRlIGZ1bmN0aW9uIF93cml0ZURpbWVuc2lvbnMoKQoJewoJCSRyZWNvcmQgPSAweDAyMDA7IC8vIFJlY29yZCBpZGVudGlmaWVyCgoJCSRsZW5ndGggPSAweDAwMEU7CgkJJGRhdGEgPSBwYWNrKCdWVnZ2dicKCQkJCSwgJHRoaXMtPl9maXJzdFJvd0luZGV4CgkJCQksICR0aGlzLT5fbGFzdFJvd0luZGV4ICsgMQoJCQkJLCAkdGhpcy0+X2ZpcnN0Q29sdW1uSW5kZXgKCQkJCSwgJHRoaXMtPl9sYXN0Q29sdW1uSW5kZXggKyAxCgkJCQksIDB4MDAwMCAvLyByZXNlcnZlZAoJCQkpOwoKCQkkaGVhZGVyID0gcGFjaygidnYiLCAkcmVjb3JkLCAkbGVuZ3RoKTsKCQkkdGhpcy0+X2FwcGVuZCgkaGVhZGVyLiRkYXRhKTsKCX0KCgkvKioKCSAqIFdyaXRlIEJJRkYgcmVjb3JkIFdpbmRvdzIuCgkgKi8KCXByaXZhdGUgZnVuY3Rpb24gX3dyaXRlV2luZG93MigpCgl7CgkJJHJlY29yZAkJID0gMHgwMjNFOwkgLy8gUmVjb3JkIGlkZW50aWZpZXIKCQkkbGVuZ3RoCQkgPSAweDAwMTI7CgoJCSRncmJpdAkJICA9IDB4MDBCNjsJIC8vIE9wdGlvbiBmbGFncwoJCSRyd1RvcAkJICA9IDB4MDAwMDsJIC8vIFRvcCByb3cgdmlzaWJsZSBpbiB3aW5kb3cKCQkkY29sTGVmdAkJPSAweDAwMDA7CSAvLyBMZWZ0bW9zdCBjb2x1bW4gdmlzaWJsZSBpbiB3aW5kb3cKCgoJCS8vIFRoZSBvcHRpb25zIGZsYWdzIHRoYXQgY29tcHJpc2UgJGdyYml0CgkJJGZEc3BGbWxhCSAgID0gMDsJCQkJCSAvLyAwIC0gYml0CgkJJGZEc3BHcmlkCSAgID0gJHRoaXMtPl9waHBTaGVldC0+Z2V0U2hvd0dyaWRsaW5lcygpID8gMSA6IDA7IC8vIDEKCQkkZkRzcFJ3Q29sCSAgPSAkdGhpcy0+X3BocFNoZWV0LT5nZXRTaG93Um93Q29sSGVhZGVycygpID8gMSA6IDA7IC8vIDIKCQkkZkZyb3plbgkJPSAkdGhpcy0+X3BocFNoZWV0LT5nZXRGcmVlemVQYW5lKCkgPyAxIDogMDsJCS8vIDMKCQkkZkRzcFplcm9zCSAgPSAxOwkJCQkJIC8vIDQKCQkkZkRlZmF1bHRIZHIJPSAxOwkJCQkJIC8vIDUKCQkkZkFyYWJpYwkJPSAkdGhpcy0+X3BocFNoZWV0LT5nZXRSaWdodFRvTGVmdCgpID8gMSA6IDA7IC8vIDYKCQkkZkRzcEd1dHMJICAgPSAkdGhpcy0+X291dGxpbmVfb247CS8vIDcKCQkkZkZyb3plbk5vU3BsaXQgPSAwOwkJCQkJIC8vIDAgLSBiaXQKCQkvLyBubyBzdXBwb3J0IGluIFBIUEV4Y2VsIGZvciBzZWxlY3RlZCBzaGVldCwgdGhlcmVmb3JlIHNoZWV0IGlzIG9ubHkgc2VsZWN0ZWQgaWYgaXQgaXMgdGhlIGFjdGl2ZSBzaGVldAoJCSRmU2VsZWN0ZWQJICA9ICgkdGhpcy0+X3BocFNoZWV0ID09PSAkdGhpcy0+X3BocFNoZWV0LT5nZXRQYXJlbnQoKS0+Z2V0QWN0aXZlU2hlZXQoKSkgPyAxIDogMDsKCQkkZlBhZ2VkCQkgPSAxOwkJCQkJIC8vIDIKCgkJJGdyYml0CQkJID0gJGZEc3BGbWxhOwoJCSRncmJpdAkJCXw9ICRmRHNwR3JpZAkgICA8PCAxOwoJCSRncmJpdAkJCXw9ICRmRHNwUndDb2wJICA8PCAyOwoJCSRncmJpdAkJCXw9ICRmRnJvemVuCQk8PCAzOwoJCSRncmJpdAkJCXw9ICRmRHNwWmVyb3MJICA8PCA0OwoJCSRncmJpdAkJCXw9ICRmRGVmYXVsdEhkcgk8PCA1OwoJCSRncmJpdAkJCXw9ICRmQXJhYmljCQk8PCA2OwoJCSRncmJpdAkJCXw9ICRmRHNwR3V0cwkgICA8PCA3OwoJCSRncmJpdAkJCXw9ICRmRnJvemVuTm9TcGxpdCA8PCA4OwoJCSRncmJpdAkJCXw9ICRmU2VsZWN0ZWQJICA8PCA5OwoJCSRncmJpdAkJCXw9ICRmUGFnZWQJCSA8PCAxMDsKCgkJJGhlYWRlciAgPSBwYWNrKCJ2diIsICAgJHJlY29yZCwgJGxlbmd0aCk7CgkJJGRhdGEJPSBwYWNrKCJ2dnYiLCAkZ3JiaXQsICRyd1RvcCwgJGNvbExlZnQpOwoKCQkvLyBGSVhNRSAhISEKCQkkcmdiSGRyCSAgID0gMHgwMDQwOyAvLyBSb3cvY29sdW1uIGhlYWRpbmcgYW5kIGdyaWRsaW5lIGNvbG9yIGluZGV4CgkJJHpvb21fZmFjdG9yX3BhZ2VfYnJlYWsgPSAweDAwMDA7CgkJJHpvb21fZmFjdG9yX25vcm1hbAkgPSAweDAwMDA7CgkJJGRhdGEgLj0gcGFjaygidnZ2dlYiLCAkcmdiSGRyLCAweDAwMDAsICR6b29tX2ZhY3Rvcl9wYWdlX2JyZWFrLCAkem9vbV9mYWN0b3Jfbm9ybWFsLCAweDAwMDAwMDAwKTsKCgkJJHRoaXMtPl9hcHBlbmQoJGhlYWRlci4kZGF0YSk7Cgl9CgoJLyoqCgkgKiBXcml0ZSBCSUZGIHJlY29yZCBERUZBVUxUUk9XSEVJR0hULgoJICovCglwcml2YXRlIGZ1bmN0aW9uIF93cml0ZURlZmF1bHRSb3dIZWlnaHQoKQoJewoJCSRkZWZhdWx0Um93SGVpZ2h0ID0gJHRoaXMtPl9waHBTaGVldC0+Z2V0RGVmYXVsdFJvd0RpbWVuc2lvbigpLT5nZXRSb3dIZWlnaHQoKTsKCgkJaWYgKCRkZWZhdWx0Um93SGVpZ2h0IDwgMCkgewoJCQlyZXR1cm47CgkJfQoKCQkvLyBjb252ZXJ0IHRvIHR3aXBzCgkJJGRlZmF1bHRSb3dIZWlnaHQgPSAoaW50KSAyMCAqICRkZWZhdWx0Um93SGVpZ2h0OwoKCQkkcmVjb3JkICAgPSAweDAyMjU7CSAgLy8gUmVjb3JkIGlkZW50aWZpZXIKCQkkbGVuZ3RoICAgPSAweDAwMDQ7CSAgLy8gTnVtYmVyIG9mIGJ5dGVzIHRvIGZvbGxvdwoKCQkkaGVhZGVyICAgPSBwYWNrKCJ2diIsICRyZWNvcmQsICRsZW5ndGgpOwoJCSRkYXRhCSA9IHBhY2soInZ2IiwgIDEsICRkZWZhdWx0Um93SGVpZ2h0KTsKCQkkdGhpcy0+X2FwcGVuZCgkaGVhZGVyIC4gJGRhdGEpOwoJfQoKCS8qKgoJICogV3JpdGUgQklGRiByZWNvcmQgREVGQ09MV0lEVEggaWYgQ09MSU5GTyByZWNvcmRzIGFyZSBpbiB1c2UuCgkgKi8KCXByaXZhdGUgZnVuY3Rpb24gX3dyaXRlRGVmY29sKCkKCXsKCQkkZGVmYXVsdENvbFdpZHRoID0gODsKCgkJJHJlY29yZCAgID0gMHgwMDU1OwkgIC8vIFJlY29yZCBpZGVudGlmaWVyCgkJJGxlbmd0aCAgID0gMHgwMDAyOwkgIC8vIE51bWJlciBvZiBieXRlcyB0byBmb2xsb3cKCgkJJGhlYWRlciA9IHBhY2soInZ2IiwgJHJlY29yZCwgJGxlbmd0aCk7CgkJJGRhdGEgPSBwYWNrKCJ2IiwgJGRlZmF1bHRDb2xXaWR0aCk7CgkJJHRoaXMtPl9hcHBlbmQoJGhlYWRlciAuICRkYXRhKTsKCX0KCgkvKioKCSAqIFdyaXRlIEJJRkYgcmVjb3JkIENPTElORk8gdG8gZGVmaW5lIGNvbHVtbiB3aWR0aHMKCSAqCgkgKiBOb3RlOiBUaGUgU0RLIHNheXMgdGhlIHJlY29yZCBsZW5ndGggaXMgMHgwQiBidXQgRXhjZWwgd3JpdGVzIGEgMHgwQwoJICogbGVuZ3RoIHJlY29yZC4KCSAqCgkgKiBAcGFyYW0gYXJyYXkgJGNvbF9hcnJheSBUaGlzIGlzIHRoZSBvbmx5IHBhcmFtZXRlciByZWNlaXZlZCBhbmQgaXMgY29tcG9zZWQgb2YgdGhlIGZvbGxvd2luZzoKCSAqCQkJCTAgPT4gRmlyc3QgZm9ybWF0dGVkIGNvbHVtbiwKCSAqCQkJCTEgPT4gTGFzdCBmb3JtYXR0ZWQgY29sdW1uLAoJICoJCQkJMiA9PiBDb2wgd2lkdGggKDguNDMgaXMgRXhjZWwgZGVmYXVsdCksCgkgKgkJCQkzID0+IFRoZSBvcHRpb25hbCBYRiBmb3JtYXQgb2YgdGhlIGNvbHVtbiwKCSAqCQkJCTQgPT4gT3B0aW9uIGZsYWdzLgoJICoJCQkJNSA9PiBPcHRpb25hbCBvdXRsaW5lIGxldmVsCgkgKi8KCXByaXZhdGUgZnVuY3Rpb24gX3dyaXRlQ29saW5mbygkY29sX2FycmF5KQoJewoJCWlmIChpc3NldCgkY29sX2FycmF5WzBdKSkgewoJCQkkY29sRmlyc3QgPSAkY29sX2FycmF5WzBdOwoJCX0KCQlpZiAoaXNzZXQoJGNvbF9hcnJheVsxXSkpIHsKCQkJJGNvbExhc3QgPSAkY29sX2FycmF5WzFdOwoJCX0KCQlpZiAoaXNzZXQoJGNvbF9hcnJheVsyXSkpIHsKCQkJJGNvbGR4ID0gJGNvbF9hcnJheVsyXTsKCQl9IGVsc2UgewoJCQkkY29sZHggPSA4LjQzOwoJCX0KCQlpZiAoaXNzZXQoJGNvbF9hcnJheVszXSkpIHsKCQkJJHhmSW5kZXggPSAkY29sX2FycmF5WzNdOwoJCX0gZWxzZSB7CgkJCSR4ZkluZGV4ID0gMTU7CgkJfQoJCWlmIChpc3NldCgkY29sX2FycmF5WzRdKSkgewoJCQkkZ3JiaXQgPSAkY29sX2FycmF5WzRdOwoJCX0gZWxzZSB7CgkJCSRncmJpdCA9IDA7CgkJfQoJCWlmIChpc3NldCgkY29sX2FycmF5WzVdKSkgewoJCQkkbGV2ZWwgPSAkY29sX2FycmF5WzVdOwoJCX0gZWxzZSB7CgkJCSRsZXZlbCA9IDA7CgkJfQoJCSRyZWNvcmQgICA9IDB4MDA3RDsJCSAgLy8gUmVjb3JkIGlkZW50aWZpZXIKCQkkbGVuZ3RoICAgPSAweDAwMEM7CQkgIC8vIE51bWJlciBvZiBieXRlcyB0byBmb2xsb3cKCgkJJGNvbGR4ICAgKj0gMjU2OwkJCSAvLyBDb252ZXJ0IHRvIHVuaXRzIG9mIDEvMjU2IG9mIGEgY2hhcgoKCQkkaXhmZQkgPSAkeGZJbmRleDsKCQkkcmVzZXJ2ZWQgPSAweDAwMDA7CQkJLy8gUmVzZXJ2ZWQKCgkJJGxldmVsID0gbWF4KDAsIG1pbigkbGV2ZWwsIDcpKTsKCQkkZ3JiaXQgfD0gJGxldmVsIDw8IDg7CgoJCSRoZWFkZXIgICA9IHBhY2soInZ2IiwJICRyZWNvcmQsICRsZW5ndGgpOwoJCSRkYXRhCSA9IHBhY2soInZ2dnZ2diIsICRjb2xGaXJzdCwgJGNvbExhc3QsICRjb2xkeCwKCQkJCQkJCQkgICAkaXhmZSwgJGdyYml0LCAkcmVzZXJ2ZWQpOwoJCSR0aGlzLT5fYXBwZW5kKCRoZWFkZXIuJGRhdGEpOwoJfQoKCS8qKgoJICogV3JpdGUgQklGRiByZWNvcmQgU0VMRUNUSU9OLgoJICovCglwcml2YXRlIGZ1bmN0aW9uIF93cml0ZVNlbGVjdGlvbigpCgl7CgkJLy8gbG9vayB1cCB0aGUgc2VsZWN0ZWQgY2VsbCByYW5nZQoJCSRzZWxlY3RlZENlbGxzID0gJHRoaXMtPl9waHBTaGVldC0+Z2V0U2VsZWN0ZWRDZWxscygpOwoJCSRzZWxlY3RlZENlbGxzID0gUEhQRXhjZWxfQ2VsbDo6c3BsaXRSYW5nZSgkdGhpcy0+X3BocFNoZWV0LT5nZXRTZWxlY3RlZENlbGxzKCkpOwoJCSRzZWxlY3RlZENlbGxzID0gJHNlbGVjdGVkQ2VsbHNbMF07CgkJaWYgKGNvdW50KCRzZWxlY3RlZENlbGxzKSA9PSAyKSB7CgkJCWxpc3QoJGZpcnN0LCAkbGFzdCkgPSAkc2VsZWN0ZWRDZWxsczsKCQl9IGVsc2UgewoJCQkkZmlyc3QgPSAkc2VsZWN0ZWRDZWxsc1swXTsKCQkJJGxhc3QgID0gJHNlbGVjdGVkQ2VsbHNbMF07CgkJfQoKCQlsaXN0KCRjb2xGaXJzdCwgJHJ3Rmlyc3QpID0gUEhQRXhjZWxfQ2VsbDo6Y29vcmRpbmF0ZUZyb21TdHJpbmcoJGZpcnN0KTsKCQkkY29sRmlyc3QgPSBQSFBFeGNlbF9DZWxsOjpjb2x1bW5JbmRleEZyb21TdHJpbmcoJGNvbEZpcnN0KSAtIDE7IC8vIGJhc2UgMCBjb2x1bW4gaW5kZXgKCQktLSRyd0ZpcnN0OyAvLyBiYXNlIDAgcm93IGluZGV4CgoJCWxpc3QoJGNvbExhc3QsICRyd0xhc3QpID0gUEhQRXhjZWxfQ2VsbDo6Y29vcmRpbmF0ZUZyb21TdHJpbmcoJGxhc3QpOwoJCSRjb2xMYXN0ID0gUEhQRXhjZWxfQ2VsbDo6Y29sdW1uSW5kZXhGcm9tU3RyaW5nKCRjb2xMYXN0KSAtIDE7IC8vIGJhc2UgMCBjb2x1bW4gaW5kZXgKCQktLSRyd0xhc3Q7IC8vIGJhc2UgMCByb3cgaW5kZXgKCgkJLy8gbWFrZSBzdXJlIHdlIGFyZSBub3Qgb3V0IG9mIGJvdW5kcwoJCSRjb2xGaXJzdCA9IG1pbigkY29sRmlyc3QsIDI1NSk7CgkJJGNvbExhc3QgID0gbWluKCRjb2xMYXN0LCAgMjU1KTsKCgkJJHJ3Rmlyc3QgPSBtaW4oJHJ3Rmlyc3QsIDY1NTM1KTsKCQkkcndMYXN0ICA9IG1pbigkcndMYXN0LCAgNjU1MzUpOwoKCQkkcmVjb3JkICAgPSAweDAwMUQ7CQkJCSAgLy8gUmVjb3JkIGlkZW50aWZpZXIKCQkkbGVuZ3RoICAgPSAweDAwMEY7CQkJCSAgLy8gTnVtYmVyIG9mIGJ5dGVzIHRvIGZvbGxvdwoKCQkkcG5uCSAgPSAkdGhpcy0+X2FjdGl2ZV9wYW5lOwkgLy8gUGFuZSBwb3NpdGlvbgoJCSRyd0FjdAk9ICRyd0ZpcnN0OwkJCQkvLyBBY3RpdmUgcm93CgkJJGNvbEFjdCAgID0gJGNvbEZpcnN0OwkJCSAgIC8vIEFjdGl2ZSBjb2x1bW4KCQkkaXJlZkFjdCAgPSAwOwkJCQkJICAgLy8gQWN0aXZlIGNlbGwgcmVmCgkJJGNyZWYJID0gMTsJCQkJCSAgIC8vIE51bWJlciBvZiByZWZzCgoJCWlmICghaXNzZXQoJHJ3TGFzdCkpIHsKCQkJJHJ3TGFzdCAgID0gJHJ3Rmlyc3Q7CSAgIC8vIExhc3QgIHJvdyBpbiByZWZlcmVuY2UKCQl9CgkJaWYgKCFpc3NldCgkY29sTGFzdCkpIHsKCQkJJGNvbExhc3QgID0gJGNvbEZpcnN0OwkgIC8vIExhc3QgIGNvbCBpbiByZWZlcmVuY2UKCQl9CgoJCS8vIFN3YXAgbGFzdCByb3cvY29sIGZvciBmaXJzdCByb3cvY29sIGFzIG5lY2Vzc2FyeQoJCWlmICgkcndGaXJzdCA+ICRyd0xhc3QpIHsKCQkJbGlzdCgkcndGaXJzdCwgJHJ3TGFzdCkgPSBhcnJheSgkcndMYXN0LCAkcndGaXJzdCk7CgkJfQoKCQlpZiAoJGNvbEZpcnN0ID4gJGNvbExhc3QpIHsKCQkJbGlzdCgkY29sRmlyc3QsICRjb2xMYXN0KSA9IGFycmF5KCRjb2xMYXN0LCAkY29sRmlyc3QpOwoJCX0KCgkJJGhlYWRlciAgID0gcGFjaygidnYiLAkJICRyZWNvcmQsICRsZW5ndGgpOwoJCSRkYXRhCSA9IHBhY2soIkN2dnZ2dnZDQyIsICAkcG5uLCAkcndBY3QsICRjb2xBY3QsCgkJCQkJCQkJCSAgICRpcmVmQWN0LCAkY3JlZiwKCQkJCQkJCQkJICAgJHJ3Rmlyc3QsICRyd0xhc3QsCgkJCQkJCQkJCSAgICRjb2xGaXJzdCwgJGNvbExhc3QpOwoJCSR0aGlzLT5fYXBwZW5kKCRoZWFkZXIgLiAkZGF0YSk7Cgl9CgoJLyoqCgkgKiBTdG9yZSB0aGUgTUVSR0VEQ0VMTFMgcmVjb3JkcyBmb3IgYWxsIHJhbmdlcyBvZiBtZXJnZWQgY2VsbHMKCSAqLwoJcHJpdmF0ZSBmdW5jdGlvbiBfd3JpdGVNZXJnZWRDZWxscygpCgl7CgkJJG1lcmdlQ2VsbHMgPSAkdGhpcy0+X3BocFNoZWV0LT5nZXRNZXJnZUNlbGxzKCk7CgkJJGNvdW50TWVyZ2VDZWxscyA9IGNvdW50KCRtZXJnZUNlbGxzKTsKCgkJaWYgKCRjb3VudE1lcmdlQ2VsbHMgPT0gMCkgewoJCQlyZXR1cm47CgkJfQoKCQkvLyBtYXhpbXVtIGFsbG93ZWQgbnVtYmVyIG9mIG1lcmdlZCBjZWxscyBwZXIgcmVjb3JkCgkJJG1heENvdW50TWVyZ2VDZWxsc1BlclJlY29yZCA9IDEwMjc7CgoJCS8vIHJlY29yZCBpZGVudGlmaWVyCgkJJHJlY29yZCA9IDB4MDBFNTsKCgkJLy8gY291bnRlciBmb3IgdG90YWwgbnVtYmVyIG9mIG1lcmdlZCBjZWxscyB0cmVhdGVkIHNvIGZhciBieSB0aGUgd3JpdGVyCgkJJGkgPSAwOwoKCQkvLyBjb3VudGVyIGZvciBudW1iZXIgb2YgbWVyZ2VkIGNlbGxzIHdyaXR0ZW4gaW4gcmVjb3JkIGN1cnJlbnRseSBiZWluZyB3cml0dGVuCgkJJGogPSAwOwoKCQkvLyBpbml0aWFsaXplIHJlY29yZCBkYXRhCgkJJHJlY29yZERhdGEgPSAnJzsKCgkJLy8gbG9vcCB0aHJvdWdoIHRoZSBtZXJnZWQgY2VsbHMKCQlmb3JlYWNoICgkbWVyZ2VDZWxscyBhcyAkbWVyZ2VDZWxsKSB7CgkJCSsrJGk7CgkJCSsrJGo7CgoJCQkvLyBleHRyYWN0IHRoZSByb3cgYW5kIGNvbHVtbiBpbmRleGVzCgkJCSRyYW5nZSA9IFBIUEV4Y2VsX0NlbGw6OnNwbGl0UmFuZ2UoJG1lcmdlQ2VsbCk7CgkJCWxpc3QoJGZpcnN0LCAkbGFzdCkgPSAkcmFuZ2VbMF07CgkJCWxpc3QoJGZpcnN0Q29sdW1uLCAkZmlyc3RSb3cpID0gUEhQRXhjZWxfQ2VsbDo6Y29vcmRpbmF0ZUZyb21TdHJpbmcoJGZpcnN0KTsKCQkJbGlzdCgkbGFzdENvbHVtbiwgJGxhc3RSb3cpID0gUEhQRXhjZWxfQ2VsbDo6Y29vcmRpbmF0ZUZyb21TdHJpbmcoJGxhc3QpOwoKCQkJJHJlY29yZERhdGEgLj0gcGFjaygndnZ2dicsICRmaXJzdFJvdyAtIDEsICRsYXN0Um93IC0gMSwgUEhQRXhjZWxfQ2VsbDo6Y29sdW1uSW5kZXhGcm9tU3RyaW5nKCRmaXJzdENvbHVtbikgLSAxLCBQSFBFeGNlbF9DZWxsOjpjb2x1bW5JbmRleEZyb21TdHJpbmcoJGxhc3RDb2x1bW4pIC0gMSk7CgoJCQkvLyBmbHVzaCByZWNvcmQgaWYgd2UgaGF2ZSByZWFjaGVkIGxpbWl0IGZvciBudW1iZXIgb2YgbWVyZ2VkIGNlbGxzLCBvciByZWFjaGVkIGZpbmFsIG1lcmdlZCBjZWxsCgkJCWlmICgkaiA9PSAkbWF4Q291bnRNZXJnZUNlbGxzUGVyUmVjb3JkIG9yICRpID09ICRjb3VudE1lcmdlQ2VsbHMpIHsKCQkJCSRyZWNvcmREYXRhID0gcGFjaygndicsICRqKSAuICRyZWNvcmREYXRhOwoJCQkJJGxlbmd0aCA9IHN0cmxlbigkcmVjb3JkRGF0YSk7CgkJCQkkaGVhZGVyID0gcGFjaygndnYnLCAkcmVjb3JkLCAkbGVuZ3RoKTsKCQkJCSR0aGlzLT5fYXBwZW5kKCRoZWFkZXIgLiAkcmVjb3JkRGF0YSk7CgoJCQkJLy8gaW5pdGlhbGl6ZSBmb3IgbmV4dCByZWNvcmQsIGlmIGFueQoJCQkJJHJlY29yZERhdGEgPSAnJzsKCQkJCSRqID0gMDsKCQkJfQoJCX0KCX0KCgkvKioKCSAqIFdyaXRlIFNIRUVUTEFZT1VUIHJlY29yZAoJICovCglwcml2YXRlIGZ1bmN0aW9uIF93cml0ZVNoZWV0TGF5b3V0KCkKCXsKCQlpZiAoISR0aGlzLT5fcGhwU2hlZXQtPmlzVGFiQ29sb3JTZXQoKSkgewoJCQlyZXR1cm47CgkJfQoKCQkkcmVjb3JkRGF0YSA9IHBhY2soCgkJCSd2dlZWVnZ2JwoJCQksIDB4MDg2MgoJCQksIDB4MDAwMAkJLy8gdW51c2VkCgkJCSwgMHgwMDAwMDAwMAkvLyB1bnVzZWQKCQkJLCAweDAwMDAwMDAwCS8vIHVudXNlZAoJCQksIDB4MDAwMDAwMTQJLy8gc2l6ZSBvZiByZWNvcmQgZGF0YQoJCQksICR0aGlzLT5fY29sb3JzWyR0aGlzLT5fcGhwU2hlZXQtPmdldFRhYkNvbG9yKCktPmdldFJHQigpXQkvLyBjb2xvciBpbmRleAoJCQksIDB4MDAwMAkJLy8gdW51c2VkCgkJKTsKCgkJJGxlbmd0aCA9IHN0cmxlbigkcmVjb3JkRGF0YSk7CgoJCSRyZWNvcmQgPSAweDA4NjI7IC8vIFJlY29yZCBpZGVudGlmaWVyCgkJJGhlYWRlciA9IHBhY2soJ3Z2JywgJHJlY29yZCwgJGxlbmd0aCk7CgkJJHRoaXMtPl9hcHBlbmQoJGhlYWRlciAuICRyZWNvcmREYXRhKTsKCX0KCgkvKioKCSAqIFdyaXRlIFNIRUVUUFJPVEVDVElPTgoJICovCglwcml2YXRlIGZ1bmN0aW9uIF93cml0ZVNoZWV0UHJvdGVjdGlvbigpCgl7CgkJLy8gcmVjb3JkIGlkZW50aWZpZXIKCQkkcmVjb3JkID0gMHgwODY3OwoKCQkvLyBwcmVwYXJlIG9wdGlvbnMKCQkkb3B0aW9ucyAgPSAgIChpbnQpICEkdGhpcy0+X3BocFNoZWV0LT5nZXRQcm90ZWN0aW9uKCktPmdldE9iamVjdHMoKQoJCQkJCXwgKGludCkgISR0aGlzLT5fcGhwU2hlZXQtPmdldFByb3RlY3Rpb24oKS0+Z2V0U2NlbmFyaW9zKCkgICAgICAgICAgIDw8IDEKCQkJCQl8IChpbnQpICEkdGhpcy0+X3BocFNoZWV0LT5nZXRQcm90ZWN0aW9uKCktPmdldEZvcm1hdENlbGxzKCkgICAgICAgICA8PCAyCgkJCQkJfCAoaW50KSAhJHRoaXMtPl9waHBTaGVldC0+Z2V0UHJvdGVjdGlvbigpLT5nZXRGb3JtYXRDb2x1bW5zKCkgICAgICAgPDwgMwoJCQkJCXwgKGludCkgISR0aGlzLT5fcGhwU2hlZXQtPmdldFByb3RlY3Rpb24oKS0+Z2V0Rm9ybWF0Um93cygpICAgICAgICAgIDw8IDQKCQkJCQl8IChpbnQpICEkdGhpcy0+X3BocFNoZWV0LT5nZXRQcm90ZWN0aW9uKCktPmdldEluc2VydENvbHVtbnMoKSAgICAgICA8PCA1CgkJCQkJfCAoaW50KSAhJHRoaXMtPl9waHBTaGVldC0+Z2V0UHJvdGVjdGlvbigpLT5nZXRJbnNlcnRSb3dzKCkgICAgICAgICAgPDwgNgoJCQkJCXwgKGludCkgISR0aGlzLT5fcGhwU2hlZXQtPmdldFByb3RlY3Rpb24oKS0+Z2V0SW5zZXJ0SHlwZXJsaW5rcygpICAgIDw8IDcKCQkJCQl8IChpbnQpICEkdGhpcy0+X3BocFNoZWV0LT5nZXRQcm90ZWN0aW9uKCktPmdldERlbGV0ZUNvbHVtbnMoKSAgICAgICA8PCA4CgkJCQkJfCAoaW50KSAhJHRoaXMtPl9waHBTaGVldC0+Z2V0UHJvdGVjdGlvbigpLT5nZXREZWxldGVSb3dzKCkgICAgICAgICAgPDwgOQoJCQkJCXwgKGludCkgISR0aGlzLT5fcGhwU2hlZXQtPmdldFByb3RlY3Rpb24oKS0+Z2V0U2VsZWN0TG9ja2VkQ2VsbHMoKSAgIDw8IDEwCgkJCQkJfCAoaW50KSAhJHRoaXMtPl9waHBTaGVldC0+Z2V0UHJvdGVjdGlvbigpLT5nZXRTb3J0KCkgICAgICAgICAgICAgICAgPDwgMTEKCQkJCQl8IChpbnQpICEkdGhpcy0+X3BocFNoZWV0LT5nZXRQcm90ZWN0aW9uKCktPmdldEF1dG9GaWx0ZXIoKSAgICAgICAgICA8PCAxMgoJCQkJCXwgKGludCkgISR0aGlzLT5fcGhwU2hlZXQtPmdldFByb3RlY3Rpb24oKS0+Z2V0UGl2b3RUYWJsZXMoKSAgICAgICAgIDw8IDEzCgkJCQkJfCAoaW50KSAhJHRoaXMtPl9waHBTaGVldC0+Z2V0UHJvdGVjdGlvbigpLT5nZXRTZWxlY3RVbmxvY2tlZENlbGxzKCkgPDwgMTQgOwoKCQkvLyByZWNvcmQgZGF0YQoJCSRyZWNvcmREYXRhID0gcGFjaygKCQkJJ3ZWVkNWVnZ2JwoJCQksIDB4MDg2NwkJLy8gcmVwZWF0ZWQgcmVjb3JkIGlkZW50aWZpZXIKCQkJLCAweDAwMDAJCS8vIG5vdCB1c2VkCgkJCSwgMHgwMDAwCQkvLyBub3QgdXNlZAoJCQksIDB4MDAJCQkvLyBub3QgdXNlZAoJCQksIDB4MDEwMDAyMDAJLy8gdW5rbm93biBkYXRhCgkJCSwgMHhGRkZGRkZGRgkvLyB1bmtub3duIGRhdGEKCQkJLCAkb3B0aW9ucwkJLy8gb3B0aW9ucwoJCQksIDB4MDAwMAkJLy8gbm90IHVzZWQKCQkpOwoKCQkkbGVuZ3RoID0gc3RybGVuKCRyZWNvcmREYXRhKTsKCQkkaGVhZGVyID0gcGFjaygndnYnLCAkcmVjb3JkLCAkbGVuZ3RoKTsKCgkJJHRoaXMtPl9hcHBlbmQoJGhlYWRlciAuICRyZWNvcmREYXRhKTsKCX0KCgkvKioKCSAqIFdyaXRlIEJJRkYgcmVjb3JkIFJBTkdFUFJPVEVDVElPTgoJICoKCSAqIE9wZW5vZmZpY2Uub3JnJ3MgRG9jdW1lbnRhaW9uIG9mIHRoZSBNaWNyb3NvZnQgRXhjZWwgRmlsZSBGb3JtYXQgdXNlcyB0ZXJtIFJBTkdFUFJPVEVDVElPTiBmb3IgdGhlc2UgcmVjb3JkcwoJICogTWljcm9zb2Z0IE9mZmljZSBFeGNlbCA5Ny0yMDA3IEJpbmFyeSBGaWxlIEZvcm1hdCBTcGVjaWZpY2F0aW9uIHVzZXMgdGVybSBGRUFUIGZvciB0aGVzZSByZWNvcmRzCgkgKi8KCXByaXZhdGUgZnVuY3Rpb24gX3dyaXRlUmFuZ2VQcm90ZWN0aW9uKCkKCXsKCQlmb3JlYWNoICgkdGhpcy0+X3BocFNoZWV0LT5nZXRQcm90ZWN0ZWRDZWxscygpIGFzICRyYW5nZSA9PiAkcGFzc3dvcmQpIHsKCQkJLy8gbnVtYmVyIG9mIHJhbmdlcywgZS5nLiAnQTE6QjMgQzIwOkQyNScKCQkJJGNlbGxSYW5nZXMgPSBleHBsb2RlKCcgJywgJHJhbmdlKTsKCQkJJGNyZWYgPSBjb3VudCgkY2VsbFJhbmdlcyk7CgoJCQkkcmVjb3JkRGF0YSA9IHBhY2soCgkJCQkndnZWVnZDVnZWdicsCgkJCQkweDA4NjgsCgkJCQkweDAwLAoJCQkJMHgwMDAwLAoJCQkJMHgwMDAwLAoJCQkJMHgwMiwKCQkJCTB4MCwKCQkJCTB4MDAwMCwKCQkJCSRjcmVmLAoJCQkJMHgwMDAwLAoJCQkJMHgwMAoJCQkpOwoKCQkJZm9yZWFjaCAoJGNlbGxSYW5nZXMgYXMgJGNlbGxSYW5nZSkgewoJCQkJJHJlY29yZERhdGEgLj0gJHRoaXMtPl93cml0ZUJJRkY4Q2VsbFJhbmdlQWRkcmVzc0ZpeGVkKCRjZWxsUmFuZ2UpOwoJCQl9CgoJCQkvLyB0aGUgcmdiRmVhdCBzdHJ1Y3R1cmUKCQkJJHJlY29yZERhdGEgLj0gcGFjaygKCQkJCSdWVicsCgkJCQkweDAwMDAsCgkJCQloZXhkZWMoJHBhc3N3b3JkKQoJCQkpOwoKCQkJJHJlY29yZERhdGEgLj0gUEhQRXhjZWxfU2hhcmVkX1N0cmluZzo6VVRGOHRvQklGRjhVbmljb2RlTG9uZygncCcgLiBtZDUoJHJlY29yZERhdGEpKTsKCgkJCSRsZW5ndGggPSBzdHJsZW4oJHJlY29yZERhdGEpOwoKCQkJJHJlY29yZCA9IDB4MDg2ODsJCS8vIFJlY29yZCBpZGVudGlmaWVyCgkJCSRoZWFkZXIgPSBwYWNrKCJ2diIsICRyZWNvcmQsICRsZW5ndGgpOwoJCQkkdGhpcy0+X2FwcGVuZCgkaGVhZGVyIC4gJHJlY29yZERhdGEpOwoJCX0KCX0KCgkvKioKCSAqIFdyaXRlIEJJRkYgcmVjb3JkIEVYVEVSTkNPVU5UIHRvIGluZGljYXRlIHRoZSBudW1iZXIgb2YgZXh0ZXJuYWwgc2hlZXQKCSAqIHJlZmVyZW5jZXMgaW4gYSB3b3Jrc2hlZXQuCgkgKgoJICogRXhjZWwgb25seSBzdG9yZXMgcmVmZXJlbmNlcyB0byBleHRlcm5hbCBzaGVldHMgdGhhdCBhcmUgdXNlZCBpbiBmb3JtdWxhcy4KCSAqIEZvciBzaW1wbGljaXR5IHdlIHN0b3JlIHJlZmVyZW5jZXMgdG8gYWxsIHRoZSBzaGVldHMgaW4gdGhlIHdvcmtib29rCgkgKiByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhleSBhcmUgdXNlZCBvciBub3QuIFRoaXMgcmVkdWNlcyB0aGUgb3ZlcmFsbAoJICogY29tcGxleGl0eSBhbmQgZWxpbWluYXRlcyB0aGUgbmVlZCBmb3IgYSB0d28gd2F5IGRpYWxvZ3VlIGJldHdlZW4gdGhlIGZvcm11bGEKCSAqIHBhcnNlciB0aGUgd29ya3NoZWV0IG9iamVjdHMuCgkgKgoJICogQHBhcmFtIGludGVnZXIgJGNvdW50IFRoZSBudW1iZXIgb2YgZXh0ZXJuYWwgc2hlZXQgcmVmZXJlbmNlcyBpbiB0aGlzIHdvcmtzaGVldAoJICovCglwcml2YXRlIGZ1bmN0aW9uIF93cml0ZUV4dGVybmNvdW50KCRjb3VudCkKCXsKCQkkcmVjb3JkID0gMHgwMDE2OwkJICAvLyBSZWNvcmQgaWRlbnRpZmllcgoJCSRsZW5ndGggPSAweDAwMDI7CQkgIC8vIE51bWJlciBvZiBieXRlcyB0byBmb2xsb3cKCgkJJGhlYWRlciA9IHBhY2soInZ2IiwgJHJlY29yZCwgJGxlbmd0aCk7CgkJJGRhdGEgICA9IHBhY2soInYiLCAgJGNvdW50KTsKCQkkdGhpcy0+X2FwcGVuZCgkaGVhZGVyIC4gJGRhdGEpOwoJfQoKCS8qKgoJICogV3JpdGVzIHRoZSBFeGNlbCBCSUZGIEVYVEVSTlNIRUVUIHJlY29yZC4gVGhlc2UgcmVmZXJlbmNlcyBhcmUgdXNlZCBieQoJICogZm9ybXVsYXMuIEEgZm9ybXVsYSByZWZlcmVuY2VzIGEgc2hlZXQgbmFtZSB2aWEgYW4gaW5kZXguIFNpbmNlIHdlIHN0b3JlIGEKCSAqIHJlZmVyZW5jZSB0byBhbGwgb2YgdGhlIGV4dGVybmFsIHdvcmtzaGVldHMgdGhlIEVYVEVSTlNIRUVUIGluZGV4IGlzIHRoZSBzYW1lCgkgKiBhcyB0aGUgd29ya3NoZWV0IGluZGV4LgoJICoKCSAqIEBwYXJhbSBzdHJpbmcgJHNoZWV0bmFtZSBUaGUgbmFtZSBvZiBhIGV4dGVybmFsIHdvcmtzaGVldAoJICovCglwcml2YXRlIGZ1bmN0aW9uIF93cml0ZUV4dGVybnNoZWV0KCRzaGVldG5hbWUpCgl7CgkJJHJlY29yZAk9IDB4MDAxNzsJCSAvLyBSZWNvcmQgaWRlbnRpZmllcgoKCQkvLyBSZWZlcmVuY2VzIHRvIHRoZSBjdXJyZW50IHNoZWV0IGFyZSBlbmNvZGVkIGRpZmZlcmVudGx5IHRvIHJlZmVyZW5jZXMgdG8KCQkvLyBleHRlcm5hbCBzaGVldHMuCgkJLy8KCQlpZiAoJHRoaXMtPl9waHBTaGVldC0+Z2V0VGl0bGUoKSA9PSAkc2hlZXRuYW1lKSB7CgkJCSRzaGVldG5hbWUgPSAnJzsKCQkJJGxlbmd0aAk9IDB4MDI7ICAvLyBUaGUgZm9sbG93aW5nIDIgYnl0ZXMKCQkJJGNjaAkgICA9IDE7CSAvLyBUaGUgZm9sbG93aW5nIGJ5dGUKCQkJJHJnY2gJICA9IDB4MDI7ICAvLyBTZWxmIHJlZmVyZW5jZQoJCX0gZWxzZSB7CgkJCSRsZW5ndGgJPSAweDAyICsgc3RybGVuKCRzaGVldG5hbWUpOwoJCQkkY2NoCSAgID0gc3RybGVuKCRzaGVldG5hbWUpOwoJCQkkcmdjaAkgID0gMHgwMzsgIC8vIFJlZmVyZW5jZSB0byBhIHNoZWV0IGluIHRoZSBjdXJyZW50IHdvcmtib29rCgkJfQoKCQkkaGVhZGVyID0gcGFjaygidnYiLCAgJHJlY29yZCwgJGxlbmd0aCk7CgkJJGRhdGEgICA9IHBhY2soIkNDIiwgJGNjaCwgJHJnY2gpOwoJCSR0aGlzLT5fYXBwZW5kKCRoZWFkZXIgLiAkZGF0YSAuICRzaGVldG5hbWUpOwoJfQoKCS8qKgoJICogV3JpdGVzIHRoZSBFeGNlbCBCSUZGIFBBTkUgcmVjb3JkLgoJICogVGhlIHBhbmVzIGNhbiBlaXRoZXIgYmUgZnJvemVuIG9yIHRoYXdlZCAodW5mcm96ZW4pLgoJICogRnJvemVuIHBhbmVzIGFyZSBzcGVjaWZpZWQgaW4gdGVybXMgb2YgYW4gaW50ZWdlciBudW1iZXIgb2Ygcm93cyBhbmQgY29sdW1ucy4KCSAqIFRoYXdlZCBwYW5lcyBhcmUgc3BlY2lmaWVkIGluIHRlcm1zIG9mIEV4Y2VsJ3MgdW5pdHMgZm9yIHJvd3MgYW5kIGNvbHVtbnMuCgkgKi8KCXByaXZhdGUgZnVuY3Rpb24gX3dyaXRlUGFuZXMoKQoJewoJCSRwYW5lcyA9IGFycmF5KCk7CgkJaWYgKCRmcmVlemVQYW5lID0gJHRoaXMtPl9waHBTaGVldC0+Z2V0RnJlZXplUGFuZSgpKSB7CgkJCWxpc3QoJGNvbHVtbiwgJHJvdykgPSBQSFBFeGNlbF9DZWxsOjpjb29yZGluYXRlRnJvbVN0cmluZygkZnJlZXplUGFuZSk7CgkJCSRwYW5lc1swXSA9ICRyb3cgLSAxOwoJCQkkcGFuZXNbMV0gPSBQSFBFeGNlbF9DZWxsOjpjb2x1bW5JbmRleEZyb21TdHJpbmcoJGNvbHVtbikgLSAxOwoJCX0gZWxzZSB7CgkJCS8vIHRoYXcgcGFuZXMKCQkJcmV0dXJuOwoJCX0KCgkJJHkJICAgPSBpc3NldCgkcGFuZXNbMF0pID8gJHBhbmVzWzBdIDogbnVsbDsKCQkkeAkgICA9IGlzc2V0KCRwYW5lc1sxXSkgPyAkcGFuZXNbMV0gOiBudWxsOwoJCSRyd1RvcCAgID0gaXNzZXQoJHBhbmVzWzJdKSA/ICRwYW5lc1syXSA6IG51bGw7CgkJJGNvbExlZnQgPSBpc3NldCgkcGFuZXNbM10pID8gJHBhbmVzWzNdIDogbnVsbDsKCQlpZiAoY291bnQoJHBhbmVzKSA+IDQpIHsgLy8gaWYgQWN0aXZlIHBhbmUgd2FzIHJlY2VpdmVkCgkJCSRwbm5BY3QgPSAkcGFuZXNbNF07CgkJfSBlbHNlIHsKCQkJJHBubkFjdCA9IG51bGw7CgkJfQoJCSRyZWNvcmQgID0gMHgwMDQxOwkgICAvLyBSZWNvcmQgaWRlbnRpZmllcgoJCSRsZW5ndGggID0gMHgwMDBBOwkgICAvLyBOdW1iZXIgb2YgYnl0ZXMgdG8gZm9sbG93CgoJCS8vIENvZGUgc3BlY2lmaWMgdG8gZnJvemVuIG9yIHRoYXdlZCBwYW5lcy4KCQlpZiAoJHRoaXMtPl9waHBTaGVldC0+Z2V0RnJlZXplUGFuZSgpKSB7CgkJCS8vIFNldCBkZWZhdWx0IHZhbHVlcyBmb3IgJHJ3VG9wIGFuZCAkY29sTGVmdAoJCQlpZiAoIWlzc2V0KCRyd1RvcCkpIHsKCQkJCSRyd1RvcCAgID0gJHk7CgkJCX0KCQkJaWYgKCFpc3NldCgkY29sTGVmdCkpIHsKCQkJCSRjb2xMZWZ0ID0gJHg7CgkJCX0KCQl9IGVsc2UgewoJCQkvLyBTZXQgZGVmYXVsdCB2YWx1ZXMgZm9yICRyd1RvcCBhbmQgJGNvbExlZnQKCQkJaWYgKCFpc3NldCgkcndUb3ApKSB7CgkJCQkkcndUb3AgICA9IDA7CgkJCX0KCQkJaWYgKCFpc3NldCgkY29sTGVmdCkpIHsKCQkJCSRjb2xMZWZ0ID0gMDsKCQkJfQoKCQkJLy8gQ29udmVydCBFeGNlbCdzIHJvdyBhbmQgY29sdW1uIHVuaXRzIHRvIHRoZSBpbnRlcm5hbCB1bml0cy4KCQkJLy8gVGhlIGRlZmF1bHQgcm93IGhlaWdodCBpcyAxMi43NQoJCQkvLyBUaGUgZGVmYXVsdCBjb2x1bW4gd2lkdGggaXMgOC40MwoJCQkvLyBUaGUgZm9sbG93aW5nIHNsb3BlIGFuZCBpbnRlcnNlY3Rpb24gdmFsdWVzIHdlcmUgaW50ZXJwb2xhdGVkLgoJCQkvLwoJCQkkeSA9IDIwKiR5ICsgMjU1OwoJCQkkeCA9IDExMy44NzkqJHggKyAzOTA7CgkJfQoKCgkJLy8gRGV0ZXJtaW5lIHdoaWNoIHBhbmUgc2hvdWxkIGJlIGFjdGl2ZS4gVGhlcmUgaXMgYWxzbyB0aGUgdW5kb2N1bWVudGVkCgkJLy8gb3B0aW9uIHRvIG92ZXJyaWRlIHRoaXMgc2hvdWxkIGl0IGJlIG5lY2Vzc2FyeTogbWF5IGJlIHJlbW92ZWQgbGF0ZXIuCgkJLy8KCQlpZiAoIWlzc2V0KCRwbm5BY3QpKSB7CgkJCWlmICgkeCAhPSAwICYmICR5ICE9IDApIHsKCQkJCSRwbm5BY3QgPSAwOyAvLyBCb3R0b20gcmlnaHQKCQkJfQoJCQlpZiAoJHggIT0gMCAmJiAkeSA9PSAwKSB7CgkJCQkkcG5uQWN0ID0gMTsgLy8gVG9wIHJpZ2h0CgkJCX0KCQkJaWYgKCR4ID09IDAgJiYgJHkgIT0gMCkgewoJCQkJJHBubkFjdCA9IDI7IC8vIEJvdHRvbSBsZWZ0CgkJCX0KCQkJaWYgKCR4ID09IDAgJiYgJHkgPT0gMCkgewoJCQkJJHBubkFjdCA9IDM7IC8vIFRvcCBsZWZ0CgkJCX0KCQl9CgoJCSR0aGlzLT5fYWN0aXZlX3BhbmUgPSAkcG5uQWN0OyAvLyBVc2VkIGluIF93cml0ZVNlbGVjdGlvbgoKCQkkaGVhZGVyCSA9IHBhY2soInZ2IiwJJHJlY29yZCwgJGxlbmd0aCk7CgkJJGRhdGEJICAgPSBwYWNrKCJ2dnZ2diIsICR4LCAkeSwgJHJ3VG9wLCAkY29sTGVmdCwgJHBubkFjdCk7CgkJJHRoaXMtPl9hcHBlbmQoJGhlYWRlciAuICRkYXRhKTsKCX0KCgkvKioKCSAqIFN0b3JlIHRoZSBwYWdlIHNldHVwIFNFVFVQIEJJRkYgcmVjb3JkLgoJICovCglwcml2YXRlIGZ1bmN0aW9uIF93cml0ZVNldHVwKCkKCXsKCQkkcmVjb3JkCSAgID0gMHgwMEExOwkJCQkgIC8vIFJlY29yZCBpZGVudGlmaWVyCgkJJGxlbmd0aAkgICA9IDB4MDAyMjsJCQkJICAvLyBOdW1iZXIgb2YgYnl0ZXMgdG8gZm9sbG93CgoJCSRpUGFwZXJTaXplICAgPSAkdGhpcy0+X3BocFNoZWV0LT5nZXRQYWdlU2V0dXAoKS0+Z2V0UGFwZXJTaXplKCk7CS8vIFBhcGVyIHNpemUKCgkJJGlTY2FsZSA9ICR0aGlzLT5fcGhwU2hlZXQtPmdldFBhZ2VTZXR1cCgpLT5nZXRTY2FsZSgpID8KCQkJJHRoaXMtPl9waHBTaGVldC0+Z2V0UGFnZVNldHVwKCktPmdldFNjYWxlKCkgOiAxMDA7ICAgLy8gUHJpbnQgc2NhbGluZyBmYWN0b3IKCgkJJGlQYWdlU3RhcnQgICA9IDB4MDE7CQkJCSAvLyBTdGFydGluZyBwYWdlIG51bWJlcgoJCSRpRml0V2lkdGgJPSAoaW50KSAkdGhpcy0+X3BocFNoZWV0LT5nZXRQYWdlU2V0dXAoKS0+Z2V0Rml0VG9XaWR0aCgpOwkvLyBGaXQgdG8gbnVtYmVyIG9mIHBhZ2VzIHdpZGUKCQkkaUZpdEhlaWdodAk9IChpbnQpICR0aGlzLT5fcGhwU2hlZXQtPmdldFBhZ2VTZXR1cCgpLT5nZXRGaXRUb0hlaWdodCgpOwkvLyBGaXQgdG8gbnVtYmVyIG9mIHBhZ2VzIGhpZ2gKCQkkZ3JiaXQJCT0gMHgwMDsJCQkJIC8vIE9wdGlvbiBmbGFncwoJCSRpUmVzCQkgPSAweDAyNTg7CQkJICAgLy8gUHJpbnQgcmVzb2x1dGlvbgoJCSRpVlJlcwkJPSAweDAyNTg7CQkJICAgLy8gVmVydGljYWwgcHJpbnQgcmVzb2x1dGlvbgoKCQkkbnVtSGRyCSAgID0gJHRoaXMtPl9waHBTaGVldC0+Z2V0UGFnZU1hcmdpbnMoKS0+Z2V0SGVhZGVyKCk7ICAvLyBIZWFkZXIgTWFyZ2luCgoJCSRudW1GdHIJICAgPSAkdGhpcy0+X3BocFNoZWV0LT5nZXRQYWdlTWFyZ2lucygpLT5nZXRGb290ZXIoKTsgICAvLyBGb290ZXIgTWFyZ2luCgkJJGlDb3BpZXMJICA9IDB4MDE7CQkJCSAvLyBOdW1iZXIgb2YgY29waWVzCgoJCSRmTGVmdFRvUmlnaHQgPSAweDA7CQkJCQkgLy8gUHJpbnQgb3ZlciB0aGVuIGRvd24KCgkJLy8gUGFnZSBvcmllbnRhdGlvbgoJCSRmTGFuZHNjYXBlID0gKCR0aGlzLT5fcGhwU2hlZXQtPmdldFBhZ2VTZXR1cCgpLT5nZXRPcmllbnRhdGlvbigpID09IFBIUEV4Y2VsX1dvcmtzaGVldF9QYWdlU2V0dXA6Ok9SSUVOVEFUSU9OX0xBTkRTQ0FQRSkgPwoJCQkweDAgOiAweDE7CgoJCSRmTm9QbHMJICAgPSAweDA7CQkJCQkgLy8gU2V0dXAgbm90IHJlYWQgZnJvbSBwcmludGVyCgkJJGZOb0NvbG9yCSA9IDB4MDsJCQkJCSAvLyBQcmludCBibGFjayBhbmQgd2hpdGUKCQkkZkRyYWZ0CSAgID0gMHgwOwkJCQkJIC8vIFByaW50IGRyYWZ0IHF1YWxpdHkKCQkkZk5vdGVzCSAgID0gMHgwOwkJCQkJIC8vIFByaW50IG5vdGVzCgkJJGZOb09yaWVudAk9IDB4MDsJCQkJCSAvLyBPcmllbnRhdGlvbiBub3Qgc2V0CgkJJGZVc2VQYWdlCSA9IDB4MDsJCQkJCSAvLyBVc2UgY3VzdG9tIHN0YXJ0aW5nIHBhZ2UKCgkJJGdyYml0CQkgICA9ICRmTGVmdFRvUmlnaHQ7CgkJJGdyYml0CQkgIHw9ICRmTGFuZHNjYXBlCTw8IDE7CgkJJGdyYml0CQkgIHw9ICRmTm9QbHMJCTw8IDI7CgkJJGdyYml0CQkgIHw9ICRmTm9Db2xvcgkgIDw8IDM7CgkJJGdyYml0CQkgIHw9ICRmRHJhZnQJCTw8IDQ7CgkJJGdyYml0CQkgIHw9ICRmTm90ZXMJCTw8IDU7CgkJJGdyYml0CQkgIHw9ICRmTm9PcmllbnQJIDw8IDY7CgkJJGdyYml0CQkgIHw9ICRmVXNlUGFnZQkgIDw8IDc7CgoJCSRudW1IZHIgPSBwYWNrKCJkIiwgJG51bUhkcik7CgkJJG51bUZ0ciA9IHBhY2soImQiLCAkbnVtRnRyKTsKCQlpZiAoc2VsZjo6Z2V0Qnl0ZU9yZGVyKCkpIHsgLy8gaWYgaXQncyBCaWcgRW5kaWFuCgkJCSRudW1IZHIgPSBzdHJyZXYoJG51bUhkcik7CgkJCSRudW1GdHIgPSBzdHJyZXYoJG51bUZ0cik7CgkJfQoKCQkkaGVhZGVyID0gcGFjaygidnYiLCAkcmVjb3JkLCAkbGVuZ3RoKTsKCQkkZGF0YTEgID0gcGFjaygidnZ2dnZ2dnYiLCAkaVBhcGVyU2l6ZSwKCQkJCQkJCQkgICAkaVNjYWxlLAoJCQkJCQkJCSAgICRpUGFnZVN0YXJ0LAoJCQkJCQkJCSAgICRpRml0V2lkdGgsCgkJCQkJCQkJICAgJGlGaXRIZWlnaHQsCgkJCQkJCQkJICAgJGdyYml0LAoJCQkJCQkJCSAgICRpUmVzLAoJCQkJCQkJCSAgICRpVlJlcyk7CgkJJGRhdGEyICA9ICRudW1IZHIuJG51bUZ0cjsKCQkkZGF0YTMgID0gcGFjaygidiIsICRpQ29waWVzKTsKCQkkdGhpcy0+X2FwcGVuZCgkaGVhZGVyIC4gJGRhdGExIC4gJGRhdGEyIC4gJGRhdGEzKTsKCX0KCgkvKioKCSAqIFN0b3JlIHRoZSBoZWFkZXIgY2FwdGlvbiBCSUZGIHJlY29yZC4KCSAqLwoJcHJpdmF0ZSBmdW5jdGlvbiBfd3JpdGVIZWFkZXIoKQoJewoJCSRyZWNvcmQgID0gMHgwMDE0OwkJCSAgIC8vIFJlY29yZCBpZGVudGlmaWVyCgoJCS8qIHJlbW92aW5nIGZvciBub3cKCQkvLyBuZWVkIHRvIGZpeCBjaGFyYWN0ZXIgY291bnQgKG11bHRpYnl0ZSEpCgkJaWYgKHN0cmxlbigkdGhpcy0+X3BocFNoZWV0LT5nZXRIZWFkZXJGb290ZXIoKS0+Z2V0T2RkSGVhZGVyKCkpIDw9IDI1NSkgewoJCQkkc3RyCSAgPSAkdGhpcy0+X3BocFNoZWV0LT5nZXRIZWFkZXJGb290ZXIoKS0+Z2V0T2RkSGVhZGVyKCk7CSAgIC8vIGhlYWRlciBzdHJpbmcKCQl9IGVsc2UgewoJCQkkc3RyID0gJyc7CgkJfQoJCSovCgoJCSRyZWNvcmREYXRhID0gUEhQRXhjZWxfU2hhcmVkX1N0cmluZzo6VVRGOHRvQklGRjhVbmljb2RlTG9uZygkdGhpcy0+X3BocFNoZWV0LT5nZXRIZWFkZXJGb290ZXIoKS0+Z2V0T2RkSGVhZGVyKCkpOwoJCSRsZW5ndGggPSBzdHJsZW4oJHJlY29yZERhdGEpOwoKCQkkaGVhZGVyICAgPSBwYWNrKCJ2diIsICRyZWNvcmQsICRsZW5ndGgpOwoKCQkkdGhpcy0+X2FwcGVuZCgkaGVhZGVyIC4gJHJlY29yZERhdGEpOwoJfQoKCS8qKgoJICogU3RvcmUgdGhlIGZvb3RlciBjYXB0aW9uIEJJRkYgcmVjb3JkLgoJICovCglwcml2YXRlIGZ1bmN0aW9uIF93cml0ZUZvb3RlcigpCgl7CgkJJHJlY29yZCAgPSAweDAwMTU7CQkJICAgLy8gUmVjb3JkIGlkZW50aWZpZXIKCgkJLyogcmVtb3ZpbmcgZm9yIG5vdwoJCS8vIG5lZWQgdG8gZml4IGNoYXJhY3RlciBjb3VudCAobXVsdGlieXRlISkKCQlpZiAoc3RybGVuKCR0aGlzLT5fcGhwU2hlZXQtPmdldEhlYWRlckZvb3RlcigpLT5nZXRPZGRGb290ZXIoKSkgPD0gMjU1KSB7CgkJCSRzdHIgPSAkdGhpcy0+X3BocFNoZWV0LT5nZXRIZWFkZXJGb290ZXIoKS0+Z2V0T2RkRm9vdGVyKCk7CgkJfSBlbHNlIHsKCQkJJHN0ciA9ICcnOwoJCX0KCQkqLwoKCQkkcmVjb3JkRGF0YSA9IFBIUEV4Y2VsX1NoYXJlZF9TdHJpbmc6OlVURjh0b0JJRkY4VW5pY29kZUxvbmcoJHRoaXMtPl9waHBTaGVldC0+Z2V0SGVhZGVyRm9vdGVyKCktPmdldE9kZEZvb3RlcigpKTsKCQkkbGVuZ3RoID0gc3RybGVuKCRyZWNvcmREYXRhKTsKCgkJJGhlYWRlcgk9IHBhY2soInZ2IiwgJHJlY29yZCwgJGxlbmd0aCk7CgoJCSR0aGlzLT5fYXBwZW5kKCRoZWFkZXIgLiAkcmVjb3JkRGF0YSk7Cgl9CgoJLyoqCgkgKiBTdG9yZSB0aGUgaG9yaXpvbnRhbCBjZW50ZXJpbmcgSENFTlRFUiBCSUZGIHJlY29yZC4KCSAqCgkgKiBAYWNjZXNzIHByaXZhdGUKCSAqLwoJcHJpdmF0ZSBmdW5jdGlvbiBfd3JpdGVIY2VudGVyKCkKCXsKCQkkcmVjb3JkICAgPSAweDAwODM7CQkJICAvLyBSZWNvcmQgaWRlbnRpZmllcgoJCSRsZW5ndGggICA9IDB4MDAwMjsJCQkgIC8vIEJ5dGVzIHRvIGZvbGxvdwoKCQkkZkhDZW50ZXIgPSAkdGhpcy0+X3BocFNoZWV0LT5nZXRQYWdlU2V0dXAoKS0+Z2V0SG9yaXpvbnRhbENlbnRlcmVkKCkgPyAxIDogMDsJIC8vIEhvcml6b250YWwgY2VudGVyaW5nCgoJCSRoZWFkZXIJPSBwYWNrKCJ2diIsICRyZWNvcmQsICRsZW5ndGgpOwoJCSRkYXRhCSAgPSBwYWNrKCJ2IiwgICRmSENlbnRlcik7CgoJCSR0aGlzLT5fYXBwZW5kKCRoZWFkZXIuJGRhdGEpOwoJfQoKCS8qKgoJICogU3RvcmUgdGhlIHZlcnRpY2FsIGNlbnRlcmluZyBWQ0VOVEVSIEJJRkYgcmVjb3JkLgoJICovCglwcml2YXRlIGZ1bmN0aW9uIF93cml0ZVZjZW50ZXIoKQoJewoJCSRyZWNvcmQgICA9IDB4MDA4NDsJCQkgIC8vIFJlY29yZCBpZGVudGlmaWVyCgkJJGxlbmd0aCAgID0gMHgwMDAyOwkJCSAgLy8gQnl0ZXMgdG8gZm9sbG93CgoJCSRmVkNlbnRlciA9ICR0aGlzLT5fcGhwU2hlZXQtPmdldFBhZ2VTZXR1cCgpLT5nZXRWZXJ0aWNhbENlbnRlcmVkKCkgPyAxIDogMDsJIC8vIEhvcml6b250YWwgY2VudGVyaW5nCgoJCSRoZWFkZXIJPSBwYWNrKCJ2diIsICRyZWNvcmQsICRsZW5ndGgpOwoJCSRkYXRhCSAgPSBwYWNrKCJ2IiwgICRmVkNlbnRlcik7CgkJJHRoaXMtPl9hcHBlbmQoJGhlYWRlciAuICRkYXRhKTsKCX0KCgkvKioKCSAqIFN0b3JlIHRoZSBMRUZUTUFSR0lOIEJJRkYgcmVjb3JkLgoJICovCglwcml2YXRlIGZ1bmN0aW9uIF93cml0ZU1hcmdpbkxlZnQoKQoJewoJCSRyZWNvcmQgID0gMHgwMDI2OwkJCQkgICAvLyBSZWNvcmQgaWRlbnRpZmllcgoJCSRsZW5ndGggID0gMHgwMDA4OwkJCQkgICAvLyBCeXRlcyB0byBmb2xsb3cKCgkJJG1hcmdpbiAgPSAkdGhpcy0+X3BocFNoZWV0LT5nZXRQYWdlTWFyZ2lucygpLT5nZXRMZWZ0KCk7CSAvLyBNYXJnaW4gaW4gaW5jaGVzCgoJCSRoZWFkZXIJPSBwYWNrKCJ2diIsICAkcmVjb3JkLCAkbGVuZ3RoKTsKCQkkZGF0YQkgID0gcGFjaygiZCIsICAgJG1hcmdpbik7CgkJaWYgKHNlbGY6OmdldEJ5dGVPcmRlcigpKSB7IC8vIGlmIGl0J3MgQmlnIEVuZGlhbgoJCQkkZGF0YSA9IHN0cnJldigkZGF0YSk7CgkJfQoKCQkkdGhpcy0+X2FwcGVuZCgkaGVhZGVyIC4gJGRhdGEpOwoJfQoKCS8qKgoJICogU3RvcmUgdGhlIFJJR0hUTUFSR0lOIEJJRkYgcmVjb3JkLgoJICovCglwcml2YXRlIGZ1bmN0aW9uIF93cml0ZU1hcmdpblJpZ2h0KCkKCXsKCQkkcmVjb3JkICA9IDB4MDAyNzsJCQkJICAgLy8gUmVjb3JkIGlkZW50aWZpZXIKCQkkbGVuZ3RoICA9IDB4MDAwODsJCQkJICAgLy8gQnl0ZXMgdG8gZm9sbG93CgoJCSRtYXJnaW4gID0gJHRoaXMtPl9waHBTaGVldC0+Z2V0UGFnZU1hcmdpbnMoKS0+Z2V0UmlnaHQoKTsJIC8vIE1hcmdpbiBpbiBpbmNoZXMKCgkJJGhlYWRlcgk9IHBhY2soInZ2IiwgICRyZWNvcmQsICRsZW5ndGgpOwoJCSRkYXRhCSAgPSBwYWNrKCJkIiwgICAkbWFyZ2luKTsKCQlpZiAoc2VsZjo6Z2V0Qnl0ZU9yZGVyKCkpIHsgLy8gaWYgaXQncyBCaWcgRW5kaWFuCgkJCSRkYXRhID0gc3RycmV2KCRkYXRhKTsKCQl9CgoJCSR0aGlzLT5fYXBwZW5kKCRoZWFkZXIgLiAkZGF0YSk7Cgl9CgoJLyoqCgkgKiBTdG9yZSB0aGUgVE9QTUFSR0lOIEJJRkYgcmVjb3JkLgoJICovCglwcml2YXRlIGZ1bmN0aW9uIF93cml0ZU1hcmdpblRvcCgpCgl7CgkJJHJlY29yZCAgPSAweDAwMjg7CQkJCSAgIC8vIFJlY29yZCBpZGVudGlmaWVyCgkJJGxlbmd0aCAgPSAweDAwMDg7CQkJCSAgIC8vIEJ5dGVzIHRvIGZvbGxvdwoKCQkkbWFyZ2luICA9ICR0aGlzLT5fcGhwU2hlZXQtPmdldFBhZ2VNYXJnaW5zKCktPmdldFRvcCgpOwkgLy8gTWFyZ2luIGluIGluY2hlcwoKCQkkaGVhZGVyCT0gcGFjaygidnYiLCAgJHJlY29yZCwgJGxlbmd0aCk7CgkJJGRhdGEJICA9IHBhY2soImQiLCAgICRtYXJnaW4pOwoJCWlmIChzZWxmOjpnZXRCeXRlT3JkZXIoKSkgeyAvLyBpZiBpdCdzIEJpZyBFbmRpYW4KCQkJJGRhdGEgPSBzdHJyZXYoJGRhdGEpOwoJCX0KCgkJJHRoaXMtPl9hcHBlbmQoJGhlYWRlciAuICRkYXRhKTsKCX0KCgkvKioKCSAqIFN0b3JlIHRoZSBCT1RUT01NQVJHSU4gQklGRiByZWNvcmQuCgkgKi8KCXByaXZhdGUgZnVuY3Rpb24gX3dyaXRlTWFyZ2luQm90dG9tKCkKCXsKCQkkcmVjb3JkICA9IDB4MDAyOTsJCQkJICAgLy8gUmVjb3JkIGlkZW50aWZpZXIKCQkkbGVuZ3RoICA9IDB4MDAwODsJCQkJICAgLy8gQnl0ZXMgdG8gZm9sbG93CgoJCSRtYXJnaW4gID0gJHRoaXMtPl9waHBTaGVldC0+Z2V0UGFnZU1hcmdpbnMoKS0+Z2V0Qm90dG9tKCk7CSAvLyBNYXJnaW4gaW4gaW5jaGVzCgoJCSRoZWFkZXIJPSBwYWNrKCJ2diIsICAkcmVjb3JkLCAkbGVuZ3RoKTsKCQkkZGF0YQkgID0gcGFjaygiZCIsICAgJG1hcmdpbik7CgkJaWYgKHNlbGY6OmdldEJ5dGVPcmRlcigpKSB7IC8vIGlmIGl0J3MgQmlnIEVuZGlhbgoJCQkkZGF0YSA9IHN0cnJldigkZGF0YSk7CgkJfQoKCQkkdGhpcy0+X2FwcGVuZCgkaGVhZGVyIC4gJGRhdGEpOwoJfQoKCS8qKgoJICogV3JpdGUgdGhlIFBSSU5USEVBREVSUyBCSUZGIHJlY29yZC4KCSAqLwoJcHJpdmF0ZSBmdW5jdGlvbiBfd3JpdGVQcmludEhlYWRlcnMoKQoJewoJCSRyZWNvcmQJICA9IDB4MDAyYTsJCQkJICAgLy8gUmVjb3JkIGlkZW50aWZpZXIKCQkkbGVuZ3RoCSAgPSAweDAwMDI7CQkJCSAgIC8vIEJ5dGVzIHRvIGZvbGxvdwoKCQkkZlByaW50UndDb2wgPSAkdGhpcy0+X3ByaW50X2hlYWRlcnM7CSAvLyBCb29sZWFuIGZsYWcKCgkJJGhlYWRlcgkgID0gcGFjaygidnYiLCAkcmVjb3JkLCAkbGVuZ3RoKTsKCQkkZGF0YQkJPSBwYWNrKCJ2IiwgJGZQcmludFJ3Q29sKTsKCQkkdGhpcy0+X2FwcGVuZCgkaGVhZGVyIC4gJGRhdGEpOwoJfQoKCS8qKgoJICogV3JpdGUgdGhlIFBSSU5UR1JJRExJTkVTIEJJRkYgcmVjb3JkLiBNdXN0IGJlIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUKCSAqIEdSSURTRVQgcmVjb3JkLgoJICovCglwcml2YXRlIGZ1bmN0aW9uIF93cml0ZVByaW50R3JpZGxpbmVzKCkKCXsKCQkkcmVjb3JkCSAgPSAweDAwMmI7CQkJCQkvLyBSZWNvcmQgaWRlbnRpZmllcgoJCSRsZW5ndGgJICA9IDB4MDAwMjsJCQkJCS8vIEJ5dGVzIHRvIGZvbGxvdwoKCQkkZlByaW50R3JpZCAgPSAkdGhpcy0+X3BocFNoZWV0LT5nZXRQcmludEdyaWRsaW5lcygpID8gMSA6IDA7CS8vIEJvb2xlYW4gZmxhZwoKCQkkaGVhZGVyCSAgPSBwYWNrKCJ2diIsICRyZWNvcmQsICRsZW5ndGgpOwoJCSRkYXRhCQk9IHBhY2soInYiLCAkZlByaW50R3JpZCk7CgkJJHRoaXMtPl9hcHBlbmQoJGhlYWRlciAuICRkYXRhKTsKCX0KCgkvKioKCSAqIFdyaXRlIHRoZSBHUklEU0VUIEJJRkYgcmVjb3JkLiBNdXN0IGJlIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUKCSAqIFBSSU5UR1JJRExJTkVTIHJlY29yZC4KCSAqLwoJcHJpdmF0ZSBmdW5jdGlvbiBfd3JpdGVHcmlkc2V0KCkKCXsKCQkkcmVjb3JkCSAgPSAweDAwODI7CQkJCQkJLy8gUmVjb3JkIGlkZW50aWZpZXIKCQkkbGVuZ3RoCSAgPSAweDAwMDI7CQkJCQkJLy8gQnl0ZXMgdG8gZm9sbG93CgoJCSRmR3JpZFNldAk9ICEkdGhpcy0+X3BocFNoZWV0LT5nZXRQcmludEdyaWRsaW5lcygpOwkgLy8gQm9vbGVhbiBmbGFnCgoJCSRoZWFkZXIJICA9IHBhY2soInZ2IiwgICRyZWNvcmQsICRsZW5ndGgpOwoJCSRkYXRhCQk9IHBhY2soInYiLCAgICRmR3JpZFNldCk7CgkJJHRoaXMtPl9hcHBlbmQoJGhlYWRlciAuICRkYXRhKTsKCX0KCgkvKioKCSAqIFdyaXRlIHRoZSBHVVRTIEJJRkYgcmVjb3JkLiBUaGlzIGlzIHVzZWQgdG8gY29uZmlndXJlIHRoZSBndXR0ZXIgbWFyZ2lucwoJICogd2hlcmUgRXhjZWwgb3V0bGluZSBzeW1ib2xzIGFyZSBkaXNwbGF5ZWQuIFRoZSB2aXNpYmlsaXR5IG9mIHRoZSBndXR0ZXJzIGlzCgkgKiBjb250cm9sbGVkIGJ5IGEgZmxhZyBpbiBXU0JPT0wuCgkgKgoJICogQHNlZSBfd3JpdGVXc2Jvb2woKQoJICovCglwcml2YXRlICBmdW5jdGlvbiBfd3JpdGVHdXRzKCkKCXsKCQkkcmVjb3JkCSAgPSAweDAwODA7ICAgLy8gUmVjb3JkIGlkZW50aWZpZXIKCQkkbGVuZ3RoCSAgPSAweDAwMDg7ICAgLy8gQnl0ZXMgdG8gZm9sbG93CgoJCSRkeFJ3R3V0CSA9IDB4MDAwMDsgICAvLyBTaXplIG9mIHJvdyBndXR0ZXIKCQkkZHhDb2xHdXQJPSAweDAwMDA7ICAgLy8gU2l6ZSBvZiBjb2wgZ3V0dGVyCgoJCS8vIGRldGVybWluZSBtYXhpbXVtIHJvdyBvdXRsaW5lIGxldmVsCgkJJG1heFJvd091dGxpbmVMZXZlbCA9IDA7CgkJZm9yZWFjaCAoJHRoaXMtPl9waHBTaGVldC0+Z2V0Um93RGltZW5zaW9ucygpIGFzICRyb3dEaW1lbnNpb24pIHsKCQkJJG1heFJvd091dGxpbmVMZXZlbCA9IG1heCgkbWF4Um93T3V0bGluZUxldmVsLCAkcm93RGltZW5zaW9uLT5nZXRPdXRsaW5lTGV2ZWwoKSk7CgkJfQoKCQkkY29sX2xldmVsICAgPSAwOwoKCQkvLyBDYWxjdWxhdGUgdGhlIG1heGltdW0gY29sdW1uIG91dGxpbmUgbGV2ZWwuIFRoZSBlcXVpdmFsZW50IGNhbGN1bGF0aW9uCgkJLy8gZm9yIHRoZSByb3cgb3V0bGluZSBsZXZlbCBpcyBjYXJyaWVkIG91dCBpbiBfd3JpdGVSb3coKS4KCQkkY29sY291bnQgPSBjb3VudCgkdGhpcy0+X2NvbGluZm8pOwoJCWZvciAoJGkgPSAwOyAkaSA8ICRjb2xjb3VudDsgKyskaSkgewoJCQkkY29sX2xldmVsID0gbWF4KCR0aGlzLT5fY29saW5mb1skaV1bNV0sICRjb2xfbGV2ZWwpOwoJCX0KCgkJLy8gU2V0IHRoZSBsaW1pdHMgZm9yIHRoZSBvdXRsaW5lIGxldmVscyAoMCA8PSB4IDw9IDcpLgoJCSRjb2xfbGV2ZWwgPSBtYXgoMCwgbWluKCRjb2xfbGV2ZWwsIDcpKTsKCgkJLy8gVGhlIGRpc3BsYXllZCBsZXZlbCBpcyBvbmUgZ3JlYXRlciB0aGFuIHRoZSBtYXggb3V0bGluZSBsZXZlbHMKCQlpZiAoJG1heFJvd091dGxpbmVMZXZlbCkgewoJCQkrKyRtYXhSb3dPdXRsaW5lTGV2ZWw7CgkJfQoJCWlmICgkY29sX2xldmVsKSB7CgkJCSsrJGNvbF9sZXZlbDsKCQl9CgoJCSRoZWFkZXIJICA9IHBhY2soInZ2IiwgICAkcmVjb3JkLCAkbGVuZ3RoKTsKCQkkZGF0YQkJPSBwYWNrKCJ2dnZ2IiwgJGR4UndHdXQsICRkeENvbEd1dCwgJG1heFJvd091dGxpbmVMZXZlbCwgJGNvbF9sZXZlbCk7CgoJCSR0aGlzLT5fYXBwZW5kKCRoZWFkZXIuJGRhdGEpOwoJfQoKCS8qKgoJICogV3JpdGUgdGhlIFdTQk9PTCBCSUZGIHJlY29yZCwgbWFpbmx5IGZvciBmaXQtdG8tcGFnZS4gVXNlZCBpbiBjb25qdW5jdGlvbgoJICogd2l0aCB0aGUgU0VUVVAgcmVjb3JkLgoJICovCglwcml2YXRlIGZ1bmN0aW9uIF93cml0ZVdzYm9vbCgpCgl7CgkJJHJlY29yZAkgID0gMHgwMDgxOyAgIC8vIFJlY29yZCBpZGVudGlmaWVyCgkJJGxlbmd0aAkgID0gMHgwMDAyOyAgIC8vIEJ5dGVzIHRvIGZvbGxvdwoJCSRncmJpdAkgICA9IDB4MDAwMDsKCgkJLy8gVGhlIG9ubHkgb3B0aW9uIHRoYXQgaXMgb2YgaW50ZXJlc3QgaXMgdGhlIGZsYWcgZm9yIGZpdCB0byBwYWdlLiBTbyB3ZQoJCS8vIHNldCBhbGwgdGhlIG9wdGlvbnMgaW4gb25lIGdvLgoJCS8vCgkJLy8gU2V0IHRoZSBvcHRpb24gZmxhZ3MKCQkkZ3JiaXQgfD0gMHgwMDAxOwkJCQkJCSAgIC8vIEF1dG8gcGFnZSBicmVha3MgdmlzaWJsZQoJCWlmICgkdGhpcy0+X291dGxpbmVfc3R5bGUpIHsKCQkJJGdyYml0IHw9IDB4MDAyMDsgLy8gQXV0byBvdXRsaW5lIHN0eWxlcwoJCX0KCQlpZiAoJHRoaXMtPl9waHBTaGVldC0+Z2V0U2hvd1N1bW1hcnlCZWxvdygpKSB7CgkJCSRncmJpdCB8PSAweDAwNDA7IC8vIE91dGxpbmUgc3VtbWFyeSBiZWxvdwoJCX0KCQlpZiAoJHRoaXMtPl9waHBTaGVldC0+Z2V0U2hvd1N1bW1hcnlSaWdodCgpKSB7CgkJCSRncmJpdCB8PSAweDAwODA7IC8vIE91dGxpbmUgc3VtbWFyeSByaWdodAoJCX0KCQlpZiAoJHRoaXMtPl9waHBTaGVldC0+Z2V0UGFnZVNldHVwKCktPmdldEZpdFRvUGFnZSgpKSB7CgkJCSRncmJpdCB8PSAweDAxMDA7IC8vIFBhZ2Ugc2V0dXAgZml0IHRvIHBhZ2UKCQl9CgkJaWYgKCR0aGlzLT5fb3V0bGluZV9vbikgewoJCQkkZ3JiaXQgfD0gMHgwNDAwOyAvLyBPdXRsaW5lIHN5bWJvbHMgZGlzcGxheWVkCgkJfQoKCQkkaGVhZGVyCSAgPSBwYWNrKCJ2diIsICRyZWNvcmQsICRsZW5ndGgpOwoJCSRkYXRhCQk9IHBhY2soInYiLCAgJGdyYml0KTsKCQkkdGhpcy0+X2FwcGVuZCgkaGVhZGVyIC4gJGRhdGEpOwoJfQoKCS8qKgoJICogV3JpdGUgdGhlIEhPUklaT05UQUxQQUdFQlJFQUtTIGFuZCBWRVJUSUNBTFBBR0VCUkVBS1MgQklGRiByZWNvcmRzLgoJICovCglwcml2YXRlIGZ1bmN0aW9uIF93cml0ZUJyZWFrcygpCgl7CgkJLy8gaW5pdGlhbGl6ZQoJCSR2YnJlYWtzID0gYXJyYXkoKTsKCQkkaGJyZWFrcyA9IGFycmF5KCk7CgoJCWZvcmVhY2ggKCR0aGlzLT5fcGhwU2hlZXQtPmdldEJyZWFrcygpIGFzICRjZWxsID0+ICRicmVha1R5cGUpIHsKCQkJLy8gRmV0Y2ggY29vcmRpbmF0ZXMKCQkJJGNvb3JkaW5hdGVzID0gUEhQRXhjZWxfQ2VsbDo6Y29vcmRpbmF0ZUZyb21TdHJpbmcoJGNlbGwpOwoKCQkJLy8gRGVjaWRlIHdoYXQgdG8gZG8gYnkgdGhlIHR5cGUgb2YgYnJlYWsKCQkJc3dpdGNoICgkYnJlYWtUeXBlKSB7CgkJCQljYXNlIFBIUEV4Y2VsX1dvcmtzaGVldDo6QlJFQUtfQ09MVU1OOgoJCQkJCS8vIEFkZCB0byBsaXN0IG9mIHZlcnRpY2FsIGJyZWFrcwoJCQkJCSR2YnJlYWtzW10gPSBQSFBFeGNlbF9DZWxsOjpjb2x1bW5JbmRleEZyb21TdHJpbmcoJGNvb3JkaW5hdGVzWzBdKSAtIDE7CgkJCQkJYnJlYWs7CgoJCQkJY2FzZSBQSFBFeGNlbF9Xb3Jrc2hlZXQ6OkJSRUFLX1JPVzoKCQkJCQkvLyBBZGQgdG8gbGlzdCBvZiBob3Jpem9udGFsIGJyZWFrcwoJCQkJCSRoYnJlYWtzW10gPSAkY29vcmRpbmF0ZXNbMV07CgkJCQkJYnJlYWs7CgoJCQkJY2FzZSBQSFBFeGNlbF9Xb3Jrc2hlZXQ6OkJSRUFLX05PTkU6CgkJCQlkZWZhdWx0OgoJCQkJCS8vIE5vdGhpbmcgdG8gZG8KCQkJCQlicmVhazsKCQkJfQoJCX0KCgkJLy9ob3Jpem9udGFsIHBhZ2UgYnJlYWtzCgkJaWYgKCFlbXB0eSgkaGJyZWFrcykpIHsKCgkJCS8vIFNvcnQgYW5kIGZpbHRlciBhcnJheSBvZiBwYWdlIGJyZWFrcwoJCQlzb3J0KCRoYnJlYWtzLCBTT1JUX05VTUVSSUMpOwoJCQlpZiAoJGhicmVha3NbMF0gPT0gMCkgeyAvLyBkb24ndCB1c2UgZmlyc3QgYnJlYWsgaWYgaXQncyAwCgkJCQlhcnJheV9zaGlmdCgkaGJyZWFrcyk7CgkJCX0KCgkJCSRyZWNvcmQgID0gMHgwMDFiOwkJCSAgIC8vIFJlY29yZCBpZGVudGlmaWVyCgkJCSRjYnJrCT0gY291bnQoJGhicmVha3MpOwkgICAvLyBOdW1iZXIgb2YgcGFnZSBicmVha3MKCQkJJGxlbmd0aCAgPSAyICsgNiAqICRjYnJrOwkgIC8vIEJ5dGVzIHRvIGZvbGxvdwoKCQkJJGhlYWRlciAgPSBwYWNrKCJ2diIsICRyZWNvcmQsICRsZW5ndGgpOwoJCQkkZGF0YQk9IHBhY2soInYiLCAgJGNicmspOwoKCQkJLy8gQXBwZW5kIGVhY2ggcGFnZSBicmVhawoJCQlmb3JlYWNoICgkaGJyZWFrcyBhcyAkaGJyZWFrKSB7CgkJCQkkZGF0YSAuPSBwYWNrKCJ2dnYiLCAkaGJyZWFrLCAweDAwMDAsIDB4MDBmZik7CgkJCX0KCgkJCSR0aGlzLT5fYXBwZW5kKCRoZWFkZXIgLiAkZGF0YSk7CgkJfQoKCQkvLyB2ZXJ0aWNhbCBwYWdlIGJyZWFrcwoJCWlmICghZW1wdHkoJHZicmVha3MpKSB7CgoJCQkvLyAxMDAwIHZlcnRpY2FsIHBhZ2VicmVha3MgYXBwZWFycyB0byBiZSBhbiBpbnRlcm5hbCBFeGNlbCA1IGxpbWl0LgoJCQkvLyBJdCBpcyBzbGlnaHRseSBoaWdoZXIgaW4gRXhjZWwgOTcvMjAwLCBhcHByb3guIDEwMjYKCQkJJHZicmVha3MgPSBhcnJheV9zbGljZSgkdmJyZWFrcywgMCwgMTAwMCk7CgoJCQkvLyBTb3J0IGFuZCBmaWx0ZXIgYXJyYXkgb2YgcGFnZSBicmVha3MKCQkJc29ydCgkdmJyZWFrcywgU09SVF9OVU1FUklDKTsKCQkJaWYgKCR2YnJlYWtzWzBdID09IDApIHsgLy8gZG9uJ3QgdXNlIGZpcnN0IGJyZWFrIGlmIGl0J3MgMAoJCQkJYXJyYXlfc2hpZnQoJHZicmVha3MpOwoJCQl9CgoJCQkkcmVjb3JkICA9IDB4MDAxYTsJCQkgICAvLyBSZWNvcmQgaWRlbnRpZmllcgoJCQkkY2Jyawk9IGNvdW50KCR2YnJlYWtzKTsJICAgLy8gTnVtYmVyIG9mIHBhZ2UgYnJlYWtzCgkJCSRsZW5ndGggID0gMiArIDYgKiAkY2JyazsJICAvLyBCeXRlcyB0byBmb2xsb3cKCgkJCSRoZWFkZXIgID0gcGFjaygidnYiLCAgJHJlY29yZCwgJGxlbmd0aCk7CgkJCSRkYXRhCT0gcGFjaygidiIsICAgJGNicmspOwoKCQkJLy8gQXBwZW5kIGVhY2ggcGFnZSBicmVhawoJCQlmb3JlYWNoICgkdmJyZWFrcyBhcyAkdmJyZWFrKSB7CgkJCQkkZGF0YSAuPSBwYWNrKCJ2dnYiLCAkdmJyZWFrLCAweDAwMDAsIDB4ZmZmZik7CgkJCX0KCgkJCSR0aGlzLT5fYXBwZW5kKCRoZWFkZXIgLiAkZGF0YSk7CgkJfQoJfQoKCS8qKgoJICogU2V0IHRoZSBCaWZmIFBST1RFQ1QgcmVjb3JkIHRvIGluZGljYXRlIHRoYXQgdGhlIHdvcmtzaGVldCBpcyBwcm90ZWN0ZWQuCgkgKi8KCXByaXZhdGUgZnVuY3Rpb24gX3dyaXRlUHJvdGVjdCgpCgl7CgkJLy8gRXhpdCB1bmxlc3Mgc2hlZXQgcHJvdGVjdGlvbiBoYXMgYmVlbiBzcGVjaWZpZWQKCQlpZiAoISR0aGlzLT5fcGhwU2hlZXQtPmdldFByb3RlY3Rpb24oKS0+Z2V0U2hlZXQoKSkgewoJCQlyZXR1cm47CgkJfQoKCQkkcmVjb3JkCSAgPSAweDAwMTI7CQkJIC8vIFJlY29yZCBpZGVudGlmaWVyCgkJJGxlbmd0aAkgID0gMHgwMDAyOwkJCSAvLyBCeXRlcyB0byBmb2xsb3cKCgkJJGZMb2NrCSAgID0gMTsJLy8gV29ya3NoZWV0IGlzIHByb3RlY3RlZAoKCQkkaGVhZGVyCSAgPSBwYWNrKCJ2diIsICRyZWNvcmQsICRsZW5ndGgpOwoJCSRkYXRhCQk9IHBhY2soInYiLCAgJGZMb2NrKTsKCgkJJHRoaXMtPl9hcHBlbmQoJGhlYWRlci4kZGF0YSk7Cgl9CgoJLyoqCgkgKiBXcml0ZSBTQ0VOUFJPVEVDVAoJICovCglwcml2YXRlIGZ1bmN0aW9uIF93cml0ZVNjZW5Qcm90ZWN0KCkKCXsKCQkvLyBFeGl0IGlmIHNoZWV0IHByb3RlY3Rpb24gaXMgbm90IGFjdGl2ZQoJCWlmICghJHRoaXMtPl9waHBTaGVldC0+Z2V0UHJvdGVjdGlvbigpLT5nZXRTaGVldCgpKSB7CgkJCXJldHVybjsKCQl9CgoJCS8vIEV4aXQgaWYgc2NlbmFyaW9zIGFyZSBub3QgcHJvdGVjdGVkCgkJaWYgKCEkdGhpcy0+X3BocFNoZWV0LT5nZXRQcm90ZWN0aW9uKCktPmdldFNjZW5hcmlvcygpKSB7CgkJCXJldHVybjsKCQl9CgoJCSRyZWNvcmQgPSAweDAwREQ7IC8vIFJlY29yZCBpZGVudGlmaWVyCgkJJGxlbmd0aCA9IDB4MDAwMjsgLy8gQnl0ZXMgdG8gZm9sbG93CgoJCSRoZWFkZXIgPSBwYWNrKCd2dicsICRyZWNvcmQsICRsZW5ndGgpOwoJCSRkYXRhID0gcGFjaygndicsIDEpOwoKCQkkdGhpcy0+X2FwcGVuZCgkaGVhZGVyIC4gJGRhdGEpOwoJfQoKCS8qKgoJICogV3JpdGUgT0JKRUNUUFJPVEVDVAoJICovCglwcml2YXRlIGZ1bmN0aW9uIF93cml0ZU9iamVjdFByb3RlY3QoKQoJewoJCS8vIEV4aXQgaWYgc2hlZXQgcHJvdGVjdGlvbiBpcyBub3QgYWN0aXZlCgkJaWYgKCEkdGhpcy0+X3BocFNoZWV0LT5nZXRQcm90ZWN0aW9uKCktPmdldFNoZWV0KCkpIHsKCQkJcmV0dXJuOwoJCX0KCgkJLy8gRXhpdCBpZiBvYmplY3RzIGFyZSBub3QgcHJvdGVjdGVkCgkJaWYgKCEkdGhpcy0+X3BocFNoZWV0LT5nZXRQcm90ZWN0aW9uKCktPmdldE9iamVjdHMoKSkgewoJCQlyZXR1cm47CgkJfQoKCQkkcmVjb3JkID0gMHgwMDYzOyAvLyBSZWNvcmQgaWRlbnRpZmllcgoJCSRsZW5ndGggPSAweDAwMDI7IC8vIEJ5dGVzIHRvIGZvbGxvdwoKCQkkaGVhZGVyID0gcGFjaygndnYnLCAkcmVjb3JkLCAkbGVuZ3RoKTsKCQkkZGF0YSA9IHBhY2soJ3YnLCAxKTsKCgkJJHRoaXMtPl9hcHBlbmQoJGhlYWRlciAuICRkYXRhKTsKCX0KCgkvKioKCSAqIFdyaXRlIHRoZSB3b3Jrc2hlZXQgUEFTU1dPUkQgcmVjb3JkLgoJICovCglwcml2YXRlIGZ1bmN0aW9uIF93cml0ZVBhc3N3b3JkKCkKCXsKCQkvLyBFeGl0IHVubGVzcyBzaGVldCBwcm90ZWN0aW9uIGFuZCBwYXNzd29yZCBoYXZlIGJlZW4gc3BlY2lmaWVkCgkJaWYgKCEkdGhpcy0+X3BocFNoZWV0LT5nZXRQcm90ZWN0aW9uKCktPmdldFNoZWV0KCkgfHwgISR0aGlzLT5fcGhwU2hlZXQtPmdldFByb3RlY3Rpb24oKS0+Z2V0UGFzc3dvcmQoKSkgewoJCQlyZXR1cm47CgkJfQoKCQkkcmVjb3JkCSAgPSAweDAwMTM7CQkJICAgLy8gUmVjb3JkIGlkZW50aWZpZXIKCQkkbGVuZ3RoCSAgPSAweDAwMDI7CQkJICAgLy8gQnl0ZXMgdG8gZm9sbG93CgoJCSR3UGFzc3dvcmQgICA9IGhleGRlYygkdGhpcy0+X3BocFNoZWV0LT5nZXRQcm90ZWN0aW9uKCktPmdldFBhc3N3b3JkKCkpOwkgLy8gRW5jb2RlZCBwYXNzd29yZAoKCQkkaGVhZGVyCSAgPSBwYWNrKCJ2diIsICRyZWNvcmQsICRsZW5ndGgpOwoJCSRkYXRhCQk9IHBhY2soInYiLCAgJHdQYXNzd29yZCk7CgoJCSR0aGlzLT5fYXBwZW5kKCRoZWFkZXIgLiAkZGF0YSk7Cgl9CgoJLyoqCgkgKiBJbnNlcnQgYSAyNGJpdCBiaXRtYXAgaW1hZ2UgaW4gYSB3b3Jrc2hlZXQuCgkgKgoJICogQGFjY2VzcyBwdWJsaWMKCSAqIEBwYXJhbSBpbnRlZ2VyICRyb3cJIFRoZSByb3cgd2UgYXJlIGdvaW5nIHRvIGluc2VydCB0aGUgYml0bWFwIGludG8KCSAqIEBwYXJhbSBpbnRlZ2VyICRjb2wJIFRoZSBjb2x1bW4gd2UgYXJlIGdvaW5nIHRvIGluc2VydCB0aGUgYml0bWFwIGludG8KCSAqIEBwYXJhbSBtaXhlZCAgICRiaXRtYXAgIFRoZSBiaXRtYXAgZmlsZW5hbWUgb3IgR0QtaW1hZ2UgcmVzb3VyY2UKCSAqIEBwYXJhbSBpbnRlZ2VyICR4CSAgIFRoZSBob3Jpem9udGFsIHBvc2l0aW9uIChvZmZzZXQpIG9mIHRoZSBpbWFnZSBpbnNpZGUgdGhlIGNlbGwuCgkgKiBAcGFyYW0gaW50ZWdlciAkeQkgICBUaGUgdmVydGljYWwgcG9zaXRpb24gKG9mZnNldCkgb2YgdGhlIGltYWdlIGluc2lkZSB0aGUgY2VsbC4KCSAqIEBwYXJhbSBmbG9hdCAgICRzY2FsZV94IFRoZSBob3Jpem9udGFsIHNjYWxlCgkgKiBAcGFyYW0gZmxvYXQgICAkc2NhbGVfeSBUaGUgdmVydGljYWwgc2NhbGUKCSAqLwoJZnVuY3Rpb24gaW5zZXJ0Qml0bWFwKCRyb3csICRjb2wsICRiaXRtYXAsICR4ID0gMCwgJHkgPSAwLCAkc2NhbGVfeCA9IDEsICRzY2FsZV95ID0gMSkKCXsKCQkkYml0bWFwX2FycmF5ID0gKGlzX3Jlc291cmNlKCRiaXRtYXApID8gJHRoaXMtPl9wcm9jZXNzQml0bWFwR2QoJGJpdG1hcCkgOiAkdGhpcy0+X3Byb2Nlc3NCaXRtYXAoJGJpdG1hcCkpOwoJCWxpc3QoJHdpZHRoLCAkaGVpZ2h0LCAkc2l6ZSwgJGRhdGEpID0gJGJpdG1hcF9hcnJheTsgLy8kdGhpcy0+X3Byb2Nlc3NCaXRtYXAoJGJpdG1hcCk7CgoJCS8vIFNjYWxlIHRoZSBmcmFtZSBvZiB0aGUgaW1hZ2UuCgkJJHdpZHRoICAqPSAkc2NhbGVfeDsKCQkkaGVpZ2h0ICo9ICRzY2FsZV95OwoKCQkvLyBDYWxjdWxhdGUgdGhlIHZlcnRpY2VzIG9mIHRoZSBpbWFnZSBhbmQgd3JpdGUgdGhlIE9CSiByZWNvcmQKCQkkdGhpcy0+X3Bvc2l0aW9uSW1hZ2UoJGNvbCwgJHJvdywgJHgsICR5LCAkd2lkdGgsICRoZWlnaHQpOwoKCQkvLyBXcml0ZSB0aGUgSU1EQVRBIHJlY29yZCB0byBzdG9yZSB0aGUgYml0bWFwIGRhdGEKCQkkcmVjb3JkCSAgPSAweDAwN2Y7CgkJJGxlbmd0aAkgID0gOCArICRzaXplOwoJCSRjZgkJICA9IDB4MDk7CgkJJGVudgkJID0gMHgwMTsKCQkkbGNiCQkgPSAkc2l6ZTsKCgkJJGhlYWRlcgkgID0gcGFjaygidnZ2dlYiLCAkcmVjb3JkLCAkbGVuZ3RoLCAkY2YsICRlbnYsICRsY2IpOwoJCSR0aGlzLT5fYXBwZW5kKCRoZWFkZXIuJGRhdGEpOwoJfQoKCS8qKgoJICogQ2FsY3VsYXRlIHRoZSB2ZXJ0aWNlcyB0aGF0IGRlZmluZSB0aGUgcG9zaXRpb24gb2YgdGhlIGltYWdlIGFzIHJlcXVpcmVkIGJ5CgkgKiB0aGUgT0JKIHJlY29yZC4KCSAqCgkgKgkJICstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKwoJICoJCSB8CSBBCSAgfAkgIEIJIHwKCSAqICAgKy0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rCgkgKiAgIHwJIHwoeDEseTEpCSB8CQkJfAoJICogICB8ICAxICB8KEExKS5fX19fX19ffF9fX19fXwkgIHwKCSAqICAgfAkgfAl8CQkJICB8CSB8CgkgKiAgIHwJIHwJfAkJCSAgfAkgfAoJICogICArLS0tLS0rLS0tLXwJQklUTUFQCXwtLS0tLSsKCSAqICAgfAkgfAl8CQkJICB8CSB8CgkgKiAgIHwgIDIgIHwJfF9fX19fX19fX19fX19fLgkgfAoJICogICB8CSB8CQkJfAkJKEIyKXwKCSAqICAgfAkgfAkJCXwJICh4Mix5Mil8CgkgKiAgICstLS0tICstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKwoJICoKCSAqIEV4YW1wbGUgb2YgYSBiaXRtYXAgdGhhdCBjb3ZlcnMgc29tZSBvZiB0aGUgYXJlYSBmcm9tIGNlbGwgQTEgdG8gY2VsbCBCMi4KCSAqCgkgKiBCYXNlZCBvbiB0aGUgd2lkdGggYW5kIGhlaWdodCBvZiB0aGUgYml0bWFwIHdlIG5lZWQgdG8gY2FsY3VsYXRlIDggdmFyczoKCSAqCSAkY29sX3N0YXJ0LCAkcm93X3N0YXJ0LCAkY29sX2VuZCwgJHJvd19lbmQsICR4MSwgJHkxLCAkeDIsICR5Mi4KCSAqIFRoZSB3aWR0aCBhbmQgaGVpZ2h0IG9mIHRoZSBjZWxscyBhcmUgYWxzbyB2YXJpYWJsZSBhbmQgaGF2ZSB0byBiZSB0YWtlbiBpbnRvCgkgKiBhY2NvdW50LgoJICogVGhlIHZhbHVlcyBvZiAkY29sX3N0YXJ0IGFuZCAkcm93X3N0YXJ0IGFyZSBwYXNzZWQgaW4gZnJvbSB0aGUgY2FsbGluZwoJICogZnVuY3Rpb24uIFRoZSB2YWx1ZXMgb2YgJGNvbF9lbmQgYW5kICRyb3dfZW5kIGFyZSBjYWxjdWxhdGVkIGJ5IHN1YnRyYWN0aW5nCgkgKiB0aGUgd2lkdGggYW5kIGhlaWdodCBvZiB0aGUgYml0bWFwIGZyb20gdGhlIHdpZHRoIGFuZCBoZWlnaHQgb2YgdGhlCgkgKiB1bmRlcmx5aW5nIGNlbGxzLgoJICogVGhlIHZlcnRpY2VzIGFyZSBleHByZXNzZWQgYXMgYSBwZXJjZW50YWdlIG9mIHRoZSB1bmRlcmx5aW5nIGNlbGwgd2lkdGggYXMKCSAqIGZvbGxvd3MgKHJocyB2YWx1ZXMgYXJlIGluIHBpeGVscyk6CgkgKgoJICoJICAgeDEgPSBYIC8gVyAqMTAyNAoJICoJICAgeTEgPSBZIC8gSCAqMjU2CgkgKgkgICB4MiA9IChYLTEpIC8gVyAqMTAyNAoJICoJICAgeTIgPSAoWS0xKSAvIEggKjI1NgoJICoKCSAqCSAgIFdoZXJlOiAgWCBpcyBkaXN0YW5jZSBmcm9tIHRoZSBsZWZ0IHNpZGUgb2YgdGhlIHVuZGVybHlpbmcgY2VsbAoJICoJCQkgICBZIGlzIGRpc3RhbmNlIGZyb20gdGhlIHRvcCBvZiB0aGUgdW5kZXJseWluZyBjZWxsCgkgKgkJCSAgIFcgaXMgdGhlIHdpZHRoIG9mIHRoZSBjZWxsCgkgKgkJCSAgIEggaXMgdGhlIGhlaWdodCBvZiB0aGUgY2VsbAoJICogVGhlIFNESyBpbmNvcnJlY3RseSBzdGF0ZXMgdGhhdCB0aGUgaGVpZ2h0IHNob3VsZCBiZSBleHByZXNzZWQgYXMgYQoJICoJCXBlcmNlbnRhZ2Ugb2YgMTAyNC4KCSAqCgkgKiBAYWNjZXNzIHByaXZhdGUKCSAqIEBwYXJhbSBpbnRlZ2VyICRjb2xfc3RhcnQgQ29sIGNvbnRhaW5pbmcgdXBwZXIgbGVmdCBjb3JuZXIgb2Ygb2JqZWN0CgkgKiBAcGFyYW0gaW50ZWdlciAkcm93X3N0YXJ0IFJvdyBjb250YWluaW5nIHRvcCBsZWZ0IGNvcm5lciBvZiBvYmplY3QKCSAqIEBwYXJhbSBpbnRlZ2VyICR4MQkJRGlzdGFuY2UgdG8gbGVmdCBzaWRlIG9mIG9iamVjdAoJICogQHBhcmFtIGludGVnZXIgJHkxCQlEaXN0YW5jZSB0byB0b3Agb2Ygb2JqZWN0CgkgKiBAcGFyYW0gaW50ZWdlciAkd2lkdGgJIFdpZHRoIG9mIGltYWdlIGZyYW1lCgkgKiBAcGFyYW0gaW50ZWdlciAkaGVpZ2h0CUhlaWdodCBvZiBpbWFnZSBmcmFtZQoJICovCglmdW5jdGlvbiBfcG9zaXRpb25JbWFnZSgkY29sX3N0YXJ0LCAkcm93X3N0YXJ0LCAkeDEsICR5MSwgJHdpZHRoLCAkaGVpZ2h0KQoJewoJCS8vIEluaXRpYWxpc2UgZW5kIGNlbGwgdG8gdGhlIHNhbWUgYXMgdGhlIHN0YXJ0IGNlbGwKCQkkY29sX2VuZAk9ICRjb2xfc3RhcnQ7ICAvLyBDb2wgY29udGFpbmluZyBsb3dlciByaWdodCBjb3JuZXIgb2Ygb2JqZWN0CgkJJHJvd19lbmQJPSAkcm93X3N0YXJ0OyAgLy8gUm93IGNvbnRhaW5pbmcgYm90dG9tIHJpZ2h0IGNvcm5lciBvZiBvYmplY3QKCgkJLy8gWmVybyB0aGUgc3BlY2lmaWVkIG9mZnNldCBpZiBncmVhdGVyIHRoYW4gdGhlIGNlbGwgZGltZW5zaW9ucwoJCWlmICgkeDEgPj0gUEhQRXhjZWxfU2hhcmVkX0V4Y2VsNTo6c2l6ZUNvbCgkdGhpcy0+X3BocFNoZWV0LCBQSFBFeGNlbF9DZWxsOjpzdHJpbmdGcm9tQ29sdW1uSW5kZXgoJGNvbF9zdGFydCkpKSB7CgkJCSR4MSA9IDA7CgkJfQoJCWlmICgkeTEgPj0gUEhQRXhjZWxfU2hhcmVkX0V4Y2VsNTo6c2l6ZVJvdygkdGhpcy0+X3BocFNoZWV0LCAkcm93X3N0YXJ0ICsgMSkpIHsKCQkJJHkxID0gMDsKCQl9CgoJCSR3aWR0aAkgID0gJHdpZHRoICArICR4MSAtMTsKCQkkaGVpZ2h0CSA9ICRoZWlnaHQgKyAkeTEgLTE7CgoJCS8vIFN1YnRyYWN0IHRoZSB1bmRlcmx5aW5nIGNlbGwgd2lkdGhzIHRvIGZpbmQgdGhlIGVuZCBjZWxsIG9mIHRoZSBpbWFnZQoJCXdoaWxlICgkd2lkdGggPj0gUEhQRXhjZWxfU2hhcmVkX0V4Y2VsNTo6c2l6ZUNvbCgkdGhpcy0+X3BocFNoZWV0LCBQSFBFeGNlbF9DZWxsOjpzdHJpbmdGcm9tQ29sdW1uSW5kZXgoJGNvbF9lbmQpKSkgewoJCQkkd2lkdGggLT0gUEhQRXhjZWxfU2hhcmVkX0V4Y2VsNTo6c2l6ZUNvbCgkdGhpcy0+X3BocFNoZWV0LCBQSFBFeGNlbF9DZWxsOjpzdHJpbmdGcm9tQ29sdW1uSW5kZXgoJGNvbF9lbmQpKTsKCQkJKyskY29sX2VuZDsKCQl9CgoJCS8vIFN1YnRyYWN0IHRoZSB1bmRlcmx5aW5nIGNlbGwgaGVpZ2h0cyB0byBmaW5kIHRoZSBlbmQgY2VsbCBvZiB0aGUgaW1hZ2UKCQl3aGlsZSAoJGhlaWdodCA+PSBQSFBFeGNlbF9TaGFyZWRfRXhjZWw1OjpzaXplUm93KCR0aGlzLT5fcGhwU2hlZXQsICRyb3dfZW5kICsgMSkpIHsKCQkJJGhlaWdodCAtPSBQSFBFeGNlbF9TaGFyZWRfRXhjZWw1OjpzaXplUm93KCR0aGlzLT5fcGhwU2hlZXQsICRyb3dfZW5kICsgMSk7CgkJCSsrJHJvd19lbmQ7CgkJfQoKCQkvLyBCaXRtYXAgaXNuJ3QgYWxsb3dlZCB0byBzdGFydCBvciBmaW5pc2ggaW4gYSBoaWRkZW4gY2VsbCwgaS5lLiBhIGNlbGwKCQkvLyB3aXRoIHplcm8gZWlnaHQgb3Igd2lkdGguCgkJLy8KCQlpZiAoUEhQRXhjZWxfU2hhcmVkX0V4Y2VsNTo6c2l6ZUNvbCgkdGhpcy0+X3BocFNoZWV0LCBQSFBFeGNlbF9DZWxsOjpzdHJpbmdGcm9tQ29sdW1uSW5kZXgoJGNvbF9zdGFydCkpID09IDApIHsKCQkJcmV0dXJuOwoJCX0KCQlpZiAoUEhQRXhjZWxfU2hhcmVkX0V4Y2VsNTo6c2l6ZUNvbCgkdGhpcy0+X3BocFNoZWV0LCBQSFBFeGNlbF9DZWxsOjpzdHJpbmdGcm9tQ29sdW1uSW5kZXgoJGNvbF9lbmQpKSAgID09IDApIHsKCQkJcmV0dXJuOwoJCX0KCQlpZiAoUEhQRXhjZWxfU2hhcmVkX0V4Y2VsNTo6c2l6ZVJvdygkdGhpcy0+X3BocFNoZWV0LCAkcm93X3N0YXJ0ICsgMSkgPT0gMCkgewoJCQlyZXR1cm47CgkJfQoJCWlmIChQSFBFeGNlbF9TaGFyZWRfRXhjZWw1OjpzaXplUm93KCR0aGlzLT5fcGhwU2hlZXQsICRyb3dfZW5kICsgMSkgICA9PSAwKSB7CgkJCXJldHVybjsKCQl9CgoJCS8vIENvbnZlcnQgdGhlIHBpeGVsIHZhbHVlcyB0byB0aGUgcGVyY2VudGFnZSB2YWx1ZSBleHBlY3RlZCBieSBFeGNlbAoJCSR4MSA9ICR4MQkgLyBQSFBFeGNlbF9TaGFyZWRfRXhjZWw1OjpzaXplQ29sKCR0aGlzLT5fcGhwU2hlZXQsIFBIUEV4Y2VsX0NlbGw6OnN0cmluZ0Zyb21Db2x1bW5JbmRleCgkY29sX3N0YXJ0KSkgICAqIDEwMjQ7CgkJJHkxID0gJHkxCSAvIFBIUEV4Y2VsX1NoYXJlZF9FeGNlbDU6OnNpemVSb3coJHRoaXMtPl9waHBTaGVldCwgJHJvd19zdGFydCArIDEpICAgKiAgMjU2OwoJCSR4MiA9ICR3aWR0aCAgLyBQSFBFeGNlbF9TaGFyZWRfRXhjZWw1OjpzaXplQ29sKCR0aGlzLT5fcGhwU2hlZXQsIFBIUEV4Y2VsX0NlbGw6OnN0cmluZ0Zyb21Db2x1bW5JbmRleCgkY29sX2VuZCkpCSAqIDEwMjQ7IC8vIERpc3RhbmNlIHRvIHJpZ2h0IHNpZGUgb2Ygb2JqZWN0CgkJJHkyID0gJGhlaWdodCAvIFBIUEV4Y2VsX1NoYXJlZF9FeGNlbDU6OnNpemVSb3coJHRoaXMtPl9waHBTaGVldCwgJHJvd19lbmQgKyAxKQkgKiAgMjU2OyAvLyBEaXN0YW5jZSB0byBib3R0b20gb2Ygb2JqZWN0CgoJCSR0aGlzLT5fd3JpdGVPYmpQaWN0dXJlKCRjb2xfc3RhcnQsICR4MSwKCQkJCQkJCQkgJHJvd19zdGFydCwgJHkxLAoJCQkJCQkJCSAkY29sX2VuZCwgJHgyLAoJCQkJCQkJCSAkcm93X2VuZCwgJHkyKTsKCX0KCgkvKioKCSAqIFN0b3JlIHRoZSBPQkogcmVjb3JkIHRoYXQgcHJlY2VkZXMgYW4gSU1EQVRBIHJlY29yZC4gVGhpcyBjb3VsZCBiZSBnZW5lcmFsaXNlCgkgKiB0byBzdXBwb3J0IG90aGVyIEV4Y2VsIG9iamVjdHMuCgkgKgoJICogQHBhcmFtIGludGVnZXIgJGNvbEwgQ29sdW1uIGNvbnRhaW5pbmcgdXBwZXIgbGVmdCBjb3JuZXIgb2Ygb2JqZWN0CgkgKiBAcGFyYW0gaW50ZWdlciAkZHhMICBEaXN0YW5jZSBmcm9tIGxlZnQgc2lkZSBvZiBjZWxsCgkgKiBAcGFyYW0gaW50ZWdlciAkcndUICBSb3cgY29udGFpbmluZyB0b3AgbGVmdCBjb3JuZXIgb2Ygb2JqZWN0CgkgKiBAcGFyYW0gaW50ZWdlciAkZHlUICBEaXN0YW5jZSBmcm9tIHRvcCBvZiBjZWxsCgkgKiBAcGFyYW0gaW50ZWdlciAkY29sUiBDb2x1bW4gY29udGFpbmluZyBsb3dlciByaWdodCBjb3JuZXIgb2Ygb2JqZWN0CgkgKiBAcGFyYW0gaW50ZWdlciAkZHhSICBEaXN0YW5jZSBmcm9tIHJpZ2h0IG9mIGNlbGwKCSAqIEBwYXJhbSBpbnRlZ2VyICRyd0IgIFJvdyBjb250YWluaW5nIGJvdHRvbSByaWdodCBjb3JuZXIgb2Ygb2JqZWN0CgkgKiBAcGFyYW0gaW50ZWdlciAkZHlCICBEaXN0YW5jZSBmcm9tIGJvdHRvbSBvZiBjZWxsCgkgKi8KCXByaXZhdGUgZnVuY3Rpb24gX3dyaXRlT2JqUGljdHVyZSgkY29sTCwkZHhMLCRyd1QsJGR5VCwkY29sUiwkZHhSLCRyd0IsJGR5QikKCXsKCQkkcmVjb3JkCSAgPSAweDAwNWQ7ICAgLy8gUmVjb3JkIGlkZW50aWZpZXIKCQkkbGVuZ3RoCSAgPSAweDAwM2M7ICAgLy8gQnl0ZXMgdG8gZm9sbG93CgoJCSRjT2JqCQk9IDB4MDAwMTsgICAvLyBDb3VudCBvZiBvYmplY3RzIGluIGZpbGUgKHNldCB0byAxKQoJCSRPVAkJICA9IDB4MDAwODsgICAvLyBPYmplY3QgdHlwZS4gOCA9IFBpY3R1cmUKCQkkaWQJCSAgPSAweDAwMDE7ICAgLy8gT2JqZWN0IElECgkJJGdyYml0CSAgID0gMHgwNjE0OyAgIC8vIE9wdGlvbiBmbGFncwoKCQkkY2JNYWNybwkgPSAweDAwMDA7ICAgLy8gTGVuZ3RoIG9mIEZNTEEgc3RydWN0dXJlCgkJJFJlc2VydmVkMSAgID0gMHgwMDAwOyAgIC8vIFJlc2VydmVkCgkJJFJlc2VydmVkMiAgID0gMHgwMDAwOyAgIC8vIFJlc2VydmVkCgoJCSRpY3ZCYWNrCSA9IDB4MDk7CSAvLyBCYWNrZ3JvdW5kIGNvbG91cgoJCSRpY3ZGb3JlCSA9IDB4MDk7CSAvLyBGb3JlZ3JvdW5kIGNvbG91cgoJCSRmbHMJCSA9IDB4MDA7CSAvLyBGaWxsIHBhdHRlcm4KCQkkZkF1dG8JICAgPSAweDAwOwkgLy8gQXV0b21hdGljIGZpbGwKCQkkaWN2CQkgPSAweDA4OwkgLy8gTGluZSBjb2xvdXIKCQkkbG5zCQkgPSAweGZmOwkgLy8gTGluZSBzdHlsZQoJCSRsbncJCSA9IDB4MDE7CSAvLyBMaW5lIHdlaWdodAoJCSRmQXV0b0IJICA9IDB4MDA7CSAvLyBBdXRvbWF0aWMgYm9yZGVyCgkJJGZycwkJID0gMHgwMDAwOyAgIC8vIEZyYW1lIHN0eWxlCgkJJGNmCQkgID0gMHgwMDA5OyAgIC8vIEltYWdlIGZvcm1hdCwgOSA9IGJpdG1hcAoJCSRSZXNlcnZlZDMgICA9IDB4MDAwMDsgICAvLyBSZXNlcnZlZAoJCSRjYlBpY3RGbWxhICA9IDB4MDAwMDsgICAvLyBMZW5ndGggb2YgRk1MQSBzdHJ1Y3R1cmUKCQkkUmVzZXJ2ZWQ0ICAgPSAweDAwMDA7ICAgLy8gUmVzZXJ2ZWQKCQkkZ3JiaXQyCSAgPSAweDAwMDE7ICAgLy8gT3B0aW9uIGZsYWdzCgkJJFJlc2VydmVkNSAgID0gMHgwMDAwOyAgIC8vIFJlc2VydmVkCgoKCQkkaGVhZGVyCSAgPSBwYWNrKCJ2diIsICRyZWNvcmQsICRsZW5ndGgpOwoJCSRkYXRhCQk9IHBhY2soIlYiLCAkY09iaik7CgkJJGRhdGEJICAgLj0gcGFjaygidiIsICRPVCk7CgkJJGRhdGEJICAgLj0gcGFjaygidiIsICRpZCk7CgkJJGRhdGEJICAgLj0gcGFjaygidiIsICRncmJpdCk7CgkJJGRhdGEJICAgLj0gcGFjaygidiIsICRjb2xMKTsKCQkkZGF0YQkgICAuPSBwYWNrKCJ2IiwgJGR4TCk7CgkJJGRhdGEJICAgLj0gcGFjaygidiIsICRyd1QpOwoJCSRkYXRhCSAgIC49IHBhY2soInYiLCAkZHlUKTsKCQkkZGF0YQkgICAuPSBwYWNrKCJ2IiwgJGNvbFIpOwoJCSRkYXRhCSAgIC49IHBhY2soInYiLCAkZHhSKTsKCQkkZGF0YQkgICAuPSBwYWNrKCJ2IiwgJHJ3Qik7CgkJJGRhdGEJICAgLj0gcGFjaygidiIsICRkeUIpOwoJCSRkYXRhCSAgIC49IHBhY2soInYiLCAkY2JNYWNybyk7CgkJJGRhdGEJICAgLj0gcGFjaygiViIsICRSZXNlcnZlZDEpOwoJCSRkYXRhCSAgIC49IHBhY2soInYiLCAkUmVzZXJ2ZWQyKTsKCQkkZGF0YQkgICAuPSBwYWNrKCJDIiwgJGljdkJhY2spOwoJCSRkYXRhCSAgIC49IHBhY2soIkMiLCAkaWN2Rm9yZSk7CgkJJGRhdGEJICAgLj0gcGFjaygiQyIsICRmbHMpOwoJCSRkYXRhCSAgIC49IHBhY2soIkMiLCAkZkF1dG8pOwoJCSRkYXRhCSAgIC49IHBhY2soIkMiLCAkaWN2KTsKCQkkZGF0YQkgICAuPSBwYWNrKCJDIiwgJGxucyk7CgkJJGRhdGEJICAgLj0gcGFjaygiQyIsICRsbncpOwoJCSRkYXRhCSAgIC49IHBhY2soIkMiLCAkZkF1dG9CKTsKCQkkZGF0YQkgICAuPSBwYWNrKCJ2IiwgJGZycyk7CgkJJGRhdGEJICAgLj0gcGFjaygiViIsICRjZik7CgkJJGRhdGEJICAgLj0gcGFjaygidiIsICRSZXNlcnZlZDMpOwoJCSRkYXRhCSAgIC49IHBhY2soInYiLCAkY2JQaWN0Rm1sYSk7CgkJJGRhdGEJICAgLj0gcGFjaygidiIsICRSZXNlcnZlZDQpOwoJCSRkYXRhCSAgIC49IHBhY2soInYiLCAkZ3JiaXQyKTsKCQkkZGF0YQkgICAuPSBwYWNrKCJWIiwgJFJlc2VydmVkNSk7CgoJCSR0aGlzLT5fYXBwZW5kKCRoZWFkZXIgLiAkZGF0YSk7Cgl9CgoJLyoqCgkgKiBDb252ZXJ0IGEgR0QtaW1hZ2UgaW50byB0aGUgaW50ZXJuYWwgZm9ybWF0LgoJICoKCSAqIEBhY2Nlc3MgcHJpdmF0ZQoJICogQHBhcmFtIHJlc291cmNlICRpbWFnZSBUaGUgaW1hZ2UgdG8gcHJvY2VzcwoJICogQHJldHVybiBhcnJheSBBcnJheSB3aXRoIGRhdGEgYW5kIHByb3BlcnRpZXMgb2YgdGhlIGJpdG1hcAoJICovCglmdW5jdGlvbiBfcHJvY2Vzc0JpdG1hcEdkKCRpbWFnZSkgewoJCSR3aWR0aCA9IGltYWdlc3goJGltYWdlKTsKCQkkaGVpZ2h0ID0gaW1hZ2VzeSgkaW1hZ2UpOwoKCQkkZGF0YSA9IHBhY2soIlZ2dnZ2IiwgMHgwMDBjLCAkd2lkdGgsICRoZWlnaHQsIDB4MDEsIDB4MTgpOwoJCWZvciAoJGo9JGhlaWdodDsgJGotLTsgKSB7CgkJCWZvciAoJGk9MDsgJGkgPCAkd2lkdGg7ICsrJGkpIHsKCQkJCSRjb2xvciA9IGltYWdlY29sb3JzZm9yaW5kZXgoJGltYWdlLCBpbWFnZWNvbG9yYXQoJGltYWdlLCAkaSwgJGopKTsKCQkJCWZvcmVhY2ggKGFycmF5KCJyZWQiLCAiZ3JlZW4iLCAiYmx1ZSIpIGFzICRrZXkpIHsKCQkJCQkkY29sb3JbJGtleV0gPSAkY29sb3JbJGtleV0gKyByb3VuZCgoMjU1IC0gJGNvbG9yWyRrZXldKSAqICRjb2xvclsiYWxwaGEiXSAvIDEyNyk7CgkJCQl9CgkJCQkkZGF0YSAuPSBjaHIoJGNvbG9yWyJibHVlIl0pIC4gY2hyKCRjb2xvclsiZ3JlZW4iXSkgLiBjaHIoJGNvbG9yWyJyZWQiXSk7CgkJCX0KCQkJaWYgKDMqJHdpZHRoICUgNCkgewoJCQkJJGRhdGEgLj0gc3RyX3JlcGVhdCgiXHgwMCIsIDQgLSAzKiR3aWR0aCAlIDQpOwoJCQl9CgkJfQoKCQlyZXR1cm4gYXJyYXkoJHdpZHRoLCAkaGVpZ2h0LCBzdHJsZW4oJGRhdGEpLCAkZGF0YSk7Cgl9CgoJLyoqCgkgKiBDb252ZXJ0IGEgMjQgYml0IGJpdG1hcCBpbnRvIHRoZSBtb2RpZmllZCBpbnRlcm5hbCBmb3JtYXQgdXNlZCBieSBXaW5kb3dzLgoJICogVGhpcyBpcyBkZXNjcmliZWQgaW4gQklUTUFQQ09SRUhFQURFUiBhbmQgQklUTUFQQ09SRUlORk8gc3RydWN0dXJlcyBpbiB0aGUKCSAqIE1TRE4gbGlicmFyeS4KCSAqCgkgKiBAYWNjZXNzIHByaXZhdGUKCSAqIEBwYXJhbSBzdHJpbmcgJGJpdG1hcCBUaGUgYml0bWFwIHRvIHByb2Nlc3MKCSAqIEByZXR1cm4gYXJyYXkgQXJyYXkgd2l0aCBkYXRhIGFuZCBwcm9wZXJ0aWVzIG9mIHRoZSBiaXRtYXAKCSAqLwoJZnVuY3Rpb24gX3Byb2Nlc3NCaXRtYXAoJGJpdG1hcCkKCXsKCQkvLyBPcGVuIGZpbGUuCgkJJGJtcF9mZCA9IEBmb3BlbigkYml0bWFwLCJyYiIpOwoJCWlmICghJGJtcF9mZCkgewoJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCJDb3VsZG4ndCBpbXBvcnQgJGJpdG1hcCIpOwoJCX0KCgkJLy8gU2x1cnAgdGhlIGZpbGUgaW50byBhIHN0cmluZy4KCQkkZGF0YSA9IGZyZWFkKCRibXBfZmQsIGZpbGVzaXplKCRiaXRtYXApKTsKCgkJLy8gQ2hlY2sgdGhhdCB0aGUgZmlsZSBpcyBiaWcgZW5vdWdoIHRvIGJlIGEgYml0bWFwLgoJCWlmIChzdHJsZW4oJGRhdGEpIDw9IDB4MzYpIHsKCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbigiJGJpdG1hcCBkb2Vzbid0IGNvbnRhaW4gZW5vdWdoIGRhdGEuXG4iKTsKCQl9CgoJCS8vIFRoZSBmaXJzdCAyIGJ5dGVzIGFyZSB1c2VkIHRvIGlkZW50aWZ5IHRoZSBiaXRtYXAuCgkJJGlkZW50aXR5ID0gdW5wYWNrKCJBMmlkZW50IiwgJGRhdGEpOwoJCWlmICgkaWRlbnRpdHlbJ2lkZW50J10gIT0gIkJNIikgewoJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCIkYml0bWFwIGRvZXNuJ3QgYXBwZWFyIHRvIGJlIGEgdmFsaWQgYml0bWFwIGltYWdlLlxuIik7CgkJfQoKCQkvLyBSZW1vdmUgYml0bWFwIGRhdGE6IElELgoJCSRkYXRhID0gc3Vic3RyKCRkYXRhLCAyKTsKCgkJLy8gUmVhZCBhbmQgcmVtb3ZlIHRoZSBiaXRtYXAgc2l6ZS4gVGhpcyBpcyBtb3JlIHJlbGlhYmxlIHRoYW4gcmVhZGluZwoJCS8vIHRoZSBkYXRhIHNpemUgYXQgb2Zmc2V0IDB4MjIuCgkJLy8KCQkkc2l6ZV9hcnJheSAgID0gdW5wYWNrKCJWc2EiLCBzdWJzdHIoJGRhdGEsIDAsIDQpKTsKCQkkc2l6ZSAgID0gJHNpemVfYXJyYXlbJ3NhJ107CgkJJGRhdGEgICA9IHN1YnN0cigkZGF0YSwgNCk7CgkJJHNpemUgIC09IDB4MzY7IC8vIFN1YnRyYWN0IHNpemUgb2YgYml0bWFwIGhlYWRlci4KCQkkc2l6ZSAgKz0gMHgwQzsgLy8gQWRkIHNpemUgb2YgQklGRiBoZWFkZXIuCgoJCS8vIFJlbW92ZSBiaXRtYXAgZGF0YTogcmVzZXJ2ZWQsIG9mZnNldCwgaGVhZGVyIGxlbmd0aC4KCQkkZGF0YSA9IHN1YnN0cigkZGF0YSwgMTIpOwoKCQkvLyBSZWFkIGFuZCByZW1vdmUgdGhlIGJpdG1hcCB3aWR0aCBhbmQgaGVpZ2h0LiBWZXJpZnkgdGhlIHNpemVzLgoJCSR3aWR0aF9hbmRfaGVpZ2h0ID0gdW5wYWNrKCJWMiIsIHN1YnN0cigkZGF0YSwgMCwgOCkpOwoJCSR3aWR0aCAgPSAkd2lkdGhfYW5kX2hlaWdodFsxXTsKCQkkaGVpZ2h0ID0gJHdpZHRoX2FuZF9oZWlnaHRbMl07CgkJJGRhdGEgICA9IHN1YnN0cigkZGF0YSwgOCk7CgkJaWYgKCR3aWR0aCA+IDB4RkZGRikgewoJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCIkYml0bWFwOiBsYXJnZXN0IGltYWdlIHdpZHRoIHN1cHBvcnRlZCBpcyA2NWsuXG4iKTsKCQl9CgkJaWYgKCRoZWlnaHQgPiAweEZGRkYpIHsKCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbigiJGJpdG1hcDogbGFyZ2VzdCBpbWFnZSBoZWlnaHQgc3VwcG9ydGVkIGlzIDY1ay5cbiIpOwoJCX0KCgkJLy8gUmVhZCBhbmQgcmVtb3ZlIHRoZSBiaXRtYXAgcGxhbmVzIGFuZCBicHAgZGF0YS4gVmVyaWZ5IHRoZW0uCgkJJHBsYW5lc19hbmRfYml0Y291bnQgPSB1bnBhY2soInYyIiwgc3Vic3RyKCRkYXRhLCAwLCA0KSk7CgkJJGRhdGEgPSBzdWJzdHIoJGRhdGEsIDQpOwoJCWlmICgkcGxhbmVzX2FuZF9iaXRjb3VudFsyXSAhPSAyNCkgeyAvLyBCaXRjb3VudAoJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCIkYml0bWFwIGlzbid0IGEgMjRiaXQgdHJ1ZSBjb2xvciBiaXRtYXAuXG4iKTsKCQl9CgkJaWYgKCRwbGFuZXNfYW5kX2JpdGNvdW50WzFdICE9IDEpIHsKCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbigiJGJpdG1hcDogb25seSAxIHBsYW5lIHN1cHBvcnRlZCBpbiBiaXRtYXAgaW1hZ2UuXG4iKTsKCQl9CgoJCS8vIFJlYWQgYW5kIHJlbW92ZSB0aGUgYml0bWFwIGNvbXByZXNzaW9uLiBWZXJpZnkgY29tcHJlc3Npb24uCgkJJGNvbXByZXNzaW9uID0gdW5wYWNrKCJWY29tcCIsIHN1YnN0cigkZGF0YSwgMCwgNCkpOwoJCSRkYXRhID0gc3Vic3RyKCRkYXRhLCA0KTsKCgkJLy8kY29tcHJlc3Npb24gPSAwOwoJCWlmICgkY29tcHJlc3Npb25bJ2NvbXAnXSAhPSAwKSB7CgkJCXRocm93IG5ldyBFeGNlcHRpb24oIiRiaXRtYXA6IGNvbXByZXNzaW9uIG5vdCBzdXBwb3J0ZWQgaW4gYml0bWFwIGltYWdlLlxuIik7CgkJfQoKCQkvLyBSZW1vdmUgYml0bWFwIGRhdGE6IGRhdGEgc2l6ZSwgaHJlcywgdnJlcywgY29sb3VycywgaW1wLiBjb2xvdXJzLgoJCSRkYXRhID0gc3Vic3RyKCRkYXRhLCAyMCk7CgoJCS8vIEFkZCB0aGUgQklUTUFQQ09SRUhFQURFUiBkYXRhCgkJJGhlYWRlciAgPSBwYWNrKCJWdnZ2diIsIDB4MDAwYywgJHdpZHRoLCAkaGVpZ2h0LCAweDAxLCAweDE4KTsKCQkkZGF0YQk9ICRoZWFkZXIgLiAkZGF0YTsKCgkJcmV0dXJuIChhcnJheSgkd2lkdGgsICRoZWlnaHQsICRzaXplLCAkZGF0YSkpOwoJfQoKCS8qKgoJICogU3RvcmUgdGhlIHdpbmRvdyB6b29tIGZhY3Rvci4gVGhpcyBzaG91bGQgYmUgYSByZWR1Y2VkIGZyYWN0aW9uIGJ1dCBmb3IKCSAqIHNpbXBsaWNpdHkgd2Ugd2lsbCBzdG9yZSBhbGwgZnJhY3Rpb25zIHdpdGggYSBudW1lcmF0b3Igb2YgMTAwLgoJICovCglwcml2YXRlIGZ1bmN0aW9uIF93cml0ZVpvb20oKQoJewoJCS8vIElmIHNjYWxlIGlzIDEwMCB3ZSBkb24ndCBuZWVkIHRvIHdyaXRlIGEgcmVjb3JkCgkJaWYgKCR0aGlzLT5fcGhwU2hlZXQtPmdldFNoZWV0VmlldygpLT5nZXRab29tU2NhbGUoKSA9PSAxMDApIHsKCQkJcmV0dXJuOwoJCX0KCgkJJHJlY29yZAkgID0gMHgwMEEwOwkJCSAgIC8vIFJlY29yZCBpZGVudGlmaWVyCgkJJGxlbmd0aAkgID0gMHgwMDA0OwkJCSAgIC8vIEJ5dGVzIHRvIGZvbGxvdwoKCQkkaGVhZGVyCSAgPSBwYWNrKCJ2diIsICRyZWNvcmQsICRsZW5ndGgpOwoJCSRkYXRhCQk9IHBhY2soInZ2IiwgJHRoaXMtPl9waHBTaGVldC0+Z2V0U2hlZXRWaWV3KCktPmdldFpvb21TY2FsZSgpLCAxMDApOwoJCSR0aGlzLT5fYXBwZW5kKCRoZWFkZXIgLiAkZGF0YSk7Cgl9CgoJLyoqCgkgKiBHZXQgRXNjaGVyIG9iamVjdAoJICoKCSAqIEByZXR1cm4gUEhQRXhjZWxfU2hhcmVkX0VzY2hlcgoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0RXNjaGVyKCkKCXsKCQlyZXR1cm4gJHRoaXMtPl9lc2NoZXI7Cgl9CgoJLyoqCgkgKiBTZXQgRXNjaGVyIG9iamVjdAoJICoKCSAqIEBwYXJhbSBQSFBFeGNlbF9TaGFyZWRfRXNjaGVyICRwVmFsdWUKCSAqLwoJcHVibGljIGZ1bmN0aW9uIHNldEVzY2hlcihQSFBFeGNlbF9TaGFyZWRfRXNjaGVyICRwVmFsdWUgPSBudWxsKQoJewoJCSR0aGlzLT5fZXNjaGVyID0gJHBWYWx1ZTsKCX0KCgkvKioKCSAqIFdyaXRlIE1TT0RSQVdJTkcgcmVjb3JkCgkgKi8KCXByaXZhdGUgZnVuY3Rpb24gX3dyaXRlTXNvRHJhd2luZygpCgl7CgkJLy8gd3JpdGUgdGhlIEVzY2hlciBzdHJlYW0gaWYgbmVjZXNzYXJ5CgkJaWYgKGlzc2V0KCR0aGlzLT5fZXNjaGVyKSkgewoJCQkkd3JpdGVyID0gbmV3IFBIUEV4Y2VsX1dyaXRlcl9FeGNlbDVfRXNjaGVyKCR0aGlzLT5fZXNjaGVyKTsKCQkJJGRhdGEgPSAkd3JpdGVyLT5jbG9zZSgpOwoJCQkkc3BPZmZzZXRzID0gJHdyaXRlci0+Z2V0U3BPZmZzZXRzKCk7CgoJCQkvLyB3cml0ZSB0aGUgbmVjY2VzYXJ5IE1TT0RSQVdJTkcsIE9CSiByZWNvcmRzCgoJCQkvLyBzcGxpdCB0aGUgRXNjaGVyIHN0cmVhbQoJCQkkc3BPZmZzZXRzWzBdID0gMDsKCQkJJG5tID0gY291bnQoJHNwT2Zmc2V0cykgLSAxOyAvLyBudW1iZXIgb2Ygc2hhcGVzIGV4Y2x1ZGluZyBmaXJzdCBzaGFwZQoJCQlmb3IgKCRpID0gMTsgJGkgPD0gJG5tOyArKyRpKSB7CgkJCQkvLyBNU09EUkFXSU5HIHJlY29yZAoJCQkJJHJlY29yZCA9IDB4MDBFQzsJCQkvLyBSZWNvcmQgaWRlbnRpZmllcgoKCQkJCS8vIGNodW5rIG9mIEVzY2hlciBzdHJlYW0gZm9yIG9uZSBzaGFwZQoKCQkJCSRkYXRhQ2h1bmsgPSBzdWJzdHIoJGRhdGEsICRzcE9mZnNldHNbJGkgLTFdLCAkc3BPZmZzZXRzWyRpXSAtICRzcE9mZnNldHNbJGkgLSAxXSk7CgoJCQkJJGxlbmd0aCA9IHN0cmxlbigkZGF0YUNodW5rKTsKCQkJCSRoZWFkZXIgPSBwYWNrKCJ2diIsICRyZWNvcmQsICRsZW5ndGgpOwoKCQkJCSR0aGlzLT5fYXBwZW5kKCRoZWFkZXIgLiAkZGF0YUNodW5rKTsKCgkJCQkvLyBPQkogcmVjb3JkCgkJCQkkcmVjb3JkID0gMHgwMDVEOyAvLyByZWNvcmQgaWRlbnRpZmllcgoJCQkJJG9iakRhdGEgPSAnJzsKCgkJCQkvLyBmdENtbwoJCQkJJG9iakRhdGEgLj0KCQkJCQlwYWNrKCd2dnZ2dlZWVicKCQkJCQkJLCAweDAwMTUJLy8gMHgwMDE1ID0gZnRDbW8KCQkJCQkJLCAweDAwMTIJLy8gbGVuZ3RoIG9mIGZ0Q21vIGRhdGEKCQkJCQkJLCAweDAwMDgJLy8gb2JqZWN0IHR5cGUsIDB4MDAwOCA9IHBpY3R1cmUKCQkJCQkJLCAkaQkJLy8gb2JqZWN0IGlkIG51bWJlciwgRXhjZWwgc2VlbXMgdG8gdXNlIDEtYmFzZWQgaW5kZXgsIGxvY2FsIGZvciB0aGUgc2hlZXQKCQkJCQkJLCAweDYwMTEJLy8gb3B0aW9uIGZsYWdzLCAweDYwMTEgaXMgd2hhdCBPcGVuT2ZmaWNlLm9yZyB1c2VzCgkJCQkJCSwgMAkJCS8vIHJlc2VydmVkCgkJCQkJCSwgMAkJCS8vIHJlc2VydmVkCgkJCQkJCSwgMAkJCS8vIHJlc2VydmVkCgkJCQkJKTsKCQkJCS8vIGZ0RW5kCgkJCQkkb2JqRGF0YSAuPQoJCQkJCXBhY2soJ3Z2JwoJCQkJCQksIDB4MDAwMAkvLyAweDAwMDAgPSBmdEVuZAoJCQkJCQksIDB4MDAwMAkvLyBsZW5ndGggb2YgZnRFbmQgZGF0YQoJCQkJCSk7CgoJCQkJJGxlbmd0aCA9IHN0cmxlbigkb2JqRGF0YSk7CgkJCQkkaGVhZGVyID0gcGFjaygndnYnLCAkcmVjb3JkLCAkbGVuZ3RoKTsKCQkJCSR0aGlzLT5fYXBwZW5kKCRoZWFkZXIgLiAkb2JqRGF0YSk7CgkJCX0KCQl9Cgl9CgoJLyoqCgkgKiBTdG9yZSB0aGUgREFUQVZBTElEQVRJT05TIGFuZCBEQVRBVkFMSURBVElPTiByZWNvcmRzLgoJICovCglwcml2YXRlIGZ1bmN0aW9uIF93cml0ZURhdGFWYWxpZGl0eSgpCgl7CgkJLy8gRGF0YXZhbGlkYXRpb24gY29sbGVjdGlvbgoJCSRkYXRhVmFsaWRhdGlvbkNvbGxlY3Rpb24gPSAkdGhpcy0+X3BocFNoZWV0LT5nZXREYXRhVmFsaWRhdGlvbkNvbGxlY3Rpb24oKTsKCgkJLy8gV3JpdGUgZGF0YSB2YWxpZGF0aW9ucz8KCQlpZiAoIWVtcHR5KCRkYXRhVmFsaWRhdGlvbkNvbGxlY3Rpb24pKSB7CgoJCQkvLyBEQVRBVkFMSURBVElPTlMgcmVjb3JkCgkJCSRyZWNvcmQgPSAweDAxQjI7CSAgLy8gUmVjb3JkIGlkZW50aWZpZXIKCQkJJGxlbmd0aAkgID0gMHgwMDEyOwkgIC8vIEJ5dGVzIHRvIGZvbGxvdwoKCQkJJGdyYml0ICA9IDB4MDAwMDsJICAgLy8gUHJvbXB0IGJveCBhdCBjZWxsLCBubyBjYWNoZWQgdmFsaWRpdHkgZGF0YSBhdCBEViByZWNvcmRzCgkJCSRob3JQb3MJICA9IDB4MDAwMDAwMDA7ICAvLyBIb3Jpem9udGFsIHBvc2l0aW9uIG9mIHByb21wdCBib3gsIGlmIGZpeGVkIHBvc2l0aW9uCgkJCSR2ZXJQb3MJICA9IDB4MDAwMDAwMDA7ICAvLyBWZXJ0aWNhbCBwb3NpdGlvbiBvZiBwcm9tcHQgYm94LCBpZiBmaXhlZCBwb3NpdGlvbgoJCQkkb2JqSWQgID0gMHhGRkZGRkZGRjsgIC8vIE9iamVjdCBpZGVudGlmaWVyIG9mIGRyb3AgZG93biBhcnJvdyBvYmplY3QsIG9yIC0xIGlmIG5vdCB2aXNpYmxlCgoJCQkkaGVhZGVyCSAgPSBwYWNrKCd2dicsICRyZWNvcmQsICRsZW5ndGgpOwoJCQkkZGF0YQkJPSBwYWNrKCd2VlZWVicsICRncmJpdCwgJGhvclBvcywgJHZlclBvcywgJG9iaklkLAoJCQkJCQkJCQkJIGNvdW50KCRkYXRhVmFsaWRhdGlvbkNvbGxlY3Rpb24pKTsKCQkJJHRoaXMtPl9hcHBlbmQoJGhlYWRlci4kZGF0YSk7CgoJCQkvLyBEQVRBVkFMSURBVElPTiByZWNvcmRzCgkJCSRyZWNvcmQgPSAweDAxQkU7CQkJICAvLyBSZWNvcmQgaWRlbnRpZmllcgoKCQkJZm9yZWFjaCAoJGRhdGFWYWxpZGF0aW9uQ29sbGVjdGlvbiBhcyAkY2VsbENvb3JkaW5hdGUgPT4gJGRhdGFWYWxpZGF0aW9uKSB7CgkJCQkvLyBpbml0aWFsaXplIHJlY29yZCBkYXRhCgkJCQkkZGF0YSA9ICcnOwoKCQkJCS8vIG9wdGlvbnMKCQkJCSRvcHRpb25zID0gMHgwMDAwMDAwMDsKCgkJCQkvLyBkYXRhIHR5cGUKCQkJCSR0eXBlID0gJGRhdGFWYWxpZGF0aW9uLT5nZXRUeXBlKCk7CgkJCQlzd2l0Y2ggKCR0eXBlKSB7CgkJCQkJY2FzZSBQSFBFeGNlbF9DZWxsX0RhdGFWYWxpZGF0aW9uOjpUWVBFX05PTkU6CQkkdHlwZSA9IDB4MDA7CWJyZWFrOwoJCQkJCWNhc2UgUEhQRXhjZWxfQ2VsbF9EYXRhVmFsaWRhdGlvbjo6VFlQRV9XSE9MRToJCSR0eXBlID0gMHgwMTsJYnJlYWs7CgkJCQkJY2FzZSBQSFBFeGNlbF9DZWxsX0RhdGFWYWxpZGF0aW9uOjpUWVBFX0RFQ0lNQUw6CSR0eXBlID0gMHgwMjsJYnJlYWs7CgkJCQkJY2FzZSBQSFBFeGNlbF9DZWxsX0RhdGFWYWxpZGF0aW9uOjpUWVBFX0xJU1Q6CQkkdHlwZSA9IDB4MDM7CWJyZWFrOwoJCQkJCWNhc2UgUEhQRXhjZWxfQ2VsbF9EYXRhVmFsaWRhdGlvbjo6VFlQRV9EQVRFOgkJJHR5cGUgPSAweDA0OwlicmVhazsKCQkJCQljYXNlIFBIUEV4Y2VsX0NlbGxfRGF0YVZhbGlkYXRpb246OlRZUEVfVElNRToJCSR0eXBlID0gMHgwNTsJYnJlYWs7CgkJCQkJY2FzZSBQSFBFeGNlbF9DZWxsX0RhdGFWYWxpZGF0aW9uOjpUWVBFX1RFWFRMRU5HVEg6CSR0eXBlID0gMHgwNjsJYnJlYWs7CgkJCQkJY2FzZSBQSFBFeGNlbF9DZWxsX0RhdGFWYWxpZGF0aW9uOjpUWVBFX0NVU1RPTToJCSR0eXBlID0gMHgwNzsJYnJlYWs7CgkJCQl9CgkJCQkkb3B0aW9ucyB8PSAkdHlwZSA8PCAwOwoKCQkJCS8vIGVycm9yIHN0eWxlCgkJCQkkZXJyb3JTdHlsZSA9ICRkYXRhVmFsaWRhdGlvbi0+Z2V0VHlwZSgpOwoJCQkJc3dpdGNoICgkZXJyb3JTdHlsZSkgewoJCQkJCWNhc2UgUEhQRXhjZWxfQ2VsbF9EYXRhVmFsaWRhdGlvbjo6U1RZTEVfU1RPUDoJCQkkZXJyb3JTdHlsZSA9IDB4MDA7CQlicmVhazsKCQkJCQljYXNlIFBIUEV4Y2VsX0NlbGxfRGF0YVZhbGlkYXRpb246OlNUWUxFX1dBUk5JTkc6CQkkZXJyb3JTdHlsZSA9IDB4MDE7CQlicmVhazsKCQkJCQljYXNlIFBIUEV4Y2VsX0NlbGxfRGF0YVZhbGlkYXRpb246OlNUWUxFX0lORk9STUFUSU9OOgkkZXJyb3JTdHlsZSA9IDB4MDI7CQlicmVhazsKCQkJCX0KCQkJCSRvcHRpb25zIHw9ICRlcnJvclN0eWxlIDw8IDQ7CgoJCQkJLy8gZXhwbGljaXQgZm9ybXVsYT8KCQkJCWlmICgkdHlwZSA9PSAweDAzICYmIHByZWdfbWF0Y2goJy9eXCIuKlwiJC8nLCAkZGF0YVZhbGlkYXRpb24tPmdldEZvcm11bGExKCkpKSB7CgkJCQkJJG9wdGlvbnMgfD0gMHgwMQkJCQk8PCA3OwoJCQkJfQoKCQkJCS8vIGVtcHR5IGNlbGxzIGFsbG93ZWQKCQkJCSRvcHRpb25zIHw9ICRkYXRhVmFsaWRhdGlvbi0+Z2V0QWxsb3dCbGFuaygpIDw8IDg7CgoJCQkJLy8gc2hvdyBkcm9wIGRvd24KCQkJCSRvcHRpb25zIHw9ICghJGRhdGFWYWxpZGF0aW9uLT5nZXRTaG93RHJvcERvd24oKSkgPDwgOTsKCgkJCQkvLyBzaG93IGlucHV0IG1lc3NhZ2UKCQkJCSRvcHRpb25zIHw9ICRkYXRhVmFsaWRhdGlvbi0+Z2V0U2hvd0lucHV0TWVzc2FnZSgpIDw8IDE4OwoKCQkJCS8vIHNob3cgZXJyb3IgbWVzc2FnZQoJCQkJJG9wdGlvbnMgfD0gJGRhdGFWYWxpZGF0aW9uLT5nZXRTaG93RXJyb3JNZXNzYWdlKCkgPDwgMTk7CgoJCQkJLy8gY29uZGl0aW9uIG9wZXJhdG9yCgkJCQkkb3BlcmF0b3IgPSAkZGF0YVZhbGlkYXRpb24tPmdldE9wZXJhdG9yKCk7CgkJCQlzd2l0Y2ggKCRvcGVyYXRvcikgewoJCQkJCWNhc2UgUEhQRXhjZWxfQ2VsbF9EYXRhVmFsaWRhdGlvbjo6T1BFUkFUT1JfQkVUV0VFTjogJG9wZXJhdG9yID0gMHgwMAkJCTsJYnJlYWs7CgkJCQkJY2FzZSBQSFBFeGNlbF9DZWxsX0RhdGFWYWxpZGF0aW9uOjpPUEVSQVRPUl9OT1RCRVRXRUVOOiAkb3BlcmF0b3IgPSAweDAxCQk7CWJyZWFrOwoJCQkJCWNhc2UgUEhQRXhjZWxfQ2VsbF9EYXRhVmFsaWRhdGlvbjo6T1BFUkFUT1JfRVFVQUw6ICRvcGVyYXRvciA9IDB4MDIJCQkJOwlicmVhazsKCQkJCQljYXNlIFBIUEV4Y2VsX0NlbGxfRGF0YVZhbGlkYXRpb246Ok9QRVJBVE9SX05PVEVRVUFMOiAkb3BlcmF0b3IgPSAweDAzCQkJOwlicmVhazsKCQkJCQljYXNlIFBIUEV4Y2VsX0NlbGxfRGF0YVZhbGlkYXRpb246Ok9QRVJBVE9SX0dSRUFURVJUSEFOOiAkb3BlcmF0b3IgPSAweDA0CQk7CWJyZWFrOwoJCQkJCWNhc2UgUEhQRXhjZWxfQ2VsbF9EYXRhVmFsaWRhdGlvbjo6T1BFUkFUT1JfTEVTU1RIQU46ICRvcGVyYXRvciA9IDB4MDUJCQk7CWJyZWFrOwoJCQkJCWNhc2UgUEhQRXhjZWxfQ2VsbF9EYXRhVmFsaWRhdGlvbjo6T1BFUkFUT1JfR1JFQVRFUlRIQU5PUkVRVUFMOiAkb3BlcmF0b3IgPSAweDA2OwlicmVhazsKCQkJCQljYXNlIFBIUEV4Y2VsX0NlbGxfRGF0YVZhbGlkYXRpb246Ok9QRVJBVE9SX0xFU1NUSEFOT1JFUVVBTDogJG9wZXJhdG9yID0gMHgwNwk7CWJyZWFrOwoJCQkJfQoJCQkJJG9wdGlvbnMgfD0gJG9wZXJhdG9yIDw8IDIwOwoKCQkJCSRkYXRhCQk9IHBhY2soJ1YnLCAkb3B0aW9ucyk7CgoJCQkJLy8gcHJvbXB0IHRpdGxlCgkJCQkkcHJvbXB0VGl0bGUgPSAkZGF0YVZhbGlkYXRpb24tPmdldFByb21wdFRpdGxlKCkgIT09ICcnID8KCQkJCQkkZGF0YVZhbGlkYXRpb24tPmdldFByb21wdFRpdGxlKCkgOiBjaHIoMCk7CgkJCQkkZGF0YSAuPSBQSFBFeGNlbF9TaGFyZWRfU3RyaW5nOjpVVEY4dG9CSUZGOFVuaWNvZGVMb25nKCRwcm9tcHRUaXRsZSk7CgoJCQkJLy8gZXJyb3IgdGl0bGUKCQkJCSRlcnJvclRpdGxlID0gJGRhdGFWYWxpZGF0aW9uLT5nZXRFcnJvclRpdGxlKCkgIT09ICcnID8KCQkJCQkkZGF0YVZhbGlkYXRpb24tPmdldEVycm9yVGl0bGUoKSA6IGNocigwKTsKCQkJCSRkYXRhIC49IFBIUEV4Y2VsX1NoYXJlZF9TdHJpbmc6OlVURjh0b0JJRkY4VW5pY29kZUxvbmcoJGVycm9yVGl0bGUpOwoKCQkJCS8vIHByb21wdCB0ZXh0CgkJCQkkcHJvbXB0ID0gJGRhdGFWYWxpZGF0aW9uLT5nZXRQcm9tcHQoKSAhPT0gJycgPwoJCQkJCSRkYXRhVmFsaWRhdGlvbi0+Z2V0UHJvbXB0KCkgOiBjaHIoMCk7CgkJCQkkZGF0YSAuPSBQSFBFeGNlbF9TaGFyZWRfU3RyaW5nOjpVVEY4dG9CSUZGOFVuaWNvZGVMb25nKCRwcm9tcHQpOwoKCQkJCS8vIGVycm9yIHRleHQKCQkJCSRlcnJvciA9ICRkYXRhVmFsaWRhdGlvbi0+Z2V0RXJyb3IoKSAhPT0gJycgPwoJCQkJCSRkYXRhVmFsaWRhdGlvbi0+Z2V0RXJyb3IoKSA6IGNocigwKTsKCQkJCSRkYXRhIC49IFBIUEV4Y2VsX1NoYXJlZF9TdHJpbmc6OlVURjh0b0JJRkY4VW5pY29kZUxvbmcoJGVycm9yKTsKCgkJCQkvLyBmb3JtdWxhIDEKCQkJCXRyeSB7CgkJCQkJJGZvcm11bGExID0gJGRhdGFWYWxpZGF0aW9uLT5nZXRGb3JtdWxhMSgpOwoJCQkJCWlmICgkdHlwZSA9PSAweDAzKSB7IC8vIGxpc3QgdHlwZQoJCQkJCQkkZm9ybXVsYTEgPSBzdHJfcmVwbGFjZSgnLCcsIGNocigwKSwgJGZvcm11bGExKTsKCQkJCQl9CgkJCQkJJHRoaXMtPl9wYXJzZXItPnBhcnNlKCRmb3JtdWxhMSk7CgkJCQkJJGZvcm11bGExID0gJHRoaXMtPl9wYXJzZXItPnRvUmV2ZXJzZVBvbGlzaCgpOwoJCQkJCSRzejEgPSBzdHJsZW4oJGZvcm11bGExKTsKCgkJCQl9IGNhdGNoKEV4Y2VwdGlvbiAkZSkgewoJCQkJCSRzejEgPSAwOwoJCQkJCSRmb3JtdWxhMSA9ICcnOwoJCQkJfQoJCQkJJGRhdGEgLj0gcGFjaygndnYnLCAkc3oxLCAweDAwMDApOwoJCQkJJGRhdGEgLj0gJGZvcm11bGExOwoKCQkJCS8vIGZvcm11bGEgMgoJCQkJdHJ5IHsKCQkJCQkkZm9ybXVsYTIgPSAkZGF0YVZhbGlkYXRpb24tPmdldEZvcm11bGEyKCk7CgkJCQkJaWYgKCRmb3JtdWxhMiA9PT0gJycpIHsKCQkJCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbignTm8gZm9ybXVsYTInKTsKCQkJCQl9CgkJCQkJJHRoaXMtPl9wYXJzZXItPnBhcnNlKCRmb3JtdWxhMik7CgkJCQkJJGZvcm11bGEyID0gJHRoaXMtPl9wYXJzZXItPnRvUmV2ZXJzZVBvbGlzaCgpOwoJCQkJCSRzejIgPSBzdHJsZW4oJGZvcm11bGEyKTsKCgkJCQl9IGNhdGNoKEV4Y2VwdGlvbiAkZSkgewoJCQkJCSRzejIgPSAwOwoJCQkJCSRmb3JtdWxhMiA9ICcnOwoJCQkJfQoJCQkJJGRhdGEgLj0gcGFjaygndnYnLCAkc3oyLCAweDAwMDApOwoJCQkJJGRhdGEgLj0gJGZvcm11bGEyOwoKCQkJCS8vIGNlbGwgcmFuZ2UgYWRkcmVzcyBsaXN0CgkJCQkkZGF0YSAuPSBwYWNrKCd2JywgMHgwMDAxKTsKCQkJCSRkYXRhIC49ICR0aGlzLT5fd3JpdGVCSUZGOENlbGxSYW5nZUFkZHJlc3NGaXhlZCgkY2VsbENvb3JkaW5hdGUpOwoKCQkJCSRsZW5ndGggPSBzdHJsZW4oJGRhdGEpOwoJCQkkaGVhZGVyID0gcGFjaygidnYiLCAkcmVjb3JkLCAkbGVuZ3RoKTsKCgkJCQkkdGhpcy0+X2FwcGVuZCgkaGVhZGVyIC4gJGRhdGEpOwoJCQl9CgkJfQoJfQoKCS8qKgoJICogTWFwIEVycm9yIGNvZGUKCSAqCgkgKiBAcGFyYW0gc3RyaW5nICRlcnJvckNvZGUKCSAqIEByZXR1cm4gaW50CgkgKi8KCXByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIF9tYXBFcnJvckNvZGUoJGVycm9yQ29kZSkgewoJCXN3aXRjaCAoJGVycm9yQ29kZSkgewoJCQljYXNlICcjTlVMTCEnOglyZXR1cm4gMHgwMDsKCQkJY2FzZSAnI0RJVi8wISc6CXJldHVybiAweDA3OwoJCQljYXNlICcjVkFMVUUhJzoJcmV0dXJuIDB4MEY7CgkJCWNhc2UgJyNSRUYhJzoJcmV0dXJuIDB4MTc7CgkJCWNhc2UgJyNOQU1FPyc6CXJldHVybiAweDFEOwoJCQljYXNlICcjTlVNISc6CXJldHVybiAweDI0OwoJCQljYXNlICcjTi9BJzoJcmV0dXJuIDB4MkE7CgkJfQoKCQlyZXR1cm4gMDsKCX0KCn0=]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Writer/Excel5/Xf.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIFBIUEV4Y2VsCiAqCiAqIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICoKICogQGNhdGVnb3J5ICAgUEhQRXhjZWwKICogQHBhY2thZ2UgICAgUEhQRXhjZWxfV3JpdGVyX0V4Y2VsNQogKiBAY29weXJpZ2h0ICBDb3B5cmlnaHQgKGMpIDIwMDYgLSAyMDEyIFBIUEV4Y2VsIChodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9QSFBFeGNlbCkKICogQGxpY2Vuc2UgICAgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL29sZC1saWNlbnNlcy9sZ3BsLTIuMS50eHQJTEdQTAogKiBAdmVyc2lvbiAgICAxLjcuNywgMjAxMi0wNS0xOQogKi8KCi8vIE9yaWdpbmFsIGZpbGUgaGVhZGVyIG9mIFBFQVI6OlNwcmVhZHNoZWV0X0V4Y2VsX1dyaXRlcl9Gb3JtYXQgKHVzZWQgYXMgdGhlIGJhc2UgZm9yIHRoaXMgY2xhc3MpOgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyAvKgovLyAqICBNb2R1bGUgd3JpdHRlbi9wb3J0ZWQgYnkgWGF2aWVyIE5vZ3VlciA8eG5vZ3VlckByZXplYnJhLmNvbT4KLy8gKgovLyAqICBUaGUgbWFqb3JpdHkgb2YgdGhpcyBpcyBfTk9UXyBteSBjb2RlLiAgSSBzaW1wbHkgcG9ydGVkIGl0IGZyb20gdGhlCi8vICogIFBFUkwgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgbW9kdWxlLgovLyAqCi8vICogIFRoZSBhdXRob3Igb2YgdGhlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIG1vZHVsZSBpcyBKb2huIE1jTmFtYXJhCi8vICogIDxqbWNuYW1hcmFAY3Bhbi5vcmc+Ci8vICoKLy8gKiAgSSBfRE9fIG1haW50YWluIHRoaXMgY29kZSwgYW5kIEpvaG4gTWNOYW1hcmEgaGFzIG5vdGhpbmcgdG8gZG8gd2l0aCB0aGUKLy8gKiAgcG9ydGluZyBvZiB0aGlzIGNvZGUgdG8gUEhQLiAgQW55IHF1ZXN0aW9ucyBkaXJlY3RseSByZWxhdGVkIHRvIHRoaXMKLy8gKiAgY2xhc3MgbGlicmFyeSBzaG91bGQgYmUgZGlyZWN0ZWQgdG8gbWUuCi8vICoKLy8gKiAgTGljZW5zZSBJbmZvcm1hdGlvbjoKLy8gKgovLyAqICAgIFNwcmVhZHNoZWV0X0V4Y2VsX1dyaXRlcjogIEEgbGlicmFyeSBmb3IgZ2VuZXJhdGluZyBFeGNlbCBTcHJlYWRzaGVldHMKLy8gKiAgICBDb3B5cmlnaHQgKGMpIDIwMDItMjAwMyBYYXZpZXIgTm9ndWVyIHhub2d1ZXJAcmV6ZWJyYS5jb20KLy8gKgovLyAqICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLy8gKiAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi8vICogICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi8vICogICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi8vICoKLy8gKiAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLy8gKiAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgovLyAqICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi8vICogICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLy8gKgovLyAqICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLy8gKiAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi8vICogICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQovLyAqLwoKCi8qKgogKiBQSFBFeGNlbF9Xcml0ZXJfRXhjZWw1X1hmCiAqCiAqIEBjYXRlZ29yeSAgIFBIUEV4Y2VsCiAqIEBwYWNrYWdlICAgIFBIUEV4Y2VsX1dyaXRlcl9FeGNlbDUKICogQGNvcHlyaWdodCAgQ29weXJpZ2h0IChjKSAyMDA2IC0gMjAxMiBQSFBFeGNlbCAoaHR0cDovL3d3dy5jb2RlcGxleC5jb20vUEhQRXhjZWwpCiAqLwpjbGFzcyBQSFBFeGNlbF9Xcml0ZXJfRXhjZWw1X1hmCnsKICAgIC8qKgoJICogU3R5bGUgWEYgb3IgYSBjZWxsIFhGID8KCSAqCgkgKiBAdmFyIGJvb2xlYW4KCSAqLwoJcHJpdmF0ZSAkX2lzU3R5bGVYZjsKCgkvKioKCSAqIEluZGV4IHRvIHRoZSBGT05UIHJlY29yZC4gSW5kZXggNCBkb2VzIG5vdCBleGlzdAoJICogQHZhciBpbnRlZ2VyCgkgKi8KCXByaXZhdGUgJF9mb250SW5kZXg7CgoJLyoqCgkgKiBBbiBpbmRleCAoMiBieXRlcykgdG8gYSBGT1JNQVQgcmVjb3JkIChudW1iZXIgZm9ybWF0KS4KCSAqIEB2YXIgaW50ZWdlcgoJICovCglwdWJsaWMgJF9udW1iZXJGb3JtYXRJbmRleDsKCgkvKioKCSAqIDEgYml0LCBhcHBhcmVudGx5IG5vdCB1c2VkLgoJICogQHZhciBpbnRlZ2VyCgkgKi8KCXB1YmxpYyAkX3RleHRfanVzdGxhc3Q7CgoJLyoqCgkgKiBUaGUgY2VsbCdzIGZvcmVncm91bmQgY29sb3IuCgkgKiBAdmFyIGludGVnZXIKCSAqLwoJcHVibGljICRfZmdfY29sb3I7CgoJLyoqCgkgKiBUaGUgY2VsbCdzIGJhY2tncm91bmQgY29sb3IuCgkgKiBAdmFyIGludGVnZXIKCSAqLwoJcHVibGljICRfYmdfY29sb3I7CgoJLyoqCgkgKiBDb2xvciBvZiB0aGUgYm90dG9tIGJvcmRlciBvZiB0aGUgY2VsbC4KCSAqIEB2YXIgaW50ZWdlcgoJICovCglwdWJsaWMgJF9ib3R0b21fY29sb3I7CgoJLyoqCgkgKiBDb2xvciBvZiB0aGUgdG9wIGJvcmRlciBvZiB0aGUgY2VsbC4KCSAqIEB2YXIgaW50ZWdlcgoJICovCglwdWJsaWMgJF90b3BfY29sb3I7CgoJLyoqCgkqIENvbG9yIG9mIHRoZSBsZWZ0IGJvcmRlciBvZiB0aGUgY2VsbC4KCSogQHZhciBpbnRlZ2VyCgkqLwoJcHVibGljICRfbGVmdF9jb2xvcjsKCgkvKioKCSAqIENvbG9yIG9mIHRoZSByaWdodCBib3JkZXIgb2YgdGhlIGNlbGwuCgkgKiBAdmFyIGludGVnZXIKCSAqLwoJcHVibGljICRfcmlnaHRfY29sb3I7CgoJLyoqCgkgKiBDb25zdHJ1Y3RvcgoJICoKCSAqIEBhY2Nlc3MgcHVibGljCgkgKiBAcGFyYW0gUEhQRXhjZWxfU3R5bGUJVGhlIFhGIGZvcm1hdAoJICovCglwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoUEhQRXhjZWxfU3R5bGUgJHN0eWxlID0gbnVsbCkKCXsKCQkkdGhpcy0+X2lzU3R5bGVYZiA9ICAgICBmYWxzZTsKCQkkdGhpcy0+X2ZvbnRJbmRleCAgICAgID0gMDsKCgkJJHRoaXMtPl9udW1iZXJGb3JtYXRJbmRleCAgICAgPSAwOwoKCQkkdGhpcy0+X3RleHRfanVzdGxhc3QgID0gMDsKCgkJJHRoaXMtPl9mZ19jb2xvciAgICAgICA9IDB4NDA7CgkJJHRoaXMtPl9iZ19jb2xvciAgICAgICA9IDB4NDE7CgoJCSR0aGlzLT5fZGlhZyAgICAgICAgICAgPSAwOwoKCQkkdGhpcy0+X2JvdHRvbV9jb2xvciAgID0gMHg0MDsKCQkkdGhpcy0+X3RvcF9jb2xvciAgICAgID0gMHg0MDsKCQkkdGhpcy0+X2xlZnRfY29sb3IgICAgID0gMHg0MDsKCQkkdGhpcy0+X3JpZ2h0X2NvbG9yICAgID0gMHg0MDsKCQkkdGhpcy0+X2RpYWdfY29sb3IgICAgID0gMHg0MDsKCQkkdGhpcy0+X3N0eWxlID0gJHN0eWxlOwoKCX0KCgoJLyoqCgkgKiBHZW5lcmF0ZSBhbiBFeGNlbCBCSUZGIFhGIHJlY29yZCAoc3R5bGUgb3IgY2VsbCkuCgkgKgoJICogQHJldHVybiBzdHJpbmcgVGhlIFhGIHJlY29yZAoJICovCglmdW5jdGlvbiB3cml0ZVhmKCkKCXsKCQkvLyBTZXQgdGhlIHR5cGUgb2YgdGhlIFhGIHJlY29yZCBhbmQgc29tZSBvZiB0aGUgYXR0cmlidXRlcy4KCQlpZiAoJHRoaXMtPl9pc1N0eWxlWGYpIHsKCQkJJHN0eWxlID0gMHhGRkY1OwoJCX0gZWxzZSB7CgkJCSRzdHlsZSAgID0gc2VsZjo6X21hcExvY2tlZCgkdGhpcy0+X3N0eWxlLT5nZXRQcm90ZWN0aW9uKCktPmdldExvY2tlZCgpKTsKCQkJJHN0eWxlICB8PSBzZWxmOjpfbWFwSGlkZGVuKCR0aGlzLT5fc3R5bGUtPmdldFByb3RlY3Rpb24oKS0+Z2V0SGlkZGVuKCkpIDw8IDE7CgkJfQoKCQkvLyBGbGFncyB0byBpbmRpY2F0ZSBpZiBhdHRyaWJ1dGVzIGhhdmUgYmVlbiBzZXQuCgkJJGF0cl9udW0gICAgID0gKCR0aGlzLT5fbnVtYmVyRm9ybWF0SW5kZXggIT0gMCk/MTowOwoJCSRhdHJfZm50ICAgICA9ICgkdGhpcy0+X2ZvbnRJbmRleCAhPSAwKT8xOjA7CgkJJGF0cl9hbGMgICAgID0gKChpbnQpICR0aGlzLT5fc3R5bGUtPmdldEFsaWdubWVudCgpLT5nZXRXcmFwVGV4dCgpKT8xOjA7CgkJJGF0cl9iZHIgICAgID0gKHNlbGY6Ol9tYXBCb3JkZXJTdHlsZSgkdGhpcy0+X3N0eWxlLT5nZXRCb3JkZXJzKCktPmdldEJvdHRvbSgpLT5nZXRCb3JkZXJTdHlsZSgpKSAgIHx8CgkJCQkJCXNlbGY6Ol9tYXBCb3JkZXJTdHlsZSgkdGhpcy0+X3N0eWxlLT5nZXRCb3JkZXJzKCktPmdldFRvcCgpLT5nZXRCb3JkZXJTdHlsZSgpKSAgICAgIHx8CgkJCQkJCXNlbGY6Ol9tYXBCb3JkZXJTdHlsZSgkdGhpcy0+X3N0eWxlLT5nZXRCb3JkZXJzKCktPmdldExlZnQoKS0+Z2V0Qm9yZGVyU3R5bGUoKSkgICAgIHx8CgkJCQkJCXNlbGY6Ol9tYXBCb3JkZXJTdHlsZSgkdGhpcy0+X3N0eWxlLT5nZXRCb3JkZXJzKCktPmdldFJpZ2h0KCktPmdldEJvcmRlclN0eWxlKCkpKT8xOjA7CgkJJGF0cl9wYXQgICAgID0gKCgkdGhpcy0+X2ZnX2NvbG9yICE9IDB4NDApIHx8CgkJCQkJCSgkdGhpcy0+X2JnX2NvbG9yICE9IDB4NDEpIHx8CgkJCQkJCXNlbGY6Ol9tYXBGaWxsVHlwZSgkdGhpcy0+X3N0eWxlLT5nZXRGaWxsKCktPmdldEZpbGxUeXBlKCkpKT8xOjA7CgkJJGF0cl9wcm90ICAgID0gc2VsZjo6X21hcExvY2tlZCgkdGhpcy0+X3N0eWxlLT5nZXRQcm90ZWN0aW9uKCktPmdldExvY2tlZCgpKQoJCQkJCQl8IHNlbGY6Ol9tYXBIaWRkZW4oJHRoaXMtPl9zdHlsZS0+Z2V0UHJvdGVjdGlvbigpLT5nZXRIaWRkZW4oKSk7CgoJCS8vIFplcm8gdGhlIGRlZmF1bHQgYm9yZGVyIGNvbG91ciBpZiB0aGUgYm9yZGVyIGhhcyBub3QgYmVlbiBzZXQuCgkJaWYgKHNlbGY6Ol9tYXBCb3JkZXJTdHlsZSgkdGhpcy0+X3N0eWxlLT5nZXRCb3JkZXJzKCktPmdldEJvdHRvbSgpLT5nZXRCb3JkZXJTdHlsZSgpKSA9PSAwKSB7CgkJCSR0aGlzLT5fYm90dG9tX2NvbG9yID0gMDsKCQl9CgkJaWYgKHNlbGY6Ol9tYXBCb3JkZXJTdHlsZSgkdGhpcy0+X3N0eWxlLT5nZXRCb3JkZXJzKCktPmdldFRvcCgpLT5nZXRCb3JkZXJTdHlsZSgpKSAgPT0gMCkgewoJCQkkdGhpcy0+X3RvcF9jb2xvciA9IDA7CgkJfQoJCWlmIChzZWxmOjpfbWFwQm9yZGVyU3R5bGUoJHRoaXMtPl9zdHlsZS0+Z2V0Qm9yZGVycygpLT5nZXRSaWdodCgpLT5nZXRCb3JkZXJTdHlsZSgpKSA9PSAwKSB7CgkJCSR0aGlzLT5fcmlnaHRfY29sb3IgPSAwOwoJCX0KCQlpZiAoc2VsZjo6X21hcEJvcmRlclN0eWxlKCR0aGlzLT5fc3R5bGUtPmdldEJvcmRlcnMoKS0+Z2V0TGVmdCgpLT5nZXRCb3JkZXJTdHlsZSgpKSA9PSAwKSB7CgkJCSR0aGlzLT5fbGVmdF9jb2xvciA9IDA7CgkJfQoJCWlmIChzZWxmOjpfbWFwQm9yZGVyU3R5bGUoJHRoaXMtPl9zdHlsZS0+Z2V0Qm9yZGVycygpLT5nZXREaWFnb25hbCgpLT5nZXRCb3JkZXJTdHlsZSgpKSA9PSAwKSB7CgkJCSR0aGlzLT5fZGlhZ19jb2xvciA9IDA7CgkJfQoKCQkkcmVjb3JkICAgICAgICAgPSAweDAwRTA7ICAgICAgICAgICAgICAvLyBSZWNvcmQgaWRlbnRpZmllcgoJCSRsZW5ndGggICAgICAgICA9IDB4MDAxNDsgICAgICAgICAgICAgIC8vIE51bWJlciBvZiBieXRlcyB0byBmb2xsb3cKCgkJJGlmbnQgICAgICAgICAgID0gJHRoaXMtPl9mb250SW5kZXg7ICAgLy8gSW5kZXggdG8gRk9OVCByZWNvcmQKCQkkaWZtdCAgICAgICAgICAgPSAkdGhpcy0+X251bWJlckZvcm1hdEluZGV4OyAgLy8gSW5kZXggdG8gRk9STUFUIHJlY29yZAoKCQkkYWxpZ24gICAgICAgICAgPSAkdGhpcy0+X21hcEhBbGlnbigkdGhpcy0+X3N0eWxlLT5nZXRBbGlnbm1lbnQoKS0+Z2V0SG9yaXpvbnRhbCgpKTsgICAgICAgLy8gQWxpZ25tZW50CgkJJGFsaWduICAgICAgICAgfD0gKGludCkgJHRoaXMtPl9zdHlsZS0+Z2V0QWxpZ25tZW50KCktPmdldFdyYXBUZXh0KCkgICAgIDw8IDM7CgkJJGFsaWduICAgICAgICAgfD0gc2VsZjo6X21hcFZBbGlnbigkdGhpcy0+X3N0eWxlLT5nZXRBbGlnbm1lbnQoKS0+Z2V0VmVydGljYWwoKSkgIDw8IDQ7CgkJJGFsaWduICAgICAgICAgfD0gJHRoaXMtPl90ZXh0X2p1c3RsYXN0IDw8IDc7CgoJCSR1c2VkX2F0dHJpYiAgICA9ICRhdHJfbnVtICAgICAgICAgICAgICA8PCAyOwoJCSR1c2VkX2F0dHJpYiAgIHw9ICRhdHJfZm50ICAgICAgICAgICAgICA8PCAzOwoJCSR1c2VkX2F0dHJpYiAgIHw9ICRhdHJfYWxjICAgICAgICAgICAgICA8PCA0OwoJCSR1c2VkX2F0dHJpYiAgIHw9ICRhdHJfYmRyICAgICAgICAgICAgICA8PCA1OwoJCSR1c2VkX2F0dHJpYiAgIHw9ICRhdHJfcGF0ICAgICAgICAgICAgICA8PCA2OwoJCSR1c2VkX2F0dHJpYiAgIHw9ICRhdHJfcHJvdCAgICAgICAgICAgICA8PCA3OwoKCQkkaWN2ICAgICAgICAgICAgPSAkdGhpcy0+X2ZnX2NvbG9yOyAgICAgIC8vIGZnIGFuZCBiZyBwYXR0ZXJuIGNvbG9ycwoJCSRpY3YgICAgICAgICAgIHw9ICR0aGlzLT5fYmdfY29sb3IgICAgICA8PCA3OwoKCQkkYm9yZGVyMSAgICAgICAgPSBzZWxmOjpfbWFwQm9yZGVyU3R5bGUoJHRoaXMtPl9zdHlsZS0+Z2V0Qm9yZGVycygpLT5nZXRMZWZ0KCktPmdldEJvcmRlclN0eWxlKCkpOyAgICAgICAgICAvLyBCb3JkZXIgbGluZSBzdHlsZSBhbmQgY29sb3IKCQkkYm9yZGVyMSAgICAgICB8PSBzZWxmOjpfbWFwQm9yZGVyU3R5bGUoJHRoaXMtPl9zdHlsZS0+Z2V0Qm9yZGVycygpLT5nZXRSaWdodCgpLT5nZXRCb3JkZXJTdHlsZSgpKSAgICAgICAgIDw8IDQ7CgkJJGJvcmRlcjEgICAgICAgfD0gc2VsZjo6X21hcEJvcmRlclN0eWxlKCR0aGlzLT5fc3R5bGUtPmdldEJvcmRlcnMoKS0+Z2V0VG9wKCktPmdldEJvcmRlclN0eWxlKCkpICAgICAgICAgICA8PCA4OwoJCSRib3JkZXIxICAgICAgIHw9IHNlbGY6Ol9tYXBCb3JkZXJTdHlsZSgkdGhpcy0+X3N0eWxlLT5nZXRCb3JkZXJzKCktPmdldEJvdHRvbSgpLT5nZXRCb3JkZXJTdHlsZSgpKSAgICAgICAgPDwgMTI7CgkJJGJvcmRlcjEgICAgICAgfD0gJHRoaXMtPl9sZWZ0X2NvbG9yICAgIDw8IDE2OwoJCSRib3JkZXIxICAgICAgIHw9ICR0aGlzLT5fcmlnaHRfY29sb3IgICA8PCAyMzsKCgkJJGRpYWdvbmFsRGlyZWN0aW9uID0gJHRoaXMtPl9zdHlsZS0+Z2V0Qm9yZGVycygpLT5nZXREaWFnb25hbERpcmVjdGlvbigpOwoJCSRkaWFnX3RsX3RvX3JiID0gJGRpYWdvbmFsRGlyZWN0aW9uID09IFBIUEV4Y2VsX1N0eWxlX0JvcmRlcnM6OkRJQUdPTkFMX0JPVEgKCQkJCQkJCXx8ICRkaWFnb25hbERpcmVjdGlvbiA9PSBQSFBFeGNlbF9TdHlsZV9Cb3JkZXJzOjpESUFHT05BTF9ET1dOOwoJCSRkaWFnX3RyX3RvX2xiID0gJGRpYWdvbmFsRGlyZWN0aW9uID09IFBIUEV4Y2VsX1N0eWxlX0JvcmRlcnM6OkRJQUdPTkFMX0JPVEgKCQkJCQkJCXx8ICRkaWFnb25hbERpcmVjdGlvbiA9PSBQSFBFeGNlbF9TdHlsZV9Cb3JkZXJzOjpESUFHT05BTF9VUDsKCQkkYm9yZGVyMSAgICAgICB8PSAkZGlhZ190bF90b19yYiAgICAgICAgPDwgMzA7CgkJJGJvcmRlcjEgICAgICAgfD0gJGRpYWdfdHJfdG9fbGIgICAgICAgIDw8IDMxOwoKCQkkYm9yZGVyMiAgICAgICAgPSAkdGhpcy0+X3RvcF9jb2xvcjsgICAgLy8gQm9yZGVyIGNvbG9yCgkJJGJvcmRlcjIgICAgICAgfD0gJHRoaXMtPl9ib3R0b21fY29sb3IgICA8PCA3OwoJCSRib3JkZXIyICAgICAgIHw9ICR0aGlzLT5fZGlhZ19jb2xvciAgICAgPDwgMTQ7CgkJJGJvcmRlcjIgICAgICAgfD0gc2VsZjo6X21hcEJvcmRlclN0eWxlKCR0aGlzLT5fc3R5bGUtPmdldEJvcmRlcnMoKS0+Z2V0RGlhZ29uYWwoKS0+Z2V0Qm9yZGVyU3R5bGUoKSkgICAgICAgICAgIDw8IDIxOwoJCSRib3JkZXIyICAgICAgIHw9IHNlbGY6Ol9tYXBGaWxsVHlwZSgkdGhpcy0+X3N0eWxlLT5nZXRGaWxsKCktPmdldEZpbGxUeXBlKCkpICAgICAgICA8PCAyNjsKCgkJJGhlYWRlciAgICAgID0gcGFjaygidnYiLCAgICAgICAkcmVjb3JkLCAkbGVuZ3RoKTsKCgkJLy9CSUZGOCBvcHRpb25zOiBpZGVudGF0aW9uLCBzaHJpbmtUb0ZpdCBhbmQgIHRleHQgZGlyZWN0aW9uCgkJJGJpZmY4X29wdGlvbnMgID0gJHRoaXMtPl9zdHlsZS0+Z2V0QWxpZ25tZW50KCktPmdldEluZGVudCgpOwoJCSRiaWZmOF9vcHRpb25zIHw9IChpbnQpICR0aGlzLT5fc3R5bGUtPmdldEFsaWdubWVudCgpLT5nZXRTaHJpbmtUb0ZpdCgpIDw8IDQ7CgoJCSRkYXRhICA9IHBhY2soInZ2dkMiLCAkaWZudCwgJGlmbXQsICRzdHlsZSwgJGFsaWduKTsKCQkkZGF0YSAuPSBwYWNrKCJDQ0MiCgkJCSwgc2VsZjo6X21hcFRleHRSb3RhdGlvbigkdGhpcy0+X3N0eWxlLT5nZXRBbGlnbm1lbnQoKS0+Z2V0VGV4dFJvdGF0aW9uKCkpCgkJCSwgJGJpZmY4X29wdGlvbnMKCQkJLCAkdXNlZF9hdHRyaWIKCQkJKTsKCQkkZGF0YSAuPSBwYWNrKCJWVnYiLCAkYm9yZGVyMSwgJGJvcmRlcjIsICRpY3YpOwoKCQlyZXR1cm4oJGhlYWRlciAuICRkYXRhKTsKCX0KCgkvKioKCSAqIElzIHRoaXMgYSBzdHlsZSBYRiA/CgkgKgoJICogQHBhcmFtIGJvb2xlYW4gJHZhbHVlCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBzZXRJc1N0eWxlWGYoJHZhbHVlKQoJewoJCSR0aGlzLT5faXNTdHlsZVhmID0gJHZhbHVlOwoJfQoKCS8qKgoJICogU2V0cyB0aGUgY2VsbCdzIGJvdHRvbSBib3JkZXIgY29sb3IKCSAqCgkgKiBAYWNjZXNzIHB1YmxpYwoJICogQHBhcmFtIGludCAkY29sb3JJbmRleCBDb2xvciBpbmRleAoJICovCglmdW5jdGlvbiBzZXRCb3R0b21Db2xvcigkY29sb3JJbmRleCkKCXsKCQkkdGhpcy0+X2JvdHRvbV9jb2xvciA9ICRjb2xvckluZGV4OwoJfQoKCS8qKgoJICogU2V0cyB0aGUgY2VsbCdzIHRvcCBib3JkZXIgY29sb3IKCSAqCgkgKiBAYWNjZXNzIHB1YmxpYwoJICogQHBhcmFtIGludCAkY29sb3JJbmRleCBDb2xvciBpbmRleAoJICovCglmdW5jdGlvbiBzZXRUb3BDb2xvcigkY29sb3JJbmRleCkKCXsKCQkkdGhpcy0+X3RvcF9jb2xvciA9ICRjb2xvckluZGV4OwoJfQoKCS8qKgoJICogU2V0cyB0aGUgY2VsbCdzIGxlZnQgYm9yZGVyIGNvbG9yCgkgKgoJICogQGFjY2VzcyBwdWJsaWMKCSAqIEBwYXJhbSBpbnQgJGNvbG9ySW5kZXggQ29sb3IgaW5kZXgKCSAqLwoJZnVuY3Rpb24gc2V0TGVmdENvbG9yKCRjb2xvckluZGV4KQoJewoJCSR0aGlzLT5fbGVmdF9jb2xvciA9ICRjb2xvckluZGV4OwoJfQoKCS8qKgoJICogU2V0cyB0aGUgY2VsbCdzIHJpZ2h0IGJvcmRlciBjb2xvcgoJICoKCSAqIEBhY2Nlc3MgcHVibGljCgkgKiBAcGFyYW0gaW50ICRjb2xvckluZGV4IENvbG9yIGluZGV4CgkgKi8KCWZ1bmN0aW9uIHNldFJpZ2h0Q29sb3IoJGNvbG9ySW5kZXgpCgl7CgkJJHRoaXMtPl9yaWdodF9jb2xvciA9ICRjb2xvckluZGV4OwoJfQoKCS8qKgoJICogU2V0cyB0aGUgY2VsbCdzIGRpYWdvbmFsIGJvcmRlciBjb2xvcgoJICoKCSAqIEBhY2Nlc3MgcHVibGljCgkgKiBAcGFyYW0gaW50ICRjb2xvckluZGV4IENvbG9yIGluZGV4CgkgKi8KCWZ1bmN0aW9uIHNldERpYWdDb2xvcigkY29sb3JJbmRleCkKCXsKCQkkdGhpcy0+X2RpYWdfY29sb3IgPSAkY29sb3JJbmRleDsKCX0KCgoJLyoqCgkgKiBTZXRzIHRoZSBjZWxsJ3MgZm9yZWdyb3VuZCBjb2xvcgoJICoKCSAqIEBhY2Nlc3MgcHVibGljCgkgKiBAcGFyYW0gaW50ICRjb2xvckluZGV4IENvbG9yIGluZGV4CgkgKi8KCWZ1bmN0aW9uIHNldEZnQ29sb3IoJGNvbG9ySW5kZXgpCgl7CgkJJHRoaXMtPl9mZ19jb2xvciA9ICRjb2xvckluZGV4OwoJfQoKCS8qKgoJICogU2V0cyB0aGUgY2VsbCdzIGJhY2tncm91bmQgY29sb3IKCSAqCgkgKiBAYWNjZXNzIHB1YmxpYwoJICogQHBhcmFtIGludCAkY29sb3JJbmRleCBDb2xvciBpbmRleAoJICovCglmdW5jdGlvbiBzZXRCZ0NvbG9yKCRjb2xvckluZGV4KQoJewoJCSR0aGlzLT5fYmdfY29sb3IgPSAkY29sb3JJbmRleDsKCX0KCgkvKioKCSAqIFNldHMgdGhlIGluZGV4IHRvIHRoZSBudW1iZXIgZm9ybWF0IHJlY29yZAoJICogSXQgY2FuIGJlIGRhdGUsIHRpbWUsIGN1cnJlbmN5LCBldGMuLi4KCSAqCgkgKiBAYWNjZXNzIHB1YmxpYwoJICogQHBhcmFtIGludGVnZXIgJG51bWJlckZvcm1hdEluZGV4IEluZGV4IHRvIGZvcm1hdCByZWNvcmQKCSAqLwoJZnVuY3Rpb24gc2V0TnVtYmVyRm9ybWF0SW5kZXgoJG51bWJlckZvcm1hdEluZGV4KQoJewoJCSR0aGlzLT5fbnVtYmVyRm9ybWF0SW5kZXggPSAkbnVtYmVyRm9ybWF0SW5kZXg7Cgl9CgoJLyoqCgkgKiBTZXQgdGhlIGZvbnQgaW5kZXguCgkgKgoJICogQHBhcmFtIGludCAkdmFsdWUgRm9udCBpbmRleCwgbm90ZSB0aGF0IHZhbHVlIDQgZG9lcyBub3QgZXhpc3QKCSAqLwoJcHVibGljIGZ1bmN0aW9uIHNldEZvbnRJbmRleCgkdmFsdWUpCgl7CgkJJHRoaXMtPl9mb250SW5kZXggPSAkdmFsdWU7Cgl9CgoJLyoqCgkgKiBNYXAgb2YgQklGRjItQklGRjggY29kZXMgZm9yIGJvcmRlciBzdHlsZXMKCSAqIEBzdGF0aWMJYXJyYXkgb2YgaW50CgkgKgoJICovCglwcml2YXRlIHN0YXRpYyAkX21hcEJvcmRlclN0eWxlID0gYXJyYXkJKCBQSFBFeGNlbF9TdHlsZV9Cb3JkZXI6OkJPUkRFUl9OT05FCQkJCT0+IDB4MDAsCgkJCQkJCQkJCQkJICBQSFBFeGNlbF9TdHlsZV9Cb3JkZXI6OkJPUkRFUl9USElOCQkJCT0+IDB4MDEsCgkJCQkJCQkJCQkJICBQSFBFeGNlbF9TdHlsZV9Cb3JkZXI6OkJPUkRFUl9NRURJVU0JCQkJPT4gMHgwMiwKCQkJCQkJCQkJCQkgIFBIUEV4Y2VsX1N0eWxlX0JvcmRlcjo6Qk9SREVSX0RBU0hFRAkJCQk9PiAweDAzLAoJCQkJCQkJCQkJCSAgUEhQRXhjZWxfU3R5bGVfQm9yZGVyOjpCT1JERVJfRE9UVEVECQkJCT0+IDB4MDQsCgkJCQkJCQkJCQkJICBQSFBFeGNlbF9TdHlsZV9Cb3JkZXI6OkJPUkRFUl9USElDSwkJCQk9PiAweDA1LAoJCQkJCQkJCQkJCSAgUEhQRXhjZWxfU3R5bGVfQm9yZGVyOjpCT1JERVJfRE9VQkxFCQkJCT0+IDB4MDYsCgkJCQkJCQkJCQkJICBQSFBFeGNlbF9TdHlsZV9Cb3JkZXI6OkJPUkRFUl9IQUlSCQkJCT0+IDB4MDcsCgkJCQkJCQkJCQkJICBQSFBFeGNlbF9TdHlsZV9Cb3JkZXI6OkJPUkRFUl9NRURJVU1EQVNIRUQJCT0+IDB4MDgsCgkJCQkJCQkJCQkJICBQSFBFeGNlbF9TdHlsZV9Cb3JkZXI6OkJPUkRFUl9EQVNIRE9UCQkJCT0+IDB4MDksCgkJCQkJCQkJCQkJICBQSFBFeGNlbF9TdHlsZV9Cb3JkZXI6OkJPUkRFUl9NRURJVU1EQVNIRE9UCQk9PiAweDBBLAoJCQkJCQkJCQkJCSAgUEhQRXhjZWxfU3R5bGVfQm9yZGVyOjpCT1JERVJfREFTSERPVERPVAkJCT0+IDB4MEIsCgkJCQkJCQkJCQkJICBQSFBFeGNlbF9TdHlsZV9Cb3JkZXI6OkJPUkRFUl9NRURJVU1EQVNIRE9URE9UCT0+IDB4MEMsCgkJCQkJCQkJCQkJICBQSFBFeGNlbF9TdHlsZV9Cb3JkZXI6OkJPUkRFUl9TTEFOVERBU0hET1QJCT0+IDB4MEQsCgkJCQkJCQkJCQkJKTsKCgkvKioKCSAqIE1hcCBib3JkZXIgc3R5bGUKCSAqCgkgKiBAcGFyYW0gc3RyaW5nICRib3JkZXJTdHlsZQoJICogQHJldHVybiBpbnQKCSAqLwoJcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gX21hcEJvcmRlclN0eWxlKCRib3JkZXJTdHlsZSkgewoJCWlmIChpc3NldChzZWxmOjokX21hcEJvcmRlclN0eWxlWyRib3JkZXJTdHlsZV0pKQoJCQlyZXR1cm4gc2VsZjo6JF9tYXBCb3JkZXJTdHlsZVskYm9yZGVyU3R5bGVdOwoJCXJldHVybiAweDAwOwoJfQoKCS8qKgoJICogTWFwIG9mIEJJRkYyLUJJRkY4IGNvZGVzIGZvciBmaWxsIHR5cGVzCgkgKiBAc3RhdGljCWFycmF5IG9mIGludAoJICoKCSAqLwoJcHJpdmF0ZSBzdGF0aWMgJF9tYXBGaWxsVHlwZSA9IGFycmF5KCBQSFBFeGNlbF9TdHlsZV9GaWxsOjpGSUxMX05PTkUJCQkJCT0+IDB4MDAsCgkJCQkJCQkJCQkgIFBIUEV4Y2VsX1N0eWxlX0ZpbGw6OkZJTExfU09MSUQJCQkJCT0+IDB4MDEsCgkJCQkJCQkJCQkgIFBIUEV4Y2VsX1N0eWxlX0ZpbGw6OkZJTExfUEFUVEVSTl9NRURJVU1HUkFZCQk9PiAweDAyLAoJCQkJCQkJCQkJICBQSFBFeGNlbF9TdHlsZV9GaWxsOjpGSUxMX1BBVFRFUk5fREFSS0dSQVkJCT0+IDB4MDMsCgkJCQkJCQkJCQkgIFBIUEV4Y2VsX1N0eWxlX0ZpbGw6OkZJTExfUEFUVEVSTl9MSUdIVEdSQVkJCT0+IDB4MDQsCgkJCQkJCQkJCQkgIFBIUEV4Y2VsX1N0eWxlX0ZpbGw6OkZJTExfUEFUVEVSTl9EQVJLSE9SSVpPTlRBTAk9PiAweDA1LAoJCQkJCQkJCQkJICBQSFBFeGNlbF9TdHlsZV9GaWxsOjpGSUxMX1BBVFRFUk5fREFSS1ZFUlRJQ0FMCT0+IDB4MDYsCgkJCQkJCQkJCQkgIFBIUEV4Y2VsX1N0eWxlX0ZpbGw6OkZJTExfUEFUVEVSTl9EQVJLRE9XTgkJPT4gMHgwNywKCQkJCQkJCQkJCSAgUEhQRXhjZWxfU3R5bGVfRmlsbDo6RklMTF9QQVRURVJOX0RBUktVUAkJCT0+IDB4MDgsCgkJCQkJCQkJCQkgIFBIUEV4Y2VsX1N0eWxlX0ZpbGw6OkZJTExfUEFUVEVSTl9EQVJLR1JJRAkJPT4gMHgwOSwKCQkJCQkJCQkJCSAgUEhQRXhjZWxfU3R5bGVfRmlsbDo6RklMTF9QQVRURVJOX0RBUktUUkVMTElTCQk9PiAweDBBLAoJCQkJCQkJCQkJICBQSFBFeGNlbF9TdHlsZV9GaWxsOjpGSUxMX1BBVFRFUk5fTElHSFRIT1JJWk9OVEFMCT0+IDB4MEIsCgkJCQkJCQkJCQkgIFBIUEV4Y2VsX1N0eWxlX0ZpbGw6OkZJTExfUEFUVEVSTl9MSUdIVFZFUlRJQ0FMCT0+IDB4MEMsCgkJCQkJCQkJCQkgIFBIUEV4Y2VsX1N0eWxlX0ZpbGw6OkZJTExfUEFUVEVSTl9MSUdIVERPV04JCT0+IDB4MEQsCgkJCQkJCQkJCQkgIFBIUEV4Y2VsX1N0eWxlX0ZpbGw6OkZJTExfUEFUVEVSTl9MSUdIVFVQCQkJPT4gMHgwRSwKCQkJCQkJCQkJCSAgUEhQRXhjZWxfU3R5bGVfRmlsbDo6RklMTF9QQVRURVJOX0xJR0hUR1JJRAkJPT4gMHgwRiwKCQkJCQkJCQkJCSAgUEhQRXhjZWxfU3R5bGVfRmlsbDo6RklMTF9QQVRURVJOX0xJR0hUVFJFTExJUwk9PiAweDEwLAoJCQkJCQkJCQkJICBQSFBFeGNlbF9TdHlsZV9GaWxsOjpGSUxMX1BBVFRFUk5fR1JBWTEyNQkJCT0+IDB4MTEsCgkJCQkJCQkJCQkgIFBIUEV4Y2VsX1N0eWxlX0ZpbGw6OkZJTExfUEFUVEVSTl9HUkFZMDYyNQkJPT4gMHgxMiwKCQkJCQkJCQkJCSAgUEhQRXhjZWxfU3R5bGVfRmlsbDo6RklMTF9HUkFESUVOVF9MSU5FQVIJCQk9PiAweDAwLAkvLyBkb2VzIG5vdCBleGlzdCBpbiBCSUZGOAoJCQkJCQkJCQkJICBQSFBFeGNlbF9TdHlsZV9GaWxsOjpGSUxMX0dSQURJRU5UX1BBVEgJCQk9PiAweDAwLAkvLyBkb2VzIG5vdCBleGlzdCBpbiBCSUZGOAoJCQkJCQkJCQkJKTsKCS8qKgoJICogTWFwIGZpbGwgdHlwZQoJICoKCSAqIEBwYXJhbSBzdHJpbmcgJGZpbGxUeXBlCgkgKiBAcmV0dXJuIGludAoJICovCglwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBfbWFwRmlsbFR5cGUoJGZpbGxUeXBlKSB7CgkJaWYgKGlzc2V0KHNlbGY6OiRfbWFwRmlsbFR5cGVbJGZpbGxUeXBlXSkpCgkJCXJldHVybiBzZWxmOjokX21hcEZpbGxUeXBlWyRmaWxsVHlwZV07CgkJcmV0dXJuIDB4MDA7Cgl9CgoJLyoqCgkgKiBNYXAgb2YgQklGRjItQklGRjggY29kZXMgZm9yIGhvcml6b250YWwgYWxpZ25tZW50CgkgKiBAc3RhdGljCWFycmF5IG9mIGludAoJICoKCSAqLwoJcHJpdmF0ZSBzdGF0aWMgJF9tYXBIQWxpZ24gPSBhcnJheSggUEhQRXhjZWxfU3R5bGVfQWxpZ25tZW50OjpIT1JJWk9OVEFMX0dFTkVSQUwJCQk9PiAwLAoJCQkJCQkJCQkJUEhQRXhjZWxfU3R5bGVfQWxpZ25tZW50OjpIT1JJWk9OVEFMX0xFRlQJCQkJPT4gMSwKCQkJCQkJCQkJCVBIUEV4Y2VsX1N0eWxlX0FsaWdubWVudDo6SE9SSVpPTlRBTF9DRU5URVIJCQkJPT4gMiwKCQkJCQkJCQkJCVBIUEV4Y2VsX1N0eWxlX0FsaWdubWVudDo6SE9SSVpPTlRBTF9SSUdIVAkJCQk9PiAzLAoJCQkJCQkJCQkJUEhQRXhjZWxfU3R5bGVfQWxpZ25tZW50OjpIT1JJWk9OVEFMX0pVU1RJRlkJCQk9PiA1LAoJCQkJCQkJCQkJUEhQRXhjZWxfU3R5bGVfQWxpZ25tZW50OjpIT1JJWk9OVEFMX0NFTlRFUl9DT05USU5VT1VTCT0+IDYsCgkJCQkJCQkJCSAgKTsKCS8qKgoJICogTWFwIHRvIEJJRkYyLUJJRkY4IGNvZGVzIGZvciBob3Jpem9udGFsIGFsaWdubWVudAoJICoKCSAqIEBwYXJhbSBzdHJpbmcgJGhBbGlnbgoJICogQHJldHVybiBpbnQKCSAqLwoJcHJpdmF0ZSBmdW5jdGlvbiBfbWFwSEFsaWduKCRoQWxpZ24pCgl7CgkJaWYgKGlzc2V0KHNlbGY6OiRfbWFwSEFsaWduWyRoQWxpZ25dKSkKCQkJcmV0dXJuIHNlbGY6OiRfbWFwSEFsaWduWyRoQWxpZ25dOwoJCXJldHVybiAwOwoJfQoKCS8qKgoJICogTWFwIG9mIEJJRkYyLUJJRkY4IGNvZGVzIGZvciB2ZXJ0aWNhbCBhbGlnbm1lbnQKCSAqIEBzdGF0aWMJYXJyYXkgb2YgaW50CgkgKgoJICovCglwcml2YXRlIHN0YXRpYyAkX21hcFZBbGlnbiA9IGFycmF5KCBQSFBFeGNlbF9TdHlsZV9BbGlnbm1lbnQ6OlZFUlRJQ0FMX1RPUAkJPT4gMCwKCQkJCQkJCQkJCVBIUEV4Y2VsX1N0eWxlX0FsaWdubWVudDo6VkVSVElDQUxfQ0VOVEVSCT0+IDEsCgkJCQkJCQkJCQlQSFBFeGNlbF9TdHlsZV9BbGlnbm1lbnQ6OlZFUlRJQ0FMX0JPVFRPTQk9PiAyLAoJCQkJCQkJCQkJUEhQRXhjZWxfU3R5bGVfQWxpZ25tZW50OjpWRVJUSUNBTF9KVVNUSUZZCT0+IDMsCgkJCQkJCQkJCSAgKTsKCS8qKgoJICogTWFwIHRvIEJJRkYyLUJJRkY4IGNvZGVzIGZvciB2ZXJ0aWNhbCBhbGlnbm1lbnQKCSAqCgkgKiBAcGFyYW0gc3RyaW5nICR2QWxpZ24KCSAqIEByZXR1cm4gaW50CgkgKi8KCXByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIF9tYXBWQWxpZ24oJHZBbGlnbikgewoJCWlmIChpc3NldChzZWxmOjokX21hcFZBbGlnblskdkFsaWduXSkpCgkJCXJldHVybiBzZWxmOjokX21hcFZBbGlnblskdkFsaWduXTsKCQlyZXR1cm4gMjsKCX0KCgkvKioKCSAqIE1hcCB0byBCSUZGOCBjb2RlcyBmb3IgdGV4dCByb3RhdGlvbiBhbmdsZQoJICoKCSAqIEBwYXJhbSBpbnQgJHRleHRSb3RhdGlvbgoJICogQHJldHVybiBpbnQKCSAqLwoJcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gX21hcFRleHRSb3RhdGlvbigkdGV4dFJvdGF0aW9uKSB7CgkJaWYgKCR0ZXh0Um90YXRpb24gPj0gMCkgewoJCQlyZXR1cm4gJHRleHRSb3RhdGlvbjsKCQl9CgkJaWYgKCR0ZXh0Um90YXRpb24gPT0gLTE2NSkgewoJCQlyZXR1cm4gMjU1OwoJCX0KCQlpZiAoJHRleHRSb3RhdGlvbiA8IDApIHsKCQkJcmV0dXJuIDkwIC0gJHRleHRSb3RhdGlvbjsKCQl9Cgl9CgoJLyoqCgkgKiBNYXAgbG9ja2VkCgkgKgoJICogQHBhcmFtIHN0cmluZwoJICogQHJldHVybiBpbnQKCSAqLwoJcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gX21hcExvY2tlZCgkbG9ja2VkKSB7CgkJc3dpdGNoICgkbG9ja2VkKSB7CgkJCWNhc2UgUEhQRXhjZWxfU3R5bGVfUHJvdGVjdGlvbjo6UFJPVEVDVElPTl9JTkhFUklUOgkJcmV0dXJuIDE7CgkJCWNhc2UgUEhQRXhjZWxfU3R5bGVfUHJvdGVjdGlvbjo6UFJPVEVDVElPTl9QUk9URUNURUQ6CXJldHVybiAxOwoJCQljYXNlIFBIUEV4Y2VsX1N0eWxlX1Byb3RlY3Rpb246OlBST1RFQ1RJT05fVU5QUk9URUNURUQ6CXJldHVybiAwOwoJCQlkZWZhdWx0OgkJCQkJCQkJCQkJCXJldHVybiAxOwoJCX0KCX0KCgkvKioKCSAqIE1hcCBoaWRkZW4KCSAqCgkgKiBAcGFyYW0gc3RyaW5nCgkgKiBAcmV0dXJuIGludAoJICovCglwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBfbWFwSGlkZGVuKCRoaWRkZW4pIHsKCQlzd2l0Y2ggKCRoaWRkZW4pIHsKCQkJY2FzZSBQSFBFeGNlbF9TdHlsZV9Qcm90ZWN0aW9uOjpQUk9URUNUSU9OX0lOSEVSSVQ6CQlyZXR1cm4gMDsKCQkJY2FzZSBQSFBFeGNlbF9TdHlsZV9Qcm90ZWN0aW9uOjpQUk9URUNUSU9OX1BST1RFQ1RFRDoJcmV0dXJuIDE7CgkJCWNhc2UgUEhQRXhjZWxfU3R5bGVfUHJvdGVjdGlvbjo6UFJPVEVDVElPTl9VTlBST1RFQ1RFRDoJcmV0dXJuIDA7CgkJCWRlZmF1bHQ6CQkJCQkJCQkJCQkJcmV0dXJuIDA7CgkJfQoJfQoKfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Writer/Excel2007.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIFBIUEV4Y2VsCiAqCiAqIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICoKICogQGNhdGVnb3J5ICAgUEhQRXhjZWwKICogQHBhY2thZ2UgICAgUEhQRXhjZWxfV3JpdGVyX0V4Y2VsMjAwNwogKiBAY29weXJpZ2h0ICBDb3B5cmlnaHQgKGMpIDIwMDYgLSAyMDEyIFBIUEV4Y2VsIChodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9QSFBFeGNlbCkKICogQGxpY2Vuc2UgICAgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL29sZC1saWNlbnNlcy9sZ3BsLTIuMS50eHQJTEdQTAogKiBAdmVyc2lvbiAgICAxLjcuNywgMjAxMi0wNS0xOQogKi8KCgovKioKICogUEhQRXhjZWxfV3JpdGVyX0V4Y2VsMjAwNwogKgogKiBAY2F0ZWdvcnkgICBQSFBFeGNlbAogKiBAcGFja2FnZSAgICBQSFBFeGNlbF9Xcml0ZXJfRXhjZWwyMDA3CiAqIEBjb3B5cmlnaHQgIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwgKGh0dHA6Ly93d3cuY29kZXBsZXguY29tL1BIUEV4Y2VsKQogKi8KY2xhc3MgUEhQRXhjZWxfV3JpdGVyX0V4Y2VsMjAwNyBpbXBsZW1lbnRzIFBIUEV4Y2VsX1dyaXRlcl9JV3JpdGVyCnsKCS8qKgoJICogV3JpdGUgY2hhcnRzIHRoYXQgYXJlIGRlZmluZWQgaW4gdGhlIHdvcmtib29rPwoJICogSWRlbnRpZmllcyB3aGV0aGVyIHRoZSBXcml0ZXIgc2hvdWxkIHdyaXRlIGRlZmluaXRpb25zIGZvciBhbnkgY2hhcnRzIHRoYXQgZXhpc3QgaW4gdGhlIFBIUEV4Y2VsIG9iamVjdDsKCSAqCgkgKiBAdmFyCWJvb2xlYW4KCSAqLwoJcHJpdmF0ZSAkX2luY2x1ZGVDaGFydHMgPSBmYWxzZTsKCgkvKioKCSAqIFByZS1jYWxjdWxhdGUgZm9ybXVsYXMKCSAqCgkgKiBAdmFyIGJvb2xlYW4KCSAqLwoJcHJpdmF0ZSAkX3ByZUNhbGN1bGF0ZUZvcm11bGFzID0gdHJ1ZTsKCgkvKioKCSAqIE9mZmljZTIwMDMgY29tcGF0aWJpbGl0eQoJICoKCSAqIEB2YXIgYm9vbGVhbgoJICovCglwcml2YXRlICRfb2ZmaWNlMjAwM2NvbXBhdGliaWxpdHkgPSBmYWxzZTsKCgkvKioKCSAqIFByaXZhdGUgd3JpdGVyIHBhcnRzCgkgKgoJICogQHZhciBQSFBFeGNlbF9Xcml0ZXJfRXhjZWwyMDA3X1dyaXRlclBhcnRbXQoJICovCglwcml2YXRlICRfd3JpdGVyUGFydHMJPSBhcnJheSgpOwoKCS8qKgoJICogUHJpdmF0ZSBQSFBFeGNlbAoJICoKCSAqIEB2YXIgUEhQRXhjZWwKCSAqLwoJcHJpdmF0ZSAkX3NwcmVhZFNoZWV0OwoKCS8qKgoJICogUHJpdmF0ZSBzdHJpbmcgdGFibGUKCSAqCgkgKiBAdmFyIHN0cmluZ1tdCgkgKi8KCXByaXZhdGUgJF9zdHJpbmdUYWJsZQk9IGFycmF5KCk7CgoJLyoqCgkgKiBQcml2YXRlIHVuaXF1ZSBQSFBFeGNlbF9TdHlsZV9Db25kaXRpb25hbCBIYXNoVGFibGUKCSAqCgkgKiBAdmFyIFBIUEV4Y2VsX0hhc2hUYWJsZQoJICovCglwcml2YXRlICRfc3R5bGVzQ29uZGl0aW9uYWxIYXNoVGFibGU7CgoJLyoqCgkgKiBQcml2YXRlIHVuaXF1ZSBQSFBFeGNlbF9TdHlsZV9GaWxsIEhhc2hUYWJsZQoJICoKCSAqIEB2YXIgUEhQRXhjZWxfSGFzaFRhYmxlCgkgKi8KCXByaXZhdGUgJF9maWxsSGFzaFRhYmxlOwoKCS8qKgoJICogUHJpdmF0ZSB1bmlxdWUgUEhQRXhjZWxfU3R5bGVfRm9udCBIYXNoVGFibGUKCSAqCgkgKiBAdmFyIFBIUEV4Y2VsX0hhc2hUYWJsZQoJICovCglwcml2YXRlICRfZm9udEhhc2hUYWJsZTsKCgkvKioKCSAqIFByaXZhdGUgdW5pcXVlIFBIUEV4Y2VsX1N0eWxlX0JvcmRlcnMgSGFzaFRhYmxlCgkgKgoJICogQHZhciBQSFBFeGNlbF9IYXNoVGFibGUKCSAqLwoJcHJpdmF0ZSAkX2JvcmRlcnNIYXNoVGFibGUgOwoKCS8qKgoJICogUHJpdmF0ZSB1bmlxdWUgUEhQRXhjZWxfU3R5bGVfTnVtYmVyRm9ybWF0IEhhc2hUYWJsZQoJICoKCSAqIEB2YXIgUEhQRXhjZWxfSGFzaFRhYmxlCgkgKi8KCXByaXZhdGUgJF9udW1GbXRIYXNoVGFibGU7CgoJLyoqCgkgKiBQcml2YXRlIHVuaXF1ZSBQSFBFeGNlbF9Xb3Jrc2hlZXRfQmFzZURyYXdpbmcgSGFzaFRhYmxlCgkgKgoJICogQHZhciBQSFBFeGNlbF9IYXNoVGFibGUKCSAqLwoJcHJpdmF0ZSAkX2RyYXdpbmdIYXNoVGFibGU7CgoJLyoqCgkgKiBVc2UgZGlzayBjYWNoaW5nIHdoZXJlIHBvc3NpYmxlPwoJICoKCSAqIEB2YXIgYm9vbGVhbgoJICovCglwcml2YXRlICRfdXNlRGlza0NhY2hpbmcgPSBmYWxzZTsKCgkvKioKCSAqIERpc2sgY2FjaGluZyBkaXJlY3RvcnkKCSAqCgkgKiBAdmFyIHN0cmluZwoJICovCglwcml2YXRlICRfZGlza0NhY2hpbmdEaXJlY3RvcnkJPSAnLi8nOwoKICAgIC8qKgogICAgICogQ3JlYXRlIGEgbmV3IFBIUEV4Y2VsX1dyaXRlcl9FeGNlbDIwMDcKICAgICAqCgkgKiBAcGFyYW0gCVBIUEV4Y2VsCSRwUEhQRXhjZWwKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KFBIUEV4Y2VsICRwUEhQRXhjZWwgPSBudWxsKQogICAgewogICAgCS8vIEFzc2lnbiBQSFBFeGNlbAoJCSR0aGlzLT5zZXRQSFBFeGNlbCgkcFBIUEV4Y2VsKTsKCiAgICAJJHdyaXRlclBhcnRzQXJyYXkgPSBhcnJheSgJJ3N0cmluZ3RhYmxlJwk9PiAnUEhQRXhjZWxfV3JpdGVyX0V4Y2VsMjAwN19TdHJpbmdUYWJsZScsCgkJCQkJCQkJCSdjb250ZW50dHlwZXMnCT0+ICdQSFBFeGNlbF9Xcml0ZXJfRXhjZWwyMDA3X0NvbnRlbnRUeXBlcycsCgkJCQkJCQkJCSdkb2Nwcm9wcycgCQk9PiAnUEhQRXhjZWxfV3JpdGVyX0V4Y2VsMjAwN19Eb2NQcm9wcycsCgkJCQkJCQkJCSdyZWxzJwkJCT0+ICdQSFBFeGNlbF9Xcml0ZXJfRXhjZWwyMDA3X1JlbHMnLAoJCQkJCQkJCQkndGhlbWUnIAkJPT4gJ1BIUEV4Y2VsX1dyaXRlcl9FeGNlbDIwMDdfVGhlbWUnLAoJCQkJCQkJCQknc3R5bGUnIAkJPT4gJ1BIUEV4Y2VsX1dyaXRlcl9FeGNlbDIwMDdfU3R5bGUnLAoJCQkJCQkJCQknd29ya2Jvb2snIAkJPT4gJ1BIUEV4Y2VsX1dyaXRlcl9FeGNlbDIwMDdfV29ya2Jvb2snLAoJCQkJCQkJCQknd29ya3NoZWV0JyAJPT4gJ1BIUEV4Y2VsX1dyaXRlcl9FeGNlbDIwMDdfV29ya3NoZWV0JywKCQkJCQkJCQkJJ2RyYXdpbmcnIAkJPT4gJ1BIUEV4Y2VsX1dyaXRlcl9FeGNlbDIwMDdfRHJhd2luZycsCgkJCQkJCQkJCSdjb21tZW50cycgCQk9PiAnUEhQRXhjZWxfV3JpdGVyX0V4Y2VsMjAwN19Db21tZW50cycsCgkJCQkJCQkJCSdjaGFydCcJCQk9PiAnUEhQRXhjZWxfV3JpdGVyX0V4Y2VsMjAwN19DaGFydCcsCgkJCQkJCQkJICk7CgogICAgCS8vCUluaXRpYWxpc2Ugd3JpdGVyIHBhcnRzCgkJLy8JCWFuZCBBc3NpZ24gdGhlaXIgcGFyZW50IElXcml0ZXJzCgkJZm9yZWFjaCAoJHdyaXRlclBhcnRzQXJyYXkgYXMgJHdyaXRlciA9PiAkY2xhc3MpIHsKCQkJJHRoaXMtPl93cml0ZXJQYXJ0c1skd3JpdGVyXSA9IG5ldyAkY2xhc3MoJHRoaXMpOwoJCX0KCiAgICAJJGhhc2hUYWJsZXNBcnJheSA9IGFycmF5KCAnX3N0eWxlc0NvbmRpdGlvbmFsSGFzaFRhYmxlJywJJ19maWxsSGFzaFRhYmxlJywJCSdfZm9udEhhc2hUYWJsZScsCgkJCQkJCQkJICAnX2JvcmRlcnNIYXNoVGFibGUnLAkJCQknX251bUZtdEhhc2hUYWJsZScsCQknX2RyYXdpbmdIYXNoVGFibGUnCgkJCQkJCQkgICAgKTsKCgkJLy8gU2V0IEhhc2hUYWJsZSB2YXJpYWJsZXMKCQlmb3JlYWNoICgkaGFzaFRhYmxlc0FycmF5IGFzICR0YWJsZU5hbWUpIHsKCQkJJHRoaXMtPiR0YWJsZU5hbWUgCT0gbmV3IFBIUEV4Y2VsX0hhc2hUYWJsZSgpOwoJCX0KICAgIH0KCgkvKioKCSAqIEdldCB3cml0ZXIgcGFydAoJICoKCSAqIEBwYXJhbSAJc3RyaW5nIAkkcFBhcnROYW1lCQlXcml0ZXIgcGFydCBuYW1lCgkgKiBAcmV0dXJuIAlQSFBFeGNlbF9Xcml0ZXJfRXhjZWwyMDA3X1dyaXRlclBhcnQKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldFdyaXRlclBhcnQoJHBQYXJ0TmFtZSA9ICcnKSB7CgkJaWYgKCRwUGFydE5hbWUgIT0gJycgJiYgaXNzZXQoJHRoaXMtPl93cml0ZXJQYXJ0c1tzdHJ0b2xvd2VyKCRwUGFydE5hbWUpXSkpIHsKCQkJcmV0dXJuICR0aGlzLT5fd3JpdGVyUGFydHNbc3RydG9sb3dlcigkcFBhcnROYW1lKV07CgkJfSBlbHNlIHsKCQkJcmV0dXJuIG51bGw7CgkJfQoJfQoKCS8qKgoJICogU2F2ZSBQSFBFeGNlbCB0byBmaWxlCgkgKgoJICogQHBhcmFtIAlzdHJpbmcgCQkkcEZpbGVuYW1lCgkgKiBAdGhyb3dzIAlFeGNlcHRpb24KCSAqLwoJcHVibGljIGZ1bmN0aW9uIHNhdmUoJHBGaWxlbmFtZSA9IG51bGwpCgl7CgkJaWYgKCR0aGlzLT5fc3ByZWFkU2hlZXQgIT09IE5VTEwpIHsKCQkJLy8gZ2FyYmFnZSBjb2xsZWN0CgkJCSR0aGlzLT5fc3ByZWFkU2hlZXQtPmdhcmJhZ2VDb2xsZWN0KCk7CgoJCQkvLyBJZiAkcEZpbGVuYW1lIGlzIHBocDovL291dHB1dCBvciBwaHA6Ly9zdGRvdXQsIG1ha2UgaXQgYSB0ZW1wb3JhcnkgZmlsZS4uLgoJCQkkb3JpZ2luYWxGaWxlbmFtZSA9ICRwRmlsZW5hbWU7CgkJCWlmIChzdHJ0b2xvd2VyKCRwRmlsZW5hbWUpID09ICdwaHA6Ly9vdXRwdXQnIHx8IHN0cnRvbG93ZXIoJHBGaWxlbmFtZSkgPT0gJ3BocDovL3N0ZG91dCcpIHsKCQkJCSRwRmlsZW5hbWUgPSBAdGVtcG5hbShQSFBFeGNlbF9TaGFyZWRfRmlsZTo6c3lzX2dldF90ZW1wX2RpcigpLCAncGhweGx0bXAnKTsKCQkJCWlmICgkcEZpbGVuYW1lID09ICcnKSB7CgkJCQkJJHBGaWxlbmFtZSA9ICRvcmlnaW5hbEZpbGVuYW1lOwoJCQkJfQoJCQl9CgoJCQkkc2F2ZURlYnVnTG9nID0gUEhQRXhjZWxfQ2FsY3VsYXRpb246OmdldEluc3RhbmNlKCktPndyaXRlRGVidWdMb2c7CgkJCVBIUEV4Y2VsX0NhbGN1bGF0aW9uOjpnZXRJbnN0YW5jZSgpLT53cml0ZURlYnVnTG9nID0gZmFsc2U7CgkJCSRzYXZlRGF0ZVJldHVyblR5cGUgPSBQSFBFeGNlbF9DYWxjdWxhdGlvbl9GdW5jdGlvbnM6OmdldFJldHVybkRhdGVUeXBlKCk7CgkJCVBIUEV4Y2VsX0NhbGN1bGF0aW9uX0Z1bmN0aW9uczo6c2V0UmV0dXJuRGF0ZVR5cGUoUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpSRVRVUk5EQVRFX0VYQ0VMKTsKCgkJCS8vIENyZWF0ZSBzdHJpbmcgbG9va3VwIHRhYmxlCgkJCSR0aGlzLT5fc3RyaW5nVGFibGUgPSBhcnJheSgpOwoJCQlmb3IgKCRpID0gMDsgJGkgPCAkdGhpcy0+X3NwcmVhZFNoZWV0LT5nZXRTaGVldENvdW50KCk7ICsrJGkpIHsKCQkJCSR0aGlzLT5fc3RyaW5nVGFibGUgPSAkdGhpcy0+Z2V0V3JpdGVyUGFydCgnU3RyaW5nVGFibGUnKS0+Y3JlYXRlU3RyaW5nVGFibGUoJHRoaXMtPl9zcHJlYWRTaGVldC0+Z2V0U2hlZXQoJGkpLCAkdGhpcy0+X3N0cmluZ1RhYmxlKTsKCQkJfQoKCQkJLy8gQ3JlYXRlIHN0eWxlcyBkaWN0aW9uYXJpZXMKCQkJJHRoaXMtPl9zdHlsZXNDb25kaXRpb25hbEhhc2hUYWJsZS0+YWRkRnJvbVNvdXJjZSggCSR0aGlzLT5nZXRXcml0ZXJQYXJ0KCdTdHlsZScpLT5hbGxDb25kaXRpb25hbFN0eWxlcygkdGhpcy0+X3NwcmVhZFNoZWV0KSAJCQkpOwoJCQkkdGhpcy0+X2ZpbGxIYXNoVGFibGUtPmFkZEZyb21Tb3VyY2UoIAkJCQkkdGhpcy0+Z2V0V3JpdGVyUGFydCgnU3R5bGUnKS0+YWxsRmlsbHMoJHRoaXMtPl9zcHJlYWRTaGVldCkgCQkJKTsKCQkJJHRoaXMtPl9mb250SGFzaFRhYmxlLT5hZGRGcm9tU291cmNlKCAJCQkJJHRoaXMtPmdldFdyaXRlclBhcnQoJ1N0eWxlJyktPmFsbEZvbnRzKCR0aGlzLT5fc3ByZWFkU2hlZXQpIAkJCSk7CgkJCSR0aGlzLT5fYm9yZGVyc0hhc2hUYWJsZS0+YWRkRnJvbVNvdXJjZSggCQkJJHRoaXMtPmdldFdyaXRlclBhcnQoJ1N0eWxlJyktPmFsbEJvcmRlcnMoJHRoaXMtPl9zcHJlYWRTaGVldCkgCQkJKTsKCQkJJHRoaXMtPl9udW1GbXRIYXNoVGFibGUtPmFkZEZyb21Tb3VyY2UoIAkJCSR0aGlzLT5nZXRXcml0ZXJQYXJ0KCdTdHlsZScpLT5hbGxOdW1iZXJGb3JtYXRzKCR0aGlzLT5fc3ByZWFkU2hlZXQpIAkpOwoKCQkJLy8gQ3JlYXRlIGRyYXdpbmcgZGljdGlvbmFyeQoJCQkkdGhpcy0+X2RyYXdpbmdIYXNoVGFibGUtPmFkZEZyb21Tb3VyY2UoIAkJCSR0aGlzLT5nZXRXcml0ZXJQYXJ0KCdEcmF3aW5nJyktPmFsbERyYXdpbmdzKCR0aGlzLT5fc3ByZWFkU2hlZXQpIAkJKTsKCgkJCS8vIENyZWF0ZSBuZXcgWklQIGZpbGUgYW5kIG9wZW4gaXQgZm9yIHdyaXRpbmcKCQkJJHppcENsYXNzID0gUEhQRXhjZWxfU2V0dGluZ3M6OmdldFppcENsYXNzKCk7CgkJCSRvYmpaaXAgPSBuZXcgJHppcENsYXNzKCk7CgoJCQkvLwlSZXRyaWV2ZSBPVkVSV1JJVEUgYW5kIENSRUFURSBjb25zdGFudHMgZnJvbSB0aGUgaW5zdGFudGlhdGVkIHppcCBjbGFzcwoJCQkvLwlUaGlzIG1ldGhvZCBvZiBhY2Nlc3NpbmcgY29uc3RhbnQgdmFsdWVzIGZyb20gYSBkeW5hbWljIGNsYXNzIHNob3VsZCB3b3JrIHdpdGggYWxsIGFwcHJvcHJpYXRlIHZlcnNpb25zIG9mIFBIUAoJCQkkcm8gPSBuZXcgUmVmbGVjdGlvbk9iamVjdCgkb2JqWmlwKTsKCQkJJHppcE92ZXJXcml0ZSA9ICRyby0+Z2V0Q29uc3RhbnQoJ09WRVJXUklURScpOwoJCQkkemlwQ3JlYXRlID0gJHJvLT5nZXRDb25zdGFudCgnQ1JFQVRFJyk7CgoJCQlpZiAoZmlsZV9leGlzdHMoJHBGaWxlbmFtZSkpIHsKCQkJCXVubGluaygkcEZpbGVuYW1lKTsKCQkJfQoJCQkvLyBUcnkgb3BlbmluZyB0aGUgWklQIGZpbGUKCQkJaWYgKCRvYmpaaXAtPm9wZW4oJHBGaWxlbmFtZSwgJHppcE92ZXJXcml0ZSkgIT09IHRydWUpIHsKCQkJCWlmICgkb2JqWmlwLT5vcGVuKCRwRmlsZW5hbWUsICR6aXBDcmVhdGUpICE9PSB0cnVlKSB7CgkJCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbigiQ291bGQgbm90IG9wZW4gIiAuICRwRmlsZW5hbWUgLiAiIGZvciB3cml0aW5nLiIpOwoJCQkJfQoJCQl9CgoJCQkvLyBBZGQgW0NvbnRlbnRfVHlwZXNdLnhtbCB0byBaSVAgZmlsZQoJCQkkb2JqWmlwLT5hZGRGcm9tU3RyaW5nKCdbQ29udGVudF9UeXBlc10ueG1sJywgCQkJJHRoaXMtPmdldFdyaXRlclBhcnQoJ0NvbnRlbnRUeXBlcycpLT53cml0ZUNvbnRlbnRUeXBlcygkdGhpcy0+X3NwcmVhZFNoZWV0LCAkdGhpcy0+X2luY2x1ZGVDaGFydHMpKTsKCgkJCS8vIEFkZCByZWxhdGlvbnNoaXBzIHRvIFpJUCBmaWxlCgkJCSRvYmpaaXAtPmFkZEZyb21TdHJpbmcoJ19yZWxzLy5yZWxzJywgCQkJCQkkdGhpcy0+Z2V0V3JpdGVyUGFydCgnUmVscycpLT53cml0ZVJlbGF0aW9uc2hpcHMoJHRoaXMtPl9zcHJlYWRTaGVldCkpOwoJCQkkb2JqWmlwLT5hZGRGcm9tU3RyaW5nKCd4bC9fcmVscy93b3JrYm9vay54bWwucmVscycsIAkkdGhpcy0+Z2V0V3JpdGVyUGFydCgnUmVscycpLT53cml0ZVdvcmtib29rUmVsYXRpb25zaGlwcygkdGhpcy0+X3NwcmVhZFNoZWV0KSk7CgoJCQkvLyBBZGQgZG9jdW1lbnQgcHJvcGVydGllcyB0byBaSVAgZmlsZQoJCQkkb2JqWmlwLT5hZGRGcm9tU3RyaW5nKCdkb2NQcm9wcy9hcHAueG1sJywgCQkJCSR0aGlzLT5nZXRXcml0ZXJQYXJ0KCdEb2NQcm9wcycpLT53cml0ZURvY1Byb3BzQXBwKCR0aGlzLT5fc3ByZWFkU2hlZXQpKTsKCQkJJG9ialppcC0+YWRkRnJvbVN0cmluZygnZG9jUHJvcHMvY29yZS54bWwnLCAJCQkkdGhpcy0+Z2V0V3JpdGVyUGFydCgnRG9jUHJvcHMnKS0+d3JpdGVEb2NQcm9wc0NvcmUoJHRoaXMtPl9zcHJlYWRTaGVldCkpOwoJCQkkY3VzdG9tUHJvcGVydGllc1BhcnQgPSAkdGhpcy0+Z2V0V3JpdGVyUGFydCgnRG9jUHJvcHMnKS0+d3JpdGVEb2NQcm9wc0N1c3RvbSgkdGhpcy0+X3NwcmVhZFNoZWV0KTsKCQkJaWYgKCRjdXN0b21Qcm9wZXJ0aWVzUGFydCAhPT0gTlVMTCkgewoJCQkJJG9ialppcC0+YWRkRnJvbVN0cmluZygnZG9jUHJvcHMvY3VzdG9tLnhtbCcsIAkJJGN1c3RvbVByb3BlcnRpZXNQYXJ0KTsKCQkJfQoKCQkJLy8gQWRkIHRoZW1lIHRvIFpJUCBmaWxlCgkJCSRvYmpaaXAtPmFkZEZyb21TdHJpbmcoJ3hsL3RoZW1lL3RoZW1lMS54bWwnLCAJCQkkdGhpcy0+Z2V0V3JpdGVyUGFydCgnVGhlbWUnKS0+d3JpdGVUaGVtZSgkdGhpcy0+X3NwcmVhZFNoZWV0KSk7CgoJCQkvLyBBZGQgc3RyaW5nIHRhYmxlIHRvIFpJUCBmaWxlCgkJCSRvYmpaaXAtPmFkZEZyb21TdHJpbmcoJ3hsL3NoYXJlZFN0cmluZ3MueG1sJywgCQkJJHRoaXMtPmdldFdyaXRlclBhcnQoJ1N0cmluZ1RhYmxlJyktPndyaXRlU3RyaW5nVGFibGUoJHRoaXMtPl9zdHJpbmdUYWJsZSkpOwoKCQkJLy8gQWRkIHN0eWxlcyB0byBaSVAgZmlsZQoJCQkkb2JqWmlwLT5hZGRGcm9tU3RyaW5nKCd4bC9zdHlsZXMueG1sJywgCQkJCSR0aGlzLT5nZXRXcml0ZXJQYXJ0KCdTdHlsZScpLT53cml0ZVN0eWxlcygkdGhpcy0+X3NwcmVhZFNoZWV0KSk7CgoJCQkvLyBBZGQgd29ya2Jvb2sgdG8gWklQIGZpbGUKCQkJJG9ialppcC0+YWRkRnJvbVN0cmluZygneGwvd29ya2Jvb2sueG1sJywgCQkJCSR0aGlzLT5nZXRXcml0ZXJQYXJ0KCdXb3JrYm9vaycpLT53cml0ZVdvcmtib29rKCR0aGlzLT5fc3ByZWFkU2hlZXQsICR0aGlzLT5fcHJlQ2FsY3VsYXRlRm9ybXVsYXMpKTsKCgkJCSRjaGFydENvdW50ID0gMDsKCQkJLy8gQWRkIHdvcmtzaGVldHMKCQkJZm9yICgkaSA9IDA7ICRpIDwgJHRoaXMtPl9zcHJlYWRTaGVldC0+Z2V0U2hlZXRDb3VudCgpOyArKyRpKSB7CgkJCQkkb2JqWmlwLT5hZGRGcm9tU3RyaW5nKCd4bC93b3Jrc2hlZXRzL3NoZWV0JyAuICgkaSArIDEpIC4gJy54bWwnLCAkdGhpcy0+Z2V0V3JpdGVyUGFydCgnV29ya3NoZWV0JyktPndyaXRlV29ya3NoZWV0KCR0aGlzLT5fc3ByZWFkU2hlZXQtPmdldFNoZWV0KCRpKSwgJHRoaXMtPl9zdHJpbmdUYWJsZSwgJHRoaXMtPl9pbmNsdWRlQ2hhcnRzKSk7CgkJCQlpZiAoJHRoaXMtPl9pbmNsdWRlQ2hhcnRzKSB7CgkJCQkJJGNoYXJ0cyA9ICR0aGlzLT5fc3ByZWFkU2hlZXQtPmdldFNoZWV0KCRpKS0+Z2V0Q2hhcnRDb2xsZWN0aW9uKCk7CgkJCQkJaWYgKGNvdW50KCRjaGFydHMpID4gMCkgewoJCQkJCQlmb3JlYWNoKCRjaGFydHMgYXMgJGNoYXJ0KSB7CgkJCQkJCQkkb2JqWmlwLT5hZGRGcm9tU3RyaW5nKCd4bC9jaGFydHMvY2hhcnQnIC4gKCRjaGFydENvdW50ICsgMSkgLiAnLnhtbCcsICR0aGlzLT5nZXRXcml0ZXJQYXJ0KCdDaGFydCcpLT53cml0ZUNoYXJ0KCRjaGFydCkpOwoJCQkJCQkJJGNoYXJ0Q291bnQrKzsKCQkJCQkJfQoJCQkJCX0KCQkJCX0KCQkJfQoKCQkJJGNoYXJ0UmVmMSA9ICRjaGFydFJlZjIgPSAwOwoJCQkvLyBBZGQgd29ya3NoZWV0IHJlbGF0aW9uc2hpcHMgKGRyYXdpbmdzLCAuLi4pCgkJCWZvciAoJGkgPSAwOyAkaSA8ICR0aGlzLT5fc3ByZWFkU2hlZXQtPmdldFNoZWV0Q291bnQoKTsgKyskaSkgewoKCQkJCS8vIEFkZCByZWxhdGlvbnNoaXBzCgkJCQkkb2JqWmlwLT5hZGRGcm9tU3RyaW5nKCd4bC93b3Jrc2hlZXRzL19yZWxzL3NoZWV0JyAuICgkaSArIDEpIC4gJy54bWwucmVscycsIAkkdGhpcy0+Z2V0V3JpdGVyUGFydCgnUmVscycpLT53cml0ZVdvcmtzaGVldFJlbGF0aW9uc2hpcHMoJHRoaXMtPl9zcHJlYWRTaGVldC0+Z2V0U2hlZXQoJGkpLCAoJGkgKyAxKSwgJHRoaXMtPl9pbmNsdWRlQ2hhcnRzKSk7CgoJCQkJJGRyYXdpbmdzID0gJHRoaXMtPl9zcHJlYWRTaGVldC0+Z2V0U2hlZXQoJGkpLT5nZXREcmF3aW5nQ29sbGVjdGlvbigpOwoJCQkJJGRyYXdpbmdDb3VudCA9IGNvdW50KCRkcmF3aW5ncyk7CgkJCQlpZiAoJHRoaXMtPl9pbmNsdWRlQ2hhcnRzKSB7CgkJCQkJJGNoYXJ0Q291bnQgPSAkdGhpcy0+X3NwcmVhZFNoZWV0LT5nZXRTaGVldCgkaSktPmdldENoYXJ0Q291bnQoKTsKCQkJCX0KCgkJCQkvLyBBZGQgZHJhd2luZyBhbmQgaW1hZ2UgcmVsYXRpb25zaGlwIHBhcnRzCgkJCQlpZiAoKCRkcmF3aW5nQ291bnQgPiAwKSB8fCAoJGNoYXJ0Q291bnQgPiAwKSkgewoJCQkJCS8vIERyYXdpbmcgcmVsYXRpb25zaGlwcwoJCQkJCSRvYmpaaXAtPmFkZEZyb21TdHJpbmcoJ3hsL2RyYXdpbmdzL19yZWxzL2RyYXdpbmcnIC4gKCRpICsgMSkgLiAnLnhtbC5yZWxzJywgJHRoaXMtPmdldFdyaXRlclBhcnQoJ1JlbHMnKS0+d3JpdGVEcmF3aW5nUmVsYXRpb25zaGlwcygkdGhpcy0+X3NwcmVhZFNoZWV0LT5nZXRTaGVldCgkaSksJGNoYXJ0UmVmMSwgJHRoaXMtPl9pbmNsdWRlQ2hhcnRzKSk7CgoJCQkJCS8vIERyYXdpbmdzCgkJCQkJJG9ialppcC0+YWRkRnJvbVN0cmluZygneGwvZHJhd2luZ3MvZHJhd2luZycgLiAoJGkgKyAxKSAuICcueG1sJywgJHRoaXMtPmdldFdyaXRlclBhcnQoJ0RyYXdpbmcnKS0+d3JpdGVEcmF3aW5ncygkdGhpcy0+X3NwcmVhZFNoZWV0LT5nZXRTaGVldCgkaSksJGNoYXJ0UmVmMiwkdGhpcy0+X2luY2x1ZGVDaGFydHMpKTsKCQkJCX0KCgkJCQkvLyBBZGQgY29tbWVudCByZWxhdGlvbnNoaXAgcGFydHMKCQkJCWlmIChjb3VudCgkdGhpcy0+X3NwcmVhZFNoZWV0LT5nZXRTaGVldCgkaSktPmdldENvbW1lbnRzKCkpID4gMCkgewoJCQkJCS8vIFZNTCBDb21tZW50cwoJCQkJCSRvYmpaaXAtPmFkZEZyb21TdHJpbmcoJ3hsL2RyYXdpbmdzL3ZtbERyYXdpbmcnIC4gKCRpICsgMSkgLiAnLnZtbCcsICR0aGlzLT5nZXRXcml0ZXJQYXJ0KCdDb21tZW50cycpLT53cml0ZVZNTENvbW1lbnRzKCR0aGlzLT5fc3ByZWFkU2hlZXQtPmdldFNoZWV0KCRpKSkpOwoKCQkJCQkvLyBDb21tZW50cwoJCQkJCSRvYmpaaXAtPmFkZEZyb21TdHJpbmcoJ3hsL2NvbW1lbnRzJyAuICgkaSArIDEpIC4gJy54bWwnLCAkdGhpcy0+Z2V0V3JpdGVyUGFydCgnQ29tbWVudHMnKS0+d3JpdGVDb21tZW50cygkdGhpcy0+X3NwcmVhZFNoZWV0LT5nZXRTaGVldCgkaSkpKTsKCQkJCX0KCgkJCQkvLyBBZGQgaGVhZGVyL2Zvb3RlciByZWxhdGlvbnNoaXAgcGFydHMKCQkJCWlmIChjb3VudCgkdGhpcy0+X3NwcmVhZFNoZWV0LT5nZXRTaGVldCgkaSktPmdldEhlYWRlckZvb3RlcigpLT5nZXRJbWFnZXMoKSkgPiAwKSB7CgkJCQkJLy8gVk1MIERyYXdpbmdzCgkJCQkJJG9ialppcC0+YWRkRnJvbVN0cmluZygneGwvZHJhd2luZ3Mvdm1sRHJhd2luZ0hGJyAuICgkaSArIDEpIC4gJy52bWwnLCAkdGhpcy0+Z2V0V3JpdGVyUGFydCgnRHJhd2luZycpLT53cml0ZVZNTEhlYWRlckZvb3RlckltYWdlcygkdGhpcy0+X3NwcmVhZFNoZWV0LT5nZXRTaGVldCgkaSkpKTsKCgkJCQkJLy8gVk1MIERyYXdpbmcgcmVsYXRpb25zaGlwcwoJCQkJCSRvYmpaaXAtPmFkZEZyb21TdHJpbmcoJ3hsL2RyYXdpbmdzL19yZWxzL3ZtbERyYXdpbmdIRicgLiAoJGkgKyAxKSAuICcudm1sLnJlbHMnLCAkdGhpcy0+Z2V0V3JpdGVyUGFydCgnUmVscycpLT53cml0ZUhlYWRlckZvb3RlckRyYXdpbmdSZWxhdGlvbnNoaXBzKCR0aGlzLT5fc3ByZWFkU2hlZXQtPmdldFNoZWV0KCRpKSkpOwoKCQkJCQkvLyBNZWRpYQoJCQkJCWZvcmVhY2ggKCR0aGlzLT5fc3ByZWFkU2hlZXQtPmdldFNoZWV0KCRpKS0+Z2V0SGVhZGVyRm9vdGVyKCktPmdldEltYWdlcygpIGFzICRpbWFnZSkgewoJCQkJCQkkb2JqWmlwLT5hZGRGcm9tU3RyaW5nKCd4bC9tZWRpYS8nIC4gJGltYWdlLT5nZXRJbmRleGVkRmlsZW5hbWUoKSwgZmlsZV9nZXRfY29udGVudHMoJGltYWdlLT5nZXRQYXRoKCkpKTsKCQkJCQl9CgkJCQl9CgkJCX0KCgkJCS8vIEFkZCBtZWRpYQoJCQlmb3IgKCRpID0gMDsgJGkgPCAkdGhpcy0+Z2V0RHJhd2luZ0hhc2hUYWJsZSgpLT5jb3VudCgpOyArKyRpKSB7CgkJCQlpZiAoJHRoaXMtPmdldERyYXdpbmdIYXNoVGFibGUoKS0+Z2V0QnlJbmRleCgkaSkgaW5zdGFuY2VvZiBQSFBFeGNlbF9Xb3Jrc2hlZXRfRHJhd2luZykgewoJCQkJCSRpbWFnZUNvbnRlbnRzID0gbnVsbDsKCQkJCQkkaW1hZ2VQYXRoID0gJHRoaXMtPmdldERyYXdpbmdIYXNoVGFibGUoKS0+Z2V0QnlJbmRleCgkaSktPmdldFBhdGgoKTsKCgkJCQkJaWYgKHN0cnBvcygkaW1hZ2VQYXRoLCAnemlwOi8vJykgIT09IGZhbHNlKSB7CgkJCQkJCSRpbWFnZVBhdGggPSBzdWJzdHIoJGltYWdlUGF0aCwgNik7CgkJCQkJCSRpbWFnZVBhdGhTcGxpdHRlZCA9IGV4cGxvZGUoJyMnLCAkaW1hZ2VQYXRoKTsKCgkJCQkJCSRpbWFnZVppcCA9IG5ldyBaaXBBcmNoaXZlKCk7CgkJCQkJCSRpbWFnZVppcC0+b3BlbigkaW1hZ2VQYXRoU3BsaXR0ZWRbMF0pOwoJCQkJCQkkaW1hZ2VDb250ZW50cyA9ICRpbWFnZVppcC0+Z2V0RnJvbU5hbWUoJGltYWdlUGF0aFNwbGl0dGVkWzFdKTsKCQkJCQkJJGltYWdlWmlwLT5jbG9zZSgpOwoJCQkJCQl1bnNldCgkaW1hZ2VaaXApOwoJCQkJCX0gZWxzZSB7CgkJCQkJCSRpbWFnZUNvbnRlbnRzID0gZmlsZV9nZXRfY29udGVudHMoJGltYWdlUGF0aCk7CgkJCQkJfQoKCQkJCQkkb2JqWmlwLT5hZGRGcm9tU3RyaW5nKCd4bC9tZWRpYS8nIC4gc3RyX3JlcGxhY2UoJyAnLCAnXycsICR0aGlzLT5nZXREcmF3aW5nSGFzaFRhYmxlKCktPmdldEJ5SW5kZXgoJGkpLT5nZXRJbmRleGVkRmlsZW5hbWUoKSksICRpbWFnZUNvbnRlbnRzKTsKCQkJCX0gZWxzZSBpZiAoJHRoaXMtPmdldERyYXdpbmdIYXNoVGFibGUoKS0+Z2V0QnlJbmRleCgkaSkgaW5zdGFuY2VvZiBQSFBFeGNlbF9Xb3Jrc2hlZXRfTWVtb3J5RHJhd2luZykgewoJCQkJCW9iX3N0YXJ0KCk7CgkJCQkJY2FsbF91c2VyX2Z1bmMoCgkJCQkJCSR0aGlzLT5nZXREcmF3aW5nSGFzaFRhYmxlKCktPmdldEJ5SW5kZXgoJGkpLT5nZXRSZW5kZXJpbmdGdW5jdGlvbigpLAoJCQkJCQkkdGhpcy0+Z2V0RHJhd2luZ0hhc2hUYWJsZSgpLT5nZXRCeUluZGV4KCRpKS0+Z2V0SW1hZ2VSZXNvdXJjZSgpCgkJCQkJKTsKCQkJCQkkaW1hZ2VDb250ZW50cyA9IG9iX2dldF9jb250ZW50cygpOwoJCQkJCW9iX2VuZF9jbGVhbigpOwoKCQkJCQkkb2JqWmlwLT5hZGRGcm9tU3RyaW5nKCd4bC9tZWRpYS8nIC4gc3RyX3JlcGxhY2UoJyAnLCAnXycsICR0aGlzLT5nZXREcmF3aW5nSGFzaFRhYmxlKCktPmdldEJ5SW5kZXgoJGkpLT5nZXRJbmRleGVkRmlsZW5hbWUoKSksICRpbWFnZUNvbnRlbnRzKTsKCQkJCX0KCQkJfQoKCQkJUEhQRXhjZWxfQ2FsY3VsYXRpb25fRnVuY3Rpb25zOjpzZXRSZXR1cm5EYXRlVHlwZSgkc2F2ZURhdGVSZXR1cm5UeXBlKTsKCQkJUEhQRXhjZWxfQ2FsY3VsYXRpb246OmdldEluc3RhbmNlKCktPndyaXRlRGVidWdMb2cgPSAkc2F2ZURlYnVnTG9nOwoKCQkJLy8gQ2xvc2UgZmlsZQoJCQlpZiAoJG9ialppcC0+Y2xvc2UoKSA9PT0gZmFsc2UpIHsKCQkJCXRocm93IG5ldyBFeGNlcHRpb24oIkNvdWxkIG5vdCBjbG9zZSB6aXAgZmlsZSAkcEZpbGVuYW1lLiIpOwoJCQl9CgoJCQkvLyBJZiBhIHRlbXBvcmFyeSBmaWxlIHdhcyB1c2VkLCBjb3B5IGl0IHRvIHRoZSBjb3JyZWN0IGZpbGUgc3RyZWFtCgkJCWlmICgkb3JpZ2luYWxGaWxlbmFtZSAhPSAkcEZpbGVuYW1lKSB7CgkJCQlpZiAoY29weSgkcEZpbGVuYW1lLCAkb3JpZ2luYWxGaWxlbmFtZSkgPT09IGZhbHNlKSB7CgkJCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbigiQ291bGQgbm90IGNvcHkgdGVtcG9yYXJ5IHppcCBmaWxlICRwRmlsZW5hbWUgdG8gJG9yaWdpbmFsRmlsZW5hbWUuIik7CgkJCQl9CgkJCQlAdW5saW5rKCRwRmlsZW5hbWUpOwoJCQl9CgkJfSBlbHNlIHsKCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbigiUEhQRXhjZWwgb2JqZWN0IHVuYXNzaWduZWQuIik7CgkJfQoJfQoKCS8qKgoJICogR2V0IFBIUEV4Y2VsIG9iamVjdAoJICoKCSAqIEByZXR1cm4gUEhQRXhjZWwKCSAqIEB0aHJvd3MgRXhjZXB0aW9uCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRQSFBFeGNlbCgpIHsKCQlpZiAoJHRoaXMtPl9zcHJlYWRTaGVldCAhPT0gbnVsbCkgewoJCQlyZXR1cm4gJHRoaXMtPl9zcHJlYWRTaGVldDsKCQl9IGVsc2UgewoJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCJObyBQSFBFeGNlbCBhc3NpZ25lZC4iKTsKCQl9Cgl9CgoJLyoqCgkgKiBTZXQgUEhQRXhjZWwgb2JqZWN0CgkgKgoJICogQHBhcmFtIAlQSFBFeGNlbCAJJHBQSFBFeGNlbAlQSFBFeGNlbCBvYmplY3QKCSAqIEB0aHJvd3MJRXhjZXB0aW9uCgkgKiBAcmV0dXJuIFBIUEV4Y2VsX1dyaXRlcl9FeGNlbDIwMDcKCSAqLwoJcHVibGljIGZ1bmN0aW9uIHNldFBIUEV4Y2VsKFBIUEV4Y2VsICRwUEhQRXhjZWwgPSBudWxsKSB7CgkJJHRoaXMtPl9zcHJlYWRTaGVldCA9ICRwUEhQRXhjZWw7CgkJcmV0dXJuICR0aGlzOwoJfQoKICAgIC8qKgogICAgICogR2V0IHN0cmluZyB0YWJsZQogICAgICoKICAgICAqIEByZXR1cm4gc3RyaW5nW10KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldFN0cmluZ1RhYmxlKCkgewogICAgCXJldHVybiAkdGhpcy0+X3N0cmluZ1RhYmxlOwogICAgfQoKICAgIC8qKgogICAgICogR2V0IFBIUEV4Y2VsX1N0eWxlX0NvbmRpdGlvbmFsIEhhc2hUYWJsZQogICAgICoKICAgICAqIEByZXR1cm4gUEhQRXhjZWxfSGFzaFRhYmxlCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRTdHlsZXNDb25kaXRpb25hbEhhc2hUYWJsZSgpIHsKICAgIAlyZXR1cm4gJHRoaXMtPl9zdHlsZXNDb25kaXRpb25hbEhhc2hUYWJsZTsKICAgIH0KCiAgICAvKioKICAgICAqIEdldCBQSFBFeGNlbF9TdHlsZV9GaWxsIEhhc2hUYWJsZQogICAgICoKICAgICAqIEByZXR1cm4gUEhQRXhjZWxfSGFzaFRhYmxlCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRGaWxsSGFzaFRhYmxlKCkgewogICAgCXJldHVybiAkdGhpcy0+X2ZpbGxIYXNoVGFibGU7CiAgICB9CgogICAgLyoqCiAgICAgKiBHZXQgUEhQRXhjZWxfU3R5bGVfRm9udCBIYXNoVGFibGUKICAgICAqCiAgICAgKiBAcmV0dXJuIFBIUEV4Y2VsX0hhc2hUYWJsZQogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0Rm9udEhhc2hUYWJsZSgpIHsKICAgIAlyZXR1cm4gJHRoaXMtPl9mb250SGFzaFRhYmxlOwogICAgfQoKICAgIC8qKgogICAgICogR2V0IFBIUEV4Y2VsX1N0eWxlX0JvcmRlcnMgSGFzaFRhYmxlCiAgICAgKgogICAgICogQHJldHVybiBQSFBFeGNlbF9IYXNoVGFibGUKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldEJvcmRlcnNIYXNoVGFibGUoKSB7CiAgICAJcmV0dXJuICR0aGlzLT5fYm9yZGVyc0hhc2hUYWJsZTsKICAgIH0KCiAgICAvKioKICAgICAqIEdldCBQSFBFeGNlbF9TdHlsZV9OdW1iZXJGb3JtYXQgSGFzaFRhYmxlCiAgICAgKgogICAgICogQHJldHVybiBQSFBFeGNlbF9IYXNoVGFibGUKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldE51bUZtdEhhc2hUYWJsZSgpIHsKICAgIAlyZXR1cm4gJHRoaXMtPl9udW1GbXRIYXNoVGFibGU7CiAgICB9CgogICAgLyoqCiAgICAgKiBHZXQgUEhQRXhjZWxfV29ya3NoZWV0X0Jhc2VEcmF3aW5nIEhhc2hUYWJsZQogICAgICoKICAgICAqIEByZXR1cm4gUEhQRXhjZWxfSGFzaFRhYmxlCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXREcmF3aW5nSGFzaFRhYmxlKCkgewogICAgCXJldHVybiAkdGhpcy0+X2RyYXdpbmdIYXNoVGFibGU7CiAgICB9CgoJLyoqCgkgKiBXcml0ZSBjaGFydHMgaW4gd29ya2Jvb2s/CgkgKgkJSWYgdGhpcyBpcyB0cnVlLCB0aGVuIHRoZSBXcml0ZXIgd2lsbCB3cml0ZSBkZWZpbml0aW9ucyBmb3IgYW55IGNoYXJ0cyB0aGF0IGV4aXN0IGluIHRoZSBQSFBFeGNlbCBvYmplY3QuCgkgKgkJSWYgZmFsc2UgKHRoZSBkZWZhdWx0KSBpdCB3aWxsIGlnbm9yZSBhbnkgY2hhcnRzIGRlZmluZWQgaW4gdGhlIFBIUEV4Y2VsIG9iamVjdC4KCSAqCgkgKiBAcmV0dXJuCWJvb2xlYW4KCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldEluY2x1ZGVDaGFydHMoKSB7CgkJcmV0dXJuICR0aGlzLT5faW5jbHVkZUNoYXJ0czsKCX0KCgkvKioKCSAqIFNldCB3cml0ZSBjaGFydHMgaW4gd29ya2Jvb2sKCSAqCQlTZXQgdG8gdHJ1ZSwgdG8gYWR2aXNlIHRoZSBXcml0ZXIgdG8gaW5jbHVkZSBhbnkgY2hhcnRzIHRoYXQgZXhpc3QgaW4gdGhlIFBIUEV4Y2VsIG9iamVjdC4KCSAqCQlTZXQgdG8gZmFsc2UgKHRoZSBkZWZhdWx0KSB0byBpZ25vcmUgY2hhcnRzLgoJICoKCSAqIEBwYXJhbQlib29sZWFuCSRwVmFsdWUKCSAqCgkgKiBAcmV0dXJuCVBIUEV4Y2VsX1dyaXRlcl9FeGNlbDIwMDcKCSAqLwoJcHVibGljIGZ1bmN0aW9uIHNldEluY2x1ZGVDaGFydHMoJHBWYWx1ZSA9IGZhbHNlKSB7CgkJJHRoaXMtPl9pbmNsdWRlQ2hhcnRzID0gKGJvb2xlYW4pICRwVmFsdWU7CgkJcmV0dXJuICR0aGlzOwoJfQoKICAgIC8qKgogICAgICogR2V0IFByZS1DYWxjdWxhdGUgRm9ybXVsYXMKICAgICAqCiAgICAgKiBAcmV0dXJuIGJvb2xlYW4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldFByZUNhbGN1bGF0ZUZvcm11bGFzKCkgewogICAgCXJldHVybiAkdGhpcy0+X3ByZUNhbGN1bGF0ZUZvcm11bGFzOwogICAgfQoKICAgIC8qKgogICAgICogU2V0IFByZS1DYWxjdWxhdGUgRm9ybXVsYXMKICAgICAqCiAgICAgKiBAcGFyYW0gYm9vbGVhbiAkcFZhbHVlCVByZS1DYWxjdWxhdGUgRm9ybXVsYXM/CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBzZXRQcmVDYWxjdWxhdGVGb3JtdWxhcygkcFZhbHVlID0gdHJ1ZSkgewogICAgCSR0aGlzLT5fcHJlQ2FsY3VsYXRlRm9ybXVsYXMgPSAkcFZhbHVlOwogICAgfQoKICAgIC8qKgogICAgICogR2V0IE9mZmljZTIwMDMgY29tcGF0aWJpbGl0eQogICAgICoKICAgICAqIEByZXR1cm4gYm9vbGVhbgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0T2ZmaWNlMjAwM0NvbXBhdGliaWxpdHkoKSB7CiAgICAJcmV0dXJuICR0aGlzLT5fb2ZmaWNlMjAwM2NvbXBhdGliaWxpdHk7CiAgICB9CgogICAgLyoqCiAgICAgKiBTZXQgUHJlLUNhbGN1bGF0ZSBGb3JtdWxhcwogICAgICoKICAgICAqIEBwYXJhbSBib29sZWFuICRwVmFsdWUJT2ZmaWNlMjAwMyBjb21wYXRpYmlsaXR5PwogICAgICogQHJldHVybiBQSFBFeGNlbF9Xcml0ZXJfRXhjZWwyMDA3CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBzZXRPZmZpY2UyMDAzQ29tcGF0aWJpbGl0eSgkcFZhbHVlID0gZmFsc2UpIHsKICAgIAkkdGhpcy0+X29mZmljZTIwMDNjb21wYXRpYmlsaXR5ID0gJHBWYWx1ZTsKICAgIAlyZXR1cm4gJHRoaXM7CiAgICB9CgoJLyoqCgkgKiBHZXQgdXNlIGRpc2sgY2FjaGluZyB3aGVyZSBwb3NzaWJsZT8KCSAqCgkgKiBAcmV0dXJuIGJvb2xlYW4KCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldFVzZURpc2tDYWNoaW5nKCkgewoJCXJldHVybiAkdGhpcy0+X3VzZURpc2tDYWNoaW5nOwoJfQoKCS8qKgoJICogU2V0IHVzZSBkaXNrIGNhY2hpbmcgd2hlcmUgcG9zc2libGU/CgkgKgoJICogQHBhcmFtIAlib29sZWFuIAkkcFZhbHVlCgkgKiBAcGFyYW0Jc3RyaW5nCQkkcERpcmVjdG9yeQkJRGlzayBjYWNoaW5nIGRpcmVjdG9yeQoJICogQHRocm93cwlFeGNlcHRpb24JRXhjZXB0aW9uIHdoZW4gZGlyZWN0b3J5IGRvZXMgbm90IGV4aXN0CgkgKiBAcmV0dXJuIFBIUEV4Y2VsX1dyaXRlcl9FeGNlbDIwMDcKCSAqLwoJcHVibGljIGZ1bmN0aW9uIHNldFVzZURpc2tDYWNoaW5nKCRwVmFsdWUgPSBmYWxzZSwgJHBEaXJlY3RvcnkgPSBudWxsKSB7CgkJJHRoaXMtPl91c2VEaXNrQ2FjaGluZyA9ICRwVmFsdWU7CgoJCWlmICgkcERpcmVjdG9yeSAhPT0gTlVMTCkgewogICAgCQlpZiAoaXNfZGlyKCRwRGlyZWN0b3J5KSkgewogICAgCQkJJHRoaXMtPl9kaXNrQ2FjaGluZ0RpcmVjdG9yeSA9ICRwRGlyZWN0b3J5OwogICAgCQl9IGVsc2UgewogICAgCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbigiRGlyZWN0b3J5IGRvZXMgbm90IGV4aXN0OiAkcERpcmVjdG9yeSIpOwogICAgCQl9CgkJfQoJCXJldHVybiAkdGhpczsKCX0KCgkvKioKCSAqIEdldCBkaXNrIGNhY2hpbmcgZGlyZWN0b3J5CgkgKgoJICogQHJldHVybiBzdHJpbmcKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldERpc2tDYWNoaW5nRGlyZWN0b3J5KCkgewoJCXJldHVybiAkdGhpcy0+X2Rpc2tDYWNoaW5nRGlyZWN0b3J5OwoJfQp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Writer/Excel2007/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Writer/Excel2007/Chart.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIFBIUEV4Y2VsCiAqCiAqIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICoKICogQGNhdGVnb3J5ICAgUEhQRXhjZWwKICogQHBhY2thZ2UgICAgUEhQRXhjZWxfV3JpdGVyX0V4Y2VsMjAwNwogKiBAY29weXJpZ2h0ICBDb3B5cmlnaHQgKGMpIDIwMDYgLSAyMDEyIFBIUEV4Y2VsIChodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9QSFBFeGNlbCkKICogQGxpY2Vuc2UgICAgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL29sZC1saWNlbnNlcy9sZ3BsLTIuMS50eHQJTEdQTAogKiBAdmVyc2lvbiAgICAxLjcuNywgMjAxMi0wNS0xOQogKi8KCgovKioKICogUEhQRXhjZWxfV3JpdGVyX0V4Y2VsMjAwN19DaGFydAogKgogKiBAY2F0ZWdvcnkgICBQSFBFeGNlbAogKiBAcGFja2FnZSAgICBQSFBFeGNlbF9Xcml0ZXJfRXhjZWwyMDA3CiAqIEBjb3B5cmlnaHQgIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwgKGh0dHA6Ly93d3cuY29kZXBsZXguY29tL1BIUEV4Y2VsKQogKi8KY2xhc3MgUEhQRXhjZWxfV3JpdGVyX0V4Y2VsMjAwN19DaGFydCBleHRlbmRzIFBIUEV4Y2VsX1dyaXRlcl9FeGNlbDIwMDdfV3JpdGVyUGFydAp7CgkvKioKCSAqIFdyaXRlIGNoYXJ0cyB0byBYTUwgZm9ybWF0CgkgKgoJICogQHBhcmFtIAlQSFBFeGNlbF9DaGFydAkJCQkkcENoYXJ0CgkgKiBAcmV0dXJuIAlzdHJpbmcgCQkJCQkJWE1MIE91dHB1dAoJICogQHRocm93cyAJRXhjZXB0aW9uCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiB3cml0ZUNoYXJ0KFBIUEV4Y2VsX0NoYXJ0ICRwQ2hhcnQgPSBudWxsKQoJewoJCS8vIENyZWF0ZSBYTUwgd3JpdGVyCgkJJG9ialdyaXRlciA9IG51bGw7CgkJaWYgKCR0aGlzLT5nZXRQYXJlbnRXcml0ZXIoKS0+Z2V0VXNlRGlza0NhY2hpbmcoKSkgewoJCQkkb2JqV3JpdGVyID0gbmV3IFBIUEV4Y2VsX1NoYXJlZF9YTUxXcml0ZXIoUEhQRXhjZWxfU2hhcmVkX1hNTFdyaXRlcjo6U1RPUkFHRV9ESVNLLCAkdGhpcy0+Z2V0UGFyZW50V3JpdGVyKCktPmdldERpc2tDYWNoaW5nRGlyZWN0b3J5KCkpOwoJCX0gZWxzZSB7CgkJCSRvYmpXcml0ZXIgPSBuZXcgUEhQRXhjZWxfU2hhcmVkX1hNTFdyaXRlcihQSFBFeGNlbF9TaGFyZWRfWE1MV3JpdGVyOjpTVE9SQUdFX01FTU9SWSk7CgkJfQoJCS8vCUVuc3VyZSB0aGF0IGRhdGEgc2VyaWVzIHZhbHVlcyBhcmUgdXAtdG8tZGF0ZSBiZWZvcmUgd2Ugc2F2ZQoJCSRwQ2hhcnQtPnJlZnJlc2goKTsKCgkJLy8gWE1MIGhlYWRlcgoJCSRvYmpXcml0ZXItPnN0YXJ0RG9jdW1lbnQoJzEuMCcsJ1VURi04JywneWVzJyk7CgoJCS8vIGM6Y2hhcnRTcGFjZQoJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgnYzpjaGFydFNwYWNlJyk7CgkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCd4bWxuczpjJywgJ2h0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9kcmF3aW5nbWwvMjAwNi9jaGFydCcpOwoJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgneG1sbnM6YScsICdodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvZHJhd2luZ21sLzIwMDYvbWFpbicpOwoJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgneG1sbnM6cicsICdodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvb2ZmaWNlRG9jdW1lbnQvMjAwNi9yZWxhdGlvbnNoaXBzJyk7CgoJCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ2M6ZGF0ZTE5MDQnKTsKCQkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCd2YWwnLCAwKTsKCQkJJG9ialdyaXRlci0+ZW5kRWxlbWVudCgpOwoJCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ2M6bGFuZycpOwoJCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ3ZhbCcsICJlbi1HQiIpOwoJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgkJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgnYzpyb3VuZGVkQ29ybmVycycpOwoJCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ3ZhbCcsIDApOwoJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgoJCQkkdGhpcy0+X3dyaXRlQWx0ZXJuYXRlQ29udGVudCgkb2JqV3JpdGVyKTsKCgkJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgnYzpjaGFydCcpOwoKCQkJCSR0aGlzLT5fd3JpdGVUaXRsZSgkcENoYXJ0LT5nZXRUaXRsZSgpLCAkb2JqV3JpdGVyKTsKCgkJCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ2M6YXV0b1RpdGxlRGVsZXRlZCcpOwoJCQkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCd2YWwnLCAwKTsKCQkJCSRvYmpXcml0ZXItPmVuZEVsZW1lbnQoKTsKCgkJCQkkdGhpcy0+X3dyaXRlUGxvdEFyZWEoJHBDaGFydC0+Z2V0UGxvdEFyZWEoKSwgJHBDaGFydC0+Z2V0WEF4aXNMYWJlbCgpLCAkcENoYXJ0LT5nZXRZQXhpc0xhYmVsKCksICRvYmpXcml0ZXIpOwoKCQkJCSR0aGlzLT5fd3JpdGVMZWdlbmQoJHBDaGFydC0+Z2V0TGVnZW5kKCksICRvYmpXcml0ZXIpOwoKCgkJCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ2M6cGxvdFZpc09ubHknKTsKCQkJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgndmFsJywgMSk7CgkJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgoJCQkJJG9ialdyaXRlci0+c3RhcnRFbGVtZW50KCdjOmRpc3BCbGFua3NBcycpOwoJCQkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCd2YWwnLCAiZ2FwIik7CgkJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgoJCQkJJG9ialdyaXRlci0+c3RhcnRFbGVtZW50KCdjOnNob3dETGJsc092ZXJNYXgnKTsKCQkJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgndmFsJywgMCk7CgkJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgoJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgoJCQkkdGhpcy0+X3dyaXRlUHJpbnRTZXR0aW5ncygkb2JqV3JpdGVyKTsKCgkJJG9ialdyaXRlci0+ZW5kRWxlbWVudCgpOwoKCQkvLyBSZXR1cm4KCQlyZXR1cm4gJG9ialdyaXRlci0+Z2V0RGF0YSgpOwoJfQoKCS8qKgoJICogV3JpdGUgQ2hhcnQgVGl0bGUKCSAqCgkgKiBAcGFyYW0JUEhQRXhjZWxfQ2hhcnRfVGl0bGUJCSR0aXRsZQoJICogQHBhcmFtIAlQSFBFeGNlbF9TaGFyZWRfWE1MV3JpdGVyIAkkb2JqV3JpdGVyIAkJWE1MIFdyaXRlcgoJICogQHRocm93cyAJRXhjZXB0aW9uCgkgKi8KCXByaXZhdGUgZnVuY3Rpb24gX3dyaXRlVGl0bGUoUEhQRXhjZWxfQ2hhcnRfVGl0bGUgJHRpdGxlID0gbnVsbCwgJG9ialdyaXRlcikKCXsKCQlpZiAoaXNfbnVsbCgkdGl0bGUpKSB7CgkJCXJldHVybjsKCQl9CgoJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgnYzp0aXRsZScpOwoJCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ2M6dHgnKTsKCQkJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgnYzpyaWNoJyk7CgoJCQkJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgnYTpib2R5UHInKTsKCQkJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgoJCQkJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgnYTpsc3RTdHlsZScpOwoJCQkJCSRvYmpXcml0ZXItPmVuZEVsZW1lbnQoKTsKCgkJCQkJJG9ialdyaXRlci0+c3RhcnRFbGVtZW50KCdhOnAnKTsKCgkJCQkJCSRjYXB0aW9uID0gJHRpdGxlLT5nZXRDYXB0aW9uKCk7CgkJCQkJCWlmICgoaXNfYXJyYXkoJGNhcHRpb24pKSAmJiAoY291bnQoJGNhcHRpb24pID4gMCkpCgkJCQkJCQkkY2FwdGlvbiA9ICRjYXB0aW9uWzBdOwoJCQkJCQkkdGhpcy0+Z2V0UGFyZW50V3JpdGVyKCktPmdldFdyaXRlclBhcnQoJ3N0cmluZ3RhYmxlJyktPndyaXRlUmljaFRleHRGb3JDaGFydHMoJG9ialdyaXRlciwgJGNhcHRpb24sICdhJyk7CgoJCQkJCSRvYmpXcml0ZXItPmVuZEVsZW1lbnQoKTsKCQkJCSRvYmpXcml0ZXItPmVuZEVsZW1lbnQoKTsKCQkJJG9ialdyaXRlci0+ZW5kRWxlbWVudCgpOwoKCQkJJGxheW91dCA9ICR0aXRsZS0+Z2V0TGF5b3V0KCk7CgkJCSR0aGlzLT5fd3JpdGVMYXlvdXQoJGxheW91dCwgJG9ialdyaXRlcik7CgoJCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ2M6b3ZlcmxheScpOwoJCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ3ZhbCcsIDApOwoJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgoJCSRvYmpXcml0ZXItPmVuZEVsZW1lbnQoKTsKCX0KCgkvKioKCSAqIFdyaXRlIENoYXJ0IExlZ2VuZAoJICoKCSAqIEBwYXJhbQlQSFBFeGNlbF9DaGFydF9MZWdlbmQJCSRsZWdlbmQKCSAqIEBwYXJhbSAJUEhQRXhjZWxfU2hhcmVkX1hNTFdyaXRlciAJJG9ialdyaXRlciAJCVhNTCBXcml0ZXIKCSAqIEB0aHJvd3MgCUV4Y2VwdGlvbgoJICovCglwcml2YXRlIGZ1bmN0aW9uIF93cml0ZUxlZ2VuZChQSFBFeGNlbF9DaGFydF9MZWdlbmQgJGxlZ2VuZCA9IG51bGwsICRvYmpXcml0ZXIpCgl7CgkJaWYgKGlzX251bGwoJGxlZ2VuZCkpIHsKCQkJcmV0dXJuOwoJCX0KCgkJJG9ialdyaXRlci0+c3RhcnRFbGVtZW50KCdjOmxlZ2VuZCcpOwoKCQkJJG9ialdyaXRlci0+c3RhcnRFbGVtZW50KCdjOmxlZ2VuZFBvcycpOwoJCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ3ZhbCcsICRsZWdlbmQtPmdldFBvc2l0aW9uKCkpOwoJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgoJCQkkbGF5b3V0ID0gJGxlZ2VuZC0+Z2V0TGF5b3V0KCk7CgkJCSR0aGlzLT5fd3JpdGVMYXlvdXQoJGxheW91dCwgJG9ialdyaXRlcik7CgoJCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ2M6b3ZlcmxheScpOwoJCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ3ZhbCcsICgkbGVnZW5kLT5nZXRPdmVybGF5KCkpID8gJzEnIDogJzAnKTsKCQkJJG9ialdyaXRlci0+ZW5kRWxlbWVudCgpOwoKCQkJJG9ialdyaXRlci0+c3RhcnRFbGVtZW50KCdjOnR4UHInKTsKCQkJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgnYTpib2R5UHInKTsKCQkJCSRvYmpXcml0ZXItPmVuZEVsZW1lbnQoKTsKCgkJCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ2E6bHN0U3R5bGUnKTsKCQkJCSRvYmpXcml0ZXItPmVuZEVsZW1lbnQoKTsKCgkJCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ2E6cCcpOwoJCQkJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgnYTpwUHInKTsKCQkJCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ3J0bCcsIDApOwoKCQkJCQkJJG9ialdyaXRlci0+c3RhcnRFbGVtZW50KCdhOmRlZlJQcicpOwoJCQkJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgkJCQkJJG9ialdyaXRlci0+ZW5kRWxlbWVudCgpOwoKCQkJCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ2E6ZW5kUGFyYVJQcicpOwoJCQkJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgnbGFuZycsICJlbi1VUyIpOwoJCQkJCSRvYmpXcml0ZXItPmVuZEVsZW1lbnQoKTsKCgkJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgkJCSRvYmpXcml0ZXItPmVuZEVsZW1lbnQoKTsKCgkJJG9ialdyaXRlci0+ZW5kRWxlbWVudCgpOwoJfQoKCS8qKgoJICogV3JpdGUgQ2hhcnQgUGxvdCBBcmVhCgkgKgoJICogQHBhcmFtCVBIUEV4Y2VsX0NoYXJ0X1Bsb3RBcmVhCQkkcGxvdEFyZWEKCSAqIEBwYXJhbQlQSFBFeGNlbF9DaGFydF9UaXRsZQkJJHhBeGlzTGFiZWwKCSAqIEBwYXJhbQlQSFBFeGNlbF9DaGFydF9UaXRsZQkJJHlBeGlzTGFiZWwKCSAqIEBwYXJhbSAJUEhQRXhjZWxfU2hhcmVkX1hNTFdyaXRlciAJJG9ialdyaXRlciAJCVhNTCBXcml0ZXIKCSAqIEB0aHJvd3MgCUV4Y2VwdGlvbgoJICovCglwcml2YXRlIGZ1bmN0aW9uIF93cml0ZVBsb3RBcmVhKFBIUEV4Y2VsX0NoYXJ0X1Bsb3RBcmVhICRwbG90QXJlYSwKCQkJCQkJCQkJUEhQRXhjZWxfQ2hhcnRfVGl0bGUgJHhBeGlzTGFiZWwgPSBOVUxMLAoJCQkJCQkJCQlQSFBFeGNlbF9DaGFydF9UaXRsZSAkeUF4aXNMYWJlbCA9IE5VTEwsCgkJCQkJCQkJCSRvYmpXcml0ZXIpCgl7CgkJaWYgKGlzX251bGwoJHBsb3RBcmVhKSkgewoJCQlyZXR1cm47CgkJfQoKCQkkaWQxID0gJGlkMiA9IDA7CgkJJG9ialdyaXRlci0+c3RhcnRFbGVtZW50KCdjOnBsb3RBcmVhJyk7CgoJCQkkbGF5b3V0ID0gJHBsb3RBcmVhLT5nZXRMYXlvdXQoKTsKCQkJJHRoaXMtPl93cml0ZUxheW91dCgkbGF5b3V0LCAkb2JqV3JpdGVyKTsKCgkJCSRjaGFydFR5cGVzID0gc2VsZjo6X2dldENoYXJ0VHlwZSgkcGxvdEFyZWEpOwoJCQkkY2F0SXNNdWx0aUxldmVsU2VyaWVzID0gJHZhbElzTXVsdGlMZXZlbFNlcmllcyA9IEZBTFNFOwoJCQkkcGxvdEdyb3VwaW5nVHlwZSA9ICcnOwoJCQlmb3JlYWNoKCRjaGFydFR5cGVzIGFzICRjaGFydFR5cGUpIHsKCQkJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgnYzonLiRjaGFydFR5cGUpOwoKCQkJCQkkZ3JvdXBDb3VudCA9ICRwbG90QXJlYS0+Z2V0UGxvdEdyb3VwQ291bnQoKTsKCQkJCQlmb3IoJGkgPSAwOyAkaSA8ICRncm91cENvdW50OyArKyRpKSB7CgkJCQkJCSRwbG90R3JvdXAgPSAkcGxvdEFyZWEtPmdldFBsb3RHcm91cEJ5SW5kZXgoJGkpOwoJCQkJCQkkZ3JvdXBUeXBlID0gJHBsb3RHcm91cC0+Z2V0UGxvdFR5cGUoKTsKCQkJCQkJaWYgKCRncm91cFR5cGUgPT0gJGNoYXJ0VHlwZSkgewoKCQkJCQkJCSRwbG90U3R5bGUgPSAkcGxvdEdyb3VwLT5nZXRQbG90U3R5bGUoKTsKCQkJCQkJCWlmICgkZ3JvdXBUeXBlID09PSBQSFBFeGNlbF9DaGFydF9EYXRhU2VyaWVzOjpUWVBFX1JBREFSQ0hBUlQpIHsKCQkJCQkJCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ2M6cmFkYXJTdHlsZScpOwoJCQkJCQkJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgndmFsJywgJHBsb3RTdHlsZSApOwoJCQkJCQkJCSRvYmpXcml0ZXItPmVuZEVsZW1lbnQoKTsKCQkJCQkJCX0gZWxzZWlmICgkZ3JvdXBUeXBlID09PSBQSFBFeGNlbF9DaGFydF9EYXRhU2VyaWVzOjpUWVBFX1NDQVRURVJDSEFSVCkgewoJCQkJCQkJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgnYzpzY2F0dGVyU3R5bGUnKTsKCQkJCQkJCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ3ZhbCcsICRwbG90U3R5bGUgKTsKCQkJCQkJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgkJCQkJCQl9CgoJCQkJCQkJJHRoaXMtPl93cml0ZVBsb3RHcm91cCgkcGxvdEdyb3VwLCAkY2hhcnRUeXBlLCAkb2JqV3JpdGVyLCAkY2F0SXNNdWx0aUxldmVsU2VyaWVzLCAkdmFsSXNNdWx0aUxldmVsU2VyaWVzLCAkcGxvdEdyb3VwaW5nVHlwZSk7CgkJCQkJCX0KCQkJCQl9CgoJCQkJCSR0aGlzLT5fd3JpdGVEYXRhTGJscygkb2JqV3JpdGVyKTsKCgkJCQkJaWYgKCRjaGFydFR5cGUgPT09IFBIUEV4Y2VsX0NoYXJ0X0RhdGFTZXJpZXM6OlRZUEVfTElORUNIQVJUKSB7CgkJCQkJCS8vCUxpbmUgb25seSwgTGluZTNEIGNhbid0IGJlIHNtb290aGVkCgoJCQkJCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ2M6c21vb3RoJyk7CgkJCQkJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgndmFsJywgKGludGVnZXIpICRwbG90R3JvdXAtPmdldFNtb290aExpbmUoKSApOwoJCQkJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgkJCQkJfSBlbHNlaWYgKCgkY2hhcnRUeXBlID09PSBQSFBFeGNlbF9DaGFydF9EYXRhU2VyaWVzOjpUWVBFX0JBUkNIQVJUKSB8fAoJCQkJCQkoJGNoYXJ0VHlwZSA9PT0gUEhQRXhjZWxfQ2hhcnRfRGF0YVNlcmllczo6VFlQRV9CQVJDSEFSVF8zRCkpIHsKCgkJCQkJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgnYzpnYXBXaWR0aCcpOwoJCQkJCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ3ZhbCcsIDE1MCApOwoJCQkJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgoJCQkJCQlpZiAoJHBsb3RHcm91cGluZ1R5cGUgPT0gJ3BlcmNlbnRTdGFja2VkJyB8fAoJCQkJCQkJJHBsb3RHcm91cGluZ1R5cGUgPT0gJ3N0YWNrZWQnKSB7CgoJCQkJCQkJJG9ialdyaXRlci0+c3RhcnRFbGVtZW50KCdjOm92ZXJsYXAnKTsKCQkJCQkJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgndmFsJywgMTAwICk7CgkJCQkJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgkJCQkJCX0KCQkJCQl9IGVsc2VpZiAoJGNoYXJ0VHlwZSA9PT0gUEhQRXhjZWxfQ2hhcnRfRGF0YVNlcmllczo6VFlQRV9CVUJCTEVDSEFSVCkgewoKCQkJCQkJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgnYzpidWJibGVTY2FsZScpOwoJCQkJCQkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCd2YWwnLCAyNSApOwoJCQkJCQkJJG9ialdyaXRlci0+ZW5kRWxlbWVudCgpOwoKCQkJCQkJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgnYzpzaG93TmVnQnViYmxlcycpOwoJCQkJCQkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCd2YWwnLCAwICk7CgkJCQkJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgkJCQkJfSBlbHNlaWYgKCRjaGFydFR5cGUgPT09IFBIUEV4Y2VsX0NoYXJ0X0RhdGFTZXJpZXM6OlRZUEVfU1RPQ0tDSEFSVCkgewoKCQkJCQkJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgnYzpoaUxvd0xpbmVzJyk7CgkJCQkJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgkJCQkJfQoKCQkJCQkvLwlHZW5lcmF0ZSAyIHVuaXF1ZSBudW1iZXJzIHRvIHVzZSBmb3IgYXhJZCB2YWx1ZXMKLy8JCQkJCSRpZDEgPSAkaWQyID0gcmFuZCgxMDAwMDAwMCw5OTk5OTk5OSk7Ci8vCQkJCQlkbyB7Ci8vCQkJCQkJJGlkMiA9IHJhbmQoMTAwMDAwMDAsOTk5OTk5OTkpOwovLwkJCQkJfSB3aGlsZSAoJGlkMSA9PSAkaWQyKTsKCQkJCQkkaWQxID0gJzc1MDkxMzI4JzsKCQkJCQkkaWQyID0gJzc1MDg5NDA4JzsKCgkJCQkJaWYgKCgkY2hhcnRUeXBlICE9PSBQSFBFeGNlbF9DaGFydF9EYXRhU2VyaWVzOjpUWVBFX1BJRUNIQVJUKSAmJgoJCQkJCQkoJGNoYXJ0VHlwZSAhPT0gUEhQRXhjZWxfQ2hhcnRfRGF0YVNlcmllczo6VFlQRV9QSUVDSEFSVF8zRCkgJiYKCQkJCQkJKCRjaGFydFR5cGUgIT09IFBIUEV4Y2VsX0NoYXJ0X0RhdGFTZXJpZXM6OlRZUEVfRE9OVVRDSEFSVCkpIHsKCgkJCQkJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgnYzpheElkJyk7CgkJCQkJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgndmFsJywgJGlkMSApOwoJCQkJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgkJCQkJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgnYzpheElkJyk7CgkJCQkJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgndmFsJywgJGlkMiApOwoJCQkJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgkJCQkJfSBlbHNlIHsKCQkJCQkJJG9ialdyaXRlci0+c3RhcnRFbGVtZW50KCdjOmZpcnN0U2xpY2VBbmcnKTsKCQkJCQkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCd2YWwnLCAwKTsKCQkJCQkJJG9ialdyaXRlci0+ZW5kRWxlbWVudCgpOwoKCQkJCQkJaWYgKCRjaGFydFR5cGUgPT09IFBIUEV4Y2VsX0NoYXJ0X0RhdGFTZXJpZXM6OlRZUEVfRE9OVVRDSEFSVCkgewoKCQkJCQkJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgnYzpob2xlU2l6ZScpOwoJCQkJCQkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCd2YWwnLCA1MCk7CgkJCQkJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgkJCQkJCX0KCQkJCQl9CgoJCQkJJG9ialdyaXRlci0+ZW5kRWxlbWVudCgpOwoJCQl9CgoJCQlpZiAoKCRjaGFydFR5cGUgIT09IFBIUEV4Y2VsX0NoYXJ0X0RhdGFTZXJpZXM6OlRZUEVfUElFQ0hBUlQpICYmCgkJCQkoJGNoYXJ0VHlwZSAhPT0gUEhQRXhjZWxfQ2hhcnRfRGF0YVNlcmllczo6VFlQRV9QSUVDSEFSVF8zRCkgJiYKCQkJCSgkY2hhcnRUeXBlICE9PSBQSFBFeGNlbF9DaGFydF9EYXRhU2VyaWVzOjpUWVBFX0RPTlVUQ0hBUlQpKSB7CgoJCQkJaWYgKCRjaGFydFR5cGUgPT09IFBIUEV4Y2VsX0NoYXJ0X0RhdGFTZXJpZXM6OlRZUEVfQlVCQkxFQ0hBUlQpIHsKCQkJCQkkdGhpcy0+X3dyaXRlVmFsQXgoJG9ialdyaXRlciwkcGxvdEFyZWEsJHhBeGlzTGFiZWwsJGNoYXJ0VHlwZSwkaWQxLCRpZDIsJGNhdElzTXVsdGlMZXZlbFNlcmllcyk7CgkJCQl9IGVsc2UgewoJCQkJCSR0aGlzLT5fd3JpdGVDYXRBeCgkb2JqV3JpdGVyLCRwbG90QXJlYSwkeEF4aXNMYWJlbCwkY2hhcnRUeXBlLCRpZDEsJGlkMiwkY2F0SXNNdWx0aUxldmVsU2VyaWVzKTsKCQkJCX0KCgkJCQkkdGhpcy0+X3dyaXRlVmFsQXgoJG9ialdyaXRlciwkcGxvdEFyZWEsJHlBeGlzTGFiZWwsJGNoYXJ0VHlwZSwkaWQxLCRpZDIsJHZhbElzTXVsdGlMZXZlbFNlcmllcyk7CgkJCX0KCgkJJG9ialdyaXRlci0+ZW5kRWxlbWVudCgpOwoJfQoKCS8qKgoJICogV3JpdGUgRGF0YSBMYWJlbHMKCSAqCgkgKiBAcGFyYW0gCVBIUEV4Y2VsX1NoYXJlZF9YTUxXcml0ZXIgCSRvYmpXcml0ZXIgCQlYTUwgV3JpdGVyCgkgKiBAdGhyb3dzIAlFeGNlcHRpb24KCSAqLwoJcHJpdmF0ZSBmdW5jdGlvbiBfd3JpdGVEYXRhTGJscygkb2JqV3JpdGVyKQoJewoJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgnYzpkTGJscycpOwoKCQkJJG9ialdyaXRlci0+c3RhcnRFbGVtZW50KCdjOnNob3dMZWdlbmRLZXknKTsKCQkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCd2YWwnLCAwKTsKCQkJJG9ialdyaXRlci0+ZW5kRWxlbWVudCgpOwoKCQkJJG9ialdyaXRlci0+c3RhcnRFbGVtZW50KCdjOnNob3dWYWwnKTsKCQkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCd2YWwnLCAwKTsKCQkJJG9ialdyaXRlci0+ZW5kRWxlbWVudCgpOwoKCQkJJG9ialdyaXRlci0+c3RhcnRFbGVtZW50KCdjOnNob3dDYXROYW1lJyk7CgkJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgndmFsJywgMCk7CgkJCSRvYmpXcml0ZXItPmVuZEVsZW1lbnQoKTsKCgkJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgnYzpzaG93U2VyTmFtZScpOwoJCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ3ZhbCcsIDApOwoJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgoJCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ2M6c2hvd1BlcmNlbnQnKTsKCQkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCd2YWwnLCAwKTsKCQkJJG9ialdyaXRlci0+ZW5kRWxlbWVudCgpOwoKCQkJJG9ialdyaXRlci0+c3RhcnRFbGVtZW50KCdjOnNob3dCdWJibGVTaXplJyk7CgkJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgndmFsJywgMCk7CgkJCSRvYmpXcml0ZXItPmVuZEVsZW1lbnQoKTsKCgkJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgnYzpzaG93TGVhZGVyTGluZXMnKTsKCQkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCd2YWwnLCAxKTsKCQkJJG9ialdyaXRlci0+ZW5kRWxlbWVudCgpOwoKCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7Cgl9CgoJLyoqCgkgKiBXcml0ZSBDYXRlZ29yeSBBeGlzCgkgKgoJICogQHBhcmFtIAlQSFBFeGNlbF9TaGFyZWRfWE1MV3JpdGVyIAkkb2JqV3JpdGVyIAkJWE1MIFdyaXRlcgoJICogQHBhcmFtIAlQSFBFeGNlbF9DaGFydF9QbG90QXJlYQkJJHBsb3RBcmVhCgkgKiBAcGFyYW0gCVBIUEV4Y2VsX0NoYXJ0X1RpdGxlCQkkeEF4aXNMYWJlbAoJICogQHBhcmFtIAlzdHJpbmcJCQkJCQkkZ3JvdXBUeXBlCQlDaGFydCB0eXBlCgkgKiBAcGFyYW0gCXN0cmluZwkJCQkJCSRpZDEKCSAqIEBwYXJhbSAJc3RyaW5nCQkJCQkJJGlkMgoJICogQHBhcmFtIAlib29sZWFuCQkJCQkJJGlzTXVsdGlMZXZlbFNlcmllcwoJICogQHRocm93cyAJRXhjZXB0aW9uCgkgKi8KCXByaXZhdGUgZnVuY3Rpb24gX3dyaXRlQ2F0QXgoJG9ialdyaXRlciwgUEhQRXhjZWxfQ2hhcnRfUGxvdEFyZWEgJHBsb3RBcmVhLCAkeEF4aXNMYWJlbCwgJGdyb3VwVHlwZSwgJGlkMSwgJGlkMiwgJGlzTXVsdGlMZXZlbFNlcmllcykKCXsKCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ2M6Y2F0QXgnKTsKCgkJCWlmICgkaWQxID4gMCkgewoJCQkJJG9ialdyaXRlci0+c3RhcnRFbGVtZW50KCdjOmF4SWQnKTsKCQkJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgndmFsJywgJGlkMSk7CgkJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgkJCX0KCgkJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgnYzpzY2FsaW5nJyk7CgkJCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ2M6b3JpZW50YXRpb24nKTsKCQkJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgndmFsJywgIm1pbk1heCIpOwoJCQkJJG9ialdyaXRlci0+ZW5kRWxlbWVudCgpOwoJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgoJCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ2M6ZGVsZXRlJyk7CgkJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgndmFsJywgMCk7CgkJCSRvYmpXcml0ZXItPmVuZEVsZW1lbnQoKTsKCgkJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgnYzpheFBvcycpOwoJCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ3ZhbCcsICJiIik7CgkJCSRvYmpXcml0ZXItPmVuZEVsZW1lbnQoKTsKCgkJCWlmICghaXNfbnVsbCgkeEF4aXNMYWJlbCkpIHsKCQkJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgnYzp0aXRsZScpOwoJCQkJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgnYzp0eCcpOwoJCQkJCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ2M6cmljaCcpOwoKCQkJCQkJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgnYTpib2R5UHInKTsKCQkJCQkJCSRvYmpXcml0ZXItPmVuZEVsZW1lbnQoKTsKCgkJCQkJCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ2E6bHN0U3R5bGUnKTsKCQkJCQkJCSRvYmpXcml0ZXItPmVuZEVsZW1lbnQoKTsKCgkJCQkJCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ2E6cCcpOwoJCQkJCQkJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgnYTpyJyk7CgoJCQkJCQkJCQkkY2FwdGlvbiA9ICR4QXhpc0xhYmVsLT5nZXRDYXB0aW9uKCk7CgkJCQkJCQkJCWlmIChpc19hcnJheSgkY2FwdGlvbikpCgkJCQkJCQkJCQkkY2FwdGlvbiA9ICRjYXB0aW9uWzBdOwoJCQkJCQkJCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ2E6dCcpOwoJCQkJCQkJCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ3htbDpzcGFjZScsICdwcmVzZXJ2ZScpOwoJCQkJCQkJCQkJJG9ialdyaXRlci0+d3JpdGVSYXdEYXRhKFBIUEV4Y2VsX1NoYXJlZF9TdHJpbmc6OkNvbnRyb2xDaGFyYWN0ZXJQSFAyT09YTUwoICRjYXB0aW9uICkpOwoJCQkJCQkJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgoJCQkJCQkJCSRvYmpXcml0ZXItPmVuZEVsZW1lbnQoKTsKCQkJCQkJCSRvYmpXcml0ZXItPmVuZEVsZW1lbnQoKTsKCQkJCQkJJG9ialdyaXRlci0+ZW5kRWxlbWVudCgpOwoJCQkJCSRvYmpXcml0ZXItPmVuZEVsZW1lbnQoKTsKCgkJCQkJJG9ialdyaXRlci0+c3RhcnRFbGVtZW50KCdjOm92ZXJsYXknKTsKCQkJCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ3ZhbCcsIDApOwoJCQkJCSRvYmpXcml0ZXItPmVuZEVsZW1lbnQoKTsKCgkJCQkJJGxheW91dCA9ICR4QXhpc0xhYmVsLT5nZXRMYXlvdXQoKTsKCQkJCQkkdGhpcy0+X3dyaXRlTGF5b3V0KCRsYXlvdXQsICRvYmpXcml0ZXIpOwoKCQkJCSRvYmpXcml0ZXItPmVuZEVsZW1lbnQoKTsKCgkJCX0KCgkJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgnYzpudW1GbXQnKTsKCQkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCdmb3JtYXRDb2RlJywgIkdlbmVyYWwiKTsKCQkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCdzb3VyY2VMaW5rZWQnLCAxKTsKCQkJJG9ialdyaXRlci0+ZW5kRWxlbWVudCgpOwoKCQkJJG9ialdyaXRlci0+c3RhcnRFbGVtZW50KCdjOm1ham9yVGlja01hcmsnKTsKCQkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCd2YWwnLCAib3V0Iik7CgkJCSRvYmpXcml0ZXItPmVuZEVsZW1lbnQoKTsKCgkJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgnYzptaW5vclRpY2tNYXJrJyk7CgkJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgndmFsJywgIm5vbmUiKTsKCQkJJG9ialdyaXRlci0+ZW5kRWxlbWVudCgpOwoKCQkJJG9ialdyaXRlci0+c3RhcnRFbGVtZW50KCdjOnRpY2tMYmxQb3MnKTsKCQkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCd2YWwnLCAibmV4dFRvIik7CgkJCSRvYmpXcml0ZXItPmVuZEVsZW1lbnQoKTsKCgkJCWlmICgkaWQyID4gMCkgewoJCQkJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgnYzpjcm9zc0F4Jyk7CgkJCQkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCd2YWwnLCAkaWQyKTsKCQkJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgoJCQkJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgnYzpjcm9zc2VzJyk7CgkJCQkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCd2YWwnLCAiYXV0b1plcm8iKTsKCQkJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgkJCX0KCgkJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgnYzphdXRvJyk7CgkJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgndmFsJywgMSk7CgkJCSRvYmpXcml0ZXItPmVuZEVsZW1lbnQoKTsKCgkJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgnYzpsYmxBbGduJyk7CgkJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgndmFsJywgImN0ciIpOwoJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgoJCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ2M6bGJsT2Zmc2V0Jyk7CgkJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgndmFsJywgMTAwKTsKCQkJJG9ialdyaXRlci0+ZW5kRWxlbWVudCgpOwoKCQkJaWYgKCRpc011bHRpTGV2ZWxTZXJpZXMpIHsKCQkJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgnYzpub011bHRpTHZsTGJsJyk7CgkJCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ3ZhbCcsIDApOwoJCQkJJG9ialdyaXRlci0+ZW5kRWxlbWVudCgpOwoJCQl9CgkJJG9ialdyaXRlci0+ZW5kRWxlbWVudCgpOwoKCX0KCgoJLyoqCgkgKiBXcml0ZSBWYWx1ZSBBeGlzCgkgKgoJICogQHBhcmFtIAlQSFBFeGNlbF9TaGFyZWRfWE1MV3JpdGVyIAkkb2JqV3JpdGVyIAkJWE1MIFdyaXRlcgoJICogQHBhcmFtIAlQSFBFeGNlbF9DaGFydF9QbG90QXJlYQkJJHBsb3RBcmVhCgkgKiBAcGFyYW0gCVBIUEV4Y2VsX0NoYXJ0X1RpdGxlCQkkeUF4aXNMYWJlbAoJICogQHBhcmFtIAlzdHJpbmcJCQkJCQkkZ3JvdXBUeXBlCQlDaGFydCB0eXBlCgkgKiBAcGFyYW0gCXN0cmluZwkJCQkJCSRpZDEKCSAqIEBwYXJhbSAJc3RyaW5nCQkJCQkJJGlkMgoJICogQHBhcmFtIAlib29sZWFuCQkJCQkJJGlzTXVsdGlMZXZlbFNlcmllcwoJICogQHRocm93cyAJRXhjZXB0aW9uCgkgKi8KCXByaXZhdGUgZnVuY3Rpb24gX3dyaXRlVmFsQXgoJG9ialdyaXRlciwgUEhQRXhjZWxfQ2hhcnRfUGxvdEFyZWEgJHBsb3RBcmVhLCAkeUF4aXNMYWJlbCwgJGdyb3VwVHlwZSwgJGlkMSwgJGlkMiwgJGlzTXVsdGlMZXZlbFNlcmllcykKCXsKCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ2M6dmFsQXgnKTsKCgkJCWlmICgkaWQyID4gMCkgewoJCQkJJG9ialdyaXRlci0+c3RhcnRFbGVtZW50KCdjOmF4SWQnKTsKCQkJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgndmFsJywgJGlkMik7CgkJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgkJCX0KCgkJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgnYzpzY2FsaW5nJyk7CgkJCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ2M6b3JpZW50YXRpb24nKTsKCQkJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgndmFsJywgIm1pbk1heCIpOwoJCQkJJG9ialdyaXRlci0+ZW5kRWxlbWVudCgpOwoJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgoJCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ2M6ZGVsZXRlJyk7CgkJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgndmFsJywgMCk7CgkJCSRvYmpXcml0ZXItPmVuZEVsZW1lbnQoKTsKCgkJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgnYzpheFBvcycpOwoJCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ3ZhbCcsICJsIik7CgkJCSRvYmpXcml0ZXItPmVuZEVsZW1lbnQoKTsKCgkJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgnYzptYWpvckdyaWRsaW5lcycpOwoJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgoJCQlpZiAoIWlzX251bGwoJHlBeGlzTGFiZWwpKSB7CgkJCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ2M6dGl0bGUnKTsKCQkJCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ2M6dHgnKTsKCQkJCQkJJG9ialdyaXRlci0+c3RhcnRFbGVtZW50KCdjOnJpY2gnKTsKCgkJCQkJCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ2E6Ym9keVByJyk7CgkJCQkJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgoJCQkJCQkJJG9ialdyaXRlci0+c3RhcnRFbGVtZW50KCdhOmxzdFN0eWxlJyk7CgkJCQkJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgoJCQkJCQkJJG9ialdyaXRlci0+c3RhcnRFbGVtZW50KCdhOnAnKTsKCQkJCQkJCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ2E6cicpOwoKCQkJCQkJCQkJJGNhcHRpb24gPSAkeUF4aXNMYWJlbC0+Z2V0Q2FwdGlvbigpOwoJCQkJCQkJCQlpZiAoaXNfYXJyYXkoJGNhcHRpb24pKQoJCQkJCQkJCQkJJGNhcHRpb24gPSAkY2FwdGlvblswXTsKCQkJCQkJCQkJJG9ialdyaXRlci0+c3RhcnRFbGVtZW50KCdhOnQnKTsKCQkJCQkJCQkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCd4bWw6c3BhY2UnLCAncHJlc2VydmUnKTsKCQkJCQkJCQkJCSRvYmpXcml0ZXItPndyaXRlUmF3RGF0YShQSFBFeGNlbF9TaGFyZWRfU3RyaW5nOjpDb250cm9sQ2hhcmFjdGVyUEhQMk9PWE1MKCAkY2FwdGlvbiApKTsKCQkJCQkJCQkJJG9ialdyaXRlci0+ZW5kRWxlbWVudCgpOwoKCQkJCQkJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgkJCQkJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgkJCQkJCSRvYmpXcml0ZXItPmVuZEVsZW1lbnQoKTsKCQkJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgoJCQkJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgnYzpvdmVybGF5Jyk7CgkJCQkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCd2YWwnLCAwKTsKCQkJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgoJCQkJCWlmICgkZ3JvdXBUeXBlICE9PSBQSFBFeGNlbF9DaGFydF9EYXRhU2VyaWVzOjpUWVBFX0JVQkJMRUNIQVJUKSB7CgkJCQkJCSRsYXlvdXQgPSAkeUF4aXNMYWJlbC0+Z2V0TGF5b3V0KCk7CgkJCQkJCSR0aGlzLT5fd3JpdGVMYXlvdXQoJGxheW91dCwgJG9ialdyaXRlcik7CgkJCQkJfQoKCQkJCSRvYmpXcml0ZXItPmVuZEVsZW1lbnQoKTsKCQkJfQoKCQkJJG9ialdyaXRlci0+c3RhcnRFbGVtZW50KCdjOm51bUZtdCcpOwoJCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ2Zvcm1hdENvZGUnLCAiR2VuZXJhbCIpOwoJCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ3NvdXJjZUxpbmtlZCcsIDEpOwoJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgoJCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ2M6bWFqb3JUaWNrTWFyaycpOwoJCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ3ZhbCcsICJvdXQiKTsKCQkJJG9ialdyaXRlci0+ZW5kRWxlbWVudCgpOwoKCQkJJG9ialdyaXRlci0+c3RhcnRFbGVtZW50KCdjOm1pbm9yVGlja01hcmsnKTsKCQkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCd2YWwnLCAibm9uZSIpOwoJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgoJCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ2M6dGlja0xibFBvcycpOwoJCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ3ZhbCcsICJuZXh0VG8iKTsKCQkJJG9ialdyaXRlci0+ZW5kRWxlbWVudCgpOwoKCQkJaWYgKCRpZDEgPiAwKSB7CgkJCQkJJG9ialdyaXRlci0+c3RhcnRFbGVtZW50KCdjOmNyb3NzQXgnKTsKCQkJCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ3ZhbCcsICRpZDIpOwoJCQkJCSRvYmpXcml0ZXItPmVuZEVsZW1lbnQoKTsKCgkJCQkJJG9ialdyaXRlci0+c3RhcnRFbGVtZW50KCdjOmNyb3NzZXMnKTsKCQkJCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ3ZhbCcsICJhdXRvWmVybyIpOwoJCQkJCSRvYmpXcml0ZXItPmVuZEVsZW1lbnQoKTsKCgkJCQkJJG9ialdyaXRlci0+c3RhcnRFbGVtZW50KCdjOmNyb3NzQmV0d2VlbicpOwoJCQkJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgndmFsJywgIm1pZENhdCIpOwoJCQkJCSRvYmpXcml0ZXItPmVuZEVsZW1lbnQoKTsKCQkJfQoKCQkJaWYgKCRpc011bHRpTGV2ZWxTZXJpZXMpIHsKCQkJCWlmICgkZ3JvdXBUeXBlICE9PSBQSFBFeGNlbF9DaGFydF9EYXRhU2VyaWVzOjpUWVBFX0JVQkJMRUNIQVJUKSB7CgkJCQkJJG9ialdyaXRlci0+c3RhcnRFbGVtZW50KCdjOm5vTXVsdGlMdmxMYmwnKTsKCQkJCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ3ZhbCcsIDApOwoJCQkJCSRvYmpXcml0ZXItPmVuZEVsZW1lbnQoKTsKCQkJCX0KCQkJfQoJCSRvYmpXcml0ZXItPmVuZEVsZW1lbnQoKTsKCgl9CgoKCS8qKgoJICogR2V0IHRoZSBkYXRhIHNlcmllcyB0eXBlKHMpIGZvciBhIGNoYXJ0IHBsb3Qgc2VyaWVzCgkgKgoJICogQHBhcmFtIAlQSFBFeGNlbF9DaGFydF9QbG90QXJlYQkJJHBsb3RBcmVhCgkgKiBAcmV0dXJuCXN0cmluZ3xhcnJheQoJICogQHRocm93cyAJRXhjZXB0aW9uCgkgKi8KCXByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIF9nZXRDaGFydFR5cGUoJHBsb3RBcmVhKQoJewoJCSRncm91cENvdW50ID0gJHBsb3RBcmVhLT5nZXRQbG90R3JvdXBDb3VudCgpOwoKCQlpZiAoJGdyb3VwQ291bnQgPT0gMSkgewoJCQkkY2hhcnRUeXBlID0gYXJyYXkoJHBsb3RBcmVhLT5nZXRQbG90R3JvdXBCeUluZGV4KDApLT5nZXRQbG90VHlwZSgpKTsKCQl9IGVsc2UgewoJCQkkY2hhcnRUeXBlcyA9IGFycmF5KCk7CgkJCWZvcigkaSA9IDA7ICRpIDwgJGdyb3VwQ291bnQ7ICsrJGkpIHsKCQkJCSRjaGFydFR5cGVzW10gPSAkcGxvdEFyZWEtPmdldFBsb3RHcm91cEJ5SW5kZXgoJGkpLT5nZXRQbG90VHlwZSgpOwoJCQl9CgkJCSRjaGFydFR5cGUgPSBhcnJheV91bmlxdWUoJGNoYXJ0VHlwZXMpOwoJCQlpZiAoY291bnQoJGNoYXJ0VHlwZXMpID09IDApIHsKCQkJCXRocm93IG5ldyBFeGNlcHRpb24oJ0NoYXJ0IGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQnKTsKCQkJfQoJCX0KCgkJcmV0dXJuICRjaGFydFR5cGU7Cgl9CgoJLyoqCgkgKiBXcml0ZSBQbG90IEdyb3VwIChzZXJpZXMgb2YgcmVsYXRlZCBwbG90cykKCSAqCgkgKiBAcGFyYW0JUEhQRXhjZWxfQ2hhcnRfRGF0YVNlcmllcwkJJHBsb3RHcm91cAoJICogQHBhcmFtCXN0cmluZwkJCQkJCQkkZ3JvdXBUeXBlCQkJCVR5cGUgb2YgcGxvdCBmb3IgZGF0YXNlcmllcwoJICogQHBhcmFtIAlQSFBFeGNlbF9TaGFyZWRfWE1MV3JpdGVyIAkJJG9ialdyaXRlciAJCQkJWE1MIFdyaXRlcgoJICogQHBhcmFtCWJvb2xlYW4JCQkJCQkJJiRjYXRJc011bHRpTGV2ZWxTZXJpZXMJSXMgY2F0ZWdvcnkgYSBtdWx0aS1zZXJpZXMgY2F0ZWdvcnkKCSAqIEBwYXJhbQlib29sZWFuCQkJCQkJCSYkdmFsSXNNdWx0aUxldmVsU2VyaWVzCUlzIHZhbHVlIHNldCBhIG11bHRpLXNlcmllcyBzZXQKCSAqIEBwYXJhbQlzdHJpbmcJCQkJCQkJJiRwbG90R3JvdXBpbmdUeXBlCQlUeXBlIG9mIGdyb3VwaW5nIGZvciBtdWx0aS1zZXJpZXMgdmFsdWVzCgkgKiBAdGhyb3dzIAlFeGNlcHRpb24KCSAqLwoJcHJpdmF0ZSBmdW5jdGlvbiBfd3JpdGVQbG90R3JvdXAoJHBsb3RHcm91cCwgJGdyb3VwVHlwZSwgJG9ialdyaXRlciwgJiRjYXRJc011bHRpTGV2ZWxTZXJpZXMsICYkdmFsSXNNdWx0aUxldmVsU2VyaWVzLCAmJHBsb3RHcm91cGluZ1R5cGUpCgl7CgkJaWYgKGlzX251bGwoJHBsb3RHcm91cCkpIHsKCQkJcmV0dXJuOwoJCX0KCgkJaWYgKCgkZ3JvdXBUeXBlID09IFBIUEV4Y2VsX0NoYXJ0X0RhdGFTZXJpZXM6OlRZUEVfQkFSQ0hBUlQpIHx8CgkJCSgkZ3JvdXBUeXBlID09IFBIUEV4Y2VsX0NoYXJ0X0RhdGFTZXJpZXM6OlRZUEVfQkFSQ0hBUlRfM0QpKSB7CgkJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgnYzpiYXJEaXInKTsKCQkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCd2YWwnLCAkcGxvdEdyb3VwLT5nZXRQbG90RGlyZWN0aW9uKCkpOwoJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgkJfQoKCQlpZiAoIWlzX251bGwoJHBsb3RHcm91cC0+Z2V0UGxvdEdyb3VwaW5nKCkpKSB7CgkJCSRwbG90R3JvdXBpbmdUeXBlID0gJHBsb3RHcm91cC0+Z2V0UGxvdEdyb3VwaW5nKCk7CgkJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgnYzpncm91cGluZycpOwoJCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ3ZhbCcsICRwbG90R3JvdXBpbmdUeXBlKTsKCQkJJG9ialdyaXRlci0+ZW5kRWxlbWVudCgpOwoJCX0KCgkJLy8JR2V0IHRoZXNlIGRldGFpbHMgYmVmb3JlIHRoZSBsb29wLCBiZWNhdXNlIHdlIGNhbiB1c2UgdGhlIGNvdW50IHRvIGNoZWNrIGZvciB2YXJ5Q29sb3JzCgkJJHBsb3RTZXJpZXNPcmRlciA9ICRwbG90R3JvdXAtPmdldFBsb3RPcmRlcigpOwoJCSRwbG90U2VyaWVzQ291bnQgPSBjb3VudCgkcGxvdFNlcmllc09yZGVyKTsKCgkJaWYgKCgkZ3JvdXBUeXBlICE9PSBQSFBFeGNlbF9DaGFydF9EYXRhU2VyaWVzOjpUWVBFX1JBREFSQ0hBUlQpICYmCgkJCSgkZ3JvdXBUeXBlICE9PSBQSFBFeGNlbF9DaGFydF9EYXRhU2VyaWVzOjpUWVBFX1NUT0NLQ0hBUlQpKSB7CgoJCQlpZiAoJGdyb3VwVHlwZSAhPT0gUEhQRXhjZWxfQ2hhcnRfRGF0YVNlcmllczo6VFlQRV9MSU5FQ0hBUlQpIHsKCQkJCWlmICgoJGdyb3VwVHlwZSA9PSBQSFBFeGNlbF9DaGFydF9EYXRhU2VyaWVzOjpUWVBFX1BJRUNIQVJUKSB8fAoJCQkJCSgkZ3JvdXBUeXBlID09IFBIUEV4Y2VsX0NoYXJ0X0RhdGFTZXJpZXM6OlRZUEVfUElFQ0hBUlRfM0QpIHx8CgkJCQkJKCRncm91cFR5cGUgPT0gUEhQRXhjZWxfQ2hhcnRfRGF0YVNlcmllczo6VFlQRV9ET05VVENIQVJUKSB8fAoJCQkJCSgkcGxvdFNlcmllc0NvdW50ID4gMSkpIHsKCQkJCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ2M6dmFyeUNvbG9ycycpOwoJCQkJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgndmFsJywgMSk7CgkJCQkJJG9ialdyaXRlci0+ZW5kRWxlbWVudCgpOwoJCQkJfSBlbHNlIHsKCQkJCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ2M6dmFyeUNvbG9ycycpOwoJCQkJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgndmFsJywgMCk7CgkJCQkJJG9ialdyaXRlci0+ZW5kRWxlbWVudCgpOwoJCQkJfQoJCQl9CgkJfQoKCQlmb3JlYWNoKCRwbG90U2VyaWVzT3JkZXIgYXMgJHBsb3RTZXJpZXNJZHggPT4gJHBsb3RTZXJpZXNSZWYpIHsKCQkJJG9ialdyaXRlci0+c3RhcnRFbGVtZW50KCdjOnNlcicpOwoKCQkJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgnYzppZHgnKTsKCQkJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgndmFsJywgJHBsb3RTZXJpZXNJZHgpOwoJCQkJJG9ialdyaXRlci0+ZW5kRWxlbWVudCgpOwoKCQkJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgnYzpvcmRlcicpOwoJCQkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCd2YWwnLCAkcGxvdFNlcmllc1JlZik7CgkJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgoJCQkJaWYgKCgkZ3JvdXBUeXBlID09IFBIUEV4Y2VsX0NoYXJ0X0RhdGFTZXJpZXM6OlRZUEVfUElFQ0hBUlQpIHx8CgkJCQkJKCRncm91cFR5cGUgPT0gUEhQRXhjZWxfQ2hhcnRfRGF0YVNlcmllczo6VFlQRV9QSUVDSEFSVF8zRCkgfHwKCQkJCQkoJGdyb3VwVHlwZSA9PSBQSFBFeGNlbF9DaGFydF9EYXRhU2VyaWVzOjpUWVBFX0RPTlVUQ0hBUlQpKSB7CgoJCQkJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgnYzpkUHQnKTsKCQkJCQkJJG9ialdyaXRlci0+c3RhcnRFbGVtZW50KCdjOmlkeCcpOwoJCQkJCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ3ZhbCcsIDMpOwoJCQkJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgoJCQkJCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ2M6YnViYmxlM0QnKTsKCQkJCQkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCd2YWwnLCAwKTsKCQkJCQkJJG9ialdyaXRlci0+ZW5kRWxlbWVudCgpOwoKCQkJCQkJJG9ialdyaXRlci0+c3RhcnRFbGVtZW50KCdjOnNwUHInKTsKCQkJCQkJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgnYTpzb2xpZEZpbGwnKTsKCQkJCQkJCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ2E6c3JnYkNscicpOwoJCQkJCQkJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgndmFsJywgJ0ZGOTkwMCcpOwoJCQkJCQkJCSRvYmpXcml0ZXItPmVuZEVsZW1lbnQoKTsKCQkJCQkJCSRvYmpXcml0ZXItPmVuZEVsZW1lbnQoKTsKCQkJCQkJJG9ialdyaXRlci0+ZW5kRWxlbWVudCgpOwoJCQkJCSRvYmpXcml0ZXItPmVuZEVsZW1lbnQoKTsKCQkJCX0KCgkJCQkvLwlMYWJlbHMKCQkJCSRwbG90U2VyaWVzTGFiZWwgPSAkcGxvdEdyb3VwLT5nZXRQbG90TGFiZWxCeUluZGV4KCRwbG90U2VyaWVzUmVmKTsKCQkJCWlmICgkcGxvdFNlcmllc0xhYmVsICYmICgkcGxvdFNlcmllc0xhYmVsLT5nZXRQb2ludENvdW50KCkgPiAwKSkgewoJCQkJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgnYzp0eCcpOwoJCQkJCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ2M6c3RyUmVmJyk7CgkJCQkJCQkkdGhpcy0+X3dyaXRlUGxvdFNlcmllc0xhYmVsKCRwbG90U2VyaWVzTGFiZWwsICRvYmpXcml0ZXIpOwoJCQkJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgkJCQkJJG9ialdyaXRlci0+ZW5kRWxlbWVudCgpOwoJCQkJfQoKCQkJCS8vCUZvcm1hdHRpbmcgZm9yIHRoZSBwb2ludHMKCQkJCWlmICgkZ3JvdXBUeXBlID09IFBIUEV4Y2VsX0NoYXJ0X0RhdGFTZXJpZXM6OlRZUEVfTElORUNIQVJUKSB7CgkJCQkJJG9ialdyaXRlci0+c3RhcnRFbGVtZW50KCdjOnNwUHInKTsKCQkJCQkJJG9ialdyaXRlci0+c3RhcnRFbGVtZW50KCdhOmxuJyk7CgkJCQkJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgndycsIDEyNzAwKTsKCQkJCQkJJG9ialdyaXRlci0+ZW5kRWxlbWVudCgpOwoJCQkJCSRvYmpXcml0ZXItPmVuZEVsZW1lbnQoKTsKCQkJCX0KCgkJCQkkcGxvdFNlcmllc1ZhbHVlcyA9ICRwbG90R3JvdXAtPmdldFBsb3RWYWx1ZXNCeUluZGV4KCRwbG90U2VyaWVzUmVmKTsKCQkJCWlmICgkcGxvdFNlcmllc1ZhbHVlcykgewoJCQkJCSRwbG90U2VyaWVzTWFya2VyID0gJHBsb3RTZXJpZXNWYWx1ZXMtPmdldFBvaW50TWFya2VyKCk7CgkJCQkJaWYgKCRwbG90U2VyaWVzTWFya2VyKSB7CgkJCQkJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgnYzptYXJrZXInKTsKCQkJCQkJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgnYzpzeW1ib2wnKTsKCQkJCQkJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgndmFsJywgJHBsb3RTZXJpZXNNYXJrZXIpOwoJCQkJCQkJJG9ialdyaXRlci0+ZW5kRWxlbWVudCgpOwoKCQkJCQkJCWlmICgkcGxvdFNlcmllc01hcmtlciAhPT0gJ25vbmUnKSB7CgkJCQkJCQkJJG9ialdyaXRlci0+c3RhcnRFbGVtZW50KCdjOnNpemUnKTsKCQkJCQkJCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ3ZhbCcsIDMpOwoJCQkJCQkJCSRvYmpXcml0ZXItPmVuZEVsZW1lbnQoKTsKCQkJCQkJCX0KCQkJCQkJJG9ialdyaXRlci0+ZW5kRWxlbWVudCgpOwoJCQkJCX0KCQkJCX0KCgkJCQlpZiAoKCRncm91cFR5cGUgPT09IFBIUEV4Y2VsX0NoYXJ0X0RhdGFTZXJpZXM6OlRZUEVfQkFSQ0hBUlQpIHx8CgkJCQkJKCRncm91cFR5cGUgPT09IFBIUEV4Y2VsX0NoYXJ0X0RhdGFTZXJpZXM6OlRZUEVfQkFSQ0hBUlRfM0QpIHx8CgkJCQkJKCRncm91cFR5cGUgPT09IFBIUEV4Y2VsX0NoYXJ0X0RhdGFTZXJpZXM6OlRZUEVfQlVCQkxFQ0hBUlQpKSB7CgoJCQkJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgnYzppbnZlcnRJZk5lZ2F0aXZlJyk7CgkJCQkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCd2YWwnLCAwKTsKCQkJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgkJCQl9CgoJCQkJLy8JQ2F0ZWdvcnkgTGFiZWxzCgkJCQkkcGxvdFNlcmllc0NhdGVnb3J5ID0gJHBsb3RHcm91cC0+Z2V0UGxvdENhdGVnb3J5QnlJbmRleCgkcGxvdFNlcmllc1JlZik7CgkJCQlpZiAoJHBsb3RTZXJpZXNDYXRlZ29yeSAmJiAoJHBsb3RTZXJpZXNDYXRlZ29yeS0+Z2V0UG9pbnRDb3VudCgpID4gMCkpIHsKCQkJCQkkY2F0SXNNdWx0aUxldmVsU2VyaWVzID0gJGNhdElzTXVsdGlMZXZlbFNlcmllcyB8fCAkcGxvdFNlcmllc0NhdGVnb3J5LT5pc011bHRpTGV2ZWxTZXJpZXMoKTsKCgkJCQkJaWYgKCgkZ3JvdXBUeXBlID09IFBIUEV4Y2VsX0NoYXJ0X0RhdGFTZXJpZXM6OlRZUEVfUElFQ0hBUlQpIHx8CgkJCQkJCSgkZ3JvdXBUeXBlID09IFBIUEV4Y2VsX0NoYXJ0X0RhdGFTZXJpZXM6OlRZUEVfUElFQ0hBUlRfM0QpIHx8CgkJCQkJCSgkZ3JvdXBUeXBlID09IFBIUEV4Y2VsX0NoYXJ0X0RhdGFTZXJpZXM6OlRZUEVfRE9OVVRDSEFSVCkpIHsKCgkJCQkJCWlmICghaXNfbnVsbCgkcGxvdEdyb3VwLT5nZXRQbG90U3R5bGUoKSkpIHsKCQkJCQkJCSRwbG90U3R5bGUgPSAkcGxvdEdyb3VwLT5nZXRQbG90U3R5bGUoKTsKCQkJCQkJCWlmICgkcGxvdFN0eWxlKSB7CgkJCQkJCQkJJG9ialdyaXRlci0+c3RhcnRFbGVtZW50KCdjOmV4cGxvc2lvbicpOwoJCQkJCQkJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgndmFsJywgMjUpOwoJCQkJCQkJCSRvYmpXcml0ZXItPmVuZEVsZW1lbnQoKTsKCQkJCQkJCX0KCQkJCQkJfQoJCQkJCX0KCgkJCQkJaWYgKCgkZ3JvdXBUeXBlID09PSBQSFBFeGNlbF9DaGFydF9EYXRhU2VyaWVzOjpUWVBFX0JVQkJMRUNIQVJUKSB8fAoJCQkJCQkoJGdyb3VwVHlwZSA9PT0gUEhQRXhjZWxfQ2hhcnRfRGF0YVNlcmllczo6VFlQRV9TQ0FUVEVSQ0hBUlQpKSB7CgkJCQkJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgnYzp4VmFsJyk7CgkJCQkJfSBlbHNlIHsKCQkJCQkJJG9ialdyaXRlci0+c3RhcnRFbGVtZW50KCdjOmNhdCcpOwoJCQkJCX0KCgkJCQkJCSR0aGlzLT5fd3JpdGVQbG90U2VyaWVzVmFsdWVzKCRwbG90U2VyaWVzQ2F0ZWdvcnksICRvYmpXcml0ZXIsICRncm91cFR5cGUsICdzdHInKTsKCQkJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgkJCQl9CgoJCQkJLy8JVmFsdWVzCgkJCQlpZiAoJHBsb3RTZXJpZXNWYWx1ZXMpIHsKCQkJCQkkdmFsSXNNdWx0aUxldmVsU2VyaWVzID0gJHZhbElzTXVsdGlMZXZlbFNlcmllcyB8fCAkcGxvdFNlcmllc1ZhbHVlcy0+aXNNdWx0aUxldmVsU2VyaWVzKCk7CgoJCQkJCWlmICgoJGdyb3VwVHlwZSA9PT0gUEhQRXhjZWxfQ2hhcnRfRGF0YVNlcmllczo6VFlQRV9CVUJCTEVDSEFSVCkgfHwKCQkJCQkJKCRncm91cFR5cGUgPT09IFBIUEV4Y2VsX0NoYXJ0X0RhdGFTZXJpZXM6OlRZUEVfU0NBVFRFUkNIQVJUKSkgewoJCQkJCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ2M6eVZhbCcpOwoJCQkJCX0gZWxzZSB7CgkJCQkJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgnYzp2YWwnKTsKCQkJCQl9CgoJCQkJCQkkdGhpcy0+X3dyaXRlUGxvdFNlcmllc1ZhbHVlcygkcGxvdFNlcmllc1ZhbHVlcywgJG9ialdyaXRlciwgJGdyb3VwVHlwZSwgJ251bScpOwoJCQkJCSRvYmpXcml0ZXItPmVuZEVsZW1lbnQoKTsKCQkJCX0KCgkJCQlpZiAoJGdyb3VwVHlwZSA9PT0gUEhQRXhjZWxfQ2hhcnRfRGF0YVNlcmllczo6VFlQRV9CVUJCTEVDSEFSVCkgewoJCQkJCSR0aGlzLT5fd3JpdGVCdWJibGVzKCRwbG90U2VyaWVzVmFsdWVzLCAkb2JqV3JpdGVyKTsKCQkJCX0KCgkJCSRvYmpXcml0ZXItPmVuZEVsZW1lbnQoKTsKCgkJfQoJfQoKCS8qKgoJICogV3JpdGUgUGxvdCBTZXJpZXMgTGFiZWwKCSAqCgkgKiBAcGFyYW0JUEhQRXhjZWxfQ2hhcnRfRGF0YVNlcmllc1ZhbHVlcwkJJHBsb3RTZXJpZXNMYWJlbAoJICogQHBhcmFtIAlQSFBFeGNlbF9TaGFyZWRfWE1MV3JpdGVyIAkJCSRvYmpXcml0ZXIgCQkJWE1MIFdyaXRlcgoJICogQHRocm93cyAJRXhjZXB0aW9uCgkgKi8KCXByaXZhdGUgZnVuY3Rpb24gX3dyaXRlUGxvdFNlcmllc0xhYmVsKCRwbG90U2VyaWVzTGFiZWwsICRvYmpXcml0ZXIpCgl7CgkJaWYgKGlzX251bGwoJHBsb3RTZXJpZXNMYWJlbCkpIHsKCQkJcmV0dXJuOwoJCX0KCgkJJG9ialdyaXRlci0+c3RhcnRFbGVtZW50KCdjOmYnKTsKCQkJJG9ialdyaXRlci0+d3JpdGVSYXdEYXRhKCRwbG90U2VyaWVzTGFiZWwtPmdldERhdGFTb3VyY2UoKSk7CgkJJG9ialdyaXRlci0+ZW5kRWxlbWVudCgpOwoKCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ2M6c3RyQ2FjaGUnKTsKCQkJJG9ialdyaXRlci0+c3RhcnRFbGVtZW50KCdjOnB0Q291bnQnKTsKCQkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCd2YWwnLCAkcGxvdFNlcmllc0xhYmVsLT5nZXRQb2ludENvdW50KCkgKTsKCQkJJG9ialdyaXRlci0+ZW5kRWxlbWVudCgpOwoKCQkJZm9yZWFjaCgkcGxvdFNlcmllc0xhYmVsLT5nZXREYXRhVmFsdWVzKCkgYXMgJHBsb3RMYWJlbEtleSA9PiAkcGxvdExhYmVsVmFsdWUpIHsKCQkJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgnYzpwdCcpOwoJCQkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCdpZHgnLCAkcGxvdExhYmVsS2V5ICk7CgoJCQkJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgnYzp2Jyk7CgkJCQkJCSRvYmpXcml0ZXItPndyaXRlUmF3RGF0YSggJHBsb3RMYWJlbFZhbHVlICk7CgkJCQkJJG9ialdyaXRlci0+ZW5kRWxlbWVudCgpOwoJCQkJJG9ialdyaXRlci0+ZW5kRWxlbWVudCgpOwoJCQl9CgkJJG9ialdyaXRlci0+ZW5kRWxlbWVudCgpOwoKCX0KCgkvKioKCSAqIFdyaXRlIFBsb3QgU2VyaWVzIFZhbHVlcwoJICoKCSAqIEBwYXJhbQlQSFBFeGNlbF9DaGFydF9EYXRhU2VyaWVzVmFsdWVzCQkkcGxvdFNlcmllc1ZhbHVlcwoJICogQHBhcmFtIAlQSFBFeGNlbF9TaGFyZWRfWE1MV3JpdGVyIAkJCSRvYmpXcml0ZXIgCQkJWE1MIFdyaXRlcgoJICogQHBhcmFtCXN0cmluZwkJCQkJCQkJJGdyb3VwVHlwZQkJCVR5cGUgb2YgcGxvdCBmb3IgZGF0YXNlcmllcwoJICogQHBhcmFtCXN0cmluZwkJCQkJCQkJJGRhdGFUeXBlCQkJRGF0YXR5cGUgb2Ygc2VyaWVzIHZhbHVlcwoJICogQHRocm93cyAJRXhjZXB0aW9uCgkgKi8KCXByaXZhdGUgZnVuY3Rpb24gX3dyaXRlUGxvdFNlcmllc1ZhbHVlcygkcGxvdFNlcmllc1ZhbHVlcywgJG9ialdyaXRlciwgJGdyb3VwVHlwZSwgJGRhdGFUeXBlPSdzdHInKQoJewoJCWlmIChpc19udWxsKCRwbG90U2VyaWVzVmFsdWVzKSkgewoJCQlyZXR1cm47CgkJfQoKCQlpZiAoJHBsb3RTZXJpZXNWYWx1ZXMtPmlzTXVsdGlMZXZlbFNlcmllcygpKSB7CgkJCSRsZXZlbENvdW50ID0gJHBsb3RTZXJpZXNWYWx1ZXMtPm11bHRpTGV2ZWxDb3VudCgpOwoKCQkJJG9ialdyaXRlci0+c3RhcnRFbGVtZW50KCdjOm11bHRpTHZsU3RyUmVmJyk7CgoJCQkJJG9ialdyaXRlci0+c3RhcnRFbGVtZW50KCdjOmYnKTsKCQkJCQkkb2JqV3JpdGVyLT53cml0ZVJhd0RhdGEoICRwbG90U2VyaWVzVmFsdWVzLT5nZXREYXRhU291cmNlKCkgKTsKCQkJCSRvYmpXcml0ZXItPmVuZEVsZW1lbnQoKTsKCgkJCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ2M6bXVsdGlMdmxTdHJDYWNoZScpOwoKCQkJCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ2M6cHRDb3VudCcpOwoJCQkJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgndmFsJywgJHBsb3RTZXJpZXNWYWx1ZXMtPmdldFBvaW50Q291bnQoKSApOwoJCQkJCSRvYmpXcml0ZXItPmVuZEVsZW1lbnQoKTsKCgkJCQkJZm9yICgkbGV2ZWwgPSAwOyAkbGV2ZWwgPCAkbGV2ZWxDb3VudDsgKyskbGV2ZWwpIHsKCQkJCQkJJG9ialdyaXRlci0+c3RhcnRFbGVtZW50KCdjOmx2bCcpOwoKCQkJCQkJZm9yZWFjaCgkcGxvdFNlcmllc1ZhbHVlcy0+Z2V0RGF0YVZhbHVlcygpIGFzICRwbG90U2VyaWVzS2V5ID0+ICRwbG90U2VyaWVzVmFsdWUpIHsKCQkJCQkJCWlmIChpc3NldCgkcGxvdFNlcmllc1ZhbHVlWyRsZXZlbF0pKSB7CgkJCQkJCQkJJG9ialdyaXRlci0+c3RhcnRFbGVtZW50KCdjOnB0Jyk7CgkJCQkJCQkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCdpZHgnLCAkcGxvdFNlcmllc0tleSApOwoKCQkJCQkJCQkJJG9ialdyaXRlci0+c3RhcnRFbGVtZW50KCdjOnYnKTsKCQkJCQkJCQkJCSRvYmpXcml0ZXItPndyaXRlUmF3RGF0YSggJHBsb3RTZXJpZXNWYWx1ZVskbGV2ZWxdICk7CgkJCQkJCQkJCSRvYmpXcml0ZXItPmVuZEVsZW1lbnQoKTsKCQkJCQkJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgkJCQkJCQl9CgkJCQkJCX0KCgkJCQkJCSRvYmpXcml0ZXItPmVuZEVsZW1lbnQoKTsKCQkJCQl9CgoJCQkJJG9ialdyaXRlci0+ZW5kRWxlbWVudCgpOwoKCQkJJG9ialdyaXRlci0+ZW5kRWxlbWVudCgpOwoJCX0gZWxzZSB7CgkJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgnYzonLiRkYXRhVHlwZS4nUmVmJyk7CgoJCQkJJG9ialdyaXRlci0+c3RhcnRFbGVtZW50KCdjOmYnKTsKCQkJCQkkb2JqV3JpdGVyLT53cml0ZVJhd0RhdGEoICRwbG90U2VyaWVzVmFsdWVzLT5nZXREYXRhU291cmNlKCkgKTsKCQkJCSRvYmpXcml0ZXItPmVuZEVsZW1lbnQoKTsKCgkJCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ2M6Jy4kZGF0YVR5cGUuJ0NhY2hlJyk7CgoJCQkJCWlmICgoJGdyb3VwVHlwZSAhPSBQSFBFeGNlbF9DaGFydF9EYXRhU2VyaWVzOjpUWVBFX1BJRUNIQVJUKSAmJgoJCQkJCQkoJGdyb3VwVHlwZSAhPSBQSFBFeGNlbF9DaGFydF9EYXRhU2VyaWVzOjpUWVBFX1BJRUNIQVJUXzNEKSAmJgoJCQkJCQkoJGdyb3VwVHlwZSAhPSBQSFBFeGNlbF9DaGFydF9EYXRhU2VyaWVzOjpUWVBFX0RPTlVUQ0hBUlQpKSB7CgoJCQkJCQlpZiAoJHBsb3RTZXJpZXNWYWx1ZXMtPmdldEZvcm1hdENvZGUoKSAhPT0gTlVMTCkgewoJCQkJCQkJJG9ialdyaXRlci0+c3RhcnRFbGVtZW50KCdjOmZvcm1hdENvZGUnKTsKCQkJCQkJCQkkb2JqV3JpdGVyLT53cml0ZVJhd0RhdGEoICRwbG90U2VyaWVzVmFsdWVzLT5nZXRGb3JtYXRDb2RlKCkgKTsKCQkJCQkJCSRvYmpXcml0ZXItPmVuZEVsZW1lbnQoKTsKCQkJCQkJfQoJCQkJCX0KCgkJCQkJJG9ialdyaXRlci0+c3RhcnRFbGVtZW50KCdjOnB0Q291bnQnKTsKCQkJCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ3ZhbCcsICRwbG90U2VyaWVzVmFsdWVzLT5nZXRQb2ludENvdW50KCkgKTsKCQkJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgoJCQkJCWZvcmVhY2goJHBsb3RTZXJpZXNWYWx1ZXMtPmdldERhdGFWYWx1ZXMoKSBhcyAkcGxvdFNlcmllc0tleSA9PiAkcGxvdFNlcmllc1ZhbHVlKSB7CgkJCQkJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgnYzpwdCcpOwoJCQkJCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ2lkeCcsICRwbG90U2VyaWVzS2V5ICk7CgoJCQkJCQkJJG9ialdyaXRlci0+c3RhcnRFbGVtZW50KCdjOnYnKTsKCQkJCQkJCQkkb2JqV3JpdGVyLT53cml0ZVJhd0RhdGEoICRwbG90U2VyaWVzVmFsdWUgKTsKCQkJCQkJCSRvYmpXcml0ZXItPmVuZEVsZW1lbnQoKTsKCQkJCQkJJG9ialdyaXRlci0+ZW5kRWxlbWVudCgpOwoJCQkJCX0KCgkJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgoJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgkJfQoJfQoKCS8qKgoJICogV3JpdGUgQnViYmxlIENoYXJ0IERldGFpbHMKCSAqCgkgKiBAcGFyYW0JUEhQRXhjZWxfQ2hhcnRfRGF0YVNlcmllc1ZhbHVlcwkJJHBsb3RTZXJpZXNWYWx1ZXMKCSAqIEBwYXJhbSAJUEhQRXhjZWxfU2hhcmVkX1hNTFdyaXRlciAJCQkkb2JqV3JpdGVyIAkJCVhNTCBXcml0ZXIKCSAqIEB0aHJvd3MgCUV4Y2VwdGlvbgoJICovCglwcml2YXRlIGZ1bmN0aW9uIF93cml0ZUJ1YmJsZXMoJHBsb3RTZXJpZXNWYWx1ZXMsICRvYmpXcml0ZXIpCgl7CgkJaWYgKGlzX251bGwoJHBsb3RTZXJpZXNWYWx1ZXMpKSB7CgkJCXJldHVybjsKCQl9CgoJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgnYzpidWJibGVTaXplJyk7CgkJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgnYzpudW1MaXQnKTsKCgkJCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ2M6Zm9ybWF0Q29kZScpOwoJCQkJCSRvYmpXcml0ZXItPndyaXRlUmF3RGF0YSggJ0dlbmVyYWwnICk7CgkJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgoJCQkJJG9ialdyaXRlci0+c3RhcnRFbGVtZW50KCdjOnB0Q291bnQnKTsKCQkJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgndmFsJywgJHBsb3RTZXJpZXNWYWx1ZXMtPmdldFBvaW50Q291bnQoKSApOwoJCQkJJG9ialdyaXRlci0+ZW5kRWxlbWVudCgpOwoKCQkJCWZvcmVhY2goJHBsb3RTZXJpZXNWYWx1ZXMtPmdldERhdGFWYWx1ZXMoKSBhcyAkcGxvdFNlcmllc0tleSA9PiAkcGxvdFNlcmllc1ZhbHVlKSB7CgkJCQkJJG9ialdyaXRlci0+c3RhcnRFbGVtZW50KCdjOnB0Jyk7CgkJCQkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCdpZHgnLCAkcGxvdFNlcmllc0tleSApOwoJCQkJCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ2M6dicpOwoJCQkJCQkJJG9ialdyaXRlci0+d3JpdGVSYXdEYXRhKCAxICk7CgkJCQkJCSRvYmpXcml0ZXItPmVuZEVsZW1lbnQoKTsKCQkJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgkJCQl9CgoJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgkJJG9ialdyaXRlci0+ZW5kRWxlbWVudCgpOwoKCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ2M6YnViYmxlM0QnKTsKCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ3ZhbCcsIDAgKTsKCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7Cgl9CgoJLyoqCgkgKiBXcml0ZSBMYXlvdXQKCSAqCgkgKiBAcGFyYW0JUEhQRXhjZWxfQ2hhcnRfTGF5b3V0CQkkbGF5b3V0CgkgKiBAcGFyYW0gCVBIUEV4Y2VsX1NoYXJlZF9YTUxXcml0ZXIgCSRvYmpXcml0ZXIgCQlYTUwgV3JpdGVyCgkgKiBAdGhyb3dzIAlFeGNlcHRpb24KCSAqLwoJcHJpdmF0ZSBmdW5jdGlvbiBfd3JpdGVMYXlvdXQoUEhQRXhjZWxfQ2hhcnRfTGF5b3V0ICRsYXlvdXQgPSBOVUxMLCAkb2JqV3JpdGVyKQoJewoJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgnYzpsYXlvdXQnKTsKCgkJCWlmICghaXNfbnVsbCgkbGF5b3V0KSkgewoJCQkJJG9ialdyaXRlci0+c3RhcnRFbGVtZW50KCdjOm1hbnVhbExheW91dCcpOwoKCQkJCQkkbGF5b3V0VGFyZ2V0ID0gJGxheW91dC0+Z2V0TGF5b3V0VGFyZ2V0KCk7CgkJCQkJaWYgKCFpc19udWxsKCRsYXlvdXRUYXJnZXQpKSB7CgkJCQkJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgnYzpsYXlvdXRUYXJnZXQnKTsKCQkJCQkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCd2YWwnLCAkbGF5b3V0VGFyZ2V0KTsKCQkJCQkJJG9ialdyaXRlci0+ZW5kRWxlbWVudCgpOwoJCQkJCX0KCgkJCQkJJHhNb2RlID0gJGxheW91dC0+Z2V0WE1vZGUoKTsKCQkJCQlpZiAoIWlzX251bGwoJHhNb2RlKSkgewoJCQkJCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ2M6eE1vZGUnKTsKCQkJCQkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCd2YWwnLCAkeE1vZGUpOwoJCQkJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgkJCQkJfQoKCQkJCQkkeU1vZGUgPSAkbGF5b3V0LT5nZXRZTW9kZSgpOwoJCQkJCWlmICghaXNfbnVsbCgkeU1vZGUpKSB7CgkJCQkJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgnYzp5TW9kZScpOwoJCQkJCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ3ZhbCcsICR5TW9kZSk7CgkJCQkJCSRvYmpXcml0ZXItPmVuZEVsZW1lbnQoKTsKCQkJCQl9CgoJCQkJCSR4ID0gJGxheW91dC0+Z2V0WFBvc2l0aW9uKCk7CgkJCQkJaWYgKCFpc19udWxsKCR4KSkgewoJCQkJCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ2M6eCcpOwoJCQkJCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ3ZhbCcsICR4KTsKCQkJCQkJJG9ialdyaXRlci0+ZW5kRWxlbWVudCgpOwoJCQkJCX0KCgkJCQkJJHkgPSAkbGF5b3V0LT5nZXRZUG9zaXRpb24oKTsKCQkJCQlpZiAoIWlzX251bGwoJHkpKSB7CgkJCQkJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgnYzp5Jyk7CgkJCQkJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgndmFsJywgJHkpOwoJCQkJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgkJCQkJfQoKCQkJCQkkdyA9ICRsYXlvdXQtPmdldFdpZHRoKCk7CgkJCQkJaWYgKCFpc19udWxsKCR3KSkgewoJCQkJCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ2M6dycpOwoJCQkJCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ3ZhbCcsICR3KTsKCQkJCQkJJG9ialdyaXRlci0+ZW5kRWxlbWVudCgpOwoJCQkJCX0KCgkJCQkJJGggPSAkbGF5b3V0LT5nZXRIZWlnaHQoKTsKCQkJCQlpZiAoIWlzX251bGwoJGgpKSB7CgkJCQkJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgnYzpoJyk7CgkJCQkJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgndmFsJywgJGgpOwoJCQkJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgkJCQkJfQoKCQkJCSRvYmpXcml0ZXItPmVuZEVsZW1lbnQoKTsKCQkJfQoKCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7Cgl9CgoJLyoqCgkgKiBXcml0ZSBBbHRlcm5hdGUgQ29udGVudCBibG9jawoJICoKCSAqIEBwYXJhbSAJUEhQRXhjZWxfU2hhcmVkX1hNTFdyaXRlciAJJG9ialdyaXRlciAJCVhNTCBXcml0ZXIKCSAqIEB0aHJvd3MgCUV4Y2VwdGlvbgoJICovCglwcml2YXRlIGZ1bmN0aW9uIF93cml0ZUFsdGVybmF0ZUNvbnRlbnQoJG9ialdyaXRlcikKCXsKCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ21jOkFsdGVybmF0ZUNvbnRlbnQnKTsKCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ3htbG5zOm1jJywgJ2h0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9tYXJrdXAtY29tcGF0aWJpbGl0eS8yMDA2Jyk7CgoJCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ21jOkNob2ljZScpOwoJCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ3htbG5zOmMxNCcsICdodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL29mZmljZS9kcmF3aW5nLzIwMDcvOC8yL2NoYXJ0Jyk7CgkJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgnUmVxdWlyZXMnLCAnYzE0Jyk7CgoJCQkJJG9ialdyaXRlci0+c3RhcnRFbGVtZW50KCdjMTQ6c3R5bGUnKTsKCQkJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgndmFsJywgJzEwMicpOwoJCQkJJG9ialdyaXRlci0+ZW5kRWxlbWVudCgpOwoJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgoJCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ21jOkZhbGxiYWNrJyk7CgkJCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ2M6c3R5bGUnKTsKCQkJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgndmFsJywgJzInKTsKCQkJCSRvYmpXcml0ZXItPmVuZEVsZW1lbnQoKTsKCQkJJG9ialdyaXRlci0+ZW5kRWxlbWVudCgpOwoKCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7Cgl9CgoJLyoqCgkgKiBXcml0ZSBQcmludGVyIFNldHRpbmdzCgkgKgoJICogQHBhcmFtIAlQSFBFeGNlbF9TaGFyZWRfWE1MV3JpdGVyIAkkb2JqV3JpdGVyIAkJWE1MIFdyaXRlcgoJICogQHRocm93cyAJRXhjZXB0aW9uCgkgKi8KCXByaXZhdGUgZnVuY3Rpb24gX3dyaXRlUHJpbnRTZXR0aW5ncygkb2JqV3JpdGVyKQoJewoJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgnYzpwcmludFNldHRpbmdzJyk7CgoJCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ2M6aGVhZGVyRm9vdGVyJyk7CgkJCSRvYmpXcml0ZXItPmVuZEVsZW1lbnQoKTsKCgkJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgnYzpwYWdlTWFyZ2lucycpOwoJCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ2Zvb3RlcicsIDAuMyk7CgkJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgnaGVhZGVyJywgMC4zKTsKCQkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCdyJywgMC43KTsKCQkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCdsJywgMC43KTsKCQkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCd0JywgMC43NSk7CgkJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgnYicsIDAuNzUpOwoJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgoJCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ2M6cGFnZVNldHVwJyk7CgkJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgnb3JpZW50YXRpb24nLCAicG9ydHJhaXQiKTsKCQkJJG9ialdyaXRlci0+ZW5kRWxlbWVudCgpOwoKCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7Cgl9Cgp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Writer/Excel2007/Comments.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIFBIUEV4Y2VsCiAqCiAqIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICoKICogQGNhdGVnb3J5ICAgUEhQRXhjZWwKICogQHBhY2thZ2UgICAgUEhQRXhjZWxfV3JpdGVyX0V4Y2VsMjAwNwogKiBAY29weXJpZ2h0ICBDb3B5cmlnaHQgKGMpIDIwMDYgLSAyMDEyIFBIUEV4Y2VsIChodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9QSFBFeGNlbCkKICogQGxpY2Vuc2UgICAgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL29sZC1saWNlbnNlcy9sZ3BsLTIuMS50eHQJTEdQTAogKiBAdmVyc2lvbiAgICAxLjcuNywgMjAxMi0wNS0xOQogKi8KCgovKioKICogUEhQRXhjZWxfV3JpdGVyX0V4Y2VsMjAwN19Db21tZW50cwogKgogKiBAY2F0ZWdvcnkgICBQSFBFeGNlbAogKiBAcGFja2FnZSAgICBQSFBFeGNlbF9Xcml0ZXJfRXhjZWwyMDA3CiAqIEBjb3B5cmlnaHQgIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwgKGh0dHA6Ly93d3cuY29kZXBsZXguY29tL1BIUEV4Y2VsKQogKi8KY2xhc3MgUEhQRXhjZWxfV3JpdGVyX0V4Y2VsMjAwN19Db21tZW50cyBleHRlbmRzIFBIUEV4Y2VsX1dyaXRlcl9FeGNlbDIwMDdfV3JpdGVyUGFydAp7CgkvKioKCSAqIFdyaXRlIGNvbW1lbnRzIHRvIFhNTCBmb3JtYXQKCSAqCgkgKiBAcGFyYW0gCVBIUEV4Y2VsX1dvcmtzaGVldAkJCQkkcFdvcmtzaGVldAoJICogQHJldHVybiAJc3RyaW5nIAkJCQkJCQkJWE1MIE91dHB1dAoJICogQHRocm93cyAJRXhjZXB0aW9uCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiB3cml0ZUNvbW1lbnRzKFBIUEV4Y2VsX1dvcmtzaGVldCAkcFdvcmtzaGVldCA9IG51bGwpCgl7CgkJLy8gQ3JlYXRlIFhNTCB3cml0ZXIKCQkkb2JqV3JpdGVyID0gbnVsbDsKCQlpZiAoJHRoaXMtPmdldFBhcmVudFdyaXRlcigpLT5nZXRVc2VEaXNrQ2FjaGluZygpKSB7CgkJCSRvYmpXcml0ZXIgPSBuZXcgUEhQRXhjZWxfU2hhcmVkX1hNTFdyaXRlcihQSFBFeGNlbF9TaGFyZWRfWE1MV3JpdGVyOjpTVE9SQUdFX0RJU0ssICR0aGlzLT5nZXRQYXJlbnRXcml0ZXIoKS0+Z2V0RGlza0NhY2hpbmdEaXJlY3RvcnkoKSk7CgkJfSBlbHNlIHsKCQkJJG9ialdyaXRlciA9IG5ldyBQSFBFeGNlbF9TaGFyZWRfWE1MV3JpdGVyKFBIUEV4Y2VsX1NoYXJlZF9YTUxXcml0ZXI6OlNUT1JBR0VfTUVNT1JZKTsKCQl9CgoJCS8vIFhNTCBoZWFkZXIKCQkkb2JqV3JpdGVyLT5zdGFydERvY3VtZW50KCcxLjAnLCdVVEYtOCcsJ3llcycpOwoKICAJCS8vIENvbW1lbnRzIGNhY2hlCiAgCQkkY29tbWVudHMJPSAkcFdvcmtzaGVldC0+Z2V0Q29tbWVudHMoKTsKCiAgCQkvLyBBdXRob3JzIGNhY2hlCiAgCQkkYXV0aG9ycwk9IGFycmF5KCk7CiAgCQkkYXV0aG9ySWQJPSAwOwoJCWZvcmVhY2ggKCRjb21tZW50cyBhcyAkY29tbWVudCkgewoJCQlpZiAoIWlzc2V0KCRhdXRob3JzWyRjb21tZW50LT5nZXRBdXRob3IoKV0pKSB7CgkJCQkkYXV0aG9yc1skY29tbWVudC0+Z2V0QXV0aG9yKCldID0gJGF1dGhvcklkKys7CgkJCX0KCQl9CgoJCS8vIGNvbW1lbnRzCgkJJG9ialdyaXRlci0+c3RhcnRFbGVtZW50KCdjb21tZW50cycpOwoJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCd4bWxucycsICdodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvc3ByZWFkc2hlZXRtbC8yMDA2L21haW4nKTsKCgkJCS8vIExvb3AgdGhyb3VnaCBhdXRob3JzCgkJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgnYXV0aG9ycycpOwoJCQlmb3JlYWNoICgkYXV0aG9ycyBhcyAkYXV0aG9yID0+ICRpbmRleCkgewoJCQkJJG9ialdyaXRlci0+d3JpdGVFbGVtZW50KCdhdXRob3InLCAkYXV0aG9yKTsKCQkJfQoJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgoJCQkvLyBMb29wIHRocm91Z2ggY29tbWVudHMKCQkJJG9ialdyaXRlci0+c3RhcnRFbGVtZW50KCdjb21tZW50TGlzdCcpOwoJCQlmb3JlYWNoICgkY29tbWVudHMgYXMgJGtleSA9PiAkdmFsdWUpIHsKCQkJCSR0aGlzLT5fd3JpdGVDb21tZW50KCRvYmpXcml0ZXIsICRrZXksICR2YWx1ZSwgJGF1dGhvcnMpOwoJCQl9CgkJCSRvYmpXcml0ZXItPmVuZEVsZW1lbnQoKTsKCgkJJG9ialdyaXRlci0+ZW5kRWxlbWVudCgpOwoKCQkvLyBSZXR1cm4KCQlyZXR1cm4gJG9ialdyaXRlci0+Z2V0RGF0YSgpOwoJfQoKCS8qKgoJICogV3JpdGUgY29tbWVudCB0byBYTUwgZm9ybWF0CgkgKgoJICogQHBhcmFtIAlQSFBFeGNlbF9TaGFyZWRfWE1MV3JpdGVyCQkkb2JqV3JpdGVyIAkJCVhNTCBXcml0ZXIKCSAqIEBwYXJhbQlzdHJpbmcJCQkJCQkJJHBDZWxsUmVmZXJlbmNlCQlDZWxsIHJlZmVyZW5jZQoJICogQHBhcmFtIAlQSFBFeGNlbF9Db21tZW50CQkJCSRwQ29tbWVudAkJCUNvbW1lbnQKCSAqIEBwYXJhbQlhcnJheQkJCQkJCQkkcEF1dGhvcnMJCQlBcnJheSBvZiBhdXRob3JzCgkgKiBAdGhyb3dzIAlFeGNlcHRpb24KCSAqLwoJcHVibGljIGZ1bmN0aW9uIF93cml0ZUNvbW1lbnQoUEhQRXhjZWxfU2hhcmVkX1hNTFdyaXRlciAkb2JqV3JpdGVyID0gbnVsbCwgJHBDZWxsUmVmZXJlbmNlID0gJ0ExJywgUEhQRXhjZWxfQ29tbWVudCAkcENvbW1lbnQgPSBudWxsLCAkcEF1dGhvcnMgPSBudWxsKQoJewoJCS8vIGNvbW1lbnQKCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ2NvbW1lbnQnKTsKCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgncmVmJywgCQkkcENlbGxSZWZlcmVuY2UpOwoJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCdhdXRob3JJZCcsIAkkcEF1dGhvcnNbJHBDb21tZW50LT5nZXRBdXRob3IoKV0pOwoKCQkJLy8gdGV4dAoJCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ3RleHQnKTsKCQkJJHRoaXMtPmdldFBhcmVudFdyaXRlcigpLT5nZXRXcml0ZXJQYXJ0KCdzdHJpbmd0YWJsZScpLT53cml0ZVJpY2hUZXh0KCRvYmpXcml0ZXIsICRwQ29tbWVudC0+Z2V0VGV4dCgpKTsKCQkJJG9ialdyaXRlci0+ZW5kRWxlbWVudCgpOwoKCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7Cgl9CgoJLyoqCgkgKiBXcml0ZSBWTUwgY29tbWVudHMgdG8gWE1MIGZvcm1hdAoJICoKCSAqIEBwYXJhbSAJUEhQRXhjZWxfV29ya3NoZWV0CQkJCSRwV29ya3NoZWV0CgkgKiBAcmV0dXJuIAlzdHJpbmcgCQkJCQkJCQlYTUwgT3V0cHV0CgkgKiBAdGhyb3dzIAlFeGNlcHRpb24KCSAqLwoJcHVibGljIGZ1bmN0aW9uIHdyaXRlVk1MQ29tbWVudHMoUEhQRXhjZWxfV29ya3NoZWV0ICRwV29ya3NoZWV0ID0gbnVsbCkKCXsKCQkvLyBDcmVhdGUgWE1MIHdyaXRlcgoJCSRvYmpXcml0ZXIgPSBudWxsOwoJCWlmICgkdGhpcy0+Z2V0UGFyZW50V3JpdGVyKCktPmdldFVzZURpc2tDYWNoaW5nKCkpIHsKCQkJJG9ialdyaXRlciA9IG5ldyBQSFBFeGNlbF9TaGFyZWRfWE1MV3JpdGVyKFBIUEV4Y2VsX1NoYXJlZF9YTUxXcml0ZXI6OlNUT1JBR0VfRElTSywgJHRoaXMtPmdldFBhcmVudFdyaXRlcigpLT5nZXREaXNrQ2FjaGluZ0RpcmVjdG9yeSgpKTsKCQl9IGVsc2UgewoJCQkkb2JqV3JpdGVyID0gbmV3IFBIUEV4Y2VsX1NoYXJlZF9YTUxXcml0ZXIoUEhQRXhjZWxfU2hhcmVkX1hNTFdyaXRlcjo6U1RPUkFHRV9NRU1PUlkpOwoJCX0KCgkJLy8gWE1MIGhlYWRlcgoJCSRvYmpXcml0ZXItPnN0YXJ0RG9jdW1lbnQoJzEuMCcsJ1VURi04JywneWVzJyk7CgogIAkJLy8gQ29tbWVudHMgY2FjaGUKICAJCSRjb21tZW50cwk9ICRwV29ya3NoZWV0LT5nZXRDb21tZW50cygpOwoKCQkvLyB4bWwKCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ3htbCcpOwoJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCd4bWxuczp2JywgJ3VybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206dm1sJyk7CgkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ3htbG5zOm8nLCAndXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlJyk7CgkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ3htbG5zOngnLCAndXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6ZXhjZWwnKTsKCgkJCS8vIG86c2hhcGVsYXlvdXQKCQkJJG9ialdyaXRlci0+c3RhcnRFbGVtZW50KCdvOnNoYXBlbGF5b3V0Jyk7CgkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCd2OmV4dCcsIAkJJ2VkaXQnKTsKCgkJCQkvLyBvOmlkbWFwCgkJCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ286aWRtYXAnKTsKCQkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCd2OmV4dCcsIAknZWRpdCcpOwoJCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ2RhdGEnLCAJCScxJyk7CgkJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgoJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgoJCQkvLyB2OnNoYXBldHlwZQoJCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ3Y6c2hhcGV0eXBlJyk7CgkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCdpZCcsIAkJJ194MDAwMF90MjAyJyk7CgkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCdjb29yZHNpemUnLCAnMjE2MDAsMjE2MDAnKTsKCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ286c3B0JywgCScyMDInKTsKCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ3BhdGgnLCAJCSdtLGwsMjE2MDByMjE2MDAsbDIxNjAwLHhlJyk7CgoJCQkJLy8gdjpzdHJva2UKCQkJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgndjpzdHJva2UnKTsKCQkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCdqb2luc3R5bGUnLCAJJ21pdGVyJyk7CgkJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgoJCQkJLy8gdjpwYXRoCgkJCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ3Y6cGF0aCcpOwoJCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ2dyYWRpZW50c2hhcGVvaycsIAkndCcpOwoJCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ286Y29ubmVjdHR5cGUnLCAJJ3JlY3QnKTsKCQkJCSRvYmpXcml0ZXItPmVuZEVsZW1lbnQoKTsKCgkJCSRvYmpXcml0ZXItPmVuZEVsZW1lbnQoKTsKCgkJCS8vIExvb3AgdGhyb3VnaCBjb21tZW50cwoJCQlmb3JlYWNoICgkY29tbWVudHMgYXMgJGtleSA9PiAkdmFsdWUpIHsKCQkJCSR0aGlzLT5fd3JpdGVWTUxDb21tZW50KCRvYmpXcml0ZXIsICRrZXksICR2YWx1ZSk7CgkJCX0KCgkJJG9ialdyaXRlci0+ZW5kRWxlbWVudCgpOwoKCQkvLyBSZXR1cm4KCQlyZXR1cm4gJG9ialdyaXRlci0+Z2V0RGF0YSgpOwoJfQoKCS8qKgoJICogV3JpdGUgVk1MIGNvbW1lbnQgdG8gWE1MIGZvcm1hdAoJICoKCSAqIEBwYXJhbSAJUEhQRXhjZWxfU2hhcmVkX1hNTFdyaXRlcgkJJG9ialdyaXRlciAJCQlYTUwgV3JpdGVyCgkgKiBAcGFyYW0Jc3RyaW5nCQkJCQkJCSRwQ2VsbFJlZmVyZW5jZQkJQ2VsbCByZWZlcmVuY2UKCSAqIEBwYXJhbSAJUEhQRXhjZWxfQ29tbWVudAkJCQkkcENvbW1lbnQJCQlDb21tZW50CgkgKiBAdGhyb3dzIAlFeGNlcHRpb24KCSAqLwoJcHVibGljIGZ1bmN0aW9uIF93cml0ZVZNTENvbW1lbnQoUEhQRXhjZWxfU2hhcmVkX1hNTFdyaXRlciAkb2JqV3JpdGVyID0gbnVsbCwgJHBDZWxsUmVmZXJlbmNlID0gJ0ExJywgUEhQRXhjZWxfQ29tbWVudCAkcENvbW1lbnQgPSBudWxsKQoJewogCQkvLyBNZXRhZGF0YQogCQlsaXN0KCRjb2x1bW4sICRyb3cpID0gUEhQRXhjZWxfQ2VsbDo6Y29vcmRpbmF0ZUZyb21TdHJpbmcoJHBDZWxsUmVmZXJlbmNlKTsKIAkJJGNvbHVtbiA9IFBIUEV4Y2VsX0NlbGw6OmNvbHVtbkluZGV4RnJvbVN0cmluZygkY29sdW1uKTsKIAkJJGlkID0gMTAyNCArICRjb2x1bW4gKyAkcm93OwogCQkkaWQgPSBzdWJzdHIoJGlkLCAwLCA0KTsKCgkJLy8gdjpzaGFwZQoJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgndjpzaGFwZScpOwoJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCdpZCcsIAkJCSdfeDAwMDBfcycgLiAkaWQpOwoJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCd0eXBlJywgCQkJJyNfeDAwMDBfdDIwMicpOwoJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCdzdHlsZScsIAkJJ3Bvc2l0aW9uOmFic29sdXRlO21hcmdpbi1sZWZ0OicgLiAkcENvbW1lbnQtPmdldE1hcmdpbkxlZnQoKSAuICc7bWFyZ2luLXRvcDonIC4gJHBDb21tZW50LT5nZXRNYXJnaW5Ub3AoKSAuICc7d2lkdGg6JyAuICRwQ29tbWVudC0+Z2V0V2lkdGgoKSAuICc7aGVpZ2h0OicgLiAkcENvbW1lbnQtPmdldEhlaWdodCgpIC4gJzt6LWluZGV4OjE7dmlzaWJpbGl0eTonIC4gKCRwQ29tbWVudC0+Z2V0VmlzaWJsZSgpID8gJ3Zpc2libGUnIDogJ2hpZGRlbicpKTsKCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgnZmlsbGNvbG9yJywgCScjJyAuICRwQ29tbWVudC0+Z2V0RmlsbENvbG9yKCktPmdldFJHQigpKTsKCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgnbzppbnNldG1vZGUnLCAJJ2F1dG8nKTsKCgkJCS8vIHY6ZmlsbAoJCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ3Y6ZmlsbCcpOwoJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgnY29sb3IyJywgCQknIycgLiAkcENvbW1lbnQtPmdldEZpbGxDb2xvcigpLT5nZXRSR0IoKSk7CgkJCSRvYmpXcml0ZXItPmVuZEVsZW1lbnQoKTsKCgkJCS8vIHY6c2hhZG93CgkJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgndjpzaGFkb3cnKTsKCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ29uJywgCQkJJ3QnKTsKCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ2NvbG9yJywgCQknYmxhY2snKTsKCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ29ic2N1cmVkJywgCQkndCcpOwoJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgoJCQkvLyB2OnBhdGgKCQkJJG9ialdyaXRlci0+c3RhcnRFbGVtZW50KCd2OnBhdGgnKTsKCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ286Y29ubmVjdHR5cGUnLCAnbm9uZScpOwoJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgoJCQkvLyB2OnRleHRib3gKCQkJJG9ialdyaXRlci0+c3RhcnRFbGVtZW50KCd2OnRleHRib3gnKTsKCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ3N0eWxlJywgJ21zby1kaXJlY3Rpb24tYWx0OmF1dG8nKTsKCgkJCQkvLyBkaXYKCQkJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgnZGl2Jyk7CgkJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgnc3R5bGUnLCAndGV4dC1hbGlnbjpsZWZ0Jyk7CgkJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgoJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgoJCQkvLyB4OkNsaWVudERhdGEKCQkJJG9ialdyaXRlci0+c3RhcnRFbGVtZW50KCd4OkNsaWVudERhdGEnKTsKCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ09iamVjdFR5cGUnLCAnTm90ZScpOwoKCQkJCS8vIHg6TW92ZVdpdGhDZWxscwoJCQkJJG9ialdyaXRlci0+d3JpdGVFbGVtZW50KCd4Ok1vdmVXaXRoQ2VsbHMnLCAnJyk7CgoJCQkJLy8geDpTaXplV2l0aENlbGxzCgkJCQkkb2JqV3JpdGVyLT53cml0ZUVsZW1lbnQoJ3g6U2l6ZVdpdGhDZWxscycsICcnKTsKCgkJCQkvLyB4OkFuY2hvcgoJCQkJLy8kb2JqV3JpdGVyLT53cml0ZUVsZW1lbnQoJ3g6QW5jaG9yJywgJGNvbHVtbiAuICcsIDE1LCAnIC4gKCRyb3cgLSAyKSAuICcsIDEwLCAnIC4gKCRjb2x1bW4gKyA0KSAuICcsIDE1LCAnIC4gKCRyb3cgKyA1KSAuICcsIDE4Jyk7CgoJCQkJLy8geDpBdXRvRmlsbAoJCQkJJG9ialdyaXRlci0+d3JpdGVFbGVtZW50KCd4OkF1dG9GaWxsJywgJ0ZhbHNlJyk7CgoJCQkJLy8geDpSb3cKCQkJCSRvYmpXcml0ZXItPndyaXRlRWxlbWVudCgneDpSb3cnLCAoJHJvdyAtIDEpKTsKCgkJCQkvLyB4OkNvbHVtbgoJCQkJJG9ialdyaXRlci0+d3JpdGVFbGVtZW50KCd4OkNvbHVtbicsICgkY29sdW1uIC0gMSkpOwoKCQkJJG9ialdyaXRlci0+ZW5kRWxlbWVudCgpOwoKCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7Cgl9Cn0K]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Writer/Excel2007/ContentTypes.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIFBIUEV4Y2VsCiAqCiAqIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICoKICogQGNhdGVnb3J5ICAgUEhQRXhjZWwKICogQHBhY2thZ2UgICAgUEhQRXhjZWxfV3JpdGVyX0V4Y2VsMjAwNwogKiBAY29weXJpZ2h0ICBDb3B5cmlnaHQgKGMpIDIwMDYgLSAyMDEyIFBIUEV4Y2VsIChodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9QSFBFeGNlbCkKICogQGxpY2Vuc2UgICAgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL29sZC1saWNlbnNlcy9sZ3BsLTIuMS50eHQJTEdQTAogKiBAdmVyc2lvbiAgICAxLjcuNywgMjAxMi0wNS0xOQogKi8KCgovKioKICogUEhQRXhjZWxfV3JpdGVyX0V4Y2VsMjAwN19Db250ZW50VHlwZXMKICoKICogQGNhdGVnb3J5ICAgUEhQRXhjZWwKICogQHBhY2thZ2UgICAgUEhQRXhjZWxfV3JpdGVyX0V4Y2VsMjAwNwogKiBAY29weXJpZ2h0ICBDb3B5cmlnaHQgKGMpIDIwMDYgLSAyMDEyIFBIUEV4Y2VsIChodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9QSFBFeGNlbCkKICovCmNsYXNzIFBIUEV4Y2VsX1dyaXRlcl9FeGNlbDIwMDdfQ29udGVudFR5cGVzIGV4dGVuZHMgUEhQRXhjZWxfV3JpdGVyX0V4Y2VsMjAwN19Xcml0ZXJQYXJ0CnsKCS8qKgoJICogV3JpdGUgY29udGVudCB0eXBlcyB0byBYTUwgZm9ybWF0CgkgKgoJICogQHBhcmFtIAlQSFBFeGNlbAkkcFBIUEV4Y2VsCgkgKiBAcGFyYW0JYm9vbGVhbgkJJGluY2x1ZGVDaGFydHMJRmxhZyBpbmRpY2F0aW5nIGlmIHdlIHNob3VsZCBpbmNsdWRlIGRyYXdpbmcgZGV0YWlscyBmb3IgY2hhcnRzCgkgKiBAcmV0dXJuIAlzdHJpbmcgCQkJCQkJWE1MIE91dHB1dAoJICogQHRocm93cyAJRXhjZXB0aW9uCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiB3cml0ZUNvbnRlbnRUeXBlcyhQSFBFeGNlbCAkcFBIUEV4Y2VsID0gbnVsbCwgJGluY2x1ZGVDaGFydHMgPSBGQUxTRSkKCXsKCQkvLyBDcmVhdGUgWE1MIHdyaXRlcgoJCSRvYmpXcml0ZXIgPSBudWxsOwoJCWlmICgkdGhpcy0+Z2V0UGFyZW50V3JpdGVyKCktPmdldFVzZURpc2tDYWNoaW5nKCkpIHsKCQkJJG9ialdyaXRlciA9IG5ldyBQSFBFeGNlbF9TaGFyZWRfWE1MV3JpdGVyKFBIUEV4Y2VsX1NoYXJlZF9YTUxXcml0ZXI6OlNUT1JBR0VfRElTSywgJHRoaXMtPmdldFBhcmVudFdyaXRlcigpLT5nZXREaXNrQ2FjaGluZ0RpcmVjdG9yeSgpKTsKCQl9IGVsc2UgewoJCQkkb2JqV3JpdGVyID0gbmV3IFBIUEV4Y2VsX1NoYXJlZF9YTUxXcml0ZXIoUEhQRXhjZWxfU2hhcmVkX1hNTFdyaXRlcjo6U1RPUkFHRV9NRU1PUlkpOwoJCX0KCgkJLy8gWE1MIGhlYWRlcgoJCSRvYmpXcml0ZXItPnN0YXJ0RG9jdW1lbnQoJzEuMCcsJ1VURi04JywneWVzJyk7CgoJCS8vIFR5cGVzCgkJJG9ialdyaXRlci0+c3RhcnRFbGVtZW50KCdUeXBlcycpOwoJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCd4bWxucycsICdodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvcGFja2FnZS8yMDA2L2NvbnRlbnQtdHlwZXMnKTsKCgkJCS8vIFRoZW1lCgkJCSR0aGlzLT5fd3JpdGVPdmVycmlkZUNvbnRlbnRUeXBlKAoJCQkJJG9ialdyaXRlciwgJy94bC90aGVtZS90aGVtZTEueG1sJywgJ2FwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC50aGVtZSt4bWwnCgkJCSk7CgoJCQkvLyBTdHlsZXMKCQkJJHRoaXMtPl93cml0ZU92ZXJyaWRlQ29udGVudFR5cGUoCgkJCQkkb2JqV3JpdGVyLCAnL3hsL3N0eWxlcy54bWwnLCAnYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnNwcmVhZHNoZWV0bWwuc3R5bGVzK3htbCcKCQkJKTsKCgkJCS8vIFJlbHMKCQkJJHRoaXMtPl93cml0ZURlZmF1bHRDb250ZW50VHlwZSgKCQkJCSRvYmpXcml0ZXIsICdyZWxzJywgJ2FwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1wYWNrYWdlLnJlbGF0aW9uc2hpcHMreG1sJwoJCQkpOwoKCQkJLy8gWE1MCgkJCSR0aGlzLT5fd3JpdGVEZWZhdWx0Q29udGVudFR5cGUoCgkJCQkkb2JqV3JpdGVyLCAneG1sJywgJ2FwcGxpY2F0aW9uL3htbCcKCQkJKTsKCgkJCS8vIFZNTAoJCQkkdGhpcy0+X3dyaXRlRGVmYXVsdENvbnRlbnRUeXBlKAoJCQkJJG9ialdyaXRlciwgJ3ZtbCcsICdhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQudm1sRHJhd2luZycKCQkJKTsKCgkJCS8vIFdvcmtib29rCgkJCSR0aGlzLT5fd3JpdGVPdmVycmlkZUNvbnRlbnRUeXBlKAoJCQkJJG9ialdyaXRlciwgJy94bC93b3JrYm9vay54bWwnLCAnYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnNwcmVhZHNoZWV0bWwuc2hlZXQubWFpbit4bWwnCgkJCSk7CgoJCQkvLyBEb2NQcm9wcwoJCQkkdGhpcy0+X3dyaXRlT3ZlcnJpZGVDb250ZW50VHlwZSgKCQkJCSRvYmpXcml0ZXIsICcvZG9jUHJvcHMvYXBwLnhtbCcsICdhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuZXh0ZW5kZWQtcHJvcGVydGllcyt4bWwnCgkJCSk7CgoJCQkkdGhpcy0+X3dyaXRlT3ZlcnJpZGVDb250ZW50VHlwZSgKCQkJCSRvYmpXcml0ZXIsICcvZG9jUHJvcHMvY29yZS54bWwnLCAnYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLXBhY2thZ2UuY29yZS1wcm9wZXJ0aWVzK3htbCcKCQkJKTsKCgkJCSRjdXN0b21Qcm9wZXJ0eUxpc3QgPSAkcFBIUEV4Y2VsLT5nZXRQcm9wZXJ0aWVzKCktPmdldEN1c3RvbVByb3BlcnRpZXMoKTsKCQkJaWYgKCFlbXB0eSgkY3VzdG9tUHJvcGVydHlMaXN0KSkgewoJCQkJJHRoaXMtPl93cml0ZU92ZXJyaWRlQ29udGVudFR5cGUoCgkJCQkJJG9ialdyaXRlciwgJy9kb2NQcm9wcy9jdXN0b20ueG1sJywgJ2FwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5jdXN0b20tcHJvcGVydGllcyt4bWwnCgkJCQkpOwoJCQl9CgoJCQkvLyBXb3Jrc2hlZXRzCgkJCSRzaGVldENvdW50ID0gJHBQSFBFeGNlbC0+Z2V0U2hlZXRDb3VudCgpOwoJCQlmb3IgKCRpID0gMDsgJGkgPCAkc2hlZXRDb3VudDsgKyskaSkgewoJCQkJJHRoaXMtPl93cml0ZU92ZXJyaWRlQ29udGVudFR5cGUoCgkJCQkJJG9ialdyaXRlciwgJy94bC93b3Jrc2hlZXRzL3NoZWV0JyAuICgkaSArIDEpIC4gJy54bWwnLCAnYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnNwcmVhZHNoZWV0bWwud29ya3NoZWV0K3htbCcKCQkJCSk7CgkJCX0KCgkJCS8vIFNoYXJlZCBzdHJpbmdzCgkJCSR0aGlzLT5fd3JpdGVPdmVycmlkZUNvbnRlbnRUeXBlKAoJCQkJJG9ialdyaXRlciwgJy94bC9zaGFyZWRTdHJpbmdzLnhtbCcsICdhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuc3ByZWFkc2hlZXRtbC5zaGFyZWRTdHJpbmdzK3htbCcKCQkJKTsKCgkJCS8vIEFkZCB3b3Jrc2hlZXQgcmVsYXRpb25zaGlwIGNvbnRlbnQgdHlwZXMKCQkJJGNoYXJ0ID0gMTsKCQkJZm9yICgkaSA9IDA7ICRpIDwgJHNoZWV0Q291bnQ7ICsrJGkpIHsKCQkJCSRkcmF3aW5ncyA9ICRwUEhQRXhjZWwtPmdldFNoZWV0KCRpKS0+Z2V0RHJhd2luZ0NvbGxlY3Rpb24oKTsKCQkJCSRkcmF3aW5nQ291bnQgPSBjb3VudCgkZHJhd2luZ3MpOwoJCQkJJGNoYXJ0Q291bnQgPSAoJGluY2x1ZGVDaGFydHMpID8gJHBQSFBFeGNlbC0+Z2V0U2hlZXQoJGkpLT5nZXRDaGFydENvdW50KCkgOiAwOwoKCQkJCS8vCVdlIG5lZWQgYSBkcmF3aW5nIHJlbGF0aW9uc2hpcCBmb3IgdGhlIHdvcmtzaGVldCBpZiB3ZSBoYXZlIGVpdGhlciBkcmF3aW5ncyBvciBjaGFydHMKCQkJCWlmICgoJGRyYXdpbmdDb3VudCA+IDApIHx8ICgkY2hhcnRDb3VudCA+IDApKSB7CgkJCQkJJHRoaXMtPl93cml0ZU92ZXJyaWRlQ29udGVudFR5cGUoCgkJCQkJCSRvYmpXcml0ZXIsICcveGwvZHJhd2luZ3MvZHJhd2luZycgLiAoJGkgKyAxKSAuICcueG1sJywgJ2FwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5kcmF3aW5nK3htbCcKCQkJCQkpOwoJCQkJfQoKCQkJCS8vCUlmIHdlIGhhdmUgY2hhcnRzLCB0aGVuIHdlIG5lZWQgYSBjaGFydCByZWxhdGlvbnNoaXAgZm9yIGV2ZXJ5IGluZGl2aWR1YWwgY2hhcnQKCQkJCWlmICgkY2hhcnRDb3VudCA+IDApIHsKCQkJCQlmb3IgKCRjID0gMDsgJGMgPCAkY2hhcnRDb3VudDsgKyskYykgewoJCQkJCQkkdGhpcy0+X3dyaXRlT3ZlcnJpZGVDb250ZW50VHlwZSgKCQkJCQkJCSRvYmpXcml0ZXIsICcveGwvY2hhcnRzL2NoYXJ0JyAuICRjaGFydCsrIC4gJy54bWwnLCAnYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LmRyYXdpbmdtbC5jaGFydCt4bWwnCgkJCQkJCSk7CgkJCQkJfQoJCQkJfQoJCQl9CgoJCQkvLyBDb21tZW50cwoJCQlmb3IgKCRpID0gMDsgJGkgPCAkc2hlZXRDb3VudDsgKyskaSkgewoJCQkJaWYgKGNvdW50KCRwUEhQRXhjZWwtPmdldFNoZWV0KCRpKS0+Z2V0Q29tbWVudHMoKSkgPiAwKSB7CgkJCQkJJHRoaXMtPl93cml0ZU92ZXJyaWRlQ29udGVudFR5cGUoCgkJCQkJCSRvYmpXcml0ZXIsICcveGwvY29tbWVudHMnIC4gKCRpICsgMSkgLiAnLnhtbCcsICdhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuc3ByZWFkc2hlZXRtbC5jb21tZW50cyt4bWwnCgkJCQkJKTsKCQkJCX0KCQkJfQoKCQkJLy8gQWRkIG1lZGlhIGNvbnRlbnQtdHlwZXMKCQkJJGFNZWRpYUNvbnRlbnRUeXBlcyA9IGFycmF5KCk7CgkJCSRtZWRpYUNvdW50ID0gJHRoaXMtPmdldFBhcmVudFdyaXRlcigpLT5nZXREcmF3aW5nSGFzaFRhYmxlKCktPmNvdW50KCk7CgkJCWZvciAoJGkgPSAwOyAkaSA8ICRtZWRpYUNvdW50OyArKyRpKSB7CgkJCQkkZXh0ZW5zaW9uIAk9ICcnOwoJCQkJJG1pbWVUeXBlIAk9ICcnOwoKCQkJCWlmICgkdGhpcy0+Z2V0UGFyZW50V3JpdGVyKCktPmdldERyYXdpbmdIYXNoVGFibGUoKS0+Z2V0QnlJbmRleCgkaSkgaW5zdGFuY2VvZiBQSFBFeGNlbF9Xb3Jrc2hlZXRfRHJhd2luZykgewoJCQkJCSRleHRlbnNpb24gCT0gc3RydG9sb3dlcigkdGhpcy0+Z2V0UGFyZW50V3JpdGVyKCktPmdldERyYXdpbmdIYXNoVGFibGUoKS0+Z2V0QnlJbmRleCgkaSktPmdldEV4dGVuc2lvbigpKTsKCQkJCQkkbWltZVR5cGUgCT0gJHRoaXMtPl9nZXRJbWFnZU1pbWVUeXBlKCAkdGhpcy0+Z2V0UGFyZW50V3JpdGVyKCktPmdldERyYXdpbmdIYXNoVGFibGUoKS0+Z2V0QnlJbmRleCgkaSktPmdldFBhdGgoKSApOwoJCQkJfSBlbHNlIGlmICgkdGhpcy0+Z2V0UGFyZW50V3JpdGVyKCktPmdldERyYXdpbmdIYXNoVGFibGUoKS0+Z2V0QnlJbmRleCgkaSkgaW5zdGFuY2VvZiBQSFBFeGNlbF9Xb3Jrc2hlZXRfTWVtb3J5RHJhd2luZykgewoJCQkJCSRleHRlbnNpb24gCT0gc3RydG9sb3dlcigkdGhpcy0+Z2V0UGFyZW50V3JpdGVyKCktPmdldERyYXdpbmdIYXNoVGFibGUoKS0+Z2V0QnlJbmRleCgkaSktPmdldE1pbWVUeXBlKCkpOwoJCQkJCSRleHRlbnNpb24gCT0gZXhwbG9kZSgnLycsICRleHRlbnNpb24pOwoJCQkJCSRleHRlbnNpb24gCT0gJGV4dGVuc2lvblsxXTsKCgkJCQkJJG1pbWVUeXBlIAk9ICR0aGlzLT5nZXRQYXJlbnRXcml0ZXIoKS0+Z2V0RHJhd2luZ0hhc2hUYWJsZSgpLT5nZXRCeUluZGV4KCRpKS0+Z2V0TWltZVR5cGUoKTsKCQkJCX0KCgkJCQlpZiAoIWlzc2V0KCAkYU1lZGlhQ29udGVudFR5cGVzWyRleHRlbnNpb25dKSApIHsKCQkJCQkJJGFNZWRpYUNvbnRlbnRUeXBlc1skZXh0ZW5zaW9uXSA9ICRtaW1lVHlwZTsKCgkJCQkJCSR0aGlzLT5fd3JpdGVEZWZhdWx0Q29udGVudFR5cGUoCgkJCQkJCQkkb2JqV3JpdGVyLCAkZXh0ZW5zaW9uLCAkbWltZVR5cGUKCQkJCQkJKTsKCQkJCX0KCQkJfQoKCQkJJHNoZWV0Q291bnQgPSAkcFBIUEV4Y2VsLT5nZXRTaGVldENvdW50KCk7CgkJCWZvciAoJGkgPSAwOyAkaSA8ICRzaGVldENvdW50OyArKyRpKSB7CgkJCQlpZiAoY291bnQoJHBQSFBFeGNlbC0+Z2V0U2hlZXQoKS0+Z2V0SGVhZGVyRm9vdGVyKCktPmdldEltYWdlcygpKSA+IDApIHsKCQkJCQlmb3JlYWNoICgkcFBIUEV4Y2VsLT5nZXRTaGVldCgpLT5nZXRIZWFkZXJGb290ZXIoKS0+Z2V0SW1hZ2VzKCkgYXMgJGltYWdlKSB7CgkJCQkJCWlmICghaXNzZXQoICRhTWVkaWFDb250ZW50VHlwZXNbc3RydG9sb3dlcigkaW1hZ2UtPmdldEV4dGVuc2lvbigpKV0pICkgewoJCQkJCQkJJGFNZWRpYUNvbnRlbnRUeXBlc1tzdHJ0b2xvd2VyKCRpbWFnZS0+Z2V0RXh0ZW5zaW9uKCkpXSA9ICR0aGlzLT5fZ2V0SW1hZ2VNaW1lVHlwZSggJGltYWdlLT5nZXRQYXRoKCkgKTsKCgkJCQkJCQkkdGhpcy0+X3dyaXRlRGVmYXVsdENvbnRlbnRUeXBlKAoJCQkJCQkJCSRvYmpXcml0ZXIsIHN0cnRvbG93ZXIoJGltYWdlLT5nZXRFeHRlbnNpb24oKSksICRhTWVkaWFDb250ZW50VHlwZXNbc3RydG9sb3dlcigkaW1hZ2UtPmdldEV4dGVuc2lvbigpKV0KCQkJCQkJCSk7CgkJCQkJCX0KCQkJCQl9CgkJCQl9CgkJCX0KCgkJJG9ialdyaXRlci0+ZW5kRWxlbWVudCgpOwoKCQkvLyBSZXR1cm4KCQlyZXR1cm4gJG9ialdyaXRlci0+Z2V0RGF0YSgpOwoJfQoKCS8qKgoJICogR2V0IGltYWdlIG1pbWUgdHlwZQoJICoKCSAqIEBwYXJhbSAJc3RyaW5nCSRwRmlsZQlGaWxlbmFtZQoJICogQHJldHVybiAJc3RyaW5nCU1pbWUgVHlwZQoJICogQHRocm93cyAJRXhjZXB0aW9uCgkgKi8KCXByaXZhdGUgZnVuY3Rpb24gX2dldEltYWdlTWltZVR5cGUoJHBGaWxlID0gJycpCgl7CgkJaWYgKFBIUEV4Y2VsX1NoYXJlZF9GaWxlOjpmaWxlX2V4aXN0cygkcEZpbGUpKSB7CgkJCSRpbWFnZSA9IGdldGltYWdlc2l6ZSgkcEZpbGUpOwoJCQlyZXR1cm4gaW1hZ2VfdHlwZV90b19taW1lX3R5cGUoJGltYWdlWzJdKTsKCQl9IGVsc2UgewoJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCJGaWxlICRwRmlsZSBkb2VzIG5vdCBleGlzdCIpOwoJCX0KCX0KCgkvKioKCSAqIFdyaXRlIERlZmF1bHQgY29udGVudCB0eXBlCgkgKgoJICogQHBhcmFtIAlQSFBFeGNlbF9TaGFyZWRfWE1MV3JpdGVyIAkkb2JqV3JpdGVyIAkJWE1MIFdyaXRlcgoJICogQHBhcmFtIAlzdHJpbmcgCQkJCQkJJHBQYXJ0bmFtZSAJCVBhcnQgbmFtZQoJICogQHBhcmFtIAlzdHJpbmcgCQkJCQkJJHBDb250ZW50VHlwZSAJQ29udGVudCB0eXBlCgkgKiBAdGhyb3dzIAlFeGNlcHRpb24KCSAqLwoJcHJpdmF0ZSBmdW5jdGlvbiBfd3JpdGVEZWZhdWx0Q29udGVudFR5cGUoUEhQRXhjZWxfU2hhcmVkX1hNTFdyaXRlciAkb2JqV3JpdGVyID0gbnVsbCwgJHBQYXJ0bmFtZSA9ICcnLCAkcENvbnRlbnRUeXBlID0gJycpCgl7CgkJaWYgKCRwUGFydG5hbWUgIT0gJycgJiYgJHBDb250ZW50VHlwZSAhPSAnJykgewoJCQkvLyBXcml0ZSBjb250ZW50IHR5cGUKCQkJJG9ialdyaXRlci0+c3RhcnRFbGVtZW50KCdEZWZhdWx0Jyk7CgkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCdFeHRlbnNpb24nLCAJJHBQYXJ0bmFtZSk7CgkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCdDb250ZW50VHlwZScsIAkkcENvbnRlbnRUeXBlKTsKCQkJJG9ialdyaXRlci0+ZW5kRWxlbWVudCgpOwoJCX0gZWxzZSB7CgkJCXRocm93IG5ldyBFeGNlcHRpb24oIkludmFsaWQgcGFyYW1ldGVycyBwYXNzZWQuIik7CgkJfQoJfQoKCS8qKgoJICogV3JpdGUgT3ZlcnJpZGUgY29udGVudCB0eXBlCgkgKgoJICogQHBhcmFtIAlQSFBFeGNlbF9TaGFyZWRfWE1MV3JpdGVyIAkkb2JqV3JpdGVyIAkJWE1MIFdyaXRlcgoJICogQHBhcmFtIAlzdHJpbmcgCQkJCQkJJHBQYXJ0bmFtZSAJCVBhcnQgbmFtZQoJICogQHBhcmFtIAlzdHJpbmcgCQkJCQkJJHBDb250ZW50VHlwZSAJQ29udGVudCB0eXBlCgkgKiBAdGhyb3dzIAlFeGNlcHRpb24KCSAqLwoJcHJpdmF0ZSBmdW5jdGlvbiBfd3JpdGVPdmVycmlkZUNvbnRlbnRUeXBlKFBIUEV4Y2VsX1NoYXJlZF9YTUxXcml0ZXIgJG9ialdyaXRlciA9IG51bGwsICRwUGFydG5hbWUgPSAnJywgJHBDb250ZW50VHlwZSA9ICcnKQoJewoJCWlmICgkcFBhcnRuYW1lICE9ICcnICYmICRwQ29udGVudFR5cGUgIT0gJycpIHsKCQkJLy8gV3JpdGUgY29udGVudCB0eXBlCgkJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgnT3ZlcnJpZGUnKTsKCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ1BhcnROYW1lJywgCQkkcFBhcnRuYW1lKTsKCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ0NvbnRlbnRUeXBlJywgCSRwQ29udGVudFR5cGUpOwoJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgkJfSBlbHNlIHsKCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbigiSW52YWxpZCBwYXJhbWV0ZXJzIHBhc3NlZC4iKTsKCQl9Cgl9Cn0K]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Writer/Excel2007/DocProps.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIFBIUEV4Y2VsCiAqCiAqIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICoKICogQGNhdGVnb3J5ICAgUEhQRXhjZWwKICogQHBhY2thZ2UgICAgUEhQRXhjZWxfV3JpdGVyX0V4Y2VsMjAwNwogKiBAY29weXJpZ2h0ICBDb3B5cmlnaHQgKGMpIDIwMDYgLSAyMDEyIFBIUEV4Y2VsIChodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9QSFBFeGNlbCkKICogQGxpY2Vuc2UgICAgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL29sZC1saWNlbnNlcy9sZ3BsLTIuMS50eHQJTEdQTAogKiBAdmVyc2lvbiAgICAxLjcuNywgMjAxMi0wNS0xOQogKi8KCgovKioKICogUEhQRXhjZWxfV3JpdGVyX0V4Y2VsMjAwN19Eb2NQcm9wcwogKgogKiBAY2F0ZWdvcnkgICBQSFBFeGNlbAogKiBAcGFja2FnZSAgICBQSFBFeGNlbF9Xcml0ZXJfRXhjZWwyMDA3CiAqIEBjb3B5cmlnaHQgIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwgKGh0dHA6Ly93d3cuY29kZXBsZXguY29tL1BIUEV4Y2VsKQogKi8KY2xhc3MgUEhQRXhjZWxfV3JpdGVyX0V4Y2VsMjAwN19Eb2NQcm9wcyBleHRlbmRzIFBIUEV4Y2VsX1dyaXRlcl9FeGNlbDIwMDdfV3JpdGVyUGFydAp7Ci8qKgoJICogV3JpdGUgZG9jUHJvcHMvYXBwLnhtbCB0byBYTUwgZm9ybWF0CgkgKgoJICogQHBhcmFtIAlQSFBFeGNlbAkkcFBIUEV4Y2VsCgkgKiBAcmV0dXJuIAlzdHJpbmcgCQlYTUwgT3V0cHV0CgkgKiBAdGhyb3dzIAlFeGNlcHRpb24KCSAqLwoJcHVibGljIGZ1bmN0aW9uIHdyaXRlRG9jUHJvcHNBcHAoUEhQRXhjZWwgJHBQSFBFeGNlbCA9IG51bGwpCgl7CgkJLy8gQ3JlYXRlIFhNTCB3cml0ZXIKCQkkb2JqV3JpdGVyID0gbnVsbDsKCQlpZiAoJHRoaXMtPmdldFBhcmVudFdyaXRlcigpLT5nZXRVc2VEaXNrQ2FjaGluZygpKSB7CgkJCSRvYmpXcml0ZXIgPSBuZXcgUEhQRXhjZWxfU2hhcmVkX1hNTFdyaXRlcihQSFBFeGNlbF9TaGFyZWRfWE1MV3JpdGVyOjpTVE9SQUdFX0RJU0ssICR0aGlzLT5nZXRQYXJlbnRXcml0ZXIoKS0+Z2V0RGlza0NhY2hpbmdEaXJlY3RvcnkoKSk7CgkJfSBlbHNlIHsKCQkJJG9ialdyaXRlciA9IG5ldyBQSFBFeGNlbF9TaGFyZWRfWE1MV3JpdGVyKFBIUEV4Y2VsX1NoYXJlZF9YTUxXcml0ZXI6OlNUT1JBR0VfTUVNT1JZKTsKCQl9CgoJCS8vIFhNTCBoZWFkZXIKCQkkb2JqV3JpdGVyLT5zdGFydERvY3VtZW50KCcxLjAnLCdVVEYtOCcsJ3llcycpOwoKCQkvLyBQcm9wZXJ0aWVzCgkJJG9ialdyaXRlci0+c3RhcnRFbGVtZW50KCdQcm9wZXJ0aWVzJyk7CgkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCd4bWxucycsICdodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvb2ZmaWNlRG9jdW1lbnQvMjAwNi9leHRlbmRlZC1wcm9wZXJ0aWVzJyk7CgkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCd4bWxuczp2dCcsICdodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvb2ZmaWNlRG9jdW1lbnQvMjAwNi9kb2NQcm9wc1ZUeXBlcycpOwoKCQkJLy8gQXBwbGljYXRpb24KCQkJJG9ialdyaXRlci0+d3JpdGVFbGVtZW50KCdBcHBsaWNhdGlvbicsIAknTWljcm9zb2Z0IEV4Y2VsJyk7CgoJCQkvLyBEb2NTZWN1cml0eQoJCQkkb2JqV3JpdGVyLT53cml0ZUVsZW1lbnQoJ0RvY1NlY3VyaXR5JywgCScwJyk7CgoJCQkvLyBTY2FsZUNyb3AKCQkJJG9ialdyaXRlci0+d3JpdGVFbGVtZW50KCdTY2FsZUNyb3AnLCAJCSdmYWxzZScpOwoKCQkJLy8gSGVhZGluZ1BhaXJzCgkJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgnSGVhZGluZ1BhaXJzJyk7CgoJCQkJLy8gVmVjdG9yCgkJCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ3Z0OnZlY3RvcicpOwoJCQkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCdzaXplJywgCQknMicpOwoJCQkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCdiYXNlVHlwZScsIAkndmFyaWFudCcpOwoKCQkJCQkvLyBWYXJpYW50CgkJCQkJJG9ialdyaXRlci0+c3RhcnRFbGVtZW50KCd2dDp2YXJpYW50Jyk7CgkJCQkJCSRvYmpXcml0ZXItPndyaXRlRWxlbWVudCgndnQ6bHBzdHInLCAJJ1dvcmtzaGVldHMnKTsKCQkJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgoJCQkJCS8vIFZhcmlhbnQKCQkJCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ3Z0OnZhcmlhbnQnKTsKCQkJCQkJJG9ialdyaXRlci0+d3JpdGVFbGVtZW50KCd2dDppNCcsIAkJJHBQSFBFeGNlbC0+Z2V0U2hlZXRDb3VudCgpKTsKCQkJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgoJCQkJJG9ialdyaXRlci0+ZW5kRWxlbWVudCgpOwoKCQkJJG9ialdyaXRlci0+ZW5kRWxlbWVudCgpOwoKCQkJLy8gVGl0bGVzT2ZQYXJ0cwoJCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ1RpdGxlc09mUGFydHMnKTsKCgkJCQkvLyBWZWN0b3IKCQkJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgndnQ6dmVjdG9yJyk7CgkJCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ3NpemUnLCAJCSRwUEhQRXhjZWwtPmdldFNoZWV0Q291bnQoKSk7CgkJCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ2Jhc2VUeXBlJywJJ2xwc3RyJyk7CgoJCQkJCSRzaGVldENvdW50ID0gJHBQSFBFeGNlbC0+Z2V0U2hlZXRDb3VudCgpOwoJCQkJCWZvciAoJGkgPSAwOyAkaSA8ICRzaGVldENvdW50OyArKyRpKSB7CgkJCQkJCSRvYmpXcml0ZXItPndyaXRlRWxlbWVudCgndnQ6bHBzdHInLCAkcFBIUEV4Y2VsLT5nZXRTaGVldCgkaSktPmdldFRpdGxlKCkpOwoJCQkJCX0KCgkJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgoJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgoJCQkvLyBDb21wYW55CgkJCSRvYmpXcml0ZXItPndyaXRlRWxlbWVudCgnQ29tcGFueScsIAkJCSRwUEhQRXhjZWwtPmdldFByb3BlcnRpZXMoKS0+Z2V0Q29tcGFueSgpKTsKCgkJCS8vIENvbXBhbnkKCQkJJG9ialdyaXRlci0+d3JpdGVFbGVtZW50KCdNYW5hZ2VyJywgCQkJJHBQSFBFeGNlbC0+Z2V0UHJvcGVydGllcygpLT5nZXRNYW5hZ2VyKCkpOwoKCQkJLy8gTGlua3NVcFRvRGF0ZQoJCQkkb2JqV3JpdGVyLT53cml0ZUVsZW1lbnQoJ0xpbmtzVXBUb0RhdGUnLCAJCSdmYWxzZScpOwoKCQkJLy8gU2hhcmVkRG9jCgkJCSRvYmpXcml0ZXItPndyaXRlRWxlbWVudCgnU2hhcmVkRG9jJywgCQkJJ2ZhbHNlJyk7CgoJCQkvLyBIeXBlcmxpbmtzQ2hhbmdlZAoJCQkkb2JqV3JpdGVyLT53cml0ZUVsZW1lbnQoJ0h5cGVybGlua3NDaGFuZ2VkJywgCSdmYWxzZScpOwoKCQkJLy8gQXBwVmVyc2lvbgoJCQkkb2JqV3JpdGVyLT53cml0ZUVsZW1lbnQoJ0FwcFZlcnNpb24nLCAJCQknMTIuMDAwMCcpOwoKCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgoJCS8vIFJldHVybgoJCXJldHVybiAkb2JqV3JpdGVyLT5nZXREYXRhKCk7Cgl9CgoJLyoqCgkgKiBXcml0ZSBkb2NQcm9wcy9jb3JlLnhtbCB0byBYTUwgZm9ybWF0CgkgKgoJICogQHBhcmFtIAlQSFBFeGNlbAkkcFBIUEV4Y2VsCgkgKiBAcmV0dXJuIAlzdHJpbmcgCQlYTUwgT3V0cHV0CgkgKiBAdGhyb3dzIAlFeGNlcHRpb24KCSAqLwoJcHVibGljIGZ1bmN0aW9uIHdyaXRlRG9jUHJvcHNDb3JlKFBIUEV4Y2VsICRwUEhQRXhjZWwgPSBudWxsKQoJewoJCS8vIENyZWF0ZSBYTUwgd3JpdGVyCgkJJG9ialdyaXRlciA9IG51bGw7CgkJaWYgKCR0aGlzLT5nZXRQYXJlbnRXcml0ZXIoKS0+Z2V0VXNlRGlza0NhY2hpbmcoKSkgewoJCQkkb2JqV3JpdGVyID0gbmV3IFBIUEV4Y2VsX1NoYXJlZF9YTUxXcml0ZXIoUEhQRXhjZWxfU2hhcmVkX1hNTFdyaXRlcjo6U1RPUkFHRV9ESVNLLCAkdGhpcy0+Z2V0UGFyZW50V3JpdGVyKCktPmdldERpc2tDYWNoaW5nRGlyZWN0b3J5KCkpOwoJCX0gZWxzZSB7CgkJCSRvYmpXcml0ZXIgPSBuZXcgUEhQRXhjZWxfU2hhcmVkX1hNTFdyaXRlcihQSFBFeGNlbF9TaGFyZWRfWE1MV3JpdGVyOjpTVE9SQUdFX01FTU9SWSk7CgkJfQoKCQkvLyBYTUwgaGVhZGVyCgkJJG9ialdyaXRlci0+c3RhcnREb2N1bWVudCgnMS4wJywnVVRGLTgnLCd5ZXMnKTsKCgkJLy8gY3A6Y29yZVByb3BlcnRpZXMKCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ2NwOmNvcmVQcm9wZXJ0aWVzJyk7CgkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCd4bWxuczpjcCcsICdodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvcGFja2FnZS8yMDA2L21ldGFkYXRhL2NvcmUtcHJvcGVydGllcycpOwoJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgneG1sbnM6ZGMnLCAnaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8nKTsKCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ3htbG5zOmRjdGVybXMnLCAnaHR0cDovL3B1cmwub3JnL2RjL3Rlcm1zLycpOwoJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgneG1sbnM6ZGNtaXR5cGUnLCAnaHR0cDovL3B1cmwub3JnL2RjL2RjbWl0eXBlLycpOwoJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgneG1sbnM6eHNpJywgJ2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlJyk7CgoJCQkvLyBkYzpjcmVhdG9yCgkJCSRvYmpXcml0ZXItPndyaXRlRWxlbWVudCgnZGM6Y3JlYXRvcicsCQkJJHBQSFBFeGNlbC0+Z2V0UHJvcGVydGllcygpLT5nZXRDcmVhdG9yKCkpOwoKCQkJLy8gY3A6bGFzdE1vZGlmaWVkQnkKCQkJJG9ialdyaXRlci0+d3JpdGVFbGVtZW50KCdjcDpsYXN0TW9kaWZpZWRCeScsIAkkcFBIUEV4Y2VsLT5nZXRQcm9wZXJ0aWVzKCktPmdldExhc3RNb2RpZmllZEJ5KCkpOwoKCQkJLy8gZGN0ZXJtczpjcmVhdGVkCgkJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgnZGN0ZXJtczpjcmVhdGVkJyk7CgkJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgneHNpOnR5cGUnLCAnZGN0ZXJtczpXM0NEVEYnKTsKCQkJCSRvYmpXcml0ZXItPndyaXRlUmF3RGF0YShkYXRlKERBVEVfVzNDLCAJJHBQSFBFeGNlbC0+Z2V0UHJvcGVydGllcygpLT5nZXRDcmVhdGVkKCkpKTsKCQkJJG9ialdyaXRlci0+ZW5kRWxlbWVudCgpOwoKCQkJLy8gZGN0ZXJtczptb2RpZmllZAoJCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ2RjdGVybXM6bW9kaWZpZWQnKTsKCQkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCd4c2k6dHlwZScsICdkY3Rlcm1zOlczQ0RURicpOwoJCQkJJG9ialdyaXRlci0+d3JpdGVSYXdEYXRhKGRhdGUoREFURV9XM0MsIAkkcFBIUEV4Y2VsLT5nZXRQcm9wZXJ0aWVzKCktPmdldE1vZGlmaWVkKCkpKTsKCQkJJG9ialdyaXRlci0+ZW5kRWxlbWVudCgpOwoKCQkJLy8gZGM6dGl0bGUKCQkJJG9ialdyaXRlci0+d3JpdGVFbGVtZW50KCdkYzp0aXRsZScsIAkJCSRwUEhQRXhjZWwtPmdldFByb3BlcnRpZXMoKS0+Z2V0VGl0bGUoKSk7CgoJCQkvLyBkYzpkZXNjcmlwdGlvbgoJCQkkb2JqV3JpdGVyLT53cml0ZUVsZW1lbnQoJ2RjOmRlc2NyaXB0aW9uJywgCQkkcFBIUEV4Y2VsLT5nZXRQcm9wZXJ0aWVzKCktPmdldERlc2NyaXB0aW9uKCkpOwoKCQkJLy8gZGM6c3ViamVjdAoJCQkkb2JqV3JpdGVyLT53cml0ZUVsZW1lbnQoJ2RjOnN1YmplY3QnLCAJCQkkcFBIUEV4Y2VsLT5nZXRQcm9wZXJ0aWVzKCktPmdldFN1YmplY3QoKSk7CgoJCQkvLyBjcDprZXl3b3JkcwoJCQkkb2JqV3JpdGVyLT53cml0ZUVsZW1lbnQoJ2NwOmtleXdvcmRzJywgCQkkcFBIUEV4Y2VsLT5nZXRQcm9wZXJ0aWVzKCktPmdldEtleXdvcmRzKCkpOwoKCQkJLy8gY3A6Y2F0ZWdvcnkKCQkJJG9ialdyaXRlci0+d3JpdGVFbGVtZW50KCdjcDpjYXRlZ29yeScsIAkJJHBQSFBFeGNlbC0+Z2V0UHJvcGVydGllcygpLT5nZXRDYXRlZ29yeSgpKTsKCgkJJG9ialdyaXRlci0+ZW5kRWxlbWVudCgpOwoKCQkvLyBSZXR1cm4KCQlyZXR1cm4gJG9ialdyaXRlci0+Z2V0RGF0YSgpOwoJfQoKCS8qKgoJICogV3JpdGUgZG9jUHJvcHMvY3VzdG9tLnhtbCB0byBYTUwgZm9ybWF0CgkgKgoJICogQHBhcmFtIAlQSFBFeGNlbAkkcFBIUEV4Y2VsCgkgKiBAcmV0dXJuIAlzdHJpbmcgCQlYTUwgT3V0cHV0CgkgKiBAdGhyb3dzIAlFeGNlcHRpb24KCSAqLwoJcHVibGljIGZ1bmN0aW9uIHdyaXRlRG9jUHJvcHNDdXN0b20oUEhQRXhjZWwgJHBQSFBFeGNlbCA9IG51bGwpCgl7CgkJJGN1c3RvbVByb3BlcnR5TGlzdCA9ICRwUEhQRXhjZWwtPmdldFByb3BlcnRpZXMoKS0+Z2V0Q3VzdG9tUHJvcGVydGllcygpOwoJCWlmIChlbXB0eSgkY3VzdG9tUHJvcGVydHlMaXN0KSkgewoJCQlyZXR1cm47CgkJfQoKCQkvLyBDcmVhdGUgWE1MIHdyaXRlcgoJCSRvYmpXcml0ZXIgPSBudWxsOwoJCWlmICgkdGhpcy0+Z2V0UGFyZW50V3JpdGVyKCktPmdldFVzZURpc2tDYWNoaW5nKCkpIHsKCQkJJG9ialdyaXRlciA9IG5ldyBQSFBFeGNlbF9TaGFyZWRfWE1MV3JpdGVyKFBIUEV4Y2VsX1NoYXJlZF9YTUxXcml0ZXI6OlNUT1JBR0VfRElTSywgJHRoaXMtPmdldFBhcmVudFdyaXRlcigpLT5nZXREaXNrQ2FjaGluZ0RpcmVjdG9yeSgpKTsKCQl9IGVsc2UgewoJCQkkb2JqV3JpdGVyID0gbmV3IFBIUEV4Y2VsX1NoYXJlZF9YTUxXcml0ZXIoUEhQRXhjZWxfU2hhcmVkX1hNTFdyaXRlcjo6U1RPUkFHRV9NRU1PUlkpOwoJCX0KCgkJLy8gWE1MIGhlYWRlcgoJCSRvYmpXcml0ZXItPnN0YXJ0RG9jdW1lbnQoJzEuMCcsJ1VURi04JywneWVzJyk7CgoJCS8vIGNwOmNvcmVQcm9wZXJ0aWVzCgkJJG9ialdyaXRlci0+c3RhcnRFbGVtZW50KCdQcm9wZXJ0aWVzJyk7CgkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCd4bWxucycsICdodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvb2ZmaWNlRG9jdW1lbnQvMjAwNi9jdXN0b20tcHJvcGVydGllcycpOwoJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgneG1sbnM6dnQnLCAnaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL29mZmljZURvY3VtZW50LzIwMDYvZG9jUHJvcHNWVHlwZXMnKTsKCgoJCQlmb3JlYWNoKCRjdXN0b21Qcm9wZXJ0eUxpc3QgYXMgJGtleSA9PiAkY3VzdG9tUHJvcGVydHkpIHsKCQkJCSRwcm9wZXJ0eVZhbHVlID0gJHBQSFBFeGNlbC0+Z2V0UHJvcGVydGllcygpLT5nZXRDdXN0b21Qcm9wZXJ0eVZhbHVlKCRjdXN0b21Qcm9wZXJ0eSk7CgkJCQkkcHJvcGVydHlUeXBlID0gJHBQSFBFeGNlbC0+Z2V0UHJvcGVydGllcygpLT5nZXRDdXN0b21Qcm9wZXJ0eVR5cGUoJGN1c3RvbVByb3BlcnR5KTsKCgkJCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ3Byb3BlcnR5Jyk7CgkJCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ2ZtdGlkJywgCSd7RDVDREQ1MDUtMkU5Qy0xMDFCLTkzOTctMDgwMDJCMkNGOUFFfScpOwoJCQkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCdwaWQnLCAJCSRrZXkrMik7CgkJCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ25hbWUnLCAJCSRjdXN0b21Qcm9wZXJ0eSk7CgoJCQkJCXN3aXRjaCgkcHJvcGVydHlUeXBlKSB7CgkJCQkJCWNhc2UgJ2knIDoKCQkJCQkJCSRvYmpXcml0ZXItPndyaXRlRWxlbWVudCgndnQ6aTQnLCAJCSRwcm9wZXJ0eVZhbHVlKTsKCQkJCQkJCWJyZWFrOwoJCQkJCQljYXNlICdmJyA6CgkJCQkJCQkkb2JqV3JpdGVyLT53cml0ZUVsZW1lbnQoJ3Z0OnI4JywgCQkkcHJvcGVydHlWYWx1ZSk7CgkJCQkJCQlicmVhazsKCQkJCQkJY2FzZSAnYicgOgoJCQkJCQkJJG9ialdyaXRlci0+d3JpdGVFbGVtZW50KCd2dDpib29sJywgCSgkcHJvcGVydHlWYWx1ZSkgPyAndHJ1ZScgOiAnZmFsc2UnKTsKCQkJCQkJCWJyZWFrOwoJCQkJCQljYXNlICdkJyA6CgkJCQkJCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ3Z0OmZpbGV0aW1lJyk7CgkJCQkJCQkJJG9ialdyaXRlci0+d3JpdGVSYXdEYXRhKGRhdGUoREFURV9XM0MsICRwcm9wZXJ0eVZhbHVlKSk7CgkJCQkJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgkJCQkJCQlicmVhazsKCQkJCQkJZGVmYXVsdCA6CgkJCQkJCQkkb2JqV3JpdGVyLT53cml0ZUVsZW1lbnQoJ3Z0Omxwd3N0cicsIAkkcHJvcGVydHlWYWx1ZSk7CgkJCQkJCQlicmVhazsKCQkJCQl9CgoJCQkJJG9ialdyaXRlci0+ZW5kRWxlbWVudCgpOwoJCQl9CgoKCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgoJCS8vIFJldHVybgoJCXJldHVybiAkb2JqV3JpdGVyLT5nZXREYXRhKCk7Cgl9Cgp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Writer/Excel2007/Drawing.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIFBIUEV4Y2VsCiAqCiAqIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICoKICogQGNhdGVnb3J5ICAgUEhQRXhjZWwKICogQHBhY2thZ2UgICAgUEhQRXhjZWxfV3JpdGVyX0V4Y2VsMjAwNwogKiBAY29weXJpZ2h0ICBDb3B5cmlnaHQgKGMpIDIwMDYgLSAyMDEyIFBIUEV4Y2VsIChodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9QSFBFeGNlbCkKICogQGxpY2Vuc2UgICAgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL29sZC1saWNlbnNlcy9sZ3BsLTIuMS50eHQJTEdQTAogKiBAdmVyc2lvbiAgICAxLjcuNywgMjAxMi0wNS0xOQogKi8KCgovKioKICogUEhQRXhjZWxfV3JpdGVyX0V4Y2VsMjAwN19EcmF3aW5nCiAqCiAqIEBjYXRlZ29yeSAgIFBIUEV4Y2VsCiAqIEBwYWNrYWdlICAgIFBIUEV4Y2VsX1dyaXRlcl9FeGNlbDIwMDcKICogQGNvcHlyaWdodCAgQ29weXJpZ2h0IChjKSAyMDA2IC0gMjAxMiBQSFBFeGNlbCAoaHR0cDovL3d3dy5jb2RlcGxleC5jb20vUEhQRXhjZWwpCiAqLwpjbGFzcyBQSFBFeGNlbF9Xcml0ZXJfRXhjZWwyMDA3X0RyYXdpbmcgZXh0ZW5kcyBQSFBFeGNlbF9Xcml0ZXJfRXhjZWwyMDA3X1dyaXRlclBhcnQKewoJLyoqCgkgKiBXcml0ZSBkcmF3aW5ncyB0byBYTUwgZm9ybWF0CgkgKgoJICogQHBhcmFtIAlQSFBFeGNlbF9Xb3Jrc2hlZXQJJHBXb3Jrc2hlZXQKCSAqIEBwYXJhbQlpbnQJCQkJCSYkY2hhcnRSZWYJCUNoYXJ0IElECgkgKiBAcGFyYW0JYm9vbGVhbgkJCQkkaW5jbHVkZUNoYXJ0cwlGbGFnIGluZGljYXRpbmcgaWYgd2Ugc2hvdWxkIGluY2x1ZGUgZHJhd2luZyBkZXRhaWxzIGZvciBjaGFydHMKCSAqIEByZXR1cm4gCXN0cmluZyAJCQkJWE1MIE91dHB1dAoJICogQHRocm93cyAJRXhjZXB0aW9uCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiB3cml0ZURyYXdpbmdzKFBIUEV4Y2VsX1dvcmtzaGVldCAkcFdvcmtzaGVldCA9IG51bGwsICYkY2hhcnRSZWYsICRpbmNsdWRlQ2hhcnRzID0gRkFMU0UpCgl7CgkJLy8gQ3JlYXRlIFhNTCB3cml0ZXIKCQkkb2JqV3JpdGVyID0gbnVsbDsKCQlpZiAoJHRoaXMtPmdldFBhcmVudFdyaXRlcigpLT5nZXRVc2VEaXNrQ2FjaGluZygpKSB7CgkJCSRvYmpXcml0ZXIgPSBuZXcgUEhQRXhjZWxfU2hhcmVkX1hNTFdyaXRlcihQSFBFeGNlbF9TaGFyZWRfWE1MV3JpdGVyOjpTVE9SQUdFX0RJU0ssICR0aGlzLT5nZXRQYXJlbnRXcml0ZXIoKS0+Z2V0RGlza0NhY2hpbmdEaXJlY3RvcnkoKSk7CgkJfSBlbHNlIHsKCQkJJG9ialdyaXRlciA9IG5ldyBQSFBFeGNlbF9TaGFyZWRfWE1MV3JpdGVyKFBIUEV4Y2VsX1NoYXJlZF9YTUxXcml0ZXI6OlNUT1JBR0VfTUVNT1JZKTsKCQl9CgoJCS8vIFhNTCBoZWFkZXIKCQkkb2JqV3JpdGVyLT5zdGFydERvY3VtZW50KCcxLjAnLCdVVEYtOCcsJ3llcycpOwoKCQkvLyB4ZHI6d3NEcgoJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgneGRyOndzRHInKTsKCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgneG1sbnM6eGRyJywgJ2h0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9kcmF3aW5nbWwvMjAwNi9zcHJlYWRzaGVldERyYXdpbmcnKTsKCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgneG1sbnM6YScsICdodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvZHJhd2luZ21sLzIwMDYvbWFpbicpOwoKCQkJLy8gTG9vcCB0aHJvdWdoIGltYWdlcyBhbmQgd3JpdGUgZHJhd2luZ3MKCQkJJGkgPSAxOwoJCQkkaXRlcmF0b3IgPSAkcFdvcmtzaGVldC0+Z2V0RHJhd2luZ0NvbGxlY3Rpb24oKS0+Z2V0SXRlcmF0b3IoKTsKCQkJd2hpbGUgKCRpdGVyYXRvci0+dmFsaWQoKSkgewoJCQkJJHRoaXMtPl93cml0ZURyYXdpbmcoJG9ialdyaXRlciwgJGl0ZXJhdG9yLT5jdXJyZW50KCksICRpKTsKCgkJCQkkaXRlcmF0b3ItPm5leHQoKTsKCQkJCSsrJGk7CgkJCX0KCgkJCWlmICgkaW5jbHVkZUNoYXJ0cykgewoJCQkJJGNoYXJ0Q291bnQgPSAkcFdvcmtzaGVldC0+Z2V0Q2hhcnRDb3VudCgpOwoJCQkJLy8gTG9vcCB0aHJvdWdoIGNoYXJ0cyBhbmQgd3JpdGUgdGhlIGNoYXJ0IHBvc2l0aW9uCgkJCQlpZiAoJGNoYXJ0Q291bnQgPiAwKSB7CgkJCQkJZm9yICgkYyA9IDA7ICRjIDwgJGNoYXJ0Q291bnQ7ICsrJGMpIHsKCQkJCQkJJHRoaXMtPl93cml0ZUNoYXJ0KCRvYmpXcml0ZXIsICRwV29ya3NoZWV0LT5nZXRDaGFydEJ5SW5kZXgoJGMpLCAkYyskaSk7CgkJCQkJfQoJCQkJfQoJCQl9CgoKCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgoJCS8vIFJldHVybgoJCXJldHVybiAkb2JqV3JpdGVyLT5nZXREYXRhKCk7Cgl9CgoJLyoqCgkgKiBXcml0ZSBkcmF3aW5ncyB0byBYTUwgZm9ybWF0CgkgKgoJICogQHBhcmFtIAlQSFBFeGNlbF9TaGFyZWRfWE1MV3JpdGVyCSRvYmpXcml0ZXIgCQlYTUwgV3JpdGVyCgkgKiBAcGFyYW0gCVBIUEV4Y2VsX0NoYXJ0CQkJCSRwQ2hhcnQKCSAqIEBwYXJhbSAJaW50CQkJCQkJCSRwUmVsYXRpb25JZAoJICogQHRocm93cyAJRXhjZXB0aW9uCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBfd3JpdGVDaGFydChQSFBFeGNlbF9TaGFyZWRfWE1MV3JpdGVyICRvYmpXcml0ZXIgPSBudWxsLCBQSFBFeGNlbF9DaGFydCAkcENoYXJ0ID0gbnVsbCwgJHBSZWxhdGlvbklkID0gLTEpCgl7CgkJJHRsID0gJHBDaGFydC0+Z2V0VG9wTGVmdFBvc2l0aW9uKCk7CgkJJHRsWydjb2xSb3cnXSA9IFBIUEV4Y2VsX0NlbGw6OmNvb3JkaW5hdGVGcm9tU3RyaW5nKCR0bFsnY2VsbCddKTsKCQkkYnIgPSAkcENoYXJ0LT5nZXRCb3R0b21SaWdodFBvc2l0aW9uKCk7CgkJJGJyWydjb2xSb3cnXSA9IFBIUEV4Y2VsX0NlbGw6OmNvb3JkaW5hdGVGcm9tU3RyaW5nKCRiclsnY2VsbCddKTsKCgkJJG9ialdyaXRlci0+c3RhcnRFbGVtZW50KCd4ZHI6dHdvQ2VsbEFuY2hvcicpOwoKCQkJJG9ialdyaXRlci0+c3RhcnRFbGVtZW50KCd4ZHI6ZnJvbScpOwoJCQkJJG9ialdyaXRlci0+d3JpdGVFbGVtZW50KCd4ZHI6Y29sJywgUEhQRXhjZWxfQ2VsbDo6Y29sdW1uSW5kZXhGcm9tU3RyaW5nKCR0bFsnY29sUm93J11bMF0pIC0gMSk7CgkJCQkkb2JqV3JpdGVyLT53cml0ZUVsZW1lbnQoJ3hkcjpjb2xPZmYnLCBQSFBFeGNlbF9TaGFyZWRfRHJhd2luZzo6cGl4ZWxzVG9FTVUoJHRsWyd4T2Zmc2V0J10pKTsKCQkJCSRvYmpXcml0ZXItPndyaXRlRWxlbWVudCgneGRyOnJvdycsICR0bFsnY29sUm93J11bMV0gLSAxKTsKCQkJCSRvYmpXcml0ZXItPndyaXRlRWxlbWVudCgneGRyOnJvd09mZicsIFBIUEV4Y2VsX1NoYXJlZF9EcmF3aW5nOjpwaXhlbHNUb0VNVSgkdGxbJ3lPZmZzZXQnXSkpOwoJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgkJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgneGRyOnRvJyk7CgkJCQkkb2JqV3JpdGVyLT53cml0ZUVsZW1lbnQoJ3hkcjpjb2wnLCBQSFBFeGNlbF9DZWxsOjpjb2x1bW5JbmRleEZyb21TdHJpbmcoJGJyWydjb2xSb3cnXVswXSkgLSAxKTsKCQkJCSRvYmpXcml0ZXItPndyaXRlRWxlbWVudCgneGRyOmNvbE9mZicsIFBIUEV4Y2VsX1NoYXJlZF9EcmF3aW5nOjpwaXhlbHNUb0VNVSgkYnJbJ3hPZmZzZXQnXSkpOwoJCQkJJG9ialdyaXRlci0+d3JpdGVFbGVtZW50KCd4ZHI6cm93JywgJGJyWydjb2xSb3cnXVsxXSAtIDEpOwoJCQkJJG9ialdyaXRlci0+d3JpdGVFbGVtZW50KCd4ZHI6cm93T2ZmJywgUEhQRXhjZWxfU2hhcmVkX0RyYXdpbmc6OnBpeGVsc1RvRU1VKCRiclsneU9mZnNldCddKSk7CgkJCSRvYmpXcml0ZXItPmVuZEVsZW1lbnQoKTsKCgkJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgneGRyOmdyYXBoaWNGcmFtZScpOwoJCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ21hY3JvJywgJycpOwoJCQkJJG9ialdyaXRlci0+c3RhcnRFbGVtZW50KCd4ZHI6bnZHcmFwaGljRnJhbWVQcicpOwoJCQkJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgneGRyOmNOdlByJyk7CgkJCQkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCduYW1lJywgJ0NoYXJ0ICcuJHBSZWxhdGlvbklkKTsKCQkJCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ2lkJywgMTAyNSAqICRwUmVsYXRpb25JZCk7CgkJCQkJJG9ialdyaXRlci0+ZW5kRWxlbWVudCgpOwoJCQkJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgneGRyOmNOdkdyYXBoaWNGcmFtZVByJyk7CgkJCQkJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgnYTpncmFwaGljRnJhbWVMb2NrcycpOwoJCQkJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgkJCQkJJG9ialdyaXRlci0+ZW5kRWxlbWVudCgpOwoJCQkJJG9ialdyaXRlci0+ZW5kRWxlbWVudCgpOwoKCQkJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgneGRyOnhmcm0nKTsKCQkJCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ2E6b2ZmJyk7CgkJCQkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCd4JywgJzAnKTsKCQkJCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ3knLCAnMCcpOwoJCQkJCSRvYmpXcml0ZXItPmVuZEVsZW1lbnQoKTsKCQkJCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ2E6ZXh0Jyk7CgkJCQkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCdjeCcsICcwJyk7CgkJCQkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCdjeScsICcwJyk7CgkJCQkJJG9ialdyaXRlci0+ZW5kRWxlbWVudCgpOwoJCQkJJG9ialdyaXRlci0+ZW5kRWxlbWVudCgpOwoKCQkJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgnYTpncmFwaGljJyk7CgkJCQkJJG9ialdyaXRlci0+c3RhcnRFbGVtZW50KCdhOmdyYXBoaWNEYXRhJyk7CgkJCQkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCd1cmknLCAnaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL2RyYXdpbmdtbC8yMDA2L2NoYXJ0Jyk7CgkJCQkJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgnYzpjaGFydCcpOwoJCQkJCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ3htbG5zOmMnLCAnaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL2RyYXdpbmdtbC8yMDA2L2NoYXJ0Jyk7CgkJCQkJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgneG1sbnM6cicsICdodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvb2ZmaWNlRG9jdW1lbnQvMjAwNi9yZWxhdGlvbnNoaXBzJyk7CgkJCQkJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgncjppZCcsICdySWQnLiRwUmVsYXRpb25JZCk7CgkJCQkJCSRvYmpXcml0ZXItPmVuZEVsZW1lbnQoKTsKCQkJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgkJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgkJCSRvYmpXcml0ZXItPmVuZEVsZW1lbnQoKTsKCgkJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgneGRyOmNsaWVudERhdGEnKTsKCQkJJG9ialdyaXRlci0+ZW5kRWxlbWVudCgpOwoKCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7Cgl9CgoJLyoqCgkgKiBXcml0ZSBkcmF3aW5ncyB0byBYTUwgZm9ybWF0CgkgKgoJICogQHBhcmFtIAlQSFBFeGNlbF9TaGFyZWRfWE1MV3JpdGVyCQkJJG9ialdyaXRlciAJCVhNTCBXcml0ZXIKCSAqIEBwYXJhbSAJUEhQRXhjZWxfV29ya3NoZWV0X0Jhc2VEcmF3aW5nCQkkcERyYXdpbmcKCSAqIEBwYXJhbSAJaW50CQkJCQkJCQkJJHBSZWxhdGlvbklkCgkgKiBAdGhyb3dzIAlFeGNlcHRpb24KCSAqLwoJcHVibGljIGZ1bmN0aW9uIF93cml0ZURyYXdpbmcoUEhQRXhjZWxfU2hhcmVkX1hNTFdyaXRlciAkb2JqV3JpdGVyID0gbnVsbCwgUEhQRXhjZWxfV29ya3NoZWV0X0Jhc2VEcmF3aW5nICRwRHJhd2luZyA9IG51bGwsICRwUmVsYXRpb25JZCA9IC0xKQoJewoJCWlmICgkcFJlbGF0aW9uSWQgPj0gMCkgewoJCQkvLyB4ZHI6b25lQ2VsbEFuY2hvcgoJCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ3hkcjpvbmVDZWxsQW5jaG9yJyk7CgkJCQkvLyBJbWFnZSBsb2NhdGlvbgoJCQkJJGFDb29yZGluYXRlcyAJCT0gUEhQRXhjZWxfQ2VsbDo6Y29vcmRpbmF0ZUZyb21TdHJpbmcoJHBEcmF3aW5nLT5nZXRDb29yZGluYXRlcygpKTsKCQkJCSRhQ29vcmRpbmF0ZXNbMF0gCT0gUEhQRXhjZWxfQ2VsbDo6Y29sdW1uSW5kZXhGcm9tU3RyaW5nKCRhQ29vcmRpbmF0ZXNbMF0pOwoKCQkJCS8vIHhkcjpmcm9tCgkJCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ3hkcjpmcm9tJyk7CgkJCQkJJG9ialdyaXRlci0+d3JpdGVFbGVtZW50KCd4ZHI6Y29sJywgJGFDb29yZGluYXRlc1swXSAtIDEpOwoJCQkJCSRvYmpXcml0ZXItPndyaXRlRWxlbWVudCgneGRyOmNvbE9mZicsIFBIUEV4Y2VsX1NoYXJlZF9EcmF3aW5nOjpwaXhlbHNUb0VNVSgkcERyYXdpbmctPmdldE9mZnNldFgoKSkpOwoJCQkJCSRvYmpXcml0ZXItPndyaXRlRWxlbWVudCgneGRyOnJvdycsICRhQ29vcmRpbmF0ZXNbMV0gLSAxKTsKCQkJCQkkb2JqV3JpdGVyLT53cml0ZUVsZW1lbnQoJ3hkcjpyb3dPZmYnLCBQSFBFeGNlbF9TaGFyZWRfRHJhd2luZzo6cGl4ZWxzVG9FTVUoJHBEcmF3aW5nLT5nZXRPZmZzZXRZKCkpKTsKCQkJCSRvYmpXcml0ZXItPmVuZEVsZW1lbnQoKTsKCgkJCQkvLyB4ZHI6ZXh0CgkJCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ3hkcjpleHQnKTsKCQkJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgnY3gnLCBQSFBFeGNlbF9TaGFyZWRfRHJhd2luZzo6cGl4ZWxzVG9FTVUoJHBEcmF3aW5nLT5nZXRXaWR0aCgpKSk7CgkJCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ2N5JywgUEhQRXhjZWxfU2hhcmVkX0RyYXdpbmc6OnBpeGVsc1RvRU1VKCRwRHJhd2luZy0+Z2V0SGVpZ2h0KCkpKTsKCQkJCSRvYmpXcml0ZXItPmVuZEVsZW1lbnQoKTsKCgkJCQkvLyB4ZHI6cGljCgkJCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ3hkcjpwaWMnKTsKCgkJCQkJLy8geGRyOm52UGljUHIKCQkJCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ3hkcjpudlBpY1ByJyk7CgoJCQkJCQkvLyB4ZHI6Y052UHIKCQkJCQkJJG9ialdyaXRlci0+c3RhcnRFbGVtZW50KCd4ZHI6Y052UHInKTsKCQkJCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ2lkJywgJHBSZWxhdGlvbklkKTsKCQkJCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ25hbWUnLCAkcERyYXdpbmctPmdldE5hbWUoKSk7CgkJCQkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCdkZXNjcicsICRwRHJhd2luZy0+Z2V0RGVzY3JpcHRpb24oKSk7CgkJCQkJCSRvYmpXcml0ZXItPmVuZEVsZW1lbnQoKTsKCgkJCQkJCS8vIHhkcjpjTnZQaWNQcgoJCQkJCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ3hkcjpjTnZQaWNQcicpOwoKCQkJCQkJCS8vIGE6cGljTG9ja3MKCQkJCQkJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgnYTpwaWNMb2NrcycpOwoJCQkJCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ25vQ2hhbmdlQXNwZWN0JywgJzEnKTsKCQkJCQkJCSRvYmpXcml0ZXItPmVuZEVsZW1lbnQoKTsKCgkJCQkJCSRvYmpXcml0ZXItPmVuZEVsZW1lbnQoKTsKCgkJCQkJJG9ialdyaXRlci0+ZW5kRWxlbWVudCgpOwoKCQkJCQkvLyB4ZHI6YmxpcEZpbGwKCQkJCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ3hkcjpibGlwRmlsbCcpOwoKCQkJCQkJLy8gYTpibGlwCgkJCQkJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgnYTpibGlwJyk7CgkJCQkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCd4bWxuczpyJywgJ2h0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9vZmZpY2VEb2N1bWVudC8yMDA2L3JlbGF0aW9uc2hpcHMnKTsKCQkJCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ3I6ZW1iZWQnLCAncklkJyAuICRwUmVsYXRpb25JZCk7CgkJCQkJCSRvYmpXcml0ZXItPmVuZEVsZW1lbnQoKTsKCgkJCQkJCS8vIGE6c3RyZXRjaAoJCQkJCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ2E6c3RyZXRjaCcpOwoJCQkJCQkJJG9ialdyaXRlci0+d3JpdGVFbGVtZW50KCdhOmZpbGxSZWN0JywgbnVsbCk7CgkJCQkJCSRvYmpXcml0ZXItPmVuZEVsZW1lbnQoKTsKCgkJCQkJJG9ialdyaXRlci0+ZW5kRWxlbWVudCgpOwoKCQkJCQkvLyB4ZHI6c3BQcgoJCQkJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgneGRyOnNwUHInKTsKCgkJCQkJCS8vIGE6eGZybQoJCQkJCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ2E6eGZybScpOwoJCQkJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgncm90JywgUEhQRXhjZWxfU2hhcmVkX0RyYXdpbmc6OmRlZ3JlZXNUb0FuZ2xlKCRwRHJhd2luZy0+Z2V0Um90YXRpb24oKSkpOwoJCQkJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgoJCQkJCQkvLyBhOnByc3RHZW9tCgkJCQkJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgnYTpwcnN0R2VvbScpOwoJCQkJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgncHJzdCcsICdyZWN0Jyk7CgoJCQkJCQkJLy8gYTphdkxzdAoJCQkJCQkJJG9ialdyaXRlci0+d3JpdGVFbGVtZW50KCdhOmF2THN0JywgbnVsbCk7CgoJCQkJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgovLwkJCQkJCS8vIGE6c29saWRGaWxsCi8vCQkJCQkJJG9ialdyaXRlci0+c3RhcnRFbGVtZW50KCdhOnNvbGlkRmlsbCcpOwoKLy8JCQkJCQkJLy8gYTpzcmdiQ2xyCi8vCQkJCQkJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgnYTpzcmdiQ2xyJyk7Ci8vCQkJCQkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCd2YWwnLCAnRkZGRkZGJyk7CgovLy8qIFNIQURFCi8vCQkJCQkJCQkvLyBhOnNoYWRlCi8vCQkJCQkJCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ2E6c2hhZGUnKTsKLy8JCQkJCQkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCd2YWwnLCAnODUwMDAnKTsKLy8JCQkJCQkJCSRvYmpXcml0ZXItPmVuZEVsZW1lbnQoKTsKLy8qLwoKLy8JCQkJCQkJJG9ialdyaXRlci0+ZW5kRWxlbWVudCgpOwoKLy8JCQkJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7Ci8qCgkJCQkJCS8vIGE6bG4KCQkJCQkJJG9ialdyaXRlci0+c3RhcnRFbGVtZW50KCdhOmxuJyk7CgkJCQkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCd3JywgJzg4OTAwJyk7CgkJCQkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCdjYXAnLCAnc3EnKTsKCgkJCQkJCQkvLyBhOnNvbGlkRmlsbAoJCQkJCQkJJG9ialdyaXRlci0+c3RhcnRFbGVtZW50KCdhOnNvbGlkRmlsbCcpOwoKCQkJCQkJCQkvLyBhOnNyZ2JDbHIKCQkJCQkJCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ2E6c3JnYkNscicpOwoJCQkJCQkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCd2YWwnLCAnRkZGRkZGJyk7CgkJCQkJCQkJJG9ialdyaXRlci0+ZW5kRWxlbWVudCgpOwoKCQkJCQkJCSRvYmpXcml0ZXItPmVuZEVsZW1lbnQoKTsKCgkJCQkJCQkvLyBhOm1pdGVyCgkJCQkJCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ2E6bWl0ZXInKTsKCQkJCQkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCdsaW0nLCAnODAwMDAwJyk7CgkJCQkJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgoJCQkJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CiovCgoJCQkJCQlpZiAoJHBEcmF3aW5nLT5nZXRTaGFkb3coKS0+Z2V0VmlzaWJsZSgpKSB7CgkJCQkJCQkvLyBhOmVmZmVjdExzdAoJCQkJCQkJJG9ialdyaXRlci0+c3RhcnRFbGVtZW50KCdhOmVmZmVjdExzdCcpOwoKCQkJCQkJCQkvLyBhOm91dGVyU2hkdwoJCQkJCQkJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgnYTpvdXRlclNoZHcnKTsKCQkJCQkJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgnYmx1clJhZCcsIAkJUEhQRXhjZWxfU2hhcmVkX0RyYXdpbmc6OnBpeGVsc1RvRU1VKCRwRHJhd2luZy0+Z2V0U2hhZG93KCktPmdldEJsdXJSYWRpdXMoKSkpOwoJCQkJCQkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCdkaXN0JywJCQlQSFBFeGNlbF9TaGFyZWRfRHJhd2luZzo6cGl4ZWxzVG9FTVUoJHBEcmF3aW5nLT5nZXRTaGFkb3coKS0+Z2V0RGlzdGFuY2UoKSkpOwoJCQkJCQkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCdkaXInLAkJCVBIUEV4Y2VsX1NoYXJlZF9EcmF3aW5nOjpkZWdyZWVzVG9BbmdsZSgkcERyYXdpbmctPmdldFNoYWRvdygpLT5nZXREaXJlY3Rpb24oKSkpOwoJCQkJCQkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCdhbGduJywJCQkkcERyYXdpbmctPmdldFNoYWRvdygpLT5nZXRBbGlnbm1lbnQoKSk7CgkJCQkJCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ3JvdFdpdGhTaGFwZScsIAknMCcpOwoKCQkJCQkJCQkJLy8gYTpzcmdiQ2xyCgkJCQkJCQkJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgnYTpzcmdiQ2xyJyk7CgkJCQkJCQkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCd2YWwnLAkJJHBEcmF3aW5nLT5nZXRTaGFkb3coKS0+Z2V0Q29sb3IoKS0+Z2V0UkdCKCkpOwoKCQkJCQkJCQkJCS8vIGE6YWxwaGEKCQkJCQkJCQkJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgnYTphbHBoYScpOwoJCQkJCQkJCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ3ZhbCcsIAkkcERyYXdpbmctPmdldFNoYWRvdygpLT5nZXRBbHBoYSgpICogMTAwMCk7CgkJCQkJCQkJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgoJCQkJCQkJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgoJCQkJCQkJCSRvYmpXcml0ZXItPmVuZEVsZW1lbnQoKTsKCgkJCQkJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgkJCQkJCX0KLyoKCgkJCQkJCS8vIGE6c2NlbmUzZAoJCQkJCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ2E6c2NlbmUzZCcpOwoKCQkJCQkJCS8vIGE6Y2FtZXJhCgkJCQkJCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ2E6Y2FtZXJhJyk7CgkJCQkJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgncHJzdCcsICdvcnRob2dyYXBoaWNGcm9udCcpOwoJCQkJCQkJJG9ialdyaXRlci0+ZW5kRWxlbWVudCgpOwoKCQkJCQkJCS8vIGE6bGlnaHRSaWcKCQkJCQkJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgnYTpsaWdodFJpZycpOwoJCQkJCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ3JpZycsICd0d29QdCcpOwoJCQkJCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ2RpcicsICd0Jyk7CgoJCQkJCQkJCS8vIGE6cm90CgkJCQkJCQkJJG9ialdyaXRlci0+c3RhcnRFbGVtZW50KCdhOnJvdCcpOwoJCQkJCQkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCdsYXQnLCAnMCcpOwoJCQkJCQkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCdsb24nLCAnMCcpOwoJCQkJCQkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCdyZXYnLCAnMCcpOwoJCQkJCQkJCSRvYmpXcml0ZXItPmVuZEVsZW1lbnQoKTsKCgkJCQkJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgoJCQkJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CiovCi8qCgkJCQkJCS8vIGE6c3AzZAoJCQkJCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ2E6c3AzZCcpOwoKCQkJCQkJCS8vIGE6YmV2ZWxUCgkJCQkJCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ2E6YmV2ZWxUJyk7CgkJCQkJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgndycsICcyNTQwMCcpOwoJCQkJCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ2gnLCAnMTkwNTAnKTsKCQkJCQkJCSRvYmpXcml0ZXItPmVuZEVsZW1lbnQoKTsKCgkJCQkJCQkvLyBhOmNvbnRvdXJDbHIKCQkJCQkJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgnYTpjb250b3VyQ2xyJyk7CgoJCQkJCQkJCS8vIGE6c3JnYkNscgoJCQkJCQkJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgnYTpzcmdiQ2xyJyk7CgkJCQkJCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ3ZhbCcsICdGRkZGRkYnKTsKCQkJCQkJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgoJCQkJCQkJJG9ialdyaXRlci0+ZW5kRWxlbWVudCgpOwoKCQkJCQkJJG9ialdyaXRlci0+ZW5kRWxlbWVudCgpOwoqLwoJCQkJCSRvYmpXcml0ZXItPmVuZEVsZW1lbnQoKTsKCgkJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgoJCQkJLy8geGRyOmNsaWVudERhdGEKCQkJCSRvYmpXcml0ZXItPndyaXRlRWxlbWVudCgneGRyOmNsaWVudERhdGEnLCBudWxsKTsKCgkJCSRvYmpXcml0ZXItPmVuZEVsZW1lbnQoKTsKCQl9IGVsc2UgewoJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCJJbnZhbGlkIHBhcmFtZXRlcnMgcGFzc2VkLiIpOwoJCX0KCX0KCgkvKioKCSAqIFdyaXRlIFZNTCBoZWFkZXIvZm9vdGVyIGltYWdlcyB0byBYTUwgZm9ybWF0CgkgKgoJICogQHBhcmFtIAlQSFBFeGNlbF9Xb3Jrc2hlZXQJCQkJJHBXb3Jrc2hlZXQKCSAqIEByZXR1cm4gCXN0cmluZyAJCQkJCQkJCVhNTCBPdXRwdXQKCSAqIEB0aHJvd3MgCUV4Y2VwdGlvbgoJICovCglwdWJsaWMgZnVuY3Rpb24gd3JpdGVWTUxIZWFkZXJGb290ZXJJbWFnZXMoUEhQRXhjZWxfV29ya3NoZWV0ICRwV29ya3NoZWV0ID0gbnVsbCkKCXsKCQkvLyBDcmVhdGUgWE1MIHdyaXRlcgoJCSRvYmpXcml0ZXIgPSBudWxsOwoJCWlmICgkdGhpcy0+Z2V0UGFyZW50V3JpdGVyKCktPmdldFVzZURpc2tDYWNoaW5nKCkpIHsKCQkJJG9ialdyaXRlciA9IG5ldyBQSFBFeGNlbF9TaGFyZWRfWE1MV3JpdGVyKFBIUEV4Y2VsX1NoYXJlZF9YTUxXcml0ZXI6OlNUT1JBR0VfRElTSywgJHRoaXMtPmdldFBhcmVudFdyaXRlcigpLT5nZXREaXNrQ2FjaGluZ0RpcmVjdG9yeSgpKTsKCQl9IGVsc2UgewoJCQkkb2JqV3JpdGVyID0gbmV3IFBIUEV4Y2VsX1NoYXJlZF9YTUxXcml0ZXIoUEhQRXhjZWxfU2hhcmVkX1hNTFdyaXRlcjo6U1RPUkFHRV9NRU1PUlkpOwoJCX0KCgkJLy8gWE1MIGhlYWRlcgoJCSRvYmpXcml0ZXItPnN0YXJ0RG9jdW1lbnQoJzEuMCcsJ1VURi04JywneWVzJyk7CgogIAkJLy8gSGVhZGVyL2Zvb3RlciBpbWFnZXMKICAJCSRpbWFnZXMgPSAkcFdvcmtzaGVldC0+Z2V0SGVhZGVyRm9vdGVyKCktPmdldEltYWdlcygpOwoKCQkvLyB4bWwKCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ3htbCcpOwoJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCd4bWxuczp2JywgJ3VybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206dm1sJyk7CgkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ3htbG5zOm8nLCAndXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlJyk7CgkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ3htbG5zOngnLCAndXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6ZXhjZWwnKTsKCgkJCS8vIG86c2hhcGVsYXlvdXQKCQkJJG9ialdyaXRlci0+c3RhcnRFbGVtZW50KCdvOnNoYXBlbGF5b3V0Jyk7CgkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCd2OmV4dCcsIAkJJ2VkaXQnKTsKCgkJCQkvLyBvOmlkbWFwCgkJCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ286aWRtYXAnKTsKCQkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCd2OmV4dCcsIAknZWRpdCcpOwoJCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ2RhdGEnLCAJCScxJyk7CgkJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgoJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgoJCQkvLyB2OnNoYXBldHlwZQoJCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ3Y6c2hhcGV0eXBlJyk7CgkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCdpZCcsIAkJCQkJJ194MDAwMF90NzUnKTsKCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ2Nvb3Jkc2l6ZScsIAkJCScyMTYwMCwyMTYwMCcpOwoJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgnbzpzcHQnLCAJCQkJJzc1Jyk7CgkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCdvOnByZWZlcnJlbGF0aXZlJywgCQkndCcpOwoJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgncGF0aCcsIAkJCQkJJ21ANEA1bEA0QDExQDlAMTFAOUA1eGUnKTsKCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ2ZpbGxlZCcsCQkgCQknZicpOwoJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgnc3Ryb2tlZCcsCQkgCQknZicpOwoKCQkJCS8vIHY6c3Ryb2tlCgkJCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ3Y6c3Ryb2tlJyk7CgkJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgnam9pbnN0eWxlJywgCQknbWl0ZXInKTsKCQkJCSRvYmpXcml0ZXItPmVuZEVsZW1lbnQoKTsKCgkJCQkvLyB2OmZvcm11bGFzCgkJCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ3Y6Zm9ybXVsYXMnKTsKCgkJCQkJLy8gdjpmCgkJCQkJJG9ialdyaXRlci0+c3RhcnRFbGVtZW50KCd2OmYnKTsKCQkJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgnZXFuJywgCQknaWYgbGluZURyYXduIHBpeGVsTGluZVdpZHRoIDAnKTsKCQkJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgoJCQkJCS8vIHY6ZgoJCQkJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgndjpmJyk7CgkJCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ2VxbicsIAkJJ3N1bSBAMCAxIDAnKTsKCQkJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgoJCQkJCS8vIHY6ZgoJCQkJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgndjpmJyk7CgkJCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ2VxbicsIAkJJ3N1bSAwIDAgQDEnKTsKCQkJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgoJCQkJCS8vIHY6ZgoJCQkJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgndjpmJyk7CgkJCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ2VxbicsIAkJJ3Byb2QgQDIgMSAyJyk7CgkJCQkJJG9ialdyaXRlci0+ZW5kRWxlbWVudCgpOwoKCQkJCQkvLyB2OmYKCQkJCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ3Y6ZicpOwoJCQkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCdlcW4nLCAJCSdwcm9kIEAzIDIxNjAwIHBpeGVsV2lkdGgnKTsKCQkJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgoJCQkJCS8vIHY6ZgoJCQkJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgndjpmJyk7CgkJCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ2VxbicsIAkJJ3Byb2QgQDMgMjE2MDAgcGl4ZWxIZWlnaHQnKTsKCQkJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgoJCQkJCS8vIHY6ZgoJCQkJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgndjpmJyk7CgkJCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ2VxbicsIAkJJ3N1bSBAMCAwIDEnKTsKCQkJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgoJCQkJCS8vIHY6ZgoJCQkJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgndjpmJyk7CgkJCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ2VxbicsIAkJJ3Byb2QgQDYgMSAyJyk7CgkJCQkJJG9ialdyaXRlci0+ZW5kRWxlbWVudCgpOwoKCQkJCQkvLyB2OmYKCQkJCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ3Y6ZicpOwoJCQkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCdlcW4nLCAJCSdwcm9kIEA3IDIxNjAwIHBpeGVsV2lkdGgnKTsKCQkJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgoJCQkJCS8vIHY6ZgoJCQkJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgndjpmJyk7CgkJCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ2VxbicsIAkJJ3N1bSBAOCAyMTYwMCAwJyk7CgkJCQkJJG9ialdyaXRlci0+ZW5kRWxlbWVudCgpOwoKCQkJCQkvLyB2OmYKCQkJCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ3Y6ZicpOwoJCQkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCdlcW4nLCAJCSdwcm9kIEA3IDIxNjAwIHBpeGVsSGVpZ2h0Jyk7CgkJCQkJJG9ialdyaXRlci0+ZW5kRWxlbWVudCgpOwoKCQkJCQkvLyB2OmYKCQkJCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ3Y6ZicpOwoJCQkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCdlcW4nLCAJCSdzdW0gQDEwIDIxNjAwIDAnKTsKCQkJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgoJCQkJJG9ialdyaXRlci0+ZW5kRWxlbWVudCgpOwoKCQkJCS8vIHY6cGF0aAoJCQkJJG9ialdyaXRlci0+c3RhcnRFbGVtZW50KCd2OnBhdGgnKTsKCQkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCdvOmV4dHJ1c2lvbm9rJywgCSdmJyk7CgkJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgnZ3JhZGllbnRzaGFwZW9rJywgCSd0Jyk7CgkJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgnbzpjb25uZWN0dHlwZScsIAkncmVjdCcpOwoJCQkJJG9ialdyaXRlci0+ZW5kRWxlbWVudCgpOwoKCQkJCS8vIG86bG9jawoJCQkJJG9ialdyaXRlci0+c3RhcnRFbGVtZW50KCdvOmxvY2snKTsKCQkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCd2OmV4dCcsIAkJCSdlZGl0Jyk7CgkJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgnYXNwZWN0cmF0aW8nLCAJCSd0Jyk7CgkJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgoJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgoJCQkvLyBMb29wIHRocm91Z2ggaW1hZ2VzCgkJCWZvcmVhY2ggKCRpbWFnZXMgYXMgJGtleSA9PiAkdmFsdWUpIHsKCQkJCSR0aGlzLT5fd3JpdGVWTUxIZWFkZXJGb290ZXJJbWFnZSgkb2JqV3JpdGVyLCAka2V5LCAkdmFsdWUpOwoJCQl9CgoJCSRvYmpXcml0ZXItPmVuZEVsZW1lbnQoKTsKCgkJLy8gUmV0dXJuCgkJcmV0dXJuICRvYmpXcml0ZXItPmdldERhdGEoKTsKCX0KCgkvKioKCSAqIFdyaXRlIFZNTCBjb21tZW50IHRvIFhNTCBmb3JtYXQKCSAqCgkgKiBAcGFyYW0gCVBIUEV4Y2VsX1NoYXJlZF9YTUxXcml0ZXIJCSRvYmpXcml0ZXIgCQkJWE1MIFdyaXRlcgoJICogQHBhcmFtCXN0cmluZwkJCQkJCQkkcFJlZmVyZW5jZQkJCVJlZmVyZW5jZQoJICogQHBhcmFtIAlQSFBFeGNlbF9Xb3Jrc2hlZXRfSGVhZGVyRm9vdGVyRHJhd2luZwkkcEltYWdlCQlJbWFnZQoJICogQHRocm93cyAJRXhjZXB0aW9uCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBfd3JpdGVWTUxIZWFkZXJGb290ZXJJbWFnZShQSFBFeGNlbF9TaGFyZWRfWE1MV3JpdGVyICRvYmpXcml0ZXIgPSBudWxsLCAkcFJlZmVyZW5jZSA9ICcnLCBQSFBFeGNlbF9Xb3Jrc2hlZXRfSGVhZGVyRm9vdGVyRHJhd2luZyAkcEltYWdlID0gbnVsbCkKCXsKCQkvLyBDYWxjdWxhdGUgb2JqZWN0IGlkCgkJcHJlZ19tYXRjaCgneyhcZCspfScsIG1kNSgkcFJlZmVyZW5jZSksICRtKTsKCQkkaWQgPSAxNTAwICsgKHN1YnN0cigkbVsxXSwgMCwgMikgKiAxKTsKCgkJLy8gQ2FsY3VsYXRlIG9mZnNldAoJCSR3aWR0aCA9ICRwSW1hZ2UtPmdldFdpZHRoKCk7CgkJJGhlaWdodCA9ICRwSW1hZ2UtPmdldEhlaWdodCgpOwoJCSRtYXJnaW5MZWZ0ID0gJHBJbWFnZS0+Z2V0T2Zmc2V0WCgpOwoJCSRtYXJnaW5Ub3AgPSAkcEltYWdlLT5nZXRPZmZzZXRZKCk7CgoJCS8vIHY6c2hhcGUKCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ3Y6c2hhcGUnKTsKCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgnaWQnLCAJCQkkcFJlZmVyZW5jZSk7CgkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ286c3BpZCcsIAkJJ194MDAwMF9zJyAuICRpZCk7CgkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ3R5cGUnLCAJCQknI194MDAwMF90NzUnKTsKCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgnc3R5bGUnLCAJCSJwb3NpdGlvbjphYnNvbHV0ZTttYXJnaW4tbGVmdDp7JG1hcmdpbkxlZnR9cHg7bWFyZ2luLXRvcDp7JG1hcmdpblRvcH1weDt3aWR0aDp7JHdpZHRofXB4O2hlaWdodDp7JGhlaWdodH1weDt6LWluZGV4OjEiKTsKCgkJCS8vIHY6aW1hZ2VkYXRhCgkJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgndjppbWFnZWRhdGEnKTsKCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ286cmVsaWQnLCAJCSdySWQnIC4gJHBSZWZlcmVuY2UpOwoJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgnbzp0aXRsZScsIAkJJHBJbWFnZS0+Z2V0TmFtZSgpKTsKCQkJJG9ialdyaXRlci0+ZW5kRWxlbWVudCgpOwoKCQkJLy8gbzpsb2NrCgkJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgnbzpsb2NrJyk7CgkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCd2OmV4dCcsIAkJJ2VkaXQnKTsKCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ3JvdGF0aW9uJywgCQkndCcpOwoJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgoJCSRvYmpXcml0ZXItPmVuZEVsZW1lbnQoKTsKCX0KCgoJLyoqCgkgKiBHZXQgYW4gYXJyYXkgb2YgYWxsIGRyYXdpbmdzCgkgKgoJICogQHBhcmFtIAlQSFBFeGNlbAkJCQkJCQkkcFBIUEV4Y2VsCgkgKiBAcmV0dXJuIAlQSFBFeGNlbF9Xb3Jrc2hlZXRfRHJhd2luZ1tdCQlBbGwgZHJhd2luZ3MgaW4gUEhQRXhjZWwKCSAqIEB0aHJvd3MgCUV4Y2VwdGlvbgoJICovCglwdWJsaWMgZnVuY3Rpb24gYWxsRHJhd2luZ3MoUEhQRXhjZWwgJHBQSFBFeGNlbCA9IG51bGwpCgl7CgkJLy8gR2V0IGFuIGFycmF5IG9mIGFsbCBkcmF3aW5ncwoJCSRhRHJhd2luZ3MJPSBhcnJheSgpOwoKCQkvLyBMb29wIHRocm91Z2ggUEhQRXhjZWwKCQkkc2hlZXRDb3VudCA9ICRwUEhQRXhjZWwtPmdldFNoZWV0Q291bnQoKTsKCQlmb3IgKCRpID0gMDsgJGkgPCAkc2hlZXRDb3VudDsgKyskaSkgewoJCQkvLyBMb29wIHRocm91Z2ggaW1hZ2VzIGFuZCBhZGQgdG8gYXJyYXkKCQkJJGl0ZXJhdG9yID0gJHBQSFBFeGNlbC0+Z2V0U2hlZXQoJGkpLT5nZXREcmF3aW5nQ29sbGVjdGlvbigpLT5nZXRJdGVyYXRvcigpOwoJCQl3aGlsZSAoJGl0ZXJhdG9yLT52YWxpZCgpKSB7CgkJCQkkYURyYXdpbmdzW10gPSAkaXRlcmF0b3ItPmN1cnJlbnQoKTsKCiAgCQkJCSRpdGVyYXRvci0+bmV4dCgpOwoJCQl9CgkJfQoKCQlyZXR1cm4gJGFEcmF3aW5nczsKCX0KfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Writer/Excel2007/Rels.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIFBIUEV4Y2VsCiAqCiAqIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICoKICogQGNhdGVnb3J5ICAgUEhQRXhjZWwKICogQHBhY2thZ2UgICAgUEhQRXhjZWxfV3JpdGVyX0V4Y2VsMjAwNwogKiBAY29weXJpZ2h0ICBDb3B5cmlnaHQgKGMpIDIwMDYgLSAyMDEyIFBIUEV4Y2VsIChodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9QSFBFeGNlbCkKICogQGxpY2Vuc2UgICAgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL29sZC1saWNlbnNlcy9sZ3BsLTIuMS50eHQJTEdQTAogKiBAdmVyc2lvbiAgICAxLjcuNywgMjAxMi0wNS0xOQogKi8KCgovKioKICogUEhQRXhjZWxfV3JpdGVyX0V4Y2VsMjAwN19SZWxzCiAqCiAqIEBjYXRlZ29yeSAgIFBIUEV4Y2VsCiAqIEBwYWNrYWdlICAgIFBIUEV4Y2VsX1dyaXRlcl9FeGNlbDIwMDcKICogQGNvcHlyaWdodCAgQ29weXJpZ2h0IChjKSAyMDA2IC0gMjAxMiBQSFBFeGNlbCAoaHR0cDovL3d3dy5jb2RlcGxleC5jb20vUEhQRXhjZWwpCiAqLwpjbGFzcyBQSFBFeGNlbF9Xcml0ZXJfRXhjZWwyMDA3X1JlbHMgZXh0ZW5kcyBQSFBFeGNlbF9Xcml0ZXJfRXhjZWwyMDA3X1dyaXRlclBhcnQKewoJLyoqCgkgKiBXcml0ZSByZWxhdGlvbnNoaXBzIHRvIFhNTCBmb3JtYXQKCSAqCgkgKiBAcGFyYW0gCVBIUEV4Y2VsCSRwUEhQRXhjZWwKCSAqIEByZXR1cm4gCXN0cmluZyAJCVhNTCBPdXRwdXQKCSAqIEB0aHJvd3MgCUV4Y2VwdGlvbgoJICovCglwdWJsaWMgZnVuY3Rpb24gd3JpdGVSZWxhdGlvbnNoaXBzKFBIUEV4Y2VsICRwUEhQRXhjZWwgPSBudWxsKQoJewoJCS8vIENyZWF0ZSBYTUwgd3JpdGVyCgkJJG9ialdyaXRlciA9IG51bGw7CgkJaWYgKCR0aGlzLT5nZXRQYXJlbnRXcml0ZXIoKS0+Z2V0VXNlRGlza0NhY2hpbmcoKSkgewoJCQkkb2JqV3JpdGVyID0gbmV3IFBIUEV4Y2VsX1NoYXJlZF9YTUxXcml0ZXIoUEhQRXhjZWxfU2hhcmVkX1hNTFdyaXRlcjo6U1RPUkFHRV9ESVNLLCAkdGhpcy0+Z2V0UGFyZW50V3JpdGVyKCktPmdldERpc2tDYWNoaW5nRGlyZWN0b3J5KCkpOwoJCX0gZWxzZSB7CgkJCSRvYmpXcml0ZXIgPSBuZXcgUEhQRXhjZWxfU2hhcmVkX1hNTFdyaXRlcihQSFBFeGNlbF9TaGFyZWRfWE1MV3JpdGVyOjpTVE9SQUdFX01FTU9SWSk7CgkJfQoKCQkvLyBYTUwgaGVhZGVyCgkJJG9ialdyaXRlci0+c3RhcnREb2N1bWVudCgnMS4wJywnVVRGLTgnLCd5ZXMnKTsKCgkJLy8gUmVsYXRpb25zaGlwcwoJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgnUmVsYXRpb25zaGlwcycpOwoJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCd4bWxucycsICdodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvcGFja2FnZS8yMDA2L3JlbGF0aW9uc2hpcHMnKTsKCgkJCSRjdXN0b21Qcm9wZXJ0eUxpc3QgPSAkcFBIUEV4Y2VsLT5nZXRQcm9wZXJ0aWVzKCktPmdldEN1c3RvbVByb3BlcnRpZXMoKTsKCQkJaWYgKCFlbXB0eSgkY3VzdG9tUHJvcGVydHlMaXN0KSkgewoJCQkJLy8gUmVsYXRpb25zaGlwIGRvY1Byb3BzL2FwcC54bWwKCQkJCSR0aGlzLT5fd3JpdGVSZWxhdGlvbnNoaXAoCgkJCQkJJG9ialdyaXRlciwKCQkJCQk0LAoJCQkJCSdodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvb2ZmaWNlRG9jdW1lbnQvMjAwNi9yZWxhdGlvbnNoaXBzL2N1c3RvbS1wcm9wZXJ0aWVzJywKCQkJCQknZG9jUHJvcHMvY3VzdG9tLnhtbCcKCQkJCSk7CgoJCQl9CgoJCQkvLyBSZWxhdGlvbnNoaXAgZG9jUHJvcHMvYXBwLnhtbAoJCQkkdGhpcy0+X3dyaXRlUmVsYXRpb25zaGlwKAoJCQkJJG9ialdyaXRlciwKCQkJCTMsCgkJCQknaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL29mZmljZURvY3VtZW50LzIwMDYvcmVsYXRpb25zaGlwcy9leHRlbmRlZC1wcm9wZXJ0aWVzJywKCQkJCSdkb2NQcm9wcy9hcHAueG1sJwoJCQkpOwoKCQkJLy8gUmVsYXRpb25zaGlwIGRvY1Byb3BzL2NvcmUueG1sCgkJCSR0aGlzLT5fd3JpdGVSZWxhdGlvbnNoaXAoCgkJCQkkb2JqV3JpdGVyLAoJCQkJMiwKCQkJCSdodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvcGFja2FnZS8yMDA2L3JlbGF0aW9uc2hpcHMvbWV0YWRhdGEvY29yZS1wcm9wZXJ0aWVzJywKCQkJCSdkb2NQcm9wcy9jb3JlLnhtbCcKCQkJKTsKCgkJCS8vIFJlbGF0aW9uc2hpcCB4bC93b3JrYm9vay54bWwKCQkJJHRoaXMtPl93cml0ZVJlbGF0aW9uc2hpcCgKCQkJCSRvYmpXcml0ZXIsCgkJCQkxLAoJCQkJJ2h0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9vZmZpY2VEb2N1bWVudC8yMDA2L3JlbGF0aW9uc2hpcHMvb2ZmaWNlRG9jdW1lbnQnLAoJCQkJJ3hsL3dvcmtib29rLnhtbCcKCQkJKTsKCgkJJG9ialdyaXRlci0+ZW5kRWxlbWVudCgpOwoKCQkvLyBSZXR1cm4KCQlyZXR1cm4gJG9ialdyaXRlci0+Z2V0RGF0YSgpOwoJfQoKCS8qKgoJICogV3JpdGUgd29ya2Jvb2sgcmVsYXRpb25zaGlwcyB0byBYTUwgZm9ybWF0CgkgKgoJICogQHBhcmFtIAlQSFBFeGNlbAkkcFBIUEV4Y2VsCgkgKiBAcmV0dXJuIAlzdHJpbmcgCQlYTUwgT3V0cHV0CgkgKiBAdGhyb3dzIAlFeGNlcHRpb24KCSAqLwoJcHVibGljIGZ1bmN0aW9uIHdyaXRlV29ya2Jvb2tSZWxhdGlvbnNoaXBzKFBIUEV4Y2VsICRwUEhQRXhjZWwgPSBudWxsKQoJewoJCS8vIENyZWF0ZSBYTUwgd3JpdGVyCgkJJG9ialdyaXRlciA9IG51bGw7CgkJaWYgKCR0aGlzLT5nZXRQYXJlbnRXcml0ZXIoKS0+Z2V0VXNlRGlza0NhY2hpbmcoKSkgewoJCQkkb2JqV3JpdGVyID0gbmV3IFBIUEV4Y2VsX1NoYXJlZF9YTUxXcml0ZXIoUEhQRXhjZWxfU2hhcmVkX1hNTFdyaXRlcjo6U1RPUkFHRV9ESVNLLCAkdGhpcy0+Z2V0UGFyZW50V3JpdGVyKCktPmdldERpc2tDYWNoaW5nRGlyZWN0b3J5KCkpOwoJCX0gZWxzZSB7CgkJCSRvYmpXcml0ZXIgPSBuZXcgUEhQRXhjZWxfU2hhcmVkX1hNTFdyaXRlcihQSFBFeGNlbF9TaGFyZWRfWE1MV3JpdGVyOjpTVE9SQUdFX01FTU9SWSk7CgkJfQoKCQkvLyBYTUwgaGVhZGVyCgkJJG9ialdyaXRlci0+c3RhcnREb2N1bWVudCgnMS4wJywnVVRGLTgnLCd5ZXMnKTsKCgkJLy8gUmVsYXRpb25zaGlwcwoJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgnUmVsYXRpb25zaGlwcycpOwoJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCd4bWxucycsICdodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvcGFja2FnZS8yMDA2L3JlbGF0aW9uc2hpcHMnKTsKCgkJCS8vIFJlbGF0aW9uc2hpcCBzdHlsZXMueG1sCgkJCSR0aGlzLT5fd3JpdGVSZWxhdGlvbnNoaXAoCgkJCQkkb2JqV3JpdGVyLAoJCQkJMSwKCQkJCSdodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvb2ZmaWNlRG9jdW1lbnQvMjAwNi9yZWxhdGlvbnNoaXBzL3N0eWxlcycsCgkJCQknc3R5bGVzLnhtbCcKCQkJKTsKCgkJCS8vIFJlbGF0aW9uc2hpcCB0aGVtZS90aGVtZTEueG1sCgkJCSR0aGlzLT5fd3JpdGVSZWxhdGlvbnNoaXAoCgkJCQkkb2JqV3JpdGVyLAoJCQkJMiwKCQkJCSdodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvb2ZmaWNlRG9jdW1lbnQvMjAwNi9yZWxhdGlvbnNoaXBzL3RoZW1lJywKCQkJCSd0aGVtZS90aGVtZTEueG1sJwoJCQkpOwoKCQkJLy8gUmVsYXRpb25zaGlwIHNoYXJlZFN0cmluZ3MueG1sCgkJCSR0aGlzLT5fd3JpdGVSZWxhdGlvbnNoaXAoCgkJCQkkb2JqV3JpdGVyLAoJCQkJMywKCQkJCSdodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvb2ZmaWNlRG9jdW1lbnQvMjAwNi9yZWxhdGlvbnNoaXBzL3NoYXJlZFN0cmluZ3MnLAoJCQkJJ3NoYXJlZFN0cmluZ3MueG1sJwoJCQkpOwoKCQkJLy8gUmVsYXRpb25zaGlwcyB3aXRoIHNoZWV0cwoJCQkkc2hlZXRDb3VudCA9ICRwUEhQRXhjZWwtPmdldFNoZWV0Q291bnQoKTsKCQkJZm9yICgkaSA9IDA7ICRpIDwgJHNoZWV0Q291bnQ7ICsrJGkpIHsKCQkJCSR0aGlzLT5fd3JpdGVSZWxhdGlvbnNoaXAoCgkJCQkJJG9ialdyaXRlciwKCQkJCQkoJGkgKyAxICsgMyksCgkJCQkJJ2h0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9vZmZpY2VEb2N1bWVudC8yMDA2L3JlbGF0aW9uc2hpcHMvd29ya3NoZWV0JywKCQkJCQknd29ya3NoZWV0cy9zaGVldCcgLiAoJGkgKyAxKSAuICcueG1sJwoJCQkJKTsKCQkJfQoKCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgoJCS8vIFJldHVybgoJCXJldHVybiAkb2JqV3JpdGVyLT5nZXREYXRhKCk7Cgl9CgoJLyoqCgkgKiBXcml0ZSB3b3Jrc2hlZXQgcmVsYXRpb25zaGlwcyB0byBYTUwgZm9ybWF0CgkgKgoJICogTnVtYmVyaW5nIGlzIGFzIGZvbGxvd3M6CgkgKiAJcklkMSAJCQkJLSBEcmF3aW5ncwoJICogIHJJZF9oeXBlcmxpbmtfeCAJLSBIeXBlcmxpbmtzCgkgKgoJICogQHBhcmFtIAlQSFBFeGNlbF9Xb3Jrc2hlZXQJJHBXb3Jrc2hlZXQKCSAqIEBwYXJhbSAJaW50CQkJCQkkcFdvcmtzaGVldElkCgkgKiBAcGFyYW0JYm9vbGVhbgkJCQkkaW5jbHVkZUNoYXJ0cwlGbGFnIGluZGljYXRpbmcgaWYgd2Ugc2hvdWxkIHdyaXRlIGNoYXJ0cwoJICogQHJldHVybiAJc3RyaW5nIAkJCQlYTUwgT3V0cHV0CgkgKiBAdGhyb3dzIAlFeGNlcHRpb24KCSAqLwoJcHVibGljIGZ1bmN0aW9uIHdyaXRlV29ya3NoZWV0UmVsYXRpb25zaGlwcyhQSFBFeGNlbF9Xb3Jrc2hlZXQgJHBXb3Jrc2hlZXQgPSBudWxsLCAkcFdvcmtzaGVldElkID0gMSwgJGluY2x1ZGVDaGFydHMgPSBGQUxTRSkKCXsKCQkvLyBDcmVhdGUgWE1MIHdyaXRlcgoJCSRvYmpXcml0ZXIgPSBudWxsOwoJCWlmICgkdGhpcy0+Z2V0UGFyZW50V3JpdGVyKCktPmdldFVzZURpc2tDYWNoaW5nKCkpIHsKCQkJJG9ialdyaXRlciA9IG5ldyBQSFBFeGNlbF9TaGFyZWRfWE1MV3JpdGVyKFBIUEV4Y2VsX1NoYXJlZF9YTUxXcml0ZXI6OlNUT1JBR0VfRElTSywgJHRoaXMtPmdldFBhcmVudFdyaXRlcigpLT5nZXREaXNrQ2FjaGluZ0RpcmVjdG9yeSgpKTsKCQl9IGVsc2UgewoJCQkkb2JqV3JpdGVyID0gbmV3IFBIUEV4Y2VsX1NoYXJlZF9YTUxXcml0ZXIoUEhQRXhjZWxfU2hhcmVkX1hNTFdyaXRlcjo6U1RPUkFHRV9NRU1PUlkpOwoJCX0KCgkJLy8gWE1MIGhlYWRlcgoJCSRvYmpXcml0ZXItPnN0YXJ0RG9jdW1lbnQoJzEuMCcsJ1VURi04JywneWVzJyk7CgoJCS8vIFJlbGF0aW9uc2hpcHMKCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ1JlbGF0aW9uc2hpcHMnKTsKCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgneG1sbnMnLCAnaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL3BhY2thZ2UvMjAwNi9yZWxhdGlvbnNoaXBzJyk7CgoJCQkvLyBXcml0ZSBkcmF3aW5nIHJlbGF0aW9uc2hpcHM/CgkJCSRkID0gMDsKCQkJaWYgKCRpbmNsdWRlQ2hhcnRzKSB7CgkJCQkkY2hhcnRzID0gJHBXb3Jrc2hlZXQtPmdldENoYXJ0Q29sbGVjdGlvbigpOwoJCQl9IGVsc2UgewoJCQkJJGNoYXJ0cyA9IGFycmF5KCk7CgkJCX0KCQkJaWYgKCgkcFdvcmtzaGVldC0+Z2V0RHJhd2luZ0NvbGxlY3Rpb24oKS0+Y291bnQoKSA+IDApIHx8CgkJCQkoY291bnQoJGNoYXJ0cykgPiAwKSkgewoJCQkJJHRoaXMtPl93cml0ZVJlbGF0aW9uc2hpcCgKCQkJCQkkb2JqV3JpdGVyLAoJCQkJCSsrJGQsCgkJCQkJJ2h0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9vZmZpY2VEb2N1bWVudC8yMDA2L3JlbGF0aW9uc2hpcHMvZHJhd2luZycsCgkJCQkJJy4uL2RyYXdpbmdzL2RyYXdpbmcnIC4gJHBXb3Jrc2hlZXRJZCAuICcueG1sJwoJCQkJKTsKCQkJfQoKCQkJLy8gV3JpdGUgY2hhcnQgcmVsYXRpb25zaGlwcz8KLy8JCQkkY2hhcnRDb3VudCA9IDA7Ci8vCQkJJGNoYXJ0cyA9ICRwV29ya3NoZWV0LT5nZXRDaGFydENvbGxlY3Rpb24oKTsKLy8JCQllY2hvICdDaGFydCBSZWxzOiAnICwgY291bnQoJGNoYXJ0cykgLCAnPGJyIC8+JzsKLy8JCQlpZiAoY291bnQoJGNoYXJ0cykgPiAwKSB7Ci8vCQkJCWZvcmVhY2goJGNoYXJ0cyBhcyAkY2hhcnQpIHsKLy8JCQkJCSR0aGlzLT5fd3JpdGVSZWxhdGlvbnNoaXAoCi8vCQkJCQkJJG9ialdyaXRlciwKLy8JCQkJCQkrKyRkLAovLwkJCQkJCSdodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvb2ZmaWNlRG9jdW1lbnQvMjAwNi9yZWxhdGlvbnNoaXBzL2NoYXJ0JywKLy8JCQkJCQknLi4vY2hhcnRzL2NoYXJ0JyAuICsrJGNoYXJ0Q291bnQgLiAnLnhtbCcKLy8JCQkJCSk7Ci8vCQkJCX0KLy8JCQl9Ci8vCgkJCS8vIFdyaXRlIGh5cGVybGluayByZWxhdGlvbnNoaXBzPwoJCQkkaSA9IDE7CgkJCWZvcmVhY2ggKCRwV29ya3NoZWV0LT5nZXRIeXBlcmxpbmtDb2xsZWN0aW9uKCkgYXMgJGh5cGVybGluaykgewoJCQkJaWYgKCEkaHlwZXJsaW5rLT5pc0ludGVybmFsKCkpIHsKCQkJCQkkdGhpcy0+X3dyaXRlUmVsYXRpb25zaGlwKAoJCQkJCQkkb2JqV3JpdGVyLAoJCQkJCQknX2h5cGVybGlua18nIC4gJGksCgkJCQkJCSdodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvb2ZmaWNlRG9jdW1lbnQvMjAwNi9yZWxhdGlvbnNoaXBzL2h5cGVybGluaycsCgkJCQkJCSRoeXBlcmxpbmstPmdldFVybCgpLAoJCQkJCQknRXh0ZXJuYWwnCgkJCQkJKTsKCgkJCQkJKyskaTsKCQkJCX0KCQkJfQoKCQkJLy8gV3JpdGUgY29tbWVudHMgcmVsYXRpb25zaGlwPwoJCQkkaSA9IDE7CgkJCWlmIChjb3VudCgkcFdvcmtzaGVldC0+Z2V0Q29tbWVudHMoKSkgPiAwKSB7CgkJCQkkdGhpcy0+X3dyaXRlUmVsYXRpb25zaGlwKAoJCQkJCSRvYmpXcml0ZXIsCgkJCQkJJ19jb21tZW50c192bWwnIC4gJGksCgkJCQkJJ2h0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9vZmZpY2VEb2N1bWVudC8yMDA2L3JlbGF0aW9uc2hpcHMvdm1sRHJhd2luZycsCgkJCQkJJy4uL2RyYXdpbmdzL3ZtbERyYXdpbmcnIC4gJHBXb3Jrc2hlZXRJZCAuICcudm1sJwoJCQkJKTsKCgkJCQkkdGhpcy0+X3dyaXRlUmVsYXRpb25zaGlwKAoJCQkJCSRvYmpXcml0ZXIsCgkJCQkJJ19jb21tZW50cycgLiAkaSwKCQkJCQknaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL29mZmljZURvY3VtZW50LzIwMDYvcmVsYXRpb25zaGlwcy9jb21tZW50cycsCgkJCQkJJy4uL2NvbW1lbnRzJyAuICRwV29ya3NoZWV0SWQgLiAnLnhtbCcKCQkJCSk7CgkJCX0KCgkJCS8vIFdyaXRlIGhlYWRlci9mb290ZXIgcmVsYXRpb25zaGlwPwoJCQkkaSA9IDE7CgkJCWlmIChjb3VudCgkcFdvcmtzaGVldC0+Z2V0SGVhZGVyRm9vdGVyKCktPmdldEltYWdlcygpKSA+IDApIHsKCQkJCSR0aGlzLT5fd3JpdGVSZWxhdGlvbnNoaXAoCgkJCQkJJG9ialdyaXRlciwKCQkJCQknX2hlYWRlcmZvb3Rlcl92bWwnIC4gJGksCgkJCQkJJ2h0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9vZmZpY2VEb2N1bWVudC8yMDA2L3JlbGF0aW9uc2hpcHMvdm1sRHJhd2luZycsCgkJCQkJJy4uL2RyYXdpbmdzL3ZtbERyYXdpbmdIRicgLiAkcFdvcmtzaGVldElkIC4gJy52bWwnCgkJCQkpOwoJCQl9CgoJCSRvYmpXcml0ZXItPmVuZEVsZW1lbnQoKTsKCgkJLy8gUmV0dXJuCgkJcmV0dXJuICRvYmpXcml0ZXItPmdldERhdGEoKTsKCX0KCgkvKioKCSAqIFdyaXRlIGRyYXdpbmcgcmVsYXRpb25zaGlwcyB0byBYTUwgZm9ybWF0CgkgKgoJICogQHBhcmFtIAlQSFBFeGNlbF9Xb3Jrc2hlZXQJJHBXb3Jrc2hlZXQKCSAqIEBwYXJhbQlpbnQJCQkJCSYkY2hhcnRSZWYJCUNoYXJ0IElECgkgKiBAcGFyYW0JYm9vbGVhbgkJCQkkaW5jbHVkZUNoYXJ0cwlGbGFnIGluZGljYXRpbmcgaWYgd2Ugc2hvdWxkIHdyaXRlIGNoYXJ0cwoJICogQHJldHVybiAJc3RyaW5nIAkJCQlYTUwgT3V0cHV0CgkgKiBAdGhyb3dzIAlFeGNlcHRpb24KCSAqLwoJcHVibGljIGZ1bmN0aW9uIHdyaXRlRHJhd2luZ1JlbGF0aW9uc2hpcHMoUEhQRXhjZWxfV29ya3NoZWV0ICRwV29ya3NoZWV0ID0gbnVsbCwgJiRjaGFydFJlZiwgJGluY2x1ZGVDaGFydHMgPSBGQUxTRSkKCXsKCQkvLyBDcmVhdGUgWE1MIHdyaXRlcgoJCSRvYmpXcml0ZXIgPSBudWxsOwoJCWlmICgkdGhpcy0+Z2V0UGFyZW50V3JpdGVyKCktPmdldFVzZURpc2tDYWNoaW5nKCkpIHsKCQkJJG9ialdyaXRlciA9IG5ldyBQSFBFeGNlbF9TaGFyZWRfWE1MV3JpdGVyKFBIUEV4Y2VsX1NoYXJlZF9YTUxXcml0ZXI6OlNUT1JBR0VfRElTSywgJHRoaXMtPmdldFBhcmVudFdyaXRlcigpLT5nZXREaXNrQ2FjaGluZ0RpcmVjdG9yeSgpKTsKCQl9IGVsc2UgewoJCQkkb2JqV3JpdGVyID0gbmV3IFBIUEV4Y2VsX1NoYXJlZF9YTUxXcml0ZXIoUEhQRXhjZWxfU2hhcmVkX1hNTFdyaXRlcjo6U1RPUkFHRV9NRU1PUlkpOwoJCX0KCgkJLy8gWE1MIGhlYWRlcgoJCSRvYmpXcml0ZXItPnN0YXJ0RG9jdW1lbnQoJzEuMCcsJ1VURi04JywneWVzJyk7CgoJCS8vIFJlbGF0aW9uc2hpcHMKCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ1JlbGF0aW9uc2hpcHMnKTsKCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgneG1sbnMnLCAnaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL3BhY2thZ2UvMjAwNi9yZWxhdGlvbnNoaXBzJyk7CgoJCQkvLyBMb29wIHRocm91Z2ggaW1hZ2VzIGFuZCB3cml0ZSByZWxhdGlvbnNoaXBzCgkJCSRpID0gMTsKCQkJJGl0ZXJhdG9yID0gJHBXb3Jrc2hlZXQtPmdldERyYXdpbmdDb2xsZWN0aW9uKCktPmdldEl0ZXJhdG9yKCk7CgkJCXdoaWxlICgkaXRlcmF0b3ItPnZhbGlkKCkpIHsKCQkJCWlmICgkaXRlcmF0b3ItPmN1cnJlbnQoKSBpbnN0YW5jZW9mIFBIUEV4Y2VsX1dvcmtzaGVldF9EcmF3aW5nCgkJCQkJfHwgJGl0ZXJhdG9yLT5jdXJyZW50KCkgaW5zdGFuY2VvZiBQSFBFeGNlbF9Xb3Jrc2hlZXRfTWVtb3J5RHJhd2luZykgewoJCQkJCS8vIFdyaXRlIHJlbGF0aW9uc2hpcCBmb3IgaW1hZ2UgZHJhd2luZwoJCQkJCSR0aGlzLT5fd3JpdGVSZWxhdGlvbnNoaXAoCgkJCQkJCSRvYmpXcml0ZXIsCgkJCQkJCSRpLAoJCQkJCQknaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL29mZmljZURvY3VtZW50LzIwMDYvcmVsYXRpb25zaGlwcy9pbWFnZScsCgkJCQkJCScuLi9tZWRpYS8nIC4gc3RyX3JlcGxhY2UoJyAnLCAnJywgJGl0ZXJhdG9yLT5jdXJyZW50KCktPmdldEluZGV4ZWRGaWxlbmFtZSgpKQoJCQkJCSk7CgkJCQl9CgoJCQkJJGl0ZXJhdG9yLT5uZXh0KCk7CgkJCQkrKyRpOwoJCQl9CgoJCQlpZiAoJGluY2x1ZGVDaGFydHMpIHsKCQkJCS8vIExvb3AgdGhyb3VnaCBjaGFydHMgYW5kIHdyaXRlIHJlbGF0aW9uc2hpcHMKCQkJCSRjaGFydENvdW50ID0gJHBXb3Jrc2hlZXQtPmdldENoYXJ0Q291bnQoKTsKCQkJCWlmICgkY2hhcnRDb3VudCA+IDApIHsKCQkJCQlmb3IgKCRjID0gMDsgJGMgPCAkY2hhcnRDb3VudDsgKyskYykgewoJCQkJCQkkdGhpcy0+X3dyaXRlUmVsYXRpb25zaGlwKAoJCQkJCQkJJG9ialdyaXRlciwKCQkJCQkJCSRpKyssCgkJCQkJCQknaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL29mZmljZURvY3VtZW50LzIwMDYvcmVsYXRpb25zaGlwcy9jaGFydCcsCgkJCQkJCQknLi4vY2hhcnRzL2NoYXJ0JyAuICsrJGNoYXJ0UmVmIC4gJy54bWwnCgkJCQkJCSk7CgkJCQkJfQoJCQkJfQoJCQl9CgoJCSRvYmpXcml0ZXItPmVuZEVsZW1lbnQoKTsKCgkJLy8gUmV0dXJuCgkJcmV0dXJuICRvYmpXcml0ZXItPmdldERhdGEoKTsKCX0KCgkvKioKCSAqIFdyaXRlIGhlYWRlci9mb290ZXIgZHJhd2luZyByZWxhdGlvbnNoaXBzIHRvIFhNTCBmb3JtYXQKCSAqCgkgKiBAcGFyYW0gCVBIUEV4Y2VsX1dvcmtzaGVldAkJCSRwV29ya3NoZWV0CgkgKiBAcmV0dXJuIAlzdHJpbmcgCQkJCQkJWE1MIE91dHB1dAoJICogQHRocm93cyAJRXhjZXB0aW9uCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiB3cml0ZUhlYWRlckZvb3RlckRyYXdpbmdSZWxhdGlvbnNoaXBzKFBIUEV4Y2VsX1dvcmtzaGVldCAkcFdvcmtzaGVldCA9IG51bGwpCgl7CgkJLy8gQ3JlYXRlIFhNTCB3cml0ZXIKCQkkb2JqV3JpdGVyID0gbnVsbDsKCQlpZiAoJHRoaXMtPmdldFBhcmVudFdyaXRlcigpLT5nZXRVc2VEaXNrQ2FjaGluZygpKSB7CgkJCSRvYmpXcml0ZXIgPSBuZXcgUEhQRXhjZWxfU2hhcmVkX1hNTFdyaXRlcihQSFBFeGNlbF9TaGFyZWRfWE1MV3JpdGVyOjpTVE9SQUdFX0RJU0ssICR0aGlzLT5nZXRQYXJlbnRXcml0ZXIoKS0+Z2V0RGlza0NhY2hpbmdEaXJlY3RvcnkoKSk7CgkJfSBlbHNlIHsKCQkJJG9ialdyaXRlciA9IG5ldyBQSFBFeGNlbF9TaGFyZWRfWE1MV3JpdGVyKFBIUEV4Y2VsX1NoYXJlZF9YTUxXcml0ZXI6OlNUT1JBR0VfTUVNT1JZKTsKCQl9CgoJCS8vIFhNTCBoZWFkZXIKCQkkb2JqV3JpdGVyLT5zdGFydERvY3VtZW50KCcxLjAnLCdVVEYtOCcsJ3llcycpOwoKCQkvLyBSZWxhdGlvbnNoaXBzCgkJJG9ialdyaXRlci0+c3RhcnRFbGVtZW50KCdSZWxhdGlvbnNoaXBzJyk7CgkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ3htbG5zJywgJ2h0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9wYWNrYWdlLzIwMDYvcmVsYXRpb25zaGlwcycpOwoKCQkJLy8gTG9vcCB0aHJvdWdoIGltYWdlcyBhbmQgd3JpdGUgcmVsYXRpb25zaGlwcwoJCQlmb3JlYWNoICgkcFdvcmtzaGVldC0+Z2V0SGVhZGVyRm9vdGVyKCktPmdldEltYWdlcygpIGFzICRrZXkgPT4gJHZhbHVlKSB7CgkJCQkvLyBXcml0ZSByZWxhdGlvbnNoaXAgZm9yIGltYWdlIGRyYXdpbmcKCQkJCSR0aGlzLT5fd3JpdGVSZWxhdGlvbnNoaXAoCgkJCQkJJG9ialdyaXRlciwKCQkJCQkka2V5LAoJCQkJCSdodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvb2ZmaWNlRG9jdW1lbnQvMjAwNi9yZWxhdGlvbnNoaXBzL2ltYWdlJywKCQkJCQknLi4vbWVkaWEvJyAuICR2YWx1ZS0+Z2V0SW5kZXhlZEZpbGVuYW1lKCkKCQkJCSk7CgkJCX0KCgkJJG9ialdyaXRlci0+ZW5kRWxlbWVudCgpOwoKCQkvLyBSZXR1cm4KCQlyZXR1cm4gJG9ialdyaXRlci0+Z2V0RGF0YSgpOwoJfQoKCS8qKgoJICogV3JpdGUgT3ZlcnJpZGUgY29udGVudCB0eXBlCgkgKgoJICogQHBhcmFtIAlQSFBFeGNlbF9TaGFyZWRfWE1MV3JpdGVyIAkkb2JqV3JpdGVyIAkJWE1MIFdyaXRlcgoJICogQHBhcmFtIAlpbnQJCQkJCQkJJHBJZAkJCVJlbGF0aW9uc2hpcCBJRC4gcklkIHdpbGwgYmUgcHJlcGVuZGVkIQoJICogQHBhcmFtIAlzdHJpbmcJCQkJCQkkcFR5cGUJCQlSZWxhdGlvbnNoaXAgdHlwZQoJICogQHBhcmFtIAlzdHJpbmcgCQkJCQkJJHBUYXJnZXQJCVJlbGF0aW9uc2hpcCB0YXJnZXQKCSAqIEBwYXJhbSAJc3RyaW5nIAkJCQkJCSRwVGFyZ2V0TW9kZQlSZWxhdGlvbnNoaXAgdGFyZ2V0IG1vZGUKCSAqIEB0aHJvd3MgCUV4Y2VwdGlvbgoJICovCglwcml2YXRlIGZ1bmN0aW9uIF93cml0ZVJlbGF0aW9uc2hpcChQSFBFeGNlbF9TaGFyZWRfWE1MV3JpdGVyICRvYmpXcml0ZXIgPSBudWxsLCAkcElkID0gMSwgJHBUeXBlID0gJycsICRwVGFyZ2V0ID0gJycsICRwVGFyZ2V0TW9kZSA9ICcnKQoJewoJCWlmICgkcFR5cGUgIT0gJycgJiYgJHBUYXJnZXQgIT0gJycpIHsKCQkJLy8gV3JpdGUgcmVsYXRpb25zaGlwCgkJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgnUmVsYXRpb25zaGlwJyk7CgkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCdJZCcsIAkJJ3JJZCcgLiAkcElkKTsKCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ1R5cGUnLCAJCSRwVHlwZSk7CgkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCdUYXJnZXQnLAkkcFRhcmdldCk7CgoJCQlpZiAoJHBUYXJnZXRNb2RlICE9ICcnKSB7CgkJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgnVGFyZ2V0TW9kZScsCSRwVGFyZ2V0TW9kZSk7CgkJCX0KCgkJCSRvYmpXcml0ZXItPmVuZEVsZW1lbnQoKTsKCQl9IGVsc2UgewoJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCJJbnZhbGlkIHBhcmFtZXRlcnMgcGFzc2VkLiIpOwoJCX0KCX0KfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Writer/Excel2007/StringTable.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIFBIUEV4Y2VsCiAqCiAqIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICoKICogQGNhdGVnb3J5ICAgUEhQRXhjZWwKICogQHBhY2thZ2UgICAgUEhQRXhjZWxfV3JpdGVyX0V4Y2VsMjAwNwogKiBAY29weXJpZ2h0ICBDb3B5cmlnaHQgKGMpIDIwMDYgLSAyMDEyIFBIUEV4Y2VsIChodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9QSFBFeGNlbCkKICogQGxpY2Vuc2UgICAgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL29sZC1saWNlbnNlcy9sZ3BsLTIuMS50eHQJTEdQTAogKiBAdmVyc2lvbiAgICAxLjcuNywgMjAxMi0wNS0xOQogKi8KCgovKioKICogUEhQRXhjZWxfV3JpdGVyX0V4Y2VsMjAwN19TdHJpbmdUYWJsZQogKgogKiBAY2F0ZWdvcnkgICBQSFBFeGNlbAogKiBAcGFja2FnZSAgICBQSFBFeGNlbF9Xcml0ZXJfRXhjZWwyMDA3CiAqIEBjb3B5cmlnaHQgIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwgKGh0dHA6Ly93d3cuY29kZXBsZXguY29tL1BIUEV4Y2VsKQogKi8KY2xhc3MgUEhQRXhjZWxfV3JpdGVyX0V4Y2VsMjAwN19TdHJpbmdUYWJsZSBleHRlbmRzIFBIUEV4Y2VsX1dyaXRlcl9FeGNlbDIwMDdfV3JpdGVyUGFydAp7CgkvKioKCSAqIENyZWF0ZSB3b3Jrc2hlZXQgc3RyaW5ndGFibGUKCSAqCgkgKiBAcGFyYW0gCVBIUEV4Y2VsX1dvcmtzaGVldCAJJHBTaGVldAkJCQlXb3Jrc2hlZXQKCSAqIEBwYXJhbSAJc3RyaW5nW10gCQkJCSRwRXhpc3RpbmdUYWJsZSAJRXhpc3RpbmcgdGFibGUgdG8gZXZlbnR1YWxseSBtZXJnZSB3aXRoCgkgKiBAcmV0dXJuIAlzdHJpbmdbXSAJCQkJU3RyaW5nIHRhYmxlIGZvciB3b3Jrc2hlZXQKCSAqIEB0aHJvd3MgCUV4Y2VwdGlvbgoJICovCglwdWJsaWMgZnVuY3Rpb24gY3JlYXRlU3RyaW5nVGFibGUoJHBTaGVldCA9IG51bGwsICRwRXhpc3RpbmdUYWJsZSA9IG51bGwpCgl7CgkJaWYgKCRwU2hlZXQgIT09IE5VTEwpIHsKCQkJLy8gQ3JlYXRlIHN0cmluZyBsb29rdXAgdGFibGUKCQkJJGFTdHJpbmdUYWJsZSA9IGFycmF5KCk7CgkJCSRjZWxsQ29sbGVjdGlvbiA9IG51bGw7CgkJCSRhRmxpcHBlZFN0cmluZ1RhYmxlID0gbnVsbDsJLy8gRm9yIGZhc3RlciBsb29rdXAKCgkJCS8vIElzIGFuIGV4aXN0aW5nIHRhYmxlIGdpdmVuPwoJCQlpZiAoIWlzX251bGwoJHBFeGlzdGluZ1RhYmxlKSAmJiBpc19hcnJheSgkcEV4aXN0aW5nVGFibGUpKSB7CgkJCQkkYVN0cmluZ1RhYmxlID0gJHBFeGlzdGluZ1RhYmxlOwoJCQl9CgoJCQkvLyBGaWxsIGluZGV4IGFycmF5CgkJCSRhRmxpcHBlZFN0cmluZ1RhYmxlID0gJHRoaXMtPmZsaXBTdHJpbmdUYWJsZSgkYVN0cmluZ1RhYmxlKTsKCgkJCS8vIExvb3AgdGhyb3VnaCBjZWxscwoJCQlmb3JlYWNoICgkcFNoZWV0LT5nZXRDZWxsQ29sbGVjdGlvbigpIGFzICRjZWxsSUQpIHsKCQkJCSRjZWxsID0gJHBTaGVldC0+Z2V0Q2VsbCgkY2VsbElEKTsKCQkJCSRjZWxsVmFsdWUgPSAkY2VsbC0+Z2V0VmFsdWUoKTsKCQkJCWlmICghaXNfb2JqZWN0KCRjZWxsVmFsdWUpICYmCgkJCQkJKCRjZWxsVmFsdWUgIT09IE5VTEwpICYmCgkJCQkJJGNlbGxWYWx1ZSAhPT0gJycgJiYKCQkJCQkhaXNzZXQoJGFGbGlwcGVkU3RyaW5nVGFibGVbJGNlbGxWYWx1ZV0pICYmCgkJCQkJKCRjZWxsLT5nZXREYXRhVHlwZSgpID09IFBIUEV4Y2VsX0NlbGxfRGF0YVR5cGU6OlRZUEVfU1RSSU5HIHx8ICRjZWxsLT5nZXREYXRhVHlwZSgpID09IFBIUEV4Y2VsX0NlbGxfRGF0YVR5cGU6OlRZUEVfU1RSSU5HMiB8fCAkY2VsbC0+Z2V0RGF0YVR5cGUoKSA9PSBQSFBFeGNlbF9DZWxsX0RhdGFUeXBlOjpUWVBFX05VTEwpKSB7CgkJCQkJCSRhU3RyaW5nVGFibGVbXSA9ICRjZWxsVmFsdWU7CgkJCQkJCSRhRmxpcHBlZFN0cmluZ1RhYmxlWyRjZWxsVmFsdWVdID0gdHJ1ZTsKCQkJCX0gZWxzZWlmICgkY2VsbFZhbHVlIGluc3RhbmNlb2YgUEhQRXhjZWxfUmljaFRleHQgJiYKCQkJCQkJICAoJGNlbGxWYWx1ZSAhPT0gTlVMTCkgJiYKCQkJCQkJICAhaXNzZXQoJGFGbGlwcGVkU3RyaW5nVGFibGVbJGNlbGxWYWx1ZS0+Z2V0SGFzaENvZGUoKV0pKSB7CgkJCQkJCQkJJGFTdHJpbmdUYWJsZVtdID0gJGNlbGxWYWx1ZTsKCQkJCQkJCQkkYUZsaXBwZWRTdHJpbmdUYWJsZVskY2VsbFZhbHVlLT5nZXRIYXNoQ29kZSgpXSA9IHRydWU7CgkgICAgICAgIAl9CgkgICAgICAgIH0KCgkgICAgICAgIC8vIFJldHVybgoJICAgICAgICByZXR1cm4gJGFTdHJpbmdUYWJsZTsKCQl9IGVsc2UgewoJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCJJbnZhbGlkIFBIUEV4Y2VsX1dvcmtzaGVldCBvYmplY3QgcGFzc2VkLiIpOwoJCX0KCX0KCgkvKioKCSAqIFdyaXRlIHN0cmluZyB0YWJsZSB0byBYTUwgZm9ybWF0CgkgKgoJICogQHBhcmFtIAlzdHJpbmdbXSAJJHBTdHJpbmdUYWJsZQoJICogQHJldHVybiAJc3RyaW5nIAkJWE1MIE91dHB1dAoJICogQHRocm93cyAJRXhjZXB0aW9uCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiB3cml0ZVN0cmluZ1RhYmxlKCRwU3RyaW5nVGFibGUgPSBudWxsKQoJewoJCWlmICghaXNfbnVsbCgkcFN0cmluZ1RhYmxlKSkgewoJCQkvLyBDcmVhdGUgWE1MIHdyaXRlcgoJCQkkb2JqV3JpdGVyID0gbnVsbDsKCQkJaWYgKCR0aGlzLT5nZXRQYXJlbnRXcml0ZXIoKS0+Z2V0VXNlRGlza0NhY2hpbmcoKSkgewoJCQkJJG9ialdyaXRlciA9IG5ldyBQSFBFeGNlbF9TaGFyZWRfWE1MV3JpdGVyKFBIUEV4Y2VsX1NoYXJlZF9YTUxXcml0ZXI6OlNUT1JBR0VfRElTSywgJHRoaXMtPmdldFBhcmVudFdyaXRlcigpLT5nZXREaXNrQ2FjaGluZ0RpcmVjdG9yeSgpKTsKCQkJfSBlbHNlIHsKCQkJCSRvYmpXcml0ZXIgPSBuZXcgUEhQRXhjZWxfU2hhcmVkX1hNTFdyaXRlcihQSFBFeGNlbF9TaGFyZWRfWE1MV3JpdGVyOjpTVE9SQUdFX01FTU9SWSk7CgkJCX0KCgkJCS8vIFhNTCBoZWFkZXIKCQkJJG9ialdyaXRlci0+c3RhcnREb2N1bWVudCgnMS4wJywnVVRGLTgnLCd5ZXMnKTsKCgkJCS8vIFN0cmluZyB0YWJsZQoJCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ3NzdCcpOwoJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgneG1sbnMnLCAnaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL3NwcmVhZHNoZWV0bWwvMjAwNi9tYWluJyk7CgkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCd1bmlxdWVDb3VudCcsIGNvdW50KCRwU3RyaW5nVGFibGUpKTsKCgkJCQkvLyBMb29wIHRocm91Z2ggc3RyaW5nIHRhYmxlCgkJCQlmb3JlYWNoICgkcFN0cmluZ1RhYmxlIGFzICR0ZXh0RWxlbWVudCkgewoJCQkJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgnc2knKTsKCgkJCQkJCWlmICghICR0ZXh0RWxlbWVudCBpbnN0YW5jZW9mIFBIUEV4Y2VsX1JpY2hUZXh0KSB7CgkJCQkJCQkkdGV4dFRvV3JpdGUgPSBQSFBFeGNlbF9TaGFyZWRfU3RyaW5nOjpDb250cm9sQ2hhcmFjdGVyUEhQMk9PWE1MKCAkdGV4dEVsZW1lbnQgKTsKCQkJCQkJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgndCcpOwoJCQkJCQkJaWYgKCR0ZXh0VG9Xcml0ZSAhPT0gdHJpbSgkdGV4dFRvV3JpdGUpKSB7CgkJCQkJCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ3htbDpzcGFjZScsICdwcmVzZXJ2ZScpOwoJCQkJCQkJfQoJCQkJCQkJJG9ialdyaXRlci0+d3JpdGVSYXdEYXRhKCR0ZXh0VG9Xcml0ZSk7CgkJCQkJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgkJCQkJCX0gZWxzZSBpZiAoJHRleHRFbGVtZW50IGluc3RhbmNlb2YgUEhQRXhjZWxfUmljaFRleHQpIHsKCQkJCQkJCSR0aGlzLT53cml0ZVJpY2hUZXh0KCRvYmpXcml0ZXIsICR0ZXh0RWxlbWVudCk7CgkJCQkJCX0KCiAgICAgICAgICAgICAgICAgICAgJG9ialdyaXRlci0+ZW5kRWxlbWVudCgpOwoJCQkJfQoKCQkJJG9ialdyaXRlci0+ZW5kRWxlbWVudCgpOwoKCQkJLy8gUmV0dXJuCgkJCXJldHVybiAkb2JqV3JpdGVyLT5nZXREYXRhKCk7CgkJfSBlbHNlIHsKCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbigiSW52YWxpZCBzdHJpbmcgdGFibGUgYXJyYXkgcGFzc2VkLiIpOwoJCX0KCX0KCgkvKioKCSAqIFdyaXRlIFJpY2ggVGV4dAoJICoKCSAqIEBwYXJhbSAJUEhQRXhjZWxfU2hhcmVkX1hNTFdyaXRlcgkkb2JqV3JpdGVyIAkJWE1MIFdyaXRlcgoJICogQHBhcmFtIAlQSFBFeGNlbF9SaWNoVGV4dAkJCSRwUmljaFRleHQJCVJpY2ggdGV4dAoJICogQHBhcmFtIAlzdHJpbmcJCQkJCQkkcHJlZml4CQkJT3B0aW9uYWwgTmFtZXNwYWNlIHByZWZpeAoJICogQHRocm93cyAJRXhjZXB0aW9uCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiB3cml0ZVJpY2hUZXh0KFBIUEV4Y2VsX1NoYXJlZF9YTUxXcml0ZXIgJG9ialdyaXRlciA9IG51bGwsIFBIUEV4Y2VsX1JpY2hUZXh0ICRwUmljaFRleHQgPSBudWxsLCAkcHJlZml4PU5VTEwpCgl7CgkJaWYgKCRwcmVmaXggIT09IE5VTEwpCgkJCSRwcmVmaXggLj0gJzonOwoJCS8vIExvb3AgdGhyb3VnaCByaWNoIHRleHQgZWxlbWVudHMKCQkkZWxlbWVudHMgPSAkcFJpY2hUZXh0LT5nZXRSaWNoVGV4dEVsZW1lbnRzKCk7CgkJZm9yZWFjaCAoJGVsZW1lbnRzIGFzICRlbGVtZW50KSB7CgkJCS8vIHIKCQkJJG9ialdyaXRlci0+c3RhcnRFbGVtZW50KCRwcmVmaXguJ3InKTsKCgkJCQkvLyByUHIKCQkJCWlmICgkZWxlbWVudCBpbnN0YW5jZW9mIFBIUEV4Y2VsX1JpY2hUZXh0X1J1bikgewoJCQkJCS8vIHJQcgoJCQkJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgkcHJlZml4LidyUHInKTsKCgkJCQkJCS8vIHJGb250CgkJCQkJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgkcHJlZml4LidyRm9udCcpOwoJCQkJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgndmFsJywgJGVsZW1lbnQtPmdldEZvbnQoKS0+Z2V0TmFtZSgpKTsKCQkJCQkJJG9ialdyaXRlci0+ZW5kRWxlbWVudCgpOwoKCQkJCQkJLy8gQm9sZAoJCQkJCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJHByZWZpeC4nYicpOwoJCQkJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgndmFsJywgKCRlbGVtZW50LT5nZXRGb250KCktPmdldEJvbGQoKSA/ICd0cnVlJyA6ICdmYWxzZScpKTsKCQkJCQkJJG9ialdyaXRlci0+ZW5kRWxlbWVudCgpOwoKCQkJCQkJLy8gSXRhbGljCgkJCQkJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgkcHJlZml4LidpJyk7CgkJCQkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCd2YWwnLCAoJGVsZW1lbnQtPmdldEZvbnQoKS0+Z2V0SXRhbGljKCkgPyAndHJ1ZScgOiAnZmFsc2UnKSk7CgkJCQkJCSRvYmpXcml0ZXItPmVuZEVsZW1lbnQoKTsKCgkJCQkJCS8vIFN1cGVyc2NyaXB0IC8gc3Vic2NyaXB0CgkJCQkJCWlmICgkZWxlbWVudC0+Z2V0Rm9udCgpLT5nZXRTdXBlclNjcmlwdCgpIHx8ICRlbGVtZW50LT5nZXRGb250KCktPmdldFN1YlNjcmlwdCgpKSB7CgkJCQkJCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJHByZWZpeC4ndmVydEFsaWduJyk7CgkJCQkJCQlpZiAoJGVsZW1lbnQtPmdldEZvbnQoKS0+Z2V0U3VwZXJTY3JpcHQoKSkgewoJCQkJCQkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCd2YWwnLCAnc3VwZXJzY3JpcHQnKTsKCQkJCQkJCX0gZWxzZSBpZiAoJGVsZW1lbnQtPmdldEZvbnQoKS0+Z2V0U3ViU2NyaXB0KCkpIHsKCQkJCQkJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgndmFsJywgJ3N1YnNjcmlwdCcpOwoJCQkJCQkJfQoJCQkJCQkJJG9ialdyaXRlci0+ZW5kRWxlbWVudCgpOwoJCQkJCQl9CgoJCQkJCQkvLyBTdHJpa2V0aHJvdWdoCgkJCQkJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgkcHJlZml4LidzdHJpa2UnKTsKCQkJCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ3ZhbCcsICgkZWxlbWVudC0+Z2V0Rm9udCgpLT5nZXRTdHJpa2V0aHJvdWdoKCkgPyAndHJ1ZScgOiAnZmFsc2UnKSk7CgkJCQkJCSRvYmpXcml0ZXItPmVuZEVsZW1lbnQoKTsKCgkJCQkJCS8vIENvbG9yCgkJCQkJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgkcHJlZml4Lidjb2xvcicpOwoJCQkJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgncmdiJywgJGVsZW1lbnQtPmdldEZvbnQoKS0+Z2V0Q29sb3IoKS0+Z2V0QVJHQigpKTsKCQkJCQkJJG9ialdyaXRlci0+ZW5kRWxlbWVudCgpOwoKCQkJCQkJLy8gU2l6ZQoJCQkJCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJHByZWZpeC4nc3onKTsKCQkJCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ3ZhbCcsICRlbGVtZW50LT5nZXRGb250KCktPmdldFNpemUoKSk7CgkJCQkJCSRvYmpXcml0ZXItPmVuZEVsZW1lbnQoKTsKCgkJCQkJCS8vIFVuZGVybGluZQoJCQkJCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJHByZWZpeC4ndScpOwoJCQkJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgndmFsJywgJGVsZW1lbnQtPmdldEZvbnQoKS0+Z2V0VW5kZXJsaW5lKCkpOwoJCQkJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgoJCQkJCSRvYmpXcml0ZXItPmVuZEVsZW1lbnQoKTsKCQkJCX0KCgkJCQkvLyB0CgkJCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJHByZWZpeC4ndCcpOwoJCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ3htbDpzcGFjZScsICdwcmVzZXJ2ZScpOwoJCQkJJG9ialdyaXRlci0+d3JpdGVSYXdEYXRhKFBIUEV4Y2VsX1NoYXJlZF9TdHJpbmc6OkNvbnRyb2xDaGFyYWN0ZXJQSFAyT09YTUwoICRlbGVtZW50LT5nZXRUZXh0KCkgKSk7CgkJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgoJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgkJfQoJfQoKCS8qKgoJICogV3JpdGUgUmljaCBUZXh0CgkgKgoJICogQHBhcmFtIAlQSFBFeGNlbF9TaGFyZWRfWE1MV3JpdGVyCSRvYmpXcml0ZXIgCQlYTUwgV3JpdGVyCgkgKiBAcGFyYW0gCVBIUEV4Y2VsX1JpY2hUZXh0CQkJJHBSaWNoVGV4dAkJUmljaCB0ZXh0CgkgKiBAcGFyYW0gCXN0cmluZwkJCQkJCSRwcmVmaXgJCQlPcHRpb25hbCBOYW1lc3BhY2UgcHJlZml4CgkgKiBAdGhyb3dzIAlFeGNlcHRpb24KCSAqLwoJcHVibGljIGZ1bmN0aW9uIHdyaXRlUmljaFRleHRGb3JDaGFydHMoUEhQRXhjZWxfU2hhcmVkX1hNTFdyaXRlciAkb2JqV3JpdGVyID0gbnVsbCwgUEhQRXhjZWxfUmljaFRleHQgJHBSaWNoVGV4dCA9IG51bGwsICRwcmVmaXg9TlVMTCkKCXsKCQlpZiAoJHByZWZpeCAhPT0gTlVMTCkKCQkJJHByZWZpeCAuPSAnOic7CgkJLy8gTG9vcCB0aHJvdWdoIHJpY2ggdGV4dCBlbGVtZW50cwoJCSRlbGVtZW50cyA9ICRwUmljaFRleHQtPmdldFJpY2hUZXh0RWxlbWVudHMoKTsKCQlmb3JlYWNoICgkZWxlbWVudHMgYXMgJGVsZW1lbnQpIHsKCQkJLy8gcgoJCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJHByZWZpeC4ncicpOwoKCQkJCS8vIHJQcgoJCQkJJG9ialdyaXRlci0+c3RhcnRFbGVtZW50KCRwcmVmaXguJ3JQcicpOwoKCQkJCQkvLyBCb2xkCgkJCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ2InLCAoJGVsZW1lbnQtPmdldEZvbnQoKS0+Z2V0Qm9sZCgpID8gMSA6IDApKTsKCQkJCQkvLyBJdGFsaWMKCQkJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgnaScsICgkZWxlbWVudC0+Z2V0Rm9udCgpLT5nZXRJdGFsaWMoKSA/IDEgOiAwKSk7CgkJCQkJLy8gVW5kZXJsaW5lCgkJCQkJJHVuZGVybGluZVR5cGUgPSAkZWxlbWVudC0+Z2V0Rm9udCgpLT5nZXRVbmRlcmxpbmUoKTsKCQkJCQlzd2l0Y2goJHVuZGVybGluZVR5cGUpIHsKCQkJCQkJY2FzZSAnc2luZ2xlJyA6CgkJCQkJCQkkdW5kZXJsaW5lVHlwZSA9ICdzbmcnOwoJCQkJCQkJYnJlYWs7CgkJCQkJCWNhc2UgJ2RvdWJsZScgOgoJCQkJCQkJJHVuZGVybGluZVR5cGUgPSAnZGJsJzsKCQkJCQkJCWJyZWFrOwoJCQkJCX0KCQkJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgndScsICR1bmRlcmxpbmVUeXBlKTsKCQkJCQkvLyBTdHJpa2V0aHJvdWdoCgkJCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ3N0cmlrZScsICgkZWxlbWVudC0+Z2V0Rm9udCgpLT5nZXRTdHJpa2V0aHJvdWdoKCkgPyAnc25nU3RyaWtlJyA6ICdub1N0cmlrZScpKTsKCgkJCQkJLy8gckZvbnQKCQkJCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJHByZWZpeC4nbGF0aW4nKTsKCQkJCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ3R5cGVmYWNlJywgJGVsZW1lbnQtPmdldEZvbnQoKS0+Z2V0TmFtZSgpKTsKCQkJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgoJCQkJCS8vIFN1cGVyc2NyaXB0IC8gc3Vic2NyaXB0Ci8vCQkJCQlpZiAoJGVsZW1lbnQtPmdldEZvbnQoKS0+Z2V0U3VwZXJTY3JpcHQoKSB8fCAkZWxlbWVudC0+Z2V0Rm9udCgpLT5nZXRTdWJTY3JpcHQoKSkgewovLwkJCQkJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgkcHJlZml4Lid2ZXJ0QWxpZ24nKTsKLy8JCQkJCQlpZiAoJGVsZW1lbnQtPmdldEZvbnQoKS0+Z2V0U3VwZXJTY3JpcHQoKSkgewovLwkJCQkJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgndmFsJywgJ3N1cGVyc2NyaXB0Jyk7Ci8vCQkJCQkJfSBlbHNlIGlmICgkZWxlbWVudC0+Z2V0Rm9udCgpLT5nZXRTdWJTY3JpcHQoKSkgewovLwkJCQkJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgndmFsJywgJ3N1YnNjcmlwdCcpOwovLwkJCQkJCX0KLy8JCQkJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7Ci8vCQkJCQl9Ci8vCgkJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgoJCQkJLy8gdAoJCQkJJG9ialdyaXRlci0+c3RhcnRFbGVtZW50KCRwcmVmaXguJ3QnKTsKCQkJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgneG1sOnNwYWNlJywgJ3ByZXNlcnZlJyk7CgkJCQkJJG9ialdyaXRlci0+d3JpdGVSYXdEYXRhKFBIUEV4Y2VsX1NoYXJlZF9TdHJpbmc6OkNvbnRyb2xDaGFyYWN0ZXJQSFAyT09YTUwoICRlbGVtZW50LT5nZXRUZXh0KCkgKSk7CgkJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgoJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgkJfQoJfQoKCS8qKgoJICogRmxpcCBzdHJpbmcgdGFibGUgKGZvciBpbmRleCBzZWFyY2hpbmcpCgkgKgoJICogQHBhcmFtIAlhcnJheQkkc3RyaW5nVGFibGUJU3RyaW5ndGFibGUKCSAqIEByZXR1cm4gCWFycmF5CgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBmbGlwU3RyaW5nVGFibGUoJHN0cmluZ1RhYmxlID0gYXJyYXkoKSkgewoJCS8vIFJldHVybiB2YWx1ZQoJCSRyZXR1cm5WYWx1ZSA9IGFycmF5KCk7CgoJCS8vIExvb3AgdGhyb3VnaCBzdHJpbmd0YWJsZSBhbmQgYWRkIGZsaXBwZWQgaXRlbXMgdG8gJHJldHVyblZhbHVlCgkJZm9yZWFjaCAoJHN0cmluZ1RhYmxlIGFzICRrZXkgPT4gJHZhbHVlKSB7CgkJCWlmICghICR2YWx1ZSBpbnN0YW5jZW9mIFBIUEV4Y2VsX1JpY2hUZXh0KSB7CgkJCQkkcmV0dXJuVmFsdWVbJHZhbHVlXSA9ICRrZXk7CgkJCX0gZWxzZSBpZiAoJHZhbHVlIGluc3RhbmNlb2YgUEhQRXhjZWxfUmljaFRleHQpIHsKCQkJCSRyZXR1cm5WYWx1ZVskdmFsdWUtPmdldEhhc2hDb2RlKCldID0gJGtleTsKCQkJfQoJCX0KCgkJLy8gUmV0dXJuCgkJcmV0dXJuICRyZXR1cm5WYWx1ZTsKCX0KfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Writer/Excel2007/Style.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIFBIUEV4Y2VsCiAqCiAqIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICoKICogQGNhdGVnb3J5ICAgUEhQRXhjZWwKICogQHBhY2thZ2UgICAgUEhQRXhjZWxfV3JpdGVyX0V4Y2VsMjAwNwogKiBAY29weXJpZ2h0ICBDb3B5cmlnaHQgKGMpIDIwMDYgLSAyMDEyIFBIUEV4Y2VsIChodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9QSFBFeGNlbCkKICogQGxpY2Vuc2UgICAgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL29sZC1saWNlbnNlcy9sZ3BsLTIuMS50eHQJTEdQTAogKiBAdmVyc2lvbiAgICAxLjcuNywgMjAxMi0wNS0xOQogKi8KCgovKioKICogUEhQRXhjZWxfV3JpdGVyX0V4Y2VsMjAwN19TdHlsZQogKgogKiBAY2F0ZWdvcnkgICBQSFBFeGNlbAogKiBAcGFja2FnZSAgICBQSFBFeGNlbF9Xcml0ZXJfRXhjZWwyMDA3CiAqIEBjb3B5cmlnaHQgIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwgKGh0dHA6Ly93d3cuY29kZXBsZXguY29tL1BIUEV4Y2VsKQogKi8KY2xhc3MgUEhQRXhjZWxfV3JpdGVyX0V4Y2VsMjAwN19TdHlsZSBleHRlbmRzIFBIUEV4Y2VsX1dyaXRlcl9FeGNlbDIwMDdfV3JpdGVyUGFydAp7CgkvKioKCSAqIFdyaXRlIHN0eWxlcyB0byBYTUwgZm9ybWF0CgkgKgoJICogQHBhcmFtIAlQSFBFeGNlbAkkcFBIUEV4Y2VsCgkgKiBAcmV0dXJuIAlzdHJpbmcgCQlYTUwgT3V0cHV0CgkgKiBAdGhyb3dzIAlFeGNlcHRpb24KCSAqLwoJcHVibGljIGZ1bmN0aW9uIHdyaXRlU3R5bGVzKFBIUEV4Y2VsICRwUEhQRXhjZWwgPSBudWxsKQoJewoJCS8vIENyZWF0ZSBYTUwgd3JpdGVyCgkJJG9ialdyaXRlciA9IG51bGw7CgkJaWYgKCR0aGlzLT5nZXRQYXJlbnRXcml0ZXIoKS0+Z2V0VXNlRGlza0NhY2hpbmcoKSkgewoJCQkkb2JqV3JpdGVyID0gbmV3IFBIUEV4Y2VsX1NoYXJlZF9YTUxXcml0ZXIoUEhQRXhjZWxfU2hhcmVkX1hNTFdyaXRlcjo6U1RPUkFHRV9ESVNLLCAkdGhpcy0+Z2V0UGFyZW50V3JpdGVyKCktPmdldERpc2tDYWNoaW5nRGlyZWN0b3J5KCkpOwoJCX0gZWxzZSB7CgkJCSRvYmpXcml0ZXIgPSBuZXcgUEhQRXhjZWxfU2hhcmVkX1hNTFdyaXRlcihQSFBFeGNlbF9TaGFyZWRfWE1MV3JpdGVyOjpTVE9SQUdFX01FTU9SWSk7CgkJfQoKCQkvLyBYTUwgaGVhZGVyCgkJJG9ialdyaXRlci0+c3RhcnREb2N1bWVudCgnMS4wJywnVVRGLTgnLCd5ZXMnKTsKCgkJLy8gc3R5bGVTaGVldAoJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgnc3R5bGVTaGVldCcpOwoJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCd4bWw6c3BhY2UnLCAncHJlc2VydmUnKTsKCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgneG1sbnMnLCAnaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL3NwcmVhZHNoZWV0bWwvMjAwNi9tYWluJyk7CgoJCQkvLyBudW1GbXRzCgkJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgnbnVtRm10cycpOwoJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgnY291bnQnLCAkdGhpcy0+Z2V0UGFyZW50V3JpdGVyKCktPmdldE51bUZtdEhhc2hUYWJsZSgpLT5jb3VudCgpKTsKCgkJCQkvLyBudW1GbXQKCQkJCWZvciAoJGkgPSAwOyAkaSA8ICR0aGlzLT5nZXRQYXJlbnRXcml0ZXIoKS0+Z2V0TnVtRm10SGFzaFRhYmxlKCktPmNvdW50KCk7ICsrJGkpIHsKCQkJCQkkdGhpcy0+X3dyaXRlTnVtRm10KCRvYmpXcml0ZXIsICR0aGlzLT5nZXRQYXJlbnRXcml0ZXIoKS0+Z2V0TnVtRm10SGFzaFRhYmxlKCktPmdldEJ5SW5kZXgoJGkpLCAkaSk7CgkJCQl9CgoJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgoJCQkvLyBmb250cwoJCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ2ZvbnRzJyk7CgkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCdjb3VudCcsICR0aGlzLT5nZXRQYXJlbnRXcml0ZXIoKS0+Z2V0Rm9udEhhc2hUYWJsZSgpLT5jb3VudCgpKTsKCgkJCQkvLyBmb250CgkJCQlmb3IgKCRpID0gMDsgJGkgPCAkdGhpcy0+Z2V0UGFyZW50V3JpdGVyKCktPmdldEZvbnRIYXNoVGFibGUoKS0+Y291bnQoKTsgKyskaSkgewoJCQkJCSR0aGlzLT5fd3JpdGVGb250KCRvYmpXcml0ZXIsICR0aGlzLT5nZXRQYXJlbnRXcml0ZXIoKS0+Z2V0Rm9udEhhc2hUYWJsZSgpLT5nZXRCeUluZGV4KCRpKSk7CgkJCQl9CgoJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgoJCQkvLyBmaWxscwoJCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ2ZpbGxzJyk7CgkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCdjb3VudCcsICR0aGlzLT5nZXRQYXJlbnRXcml0ZXIoKS0+Z2V0RmlsbEhhc2hUYWJsZSgpLT5jb3VudCgpKTsKCgkJCQkvLyBmaWxsCgkJCQlmb3IgKCRpID0gMDsgJGkgPCAkdGhpcy0+Z2V0UGFyZW50V3JpdGVyKCktPmdldEZpbGxIYXNoVGFibGUoKS0+Y291bnQoKTsgKyskaSkgewoJCQkJCSR0aGlzLT5fd3JpdGVGaWxsKCRvYmpXcml0ZXIsICR0aGlzLT5nZXRQYXJlbnRXcml0ZXIoKS0+Z2V0RmlsbEhhc2hUYWJsZSgpLT5nZXRCeUluZGV4KCRpKSk7CgkJCQl9CgoJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgoJCQkvLyBib3JkZXJzCgkJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgnYm9yZGVycycpOwoJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgnY291bnQnLCAkdGhpcy0+Z2V0UGFyZW50V3JpdGVyKCktPmdldEJvcmRlcnNIYXNoVGFibGUoKS0+Y291bnQoKSk7CgoJCQkJLy8gYm9yZGVyCgkJCQlmb3IgKCRpID0gMDsgJGkgPCAkdGhpcy0+Z2V0UGFyZW50V3JpdGVyKCktPmdldEJvcmRlcnNIYXNoVGFibGUoKS0+Y291bnQoKTsgKyskaSkgewoJCQkJCSR0aGlzLT5fd3JpdGVCb3JkZXIoJG9ialdyaXRlciwgJHRoaXMtPmdldFBhcmVudFdyaXRlcigpLT5nZXRCb3JkZXJzSGFzaFRhYmxlKCktPmdldEJ5SW5kZXgoJGkpKTsKCQkJCX0KCgkJCSRvYmpXcml0ZXItPmVuZEVsZW1lbnQoKTsKCgkJCS8vIGNlbGxTdHlsZVhmcwoJCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ2NlbGxTdHlsZVhmcycpOwoJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgnY291bnQnLCAxKTsKCgkJCQkvLyB4ZgoJCQkJJG9ialdyaXRlci0+c3RhcnRFbGVtZW50KCd4ZicpOwoJCQkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCdudW1GbXRJZCcsIAkwKTsKCQkJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgnZm9udElkJywgCTApOwoJCQkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCdmaWxsSWQnLCAJMCk7CgkJCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ2JvcmRlcklkJywJMCk7CgkJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgoJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgoJCQkvLyBjZWxsWGZzCgkJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgnY2VsbFhmcycpOwoJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgnY291bnQnLCBjb3VudCgkcFBIUEV4Y2VsLT5nZXRDZWxsWGZDb2xsZWN0aW9uKCkpKTsKCgkJCQkvLyB4ZgoJCQkJZm9yZWFjaCAoJHBQSFBFeGNlbC0+Z2V0Q2VsbFhmQ29sbGVjdGlvbigpIGFzICRjZWxsWGYpIHsKCQkJCQkkdGhpcy0+X3dyaXRlQ2VsbFN0eWxlWGYoJG9ialdyaXRlciwgJGNlbGxYZiwgJHBQSFBFeGNlbCk7CgkJCQl9CgoJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgoJCQkvLyBjZWxsU3R5bGVzCgkJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgnY2VsbFN0eWxlcycpOwoJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgnY291bnQnLCAxKTsKCgkJCQkvLyBjZWxsU3R5bGUKCQkJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgnY2VsbFN0eWxlJyk7CgkJCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ25hbWUnLCAJCSdOb3JtYWwnKTsKCQkJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgneGZJZCcsIAkJMCk7CgkJCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ2J1aWx0aW5JZCcsCTApOwoJCQkJJG9ialdyaXRlci0+ZW5kRWxlbWVudCgpOwoKCQkJJG9ialdyaXRlci0+ZW5kRWxlbWVudCgpOwoKCQkJLy8gZHhmcwoJCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ2R4ZnMnKTsKCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ2NvdW50JywgJHRoaXMtPmdldFBhcmVudFdyaXRlcigpLT5nZXRTdHlsZXNDb25kaXRpb25hbEhhc2hUYWJsZSgpLT5jb3VudCgpKTsKCgkJCQkvLyBkeGYKCQkJCWZvciAoJGkgPSAwOyAkaSA8ICR0aGlzLT5nZXRQYXJlbnRXcml0ZXIoKS0+Z2V0U3R5bGVzQ29uZGl0aW9uYWxIYXNoVGFibGUoKS0+Y291bnQoKTsgKyskaSkgewoJCQkJCSR0aGlzLT5fd3JpdGVDZWxsU3R5bGVEeGYoJG9ialdyaXRlciwgJHRoaXMtPmdldFBhcmVudFdyaXRlcigpLT5nZXRTdHlsZXNDb25kaXRpb25hbEhhc2hUYWJsZSgpLT5nZXRCeUluZGV4KCRpKS0+Z2V0U3R5bGUoKSk7CgkJCQl9CgoJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgoJCQkvLyB0YWJsZVN0eWxlcwoJCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ3RhYmxlU3R5bGVzJyk7CgkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCdkZWZhdWx0VGFibGVTdHlsZScsICdUYWJsZVN0eWxlTWVkaXVtOScpOwoJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgnZGVmYXVsdFBpdm90U3R5bGUnLCAnUGl2b3RUYWJsZVN0eWxlMScpOwoJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgoJCSRvYmpXcml0ZXItPmVuZEVsZW1lbnQoKTsKCgkJLy8gUmV0dXJuCgkJcmV0dXJuICRvYmpXcml0ZXItPmdldERhdGEoKTsKCX0KCgkvKioKCSAqIFdyaXRlIEZpbGwKCSAqCgkgKiBAcGFyYW0gCVBIUEV4Y2VsX1NoYXJlZF9YTUxXcml0ZXIgCSRvYmpXcml0ZXIgCQlYTUwgV3JpdGVyCgkgKiBAcGFyYW0gCVBIUEV4Y2VsX1N0eWxlX0ZpbGwJCQkkcEZpbGwJCQlGaWxsIHN0eWxlCgkgKiBAdGhyb3dzIAlFeGNlcHRpb24KCSAqLwoJcHJpdmF0ZSBmdW5jdGlvbiBfd3JpdGVGaWxsKFBIUEV4Y2VsX1NoYXJlZF9YTUxXcml0ZXIgJG9ialdyaXRlciA9IG51bGwsIFBIUEV4Y2VsX1N0eWxlX0ZpbGwgJHBGaWxsID0gbnVsbCkKCXsKCQkvLyBDaGVjayBpZiB0aGlzIGlzIGEgcGF0dGVybiB0eXBlIG9yIGdyYWRpZW50IHR5cGUKCQlpZiAoJHBGaWxsLT5nZXRGaWxsVHlwZSgpID09IFBIUEV4Y2VsX1N0eWxlX0ZpbGw6OkZJTExfR1JBRElFTlRfTElORUFSCgkJCXx8ICRwRmlsbC0+Z2V0RmlsbFR5cGUoKSA9PSBQSFBFeGNlbF9TdHlsZV9GaWxsOjpGSUxMX0dSQURJRU5UX1BBVEgpIHsKCQkJLy8gR3JhZGllbnQgZmlsbAoJCQkkdGhpcy0+X3dyaXRlR3JhZGllbnRGaWxsKCRvYmpXcml0ZXIsICRwRmlsbCk7CgkJfSBlbHNlIHsKCQkJLy8gUGF0dGVybiBmaWxsCgkJCSR0aGlzLT5fd3JpdGVQYXR0ZXJuRmlsbCgkb2JqV3JpdGVyLCAkcEZpbGwpOwoJCX0KCX0KCgkvKioKCSAqIFdyaXRlIEdyYWRpZW50IEZpbGwKCSAqCgkgKiBAcGFyYW0gCVBIUEV4Y2VsX1NoYXJlZF9YTUxXcml0ZXIgCSRvYmpXcml0ZXIgCQlYTUwgV3JpdGVyCgkgKiBAcGFyYW0gCVBIUEV4Y2VsX1N0eWxlX0ZpbGwJCQkkcEZpbGwJCQlGaWxsIHN0eWxlCgkgKiBAdGhyb3dzIAlFeGNlcHRpb24KCSAqLwoJcHJpdmF0ZSBmdW5jdGlvbiBfd3JpdGVHcmFkaWVudEZpbGwoUEhQRXhjZWxfU2hhcmVkX1hNTFdyaXRlciAkb2JqV3JpdGVyID0gbnVsbCwgUEhQRXhjZWxfU3R5bGVfRmlsbCAkcEZpbGwgPSBudWxsKQoJewoJCS8vIGZpbGwKCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ2ZpbGwnKTsKCgkJCS8vIGdyYWRpZW50RmlsbAoJCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ2dyYWRpZW50RmlsbCcpOwoJCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ3R5cGUnLCAJCSRwRmlsbC0+Z2V0RmlsbFR5cGUoKSk7CgkJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgnZGVncmVlJywgCSRwRmlsbC0+Z2V0Um90YXRpb24oKSk7CgoJCQkJLy8gc3RvcAoJCQkJJG9ialdyaXRlci0+c3RhcnRFbGVtZW50KCdzdG9wJyk7CgkJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgncG9zaXRpb24nLCAnMCcpOwoKCQkJCQkvLyBjb2xvcgoJCQkJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgnY29sb3InKTsKCQkJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgncmdiJywgJHBGaWxsLT5nZXRTdGFydENvbG9yKCktPmdldEFSR0IoKSk7CgkJCQkJJG9ialdyaXRlci0+ZW5kRWxlbWVudCgpOwoKCQkJCSRvYmpXcml0ZXItPmVuZEVsZW1lbnQoKTsKCgkJCQkvLyBzdG9wCgkJCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ3N0b3AnKTsKCQkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCdwb3NpdGlvbicsICcxJyk7CgoJCQkJCS8vIGNvbG9yCgkJCQkJJG9ialdyaXRlci0+c3RhcnRFbGVtZW50KCdjb2xvcicpOwoJCQkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCdyZ2InLCAkcEZpbGwtPmdldEVuZENvbG9yKCktPmdldEFSR0IoKSk7CgkJCQkJJG9ialdyaXRlci0+ZW5kRWxlbWVudCgpOwoKCQkJCSRvYmpXcml0ZXItPmVuZEVsZW1lbnQoKTsKCgkJCSRvYmpXcml0ZXItPmVuZEVsZW1lbnQoKTsKCgkJJG9ialdyaXRlci0+ZW5kRWxlbWVudCgpOwoJfQoKCS8qKgoJICogV3JpdGUgUGF0dGVybiBGaWxsCgkgKgoJICogQHBhcmFtIAlQSFBFeGNlbF9TaGFyZWRfWE1MV3JpdGVyCQkJJG9ialdyaXRlciAJCVhNTCBXcml0ZXIKCSAqIEBwYXJhbSAJUEhQRXhjZWxfU3R5bGVfRmlsbAkJCQkJJHBGaWxsCQkJRmlsbCBzdHlsZQoJICogQHRocm93cyAJRXhjZXB0aW9uCgkgKi8KCXByaXZhdGUgZnVuY3Rpb24gX3dyaXRlUGF0dGVybkZpbGwoUEhQRXhjZWxfU2hhcmVkX1hNTFdyaXRlciAkb2JqV3JpdGVyID0gbnVsbCwgUEhQRXhjZWxfU3R5bGVfRmlsbCAkcEZpbGwgPSBudWxsKQoJewoJCS8vIGZpbGwKCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ2ZpbGwnKTsKCgkJCS8vIHBhdHRlcm5GaWxsCgkJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgncGF0dGVybkZpbGwnKTsKCQkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCdwYXR0ZXJuVHlwZScsICRwRmlsbC0+Z2V0RmlsbFR5cGUoKSk7CgoJCQkJLy8gZmdDb2xvcgoJCQkJJG9ialdyaXRlci0+c3RhcnRFbGVtZW50KCdmZ0NvbG9yJyk7CgkJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgncmdiJywgJHBGaWxsLT5nZXRTdGFydENvbG9yKCktPmdldEFSR0IoKSk7CgkJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgoJCQkJLy8gYmdDb2xvcgoJCQkJJG9ialdyaXRlci0+c3RhcnRFbGVtZW50KCdiZ0NvbG9yJyk7CgkJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgncmdiJywgJHBGaWxsLT5nZXRFbmRDb2xvcigpLT5nZXRBUkdCKCkpOwoJCQkJJG9ialdyaXRlci0+ZW5kRWxlbWVudCgpOwoKCQkJJG9ialdyaXRlci0+ZW5kRWxlbWVudCgpOwoKCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7Cgl9CgoJLyoqCgkgKiBXcml0ZSBGb250CgkgKgoJICogQHBhcmFtIAlQSFBFeGNlbF9TaGFyZWRfWE1MV3JpdGVyCQkkb2JqV3JpdGVyIAkJWE1MIFdyaXRlcgoJICogQHBhcmFtIAlQSFBFeGNlbF9TdHlsZV9Gb250CQkJCSRwRm9udAkJCUZvbnQgc3R5bGUKCSAqIEB0aHJvd3MgCUV4Y2VwdGlvbgoJICovCglwcml2YXRlIGZ1bmN0aW9uIF93cml0ZUZvbnQoUEhQRXhjZWxfU2hhcmVkX1hNTFdyaXRlciAkb2JqV3JpdGVyID0gbnVsbCwgUEhQRXhjZWxfU3R5bGVfRm9udCAkcEZvbnQgPSBudWxsKQoJewoJCS8vIGZvbnQKCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ2ZvbnQnKTsKCgkJCS8vIE5hbWUKCQkJJG9ialdyaXRlci0+c3RhcnRFbGVtZW50KCduYW1lJyk7CgkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCd2YWwnLCAkcEZvbnQtPmdldE5hbWUoKSk7CgkJCSRvYmpXcml0ZXItPmVuZEVsZW1lbnQoKTsKCgkJCS8vIFNpemUKCQkJJG9ialdyaXRlci0+c3RhcnRFbGVtZW50KCdzeicpOwoJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgndmFsJywgJHBGb250LT5nZXRTaXplKCkpOwoJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgoJCQkvLyBCb2xkLiBXZSBleHBsaWNpdGx5IHdyaXRlIHRoaXMgZWxlbWVudCBhbHNvIHdoZW4gZmFsc2UgKGxpa2UgTVMgT2ZmaWNlIEV4Y2VsIDIwMDcgZG9lcwoJCQkvLyBmb3IgY29uZGl0aW9uYWwgZm9ybWF0dGluZykuIE90aGVyd2lzZSBpdCB3aWxsIGFwcGFyZW50bHkgbm90IGJlIHBpY2tlZCB1cCBpbiBjb25kaXRpb25hbAoJCQkvLyBmb3JtYXR0aW5nIHN0eWxlIGRpYWxvZwoJCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ2InKTsKCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ3ZhbCcsICRwRm9udC0+Z2V0Qm9sZCgpID8gJzEnIDogJzAnKTsKCQkJJG9ialdyaXRlci0+ZW5kRWxlbWVudCgpOwoKCQkJLy8gSXRhbGljCgkJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgnaScpOwoJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgndmFsJywgJHBGb250LT5nZXRJdGFsaWMoKSA/ICcxJyA6ICcwJyk7CgkJCSRvYmpXcml0ZXItPmVuZEVsZW1lbnQoKTsKCgkJCS8vIFN1cGVyc2NyaXB0IC8gc3Vic2NyaXB0CgkJCWlmICgkcEZvbnQtPmdldFN1cGVyU2NyaXB0KCkgfHwgJHBGb250LT5nZXRTdWJTY3JpcHQoKSkgewoJCQkJJG9ialdyaXRlci0+c3RhcnRFbGVtZW50KCd2ZXJ0QWxpZ24nKTsKCQkJCWlmICgkcEZvbnQtPmdldFN1cGVyU2NyaXB0KCkpIHsKCQkJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgndmFsJywgJ3N1cGVyc2NyaXB0Jyk7CgkJCQl9IGVsc2UgaWYgKCRwRm9udC0+Z2V0U3ViU2NyaXB0KCkpIHsKCQkJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgndmFsJywgJ3N1YnNjcmlwdCcpOwoJCQkJfQoJCQkJJG9ialdyaXRlci0+ZW5kRWxlbWVudCgpOwoJCQl9CgoJCQkvLyBVbmRlcmxpbmUKCQkJJG9ialdyaXRlci0+c3RhcnRFbGVtZW50KCd1Jyk7CgkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCd2YWwnLCAkcEZvbnQtPmdldFVuZGVybGluZSgpKTsKCQkJJG9ialdyaXRlci0+ZW5kRWxlbWVudCgpOwoKCQkJLy8gU3RyaWtldGhyb3VnaAoJCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ3N0cmlrZScpOwoJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgndmFsJywgJHBGb250LT5nZXRTdHJpa2V0aHJvdWdoKCkgPyAnMScgOiAnMCcpOwoJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgoJCQkvLyBGb3JlZ3JvdW5kIGNvbG9yCgkJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgnY29sb3InKTsKCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ3JnYicsICRwRm9udC0+Z2V0Q29sb3IoKS0+Z2V0QVJHQigpKTsKCQkJJG9ialdyaXRlci0+ZW5kRWxlbWVudCgpOwoKCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7Cgl9CgoJLyoqCgkgKiBXcml0ZSBCb3JkZXIKCSAqCgkgKiBAcGFyYW0gCVBIUEV4Y2VsX1NoYXJlZF9YTUxXcml0ZXIJCQkkb2JqV3JpdGVyIAkJWE1MIFdyaXRlcgoJICogQHBhcmFtIAlQSFBFeGNlbF9TdHlsZV9Cb3JkZXJzCQkJCSRwQm9yZGVycwkJQm9yZGVycyBzdHlsZQoJICogQHRocm93cyAJRXhjZXB0aW9uCgkgKi8KCXByaXZhdGUgZnVuY3Rpb24gX3dyaXRlQm9yZGVyKFBIUEV4Y2VsX1NoYXJlZF9YTUxXcml0ZXIgJG9ialdyaXRlciA9IG51bGwsIFBIUEV4Y2VsX1N0eWxlX0JvcmRlcnMgJHBCb3JkZXJzID0gbnVsbCkKCXsKCQkvLyBXcml0ZSBib3JkZXIKCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ2JvcmRlcicpOwoJCQkvLyBEaWFnb25hbD8KCQkJc3dpdGNoICgkcEJvcmRlcnMtPmdldERpYWdvbmFsRGlyZWN0aW9uKCkpIHsKCQkJCWNhc2UgUEhQRXhjZWxfU3R5bGVfQm9yZGVyczo6RElBR09OQUxfVVA6CgkJCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ2RpYWdvbmFsVXAnLCAJJ3RydWUnKTsKCQkJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgnZGlhZ29uYWxEb3duJywgCSdmYWxzZScpOwoJCQkJCWJyZWFrOwoJCQkJY2FzZSBQSFBFeGNlbF9TdHlsZV9Cb3JkZXJzOjpESUFHT05BTF9ET1dOOgoJCQkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCdkaWFnb25hbFVwJywgCSdmYWxzZScpOwoJCQkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCdkaWFnb25hbERvd24nLCAJJ3RydWUnKTsKCQkJCQlicmVhazsKCQkJCWNhc2UgUEhQRXhjZWxfU3R5bGVfQm9yZGVyczo6RElBR09OQUxfQk9USDoKCQkJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgnZGlhZ29uYWxVcCcsIAkndHJ1ZScpOwoJCQkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCdkaWFnb25hbERvd24nLCAJJ3RydWUnKTsKCQkJCQlicmVhazsKCQkJfQoKCQkJLy8gQm9yZGVyUHIKCQkJJHRoaXMtPl93cml0ZUJvcmRlclByKCRvYmpXcml0ZXIsICdsZWZ0JywgCQkJJHBCb3JkZXJzLT5nZXRMZWZ0KCkpOwoJCQkkdGhpcy0+X3dyaXRlQm9yZGVyUHIoJG9ialdyaXRlciwgJ3JpZ2h0JywgCQkJJHBCb3JkZXJzLT5nZXRSaWdodCgpKTsKCQkJJHRoaXMtPl93cml0ZUJvcmRlclByKCRvYmpXcml0ZXIsICd0b3AnLCAJCQkkcEJvcmRlcnMtPmdldFRvcCgpKTsKCQkJJHRoaXMtPl93cml0ZUJvcmRlclByKCRvYmpXcml0ZXIsICdib3R0b20nLCAJCSRwQm9yZGVycy0+Z2V0Qm90dG9tKCkpOwoJCQkkdGhpcy0+X3dyaXRlQm9yZGVyUHIoJG9ialdyaXRlciwgJ2RpYWdvbmFsJywgCQkkcEJvcmRlcnMtPmdldERpYWdvbmFsKCkpOwoJCSRvYmpXcml0ZXItPmVuZEVsZW1lbnQoKTsKCX0KCgkvKioKCSAqIFdyaXRlIENlbGwgU3R5bGUgWGYKCSAqCgkgKiBAcGFyYW0gCVBIUEV4Y2VsX1NoYXJlZF9YTUxXcml0ZXIJCQkkb2JqV3JpdGVyIAkJWE1MIFdyaXRlcgoJICogQHBhcmFtIAlQSFBFeGNlbF9TdHlsZQkJCQkJCSRwU3R5bGUJCQlTdHlsZQoJICogQHBhcmFtIAlQSFBFeGNlbAkJCQkJCQkkcFBIUEV4Y2VsCQlXb3JrYm9vawoJICogQHRocm93cyAJRXhjZXB0aW9uCgkgKi8KCXByaXZhdGUgZnVuY3Rpb24gX3dyaXRlQ2VsbFN0eWxlWGYoUEhQRXhjZWxfU2hhcmVkX1hNTFdyaXRlciAkb2JqV3JpdGVyID0gbnVsbCwgUEhQRXhjZWxfU3R5bGUgJHBTdHlsZSA9IG51bGwsIFBIUEV4Y2VsICRwUEhQRXhjZWwgPSBudWxsKQoJewoJCS8vIHhmCgkJJG9ialdyaXRlci0+c3RhcnRFbGVtZW50KCd4ZicpOwoJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgneGZJZCcsIDApOwoJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgnZm9udElkJywgCQkJKGludCkkdGhpcy0+Z2V0UGFyZW50V3JpdGVyKCktPmdldEZvbnRIYXNoVGFibGUoKS0+Z2V0SW5kZXhGb3JIYXNoQ29kZSgkcFN0eWxlLT5nZXRGb250KCktPmdldEhhc2hDb2RlKCkpKTsKCgkJCWlmICgkcFN0eWxlLT5nZXROdW1iZXJGb3JtYXQoKS0+Z2V0QnVpbHRJbkZvcm1hdENvZGUoKSA9PT0gZmFsc2UpIHsKCQkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCdudW1GbXRJZCcsIAkJCShpbnQpKCR0aGlzLT5nZXRQYXJlbnRXcml0ZXIoKS0+Z2V0TnVtRm10SGFzaFRhYmxlKCktPmdldEluZGV4Rm9ySGFzaENvZGUoJHBTdHlsZS0+Z2V0TnVtYmVyRm9ybWF0KCktPmdldEhhc2hDb2RlKCkpICsgMTY0KSAgICk7CgkJCX0gZWxzZSB7CgkJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgnbnVtRm10SWQnLCAJCQkoaW50KSRwU3R5bGUtPmdldE51bWJlckZvcm1hdCgpLT5nZXRCdWlsdEluRm9ybWF0Q29kZSgpKTsKCQkJfQoKCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ2ZpbGxJZCcsIAkJCShpbnQpJHRoaXMtPmdldFBhcmVudFdyaXRlcigpLT5nZXRGaWxsSGFzaFRhYmxlKCktPmdldEluZGV4Rm9ySGFzaENvZGUoJHBTdHlsZS0+Z2V0RmlsbCgpLT5nZXRIYXNoQ29kZSgpKSk7CgkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCdib3JkZXJJZCcsIAkJCShpbnQpJHRoaXMtPmdldFBhcmVudFdyaXRlcigpLT5nZXRCb3JkZXJzSGFzaFRhYmxlKCktPmdldEluZGV4Rm9ySGFzaENvZGUoJHBTdHlsZS0+Z2V0Qm9yZGVycygpLT5nZXRIYXNoQ29kZSgpKSk7CgoJCQkvLyBBcHBseSBzdHlsZXM/CgkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCdhcHBseUZvbnQnLCAJCSgkcFBIUEV4Y2VsLT5nZXREZWZhdWx0U3R5bGUoKS0+Z2V0Rm9udCgpLT5nZXRIYXNoQ29kZSgpICE9ICRwU3R5bGUtPmdldEZvbnQoKS0+Z2V0SGFzaENvZGUoKSkgPyAnMScgOiAnMCcpOwoJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgnYXBwbHlOdW1iZXJGb3JtYXQnLCAoJHBQSFBFeGNlbC0+Z2V0RGVmYXVsdFN0eWxlKCktPmdldE51bWJlckZvcm1hdCgpLT5nZXRIYXNoQ29kZSgpICE9ICRwU3R5bGUtPmdldE51bWJlckZvcm1hdCgpLT5nZXRIYXNoQ29kZSgpKSA/ICcxJyA6ICcwJyk7CgkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCdhcHBseUZpbGwnLCAJCSgkcFBIUEV4Y2VsLT5nZXREZWZhdWx0U3R5bGUoKS0+Z2V0RmlsbCgpLT5nZXRIYXNoQ29kZSgpICE9ICRwU3R5bGUtPmdldEZpbGwoKS0+Z2V0SGFzaENvZGUoKSkgPyAnMScgOiAnMCcpOwoJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgnYXBwbHlCb3JkZXInLCAJCSgkcFBIUEV4Y2VsLT5nZXREZWZhdWx0U3R5bGUoKS0+Z2V0Qm9yZGVycygpLT5nZXRIYXNoQ29kZSgpICE9ICRwU3R5bGUtPmdldEJvcmRlcnMoKS0+Z2V0SGFzaENvZGUoKSkgPyAnMScgOiAnMCcpOwoJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgnYXBwbHlBbGlnbm1lbnQnLAkoJHBQSFBFeGNlbC0+Z2V0RGVmYXVsdFN0eWxlKCktPmdldEFsaWdubWVudCgpLT5nZXRIYXNoQ29kZSgpICE9ICRwU3R5bGUtPmdldEFsaWdubWVudCgpLT5nZXRIYXNoQ29kZSgpKSA/ICcxJyA6ICcwJyk7CgkJCWlmICgkcFN0eWxlLT5nZXRQcm90ZWN0aW9uKCktPmdldExvY2tlZCgpICE9IFBIUEV4Y2VsX1N0eWxlX1Byb3RlY3Rpb246OlBST1RFQ1RJT05fSU5IRVJJVCB8fCAkcFN0eWxlLT5nZXRQcm90ZWN0aW9uKCktPmdldEhpZGRlbigpICE9IFBIUEV4Y2VsX1N0eWxlX1Byb3RlY3Rpb246OlBST1RFQ1RJT05fSU5IRVJJVCkgewoJCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ2FwcGx5UHJvdGVjdGlvbicsICd0cnVlJyk7CgkJCX0KCgkJCS8vIGFsaWdubWVudAoJCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ2FsaWdubWVudCcpOwoJCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ2hvcml6b250YWwnLCAJJHBTdHlsZS0+Z2V0QWxpZ25tZW50KCktPmdldEhvcml6b250YWwoKSk7CgkJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgndmVydGljYWwnLCAJCSRwU3R5bGUtPmdldEFsaWdubWVudCgpLT5nZXRWZXJ0aWNhbCgpKTsKCgkJCQkkdGV4dFJvdGF0aW9uID0gMDsKCQkJCWlmICgkcFN0eWxlLT5nZXRBbGlnbm1lbnQoKS0+Z2V0VGV4dFJvdGF0aW9uKCkgPj0gMCkgewoJCQkJCSR0ZXh0Um90YXRpb24gPSAkcFN0eWxlLT5nZXRBbGlnbm1lbnQoKS0+Z2V0VGV4dFJvdGF0aW9uKCk7CgkJCQl9IGVsc2UgaWYgKCRwU3R5bGUtPmdldEFsaWdubWVudCgpLT5nZXRUZXh0Um90YXRpb24oKSA8IDApIHsKCQkJCQkkdGV4dFJvdGF0aW9uID0gOTAgLSAkcFN0eWxlLT5nZXRBbGlnbm1lbnQoKS0+Z2V0VGV4dFJvdGF0aW9uKCk7CgkJCQl9CgoJCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ3RleHRSb3RhdGlvbicsIAkkdGV4dFJvdGF0aW9uKTsKCQkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCd3cmFwVGV4dCcsIAkJKCRwU3R5bGUtPmdldEFsaWdubWVudCgpLT5nZXRXcmFwVGV4dCgpID8gJ3RydWUnIDogJ2ZhbHNlJykpOwoJCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ3Nocmlua1RvRml0JywgCSgkcFN0eWxlLT5nZXRBbGlnbm1lbnQoKS0+Z2V0U2hyaW5rVG9GaXQoKSA/ICd0cnVlJyA6ICdmYWxzZScpKTsKCgkJCQlpZiAoJHBTdHlsZS0+Z2V0QWxpZ25tZW50KCktPmdldEluZGVudCgpID4gMCkgewoJCQkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCdpbmRlbnQnLCAJJHBTdHlsZS0+Z2V0QWxpZ25tZW50KCktPmdldEluZGVudCgpKTsKCQkJCX0KCQkJJG9ialdyaXRlci0+ZW5kRWxlbWVudCgpOwoKCQkJLy8gcHJvdGVjdGlvbgoJCQlpZiAoJHBTdHlsZS0+Z2V0UHJvdGVjdGlvbigpLT5nZXRMb2NrZWQoKSAhPSBQSFBFeGNlbF9TdHlsZV9Qcm90ZWN0aW9uOjpQUk9URUNUSU9OX0lOSEVSSVQgfHwgJHBTdHlsZS0+Z2V0UHJvdGVjdGlvbigpLT5nZXRIaWRkZW4oKSAhPSBQSFBFeGNlbF9TdHlsZV9Qcm90ZWN0aW9uOjpQUk9URUNUSU9OX0lOSEVSSVQpIHsKCQkJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgncHJvdGVjdGlvbicpOwoJCQkJCWlmICgkcFN0eWxlLT5nZXRQcm90ZWN0aW9uKCktPmdldExvY2tlZCgpICE9IFBIUEV4Y2VsX1N0eWxlX1Byb3RlY3Rpb246OlBST1RFQ1RJT05fSU5IRVJJVCkgewoJCQkJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgnbG9ja2VkJywgCQkoJHBTdHlsZS0+Z2V0UHJvdGVjdGlvbigpLT5nZXRMb2NrZWQoKSA9PSBQSFBFeGNlbF9TdHlsZV9Qcm90ZWN0aW9uOjpQUk9URUNUSU9OX1BST1RFQ1RFRCA/ICd0cnVlJyA6ICdmYWxzZScpKTsKCQkJCQl9CgkJCQkJaWYgKCRwU3R5bGUtPmdldFByb3RlY3Rpb24oKS0+Z2V0SGlkZGVuKCkgIT0gUEhQRXhjZWxfU3R5bGVfUHJvdGVjdGlvbjo6UFJPVEVDVElPTl9JTkhFUklUKSB7CgkJCQkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCdoaWRkZW4nLCAJCSgkcFN0eWxlLT5nZXRQcm90ZWN0aW9uKCktPmdldEhpZGRlbigpID09IFBIUEV4Y2VsX1N0eWxlX1Byb3RlY3Rpb246OlBST1RFQ1RJT05fUFJPVEVDVEVEID8gJ3RydWUnIDogJ2ZhbHNlJykpOwoJCQkJCX0KCQkJCSRvYmpXcml0ZXItPmVuZEVsZW1lbnQoKTsKCQkJfQoKCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7Cgl9CgoJLyoqCgkgKiBXcml0ZSBDZWxsIFN0eWxlIER4ZgoJICoKCSAqIEBwYXJhbSAJUEhQRXhjZWxfU2hhcmVkX1hNTFdyaXRlciAJCSRvYmpXcml0ZXIgCQlYTUwgV3JpdGVyCgkgKiBAcGFyYW0gCVBIUEV4Y2VsX1N0eWxlCQkJCQkkcFN0eWxlCQkJU3R5bGUKCSAqIEB0aHJvd3MgCUV4Y2VwdGlvbgoJICovCglwcml2YXRlIGZ1bmN0aW9uIF93cml0ZUNlbGxTdHlsZUR4ZihQSFBFeGNlbF9TaGFyZWRfWE1MV3JpdGVyICRvYmpXcml0ZXIgPSBudWxsLCBQSFBFeGNlbF9TdHlsZSAkcFN0eWxlID0gbnVsbCkKCXsKCQkvLyBkeGYKCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ2R4ZicpOwoKCQkJLy8gZm9udAoJCQkkdGhpcy0+X3dyaXRlRm9udCgkb2JqV3JpdGVyLCAkcFN0eWxlLT5nZXRGb250KCkpOwoKCQkJLy8gbnVtRm10CgkJCSR0aGlzLT5fd3JpdGVOdW1GbXQoJG9ialdyaXRlciwgJHBTdHlsZS0+Z2V0TnVtYmVyRm9ybWF0KCkpOwoKCQkJLy8gZmlsbAoJCQkkdGhpcy0+X3dyaXRlRmlsbCgkb2JqV3JpdGVyLCAkcFN0eWxlLT5nZXRGaWxsKCkpOwoKCQkJLy8gYWxpZ25tZW50CgkJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgnYWxpZ25tZW50Jyk7CgkJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgnaG9yaXpvbnRhbCcsIAkkcFN0eWxlLT5nZXRBbGlnbm1lbnQoKS0+Z2V0SG9yaXpvbnRhbCgpKTsKCQkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCd2ZXJ0aWNhbCcsIAkJJHBTdHlsZS0+Z2V0QWxpZ25tZW50KCktPmdldFZlcnRpY2FsKCkpOwoKCQkJCSR0ZXh0Um90YXRpb24gPSAwOwoJCQkJaWYgKCRwU3R5bGUtPmdldEFsaWdubWVudCgpLT5nZXRUZXh0Um90YXRpb24oKSA+PSAwKSB7CgkJCQkJJHRleHRSb3RhdGlvbiA9ICRwU3R5bGUtPmdldEFsaWdubWVudCgpLT5nZXRUZXh0Um90YXRpb24oKTsKCQkJCX0gZWxzZSBpZiAoJHBTdHlsZS0+Z2V0QWxpZ25tZW50KCktPmdldFRleHRSb3RhdGlvbigpIDwgMCkgewoJCQkJCSR0ZXh0Um90YXRpb24gPSA5MCAtICRwU3R5bGUtPmdldEFsaWdubWVudCgpLT5nZXRUZXh0Um90YXRpb24oKTsKCQkJCX0KCgkJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgndGV4dFJvdGF0aW9uJywgCSR0ZXh0Um90YXRpb24pOwoJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgoJCQkvLyBib3JkZXIKCQkJJHRoaXMtPl93cml0ZUJvcmRlcigkb2JqV3JpdGVyLCAkcFN0eWxlLT5nZXRCb3JkZXJzKCkpOwoKCQkJLy8gcHJvdGVjdGlvbgoJCQlpZiAoJHBTdHlsZS0+Z2V0UHJvdGVjdGlvbigpLT5nZXRMb2NrZWQoKSAhPSBQSFBFeGNlbF9TdHlsZV9Qcm90ZWN0aW9uOjpQUk9URUNUSU9OX0lOSEVSSVQgfHwgJHBTdHlsZS0+Z2V0UHJvdGVjdGlvbigpLT5nZXRIaWRkZW4oKSAhPSBQSFBFeGNlbF9TdHlsZV9Qcm90ZWN0aW9uOjpQUk9URUNUSU9OX0lOSEVSSVQpIHsKCQkJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgncHJvdGVjdGlvbicpOwoJCQkJCWlmICgkcFN0eWxlLT5nZXRQcm90ZWN0aW9uKCktPmdldExvY2tlZCgpICE9IFBIUEV4Y2VsX1N0eWxlX1Byb3RlY3Rpb246OlBST1RFQ1RJT05fSU5IRVJJVCkgewoJCQkJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgnbG9ja2VkJywgCQkoJHBTdHlsZS0+Z2V0UHJvdGVjdGlvbigpLT5nZXRMb2NrZWQoKSA9PSBQSFBFeGNlbF9TdHlsZV9Qcm90ZWN0aW9uOjpQUk9URUNUSU9OX1BST1RFQ1RFRCA/ICd0cnVlJyA6ICdmYWxzZScpKTsKCQkJCQl9CgkJCQkJaWYgKCRwU3R5bGUtPmdldFByb3RlY3Rpb24oKS0+Z2V0SGlkZGVuKCkgIT0gUEhQRXhjZWxfU3R5bGVfUHJvdGVjdGlvbjo6UFJPVEVDVElPTl9JTkhFUklUKSB7CgkJCQkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCdoaWRkZW4nLCAJCSgkcFN0eWxlLT5nZXRQcm90ZWN0aW9uKCktPmdldEhpZGRlbigpID09IFBIUEV4Y2VsX1N0eWxlX1Byb3RlY3Rpb246OlBST1RFQ1RJT05fUFJPVEVDVEVEID8gJ3RydWUnIDogJ2ZhbHNlJykpOwoJCQkJCX0KCQkJCSRvYmpXcml0ZXItPmVuZEVsZW1lbnQoKTsKCQkJfQoKCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7Cgl9CgoJLyoqCgkgKiBXcml0ZSBCb3JkZXJQcgoJICoKCSAqIEBwYXJhbSAJUEhQRXhjZWxfU2hhcmVkX1hNTFdyaXRlcgkJJG9ialdyaXRlciAJCVhNTCBXcml0ZXIKCSAqIEBwYXJhbSAJc3RyaW5nCQkJCQkJCSRwTmFtZQkJCUVsZW1lbnQgbmFtZQoJICogQHBhcmFtIAlQSFBFeGNlbF9TdHlsZV9Cb3JkZXIJCQkkcEJvcmRlcgkJQm9yZGVyIHN0eWxlCgkgKiBAdGhyb3dzIAlFeGNlcHRpb24KCSAqLwoJcHJpdmF0ZSBmdW5jdGlvbiBfd3JpdGVCb3JkZXJQcihQSFBFeGNlbF9TaGFyZWRfWE1MV3JpdGVyICRvYmpXcml0ZXIgPSBudWxsLCAkcE5hbWUgPSAnbGVmdCcsIFBIUEV4Y2VsX1N0eWxlX0JvcmRlciAkcEJvcmRlciA9IG51bGwpCgl7CgkJLy8gV3JpdGUgQm9yZGVyUHIKCQlpZiAoJHBCb3JkZXItPmdldEJvcmRlclN0eWxlKCkgIT0gUEhQRXhjZWxfU3R5bGVfQm9yZGVyOjpCT1JERVJfTk9ORSkgewoJCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJHBOYW1lKTsKCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ3N0eWxlJywgCSRwQm9yZGVyLT5nZXRCb3JkZXJTdHlsZSgpKTsKCgkJCQkvLyBjb2xvcgoJCQkJJG9ialdyaXRlci0+c3RhcnRFbGVtZW50KCdjb2xvcicpOwoJCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ3JnYicsIAkkcEJvcmRlci0+Z2V0Q29sb3IoKS0+Z2V0QVJHQigpKTsKCQkJCSRvYmpXcml0ZXItPmVuZEVsZW1lbnQoKTsKCgkJCSRvYmpXcml0ZXItPmVuZEVsZW1lbnQoKTsKCQl9Cgl9CgoJLyoqCgkgKiBXcml0ZSBOdW1iZXJGb3JtYXQKCSAqCgkgKiBAcGFyYW0gCVBIUEV4Y2VsX1NoYXJlZF9YTUxXcml0ZXIJCQkkb2JqV3JpdGVyIAkJWE1MIFdyaXRlcgoJICogQHBhcmFtIAlQSFBFeGNlbF9TdHlsZV9OdW1iZXJGb3JtYXQJCQkkcE51bWJlckZvcm1hdAlOdW1iZXIgRm9ybWF0CgkgKiBAcGFyYW0gCWludAkJCQkJCQkJCSRwSWQJCQlOdW1iZXIgRm9ybWF0IGlkZW50aWZpZXIKCSAqIEB0aHJvd3MgCUV4Y2VwdGlvbgoJICovCglwcml2YXRlIGZ1bmN0aW9uIF93cml0ZU51bUZtdChQSFBFeGNlbF9TaGFyZWRfWE1MV3JpdGVyICRvYmpXcml0ZXIgPSBudWxsLCBQSFBFeGNlbF9TdHlsZV9OdW1iZXJGb3JtYXQgJHBOdW1iZXJGb3JtYXQgPSBudWxsLCAkcElkID0gMCkKCXsKCQkvLyBUcmFuc2xhdGUgZm9ybWF0Y29kZQoJCSRmb3JtYXRDb2RlID0gJHBOdW1iZXJGb3JtYXQtPmdldEZvcm1hdENvZGUoKTsKCgkJLy8gbnVtRm10CgkJJG9ialdyaXRlci0+c3RhcnRFbGVtZW50KCdudW1GbXQnKTsKCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ251bUZtdElkJywgCQkoJHBJZCArIDE2NCkpOwoJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgnZm9ybWF0Q29kZScsIAkkZm9ybWF0Q29kZSk7CgkJJG9ialdyaXRlci0+ZW5kRWxlbWVudCgpOwoJfQoKCS8qKgoJICogR2V0IGFuIGFycmF5IG9mIGFsbCBzdHlsZXMKCSAqCgkgKiBAcGFyYW0gCVBIUEV4Y2VsCQkJCSRwUEhQRXhjZWwKCSAqIEByZXR1cm4gCVBIUEV4Y2VsX1N0eWxlW10JCUFsbCBzdHlsZXMgaW4gUEhQRXhjZWwKCSAqIEB0aHJvd3MgCUV4Y2VwdGlvbgoJICovCglwdWJsaWMgZnVuY3Rpb24gYWxsU3R5bGVzKFBIUEV4Y2VsICRwUEhQRXhjZWwgPSBudWxsKQoJewoJCSRhU3R5bGVzID0gJHBQSFBFeGNlbC0+Z2V0Q2VsbFhmQ29sbGVjdGlvbigpOwoKCQlyZXR1cm4gJGFTdHlsZXM7Cgl9CgoJLyoqCgkgKiBHZXQgYW4gYXJyYXkgb2YgYWxsIGNvbmRpdGlvbmFsIHN0eWxlcwoJICoKCSAqIEBwYXJhbSAJUEhQRXhjZWwJCQkJCQkJJHBQSFBFeGNlbAoJICogQHJldHVybiAJUEhQRXhjZWxfU3R5bGVfQ29uZGl0aW9uYWxbXQkJQWxsIGNvbmRpdGlvbmFsIHN0eWxlcyBpbiBQSFBFeGNlbAoJICogQHRocm93cyAJRXhjZXB0aW9uCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBhbGxDb25kaXRpb25hbFN0eWxlcyhQSFBFeGNlbCAkcFBIUEV4Y2VsID0gbnVsbCkKCXsKCQkvLyBHZXQgYW4gYXJyYXkgb2YgYWxsIHN0eWxlcwoJCSRhU3R5bGVzCQk9IGFycmF5KCk7CgoJCSRzaGVldENvdW50ID0gJHBQSFBFeGNlbC0+Z2V0U2hlZXRDb3VudCgpOwoJCWZvciAoJGkgPSAwOyAkaSA8ICRzaGVldENvdW50OyArKyRpKSB7CgkJCWZvcmVhY2ggKCRwUEhQRXhjZWwtPmdldFNoZWV0KCRpKS0+Z2V0Q29uZGl0aW9uYWxTdHlsZXNDb2xsZWN0aW9uKCkgYXMgJGNvbmRpdGlvbmFsU3R5bGVzKSB7CgkJCQlmb3JlYWNoICgkY29uZGl0aW9uYWxTdHlsZXMgYXMgJGNvbmRpdGlvbmFsU3R5bGUpIHsKCQkJCQkkYVN0eWxlc1tdID0gJGNvbmRpdGlvbmFsU3R5bGU7CgkJCQl9CgkJCX0KCQl9CgoJCXJldHVybiAkYVN0eWxlczsKCX0KCgkvKioKCSAqIEdldCBhbiBhcnJheSBvZiBhbGwgZmlsbHMKCSAqCgkgKiBAcGFyYW0gCVBIUEV4Y2VsCQkJCQkJJHBQSFBFeGNlbAoJICogQHJldHVybiAJUEhQRXhjZWxfU3R5bGVfRmlsbFtdCQlBbGwgZmlsbHMgaW4gUEhQRXhjZWwKCSAqIEB0aHJvd3MgCUV4Y2VwdGlvbgoJICovCglwdWJsaWMgZnVuY3Rpb24gYWxsRmlsbHMoUEhQRXhjZWwgJHBQSFBFeGNlbCA9IG51bGwpCgl7CgkJLy8gR2V0IGFuIGFycmF5IG9mIHVuaXF1ZSBmaWxscwoJCSRhRmlsbHMgCT0gYXJyYXkoKTsKCgkJLy8gVHdvIGZpcnN0IGZpbGxzIGFyZSBwcmVkZWZpbmVkCgkJJGZpbGwwID0gbmV3IFBIUEV4Y2VsX1N0eWxlX0ZpbGwoKTsKCQkkZmlsbDAtPnNldEZpbGxUeXBlKFBIUEV4Y2VsX1N0eWxlX0ZpbGw6OkZJTExfTk9ORSk7CgkJJGFGaWxsc1tdID0gJGZpbGwwOwoKCQkkZmlsbDEgPSBuZXcgUEhQRXhjZWxfU3R5bGVfRmlsbCgpOwoJCSRmaWxsMS0+c2V0RmlsbFR5cGUoUEhQRXhjZWxfU3R5bGVfRmlsbDo6RklMTF9QQVRURVJOX0dSQVkxMjUpOwoJCSRhRmlsbHNbXSA9ICRmaWxsMTsKCgkJLy8gVGhlIHJlbWFpbmluZyBmaWxscwoJCSRhU3R5bGVzIAk9ICR0aGlzLT5hbGxTdHlsZXMoJHBQSFBFeGNlbCk7CgkJZm9yZWFjaCAoJGFTdHlsZXMgYXMgJHN0eWxlKSB7CgkJCWlmICghYXJyYXlfa2V5X2V4aXN0cygkc3R5bGUtPmdldEZpbGwoKS0+Z2V0SGFzaENvZGUoKSwgJGFGaWxscykpIHsKCQkJCSRhRmlsbHNbICRzdHlsZS0+Z2V0RmlsbCgpLT5nZXRIYXNoQ29kZSgpIF0gPSAkc3R5bGUtPmdldEZpbGwoKTsKCQkJfQoJCX0KCgkJcmV0dXJuICRhRmlsbHM7Cgl9CgoJLyoqCgkgKiBHZXQgYW4gYXJyYXkgb2YgYWxsIGZvbnRzCgkgKgoJICogQHBhcmFtIAlQSFBFeGNlbAkJCQkJCSRwUEhQRXhjZWwKCSAqIEByZXR1cm4gCVBIUEV4Y2VsX1N0eWxlX0ZvbnRbXQkJQWxsIGZvbnRzIGluIFBIUEV4Y2VsCgkgKiBAdGhyb3dzIAlFeGNlcHRpb24KCSAqLwoJcHVibGljIGZ1bmN0aW9uIGFsbEZvbnRzKFBIUEV4Y2VsICRwUEhQRXhjZWwgPSBudWxsKQoJewoJCS8vIEdldCBhbiBhcnJheSBvZiB1bmlxdWUgZm9udHMKCQkkYUZvbnRzIAk9IGFycmF5KCk7CgkJJGFTdHlsZXMgCT0gJHRoaXMtPmFsbFN0eWxlcygkcFBIUEV4Y2VsKTsKCgkJZm9yZWFjaCAoJGFTdHlsZXMgYXMgJHN0eWxlKSB7CgkJCWlmICghYXJyYXlfa2V5X2V4aXN0cygkc3R5bGUtPmdldEZvbnQoKS0+Z2V0SGFzaENvZGUoKSwgJGFGb250cykpIHsKCQkJCSRhRm9udHNbICRzdHlsZS0+Z2V0Rm9udCgpLT5nZXRIYXNoQ29kZSgpIF0gPSAkc3R5bGUtPmdldEZvbnQoKTsKCQkJfQoJCX0KCgkJcmV0dXJuICRhRm9udHM7Cgl9CgoJLyoqCgkgKiBHZXQgYW4gYXJyYXkgb2YgYWxsIGJvcmRlcnMKCSAqCgkgKiBAcGFyYW0gCVBIUEV4Y2VsCQkJCQkJJHBQSFBFeGNlbAoJICogQHJldHVybiAJUEhQRXhjZWxfU3R5bGVfQm9yZGVyc1tdCQlBbGwgYm9yZGVycyBpbiBQSFBFeGNlbAoJICogQHRocm93cyAJRXhjZXB0aW9uCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBhbGxCb3JkZXJzKFBIUEV4Y2VsICRwUEhQRXhjZWwgPSBudWxsKQoJewoJCS8vIEdldCBhbiBhcnJheSBvZiB1bmlxdWUgYm9yZGVycwoJCSRhQm9yZGVycyAJPSBhcnJheSgpOwoJCSRhU3R5bGVzIAk9ICR0aGlzLT5hbGxTdHlsZXMoJHBQSFBFeGNlbCk7CgoJCWZvcmVhY2ggKCRhU3R5bGVzIGFzICRzdHlsZSkgewoJCQlpZiAoIWFycmF5X2tleV9leGlzdHMoJHN0eWxlLT5nZXRCb3JkZXJzKCktPmdldEhhc2hDb2RlKCksICRhQm9yZGVycykpIHsKCQkJCSRhQm9yZGVyc1sgJHN0eWxlLT5nZXRCb3JkZXJzKCktPmdldEhhc2hDb2RlKCkgXSA9ICRzdHlsZS0+Z2V0Qm9yZGVycygpOwoJCQl9CgkJfQoKCQlyZXR1cm4gJGFCb3JkZXJzOwoJfQoKCS8qKgoJICogR2V0IGFuIGFycmF5IG9mIGFsbCBudW1iZXIgZm9ybWF0cwoJICoKCSAqIEBwYXJhbSAJUEhQRXhjZWwJCQkJCQkJCSRwUEhQRXhjZWwKCSAqIEByZXR1cm4gCVBIUEV4Y2VsX1N0eWxlX051bWJlckZvcm1hdFtdCQlBbGwgbnVtYmVyIGZvcm1hdHMgaW4gUEhQRXhjZWwKCSAqIEB0aHJvd3MgCUV4Y2VwdGlvbgoJICovCglwdWJsaWMgZnVuY3Rpb24gYWxsTnVtYmVyRm9ybWF0cyhQSFBFeGNlbCAkcFBIUEV4Y2VsID0gbnVsbCkKCXsKCQkvLyBHZXQgYW4gYXJyYXkgb2YgdW5pcXVlIG51bWJlciBmb3JtYXRzCgkJJGFOdW1GbXRzIAk9IGFycmF5KCk7CgkJJGFTdHlsZXMgCT0gJHRoaXMtPmFsbFN0eWxlcygkcFBIUEV4Y2VsKTsKCgkJZm9yZWFjaCAoJGFTdHlsZXMgYXMgJHN0eWxlKSB7CgkJCWlmICgkc3R5bGUtPmdldE51bWJlckZvcm1hdCgpLT5nZXRCdWlsdEluRm9ybWF0Q29kZSgpID09PSBmYWxzZSAmJiAhYXJyYXlfa2V5X2V4aXN0cygkc3R5bGUtPmdldE51bWJlckZvcm1hdCgpLT5nZXRIYXNoQ29kZSgpLCAkYU51bUZtdHMpKSB7CgkJCQkkYU51bUZtdHNbICRzdHlsZS0+Z2V0TnVtYmVyRm9ybWF0KCktPmdldEhhc2hDb2RlKCkgXSA9ICRzdHlsZS0+Z2V0TnVtYmVyRm9ybWF0KCk7CgkJCX0KCQl9CgoJCXJldHVybiAkYU51bUZtdHM7Cgl9Cn0K]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Writer/Excel2007/Theme.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIFBIUEV4Y2VsCiAqCiAqIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICoKICogQGNhdGVnb3J5ICAgUEhQRXhjZWwKICogQHBhY2thZ2UgICAgUEhQRXhjZWxfV3JpdGVyX0V4Y2VsMjAwNwogKiBAY29weXJpZ2h0ICBDb3B5cmlnaHQgKGMpIDIwMDYgLSAyMDEyIFBIUEV4Y2VsIChodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9QSFBFeGNlbCkKICogQGxpY2Vuc2UgICAgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL29sZC1saWNlbnNlcy9sZ3BsLTIuMS50eHQJTEdQTAogKiBAdmVyc2lvbiAgICAxLjcuNywgMjAxMi0wNS0xOQogKi8KCgovKioKICogUEhQRXhjZWxfV3JpdGVyX0V4Y2VsMjAwN19Eb2NQcm9wcwogKgogKiBAY2F0ZWdvcnkgICBQSFBFeGNlbAogKiBAcGFja2FnZSAgICBQSFBFeGNlbF9Xcml0ZXJfRXhjZWwyMDA3CiAqIEBjb3B5cmlnaHQgIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwgKGh0dHA6Ly93d3cuY29kZXBsZXguY29tL1BIUEV4Y2VsKQogKi8KY2xhc3MgUEhQRXhjZWxfV3JpdGVyX0V4Y2VsMjAwN19UaGVtZSBleHRlbmRzIFBIUEV4Y2VsX1dyaXRlcl9FeGNlbDIwMDdfV3JpdGVyUGFydAp7CgkvKioKCSAqIE1hcCBvZiBNYWpvciBmb250cyB0byB3cml0ZQoJICogQHN0YXRpYwlhcnJheSBvZiBzdHJpbmcKCSAqCgkgKi8KCXByaXZhdGUgc3RhdGljICRfbWFqb3JGb250cyA9IGFycmF5KAoJCQkJCSdKcGFuJyA9PiAn77yt77yzIO+8sOOCtOOCt+ODg+OCrycsCgkJCQkJJ0hhbmcnID0+ICfrp5HsnYAg6rOg65SVJywKCQkJCQknSGFucycgPT4gJ+Wui+S9kycsCgkJCQkJJ0hhbnQnID0+ICfmlrDntLDmmI7pq5QnLAoJCQkJCSdBcmFiJyA9PiAnVGltZXMgTmV3IFJvbWFuJywKCQkJCQknSGVicicgPT4gJ1RpbWVzIE5ldyBSb21hbicsCgkJCQkJJ1RoYWknID0+ICdUYWhvbWEnLAoJCQkJCSdFdGhpJyA9PiAnTnlhbGEnLAoJCQkJCSdCZW5nJyA9PiAnVnJpbmRhJywKCQkJCQknR3VqcicgPT4gJ1NocnV0aScsCgkJCQkJJ0tobXInID0+ICdNb29sQm9yYW4nLAoJCQkJCSdLbmRhJyA9PiAnVHVuZ2EnLAoJCQkJCSdHdXJ1JyA9PiAnUmFhdmknLAoJCQkJCSdDYW5zJyA9PiAnRXVwaGVtaWEnLAoJCQkJCSdDaGVyJyA9PiAnUGxhbnRhZ2VuZXQgQ2hlcm9rZWUnLAoJCQkJCSdZaWlpJyA9PiAnTWljcm9zb2Z0IFlpIEJhaXRpJywKCQkJCQknVGlidCcgPT4gJ01pY3Jvc29mdCBIaW1hbGF5YScsCgkJCQkJJ1RoYWEnID0+ICdNViBCb2xpJywKCQkJCQknRGV2YScgPT4gJ01hbmdhbCcsCgkJCQkJJ1RlbHUnID0+ICdHYXV0YW1pJywKCQkJCQknVGFtbCcgPT4gJ0xhdGhhJywKCQkJCQknU3lyYycgPT4gJ0VzdHJhbmdlbG8gRWRlc3NhJywKCQkJCQknT3J5YScgPT4gJ0thbGluZ2EnLAoJCQkJCSdNbHltJyA9PiAnS2FydGlrYScsCgkJCQkJJ0xhb28nID0+ICdEb2tDaGFtcGEnLAoJCQkJCSdTaW5oJyA9PiAnSXNrb29sYSBQb3RhJywKCQkJCQknTW9uZycgPT4gJ01vbmdvbGlhbiBCYWl0aScsCgkJCQkJJ1ZpZXQnID0+ICdUaW1lcyBOZXcgUm9tYW4nLAoJCQkJCSdVaWdoJyA9PiAnTWljcm9zb2Z0IFVpZ2h1cicsCgkJCQkJJ0dlb3InID0+ICdTeWxmYWVuJywKCQkJKTsKCgkvKioKCSAqIE1hcCBvZiBNaW5vciBmb250cyB0byB3cml0ZQoJICogQHN0YXRpYwlhcnJheSBvZiBzdHJpbmcKCSAqCgkgKi8KCXByaXZhdGUgc3RhdGljICRfbWlub3JGb250cyA9IGFycmF5KAoJCQkJCSdKcGFuJyA9PiAn77yt77yzIO+8sOOCtOOCt+ODg+OCrycsCgkJCQkJJ0hhbmcnID0+ICfrp5HsnYAg6rOg65SVJywKCQkJCQknSGFucycgPT4gJ+Wui+S9kycsCgkJCQkJJ0hhbnQnID0+ICfmlrDntLDmmI7pq5QnLAoJCQkJCSdBcmFiJyA9PiAnQXJpYWwnLAoJCQkJCSdIZWJyJyA9PiAnQXJpYWwnLAoJCQkJCSdUaGFpJyA9PiAnVGFob21hJywKCQkJCQknRXRoaScgPT4gJ055YWxhJywKCQkJCQknQmVuZycgPT4gJ1ZyaW5kYScsCgkJCQkJJ0d1anInID0+ICdTaHJ1dGknLAoJCQkJCSdLaG1yJyA9PiAnRGF1blBlbmgnLAoJCQkJCSdLbmRhJyA9PiAnVHVuZ2EnLAoJCQkJCSdHdXJ1JyA9PiAnUmFhdmknLAoJCQkJCSdDYW5zJyA9PiAnRXVwaGVtaWEnLAoJCQkJCSdDaGVyJyA9PiAnUGxhbnRhZ2VuZXQgQ2hlcm9rZWUnLAoJCQkJCSdZaWlpJyA9PiAnTWljcm9zb2Z0IFlpIEJhaXRpJywKCQkJCQknVGlidCcgPT4gJ01pY3Jvc29mdCBIaW1hbGF5YScsCgkJCQkJJ1RoYWEnID0+ICdNViBCb2xpJywKCQkJCQknRGV2YScgPT4gJ01hbmdhbCcsCgkJCQkJJ1RlbHUnID0+ICdHYXV0YW1pJywKCQkJCQknVGFtbCcgPT4gJ0xhdGhhJywKCQkJCQknU3lyYycgPT4gJ0VzdHJhbmdlbG8gRWRlc3NhJywKCQkJCQknT3J5YScgPT4gJ0thbGluZ2EnLAoJCQkJCSdNbHltJyA9PiAnS2FydGlrYScsCgkJCQkJJ0xhb28nID0+ICdEb2tDaGFtcGEnLAoJCQkJCSdTaW5oJyA9PiAnSXNrb29sYSBQb3RhJywKCQkJCQknTW9uZycgPT4gJ01vbmdvbGlhbiBCYWl0aScsCgkJCQkJJ1ZpZXQnID0+ICdBcmlhbCcsCgkJCQkJJ1VpZ2gnID0+ICdNaWNyb3NvZnQgVWlnaHVyJywKCQkJCQknR2VvcicgPT4gJ1N5bGZhZW4nLAoJCQkpOwoKCS8qKgoJICogTWFwIG9mIGNvcmUgY29sb3VycwoJICogQHN0YXRpYwlhcnJheSBvZiBzdHJpbmcKCSAqCgkgKi8KCQlwcml2YXRlIHN0YXRpYyAkX2NvbG91clNjaGVtZSA9IGFycmF5KAoJCQkJCSdkazInCQk9PiAnMUY0OTdEJywKCQkJCQknbHQyJwkJPT4gJ0VFRUNFMScsCgkJCQkJJ2FjY2VudDEnCT0+ICc0RjgxQkQnLAoJCQkJCSdhY2NlbnQyJwk9PiAnQzA1MDREJywKCQkJCQknYWNjZW50MycJPT4gJzlCQkI1OScsCgkJCQkJJ2FjY2VudDQnCT0+ICc4MDY0QTInLAoJCQkJCSdhY2NlbnQ1Jwk9PiAnNEJBQ0M2JywKCQkJCQknYWNjZW50NicJPT4gJ0Y3OTY0NicsCgkJCQkJJ2hsaW5rJwkJPT4gJzAwMDBGRicsCgkJCQkJJ2ZvbEhsaW5rJwk9PiAnODAwMDgwJywKCQkJKTsKCQkJCgkvKioKCSAqIFdyaXRlIHRoZW1lIHRvIFhNTCBmb3JtYXQKCSAqCgkgKiBAcGFyYW0gCVBIUEV4Y2VsCSRwUEhQRXhjZWwKCSAqIEByZXR1cm4gCXN0cmluZyAJCVhNTCBPdXRwdXQKCSAqIEB0aHJvd3MgCUV4Y2VwdGlvbgoJICovCglwdWJsaWMgZnVuY3Rpb24gd3JpdGVUaGVtZShQSFBFeGNlbCAkcFBIUEV4Y2VsID0gbnVsbCkKCXsKCQkJLy8gQ3JlYXRlIFhNTCB3cml0ZXIKCQkJJG9ialdyaXRlciA9IG51bGw7CgkJCWlmICgkdGhpcy0+Z2V0UGFyZW50V3JpdGVyKCktPmdldFVzZURpc2tDYWNoaW5nKCkpIHsKCQkJCSRvYmpXcml0ZXIgPSBuZXcgUEhQRXhjZWxfU2hhcmVkX1hNTFdyaXRlcihQSFBFeGNlbF9TaGFyZWRfWE1MV3JpdGVyOjpTVE9SQUdFX0RJU0ssICR0aGlzLT5nZXRQYXJlbnRXcml0ZXIoKS0+Z2V0RGlza0NhY2hpbmdEaXJlY3RvcnkoKSk7CgkJCX0gZWxzZSB7CgkJCQkkb2JqV3JpdGVyID0gbmV3IFBIUEV4Y2VsX1NoYXJlZF9YTUxXcml0ZXIoUEhQRXhjZWxfU2hhcmVkX1hNTFdyaXRlcjo6U1RPUkFHRV9NRU1PUlkpOwoJCQl9CgoJCQkvLyBYTUwgaGVhZGVyCgkJCSRvYmpXcml0ZXItPnN0YXJ0RG9jdW1lbnQoJzEuMCcsJ1VURi04JywneWVzJyk7CgoJCQkvLyBhOnRoZW1lCgkJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgnYTp0aGVtZScpOwoJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgneG1sbnM6YScsICdodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvZHJhd2luZ21sLzIwMDYvbWFpbicpOwoJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgnbmFtZScsICdPZmZpY2UgVGhlbWUnKTsKCgkJCQkvLyBhOnRoZW1lRWxlbWVudHMKCQkJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgnYTp0aGVtZUVsZW1lbnRzJyk7CgoJCQkJCS8vIGE6Y2xyU2NoZW1lCgkJCQkJJG9ialdyaXRlci0+c3RhcnRFbGVtZW50KCdhOmNsclNjaGVtZScpOwoJCQkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCduYW1lJywgJ09mZmljZScpOwoKCQkJCQkJLy8gYTpkazEKCQkJCQkJJG9ialdyaXRlci0+c3RhcnRFbGVtZW50KCdhOmRrMScpOwoKCQkJCQkJCS8vIGE6c3lzQ2xyCgkJCQkJCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ2E6c3lzQ2xyJyk7CgkJCQkJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgndmFsJywgJ3dpbmRvd1RleHQnKTsKCQkJCQkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCdsYXN0Q2xyJywgJzAwMDAwMCcpOwoJCQkJCQkJJG9ialdyaXRlci0+ZW5kRWxlbWVudCgpOwoKCQkJCQkJJG9ialdyaXRlci0+ZW5kRWxlbWVudCgpOwoKCQkJCQkJLy8gYTpsdDEKCQkJCQkJJG9ialdyaXRlci0+c3RhcnRFbGVtZW50KCdhOmx0MScpOwoKCQkJCQkJCS8vIGE6c3lzQ2xyCgkJCQkJCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ2E6c3lzQ2xyJyk7CgkJCQkJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgndmFsJywgJ3dpbmRvdycpOwoJCQkJCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ2xhc3RDbHInLCAnRkZGRkZGJyk7CgkJCQkJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgoJCQkJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgoJCQkJCQkvLyBhOmRrMgoJCQkJCQkkdGhpcy0+X3dyaXRlQ29sb3VyU2NoZW1lKCRvYmpXcml0ZXIpOwoKCQkJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgoJCQkJCS8vIGE6Zm9udFNjaGVtZQoJCQkJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgnYTpmb250U2NoZW1lJyk7CgkJCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ25hbWUnLCAnT2ZmaWNlJyk7CgoJCQkJCQkvLyBhOm1ham9yRm9udAoJCQkJCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ2E6bWFqb3JGb250Jyk7CgkJCQkJCQkkdGhpcy0+X3dyaXRlRm9udHMoJG9ialdyaXRlciwgJ0NhbWJyaWEnLCBzZWxmOjokX21ham9yRm9udHMpOwoJCQkJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgoJCQkJCQkvLyBhOm1pbm9yRm9udAoJCQkJCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ2E6bWlub3JGb250Jyk7CgkJCQkJCQkkdGhpcy0+X3dyaXRlRm9udHMoJG9ialdyaXRlciwgJ0NhbGlicmknLCBzZWxmOjokX21pbm9yRm9udHMpOwoJCQkJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgoJCQkJCSRvYmpXcml0ZXItPmVuZEVsZW1lbnQoKTsKCgkJCQkJLy8gYTpmbXRTY2hlbWUKCQkJCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ2E6Zm10U2NoZW1lJyk7CgkJCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ25hbWUnLCAnT2ZmaWNlJyk7CgoJCQkJCQkvLyBhOmZpbGxTdHlsZUxzdAoJCQkJCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ2E6ZmlsbFN0eWxlTHN0Jyk7CgoJCQkJCQkJLy8gYTpzb2xpZEZpbGwKCQkJCQkJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgnYTpzb2xpZEZpbGwnKTsKCgkJCQkJCQkJLy8gYTpzY2hlbWVDbHIKCQkJCQkJCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ2E6c2NoZW1lQ2xyJyk7CgkJCQkJCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ3ZhbCcsICdwaENscicpOwoJCQkJCQkJCSRvYmpXcml0ZXItPmVuZEVsZW1lbnQoKTsKCgkJCQkJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgoJCQkJCQkJLy8gYTpncmFkRmlsbAoJCQkJCQkJJG9ialdyaXRlci0+c3RhcnRFbGVtZW50KCdhOmdyYWRGaWxsJyk7CgkJCQkJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgncm90V2l0aFNoYXBlJywgJzEnKTsKCgkJCQkJCQkJLy8gYTpnc0xzdAoJCQkJCQkJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgnYTpnc0xzdCcpOwoKCQkJCQkJCQkJLy8gYTpncwoJCQkJCQkJCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ2E6Z3MnKTsKCQkJCQkJCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ3BvcycsICcwJyk7CgoJCQkJCQkJCQkJLy8gYTpzY2hlbWVDbHIKCQkJCQkJCQkJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgnYTpzY2hlbWVDbHInKTsKCQkJCQkJCQkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCd2YWwnLCAncGhDbHInKTsKCgkJCQkJCQkJCQkJLy8gYTp0aW50CgkJCQkJCQkJCQkJJG9ialdyaXRlci0+c3RhcnRFbGVtZW50KCdhOnRpbnQnKTsKCQkJCQkJCQkJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgndmFsJywgJzUwMDAwJyk7CgkJCQkJCQkJCQkJJG9ialdyaXRlci0+ZW5kRWxlbWVudCgpOwoKCQkJCQkJCQkJCQkvLyBhOnNhdE1vZAoJCQkJCQkJCQkJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgnYTpzYXRNb2QnKTsKCQkJCQkJCQkJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgndmFsJywgJzMwMDAwMCcpOwoJCQkJCQkJCQkJCSRvYmpXcml0ZXItPmVuZEVsZW1lbnQoKTsKCgkJCQkJCQkJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgoJCQkJCQkJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgoJCQkJCQkJCQkvLyBhOmdzCgkJCQkJCQkJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgnYTpncycpOwoJCQkJCQkJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgncG9zJywgJzM1MDAwJyk7CgoJCQkJCQkJCQkJLy8gYTpzY2hlbWVDbHIKCQkJCQkJCQkJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgnYTpzY2hlbWVDbHInKTsKCQkJCQkJCQkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCd2YWwnLCAncGhDbHInKTsKCgkJCQkJCQkJCQkJLy8gYTp0aW50CgkJCQkJCQkJCQkJJG9ialdyaXRlci0+c3RhcnRFbGVtZW50KCdhOnRpbnQnKTsKCQkJCQkJCQkJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgndmFsJywgJzM3MDAwJyk7CgkJCQkJCQkJCQkJJG9ialdyaXRlci0+ZW5kRWxlbWVudCgpOwoKCQkJCQkJCQkJCQkvLyBhOnNhdE1vZAoJCQkJCQkJCQkJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgnYTpzYXRNb2QnKTsKCQkJCQkJCQkJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgndmFsJywgJzMwMDAwMCcpOwoJCQkJCQkJCQkJCSRvYmpXcml0ZXItPmVuZEVsZW1lbnQoKTsKCgkJCQkJCQkJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgoJCQkJCQkJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgoJCQkJCQkJCQkvLyBhOmdzCgkJCQkJCQkJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgnYTpncycpOwoJCQkJCQkJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgncG9zJywgJzEwMDAwMCcpOwoKCQkJCQkJCQkJCS8vIGE6c2NoZW1lQ2xyCgkJCQkJCQkJCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ2E6c2NoZW1lQ2xyJyk7CgkJCQkJCQkJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgndmFsJywgJ3BoQ2xyJyk7CgoJCQkJCQkJCQkJCS8vIGE6dGludAoJCQkJCQkJCQkJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgnYTp0aW50Jyk7CgkJCQkJCQkJCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ3ZhbCcsICcxNTAwMCcpOwoJCQkJCQkJCQkJCSRvYmpXcml0ZXItPmVuZEVsZW1lbnQoKTsKCgkJCQkJCQkJCQkJLy8gYTpzYXRNb2QKCQkJCQkJCQkJCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ2E6c2F0TW9kJyk7CgkJCQkJCQkJCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ3ZhbCcsICczNTAwMDAnKTsKCQkJCQkJCQkJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgoJCQkJCQkJCQkJJG9ialdyaXRlci0+ZW5kRWxlbWVudCgpOwoKCQkJCQkJCQkJJG9ialdyaXRlci0+ZW5kRWxlbWVudCgpOwoKCQkJCQkJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgoJCQkJCQkJCS8vIGE6bGluCgkJCQkJCQkJJG9ialdyaXRlci0+c3RhcnRFbGVtZW50KCdhOmxpbicpOwoJCQkJCQkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCdhbmcnLCAnMTYyMDAwMDAnKTsKCQkJCQkJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgnc2NhbGVkJywgJzEnKTsKCQkJCQkJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgoJCQkJCQkJJG9ialdyaXRlci0+ZW5kRWxlbWVudCgpOwoKCQkJCQkJCS8vIGE6Z3JhZEZpbGwKCQkJCQkJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgnYTpncmFkRmlsbCcpOwoJCQkJCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ3JvdFdpdGhTaGFwZScsICcxJyk7CgoJCQkJCQkJCS8vIGE6Z3NMc3QKCQkJCQkJCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ2E6Z3NMc3QnKTsKCgkJCQkJCQkJCS8vIGE6Z3MKCQkJCQkJCQkJJG9ialdyaXRlci0+c3RhcnRFbGVtZW50KCdhOmdzJyk7CgkJCQkJCQkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCdwb3MnLCAnMCcpOwoKCQkJCQkJCQkJCS8vIGE6c2NoZW1lQ2xyCgkJCQkJCQkJCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ2E6c2NoZW1lQ2xyJyk7CgkJCQkJCQkJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgndmFsJywgJ3BoQ2xyJyk7CgoJCQkJCQkJCQkJCS8vIGE6c2hhZGUKCQkJCQkJCQkJCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ2E6c2hhZGUnKTsKCQkJCQkJCQkJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgndmFsJywgJzUxMDAwJyk7CgkJCQkJCQkJCQkJJG9ialdyaXRlci0+ZW5kRWxlbWVudCgpOwoKCQkJCQkJCQkJCQkvLyBhOnNhdE1vZAoJCQkJCQkJCQkJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgnYTpzYXRNb2QnKTsKCQkJCQkJCQkJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgndmFsJywgJzEzMDAwMCcpOwoJCQkJCQkJCQkJCSRvYmpXcml0ZXItPmVuZEVsZW1lbnQoKTsKCgkJCQkJCQkJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgoJCQkJCQkJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgoJCQkJCQkJCQkvLyBhOmdzCgkJCQkJCQkJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgnYTpncycpOwoJCQkJCQkJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgncG9zJywgJzgwMDAwJyk7CgoJCQkJCQkJCQkJLy8gYTpzY2hlbWVDbHIKCQkJCQkJCQkJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgnYTpzY2hlbWVDbHInKTsKCQkJCQkJCQkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCd2YWwnLCAncGhDbHInKTsKCgkJCQkJCQkJCQkJLy8gYTpzaGFkZQoJCQkJCQkJCQkJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgnYTpzaGFkZScpOwoJCQkJCQkJCQkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCd2YWwnLCAnOTMwMDAnKTsKCQkJCQkJCQkJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgoJCQkJCQkJCQkJCS8vIGE6c2F0TW9kCgkJCQkJCQkJCQkJJG9ialdyaXRlci0+c3RhcnRFbGVtZW50KCdhOnNhdE1vZCcpOwoJCQkJCQkJCQkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCd2YWwnLCAnMTMwMDAwJyk7CgkJCQkJCQkJCQkJJG9ialdyaXRlci0+ZW5kRWxlbWVudCgpOwoKCQkJCQkJCQkJCSRvYmpXcml0ZXItPmVuZEVsZW1lbnQoKTsKCgkJCQkJCQkJCSRvYmpXcml0ZXItPmVuZEVsZW1lbnQoKTsKCgkJCQkJCQkJCS8vIGE6Z3MKCQkJCQkJCQkJJG9ialdyaXRlci0+c3RhcnRFbGVtZW50KCdhOmdzJyk7CgkJCQkJCQkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCdwb3MnLCAnMTAwMDAwJyk7CgoJCQkJCQkJCQkJLy8gYTpzY2hlbWVDbHIKCQkJCQkJCQkJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgnYTpzY2hlbWVDbHInKTsKCQkJCQkJCQkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCd2YWwnLCAncGhDbHInKTsKCgkJCQkJCQkJCQkJLy8gYTpzaGFkZQoJCQkJCQkJCQkJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgnYTpzaGFkZScpOwoJCQkJCQkJCQkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCd2YWwnLCAnOTQwMDAnKTsKCQkJCQkJCQkJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgoJCQkJCQkJCQkJCS8vIGE6c2F0TW9kCgkJCQkJCQkJCQkJJG9ialdyaXRlci0+c3RhcnRFbGVtZW50KCdhOnNhdE1vZCcpOwoJCQkJCQkJCQkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCd2YWwnLCAnMTM1MDAwJyk7CgkJCQkJCQkJCQkJJG9ialdyaXRlci0+ZW5kRWxlbWVudCgpOwoKCQkJCQkJCQkJCSRvYmpXcml0ZXItPmVuZEVsZW1lbnQoKTsKCgkJCQkJCQkJCSRvYmpXcml0ZXItPmVuZEVsZW1lbnQoKTsKCgkJCQkJCQkJJG9ialdyaXRlci0+ZW5kRWxlbWVudCgpOwoKCQkJCQkJCQkvLyBhOmxpbgoJCQkJCQkJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgnYTpsaW4nKTsKCQkJCQkJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgnYW5nJywgJzE2MjAwMDAwJyk7CgkJCQkJCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ3NjYWxlZCcsICcwJyk7CgkJCQkJCQkJJG9ialdyaXRlci0+ZW5kRWxlbWVudCgpOwoKCQkJCQkJCSRvYmpXcml0ZXItPmVuZEVsZW1lbnQoKTsKCgkJCQkJCSRvYmpXcml0ZXItPmVuZEVsZW1lbnQoKTsKCgkJCQkJCS8vIGE6bG5TdHlsZUxzdAoJCQkJCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ2E6bG5TdHlsZUxzdCcpOwoKCQkJCQkJCS8vIGE6bG4KCQkJCQkJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgnYTpsbicpOwoJCQkJCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ3cnLCAnOTUyNScpOwoJCQkJCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ2NhcCcsICdmbGF0Jyk7CgkJCQkJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgnY21wZCcsICdzbmcnKTsKCQkJCQkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCdhbGduJywgJ2N0cicpOwoKCQkJCQkJCQkvLyBhOnNvbGlkRmlsbAoJCQkJCQkJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgnYTpzb2xpZEZpbGwnKTsKCgkJCQkJCQkJCS8vIGE6c2NoZW1lQ2xyCgkJCQkJCQkJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgnYTpzY2hlbWVDbHInKTsKCQkJCQkJCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ3ZhbCcsICdwaENscicpOwoKCQkJCQkJCQkJCQkvLyBhOnNoYWRlCgkJCQkJCQkJCQkJJG9ialdyaXRlci0+c3RhcnRFbGVtZW50KCdhOnNoYWRlJyk7CgkJCQkJCQkJCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ3ZhbCcsICc5NTAwMCcpOwoJCQkJCQkJCQkJCSRvYmpXcml0ZXItPmVuZEVsZW1lbnQoKTsKCgkJCQkJCQkJCQkJLy8gYTpzYXRNb2QKCQkJCQkJCQkJCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ2E6c2F0TW9kJyk7CgkJCQkJCQkJCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ3ZhbCcsICcxMDUwMDAnKTsKCQkJCQkJCQkJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgoJCQkJCQkJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgoJCQkJCQkJCSRvYmpXcml0ZXItPmVuZEVsZW1lbnQoKTsKCgkJCQkJCQkJLy8gYTpwcnN0RGFzaAoJCQkJCQkJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgnYTpwcnN0RGFzaCcpOwoJCQkJCQkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCd2YWwnLCAnc29saWQnKTsKCQkJCQkJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgoJCQkJCQkJJG9ialdyaXRlci0+ZW5kRWxlbWVudCgpOwoKCQkJCQkJCS8vIGE6bG4KCQkJCQkJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgnYTpsbicpOwoJCQkJCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ3cnLCAnMjU0MDAnKTsKCQkJCQkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCdjYXAnLCAnZmxhdCcpOwoJCQkJCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ2NtcGQnLCAnc25nJyk7CgkJCQkJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgnYWxnbicsICdjdHInKTsKCgkJCQkJCQkJLy8gYTpzb2xpZEZpbGwKCQkJCQkJCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ2E6c29saWRGaWxsJyk7CgoJCQkJCQkJCQkvLyBhOnNjaGVtZUNscgoJCQkJCQkJCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ2E6c2NoZW1lQ2xyJyk7CgkJCQkJCQkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCd2YWwnLCAncGhDbHInKTsKCQkJCQkJCQkJJG9ialdyaXRlci0+ZW5kRWxlbWVudCgpOwoKCQkJCQkJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgoJCQkJCQkJCS8vIGE6cHJzdERhc2gKCQkJCQkJCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ2E6cHJzdERhc2gnKTsKCQkJCQkJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgndmFsJywgJ3NvbGlkJyk7CgkJCQkJCQkJJG9ialdyaXRlci0+ZW5kRWxlbWVudCgpOwoKCQkJCQkJCSRvYmpXcml0ZXItPmVuZEVsZW1lbnQoKTsKCgkJCQkJCQkvLyBhOmxuCgkJCQkJCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ2E6bG4nKTsKCQkJCQkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCd3JywgJzM4MTAwJyk7CgkJCQkJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgnY2FwJywgJ2ZsYXQnKTsKCQkJCQkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCdjbXBkJywgJ3NuZycpOwoJCQkJCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ2FsZ24nLCAnY3RyJyk7CgoJCQkJCQkJCS8vIGE6c29saWRGaWxsCgkJCQkJCQkJJG9ialdyaXRlci0+c3RhcnRFbGVtZW50KCdhOnNvbGlkRmlsbCcpOwoKCQkJCQkJCQkJLy8gYTpzY2hlbWVDbHIKCQkJCQkJCQkJJG9ialdyaXRlci0+c3RhcnRFbGVtZW50KCdhOnNjaGVtZUNscicpOwoJCQkJCQkJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgndmFsJywgJ3BoQ2xyJyk7CgkJCQkJCQkJCSRvYmpXcml0ZXItPmVuZEVsZW1lbnQoKTsKCgkJCQkJCQkJJG9ialdyaXRlci0+ZW5kRWxlbWVudCgpOwoKCQkJCQkJCQkvLyBhOnByc3REYXNoCgkJCQkJCQkJJG9ialdyaXRlci0+c3RhcnRFbGVtZW50KCdhOnByc3REYXNoJyk7CgkJCQkJCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ3ZhbCcsICdzb2xpZCcpOwoJCQkJCQkJCSRvYmpXcml0ZXItPmVuZEVsZW1lbnQoKTsKCgkJCQkJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgoJCQkJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgoKCgkJCQkJCS8vIGE6ZWZmZWN0U3R5bGVMc3QKCQkJCQkJJG9ialdyaXRlci0+c3RhcnRFbGVtZW50KCdhOmVmZmVjdFN0eWxlTHN0Jyk7CgoJCQkJCQkJLy8gYTplZmZlY3RTdHlsZQoJCQkJCQkJJG9ialdyaXRlci0+c3RhcnRFbGVtZW50KCdhOmVmZmVjdFN0eWxlJyk7CgoJCQkJCQkJCS8vIGE6ZWZmZWN0THN0CgkJCQkJCQkJJG9ialdyaXRlci0+c3RhcnRFbGVtZW50KCdhOmVmZmVjdExzdCcpOwoKCQkJCQkJCQkJLy8gYTpvdXRlclNoZHcKCQkJCQkJCQkJJG9ialdyaXRlci0+c3RhcnRFbGVtZW50KCdhOm91dGVyU2hkdycpOwoJCQkJCQkJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgnYmx1clJhZCcsICc0MDAwMCcpOwoJCQkJCQkJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgnZGlzdCcsICcyMDAwMCcpOwoJCQkJCQkJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgnZGlyJywgJzU0MDAwMDAnKTsKCQkJCQkJCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ3JvdFdpdGhTaGFwZScsICcwJyk7CgoJCQkJCQkJCQkJLy8gYTpzcmdiQ2xyCgkJCQkJCQkJCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ2E6c3JnYkNscicpOwoJCQkJCQkJCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ3ZhbCcsICcwMDAwMDAnKTsKCgkJCQkJCQkJCQkJLy8gYTphbHBoYQoJCQkJCQkJCQkJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgnYTphbHBoYScpOwoJCQkJCQkJCQkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCd2YWwnLCAnMzgwMDAnKTsKCQkJCQkJCQkJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgoJCQkJCQkJCQkJJG9ialdyaXRlci0+ZW5kRWxlbWVudCgpOwoKCQkJCQkJCQkJJG9ialdyaXRlci0+ZW5kRWxlbWVudCgpOwoKCQkJCQkJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgoJCQkJCQkJJG9ialdyaXRlci0+ZW5kRWxlbWVudCgpOwoKCQkJCQkJCS8vIGE6ZWZmZWN0U3R5bGUKCQkJCQkJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgnYTplZmZlY3RTdHlsZScpOwoKCQkJCQkJCQkvLyBhOmVmZmVjdExzdAoJCQkJCQkJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgnYTplZmZlY3RMc3QnKTsKCgkJCQkJCQkJCS8vIGE6b3V0ZXJTaGR3CgkJCQkJCQkJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgnYTpvdXRlclNoZHcnKTsKCQkJCQkJCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ2JsdXJSYWQnLCAnNDAwMDAnKTsKCQkJCQkJCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ2Rpc3QnLCAnMjMwMDAnKTsKCQkJCQkJCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ2RpcicsICc1NDAwMDAwJyk7CgkJCQkJCQkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCdyb3RXaXRoU2hhcGUnLCAnMCcpOwoKCQkJCQkJCQkJCS8vIGE6c3JnYkNscgoJCQkJCQkJCQkJJG9ialdyaXRlci0+c3RhcnRFbGVtZW50KCdhOnNyZ2JDbHInKTsKCQkJCQkJCQkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCd2YWwnLCAnMDAwMDAwJyk7CgoJCQkJCQkJCQkJCS8vIGE6YWxwaGEKCQkJCQkJCQkJCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ2E6YWxwaGEnKTsKCQkJCQkJCQkJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgndmFsJywgJzM1MDAwJyk7CgkJCQkJCQkJCQkJJG9ialdyaXRlci0+ZW5kRWxlbWVudCgpOwoKCQkJCQkJCQkJCSRvYmpXcml0ZXItPmVuZEVsZW1lbnQoKTsKCgkJCQkJCQkJCSRvYmpXcml0ZXItPmVuZEVsZW1lbnQoKTsKCgkJCQkJCQkJJG9ialdyaXRlci0+ZW5kRWxlbWVudCgpOwoKCQkJCQkJCSRvYmpXcml0ZXItPmVuZEVsZW1lbnQoKTsKCgkJCQkJCQkvLyBhOmVmZmVjdFN0eWxlCgkJCQkJCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ2E6ZWZmZWN0U3R5bGUnKTsKCgkJCQkJCQkJLy8gYTplZmZlY3RMc3QKCQkJCQkJCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ2E6ZWZmZWN0THN0Jyk7CgoJCQkJCQkJCQkvLyBhOm91dGVyU2hkdwoJCQkJCQkJCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ2E6b3V0ZXJTaGR3Jyk7CgkJCQkJCQkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCdibHVyUmFkJywgJzQwMDAwJyk7CgkJCQkJCQkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCdkaXN0JywgJzIzMDAwJyk7CgkJCQkJCQkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCdkaXInLCAnNTQwMDAwMCcpOwoJCQkJCQkJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgncm90V2l0aFNoYXBlJywgJzAnKTsKCgkJCQkJCQkJCQkvLyBhOnNyZ2JDbHIKCQkJCQkJCQkJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgnYTpzcmdiQ2xyJyk7CgkJCQkJCQkJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgndmFsJywgJzAwMDAwMCcpOwoKCQkJCQkJCQkJCQkvLyBhOmFscGhhCgkJCQkJCQkJCQkJJG9ialdyaXRlci0+c3RhcnRFbGVtZW50KCdhOmFscGhhJyk7CgkJCQkJCQkJCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ3ZhbCcsICczNTAwMCcpOwoJCQkJCQkJCQkJCSRvYmpXcml0ZXItPmVuZEVsZW1lbnQoKTsKCgkJCQkJCQkJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgoJCQkJCQkJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgoJCQkJCQkJCSRvYmpXcml0ZXItPmVuZEVsZW1lbnQoKTsKCgkJCQkJCQkJLy8gYTpzY2VuZTNkCgkJCQkJCQkJJG9ialdyaXRlci0+c3RhcnRFbGVtZW50KCdhOnNjZW5lM2QnKTsKCgkJCQkJCQkJCS8vIGE6Y2FtZXJhCgkJCQkJCQkJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgnYTpjYW1lcmEnKTsKCQkJCQkJCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ3Byc3QnLCAnb3J0aG9ncmFwaGljRnJvbnQnKTsKCgkJCQkJCQkJCQkvLyBhOnJvdAoJCQkJCQkJCQkJJG9ialdyaXRlci0+c3RhcnRFbGVtZW50KCdhOnJvdCcpOwoJCQkJCQkJCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ2xhdCcsICcwJyk7CgkJCQkJCQkJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgnbG9uJywgJzAnKTsKCQkJCQkJCQkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCdyZXYnLCAnMCcpOwoJCQkJCQkJCQkJJG9ialdyaXRlci0+ZW5kRWxlbWVudCgpOwoKCQkJCQkJCQkJJG9ialdyaXRlci0+ZW5kRWxlbWVudCgpOwoKCQkJCQkJCQkJLy8gYTpsaWdodFJpZwoJCQkJCQkJCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ2E6bGlnaHRSaWcnKTsKCQkJCQkJCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ3JpZycsICd0aHJlZVB0Jyk7CgkJCQkJCQkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCdkaXInLCAndCcpOwoKCQkJCQkJCQkJCS8vIGE6cm90CgkJCQkJCQkJCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ2E6cm90Jyk7CgkJCQkJCQkJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgnbGF0JywgJzAnKTsKCQkJCQkJCQkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCdsb24nLCAnMCcpOwoJCQkJCQkJCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ3JldicsICcxMjAwMDAwJyk7CgkJCQkJCQkJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgoJCQkJCQkJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgoJCQkJCQkJCSRvYmpXcml0ZXItPmVuZEVsZW1lbnQoKTsKCgkJCQkJCQkJLy8gYTpzcDNkCgkJCQkJCQkJJG9ialdyaXRlci0+c3RhcnRFbGVtZW50KCdhOnNwM2QnKTsKCgkJCQkJCQkJCS8vIGE6YmV2ZWxUCgkJCQkJCQkJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgnYTpiZXZlbFQnKTsKCQkJCQkJCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ3cnLCAnNjM1MDAnKTsKCQkJCQkJCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ2gnLCAnMjU0MDAnKTsKCQkJCQkJCQkJJG9ialdyaXRlci0+ZW5kRWxlbWVudCgpOwoKCQkJCQkJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgoJCQkJCQkJJG9ialdyaXRlci0+ZW5kRWxlbWVudCgpOwoKCQkJCQkJJG9ialdyaXRlci0+ZW5kRWxlbWVudCgpOwoKCQkJCQkJLy8gYTpiZ0ZpbGxTdHlsZUxzdAoJCQkJCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ2E6YmdGaWxsU3R5bGVMc3QnKTsKCgkJCQkJCQkvLyBhOnNvbGlkRmlsbAoJCQkJCQkJJG9ialdyaXRlci0+c3RhcnRFbGVtZW50KCdhOnNvbGlkRmlsbCcpOwoKCQkJCQkJCQkvLyBhOnNjaGVtZUNscgoJCQkJCQkJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgnYTpzY2hlbWVDbHInKTsKCQkJCQkJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgndmFsJywgJ3BoQ2xyJyk7CgkJCQkJCQkJJG9ialdyaXRlci0+ZW5kRWxlbWVudCgpOwoKCQkJCQkJCSRvYmpXcml0ZXItPmVuZEVsZW1lbnQoKTsKCgkJCQkJCQkvLyBhOmdyYWRGaWxsCgkJCQkJCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ2E6Z3JhZEZpbGwnKTsKCQkJCQkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCdyb3RXaXRoU2hhcGUnLCAnMScpOwoKCQkJCQkJCQkvLyBhOmdzTHN0CgkJCQkJCQkJJG9ialdyaXRlci0+c3RhcnRFbGVtZW50KCdhOmdzTHN0Jyk7CgoJCQkJCQkJCQkvLyBhOmdzCgkJCQkJCQkJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgnYTpncycpOwoJCQkJCQkJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgncG9zJywgJzAnKTsKCgkJCQkJCQkJCQkvLyBhOnNjaGVtZUNscgoJCQkJCQkJCQkJJG9ialdyaXRlci0+c3RhcnRFbGVtZW50KCdhOnNjaGVtZUNscicpOwoJCQkJCQkJCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ3ZhbCcsICdwaENscicpOwoKCQkJCQkJCQkJCQkvLyBhOnRpbnQKCQkJCQkJCQkJCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ2E6dGludCcpOwoJCQkJCQkJCQkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCd2YWwnLCAnNDAwMDAnKTsKCQkJCQkJCQkJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgoJCQkJCQkJCQkJCS8vIGE6c2F0TW9kCgkJCQkJCQkJCQkJJG9ialdyaXRlci0+c3RhcnRFbGVtZW50KCdhOnNhdE1vZCcpOwoJCQkJCQkJCQkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCd2YWwnLCAnMzUwMDAwJyk7CgkJCQkJCQkJCQkJJG9ialdyaXRlci0+ZW5kRWxlbWVudCgpOwoKCQkJCQkJCQkJCSRvYmpXcml0ZXItPmVuZEVsZW1lbnQoKTsKCgkJCQkJCQkJCSRvYmpXcml0ZXItPmVuZEVsZW1lbnQoKTsKCgkJCQkJCQkJCS8vIGE6Z3MKCQkJCQkJCQkJJG9ialdyaXRlci0+c3RhcnRFbGVtZW50KCdhOmdzJyk7CgkJCQkJCQkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCdwb3MnLCAnNDAwMDAnKTsKCgkJCQkJCQkJCQkvLyBhOnNjaGVtZUNscgoJCQkJCQkJCQkJJG9ialdyaXRlci0+c3RhcnRFbGVtZW50KCdhOnNjaGVtZUNscicpOwoJCQkJCQkJCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ3ZhbCcsICdwaENscicpOwoKCQkJCQkJCQkJCQkvLyBhOnRpbnQKCQkJCQkJCQkJCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ2E6dGludCcpOwoJCQkJCQkJCQkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCd2YWwnLCAnNDUwMDAnKTsKCQkJCQkJCQkJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgoJCQkJCQkJCQkJCS8vIGE6c2hhZGUKCQkJCQkJCQkJCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ2E6c2hhZGUnKTsKCQkJCQkJCQkJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgndmFsJywgJzk5MDAwJyk7CgkJCQkJCQkJCQkJJG9ialdyaXRlci0+ZW5kRWxlbWVudCgpOwoKCQkJCQkJCQkJCQkvLyBhOnNhdE1vZAoJCQkJCQkJCQkJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgnYTpzYXRNb2QnKTsKCQkJCQkJCQkJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgndmFsJywgJzM1MDAwMCcpOwoJCQkJCQkJCQkJCSRvYmpXcml0ZXItPmVuZEVsZW1lbnQoKTsKCgkJCQkJCQkJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgoJCQkJCQkJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgoJCQkJCQkJCQkvLyBhOmdzCgkJCQkJCQkJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgnYTpncycpOwoJCQkJCQkJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgncG9zJywgJzEwMDAwMCcpOwoKCQkJCQkJCQkJCS8vIGE6c2NoZW1lQ2xyCgkJCQkJCQkJCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ2E6c2NoZW1lQ2xyJyk7CgkJCQkJCQkJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgndmFsJywgJ3BoQ2xyJyk7CgoJCQkJCQkJCQkJCS8vIGE6c2hhZGUKCQkJCQkJCQkJCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ2E6c2hhZGUnKTsKCQkJCQkJCQkJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgndmFsJywgJzIwMDAwJyk7CgkJCQkJCQkJCQkJJG9ialdyaXRlci0+ZW5kRWxlbWVudCgpOwoKCQkJCQkJCQkJCQkvLyBhOnNhdE1vZAoJCQkJCQkJCQkJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgnYTpzYXRNb2QnKTsKCQkJCQkJCQkJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgndmFsJywgJzI1NTAwMCcpOwoJCQkJCQkJCQkJCSRvYmpXcml0ZXItPmVuZEVsZW1lbnQoKTsKCgkJCQkJCQkJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgoJCQkJCQkJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgoJCQkJCQkJCSRvYmpXcml0ZXItPmVuZEVsZW1lbnQoKTsKCgkJCQkJCQkJLy8gYTpwYXRoCgkJCQkJCQkJJG9ialdyaXRlci0+c3RhcnRFbGVtZW50KCdhOnBhdGgnKTsKCQkJCQkJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgncGF0aCcsICdjaXJjbGUnKTsKCgkJCQkJCQkJCS8vIGE6ZmlsbFRvUmVjdAoJCQkJCQkJCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ2E6ZmlsbFRvUmVjdCcpOwoJCQkJCQkJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgnbCcsICc1MDAwMCcpOwoJCQkJCQkJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgndCcsICctODAwMDAnKTsKCQkJCQkJCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ3InLCAnNTAwMDAnKTsKCQkJCQkJCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ2InLCAnMTgwMDAwJyk7CgkJCQkJCQkJCSRvYmpXcml0ZXItPmVuZEVsZW1lbnQoKTsKCgkJCQkJCQkJJG9ialdyaXRlci0+ZW5kRWxlbWVudCgpOwoKCQkJCQkJCSRvYmpXcml0ZXItPmVuZEVsZW1lbnQoKTsKCgkJCQkJCQkvLyBhOmdyYWRGaWxsCgkJCQkJCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ2E6Z3JhZEZpbGwnKTsKCQkJCQkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCdyb3RXaXRoU2hhcGUnLCAnMScpOwoKCQkJCQkJCQkvLyBhOmdzTHN0CgkJCQkJCQkJJG9ialdyaXRlci0+c3RhcnRFbGVtZW50KCdhOmdzTHN0Jyk7CgoJCQkJCQkJCQkvLyBhOmdzCgkJCQkJCQkJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgnYTpncycpOwoJCQkJCQkJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgncG9zJywgJzAnKTsKCgkJCQkJCQkJCQkvLyBhOnNjaGVtZUNscgoJCQkJCQkJCQkJJG9ialdyaXRlci0+c3RhcnRFbGVtZW50KCdhOnNjaGVtZUNscicpOwoJCQkJCQkJCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ3ZhbCcsICdwaENscicpOwoKCQkJCQkJCQkJCQkvLyBhOnRpbnQKCQkJCQkJCQkJCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ2E6dGludCcpOwoJCQkJCQkJCQkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCd2YWwnLCAnODAwMDAnKTsKCQkJCQkJCQkJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgoJCQkJCQkJCQkJCS8vIGE6c2F0TW9kCgkJCQkJCQkJCQkJJG9ialdyaXRlci0+c3RhcnRFbGVtZW50KCdhOnNhdE1vZCcpOwoJCQkJCQkJCQkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCd2YWwnLCAnMzAwMDAwJyk7CgkJCQkJCQkJCQkJJG9ialdyaXRlci0+ZW5kRWxlbWVudCgpOwoKCQkJCQkJCQkJCSRvYmpXcml0ZXItPmVuZEVsZW1lbnQoKTsKCgkJCQkJCQkJCSRvYmpXcml0ZXItPmVuZEVsZW1lbnQoKTsKCgkJCQkJCQkJCS8vIGE6Z3MKCQkJCQkJCQkJJG9ialdyaXRlci0+c3RhcnRFbGVtZW50KCdhOmdzJyk7CgkJCQkJCQkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCdwb3MnLCAnMTAwMDAwJyk7CgoJCQkJCQkJCQkJLy8gYTpzY2hlbWVDbHIKCQkJCQkJCQkJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgnYTpzY2hlbWVDbHInKTsKCQkJCQkJCQkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCd2YWwnLCAncGhDbHInKTsKCgkJCQkJCQkJCQkJLy8gYTpzaGFkZQoJCQkJCQkJCQkJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgnYTpzaGFkZScpOwoJCQkJCQkJCQkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCd2YWwnLCAnMzAwMDAnKTsKCQkJCQkJCQkJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgoJCQkJCQkJCQkJCS8vIGE6c2F0TW9kCgkJCQkJCQkJCQkJJG9ialdyaXRlci0+c3RhcnRFbGVtZW50KCdhOnNhdE1vZCcpOwoJCQkJCQkJCQkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCd2YWwnLCAnMjAwMDAwJyk7CgkJCQkJCQkJCQkJJG9ialdyaXRlci0+ZW5kRWxlbWVudCgpOwoKCQkJCQkJCQkJCSRvYmpXcml0ZXItPmVuZEVsZW1lbnQoKTsKCgkJCQkJCQkJCSRvYmpXcml0ZXItPmVuZEVsZW1lbnQoKTsKCgkJCQkJCQkJJG9ialdyaXRlci0+ZW5kRWxlbWVudCgpOwoKCQkJCQkJCQkvLyBhOnBhdGgKCQkJCQkJCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ2E6cGF0aCcpOwoJCQkJCQkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCdwYXRoJywgJ2NpcmNsZScpOwoKCQkJCQkJCQkJLy8gYTpmaWxsVG9SZWN0CgkJCQkJCQkJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgnYTpmaWxsVG9SZWN0Jyk7CgkJCQkJCQkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCdsJywgJzUwMDAwJyk7CgkJCQkJCQkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCd0JywgJzUwMDAwJyk7CgkJCQkJCQkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCdyJywgJzUwMDAwJyk7CgkJCQkJCQkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCdiJywgJzUwMDAwJyk7CgkJCQkJCQkJCSRvYmpXcml0ZXItPmVuZEVsZW1lbnQoKTsKCgkJCQkJCQkJJG9ialdyaXRlci0+ZW5kRWxlbWVudCgpOwoKCQkJCQkJCSRvYmpXcml0ZXItPmVuZEVsZW1lbnQoKTsKCgkJCQkJCSRvYmpXcml0ZXItPmVuZEVsZW1lbnQoKTsKCgkJCQkJJG9ialdyaXRlci0+ZW5kRWxlbWVudCgpOwoKCQkJCSRvYmpXcml0ZXItPmVuZEVsZW1lbnQoKTsKCgkJCQkvLyBhOm9iamVjdERlZmF1bHRzCgkJCQkkb2JqV3JpdGVyLT53cml0ZUVsZW1lbnQoJ2E6b2JqZWN0RGVmYXVsdHMnLCBudWxsKTsKCgkJCQkvLyBhOmV4dHJhQ2xyU2NoZW1lTHN0CgkJCQkkb2JqV3JpdGVyLT53cml0ZUVsZW1lbnQoJ2E6ZXh0cmFDbHJTY2hlbWVMc3QnLCBudWxsKTsKCgkJCSRvYmpXcml0ZXItPmVuZEVsZW1lbnQoKTsKCgkJCS8vIFJldHVybgoJCQlyZXR1cm4gJG9ialdyaXRlci0+Z2V0RGF0YSgpOwoJfQoKCS8qKgoJICogV3JpdGUgZm9udHMgdG8gWE1MIGZvcm1hdAoJICoKCSAqIEBwYXJhbSAJUEhQRXhjZWxfU2hhcmVkX1hNTFdyaXRlcgkkb2JqV3JpdGVyCgkgKiBAcGFyYW0gCXN0cmluZwkJCQkJCSRsYXRpbkZvbnQKCSAqIEBwYXJhbSAJYXJyYXkgb2Ygc3RyaW5nCQkJCSRmb250U2V0CgkgKiBAcmV0dXJuIAlzdHJpbmcgCQkJCQkJWE1MIE91dHB1dAoJICogQHRocm93cyAJRXhjZXB0aW9uCgkgKi8KCXByaXZhdGUgZnVuY3Rpb24gX3dyaXRlRm9udHMoJG9ialdyaXRlciwgJGxhdGluRm9udCwgJGZvbnRTZXQpCgl7CgkJLy8gYTpsYXRpbgoJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgnYTpsYXRpbicpOwoJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCd0eXBlZmFjZScsICRsYXRpbkZvbnQpOwoJCSRvYmpXcml0ZXItPmVuZEVsZW1lbnQoKTsKCgkJLy8gYTplYQoJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgnYTplYScpOwoJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCd0eXBlZmFjZScsICcnKTsKCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgoJCS8vIGE6Y3MKCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ2E6Y3MnKTsKCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgndHlwZWZhY2UnLCAnJyk7CgkJJG9ialdyaXRlci0+ZW5kRWxlbWVudCgpOwoKCQlmb3JlYWNoKCRmb250U2V0IGFzICRmb250U2NyaXB0ID0+ICR0eXBlZmFjZSkgewoJCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ2E6Zm9udCcpOwoJCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ3NjcmlwdCcsICRmb250U2NyaXB0KTsKCQkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCd0eXBlZmFjZScsICR0eXBlZmFjZSk7CgkJCSRvYmpXcml0ZXItPmVuZEVsZW1lbnQoKTsKCQl9CgoJfQoKCS8qKgoJICogV3JpdGUgY29sb3VyIHNjaGVtZSB0byBYTUwgZm9ybWF0CgkgKgoJICogQHBhcmFtIAlQSFBFeGNlbF9TaGFyZWRfWE1MV3JpdGVyCSRvYmpXcml0ZXIKCSAqIEByZXR1cm4gCXN0cmluZyAJCQkJCQlYTUwgT3V0cHV0CgkgKiBAdGhyb3dzIAlFeGNlcHRpb24KCSAqLwoJcHJpdmF0ZSBmdW5jdGlvbiBfd3JpdGVDb2xvdXJTY2hlbWUoJG9ialdyaXRlcikKCXsKCQlmb3JlYWNoKHNlbGY6OiRfY29sb3VyU2NoZW1lIGFzICRjb2xvdXJOYW1lID0+ICRjb2xvdXJWYWx1ZSkgewoJCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ2E6Jy4kY29sb3VyTmFtZSk7CgoJCQkJJG9ialdyaXRlci0+c3RhcnRFbGVtZW50KCdhOnNyZ2JDbHInKTsKCQkJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgndmFsJywgJGNvbG91clZhbHVlKTsKCQkJCSRvYmpXcml0ZXItPmVuZEVsZW1lbnQoKTsKCgkJCSRvYmpXcml0ZXItPmVuZEVsZW1lbnQoKTsKCQl9CgkJCQkJCQoJfQp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Writer/Excel2007/Workbook.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIFBIUEV4Y2VsCiAqCiAqIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICoKICogQGNhdGVnb3J5ICAgUEhQRXhjZWwKICogQHBhY2thZ2UgICAgUEhQRXhjZWxfV3JpdGVyX0V4Y2VsMjAwNwogKiBAY29weXJpZ2h0ICBDb3B5cmlnaHQgKGMpIDIwMDYgLSAyMDEyIFBIUEV4Y2VsIChodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9QSFBFeGNlbCkKICogQGxpY2Vuc2UgICAgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL29sZC1saWNlbnNlcy9sZ3BsLTIuMS50eHQJTEdQTAogKiBAdmVyc2lvbiAgICAxLjcuNywgMjAxMi0wNS0xOQogKi8KCgovKioKICogUEhQRXhjZWxfV3JpdGVyX0V4Y2VsMjAwN19Xb3JrYm9vawogKgogKiBAY2F0ZWdvcnkgICBQSFBFeGNlbAogKiBAcGFja2FnZSAgICBQSFBFeGNlbF9Xcml0ZXJfRXhjZWwyMDA3CiAqIEBjb3B5cmlnaHQgIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwgKGh0dHA6Ly93d3cuY29kZXBsZXguY29tL1BIUEV4Y2VsKQogKi8KY2xhc3MgUEhQRXhjZWxfV3JpdGVyX0V4Y2VsMjAwN19Xb3JrYm9vayBleHRlbmRzIFBIUEV4Y2VsX1dyaXRlcl9FeGNlbDIwMDdfV3JpdGVyUGFydAp7CgkvKioKCSAqIFdyaXRlIHdvcmtib29rIHRvIFhNTCBmb3JtYXQKCSAqCgkgKiBAcGFyYW0gCVBIUEV4Y2VsCSRwUEhQRXhjZWwKCSAqIEBwYXJhbQlib29sZWFuCQkkcmVjYWxjUmVxdWlyZWQJSW5kaWNhdGUgd2hldGhlciBmb3JtdWxhcyBzaG91bGQgYmUgcmVjYWxjdWxhdGVkIGJlZm9yZSB3cml0aW5nCgkgKiBAcmV0dXJuIAlzdHJpbmcgCQlYTUwgT3V0cHV0CgkgKiBAdGhyb3dzIAlFeGNlcHRpb24KCSAqLwoJcHVibGljIGZ1bmN0aW9uIHdyaXRlV29ya2Jvb2soUEhQRXhjZWwgJHBQSFBFeGNlbCA9IG51bGwsICRyZWNhbGNSZXF1aXJlZCA9IEZBTFNFKQoJewoJCS8vIENyZWF0ZSBYTUwgd3JpdGVyCgkJJG9ialdyaXRlciA9IG51bGw7CgkJaWYgKCR0aGlzLT5nZXRQYXJlbnRXcml0ZXIoKS0+Z2V0VXNlRGlza0NhY2hpbmcoKSkgewoJCQkkb2JqV3JpdGVyID0gbmV3IFBIUEV4Y2VsX1NoYXJlZF9YTUxXcml0ZXIoUEhQRXhjZWxfU2hhcmVkX1hNTFdyaXRlcjo6U1RPUkFHRV9ESVNLLCAkdGhpcy0+Z2V0UGFyZW50V3JpdGVyKCktPmdldERpc2tDYWNoaW5nRGlyZWN0b3J5KCkpOwoJCX0gZWxzZSB7CgkJCSRvYmpXcml0ZXIgPSBuZXcgUEhQRXhjZWxfU2hhcmVkX1hNTFdyaXRlcihQSFBFeGNlbF9TaGFyZWRfWE1MV3JpdGVyOjpTVE9SQUdFX01FTU9SWSk7CgkJfQoKCQkvLyBYTUwgaGVhZGVyCgkJJG9ialdyaXRlci0+c3RhcnREb2N1bWVudCgnMS4wJywnVVRGLTgnLCd5ZXMnKTsKCgkJLy8gd29ya2Jvb2sKCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ3dvcmtib29rJyk7CgkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ3htbDpzcGFjZScsICdwcmVzZXJ2ZScpOwoJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCd4bWxucycsICdodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvc3ByZWFkc2hlZXRtbC8yMDA2L21haW4nKTsKCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgneG1sbnM6cicsICdodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvb2ZmaWNlRG9jdW1lbnQvMjAwNi9yZWxhdGlvbnNoaXBzJyk7CgoJCQkvLyBmaWxlVmVyc2lvbgoJCQkkdGhpcy0+X3dyaXRlRmlsZVZlcnNpb24oJG9ialdyaXRlcik7CgoJCQkvLyB3b3JrYm9va1ByCgkJCSR0aGlzLT5fd3JpdGVXb3JrYm9va1ByKCRvYmpXcml0ZXIpOwoKCQkJLy8gd29ya2Jvb2tQcm90ZWN0aW9uCgkJCSR0aGlzLT5fd3JpdGVXb3JrYm9va1Byb3RlY3Rpb24oJG9ialdyaXRlciwgJHBQSFBFeGNlbCk7CgoJCQkvLyBib29rVmlld3MKCQkJaWYgKCR0aGlzLT5nZXRQYXJlbnRXcml0ZXIoKS0+Z2V0T2ZmaWNlMjAwM0NvbXBhdGliaWxpdHkoKSA9PT0gZmFsc2UpIHsKCQkJCSR0aGlzLT5fd3JpdGVCb29rVmlld3MoJG9ialdyaXRlciwgJHBQSFBFeGNlbCk7CgkJCX0KCgkJCS8vIHNoZWV0cwoJCQkkdGhpcy0+X3dyaXRlU2hlZXRzKCRvYmpXcml0ZXIsICRwUEhQRXhjZWwpOwoKCQkJLy8gZGVmaW5lZE5hbWVzCgkJCSR0aGlzLT5fd3JpdGVEZWZpbmVkTmFtZXMoJG9ialdyaXRlciwgJHBQSFBFeGNlbCk7CgoJCQkvLyBjYWxjUHIKCQkJJHRoaXMtPl93cml0ZUNhbGNQcigkb2JqV3JpdGVyLCRyZWNhbGNSZXF1aXJlZCk7CgoJCSRvYmpXcml0ZXItPmVuZEVsZW1lbnQoKTsKCgkJLy8gUmV0dXJuCgkJcmV0dXJuICRvYmpXcml0ZXItPmdldERhdGEoKTsKCX0KCgkvKioKCSAqIFdyaXRlIGZpbGUgdmVyc2lvbgoJICoKCSAqIEBwYXJhbSAJUEhQRXhjZWxfU2hhcmVkX1hNTFdyaXRlciAkb2JqV3JpdGVyIAkJWE1MIFdyaXRlcgoJICogQHRocm93cyAJRXhjZXB0aW9uCgkgKi8KCXByaXZhdGUgZnVuY3Rpb24gX3dyaXRlRmlsZVZlcnNpb24oUEhQRXhjZWxfU2hhcmVkX1hNTFdyaXRlciAkb2JqV3JpdGVyID0gbnVsbCkKCXsKCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ2ZpbGVWZXJzaW9uJyk7CgkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ2FwcE5hbWUnLCAneGwnKTsKCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgnbGFzdEVkaXRlZCcsICc0Jyk7CgkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ2xvd2VzdEVkaXRlZCcsICc0Jyk7CgkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ3J1cEJ1aWxkJywgJzQ1MDUnKTsKCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7Cgl9CgoJLyoqCgkgKiBXcml0ZSBXb3JrYm9va1ByCgkgKgoJICogQHBhcmFtIAlQSFBFeGNlbF9TaGFyZWRfWE1MV3JpdGVyICRvYmpXcml0ZXIgCQlYTUwgV3JpdGVyCgkgKiBAdGhyb3dzIAlFeGNlcHRpb24KCSAqLwoJcHJpdmF0ZSBmdW5jdGlvbiBfd3JpdGVXb3JrYm9va1ByKFBIUEV4Y2VsX1NoYXJlZF9YTUxXcml0ZXIgJG9ialdyaXRlciA9IG51bGwpCgl7CgkJJG9ialdyaXRlci0+c3RhcnRFbGVtZW50KCd3b3JrYm9va1ByJyk7CgoJCWlmIChQSFBFeGNlbF9TaGFyZWRfRGF0ZTo6Z2V0RXhjZWxDYWxlbmRhcigpID09IFBIUEV4Y2VsX1NoYXJlZF9EYXRlOjpDQUxFTkRBUl9NQUNfMTkwNCkgewoJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgnZGF0ZTE5MDQnLCAnMScpOwoJCX0KCgkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ2NvZGVOYW1lJywgJ1RoaXNXb3JrYm9vaycpOwoKCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7Cgl9CgoJLyoqCgkgKiBXcml0ZSBCb29rVmlld3MKCSAqCgkgKiBAcGFyYW0gCVBIUEV4Y2VsX1NoYXJlZF9YTUxXcml0ZXIgCSRvYmpXcml0ZXIgCQlYTUwgV3JpdGVyCgkgKiBAcGFyYW0gCVBIUEV4Y2VsCQkJCQkkcFBIUEV4Y2VsCgkgKiBAdGhyb3dzIAlFeGNlcHRpb24KCSAqLwoJcHJpdmF0ZSBmdW5jdGlvbiBfd3JpdGVCb29rVmlld3MoUEhQRXhjZWxfU2hhcmVkX1hNTFdyaXRlciAkb2JqV3JpdGVyID0gbnVsbCwgUEhQRXhjZWwgJHBQSFBFeGNlbCA9IG51bGwpCgl7CgkJLy8gYm9va1ZpZXdzCgkJJG9ialdyaXRlci0+c3RhcnRFbGVtZW50KCdib29rVmlld3MnKTsKCgkJCS8vIHdvcmtib29rVmlldwoJCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ3dvcmtib29rVmlldycpOwoKCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ2FjdGl2ZVRhYicsICRwUEhQRXhjZWwtPmdldEFjdGl2ZVNoZWV0SW5kZXgoKSk7CgkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCdhdXRvRmlsdGVyRGF0ZUdyb3VwaW5nJywgJzEnKTsKCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ2ZpcnN0U2hlZXQnLCAnMCcpOwoJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgnbWluaW1pemVkJywgJzAnKTsKCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ3Nob3dIb3Jpem9udGFsU2Nyb2xsJywgJzEnKTsKCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ3Nob3dTaGVldFRhYnMnLCAnMScpOwoJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgnc2hvd1ZlcnRpY2FsU2Nyb2xsJywgJzEnKTsKCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ3RhYlJhdGlvJywgJzYwMCcpOwoJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgndmlzaWJpbGl0eScsICd2aXNpYmxlJyk7CgoJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgoJCSRvYmpXcml0ZXItPmVuZEVsZW1lbnQoKTsKCX0KCgkvKioKCSAqIFdyaXRlIFdvcmtib29rUHJvdGVjdGlvbgoJICoKCSAqIEBwYXJhbSAJUEhQRXhjZWxfU2hhcmVkX1hNTFdyaXRlciAJJG9ialdyaXRlciAJCVhNTCBXcml0ZXIKCSAqIEBwYXJhbSAJUEhQRXhjZWwJCQkJCSRwUEhQRXhjZWwKCSAqIEB0aHJvd3MgCUV4Y2VwdGlvbgoJICovCglwcml2YXRlIGZ1bmN0aW9uIF93cml0ZVdvcmtib29rUHJvdGVjdGlvbihQSFBFeGNlbF9TaGFyZWRfWE1MV3JpdGVyICRvYmpXcml0ZXIgPSBudWxsLCBQSFBFeGNlbCAkcFBIUEV4Y2VsID0gbnVsbCkKCXsKCQlpZiAoJHBQSFBFeGNlbC0+Z2V0U2VjdXJpdHkoKS0+aXNTZWN1cml0eUVuYWJsZWQoKSkgewoJCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ3dvcmtib29rUHJvdGVjdGlvbicpOwoJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgnbG9ja1JldmlzaW9uJywJCSgkcFBIUEV4Y2VsLT5nZXRTZWN1cml0eSgpLT5nZXRMb2NrUmV2aXNpb24oKSA/ICd0cnVlJyA6ICdmYWxzZScpKTsKCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ2xvY2tTdHJ1Y3R1cmUnLCAJKCRwUEhQRXhjZWwtPmdldFNlY3VyaXR5KCktPmdldExvY2tTdHJ1Y3R1cmUoKSA/ICd0cnVlJyA6ICdmYWxzZScpKTsKCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ2xvY2tXaW5kb3dzJywgCQkoJHBQSFBFeGNlbC0+Z2V0U2VjdXJpdHkoKS0+Z2V0TG9ja1dpbmRvd3MoKSA/ICd0cnVlJyA6ICdmYWxzZScpKTsKCgkJCWlmICgkcFBIUEV4Y2VsLT5nZXRTZWN1cml0eSgpLT5nZXRSZXZpc2lvbnNQYXNzd29yZCgpICE9ICcnKSB7CgkJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgncmV2aXNpb25zUGFzc3dvcmQnLAkkcFBIUEV4Y2VsLT5nZXRTZWN1cml0eSgpLT5nZXRSZXZpc2lvbnNQYXNzd29yZCgpKTsKCQkJfQoKCQkJaWYgKCRwUEhQRXhjZWwtPmdldFNlY3VyaXR5KCktPmdldFdvcmtib29rUGFzc3dvcmQoKSAhPSAnJykgewoJCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ3dvcmtib29rUGFzc3dvcmQnLAkkcFBIUEV4Y2VsLT5nZXRTZWN1cml0eSgpLT5nZXRXb3JrYm9va1Bhc3N3b3JkKCkpOwoJCQl9CgoJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgkJfQoJfQoKCS8qKgoJICogV3JpdGUgY2FsY1ByCgkgKgoJICogQHBhcmFtIAlQSFBFeGNlbF9TaGFyZWRfWE1MV3JpdGVyCSRvYmpXcml0ZXIJCVhNTCBXcml0ZXIKCSAqIEBwYXJhbQlib29sZWFuCQkJCQkJJHJlY2FsY1JlcXVpcmVkCUluZGljYXRlIHdoZXRoZXIgZm9ybXVsYXMgc2hvdWxkIGJlIHJlY2FsY3VsYXRlZCBiZWZvcmUgd3JpdGluZwoJICogQHRocm93cyAJRXhjZXB0aW9uCgkgKi8KCXByaXZhdGUgZnVuY3Rpb24gX3dyaXRlQ2FsY1ByKFBIUEV4Y2VsX1NoYXJlZF9YTUxXcml0ZXIgJG9ialdyaXRlciA9IG51bGwsICRyZWNhbGNSZXF1aXJlZCA9IFRSVUUpCgl7CgkJJG9ialdyaXRlci0+c3RhcnRFbGVtZW50KCdjYWxjUHInKTsKCgkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ2NhbGNJZCcsIAkJCScxMjQ1MTknKTsKCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgnY2FsY01vZGUnLCAJCQknYXV0bycpOwoJCS8vCWZ1bGxDYWxjT25Mb2FkIGlzbid0IG5lZWRlZCBpZiB3ZSd2ZSByZWNhbGN1bGF0aW5nIGZvciB0aGUgc2F2ZQoJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCdmdWxsQ2FsY09uTG9hZCcsIAkoJHJlY2FsY1JlcXVpcmVkKSA/ICcwJyA6ICcxJyk7CgoJCSRvYmpXcml0ZXItPmVuZEVsZW1lbnQoKTsKCX0KCgkvKioKCSAqIFdyaXRlIHNoZWV0cwoJICoKCSAqIEBwYXJhbSAJUEhQRXhjZWxfU2hhcmVkX1hNTFdyaXRlciAJJG9ialdyaXRlciAJCVhNTCBXcml0ZXIKCSAqIEBwYXJhbSAJUEhQRXhjZWwJCQkJCSRwUEhQRXhjZWwKCSAqIEB0aHJvd3MgCUV4Y2VwdGlvbgoJICovCglwcml2YXRlIGZ1bmN0aW9uIF93cml0ZVNoZWV0cyhQSFBFeGNlbF9TaGFyZWRfWE1MV3JpdGVyICRvYmpXcml0ZXIgPSBudWxsLCBQSFBFeGNlbCAkcFBIUEV4Y2VsID0gbnVsbCkKCXsKCQkvLyBXcml0ZSBzaGVldHMKCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ3NoZWV0cycpOwoJCSRzaGVldENvdW50ID0gJHBQSFBFeGNlbC0+Z2V0U2hlZXRDb3VudCgpOwoJCWZvciAoJGkgPSAwOyAkaSA8ICRzaGVldENvdW50OyArKyRpKSB7CgkJCS8vIHNoZWV0CgkJCSR0aGlzLT5fd3JpdGVTaGVldCgKCQkJCSRvYmpXcml0ZXIsCgkJCQkkcFBIUEV4Y2VsLT5nZXRTaGVldCgkaSktPmdldFRpdGxlKCksCgkJCQkoJGkgKyAxKSwKCQkJCSgkaSArIDEgKyAzKSwKCQkJCSRwUEhQRXhjZWwtPmdldFNoZWV0KCRpKS0+Z2V0U2hlZXRTdGF0ZSgpCgkJCSk7CgkJfQoKCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7Cgl9CgoJLyoqCgkgKiBXcml0ZSBzaGVldAoJICoKCSAqIEBwYXJhbSAJUEhQRXhjZWxfU2hhcmVkX1hNTFdyaXRlciAJJG9ialdyaXRlciAJCVhNTCBXcml0ZXIKCSAqIEBwYXJhbSAJc3RyaW5nIAkJCQkJCSRwU2hlZXRuYW1lIAkJU2hlZXQgbmFtZQoJICogQHBhcmFtIAlpbnQJCQkJCQkJJHBTaGVldElkCSAJCVNoZWV0IGlkCgkgKiBAcGFyYW0gCWludAkJCQkJCQkkcFJlbElkCQkJCVJlbGF0aW9uc2hpcCBJRAoJICogQHBhcmFtICAgc3RyaW5nICAgICAgICAgICAgICAgICAgICAgICRzaGVldFN0YXRlICAgICAgICAgU2hlZXQgc3RhdGUgKHZpc2libGUsIGhpZGRlbiwgdmVyeUhpZGRlbikKCSAqIEB0aHJvd3MgCUV4Y2VwdGlvbgoJICovCglwcml2YXRlIGZ1bmN0aW9uIF93cml0ZVNoZWV0KFBIUEV4Y2VsX1NoYXJlZF9YTUxXcml0ZXIgJG9ialdyaXRlciA9IG51bGwsICRwU2hlZXRuYW1lID0gJycsICRwU2hlZXRJZCA9IDEsICRwUmVsSWQgPSAxLCAkc2hlZXRTdGF0ZSA9ICd2aXNpYmxlJykKCXsKCQlpZiAoJHBTaGVldG5hbWUgIT0gJycpIHsKCQkJLy8gV3JpdGUgc2hlZXQKCQkJJG9ialdyaXRlci0+c3RhcnRFbGVtZW50KCdzaGVldCcpOwoJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgnbmFtZScsIAkJJHBTaGVldG5hbWUpOwoJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgnc2hlZXRJZCcsIAkkcFNoZWV0SWQpOwoJCQlpZiAoJHNoZWV0U3RhdGUgIT0gJ3Zpc2libGUnICYmICRzaGVldFN0YXRlICE9ICcnKSB7CgkJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgnc3RhdGUnLCAkc2hlZXRTdGF0ZSk7CgkJCX0KCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ3I6aWQnLCAJCSdySWQnIC4gJHBSZWxJZCk7CgkJCSRvYmpXcml0ZXItPmVuZEVsZW1lbnQoKTsKCQl9IGVsc2UgewoJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCJJbnZhbGlkIHBhcmFtZXRlcnMgcGFzc2VkLiIpOwoJCX0KCX0KCgkvKioKCSAqIFdyaXRlIERlZmluZWQgTmFtZXMKCSAqCgkgKiBAcGFyYW0gCVBIUEV4Y2VsX1NoYXJlZF9YTUxXcml0ZXIJJG9ialdyaXRlciAJCVhNTCBXcml0ZXIKCSAqIEBwYXJhbSAJUEhQRXhjZWwJCQkJCSRwUEhQRXhjZWwKCSAqIEB0aHJvd3MgCUV4Y2VwdGlvbgoJICovCglwcml2YXRlIGZ1bmN0aW9uIF93cml0ZURlZmluZWROYW1lcyhQSFBFeGNlbF9TaGFyZWRfWE1MV3JpdGVyICRvYmpXcml0ZXIgPSBudWxsLCBQSFBFeGNlbCAkcFBIUEV4Y2VsID0gbnVsbCkKCXsKCQkvLyBXcml0ZSBkZWZpbmVkIG5hbWVzCgkJJG9ialdyaXRlci0+c3RhcnRFbGVtZW50KCdkZWZpbmVkTmFtZXMnKTsKCgkJLy8gTmFtZWQgcmFuZ2VzCgkJaWYgKGNvdW50KCRwUEhQRXhjZWwtPmdldE5hbWVkUmFuZ2VzKCkpID4gMCkgewoJCQkvLyBOYW1lZCByYW5nZXMKCQkJJHRoaXMtPl93cml0ZU5hbWVkUmFuZ2VzKCRvYmpXcml0ZXIsICRwUEhQRXhjZWwpOwoJCX0KCgkJLy8gT3RoZXIgZGVmaW5lZCBuYW1lcwoJCSRzaGVldENvdW50ID0gJHBQSFBFeGNlbC0+Z2V0U2hlZXRDb3VudCgpOwoJCWZvciAoJGkgPSAwOyAkaSA8ICRzaGVldENvdW50OyArKyRpKSB7CgkJCS8vIGRlZmluZWROYW1lIGZvciBhdXRvRmlsdGVyCgkJCSR0aGlzLT5fd3JpdGVEZWZpbmVkTmFtZUZvckF1dG9maWx0ZXIoJG9ialdyaXRlciwgJHBQSFBFeGNlbC0+Z2V0U2hlZXQoJGkpLCAkaSk7CgoJCQkvLyBkZWZpbmVkTmFtZSBmb3IgUHJpbnRfVGl0bGVzCgkJCSR0aGlzLT5fd3JpdGVEZWZpbmVkTmFtZUZvclByaW50VGl0bGVzKCRvYmpXcml0ZXIsICRwUEhQRXhjZWwtPmdldFNoZWV0KCRpKSwgJGkpOwoKCQkJLy8gZGVmaW5lZE5hbWUgZm9yIFByaW50X0FyZWEKCQkJJHRoaXMtPl93cml0ZURlZmluZWROYW1lRm9yUHJpbnRBcmVhKCRvYmpXcml0ZXIsICRwUEhQRXhjZWwtPmdldFNoZWV0KCRpKSwgJGkpOwoJCX0KCgkJJG9ialdyaXRlci0+ZW5kRWxlbWVudCgpOwoJfQoKCS8qKgoJICogV3JpdGUgbmFtZWQgcmFuZ2VzCgkgKgoJICogQHBhcmFtIAlQSFBFeGNlbF9TaGFyZWRfWE1MV3JpdGVyCSRvYmpXcml0ZXIgCQlYTUwgV3JpdGVyCgkgKiBAcGFyYW0gCVBIUEV4Y2VsCQkJCQkkcFBIUEV4Y2VsCgkgKiBAdGhyb3dzIAlFeGNlcHRpb24KCSAqLwoJcHJpdmF0ZSBmdW5jdGlvbiBfd3JpdGVOYW1lZFJhbmdlcyhQSFBFeGNlbF9TaGFyZWRfWE1MV3JpdGVyICRvYmpXcml0ZXIgPSBudWxsLCBQSFBFeGNlbCAkcFBIUEV4Y2VsKQoJewoJCS8vIExvb3AgbmFtZWQgcmFuZ2VzCgkJJG5hbWVkUmFuZ2VzID0gJHBQSFBFeGNlbC0+Z2V0TmFtZWRSYW5nZXMoKTsKCQlmb3JlYWNoICgkbmFtZWRSYW5nZXMgYXMgJG5hbWVkUmFuZ2UpIHsKCQkJJHRoaXMtPl93cml0ZURlZmluZWROYW1lRm9yTmFtZWRSYW5nZSgkb2JqV3JpdGVyLCAkbmFtZWRSYW5nZSk7CgkJfQoJfQoKCS8qKgoJICogV3JpdGUgRGVmaW5lZCBOYW1lIGZvciBhdXRvRmlsdGVyCgkgKgoJICogQHBhcmFtIAlQSFBFeGNlbF9TaGFyZWRfWE1MV3JpdGVyCSRvYmpXcml0ZXIgCQlYTUwgV3JpdGVyCgkgKiBAcGFyYW0gCVBIUEV4Y2VsX05hbWVkUmFuZ2UJCQkkcE5hbWVkUmFuZ2UKCSAqIEB0aHJvd3MgCUV4Y2VwdGlvbgoJICovCglwcml2YXRlIGZ1bmN0aW9uIF93cml0ZURlZmluZWROYW1lRm9yTmFtZWRSYW5nZShQSFBFeGNlbF9TaGFyZWRfWE1MV3JpdGVyICRvYmpXcml0ZXIgPSBudWxsLCBQSFBFeGNlbF9OYW1lZFJhbmdlICRwTmFtZWRSYW5nZSkKCXsKCQkvLyBkZWZpbmVkTmFtZSBmb3IgbmFtZWQgcmFuZ2UKCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ2RlZmluZWROYW1lJyk7CgkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ25hbWUnLAkJCSRwTmFtZWRSYW5nZS0+Z2V0TmFtZSgpKTsKCQlpZiAoJHBOYW1lZFJhbmdlLT5nZXRMb2NhbE9ubHkoKSkgewoJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgnbG9jYWxTaGVldElkJywJJHBOYW1lZFJhbmdlLT5nZXRTY29wZSgpLT5nZXRQYXJlbnQoKS0+Z2V0SW5kZXgoJHBOYW1lZFJhbmdlLT5nZXRTY29wZSgpKSk7CgkJfQoKCQkvLyBDcmVhdGUgYWJzb2x1dGUgY29vcmRpbmF0ZSBhbmQgd3JpdGUgYXMgcmF3IHRleHQKCQkkcmFuZ2UgPSBQSFBFeGNlbF9DZWxsOjpzcGxpdFJhbmdlKCRwTmFtZWRSYW5nZS0+Z2V0UmFuZ2UoKSk7CgkJZm9yICgkaSA9IDA7ICRpIDwgY291bnQoJHJhbmdlKTsgJGkrKykgewoJCQkkcmFuZ2VbJGldWzBdID0gJ1wnJyAuIHN0cl9yZXBsYWNlKCInIiwgIicnIiwgJHBOYW1lZFJhbmdlLT5nZXRXb3Jrc2hlZXQoKS0+Z2V0VGl0bGUoKSkgLiAnXCchJyAuIFBIUEV4Y2VsX0NlbGw6OmFic29sdXRlUmVmZXJlbmNlKCRyYW5nZVskaV1bMF0pOwoJCQlpZiAoaXNzZXQoJHJhbmdlWyRpXVsxXSkpIHsKCQkJCSRyYW5nZVskaV1bMV0gPSBQSFBFeGNlbF9DZWxsOjphYnNvbHV0ZVJlZmVyZW5jZSgkcmFuZ2VbJGldWzFdKTsKCQkJfQoJCX0KCQkkcmFuZ2UgPSBQSFBFeGNlbF9DZWxsOjpidWlsZFJhbmdlKCRyYW5nZSk7CgoJCSRvYmpXcml0ZXItPndyaXRlUmF3RGF0YSgkcmFuZ2UpOwoKCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7Cgl9CgoJLyoqCgkgKiBXcml0ZSBEZWZpbmVkIE5hbWUgZm9yIGF1dG9GaWx0ZXIKCSAqCgkgKiBAcGFyYW0gCVBIUEV4Y2VsX1NoYXJlZF9YTUxXcml0ZXIJJG9ialdyaXRlciAJCVhNTCBXcml0ZXIKCSAqIEBwYXJhbSAJUEhQRXhjZWxfV29ya3NoZWV0CQkJJHBTaGVldAoJICogQHBhcmFtIAlpbnQJCQkJCQkJJHBTaGVldElkCgkgKiBAdGhyb3dzIAlFeGNlcHRpb24KCSAqLwoJcHJpdmF0ZSBmdW5jdGlvbiBfd3JpdGVEZWZpbmVkTmFtZUZvckF1dG9maWx0ZXIoUEhQRXhjZWxfU2hhcmVkX1hNTFdyaXRlciAkb2JqV3JpdGVyID0gbnVsbCwgUEhQRXhjZWxfV29ya3NoZWV0ICRwU2hlZXQgPSBudWxsLCAkcFNoZWV0SWQgPSAwKQoJewoJCS8vIGRlZmluZWROYW1lIGZvciBhdXRvRmlsdGVyCgkJaWYgKCRwU2hlZXQtPmdldEF1dG9GaWx0ZXIoKSAhPSAnJykgewoJCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ2RlZmluZWROYW1lJyk7CgkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCduYW1lJywJCQknX3hsbm0uX0ZpbHRlckRhdGFiYXNlJyk7CgkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCdsb2NhbFNoZWV0SWQnLAkkcFNoZWV0SWQpOwoJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgnaGlkZGVuJywJCScxJyk7CgoJCQkvLyBDcmVhdGUgYWJzb2x1dGUgY29vcmRpbmF0ZSBhbmQgd3JpdGUgYXMgcmF3IHRleHQKCQkJJHJhbmdlID0gUEhQRXhjZWxfQ2VsbDo6c3BsaXRSYW5nZSgkcFNoZWV0LT5nZXRBdXRvRmlsdGVyKCkpOwoJCQkkcmFuZ2UgPSAkcmFuZ2VbMF07CgkJCS8vCVN0cmlwIGFueSB3b3Jrc2hlZXQgcmVmIHNvIHdlIGNhbiBtYWtlIHRoZSBjZWxsIHJlZiBhYnNvbHV0ZQoJCQlpZiAoc3RycG9zKCRyYW5nZVswXSwnIScpICE9PSBmYWxzZSkgewoJCQkJbGlzdCgkd3MsJHJhbmdlWzBdKSA9IGV4cGxvZGUoJyEnLCRyYW5nZVswXSk7CgkJCX0KCgkJCSRyYW5nZVswXSA9IFBIUEV4Y2VsX0NlbGw6OmFic29sdXRlQ29vcmRpbmF0ZSgkcmFuZ2VbMF0pOwoJCQkkcmFuZ2VbMV0gPSBQSFBFeGNlbF9DZWxsOjphYnNvbHV0ZUNvb3JkaW5hdGUoJHJhbmdlWzFdKTsKCQkJJHJhbmdlID0gaW1wbG9kZSgnOicsICRyYW5nZSk7CgoJCQkkb2JqV3JpdGVyLT53cml0ZVJhd0RhdGEoJ1wnJyAuIHN0cl9yZXBsYWNlKCInIiwgIicnIiwgJHBTaGVldC0+Z2V0VGl0bGUoKSkgLiAnXCchJyAuICRyYW5nZSk7CgoJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgkJfQoJfQoKCS8qKgoJICogV3JpdGUgRGVmaW5lZCBOYW1lIGZvciBQcmludFRpdGxlcwoJICoKCSAqIEBwYXJhbSAJUEhQRXhjZWxfU2hhcmVkX1hNTFdyaXRlcgkkb2JqV3JpdGVyIAkJWE1MIFdyaXRlcgoJICogQHBhcmFtIAlQSFBFeGNlbF9Xb3Jrc2hlZXQJCQkkcFNoZWV0CgkgKiBAcGFyYW0gCWludAkJCQkJCQkkcFNoZWV0SWQKCSAqIEB0aHJvd3MgCUV4Y2VwdGlvbgoJICovCglwcml2YXRlIGZ1bmN0aW9uIF93cml0ZURlZmluZWROYW1lRm9yUHJpbnRUaXRsZXMoUEhQRXhjZWxfU2hhcmVkX1hNTFdyaXRlciAkb2JqV3JpdGVyID0gbnVsbCwgUEhQRXhjZWxfV29ya3NoZWV0ICRwU2hlZXQgPSBudWxsLCAkcFNoZWV0SWQgPSAwKQoJewoJCS8vIGRlZmluZWROYW1lIGZvciBQcmludFRpdGxlcwoJCWlmICgkcFNoZWV0LT5nZXRQYWdlU2V0dXAoKS0+aXNDb2x1bW5zVG9SZXBlYXRBdExlZnRTZXQoKSB8fCAkcFNoZWV0LT5nZXRQYWdlU2V0dXAoKS0+aXNSb3dzVG9SZXBlYXRBdFRvcFNldCgpKSB7CgkJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgnZGVmaW5lZE5hbWUnKTsKCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ25hbWUnLAkJCSdfeGxubS5QcmludF9UaXRsZXMnKTsKCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ2xvY2FsU2hlZXRJZCcsCSRwU2hlZXRJZCk7CgoJCQkvLyBTZXR0aW5nIHN0cmluZwoJCQkkc2V0dGluZ1N0cmluZyA9ICcnOwoKCQkJLy8gQ29sdW1ucyB0byByZXBlYXQKCQkJaWYgKCRwU2hlZXQtPmdldFBhZ2VTZXR1cCgpLT5pc0NvbHVtbnNUb1JlcGVhdEF0TGVmdFNldCgpKSB7CgkJCQkkcmVwZWF0ID0gJHBTaGVldC0+Z2V0UGFnZVNldHVwKCktPmdldENvbHVtbnNUb1JlcGVhdEF0TGVmdCgpOwoKCQkJCSRzZXR0aW5nU3RyaW5nIC49ICdcJycgLiBzdHJfcmVwbGFjZSgiJyIsICInJyIsICRwU2hlZXQtPmdldFRpdGxlKCkpIC4gJ1wnISQnIC4gJHJlcGVhdFswXSAuICc6JCcgLiAkcmVwZWF0WzFdOwoJCQl9CgoJCQkvLyBSb3dzIHRvIHJlcGVhdAoJCQlpZiAoJHBTaGVldC0+Z2V0UGFnZVNldHVwKCktPmlzUm93c1RvUmVwZWF0QXRUb3BTZXQoKSkgewoJCQkJaWYgKCRwU2hlZXQtPmdldFBhZ2VTZXR1cCgpLT5pc0NvbHVtbnNUb1JlcGVhdEF0TGVmdFNldCgpKSB7CgkJCQkJJHNldHRpbmdTdHJpbmcgLj0gJywnOwoJCQkJfQoKCQkJCSRyZXBlYXQgPSAkcFNoZWV0LT5nZXRQYWdlU2V0dXAoKS0+Z2V0Um93c1RvUmVwZWF0QXRUb3AoKTsKCgkJCQkkc2V0dGluZ1N0cmluZyAuPSAnXCcnIC4gc3RyX3JlcGxhY2UoIiciLCAiJyciLCAkcFNoZWV0LT5nZXRUaXRsZSgpKSAuICdcJyEkJyAuICRyZXBlYXRbMF0gLiAnOiQnIC4gJHJlcGVhdFsxXTsKCQkJfQoKCQkJJG9ialdyaXRlci0+d3JpdGVSYXdEYXRhKCRzZXR0aW5nU3RyaW5nKTsKCgkJCSRvYmpXcml0ZXItPmVuZEVsZW1lbnQoKTsKCQl9Cgl9CgoJLyoqCgkgKiBXcml0ZSBEZWZpbmVkIE5hbWUgZm9yIFByaW50VGl0bGVzCgkgKgoJICogQHBhcmFtIAlQSFBFeGNlbF9TaGFyZWRfWE1MV3JpdGVyCSRvYmpXcml0ZXIgCQlYTUwgV3JpdGVyCgkgKiBAcGFyYW0gCVBIUEV4Y2VsX1dvcmtzaGVldAkJCSRwU2hlZXQKCSAqIEBwYXJhbSAJaW50CQkJCQkJCSRwU2hlZXRJZAoJICogQHRocm93cyAJRXhjZXB0aW9uCgkgKi8KCXByaXZhdGUgZnVuY3Rpb24gX3dyaXRlRGVmaW5lZE5hbWVGb3JQcmludEFyZWEoUEhQRXhjZWxfU2hhcmVkX1hNTFdyaXRlciAkb2JqV3JpdGVyID0gbnVsbCwgUEhQRXhjZWxfV29ya3NoZWV0ICRwU2hlZXQgPSBudWxsLCAkcFNoZWV0SWQgPSAwKQoJewoJCS8vIGRlZmluZWROYW1lIGZvciBQcmludEFyZWEKCQlpZiAoJHBTaGVldC0+Z2V0UGFnZVNldHVwKCktPmlzUHJpbnRBcmVhU2V0KCkpIHsKCQkJJG9ialdyaXRlci0+c3RhcnRFbGVtZW50KCdkZWZpbmVkTmFtZScpOwoJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgnbmFtZScsCQkJJ194bG5tLlByaW50X0FyZWEnKTsKCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ2xvY2FsU2hlZXRJZCcsCSRwU2hlZXRJZCk7CgoJCQkvLyBTZXR0aW5nIHN0cmluZwoJCQkkc2V0dGluZ1N0cmluZyA9ICcnOwoKCQkJLy8gUHJpbnQgYXJlYQoJCQkkcHJpbnRBcmVhID0gUEhQRXhjZWxfQ2VsbDo6c3BsaXRSYW5nZSgkcFNoZWV0LT5nZXRQYWdlU2V0dXAoKS0+Z2V0UHJpbnRBcmVhKCkpOwoKCQkJJGNodW5rcyA9IGFycmF5KCk7CgkJCWZvcmVhY2ggKCRwcmludEFyZWEgYXMgJHByaW50QXJlYVJlY3QpIHsKCQkJCSRwcmludEFyZWFSZWN0WzBdID0gUEhQRXhjZWxfQ2VsbDo6YWJzb2x1dGVSZWZlcmVuY2UoJHByaW50QXJlYVJlY3RbMF0pOwoJCQkJJHByaW50QXJlYVJlY3RbMV0gPSBQSFBFeGNlbF9DZWxsOjphYnNvbHV0ZVJlZmVyZW5jZSgkcHJpbnRBcmVhUmVjdFsxXSk7CgkJCQkkY2h1bmtzW10gPSAnXCcnIC4gc3RyX3JlcGxhY2UoIiciLCAiJyciLCAkcFNoZWV0LT5nZXRUaXRsZSgpKSAuICdcJyEnIC4gaW1wbG9kZSgnOicsICRwcmludEFyZWFSZWN0KTsKCQkJfQoKCQkJJG9ialdyaXRlci0+d3JpdGVSYXdEYXRhKGltcGxvZGUoJywnLCAkY2h1bmtzKSk7CgoJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgkJfQoJfQp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Writer/Excel2007/Worksheet.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIFBIUEV4Y2VsCiAqCiAqIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICoKICogQGNhdGVnb3J5ICAgUEhQRXhjZWwKICogQHBhY2thZ2UJUEhQRXhjZWxfV3JpdGVyX0V4Y2VsMjAwNwogKiBAY29weXJpZ2h0ICBDb3B5cmlnaHQgKGMpIDIwMDYgLSAyMDEyIFBIUEV4Y2VsIChodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9QSFBFeGNlbCkKICogQGxpY2Vuc2UJaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL29sZC1saWNlbnNlcy9sZ3BsLTIuMS50eHQJTEdQTAogKiBAdmVyc2lvbgkxLjcuNywgMjAxMi0wNS0xOQogKi8KCgovKioKICogUEhQRXhjZWxfV3JpdGVyX0V4Y2VsMjAwN19Xb3Jrc2hlZXQKICoKICogQGNhdGVnb3J5ICAgUEhQRXhjZWwKICogQHBhY2thZ2UJUEhQRXhjZWxfV3JpdGVyX0V4Y2VsMjAwNwogKiBAY29weXJpZ2h0ICBDb3B5cmlnaHQgKGMpIDIwMDYgLSAyMDEyIFBIUEV4Y2VsIChodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9QSFBFeGNlbCkKICovCmNsYXNzIFBIUEV4Y2VsX1dyaXRlcl9FeGNlbDIwMDdfV29ya3NoZWV0IGV4dGVuZHMgUEhQRXhjZWxfV3JpdGVyX0V4Y2VsMjAwN19Xcml0ZXJQYXJ0CnsKCS8qKgoJICogV3JpdGUgd29ya3NoZWV0IHRvIFhNTCBmb3JtYXQKCSAqCgkgKiBAcGFyYW0JUEhQRXhjZWxfV29ya3NoZWV0CQkkcFNoZWV0CgkgKiBAcGFyYW0Jc3RyaW5nW10JCQkJJHBTdHJpbmdUYWJsZQoJICogQHBhcmFtCWJvb2xlYW4JCQkJCSRpbmNsdWRlQ2hhcnRzCUZsYWcgaW5kaWNhdGluZyBpZiB3ZSBzaG91bGQgd3JpdGUgY2hhcnRzCgkgKiBAcmV0dXJuCXN0cmluZwkJCQkJWE1MIE91dHB1dAoJICogQHRocm93cwlFeGNlcHRpb24KCSAqLwoJcHVibGljIGZ1bmN0aW9uIHdyaXRlV29ya3NoZWV0KCRwU2hlZXQgPSBudWxsLCAkcFN0cmluZ1RhYmxlID0gbnVsbCwgJGluY2x1ZGVDaGFydHMgPSBGQUxTRSkKCXsKCQlpZiAoIWlzX251bGwoJHBTaGVldCkpIHsKCQkJLy8gQ3JlYXRlIFhNTCB3cml0ZXIKCQkJJG9ialdyaXRlciA9IG51bGw7CgkJCWlmICgkdGhpcy0+Z2V0UGFyZW50V3JpdGVyKCktPmdldFVzZURpc2tDYWNoaW5nKCkpIHsKCQkJCSRvYmpXcml0ZXIgPSBuZXcgUEhQRXhjZWxfU2hhcmVkX1hNTFdyaXRlcihQSFBFeGNlbF9TaGFyZWRfWE1MV3JpdGVyOjpTVE9SQUdFX0RJU0ssICR0aGlzLT5nZXRQYXJlbnRXcml0ZXIoKS0+Z2V0RGlza0NhY2hpbmdEaXJlY3RvcnkoKSk7CgkJCX0gZWxzZSB7CgkJCQkkb2JqV3JpdGVyID0gbmV3IFBIUEV4Y2VsX1NoYXJlZF9YTUxXcml0ZXIoUEhQRXhjZWxfU2hhcmVkX1hNTFdyaXRlcjo6U1RPUkFHRV9NRU1PUlkpOwoJCQl9CgoJCQkvLyBYTUwgaGVhZGVyCgkJCSRvYmpXcml0ZXItPnN0YXJ0RG9jdW1lbnQoJzEuMCcsJ1VURi04JywneWVzJyk7CgoJCQkvLyBXb3Jrc2hlZXQKCQkJJG9ialdyaXRlci0+c3RhcnRFbGVtZW50KCd3b3Jrc2hlZXQnKTsKCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ3htbDpzcGFjZScsICdwcmVzZXJ2ZScpOwoJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgneG1sbnMnLCAnaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL3NwcmVhZHNoZWV0bWwvMjAwNi9tYWluJyk7CgkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCd4bWxuczpyJywgJ2h0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9vZmZpY2VEb2N1bWVudC8yMDA2L3JlbGF0aW9uc2hpcHMnKTsKCgkJCQkvLyBzaGVldFByCgkJCQkkdGhpcy0+X3dyaXRlU2hlZXRQcigkb2JqV3JpdGVyLCAkcFNoZWV0KTsKCgkJCQkvLyBEaW1lbnNpb24KCQkJCSR0aGlzLT5fd3JpdGVEaW1lbnNpb24oJG9ialdyaXRlciwgJHBTaGVldCk7CgoJCQkJLy8gc2hlZXRWaWV3cwoJCQkJJHRoaXMtPl93cml0ZVNoZWV0Vmlld3MoJG9ialdyaXRlciwgJHBTaGVldCk7CgoJCQkJLy8gc2hlZXRGb3JtYXRQcgoJCQkJJHRoaXMtPl93cml0ZVNoZWV0Rm9ybWF0UHIoJG9ialdyaXRlciwgJHBTaGVldCk7CgoJCQkJLy8gY29scwoJCQkJJHRoaXMtPl93cml0ZUNvbHMoJG9ialdyaXRlciwgJHBTaGVldCk7CgoJCQkJLy8gc2hlZXREYXRhCgkJCQkkdGhpcy0+X3dyaXRlU2hlZXREYXRhKCRvYmpXcml0ZXIsICRwU2hlZXQsICRwU3RyaW5nVGFibGUpOwoKCQkJCS8vIHNoZWV0UHJvdGVjdGlvbgoJCQkJJHRoaXMtPl93cml0ZVNoZWV0UHJvdGVjdGlvbigkb2JqV3JpdGVyLCAkcFNoZWV0KTsKCgkJCQkvLyBwcm90ZWN0ZWRSYW5nZXMKCQkJCSR0aGlzLT5fd3JpdGVQcm90ZWN0ZWRSYW5nZXMoJG9ialdyaXRlciwgJHBTaGVldCk7CgoJCQkJLy8gYXV0b0ZpbHRlcgoJCQkJJHRoaXMtPl93cml0ZUF1dG9GaWx0ZXIoJG9ialdyaXRlciwgJHBTaGVldCk7CgoJCQkJLy8gbWVyZ2VDZWxscwoJCQkJJHRoaXMtPl93cml0ZU1lcmdlQ2VsbHMoJG9ialdyaXRlciwgJHBTaGVldCk7CgoJCQkJLy8gY29uZGl0aW9uYWxGb3JtYXR0aW5nCgkJCQkkdGhpcy0+X3dyaXRlQ29uZGl0aW9uYWxGb3JtYXR0aW5nKCRvYmpXcml0ZXIsICRwU2hlZXQpOwoKCQkJCS8vIGRhdGFWYWxpZGF0aW9ucwoJCQkJJHRoaXMtPl93cml0ZURhdGFWYWxpZGF0aW9ucygkb2JqV3JpdGVyLCAkcFNoZWV0KTsKCgkJCQkvLyBoeXBlcmxpbmtzCgkJCQkkdGhpcy0+X3dyaXRlSHlwZXJsaW5rcygkb2JqV3JpdGVyLCAkcFNoZWV0KTsKCgkJCQkvLyBQcmludCBvcHRpb25zCgkJCQkkdGhpcy0+X3dyaXRlUHJpbnRPcHRpb25zKCRvYmpXcml0ZXIsICRwU2hlZXQpOwoKCQkJCS8vIFBhZ2UgbWFyZ2lucwoJCQkJJHRoaXMtPl93cml0ZVBhZ2VNYXJnaW5zKCRvYmpXcml0ZXIsICRwU2hlZXQpOwoKCQkJCS8vIFBhZ2Ugc2V0dXAKCQkJCSR0aGlzLT5fd3JpdGVQYWdlU2V0dXAoJG9ialdyaXRlciwgJHBTaGVldCk7CgoJCQkJLy8gSGVhZGVyIC8gZm9vdGVyCgkJCQkkdGhpcy0+X3dyaXRlSGVhZGVyRm9vdGVyKCRvYmpXcml0ZXIsICRwU2hlZXQpOwoKCQkJCS8vIEJyZWFrcwoJCQkJJHRoaXMtPl93cml0ZUJyZWFrcygkb2JqV3JpdGVyLCAkcFNoZWV0KTsKCgkJCQkvLyBEcmF3aW5ncyBhbmQvb3IgQ2hhcnRzCgkJCQkkdGhpcy0+X3dyaXRlRHJhd2luZ3MoJG9ialdyaXRlciwgJHBTaGVldCwgJGluY2x1ZGVDaGFydHMpOwoKCQkJCS8vIExlZ2FjeURyYXdpbmcKCQkJCSR0aGlzLT5fd3JpdGVMZWdhY3lEcmF3aW5nKCRvYmpXcml0ZXIsICRwU2hlZXQpOwoKCQkJCS8vIExlZ2FjeURyYXdpbmdIRgoJCQkJJHRoaXMtPl93cml0ZUxlZ2FjeURyYXdpbmdIRigkb2JqV3JpdGVyLCAkcFNoZWV0KTsKCgkJCSRvYmpXcml0ZXItPmVuZEVsZW1lbnQoKTsKCgkJCS8vIFJldHVybgoJCQlyZXR1cm4gJG9ialdyaXRlci0+Z2V0RGF0YSgpOwoJCX0gZWxzZSB7CgkJCXRocm93IG5ldyBFeGNlcHRpb24oIkludmFsaWQgUEhQRXhjZWxfV29ya3NoZWV0IG9iamVjdCBwYXNzZWQuIik7CgkJfQoJfQoKCS8qKgoJICogV3JpdGUgU2hlZXRQcgoJICoKCSAqIEBwYXJhbQlQSFBFeGNlbF9TaGFyZWRfWE1MV3JpdGVyCQkkb2JqV3JpdGVyCQlYTUwgV3JpdGVyCgkgKiBAcGFyYW0JUEhQRXhjZWxfV29ya3NoZWV0CQkJCSRwU2hlZXQJCQlXb3Jrc2hlZXQKCSAqIEB0aHJvd3MJRXhjZXB0aW9uCgkgKi8KCXByaXZhdGUgZnVuY3Rpb24gX3dyaXRlU2hlZXRQcihQSFBFeGNlbF9TaGFyZWRfWE1MV3JpdGVyICRvYmpXcml0ZXIgPSBudWxsLCBQSFBFeGNlbF9Xb3Jrc2hlZXQgJHBTaGVldCA9IG51bGwpCgl7CgkJLy8gc2hlZXRQcgoJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgnc2hlZXRQcicpOwoJCS8vJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ2NvZGVOYW1lJywJCSRwU2hlZXQtPmdldFRpdGxlKCkpOwoKCQkJLy8gdGFiQ29sb3IKCQkJaWYgKCRwU2hlZXQtPmlzVGFiQ29sb3JTZXQoKSkgewoJCQkJJG9ialdyaXRlci0+c3RhcnRFbGVtZW50KCd0YWJDb2xvcicpOwoJCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ3JnYicsCSRwU2hlZXQtPmdldFRhYkNvbG9yKCktPmdldEFSR0IoKSk7CgkJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgkJCX0KCgkJCS8vIG91dGxpbmVQcgoJCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ291dGxpbmVQcicpOwoJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgnc3VtbWFyeUJlbG93JywJKCRwU2hlZXQtPmdldFNob3dTdW1tYXJ5QmVsb3coKSA/ICcxJyA6ICcwJykpOwoJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgnc3VtbWFyeVJpZ2h0JywJKCRwU2hlZXQtPmdldFNob3dTdW1tYXJ5UmlnaHQoKSA/ICcxJyA6ICcwJykpOwoJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgoJCQkvLyBwYWdlU2V0VXBQcgoJCQlpZiAoJHBTaGVldC0+Z2V0UGFnZVNldHVwKCktPmdldEZpdFRvUGFnZSgpKSB7CgkJCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ3BhZ2VTZXRVcFByJyk7CgkJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgnZml0VG9QYWdlJywJJzEnKTsKCQkJCSRvYmpXcml0ZXItPmVuZEVsZW1lbnQoKTsKCQkJfQoKCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7Cgl9CgoJLyoqCgkgKiBXcml0ZSBEaW1lbnNpb24KCSAqCgkgKiBAcGFyYW0JUEhQRXhjZWxfU2hhcmVkX1hNTFdyaXRlcgkkb2JqV3JpdGVyCQlYTUwgV3JpdGVyCgkgKiBAcGFyYW0JUEhQRXhjZWxfV29ya3NoZWV0CQkJJHBTaGVldAkJCVdvcmtzaGVldAoJICogQHRocm93cwlFeGNlcHRpb24KCSAqLwoJcHJpdmF0ZSBmdW5jdGlvbiBfd3JpdGVEaW1lbnNpb24oUEhQRXhjZWxfU2hhcmVkX1hNTFdyaXRlciAkb2JqV3JpdGVyID0gbnVsbCwgUEhQRXhjZWxfV29ya3NoZWV0ICRwU2hlZXQgPSBudWxsKQoJewoJCS8vIGRpbWVuc2lvbgoJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgnZGltZW5zaW9uJyk7CgkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ3JlZicsICRwU2hlZXQtPmNhbGN1bGF0ZVdvcmtzaGVldERpbWVuc2lvbigpKTsKCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7Cgl9CgoJLyoqCgkgKiBXcml0ZSBTaGVldFZpZXdzCgkgKgoJICogQHBhcmFtCVBIUEV4Y2VsX1NoYXJlZF9YTUxXcml0ZXIJCQkkb2JqV3JpdGVyCQlYTUwgV3JpdGVyCgkgKiBAcGFyYW0JUEhQRXhjZWxfV29ya3NoZWV0CQkJCQkkcFNoZWV0CQkJV29ya3NoZWV0CgkgKiBAdGhyb3dzCUV4Y2VwdGlvbgoJICovCglwcml2YXRlIGZ1bmN0aW9uIF93cml0ZVNoZWV0Vmlld3MoUEhQRXhjZWxfU2hhcmVkX1hNTFdyaXRlciAkb2JqV3JpdGVyID0gbnVsbCwgUEhQRXhjZWxfV29ya3NoZWV0ICRwU2hlZXQgPSBudWxsKQoJewoJCS8vIHNoZWV0Vmlld3MKCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ3NoZWV0Vmlld3MnKTsKCgkJCS8vIFNoZWV0IHNlbGVjdGVkPwoJCQkkc2hlZXRTZWxlY3RlZCA9IGZhbHNlOwoJCQlpZiAoJHRoaXMtPmdldFBhcmVudFdyaXRlcigpLT5nZXRQSFBFeGNlbCgpLT5nZXRJbmRleCgkcFNoZWV0KSA9PSAkdGhpcy0+Z2V0UGFyZW50V3JpdGVyKCktPmdldFBIUEV4Y2VsKCktPmdldEFjdGl2ZVNoZWV0SW5kZXgoKSkKCQkJCSRzaGVldFNlbGVjdGVkID0gdHJ1ZTsKCgoJCQkvLyBzaGVldFZpZXcKCQkJJG9ialdyaXRlci0+c3RhcnRFbGVtZW50KCdzaGVldFZpZXcnKTsKCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ3RhYlNlbGVjdGVkJywJCSRzaGVldFNlbGVjdGVkID8gJzEnIDogJzAnKTsKCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ3dvcmtib29rVmlld0lkJywJJzAnKTsKCgkJCQkvLyBab29tIHNjYWxlcwoJCQkJaWYgKCRwU2hlZXQtPmdldFNoZWV0VmlldygpLT5nZXRab29tU2NhbGUoKSAhPSAxMDApIHsKCQkJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgnem9vbVNjYWxlJywJJHBTaGVldC0+Z2V0U2hlZXRWaWV3KCktPmdldFpvb21TY2FsZSgpKTsKCQkJCX0KCQkJCWlmICgkcFNoZWV0LT5nZXRTaGVldFZpZXcoKS0+Z2V0Wm9vbVNjYWxlTm9ybWFsKCkgIT0gMTAwKSB7CgkJCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ3pvb21TY2FsZU5vcm1hbCcsCSRwU2hlZXQtPmdldFNoZWV0VmlldygpLT5nZXRab29tU2NhbGVOb3JtYWwoKSk7CgkJCQl9CgoJCQkJLy8gR3JpZGxpbmVzCgkJCQlpZiAoJHBTaGVldC0+Z2V0U2hvd0dyaWRsaW5lcygpKSB7CgkJCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ3Nob3dHcmlkTGluZXMnLAkndHJ1ZScpOwoJCQkJfSBlbHNlIHsKCQkJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgnc2hvd0dyaWRMaW5lcycsCSdmYWxzZScpOwoJCQkJfQoKCQkJCS8vIFJvdyBhbmQgY29sdW1uIGhlYWRlcnMKCQkJCWlmICgkcFNoZWV0LT5nZXRTaG93Um93Q29sSGVhZGVycygpKSB7CgkJCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ3Nob3dSb3dDb2xIZWFkZXJzJywgJzEnKTsKCQkJCX0gZWxzZSB7CgkJCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ3Nob3dSb3dDb2xIZWFkZXJzJywgJzAnKTsKCQkJCX0KCgkJCQkvLyBSaWdodC10by1sZWZ0CgkJCQlpZiAoJHBTaGVldC0+Z2V0UmlnaHRUb0xlZnQoKSkgewoJCQkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCdyaWdodFRvTGVmdCcsCSd0cnVlJyk7CgkJCQl9CgoJCQkJJGFjdGl2ZUNlbGwgPSAkcFNoZWV0LT5nZXRBY3RpdmVDZWxsKCk7CgoJCQkJLy8gUGFuZQoJCQkJJHBhbmUgPSAnJzsKCQkJCSR0b3BMZWZ0Q2VsbCA9ICRwU2hlZXQtPmdldEZyZWV6ZVBhbmUoKTsKCQkJCWlmICgoJHRvcExlZnRDZWxsICE9ICcnKSAmJiAoJHRvcExlZnRDZWxsICE9ICdBMScpKSB7CgkJCQkJJGFjdGl2ZUNlbGwgPSAkdG9wTGVmdENlbGw7CgkJCQkJLy8gQ2FsY3VsYXRlIGZyZWV6ZSBjb29yZGluYXRlcwoJCQkJCSR4U3BsaXQgPSAkeVNwbGl0ID0gMDsKCgkJCQkJbGlzdCgkeFNwbGl0LCAkeVNwbGl0KSA9IFBIUEV4Y2VsX0NlbGw6OmNvb3JkaW5hdGVGcm9tU3RyaW5nKCR0b3BMZWZ0Q2VsbCk7CgkJCQkJJHhTcGxpdCA9IFBIUEV4Y2VsX0NlbGw6OmNvbHVtbkluZGV4RnJvbVN0cmluZygkeFNwbGl0KTsKCgkJCQkJLy8gcGFuZQoJCQkJCSRwYW5lID0gJ3RvcFJpZ2h0JzsKCQkJCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ3BhbmUnKTsKCQkJCQlpZiAoJHhTcGxpdCA+IDEpCgkJCQkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCd4U3BsaXQnLAkkeFNwbGl0IC0gMSk7CgkJCQkJaWYgKCR5U3BsaXQgPiAxKSB7CgkJCQkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCd5U3BsaXQnLAkkeVNwbGl0IC0gMSk7CgkJCQkJCSRwYW5lID0gKCR4U3BsaXQgPiAxKSA/ICdib3R0b21SaWdodCcgOiAnYm90dG9tTGVmdCc7CgkJCQkJfQoJCQkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCd0b3BMZWZ0Q2VsbCcsCSR0b3BMZWZ0Q2VsbCk7CgkJCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ2FjdGl2ZVBhbmUnLAkkcGFuZSk7CgkJCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ3N0YXRlJywJCSdmcm96ZW4nKTsKCQkJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgoJCQkJCWlmICgoJHhTcGxpdCA+IDEpICYmICgkeVNwbGl0ID4gMSkpIHsKCQkJCQkJLy8JV3JpdGUgYWRkaXRpb25hbCBzZWxlY3Rpb25zIGlmIG1vcmUgdGhhbiB0d28gcGFuZXMgKGllIGJvdGggYW4gWCBhbmQgYSBZIHNwbGl0KQoJCQkJCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ3NlbGVjdGlvbicpOwkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgncGFuZScsICd0b3BSaWdodCcpOwkJJG9ialdyaXRlci0+ZW5kRWxlbWVudCgpOwoJCQkJCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ3NlbGVjdGlvbicpOwkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgncGFuZScsICdib3R0b21MZWZ0Jyk7CSRvYmpXcml0ZXItPmVuZEVsZW1lbnQoKTsKCQkJCQl9CgkJCQl9CgoJCQkJLy8gU2VsZWN0aW9uCi8vCQkJCWlmICgkcGFuZSAhPSAnJykgewoJCQkJCS8vCU9ubHkgbmVlZCB0byB3cml0ZSBzZWxlY3Rpb24gZWxlbWVudCBpZiB3ZSBoYXZlIGEgc3BsaXQgcGFuZQoJCQkJCS8vCQlXZSBjaGVhdCBhIGxpdHRsZSBieSBvdmVyLXJpZGluZyB0aGUgYWN0aXZlIGNlbGwgc2VsZWN0aW9uLCBzZXR0aW5nIGl0IHRvIHRoZSBzcGxpdCBjZWxsCgkJCQkJJG9ialdyaXRlci0+c3RhcnRFbGVtZW50KCdzZWxlY3Rpb24nKTsKCQkJCQlpZiAoJHBhbmUgIT0gJycpIHsKCQkJCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ3BhbmUnLCAkcGFuZSk7CgkJCQkJfQoJCQkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCdhY3RpdmVDZWxsJywgJGFjdGl2ZUNlbGwpOwoJCQkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCdzcXJlZicsICRhY3RpdmVDZWxsKTsKCQkJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7Ci8vCQkJCX0KCgkJCSRvYmpXcml0ZXItPmVuZEVsZW1lbnQoKTsKCgkJJG9ialdyaXRlci0+ZW5kRWxlbWVudCgpOwoJfQoKCS8qKgoJICogV3JpdGUgU2hlZXRGb3JtYXRQcgoJICoKCSAqIEBwYXJhbQlQSFBFeGNlbF9TaGFyZWRfWE1MV3JpdGVyICRvYmpXcml0ZXIJCVhNTCBXcml0ZXIKCSAqIEBwYXJhbQlQSFBFeGNlbF9Xb3Jrc2hlZXQJCSAgJHBTaGVldAkJCVdvcmtzaGVldAoJICogQHRocm93cwlFeGNlcHRpb24KCSAqLwoJcHJpdmF0ZSBmdW5jdGlvbiBfd3JpdGVTaGVldEZvcm1hdFByKFBIUEV4Y2VsX1NoYXJlZF9YTUxXcml0ZXIgJG9ialdyaXRlciA9IG51bGwsIFBIUEV4Y2VsX1dvcmtzaGVldCAkcFNoZWV0ID0gbnVsbCkKCXsKCQkvLyBzaGVldEZvcm1hdFByCgkJJG9ialdyaXRlci0+c3RhcnRFbGVtZW50KCdzaGVldEZvcm1hdFByJyk7CgoJCQkvLyBEZWZhdWx0IHJvdyBoZWlnaHQKCQkJaWYgKCRwU2hlZXQtPmdldERlZmF1bHRSb3dEaW1lbnNpb24oKS0+Z2V0Um93SGVpZ2h0KCkgPj0gMCkgewoJCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ2N1c3RvbUhlaWdodCcsCQkndHJ1ZScpOwoJCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ2RlZmF1bHRSb3dIZWlnaHQnLAlQSFBFeGNlbF9TaGFyZWRfU3RyaW5nOjpGb3JtYXROdW1iZXIoJHBTaGVldC0+Z2V0RGVmYXVsdFJvd0RpbWVuc2lvbigpLT5nZXRSb3dIZWlnaHQoKSkpOwoJCQl9IGVsc2UgewoJCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ2RlZmF1bHRSb3dIZWlnaHQnLCAnMTQuNCcpOwoJCQl9CgoJCQkvLyBEZWZhdWx0IGNvbHVtbiB3aWR0aAoJCQlpZiAoJHBTaGVldC0+Z2V0RGVmYXVsdENvbHVtbkRpbWVuc2lvbigpLT5nZXRXaWR0aCgpID49IDApIHsKCQkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCdkZWZhdWx0Q29sV2lkdGgnLCBQSFBFeGNlbF9TaGFyZWRfU3RyaW5nOjpGb3JtYXROdW1iZXIoJHBTaGVldC0+Z2V0RGVmYXVsdENvbHVtbkRpbWVuc2lvbigpLT5nZXRXaWR0aCgpKSk7CgkJCX0KCgkJCS8vIE91dGxpbmUgbGV2ZWwgLSByb3cKCQkJJG91dGxpbmVMZXZlbFJvdyA9IDA7CgkJCWZvcmVhY2ggKCRwU2hlZXQtPmdldFJvd0RpbWVuc2lvbnMoKSBhcyAkZGltZW5zaW9uKSB7CgkJCQlpZiAoJGRpbWVuc2lvbi0+Z2V0T3V0bGluZUxldmVsKCkgPiAkb3V0bGluZUxldmVsUm93KSB7CgkJCQkJJG91dGxpbmVMZXZlbFJvdyA9ICRkaW1lbnNpb24tPmdldE91dGxpbmVMZXZlbCgpOwoJCQkJfQoJCQl9CgkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCdvdXRsaW5lTGV2ZWxSb3cnLAkoaW50KSRvdXRsaW5lTGV2ZWxSb3cpOwoKCQkJLy8gT3V0bGluZSBsZXZlbCAtIGNvbHVtbgoJCQkkb3V0bGluZUxldmVsQ29sID0gMDsKCQkJZm9yZWFjaCAoJHBTaGVldC0+Z2V0Q29sdW1uRGltZW5zaW9ucygpIGFzICRkaW1lbnNpb24pIHsKCQkJCWlmICgkZGltZW5zaW9uLT5nZXRPdXRsaW5lTGV2ZWwoKSA+ICRvdXRsaW5lTGV2ZWxDb2wpIHsKCQkJCQkkb3V0bGluZUxldmVsQ29sID0gJGRpbWVuc2lvbi0+Z2V0T3V0bGluZUxldmVsKCk7CgkJCQl9CgkJCX0KCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ291dGxpbmVMZXZlbENvbCcsCShpbnQpJG91dGxpbmVMZXZlbENvbCk7CgoJCSRvYmpXcml0ZXItPmVuZEVsZW1lbnQoKTsKCX0KCgkvKioKCSAqIFdyaXRlIENvbHMKCSAqCgkgKiBAcGFyYW0JUEhQRXhjZWxfU2hhcmVkX1hNTFdyaXRlcgkJCSRvYmpXcml0ZXIJCVhNTCBXcml0ZXIKCSAqIEBwYXJhbQlQSFBFeGNlbF9Xb3Jrc2hlZXQJCQkJCSRwU2hlZXQJCQlXb3Jrc2hlZXQKCSAqIEB0aHJvd3MJRXhjZXB0aW9uCgkgKi8KCXByaXZhdGUgZnVuY3Rpb24gX3dyaXRlQ29scyhQSFBFeGNlbF9TaGFyZWRfWE1MV3JpdGVyICRvYmpXcml0ZXIgPSBudWxsLCBQSFBFeGNlbF9Xb3Jrc2hlZXQgJHBTaGVldCA9IG51bGwpCgl7CgkJLy8gY29scwoJCWlmIChjb3VudCgkcFNoZWV0LT5nZXRDb2x1bW5EaW1lbnNpb25zKCkpID4gMCkgIHsKCQkJJG9ialdyaXRlci0+c3RhcnRFbGVtZW50KCdjb2xzJyk7CgoJCQkJJHBTaGVldC0+Y2FsY3VsYXRlQ29sdW1uV2lkdGhzKCk7CgoJCQkJLy8gTG9vcCB0aHJvdWdoIGNvbHVtbiBkaW1lbnNpb25zCgkJCQlmb3JlYWNoICgkcFNoZWV0LT5nZXRDb2x1bW5EaW1lbnNpb25zKCkgYXMgJGNvbERpbWVuc2lvbikgewoJCQkJCS8vIGNvbAoJCQkJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgnY29sJyk7CgkJCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ21pbicsCVBIUEV4Y2VsX0NlbGw6OmNvbHVtbkluZGV4RnJvbVN0cmluZygkY29sRGltZW5zaW9uLT5nZXRDb2x1bW5JbmRleCgpKSk7CgkJCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ21heCcsCVBIUEV4Y2VsX0NlbGw6OmNvbHVtbkluZGV4RnJvbVN0cmluZygkY29sRGltZW5zaW9uLT5nZXRDb2x1bW5JbmRleCgpKSk7CgoJCQkJCWlmICgkY29sRGltZW5zaW9uLT5nZXRXaWR0aCgpIDwgMCkgewoJCQkJCQkvLyBObyB3aWR0aCBzZXQsIGFwcGx5IGRlZmF1bHQgb2YgMTAKCQkJCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ3dpZHRoJywJCSc5LjEwJyk7CgkJCQkJfSBlbHNlIHsKCQkJCQkJLy8gV2lkdGggc2V0CgkJCQkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCd3aWR0aCcsCQlQSFBFeGNlbF9TaGFyZWRfU3RyaW5nOjpGb3JtYXROdW1iZXIoJGNvbERpbWVuc2lvbi0+Z2V0V2lkdGgoKSkpOwoJCQkJCX0KCgkJCQkJLy8gQ29sdW1uIHZpc2liaWxpdHkKCQkJCQlpZiAoJGNvbERpbWVuc2lvbi0+Z2V0VmlzaWJsZSgpID09IGZhbHNlKSB7CgkJCQkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCdoaWRkZW4nLAkJJ3RydWUnKTsKCQkJCQl9CgoJCQkJCS8vIEF1dG8gc2l6ZT8KCQkJCQlpZiAoJGNvbERpbWVuc2lvbi0+Z2V0QXV0b1NpemUoKSkgewoJCQkJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgnYmVzdEZpdCcsCQkndHJ1ZScpOwoJCQkJCX0KCgkJCQkJLy8gQ3VzdG9tIHdpZHRoPwoJCQkJCWlmICgkY29sRGltZW5zaW9uLT5nZXRXaWR0aCgpICE9ICRwU2hlZXQtPmdldERlZmF1bHRDb2x1bW5EaW1lbnNpb24oKS0+Z2V0V2lkdGgoKSkgewoJCQkJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgnY3VzdG9tV2lkdGgnLAkndHJ1ZScpOwoJCQkJCX0KCgkJCQkJLy8gQ29sbGFwc2VkCgkJCQkJaWYgKCRjb2xEaW1lbnNpb24tPmdldENvbGxhcHNlZCgpID09IHRydWUpIHsKCQkJCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ2NvbGxhcHNlZCcsCQkndHJ1ZScpOwoJCQkJCX0KCgkJCQkJLy8gT3V0bGluZSBsZXZlbAoJCQkJCWlmICgkY29sRGltZW5zaW9uLT5nZXRPdXRsaW5lTGV2ZWwoKSA+IDApIHsKCQkJCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ291dGxpbmVMZXZlbCcsCSRjb2xEaW1lbnNpb24tPmdldE91dGxpbmVMZXZlbCgpKTsKCQkJCQl9CgoJCQkJCS8vIFN0eWxlCgkJCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ3N0eWxlJywgJGNvbERpbWVuc2lvbi0+Z2V0WGZJbmRleCgpKTsKCgkJCQkJJG9ialdyaXRlci0+ZW5kRWxlbWVudCgpOwoJCQkJfQoKCQkJJG9ialdyaXRlci0+ZW5kRWxlbWVudCgpOwoJCX0KCX0KCgkvKioKCSAqIFdyaXRlIFNoZWV0UHJvdGVjdGlvbgoJICoKCSAqIEBwYXJhbQlQSFBFeGNlbF9TaGFyZWRfWE1MV3JpdGVyCQkJJG9ialdyaXRlcgkJWE1MIFdyaXRlcgoJICogQHBhcmFtCVBIUEV4Y2VsX1dvcmtzaGVldAkJCQkJJHBTaGVldAkJCVdvcmtzaGVldAoJICogQHRocm93cwlFeGNlcHRpb24KCSAqLwoJcHJpdmF0ZSBmdW5jdGlvbiBfd3JpdGVTaGVldFByb3RlY3Rpb24oUEhQRXhjZWxfU2hhcmVkX1hNTFdyaXRlciAkb2JqV3JpdGVyID0gbnVsbCwgUEhQRXhjZWxfV29ya3NoZWV0ICRwU2hlZXQgPSBudWxsKQoJewoJCS8vIHNoZWV0UHJvdGVjdGlvbgoJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgnc2hlZXRQcm90ZWN0aW9uJyk7CgoJCWlmICgkcFNoZWV0LT5nZXRQcm90ZWN0aW9uKCktPmdldFBhc3N3b3JkKCkgIT0gJycpIHsKCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ3Bhc3N3b3JkJywJCQkJJHBTaGVldC0+Z2V0UHJvdGVjdGlvbigpLT5nZXRQYXNzd29yZCgpKTsKCQl9CgoJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCdzaGVldCcsCQkJCSgkcFNoZWV0LT5nZXRQcm90ZWN0aW9uKCktPmdldFNoZWV0KCkJCQkJPyAndHJ1ZScgOiAnZmFsc2UnKSk7CgkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ29iamVjdHMnLAkJCQkoJHBTaGVldC0+Z2V0UHJvdGVjdGlvbigpLT5nZXRPYmplY3RzKCkJCQk/ICd0cnVlJyA6ICdmYWxzZScpKTsKCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgnc2NlbmFyaW9zJywJCQkoJHBTaGVldC0+Z2V0UHJvdGVjdGlvbigpLT5nZXRTY2VuYXJpb3MoKQkJCT8gJ3RydWUnIDogJ2ZhbHNlJykpOwoJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCdmb3JtYXRDZWxscycsCQkJKCRwU2hlZXQtPmdldFByb3RlY3Rpb24oKS0+Z2V0Rm9ybWF0Q2VsbHMoKQkJPyAndHJ1ZScgOiAnZmFsc2UnKSk7CgkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ2Zvcm1hdENvbHVtbnMnLAkJKCRwU2hlZXQtPmdldFByb3RlY3Rpb24oKS0+Z2V0Rm9ybWF0Q29sdW1ucygpCQk/ICd0cnVlJyA6ICdmYWxzZScpKTsKCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgnZm9ybWF0Um93cycsCQkJKCRwU2hlZXQtPmdldFByb3RlY3Rpb24oKS0+Z2V0Rm9ybWF0Um93cygpCQkJPyAndHJ1ZScgOiAnZmFsc2UnKSk7CgkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ2luc2VydENvbHVtbnMnLAkJKCRwU2hlZXQtPmdldFByb3RlY3Rpb24oKS0+Z2V0SW5zZXJ0Q29sdW1ucygpCQk/ICd0cnVlJyA6ICdmYWxzZScpKTsKCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgnaW5zZXJ0Um93cycsCQkJKCRwU2hlZXQtPmdldFByb3RlY3Rpb24oKS0+Z2V0SW5zZXJ0Um93cygpCQkJPyAndHJ1ZScgOiAnZmFsc2UnKSk7CgkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ2luc2VydEh5cGVybGlua3MnLAkJKCRwU2hlZXQtPmdldFByb3RlY3Rpb24oKS0+Z2V0SW5zZXJ0SHlwZXJsaW5rcygpCT8gJ3RydWUnIDogJ2ZhbHNlJykpOwoJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCdkZWxldGVDb2x1bW5zJywJCSgkcFNoZWV0LT5nZXRQcm90ZWN0aW9uKCktPmdldERlbGV0ZUNvbHVtbnMoKQkJPyAndHJ1ZScgOiAnZmFsc2UnKSk7CgkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ2RlbGV0ZVJvd3MnLAkJCSgkcFNoZWV0LT5nZXRQcm90ZWN0aW9uKCktPmdldERlbGV0ZVJvd3MoKQkJCT8gJ3RydWUnIDogJ2ZhbHNlJykpOwoJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCdzZWxlY3RMb2NrZWRDZWxscycsCSgkcFNoZWV0LT5nZXRQcm90ZWN0aW9uKCktPmdldFNlbGVjdExvY2tlZENlbGxzKCkJPyAndHJ1ZScgOiAnZmFsc2UnKSk7CgkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ3NvcnQnLAkJCQkJKCRwU2hlZXQtPmdldFByb3RlY3Rpb24oKS0+Z2V0U29ydCgpCQkJCT8gJ3RydWUnIDogJ2ZhbHNlJykpOwoJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCdhdXRvRmlsdGVyJywJCQkoJHBTaGVldC0+Z2V0UHJvdGVjdGlvbigpLT5nZXRBdXRvRmlsdGVyKCkJCQk/ICd0cnVlJyA6ICdmYWxzZScpKTsKCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgncGl2b3RUYWJsZXMnLAkJCSgkcFNoZWV0LT5nZXRQcm90ZWN0aW9uKCktPmdldFBpdm90VGFibGVzKCkJCT8gJ3RydWUnIDogJ2ZhbHNlJykpOwoJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCdzZWxlY3RVbmxvY2tlZENlbGxzJywJKCRwU2hlZXQtPmdldFByb3RlY3Rpb24oKS0+Z2V0U2VsZWN0VW5sb2NrZWRDZWxscygpCT8gJ3RydWUnIDogJ2ZhbHNlJykpOwoJCSRvYmpXcml0ZXItPmVuZEVsZW1lbnQoKTsKCX0KCgkvKioKCSAqIFdyaXRlIENvbmRpdGlvbmFsRm9ybWF0dGluZwoJICoKCSAqIEBwYXJhbQlQSFBFeGNlbF9TaGFyZWRfWE1MV3JpdGVyCQkJJG9ialdyaXRlcgkJWE1MIFdyaXRlcgoJICogQHBhcmFtCVBIUEV4Y2VsX1dvcmtzaGVldAkJCQkJJHBTaGVldAkJCVdvcmtzaGVldAoJICogQHRocm93cwlFeGNlcHRpb24KCSAqLwoJcHJpdmF0ZSBmdW5jdGlvbiBfd3JpdGVDb25kaXRpb25hbEZvcm1hdHRpbmcoUEhQRXhjZWxfU2hhcmVkX1hNTFdyaXRlciAkb2JqV3JpdGVyID0gbnVsbCwgUEhQRXhjZWxfV29ya3NoZWV0ICRwU2hlZXQgPSBudWxsKQoJewoJCS8vIENvbmRpdGlvbmFsIGlkCgkJJGlkID0gMTsKCgkJLy8gTG9vcCB0aHJvdWdoIHN0eWxlcyBpbiB0aGUgY3VycmVudCB3b3Jrc2hlZXQKCQlmb3JlYWNoICgkcFNoZWV0LT5nZXRDb25kaXRpb25hbFN0eWxlc0NvbGxlY3Rpb24oKSBhcyAkY2VsbENvb3JkaW5hdGUgPT4gJGNvbmRpdGlvbmFsU3R5bGVzKSB7CgkJCWZvcmVhY2ggKCRjb25kaXRpb25hbFN0eWxlcyBhcyAkY29uZGl0aW9uYWwpIHsKCQkJCS8vIFdIWSB3YXMgdGhpcyBhZ2Fpbj8KCQkJCS8vIGlmICgkdGhpcy0+Z2V0UGFyZW50V3JpdGVyKCktPmdldFN0eWxlc0NvbmRpdGlvbmFsSGFzaFRhYmxlKCktPmdldEluZGV4Rm9ySGFzaENvZGUoICRjb25kaXRpb25hbC0+Z2V0SGFzaENvZGUoKSApID09ICcnKSB7CgkJCQkvLwljb250aW51ZTsKCQkJCS8vIH0KCgkJCQlpZiAoJGNvbmRpdGlvbmFsLT5nZXRDb25kaXRpb25UeXBlKCkgIT0gUEhQRXhjZWxfU3R5bGVfQ29uZGl0aW9uYWw6OkNPTkRJVElPTl9OT05FKSB7CgkJCQkJLy8gY29uZGl0aW9uYWxGb3JtYXR0aW5nCgkJCQkJJG9ialdyaXRlci0+c3RhcnRFbGVtZW50KCdjb25kaXRpb25hbEZvcm1hdHRpbmcnKTsKCQkJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgnc3FyZWYnLAkkY2VsbENvb3JkaW5hdGUpOwoKCQkJCQkJLy8gY2ZSdWxlCgkJCQkJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgnY2ZSdWxlJyk7CgkJCQkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCd0eXBlJywJCSRjb25kaXRpb25hbC0+Z2V0Q29uZGl0aW9uVHlwZSgpKTsKCQkJCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ2R4ZklkJywJCSR0aGlzLT5nZXRQYXJlbnRXcml0ZXIoKS0+Z2V0U3R5bGVzQ29uZGl0aW9uYWxIYXNoVGFibGUoKS0+Z2V0SW5kZXhGb3JIYXNoQ29kZSggJGNvbmRpdGlvbmFsLT5nZXRIYXNoQ29kZSgpICkpOwoJCQkJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgncHJpb3JpdHknLAkkaWQrKyk7CgoJCQkJCQlpZiAoKCRjb25kaXRpb25hbC0+Z2V0Q29uZGl0aW9uVHlwZSgpID09IFBIUEV4Y2VsX1N0eWxlX0NvbmRpdGlvbmFsOjpDT05ESVRJT05fQ0VMTElTCgkJCQkJCQkJfHwKCQkJCQkJCSAkY29uZGl0aW9uYWwtPmdldENvbmRpdGlvblR5cGUoKSA9PSBQSFBFeGNlbF9TdHlsZV9Db25kaXRpb25hbDo6Q09ORElUSU9OX0NPTlRBSU5TVEVYVCkKCQkJCQkJCSYmICRjb25kaXRpb25hbC0+Z2V0T3BlcmF0b3JUeXBlKCkgIT0gUEhQRXhjZWxfU3R5bGVfQ29uZGl0aW9uYWw6Ok9QRVJBVE9SX05PTkUpIHsKCQkJCQkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCdvcGVyYXRvcicsCSRjb25kaXRpb25hbC0+Z2V0T3BlcmF0b3JUeXBlKCkpOwoJCQkJCQl9CgoJCQkJCQlpZiAoJGNvbmRpdGlvbmFsLT5nZXRDb25kaXRpb25UeXBlKCkgPT0gUEhQRXhjZWxfU3R5bGVfQ29uZGl0aW9uYWw6OkNPTkRJVElPTl9DT05UQUlOU1RFWFQKCQkJCQkJCSYmICFpc19udWxsKCRjb25kaXRpb25hbC0+Z2V0VGV4dCgpKSkgewoJCQkJCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ3RleHQnLAkkY29uZGl0aW9uYWwtPmdldFRleHQoKSk7CgkJCQkJCX0KCgkJCQkJCWlmICgkY29uZGl0aW9uYWwtPmdldENvbmRpdGlvblR5cGUoKSA9PSBQSFBFeGNlbF9TdHlsZV9Db25kaXRpb25hbDo6Q09ORElUSU9OX0NPTlRBSU5TVEVYVAoJCQkJCQkJJiYgJGNvbmRpdGlvbmFsLT5nZXRPcGVyYXRvclR5cGUoKSA9PSBQSFBFeGNlbF9TdHlsZV9Db25kaXRpb25hbDo6T1BFUkFUT1JfQ09OVEFJTlNURVhUCgkJCQkJCQkmJiAhaXNfbnVsbCgkY29uZGl0aW9uYWwtPmdldFRleHQoKSkpIHsKCQkJCQkJCSRvYmpXcml0ZXItPndyaXRlRWxlbWVudCgnZm9ybXVsYScsCSdOT1QoSVNFUlJPUihTRUFSQ0goIicgLiAkY29uZGl0aW9uYWwtPmdldFRleHQoKSAuICciLCcgLiAkY2VsbENvb3JkaW5hdGUgLiAnKSkpJyk7CgkJCQkJCX0gZWxzZSBpZiAoJGNvbmRpdGlvbmFsLT5nZXRDb25kaXRpb25UeXBlKCkgPT0gUEhQRXhjZWxfU3R5bGVfQ29uZGl0aW9uYWw6OkNPTkRJVElPTl9DT05UQUlOU1RFWFQKCQkJCQkJCSYmICRjb25kaXRpb25hbC0+Z2V0T3BlcmF0b3JUeXBlKCkgPT0gUEhQRXhjZWxfU3R5bGVfQ29uZGl0aW9uYWw6Ok9QRVJBVE9SX0JFR0lOU1dJVEgKCQkJCQkJCSYmICFpc19udWxsKCRjb25kaXRpb25hbC0+Z2V0VGV4dCgpKSkgewoJCQkJCQkJJG9ialdyaXRlci0+d3JpdGVFbGVtZW50KCdmb3JtdWxhJywJJ0xFRlQoJyAuICRjZWxsQ29vcmRpbmF0ZSAuICcsJyAuIHN0cmxlbigkY29uZGl0aW9uYWwtPmdldFRleHQoKSkgLiAnKT0iJyAuICRjb25kaXRpb25hbC0+Z2V0VGV4dCgpIC4gJyInKTsKCQkJCQkJfSBlbHNlIGlmICgkY29uZGl0aW9uYWwtPmdldENvbmRpdGlvblR5cGUoKSA9PSBQSFBFeGNlbF9TdHlsZV9Db25kaXRpb25hbDo6Q09ORElUSU9OX0NPTlRBSU5TVEVYVAoJCQkJCQkJJiYgJGNvbmRpdGlvbmFsLT5nZXRPcGVyYXRvclR5cGUoKSA9PSBQSFBFeGNlbF9TdHlsZV9Db25kaXRpb25hbDo6T1BFUkFUT1JfRU5EU1dJVEgKCQkJCQkJCSYmICFpc19udWxsKCRjb25kaXRpb25hbC0+Z2V0VGV4dCgpKSkgewoJCQkJCQkJJG9ialdyaXRlci0+d3JpdGVFbGVtZW50KCdmb3JtdWxhJywJJ1JJR0hUKCcgLiAkY2VsbENvb3JkaW5hdGUgLiAnLCcgLiBzdHJsZW4oJGNvbmRpdGlvbmFsLT5nZXRUZXh0KCkpIC4gJyk9IicgLiAkY29uZGl0aW9uYWwtPmdldFRleHQoKSAuICciJyk7CgkJCQkJCX0gZWxzZSBpZiAoJGNvbmRpdGlvbmFsLT5nZXRDb25kaXRpb25UeXBlKCkgPT0gUEhQRXhjZWxfU3R5bGVfQ29uZGl0aW9uYWw6OkNPTkRJVElPTl9DT05UQUlOU1RFWFQKCQkJCQkJCSYmICRjb25kaXRpb25hbC0+Z2V0T3BlcmF0b3JUeXBlKCkgPT0gUEhQRXhjZWxfU3R5bGVfQ29uZGl0aW9uYWw6Ok9QRVJBVE9SX05PVENPTlRBSU5TCgkJCQkJCQkmJiAhaXNfbnVsbCgkY29uZGl0aW9uYWwtPmdldFRleHQoKSkpIHsKCQkJCQkJCSRvYmpXcml0ZXItPndyaXRlRWxlbWVudCgnZm9ybXVsYScsCSdJU0VSUk9SKFNFQVJDSCgiJyAuICRjb25kaXRpb25hbC0+Z2V0VGV4dCgpIC4gJyIsJyAuICRjZWxsQ29vcmRpbmF0ZSAuICcpKScpOwoJCQkJCQl9IGVsc2UgaWYgKCRjb25kaXRpb25hbC0+Z2V0Q29uZGl0aW9uVHlwZSgpID09IFBIUEV4Y2VsX1N0eWxlX0NvbmRpdGlvbmFsOjpDT05ESVRJT05fQ0VMTElTCgkJCQkJCQl8fCAkY29uZGl0aW9uYWwtPmdldENvbmRpdGlvblR5cGUoKSA9PSBQSFBFeGNlbF9TdHlsZV9Db25kaXRpb25hbDo6Q09ORElUSU9OX0NPTlRBSU5TVEVYVAoJCQkJCQkJfHwgJGNvbmRpdGlvbmFsLT5nZXRDb25kaXRpb25UeXBlKCkgPT0gUEhQRXhjZWxfU3R5bGVfQ29uZGl0aW9uYWw6OkNPTkRJVElPTl9FWFBSRVNTSU9OKSB7CgkJCQkJCQlmb3JlYWNoICgkY29uZGl0aW9uYWwtPmdldENvbmRpdGlvbnMoKSBhcyAkZm9ybXVsYSkgewoJCQkJCQkJCS8vIEZvcm11bGEKCQkJCQkJCQkkb2JqV3JpdGVyLT53cml0ZUVsZW1lbnQoJ2Zvcm11bGEnLAkkZm9ybXVsYSk7CgkJCQkJCQl9CgkJCQkJCX0KCgkJCQkJCSRvYmpXcml0ZXItPmVuZEVsZW1lbnQoKTsKCgkJCQkJJG9ialdyaXRlci0+ZW5kRWxlbWVudCgpOwoJCQkJfQoJCQl9CgkJfQoJfQoKCS8qKgoJICogV3JpdGUgRGF0YVZhbGlkYXRpb25zCgkgKgoJICogQHBhcmFtCVBIUEV4Y2VsX1NoYXJlZF9YTUxXcml0ZXIJCQkkb2JqV3JpdGVyCQlYTUwgV3JpdGVyCgkgKiBAcGFyYW0JUEhQRXhjZWxfV29ya3NoZWV0CQkJCQkkcFNoZWV0CQkJV29ya3NoZWV0CgkgKiBAdGhyb3dzCUV4Y2VwdGlvbgoJICovCglwcml2YXRlIGZ1bmN0aW9uIF93cml0ZURhdGFWYWxpZGF0aW9ucyhQSFBFeGNlbF9TaGFyZWRfWE1MV3JpdGVyICRvYmpXcml0ZXIgPSBudWxsLCBQSFBFeGNlbF9Xb3Jrc2hlZXQgJHBTaGVldCA9IG51bGwpCgl7CgkJLy8gRGF0YXZhbGlkYXRpb24gY29sbGVjdGlvbgoJCSRkYXRhVmFsaWRhdGlvbkNvbGxlY3Rpb24gPSAkcFNoZWV0LT5nZXREYXRhVmFsaWRhdGlvbkNvbGxlY3Rpb24oKTsKCgkJLy8gV3JpdGUgZGF0YSB2YWxpZGF0aW9ucz8KCQlpZiAoIWVtcHR5KCRkYXRhVmFsaWRhdGlvbkNvbGxlY3Rpb24pKSB7CgkJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgnZGF0YVZhbGlkYXRpb25zJyk7CgkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCdjb3VudCcsIGNvdW50KCRkYXRhVmFsaWRhdGlvbkNvbGxlY3Rpb24pKTsKCgkJCWZvcmVhY2ggKCRkYXRhVmFsaWRhdGlvbkNvbGxlY3Rpb24gYXMgJGNvb3JkaW5hdGUgPT4gJGR2KSB7CgkJCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ2RhdGFWYWxpZGF0aW9uJyk7CgoJCQkJaWYgKCRkdi0+Z2V0VHlwZSgpICE9ICcnKSB7CgkJCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ3R5cGUnLCAkZHYtPmdldFR5cGUoKSk7CgkJCQl9CgoJCQkJaWYgKCRkdi0+Z2V0RXJyb3JTdHlsZSgpICE9ICcnKSB7CgkJCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ2Vycm9yU3R5bGUnLCAkZHYtPmdldEVycm9yU3R5bGUoKSk7CgkJCQl9CgoJCQkJaWYgKCRkdi0+Z2V0T3BlcmF0b3IoKSAhPSAnJykgewoJCQkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCdvcGVyYXRvcicsICRkdi0+Z2V0T3BlcmF0b3IoKSk7CgkJCQl9CgoJCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ2FsbG93QmxhbmsnLAkJKCRkdi0+Z2V0QWxsb3dCbGFuaygpCQk/ICcxJyAgOiAnMCcpKTsKCQkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCdzaG93RHJvcERvd24nLAkJKCEkZHYtPmdldFNob3dEcm9wRG93bigpCT8gJzEnICA6ICcwJykpOwoJCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ3Nob3dJbnB1dE1lc3NhZ2UnLAkoJGR2LT5nZXRTaG93SW5wdXRNZXNzYWdlKCkJPyAnMScgIDogJzAnKSk7CgkJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgnc2hvd0Vycm9yTWVzc2FnZScsCSgkZHYtPmdldFNob3dFcnJvck1lc3NhZ2UoKQk/ICcxJyAgOiAnMCcpKTsKCgkJCQlpZiAoJGR2LT5nZXRFcnJvclRpdGxlKCkgIT09ICcnKSB7CgkJCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ2Vycm9yVGl0bGUnLCAkZHYtPmdldEVycm9yVGl0bGUoKSk7CgkJCQl9CgkJCQlpZiAoJGR2LT5nZXRFcnJvcigpICE9PSAnJykgewoJCQkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCdlcnJvcicsICRkdi0+Z2V0RXJyb3IoKSk7CgkJCQl9CgkJCQlpZiAoJGR2LT5nZXRQcm9tcHRUaXRsZSgpICE9PSAnJykgewoJCQkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCdwcm9tcHRUaXRsZScsICRkdi0+Z2V0UHJvbXB0VGl0bGUoKSk7CgkJCQl9CgkJCQlpZiAoJGR2LT5nZXRQcm9tcHQoKSAhPT0gJycpIHsKCQkJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgncHJvbXB0JywgJGR2LT5nZXRQcm9tcHQoKSk7CgkJCQl9CgoJCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ3NxcmVmJywgJGNvb3JkaW5hdGUpOwoKCQkJCWlmICgkZHYtPmdldEZvcm11bGExKCkgIT09ICcnKSB7CgkJCQkJJG9ialdyaXRlci0+d3JpdGVFbGVtZW50KCdmb3JtdWxhMScsICRkdi0+Z2V0Rm9ybXVsYTEoKSk7CgkJCQl9CgkJCQlpZiAoJGR2LT5nZXRGb3JtdWxhMigpICE9PSAnJykgewoJCQkJCSRvYmpXcml0ZXItPndyaXRlRWxlbWVudCgnZm9ybXVsYTInLCAkZHYtPmdldEZvcm11bGEyKCkpOwoJCQkJfQoKCQkJCSRvYmpXcml0ZXItPmVuZEVsZW1lbnQoKTsKCQkJfQoKCQkJJG9ialdyaXRlci0+ZW5kRWxlbWVudCgpOwoJCX0KCX0KCgkvKioKCSAqIFdyaXRlIEh5cGVybGlua3MKCSAqCgkgKiBAcGFyYW0JUEhQRXhjZWxfU2hhcmVkX1hNTFdyaXRlcgkJCSRvYmpXcml0ZXIJCVhNTCBXcml0ZXIKCSAqIEBwYXJhbQlQSFBFeGNlbF9Xb3Jrc2hlZXQJCQkJCSRwU2hlZXQJCQlXb3Jrc2hlZXQKCSAqIEB0aHJvd3MJRXhjZXB0aW9uCgkgKi8KCXByaXZhdGUgZnVuY3Rpb24gX3dyaXRlSHlwZXJsaW5rcyhQSFBFeGNlbF9TaGFyZWRfWE1MV3JpdGVyICRvYmpXcml0ZXIgPSBudWxsLCBQSFBFeGNlbF9Xb3Jrc2hlZXQgJHBTaGVldCA9IG51bGwpCgl7CgkJLy8gSHlwZXJsaW5rIGNvbGxlY3Rpb24KCQkkaHlwZXJsaW5rQ29sbGVjdGlvbiA9ICRwU2hlZXQtPmdldEh5cGVybGlua0NvbGxlY3Rpb24oKTsKCgkJLy8gUmVsYXRpb24gSUQKCQkkcmVsYXRpb25JZCA9IDE7CgoJCS8vIFdyaXRlIGh5cGVybGlua3M/CgkJaWYgKCFlbXB0eSgkaHlwZXJsaW5rQ29sbGVjdGlvbikpIHsKCQkJJG9ialdyaXRlci0+c3RhcnRFbGVtZW50KCdoeXBlcmxpbmtzJyk7CgoJCQlmb3JlYWNoICgkaHlwZXJsaW5rQ29sbGVjdGlvbiBhcyAkY29vcmRpbmF0ZSA9PiAkaHlwZXJsaW5rKSB7CgkJCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ2h5cGVybGluaycpOwoKCQkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCdyZWYnLCAkY29vcmRpbmF0ZSk7CgkJCQlpZiAoISRoeXBlcmxpbmstPmlzSW50ZXJuYWwoKSkgewoJCQkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCdyOmlkJywJJ3JJZF9oeXBlcmxpbmtfJyAuICRyZWxhdGlvbklkKTsKCQkJCQkrKyRyZWxhdGlvbklkOwoJCQkJfSBlbHNlIHsKCQkJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgnbG9jYXRpb24nLAlzdHJfcmVwbGFjZSgnc2hlZXQ6Ly8nLCAnJywgJGh5cGVybGluay0+Z2V0VXJsKCkpKTsKCQkJCX0KCgkJCQlpZiAoJGh5cGVybGluay0+Z2V0VG9vbHRpcCgpICE9ICcnKSB7CgkJCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ3Rvb2x0aXAnLCAkaHlwZXJsaW5rLT5nZXRUb29sdGlwKCkpOwoJCQkJfQoKCQkJCSRvYmpXcml0ZXItPmVuZEVsZW1lbnQoKTsKCQkJfQoKCQkJJG9ialdyaXRlci0+ZW5kRWxlbWVudCgpOwoJCX0KCX0KCgkvKioKCSAqIFdyaXRlIFByb3RlY3RlZFJhbmdlcwoJICoKCSAqIEBwYXJhbQlQSFBFeGNlbF9TaGFyZWRfWE1MV3JpdGVyCQkJJG9ialdyaXRlcgkJWE1MIFdyaXRlcgoJICogQHBhcmFtCVBIUEV4Y2VsX1dvcmtzaGVldAkJCQkJJHBTaGVldAkJCVdvcmtzaGVldAoJICogQHRocm93cwlFeGNlcHRpb24KCSAqLwoJcHJpdmF0ZSBmdW5jdGlvbiBfd3JpdGVQcm90ZWN0ZWRSYW5nZXMoUEhQRXhjZWxfU2hhcmVkX1hNTFdyaXRlciAkb2JqV3JpdGVyID0gbnVsbCwgUEhQRXhjZWxfV29ya3NoZWV0ICRwU2hlZXQgPSBudWxsKQoJewoJCWlmIChjb3VudCgkcFNoZWV0LT5nZXRQcm90ZWN0ZWRDZWxscygpKSA+IDApIHsKCQkJLy8gcHJvdGVjdGVkUmFuZ2VzCgkJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgncHJvdGVjdGVkUmFuZ2VzJyk7CgoJCQkJLy8gTG9vcCBwcm90ZWN0ZWRSYW5nZXMKCQkJCWZvcmVhY2ggKCRwU2hlZXQtPmdldFByb3RlY3RlZENlbGxzKCkgYXMgJHByb3RlY3RlZENlbGwgPT4gJHBhc3N3b3JkSGFzaCkgewoJCQkJCS8vIHByb3RlY3RlZFJhbmdlCgkJCQkJJG9ialdyaXRlci0+c3RhcnRFbGVtZW50KCdwcm90ZWN0ZWRSYW5nZScpOwoJCQkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCduYW1lJywJCSdwJyAuIG1kNSgkcHJvdGVjdGVkQ2VsbCkpOwoJCQkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCdzcXJlZicsCSRwcm90ZWN0ZWRDZWxsKTsKCQkJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgncGFzc3dvcmQnLAkkcGFzc3dvcmRIYXNoKTsKCQkJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgkJCQl9CgoJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgkJfQoJfQoKCS8qKgoJICogV3JpdGUgTWVyZ2VDZWxscwoJICoKCSAqIEBwYXJhbQlQSFBFeGNlbF9TaGFyZWRfWE1MV3JpdGVyCQkJJG9ialdyaXRlcgkJWE1MIFdyaXRlcgoJICogQHBhcmFtCVBIUEV4Y2VsX1dvcmtzaGVldAkJCQkJJHBTaGVldAkJCVdvcmtzaGVldAoJICogQHRocm93cwlFeGNlcHRpb24KCSAqLwoJcHJpdmF0ZSBmdW5jdGlvbiBfd3JpdGVNZXJnZUNlbGxzKFBIUEV4Y2VsX1NoYXJlZF9YTUxXcml0ZXIgJG9ialdyaXRlciA9IG51bGwsIFBIUEV4Y2VsX1dvcmtzaGVldCAkcFNoZWV0ID0gbnVsbCkKCXsKCQlpZiAoY291bnQoJHBTaGVldC0+Z2V0TWVyZ2VDZWxscygpKSA+IDApIHsKCQkJLy8gbWVyZ2VDZWxscwoJCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ21lcmdlQ2VsbHMnKTsKCgkJCQkvLyBMb29wIG1lcmdlQ2VsbHMKCQkJCWZvcmVhY2ggKCRwU2hlZXQtPmdldE1lcmdlQ2VsbHMoKSBhcyAkbWVyZ2VDZWxsKSB7CgkJCQkJLy8gbWVyZ2VDZWxsCgkJCQkJJG9ialdyaXRlci0+c3RhcnRFbGVtZW50KCdtZXJnZUNlbGwnKTsKCQkJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgncmVmJywgJG1lcmdlQ2VsbCk7CgkJCQkJJG9ialdyaXRlci0+ZW5kRWxlbWVudCgpOwoJCQkJfQoKCQkJJG9ialdyaXRlci0+ZW5kRWxlbWVudCgpOwoJCX0KCX0KCgkvKioKCSAqIFdyaXRlIFByaW50T3B0aW9ucwoJICoKCSAqIEBwYXJhbQlQSFBFeGNlbF9TaGFyZWRfWE1MV3JpdGVyCQkJJG9ialdyaXRlcgkJWE1MIFdyaXRlcgoJICogQHBhcmFtCVBIUEV4Y2VsX1dvcmtzaGVldAkJCQkJJHBTaGVldAkJCVdvcmtzaGVldAoJICogQHRocm93cwlFeGNlcHRpb24KCSAqLwoJcHJpdmF0ZSBmdW5jdGlvbiBfd3JpdGVQcmludE9wdGlvbnMoUEhQRXhjZWxfU2hhcmVkX1hNTFdyaXRlciAkb2JqV3JpdGVyID0gbnVsbCwgUEhQRXhjZWxfV29ya3NoZWV0ICRwU2hlZXQgPSBudWxsKQoJewoJCS8vIHByaW50T3B0aW9ucwoJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgncHJpbnRPcHRpb25zJyk7CgoJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCdncmlkTGluZXMnLAkoJHBTaGVldC0+Z2V0UHJpbnRHcmlkbGluZXMoKSA/ICd0cnVlJzogJ2ZhbHNlJykpOwoJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCdncmlkTGluZXNTZXQnLAkndHJ1ZScpOwoKCQlpZiAoJHBTaGVldC0+Z2V0UGFnZVNldHVwKCktPmdldEhvcml6b250YWxDZW50ZXJlZCgpKSB7CgkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCdob3Jpem9udGFsQ2VudGVyZWQnLCAndHJ1ZScpOwoJCX0KCgkJaWYgKCRwU2hlZXQtPmdldFBhZ2VTZXR1cCgpLT5nZXRWZXJ0aWNhbENlbnRlcmVkKCkpIHsKCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ3ZlcnRpY2FsQ2VudGVyZWQnLCAndHJ1ZScpOwoJCX0KCgkJJG9ialdyaXRlci0+ZW5kRWxlbWVudCgpOwoJfQoKCS8qKgoJICogV3JpdGUgUGFnZU1hcmdpbnMKCSAqCgkgKiBAcGFyYW0JUEhQRXhjZWxfU2hhcmVkX1hNTFdyaXRlcgkJCQkkb2JqV3JpdGVyCQlYTUwgV3JpdGVyCgkgKiBAcGFyYW0JUEhQRXhjZWxfV29ya3NoZWV0CQkJCQkJJHBTaGVldAkJCVdvcmtzaGVldAoJICogQHRocm93cwlFeGNlcHRpb24KCSAqLwoJcHJpdmF0ZSBmdW5jdGlvbiBfd3JpdGVQYWdlTWFyZ2lucyhQSFBFeGNlbF9TaGFyZWRfWE1MV3JpdGVyICRvYmpXcml0ZXIgPSBudWxsLCBQSFBFeGNlbF9Xb3Jrc2hlZXQgJHBTaGVldCA9IG51bGwpCgl7CgkJLy8gcGFnZU1hcmdpbnMKCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ3BhZ2VNYXJnaW5zJyk7CgkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ2xlZnQnLAkJUEhQRXhjZWxfU2hhcmVkX1N0cmluZzo6Rm9ybWF0TnVtYmVyKCRwU2hlZXQtPmdldFBhZ2VNYXJnaW5zKCktPmdldExlZnQoKSkpOwoJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCdyaWdodCcsCQlQSFBFeGNlbF9TaGFyZWRfU3RyaW5nOjpGb3JtYXROdW1iZXIoJHBTaGVldC0+Z2V0UGFnZU1hcmdpbnMoKS0+Z2V0UmlnaHQoKSkpOwoJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCd0b3AnLAkJUEhQRXhjZWxfU2hhcmVkX1N0cmluZzo6Rm9ybWF0TnVtYmVyKCRwU2hlZXQtPmdldFBhZ2VNYXJnaW5zKCktPmdldFRvcCgpKSk7CgkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ2JvdHRvbScsCVBIUEV4Y2VsX1NoYXJlZF9TdHJpbmc6OkZvcm1hdE51bWJlcigkcFNoZWV0LT5nZXRQYWdlTWFyZ2lucygpLT5nZXRCb3R0b20oKSkpOwoJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCdoZWFkZXInLAlQSFBFeGNlbF9TaGFyZWRfU3RyaW5nOjpGb3JtYXROdW1iZXIoJHBTaGVldC0+Z2V0UGFnZU1hcmdpbnMoKS0+Z2V0SGVhZGVyKCkpKTsKCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgnZm9vdGVyJywJUEhQRXhjZWxfU2hhcmVkX1N0cmluZzo6Rm9ybWF0TnVtYmVyKCRwU2hlZXQtPmdldFBhZ2VNYXJnaW5zKCktPmdldEZvb3RlcigpKSk7CgkJJG9ialdyaXRlci0+ZW5kRWxlbWVudCgpOwoJfQoKCS8qKgoJICogV3JpdGUgQXV0b0ZpbHRlcgoJICoKCSAqIEBwYXJhbQlQSFBFeGNlbF9TaGFyZWRfWE1MV3JpdGVyCQkJCSRvYmpXcml0ZXIJCVhNTCBXcml0ZXIKCSAqIEBwYXJhbQlQSFBFeGNlbF9Xb3Jrc2hlZXQJCQkJCQkkcFNoZWV0CQkJV29ya3NoZWV0CgkgKiBAdGhyb3dzCUV4Y2VwdGlvbgoJICovCglwcml2YXRlIGZ1bmN0aW9uIF93cml0ZUF1dG9GaWx0ZXIoUEhQRXhjZWxfU2hhcmVkX1hNTFdyaXRlciAkb2JqV3JpdGVyID0gbnVsbCwgUEhQRXhjZWxfV29ya3NoZWV0ICRwU2hlZXQgPSBudWxsKQoJewoJCWlmICgkcFNoZWV0LT5nZXRBdXRvRmlsdGVyKCkgIT0gJycpIHsKCQkJLy8gYXV0b0ZpbHRlcgoJCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ2F1dG9GaWx0ZXInKTsKCgkJCS8vIFN0cmlwIGFueSB3b3Jrc2hlZXQgcmVmZXJlbmNlIGZyb20gdGhlIGZpbHRlciBjb29yZGluYXRlcwoJCQkkcmFuZ2UgPSBQSFBFeGNlbF9DZWxsOjpzcGxpdFJhbmdlKCRwU2hlZXQtPmdldEF1dG9GaWx0ZXIoKSk7CgkJCSRyYW5nZSA9ICRyYW5nZVswXTsKCQkJLy8JU3RyaXAgYW55IHdvcmtzaGVldCByZWYKCQkJaWYgKHN0cnBvcygkcmFuZ2VbMF0sJyEnKSAhPT0gZmFsc2UpIHsKCQkJCWxpc3QoJHdzLCRyYW5nZVswXSkgPSBleHBsb2RlKCchJywkcmFuZ2VbMF0pOwoJCQl9CgkJCSRyYW5nZSA9IGltcGxvZGUoJzonLCAkcmFuZ2UpOwoKCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ3JlZicsCXN0cl9yZXBsYWNlKCckJywnJywkcmFuZ2UpKTsKCQkJJG9ialdyaXRlci0+ZW5kRWxlbWVudCgpOwoJCX0KCX0KCgkvKioKCSAqIFdyaXRlIFBhZ2VTZXR1cAoJICoKCSAqIEBwYXJhbQlQSFBFeGNlbF9TaGFyZWRfWE1MV3JpdGVyCQkJJG9ialdyaXRlcgkJWE1MIFdyaXRlcgoJICogQHBhcmFtCVBIUEV4Y2VsX1dvcmtzaGVldAkJCQkJJHBTaGVldAkJCVdvcmtzaGVldAoJICogQHRocm93cwlFeGNlcHRpb24KCSAqLwoJcHJpdmF0ZSBmdW5jdGlvbiBfd3JpdGVQYWdlU2V0dXAoUEhQRXhjZWxfU2hhcmVkX1hNTFdyaXRlciAkb2JqV3JpdGVyID0gbnVsbCwgUEhQRXhjZWxfV29ya3NoZWV0ICRwU2hlZXQgPSBudWxsKQoJewoJCS8vIHBhZ2VTZXR1cAoJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgncGFnZVNldHVwJyk7CgkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ3BhcGVyU2l6ZScsCQkkcFNoZWV0LT5nZXRQYWdlU2V0dXAoKS0+Z2V0UGFwZXJTaXplKCkpOwoJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCdvcmllbnRhdGlvbicsCSRwU2hlZXQtPmdldFBhZ2VTZXR1cCgpLT5nZXRPcmllbnRhdGlvbigpKTsKCgkJaWYgKCFpc19udWxsKCRwU2hlZXQtPmdldFBhZ2VTZXR1cCgpLT5nZXRTY2FsZSgpKSkgewoJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgnc2NhbGUnLAkJCQkgJHBTaGVldC0+Z2V0UGFnZVNldHVwKCktPmdldFNjYWxlKCkpOwoJCX0KCQlpZiAoIWlzX251bGwoJHBTaGVldC0+Z2V0UGFnZVNldHVwKCktPmdldEZpdFRvSGVpZ2h0KCkpKSB7CgkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCdmaXRUb0hlaWdodCcsCQkgJHBTaGVldC0+Z2V0UGFnZVNldHVwKCktPmdldEZpdFRvSGVpZ2h0KCkpOwoJCX0gZWxzZSB7CgkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCdmaXRUb0hlaWdodCcsCQkgJzAnKTsKCQl9CgkJaWYgKCFpc19udWxsKCRwU2hlZXQtPmdldFBhZ2VTZXR1cCgpLT5nZXRGaXRUb1dpZHRoKCkpKSB7CgkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCdmaXRUb1dpZHRoJywJCSAkcFNoZWV0LT5nZXRQYWdlU2V0dXAoKS0+Z2V0Rml0VG9XaWR0aCgpKTsKCQl9IGVsc2UgewoJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgnZml0VG9XaWR0aCcsCQkgJzAnKTsKCQl9CgkJaWYgKCFpc19udWxsKCRwU2hlZXQtPmdldFBhZ2VTZXR1cCgpLT5nZXRGaXJzdFBhZ2VOdW1iZXIoKSkpIHsKCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ2ZpcnN0UGFnZU51bWJlcicsCSRwU2hlZXQtPmdldFBhZ2VTZXR1cCgpLT5nZXRGaXJzdFBhZ2VOdW1iZXIoKSk7CgkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCd1c2VGaXJzdFBhZ2VOdW1iZXInLCAnMScpOwoJCX0KCgkJJG9ialdyaXRlci0+ZW5kRWxlbWVudCgpOwoJfQoKCS8qKgoJICogV3JpdGUgSGVhZGVyIC8gRm9vdGVyCgkgKgoJICogQHBhcmFtCVBIUEV4Y2VsX1NoYXJlZF9YTUxXcml0ZXIJCSRvYmpXcml0ZXIJCVhNTCBXcml0ZXIKCSAqIEBwYXJhbQlQSFBFeGNlbF9Xb3Jrc2hlZXQJCQkJJHBTaGVldAkJCVdvcmtzaGVldAoJICogQHRocm93cwlFeGNlcHRpb24KCSAqLwoJcHJpdmF0ZSBmdW5jdGlvbiBfd3JpdGVIZWFkZXJGb290ZXIoUEhQRXhjZWxfU2hhcmVkX1hNTFdyaXRlciAkb2JqV3JpdGVyID0gbnVsbCwgUEhQRXhjZWxfV29ya3NoZWV0ICRwU2hlZXQgPSBudWxsKQoJewoJCS8vIGhlYWRlckZvb3RlcgoJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgnaGVhZGVyRm9vdGVyJyk7CgkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ2RpZmZlcmVudE9kZEV2ZW4nLAkoJHBTaGVldC0+Z2V0SGVhZGVyRm9vdGVyKCktPmdldERpZmZlcmVudE9kZEV2ZW4oKSA/ICd0cnVlJyA6ICdmYWxzZScpKTsKCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgnZGlmZmVyZW50Rmlyc3QnLAkoJHBTaGVldC0+Z2V0SGVhZGVyRm9vdGVyKCktPmdldERpZmZlcmVudEZpcnN0KCkgPyAndHJ1ZScgOiAnZmFsc2UnKSk7CgkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ3NjYWxlV2l0aERvYycsCQkoJHBTaGVldC0+Z2V0SGVhZGVyRm9vdGVyKCktPmdldFNjYWxlV2l0aERvY3VtZW50KCkgPyAndHJ1ZScgOiAnZmFsc2UnKSk7CgkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ2FsaWduV2l0aE1hcmdpbnMnLAkoJHBTaGVldC0+Z2V0SGVhZGVyRm9vdGVyKCktPmdldEFsaWduV2l0aE1hcmdpbnMoKSA/ICd0cnVlJyA6ICdmYWxzZScpKTsKCgkJCSRvYmpXcml0ZXItPndyaXRlRWxlbWVudCgnb2RkSGVhZGVyJywJCSRwU2hlZXQtPmdldEhlYWRlckZvb3RlcigpLT5nZXRPZGRIZWFkZXIoKSk7CgkJCSRvYmpXcml0ZXItPndyaXRlRWxlbWVudCgnb2RkRm9vdGVyJywJCSRwU2hlZXQtPmdldEhlYWRlckZvb3RlcigpLT5nZXRPZGRGb290ZXIoKSk7CgkJCSRvYmpXcml0ZXItPndyaXRlRWxlbWVudCgnZXZlbkhlYWRlcicsCQkkcFNoZWV0LT5nZXRIZWFkZXJGb290ZXIoKS0+Z2V0RXZlbkhlYWRlcigpKTsKCQkJJG9ialdyaXRlci0+d3JpdGVFbGVtZW50KCdldmVuRm9vdGVyJywJCSRwU2hlZXQtPmdldEhlYWRlckZvb3RlcigpLT5nZXRFdmVuRm9vdGVyKCkpOwoJCQkkb2JqV3JpdGVyLT53cml0ZUVsZW1lbnQoJ2ZpcnN0SGVhZGVyJywJJHBTaGVldC0+Z2V0SGVhZGVyRm9vdGVyKCktPmdldEZpcnN0SGVhZGVyKCkpOwoJCQkkb2JqV3JpdGVyLT53cml0ZUVsZW1lbnQoJ2ZpcnN0Rm9vdGVyJywJJHBTaGVldC0+Z2V0SGVhZGVyRm9vdGVyKCktPmdldEZpcnN0Rm9vdGVyKCkpOwoJCSRvYmpXcml0ZXItPmVuZEVsZW1lbnQoKTsKCX0KCgkvKioKCSAqIFdyaXRlIEJyZWFrcwoJICoKCSAqIEBwYXJhbQlQSFBFeGNlbF9TaGFyZWRfWE1MV3JpdGVyCQkkb2JqV3JpdGVyCQlYTUwgV3JpdGVyCgkgKiBAcGFyYW0JUEhQRXhjZWxfV29ya3NoZWV0CQkJCSRwU2hlZXQJCQlXb3Jrc2hlZXQKCSAqIEB0aHJvd3MJRXhjZXB0aW9uCgkgKi8KCXByaXZhdGUgZnVuY3Rpb24gX3dyaXRlQnJlYWtzKFBIUEV4Y2VsX1NoYXJlZF9YTUxXcml0ZXIgJG9ialdyaXRlciA9IG51bGwsIFBIUEV4Y2VsX1dvcmtzaGVldCAkcFNoZWV0ID0gbnVsbCkKCXsKCQkvLyBHZXQgcm93IGFuZCBjb2x1bW4gYnJlYWtzCgkJJGFSb3dCcmVha3MgPSBhcnJheSgpOwoJCSRhQ29sdW1uQnJlYWtzID0gYXJyYXkoKTsKCQlmb3JlYWNoICgkcFNoZWV0LT5nZXRCcmVha3MoKSBhcyAkY2VsbCA9PiAkYnJlYWtUeXBlKSB7CgkJCWlmICgkYnJlYWtUeXBlID09IFBIUEV4Y2VsX1dvcmtzaGVldDo6QlJFQUtfUk9XKSB7CgkJCQkkYVJvd0JyZWFrc1tdID0gJGNlbGw7CgkJCX0gZWxzZSBpZiAoJGJyZWFrVHlwZSA9PSBQSFBFeGNlbF9Xb3Jrc2hlZXQ6OkJSRUFLX0NPTFVNTikgewoJCQkJJGFDb2x1bW5CcmVha3NbXSA9ICRjZWxsOwoJCQl9CgkJfQoKCQkvLyByb3dCcmVha3MKCQlpZiAoIWVtcHR5KCRhUm93QnJlYWtzKSkgewoJCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ3Jvd0JyZWFrcycpOwoJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgnY291bnQnLAkJCWNvdW50KCRhUm93QnJlYWtzKSk7CgkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCdtYW51YWxCcmVha0NvdW50JywJY291bnQoJGFSb3dCcmVha3MpKTsKCgkJCQlmb3JlYWNoICgkYVJvd0JyZWFrcyBhcyAkY2VsbCkgewoJCQkJCSRjb29yZHMgPSBQSFBFeGNlbF9DZWxsOjpjb29yZGluYXRlRnJvbVN0cmluZygkY2VsbCk7CgoJCQkJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgnYnJrJyk7CgkJCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ2lkJywJJGNvb3Jkc1sxXSk7CgkJCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ21hbicsCScxJyk7CgkJCQkJJG9ialdyaXRlci0+ZW5kRWxlbWVudCgpOwoJCQkJfQoKCQkJJG9ialdyaXRlci0+ZW5kRWxlbWVudCgpOwoJCX0KCgkJLy8gU2Vjb25kLCB3cml0ZSBjb2x1bW4gYnJlYWtzCgkJaWYgKCFlbXB0eSgkYUNvbHVtbkJyZWFrcykpIHsKCQkJJG9ialdyaXRlci0+c3RhcnRFbGVtZW50KCdjb2xCcmVha3MnKTsKCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ2NvdW50JywJCQljb3VudCgkYUNvbHVtbkJyZWFrcykpOwoJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgnbWFudWFsQnJlYWtDb3VudCcsCWNvdW50KCRhQ29sdW1uQnJlYWtzKSk7CgoJCQkJZm9yZWFjaCAoJGFDb2x1bW5CcmVha3MgYXMgJGNlbGwpIHsKCQkJCQkkY29vcmRzID0gUEhQRXhjZWxfQ2VsbDo6Y29vcmRpbmF0ZUZyb21TdHJpbmcoJGNlbGwpOwoKCQkJCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ2JyaycpOwoJCQkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCdpZCcsCVBIUEV4Y2VsX0NlbGw6OmNvbHVtbkluZGV4RnJvbVN0cmluZygkY29vcmRzWzBdKSAtIDEpOwoJCQkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCdtYW4nLAknMScpOwoJCQkJCSRvYmpXcml0ZXItPmVuZEVsZW1lbnQoKTsKCQkJCX0KCgkJCSRvYmpXcml0ZXItPmVuZEVsZW1lbnQoKTsKCQl9Cgl9CgoJLyoqCgkgKiBXcml0ZSBTaGVldERhdGEKCSAqCgkgKiBAcGFyYW0JUEhQRXhjZWxfU2hhcmVkX1hNTFdyaXRlcgkJJG9ialdyaXRlcgkJWE1MIFdyaXRlcgoJICogQHBhcmFtCVBIUEV4Y2VsX1dvcmtzaGVldAkJCQkkcFNoZWV0CQkJV29ya3NoZWV0CgkgKiBAcGFyYW0Jc3RyaW5nW10JCQkJCQkkcFN0cmluZ1RhYmxlCVN0cmluZyB0YWJsZQoJICogQHRocm93cwlFeGNlcHRpb24KCSAqLwoJcHJpdmF0ZSBmdW5jdGlvbiBfd3JpdGVTaGVldERhdGEoUEhQRXhjZWxfU2hhcmVkX1hNTFdyaXRlciAkb2JqV3JpdGVyID0gbnVsbCwgUEhQRXhjZWxfV29ya3NoZWV0ICRwU2hlZXQgPSBudWxsLCAkcFN0cmluZ1RhYmxlID0gbnVsbCkKCXsKCQlpZiAoaXNfYXJyYXkoJHBTdHJpbmdUYWJsZSkpIHsKCQkJLy8gRmxpcHBlZCBzdHJpbmd0YWJsZSwgZm9yIGZhc3RlciBpbmRleCBzZWFyY2hpbmcKCQkJJGFGbGlwcGVkU3RyaW5nVGFibGUgPSAkdGhpcy0+Z2V0UGFyZW50V3JpdGVyKCktPmdldFdyaXRlclBhcnQoJ3N0cmluZ3RhYmxlJyktPmZsaXBTdHJpbmdUYWJsZSgkcFN0cmluZ1RhYmxlKTsKCgkJCS8vIHNoZWV0RGF0YQoJCQkkb2JqV3JpdGVyLT5zdGFydEVsZW1lbnQoJ3NoZWV0RGF0YScpOwoKCQkJCS8vIEdldCBjb2x1bW4gY291bnQKCQkJCSRjb2xDb3VudCA9IFBIUEV4Y2VsX0NlbGw6OmNvbHVtbkluZGV4RnJvbVN0cmluZygkcFNoZWV0LT5nZXRIaWdoZXN0Q29sdW1uKCkpOwoKCQkJCS8vIEhpZ2hlc3Qgcm93IG51bWJlcgoJCQkJJGhpZ2hlc3RSb3cgPSAkcFNoZWV0LT5nZXRIaWdoZXN0Um93KCk7CgoJCQkJLy8gTG9vcCB0aHJvdWdoIGNlbGxzCgkJCQkkY2VsbHNCeVJvdyA9IGFycmF5KCk7CgkJCQlmb3JlYWNoICgkcFNoZWV0LT5nZXRDZWxsQ29sbGVjdGlvbigpIGFzICRjZWxsSUQpIHsKCQkJCQkkY2VsbEFkZHJlc3MgPSBQSFBFeGNlbF9DZWxsOjpjb29yZGluYXRlRnJvbVN0cmluZygkY2VsbElEKTsKCQkJCQkkY2VsbHNCeVJvd1skY2VsbEFkZHJlc3NbMV1dW10gPSAkY2VsbElEOwoJCQkJfQoKCQkJCSRjdXJyZW50Um93ID0gMDsKCQkJCXdoaWxlKCRjdXJyZW50Um93KysgPCAkaGlnaGVzdFJvdykgewoJCQkJCS8vIEdldCByb3cgZGltZW5zaW9uCgkJCQkJJHJvd0RpbWVuc2lvbiA9ICRwU2hlZXQtPmdldFJvd0RpbWVuc2lvbigkY3VycmVudFJvdyk7CgoJCQkJCS8vIFdyaXRlIGN1cnJlbnQgcm93PwoJCQkJCSR3cml0ZUN1cnJlbnRSb3cgPQlpc3NldCgkY2VsbHNCeVJvd1skY3VycmVudFJvd10pIHx8CgkJCQkJCQkJCQkkcm93RGltZW5zaW9uLT5nZXRSb3dIZWlnaHQoKSA+PSAwIHx8CgkJCQkJCQkJCQkkcm93RGltZW5zaW9uLT5nZXRWaXNpYmxlKCkgPT0gZmFsc2UgfHwKCQkJCQkJCQkJCSRyb3dEaW1lbnNpb24tPmdldENvbGxhcHNlZCgpID09IHRydWUgfHwKCQkJCQkJCQkJCSRyb3dEaW1lbnNpb24tPmdldE91dGxpbmVMZXZlbCgpID4gMCB8fAoJCQkJCQkJCQkJJHJvd0RpbWVuc2lvbi0+Z2V0WGZJbmRleCgpICE9PSBudWxsOwoKCQkJCQlpZiAoJHdyaXRlQ3VycmVudFJvdykgewoJCQkJCQkvLyBTdGFydCBhIG5ldyByb3cKCQkJCQkJJG9ialdyaXRlci0+c3RhcnRFbGVtZW50KCdyb3cnKTsKCQkJCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ3InLAkkY3VycmVudFJvdyk7CgkJCQkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCdzcGFucycsCScxOicgLiAkY29sQ291bnQpOwoKCQkJCQkJLy8gUm93IGRpbWVuc2lvbnMKCQkJCQkJaWYgKCRyb3dEaW1lbnNpb24tPmdldFJvd0hlaWdodCgpID49IDApIHsKCQkJCQkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCdjdXN0b21IZWlnaHQnLAknMScpOwoJCQkJCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ2h0JywJCQlQSFBFeGNlbF9TaGFyZWRfU3RyaW5nOjpGb3JtYXROdW1iZXIoJHJvd0RpbWVuc2lvbi0+Z2V0Um93SGVpZ2h0KCkpKTsKCQkJCQkJfQoKCQkJCQkJLy8gUm93IHZpc2liaWxpdHkKCQkJCQkJaWYgKCRyb3dEaW1lbnNpb24tPmdldFZpc2libGUoKSA9PSBmYWxzZSkgewoJCQkJCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ2hpZGRlbicsCQkndHJ1ZScpOwoJCQkJCQl9CgoJCQkJCQkvLyBDb2xsYXBzZWQKCQkJCQkJaWYgKCRyb3dEaW1lbnNpb24tPmdldENvbGxhcHNlZCgpID09IHRydWUpIHsKCQkJCQkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCdjb2xsYXBzZWQnLAkJJ3RydWUnKTsKCQkJCQkJfQoKCQkJCQkJLy8gT3V0bGluZSBsZXZlbAoJCQkJCQlpZiAoJHJvd0RpbWVuc2lvbi0+Z2V0T3V0bGluZUxldmVsKCkgPiAwKSB7CgkJCQkJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgnb3V0bGluZUxldmVsJywJJHJvd0RpbWVuc2lvbi0+Z2V0T3V0bGluZUxldmVsKCkpOwoJCQkJCQl9CgoJCQkJCQkvLyBTdHlsZQoJCQkJCQlpZiAoJHJvd0RpbWVuc2lvbi0+Z2V0WGZJbmRleCgpICE9PSBudWxsKSB7CgkJCQkJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgncycsCSRyb3dEaW1lbnNpb24tPmdldFhmSW5kZXgoKSk7CgkJCQkJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgnY3VzdG9tRm9ybWF0JywgJzEnKTsKCQkJCQkJfQoKCQkJCQkJLy8gV3JpdGUgY2VsbHMKCQkJCQkJaWYgKGlzc2V0KCRjZWxsc0J5Um93WyRjdXJyZW50Um93XSkpIHsKCQkJCQkJCWZvcmVhY2goJGNlbGxzQnlSb3dbJGN1cnJlbnRSb3ddIGFzICRjZWxsQWRkcmVzcykgewoJCQkJCQkJCS8vIFdyaXRlIGNlbGwKCQkJCQkJCQkkdGhpcy0+X3dyaXRlQ2VsbCgkb2JqV3JpdGVyLCAkcFNoZWV0LCAkY2VsbEFkZHJlc3MsICRwU3RyaW5nVGFibGUsICRhRmxpcHBlZFN0cmluZ1RhYmxlKTsKCQkJCQkJCX0KCQkJCQkJfQoKCQkJCQkJLy8gRW5kIHJvdwoJCQkJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgkJCQkJfQoJCQkJfQoKCQkJJG9ialdyaXRlci0+ZW5kRWxlbWVudCgpOwoJCX0gZWxzZSB7CgkJCXRocm93IG5ldyBFeGNlcHRpb24oIkludmFsaWQgcGFyYW1ldGVycyBwYXNzZWQuIik7CgkJfQoJfQoKCS8qKgoJICogV3JpdGUgQ2VsbAoJICoKCSAqIEBwYXJhbQlQSFBFeGNlbF9TaGFyZWRfWE1MV3JpdGVyCSRvYmpXcml0ZXIJCQkJWE1MIFdyaXRlcgoJICogQHBhcmFtCVBIUEV4Y2VsX1dvcmtzaGVldAkJCSRwU2hlZXQJCQkJCVdvcmtzaGVldAoJICogQHBhcmFtCVBIUEV4Y2VsX0NlbGwJCQkJJHBDZWxsQWRkcmVzcwkJCUNlbGwgQWRkcmVzcwoJICogQHBhcmFtCXN0cmluZ1tdCQkJCQkkcFN0cmluZ1RhYmxlCQkJU3RyaW5nIHRhYmxlCgkgKiBAcGFyYW0Jc3RyaW5nW10JCQkJCSRwRmxpcHBlZFN0cmluZ1RhYmxlCVN0cmluZyB0YWJsZSAoZmxpcHBlZCksIGZvciBmYXN0ZXIgaW5kZXggc2VhcmNoaW5nCgkgKiBAdGhyb3dzCUV4Y2VwdGlvbgoJICovCglwcml2YXRlIGZ1bmN0aW9uIF93cml0ZUNlbGwoUEhQRXhjZWxfU2hhcmVkX1hNTFdyaXRlciAkb2JqV3JpdGVyID0gbnVsbCwgUEhQRXhjZWxfV29ya3NoZWV0ICRwU2hlZXQgPSBudWxsLCAkcENlbGxBZGRyZXNzID0gbnVsbCwgJHBTdHJpbmdUYWJsZSA9IG51bGwsICRwRmxpcHBlZFN0cmluZ1RhYmxlID0gbnVsbCkKCXsKCQlpZiAoaXNfYXJyYXkoJHBTdHJpbmdUYWJsZSkgJiYgaXNfYXJyYXkoJHBGbGlwcGVkU3RyaW5nVGFibGUpKSB7CgkJCS8vIENlbGwKCQkJJHBDZWxsID0gJHBTaGVldC0+Z2V0Q2VsbCgkcENlbGxBZGRyZXNzKTsKCQkJJG9ialdyaXRlci0+c3RhcnRFbGVtZW50KCdjJyk7CgkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCdyJywgJHBDZWxsQWRkcmVzcyk7CgoJCQkvLyBTaGVldCBzdHlsZXMKCQkJaWYgKCRwQ2VsbC0+Z2V0WGZJbmRleCgpICE9ICcnKSB7CgkJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgncycsICRwQ2VsbC0+Z2V0WGZJbmRleCgpKTsKCQkJfQoKCQkJLy8gSWYgY2VsbCB2YWx1ZSBpcyBzdXBwbGllZCwgd3JpdGUgY2VsbCB2YWx1ZQoJCQkkY2VsbFZhbHVlID0gJHBDZWxsLT5nZXRWYWx1ZSgpOwoJCQlpZiAoaXNfb2JqZWN0KCRjZWxsVmFsdWUpIHx8ICRjZWxsVmFsdWUgIT09ICcnKSB7CgkJCQkvLyBNYXAgdHlwZQoJCQkJJG1hcHBlZFR5cGUgPSAkcENlbGwtPmdldERhdGFUeXBlKCk7CgoJCQkJLy8gV3JpdGUgZGF0YSB0eXBlIGRlcGVuZGluZyBvbiBpdHMgdHlwZQoJCQkJc3dpdGNoIChzdHJ0b2xvd2VyKCRtYXBwZWRUeXBlKSkgewoJCQkJCWNhc2UgJ2lubGluZXN0cic6CS8vIElubGluZSBzdHJpbmcKCQkJCQljYXNlICdzJzoJCQkvLyBTdHJpbmcKCQkJCQljYXNlICdiJzoJCQkvLyBCb29sZWFuCgkJCQkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCd0JywgJG1hcHBlZFR5cGUpOwoJCQkJCQlicmVhazsKCQkJCQljYXNlICdmJzoJCQkvLyBGb3JtdWxhCgkJCQkJCSRjYWxjdWxhdGVkVmFsdWUgPSBudWxsOwoJCQkJCQlpZiAoJHRoaXMtPmdldFBhcmVudFdyaXRlcigpLT5nZXRQcmVDYWxjdWxhdGVGb3JtdWxhcygpKSB7CgkJCQkJCQkkY2FsY3VsYXRlZFZhbHVlID0gJHBDZWxsLT5nZXRDYWxjdWxhdGVkVmFsdWUoKTsKCQkJCQkJfSBlbHNlIHsKCQkJCQkJCSRjYWxjdWxhdGVkVmFsdWUgPSAkY2VsbFZhbHVlOwoJCQkJCQl9CgkJCQkJCWlmIChpc19zdHJpbmcoJGNhbGN1bGF0ZWRWYWx1ZSkpIHsKCQkJCQkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCd0JywgJ3N0cicpOwoJCQkJCQl9CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgJ2UnOgkJCS8vIEVycm9yCgkJCQkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCd0JywgJG1hcHBlZFR5cGUpOwoJCQkJfQoKCQkJCS8vIFdyaXRlIGRhdGEgZGVwZW5kaW5nIG9uIGl0cyB0eXBlCgkJCQlzd2l0Y2ggKHN0cnRvbG93ZXIoJG1hcHBlZFR5cGUpKSB7CgkJCQkJY2FzZSAnaW5saW5lc3RyJzoJLy8gSW5saW5lIHN0cmluZwoJCQkJCQlpZiAoISAkY2VsbFZhbHVlIGluc3RhbmNlb2YgUEhQRXhjZWxfUmljaFRleHQpIHsKCQkJCQkJCSRvYmpXcml0ZXItPndyaXRlRWxlbWVudCgndCcsIFBIUEV4Y2VsX1NoYXJlZF9TdHJpbmc6OkNvbnRyb2xDaGFyYWN0ZXJQSFAyT09YTUwoIGh0bWxzcGVjaWFsY2hhcnMoJGNlbGxWYWx1ZSkgKSApOwoJCQkJCQl9IGVsc2UgaWYgKCRjZWxsVmFsdWUgaW5zdGFuY2VvZiBQSFBFeGNlbF9SaWNoVGV4dCkgewoJCQkJCQkJJG9ialdyaXRlci0+c3RhcnRFbGVtZW50KCdpcycpOwoJCQkJCQkJJHRoaXMtPmdldFBhcmVudFdyaXRlcigpLT5nZXRXcml0ZXJQYXJ0KCdzdHJpbmd0YWJsZScpLT53cml0ZVJpY2hUZXh0KCRvYmpXcml0ZXIsICRjZWxsVmFsdWUpOwoJCQkJCQkJJG9ialdyaXRlci0+ZW5kRWxlbWVudCgpOwoJCQkJCQl9CgoJCQkJCQlicmVhazsKCQkJCQljYXNlICdzJzoJCQkvLyBTdHJpbmcKCQkJCQkJaWYgKCEgJGNlbGxWYWx1ZSBpbnN0YW5jZW9mIFBIUEV4Y2VsX1JpY2hUZXh0KSB7CgkJCQkJCQlpZiAoaXNzZXQoJHBGbGlwcGVkU3RyaW5nVGFibGVbJGNlbGxWYWx1ZV0pKSB7CgkJCQkJCQkJJG9ialdyaXRlci0+d3JpdGVFbGVtZW50KCd2JywgJHBGbGlwcGVkU3RyaW5nVGFibGVbJGNlbGxWYWx1ZV0pOwoJCQkJCQkJfQoJCQkJCQl9IGVsc2UgaWYgKCRjZWxsVmFsdWUgaW5zdGFuY2VvZiBQSFBFeGNlbF9SaWNoVGV4dCkgewoJCQkJCQkJJG9ialdyaXRlci0+d3JpdGVFbGVtZW50KCd2JywgJHBGbGlwcGVkU3RyaW5nVGFibGVbJGNlbGxWYWx1ZS0+Z2V0SGFzaENvZGUoKV0pOwoJCQkJCQl9CgoJCQkJCQlicmVhazsKCQkJCQljYXNlICdmJzoJCQkvLyBGb3JtdWxhCgkJCQkJCSRhdHRyaWJ1dGVzID0gJHBDZWxsLT5nZXRGb3JtdWxhQXR0cmlidXRlcygpOwoJCQkJCQlpZigkYXR0cmlidXRlc1sndCddID09ICdhcnJheScpIHsKCQkJCQkJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgnZicpOwoJCQkJCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ3QnLCAnYXJyYXknKTsKCQkJCQkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCdyZWYnLCAkcENlbGxBZGRyZXNzKTsKCQkJCQkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCdhY2EnLCAnMScpOwoJCQkJCQkJJG9ialdyaXRlci0+d3JpdGVBdHRyaWJ1dGUoJ2NhJywgJzEnKTsKCQkJCQkJCSRvYmpXcml0ZXItPnRleHQoc3Vic3RyKCRjZWxsVmFsdWUsIDEpKTsKCQkJCQkJCSRvYmpXcml0ZXItPmVuZEVsZW1lbnQoKTsKCQkJCQkJfSBlbHNlIHsKCQkJCQkJCSRvYmpXcml0ZXItPndyaXRlRWxlbWVudCgnZicsIHN1YnN0cigkY2VsbFZhbHVlLCAxKSk7CgkJCQkJCX0KCQkJCQkJaWYgKCR0aGlzLT5nZXRQYXJlbnRXcml0ZXIoKS0+Z2V0T2ZmaWNlMjAwM0NvbXBhdGliaWxpdHkoKSA9PT0gZmFsc2UpIHsKCQkJCQkJCWlmICgkdGhpcy0+Z2V0UGFyZW50V3JpdGVyKCktPmdldFByZUNhbGN1bGF0ZUZvcm11bGFzKCkpIHsKCQkJCQkJCQkkY2FsY3VsYXRlZFZhbHVlID0gJHBDZWxsLT5nZXRDYWxjdWxhdGVkVmFsdWUoKTsKCQkJCQkJCQlpZiAoIWlzX2FycmF5KCRjYWxjdWxhdGVkVmFsdWUpICYmIHN1YnN0cigkY2FsY3VsYXRlZFZhbHVlLCAwLCAxKSAhPSAnIycpIHsKCQkJCQkJCQkJJG9ialdyaXRlci0+d3JpdGVFbGVtZW50KCd2JywgUEhQRXhjZWxfU2hhcmVkX1N0cmluZzo6Rm9ybWF0TnVtYmVyKCRjYWxjdWxhdGVkVmFsdWUpKTsKCQkJCQkJCQl9IGVsc2UgewoJCQkJCQkJCQkkb2JqV3JpdGVyLT53cml0ZUVsZW1lbnQoJ3YnLCAnMCcpOwoJCQkJCQkJCX0KCQkJCQkJCX0gZWxzZSB7CgkJCQkJCQkJJG9ialdyaXRlci0+d3JpdGVFbGVtZW50KCd2JywgJzAnKTsKCQkJCQkJCX0KCQkJCQkJfQoJCQkJCQlicmVhazsKCQkJCQljYXNlICduJzoJCQkvLyBOdW1lcmljCgkJCQkJCS8vIGZvcmNlIHBvaW50IGFzIGRlY2ltYWwgc2VwYXJhdG9yIGluIGNhc2UgY3VycmVudCBsb2NhbGUgdXNlcyBjb21tYQoJCQkJCQkkb2JqV3JpdGVyLT53cml0ZUVsZW1lbnQoJ3YnLCBzdHJfcmVwbGFjZSgnLCcsICcuJywgJGNlbGxWYWx1ZSkpOwoJCQkJCQlicmVhazsKCQkJCQljYXNlICdiJzoJCQkvLyBCb29sZWFuCgkJCQkJCSRvYmpXcml0ZXItPndyaXRlRWxlbWVudCgndicsICgkY2VsbFZhbHVlID8gJzEnIDogJzAnKSk7CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgJ2UnOgkJCS8vIEVycm9yCgkJCQkJCWlmIChzdWJzdHIoJGNlbGxWYWx1ZSwgMCwgMSkgPT0gJz0nKSB7CgkJCQkJCQkkb2JqV3JpdGVyLT53cml0ZUVsZW1lbnQoJ2YnLCBzdWJzdHIoJGNlbGxWYWx1ZSwgMSkpOwoJCQkJCQkJJG9ialdyaXRlci0+d3JpdGVFbGVtZW50KCd2Jywgc3Vic3RyKCRjZWxsVmFsdWUsIDEpKTsKCQkJCQkJfSBlbHNlIHsKCQkJCQkJCSRvYmpXcml0ZXItPndyaXRlRWxlbWVudCgndicsICRjZWxsVmFsdWUpOwoJCQkJCQl9CgoJCQkJCQlicmVhazsKCQkJCX0KCQkJfQoKCQkJJG9ialdyaXRlci0+ZW5kRWxlbWVudCgpOwoJCX0gZWxzZSB7CgkJCXRocm93IG5ldyBFeGNlcHRpb24oIkludmFsaWQgcGFyYW1ldGVycyBwYXNzZWQuIik7CgkJfQoJfQoKCS8qKgoJICogV3JpdGUgRHJhd2luZ3MKCSAqCgkgKiBAcGFyYW0JUEhQRXhjZWxfU2hhcmVkX1hNTFdyaXRlcgkkb2JqV3JpdGVyCQlYTUwgV3JpdGVyCgkgKiBAcGFyYW0JUEhQRXhjZWxfV29ya3NoZWV0CQkJJHBTaGVldAkJCVdvcmtzaGVldAoJICogQHBhcmFtCWJvb2xlYW4JCQkJCQkkaW5jbHVkZUNoYXJ0cwlGbGFnIGluZGljYXRpbmcgaWYgd2Ugc2hvdWxkIGluY2x1ZGUgZHJhd2luZyBkZXRhaWxzIGZvciBjaGFydHMKCSAqIEB0aHJvd3MJRXhjZXB0aW9uCgkgKi8KCXByaXZhdGUgZnVuY3Rpb24gX3dyaXRlRHJhd2luZ3MoUEhQRXhjZWxfU2hhcmVkX1hNTFdyaXRlciAkb2JqV3JpdGVyID0gbnVsbCwgUEhQRXhjZWxfV29ya3NoZWV0ICRwU2hlZXQgPSBudWxsLCAkaW5jbHVkZUNoYXJ0cyA9IEZBTFNFKQoJewoJCSRjaGFydENvdW50ID0gKCRpbmNsdWRlQ2hhcnRzKSA/ICRwU2hlZXQtPmdldENoYXJ0Q29sbGVjdGlvbigpLT5jb3VudCgpIDogMDsKCQkvLyBJZiBzaGVldCBjb250YWlucyBkcmF3aW5ncywgYWRkIHRoZSByZWxhdGlvbnNoaXBzCgkJaWYgKCgkcFNoZWV0LT5nZXREcmF3aW5nQ29sbGVjdGlvbigpLT5jb3VudCgpID4gMCkgfHwKCQkJKCRjaGFydENvdW50ID4gMCkpIHsKCQkJJG9ialdyaXRlci0+c3RhcnRFbGVtZW50KCdkcmF3aW5nJyk7CgkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCdyOmlkJywgJ3JJZDEnKTsKCQkJJG9ialdyaXRlci0+ZW5kRWxlbWVudCgpOwoJCX0KCX0KCgkvKioKCSAqIFdyaXRlIExlZ2FjeURyYXdpbmcKCSAqCgkgKiBAcGFyYW0JUEhQRXhjZWxfU2hhcmVkX1hNTFdyaXRlcgkJJG9ialdyaXRlcgkJWE1MIFdyaXRlcgoJICogQHBhcmFtCVBIUEV4Y2VsX1dvcmtzaGVldAkJCQkkcFNoZWV0CQkJV29ya3NoZWV0CgkgKiBAdGhyb3dzCUV4Y2VwdGlvbgoJICovCglwcml2YXRlIGZ1bmN0aW9uIF93cml0ZUxlZ2FjeURyYXdpbmcoUEhQRXhjZWxfU2hhcmVkX1hNTFdyaXRlciAkb2JqV3JpdGVyID0gbnVsbCwgUEhQRXhjZWxfV29ya3NoZWV0ICRwU2hlZXQgPSBudWxsKQoJewoJCS8vIElmIHNoZWV0IGNvbnRhaW5zIGNvbW1lbnRzLCBhZGQgdGhlIHJlbGF0aW9uc2hpcHMKCQlpZiAoY291bnQoJHBTaGVldC0+Z2V0Q29tbWVudHMoKSkgPiAwKSB7CgkJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgnbGVnYWN5RHJhd2luZycpOwoJCQkkb2JqV3JpdGVyLT53cml0ZUF0dHJpYnV0ZSgncjppZCcsICdySWRfY29tbWVudHNfdm1sMScpOwoJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgkJfQoJfQoKCS8qKgoJICogV3JpdGUgTGVnYWN5RHJhd2luZ0hGCgkgKgoJICogQHBhcmFtCVBIUEV4Y2VsX1NoYXJlZF9YTUxXcml0ZXIJCSRvYmpXcml0ZXIJCVhNTCBXcml0ZXIKCSAqIEBwYXJhbQlQSFBFeGNlbF9Xb3Jrc2hlZXQJCQkJJHBTaGVldAkJCVdvcmtzaGVldAoJICogQHRocm93cwlFeGNlcHRpb24KCSAqLwoJcHJpdmF0ZSBmdW5jdGlvbiBfd3JpdGVMZWdhY3lEcmF3aW5nSEYoUEhQRXhjZWxfU2hhcmVkX1hNTFdyaXRlciAkb2JqV3JpdGVyID0gbnVsbCwgUEhQRXhjZWxfV29ya3NoZWV0ICRwU2hlZXQgPSBudWxsKQoJewoJCS8vIElmIHNoZWV0IGNvbnRhaW5zIGltYWdlcywgYWRkIHRoZSByZWxhdGlvbnNoaXBzCgkJaWYgKGNvdW50KCRwU2hlZXQtPmdldEhlYWRlckZvb3RlcigpLT5nZXRJbWFnZXMoKSkgPiAwKSB7CgkJCSRvYmpXcml0ZXItPnN0YXJ0RWxlbWVudCgnbGVnYWN5RHJhd2luZ0hGJyk7CgkJCSRvYmpXcml0ZXItPndyaXRlQXR0cmlidXRlKCdyOmlkJywgJ3JJZF9oZWFkZXJmb290ZXJfdm1sMScpOwoJCQkkb2JqV3JpdGVyLT5lbmRFbGVtZW50KCk7CgkJfQoJfQp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Writer/Excel2007/WriterPart.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIFBIUEV4Y2VsCiAqCiAqIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICoKICogQGNhdGVnb3J5ICAgUEhQRXhjZWwKICogQHBhY2thZ2UgICAgUEhQRXhjZWxfV3JpdGVyX0V4Y2VsMjAwNwogKiBAY29weXJpZ2h0ICBDb3B5cmlnaHQgKGMpIDIwMDYgLSAyMDEyIFBIUEV4Y2VsIChodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9QSFBFeGNlbCkKICogQGxpY2Vuc2UgICAgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL29sZC1saWNlbnNlcy9sZ3BsLTIuMS50eHQJTEdQTAogKiBAdmVyc2lvbiAgICAxLjcuNywgMjAxMi0wNS0xOQogKi8KCgovKioKICogUEhQRXhjZWxfV3JpdGVyX0V4Y2VsMjAwN19Xcml0ZXJQYXJ0CiAqCiAqIEBjYXRlZ29yeSAgIFBIUEV4Y2VsCiAqIEBwYWNrYWdlICAgIFBIUEV4Y2VsX1dyaXRlcl9FeGNlbDIwMDcKICogQGNvcHlyaWdodCAgQ29weXJpZ2h0IChjKSAyMDA2IC0gMjAxMiBQSFBFeGNlbCAoaHR0cDovL3d3dy5jb2RlcGxleC5jb20vUEhQRXhjZWwpCiAqLwphYnN0cmFjdCBjbGFzcyBQSFBFeGNlbF9Xcml0ZXJfRXhjZWwyMDA3X1dyaXRlclBhcnQKewoJLyoqCgkgKiBQYXJlbnQgSVdyaXRlciBvYmplY3QKCSAqCgkgKiBAdmFyIFBIUEV4Y2VsX1dyaXRlcl9JV3JpdGVyCgkgKi8KCXByaXZhdGUgJF9wYXJlbnRXcml0ZXI7CgoJLyoqCgkgKiBTZXQgcGFyZW50IElXcml0ZXIgb2JqZWN0CgkgKgoJICogQHBhcmFtIFBIUEV4Y2VsX1dyaXRlcl9JV3JpdGVyCSRwV3JpdGVyCgkgKiBAdGhyb3dzIEV4Y2VwdGlvbgoJICovCglwdWJsaWMgZnVuY3Rpb24gc2V0UGFyZW50V3JpdGVyKFBIUEV4Y2VsX1dyaXRlcl9JV3JpdGVyICRwV3JpdGVyID0gbnVsbCkgewoJCSR0aGlzLT5fcGFyZW50V3JpdGVyID0gJHBXcml0ZXI7Cgl9CgoJLyoqCgkgKiBHZXQgcGFyZW50IElXcml0ZXIgb2JqZWN0CgkgKgoJICogQHJldHVybiBQSFBFeGNlbF9Xcml0ZXJfSVdyaXRlcgoJICogQHRocm93cyBFeGNlcHRpb24KCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldFBhcmVudFdyaXRlcigpIHsKCQlpZiAoIWlzX251bGwoJHRoaXMtPl9wYXJlbnRXcml0ZXIpKSB7CgkJCXJldHVybiAkdGhpcy0+X3BhcmVudFdyaXRlcjsKCQl9IGVsc2UgewoJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCJObyBwYXJlbnQgUEhQRXhjZWxfV3JpdGVyX0lXcml0ZXIgYXNzaWduZWQuIik7CgkJfQoJfQoKCS8qKgoJICogU2V0IHBhcmVudCBJV3JpdGVyIG9iamVjdAoJICoKCSAqIEBwYXJhbSBQSFBFeGNlbF9Xcml0ZXJfSVdyaXRlcgkkcFdyaXRlcgoJICogQHRocm93cyBFeGNlcHRpb24KCSAqLwoJcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KFBIUEV4Y2VsX1dyaXRlcl9JV3JpdGVyICRwV3JpdGVyID0gbnVsbCkgewoJCWlmICghaXNfbnVsbCgkcFdyaXRlcikpIHsKCQkJJHRoaXMtPl9wYXJlbnRXcml0ZXIgPSAkcFdyaXRlcjsKCQl9Cgl9Cgp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Writer/HTML.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIFBIUEV4Y2VsCiAqCiAqIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICoKICogQGNhdGVnb3J5ICAgUEhQRXhjZWwKICogQHBhY2thZ2UJUEhQRXhjZWxfV3JpdGVyCiAqIEBjb3B5cmlnaHQgIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwgKGh0dHA6Ly93d3cuY29kZXBsZXguY29tL1BIUEV4Y2VsKQogKiBAbGljZW5zZQlodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvb2xkLWxpY2Vuc2VzL2xncGwtMi4xLnR4dAlMR1BMCiAqIEB2ZXJzaW9uCTEuNy43LCAyMDEyLTA1LTE5CiAqLwoKCi8qKgogKiBQSFBFeGNlbF9Xcml0ZXJfSFRNTAogKgogKiBAY2F0ZWdvcnkgICBQSFBFeGNlbAogKiBAcGFja2FnZQlQSFBFeGNlbF9Xcml0ZXIKICogQGNvcHlyaWdodCAgQ29weXJpZ2h0IChjKSAyMDA2IC0gMjAxMiBQSFBFeGNlbCAoaHR0cDovL3d3dy5jb2RlcGxleC5jb20vUEhQRXhjZWwpCiAqLwpjbGFzcyBQSFBFeGNlbF9Xcml0ZXJfSFRNTCBpbXBsZW1lbnRzIFBIUEV4Y2VsX1dyaXRlcl9JV3JpdGVyIHsKCS8qKgoJICogUEhQRXhjZWwgb2JqZWN0CgkgKgoJICogQHZhciBQSFBFeGNlbAoJICovCglwcm90ZWN0ZWQgJF9waHBFeGNlbDsKCgkvKioKCSAqIFNoZWV0IGluZGV4IHRvIHdyaXRlCgkgKgoJICogQHZhciBpbnQKCSAqLwoJcHJpdmF0ZSAkX3NoZWV0SW5kZXgJPSAwOwoKCS8qKgoJICogUHJlLWNhbGN1bGF0ZSBmb3JtdWxhcwoJICoKCSAqIEB2YXIgYm9vbGVhbgoJICovCglwcml2YXRlICRfcHJlQ2FsY3VsYXRlRm9ybXVsYXMgPSB0cnVlOwoKCS8qKgoJICogSW1hZ2VzIHJvb3QKCSAqCgkgKiBAdmFyIHN0cmluZwoJICovCglwcml2YXRlICRfaW1hZ2VzUm9vdAk9ICcuJzsKCgkvKioKCSAqIFVzZSBpbmxpbmUgQ1NTPwoJICoKCSAqIEB2YXIgYm9vbGVhbgoJICovCglwcml2YXRlICRfdXNlSW5saW5lQ3NzID0gZmFsc2U7CgoJLyoqCgkgKiBBcnJheSBvZiBDU1Mgc3R5bGVzCgkgKgoJICogQHZhciBhcnJheQoJICovCglwcml2YXRlICRfY3NzU3R5bGVzID0gbnVsbDsKCgkvKioKCSAqIEFycmF5IG9mIGNvbHVtbiB3aWR0aHMgaW4gcG9pbnRzCgkgKgoJICogQHZhciBhcnJheQoJICovCglwcml2YXRlICRfY29sdW1uV2lkdGhzID0gbnVsbDsKCgkvKioKCSAqIERlZmF1bHQgZm9udAoJICoKCSAqIEB2YXIgUEhQRXhjZWxfU3R5bGVfRm9udAoJICovCglwcml2YXRlICRfZGVmYXVsdEZvbnQ7CgoJLyoqCgkgKiBGbGFnIHdoZXRoZXIgc3BhbnMgaGF2ZSBiZWVuIGNhbGN1bGF0ZWQKCSAqCgkgKiBAdmFyIGJvb2xlYW4KCSAqLwoJcHJpdmF0ZSAkX3NwYW5zQXJlQ2FsY3VsYXRlZAk9IGZhbHNlOwoKCS8qKgoJICogRXhjZWwgY2VsbHMgdGhhdCBzaG91bGQgbm90IGJlIHdyaXR0ZW4gYXMgSFRNTCBjZWxscwoJICoKCSAqIEB2YXIgYXJyYXkKCSAqLwoJcHJpdmF0ZSAkX2lzU3Bhbm5lZENlbGwJPSBhcnJheSgpOwoKCS8qKgoJICogRXhjZWwgY2VsbHMgdGhhdCBhcmUgdXBwZXItbGVmdCBjb3JuZXIgaW4gYSBjZWxsIG1lcmdlCgkgKgoJICogQHZhciBhcnJheQoJICovCglwcml2YXRlICRfaXNCYXNlQ2VsbAk9IGFycmF5KCk7CgoJLyoqCgkgKiBFeGNlbCByb3dzIHRoYXQgc2hvdWxkIG5vdCBiZSB3cml0dGVuIGFzIEhUTUwgcm93cwoJICoKCSAqIEB2YXIgYXJyYXkKCSAqLwoJcHJpdmF0ZSAkX2lzU3Bhbm5lZFJvdwk9IGFycmF5KCk7CgoJLyoqCgkgKiBJcyB0aGUgY3VycmVudCB3cml0ZXIgY3JlYXRpbmcgUERGPwoJICoKCSAqIEB2YXIgYm9vbGVhbgoJICovCglwcm90ZWN0ZWQgJF9pc1BkZiA9IGZhbHNlOwoKCS8qKgoJICogR2VuZXJhdGUgdGhlIE5hdmlnYXRpb24gYmxvY2sKCSAqCgkgKiBAdmFyIGJvb2xlYW4KCSAqLwoJcHJpdmF0ZSAkX2dlbmVyYXRlU2hlZXROYXZpZ2F0aW9uQmxvY2sgPSB0cnVlOwoKCS8qKgoJICogQ3JlYXRlIGEgbmV3IFBIUEV4Y2VsX1dyaXRlcl9IVE1MCgkgKgoJICogQHBhcmFtCVBIUEV4Y2VsCSRwaHBFeGNlbAlQSFBFeGNlbCBvYmplY3QKCSAqLwoJcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KFBIUEV4Y2VsICRwaHBFeGNlbCkgewoJCSR0aGlzLT5fcGhwRXhjZWwgPSAkcGhwRXhjZWw7CgkJJHRoaXMtPl9kZWZhdWx0Rm9udCA9ICR0aGlzLT5fcGhwRXhjZWwtPmdldERlZmF1bHRTdHlsZSgpLT5nZXRGb250KCk7Cgl9CgoJLyoqCgkgKiBTYXZlIFBIUEV4Y2VsIHRvIGZpbGUKCSAqCgkgKiBAcGFyYW0Jc3RyaW5nCQkkcEZpbGVuYW1lCgkgKiBAdGhyb3dzCUV4Y2VwdGlvbgoJICovCglwdWJsaWMgZnVuY3Rpb24gc2F2ZSgkcEZpbGVuYW1lID0gbnVsbCkgewoJCS8vIGdhcmJhZ2UgY29sbGVjdAoJCSR0aGlzLT5fcGhwRXhjZWwtPmdhcmJhZ2VDb2xsZWN0KCk7CgoJCSRzYXZlRGVidWdMb2cgPSBQSFBFeGNlbF9DYWxjdWxhdGlvbjo6Z2V0SW5zdGFuY2UoKS0+d3JpdGVEZWJ1Z0xvZzsKCQlQSFBFeGNlbF9DYWxjdWxhdGlvbjo6Z2V0SW5zdGFuY2UoKS0+d3JpdGVEZWJ1Z0xvZyA9IGZhbHNlOwoJCSRzYXZlQXJyYXlSZXR1cm5UeXBlID0gUEhQRXhjZWxfQ2FsY3VsYXRpb246OmdldEFycmF5UmV0dXJuVHlwZSgpOwoJCVBIUEV4Y2VsX0NhbGN1bGF0aW9uOjpzZXRBcnJheVJldHVyblR5cGUoUEhQRXhjZWxfQ2FsY3VsYXRpb246OlJFVFVSTl9BUlJBWV9BU19WQUxVRSk7CgoJCS8vIEJ1aWxkIENTUwoJCSR0aGlzLT5idWlsZENTUyghJHRoaXMtPl91c2VJbmxpbmVDc3MpOwoKCQkvLyBPcGVuIGZpbGUKCQkkZmlsZUhhbmRsZSA9IGZvcGVuKCRwRmlsZW5hbWUsICd3YisnKTsKCQlpZiAoJGZpbGVIYW5kbGUgPT09IGZhbHNlKSB7CgkJCXRocm93IG5ldyBFeGNlcHRpb24oIkNvdWxkIG5vdCBvcGVuIGZpbGUgJHBGaWxlbmFtZSBmb3Igd3JpdGluZy4iKTsKCQl9CgoJCS8vIFdyaXRlIGhlYWRlcnMKCQlmd3JpdGUoJGZpbGVIYW5kbGUsICR0aGlzLT5nZW5lcmF0ZUhUTUxIZWFkZXIoISR0aGlzLT5fdXNlSW5saW5lQ3NzKSk7CgoJCS8vIFdyaXRlIG5hdmlnYXRpb24gKHRhYnMpCgkJaWYgKCghJHRoaXMtPl9pc1BkZikgJiYgKCR0aGlzLT5fZ2VuZXJhdGVTaGVldE5hdmlnYXRpb25CbG9jaykpIHsKCQkJZndyaXRlKCRmaWxlSGFuZGxlLCAkdGhpcy0+Z2VuZXJhdGVOYXZpZ2F0aW9uKCkpOwoJCX0KCgkJLy8gV3JpdGUgZGF0YQoJCWZ3cml0ZSgkZmlsZUhhbmRsZSwgJHRoaXMtPmdlbmVyYXRlU2hlZXREYXRhKCkpOwoKCQkvLyBXcml0ZSBmb290ZXIKCQlmd3JpdGUoJGZpbGVIYW5kbGUsICR0aGlzLT5nZW5lcmF0ZUhUTUxGb290ZXIoKSk7CgoJCS8vIENsb3NlIGZpbGUKCQlmY2xvc2UoJGZpbGVIYW5kbGUpOwoKCQlQSFBFeGNlbF9DYWxjdWxhdGlvbjo6c2V0QXJyYXlSZXR1cm5UeXBlKCRzYXZlQXJyYXlSZXR1cm5UeXBlKTsKCQlQSFBFeGNlbF9DYWxjdWxhdGlvbjo6Z2V0SW5zdGFuY2UoKS0+d3JpdGVEZWJ1Z0xvZyA9ICRzYXZlRGVidWdMb2c7Cgl9CgoJLyoqCgkgKiBNYXAgVkFsaWduCgkgKgoJICogQHBhcmFtCXN0cmluZwkJJHZBbGlnbgkJVmVydGljYWwgYWxpZ25tZW50CgkgKiBAcmV0dXJuIHN0cmluZwoJICovCglwcml2YXRlIGZ1bmN0aW9uIF9tYXBWQWxpZ24oJHZBbGlnbikgewoJCXN3aXRjaCAoJHZBbGlnbikgewoJCQljYXNlIFBIUEV4Y2VsX1N0eWxlX0FsaWdubWVudDo6VkVSVElDQUxfQk9UVE9NOgkJcmV0dXJuICdib3R0b20nOwoJCQljYXNlIFBIUEV4Y2VsX1N0eWxlX0FsaWdubWVudDo6VkVSVElDQUxfVE9QOgkJcmV0dXJuICd0b3AnOwoJCQljYXNlIFBIUEV4Y2VsX1N0eWxlX0FsaWdubWVudDo6VkVSVElDQUxfQ0VOVEVSOgoJCQljYXNlIFBIUEV4Y2VsX1N0eWxlX0FsaWdubWVudDo6VkVSVElDQUxfSlVTVElGWToJcmV0dXJuICdtaWRkbGUnOwoJCQlkZWZhdWx0OiByZXR1cm4gJ2Jhc2VsaW5lJzsKCQl9Cgl9CgoJLyoqCgkgKiBNYXAgSEFsaWduCgkgKgoJICogQHBhcmFtCXN0cmluZwkJJGhBbGlnbgkJSG9yaXpvbnRhbCBhbGlnbm1lbnQKCSAqIEByZXR1cm4gc3RyaW5nfGZhbHNlCgkgKi8KCXByaXZhdGUgZnVuY3Rpb24gX21hcEhBbGlnbigkaEFsaWduKSB7CgkJc3dpdGNoICgkaEFsaWduKSB7CgkJCWNhc2UgUEhQRXhjZWxfU3R5bGVfQWxpZ25tZW50OjpIT1JJWk9OVEFMX0dFTkVSQUw6CQkJCXJldHVybiBmYWxzZTsKCQkJY2FzZSBQSFBFeGNlbF9TdHlsZV9BbGlnbm1lbnQ6OkhPUklaT05UQUxfTEVGVDoJCQkJCXJldHVybiAnbGVmdCc7CgkJCWNhc2UgUEhQRXhjZWxfU3R5bGVfQWxpZ25tZW50OjpIT1JJWk9OVEFMX1JJR0hUOgkJCQlyZXR1cm4gJ3JpZ2h0JzsKCQkJY2FzZSBQSFBFeGNlbF9TdHlsZV9BbGlnbm1lbnQ6OkhPUklaT05UQUxfQ0VOVEVSOgoJCQljYXNlIFBIUEV4Y2VsX1N0eWxlX0FsaWdubWVudDo6SE9SSVpPTlRBTF9DRU5URVJfQ09OVElOVU9VUzoJcmV0dXJuICdjZW50ZXInOwoJCQljYXNlIFBIUEV4Y2VsX1N0eWxlX0FsaWdubWVudDo6SE9SSVpPTlRBTF9KVVNUSUZZOgkJCQlyZXR1cm4gJ2p1c3RpZnknOwoJCQlkZWZhdWx0OiByZXR1cm4gZmFsc2U7CgkJfQoJfQoKCS8qKgoJICogTWFwIGJvcmRlciBzdHlsZQoJICoKCSAqIEBwYXJhbQlpbnQJCSRib3JkZXJTdHlsZQkJU2hlZXQgaW5kZXgKCSAqIEByZXR1cm4Jc3RyaW5nCgkgKi8KCXByaXZhdGUgZnVuY3Rpb24gX21hcEJvcmRlclN0eWxlKCRib3JkZXJTdHlsZSkgewoJCXN3aXRjaCAoJGJvcmRlclN0eWxlKSB7CgkJCWNhc2UgUEhQRXhjZWxfU3R5bGVfQm9yZGVyOjpCT1JERVJfTk9ORToJCQkJcmV0dXJuICcxcHggaGlkZGVuJzsKCQkJY2FzZSBQSFBFeGNlbF9TdHlsZV9Cb3JkZXI6OkJPUkRFUl9EQVNIRE9UOgkJCQlyZXR1cm4gJzFweCBkYXNoZWQnOwoJCQljYXNlIFBIUEV4Y2VsX1N0eWxlX0JvcmRlcjo6Qk9SREVSX0RBU0hET1RET1Q6CQkJcmV0dXJuICcxcHggZG90dGVkJzsKCQkJY2FzZSBQSFBFeGNlbF9TdHlsZV9Cb3JkZXI6OkJPUkRFUl9EQVNIRUQ6CQkJCXJldHVybiAnMXB4IGRhc2hlZCc7CgkJCWNhc2UgUEhQRXhjZWxfU3R5bGVfQm9yZGVyOjpCT1JERVJfRE9UVEVEOgkJCQlyZXR1cm4gJzFweCBkb3R0ZWQnOwoJCQljYXNlIFBIUEV4Y2VsX1N0eWxlX0JvcmRlcjo6Qk9SREVSX0RPVUJMRToJCQkJcmV0dXJuICczcHggZG91YmxlJzsKCQkJY2FzZSBQSFBFeGNlbF9TdHlsZV9Cb3JkZXI6OkJPUkRFUl9IQUlSOgkJCQlyZXR1cm4gJzFweCBzb2xpZCc7CgkJCWNhc2UgUEhQRXhjZWxfU3R5bGVfQm9yZGVyOjpCT1JERVJfTUVESVVNOgkJCQlyZXR1cm4gJzJweCBzb2xpZCc7CgkJCWNhc2UgUEhQRXhjZWxfU3R5bGVfQm9yZGVyOjpCT1JERVJfTUVESVVNREFTSERPVDoJCXJldHVybiAnMnB4IGRhc2hlZCc7CgkJCWNhc2UgUEhQRXhjZWxfU3R5bGVfQm9yZGVyOjpCT1JERVJfTUVESVVNREFTSERPVERPVDoJcmV0dXJuICcycHggZG90dGVkJzsKCQkJY2FzZSBQSFBFeGNlbF9TdHlsZV9Cb3JkZXI6OkJPUkRFUl9NRURJVU1EQVNIRUQ6CQlyZXR1cm4gJzJweCBkYXNoZWQnOwoJCQljYXNlIFBIUEV4Y2VsX1N0eWxlX0JvcmRlcjo6Qk9SREVSX1NMQU5UREFTSERPVDoJCXJldHVybiAnMnB4IGRhc2hlZCc7CgkJCWNhc2UgUEhQRXhjZWxfU3R5bGVfQm9yZGVyOjpCT1JERVJfVEhJQ0s6CQkJCXJldHVybiAnM3B4IHNvbGlkJzsKCQkJY2FzZSBQSFBFeGNlbF9TdHlsZV9Cb3JkZXI6OkJPUkRFUl9USElOOgkJCQlyZXR1cm4gJzFweCBzb2xpZCc7CgkJCWRlZmF1bHQ6IHJldHVybiAnMXB4IHNvbGlkJzsgLy8gbWFwIG90aGVycyB0byB0aGluCgkJfQoJfQoKCS8qKgoJICogR2V0IHNoZWV0IGluZGV4CgkgKgoJICogQHJldHVybiBpbnQKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldFNoZWV0SW5kZXgoKSB7CgkJcmV0dXJuICR0aGlzLT5fc2hlZXRJbmRleDsKCX0KCgkvKioKCSAqIFNldCBzaGVldCBpbmRleAoJICoKCSAqIEBwYXJhbQlpbnQJCSRwVmFsdWUJCVNoZWV0IGluZGV4CgkgKiBAcmV0dXJuIFBIUEV4Y2VsX1dyaXRlcl9IVE1MCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBzZXRTaGVldEluZGV4KCRwVmFsdWUgPSAwKSB7CgkJJHRoaXMtPl9zaGVldEluZGV4ID0gJHBWYWx1ZTsKCQlyZXR1cm4gJHRoaXM7Cgl9CgoJLyoqCgkgKiBHZXQgc2hlZXQgaW5kZXgKCSAqCgkgKiBAcmV0dXJuIGJvb2xlYW4KCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldEdlbmVyYXRlU2hlZXROYXZpZ2F0aW9uQmxvY2soKSB7CgkJcmV0dXJuICR0aGlzLT5fZ2VuZXJhdGVTaGVldE5hdmlnYXRpb25CbG9jazsKCX0KCgkvKioKCSAqIFNldCBzaGVldCBpbmRleAoJICoKCSAqIEBwYXJhbQlib29sZWFuCQkkcFZhbHVlCQlGbGFnIGluZGljYXRpbmcgd2hldGhlciB0aGUgc2hlZXQgbmF2aWdhdGlvbiBibG9jayBzaG91bGQgYmUgZ2VuZXJhdGVkIG9yIG5vdAoJICogQHJldHVybiBQSFBFeGNlbF9Xcml0ZXJfSFRNTAoJICovCglwdWJsaWMgZnVuY3Rpb24gc2V0R2VuZXJhdGVTaGVldE5hdmlnYXRpb25CbG9jaygkcFZhbHVlID0gdHJ1ZSkgewoJCSR0aGlzLT5fZ2VuZXJhdGVTaGVldE5hdmlnYXRpb25CbG9jayA9IChib29sKSAkcFZhbHVlOwoJCXJldHVybiAkdGhpczsKCX0KCgkvKioKCSAqIFdyaXRlIGFsbCBzaGVldHMgKHJlc2V0cyBzaGVldEluZGV4IHRvIE5VTEwpCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiB3cml0ZUFsbFNoZWV0cygpIHsKCQkkdGhpcy0+X3NoZWV0SW5kZXggPSBudWxsOwoJCXJldHVybiAkdGhpczsKCX0KCgkvKioKCSAqIEdlbmVyYXRlIEhUTUwgaGVhZGVyCgkgKgoJICogQHBhcmFtCWJvb2xlYW4JCSRwSW5jbHVkZVN0eWxlcwkJSW5jbHVkZSBzdHlsZXM/CgkgKiBAcmV0dXJuCXN0cmluZwoJICogQHRocm93cyBFeGNlcHRpb24KCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdlbmVyYXRlSFRNTEhlYWRlcigkcEluY2x1ZGVTdHlsZXMgPSBmYWxzZSkgewoJCS8vIFBIUEV4Y2VsIG9iamVjdCBrbm93bj8KCQlpZiAoaXNfbnVsbCgkdGhpcy0+X3BocEV4Y2VsKSkgewoJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCdJbnRlcm5hbCBQSFBFeGNlbCBvYmplY3Qgbm90IHNldCB0byBhbiBpbnN0YW5jZSBvZiBhbiBvYmplY3QuJyk7CgkJfQoKCQkvLyBDb25zdHJ1Y3QgSFRNTAoJCSRwcm9wZXJ0aWVzID0gJHRoaXMtPl9waHBFeGNlbC0+Z2V0UHJvcGVydGllcygpOwoJCSRodG1sID0gJzwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L3N0cmljdC5kdGQiPicgLiBQSFBfRU9MOwoJCSRodG1sIC49ICc8IS0tIEdlbmVyYXRlZCBieSBQSFBFeGNlbCAtIGh0dHA6Ly93d3cucGhwZXhjZWwubmV0IC0tPicgLiBQSFBfRU9MOwoJCSRodG1sIC49ICc8aHRtbD4nIC4gUEhQX0VPTDsKCQkkaHRtbCAuPSAnICA8aGVhZD4nIC4gUEhQX0VPTDsKCQkkaHRtbCAuPSAnCSAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiPicgLiBQSFBfRU9MOwoJCWlmICgkcHJvcGVydGllcy0+Z2V0VGl0bGUoKSA+ICcnKQoJCQkkaHRtbCAuPSAnCSAgPHRpdGxlPicgLiBodG1sc3BlY2lhbGNoYXJzKCRwcm9wZXJ0aWVzLT5nZXRUaXRsZSgpKSAuICc8L3RpdGxlPicgLiBQSFBfRU9MOwoKCQlpZiAoJHByb3BlcnRpZXMtPmdldENyZWF0b3IoKSA+ICcnKQoJCQkkaHRtbCAuPSAnCSAgPG1ldGEgbmFtZT0iYXV0aG9yIiBjb250ZW50PSInIC4gaHRtbHNwZWNpYWxjaGFycygkcHJvcGVydGllcy0+Z2V0Q3JlYXRvcigpKSAuICciIC8+JyAuIFBIUF9FT0w7CgkJaWYgKCRwcm9wZXJ0aWVzLT5nZXRUaXRsZSgpID4gJycpCgkJCSRodG1sIC49ICcJICA8bWV0YSBuYW1lPSJ0aXRsZSIgY29udGVudD0iJyAuIGh0bWxzcGVjaWFsY2hhcnMoJHByb3BlcnRpZXMtPmdldFRpdGxlKCkpIC4gJyIgLz4nIC4gUEhQX0VPTDsKCQlpZiAoJHByb3BlcnRpZXMtPmdldERlc2NyaXB0aW9uKCkgPiAnJykKCQkJJGh0bWwgLj0gJwkgIDxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSInIC4gaHRtbHNwZWNpYWxjaGFycygkcHJvcGVydGllcy0+Z2V0RGVzY3JpcHRpb24oKSkgLiAnIiAvPicgLiBQSFBfRU9MOwoJCWlmICgkcHJvcGVydGllcy0+Z2V0U3ViamVjdCgpID4gJycpCgkJCSRodG1sIC49ICcJICA8bWV0YSBuYW1lPSJzdWJqZWN0IiBjb250ZW50PSInIC4gaHRtbHNwZWNpYWxjaGFycygkcHJvcGVydGllcy0+Z2V0U3ViamVjdCgpKSAuICciIC8+JyAuIFBIUF9FT0w7CgkJaWYgKCRwcm9wZXJ0aWVzLT5nZXRLZXl3b3JkcygpID4gJycpCgkJCSRodG1sIC49ICcJICA8bWV0YSBuYW1lPSJrZXl3b3JkcyIgY29udGVudD0iJyAuIGh0bWxzcGVjaWFsY2hhcnMoJHByb3BlcnRpZXMtPmdldEtleXdvcmRzKCkpIC4gJyIgLz4nIC4gUEhQX0VPTDsKCQlpZiAoJHByb3BlcnRpZXMtPmdldENhdGVnb3J5KCkgPiAnJykKCQkJJGh0bWwgLj0gJwkgIDxtZXRhIG5hbWU9ImNhdGVnb3J5IiBjb250ZW50PSInIC4gaHRtbHNwZWNpYWxjaGFycygkcHJvcGVydGllcy0+Z2V0Q2F0ZWdvcnkoKSkgLiAnIiAvPicgLiBQSFBfRU9MOwoJCWlmICgkcHJvcGVydGllcy0+Z2V0Q29tcGFueSgpID4gJycpCgkJCSRodG1sIC49ICcJICA8bWV0YSBuYW1lPSJjb21wYW55IiBjb250ZW50PSInIC4gaHRtbHNwZWNpYWxjaGFycygkcHJvcGVydGllcy0+Z2V0Q29tcGFueSgpKSAuICciIC8+JyAuIFBIUF9FT0w7CgkJaWYgKCRwcm9wZXJ0aWVzLT5nZXRNYW5hZ2VyKCkgPiAnJykKCQkJJGh0bWwgLj0gJwkgIDxtZXRhIG5hbWU9Im1hbmFnZXIiIGNvbnRlbnQ9IicgLiBodG1sc3BlY2lhbGNoYXJzKCRwcm9wZXJ0aWVzLT5nZXRNYW5hZ2VyKCkpIC4gJyIgLz4nIC4gUEhQX0VPTDsKCgkJaWYgKCRwSW5jbHVkZVN0eWxlcykgewoJCQkkaHRtbCAuPSAkdGhpcy0+Z2VuZXJhdGVTdHlsZXModHJ1ZSk7CgkJfQoKCQkkaHRtbCAuPSAnICA8L2hlYWQ+JyAuIFBIUF9FT0w7CgkJJGh0bWwgLj0gJycgLiBQSFBfRU9MOwoJCSRodG1sIC49ICcgIDxib2R5PicgLiBQSFBfRU9MOwoKCQkvLyBSZXR1cm4KCQlyZXR1cm4gJGh0bWw7Cgl9CgoJLyoqCgkgKiBHZW5lcmF0ZSBzaGVldCBkYXRhCgkgKgoJICogQHJldHVybglzdHJpbmcKCSAqIEB0aHJvd3MgRXhjZXB0aW9uCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZW5lcmF0ZVNoZWV0RGF0YSgpIHsKCQkvLyBQSFBFeGNlbCBvYmplY3Qga25vd24/CgkJaWYgKGlzX251bGwoJHRoaXMtPl9waHBFeGNlbCkpIHsKCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbignSW50ZXJuYWwgUEhQRXhjZWwgb2JqZWN0IG5vdCBzZXQgdG8gYW4gaW5zdGFuY2Ugb2YgYW4gb2JqZWN0LicpOwoJCX0KCgkJLy8gRW5zdXJlIHRoYXQgU3BhbnMgaGF2ZSBiZWVuIGNhbGN1bGF0ZWQ/CgkJaWYgKCEkdGhpcy0+X3NwYW5zQXJlQ2FsY3VsYXRlZCkgewoJCQkkdGhpcy0+X2NhbGN1bGF0ZVNwYW5zKCk7CgkJfQoKCQkvLyBGZXRjaCBzaGVldHMKCQkkc2hlZXRzID0gYXJyYXkoKTsKCQlpZiAoaXNfbnVsbCgkdGhpcy0+X3NoZWV0SW5kZXgpKSB7CgkJCSRzaGVldHMgPSAkdGhpcy0+X3BocEV4Y2VsLT5nZXRBbGxTaGVldHMoKTsKCQl9IGVsc2UgewoJCQkkc2hlZXRzW10gPSAkdGhpcy0+X3BocEV4Y2VsLT5nZXRTaGVldCgkdGhpcy0+X3NoZWV0SW5kZXgpOwoJCX0KCgkJLy8gQ29uc3RydWN0IEhUTUwKCQkkaHRtbCA9ICcnOwoKCQkvLyBMb29wIGFsbCBzaGVldHMKCQkkc2hlZXRJZCA9IDA7CgkJZm9yZWFjaCAoJHNoZWV0cyBhcyAkc2hlZXQpIHsKCQkJLy8gV3JpdGUgdGFibGUgaGVhZGVyCgkJCSRodG1sIC49ICR0aGlzLT5fZ2VuZXJhdGVUYWJsZUhlYWRlcigkc2hlZXQpOwoKCQkJLy8gR2V0IHdvcmtzaGVldCBkaW1lbnNpb24KCQkJJGRpbWVuc2lvbiA9IGV4cGxvZGUoJzonLCAkc2hlZXQtPmNhbGN1bGF0ZVdvcmtzaGVldERpbWVuc2lvbigpKTsKCQkJJGRpbWVuc2lvblswXSA9IFBIUEV4Y2VsX0NlbGw6OmNvb3JkaW5hdGVGcm9tU3RyaW5nKCRkaW1lbnNpb25bMF0pOwoJCQkkZGltZW5zaW9uWzBdWzBdID0gUEhQRXhjZWxfQ2VsbDo6Y29sdW1uSW5kZXhGcm9tU3RyaW5nKCRkaW1lbnNpb25bMF1bMF0pIC0gMTsKCQkJJGRpbWVuc2lvblsxXSA9IFBIUEV4Y2VsX0NlbGw6OmNvb3JkaW5hdGVGcm9tU3RyaW5nKCRkaW1lbnNpb25bMV0pOwoJCQkkZGltZW5zaW9uWzFdWzBdID0gUEhQRXhjZWxfQ2VsbDo6Y29sdW1uSW5kZXhGcm9tU3RyaW5nKCRkaW1lbnNpb25bMV1bMF0pIC0gMTsKCgkJCS8vIHJvdyBtaW4sbWF4CgkJCSRyb3dNaW4gPSAkZGltZW5zaW9uWzBdWzFdOwoJCQkkcm93TWF4ID0gJGRpbWVuc2lvblsxXVsxXTsKCgkJCS8vIGNhbGN1bGF0ZSBzdGFydCBvZiA8dGJvZHk+LCA8dGhlYWQ+CgkJCSR0Ym9keVN0YXJ0ID0gJHJvd01pbjsKCQkJJHRib2R5RW5kICAgPSAkcm93TWF4OwoJCQkkdGhlYWRTdGFydCA9ICR0aGVhZEVuZCAgID0gMDsgLy8gZGVmYXVsdDogbm8gPHRoZWFkPglubyA8L3RoZWFkPgoJCQlpZiAoJHNoZWV0LT5nZXRQYWdlU2V0dXAoKS0+aXNSb3dzVG9SZXBlYXRBdFRvcFNldCgpKSB7CgkJCQkkcm93c1RvUmVwZWF0QXRUb3AgPSAkc2hlZXQtPmdldFBhZ2VTZXR1cCgpLT5nZXRSb3dzVG9SZXBlYXRBdFRvcCgpOwoKCQkJCS8vIHdlIGNhbiBvbmx5IHN1cHBvcnQgcmVwZWF0aW5nIHJvd3MgdGhhdCBzdGFydCBhdCB0b3Agcm93CgkJCQlpZiAoJHJvd3NUb1JlcGVhdEF0VG9wWzBdID09IDEpIHsKCQkJCQkkdGhlYWRTdGFydCA9ICRyb3dzVG9SZXBlYXRBdFRvcFswXTsKCQkJCQkkdGhlYWRFbmQgICA9ICRyb3dzVG9SZXBlYXRBdFRvcFsxXTsKCQkJCQkkdGJvZHlTdGFydCA9ICRyb3dzVG9SZXBlYXRBdFRvcFsxXSArIDE7CgkJCQl9CgkJCX0KCgkJCS8vIExvb3AgdGhyb3VnaCBjZWxscwoJCQkkcm93ID0gJHJvd01pbi0xOwoJCQl3aGlsZSgkcm93KysgPCAkcm93TWF4KSB7CgkJCQkvLyA8dGhlYWQ+ID8KCQkJCWlmICgkcm93ID09ICR0aGVhZFN0YXJ0KSB7CgkJCQkJJGh0bWwgLj0gJwkJPHRoZWFkPicgLiBQSFBfRU9MOwoJCQkJfQoKCQkJCS8vIDx0Ym9keT4gPwoJCQkJaWYgKCRyb3cgPT0gJHRib2R5U3RhcnQpIHsKCQkJCQkkaHRtbCAuPSAnCQk8dGJvZHk+JyAuIFBIUF9FT0w7CgkJCQl9CgoJCQkJLy8gV3JpdGUgcm93IGlmIHRoZXJlIGFyZSBIVE1MIHRhYmxlIGNlbGxzIGluIGl0CgkJCQlpZiAoICFpc3NldCgkdGhpcy0+X2lzU3Bhbm5lZFJvd1skc2hlZXQtPmdldFBhcmVudCgpLT5nZXRJbmRleCgkc2hlZXQpXVskcm93XSkgKSB7CgkJCQkJLy8gU3RhcnQgYSBuZXcgcm93RGF0YQoJCQkJCSRyb3dEYXRhID0gYXJyYXkoKTsKCQkJCQkvLyBMb29wIHRocm91Z2ggY29sdW1ucwoJCQkJCSRjb2x1bW4gPSAkZGltZW5zaW9uWzBdWzBdIC0gMTsKCQkJCQl3aGlsZSgkY29sdW1uKysgPCAkZGltZW5zaW9uWzFdWzBdKSB7CgkJCQkJCS8vIENlbGwgZXhpc3RzPwoJCQkJCQlpZiAoJHNoZWV0LT5jZWxsRXhpc3RzQnlDb2x1bW5BbmRSb3coJGNvbHVtbiwgJHJvdykpIHsKCQkJCQkJCSRyb3dEYXRhWyRjb2x1bW5dID0gJHNoZWV0LT5nZXRDZWxsQnlDb2x1bW5BbmRSb3coJGNvbHVtbiwgJHJvdyk7CgkJCQkJCX0gZWxzZSB7CgkJCQkJCQkkcm93RGF0YVskY29sdW1uXSA9ICcnOwoJCQkJCQl9CgkJCQkJfQoJCQkJCSRodG1sIC49ICR0aGlzLT5fZ2VuZXJhdGVSb3coJHNoZWV0LCAkcm93RGF0YSwgJHJvdyAtIDEpOwoJCQkJfQoKCQkJCS8vIDwvdGhlYWQ+ID8KCQkJCWlmICgkcm93ID09ICR0aGVhZEVuZCkgewoJCQkJCSRodG1sIC49ICcJCTwvdGhlYWQ+JyAuIFBIUF9FT0w7CgkJCQl9CgoJCQkJLy8gPC90Ym9keT4gPwoJCQkJaWYgKCRyb3cgPT0gJHRib2R5RW5kKSB7CgkJCQkJJGh0bWwgLj0gJwkJPC90Ym9keT4nIC4gUEhQX0VPTDsKCQkJCX0KCQkJfQoKCQkJLy8gV3JpdGUgdGFibGUgZm9vdGVyCgkJCSRodG1sIC49ICR0aGlzLT5fZ2VuZXJhdGVUYWJsZUZvb3RlcigpOwoKCQkJLy8gV3JpdGluZyBQREY/CgkJCWlmICgkdGhpcy0+X2lzUGRmKSB7CgkJCQlpZiAoaXNfbnVsbCgkdGhpcy0+X3NoZWV0SW5kZXgpICYmICRzaGVldElkICsgMSA8ICR0aGlzLT5fcGhwRXhjZWwtPmdldFNoZWV0Q291bnQoKSkgewoJCQkJCSRodG1sIC49ICc8ZGl2IHN0eWxlPSJwYWdlLWJyZWFrLWJlZm9yZTphbHdheXMiIC8+JzsKCQkJCX0KCQkJfQoKCQkJLy8gTmV4dCBzaGVldAoJCQkrKyRzaGVldElkOwoJCX0KCgkJLy8gUmV0dXJuCgkJcmV0dXJuICRodG1sOwoJfQoKCS8qKgoJICogR2VuZXJhdGUgc2hlZXQgdGFicwoJICoKCSAqIEByZXR1cm4Jc3RyaW5nCgkgKiBAdGhyb3dzIEV4Y2VwdGlvbgoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2VuZXJhdGVOYXZpZ2F0aW9uKCkKCXsKCQkvLyBQSFBFeGNlbCBvYmplY3Qga25vd24/CgkJaWYgKGlzX251bGwoJHRoaXMtPl9waHBFeGNlbCkpIHsKCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbignSW50ZXJuYWwgUEhQRXhjZWwgb2JqZWN0IG5vdCBzZXQgdG8gYW4gaW5zdGFuY2Ugb2YgYW4gb2JqZWN0LicpOwoJCX0KCgkJLy8gRmV0Y2ggc2hlZXRzCgkJJHNoZWV0cyA9IGFycmF5KCk7CgkJaWYgKGlzX251bGwoJHRoaXMtPl9zaGVldEluZGV4KSkgewoJCQkkc2hlZXRzID0gJHRoaXMtPl9waHBFeGNlbC0+Z2V0QWxsU2hlZXRzKCk7CgkJfSBlbHNlIHsKCQkJJHNoZWV0c1tdID0gJHRoaXMtPl9waHBFeGNlbC0+Z2V0U2hlZXQoJHRoaXMtPl9zaGVldEluZGV4KTsKCQl9CgoJCS8vIENvbnN0cnVjdCBIVE1MCgkJJGh0bWwgPSAnJzsKCgkJLy8gT25seSBpZiB0aGVyZSBhcmUgbW9yZSB0aGFuIDEgc2hlZXRzCgkJaWYgKGNvdW50KCRzaGVldHMpID4gMSkgewoJCQkvLyBMb29wIGFsbCBzaGVldHMKCQkJJHNoZWV0SWQgPSAwOwoKCQkJJGh0bWwgLj0gJzx1bCBjbGFzcz0ibmF2aWdhdGlvbiI+JyAuIFBIUF9FT0w7CgoJCQlmb3JlYWNoICgkc2hlZXRzIGFzICRzaGVldCkgewoJCQkJJGh0bWwgLj0gJyAgPGxpIGNsYXNzPSJzaGVldCcgLiAkc2hlZXRJZCAuICciPjxhIGhyZWY9IiNzaGVldCcgLiAkc2hlZXRJZCAuICciPicgLiAkc2hlZXQtPmdldFRpdGxlKCkgLiAnPC9hPjwvbGk+JyAuIFBIUF9FT0w7CgkJCQkrKyRzaGVldElkOwoJCQl9CgoJCQkkaHRtbCAuPSAnPC91bD4nIC4gUEhQX0VPTDsKCQl9CgoJCXJldHVybiAkaHRtbDsKCX0KCgkvKioKCSAqIEdlbmVyYXRlIGltYWdlIHRhZyBpbiBjZWxsCgkgKgoJICogQHBhcmFtCVBIUEV4Y2VsX1dvcmtzaGVldAkkcFNoZWV0CQkJUEhQRXhjZWxfV29ya3NoZWV0CgkgKiBAcGFyYW0Jc3RyaW5nCQkJCSRjb29yZGluYXRlcwlDZWxsIGNvb3JkaW5hdGVzCgkgKiBAcmV0dXJuCXN0cmluZwoJICogQHRocm93cwlFeGNlcHRpb24KCSAqLwoJcHJpdmF0ZSBmdW5jdGlvbiBfd3JpdGVJbWFnZVRhZ0luQ2VsbChQSFBFeGNlbF9Xb3Jrc2hlZXQgJHBTaGVldCwgJGNvb3JkaW5hdGVzKSB7CgkJLy8gQ29uc3RydWN0IEhUTUwKCQkkaHRtbCA9ICcnOwoKCQkvLyBXcml0ZSBpbWFnZXMKCQlmb3JlYWNoICgkcFNoZWV0LT5nZXREcmF3aW5nQ29sbGVjdGlvbigpIGFzICRkcmF3aW5nKSB7CgkJCWlmICgkZHJhd2luZyBpbnN0YW5jZW9mIFBIUEV4Y2VsX1dvcmtzaGVldF9EcmF3aW5nKSB7CgkJCQlpZiAoJGRyYXdpbmctPmdldENvb3JkaW5hdGVzKCkgPT0gJGNvb3JkaW5hdGVzKSB7CgkJCQkJJGZpbGVuYW1lID0gJGRyYXdpbmctPmdldFBhdGgoKTsKCgkJCQkJLy8gU3RyaXAgb2ZmIGV2ZW50dWFsICcuJwoJCQkJCWlmIChzdWJzdHIoJGZpbGVuYW1lLCAwLCAxKSA9PSAnLicpIHsKCQkJCQkJJGZpbGVuYW1lID0gc3Vic3RyKCRmaWxlbmFtZSwgMSk7CgkJCQkJfQoKCQkJCQkvLyBQcmVwZW5kIGltYWdlcyByb290CgkJCQkJJGZpbGVuYW1lID0gJHRoaXMtPmdldEltYWdlc1Jvb3QoKSAuICRmaWxlbmFtZTsKCgkJCQkJLy8gU3RyaXAgb2ZmIGV2ZW50dWFsICcuJwoJCQkJCWlmIChzdWJzdHIoJGZpbGVuYW1lLCAwLCAxKSA9PSAnLicgJiYgc3Vic3RyKCRmaWxlbmFtZSwgMCwgMikgIT0gJy4vJykgewoJCQkJCQkkZmlsZW5hbWUgPSBzdWJzdHIoJGZpbGVuYW1lLCAxKTsKCQkJCQl9CgoJCQkJCS8vIENvbnZlcnQgVVRGOCBkYXRhIHRvIFBDREFUQQoJCQkJCSRmaWxlbmFtZSA9IGh0bWxzcGVjaWFsY2hhcnMoJGZpbGVuYW1lKTsKCgkJCQkJJGh0bWwgLj0gUEhQX0VPTDsKCQkJCQkkaHRtbCAuPSAnCQk8aW1nIHN0eWxlPSJwb3NpdGlvbjogcmVsYXRpdmU7IGxlZnQ6ICcgLiAkZHJhd2luZy0+Z2V0T2Zmc2V0WCgpIC4gJ3B4OyB0b3A6ICcgLiAkZHJhd2luZy0+Z2V0T2Zmc2V0WSgpIC4gJ3B4OyB3aWR0aDogJyAuICRkcmF3aW5nLT5nZXRXaWR0aCgpIC4gJ3B4OyBoZWlnaHQ6ICcgLiAkZHJhd2luZy0+Z2V0SGVpZ2h0KCkgLiAncHg7IiBzcmM9IicgLiAkZmlsZW5hbWUgLiAnIiBib3JkZXI9IjAiIHdpZHRoPSInIC4gJGRyYXdpbmctPmdldFdpZHRoKCkgLiAnIiBoZWlnaHQ9IicgLiAkZHJhd2luZy0+Z2V0SGVpZ2h0KCkgLiAnIiAvPicgLiBQSFBfRU9MOwoJCQkJfQoJCQl9CgkJfQoKCQkvLyBSZXR1cm4KCQlyZXR1cm4gJGh0bWw7Cgl9CgoJLyoqCgkgKiBHZW5lcmF0ZSBDU1Mgc3R5bGVzCgkgKgoJICogQHBhcmFtCWJvb2xlYW4JJGdlbmVyYXRlU3Vycm91bmRpbmdIVE1MCUdlbmVyYXRlIHN1cnJvdW5kaW5nIEhUTUwgdGFncz8gKDxzdHlsZT4gYW5kIDwvc3R5bGU+KQoJICogQHJldHVybglzdHJpbmcKCSAqIEB0aHJvd3MJRXhjZXB0aW9uCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZW5lcmF0ZVN0eWxlcygkZ2VuZXJhdGVTdXJyb3VuZGluZ0hUTUwgPSB0cnVlKSB7CgkJLy8gUEhQRXhjZWwgb2JqZWN0IGtub3duPwoJCWlmIChpc19udWxsKCR0aGlzLT5fcGhwRXhjZWwpKSB7CgkJCXRocm93IG5ldyBFeGNlcHRpb24oJ0ludGVybmFsIFBIUEV4Y2VsIG9iamVjdCBub3Qgc2V0IHRvIGFuIGluc3RhbmNlIG9mIGFuIG9iamVjdC4nKTsKCQl9CgoJCS8vIEJ1aWxkIENTUwoJCSRjc3MgPSAkdGhpcy0+YnVpbGRDU1MoJGdlbmVyYXRlU3Vycm91bmRpbmdIVE1MKTsKCgkJLy8gQ29uc3RydWN0IEhUTUwKCQkkaHRtbCA9ICcnOwoKCQkvLyBTdGFydCBzdHlsZXMKCQlpZiAoJGdlbmVyYXRlU3Vycm91bmRpbmdIVE1MKSB7CgkJCSRodG1sIC49ICcJPHN0eWxlIHR5cGU9InRleHQvY3NzIj4nIC4gUEhQX0VPTDsKCQkJJGh0bWwgLj0gJwkgIGh0bWwgeyAnIC4gJHRoaXMtPl9hc3NlbWJsZUNTUygkY3NzWydodG1sJ10pIC4gJyB9JyAuIFBIUF9FT0w7CgkJfQoKCQkvLyBXcml0ZSBhbGwgb3RoZXIgc3R5bGVzCgkJZm9yZWFjaCAoJGNzcyBhcyAkc3R5bGVOYW1lID0+ICRzdHlsZURlZmluaXRpb24pIHsKCQkJaWYgKCRzdHlsZU5hbWUgIT0gJ2h0bWwnKSB7CgkJCQkkaHRtbCAuPSAnCSAgJyAuICRzdHlsZU5hbWUgLiAnIHsgJyAuICR0aGlzLT5fYXNzZW1ibGVDU1MoJHN0eWxlRGVmaW5pdGlvbikgLiAnIH0nIC4gUEhQX0VPTDsKCQkJfQoJCX0KCgkJLy8gRW5kIHN0eWxlcwoJCWlmICgkZ2VuZXJhdGVTdXJyb3VuZGluZ0hUTUwpIHsKCQkJJGh0bWwgLj0gJwk8L3N0eWxlPicgLiBQSFBfRU9MOwoJCX0KCgkJLy8gUmV0dXJuCgkJcmV0dXJuICRodG1sOwoJfQoKCS8qKgoJICogQnVpbGQgQ1NTIHN0eWxlcwoJICoKCSAqIEBwYXJhbQlib29sZWFuCSRnZW5lcmF0ZVN1cnJvdW5kaW5nSFRNTAlHZW5lcmF0ZSBzdXJyb3VuZGluZyBIVE1MIHN0eWxlPyAoaHRtbCB7IH0pCgkgKiBAcmV0dXJuCWFycmF5CgkgKiBAdGhyb3dzCUV4Y2VwdGlvbgoJICovCglwdWJsaWMgZnVuY3Rpb24gYnVpbGRDU1MoJGdlbmVyYXRlU3Vycm91bmRpbmdIVE1MID0gdHJ1ZSkgewoJCS8vIFBIUEV4Y2VsIG9iamVjdCBrbm93bj8KCQlpZiAoaXNfbnVsbCgkdGhpcy0+X3BocEV4Y2VsKSkgewoJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCdJbnRlcm5hbCBQSFBFeGNlbCBvYmplY3Qgbm90IHNldCB0byBhbiBpbnN0YW5jZSBvZiBhbiBvYmplY3QuJyk7CgkJfQoKCQkvLyBDYWNoZWQ/CgkJaWYgKCFpc19udWxsKCR0aGlzLT5fY3NzU3R5bGVzKSkgewoJCQlyZXR1cm4gJHRoaXMtPl9jc3NTdHlsZXM7CgkJfQoKCQkvLyBFbnN1cmUgdGhhdCBzcGFucyBoYXZlIGJlZW4gY2FsY3VsYXRlZAoJCWlmICghJHRoaXMtPl9zcGFuc0FyZUNhbGN1bGF0ZWQpIHsKCQkJJHRoaXMtPl9jYWxjdWxhdGVTcGFucygpOwoJCX0KCgkJLy8gQ29uc3RydWN0IENTUwoJCSRjc3MgPSBhcnJheSgpOwoKCQkvLyBTdGFydCBzdHlsZXMKCQlpZiAoJGdlbmVyYXRlU3Vycm91bmRpbmdIVE1MKSB7CgkJCS8vIGh0bWwgeyB9CgkJCSRjc3NbJ2h0bWwnXVsnZm9udC1mYW1pbHknXQkgID0gJ0NhbGlicmksIEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWYnOwoJCQkkY3NzWydodG1sJ11bJ2ZvbnQtc2l6ZSddCQk9ICcxMXB0JzsKCQkJJGNzc1snaHRtbCddWydiYWNrZ3JvdW5kLWNvbG9yJ10gPSAnd2hpdGUnOwoJCX0KCgoJCS8vIHRhYmxlIHsgfQoJCSRjc3NbJ3RhYmxlJ11bJ2JvcmRlci1jb2xsYXBzZSddICA9ICdjb2xsYXBzZSc7CgkJJGNzc1sndGFibGUnXVsncGFnZS1icmVhay1hZnRlciddID0gJ2Fsd2F5cyc7CgoJCS8vIC5ncmlkbGluZXMgdGQgeyB9CgkJJGNzc1snLmdyaWRsaW5lcyB0ZCddWydib3JkZXInXSA9ICcxcHggZG90dGVkIGJsYWNrJzsKCgkJLy8gLmIge30KCQkkY3NzWycuYiddWyd0ZXh0LWFsaWduJ10gPSAnY2VudGVyJzsgLy8gQk9PTAoKCQkvLyAuZSB7fQoJCSRjc3NbJy5lJ11bJ3RleHQtYWxpZ24nXSA9ICdjZW50ZXInOyAvLyBFUlJPUgoKCQkvLyAuZiB7fQoJCSRjc3NbJy5mJ11bJ3RleHQtYWxpZ24nXSA9ICdyaWdodCc7IC8vIEZPUk1VTEEKCgkJLy8gLmlubGluZVN0ciB7fQoJCSRjc3NbJy5pbmxpbmVTdHInXVsndGV4dC1hbGlnbiddID0gJ2xlZnQnOyAvLyBJTkxJTkUKCgkJLy8gLm4ge30KCQkkY3NzWycubiddWyd0ZXh0LWFsaWduJ10gPSAncmlnaHQnOyAvLyBOVU1FUklDCgoJCS8vIC5zIHt9CgkJJGNzc1snLnMnXVsndGV4dC1hbGlnbiddID0gJ2xlZnQnOyAvLyBTVFJJTkcKCgkJLy8gQ2FsY3VsYXRlIGNlbGwgc3R5bGUgaGFzaGVzCgkJZm9yZWFjaCAoJHRoaXMtPl9waHBFeGNlbC0+Z2V0Q2VsbFhmQ29sbGVjdGlvbigpIGFzICRpbmRleCA9PiAkc3R5bGUpIHsKCQkJJGNzc1sndGQuc3R5bGUnIC4gJGluZGV4XSA9ICR0aGlzLT5fY3JlYXRlQ1NTU3R5bGUoICRzdHlsZSApOwoJCX0KCgkJLy8gRmV0Y2ggc2hlZXRzCgkJJHNoZWV0cyA9IGFycmF5KCk7CgkJaWYgKGlzX251bGwoJHRoaXMtPl9zaGVldEluZGV4KSkgewoJCQkkc2hlZXRzID0gJHRoaXMtPl9waHBFeGNlbC0+Z2V0QWxsU2hlZXRzKCk7CgkJfSBlbHNlIHsKCQkJJHNoZWV0c1tdID0gJHRoaXMtPl9waHBFeGNlbC0+Z2V0U2hlZXQoJHRoaXMtPl9zaGVldEluZGV4KTsKCQl9CgoJCS8vIEJ1aWxkIHN0eWxlcyBwZXIgc2hlZXQKCQlmb3JlYWNoICgkc2hlZXRzIGFzICRzaGVldCkgewoJCQkvLyBDYWxjdWxhdGUgaGFzaCBjb2RlCgkJCSRzaGVldEluZGV4ID0gJHNoZWV0LT5nZXRQYXJlbnQoKS0+Z2V0SW5kZXgoJHNoZWV0KTsKCgkJCS8vIEJ1aWxkIHN0eWxlcwoJCQkvLyBDYWxjdWxhdGUgY29sdW1uIHdpZHRocwoJCQkkc2hlZXQtPmNhbGN1bGF0ZUNvbHVtbldpZHRocygpOwoKCQkJLy8gY29sIGVsZW1lbnRzLCBpbml0aWFsaXplCgkJCSRoaWdoZXN0Q29sdW1uSW5kZXggPSBQSFBFeGNlbF9DZWxsOjpjb2x1bW5JbmRleEZyb21TdHJpbmcoJHNoZWV0LT5nZXRIaWdoZXN0Q29sdW1uKCkpIC0gMTsKCQkJJGNvbHVtbiA9IC0xOwoJCQl3aGlsZSgkY29sdW1uKysgPCAkaGlnaGVzdENvbHVtbkluZGV4KSB7CgkJCQkkdGhpcy0+X2NvbHVtbldpZHRoc1skc2hlZXRJbmRleF1bJGNvbHVtbl0gPSA0MjsgLy8gYXBwcm94aW1hdGlvbgoJCQkJJGNzc1sndGFibGUuc2hlZXQnIC4gJHNoZWV0SW5kZXggLiAnIGNvbC5jb2wnIC4gJGNvbHVtbl1bJ3dpZHRoJ10gPSAnNDJwdCc7CgkJCX0KCgkJCS8vIGNvbCBlbGVtZW50cywgbG9vcCB0aHJvdWdoIGNvbHVtbkRpbWVuc2lvbnMgYW5kIHNldCB3aWR0aAoJCQlmb3JlYWNoICgkc2hlZXQtPmdldENvbHVtbkRpbWVuc2lvbnMoKSBhcyAkY29sdW1uRGltZW5zaW9uKSB7CgkJCQlpZiAoKCR3aWR0aCA9IFBIUEV4Y2VsX1NoYXJlZF9EcmF3aW5nOjpjZWxsRGltZW5zaW9uVG9QaXhlbHMoJGNvbHVtbkRpbWVuc2lvbi0+Z2V0V2lkdGgoKSwgJHRoaXMtPl9kZWZhdWx0Rm9udCkpID49IDApIHsKCQkJCQkkd2lkdGggPSBQSFBFeGNlbF9TaGFyZWRfRHJhd2luZzo6cGl4ZWxzVG9Qb2ludHMoJHdpZHRoKTsKCQkJCQkkY29sdW1uID0gUEhQRXhjZWxfQ2VsbDo6Y29sdW1uSW5kZXhGcm9tU3RyaW5nKCRjb2x1bW5EaW1lbnNpb24tPmdldENvbHVtbkluZGV4KCkpIC0gMTsKCQkJCQkkdGhpcy0+X2NvbHVtbldpZHRoc1skc2hlZXRJbmRleF1bJGNvbHVtbl0gPSAkd2lkdGg7CgkJCQkJJGNzc1sndGFibGUuc2hlZXQnIC4gJHNoZWV0SW5kZXggLiAnIGNvbC5jb2wnIC4gJGNvbHVtbl1bJ3dpZHRoJ10gPSAkd2lkdGggLiAncHQnOwoKCQkJCQlpZiAoJGNvbHVtbkRpbWVuc2lvbi0+Z2V0VmlzaWJsZSgpID09PSBmYWxzZSkgewoJCQkJCQkkY3NzWyd0YWJsZS5zaGVldCcgLiAkc2hlZXRJbmRleCAuICcgY29sLmNvbCcgLiAkY29sdW1uXVsndmlzaWJpbGl0eSddID0gJ2NvbGxhcHNlJzsKCQkJCQkJJGNzc1sndGFibGUuc2hlZXQnIC4gJHNoZWV0SW5kZXggLiAnIGNvbC5jb2wnIC4gJGNvbHVtbl1bJypkaXNwbGF5J10gPSAnbm9uZSc7IC8vIHRhcmdldCBJRTYrNwoJCQkJCX0KCQkJCX0KCQkJfQoKCQkJLy8gRGVmYXVsdCByb3cgaGVpZ2h0CgkJCSRyb3dEaW1lbnNpb24gPSAkc2hlZXQtPmdldERlZmF1bHRSb3dEaW1lbnNpb24oKTsKCgkJCS8vIHRhYmxlLnNoZWV0TiB0ciB7IH0KCQkJJGNzc1sndGFibGUuc2hlZXQnIC4gJHNoZWV0SW5kZXggLiAnIHRyJ10gPSBhcnJheSgpOwoKCQkJaWYgKCRyb3dEaW1lbnNpb24tPmdldFJvd0hlaWdodCgpID09IC0xKSB7CgkJCQkkcHRfaGVpZ2h0ID0gUEhQRXhjZWxfU2hhcmVkX0ZvbnQ6OmdldERlZmF1bHRSb3dIZWlnaHRCeUZvbnQoJHRoaXMtPl9waHBFeGNlbC0+Z2V0RGVmYXVsdFN0eWxlKCktPmdldEZvbnQoKSk7CgkJCX0gZWxzZSB7CgkJCQkkcHRfaGVpZ2h0ID0gJHJvd0RpbWVuc2lvbi0+Z2V0Um93SGVpZ2h0KCk7CgkJCX0KCQkJJGNzc1sndGFibGUuc2hlZXQnIC4gJHNoZWV0SW5kZXggLiAnIHRyJ11bJ2hlaWdodCddID0gJHB0X2hlaWdodCAuICdwdCc7CgkJCWlmICgkcm93RGltZW5zaW9uLT5nZXRWaXNpYmxlKCkgPT09IGZhbHNlKSB7CgkJCQkkY3NzWyd0YWJsZS5zaGVldCcgLiAkc2hlZXRJbmRleCAuICcgdHInXVsnZGlzcGxheSddCT0gJ25vbmUnOwoJCQkJJGNzc1sndGFibGUuc2hlZXQnIC4gJHNoZWV0SW5kZXggLiAnIHRyJ11bJ3Zpc2liaWxpdHknXSA9ICdoaWRkZW4nOwoJCQl9CgoJCQkvLyBDYWxjdWxhdGUgcm93IGhlaWdodHMKCQkJZm9yZWFjaCAoJHNoZWV0LT5nZXRSb3dEaW1lbnNpb25zKCkgYXMgJHJvd0RpbWVuc2lvbikgewoJCQkJJHJvdyA9ICRyb3dEaW1lbnNpb24tPmdldFJvd0luZGV4KCkgLSAxOwoKCQkJCS8vIHRhYmxlLnNoZWV0TiB0ci5yb3dZWVlZWVkgeyB9CgkJCQkkY3NzWyd0YWJsZS5zaGVldCcgLiAkc2hlZXRJbmRleCAuICcgdHIucm93JyAuICRyb3ddID0gYXJyYXkoKTsKCgkJCQlpZiAoJHJvd0RpbWVuc2lvbi0+Z2V0Um93SGVpZ2h0KCkgPT0gLTEpIHsKCQkJCQkkcHRfaGVpZ2h0ID0gUEhQRXhjZWxfU2hhcmVkX0ZvbnQ6OmdldERlZmF1bHRSb3dIZWlnaHRCeUZvbnQoJHRoaXMtPl9waHBFeGNlbC0+Z2V0RGVmYXVsdFN0eWxlKCktPmdldEZvbnQoKSk7CgkJCQl9IGVsc2UgewoJCQkJCSRwdF9oZWlnaHQgPSAkcm93RGltZW5zaW9uLT5nZXRSb3dIZWlnaHQoKTsKCQkJCX0KCQkJCSRjc3NbJ3RhYmxlLnNoZWV0JyAuICRzaGVldEluZGV4IC4gJyB0ci5yb3cnIC4gJHJvd11bJ2hlaWdodCddID0gJHB0X2hlaWdodCAuICdwdCc7CgkJCQlpZiAoJHJvd0RpbWVuc2lvbi0+Z2V0VmlzaWJsZSgpID09PSBmYWxzZSkgewoJCQkJCSRjc3NbJ3RhYmxlLnNoZWV0JyAuICRzaGVldEluZGV4IC4gJyB0ci5yb3cnIC4gJHJvd11bJ2Rpc3BsYXknXSA9ICdub25lJzsKCQkJCQkkY3NzWyd0YWJsZS5zaGVldCcgLiAkc2hlZXRJbmRleCAuICcgdHIucm93JyAuICRyb3ddWyd2aXNpYmlsaXR5J10gPSAnaGlkZGVuJzsKCQkJCX0KCQkJfQoJCX0KCgkJLy8gQ2FjaGUKCQlpZiAoaXNfbnVsbCgkdGhpcy0+X2Nzc1N0eWxlcykpIHsKCQkJJHRoaXMtPl9jc3NTdHlsZXMgPSAkY3NzOwoJCX0KCgkJLy8gUmV0dXJuCgkJcmV0dXJuICRjc3M7Cgl9CgoJLyoqCgkgKiBDcmVhdGUgQ1NTIHN0eWxlCgkgKgoJICogQHBhcmFtCVBIUEV4Y2VsX1N0eWxlCQkkcFN0eWxlCQkJUEhQRXhjZWxfU3R5bGUKCSAqIEByZXR1cm4JYXJyYXkKCSAqLwoJcHJpdmF0ZSBmdW5jdGlvbiBfY3JlYXRlQ1NTU3R5bGUoUEhQRXhjZWxfU3R5bGUgJHBTdHlsZSkgewoJCS8vIENvbnN0cnVjdCBDU1MKCQkkY3NzID0gJyc7CgoJCS8vIENyZWF0ZSBDU1MKCQkkY3NzID0gYXJyYXlfbWVyZ2UoCgkJCSR0aGlzLT5fY3JlYXRlQ1NTU3R5bGVBbGlnbm1lbnQoJHBTdHlsZS0+Z2V0QWxpZ25tZW50KCkpCgkJCSwgJHRoaXMtPl9jcmVhdGVDU1NTdHlsZUJvcmRlcnMoJHBTdHlsZS0+Z2V0Qm9yZGVycygpKQoJCQksICR0aGlzLT5fY3JlYXRlQ1NTU3R5bGVGb250KCRwU3R5bGUtPmdldEZvbnQoKSkKCQkJLCAkdGhpcy0+X2NyZWF0ZUNTU1N0eWxlRmlsbCgkcFN0eWxlLT5nZXRGaWxsKCkpCgkJKTsKCgkJLy8gUmV0dXJuCgkJcmV0dXJuICRjc3M7Cgl9CgoJLyoqCgkgKiBDcmVhdGUgQ1NTIHN0eWxlIChQSFBFeGNlbF9TdHlsZV9BbGlnbm1lbnQpCgkgKgoJICogQHBhcmFtCVBIUEV4Y2VsX1N0eWxlX0FsaWdubWVudAkJJHBTdHlsZQkJCVBIUEV4Y2VsX1N0eWxlX0FsaWdubWVudAoJICogQHJldHVybglhcnJheQoJICovCglwcml2YXRlIGZ1bmN0aW9uIF9jcmVhdGVDU1NTdHlsZUFsaWdubWVudChQSFBFeGNlbF9TdHlsZV9BbGlnbm1lbnQgJHBTdHlsZSkgewoJCS8vIENvbnN0cnVjdCBDU1MKCQkkY3NzID0gYXJyYXkoKTsKCgkJLy8gQ3JlYXRlIENTUwoJCSRjc3NbJ3ZlcnRpY2FsLWFsaWduJ10gPSAkdGhpcy0+X21hcFZBbGlnbigkcFN0eWxlLT5nZXRWZXJ0aWNhbCgpKTsKCQlpZiAoJHRleHRBbGlnbiA9ICR0aGlzLT5fbWFwSEFsaWduKCRwU3R5bGUtPmdldEhvcml6b250YWwoKSkpIHsKCQkJJGNzc1sndGV4dC1hbGlnbiddID0gJHRleHRBbGlnbjsKCQl9CgoJCS8vIFJldHVybgoJCXJldHVybiAkY3NzOwoJfQoKCS8qKgoJICogQ3JlYXRlIENTUyBzdHlsZSAoUEhQRXhjZWxfU3R5bGVfRm9udCkKCSAqCgkgKiBAcGFyYW0JUEhQRXhjZWxfU3R5bGVfRm9udAkJJHBTdHlsZQkJCVBIUEV4Y2VsX1N0eWxlX0ZvbnQKCSAqIEByZXR1cm4JYXJyYXkKCSAqLwoJcHJpdmF0ZSBmdW5jdGlvbiBfY3JlYXRlQ1NTU3R5bGVGb250KFBIUEV4Y2VsX1N0eWxlX0ZvbnQgJHBTdHlsZSkgewoJCS8vIENvbnN0cnVjdCBDU1MKCQkkY3NzID0gYXJyYXkoKTsKCgkJLy8gQ3JlYXRlIENTUwoJCWlmICgkcFN0eWxlLT5nZXRCb2xkKCkpIHsKCQkJJGNzc1snZm9udC13ZWlnaHQnXSA9ICdib2xkJzsKCQl9CgkJaWYgKCRwU3R5bGUtPmdldFVuZGVybGluZSgpICE9IFBIUEV4Y2VsX1N0eWxlX0ZvbnQ6OlVOREVSTElORV9OT05FICYmICRwU3R5bGUtPmdldFN0cmlrZXRocm91Z2goKSkgewoJCQkkY3NzWyd0ZXh0LWRlY29yYXRpb24nXSA9ICd1bmRlcmxpbmUgbGluZS10aHJvdWdoJzsKCQl9IGVsc2UgaWYgKCRwU3R5bGUtPmdldFVuZGVybGluZSgpICE9IFBIUEV4Y2VsX1N0eWxlX0ZvbnQ6OlVOREVSTElORV9OT05FKSB7CgkJCSRjc3NbJ3RleHQtZGVjb3JhdGlvbiddID0gJ3VuZGVybGluZSc7CgkJfSBlbHNlIGlmICgkcFN0eWxlLT5nZXRTdHJpa2V0aHJvdWdoKCkpIHsKCQkJJGNzc1sndGV4dC1kZWNvcmF0aW9uJ10gPSAnbGluZS10aHJvdWdoJzsKCQl9CgkJaWYgKCRwU3R5bGUtPmdldEl0YWxpYygpKSB7CgkJCSRjc3NbJ2ZvbnQtc3R5bGUnXSA9ICdpdGFsaWMnOwoJCX0KCgkJJGNzc1snY29sb3InXQkJPSAnIycgLiAkcFN0eWxlLT5nZXRDb2xvcigpLT5nZXRSR0IoKTsKCQkkY3NzWydmb250LWZhbWlseSddCT0gJ1wnJyAuICRwU3R5bGUtPmdldE5hbWUoKSAuICdcJyc7CgkJJGNzc1snZm9udC1zaXplJ10JPSAkcFN0eWxlLT5nZXRTaXplKCkgLiAncHQnOwoKCQkvLyBSZXR1cm4KCQlyZXR1cm4gJGNzczsKCX0KCgkvKioKCSAqIENyZWF0ZSBDU1Mgc3R5bGUgKFBIUEV4Y2VsX1N0eWxlX0JvcmRlcnMpCgkgKgoJICogQHBhcmFtCVBIUEV4Y2VsX1N0eWxlX0JvcmRlcnMJCSRwU3R5bGUJCQlQSFBFeGNlbF9TdHlsZV9Cb3JkZXJzCgkgKiBAcmV0dXJuCWFycmF5CgkgKi8KCXByaXZhdGUgZnVuY3Rpb24gX2NyZWF0ZUNTU1N0eWxlQm9yZGVycyhQSFBFeGNlbF9TdHlsZV9Cb3JkZXJzICRwU3R5bGUpIHsKCQkvLyBDb25zdHJ1Y3QgQ1NTCgkJJGNzcyA9IGFycmF5KCk7CgoJCS8vIENyZWF0ZSBDU1MKCQkkY3NzWydib3JkZXItYm90dG9tJ10JPSAkdGhpcy0+X2NyZWF0ZUNTU1N0eWxlQm9yZGVyKCRwU3R5bGUtPmdldEJvdHRvbSgpKTsKCQkkY3NzWydib3JkZXItdG9wJ10JCT0gJHRoaXMtPl9jcmVhdGVDU1NTdHlsZUJvcmRlcigkcFN0eWxlLT5nZXRUb3AoKSk7CgkJJGNzc1snYm9yZGVyLWxlZnQnXQkJPSAkdGhpcy0+X2NyZWF0ZUNTU1N0eWxlQm9yZGVyKCRwU3R5bGUtPmdldExlZnQoKSk7CgkJJGNzc1snYm9yZGVyLXJpZ2h0J10JPSAkdGhpcy0+X2NyZWF0ZUNTU1N0eWxlQm9yZGVyKCRwU3R5bGUtPmdldFJpZ2h0KCkpOwoKCQkvLyBSZXR1cm4KCQlyZXR1cm4gJGNzczsKCX0KCgkvKioKCSAqIENyZWF0ZSBDU1Mgc3R5bGUgKFBIUEV4Y2VsX1N0eWxlX0JvcmRlcikKCSAqCgkgKiBAcGFyYW0JUEhQRXhjZWxfU3R5bGVfQm9yZGVyCQkkcFN0eWxlCQkJUEhQRXhjZWxfU3R5bGVfQm9yZGVyCgkgKiBAcmV0dXJuCXN0cmluZwoJICovCglwcml2YXRlIGZ1bmN0aW9uIF9jcmVhdGVDU1NTdHlsZUJvcmRlcihQSFBFeGNlbF9TdHlsZV9Cb3JkZXIgJHBTdHlsZSkgewoJCS8vIENyZWF0ZSBDU1MKCQkkY3NzID0gJHRoaXMtPl9tYXBCb3JkZXJTdHlsZSgkcFN0eWxlLT5nZXRCb3JkZXJTdHlsZSgpKSAuICcgIycgLiAkcFN0eWxlLT5nZXRDb2xvcigpLT5nZXRSR0IoKTsKCgkJLy8gUmV0dXJuCgkJcmV0dXJuICRjc3M7Cgl9CgoJLyoqCgkgKiBDcmVhdGUgQ1NTIHN0eWxlIChQSFBFeGNlbF9TdHlsZV9GaWxsKQoJICoKCSAqIEBwYXJhbQlQSFBFeGNlbF9TdHlsZV9GaWxsCQkkcFN0eWxlCQkJUEhQRXhjZWxfU3R5bGVfRmlsbAoJICogQHJldHVybglhcnJheQoJICovCglwcml2YXRlIGZ1bmN0aW9uIF9jcmVhdGVDU1NTdHlsZUZpbGwoUEhQRXhjZWxfU3R5bGVfRmlsbCAkcFN0eWxlKSB7CgkJLy8gQ29uc3RydWN0IEhUTUwKCQkkY3NzID0gYXJyYXkoKTsKCgkJLy8gQ3JlYXRlIENTUwoJCSR2YWx1ZSA9ICRwU3R5bGUtPmdldEZpbGxUeXBlKCkgPT0gUEhQRXhjZWxfU3R5bGVfRmlsbDo6RklMTF9OT05FID8KCQkJJ3doaXRlJyA6ICcjJyAuICRwU3R5bGUtPmdldFN0YXJ0Q29sb3IoKS0+Z2V0UkdCKCk7CgkJJGNzc1snYmFja2dyb3VuZC1jb2xvciddID0gJHZhbHVlOwoKCQkvLyBSZXR1cm4KCQlyZXR1cm4gJGNzczsKCX0KCgkvKioKCSAqIEdlbmVyYXRlIEhUTUwgZm9vdGVyCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZW5lcmF0ZUhUTUxGb290ZXIoKSB7CgkJLy8gQ29uc3RydWN0IEhUTUwKCQkkaHRtbCA9ICcnOwoJCSRodG1sIC49ICcgIDwvYm9keT4nIC4gUEhQX0VPTDsKCQkkaHRtbCAuPSAnPC9odG1sPicgLiBQSFBfRU9MOwoKCQkvLyBSZXR1cm4KCQlyZXR1cm4gJGh0bWw7Cgl9CgoJLyoqCgkgKiBHZW5lcmF0ZSB0YWJsZSBoZWFkZXIKCSAqCgkgKiBAcGFyYW0JUEhQRXhjZWxfV29ya3NoZWV0CSRwU2hlZXQJCVRoZSB3b3Jrc2hlZXQgZm9yIHRoZSB0YWJsZSB3ZSBhcmUgd3JpdGluZwoJICogQHJldHVybglzdHJpbmcKCSAqIEB0aHJvd3MJRXhjZXB0aW9uCgkgKi8KCXByaXZhdGUgZnVuY3Rpb24gX2dlbmVyYXRlVGFibGVIZWFkZXIoJHBTaGVldCkgewoJCSRzaGVldEluZGV4ID0gJHBTaGVldC0+Z2V0UGFyZW50KCktPmdldEluZGV4KCRwU2hlZXQpOwoKCQkvLyBDb25zdHJ1Y3QgSFRNTAoJCSRodG1sID0gJyc7CgoJCWlmICghJHRoaXMtPl91c2VJbmxpbmVDc3MpIHsKCQkJJGdyaWRsaW5lcyA9ICRwU2hlZXQtPmdldFNob3dHcmlkTGluZXMoKSA/ICcgZ3JpZGxpbmVzJyA6ICcnOwoJCQkkaHRtbCAuPSAnCTx0YWJsZSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgaWQ9InNoZWV0JyAuICRzaGVldEluZGV4IC4gJyIgY2xhc3M9InNoZWV0JyAuICRzaGVldEluZGV4IC4gJGdyaWRsaW5lcyAuICciPicgLiBQSFBfRU9MOwoJCX0gZWxzZSB7CgkJCSRzdHlsZSA9IGlzc2V0KCR0aGlzLT5fY3NzU3R5bGVzWyd0YWJsZSddKSA/CgkJCQkkdGhpcy0+X2Fzc2VtYmxlQ1NTKCR0aGlzLT5fY3NzU3R5bGVzWyd0YWJsZSddKSA6ICcnOwoKCQkJaWYgKCR0aGlzLT5faXNQZGYgJiYgJHBTaGVldC0+Z2V0U2hvd0dyaWRMaW5lcygpKSB7CgkJCQkkaHRtbCAuPSAnCTx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIxIiBpZD0ic2hlZXQnIC4gJHNoZWV0SW5kZXggLiAnIiBjZWxsc3BhY2luZz0iNCIgc3R5bGU9IicgLiAkc3R5bGUgLiAnIj4nIC4gUEhQX0VPTDsKCQkJfSBlbHNlIHsKCQkJCSRodG1sIC49ICcJPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjEiIGlkPSJzaGVldCcgLiAkc2hlZXRJbmRleCAuICciIGNlbGxzcGFjaW5nPSI0IiBzdHlsZT0iJyAuICRzdHlsZSAuICciPicgLiBQSFBfRU9MOwoJCQl9CgkJfQoKCQkvLyBXcml0ZSA8Y29sPiBlbGVtZW50cwoJCSRoaWdoZXN0Q29sdW1uSW5kZXggPSBQSFBFeGNlbF9DZWxsOjpjb2x1bW5JbmRleEZyb21TdHJpbmcoJHBTaGVldC0+Z2V0SGlnaGVzdENvbHVtbigpKSAtIDE7CgkJJGkgPSAtMTsKCQl3aGlsZSgkaSsrIDwgJGhpZ2hlc3RDb2x1bW5JbmRleCkgewoJCQlpZiAoISR0aGlzLT5fdXNlSW5saW5lQ3NzKSB7CgkJCQkkaHRtbCAuPSAnCQk8Y29sIGNsYXNzPSJjb2wnIC4gJGkgLiAnIj4nIC4gUEhQX0VPTDsKCQkJfSBlbHNlIHsKCQkJCSRzdHlsZSA9IGlzc2V0KCR0aGlzLT5fY3NzU3R5bGVzWyd0YWJsZS5zaGVldCcgLiAkc2hlZXRJbmRleCAuICcgY29sLmNvbCcgLiAkaV0pID8KCQkJCQkkdGhpcy0+X2Fzc2VtYmxlQ1NTKCR0aGlzLT5fY3NzU3R5bGVzWyd0YWJsZS5zaGVldCcgLiAkc2hlZXRJbmRleCAuICcgY29sLmNvbCcgLiAkaV0pIDogJyc7CgkJCQkkaHRtbCAuPSAnCQk8Y29sIHN0eWxlPSInIC4gJHN0eWxlIC4gJyI+JyAuIFBIUF9FT0w7CgkJCX0KCQl9CgoJCS8vIFJldHVybgoJCXJldHVybiAkaHRtbDsKCX0KCgkvKioKCSAqIEdlbmVyYXRlIHRhYmxlIGZvb3RlcgoJICoKCSAqIEB0aHJvd3MJRXhjZXB0aW9uCgkgKi8KCXByaXZhdGUgZnVuY3Rpb24gX2dlbmVyYXRlVGFibGVGb290ZXIoKSB7CgkJLy8gQ29uc3RydWN0IEhUTUwKCQkkaHRtbCA9ICcnOwoJCSRodG1sIC49ICcJPC90YWJsZT4nIC4gUEhQX0VPTDsKCgkJLy8gUmV0dXJuCgkJcmV0dXJuICRodG1sOwoJfQoKCS8qKgoJICogR2VuZXJhdGUgcm93CgkgKgoJICogQHBhcmFtCVBIUEV4Y2VsX1dvcmtzaGVldAkkcFNoZWV0CQkJUEhQRXhjZWxfV29ya3NoZWV0CgkgKiBAcGFyYW0JYXJyYXkJCQkJJHBWYWx1ZXMJCUFycmF5IGNvbnRhaW5pbmcgY2VsbHMgaW4gYSByb3cKCSAqIEBwYXJhbQlpbnQJCQkJCSRwUm93CQkJUm93IG51bWJlciAoMC1iYXNlZCkKCSAqIEByZXR1cm4Jc3RyaW5nCgkgKiBAdGhyb3dzCUV4Y2VwdGlvbgoJICovCglwcml2YXRlIGZ1bmN0aW9uIF9nZW5lcmF0ZVJvdyhQSFBFeGNlbF9Xb3Jrc2hlZXQgJHBTaGVldCwgJHBWYWx1ZXMgPSBudWxsLCAkcFJvdyA9IDApIHsKCQlpZiAoaXNfYXJyYXkoJHBWYWx1ZXMpKSB7CgkJCS8vIENvbnN0cnVjdCBIVE1MCgkJCSRodG1sID0gJyc7CgoJCQkvLyBTaGVldCBpbmRleAoJCQkkc2hlZXRJbmRleCA9ICRwU2hlZXQtPmdldFBhcmVudCgpLT5nZXRJbmRleCgkcFNoZWV0KTsKCgkJCS8vIERvbVBERiBhbmQgYnJlYWtzCgkJCWlmICgkdGhpcy0+X2lzUGRmICYmIGNvdW50KCRwU2hlZXQtPmdldEJyZWFrcygpKSA+IDApIHsKCQkJCSRicmVha3MgPSAkcFNoZWV0LT5nZXRCcmVha3MoKTsKCgkJCQkvLyBjaGVjayBpZiBhIGJyZWFrIGlzIG5lZWRlZCBiZWZvcmUgdGhpcyByb3cKCQkJCWlmIChpc3NldCgkYnJlYWtzWydBJyAuICRwUm93XSkpIHsKCQkJCQkvLyBjbG9zZSB0YWJsZTogPC90YWJsZT4KCQkJCQkkaHRtbCAuPSAkdGhpcy0+X2dlbmVyYXRlVGFibGVGb290ZXIoKTsKCgkJCQkJLy8gaW5zZXJ0IHBhZ2UgYnJlYWsKCQkJCQkkaHRtbCAuPSAnPGRpdiBzdHlsZT0icGFnZS1icmVhay1iZWZvcmU6YWx3YXlzIiAvPic7CgoJCQkJCS8vIG9wZW4gdGFibGUgYWdhaW46IDx0YWJsZT4gKyA8Y29sPiBldGMuCgkJCQkJJGh0bWwgLj0gJHRoaXMtPl9nZW5lcmF0ZVRhYmxlSGVhZGVyKCRwU2hlZXQpOwoJCQkJfQoJCQl9CgoJCQkvLyBXcml0ZSByb3cgc3RhcnQKCQkJaWYgKCEkdGhpcy0+X3VzZUlubGluZUNzcykgewoJCQkJJGh0bWwgLj0gJwkJICA8dHIgY2xhc3M9InJvdycgLiAkcFJvdyAuICciPicgLiBQSFBfRU9MOwoJCQl9IGVsc2UgewoJCQkJJHN0eWxlID0gaXNzZXQoJHRoaXMtPl9jc3NTdHlsZXNbJ3RhYmxlLnNoZWV0JyAuICRzaGVldEluZGV4IC4gJyB0ci5yb3cnIC4gJHBSb3ddKQoJCQkJCT8gJHRoaXMtPl9hc3NlbWJsZUNTUygkdGhpcy0+X2Nzc1N0eWxlc1sndGFibGUuc2hlZXQnIC4gJHNoZWV0SW5kZXggLiAnIHRyLnJvdycgLiAkcFJvd10pIDogJyc7CgoJCQkJJGh0bWwgLj0gJwkJICA8dHIgc3R5bGU9IicgLiAkc3R5bGUgLiAnIj4nIC4gUEhQX0VPTDsKCQkJfQoKCQkJLy8gV3JpdGUgY2VsbHMKCQkJJGNvbE51bSA9IDA7CgkJCWZvcmVhY2ggKCRwVmFsdWVzIGFzICRjZWxsKSB7CgkJCQkkY29vcmRpbmF0ZSA9IFBIUEV4Y2VsX0NlbGw6OnN0cmluZ0Zyb21Db2x1bW5JbmRleCgkY29sTnVtKSAuICgkcFJvdyArIDEpOwoKCQkJCWlmICghJHRoaXMtPl91c2VJbmxpbmVDc3MpIHsKCQkJCQkkY3NzQ2xhc3MgPSAnJzsKCQkJCQkkY3NzQ2xhc3MgPSAnY29sdW1uJyAuICRjb2xOdW07CgkJCQl9IGVsc2UgewoJCQkJCSRjc3NDbGFzcyA9IGFycmF5KCk7CgkJCQkJaWYgKGlzc2V0KCR0aGlzLT5fY3NzU3R5bGVzWyd0YWJsZS5zaGVldCcgLiAkc2hlZXRJbmRleCAuICcgdGQuY29sdW1uJyAuICRjb2xOdW1dKSkgewoJCQkJCQkkdGhpcy0+X2Nzc1N0eWxlc1sndGFibGUuc2hlZXQnIC4gJHNoZWV0SW5kZXggLiAnIHRkLmNvbHVtbicgLiAkY29sTnVtXTsKCQkJCQl9CgkJCQl9CgkJCQkkY29sU3BhbiA9IDE7CgkJCQkkcm93U3BhbiA9IDE7CgoJCQkJLy8gaW5pdGlhbGl6ZQoJCQkJJGNlbGxEYXRhID0gJyc7CgoJCQkJLy8gUEhQRXhjZWxfQ2VsbAoJCQkJaWYgKCRjZWxsIGluc3RhbmNlb2YgUEhQRXhjZWxfQ2VsbCkgewoJCQkJCWlmIChpc19udWxsKCRjZWxsLT5nZXRQYXJlbnQoKSkpIHsKCQkJCQkJJGNlbGwtPmF0dGFjaCgkcFNoZWV0KTsKCQkJCQl9CgkJCQkJLy8gVmFsdWUKCQkJCQlpZiAoJGNlbGwtPmdldFZhbHVlKCkgaW5zdGFuY2VvZiBQSFBFeGNlbF9SaWNoVGV4dCkgewoJCQkJCQkvLyBMb29wIHRocm91Z2ggcmljaCB0ZXh0IGVsZW1lbnRzCgkJCQkJCSRlbGVtZW50cyA9ICRjZWxsLT5nZXRWYWx1ZSgpLT5nZXRSaWNoVGV4dEVsZW1lbnRzKCk7CgkJCQkJCWZvcmVhY2ggKCRlbGVtZW50cyBhcyAkZWxlbWVudCkgewoJCQkJCQkJLy8gUmljaCB0ZXh0IHN0YXJ0PwoJCQkJCQkJaWYgKCRlbGVtZW50IGluc3RhbmNlb2YgUEhQRXhjZWxfUmljaFRleHRfUnVuKSB7CgkJCQkJCQkJJGNlbGxEYXRhIC49ICc8c3BhbiBzdHlsZT0iJyAuICR0aGlzLT5fYXNzZW1ibGVDU1MoJHRoaXMtPl9jcmVhdGVDU1NTdHlsZUZvbnQoJGVsZW1lbnQtPmdldEZvbnQoKSkpIC4gJyI+JzsKCgkJCQkJCQkJaWYgKCRlbGVtZW50LT5nZXRGb250KCktPmdldFN1cGVyU2NyaXB0KCkpIHsKCQkJCQkJCQkJJGNlbGxEYXRhIC49ICc8c3VwPic7CgkJCQkJCQkJfSBlbHNlIGlmICgkZWxlbWVudC0+Z2V0Rm9udCgpLT5nZXRTdWJTY3JpcHQoKSkgewoJCQkJCQkJCQkkY2VsbERhdGEgLj0gJzxzdWI+JzsKCQkJCQkJCQl9CgkJCQkJCQl9CgoJCQkJCQkJLy8gQ29udmVydCBVVEY4IGRhdGEgdG8gUENEQVRBCgkJCQkJCQkkY2VsbFRleHQgPSAkZWxlbWVudC0+Z2V0VGV4dCgpOwoJCQkJCQkJJGNlbGxEYXRhIC49IGh0bWxzcGVjaWFsY2hhcnMoJGNlbGxUZXh0KTsKCgkJCQkJCQlpZiAoJGVsZW1lbnQgaW5zdGFuY2VvZiBQSFBFeGNlbF9SaWNoVGV4dF9SdW4pIHsKCQkJCQkJCQlpZiAoJGVsZW1lbnQtPmdldEZvbnQoKS0+Z2V0U3VwZXJTY3JpcHQoKSkgewoJCQkJCQkJCQkkY2VsbERhdGEgLj0gJzwvc3VwPic7CgkJCQkJCQkJfSBlbHNlIGlmICgkZWxlbWVudC0+Z2V0Rm9udCgpLT5nZXRTdWJTY3JpcHQoKSkgewoJCQkJCQkJCQkkY2VsbERhdGEgLj0gJzwvc3ViPic7CgkJCQkJCQkJfQoKCQkJCQkJCQkkY2VsbERhdGEgLj0gJzwvc3Bhbj4nOwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJfSBlbHNlIHsKCQkJCQkJaWYgKCR0aGlzLT5fcHJlQ2FsY3VsYXRlRm9ybXVsYXMpIHsKCQkJCQkJCSRjZWxsRGF0YSA9IFBIUEV4Y2VsX1N0eWxlX051bWJlckZvcm1hdDo6dG9Gb3JtYXR0ZWRTdHJpbmcoCgkJCQkJCQkJJGNlbGwtPmdldENhbGN1bGF0ZWRWYWx1ZSgpLAoJCQkJCQkJCSRwU2hlZXQtPmdldFBhcmVudCgpLT5nZXRDZWxsWGZCeUluZGV4KCAkY2VsbC0+Z2V0WGZJbmRleCgpICktPmdldE51bWJlckZvcm1hdCgpLT5nZXRGb3JtYXRDb2RlKCksCgkJCQkJCQkJYXJyYXkoJHRoaXMsICdmb3JtYXRDb2xvcicpCgkJCQkJCQkpOwoJCQkJCQl9IGVsc2UgewoJCQkJCQkJJGNlbGxEYXRhID0gUEhQRXhjZWxfU3R5bGVfTnVtYmVyRm9ybWF0OjpUb0Zvcm1hdHRlZFN0cmluZygKCQkJCQkJCQkkY2VsbC0+Z2V0VmFsdWUoKSwKCQkJCQkJCQkkcFNoZWV0LT5nZXRQYXJlbnQoKS0+Z2V0Q2VsbFhmQnlJbmRleCggJGNlbGwtPmdldFhmSW5kZXgoKSApLT5nZXROdW1iZXJGb3JtYXQoKS0+Z2V0Rm9ybWF0Q29kZSgpLAoJCQkJCQkJCWFycmF5KCR0aGlzLCAnZm9ybWF0Q29sb3InKQoJCQkJCQkJKTsKCQkJCQkJfQoJCQkJCQlpZiAoJHBTaGVldC0+Z2V0UGFyZW50KCktPmdldENlbGxYZkJ5SW5kZXgoICRjZWxsLT5nZXRYZkluZGV4KCkgKS0+Z2V0Rm9udCgpLT5nZXRTdXBlclNjcmlwdCgpKSB7CgkJCQkJCQkkY2VsbERhdGEgPSAnPHN1cD4nLiRjZWxsRGF0YS4nPC9zdXA+JzsKCQkJCQkJfSBlbHNlaWYgKCRwU2hlZXQtPmdldFBhcmVudCgpLT5nZXRDZWxsWGZCeUluZGV4KCAkY2VsbC0+Z2V0WGZJbmRleCgpICktPmdldEZvbnQoKS0+Z2V0U3ViU2NyaXB0KCkpIHsKCQkJCQkJCSRjZWxsRGF0YSA9ICc8c3ViPicuJGNlbGxEYXRhLic8L3N1Yj4nOwoJCQkJCQl9CgkJCQkJfQoKCQkJCQkvLyBDb252ZXJ0cyB0aGUgY2VsbCBjb250ZW50IHNvIHRoYXQgc3BhY2VzIG9jY3VyaW5nIGF0IGJlZ2lubmluZyBvZiBlYWNoIG5ldyBsaW5lIGFyZSByZXBsYWNlZCBieSAmbmJzcDsKCQkJCQkvLyBFeGFtcGxlOiAiICBIZWxsb1xuIHRvIHRoZSB3b3JsZCIgaXMgY29udmVydGVkIHRvICImbmJzcDsmbmJzcDtIZWxsb1xuJm5ic3A7dG8gdGhlIHdvcmxkIgoJCQkJCSRjZWxsRGF0YSA9IHByZWdfcmVwbGFjZSgiLyg/bSkoPzpefFxcRykgLyIsICcmbmJzcDsnLCAkY2VsbERhdGEpOwoKCQkJCQkvLyBjb252ZXJ0IG5ld2xpbmUgIlxuIiB0byAnPGJyPicKCQkJCQkkY2VsbERhdGEgPSBubDJicigkY2VsbERhdGEpOwoKCQkJCQkvLyBFeHRlbmQgQ1NTIGNsYXNzPwoJCQkJCWlmICghJHRoaXMtPl91c2VJbmxpbmVDc3MpIHsKCQkJCQkJJGNzc0NsYXNzIC49ICcgc3R5bGUnIC4gJGNlbGwtPmdldFhmSW5kZXgoKTsKCQkJCQkJJGNzc0NsYXNzIC49ICcgJyAuICRjZWxsLT5nZXREYXRhVHlwZSgpOwoJCQkJCX0gZWxzZSB7CgkJCQkJCWlmIChpc3NldCgkdGhpcy0+X2Nzc1N0eWxlc1sndGQuc3R5bGUnIC4gJGNlbGwtPmdldFhmSW5kZXgoKV0pKSB7CgkJCQkJCQkkY3NzQ2xhc3MgPSBhcnJheV9tZXJnZSgkY3NzQ2xhc3MsICR0aGlzLT5fY3NzU3R5bGVzWyd0ZC5zdHlsZScgLiAkY2VsbC0+Z2V0WGZJbmRleCgpXSk7CgkJCQkJCX0KCgkJCQkJCS8vIEdlbmVyYWwgaG9yaXpvbnRhbCBhbGlnbm1lbnQ6IEFjdHVhbCBob3Jpem9udGFsIGFsaWdubWVudCBkZXBlbmRzIG9uIGRhdGFUeXBlCgkJCQkJCSRzaGFyZWRTdHlsZSA9ICRwU2hlZXQtPmdldFBhcmVudCgpLT5nZXRDZWxsWGZCeUluZGV4KCAkY2VsbC0+Z2V0WGZJbmRleCgpICk7CgkJCQkJCWlmICgkc2hhcmVkU3R5bGUtPmdldEFsaWdubWVudCgpLT5nZXRIb3Jpem9udGFsKCkgPT0gUEhQRXhjZWxfU3R5bGVfQWxpZ25tZW50OjpIT1JJWk9OVEFMX0dFTkVSQUwKCQkJCQkJCSYmIGlzc2V0KCR0aGlzLT5fY3NzU3R5bGVzWycuJyAuICRjZWxsLT5nZXREYXRhVHlwZSgpXVsndGV4dC1hbGlnbiddKSkKCQkJCQkJewoJCQkJCQkJJGNzc0NsYXNzWyd0ZXh0LWFsaWduJ10gPSAkdGhpcy0+X2Nzc1N0eWxlc1snLicgLiAkY2VsbC0+Z2V0RGF0YVR5cGUoKV1bJ3RleHQtYWxpZ24nXTsKCQkJCQkJfQoJCQkJCX0KCQkJCX0KCgkJCQkvLyBIeXBlcmxpbms/CgkJCQlpZiAoJHBTaGVldC0+aHlwZXJsaW5rRXhpc3RzKCRjb29yZGluYXRlKSAmJiAhJHBTaGVldC0+Z2V0SHlwZXJsaW5rKCRjb29yZGluYXRlKS0+aXNJbnRlcm5hbCgpKSB7CgkJCQkJJGNlbGxEYXRhID0gJzxhIGhyZWY9IicgLiBodG1sc3BlY2lhbGNoYXJzKCRwU2hlZXQtPmdldEh5cGVybGluaygkY29vcmRpbmF0ZSktPmdldFVybCgpKSAuICciIHRpdGxlPSInIC4gaHRtbHNwZWNpYWxjaGFycygkcFNoZWV0LT5nZXRIeXBlcmxpbmsoJGNvb3JkaW5hdGUpLT5nZXRUb29sdGlwKCkpIC4gJyI+JyAuICRjZWxsRGF0YSAuICc8L2E+JzsKCQkJCX0KCgkJCQkvLyBTaG91bGQgdGhlIGNlbGwgYmUgd3JpdHRlbiBvciBpcyBpdCBzd2FsbG93ZWQgYnkgYSByb3dzcGFuIG9yIGNvbHNwYW4/CgkJCQkkd3JpdGVDZWxsID0gISAoIGlzc2V0KCR0aGlzLT5faXNTcGFubmVkQ2VsbFskcFNoZWV0LT5nZXRQYXJlbnQoKS0+Z2V0SW5kZXgoJHBTaGVldCldWyRwUm93ICsgMV1bJGNvbE51bV0pCgkJCQkJCQkmJiAkdGhpcy0+X2lzU3Bhbm5lZENlbGxbJHBTaGVldC0+Z2V0UGFyZW50KCktPmdldEluZGV4KCRwU2hlZXQpXVskcFJvdyArIDFdWyRjb2xOdW1dICk7CgoJCQkJLy8gQ29sc3BhbiBhbmQgUm93c3BhbgoJCQkJJGNvbHNwYW4gPSAxOwoJCQkJJHJvd3NwYW4gPSAxOwoJCQkJaWYgKGlzc2V0KCR0aGlzLT5faXNCYXNlQ2VsbFskcFNoZWV0LT5nZXRQYXJlbnQoKS0+Z2V0SW5kZXgoJHBTaGVldCldWyRwUm93ICsgMV1bJGNvbE51bV0pKSB7CgkJCQkJJHNwYW5zID0gJHRoaXMtPl9pc0Jhc2VDZWxsWyRwU2hlZXQtPmdldFBhcmVudCgpLT5nZXRJbmRleCgkcFNoZWV0KV1bJHBSb3cgKyAxXVskY29sTnVtXTsKCQkJCQkkcm93U3BhbiA9ICRzcGFuc1sncm93c3BhbiddOwoJCQkJCSRjb2xTcGFuID0gJHNwYW5zWydjb2xzcGFuJ107CgkJCQl9CgoJCQkJLy8gV3JpdGUKCQkJCWlmICgkd3JpdGVDZWxsKSB7CgkJCQkJLy8gQ29sdW1uIHN0YXJ0CgkJCQkJJGh0bWwgLj0gJwkJCTx0ZCc7CgkJCQkJCWlmICghJHRoaXMtPl91c2VJbmxpbmVDc3MpIHsKCQkJCQkJCSRodG1sIC49ICcgY2xhc3M9IicgLiAkY3NzQ2xhc3MgLiAnIic7CgkJCQkJCX0gZWxzZSB7CgkJCQkJCQkvLyoqIE5lY2Vzc2FyeSByZWR1bmRhbnQgY29kZSBmb3IgdGhlIHNha2Ugb2YgUEhQRXhjZWxfV3JpdGVyX1BERiAqKgoJCQkJCQkJLy8gV2UgbXVzdCBleHBsaWNpdGx5IHdyaXRlIHRoZSB3aWR0aCBvZiB0aGUgPHRkPiBlbGVtZW50IGJlY2F1c2UgVENQREYKCQkJCQkJCS8vIGRvZXMgbm90IHJlY29nbml6ZSBlLmcuIDxjb2wgc3R5bGU9IndpZHRoOjQycHQiPgoJCQkJCQkJJHdpZHRoID0gMDsKCQkJCQkJCSRpID0gJGNvbE51bSAtIDE7CgkJCQkJCQkkZSA9ICRjb2xOdW0gKyAkY29sU3BhbiAtIDE7CgkJCQkJCQl3aGlsZSgkaSsrIDwgJGUpIHsKCQkJCQkJCQlpZiAoaXNzZXQoJHRoaXMtPl9jb2x1bW5XaWR0aHNbJHNoZWV0SW5kZXhdWyRpXSkpIHsKCQkJCQkJCQkJJHdpZHRoICs9ICR0aGlzLT5fY29sdW1uV2lkdGhzWyRzaGVldEluZGV4XVskaV07CgkJCQkJCQkJfQoJCQkJCQkJfQoJCQkJCQkJJGNzc0NsYXNzWyd3aWR0aCddID0gJHdpZHRoIC4gJ3B0JzsKCgkJCQkJCQkvLyBXZSBtdXN0IGFsc28gZXhwbGljaXRseSB3cml0ZSB0aGUgaGVpZ2h0IG9mIHRoZSA8dGQ+IGVsZW1lbnQgYmVjYXVzZSBUQ1BERgoJCQkJCQkJLy8gZG9lcyBub3QgcmVjb2duaXplIGUuZy4gPHRyIHN0eWxlPSJoZWlnaHQ6NTBwdCI+CgkJCQkJCQlpZiAoaXNzZXQoJHRoaXMtPl9jc3NTdHlsZXNbJ3RhYmxlLnNoZWV0JyAuICRzaGVldEluZGV4IC4gJyB0ci5yb3cnIC4gJHBSb3ddWydoZWlnaHQnXSkpIHsKCQkJCQkJCQkkaGVpZ2h0ID0gJHRoaXMtPl9jc3NTdHlsZXNbJ3RhYmxlLnNoZWV0JyAuICRzaGVldEluZGV4IC4gJyB0ci5yb3cnIC4gJHBSb3ddWydoZWlnaHQnXTsKCQkJCQkJCQkkY3NzQ2xhc3NbJ2hlaWdodCddID0gJGhlaWdodDsKCQkJCQkJCX0KCQkJCQkJCS8vKiogZW5kIG9mIHJlZHVuZGFudCBjb2RlICoqCgoJCQkJCQkJJGh0bWwgLj0gJyBzdHlsZT0iJyAuICR0aGlzLT5fYXNzZW1ibGVDU1MoJGNzc0NsYXNzKSAuICciJzsKCQkJCQkJfQoJCQkJCQlpZiAoJGNvbFNwYW4gPiAxKSB7CgkJCQkJCQkkaHRtbCAuPSAnIGNvbHNwYW49IicgLiAkY29sU3BhbiAuICciJzsKCQkJCQkJfQoJCQkJCQlpZiAoJHJvd1NwYW4gPiAxKSB7CgkJCQkJCQkkaHRtbCAuPSAnIHJvd3NwYW49IicgLiAkcm93U3BhbiAuICciJzsKCQkJCQkJfQoJCQkJCSRodG1sIC49ICc+JzsKCgkJCQkJLy8gSW1hZ2U/CgkJCQkJJGh0bWwgLj0gJHRoaXMtPl93cml0ZUltYWdlVGFnSW5DZWxsKCRwU2hlZXQsICRjb29yZGluYXRlKTsKCgkJCQkJLy8gQ2VsbCBkYXRhCgkJCQkJJGh0bWwgLj0gJGNlbGxEYXRhOwoKCQkJCQkvLyBDb2x1bW4gZW5kCgkJCQkJJGh0bWwgLj0gJzwvdGQ+JyAuIFBIUF9FT0w7CgkJCQl9CgoJCQkJLy8gTmV4dCBjb2x1bW4KCQkJCSsrJGNvbE51bTsKCQkJfQoKCQkJLy8gV3JpdGUgcm93IGVuZAoJCQkkaHRtbCAuPSAnCQkgIDwvdHI+JyAuIFBIUF9FT0w7CgoJCQkvLyBSZXR1cm4KCQkJcmV0dXJuICRodG1sOwoJCX0gZWxzZSB7CgkJCXRocm93IG5ldyBFeGNlcHRpb24oIkludmFsaWQgcGFyYW1ldGVycyBwYXNzZWQuIik7CgkJfQoJfQoKCS8qKgoJICogVGFrZXMgYXJyYXkgd2hlcmUgb2YgQ1NTIHByb3BlcnRpZXMgLyB2YWx1ZXMgYW5kIGNvbnZlcnRzIHRvIENTUyBzdHJpbmcKCSAqCgkgKiBAcGFyYW0gYXJyYXkKCSAqIEByZXR1cm4gc3RyaW5nCgkgKi8KCXByaXZhdGUgZnVuY3Rpb24gX2Fzc2VtYmxlQ1NTKCRwVmFsdWUgPSBhcnJheSgpKQoJewoJCSRwYWlycyA9IGFycmF5KCk7CgkJZm9yZWFjaCAoJHBWYWx1ZSBhcyAkcHJvcGVydHkgPT4gJHZhbHVlKSB7CgkJCSRwYWlyc1tdID0gJHByb3BlcnR5IC4gJzonIC4gJHZhbHVlOwoJCX0KCQkkc3RyaW5nID0gaW1wbG9kZSgnOyAnLCAkcGFpcnMpOwoKCQlyZXR1cm4gJHN0cmluZzsKCX0KCgkvKioKCSAqIEdldCBQcmUtQ2FsY3VsYXRlIEZvcm11bGFzCgkgKgoJICogQHJldHVybiBib29sZWFuCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRQcmVDYWxjdWxhdGVGb3JtdWxhcygpIHsKCQlyZXR1cm4gJHRoaXMtPl9wcmVDYWxjdWxhdGVGb3JtdWxhczsKCX0KCgkvKioKCSAqIFNldCBQcmUtQ2FsY3VsYXRlIEZvcm11bGFzCgkgKgoJICogQHBhcmFtIGJvb2xlYW4gJHBWYWx1ZQlQcmUtQ2FsY3VsYXRlIEZvcm11bGFzPwoJICogQHJldHVybiBQSFBFeGNlbF9Xcml0ZXJfSFRNTAoJICovCglwdWJsaWMgZnVuY3Rpb24gc2V0UHJlQ2FsY3VsYXRlRm9ybXVsYXMoJHBWYWx1ZSA9IHRydWUpIHsKCQkkdGhpcy0+X3ByZUNhbGN1bGF0ZUZvcm11bGFzID0gJHBWYWx1ZTsKCQlyZXR1cm4gJHRoaXM7Cgl9CgoJLyoqCgkgKiBHZXQgaW1hZ2VzIHJvb3QKCSAqCgkgKiBAcmV0dXJuIHN0cmluZwoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0SW1hZ2VzUm9vdCgpIHsKCQlyZXR1cm4gJHRoaXMtPl9pbWFnZXNSb290OwoJfQoKCS8qKgoJICogU2V0IGltYWdlcyByb290CgkgKgoJICogQHBhcmFtIHN0cmluZyAkcFZhbHVlCgkgKiBAcmV0dXJuIFBIUEV4Y2VsX1dyaXRlcl9IVE1MCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBzZXRJbWFnZXNSb290KCRwVmFsdWUgPSAnLicpIHsKCQkkdGhpcy0+X2ltYWdlc1Jvb3QgPSAkcFZhbHVlOwoJCXJldHVybiAkdGhpczsKCX0KCgkvKioKCSAqIEdldCB1c2UgaW5saW5lIENTUz8KCSAqCgkgKiBAcmV0dXJuIGJvb2xlYW4KCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldFVzZUlubGluZUNzcygpIHsKCQlyZXR1cm4gJHRoaXMtPl91c2VJbmxpbmVDc3M7Cgl9CgoJLyoqCgkgKiBTZXQgdXNlIGlubGluZSBDU1M/CgkgKgoJICogQHBhcmFtIGJvb2xlYW4gJHBWYWx1ZQoJICogQHJldHVybiBQSFBFeGNlbF9Xcml0ZXJfSFRNTAoJICovCglwdWJsaWMgZnVuY3Rpb24gc2V0VXNlSW5saW5lQ3NzKCRwVmFsdWUgPSBmYWxzZSkgewoJCSR0aGlzLT5fdXNlSW5saW5lQ3NzID0gJHBWYWx1ZTsKCQlyZXR1cm4gJHRoaXM7Cgl9CgoJLyoqCgkgKiBBZGQgY29sb3IgdG8gZm9ybWF0dGVkIHN0cmluZyBhcyBpbmxpbmUgc3R5bGUKCSAqCgkgKiBAcGFyYW0gc3RyaW5nICRwVmFsdWUgUGxhaW4gZm9ybWF0dGVkIHZhbHVlIHdpdGhvdXQgY29sb3IKCSAqIEBwYXJhbSBzdHJpbmcgJHBGb3JtYXQgRm9ybWF0IGNvZGUKCSAqIEByZXR1cm4gc3RyaW5nCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBmb3JtYXRDb2xvcigkcFZhbHVlLCAkcEZvcm1hdCkKCXsKCQkvLyBDb2xvciBpbmZvcm1hdGlvbiwgZS5nLiBbUmVkXSBpcyBhbHdheXMgYXQgdGhlIGJlZ2lubmluZwoJCSRjb2xvciA9IG51bGw7IC8vIGluaXRpYWxpemUKCQkkbWF0Y2hlcyA9IGFycmF5KCk7CgoJCSRjb2xvcl9yZWdleCA9ICcvXlxcW1thLXpBLVpdK1xcXS8nOwoJCWlmIChwcmVnX21hdGNoKCRjb2xvcl9yZWdleCwgJHBGb3JtYXQsICRtYXRjaGVzKSkgewoJCQkkY29sb3IgPSBzdHJfcmVwbGFjZSgnWycsICcnLCAkbWF0Y2hlc1swXSk7CgkJCSRjb2xvciA9IHN0cl9yZXBsYWNlKCddJywgJycsICRjb2xvcik7CgkJCSRjb2xvciA9IHN0cnRvbG93ZXIoJGNvbG9yKTsKCQl9CgoJCS8vIGNvbnZlcnQgdG8gUENEQVRBCgkJJHZhbHVlID0gaHRtbHNwZWNpYWxjaGFycygkcFZhbHVlKTsKCgkJLy8gY29sb3Igc3BhbiB0YWcKCQlpZiAoJGNvbG9yICE9PSBudWxsKSB7CgkJCSR2YWx1ZSA9ICc8c3BhbiBzdHlsZT0iY29sb3I6JyAuICRjb2xvciAuICciPicgLiAkdmFsdWUgLiAnPC9zcGFuPic7CgkJfQoKCQlyZXR1cm4gJHZhbHVlOwoJfQoKCS8qKgoJICogQ2FsY3VsYXRlIGluZm9ybWF0aW9uIGFib3V0IEhUTUwgY29sc3BhbiBhbmQgcm93c3BhbiB3aGljaCBpcyBub3QgYWx3YXlzIHRoZSBzYW1lIGFzIEV4Y2VsJ3MKCSAqLwoJcHJpdmF0ZSBmdW5jdGlvbiBfY2FsY3VsYXRlU3BhbnMoKQoJewoJCS8vIElkZW50aWZ5IGFsbCBjZWxscyB0aGF0IHNob3VsZCBiZSBvbWl0dGVkIGluIEhUTUwgZHVlIHRvIGNlbGwgbWVyZ2UuCgkJLy8gSW4gSFRNTCBvbmx5IHRoZSB1cHBlci1sZWZ0IGNlbGwgc2hvdWxkIGJlIHdyaXR0ZW4gYW5kIGl0IHNob3VsZCBoYXZlCgkJLy8gICBhcHByb3ByaWF0ZSByb3dzcGFuIC8gY29sc3BhbiBhdHRyaWJ1dGUKCQkkc2hlZXRJbmRleGVzID0gJHRoaXMtPl9zaGVldEluZGV4ICE9PSBudWxsID8KCQkJYXJyYXkoJHRoaXMtPl9zaGVldEluZGV4KSA6IHJhbmdlKDAsICR0aGlzLT5fcGhwRXhjZWwtPmdldFNoZWV0Q291bnQoKSAtIDEpOwoKCQlmb3JlYWNoICgkc2hlZXRJbmRleGVzIGFzICRzaGVldEluZGV4KSB7CgkJCSRzaGVldCA9ICR0aGlzLT5fcGhwRXhjZWwtPmdldFNoZWV0KCRzaGVldEluZGV4KTsKCgkJCSRjYW5kaWRhdGVTcGFubmVkUm93ICA9IGFycmF5KCk7CgoJCQkvLyBsb29wIHRocm91Z2ggYWxsIEV4Y2VsIG1lcmdlZCBjZWxscwoJCQlmb3JlYWNoICgkc2hlZXQtPmdldE1lcmdlQ2VsbHMoKSBhcyAkY2VsbHMpIHsKCQkJCWxpc3QoJGNlbGxzLCApID0gUEhQRXhjZWxfQ2VsbDo6c3BsaXRSYW5nZSgkY2VsbHMpOwoJCQkJJGZpcnN0ID0gJGNlbGxzWzBdOwoJCQkJJGxhc3QgID0gJGNlbGxzWzFdOwoKCQkJCWxpc3QoJGZjLCAkZnIpID0gUEhQRXhjZWxfQ2VsbDo6Y29vcmRpbmF0ZUZyb21TdHJpbmcoJGZpcnN0KTsKCQkJCSRmYyA9IFBIUEV4Y2VsX0NlbGw6OmNvbHVtbkluZGV4RnJvbVN0cmluZygkZmMpIC0gMTsKCgkJCQlsaXN0KCRsYywgJGxyKSA9IFBIUEV4Y2VsX0NlbGw6OmNvb3JkaW5hdGVGcm9tU3RyaW5nKCRsYXN0KTsKCQkJCSRsYyA9IFBIUEV4Y2VsX0NlbGw6OmNvbHVtbkluZGV4RnJvbVN0cmluZygkbGMpIC0gMTsKCgkJCQkvLyBsb29wIHRocm91Z2ggdGhlIGluZGl2aWR1YWwgY2VsbHMgaW4gdGhlIGluZGl2aWR1YWwgbWVyZ2UKCQkJCSRyID0gJGZyIC0gMTsKCQkJCXdoaWxlKCRyKysgPCAkbHIpIHsKCQkJCQkvLyBhbHNvLCBmbGFnIHRoaXMgcm93IGFzIGEgSFRNTCByb3cgdGhhdCBpcyBjYW5kaWRhdGUgdG8gYmUgb21pdHRlZAoJCQkJCSRjYW5kaWRhdGVTcGFubmVkUm93WyRyXSA9ICRyOwoKCQkJCQkkYyA9ICRmYyAtIDE7CgkJCQkJd2hpbGUoJGMrKyA8ICRsYykgewoJCQkJCQlpZiAoICEoJGMgPT0gJGZjICYmICRyID09ICRmcikgKSB7CgkJCQkJCQkvLyBub3QgdGhlIHVwcGVyLWxlZnQgY2VsbCAoc2hvdWxkIG5vdCBiZSB3cml0dGVuIGluIEhUTUwpCgkJCQkJCQkkdGhpcy0+X2lzU3Bhbm5lZENlbGxbJHNoZWV0SW5kZXhdWyRyXVskY10gPSBhcnJheSgKCQkJCQkJCQknYmFzZUNlbGwnID0+IGFycmF5KCRmciwgJGZjKSwKCQkJCQkJCSk7CgkJCQkJCX0gZWxzZSB7CgkJCQkJCQkvLyB1cHBlci1sZWZ0IGlzIHRoZSBiYXNlIGNlbGwgdGhhdCBzaG91bGQgaG9sZCB0aGUgY29sc3Bhbi9yb3dzcGFuIGF0dHJpYnV0ZQoJCQkJCQkJJHRoaXMtPl9pc0Jhc2VDZWxsWyRzaGVldEluZGV4XVskcl1bJGNdID0gYXJyYXkoCgkJCQkJCQkJJ3hscm93c3BhbicgPT4gJGxyIC0gJGZyICsgMSwgLy8gRXhjZWwgcm93c3BhbgoJCQkJCQkJCSdyb3dzcGFuJyAgID0+ICRsciAtICRmciArIDEsIC8vIEhUTUwgcm93c3BhbiwgdmFsdWUgbWF5IGNoYW5nZQoJCQkJCQkJCSd4bGNvbHNwYW4nID0+ICRsYyAtICRmYyArIDEsIC8vIEV4Y2VsIGNvbHNwYW4KCQkJCQkJCQknY29sc3BhbicgICA9PiAkbGMgLSAkZmMgKyAxLCAvLyBIVE1MIGNvbHNwYW4sIHZhbHVlIG1heSBjaGFuZ2UKCQkJCQkJCSk7CgkJCQkJCX0KCQkJCQl9CgkJCQl9CgkJCX0KCgkJCS8vIElkZW50aWZ5IHdoaWNoIHJvd3Mgc2hvdWxkIGJlIG9taXR0ZWQgaW4gSFRNTC4gVGhlc2UgYXJlIHRoZSByb3dzIHdoZXJlIGFsbCB0aGUgY2VsbHMKCQkJLy8gICBwYXJ0aWNpcGF0ZSBpbiBhIG1lcmdlIGFuZCB0aGUgd2hlcmUgYmFzZSBjZWxscyBhcmUgc29tZXdoZXJlIGFib3ZlLgoJCQkkY291bnRDb2x1bW5zID0gUEhQRXhjZWxfQ2VsbDo6Y29sdW1uSW5kZXhGcm9tU3RyaW5nKCRzaGVldC0+Z2V0SGlnaGVzdENvbHVtbigpKTsKCQkJZm9yZWFjaCAoJGNhbmRpZGF0ZVNwYW5uZWRSb3cgYXMgJHJvd0luZGV4KSB7CgkJCQlpZiAoaXNzZXQoJHRoaXMtPl9pc1NwYW5uZWRDZWxsWyRzaGVldEluZGV4XVskcm93SW5kZXhdKSkgewoJCQkJCWlmIChjb3VudCgkdGhpcy0+X2lzU3Bhbm5lZENlbGxbJHNoZWV0SW5kZXhdWyRyb3dJbmRleF0pID09ICRjb3VudENvbHVtbnMpIHsKCQkJCQkJJHRoaXMtPl9pc1NwYW5uZWRSb3dbJHNoZWV0SW5kZXhdWyRyb3dJbmRleF0gPSAkcm93SW5kZXg7CgkJCQkJfTsKCQkJCX0KCQkJfQoKCQkJLy8gRm9yIGVhY2ggb2YgdGhlIG9taXR0ZWQgcm93cyB3ZSBmb3VuZCBhYm92ZSwgdGhlIGFmZmVjdGVkIHJvd3NwYW5zIHNob3VsZCBiZSBzdWJ0cmFjdGVkIGJ5IDEKCQkJaWYgKCBpc3NldCgkdGhpcy0+X2lzU3Bhbm5lZFJvd1skc2hlZXRJbmRleF0pICkgewoJCQkJZm9yZWFjaCAoJHRoaXMtPl9pc1NwYW5uZWRSb3dbJHNoZWV0SW5kZXhdIGFzICRyb3dJbmRleCkgewoJCQkJCSRhZGp1c3RlZEJhc2VDZWxscyA9IGFycmF5KCk7CgkJCQkJJGMgPSAtMTsKCQkJCQkkZSA9ICRjb3VudENvbHVtbnMgLSAxOwoJCQkJCXdoaWxlKCRjKysgPCAkZSkgewoJCQkJCQkkYmFzZUNlbGwgPSAkdGhpcy0+X2lzU3Bhbm5lZENlbGxbJHNoZWV0SW5kZXhdWyRyb3dJbmRleF1bJGNdWydiYXNlQ2VsbCddOwoKCQkJCQkJaWYgKCAhaW5fYXJyYXkoJGJhc2VDZWxsLCAkYWRqdXN0ZWRCYXNlQ2VsbHMpICkgewoJCQkJCQkJLy8gc3VidHJhY3Qgcm93c3BhbiBieSAxCgkJCQkJCQktLSR0aGlzLT5faXNCYXNlQ2VsbFskc2hlZXRJbmRleF1bICRiYXNlQ2VsbFswXSBdWyAkYmFzZUNlbGxbMV0gXVsncm93c3BhbiddOwoJCQkJCQkJJGFkanVzdGVkQmFzZUNlbGxzW10gPSAkYmFzZUNlbGw7CgkJCQkJCX0KCQkJCQl9CgkJCQl9CgkJCX0KCgkJCS8vIFRPRE86IFNhbWUgZm9yIGNvbHVtbnMKCQl9CgoJCS8vIFdlIGhhdmUgY2FsY3VsYXRlZCB0aGUgc3BhbnMKCQkkdGhpcy0+X3NwYW5zQXJlQ2FsY3VsYXRlZCA9IHRydWU7Cgl9Cgp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Writer/IWriter.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIFBIUEV4Y2VsCiAqCiAqIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICoKICogQGNhdGVnb3J5ICAgUEhQRXhjZWwKICogQHBhY2thZ2UgICAgUEhQRXhjZWxfV3JpdGVyCiAqIEBjb3B5cmlnaHQgIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwgKGh0dHA6Ly93d3cuY29kZXBsZXguY29tL1BIUEV4Y2VsKQogKiBAbGljZW5zZSAgICBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvb2xkLWxpY2Vuc2VzL2xncGwtMi4xLnR4dAlMR1BMCiAqIEB2ZXJzaW9uICAgIDEuNy43LCAyMDEyLTA1LTE5CiAqLwoKCi8qKgogKiBQSFBFeGNlbF9Xcml0ZXJfSVdyaXRlcgogKgogKiBAY2F0ZWdvcnkgICBQSFBFeGNlbAogKiBAcGFja2FnZSAgICBQSFBFeGNlbF9Xcml0ZXIKICogQGNvcHlyaWdodCAgQ29weXJpZ2h0IChjKSAyMDA2IC0gMjAxMiBQSFBFeGNlbCAoaHR0cDovL3d3dy5jb2RlcGxleC5jb20vUEhQRXhjZWwpCiAqLwppbnRlcmZhY2UgUEhQRXhjZWxfV3JpdGVyX0lXcml0ZXIKewoJLyoqCgkgKiBTYXZlIFBIUEV4Y2VsIHRvIGZpbGUKCSAqCgkgKiBAcGFyYW0gCXN0cmluZyAJCSRwRmlsZW5hbWUKCSAqIEB0aHJvd3MgCUV4Y2VwdGlvbgoJICovCglwdWJsaWMgZnVuY3Rpb24gc2F2ZSgkcEZpbGVuYW1lID0gbnVsbCk7Cn0K]]></data>
	</file>
	<file>
	  <filename>/lib/Classes/PHPExcel/Writer/PDF.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIFBIUEV4Y2VsCiAqCiAqIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICoKICogQGNhdGVnb3J5CVBIUEV4Y2VsCiAqIEBwYWNrYWdlCQlQSFBFeGNlbF9Xcml0ZXIKICogQGNvcHlyaWdodAlDb3B5cmlnaHQgKGMpIDIwMDYgLSAyMDEyIFBIUEV4Y2VsIChodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9QSFBFeGNlbCkKICogQGxpY2Vuc2UJCWh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9vbGQtbGljZW5zZXMvbGdwbC0yLjEudHh0CUxHUEwKICogQHZlcnNpb24JCTEuNy43LCAyMDEyLTA1LTE5CiAqLwoKCi8qKiBSZXF1aXJlIEZQREYgbGlicmFyeSAqLwoka19wYXRoX3VybCA9IGRpcm5hbWUoX19GSUxFX18pIC4gJy9QREYnOwpyZXF1aXJlX29uY2UgUEhQRVhDRUxfUk9PVCAuICdQSFBFeGNlbC9TaGFyZWQvUERGL3RjcGRmLnBocCc7CgovKioKICogUEhQRXhjZWxfV3JpdGVyX1BERgogKgogKiBAY2F0ZWdvcnkJUEhQRXhjZWwKICogQHBhY2thZ2UJCVBIUEV4Y2VsX1dyaXRlcgogKiBAY29weXJpZ2h0CUNvcHlyaWdodCAoYykgMjAwNiAtIDIwMTIgUEhQRXhjZWwgKGh0dHA6Ly93d3cuY29kZXBsZXguY29tL1BIUEV4Y2VsKQogKi8KY2xhc3MgUEhQRXhjZWxfV3JpdGVyX1BERiBleHRlbmRzIFBIUEV4Y2VsX1dyaXRlcl9IVE1MIGltcGxlbWVudHMgUEhQRXhjZWxfV3JpdGVyX0lXcml0ZXIgewoJLyoqCgkgKiBUZW1wb3Jhcnkgc3RvcmFnZSBkaXJlY3RvcnkKCSAqCgkgKiBAdmFyIHN0cmluZwoJICovCglwcml2YXRlICRfdGVtcERpciA9ICcnOwoKCS8qKgoJICogRm9udAoJICoKCSAqIEB2YXIgc3RyaW5nCgkgKi8KCXByaXZhdGUgJF9mb250ID0gJ2ZyZWVzYW5zJzsKCgkvKioKCSAqIE9yaWVudGF0aW9uIChPdmVyLXJpZGUpCgkgKgoJICogQHZhciBzdHJpbmcKCSAqLwoJcHJpdmF0ZSAkX29yaWVudGF0aW9uCT0gbnVsbDsKCgkvKioKCSAqIFBhcGVyIHNpemUgKE92ZXItcmlkZSkKCSAqCgkgKiBAdmFyIGludAoJICovCglwcml2YXRlICRfcGFwZXJTaXplCT0gbnVsbDsKCgoJLyoqCgkgKiBQYXBlciBTaXplcyB4UmVmIExpc3QKCSAqCgkgKiBAdmFyIGFycmF5CgkgKi8KCXByaXZhdGUgc3RhdGljICRfcGFwZXJTaXplcyA9IGFycmF5KAoJCS8vCUV4Y2VsIFBhcGVyIFNpemUJCQkJCQkJCQkJCQkJVENQREYgUGFwZXIgU2l6ZQoJCVBIUEV4Y2VsX1dvcmtzaGVldF9QYWdlU2V0dXA6OlBBUEVSU0laRV9MRVRURVIJCQkJCQkJPT4gJ0xFVFRFUicsCQkJCS8vCSg4LjUgaW4uIGJ5IDExIGluLikKCQlQSFBFeGNlbF9Xb3Jrc2hlZXRfUGFnZVNldHVwOjpQQVBFUlNJWkVfTEVUVEVSX1NNQUxMCQkJCQk9PiAnTEVUVEVSJywJCQkJLy8JKDguNSBpbi4gYnkgMTEgaW4uKQoJCVBIUEV4Y2VsX1dvcmtzaGVldF9QYWdlU2V0dXA6OlBBUEVSU0laRV9UQUJMT0lECQkJCQkJCT0+IGFycmF5KDc5Mi4wMCwxMjI0LjAwKSwJLy8JKDExIGluLiBieSAxNyBpbi4pCgkJUEhQRXhjZWxfV29ya3NoZWV0X1BhZ2VTZXR1cDo6UEFQRVJTSVpFX0xFREdFUgkJCQkJCQk9PiBhcnJheSgxMjI0LjAwLDc5Mi4wMCksCS8vCSgxNyBpbi4gYnkgMTEgaW4uKQoJCVBIUEV4Y2VsX1dvcmtzaGVldF9QYWdlU2V0dXA6OlBBUEVSU0laRV9MRUdBTAkJCQkJCQk9PiAnTEVHQUwnLAkJCQkJLy8JKDguNSBpbi4gYnkgMTQgaW4uKQoJCVBIUEV4Y2VsX1dvcmtzaGVldF9QYWdlU2V0dXA6OlBBUEVSU0laRV9TVEFURU1FTlQJCQkJCQk9PiBhcnJheSgzOTYuMDAsNjEyLjAwKSwJLy8JKDUuNSBpbi4gYnkgOC41IGluLikKCQlQSFBFeGNlbF9Xb3Jrc2hlZXRfUGFnZVNldHVwOjpQQVBFUlNJWkVfRVhFQ1VUSVZFCQkJCQkJPT4gJ0VYRUNVVElWRScsCQkJCS8vCSg3LjI1IGluLiBieSAxMC41IGluLikKCQlQSFBFeGNlbF9Xb3Jrc2hlZXRfUGFnZVNldHVwOjpQQVBFUlNJWkVfQTMJCQkJCQkJCT0+ICdBMycsCQkJCQkvLwkoMjk3IG1tIGJ5IDQyMCBtbSkKCQlQSFBFeGNlbF9Xb3Jrc2hlZXRfUGFnZVNldHVwOjpQQVBFUlNJWkVfQTQJCQkJCQkJCT0+ICdBNCcsCQkJCQkvLwkoMjEwIG1tIGJ5IDI5NyBtbSkKCQlQSFBFeGNlbF9Xb3Jrc2hlZXRfUGFnZVNldHVwOjpQQVBFUlNJWkVfQTRfU01BTEwJCQkJCQk9PiAnQTQnLAkJCQkJLy8JKDIxMCBtbSBieSAyOTcgbW0pCgkJUEhQRXhjZWxfV29ya3NoZWV0X1BhZ2VTZXR1cDo6UEFQRVJTSVpFX0E1CQkJCQkJCQk9PiAnQTUnLAkJCQkJLy8JKDE0OCBtbSBieSAyMTAgbW0pCgkJUEhQRXhjZWxfV29ya3NoZWV0X1BhZ2VTZXR1cDo6UEFQRVJTSVpFX0I0CQkJCQkJCQk9PiAnQjQnLAkJCQkJLy8JKDI1MCBtbSBieSAzNTMgbW0pCgkJUEhQRXhjZWxfV29ya3NoZWV0X1BhZ2VTZXR1cDo6UEFQRVJTSVpFX0I1CQkJCQkJCQk9PiAnQjUnLAkJCQkJLy8JKDE3NiBtbSBieSAyNTAgbW0pCgkJUEhQRXhjZWxfV29ya3NoZWV0X1BhZ2VTZXR1cDo6UEFQRVJTSVpFX0ZPTElPCQkJCQkJCT0+ICdGT0xJTycsCQkJCQkvLwkoOC41IGluLiBieSAxMyBpbi4pCgkJUEhQRXhjZWxfV29ya3NoZWV0X1BhZ2VTZXR1cDo6UEFQRVJTSVpFX1FVQVJUTwkJCQkJCQk9PiBhcnJheSg2MDkuNDUsNzc5LjUzKSwJLy8JKDIxNSBtbSBieSAyNzUgbW0pCgkJUEhQRXhjZWxfV29ya3NoZWV0X1BhZ2VTZXR1cDo6UEFQRVJTSVpFX1NUQU5EQVJEXzEJCQkJCQk9PiBhcnJheSg3MjAuMDAsMTAwOC4wMCksCS8vCSgxMCBpbi4gYnkgMTQgaW4uKQoJCVBIUEV4Y2VsX1dvcmtzaGVldF9QYWdlU2V0dXA6OlBBUEVSU0laRV9TVEFOREFSRF8yCQkJCQkJPT4gYXJyYXkoNzkyLjAwLDEyMjQuMDApLAkvLwkoMTEgaW4uIGJ5IDE3IGluLikKCQlQSFBFeGNlbF9Xb3Jrc2hlZXRfUGFnZVNldHVwOjpQQVBFUlNJWkVfTk9URQkJCQkJCQk9PiAnTEVUVEVSJywJCQkJLy8JKDguNSBpbi4gYnkgMTEgaW4uKQoJCVBIUEV4Y2VsX1dvcmtzaGVldF9QYWdlU2V0dXA6OlBBUEVSU0laRV9OTzlfRU5WRUxPUEUJCQkJCT0+IGFycmF5KDI3OS4wMCw2MzkuMDApLAkvLwkoMy44NzUgaW4uIGJ5IDguODc1IGluLikKCQlQSFBFeGNlbF9Xb3Jrc2hlZXRfUGFnZVNldHVwOjpQQVBFUlNJWkVfTk8xMF9FTlZFTE9QRQkJCQkJPT4gYXJyYXkoMjk3LjAwLDY4NC4wMCksCS8vCSg0LjEyNSBpbi4gYnkgOS41IGluLikKCQlQSFBFeGNlbF9Xb3Jrc2hlZXRfUGFnZVNldHVwOjpQQVBFUlNJWkVfTk8xMV9FTlZFTE9QRQkJCQkJPT4gYXJyYXkoMzI0LjAwLDc0Ny4wMCksCS8vCSg0LjUgaW4uIGJ5IDEwLjM3NSBpbi4pCgkJUEhQRXhjZWxfV29ya3NoZWV0X1BhZ2VTZXR1cDo6UEFQRVJTSVpFX05PMTJfRU5WRUxPUEUJCQkJCT0+IGFycmF5KDM0Mi4wMCw3OTIuMDApLAkvLwkoNC43NSBpbi4gYnkgMTEgaW4uKQoJCVBIUEV4Y2VsX1dvcmtzaGVldF9QYWdlU2V0dXA6OlBBUEVSU0laRV9OTzE0X0VOVkVMT1BFCQkJCQk9PiBhcnJheSgzNjAuMDAsODI4LjAwKSwJLy8JKDUgaW4uIGJ5IDExLjUgaW4uKQoJCVBIUEV4Y2VsX1dvcmtzaGVldF9QYWdlU2V0dXA6OlBBUEVSU0laRV9DCQkJCQkJCQk9PiBhcnJheSgxMjI0LjAwLDE1ODQuMDApLAkvLwkoMTcgaW4uIGJ5IDIyIGluLikKCQlQSFBFeGNlbF9Xb3Jrc2hlZXRfUGFnZVNldHVwOjpQQVBFUlNJWkVfRAkJCQkJCQkJPT4gYXJyYXkoMTU4NC4wMCwyNDQ4LjAwKSwJLy8JKDIyIGluLiBieSAzNCBpbi4pCgkJUEhQRXhjZWxfV29ya3NoZWV0X1BhZ2VTZXR1cDo6UEFQRVJTSVpFX0UJCQkJCQkJCT0+IGFycmF5KDI0NDguMDAsMzE2OC4wMCksCS8vCSgzNCBpbi4gYnkgNDQgaW4uKQoJCVBIUEV4Y2VsX1dvcmtzaGVldF9QYWdlU2V0dXA6OlBBUEVSU0laRV9ETF9FTlZFTE9QRQkJCQkJCT0+IGFycmF5KDMxMS44MSw2MjMuNjIpLAkvLwkoMTEwIG1tIGJ5IDIyMCBtbSkKCQlQSFBFeGNlbF9Xb3Jrc2hlZXRfUGFnZVNldHVwOjpQQVBFUlNJWkVfQzVfRU5WRUxPUEUJCQkJCQk9PiAnQzUnLAkJCQkJLy8JKDE2MiBtbSBieSAyMjkgbW0pCgkJUEhQRXhjZWxfV29ya3NoZWV0X1BhZ2VTZXR1cDo6UEFQRVJTSVpFX0MzX0VOVkVMT1BFCQkJCQkJPT4gJ0MzJywJCQkJCS8vCSgzMjQgbW0gYnkgNDU4IG1tKQoJCVBIUEV4Y2VsX1dvcmtzaGVldF9QYWdlU2V0dXA6OlBBUEVSU0laRV9DNF9FTlZFTE9QRQkJCQkJCT0+ICdDNCcsCQkJCQkvLwkoMjI5IG1tIGJ5IDMyNCBtbSkKCQlQSFBFeGNlbF9Xb3Jrc2hlZXRfUGFnZVNldHVwOjpQQVBFUlNJWkVfQzZfRU5WRUxPUEUJCQkJCQk9PiAnQzYnLAkJCQkJLy8JKDExNCBtbSBieSAxNjIgbW0pCgkJUEhQRXhjZWxfV29ya3NoZWV0X1BhZ2VTZXR1cDo6UEFQRVJTSVpFX0M2NV9FTlZFTE9QRQkJCQkJPT4gYXJyYXkoMzIzLjE1LDY0OS4xMyksCS8vCSgxMTQgbW0gYnkgMjI5IG1tKQoJCVBIUEV4Y2VsX1dvcmtzaGVldF9QYWdlU2V0dXA6OlBBUEVSU0laRV9CNF9FTlZFTE9QRQkJCQkJCT0+ICdCNCcsCQkJCQkvLwkoMjUwIG1tIGJ5IDM1MyBtbSkKCQlQSFBFeGNlbF9Xb3Jrc2hlZXRfUGFnZVNldHVwOjpQQVBFUlNJWkVfQjVfRU5WRUxPUEUJCQkJCQk9PiAnQjUnLAkJCQkJLy8JKDE3NiBtbSBieSAyNTAgbW0pCgkJUEhQRXhjZWxfV29ya3NoZWV0X1BhZ2VTZXR1cDo6UEFQRVJTSVpFX0I2X0VOVkVMT1BFCQkJCQkJPT4gYXJyYXkoNDk4LjkwLDM1NC4zMyksCS8vCSgxNzYgbW0gYnkgMTI1IG1tKQoJCVBIUEV4Y2VsX1dvcmtzaGVldF9QYWdlU2V0dXA6OlBBUEVSU0laRV9JVEFMWV9FTlZFTE9QRQkJCQkJPT4gYXJyYXkoMzExLjgxLDY1MS45NyksCS8vCSgxMTAgbW0gYnkgMjMwIG1tKQoJCVBIUEV4Y2VsX1dvcmtzaGVldF9QYWdlU2V0dXA6OlBBUEVSU0laRV9NT05BUkNIX0VOVkVMT1BFCQkJCT0+IGFycmF5KDI3OS4wMCw1NDAuMDApLAkvLwkoMy44NzUgaW4uIGJ5IDcuNSBpbi4pCgkJUEhQRXhjZWxfV29ya3NoZWV0X1BhZ2VTZXR1cDo6UEFQRVJTSVpFXzZfM180X0VOVkVMT1BFCQkJCQk9PiBhcnJheSgyNjEuMDAsNDY4LjAwKSwJLy8JKDMuNjI1IGluLiBieSA2LjUgaW4uKQoJCVBIUEV4Y2VsX1dvcmtzaGVldF9QYWdlU2V0dXA6OlBBUEVSU0laRV9VU19TVEFOREFSRF9GQU5GT0xECQkJCT0+IGFycmF5KDEwNzEuMDAsNzkyLjAwKSwJLy8JKDE0Ljg3NSBpbi4gYnkgMTEgaW4uKQoJCVBIUEV4Y2VsX1dvcmtzaGVldF9QYWdlU2V0dXA6OlBBUEVSU0laRV9HRVJNQU5fU1RBTkRBUkRfRkFORk9MRAkJCT0+IGFycmF5KDYxMi4wMCw4NjQuMDApLAkvLwkoOC41IGluLiBieSAxMiBpbi4pCgkJUEhQRXhjZWxfV29ya3NoZWV0X1BhZ2VTZXR1cDo6UEFQRVJTSVpFX0dFUk1BTl9MRUdBTF9GQU5GT0xECQkJPT4gJ0ZPTElPJywJCQkJCS8vCSg4LjUgaW4uIGJ5IDEzIGluLikKCQlQSFBFeGNlbF9Xb3Jrc2hlZXRfUGFnZVNldHVwOjpQQVBFUlNJWkVfSVNPX0I0CQkJCQkJCT0+ICdCNCcsCQkJCQkvLwkoMjUwIG1tIGJ5IDM1MyBtbSkKCQlQSFBFeGNlbF9Xb3Jrc2hlZXRfUGFnZVNldHVwOjpQQVBFUlNJWkVfSkFQQU5FU0VfRE9VQkxFX1BPU1RDQVJECQk9PiBhcnJheSg1NjYuOTMsNDE5LjUzKSwJLy8JKDIwMCBtbSBieSAxNDggbW0pCgkJUEhQRXhjZWxfV29ya3NoZWV0X1BhZ2VTZXR1cDo6UEFQRVJTSVpFX1NUQU5EQVJEX1BBUEVSXzEJCQkJPT4gYXJyYXkoNjQ4LjAwLDc5Mi4wMCksCS8vCSg5IGluLiBieSAxMSBpbi4pCgkJUEhQRXhjZWxfV29ya3NoZWV0X1BhZ2VTZXR1cDo6UEFQRVJTSVpFX1NUQU5EQVJEX1BBUEVSXzIJCQkJPT4gYXJyYXkoNzIwLjAwLDc5Mi4wMCksCS8vCSgxMCBpbi4gYnkgMTEgaW4uKQoJCVBIUEV4Y2VsX1dvcmtzaGVldF9QYWdlU2V0dXA6OlBBUEVSU0laRV9TVEFOREFSRF9QQVBFUl8zCQkJCT0+IGFycmF5KDEwODAuMDAsNzkyLjAwKSwJLy8JKDE1IGluLiBieSAxMSBpbi4pCgkJUEhQRXhjZWxfV29ya3NoZWV0X1BhZ2VTZXR1cDo6UEFQRVJTSVpFX0lOVklURV9FTlZFTE9QRQkJCQkJPT4gYXJyYXkoNjIzLjYyLDYyMy42MiksCS8vCSgyMjAgbW0gYnkgMjIwIG1tKQoJCVBIUEV4Y2VsX1dvcmtzaGVldF9QYWdlU2V0dXA6OlBBUEVSU0laRV9MRVRURVJfRVhUUkFfUEFQRVIJCQkJPT4gYXJyYXkoNjY3LjgwLDg2NC4wMCksCS8vCSg5LjI3NSBpbi4gYnkgMTIgaW4uKQoJCVBIUEV4Y2VsX1dvcmtzaGVldF9QYWdlU2V0dXA6OlBBUEVSU0laRV9MRUdBTF9FWFRSQV9QQVBFUgkJCQk9PiBhcnJheSg2NjcuODAsMTA4MC4wMCksCS8vCSg5LjI3NSBpbi4gYnkgMTUgaW4uKQoJCVBIUEV4Y2VsX1dvcmtzaGVldF9QYWdlU2V0dXA6OlBBUEVSU0laRV9UQUJMT0lEX0VYVFJBX1BBUEVSCQkJCT0+IGFycmF5KDg0MS42OCwxMjk2LjAwKSwJLy8JKDExLjY5IGluLiBieSAxOCBpbi4pCgkJUEhQRXhjZWxfV29ya3NoZWV0X1BhZ2VTZXR1cDo6UEFQRVJTSVpFX0E0X0VYVFJBX1BBUEVSCQkJCQk9PiBhcnJheSg2NjguOTgsOTEyLjc2KSwJLy8JKDIzNiBtbSBieSAzMjIgbW0pCgkJUEhQRXhjZWxfV29ya3NoZWV0X1BhZ2VTZXR1cDo6UEFQRVJTSVpFX0xFVFRFUl9UUkFOU1ZFUlNFX1BBUEVSCQkJPT4gYXJyYXkoNTk1LjgwLDc5Mi4wMCksCS8vCSg4LjI3NSBpbi4gYnkgMTEgaW4uKQoJCVBIUEV4Y2VsX1dvcmtzaGVldF9QYWdlU2V0dXA6OlBBUEVSU0laRV9BNF9UUkFOU1ZFUlNFX1BBUEVSCQkJCT0+ICdBNCcsCQkJCQkvLwkoMjEwIG1tIGJ5IDI5NyBtbSkKCQlQSFBFeGNlbF9Xb3Jrc2hlZXRfUGFnZVNldHVwOjpQQVBFUlNJWkVfTEVUVEVSX0VYVFJBX1RSQU5TVkVSU0VfUEFQRVIJPT4gYXJyYXkoNjY3LjgwLDg2NC4wMCksCS8vCSg5LjI3NSBpbi4gYnkgMTIgaW4uKQoJCVBIUEV4Y2VsX1dvcmtzaGVldF9QYWdlU2V0dXA6OlBBUEVSU0laRV9TVVBFUkFfU1VQRVJBX0E0X1BBUEVSCQkJPT4gYXJyYXkoNjQzLjQ2LDEwMDkuMTMpLAkvLwkoMjI3IG1tIGJ5IDM1NiBtbSkKCQlQSFBFeGNlbF9Xb3Jrc2hlZXRfUGFnZVNldHVwOjpQQVBFUlNJWkVfU1VQRVJCX1NVUEVSQl9BM19QQVBFUgkJCT0+IGFycmF5KDg2NC41NywxMzgwLjQ3KSwJLy8JKDMwNSBtbSBieSA0ODcgbW0pCgkJUEhQRXhjZWxfV29ya3NoZWV0X1BhZ2VTZXR1cDo6UEFQRVJTSVpFX0xFVFRFUl9QTFVTX1BBUEVSCQkJCT0+IGFycmF5KDYxMi4wMCw5MTMuNjgpLAkvLwkoOC41IGluLiBieSAxMi42OSBpbi4pCgkJUEhQRXhjZWxfV29ya3NoZWV0X1BhZ2VTZXR1cDo6UEFQRVJTSVpFX0E0X1BMVVNfUEFQRVIJCQkJCT0+IGFycmF5KDU5NS4yOCw5MzUuNDMpLAkvLwkoMjEwIG1tIGJ5IDMzMCBtbSkKCQlQSFBFeGNlbF9Xb3Jrc2hlZXRfUGFnZVNldHVwOjpQQVBFUlNJWkVfQTVfVFJBTlNWRVJTRV9QQVBFUgkJCQk9PiAnQTUnLAkJCQkJLy8JKDE0OCBtbSBieSAyMTAgbW0pCgkJUEhQRXhjZWxfV29ya3NoZWV0X1BhZ2VTZXR1cDo6UEFQRVJTSVpFX0pJU19CNV9UUkFOU1ZFUlNFX1BBUEVSCQkJPT4gYXJyYXkoNTE1LjkxLDcyOC41MCksCS8vCSgxODIgbW0gYnkgMjU3IG1tKQoJCVBIUEV4Y2VsX1dvcmtzaGVldF9QYWdlU2V0dXA6OlBBUEVSU0laRV9BM19FWFRSQV9QQVBFUgkJCQkJPT4gYXJyYXkoOTEyLjc2LDEyNjEuNDIpLAkvLwkoMzIyIG1tIGJ5IDQ0NSBtbSkKCQlQSFBFeGNlbF9Xb3Jrc2hlZXRfUGFnZVNldHVwOjpQQVBFUlNJWkVfQTVfRVhUUkFfUEFQRVIJCQkJCT0+IGFycmF5KDQ5My4yMyw2NjYuMTQpLAkvLwkoMTc0IG1tIGJ5IDIzNSBtbSkKCQlQSFBFeGNlbF9Xb3Jrc2hlZXRfUGFnZVNldHVwOjpQQVBFUlNJWkVfSVNPX0I1X0VYVFJBX1BBUEVSCQkJCT0+IGFycmF5KDU2OS43Niw3ODIuMzYpLAkvLwkoMjAxIG1tIGJ5IDI3NiBtbSkKCQlQSFBFeGNlbF9Xb3Jrc2hlZXRfUGFnZVNldHVwOjpQQVBFUlNJWkVfQTJfUEFQRVIJCQkJCQk9PiAnQTInLAkJCQkJLy8JKDQyMCBtbSBieSA1OTQgbW0pCgkJUEhQRXhjZWxfV29ya3NoZWV0X1BhZ2VTZXR1cDo6UEFQRVJTSVpFX0EzX1RSQU5TVkVSU0VfUEFQRVIJCQkJPT4gJ0EzJywJCQkJCS8vCSgyOTcgbW0gYnkgNDIwIG1tKQoJCVBIUEV4Y2VsX1dvcmtzaGVldF9QYWdlU2V0dXA6OlBBUEVSU0laRV9BM19FWFRSQV9UUkFOU1ZFUlNFX1BBUEVSCQk9PiBhcnJheSg5MTIuNzYsMTI2MS40MikJLy8JKDMyMiBtbSBieSA0NDUgbW0pCgkpOwoKCS8qKgoJICogQ3JlYXRlIGEgbmV3IFBIUEV4Y2VsX1dyaXRlcl9QREYKCSAqCgkgKiBAcGFyYW0gCVBIUEV4Y2VsCSRwaHBFeGNlbAlQSFBFeGNlbCBvYmplY3QKCSAqLwoJcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KFBIUEV4Y2VsICRwaHBFeGNlbCkgewoJCXBhcmVudDo6X19jb25zdHJ1Y3QoJHBocEV4Y2VsKTsKCQkkdGhpcy0+c2V0VXNlSW5saW5lQ3NzKHRydWUpOwoJCSR0aGlzLT5fdGVtcERpciA9IFBIUEV4Y2VsX1NoYXJlZF9GaWxlOjpzeXNfZ2V0X3RlbXBfZGlyKCk7Cgl9CgoJLyoqCgkgKiBTZXQgZm9udC4gRXhhbXBsZXM6CgkgKiAgICdhcmlhbHVuaWNpZDAtY2hpbmVzZS1zaW1wbGlmaWVkJwoJICogICAnYXJpYWx1bmljaWQwLWNoaW5lc2UtdHJhZGl0aW9uYWwnCgkgKiAgICdhcmlhbHVuaWNpZDAta29yZWFuJwoJICogICAnYXJpYWx1bmljaWQwLWphcGFuZXNlJwoJICoKCSAqIEBwYXJhbQlzdHJpbmcJJGZvbnROYW1lCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBzZXRGb250KCRmb250TmFtZSkgewoJCSR0aGlzLT5fZm9udCA9ICRmb250TmFtZTsKCQlyZXR1cm4gJHRoaXM7Cgl9CgogICAgLyoqCiAgICAgKiBHZXQgUGFwZXIgU2l6ZQogICAgICoKICAgICAqIEByZXR1cm4gaW50CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRQYXBlclNpemUoKSB7CiAgICAJcmV0dXJuICR0aGlzLT5fcGFwZXJTaXplOwogICAgfQoKICAgIC8qKgogICAgICogU2V0IFBhcGVyIFNpemUKICAgICAqCiAgICAgKiBAcGFyYW0gaW50ICRwVmFsdWUKICAgICAqIEByZXR1cm4gUEhQRXhjZWxfV3JpdGVyX1BERgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gc2V0UGFwZXJTaXplKCRwVmFsdWUgPSBQSFBFeGNlbF9Xb3Jrc2hlZXRfUGFnZVNldHVwOjpQQVBFUlNJWkVfTEVUVEVSKSB7CiAgICAJJHRoaXMtPl9wYXBlclNpemUgPSAkcFZhbHVlOwogICAgCXJldHVybiAkdGhpczsKICAgIH0KCiAgICAvKioKICAgICAqIEdldCBPcmllbnRhdGlvbgogICAgICoKICAgICAqIEByZXR1cm4gc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRPcmllbnRhdGlvbigpIHsKICAgIAlyZXR1cm4gJHRoaXMtPl9vcmllbnRhdGlvbjsKICAgIH0KCiAgICAvKioKICAgICAqIFNldCBPcmllbnRhdGlvbgogICAgICoKICAgICAqIEBwYXJhbSBzdHJpbmcgJHBWYWx1ZQogICAgICogQHJldHVybiBQSFBFeGNlbF9Xcml0ZXJfUERGCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBzZXRPcmllbnRhdGlvbigkcFZhbHVlID0gUEhQRXhjZWxfV29ya3NoZWV0X1BhZ2VTZXR1cDo6T1JJRU5UQVRJT05fREVGQVVMVCkgewogICAgCSR0aGlzLT5fb3JpZW50YXRpb24gPSAkcFZhbHVlOwogICAgCXJldHVybiAkdGhpczsKICAgIH0KCgkvKioKCSAqIFNhdmUgUEhQRXhjZWwgdG8gZmlsZQoJICoKCSAqIEBwYXJhbSAJc3RyaW5nIAkJJHBGaWxlbmFtZSAgICBGaWxlbmFtZSBmb3IgdGhlIHNhdmVkIGZpbGUKCSAqIEB0aHJvd3MgCUV4Y2VwdGlvbgoJICovCglwdWJsaWMgZnVuY3Rpb24gc2F2ZSgkcEZpbGVuYW1lID0gbnVsbCkgewoJCS8vIGdhcmJhZ2UgY29sbGVjdAoJCSR0aGlzLT5fcGhwRXhjZWwtPmdhcmJhZ2VDb2xsZWN0KCk7CgoJCSRzYXZlQXJyYXlSZXR1cm5UeXBlID0gUEhQRXhjZWxfQ2FsY3VsYXRpb246OmdldEFycmF5UmV0dXJuVHlwZSgpOwoJCVBIUEV4Y2VsX0NhbGN1bGF0aW9uOjpzZXRBcnJheVJldHVyblR5cGUoUEhQRXhjZWxfQ2FsY3VsYXRpb246OlJFVFVSTl9BUlJBWV9BU19WQUxVRSk7CgoJCS8vIE9wZW4gZmlsZQoJCSRmaWxlSGFuZGxlID0gZm9wZW4oJHBGaWxlbmFtZSwgJ3cnKTsKCQlpZiAoJGZpbGVIYW5kbGUgPT09IGZhbHNlKSB7CgkJCXRocm93IG5ldyBFeGNlcHRpb24oIkNvdWxkIG5vdCBvcGVuIGZpbGUgJHBGaWxlbmFtZSBmb3Igd3JpdGluZy4iKTsKCQl9CgoJCS8vIFNldCBQREYKCQkkdGhpcy0+X2lzUGRmID0gdHJ1ZTsKCgkJLy8gQnVpbGQgQ1NTCgkJJHRoaXMtPmJ1aWxkQ1NTKHRydWUpOwoKCQkvLyBHZW5lcmF0ZSBIVE1MCgkJJGh0bWwgPSAnJzsKCQkvLyRodG1sIC49ICR0aGlzLT5nZW5lcmF0ZUhUTUxIZWFkZXIoZmFsc2UpOwoJCSRodG1sIC49ICR0aGlzLT5nZW5lcmF0ZVNoZWV0RGF0YSgpOwoJCS8vJGh0bWwgLj0gJHRoaXMtPmdlbmVyYXRlSFRNTEZvb3RlcigpOwoKCQkvLyBEZWZhdWx0IFBERiBwYXBlciBzaXplCgkJJHBhcGVyU2l6ZSA9ICdMRVRURVInOwkvLwlMZXR0ZXIJKDguNSBpbi4gYnkgMTEgaW4uKQoKCQkvLyBDaGVjayBmb3IgcGFwZXIgc2l6ZSBhbmQgcGFnZSBvcmllbnRhdGlvbgoJCWlmIChpc19udWxsKCR0aGlzLT5nZXRTaGVldEluZGV4KCkpKSB7CgkJCSRvcmllbnRhdGlvbiA9ICgkdGhpcy0+X3BocEV4Y2VsLT5nZXRTaGVldCgwKS0+Z2V0UGFnZVNldHVwKCktPmdldE9yaWVudGF0aW9uKCkgPT0gUEhQRXhjZWxfV29ya3NoZWV0X1BhZ2VTZXR1cDo6T1JJRU5UQVRJT05fTEFORFNDQVBFKSA/ICdMJyA6ICdQJzsKCQkJJHByaW50UGFwZXJTaXplID0gJHRoaXMtPl9waHBFeGNlbC0+Z2V0U2hlZXQoMCktPmdldFBhZ2VTZXR1cCgpLT5nZXRQYXBlclNpemUoKTsKCQkJJHByaW50TWFyZ2lucyA9ICR0aGlzLT5fcGhwRXhjZWwtPmdldFNoZWV0KDApLT5nZXRQYWdlTWFyZ2lucygpOwoJCX0gZWxzZSB7CgkJCSRvcmllbnRhdGlvbiA9ICgkdGhpcy0+X3BocEV4Y2VsLT5nZXRTaGVldCgkdGhpcy0+Z2V0U2hlZXRJbmRleCgpKS0+Z2V0UGFnZVNldHVwKCktPmdldE9yaWVudGF0aW9uKCkgPT0gUEhQRXhjZWxfV29ya3NoZWV0X1BhZ2VTZXR1cDo6T1JJRU5UQVRJT05fTEFORFNDQVBFKSA/ICdMJyA6ICdQJzsKCQkJJHByaW50UGFwZXJTaXplID0gJHRoaXMtPl9waHBFeGNlbC0+Z2V0U2hlZXQoJHRoaXMtPmdldFNoZWV0SW5kZXgoKSktPmdldFBhZ2VTZXR1cCgpLT5nZXRQYXBlclNpemUoKTsKCQkJJHByaW50TWFyZ2lucyA9ICR0aGlzLT5fcGhwRXhjZWwtPmdldFNoZWV0KCR0aGlzLT5nZXRTaGVldEluZGV4KCkpLT5nZXRQYWdlTWFyZ2lucygpOwoJCX0KCgkJLy8JT3ZlcnJpZGUgUGFnZSBPcmllbnRhdGlvbgoJCWlmICghaXNfbnVsbCgkdGhpcy0+X29yaWVudGF0aW9uKSkgewoJCQkkb3JpZW50YXRpb24gPSAoJHRoaXMtPl9vcmllbnRhdGlvbiA9PSBQSFBFeGNlbF9Xb3Jrc2hlZXRfUGFnZVNldHVwOjpPUklFTlRBVElPTl9MQU5EU0NBUEUpID8gJ0wnIDogJ1AnOwoJCX0KCQkvLwlPdmVycmlkZSBQYXBlciBTaXplCgkJaWYgKCFpc19udWxsKCR0aGlzLT5fcGFwZXJTaXplKSkgewoJCQkkcHJpbnRQYXBlclNpemUgPSAkdGhpcy0+X3BhcGVyU2l6ZTsKCQl9CgoKCQlpZiAoaXNzZXQoc2VsZjo6JF9wYXBlclNpemVzWyRwcmludFBhcGVyU2l6ZV0pKSB7CgkJCSRwYXBlclNpemUgPSBzZWxmOjokX3BhcGVyU2l6ZXNbJHByaW50UGFwZXJTaXplXTsKCQl9CgoKCQkvLyBDcmVhdGUgUERGCgkJJHBkZiA9IG5ldyBUQ1BERigkb3JpZW50YXRpb24sICdwdCcsICRwYXBlclNpemUpOwoJCSRwZGYtPnNldEZvbnRTdWJzZXR0aW5nKGZhbHNlKTsKCQkvLwlTZXQgbWFyZ2lucywgY29udmVydGluZyBpbmNoZXMgdG8gcG9pbnRzICh1c2luZyA3MiBkcGkpCgkJJHBkZi0+U2V0TWFyZ2lucygkcHJpbnRNYXJnaW5zLT5nZXRMZWZ0KCkgKiA3MiwkcHJpbnRNYXJnaW5zLT5nZXRUb3AoKSAqIDcyLCRwcmludE1hcmdpbnMtPmdldFJpZ2h0KCkgKiA3Mik7CgkJJHBkZi0+U2V0QXV0b1BhZ2VCcmVhayh0cnVlLCRwcmludE1hcmdpbnMtPmdldEJvdHRvbSgpICogNzIpOwovLwkJJHBkZi0+c2V0SGVhZGVyTWFyZ2luKCRwcmludE1hcmdpbnMtPmdldEhlYWRlcigpICogNzIpOwovLwkJJHBkZi0+c2V0Rm9vdGVyTWFyZ2luKCRwcmludE1hcmdpbnMtPmdldEZvb3RlcigpICogNzIpOwoKCQkkcGRmLT5zZXRQcmludEhlYWRlcihmYWxzZSk7CgkJJHBkZi0+c2V0UHJpbnRGb290ZXIoZmFsc2UpOwoKCQkkcGRmLT5BZGRQYWdlKCk7CgoJCS8vIFNldCB0aGUgYXBwcm9wcmlhdGUgZm9udAoJCSRwZGYtPlNldEZvbnQoJHRoaXMtPl9mb250KTsKCQkkcGRmLT53cml0ZUhUTUwoJGh0bWwpOwoKCQkvLyBEb2N1bWVudCBpbmZvCgkJJHBkZi0+U2V0VGl0bGUoJHRoaXMtPl9waHBFeGNlbC0+Z2V0UHJvcGVydGllcygpLT5nZXRUaXRsZSgpKTsKCQkkcGRmLT5TZXRBdXRob3IoJHRoaXMtPl9waHBFeGNlbC0+Z2V0UHJvcGVydGllcygpLT5nZXRDcmVhdG9yKCkpOwoJCSRwZGYtPlNldFN1YmplY3QoJHRoaXMtPl9waHBFeGNlbC0+Z2V0UHJvcGVydGllcygpLT5nZXRTdWJqZWN0KCkpOwoJCSRwZGYtPlNldEtleXdvcmRzKCR0aGlzLT5fcGhwRXhjZWwtPmdldFByb3BlcnRpZXMoKS0+Z2V0S2V5d29yZHMoKSk7CgkJJHBkZi0+U2V0Q3JlYXRvcigkdGhpcy0+X3BocEV4Y2VsLT5nZXRQcm9wZXJ0aWVzKCktPmdldENyZWF0b3IoKSk7CgoJCS8vIFdyaXRlIHRvIGZpbGUKCQlmd3JpdGUoJGZpbGVIYW5kbGUsICRwZGYtPm91dHB1dCgkcEZpbGVuYW1lLCAnUycpKTsKCgkJLy8gQ2xvc2UgZmlsZQoJCWZjbG9zZSgkZmlsZUhhbmRsZSk7CgoJCVBIUEV4Y2VsX0NhbGN1bGF0aW9uOjpzZXRBcnJheVJldHVyblR5cGUoJHNhdmVBcnJheVJldHVyblR5cGUpOwoJfQoKCS8qKgoJICogR2V0IHRlbXBvcmFyeSBzdG9yYWdlIGRpcmVjdG9yeQoJICoKCSAqIEByZXR1cm4gc3RyaW5nCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRUZW1wRGlyKCkgewoJCXJldHVybiAkdGhpcy0+X3RlbXBEaXI7Cgl9CgoJLyoqCgkgKiBTZXQgdGVtcG9yYXJ5IHN0b3JhZ2UgZGlyZWN0b3J5CgkgKgoJICogQHBhcmFtIAlzdHJpbmcJJHBWYWx1ZQkJVGVtcG9yYXJ5IHN0b3JhZ2UgZGlyZWN0b3J5CgkgKiBAdGhyb3dzIAlFeGNlcHRpb24JRXhjZXB0aW9uIHdoZW4gZGlyZWN0b3J5IGRvZXMgbm90IGV4aXN0CgkgKiBAcmV0dXJuIFBIUEV4Y2VsX1dyaXRlcl9QREYKCSAqLwoJcHVibGljIGZ1bmN0aW9uIHNldFRlbXBEaXIoJHBWYWx1ZSA9ICcnKSB7CgkJaWYgKGlzX2RpcigkcFZhbHVlKSkgewoJCQkkdGhpcy0+X3RlbXBEaXIgPSAkcFZhbHVlOwoJCX0gZWxzZSB7CgkJCXRocm93IG5ldyBFeGNlcHRpb24oIkRpcmVjdG9yeSBkb2VzIG5vdCBleGlzdDogJHBWYWx1ZSIpOwoJCX0KCQlyZXR1cm4gJHRoaXM7Cgl9Cn0K]]></data>
	</file>
	<file>
	  <filename>/method.install.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKcmVxdWlyZV9vbmNlKCdkYXRhbW9kZWwvZGF0YWJhc2VvcGVyYXRpb25zLnBocCcpOwppZiAoIWlzc2V0KCRnQ21zKSkgZXhpdDsKCgkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoJICAgSW5zdGFsbCgpCgkgICBXaGVuIHlvdXIgbW9kdWxlIGlzIGluc3RhbGxlZCwgeW91IG1heSBuZWVkIHRvIGRvIHNvbWUKCSAgIHNldHVwLiBUeXBpY2FsIHRoaW5ncyB0aGF0IGhhcHBlbiBoZXJlIGFyZSB0aGUgY3JlYXRpb24KCSAgIGFuZCBwcmVwb3B1bGF0aW9uIG9mIGRhdGFiYXNlIHRhYmxlcywgZGF0YWJhc2Ugc2VxdWVuY2VzLAoJICAgcGVybWlzc2lvbnMsIHByZWZlcmVuY2VzLCBldGMuCgkgICAJICAgCgkgICBGb3IgaW5mb3JtYXRpb24gb24gdGhlIGNyZWF0aW9uIG9mIGRhdGFiYXNlIHRhYmxlcywKCSAgIGNoZWNrIG91dCB0aGUgQURPREIgRGF0YSBEaWN0aW9uYXJ5IHBhZ2UgYXQKCSAgIGh0dHA6Ly9waHBsZW5zLmNvbS9sZW5zL2Fkb2RiL2RvY3MtZGF0YWRpY3QuaHRtCgkgICAKCSAgIFRoaXMgZnVuY3Rpb24gY2FuIHJldHVybiBhIHN0cmluZyBpbiBjYXNlIG9mIGFueSBlcnJvciwKCSAgIGFuZCBDTVMgd2lsbCBub3QgY29uc2lkZXIgdGhlIG1vZHVsZSBpbnN0YWxsZWQuCgkgICBTdWNjZXNzZnVsIGluc3RhbGxzIHNob3VsZCByZXR1cm4gRkFMU0Ugb3Igbm90aGluZyBhdCBhbGwuCgkgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgkJLyoKCQkvLyBUeXBpY2FsIERhdGFiYXNlIEluaXRpYWxpemF0aW9uCgkJJGRiID0mICRnQ21zLT5HZXREYigpOwoJCQoJCS8vIG15c3FsLXNwZWNpZmljLCBidXQgaWdub3JlZCBieSBvdGhlciBkYXRhYmFzZQoJCSR0YWJvcHRhcnJheSA9IGFycmF5KCdteXNxbCcgPT4gJ1RZUEU9TXlJU0FNJyk7CgkJJGRpY3QgPSBOZXdEYXRhRGljdGlvbmFyeSgkZGIpOwoJCQogICAgICAgIC8vIHRhYmxlIHNjaGVtYSBkZXNjcmlwdGlvbgogICAgICAgICRmbGRzID0gIgoJCQlpZCBJIEtFWSwKCQkJZGVzY3JpcHRpb24gQyg4MCkKCQkJIjsKCgkJLy8gY3JlYXRlIGl0LiBUaGlzIHNob3VsZCBkbyBlcnJvciBjaGVja2luZywgYnV0IEknbSBhIGxhenkgc29kLgoJCSRzcWxhcnJheSA9ICRkaWN0LT5DcmVhdGVUYWJsZVNRTChjbXNfZGJfcHJlZml4KCkuIm1vZHVsZV9rZWdlbGVyZ2Vibmlzc2UiLAoJCQkJJGZsZHMsICR0YWJvcHRhcnJheSk7CgkJJGRpY3QtPkV4ZWN1dGVTUUxBcnJheSgkc3FsYXJyYXkpOwoKCQkvLyBjcmVhdGUgYSBzZXF1ZW5jZQoJCSRkYi0+Q3JlYXRlU2VxdWVuY2UoY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfa2VnZWxlcmdlYm5pc3NlX3NlcSIpOwoJCSovCgoJCURhdGFiYXNlT3BlcmF0aW9uczo6Y3JlYXRlRGF0YWJhc2UoKTsKCQkKCQkvLyBwZXJtaXNzaW9ucwoJCSR0aGlzLT5DcmVhdGVQZXJtaXNzaW9uKCdLZWdlbGVyZ2Vibmlzc2UnLCAkdGhpcy0+TGFuZygna2VnZWxlcmdlYm5pc3NlX3Blcm1kZXNjJykpOwoKCgkJLy8gcHV0IG1lbnRpb24gaW50byB0aGUgYWRtaW4gbG9nCgkJJHRoaXMtPkF1ZGl0KCAwLCAkdGhpcy0+TGFuZygnZnJpZW5kbHluYW1lJyksICR0aGlzLT5MYW5nKCdpbnN0YWxsZWQnLCR0aGlzLT5HZXRWZXJzaW9uKCkpKTsKPz4=]]></data>
	</file>
	<file>
	  <filename>/method.uninstall.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKcmVxdWlyZV9vbmNlKCdkYXRhbW9kZWwvZGF0YWJhc2VvcGVyYXRpb25zLnBocCcpOwppZiAoIWlzc2V0KCRnQ21zKSkgZXhpdDsKCgkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoJICAgVW5pbnN0YWxsKCkKCSAgIFNvbWV0aW1lcywgYW4gZXhjZXB0aW9uYWxseSB1bmVubGlnaHRlbmVkIG9yIGlnbm9yYW50CgkgICBhZG1pbiB3aWxsIHdpc2ggdG8gdW5pbnN0YWxsIHlvdXIgbW9kdWxlLiBXaGlsZSBpdAoJICAgd291bGQgYmUgYmVzdCB0byBsYXkgaW50byB0aGVzZSBpZGlvdHMgd2l0aCBhIGNsdWVzdGljaywKCSAgIHdlIHdpbGwgZG8gdGhlIG1hZ25hbmltb3VzIHRoaW5nIGFuZCByZW1vdmUgdGhlIG1vZHVsZQoJICAgYW5kIGNsZWFuIHVwIHRoZSBkYXRhYmFzZSwgcGVybWlzc2lvbnMsIGFuZCBwcmVmZXJlbmNlcwoJICAgdGhhdCBhcmUgc3BlY2lmaWMgdG8gaXQuCgkgICBUaGlzIGlzIHRoZSBtZXRob2Qgd2hlcmUgd2UgZG8gdGhpcy4KCSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCgkJLyoKCQkvLyBUeXBpY2FsIERhdGFiYXNlIFJlbW92YWwKCQkkZGIgPSYgJGdDbXMtPkdldERiKCk7CgkJCgkJLy8gcmVtb3ZlIHRoZSBkYXRhYmFzZSB0YWJsZQoJCSRkaWN0ID0gTmV3RGF0YURpY3Rpb25hcnkoICRkYiApOwoJCSRzcWxhcnJheSA9ICRkaWN0LT5Ecm9wVGFibGVTUUwoIGNtc19kYl9wcmVmaXgoKS4ibW9kdWxlX2tlZ2VsZXJnZWJuaXNzZSIgKTsKCQkkZGljdC0+RXhlY3V0ZVNRTEFycmF5KCRzcWxhcnJheSk7CgoJCS8vIHJlbW92ZSB0aGUgc2VxdWVuY2UKCQkkZGItPkRyb3BTZXF1ZW5jZSggY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfa2VnZWxlcmdlYm5pc3NlX3NlcSIgKTsKCQkqLwoJCURhdGFiYXNlT3BlcmF0aW9uczo6ZGVsZXRlRGF0YWJhc2UoKTsKCQkKCQkvLyByZW1vdmUgdGhlIHBlcm1pc3Npb25zCgkJJHRoaXMtPlJlbW92ZVBlcm1pc3Npb24oJ0tlZ2VsZXJnZWJuaXNzZScpOwoKCQkKCQkvLyBwdXQgbWVudGlvbiBpbnRvIHRoZSBhZG1pbiBsb2cKCQkkdGhpcy0+QXVkaXQoIDAsICR0aGlzLT5MYW5nKCdmcmllbmRseW5hbWUnKSwgJHRoaXMtPkxhbmcoJ3VuaW5zdGFsbGVkJykpOwoKPz4=]]></data>
	</file>
	<file>
	  <filename>/method.upgrade.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKcmVxdWlyZV9vbmNlKCJkYXRhbW9kZWwvZGF0YWJhc2VvcGVyYXRpb25zLnBocCIpOwoKaWYgKCFpc3NldCgkZ0NtcykpIGV4aXQ7CgoJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCSAgIFVwZ3JhZGUoKQoJICAgSWYgeW91ciBtb2R1bGUgdmVyc2lvbiBudW1iZXIgZG9lcyBub3QgbWF0Y2ggdGhlIHZlcnNpb24KCSAgIG51bWJlciBvZiB0aGUgaW5zdGFsbGVkIG1vZHVsZSwgdGhlIENNUyBBZG1pbiB3aWxsIGdpdmUKCSAgIHlvdSBhIGNoYW5jZSB0byB1cGdyYWRlIHRoZSBtb2R1bGUuIFRoaXMgaXMgdGhlIGZ1bmN0aW9uCgkgICB0aGF0IGFjdHVhbGx5IGhhbmRsZXMgdGhlIHVwZ3JhZGUuCgkgICBJZGVhbGx5LCB0aGlzIGZ1bmN0aW9uIHNob3VsZCBoYW5kbGUgdXBncmFkZXMgaW5jcmVtZW50YWxseSwKCSAgIHNvIHlvdSBjb3VsZCB1cGdyYWRlIGZyb20gdmVyc2lvbiAwLjAuMSB0byAxMC41Ljcgd2l0aAoJICAgYSBzaW5nbGUgY2FsbC4gRm9yIGEgZ3JlYXQgZXhhbXBsZSBvZiB0aGlzLCBzZWUgdGhlIE5ld3MKCSAgIG1vZHVsZSBpbiB0aGUgc3RhbmRhcmQgQ01TIGluc3RhbGwuCgkgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgkJJGN1cnJlbnRfdmVyc2lvbiA9ICRvbGR2ZXJzaW9uOwoJCXN3aXRjaCgkY3VycmVudF92ZXJzaW9uKQoJCXsKCQkJY2FzZSAiMC4wLjIiOgoJCQkJJHRoaXMtPkF1ZGl0KDAsICJrZWdlbGVyZ2Vibmlzc2UiLCAidXBkYXRlIHZvbiAwLjAuMiIpOwoJCQkJRGF0YWJhc2VPcGVyYXRpb25zOjp1cGRhdGVfbTBtMHAyX20wbTBwMygpOwoJCQkJYnJlYWs7CgkJCWNhc2UgIjAuMC4zIjoKCQkJY2FzZSAiMC4wLjQiOgoJCQljYXNlICIwLjAuNSI6CgkJCWNhc2UgIjAuMC42IjoKCQkJY2FzZSAiMC4wLjciOgoJCQkJJHRoaXMtPkF1ZGl0KDAsICJrZWdlbGVyZ2Vibmlzc2UiLCAidXBkYXRlIHZvbiAwLjAuNyIpOwoJCQkJRGF0YWJhc2VPcGVyYXRpb25zOjp1cGRhdGVfbTBtMHA3X20wbTBwOCgpOwoJCQkJYnJlYWs7CgkJfQoJCQoJCS8vIHB1dCBtZW50aW9uIGludG8gdGhlIGFkbWluIGxvZwoJCSR0aGlzLT5BdWRpdCggMCwgJHRoaXMtPkxhbmcoJ2ZyaWVuZGx5bmFtZScpLCAkdGhpcy0+TGFuZygndXBncmFkZWQnLCR0aGlzLT5HZXRWZXJzaW9uKCkpKTsKCj8+]]></data>
	</file>
	<file>
	  <filename>/templates/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/templates/adminpanel.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[eyR0YWJfaGVhZGVyc30KCnskc3RhcnRfc2Fpc29uX3RhYn0KPHRhYmxlIGNsYXNzPSdwYWdldGFibGUnPgoJPHRoZWFkPgoJCTx0cj48dGg+eyRzYWlzb25uYW1lX2hlYWRlcn08L3RoPjwvdHI+Cgk8L3RoZWFkPgoJPHRmb290PgoJCTx0cj48dGQ+eyRTYWlzb25Gb3JtQWRkU3RhcnR9eyRhY3RpdmV0YWJfc2Fpc29ufXskU2Fpc29uRm9ybUFkZE5hbWV9eyRTYWlzb25Gb3JtQWRkQmVnaW59eyRTYWlzb25Gb3JtQWRkRW5kfXskU2Fpc29uRm9ybUFkZFN1Ym1pdH17JFNhaXNvbkZvcm1BZGRTdG9wfTwvdGQ+PC90cj4KCTwvdGZvb3Q+Cgk8dGJvZHk+CgkJe2ZvcmVhY2ggZnJvbT0kc2Fpc29ucyBpdGVtPXNhaXNvbn0KCQk8dHI+PHRkPnskc2Fpc29uLlNhaXNvbkZvcm1DaGFuZ2VTdGFydH17JGFjdGl2ZXRhYl9zYWlzb259eyRzYWlzb24uU2Fpc29uRm9ybUNoYW5nZU5hbWV9eyRzYWlzb24uU2Fpc29uRm9ybUNoYW5nZUJlZ2lufXskc2Fpc29uLlNhaXNvbkZvcm1DaGFuZ2VFbmR9eyRzYWlzb24uU2Fpc29uRm9ybUNoYW5nZVN1Ym1pdH17JHNhaXNvbi5TYWlzb25Gb3JtQ2hhbmdlU3RvcH17JHNhaXNvbi5TYWlzb25MaW5rUGxheWVyQ29ubmVjdGlvbn08L3RkPjwvdHI+CgkJey9mb3JlYWNofQoJPC90Ym9keT4KPC90YWJsZT4KeyRlbmRfdGFifQoKeyRzdGFydF9zcGllbGVyX3RhYn0Ke2Fzc2lnbiB2YXI9cGxheWVyc29ydCB2YWx1ZT0iLCJ8ZXhwbG9kZToiQSxCLEMsRCxFLEYsRyxILEksSixLLEwsTSxOLE8sUCxRLFIsUyxULFUsVixXLFgsWSxaIn0Ke2ZvcmVhY2ggZnJvbT0kcGxheWVyc29ydCBpdGVtPXNlbGVjdGVkY2hhcmFjdGVyfQo8c3BhbiBvbmNsaWNrPSIKCXtmb3JlYWNoIGZyb209JHBsYXllcnNvcnQgaXRlbT1jaGFyYWN0ZXJ9Cgl7aWYgJHNlbGVjdGVkY2hhcmFjdGVyPT0kY2hhcmFjdGVyfQoJCXNldFZpc2liaWxpdHkoJ3BsYXllcnNfeyRjaGFyYWN0ZXJ9JywnYmxvY2snKTsKCXtlbHNlfQoJCXNldFZpc2liaWxpdHkoJ3BsYXllcnNfeyRjaGFyYWN0ZXJ9Jywnbm9uZScpOwoJey9pZn0KCXsvZm9yZWFjaH0KCXNldFZpc2liaWxpdHkoJ3skUGxheWVyRGVzY0FsbH0nLCdub25lJyk7CiI+eyRzZWxlY3RlZGNoYXJhY3Rlcn08L3NwYW4+Jm5ic3A7CnsvZm9yZWFjaH0KPHNwYW4gb25jbGljaz0iCgl7Zm9yZWFjaCBmcm9tPSRwbGF5ZXJzb3J0IGl0ZW09Y2hhcmFjdGVyfQoJCXNldFZpc2liaWxpdHkoJ3BsYXllcnNfeyRjaGFyYWN0ZXJ9Jywnbm9uZScpOwoJey9mb3JlYWNofQoJc2V0VmlzaWJpbGl0eSgneyRQbGF5ZXJEZXNjQWxsfScsJ2Jsb2NrJyk7CiI+eyRQbGF5ZXJEZXNjQWxsfTwvc3Bhbj4KCntmb3JlYWNoIGZyb209JHBsYXllcnNvcnQgaXRlbT1jaGFyYWN0ZXJ9Cgk8ZGl2IGNsYXNzPSdwYWdlb3ZlcmZsb3cnIGlkPSdwbGF5ZXJzX3skY2hhcmFjdGVyfScgc3R5bGU9ImRpc3BsYXk6bm9uZSI+CgkJPHRhYmxlIGNsYXNzPSdwYWdldGFibGUnPgoJCQk8dGhlYWQ+CgkJCQk8dHI+PHRoPnskcGxheWVybmFtZV9oZWFkZXJ9PC90aD48L3RyPgoJCQk8L3RoZWFkPgoJCQk8dGZvb3Q+CgkJCQk8dHI+PHRkPnskUGxheWVyRm9ybUFkZFN0YXJ0fXskYWN0aXZldGFiX3NwaWVsZXJ9eyRQbGF5ZXJGb3JtQWRkVGV4dH17JFBsYXllckZvcm1BZGRTdWJtaXR9eyRQbGF5ZXJGb3JtQWRkU3RvcH08L3RkPjwvdHI+CgkJCTwvdGZvb3Q+CgkJCTx0Ym9keT4KCQkJCXtmb3JlYWNoIGZyb209JHBsYXllcnMgaXRlbT1wbGF5ZXJ9CgkJCQl7aWYgc3Vic3RyKCRwbGF5ZXIuUGxheWVyTmFtZSwwLDEpID09ICRjaGFyYWN0ZXJ9PHRyPjx0ZD57JHBsYXllci5QbGF5ZXJGb3JtQ2hhbmdlU3RhcnR9eyRhY3RpdmV0YWJfc3BpZWxlcn17JHBsYXllci5QbGF5ZXJGb3JtQ2hhbmdlVGV4dH17JHBsYXllci5QbGF5ZXJGb3JtQ2hhbmdlU3VibWl0fXskcGxheWVyLlBsYXllckZvcm1DaGFuZ2VTdG9wfTwvdGQ+PC90cj57L2lmfQoJCQkJey9mb3JlYWNofQoJCQk8L3Rib2R5PgoJCTwvdGFibGU+Cgk8L2Rpdj4Key9mb3JlYWNofQoJPGRpdiBjbGFzcz0ncGFnZW92ZXJmbG93JyBpZD0neyRQbGF5ZXJEZXNjQWxsfScgc3R5bGU9ImRpc3BsYXk6bm9uZSI+CgkJPHRhYmxlIGNsYXNzPSdwYWdldGFibGUnPgoJCQk8dGhlYWQ+CgkJCQk8dHI+PHRoPnskcGxheWVybmFtZV9oZWFkZXJ9PC90aD48L3RyPgoJCQk8L3RoZWFkPgoJCQk8dGZvb3Q+CgkJCQk8dHI+PHRkPnskUGxheWVyRm9ybUFkZFN0YXJ0fXskYWN0aXZldGFiX3NwaWVsZXJ9eyRQbGF5ZXJGb3JtQWRkVGV4dH17JFBsYXllckZvcm1BZGRTdWJtaXR9eyRQbGF5ZXJGb3JtQWRkU3RvcH08L3RkPjwvdHI+CgkJCTwvdGZvb3Q+CgkJCTx0Ym9keT4KCQkJCXtmb3JlYWNoIGZyb209JHBsYXllcnMgaXRlbT1wbGF5ZXJ9CgkJCQk8dHI+PHRkPnskcGxheWVyLlBsYXllckZvcm1DaGFuZ2VTdGFydH17JGFjdGl2ZXRhYl9zcGllbGVyfXskcGxheWVyLlBsYXllckZvcm1DaGFuZ2VUZXh0fXskcGxheWVyLlBsYXllckZvcm1DaGFuZ2VTdWJtaXR9eyRwbGF5ZXIuUGxheWVyRm9ybUNoYW5nZVN0b3B9PC90ZD48L3RyPgoJCQkJey9mb3JlYWNofQoJCQk8L3Rib2R5PgoJCTwvdGFibGU+Cgk8L2Rpdj4KeyRlbmRfdGFifQoKeyRzdGFydF9tYW5uc2NoYWZ0X3RhYn0KPHRhYmxlIGNsYXNzPSdwYWdldGFibGUnPgoJPHRoZWFkPgoJCTx0cj48dGg+eyR0ZWFtbmFtZV9oZWFkZXJ9PC90aD48L3RyPgoJPC90aGVhZD4KCTx0Zm9vdD4KCQk8dHI+PHRkPnskVGVhbUZvcm1BZGRTdGFydH17JGFjdGl2ZXRhYl9tYW5uc2NoYWZ0fXskVGVhbUZvcm1BZGRUZXh0fXskVGVhbUZvcm1BZGRTdWJtaXR9eyRUZWFtRm9ybUFkZFN0b3B9PC90ZD48L3RyPgoJPC90Zm9vdD4KCTx0Ym9keT4KCQl7Zm9yZWFjaCBmcm9tPSR0ZWFtcyBpdGVtPXRlYW19CgkJPHRyPjx0ZD57JHRlYW0uVGVhbUZvcm1DaGFuZ2VTdGFydH17JGFjdGl2ZXRhYl9tYW5uc2NoYWZ0fXskdGVhbS5UZWFtRm9ybUNoYW5nZVRleHR9eyR0ZWFtLlRlYW1Gb3JtQ2hhbmdlU3VibWl0fXskdGVhbS5UZWFtRm9ybUNoYW5nZVN0b3B9PC90ZD48L3RyPgoJCXsvZm9yZWFjaH0KCTwvdGJvZHk+CjwvdGFibGU+CnskZW5kX3RhYn0KCnskc3RhcnRfc3BpZWxwbGFuX3RhYn0KPGg0PnskU3BpZWxwbGFuQ2hvb3NlRm9ybVN0YXJ0fQoJeyRhY3RpdmV0YWJfc3BpZWxwbGFufQoJeyRTcGllbHBsYW5DaG9vc2VGb3JtU2Fpc29uTGFiZWx9OiB7JFNwaWVscGxhbkNob29zZUZvcm1TYWlzb25TZWxlY3R9Jm5ic3A7Cgl7JFNwaWVscGxhbkNob29zZUZvcm1UZWFtTGFiZWx9OiB7JFNwaWVscGxhbkNob29zZUZvcm1UZWFtU2VsZWN0fSZuYnNwOwoJeyRTcGllbHBsYW5DaG9vc2VGb3JtU3VibWl0fQp7JFNwaWVscGxhbkNob29zZUZvcm1TdG9wfTwvaDQ+CjxkaXYgc3R5bGU9ImRpc3BsYXk6IG5vbmU7Ij4KeyRTcGllbHBsYW5HYW1lQWRkU3RhcnR9eyRTcGllbHBsYW5HYW1lQWRkU3RvcH0KeyRTcGllbHBsYW5HYW1lQ2hhbmdlU3RhcnR9eyRTcGllbHBsYW5HYW1lQ2hhbmdlU3RvcH0KPC9kaXY+Cjx0YWJsZSBjbGFzcz0ncGFnZXRhYmxlJz4KCTx0aGVhZD4KCQk8dHI+PHRoPnskU3BpZWxwbGFuVEhkYXRlfTwvdGg+PHRoPnskU3BpZWxwbGFuVEh0aW1lfTwvdGg+PHRoPnskU3BpZWxwbGFuVEhvcHBvbmVudH08L3RoPjx0aD57JFNwaWVscGxhblRIaG9tZWF3YXl9PC90aD48dGg+eyRTcGllbHBsYW5USDEyMH08L3RoPjx0aD57JFNwaWVscGxhblRIcmVzdWx0fTwvdGg+PHRoPnskU3BpZWxwbGFuVEhhY3Rpb259PC90aD48L3RyPgoJPC90aGVhZD4KCTx0Ym9keT4KCQl7Zm9yZWFjaCBmcm9tPSRnYW1lcyBpdGVtPWdhbWV9CgkJPHRyIGNsYXNzPSJmb3JtIj4KCQl7JGFjdGl2ZXRhYl9zcGllbHBsYW59PHRkPnskZ2FtZS5TcGllbHBsYW5HYW1lQ2hhbmdlRGF0ZX08L3RkPgoJCTx0ZD57JGdhbWUuU3BpZWxwbGFuR2FtZUNoYW5nZVRpbWV9PC90ZD4KCQk8dGQ+eyRnYW1lLlNwaWVscGxhbkdhbWVDaGFuZ2VPcHBvbmVudH08L3RkPgoJCTx0ZD57JGdhbWUuU3BpZWxwbGFuR2FtZUNoYW5nZUhvbWV9PC90ZD4KCQk8dGQ+eyRnYW1lLlNwaWVscGxhbkdhbWVDaGFuZ2UxMjB9PC90ZD4KCQk8dGQ+eyRnYW1lLlNwaWVscGxhbkdhbWVDaGFuZ2VSZXN1bHR9PC90ZD4KCQk8dGQ+eyRnYW1lLlNwaWVscGxhbkdhbWVDaGFuZ2VTdWJtaXR9eyRnYW1lLlNwaWVscGxhbkdhbWVDaGFuZ2VHYW1lSWRIaWRkZW59eyRTcGllbHBsYW5TZWxlY3RUZWFtSGlkZGVufXskU3BpZWxwbGFuU2VsZWN0U2Fpc29uSGlkZGVufTwvdGQ+CgkJPC90cj4KCQl7L2ZvcmVhY2h9CgkJPHRyIGNsYXNzPSJmb3JtIj57JGFjdGl2ZXRhYl9zcGllbHBsYW59PHRkPnskU3BpZWxwbGFuR2FtZUFkZERhdGV9PC90ZD4KCQk8dGQ+eyRTcGllbHBsYW5HYW1lQWRkVGltZX08L3RkPgoJCTx0ZD57JFNwaWVscGxhbkdhbWVBZGRPcHBvbmVudH08L3RkPgoJCTx0ZD57JFNwaWVscGxhbkdhbWVBZGRIb21lfTwvdGQ+CgkJPHRkPnskU3BpZWxwbGFuR2FtZUFkZDEyMH08L3RkPgoJCTx0ZD4tLS08L3RkPgoJCTx0ZD57JFNwaWVscGxhbkdhbWVBZGRTdWJtaXR9eyRTcGllbHBsYW5TZWxlY3RUZWFtSGlkZGVufXskU3BpZWxwbGFuU2VsZWN0U2Fpc29uSGlkZGVufTwvdGQ+CgkJPC90cj4KCTwvdGJvZHk+CjwvdGFibGU+Cgp7JHRhYl9mb290ZXJzfQ==]]></data>
	</file>
	<file>
	  <filename>/templates/completeteaminformation.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[CjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KCTwhLS0KCWZ1bmN0aW9uIHNldFZpc2liaWxpdHkoaWQsIHZpc2liaWxpdHkpIHsKCQlpZGVudGl0eT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCk7CgkJaWRlbnRpdHkuc3R5bGUuZGlzcGxheT12aXNpYmlsaXR5OwoJfQoJLy8tLT4KPC9zY3JpcHQ+Cgo8aDM+eyRUZWFtfSAtIHskU2Fpc29ufTwvaDM+Cgk8ZGl2IGlkPSJrZWdlbGVyZ2Vibmlzc2UubmF2aWdhdGlvbiI+CgkJPHNwYW4gaWQ9ImtlZ2VsZXJnZWJuaXNzZS50aW1ldGFibGVzZWwiIG9uY2xpY2s9IgoJCQlzZXRWaXNpYmlsaXR5KCdrZWdlbGVyZ2Vibmlzc2UudGltZXRhYmxlJywnYmxvY2snKTsKCQkJc2V0VmlzaWJpbGl0eSgna2VnZWxlcmdlYm5pc3NlLmF2ZXJhZ2UnLCdub25lJyk7CgkJIj57JFRhZ1RpbWVUYWJsZX08L3NwYW4+IC0gCgkJPHNwYW4gaWQ9ImtlZ2VsZXJnZWJuaXNzZS5hdmVyYWdlc2VsIiBvbmNsaWNrPSIKCQkJc2V0VmlzaWJpbGl0eSgna2VnZWxlcmdlYm5pc3NlLnRpbWV0YWJsZScsJ25vbmUnKTsKCQkJc2V0VmlzaWJpbGl0eSgna2VnZWxlcmdlYm5pc3NlLmF2ZXJhZ2UnLCdibG9jaycpOwoJCSI+eyRUYWdBdmdUYWJsZX08L3NwYW4+Cgk8L2Rpdj4KPHA+eyRUYWdEZXNjcmlwdGlvbn08L3A+Cgo8cD4KCTxkaXYgaWQ9ImtlZ2VsZXJnZWJuaXNzZS50aW1ldGFibGUiIHN0eWxlPSJkaXNwbGF5OmJsb2NrIj4KCQl7c2VjdGlvbiBuYW1lPWdhbWVjb3VudCBzdGFydD0xIGxvb3A9JE51bWJlck9mR2FtZXMrMX0KCQkJPGRpdiBpZD0ia2VnZWxlcmdlYm5pc3NlLmdhbWUueyRzbWFydHkuc2VjdGlvbi5nYW1lY291bnQuaW5kZXh9IiAKCQkJCXN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt6LWluZGV4OjEwMDttYXJnaW46MTZweDtkaXNwbGF5Om5vbmU7LXdlYmtpdC1ib3gtc2hhZG93OiAxNnB4IDE2cHggMTZweCAwICMwMDAwMDA7LW1vei1ib3gtc2hhZG93OiAxNnB4IDE2cHggMTZweCAwICMwMDAwMDA7Ym94LXNoYWRvdzogMTZweCAxNnB4IDE2cHggMCAjMDAwMDAwOyIgCgkJCQlvbmNsaWNrPSJzZXRWaXNpYmlsaXR5KCdrZWdlbGVyZ2Vibmlzc2UuZ2FtZS57JHNtYXJ0eS5zZWN0aW9uLmdhbWVjb3VudC5pbmRleH0nLCAnbm9uZScpIj4KCQkJCXtrZWdlbGVyZ2Vibmlzc2UgYWN0aW9uPSJzaG93Z2FtZSIgc2Fpc29uPSIkU2Fpc29uIiB0ZWFtPSIkVGVhbSIgbnVtYmVyPSRzbWFydHkuc2VjdGlvbi5nYW1lY291bnQuaW5kZXh9CgkJCTwvZGl2PgoJCXsvc2VjdGlvbn0KCQk8ZGl2PgoJCQl7Y21zX21vZHVsZSBtb2R1bGU9J2tlZ2VsZXJnZWJuaXNzZScgYWN0aW9uPSJzaG93dGVhbXRhYmxlIiBzYWlzb249IiRTYWlzb24iIHRlYW09IiRUZWFtIiBzaG93bGluaz0idHJ1ZSIgeGxzbGluaz0iJHhsc2xpbmsifQoJCTwvZGl2PgoJPC9kaXY+CgoJPGRpdiBpZD0ia2VnZWxlcmdlYm5pc3NlLmF2ZXJhZ2UiIHN0eWxlPSJkaXNwbGF5Om5vbmUiPgoJCXtpZiAkcmVzdWx0czEyMCA9PSB0cnVlfQoJCQl7Zm9yZWFjaCBmcm9tPSRQbGF5ZXJzIGl0ZW09cGxheWVyfQoJCQkJPGRpdiBpZD0ia2VnZWxlcmdlYm5pc3NlLnBsYXllci4xMjAueyRwbGF5ZXJ9IiAKCQkJCQlzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7ei1pbmRleDoxMDA7bWFyZ2luOjE2cHg7ZGlzcGxheTpub25lOy13ZWJraXQtYm94LXNoYWRvdzogMTZweCAxNnB4IDE2cHggMCAjMDAwMDAwOy1tb3otYm94LXNoYWRvdzogMTZweCAxNnB4IDE2cHggMCAjMDAwMDAwO2JveC1zaGFkb3c6IDE2cHggMTZweCAxNnB4IDAgIzAwMDAwMDsiIAoJCQkJCW9uY2xpY2s9InNldFZpc2liaWxpdHkoJ2tlZ2VsZXJnZWJuaXNzZS5wbGF5ZXIuMTIwLnskcGxheWVyfScsICdub25lJykiPgoJCQkJCXtrZWdlbGVyZ2Vibmlzc2UgYWN0aW9uPSJzaG93cGxheWVycmVzdWx0czEyMCIgcGxheWVyPSIkcGxheWVyIiBzYWlzb249IiRTYWlzb24iIHRlYW09IiRUZWFtIn0KCQkJCTwvZGl2PgoJCQl7L2ZvcmVhY2h9CgkJe2Vsc2V9CgkJCXtmb3JlYWNoIGZyb209JFBsYXllcnMgaXRlbT1wbGF5ZXJ9CgkJCQk8ZGl2IGlkPSJrZWdlbGVyZ2Vibmlzc2UucGxheWVyLnskcGxheWVyfSIgCgkJCQkJc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6MTAwO21hcmdpbjoxNnB4O2Rpc3BsYXk6bm9uZTstd2Via2l0LWJveC1zaGFkb3c6IDE2cHggMTZweCAxNnB4IDAgIzAwMDAwMDstbW96LWJveC1zaGFkb3c6IDE2cHggMTZweCAxNnB4IDAgIzAwMDAwMDtib3gtc2hhZG93OiAxNnB4IDE2cHggMTZweCAwICMwMDAwMDA7IiAKCQkJCQlvbmNsaWNrPSJzZXRWaXNpYmlsaXR5KCdrZWdlbGVyZ2Vibmlzc2UucGxheWVyLnskcGxheWVyfScsICdub25lJykiPgoJCQkJCXtrZWdlbGVyZ2Vibmlzc2UgYWN0aW9uPSJzaG93cGxheWVycmVzdWx0cyIgcGxheWVyPSIkcGxheWVyIiBzYWlzb249IiRTYWlzb24iIHRlYW09IiRUZWFtIn0KCQkJCTwvZGl2PgoJCQl7L2ZvcmVhY2h9CgkJey9pZn0KCQk8ZGl2PgoJCXtpZiAkcmVzdWx0czEyMCA9PSB0cnVlfQoJCQl7a2VnZWxlcmdlYm5pc3NlIGFjdGlvbj0ic2hvd2F2ZXJhZ2V0ZWFtMTIwIiBzYWlzb249IiRTYWlzb24iIHRlYW09IiRUZWFtIiBzaG93bGluaz0idHJ1ZSJ9CgkJe2Vsc2V9CgkJCXtrZWdlbGVyZ2Vibmlzc2UgYWN0aW9uPSJzaG93YXZlcmFnZXRlYW0iIHNhaXNvbj0iJFNhaXNvbiIgdGVhbT0iJFRlYW0iIHNob3dsaW5rPSJ0cnVlIn0KCQl7L2lmfQoJCTwvZGl2PgoJPC9kaXY+CjwvcD4K]]></data>
	</file>
	<file>
	  <filename>/templates/edit120game.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PGgzPnskcGFnZXRpdGxlfTwvaDM+CnskR2FtZUZvcm1TdGFydH0KPHRhYmxlIGNsYXNzPSdwYWdldGFibGUnPgoJPHRoZWFkPgoJe2lmICRHYW1lSXNIb21lID09IHRydWV9CgkJPHRyPjx0aCByb3dzcGFuPSIyIj5TcGllbDwvdGg+PHRoIGNvbHNwYW49IjUiPnskR2FtZUhvbWVUZWFtfTwvdGg+PHRoIGNvbHNwYW49IjUiPnskR2FtZU9wcG9uZW50fTwvdGg+PC90cj4KCXtlbHNlfQoJCTx0cj48dGggcm93c3Bhbj0iMiI+U3BpZWw8L3RoPjx0aCBjb2xzcGFuPSI1Ij57JEdhbWVPcHBvbmVudH08L3RoPjx0aCBjb2xzcGFuPSI1Ij57JEdhbWVIb21lVGVhbX08L3RoPjwvdHI+Cgl7L2lmfQoJPHRyPjx0aD7DmDwvdGg+PHRoPk5hbWU8L3RoPjx0aD5GZWhsPC90aD48dGg+QWJyPC90aD48dGg+R2VzPC90aD48dGg+R2VzPC90aD48dGg+QWJyPC90aD48dGg+RmVobDwvdGg+PHRoPk5hbWU8L3RoPjx0aD7DmDwvdGg+PC90cj4KCTwvdGhlYWQ+Cgk8dGJvZHk+Cgl7YXNzaWduIHZhcj1yZXNsaW5lIHZhbHVlPTB9Cgl7Zm9yZWFjaCBmcm9tPSRHYW1lUmVzdWx0cyBpdGVtPXJlc30KCXthc3NpZ24gdmFyPXJlc2xpbmUgdmFsdWU9JHJlc2xpbmUrMX0KCXtpZiAkR2FtZUlzSG9tZSA9PSB0cnVlfQoJCTx0cj4KCQkJPHRkIHJvd3NwYW49IjQiPnskcmVzbGluZX17JHJlcy5NYXRjaH08L3RkPgoJCQk8dGQgcm93c3Bhbj0iNCI+eyRyZXMuR2FtZUNvdW50fTwvdGQ+CgkJCTx0ZD57JHJlcy5HYW1lUGxheWVyU2VsZWN0aW9uX1MxfTwvdGQ+CgkJCTx0ZD57JHJlcy5HYW1lRmVobF9TMX08L3RkPgoJCQk8dGQ+eyRyZXMuR2FtZUFicl9TMX08L3RkPgoJCQk8dGQ+eyRyZXMuR2FtZUdlc19TMX08L3RkPgoJCQk8dGQ+eyRyZXMuR2FtZU9HZXNfUzF9PC90ZD4KCQkJPHRkPnskcmVzLkdhbWVPQWJyX1MxfTwvdGQ+CgkJCTx0ZD57JHJlcy5HYW1lT0ZlaGxfUzF9PC90ZD4KCQkJPHRkPnskcmVzLkdhbWVPcHBvbmVudF9TMX17JHJlcy5HYW1lSW5kZXhfUzF9PC90ZD4KCQkJPHRkIHJvd3NwYW49IjQiPnskcmVzLkdhbWVPQ291bnR9PC90ZD4KCQk8L3RyPgoJCTx0cj4KCQkJPHRkPnskcmVzLkdhbWVQbGF5ZXJTZWxlY3Rpb25fUzJ9PC90ZD4KCQkJPHRkPnskcmVzLkdhbWVGZWhsX1MyfTwvdGQ+CgkJCTx0ZD57JHJlcy5HYW1lQWJyX1MyfTwvdGQ+CgkJCTx0ZD57JHJlcy5HYW1lR2VzX1MyfTwvdGQ+CgkJCTx0ZD57JHJlcy5HYW1lT0dlc19TMn08L3RkPgoJCQk8dGQ+eyRyZXMuR2FtZU9BYnJfUzJ9PC90ZD4KCQkJPHRkPnskcmVzLkdhbWVPRmVobF9TMn08L3RkPgoJCQk8dGQ+eyRyZXMuR2FtZU9wcG9uZW50X1MyfXskcmVzLkdhbWVJbmRleF9TMn08L3RkPgoJCTwvdHI+CgkJPHRyPgoJCQk8dGQ+eyRyZXMuR2FtZVBsYXllclNlbGVjdGlvbl9TM308L3RkPgoJCQk8dGQ+eyRyZXMuR2FtZUZlaGxfUzN9PC90ZD4KCQkJPHRkPnskcmVzLkdhbWVBYnJfUzN9PC90ZD4KCQkJPHRkPnskcmVzLkdhbWVHZXNfUzN9PC90ZD4KCQkJPHRkPnskcmVzLkdhbWVPR2VzX1MzfTwvdGQ+CgkJCTx0ZD57JHJlcy5HYW1lT0Ficl9TM308L3RkPgoJCQk8dGQ+eyRyZXMuR2FtZU9GZWhsX1MzfTwvdGQ+CgkJCTx0ZD57JHJlcy5HYW1lT3Bwb25lbnRfUzN9eyRyZXMuR2FtZUluZGV4X1MzfTwvdGQ+CgkJPC90cj4KCQk8dHI+CgkJCTx0ZD57JHJlcy5HYW1lUGxheWVyU2VsZWN0aW9uX1M0fTwvdGQ+CgkJCTx0ZD57JHJlcy5HYW1lRmVobF9TNH08L3RkPgoJCQk8dGQ+eyRyZXMuR2FtZUFicl9TNH08L3RkPgoJCQk8dGQ+eyRyZXMuR2FtZUdlc19TNH08L3RkPgoJCQk8dGQ+eyRyZXMuR2FtZU9HZXNfUzR9PC90ZD4KCQkJPHRkPnskcmVzLkdhbWVPQWJyX1M0fTwvdGQ+CgkJCTx0ZD57JHJlcy5HYW1lT0ZlaGxfUzR9PC90ZD4KCQkJPHRkPnskcmVzLkdhbWVPcHBvbmVudF9TNH17JHJlcy5HYW1lSW5kZXhfUzR9PC90ZD4KCQk8L3RyPgoJCTx0cj48dGggY29sc3Bhbj0iMTEiPjwvdGg+PC90cj4KCXtlbHNlfQoJCTx0cj4KCQkJPHRkIHJvd3NwYW49IjQiPnskcmVzbGluZX17JHJlcy5NYXRjaH08L3RkPgoJCQk8dGQgcm93c3Bhbj0iNCI+eyRyZXMuR2FtZU9Db3VudH08L3RkPgoJCQk8dGQ+eyRyZXMuR2FtZU9wcG9uZW50X1MxfTwvdGQ+CgkJCTx0ZD57JHJlcy5HYW1lT0ZlaGxfUzF9PC90ZD4KCQkJPHRkPnskcmVzLkdhbWVPQWJyX1MxfTwvdGQ+CgkJCTx0ZD57JHJlcy5HYW1lT0dlc19TMX08L3RkPgoJCQk8dGQ+eyRyZXMuR2FtZUdlc19TMX08L3RkPgoJCQk8dGQ+eyRyZXMuR2FtZUFicl9TMX08L3RkPgoJCQk8dGQ+eyRyZXMuR2FtZUZlaGxfUzF9PC90ZD4KCQkJPHRkPnskcmVzLkdhbWVQbGF5ZXJTZWxlY3Rpb25fUzF9eyRyZXMuR2FtZUluZGV4X1MxfTwvdGQ+CgkJCTx0ZCByb3dzcGFuPSI0Ij57JHJlcy5HYW1lQ291bnR9PC90ZD4KCQk8L3RyPgoJCTx0cj4KCQkJPHRkPnskcmVzLkdhbWVPcHBvbmVudF9TMn08L3RkPgoJCQk8dGQ+eyRyZXMuR2FtZU9GZWhsX1MyfTwvdGQ+CgkJCTx0ZD57JHJlcy5HYW1lT0Ficl9TMn08L3RkPgoJCQk8dGQ+eyRyZXMuR2FtZU9HZXNfUzJ9PC90ZD4KCQkJPHRkPnskcmVzLkdhbWVHZXNfUzJ9PC90ZD4KCQkJPHRkPnskcmVzLkdhbWVBYnJfUzJ9PC90ZD4KCQkJPHRkPnskcmVzLkdhbWVGZWhsX1MyfTwvdGQ+CgkJCTx0ZD57JHJlcy5HYW1lUGxheWVyU2VsZWN0aW9uX1MyfXskcmVzLkdhbWVJbmRleF9TMn08L3RkPgoJCTwvdHI+CgkJPHRyPgoJCQk8dGQ+eyRyZXMuR2FtZU9wcG9uZW50X1MzfTwvdGQ+CgkJCTx0ZD57JHJlcy5HYW1lT0ZlaGxfUzN9PC90ZD4KCQkJPHRkPnskcmVzLkdhbWVPQWJyX1MzfTwvdGQ+CgkJCTx0ZD57JHJlcy5HYW1lT0dlc19TM308L3RkPgoJCQk8dGQ+eyRyZXMuR2FtZUdlc19TM308L3RkPgoJCQk8dGQ+eyRyZXMuR2FtZUFicl9TM308L3RkPgoJCQk8dGQ+eyRyZXMuR2FtZUZlaGxfUzN9PC90ZD4KCQkJPHRkPnskcmVzLkdhbWVQbGF5ZXJTZWxlY3Rpb25fUzN9eyRyZXMuR2FtZUluZGV4X1MzfTwvdGQ+CgkJPC90cj4KCQk8dHI+CgkJCTx0ZD57JHJlcy5HYW1lT3Bwb25lbnRfUzR9PC90ZD4KCQkJPHRkPnskcmVzLkdhbWVPRmVobF9TNH08L3RkPgoJCQk8dGQ+eyRyZXMuR2FtZU9BYnJfUzR9PC90ZD4KCQkJPHRkPnskcmVzLkdhbWVPR2VzX1M0fTwvdGQ+CgkJCTx0ZD57JHJlcy5HYW1lR2VzX1M0fTwvdGQ+CgkJCTx0ZD57JHJlcy5HYW1lQWJyX1M0fTwvdGQ+CgkJCTx0ZD57JHJlcy5HYW1lRmVobF9TNH08L3RkPgoJCQk8dGQ+eyRyZXMuR2FtZVBsYXllclNlbGVjdGlvbl9TNH17JHJlcy5HYW1lSW5kZXhfUzR9PC90ZD4KCQk8L3RyPgoJCTx0cj48dGggY29sc3Bhbj0iMTEiPjwvdGg+PC90cj4KCXsvaWZ9Cgl7L2ZvcmVhY2h9Cgk8L3Rib2R5Pgo8L3RhYmxlPgp7JEdhbWVGb3JtU3VibWl0fQp7JEdhbWVGb3JtRW5kfQ==]]></data>
	</file>
	<file>
	  <filename>/templates/editgame.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PGgzPnskcGFnZXRpdGxlfTwvaDM+CnskR2FtZUZvcm1TdGFydH0KPHRhYmxlIGNsYXNzPSdwYWdldGFibGUnPgoJPHRoZWFkPgoJe2lmICRHYW1lSXNIb21lID09IHRydWV9CgkJPHRyPjx0aCBjb2xzcGFuPSI1Ij57JEdhbWVIb21lVGVhbX08L3RoPjx0aCBjb2xzcGFuPSI1Ij57JEdhbWVPcHBvbmVudH08L3RoPjwvdHI+Cgl7ZWxzZX0KCQk8dHI+PHRoIGNvbHNwYW49IjUiPnskR2FtZU9wcG9uZW50fTwvdGg+PHRoIGNvbHNwYW49IjUiPnskR2FtZUhvbWVUZWFtfTwvdGg+PC90cj4KCXsvaWZ9Cgk8dHI+PHRoPsOYPC90aD48dGg+TmFtZTwvdGg+PHRoPkZlaGw8L3RoPjx0aD5BYnI8L3RoPjx0aD5HZXM8L3RoPjx0aD5HZXM8L3RoPjx0aD5BYnI8L3RoPjx0aD5GZWhsPC90aD48dGg+TmFtZTwvdGg+PHRoPsOYPC90aD48L3RyPgoJPC90aGVhZD4KCTx0Ym9keT4KCXtmb3JlYWNoIGZyb209JEdhbWVSZXN1bHRzIGl0ZW09cmVzfQoJe2lmICRHYW1lSXNIb21lID09IHRydWV9CgkJPHRyPgoJCQk8dGQ+eyRyZXMuR2FtZUNvdW50fTwvdGQ+CgkJCTx0ZD57JHJlcy5HYW1lUGxheWVyU2VsZWN0aW9ufTwvdGQ+CgkJCTx0ZD57JHJlcy5HYW1lRmVobH08L3RkPgoJCQk8dGQ+eyRyZXMuR2FtZUFicn08L3RkPgoJCQk8dGQ+eyRyZXMuR2FtZUdlc308L3RkPgoJCQk8dGQ+eyRyZXMuR2FtZU9HZXN9PC90ZD4KCQkJPHRkPnskcmVzLkdhbWVPQWJyfTwvdGQ+CgkJCTx0ZD57JHJlcy5HYW1lT0ZlaGx9PC90ZD4KCQkJPHRkPnskcmVzLkdhbWVPcHBvbmVudH08L3RkPgoJCQk8dGQ+eyRyZXMuR2FtZU9Db3VudH17JHJlcy5HYW1lSW5kZXh9PC90ZD4KCQk8L3RyPgoJe2Vsc2V9CgkJPHRyPgoJCQk8dGQ+eyRyZXMuR2FtZU9Db3VudH08L3RkPgoJCQk8dGQ+eyRyZXMuR2FtZU9wcG9uZW50fTwvdGQ+CgkJCTx0ZD57JHJlcy5HYW1lT0ZlaGx9PC90ZD4KCQkJPHRkPnskcmVzLkdhbWVPQWJyfTwvdGQ+CgkJCTx0ZD57JHJlcy5HYW1lT0dlc308L3RkPgoJCQk8dGQ+eyRyZXMuR2FtZUdlc308L3RkPgoJCQk8dGQ+eyRyZXMuR2FtZUFicn08L3RkPgoJCQk8dGQ+eyRyZXMuR2FtZUZlaGx9PC90ZD4KCQkJPHRkPnskcmVzLkdhbWVQbGF5ZXJTZWxlY3Rpb259PC90ZD4KCQkJPHRkPnskcmVzLkdhbWVDb3VudH17JHJlcy5HYW1lSW5kZXh9PC90ZD4KCQk8L3RyPgoJey9pZn0KCXsvZm9yZWFjaH0KCTwvdGJvZHk+CjwvdGFibGU+CnskR2FtZUZvcm1TdWJtaXR9CnskR2FtZUZvcm1FbmR9]]></data>
	</file>
	<file>
	  <filename>/templates/error.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PGgzPnskdGl0bGVfZXJyb3J9PC9oMz4Ke2lmICRtZXNzYWdlIT0nJ308cD57JG1lc3NhZ2V9PC9wPnsvaWZ9]]></data>
	</file>
	<file>
	  <filename>/templates/kegelergebnisse.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogRm9ybWF0aWVydW5nZW4gZsO8ciBlaW5lbiBTcGllbHBsYW4gKi8KCnRhYmxlLnRpbWV0YWJsZQp7Cglib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwoJYm9yZGVyLXN0eWxlOiBzb2xpZDsKCWJvcmRlci13aWR0aDogMXB4OwoJYm9yZGVyLWNvbG9yOiAjMDAwMDAwOwoJZm9udC1zaXplOiA4cHQ7Cn0KCnRhYmxlLnRpbWV0YWJsZSB0ZCwgdGFibGUudGltZXRhYmxlIHRoCnsKCXBhZGRpbmc6IDFweDsKCWJvcmRlci1zdHlsZTogc29saWQ7Cglib3JkZXItd2lkdGg6IDFweDsKCXRleHQtYWxpZ246IGxlZnQ7Cn0KCnRhYmxlLnRpbWV0YWJsZSB0ci50aW1ldGFibGVoZWFkZXIKewoJYmFja2dyb3VuZC1jb2xvcjogI0FBQUFBQTsKCWZvbnQtd2VpZ2h0OiBib2xkOwoJYm9yZGVyLWJvdHRvbS1zdHlsZTogc29saWQ7Cglib3JkZXItYm90dG9tLXdpZHRoOiAycHg7Cn0KCnRhYmxlLnRpbWV0YWJsZSB0ci50aW1ldGFibGV6d2VpCnsKCWJhY2tncm91bmQtY29sb3I6ICNFRUVFRUU7Cn0KdGFibGUudGltZXRhYmxlIHRyLnRpbWV0YWJsZWVpbnMKewoJYmFja2dyb3VuZC1jb2xvcjogI0RERERERDsKfQoKdGFibGUudGltZXRhYmxlIHRkLnRpbWV0YWJsZXJlc3VsdAp7Cgl0ZXh0LWFsaWduOiBjZW50ZXI7Cglmb250LWZhbWlseTogZml4ZWQ7Cn0KCi8qIEZvcm1hdGllcnVuZ2VuIGbDvHIgZGllIERvd25sb2FkcyAqLwpkaXYuc2NoZWR1bGVsaW5rCnsKCWRpc3BsYXk6IHRhYmxlLWNlbGw7Cn0KCi8qIEZvcm1hdGllcnVuZ2VuIGbDvHIgZGllIFNjaG5pdHRsaXN0ZSAqLwoKdGFibGUuYXZnCnsKCWJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7Cglib3JkZXItc3R5bGU6IHNvbGlkOwoJYm9yZGVyLXdpZHRoOiAxcHg7Cglib3JkZXItY29sb3I6ICMwMDAwMDA7Cglmb250LXNpemU6IDhwdDsKfQoKdGFibGUuYXZnIHRkLCB0YWJsZS5hdmcgdGgKewoJcGFkZGluZzogMXB4OwoJYm9yZGVyLXN0eWxlOiBzb2xpZDsKCWJvcmRlci13aWR0aDogMXB4Owp9Cgp0YWJsZS5hdmcgdHIuYXZnaGVhZGVyIHRkCnsKCWJvcmRlci1ib3R0b20tc3R5bGU6IHNvbGlkOwoJYm9yZGVyLWJvdHRvbS13aWR0aDogMnB4Owp9Cgp0YWJsZS5hdmcgdGQuYXZnZ2VzLCB0YWJsZS5hdmcgdGQuYXZnYWJyLCB0YWJsZS5hdmcgdGQuYXZndm9sbCwgdGFibGUuYXZnIHRkLmF2Z2ZlaGwKewoJZm9udC1mYW1pbHk6IGZpeGVkOwoJdGV4dC1hbGlnbjogcmlnaHQ7Cn0KCnRhYmxlLmF2ZyB0ZC5hdmdhcnQKewoJYm9yZGVyLWxlZnQtc3R5bGU6IG5vbmU7Cglib3JkZXItcmlnaHQtc3R5bGU6IG5vbmU7Cn0KCnRhYmxlLmF2ZyB0ZC5hdmdnZXMKewoJZm9udC13ZWlnaHQ6IGJvbGQ7Cn0KCnRhYmxlLmF2ZyB0ci5hdmdnZXNsaW5lIHRkCnsKCWJvcmRlci10b3Atd2lkdGg6IDJweDsKCWJvcmRlci10b3Atc3R5bGU6IHNvbGlkOwp9Cgp0YWJsZS5hdmcgdHIuYXZnaGVhZGVyCnsKCWZvbnQtd2VpZ2h0OiBib2xkOwoJYmFja2dyb3VuZC1jb2xvcjogI0FBQUFBQTsKfQoKdGFibGUuYXZnIHRyLmF2Z2dlc2xpbmUKewoJYmFja2dyb3VuZC1jb2xvcjogI0JCQkI5OTsKfQoKdGFibGUuYXZnIHRkLmF2Z25hbWUKewoJYmFja2dyb3VuZC1jb2xvcjogI0RERERERDsKfQoKdGFibGUuYXZnIHRyLmF2Z2hlaW1saW5lCnsKCWJhY2tncm91bmQtY29sb3I6ICM5OUREOTk7Cn0KCnRhYmxlLmF2ZyB0ci5hdmdhdXN3bGluZQp7CgliYWNrZ3JvdW5kLWNvbG9yOiAjREQ5OTk5Owp9CgovKiBGb3JtYXRpZXJ1bmdlbiBmw7xyIGVpbmVuIFNwaWVsYmVyaWNodCAqLwoKdGFibGUuYmVyaWNodAp7Cglib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwoJYm9yZGVyLXN0eWxlOiBzb2xpZDsKCWJvcmRlci13aWR0aDogMXB4OwoJYm9yZGVyLWNvbG9yOiAjMDAwMDAwOwoJYmFja2dyb3VuZC1jb2xvcjogI0RERERERDsKfQoKdGFibGUuYmVyaWNodCB0ZCwgdGFibGUuYmVyaWNodCB0aAp7Cglib3JkZXItc3R5bGU6IHNvbGlkOwoJYm9yZGVyLXdpZHRoOiAxcHg7Cgl0ZXh0LWFsaWduOiByaWdodDsKCXBhZGRpbmc6IDJweDsKfQoKdGFibGUuYmVyaWNodCB0ci5iZXJpY2h0dGVhbXMKewoJYmFja2dyb3VuZC1jb2xvcjogI0FBQUFBQTsKCWZvbnQtd2VpZ2h0OiBib2xkOwp9Cgp0YWJsZS5iZXJpY2h0IHRyLmJlcmljaHRyZXN1bHQgdGQKewoJZm9udC13ZWlnaHQ6IGJvbGQ7CgliYWNrZ3JvdW5kLWNvbG9yOiAjQUFBQUFBOwoJYm9yZGVyLXRvcC1zdHlsZTogc29saWQ7Cglib3JkZXItdG9wLXdpZHRoOiAycHg7Cn0KCnRhYmxlLmJlcmljaHQgdHIuYmVyaWNodGhlYWRlcgp7Cglmb250LXNpemU6IDhweDsKCWZvbnQtd2VpZ2h0OiBib2xkOwoJYm9yZGVyLWJvdHRvbS1zdHlsZTogc29saWQ7Cglib3JkZXItdG9wLXN0eWxlOiBzb2xpZDsKCWJvcmRlci1ib3R0b20td2lkdGg6IDJweDsKCWJvcmRlci10b3Atd2lkdGg6IDJweDsKfQoKdGFibGUuYmVyaWNodCB0ZC5iZXJpY2h0bmFtZSwgdGFibGUuYmVyaWNodCB0ZC5iZXJpY2h0aGVhZGVyLCB0YWJsZS5iZXJpY2h0IHRkLmJlcmljaHR0ZWFtcwp7Cgl0ZXh0LWFsaWduOiBsZWZ0Owp9Cgp0YWJsZS5iZXJpY2h0IHRyLmJlcmljaHRsaW5lIHRkLmJlcmljaHRnZXMsIHRhYmxlLmJlcmljaHQgdHIuYmVyaWNodGxpbmUgdGQuYmVyaWNodGFiciwgdGFibGUuYmVyaWNodCB0ci5iZXJpY2h0bGluZSB0ZC5iZXJpY2h0dm9sbCwgdGFibGUuYmVyaWNodCB0ci5iZXJpY2h0bGluZSB0ZC5iZXJpY2h0ZmVobAp7Cglmb250LWZhbWlseTogZml4ZWQ7Cn0KCnRhYmxlLmJlcmljaHQgdHIuYmVyaWNodGxpbmUgdGQuYmVyaWNodGdlcwp7Cglmb250LXdlaWdodDogYm9sZAp9CgovKiBGb3JtYXRpZXJ1bmdlbiBmw7xyIGVpbmUgU3BpZWxlcnN0YXRpc3RpayAqLwp0YWJsZS5wbGF5ZXJzdGF0aXN0aWNzCnsKCWJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7Cglib3JkZXItc3R5bGU6IHNvbGlkOwoJYm9yZGVyLXdpZHRoOiAxcHg7Cglib3JkZXItY29sb3I6ICMwMDAwMDA7CgltYXJnaW46IDVweCBhdXRvOwoJdGV4dC1hbGlnbjogY2VudGVyOwoJZm9udC1zaXplOiAxMHB0OwoJZm9udC1mYW1pbHk6IGZpeGVkOwp9Cgp0YWJsZS5wbGF5ZXJzdGF0aXN0aWNzIHRkLCB0YWJsZS5wbGF5ZXJzdGF0aXN0aWNzIHRoCnsKCWJvcmRlci13aWR0aDogMXB4OwoJYm9yZGVyLXN0eWxlOiBzb2xpZDsKCXZlcnRpY2FsLWFsaWduOiBib3R0b207Cgl0ZXh0LWFsaWduOiByaWdodDsKCXBhZGRpbmc6IDJweDsKfQoKdGFibGUucGxheWVyc3RhdGlzdGljcyB0ci5wbGF5ZXJzdGF0aXN0aWNzaGVhZGVyCnsKCWZvbnQtZmFtaWx5OiBzYW5zLXNlcmlmOwoJYmFja2dyb3VuZC1jb2xvcjogI0ZGMDAwMDsKfQoKdGFibGUucGxheWVyc3RhdGlzdGljcyB0ZC5wbGF5ZXJzdGF0aXN0aWNzaGVhZGVyLCB0YWJsZS5wbGF5ZXJzdGF0aXN0aWNzIHRoLnBsYXllcnN0YXRpc3RpY3NoZWFkZXIKewoJdGV4dC1hbGlnbjogY2VudGVyOwoJZm9udC1mYW1pbHk6IHNhbnMtc2VyaWY7Cn0KCnRhYmxlLnBsYXllcnN0YXRpc3RpY3MgdGQucGxheWVyc3RhdGlzdGljc2hlYWRlcl9sZWZ0LCB0YWJsZS5wbGF5ZXJzdGF0aXN0aWNzIHRoLnBsYXllcnN0YXRpc3RpY3NoZWFkZXJfbGVmdAp7Cgl0ZXh0LWFsaWduOiBsZWZ0OwoJZm9udC1mYW1pbHk6IHNhbnMtc2VyaWY7Cn0KCnRhYmxlLnBsYXllcnN0YXRpc3RpY3MgdHIucGxheWVyc3RhdGlzdGljc2hlaW0sIHRyLnBsYXllcnN0YXRpc3RpY3NzaGVpbQp7CgliYWNrZ3JvdW5kLWNvbG9yOiAjOTlERDk5OwkKfQoKdGFibGUucGxheWVyc3RhdGlzdGljcyB0ZC5wbGF5ZXJzdGF0aXN0aWNzX25oZWltCnsKCWJhY2tncm91bmQtY29sb3I6ICNEREZGREQ7Cn0KCnRhYmxlLnBsYXllcnN0YXRpc3RpY3MgdHIucGxheWVyc3RhdGlzdGljc2F1c3csIHRyLnBsYXllcnN0YXRpc3RpY3NzYXVzdwp7CgliYWNrZ3JvdW5kLWNvbG9yOiAjREQ5OTk5OwkKfQoKdGFibGUucGxheWVyc3RhdGlzdGljcyB0ZC5wbGF5ZXJzdGF0aXN0aWNzX25hdXN3CnsKCWJhY2tncm91bmQtY29sb3I6ICNGRkREREQ7Cn0KCnRhYmxlLnBsYXllcnN0YXRpc3RpY3MgdHIucGxheWVyc3RhdGlzdGljc3NnZXNhbXQKewoJYmFja2dyb3VuZC1jb2xvcjogI0JCQkI5OTsJCn0K]]></data>
	</file>
	<file>
	  <filename>/templates/kegelergebnisse.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[ZnVuY3Rpb24gc2V0VmlzaWJpbGl0eShpZCwgdmlzaWJpbGl0eSkgewoJaWRlbnRpdHk9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpOwoJaWRlbnRpdHkuc3R5bGUuZGlzcGxheT12aXNpYmlsaXR5Owp9CgpmdW5jdGlvbiBzdWJtaXRGb3JtKGVsZW1lbnQsIGZvcm1pZCkKewoJZWxlbWVudC50eXBlID0gJ2hpZGRlbic7CgoJd2hpbGUoZWxlbWVudC5jbGFzc05hbWUgIT0gJ2Zvcm0nKQoJCWVsZW1lbnQgPSBlbGVtZW50LnBhcmVudE5vZGU7CgkJCgl2YXIgZm9ybSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGZvcm1pZCk7CgkKCXZhciBpbnB1dHMgPSBlbGVtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdpbnB1dCcpOwoJd2hpbGUoaW5wdXRzLmxlbmd0aCA+IDApIAoJCWZvcm0uYXBwZW5kQ2hpbGQoaW5wdXRzWzBdKTsKCQkKCXZhciBzZWxlY3RzID0gZWxlbWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnc2VsZWN0Jyk7Cgl3aGlsZShzZWxlY3RzLmxlbmd0aCA+IDApIAoJCWZvcm0uYXBwZW5kQ2hpbGQoc2VsZWN0c1swXSk7CgkJCgl2YXIgdGV4dGFyZWFzID0gZWxlbWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgndGV4dGFyZWEnKTsKCXdoaWxlKHRleHRhcmVhcy5sZW5ndGggPiAwKSAKCQlmb3JtLmFwcGVuZENoaWxkKHRleHRhcmVhc1swXSk7CgkKCWZvcm0uc3VibWl0KCk7Cn0=]]></data>
	</file>
	<file>
	  <filename>/templates/playertoteam.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[e2Fzc2lnbiB2YXI9cGxheWVyc29ydCB2YWx1ZT0iLCJ8ZXhwbG9kZToiQSxCLEMsRCxFLEYsRyxILEksSixLLEwsTSxOLE8sUCxRLFIsUyxULFUsVixXLFgsWSxaIn0KCjxoMz57JHBhZ2V0aXRsZX08L2gzPgoKPGg1Pnskc29ydGJ5dGVhbX08L2g1Pgo8cD4Ke2ZvcmVhY2ggbmFtZT10ZWFtbG9vcCBmcm9tPSRQVFRhbGx0ZWFtbmFtZXMgaXRlbT1zZWxlY3RlZHRlYW19CntpZiAoKCgkc21hcnR5LmZvcmVhY2gudGVhbWxvb3AuaXRlcmF0aW9uIC0gMSkgJSA1KSA9PSAwKSAmJiAoJHNtYXJ0eS5mb3JlYWNoLnRlYW1sb29wLml0ZXJhdGlvbiAhPSAxKX08YnIvPnsvaWZ9CjxzcGFuIG9uY2xpY2s9IgoJe2ZvcmVhY2ggZnJvbT0kcGxheWVyc29ydCBpdGVtPWNoYXJhY3Rlcn0KCQlzZXRWaXNpYmlsaXR5KCdwdHRfeyRjaGFyYWN0ZXJ9Jywnbm9uZScpOwoJey9mb3JlYWNofQoJe2ZvcmVhY2ggZnJvbT0kUFRUYWxsdGVhbW5hbWVzIGl0ZW09dGVhbW5hbWV9CgkJe2lmICRzZWxlY3RlZHRlYW09PSR0ZWFtbmFtZX0KCQkJc2V0VmlzaWJpbGl0eSgncHR0X3skdGVhbW5hbWV9JywnYmxvY2snKTsKCQl7ZWxzZX0KCQkJc2V0VmlzaWJpbGl0eSgncHR0X3skdGVhbW5hbWV9Jywnbm9uZScpOwoJCXsvaWZ9Cgl7L2ZvcmVhY2h9CiI+eyRzZWxlY3RlZHRlYW19PC9zcGFuPiAtICAKey9mb3JlYWNofQo8L3A+Cgo8aDU+eyRzb3J0YnlwbGF5ZXJ9PC9oNT4KPHA+Cntmb3JlYWNoIGZyb209JHBsYXllcnNvcnQgaXRlbT1zZWxlY3RlZGNoYXJ9CjxzcGFuIG9uY2xpY2s9IgoJe2ZvcmVhY2ggZnJvbT0kcGxheWVyc29ydCBpdGVtPWNoYXJhY3Rlcn0KCQl7aWYgJHNlbGVjdGVkY2hhcj09JGNoYXJhY3Rlcn0KCQkJc2V0VmlzaWJpbGl0eSgncHR0X3skY2hhcmFjdGVyfScsJ2Jsb2NrJyk7CgkJe2Vsc2V9CgkJCXNldFZpc2liaWxpdHkoJ3B0dF97JGNoYXJhY3Rlcn0nLCdub25lJyk7CgkJey9pZn0KCXsvZm9yZWFjaH0KCXtmb3JlYWNoIGZyb209JFBUVGFsbHRlYW1uYW1lcyBpdGVtPXRlYW1uYW1lfQoJCXNldFZpc2liaWxpdHkoJ3B0dF97JHRlYW1uYW1lfScsJ25vbmUnKTsKCXsvZm9yZWFjaH0KIj57JHNlbGVjdGVkY2hhcn08L3NwYW4+Jm5ic3A7CnsvZm9yZWFjaH0KPC9wPgoKe2ZvcmVhY2ggZnJvbT0kUFRUYWxsdGVhbW5hbWVzIGl0ZW09dGVhbW5hbWV9CjxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyIgaWQ9InB0dF97JHRlYW1uYW1lfSIgc3R5bGU9ImRpc3BsYXk6bm9uZSI+Cgk8dGFibGUgY2xhc3M9J3BhZ2V0YWJsZSc+CgkJPHRyPjx0aD57JHNvcnRieXRlYW19OiB7JHRlYW1uYW1lfTwvdGg+PC90cj4KCQl7Zm9yZWFjaCBmcm9tPSRQVFRDaGFuZ2VEYXRhU2V0IGl0ZW09ZGF0YX0KCQl7aWYgJGRhdGEuUFRUQ2hhbmdlVGVhbU5hbWU9PSR0ZWFtbmFtZX0KCQk8dHI+PHRkPnskZGF0YS5QVFRDaGFuZ2VGb3JtU3RhcnR9eyRkYXRhLlBUVENoYW5nZVRlYW1JZF9oaWRkZW59eyRzYWlzb25pZF9oaWRkZW59eyRkYXRhLlBUVENoYW5nZVBsYXllckRyb3B9eyRkYXRhLlBUVENoYW5nZVN1Ym1pdH17JGRhdGEuUFRUQ2hhbmdlRm9ybUVuZH08L3RkPjwvdHI+CgkJey9pZn0KCQl7L2ZvcmVhY2h9CgkJPHRyPjx0ZD57JFBUVEFkZEZvcm1TdGFydH17JFBUVEFkZFRlYW1zSGlkZGVuLiR0ZWFtbmFtZX17JHNhaXNvbmlkX2hpZGRlbn17JFBUVEFkZFBsYXllckRyb3B9eyRQVFRBZGRTdWJtaXR9eyRQVFRBZGRGb3JtRW5kfTwvdGQ+PC90cj4KCTwvdGFibGU+CjwvZGl2Pgp7L2ZvcmVhY2h9Cgp7Zm9yZWFjaCBmcm9tPSRwbGF5ZXJzb3J0IGl0ZW09cGxheWVyY2hhcn0KPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93IiBpZD0icHR0X3skcGxheWVyY2hhcn0iIHN0eWxlPSJkaXNwbGF5Om5vbmUiPgoJPHRhYmxlIGNsYXNzPSdwYWdldGFibGUnPgoJCTx0cj48dGggY29sc3Bhbj0iMyI+eyRzb3J0YnlwbGF5ZXJ9OiB7JHBsYXllcmNoYXJ9PC90aD48L3RyPgoJCXtmb3JlYWNoIGZyb209JFBUVENoYW5nZURhdGFTZXQgaXRlbT1kYXRhfQoJCXtpZiBzdWJzdHIoJGRhdGEuUFRUQ2hhbmdlUGxheWVyTmFtZSwwLDEpPT0kcGxheWVyY2hhcn0KCQk8dHI+eyRkYXRhLlBUVENoYW5nZUZvcm1TdGFydH17JGRhdGEuUFRUQ2hhbmdlUGxheWVySWRfaGlkZGVufXskc2Fpc29uaWRfaGlkZGVufTx0ZD57JGRhdGEuUFRUQ2hhbmdlUGxheWVyTmFtZX08L3RkPjx0ZD57JGRhdGEuUFRUQ2hhbmdlVGVhbURyb3B9PC90ZD48dGQ+eyRkYXRhLlBUVENoYW5nZVN1Ym1pdH08L3RkPnskZGF0YS5QVFRDaGFuZ2VGb3JtRW5kfTwvdHI+CgkJey9pZn0KCQl7L2ZvcmVhY2h9CgkJPHRyPnskUFRUQWRkRm9ybVN0YXJ0fXskc2Fpc29uaWRfaGlkZGVufTx0ZD57JFBUVEFkZFBsYXllckRyb3B9PC90ZD48dGQ+eyRQVFRBZGRUZWFtc0Ryb3B9PC90ZD48dGQ+eyRQVFRBZGRTdWJtaXR9PC90ZD57JFBUVEFkZEZvcm1FbmR9PC90cj4KCTwvdGFibGU+CjwvZGl2Pgp7L2ZvcmVhY2h9]]></data>
	</file>
	<file>
	  <filename>/templates/show120game.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PHRhYmxlIGNsYXNzPSJiZXJpY2h0Ij4KPHRoZWFkPgoJe2lmICRHYW1lSG9tZSA9PSB0cnVlfQoJCTx0ciBjbGFzcz0iYmVyaWNodHRlYW1zIj48dGggY29sc3Bhbj0iNyI+eyRHYW1lT3VyVGVhbX08L3RoPjx0aCBjb2xzcGFuPSI3Ij57JEdhbWVPcHBvbmVudH08L3RoPjwvdHI+Cgl7ZWxzZX0KCQk8dHIgY2xhc3M9ImJlcmljaHR0ZWFtcyI+PHRoIGNvbHNwYW49IjciPnskR2FtZU9wcG9uZW50fTwvdGg+PHRoIGNvbHNwYW49IjciPnskR2FtZU91clRlYW19PC90aD48L3RyPgoJey9pZn0KPC90aGVhZD4KCTx0ciBjbGFzcz0iYmVyaWNodGhlYWRlciI+CgkJPHRkIGNsYXNzPSJiZXJpY2h0aGVhZGVyIj48L3RkPgoJCTx0ZCBjbGFzcz0iYmVyaWNodGhlYWRlciI+eyRUYWdWb2xsfTwvdGQ+CgkJPHRkIGNsYXNzPSJiZXJpY2h0aGVhZGVyIj57JFRhZ0Ficn08L3RkPgoJCTx0ZCBjbGFzcz0iYmVyaWNodGhlYWRlciI+eyRUYWdGZWhsfTwvdGQ+CgkJPHRkIGNsYXNzPSJiZXJpY2h0aGVhZGVyIj57JFRhZ0dlc308L3RkPgoJCTx0ZCBjbGFzcz0iYmVyaWNodGhlYWRlciI+eyRUYWdTUH08L3RkPgoJCTx0ZCBjbGFzcz0iYmVyaWNodGhlYWRlciI+eyRUYWdNUH08L3RkPgoJCTx0ZCBjbGFzcz0iYmVyaWNodGhlYWRlciI+eyRUYWdNUH08L3RkPgoJCTx0ZCBjbGFzcz0iYmVyaWNodGhlYWRlciI+eyRUYWdTUH08L3RkPgoJCTx0ZCBjbGFzcz0iYmVyaWNodGhlYWRlciI+eyRUYWdHZXN9PC90ZD4KCQk8dGQgY2xhc3M9ImJlcmljaHRoZWFkZXIiPnskVGFnRmVobH08L3RkPgoJCTx0ZCBjbGFzcz0iYmVyaWNodGhlYWRlciI+eyRUYWdBYnJ9PC90ZD4KCQk8dGQgY2xhc3M9ImJlcmljaHRoZWFkZXIiPnskVGFnVm9sbH08L3RkPgoJCTx0ZCBjbGFzcz0iYmVyaWNodGhlYWRlciI+PC90ZD4KCTwvdHI+Cgl7aWYgJEdhbWVIb21lID09IHRydWV9Cgk8dHIgY2xhc3M9ImJlcmljaHRyZXN1bHQiPgoJCTx0ZCBjbGFzcz0iYmVyaWNodG5hbWUiPjwvdGQ+CgkJPHRkIGNsYXNzPSJiZXJpY2h0dm9sbCI+eyRPdXJTY29yZVZvbGx9PC90ZD4KCQk8dGQgY2xhc3M9ImJlcmljaHRhYnIiPnskT3VyU2NvcmVBYnJ9PC90ZD4KCQk8dGQgY2xhc3M9ImJlcmljaHRmZWhsIj57JE91clNjb3JlRmVobH08L3RkPgoJCTx0ZCBjbGFzcz0iYmVyaWNodGdlcyI+eyRPdXJTY29yZUdlc308L3RkPgoJCTx0ZCBjbGFzcz0iYmVyaWNodGdlcyI+eyRPdXJTY29yZVNQfTwvdGQ+CgkJPHRkIGNsYXNzPSJiZXJpY2h0Z2VzIj57JE91clNjb3JlTVB9PC90ZD4KCQk8dGQgY2xhc3M9ImJlcmljaHRnZXMiPnskT3Bwb25lbnRTY29yZU1QfTwvdGQ+CgkJPHRkIGNsYXNzPSJiZXJpY2h0Z2VzIj57JE9wcG9uZW50U2NvcmVTUH08L3RkPgoJCTx0ZCBjbGFzcz0iYmVyaWNodGdlcyI+eyRPcHBvbmVudFNjb3JlR2VzfTwvdGQ+CgkJPHRkIGNsYXNzPSJiZXJpY2h0ZmVobCI+eyRPcHBvbmVudFNjb3JlRmVobH08L3RkPgoJCTx0ZCBjbGFzcz0iYmVyaWNodGFiciI+eyRPcHBvbmVudFNjb3JlQWJyfTwvdGQ+CgkJPHRkIGNsYXNzPSJiZXJpY2h0dm9sbCI+eyRPcHBvbmVudFNjb3JlVm9sbH08L3RkPgoJCTx0ZCBjbGFzcz0iYmVyaWNodG5hbWUiPjwvdGQ+Cgk8L3RyPgoJe2Vsc2V9Cgk8dHIgY2xhc3M9ImJlcmljaHRyZXN1bHQiPgoJCTx0ZCBjbGFzcz0iYmVyaWNodG5hbWUiPjwvdGQ+CgkJPHRkIGNsYXNzPSJiZXJpY2h0dm9sbCI+eyRPcHBvbmVudFNjb3JlVm9sbH08L3RkPgoJCTx0ZCBjbGFzcz0iYmVyaWNodGFiciI+eyRPcHBvbmVudFNjb3JlQWJyfTwvdGQ+CgkJPHRkIGNsYXNzPSJiZXJpY2h0ZmVobCI+eyRPcHBvbmVudFNjb3JlRmVobH08L3RkPgoJCTx0ZCBjbGFzcz0iYmVyaWNodGdlcyI+eyRPcHBvbmVudFNjb3JlR2VzfTwvdGQ+CgkJPHRkIGNsYXNzPSJiZXJpY2h0Z2VzIj57JE9wcG9uZW50U2NvcmVTUH08L3RkPgoJCTx0ZCBjbGFzcz0iYmVyaWNodGdlcyI+eyRPcHBvbmVudFNjb3JlTVB9PC90ZD4KCQk8dGQgY2xhc3M9ImJlcmljaHRnZXMiPnskT3VyU2NvcmVNUH08L3RkPgoJCTx0ZCBjbGFzcz0iYmVyaWNodGdlcyI+eyRPdXJTY29yZVNQfTwvdGQ+CgkJPHRkIGNsYXNzPSJiZXJpY2h0Z2VzIj57JE91clNjb3JlR2VzfTwvdGQ+CgkJPHRkIGNsYXNzPSJiZXJpY2h0ZmVobCI+eyRPdXJTY29yZUZlaGx9PC90ZD4KCQk8dGQgY2xhc3M9ImJlcmljaHRhYnIiPnskT3VyU2NvcmVBYnJ9PC90ZD4KCQk8dGQgY2xhc3M9ImJlcmljaHR2b2xsIj57JE91clNjb3JlVm9sbH08L3RkPgoJCTx0ZCBjbGFzcz0iYmVyaWNodG5hbWUiPjwvdGQ+Cgk8L3RyPgoJey9pZn0KCXtmb3JlYWNoIGZyb209JFJlc3VsdHMgaXRlbT1SZXN1bHR9Cgk8dHIgY2xhc3M9ImJlcmljaHRoZWFkZXIiPgoJCTx0ZCBjbGFzcz0iYmVyaWNodGhlYWRlciI+eyRUYWdOYW1lfTwvdGQ+CgkJPHRkIGNsYXNzPSJiZXJpY2h0aGVhZGVyIj57JFRhZ1ZvbGx9PC90ZD4KCQk8dGQgY2xhc3M9ImJlcmljaHRoZWFkZXIiPnskVGFnQWJyfTwvdGQ+CgkJPHRkIGNsYXNzPSJiZXJpY2h0aGVhZGVyIj57JFRhZ0ZlaGx9PC90ZD4KCQk8dGQgY2xhc3M9ImJlcmljaHRoZWFkZXIiPnskVGFnR2VzfTwvdGQ+CgkJPHRkIGNsYXNzPSJiZXJpY2h0aGVhZGVyIj57JFRhZ1NQfTwvdGQ+CgkJPHRkIGNsYXNzPSJiZXJpY2h0aGVhZGVyIj57JFRhZ01QfTwvdGQ+CgkJPHRkIGNsYXNzPSJiZXJpY2h0aGVhZGVyIj57JFRhZ01QfTwvdGQ+CgkJPHRkIGNsYXNzPSJiZXJpY2h0aGVhZGVyIj57JFRhZ1NQfTwvdGQ+CgkJPHRkIGNsYXNzPSJiZXJpY2h0aGVhZGVyIj57JFRhZ0dlc308L3RkPgoJCTx0ZCBjbGFzcz0iYmVyaWNodGhlYWRlciI+eyRUYWdGZWhsfTwvdGQ+CgkJPHRkIGNsYXNzPSJiZXJpY2h0aGVhZGVyIj57JFRhZ0Ficn08L3RkPgoJCTx0ZCBjbGFzcz0iYmVyaWNodGhlYWRlciI+eyRUYWdWb2xsfTwvdGQ+CgkJPHRkIGNsYXNzPSJiZXJpY2h0aGVhZGVyIj57JFRhZ05hbWV9PC90ZD4KCTwvdHI+Cgl7aWYgJEdhbWVIb21lID09IHRydWV9Cgk8dHIgY2xhc3M9ImJlcmljaHRsaW5lIj4KCQk8dGQgY2xhc3M9ImJlcmljaHRuYW1lIj57JFJlc3VsdC5ob21lbmFtZTF9PC90ZD4KCQk8dGQgY2xhc3M9ImJlcmljaHR2b2xsIj57JFJlc3VsdC5ob21ldm9sbDF9PC90ZD4KCQk8dGQgY2xhc3M9ImJlcmljaHRhYnIiPnskUmVzdWx0LmhvbWVhYnIxfTwvdGQ+CgkJPHRkIGNsYXNzPSJiZXJpY2h0ZmVobCI+eyRSZXN1bHQuaG9tZWZlaGwxfTwvdGQ+CgkJPHRkIGNsYXNzPSJiZXJpY2h0Z2VzIj57JFJlc3VsdC5ob21lZ2VzMX08L3RkPgoJCTx0ZCBjbGFzcz0iYmVyaWNodGdlcyI+eyRSZXN1bHQuaG9tZXNwMX08L3RkPgoJCTx0ZCBjbGFzcz0iYmVyaWNodGdlcyIgcm93c3Bhbj0iNCI+PC90ZD4KCQk8dGQgY2xhc3M9ImJlcmljaHRnZXMiIHJvd3NwYW49IjQiPjwvdGQ+CgkJPHRkIGNsYXNzPSJiZXJpY2h0Z2VzIj57JFJlc3VsdC5vcHBvbmVudHNwMX08L3RkPgoJCTx0ZCBjbGFzcz0iYmVyaWNodGdlcyI+eyRSZXN1bHQub3Bwb25lbnRnZXMxfTwvdGQ+CgkJPHRkIGNsYXNzPSJiZXJpY2h0ZmVobCI+eyRSZXN1bHQub3Bwb25lbnRmZWhsMX08L3RkPgoJCTx0ZCBjbGFzcz0iYmVyaWNodGFiciI+eyRSZXN1bHQub3Bwb25lbnRhYnIxfTwvdGQ+CgkJPHRkIGNsYXNzPSJiZXJpY2h0dm9sbCI+eyRSZXN1bHQub3Bwb25lbnR2b2xsMX08L3RkPgoJCTx0ZCBjbGFzcz0iYmVyaWNodG5hbWUiPnskUmVzdWx0Lm9wcG9uZW50bmFtZTF9PC90ZD4KCTwvdHI+Cgk8dHIgY2xhc3M9ImJlcmljaHRsaW5lIj4KCQk8dGQgY2xhc3M9ImJlcmljaHRuYW1lIj4KCQl7aWYgJFJlc3VsdC5ob21lbmFtZTEgIT0gJFJlc3VsdC5ob21lbmFtZTJ9CgkJCXskUmVzdWx0LmhvbWVuYW1lMn0KCQl7L2lmfQoJCTwvdGQ+CgkJPHRkIGNsYXNzPSJiZXJpY2h0dm9sbCI+eyRSZXN1bHQuaG9tZXZvbGwyfTwvdGQ+CgkJPHRkIGNsYXNzPSJiZXJpY2h0YWJyIj57JFJlc3VsdC5ob21lYWJyMn08L3RkPgoJCTx0ZCBjbGFzcz0iYmVyaWNodGZlaGwiPnskUmVzdWx0LmhvbWVmZWhsMn08L3RkPgoJCTx0ZCBjbGFzcz0iYmVyaWNodGdlcyI+eyRSZXN1bHQuaG9tZWdlczJ9PC90ZD4KCQk8dGQgY2xhc3M9ImJlcmljaHRnZXMiPnskUmVzdWx0LmhvbWVzcDJ9PC90ZD4KCQk8dGQgY2xhc3M9ImJlcmljaHRnZXMiPnskUmVzdWx0Lm9wcG9uZW50c3AyfTwvdGQ+CgkJPHRkIGNsYXNzPSJiZXJpY2h0Z2VzIj57JFJlc3VsdC5vcHBvbmVudGdlczJ9PC90ZD4KCQk8dGQgY2xhc3M9ImJlcmljaHRmZWhsIj57JFJlc3VsdC5vcHBvbmVudGZlaGwyfTwvdGQ+CgkJPHRkIGNsYXNzPSJiZXJpY2h0YWJyIj57JFJlc3VsdC5vcHBvbmVudGFicjJ9PC90ZD4KCQk8dGQgY2xhc3M9ImJlcmljaHR2b2xsIj57JFJlc3VsdC5vcHBvbmVudHZvbGwyfTwvdGQ+CgkJPHRkIGNsYXNzPSJiZXJpY2h0bmFtZSI+CgkJe2lmICRSZXN1bHQub3Bwb25lbnRuYW1lMSAhPSAkUmVzdWx0Lm9wcG9uZW50bmFtZTJ9CgkJCXskUmVzdWx0Lm9wcG9uZW50bmFtZTJ9CgkJey9pZn0KCQk8L3RkPgoJPC90cj4KCTx0ciBjbGFzcz0iYmVyaWNodGxpbmUiPgoJCTx0ZCBjbGFzcz0iYmVyaWNodG5hbWUiPgoJCXtpZiAkUmVzdWx0LmhvbWVuYW1lMiAhPSAkUmVzdWx0LmhvbWVuYW1lM30KCQkJeyRSZXN1bHQuaG9tZW5hbWUzfQoJCXsvaWZ9CgkJPC90ZD4KCQk8dGQgY2xhc3M9ImJlcmljaHR2b2xsIj57JFJlc3VsdC5ob21ldm9sbDN9PC90ZD4KCQk8dGQgY2xhc3M9ImJlcmljaHRhYnIiPnskUmVzdWx0LmhvbWVhYnIzfTwvdGQ+CgkJPHRkIGNsYXNzPSJiZXJpY2h0ZmVobCI+eyRSZXN1bHQuaG9tZWZlaGwzfTwvdGQ+CgkJPHRkIGNsYXNzPSJiZXJpY2h0Z2VzIj57JFJlc3VsdC5ob21lZ2VzM308L3RkPgoJCTx0ZCBjbGFzcz0iYmVyaWNodGdlcyI+eyRSZXN1bHQuaG9tZXNwM308L3RkPgoJCTx0ZCBjbGFzcz0iYmVyaWNodGdlcyI+eyRSZXN1bHQub3Bwb25lbnRzcDN9PC90ZD4KCQk8dGQgY2xhc3M9ImJlcmljaHRnZXMiPnskUmVzdWx0Lm9wcG9uZW50Z2VzM308L3RkPgoJCTx0ZCBjbGFzcz0iYmVyaWNodGZlaGwiPnskUmVzdWx0Lm9wcG9uZW50ZmVobDN9PC90ZD4KCQk8dGQgY2xhc3M9ImJlcmljaHRhYnIiPnskUmVzdWx0Lm9wcG9uZW50YWJyM308L3RkPgoJCTx0ZCBjbGFzcz0iYmVyaWNodHZvbGwiPnskUmVzdWx0Lm9wcG9uZW50dm9sbDN9PC90ZD4KCQk8dGQgY2xhc3M9ImJlcmljaHRuYW1lIj4KCQl7aWYgJFJlc3VsdC5vcHBvbmVudG5hbWUyICE9ICRSZXN1bHQub3Bwb25lbnRuYW1lM30KCQkJeyRSZXN1bHQub3Bwb25lbnRuYW1lM30KCQl7L2lmfQoJCTwvdGQ+Cgk8L3RyPgoJPHRyIGNsYXNzPSJiZXJpY2h0bGluZSI+CgkJPHRkIGNsYXNzPSJiZXJpY2h0bmFtZSI+CgkJe2lmICRSZXN1bHQuaG9tZW5hbWUzICE9ICRSZXN1bHQuaG9tZW5hbWU0fQoJCQl7JFJlc3VsdC5ob21lbmFtZTR9CgkJey9pZn0KCQk8L3RkPgoJCTx0ZCBjbGFzcz0iYmVyaWNodHZvbGwiPnskUmVzdWx0LmhvbWV2b2xsNH08L3RkPgoJCTx0ZCBjbGFzcz0iYmVyaWNodGFiciI+eyRSZXN1bHQuaG9tZWFicjR9PC90ZD4KCQk8dGQgY2xhc3M9ImJlcmljaHRmZWhsIj57JFJlc3VsdC5ob21lZmVobDR9PC90ZD4KCQk8dGQgY2xhc3M9ImJlcmljaHRnZXMiPnskUmVzdWx0LmhvbWVnZXM0fTwvdGQ+CgkJPHRkIGNsYXNzPSJiZXJpY2h0Z2VzIj57JFJlc3VsdC5ob21lc3A0fTwvdGQ+CgkJPHRkIGNsYXNzPSJiZXJpY2h0Z2VzIj57JFJlc3VsdC5vcHBvbmVudHNwNH08L3RkPgoJCTx0ZCBjbGFzcz0iYmVyaWNodGdlcyI+eyRSZXN1bHQub3Bwb25lbnRnZXM0fTwvdGQ+CgkJPHRkIGNsYXNzPSJiZXJpY2h0ZmVobCI+eyRSZXN1bHQub3Bwb25lbnRmZWhsNH08L3RkPgoJCTx0ZCBjbGFzcz0iYmVyaWNodGFiciI+eyRSZXN1bHQub3Bwb25lbnRhYnI0fTwvdGQ+CgkJPHRkIGNsYXNzPSJiZXJpY2h0dm9sbCI+eyRSZXN1bHQub3Bwb25lbnR2b2xsNH08L3RkPgoJCTx0ZCBjbGFzcz0iYmVyaWNodG5hbWUiPgoJCXtpZiAkUmVzdWx0Lm9wcG9uZW50bmFtZTMgIT0gJFJlc3VsdC5vcHBvbmVudG5hbWU0fQoJCQl7JFJlc3VsdC5vcHBvbmVudG5hbWU0fQoJCXsvaWZ9CgkJPC90ZD4KCTwvdHI+Cgk8dHIgY2xhc3M9ImJlcmljaHRyZXN1bHQiPgoJCTx0ZCBjbGFzcz0iYmVyaWNodG5hbWUiPjwvdGQ+CgkJPHRkIGNsYXNzPSJiZXJpY2h0dm9sbCI+eyRSZXN1bHQuaG9tZXZvbGx9PC90ZD4KCQk8dGQgY2xhc3M9ImJlcmljaHRhYnIiPnskUmVzdWx0LmhvbWVhYnJ9PC90ZD4KCQk8dGQgY2xhc3M9ImJlcmljaHRmZWhsIj57JFJlc3VsdC5ob21lZmVobH08L3RkPgoJCTx0ZCBjbGFzcz0iYmVyaWNodGdlcyI+eyRSZXN1bHQuaG9tZWdlc308L3RkPgoJCTx0ZCBjbGFzcz0iYmVyaWNodGdlcyI+eyRSZXN1bHQuaG9tZXNwfTwvdGQ+CgkJPHRkIGNsYXNzPSJiZXJpY2h0Z2VzIj57JFJlc3VsdC5ob21lcG9pbnRzfTwvdGQ+CgkJPHRkIGNsYXNzPSJiZXJpY2h0Z2VzIj57JFJlc3VsdC5vcHBvbmVudHBvaW50c308L3RkPgoJCTx0ZCBjbGFzcz0iYmVyaWNodGdlcyI+eyRSZXN1bHQub3Bwb25lbnRzcH08L3RkPgoJCTx0ZCBjbGFzcz0iYmVyaWNodGdlcyI+eyRSZXN1bHQub3Bwb25lbnRnZXN9PC90ZD4KCQk8dGQgY2xhc3M9ImJlcmljaHRmZWhsIj57JFJlc3VsdC5vcHBvbmVudGZlaGx9PC90ZD4KCQk8dGQgY2xhc3M9ImJlcmljaHRhYnIiPnskUmVzdWx0Lm9wcG9uZW50YWJyfTwvdGQ+CgkJPHRkIGNsYXNzPSJiZXJpY2h0dm9sbCI+eyRSZXN1bHQub3Bwb25lbnR2b2xsfTwvdGQ+CgkJPHRkIGNsYXNzPSJiZXJpY2h0bmFtZSI+PC90ZD4KCTwvdHI+Cgl7ZWxzZX0KCTx0ciBjbGFzcz0iYmVyaWNodGxpbmUiPgoJCTx0ZCBjbGFzcz0iYmVyaWNodG5hbWUiPnskUmVzdWx0Lm9wcG9uZW50bmFtZTF9PC90ZD4KCQk8dGQgY2xhc3M9ImJlcmljaHR2b2xsIj57JFJlc3VsdC5vcHBvbmVudHZvbGwxfTwvdGQ+CgkJPHRkIGNsYXNzPSJiZXJpY2h0YWJyIj57JFJlc3VsdC5vcHBvbmVudGFicjF9PC90ZD4KCQk8dGQgY2xhc3M9ImJlcmljaHRmZWhsIj57JFJlc3VsdC5vcHBvbmVudGZlaGwxfTwvdGQ+CgkJPHRkIGNsYXNzPSJiZXJpY2h0Z2VzIj57JFJlc3VsdC5vcHBvbmVudGdlczF9PC90ZD4KCQk8dGQgY2xhc3M9ImJlcmljaHRnZXMiPnskUmVzdWx0Lm9wcG9uZW50c3AxfTwvdGQ+CgkJPHRkIGNsYXNzPSJiZXJpY2h0Z2VzIiByb3dzcGFuPSI0Ij48L3RkPgoJCTx0ZCBjbGFzcz0iYmVyaWNodGdlcyIgcm93c3Bhbj0iNCI+PC90ZD4KCQk8dGQgY2xhc3M9ImJlcmljaHRnZXMiPnskUmVzdWx0LmhvbWVzcDF9PC90ZD4KCQk8dGQgY2xhc3M9ImJlcmljaHRnZXMiPnskUmVzdWx0LmhvbWVnZXMxfTwvdGQ+CgkJPHRkIGNsYXNzPSJiZXJpY2h0ZmVobCI+eyRSZXN1bHQuaG9tZWZlaGwxfTwvdGQ+CgkJPHRkIGNsYXNzPSJiZXJpY2h0YWJyIj57JFJlc3VsdC5ob21lYWJyMX08L3RkPgoJCTx0ZCBjbGFzcz0iYmVyaWNodHZvbGwiPnskUmVzdWx0LmhvbWV2b2xsMX08L3RkPgoJCTx0ZCBjbGFzcz0iYmVyaWNodG5hbWUiPnskUmVzdWx0LmhvbWVuYW1lMX08L3RkPgoJPC90cj4KCTx0ciBjbGFzcz0iYmVyaWNodGxpbmUiPgoJCTx0ZCBjbGFzcz0iYmVyaWNodG5hbWUiPgoJCXtpZiAkUmVzdWx0Lm9wcG9uZW50bmFtZTEgIT0gJFJlc3VsdC5vcHBvbmVudG5hbWUyfQoJCQl7JFJlc3VsdC5vcHBvbmVudG5hbWUyfQoJCXsvaWZ9CgkJPC90ZD4KCQk8dGQgY2xhc3M9ImJlcmljaHR2b2xsIj57JFJlc3VsdC5vcHBvbmVudHZvbGwyfTwvdGQ+CgkJPHRkIGNsYXNzPSJiZXJpY2h0YWJyIj57JFJlc3VsdC5vcHBvbmVudGFicjJ9PC90ZD4KCQk8dGQgY2xhc3M9ImJlcmljaHRmZWhsIj57JFJlc3VsdC5vcHBvbmVudGZlaGwyfTwvdGQ+CgkJPHRkIGNsYXNzPSJiZXJpY2h0Z2VzIj57JFJlc3VsdC5vcHBvbmVudGdlczJ9PC90ZD4KCQk8dGQgY2xhc3M9ImJlcmljaHRnZXMiPnskUmVzdWx0Lm9wcG9uZW50c3AyfTwvdGQ+CgkJPHRkIGNsYXNzPSJiZXJpY2h0Z2VzIj57JFJlc3VsdC5ob21lc3AyfTwvdGQ+CgkJPHRkIGNsYXNzPSJiZXJpY2h0Z2VzIj57JFJlc3VsdC5ob21lZ2VzMn08L3RkPgoJCTx0ZCBjbGFzcz0iYmVyaWNodGZlaGwiPnskUmVzdWx0LmhvbWVmZWhsMn08L3RkPgoJCTx0ZCBjbGFzcz0iYmVyaWNodGFiciI+eyRSZXN1bHQuaG9tZWFicjJ9PC90ZD4KCQk8dGQgY2xhc3M9ImJlcmljaHR2b2xsIj57JFJlc3VsdC5ob21ldm9sbDJ9PC90ZD4KCQk8dGQgY2xhc3M9ImJlcmljaHRuYW1lIj4KCQl7aWYgJFJlc3VsdC5ob21lbmFtZTEgIT0gJFJlc3VsdC5ob21lbmFtZTJ9CgkJCXskUmVzdWx0LmhvbWVuYW1lMn0KCQl7L2lmfQoJCTwvdGQ+Cgk8L3RyPgoJPHRyIGNsYXNzPSJiZXJpY2h0bGluZSI+CgkJPHRkIGNsYXNzPSJiZXJpY2h0bmFtZSI+CgkJe2lmICRSZXN1bHQub3Bwb25lbnRuYW1lMiAhPSAkUmVzdWx0Lm9wcG9uZW50bmFtZTJ9CgkJCXskUmVzdWx0Lm9wcG9uZW50bmFtZTN9CgkJey9pZn0KCQk8L3RkPgoJCTx0ZCBjbGFzcz0iYmVyaWNodHZvbGwiPnskUmVzdWx0Lm9wcG9uZW50dm9sbDN9PC90ZD4KCQk8dGQgY2xhc3M9ImJlcmljaHRhYnIiPnskUmVzdWx0Lm9wcG9uZW50YWJyM308L3RkPgoJCTx0ZCBjbGFzcz0iYmVyaWNodGZlaGwiPnskUmVzdWx0Lm9wcG9uZW50ZmVobDN9PC90ZD4KCQk8dGQgY2xhc3M9ImJlcmljaHRnZXMiPnskUmVzdWx0Lm9wcG9uZW50Z2VzM308L3RkPgoJCTx0ZCBjbGFzcz0iYmVyaWNodGdlcyI+eyRSZXN1bHQub3Bwb25lbnRzcDN9PC90ZD4KCQk8dGQgY2xhc3M9ImJlcmljaHRnZXMiPnskUmVzdWx0LmhvbWVzcDN9PC90ZD4KCQk8dGQgY2xhc3M9ImJlcmljaHRnZXMiPnskUmVzdWx0LmhvbWVnZXMzfTwvdGQ+CgkJPHRkIGNsYXNzPSJiZXJpY2h0ZmVobCI+eyRSZXN1bHQuaG9tZWZlaGwzfTwvdGQ+CgkJPHRkIGNsYXNzPSJiZXJpY2h0YWJyIj57JFJlc3VsdC5ob21lYWJyM308L3RkPgoJCTx0ZCBjbGFzcz0iYmVyaWNodHZvbGwiPnskUmVzdWx0LmhvbWV2b2xsM308L3RkPgoJCTx0ZCBjbGFzcz0iYmVyaWNodG5hbWUiPgoJCXtpZiAkUmVzdWx0LmhvbWVuYW1lMiAhPSAkUmVzdWx0LmhvbWVuYW1lM30KCQkJeyRSZXN1bHQuaG9tZW5hbWUzfQoJCXsvaWZ9CgkJPC90ZD4KCTwvdHI+Cgk8dHIgY2xhc3M9ImJlcmljaHRsaW5lIj4KCQk8dGQgY2xhc3M9ImJlcmljaHRuYW1lIj4KCQl7aWYgJFJlc3VsdC5vcHBvbmVudG5hbWUzICE9ICRSZXN1bHQub3Bwb25lbnRuYW1lNH0KCQkJeyRSZXN1bHQub3Bwb25lbnRuYW1lNH0KCQl7L2lmfQoJCTwvdGQ+CgkJPHRkIGNsYXNzPSJiZXJpY2h0dm9sbCI+eyRSZXN1bHQub3Bwb25lbnR2b2xsNH08L3RkPgoJCTx0ZCBjbGFzcz0iYmVyaWNodGFiciI+eyRSZXN1bHQub3Bwb25lbnRhYnI0fTwvdGQ+CgkJPHRkIGNsYXNzPSJiZXJpY2h0ZmVobCI+eyRSZXN1bHQub3Bwb25lbnRmZWhsNH08L3RkPgoJCTx0ZCBjbGFzcz0iYmVyaWNodGdlcyI+eyRSZXN1bHQub3Bwb25lbnRnZXM0fTwvdGQ+CgkJPHRkIGNsYXNzPSJiZXJpY2h0Z2VzIj57JFJlc3VsdC5vcHBvbmVudHNwNH08L3RkPgoJCTx0ZCBjbGFzcz0iYmVyaWNodGdlcyI+eyRSZXN1bHQuaG9tZXNwNH08L3RkPgoJCTx0ZCBjbGFzcz0iYmVyaWNodGdlcyI+eyRSZXN1bHQuaG9tZWdlczR9PC90ZD4KCQk8dGQgY2xhc3M9ImJlcmljaHRmZWhsIj57JFJlc3VsdC5ob21lZmVobDR9PC90ZD4KCQk8dGQgY2xhc3M9ImJlcmljaHRhYnIiPnskUmVzdWx0LmhvbWVhYnI0fTwvdGQ+CgkJPHRkIGNsYXNzPSJiZXJpY2h0dm9sbCI+eyRSZXN1bHQuaG9tZXZvbGw0fTwvdGQ+CgkJPHRkIGNsYXNzPSJiZXJpY2h0bmFtZSI+CgkJe2lmICRSZXN1bHQuaG9tZW5hbWUzICE9ICRSZXN1bHQuaG9tZW5hbWU0fQoJCQl7JFJlc3VsdC5ob21lbmFtZTR9CgkJey9pZn0KCQk8L3RkPgoJPC90cj4KCTx0ciBjbGFzcz0iYmVyaWNodHJlc3VsdCI+CgkJPHRkIGNsYXNzPSJiZXJpY2h0bmFtZSI+PC90ZD4KCQk8dGQgY2xhc3M9ImJlcmljaHR2b2xsIj57JFJlc3VsdC5vcHBvbmVudHZvbGx9PC90ZD4KCQk8dGQgY2xhc3M9ImJlcmljaHRhYnIiPnskUmVzdWx0Lm9wcG9uZW50YWJyfTwvdGQ+CgkJPHRkIGNsYXNzPSJiZXJpY2h0ZmVobCI+eyRSZXN1bHQub3Bwb25lbnRmZWhsfTwvdGQ+CgkJPHRkIGNsYXNzPSJiZXJpY2h0Z2VzIj57JFJlc3VsdC5vcHBvbmVudGdlc308L3RkPgoJCTx0ZCBjbGFzcz0iYmVyaWNodGdlcyI+eyRSZXN1bHQub3Bwb25lbnRzcH08L3RkPgoJCTx0ZCBjbGFzcz0iYmVyaWNodGdlcyI+eyRSZXN1bHQub3Bwb25lbnRwb2ludHN9PC90ZD4KCQk8dGQgY2xhc3M9ImJlcmljaHRnZXMiPnskUmVzdWx0LmhvbWVwb2ludHN9PC90ZD4KCQk8dGQgY2xhc3M9ImJlcmljaHRnZXMiPnskUmVzdWx0LmhvbWVzcH08L3RkPgoJCTx0ZCBjbGFzcz0iYmVyaWNodGdlcyI+eyRSZXN1bHQuaG9tZWdlc308L3RkPgoJCTx0ZCBjbGFzcz0iYmVyaWNodGZlaGwiPnskUmVzdWx0LmhvbWVmZWhsfTwvdGQ+CgkJPHRkIGNsYXNzPSJiZXJpY2h0YWJyIj57JFJlc3VsdC5ob21lYWJyfTwvdGQ+CgkJPHRkIGNsYXNzPSJiZXJpY2h0dm9sbCI+eyRSZXN1bHQuaG9tZXZvbGx9PC90ZD4KCQk8dGQgY2xhc3M9ImJlcmljaHRuYW1lIj48L3RkPgoJPC90cj4KCXsvaWZ9Cgl7L2ZvcmVhY2h9CjwvdGFibGU+]]></data>
	</file>
	<file>
	  <filename>/templates/showaverageteam.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PHRhYmxlIGNsYXNzPSJhdmciPgoJPHRoZWFkPgoJCTx0ciBjbGFzcz0iYXZnaGVhZGVyIj4KCQkJPHRkPnskVGFnTmFtZX08L3RkPgoJCQk8dGQgY29sc3Bhbj0iMiI+eyRUYWdUeXBlfTwvdGQ+CgkJCTx0ZD57JFRhZ0dlc308L3RkPgoJCQk8dGQ+eyRUYWdWb2xsfTwvdGQ+CgkJCTx0ZD57JFRhZ0Ficn08L3RkPgoJCQk8dGQ+eyRUYWdGZWhsfTwvdGQ+CgkJPC90cj4KCTwvdGhlYWQ+Cgk8dGJvZHk+CgkJe2ZvcmVhY2ggZnJvbT0kUmVzdWx0cyBpdGVtPVJlc3VsdH0KCQkJPHRyIGNsYXNzPSJhdmdnZXNsaW5lIgoJCQkJb25jbGljaz0ic2V0VmlzaWJpbGl0eSgna2VnZWxlcmdlYm5pc3NlLnBsYXllci57JFJlc3VsdC5JRH0nLCAnYmxvY2snKSI+CgkJCQk8dGQgY2xhc3M9ImF2Z25hbWUiIHJvd3NwYW49IjMiPnskUmVzdWx0Lk5hbWV9PC90ZD4KCQkJCTx0ZCBjbGFzcz0iYXZnYXJ0Ij57JFRhZ0dlc308L3RkPgoJCQkJPHRkIGNsYXNzPSJhdmdhcnQiPih7JFJlc3VsdC5Db3VudH0pPC90ZD4KCQkJCXtpZiAkUmVzdWx0LkNvdW50IT0wfQoJCQkJCTx0ZCBjbGFzcz0iYXZnZ2VzIj57bWF0aCBlcXVhdGlvbj0ieC95IiB4PSRSZXN1bHQuR2VzIHk9JFJlc3VsdC5Db3VudCBmb3JtYXQ9IiUuMmYifTwvdGQ+CgkJCQkJPHRkIGNsYXNzPSJhdmd2b2xsIj57bWF0aCBlcXVhdGlvbj0ieC95IiB4PSRSZXN1bHQuVm9sbCB5PSRSZXN1bHQuQ291bnQgZm9ybWF0PSIlLjJmIn08L3RkPgoJCQkJCTx0ZCBjbGFzcz0iYXZnYWJyIj57bWF0aCBlcXVhdGlvbj0ieC95IiB4PSRSZXN1bHQuQWJyIHk9JFJlc3VsdC5Db3VudCBmb3JtYXQ9IiUuMmYifTwvdGQ+CgkJCQkJPHRkIGNsYXNzPSJhdmdmZWhsIj57bWF0aCBlcXVhdGlvbj0ieC95IiB4PSRSZXN1bHQuRmVobCB5PSRSZXN1bHQuQ291bnQgZm9ybWF0PSIlLjJmIn08L3RkPgoJCQkJe2Vsc2V9CgkJCQkJPHRkIGNsYXNzPSJhdmdnZXMiPi0tLTwvdGQ+CgkJCQkJPHRkIGNsYXNzPSJhdmd2b2xsIj4tLS08L3RkPgoJCQkJCTx0ZCBjbGFzcz0iYXZnYWJyIj4tLS08L3RkPgoJCQkJCTx0ZCBjbGFzcz0iYXZnZmVobCI+LS0tPC90ZD4KCQkJCXsvaWZ9CgkJCTwvdHI+CgkJCTx0ciBjbGFzcz0iYXZnaGVpbWxpbmUiCgkJCQlvbmNsaWNrPSJzZXRWaXNpYmlsaXR5KCdrZWdlbGVyZ2Vibmlzc2UucGxheWVyLnskUmVzdWx0LklEfScsICdibG9jaycpIj4KCQkJCTx0ZCBjbGFzcz0iYXZnYXJ0Ij57JFRhZ0hvbWV9PC90ZD4KCQkJCTx0ZCBjbGFzcz0iYXZnYXJ0Ij4oeyRSZXN1bHQuQ291bnRIb21lfSk8L3RkPgoJCQkJe2lmICRSZXN1bHQuQ291bnRIb21lIT0wfQoJCQkJCTx0ZCBjbGFzcz0iYXZnZ2VzIj57bWF0aCBlcXVhdGlvbj0ieC95IiB4PSRSZXN1bHQuR2VzSG9tZSB5PSRSZXN1bHQuQ291bnRIb21lIGZvcm1hdD0iJS4yZiJ9PC90ZD4KCQkJCQk8dGQgY2xhc3M9ImF2Z3ZvbGwiPnttYXRoIGVxdWF0aW9uPSJ4L3kiIHg9JFJlc3VsdC5Wb2xsSG9tZSB5PSRSZXN1bHQuQ291bnRIb21lIGZvcm1hdD0iJS4yZiJ9PC90ZD4KCQkJCQk8dGQgY2xhc3M9ImF2Z2FiciI+e21hdGggZXF1YXRpb249IngveSIgeD0kUmVzdWx0LkFickhvbWUgeT0kUmVzdWx0LkNvdW50SG9tZSBmb3JtYXQ9IiUuMmYifTwvdGQ+CgkJCQkJPHRkIGNsYXNzPSJhdmdmZWhsIj57bWF0aCBlcXVhdGlvbj0ieC95IiB4PSRSZXN1bHQuRmVobEhvbWUgeT0kUmVzdWx0LkNvdW50SG9tZSBmb3JtYXQ9IiUuMmYifTwvdGQ+CgkJCQl7ZWxzZX0KCQkJCQk8dGQgY2xhc3M9ImF2Z2dlcyI+LS0tPC90ZD4KCQkJCQk8dGQgY2xhc3M9ImF2Z3ZvbGwiPi0tLTwvdGQ+CgkJCQkJPHRkIGNsYXNzPSJhdmdhYnIiPi0tLTwvdGQ+CgkJCQkJPHRkIGNsYXNzPSJhdmdmZWhsIj4tLS08L3RkPgoJCQkJey9pZn0KCQkJPC90cj4KCQkJPHRyIGNsYXNzPSJhdmdhdXN3bGluZSIKCQkJCW9uY2xpY2s9InNldFZpc2liaWxpdHkoJ2tlZ2VsZXJnZWJuaXNzZS5wbGF5ZXIueyRSZXN1bHQuSUR9JywgJ2Jsb2NrJykiPgoJCQkJPHRkIGNsYXNzPSJhdmdhcnQiPnskVGFnQXdheX08L3RkPgoJCQkJPHRkIGNsYXNzPSJhdmdhcnQiPih7JFJlc3VsdC5Db3VudEF3YXl9KTwvdGQ+CgkJCQl7aWYgJFJlc3VsdC5Db3VudEF3YXkhPTB9CgkJCQkJPHRkIGNsYXNzPSJhdmdnZXMiPnttYXRoIGVxdWF0aW9uPSJ4L3kiIHg9JFJlc3VsdC5HZXNBd2F5IHk9JFJlc3VsdC5Db3VudEF3YXkgZm9ybWF0PSIlLjJmIn08L3RkPgoJCQkJCTx0ZCBjbGFzcz0iYXZndm9sbCI+e21hdGggZXF1YXRpb249IngveSIgeD0kUmVzdWx0LlZvbGxBd2F5IHk9JFJlc3VsdC5Db3VudEF3YXkgZm9ybWF0PSIlLjJmIn08L3RkPgoJCQkJCTx0ZCBjbGFzcz0iYXZnYWJyIj57bWF0aCBlcXVhdGlvbj0ieC95IiB4PSRSZXN1bHQuQWJyQXdheSB5PSRSZXN1bHQuQ291bnRBd2F5IGZvcm1hdD0iJS4yZiJ9PC90ZD4KCQkJCQk8dGQgY2xhc3M9ImF2Z2ZlaGwiPnttYXRoIGVxdWF0aW9uPSJ4L3kiIHg9JFJlc3VsdC5GZWhsQXdheSB5PSRSZXN1bHQuQ291bnRBd2F5IGZvcm1hdD0iJS4yZiJ9PC90ZD4KCQkJCXtlbHNlfQoJCQkJCTx0ZCBjbGFzcz0iYXZnZ2VzIj4tLS08L3RkPgoJCQkJCTx0ZCBjbGFzcz0iYXZndm9sbCI+LS0tPC90ZD4KCQkJCQk8dGQgY2xhc3M9ImF2Z2FiciI+LS0tPC90ZD4KCQkJCQk8dGQgY2xhc3M9ImF2Z2ZlaGwiPi0tLTwvdGQ+CgkJCQl7L2lmfQoJCQk8L3RyPgoJCXsvZm9yZWFjaH0JCgk8L3Rib2R5Pgo8L3RhYmxlPg==]]></data>
	</file>
	<file>
	  <filename>/templates/showaverageteam120.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PHRhYmxlIGNsYXNzPSJhdmciPgoJPHRoZWFkPgoJCTx0ciBjbGFzcz0iYXZnaGVhZGVyIj4KCQkJPHRkPnskVGFnTmFtZX08L3RkPgoJCQk8dGQgY29sc3Bhbj0iMiI+eyRUYWdUeXBlfTwvdGQ+CgkJCTx0ZD57JFRhZ01QfTwvdGQ+CgkJCTx0ZD57JFRhZ1NQfTwvdGQ+CgkJCTx0ZD57JFRhZ0dlc308L3RkPgoJCQk8dGQ+eyRUYWdWb2xsfTwvdGQ+CgkJCTx0ZD57JFRhZ0Ficn08L3RkPgoJCQk8dGQ+eyRUYWdGZWhsfTwvdGQ+CgkJPC90cj4KCTwvdGhlYWQ+Cgk8dGJvZHk+CgkJe2ZvcmVhY2ggZnJvbT0kUmVzdWx0cyBpdGVtPVJlc3VsdH0KCQkJPHRyIGNsYXNzPSJhdmdnZXNsaW5lIgoJCQkJb25jbGljaz0ic2V0VmlzaWJpbGl0eSgna2VnZWxlcmdlYm5pc3NlLnBsYXllci4xMjAueyRSZXN1bHQuSUR9JywgJ2Jsb2NrJykiPgoJCQkJPHRkIGNsYXNzPSJhdmduYW1lIiByb3dzcGFuPSIzIj57JFJlc3VsdC5OYW1lfTwvdGQ+CgkJCQk8dGQgY2xhc3M9ImF2Z2FydCI+eyRUYWdHZXN9PC90ZD4KCQkJCTx0ZCBjbGFzcz0iYXZnYXJ0Ij4oeyRSZXN1bHQuQ291bnR9KTwvdGQ+CgkJCQl7aWYgJFJlc3VsdC5Db3VudCE9MH0KCQkJCQk8dGQgY2xhc3M9ImF2Z2dlcyI+e21hdGggZXF1YXRpb249IngvKDEwKnkpIiB4PSRSZXN1bHQuTVAgeT0kUmVzdWx0LkNvdW50IGZvcm1hdD0iJS4yZiJ9PC90ZD4KCQkJCQk8dGQgY2xhc3M9ImF2Z2dlcyI+e21hdGggZXF1YXRpb249IngvKDEwKnkpIiB4PSRSZXN1bHQuU1AgeT0kUmVzdWx0LkNvdW50IGZvcm1hdD0iJS4yZiJ9PC90ZD4KCQkJCQk8dGQgY2xhc3M9ImF2Z2dlcyI+e21hdGggZXF1YXRpb249IngveSIgeD0kUmVzdWx0LkdlcyB5PSRSZXN1bHQuQ291bnQgZm9ybWF0PSIlLjJmIn08L3RkPgoJCQkJCTx0ZCBjbGFzcz0iYXZndm9sbCI+e21hdGggZXF1YXRpb249IngveSIgeD0kUmVzdWx0LlZvbGwgeT0kUmVzdWx0LkNvdW50IGZvcm1hdD0iJS4yZiJ9PC90ZD4KCQkJCQk8dGQgY2xhc3M9ImF2Z2FiciI+e21hdGggZXF1YXRpb249IngveSIgeD0kUmVzdWx0LkFiciB5PSRSZXN1bHQuQ291bnQgZm9ybWF0PSIlLjJmIn08L3RkPgoJCQkJCTx0ZCBjbGFzcz0iYXZnZmVobCI+e21hdGggZXF1YXRpb249IngveSIgeD0kUmVzdWx0LkZlaGwgeT0kUmVzdWx0LkNvdW50IGZvcm1hdD0iJS4yZiJ9PC90ZD4KCQkJCXtlbHNlfQoJCQkJCTx0ZCBjbGFzcz0iYXZnZ2VzIj4tLS08L3RkPgoJCQkJCTx0ZCBjbGFzcz0iYXZnZ2VzIj4tLS08L3RkPgoJCQkJCTx0ZCBjbGFzcz0iYXZnZ2VzIj4tLS08L3RkPgoJCQkJCTx0ZCBjbGFzcz0iYXZndm9sbCI+LS0tPC90ZD4KCQkJCQk8dGQgY2xhc3M9ImF2Z2FiciI+LS0tPC90ZD4KCQkJCQk8dGQgY2xhc3M9ImF2Z2ZlaGwiPi0tLTwvdGQ+CgkJCQl7L2lmfQoJCQk8L3RyPgoJCQk8dHIgY2xhc3M9ImF2Z2hlaW1saW5lIgoJCQkJb25jbGljaz0ic2V0VmlzaWJpbGl0eSgna2VnZWxlcmdlYm5pc3NlLnBsYXllci4xMjAueyRSZXN1bHQuSUR9JywgJ2Jsb2NrJykiPgoJCQkJPHRkIGNsYXNzPSJhdmdhcnQiPnskVGFnSG9tZX08L3RkPgoJCQkJPHRkIGNsYXNzPSJhdmdhcnQiPih7JFJlc3VsdC5Db3VudEhvbWV9KTwvdGQ+CgkJCQl7aWYgJFJlc3VsdC5Db3VudEhvbWUhPTB9CgkJCQkJPHRkIGNsYXNzPSJhdmdnZXMiPnttYXRoIGVxdWF0aW9uPSJ4LygxMCp5KSIgeD0kUmVzdWx0Lk1QSG9tZSB5PSRSZXN1bHQuQ291bnRIb21lIGZvcm1hdD0iJS4yZiJ9PC90ZD4KCQkJCQk8dGQgY2xhc3M9ImF2Z2dlcyI+e21hdGggZXF1YXRpb249IngvKDEwKnkpIiB4PSRSZXN1bHQuU1BIb21lIHk9JFJlc3VsdC5Db3VudEhvbWUgZm9ybWF0PSIlLjJmIn08L3RkPgoJCQkJCTx0ZCBjbGFzcz0iYXZnZ2VzIj57bWF0aCBlcXVhdGlvbj0ieC95IiB4PSRSZXN1bHQuR2VzSG9tZSB5PSRSZXN1bHQuQ291bnRIb21lIGZvcm1hdD0iJS4yZiJ9PC90ZD4KCQkJCQk8dGQgY2xhc3M9ImF2Z3ZvbGwiPnttYXRoIGVxdWF0aW9uPSJ4L3kiIHg9JFJlc3VsdC5Wb2xsSG9tZSB5PSRSZXN1bHQuQ291bnRIb21lIGZvcm1hdD0iJS4yZiJ9PC90ZD4KCQkJCQk8dGQgY2xhc3M9ImF2Z2FiciI+e21hdGggZXF1YXRpb249IngveSIgeD0kUmVzdWx0LkFickhvbWUgeT0kUmVzdWx0LkNvdW50SG9tZSBmb3JtYXQ9IiUuMmYifTwvdGQ+CgkJCQkJPHRkIGNsYXNzPSJhdmdmZWhsIj57bWF0aCBlcXVhdGlvbj0ieC95IiB4PSRSZXN1bHQuRmVobEhvbWUgeT0kUmVzdWx0LkNvdW50SG9tZSBmb3JtYXQ9IiUuMmYifTwvdGQ+CgkJCQl7ZWxzZX0KCQkJCQk8dGQgY2xhc3M9ImF2Z2dlcyI+LS0tPC90ZD4KCQkJCQk8dGQgY2xhc3M9ImF2Z2dlcyI+LS0tPC90ZD4KCQkJCQk8dGQgY2xhc3M9ImF2Z2dlcyI+LS0tPC90ZD4KCQkJCQk8dGQgY2xhc3M9ImF2Z3ZvbGwiPi0tLTwvdGQ+CgkJCQkJPHRkIGNsYXNzPSJhdmdhYnIiPi0tLTwvdGQ+CgkJCQkJPHRkIGNsYXNzPSJhdmdmZWhsIj4tLS08L3RkPgoJCQkJey9pZn0KCQkJPC90cj4KCQkJPHRyIGNsYXNzPSJhdmdhdXN3bGluZSIKCQkJCW9uY2xpY2s9InNldFZpc2liaWxpdHkoJ2tlZ2VsZXJnZWJuaXNzZS5wbGF5ZXIuMTIwLnskUmVzdWx0LklEfScsICdibG9jaycpIj4KCQkJCTx0ZCBjbGFzcz0iYXZnYXJ0Ij57JFRhZ0F3YXl9PC90ZD4KCQkJCTx0ZCBjbGFzcz0iYXZnYXJ0Ij4oeyRSZXN1bHQuQ291bnRBd2F5fSk8L3RkPgoJCQkJe2lmICRSZXN1bHQuQ291bnRBd2F5IT0wfQoJCQkJCTx0ZCBjbGFzcz0iYXZnZ2VzIj57bWF0aCBlcXVhdGlvbj0ieC8oMTAqeSkiIHg9JFJlc3VsdC5NUEF3YXkgeT0kUmVzdWx0LkNvdW50QXdheSBmb3JtYXQ9IiUuMmYifTwvdGQ+CgkJCQkJPHRkIGNsYXNzPSJhdmdnZXMiPnttYXRoIGVxdWF0aW9uPSJ4LygxMCp5KSIgeD0kUmVzdWx0LlNQQXdheSB5PSRSZXN1bHQuQ291bnRBd2F5IGZvcm1hdD0iJS4yZiJ9PC90ZD4KCQkJCQk8dGQgY2xhc3M9ImF2Z2dlcyI+e21hdGggZXF1YXRpb249IngveSIgeD0kUmVzdWx0Lkdlc0F3YXkgeT0kUmVzdWx0LkNvdW50QXdheSBmb3JtYXQ9IiUuMmYifTwvdGQ+CgkJCQkJPHRkIGNsYXNzPSJhdmd2b2xsIj57bWF0aCBlcXVhdGlvbj0ieC95IiB4PSRSZXN1bHQuVm9sbEF3YXkgeT0kUmVzdWx0LkNvdW50QXdheSBmb3JtYXQ9IiUuMmYifTwvdGQ+CgkJCQkJPHRkIGNsYXNzPSJhdmdhYnIiPnttYXRoIGVxdWF0aW9uPSJ4L3kiIHg9JFJlc3VsdC5BYnJBd2F5IHk9JFJlc3VsdC5Db3VudEF3YXkgZm9ybWF0PSIlLjJmIn08L3RkPgoJCQkJCTx0ZCBjbGFzcz0iYXZnZmVobCI+e21hdGggZXF1YXRpb249IngveSIgeD0kUmVzdWx0LkZlaGxBd2F5IHk9JFJlc3VsdC5Db3VudEF3YXkgZm9ybWF0PSIlLjJmIn08L3RkPgoJCQkJe2Vsc2V9CgkJCQkJPHRkIGNsYXNzPSJhdmdnZXMiPi0tLTwvdGQ+CgkJCQkJPHRkIGNsYXNzPSJhdmd2b2xsIj4tLS08L3RkPgoJCQkJCTx0ZCBjbGFzcz0iYXZnZ2VzIj4tLS08L3RkPgoJCQkJCTx0ZCBjbGFzcz0iYXZndm9sbCI+LS0tPC90ZD4KCQkJCQk8dGQgY2xhc3M9ImF2Z2FiciI+LS0tPC90ZD4KCQkJCQk8dGQgY2xhc3M9ImF2Z2ZlaGwiPi0tLTwvdGQ+CgkJCQl7L2lmfQoJCQk8L3RyPgoJCXsvZm9yZWFjaH0JCgk8L3Rib2R5Pgo8L3RhYmxlPg==]]></data>
	</file>
	<file>
	  <filename>/templates/showgame.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PHRhYmxlIGNsYXNzPSJiZXJpY2h0Ij4KPHRoZWFkPgoJe2lmICRHYW1lSG9tZSA9PSB0cnVlfQoJCTx0ciBjbGFzcz0iYmVyaWNodHRlYW1zIj48dGggY29sc3Bhbj0iNSI+eyRHYW1lT3VyVGVhbX08L3RoPjx0aCBjb2xzcGFuPSI1Ij57JEdhbWVPcHBvbmVudH08L3RoPjwvdHI+Cgl7ZWxzZX0KCQk8dHIgY2xhc3M9ImJlcmljaHR0ZWFtcyI+PHRoIGNvbHNwYW49IjUiPnskR2FtZU9wcG9uZW50fTwvdGg+PHRoIGNvbHNwYW49IjUiPnskR2FtZU91clRlYW19PC90aD48L3RyPgoJey9pZn0KPC90aGVhZD4KCTx0ciBjbGFzcz0iYmVyaWNodGhlYWRlciI+CgkJPHRkIGNsYXNzPSJiZXJpY2h0aGVhZGVyIj57JFRhZ05hbWV9PC90ZD4KCQk8dGQgY2xhc3M9ImJlcmljaHRoZWFkZXIiPnskVGFnVm9sbH08L3RkPgoJCTx0ZCBjbGFzcz0iYmVyaWNodGhlYWRlciI+eyRUYWdBYnJ9PC90ZD4KCQk8dGQgY2xhc3M9ImJlcmljaHRoZWFkZXIiPnskVGFnRmVobH08L3RkPgoJCTx0ZCBjbGFzcz0iYmVyaWNodGhlYWRlciI+eyRUYWdHZXN9PC90ZD4KCQk8dGQgY2xhc3M9ImJlcmljaHRoZWFkZXIiPnskVGFnR2VzfTwvdGQ+CgkJPHRkIGNsYXNzPSJiZXJpY2h0aGVhZGVyIj57JFRhZ0ZlaGx9PC90ZD4KCQk8dGQgY2xhc3M9ImJlcmljaHRoZWFkZXIiPnskVGFnQWJyfTwvdGQ+CgkJPHRkIGNsYXNzPSJiZXJpY2h0aGVhZGVyIj57JFRhZ1ZvbGx9PC90ZD4KCQk8dGQgY2xhc3M9ImJlcmljaHRoZWFkZXIiPnskVGFnTmFtZX08L3RkPgoJPC90cj4KCXtmb3JlYWNoIGZyb209JFJlc3VsdHMgaXRlbT1SZXN1bHR9Cgl7aWYgJEdhbWVIb21lID09IHRydWV9Cgk8dHIgY2xhc3M9ImJlcmljaHRsaW5lIj4KCQk8dGQgY2xhc3M9ImJlcmljaHRuYW1lIj57JFJlc3VsdC5ob21lbmFtZX08L3RkPgoJCTx0ZCBjbGFzcz0iYmVyaWNodHZvbGwiPnskUmVzdWx0LmhvbWV2b2xsfTwvdGQ+CgkJPHRkIGNsYXNzPSJiZXJpY2h0YWJyIj57JFJlc3VsdC5ob21lYWJyfTwvdGQ+CgkJPHRkIGNsYXNzPSJiZXJpY2h0ZmVobCI+eyRSZXN1bHQuaG9tZWZlaGx9PC90ZD4KCQk8dGQgY2xhc3M9ImJlcmljaHRnZXMiPnskUmVzdWx0LmhvbWVnZXN9PC90ZD4KCQk8dGQgY2xhc3M9ImJlcmljaHRnZXMiPnskUmVzdWx0Lm9wcG9uZW50Z2VzfTwvdGQ+CgkJPHRkIGNsYXNzPSJiZXJpY2h0ZmVobCI+eyRSZXN1bHQub3Bwb25lbnRmZWhsfTwvdGQ+CgkJPHRkIGNsYXNzPSJiZXJpY2h0YWJyIj57JFJlc3VsdC5vcHBvbmVudGFicn08L3RkPgoJCTx0ZCBjbGFzcz0iYmVyaWNodHZvbGwiPnskUmVzdWx0Lm9wcG9uZW50dm9sbH08L3RkPgoJCTx0ZCBjbGFzcz0iYmVyaWNodG5hbWUiPnskUmVzdWx0Lm9wcG9uZW50bmFtZX08L3RkPgoJPC90cj4KCXtlbHNlfQoJPHRyIGNsYXNzPSJiZXJpY2h0bGluZSI+CgkJPHRkIGNsYXNzPSJiZXJpY2h0bmFtZSI+eyRSZXN1bHQub3Bwb25lbnRuYW1lfTwvdGQ+CgkJPHRkIGNsYXNzPSJiZXJpY2h0dm9sbCI+eyRSZXN1bHQub3Bwb25lbnR2b2xsfTwvdGQ+CgkJPHRkIGNsYXNzPSJiZXJpY2h0YWJyIj57JFJlc3VsdC5vcHBvbmVudGFicn08L3RkPgoJCTx0ZCBjbGFzcz0iYmVyaWNodGZlaGwiPnskUmVzdWx0Lm9wcG9uZW50ZmVobH08L3RkPgoJCTx0ZCBjbGFzcz0iYmVyaWNodGdlcyI+eyRSZXN1bHQub3Bwb25lbnRnZXN9PC90ZD4KCQk8dGQgY2xhc3M9ImJlcmljaHRnZXMiPnskUmVzdWx0LmhvbWVnZXN9PC90ZD4KCQk8dGQgY2xhc3M9ImJlcmljaHRmZWhsIj57JFJlc3VsdC5ob21lZmVobH08L3RkPgoJCTx0ZCBjbGFzcz0iYmVyaWNodGFiciI+eyRSZXN1bHQuaG9tZWFicn08L3RkPgoJCTx0ZCBjbGFzcz0iYmVyaWNodHZvbGwiPnskUmVzdWx0LmhvbWV2b2xsfTwvdGQ+CgkJPHRkIGNsYXNzPSJiZXJpY2h0bmFtZSI+eyRSZXN1bHQuaG9tZW5hbWV9PC90ZD4KCTwvdHI+Cgl7L2lmfQoJey9mb3JlYWNofQoJe2lmICRHYW1lSG9tZSA9PSB0cnVlfQoJPHRyIGNsYXNzPSJiZXJpY2h0cmVzdWx0Ij4KCQk8dGQgY2xhc3M9ImJlcmljaHRuYW1lIj48L3RkPgoJCTx0ZCBjbGFzcz0iYmVyaWNodHZvbGwiPnskT3VyU2NvcmVWb2xsfTwvdGQ+CgkJPHRkIGNsYXNzPSJiZXJpY2h0YWJyIj57JE91clNjb3JlQWJyfTwvdGQ+CgkJPHRkIGNsYXNzPSJiZXJpY2h0ZmVobCI+eyRPdXJTY29yZUZlaGx9PC90ZD4KCQk8dGQgY2xhc3M9ImJlcmljaHRnZXMiPnskT3VyU2NvcmVHZXN9PC90ZD4KCQk8dGQgY2xhc3M9ImJlcmljaHRnZXMiPnskT3Bwb25lbnRTY29yZUdlc308L3RkPgoJCTx0ZCBjbGFzcz0iYmVyaWNodGZlaGwiPnskT3Bwb25lbnRTY29yZUZlaGx9PC90ZD4KCQk8dGQgY2xhc3M9ImJlcmljaHRhYnIiPnskT3Bwb25lbnRTY29yZUFicn08L3RkPgoJCTx0ZCBjbGFzcz0iYmVyaWNodHZvbGwiPnskT3Bwb25lbnRTY29yZVZvbGx9PC90ZD4KCQk8dGQgY2xhc3M9ImJlcmljaHRuYW1lIj48L3RkPgoJPC90cj4KCXtlbHNlfQoJPHRyIGNsYXNzPSJiZXJpY2h0cmVzdWx0Ij4KCQk8dGQgY2xhc3M9ImJlcmljaHRuYW1lIj48L3RkPgoJCTx0ZCBjbGFzcz0iYmVyaWNodHZvbGwiPnskT3Bwb25lbnRTY29yZVZvbGx9PC90ZD4KCQk8dGQgY2xhc3M9ImJlcmljaHRhYnIiPnskT3Bwb25lbnRTY29yZUFicn08L3RkPgoJCTx0ZCBjbGFzcz0iYmVyaWNodGZlaGwiPnskT3Bwb25lbnRTY29yZUZlaGx9PC90ZD4KCQk8dGQgY2xhc3M9ImJlcmljaHRnZXMiPnskT3Bwb25lbnRTY29yZUdlc308L3RkPgoJCTx0ZCBjbGFzcz0iYmVyaWNodGdlcyI+eyRPdXJTY29yZUdlc308L3RkPgoJCTx0ZCBjbGFzcz0iYmVyaWNodGZlaGwiPnskT3VyU2NvcmVGZWhsfTwvdGQ+CgkJPHRkIGNsYXNzPSJiZXJpY2h0YWJyIj57JE91clNjb3JlQWJyfTwvdGQ+CgkJPHRkIGNsYXNzPSJiZXJpY2h0dm9sbCI+eyRPdXJTY29yZVZvbGx9PC90ZD4KCQk8dGQgY2xhc3M9ImJlcmljaHRuYW1lIj48L3RkPgoJPC90cj4KCXsvaWZ9CjwvdGFibGU+]]></data>
	</file>
	<file>
	  <filename>/templates/showlatestresults.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[e2lmICROdW1iZXJPZkdhbWVzID09IDB9Cgl7JE5vR2FtZXN9CntlbHNlfQoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgoJPCEtLQoJZnVuY3Rpb24gc2V0VmlzaWJpbGl0eShpZCwgdmlzaWJpbGl0eSkgewoJCWlkZW50aXR5PWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKTsKCQlpZGVudGl0eS5zdHlsZS5kaXNwbGF5PXZpc2liaWxpdHk7Cgl9CgkvLy0tPgoJPC9zY3JpcHQ+CgkKCTx0YWJsZSBjbGFzcz0idGltZXRhYmxlIj4KCTx0aGVhZD4KCQk8dHIgY2xhc3M9InRpbWV0YWJsZWhlYWRlciI+CgkJCTx0aD57JFRhZ0RhdGV9PC90aD4KCQkJPHRoPnskVGFnVGltZX08L3RoPgoJCQk8dGg+eyRUYWdIb21lfTwvdGg+CgkJCTx0aD57JFRhZ0d1ZXN0fTwvdGg+CgkJCTx0aD57JFRhZ1Jlc3VsdH08L3RoPgoJCTwvdHI+Cgk8L3RoZWFkPgoJPC90Ym9keT4KCQl7Zm9yZWFjaCBuYW1lPXJlc2l0IGZyb209JFJlc3VsdHMgaXRlbT1SZXN1bHR9CgkJPHRyIGNsYXNzPSJ7Y3ljbGUgdmFsdWVzPSJ0aW1ldGFibGVlaW5zLHRpbWV0YWJsZXp3ZWkifSIKCQkJb25jbGljaz0ic2V0VmlzaWJpbGl0eSgna2VnZWxlcmdlYm5pc3NlLmdhbWUueyRzbWFydHkuZm9yZWFjaC5yZXNpdC5pbmRleCsxfScsICdibG9jaycpOyI+CgkJCTx0ZCBjbGFzcz0idGltZXRhYmxlZGF0ZSI+eyRSZXN1bHQuR2FtZURhdGV9PC90ZD4KCQkJPHRkIGNsYXNzPSJ0aW1ldGFibGV0aW1lIj57JFJlc3VsdC5HYW1lVGltZX08L3RkPgoJCQl7aWYgJFJlc3VsdC5HYW1lSG9tZSA9PSB0cnVlfQoJCQkJPHRkIGNsYXNzPSJ0aW1ldGFibGV0ZWFtIj57JFJlc3VsdC5HYW1lT3VyVGVhbX08L3RkPgoJCQkJPHRkIGNsYXNzPSJ0aW1ldGFibGV0ZWFtIj57JFJlc3VsdC5HYW1lT3Bwb25lbnR9PC90ZD4KCQkJCXtpZiAoJFJlc3VsdC5PcHBvbmVudFNjb3JlID09IDApICYmICgkUmVzdWx0Lk91clNjb3JlID09IDApfQoJCQkJCTx0ZCBjbGFzcz0idGltZXRhYmxlcmVzdWx0Ij57JE5vUmVzdWx0fTwvdGQ+CgkJCQl7ZWxzZX0KCQkJCQl7aWYgJFJlc3VsdC5HYW1lMTIwID09IGZhbHNlfQoJCQkJCQk8dGQgY2xhc3M9InRpbWV0YWJsZXJlc3VsdCI+eyRSZXN1bHQuT3VyU2NvcmV9IDogeyRSZXN1bHQuT3Bwb25lbnRTY29yZX08L3RkPgoJCQkJCXtlbHNlfQoJCQkJCQk8dGQgY2xhc3M9InRpbWV0YWJsZXJlc3VsdCI+eyRSZXN1bHQuT3VyUG9pbnRzfSA6IHskUmVzdWx0Lk9wcG9uZW50UG9pbnRzfSAoeyRSZXN1bHQuT3VyU2NvcmV9IDogeyRSZXN1bHQuT3Bwb25lbnRTY29yZX0pPC90ZD4KCQkJCQl7L2lmfQoJCQkJey9pZn0KCQkJe2Vsc2V9CgkJCQk8dGQgY2xhc3M9InRpbWV0YWJsZXRlYW0iPnskUmVzdWx0LkdhbWVPcHBvbmVudH08L3RkPgoJCQkJPHRkIGNsYXNzPSJ0aW1ldGFibGV0ZWFtIj57JFJlc3VsdC5HYW1lT3VyVGVhbX08L3RkPgoJCQkJe2lmICgkUmVzdWx0Lk9wcG9uZW50U2NvcmUgPT0gMCkgJiYgKCRSZXN1bHQuT3VyU2NvcmUgPT0gMCl9CgkJCQkJPHRkIGNsYXNzPSJ0aW1ldGFibGVyZXN1bHQiPnskTm9SZXN1bHR9PC90ZD4KCQkJCXtlbHNlfQoJCQkJCXtpZiAkUmVzdWx0LkdhbWUxMjAgPT0gZmFsc2V9CgkJCQkJCTx0ZCBjbGFzcz0idGltZXRhYmxlcmVzdWx0Ij57JFJlc3VsdC5PcHBvbmVudFNjb3JlfSA6IHskUmVzdWx0Lk91clNjb3JlfTwvdGQ+CgkJCQkJe2Vsc2V9CgkJCQkJCTx0ZCBjbGFzcz0idGltZXRhYmxlcmVzdWx0Ij57JFJlc3VsdC5PcHBvbmVudFBvaW50c30gOiB7JFJlc3VsdC5PdXJQb2ludHN9ICh7JFJlc3VsdC5PcHBvbmVudFNjb3JlfSA6IHskUmVzdWx0Lk91clNjb3JlfSk8L3RkPgoJCQkJCXsvaWZ9CgkJCQl7L2lmfQoJCQl7L2lmfQoJCTwvdHI+CgkJey9mb3JlYWNofQoJPC90Ym9keT4KCTwvdGFibGU+CnsvaWZ9]]></data>
	</file>
	<file>
	  <filename>/templates/showplayerresults.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PHRhYmxlIGNsYXNzPSJwbGF5ZXJzdGF0aXN0aWNzIj4KCTx0aGVhZD4KCQk8dHIgY2xhc3M9InBsYXllcnN0YXRpc3RpY3NoZWFkZXIiPgoJCTx0aCBjbGFzcz0icGxheWVyc3RhdGlzdGljc2hlYWRlciIgY29sc3Bhbj0iMTEiPnskSGVhZGVyR2FtZXN9PC90aD4KCQk8L3RyPgoJCTx0ciBjbGFzcz0icGxheWVyc3RhdGlzdGljc2hlYWRlciI+CgkJCTx0aCBjbGFzcz0icGxheWVyc3RhdGlzdGljc2hlYWRlciIgY29sc3Bhbj0iMiI+eyRIZWFkZXJHYW1lfTwvdGg+CgkJCTx0aCBjbGFzcz0icGxheWVyc3RhdGlzdGljc2hlYWRlciIgY29sc3Bhbj0iNSI+eyRIZWFkZXJPcHBvbmVudH08L3RoPgoJCQk8dGggY2xhc3M9InBsYXllcnN0YXRpc3RpY3NoZWFkZXIiIGNvbHNwYW49IjQiPnskSGVhZGVyUGxheWVyfTwvdGg+CgkJPC90cj4KCQk8dHIgY2xhc3M9InBsYXllcnN0YXRpc3RpY3NoZWFkZXIiPgoJCQk8dGggY2xhc3M9InBsYXllcnN0YXRpc3RpY3NoZWFkZXIiPnskSGVhZGVyRGF0ZX08L3RoPgoJCQk8dGggY2xhc3M9InBsYXllcnN0YXRpc3RpY3NoZWFkZXIiPnskSGVhZGVyT3Bwb25lbnRUZWFtfTwvdGg+CgkJCTx0aCBjbGFzcz0icGxheWVyc3RhdGlzdGljc2hlYWRlciI+eyRIZWFkZXJOYW1lfTwvdGg+CgkJCTx0aCBjbGFzcz0icGxheWVyc3RhdGlzdGljc2hlYWRlciI+eyRIZWFkZXJHZXN9PC90aD4KCQkJPHRoIGNsYXNzPSJwbGF5ZXJzdGF0aXN0aWNzaGVhZGVyIj57JEhlYWRlclZvbGx9PC90aD4KCQkJPHRoIGNsYXNzPSJwbGF5ZXJzdGF0aXN0aWNzaGVhZGVyIj57JEhlYWRlckFicn08L3RoPgoJCQk8dGggY2xhc3M9InBsYXllcnN0YXRpc3RpY3NoZWFkZXIiPnskSGVhZGVyRmVobH08L3RoPgoJCQk8dGggY2xhc3M9InBsYXllcnN0YXRpc3RpY3NoZWFkZXIiPnskSGVhZGVyR2VzfTwvdGg+CgkJCTx0aCBjbGFzcz0icGxheWVyc3RhdGlzdGljc2hlYWRlciI+eyRIZWFkZXJWb2xsfTwvdGg+CgkJCTx0aCBjbGFzcz0icGxheWVyc3RhdGlzdGljc2hlYWRlciI+eyRIZWFkZXJBYnJ9PC90aD4KCQkJPHRoIGNsYXNzPSJwbGF5ZXJzdGF0aXN0aWNzaGVhZGVyIj57JEhlYWRlckZlaGx9PC90aD4KCQk8L3RyPgoJPC90aGVhZD4KCTx0Ym9keT4KCXskcmVzdWx0Y291bnRlciA9IDB9Cgl7Zm9yZWFjaCBuYW1lPXJlc2l0IGZyb209JEdhbWVzIGl0ZW09R2FtZX0KCQl7aWYgJEdhbWUuSG9tZSAhPSBmYWxzZX0KCQk8dHIgY2xhc3M9InBsYXllcnN0YXRpc3RpY3NoZWltIj4KCQl7JHR5cGUgPSAiaGVpbSJ9CgkJe2Vsc2V9CgkJPHRyIGNsYXNzPSJwbGF5ZXJzdGF0aXN0aWNzYXVzdyI+CgkJeyR0eXBlID0gImF1c3cifQoJCXsvaWZ9CgkJPHRkIGNsYXNzPSJwbGF5ZXJzdGF0aXN0aWNzaGVhZGVyX2xlZnQiPnskR2FtZS5EYXRlfTwvdGQ+CgkJPHRkIGNsYXNzPSJwbGF5ZXJzdGF0aXN0aWNzaGVhZGVyX2xlZnQiPnskR2FtZS5PcHBvbmVudFRlYW19PC90ZD4KCQk8dGQgY2xhc3M9InBsYXllcnN0YXRpc3RpY3NoZWFkZXJfbGVmdCI+eyRHYW1lLk9wcG9uZW50UGxheWVyfTwvdGQ+CgkJe2lmICRHYW1lLk9TY2huaXR0ID09IGZhbHNlfQoJCTx0ZCBjbGFzcz0icGxheWVyc3RhdGlzdGljc19ueyR0eXBlfSI+eyRHYW1lLk9HZXN9PC90ZD4KCQk8dGQgY2xhc3M9InBsYXllcnN0YXRpc3RpY3NfbnskdHlwZX0iPnskR2FtZS5PVm9sbH08L3RkPgoJCTx0ZCBjbGFzcz0icGxheWVyc3RhdGlzdGljc19ueyR0eXBlfSI+eyRHYW1lLk9BYnJ9PC90ZD4KCQk8dGQgY2xhc3M9InBsYXllcnN0YXRpc3RpY3NfbnskdHlwZX0iPnskR2FtZS5PRmVobH08L3RkPgoJCXtlbHNlfQoJCTx0ZD57JEdhbWUuT0dlc308L3RkPgoJCTx0ZD57JEdhbWUuT1ZvbGx9PC90ZD4KCQk8dGQ+eyRHYW1lLk9BYnJ9PC90ZD4KCQk8dGQ+eyRHYW1lLk9GZWhsfTwvdGQ+CgkJey9pZn0KCQl7aWYgJEdhbWUuU2Nobml0dCA9PSBmYWxzZX0KCQk8dGQgY2xhc3M9InBsYXllcnN0YXRpc3RpY3NfbnskdHlwZX0iPnskR2FtZS5HZXN9PC90ZD4KCQk8dGQgY2xhc3M9InBsYXllcnN0YXRpc3RpY3NfbnskdHlwZX0iPnskR2FtZS5Wb2xsfTwvdGQ+CgkJPHRkIGNsYXNzPSJwbGF5ZXJzdGF0aXN0aWNzX257JHR5cGV9Ij57JEdhbWUuQWJyfTwvdGQ+CgkJPHRkIGNsYXNzPSJwbGF5ZXJzdGF0aXN0aWNzX257JHR5cGV9Ij57JEdhbWUuRmVobH08L3RkPgoJCXtlbHNlfQoJCTx0ZD57JEdhbWUuR2VzfTwvdGQ+CgkJPHRkPnskR2FtZS5Wb2xsfTwvdGQ+CgkJPHRkPnskR2FtZS5BYnJ9PC90ZD4KCQk8dGQ+eyRHYW1lLkZlaGx9PC90ZD4KCQl7L2lmfQoJCTwvdHI+CgkJeyRyZXN1bHRjb3VudGVyID0gJHJlc3VsdGNvdW50ZXIgKyAxfQoJey9mb3JlYWNofQoJe2lmICRyZXN1bHRjb3VudGVyID09IDB9CgkJPHRyIGNsYXNzPSJwbGF5ZXJzdGF0aXN0aWNzaGVpbSI+CgkJPHRkIGNsYXNzPSJwbGF5ZXJzdGF0aXN0aWNzaGVhZGVyIiBjb2xzcGFuPSIxMSI+eyRUZXh0Tm9HYW1lc308L3RkPgoJCTwvdHI+Cgl7L2lmfQoJPC90Ym9keT4KCTx0Zm9vdD4KCQk8dHIgY2xhc3M9InBsYXllcnN0YXRpc3RpY3NoZWFkZXIiPgoJCTx0aCBjbGFzcz0icGxheWVyc3RhdGlzdGljc2hlYWRlciIgY29sc3Bhbj0iMTEiPnskSGVhZGVyU2Nobml0dH08L3RoPgoJCTwvdHI+CgkJPHRyIGNsYXNzPSJwbGF5ZXJzdGF0aXN0aWNzaGVhZGVyIj4KCQkJPHRoIGNsYXNzPSJwbGF5ZXJzdGF0aXN0aWNzaGVhZGVyIiBjb2xzcGFuPSIzIj48L3RoPgoJCQk8dGggY2xhc3M9InBsYXllcnN0YXRpc3RpY3NoZWFkZXIiIGNvbHNwYW49IjQiPnskSGVhZGVyT3Bwb25lbnR9PC90aD4KCQkJPHRoIGNsYXNzPSJwbGF5ZXJzdGF0aXN0aWNzaGVhZGVyIiBjb2xzcGFuPSI0Ij57JEhlYWRlclBsYXllcn08L3RoPgoJCTwvdHI+CgkJPHRyIGNsYXNzPSJwbGF5ZXJzdGF0aXN0aWNzaGVhZGVyIj4KCQkJPHRoIGNsYXNzPSJwbGF5ZXJzdGF0aXN0aWNzaGVhZGVyIiBjb2xzcGFuPSIyIj57JEhlYWRlclNjaG5pdHRUeXBlfTwvdGg+CgkJCTx0aCBjbGFzcz0icGxheWVyc3RhdGlzdGljc2hlYWRlciI+eyRIZWFkZXJTY2huaXR0Q291bnR9IC0gKHskSGVhZGVyT3Bwb25lbnR9KTooeyRIZWFkZXJQbGF5ZXJ9KTwvdGg+CgkJCTx0aCBjbGFzcz0icGxheWVyc3RhdGlzdGljc2hlYWRlciI+eyRIZWFkZXJHZXN9PC90aD4KCQkJPHRoIGNsYXNzPSJwbGF5ZXJzdGF0aXN0aWNzaGVhZGVyIj57JEhlYWRlclZvbGx9PC90aD4KCQkJPHRoIGNsYXNzPSJwbGF5ZXJzdGF0aXN0aWNzaGVhZGVyIj57JEhlYWRlckFicn08L3RoPgoJCQk8dGggY2xhc3M9InBsYXllcnN0YXRpc3RpY3NoZWFkZXIiPnskSGVhZGVyRmVobH08L3RoPgoJCQk8dGggY2xhc3M9InBsYXllcnN0YXRpc3RpY3NoZWFkZXIiPnskSGVhZGVyR2VzfTwvdGg+CgkJCTx0aCBjbGFzcz0icGxheWVyc3RhdGlzdGljc2hlYWRlciI+eyRIZWFkZXJWb2xsfTwvdGg+CgkJCTx0aCBjbGFzcz0icGxheWVyc3RhdGlzdGljc2hlYWRlciI+eyRIZWFkZXJBYnJ9PC90aD4KCQkJPHRoIGNsYXNzPSJwbGF5ZXJzdGF0aXN0aWNzaGVhZGVyIj57JEhlYWRlckZlaGx9PC90aD4KCQk8L3RyPgoJCTx0ciBjbGFzcz0icGxheWVyc3RhdGlzdGljc3NnZXNhbXQiPgoJCTx0ZCBjbGFzcz0icGxheWVyc3RhdGlzdGljc2hlYWRlcl9sZWZ0IiBjb2xzcGFuPSIyIj57JEhlYWRlclNjaG5pdHRHZXN9PC90ZD4KCQk8dGQgY2xhc3M9InBsYXllcnN0YXRpc3RpY3NoZWFkZXJfbGVmdCI+KHskU2Nobml0dC5nZXMub2NvdW50fSk6KHskU2Nobml0dC5nZXMuY291bnR9KTwvdGQ+CgkJe2lmICRTY2huaXR0Lmdlcy5vY291bnQgPT0gMH0KCQk8dGQgY2xhc3M9InBsYXllcnN0YXRpc3RpY3NoZWFkZXIiIGNvbHNwYW49IjQiPnskVGV4dE5vR2FtZXN9PC90ZD4KCQl7ZWxzZX0KCQk8dGQ+e21hdGggZXF1YXRpb249IngveSIgeD0kU2Nobml0dC5nZXMub2dlcyB5PSRTY2huaXR0Lmdlcy5vY291bnQgZm9ybWF0PSIlLjJmIn08L3RkPgoJCTx0ZD57bWF0aCBlcXVhdGlvbj0ieC95IiB4PSRTY2huaXR0Lmdlcy5vdm9sbCB5PSRTY2huaXR0Lmdlcy5vY291bnQgZm9ybWF0PSIlLjJmIn08L3RkPgoJCTx0ZD57bWF0aCBlcXVhdGlvbj0ieC95IiB4PSRTY2huaXR0Lmdlcy5vYWJyIHk9JFNjaG5pdHQuZ2VzLm9jb3VudCBmb3JtYXQ9IiUuMmYifTwvdGQ+CgkJPHRkPnttYXRoIGVxdWF0aW9uPSJ4L3kiIHg9JFNjaG5pdHQuZ2VzLm9mZWhsIHk9JFNjaG5pdHQuZ2VzLm9jb3VudCBmb3JtYXQ9IiUuMmYifTwvdGQ+CgkJey9pZn0KCQl7aWYgJFNjaG5pdHQuZ2VzLmNvdW50ID09IDB9CgkJPHRkIGNsYXNzPSJwbGF5ZXJzdGF0aXN0aWNzaGVhZGVyIiBjb2xzcGFuPSI0Ij57JFRleHROb0dhbWVzfTwvdGQ+CgkJe2Vsc2V9CgkJPHRkPnttYXRoIGVxdWF0aW9uPSJ4L3kiIHg9JFNjaG5pdHQuZ2VzLmdlcyB5PSRTY2huaXR0Lmdlcy5jb3VudCBmb3JtYXQ9IiUuMmYifTwvdGQ+CgkJPHRkPnttYXRoIGVxdWF0aW9uPSJ4L3kiIHg9JFNjaG5pdHQuZ2VzLnZvbGwgeT0kU2Nobml0dC5nZXMuY291bnQgZm9ybWF0PSIlLjJmIn08L3RkPgoJCTx0ZD57bWF0aCBlcXVhdGlvbj0ieC95IiB4PSRTY2huaXR0Lmdlcy5hYnIgeT0kU2Nobml0dC5nZXMuY291bnQgZm9ybWF0PSIlLjJmIn08L3RkPgoJCTx0ZD57bWF0aCBlcXVhdGlvbj0ieC95IiB4PSRTY2huaXR0Lmdlcy5mZWhsIHk9JFNjaG5pdHQuZ2VzLmNvdW50IGZvcm1hdD0iJS4yZiJ9PC90ZD4KCQl7L2lmfQoJCTwvdHI+CgkJPHRyIGNsYXNzPSJwbGF5ZXJzdGF0aXN0aWNzc2F1c3ciPgoJCTx0ZCBjbGFzcz0icGxheWVyc3RhdGlzdGljc2hlYWRlcl9sZWZ0IiBjb2xzcGFuPSIyIj57JEhlYWRlclNjaG5pdHRBd2F5fTwvdGQ+CgkJPHRkIGNsYXNzPSJwbGF5ZXJzdGF0aXN0aWNzaGVhZGVyX2xlZnQiPih7JFNjaG5pdHQuYXVzdy5vY291bnR9KTooeyRTY2huaXR0LmF1c3cuY291bnR9KTwvdGQ+CgkJe2lmICRTY2huaXR0LmF1c3cub2NvdW50ID09IDB9CgkJPHRkIGNsYXNzPSJwbGF5ZXJzdGF0aXN0aWNzaGVhZGVyIiBjb2xzcGFuPSI0Ij57JFRleHROb0dhbWVzfTwvdGQ+CgkJe2Vsc2V9CgkJPHRkPnttYXRoIGVxdWF0aW9uPSJ4L3kiIHg9JFNjaG5pdHQuYXVzdy5vZ2VzIHk9JFNjaG5pdHQuYXVzdy5vY291bnQgZm9ybWF0PSIlLjJmIn08L3RkPgoJCTx0ZD57bWF0aCBlcXVhdGlvbj0ieC95IiB4PSRTY2huaXR0LmF1c3cub3ZvbGwgeT0kU2Nobml0dC5hdXN3Lm9jb3VudCBmb3JtYXQ9IiUuMmYifTwvdGQ+CgkJPHRkPnttYXRoIGVxdWF0aW9uPSJ4L3kiIHg9JFNjaG5pdHQuYXVzdy5vYWJyIHk9JFNjaG5pdHQuYXVzdy5vY291bnQgZm9ybWF0PSIlLjJmIn08L3RkPgoJCTx0ZD57bWF0aCBlcXVhdGlvbj0ieC95IiB4PSRTY2huaXR0LmF1c3cub2ZlaGwgeT0kU2Nobml0dC5hdXN3Lm9jb3VudCBmb3JtYXQ9IiUuMmYifTwvdGQ+CgkJey9pZn0KCQl7aWYgJFNjaG5pdHQuYXVzdy5jb3VudCA9PSAwfQoJCTx0ZCBjbGFzcz0icGxheWVyc3RhdGlzdGljc2hlYWRlciIgY29sc3Bhbj0iNCI+eyRUZXh0Tm9HYW1lc308L3RkPgoJCXtlbHNlfQoJCTx0ZD57bWF0aCBlcXVhdGlvbj0ieC95IiB4PSRTY2huaXR0LmF1c3cuZ2VzIHk9JFNjaG5pdHQuYXVzdy5jb3VudCBmb3JtYXQ9IiUuMmYifTwvdGQ+CgkJPHRkPnttYXRoIGVxdWF0aW9uPSJ4L3kiIHg9JFNjaG5pdHQuYXVzdy52b2xsIHk9JFNjaG5pdHQuYXVzdy5jb3VudCBmb3JtYXQ9IiUuMmYifTwvdGQ+CgkJPHRkPnttYXRoIGVxdWF0aW9uPSJ4L3kiIHg9JFNjaG5pdHQuYXVzdy5hYnIgeT0kU2Nobml0dC5hdXN3LmNvdW50IGZvcm1hdD0iJS4yZiJ9PC90ZD4KCQk8dGQ+e21hdGggZXF1YXRpb249IngveSIgeD0kU2Nobml0dC5hdXN3LmZlaGwgeT0kU2Nobml0dC5hdXN3LmNvdW50IGZvcm1hdD0iJS4yZiJ9PC90ZD4KCQl7L2lmfQoJCTwvdHI+CgkJPHRyIGNsYXNzPSJwbGF5ZXJzdGF0aXN0aWNzc2hlaW0iPgoJCTx0ZCBjbGFzcz0icGxheWVyc3RhdGlzdGljc2hlYWRlcl9sZWZ0IiBjb2xzcGFuPSIyIj57JEhlYWRlclNjaG5pdHRIb21lfTwvdGQ+CgkJPHRkIGNsYXNzPSJwbGF5ZXJzdGF0aXN0aWNzaGVhZGVyX2xlZnQiPih7JFNjaG5pdHQuaGVpbS5vY291bnR9KTooeyRTY2huaXR0LmhlaW0uY291bnR9KTwvdGQ+CgkJe2lmICRTY2huaXR0LmhlaW0ub2NvdW50ID09IDB9CgkJPHRkIGNsYXNzPSJwbGF5ZXJzdGF0aXN0aWNzaGVhZGVyIiBjb2xzcGFuPSI0Ij57JFRleHROb0dhbWVzfTwvdGQ+CgkJe2Vsc2V9CgkJPHRkPnttYXRoIGVxdWF0aW9uPSJ4L3kiIHg9JFNjaG5pdHQuaGVpbS5vZ2VzIHk9JFNjaG5pdHQuaGVpbS5vY291bnQgZm9ybWF0PSIlLjJmIn08L3RkPgoJCTx0ZD57bWF0aCBlcXVhdGlvbj0ieC95IiB4PSRTY2huaXR0LmhlaW0ub3ZvbGwgeT0kU2Nobml0dC5oZWltLm9jb3VudCBmb3JtYXQ9IiUuMmYifTwvdGQ+CgkJPHRkPnttYXRoIGVxdWF0aW9uPSJ4L3kiIHg9JFNjaG5pdHQuaGVpbS5vYWJyIHk9JFNjaG5pdHQuaGVpbS5vY291bnQgZm9ybWF0PSIlLjJmIn08L3RkPgoJCTx0ZD57bWF0aCBlcXVhdGlvbj0ieC95IiB4PSRTY2huaXR0LmhlaW0ub2ZlaGwgeT0kU2Nobml0dC5oZWltLm9jb3VudCBmb3JtYXQ9IiUuMmYifTwvdGQ+CgkJey9pZn0KCQl7aWYgJFNjaG5pdHQuaGVpbS5jb3VudCA9PSAwfQoJCTx0ZCBjbGFzcz0icGxheWVyc3RhdGlzdGljc2hlYWRlciIgY29sc3Bhbj0iNCI+eyRUZXh0Tm9HYW1lc308L3RkPgoJCXtlbHNlfQoJCTx0ZD57bWF0aCBlcXVhdGlvbj0ieC95IiB4PSRTY2huaXR0LmhlaW0uZ2VzIHk9JFNjaG5pdHQuaGVpbS5jb3VudCBmb3JtYXQ9IiUuMmYifTwvdGQ+CgkJPHRkPnttYXRoIGVxdWF0aW9uPSJ4L3kiIHg9JFNjaG5pdHQuaGVpbS52b2xsIHk9JFNjaG5pdHQuaGVpbS5jb3VudCBmb3JtYXQ9IiUuMmYifTwvdGQ+CgkJPHRkPnttYXRoIGVxdWF0aW9uPSJ4L3kiIHg9JFNjaG5pdHQuaGVpbS5hYnIgeT0kU2Nobml0dC5oZWltLmNvdW50IGZvcm1hdD0iJS4yZiJ9PC90ZD4KCQk8dGQ+e21hdGggZXF1YXRpb249IngveSIgeD0kU2Nobml0dC5oZWltLmZlaGwgeT0kU2Nobml0dC5oZWltLmNvdW50IGZvcm1hdD0iJS4yZiJ9PC90ZD4KCQl7L2lmfQoJCTwvdHI+Cgk8L3Rmb290Pgo8L3RhYmxlPgo=]]></data>
	</file>
	<file>
	  <filename>/templates/showplayerresults120.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PHRhYmxlIGNsYXNzPSJwbGF5ZXJzdGF0aXN0aWNzIj4KCTx0aGVhZD4KCQk8dHIgY2xhc3M9InBsYXllcnN0YXRpc3RpY3NoZWFkZXIiPgoJCTx0aCBjbGFzcz0icGxheWVyc3RhdGlzdGljc2hlYWRlciIgY29sc3Bhbj0iMTUiPnskSGVhZGVyR2FtZXN9PC90aD4KCQk8L3RyPgoJCTx0ciBjbGFzcz0icGxheWVyc3RhdGlzdGljc2hlYWRlciI+CgkJCTx0aCBjbGFzcz0icGxheWVyc3RhdGlzdGljc2hlYWRlciIgY29sc3Bhbj0iMiI+eyRIZWFkZXJHYW1lfTwvdGg+CgkJCTx0aCBjbGFzcz0icGxheWVyc3RhdGlzdGljc2hlYWRlciIgY29sc3Bhbj0iNyI+eyRIZWFkZXJPcHBvbmVudH08L3RoPgoJCQk8dGggY2xhc3M9InBsYXllcnN0YXRpc3RpY3NoZWFkZXIiIGNvbHNwYW49IjYiPnskSGVhZGVyUGxheWVyfTwvdGg+CgkJPC90cj4KCQk8dHIgY2xhc3M9InBsYXllcnN0YXRpc3RpY3NoZWFkZXIiPgoJCQk8dGggY2xhc3M9InBsYXllcnN0YXRpc3RpY3NoZWFkZXIiPnskSGVhZGVyRGF0ZX08L3RoPgoJCQk8dGggY2xhc3M9InBsYXllcnN0YXRpc3RpY3NoZWFkZXIiPnskSGVhZGVyT3Bwb25lbnRUZWFtfTwvdGg+CgkJCTx0aCBjbGFzcz0icGxheWVyc3RhdGlzdGljc2hlYWRlciI+eyRIZWFkZXJOYW1lfTwvdGg+CgkJCTx0aCBjbGFzcz0icGxheWVyc3RhdGlzdGljc2hlYWRlciI+eyRIZWFkZXJNUH08L3RoPgoJCQk8dGggY2xhc3M9InBsYXllcnN0YXRpc3RpY3NoZWFkZXIiPnskSGVhZGVyU1B9PC90aD4KCQkJPHRoIGNsYXNzPSJwbGF5ZXJzdGF0aXN0aWNzaGVhZGVyIj57JEhlYWRlckdlc308L3RoPgoJCQk8dGggY2xhc3M9InBsYXllcnN0YXRpc3RpY3NoZWFkZXIiPnskSGVhZGVyVm9sbH08L3RoPgoJCQk8dGggY2xhc3M9InBsYXllcnN0YXRpc3RpY3NoZWFkZXIiPnskSGVhZGVyQWJyfTwvdGg+CgkJCTx0aCBjbGFzcz0icGxheWVyc3RhdGlzdGljc2hlYWRlciI+eyRIZWFkZXJGZWhsfTwvdGg+CgkJCTx0aCBjbGFzcz0icGxheWVyc3RhdGlzdGljc2hlYWRlciI+eyRIZWFkZXJNUH08L3RoPgoJCQk8dGggY2xhc3M9InBsYXllcnN0YXRpc3RpY3NoZWFkZXIiPnskSGVhZGVyU1B9PC90aD4KCQkJPHRoIGNsYXNzPSJwbGF5ZXJzdGF0aXN0aWNzaGVhZGVyIj57JEhlYWRlckdlc308L3RoPgoJCQk8dGggY2xhc3M9InBsYXllcnN0YXRpc3RpY3NoZWFkZXIiPnskSGVhZGVyVm9sbH08L3RoPgoJCQk8dGggY2xhc3M9InBsYXllcnN0YXRpc3RpY3NoZWFkZXIiPnskSGVhZGVyQWJyfTwvdGg+CgkJCTx0aCBjbGFzcz0icGxheWVyc3RhdGlzdGljc2hlYWRlciI+eyRIZWFkZXJGZWhsfTwvdGg+CgkJPC90cj4KCTwvdGhlYWQ+Cgk8dGJvZHk+Cgl7JHJlc3VsdGNvdW50ZXIgPSAwfQoJe2ZvcmVhY2ggbmFtZT1yZXNpdCBmcm9tPSRHYW1lcyBpdGVtPUdhbWV9CgkJe2lmICRHYW1lLkhvbWUgIT0gZmFsc2V9CgkJPHRyIGNsYXNzPSJwbGF5ZXJzdGF0aXN0aWNzaGVpbSI+CgkJeyR0eXBlID0gImhlaW0ifQoJCXtlbHNlfQoJCTx0ciBjbGFzcz0icGxheWVyc3RhdGlzdGljc2F1c3ciPgoJCXskdHlwZSA9ICJhdXN3In0KCQl7L2lmfQoJCTx0ZCBjbGFzcz0icGxheWVyc3RhdGlzdGljc2hlYWRlcl9sZWZ0Ij57JEdhbWUuRGF0ZX08L3RkPgoJCTx0ZCBjbGFzcz0icGxheWVyc3RhdGlzdGljc2hlYWRlcl9sZWZ0Ij57JEdhbWUuT3Bwb25lbnRUZWFtfTwvdGQ+CgkJPHRkIGNsYXNzPSJwbGF5ZXJzdGF0aXN0aWNzaGVhZGVyX2xlZnQiPnskR2FtZS5PcHBvbmVudFBsYXllcn08L3RkPgoJCXtpZiAkR2FtZS5PU2Nobml0dCA9PSBmYWxzZX0KCQk8dGQgY2xhc3M9InBsYXllcnN0YXRpc3RpY3NfbnskdHlwZX0iPnttYXRoIGVxdWF0aW9uPSJ4LzEwIiB4PSRHYW1lLk9NUCBmb3JtYXQ9IiUuMmYifTwvdGQ+CgkJPHRkIGNsYXNzPSJwbGF5ZXJzdGF0aXN0aWNzX257JHR5cGV9Ij57bWF0aCBlcXVhdGlvbj0ieC8xMCIgeD0kR2FtZS5PU1AgZm9ybWF0PSIlLjJmIn08L3RkPgoJCTx0ZCBjbGFzcz0icGxheWVyc3RhdGlzdGljc19ueyR0eXBlfSI+eyRHYW1lLk9HZXN9PC90ZD4KCQk8dGQgY2xhc3M9InBsYXllcnN0YXRpc3RpY3NfbnskdHlwZX0iPnskR2FtZS5PVm9sbH08L3RkPgoJCTx0ZCBjbGFzcz0icGxheWVyc3RhdGlzdGljc19ueyR0eXBlfSI+eyRHYW1lLk9BYnJ9PC90ZD4KCQk8dGQgY2xhc3M9InBsYXllcnN0YXRpc3RpY3NfbnskdHlwZX0iPnskR2FtZS5PRmVobH08L3RkPgoJCXtlbHNlfQoJCTx0ZD57bWF0aCBlcXVhdGlvbj0ieC8xMCIgeD0kR2FtZS5PTVAgZm9ybWF0PSIlLjJmIn08L3RkPgoJCTx0ZD57bWF0aCBlcXVhdGlvbj0ieC8xMCIgeD0kR2FtZS5PU1AgZm9ybWF0PSIlLjJmIn08L3RkPgoJCTx0ZD57JEdhbWUuT0dlc308L3RkPgoJCTx0ZD57JEdhbWUuT1ZvbGx9PC90ZD4KCQk8dGQ+eyRHYW1lLk9BYnJ9PC90ZD4KCQk8dGQ+eyRHYW1lLk9GZWhsfTwvdGQ+CgkJey9pZn0KCQl7aWYgJEdhbWUuU2Nobml0dCA9PSBmYWxzZX0KCQk8dGQgY2xhc3M9InBsYXllcnN0YXRpc3RpY3NfbnskdHlwZX0iPnttYXRoIGVxdWF0aW9uPSJ4LzEwIiB4PSRHYW1lLk1QIGZvcm1hdD0iJS4yZiJ9PC90ZD4KCQk8dGQgY2xhc3M9InBsYXllcnN0YXRpc3RpY3NfbnskdHlwZX0iPnttYXRoIGVxdWF0aW9uPSJ4LzEwIiB4PSRHYW1lLlNQIGZvcm1hdD0iJS4yZiJ9PC90ZD4KCQk8dGQgY2xhc3M9InBsYXllcnN0YXRpc3RpY3NfbnskdHlwZX0iPnskR2FtZS5HZXN9PC90ZD4KCQk8dGQgY2xhc3M9InBsYXllcnN0YXRpc3RpY3NfbnskdHlwZX0iPnskR2FtZS5Wb2xsfTwvdGQ+CgkJPHRkIGNsYXNzPSJwbGF5ZXJzdGF0aXN0aWNzX257JHR5cGV9Ij57JEdhbWUuQWJyfTwvdGQ+CgkJPHRkIGNsYXNzPSJwbGF5ZXJzdGF0aXN0aWNzX257JHR5cGV9Ij57JEdhbWUuRmVobH08L3RkPgoJCXtlbHNlfQoJCTx0ZD57bWF0aCBlcXVhdGlvbj0ieC8xMCIgeD0kR2FtZS5NUCBmb3JtYXQ9IiUuMmYifTwvdGQ+CgkJPHRkPnttYXRoIGVxdWF0aW9uPSJ4LzEwIiB4PSRHYW1lLlNQIGZvcm1hdD0iJS4yZiJ9PC90ZD4KCQk8dGQ+eyRHYW1lLkdlc308L3RkPgoJCTx0ZD57JEdhbWUuVm9sbH08L3RkPgoJCTx0ZD57JEdhbWUuQWJyfTwvdGQ+CgkJPHRkPnskR2FtZS5GZWhsfTwvdGQ+CgkJey9pZn0KCQk8L3RyPgoJCXskcmVzdWx0Y291bnRlciA9ICRyZXN1bHRjb3VudGVyICsgMX0KCXsvZm9yZWFjaH0KCXtpZiAkcmVzdWx0Y291bnRlciA9PSAwfQoJCTx0ciBjbGFzcz0icGxheWVyc3RhdGlzdGljc2hlaW0iPgoJCTx0ZCBjbGFzcz0icGxheWVyc3RhdGlzdGljc2hlYWRlciIgY29sc3Bhbj0iMTUiPnskVGV4dE5vR2FtZXN9PC90ZD4KCQk8L3RyPgoJey9pZn0KCTwvdGJvZHk+Cgk8dGZvb3Q+CgkJPHRyIGNsYXNzPSJwbGF5ZXJzdGF0aXN0aWNzaGVhZGVyIj4KCQk8dGggY2xhc3M9InBsYXllcnN0YXRpc3RpY3NoZWFkZXIiIGNvbHNwYW49IjE1Ij57JEhlYWRlclNjaG5pdHR9PC90aD4KCQk8L3RyPgoJCTx0ciBjbGFzcz0icGxheWVyc3RhdGlzdGljc2hlYWRlciI+CgkJCTx0aCBjbGFzcz0icGxheWVyc3RhdGlzdGljc2hlYWRlciIgY29sc3Bhbj0iMyI+PC90aD4KCQkJPHRoIGNsYXNzPSJwbGF5ZXJzdGF0aXN0aWNzaGVhZGVyIiBjb2xzcGFuPSI2Ij57JEhlYWRlck9wcG9uZW50fTwvdGg+CgkJCTx0aCBjbGFzcz0icGxheWVyc3RhdGlzdGljc2hlYWRlciIgY29sc3Bhbj0iNiI+eyRIZWFkZXJQbGF5ZXJ9PC90aD4KCQk8L3RyPgoJCTx0ciBjbGFzcz0icGxheWVyc3RhdGlzdGljc2hlYWRlciI+CgkJCTx0aCBjbGFzcz0icGxheWVyc3RhdGlzdGljc2hlYWRlciIgY29sc3Bhbj0iMiI+eyRIZWFkZXJTY2huaXR0VHlwZX08L3RoPgoJCQk8dGggY2xhc3M9InBsYXllcnN0YXRpc3RpY3NoZWFkZXIiPnskSGVhZGVyU2Nobml0dENvdW50fSAtICh7JEhlYWRlck9wcG9uZW50fSk6KHskSGVhZGVyUGxheWVyfSk8L3RoPgoJCQk8dGggY2xhc3M9InBsYXllcnN0YXRpc3RpY3NoZWFkZXIiPnskSGVhZGVyTVB9PC90aD4KCQkJPHRoIGNsYXNzPSJwbGF5ZXJzdGF0aXN0aWNzaGVhZGVyIj57JEhlYWRlclNQfTwvdGg+CgkJCTx0aCBjbGFzcz0icGxheWVyc3RhdGlzdGljc2hlYWRlciI+eyRIZWFkZXJHZXN9PC90aD4KCQkJPHRoIGNsYXNzPSJwbGF5ZXJzdGF0aXN0aWNzaGVhZGVyIj57JEhlYWRlclZvbGx9PC90aD4KCQkJPHRoIGNsYXNzPSJwbGF5ZXJzdGF0aXN0aWNzaGVhZGVyIj57JEhlYWRlckFicn08L3RoPgoJCQk8dGggY2xhc3M9InBsYXllcnN0YXRpc3RpY3NoZWFkZXIiPnskSGVhZGVyRmVobH08L3RoPgoJCQk8dGggY2xhc3M9InBsYXllcnN0YXRpc3RpY3NoZWFkZXIiPnskSGVhZGVyTVB9PC90aD4KCQkJPHRoIGNsYXNzPSJwbGF5ZXJzdGF0aXN0aWNzaGVhZGVyIj57JEhlYWRlclNQfTwvdGg+CgkJCTx0aCBjbGFzcz0icGxheWVyc3RhdGlzdGljc2hlYWRlciI+eyRIZWFkZXJHZXN9PC90aD4KCQkJPHRoIGNsYXNzPSJwbGF5ZXJzdGF0aXN0aWNzaGVhZGVyIj57JEhlYWRlclZvbGx9PC90aD4KCQkJPHRoIGNsYXNzPSJwbGF5ZXJzdGF0aXN0aWNzaGVhZGVyIj57JEhlYWRlckFicn08L3RoPgoJCQk8dGggY2xhc3M9InBsYXllcnN0YXRpc3RpY3NoZWFkZXIiPnskSGVhZGVyRmVobH08L3RoPgoJCTwvdHI+CgkJPHRyIGNsYXNzPSJwbGF5ZXJzdGF0aXN0aWNzc2dlc2FtdCI+CgkJPHRkIGNsYXNzPSJwbGF5ZXJzdGF0aXN0aWNzaGVhZGVyX2xlZnQiIGNvbHNwYW49IjIiPnskSGVhZGVyU2Nobml0dEdlc308L3RkPgoJCTx0ZCBjbGFzcz0icGxheWVyc3RhdGlzdGljc2hlYWRlcl9sZWZ0Ij4oeyRTY2huaXR0Lmdlcy5vY291bnR9KTooeyRTY2huaXR0Lmdlcy5jb3VudH0pPC90ZD4KCQl7aWYgJFNjaG5pdHQuZ2VzLm9jb3VudCA9PSAwfQoJCTx0ZCBjbGFzcz0icGxheWVyc3RhdGlzdGljc2hlYWRlciIgY29sc3Bhbj0iNiI+eyRUZXh0Tm9HYW1lc308L3RkPgoJCXtlbHNlfQoJCTx0ZD57bWF0aCBlcXVhdGlvbj0ieC95LzEwIiB4PSRTY2huaXR0Lmdlcy5vbXAgeT0kU2Nobml0dC5nZXMub2NvdW50IGZvcm1hdD0iJS4yZiJ9PC90ZD4KCQk8dGQ+e21hdGggZXF1YXRpb249IngveS8xMCIgeD0kU2Nobml0dC5nZXMub3NwIHk9JFNjaG5pdHQuZ2VzLm9jb3VudCBmb3JtYXQ9IiUuMmYifTwvdGQ+CgkJPHRkPnttYXRoIGVxdWF0aW9uPSJ4L3kiIHg9JFNjaG5pdHQuZ2VzLm9nZXMgeT0kU2Nobml0dC5nZXMub2NvdW50IGZvcm1hdD0iJS4yZiJ9PC90ZD4KCQk8dGQ+e21hdGggZXF1YXRpb249IngveSIgeD0kU2Nobml0dC5nZXMub3ZvbGwgeT0kU2Nobml0dC5nZXMub2NvdW50IGZvcm1hdD0iJS4yZiJ9PC90ZD4KCQk8dGQ+e21hdGggZXF1YXRpb249IngveSIgeD0kU2Nobml0dC5nZXMub2FiciB5PSRTY2huaXR0Lmdlcy5vY291bnQgZm9ybWF0PSIlLjJmIn08L3RkPgoJCTx0ZD57bWF0aCBlcXVhdGlvbj0ieC95IiB4PSRTY2huaXR0Lmdlcy5vZmVobCB5PSRTY2huaXR0Lmdlcy5vY291bnQgZm9ybWF0PSIlLjJmIn08L3RkPgoJCXsvaWZ9CgkJe2lmICRTY2huaXR0Lmdlcy5jb3VudCA9PSAwfQoJCTx0ZCBjbGFzcz0icGxheWVyc3RhdGlzdGljc2hlYWRlciIgY29sc3Bhbj0iNiI+eyRUZXh0Tm9HYW1lc308L3RkPgoJCXtlbHNlfQoJCTx0ZD57bWF0aCBlcXVhdGlvbj0ieC95LzEwIiB4PSRTY2huaXR0Lmdlcy5tcCB5PSRTY2huaXR0Lmdlcy5jb3VudCBmb3JtYXQ9IiUuMmYifTwvdGQ+CgkJPHRkPnttYXRoIGVxdWF0aW9uPSJ4L3kvMTAiIHg9JFNjaG5pdHQuZ2VzLnNwIHk9JFNjaG5pdHQuZ2VzLmNvdW50IGZvcm1hdD0iJS4yZiJ9PC90ZD4KCQk8dGQ+e21hdGggZXF1YXRpb249IngveSIgeD0kU2Nobml0dC5nZXMuZ2VzIHk9JFNjaG5pdHQuZ2VzLmNvdW50IGZvcm1hdD0iJS4yZiJ9PC90ZD4KCQk8dGQ+e21hdGggZXF1YXRpb249IngveSIgeD0kU2Nobml0dC5nZXMudm9sbCB5PSRTY2huaXR0Lmdlcy5jb3VudCBmb3JtYXQ9IiUuMmYifTwvdGQ+CgkJPHRkPnttYXRoIGVxdWF0aW9uPSJ4L3kiIHg9JFNjaG5pdHQuZ2VzLmFiciB5PSRTY2huaXR0Lmdlcy5jb3VudCBmb3JtYXQ9IiUuMmYifTwvdGQ+CgkJPHRkPnttYXRoIGVxdWF0aW9uPSJ4L3kiIHg9JFNjaG5pdHQuZ2VzLmZlaGwgeT0kU2Nobml0dC5nZXMuY291bnQgZm9ybWF0PSIlLjJmIn08L3RkPgoJCXsvaWZ9CgkJPC90cj4KCQk8dHIgY2xhc3M9InBsYXllcnN0YXRpc3RpY3NzYXVzdyI+CgkJPHRkIGNsYXNzPSJwbGF5ZXJzdGF0aXN0aWNzaGVhZGVyX2xlZnQiIGNvbHNwYW49IjIiPnskSGVhZGVyU2Nobml0dEF3YXl9PC90ZD4KCQk8dGQgY2xhc3M9InBsYXllcnN0YXRpc3RpY3NoZWFkZXJfbGVmdCI+KHskU2Nobml0dC5hdXN3Lm9jb3VudH0pOih7JFNjaG5pdHQuYXVzdy5jb3VudH0pPC90ZD4KCQl7aWYgJFNjaG5pdHQuYXVzdy5vY291bnQgPT0gMH0KCQk8dGQgY2xhc3M9InBsYXllcnN0YXRpc3RpY3NoZWFkZXIiIGNvbHNwYW49IjYiPnskVGV4dE5vR2FtZXN9PC90ZD4KCQl7ZWxzZX0KCQk8dGQ+e21hdGggZXF1YXRpb249IngveS8xMCIgeD0kU2Nobml0dC5hdXN3Lm9tcCB5PSRTY2huaXR0LmF1c3cub2NvdW50IGZvcm1hdD0iJS4yZiJ9PC90ZD4KCQk8dGQ+e21hdGggZXF1YXRpb249IngveS8xMCIgeD0kU2Nobml0dC5hdXN3Lm9zcCB5PSRTY2huaXR0LmF1c3cub2NvdW50IGZvcm1hdD0iJS4yZiJ9PC90ZD4KCQk8dGQ+e21hdGggZXF1YXRpb249IngveSIgeD0kU2Nobml0dC5hdXN3Lm9nZXMgeT0kU2Nobml0dC5hdXN3Lm9jb3VudCBmb3JtYXQ9IiUuMmYifTwvdGQ+CgkJPHRkPnttYXRoIGVxdWF0aW9uPSJ4L3kiIHg9JFNjaG5pdHQuYXVzdy5vdm9sbCB5PSRTY2huaXR0LmF1c3cub2NvdW50IGZvcm1hdD0iJS4yZiJ9PC90ZD4KCQk8dGQ+e21hdGggZXF1YXRpb249IngveSIgeD0kU2Nobml0dC5hdXN3Lm9hYnIgeT0kU2Nobml0dC5hdXN3Lm9jb3VudCBmb3JtYXQ9IiUuMmYifTwvdGQ+CgkJPHRkPnttYXRoIGVxdWF0aW9uPSJ4L3kiIHg9JFNjaG5pdHQuYXVzdy5vZmVobCB5PSRTY2huaXR0LmF1c3cub2NvdW50IGZvcm1hdD0iJS4yZiJ9PC90ZD4KCQl7L2lmfQoJCXtpZiAkU2Nobml0dC5hdXN3LmNvdW50ID09IDB9CgkJPHRkIGNsYXNzPSJwbGF5ZXJzdGF0aXN0aWNzaGVhZGVyIiBjb2xzcGFuPSI2Ij57JFRleHROb0dhbWVzfTwvdGQ+CgkJe2Vsc2V9CgkJPHRkPnttYXRoIGVxdWF0aW9uPSJ4L3kvMTAiIHg9JFNjaG5pdHQuYXVzdy5tcCB5PSRTY2huaXR0LmF1c3cuY291bnQgZm9ybWF0PSIlLjJmIn08L3RkPgoJCTx0ZD57bWF0aCBlcXVhdGlvbj0ieC95LzEwIiB4PSRTY2huaXR0LmF1c3cuc3AgeT0kU2Nobml0dC5hdXN3LmNvdW50IGZvcm1hdD0iJS4yZiJ9PC90ZD4KCQk8dGQ+e21hdGggZXF1YXRpb249IngveSIgeD0kU2Nobml0dC5hdXN3LmdlcyB5PSRTY2huaXR0LmF1c3cuY291bnQgZm9ybWF0PSIlLjJmIn08L3RkPgoJCTx0ZD57bWF0aCBlcXVhdGlvbj0ieC95IiB4PSRTY2huaXR0LmF1c3cudm9sbCB5PSRTY2huaXR0LmF1c3cuY291bnQgZm9ybWF0PSIlLjJmIn08L3RkPgoJCTx0ZD57bWF0aCBlcXVhdGlvbj0ieC95IiB4PSRTY2huaXR0LmF1c3cuYWJyIHk9JFNjaG5pdHQuYXVzdy5jb3VudCBmb3JtYXQ9IiUuMmYifTwvdGQ+CgkJPHRkPnttYXRoIGVxdWF0aW9uPSJ4L3kiIHg9JFNjaG5pdHQuYXVzdy5mZWhsIHk9JFNjaG5pdHQuYXVzdy5jb3VudCBmb3JtYXQ9IiUuMmYifTwvdGQ+CgkJey9pZn0KCQk8L3RyPgoJCTx0ciBjbGFzcz0icGxheWVyc3RhdGlzdGljc3NoZWltIj4KCQk8dGQgY2xhc3M9InBsYXllcnN0YXRpc3RpY3NoZWFkZXJfbGVmdCIgY29sc3Bhbj0iMiI+eyRIZWFkZXJTY2huaXR0SG9tZX08L3RkPgoJCTx0ZCBjbGFzcz0icGxheWVyc3RhdGlzdGljc2hlYWRlcl9sZWZ0Ij4oeyRTY2huaXR0LmhlaW0ub2NvdW50fSk6KHskU2Nobml0dC5oZWltLmNvdW50fSk8L3RkPgoJCXtpZiAkU2Nobml0dC5oZWltLm9jb3VudCA9PSAwfQoJCTx0ZCBjbGFzcz0icGxheWVyc3RhdGlzdGljc2hlYWRlciIgY29sc3Bhbj0iNiI+eyRUZXh0Tm9HYW1lc308L3RkPgoJCXtlbHNlfQoJCTx0ZD57bWF0aCBlcXVhdGlvbj0ieC95LzEwIiB4PSRTY2huaXR0LmhlaW0ub21wIHk9JFNjaG5pdHQuaGVpbS5vY291bnQgZm9ybWF0PSIlLjJmIn08L3RkPgoJCTx0ZD57bWF0aCBlcXVhdGlvbj0ieC95LzEwIiB4PSRTY2huaXR0LmhlaW0ub3NwIHk9JFNjaG5pdHQuaGVpbS5vY291bnQgZm9ybWF0PSIlLjJmIn08L3RkPgoJCTx0ZD57bWF0aCBlcXVhdGlvbj0ieC95IiB4PSRTY2huaXR0LmhlaW0ub2dlcyB5PSRTY2huaXR0LmhlaW0ub2NvdW50IGZvcm1hdD0iJS4yZiJ9PC90ZD4KCQk8dGQ+e21hdGggZXF1YXRpb249IngveSIgeD0kU2Nobml0dC5oZWltLm92b2xsIHk9JFNjaG5pdHQuaGVpbS5vY291bnQgZm9ybWF0PSIlLjJmIn08L3RkPgoJCTx0ZD57bWF0aCBlcXVhdGlvbj0ieC95IiB4PSRTY2huaXR0LmhlaW0ub2FiciB5PSRTY2huaXR0LmhlaW0ub2NvdW50IGZvcm1hdD0iJS4yZiJ9PC90ZD4KCQk8dGQ+e21hdGggZXF1YXRpb249IngveSIgeD0kU2Nobml0dC5oZWltLm9mZWhsIHk9JFNjaG5pdHQuaGVpbS5vY291bnQgZm9ybWF0PSIlLjJmIn08L3RkPgoJCXsvaWZ9CgkJe2lmICRTY2huaXR0LmhlaW0uY291bnQgPT0gMH0KCQk8dGQgY2xhc3M9InBsYXllcnN0YXRpc3RpY3NoZWFkZXIiIGNvbHNwYW49IjYiPnskVGV4dE5vR2FtZXN9PC90ZD4KCQl7ZWxzZX0KCQk8dGQ+e21hdGggZXF1YXRpb249IngveS8xMCIgeD0kU2Nobml0dC5oZWltLm1wIHk9JFNjaG5pdHQuaGVpbS5jb3VudCBmb3JtYXQ9IiUuMmYifTwvdGQ+CgkJPHRkPnttYXRoIGVxdWF0aW9uPSJ4L3kvMTAiIHg9JFNjaG5pdHQuaGVpbS5zcCB5PSRTY2huaXR0LmhlaW0uY291bnQgZm9ybWF0PSIlLjJmIn08L3RkPgoJCTx0ZD57bWF0aCBlcXVhdGlvbj0ieC95IiB4PSRTY2huaXR0LmhlaW0uZ2VzIHk9JFNjaG5pdHQuaGVpbS5jb3VudCBmb3JtYXQ9IiUuMmYifTwvdGQ+CgkJPHRkPnttYXRoIGVxdWF0aW9uPSJ4L3kiIHg9JFNjaG5pdHQuaGVpbS52b2xsIHk9JFNjaG5pdHQuaGVpbS5jb3VudCBmb3JtYXQ9IiUuMmYifTwvdGQ+CgkJPHRkPnttYXRoIGVxdWF0aW9uPSJ4L3kiIHg9JFNjaG5pdHQuaGVpbS5hYnIgeT0kU2Nobml0dC5oZWltLmNvdW50IGZvcm1hdD0iJS4yZiJ9PC90ZD4KCQk8dGQ+e21hdGggZXF1YXRpb249IngveSIgeD0kU2Nobml0dC5oZWltLmZlaGwgeT0kU2Nobml0dC5oZWltLmNvdW50IGZvcm1hdD0iJS4yZiJ9PC90ZD4KCQl7L2lmfQoJCTwvdHI+Cgk8L3Rmb290Pgo8L3RhYmxlPgo=]]></data>
	</file>
	<file>
	  <filename>/templates/showtimetable.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PHRhYmxlIGNsYXNzPSJ0aW1ldGFibGUiPgo8dGhlYWQ+Cgk8dHIgY2xhc3M9InRpbWV0YWJsZWhlYWRlciI+CgkJPHRoPnskVGFnRGF0ZX08L3RoPgoJCTx0aD57JFRhZ1RpbWV9PC90aD4KCQk8dGg+eyRUYWdIb21lfTwvdGg+CgkJPHRoPnskVGFnR3Vlc3R9PC90aD4KCQk8dGg+eyRUYWdSZXN1bHR9PC90aD4KCTwvdHI+CjwvdGhlYWQ+CjwvdGJvZHk+Cgl7Zm9yZWFjaCBuYW1lPXJlc2l0IGZyb209JFJlc3VsdHMgaXRlbT1SZXN1bHR9Cgk8dHIgY2xhc3M9IntjeWNsZSB2YWx1ZXM9InRpbWV0YWJsZWVpbnMsdGltZXRhYmxlendlaSJ9IgoJCW9uY2xpY2s9InNldFZpc2liaWxpdHkoJ2tlZ2VsZXJnZWJuaXNzZS5nYW1lLnskc21hcnR5LmZvcmVhY2gucmVzaXQuaW5kZXgrMX0nLCAnYmxvY2snKTsiPgoJCTx0ZCBjbGFzcz0idGltZXRhYmxlZGF0ZSI+eyRSZXN1bHQuR2FtZURhdGV9PC90ZD4KCQk8dGQgY2xhc3M9InRpbWV0YWJsZXRpbWUiPnskUmVzdWx0LkdhbWVUaW1lfTwvdGQ+CgkJe2lmICRSZXN1bHQuR2FtZUlzMTIwID09IGZhbHNlfQoJCQl7aWYgJFJlc3VsdC5HYW1lSG9tZSA9PSB0cnVlfQoJCQkJPHRkIGNsYXNzPSJ0aW1ldGFibGV0ZWFtIj57JFJlc3VsdC5HYW1lT3VyVGVhbX08L3RkPgoJCQkJPHRkIGNsYXNzPSJ0aW1ldGFibGV0ZWFtIj57JFJlc3VsdC5HYW1lT3Bwb25lbnR9PC90ZD4KCQkJCTx0ZCBjbGFzcz0idGltZXRhYmxlcmVzdWx0Ij57JFJlc3VsdC5PdXJTY29yZX0gOiB7JFJlc3VsdC5PcHBvbmVudFNjb3JlfTwvdGQ+CgkJCXtlbHNlfQoJCQkJPHRkIGNsYXNzPSJ0aW1ldGFibGV0ZWFtIj57JFJlc3VsdC5HYW1lT3Bwb25lbnR9PC90ZD4KCQkJCTx0ZCBjbGFzcz0idGltZXRhYmxldGVhbSI+eyRSZXN1bHQuR2FtZU91clRlYW19PC90ZD4KCQkJCTx0ZCBjbGFzcz0idGltZXRhYmxlcmVzdWx0Ij57JFJlc3VsdC5PcHBvbmVudFNjb3JlfSA6IHskUmVzdWx0Lk91clNjb3JlfTwvdGQ+CgkJCXsvaWZ9CgkJe2Vsc2V9CgkJCXtpZiAkUmVzdWx0LkdhbWVIb21lID09IHRydWV9CgkJCQk8dGQgY2xhc3M9InRpbWV0YWJsZXRlYW0iPnskUmVzdWx0LkdhbWVPdXJUZWFtfTwvdGQ+CgkJCQk8dGQgY2xhc3M9InRpbWV0YWJsZXRlYW0iPnskUmVzdWx0LkdhbWVPcHBvbmVudH08L3RkPgoJCQkJPHRkIGNsYXNzPSJ0aW1ldGFibGVyZXN1bHQiPnskUmVzdWx0Lk91clBvaW50c30gOiB7JFJlc3VsdC5PcHBvbmVudFBvaW50c30gKHskUmVzdWx0Lk91clNjb3JlfSA6IHskUmVzdWx0Lk9wcG9uZW50U2NvcmV9KTwvdGQ+CgkJCXtlbHNlfQoJCQkJPHRkIGNsYXNzPSJ0aW1ldGFibGV0ZWFtIj57JFJlc3VsdC5HYW1lT3Bwb25lbnR9PC90ZD4KCQkJCTx0ZCBjbGFzcz0idGltZXRhYmxldGVhbSI+eyRSZXN1bHQuR2FtZU91clRlYW19PC90ZD4KCQkJCTx0ZCBjbGFzcz0idGltZXRhYmxlcmVzdWx0Ij57JFJlc3VsdC5PcHBvbmVudFBvaW50c30gOiB7JFJlc3VsdC5PdXJQb2ludHN9ICh7JFJlc3VsdC5PcHBvbmVudFNjb3JlfSA6IHskUmVzdWx0Lk91clNjb3JlfSk8L3RkPgoJCQl7L2lmfQoJCXsvaWZ9Cgk8L3RyPgoJey9mb3JlYWNofQo8L3Rib2R5Pgo8L3RhYmxlPgp7aWYgJHhscyA9PSB0cnVlfQoJPGRpdiBjbGFzcz0ic2NoZWR1bGVsaW5rIj57a2VnZWxlcmdlYm5pc3NlIGFjdGlvbj0ieGxzdGVhbXRhYmxlIiB0ZWFtPSIkVGVhbSIgc2Fpc29uPSIkU2Fpc29uIiBsaW5rdHlwZT0ieGxzIn08L2Rpdj4Key9pZn0Ke2lmICR4bHN4ID09IHRydWV9Cgk8ZGl2IGNsYXNzPSJzY2hlZHVsZWxpbmsiPntrZWdlbGVyZ2Vibmlzc2UgYWN0aW9uPSJ4bHN0ZWFtdGFibGUiIHRlYW09IiRUZWFtIiBzYWlzb249IiRTYWlzb24iIGxpbmt0eXBlPSJ4bHN4In08L2Rpdj4Key9pZn0Ke2lmICRpY3MgPT0gdHJ1ZX0KCTxkaXYgY2xhc3M9InNjaGVkdWxlbGluayI+e2tlZ2VsZXJnZWJuaXNzZSBhY3Rpb249Inhsc3RlYW10YWJsZSIgdGVhbT0iJFRlYW0iIHNhaXNvbj0iJFNhaXNvbiIgbGlua3R5cGU9ImljcyJ9PC9kaXY+CnsvaWZ9]]></data>
	</file>
	<file>
	  <filename>/templates/Spielplan.ods</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[UEsDBBQAAAgAABFUQUWFbDmKLgAAAC4AAAAIAAAAbWltZXR5cGVhcHBsaWNhdGlvbi92bmQub2FzaXMub3BlbmRvY3VtZW50LnNwcmVhZHNoZWV0UEsDBBQAAAgAABFUQUWo8NOl50EAAOdBAAAYAAAAVGh1bWJuYWlscy90aHVtYm5haWwucG5niVBORw0KGgoAAAANSUhEUgAAANkAAAD/CAIAAADzKeQKAABBrklEQVR4nO19zY8kyXVfRFZWVX93z+5M9wx3JFqiSIHySgJX1M7HcrmELegiGgIE+WL44pPgoy+662hAuvsg+OCDYRgQIP0DhkjL/BC5JJe77Bn2fOzs7szOR093V3d112dmpaMiMiNfvHgRmVU9VZ2SKtCojnz54r1fvIh88SIqMirc2Nj4whe+EMcx55wxliQJyqi8+CQZxGe3211ZWYH8sIiij0ajXq+3uroqMopB3dJ5XUoXQUIQAEhBqDQGhB/igaU6nc7y8jLCY1eTLMtAIimkNBIzwh8EgTBsGIb1el0YjcRQqN1FERkhWVT8L//yL//0T/90OBwKLbZMkXR7CTzqUmQUUVE0j750CYH8iFlRQtERv/3tbwtYtVoN8sECUBZiiKLo+fPn169fF70ZKtBFREZI7vf7+/v7v/IrvyL4dd1QPWFVtQrI6TcHLGKLhUohXWB7/Pjxzs6OaBuSDUJCZUmDkm3gsiqqJoQqOsfTp0/FQy6chTAaiaFQu4siMo1G49mzZ+IhZOChtRO6pS5JoicV8itKKPqQeP6E01IoJ/WLorjoZ0KCena1dOgShOTBYKDYBL9WXwW/KLAJYKL6olNWyi+K/ieACXiiU6pR69X6RdVw0FwXnkIBLsgSm9wvqubUGS0XuQSVuEyKoSJ+MQCpUn5RtQvP0iv3i1q+6o6uTonoJHNhhy7kV5QQUXVfgY8Umfc7Xpccl1hIscvapcqo8+P3VwEJtJW6wPtRFVrS1quNRlZ8ajxkBT3JX5eJJLiw4b64SIt0UUn0xQT8sewTZlx5zQ+Lk2yJg8327S4MdimPOjt56lKILbE+/eD9qDwqbCLZNK4BcVI8ZKtZBcyY3hWsM69fdAX3kGHsF0XkIGbAcqI2zdxlNBJR8FiCmJNk3n5cRNBZFrbXaoFkUIr0mgVXPDZK9SloUAhLR5YxUZcVGVlKzUK41qtVKEuChZJxQT1AibzENgYmBJSZu0CZWjsysfiAemFBz9xFM2QYFLDUaP65izKLqpcSoA2lL6F2FdxHkbg7FqgS2Y3sPmBPE9GlSwgyL2IYLzPVaoNa7ajZ7GVxrmDiZoZlTw8ywZghjkf1+lmj0ULzaMgmzMrYsNE4q9dbtVqs4w3wUBKSzTwEoCmcKkJCpemqSST+Y9EpTcmkHfyJ5HThdGFWkwNWq4WNxmmjEdXrozCMqSoXavdQxENYX109E84EhqSE0Hn6xbff3vmrv/pWHLfDsAb5zAJjaWT5fj/+4Q8//uY3vzIaxZmfyE0gH8dxXzw76//0p5994xuCTXhg9exy2U1ZJjkvBSo8/i8+wUPJrB6jnzOiLyrIWSnDpooeBLXvfnfvxo1fazZrjuUbCIxJzFxhhCpI02l+kDGsqiRn7a28mgImHpLmT3/68MqV9evXX0+SyAHJkACNqU1oQkqNJun1g4MXH3+8xLLh5cJTKB1DMwgGaq17Ur8o+pZ4wsKwmSSx3XjZpVCRZGw1h18kfaHR5yi/mFjF/X4RClEtJ+pdr9cbYRiW84ukV2Ymp8v5kdVkVu1U12nWag0JrMlYzQEJSUDG9ButLuQXDq/zTKEMFUZy5YkIBzM2p18UBUVxJMHyi8xkq5Rf5AqVhFcpvzgCwEYz8Itplf39Y65jtB/KIv3zTUZPKt8p7Qx56ZFAMo/nLimuooVKV9Jhr1cA4KpEZJImBcYTuV9Ukni0VWeFrWqtkvbFqSMGvRwg3X4JLh/bvJMC41nRuKgkx6zUqmYs+GqVJFmglbimL3Mdo+WzUVN/iq6DEjOysZWpBa3xNFkW1wxGvCjZFIP6TODcRXsmFNRriooXTQBEvOiauwDIhk3BpQZW03rBJzOBGdhsFaTpTCIRL2rMylwZswsYKphLQMZUvRlpB0ZTjc5h97KT3eFmuL4oJsJRdCr+5GRt4rmLKBzHXVHcv6YTRb2MrXJrOgpYrRZWbO4yjCIBrBZFSzNa0xG1FtOX7C7djebqF1+8aPzDP6zEcTjdms5wONzdXQ+CTTnXCwAzy4qM2Xq9/t7eMWObYOmH2WxQMpDDAQDy4XPRmdlBMUU9Jx9+uB7HW3IzKerlHjvYAhlVBPGT1WR2TSWw2r1761tbG48ebTI2ckCyJbjg2Q9wrdUabW4GZhUs85mNRcaXheFmIb+ihNeu/ea3vvUfpw7joogtLf3g3Xdv+tl6vdH6+o/feeftaXTMONVqP7h162ZYvRWFra1fbG/vfOELl2ck//Dw7N69X/AskTxz9Yti0BS+Sgy1crHXNUY7y0dRX4xxQoLeGwdDAT2yRNEZZEOhAykZVgAGK3ZVC8MdBElT5FAYyDG6U6s1HWM0bVPUSKTpEGy/WMipgcVxRxjNAwkBQxj8rRnHp2qJ0TN7Q/R8BurmKSnEpoQsDWMT79zFvtSUQIXYSo6iaw4dcetIPGNLEAMlGc1XdFiJk4uOitsUGVfUZGgRuOcuBjBbpnuagmH7xUJODSwzmgcSAuaaKpGtGWj85cdZO0NeeiSQzFzNo/0iJoVYHtCFp0nBzy3NB48emitSfRwlTTpGa39rZxgYNfQogJz8hY/REHOlxmgXMLKa043RNgCXZFhrPrt4MRl/6xnLv1SZ2gKoM5obXmqK+s5UFJcZXDHJkLIpRYpN82gGSnLCsv2IOk9azUVHxW2KVJR+Vy6xJQAwRgVhQJmazTYdgu0XCzkzYLENjKymLR8VIVtTSSYF6kQOxOcZnUl+RQlrtXoQ1BqNml+cKy0trTQaK0KC+POwNZvrZdguJAlgohbVGKaM1GyuCbvNzmJCuFqGq8oY/fTp/e9+92/ieHiO9cV7cfxp0fpib2/v4+HwkdpyYsHgljo4HeEAAPkcO+cuZdYXP/hgt9d7UMH1xb29B5cubV658robki3BBQ9VTfS/oNVqbWz8OvOO0fNM4euvn33968+jaOq9tFEUPfv619cL99Jyrtgq971Lt/vsrbeazWbVvndphuGzK1dO33ijO7u9tI8f/6os6wxyYHO7MuSlRwLJnMijLBorK5dGozAbCybzi/V6tLx8KCQwFlMF1WXAeW95+ViyRRnd9ny2XzT6nOsRt3yGDZWZuuBlbXl5fW3tUr1eob208rO5vHywurqeGW1Sv1hotHqv14evYFvVGae5nmEiZxVRHEfZxpDJ/KIoKEPgyO8XAVvV/OI4hBfwwtA1j74ov1iTwMZGm41f5FJ4AgAQaa5zF5nJFQD0RhmqL6oFKqb+tJysnzFoHaBCWTzlAeZjsMmz9kvLKVtlRM2ptXCo1LzFMkhGtTVF41dC0CeSpmHIvN0XCRtC2JZYlvWkHBoAlhtNdiQaEpQAjan6HtWa+SVwh87OlCT4GeazW9PRrNoKdoa81JQkSRvGzZDA5w+yaQlkQZLZTp5AxSM5u+QQg/1ZKJNE6CGWQ5vaDHjKgrI2D3kJFWRa0oxPNOiUM4wXQaiRgE+YQXmDqIE5CjI4xnnF2nn703XXBRujpS51LZIiybZ2lwqyXq6KuIgMtruDvzxIomrQzZcfZ+0MeemRQDJz+R1gIN+Fq2VfFifZ6Gn0IXSpKbXaOLKREpi7YKBWFiVboqNA1U1dkiFdxbJ6oLDDc8CcUkyBDDQMBwJFGgNT1Yd6bVRADs/y6C42neYHGVJsjjnLJwqYMpoHkmUfA563NZXwgo441zE6igbd7vHUazqDQdTrnQoJ/rmLPFVPsVVt7lITwDqd40ajcms6vV6720263fqM1nS63RM1w63K3OXgYOVHP7ocx5vy4ARVGQYzqdmsDY6KMhxGd+92lpa+AN5JhTpS68i17kGjcU2xwamDS7KOx7VMGNqbNXEGUtTcJafIJg/u3m3Vam/U66HWS6KCMKBMc+6CMxCeXyzkVPPovb2zS5c2P//8ddmT6LIIGMLgaU1R8VZraWNDnTrp/EIfFElcGfLSI4FkHseL1659+Zvf/Pd+KZ4knqulpR++884NP9tgkKyv//jWrd+fWtHsUq32w1u3brhXxy4sbW3t7ozT6zOSf3zcuXv3I3NCjdNc1xfjeCiG16n30vb7/cGgI7dW+PbS9vtnkA1GIS7JMMgAYzTx8LnoqLhNSdIzczv9fqfZrNxe2sHgrN8/HY22PJAQMITB35r9frtwL60NcqbzaJbt2Uy/TdZBiVlzeserin/1GaqKrjlUjEKxJYjBlqxjQS0TFoTJRUfFbQrn6TKbhBewyuylzYDpdpnJXtqsxYsDvvmkUPtn+5ku4xdVnsvDTDx+EbFVyi8iJNXxiyQwsprT+UWdXOcu29W0mwaZxQ8PGQrhUefpJMhezGpgu71tE9uYNN3VzLAgkoyak6yDq24uK3jsYiO0+7cNiVE9yX6Q7Ia0xaKKuICR1SQ7CtmsEKpOhZKZo7vbZvHDQ4ZCeNS+bhE0xHp1YCK/KN8MGkkJ6Z4xh18cQbbq+EUJRlXfdbaTAYy0LDLRK/GLCph8G3XkgYSATeQXpXBjTHNJZo7ubpvFDw8ZCuEJxfSF81oYpkfRaR4k2VakKGG4Uqstq9VyT8EwXINskMclmeRx1dcf8LhUqCSAiVpwbuglBZaBXTJTRqxAFYar6kwOV1m/In9rikZRfsHzMOukGewMeemRQDKP/eLTp3vf+c7/jOP0/EXHk5QkzrXu4e7ug9Honj9e7Hb79+49iqI9tSSOVtR4GrMTA7cKZWfnFwXmn/3sbq+322jUHX7RAJZJSEAVpvaLCTPWulG8WNvb+/jSpY0rV16f6sw7eKkhKX51t3Z8fLSx8VWrrY00V7+4vd2/fbt9nr20QXB8+/Zh0V7aXrPZkmyV+94lio5v3Dio4F7apaXW9nZ0/Tqf0fcuL18+/+STryi6pydBu5EZ8tIjgWROx+h6fV30j+neMRBmCsNlIcF/Lq3wOmLEkWyRrgvLl1q4pY5bn8wEhuh0XzRhMHAr7YsyPlluNNYrtZdWdp1mo7HSaKwJo81oL22j0Skco8mB+DyjM8mvKGoeHUuvxjIrTOAX1btqmQSXX0xMtkr5RZa9a+da07kovxhnL1jG6jl/1X4xUO8Bcu+ZdzrNwy9ykCZVxq2k72QMJFvOoxlgKUhR8aIFwOC3iyMAnlogWPanJRmrM2cehOkQ0QRg5JEoAIy7IUFFBjzz0oaNa33habwhIMmSpJDzpNSLmCmRZRmQkDNnHIotYSkLA2y5Cui3AB0OBxBAgj7N4mg4YIgOhWg8SfrDKnAIIqqDsNkqSNOZRGxVCxsElmJzQzIyyJja91uwodHydmHeZNftPCM1OUzDvbRpTfS4Bp+WxLGbRtUH0XXiYNuLuol4+IXu09EKdfPwauzTMTtZ4oGEgCEM3tZMOzr3zl10p4FjvQ6ZII/Hudr8iDnJ1hcD8SmSdy9tAsfKDNyYIQyZ3Igaig+qoLoMhPyMLbUaiPZ0nkPJHO+3zQ1ih+f8HHtpRZLVDzm9lxYCy7VTEQs2neYHGcOqJhiYT+QxCmNoEphdR05JyI2Z9TBmQtLg2Xh5MQyrNUYPBv2Tk4M4bk+7vhifnp4ICf41nU6n324rtsqt6Qj8rdZho1G53xpqt4+XluK1tZms6QRBXdR6NKrSmXeHhxs///kXz3NuxIMHo/X1LxeeG/HgQbC29hsVPDfiwYP+0tKXK3huxL17ycuXmy9fXnZDsiW44NkPcNBqXV5bC80qWOaj5q8k0ZMK+RUlvHbt17/xjX/nl+VPzeYPb98u2EsbRWxt7cc3b379PIpmlILgaiH+C0lbW3e2t3e2t1+bkfyTk+6dOx+y6ozRcTw4517afv+scC9tt6u2hVZxL63A3+1WcS9tr3fa662MRpseSAgYwuBvzV7vRA1Tnr0Rc93XLfe31kT3UGeYTNoX1btqsiz39EXEVqm+qLFVrS+SwMhqTtcXy7wHONcx2q7VRH3RFYdqHahhEM/F9kWEpzp9UdNtYGQ1p+uLhXMOu5p20yCz+OEhQyE86V5aXW2onmwwm2JLIBkgp83gMgHZg13MZW7ZjQ0x2J+FMkmEHmIZtHZzFJa1echLm9nVdh5sHoFlJJDMghKqF1Dk/kXD/Zb1q+NVsLEIsH+RKIjYII9LMsnjevj8w4RLhUoCmKo+1EsKLAO7ZKaM2DAkgPkriDL+1tTCtQpPKqzLRCM1ab2w349arU4UxVPPXU5Oeq1W1z936XTOIBsalS5qjE5kWCaAHRycVXDu0mr16vXO8nLXAwkBSyYZow8PO3Fc8K4+qqbdNMgsfnjIUAhP2Grd2d39b3HcnXatO3r06NNLl37q/f3ooNvtP3r0ZHPzJ9XbpxM8evRgdfUfq3duRP3hw0+PjtZarUuz2acjmv5wdfVbsqxzjLY7HHrSkEk9QuxHDjIk8l395u3bO4ydqN8DtOuZ5RnDK6KKIWo2W7duXc722KGC6rIWRd21tfaNG4JtqAEwvMaLGgn3OeZYtjWLk1CZqQtehpzv37r1mpzG2XrJ6nCLyExOuy5kQRJzkn0ubWwc7+ysX7mijEZCSqzqsNJGa7Tb0Z07aph2erW5+sUoGm/fE59hmGRUBjNaGtKlGPr9pNdTv2WQ6B2QuVVSvzjqdg02Hf7y/Pv7BEnOKpAH4JxDD5d/amZAzwEw7BdzkNIvjgQwAU8O0UkGGFYfAksxw1qafhFl8jpmGcOquXGBuVjqF1Ng6ms6ByRDAjRmku1+MCElml01SvYrBwWh3nzS+NtxMbaqP8a0k88zKlFjNDPLcnCeDhyjUzb1KdlyHjCs5KWSeZ0FKvtiXgWtV38iaRoGA+0H+iI2HYJtiWXZCJtDcwDjLkhQAjSmcj1Ua+aX+niFolnHnFK6Z0y3FniSDIiUX4SOKoESdNJPKloHgE7FK9noTECOkVx0RvfFnILAa70kKggDVQHCRhkIzy8Wcmq3nXlJZ1kEDGHwt2Ym32k9Btp1HmO0toIe71AGMSCKeq40VEdBxok3PuGgCYddKDml61qYg1Q+VFnwiJEa3gKUHLz9iaRB7WDXmWEQK2PjxzhNsRoVMhoNCVUHqHa1Zs6PGoVMqNNkfpQgelIhv6KEyNuziecuhkyKnlgMOp+YeaiOW59IPqJD2DZUZupCqBCGxBKIqsOpujO36WzY9i0/MLuOdoasCHMbLQOhfS+VEJ1k9sygPUJsSvo7Bkky1D+xnoUUhtWsgCxlUKfsy+JxktgF1WUgGaLsU8eLOjwwGimTnJtPr3pkoyo2t2tNJxPImNkXwSCoq59AvaZAbsrhalShDMrNDMvwM1AR3Bd17QCw8ewF2DZyQEIScmNKeHmrQWNqdlVrXp13r54/73/nOy+mXl8cDqPd3TZjh971Rd7rDfb22qPRYQXXFz/4oD0cHsmzQKu1vri3d3LpUnzlCp/F+mIQhK1We3NzVCG/ePXq737rW38uv3dRfXGyuUu/P2g0vv/ee+/pZ4ucu5yddVZX33/33XcVW2XmLomcS37n5s1bzWajUnMXAWxj4yfb29vXr1+f0dzl5cuDBw/uy/XFoLxXm6FfTNIkng/9DZ5rqCXH6BElIVdBsgEe7paMRy7mPMrXs+XEGMIQJRsKEw2PGqMRMFumEVpYGQjPLzbnBMASBIyspC0fFSFbU9Xass+FJbxnbJH+paUKjdEcJHWjvBPmVrIZ4KfNRq4RuDC4RgHP6OCRbFfBBlxGJonQQyyJ1gPMX9ylzlNxsu1c2OYwRieoy5fsy4mZPAVtzkLJpBCynv5HsyR4qJcUWAZ2yYxfrAeYv4Io429NV4u4sNliPZUqFGJTFmP0IlUlqXf1uTxlq8Clo5KK0miEakumfy8tYit01y6eKYZpjwqVBDABr8xoWAZ2yUwZsaJRxB8C5q9g+QFaya/WGN3t9l+8aMVxXKtNs5d2MOgfHJy8eHHsPyO50zl7+TJn0zwcL7nlkhWPBqOZyUq6hglYnKKM91YK/J9/fthoVGgvrQTG9/eFuepBsOKBhIAhDJ7WFC7o4OCocC/tPFPYbt999Oivo6gbhmlPotAnifvciKdPP3306IPCvbRPn37+6NHPKrjW/fTpw0eP3q/euRH1J08+63RW+/0Z7qVdWvq3sqwzXoTN7cqQlx4JJLOghFevLr399hvn2Utbq7XffvsqYzFVUF0GcdxbWupKtiijc90/QN+CknGfM+UjOt0XTRgM3NKXtTg+unVru3p7aZurq52dnfXLly/P6CzQ01O2u5u/8mJVZ5zm+n603Esbye9dJOQJ/WK/H/d6I/kSvu8s0E4HslXKLzIBrNuNm03DI1bAL8YClbCbOg50Bn4x6HRG2V5ap0sjg8LzRIokv6LMby8tYMt5gPkYbPKs/dK6K1tlRM2ptfxz3UvL5rWXtqAzzSed/7fME5lJHAU1GynKn7c/XXddsDEM6lJHS0mRZFu7SwVZL1dFXETV3UtWthCky5hk8YtJ8Fza8bXuNMht214ccuo/R8G0vZUWzemXTPK4BhN/3OxRAWFDvaTAMrBLZvxis/ZIEnCSr6eOLkXe1sxb3SsZxzZoiUPzeJyrzU/Ge2qFKZCrjIEskGSjZwIGAr1/O0+KQRWUEpLM4cOC6jIAbOKTZdLSKAcF9XxeZ4GqsElXn1fmLFC1+ACABQ5ISEJuTBUd6lbjxFmgSjiH3ctOdodDK1Z5qxQFndTSFYOUUITGw2FXrulM+X50FPWFBP9ZoINBL2Or3FmgAthg0FVfh1Zp7iJmlL3BoC6MNpvfd4lErbW6KkSM4YsX8fe+147j3tTv6u/uDsKw699L2+0O7t0bBEFHslWqLwYffTQYjXrVe1c/3tsbbG31P/20M9XvXhX3xVYr2twclewoc0jhtWu/8957/yVx79P0pygaLS19/9133/Gz9XqD9fX333nn1jQ6ZpyC4P/dunVLLfVXKm1u/nxnZ/vataszkn90dLy3d1cFaa5ob67xovoVoKnPAhUDXBwP5c/1+M7TQWwodCAlwwrAYMWuamG4gyBpinQ/gQAm4NVqFfoOEAAbqB2vrrIIGMLgb01Ra62OFDvnFPL0/AqusdoZ8lJRZMISUJGUiRFsgE4URLdcLeF5Ij2SWTp3SfFDJC5UpEwSoYdYBq0eW0lg/uIudRTsCgSJIIUsW0mebk1HL4tkURFdMDGXkSuypqPBJNaa1MWu6UBjJqXeqKczZVrTP49GdNKPFrrVQn5F0e/qT+MUGXhwXZzkA+33dnYRFyqPkDLg9dBW0imWgV0y4xfrAeav4CROkWg7PzYXkumE2JRQVjuRL0d79uk440UZzYyUBM+eMcRWnXhR/Xx9hq1C8aILGFnN6eJF+O6VXzKsNWoaZBY/PGQohCeUv6wU1OuNTCVDGfJSU5rN5Xp9SUio1QJPwWZzpV5f1myQxyWZ5HHV1/9kulSoJPCLWnDilBVfKY/MMpkyYhuN5UZjRU5ynWX9ivytqYSzSQLu2frFdvvgyZO7UTSc9v3o4dOn95482QLri1BHGil2Op2nT3/55Mm6YtM8nHrtN5nr+9GBwP/xxyvNZl3rJVFBGFCmZrNNh2D7xUJOBezJkzv9/osouirdBl0WAUMYvK3JDw8Po6jgNzXm6hd7vQfPn/+vOD6beq376Ojz58/vFK51Hx09l2xV2zMWHB198uLFz6u31t04PHycJCtBsDWbcyPqR0cvw/CPsyCt7PzDzpCXHgkks6CE29ubb731W4y1p95LK5zrW299tXAvbb3elGyV20s7GCQ3b/5GBffSClct99Jemdle2me7u3VWwqVpntn6xSiKR6NeFPWm+z6634+63aGQUPTblL2MrXLfRwtg3W6v2ayaX0zEYNLpjL+fnM330bEUnmR3Hf1ojmm8vih/YindCTsacRU56IxMIqRgKKJQDLKs2j6e6IKaR1AkG5dbTpSKQBJTsSovC3IkWcnRqDJpmjP/1MyAngOQxXM6BCkaQOMXirRe/YkEKjkKbVaF3Cy26TQ/yBhW1QWhuSSwJEitxiSwwAHJkACNKTN5q2VlU6NJutKgktOrzdUvZkTO8H4nYzRR8ydYPvNY2DTUnjGMM5OWmHluFsn93+z2jCmKdrvoMxPITTmczXzPGLQSyyavzjF6qj1jcErn7EZznUcnIDFnZEoEphkJCSBD2pwh+0xvMmbkoWQt30SlOeEnVGoBNcdoUwXLcGMLkAKhdrdBCLQgY1jVAp9rh1Z1QyI1EpWAxtR3GUssyc5KzcMvZh6R257felxsZdz6cxX083AvxQXMdUlCdd1CwPx6Xeps4SQYP06/0fym8MDzGI0zcLIZVZ08UU8a8XiXkUAyC4oYo0WXHNVqo8z9TjZGi4JBMFISqILp8GGyVWWMVpcCmKz+qDpjtLw1AsBGDkjnGaOV8CSPGak0V7/4ox89//M//z+DQS9b7STagGxgxRDHo6dPX/7d3z0fjUYONInc1z188eLwb//2eRzHIEI1+geSbOYhAGhWuwgJlabL6Wrw2WfP/+ZvPpdfCKFebtvBn0hOF04X5nRMr9XCZ89erqw0NzbWRqOYqnKhdg8lqdXqR0eHf/Inv5OMd/Il4OE0kt3h4HIB5PH4RZsfMStK2O+H7fZ6pxPq3Yf2mg7s14hB9K12++zoaA31RQhdSB4MBicnXcEm+G1A6IlBtUUPouvRtC2C8CNTsqwvttsnS0urtVqNZEvohR7nw40opDQSM8IfhuHJydlwuBzHa/IB9n1RXh6P1lKv1/f3O7LRfN90z/Vd/VqNNRpM9JDsV6t4NsnK4am1NERXGWGlep01mxy5RV1EZIRkPj4+ijebY37FoG7pvC6l6FoF5IR6IQWh0hgQfi0K0oMgxS/sQLJBSKgsaj6SQkojMZv4kzAcAxNNo4xGYijU7qKIjKo17OKE0Dn7RRm95qtlsgzOuOjZjDjfBYhSNrPmak1VaCGF23nyridjo/VQrFJj/LYFkBYPMA/FJa0IP8+AcWU0Fwa/dg9FNUrV5tGpJnIItmWRDBAuKgLLQoaKjNEuPBc+RqNavPIxmoFG93Qjsok97V5eiE3B64sMmMM1aYcZ+GDZdtR0m8GfJ+/6Ebq0k3hcCEk2Vx3LaHRJK8SP2sVv5/J4kEaPR0T88/CLHJ+nM5lfVFfy6yZDAXQJSrhi03WviF/UwCS2CvlF6qCfV+kXVa3LuEZkTDtDXnokkMzjvhjHSbc7En/6F3dtq8l+lpYHv+Oi5tGjfn9c3DuPZoPBSB7nNRL80rLpLZ3XilSf0BiShOle8kr6IvyNJ4VN4a/VDDxaoOJHwNir6IvQkszqi2E4tpjgEhlhNC3E9RtVtnabE2qMopE6Zwx6X0+y/brtyEtKIJkFJVxdja9d6w6HPc+ajiqbXSZqjSrri3EQDK5f76n3yZGyzILjNZ0wHLONRjHPtpOopzMxdgAlMmA3Hl/GXmVfZGDVTWEbjQZvvNFTazomNlhfA5hlHyeFufsitCQj/GIoDLu6Gmxs1KXRtJAcv187xZlrDMN4dTUKw4RnyZZpmW7GY/Tv/d7OX/zFv5l6/6J4wL7//Qe3bxfsXxR9/f33P7l5s4r7F7/3vTu3bn1JTuNsvWR1XB3CZTobtn0LAROfzQ8/fLCzs769PauzQNvt57u7yypQqYRfFGP0aHwYqBgLiHAQliX7shjg+n35Cr5vX/f4vE3AxtRzwiqxf1FUIRHwmk3jlXjLL+ZyFNpk9ufpCNvKA1RHsznDZByZaHUupzZXv6jqwHluUztDXsKCSAIq4mHTDGRBdMtVWU/Q7JFsVwHhKamOROghlkTrAeYv7lJHVrxSKcwQ46e8TEdkTM88uItTBXz6yubxSLZ5puiOHhXZ48pLdsQysEtm/GKl09VhHPdA8ivytmYumYo3NCe3L88zgyb5FSVMEj2Sjq/VfmCYUQldmpQkQ5gW1HXTO41BfDz+1DwZg+LnULK9iTojak6thUOl5i2WQWKaGVLUyKNggb3Q3KxvDoyZW82Zsa8bmw7BtsSmktEud2DSdPRUe+NJSFACNGa2O91uTX1pzOdc/Wmu30ez1D3oyICMTRPNBtKYIftLYEHAodjgwgERwsJ4DtATiAoASNCnWRwF1AzREUgFyqwC/MQCITZbhXc9G4klMAPJ2lw2MLKyuX2Q6ZB2k7lwvjHXpH73KhSJc/WLVGk4XHL/YhiyWq0m3/nnVEF1GYx/9SplU0QlLTHzHEqe1/5Fgasmqx9WbP9iKHGF2XsgJCQkITdm5u2YCUmDZ3InUEiOuWal5jhG9/v94+ODOG5P/X50u30iJBS+B9huH0u2yr0HKPAfHR1U7/3o5slJq9kcrqzwWbwHKN+PPpQ7I6viHsNWa/Ojj/5VHA+zvpi3H+x76FJThsPhw4dsc/M3/edGdLu9hw/r6+tfqeC5EQ8fDlZWfrNer9y5Effvs4ODrcPDy0m+CE9X05aPamG3pjyk4MraWkM9xq7uSC4inmdlkeRXlPDq1V97551v+2X5U6Pxj7dvv+3niSK2tvbjmze/fh5FM0qc7xTiv5C0uXlne3tne/u1Gclvt7t37nzIqjNGx/FAOOqpz6Xtj9Op/EEr37m03e4ZZIMrqC7JcIEUjNHEI+iio+I2RbkfAazb7TSblTuXttc77fVWRqNNDyQEDGHwt2a3e6JmuB7J80yhfIu+JrqH+GST90VZtibLck9fRGyV6osaW9X6IgmMrOZ0fVFI5iB5JMNao6ZBZvHDQ4ZCeEKkctK+yEC7IlG2dWzmC++Ldt0r0hddwMhqTtcXbQAuyWyefVEnzVRyjLerUVgQEV2SSR5Xhf1DTCF4aCxb+0SwS2b8Yj3A/BVEGX9rerogic2FxG/8MvyKovZ1pyfGZvg4zKiELgElycpCCbmWJJ2mjSAb4OEuyRkPtJrL/3m2mdhGh5QUEkDF4SeSRUFiDCxFIdNZsP1iIacTGFlJWz4q4mjNpLA7ztUvcl6TJ5829F07Q14qCufLnDfV74SRDBnbEsmmGciC6Jarsp7H0iMZVKEpa4HxlFRHIvQQS6LNgC1lR8cWlLV5yEtT/nJ5jwsvZ+UXnz27+/d//9/FbFqdXjxpvDgcRru7D5PkF949Y2JK2Nvb+zSOP8zWF9PnsiheTO+AeIixV7zWHXzwwS8Hg5/V6661bgiMMabtw6AK0nSaH2Q88SLnHAKr7e09unRp/cqV16w9YzhR8aI2Pt2aQn6r1drc/F0A4IJTuLMTv/deMvXvAfb7Ub0+eO+9vv97l7Oz/srK4N13BxX83oWxwc2bFTx/cWl9fbC93b9+fTCb8xcbL1+2HzzQSC4+qTFaDARD9X00y79pRVazXeuYgfMoG+Niu/GUHdRPfGVskY6nWbYbBfVF3d66L5oAiL5oNg9DfRHQoRB1WcuAhSz/GpdDO5hRWoLQQhWk6Uwi0Rc1ZmWujLmZjdHLjEUOSIYEZEz1JTXSDoxWLzNGzzOp39RQ0bGx7FnSL2a/+6A+XX4RsVXIL0rhGluF/KKylc7MwC8q+QwAINJc5y4SnLrheuYYamDTlFzKJSVotvypBYmDoQH7RbO3cRMASaf7ogmDgVv5ZYbf1uiqDreIzOS060IWJDHn3cJsMBJSYpcqbTQ1fanE6KxSqAeFaSWorpZ43bx64tVwMK2eGaRsTEzOUf2ZJOi8Z6eEpZ67Ko2SfgfNQM3tDHkJCuo/zaAlpGxaQ0IdSqsX1SxdCRxeLfmIDuEZAFy1SIxf20vIT0syVgdVkKZDRNOMRl7fySyWE92QjOpAeGj8tWDnDGbb0WmK7uGSQDILitpLWxdJvZM66V7aep3LLZl1uSRkF1SXQb0eZ2zaO+poj5kDEJvzXloBTFS/entp6xJYKCcZ3AEJSciNmc11mAlJg2fj3/uq16s1d+l2ey9fPo+i9rRrOvHh4ZGQULSXtp+xVW5NRwB79uxFs+naGwGBMTa/NZ3mwcGhMHAYjmazplM/ONhXx2HKu3T/QI1O9t3CrlzIryhhu/36/fv/Oo4jtZfWricyHKIMh8MnT5bv3/8d01K5FsXW6/WePFm/f/+3gVEMBluy2asSwExU1kFHxTFFNdWTJ+GlS1+VIwPq5eTsxJbpmqbYsP1ic04JLPjss9XT061O57IXEgKGMDhbU8hvtVpLS83M6dKS5zqPvnr1V2/e/AOXlDIpDC/fvFmwF1U8fsvLP75xo4p7aZNk89atKu6lXV9/Y3t758qVWe2lPT3t7u5+CLuXncig8DyRIsmvKGEUnXcvba9XvJe20zmDbPBpc0mGDxMYo4lqe0xpT0jNMTrdslrNvbTdrgA2w720nc6JOpHL89uUyG5khrz0SCCZuQzYjb20GhbC53qnVe7HDOR+T6YlaB71Lq25LXTMBt+6dUmGL9XqPBSOtJD1h8UpSqLxK1QaD9k8NiRGvfYLMxCeX6xZkURBUtg8kBAwhMHfmqq9/GmuYzQqVr7XI86SBe3g1yWZ5HFV2P9QesC7KkIKLAO7ZKak2EJIfkWFjVJesof/lc1dEpAYeA5KjvGJmVwFEyuVkWzzlAxrCu96UJG1sOW4ZJbM+MV6gPkriDL+1iwjeZ4prNXGGxfkLHKcJvWLjUZdroHxbBpOF2w0QshWKb8ogIlacM6r5hcFMGW0GflF0SgwPiYluzqxh6ekEJsSnp31nj8/iuPY+66+c4wfDAb7+y0hAZ2yquucpGFyB7JpHjIkT+Y3dxmfMiOAPXnystFoJBWau4yBvXjRGo1Ed1nyQELAktJzFyH/4OBQ/XJMVeYuZ2e//OSTv47jrnd9Ea6rMUAc76V99uyzTz75OTiXFi9lsfH64uDZs88/+eQD+RPxLJPmWmW01/nQwp5Nt5f0UELLgfky3rNnDz/99H3hgSi9dHUsIjM57bqQBUnMqeMRY9XTp5/1equDwaXsnFVbPpKAjOkzmmj6Vuug2fwDq/iFpXBnZ/ntt68zdjLdubSMRUFw9vbbV/3n0sZxr9nsSbbKnUsbx61bt3aybSKV6Ivyc2l1tbOzs3758qzOpT095bu7taQ6Y3QUyWNpo1guL7rG6MTzHWCvF8uFQ893gEmnA9lYlb4DZAJYtxs3m8boDKoPgTE2v+8AI4FK2E1YTA4mr/w7wEAKT7j7PHqY5jFGc/ybGhq9UYDqiwyUHUsD5+nAvshMFRz0RWg+Bps8a780BFeNlRE1Z24UqNS8xTJIhhUURfVF66cr8k8kTcOQebsvYtMh2JZYlvWkHBoABn9Tg7sgQQnQmKrvUa2ZX6rmYFTPuJAEz19MSXaGvDQ5x5ZyMUCBiA0xUJJ9APx0v+QMj9HP7M9CmSRCD7EMWmilMpBI+a5mBZdqXMqXjbzCE1eGvPRIIJkFJdSSNWmiMRpUA44XeIzOjJuwbNJQhTFaq9MjY0XGaLPJEjek84zRqlEMc9kJLRfYSxxAe4EQe8EBMnD1wlEy/gXh9NBc3Wyw/exLTclcXV4xqqB++KBrTCzJCZKs6fYzCflNZmbeyjHAW9pnAFQwLkcCE1NOzmEbxMrY+DFOU2zKpxpFw3NBMiVA1a7WNKpPmuuiUhiOd9PWG436dPPo5WXxJ0TU5QKVXVBdBisrccYGA53EzCOHgf3fjObRAtjycr168+i6ALayMjaavEVCSqzqsNJGq0vhXCerOkaax9xlf7/zwQefxnEne1c/H9cgP7rUlMEg3t3dX15el+uLKR0oSEeNbndw585+s7mu1hc1T8ZASFY8UCYsaFbDGUiRkCBFRPACf6221GjUtF4SFYRhSsAmghkIzy/WrMh4ffHOnRdPnpzt7PS10VzNbctHtbBbMwjCo6MDMVuvULzYaPzG1tZ/kGs60+wZGwz6q6s/2dq6KdcFnHvGGo3O2tqHW1tvKzYYhbgkwyADxItEhT3LY3Z0aK7pjNcyVld/sLX1VqNRtT1jfH39o42Ny1tbVxP8s3A42fJRLcjWjOPDTudE0p1+ca6/Y7Cxsf7FL153SSmRkv39p4UShsPh8fHL8ymaVXry5NqXv/xrnvj9otLJydHOzvb29s6M5F+6tHbnzl3mHV7Jgfg8ozPJryhhHMdqsXvqvbSDwTD7cTWnX+z1epCtSn4xEMC63V4F99IOBoNer69+y3QWflEIhzO1C0/qN9iM6LV8cKpLcbnn09XfPWzkc+bC4GqJ8o+1LdBG6EFFyiQReohl0PqB+Yu71NmwVYJPvp3IoPA8kSLJryi4L07qF3XF/H5Ra6mgX0RIquMXSWBkNafzizrj2aeDqmk3DTKLHx7SjvCocXmUnSmj6CjDqEtNUbYbwYKAAx4BmsBLi8EjmUEtVFVpOipOUVBl7U8sz5YJ2GzTGbD9Ys2K5GxFkBAwskbMKgvllxqmNYOdIS89EkhmQVE/RxXU6w1F0v0V9XK70yuKCLPkRtRALQm5CiI2yOOSTPK4nj1/9OxSoZIAJuDpQ0pt7WQpj8wymTJiBbBGo4GAkcmlyN+aok04SE7paZGJQziXBJJ57Bfb7bPHj5+dY+4yePLkhZBQ9B5gB7JVaowWwB4+fCwapmpj9OPHz3u9eDhMZjRGHx4einZnJVzafFLY6+3t7/8PudY95W+wHR8/3t8vOJe22+0fH3++v/9R9faMBcfHH798+bPq/QZb4+joU85Xw/DSbPaMjffS1mp/CIx2wSnc3l752td+9Tx7aZOk+7WvXc/2e6KC6nK8lzYMB5JtmNE5MAG31HHrkzHn11nchG1DZaYueBn2+yc3bnyhet8BLjUaPbmX9oo0GgkpsarDShutcXoa7u7i148uMKm9tEM5RqdP5ER+sd8fb/kUEorO09FsVTtPJxHAut2o2WQV84tDgUrYTRhtNufpcCk80YnsH+QE5TyzFpJfUdLXzNR35LI+afV4uXPG1GZPFfsiCZBN3AFsLJOWWhA5DD6vc8ZGI8Y5rEKul1/oOWPyNAfDtg5ISEJuTNXzdKtx4pwx3RDYXGaluH1JEj2pkF9RwqwC2oVwlFHMCbGDIWdQHVEXBDoUW942ig3G/ZlkjiQnSV7tLK8dqvGpmQE9B8AYLMUgSNAYGqrxiQSCqYveYQ79Ijad5gcZw6q6IMQgMwk3dlS4IBkSoDGTfHc6hJQaTd3VHUv7ETuhKZo9rdQ8nh5p85NjbMl39Qk3rPlNAaRD5iaj7ovpQKnzSDLg0ag0J/yESonxAo7RpgqEP2FYOwKW63UZhEQLMoZVLfCGVaHRHJBIjUQloDGxkhKD7HxSKJevanKVcZqzQGs1dSRN+g6+VVBdBuJ2xobG5Ysco2UaA1PVr84YLW/VVELATEjnGaOV8Cp9BxhFg7Ozkzhue/cv2m41ZRgMROB/KiToF5/NAVGFyWLu0svYIlX9zChact5ISb5/UdwasfzdKzUY4b5ojt1GX1SNlJVKhWQg1WVNADs9PXHvX4TAdEMK2AFUQZpO84OMYVWWzjwySXmXEMzNszNhMXZ21pBGIyEZEsz1xED+UgE3IekxSkSidVFr8Ju97MJTeHAQ/OQnSRzXp91Ly/f2wpWVmgi3wXuAadIzu263LtiWlmryZQYj2HJJ1v2P5bY2hCMtZEI9D1ESuaQsgIkk1xfJvmgAs2WCeNHuiwY8v1jIqYE9eyb+alm8SJRFwBAGb2vWWq3ljQ3ltHkl4sVr1958993/7JJSmISWpaUfvPPOTT/bcBivr79fzSM3g+AHt2/frIJjQGlr6xfb2zs7O5dnJP/4+PTu3V3/GK0TFQ1PP1KTw3QYx9E5zwIdDLqFZ4H2emeQDT5tLsnwYdJ5ssIeU8LiNiVJtwl2e70qngXa73f7/Y58V38m3wEK4erkmaqcp8PHK39pYpP3RVmOq7KevojYKtUXFTCFqlJ9MXtXP/BAQsAm6ot6K2lFxoRxkJQYP3OS3kCNa7c14Ofgky4IVPCEel3fIRnzuMYB//jgUgGRIwuQAsvALpkpEptDspvGIwFl/K2ZCU+Y+we45zqPZipwzVY+J/WLOvNPdy8tcirV8YvabjPyi8xsFI9kWGvUNMgsfnhIO8Iz7oujLCkqymhudCa2okg1aUYX1DyaniTq/wiUMhgckhmUCQvC5KKj4jYlU51ojeiTtCmSqdls0yHYfrGQMzVWCUgIGMLgb03ZKAUujQwKzxMpkvyKEspV6KDRaPjFudLy8nKj0dTh5jnZLiQJYALeRaMg0tJSc2lpaXYWW15eUstwhS6NzccvHh+fPHz4SL4fPeW5tJ988tnVq4+K9tJ2Bdv29tUKjtEC2Guv7VXsXNoxsIcPPzk+Pjs97cxojD48PBoMhsg+pAHR5az8YhQ96HT+Nzg3gkQ/Ruvoi3G//1mnc8+/Z6zb7fd6TzudvertGav1+w87nd0oqtpvsDWEYXu91U7n0iz2jAVBvdt9ydgfqiircLDWDHaGvPRIIJkFJbx8eeXNN794nr20/X7vzTevF55LK3qhZKvcubTtdvutt96o3l7aJuf9nZ2NWZ5LG+7uppsG/R6XzWeMlntpB1E0DMMR5CvpF/v9qNeLSuylHWZsVfOLIwGs2x3Kpe5K+cVA7qUdzmwvLVN7aQGAC05qrTs/l1Z9XwwzKqFLTVGH0qqzU3VB3XjilmQb/ylFki3nyRgUP4eSFY868VZNATOi5tRaOFRq3mIZJKaZIUXjV0LQJ5KmYci8oYI0HYJtiU0l60pllknF6nZR3/WTkKAEaExZhGxNfcn0BmpPmqtfTMAePlO7Mb6z9CnHKvRzDPeYAI70pgJjsuUqoN8CdPjIQgAJ+jSLoyCGIToUAv1QFjYx8xMLhNhsFaTpTCK2qoVNAVNG0xZ2QTIyyJja91uwodHUaDBBtDfDeNFfvkzSJih8xsqxzS8lYENQpZIEBh+5WWlRg7g96AGeOfpFub4fyh+9n2YvbRgyuSUzFB9UQXUZCPkZmyIyEO3pPIeS57aXViRZ/bBie2lDldSeAQckJCE3pooOdatRe2mVcK7NSqa5run0+/1W60DupZ3y/eiTkxMhoWju0js5OZZsVZu71AT+w8OD6r0f3Wy1WvX6cHmZz2hN5+joUG0CAhEaTuRAfJ7RmeRXlLDVauzursotY9P1xeGjR4eXLm3617q73f7HH7c3NzdVl9UsRX0xfdBBXySq7aIzs+fZFDVdffRobXV1q9Gol+iLeqxJQBXw0AMzEF5RX0Rr3eHDh+tHRxut1qba2TVhX4SX5Dy61mqNVlfVQl4lwqbw6tXfun37P51HRLP5w1u3bvh5ooitrf3oxo3fP4+iGSXOi/FfSNrYuLOzs3Plymszkt9ud+7c+Yhnyc+sGewMeemRQDKP48U4Hp5zL22v1yncS9vtnkE25AlIyTDgnalfFMC63Srupe31TrvdldFo0wMJAUMY/K3Z7bbtvSMXmNSesUD9SUo+EJg1tw2RyMdJvU0egMUq1PAkW4IYbMk6FtQyYUGYXHRU3Kbw9H1tnlU/AXjIhseQmPGI26YzYPvFmpxMo7KAkcmWn1CXOb+Sz8wnn5A7z3iRg6RulHfCsCz51PJs2uVi0wxkQXTL1RLuFvJJZlkzwOrbn4UySYQeYhm0fmD+4i51Nmx/27mwle8eLgkkM8/OAk2Y1eVL9mX9qediricJpZKSEU/Jx7fwLkRF4icFloFdMuMX6wHmryDKFLYm2SIubLZYT6UKhdgUdW7EyF6R0RnAjaM6OcNVWz7Vn62JazalSLEBHu6WrHhgcOYaSpxDDJqoIopqAoA/AYAxKgjDlAln2bYNITy/2JwzAxbbwMhK2vJREbI1hXyH0YCxKOd3Ho9I8iuKmLHUg6DWaNQKYZFpeXllaWlVSBB/HraVlY0ybBeSBDBRi4tGQaSlpbXl5fXZWUw0SgB++Irk0c8JN6dEjBkRBfP2SJsfMStKeHj4+O7d/ytm0961bmf5wWB4//4vLl3qFs2ju/fu3dvc7EgHXK159P37P1tdPXGvL9I2RY1Emg7B9ouFnBJYbW/vly9fXrp6ddtaX8TJlp8UzaNFxeW5tFvIPheYRLz4eRB8dzQ6Vc+fA/0YLdljgiDi/EkQvGTMdy4t5/0geBYE+4xV7lxazh8FwdMgqNr3Lg3OPwsCMZhszeZcWjEevuT828BoF5zC117b+MpXvsxYe+q9tO02lxIK9tL2+6Fkq9xe2oOD6M03v1TBvbSDAd/ZWb9y5cqM9tK22+t37qQvglp1uYAURlE8GvWjqD/dd4ByL+1ASCj6PrqfsVXu+2gBrNvtN5txxfwik8DGRpvNXtqRqHXhXtq5xos8O/9Un8yk7WhGGHZfZGZZeLYT7Is2W84DzMdgk2ftl87blEEyoubUWjhUat5iGSSmmTVF9sUcm9arP5E0DUPm7b6ITYdgW2JZ1pNyaA5g3AUJSuDGF9DcvDSMrBuFl17yhJck0ZMK+RXlFexfXKTZpPnMKCoRKao0n3NpE8SmlTBm5JFkwKNRaU74CZUSxoVjtKnCQoa1I2C5XpdBSLQgY1jVAg+tmv23mgZAIjUSlYDGNJuOQRV2olqTJnpSIb+ihPW6GKbrIqm5y6R7aRuNcWEhQb7SahdUl0GjEWds6dAMoj2d51Dy3PbSCmDyN7mqtpe2rpIwmixPQkIScmOq6FC3GrWXdlxrtQxXlbnLixf7+/vPo6g99dzl2bPn+/uX/HOXs7Nexla5uYsA9vnnq81m1dZ0mgKYfG89ns3cpf7y5fNer5/dpfvHXOPFP/uz//rw4RqsFdUXXXOfceWvXPn9hw/rkG5rHY1Gr79+U7CBfpYyOCTPY61b5a9c+d3Hj0PUC21UqBSsAjIRzEB4frGIk42/0/rtToc/fFjzQELAEAZXayrmOI6/9KWvynwlDpYJ/+iP/viiMSzSxSdXL9cnQqnRXH27poj6oB906RIC+RGzooTD4VAttWTD2QR+UdWCgXGKOf2i2gRl+DxWDb8IFkQq5BdV1KFHz1fuF3XF4VeyLgO6VNgm9QixqwkZEvWbvYzqs6jzkn2ZUU8DPFsN3B3ZD5ZicD0lUL7Ok4e+ueiouE1x6SVRoVLIYTDKdAi2XyzJ6TeUDQxhcLUmLOjv5XP1i+oC9lOdLzN198/nC8WSawR+5okweCR77rpQkaVK1rFQrJ+zsKzNQ14WliqJzS5SXgLJPPaL9sxI58tMl/xzqEKx5LzMzzwRBo9kz10XKrJUyToWivVzFpa1ecjLwlIlsdlFyksgmbna180WfpHCs/CLHmx2kVfgF2E8ziafu3gicY9YFMZe7NzF1luRuUuhoWxgtp09cxebzSUZ1ho1jcuYLruRYBK9N4I5/OdijC4jczFG++WTDPQYvfCLtt6FXySxsfn4RZ3K9/qJvFThE28zl3HVhWD8Kjx6CweBMr680Jd4xJYxVKHq8ztFshucxyOS/Iqy2DO2SFVJoWs2VDhLKjnNJMUWTqlcPBMpLVTh0euvhV9mmUyh2DKGKlRd0m5lJHv4/cYvw68oqV9cxItQ7yJeJLExqmlcxnTZjQSTxotIJcyX6f7lHRIp1vVcepgnwuD3iH6XXFJdyToWivVzFpa1eV6VaySx2UUm8o6k5Rfx4iJVJS3WF4m7/tmlxyx+2OUnra5GKWPtVz6VJrHZRSaaTZOWX/jFRapKWsyjab2FwXGZGLcwxvKILWOoQtXnDxbJbnCeSJHkV5TFGE3cXYzRhdjsIq9gjF74RVLvwi+SBRd+sUDXwi+SPP9U/aK+lyzWuhdr3Q5sjGoalzFddiPBJIu1bn94UFJdyToWivVzFpa1eV7VME1is4tMNFKTll+M0cTdxRhdiM0u8grGaJVb+EUbz8IverDZRV6BX3SN5ckiXlzEi3OOFxdjtH13MUYXYrOLvIIx2uVpCz3wRCNm4ehjM5cJGwrB+FV49BYGJGXiisJxzSO2jKEKVZ9/gCa7wXlGZ5JfURZ+kbi78IuF2OwiC79YAMavwqN34RfJgrP1i34pi7RIc0uLvrhIVUmLeJG4u4gXC7HZRRbxYgEYvwqP3kW8SBZcxIuL9C8iLfriIlUlLfriIlUlLd7VJ/SSqFApWAWyjjZsv1iS028oG5htZ7I1ySp7JMNa89l9H41UwnyZELX8pIEU64qdPcwTYfDPWvzTppLqStaxUKyfs7CszfOqpi8kNrvIRDMY0vKLMXqRqpIWfXGRqpIW5y/SegsX9suszxeuD3vEljFUoerzL3ST3eA8q9wkv6Is5i6E3sXchcTGqKZxGdNlNxJMOndx8S364qIv2tWcbV90+c+SftVO/mGozNDj4ZlIaaEKj15/Lfwyy2QKxZYxVKHqknYrI9nD7zd+GX5FWXwfTev118Ivs0ymUGwZQxWqLmm3MpI9/H7jl+FXlIVfpPUu/CJZcB5+cda/TWn/ZqJmWPw25cX+NmUZyWyev025SIt04WnxHSBx1x9Feczih10+OHMFi2Ws/cpDRhKbXWSiqJG0/CJepPUu4kWy4CJeXMSL/yLixf8PvFbb85YMNfoAAAAASUVORK5CYIJQSwMEFAAICAgAEVRBRQAAAAAAAAAAAAAAAAwAAABzZXR0aW5ncy54bWztWt9zojoUfr9/RYfXO12B1u7qVHfwt221ioDoy06AqLkNCUNC0f71G7T2tq7sWoWdnZ36IpDkOx8n55ycc4brr0sfnz3CkCFKKpLySZbOIHGph8i8IplG6/yL9LX6zzWdzZALyx51Ix8Sfs4g52IKOxPLCStvhitSFJIyBQyxMgE+ZGXulmkAyXZZ+fXs8lrY5skSI/JQkRacB+VCIY7jT/HFJxrOC0qpVCqsR7dTXUpmaH6oqM3s16IopS+CkgUbMmthqixfFjb30tkzyVeqUaXqVg/b169ePwvY/J0jDv1EN2fPjxNqFUmILD8iGL9oTdq37u0aCzHkYKiFEBg0kLaDfBWIQUS4VJWvCz+CvAv4Ds54Pshj5PHFPugv6uXnk9E7EM0Xe5mrn4vKxRdZPVTEuQ+Cc0Q8uITerjgY79+n9RphYeHqENIw7no7TBkPhRFI1cQklHcxTUB3eBpAKOVXRN8u0YoH2F89ChkNB5QhLszfztBM3iJPMkTu0BA9UcIBHgUY8R714K7qFzQ8wcBhyJGbF/oO+62CsnTQ1/xzwNdcjh7hGl0HZJ6inoOd8y34lm/GQWsLq6eFlBNxsw3eW9Qa5Zz6GQJPKfUNgZKpRSegFsDRLuqaqCIfeRAMwBwmcfWn6FdHUh4taNwO0W7IdijFEBCpysMI7kfe8/DnJ0VaeO42lGzi81Vu8Vm5+AjQHwH6I0B/BOi/J0CnDa9z7kNda52Np6T7WvHksOOGFGMHhKnllaoe6bwf5vW/eSUCaqLMfBiEMKnR0kxtBjBLsbVDxExhSNf82ftt+RD8PuV5QR/ngL9CTlDrFNNwBxrTxH0U9epCVYtHJjVv9jUHrXQAE9Qjn+g07kDgwTAfIaMFhFxEmRzQu+w+4hgROFr5DsVsBHeP20yEjAgIDKoDxuHuRmfhWRvgLntuF+UmQYdM7Hdq7q3I8pERaBd+fwJ+Ivwocjz0iFgq/YzA95M/1nQ28NoSsdGKuIuQEvQEf18m8Nwn3D+BQX54M3jzIApBssHv6QrfUeDpIrxQgld5HEvgEVqbhvc9qWPK8vCfLms89+hHCxCm799JIm5hSDSGABlExOUR2FNIZSFICwK8MhkMG4CD7KNlXSgIuMLm69QPQsiSjck8SxuI9DTxWsij3UrIAQxeXdYQAeFKqi7nnX8LsjU05dK9rXjDO2MY9/6zZqZqrcDYetL+sN9QEVyfgpbZ6g8MXLLNuiz3Gl3FVvrY9TF245epY03racXt/Vzraq2pKa4enKGmjfwS0tsteTLSlnVSE+9alKd2t6RbNcOQizNL0Xi/oa36VsmY2jfB1O7dOhfiX8yb2HrgqJcls11aeZ2bBbCHtxO1FCf6GhjN5Jo5AntqKP5kvHyaDgM+sW+IkPEwGQeKe6HzBGdgaKxXj+O7hrZZc3HzMLVrMmjIq74WxK66xJ5vMTHv1m3r/rRtqWDcxy8y1vOnwUQ1Sz0tGJpNveGoyXssmoLjov6AI7djyaa6fPQaQWNi95+mti54NTWz3SJTqx9A37wy2pbsta2V1tQVt73EsBE0PbvGBM69o+iKM75hU6Gz5rzWMGRlOLT0md6yhkbTmtiyMtCb5kCstczmsjVulXpCfx3d1Dv6sFI5yXz74ial8GoORvf9b+PB+aWsFr+NYIggO06WGXiAw1YoaiXoB1hcZ+/zWsRpHWA3yge+6TvQa4lyMjWD/KOTr9+UP+aUH/2WFFvDWNQ6iVfcUKcOiAtx9kJyToLzrXTuEHnYuHJ6j/jIDnd2Seovc7W/oaLNu+TPp1GRa5mTc/2Xc2folKZWallV+OGrm0La90jV71BLBwjcwV3CYAUAANEkAABQSwMEFAAICAgAEVRBRQAAAAAAAAAAAAAAAAsAAABjb250ZW50LnhtbO1dbY/buBH+3l9hOEBx/SDLku2N7Wb3cGja9IDsoWhyRfvpQEu0rYskCiS13r1fX1LvsiUvtZZkbXZywCYWhzNDzjwPXzyr+/Djo+eOHjBlDvFvx8ZkOh5h3yK24+9ux79+/Ye2HP9496cPZLt1LLy2iRV62OeaRXwu/h6J3j5bx62345D6a4KYw9Y+8jBbc2tNAuynvdZF6XVkK37C+JOr3D0SLvbm+JGrdpaypb5oo245Ei72tik6qHaWsmJSi923RLXzI3O1LRGz7gWIO0dePLqO/+12vOc8WOv64XCYHGYTQne6sVqt9Kg1c9jK5IKQupGUbenYxdIY042JoaeyHuZI1T8pW3TJD70NpspTgzg6iWpAMRMiYrgyMdUUFfuU8uthp5xdD7uaabb2iCrnWSRcTpWZrZ4qM7vY10N8XxPfpX4vGqMf95/zvKKeqi0pW5oqizqB8jBj6WJ/QkjmquwQgz1y15xO53r8uSB9OCt+oA7HtCBunRW3kGtlM068qkkTcoYuJDT8IFM+A5GcCFbTwdTj5kyY2bWq/3v/+Yu1xx7KhZ3nhTXHZxz5+cxQGYTakS50igNCeTYxW3XyFdEyM9/23HPrqUO2pqI7atuVosKdmS5oRIBYe3Dw4V2JW8/nw0qPhIp8eraDMdWlTAZJEe6c/OkuW5+2JPTtmAbiycCPAaaObEJu1G1d0lDMYJe8QGWyphU0lIjewW6K/mxIlWoI0TwmkkEkPQnWhd7ldYN6j2rqZKITe3us8Qj0FmMzXhXbr//WZZsml02xMCSWCtsFc3yX7g1iLmB69mAr9gjaFllYs7HlsrsPMcdnj0fxZ+n37fgn6iCRa4J+UwHPcZ/y58WuskXbYV8MVNABOziMlSQCh1uCMB+Q6CuzSz9v+m/IdTbUqTCet3Ro/hfH24Rs9AX5bPS5wok/o4Cwv5ak4kfduvUR/47+E0YGa50qyKi49MQ49p7zSa/LnuQ5CjkRC6JjaZGeLK2in6URWMTIjCVuR2wj1nc39Pxx2rP4UAsESjDlDmajLVlvKEbftA0WgBEKpelUYyJ+cGy5NpuTqTG3vMj/gjvnfDP78k2A1DSb+Tbry7fFxDSWzXyb9zdvN9NVM98Wffk2nZjzWTPfbvrDgmk2xML7/mI6fd/Qt2V/Mb2ZNYzpqr+Yzpfvm/lmTHucuGXDiTN6WxkEUqdGE+do3apFyeHIMfGk6FXcJB/usbPbc2l8Lpn/vL8hwxoJuOMhVyt23iKX4SZ+16xoL/N7+WK/OQ0buV2z2L3M7WjF6GW+OarOk/Shh8Rui2oB2mEt7vEv8c8vsu23xfa3nxZHoyuMLL7nsh0WuOgpmdBEqzyPO/5O84gtNLpU45smLleniKLLP380uvM5vrGSV1FYO/X8l5lYPhORfANKqC0vuSJbBQ1PqWSkQVgk/k4aTJ7Ks9Td5INe/Ji2eWLTu3959yeMaE1v/WSAuUZxXKwa83yaj2pPQsoUHFvXjMvxQ47rFOgnjpzhblxH3djNzokBovKSOvqgpceZLQpdfkztotMxsSPr247Kw74kfiLi++4m+pPxe9KHY0ugNvkHtjPb1Mnvx8uJaDtoR3wB+42rcaHYJ/5pGxfNR21yKjVxFN35GhNxkDftD8gNscafgkyI4gCjguGYTuSIDhQFEePII7tPNPk55qgkgaeT6U3AR4y4jj16N43+5H5RMbyoq8tpZozEl6wa8ncyktPTBulueRhsL6bmm8aJtnVyB+O2BxkASww/6ec5tu2etv4eMu5snxJCzU6wIt5oJ0a1L8YyutSI567cTQ7dQ3Tn+JqLt5K3La+aKyQT5VYiVeVkSTOkPGeRIAm56/j4aJxRk3yu8b1Ist1eS7BwEu+SkAx0WSY6HpeuToQ70UPm/CEeLgNeeJTaoF4iGZlge2TL+9cT2yL5MY0cKHmXqjskK9aGuHbJH2laQ8xBfuJAsS0CY9KYelJoj5WmAtWq5cW8ix/rlGfN9eozkciA+o4R1x3Xu2MdfCP/GxTrbJ1HoJsauklBlWi0sB99cQEsBCzUHgvVXcypsVCKMflNTbFd7m5fwlBb8We1GhRDwb4I9kVXZ6QK4LfHSXXKW2SlRKQBL9VdynfNS8A8wDzAPG+Zeeq+cmvjXHYpu1RCD5IXkjdN3rrvZC9cNqOLW9jOw6IKiyrw0kt4qa4eo2teAuYB5gHmecvMU1dt1d3XLLDrAe4B7gHusXBdNeUQrhKAXYBdgF1eM7vU1kO/qbo1qCCpZx2oIIEKksZE1LSCpPY3H9qioQii2oZwLn//uhqpr+Yk1gZdpeBswFl5X5oul7mbLVJZboeT4LyL3fMd40j+QjvQHey9Wt97dV29q0J6QGtAa0BrQGst0tpl5cCwl3sp6ZW9AJKDsyqwXHcsd1lxMWzegMeAx4DHrs9j3ZcqQ8Ex5OD5HLys4hhODL2stOfWwO915cW+DcsuUF4HlHdZMTMcH4DUgNSA1AZGav3XSQ+wmAgqGaGS8Sz5LK5dPLTosnioWnmnxUOXlUinaPqO3z8D9Y3KmyO4a+2Lop7ZH11GUs/ujy6nqeb7I/OyYuuXExVQEVARUBFQUYGKuiy4vpRuvqMvjCB7O8neyypnaxfS7+cVNbDMwjILRHV9ouro1biv6Z01QEVARUBF16eirgtWX8W+CL6cgS9ngHz6J58hvxAX6AXoBejlVdNL1wXEr6LwBA5acNAaHBm9pUIUcwhFva/mKAavewC++/747g1uvrqu+n27v8oAvAa8Brx2LV7r8s3LsJurZz14/wOwHLBcTyw36/oF0G939wY8BjwGPNYXj3Vf0AxlyZCD53NwCC/0hRMDvPIBXvkAlNcT5Q3hZb9AakBqQGpAas1ITSfbrWPhtcwWT+DAinWzuw9Jw4bYT9kHFlCMbLbHmN99iOhqLdLXCt0YQQxzmVFslDYxMavYZyLPHvLsiBtzg1tHbNFctMEuO5IJRX+Kd0I91fCjsM2YMJNJ6akP0c+kT5Ini1RHkXA5MtLHMRFSQQaYSfHJT8Za/PxkLsbZaLdizmTqU6/oLbFCVqAC2RgE7pNmYyY5MEZTlYNyGxp6foVfFsn8suM1IV4FSjJ40UCf2bK+WarPD72NIL5YlGkxvWP7dty2xXnL+hYK+oy2HWyk8ObZOTam8o15L7BKyaHCJBVpd+SdUFblGzae9W1+MtJaXdMaZSxAvi91HWebcL/QauSWLCKWUGxrJxafT9MTn+rdPx8PSalHc93y5JvPzdf77ubrpnq+zAFP10w5E2+UJZcK/Kec/4a6qPpYjHODuXZI1MnhvbLkqs2QNBBtQHTnBnPtkABKBhcSQMngQgIoGVxIACWDCwmgZHAhAZQMLiSAksGFBFAyuJAASgYXErh/ggx+3RkMPD+4kABKBhcSQMngQgIoGVxIACWDCwmgZHAhAZQMLiSAksGFBFAyuJAASvoLScWtUeHmZ7EwFvVRO+OUOW85T5J60Py9lrdjxqnj78YjWf6KH3lVm1AkW4K7j4iH3uiHr18n9/eT/4k/fxHOxU1lL6Wx9s3/uqd/YIePfvjyZX1/36/tf2LH69XgJ8R4rwb/Tnd44zusmdHngbV6eQ4f39ceAWu1nE1n896RZbZqsfikpDdVGVn9+aNRdX/MUTZF5TpwIS8LweVfn8z5VSrBVQp8zdM1oF7hsm2FKhuMlk3mJcOtaVSpuJ+17mMjja0VhJ9arQPpTLkg/Pk9jfqG0Kwb6RUrws0r7IjUZ3+lPrfqW0tz3uI+1VQ/sZjqo5ld4Ys/5aiY536J4EhUfWtuLtqMylJ9qtVHMzs3mmtHBbAyxKgAVoYYFcDKEKMCWBliVAArQ4wKYGWIUQGsDDEqgJUhRgWwMsiowH0XYAIwAesHrB+AFcAKYAWwAlgBrABWACuAFcAKYAWwAlgZPlag5hpqrls3CDXXajXX/SOr+5prackuvpxbz98pXnpbuF56n3j6ySZW6OH8f0lw939QSwcIRCQAkLkLAAD1BAEAUEsDBBQACAgIABFUQUUAAAAAAAAAAAAAAAAIAAAAbWV0YS54bWyNk19vmzAUxd/3KZDXV+M/UJRYhEqbtKdOm9RU2ltE7NvUq2NHxpTs2w/skKVRHiYhIe793XPONVA/HPcmewffaWdXiOUUZWClU9ruVuh5/Q0v0EPzqXYvL1qCUE72e7AB7yG02ThqO5FaK9R7K1zb6U7Ydg+dCFK4A9h5RFzSIhqlytFo+7ZCryEcBCHDMORDkTu/I2y5XJLYnVElz9yh9yZSShIwMDl0hOWMzOyU8H9DTexlJOfc2WjCU+hoxyktSXqe6Z1XytxaYGQLMiZsQ4vfNQyfUXZa/+LAOWrm051iNHUMIz20YSTwOAwNp4xjusC8WrNCsIW4r2pyg0uz2uqgW4Njz/nm2b5ZN9jsa3o+TV5TtZJiNisxo5iyNeOiGK/7nFecF7xiZU1mLHmBGlXsDss/0kDXLE/iV+VJO+hgYMwS7yp7Ooy+qnsFCFEztT+Kqt7H5Zqfa1Z+vy+ertTP/TS2Aws+7vKotx5+xEMlZc7zKi/uHrXtj5tfi2pTldkFsDl49xtkICWne3r3pddG4eLk9E8yWZy//y6Mzl3QMov10G4NYOl6G1aIo1SUYMxcY/RUdNvJbC5TRJqafHj95Nav1vwFUEsHCNLFLPDJAQAAqAMAAFBLAwQUAAgICAARVEFFAAAAAAAAAAAAAAAACgAAAHN0eWxlcy54bWztXO+O2zYS/35PYTi4ogWOlmSvk7W766Bo7nAFmiBIeve1oCVaZiqJAkWtd/Pxnuee6p7khhQl679lWd7YSZMgicnhcOY3vxmS0tJ3rx99b/RAeERZcD+2JuZ4RAKbOTRw78f/+u0f6Hb8evWXO7bZUJssHWbHPgkEisSTR6IRDA6iZdJ5P455sGQ4otEywD6JlsJespAE6aBlXnqppkpalLKuw5VwfrQgj6LrYClbGIvX3WdWwvnRDse7roOlLGCaH75hXQc/Rh7aMGQzP8SClqx49Gjwx/14K0S4NIzdbjfZzSaMu4a1WCwM1ZsZbGdyYcw9JeXYBvGInCwyrIllpLI+EbirfVI2b1IQ+2vCO0ODBa5ENeQkAhFwV/Kym6L8mAK/HtzO7HpwG2C2t5h35pkSLlJl5nSnyszJj/Wx2DbE99Z4C53qr7e/7nnF/a5zSdkCVDanYWc3E+n8eMZYZqockCS7MndqmjdG8jknvWsV33EqCM+J263iNvbsDHHm14EGcpYBEog8SMqn0lw63ah5bnASMi4yQzbdix2gM81SdSt8rzlVZW8q6nLHqRUFc2YGpC0kDXqgZPeiUMva8V8YSihfv1oHWKYhZbIUAHj3xZa72XKwYXHgJGmXgEEeQ8Kp7MKeGrYsaMgzxmM9VOo1JKehkKpRNBN12P32wZB9SC4DUOi0ltzqNx2v0qVuw2CZ22CbIIfYXrS6S0pU1jxKPkvj7sc/cYohdFA9UgGfek/79vxQ2YNcEoA3wOZoR6OoIBFSYUO+P2AYK4NltE/9M/bomtOayfc9Z5z+HfXXcTT6iINo9GuNEd/hkEU/FqSSpvOa9YZ8wv+O1YSNRuVkupj0FAniH7LJaGKPbk/2TantDtng2NO7qVSztlFlKrKJ541T8RBz7HIcblHIIVe5oLAFS7pAGrSwEDk0EjiQuzFg89z290BJ0lcHKkNrQ7lhSw8Hboxd6HOIarAhKwUH6978fVxWgKAY4qAMvZJJ9aQin7dpj1aYdvz8rqpWLsceeWxXnAltaVl11vXLOxWhGuhXd8mORW9cCvHQ2JjjktBIf/JpgGggiAvjHOpSEQH0aqIanZkOO+Yc9tlPdVNZ5qv3ZurFA/OgCspNquAxaTICSEZ97KHQA8qBAbDitJqX9rqcxaHa6ivtRqZekmU1ynxQH6u2P/lr5qW6imRJZXOEWf3vP//NNJaUrGo6jgFs3MRyRVqPwWb0xWZjwq+yk6jeya8O3wQeH4dZegQOTXbXD9iLyfc/fOeKH+8z4uEw9DTaqEBM42CsmrPIMtvI3d3TblEyh4lSHtYkUK2pfcD7Hl725+nZEBiETRU+9cDz9ptm0+0xXj5ngbx04t2eSjzLfDbiDbTYDEk8y3zWMnY2BIZhk+LCaWyyvmk2WZdaxi6deFYH4jlYkCbgpz3o5eCntF8/uPdY4JZ9njRsbn04121HuZ4Ye0ftjp8I5jmX9951cnh2YQ73dOOmhxvPgLygfqPJ8x4mb1nMo5JxywaYaRALqAOHA9XgHfZR6Ofc2/vSyb2Xl+Jeg4KIyBJzXnzaGNvn3NMx8Trk3fHDJdn7g6Ui2z9Y7dFuScD2ZXZxbWelURneE/YYi2s8eFcAGGjfsDh1wzp9vuPP5XFpetTp5wqP3Wei3fTkc9J0em3npCFp12e3/sXPPufi0vRkLs2+ZS4ddRC6wiP3uWg3O5l2V/f+Y1DevXpvDeb9BayTgyIzHRaZETrWQJXhTeb1NANBogkSiAMHp27peSg79fukDsq8LsqsbsoOFg0Z2vzROYO5GzVmz/d0eLj3NsNlBrj/FdWMoaEZvmgca2FL1Zgd9WT/C1WNmTVg1VBkHaRqqNieUjXm17e/HTAz5hdRNC4TmcFrxvD1tHKYGHAvM+vzLuLZq9J8yKo0H6wqzU+sSs/3EHq4l7cDJt/iaypLQ0NzlXVpyO1S35cUz1qYFkMWpsVghWlxsDC1vL+96fMDTWd+KdvvTfTNEVvu7KcBeBzY8m0iCxB7IHzjyXtZG+xF5BLfVvcEps/j83N60lSArAM+tlbRmz4/4RLZFIoH3VAbtddGq7U2zgq95DFkgbwr3OFWROJF1aM3yS2N7FJI9W6M7lHX4Qolwdw/t86kq9df0lZBbHE/1v8hTqo25OBjWlzTxUjPSLHLAsBm7SHB78cBOFvpE9Bd6lN1CXvUDVAEGSVv6qgKh8RTmAlxEhKcmzhJRfnEfY3tP+SqHDhIP3wXHAdRiDkIKokdxyFiYVI8A4bk52Qo4w6pWMrBYSXqCZ5Nz5JLtAgYJOlqVjukA0VV0RbA+gMJhjZ0b7JezyXoNgCix62ZEMyv9H6KI2AhBBjHgu2Xhdp7T+qSX4JmcZh01cfcBQp6ZAOWmHY2k7xPCtsZ5DMH3AohOZrvR+Veb5jqVyGCLBYeDUjJT9Ul25HYQpDcLdIJX2FAQUiGviiTu5aVXeMDg85wvy9TG9HPMJtlhSLXllrPfXmPEZqTZXWLHblCVLwCWhKuXCv4narbEepuxV5fziw5e3oLLLEh36kSW/fWDE70tggUL5K1ANdFRoO7l20AeS+wB7vscSbS4HPW3+x1WWR/x+1Acf1Aok61Naktheqa1uWW3MnzhwpA025nSsQ86jSI7Kgjr8An6V0roTNVTar+XyXdmnnOseBMe6FTBLa6NMlbQEbz1P8kWH79xjCBaVn7alaiDX1sX4Laa3JaH3SVt2Eg4a0VNl95XtZUnpQ5pwVTI2r1gjQNRxdIywvnwqwaaZSuAuuPktw+DLZR2pFa5BLk4SdYcAo+vQ19a1wjVHPFl/IImqVIsuuCyACWsLMl9euix5FY78O2BQDKWzXdtmGwYeKlmMrN31bHyZy8kpeQ69fkfSPX0sXWZJcglaQ3mY1mi7Qpz2+lYGGNiUVzjEqYOoR32i28VxG7/P5zOrlZhOCtLPijbG8FAiF2ku8dMiemdZuOqmx4X9im/J2hk5OAw4pLKjypeHr5RLpQvAZg9ewQq5VjbrboT62JaVraOdWRgm3dTG6THj1F7CP5fTZYqINq/gTHON1/mRCci53IxiGpgG/Vc9iqC6lVG9KcOcnMymIdSAGZ2b0mg4mwzggGSk3zr9m+R68+cmVVsQcjt21lPG8NTCK/mCga6W+jikZs/QnOf9HoM+EMqXNodHnF41sr/Dd/psgpKfJnFlxDFhiN+17d4eMoU5HthnWj1NT2oDCfNzXb5QSY1Z08kCxD/W+0JSSRXr1+/frOKDfqlrAUhhLYErns2VoUgg2Vo1OCTTb7R0IFGelPe7avrHTCXFvFhlRXAfVWG4wKkIew/aC/+6wF2mkF2vQQ6crTkDToSLRH3ydyggovL5J8/qECRGGmQpOibWl2eXWq8XgOh/5MKKkGUGJN6wZZJjKBRCZst+Qf09RWSMHV30apwf5h1eqpvlZtTZczazldTOYvb1/NXk5fTuUUS/Unc7qOf0X/vhwpR0ZeUL1gWC0WecGk7YuQ9z00fJSff59vfv9pPi6qRmWhvUQtz2clnh8A9Vj4OwmdFaFf3liHIMqJ1GJ0c5UYGfWrjlH/xber/wNQSwcIngTzv4AKAAA4VwAAUEsDBBQACAgIABFUQUUAAAAAAAAAAAAAAAAMAAAAbWFuaWZlc3QucmRmzZPNboMwEITvPIVlzthALwUFcijKuWqfwDWGWAUv8poS3r6Ok1ZRpKrqn9TjrkYz3460m+1hHMiLsqjBVDRjKSXKSGi16Ss6uy65pds62ti2Kx+aHfFqg6WfKrp3bio5X5aFLTcMbM+zoih4mvM8T7wiwdU4cUgMxrSOCAkejUJp9eR8GjnO4glmV1F066CQefcgPYvdOqmgsgphtlK9h7YgkYFAjQlMyoR0gxy6TkvFM5bzUTnBoe3ix2C904OiPGDwK47P2N6IDKblXuC9sO5cg998lWh67mN6ddPF8d8jlGCcMu5P6rs7ef/n/i7P/xnir7R2RGxAzqNn+pDntPIfVUevUEsHCLT3aNIFAQAAgwMAAFBLAwQUAAAIAAARVEFFAAAAAAAAAAAAAAAAGAAAAENvbmZpZ3VyYXRpb25zMi9tZW51YmFyL1BLAwQUAAAIAAARVEFFAAAAAAAAAAAAAAAAGAAAAENvbmZpZ3VyYXRpb25zMi90b29sYmFyL1BLAwQUAAAIAAARVEFFAAAAAAAAAAAAAAAAGAAAAENvbmZpZ3VyYXRpb25zMi9mbG9hdGVyL1BLAwQUAAgICAARVEFFAAAAAAAAAAAAAAAAJwAAAENvbmZpZ3VyYXRpb25zMi9hY2NlbGVyYXRvci9jdXJyZW50LnhtbAMAUEsHCAAAAAACAAAAAAAAAFBLAwQUAAAIAAARVEFFAAAAAAAAAAAAAAAAHwAAAENvbmZpZ3VyYXRpb25zMi9pbWFnZXMvQml0bWFwcy9QSwMEFAAACAAAEVRBRQAAAAAAAAAAAAAAABoAAABDb25maWd1cmF0aW9uczIvc3RhdHVzYmFyL1BLAwQUAAAIAAARVEFFAAAAAAAAAAAAAAAAGgAAAENvbmZpZ3VyYXRpb25zMi90b29scGFuZWwvUEsDBBQAAAgAABFUQUUAAAAAAAAAAAAAAAAcAAAAQ29uZmlndXJhdGlvbnMyL3Byb2dyZXNzYmFyL1BLAwQUAAAIAAARVEFFAAAAAAAAAAAAAAAAGgAAAENvbmZpZ3VyYXRpb25zMi9wb3B1cG1lbnUvUEsDBBQACAgIABFUQUUAAAAAAAAAAAAAAAAVAAAATUVUQS1JTkYvbWFuaWZlc3QueG1srVRLbsMgEN3nFBbbytBmVaE4WVTqCdIDUDx2kGBAzBAlty+OlE9VparV7Ob73mMGWG0OwTd7yOQiduJFPosG0Mbe4diJj+17+yo268UqGHQDEOuz0dQ+pIvbiZJRR0OONJoApNnqmAD7aEsAZP29Xp+YLt6NgKVYL5or3+A8tLU/H6/VQ/G+TYZ3nVD3QK7hAL0zLR8TdMKk5J01XMvUHnt5EixvdUpKGUxPOwAWao6U7a6ETzTOk+KzKROOd6S4YEZQU34WCwFz3Q3JOs87yAwHVlN6FrCNyNP5H40bgM3DQYmPHh4/g3NM5n74ww2qVU+zOd4iDm4s+QRBS2WsBQ/VjVnZkvPvO/gf1x9fBRWcJMjipL1FmMhX6sdXsP4CUEsHCELZZI4gAQAARQQAAFBLAQIUABQAAAgAABFUQUWFbDmKLgAAAC4AAAAIAAAAAAAAAAAAAAAAAAAAAABtaW1ldHlwZVBLAQIUABQAAAgAABFUQUWo8NOl50EAAOdBAAAYAAAAAAAAAAAAAAAAAFQAAABUaHVtYm5haWxzL3RodW1ibmFpbC5wbmdQSwECFAAUAAgICAARVEFF3MFdwmAFAADRJAAADAAAAAAAAAAAAAAAAABxQgAAc2V0dGluZ3MueG1sUEsBAhQAFAAICAgAEVRBRUQkAJC5CwAA9QQBAAsAAAAAAAAAAAAAAAAAC0gAAGNvbnRlbnQueG1sUEsBAhQAFAAICAgAEVRBRdLFLPDJAQAAqAMAAAgAAAAAAAAAAAAAAAAA/VMAAG1ldGEueG1sUEsBAhQAFAAICAgAEVRBRZ4E87+ACgAAOFcAAAoAAAAAAAAAAAAAAAAA/FUAAHN0eWxlcy54bWxQSwECFAAUAAgICAARVEFFtPdo0gUBAACDAwAADAAAAAAAAAAAAAAAAAC0YAAAbWFuaWZlc3QucmRmUEsBAhQAFAAACAAAEVRBRQAAAAAAAAAAAAAAABgAAAAAAAAAAAAAAAAA82EAAENvbmZpZ3VyYXRpb25zMi9tZW51YmFyL1BLAQIUABQAAAgAABFUQUUAAAAAAAAAAAAAAAAYAAAAAAAAAAAAAAAAACliAABDb25maWd1cmF0aW9uczIvdG9vbGJhci9QSwECFAAUAAAIAAARVEFFAAAAAAAAAAAAAAAAGAAAAAAAAAAAAAAAAABfYgAAQ29uZmlndXJhdGlvbnMyL2Zsb2F0ZXIvUEsBAhQAFAAICAgAEVRBRQAAAAACAAAAAAAAACcAAAAAAAAAAAAAAAAAlWIAAENvbmZpZ3VyYXRpb25zMi9hY2NlbGVyYXRvci9jdXJyZW50LnhtbFBLAQIUABQAAAgAABFUQUUAAAAAAAAAAAAAAAAfAAAAAAAAAAAAAAAAAOxiAABDb25maWd1cmF0aW9uczIvaW1hZ2VzL0JpdG1hcHMvUEsBAhQAFAAACAAAEVRBRQAAAAAAAAAAAAAAABoAAAAAAAAAAAAAAAAAKWMAAENvbmZpZ3VyYXRpb25zMi9zdGF0dXNiYXIvUEsBAhQAFAAACAAAEVRBRQAAAAAAAAAAAAAAABoAAAAAAAAAAAAAAAAAYWMAAENvbmZpZ3VyYXRpb25zMi90b29scGFuZWwvUEsBAhQAFAAACAAAEVRBRQAAAAAAAAAAAAAAABwAAAAAAAAAAAAAAAAAmWMAAENvbmZpZ3VyYXRpb25zMi9wcm9ncmVzc2Jhci9QSwECFAAUAAAIAAARVEFFAAAAAAAAAAAAAAAAGgAAAAAAAAAAAAAAAADTYwAAQ29uZmlndXJhdGlvbnMyL3BvcHVwbWVudS9QSwECFAAUAAgICAARVEFFQtlkjiABAABFBAAAFQAAAAAAAAAAAAAAAAALZAAATUVUQS1JTkYvbWFuaWZlc3QueG1sUEsFBgAAAAARABEAcAQAAG5lAAAAAA==]]></data>
	</file>
	<file>
	  <filename>/templates/Spielplan.xls</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[0M8R4KGxGuEAAAAAAAAAAAAAAAAAAAAAOwADAP7/CQAGAAAAAAAAAAAAAAABAAAAEAAAAAAAAAAAEAAADQAAAAEAAAD+////AAAAAAAAAAD////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////9/////////wMAAAAEAAAABQAAAAYAAAAHAAAACAAAAAkAAAAKAAAACwAAAAwAAAD+/////v///w8AAAD+////EQAAAP7//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////1IAbwBvAHQAIABFAG4AdAByAHkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWAAUA////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/v///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP7///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/v///wAAAAAAAAAACQgQAAAGBQC7DcwHAAAAAAYAAADhAAIAsATBAAIAAADiAAAAXABwAAQAAENhbGMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCAAIAsARhAQIAAADAAQAAPQEEAAEAAgCcAAIADgCvAQIAAAC8AQIAAAA9ABIAAAAAAABAACA4AAAAAAABAHQAQAACAAAAjQACAAAAIgACAAAADgACAAEAtwECAAAA2gACAAAAMQAeANwAAAAIAJABAAAAAgAABwFDAGEAbABpAGIAcgBpADEAGgDIAAAA/3+QAQAAAAAAAAUBQQByAGkAYQBsADEAGgDIAAAA/3+QAQAAAAAAAAUBQQByAGkAYQBsADEAGgDIAAAA/3+QAQAAAAAAAAUBQQByAGkAYQBsADEAGgCgAAAACACQAQAAAAIAAAUBQQByAGkAYQBsADEAGgCgAAAACAC8AgAAAAIAAAUBQQByAGkAYQBsADEAGgBkAAAACACQAQAAAAIAAAUBQQByAGkAYQBsADEAGgBkAAAACAC8AgAAAAIAAAUBQQByAGkAYQBsAB4EDACkAAcAAEdFTkVSQUweBA8ApQAKAABERC9NTS9ZWVlZHgQKAKYABQAASEg6TU3gABQAAACkAPX/IAAAAAAAAAAAAAAAwCDgABQAAQAAAPX/IAAA9AAAAAAAAAAAwCDgABQAAQAAAPX/IAAA9AAAAAAAAAAAwCDgABQAAgAAAPX/IAAA9AAAAAAAAAAAwCDgABQAAgAAAPX/IAAA9AAAAAAAAAAAwCDgABQAAAAAAPX/IAAA9AAAAAAAAAAAwCDgABQAAAAAAPX/IAAA9AAAAAAAAAAAwCDgABQAAAAAAPX/IAAA9AAAAAAAAAAAwCDgABQAAAAAAPX/IAAA9AAAAAAAAAAAwCDgABQAAAAAAPX/IAAA9AAAAAAAAAAAwCDgABQAAAAAAPX/IAAA9AAAAAAAAAAAwCDgABQAAAAAAPX/IAAA9AAAAAAAAAAAwCDgABQAAAAAAPX/IAAA9AAAAAAAAAAAwCDgABQAAAAAAPX/IAAA9AAAAAAAAAAAwCDgABQAAAAAAPX/IAAA9AAAAAAAAAAAwCDgABQAAACkAAEAIAAAAAAAAAAAAAAAwCDgABQAAQArAPX/IAAA8AAAAAAAAAAAwCDgABQAAQApAPX/IAAA8AAAAAAAAAAAwCDgABQAAQAsAPX/IAAA8AAAAAAAAAAAwCDgABQAAQAqAPX/IAAA8AAAAAAAAAAAwCDgABQAAQAJAPX/IAAA8AAAAAAAAAAAwCDgABQABQCkAAEAIAAAiAAAAAAAAAAAwCDgABQABQCkAAEAIAAACAAAAAAAAAAAwCDgABQABgCkAAEAEAAA+Hd3CAQIBAAEtgvgABQABgCkAAEAEgAA+Hd3CAQIBAAEtgvgABQABgCkAAEAEgAA+Hd3CAQIBAAECQ3gABQABQClAAEAEAAA/Hd3CAQIBAAEKw3gABQABQCmAAEAEAAA/Hd3CAQIBAAEKw3gABQABQCkAAEAEAAA+Hd3CAQIBAAEKw3gABQABQCkAAEAEQAA+Ad3CAAIBAAEKw3gABQABQCkAAEAEgAA+AB3AAAIBAAEKw3gABQABQCkAAEAEwAA+HB3AAQIBAAEKw3gABQABQClAAEAEAAAvHd3CAQIBAAAwCDgABQABQCmAAEAEAAAvHd3CAQIBAAAwCDgABQABQCkAAEAEAAAuHd3CAQIBAAAwCDgABQABQCkAAEAEQAAuAd3CAAIBAAAwCDgABQABQCkAAEAEgAAuAB3AAAIBAAAwCDgABQABQCkAAEAEwAAuHB3AAQIBAAAwCDgABQABwCkAAEAIAAAiAAAAAAAAAAAwCDgABQABwCkAAEAIAAACAAAAAAAAAAAwCDgABQACACkAAEAEAAA+Hd3CAQIBAAEtgvgABQACACkAAEAEgAA+Hd3CAQIBAAEtgvgABQABwClAAEAEgAA/Hd3CAQIBAAEKw3gABQABwCmAAEAEgAA/Hd3CAQIBAAEKw3gABQABwCkAAEAEAAA+Hd3CAQIBAAEKw3gABQABwCkAAEAEgAA+Ad3CAAIBAAEKw3gABQABwCkAAEAEgAA+AB3AAAIBAAEKw3gABQABwCkAAEAEwAA+HB3AAQIBAAEKw3gABQABwClAAEAEgAAvHd3CAQIBAAAwCDgABQABwCmAAEAEgAAvHd3CAQIBAAAwCDgABQABwCkAAEAEAAAuHd3CAQIBAAAwCDgABQABwCkAAEAEgAAuAd3CAAIBAAAwCDgABQABwCkAAEAEgAAuAB3AAAIBAAAwCDgABQABwCkAAEAEwAAuHB3AAQIBAAAwCCTAgQAAIAA/5MCBAAQgAP/kwIEABGABv+TAgQAEoAE/5MCBAATgAf/kwIEABSABf+SAOIAOAAAAAAA5ubmAP8AAAAA/wAAAAD/AP//AAD/AP8AAP//AIAAAAAAgAAAAACAAICAAACAAIAAAICAAMDAwACAgIAAmZn/AJkzZgD//8wAzP//AGYAZgD/gIAAAGbMAMzM/wAAAIAA/wD/AP//AAAA//8AgACAAIAAAAAAgIAAAAD/AADM/wDM//8AzP/MAP//mQCZzP8A/5nMAMyZ/wD/zJkAM2b/ADPMzACZzAAA/8wAAP+ZAAD/ZgAAZmZmAJaWlgAAM2YAM5lmAAAzAAAzMwAAmTMAAJkzZgAzM5kAMzMzAGABAgAAAIUACgBZCQAAAAACAEE1hQALAL0PAAAAAAMASUQxjAAEADEAMQCuAQQAAgABBBcADgACAAAAAAAAAAAAAQABABgAGwAgAAABCwAAAAEAAAAAAAAGOwAAAAAYAAAABgAYABsAIAAAAQsAAAACAAAAAAAABjsBAAAAFwAAAAYAwQEIAMEBAABUjQEA6wBiAA8AAPBaAAAAAAAG8CAAAAAACAAAAwAAAAIAAAACAAAAAQAAAAEAAAACAAAAAQAAADMAC/ASAAAAvwAIAAgAgQEJAAAIwAFAAAAIQAAe8RAAAAANAAAIDAAACBcAAAj3AAAQYwgVAGMIAAAAAAAAAAAAABUAAAAAAAAAAgoAAAAJCBAAAAYQALsNzAcAAAAABgAAAAwAAgBkAA8AAgABABEAAgAAABAACAD8qfHSTWJQP18AAgABAIAACAAAAAAAAAAAACUCBAABAO4AgQACAMEEKgACAAAAKwACAAAAggACAAEAFAAAABUAAACDAAIAAQCEAAIAAQAmAAgAMzMzMzMz2T8nAAgAMzMzMzMz2T8oAAgAMzMzMzMz2T8pAAgAMzMzMzMz2T+hACIACwBkAAAAAQABAAAALAEsAQu2YAu2YOA/C7ZgC7Zg4D8BAFUAAgAIAH0ADAAAAAAAKAgVAAAAAAB9AAwAAQABAPMEFQAAAAAAfQAMAAIAAwAhFRUAAAAAAH0ADAAEAAQAhAYVAAAAAAB9AAwABQAFAPwAFgAAAAAAfQAMAAYABgCEBhYAAAAAAH0ADAAHAAABAgkWAAAAAAAAAg4AAAAAABkAAAAAAAcAAAAIAhAAAAAAAAcA7gAAAAAAQAEPAAgCEAABAAAABwDuAAAAAABAAQ8ACAIQAAIAAAAHAO4AAAAAAEABDwAIAhAAAwAAAAcA7gAAAAAAQAEPAAgCEAAEAAAABwDuAAAAAABAAQ8ACAIQAAUAAAAHAO4AAAAAAEABDwAIAhAABgAAAAcA7gAAAAAAQAEPAAgCEAAHAAAABwDuAAAAAABAAQ8ACAIQAAgAAAAHAO4AAAAAAEABDwAIAhAACQAAAAcA7gAAAAAAQAEPAAgCEAAKAAAABwDuAAAAAABAAQ8ACAIQAAsAAAAHAO4AAAAAAEABDwAIAhAADAAAAAcA7gAAAAAAQAEPAAgCEAANAAAABwDuAAAAAABAAQ8ACAIQAA4AAAAHAO4AAAAAAEABDwAIAhAADwAAAAcA7gAAAAAAQAEPAAgCEAAQAAAABwDuAAAAAABAAQ8ACAIQABEAAAAHAO4AAAAAAEABDwAIAhAAEgAAAAcA7gAAAAAAQAEPAAgCEAATAAAABwDuAAAAAABAAQ8ACAIQABQAAAAHAO4AAAAAAEABDwAIAhAAFQAAAAcA7gAAAAAAQAEPAAgCEAAWAAAABwDuAAAAAABAAQ8ACAIQABcAAAAHAO4AAAAAAEABDwAIAhAAGAAAAAcA7gAAAAAAQAEPAL4AFAAAAAAAFwAXABcAFwAYABgAGAAGAL4AFAABAAAAGQAZABkAGQAZABkAGQAGAL4AFAACAAAAGgAbABwAHAAdAB4AHwAGAL4AFAADAAAAIAAhACIAIgAjACQAJQAGAL4AFAAEAAAAGgAbABwAHAAdAB4AHwAGAL4AFAAFAAAAIAAhACIAIgAjACQAJQAGAL4AFAAGAAAAGgAbABwAHAAdAB4AHwAGAL4AFAAHAAAAIAAhACIAIgAjACQAJQAGAL4AFAAIAAAAGgAbABwAHAAdAB4AHwAGAL4AFAAJAAAAIAAhACIAIgAjACQAJQAGAL4AFAAKAAAAGgAbABwAHAAdAB4AHwAGAL4AFAALAAAAIAAhACIAIgAjACQAJQAGAL4AFAAMAAAAGgAbABwAHAAdAB4AHwAGAL4AFAANAAAAGQAZABkAGQAZABkAGQAGAL4AFAAOAAAAGgAbABwAHAAdAB4AHwAGAL4AFAAPAAAAIAAhACIAIgAjACQAJQAGAL4AFAAQAAAAGgAbABwAHAAdAB4AHwAGAL4AFAARAAAAIAAhACIAIgAjACQAJQAGAL4AFAASAAAAGgAbABwAHAAdAB4AHwAGAL4AFAATAAAAIAAhACIAIgAjACQAJQAGAL4AFAAUAAAAGgAbABwAHAAdAB4AHwAGAL4AFAAVAAAAIAAhACIAIgAjACQAJQAGAL4AFAAWAAAAGgAbABwAHAAdAB4AHwAGAL4AFAAXAAAAIAAhACIAIgAjACQAJQAGAL4AFAAYAAAAGgAbABwAHAAdAB4AHwAGAOUAGgADAAAAAAAEAAYAAQABAAAABgANAA0AAAAGAOwAUAAPAALwSAAAABAACPAIAAAAAQAAAAAEAAAPAAPwMAAAAA8ABPAoAAAAAQAJ8BAAAAAAAAAAAAAAAAAAAAAAAAAAAgAK8AgAAAAABAAABQAAAD4CEgC2BgAAAABAAAAAAABrAAAAAACgAAQAawBkAB0ADwADAAAAAAAAAQAAAAAAAABnCBcAZwgAAAAAAAAAAAAAAgAB/////wAAAAAKAAAACQgQAAAGEAC7DcwHAAAAAAYAAAAMAAIAZAAPAAIAAQARAAIAAAAQAAgA/Knx0k1iUD9fAAIAAQCAAAgAAAAAAAAAAAAlAgQAAQDuAIEAAgDBBCoAAgAAACsAAgAAAIIAAgABABQAAAAVAAAAgwACAAAAhAACAAAAJgAIADMzMzMzM9k/JwAIADMzMzMzM9k/KAAIADMzMzMzM9k/KQAIADMzMzMzM9k/oQAiAAsAZAAAAAEAAQAAACwBLAELtmALtmDgPwu2YAu2YOA/AQBVAAIACAB9AAwAAAAAAFoEJgAAAAAAfQAMAAEAAQCQAiYAAAAAAH0ADAACAAMAEgomAAAAAAB9AAwABAAEAMQCJgAAAAAAfQAMAAUABQDQACcAAAAAAH0ADAAGAAYAxAInAAAAAAB9AAwABwAAAQIJJwAAAAAAAAIOAAAAAAAYAAAAAAAHAAAACAIQAAAAAAAHAOgAAAAAAEABDwAIAhAAAQAAAAcA6AAAAAAAQAEPAAgCEAACAAAABwDoAAAAAABAAQ8ACAIQAAMAAAAHAOgAAAAAAEABDwAIAhAABAAAAAcA6AAAAAAAQAEPAAgCEAAFAAAABwDoAAAAAABAAQ8ACAIQAAYAAAAHAOgAAAAAAEABDwAIAhAABwAAAAcA6AAAAAAAQAEPAAgCEAAIAAAABwDoAAAAAABAAQ8ACAIQAAkAAAAHAOgAAAAAAEABDwAIAhAACgAAAAcA6AAAAAAAQAEPAAgCEAALAAAABwDoAAAAAABAAQ8ACAIQAAwAAAAHAOgAAAAAAEABDwAIAhAADQAAAAcA6AAAAAAAQAEPAAgCEAAOAAAABwDoAAAAAABAAQ8ACAIQAA8AAAAHAOgAAAAAAEABDwAIAhAAEAAAAAcA6AAAAAAAQAEPAAgCEAARAAAABwDoAAAAAABAAQ8ACAIQABIAAAAHAOgAAAAAAEABDwAIAhAAEwAAAAcA6AAAAAAAQAEPAAgCEAAUAAAABwDoAAAAAABAAQ8ACAIQABUAAAAHAOgAAAAAAEABDwAIAhAAFgAAAAcA6AAAAAAAQAEPAAgCEAAXAAAABwDoAAAAAABAAQ8AvgAUAAAAAAAoACgAKAAoACkAKQApAAYAvgAUAAEAAAAqACsALAAsAC0ALgAvAAYAvgAUAAIAAAAwADEAMgAyADMANAA1AAYAvgAUAAMAAAAqACsALAAsAC0ALgAvAAYAvgAUAAQAAAAwADEAMgAyADMANAA1AAYAvgAUAAUAAAAqACsALAAsAC0ALgAvAAYAvgAUAAYAAAAwADEAMgAyADMANAA1AAYAvgAUAAcAAAAqACsALAAsAC0ALgAvAAYAvgAUAAgAAAAwADEAMgAyADMANAA1AAYAvgAUAAkAAAAqACsALAAsAC0ALgAvAAYAvgAUAAoAAAAwADEAMgAyADMANAA1AAYAvgAUAAsAAAAqACsALAAsAC0ALgAvAAYAvgAUAAwAAAAoACgAKAAoACkAKQApAAYAvgAUAA0AAAAqACsALAAsAC0ALgAvAAYAvgAUAA4AAAAwADEAMgAyADMANAA1AAYAvgAUAA8AAAAqACsALAAsAC0ALgAvAAYAvgAUABAAAAAwADEAMgAyADMANAA1AAYAvgAUABEAAAAqACsALAAsAC0ALgAvAAYAvgAUABIAAAAwADEAMgAyADMANAA1AAYAvgAUABMAAAAqACsALAAsAC0ALgAvAAYAvgAUABQAAAAwADEAMgAyADMANAA1AAYAvgAUABUAAAAqACsALAAsAC0ALgAvAAYAvgAUABYAAAAwADEAMgAyADMANAA1AAYAvgAUABcAAAAqACsALAAsAC0ALgAvAAYA5QASAAIAAAAAAAQABgAMAAwABAAGAOwAUAAPAALwSAAAACAACPAIAAAAAQAAAAAIAAAPAAPwMAAAAA8ABPAoAAAAAQAJ8BAAAAAAAAAAAAAAAAAAAAAAAAAAAgAK8AgAAAAACAAABQAAAD4CEgC2AAAAAABAAAAAAABrAAAAAACgAAQAawBkAB0ADwADDQAGAAAAAQANAA0ABgZnCBcAZwgAAAAAAAAAAAAAAgAB/////wAAAAAKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAD+/////v///wQAAAAFAAAABgAAAAcAAAAIAAAA/v///woAAAD+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AQD+/wMKAAD/////EAgCAAAAAADAAAAAAAAARhsAAABNaWNyb3NvZnQgRXhjZWwgOTctVGFiZWxsZQAGAAAAQmlmZjgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/v8AAAEAAgAAAAAAAAAAAAAAAAAAAAAAAQAAAOCFn/L5T2gQq5EIACsns9kwAAAAKAEAAA0AAAABAAAAcAAAAAIAAAB4AAAAAwAAAJgAAAAEAAAApAAAAAUAAAC8AAAABgAAAMgAAAAHAAAA1AAAAAgAAADgAAAACQAAAOwAAAAKAAAA+AAAAAsAAAAEAQAADAAAABABAAANAAAAHAEAAAIAAADp/QAAHgAAABUAAABVbnRpdGxlZCBTcHJlYWRzaGVldAAAAAAeAAAAAQAAAAAAAAAeAAAAEAAAAFVua25vd24gQ3JlYXRvcgAeAAAAAQAAAAAAAAAeAAAAAQAAAAAAAAAeAAAAAQAAAAAAAAAeAAAAAQAAAAAAAAAeAAAAAgAAADkAAABAAAAAgPxEFAIAAABAAAAAAAAAAAAAAABAAAAAAFDYlHyDzQFAAAAA9ubRA2PdzwEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/v8AAAEAAgAAAAAAAAAAAAAAAAAAAAAAAgAAAALVzdWcLhsQk5cIACss+a5EAAAABdXN1ZwuGxCTlwgAKyz5rlwAAAAYAAAAAQAAAAEAAAAQAAAAAgAAAOn9AAAYAAAAAQAAAAEAAAAQAAAAAgAAAOn9AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFIAbwBvAHQAIABFAG4AdAByAHkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWAAUA//////////8BAAAAEAgCAAAAAADAAAAAAAAARgAAAAAAAAAAAAAAAAAAAAAAAAAADgAAAMACAAAAAAAAVwBvAHIAawBiAG8AbwBrAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABIAAgACAAAABAAAAP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAA7RUAAAAAAAABAEMAbwBtAHAATwBiAGoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEgACAAMAAAD//////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABJAAAAAAAAAAEATwBsAGUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKAAIA////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAABQAAAAAAAAABQBTAHUAbQBtAGEAcgB5AEkAbgBmAG8AcgBtAGEAdABpAG8AbgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgAAgD/////BQAAAP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAWAEAAAAAAAAFAEQAbwBjAHUAbQBlAG4AdABTAHUAbQBtAGEAcgB5AEkAbgBmAG8AcgBtAGEAdABpAG8AbgAAAAAAAAAAAAAAOAACAP///////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkAAAB0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/v///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+////AAAAAAAAAAA=]]></data>
	</file>
	<file>
	  <filename>/templates/xlslink.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[eyR4bHNmb3Jtc3RhcnR9Cgl7JHhsc3BhZ2VpZH0KCXskeGxzZm9ybWxpbmt0eXBlfQoJeyR4bHNmb3JtdGVhbWlkfQoJeyR4bHNmb3Jtc2Fpc29uaWR9Cgl7JHhsc2Zvcm1zdWJtaXR9CnskeGxzZm9ybWVuZH0=]]></data>
	</file>
	<file>
	  <filename>/tinymce_menu.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAgCnJlcXVpcmVfb25jZSgiZGF0YW1vZGVsL2RhdGFiYXNlb3BlcmF0aW9ucy5waHAiKTsKCmNsYXNzIHRpbnltY2VfbWVudSB7CgkKCS8qKgoJICogVGhpcyBmdW5jdGlvbiBjcmVhdGVzIGEgQnV0dG9uIGluc2lkZSB0aGUgVGlueU1DRSBFZGl0b3IuCgkgKiAKCSAqIEBwYXJhbSBzdHJpbmcgJHRpdGxlIFRvb2x0aXAgb2YgdGhlIGJ1dHRvbgoJICogQHBhcmFtIHN0cmluZyAkaW1hZ2UgUGF0aCB0byB0aGUgaW1hZ2UgdGhhdCBzaG91bGQgYmUgZGlzcGxheWVkIGZvciB0aGUgYnV0dG9uCgkgKiBAcmV0dXJuIHN0cmluZyBUaGUgamF2YSBzY3JpcHQgY29kZSBuZWVkZWQgZm9yIHRoZSBidXR0b24uCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gYnV0dG9uX3N0YXJ0KCR0aXRsZSwgJGltYWdlKSB7CgkJcmV0dXJuICIKCQl0aW55bWNlLmNyZWF0ZSgndGlueW1jZS5wbHVnaW5zLmluc2VydCcsIHsKCQkJY3JlYXRlQ29udHJvbDogZnVuY3Rpb24obiwgY20pIHsKCQkJCXN3aXRjaCAobikgewoJCQkJCWNhc2UgJ2luc2VydCc6CgkJCQkJCXZhciBjID0gY20uY3JlYXRlTWVudUJ1dHRvbignaW5zZXJ0JywgewoJCQkJCQkJdGl0bGUgOiAnIi4kdGl0bGUuIicsCgkJCQkJCQlpbWFnZSA6ICciLiRpbWFnZS4iJywKCQkJCQkJCWljb25zIDogZmFsc2UKCQkJCQkJfSk7CgkJCQkJCQkKCQkJCQkJYy5vblJlbmRlck1lbnUuYWRkKGZ1bmN0aW9uKGMsIG0pIHsKCQkJCQkJCSI7Cgl9CgkKCS8qKgoJICogVGhpcyBmdW5jdGlvbiBhZGRzIGEgc3VibWVudSB0byBhbiBhbHJlYWR5IGV4aXN0aW5nIGJ1dHRvbiBvciBzdWJtZW51LgoJICogCgkgKiBAcGFyYW0gdW5rbm93bl90eXBlICR2YXIgVGhlIG5hbWUgb2YgdGhlIGphdmFzY3JpcHQgdmFyaWFibGUgdGhhdCBob2xkcyB0aGUgc3VibWVudQoJICogQHBhcmFtIHVua25vd25fdHlwZSAkdGl0bGUgVGhlIGRpc3BsYXllZCBuYW1lIG9mIHRoZSBzdWJtZW51CgkgKiBAcGFyYW0gdW5rbm93bl90eXBlICRwYXJlbnQgTGVhdmUgZW1wdHkgdG8gZ2VuZXJhdGUgZGlyZWN0bHkgZm9yIHRoZSBidXR0b24gb3IgZ2l2ZSBhbiBleGlzdGluZyBqYXZhc2NyaXB0IHZhcmlhYmxlIHRoYXQgbWF5IGNvbnRhaW4gYW5vdGhlciB2YXJpYWJsZQoJICogQHJldHVybiBzdHJpbmcgVGhlIGphdmFzY3JpcHQgY29kZSBmb3IgdGhlIHN1Ym1lbnUKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBzdWJtZW51KCR2YXIsICR0aXRsZSwgJHBhcmVudD0ibSIpIHsKCQlyZXR1cm4gJHZhci4iID0gIi4kcGFyZW50LiIuYWRkTWVudSh7dGl0bGUgOiAnIi4kdGl0bGUuIid9KTsiLiRwYXJlbnQuIi5hZGRTZXBhcmF0b3IoKTsiOwoJfQoJCgkvKioKCSAqIFRoaXMgZnVuY3Rpb24gYWRkcyBhIG1lbnUgaXRlbSB0byBhbiBhbHJlYWR5IGV4aXN0aW5nIG1lbnUgb3IgbWVudWJ1dHRvbi4KCSAqIEBwYXJhbSB1bmtub3duX3R5cGUgJHRpdGxlIFRoZSBkaXNwbGF5ZWQgbmFtZSBvdCB0aGUgbWVudSBpdGVtCgkgKiBAcGFyYW0gdW5rbm93bl90eXBlICRhY3Rpb24gVGhlIGFjdGlvbiB0aGF0IHNob3VsZCBiZSBleGVjdXRlZCBpZiB0aGUgbWVudSBpdGVtIGhhcyBiZWVuIHNlbGVjdGVkCgkgKiBAcGFyYW0gdW5rbm93bl90eXBlICRwYXJlbnQgTGVhdmUgZW1wdHkgaWYgeW91IHdhbnQgdG8gY3JlYXRlIGEgbWVudSBpdGVtIGRpcmVjdGx5IHVuZGVyIHRoZSBtZW51IGJ1dHRvbi4gT3RoZXJ3aXNlIGdpdmUgdGhlIGphdmFzY3JpcHQgc3VibWVudSB2YXJpYWJsZSB3aGVyZSB0aGUgbWVudSBpdGVtIHNob3VsZCBiZSBjcmVhdGVkLgoJICogQHJldHVybiBzdHJpbmcgVGhlIGphdmFzY3JpcHQgY29kZSBmb3IgdGhlIG1lbnUgaXRlbQoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGl0ZW0oJHRpdGxlLCAkYWN0aW9uLCAkcGFyZW50PSJtIikgewoJCXJldHVybiAkcGFyZW50LiIuYWRkKHt0aXRsZSA6ICciLiR0aXRsZS4iJywgIi4kYWN0aW9uLiJ9KTsiLiRwYXJlbnQuIi5hZGRTZXBhcmF0b3IoKTsiOwoJfQoJCgkvKioKCSAqIFRoaXMgZnVuY3Rpb24gY3JlYXRlcyB0aGUgZW5kIG9mIGEgYnV0dG9uIG1lbnUgZm9yIHRoZSBUaW55TUNFIEVkaXRvci4KCSAqIAoJICogQHJldHVybiBzdHJpbmcgVGhlIGphdmFzY3JpcHQgY29kZSB0byBlbmQgdGhlIGJ1dHRvbiB0byBiZSBpbnNlcnRlZCB0byBUaW55TUNFIEVkaXRvci4KCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBidXR0b25fZW5kKCkgewoJCXJldHVybiAiCgkJCQkJCQl9KTsKCQkJCQkJCS8vIFJldHVybiB0aGUgbmV3IG1lbnUgYnV0dG9uIGluc3RhbmNlCgkJCQkJCQlyZXR1cm4gYzsKCQkJCQl9CgkJCQoJCQkJCXJldHVybiBudWxsOwoJCQkJfQoJCQl9KTsKCQkJCQkiOwoJfQp9Cgo/Pg==]]></data>
	</file>
	<file>
	  <filename>/_action.deleteGame.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKaWYgKCFpc3NldCgkZ0NtcykpIGV4aXQ7CgppZiAoISAkdGhpcy0+Q2hlY2tBY2Nlc3MoImRlbGV0ZSIpKQoJewoJcmV0dXJuICR0aGlzLT5EaXNwbGF5RXJyb3JQYWdlKCRpZCwgJHBhcmFtcywgJHJldHVybmlkLCR0aGlzLT5MYW5nKCdhY2Nlc3NkZW5pZWQnKSk7Cgl9CgovKiAtPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LQoKICAgQ29kZSBmb3Iga2VnZWxlcmdlYm5pc3NlICJkZWxldGVHYW1lIiBhZG1pbiBhY3Rpb24KICAgCiAgIC09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tCiAgIAogICBUeXBpY2FsbHksIHRoaXMgd2lsbCBkaXNwbGF5IHNvbWV0aGluZyBmcm9tIGEgdGVtcGxhdGUKICAgb3IgZG8gc29tZSBvdGhlciB0YXNrLgogICAKKi8KCgo/Pg==]]></data>
	</file>
	<file>
	  <filename>/_action.deletePlayer.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKaWYgKCFpc3NldCgkZ0NtcykpIGV4aXQ7CgppZiAoISAkdGhpcy0+Q2hlY2tBY2Nlc3MoImRlbGV0ZSIpKQoJewoJcmV0dXJuICR0aGlzLT5EaXNwbGF5RXJyb3JQYWdlKCRpZCwgJHBhcmFtcywgJHJldHVybmlkLCR0aGlzLT5MYW5nKCdhY2Nlc3NkZW5pZWQnKSk7Cgl9CgovKiAtPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LQoKICAgQ29kZSBmb3Iga2VnZWxlcmdlYm5pc3NlICJkZWxldGVQbGF5ZXIiIGFkbWluIGFjdGlvbgogICAKICAgLT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS0KICAgCiAgIFR5cGljYWxseSwgdGhpcyB3aWxsIGRpc3BsYXkgc29tZXRoaW5nIGZyb20gYSB0ZW1wbGF0ZQogICBvciBkbyBzb21lIG90aGVyIHRhc2suCiAgIAoqLwoKCj8+]]></data>
	</file>
	<file>
	  <filename>/_action.deleteSaison.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKaWYgKCFpc3NldCgkZ0NtcykpIGV4aXQ7CgppZiAoISAkdGhpcy0+Q2hlY2tBY2Nlc3MoImRlbGV0ZSIpKQoJewoJcmV0dXJuICR0aGlzLT5EaXNwbGF5RXJyb3JQYWdlKCRpZCwgJHBhcmFtcywgJHJldHVybmlkLCR0aGlzLT5MYW5nKCdhY2Nlc3NkZW5pZWQnKSk7Cgl9CgovKiAtPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LQoKICAgQ29kZSBmb3Iga2VnZWxlcmdlYm5pc3NlICJkZWxldGVTYWlzb24iIGFkbWluIGFjdGlvbgogICAKICAgLT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS0KICAgCiAgIFR5cGljYWxseSwgdGhpcyB3aWxsIGRpc3BsYXkgc29tZXRoaW5nIGZyb20gYSB0ZW1wbGF0ZQogICBvciBkbyBzb21lIG90aGVyIHRhc2suCiAgIAoqLwoKCj8+]]></data>
	</file>
	<file>
	  <filename>/_action.deleteTeam.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKaWYgKCFpc3NldCgkZ0NtcykpIGV4aXQ7CgppZiAoISAkdGhpcy0+Q2hlY2tBY2Nlc3MoImRlbGV0ZSIpKQoJewoJcmV0dXJuICR0aGlzLT5EaXNwbGF5RXJyb3JQYWdlKCRpZCwgJHBhcmFtcywgJHJldHVybmlkLCR0aGlzLT5MYW5nKCdhY2Nlc3NkZW5pZWQnKSk7Cgl9CgovKiAtPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LQoKICAgQ29kZSBmb3Iga2VnZWxlcmdlYm5pc3NlICJkZWxldGVUZWFtIiBhZG1pbiBhY3Rpb24KICAgCiAgIC09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tCiAgIAogICBUeXBpY2FsbHksIHRoaXMgd2lsbCBkaXNwbGF5IHNvbWV0aGluZyBmcm9tIGEgdGVtcGxhdGUKICAgb3IgZG8gc29tZSBvdGhlciB0YXNrLgogICAKKi8KCgo/Pg==]]></data>
	</file>
</module>
