<?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>NeoModule</name>
	<version>0.2.1</version>
  <mincmsversion>1.6</mincmsversion>
	<help>PHN0cm9uZz5Ob3RpY2UhIFRoaXMgaXMgYSBtb2R1bGUtZGV2ZWxvcGVyLW9ubHkgbW9kdWxlLiBJZiB5b3UgYXJlIG5vdCBhIGRldmVsb3Blcgp5b3UnbGwgcHJvYmFibHkganVzdCB3YW50IHRvIHNraXAgdGhlIGdvcnkgZGV0YWlscyBvZiB0aGlzIHBhZ2UgYW5kIHJlbHkgb24gdGhhdAp0aGUgbW9kdWxlIGp1c3QgZG9lcyBpdCdzIHdvcmsuPC9zdHJvbmc+CjxoMz5QdXJwb3NlIG9mIHRoZSBtb2R1bGU8L2gzPgpUaGUgcHVycG9zZSBvZiB0aGlzIG1vZHVsZSBpcyB0byBjdXQgb2ZmIG9uIGRldmVsb3BtZW50dGltZSBwcm92aWRpbmcgc29tZQplYXN5IHRvIHVzZSBmdW5jdGlvbnMgZXh0ZW5kaW5nIHRoZSBtb2R1bGUtQVBJIG9mIENNUyBNYWRlIFNpbXBsZS4gVGhpcyBpbmNsdWRlcywKYnV0IGlzIG5vIGxpbWl0ZWQgdG8sIHNob3J0Y3V0cyB0byBOZW9EYXRhU3RvcmFnZS1mdW5jaW9uYWxpdHksIGEgY291cGxlIG9mIG5pY2UKU21hcnR5LXNob3J0Y3V0cywgRmlyZVBIUC1pbnRlZ3JhdGlvbiBldGMuCjxoMz5Vc2FnZSBvZiB0aGUgbW9kdWxlPC9oMz4KVG8gdXNlIHRoaXMgZXh0ZW5kZWQgbW9kdWxlLWNsYXNzIHlvdSBzaG91bGQgaW5oZXJpdCBmcm9tIE5lb01vZHVsZS1jbGFzcyBpbnN0ZWFkCm9mIHRoZSB1c3VhbCBDTVNNb2R1bGUtY2xhc3MuIFRoaXMgY2FuIGJlIGRvbmUgbGlrZSB0aGlzOgo8cHJlPgpyZXF1aXJlX29uY2UoZGlybmFtZShkaXJuYW1lKF9fRklMRV9fKSkuIi9OZW9Nb2R1bGUvTmVvTW9kdWxlLm1vZHVsZS5waHAiKTsKY2xhc3MgTXlNb2R1bGUgZXh0ZW5kcyBOZW9Nb2R1bGUgewo8L3ByZT4KSWYgeW91IHdpc2ggdG8gdXNlIHRoZSBOZXdEYXRhU3RvcmFnZSBmdW5jdGlvbmFsaXR5LCB5b3Ugc2hvdWxkIG9mIGNvdXJzZSBhbHNvCmluc3RhbGwgdGhhdCBtb2R1bGUuCjxoMz5Ib3cgdG8gZ2V0IGhlbHA8L2gzPgpJIHdpbGwgcmVwZWF0LCB0aGlzIG1vZHVsZSBpcyBmb3IgZGV2ZWxvcGVycyBvbmx5LiBJZiB5b3UgY2Fubm90IHJlYWQgcGhwLXNvdXJjZSBjb2RlLAp5b3Ugc2hvdWxkIHVzZSBpdCBmb3IgZGV2ZWxvcG1lbnQgYW55d2F5LiBJZiB5b3UgY2FuLCBhbHdheXMgY2hlY2sgb3V0IHRoZSBjb2RlIApmb3IgaGludHMgb24gaG93IHRvIG1ha2UgaXQgd29yay4gSWYgeW91IHN0aWxsIGhhdmUgcXVlc3Rpb25zIG9yIHN1Z2dlc3Rpb25zIGZvcgpmaXhlcy9pbXByb3ZlbWVudHMsIHBsZWFzZSBmZWVsIGZyZWUgdG8gY2F0Y2ggbWUgKFNpbG1hcmlsbGlvbikgaW4gdGhlIGZvcnVtIG9nICNpcmMuCgo8aDM+TGlzdCBvZiBtZXRob2RzPC9oMz4KSSB3aWxsIHRyeSB0byBrZWVwIHRoaXMgbGlzdCB1cHRvZGF0ZSwgYnV0IGZvciBtb3N0IHJlY2VudCBsaXN0LCBwbGVhc2UKY2hlY2sgdGhlIE5lb01vZHVsZS5tb2R1bGUucGhwLWZpbGUgaXRzZWxmLiBTb21lIGRvY3VtZW50YXRpb24gb2YgdGhlIG1ldGhvZHMKbWF5IGV2ZW4gc25lYWsgaW4gdGhlcmUgc29tIGRheS4KPHByZT4KLyoKICoKICogU2V0dXAgZnVuY3Rpb25zCiAqCiAqLwoKZnVuY3Rpb24gU2V0SWQoJGlkKQpmdW5jdGlvbiBOZW9TZXRJZCgkaWQpCgoKICAvKgogICAqCiAgICogR2VuZXJhbCBzaG9ydGN1dCBmdW5jdGlvbnMKICAgKgogICAqLwpmdW5jdGlvbiBQcmVmKCRwcmVmbmFtZSwkZGVmYXVsdD0iIikKZnVuY3Rpb24gTmVvQ21zTGluaygkcGFyYW1zPWFycmF5KCkpCmZ1bmN0aW9uIE5lb0Ntc1VybCgkcGFyYW1zPWFycmF5KCkpCmZ1bmN0aW9uIE5lb1JlZGlyZWN0KCRwYXJhbXM9YXJyYXkoKSkKLyoKICoKICogRm9ybS1nZW5lcmF0aW9uIGZ1bmN0aW9ucwogKgogKi8KCmZ1bmN0aW9uIE5lb0Zvcm1TdGFydCgkcGFyYW1zPWFycmF5KCkpCmZ1bmN0aW9uIE5lb0Zvcm1FbmQoJHBhcmFtcz1hcnJheSgpKQpmdW5jdGlvbiBOZW9JbnB1dFRleHQoJHBhcmFtcz1hcnJheSgpCmZ1bmN0aW9uIE5lb1RleHRhcmVhKCRwYXJhbXM9YXJyYXkoKSkKZnVuY3Rpb24gTmVvSW5wdXRDaGVja2JveCgkcGFyYW1zPWFycmF5KCkpCmZ1bmN0aW9uIE5lb0lucHV0U3VibWl0KCRwYXJhbXM9YXJyYXkoKSkKZnVuY3Rpb24gTmVvSW5wdXRSZXNldCgkcGFyYW1zPWFycmF5KCkpCmZ1bmN0aW9uIE5lb0lucHV0SW5wdXREcm9wZG93bigkcGFyYW1zPWFycmF5KCkpCgovKiBmdW5jdGlvbiBiZWxvdyBpbmNsdWRlIHNtYXJ0eWFzc2lnbm1lbnQsIGRvZXMgbm90IHJldHVybiBhbnl0aGluZyAqLwpmdW5jdGlvbiBTbWFydHlGb3JtU3RhcnQoJHNtYXJ0eW5hbWUsJHBhcmFtcz1hcnJheSgpKQpmdW5jdGlvbiBTbWFydHlVcGxvYWRGb3JtU3RhcnQoJHNtYXJ0eW5hbWUsJHBhcmFtcz1hcnJheSgpKQpmdW5jdGlvbiBTbWFydHlGb3JtRW5kKCRzbWFydHluYW1lKQpmdW5jdGlvbiBTbWFydHlJbnB1dFN1Ym1pdCgkc21hcnR5bmFtZSwkbmFtZSwkdGV4dCwkY29uZmlybXRleHQ9IiIpCmZ1bmN0aW9uIFNtYXJ0eUlucHV0SGlkZGVuKCRzbWFydHluYW1lLCRuYW1lLCR2YWx1ZSkKZnVuY3Rpb24gU21hcnR5SW5wdXRNdWx0aUhpZGRlbigkc21hcnR5bmFtZSwkZmllbGRzPWFycmF5KCkpCgovKgogKgogKiBOZW9EYXRhU3RvcmFnZSBzaG9ydGN1dHMKICoKICovCmZ1bmN0aW9uIEFkZEVudGl0eSgkdGFibGUsICRwcm9wcz1hcnJheSgpKQpmdW5jdGlvbiBEZWxldGVFbnRpdHkoJGlkKQpmdW5jdGlvbiBHZXRFbnRpdHkoJGlkLCAkb3ZlcnJpZGVwcm9wcz1hcnJheSgpKQpmdW5jdGlvbiBHZXRFbnRpdGllcygkdGFibGU9IiIsICRjcml0ZXJpYT1hcnJheSgpLCAkYWx3YXlzcmV0dXJuYXJyYXk9ZmFsc2UpCmZ1bmN0aW9uIEdldE9uZUVudGl0eSgkdGFibGUsICRjcml0ZXJpYT1hcnJheSgpLCAkZmFpbGlmbXVsdGlwbGU9ZmFsc2UpCmZ1bmN0aW9uIEdldEVudGl0aWVzRnVsbCgkdGFibGU9IiIsICRjcml0ZXJpYT1hcnJheSgpLCAkYWx3YXlzcmV0dXJuYXJyYXk9ZmFsc2UpCmZ1bmN0aW9uIFNldEVudGl0eVByb3AoJGlkLCRwcm9wbmFtZSwkcHJvcHZhbHVlLCRwcm9wdHlwZT0idW5kZWZpbmVkIikKZnVuY3Rpb24gQ2xlYXJFbnRpdHlQcm9wKCRpZCwgJHByb3BuYW1lKQpmdW5jdGlvbiBTZXRFbnRpdHlQcm9wcygkaWQsICRwcm9wcywgJGNsZWFyPXRydWUpCmZ1bmN0aW9uIFNldEVudGl0eVByb3BzT25Dcml0ZXJpYSgkdGFibGUsICRwcm9wcywgJGNyaXRlcmlhLCAkY3JlYXRlPXRydWUsICRjbGVhcj1mYWxzZSkgLy9Eb2VzIG5vdCB3b3JrCmZ1bmN0aW9uIFJlc2V0RW50aXR5UHJvcHMoJGlkLCAkbmV3cHJvcHM9YXJyYXkoKSkKZnVuY3Rpb24gUmVtb3ZlTW9kdWxlRW50aXRpZXMoKQpmdW5jdGlvbiBDbGVhckVudGl0eVByb3BzKCRpZCkKZnVuY3Rpb24gQ29tcGFyZUVudGl0aWVzKCRlbnRpdHkxLCAkZW50aXR5MiwgJHNvcnRmaWVsZCkKZnVuY3Rpb24gQ29tcGFyZUVudGl0aWVzQ29tcGxleCgkZW50aXR5MSwgJGVudGl0eTIsICRzb3J0ZmllbGRzKQpmdW5jdGlvbiBTb3J0RW50aXRpZXMoJGxpc3QsICRzb3J0ZmllbGRzKQpmdW5jdGlvbiBFbnRpdGllc0NvdW50KCR0YWJsZT0iIiwgJGNyaXRlcmlhPWFycmF5KCkpCmZ1bmN0aW9uIENsZWFyTW9kdWxlRW50aXRpZXMoKQpmdW5jdGlvbiBTZXRFbnRpdHlDb25uZWN0aW9uKCRpZDEsICRpZDIsICR0eXBlPSIiKQpmdW5jdGlvbiBDbGVhckVudGl0eUNvbm5lY3Rpb25zKCRpZDEsICRpZDI9LTEsICR0eXBlPSIiKQpmdW5jdGlvbiBDbGVhckVudGl0eUNvbm5lY3Rpb24oJGlkMSwgJGlkMiwgJHR5cGU9IiIpCmZ1bmN0aW9uIENoZWNrRW50aXR5Q29ubmVjdGlvbigkaWQxLCRpZDIsJHR5cGU9IiIpCmZ1bmN0aW9uIEdldEVudGl0eUNvbm5lY3Rpb25zKCRpZDEsICRpZDI9LTEsICR0eXBlPSIiKQpmdW5jdGlvbiBBZGRGaWVsZFNldCgkbmFtZSwkZmllbGRzKQpmdW5jdGlvbiBHZXRGaWVsZFNldCgkbmFtZSkKZnVuY3Rpb24gRW50aXR5U2V0VW5zZXRQcm9wcygkZW50aXR5LCRmaWVsZHNldCwkZmlsbHZhbHVlPSIiKSB7CmZ1bmN0aW9uIEdldERTRXJyb3JzKCRubDJicj10cnVlLCRjbGVhcj10cnVlKQpmdW5jdGlvbiBPdXRwdXREU0Vycm9ycygkY2xlYXI9dHJ1ZSkKZnVuY3Rpb24gRFNJbkVycm9yKCkKZnVuY3Rpb24gTWFrZVNpbXBsZUFycmF5KCR0YWJsZSwkZmllbGQpCmZ1bmN0aW9uIE1ha2VBc3NvY0FycmF5KCR0YWJsZSwkZmllbGRzKQoKCi8qCiAqCiAqIExpbmsgYW5kIGljb24gZnVuY3Rpb25zCiAqCiAqLwoKZnVuY3Rpb24gTmVvRGVsZXRlSWNvbigkYWN0aW9uLCR0ZXh0LCRwYXJhbXM9YXJyYXkoKSwkY29uZmlybWF0aW9uPSIiKQpmdW5jdGlvbiBOZW9Db3B5SWNvbigkYWN0aW9uLCR0ZXh0LCRwYXJhbXM9YXJyYXkoKSwkY29uZmlybWF0aW9uPSIiKQpmdW5jdGlvbiBOZW9FZGl0SWNvbigkYWN0aW9uLCR0ZXh0LCRwYXJhbXM9YXJyYXkoKSwkY29uZmlybWF0aW9uPSIiKQpmdW5jdGlvbiBOZW9BZGRJY29uKCRhY3Rpb24sJHRleHQsJHBhcmFtcz1hcnJheSgpLCRjb25maXJtYXRpb249IiIpCmZ1bmN0aW9uIE5lb1N5c3RlbUljb24oJGljb24sJHRleHQ9IiIpCgovKgogKgogKiBVdGlsaXR5IGZ1bmN0aW9ucwogKgogKi8KZnVuY3Rpb24gTmVvU2xhc2hlcygkdXJsKQpmdW5jdGlvbiBTbGFzaCgkc3RyLCRzdHIyPSIiLCRzdHIzPSIiKQpmdW5jdGlvbiBTbGFzaGVzKCR1cmwpCmZ1bmN0aW9uIGlzX2Fzc29jKCRhcnJheSkKZnVuY3Rpb24gTmVvRGlyTGlzdCgkcm9vdCwkd2hhdD0iZmlsZXMiLCRpbnRyb2R1Y3Rpb249YXJyYXkoKSwkZXhjbHVkZXM9YXJyYXkoKSkKCi8qQ2hlY2tzIGZvciB0aGUgZXhpc3RlbmNlIG9mIGFuIGluZGV4IGluIGFuIGFycmF5IGFuZCByZXR1cm4gdGhlIHZhbHVlIGlmIGl0J3MgdGhlcmUKICphbmQgdGhlIGRlZmF1bHQgdmFsdWUgaWYgaXQncyBub3QKKi8KZnVuY3Rpb24gTmVvUGFyYW1WYWx1ZSgkbmFtZSwkcGFyYW1zLCRkZWZhdWx0PSIiKQoKLy9TaG9ydGN1dCBmb3IgdGhlIGFib3ZlCmZ1bmN0aW9uIE5QVigkbmFtZSwgJHBhcmFtcykKZnVuY3Rpb24gTmVvQXBwbHlQYXJhbVZhbHVlcygkdGhpc2FycmF5LCAkcGFyYW1zLCAkaW5kZXhlcywgJGFsd2F5c2ZpbGw9ZmFsc2UpCmZ1bmN0aW9uIENoZWNrRmlsZUV4dGVuc2lvbigkZmlsZW5hbWUsICRhbGxvd2VkZXh0ZW5zaW9ucz1hcnJheSgpKQoKLy9Gb3Igbm93LCByZWFkIHNvdXJjZSB0byB1bmRlcnN0YW5kCmZ1bmN0aW9uIE5lb1Rvb2xUaXAoJHBhcmFtcz1hcnJheSgpKSAvL3JlcXVpcmVzIDIgY3NzLWNsYXNzZXMgdG8gYmUgc2V0IHVwCgovL3NhbWUgYXMgcHJpbnRfciwgYnV0IHdyYXBzIGluIDxwcmU+J3MgYW5kIGluIGEgZGl2IHRyeWluZyB0byBtYWtlIGl0IG1vcmUgcmVhZGFibGUKZnVuY3Rpb24gTmVvUHJpbnRSKCRkYXRhPWFycmF5KCksJHNlbmRvdXQ9dHJ1ZSkKCi8qCiAqCiAqIFNtYXJ0eSBzaG9ydGN1dHMKICoKICovCmZ1bmN0aW9uIFNtYXJ0eUFzc2lnbigkc21hcnR5aW5mbywgJHNtYXJ0eWNvbnRlbnQ9IiIpCmZ1bmN0aW9uIFNtYXJ0eUFzc2lnblByZWYoJHNtYXJ0eW5hbWUsICRwcmVmZXJlbmNlbmFtZT0iIikgewpmdW5jdGlvbiBTbWFydHlBc3NpZ25DTVMoJG1vZHVsZSwkdmFybmFtZT0iY21zIikKZnVuY3Rpb24gU21hcnR5VXBsb2FkRm9ybVN0YXJ0KCRzbWFydHluYW1lLCRwYXJhbXM9YXJyYXkoKSkgewoKLyoKICoKICogRGVidWdnaW5nIGZ1bmN0aW9ucwogKgogKi8KZnVuY3Rpb24gRmlyZURlYnVnKCRjb21tYW5kLCRtZXNzYWdlPSIiLCR2YXJpYWJsZXM9YXJyYXkoKSkKCi8qCiAqCiAqIEVycm9yIGhhbmRsaW5nCiAqCiAqLwpmdW5jdGlvbiBFcnJvcigkZXJyb3J0ZXh0LCRyZXR1cm52YWx1ZT1mYWxzZSwkcGFyYW1zPWFycmF5KCkpCmZ1bmN0aW9uIEdldEVycm9ycygkbmwyYnI9dHJ1ZSwkY2xlYXI9dHJ1ZSwkaW5jbHVkZWRzPXRydWUpCmZ1bmN0aW9uIE91dHB1dEVycm9ycygkY2xlYXI9dHJ1ZSwkaW5jbHVkZWRzPXRydWUpCmZ1bmN0aW9uIEluRXJyb3IoKQo8L3ByZT48aDM+UGFyYW1ldHJlPC9oMz48dWw+PGxpPjxlbT4ob3B0aW9uYWwpPC9lbT4gbGFuZz0iZW5fVVMiIC0gUGFyYW1ldHJldCBhbmdpdmVyIGh2aWxrZXQgc3Byb2cgZGVyIHNrYWwgYnJ1Z2VzIHRpbCB2aXNuaW5nIGZvciBiZXMmb3NsYXNoO2dlbmRlLiBJa2tlIGFsbGUgbW9kdWxlciB1bmRlcnN0Jm9zbGFzaDt0dGVyIGVsbGVyIGJlaCZvc2xhc2g7dmVyIGRldHRlLjwvbGk+PC91bD4=</help>
	<about>PGJyIC8+TGF2ZXQgYWY6IE1vcnRlbiBQb3Vsc2VuICZsdDttb3J0ZW5AcG91bHNlbi5vcmcmZ3Q7PGJyIC8+PGJyIC8+VmVyc2lvbjogMC4yLjE8YnIgLz48YnIgLz5IaXN0b3JpayBvdmVyICZhZWxpZztuZHJpbmdlcjo8YnIgLz48dWw+CjxsaT52ZXJzaW9uIDAuMi4xPGJyLz4KYWRkZWQgYXJyYXlfZGlmZl9rZXkgaW1wbGVtZW50YXRpb24gZm9yIHByZS01LjEuMCB2ZXJzaW9uCjxici8+CkFkZGVkICRhbHdheXNyZXR1cm5hcnJheT1mYWxzZSB0byBHZXRFbnRpdGllcyhGdWxsKS1tZXRob2RzCjxici8+CkFkZGVkIFNtYXJ0QXNzaWduUHJlZi1tZXRob2QKPGJyLz4KQWRkZWQgVG9vbHRpcC1TdXBwb3J0Cjxici8+CkFkZGVkIE5lb1JlZGlyZWN0LWZ1bmN0aW9uCgogIDxsaT52ZXJzaW9uIDAuMi4wPGJyLz4KLSBnZW5lcmFsIGJ1Z2ZpeGluZzxici8+Ci0gQWRkZWQgYSBOZW9EaXJMaXN0LWZ1bmN0aW9uPGJyLz4KLSBGaXhlZCBuYW1lIGVycm9yIG9uIE5lb0lucHV0RHJvcGRvd248YnIvPgotIGFkZGVkIHN1cHBvcnQgZm9yIDNyZCBwYXJhbWV0ZXIgdG8gU2xhc2gtZnVuY3Rpb248YnIvPgotIGFkZGVkIE5lb0Ntc0xpbmsgYW5kIE5lb0Ntc1VybCBzaG9ydGN1dHM8YnIvPgotIGFkZGVkIFNtYXJ0eVVwbG9hZEZvcm1TdGFydDxici8+Ci0gYWRkZWQgU21hcnR5SW5wdXRNdWx0aUhpZGRlbjxici8+CgogIDwvbGk+CiAgPGxpPnZlcnNpb24gMC4xLjA8YnIvPgogICAtIGluaXRpYWwgcmVsZWFzZTwvbGk+CjwvdWw+PGJyIC8+</about>
	<description>An extended module-class, mainly for the Neo-series modules, but also for others to use</description>
	<file>
	  <filename>/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/NeoModule.module.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKIyBOZW9Nb2R1bGUuIEFuIGV4dGVuZGVkIG1vZHVsZWNsYXNzIGZvciBDTVMgLSBDTVMgTWFkZSBTaW1wbGUKIyBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgTW9ydGVuIFBvdWxzZW4gPG1vcnRlbkBwb3Vsc2VuLm9yZz4KIwojQ01TIC0gQ01TIE1hZGUgU2ltcGxlCiMoYykyMDA0LTA5IGJ5IFRlZCBLdWxwICh3aXNoeUB1c2Vycy5zZi5uZXQpCiNUaGlzIHByb2plY3QncyBob21lcGFnZSBpczogaHR0cDovL2Ntc21hZGVzaW1wbGUuc2YubmV0CiMKI1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiNpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQojdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKIyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMKI1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAojYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKI01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKI0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiNZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKI0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKIwoKCmlmICghZnVuY3Rpb25fZXhpc3RzKCJzdHJpcG9zIikpIHsKCWZ1bmN0aW9uIHN0cmlwb3MoJHN0ciwkbmVlZGxlKSB7CgkJcmV0dXJuIHN0cnBvcyhzdHJ0b2xvd2VyKCRzdHIpLHN0cnRvbG93ZXIoJG5lZWRsZSkpOwoJfQp9CmlmICghZnVuY3Rpb25fZXhpc3RzKCJhcnJheV9kaWZmX2tleSIpKSB7CiAgICBmdW5jdGlvbiBhcnJheV9kaWZmX2tleSgpCiAgICB7CiAgICAgICAgJGFycnMgPSBmdW5jX2dldF9hcmdzKCk7CiAgICAgICAgJHJlc3VsdCA9IGFycmF5X3NoaWZ0KCRhcnJzKTsKICAgICAgICBmb3JlYWNoICgkYXJycyBhcyAkYXJyYXkpIHsKICAgICAgICAgICAgZm9yZWFjaCAoJHJlc3VsdCBhcyAka2V5ID0+ICR2KSB7CiAgICAgICAgICAgICAgICBpZiAoYXJyYXlfa2V5X2V4aXN0cygka2V5LCAkYXJyYXkpKSB7CiAgICAgICAgICAgICAgICAgICAgdW5zZXQoJHJlc3VsdFska2V5XSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuICRyZXN1bHQ7CiAgIH0KfQoKaWYgKCFmdW5jdGlvbl9leGlzdHMoImlzX2Fzc29jIikpIHsKICBmdW5jdGlvbiBpc19hc3NvYygkYXJyYXkpIHsKICAgIHJldHVybiAoaXNfYXJyYXkoJGFycmF5KSAmJiAwICE9PSBjb3VudChhcnJheV9kaWZmX2tleSgkYXJyYXksIGFycmF5X2tleXMoYXJyYXlfa2V5cygkYXJyYXkpKSkpKTsKICB9Cn0KCmNsYXNzIE5lb01vZHVsZSBleHRlbmRzIENNU01vZHVsZSB7CiAgLyoKICAgKgogICAqIEEgY291cGxlIG9mIHZhcmlhYmxlcyBhbmQgbWV0aG9kcyBmb3IgaW50ZXJuYWwgbW9kdWxlIHVzYWdlCiAgICoKICAgKi8KICB2YXIgJF9kYXRhc3RvcmFnZT1mYWxzZTsKICB2YXIgJF9pZD1mYWxzZTsKICB2YXIgJF9yZXR1cm5pZD1mYWxzZTsKICB2YXIgJF9lcnJvcnM9IiI7CiAgdmFyICRfdGhlbWVvYmplY3Q9ZmFsc2U7CiAgZnVuY3Rpb24gX2dldGRzKCkgewogICAgaWYgKCR0aGlzLT5fZGF0YXN0b3JhZ2UhPT1mYWxzZSkgcmV0dXJuICR0aGlzLT5fZGF0YXN0b3JhZ2U7CiAgICAkdGhpcy0+X2RhdGFzdG9yYWdlPSR0aGlzLT5HZXRNb2R1bGVJbnN0YW5jZSgiTmVvRGF0YVN0b3JhZ2UiKTsKICAgIHJldHVybiAkdGhpcy0+X2RhdGFzdG9yYWdlOwogIH0KICBmdW5jdGlvbiBfZ2V0dGhlbWVvYmooKSB7CiAgICBnbG9iYWwgJGdDbXM7CiAgICBpZiAoJHRoaXMtPl90aGVtZW9iamVjdCE9PWZhbHNlKSByZXR1cm4gJHRoaXMtPl90aGVtZW9iamVjdDsKICAgICR0aGlzLT5fdGhlbWVvYmplY3Q9JHRoZW1lT2JqZWN0ID0gJGdDbXMtPnZhcmlhYmxlc1snYWRtaW50aGVtZSddOwogICAgcmV0dXJuICR0aGlzLT5fdGhlbWVvYmplY3Q7CiAgfQoKICAvKgogICAqCiAgICogU3RhbmRhcmQgbW9kdWxlLUFQSS1tZXRob2RzIGJlaGF2aW5nIGluIGEgc3RhbmRhcmQgd2F5CiAgICoKICAgKi8KCglmdW5jdGlvbiBHZXROYW1lKCkgewoJCXJldHVybiAnTmVvTW9kdWxlJzsKCX0KCiAgZnVuY3Rpb24gR2V0VmVyc2lvbigpIHsKICAgIHJldHVybiAiMC4yLjEiOwogIH0KCiAgZnVuY3Rpb24gR2V0RnJpZW5kbHlOYW1lKCkgewoJCXJldHVybiAiTmVvIE1vZHVsZSBiYXNlLWNsYXNzIjsKCX0KCglmdW5jdGlvbiBJc1BsdWdpbk1vZHVsZSgpIHsKCQlyZXR1cm4gZmFsc2U7Cgl9CgoJZnVuY3Rpb24gTWluaW11bUNNU1ZlcnNpb24oKSB7CgkJcmV0dXJuICcxLjYnOwoJfQoKCWZ1bmN0aW9uIEdldEFkbWluRGVzY3JpcHRpb24oKSB7CgkJcmV0dXJuICJBbiBleHRlbmRlZCBtb2R1bGUtY2xhc3MsIG1haW5seSBmb3IgdGhlIE5lby1zZXJpZXMgbW9kdWxlcywgYnV0IGFsc28gZm9yIG90aGVycyB0byB1c2UiOwoJfQoKCWZ1bmN0aW9uIEhhc0FkbWluKCkgewoJCXJldHVybiBmYWxzZTsKCX0KCglmdW5jdGlvbiBHZXRBdXRob3IoKSB7CgkJcmV0dXJuICdNb3J0ZW4gUG91bHNlbic7Cgl9CgoJZnVuY3Rpb24gR2V0QXV0aG9yRW1haWwoKQl7CgkJcmV0dXJuICdtb3J0ZW5AcG91bHNlbi5vcmcnOwoJfQoKICBmdW5jdGlvbiBHZXRIZWxwKCRsYW5nPSdlbl9VUycpIHsKICAgIHJldHVybiAkdGhpcy0+UHJvY2Vzc1RlbXBsYXRlKCdoZWxwLnRwbCcpOwogCX0KCiAgZnVuY3Rpb24gR2V0Q2hhbmdlTG9nKCkJewoJCXJldHVybiAkdGhpcy0+UHJvY2Vzc1RlbXBsYXRlKCJjaGFuZ2Vsb2cudHBsIik7Cgl9CgogIC8qCiAgICoKICAgKiBTZXR1cCBmdW5jdGlvbnMKICAgKgogICAqLyAgCiAgZnVuY3Rpb24gTmVvU2V0SWQoJGlkKSB7CiAgICAkdGhpcy0+X2lkPSRpZDsKICB9ICAKICBmdW5jdGlvbiBOZW9TZXRSZXR1cm5JZCgkcmV0dXJuaWQpIHsKICAgICR0aGlzLT5fcmV0dXJuaWQ9JHJldHVybmlkOwogIH0KICBmdW5jdGlvbiBOZW9TZXR1cCgkaWQsJG1vZHVsZSwkcmV0dXJuaWQ9IjAiKSB7CiAgICAkdGhpcy0+TmVvU2V0SWQoJGlkKTsKICAgICR0aGlzLT5OZW9TZXRSZXR1cm5JZCgkcmV0dXJuaWQpOwogICAgJHRoaXMtPlNtYXJ0eUFzc2lnbkNNUygkbW9kdWxlKTsKICAgICR0aGlzLT5TbWFydHlBc3NpZ24oIm1vZHVsZV9pZCIsJGlkKTsKICB9CgoKICAvKgogICAqCiAgICogR2VuZXJhbCBzaG9ydGN1dCBmdW5jdGlvbnMKICAgKgogICAqLwogIGZ1bmN0aW9uIFByZWYoJHByZWZuYW1lLCRkZWZhdWx0PSIiKSB7CiAgICByZXR1cm4gJHRoaXMtPkdldFByZWZlcmVuY2UoJHByZWZuYW1lLCRkZWZhdWx0KTsKICB9CgogIGZ1bmN0aW9uIE5lb0Ntc0xpbmsoJHBhcmFtcz1hcnJheSgpKSB7CiAgICAvL0NyZWF0ZUxpbmsoJGlkLCAkYWN0aW9uLCAkcmV0dXJuaWQ9JycsICRjb250ZW50cz0nJywgJHBhcmFtcz1hcnJheSgpLCAkd2Fybl9tZXNzYWdlPScnLCAkb25seWhyZWY9ZmFsc2UsICRpbmxpbmU9ZmFsc2UsICRhZGR0dGV4dD0nJywgJHRhcmdldGNvbnRlbnRvbmx5PWZhbHNlLCAkcHJldHR5dXJsPScnKQogICAgcmV0dXJuICR0aGlzLT5DcmVhdGVMaW5rKAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgiaWQiLCRwYXJhbXMsJHRoaXMtPl9pZCksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJhY3Rpb24iLCRwYXJhbXMsIiIpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgicmV0dXJuaWQiLCRwYXJhbXMsJHRoaXMtPl9yZXR1cm5pZCksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJjb250ZW50IiwkcGFyYW1zLCIiKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoInBhcmFtcyIsJHBhcmFtcyxhcnJheSgpKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoIndhcm5tZXNzYWdlIiwkcGFyYW1zLCIiKSwKICAgICAgZmFsc2UsCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJpbmxpbmUiLCRwYXJhbXMsZmFsc2UpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgiYWRkdGV4dCIsJHBhcmFtcywiIiksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJwcmV0dHl1cmwiLCRwYXJhbXMsIiIpCiAgICApOwogIH0KCiAgZnVuY3Rpb24gTmVvQ21zVXJsKCRwYXJhbXM9YXJyYXkoKSkgewogICAgLy9DcmVhdGVMaW5rKCRpZCwgJGFjdGlvbiwgJHJldHVybmlkPScnLCAkY29udGVudHM9JycsICRwYXJhbXM9YXJyYXkoKSwgJHdhcm5fbWVzc2FnZT0nJywgJG9ubHlocmVmPWZhbHNlLCAkaW5saW5lPWZhbHNlLCAkYWRkdHRleHQ9JycsICR0YXJnZXRjb250ZW50b25seT1mYWxzZSwgJHByZXR0eXVybD0nJykKICAgIHJldHVybiAkdGhpcy0+Q3JlYXRlTGluaygKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoImlkIiwkcGFyYW1zLCR0aGlzLT5faWQpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgiYWN0aW9uIiwkcGFyYW1zLCIiKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoInJldHVybmlkIiwkcGFyYW1zLCR0aGlzLT5fcmV0dXJuaWQpLAogICAgICAiIiwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoInBhcmFtcyIsJHBhcmFtcyxhcnJheSgpKSwKICAgICAgIiIsCiAgICAgIHRydWUgLAogICAgICBmYWxzZSwKICAgICAgIiIsCiAgICAgIGZhbHNlLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgicHJldHR5dXJsIiwkcGFyYW1zLCIiKQogICAgKTsKICB9CgogIGZ1bmN0aW9uIE5lb1JlZGlyZWN0KCRwYXJhbXM9YXJyYXkoKSkgewogICAgLy9SZWRpcmVjdCgkaWQsICRhY3Rpb24sICRyZXR1cm5pZD0nJywgJHBhcmFtcz1hcnJheSgpLCAkaW5saW5lPWZhbHNlKQogICAgcmV0dXJuICR0aGlzLT5SZWRpcmVjdCgKICAgICAgJHRoaXMtPk5QVigiaWQiLCRwYXJhbXMsJHRoaXMtPl9pZCksCiAgICAgICR0aGlzLT5OUFYoImFjdGlvbiIsJHBhcmFtcywiIiksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJyZXR1cm5pZCIsJHBhcmFtcywkdGhpcy0+X3JldHVybmlkKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoInBhcmFtcyIsJHBhcmFtcyxhcnJheSgpKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoImlubGluZSIsJHBhcmFtcyxmYWxzZSkKICAgICk7CiAgfQoKCiAgLyoKICAgKgogICAqIEZvcm0tZ2VuZXJhdGlvbiBmdW5jdGlvbnMsIGluY2x1ZGluZyBzbWFydHkgYXNzaWdubWVudHMKICAgKgogICAqLwoKICBmdW5jdGlvbiBOZW9Gb3JtU3RhcnQoJHBhcmFtcz1hcnJheSgpKSB7CiAgICAvL0NyZWF0ZUZvcm1TdGFydCgkaWQsICRhY3Rpb249J2RlZmF1bHQnLCAkcmV0dXJuaWQ9JycsICRtZXRob2Q9J3Bvc3QnLCAkZW5jdHlwZT0nJywgJGlubGluZT1mYWxzZSwgJGlkc3VmZml4PScnLCAkcGFyYW1zID0gYXJyYXkoKSwgJGV4dHJhPScnKSAgICAKICAgIHJldHVybiAkdGhpcy0+Q3JlYXRlRm9ybVN0YXJ0KAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgiaWQiLCRwYXJhbXMsJHRoaXMtPl9pZCksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJhY3Rpb24iLCRwYXJhbXMsImRlZmF1bHQiKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoInJldHVybmlkIiwkcGFyYW1zLCR0aGlzLT5fcmV0dXJuaWQpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgibWV0aG9kIiwkcGFyYW1zLCJwb3N0IiksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKGFycmF5KCJlbmN0eXBlIiwiZW5jb2RpbmciKSwkcGFyYW1zLCIiKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoImlubGluZSIsJHBhcmFtcyxmYWxzZSksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJpZHN1ZmZpeCIsJHBhcmFtcywiIiksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJwYXJhbXMiLCRwYXJhbXMsYXJyYXkoKSksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJleHRyYSIsJHBhcmFtcywiIikKICAgICk7CiAgfQogIGZ1bmN0aW9uIFNtYXJ0eUZvcm1TdGFydCgkc21hcnR5bmFtZSwkcGFyYW1zPWFycmF5KCkpIHsKICAgICR0aGlzLT5TbWFydHlBc3NpZ24oJHNtYXJ0eW5hbWUsJHRoaXMtPk5lb0Zvcm1TdGFydCgkcGFyYW1zKSk7CiAgfQogIGZ1bmN0aW9uIFNtYXJ0eVVwbG9hZEZvcm1TdGFydCgkc21hcnR5bmFtZSwkcGFyYW1zPWFycmF5KCkpIHsKICAgICRwYXJhbXNbIm1ldGhvZCJdPSJwb3N0IjsKICAgICRwYXJhbXNbImVuY3R5cGUiXT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSI7CiAgICAkdGhpcy0+U21hcnR5Rm9ybVN0YXJ0KCRzbWFydHluYW1lLCRwYXJhbXMpOwogIH0KCiAgZnVuY3Rpb24gTmVvRm9ybUVuZCgpIHsKICAgIHJldHVybiAkdGhpcy0+Q3JlYXRlRm9ybUVuZCgpOwogIH0KICBmdW5jdGlvbiBTbWFydHlGb3JtRW5kKCRzbWFydHluYW1lKSB7CiAgICAkdGhpcy0+U21hcnR5QXNzaWduKCRzbWFydHluYW1lLCR0aGlzLT5OZW9Gb3JtRW5kKCkpOwogIH0KICBmdW5jdGlvbiBTbWFydHlJbnB1dFN1Ym1pdCgkc21hcnR5bmFtZSwkbmFtZSwkdGV4dCwkY29uZmlybXRleHQ9IiIpIHsKICAgICR0aGlzLT5TbWFydHlBc3NpZ24oJHNtYXJ0eW5hbWUsJHRoaXMtPk5lb0lucHV0U3VibWl0KGFycmF5KCJuYW1lIj0+JG5hbWUsInZhbHVlIj0+JHRleHQsImNvbmZpcm10ZXh0Ij0+JGNvbmZpcm10ZXh0KSkpOwogIH0KICBmdW5jdGlvbiBTbWFydHlJbnB1dEhpZGRlbigkc21hcnR5bmFtZSwkbmFtZSwkdmFsdWU9IiIpIHsKICAgICR0aGlzLT5TbWFydHlBc3NpZ24oJHNtYXJ0eW5hbWUsJHRoaXMtPk5lb0lucHV0SGlkZGVuKGFycmF5KCJuYW1lIj0+JG5hbWUsInZhbHVlIj0+JHZhbHVlKSkpOwogIH0KICBmdW5jdGlvbiBTbWFydHlJbnB1dEhpZGRlbk11bHRpKCRzbWFydHluYW1lLCRmaWVsZHM9YXJyYXkoKSkgewogICAgJG91dHB1dD0iXG4iOwogICAgZm9yZWFjaCgkZmllbGRzIGFzICRuYW1lPT4kdmFsdWUpIHsKICAgICAgJG91dHB1dC49JHRoaXMtPk5lb0lucHV0SGlkZGVuKGFycmF5KCJuYW1lIj0+JG5hbWUsInZhbHVlIj0+JHZhbHVlKSkuIlxuIjsKICAgIH0KICAgICRvdXRwdXQuPSJcbiI7CiAgICAkdGhpcy0+U21hcnR5QXNzaWduKCRzbWFydHluYW1lLCRvdXRwdXQpOwogIH0KCiAgZnVuY3Rpb24gU21hcnR5TGluaygkc21hcnR5bmFtZSwkZmllbGRzPWFycmF5KCkpIHsKICAgICR0aGlzLT5TbWFydHlBc3NpZ24oJHNtYXJ0eW5hbWUsJHRoaXMtPk5lb0Ntc0xpbmsoJGZpZWxkcykpOwogIH0KCiAgZnVuY3Rpb24gTmVvSW5wdXRGaWxlKCRwYXJhbXMpIHsKICAvL3B1YmxpYyBmdW5jdGlvbiBDcmVhdGVJbnB1dEZpbGUoJGlkLCAkbmFtZSwgJGFjY2VwdD0nJywgJHNpemU9JzEwJywkYWRkdHRleHQ9JycpCiAgIHJldHVybiAkdGhpcy0+Q3JlYXRlSW5wdXRGaWxlKAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgiaWQiLCRwYXJhbXMsJHRoaXMtPl9pZCksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJuYW1lIiwkcGFyYW1zLCIiKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoImFjY2VwdCIsJHBhcmFtcywiIiksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJzaXplIiwkcGFyYW1zLCIxMCIpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgiYWRkdGV4dCIsJHBhcmFtcywiIikKICAgICk7CiAgfQoKICBmdW5jdGlvbiBOZW9JbnB1dFRleHQoJHBhcmFtcz1hcnJheSgpKSB7CiAgICByZXR1cm4gJHRoaXMtPkNyZWF0ZUlucHV0VGV4dCgKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoImlkIiwkcGFyYW1zLCR0aGlzLT5faWQpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgibmFtZSIsJHBhcmFtcywiIiksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJ2YWx1ZSIsJHBhcmFtcywiIiksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJzaXplIiwkcGFyYW1zLCIxMCIpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgibWF4bGVuZ3RoIiwkcGFyYW1zLCIyNTUiKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoImFkZHRleHQiLCRwYXJhbXMsIiIpCiAgICApOwogIH0KCiAgZnVuY3Rpb24gTmVvVGV4dGFyZWEoJHBhcmFtcz1hcnJheSgpKSB7ICAgIAogICAgcmV0dXJuICR0aGlzLT5DcmVhdGVUZXh0QXJlYSgKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoImVuYWJsZXd5c2l3eWciLCRwYXJhbXMsZmFsc2UpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgiaWQiLCRwYXJhbXMsJHRoaXMtPl9pZCksICAgICAgCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKGFycmF5KCJ2YWx1ZSIsInRleHQiKSwkcGFyYW1zLCIiKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoIm5hbWUiLCRwYXJhbXMsIiIpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgiY2xhc3NuYW1lIiwkcGFyYW1zLCIiKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoImh0bWxpZCIsJHBhcmFtcywiIiksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJlbmNvZGluZyIsJHBhcmFtcywiIiksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJzdHlsZXNoZWV0IiwkcGFyYW1zLCIiKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoImNvbHMiLCRwYXJhbXMsIjgwIiksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJyb3dzIiwkcGFyYW1zLCIxNSIpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgiZm9yY2V3eXNpd3lnIiwkcGFyYW1zLCIiKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoIndhbnRlZHN5bnRheCIsJHBhcmFtcywiIiksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJhZGR0ZXh0IiwkcGFyYW1zLCIiKQogICAgKTsKICB9CgogIGZ1bmN0aW9uIE5lb0lucHV0Q2hlY2tib3goJHBhcmFtcz1hcnJheSgpKSB7CiAgICBpZiAoaXNzZXQoJHBhcmFtc1siY2hlY2tlZCJdKSAmJiAkcGFyYW1zWyJjaGVja2VkIl09PXRydWUpIHsKICAgICAgJHBhcmFtc1sic2VsZWN0ZWR2YWx1ZSJdPSRwYXJhbXNbInZhbHVlIl07CiAgICB9CiAgICByZXR1cm4gJHRoaXMtPkNyZWF0ZUlucHV0Q2hlY2tib3goCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJpZCIsJHBhcmFtcywkdGhpcy0+X2lkKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoIm5hbWUiLCRwYXJhbXMsIiIpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgidmFsdWUiLCRwYXJhbXMsIiIpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgic2VsZWN0ZWR2YWx1ZSIsJHBhcmFtcywiIiksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJhZGR0ZXh0IiwkcGFyYW1zLCIiKQogICAgKTsKICB9ICAKCiAgZnVuY3Rpb24gTmVvSW5wdXRTdWJtaXQoJHBhcmFtcz1hcnJheSgpKSB7CiAgICByZXR1cm4gJHRoaXMtPkNyZWF0ZUlucHV0U3VibWl0KAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgiaWQiLCRwYXJhbXMsJHRoaXMtPl9pZCksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJuYW1lIiwkcGFyYW1zLCIiKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoInZhbHVlIiwkcGFyYW1zLCIiKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoImFkZHRleHQiLCRwYXJhbXMsIiIpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgiaW1hZ2UiLCRwYXJhbXMsIiIpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgiY29uZmlybXRleHQiLCRwYXJhbXMsIiIpCiAgICApOwogIH0KCiAgZnVuY3Rpb24gTmVvSW5wdXRSZXNldCgkcGFyYW1zPWFycmF5KCkpIHsKICAgIHJldHVybiAkdGhpcy0+Q3JlYXRlSW5wdXRUZXh0KAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgiaWQiLCRwYXJhbXMsJHRoaXMtPl9pZCksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJuYW1lIiwkcGFyYW1zLCIiKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoInZhbHVlIiwkcGFyYW1zLCIiKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoImFkZHRleHQiLCRwYXJhbXMsIlJlc2V0IikKICAgICk7CiAgfQoKICBmdW5jdGlvbiBOZW9JbnB1dEhpZGRlbigkcGFyYW1zPWFycmF5KCkpIHsKICAgIHJldHVybiAkdGhpcy0+Q3JlYXRlSW5wdXRIaWRkZW4oCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJpZCIsJHBhcmFtcywkdGhpcy0+X2lkKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoIm5hbWUiLCRwYXJhbXMsIiIpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgidmFsdWUiLCRwYXJhbXMsIiIpCiAgICApOwogIH0KICAKICBmdW5jdGlvbiBOZW9JbnB1dERyb3Bkb3duKCRwYXJhbXM9YXJyYXkoKSkgewogICAgcmV0dXJuICR0aGlzLT5DcmVhdGVJbnB1dERyb3Bkb3duKAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgiaWQiLCRwYXJhbXMsJHRoaXMtPl9pZCksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJuYW1lIiwkcGFyYW1zLCIiKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoIml0ZW1zIiwkcGFyYW1zLCIiKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoInNlbGVjdGVkaW5kZXgiLCRwYXJhbXMsLTEpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgic2VsZWN0ZWR2YWx1ZSIsJHBhcmFtcywiIiksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJhZGR0ZXh0IiwkcGFyYW1zLCIiKQogICAgKTsKICB9CgogIGZ1bmN0aW9uIE5lb0lucHV0UmFkaW9Hcm91cCgkcGFyYW1zPWFycmF5KCkpIHsKICAgIHJldHVybiAkdGhpcy0+Q3JlYXRlSW5wdXRSYWRpb0dyb3VwKAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgiaWQiLCRwYXJhbXMsJHRoaXMtPl9pZCksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJuYW1lIiwkcGFyYW1zLCIiKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoIml0ZW1zIiwkcGFyYW1zLCIiKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoInNlbGVjdGVkdmFsdWUiLCRwYXJhbXMsLTEpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgiYWRkdGV4dCIsJHBhcmFtcywiIiksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJkZWxpbWl0ZXIiLCRwYXJhbXMsIiIpCiAgICApOwogIH0KICAKICBmdW5jdGlvbiBOZW9JbnB1dFNlbGVjdExpc3QoJHBhcmFtcz1hcnJheSgpKSB7CiAgICByZXR1cm4gJHRoaXMtPkNyZWF0ZUlucHV0U2VsZWN0TGlzdCgKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoImlkIiwkcGFyYW1zLCR0aGlzLT5faWQpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgibmFtZSIsJHBhcmFtcywiIiksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJpdGVtcyIsJHBhcmFtcywiIiksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJzZWxlY3RlZGl0ZW1zIiwkcGFyYW1zLGFycmF5KCkpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgic2l6ZSIsJHBhcmFtcywzKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoImFkZHRleHQiLCRwYXJhbXMsIiIpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgibXVsdGlwbGUiLCRwYXJhbXMsdHJ1ZSkKICAgICk7CiAgfSAgCgogIC8qKgogICAqCiAgICogTGlzdCBoZWxwZXIgZnVuY3Rpb25zCiAgICoKICAgKi8KICAgZnVuY3Rpb24gTmVvRGVsZXRlSWNvbigkYWN0aW9uLCR0ZXh0LCRwYXJhbXM9YXJyYXkoKSwkY29uZmlybWF0aW9uPSIiKSB7CiAgICAgJGljb249JHRoaXMtPkNyZWF0ZUxpbmsoJHRoaXMtPl9pZCwgJGFjdGlvbiwgJHRoaXMtPl9yZXR1cm5pZCwkdGhpcy0+TmVvU3lzdGVtSWNvbigiZGVsZXRlLmdpZiIsJHRleHQpLCRwYXJhbXMsICRjb25maXJtYXRpb24pOwogICAgIHJldHVybiAkaWNvbjsKICAgfQoKICAgZnVuY3Rpb24gTmVvQ29weUljb24oJGFjdGlvbiwkdGV4dCwkcGFyYW1zPWFycmF5KCksJGNvbmZpcm1hdGlvbj0iIikgeyAgICAgCiAgICAgJGljb249JHRoaXMtPkNyZWF0ZUxpbmsoJHRoaXMtPl9pZCwgJGFjdGlvbiwgJHRoaXMtPl9yZXR1cm5pZCwJJHRoaXMtPk5lb1N5c3RlbUljb24oImNvcHkuZ2lmIiwkdGV4dCksICRwYXJhbXMsICRjb25maXJtYXRpb24pOwogICAgIHJldHVybiAkaWNvbjsKICAgfQoKICAgZnVuY3Rpb24gTmVvRWRpdEljb24oJGFjdGlvbiwkdGV4dCwkcGFyYW1zPWFycmF5KCksJGNvbmZpcm1hdGlvbj0iIikgewogICAgICRpY29uPSR0aGlzLT5DcmVhdGVMaW5rKCR0aGlzLT5faWQsICRhY3Rpb24sICR0aGlzLT5fcmV0dXJuaWQsCSR0aGlzLT5OZW9TeXN0ZW1JY29uKCJlZGl0LmdpZiIsJHRleHQpLAkkcGFyYW1zLCAkY29uZmlybWF0aW9uKTsKICAgICByZXR1cm4gJGljb247CiAgIH0KCiAgIGZ1bmN0aW9uIE5lb0FkZEljb24oJGFjdGlvbiwkdGV4dCwkcGFyYW1zPWFycmF5KCksJGNvbmZpcm1hdGlvbj0iIikgeyAgICAgCiAgICAgJGljb249JHRoaXMtPkNyZWF0ZUxpbmsoJHRoaXMtPl9pZCwgJGFjdGlvbiwgJHRoaXMtPl9yZXR1cm5pZCwgJHRoaXMtPk5lb1N5c3RlbUljb24oIm5ld29iamVjdC5naWYiLCR0ZXh0KSwgJHBhcmFtcywgJGNvbmZpcm1hdGlvbik7CiAgICAgLy8kaWNvbi49JHRoaXMtPkNyZWF0ZUxpbmsoJHRoaXMtPl9pZCwgICRhY3Rpb24sICR0aGlzLT5fcmV0dXJuaWQsICR0ZXh0LCAkcGFyYW1zLCAkY29uZmlybWF0aW9uLCBmYWxzZSwgZmFsc2UsICdjbGFzcz0icGFnZW9wdGlvbnMiJyk7CgogICAgIC8vPSR0aGlzLT5DcmVhdGVMaW5rKCRpZCwgJ2VkaXR0ZW1wbGF0ZScsIDAsICR0aGVtZU9iamVjdC0+RGlzcGxheUltYWdlKCdpY29ucy9zeXN0ZW0vbmV3b2JqZWN0LmdpZicsJHRoaXMtPkxhbmcoImFkZHRlbXBsYXRlIiksJycsJycsJ3N5c3RlbWljb24nKSwgYXJyYXkoKSwgJycsIGZhbHNlLCBmYWxzZSwgJycpIC4nICcuICR0aGlzLT5DcmVhdGVMaW5rKCRpZCwgJ2VkaXR0ZW1wbGF0ZScsICRyZXR1cm5pZCwgJHRoaXMtPkxhbmcoImFkZHRlbXBsYXRlIiksIGFycmF5KCJ0b2RvIj0+ImFkZCIpLCAnJywgZmFsc2UsIGZhbHNlLCAnY2xhc3M9InBhZ2VvcHRpb25zIicpOwogICAgcmV0dXJuICRpY29uOwogICB9CiAgIAogICBmdW5jdGlvbiBOZW9TeXN0ZW1JY29uKCRpY29uLCR0ZXh0PSIiKSB7CiAgICAgJHRoZW1lb2JqPSR0aGlzLT5fZ2V0dGhlbWVvYmooKTsKICAgICByZXR1cm4gJHRoZW1lb2JqLT5EaXNwbGF5SW1hZ2UoJ2ljb25zL3N5c3RlbS8nLiRpY29uLCAkdGV4dCwnJywnJywnc3lzdGVtaWNvbicpOwogICB9CgogICBmdW5jdGlvbiBOZW9IaWRkZW5Db250ZW50KCR0ZXh0LCAkY29udGVudCwgJGNsaWNrdHlwZT0idGV4dCIsICRzdGFydHNob3duPWZhbHNlKSB7CiAgICAgcmV0dXJuICI8c3Ryb25nPiR0ZXh0PC9zdHJvbmc+PGJyLz4kY29udGVudCI7CiAgIH0KICAgCQkJCgogIC8qKgogICAqCiAgICogTmVvRGF0YVN0b3JhZ2Ugc2hvcnRjdXRzCiAgICoKICAgKi8KICBmdW5jdGlvbiBBZGRFbnRpdHkoJHRhYmxlLCAkcHJvcHM9YXJyYXkoKSkgewogICAgJGRzPSR0aGlzLT5fZ2V0ZHMoKTsKICAgIGlmICgkZHMhPT1mYWxzZSkgewogICAgICByZXR1cm4gJGRzLT5BZGRFbnRpdHkoJHRoaXMtPkdldE5hbWUoKSwkdGFibGUsJHByb3BzKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiAkdGhpcy0+RXJyb3IoImZ1bmN0aW9uIEFkZEVudGl0eTogQ2Fubm90IGFjY2VzcyBOZW9EYXRhU3RvcmFnZSBtb2R1bGUiKTsKICAgIH0KICB9CgoKICBmdW5jdGlvbiBEZWxldGVFbnRpdHkoJGlkKSB7CiAgICAkZHM9JHRoaXMtPl9nZXRkcygpOwogICAgaWYgKCRkcyE9PWZhbHNlKSB7CiAgICAgIHJldHVybiAkZHMtPkRlbGV0ZUVudGl0eSgkaWQpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuICR0aGlzLT5FcnJvcigiZnVuY3Rpb24gRGVsZXRlRW50aXR5OiBDYW5ub3QgYWNjZXNzIE5lb0RhdGFTdG9yYWdlIG1vZHVsZSIpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gR2V0RW50aXR5KCRpZCwgJG92ZXJyaWRlcHJvcHM9YXJyYXkoKSwgJGZpbGxmaWVsZHM9YXJyYXkoKSkgewogICAgJGRzPSR0aGlzLT5fZ2V0ZHMoKTsKICAgIGlmICgkZHMhPT1mYWxzZSkgewogICAgICByZXR1cm4gJGRzLT5HZXRFbnRpdHkoJGlkLCAkb3ZlcnJpZGVwcm9wcywgJGZpbGxmaWVsZHMpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuICR0aGlzLT5FcnJvcigiZnVuY3Rpb24gR2V0RW50aXR5OiBDYW5ub3QgYWNjZXNzIE5lb0RhdGFTdG9yYWdlIG1vZHVsZSIpOwogICAgfSAgICAKICB9CgogIGZ1bmN0aW9uIEdldEVudGl0aWVzKCR0YWJsZT0iIiwgJGNyaXRlcmlhPWFycmF5KCksICRhbHdheXNyZXR1cm5hcnJheT1mYWxzZSkgewogICAgJGRzPSR0aGlzLT5fZ2V0ZHMoKTsKICAgIGlmICgkZHMhPT1mYWxzZSkgewogICAgICByZXR1cm4gJGRzLT5HZXRFbnRpdGllcygkdGhpcy0+R2V0TmFtZSgpLCAkdGFibGUsICRjcml0ZXJpYSk7CiAgICB9IGVsc2UgewogICAgICBpZiAoJGFsd2F5c3JldHVybmFycmF5KSB7CiAgICAgICAgcmV0dXJuIGFycmF5KCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5FcnJvcigiZnVuY3Rpb24gR2V0RW50aXRpZXM6IENhbm5vdCBhY2Nlc3MgTmVvRGF0YVN0b3JhZ2UgbW9kdWxlIik7CiAgICAgIH0KICAgIH0KICB9CgogIGZ1bmN0aW9uIEdldE9uZUVudGl0eSgkdGFibGUsICRjcml0ZXJpYT1hcnJheSgpLCAkZmFpbGlmbXVsdGlwbGU9ZmFsc2UpIHsKICAgICRkcz0kdGhpcy0+X2dldGRzKCk7CiAgICBpZiAoJGRzIT09ZmFsc2UpIHsKICAgICAgcmV0dXJuICRkcy0+R2V0T25lRW50aXR5KCR0aGlzLT5HZXROYW1lKCksICR0YWJsZSwgJGNyaXRlcmlhLCAkZmFpbGlmbXVsdGlwbGUpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuICR0aGlzLT5FcnJvcigiZnVuY3Rpb24gR2V0T25lRW50aXR5OiBDYW5ub3QgYWNjZXNzIE5lb0RhdGFTdG9yYWdlIG1vZHVsZSIpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gR2V0RW50aXRpZXNGdWxsKCR0YWJsZT0iIiwgJGNyaXRlcmlhPWFycmF5KCksICRhbHdheXNyZXR1cm5hcnJheT1mYWxzZSkgewogICAgJGRzPSR0aGlzLT5fZ2V0ZHMoKTsKICAgIGlmICgkZHMhPT1mYWxzZSkgewogICAgICByZXR1cm4gJGRzLT5HZXRFbnRpdGllc0Z1bGwoJHRoaXMtPkdldE5hbWUoKSwgJHRhYmxlLCAkY3JpdGVyaWEpOwogICAgfSBlbHNlIHsKICAgICAgaWYgKCRhbHdheXNyZXR1cm5hcnJheSkgewogICAgICAgIHJldHVybiBhcnJheSgpOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiAkdGhpcy0+RXJyb3IoImZ1bmN0aW9uIEdldEVudGl0aWVzRnVsbDogQ2Fubm90IGFjY2VzcyBOZW9EYXRhU3RvcmFnZSBtb2R1bGUiKTsKICAgICAgfQogICAgfQogIH0KCiAgZnVuY3Rpb24gU2V0RW50aXR5UHJvcCgkaWQsJHByb3BuYW1lLCRwcm9wdmFsdWUsJHByb3B0eXBlPSJ1bmRlZmluZWQiKSB7CiAgICAkZHM9JHRoaXMtPl9nZXRkcygpOwogICAgaWYgKCRkcyE9PWZhbHNlKSB7CiAgICAgIHJldHVybiAkZHMtPlNldEVudGl0eVByb3AoJGlkLCRwcm9wbmFtZSwkcHJvcHZhbHVlLCRwcm9wdHlwZSk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gJHRoaXMtPkVycm9yKCJmdW5jdGlvbiBTZXRFbnRpdHlQcm9wOiBDYW5ub3QgYWNjZXNzIE5lb0RhdGFTdG9yYWdlIG1vZHVsZSIpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gQ2xlYXJFbnRpdHlQcm9wKCRpZCwgJHByb3BuYW1lKSB7CiAgICAkZHM9JHRoaXMtPl9nZXRkcygpOwogICAgaWYgKCRkcyE9PWZhbHNlKSB7CiAgICAgIHJldHVybiAkZHMtPkNsZWFyRW50aXR5UHJvcCgkaWQsICRwcm9wbmFtZSk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gJHRoaXMtPkVycm9yKCJmdW5jdGlvbiBDbGVhckVudGl0eVByb3A6IENhbm5vdCBhY2Nlc3MgTmVvRGF0YVN0b3JhZ2UgbW9kdWxlIik7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBTZXRFbnRpdHlQcm9wcygkaWQsICRwcm9wcy8qLCAkY2xlYXI9dHJ1ZSovKSB7CiAgICAvL2VjaG8gImhpMSI7ZGllKCk7CiAgICAkZHM9JHRoaXMtPl9nZXRkcygpOwogICAgaWYgKCRkcyE9PWZhbHNlKSB7CiAgICAgIHJldHVybiAkZHMtPlNldEVudGl0eVByb3BzKCRpZCwgJHByb3BzLyosICRjbGVhciovKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiAkdGhpcy0+RXJyb3IoImZ1bmN0aW9uIFNldEVudGl0eVByb3BzOiBDYW5ub3QgYWNjZXNzIE5lb0RhdGFTdG9yYWdlIG1vZHVsZSIpOwogICAgfQogIH0KICAKICBmdW5jdGlvbiBTZXRFbnRpdHlQcm9wc0Zyb21BcnJheSgkaWQsICRwcm9wcywgJHZhbHVlcywgJGNsZWFyPXRydWUpIHsKICAgIC8vZWNobyAiaGkxIjtkaWUoKTsKICAgICRkcz0kdGhpcy0+X2dldGRzKCk7CiAgICBpZiAoJGRzIT09ZmFsc2UpIHsKICAgICAgcmV0dXJuICRkcy0+U2V0RW50aXR5UHJvcHNGcm9tQXJyYXkoJGlkLCAkcHJvcHMsICR2YWx1ZXMsICRjbGVhcik7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gJHRoaXMtPkVycm9yKCJmdW5jdGlvbiBTZXRFbnRpdHlQcm9wc0Zyb21BcnJheTogQ2Fubm90IGFjY2VzcyBOZW9EYXRhU3RvcmFnZSBtb2R1bGUiKTsKICAgIH0KICB9CgoKCiAgZnVuY3Rpb24gU2V0RW50aXR5UHJvcHNPbkNyaXRlcmlhKCR0YWJsZSwgJHByb3BzLCAkY3JpdGVyaWEsICRjcmVhdGU9dHJ1ZSwgJGNsZWFyPWZhbHNlKSB7CiAgICAkZHM9JHRoaXMtPl9nZXRkcygpOwogICAgaWYgKCRkcyE9PWZhbHNlKSB7CiAgICAgIHJldHVybiAkZHMtPlNldEVudGl0eVByb3BzT25Dcml0ZXJpYSgkdGhpcy0+R2V0TmFtZSgpLCAkdGFibGUsICRwcm9wcywgJGNyaXRlcmlhLCAkY3JlYXRlLCAkY2xlYXIpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuICR0aGlzLT5FcnJvcigiZnVuY3Rpb24gU2V0RW50aXR5UHJvcHNPbkNyaXRlcmlhOiBDYW5ub3QgYWNjZXNzIE5lb0RhdGFTdG9yYWdlIG1vZHVsZSIpOzs7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBSZXNldEVudGl0eVByb3BzKCRpZCwgJG5ld3Byb3BzPWFycmF5KCkpIHsKICAgICRkcz0kdGhpcy0+X2dldGRzKCk7CiAgICBpZiAoJGRzIT09ZmFsc2UpIHsKICAgICAgcmV0dXJuICRkcy0+UmVzZXRFbnRpdHlQcm9wcygkaWQsICRuZXdwcm9wKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiAkdGhpcy0+RXJyb3IoImZ1bmN0aW9uIFJlc2V0RW50aXR5UHJvcHM6IENhbm5vdCBhY2Nlc3MgTmVvRGF0YVN0b3JhZ2UgbW9kdWxlIik7OzsKICAgIH0KICB9CgogIGZ1bmN0aW9uIFJlbW92ZU1vZHVsZUVudGl0aWVzKCkgewogICAgJGRzPSR0aGlzLT5fZ2V0ZHMoKTsKICAgIGlmICgkZHMhPT1mYWxzZSkgewogICAgICByZXR1cm4gJGRzLT5SZW1vdmVNb2R1bGVFbnRpdGllcygkdGhpcy0+R2V0TmFtZSgpKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiAkdGhpcy0+RXJyb3IoImZ1bmN0aW9uIFJlbW92ZU1vZHVsZUVudGl0aWVzOiBDYW5ub3QgYWNjZXNzIE5lb0RhdGFTdG9yYWdlIG1vZHVsZSIpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gQ2xlYXJFbnRpdHlQcm9wcygkaWQpIHsKICAgICRkcz0kdGhpcy0+X2dldGRzKCk7CiAgICBpZiAoJGRzIT09ZmFsc2UpIHsKICAgICAgcmV0dXJuICRkcy0+Q2xlYXJFbnRpdHlQcm9wcygkaWQpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuICR0aGlzLT5FcnJvcigiZnVuY3Rpb24gQ2xlYXJFbnRpdHlQcm9wczogQ2Fubm90IGFjY2VzcyBOZW9EYXRhU3RvcmFnZSBtb2R1bGUiKTsKICAgIH0gICAgCiAgfQoKICBmdW5jdGlvbiBDb21wYXJlRW50aXRpZXMoJGVudGl0eTEsICRlbnRpdHkyLCAkc29ydGZpZWxkKSB7CiAgICAkZHM9JHRoaXMtPl9nZXRkcygpOwogICAgaWYgKCRkcyE9PWZhbHNlKSB7CiAgICAgICRkcy0+Q29tcGFyZUVudGl0aWVzKCRlbnRpdHkxLCAkZW50aXR5MiwgJHNvcnRmaWVsZCk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gJHRoaXMtPkVycm9yKCJmdW5jdGlvbiBDb21wYXJlRW50aXRpZXM6IENhbm5vdCBhY2Nlc3MgTmVvRGF0YVN0b3JhZ2UgbW9kdWxlIik7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBDb21wYXJlRW50aXRpZXNDb21wbGV4KCRlbnRpdHkxLCAkZW50aXR5MiwgJHNvcnRmaWVsZHMpIHsKICAgICRkcz0kdGhpcy0+X2dldGRzKCk7CiAgICBpZiAoJGRzIT09ZmFsc2UpIHsKICAgICAgJGRzLT5Db21wYXJlRW50aXRpZXNDb21wbGV4KCRlbnRpdHkxLCAkZW50aXR5MiwgJHNvcnRmaWVsZCk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gJHRoaXMtPkVycm9yKCJmdW5jdGlvbiBDb21wYXJlRW50aXRpZXNDb21wbGV4OiBDYW5ub3QgYWNjZXNzIE5lb0RhdGFTdG9yYWdlIG1vZHVsZSIpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gU29ydEVudGl0aWVzKCRsaXN0LCAkc29ydGZpZWxkcykgewogICAgJGRzPSR0aGlzLT5fZ2V0ZHMoKTsKICAgIGlmICgkZHMhPT1mYWxzZSkgewogICAgICAkZHMtPlNvcnRFbnRpdGllcygkbGlzdCwgJHNvcnRmaWVsZHMpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuICR0aGlzLT5FcnJvcigiZnVuY3Rpb24gU29ydEVudGl0aWVzOiBDYW5ub3QgYWNjZXNzIE5lb0RhdGFTdG9yYWdlIG1vZHVsZSIpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gRW50aXRpZXNDb3VudCgkdGFibGU9IiIsICRjcml0ZXJpYT1hcnJheSgpKSB7CiAgICAkZHM9JHRoaXMtPl9nZXRkcygpOwogICAgaWYgKCRkcyE9PWZhbHNlKSB7CiAgICAgIHJldHVybiAkZHMtPkVudGl0aWVzQ291bnQoJHRoaXMtPkdldE5hbWUoKSwgJHRhYmxlLCAkY3JpdGVyaWEpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuICR0aGlzLT5FcnJvcigiZnVuY3Rpb24gRW50aXRpZXNDb3VudDogQ2Fubm90IGFjY2VzcyBOZW9EYXRhU3RvcmFnZSBtb2R1bGUiKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIENsZWFyTW9kdWxlRW50aXRpZXMoKSB7ICAgIAogICAgJGRzPSR0aGlzLT5fZ2V0ZHMoKTsKICAgIGlmICgkZHMhPT1mYWxzZSkgeyAgICAgIAogICAgICByZXR1cm4gJGRzLT5DbGVhck1vZHVsZUVudGl0aWVzKCR0aGlzLT5HZXROYW1lKCkpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuICR0aGlzLT5FcnJvcigiZnVuY3Rpb24gQ2xlYXJNb2R1bGVFbnRpdGllczogQ2Fubm90IGFjY2VzcyBOZW9EYXRhU3RvcmFnZSBtb2R1bGUiKTsKICAgIH0KICB9CgogIC8qCiAgICoKICAgKiBDb25uZWN0aW9uIGZ1bmN0aW9ucwogICAqCiAgICovCgogIGZ1bmN0aW9uIFNldEVudGl0eUNvbm5lY3Rpb24oJGlkMSwgJGlkMiwgJHR5cGU9IiIpIHsKICAgICRkcz0kdGhpcy0+X2dldGRzKCk7CiAgICBpZiAoJGRzIT09ZmFsc2UpIHsKICAgICAgcmV0dXJuICRkcy0+U2V0RW50aXR5Q29ubmVjdGlvbigkaWQxLCAkaWQyLCAkdHlwZSk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gJHRoaXMtPkVycm9yKCJmdW5jdGlvbiBTZXRFbnRpdHlDb25uZWN0aW9uOiBDYW5ub3QgYWNjZXNzIE5lb0RhdGFTdG9yYWdlIG1vZHVsZSIpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gQ2xlYXJFbnRpdHlDb25uZWN0aW9ucygkaWQxLCAkaWQyPS0xLCAkdHlwZT0iIikgewogICAgJGRzPSR0aGlzLT5fZ2V0ZHMoKTsKICAgIGlmICgkZHMhPT1mYWxzZSkgewogICAgICByZXR1cm4gJGRzLT5DbGVhckVudGl0eUNvbm5lY3Rpb25zKCRpZDEsICRpZDIsICR0eXBlKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiAkdGhpcy0+RXJyb3IoImZ1bmN0aW9uIENsZWFyRW50aXR5Q29ubmVjdGlvbnM6IENhbm5vdCBhY2Nlc3MgTmVvRGF0YVN0b3JhZ2UgbW9kdWxlIik7CiAgICB9ICAgIAogIH0KCgoKICBmdW5jdGlvbiBDbGVhckVudGl0eUNvbm5lY3Rpb24oJGlkMSwgJGlkMiwgJHR5cGU9IiIpIHsKICAgICRkcz0kdGhpcy0+X2dldGRzKCk7CiAgICBpZiAoJGRzIT09ZmFsc2UpIHsKICAgICAgcmV0dXJuICRkcy0+Q2xlYXJFbnRpdHlDb25uZWN0aW9uKCRpZDEsICRpZDIsICR0eXBlKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiAkdGhpcy0+RXJyb3IoImZ1bmN0aW9uIENsZWFyRW50aXR5Q29ubmVjdGlvbjogQ2Fubm90IGFjY2VzcyBOZW9EYXRhU3RvcmFnZSBtb2R1bGUiKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIENoZWNrRW50aXR5Q29ubmVjdGlvbigkaWQxLCRpZDIsJHR5cGU9IiIpIHsKICAgICRkcz0kdGhpcy0+X2dldGRzKCk7CiAgICBpZiAoJGRzIT09ZmFsc2UpIHsKICAgICAgcmV0dXJuICRkcy0+Q2hlY2tFbnRpdHlDb25uZWN0aW9uKCRpZDEsICRpZDIsICR0eXBlKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiAkdGhpcy0+RXJyb3IoImZ1bmN0aW9uIENoZWNrRW50aXR5Q29ubmVjdGlvbjogQ2Fubm90IGFjY2VzcyBOZW9EYXRhU3RvcmFnZSBtb2R1bGUiKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIEdldEVudGl0eUNvbm5lY3Rpb25zKCRpZDEsICRpZDI9LTEsICR0eXBlPSIiKSB7CiAgICAkZHM9JHRoaXMtPl9nZXRkcygpOwogICAgaWYgKCRkcyE9PWZhbHNlKSB7CiAgICAgIHJldHVybiAkZHMtPkdldEVudGl0eUNvbm5lY3Rpb25zKCRpZDEsICRpZDIsICR0eXBlKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiAkdGhpcy0+RXJyb3IoImZ1bmN0aW9uIEdldEVudGl0eUNvbm5lY3Rpb25zOiBDYW5ub3QgYWNjZXNzIE5lb0RhdGFTdG9yYWdlIG1vZHVsZSIpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gQWRkRmllbGRTZXQoJG5hbWUsJGZpZWxkcykgewogICAgJGRzPSR0aGlzLT5fZ2V0ZHMoKTsKICAgIGlmICgkZHMhPT1mYWxzZSkgewogICAgICByZXR1cm4gJGRzLT5BZGRGaWVsZFNldCgkdGhpcy0+R2V0TmFtZSgpLCRuYW1lLCRmaWVsZHMpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuICR0aGlzLT5FcnJvcigiZnVuY3Rpb24gQWRkRmllbGRTZXQ6IENhbm5vdCBhY2Nlc3MgTmVvRGF0YVN0b3JhZ2UgbW9kdWxlIik7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBHZXRGaWVsZFNldCgkbmFtZSkgewogICAgJGRzPSR0aGlzLT5fZ2V0ZHMoKTsKICAgIGlmICgkZHMhPT1mYWxzZSkgewogICAgICByZXR1cm4gJGRzLT5HZXRGaWVsZFNldCgkdGhpcy0+R2V0TmFtZSgpLCRuYW1lKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiAkdGhpcy0+RXJyb3IoImZ1bmN0aW9uIEdldEZpZWxkU2V0OiBDYW5ub3QgYWNjZXNzIE5lb0RhdGFTdG9yYWdlIG1vZHVsZSIpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gRW50aXR5U2V0VW5zZXRQcm9wcygkZW50aXR5LCRmaWVsZHNldCwkZmlsbHZhbHVlPSIiKSB7CiAgICAkZHM9JHRoaXMtPl9nZXRkcygpOwogICAgaWYgKCRkcyE9PWZhbHNlKSB7CiAgICAgIHJldHVybiAkZHMtPkVudGl0eVNldFVuc2V0UHJvcHMoJHRoaXMtPkdldEZpZWxkU2V0KCR0aGlzLT5HZXROYW1lKCkpLCRlbnRpdHksJGZpZWxkc2V0LCRmaWxsdmFsdWU9IiIpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuICR0aGlzLT5FcnJvcigiZnVuY3Rpb24gR2V0RmllbGRTZXQ6IENhbm5vdCBhY2Nlc3MgTmVvRGF0YVN0b3JhZ2UgbW9kdWxlIik7CiAgICB9CiAgfQoKCiAgZnVuY3Rpb24gR2V0RFNFcnJvcnMoJG5sMmJyPXRydWUsJGNsZWFyPXRydWUpIHsKICAgICRkcz0kdGhpcy0+X2dldGRzKCk7CiAgICBpZiAoJGRzIT09ZmFsc2UpIHsKICAgICAgcmV0dXJuICRkcy0+R2V0RXJyb3JzKCRubDJiciwkY2xlYXIpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuICR0aGlzLT5FcnJvcigiZnVuY3Rpb24gR2V0RmllbGRTZXQ6IENhbm5vdCBhY2Nlc3MgTmVvRGF0YVN0b3JhZ2UgbW9kdWxlIik7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBTaG93RFNFcnJvcnMoJGNsZWFyPXRydWUpIHsKICAgICRkcz0kdGhpcy0+X2dldGRzKCk7CiAgICBpZiAoJGRzIT09ZmFsc2UpIHsKICAgICAgcmV0dXJuICRkcy0+R2V0RXJyb3JzKCRjbGVhcik7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gJHRoaXMtPkVycm9yKCJmdW5jdGlvbiBTaG93RFNFcnJvcnM6IENhbm5vdCBhY2Nlc3MgTmVvRGF0YVN0b3JhZ2UgbW9kdWxlIik7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBEU0luRXJyb3IoKSB7CiAgICAkZHM9JHRoaXMtPl9nZXRkcygpOwogICAgaWYgKCRkcyE9PWZhbHNlKSB7CiAgICAgIHJldHVybiAkZHMtPkluRXJyb3IoKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiAkdGhpcy0+RXJyb3IoImZ1bmN0aW9uIERTSW5FcnJvcjogQ2Fubm90IGFjY2VzcyBOZW9EYXRhU3RvcmFnZSBtb2R1bGUiKTsKICAgIH0KICB9CgogIC8qCiAgICoKICAgKiBVdGlsaXR5IGZ1bmN0aW9ucwogICAqCiAgICovCgogIGZ1bmN0aW9uIE5lb1NsYXNoZXMoJHVybCkgewoJCSRyZXN1bHQ9c3RyX3JlcGxhY2UoIlxcIiwiLyIsJHVybCk7CiAgICAvL1llcywgcGhwIHVuZGVyIHdpbmRvd3MgcnVucyBwZXJmZWN0bHkgd2l0aCB0aG9zZSBzbGFzaGVzLCBhcyBsb25nIGFzIHlvdQogICAgLy9kb24ndCBtaXggdGhlbSB3aXRoIGJhY2tzbGFzaGVzISEKCQkvLyRyZXN1bHQ9c3RyX3JlcGxhY2UoIi8iLERJUkVDVE9SWV9TRVBBUkFUT1IsJHVybCk7CgkJLy9yZXR1cm4gc3RyX3JlcGxhY2UoIlxcIixESVJFQ1RPUllfU0VQQVJBVE9SLCRyZXN1bHQpOwoJCXJldHVybiAkcmVzdWx0OwoJfQoKICBmdW5jdGlvbiBTbGFzaGVzKCR1cmwpIHsKICAgIHJldHVybiAkdGhpcy0+TmVvU2xhc2hlcygkdXJsKTsKICB9CgoJZnVuY3Rpb24gU2xhc2goJHN0ciwkc3RyMj0iIiwkc3RyMz0iIikgewoJCWlmICgkc3RyPT0iIikgcmV0dXJuICRzdHIyOwoJCWlmICgkc3RyMj09IiIpIHJldHVybiAkc3RyOwogICAgJHJlc3VsdD0iIjsKCQlpZiAoJHN0cltzdHJsZW4oJHN0ciktMV0hPSIvIikgewoJCQlpZiAoJHN0cjJbMF0hPSIvIikgewoJCQkJJHJlc3VsdD0kc3RyLiIvIi4kc3RyMjsKCQkJfSBlbHNlIHsKCQkJCSRyZXN1bHQ9JHN0ci4kc3RyMjsKCQkJfQoJCX0gZWxzZSB7CgkJCWlmICgkc3RyMlswXSE9Ii8iKSB7CgkJCQkkcmVzdWx0PSRzdHIuJHN0cjI7CgkJCX0gZWxzZSB7CgkJCQkkcmVzdWx0PSRzdHIuc3Vic3RyKCRzdHIyLDEpOyAvL3RyaW0gYXdheSBvbmUgb2YgdGhlIHNsYXNoZXMKCQkJfQoJCX0KICAgIGlmICgkc3RyMz09IiIpIHJldHVybiAkcmVzdWx0OwogICAgaWYgKCRyZXN1bHRbc3RybGVuKCRyZXN1bHQpLTFdIT0iLyIpIHsKCQkJaWYgKCRzdHIzWzBdIT0iLyIpIHsKCQkJCSRyZXN1bHQ9JHJlc3VsdC4iLyIuJHN0cjM7CgkJCX0gZWxzZSB7CgkJCQkkcmVzdWx0PSRyZXN1bHQuJHN0cjM7CgkJCX0KCQl9IGVsc2UgewoJCQlpZiAoJHN0cjNbMF0hPSIvIikgewoJCQkJJHJlc3VsdD0kcmVzdWx0LiRzdHIzOwoJCQl9IGVsc2UgewoJCQkJJHJlc3VsdD0kcmVzdWx0LnN1YnN0cigkc3RyMywxKTsgLy90cmltIGF3YXkgb25lIG9mIHRoZSBzbGFzaGVzCgkJCX0KCQl9CiAgICByZXR1cm4gJHJlc3VsdDsJCQoJfSAgCgogIGZ1bmN0aW9uIE5lb0Rpckxpc3QoJHJvb3QsJHJldHVybj0iZmlsZXMiLCRpbnRyb2R1Y3Rpb249YXJyYXkoKSwkZXhjbHVkZXM9YXJyYXkoKSwkbWF4cmVjdXJzaW9uPS0xKSB7CiAgICAkZGlybGlzdD1hcnJheSgpOwogICAgJGNvbmZpZz0kdGhpcy0+R2V0Q29uZmlnKCk7CiAgICAkbW9kZT0iIjsKICAgIHN3aXRjaCgkcmV0dXJuKSB7CiAgICAgIGNhc2UgImZpbGVzIjogJG1vZGU9IkZJTEVTIjticmVhazsKICAgICAgY2FzZSAiZGlycyI6ICRtb2RlPSJESVJTIjticmVhazsKICAgICAgY2FzZSAiYm90aCI6ICRtb2RlPSJGVUxMIjticmVhazsKICAgIH0KICAgICRmdWxscm9vdD0kdGhpcy0+U2xhc2goJGNvbmZpZ1sicm9vdF9wYXRoIl0sJHJvb3QpOwogICAgJGZpbGVyZWM9IGdldF9yZWN1cnNpdmVfZmlsZV9saXN0ICgkZnVsbHJvb3QsICRleGNsdWRlcyAsJG1heHJlY3Vyc2lvbiAsJG1vZGUpOyAvL05vIG1heGRlcHRoIGluIHJlY3Vyc2lvbgogICAgaWYgKCFlbXB0eSgkaW50cm9kdWN0aW9uKSkgewogICAgICAkZGlybGlzdD0kaW50cm9kdWN0aW9uOwogICAgfSAgICAKICAgIGZvcmVhY2goJGZpbGVyZWMgYXMgJGtleT0+JHZhbHVlKSB7CiAgICAgICR2YWx1ZTE9JHRoaXMtPlNsYXNoZXMoc3RyX3JlcGxhY2UoJGNvbmZpZ1sncm9vdF9wYXRoJ10sJycsJHZhbHVlKSk7CiAgICAgIC8vcHJldmVudCBjdXJyZW50IGRpciBmcm9tIHNob3dpbmcgdXAKICAgICAgLy9pZiAoJHZhbHVlMT09KCRwcm9maWxlWyJwYXRoIl0uIi8iKSkgY29udGludWU7CiAgICAgIC8vQ2hlY2sgZm9yIGhpZGRlbiBmaWxlcwogICAgICAkZGlycz1leHBsb2RlKCIvIiwkdmFsdWUxKTsKICAgICAgJGhpZGRlbj1mYWxzZTsKICAgICAgZm9yZWFjaCgkZGlycyBhcyAkZGlyKSB7CiAgICAgICAgaWYgKHN1YnN0cigkZGlyLDAsMSk9PSIuIikgeyRoaWRkZW49dHJ1ZTsgYnJlYWs7fQogICAgICB9CiAgICAgIGlmICgkaGlkZGVuKSBjb250aW51ZTsKCiAgICAgIC8vbm90IGhpZGRlbiwgYWRkIHRvIGxpc3QKICAgICAgJGRpcmxpc3RbJHZhbHVlMV09JHZhbHVlMTsKICAgIH0KICAgIHJldHVybiAkZGlybGlzdDsKICB9CgogIC8qQ2hlY2tzIGZvciB0aGUgZXhpc3RlbmNlIG9mIGFuIGluZGV4IGluIGFuIGFycmF5IGFuZCByZXR1cm4gdGhlIHZhbHVlIGlmIGl0J3MgdGhlcmUKICAgKmFuZCB0aGUgZGVmYXVsdCB2YWx1ZSBpZiBpdCdzIG5vdAogICovCiAgZnVuY3Rpb24gTmVvUGFyYW1WYWx1ZSgkbmFtZSwkcGFyYW1zLCRkZWZhdWx0PSIiKSB7CiAgICBpZiAoIWlzX2FycmF5KCRuYW1lKSkgewogICAgICBpZiAoaXNzZXQoJHBhcmFtc1skbmFtZV0pKSByZXR1cm4gJHBhcmFtc1skbmFtZV07ICAgICAgCiAgICAgIHJldHVybiAkZGVmYXVsdDsKICAgIH0gZWxzZSB7CiAgICAgIGZvcmVhY2ggKCRuYW1lIGFzICRzaW5nbGVuYW1lKSB7CiAgICAgICAgaWYgKGlzc2V0KCRwYXJhbXNbJHNpbmdsZW5hbWVdKSkgcmV0dXJuICRwYXJhbXNbJHNpbmdsZW5hbWVdOwogICAgICB9CiAgICAgIHJldHVybiAkZGVmYXVsdDsKICAgIH0KICB9CgogIC8vU2hvcnRjdXQgZm9yIHRoZSBhYm92ZQogIGZ1bmN0aW9uIE5QVigkbmFtZSwgJHBhcmFtcywgJGRlZmF1bHQ9IiIpIHsKICAgIHJldHVybiAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgkbmFtZSwgJHBhcmFtcywgJGRlZmF1bHQpOwogIH0KCiAgRnVuY3Rpb24gTmVvQXBwbHlQYXJhbVZhbHVlcygkdGhpc2FycmF5LCAkcGFyYW1zLCAkaW5kZXhlcywgJGFsd2F5c2ZpbGw9ZmFsc2UpIHsKICAgIGlmIChlbXB0eSgkcGFyYW1zKSB8fCBlbXB0eSgkaW5kZXhlcykpIHJldHVybiAkdGhpc2FycmF5OwogICAgaWYgKGlzX2Fzc29jKCRpbmRleGVzKSkgewogICAgICBmb3JlYWNoKCRpbmRleGVzIGFzICRpbmRleD0+JGRlZmF1bHR2YWx1ZSkgewogICAgICAgIGlmIChpc3NldCgkcGFyYW1zWyRpbmRleF0pKSB7CiAgICAgICAgICAkdGhpc2FycmF5WyRpbmRleF09JHBhcmFtc1skaW5kZXhdOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAkdGhpc2FycmF5WyRpbmRleF09JGRlZmF1bHR2YWx1ZTsKICAgICAgICB9CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGZvcmVhY2goJGluZGV4ZXMgYXMgJGluZGV4KSB7ICAgICAgICAKICAgICAgICBpZiAoaXNzZXQoJHBhcmFtc1skaW5kZXhdKSkgewogICAgICAgICAgJHRoaXNhcnJheVskaW5kZXhdPSRwYXJhbXNbJGluZGV4XTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgaWYgKCRhbHdheXNmaWxsKSB7CiAgICAgICAgICAgIGlmICghaXNzZXQoJHRoaXNhcnJheVskaW5kZXhdKSkgJHRoaXNhcnJheVskaW5kZXhdPSIiOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQogICAgLy9wcmludF9yKCR0aGlzYXJyYXkpOwogICAgcmV0dXJuICR0aGlzYXJyYXk7CiAgfQoKICBmdW5jdGlvbiBNYWtlU2ltcGxlQXJyYXkoJHRhYmxlLCRmaWVsZCkgewogICAgJGRzPSR0aGlzLT5fZ2V0ZHMoKTsKICAgIGlmICgkZHMhPT1mYWxzZSkgewogICAgICByZXR1cm4gJGRzLT5NYWtlU2ltcGxlQXJyYXkoJHRoaXMtPkdldE5hbWUoKSwgJHRhYmxlLCAkZmllbGQpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuICR0aGlzLT5FcnJvcigiZnVuY3Rpb24gTWFrZVNpbXBsZUFycmF5OiBDYW5ub3QgYWNjZXNzIE5lb0RhdGFTdG9yYWdlIG1vZHVsZSIpOzsKICAgIH0KICB9CgogIGZ1bmN0aW9uIE1ha2VBc3NvY0FycmF5KCR0YWJsZSwkZmllbGRzKSB7CiAgICAkZHM9JHRoaXMtPl9nZXRkcygpOwogICAgaWYgKCRkcyE9PWZhbHNlKSB7CiAgICAgIHJldHVybiAkZHMtPk1ha2VBc3NvY0FycmF5KCR0aGlzLT5HZXROYW1lKCksICR0YWJsZSwgJGZpZWxkcyk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gJHRoaXMtPkVycm9yKCJmdW5jdGlvbiBNYWtlQXNzb2NBcnJheTogQ2Fubm90IGFjY2VzcyBOZW9EYXRhU3RvcmFnZSBtb2R1bGUiKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIENoZWNrRmlsZUV4dGVuc2lvbigkZmlsZW5hbWUsICRhbGxvd2VkZXh0ZW5zaW9ucz1hcnJheSgpKSB7CgkJJGV4cGxvZGVkZmlsZT1leHBsb2RlKCIuIiwkZmlsZW5hbWUpOwoJCSRleHQ9c3RydG9sb3dlcihhcnJheV9wb3AoJGV4cGxvZGVkZmlsZSkpOwoJCWlmIChpbl9hcnJheSgkZXh0LCRhbGxvd2VkZXh0ZW5zaW9ucykpIHJldHVybiB0cnVlOwogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgZnVuY3Rpb24gTmVvVG9vbFRpcCgkcGFyYW1zPWFycmF5KCkpIHsKICAgICR0ZXh0PSR0aGlzLT5OUFYoInRleHQiLCRwYXJhbXMsIj8iKTsKICAgICR1cmw9JHRoaXMtPk5QVigidXJsIiwkcGFyYW1zLCIiKTsKICAgICR0aXRsZT0kdGhpcy0+TlBWKCJ0aXRsZSIsJHBhcmFtcywiIik7CiAgICAkY29udGVudD0kdGhpcy0+TlBWKCJjb250ZW50IiwkcGFyYW1zLCIiKTsKICAgICRzcGFuY2xhc3M9JHRoaXMtPk5QVigic3BhbmNsYXNzIiwkcGFyYW1zLCJuZW90b29sdGlwIik7CiAgICBpZiAoJHVybCE9IiIpIHsKICAgICAgJHJlc3VsdD0nPGEgY2xhc3M9IicuJHNwYW5jbGFzcy4nIiBocmVmPSInLiR1cmwuJyI+JzsKICAgIH0gZWxzZSB7CiAgICAgICRyZXN1bHQ9JzxhIGNsYXNzPSInLiRzcGFuY2xhc3MuJyIgc3R5bGU9ImN1cnNvcjogZGVmYXVsdDsiIGhyZWY9IiMiIG9uY2xpY2s9InJldHVybiBmYWxzZTsiPic7CiAgICB9CiAgICAkcmVzdWx0Lj0kdGV4dDsKICAgICRyZXN1bHQuPSc8c3Bhbj4nOwogICAgaWYgKCR0aXRsZSE9IiIpIHsKICAgICAgJHJlc3VsdC49IjxzdHJvbmc+Ii4kdGl0bGUuIjwvc3Ryb25nPjxici8+IjsKICAgIH0KICAgICRyZXN1bHQuPSRjb250ZW50OwogICAgJHJlc3VsdC49Ijwvc3Bhbj4iOwogICAgJHJlc3VsdC49IjwvYT4iOyAgICAgICAgIAogICAgcmV0dXJuICRyZXN1bHQ7CiAgfQoKICBmdW5jdGlvbiBOZW9QcmludFIoJGRhdGE9YXJyYXkoKSwkc2VuZG91dD10cnVlKSB7CiAgICAkb3V0cHV0PSc8YnIvPjxkaXYgc3R5bGU9ImJvcmRlcjoxcHggc29saWQgYmxhY2siPic7CiAgICAkb3V0cHV0Lj0iPHByZT4iOwogICAgJG91dHB1dC49cHJpbnRfcigkZGF0YSx0cnVlKTsKICAgICRvdXRwdXQuPSI8L3ByZT4iOwogICAgJG91dHB1dC49IjwvZGl2Pjxici8+IjsKICAgIGlmICgkc2VuZG91dCkgewogICAgICBlY2hvICRvdXRwdXQ7CiAgICB9CiAgICByZXR1cm4gJG91dHB1dDsKICB9CgogIC8qCiAgICoKICAgKiBTbWFydHkgc2hvcnRjdXRzCiAgICoKICAgKi8KICBmdW5jdGlvbiBTbWFydHlBc3NpZ24oJHNtYXJ0eWluZm8sICRzbWFydHljb250ZW50PSIiKSB7CiAgICBpZiAoIWlzX2FycmF5KCRzbWFydHlpbmZvKSkgewogICAgICBpZiAoJHNtYXJ0eWluZm8hPSIiICYmICRzbWFydHljb250ZW50IT0iIikgewogICAgICAgICR0aGlzLT5zbWFydHktPmFzc2lnbigkc21hcnR5aW5mbywgJHNtYXJ0eWNvbnRlbnQpOwogICAgICB9IGVsc2UgewogICAgICAgIGlmICgkc21hcnR5aW5mbz09IiIpIHsKICAgICAgICAgIHJldHVybiAkdGhpcy0+RXJyb3IoImZ1bmN0aW9uIFNtYXJ0eUFzc2lnbjogc21hcnR5LXZhcm5hbWUgbm90IHNldCIsZmFsc2UsYXJyYXkoInNtYXJ0eWluZm8iPT4kc21hcnR5aW5mbywic21hcnR5Y29udGVudCI9PiRzbWFydHljb250ZW50KSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgLy9PayBpdCdzIGFuIGFycmF5CiAgICBpZiAoaXNfYXNzb2MoJHNtYXJ0eWluZm8pKSB7CiAgICAgIC8vSXQncyBhbiBhc3NvY19hcnJheSwgc28gd2UgYXNzaWduIGV2ZXJ5IHNpbmdsZSBwYWlyIG9mIGluZm8KICAgICAgZm9yZWFjaCgkc21hcnR5aW5mbyBhcyAkc21hcnR5bmFtZT0+JHNtYXJ0eWNvbnRlbnQpIHsKICAgICAgICBpZiAoaXNfYXJyYXkoJHNtYXJ0eWNvbnRlbnQpKSB7CiAgICAgICAgICAvL2l0J3MgYSBuZXN0ZWQgYXJyYXkKICAgICAgICAgICR0aGlzLT5zbWFydHktPmFzc2lnbl9ieV9yZWYoJHNtYXJ0eW5hbWUsICRzbWFydHljb250ZW50KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCRzbWFydHluYW1lLCAkc21hcnR5Y29udGVudCk7CiAgICAgICAgfQogICAgICB9CiAgICB9IGVsc2UgewogICAgICAvL0l0J3Mgbm90IGFuIGFzc29jX2FycmF5LCBzbyB3ZSBzaW1wbHkgcmVmLWFzc2lnbiBpdC4KICAgICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduX2J5X3JlZigkc21hcnR5aW5mbywgJHNtYXJ0eWNvbnRlbnQpOwogICAgfQogICAgcmV0dXJuIHRydWU7CiAgfQoKICBmdW5jdGlvbiBOZW9TbWFydHlBc3NpZ24oJHNtYXJ0eWluZm8sICRzbWFydHljb250ZW50PSIiKSB7CiAgICAkdGhpcy0+U21hcnR5QXNzaWduKCRzbWFydHlpbmZvLCAkc21hcnR5Y29udGVudCk7CiAgfQoKICBmdW5jdGlvbiBTbWFydHlBc3NpZ25QcmVmKCRzbWFydHluYW1lLCAkcHJlZmVyZW5jZW5hbWU9IiIpIHsKICAgIGlmICgkcHJlZmVyZW5jZW5hbWUhPSIiKSB7CiAgICAgICR0aGlzLT5TbWFydHlBc3NpZ24oJHNtYXJ0eW5hbWUsICR0aGlzLT5QcmVmKCRwcmVmZXJlbmNlbmFtZSkpOwogICAgfSBlbHNlIHsKICAgICAgJHRoaXMtPlNtYXJ0eUFzc2lnbigkc21hcnR5bmFtZSwgJHRoaXMtPlByZWYoJHNtYXJ0eW5hbWUpKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIFNtYXJ0eUFzc2lnbkNNUygkbW9kdWxlLCRzbWFydHluYW1lPSJtb2R1bGUiKSB7CiAgICBpZiAoaXNfb2JqZWN0KCRtb2R1bGUpKSB7CiAgICAgICR0aGlzLT5zbWFydHktPmFzc2lnbl9ieV9yZWYoJHNtYXJ0eW5hbWUsICRtb2R1bGUpOwogICAgfSBlbHNlIHsKICAgICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduX2J5X3JlZigkc21hcnR5bmFtZSwgJHRoaXMtPkdldE1vZHVsZUluc3RhbmNlKCRtb2R1bGUpKTsKICAgIH0KICB9CgogIC8qCiAgICoKICAgKiBEZWJ1Z2dpbmcgZnVuY3Rpb25zCiAgICoKICAgKi8KCiAgZnVuY3Rpb24gRmlyZURlYnVnKCRjb21tYW5kLCRtZXNzYWdlPSIiLCR2YXJpYWJsZXM9YXJyYXkoKSkgewogICAgJGZpcmVwaHBtb2R1bGU9JHRoaXMtPkdldE1vZHVsZUluc3RhbmNlKCdGaXJlUEhQRGVidWcnKTsKICAgIGlmICgkZmlyZXBocG1vZHVsZSkgewogICAgICAvL01vZHVsZSBmb3VuZAogICAgICAkZmlyZXBocG1vZHVsZS0+U2V0TW9kdWxlTmFtZSgkdGhpcy0+R2V0TmFtZSgpKTsKICAgICAgJGZpcmVwaHBtb2R1bGUtPkNvbW1hbmQoJGNvbW1hbmQsICRtZXNzYWdlLCAkdmFyaWFibGVzKTsKICAgIH0gLy9lbHNlIE1vZHVsZSBub3QgZm91bmR9CiAgfQoKCiAgLyoKICAgKgogICAqIEVycm9yIGhhbmRsaW5nCiAgICoKICAgKi8KICBmdW5jdGlvbiBFcnJvcigkZXJyb3J0ZXh0LCRyZXR1cm52YWx1ZT1mYWxzZSwkcGFyYW1zPWFycmF5KCkpIHsKICAgICR0aGlzLT5fZXJyb3JzLj0kdGV4dDsKICAgIGlmICghZW1wdHkoJHBhcmFtcykgJiYgaXNfYXJyYXkoJHBhcmFtcykpIHsKICAgICAgJHRoaXMtPl9lcnJvcnMuPSIgKCI7CiAgICAgICRmaXJzdD10cnVlOyAvL0hhbmRsaW5nIHRoZSBjb21tYQogICAgICBmb3JlYWNoICgkcGFyYW1zIGFzICRwYXJhbT0+JHZhbHVlKSB7CiAgICAgICAgaWYgKCRmaXJzdCkgJGZpcnN0PWZhbHNlOyBlbHNlICR0aGlzLT5fZXJyb3JzLj0iLCI7CiAgICAgICAgJHRoaXMtPl9lcnJvcnMuPSRwYXJhbS4iPT4iLiR2YWx1ZTsKICAgICAgfQogICAgICAkdGhpcy0+X2Vycm9ycy49IikiOwogICAgfQogICAgJHRoaXMtPl9lcnJvcnMuPSJcbiI7CiAgICByZXR1cm4gJHJldHVybnZhbHVlOwogIH0KCiAgZnVuY3Rpb24gR2V0RXJyb3JzKCRubDJicj10cnVlLCRjbGVhcj10cnVlLCRpbmNsdWRlZHM9dHJ1ZSkgewogICAgJGVycm9ycz0kdGhpcy0+X2Vycm9yczsKICAgIGlmICgkbmwyYnIpIHsKICAgICAgJGVycm9ycz1ubDJicigkZXJyb3JzKTsKICAgIH0KICAgIGlmICgkaW5jbHVkZWRzKSB7CiAgICAgIGlmICgkdGhpcy0+RFNJbkVycm9yKCkpIHsKICAgICAgICAkZXJyb3JzLj0kdGhpcy0+R2V0RFNFcnJvcnMoJG5sMmJyLCRjbGVhcik7CiAgICAgIH0KICAgIH0KICAgIGlmICgkY2xlYXIpIHsKICAgICAgJHRoaXMtPl9lcnJvcnM9IiI7CiAgICB9CiAgICByZXR1cm4gJGVycm9yczsKICB9CgogIGZ1bmN0aW9uIE91dHB1dEVycm9ycygkY2xlYXI9dHJ1ZSwkaW5jbHVkZWRzPXRydWUpIHsKICAgIGlmICgkdGhpcy0+SW5FcnJvcigpKSB7CiAgICAgIGVjaG8gIlxuXG48ZGl2IHN0eWxlPSdib3JkZXI6M3B4IHNvbGlkIHJlZD5cbiI7CiAgICAgIGVjaG8gJHRoaXMtPkdldEVycm9ycyh0cnVlLCRjbGVhciwkaW5jbHVkZWRzKTsKICAgICAgZWNobyAiXG48L2Rpdj5cblxuIjsKICAgIH0KICB9CgogIGZ1bmN0aW9uIEluRXJyb3IoKSB7CiAgICByZXR1cm4gKCR0aGlzLT5fZXJyb3JzIT0iIik7CiAgfQoKfQo/Pgo=]]></data>
	</file>
	<file>
	  <filename>/templates/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/templates/changelog.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PHVsPgo8bGk+dmVyc2lvbiAwLjIuMTxici8+CmFkZGVkIGFycmF5X2RpZmZfa2V5IGltcGxlbWVudGF0aW9uIGZvciBwcmUtNS4xLjAgdmVyc2lvbgo8YnIvPgpBZGRlZCAkYWx3YXlzcmV0dXJuYXJyYXk9ZmFsc2UgdG8gR2V0RW50aXRpZXMoRnVsbCktbWV0aG9kcwo8YnIvPgpBZGRlZCBTbWFydEFzc2lnblByZWYtbWV0aG9kCjxici8+CkFkZGVkIFRvb2x0aXAtU3VwcG9ydAo8YnIvPgpBZGRlZCBOZW9SZWRpcmVjdC1mdW5jdGlvbgoKICA8bGk+dmVyc2lvbiAwLjIuMDxici8+Ci0gZ2VuZXJhbCBidWdmaXhpbmc8YnIvPgotIEFkZGVkIGEgTmVvRGlyTGlzdC1mdW5jdGlvbjxici8+Ci0gRml4ZWQgbmFtZSBlcnJvciBvbiBOZW9JbnB1dERyb3Bkb3duPGJyLz4KLSBhZGRlZCBzdXBwb3J0IGZvciAzcmQgcGFyYW1ldGVyIHRvIFNsYXNoLWZ1bmN0aW9uPGJyLz4KLSBhZGRlZCBOZW9DbXNMaW5rIGFuZCBOZW9DbXNVcmwgc2hvcnRjdXRzPGJyLz4KLSBhZGRlZCBTbWFydHlVcGxvYWRGb3JtU3RhcnQ8YnIvPgotIGFkZGVkIFNtYXJ0eUlucHV0TXVsdGlIaWRkZW48YnIvPgoKICA8L2xpPgogIDxsaT52ZXJzaW9uIDAuMS4wPGJyLz4KICAgLSBpbml0aWFsIHJlbGVhc2U8L2xpPgo8L3VsPg==]]></data>
	</file>
	<file>
	  <filename>/templates/help.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PHN0cm9uZz5Ob3RpY2UhIFRoaXMgaXMgYSBtb2R1bGUtZGV2ZWxvcGVyLW9ubHkgbW9kdWxlLiBJZiB5b3UgYXJlIG5vdCBhIGRldmVsb3Blcgp5b3UnbGwgcHJvYmFibHkganVzdCB3YW50IHRvIHNraXAgdGhlIGdvcnkgZGV0YWlscyBvZiB0aGlzIHBhZ2UgYW5kIHJlbHkgb24gdGhhdAp0aGUgbW9kdWxlIGp1c3QgZG9lcyBpdCdzIHdvcmsuPC9zdHJvbmc+CjxoMz5QdXJwb3NlIG9mIHRoZSBtb2R1bGU8L2gzPgpUaGUgcHVycG9zZSBvZiB0aGlzIG1vZHVsZSBpcyB0byBjdXQgb2ZmIG9uIGRldmVsb3BtZW50dGltZSBwcm92aWRpbmcgc29tZQplYXN5IHRvIHVzZSBmdW5jdGlvbnMgZXh0ZW5kaW5nIHRoZSBtb2R1bGUtQVBJIG9mIENNUyBNYWRlIFNpbXBsZS4gVGhpcyBpbmNsdWRlcywKYnV0IGlzIG5vIGxpbWl0ZWQgdG8sIHNob3J0Y3V0cyB0byBOZW9EYXRhU3RvcmFnZS1mdW5jaW9uYWxpdHksIGEgY291cGxlIG9mIG5pY2UKU21hcnR5LXNob3J0Y3V0cywgRmlyZVBIUC1pbnRlZ3JhdGlvbiBldGMuCjxoMz5Vc2FnZSBvZiB0aGUgbW9kdWxlPC9oMz4KVG8gdXNlIHRoaXMgZXh0ZW5kZWQgbW9kdWxlLWNsYXNzIHlvdSBzaG91bGQgaW5oZXJpdCBmcm9tIE5lb01vZHVsZS1jbGFzcyBpbnN0ZWFkCm9mIHRoZSB1c3VhbCBDTVNNb2R1bGUtY2xhc3MuIFRoaXMgY2FuIGJlIGRvbmUgbGlrZSB0aGlzOgo8cHJlPgpyZXF1aXJlX29uY2UoZGlybmFtZShkaXJuYW1lKF9fRklMRV9fKSkuIi9OZW9Nb2R1bGUvTmVvTW9kdWxlLm1vZHVsZS5waHAiKTsKY2xhc3MgTXlNb2R1bGUgZXh0ZW5kcyBOZW9Nb2R1bGUgewo8L3ByZT4KSWYgeW91IHdpc2ggdG8gdXNlIHRoZSBOZXdEYXRhU3RvcmFnZSBmdW5jdGlvbmFsaXR5LCB5b3Ugc2hvdWxkIG9mIGNvdXJzZSBhbHNvCmluc3RhbGwgdGhhdCBtb2R1bGUuCjxoMz5Ib3cgdG8gZ2V0IGhlbHA8L2gzPgpJIHdpbGwgcmVwZWF0LCB0aGlzIG1vZHVsZSBpcyBmb3IgZGV2ZWxvcGVycyBvbmx5LiBJZiB5b3UgY2Fubm90IHJlYWQgcGhwLXNvdXJjZSBjb2RlLAp5b3Ugc2hvdWxkIHVzZSBpdCBmb3IgZGV2ZWxvcG1lbnQgYW55d2F5LiBJZiB5b3UgY2FuLCBhbHdheXMgY2hlY2sgb3V0IHRoZSBjb2RlIApmb3IgaGludHMgb24gaG93IHRvIG1ha2UgaXQgd29yay4gSWYgeW91IHN0aWxsIGhhdmUgcXVlc3Rpb25zIG9yIHN1Z2dlc3Rpb25zIGZvcgpmaXhlcy9pbXByb3ZlbWVudHMsIHBsZWFzZSBmZWVsIGZyZWUgdG8gY2F0Y2ggbWUgKFNpbG1hcmlsbGlvbikgaW4gdGhlIGZvcnVtIG9nICNpcmMuCgo8aDM+TGlzdCBvZiBtZXRob2RzPC9oMz4KSSB3aWxsIHRyeSB0byBrZWVwIHRoaXMgbGlzdCB1cHRvZGF0ZSwgYnV0IGZvciBtb3N0IHJlY2VudCBsaXN0LCBwbGVhc2UKY2hlY2sgdGhlIE5lb01vZHVsZS5tb2R1bGUucGhwLWZpbGUgaXRzZWxmLiBTb21lIGRvY3VtZW50YXRpb24gb2YgdGhlIG1ldGhvZHMKbWF5IGV2ZW4gc25lYWsgaW4gdGhlcmUgc29tIGRheS4KPHByZT4KLyoKICoKICogU2V0dXAgZnVuY3Rpb25zCiAqCiAqLwoKZnVuY3Rpb24gU2V0SWQoJGlkKQpmdW5jdGlvbiBOZW9TZXRJZCgkaWQpCgoKICAvKgogICAqCiAgICogR2VuZXJhbCBzaG9ydGN1dCBmdW5jdGlvbnMKICAgKgogICAqLwpmdW5jdGlvbiBQcmVmKCRwcmVmbmFtZSwkZGVmYXVsdD0iIikKZnVuY3Rpb24gTmVvQ21zTGluaygkcGFyYW1zPWFycmF5KCkpCmZ1bmN0aW9uIE5lb0Ntc1VybCgkcGFyYW1zPWFycmF5KCkpCmZ1bmN0aW9uIE5lb1JlZGlyZWN0KCRwYXJhbXM9YXJyYXkoKSkKLyoKICoKICogRm9ybS1nZW5lcmF0aW9uIGZ1bmN0aW9ucwogKgogKi8KCmZ1bmN0aW9uIE5lb0Zvcm1TdGFydCgkcGFyYW1zPWFycmF5KCkpCmZ1bmN0aW9uIE5lb0Zvcm1FbmQoJHBhcmFtcz1hcnJheSgpKQpmdW5jdGlvbiBOZW9JbnB1dFRleHQoJHBhcmFtcz1hcnJheSgpCmZ1bmN0aW9uIE5lb1RleHRhcmVhKCRwYXJhbXM9YXJyYXkoKSkKZnVuY3Rpb24gTmVvSW5wdXRDaGVja2JveCgkcGFyYW1zPWFycmF5KCkpCmZ1bmN0aW9uIE5lb0lucHV0U3VibWl0KCRwYXJhbXM9YXJyYXkoKSkKZnVuY3Rpb24gTmVvSW5wdXRSZXNldCgkcGFyYW1zPWFycmF5KCkpCmZ1bmN0aW9uIE5lb0lucHV0SW5wdXREcm9wZG93bigkcGFyYW1zPWFycmF5KCkpCgovKiBmdW5jdGlvbiBiZWxvdyBpbmNsdWRlIHNtYXJ0eWFzc2lnbm1lbnQsIGRvZXMgbm90IHJldHVybiBhbnl0aGluZyAqLwpmdW5jdGlvbiBTbWFydHlGb3JtU3RhcnQoJHNtYXJ0eW5hbWUsJHBhcmFtcz1hcnJheSgpKQpmdW5jdGlvbiBTbWFydHlVcGxvYWRGb3JtU3RhcnQoJHNtYXJ0eW5hbWUsJHBhcmFtcz1hcnJheSgpKQpmdW5jdGlvbiBTbWFydHlGb3JtRW5kKCRzbWFydHluYW1lKQpmdW5jdGlvbiBTbWFydHlJbnB1dFN1Ym1pdCgkc21hcnR5bmFtZSwkbmFtZSwkdGV4dCwkY29uZmlybXRleHQ9IiIpCmZ1bmN0aW9uIFNtYXJ0eUlucHV0SGlkZGVuKCRzbWFydHluYW1lLCRuYW1lLCR2YWx1ZSkKZnVuY3Rpb24gU21hcnR5SW5wdXRNdWx0aUhpZGRlbigkc21hcnR5bmFtZSwkZmllbGRzPWFycmF5KCkpCgovKgogKgogKiBOZW9EYXRhU3RvcmFnZSBzaG9ydGN1dHMKICoKICovCmZ1bmN0aW9uIEFkZEVudGl0eSgkdGFibGUsICRwcm9wcz1hcnJheSgpKQpmdW5jdGlvbiBEZWxldGVFbnRpdHkoJGlkKQpmdW5jdGlvbiBHZXRFbnRpdHkoJGlkLCAkb3ZlcnJpZGVwcm9wcz1hcnJheSgpKQpmdW5jdGlvbiBHZXRFbnRpdGllcygkdGFibGU9IiIsICRjcml0ZXJpYT1hcnJheSgpLCAkYWx3YXlzcmV0dXJuYXJyYXk9ZmFsc2UpCmZ1bmN0aW9uIEdldE9uZUVudGl0eSgkdGFibGUsICRjcml0ZXJpYT1hcnJheSgpLCAkZmFpbGlmbXVsdGlwbGU9ZmFsc2UpCmZ1bmN0aW9uIEdldEVudGl0aWVzRnVsbCgkdGFibGU9IiIsICRjcml0ZXJpYT1hcnJheSgpLCAkYWx3YXlzcmV0dXJuYXJyYXk9ZmFsc2UpCmZ1bmN0aW9uIFNldEVudGl0eVByb3AoJGlkLCRwcm9wbmFtZSwkcHJvcHZhbHVlLCRwcm9wdHlwZT0idW5kZWZpbmVkIikKZnVuY3Rpb24gQ2xlYXJFbnRpdHlQcm9wKCRpZCwgJHByb3BuYW1lKQpmdW5jdGlvbiBTZXRFbnRpdHlQcm9wcygkaWQsICRwcm9wcywgJGNsZWFyPXRydWUpCmZ1bmN0aW9uIFNldEVudGl0eVByb3BzT25Dcml0ZXJpYSgkdGFibGUsICRwcm9wcywgJGNyaXRlcmlhLCAkY3JlYXRlPXRydWUsICRjbGVhcj1mYWxzZSkgLy9Eb2VzIG5vdCB3b3JrCmZ1bmN0aW9uIFJlc2V0RW50aXR5UHJvcHMoJGlkLCAkbmV3cHJvcHM9YXJyYXkoKSkKZnVuY3Rpb24gUmVtb3ZlTW9kdWxlRW50aXRpZXMoKQpmdW5jdGlvbiBDbGVhckVudGl0eVByb3BzKCRpZCkKZnVuY3Rpb24gQ29tcGFyZUVudGl0aWVzKCRlbnRpdHkxLCAkZW50aXR5MiwgJHNvcnRmaWVsZCkKZnVuY3Rpb24gQ29tcGFyZUVudGl0aWVzQ29tcGxleCgkZW50aXR5MSwgJGVudGl0eTIsICRzb3J0ZmllbGRzKQpmdW5jdGlvbiBTb3J0RW50aXRpZXMoJGxpc3QsICRzb3J0ZmllbGRzKQpmdW5jdGlvbiBFbnRpdGllc0NvdW50KCR0YWJsZT0iIiwgJGNyaXRlcmlhPWFycmF5KCkpCmZ1bmN0aW9uIENsZWFyTW9kdWxlRW50aXRpZXMoKQpmdW5jdGlvbiBTZXRFbnRpdHlDb25uZWN0aW9uKCRpZDEsICRpZDIsICR0eXBlPSIiKQpmdW5jdGlvbiBDbGVhckVudGl0eUNvbm5lY3Rpb25zKCRpZDEsICRpZDI9LTEsICR0eXBlPSIiKQpmdW5jdGlvbiBDbGVhckVudGl0eUNvbm5lY3Rpb24oJGlkMSwgJGlkMiwgJHR5cGU9IiIpCmZ1bmN0aW9uIENoZWNrRW50aXR5Q29ubmVjdGlvbigkaWQxLCRpZDIsJHR5cGU9IiIpCmZ1bmN0aW9uIEdldEVudGl0eUNvbm5lY3Rpb25zKCRpZDEsICRpZDI9LTEsICR0eXBlPSIiKQpmdW5jdGlvbiBBZGRGaWVsZFNldCgkbmFtZSwkZmllbGRzKQpmdW5jdGlvbiBHZXRGaWVsZFNldCgkbmFtZSkKZnVuY3Rpb24gRW50aXR5U2V0VW5zZXRQcm9wcygkZW50aXR5LCRmaWVsZHNldCwkZmlsbHZhbHVlPSIiKSB7CmZ1bmN0aW9uIEdldERTRXJyb3JzKCRubDJicj10cnVlLCRjbGVhcj10cnVlKQpmdW5jdGlvbiBPdXRwdXREU0Vycm9ycygkY2xlYXI9dHJ1ZSkKZnVuY3Rpb24gRFNJbkVycm9yKCkKZnVuY3Rpb24gTWFrZVNpbXBsZUFycmF5KCR0YWJsZSwkZmllbGQpCmZ1bmN0aW9uIE1ha2VBc3NvY0FycmF5KCR0YWJsZSwkZmllbGRzKQoKCi8qCiAqCiAqIExpbmsgYW5kIGljb24gZnVuY3Rpb25zCiAqCiAqLwoKZnVuY3Rpb24gTmVvRGVsZXRlSWNvbigkYWN0aW9uLCR0ZXh0LCRwYXJhbXM9YXJyYXkoKSwkY29uZmlybWF0aW9uPSIiKQpmdW5jdGlvbiBOZW9Db3B5SWNvbigkYWN0aW9uLCR0ZXh0LCRwYXJhbXM9YXJyYXkoKSwkY29uZmlybWF0aW9uPSIiKQpmdW5jdGlvbiBOZW9FZGl0SWNvbigkYWN0aW9uLCR0ZXh0LCRwYXJhbXM9YXJyYXkoKSwkY29uZmlybWF0aW9uPSIiKQpmdW5jdGlvbiBOZW9BZGRJY29uKCRhY3Rpb24sJHRleHQsJHBhcmFtcz1hcnJheSgpLCRjb25maXJtYXRpb249IiIpCmZ1bmN0aW9uIE5lb1N5c3RlbUljb24oJGljb24sJHRleHQ9IiIpCgovKgogKgogKiBVdGlsaXR5IGZ1bmN0aW9ucwogKgogKi8KZnVuY3Rpb24gTmVvU2xhc2hlcygkdXJsKQpmdW5jdGlvbiBTbGFzaCgkc3RyLCRzdHIyPSIiLCRzdHIzPSIiKQpmdW5jdGlvbiBTbGFzaGVzKCR1cmwpCmZ1bmN0aW9uIGlzX2Fzc29jKCRhcnJheSkKZnVuY3Rpb24gTmVvRGlyTGlzdCgkcm9vdCwkd2hhdD0iZmlsZXMiLCRpbnRyb2R1Y3Rpb249YXJyYXkoKSwkZXhjbHVkZXM9YXJyYXkoKSkKCi8qQ2hlY2tzIGZvciB0aGUgZXhpc3RlbmNlIG9mIGFuIGluZGV4IGluIGFuIGFycmF5IGFuZCByZXR1cm4gdGhlIHZhbHVlIGlmIGl0J3MgdGhlcmUKICphbmQgdGhlIGRlZmF1bHQgdmFsdWUgaWYgaXQncyBub3QKKi8KZnVuY3Rpb24gTmVvUGFyYW1WYWx1ZSgkbmFtZSwkcGFyYW1zLCRkZWZhdWx0PSIiKQoKLy9TaG9ydGN1dCBmb3IgdGhlIGFib3ZlCmZ1bmN0aW9uIE5QVigkbmFtZSwgJHBhcmFtcykKZnVuY3Rpb24gTmVvQXBwbHlQYXJhbVZhbHVlcygkdGhpc2FycmF5LCAkcGFyYW1zLCAkaW5kZXhlcywgJGFsd2F5c2ZpbGw9ZmFsc2UpCmZ1bmN0aW9uIENoZWNrRmlsZUV4dGVuc2lvbigkZmlsZW5hbWUsICRhbGxvd2VkZXh0ZW5zaW9ucz1hcnJheSgpKQoKLy9Gb3Igbm93LCByZWFkIHNvdXJjZSB0byB1bmRlcnN0YW5kCmZ1bmN0aW9uIE5lb1Rvb2xUaXAoJHBhcmFtcz1hcnJheSgpKSAvL3JlcXVpcmVzIDIgY3NzLWNsYXNzZXMgdG8gYmUgc2V0IHVwCgovL3NhbWUgYXMgcHJpbnRfciwgYnV0IHdyYXBzIGluIDxwcmU+J3MgYW5kIGluIGEgZGl2IHRyeWluZyB0byBtYWtlIGl0IG1vcmUgcmVhZGFibGUKZnVuY3Rpb24gTmVvUHJpbnRSKCRkYXRhPWFycmF5KCksJHNlbmRvdXQ9dHJ1ZSkKCi8qCiAqCiAqIFNtYXJ0eSBzaG9ydGN1dHMKICoKICovCmZ1bmN0aW9uIFNtYXJ0eUFzc2lnbigkc21hcnR5aW5mbywgJHNtYXJ0eWNvbnRlbnQ9IiIpCmZ1bmN0aW9uIFNtYXJ0eUFzc2lnblByZWYoJHNtYXJ0eW5hbWUsICRwcmVmZXJlbmNlbmFtZT0iIikgewpmdW5jdGlvbiBTbWFydHlBc3NpZ25DTVMoJG1vZHVsZSwkdmFybmFtZT0iY21zIikKZnVuY3Rpb24gU21hcnR5VXBsb2FkRm9ybVN0YXJ0KCRzbWFydHluYW1lLCRwYXJhbXM9YXJyYXkoKSkgewoKLyoKICoKICogRGVidWdnaW5nIGZ1bmN0aW9ucwogKgogKi8KZnVuY3Rpb24gRmlyZURlYnVnKCRjb21tYW5kLCRtZXNzYWdlPSIiLCR2YXJpYWJsZXM9YXJyYXkoKSkKCi8qCiAqCiAqIEVycm9yIGhhbmRsaW5nCiAqCiAqLwpmdW5jdGlvbiBFcnJvcigkZXJyb3J0ZXh0LCRyZXR1cm52YWx1ZT1mYWxzZSwkcGFyYW1zPWFycmF5KCkpCmZ1bmN0aW9uIEdldEVycm9ycygkbmwyYnI9dHJ1ZSwkY2xlYXI9dHJ1ZSwkaW5jbHVkZWRzPXRydWUpCmZ1bmN0aW9uIE91dHB1dEVycm9ycygkY2xlYXI9dHJ1ZSwkaW5jbHVkZWRzPXRydWUpCmZ1bmN0aW9uIEluRXJyb3IoKQo8L3ByZT4=]]></data>
	</file>
</module>
