PD9waHAKLyoqCiAqIFRoZXNlIGZ1bmN0aW9ucyBhcmUgbmVlZGVkIHRvIGxvYWQgV29yZFByZXNzLgogKgogKiBAcGFja2FnZSBXb3JkUHJlc3MKICovCgovKioKICogUmV0dXJucyB0aGUgSFRUUCBwcm90b2NvbCBzZW50IGJ5IHRoZSBzZXJ2ZXIuCiAqCiAqIEBzaW5jZSA0LjQuMAogKgogKiBAcmV0dXJuIHN0cmluZyBUaGUgSFRUUCBwcm90b2NvbC4gRGVmYXVsdDogSFRUUC8xLjAuCiAqLwpmdW5jdGlvbiB3cF9nZXRfc2VydmVyX3Byb3RvY29sKCkgewoJJHByb3RvY29sID0gJF9TRVJWRVJbJ1NFUlZFUl9QUk9UT0NPTCddID8/ICcnOwoKCWlmICggISBpbl9hcnJheSggJHByb3RvY29sLCBhcnJheSggJ0hUVFAvMS4xJywgJ0hUVFAvMicsICdIVFRQLzIuMCcsICdIVFRQLzMnICksIHRydWUgKSApIHsKCQkkcHJvdG9jb2wgPSAnSFRUUC8xLjAnOwoJfQoKCXJldHVybiAkcHJvdG9jb2w7Cn0KCi8qKgogKiBGaXhlcyBgJF9TRVJWRVJgIHZhcmlhYmxlcyBmb3IgdmFyaW91cyBzZXR1cHMuCiAqCiAqIEBzaW5jZSAzLjAuMAogKiBAYWNjZXNzIHByaXZhdGUKICoKICogQGdsb2JhbCBzdHJpbmcgJFBIUF9TRUxGIFRoZSBmaWxlbmFtZSBvZiB0aGUgY3VycmVudGx5IGV4ZWN1dGluZyBzY3JpcHQsCiAqICAgICAgICAgICAgICAgICAgICAgICAgICByZWxhdGl2ZSB0byB0aGUgZG9jdW1lbnQgcm9vdC4KICovCmZ1bmN0aW9uIHdwX2ZpeF9zZXJ2ZXJfdmFycygpIHsKCWdsb2JhbCAkUEhQX1NFTEY7CgoJJGRlZmF1bHRfc2VydmVyX3ZhbHVlcyA9IGFycmF5KAoJCSdTRVJWRVJfU09GVFdBUkUnID0+ICcnLAoJCSdSRVFVRVNUX1VSSScgICAgID0+ICcnLAoJKTsKCgkkX1NFUlZFUiA9IGFycmF5X21lcmdlKCAkZGVmYXVsdF9zZXJ2ZXJfdmFsdWVzLCAkX1NFUlZFUiApOwoKCS8vIEZpeCBmb3IgSUlTIHdoZW4gcnVubmluZyB3aXRoIFBIUCBJU0FQSS4KCWlmICggZW1wdHkoICRfU0VSVkVSWydSRVFVRVNUX1VSSSddICkKCQl8fCAoICdjZ2ktZmNnaScgIT09IFBIUF9TQVBJICYmIHByZWdfbWF0Y2goICcvXk1pY3Jvc29mdC1JSVNcLy8nLCAkX1NFUlZFUlsnU0VSVkVSX1NPRlRXQVJFJ10gKSApCgkpIHsKCgkJaWYgKCBpc3NldCggJF9TRVJWRVJbJ0hUVFBfWF9PUklHSU5BTF9VUkwnXSApICkgewoJCQkvLyBJSVMgTW9kLVJld3JpdGUuCgkJCSRfU0VSVkVSWydSRVFVRVNUX1VSSSddID0gJF9TRVJWRVJbJ0hUVFBfWF9PUklHSU5BTF9VUkwnXTsKCQl9IGVsc2VpZiAoIGlzc2V0KCAkX1NFUlZFUlsnSFRUUF9YX1JFV1JJVEVfVVJMJ10gKSApIHsKCQkJLy8gSUlTIElzYXBpX1Jld3JpdGUuCgkJCSRfU0VSVkVSWydSRVFVRVNUX1VSSSddID0gJF9TRVJWRVJbJ0hUVFBfWF9SRVdSSVRFX1VSTCddOwoJCX0gZWxzZSB7CgkJCS8vIFVzZSBPUklHX1BBVEhfSU5GTyBpZiB0aGVyZSBpcyBubyBQQVRIX0lORk8uCgkJCWlmICggISBpc3NldCggJF9TRVJWRVJbJ1BBVEhfSU5GTyddICkgJiYgaXNzZXQoICRfU0VSVkVSWydPUklHX1BBVEhfSU5GTyddICkgKSB7CgkJCQkkX1NFUlZFUlsnUEFUSF9JTkZPJ10gPSAkX1NFUlZFUlsnT1JJR19QQVRIX0lORk8nXTsKCQkJfQoKCQkJLy8gU29tZSBJSVMgKyBQSFAgY29uZmlndXJhdGlvbnMgcHV0IHRoZSBzY3JpcHQtbmFtZSBpbiB0aGUgcGF0aC1pbmZvIChubyBuZWVkIHRvIGFwcGVuZCBpdCB0d2ljZSkuCgkJCWlmICggaXNzZXQoICRfU0VSVkVSWydQQVRIX0lORk8nXSApICkgewoJCQkJaWYgKCAkX1NFUlZFUlsnUEFUSF9JTkZPJ10gPT09ICRfU0VSVkVSWydTQ1JJUFRfTkFNRSddICkgewoJCQkJCSRfU0VSVkVSWydSRVFVRVNUX1VSSSddID0gJF9TRVJWRVJbJ1BBVEhfSU5GTyddOwoJCQkJfSBlbHNlIHsKCQkJCQkkX1NFUlZFUlsnUkVRVUVTVF9VUkknXSA9ICRfU0VSVkVSWydTQ1JJUFRfTkFNRSddIC4gJF9TRVJWRVJbJ1BBVEhfSU5GTyddOwoJCQkJfQoJCQl9CgoJCQkvLyBBcHBlbmQgdGhlIHF1ZXJ5IHN0cmluZyBpZiBpdCBleGlzdHMgYW5kIGlzbid0IG51bGwuCgkJCWlmICggISBlbXB0eSggJF9TRVJWRVJbJ1FVRVJZX1NUUklORyddICkgKSB7CgkJCQkkX1NFUlZFUlsnUkVRVUVTVF9VUkknXSAuPSAnPycgLiAkX1NFUlZFUlsnUVVFUllfU1RSSU5HJ107CgkJCX0KCQl9Cgl9CgoJLy8gRml4IGZvciBQSFAgYXMgQ0dJIGhvc3RzIHRoYXQgc2V0IFNDUklQVF9GSUxFTkFNRSB0byBzb21ldGhpbmcgZW5kaW5nIGluIHBocC5jZ2kgZm9yIGFsbCByZXF1ZXN0cy4KCWlmICggaXNzZXQoICRfU0VSVkVSWydTQ1JJUFRfRklMRU5BTUUnXSApICYmIHN0cl9lbmRzX3dpdGgoICRfU0VSVkVSWydTQ1JJUFRfRklMRU5BTUUnXSwgJ3BocC5jZ2knICkgKSB7CgkJJF9TRVJWRVJbJ1NDUklQVF9GSUxFTkFNRSddID0gJF9TRVJWRVJbJ1BBVEhfVFJBTlNMQVRFRCddOwoJfQoKCS8vIEZpeCBmb3IgRHJlYW1ob3N0IGFuZCBvdGhlciBQSFAgYXMgQ0dJIGhvc3RzLgoJaWYgKCBpc3NldCggJF9TRVJWRVJbJ1NDUklQVF9OQU1FJ10gKSAmJiBzdHJfY29udGFpbnMoICRfU0VSVkVSWydTQ1JJUFRfTkFNRSddLCAncGhwLmNnaScgKSApIHsKCQl1bnNldCggJF9TRVJWRVJbJ1BBVEhfSU5GTyddICk7Cgl9CgoJLy8gRml4IGVtcHR5IFBIUF9TRUxGLgoJJFBIUF9TRUxGID0gJF9TRVJWRVJbJ1BIUF9TRUxGJ107CglpZiAoIGVtcHR5KCAkUEhQX1NFTEYgKSApIHsKCQkkX1NFUlZFUlsnUEhQX1NFTEYnXSA9IHByZWdfcmVwbGFjZSggJy8oXD8uKik/JC8nLCAnJywgJF9TRVJWRVJbJ1JFUVVFU1RfVVJJJ10gKTsKCQkkUEhQX1NFTEYgICAgICAgICAgICA9ICRfU0VSVkVSWydQSFBfU0VMRiddOwoJfQoKCXdwX3BvcHVsYXRlX2Jhc2ljX2F1dGhfZnJvbV9hdXRob3JpemF0aW9uX2hlYWRlcigpOwp9CgovKioKICogUG9wdWxhdGVzIHRoZSBCYXNpYyBBdXRoIHNlcnZlciBkZXRhaWxzIGZyb20gdGhlIEF1dGhvcml6YXRpb24gaGVhZGVyLgogKgogKiBTb21lIHNlcnZlcnMgcnVubmluZyBpbiBDR0kgb3IgRmFzdENHSSBtb2RlIGRvbid0IHBhc3MgdGhlIEF1dGhvcml6YXRpb24KICogaGVhZGVyIG9uIHRvIFdvcmRQcmVzcy4gIElmIGl0J3MgYmVlbiByZXdyaXR0ZW4gdG8gdGhlIGBIVFRQX0FVVEhPUklaQVRJT05gIGhlYWRlciwKICogZmlsbCBpbiB0aGUgcHJvcGVyICRfU0VSVkVSIHZhcmlhYmxlcyBpbnN0ZWFkLgogKgogKiBAc2luY2UgNS42LjAKICovCmZ1bmN0aW9uIHdwX3BvcHVsYXRlX2Jhc2ljX2F1dGhfZnJvbV9hdXRob3JpemF0aW9uX2hlYWRlcigpIHsKCS8vIElmIHdlIGRvbid0IGhhdmUgYW55dGhpbmcgdG8gcHVsbCBmcm9tLCByZXR1cm4gZWFybHkuCglpZiAoICEgaXNzZXQoICRfU0VSVkVSWydIVFRQX0FVVEhPUklaQVRJT04nXSApICYmICEgaXNzZXQoICRfU0VSVkVSWydSRURJUkVDVF9IVFRQX0FVVEhPUklaQVRJT04nXSApICkgewoJCXJldHVybjsKCX0KCgkvLyBJZiBlaXRoZXIgUEhQX0FVVEgga2V5IGlzIGFscmVhZHkgc2V0LCBkbyBub3RoaW5nLgoJaWYgKCBpc3NldCggJF9TRVJWRVJbJ1BIUF9BVVRIX1VTRVInXSApIHx8IGlzc2V0KCAkX1NFUlZFUlsnUEhQX0FVVEhfUFcnXSApICkgewoJCXJldHVybjsKCX0KCgkvLyBGcm9tIG91ciBwcmlvciBjb25kaXRpb25hbCwgb25lIG9mIHRoZXNlIG11c3QgYmUgc2V0LgoJJGhlYWRlciA9ICRfU0VSVkVSWydIVFRQX0FVVEhPUklaQVRJT04nXSA/PyAkX1NFUlZFUlsnUkVESVJFQ1RfSFRUUF9BVVRIT1JJWkFUSU9OJ107CgoJLy8gVGVzdCB0byBtYWtlIHN1cmUgdGhlIHBhdHRlcm4gbWF0Y2hlcyBleHBlY3RlZC4KCWlmICggISBwcmVnX21hdGNoKCAnJV5CYXNpYyBbYS16XGQvK10qPXswLDJ9JCVpJywgJGhlYWRlciApICkgewoJCXJldHVybjsKCX0KCgkvLyBSZW1vdmluZyBgQmFzaWMgYCB0aGUgdG9rZW4gd291bGQgc3RhcnQgc2l4IGNoYXJhY3RlcnMgaW4uCgkkdG9rZW4gICAgPSBzdWJzdHIoICRoZWFkZXIsIDYgKTsKCSR1c2VycGFzcyA9IGJhc2U2NF9kZWNvZGUoICR0b2tlbiApOwoKCS8vIFRoZXJlIG11c3QgYmUgYXQgbGVhc3Qgb25lIGNvbG9uIGluIHRoZSBzdHJpbmcuCglpZiAoICEgc3RyX2NvbnRhaW5zKCAkdXNlcnBhc3MsICc6JyApICkgewoJCXJldHVybjsKCX0KCglsaXN0KCAkdXNlciwgJHBhc3MgKSA9IGV4cGxvZGUoICc6JywgJHVzZXJwYXNzLCAyICk7CgoJLy8gTm93IHNob3ZlIHRoZW0gaW4gdGhlIHByb3BlciBrZXlzIHdoZXJlIHdlJ3JlIGV4cGVjdGluZyBsYXRlciBvbi4KCSRfU0VSVkVSWydQSFBfQVVUSF9VU0VSJ10gPSAkdXNlcjsKCSRfU0VSVkVSWydQSFBfQVVUSF9QVyddICAgPSAkcGFzczsKfQoKLyoqCiAqIENoZWNrcyB0aGUgc2VydmVyIHJlcXVpcmVtZW50cy4KICoKICogICAtIFBIUCB2ZXJzaW9uCiAqICAgLSBQSFAgZXh0ZW5zaW9ucwogKiAgIC0gTXlTUUwgb3IgTWFyaWFEQiB2ZXJzaW9uICh1bmxlc3MgYSBkYXRhYmFzZSBkcm9wLWluIGlzIHByZXNlbnQpCiAqCiAqIERpZXMgaWYgcmVxdWlyZW1lbnRzIGFyZSBub3QgbWV0LgogKgogKiBAc2luY2UgMy4wLjAKICogQGFjY2VzcyBwcml2YXRlCiAqCiAqIEBnbG9iYWwgc3RyaW5nICAgJHJlcXVpcmVkX3BocF92ZXJzaW9uICAgIFRoZSBtaW5pbXVtIHJlcXVpcmVkIFBIUCB2ZXJzaW9uIHN0cmluZy4KICogQGdsb2JhbCBzdHJpbmdbXSAkcmVxdWlyZWRfcGhwX2V4dGVuc2lvbnMgVGhlIG5hbWVzIG9mIHJlcXVpcmVkIFBIUCBleHRlbnNpb25zLgogKiBAZ2xvYmFsIHN0cmluZyAgICR3cF92ZXJzaW9uICAgICAgICAgICAgICBUaGUgV29yZFByZXNzIHZlcnNpb24gc3RyaW5nLgogKi8KZnVuY3Rpb24gd3BfY2hlY2tfcGhwX215c3FsX3ZlcnNpb25zKCkgewoJZ2xvYmFsICRyZXF1aXJlZF9waHBfdmVyc2lvbiwgJHJlcXVpcmVkX3BocF9leHRlbnNpb25zLCAkd3BfdmVyc2lvbjsKCgkkcGhwX3ZlcnNpb24gPSBQSFBfVkVSU0lPTjsKCglpZiAoIHZlcnNpb25fY29tcGFyZSggJHJlcXVpcmVkX3BocF92ZXJzaW9uLCAkcGhwX3ZlcnNpb24sICc+JyApICkgewoJCSRwcm90b2NvbCA9IHdwX2dldF9zZXJ2ZXJfcHJvdG9jb2woKTsKCQloZWFkZXIoIHNwcmludGYoICclcyA1MDAgSW50ZXJuYWwgU2VydmVyIEVycm9yJywgJHByb3RvY29sICksIHRydWUsIDUwMCApOwoJCWhlYWRlciggJ0NvbnRlbnQtVHlwZTogdGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04JyApOwoJCXByaW50ZigKCQkJJ1lvdXIgc2VydmVyIGlzIHJ1bm5pbmcgUEhQIHZlcnNpb24gJTEkcyBidXQgV29yZFByZXNzICUyJHMgcmVxdWlyZXMgYXQgbGVhc3QgJTMkcy4nLAoJCQkkcGhwX3ZlcnNpb24sCgkJCSR3cF92ZXJzaW9uLAoJCQkkcmVxdWlyZWRfcGhwX3ZlcnNpb24KCQkpOwoJCWV4aXQoIDEgKTsKCX0KCgkkbWlzc2luZ19leHRlbnNpb25zID0gYXJyYXkoKTsKCglpZiAoIGlzc2V0KCAkcmVxdWlyZWRfcGhwX2V4dGVuc2lvbnMgKSAmJiBpc19hcnJheSggJHJlcXVpcmVkX3BocF9leHRlbnNpb25zICkgKSB7CgkJZm9yZWFjaCAoICRyZXF1aXJlZF9waHBfZXh0ZW5zaW9ucyBhcyAkZXh0ZW5zaW9uICkgewoJCQlpZiAoIGV4dGVuc2lvbl9sb2FkZWQoICRleHRlbnNpb24gKSApIHsKCQkJCWNvbnRpbnVlOwoJCQl9CgoJCQkkbWlzc2luZ19leHRlbnNpb25zW10gPSBzcHJpbnRmKAoJCQkJJ1dvcmRQcmVzcyAlMSRzIHJlcXVpcmVzIHRoZSA8Y29kZT4lMiRzPC9jb2RlPiBQSFAgZXh0ZW5zaW9uLicsCgkJCQkkd3BfdmVyc2lvbiwKCQkJCSRleHRlbnNpb24KCQkJKTsKCQl9Cgl9CgoJaWYgKCBjb3VudCggJG1pc3NpbmdfZXh0ZW5zaW9ucyApID4gMCApIHsKCQkkcHJvdG9jb2wgPSB3cF9nZXRfc2VydmVyX3Byb3RvY29sKCk7CgkJaGVhZGVyKCBzcHJpbnRmKCAnJXMgNTAwIEludGVybmFsIFNlcnZlciBFcnJvcicsICRwcm90b2NvbCApLCB0cnVlLCA1MDAgKTsKCQloZWFkZXIoICdDb250ZW50LVR5cGU6IHRleHQvaHRtbDsgY2hhcnNldD11dGYtOCcgKTsKCQllY2hvIGltcGxvZGUoICc8YnI+JywgJG1pc3NpbmdfZXh0ZW5zaW9ucyApOwoJCWV4aXQoIDEgKTsKCX0KCgkvLyBUaGlzIHJ1bnMgYmVmb3JlIGRlZmF1bHQgY29uc3RhbnRzIGFyZSBkZWZpbmVkLCBzbyB3ZSBjYW4ndCBhc3N1bWUgV1BfQ09OVEVOVF9ESVIgaXMgc2V0IHlldC4KCSR3cF9jb250ZW50X2RpciA9IGRlZmluZWQoICdXUF9DT05URU5UX0RJUicgKSA/IFdQX0NPTlRFTlRfRElSIDogQUJTUEFUSCAuICd3cC1jb250ZW50JzsKCglpZiAoICEgZnVuY3Rpb25fZXhpc3RzKCAnbXlzcWxpX2Nvbm5lY3QnICkKCQkmJiAhIGZpbGVfZXhpc3RzKCAkd3BfY29udGVudF9kaXIgLiAnL2RiLnBocCcgKQoJKSB7CgkJcmVxdWlyZV9vbmNlIEFCU1BBVEggLiBXUElOQyAuICcvZnVuY3Rpb25zLnBocCc7CgkJd3BfbG9hZF90cmFuc2xhdGlvbnNfZWFybHkoKTsKCgkJJG1lc3NhZ2UgPSAnPHA+JyAuIF9fKCAnWW91ciBQSFAgaW5zdGFsbGF0aW9uIGFwcGVhcnMgdG8gYmUgbWlzc2luZyB0aGUgTXlTUUwgZXh0ZW5zaW9uIHdoaWNoIGlzIHJlcXVpcmVkIGJ5IFdvcmRQcmVzcy4nICkgLiAiPC9wPlxuIjsKCgkJJG1lc3NhZ2UgLj0gJzxwPicgLiBzcHJpbnRmKAoJCQkvKiB0cmFuc2xhdG9yczogJXM6IG15c3FsaS4gKi8KCQkJX18oICdQbGVhc2UgY2hlY2sgdGhhdCB0aGUgJXMgUEhQIGV4dGVuc2lvbiBpcyBpbnN0YWxsZWQgYW5kIGVuYWJsZWQuJyApLAoJCQknPGNvZGU+bXlzcWxpPC9jb2RlPicKCQkpIC4gIjwvcD5cbiI7CgoJCSRtZXNzYWdlIC49ICc8cD4nIC4gc3ByaW50ZigKCQkJLyogdHJhbnNsYXRvcnM6ICVzOiBTdXBwb3J0IGZvcnVtcyBVUkwuICovCgkJCV9fKCAnSWYgeW91IGFyZSB1bnN1cmUgd2hhdCB0aGVzZSB0ZXJtcyBtZWFuIHlvdSBzaG91bGQgcHJvYmFibHkgY29udGFjdCB5b3VyIGhvc3QuIElmIHlvdSBzdGlsbCBuZWVkIGhlbHAgeW91IGNhbiBhbHdheXMgdmlzaXQgdGhlIDxhIGhyZWY9IiVzIj5Xb3JkUHJlc3Mgc3VwcG9ydCBmb3J1bXM8L2E+LicgKSwKCQkJX18oICdodHRwczovL3dvcmRwcmVzcy5vcmcvc3VwcG9ydC9mb3J1bXMvJyApCgkJKSAuICI8L3A+XG4iOwoKCQkkYXJncyA9IGFycmF5KAoJCQknZXhpdCcgPT4gZmFsc2UsCgkJCSdjb2RlJyA9PiAnbXlzcWxfbm90X2ZvdW5kJywKCQkpOwoJCXdwX2RpZSgKCQkJJG1lc3NhZ2UsCgkJCV9fKCAnUmVxdWlyZW1lbnRzIE5vdCBNZXQnICksCgkJCSRhcmdzCgkJKTsKCQlleGl0KCAxICk7Cgl9Cn0KCi8qKgogKiBSZXRyaWV2ZXMgdGhlIGN1cnJlbnQgZW52aXJvbm1lbnQgdHlwZS4KICoKICogVGhlIHR5cGUgY2FuIGJlIHNldCB2aWEgdGhlIGBXUF9FTlZJUk9OTUVOVF9UWVBFYCBnbG9iYWwgc3lzdGVtIHZhcmlhYmxlLAogKiBvciBhIGNvbnN0YW50IG9mIHRoZSBzYW1lIG5hbWUuCiAqCiAqIFBvc3NpYmxlIHZhbHVlcyBhcmUgJ2xvY2FsJywgJ2RldmVsb3BtZW50JywgJ3N0YWdpbmcnLCBhbmQgJ3Byb2R1Y3Rpb24nLgogKiBJZiBub3Qgc2V0LCB0aGUgdHlwZSBkZWZhdWx0cyB0byAncHJvZHVjdGlvbicuCiAqCiAqIEBzaW5jZSA1LjUuMAogKiBAc2luY2UgNS41LjEgQWRkZWQgdGhlICdsb2NhbCcgdHlwZS4KICogQHNpbmNlIDUuNS4xIFJlbW92ZWQgdGhlIGFiaWxpdHkgdG8gYWx0ZXIgdGhlIGxpc3Qgb2YgdHlwZXMuCiAqCiAqIEByZXR1cm4gc3RyaW5nIFRoZSBjdXJyZW50IGVudmlyb25tZW50IHR5cGUuCiAqLwpmdW5jdGlvbiB3cF9nZXRfZW52aXJvbm1lbnRfdHlwZSgpIHsKCXN0YXRpYyAkY3VycmVudF9lbnYgPSAnJzsKCglpZiAoICEgZGVmaW5lZCggJ1dQX1JVTl9DT1JFX1RFU1RTJyApICYmICRjdXJyZW50X2VudiApIHsKCQlyZXR1cm4gJGN1cnJlbnRfZW52OwoJfQoKCSR3cF9lbnZpcm9ubWVudHMgPSBhcnJheSgKCQknbG9jYWwnLAoJCSdkZXZlbG9wbWVudCcsCgkJJ3N0YWdpbmcnLAoJCSdwcm9kdWN0aW9uJywKCSk7CgoJLy8gQWRkIGEgbm90ZSBhYm91dCB0aGUgZGVwcmVjYXRlZCBXUF9FTlZJUk9OTUVOVF9UWVBFUyBjb25zdGFudC4KCWlmICggZGVmaW5lZCggJ1dQX0VOVklST05NRU5UX1RZUEVTJyApICYmIGZ1bmN0aW9uX2V4aXN0cyggJ19kZXByZWNhdGVkX2FyZ3VtZW50JyApICkgewoJCWlmICggZnVuY3Rpb25fZXhpc3RzKCAnX18nICkgKSB7CgkJCS8qIHRyYW5zbGF0b3JzOiAlczogV1BfRU5WSVJPTk1FTlRfVFlQRVMgKi8KCQkJJG1lc3NhZ2UgPSBzcHJpbnRmKCBfXyggJ1RoZSAlcyBjb25zdGFudCBpcyBubyBsb25nZXIgc3VwcG9ydGVkLicgKSwgJ1dQX0VOVklST05NRU5UX1RZUEVTJyApOwoJCX0gZWxzZSB7CgkJCSRtZXNzYWdlID0gc3ByaW50ZiggJ1RoZSAlcyBjb25zdGFudCBpcyBubyBsb25nZXIgc3VwcG9ydGVkLicsICdXUF9FTlZJUk9OTUVOVF9UWVBFUycgKTsKCQl9CgoJCV9kZXByZWNhdGVkX2FyZ3VtZW50KAoJCQknZGVmaW5lKCknLAoJCQknNS41LjEnLAoJCQkkbWVzc2FnZQoJCSk7Cgl9CgoJLy8gQ2hlY2sgaWYgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIGhhcyBiZWVuIHNldCwgaWYgYGdldGVudmAgaXMgYXZhaWxhYmxlIG9uIHRoZSBzeXN0ZW0uCglpZiAoIGZ1bmN0aW9uX2V4aXN0cyggJ2dldGVudicgKSApIHsKCQkkaGFzX2VudiA9IGdldGVudiggJ1dQX0VOVklST05NRU5UX1RZUEUnICk7CgkJaWYgKCBmYWxzZSAhPT0gJGhhc19lbnYgKSB7CgkJCSRjdXJyZW50X2VudiA9ICRoYXNfZW52OwoJCX0KCX0KCgkvLyBGZXRjaCB0aGUgZW52aXJvbm1lbnQgZnJvbSBhIGNvbnN0YW50LCB0aGlzIG92ZXJyaWRlcyB0aGUgZ2xvYmFsIHN5c3RlbSB2YXJpYWJsZS4KCWlmICggZGVmaW5lZCggJ1dQX0VOVklST05NRU5UX1RZUEUnICkgJiYgV1BfRU5WSVJPTk1FTlRfVFlQRSApIHsKCQkkY3VycmVudF9lbnYgPSBXUF9FTlZJUk9OTUVOVF9UWVBFOwoJfQoKCS8vIE1ha2Ugc3VyZSB0aGUgZW52aXJvbm1lbnQgaXMgYW4gYWxsb3dlZCBvbmUsIGFuZCBub3QgYWNjaWRlbnRhbGx5IHNldCB0byBhbiBpbnZhbGlkIHZhbHVlLgoJaWYgKCAhIGluX2FycmF5KCAkY3VycmVudF9lbnYsICR3cF9lbnZpcm9ubWVudHMsIHRydWUgKSApIHsKCQkkY3VycmVudF9lbnYgPSAncHJvZHVjdGlvbic7Cgl9CgoJcmV0dXJuICRjdXJyZW50X2VudjsKfQoKLyoqCiAqIFJldHJpZXZlcyB0aGUgY3VycmVudCBkZXZlbG9wbWVudCBtb2RlLgogKgogKiBUaGUgZGV2ZWxvcG1lbnQgbW9kZSBhZmZlY3RzIGhvdyBjZXJ0YWluIHBhcnRzIG9mIHRoZSBXb3JkUHJlc3MgYXBwbGljYXRpb24gYmVoYXZlLAogKiB3aGljaCBpcyByZWxldmFudCB3aGVuIGRldmVsb3BpbmcgZm9yIFdvcmRQcmVzcy4KICoKICogRGV2ZWxvcG1lbnQgbW9kZSBjYW4gYmUgc2V0IHZpYSB0aGUgYFdQX0RFVkVMT1BNRU5UX01PREVgIGNvbnN0YW50IGluIGB3cC1jb25maWcucGhwYC4KICogUG9zc2libGUgdmFsdWVzIGFyZSAnY29yZScsICdwbHVnaW4nLCAndGhlbWUnLCAnYWxsJywgb3IgYW4gZW1wdHkgc3RyaW5nIHRvIGRpc2FibGUKICogZGV2ZWxvcG1lbnQgbW9kZS4gJ2FsbCcgaXMgYSBzcGVjaWFsIHZhbHVlIHRvIHNpZ25pZnkgdGhhdCBhbGwgdGhyZWUgZGV2ZWxvcG1lbnQgbW9kZXMKICogKCdjb3JlJywgJ3BsdWdpbicsIGFuZCAndGhlbWUnKSBhcmUgZW5hYmxlZC4KICoKICogRGV2ZWxvcG1lbnQgbW9kZSBpcyBjb25zaWRlcmVkIHNlcGFyYXRlbHkgZnJvbSBgV1BfREVCVUdgIGFuZCB3cF9nZXRfZW52aXJvbm1lbnRfdHlwZSgpLgogKiBJdCBkb2VzIG5vdCBhZmZlY3QgZGVidWdnaW5nIG91dHB1dCwgYnV0IHJhdGhlciBmdW5jdGlvbmFsIG51YW5jZXMgaW4gV29yZFByZXNzLgogKgogKiBUaGlzIGZ1bmN0aW9uIHJldHJpZXZlcyB0aGUgY3VycmVudGx5IHNldCBkZXZlbG9wbWVudCBtb2RlIHZhbHVlLiBUbyBjaGVjayB3aGV0aGVyCiAqIGEgc3BlY2lmaWMgZGV2ZWxvcG1lbnQgbW9kZSBpcyBlbmFibGVkLCB1c2Ugd3BfaXNfZGV2ZWxvcG1lbnRfbW9kZSgpLgogKgogKiBAc2luY2UgNi4zLjAKICoKICogQHJldHVybiBzdHJpbmcgVGhlIGN1cnJlbnQgZGV2ZWxvcG1lbnQgbW9kZS4KICovCmZ1bmN0aW9uIHdwX2dldF9kZXZlbG9wbWVudF9tb2RlKCkgewoJc3RhdGljICRjdXJyZW50X21vZGUgPSBudWxsOwoKCWlmICggISBkZWZpbmVkKCAnV1BfUlVOX0NPUkVfVEVTVFMnICkgJiYgbnVsbCAhPT0gJGN1cnJlbnRfbW9kZSApIHsKCQlyZXR1cm4gJGN1cnJlbnRfbW9kZTsKCX0KCgkkZGV2ZWxvcG1lbnRfbW9kZSA9IFdQX0RFVkVMT1BNRU5UX01PREU7CgoJLy8gRXhjbHVzaXZlbHkgZm9yIGNvcmUgdGVzdHMsIHJlbHkgb24gdGhlIGAkX3dwX3Rlc3RzX2RldmVsb3BtZW50X21vZGVgIGdsb2JhbC4KCWlmICggZGVmaW5lZCggJ1dQX1JVTl9DT1JFX1RFU1RTJyApICYmIGlzc2V0KCAkR0xPQkFMU1snX3dwX3Rlc3RzX2RldmVsb3BtZW50X21vZGUnXSApICkgewoJCSRkZXZlbG9wbWVudF9tb2RlID0gJEdMT0JBTFNbJ193cF90ZXN0c19kZXZlbG9wbWVudF9tb2RlJ107Cgl9CgoJJHZhbGlkX21vZGVzID0gYXJyYXkoCgkJJ2NvcmUnLAoJCSdwbHVnaW4nLAoJCSd0aGVtZScsCgkJJ2FsbCcsCgkJJycsCgkpOwoKCWlmICggISBpbl9hcnJheSggJGRldmVsb3BtZW50X21vZGUsICR2YWxpZF9tb2RlcywgdHJ1ZSApICkgewoJCSRkZXZlbG9wbWVudF9tb2RlID0gJyc7Cgl9CgoJJGN1cnJlbnRfbW9kZSA9ICRkZXZlbG9wbWVudF9tb2RlOwoKCXJldHVybiAkY3VycmVudF9tb2RlOwp9CgovKioKICogQ2hlY2tzIHdoZXRoZXIgdGhlIHNpdGUgaXMgaW4gdGhlIGdpdmVuIGRldmVsb3BtZW50IG1vZGUuCiAqCiAqIEBzaW5jZSA2LjMuMAogKgogKiBAcGFyYW0gc3RyaW5nICRtb2RlIERldmVsb3BtZW50IG1vZGUgdG8gY2hlY2sgZm9yLiBFaXRoZXIgJ2NvcmUnLCAncGx1Z2luJywgJ3RoZW1lJywgb3IgJ2FsbCcuCiAqIEByZXR1cm4gYm9vbCBUcnVlIGlmIHRoZSBnaXZlbiBtb2RlIGlzIGNvdmVyZWQgYnkgdGhlIGN1cnJlbnQgZGV2ZWxvcG1lbnQgbW9kZSwgZmFsc2Ugb3RoZXJ3aXNlLgogKi8KZnVuY3Rpb24gd3BfaXNfZGV2ZWxvcG1lbnRfbW9kZSggJG1vZGUgKSB7CgkkY3VycmVudF9tb2RlID0gd3BfZ2V0X2RldmVsb3BtZW50X21vZGUoKTsKCWlmICggZW1wdHkoICRjdXJyZW50X21vZGUgKSApIHsKCQlyZXR1cm4gZmFsc2U7Cgl9CgoJLy8gUmV0dXJuIHRydWUgaWYgdGhlIGN1cnJlbnQgbW9kZSBlbmNvbXBhc3NlcyBhbGwgbW9kZXMuCglpZiAoICdhbGwnID09PSAkY3VycmVudF9tb2RlICkgewoJCXJldHVybiB0cnVlOwoJfQoKCS8vIFJldHVybiB0cnVlIGlmIHRoZSBjdXJyZW50IG1vZGUgaXMgdGhlIGdpdmVuIG1vZGUuCglyZXR1cm4gJG1vZGUgPT09ICRjdXJyZW50X21vZGU7Cn0KCi8qKgogKiBFbnN1cmVzIGFsbCBvZiBXb3JkUHJlc3MgaXMgbm90IGxvYWRlZCB3aGVuIGhhbmRsaW5nIGEgZmF2aWNvbi5pY28gcmVxdWVzdC4KICoKICogSW5zdGVhZCwgc2VuZCB0aGUgaGVhZGVycyBmb3IgYSB6ZXJvLWxlbmd0aCBmYXZpY29uIGFuZCBiYWlsLgogKgogKiBAc2luY2UgMy4wLjAKICogQGRlcHJlY2F0ZWQgNS40LjAgRGVwcmVjYXRlZCBpbiBmYXZvciBvZiBkb19mYXZpY29uKCkuCiAqLwpmdW5jdGlvbiB3cF9mYXZpY29uX3JlcXVlc3QoKSB7CglpZiAoICcvZmF2aWNvbi5pY28nID09PSAkX1NFUlZFUlsnUkVRVUVTVF9VUkknXSApIHsKCQloZWFkZXIoICdDb250ZW50LVR5cGU6IGltYWdlL3ZuZC5taWNyb3NvZnQuaWNvbicgKTsKCQlleGl0OwoJfQp9CgovKioKICogRGllcyB3aXRoIGEgbWFpbnRlbmFuY2UgbWVzc2FnZSB3aGVuIGNvbmRpdGlvbnMgYXJlIG1ldC4KICoKICogVGhlIGRlZmF1bHQgbWVzc2FnZSBjYW4gYmUgcmVwbGFjZWQgYnkgdXNpbmcgYSBkcm9wLWluIChtYWludGVuYW5jZS5waHAgaW4KICogdGhlIHdwLWNvbnRlbnQgZGlyZWN0b3J5KS4KICoKICogQHNpbmNlIDMuMC4wCiAqIEBhY2Nlc3MgcHJpdmF0ZQogKi8KZnVuY3Rpb24gd3BfbWFpbnRlbmFuY2UoKSB7CgkvLyBSZXR1cm4gaWYgbWFpbnRlbmFuY2UgbW9kZSBpcyBkaXNhYmxlZC4KCWlmICggISB3cF9pc19tYWludGVuYW5jZV9tb2RlKCkgKSB7CgkJcmV0dXJuOwoJfQoKCWlmICggZmlsZV9leGlzdHMoIFdQX0NPTlRFTlRfRElSIC4gJy9tYWludGVuYW5jZS5waHAnICkgKSB7CgkJcmVxdWlyZV9vbmNlIFdQX0NPTlRFTlRfRElSIC4gJy9tYWludGVuYW5jZS5waHAnOwoJCWRpZSgpOwoJfQoKCXJlcXVpcmVfb25jZSBBQlNQQVRIIC4gV1BJTkMgLiAnL2Z1bmN0aW9ucy5waHAnOwoJd3BfbG9hZF90cmFuc2xhdGlvbnNfZWFybHkoKTsKCgloZWFkZXIoICdSZXRyeS1BZnRlcjogNjAwJyApOwoKCXdwX2RpZSgKCQlfXyggJ0JyaWVmbHkgdW5hdmFpbGFibGUgZm9yIHNjaGVkdWxlZCBtYWludGVuYW5jZS4gQ2hlY2sgYmFjayBpbiBhIG1pbnV0ZS4nICksCgkJX18oICdNYWludGVuYW5jZScgKSwKCQk1MDMKCSk7Cn0KCi8qKgogKiBDaGVja3MgaWYgbWFpbnRlbmFuY2UgbW9kZSBpcyBlbmFibGVkLgogKgogKiBDaGVja3MgZm9yIGEgZmlsZSBpbiB0aGUgV29yZFByZXNzIHJvb3QgZGlyZWN0b3J5IG5hbWVkICIubWFpbnRlbmFuY2UiLgogKiBUaGlzIGZpbGUgd2lsbCBjb250YWluIHRoZSB2YXJpYWJsZSAkdXBncmFkaW5nLCBzZXQgdG8gdGhlIHRpbWUgdGhlIGZpbGUKICogd2FzIGNyZWF0ZWQuIElmIHRoZSBmaWxlIHdhcyBjcmVhdGVkIGxlc3MgdGhhbiAxMCBtaW51dGVzIGFnbywgV29yZFByZXNzCiAqIGlzIGluIG1haW50ZW5hbmNlIG1vZGUuCiAqCiAqIEBzaW5jZSA1LjUuMAogKgogKiBAZ2xvYmFsIGludCAkdXBncmFkaW5nIFRoZSBVbml4IHRpbWVzdGFtcCBtYXJraW5nIHdoZW4gdXBncmFkaW5nIFdvcmRQcmVzcyBiZWdhbi4KICoKICogQHJldHVybiBib29sIFRydWUgaWYgbWFpbnRlbmFuY2UgbW9kZSBpcyBlbmFibGVkLCBmYWxzZSBvdGhlcndpc2UuCiAqLwpmdW5jdGlvbiB3cF9pc19tYWludGVuYW5jZV9tb2RlKCkgewoJZ2xvYmFsICR1cGdyYWRpbmc7CgoJaWYgKCAhIGZpbGVfZXhpc3RzKCBBQlNQQVRIIC4gJy5tYWludGVuYW5jZScgKSB8fCB3cF9pbnN0YWxsaW5nKCkgKSB7CgkJcmV0dXJuIGZhbHNlOwoJfQoKCXJlcXVpcmUgQUJTUEFUSCAuICcubWFpbnRlbmFuY2UnOwoKCS8vIElmIHRoZSAkdXBncmFkaW5nIHRpbWVzdGFtcCBpcyBvbGRlciB0aGFuIDEwIG1pbnV0ZXMsIGNvbnNpZGVyIG1haW50ZW5hbmNlIG92ZXIuCglpZiAoICggdGltZSgpIC0gJHVwZ3JhZGluZyApID49IDEwICogTUlOVVRFX0lOX1NFQ09ORFMgKSB7CgkJcmV0dXJuIGZhbHNlOwoJfQoKCS8vIERvbid0IGVuYWJsZSBtYWludGVuYW5jZSBtb2RlIHdoaWxlIHNjcmFwaW5nIGZvciBmYXRhbCBlcnJvcnMuCglpZiAoIGlzX2ludCggJHVwZ3JhZGluZyApICYmIGlzc2V0KCAkX1JFUVVFU1RbJ3dwX3NjcmFwZV9rZXknXSwgJF9SRVFVRVNUWyd3cF9zY3JhcGVfbm9uY2UnXSApICkgewoJCSRrZXkgICA9IHN0cmlwc2xhc2hlcyggJF9SRVFVRVNUWyd3cF9zY3JhcGVfa2V5J10gKTsKCQkkbm9uY2UgPSBzdHJpcHNsYXNoZXMoICRfUkVRVUVTVFsnd3Bfc2NyYXBlX25vbmNlJ10gKTsKCgkJaWYgKCBtZDUoICR1cGdyYWRpbmcgKSA9PT0gJGtleSAmJiAoaW50KSAkbm9uY2UgPT09ICR1cGdyYWRpbmcgKSB7CgkJCXJldHVybiBmYWxzZTsKCQl9Cgl9CgoJLyoqCgkgKiBGaWx0ZXJzIHdoZXRoZXIgdG8gZW5hYmxlIG1haW50ZW5hbmNlIG1vZGUuCgkgKgoJICogVGhpcyBmaWx0ZXIgcnVucyBiZWZvcmUgaXQgY2FuIGJlIHVzZWQgYnkgcGx1Z2lucy4gSXQgaXMgZGVzaWduZWQgZm9yCgkgKiBub24td2ViIHJ1bnRpbWVzLiBJZiB0aGlzIGZpbHRlciByZXR1cm5zIHRydWUsIG1haW50ZW5hbmNlIG1vZGUgd2lsbCBiZQoJICogYWN0aXZlIGFuZCB0aGUgcmVxdWVzdCB3aWxsIGVuZC4gSWYgZmFsc2UsIHRoZSByZXF1ZXN0IHdpbGwgYmUgYWxsb3dlZCB0bwoJICogY29udGludWUgcHJvY2Vzc2luZyBldmVuIGlmIG1haW50ZW5hbmNlIG1vZGUgc2hvdWxkIGJlIGFjdGl2ZS4KCSAqCgkgKiBAc2luY2UgNC42LjAKCSAqCgkgKiBAcGFyYW0gYm9vbCAkZW5hYmxlX2NoZWNrcyBXaGV0aGVyIHRvIGVuYWJsZSBtYWludGVuYW5jZSBtb2RlLiBEZWZhdWx0IHRydWUuCgkgKiBAcGFyYW0gaW50ICAkdXBncmFkaW5nICAgICBUaGUgdGltZXN0YW1wIHNldCBpbiB0aGUgLm1haW50ZW5hbmNlIGZpbGUuCgkgKi8KCWlmICggISBhcHBseV9maWx0ZXJzKCAnZW5hYmxlX21haW50ZW5hbmNlX21vZGUnLCB0cnVlLCAkdXBncmFkaW5nICkgKSB7CgkJcmV0dXJuIGZhbHNlOwoJfQoKCXJldHVybiB0cnVlOwp9CgovKioKICogR2V0cyB0aGUgdGltZSBlbGFwc2VkIHNvIGZhciBkdXJpbmcgdGhpcyBQSFAgc2NyaXB0LgogKgogKiBAc2luY2UgNS44LjAKICoKICogQHJldHVybiBmbG9hdCBTZWNvbmRzIHNpbmNlIHRoZSBQSFAgc2NyaXB0IHN0YXJ0ZWQuCiAqLwpmdW5jdGlvbiB0aW1lcl9mbG9hdCgpIHsKCXJldHVybiBtaWNyb3RpbWUoIHRydWUgKSAtICRfU0VSVkVSWydSRVFVRVNUX1RJTUVfRkxPQVQnXTsKfQoKLyoqCiAqIFN0YXJ0cyB0aGUgV29yZFByZXNzIG1pY3JvLXRpbWVyLgogKgogKiBAc2luY2UgMC43MQogKiBAYWNjZXNzIHByaXZhdGUKICoKICogQHNlZSB0aW1lcl9zdG9wKCkKICoKICogQGdsb2JhbCBmbG9hdCAkdGltZXN0YXJ0IFVuaXggdGltZXN0YW1wIHNldCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBwYWdlIGxvYWQuCiAqCiAqIEByZXR1cm4gYm9vbCBBbHdheXMgcmV0dXJucyB0cnVlLgogKi8KZnVuY3Rpb24gdGltZXJfc3RhcnQoKSB7CglnbG9iYWwgJHRpbWVzdGFydDsKCgkkdGltZXN0YXJ0ID0gbWljcm90aW1lKCB0cnVlICk7CgoJcmV0dXJuIHRydWU7Cn0KCi8qKgogKiBSZXRyaWV2ZXMgb3IgZGlzcGxheXMgdGhlIHRpbWUgZnJvbSB0aGUgcGFnZSBzdGFydCB0byB3aGVuIGZ1bmN0aW9uIGlzIGNhbGxlZC4KICoKICogQHNpbmNlIDAuNzEKICoKICogQGdsb2JhbCBmbG9hdCAgICR0aW1lc3RhcnQgU2Vjb25kcyBmcm9tIHdoZW4gdGltZXJfc3RhcnQoKSBpcyBjYWxsZWQuCiAqIEBnbG9iYWwgZmxvYXQgICAkdGltZWVuZCAgIFNlY29uZHMgZnJvbSB3aGVuIGZ1bmN0aW9uIGlzIGNhbGxlZC4KICoKICogQHBhcmFtIGludHxib29sICRkaXNwbGF5ICAgV2hldGhlciB0byBlY2hvIG9yIHJldHVybiB0aGUgcmVzdWx0cy4gQWNjZXB0cyAwfGZhbHNlIGZvciByZXR1cm4sCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIDF8dHJ1ZSBmb3IgZWNoby4gRGVmYXVsdCAwfGZhbHNlLgogKiBAcGFyYW0gaW50ICAgICAgJHByZWNpc2lvbiBUaGUgbnVtYmVyIG9mIGRpZ2l0cyBmcm9tIHRoZSByaWdodCBvZiB0aGUgZGVjaW1hbCB0byBkaXNwbGF5LgogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZhdWx0IDMuCiAqIEByZXR1cm4gc3RyaW5nIFRoZSAic2Vjb25kLm1pY3Jvc2Vjb25kIiBmaW5pc2hlZCB0aW1lIGNhbGN1bGF0aW9uLiBUaGUgbnVtYmVyIGlzIGZvcm1hdHRlZAogKiAgICAgICAgICAgICAgICBmb3IgaHVtYW4gY29uc3VtcHRpb24sIGJvdGggbG9jYWxpemVkIGFuZCByb3VuZGVkLgogKi8KZnVuY3Rpb24gdGltZXJfc3RvcCggJGRpc3BsYXkgPSAwLCAkcHJlY2lzaW9uID0gMyApIHsKCWdsb2JhbCAkdGltZXN0YXJ0LCAkdGltZWVuZDsKCgkkdGltZWVuZCAgID0gbWljcm90aW1lKCB0cnVlICk7CgkkdGltZXRvdGFsID0gJHRpbWVlbmQgLSAkdGltZXN0YXJ0OwoKCWlmICggZnVuY3Rpb25fZXhpc3RzKCAnbnVtYmVyX2Zvcm1hdF9pMThuJyApICkgewoJCSRyID0gbnVtYmVyX2Zvcm1hdF9pMThuKCAkdGltZXRvdGFsLCAkcHJlY2lzaW9uICk7Cgl9IGVsc2UgewoJCSRyID0gbnVtYmVyX2Zvcm1hdCggJHRpbWV0b3RhbCwgJHByZWNpc2lvbiApOwoJfQoKCWlmICggJGRpc3BsYXkgKSB7CgkJZWNobyAkcjsKCX0KCglyZXR1cm4gJHI7Cn0KCi8qKgogKiBTZXRzIFBIUCBlcnJvciByZXBvcnRpbmcgYmFzZWQgb24gV29yZFByZXNzIGRlYnVnIHNldHRpbmdzLgogKgogKiBVc2VzIHRocmVlIGNvbnN0YW50czogYFdQX0RFQlVHYCwgYFdQX0RFQlVHX0RJU1BMQVlgLCBhbmQgYFdQX0RFQlVHX0xPR2AuCiAqIEFsbCB0aHJlZSBjYW4gYmUgZGVmaW5lZCBpbiB3cC1jb25maWcucGhwLiBCeSBkZWZhdWx0LCBgV1BfREVCVUdgIGFuZAogKiBgV1BfREVCVUdfTE9HYCBhcmUgc2V0IHRvIGZhbHNlLCBhbmQgYFdQX0RFQlVHX0RJU1BMQVlgIGlzIHNldCB0byB0cnVlLgogKgogKiBXaGVuIGBXUF9ERUJVR2AgaXMgdHJ1ZSwgYWxsIFBIUCBub3RpY2VzIGFyZSByZXBvcnRlZC4gV29yZFByZXNzIHdpbGwgYWxzbwogKiBkaXNwbGF5IGludGVybmFsIG5vdGljZXM6IHdoZW4gYSBkZXByZWNhdGVkIFdvcmRQcmVzcyBmdW5jdGlvbiwgZnVuY3Rpb24KICogYXJndW1lbnQsIG9yIGZpbGUgaXMgdXNlZC4gRGVwcmVjYXRlZCBjb2RlIG1heSBiZSByZW1vdmVkIGZyb20gYSBsYXRlcgogKiB2ZXJzaW9uLgogKgogKiBJdCBpcyBzdHJvbmdseSByZWNvbW1lbmRlZCB0aGF0IHBsdWdpbiBhbmQgdGhlbWUgZGV2ZWxvcGVycyB1c2UgYFdQX0RFQlVHYAogKiBpbiB0aGVpciBkZXZlbG9wbWVudCBlbnZpcm9ubWVudHMuCiAqCiAqIGBXUF9ERUJVR19ESVNQTEFZYCBhbmQgYFdQX0RFQlVHX0xPR2AgcGVyZm9ybSBubyBmdW5jdGlvbiB1bmxlc3MgYFdQX0RFQlVHYAogKiBpcyB0cnVlLgogKgogKiBXaGVuIGBXUF9ERUJVR19ESVNQTEFZYCBpcyB0cnVlLCBXb3JkUHJlc3Mgd2lsbCBmb3JjZSBlcnJvcnMgdG8gYmUgZGlzcGxheWVkLgogKiBgV1BfREVCVUdfRElTUExBWWAgZGVmYXVsdHMgdG8gdHJ1ZS4gRGVmaW5pbmcgaXQgYXMgbnVsbCBwcmV2ZW50cyBXb3JkUHJlc3MKICogZnJvbSBjaGFuZ2luZyB0aGUgZ2xvYmFsIGNvbmZpZ3VyYXRpb24gc2V0dGluZy4gRGVmaW5pbmcgYFdQX0RFQlVHX0RJU1BMQVlgCiAqIGFzIGZhbHNlIHdpbGwgZm9yY2UgZXJyb3JzIHRvIGJlIGhpZGRlbi4KICoKICogV2hlbiBgV1BfREVCVUdfTE9HYCBpcyB0cnVlLCBlcnJvcnMgd2lsbCBiZSBsb2dnZWQgdG8gYHdwLWNvbnRlbnQvZGVidWcubG9nYC4KICogV2hlbiBgV1BfREVCVUdfTE9HYCBpcyBhIHZhbGlkIHBhdGgsIGVycm9ycyB3aWxsIGJlIGxvZ2dlZCB0byB0aGUgc3BlY2lmaWVkIGZpbGUuCiAqCiAqIEVycm9ycyBhcmUgbmV2ZXIgZGlzcGxheWVkIGZvciBYTUwtUlBDLCBSRVNULCBgbXMtZmlsZXMucGhwYCwgYW5kIEFqYXggcmVxdWVzdHMuCiAqCiAqIEBzaW5jZSAzLjAuMAogKiBAc2luY2UgNS4xLjAgYFdQX0RFQlVHX0xPR2AgY2FuIGJlIGEgZmlsZSBwYXRoLgogKiBAYWNjZXNzIHByaXZhdGUKICovCmZ1bmN0aW9uIHdwX2RlYnVnX21vZGUoKSB7CgkvKioKCSAqIEZpbHRlcnMgd2hldGhlciB0byBhbGxvdyB0aGUgZGVidWcgbW9kZSBjaGVjayB0byBvY2N1ci4KCSAqCgkgKiBUaGlzIGZpbHRlciBydW5zIGJlZm9yZSBpdCBjYW4gYmUgdXNlZCBieSBwbHVnaW5zLiBJdCBpcyBkZXNpZ25lZCBmb3IKCSAqIG5vbi13ZWIgcnVudGltZXMuIFJldHVybmluZyBmYWxzZSBjYXVzZXMgdGhlIGBXUF9ERUJVR2AgYW5kIHJlbGF0ZWQKCSAqIGNvbnN0YW50cyB0byBub3QgYmUgY2hlY2tlZCBhbmQgdGhlIGRlZmF1bHQgUEhQIHZhbHVlcyBmb3IgZXJyb3JzCgkgKiB3aWxsIGJlIHVzZWQgdW5sZXNzIHlvdSB0YWtlIGNhcmUgdG8gdXBkYXRlIHRoZW0geW91cnNlbGYuCgkgKgoJICogVG8gdXNlIHRoaXMgZmlsdGVyIHlvdSBtdXN0IGRlZmluZSBhIGAkd3BfZmlsdGVyYCBnbG9iYWwgYmVmb3JlCgkgKiBXb3JkUHJlc3MgbG9hZHMsIHVzdWFsbHkgaW4gYHdwLWNvbmZpZy5waHBgLgoJICoKCSAqIEV4YW1wbGU6CgkgKgoJICogICAgICRHTE9CQUxTWyd3cF9maWx0ZXInXSA9IGFycmF5KAoJICogICAgICAgICAnZW5hYmxlX3dwX2RlYnVnX21vZGVfY2hlY2tzJyA9PiBhcnJheSgKCSAqICAgICAgICAgICAgIDEwID0+IGFycmF5KAoJICogICAgICAgICAgICAgICAgIGFycmF5KAoJICogICAgICAgICAgICAgICAgICAgICAnYWNjZXB0ZWRfYXJncycgPT4gMCwKCSAqICAgICAgICAgICAgICAgICAgICAgJ2Z1bmN0aW9uJyAgICAgID0+IGZ1bmN0aW9uKCkgewoJICogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwoJICogICAgICAgICAgICAgICAgICAgICB9LAoJICogICAgICAgICAgICAgICAgICksCgkgKiAgICAgICAgICAgICApLAoJICogICAgICAgICApLAoJICogICAgICk7CgkgKgoJICogQHNpbmNlIDQuNi4wCgkgKgoJICogQHBhcmFtIGJvb2wgJGVuYWJsZV9kZWJ1Z19tb2RlIFdoZXRoZXIgdG8gZW5hYmxlIGRlYnVnIG1vZGUgY2hlY2tzIHRvIG9jY3VyLiBEZWZhdWx0IHRydWUuCgkgKi8KCWlmICggISBhcHBseV9maWx0ZXJzKCAnZW5hYmxlX3dwX2RlYnVnX21vZGVfY2hlY2tzJywgdHJ1ZSApICkgewoJCXJldHVybjsKCX0KCglpZiAoIFdQX0RFQlVHICkgewoJCWVycm9yX3JlcG9ydGluZyggRV9BTEwgKTsKCgkJaWYgKCBXUF9ERUJVR19ESVNQTEFZICkgewoJCQlpbmlfc2V0KCAnZGlzcGxheV9lcnJvcnMnLCAxICk7CgkJfSBlbHNlaWYgKCBudWxsICE9PSBXUF9ERUJVR19ESVNQTEFZICkgewoJCQlpbmlfc2V0KCAnZGlzcGxheV9lcnJvcnMnLCAwICk7CgkJfQoKCQlpZiAoIGluX2FycmF5KCBzdHJ0b2xvd2VyKCAoc3RyaW5nKSBXUF9ERUJVR19MT0cgKSwgYXJyYXkoICd0cnVlJywgJzEnICksIHRydWUgKSApIHsKCQkJJGxvZ19wYXRoID0gV1BfQ09OVEVOVF9ESVIgLiAnL2RlYnVnLmxvZyc7CgkJfSBlbHNlaWYgKCBpc19zdHJpbmcoIFdQX0RFQlVHX0xPRyApICkgewoJCQkkbG9nX3BhdGggPSBXUF9ERUJVR19MT0c7CgkJfSBlbHNlIHsKCQkJJGxvZ19wYXRoID0gZmFsc2U7CgkJfQoKCQlpZiAoICRsb2dfcGF0aCApIHsKCQkJaW5pX3NldCggJ2xvZ19lcnJvcnMnLCAxICk7CgkJCWluaV9zZXQoICdlcnJvcl9sb2cnLCAkbG9nX3BhdGggKTsKCQl9Cgl9IGVsc2UgewoJCWVycm9yX3JlcG9ydGluZyggRV9DT1JFX0VSUk9SIHwgRV9DT1JFX1dBUk5JTkcgfCBFX0NPTVBJTEVfRVJST1IgfCBFX0VSUk9SIHwgRV9XQVJOSU5HIHwgRV9QQVJTRSB8IEVfVVNFUl9FUlJPUiB8IEVfVVNFUl9XQVJOSU5HIHwgRV9SRUNPVkVSQUJMRV9FUlJPUiApOwoJfQoKCS8qCgkgKiBUaGUgJ1JFU1RfUkVRVUVTVCcgY2hlY2sgaGVyZSBpcyBvcHRpbWlzdGljIGFzIHRoZSBjb25zdGFudCBpcyBtb3N0CgkgKiBsaWtlbHkgbm90IHNldCBhdCB0aGlzIHBvaW50IGV2ZW4gaWYgaXQgaXMgaW4gZmFjdCBhIFJFU1QgcmVxdWVzdC4KCSAqLwoJaWYgKCBkZWZpbmVkKCAnWE1MUlBDX1JFUVVFU1QnICkgfHwgZGVmaW5lZCggJ1JFU1RfUkVRVUVTVCcgKSB8fCBkZWZpbmVkKCAnTVNfRklMRVNfUkVRVUVTVCcgKQoJCXx8ICggZGVmaW5lZCggJ1dQX0lOU1RBTExJTkcnICkgJiYgV1BfSU5TVEFMTElORyApCgkJfHwgd3BfZG9pbmdfYWpheCgpIHx8IHdwX2lzX2pzb25fcmVxdWVzdCgpCgkpIHsKCQlpbmlfc2V0KCAnZGlzcGxheV9lcnJvcnMnLCAwICk7Cgl9Cn0KCi8qKgogKiBTZXRzIHRoZSBsb2NhdGlvbiBvZiB0aGUgbGFuZ3VhZ2UgZGlyZWN0b3J5LgogKgogKiBUbyBzZXQgZGlyZWN0b3J5IG1hbnVhbGx5LCBkZWZpbmUgdGhlIGBXUF9MQU5HX0RJUmAgY29uc3RhbnQKICogaW4gd3AtY29uZmlnLnBocC4KICoKICogSWYgdGhlIGxhbmd1YWdlIGRpcmVjdG9yeSBleGlzdHMgd2l0aGluIGBXUF9DT05URU5UX0RJUmAsIGl0CiAqIGlzIHVzZWQuIE90aGVyd2lzZSB0aGUgbGFuZ3VhZ2UgZGlyZWN0b3J5IGlzIGFzc3VtZWQgdG8gbGl2ZQogKiBpbiBgV1BJTkNgLgogKgogKiBAc2luY2UgMy4wLjAKICogQGFjY2VzcyBwcml2YXRlCiAqLwpmdW5jdGlvbiB3cF9zZXRfbGFuZ19kaXIoKSB7CglpZiAoICEgZGVmaW5lZCggJ1dQX0xBTkdfRElSJyApICkgewoJCWlmICggZmlsZV9leGlzdHMoIFdQX0NPTlRFTlRfRElSIC4gJy9sYW5ndWFnZXMnICkgJiYgQGlzX2RpciggV1BfQ09OVEVOVF9ESVIgLiAnL2xhbmd1YWdlcycgKQoJCQl8fCAhIEBpc19kaXIoIEFCU1BBVEggLiBXUElOQyAuICcvbGFuZ3VhZ2VzJyApCgkJKSB7CgkJCS8qKgoJCQkgKiBTZXJ2ZXIgcGF0aCBvZiB0aGUgbGFuZ3VhZ2UgZGlyZWN0b3J5LgoJCQkgKgoJCQkgKiBObyBsZWFkaW5nIHNsYXNoLCBubyB0cmFpbGluZyBzbGFzaCwgZnVsbCBwYXRoLCBub3QgcmVsYXRpdmUgdG8gQUJTUEFUSAoJCQkgKgoJCQkgKiBAc2luY2UgMi4xLjAKCQkJICovCgkJCWRlZmluZSggJ1dQX0xBTkdfRElSJywgV1BfQ09OVEVOVF9ESVIgLiAnL2xhbmd1YWdlcycgKTsKCgkJCWlmICggISBkZWZpbmVkKCAnTEFOR0RJUicgKSApIHsKCQkJCS8vIE9sZCBzdGF0aWMgcmVsYXRpdmUgcGF0aCBtYWludGFpbmVkIGZvciBsaW1pdGVkIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgLSB3b24ndCB3b3JrIGluIHNvbWUgY2FzZXMuCgkJCQlkZWZpbmUoICdMQU5HRElSJywgJ3dwLWNvbnRlbnQvbGFuZ3VhZ2VzJyApOwoJCQl9CgkJfSBlbHNlIHsKCQkJLyoqCgkJCSAqIFNlcnZlciBwYXRoIG9mIHRoZSBsYW5ndWFnZSBkaXJlY3RvcnkuCgkJCSAqCgkJCSAqIE5vIGxlYWRpbmcgc2xhc2gsIG5vIHRyYWlsaW5nIHNsYXNoLCBmdWxsIHBhdGgsIG5vdCByZWxhdGl2ZSB0byBgQUJTUEFUSGAuCgkJCSAqCgkJCSAqIEBzaW5jZSAyLjEuMAoJCQkgKi8KCQkJZGVmaW5lKCAnV1BfTEFOR19ESVInLCBBQlNQQVRIIC4gV1BJTkMgLiAnL2xhbmd1YWdlcycgKTsKCgkJCWlmICggISBkZWZpbmVkKCAnTEFOR0RJUicgKSApIHsKCQkJCS8vIE9sZCByZWxhdGl2ZSBwYXRoIG1haW50YWluZWQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuCgkJCQlkZWZpbmUoICdMQU5HRElSJywgV1BJTkMgLiAnL2xhbmd1YWdlcycgKTsKCQkJfQoJCX0KCX0KfQoKLyoqCiAqIExvYWRzIHRoZSBkYXRhYmFzZSBjbGFzcyBmaWxlIGFuZCBpbnN0YW50aWF0ZXMgdGhlIGAkd3BkYmAgZ2xvYmFsLgogKgogKiBAc2luY2UgMi41LjAKICoKICogQGdsb2JhbCB3cGRiICR3cGRiIFdvcmRQcmVzcyBkYXRhYmFzZSBhYnN0cmFjdGlvbiBvYmplY3QuCiAqLwpmdW5jdGlvbiByZXF1aXJlX3dwX2RiKCkgewoJZ2xvYmFsICR3cGRiOwoKCXJlcXVpcmVfb25jZSBBQlNQQVRIIC4gV1BJTkMgLiAnL2NsYXNzLXdwZGIucGhwJzsKCglpZiAoIGZpbGVfZXhpc3RzKCBXUF9DT05URU5UX0RJUiAuICcvZGIucGhwJyApICkgewoJCXJlcXVpcmVfb25jZSBXUF9DT05URU5UX0RJUiAuICcvZGIucGhwJzsKCX0KCglpZiAoIGlzc2V0KCAkd3BkYiApICkgewoJCXJldHVybjsKCX0KCgkkZGJ1c2VyICAgICA9IGRlZmluZWQoICdEQl9VU0VSJyApID8gREJfVVNFUiA6ICcnOwoJJGRicGFzc3dvcmQgPSBkZWZpbmVkKCAnREJfUEFTU1dPUkQnICkgPyBEQl9QQVNTV09SRCA6ICcnOwoJJGRibmFtZSAgICAgPSBkZWZpbmVkKCAnREJfTkFNRScgKSA/IERCX05BTUUgOiAnJzsKCSRkYmhvc3QgICAgID0gZGVmaW5lZCggJ0RCX0hPU1QnICkgPyBEQl9IT1NUIDogJyc7CgoJJHdwZGIgPSBuZXcgd3BkYiggJGRidXNlciwgJGRicGFzc3dvcmQsICRkYm5hbWUsICRkYmhvc3QgKTsKfQoKLyoqCiAqIFNldHMgdGhlIGRhdGFiYXNlIHRhYmxlIHByZWZpeCBhbmQgdGhlIGZvcm1hdCBzcGVjaWZpZXJzIGZvciBkYXRhYmFzZQogKiB0YWJsZSBjb2x1bW5zLgogKgogKiBDb2x1bW5zIG5vdCBsaXN0ZWQgaGVyZSBkZWZhdWx0IHRvIGAlc2AuCiAqCiAqIEBzaW5jZSAzLjAuMAogKiBAYWNjZXNzIHByaXZhdGUKICoKICogQGdsb2JhbCB3cGRiICAgJHdwZGIgICAgICAgICBXb3JkUHJlc3MgZGF0YWJhc2UgYWJzdHJhY3Rpb24gb2JqZWN0LgogKiBAZ2xvYmFsIHN0cmluZyAkdGFibGVfcHJlZml4IFRoZSBkYXRhYmFzZSB0YWJsZSBwcmVmaXguCiAqLwpmdW5jdGlvbiB3cF9zZXRfd3BkYl92YXJzKCkgewoJZ2xvYmFsICR3cGRiLCAkdGFibGVfcHJlZml4OwoKCWlmICggISBlbXB0eSggJHdwZGItPmVycm9yICkgKSB7CgkJZGVhZF9kYigpOwoJfQoKCSR3cGRiLT5maWVsZF90eXBlcyA9IGFycmF5KAoJCSdwb3N0X2F1dGhvcicgICAgICA9PiAnJWQnLAoJCSdwb3N0X3BhcmVudCcgICAgICA9PiAnJWQnLAoJCSdtZW51X29yZGVyJyAgICAgICA9PiAnJWQnLAoJCSd0ZXJtX2lkJyAgICAgICAgICA9PiAnJWQnLAoJCSd0ZXJtX2dyb3VwJyAgICAgICA9PiAnJWQnLAoJCSd0ZXJtX3RheG9ub215X2lkJyA9PiAnJWQnLAoJCSdwYXJlbnQnICAgICAgICAgICA9PiAnJWQnLAoJCSdjb3VudCcgICAgICAgICAgICA9PiAnJWQnLAoJCSdvYmplY3RfaWQnICAgICAgICA9PiAnJWQnLAoJCSd0ZXJtX29yZGVyJyAgICAgICA9PiAnJWQnLAoJCSdJRCcgICAgICAgICAgICAgICA9PiAnJWQnLAoJCSdjb21tZW50X0lEJyAgICAgICA9PiAnJWQnLAoJCSdjb21tZW50X3Bvc3RfSUQnICA9PiAnJWQnLAoJCSdjb21tZW50X3BhcmVudCcgICA9PiAnJWQnLAoJCSd1c2VyX2lkJyAgICAgICAgICA9PiAnJWQnLAoJCSdsaW5rX2lkJyAgICAgICAgICA9PiAnJWQnLAoJCSdsaW5rX293bmVyJyAgICAgICA9PiAnJWQnLAoJCSdsaW5rX3JhdGluZycgICAgICA9PiAnJWQnLAoJCSdvcHRpb25faWQnICAgICAgICA9PiAnJWQnLAoJCSdibG9nX2lkJyAgICAgICAgICA9PiAnJWQnLAoJCSdtZXRhX2lkJyAgICAgICAgICA9PiAnJWQnLAoJCSdwb3N0X2lkJyAgICAgICAgICA9PiAnJWQnLAoJCSd1c2VyX3N0YXR1cycgICAgICA9PiAnJWQnLAoJCSd1bWV0YV9pZCcgICAgICAgICA9PiAnJWQnLAoJCSdjb21tZW50X2thcm1hJyAgICA9PiAnJWQnLAoJCSdjb21tZW50X2NvdW50JyAgICA9PiAnJWQnLAoJCS8vIE11bHRpc2l0ZToKCQknYWN0aXZlJyAgICAgICAgICAgPT4gJyVkJywKCQknY2F0X2lkJyAgICAgICAgICAgPT4gJyVkJywKCQknZGVsZXRlZCcgICAgICAgICAgPT4gJyVkJywKCQknbGFuZ19pZCcgICAgICAgICAgPT4gJyVkJywKCQknbWF0dXJlJyAgICAgICAgICAgPT4gJyVkJywKCQkncHVibGljJyAgICAgICAgICAgPT4gJyVkJywKCQknc2l0ZV9pZCcgICAgICAgICAgPT4gJyVkJywKCQknc3BhbScgICAgICAgICAgICAgPT4gJyVkJywKCSk7CgoJJHByZWZpeCA9ICR3cGRiLT5zZXRfcHJlZml4KCAkdGFibGVfcHJlZml4ICk7CgoJaWYgKCBpc193cF9lcnJvciggJHByZWZpeCApICkgewoJCXdwX2xvYWRfdHJhbnNsYXRpb25zX2Vhcmx5KCk7CgkJd3BfZGllKAoJCQlzcHJpbnRmKAoJCQkJLyogdHJhbnNsYXRvcnM6IDE6ICR0YWJsZV9wcmVmaXgsIDI6IHdwLWNvbmZpZy5waHAgKi8KCQkJCV9fKCAnPHN0cm9uZz5FcnJvcjo8L3N0cm9uZz4gJTEkcyBpbiAlMiRzIGNhbiBvbmx5IGNvbnRhaW4gbnVtYmVycywgbGV0dGVycywgYW5kIHVuZGVyc2NvcmVzLicgKSwKCQkJCSc8Y29kZT4kdGFibGVfcHJlZml4PC9jb2RlPicsCgkJCQknPGNvZGU+d3AtY29uZmlnLnBocDwvY29kZT4nCgkJCSkKCQkpOwoJfQp9CgovKioKICogVG9nZ2xlcyBgJF93cF91c2luZ19leHRfb2JqZWN0X2NhY2hlYCBvbiBhbmQgb2ZmIHdpdGhvdXQgZGlyZWN0bHkKICogdG91Y2hpbmcgZ2xvYmFsLgogKgogKiBAc2luY2UgMy43LjAKICoKICogQGdsb2JhbCBib29sICRfd3BfdXNpbmdfZXh0X29iamVjdF9jYWNoZQogKgogKiBAcGFyYW0gYm9vbCAkdXNpbmcgV2hldGhlciBleHRlcm5hbCBvYmplY3QgY2FjaGUgaXMgYmVpbmcgdXNlZC4KICogQHJldHVybiBib29sIFRoZSBjdXJyZW50ICd1c2luZycgc2V0dGluZy4KICovCmZ1bmN0aW9uIHdwX3VzaW5nX2V4dF9vYmplY3RfY2FjaGUoICR1c2luZyA9IG51bGwgKSB7CglnbG9iYWwgJF93cF91c2luZ19leHRfb2JqZWN0X2NhY2hlOwoKCSRjdXJyZW50X3VzaW5nID0gJF93cF91c2luZ19leHRfb2JqZWN0X2NhY2hlOwoKCWlmICggbnVsbCAhPT0gJHVzaW5nICkgewoJCSRfd3BfdXNpbmdfZXh0X29iamVjdF9jYWNoZSA9ICR1c2luZzsKCX0KCglyZXR1cm4gJGN1cnJlbnRfdXNpbmc7Cn0KCi8qKgogKiBTdGFydHMgdGhlIFdvcmRQcmVzcyBvYmplY3QgY2FjaGUuCiAqCiAqIElmIGFuIG9iamVjdC1jYWNoZS5waHAgZmlsZSBleGlzdHMgaW4gdGhlIHdwLWNvbnRlbnQgZGlyZWN0b3J5LAogKiBpdCB1c2VzIHRoYXQgZHJvcC1pbiBhcyBhbiBleHRlcm5hbCBvYmplY3QgY2FjaGUuCiAqCiAqIEBzaW5jZSAzLjAuMAogKiBAYWNjZXNzIHByaXZhdGUKICoKICogQGdsb2JhbCBhcnJheSAkd3BfZmlsdGVyIFN0b3JlcyBhbGwgb2YgdGhlIGZpbHRlcnMuCiAqLwpmdW5jdGlvbiB3cF9zdGFydF9vYmplY3RfY2FjaGUoKSB7CglnbG9iYWwgJHdwX2ZpbHRlcjsKCXN0YXRpYyAkZmlyc3RfaW5pdCA9IHRydWU7CgoJLy8gT25seSBwZXJmb3JtIHRoZSBmb2xsb3dpbmcgY2hlY2tzIG9uY2UuCgoJLyoqCgkgKiBGaWx0ZXJzIHdoZXRoZXIgdG8gZW5hYmxlIGxvYWRpbmcgb2YgdGhlIG9iamVjdC1jYWNoZS5waHAgZHJvcC1pbi4KCSAqCgkgKiBUaGlzIGZpbHRlciBydW5zIGJlZm9yZSBpdCBjYW4gYmUgdXNlZCBieSBwbHVnaW5zLiBJdCBpcyBkZXNpZ25lZCBmb3Igbm9uLXdlYgoJICogcnVudGltZXMuIElmIGZhbHNlIGlzIHJldHVybmVkLCBvYmplY3QtY2FjaGUucGhwIHdpbGwgbmV2ZXIgYmUgbG9hZGVkLgoJICoKCSAqIEBzaW5jZSA1LjguMAoJICoKCSAqIEBwYXJhbSBib29sICRlbmFibGVfb2JqZWN0X2NhY2hlIFdoZXRoZXIgdG8gZW5hYmxlIGxvYWRpbmcgb2JqZWN0LWNhY2hlLnBocCAoaWYgcHJlc2VudCkuCgkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZhdWx0IHRydWUuCgkgKi8KCWlmICggJGZpcnN0X2luaXQgJiYgYXBwbHlfZmlsdGVycyggJ2VuYWJsZV9sb2FkaW5nX29iamVjdF9jYWNoZV9kcm9waW4nLCB0cnVlICkgKSB7CgkJaWYgKCAhIGZ1bmN0aW9uX2V4aXN0cyggJ3dwX2NhY2hlX2luaXQnICkgKSB7CgkJCS8qCgkJCSAqIFRoaXMgaXMgdGhlIG5vcm1hbCBzaXR1YXRpb24uIEZpcnN0LXJ1biBvZiB0aGlzIGZ1bmN0aW9uLiBObwoJCQkgKiBjYWNoaW5nIGJhY2tlbmQgaGFzIGJlZW4gbG9hZGVkLgoJCQkgKgoJCQkgKiBXZSB0cnkgdG8gbG9hZCBhIGN1c3RvbSBjYWNoaW5nIGJhY2tlbmQsIGFuZCB0aGVuLCBpZiBpdAoJCQkgKiByZXN1bHRzIGluIGEgd3BfY2FjaGVfaW5pdCgpIGZ1bmN0aW9uIGV4aXN0aW5nLCB3ZSBub3RlCgkJCSAqIHRoYXQgYW4gZXh0ZXJuYWwgb2JqZWN0IGNhY2hlIGlzIGJlaW5nIHVzZWQuCgkJCSAqLwoJCQlpZiAoIGZpbGVfZXhpc3RzKCBXUF9DT05URU5UX0RJUiAuICcvb2JqZWN0LWNhY2hlLnBocCcgKSApIHsKCQkJCXJlcXVpcmVfb25jZSBXUF9DT05URU5UX0RJUiAuICcvb2JqZWN0LWNhY2hlLnBocCc7CgoJCQkJaWYgKCBmdW5jdGlvbl9leGlzdHMoICd3cF9jYWNoZV9pbml0JyApICkgewoJCQkJCXdwX3VzaW5nX2V4dF9vYmplY3RfY2FjaGUoIHRydWUgKTsKCQkJCX0KCgkJCQkvLyBSZS1pbml0aWFsaXplIGFueSBob29rcyBhZGRlZCBtYW51YWxseSBieSBvYmplY3QtY2FjaGUucGhwLgoJCQkJaWYgKCAkd3BfZmlsdGVyICkgewoJCQkJCSR3cF9maWx0ZXIgPSBXUF9Ib29rOjpidWlsZF9wcmVpbml0aWFsaXplZF9ob29rcyggJHdwX2ZpbHRlciApOwoJCQkJfQoJCQl9CgkJfSBlbHNlaWYgKCAhIHdwX3VzaW5nX2V4dF9vYmplY3RfY2FjaGUoKSAmJiBmaWxlX2V4aXN0cyggV1BfQ09OVEVOVF9ESVIgLiAnL29iamVjdC1jYWNoZS5waHAnICkgKSB7CgkJCS8qCgkJCSAqIFNvbWV0aW1lcyBhZHZhbmNlZC1jYWNoZS5waHAgY2FuIGxvYWQgb2JqZWN0LWNhY2hlLnBocCBiZWZvcmUKCQkJICogdGhpcyBmdW5jdGlvbiBpcyBydW4uIFRoaXMgYnJlYWtzIHRoZSBmdW5jdGlvbl9leGlzdHMoKSBjaGVjawoJCQkgKiBhYm92ZSBhbmQgY2FuIHJlc3VsdCBpbiB3cF91c2luZ19leHRfb2JqZWN0X2NhY2hlKCkgcmV0dXJuaW5nCgkJCSAqIGZhbHNlIHdoZW4gYWN0dWFsbHkgYW4gZXh0ZXJuYWwgY2FjaGUgaXMgaW4gdXNlLgoJCQkgKi8KCQkJd3BfdXNpbmdfZXh0X29iamVjdF9jYWNoZSggdHJ1ZSApOwoJCX0KCX0KCglpZiAoICEgd3BfdXNpbmdfZXh0X29iamVjdF9jYWNoZSgpICkgewoJCXJlcXVpcmVfb25jZSBBQlNQQVRIIC4gV1BJTkMgLiAnL2NhY2hlLnBocCc7Cgl9CgoJcmVxdWlyZV9vbmNlIEFCU1BBVEggLiBXUElOQyAuICcvY2FjaGUtY29tcGF0LnBocCc7CgoJLyoKCSAqIElmIGNhY2hlIHN1cHBvcnRzIHJlc2V0LCByZXNldCBpbnN0ZWFkIG9mIGluaXQgaWYgYWxyZWFkeQoJICogaW5pdGlhbGl6ZWQuIFJlc2V0IHNpZ25hbHMgdG8gdGhlIGNhY2hlIHRoYXQgZ2xvYmFsIElEcwoJICogaGF2ZSBjaGFuZ2VkIGFuZCBpdCBtYXkgbmVlZCB0byB1cGRhdGUga2V5cyBhbmQgY2xlYW51cCBjYWNoZXMuCgkgKi8KCWlmICggISAkZmlyc3RfaW5pdCAmJiBmdW5jdGlvbl9leGlzdHMoICd3cF9jYWNoZV9zd2l0Y2hfdG9fYmxvZycgKSApIHsKCQl3cF9jYWNoZV9zd2l0Y2hfdG9fYmxvZyggZ2V0X2N1cnJlbnRfYmxvZ19pZCgpICk7Cgl9IGVsc2VpZiAoIGZ1bmN0aW9uX2V4aXN0cyggJ3dwX2NhY2hlX2luaXQnICkgKSB7CgkJd3BfY2FjaGVfaW5pdCgpOwoJfQoKCWlmICggZnVuY3Rpb25fZXhpc3RzKCAnd3BfY2FjaGVfYWRkX2dsb2JhbF9ncm91cHMnICkgKSB7CgkJd3BfY2FjaGVfYWRkX2dsb2JhbF9ncm91cHMoCgkJCWFycmF5KAoJCQkJJ2Jsb2ctZGV0YWlscycsCgkJCQknYmxvZy1pZC1jYWNoZScsCgkJCQknYmxvZy1sb29rdXAnLAoJCQkJJ2Jsb2dfbWV0YScsCgkJCQknZ2xvYmFsLXBvc3RzJywKCQkJCSdpbWFnZV9lZGl0b3InLAoJCQkJJ25ldHdvcmtzJywKCQkJCSduZXR3b3JrLXF1ZXJpZXMnLAoJCQkJJ3NpdGVzJywKCQkJCSdzaXRlLWRldGFpbHMnLAoJCQkJJ3NpdGUtb3B0aW9ucycsCgkJCQknc2l0ZS1xdWVyaWVzJywKCQkJCSdzaXRlLXRyYW5zaWVudCcsCgkJCQkndGhlbWVfZmlsZXMnLAoJCQkJJ3RyYW5zbGF0aW9uX2ZpbGVzJywKCQkJCSdyc3MnLAoJCQkJJ3VzZXJzJywKCQkJCSd1c2VyLXF1ZXJpZXMnLAoJCQkJJ3VzZXJfbWV0YScsCgkJCQkndXNlcmVtYWlsJywKCQkJCSd1c2VybG9naW5zJywKCQkJCSd1c2Vyc2x1Z3MnLAoJCQkpCgkJKTsKCgkJd3BfY2FjaGVfYWRkX25vbl9wZXJzaXN0ZW50X2dyb3VwcyggYXJyYXkoICdjb3VudHMnLCAncGx1Z2lucycsICd0aGVtZV9qc29uJyApICk7Cgl9CgoJJGZpcnN0X2luaXQgPSBmYWxzZTsKfQoKLyoqCiAqIFJlZGlyZWN0cyB0byB0aGUgaW5zdGFsbGVyIGlmIFdvcmRQcmVzcyBpcyBub3QgaW5zdGFsbGVkLgogKgogKiBEaWVzIHdpdGggYW4gZXJyb3IgbWVzc2FnZSB3aGVuIE11bHRpc2l0ZSBpcyBlbmFibGVkLgogKgogKiBAc2luY2UgMy4wLjAKICogQGFjY2VzcyBwcml2YXRlCiAqLwpmdW5jdGlvbiB3cF9ub3RfaW5zdGFsbGVkKCkgewoJaWYgKCBpc19ibG9nX2luc3RhbGxlZCgpIHx8IHdwX2luc3RhbGxpbmcoKSApIHsKCQlyZXR1cm47Cgl9CgoJbm9jYWNoZV9oZWFkZXJzKCk7CgoJaWYgKCBpc19tdWx0aXNpdGUoKSApIHsKCQl3cF9kaWUoIF9fKCAnVGhlIHNpdGUgeW91IGhhdmUgcmVxdWVzdGVkIGlzIG5vdCBpbnN0YWxsZWQgcHJvcGVybHkuIFBsZWFzZSBjb250YWN0IHRoZSBzeXN0ZW0gYWRtaW5pc3RyYXRvci4nICkgKTsKCX0KCglyZXF1aXJlIEFCU1BBVEggLiBXUElOQyAuICcva3Nlcy5waHAnOwoJcmVxdWlyZSBBQlNQQVRIIC4gV1BJTkMgLiAnL3BsdWdnYWJsZS5waHAnOwoKCSRsaW5rID0gd3BfZ3Vlc3NfdXJsKCkgLiAnL3dwLWFkbWluL2luc3RhbGwucGhwJzsKCgl3cF9yZWRpcmVjdCggJGxpbmsgKTsKCWRpZSgpOwp9CgovKioKICogUmV0cmlldmVzIGFuIGFycmF5IG9mIG11c3QtdXNlIHBsdWdpbiBmaWxlcy4KICoKICogVGhlIGRlZmF1bHQgZGlyZWN0b3J5IGlzIHdwLWNvbnRlbnQvbXUtcGx1Z2lucy4gVG8gY2hhbmdlIHRoZSBkZWZhdWx0CiAqIGRpcmVjdG9yeSBtYW51YWxseSwgZGVmaW5lIGBXUE1VX1BMVUdJTl9ESVJgIGFuZCBgV1BNVV9QTFVHSU5fVVJMYAogKiBpbiB3cC1jb25maWcucGhwLgogKgogKiBAc2luY2UgMy4wLjAKICogQGFjY2VzcyBwcml2YXRlCiAqCiAqIEByZXR1cm4gc3RyaW5nW10gQXJyYXkgb2YgYWJzb2x1dGUgcGF0aHMgb2YgZmlsZXMgdG8gaW5jbHVkZS4KICovCmZ1bmN0aW9uIHdwX2dldF9tdV9wbHVnaW5zKCkgewoJJG11X3BsdWdpbnMgPSBhcnJheSgpOwoKCWlmICggISBpc19kaXIoIFdQTVVfUExVR0lOX0RJUiApICkgewoJCXJldHVybiAkbXVfcGx1Z2luczsKCX0KCgkkZGggPSBvcGVuZGlyKCBXUE1VX1BMVUdJTl9ESVIgKTsKCWlmICggISAkZGggKSB7CgkJcmV0dXJuICRtdV9wbHVnaW5zOwoJfQoKCXdoaWxlICggKCAkcGx1Z2luID0gcmVhZGRpciggJGRoICkgKSAhPT0gZmFsc2UgKSB7CgkJaWYgKCBzdHJfZW5kc193aXRoKCAkcGx1Z2luLCAnLnBocCcgKSApIHsKCQkJJG11X3BsdWdpbnNbXSA9IFdQTVVfUExVR0lOX0RJUiAuICcvJyAuICRwbHVnaW47CgkJfQoJfQoKCWNsb3NlZGlyKCAkZGggKTsKCglzb3J0KCAkbXVfcGx1Z2lucyApOwoKCXJldHVybiAkbXVfcGx1Z2luczsKfQoKLyoqCiAqIFJldHJpZXZlcyBhbiBhcnJheSBvZiBhY3RpdmUgYW5kIHZhbGlkIHBsdWdpbiBmaWxlcy4KICoKICogV2hpbGUgdXBncmFkaW5nIG9yIGluc3RhbGxpbmcgV29yZFByZXNzLCBubyBwbHVnaW5zIGFyZSByZXR1cm5lZC4KICoKICogVGhlIGRlZmF1bHQgZGlyZWN0b3J5IGlzIGB3cC1jb250ZW50L3BsdWdpbnNgLiBUbyBjaGFuZ2UgdGhlIGRlZmF1bHQKICogZGlyZWN0b3J5IG1hbnVhbGx5LCBkZWZpbmUgYFdQX1BMVUdJTl9ESVJgIGFuZCBgV1BfUExVR0lOX1VSTGAKICogaW4gYHdwLWNvbmZpZy5waHBgLgogKgogKiBAc2luY2UgMy4wLjAKICogQGFjY2VzcyBwcml2YXRlCiAqCiAqIEByZXR1cm4gc3RyaW5nW10gQXJyYXkgb2YgcGF0aHMgdG8gcGx1Z2luIGZpbGVzIHJlbGF0aXZlIHRvIHRoZSBwbHVnaW5zIGRpcmVjdG9yeS4KICovCmZ1bmN0aW9uIHdwX2dldF9hY3RpdmVfYW5kX3ZhbGlkX3BsdWdpbnMoKSB7CgkkcGx1Z2lucyAgICAgICAgPSBhcnJheSgpOwoJJGFjdGl2ZV9wbHVnaW5zID0gKGFycmF5KSBnZXRfb3B0aW9uKCAnYWN0aXZlX3BsdWdpbnMnLCBhcnJheSgpICk7CgoJLy8gQ2hlY2sgZm9yIGhhY2tzIGZpbGUgaWYgdGhlIG9wdGlvbiBpcyBlbmFibGVkLgoJaWYgKCBnZXRfb3B0aW9uKCAnaGFja19maWxlJyApICYmIGZpbGVfZXhpc3RzKCBBQlNQQVRIIC4gJ215LWhhY2tzLnBocCcgKSApIHsKCQlfZGVwcmVjYXRlZF9maWxlKCAnbXktaGFja3MucGhwJywgJzEuNS4wJyApOwoJCWFycmF5X3Vuc2hpZnQoICRwbHVnaW5zLCBBQlNQQVRIIC4gJ215LWhhY2tzLnBocCcgKTsKCX0KCglpZiAoIGVtcHR5KCAkYWN0aXZlX3BsdWdpbnMgKSB8fCB3cF9pbnN0YWxsaW5nKCkgKSB7CgkJcmV0dXJuICRwbHVnaW5zOwoJfQoKCSRuZXR3b3JrX3BsdWdpbnMgPSBpc19tdWx0aXNpdGUoKSA/IHdwX2dldF9hY3RpdmVfbmV0d29ya19wbHVnaW5zKCkgOiBmYWxzZTsKCglmb3JlYWNoICggJGFjdGl2ZV9wbHVnaW5zIGFzICRwbHVnaW4gKSB7CgkJaWYgKCAhIHZhbGlkYXRlX2ZpbGUoICRwbHVnaW4gKSAgICAgICAgICAgICAgICAgICAgIC8vICRwbHVnaW4gbXVzdCB2YWxpZGF0ZSBhcyBmaWxlLgoJCQkmJiBzdHJfZW5kc193aXRoKCAkcGx1Z2luLCAnLnBocCcgKSAgICAgICAgICAgICAvLyAkcGx1Z2luIG11c3QgZW5kIHdpdGggJy5waHAnLgoJCQkmJiBmaWxlX2V4aXN0cyggV1BfUExVR0lOX0RJUiAuICcvJyAuICRwbHVnaW4gKSAvLyAkcGx1Z2luIG11c3QgZXhpc3QuCgkJCS8vIE5vdCBhbHJlYWR5IGluY2x1ZGVkIGFzIGEgbmV0d29yayBwbHVnaW4uCgkJCSYmICggISAkbmV0d29ya19wbHVnaW5zIHx8ICEgaW5fYXJyYXkoIFdQX1BMVUdJTl9ESVIgLiAnLycgLiAkcGx1Z2luLCAkbmV0d29ya19wbHVnaW5zLCB0cnVlICkgKQoJCSkgewoJCQkkcGx1Z2luc1tdID0gV1BfUExVR0lOX0RJUiAuICcvJyAuICRwbHVnaW47CgkJfQoJfQoKCS8qCgkgKiBSZW1vdmUgcGx1Z2lucyBmcm9tIHRoZSBsaXN0IG9mIGFjdGl2ZSBwbHVnaW5zIHdoZW4gd2UncmUgb24gYW4gZW5kcG9pbnQKCSAqIHRoYXQgc2hvdWxkIGJlIHByb3RlY3RlZCBhZ2FpbnN0IFdTT0RzIGFuZCB0aGUgcGx1Z2luIGlzIHBhdXNlZC4KCSAqLwoJaWYgKCB3cF9pc19yZWNvdmVyeV9tb2RlKCkgKSB7CgkJJHBsdWdpbnMgPSB3cF9za2lwX3BhdXNlZF9wbHVnaW5zKCAkcGx1Z2lucyApOwoJfQoKCXJldHVybiAkcGx1Z2luczsKfQoKLyoqCiAqIEZpbHRlcnMgYSBnaXZlbiBsaXN0IG9mIHBsdWdpbnMsIHJlbW92aW5nIGFueSBwYXVzZWQgcGx1Z2lucyBmcm9tIGl0LgogKgogKiBAc2luY2UgNS4yLjAKICoKICogQGdsb2JhbCBXUF9QYXVzZWRfRXh0ZW5zaW9uc19TdG9yYWdlICRfcGF1c2VkX3BsdWdpbnMKICoKICogQHBhcmFtIHN0cmluZ1tdICRwbHVnaW5zIEFycmF5IG9mIGFic29sdXRlIHBsdWdpbiBtYWluIGZpbGUgcGF0aHMuCiAqIEByZXR1cm4gc3RyaW5nW10gRmlsdGVyZWQgYXJyYXkgb2YgcGx1Z2lucywgd2l0aG91dCBhbnkgcGF1c2VkIHBsdWdpbnMuCiAqLwpmdW5jdGlvbiB3cF9za2lwX3BhdXNlZF9wbHVnaW5zKCBhcnJheSAkcGx1Z2lucyApIHsKCSRwYXVzZWRfcGx1Z2lucyA9IHdwX3BhdXNlZF9wbHVnaW5zKCktPmdldF9hbGwoKTsKCglpZiAoIGVtcHR5KCAkcGF1c2VkX3BsdWdpbnMgKSApIHsKCQlyZXR1cm4gJHBsdWdpbnM7Cgl9CgoJZm9yZWFjaCAoICRwbHVnaW5zIGFzICRpbmRleCA9PiAkcGx1Z2luICkgewoJCWxpc3QoICRwbHVnaW4gKSA9IGV4cGxvZGUoICcvJywgcGx1Z2luX2Jhc2VuYW1lKCAkcGx1Z2luICkgKTsKCgkJaWYgKCBhcnJheV9rZXlfZXhpc3RzKCAkcGx1Z2luLCAkcGF1c2VkX3BsdWdpbnMgKSApIHsKCQkJdW5zZXQoICRwbHVnaW5zWyAkaW5kZXggXSApOwoKCQkJLy8gU3RvcmUgbGlzdCBvZiBwYXVzZWQgcGx1Z2lucyBmb3IgZGlzcGxheWluZyBhbiBhZG1pbiBub3RpY2UuCgkJCSRHTE9CQUxTWydfcGF1c2VkX3BsdWdpbnMnXVsgJHBsdWdpbiBdID0gJHBhdXNlZF9wbHVnaW5zWyAkcGx1Z2luIF07CgkJfQoJfQoKCXJldHVybiAkcGx1Z2luczsKfQoKLyoqCiAqIFJldHJpZXZlcyBhbiBhcnJheSBvZiBhY3RpdmUgYW5kIHZhbGlkIHRoZW1lcy4KICoKICogV2hpbGUgdXBncmFkaW5nIG9yIGluc3RhbGxpbmcgV29yZFByZXNzLCBubyB0aGVtZXMgYXJlIHJldHVybmVkLgogKgogKiBAc2luY2UgNS4xLjAKICogQGFjY2VzcyBwcml2YXRlCiAqCiAqIEBnbG9iYWwgc3RyaW5nICRwYWdlbm93ICAgICAgICAgICAgVGhlIGZpbGVuYW1lIG9mIHRoZSBjdXJyZW50IHNjcmVlbi4KICogQGdsb2JhbCBzdHJpbmcgJHdwX3N0eWxlc2hlZXRfcGF0aCBQYXRoIHRvIGN1cnJlbnQgdGhlbWUncyBzdHlsZXNoZWV0IGRpcmVjdG9yeS4KICogQGdsb2JhbCBzdHJpbmcgJHdwX3RlbXBsYXRlX3BhdGggICBQYXRoIHRvIGN1cnJlbnQgdGhlbWUncyB0ZW1wbGF0ZSBkaXJlY3RvcnkuCiAqCiAqIEByZXR1cm4gc3RyaW5nW10gQXJyYXkgb2YgYWJzb2x1dGUgcGF0aHMgdG8gdGhlbWUgZGlyZWN0b3JpZXMuCiAqLwpmdW5jdGlvbiB3cF9nZXRfYWN0aXZlX2FuZF92YWxpZF90aGVtZXMoKSB7CglnbG9iYWwgJHBhZ2Vub3csICR3cF9zdHlsZXNoZWV0X3BhdGgsICR3cF90ZW1wbGF0ZV9wYXRoOwoKCSR0aGVtZXMgPSBhcnJheSgpOwoKCWlmICggd3BfaW5zdGFsbGluZygpICYmICd3cC1hY3RpdmF0ZS5waHAnICE9PSAkcGFnZW5vdyApIHsKCQlyZXR1cm4gJHRoZW1lczsKCX0KCglpZiAoIGlzX2NoaWxkX3RoZW1lKCkgKSB7CgkJJHRoZW1lc1tdID0gJHdwX3N0eWxlc2hlZXRfcGF0aDsKCX0KCgkkdGhlbWVzW10gPSAkd3BfdGVtcGxhdGVfcGF0aDsKCgkvKgoJICogUmVtb3ZlIHRoZW1lcyBmcm9tIHRoZSBsaXN0IG9mIGFjdGl2ZSB0aGVtZXMgd2hlbiB3ZSdyZSBvbiBhbiBlbmRwb2ludAoJICogdGhhdCBzaG91bGQgYmUgcHJvdGVjdGVkIGFnYWluc3QgV1NPRHMgYW5kIHRoZSB0aGVtZSBpcyBwYXVzZWQuCgkgKi8KCWlmICggd3BfaXNfcmVjb3ZlcnlfbW9kZSgpICkgewoJCSR0aGVtZXMgPSB3cF9za2lwX3BhdXNlZF90aGVtZXMoICR0aGVtZXMgKTsKCgkJLy8gSWYgbm8gYWN0aXZlIGFuZCB2YWxpZCB0aGVtZXMgZXhpc3QsIHNraXAgbG9hZGluZyB0aGVtZXMuCgkJaWYgKCBlbXB0eSggJHRoZW1lcyApICkgewoJCQlhZGRfZmlsdGVyKCAnd3BfdXNpbmdfdGhlbWVzJywgJ19fcmV0dXJuX2ZhbHNlJyApOwoJCX0KCX0KCglyZXR1cm4gJHRoZW1lczsKfQoKLyoqCiAqIEZpbHRlcnMgYSBnaXZlbiBsaXN0IG9mIHRoZW1lcywgcmVtb3ZpbmcgYW55IHBhdXNlZCB0aGVtZXMgZnJvbSBpdC4KICoKICogQHNpbmNlIDUuMi4wCiAqCiAqIEBnbG9iYWwgV1BfUGF1c2VkX0V4dGVuc2lvbnNfU3RvcmFnZSAkX3BhdXNlZF90aGVtZXMKICoKICogQHBhcmFtIHN0cmluZ1tdICR0aGVtZXMgQXJyYXkgb2YgYWJzb2x1dGUgdGhlbWUgZGlyZWN0b3J5IHBhdGhzLgogKiBAcmV0dXJuIHN0cmluZ1tdIEZpbHRlcmVkIGFycmF5IG9mIGFic29sdXRlIHBhdGhzIHRvIHRoZW1lcywgd2l0aG91dCBhbnkgcGF1c2VkIHRoZW1lcy4KICovCmZ1bmN0aW9uIHdwX3NraXBfcGF1c2VkX3RoZW1lcyggYXJyYXkgJHRoZW1lcyApIHsKCSRwYXVzZWRfdGhlbWVzID0gd3BfcGF1c2VkX3RoZW1lcygpLT5nZXRfYWxsKCk7CgoJaWYgKCBlbXB0eSggJHBhdXNlZF90aGVtZXMgKSApIHsKCQlyZXR1cm4gJHRoZW1lczsKCX0KCglmb3JlYWNoICggJHRoZW1lcyBhcyAkaW5kZXggPT4gJHRoZW1lICkgewoJCSR0aGVtZSA9IGJhc2VuYW1lKCAkdGhlbWUgKTsKCgkJaWYgKCBhcnJheV9rZXlfZXhpc3RzKCAkdGhlbWUsICRwYXVzZWRfdGhlbWVzICkgKSB7CgkJCXVuc2V0KCAkdGhlbWVzWyAkaW5kZXggXSApOwoKCQkJLy8gU3RvcmUgbGlzdCBvZiBwYXVzZWQgdGhlbWVzIGZvciBkaXNwbGF5aW5nIGFuIGFkbWluIG5vdGljZS4KCQkJJEdMT0JBTFNbJ19wYXVzZWRfdGhlbWVzJ11bICR0aGVtZSBdID0gJHBhdXNlZF90aGVtZXNbICR0aGVtZSBdOwoJCX0KCX0KCglyZXR1cm4gJHRoZW1lczsKfQoKLyoqCiAqIERldGVybWluZXMgd2hldGhlciBXb3JkUHJlc3MgaXMgaW4gUmVjb3ZlcnkgTW9kZS4KICoKICogSW4gdGhpcyBtb2RlLCBwbHVnaW5zIG9yIHRoZW1lcyB0aGF0IGNhdXNlIFdTT0RzIHdpbGwgYmUgcGF1c2VkLgogKgogKiBAc2luY2UgNS4yLjAKICoKICogQHJldHVybiBib29sCiAqLwpmdW5jdGlvbiB3cF9pc19yZWNvdmVyeV9tb2RlKCkgewoJcmV0dXJuIHdwX3JlY292ZXJ5X21vZGUoKS0+aXNfYWN0aXZlKCk7Cn0KCi8qKgogKiBEZXRlcm1pbmVzIHdoZXRoZXIgd2UgYXJlIGN1cnJlbnRseSBvbiBhbiBlbmRwb2ludCB0aGF0IHNob3VsZCBiZSBwcm90ZWN0ZWQgYWdhaW5zdCBXU09Ecy4KICoKICogQHNpbmNlIDUuMi4wCiAqCiAqIEBnbG9iYWwgc3RyaW5nICRwYWdlbm93IFRoZSBmaWxlbmFtZSBvZiB0aGUgY3VycmVudCBzY3JlZW4uCiAqCiAqIEByZXR1cm4gYm9vbCBUcnVlIGlmIHRoZSBjdXJyZW50IGVuZHBvaW50IHNob3VsZCBiZSBwcm90ZWN0ZWQuCiAqLwpmdW5jdGlvbiBpc19wcm90ZWN0ZWRfZW5kcG9pbnQoKSB7CgkvLyBQcm90ZWN0IGxvZ2luIHBhZ2VzLgoJaWYgKCBpc3NldCggJEdMT0JBTFNbJ3BhZ2Vub3cnXSApICYmICd3cC1sb2dpbi5waHAnID09PSAkR0xPQkFMU1sncGFnZW5vdyddICkgewoJCXJldHVybiB0cnVlOwoJfQoKCS8vIFByb3RlY3QgdGhlIGFkbWluIGJhY2tlbmQuCglpZiAoIGlzX2FkbWluKCkgJiYgISB3cF9kb2luZ19hamF4KCkgKSB7CgkJcmV0dXJuIHRydWU7Cgl9CgoJLy8gUHJvdGVjdCBBamF4IGFjdGlvbnMgdGhhdCBjb3VsZCBoZWxwIHJlc29sdmUgYSBmYXRhbCBlcnJvciBzaG91bGQgYmUgYXZhaWxhYmxlLgoJaWYgKCBpc19wcm90ZWN0ZWRfYWpheF9hY3Rpb24oKSApIHsKCQlyZXR1cm4gdHJ1ZTsKCX0KCgkvKioKCSAqIEZpbHRlcnMgd2hldGhlciB0aGUgY3VycmVudCByZXF1ZXN0IGlzIGFnYWluc3QgYSBwcm90ZWN0ZWQgZW5kcG9pbnQuCgkgKgoJICogVGhpcyBmaWx0ZXIgaXMgb25seSBmaXJlZCB3aGVuIGFuIGVuZHBvaW50IGlzIHJlcXVlc3RlZCB3aGljaCBpcyBub3QgYWxyZWFkeSBwcm90ZWN0ZWQgYnkKCSAqIFdvcmRQcmVzcyBjb3JlLiBBcyBzdWNoLCBpdCBleGNsdXNpdmVseSBhbGxvd3MgcHJvdmlkaW5nIGZ1cnRoZXIgcHJvdGVjdGVkIGVuZHBvaW50cyBpbgoJICogYWRkaXRpb24gdG8gdGhlIGFkbWluIGJhY2tlbmQsIGxvZ2luIHBhZ2VzIGFuZCBwcm90ZWN0ZWQgQWpheCBhY3Rpb25zLgoJICoKCSAqIEBzaW5jZSA1LjIuMAoJICoKCSAqIEBwYXJhbSBib29sICRpc19wcm90ZWN0ZWRfZW5kcG9pbnQgV2hldGhlciB0aGUgY3VycmVudGx5IHJlcXVlc3RlZCBlbmRwb2ludCBpcyBwcm90ZWN0ZWQuCgkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmF1bHQgZmFsc2UuCgkgKi8KCXJldHVybiAoYm9vbCkgYXBwbHlfZmlsdGVycyggJ2lzX3Byb3RlY3RlZF9lbmRwb2ludCcsIGZhbHNlICk7Cn0KCi8qKgogKiBEZXRlcm1pbmVzIHdoZXRoZXIgd2UgYXJlIGN1cnJlbnRseSBoYW5kbGluZyBhbiBBamF4IGFjdGlvbiB0aGF0IHNob3VsZCBiZSBwcm90ZWN0ZWQgYWdhaW5zdCBXU09Ecy4KICoKICogQHNpbmNlIDUuMi4wCiAqCiAqIEByZXR1cm4gYm9vbCBUcnVlIGlmIHRoZSBjdXJyZW50IEFqYXggYWN0aW9uIHNob3VsZCBiZSBwcm90ZWN0ZWQuCiAqLwpmdW5jdGlvbiBpc19wcm90ZWN0ZWRfYWpheF9hY3Rpb24oKSB7CglpZiAoICEgd3BfZG9pbmdfYWpheCgpICkgewoJCXJldHVybiBmYWxzZTsKCX0KCglpZiAoICEgaXNzZXQoICRfUkVRVUVTVFsnYWN0aW9uJ10gKSApIHsKCQlyZXR1cm4gZmFsc2U7Cgl9CgoJJGFjdGlvbnNfdG9fcHJvdGVjdCA9IGFycmF5KAoJCSdlZGl0LXRoZW1lLXBsdWdpbi1maWxlJywgLy8gU2F2aW5nIGNoYW5nZXMgaW4gdGhlIGNvcmUgY29kZSBlZGl0b3IuCgkJJ2hlYXJ0YmVhdCcsICAgICAgICAgICAgICAvLyBLZWVwIHRoZSBoZWFydCBiZWF0aW5nLgoJCSdpbnN0YWxsLXBsdWdpbicsICAgICAgICAgLy8gSW5zdGFsbGluZyBhIG5ldyBwbHVnaW4uCgkJJ2luc3RhbGwtdGhlbWUnLCAgICAgICAgICAvLyBJbnN0YWxsaW5nIGEgbmV3IHRoZW1lLgoJCSdzZWFyY2gtcGx1Z2lucycsICAgICAgICAgLy8gU2VhcmNoaW5nIGluIHRoZSBsaXN0IG9mIHBsdWdpbnMuCgkJJ3NlYXJjaC1pbnN0YWxsLXBsdWdpbnMnLCAvLyBTZWFyY2hpbmcgZm9yIGEgcGx1Z2luIGluIHRoZSBwbHVnaW4gaW5zdGFsbCBzY3JlZW4uCgkJJ3VwZGF0ZS1wbHVnaW4nLCAgICAgICAgICAvLyBVcGRhdGUgYW4gZXhpc3RpbmcgcGx1Z2luLgoJCSd1cGRhdGUtdGhlbWUnLCAgICAgICAgICAgLy8gVXBkYXRlIGFuIGV4aXN0aW5nIHRoZW1lLgoJCSdhY3RpdmF0ZS1wbHVnaW4nLCAgICAgICAgLy8gQWN0aXZhdGluZyBhbiBleGlzdGluZyBwbHVnaW4uCgkpOwoKCS8qKgoJICogRmlsdGVycyB0aGUgYXJyYXkgb2YgcHJvdGVjdGVkIEFqYXggYWN0aW9ucy4KCSAqCgkgKiBUaGlzIGZpbHRlciBpcyBvbmx5IGZpcmVkIHdoZW4gZG9pbmcgQWpheCBhbmQgdGhlIEFqYXggcmVxdWVzdCBoYXMgYW4gJ2FjdGlvbicgcHJvcGVydHkuCgkgKgoJICogQHNpbmNlIDUuMi4wCgkgKgoJICogQHBhcmFtIHN0cmluZ1tdICRhY3Rpb25zX3RvX3Byb3RlY3QgQXJyYXkgb2Ygc3RyaW5ncyB3aXRoIEFqYXggYWN0aW9ucyB0byBwcm90ZWN0LgoJICovCgkkYWN0aW9uc190b19wcm90ZWN0ID0gKGFycmF5KSBhcHBseV9maWx0ZXJzKCAnd3BfcHJvdGVjdGVkX2FqYXhfYWN0aW9ucycsICRhY3Rpb25zX3RvX3Byb3RlY3QgKTsKCglpZiAoICEgaW5fYXJyYXkoICRfUkVRVUVTVFsnYWN0aW9uJ10sICRhY3Rpb25zX3RvX3Byb3RlY3QsIHRydWUgKSApIHsKCQlyZXR1cm4gZmFsc2U7Cgl9CgoJcmV0dXJuIHRydWU7Cn0KCi8qKgogKiBTZXRzIGludGVybmFsIGVuY29kaW5nLgogKgogKiBJbiBtb3N0IGNhc2VzIHRoZSBkZWZhdWx0IGludGVybmFsIGVuY29kaW5nIGlzIGxhdGluMSwgd2hpY2ggaXMKICogb2Ygbm8gdXNlLCBzaW5jZSB3ZSB3YW50IHRvIHVzZSB0aGUgYG1iX2AgZnVuY3Rpb25zIGZvciBgdXRmLThgIHN0cmluZ3MuCiAqCiAqIEBzaW5jZSAzLjAuMAogKiBAYWNjZXNzIHByaXZhdGUKICovCmZ1bmN0aW9uIHdwX3NldF9pbnRlcm5hbF9lbmNvZGluZygpIHsKCWlmICggZnVuY3Rpb25fZXhpc3RzKCAnbWJfaW50ZXJuYWxfZW5jb2RpbmcnICkgKSB7CgkJJGNoYXJzZXQgPSBnZXRfb3B0aW9uKCAnYmxvZ19jaGFyc2V0JyApOwoJCS8vIHBocGNzOmlnbm9yZSBXb3JkUHJlc3MuUEhQLk5vU2lsZW5jZWRFcnJvcnMuRGlzY291cmFnZWQKCQlpZiAoICEgJGNoYXJzZXQgfHwgISBAbWJfaW50ZXJuYWxfZW5jb2RpbmcoICRjaGFyc2V0ICkgKSB7CgkJCW1iX2ludGVybmFsX2VuY29kaW5nKCAnVVRGLTgnICk7CgkJfQoJfQp9CgovKioKICogQWRkcyBtYWdpYyBxdW90ZXMgdG8gYCRfR0VUYCwgYCRfUE9TVGAsIGAkX0NPT0tJRWAsIGFuZCBgJF9TRVJWRVJgLgogKgogKiBBbHNvIGZvcmNlcyBgJF9SRVFVRVNUYCB0byBiZSBgJF9HRVQgKyAkX1BPU1RgLiBJZiBgJF9TRVJWRVJgLAogKiBgJF9DT09LSUVgLCBvciBgJF9FTlZgIGFyZSBuZWVkZWQsIHVzZSB0aG9zZSBzdXBlcmdsb2JhbHMgZGlyZWN0bHkuCiAqCiAqIEBzaW5jZSAzLjAuMAogKiBAYWNjZXNzIHByaXZhdGUKICovCmZ1bmN0aW9uIHdwX21hZ2ljX3F1b3RlcygpIHsKCS8vIEVzY2FwZSB3aXRoIHdwZGIuCgkkX0dFVCAgICA9IGFkZF9tYWdpY19xdW90ZXMoICRfR0VUICk7CgkkX1BPU1QgICA9IGFkZF9tYWdpY19xdW90ZXMoICRfUE9TVCApOwoJJF9DT09LSUUgPSBhZGRfbWFnaWNfcXVvdGVzKCAkX0NPT0tJRSApOwoJJF9TRVJWRVIgPSBhZGRfbWFnaWNfcXVvdGVzKCAkX1NFUlZFUiApOwoKCS8vIEZvcmNlIFJFUVVFU1QgdG8gYmUgR0VUICsgUE9TVC4KCSRfUkVRVUVTVCA9IGFycmF5X21lcmdlKCAkX0dFVCwgJF9QT1NUICk7Cn0KCi8qKgogKiBSdW5zIGp1c3QgYmVmb3JlIFBIUCBzaHV0cyBkb3duIGV4ZWN1dGlvbi4KICoKICogQHNpbmNlIDEuMi4wCiAqIEBhY2Nlc3MgcHJpdmF0ZQogKi8KZnVuY3Rpb24gc2h1dGRvd25fYWN0aW9uX2hvb2soKSB7CgkvKioKCSAqIEZpcmVzIGp1c3QgYmVmb3JlIFBIUCBzaHV0cyBkb3duIGV4ZWN1dGlvbi4KCSAqCgkgKiBAc2luY2UgMS4yLjAKCSAqLwoJZG9fYWN0aW9uKCAnc2h1dGRvd24nICk7CgoJd3BfY2FjaGVfY2xvc2UoKTsKfQoKLyoqCiAqIENsb25lcyBhbiBvYmplY3QuCiAqCiAqIEBzaW5jZSAyLjcuMAogKiBAZGVwcmVjYXRlZCAzLjIuMAogKgogKiBAcGFyYW0gb2JqZWN0ICRpbnB1dF9vYmplY3QgVGhlIG9iamVjdCB0byBjbG9uZS4KICogQHJldHVybiBvYmplY3QgVGhlIGNsb25lZCBvYmplY3QuCiAqLwpmdW5jdGlvbiB3cF9jbG9uZSggJGlucHV0X29iamVjdCApIHsKCS8vIFVzZSBwYXJlbnMgZm9yIGNsb25lIHRvIGFjY29tbW9kYXRlIFBIUCA0LiBTZWUgIzE3ODgwLgoJcmV0dXJuIGNsb25lKCAkaW5wdXRfb2JqZWN0ICk7Cn0KCi8qKgogKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGN1cnJlbnQgcmVxdWVzdCBpcyBmb3IgdGhlIGxvZ2luIHNjcmVlbi4KICoKICogQHNpbmNlIDYuMS4wCiAqCiAqIEBzZWUgd3BfbG9naW5fdXJsKCkKICoKICogQHJldHVybiBib29sIFRydWUgaWYgaW5zaWRlIFdvcmRQcmVzcyBsb2dpbiBzY3JlZW4sIGZhbHNlIG90aGVyd2lzZS4KICovCmZ1bmN0aW9uIGlzX2xvZ2luKCkgewoJcmV0dXJuIGZhbHNlICE9PSBzdHJpcG9zKCB3cF9sb2dpbl91cmwoKSwgJF9TRVJWRVJbJ1NDUklQVF9OQU1FJ10gKTsKfQoKLyoqCiAqIERldGVybWluZXMgd2hldGhlciB0aGUgY3VycmVudCByZXF1ZXN0IGlzIGZvciBhbiBhZG1pbmlzdHJhdGl2ZSBpbnRlcmZhY2UgcGFnZS4KICoKICogRG9lcyBub3QgY2hlY2sgaWYgdGhlIHVzZXIgaXMgYW4gYWRtaW5pc3RyYXRvcjsgdXNlIGN1cnJlbnRfdXNlcl9jYW4oKQogKiBmb3IgY2hlY2tpbmcgcm9sZXMgYW5kIGNhcGFiaWxpdGllcy4KICoKICogRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhpcyBhbmQgc2ltaWxhciB0aGVtZSBmdW5jdGlvbnMsIGNoZWNrIG91dAogKiB0aGUge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLndvcmRwcmVzcy5vcmcvdGhlbWVzL2Jhc2ljcy9jb25kaXRpb25hbC10YWdzLwogKiBDb25kaXRpb25hbCBUYWdzfSBhcnRpY2xlIGluIHRoZSBUaGVtZSBEZXZlbG9wZXIgSGFuZGJvb2suCiAqCiAqIEBzaW5jZSAxLjUuMQogKgogKiBAZ2xvYmFsIFdQX1NjcmVlbiAkY3VycmVudF9zY3JlZW4gV29yZFByZXNzIGN1cnJlbnQgc2NyZWVuIG9iamVjdC4KICoKICogQHJldHVybiBib29sIFRydWUgaWYgaW5zaWRlIFdvcmRQcmVzcyBhZG1pbmlzdHJhdGlvbiBpbnRlcmZhY2UsIGZhbHNlIG90aGVyd2lzZS4KICovCmZ1bmN0aW9uIGlzX2FkbWluKCkgewoJaWYgKCBpc3NldCggJEdMT0JBTFNbJ2N1cnJlbnRfc2NyZWVuJ10gKSApIHsKCQlyZXR1cm4gJEdMT0JBTFNbJ2N1cnJlbnRfc2NyZWVuJ10tPmluX2FkbWluKCk7Cgl9IGVsc2VpZiAoIGRlZmluZWQoICdXUF9BRE1JTicgKSApIHsKCQlyZXR1cm4gV1BfQURNSU47Cgl9CgoJcmV0dXJuIGZhbHNlOwp9CgovKioKICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBjdXJyZW50IHJlcXVlc3QgaXMgZm9yIGEgc2l0ZSdzIGFkbWluaXN0cmF0aXZlIGludGVyZmFjZS4KICoKICogZS5nLiBgL3dwLWFkbWluL2AKICoKICogRG9lcyBub3QgY2hlY2sgaWYgdGhlIHVzZXIgaXMgYW4gYWRtaW5pc3RyYXRvcjsgdXNlIGN1cnJlbnRfdXNlcl9jYW4oKQogKiBmb3IgY2hlY2tpbmcgcm9sZXMgYW5kIGNhcGFiaWxpdGllcy4KICoKICogQHNpbmNlIDMuMS4wCiAqCiAqIEBnbG9iYWwgV1BfU2NyZWVuICRjdXJyZW50X3NjcmVlbiBXb3JkUHJlc3MgY3VycmVudCBzY3JlZW4gb2JqZWN0LgogKgogKiBAcmV0dXJuIGJvb2wgVHJ1ZSBpZiBpbnNpZGUgV29yZFByZXNzIHNpdGUgYWRtaW5pc3RyYXRpb24gcGFnZXMuCiAqLwpmdW5jdGlvbiBpc19ibG9nX2FkbWluKCkgewoJaWYgKCBpc3NldCggJEdMT0JBTFNbJ2N1cnJlbnRfc2NyZWVuJ10gKSApIHsKCQlyZXR1cm4gJEdMT0JBTFNbJ2N1cnJlbnRfc2NyZWVuJ10tPmluX2FkbWluKCAnc2l0ZScgKTsKCX0gZWxzZWlmICggZGVmaW5lZCggJ1dQX0JMT0dfQURNSU4nICkgKSB7CgkJcmV0dXJuIFdQX0JMT0dfQURNSU47Cgl9CgoJcmV0dXJuIGZhbHNlOwp9CgovKioKICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBjdXJyZW50IHJlcXVlc3QgaXMgZm9yIHRoZSBuZXR3b3JrIGFkbWluaXN0cmF0aXZlIGludGVyZmFjZS4KICoKICogZS5nLiBgL3dwLWFkbWluL25ldHdvcmsvYAogKgogKiBEb2VzIG5vdCBjaGVjayBpZiB0aGUgdXNlciBpcyBhbiBhZG1pbmlzdHJhdG9yOyB1c2UgY3VycmVudF91c2VyX2NhbigpCiAqIGZvciBjaGVja2luZyByb2xlcyBhbmQgY2FwYWJpbGl0aWVzLgogKgogKiBEb2VzIG5vdCBjaGVjayBpZiB0aGUgc2l0ZSBpcyBhIE11bHRpc2l0ZSBuZXR3b3JrOyB1c2UgaXNfbXVsdGlzaXRlKCkKICogZm9yIGNoZWNraW5nIGlmIE11bHRpc2l0ZSBpcyBlbmFibGVkLgogKgogKiBAc2luY2UgMy4xLjAKICoKICogQGdsb2JhbCBXUF9TY3JlZW4gJGN1cnJlbnRfc2NyZWVuIFdvcmRQcmVzcyBjdXJyZW50IHNjcmVlbiBvYmplY3QuCiAqCiAqIEByZXR1cm4gYm9vbCBUcnVlIGlmIGluc2lkZSBXb3JkUHJlc3MgbmV0d29yayBhZG1pbmlzdHJhdGlvbiBwYWdlcy4KICovCmZ1bmN0aW9uIGlzX25ldHdvcmtfYWRtaW4oKSB7CglpZiAoIGlzc2V0KCAkR0xPQkFMU1snY3VycmVudF9zY3JlZW4nXSApICkgewoJCXJldHVybiAkR0xPQkFMU1snY3VycmVudF9zY3JlZW4nXS0+aW5fYWRtaW4oICduZXR3b3JrJyApOwoJfSBlbHNlaWYgKCBkZWZpbmVkKCAnV1BfTkVUV09SS19BRE1JTicgKSApIHsKCQlyZXR1cm4gV1BfTkVUV09SS19BRE1JTjsKCX0KCglyZXR1cm4gZmFsc2U7Cn0KCi8qKgogKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGN1cnJlbnQgcmVxdWVzdCBpcyBmb3IgYSB1c2VyIGFkbWluIHNjcmVlbi4KICoKICogZS5nLiBgL3dwLWFkbWluL3VzZXIvYAogKgogKiBEb2VzIG5vdCBjaGVjayBpZiB0aGUgdXNlciBpcyBhbiBhZG1pbmlzdHJhdG9yOyB1c2UgY3VycmVudF91c2VyX2NhbigpCiAqIGZvciBjaGVja2luZyByb2xlcyBhbmQgY2FwYWJpbGl0aWVzLgogKgogKiBAc2luY2UgMy4xLjAKICoKICogQGdsb2JhbCBXUF9TY3JlZW4gJGN1cnJlbnRfc2NyZWVuIFdvcmRQcmVzcyBjdXJyZW50IHNjcmVlbiBvYmplY3QuCiAqCiAqIEByZXR1cm4gYm9vbCBUcnVlIGlmIGluc2lkZSBXb3JkUHJlc3MgdXNlciBhZG1pbmlzdHJhdGlvbiBwYWdlcy4KICovCmZ1bmN0aW9uIGlzX3VzZXJfYWRtaW4oKSB7CglpZiAoIGlzc2V0KCAkR0xPQkFMU1snY3VycmVudF9zY3JlZW4nXSApICkgewoJCXJldHVybiAkR0xPQkFMU1snY3VycmVudF9zY3JlZW4nXS0+aW5fYWRtaW4oICd1c2VyJyApOwoJfSBlbHNlaWYgKCBkZWZpbmVkKCAnV1BfVVNFUl9BRE1JTicgKSApIHsKCQlyZXR1cm4gV1BfVVNFUl9BRE1JTjsKCX0KCglyZXR1cm4gZmFsc2U7Cn0KCi8qKgogKiBEZXRlcm1pbmVzIHdoZXRoZXIgTXVsdGlzaXRlIGlzIGVuYWJsZWQuCiAqCiAqIEBzaW5jZSAzLjAuMAogKgogKiBAcmV0dXJuIGJvb2wgVHJ1ZSBpZiBNdWx0aXNpdGUgaXMgZW5hYmxlZCwgZmFsc2Ugb3RoZXJ3aXNlLgogKi8KZnVuY3Rpb24gaXNfbXVsdGlzaXRlKCkgewoJaWYgKCBkZWZpbmVkKCAnTVVMVElTSVRFJyApICkgewoJCXJldHVybiBNVUxUSVNJVEU7Cgl9CgoJaWYgKCBkZWZpbmVkKCAnU1VCRE9NQUlOX0lOU1RBTEwnICkgfHwgZGVmaW5lZCggJ1ZIT1NUJyApIHx8IGRlZmluZWQoICdTVU5SSVNFJyApICkgewoJCXJldHVybiB0cnVlOwoJfQoKCXJldHVybiBmYWxzZTsKfQoKLyoqCiAqIENvbnZlcnRzIGEgdmFsdWUgdG8gbm9uLW5lZ2F0aXZlIGludGVnZXIuCiAqCiAqIEBzaW5jZSAyLjUuMAogKgogKiBAcGFyYW0gbWl4ZWQgJG1heWJlaW50IERhdGEgeW91IHdpc2ggdG8gaGF2ZSBjb252ZXJ0ZWQgdG8gYSBub24tbmVnYXRpdmUgaW50ZWdlci4KICogQHJldHVybiBpbnQgQSBub24tbmVnYXRpdmUgaW50ZWdlci4KICovCmZ1bmN0aW9uIGFic2ludCggJG1heWJlaW50ICkgewoJcmV0dXJuIGFicyggKGludCkgJG1heWJlaW50ICk7Cn0KCi8qKgogKiBSZXRyaWV2ZXMgdGhlIGN1cnJlbnQgc2l0ZSBJRC4KICoKICogQHNpbmNlIDMuMS4wCiAqCiAqIEBnbG9iYWwgaW50ICRibG9nX2lkCiAqCiAqIEByZXR1cm4gaW50IFNpdGUgSUQuCiAqLwpmdW5jdGlvbiBnZXRfY3VycmVudF9ibG9nX2lkKCkgewoJZ2xvYmFsICRibG9nX2lkOwoKCXJldHVybiBhYnNpbnQoICRibG9nX2lkICk7Cn0KCi8qKgogKiBSZXRyaWV2ZXMgdGhlIGN1cnJlbnQgbmV0d29yayBJRC4KICoKICogQHNpbmNlIDQuNi4wCiAqCiAqIEByZXR1cm4gaW50IFRoZSBJRCBvZiB0aGUgY3VycmVudCBuZXR3b3JrLgogKi8KZnVuY3Rpb24gZ2V0X2N1cnJlbnRfbmV0d29ya19pZCgpIHsKCWlmICggISBpc19tdWx0aXNpdGUoKSApIHsKCQlyZXR1cm4gMTsKCX0KCgkkY3VycmVudF9uZXR3b3JrID0gZ2V0X25ldHdvcmsoKTsKCglpZiAoICEgaXNzZXQoICRjdXJyZW50X25ldHdvcmstPmlkICkgKSB7CgkJcmV0dXJuIGdldF9tYWluX25ldHdvcmtfaWQoKTsKCX0KCglyZXR1cm4gYWJzaW50KCAkY3VycmVudF9uZXR3b3JrLT5pZCApOwp9CgovKioKICogQXR0ZW1wdHMgYW4gZWFybHkgbG9hZCBvZiB0cmFuc2xhdGlvbnMuCiAqCiAqIFVzZWQgZm9yIGVycm9ycyBlbmNvdW50ZXJlZCBkdXJpbmcgdGhlIGluaXRpYWwgbG9hZGluZyBwcm9jZXNzLCBiZWZvcmUKICogdGhlIGxvY2FsZSBoYXMgYmVlbiBwcm9wZXJseSBkZXRlY3RlZCBhbmQgbG9hZGVkLgogKgogKiBEZXNpZ25lZCBmb3IgdW51c3VhbCBsb2FkIHNlcXVlbmNlcyAobGlrZSBzZXR1cC1jb25maWcucGhwKSBvciBmb3Igd2hlbgogKiB0aGUgc2NyaXB0IHdpbGwgdGhlbiB0ZXJtaW5hdGUgd2l0aCBhbiBlcnJvciwgb3RoZXJ3aXNlIHRoZXJlIGlzIGEgcmlzawogKiB0aGF0IGEgZmlsZSBjYW4gYmUgZG91YmxlLWluY2x1ZGVkLgogKgogKiBAc2luY2UgMy40LjAKICogQGFjY2VzcyBwcml2YXRlCiAqCiAqIEBnbG9iYWwgV1BfVGV4dGRvbWFpbl9SZWdpc3RyeSAkd3BfdGV4dGRvbWFpbl9yZWdpc3RyeSBXb3JkUHJlc3MgVGV4dGRvbWFpbiBSZWdpc3RyeS4KICogQGdsb2JhbCBXUF9Mb2NhbGUgICAgICAgICAgICAgICR3cF9sb2NhbGUgICAgICAgICAgICAgIFdvcmRQcmVzcyBkYXRlIGFuZCB0aW1lIGxvY2FsZSBvYmplY3QuCiAqLwpmdW5jdGlvbiB3cF9sb2FkX3RyYW5zbGF0aW9uc19lYXJseSgpIHsKCWdsb2JhbCAkd3BfdGV4dGRvbWFpbl9yZWdpc3RyeSwgJHdwX2xvY2FsZTsKCXN0YXRpYyAkbG9hZGVkID0gZmFsc2U7CgoJaWYgKCAkbG9hZGVkICkgewoJCXJldHVybjsKCX0KCgkkbG9hZGVkID0gdHJ1ZTsKCglpZiAoIGZ1bmN0aW9uX2V4aXN0cyggJ2RpZF9hY3Rpb24nICkgJiYgZGlkX2FjdGlvbiggJ2luaXQnICkgKSB7CgkJcmV0dXJuOwoJfQoKCS8vIFdlIG5lZWQgJHdwX2xvY2FsX3BhY2thZ2UuCglyZXF1aXJlIEFCU1BBVEggLiBXUElOQyAuICcvdmVyc2lvbi5waHAnOwoKCS8vIFRyYW5zbGF0aW9uIGFuZCBsb2NhbGl6YXRpb24uCglyZXF1aXJlX29uY2UgQUJTUEFUSCAuIFdQSU5DIC4gJy9wb21vL21vLnBocCc7CglyZXF1aXJlX29uY2UgQUJTUEFUSCAuIFdQSU5DIC4gJy9sMTBuL2NsYXNzLXdwLXRyYW5zbGF0aW9uLWNvbnRyb2xsZXIucGhwJzsKCXJlcXVpcmVfb25jZSBBQlNQQVRIIC4gV1BJTkMgLiAnL2wxMG4vY2xhc3Mtd3AtdHJhbnNsYXRpb25zLnBocCc7CglyZXF1aXJlX29uY2UgQUJTUEFUSCAuIFdQSU5DIC4gJy9sMTBuL2NsYXNzLXdwLXRyYW5zbGF0aW9uLWZpbGUucGhwJzsKCXJlcXVpcmVfb25jZSBBQlNQQVRIIC4gV1BJTkMgLiAnL2wxMG4vY2xhc3Mtd3AtdHJhbnNsYXRpb24tZmlsZS1tby5waHAnOwoJcmVxdWlyZV9vbmNlIEFCU1BBVEggLiBXUElOQyAuICcvbDEwbi9jbGFzcy13cC10cmFuc2xhdGlvbi1maWxlLXBocC5waHAnOwoJcmVxdWlyZV9vbmNlIEFCU1BBVEggLiBXUElOQyAuICcvbDEwbi5waHAnOwoJcmVxdWlyZV9vbmNlIEFCU1BBVEggLiBXUElOQyAuICcvY2xhc3Mtd3AtdGV4dGRvbWFpbi1yZWdpc3RyeS5waHAnOwoJcmVxdWlyZV9vbmNlIEFCU1BBVEggLiBXUElOQyAuICcvY2xhc3Mtd3AtbG9jYWxlLnBocCc7CglyZXF1aXJlX29uY2UgQUJTUEFUSCAuIFdQSU5DIC4gJy9jbGFzcy13cC1sb2NhbGUtc3dpdGNoZXIucGhwJzsKCgkvLyBHZW5lcmFsIGxpYnJhcmllcy4KCXJlcXVpcmVfb25jZSBBQlNQQVRIIC4gV1BJTkMgLiAnL3BsdWdpbi5waHAnOwoKCSRsb2NhbGVzICAgPSBhcnJheSgpOwoJJGxvY2F0aW9ucyA9IGFycmF5KCk7CgoJaWYgKCAhICR3cF90ZXh0ZG9tYWluX3JlZ2lzdHJ5IGluc3RhbmNlb2YgV1BfVGV4dGRvbWFpbl9SZWdpc3RyeSApIHsKCQkkd3BfdGV4dGRvbWFpbl9yZWdpc3RyeSA9IG5ldyBXUF9UZXh0ZG9tYWluX1JlZ2lzdHJ5KCk7Cgl9CgoJd2hpbGUgKCB0cnVlICkgewoJCWlmICggZGVmaW5lZCggJ1dQTEFORycgKSApIHsKCQkJaWYgKCAnJyA9PT0gV1BMQU5HICkgewoJCQkJYnJlYWs7CgkJCX0KCQkJJGxvY2FsZXNbXSA9IFdQTEFORzsKCQl9CgoJCWlmICggaXNzZXQoICR3cF9sb2NhbF9wYWNrYWdlICkgKSB7CgkJCSRsb2NhbGVzW10gPSAkd3BfbG9jYWxfcGFja2FnZTsKCQl9CgoJCWlmICggISAkbG9jYWxlcyApIHsKCQkJYnJlYWs7CgkJfQoKCQlpZiAoIGRlZmluZWQoICdXUF9MQU5HX0RJUicgKSAmJiBAaXNfZGlyKCBXUF9MQU5HX0RJUiApICkgewoJCQkkbG9jYXRpb25zW10gPSBXUF9MQU5HX0RJUjsKCQl9CgoJCWlmICggZGVmaW5lZCggJ1dQX0NPTlRFTlRfRElSJyApICYmIEBpc19kaXIoIFdQX0NPTlRFTlRfRElSIC4gJy9sYW5ndWFnZXMnICkgKSB7CgkJCSRsb2NhdGlvbnNbXSA9IFdQX0NPTlRFTlRfRElSIC4gJy9sYW5ndWFnZXMnOwoJCX0KCgkJaWYgKCBAaXNfZGlyKCBBQlNQQVRIIC4gJ3dwLWNvbnRlbnQvbGFuZ3VhZ2VzJyApICkgewoJCQkkbG9jYXRpb25zW10gPSBBQlNQQVRIIC4gJ3dwLWNvbnRlbnQvbGFuZ3VhZ2VzJzsKCQl9CgoJCWlmICggQGlzX2RpciggQUJTUEFUSCAuIFdQSU5DIC4gJy9sYW5ndWFnZXMnICkgKSB7CgkJCSRsb2NhdGlvbnNbXSA9IEFCU1BBVEggLiBXUElOQyAuICcvbGFuZ3VhZ2VzJzsKCQl9CgoJCWlmICggISAkbG9jYXRpb25zICkgewoJCQlicmVhazsKCQl9CgoJCSRsb2NhdGlvbnMgPSBhcnJheV91bmlxdWUoICRsb2NhdGlvbnMgKTsKCgkJZm9yZWFjaCAoICRsb2NhbGVzIGFzICRsb2NhbGUgKSB7CgkJCWZvcmVhY2ggKCAkbG9jYXRpb25zIGFzICRsb2NhdGlvbiApIHsKCQkJCWlmICggZmlsZV9leGlzdHMoICRsb2NhdGlvbiAuICcvJyAuICRsb2NhbGUgLiAnLm1vJyApICkgewoJCQkJCWxvYWRfdGV4dGRvbWFpbiggJ2RlZmF1bHQnLCAkbG9jYXRpb24gLiAnLycgLiAkbG9jYWxlIC4gJy5tbycsICRsb2NhbGUgKTsKCgkJCQkJaWYgKCBkZWZpbmVkKCAnV1BfU0VUVVBfQ09ORklHJyApICYmIGZpbGVfZXhpc3RzKCAkbG9jYXRpb24gLiAnL2FkbWluLScgLiAkbG9jYWxlIC4gJy5tbycgKSApIHsKCQkJCQkJbG9hZF90ZXh0ZG9tYWluKCAnZGVmYXVsdCcsICRsb2NhdGlvbiAuICcvYWRtaW4tJyAuICRsb2NhbGUgLiAnLm1vJywgJGxvY2FsZSApOwoJCQkJCX0KCgkJCQkJYnJlYWsgMjsKCQkJCX0KCQkJfQoJCX0KCgkJYnJlYWs7Cgl9CgoJJHdwX2xvY2FsZSA9IG5ldyBXUF9Mb2NhbGUoKTsKfQoKLyoqCiAqIENoZWNrcyBvciBzZXRzIHdoZXRoZXIgV29yZFByZXNzIGlzIGluICJpbnN0YWxsYXRpb24iIG1vZGUuCiAqCiAqIElmIHRoZSBgV1BfSU5TVEFMTElOR2AgY29uc3RhbnQgaXMgZGVmaW5lZCBkdXJpbmcgdGhlIGJvb3RzdHJhcCwgYHdwX2luc3RhbGxpbmcoKWAgd2lsbCBkZWZhdWx0IHRvIGB0cnVlYC4KICoKICogQHNpbmNlIDQuNC4wCiAqCiAqIEBwYXJhbSBib29sICRpc19pbnN0YWxsaW5nIE9wdGlvbmFsLiBUcnVlIHRvIHNldCBXUCBpbnRvIEluc3RhbGxpbmcgbW9kZSwgZmFsc2UgdG8gdHVybiBJbnN0YWxsaW5nIG1vZGUgb2ZmLgogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPbWl0IHRoaXMgcGFyYW1ldGVyIGlmIHlvdSBvbmx5IHdhbnQgdG8gZmV0Y2ggdGhlIGN1cnJlbnQgc3RhdHVzLgogKiBAcmV0dXJuIGJvb2wgVHJ1ZSBpZiBXUCBpcyBpbnN0YWxsaW5nLCBvdGhlcndpc2UgZmFsc2UuIFdoZW4gYSBgJGlzX2luc3RhbGxpbmdgIGlzIHBhc3NlZCwgdGhlIGZ1bmN0aW9uIHdpbGwKICogICAgICAgICAgICAgIHJlcG9ydCB3aGV0aGVyIFdQIHdhcyBpbiBpbnN0YWxsaW5nIG1vZGUgcHJpb3IgdG8gdGhlIGNoYW5nZSB0byBgJGlzX2luc3RhbGxpbmdgLgogKi8KZnVuY3Rpb24gd3BfaW5zdGFsbGluZyggJGlzX2luc3RhbGxpbmcgPSBudWxsICkgewoJc3RhdGljICRpbnN0YWxsaW5nID0gbnVsbDsKCgkvLyBTdXBwb3J0IGZvciB0aGUgYFdQX0lOU1RBTExJTkdgIGNvbnN0YW50LCBkZWZpbmVkIGJlZm9yZSBXUCBpcyBsb2FkZWQuCglpZiAoIGlzX251bGwoICRpbnN0YWxsaW5nICkgKSB7CgkJJGluc3RhbGxpbmcgPSBkZWZpbmVkKCAnV1BfSU5TVEFMTElORycgKSAmJiBXUF9JTlNUQUxMSU5HOwoJfQoKCWlmICggISBpc19udWxsKCAkaXNfaW5zdGFsbGluZyApICkgewoJCSRvbGRfaW5zdGFsbGluZyA9ICRpbnN0YWxsaW5nOwoJCSRpbnN0YWxsaW5nICAgICA9ICRpc19pbnN0YWxsaW5nOwoKCQlyZXR1cm4gKGJvb2wpICRvbGRfaW5zdGFsbGluZzsKCX0KCglyZXR1cm4gKGJvb2wpICRpbnN0YWxsaW5nOwp9CgovKioKICogRGV0ZXJtaW5lcyBpZiBTU0wgaXMgdXNlZC4KICoKICogQHNpbmNlIDIuNi4wCiAqIEBzaW5jZSA0LjYuMCBNb3ZlZCBmcm9tIGZ1bmN0aW9ucy5waHAgdG8gbG9hZC5waHAuCiAqCiAqIEByZXR1cm4gYm9vbCBUcnVlIGlmIFNTTCwgb3RoZXJ3aXNlIGZhbHNlLgogKi8KZnVuY3Rpb24gaXNfc3NsKCkgewoJaWYgKCBpc3NldCggJF9TRVJWRVJbJ0hUVFBTJ10gKSApIHsKCQlpZiAoICdvbicgPT09IHN0cnRvbG93ZXIoICRfU0VSVkVSWydIVFRQUyddICkgKSB7CgkJCXJldHVybiB0cnVlOwoJCX0KCgkJaWYgKCAnMScgPT09IChzdHJpbmcpICRfU0VSVkVSWydIVFRQUyddICkgewoJCQlyZXR1cm4gdHJ1ZTsKCQl9Cgl9IGVsc2VpZiAoIGlzc2V0KCAkX1NFUlZFUlsnU0VSVkVSX1BPUlQnXSApICYmICggJzQ0MycgPT09IChzdHJpbmcpICRfU0VSVkVSWydTRVJWRVJfUE9SVCddICkgKSB7CgkJcmV0dXJuIHRydWU7Cgl9CgoJcmV0dXJuIGZhbHNlOwp9CgovKioKICogQ29udmVydHMgYSBzaG9ydGhhbmQgYnl0ZSB2YWx1ZSB0byBhbiBpbnRlZ2VyIGJ5dGUgdmFsdWUuCiAqCiAqIEBzaW5jZSAyLjMuMAogKiBAc2luY2UgNC42LjAgTW92ZWQgZnJvbSBtZWRpYS5waHAgdG8gbG9hZC5waHAuCiAqCiAqIEBsaW5rIGh0dHBzOi8vd3d3LnBocC5uZXQvbWFudWFsL2VuL2Z1bmN0aW9uLmluaS1nZXQucGhwCiAqIEBsaW5rIGh0dHBzOi8vd3d3LnBocC5uZXQvbWFudWFsL2VuL2ZhcS51c2luZy5waHAjZmFxLnVzaW5nLnNob3J0aGFuZGJ5dGVzCiAqCiAqIEBwYXJhbSBzdHJpbmcgJHZhbHVlIEEgKFBIUCBpbmkpIGJ5dGUgdmFsdWUsIGVpdGhlciBzaG9ydGhhbmQgb3Igb3JkaW5hcnkuCiAqIEByZXR1cm4gaW50IEFuIGludGVnZXIgYnl0ZSB2YWx1ZS4KICovCmZ1bmN0aW9uIHdwX2NvbnZlcnRfaHJfdG9fYnl0ZXMoICR2YWx1ZSApIHsKCSR2YWx1ZSA9IHN0cnRvbG93ZXIoIHRyaW0oICR2YWx1ZSApICk7CgkkYnl0ZXMgPSAoaW50KSAkdmFsdWU7CgoJaWYgKCBzdHJfY29udGFpbnMoICR2YWx1ZSwgJ2cnICkgKSB7CgkJJGJ5dGVzICo9IEdCX0lOX0JZVEVTOwoJfSBlbHNlaWYgKCBzdHJfY29udGFpbnMoICR2YWx1ZSwgJ20nICkgKSB7CgkJJGJ5dGVzICo9IE1CX0lOX0JZVEVTOwoJfSBlbHNlaWYgKCBzdHJfY29udGFpbnMoICR2YWx1ZSwgJ2snICkgKSB7CgkJJGJ5dGVzICo9IEtCX0lOX0JZVEVTOwoJfQoKCS8vIERlYWwgd2l0aCBsYXJnZSAoZmxvYXQpIHZhbHVlcyB3aGljaCBydW4gaW50byB0aGUgbWF4aW11bSBpbnRlZ2VyIHNpemUuCglyZXR1cm4gbWluKCAkYnl0ZXMsIFBIUF9JTlRfTUFYICk7Cn0KCi8qKgogKiBEZXRlcm1pbmVzIHdoZXRoZXIgYSBQSFAgaW5pIHZhbHVlIGlzIGNoYW5nZWFibGUgYXQgcnVudGltZS4KICoKICogQHNpbmNlIDQuNi4wCiAqCiAqIEBsaW5rIGh0dHBzOi8vd3d3LnBocC5uZXQvbWFudWFsL2VuL2Z1bmN0aW9uLmluaS1nZXQtYWxsLnBocAogKgogKiBAcGFyYW0gc3RyaW5nICRzZXR0aW5nIFRoZSBuYW1lIG9mIHRoZSBpbmkgc2V0dGluZyB0byBjaGVjay4KICogQHJldHVybiBib29sIFRydWUgaWYgdGhlIHZhbHVlIGlzIGNoYW5nZWFibGUgYXQgcnVudGltZS4gRmFsc2Ugb3RoZXJ3aXNlLgogKi8KZnVuY3Rpb24gd3BfaXNfaW5pX3ZhbHVlX2NoYW5nZWFibGUoICRzZXR0aW5nICkgewoJc3RhdGljICRpbmlfYWxsOwoKCWlmICggISBpc3NldCggJGluaV9hbGwgKSApIHsKCQkkaW5pX2FsbCA9IGZhbHNlOwoJCS8vIFNvbWV0aW1lcyBgaW5pX2dldF9hbGwoKWAgaXMgZGlzYWJsZWQgdmlhIHRoZSBgZGlzYWJsZV9mdW5jdGlvbnNgIG9wdGlvbiBmb3IgInNlY3VyaXR5IHB1cnBvc2VzIi4KCQlpZiAoIGZ1bmN0aW9uX2V4aXN0cyggJ2luaV9nZXRfYWxsJyApICkgewoJCQkkaW5pX2FsbCA9IGluaV9nZXRfYWxsKCk7CgkJfQoJfQoKCWlmICggaXNzZXQoICRpbmlfYWxsWyAkc2V0dGluZyBdWydhY2Nlc3MnXSApCgkJJiYgKCBJTklfQUxMID09PSAkaW5pX2FsbFsgJHNldHRpbmcgXVsnYWNjZXNzJ10gfHwgSU5JX1VTRVIgPT09ICRpbmlfYWxsWyAkc2V0dGluZyBdWydhY2Nlc3MnXSApCgkpIHsKCQlyZXR1cm4gdHJ1ZTsKCX0KCgkvLyBJZiB3ZSB3ZXJlIHVuYWJsZSB0byByZXRyaWV2ZSB0aGUgZGV0YWlscywgZmFpbCBncmFjZWZ1bGx5IHRvIGFzc3VtZSBpdCdzIGNoYW5nZWFibGUuCglpZiAoICEgaXNfYXJyYXkoICRpbmlfYWxsICkgKSB7CgkJcmV0dXJuIHRydWU7Cgl9CgoJcmV0dXJuIGZhbHNlOwp9CgovKioKICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBjdXJyZW50IHJlcXVlc3QgaXMgYSBXb3JkUHJlc3MgQWpheCByZXF1ZXN0LgogKgogKiBAc2luY2UgNC43LjAKICoKICogQHJldHVybiBib29sIFRydWUgaWYgaXQncyBhIFdvcmRQcmVzcyBBamF4IHJlcXVlc3QsIGZhbHNlIG90aGVyd2lzZS4KICovCmZ1bmN0aW9uIHdwX2RvaW5nX2FqYXgoKSB7CgkvKioKCSAqIEZpbHRlcnMgd2hldGhlciB0aGUgY3VycmVudCByZXF1ZXN0IGlzIGEgV29yZFByZXNzIEFqYXggcmVxdWVzdC4KCSAqCgkgKiBAc2luY2UgNC43LjAKCSAqCgkgKiBAcGFyYW0gYm9vbCAkd3BfZG9pbmdfYWpheCBXaGV0aGVyIHRoZSBjdXJyZW50IHJlcXVlc3QgaXMgYSBXb3JkUHJlc3MgQWpheCByZXF1ZXN0LgoJICovCglyZXR1cm4gYXBwbHlfZmlsdGVycyggJ3dwX2RvaW5nX2FqYXgnLCBkZWZpbmVkKCAnRE9JTkdfQUpBWCcgKSAmJiBET0lOR19BSkFYICk7Cn0KCi8qKgogKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGN1cnJlbnQgcmVxdWVzdCBzaG91bGQgdXNlIHRoZW1lcy4KICoKICogQHNpbmNlIDUuMS4wCiAqCiAqIEByZXR1cm4gYm9vbCBUcnVlIGlmIHRoZW1lcyBzaG91bGQgYmUgdXNlZCwgZmFsc2Ugb3RoZXJ3aXNlLgogKi8KZnVuY3Rpb24gd3BfdXNpbmdfdGhlbWVzKCkgewoJLyoqCgkgKiBGaWx0ZXJzIHdoZXRoZXIgdGhlIGN1cnJlbnQgcmVxdWVzdCBzaG91bGQgdXNlIHRoZW1lcy4KCSAqCgkgKiBAc2luY2UgNS4xLjAKCSAqCgkgKiBAcGFyYW0gYm9vbCAkd3BfdXNpbmdfdGhlbWVzIFdoZXRoZXIgdGhlIGN1cnJlbnQgcmVxdWVzdCBzaG91bGQgdXNlIHRoZW1lcy4KCSAqLwoJcmV0dXJuIGFwcGx5X2ZpbHRlcnMoICd3cF91c2luZ190aGVtZXMnLCBkZWZpbmVkKCAnV1BfVVNFX1RIRU1FUycgKSAmJiBXUF9VU0VfVEhFTUVTICk7Cn0KCi8qKgogKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGN1cnJlbnQgcmVxdWVzdCBpcyBhIFdvcmRQcmVzcyBjcm9uIHJlcXVlc3QuCiAqCiAqIEBzaW5jZSA0LjguMAogKgogKiBAcmV0dXJuIGJvb2wgVHJ1ZSBpZiBpdCdzIGEgV29yZFByZXNzIGNyb24gcmVxdWVzdCwgZmFsc2Ugb3RoZXJ3aXNlLgogKi8KZnVuY3Rpb24gd3BfZG9pbmdfY3JvbigpIHsKCS8qKgoJICogRmlsdGVycyB3aGV0aGVyIHRoZSBjdXJyZW50IHJlcXVlc3QgaXMgYSBXb3JkUHJlc3MgY3JvbiByZXF1ZXN0LgoJICoKCSAqIEBzaW5jZSA0LjguMAoJICoKCSAqIEBwYXJhbSBib29sICR3cF9kb2luZ19jcm9uIFdoZXRoZXIgdGhlIGN1cnJlbnQgcmVxdWVzdCBpcyBhIFdvcmRQcmVzcyBjcm9uIHJlcXVlc3QuCgkgKi8KCXJldHVybiBhcHBseV9maWx0ZXJzKCAnd3BfZG9pbmdfY3JvbicsIGRlZmluZWQoICdET0lOR19DUk9OJyApICYmIERPSU5HX0NST04gKTsKfQoKLyoqCiAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiB2YXJpYWJsZSBpcyBhIFdvcmRQcmVzcyBFcnJvci4KICoKICogUmV0dXJucyB3aGV0aGVyIGAkdGhpbmdgIGlzIGFuIGluc3RhbmNlIG9mIHRoZSBgV1BfRXJyb3JgIGNsYXNzLgogKgogKiBAc2luY2UgMi4xLjAKICoKICogQHBhcmFtIG1peGVkICR0aGluZyBUaGUgdmFyaWFibGUgdG8gY2hlY2suCiAqIEByZXR1cm4gYm9vbCBXaGV0aGVyIHRoZSB2YXJpYWJsZSBpcyBhbiBpbnN0YW5jZSBvZiBXUF9FcnJvci4KICoKICogQHBocHN0YW4tYXNzZXJ0LWlmLXRydWUgV1BfRXJyb3IgJHRoaW5nCiAqLwpmdW5jdGlvbiBpc193cF9lcnJvciggJHRoaW5nICkgewoJJGlzX3dwX2Vycm9yID0gKCAkdGhpbmcgaW5zdGFuY2VvZiBXUF9FcnJvciApOwoKCWlmICggJGlzX3dwX2Vycm9yICkgewoJCS8qKgoJCSAqIEZpcmVzIHdoZW4gYGlzX3dwX2Vycm9yKClgIGlzIGNhbGxlZCBhbmQgaXRzIHBhcmFtZXRlciBpcyBhbiBpbnN0YW5jZSBvZiBXUF9FcnJvci4KCQkgKgoJCSAqIEBzaW5jZSA1LjYuMAoJCSAqCgkJICogQHBhcmFtIFdQX0Vycm9yICR0aGluZyBUaGUgZXJyb3Igb2JqZWN0IHBhc3NlZCB0byBgaXNfd3BfZXJyb3IoKWAuCgkJICovCgkJZG9fYWN0aW9uKCAnaXNfd3BfZXJyb3JfaW5zdGFuY2UnLCAkdGhpbmcgKTsKCX0KCglyZXR1cm4gJGlzX3dwX2Vycm9yOwp9CgovKioKICogRGV0ZXJtaW5lcyB3aGV0aGVyIGZpbGUgbW9kaWZpY2F0aW9ucyBhcmUgYWxsb3dlZC4KICoKICogQHNpbmNlIDQuOC4wCiAqCiAqIEBwYXJhbSBzdHJpbmcgJGNvbnRleHQgVGhlIHVzYWdlIGNvbnRleHQuCiAqIEByZXR1cm4gYm9vbCBUcnVlIGlmIGZpbGUgbW9kaWZpY2F0aW9uIGlzIGFsbG93ZWQsIGZhbHNlIG90aGVyd2lzZS4KICovCmZ1bmN0aW9uIHdwX2lzX2ZpbGVfbW9kX2FsbG93ZWQoICRjb250ZXh0ICkgewoJLyoqCgkgKiBGaWx0ZXJzIHdoZXRoZXIgZmlsZSBtb2RpZmljYXRpb25zIGFyZSBhbGxvd2VkLgoJICoKCSAqIEBzaW5jZSA0LjguMAoJICoKCSAqIEBwYXJhbSBib29sICAgJGZpbGVfbW9kX2FsbG93ZWQgV2hldGhlciBmaWxlIG1vZGlmaWNhdGlvbnMgYXJlIGFsbG93ZWQuCgkgKiBAcGFyYW0gc3RyaW5nICRjb250ZXh0ICAgICAgICAgIFRoZSB1c2FnZSBjb250ZXh0LgoJICovCglyZXR1cm4gYXBwbHlfZmlsdGVycyggJ2ZpbGVfbW9kX2FsbG93ZWQnLCAhIGRlZmluZWQoICdESVNBTExPV19GSUxFX01PRFMnICkgfHwgISBESVNBTExPV19GSUxFX01PRFMsICRjb250ZXh0ICk7Cn0KCi8qKgogKiBTdGFydHMgc2NyYXBpbmcgZWRpdGVkIGZpbGUgZXJyb3JzLgogKgogKiBAc2luY2UgNC45LjAKICovCmZ1bmN0aW9uIHdwX3N0YXJ0X3NjcmFwaW5nX2VkaXRlZF9maWxlX2Vycm9ycygpIHsKCWlmICggISBpc3NldCggJF9SRVFVRVNUWyd3cF9zY3JhcGVfa2V5J10gKSB8fCAhIGlzc2V0KCAkX1JFUVVFU1RbJ3dwX3NjcmFwZV9ub25jZSddICkgKSB7CgkJcmV0dXJuOwoJfQoKCSRrZXkgICA9IHN1YnN0ciggc2FuaXRpemVfa2V5KCB3cF91bnNsYXNoKCAkX1JFUVVFU1RbJ3dwX3NjcmFwZV9rZXknXSApICksIDAsIDMyICk7Cgkkbm9uY2UgPSB3cF91bnNsYXNoKCAkX1JFUVVFU1RbJ3dwX3NjcmFwZV9ub25jZSddICk7CglpZiAoIGVtcHR5KCAka2V5ICkgfHwgZW1wdHkoICRub25jZSApICkgewoJCXJldHVybjsKCX0KCgkkdHJhbnNpZW50ID0gZ2V0X3RyYW5zaWVudCggJ3NjcmFwZV9rZXlfJyAuICRrZXkgKTsKCWlmICggZmFsc2UgPT09ICR0cmFuc2llbnQgKSB7CgkJcmV0dXJuOwoJfQoKCWlmICggJHRyYW5zaWVudCAhPT0gJG5vbmNlICkgewoJCWlmICggISBoZWFkZXJzX3NlbnQoKSApIHsKCQkJaGVhZGVyKCAnWC1Sb2JvdHMtVGFnOiBub2luZGV4JyApOwoJCQlub2NhY2hlX2hlYWRlcnMoKTsKCQl9CgkJZWNobyAiIyMjIyMjIHdwX3NjcmFwaW5nX3Jlc3VsdF9zdGFydDoka2V5ICMjIyMjIyI7CgkJZWNobyB3cF9qc29uX2VuY29kZSgKCQkJYXJyYXkoCgkJCQknY29kZScgICAgPT4gJ3NjcmFwZV9ub25jZV9mYWlsdXJlJywKCQkJCSdtZXNzYWdlJyA9PiBfXyggJ1NjcmFwZSBrZXkgY2hlY2sgZmFpbGVkLiBQbGVhc2UgdHJ5IGFnYWluLicgKSwKCQkJKQoJCSk7CgkJZWNobyAiIyMjIyMjIHdwX3NjcmFwaW5nX3Jlc3VsdF9lbmQ6JGtleSAjIyMjIyMiOwoJCWRpZSgpOwoJfQoKCWlmICggISBkZWZpbmVkKCAnV1BfU0FOREJPWF9TQ1JBUElORycgKSApIHsKCQlkZWZpbmUoICdXUF9TQU5EQk9YX1NDUkFQSU5HJywgdHJ1ZSApOwoJfQoKCXJlZ2lzdGVyX3NodXRkb3duX2Z1bmN0aW9uKCAnd3BfZmluYWxpemVfc2NyYXBpbmdfZWRpdGVkX2ZpbGVfZXJyb3JzJywgJGtleSApOwp9CgovKioKICogRmluYWxpemVzIHNjcmFwaW5nIGZvciBlZGl0ZWQgZmlsZSBlcnJvcnMuCiAqCiAqIEBzaW5jZSA0LjkuMAogKgogKiBAcGFyYW0gc3RyaW5nICRzY3JhcGVfa2V5IFNjcmFwZSBrZXkuCiAqLwpmdW5jdGlvbiB3cF9maW5hbGl6ZV9zY3JhcGluZ19lZGl0ZWRfZmlsZV9lcnJvcnMoICRzY3JhcGVfa2V5ICkgewoJJGVycm9yID0gZXJyb3JfZ2V0X2xhc3QoKTsKCgllY2hvICJcbiMjIyMjIyB3cF9zY3JhcGluZ19yZXN1bHRfc3RhcnQ6JHNjcmFwZV9rZXkgIyMjIyMjXG4iOwoKCWlmICggISBlbXB0eSggJGVycm9yICkKCQkmJiBpbl9hcnJheSggJGVycm9yWyd0eXBlJ10sIGFycmF5KCBFX0NPUkVfRVJST1IsIEVfQ09NUElMRV9FUlJPUiwgRV9FUlJPUiwgRV9QQVJTRSwgRV9VU0VSX0VSUk9SLCBFX1JFQ09WRVJBQkxFX0VSUk9SICksIHRydWUgKQoJKSB7CgkJJGVycm9yID0gc3RyX3JlcGxhY2UoIEFCU1BBVEgsICcnLCAkZXJyb3IgKTsKCQllY2hvIHdwX2pzb25fZW5jb2RlKCAkZXJyb3IgKTsKCX0gZWxzZSB7CgkJZWNobyB3cF9qc29uX2VuY29kZSggdHJ1ZSApOwoJfQoKCWVjaG8gIlxuIyMjIyMjIHdwX3NjcmFwaW5nX3Jlc3VsdF9lbmQ6JHNjcmFwZV9rZXkgIyMjIyMjXG4iOwp9CgovKioKICogQ2hlY2tzIHdoZXRoZXIgY3VycmVudCByZXF1ZXN0IGlzIGEgSlNPTiByZXF1ZXN0LCBvciBpcyBleHBlY3RpbmcgYSBKU09OIHJlc3BvbnNlLgogKgogKiBAc2luY2UgNS4wLjAKICoKICogQHJldHVybiBib29sIFRydWUgaWYgYEFjY2VwdHNgIG9yIGBDb250ZW50LVR5cGVgIGhlYWRlcnMgY29udGFpbiBgYXBwbGljYXRpb24vanNvbmAuCiAqICAgICAgICAgICAgICBGYWxzZSBvdGhlcndpc2UuCiAqLwpmdW5jdGlvbiB3cF9pc19qc29uX3JlcXVlc3QoKSB7CglpZiAoIGlzc2V0KCAkX1NFUlZFUlsnSFRUUF9BQ0NFUFQnXSApICYmIHdwX2lzX2pzb25fbWVkaWFfdHlwZSggJF9TRVJWRVJbJ0hUVFBfQUNDRVBUJ10gKSApIHsKCQlyZXR1cm4gdHJ1ZTsKCX0KCglpZiAoIGlzc2V0KCAkX1NFUlZFUlsnQ09OVEVOVF9UWVBFJ10gKSAmJiB3cF9pc19qc29uX21lZGlhX3R5cGUoICRfU0VSVkVSWydDT05URU5UX1RZUEUnXSApICkgewoJCXJldHVybiB0cnVlOwoJfQoKCXJldHVybiBmYWxzZTsKfQoKLyoqCiAqIENoZWNrcyB3aGV0aGVyIGN1cnJlbnQgcmVxdWVzdCBpcyBhIEpTT05QIHJlcXVlc3QsIG9yIGlzIGV4cGVjdGluZyBhIEpTT05QIHJlc3BvbnNlLgogKgogKiBAc2luY2UgNS4yLjAKICoKICogQHJldHVybiBib29sIFRydWUgaWYgSlNPTlAgcmVxdWVzdCwgZmFsc2Ugb3RoZXJ3aXNlLgogKi8KZnVuY3Rpb24gd3BfaXNfanNvbnBfcmVxdWVzdCgpIHsKCWlmICggISBpc3NldCggJF9HRVRbJ19qc29ucCddICkgKSB7CgkJcmV0dXJuIGZhbHNlOwoJfQoKCWlmICggISBmdW5jdGlvbl9leGlzdHMoICd3cF9jaGVja19qc29ucF9jYWxsYmFjaycgKSApIHsKCQlyZXF1aXJlX29uY2UgQUJTUEFUSCAuIFdQSU5DIC4gJy9mdW5jdGlvbnMucGhwJzsKCX0KCgkkanNvbnBfY2FsbGJhY2sgPSAkX0dFVFsnX2pzb25wJ107CglpZiAoICEgd3BfY2hlY2tfanNvbnBfY2FsbGJhY2soICRqc29ucF9jYWxsYmFjayApICkgewoJCXJldHVybiBmYWxzZTsKCX0KCgkvKiogVGhpcyBmaWx0ZXIgaXMgZG9jdW1lbnRlZCBpbiB3cC1pbmNsdWRlcy9yZXN0LWFwaS9jbGFzcy13cC1yZXN0LXNlcnZlci5waHAgKi8KCSRqc29ucF9lbmFibGVkID0gYXBwbHlfZmlsdGVycyggJ3Jlc3RfanNvbnBfZW5hYmxlZCcsIHRydWUgKTsKCglyZXR1cm4gJGpzb25wX2VuYWJsZWQ7Cn0KCi8qKgogKiBDaGVja3Mgd2hldGhlciBhIHN0cmluZyBpcyBhIHZhbGlkIEpTT04gTWVkaWEgVHlwZS4KICoKICogQHNpbmNlIDUuNi4wCiAqCiAqIEBwYXJhbSBzdHJpbmcgJG1lZGlhX3R5cGUgQSBNZWRpYSBUeXBlIHN0cmluZyB0byBjaGVjay4KICogQHJldHVybiBib29sIFRydWUgaWYgc3RyaW5nIGlzIGEgdmFsaWQgSlNPTiBNZWRpYSBUeXBlLgogKi8KZnVuY3Rpb24gd3BfaXNfanNvbl9tZWRpYV90eXBlKCAkbWVkaWFfdHlwZSApIHsKCXN0YXRpYyAkY2FjaGUgPSBhcnJheSgpOwoKCWlmICggISBpc3NldCggJGNhY2hlWyAkbWVkaWFfdHlwZSBdICkgKSB7CgkJJGNhY2hlWyAkbWVkaWFfdHlwZSBdID0gKGJvb2wpIHByZWdfbWF0Y2goICcvKF58XHN8LClhcHBsaWNhdGlvblwvKFtcdyEjXCQmLVxeXC5cK10rXCspP2pzb24oXCtvZW1iZWQpPygkfFxzfDt8LCkvaScsICRtZWRpYV90eXBlICk7Cgl9CgoJcmV0dXJuICRjYWNoZVsgJG1lZGlhX3R5cGUgXTsKfQoKLyoqCiAqIENoZWNrcyB3aGV0aGVyIGN1cnJlbnQgcmVxdWVzdCBpcyBhbiBYTUwgcmVxdWVzdCwgb3IgaXMgZXhwZWN0aW5nIGFuIFhNTCByZXNwb25zZS4KICoKICogQHNpbmNlIDUuMi4wCiAqCiAqIEByZXR1cm4gYm9vbCBUcnVlIGlmIGBBY2NlcHRzYCBvciBgQ29udGVudC1UeXBlYCBoZWFkZXJzIGNvbnRhaW4gYHRleHQveG1sYAogKiAgICAgICAgICAgICAgb3Igb25lIG9mIHRoZSByZWxhdGVkIE1JTUUgdHlwZXMuIEZhbHNlIG90aGVyd2lzZS4KICovCmZ1bmN0aW9uIHdwX2lzX3htbF9yZXF1ZXN0KCkgewoJJGFjY2VwdGVkID0gYXJyYXkoCgkJJ3RleHQveG1sJywKCQknYXBwbGljYXRpb24vcnNzK3htbCcsCgkJJ2FwcGxpY2F0aW9uL2F0b20reG1sJywKCQknYXBwbGljYXRpb24vcmRmK3htbCcsCgkJJ3RleHQveG1sK29lbWJlZCcsCgkJJ2FwcGxpY2F0aW9uL3htbCtvZW1iZWQnLAoJKTsKCglpZiAoIGlzc2V0KCAkX1NFUlZFUlsnSFRUUF9BQ0NFUFQnXSApICkgewoJCWZvcmVhY2ggKCAkYWNjZXB0ZWQgYXMgJHR5cGUgKSB7CgkJCWlmICggc3RyX2NvbnRhaW5zKCAkX1NFUlZFUlsnSFRUUF9BQ0NFUFQnXSwgJHR5cGUgKSApIHsKCQkJCXJldHVybiB0cnVlOwoJCQl9CgkJfQoJfQoKCWlmICggaXNzZXQoICRfU0VSVkVSWydDT05URU5UX1RZUEUnXSApICYmIGluX2FycmF5KCAkX1NFUlZFUlsnQ09OVEVOVF9UWVBFJ10sICRhY2NlcHRlZCwgdHJ1ZSApICkgewoJCXJldHVybiB0cnVlOwoJfQoKCXJldHVybiBmYWxzZTsKfQoKLyoqCiAqIENoZWNrcyBpZiB0aGlzIHNpdGUgaXMgcHJvdGVjdGVkIGJ5IEhUVFAgQmFzaWMgQXV0aC4KICoKICogQXQgdGhlIG1vbWVudCwgdGhpcyBtZXJlbHkgY2hlY2tzIGZvciB0aGUgcHJlc2VudCBvZiBCYXNpYyBBdXRoIGNyZWRlbnRpYWxzLiBUaGVyZWZvcmUsIGNhbGxpbmcKICogdGhpcyBmdW5jdGlvbiB3aXRoIGEgY29udGV4dCBkaWZmZXJlbnQgZnJvbSB0aGUgY3VycmVudCBjb250ZXh0IG1heSBnaXZlIGluYWNjdXJhdGUgcmVzdWx0cy4KICogSW4gYSBmdXR1cmUgcmVsZWFzZSwgdGhpcyBldmFsdWF0aW9uIG1heSBiZSBtYWRlIG1vcmUgcm9idXN0LgogKgogKiBDdXJyZW50bHksIHRoaXMgaXMgb25seSB1c2VkIGJ5IEFwcGxpY2F0aW9uIFBhc3N3b3JkcyB0byBwcmV2ZW50IGEgY29uZmxpY3Qgc2luY2UgaXQgYWxzbyB1dGlsaXplcwogKiBCYXNpYyBBdXRoLgogKgogKiBAc2luY2UgNS42LjEKICoKICogQGdsb2JhbCBzdHJpbmcgJHBhZ2Vub3cgVGhlIGZpbGVuYW1lIG9mIHRoZSBjdXJyZW50IHNjcmVlbi4KICoKICogQHBhcmFtIHN0cmluZyAkY29udGV4dCBUaGUgY29udGV4dCB0byBjaGVjayBmb3IgcHJvdGVjdGlvbi4gQWNjZXB0cyAnbG9naW4nLCAnYWRtaW4nLCBhbmQgJ2Zyb250Jy4KICogICAgICAgICAgICAgICAgICAgICAgICBEZWZhdWx0cyB0byB0aGUgY3VycmVudCBjb250ZXh0LgogKiBAcmV0dXJuIGJvb2wgV2hldGhlciB0aGUgc2l0ZSBpcyBwcm90ZWN0ZWQgYnkgQmFzaWMgQXV0aC4KICovCmZ1bmN0aW9uIHdwX2lzX3NpdGVfcHJvdGVjdGVkX2J5X2Jhc2ljX2F1dGgoICRjb250ZXh0ID0gJycgKSB7CglnbG9iYWwgJHBhZ2Vub3c7CgoJaWYgKCAhICRjb250ZXh0ICkgewoJCWlmICggJ3dwLWxvZ2luLnBocCcgPT09ICRwYWdlbm93ICkgewoJCQkkY29udGV4dCA9ICdsb2dpbic7CgkJfSBlbHNlaWYgKCBpc19hZG1pbigpICkgewoJCQkkY29udGV4dCA9ICdhZG1pbic7CgkJfSBlbHNlIHsKCQkJJGNvbnRleHQgPSAnZnJvbnQnOwoJCX0KCX0KCgkkaXNfcHJvdGVjdGVkID0gISBlbXB0eSggJF9TRVJWRVJbJ1BIUF9BVVRIX1VTRVInXSApIHx8ICEgZW1wdHkoICRfU0VSVkVSWydQSFBfQVVUSF9QVyddICk7CgoJLyoqCgkgKiBGaWx0ZXJzIHdoZXRoZXIgYSBzaXRlIGlzIHByb3RlY3RlZCBieSBIVFRQIEJhc2ljIEF1dGguCgkgKgoJICogQHNpbmNlIDUuNi4xCgkgKgoJICogQHBhcmFtIGJvb2wgJGlzX3Byb3RlY3RlZCBXaGV0aGVyIHRoZSBzaXRlIGlzIHByb3RlY3RlZCBieSBCYXNpYyBBdXRoLgoJICogQHBhcmFtIHN0cmluZyAkY29udGV4dCAgICBUaGUgY29udGV4dCB0byBjaGVjayBmb3IgcHJvdGVjdGlvbi4gT25lIG9mICdsb2dpbicsICdhZG1pbicsIG9yICdmcm9udCcuCgkgKi8KCXJldHVybiBhcHBseV9maWx0ZXJzKCAnd3BfaXNfc2l0ZV9wcm90ZWN0ZWRfYnlfYmFzaWNfYXV0aCcsICRpc19wcm90ZWN0ZWQsICRjb250ZXh0ICk7Cn0K
Fatal error: Uncaught Error: Call to undefined function wp_check_php_mysql_versions() in /data/2/3/23c1234b-1478-40a1-83df-c83b1b2766b3/biteandbyte.sk/web/wp-settings.php:40
Stack trace:
#0 /data/2/3/23c1234b-1478-40a1-83df-c83b1b2766b3/biteandbyte.sk/web/wp-config.php(81): require_once()
#1 /data/2/3/23c1234b-1478-40a1-83df-c83b1b2766b3/biteandbyte.sk/web/wp-load.php(50): require_once('/data/2/3/23c12...')
#2 /data/2/3/23c1234b-1478-40a1-83df-c83b1b2766b3/biteandbyte.sk/web/wp-blog-header.php(13): require_once('/data/2/3/23c12...')
#3 /data/2/3/23c1234b-1478-40a1-83df-c83b1b2766b3/biteandbyte.sk/web/index.php(17): require('/data/2/3/23c12...')
#4 {main}
thrown in /data/2/3/23c1234b-1478-40a1-83df-c83b1b2766b3/biteandbyte.sk/web/wp-settings.php on line 40