<?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 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.2</dtdversion>
	<name>CustomContent</name>
	<version>1.4.1</version>
	<help>PGgzPldoYXQgRG9lcyBUaGlzIERvPzwvaDM+CjxwPlRoaXMgbW9kdWxlLCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBVc2VySUQgbW9kdWxlIGFsbG93cyB5b3UgdG8gY3JlYXRlIGEgcGFnZSB0aGF0IHdpbGwgbG9vayBkaWZmZXJlbnQgZGVwZW5kaW5nIHVwb24gdGhlIHBlcnNvbiB0aGF0IGxvb2tzIGF0IGl0LiAgWW91IGNhbiBzcGVjaWZ5IGRpZmZlcmVudCBjb250ZW50IGZvciBjZXJ0YWluIHVzZXJzLCBvciBtZW1iZXJzIG9mIGEgY2VydGFpbiBncm91cC48L3A+CjxoMz5Ib3cgRG8gSSBVc2UgSXQgKG1ldGhvZCAxOiBjb21tZW50IHRhZ3MpPC9oMz4KPHA+VG8gdXNlIGl0IHlvdSBwbGFjZSB0aGUgdGFnIHtjbXNfbW9kdWxlIG1vZHVsZT1DdXN0b21Db250ZW50fSBpbnRvIHlvdXIgcGFnZSBvciB0ZW1wbGF0ZSwgYW5kIHRoZW4gYmVsb3cgdGhhdCB5b3UgcGxhY2UgdGhlIGNvbnRlbnQgeW91IHdhbnQgaXNvbGF0ZWQgdG8gc3BlY2lmaWMgdXNlcnMgaW4gZ3JvdXBzIGluIG9uZSBvZiB0d28gd2F5cywgZWl0aGVyIHVzaW5nIHNwZWNpYWxseSBmb3JtYXR0ZWQgY29tbWVudCB0YWdzLCBvciB1c2luZyBzbWFydHkgc3ludGF4LjwvcD4KPGg0Pk1ldGhvZCAxOiBjb21tZW50IHRhZ3M8L2g0Pgo8cHJlPgp7Y21zX21vZHVsZSBtb2R1bGU9Q3VzdG9tQ29udGVudH0KJmx0OyEtLWN1c3RvbUNvbnRlbnQ6IHN0YXJ0aWYgZ3JvdXA9dGVzdGVycyxhZG1pbnMgLS0mZ3Q7CiZsdDtIMSZndDtUaGlzIGNvbnRlbnQgaXMgb25seSBhdmFpbGFibGUgdG8gbG9nZ2VkIGluIHRlc3RlcnMgYW5kIGFuZCBhZG1pbnMmbHQ7L0gxJmd0OwombHQ7IS0tY3VzdG9tQ29udGVudDogZWxzZSAtLSZndDsKJmx0O0gxJmd0O1RoaXMgY29udGVudCBpcyBhdmFpbGFibGUgdG8gZXZlcnlib2R5IGVsc2UmbHQ7L0gxJmd0OwombHQ7IS0tY3VzdG9tQ29udGVudDogZW5kaWYgLS0mZ3Q7CiZsdDshLS1jdXN0b21Db250ZW50OiBzdGFydGlmIGdyb3VwPXVzZXJzIC0tJmd0OwombHQ7SDEmZ3Q7VGhpcyBjb250ZW50IGlzIG9ubHkgYXZhaWxhYmxlIHRvIGxvZ2dlZCBpbiB1c2VycyAmbHQ7L0gxJmd0OwombHQ7IS0tY3VzdG9tQ29udGVudDogZW5kaWYgLS0mZ3Q7CjwvcHJlPgo8cD48Yj5BdmFpbGFibGUgcGFyYW1ldGVyczwvYj48L3A+IAo8dWw+CjxsaT48cD48ZW0+aXA8L2VtPiAtIHRlc3QgaWYgcmVtb3RlIGlwIG1hdGNoZXMgYSBuZXR3b3JrIG9yIHN1cHBsaWVkIGlwIGFkZHJlc3MuICBWYWxpZCBmb3JtYXRzIGFyZSB4eHgueHh4Lnh4eC54eHggKGV4YWN0KSwgeHh4Lnh4eC54eHguW3l5eS16enpdIChyYW5nZSkgYW5kIHh4eC54eHgueHh4L25uIChubiA9ICMgYml0cywgaS5lLiAgMTkyLjE2OC4xLjAvMjQpPC9wPjwvbGk+CjxsaT48cD48ZW0+Z3JvdXA8L2VtPiAtIHRlc3QgaWYgdGhlIGN1cnJlbnRseSBsb2dnZWQgaW4gdXNlciBpcyBhIG1lbWJlciBvZiBhbnkgb2YgdGhlIHN1cHBsaWVkIGdyb3VwczwvcD48L2xpPgo8bGk+PHA+PGVtPnVzZXI8ZW0+IC0gdGVzdCBpZiB0aGUgY3VycmVudGx5IGxvZ2dlZCBpbiB1c2VybmFtZSBtYXRjaGVzIGFueSBvZiB0aGUgc3VwcGxpZWQgb25lczwvcD48L2xpPgo8bGk+PHA+PGVtPmxvZ2dlZGluPGVtPiAtIHRlc3QgaWYgdGhlIGN1cnJlbnQgdXNlciBpcyBsb2dnZWQgaW4gb3Igbm90Li9wPjwvbGk+CjwvdWw+CjxwPlRlc3RzIGFyZSBldmFsdWF0ZWQgaW4gYSBsb2dpY2FsIE9SIGZhc2hpb24gaW4gb3JkZXIgYXMgZm9sbG93cyBpcCBhZGRyZXNzLCBncm91cCwgYW5kIHVzZXIuICBUaGUgZmlyc3Qgc3VjY2Vzc2Z1bGwgdGVzdCB3aWxsIHJlc3VsdCBpbiB0aGUgZXhwcmVzc2lvbiBldmFsdWF0aW9uZyB0byB0cnVlPC9wPgo8aDM+SG93IERvIEkgVXNlIEl0IChtZXRob2QgMiA6IHNtYXJ0eSk8L2gzPgo8cHJlPgp7Y21zX21vZHVsZSBtb2R1bGU9Q3VzdG9tQ29udGVudH0Ke2lmIGN1c3RvbWNvbnRlbnRfbG9nZ2VkaW59CiAgV2VsY29tZSAmbHQ7YiZndDt7Y3VzdG9tY29udGVudF9sb2dpbm5hbWV9Jmx0Oy9iJmd0OyZsdDtici8mZ3Q7CnsvZWxzZX0KICAmbHQ7aDEmZ3Q7WW91IGFyZSBub3QgYXV0aG9yaXplZCB0byB2aWV3IHRoaXMgZGF0YSZsdDsvaDEmZ3Q7CnsvaWZ9CjwvcHJlPgo8cD5Bbnkgc21hcnR5IGNvbXBhdGlibGUgZXhwcmVzc2lvbnMgb3IgbG9naWMgY2FuIGJlIHVzZWQgd2l0aCB0aGUgYXZhaWxhYmxlIHZhcmlhYmxlcy4gIFVzaW5nIHRoaXMgc3ludGF4LCBleHByZXNzaW9ucyBtYXkgYmUgbmVzdGVkLCBvciBjb21wbGV4IGxvZ2ljIHVzZWQuPC9wPgo8aDQ+QXZhaWxhYmxlIHZhcmlhYmxlczo8L2g0Pgo8dWw+CjxsaT48cD48ZW0+Y3VzdG9tY29udGVudF9pcDwvZW0+IC0gVGhlIHJlbW90ZSBJUCBhZGRyZXNzPC9wPjwvbGk+CjxsaT48cD48ZW0+Y3VzdG9tY29udGVudF9sb2dnZWRpbjwvZW0+IC0gQSBib29sZWFuIGluZGljYXRpbmcgd2V0aGVyIHRoZSB1c2VyIGlzIGxvZ2dlZCBpbiBvciBub3Q8L3A+PC9saT4KPGxpPjxwPjxlbT5jdXN0b21jb250ZW50X2xvZ2lubmFtZTwvZW0+IC0gVGhlIG5hbWUgb2YgdGhlIGN1cnJlbnRseSBsb2dnZWQgaW4gdXNlcjwvcD48L2xpPgo8bGk+PHA+PGVtPmN1c3RvbWNvbnRlbnRfZ3JvdXBjb3VudDwvZW0+IC0gQSBjb3VudCBvZiB0aGUgbnVtYmVyIG9mIGdyb3VwcyB0aGlzIHVzZXIgaXMgYSBtZW1iZXIgb2Y8L3A+PC9saT4KPGxpPjxwPjxlbT5jdXN0b21jb250ZW50X2dyb3VwczwvZW0+IC0gQSBzdHJpbmcgY29udGFpbmluZyB0aGUgZ3JvdXAgbmFtZXMgb2YgYWxsIG1lbWJlciBncm91cHM8L3A+PC9saT4KPGxpPjxwPjxlbT5jdXN0b21jb250ZW50X21lbWJlcm9mXyo8L2VtPiAtIEEgc2VyaWVzIG9mIGJvb2xlYW4gdmFyaWFibGVzIGluZGljYXRpbmcgZ3JvdXAgbWVtYmVyc2hpcC4gIGkuZS46IGN1c3RvbWNvbnRlbnRfbWVtYmVyb2Zfc3RhZmYsIGN1c3RvbWNvbnRlbnRfbWVtYmVyb2ZfdXNlcnMsIGV0Yy4gIE5vIHZhcmlhYmxlcyBhcmUgZGVmaW5lZCBmb3IgZ3JvdXBzIHRoYXQgdGhpcyB1c2VyIGlzIG5vdCBhIG1lbWJlciBvZi48L3A+PC9saT4KPC91bD4KPGgzPkNvcHlyaWdodCBhbmQgTGljZW5zZTwvaDM+CjxwPkNvcHlyaWdodCAmY29weTsgMjAwNSwgUm9iZXJ0IENhbXBiZWxsIDxhIGhyZWY9Im1haWx0bzpyb2JAdGVjaGNvbS5keW5kbnMub3JnIj4mbHQ7cm9iQHRlY2hjb20uZHluZG5zLm9yZyZndDs8L2E+LiBBbGwgUmlnaHRzIEFyZSBSZXNlcnZlZC48L3A+CjxwPlRoaXMgbW9kdWxlIGhhcyBiZWVuIHJlbGVhc2VkIHVuZGVyIHRoZSA8YSBocmVmPSJodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvbGljZW5zZXMuaHRtbCNHUEwiPkdOVSBQdWJsaWMgTGljZW5zZTwvYT4uIFlvdSBtdXN0IGFncmVlIHRvIHRoaXMgbGljZW5zZSBiZWZvcmUgdXNpbmcgdGhlIG1vZHVsZS48L3A+CjxoMz5EZXBlbmRlbmNpZXM8L2gzPjx1bD48bGk+RnJvbnRFbmRVc2VycyA9Jmd0OyAwLjAuMTwvbGk+PC91bD4=</help>
	<about>PGJyIC8+QXV0aG9yOiBjYWxndXkxMDAwICZsdDtyb2JAdGVjaGNvbS5keW5kbnMub3JnJmd0OzxiciAvPjxiciAvPlZlcnNpb246IDEuNC4xPGJyIC8+PGJyIC8+Q2hhbmdlIEhpc3Rvcnk6PGJyIC8+PHVsPjxsaT5WZXJzaW9uIDEuMC4gMTQgU2VwdGVtYmVyIDIwMDUuIEluaXRpYWwgUmVsZWFzZS48L2xpPjwvdWw+Cjx1bD4KPGxpPlZlcnNpb24gMS4xLiAgLSBTZXB0ZW1iZXIgMjAwNS4gQWRkZWQgc3RhcnRpZi9lbHNlL2VuZGlmLCBhbmQgc2VhcmNoIHRocm91Z2ggbXVsdGlwbGUgZ3JvdXBzIGFuZCB1c2Vycy48L2xpPgo8bGk+VmVyc2lvbiAxLjIuICAtIFNlcHRlbWJlciAyMDA1LiBBZGRlZCBsb2dnZWRpbiBvcHRpb25hbCBwYXJhbWV0ZXI8L2xpPgo8bGk+VmVyc2lvbiAxLjMgICAtIE9jdG9iZXIgICAyMDA1LiBDaGFuZ2VkIHRvIHVzZSBGcm9udEVuZFVzZXJzIGluc3RlYWQgb2YgVXNlcklEPC9saT4KPGxpPlZlcnNpb24gMS4zLjEgLSBOb3ZlbWJlciAyMDA1LiBWZXJ5IG1pbm9yIGJ1Z2ZpeCB0byB0aGUgcGFyYW1ldGVyIHBhcnNpbmc8L2xpPgo8bGk+VmVyc2lvbiAxLjQuMCAtIEphbnVhcnksIDIwMDYuCjxwPkFkZGVkIHNtYXJ0eSBjb21wYXRpYmxlIHZhcmlhYmxlczwvcD48L2xpPgo8bGk+VmVyc2lvbiAxLjQuMSAtIE1heSwgMjAwNi4KPHA+U21hcnR5IHZhcmlhYmxlcyBub3cgd29yayBpbiAwLjEzYjI8L3A+CjxwPk5vdyByZXF1aXJlIENNUyAwLjEzYjIgYXMgYSBtaW5pbXVtPC9wPgo8cD5VcGRhdGVkIHRoZSBoZWxwPC9wPgo8L2xpPgo8L3VsPjxiciAvPg==</about>
	<description>This module provides the ability to specify different content by group or user name</description>
	<requires>
	  <requiredname>FrontEndUsers</requiredname>
	  <requiredversion>0.0.1</requiredversion>
	</requires>
	<file>
	  <filename>/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/CustomContent.module.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBNb2R1bGU6IEN1c3RvbUNvbnRlbnQKIyBWZXJzaW9uOiAxLjQuMSwgUm9iZXJ0IENhbXBiZWxsIDxyb2JAdGVjaGNvbS5keW5kbnMub3JnPgojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgQ01TIC0gQ01TIE1hZGUgU2ltcGxlIGlzIChjKSAyMDA1IGJ5IFRlZCBLdWxwICh3aXNoeUBjbXNtYWRlc2ltcGxlLm9yZykKIyBUaGlzIHByb2plY3QncyBob21lcGFnZSBpczogaHR0cDovL3d3dy5jbXNtYWRlc2ltcGxlLm9yZwojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMKIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQojIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKIyBPciByZWFkIGl0IG9ubGluZTogaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2xpY2Vuc2VzLmh0bWwjR1BMCiMKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovKiBZb3VyIGluaXRpYWwgQ2xhc3MgZGVjbGFyYXRpb24uIFRoaXMgZmlsZSdzIG5hbWUgbXVzdAogICBiZSAiW2NsYXNzJ3MgbmFtZV0ubW9kdWxlLnBocCIsIG9yLCBpbiB0aGlzIGNhc2UsCiAgIFNrZWxldG9uLm1vZHVsZS5waHAKKi8gCmNsYXNzIEN1c3RvbUNvbnRlbnQgZXh0ZW5kcyBDTVNNb2R1bGUKewogIHZhciAkc3RhcnRfbWFya2VyPSI8IS0tY3VzdG9tQ29udGVudDoiOwogIHZhciAkZW5kX21hcmtlcj0iLS0+IjsKICB2YXIgJHN1YnN0aXR1dGVfY29udGVudCA9IGZhbHNlOwoKICBmdW5jdGlvbiBDdXN0b21Db250ZW50KCkKICB7CiAgICAvL3RvZG8gY2FsbCB0aGUgcGFyZW50IGNvbnN0cnVjdG9yCgogICAgLy8gaG9wZWZ1bGx5IHN0b3AgdGhpcyBwYWdlIGZyb20gY2FjaGluZyBhbGwgdG9nZXRoZXIuCiAgICBnbG9iYWwgJGdDbXM7IAogICAgJHBhZ2VpbmZvID0mICRnQ21zLT52YXJpYWJsZXNbJ3BhZ2VpbmZvJ107ICAKICAgICRwYWdlaW5mby0+Y2FjaGFibGUgPSBmYWxzZTsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIEdldE5hbWUoKQogICBtdXN0IHJldHVybiB0aGUgZXhhY3QgY2xhc3MgbmFtZSBvZiB0aGUgbW9kdWxlLgogICBJZiB0aGVzZSBkbyBub3QgbWF0Y2gsIGJhZCB0aGluZ3MgaGFwcGVuLgogICAKICAgVHNvIGhpcyBpcyB0aGUgbmFtZSB0aGF0J3Mgc2hvd24gaW4gdGhlIG1haW4gTW9kdWxlcwogICBwYWdlIGluIHRoZSBBZG1pbi4KICAgCiAgIElmIHlvdSB3YW50IHRvIGJlIHNhZmUsIHlvdSBjYW4ganVzdCByZXBsYWNlIHRoZSBib2R5CiAgIG9mIHRoaXMgZnVuY3Rpb24gd2l0aDoKICAgcmV0dXJuIGdldF9jbGFzcygkdGhpcyk7IAogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGZ1bmN0aW9uIEdldE5hbWUoKQogIHsKICAgIHJldHVybiAnQ3VzdG9tQ29udGVudCc7CiAgfQogIAogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIEdldEZyaWVuZGx5TmFtZSgpCiAgIFRoaXMgY2FuIHJldHVybiBhbnkgc3RyaW5nLCBwcmVmZXJhYmx5IGEgbG9jYWxpemVkIG5hbWUKICAgb2YgdGhlIG1vZHVsZS4gVGhpcyBpcyB0aGUgbmFtZSB0aGF0J3Mgc2hvd24gaW4gdGhlCiAgIEFkbWluIE1lbnVzIGFuZCBzZWN0aW9uIHBhZ2VzIChpZiB0aGUgbW9kdWxlIGhhcyBhbiBhZG1pbgogICBjb21wb25lbnQpLgoJICAgCiAgIFNlZSB0aGUgbm90ZSBvbiBsb2NhbGl6YXRpb24gYXQgdGhlIHRvcCBvZiB0aGlzIGZpbGUuCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgZnVuY3Rpb24gR2V0RnJpZW5kbHlOYW1lKCkKICB7CiAgICByZXR1cm4gJHRoaXMtPkxhbmcoJ2ZyaWVuZGx5bmFtZScpOwogIH0KICAKICAKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBHZXRWZXJzaW9uKCkKICAgVGhpcyBjYW4gcmV0dXJuIGFueSBzdHJpbmcsIHByZWZlcmFibHkgYSBudW1iZXIgb3IKICAgc29tZXRoaW5nIHRoYXQgbWFrZXMgc2Vuc2UgZm9yIGRlc2lnbmF0aW5nIGEgdmVyc2lvbi4KICAgVGhlIENNUyB3aWxsIHVzZSB0aGlzIHRvIGlkZW50aWZ5IHdoZXRoZXIgb3Igbm90CiAgIHRoZSBpbnN0YWxsZWQgdmVyc2lvbiBvZiB0aGUgbW9kdWxlIGlzIGN1cnJlbnQsIGFuZAogICB0aGUgbW9kdWxlIHdpbGwgdXNlIGl0IHRvIGZpZ3VyZSBvdXQgaG93IHRvIHVwZ3JhZGUKICAgaXRzZWxmIGlmIHJlcXVlc3RlZC4JICAgCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgZnVuY3Rpb24gR2V0VmVyc2lvbigpCiAgewogICAgcmV0dXJuICcxLjQuMSc7CiAgfQogIAogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIE1pbmltdW1DTVNWZXJzaW9uKCkKICAgUmV0dXJuIHRoZSBtaW5pbXVtIHZlcnNpb24gb2YgQ01TIHRoYXQgdGhpcyBtb2R1bGUgcmVxdWlyZXMuCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgZnVuY3Rpb24gTWluaW11bUNNU1ZlcnNpb24oKQogIHsKICAgIHJldHVybiAnMC4xMy1iZXRhMic7CiAgfQoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBHZXRIZWxwKCkKICAgVGhpcyByZXR1cm5zIEhUTUwgaW5mb3JtYXRpb24gb24gdGhlIG1vZHVsZS4KICAgVHlwaWNhbGx5LCB5b3UnbGwgd2FudCB0byBpbmNsdWRlIGluZm9ybWF0aW9uIG9uIGhvdyB0bwogICB1c2UgdGhlIG1vZHVsZS4KICAgCiAgIFNlZSB0aGUgbm90ZSBvbiBsb2NhbGl6YXRpb24gYXQgdGhlIHRvcCBvZiB0aGlzIGZpbGUuCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgZnVuY3Rpb24gR2V0SGVscCgpCiAgewogICAgcmV0dXJuICR0aGlzLT5MYW5nKCdoZWxwJyk7CiAgfQogIAoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBHZXRBdXRob3IoKQogICBUaGlzIHJldHVybnMgYSBzdHJpbmcgdGhhdCBpcyBwcmVzZW50ZWQgaW4gdGhlIE1vZHVsZQogICBBZG1pbiBpZiB5b3UgY2xpY2sgb24gdGhlICJBYm91dCIgbGluay4KICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBmdW5jdGlvbiBHZXRBdXRob3IoKQogIHsKICAgIHJldHVybiAnY2FsZ3V5MTAwMCc7CiAgfQogIAoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBHZXRBdXRob3JFbWFpbCgpCiAgIFRoaXMgcmV0dXJucyBhIHN0cmluZyB0aGF0IGlzIHByZXNlbnRlZCBpbiB0aGUgTW9kdWxlCiAgIEFkbWluIGlmIHlvdSBjbGljayBvbiB0aGUgIkFib3V0IiBsaW5rLiBJdCBoZWxwcyB1c2VycwogICBvZiB5b3VyIG1vZHVsZSBnZXQgaW4gdG91Y2ggd2l0aCB5b3UgdG8gc2VuZCBidWcgcmVwb3J0cywKICAgcXVlc3Rpb25zLCBjYXNlcyBvZiBiZWVyLCBhbmQvb3IgbGFyZ2Ugc3VtcyBvZiBtb25leS4KICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBmdW5jdGlvbiBHZXRBdXRob3JFbWFpbCgpCiAgewogICAgcmV0dXJuICdyb2JAdGVjaGNvbS5keW5kbnMub3JnJzsKICB9CiAgCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIEdldENoYW5nZUxvZygpCiAgIFRoaXMgcmV0dXJucyBhIHN0cmluZyB0aGF0IGlzIHByZXNlbnRlZCBpbiB0aGUgbW9kdWxlCiAgIEFkbWluIGlmIHlvdSBjbGljayBvbiB0aGUgQWJvdXQgbGluay4gSXQgaGVscHMgdXNlcnMKICAgZmlndXJlIG91dCB3aGF0J3MgY2hhbmdlZCBiZXR3ZWVuIHJlbGVhc2VzLgogICBTZWUgdGhlIG5vdGUgb24gbG9jYWxpemF0aW9uIGF0IHRoZSB0b3Agb2YgdGhpcyBmaWxlLgogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGZ1bmN0aW9uIEdldENoYW5nZUxvZygpCiAgewogICAgcmV0dXJuICR0aGlzLT5MYW5nKCdjaGFuZ2Vsb2cnKTsKICB9CgoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBJc1BsdWdpbk1vZHVsZSgpCiAgIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0cnVlIG9yIGZhbHNlLCBkZXBlbmRpbmcgdXBvbgogICB3aGV0aGVyIHVzZXJzIGNhbiBpbmNsdWRlIHRoZSBtb2R1bGUgaW4gYSBwYWdlIG9yCiAgIHRlbXBsYXRlIHVzaW5nIGEgc21hcnR5IHRhZyBvZiB0aGUgZm9ybQogICB7Y21zX21vZHVsZSBtb2R1bGU9J0N1c3RvbUNvbnRlbnQnIHBhcmFtMT12YWwgcGFyYW0yPXZhbC4uLn0KCSAgIAogICBJZiB5b3VyIG1vZHVsZSBkb2VzIG5vdCBnZXQgaW5jbHVkZWQgaW4gcGFnZXMgb3IKICAgdGVtcGxhdGVzLCByZXR1cm4gImZhbHNlIiBoZXJlLgogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGZ1bmN0aW9uIElzUGx1Z2luTW9kdWxlKCkKICB7CiAgICByZXR1cm4gdHJ1ZTsKICB9CgoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBIYXNBZG1pbigpCiAgIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIGJvb2xlYW4gdmFsdWUsIGRlcGVuZGluZyBvbgogICB3aGV0aGVyIHlvdXIgbW9kdWxlIGFkZHMgYW55dGhpbmcgdG8gdGhlIEFkbWluIGFyZWEgb2YKICAgdGhlIHNpdGUuIEZvciB0aGUgcmVzdCBvZiB0aGVzZSBjb21tZW50cywgSSdsbCBiZSBjYWxsaW5nCiAgIHRoZSBhZG1pbiBwYXJ0IG9mIHlvdXIgbW9kdWxlIHRoZSAiQWRtaW4gUGFuZWwiIGZvcgogICB3YW50IG9mIGEgYmV0dGVyIHRlcm0uCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgZnVuY3Rpb24gSGFzQWRtaW4oKQogIHsKICAgIHJldHVybiBmYWxzZTsKICB9CiAgCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIEdldEFkbWluRGVzY3JpcHRpb24oKQogICBJZiB5b3VyIG1vZHVsZSBkb2VzIGhhdmUgYW4gQWRtaW4gUGFuZWwsIHlvdQogICBjYW4gaGF2ZSBpdCByZXR1cm4gYSBkZXNjcmlwdGlvbiBzdHJpbmcgdGhhdCBnZXRzIHNob3duCiAgIGluIHRoZSBBZG1pbiBTZWN0aW9uIHBhZ2UgdGhhdCBjb250YWlucyB0aGUgbW9kdWxlLgogICAKICAgU2VlIHRoZSBub3RlIG9uIGxvY2FsaXphdGlvbiBhdCB0aGUgdG9wIG9mIHRoaXMgZmlsZS4KICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBmdW5jdGlvbiBHZXRBZG1pbkRlc2NyaXB0aW9uKCkKICB7CiAgICByZXR1cm4gJHRoaXMtPkxhbmcoJ21vZGRlc2NyaXB0aW9uJyk7CiAgfQogIAoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBHZXREZXBlbmRlbmNpZXMoKQogICBZb3VyIG1vZHVsZSBtYXkgbmVlZCBhbm90aGVyIG1vZHVsZSB0byBhbHJlYWR5IGJlIGluc3RhbGxlZAogICBiZWZvcmUgeW91IGNhbiBpbnN0YWxsIGl0LgogICBUaGlzIG1ldGhvZCByZXR1cm5zIGEgbGlzdCBvZiB0aG9zZSBkZXBlbmRlbmNpZXMgYW5kCiAgIG1pbmltdW0gdmVyc2lvbiBudW1iZXJzIHRoYXQgdGhpcyBtb2R1bGUgcmVxdWlyZXMuCiAgIAogICBJdCBzaG91bGQgcmV0dXJuIGFuIGhhc2gsIGVnLgogICByZXR1cm4gYXJyYXkoJ3NvbWVtb2R1bGUnPT4nMS4wJywgJ290aGVybW9kdWxlJz0+JzEuMScpOwogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGZ1bmN0aW9uIEdldERlcGVuZGVuY2llcygpCiAgewogICAgcmV0dXJuIGFycmF5KCdGcm9udEVuZFVzZXJzJz0+JzAuMC4xJyk7CiAgfQogIAoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBJbnN0YWxsKCkKICAgV2hlbiB5b3VyIG1vZHVsZSBpcyBpbnN0YWxsZWQsIHlvdSBtYXkgbmVlZCB0byBkbyBzb21lCiAgIHNldHVwLiBUeXBpY2FsIHRoaW5ncyB0aGF0IGhhcHBlbiBoZXJlIGFyZSB0aGUgY3JlYXRpb24KICAgYW5kIHByZXBvcHVsYXRpb24gb2YgZGF0YWJhc2UgdGFibGVzLCBkYXRhYmFzZSBzZXF1ZW5jZXMsCiAgIHBlcm1pc3Npb25zLCBwcmVmZXJlbmNlcywgZXRjLgogICAKICAgVGhpcyBleGFtcGxlIGNyZWF0ZXMgYSBTa2VsZXRvbiBkYXRhYmFzZSB0YWJsZSBhbmQKICAgc2VxdWVuY2UsIGl0IGNyZWF0ZXMgdGhlICJVc2UgU2tlbGV0b24iIHBlcm1pc3Npb24sCiAgIGFuZCBzZXRzIHRoZSAiU2luZyBMb3VkbHkiIHByZWZlcmVuY2UuCiAgIAogICBUaGUgZGF0YWJhc2UgaXMgbm90IGFjdHVhbGx5IHVzZWQgaW4gdGhpcyBleGFtcGxlOwogICBjaGVjayBhbnkgb25lIG9mIHRoZSBvdGhlciBtb2R1bGVzIGlmIHlvdSB3YW50IHRvIHNlZQogICBtZXRob2QgY29kZSB0aGF0IHVzZXMgdGhlIGRhdGFiYXNlLgogICAKICAgRm9yIGluZm9ybWF0aW9uIG9uIHRoZSBjcmVhdGlvbiBvZiBkYXRhYmFzZSB0YWJsZXMsCiAgIGNoZWNrIG91dCB0aGUgQURPREIgRGF0YSBEaWN0aW9uYXJ5IHBhZ2UgYXQKICAgaHR0cDovL3BocGxlbnMuY29tL2xlbnMvYWRvZGIvZG9jcy1kYXRhZGljdC5odG0KICAgCiAgIFRoaXMgZnVuY3Rpb24gY2FuIHJldHVybiBhICJmYWxzZSIgaW4gY2FzZSBvZiBhbnkgZXJyb3IsCiAgIGFuZCBDTVMgd2lsbCBub3QgY29uc2lkZXIgdGhlIG1vZHVsZSBpbnN0YWxsZWQuCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgZnVuY3Rpb24gSW5zdGFsbCgpCiAgewogICAgLy8gbm90aGluZyB0byBkbyBoZXJlCiAgfQoKICAKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBJbnN0YWxsUG9zdE1lc3NhZ2UoKQogICBBZnRlciBpbnN0YWxsYXRpb24sIHRoZXJlIG1heSBiZSB0aGluZ3MgeW91IHdhbnQgdG8KICAgY29tbXVuaWNhdGUgdG8geW91ciBhZG1pbi4gVGhpcyBmdW5jdGlvbiByZXR1cm5zIGEKICAgc3RyaW5nIHdoaWNoIHdpbGwgYmUgZGlzcGxheWVkLgogICAKICAgU2VlIHRoZSBub3RlIG9uIGxvY2FsaXphdGlvbiBhdCB0aGUgdG9wIG9mIHRoaXMgZmlsZS4KICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBmdW5jdGlvbiBJbnN0YWxsUG9zdE1lc3NhZ2UoKQogIHsKICAgIHJldHVybiAkdGhpcy0+TGFuZygncG9zdGluc3RhbGwnKTsKICB9CgogIAogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIFVuaW5zdGFsbFBvc3RNZXNzYWdlKCkKICAgQWZ0ZXIgcmVtb3ZpbmcgYSBtb2R1bGUsIHRoZXJlIG1heSBiZSB0aGluZ3MgeW91IHdhbnQgdG8KICAgY29tbXVuaWNhdGUgdG8geW91ciBhZG1pbi4gVGhpcyBmdW5jdGlvbiByZXR1cm5zIGEKICAgc3RyaW5nIHdoaWNoIHdpbGwgYmUgZGlzcGxheWVkLgogICAKICAgU2VlIHRoZSBub3RlIG9uIGxvY2FsaXphdGlvbiBhdCB0aGUgdG9wIG9mIHRoaXMgZmlsZS4KICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBmdW5jdGlvbiBVbmluc3RhbGxQb3N0TWVzc2FnZSgpCiAgewogICAgcmV0dXJuICR0aGlzLT5MYW5nKCdwb3N0dW5pbnN0YWxsJyk7CiAgfQogIAoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBVcGdyYWRlKCkKICAgSWYgeW91ciBtb2R1bGUgdmVyc2lvbiBudW1iZXIgZG9lcyBub3QgbWF0Y2ggdGhlIHZlcnNpb24KICAgbnVtYmVyIG9mIHRoZSBpbnN0YWxsZWQgbW9kdWxlLCB0aGUgQ01TIEFkbWluIHdpbGwgZ2l2ZQogICB5b3UgYSBjaGFuY2UgdG8gdXBncmFkZSB0aGUgbW9kdWxlLiBUaGlzIGlzIHRoZSBmdW5jdGlvbgogICB0aGF0IGFjdHVhbGx5IGhhbmRsZXMgdGhlIHVwZ3JhZGUuCiAgIElkZWFsbHksIHRoaXMgZnVuY3Rpb24gc2hvdWxkIGhhbmRsZSB1cGdyYWRlcyBpbmNyZW1lbnRhbGx5LAogICBzbyB5b3UgY291bGQgdXBncmFkZSBmcm9tIHZlcnNpb24gMC4wLjEgdG8gMTAuNS43IHdpdGgKICAgYSBzaW5nbGUgY2FsbC4gRm9yIGEgZ3JlYXQgZXhhbXBsZSBvZiB0aGlzLCBzZWUgdGhlIE5ld3MKICAgbW9kdWxlIGluIHRoZSBzdGFuZGFyZCBDTVMgaW5zdGFsbC4KICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBmdW5jdGlvbiBVcGdyYWRlKCRvbGR2ZXJzaW9uLCAkbmV3dmVyc2lvbikKICB7CiAgICAvLyBub3RoaW5nIHRvIGRvIGhlcmUKICB9CiAgCgkKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBVbmluc3RhbGwoKQogICBTb21ldGltZXMsIGFuIGV4Y2VwdGlvbmFsbHkgdW5lbmxpZ2h0ZW5lZCBvciBpZ25vcmFudAogICBhZG1pbiB3aWxsIHdpc2ggdG8gdW5pbnN0YWxsIHlvdXIgbW9kdWxlLiBXaGlsZSBpdAogICB3b3VsZCBiZSBiZXN0IHRvIGxheSBpbnRvIHRoZXNlIGlkaW90cyB3aXRoIGEgY2x1ZXN0aWNrLAogICB3ZSB3aWxsIGRvIHRoZSBtYWduYW5pbW91cyB0aGluZyBhbmQgcmVtb3ZlIHRoZSBtb2R1bGUKICAgYW5kIGNsZWFuIHVwIHRoZSBkYXRhYmFzZSwgcGVybWlzc2lvbnMsIGFuZCBwcmVmZXJlbmNlcwogICB0aGF0IGFyZSBzcGVjaWZpYyB0byBpdC4KICAgVGhpcyBpcyB0aGUgbWV0aG9kIHdoZXJlIHdlIGRvIHRoaXMuCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgZnVuY3Rpb24gVW5pbnN0YWxsKCkKICB7CiAgICAvLyBub3RoaW5nIHRvIGRvIGhlcmUKICB9CgoKICAgICAgIAogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIF90ZXN0aXAoJHJhbmdlLCRpcCkKICAgTk9UIFBBUlQgT0YgVEhFIE1PRFVMRSBBUEkKCiAgIFRoaXMgaXMgYSBmdW5jdGlvbiB0byBtYXRjaCBhbiBJUCBhZGRyZXNzIGFnYWluc3QgYW4gCiAgIGFkZHJlc3MgcmFuZ2Ugc3BlY2lmaWNhdGlvbi4KICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBmdW5jdGlvbiBfdGVzdGlwKCRyYW5nZSwkaXApIAogIHsKICAgICRyZXN1bHQgPSAxOwoKICAgICMgSVAgUGF0dGVybiBNYXRjaGVyCiAgICAjIEouQWRhbXMgPGpuYUByZXRpbmEubmV0PgogICAgIwogICAgIyBNYXRjaGVzOgogICAgIwogICAgIyB4eHgueHh4Lnh4eC54eHggICAgICAgIChleGFjdCkKICAgICMgeHh4Lnh4eC54eHguW3l5eS16enpdICAocmFuZ2UpCiAgICAjIHh4eC54eHgueHh4Lnh4eC9ubiAgICAobm4gPSAjIGJpdHMsIGNpc2NvIHN0eWxlIC0tIGkuZS4gLzI0ID0gY2xhc3MgQykKICAgICMKICAgICMgRG9lcyBub3QgbWF0Y2g6CiAgICAjIHh4eC54eHgueHh4Lnh4W3l5eS16enpdICAocmFuZ2UsIHBhcnRpYWwgb2N0ZXRzIG5vdCBzdXBwb3J0ZWQpCgogICAgaWYgKGVyZWcoIihbMC05XSspXC4oWzAtOV0rKVwuKFswLTldKylcLihbMC05XSspLyhbMC05XSspIiwkcmFuZ2UsJHJlZ3MpKSB7CgogICAgICAjIHBlcmZvcm0gYSBtYXNrIG1hdGNoCiAgICAgICRpcGwgPSBpcDJsb25nKCRpcCk7CiAgICAgICRyYW5nZWwgPSBpcDJsb25nKCRyZWdzWzFdIC4gIi4iIC4gJHJlZ3NbMl0gLiAiLiIgLiAkcmVnc1szXSAuICIuIiAuICRyZWdzWzRdKTsKICAgICAgCiAgICAgICRtYXNrbCA9IDA7CiAgICAgIAogICAgICBmb3IgKCRpID0gMDsgJGk8IDMxOyAkaSsrKSB7CglpZiAoJGkgPCAkcmVnc1s1XS0xKSB7CgkgICRtYXNrbCA9ICRtYXNrbCArIHBvdygyLCgzMC0kaSkpOwoJfQogICAgICB9CiAgICAgIAogICAgICBpZiAoKCRtYXNrbCAmICRyYW5nZWwpID09ICgkbWFza2wgJiAkaXBsKSkgewoJcmV0dXJuIDE7CiAgICAgIH0gZWxzZSB7CglyZXR1cm4gMDsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgCiAgICAgICMgcmFuZ2UgYmFzZWQKICAgICAgJG1hc2tvY3RzID0gc3BsaXQoIlwuIiwkcmFuZ2UpOwogICAgICAkaXBvY3RzID0gc3BsaXQoIlwuIiwkaXApOwogICAgICAKICAgICAgIyBwZXJmb3JtIGEgcmFuZ2UgbWF0Y2gKICAgICAgZm9yICgkaT0wOyAkaTw0OyAkaSsrKSB7CglpZiAoZXJlZygiXFsoWzAtOV0rKVwtKFswLTldKylcXSIsJG1hc2tvY3RzWyRpXSwkcmVncykpIHsKCSAgaWYgKCAoJGlwb2N0c1skaV0gPiAkcmVnc1syXSkgfHwgKCRpcG9jdHNbJGldIDwgJHJlZ3NbMV0pKSB7CgkgICAgJHJlc3VsdCA9IDA7CgkgIH0KCX0KCWVsc2UKCSAgewoJICAgIGlmICgkbWFza29jdHNbJGldIDw+ICRpcG9jdHNbJGldKSB7CgkgICAgICAkcmVzdWx0ID0gMDsKCSAgICB9CgkgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuICRyZXN1bHQ7CiAgfQoKCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgQSBmdW5jdGlvbiB0byBhZGQgYW4gYXNzb2NpYXRpb24gdG8gYW4gYXJyYXkKICAgTk9UIFBBUlQgT0YgVEhFIE1PRFVMRSBBUEkKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBmdW5jdGlvbiBfYWRkQXJyYXkoJiRhcnJheSwgJGtleSwgJHZhbCkKICB7CiAgICAkdG1wID0gYXJyYXkoJGtleSA9PiAkdmFsKTsKICAgICRhcnJheSA9IGFycmF5X21lcmdlKCRhcnJheSwkdG1wKTsKICB9CgoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBBIGZ1bmN0aW9uIHRvIGV2YWx1YXRlIHBhcmFtZXRlcnMgYWdhaW5zdCBjdXJyZW50IHVzZXIgc2V0dGluZ3MKICAgTk9UIFBBUlQgT0YgVEhFIE1PRFVMRSBBUEkKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBmdW5jdGlvbiBfZXZhbHVhdGUoJiRwYXJtcykKICB7CiAgICAkbW9kdWxlID0gJHRoaXMtPkdldE1vZHVsZUluc3RhbmNlKCdGcm9udEVuZFVzZXJzJyk7CiAgICBpZiggISRtb2R1bGUgKSByZXR1cm4gRkFMU0U7CgogICAgLy8gaGVyZSB3ZSBjaGVjayB0aGUgcGVybWlzc2lvbnMsIGV0Yy4KICAgICR2YWxpZCA9IDA7CiAgICAkdWlkID0gJG1vZHVsZS0+TG9nZ2VkSW5JZCgpOwogICAgaWYoIGlzc2V0KCAkcGFybXNbJ2lwJ10gKSApCiAgICAgIHsKCWZvcmVhY2goICRwYXJtc1snaXAnXSBhcyAkaXAgKQoJewoJICBpZiggJHRoaXMtPl90ZXN0aXAoICRpcCwgZ2V0ZW52KCJSRU1PVEVfQUREUiIgKSApICkKCSAgICB7CgkgICAgICAvLyB2YWxpZCBpcAoJICAgICAgJHZhbGlkID0gMTsKCSAgICAgIGJyZWFrOwoJICAgIH0KCX0KICAgICAgfQogICAgaWYoICRtb2R1bGUtPkxvZ2dlZEluKCkgKQogICAgICB7CglpZiggJHZhbGlkID09IDAgJiYgaXNzZXQoICRwYXJtc1snZ3JvdXAnXSApICkKCSAgewoJICAgIGZvcmVhY2goICRwYXJtc1snZ3JvdXAnXSBhcyAkZyApIAoJICAgIHsKCSAgICAgICRnaWQgPSAkbW9kdWxlLT5HZXRHcm91cElEKCRnKTsKCSAgICAgIGlmKCAkbW9kdWxlLT5NZW1iZXJPZkdyb3VwKCR1aWQsICRnaWQpICkKCQl7CgkJICAvLyB5ZXAuLi4gaGUncyB2YWxpZAoJCSAgJHZhbGlkID0gMTsKCQkgIGJyZWFrOwoJCX0KICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgIGVjaG8gIkRFQlVHOiB0aGlzIHVzZXIoJHVpZCkgaXMgbm90IGEgbWVtYmVyIG9mIGdyb3VwICRnPGJyLz4iOwogICAgICAgICAgICAgICAgfQoJICAgIH0KCSAgfQoJaWYoICR2YWxpZCA9PSAwICYmIGlzc2V0KCAkcGFybXNbJ3VzZXInXSApICkKCSAgewoJICAgIGZvcmVhY2goICRwYXJtc1sndXNlciddIGFzICR1ICkKCSAgICB7CgkgICAgICBpZiggc3RyY2FzZWNtcCgkdSwkbW9kdWxlLT5Mb2dnZWRJbk5hbWUoKSkgPT0gMCApCgkJewoJCSAgLy8geWVwLi4uIGhlJ3MgdmFsaWQKCQkgICR2YWxpZCA9IDE7CgkJICBicmVhazsKCQl9CgkgICAgfQoJICB9CglpZiggJHZhbGlkID09IDAgJiYgaXNzZXQoICRwYXJtc1snbG9nZ2VkaW4nXSApICkKCSAgewoJICAgICR2YWxpZCA9IDE7CgkgIH0KICAgICAgfQoKICAgIGlmKCAkdmFsaWQgPT0gMCApIHJldHVybiBGQUxTRTsKICAgIHJldHVybiBUUlVFOwogIH0KCiAgCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgRWRpdCB0aGUgY29udGVudCBiZWZvcmUgcmVuZGVyaW5nCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgZnVuY3Rpb24gQ29udGVudFByZUNvbXBpbGUoJiRjb250ZW50KQogIHsKICAgICRtb2R1bGUgPSAkdGhpcy0+R2V0TW9kdWxlSW5zdGFuY2UoJ0Zyb250RW5kVXNlcnMnKTsKICAgIGlmKCAhJG1vZHVsZSApCiAgICAgIHsKCWVjaG8gIkVSUk9SPGJyLz4iOwoJcmV0dXJuOwogICAgICB9CiAgICBnbG9iYWwgJGdDbXM7CiAgICAkc21hcnR5ID0mICRnQ21zLT5nZXRTbWFydHkoKTsKICAgICRsb2dnZWRpbiA9IDA7CiAgICAkbG9naW5uYW1lID0gJ25vYm9keSc7CiAgICAkc21hcnR5LT5hc3NpZ24oJ2N1c3RvbWNvbnRlbnRfbG9nZ2VkaW4nLCRtb2R1bGUtPkxvZ2dlZEluSWQoKSk7CiAgICAkc21hcnR5LT5hc3NpZ24oJ2N1c3RvbWNvbnRlbnRfaXAnLCBnZXRlbnYoJ1JFTU9URV9BRERSJykgKTsKICAgIGlmKCAkbW9kdWxlLT5Mb2dnZWRJbklkKCkgPiAwICkKICAgICAgewoJJGxvZ2lubmFtZSA9ICRtb2R1bGUtPkxvZ2dlZEluTmFtZSgpOwogICAgICB9CiAgICAkc21hcnR5LT5hc3NpZ24oJ2N1c3RvbWNvbnRlbnRfbG9naW5uYW1lJywkbG9naW5uYW1lKTsKICAgICRncm91cHMgPSAkbW9kdWxlLT5HZXRNZW1iZXJHcm91cHNBcnJheSggJG1vZHVsZS0+TG9nZ2VkSW5JZCgpICk7CiAgICAkdHh0ID0gJyc7CiAgICBpZiggaXNfYXJyYXkoICRncm91cHMgKSApCiAgICAgIHsKICAgICAgZm9yZWFjaCggJGdyb3VwcyBhcyAkZ3JwICkKICAgICAgICB7CiAJICAkZ24gPSAkbW9kdWxlLT5HZXRHcm91cE5hbWUoJGdycFsnZ3JvdXBpZCddKTsKICAJICAkdHh0IC49ICRnbi4iLCI7CiAJICAkc21hcnR5LT5hc3NpZ24oJ2N1c3RvbWNvbnRlbnRfbWVtYmVyb2ZfJy4kZ24sMSk7CiAgICAgICAgfQogICAgICB9CiAgICBpZiggJG1vZHVsZS0+TG9nZ2VkSW5JZCgpID4gMCApCiAgICAgIHsKCSRzbWFydHktPmFzc2lnbignY3VzdG9tY29udGVudF9sb2dpbm5hbWUnLCRtb2R1bGUtPkxvZ2dlZEluTmFtZSgpKTsKCSRncm91cHMgPSAkbW9kdWxlLT5HZXRNZW1iZXJHcm91cHNBcnJheSggJG1vZHVsZS0+TG9nZ2VkSW5JZCgpICk7CgkkdHh0ID0gJyc7CglpZiggaXNfYXJyYXkoICRncm91cHMgKSApCgkgIHsKCSAgICBmb3JlYWNoKCAkZ3JvdXBzIGFzICRncnAgKQoJICAgICAgewoJCSRnbiA9ICRtb2R1bGUtPkdldEdyb3VwTmFtZSgkZ3JwWydncm91cGlkJ10pOwoJCSR0eHQgLj0gJGduLiIsIjsKCQkkc21hcnR5LT5hc3NpZ24oJ2N1c3RvbWNvbnRlbnRfbWVtYmVyb2ZfJy4kZ24sMSk7CgkgICAgICB9CgkgIH0KCSRzbWFydHktPmFzc2lnbignY3VzdG9tY29udGVudF9ncm91cHMnLCR0eHQpOwoJJHNtYXJ0eS0+YXNzaWduKCdjdXN0b21jb250ZW50X2dyb3VwY291bnQnLGNvdW50KCRncm91cHMpKTsKICAgICAgfQogIH0KCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIEVkaXQgdGhlIGNvbnRlbnQgYWZ0ZXIgcmVuZGVyaW5nCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgZnVuY3Rpb24gQ29udGVudFBvc3RSZW5kZXIoJiRjb250ZW50KQogIHsKICAgIGdsb2JhbCAkZ0NtczsKICAgICR0aGlzLT5zbWFydHkgPSYgJGdDbXMtPmdldFNtYXJ0eSgpOwogICAgJG1vZHVsZSA9ICR0aGlzLT5HZXRNb2R1bGVJbnN0YW5jZSgnRnJvbnRFbmRVc2VycycpOwogICAgaWYoICEkbW9kdWxlICkKICAgICAgewoJLy8gY291bGRuJ3QgZ2V0IGEgdXNlcmlkIGluc3RhbmNlLCBkbyBub3RoaW5nCglyZXR1cm47CiAgICAgIH0KCiAgICBpZiggJHRoaXMtPnN1YnN0aXR1dGVfY29udGVudCAhPSB0cnVlICkKICAgICAgewoJLy8gd2UgY2FuIGxlYXZlIHRoZSBwYWdlIGFzIGlzIGZvciBub3cgSSBndWVzcwovLyAJJGNvbnRlbnQ9cHJlZ19yZXBsYWNlKCR0aGlzLT5zdGFydF9tYXJrZXJfcmVnZXhwLCIiLCRjb250ZW50KTsKLy8gCSRjb250ZW50PXByZWdfcmVwbGFjZSgkdGhpcy0+ZW5kX21hcmtlciwiIiwkY29udGVudCk7CglyZXR1cm47CiAgICAgIH0KCiAgICAvLyBzdGFydCBwcm9jZXNzaW5nIHRhZ3MKICAgICRiZWZvcmV0YWcgPSAtMTsKICAgICRhZnRlcnRhZyAgPSAtMTsKICAgICRleHBlY3QgPSAwOwogICAgJGxvb3AgPSAwOwogICAgJGluY2x1ZGVfc3RhcnQgPSAtMTsKICAgICRpbmNsdWRlX2VuZCA9IC0xOwogICAgJHBvcyA9IDA7CiAgICB3aGlsZSggJGxvb3AgPCAxNTAgKSAKICAgICAgewoJLy8gaW5jcmVtZW50IGEgbG9vcCBjb3VudGVyIChhdm9pZCBlbmRsZXNzIGxvb3BzKQoJJGxvb3ArKzsKCgkvLyBmaW5kIHRoZSBzdGFydCBvZiB0aGUgdGFnCgkkdGFnX3N0YXJ0cG9zID0gc3RycG9zKCRjb250ZW50LCAkdGhpcy0+c3RhcnRfbWFya2VyLCRwb3MpOwoJaWYoICR0YWdfc3RhcnRwb3MgPT0gZmFsc2UgKSByZXR1cm47CgoJLy8gbm93IGhhdmUgdG8gZmluZCB0aGUgZW5kIG9mIHRoZSBtYXJrZXIKCSR0YWdfZW5kcG9zID0gc3RycG9zKCRjb250ZW50LCR0aGlzLT5lbmRfbWFya2VyLCR0YWdfc3RhcnRwb3MpOwoJJHRhZ19lbmRwb3MgKz0gc3RybGVuKCR0aGlzLT5lbmRfbWFya2VyKTsKCgkvLyBhbmQgZ2V0IHRoZSBlbnRpcmUgdGFnCgkkdGFnID0gdHJpbShzdWJzdHIoJGNvbnRlbnQsJHRhZ19zdGFydHBvcywkdGFnX2VuZHBvcy0kdGFnX3N0YXJ0cG9zKSk7CgoJLy8gcmVtb3ZlIHRoZSBzdGFydCB0YWcgYW5kIGVuZCB0YWcKCSRzdHIgPSBzdWJzdHIoJHRhZyxzdHJsZW4oJHRoaXMtPnN0YXJ0X21hcmtlcikpOwoJJHN0ciA9IHRyaW0oc3Vic3RyKCRzdHIsMCxzdHJsZW4oJHN0ciktc3RybGVuKCR0aGlzLT5lbmRfbWFya2VyKSkpOwoJJGRhdGEgPSBwcmVnX3NwbGl0KCcvXFxzKy8nLCRzdHIpOwoJaWYoIGNvdW50KCRkYXRhKSA9PSAwICkKCSAgewoJICAgIC8vIGFuIGVycm9yIG9jY3VycmVkIGhlcmUKCSAgICByZXR1cm47CgkgIH0KCgkvLyBwYXJzZSB0aGUgY29tbWFuZCBpbnRvIGNvbW1uZCBhbmQgcGFyYW1ldGVycwoJJGNtZCA9IGFycmF5X3NoaWZ0KCRkYXRhKTsKCSRwYXJtcyA9IGFycmF5KCk7Cglmb3JlYWNoKCAkZGF0YSBhcyAkZCApCgkgIHsKCSAgICAkb3B0cyA9IHNwbGl0KCI7IiwkZCk7CgkgICAgZm9yZWFjaCggJG9wdHMgYXMgJG9wdCApIHsKCSAgICAgICRwID0gc3RycG9zKCRvcHQsJz0nKTsKCSAgICAgIGlmKCAkcCAhPSAwICkKCQl7CgkJICAkayA9IHN1YnN0cigkb3B0LDAsJHApOwoJCSAgJHYgPSBzdWJzdHIoJG9wdCwkcCsxKTsKCQkgICR2YWxzID0gc3BsaXQoIiwiLCR2KTsKCQkgICRwYXJtc1ska10gPSAkdmFsczsKCQl9CgkgICAgICBlbHNlCgkJJHBhcm1zWyRvcHRdID0gMTsKCSAgICB9CgkgIH0KCQoJLy8gYW5kIG5vdyBoYW5kbGUgdGhlIGNvbW1hbmQKCXN3aXRjaCggJGNtZCApCgkgIHsKCSAgY2FzZSAnc3RhcnRpZic6CgkgIGNhc2UgJ3N0YXJ0JzoKCSAgICB7CgkgICAgICBpZiggJGV4cGVjdCAhPSAwICkKCQl7CgkJICAvLyBlcnJvciBoZXJlLCB3ZSdyZSBleHBlY3Rpbmcgc29tZXRpbmcKCQkgIHJldHVybjsKCQl9CgkgICAgICAvLyBldmFsdWF0ZSB0aGUgcGFyYW1ldGVycywgdG8gc2VlIGlmIHdlIG1hdGNoZW0KCSAgICAgIGlmKCAkdGhpcy0+X2V2YWx1YXRlKCAkcGFybXMgKSApIAoJCXsKCQkgIC8vIGNvbmRpdGlvbnMgcGFzc2VkLCBub3cgd2UgaGF2ZSB0byBpbmNsdWRlIGV2ZXJ5dGhpbmcgdGlsbCB0aGUgbmV4dAoJCSAgLy8gdGFnIHdoaWNoIGlzIGVpdGhlciBhbiBlbmRpZiBvciBhbiBlbHNlCgkJICAkaW5jbHVkZV9zdGFydCA9ICR0YWdfZW5kcG9zOwoJCX0KCSAgICAgIC8vIGdldCByZWFkeSB0byBjb250aW51ZQoJICAgICAgJGJlZm9yZXRhZyA9ICR0YWdfc3RhcnRwb3M7CgkgICAgICAkZXhwZWN0ID0gMjsKCSAgICAgIGJyZWFrOwoJICAgIH0KCSAgY2FzZSAnZWxzZWlmJzoKCSAgICB7CgkgICAgICBpZiggJGV4cGVjdCAhPSAxICYmICRleHBlY3QgIT0gMiApCgkJewoJCSAgLy8gZXJyb3IgaGVyZSwgd2UncmUgZXhwZWN0aW5nIGEgY2VydGFpbiBzb21ldGhpbmcKCQkgIHJldHVybjsKCQl9CgkgICAgICAvLyBldmFsdWF0ZSB0aGUgcGFyYW1ldGVycywgdG8gc2VlIGlmIHdlIG1hdGNoZW0KCSAgICAgIGlmKCAkdGhpcy0+X2V2YWx1YXRlKCAkcGFybXMgKSApIAoJCXsKCQkgIC8vIGNvbmRpdGlvbnMgcGFzc2VkLCBub3cgd2UgaGF2ZSB0byBpbmNsdWRlIGV2ZXJ5dGhpbmcgdGlsbCB0aGUgbmV4dAoJCSAgLy8gdGFnIHdoaWNoIGlzIGVpdGhlciBhbiBlbmRpZiBvciBhbiBlbHNlCgkJICAkaW5jbHVkZV9zdGFydCA9ICR0YWdfZW5kcG9zOwoJCX0KCSAgICAgIC8vIGdldCByZWFkeSB0byBjb250aW51ZQoJICAgICAgJGJlZm9yZXRhZyA9ICR0YWdfc3RhcnRwb3M7CgkgICAgICAkZXhwZWN0ID0gMjsKCSAgICAgIGJyZWFrOwoJICAgIH0KCSAgY2FzZSAnZWxzZSc6CgkgICAgewoJICAgICAgaWYoICRleHBlY3QgIT0gMSAmJiAkZXhwZWN0ICE9IDIgKQoJCXsKCQkgIC8vIGVycm9yIGhlcmUsIHdlJ3JlIGV4cGVjdGluZyBhIGNlcnRhaW4gc29tZXRoaW5nCgkJICByZXR1cm47CgkJfQoJICAgICAgaWYoICRpbmNsdWRlX3N0YXJ0ID09IC0xICkgCgkJewoJCSAgLy8gd2UgZmFpbGVkIHRoZSBsYXN0IGNvbmRpdGlvbiAKCQkgICRpbmNsdWRlX3N0YXJ0ID0gJHRhZ19lbmRwb3M7CgkJfQoJICAgICAgZWxzZSAKCQl7CgkJICAvLyB3ZSBwYXNzZWQgdGhlIGxhc3QgY29uZGl0aW9uIHNvIHJlY29yZCBhbmQgZW5kIHBvc2l0aW9uCgkJICAkaW5jbHVkZV9lbmQgPSAkdGFnX3N0YXJ0cG9zOwoJCX0KCgkgICAgICAvLyBnZXQgcmVhZHkgdG8gY29udGludWUKCSAgICAgICRleHBlY3QgPSAyOwoJICAgICAgYnJlYWs7CgkgICAgfQoJICBjYXNlICdlbmQnOgoJICBjYXNlICdlbmRpZic6CgkgICAgewoJICAgICAgaWYoICRleHBlY3QgIT0gMSAmJiAkZXhwZWN0ICE9IDIgKQoJCXsKCQkgIC8vIGVycm9yIGhlcmUsIHdlJ3JlIGV4cGVjdGluZyBhIGNlcnRhaW4gc29tZXRoaW5nCgkJICByZXR1cm47CgkJfQoKCSAgICAgIGlmKCAkaW5jbHVkZV9lbmQgPT0gLTEgJiYgJGluY2x1ZGVfc3RhcnQgIT0gLTEgKQoJCXsKCQkgIC8vIG5vdyBjYXRjaCB0aGUgZW5kIHBvc2l0aW9uIG9mIHdoYXQgd2UgaGF2ZSB0byBpbmNsdWRlCgkJICAkaW5jbHVkZV9lbmQgPSAkdGFnX3N0YXJ0cG9zOwoJCX0KCSAgICAgICRhZnRlcnRhZyA9ICR0YWdfZW5kcG9zOwoKCSAgICAgIC8vIGdldCByZWFkeSB0byBjb250aW51ZQoJICAgICAgJGV4cGVjdCA9IDA7CgkgICAgICBicmVhazsKCSAgICB9CgkgIGRlZmF1bHQ6CgkgICAgewoJICAgICAgLy8gdW5rbm93biBjb21tYW5kCgkgICAgICByZXR1cm47CgkgICAgfQoJICB9CgoJaWYoICRiZWZvcmV0YWcgIT0gLTEgJiYgJGFmdGVydGFnICE9IC0xICkKCSAgewoJICAgIC8vIHdlIGhhdmUgYSB3aG9sZSBzZWN0aW9uIChob3BlZnVsbHkpCgkgICAgJG5ld3N0YXJ0ID0gc3Vic3RyKCRjb250ZW50LDAsJGJlZm9yZXRhZyk7CgkgICAgJGluY2x1ZGUgID0gc3Vic3RyKCRjb250ZW50LCRpbmNsdWRlX3N0YXJ0LCRpbmNsdWRlX2VuZC0kaW5jbHVkZV9zdGFydCk7CgkgICAgJG5ld2VuZCAgID0gc3Vic3RyKCRjb250ZW50LCRhZnRlcnRhZyk7CgkgICAgJGNvbnRlbnQgPSAkbmV3c3RhcnQuJGluY2x1ZGUuJG5ld2VuZDsKCSAgICAkaW5jbHVkZV9zdGFydCA9IC0xOwoJICAgICRpbmNsdWRlX2VuZCA9IC0xOwoJICAgICRiZWZvcmV0YWcgPSAtMTsKCSAgICAkYWZ0ZXJ0YWcgPSAtMTsKCSAgICAkcG9zID0gMDsKCSAgfQoJZWxzZQoJICB7CgkgICAgJHBvcyA9ICR0YWdfZW5kcG9zOwoJICB9CiAgICAgIH0KICB9CgoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBEb0FjdGlvbigkYWN0aW9uLCAkaWQsICRwYXJhbXMsICRyZXR1cm5faWQpCiAgIFRoaXMgaXMgdGhlIG1haW4gZnVuY3Rpb24gdGhhdCBnZXRzIGNhbGxlZCBpZiB5b3VyIG1vZHVsZQogICBpcyBhIHBsdWctaW4gdHlwZSBtb2R1bGUuCgkgICAKICAgSW4gZ2VuZXJhbCwgeW91J2xsIHdhbnQgdG8gY2FsbCB2YXJpb3VzIGRpZmZlcmVudAogICBtZXRob2RzLCBkZXBlbmRpbmcgdXBvbiB0aGUgcmVxdWVzdGVkICJhY3Rpb24uIgoJICAgCiAgIFRoZXJlIGFyZSB0d28gYnVpbHQtaW4gYWN0aW9uczogImRlZmF1bHQiIHdoaWNoIGdldHMKICAgY2FsbGVkIGlmIHRoZSBtb2R1bGUgaXMgYWNjZXNzZWQgZnJvbSBhIHBhZ2Ugb3IgdGVtcGxhdGUsCiAgIGFuZCAiZGVmYXVsdGFkbWluIiB3aGljaCBnZXRzIGNhbGxlZCBmcm9tIHRoZSBBZG1pbgogICBwYW5lbC4KCSAgIAogICBUaGUgQWN0aW9uIGNhbiBiZSBvdmVycmlkZGVuIGJ5IHBhc3NpbmcgYSBkaWZmZXJlbnQKICAgYWN0aW9uIGVpdGhlciBpbiB5b3VyIHRhZywgZS5nLiwKICAge2Ntc19tb2R1bGUgbW9kdWxlPSdTa2VsZXRvbicgYWN0aW9uPSdzb21ldGhpbmcnfQogICBvciBieSBwYXNzaW5nIGl0IGluIGEgbGluayBjcmVhdGUgYnkgdGhlIENyZWF0ZUxpbmsKICAgbWV0aG9kLiBNb3JlIG9uIHRoYXQgY2FuIGJlIHNlZW4gYmVsb3cgaW4gdGhlCiAgIERpc3BsYXlBZG1pbk5hdiBtZXRob2QuCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgZnVuY3Rpb24gRG9BY3Rpb24oJGFjdGlvbiwgJGlkLCAkcGFyYW1zLCAkcmV0dXJuX2lkPS0xKQogIHsKICAgIHN3aXRjaCAoJGFjdGlvbikKICAgICAgewogICAgICBjYXNlICdkZWZhdWx0JzoKCXsKCSAgLy8gdGhpcyBpcyB0aGUgcGx1Zy1pbiBzaWRlLCBpLmUuLCBub24tQWRtaW4KCSAgJHRoaXMtPnN1YnN0aXR1dGVfY29udGVudCA9IHRydWU7CgkgIGJyZWFrOwoJfQogICAgICB9CiAgfQoKCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgRGlzcGxheUVycm9yUGFnZSgkaWQsICRwYXJhbXMsICRyZXR1cm5faWQsICRtZXNzYWdlKQogICBOT1QgUEFSVCBPRiBUSEUgTU9EVUxFIEFQSQogICAgIAogICBUaGlzIGlzIGFuIGV4YW1wbGUgb2YgYSBzaW1wbGUgbWV0aG9kIHRvIGRpc3BsYXkKICAgZXJyb3IgaW5mb3JtYXRpb24gb24gdGhlIGFkbWluIHNpZGUuCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgZnVuY3Rpb24gRGlzcGxheUVycm9yUGFnZSgkaWQsICYkcGFyYW1zLCAkcmV0dXJuaWQsICRtZXNzYWdlPScnKQogIHsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbl9ieV9yZWYoJ3RpdGxlX2Vycm9yJywgJHRoaXMtPkxhbmcoJ2Vycm9yJykpOwogICAgaWYgKCRtZXNzYWdlICE9ICcnKQogICAgICB7CgkkdGhpcy0+c21hcnR5LT5hc3NpZ25fYnlfcmVmKCdtZXNzYWdlJywgJG1lc3NhZ2UpOwogICAgICB9CiAgICAgIAogICAgLy8gRGlzcGxheSB0aGUgcG9wdWxhdGVkIHRlbXBsYXRlCiAgICBlY2hvICR0aGlzLT5Qcm9jZXNzVGVtcGxhdGUoJ2Vycm9yLnRwbCcpOwogIH0KfQoKPz4K]]></data>
	</file>
	<file>
	  <filename>/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[]]></data>
	</file>
	<file>
	  <filename>/lang/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lang/en_US.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKJGxhbmdbJ2ZyaWVuZGx5bmFtZSddID0gJ0N1c3RvbSBDb250ZW50IE1vZHVsZSc7CiRsYW5nWydwb3N0aW5zdGFsbCddID0gJyc7CiRsYW5nWydwb3N0dW5pbnN0YWxsJ10gPSAnJzsKJGxhbmdbJ3VuaW5zdGFsbGVkJ10gPSAnTW9kdWxlIFVuaW5zdGFsbGVkLic7CiRsYW5nWydpbnN0YWxsZWQnXSA9ICdNb2R1bGUgdmVyc2lvbiAlcyBpbnN0YWxsZWQuJzsKJGxhbmdbJ2FjY2Vzc2RlbmllZCddID0gJ0FjY2VzcyBEZW5pZWQuIFBsZWFzZSBjaGVjayB5b3VyIHBlcm1pc3Npb25zLic7CiRsYW5nWydlcnJvciddID0gJ0Vycm9yISc7CiRsYW5nWyd1cGdyYWRlZCddID0gJ01vZHVsZSB1cGdyYWRlZCB0byB2ZXJzaW9uICVzLic7CiRsYW5nWydtb2RkZXNjcmlwdGlvbiddID0gJ1RoaXMgbW9kdWxlIHByb3ZpZGVzIHRoZSBhYmlsaXR5IHRvIHNwZWNpZnkgZGlmZmVyZW50IGNvbnRlbnQgYnkgZ3JvdXAgb3IgdXNlciBuYW1lJzsKJGxhbmdbJ2NoYW5nZWxvZyddID0gJzx1bD48bGk+VmVyc2lvbiAxLjAuIDE0IFNlcHRlbWJlciAyMDA1LiBJbml0aWFsIFJlbGVhc2UuPC9saT48L3VsPgo8dWw+CjxsaT5WZXJzaW9uIDEuMS4gIC0gU2VwdGVtYmVyIDIwMDUuIEFkZGVkIHN0YXJ0aWYvZWxzZS9lbmRpZiwgYW5kIHNlYXJjaCB0aHJvdWdoIG11bHRpcGxlIGdyb3VwcyBhbmQgdXNlcnMuPC9saT4KPGxpPlZlcnNpb24gMS4yLiAgLSBTZXB0ZW1iZXIgMjAwNS4gQWRkZWQgbG9nZ2VkaW4gb3B0aW9uYWwgcGFyYW1ldGVyPC9saT4KPGxpPlZlcnNpb24gMS4zICAgLSBPY3RvYmVyICAgMjAwNS4gQ2hhbmdlZCB0byB1c2UgRnJvbnRFbmRVc2VycyBpbnN0ZWFkIG9mIFVzZXJJRDwvbGk+CjxsaT5WZXJzaW9uIDEuMy4xIC0gTm92ZW1iZXIgMjAwNS4gVmVyeSBtaW5vciBidWdmaXggdG8gdGhlIHBhcmFtZXRlciBwYXJzaW5nPC9saT4KPGxpPlZlcnNpb24gMS40LjAgLSBKYW51YXJ5LCAyMDA2Lgo8cD5BZGRlZCBzbWFydHkgY29tcGF0aWJsZSB2YXJpYWJsZXM8L3A+PC9saT4KPGxpPlZlcnNpb24gMS40LjEgLSBNYXksIDIwMDYuCjxwPlNtYXJ0eSB2YXJpYWJsZXMgbm93IHdvcmsgaW4gMC4xM2IyPC9wPgo8cD5Ob3cgcmVxdWlyZSBDTVMgMC4xM2IyIGFzIGEgbWluaW11bTwvcD4KPHA+VXBkYXRlZCB0aGUgaGVscDwvcD4KPC9saT4KPC91bD4nOwokbGFuZ1snaGVscCddID0gJzxoMz5XaGF0IERvZXMgVGhpcyBEbz88L2gzPgo8cD5UaGlzIG1vZHVsZSwgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgVXNlcklEIG1vZHVsZSBhbGxvd3MgeW91IHRvIGNyZWF0ZSBhIHBhZ2UgdGhhdCB3aWxsIGxvb2sgZGlmZmVyZW50IGRlcGVuZGluZyB1cG9uIHRoZSBwZXJzb24gdGhhdCBsb29rcyBhdCBpdC4gIFlvdSBjYW4gc3BlY2lmeSBkaWZmZXJlbnQgY29udGVudCBmb3IgY2VydGFpbiB1c2Vycywgb3IgbWVtYmVycyBvZiBhIGNlcnRhaW4gZ3JvdXAuPC9wPgo8aDM+SG93IERvIEkgVXNlIEl0IChtZXRob2QgMTogY29tbWVudCB0YWdzKTwvaDM+CjxwPlRvIHVzZSBpdCB5b3UgcGxhY2UgdGhlIHRhZyB7Y21zX21vZHVsZSBtb2R1bGU9Q3VzdG9tQ29udGVudH0gaW50byB5b3VyIHBhZ2Ugb3IgdGVtcGxhdGUsIGFuZCB0aGVuIGJlbG93IHRoYXQgeW91IHBsYWNlIHRoZSBjb250ZW50IHlvdSB3YW50IGlzb2xhdGVkIHRvIHNwZWNpZmljIHVzZXJzIGluIGdyb3VwcyBpbiBvbmUgb2YgdHdvIHdheXMsIGVpdGhlciB1c2luZyBzcGVjaWFsbHkgZm9ybWF0dGVkIGNvbW1lbnQgdGFncywgb3IgdXNpbmcgc21hcnR5IHN5bnRheC48L3A+CjxoND5NZXRob2QgMTogY29tbWVudCB0YWdzPC9oND4KPHByZT4Ke2Ntc19tb2R1bGUgbW9kdWxlPUN1c3RvbUNvbnRlbnR9CiZsdDshLS1jdXN0b21Db250ZW50OiBzdGFydGlmIGdyb3VwPXRlc3RlcnMsYWRtaW5zIC0tJmd0OwombHQ7SDEmZ3Q7VGhpcyBjb250ZW50IGlzIG9ubHkgYXZhaWxhYmxlIHRvIGxvZ2dlZCBpbiB0ZXN0ZXJzIGFuZCBhbmQgYWRtaW5zJmx0Oy9IMSZndDsKJmx0OyEtLWN1c3RvbUNvbnRlbnQ6IGVsc2UgLS0mZ3Q7CiZsdDtIMSZndDtUaGlzIGNvbnRlbnQgaXMgYXZhaWxhYmxlIHRvIGV2ZXJ5Ym9keSBlbHNlJmx0Oy9IMSZndDsKJmx0OyEtLWN1c3RvbUNvbnRlbnQ6IGVuZGlmIC0tJmd0OwombHQ7IS0tY3VzdG9tQ29udGVudDogc3RhcnRpZiBncm91cD11c2VycyAtLSZndDsKJmx0O0gxJmd0O1RoaXMgY29udGVudCBpcyBvbmx5IGF2YWlsYWJsZSB0byBsb2dnZWQgaW4gdXNlcnMgJmx0Oy9IMSZndDsKJmx0OyEtLWN1c3RvbUNvbnRlbnQ6IGVuZGlmIC0tJmd0Owo8L3ByZT4KPHA+PGI+QXZhaWxhYmxlIHBhcmFtZXRlcnM8L2I+PC9wPiAKPHVsPgo8bGk+PHA+PGVtPmlwPC9lbT4gLSB0ZXN0IGlmIHJlbW90ZSBpcCBtYXRjaGVzIGEgbmV0d29yayBvciBzdXBwbGllZCBpcCBhZGRyZXNzLiAgVmFsaWQgZm9ybWF0cyBhcmUgeHh4Lnh4eC54eHgueHh4IChleGFjdCksIHh4eC54eHgueHh4Llt5eXktenp6XSAocmFuZ2UpIGFuZCB4eHgueHh4Lnh4eC9ubiAobm4gPSAjIGJpdHMsIGkuZS4gIDE5Mi4xNjguMS4wLzI0KTwvcD48L2xpPgo8bGk+PHA+PGVtPmdyb3VwPC9lbT4gLSB0ZXN0IGlmIHRoZSBjdXJyZW50bHkgbG9nZ2VkIGluIHVzZXIgaXMgYSBtZW1iZXIgb2YgYW55IG9mIHRoZSBzdXBwbGllZCBncm91cHM8L3A+PC9saT4KPGxpPjxwPjxlbT51c2VyPGVtPiAtIHRlc3QgaWYgdGhlIGN1cnJlbnRseSBsb2dnZWQgaW4gdXNlcm5hbWUgbWF0Y2hlcyBhbnkgb2YgdGhlIHN1cHBsaWVkIG9uZXM8L3A+PC9saT4KPGxpPjxwPjxlbT5sb2dnZWRpbjxlbT4gLSB0ZXN0IGlmIHRoZSBjdXJyZW50IHVzZXIgaXMgbG9nZ2VkIGluIG9yIG5vdC4vcD48L2xpPgo8L3VsPgo8cD5UZXN0cyBhcmUgZXZhbHVhdGVkIGluIGEgbG9naWNhbCBPUiBmYXNoaW9uIGluIG9yZGVyIGFzIGZvbGxvd3MgaXAgYWRkcmVzcywgZ3JvdXAsIGFuZCB1c2VyLiAgVGhlIGZpcnN0IHN1Y2Nlc3NmdWxsIHRlc3Qgd2lsbCByZXN1bHQgaW4gdGhlIGV4cHJlc3Npb24gZXZhbHVhdGlvbmcgdG8gdHJ1ZTwvcD4KPGgzPkhvdyBEbyBJIFVzZSBJdCAobWV0aG9kIDIgOiBzbWFydHkpPC9oMz4KPHByZT4Ke2Ntc19tb2R1bGUgbW9kdWxlPUN1c3RvbUNvbnRlbnR9CntpZiBjdXN0b21jb250ZW50X2xvZ2dlZGlufQogIFdlbGNvbWUgJmx0O2ImZ3Q7e2N1c3RvbWNvbnRlbnRfbG9naW5uYW1lfSZsdDsvYiZndDsmbHQ7YnIvJmd0Owp7L2Vsc2V9CiAgJmx0O2gxJmd0O1lvdSBhcmUgbm90IGF1dGhvcml6ZWQgdG8gdmlldyB0aGlzIGRhdGEmbHQ7L2gxJmd0Owp7L2lmfQo8L3ByZT4KPHA+QW55IHNtYXJ0eSBjb21wYXRpYmxlIGV4cHJlc3Npb25zIG9yIGxvZ2ljIGNhbiBiZSB1c2VkIHdpdGggdGhlIGF2YWlsYWJsZSB2YXJpYWJsZXMuICBVc2luZyB0aGlzIHN5bnRheCwgZXhwcmVzc2lvbnMgbWF5IGJlIG5lc3RlZCwgb3IgY29tcGxleCBsb2dpYyB1c2VkLjwvcD4KPGg0PkF2YWlsYWJsZSB2YXJpYWJsZXM6PC9oND4KPHVsPgo8bGk+PHA+PGVtPmN1c3RvbWNvbnRlbnRfaXA8L2VtPiAtIFRoZSByZW1vdGUgSVAgYWRkcmVzczwvcD48L2xpPgo8bGk+PHA+PGVtPmN1c3RvbWNvbnRlbnRfbG9nZ2VkaW48L2VtPiAtIEEgYm9vbGVhbiBpbmRpY2F0aW5nIHdldGhlciB0aGUgdXNlciBpcyBsb2dnZWQgaW4gb3Igbm90PC9wPjwvbGk+CjxsaT48cD48ZW0+Y3VzdG9tY29udGVudF9sb2dpbm5hbWU8L2VtPiAtIFRoZSBuYW1lIG9mIHRoZSBjdXJyZW50bHkgbG9nZ2VkIGluIHVzZXI8L3A+PC9saT4KPGxpPjxwPjxlbT5jdXN0b21jb250ZW50X2dyb3VwY291bnQ8L2VtPiAtIEEgY291bnQgb2YgdGhlIG51bWJlciBvZiBncm91cHMgdGhpcyB1c2VyIGlzIGEgbWVtYmVyIG9mPC9wPjwvbGk+CjxsaT48cD48ZW0+Y3VzdG9tY29udGVudF9ncm91cHM8L2VtPiAtIEEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIGdyb3VwIG5hbWVzIG9mIGFsbCBtZW1iZXIgZ3JvdXBzPC9wPjwvbGk+CjxsaT48cD48ZW0+Y3VzdG9tY29udGVudF9tZW1iZXJvZl8qPC9lbT4gLSBBIHNlcmllcyBvZiBib29sZWFuIHZhcmlhYmxlcyBpbmRpY2F0aW5nIGdyb3VwIG1lbWJlcnNoaXAuICBpLmUuOiBjdXN0b21jb250ZW50X21lbWJlcm9mX3N0YWZmLCBjdXN0b21jb250ZW50X21lbWJlcm9mX3VzZXJzLCBldGMuICBObyB2YXJpYWJsZXMgYXJlIGRlZmluZWQgZm9yIGdyb3VwcyB0aGF0IHRoaXMgdXNlciBpcyBub3QgYSBtZW1iZXIgb2YuPC9wPjwvbGk+CjwvdWw+CjxoMz5Db3B5cmlnaHQgYW5kIExpY2Vuc2U8L2gzPgo8cD5Db3B5cmlnaHQgJmNvcHk7IDIwMDUsIFJvYmVydCBDYW1wYmVsbCA8YSBocmVmPSJtYWlsdG86cm9iQHRlY2hjb20uZHluZG5zLm9yZyI+Jmx0O3JvYkB0ZWNoY29tLmR5bmRucy5vcmcmZ3Q7PC9hPi4gQWxsIFJpZ2h0cyBBcmUgUmVzZXJ2ZWQuPC9wPgo8cD5UaGlzIG1vZHVsZSBoYXMgYmVlbiByZWxlYXNlZCB1bmRlciB0aGUgPGEgaHJlZj0iaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2xpY2Vuc2VzLmh0bWwjR1BMIj5HTlUgUHVibGljIExpY2Vuc2U8L2E+LiBZb3UgbXVzdCBhZ3JlZSB0byB0aGlzIGxpY2Vuc2UgYmVmb3JlIHVzaW5nIHRoZSBtb2R1bGUuPC9wPgonOwo/Pgo=]]></data>
	</file>
</module>
