LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQWdlcmUgU3lzdGVtcyBJbmMuCiAqIFdpcmVsZXNzIGRldmljZSBkcml2ZXIgZm9yIExpbnV4ICh3bGFnczQ5KS4KICoKICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMDMgQWdlcmUgU3lzdGVtcyBJbmMuCiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAqICAgaHR0cDovL3d3dy5hZ2VyZS5jb20KICoKICogSW5pdGlhbGx5IGRldmVsb3BlZCBieSBUcmlwbGVQb2ludCwgSW5jLgogKiAgIGh0dHA6Ly93d3cudHJpcGxlcG9pbnQuY29tCiAqCiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqCiAqICAgVGhpcyBmaWxlIGRlZmluZXMgcm91dGluZXMgcmVxdWlyZWQgdG8gcGFyc2UgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzCiAqICAgbGlzdGVkIGluIGEgY29uZmlnIGZpbGUsIGlmIHRoYXQgY29uZmlnIGZpbGUgZXhpc3RzLgogKgogKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKgogKiBTT0ZUV0FSRSBMSUNFTlNFCiAqCiAqIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHRlcm1zIGFuZCBjb25kaXRpb25zLAogKiB3aGljaCB5b3Ugc2hvdWxkIHJlYWQgY2FyZWZ1bGx5IGJlZm9yZSB1c2luZyB0aGUgc29mdHdhcmUuICBVc2luZyB0aGlzCiAqIHNvZnR3YXJlIGluZGljYXRlcyB5b3VyIGFjY2VwdGFuY2Ugb2YgdGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMuICBJZiB5b3UgZG8KICogbm90IGFncmVlIHdpdGggdGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMsIGRvIG5vdCB1c2UgdGhlIHNvZnR3YXJlLgogKgogKiBDb3B5cmlnaHQgqSAyMDAzIEFnZXJlIFN5c3RlbXMgSW5jLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogKgogKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBvciBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogKiBtb2RpZmljYXRpb25zLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CiAqCiAqIC4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzCiAqICAgIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBEaXNjbGFpbWVyIGFzIGNvbW1lbnRzIGluIHRoZSBjb2RlIGFzCiAqICAgIHdlbGwgYXMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQogKiAgICBkaXN0cmlidXRpb24uCiAqCiAqIC4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAogKiAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBEaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCiAqICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgogKgogKiAuIE5laXRoZXIgdGhlIG5hbWUgb2YgQWdlcmUgU3lzdGVtcyBJbmMuIG5vciB0aGUgbmFtZXMgb2YgdGhlIGNvbnRyaWJ1dG9ycwogKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAqCiAqIERpc2NsYWltZXIKICoKICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCCTQVMgSVOUIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCiAqIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBJTkZSSU5HRU1FTlQgQU5EIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIEFOWQogKiBVU0UsIE1PRElGSUNBVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhJUyBTT0ZUV0FSRSBJUyBTT0xFTFkgQVQgVEhFIFVTRVJTIE9XTgogKiBSSVNLLiBJTiBOTyBFVkVOVCBTSEFMTCBBR0VSRSBTWVNURU1TIElOQy4gT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCiAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCiAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECiAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgQ09OVFJBQ1QsIFNUUklDVAogKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAogKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSAogKiBEQU1BR0UuCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgovKiBPbmx5IGluY2x1ZGUgdGhpcyBmaWxlIGlmIFVTRV9QUk9GSUxFIGlzIGRlZmluZWQgKi8KI2lmZGVmIFVTRV9QUk9GSUxFCgoKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgY29uc3RhbnQgZGVmaW5pdGlvbnMKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCgovKiBBbGxvdyBzdXBwb3J0IGZvciBjYWxsaW5nIHN5c3RlbSBmY25zIHRvIHBhcnNlIGNvbmZpZyBmaWxlICovCiNkZWZpbmUgX19LRVJORUxfU1lTQ0FMTFNfXwoKCgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogaW5jbHVkZSBmaWxlcwogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwojaW5jbHVkZSA8d2xfdmVyc2lvbi5oPgoKI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgojaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KI2luY2x1ZGUgPGxpbnV4L3VuaXN0ZC5oPgojaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KI2luY2x1ZGUgPGxpbWl0cy5oPgoKI2RlZmluZSBCSU5fREwgMQoKI2luY2x1ZGUgPGRlYnVnLmg+CiNpbmNsdWRlIDxoY2YuaD4KLy8jaW5jbHVkZSA8aGNmZGVmLmg+CgojaW5jbHVkZSA8d2xfaWYuaD4KI2luY2x1ZGUgPHdsX2ludGVybmFsLmg+CiNpbmNsdWRlIDx3bF91dGlsLmg+CiNpbmNsdWRlIDx3bF9lbmMuaD4KI2luY2x1ZGUgPHdsX21haW4uaD4KI2luY2x1ZGUgPHdsX3Byb2ZpbGUuaD4KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBnbG9iYWwgdmFyaWFibGVzCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgovKiBEZWZpbml0aW9uIG5lZWRlZCB0byBwcmV2ZW50IHVucmVzb2x2ZWQgZXh0ZXJuYWwgaW4gdW5pc3RkLmggKi8Kc3RhdGljIGludCBlcnJubzsKCiNpZiBEQkcKZXh0ZXJuIHBfdTMyICAgIERlYnVnRmxhZzsKZXh0ZXJuIGRiZ19pbmZvX3QgKkRiZ0luZm87CiNlbmRpZgoKaW50IHBhcnNlX3llc19ubyggY2hhciogdmFsdWUgKTsKCgppbnQgcGFyc2VfeWVzX25vKCBjaGFyKiB2YWx1ZSApIHsKaW50IHJjID0gMDsJCQkJCQkJCQkJLy9kZWZhdWx0IHRvIE5PIGZvciBpbnZhbGlkIHBhcmFtZXRlcnMKCglpZiAoIHN0cmxlbiggdmFsdWUgKSA9PSAxICkgewoJCWlmICggKCB2YWx1ZVswXSB8ICgnWSdeJ3knKSApID09ICd5JyApIHJjID0gMTsKLy8JfSBlbHNlIHsKLy8JCXRoaXMgc2hvdWxkIG5vdCBiZSBkZWJ1ZyB0aW1lIGluZm8sIGl0IGlzIGFuIGVuZHVzZXIgZGF0YSBlbnRyeSBlcnJvciA7PwovLwkJREJHX1dBUk5JTkcoIERiZ0luZm8sICIlcyBpbnZhbGlkOyB3aWxsIGJlIGlnbm9yZWRcbiIsIFBBUk1fTkFNRV9NSUNST1dBVkVfUk9CVVNUTkVTUyApOwoJfQoJcmV0dXJuIHJjOwp9IC8vIHBhcnNlX3llc19ubwoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCXBhcnNlX2NvbmZpZygpCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqICBERVNDUklQVElPTjoKICoKICogICAgICBUaGlzIGZ1bmN0aW9uIG9wZW5zIHRoZSBkZXZpY2UncyBjb25maWcgZmlsZSBhbmQgcGFyc2VzIHRoZSBvcHRpb25zIGZyb20KICogICBpdCwgc28gdGhhdCBpdCBjYW4gcHJvcGVybHkgY29uZmlndXJlIGl0c2VsZi4gSWYgbm8gY29uZmlndXJhdGlvbiBmaWxlCiAqICAgb3IgY29uZmlndXJhdGlvbiBpcyBwcmVzZW50LCB0aGVuIGNvbnRpbnVlIHRvIHVzZSB0aGUgb3B0aW9ucyBhbHJlYWR5CiAqICAgcGFyc2VkIGZyb20gY29uZmlnLm9wdHMgb3Igd2lyZWxlc3Mub3B0cy4KICoKICogIFBBUkFNRVRFUlM6CiAqCiAqICAgICAgZGV2IC0gYSBwb2ludGVyIHRvIHRoZSBkZXZpY2UncyBuZXRfZGV2aWNlIHN0cnVjdHVyZQogKgogKiAgUkVUVVJOUzoKICoKICogICAgICBOL0EKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kdm9pZCBwYXJzZV9jb25maWcoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKQp7CglpbnQJCQkJICAgIGZpbGVfZGVzYzsKI2lmIDAgLy8gQklOX0RMCglpbnQgCSAJCQlyYzsKCWNoYXIJCQkJKmNwID0gTlVMTDsKI2VuZGlmIC8vIEJJTl9ETAoJY2hhciAgICAgICAgICAgICAgICBidWZmZXJbTUFYX0xJTkVfU0laRV07CgljaGFyICAgICAgICAgICAgICAgIGZpbGVuYW1lW01BWF9MSU5FX1NJWkVdOwoJbW1fc2VnbWVudF90CSAgICBmczsKCXN0cnVjdCB3bF9wcml2YXRlICAgKnd2bGFuX2NvbmZpZyA9IE5VTEw7CglFTkNTVFJDVCAgICAgICAgICAgIHNFbmNyeXB0aW9uOwoJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKCURCR19GVU5DKCAicGFyc2VfY29uZmlnIiApOwoJREJHX0VOVEVSKCBEYmdJbmZvICk7CgoJLyogR2V0IHRoZSB3YXZlbGFuIHNwZWNpZmljIGluZm8gZm9yIHRoaXMgZGV2aWNlICovCgl3dmxhbl9jb25maWcgPSAoc3RydWN0IHdsX3ByaXZhdGUgKilkZXYtPnByaXY7CglpZiAoIHd2bGFuX2NvbmZpZyA9PSBOVUxMICkgewoJCURCR19FUlJPUiggRGJnSW5mbywgIldhdmVsYW4gc3BlY2lmaWMgaW5mbyBzdHJ1Y3Qgbm90IHByZXNlbnQ/XG4iICk7CgkJcmV0dXJuOwoJfQoKCS8qIHNldHVwIHRoZSBkZWZhdWx0IGVuY3J5cHRpb24gc3RyaW5nICovCglzdHJjcHkoIHd2bGFuX2NvbmZpZy0+c3pFbmNyeXB0aW9uLCBERUZfQ1JZUFRfU1RSICk7CgoJLyogT2J0YWluIGEgdXNlci1zcGFjZSBwcm9jZXNzIGNvbnRleHQsIHN0b3JpbmcgdGhlIG9yaWdpbmFsIGNvbnRleHQgKi8KCWZzID0gZ2V0X2ZzKCApOwoJc2V0X2ZzKCBnZXRfZHMoICkpOwoKCS8qIERldGVybWluZSB0aGUgZmlsZW5hbWUgZm9yIHRoaXMgZGV2aWNlIGFuZCBhdHRlbXB0IHRvIG9wZW4gaXQgKi8KCXNwcmludGYoIGZpbGVuYW1lLCAiJXMlcyIsIFJPT1RfQ09ORklHX0ZJTEVOQU1FLCBkZXYtPm5hbWUgKTsKCWZpbGVfZGVzYyA9IG9wZW4oIGZpbGVuYW1lLCBPX1JET05MWSwgMCApOwoJaWYgKCBmaWxlX2Rlc2MgIT0gLTEgKSB7CgkJREJHX1RSQUNFKCBEYmdJbmZvLCAiV2lyZWxlc3MgY29uZmlnIGZpbGUgZm91bmQuIFBhcnNpbmcgb3B0aW9ucy4uLlxuIiApOwoKCQkvKiBSZWFkIG91dCB0aGUgb3B0aW9ucyAqLwoJCXdoaWxlKCByZWFkbGluZSggZmlsZV9kZXNjLCBidWZmZXIgKSkgewoJCQl0cmFuc2xhdGVfb3B0aW9uKCBidWZmZXIsIHd2bGFuX2NvbmZpZyApOwoJCX0KCQkvKiBDbG9zZSB0aGUgZmlsZSAqLwoJCWNsb3NlKCBmaWxlX2Rlc2MgKTsJLy87P2V2ZW4gaWYgZmlsZV9kZXNjID09IC0xID8/PwoJfSBlbHNlIHsKCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJObyBpd2NvbmZpZyBmaWxlIGZvdW5kIGZvciB0aGlzIGRldmljZTsgIgoJCQkJICAgImNvbmZpZy5vcHRzIG9yIHdpcmVsZXNzLm9wdHMgd2lsbCBiZSB1c2VkXG4iICk7Cgl9CgkvKiBSZXR1cm4gdG8gdGhlIG9yaWdpbmFsIGNvbnRleHQgKi8KCXNldF9mcyggZnMgKTsKCgkvKiBjb252ZXJ0IHRoZSBXRVAga2V5cywgaWYgcmVhZCBpbiBhcyBrZXkxLCBrZXkyLCB0eXBlIG9mIGRhdGEgKi8KCWlmICggd3ZsYW5fY29uZmlnLT5FbmFibGVFbmNyeXB0aW9uICkgewoJCW1lbXNldCggJnNFbmNyeXB0aW9uLCAwLCBzaXplb2YoIHNFbmNyeXB0aW9uICkpOwoKCQl3bF93ZXBfZGVjb2RlKCBDUllQVF9DT0RFLCAmc0VuY3J5cHRpb24sCgkJCQkJCSAgIHd2bGFuX2NvbmZpZy0+c3pFbmNyeXB0aW9uICk7CgoJCS8qIHRoZSBMaW51eCBkcml2ZXIgbGlrZXMgdG8gdXNlIDEtNCBmb3IgdGhlIGtleSBJRHMsIGFuZCB0aGVuCgkJICAgY29udmVydCB0byAwLTMgd2hlbiBzZW5kaW5nIHRvIHRoZSBjYXJkLiAgVGhlIFdpbmRvd3MgY29kZQoJCSAgIGJhc2UgdXNlZCAwLTMgaW4gdGhlIEFQSSBETEwsIHdoaWNoIHdhcyBwb3J0ZWQgdG8gTGludXguICBGb3IKCQkgICB0aGUgc2FrZSBvZiB0aGUgdXNlciBleHBlcmllbmNlLCB3ZSBkZWNpZGVkIHRvIGtlZXAgMC0zIGFzIHRoZQoJCSAgIG51bWJlcnMgdXNlZCBpbiB0aGUgRExMOyBhbmQgd2lsbCBwZXJmb3JtIHRoZSArMSBjb252ZXJzaW9uIGhlcmUuCgkJICAgV2UgY291bGQgaGF2ZSBjb252ZXJ0ZWQgIHRoZSBlbnRpcmUgTGludXggZHJpdmVyLCBidXQgdGhpcyBpcwoJCSAgIGxlc3Mgb2J0cnVzaXZlLiAgVGhpcyBtYXkgYmUgYSAidG9kbyIgdG8gY29udmVydCB0aGUgd2hvbGUgZHJpdmVyICovCgkJc0VuY3J5cHRpb24ud0VuYWJsZWQgPSB3dmxhbl9jb25maWctPkVuYWJsZUVuY3J5cHRpb247CgkJc0VuY3J5cHRpb24ud1R4S2V5SUQgPSB3dmxhbl9jb25maWctPlRyYW5zbWl0S2V5SUQgLSAxOwoKCQltZW1jcHkoICZzRW5jcnlwdGlvbi5FbmNTdHIsICZ3dmxhbl9jb25maWctPkRlZmF1bHRLZXlzLAoJCQkJc2l6ZW9mKCBDRkdfREVGQVVMVF9LRVlTX1NUUkNUICkpOwoKCQltZW1zZXQoIHd2bGFuX2NvbmZpZy0+c3pFbmNyeXB0aW9uLCAwLCBzaXplb2YoIHd2bGFuX2NvbmZpZy0+c3pFbmNyeXB0aW9uICkpOwoKCQl3bF93ZXBfY29kZSggQ1JZUFRfQ09ERSwgd3ZsYW5fY29uZmlnLT5zekVuY3J5cHRpb24sICZzRW5jcnlwdGlvbiwKCQkJCQkJIHNpemVvZiggc0VuY3J5cHRpb24gKSk7Cgl9CgoJLyogZGVjb2RlIHRoZSBlbmNyeXB0aW9uIHN0cmluZyBmb3IgdGhlIGNhbGwgdG8gd2xfY29tbWl0KCkgKi8KCXdsX3dlcF9kZWNvZGUoIENSWVBUX0NPREUsICZzRW5jcnlwdGlvbiwgd3ZsYW5fY29uZmlnLT5zekVuY3J5cHRpb24gKTsKCgl3dmxhbl9jb25maWctPlRyYW5zbWl0S2V5SUQgICAgPSBzRW5jcnlwdGlvbi53VHhLZXlJRCArIDE7Cgl3dmxhbl9jb25maWctPkVuYWJsZUVuY3J5cHRpb24gPSBzRW5jcnlwdGlvbi53RW5hYmxlZDsKCgltZW1jcHkoICZ3dmxhbl9jb25maWctPkRlZmF1bHRLZXlzLCAmc0VuY3J5cHRpb24uRW5jU3RyLAoJCQlzaXplb2YoIENGR19ERUZBVUxUX0tFWVNfU1RSQ1QgKSk7CgojaWYgMCAvL0JJTl9ETAoJCS8qIE9idGFpbiBhIHVzZXItc3BhY2UgcHJvY2VzcyBjb250ZXh0LCBzdG9yaW5nIHRoZSBvcmlnaW5hbCBjb250ZXh0ICovCgkJZnMgPSBnZXRfZnMoICk7CgkJc2V0X2ZzKCBnZXRfZHMoICkpOwoKCQkvLzs/anVzdCB0byBmYWtlIHNvbWV0aGluZwoJCXN0cmNweSgvKnd2bGFuX2NvbmZpZy0+ZndfaW1hZ2VfKi9maWxlbmFtZSwgIi9ldGMvYWdlcmUvZncuYmluIiApOwoJCWZpbGVfZGVzYyA9IG9wZW4oIC8qd3ZsYW5fY29uZmlnLT5md19pbWFnZV8qL2ZpbGVuYW1lLCAwLCAwICk7CgkJaWYgKCBmaWxlX2Rlc2MgPT0gLTEgKSB7CgkJCURCR19FUlJPUiggRGJnSW5mbywgIk5vIGltYWdlIGZpbGUgZm91bmRcbiIgKTsKCQl9IGVsc2UgewoJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJGL1cgaW1hZ2UgZmlsZSBmb3VuZFxuIiApOwojZGVmaW5lIERIRl9BTExPQ19TSVpFIDk2MDAwCQkJLy9qdXN0IGJlbG93IDk2SywgbGV0J3MgaG9wZSBpdCBzdWZmaWNlcyBmb3Igbm93IGFuZCBmb3IgdGhlIGZ1dHVyZQoJCQljcCA9IChjaGFyKil2bWFsbG9jKCBESEZfQUxMT0NfU0laRSApOwoJCQlpZiAoIGNwID09IE5VTEwgKSB7CgkJCQlEQkdfRVJST1IoIERiZ0luZm8sICJlcnJvciBpbiB2bWFsbG9jXG4iICk7CgkJCX0gZWxzZSB7CgkJCQlyYyA9IHJlYWQoIGZpbGVfZGVzYywgY3AsIERIRl9BTExPQ19TSVpFICk7CgkJCQlpZiAoIHJjID09IERIRl9BTExPQ19TSVpFICkgewoJCQkJCURCR19FUlJPUiggRGJnSW5mbywgImJ1ZmZlciB0b28gc21hbGwsICVkXG4iLCBESEZfQUxMT0NfU0laRSApOwoJCQkJfSBlbHNlIGlmICggcmMgPiAwICkgewoJCQkJCURCR19UUkFDRSggRGJnSW5mbywgInJlYWQgTy5LLjogJWQgYnl0ZXMgICUuMTJzXG4iLCByYywgY3AgKTsKCQkJCQlyYyA9IHJlYWQoIGZpbGVfZGVzYywgJmNwW3JjXSwgMSApOwoJCQkJCWlmICggcmMgPT0gMCApIHsKCQkJCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAibm8gbW9yZSB0byByZWFkXG4iICk7CgkJCQkJfQoJCQkJfQoJCQkJaWYgKCByYyAhPSAwICkgewoJCQkJCURCR19FUlJPUiggRGJnSW5mbywgImZpbGUgbm90IHJlYWQgaW4gb25lIHN3b29wIG9yIG90aGVyIGVycm9yIlwKCQkJCQkJCQkJCSIsIGdpdmUgdXAsIHRvbyBjb21wbGljYXRlZCwgcmMgPSAlMFhcbiIsIHJjICk7CgkJCQl9CgkJCQl2ZnJlZSggY3AgKTsKCQkJfQoJCQljbG9zZSggZmlsZV9kZXNjICk7CgkJfQoJCXNldF9mcyggZnMgKTsJCQkvKiBSZXR1cm4gdG8gdGhlIG9yaWdpbmFsIGNvbnRleHQgKi8KI2VuZGlmIC8vIEJJTl9ETAoKCURCR19MRUFWRSggRGJnSW5mbyApOwoJcmV0dXJuOwp9IC8vIHBhcnNlX2NvbmZpZwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJcmVhZGxpbmUoKQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiAgREVTQ1JJUFRJT046CiAqCiAqICAgICAgVGhpcyBmdW5jdGlvbiByZWFkcyBpbiBkYXRhIGZyb20gYSBnaXZlbiBmaWxlIG9uZSBsaW5lIGF0IGEgdGltZSwKICogICBjb252ZXJ0aW5nIHRoZSBkZXRlY3RlZCBuZXdsaW5lIGNoYXJhY3RlciAnXG4nIHRvIGEgbnVsbCAnXDAnLiBOb3RlIHRoYXQKICogICB0aGUgZmlsZSBkZXNjcmlwdG9yIG11c3QgYmUgdmFsaWQgYmVmb3JlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4KICoKICogIFBBUkFNRVRFUlM6CiAqCiAqICAgICAgZmlsZWRlc2MgICAgLSB0aGUgZmlsZSBkZXNjcmlwdG9yIGZvciB0aGUgb3BlbiBjb25maWd1cmF0aW9uIGZpbGUKICogICAgICBidWZmZXIgICAgICAtIGEgYnVmZmVyIHBvaW50ZXIsIHBhc3NlZCBpbiBieSB0aGUgY2FsbGVyLCB0byB3aGljaCB0aGUKICogICAgICAgICAgICAgICAgICAgIGxpbmUgd2lsbCBiZSBzdG9yZWQuCiAqCiAqICBSRVRVUk5TOgogKgogKiAgICAgIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZAogKiAgICAgIC0xIG9uIGVycm9yCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmludCByZWFkbGluZSggaW50IGZpbGVkZXNjLCBjaGFyICpidWZmZXIgKQp7CglpbnQgcmVzdWx0ID0gLTE7CglpbnQgYnl0ZXNfcmVhZCA9IDA7CgkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgoJLyogTWFrZSBzdXJlIHRoZSBmaWxlIGRlc2NyaXB0b3IgaXMgZ29vZCAqLwoJaWYgKCBmaWxlZGVzYyAhPSAtMSApIHsKCQkvKiBSZWFkIGluIGZyb20gdGhlIGZpbGUgYnl0ZSBieSBieXRlIHVudGlsIGEgbmV3bGluZSBpcyByZWFjaGVkICovCgkJd2hpbGUoKCByZXN1bHQgPSByZWFkKCBmaWxlZGVzYywgJmJ1ZmZlcltieXRlc19yZWFkXSwgMSApKSA9PSAxICkgewoJCQlpZiAoIGJ1ZmZlcltieXRlc19yZWFkXSA9PSAnXG4nICkgewoJCQkJYnVmZmVyW2J5dGVzX3JlYWRdID0gJ1wwJzsKCQkJCWJ5dGVzX3JlYWQrKzsKCQkJCWJyZWFrOwoJCQl9CgkJCWJ5dGVzX3JlYWQrKzsKCQl9Cgl9CgoJLyogUmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZCAqLwoJaWYgKCByZXN1bHQgPT0gLTEgKSB7CgkJcmV0dXJuIHJlc3VsdDsKCX0gZWxzZSB7CgkJcmV0dXJuIGJ5dGVzX3JlYWQ7Cgl9Cn0gLy8gcmVhZGxpbmUKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCXRyYW5zbGF0ZV9vcHRpb24oKQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiAgREVTQ1JJUFRJT046CiAqCiAqICAgICAgVGhpcyBmdW5jdGlvbiB0YWtlcyBhIGxpbmUgcmVhZCBpbiBmcm9tIHRoZSBjb25maWcgZmlsZSBhbmQgcGFyc2VzIG91dAogKiAgIHRoZSBrZXkvdmFsdWUgcGFpcnMuIEl0IHRoZW4gZGV0ZXJtaW5lcyB3aGljaCBrZXkgaGFzIGJlZW4gcGFyc2VkIGFuZCBzZXRzCiAqICAgdGhlIGNhcmQncyBjb25maWd1cmF0aW9uIGJhc2VkIG9uIHRoZSB2YWx1ZSBnaXZlbi4KICoKICogIFBBUkFNRVRFUlM6CiAqCiAqICAgICAgYnVmZmVyIC0gYSBidWZmZXIgY29udGFpbmluZyBhIGxpbmUgdG8gdHJhbnNsYXRlCiAqICAgICAgY29uZmlnIC0gYSBwb2ludGVyIHRvIHRoZSBkZXZpY2UncyBwcml2YXRlIGFkYXB0ZXIgc3RydWN0dXJlCiAqCiAqICBSRVRVUk5TOgogKgogKiAgICAgIE4vQQogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp2b2lkIHRyYW5zbGF0ZV9vcHRpb24oIGNoYXIgKmJ1ZmZlciwgc3RydWN0IHdsX3ByaXZhdGUgKmxwICkKewoJdW5zaWduZWQgaW50IHZhbHVlX2NvbnZlcnQgPSAwOwoJaW50IHN0cmluZ19sZW5ndGggPSAwOwoJY2hhciAqa2V5ID0gTlVMTDsKCWNoYXIgKnZhbHVlID0gTlVMTDsKCXVfY2hhciBtYWNfdmFsdWVbRVRIX0FMRU5dOwoJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKCURCR19GVU5DKCAidHJhbnNsYXRlX29wdGlvbiIgKTsKCglpZiAoIGJ1ZmZlciA9PSBOVUxMIHx8IGxwID09IE5VTEwgKSB7CgkJREJHX0VSUk9SKCBEYmdJbmZvLCAiQ29uZmlnIGZpbGUgYnVmZmVyIGFuZC9vciB3YXZlbGFuIGJ1ZmZlciBwdHIgTlVMTFxuIiApOwoJCXJldHVybjsKCX0KCglQYXJzZUNvbmZpZ0xpbmUoIGJ1ZmZlciwgJmtleSwgJnZhbHVlICk7CgoJaWYgKCBrZXkgPT0gTlVMTCB8fCB2YWx1ZSA9PSBOVUxMICkgewoJCXJldHVybjsKCX0KCgkvKiBEZXRlcm1pbmUgd2hpY2gga2V5IGl0IGlzIGFuZCBwZXJmb3JtIHRoZSBhcHByb3ByaWF0ZSBhY3Rpb24gKi8KCgkvKiBDb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgdXNlZCBpbiBhbGwgc2NlbmFyaW9zICovCiNpZiBEQkcKCS8qIGhhbmRsZSBEZWJ1Z0ZsYWcgYXMgZWFybHkgYXMgcG9zc2libGUgc28gaXQgc3RhcnRzIGl0cyBpbmZsdWVuY2UgYXMgZWFybHkKCSAqIGFzIHBvc3NpYmxlCgkgKi8KCWlmICggc3RyY21wKCBrZXksIFBBUk1fTkFNRV9ERUJVR19GTEFHICkgPT0gMCApIHsKCQlpZiAoIERlYnVnRmxhZyA9PSB+MCApIHsJCQkvL2lmIERlYnVnRmxhZyBpcyBub3Qgc3BlY2lmaWVkIG9uIHRoZSBjb21tYW5kIGxpbmUKCQkJaWYgKCBEYmdJbmZvLT5EZWJ1Z0ZsYWcgPT0gMCApIHsJLyogaWYgcGNfZGVidWcgZGlkIG5vdCBzZXQgRGVidWdGbGFnIChpLmUucGNfZGVidWcgaXMKCQkJCQkJCQkJCQkgKiBub3Qgc3BlY2lmaWVkIG9yIHNwZWNpZmllZCBvdXRzaWRlIHRoZSA0LTggcmFuZ2UKCQkJCQkJCQkJCQkgKi8KCQkJCURiZ0luZm8tPkRlYnVnRmxhZyB8PSBEQkdfREVGQVVMVFM7CgkJCX0KCQl9IGVsc2UgewoJCQlEYmdJbmZvLT5EZWJ1Z0ZsYWcgPSB3bF9hdG9pKCB2YWx1ZSApOyAvLzs/RGVidWdGbGFnOwoJCX0KCQlEYmdJbmZvLT5EZWJ1Z0ZsYWcgPSB3bF9hdG9pKCB2YWx1ZSApOyAvLzs/RGVsZXRlIEFTQVAKCX0KI2VuZGlmIC8qIERCRyAqLwoJaWYgKCBzdHJjbXAoIGtleSwgUEFSTV9OQU1FX0FVVEhfS0VZX01HTVRfU1VJVEUgKSA9PSAwICkgewoJCURCR19UUkFDRSggRGJnSW5mbywgIiVzLCB2YWx1ZTogJXNcbiIsIFBBUk1fTkFNRV9BVVRIX0tFWV9NR01UX1NVSVRFLCB2YWx1ZSApOwoKCQl2YWx1ZV9jb252ZXJ0ID0gd2xfYXRvaSggdmFsdWUgKTsKCQlpZiAoKCB2YWx1ZV9jb252ZXJ0ID49IFBBUk1fTUlOX0FVVEhfS0VZX01HTVRfU1VJVEUgKSB8fCAoIHZhbHVlX2NvbnZlcnQgPD0gUEFSTV9NQVhfQVVUSF9LRVlfTUdNVF9TVUlURSApKSB7CgkJCWxwLT5BdXRoS2V5TWdtdFN1aXRlID0gdmFsdWVfY29udmVydDsKCQl9IGVsc2UgewoJCQlEQkdfV0FSTklORyggRGJnSW5mbywgIiVzIGludmFsaWQ7IHdpbGwgYmUgaWdub3JlZFxuIiwgUEFSTV9OQU1FX0FVVEhfS0VZX01HTVRfU1VJVEUgKTsKCQl9Cgl9CgllbHNlIGlmICggc3RyY21wKCBrZXksIFBBUk1fTkFNRV9CUlNDXzJHSFogKSA9PSAwICkgewoJCURCR19UUkFDRSggRGJnSW5mbywgIiVzLCB2YWx1ZTogJXNcbiIsIFBBUk1fTkFNRV9CUlNDXzJHSFosIHZhbHVlICk7CgoJCXZhbHVlX2NvbnZlcnQgPSB3bF9hdG9pKCB2YWx1ZSApOwoJCWlmICgoIHZhbHVlX2NvbnZlcnQgPj0gUEFSTV9NSU5fQlJTQyApIHx8ICggdmFsdWVfY29udmVydCA8PSBQQVJNX01BWF9CUlNDICkpIHsKCQkJbHAtPmJyc2NbMF0gPSB2YWx1ZV9jb252ZXJ0OwoJCX0gZWxzZSB7CgkJCURCR19XQVJOSU5HKCBEYmdJbmZvLCAiJXMgaW52YWlkOyB3aWxsIGJlIGlnbm9yZWRcbiIsIFBBUk1fTkFNRV9CUlNDXzJHSFogKTsKCQl9Cgl9CgllbHNlIGlmICggc3RyY21wKCBrZXksIFBBUk1fTkFNRV9CUlNDXzVHSFogKSA9PSAwICkgewoJCURCR19UUkFDRSggRGJnSW5mbywgIiVzLCB2YWx1ZTogJXNcbiIsIFBBUk1fTkFNRV9CUlNDXzVHSFosIHZhbHVlICk7CgoJCXZhbHVlX2NvbnZlcnQgPSB3bF9hdG9pKCB2YWx1ZSApOwoJCWlmICgoIHZhbHVlX2NvbnZlcnQgPj0gUEFSTV9NSU5fQlJTQyApIHx8ICggdmFsdWVfY29udmVydCA8PSBQQVJNX01BWF9CUlNDICkpIHsKCQkJbHAtPmJyc2NbMV0gPSB2YWx1ZV9jb252ZXJ0OwoJCX0gZWxzZSB7CgkJCURCR19XQVJOSU5HKCBEYmdJbmZvLCAiJXMgaW52YWlkOyB3aWxsIGJlIGlnbm9yZWRcbiIsIFBBUk1fTkFNRV9CUlNDXzVHSFogKTsKCQl9Cgl9CgllbHNlIGlmICgoIHN0cmNtcCgga2V5LCBQQVJNX05BTUVfREVTSVJFRF9TU0lEICkgPT0gMCApIHx8ICggc3RyY21wKCBrZXksIFBBUk1fTkFNRV9PV05fU1NJRCApID09IDAgKSkgewoJCURCR19UUkFDRSggRGJnSW5mbywgIlNTSUQsIHZhbHVlOiAlc1xuIiwgdmFsdWUgKTsKCgkJbWVtc2V0KCBscC0+TmV0d29ya05hbWUsIDAsICggUEFSTV9NQVhfTkFNRV9MRU4gKyAxICkpOwoKCQkvKiBNYWtlIHN1cmUgdGhlIHZhbHVlIGlzbid0IHRvbyBsb25nICovCgkJc3RyaW5nX2xlbmd0aCA9IHN0cmxlbiggdmFsdWUgKTsKCQlpZiAoIHN0cmluZ19sZW5ndGggPiBQQVJNX01BWF9OQU1FX0xFTiApIHsKCQkJREJHX1dBUk5JTkcoIERiZ0luZm8sICJTU0lEIHRvbyBsb25nOyB3aWxsIGJlIHRydW5jYXRlZFxuIiApOwoJCQlzdHJpbmdfbGVuZ3RoID0gUEFSTV9NQVhfTkFNRV9MRU47CgkJfQoKCQltZW1jcHkoIGxwLT5OZXR3b3JrTmFtZSwgdmFsdWUsIHN0cmluZ19sZW5ndGggKTsKCX0KI2lmIDAKCWVsc2UgaWYgKCBzdHJjbXAoIGtleSwgUEFSTV9OQU1FX0RPV05MT0FEX0ZJUk1XQVJFICkgPT0gMCApIHsKCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJET1dOTE9BRF9GSVJNV0FSRSwgdmFsdWU6ICVzXG4iLCB2YWx1ZSApOwoJCW1lbXNldCggbHAtPmZ3X2ltYWdlX2ZpbGVuYW1lLCAwLCAoIE1BWF9MSU5FX1NJWkUgKyAxICkpOwoJCS8qIE1ha2Ugc3VyZSB0aGUgdmFsdWUgaXNuJ3QgdG9vIGxvbmcgKi8KCQlzdHJpbmdfbGVuZ3RoID0gc3RybGVuKCB2YWx1ZSApOwoJCWlmICggc3RyaW5nX2xlbmd0aCA+IE1BWF9MSU5FX1NJWkUgKSB7CgkJCURCR19XQVJOSU5HKCBEYmdJbmZvLCAiRi9XIGltYWdlIGZpbGUgbmFtZSB0b28gbG9uZzsgd2lsbCBiZSBpZ25vcmVkXG4iICk7CgkJfSBlbHNlIHsKCQkJbWVtY3B5KCBscC0+ZndfaW1hZ2VfZmlsZW5hbWUsIHZhbHVlLCBzdHJpbmdfbGVuZ3RoICk7CgkJfQoJfQojZW5kaWYKCWVsc2UgaWYgKCBzdHJjbXAoIGtleSwgUEFSTV9OQU1FX0VOQUJMRV9FTkNSWVBUSU9OICkgPT0gMCApIHsKCQlEQkdfVFJBQ0UoIERiZ0luZm8sICIlcywgdmFsdWU6ICVzXG4iLCBQQVJNX05BTUVfRU5BQkxFX0VOQ1JZUFRJT04sIHZhbHVlICk7CgoJCXZhbHVlX2NvbnZlcnQgPSB3bF9hdG9pKCB2YWx1ZSApOwoJCWlmICgoIHZhbHVlX2NvbnZlcnQgPj0gUEFSTV9NSU5fRU5BQkxFX0VOQ1JZUFRJT04gKSAmJiAoIHZhbHVlX2NvbnZlcnQgPD0gUEFSTV9NQVhfRU5BQkxFX0VOQ1JZUFRJT04gKSkgewoJCQlscC0+RW5hYmxlRW5jcnlwdGlvbiA9IHZhbHVlX2NvbnZlcnQ7CgkJfSBlbHNlIHsKCQkJREJHX1dBUk5JTkcoIERiZ0luZm8sICIlcyBpbnZhbGlkOyB3aWxsIGJlIGlnbm9yZWRcbiIsIFBBUk1fTkFNRV9FTkFCTEVfRU5DUllQVElPTiApOwoJCX0KCX0KCWVsc2UgaWYgKCBzdHJjbXAoIGtleSwgUEFSTV9OQU1FX0VOQ1JZUFRJT04gKSA9PSAwICkgewoJCURCR19UUkFDRSggRGJnSW5mbywgIiVzLCB2YWx1ZTogJXNcbiIsIFBBUk1fTkFNRV9FTkNSWVBUSU9OLCB2YWx1ZSApOwoKCQltZW1zZXQoIGxwLT5zekVuY3J5cHRpb24sIDAsIHNpemVvZiggbHAtPnN6RW5jcnlwdGlvbiApKTsKCgkJLyogTWFrZSBzdXJlIHRoZSB2YWx1ZSBpc24ndCB0b28gbG9uZyAqLwoJCXN0cmluZ19sZW5ndGggPSBzdHJsZW4oIHZhbHVlICk7CgkJaWYgKCBzdHJpbmdfbGVuZ3RoID4gc2l6ZW9mKCBscC0+c3pFbmNyeXB0aW9uICkgKSB7CgkJCURCR19XQVJOSU5HKCBEYmdJbmZvLCAiJXMgdG9vIGxvbmc7IHdpbGwgYmUgdHJ1bmNhdGVkXG4iLCBQQVJNX05BTUVfRU5DUllQVElPTiApOwoJCQlzdHJpbmdfbGVuZ3RoID0gc2l6ZW9mKCBscC0+c3pFbmNyeXB0aW9uICk7CgkJfQoKCQltZW1jcHkoIGxwLT5zekVuY3J5cHRpb24sIHZhbHVlLCBzdHJpbmdfbGVuZ3RoICk7Cgl9CgllbHNlIGlmICggc3RyY21wKCBrZXksIFBBUk1fTkFNRV9LRVkxICkgPT0gMCApIHsKCQlEQkdfVFJBQ0UoIERiZ0luZm8sICIlcywgdmFsdWU6ICVzXG4iLCBQQVJNX05BTUVfS0VZMSwgdmFsdWUgKTsKCgkJaWYgKCBpc192YWxpZF9rZXlfc3RyaW5nKCB2YWx1ZSApKSB7CgkJCW1lbXNldCggbHAtPkRlZmF1bHRLZXlzLmtleVswXS5rZXksIDAsIE1BWF9LRVlfU0laRSApOwoKCQkJa2V5X3N0cmluZzJrZXkoIHZhbHVlLCAmbHAtPkRlZmF1bHRLZXlzLmtleVswXSApOwoJCX0gZWxzZSB7CgkJCSBEQkdfV0FSTklORyggRGJnSW5mbywgIiVzIGludmFsaWQ7IHdpbGwgYmUgaWdub3JlZFxuIiwgUEFSTV9OQU1FX0tFWTEgKTsKCQl9Cgl9CgllbHNlIGlmICggc3RyY21wKCBrZXksIFBBUk1fTkFNRV9LRVkyICkgPT0gMCApIHsKCQlEQkdfVFJBQ0UoIERiZ0luZm8sICIlcywgdmFsdWU6ICVzXG4iLCBQQVJNX05BTUVfS0VZMiwgdmFsdWUgKTsKCgkJaWYgKCBpc192YWxpZF9rZXlfc3RyaW5nKCB2YWx1ZSApKSB7CgkJCW1lbXNldCggbHAtPkRlZmF1bHRLZXlzLmtleVsxXS5rZXksIDAsIE1BWF9LRVlfU0laRSApOwoKCQkJa2V5X3N0cmluZzJrZXkoIHZhbHVlLCAmbHAtPkRlZmF1bHRLZXlzLmtleVsxXSApOwoJCX0gZWxzZSB7CgkJCSBEQkdfV0FSTklORyggRGJnSW5mbywgIiVzIGludmFsaWQ7IHdpbGwgYmUgaWdub3JlZFxuIiwgUEFSTV9OQU1FX0tFWTIgKTsKCQl9Cgl9CgllbHNlIGlmICggc3RyY21wKCBrZXksIFBBUk1fTkFNRV9LRVkzICkgPT0gMCApIHsKCQlEQkdfVFJBQ0UoIERiZ0luZm8sICIlcywgdmFsdWU6ICVzXG4iLCBQQVJNX05BTUVfS0VZMywgdmFsdWUgKTsKCgkJaWYgKCBpc192YWxpZF9rZXlfc3RyaW5nKCB2YWx1ZSApKSB7CgkJCW1lbXNldCggbHAtPkRlZmF1bHRLZXlzLmtleVsyXS5rZXksIDAsIE1BWF9LRVlfU0laRSApOwoKCQkJa2V5X3N0cmluZzJrZXkoIHZhbHVlLCAmbHAtPkRlZmF1bHRLZXlzLmtleVsyXSApOwoJCX0gZWxzZSB7CgkJCSBEQkdfV0FSTklORyggRGJnSW5mbywgIiVzIGludmFsaWQ7IHdpbGwgYmUgaWdub3JlZFxuIiwgUEFSTV9OQU1FX0tFWTMgKTsKCQl9Cgl9CgllbHNlIGlmICggc3RyY21wKCBrZXksIFBBUk1fTkFNRV9LRVk0ICkgPT0gMCApIHsKCQlEQkdfVFJBQ0UoIERiZ0luZm8sICIlcywgdmFsdWU6ICVzXG4iLCBQQVJNX05BTUVfS0VZNCwgdmFsdWUgKTsKCgkJaWYgKCBpc192YWxpZF9rZXlfc3RyaW5nKCB2YWx1ZSApKSB7CgkJCW1lbXNldCggbHAtPkRlZmF1bHRLZXlzLmtleVszXS5rZXksIDAsIE1BWF9LRVlfU0laRSApOwoKCQkJa2V5X3N0cmluZzJrZXkoIHZhbHVlLCAmbHAtPkRlZmF1bHRLZXlzLmtleVszXSApOwoJCX0gZWxzZSB7CgkJCSBEQkdfV0FSTklORyggRGJnSW5mbywgIiVzIGludmFsaWQ7IHdpbGwgYmUgaWdub3JlZFxuIiwgUEFSTV9OQU1FX0tFWTQgKTsKCQl9Cgl9CgkvKiBOZXcgUGFyYW1ldGVycyBmb3IgV0FSUCAqLwoJZWxzZSBpZiAoIHN0cmNtcCgga2V5LCBQQVJNX05BTUVfTE9BRF9CQUxBTkNJTkcgKSA9PSAwICkgewoJCURCR19UUkFDRSggRGJnSW5mbywgIiVzLCB2YWx1ZTogJXNcbiIsIFBBUk1fTkFNRV9MT0FEX0JBTEFOQ0lORywgdmFsdWUgKTsKCQlscC0+bG9hZEJhbGFuY2luZyA9IHBhcnNlX3llc19ubyh2YWx1ZSk7Cgl9CgllbHNlIGlmICggc3RyY21wKCBrZXksIFBBUk1fTkFNRV9NRURJVU1fRElTVFJJQlVUSU9OICkgPT0gMCApIHsKCQlEQkdfVFJBQ0UoIERiZ0luZm8sICIlcywgdmFsdWU6ICVzXG4iLCBQQVJNX05BTUVfTUVESVVNX0RJU1RSSUJVVElPTiwgdmFsdWUgKTsKCQlscC0+bWVkaXVtRGlzdHJpYnV0aW9uID0gcGFyc2VfeWVzX25vKHZhbHVlKTsKCX0KCWVsc2UgaWYgKCBzdHJjbXAoIGtleSwgUEFSTV9OQU1FX01JQ1JPV0FWRV9ST0JVU1RORVNTKSA9PSAwICkgewoJCURCR19UUkFDRSggRGJnSW5mbywgIiVzLCB2YWx1ZTogJXNcbiIsIFBBUk1fTkFNRV9NSUNST1dBVkVfUk9CVVNUTkVTUywgdmFsdWUgKTsKCQlscC0+TWljcm93YXZlUm9idXN0bmVzcyA9IHBhcnNlX3llc19ubyh2YWx1ZSk7Cgl9CgllbHNlIGlmICggc3RyY21wKCBrZXksIFBBUk1fTkFNRV9NVUxUSUNBU1RfUkFURSApID09IDAgKSB7CgkJREJHX1RSQUNFKCBEYmdJbmZvLCAiJXMsIHZhbHVlOiAlc1xuIiwgUEFSTV9OQU1FX01VTFRJQ0FTVF9SQVRFLCB2YWx1ZSApOwoKCQl2YWx1ZV9jb252ZXJ0ID0gd2xfYXRvaSggdmFsdWUgKTsKCgkJaWYgKCggdmFsdWVfY29udmVydCA+PSBQQVJNX01JTl9NVUxUSUNBU1RfUkFURSApICYmICggdmFsdWVfY29udmVydCA8PSBQQVJNX01BWF9NVUxUSUNBU1RfUkFURSApKSB7CgkJCWxwLT5NdWx0aWNhc3RSYXRlWzBdID0gdmFsdWVfY29udmVydDsKCQl9IGVsc2UgewoJCQlEQkdfV0FSTklORyggRGJnSW5mbywgIiVzIGludmFsaWQ7IHdpbGwgYmUgaWdub3JlZFxuIiwgUEFSTV9OQU1FX01VTFRJQ0FTVF9SQVRFICk7CgkJfQoJfQoJZWxzZSBpZiAoIHN0cmNtcCgga2V5LCBQQVJNX05BTUVfT1dOX0NIQU5ORUwgKSA9PSAwICkgewoJCURCR19UUkFDRSggRGJnSW5mbywgIiVzLCB2YWx1ZTogJXNcbiIsIFBBUk1fTkFNRV9PV05fQ0hBTk5FTCwgdmFsdWUgKTsKCgkJdmFsdWVfY29udmVydCA9IHdsX2F0b2koIHZhbHVlICk7CgkJaWYgKCB3bF9pc19hX3ZhbGlkX2NoYW4oIHZhbHVlX2NvbnZlcnQgKSkgewoJCQlpZiAoIHZhbHVlX2NvbnZlcnQgPiAxNCApIHsKCQkJCXZhbHVlX2NvbnZlcnQgPSB2YWx1ZV9jb252ZXJ0IHwgMHgxMDA7CgkJCX0KCQkJbHAtPkNoYW5uZWwgPSB2YWx1ZV9jb252ZXJ0OwoJCX0gZWxzZSB7CgkJCURCR19XQVJOSU5HKCBEYmdJbmZvLCAiJXMgaW52YWxpZDsgd2lsbCBiZSBpZ25vcmVkXG4iLCBQQVJNX05BTUVfT1dOX0NIQU5ORUwgKTsKCQl9Cgl9CgllbHNlIGlmICggc3RyY21wKCBrZXksIFBBUk1fTkFNRV9PV05fTkFNRSApID09IDAgKSB7CgkJREJHX1RSQUNFKCBEYmdJbmZvLCAiJXMsIHZhbHVlOiAlc1xuIiwgUEFSTV9OQU1FX09XTl9OQU1FLCB2YWx1ZSApOwoKCQltZW1zZXQoIGxwLT5TdGF0aW9uTmFtZSwgMCwgKCBQQVJNX01BWF9OQU1FX0xFTiArIDEgKSk7CgoJCS8qIE1ha2Ugc3VyZSB0aGUgdmFsdWUgaXNuJ3QgdG9vIGxvbmcgKi8KCQlzdHJpbmdfbGVuZ3RoID0gc3RybGVuKCB2YWx1ZSApOwoJCWlmICggc3RyaW5nX2xlbmd0aCA+IFBBUk1fTUFYX05BTUVfTEVOICkgewoJCQlEQkdfV0FSTklORyggRGJnSW5mbywgIiVzIHRvbyBsb25nOyB3aWxsIGJlIHRydW5jYXRlZFxuIiwgUEFSTV9OQU1FX09XTl9OQU1FICk7CgkJCXN0cmluZ19sZW5ndGggPSBQQVJNX01BWF9OQU1FX0xFTjsKCQl9CgoJCW1lbWNweSggbHAtPlN0YXRpb25OYW1lLCB2YWx1ZSwgc3RyaW5nX2xlbmd0aCApOwoJfQoJZWxzZSBpZiAoIHN0cmNtcCgga2V5LCBQQVJNX05BTUVfUlRTX1RIUkVTSE9MRCApID09IDAgKSB7CgkJREJHX1RSQUNFKCBEYmdJbmZvLCAiJXMsIHZhbHVlOiAlc1xuIiwgUEFSTV9OQU1FX1JUU19USFJFU0hPTEQsIHZhbHVlICk7CgoJCXZhbHVlX2NvbnZlcnQgPSB3bF9hdG9pKCB2YWx1ZSApOwoJCWlmICgoIHZhbHVlX2NvbnZlcnQgPj0gUEFSTV9NSU5fUlRTX1RIUkVTSE9MRCApICYmICggdmFsdWVfY29udmVydCA8PSBQQVJNX01BWF9SVFNfVEhSRVNIT0xEICkpIHsKCQkJbHAtPlJUU1RocmVzaG9sZCA9IHZhbHVlX2NvbnZlcnQ7CgkJfSBlbHNlIHsKCQkJREJHX1dBUk5JTkcoIERiZ0luZm8sICIlcyBpbnZhbGlkOyB3aWxsIGJlIGlnbm9yZWRcbiIsIFBBUk1fTkFNRV9SVFNfVEhSRVNIT0xEICk7CgkJfQoJfQoJZWxzZSBpZiAoIHN0cmNtcCgga2V5LCBQQVJNX05BTUVfU1JTQ18yR0haICkgPT0gMCApIHsKCQlEQkdfVFJBQ0UoIERiZ0luZm8sICIlcywgdmFsdWU6ICVzXG4iLCBQQVJNX05BTUVfU1JTQ18yR0haLCB2YWx1ZSApOwoKCQl2YWx1ZV9jb252ZXJ0ID0gd2xfYXRvaSggdmFsdWUgKTsKCQlpZiAoKCB2YWx1ZV9jb252ZXJ0ID49IFBBUk1fTUlOX1NSU0MgKSB8fCAoIHZhbHVlX2NvbnZlcnQgPD0gUEFSTV9NQVhfU1JTQyApKSB7CgkJCWxwLT5zcnNjWzBdID0gdmFsdWVfY29udmVydDsKCQl9IGVsc2UgewoJCQlEQkdfV0FSTklORyggRGJnSW5mbywgIiVzIGludmFpZDsgd2lsbCBiZSBpZ25vcmVkXG4iLCBQQVJNX05BTUVfU1JTQ18yR0haICk7CgkJfQoJfQoJZWxzZSBpZiAoIHN0cmNtcCgga2V5LCBQQVJNX05BTUVfU1JTQ181R0haICkgPT0gMCApIHsKCQlEQkdfVFJBQ0UoIERiZ0luZm8sICIlcywgdmFsdWU6ICVzXG4iLCBQQVJNX05BTUVfU1JTQ181R0haLCB2YWx1ZSApOwoKCQl2YWx1ZV9jb252ZXJ0ID0gd2xfYXRvaSggdmFsdWUgKTsKCQlpZiAoKCB2YWx1ZV9jb252ZXJ0ID49IFBBUk1fTUlOX1NSU0MgKSB8fCAoIHZhbHVlX2NvbnZlcnQgPD0gUEFSTV9NQVhfU1JTQyApKSB7CgkJCWxwLT5zcnNjWzFdID0gdmFsdWVfY29udmVydDsKCQl9IGVsc2UgewoJCQlEQkdfV0FSTklORyggRGJnSW5mbywgIiVzIGludmFpZDsgd2lsbCBiZSBpZ25vcmVkXG4iLCBQQVJNX05BTUVfU1JTQ181R0haICk7CgkJfQoJfQoJZWxzZSBpZiAoIHN0cmNtcCgga2V5LCBQQVJNX05BTUVfU1lTVEVNX1NDQUxFICkgPT0gMCApIHsKCQlEQkdfVFJBQ0UoIERiZ0luZm8sICIlcywgdmFsdWU6ICVzXG4iLCBQQVJNX05BTUVfU1lTVEVNX1NDQUxFLCB2YWx1ZSApOwoKCQl2YWx1ZV9jb252ZXJ0ID0gd2xfYXRvaSggdmFsdWUgKTsKCQlpZiAoKCB2YWx1ZV9jb252ZXJ0ID49IFBBUk1fTUlOX1NZU1RFTV9TQ0FMRSApICYmICggdmFsdWVfY29udmVydCA8PSBQQVJNX01BWF9TWVNURU1fU0NBTEUgKSkgewoJCQlscC0+RGlzdGFuY2VCZXR3ZWVuQVBzID0gdmFsdWVfY29udmVydDsKCQl9IGVsc2UgewoJCQlEQkdfV0FSTklORyggRGJnSW5mbywgIiVzIGludmFsaWQ7IHdpbGwgYmUgaWdub3JlZFxuIiwgUEFSTV9OQU1FX1NZU1RFTV9TQ0FMRSApOwoJCX0KCX0KCWVsc2UgaWYgKCBzdHJjbXAoIGtleSwgUEFSTV9OQU1FX1RYX0tFWSApID09IDAgKSB7CgkJREJHX1RSQUNFKCBEYmdJbmZvLCAiJXMsIHZhbHVlOiAlc1xuIiwgUEFSTV9OQU1FX1RYX0tFWSwgdmFsdWUgKTsKCgkJdmFsdWVfY29udmVydCA9IHdsX2F0b2koIHZhbHVlICk7CgkJaWYgKCggdmFsdWVfY29udmVydCA+PSBQQVJNX01JTl9UWF9LRVkgKSAmJiAoIHZhbHVlX2NvbnZlcnQgPD0gUEFSTV9NQVhfVFhfS0VZICkpIHsKCQkJbHAtPlRyYW5zbWl0S2V5SUQgPSB3bF9hdG9pKCB2YWx1ZSApOwoJCX0gZWxzZSB7CgkJCURCR19XQVJOSU5HKCBEYmdJbmZvLCAiJXMgaW52YWxpZDsgd2lsbCBiZSBpZ25vcmVkXG4iLCBQQVJNX05BTUVfVFhfS0VZICk7CgkJfQoJfQoJZWxzZSBpZiAoIHN0cmNtcCgga2V5LCBQQVJNX05BTUVfVFhfUkFURSApID09IDAgKSB7CgkJREJHX1RSQUNFKCBEYmdJbmZvLCAiJXMsIHZhbHVlOiAlc1xuIiwgUEFSTV9OQU1FX1RYX1JBVEUsIHZhbHVlICk7CgoJCXZhbHVlX2NvbnZlcnQgPSB3bF9hdG9pKCB2YWx1ZSApOwoJCWlmICgoIHZhbHVlX2NvbnZlcnQgPj0gUEFSTV9NSU5fVFhfUkFURSApICYmICggdmFsdWVfY29udmVydCA8PSBQQVJNX01BWF9UWF9SQVRFICkpIHsKCQkJbHAtPlR4UmF0ZUNvbnRyb2xbMF0gPSB2YWx1ZV9jb252ZXJ0OwoJCX0gZWxzZSB7CgkJCURCR19XQVJOSU5HKCBEYmdJbmZvLCAiJXMgaW52YWxpZDsgd2lsbCBiZSBpZ25vcmVkXG4iLCBQQVJNX05BTUVfVFhfUkFURSApOwoJCX0KCX0KCWVsc2UgaWYgKCBzdHJjbXAoIGtleSwgUEFSTV9OQU1FX1RYX1BPV19MRVZFTCApID09IDAgKSB7CgkJREJHX1RSQUNFKCBEYmdJbmZvLCAiJXMsIHZhbHVlOiAlc1xuIiwgUEFSTV9OQU1FX1RYX1BPV19MRVZFTCwgdmFsdWUgKTsKCgkJdmFsdWVfY29udmVydCA9IHdsX2F0b2koIHZhbHVlICk7CgkJaWYgKCggdmFsdWVfY29udmVydCA+PSBQQVJNX01JTl9UWF9QT1dfTEVWRUwgKSB8fCAoIHZhbHVlX2NvbnZlcnQgPD0gUEFSTV9NQVhfVFhfUE9XX0xFVkVMICkpIHsKCQkJbHAtPnR4UG93TGV2ZWwgPSB2YWx1ZV9jb252ZXJ0OwoJCX0gZWxzZSB7CgkJCURCR19XQVJOSU5HKCBEYmdJbmZvLCAiJXMgaW52YWxpZDsgd2lsbCBiZSBpZ25vcmVkXG4iLCBQQVJNX05BTUVfVFhfUE9XX0xFVkVMICk7CgkJfQoJfQoKCS8qIE5lZWQgdG8gYWRkPyA6IENvdW50cnkgY29kZSwgU2hvcnQvTG9uZyByZXRyeSAqLwoKCS8qIENvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyBzcGVjaWZpYyB0byBTVEEgbW9kZSAqLwojaWYgMSAvLzs/IChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9TVEEKLy87P3NlZW1zIHJlYXNvbmFibGUgdGhhdCBldmVuIGFuIEFQLW9ubHkgZHJpdmVyIGNvdWxkIGFmZm9yZCB0aGlzIHNtYWxsIGFkZGl0aW9uYWwgZm9vdHByaW50CglpZiAoIENOVl9JTlRfVE9fTElUVExFKCBscC0+aGNmQ3R4LklGQl9GV0lkZW50aXR5LmNvbXBfaWQgKSA9PSBDT01QX0lEX0ZXX1NUQSAgKSB7CgkJCQkJLy87P3Nob3VsZCB3ZSByZXR1cm4gYW4gZXJyb3Igc3RhdHVzIGluIEFQIG1vZGUKCQlpZiAoIHN0cmNtcCgga2V5LCBQQVJNX05BTUVfUE9SVF9UWVBFICkgPT0gMCApIHsKCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiJXMsIHZhbHVlOiAlc1xuIiwgUEFSTV9OQU1FX1BPUlRfVFlQRSwgdmFsdWUgKTsKCgkJCXZhbHVlX2NvbnZlcnQgPSB3bF9hdG9pKCB2YWx1ZSApOwoJCQlpZiAoKCB2YWx1ZV9jb252ZXJ0ID09IFBBUk1fTUlOX1BPUlRfVFlQRSApIHx8ICggdmFsdWVfY29udmVydCA9PSBQQVJNX01BWF9QT1JUX1RZUEUgKSkgewoJCQkJbHAtPlBvcnRUeXBlID0gdmFsdWVfY29udmVydDsKCQkJfSBlbHNlIHsKCQkJCURCR19XQVJOSU5HKCBEYmdJbmZvLCAiJXMgaW52YWxpZDsgd2lsbCBiZSBpZ25vcmVkXG4iLCBQQVJNX05BTUVfUE9SVF9UWVBFICk7CgkJCX0KCQl9CgkJZWxzZSBpZiAoIHN0cmNtcCgga2V5LCBQQVJNX05BTUVfUE1fRU5BQkxFRCApID09IDAgKSB7CgkJCURCR19UUkFDRSggRGJnSW5mbywgIiVzLCB2YWx1ZTogJXNcbiIsIFBBUk1fTkFNRV9QTV9FTkFCTEVELCB2YWx1ZSApOwoJCQl2YWx1ZV9jb252ZXJ0ID0gd2xfYXRvaSggdmFsdWUgKTsKCS8qIDs/IGhvdyBhYm91dCB3bF9tYWluLmMgY29udGFpbmluZwoJICogVkFMSURfUEFSQU0oIFBBUk1fUE1fRU5BQkxFRCA8PSBXVkxBTl9QTV9TVEFURV9TVEFOREFSRCB8fAoJICoJCQkJCSAoIFBBUk1fUE1fRU5BQkxFRCAmIDB4N0ZGRiApIDw9IFdWTEFOX1BNX1NUQVRFX1NUQU5EQVJEICk7CgkgKi8KCQkJaWYgKCAoIHZhbHVlX2NvbnZlcnQgJiAweDdGRkYgKSA8PSBQQVJNX01BWF9QTV9FTkFCTEVEKSB7CgkJCQlscC0+UE1FbmFibGVkID0gdmFsdWVfY29udmVydDsKCQkJfSBlbHNlIHsKCQkJCURCR19XQVJOSU5HKCBEYmdJbmZvLCAiJXMgaW52YWxpZDsgd2lsbCBiZSBpZ25vcmVkXG4iLCBQQVJNX05BTUVfUE1fRU5BQkxFRCApOwoJCQkJLy87P3RoaXMgaXMgYSBkYXRhIGVudHJ5IGVycm9yLCBoZW5jZSBub3QgYSBEQkdfV0FSTklORwoJCQl9CgkJfQoJCWVsc2UgaWYgKCBzdHJjbXAoIGtleSwgUEFSTV9OQU1FX0NSRUFURV9JQlNTICkgPT0gMCApIHsKCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiJXMsIHZhbHVlOiAlc1xuIiwgUEFSTV9OQU1FX0NSRUFURV9JQlNTLCB2YWx1ZSApOwoJCQlscC0+Q3JlYXRlSUJTUyA9IHBhcnNlX3llc19ubyh2YWx1ZSk7CgkJfQoJCWVsc2UgaWYgKCBzdHJjbXAoIGtleSwgUEFSTV9OQU1FX01VTFRJQ0FTVF9SWCApID09IDAgKSB7CgkJCURCR19UUkFDRSggRGJnSW5mbywgIiVzLCB2YWx1ZTogJXNcbiIsIFBBUk1fTkFNRV9NVUxUSUNBU1RfUlgsIHZhbHVlICk7CgkJCWxwLT5NdWx0aWNhc3RSZWNlaXZlID0gcGFyc2VfeWVzX25vKHZhbHVlKTsKCQl9CgkJZWxzZSBpZiAoIHN0cmNtcCgga2V5LCBQQVJNX05BTUVfTUFYX1NMRUVQICkgPT0gMCApIHsKCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiJXMsIHZhbHVlOiAlc1xuIiwgUEFSTV9OQU1FX01BWF9TTEVFUCwgdmFsdWUgKTsKCgkJCXZhbHVlX2NvbnZlcnQgPSB3bF9hdG9pKCB2YWx1ZSApOwoJCQlpZiAoKCB2YWx1ZV9jb252ZXJ0ID49IDAgKSAmJiAoIHZhbHVlX2NvbnZlcnQgPD0gNjU1MzUgKSkgewoJCQkJbHAtPk1heFNsZWVwRHVyYXRpb24gPSB2YWx1ZV9jb252ZXJ0OwoJCQl9IGVsc2UgewoJCQkJREJHX1dBUk5JTkcoIERiZ0luZm8sICIlcyBpbnZhbGlkOyB3aWxsIGJlIGlnbm9yZWRcbiIsIFBBUk1fTkFNRV9NQVhfU0xFRVAgKTsKCQkJfQoJCX0KCQllbHNlIGlmICggc3RyY21wKCBrZXksIFBBUk1fTkFNRV9ORVRXT1JLX0FERFIgKSA9PSAwICkgewoJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICIlcywgdmFsdWU6ICVzXG4iLCBQQVJNX05BTUVfTkVUV09SS19BRERSLCB2YWx1ZSApOwoKCQkJaWYgKCBwYXJzZV9tYWNfYWRkcmVzcyggdmFsdWUsIG1hY192YWx1ZSApID09IEVUSF9BTEVOICkgewoJCQkJbWVtY3B5KCBscC0+TUFDQWRkcmVzcywgbWFjX3ZhbHVlLCBFVEhfQUxFTiApOwoJCQl9IGVsc2UgewoJCQkJREJHX1dBUk5JTkcoIERiZ0luZm8sICIlcyBpbnZhbGlkOyB3aWxsIGJlIGlnbm9yZWRcbiIsIFBBUk1fTkFNRV9ORVRXT1JLX0FERFIgKTsKCQkJfQoJCX0KCQllbHNlIGlmICggc3RyY21wKCBrZXksIFBBUk1fTkFNRV9BVVRIRU5USUNBVElPTiApID09IDAgKSB7CgkJCURCR19UUkFDRSggRGJnSW5mbywgIiVzLCB2YWx1ZTogJXNcbiIsIFBBUk1fTkFNRV9BVVRIRU5USUNBVElPTiwgdmFsdWUgKTsKCgkJCXZhbHVlX2NvbnZlcnQgPSB3bF9hdG9pKCB2YWx1ZSApOwoJCQlpZiAoKCB2YWx1ZV9jb252ZXJ0ID49IFBBUk1fTUlOX0FVVEhFTlRJQ0FUSU9OICkgJiYgKCB2YWx1ZV9jb252ZXJ0IDw9IFBBUk1fTUFYX0FVVEhFTlRJQ0FUSU9OICkpIHsKCQkJCWxwLT5hdXRoZW50aWNhdGlvbiA9IHZhbHVlX2NvbnZlcnQ7CgkJCX0gZWxzZSB7CgkJCQlEQkdfV0FSTklORyggRGJnSW5mbywgIiVzIGludmFsaWQ7IHdpbGwgYmUgaWdub3JlZFxuIiwgUEFSTV9OQU1FX0FVVEhFTlRJQ0FUSU9OICk7CgkJCX0KCQl9CgkJZWxzZSBpZiAoIHN0cmNtcCgga2V5LCBQQVJNX05BTUVfT1dOX0FUSU1fV0lORE9XICkgPT0gMCApIHsKCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiJXMsIHZhbHVlOiAlc1xuIiwgUEFSTV9OQU1FX09XTl9BVElNX1dJTkRPVywgdmFsdWUgKTsKCgkJCXZhbHVlX2NvbnZlcnQgPSB3bF9hdG9pKCB2YWx1ZSApOwoJCQlpZiAoKCB2YWx1ZV9jb252ZXJ0ID49IFBBUk1fTUlOX09XTl9BVElNX1dJTkRPVyApICYmICggdmFsdWVfY29udmVydCA8PSBQQVJNX01BWF9PV05fQVRJTV9XSU5ET1cgKSkgewoJCQkJbHAtPmF0aW1XaW5kb3cgPSB2YWx1ZV9jb252ZXJ0OwoJCQl9IGVsc2UgewoJCQkJREJHX1dBUk5JTkcoIERiZ0luZm8sICIlcyBpbnZhbGlkOyB3aWxsIGJlIGlnbm9yZWRcbiIsIFBBUk1fTkFNRV9PV05fQVRJTV9XSU5ET1cgKTsKCQkJfQoJCX0KCQllbHNlIGlmICggc3RyY21wKCBrZXksIFBBUk1fTkFNRV9QTV9IT0xET1ZFUl9EVVJBVElPTiApID09IDAgKSB7CgkJCURCR19UUkFDRSggRGJnSW5mbywgIiVzLCB2YWx1ZTogJXNcbiIsIFBBUk1fTkFNRV9QTV9IT0xET1ZFUl9EVVJBVElPTiwgdmFsdWUgKTsKCgkJCXZhbHVlX2NvbnZlcnQgPSB3bF9hdG9pKCB2YWx1ZSApOwoJCQlpZiAoKCB2YWx1ZV9jb252ZXJ0ID49IFBBUk1fTUlOX1BNX0hPTERPVkVSX0RVUkFUSU9OICkgJiYgKCB2YWx1ZV9jb252ZXJ0IDw9IFBBUk1fTUFYX1BNX0hPTERPVkVSX0RVUkFUSU9OICkpIHsKCQkJCWxwLT5ob2xkb3ZlckR1cmF0aW9uID0gdmFsdWVfY29udmVydDsKCQkJfSBlbHNlIHsKCQkJCURCR19XQVJOSU5HKCBEYmdJbmZvLCAiJXMgaW52YWxpZDsgd2lsbCBiZSBpZ25vcmVkXG4iLCBQQVJNX05BTUVfUE1fSE9MRE9WRVJfRFVSQVRJT04gKTsKCQkJfQoJCX0KCQllbHNlIGlmICggc3RyY21wKCBrZXksIFBBUk1fTkFNRV9QUk9NSVNDVU9VU19NT0RFICkgPT0gMCApIHsKCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiJXMsIHZhbHVlOiAlc1xuIiwgUEFSTV9OQU1FX1BST01JU0NVT1VTX01PREUsIHZhbHVlICk7CgkJCWxwLT5wcm9taXNjdW91c01vZGUgPSBwYXJzZV95ZXNfbm8odmFsdWUpOwoJCX0KCQllbHNlIGlmICggc3RyY21wKCBrZXksIFBBUk1fTkFNRV9DT05ORUNUSU9OX0NPTlRST0wgKSA9PSAwICkgewoJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICIlcywgdmFsdWU6ICVzXG4iLCBQQVJNX05BTUVfQ09OTkVDVElPTl9DT05UUk9MLCB2YWx1ZSApOwoKCQkJdmFsdWVfY29udmVydCA9IHdsX2F0b2koIHZhbHVlICk7CgkJCWlmICgoIHZhbHVlX2NvbnZlcnQgPj0gUEFSTV9NSU5fQ09OTkVDVElPTl9DT05UUk9MICkgJiYgKCB2YWx1ZV9jb252ZXJ0IDw9IFBBUk1fTUFYX0NPTk5FQ1RJT05fQ09OVFJPTCApKSB7CgkJCQlscC0+Y29ubmVjdGlvbkNvbnRyb2wgPSB2YWx1ZV9jb252ZXJ0OwoJCQl9IGVsc2UgewoJCQkJREJHX1dBUk5JTkcoIERiZ0luZm8sICIlcyBpbnZhbGlkOyB3aWxsIGJlIGlnbm9yZWRcbiIsIFBBUk1fTkFNRV9DT05ORUNUSU9OX0NPTlRST0wgKTsKCQkJfQoJCX0KCgkJLyogTmVlZCB0byBhZGQ/IDogUHJvYmUgRGF0YSBSYXRlICovCgl9CiNlbmRpZiAgLyogKEhDRl9UWVBFKSAmIEhDRl9UWVBFX1NUQSAqLwoKCS8qIENvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyBzcGVjaWZpYyB0byBBUCBtb2RlICovCiNpZiAxIC8vOz8gKEhDRl9UWVBFKSAmIEhDRl9UWVBFX0FQCgkJLy87P3Nob3VsZCB3ZSByZXN0b3JlIHRoaXMgdG8gYWxsb3cgc21hbGxlciBtZW1vcnkgZm9vdHByaW50CglpZiAoIENOVl9JTlRfVE9fTElUVExFKCBscC0+aGNmQ3R4LklGQl9GV0lkZW50aXR5LmNvbXBfaWQgKSA9PSBDT01QX0lEX0ZXX0FQICApIHsKCQlpZiAoIHN0cmNtcCgga2V5LCBQQVJNX05BTUVfT1dOX0RUSU1fUEVSSU9EICkgPT0gMCApIHsKCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiJXMsIHZhbHVlOiAlc1xuIiwgUEFSTV9OQU1FX09XTl9EVElNX1BFUklPRCwgdmFsdWUgKTsKCgkJCXZhbHVlX2NvbnZlcnQgPSB3bF9hdG9pKCB2YWx1ZSApOwoJCQlpZiAoIHZhbHVlX2NvbnZlcnQgPj0gUEFSTV9NSU5fT1dOX0RUSU1fUEVSSU9EICkgewoJCQkJbHAtPkRUSU1QZXJpb2QgPSB2YWx1ZV9jb252ZXJ0OwoJCQl9IGVsc2UgewoJCQkJREJHX1dBUk5JTkcoIERiZ0luZm8sICIlcyBpbnZhbGlkOyB3aWxsIGJlIGlnbm9yZWRcbiIsIFBBUk1fTkFNRV9PV05fRFRJTV9QRVJJT0QgKTsKCQkJfQoJCX0KCQllbHNlIGlmICggc3RyY21wKCBrZXksIFBBUk1fTkFNRV9SRUpFQ1RfQU5ZICkgPT0gMCApIHsKCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiJXMsIHZhbHVlOiAlc1xuIiwgUEFSTV9OQU1FX1JFSkVDVF9BTlksIHZhbHVlICk7CgkJCWxwLT5SZWplY3RBbnkgPSBwYXJzZV95ZXNfbm8odmFsdWUpOwoJCX0KCQllbHNlIGlmICggc3RyY21wKCBrZXksIFBBUk1fTkFNRV9FWENMVURFX1VORU5DUllQVEVEICkgPT0gMCApIHsKCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiJXMsIHZhbHVlOiAlc1xuIiwgUEFSTV9OQU1FX0VYQ0xVREVfVU5FTkNSWVBURUQsIHZhbHVlICk7CgkJCWxwLT5FeGNsdWRlVW5lbmNyeXB0ZWQgPSBwYXJzZV95ZXNfbm8odmFsdWUpOwoJCX0KCQllbHNlIGlmICggc3RyY21wKCBrZXksIFBBUk1fTkFNRV9NVUxUSUNBU1RfUE1fQlVGRkVSSU5HICkgPT0gMCApIHsKCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiJXMsIHZhbHVlOiAlc1xuIiwgUEFSTV9OQU1FX01VTFRJQ0FTVF9QTV9CVUZGRVJJTkcsIHZhbHVlICk7CgkJCWxwLT5FeGNsdWRlVW5lbmNyeXB0ZWQgPSBwYXJzZV95ZXNfbm8odmFsdWUpOwoJCX0KCQllbHNlIGlmICggc3RyY21wKCBrZXksIFBBUk1fTkFNRV9JTlRSQV9CU1NfUkVMQVkgKSA9PSAwICkgewoJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICIlcywgdmFsdWU6ICVzXG4iLCBQQVJNX05BTUVfSU5UUkFfQlNTX1JFTEFZLCB2YWx1ZSApOwoJCQlscC0+RXhjbHVkZVVuZW5jcnlwdGVkID0gcGFyc2VfeWVzX25vKHZhbHVlKTsKCQl9CgkJZWxzZSBpZiAoIHN0cmNtcCgga2V5LCBQQVJNX05BTUVfT1dOX0JFQUNPTl9JTlRFUlZBTCApID09IDAgKSB7CgkJCURCR19UUkFDRSggRGJnSW5mbywgIiVzLCB2YWx1ZTogJXNcbiIsIFBBUk1fTkFNRV9PV05fQkVBQ09OX0lOVEVSVkFMLCB2YWx1ZSApOwoKCQkJdmFsdWVfY29udmVydCA9IHdsX2F0b2koIHZhbHVlICk7CgkJCWlmICggdmFsdWVfY29udmVydCA+PSBQQVJNX01JTl9PV05fQkVBQ09OX0lOVEVSVkFMICkgewoJCQkJbHAtPm93bkJlYWNvbkludGVydmFsID0gdmFsdWVfY29udmVydDsKCQkJfSBlbHNlIHsKCQkJCURCR19XQVJOSU5HKCBEYmdJbmZvLCAiJXMgaW52YWxpZDsgd2lsbCBiZSBpZ25vcmVkXG4iLCBQQVJNX05BTUVfT1dOX0JFQUNPTl9JTlRFUlZBTCApOwoJCQl9CgkJfQoJCWVsc2UgaWYgKCBzdHJjbXAoIGtleSwgUEFSTV9OQU1FX0NPRVhJU1RFTkNFICkgPT0gMCApIHsKCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiJXMsIHZhbHVlOiAlc1xuIiwgUEFSTV9OQU1FX0NPRVhJU1RFTkNFLCB2YWx1ZSApOwoKCQkJdmFsdWVfY29udmVydCA9IHdsX2F0b2koIHZhbHVlICk7CgkJCWlmICggdmFsdWVfY29udmVydCA+PSBQQVJNX01JTl9DT0VYSVNURU5DRSApIHsKCQkJCWxwLT5jb2V4aXN0ZW5jZSA9IHZhbHVlX2NvbnZlcnQ7CgkJCX0gZWxzZSB7CgkJCQlEQkdfV0FSTklORyggRGJnSW5mbywgIiVzIGludmFsaWQ7IHdpbGwgYmUgaWdub3JlZFxuIiwgUEFSTV9OQU1FX0NPRVhJU1RFTkNFICk7CgkJCX0KCQl9CgojaWZkZWYgVVNFX1dEUwoJCWVsc2UgaWYgKCBzdHJjbXAoIGtleSwgUEFSTV9OQU1FX1JUU19USFJFU0hPTEQxICkgPT0gMCApIHsKCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiJXMsIHZhbHVlOiAlc1xuIiwgUEFSTV9OQU1FX1JUU19USFJFU0hPTEQxLCB2YWx1ZSApOwoKCQkJdmFsdWVfY29udmVydCA9IHdsX2F0b2koIHZhbHVlICk7CgkJCWlmICgoIHZhbHVlX2NvbnZlcnQgPj0gUEFSTV9NSU5fUlRTX1RIUkVTSE9MRCApICYmICggdmFsdWVfY29udmVydCA8PSBQQVJNX01BWF9SVFNfVEhSRVNIT0xEICkpIHsKCQkJCWxwLT53ZHNfcG9ydFswXS5ydHNUaHJlc2hvbGQgPSB2YWx1ZV9jb252ZXJ0OwoJCQl9IGVsc2UgewoJCQkJREJHX1dBUk5JTkcoIERiZ0luZm8sICIlcyBpbnZhbGlkOyB3aWxsIGJlIGlnbm9yZWRcbiIsIFBBUk1fTkFNRV9SVFNfVEhSRVNIT0xEMSApOwoJCQl9CgkJfQoJCWVsc2UgaWYgKCBzdHJjbXAoIGtleSwgUEFSTV9OQU1FX1JUU19USFJFU0hPTEQyICkgPT0gMCApIHsKCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiJXMsIHZhbHVlOiAlc1xuIiwgUEFSTV9OQU1FX1JUU19USFJFU0hPTEQyLCB2YWx1ZSApOwoKCQkJdmFsdWVfY29udmVydCA9IHdsX2F0b2koIHZhbHVlICk7CgkJCWlmICgoIHZhbHVlX2NvbnZlcnQgPj0gUEFSTV9NSU5fUlRTX1RIUkVTSE9MRCApICYmICggdmFsdWVfY29udmVydCA8PSBQQVJNX01BWF9SVFNfVEhSRVNIT0xEICkpIHsKCQkJCWxwLT53ZHNfcG9ydFsxXS5ydHNUaHJlc2hvbGQgPSB2YWx1ZV9jb252ZXJ0OwoJCQl9IGVsc2UgewoJCQkJREJHX1dBUk5JTkcoIERiZ0luZm8sICIlcyBpbnZhbGlkOyB3aWxsIGJlIGlnbm9yZWRcbiIsIFBBUk1fTkFNRV9SVFNfVEhSRVNIT0xEMiApOwoJCQl9CgkJfQoJCWVsc2UgaWYgKCBzdHJjbXAoIGtleSwgUEFSTV9OQU1FX1JUU19USFJFU0hPTEQzICkgPT0gMCApIHsKCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiJXMsIHZhbHVlOiAlc1xuIiwgUEFSTV9OQU1FX1JUU19USFJFU0hPTEQzLCB2YWx1ZSApOwoKCQkJdmFsdWVfY29udmVydCA9IHdsX2F0b2koIHZhbHVlICk7CgkJCWlmICgoIHZhbHVlX2NvbnZlcnQgPj0gUEFSTV9NSU5fUlRTX1RIUkVTSE9MRCApICYmICggdmFsdWVfY29udmVydCA8PSBQQVJNX01BWF9SVFNfVEhSRVNIT0xEICkpIHsKCQkJCWxwLT53ZHNfcG9ydFsyXS5ydHNUaHJlc2hvbGQgPSB2YWx1ZV9jb252ZXJ0OwoJCQl9IGVsc2UgewoJCQkJREJHX1dBUk5JTkcoIERiZ0luZm8sICIlcyBpbnZhbGlkOyB3aWxsIGJlIGlnbm9yZWRcbiIsIFBBUk1fTkFNRV9SVFNfVEhSRVNIT0xEMyApOwoJCQl9CgkJfQoJCWVsc2UgaWYgKCBzdHJjbXAoIGtleSwgUEFSTV9OQU1FX1JUU19USFJFU0hPTEQ0ICkgPT0gMCApIHsKCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiJXMsIHZhbHVlOiAlc1xuIiwgUEFSTV9OQU1FX1JUU19USFJFU0hPTEQ0LCB2YWx1ZSApOwoKCQkJdmFsdWVfY29udmVydCA9IHdsX2F0b2koIHZhbHVlICk7CgkJCWlmICgoIHZhbHVlX2NvbnZlcnQgPj0gUEFSTV9NSU5fUlRTX1RIUkVTSE9MRCApICYmICggdmFsdWVfY29udmVydCA8PSBQQVJNX01BWF9SVFNfVEhSRVNIT0xEICkpIHsKCQkJCWxwLT53ZHNfcG9ydFszXS5ydHNUaHJlc2hvbGQgPSB2YWx1ZV9jb252ZXJ0OwoJCQl9IGVsc2UgewoJCQkJREJHX1dBUk5JTkcoIERiZ0luZm8sICIlcyBpbnZhbGlkOyB3aWxsIGJlIGlnbm9yZWRcbiIsIFBBUk1fTkFNRV9SVFNfVEhSRVNIT0xENCApOwoJCQl9CgkJfQoJCWVsc2UgaWYgKCBzdHJjbXAoIGtleSwgUEFSTV9OQU1FX1JUU19USFJFU0hPTEQ1ICkgPT0gMCApIHsKCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiJXMsIHZhbHVlOiAlc1xuIiwgUEFSTV9OQU1FX1JUU19USFJFU0hPTEQ1LCB2YWx1ZSApOwoKCQkJdmFsdWVfY29udmVydCA9IHdsX2F0b2koIHZhbHVlICk7CgkJCWlmICgoIHZhbHVlX2NvbnZlcnQgPj0gUEFSTV9NSU5fUlRTX1RIUkVTSE9MRCApICYmICggdmFsdWVfY29udmVydCA8PSBQQVJNX01BWF9SVFNfVEhSRVNIT0xEICkpIHsKCQkJCWxwLT53ZHNfcG9ydFs0XS5ydHNUaHJlc2hvbGQgPSB2YWx1ZV9jb252ZXJ0OwoJCQl9IGVsc2UgewoJCQkJREJHX1dBUk5JTkcoIERiZ0luZm8sICIlcyBpbnZhbGlkOyB3aWxsIGJlIGlnbm9yZWRcbiIsIFBBUk1fTkFNRV9SVFNfVEhSRVNIT0xENSApOwoJCQl9CgkJfQoJCWVsc2UgaWYgKCBzdHJjbXAoIGtleSwgUEFSTV9OQU1FX1JUU19USFJFU0hPTEQ2ICkgPT0gMCApIHsKCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiJXMsIHZhbHVlOiAlc1xuIiwgUEFSTV9OQU1FX1JUU19USFJFU0hPTEQ2LCB2YWx1ZSApOwoKCQkJdmFsdWVfY29udmVydCA9IHdsX2F0b2koIHZhbHVlICk7CgkJCWlmICgoIHZhbHVlX2NvbnZlcnQgPj0gUEFSTV9NSU5fUlRTX1RIUkVTSE9MRCApICYmICggdmFsdWVfY29udmVydCA8PSBQQVJNX01BWF9SVFNfVEhSRVNIT0xEICkpIHsKCQkJCWxwLT53ZHNfcG9ydFs1XS5ydHNUaHJlc2hvbGQgPSB2YWx1ZV9jb252ZXJ0OwoJCQl9IGVsc2UgewoJCQkJREJHX1dBUk5JTkcoIERiZ0luZm8sICIlcyBpbnZhbGlkOyB3aWxsIGJlIGlnbm9yZWRcbiIsIFBBUk1fTkFNRV9SVFNfVEhSRVNIT0xENiApOwoJCQl9CgkJfQoJCWVsc2UgaWYgKCBzdHJjbXAoIGtleSwgUEFSTV9OQU1FX1RYX1JBVEUxICkgPT0gMCApIHsKCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiJXMsIHZhbHVlOiAlc1xuIiwgUEFSTV9OQU1FX1RYX1JBVEUxLCB2YWx1ZSApOwoKCQkJdmFsdWVfY29udmVydCA9IHdsX2F0b2koIHZhbHVlICk7CgkJCWlmICgoIHZhbHVlX2NvbnZlcnQgPj0gUEFSTV9NSU5fVFhfUkFURSApICYmICggdmFsdWVfY29udmVydCA8PSBQQVJNX01BWF9UWF9SQVRFICkpIHsKCQkJCWxwLT53ZHNfcG9ydFswXS50eFJhdGVDbnRsID0gdmFsdWVfY29udmVydDsKCQkJfSBlbHNlIHsKCQkJCURCR19XQVJOSU5HKCBEYmdJbmZvLCAiJXMgaW52YWxpZDsgd2lsbCBiZSBpZ25vcmVkXG4iLCBQQVJNX05BTUVfVFhfUkFURTEgKTsKCQkJfQoJCX0KCQllbHNlIGlmICggc3RyY21wKCBrZXksIFBBUk1fTkFNRV9UWF9SQVRFMiApID09IDAgKSB7CgkJCURCR19UUkFDRSggRGJnSW5mbywgIiVzLCB2YWx1ZTogJXNcbiIsIFBBUk1fTkFNRV9UWF9SQVRFMiwgdmFsdWUgKTsKCgkJCXZhbHVlX2NvbnZlcnQgPSB3bF9hdG9pKCB2YWx1ZSApOwoJCQlpZiAoKCB2YWx1ZV9jb252ZXJ0ID49IFBBUk1fTUlOX1RYX1JBVEUgKSAmJiAoIHZhbHVlX2NvbnZlcnQgPD0gUEFSTV9NQVhfVFhfUkFURSApKSB7CgkJCQlscC0+d2RzX3BvcnRbMV0udHhSYXRlQ250bCA9IHZhbHVlX2NvbnZlcnQ7CgkJCX0gZWxzZSB7CgkJCQlEQkdfV0FSTklORyggRGJnSW5mbywgIiVzIGludmFsaWQ7IHdpbGwgYmUgaWdub3JlZFxuIiwgUEFSTV9OQU1FX1RYX1JBVEUyICk7CgkJCX0KCQl9CgkJZWxzZSBpZiAoIHN0cmNtcCgga2V5LCBQQVJNX05BTUVfVFhfUkFURTMgKSA9PSAwICkgewoJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICIlcywgdmFsdWU6ICVzXG4iLCBQQVJNX05BTUVfVFhfUkFURTMsIHZhbHVlICk7CgoJCQl2YWx1ZV9jb252ZXJ0ID0gd2xfYXRvaSggdmFsdWUgKTsKCQkJaWYgKCggdmFsdWVfY29udmVydCA+PSBQQVJNX01JTl9UWF9SQVRFICkgJiYgKCB2YWx1ZV9jb252ZXJ0IDw9IFBBUk1fTUFYX1RYX1JBVEUgKSkgewoJCQkJbHAtPndkc19wb3J0WzJdLnR4UmF0ZUNudGwgPSB2YWx1ZV9jb252ZXJ0OwoJCQl9IGVsc2UgewoJCQkJREJHX1dBUk5JTkcoIERiZ0luZm8sICIlcyBpbnZhbGlkOyB3aWxsIGJlIGlnbm9yZWRcbiIsIFBBUk1fTkFNRV9UWF9SQVRFMyApOwoJCQl9CgkJfQoJCWVsc2UgaWYgKCBzdHJjbXAoIGtleSwgUEFSTV9OQU1FX1RYX1JBVEU0ICkgPT0gMCApIHsKCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiJXMsIHZhbHVlOiAlc1xuIiwgUEFSTV9OQU1FX1RYX1JBVEU0LCB2YWx1ZSApOwoKCQkJdmFsdWVfY29udmVydCA9IHdsX2F0b2koIHZhbHVlICk7CgkJCWlmICgoIHZhbHVlX2NvbnZlcnQgPj0gUEFSTV9NSU5fVFhfUkFURSApICYmICggdmFsdWVfY29udmVydCA8PSBQQVJNX01BWF9UWF9SQVRFICkpIHsKCQkJCWxwLT53ZHNfcG9ydFszXS50eFJhdGVDbnRsID0gdmFsdWVfY29udmVydDsKCQkJfSBlbHNlIHsKCQkJCURCR19XQVJOSU5HKCBEYmdJbmZvLCAiJXMgaW52YWxpZDsgd2lsbCBiZSBpZ25vcmVkXG4iLCBQQVJNX05BTUVfVFhfUkFURTQgKTsKCQkJfQoJCX0KCQllbHNlIGlmICggc3RyY21wKCBrZXksIFBBUk1fTkFNRV9UWF9SQVRFNSApID09IDAgKSB7CgkJCURCR19UUkFDRSggRGJnSW5mbywgIiVzLCB2YWx1ZTogJXNcbiIsIFBBUk1fTkFNRV9UWF9SQVRFNSwgdmFsdWUgKTsKCgkJCXZhbHVlX2NvbnZlcnQgPSB3bF9hdG9pKCB2YWx1ZSApOwoJCQlpZiAoKCB2YWx1ZV9jb252ZXJ0ID49IFBBUk1fTUlOX1RYX1JBVEUgKSAmJiAoIHZhbHVlX2NvbnZlcnQgPD0gUEFSTV9NQVhfVFhfUkFURSApKSB7CgkJCQlscC0+d2RzX3BvcnRbNF0udHhSYXRlQ250bCA9IHZhbHVlX2NvbnZlcnQ7CgkJCX0gZWxzZSB7CgkJCQlEQkdfV0FSTklORyggRGJnSW5mbywgIiVzIGludmFsaWQ7IHdpbGwgYmUgaWdub3JlZFxuIiwgUEFSTV9OQU1FX1RYX1JBVEU1ICk7CgkJCX0KCQl9CgkJZWxzZSBpZiAoIHN0cmNtcCgga2V5LCBQQVJNX05BTUVfVFhfUkFURTYgKSA9PSAwICkgewoJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICIlcywgdmFsdWU6ICVzXG4iLCBQQVJNX05BTUVfVFhfUkFURTYsIHZhbHVlICk7CgoJCQl2YWx1ZV9jb252ZXJ0ID0gd2xfYXRvaSggdmFsdWUgKTsKCQkJaWYgKCggdmFsdWVfY29udmVydCA+PSBQQVJNX01JTl9UWF9SQVRFICkgJiYgKCB2YWx1ZV9jb252ZXJ0IDw9IFBBUk1fTUFYX1RYX1JBVEUgKSkgewoJCQkJbHAtPndkc19wb3J0WzVdLnR4UmF0ZUNudGwgPSB2YWx1ZV9jb252ZXJ0OwoJCQl9IGVsc2UgewoJCQkJREJHX1dBUk5JTkcoIERiZ0luZm8sICIlcyBpbnZhbGlkOyB3aWxsIGJlIGlnbm9yZWRcbiIsIFBBUk1fTkFNRV9UWF9SQVRFNiApOwoJCQl9CgkJfQoJCWVsc2UgaWYgKCBzdHJjbXAoIGtleSwgUEFSTV9OQU1FX1dEU19BRERSRVNTMSApID09IDAgKSB7CgkJCURCR19UUkFDRSggRGJnSW5mbywgIiVzLCB2YWx1ZTogJXNcbiIsIFBBUk1fTkFNRV9XRFNfQUREUkVTUzEsIHZhbHVlICk7CgoJCQlpZiAoIHBhcnNlX21hY19hZGRyZXNzKCB2YWx1ZSwgbWFjX3ZhbHVlICkgPT0gRVRIX0FMRU4gKSB7CgkJCQltZW1jcHkoIGxwLT53ZHNfcG9ydFswXS53ZHNBZGRyZXNzLCBtYWNfdmFsdWUsIEVUSF9BTEVOICk7CgkJCX0gZWxzZSB7CgkJCQlEQkdfV0FSTklORyggRGJnSW5mbywgIiVzIGludmFsaWQ7IHdpbGwgYmUgaWdub3JlZFxuIiwgUEFSTV9OQU1FX1dEU19BRERSRVNTMSApOwoJCQl9CgkJfQoJCWVsc2UgaWYgKCBzdHJjbXAoIGtleSwgUEFSTV9OQU1FX1dEU19BRERSRVNTMiApID09IDAgKSB7CgkJCURCR19UUkFDRSggRGJnSW5mbywgIiVzLCB2YWx1ZTogJXNcbiIsIFBBUk1fTkFNRV9XRFNfQUREUkVTUzIsIHZhbHVlICk7CgoJCQlpZiAoIHBhcnNlX21hY19hZGRyZXNzKCB2YWx1ZSwgbWFjX3ZhbHVlICkgPT0gRVRIX0FMRU4gKSB7CgkJCQltZW1jcHkoIGxwLT53ZHNfcG9ydFsxXS53ZHNBZGRyZXNzLCBtYWNfdmFsdWUsIEVUSF9BTEVOICk7CgkJCX0gZWxzZSB7CgkJCQlEQkdfV0FSTklORyggRGJnSW5mbywgIiVzIGludmFsaWQ7IHdpbGwgYmUgaWdub3JlZFxuIiwgUEFSTV9OQU1FX1dEU19BRERSRVNTMiApOwoJCQl9CgkJfQoJCWVsc2UgaWYgKCBzdHJjbXAoIGtleSwgUEFSTV9OQU1FX1dEU19BRERSRVNTMyApID09IDAgKSB7CgkJCURCR19UUkFDRSggRGJnSW5mbywgIiVzLCB2YWx1ZTogJXNcbiIsIFBBUk1fTkFNRV9XRFNfQUREUkVTUzMsIHZhbHVlICk7CgoJCQlpZiAoIHBhcnNlX21hY19hZGRyZXNzKCB2YWx1ZSwgbWFjX3ZhbHVlICkgPT0gRVRIX0FMRU4gKSB7CgkJCQltZW1jcHkoIGxwLT53ZHNfcG9ydFsyXS53ZHNBZGRyZXNzLCBtYWNfdmFsdWUsIEVUSF9BTEVOICk7CgkJCX0gZWxzZSB7CgkJCQlEQkdfV0FSTklORyggRGJnSW5mbywgIiVzIGludmFsaWQ7IHdpbGwgYmUgaWdub3JlZFxuIiwgUEFSTV9OQU1FX1dEU19BRERSRVNTMyApOwoJCQl9CgkJfQoJCWVsc2UgaWYgKCBzdHJjbXAoIGtleSwgUEFSTV9OQU1FX1dEU19BRERSRVNTNCApID09IDAgKSB7CgkJCURCR19UUkFDRSggRGJnSW5mbywgIiVzLCB2YWx1ZTogJXNcbiIsIFBBUk1fTkFNRV9XRFNfQUREUkVTUzQsIHZhbHVlICk7CgoJCQlpZiAoIHBhcnNlX21hY19hZGRyZXNzKCB2YWx1ZSwgbWFjX3ZhbHVlICkgPT0gRVRIX0FMRU4gKSB7CgkJCQltZW1jcHkoIGxwLT53ZHNfcG9ydFszXS53ZHNBZGRyZXNzLCBtYWNfdmFsdWUsIEVUSF9BTEVOICk7CgkJCX0gZWxzZSB7CgkJCQlEQkdfV0FSTklORyggRGJnSW5mbywgIiVzIGludmFsaWQ7IHdpbGwgYmUgaWdub3JlZFxuIiwgUEFSTV9OQU1FX1dEU19BRERSRVNTNCApOwoJCQl9CgkJfQoJCWVsc2UgaWYgKCBzdHJjbXAoIGtleSwgUEFSTV9OQU1FX1dEU19BRERSRVNTNSApID09IDAgKSB7CgkJCURCR19UUkFDRSggRGJnSW5mbywgIiVzLCB2YWx1ZTogJXNcbiIsIFBBUk1fTkFNRV9XRFNfQUREUkVTUzUsIHZhbHVlICk7CgoJCQlpZiAoIHBhcnNlX21hY19hZGRyZXNzKCB2YWx1ZSwgbWFjX3ZhbHVlICkgPT0gRVRIX0FMRU4gKSB7CgkJCQltZW1jcHkoIGxwLT53ZHNfcG9ydFs0XS53ZHNBZGRyZXNzLCBtYWNfdmFsdWUsIEVUSF9BTEVOICk7CgkJCX0gZWxzZSB7CgkJCQlEQkdfV0FSTklORyggRGJnSW5mbywgIiVzIGludmFsaWQ7IHdpbGwgYmUgaWdub3JlZFxuIiwgUEFSTV9OQU1FX1dEU19BRERSRVNTNSApOwoJCQl9CgkJfQoJCWVsc2UgaWYgKCBzdHJjbXAoIGtleSwgUEFSTV9OQU1FX1dEU19BRERSRVNTNiApID09IDAgKSB7CgkJCURCR19UUkFDRSggRGJnSW5mbywgIiVzLCB2YWx1ZTogJXNcbiIsIFBBUk1fTkFNRV9XRFNfQUREUkVTUzYsIHZhbHVlICk7CgoJCQlpZiAoIHBhcnNlX21hY19hZGRyZXNzKCB2YWx1ZSwgbWFjX3ZhbHVlICkgPT0gRVRIX0FMRU4gKSB7CgkJCQltZW1jcHkoIGxwLT53ZHNfcG9ydFs1XS53ZHNBZGRyZXNzLCBtYWNfdmFsdWUsIEVUSF9BTEVOICk7CgkJCX0gZWxzZSB7CgkJCQlEQkdfV0FSTklORyggRGJnSW5mbywgIiVzIGludmFsaWQ7IHdpbGwgYmUgaWdub3JlZFxuIiwgUEFSTV9OQU1FX1dEU19BRERSRVNTNiApOwoJCQl9CgkJfQojZW5kaWYgIC8qIFVTRV9XRFMgKi8KCX0KI2VuZGlmICAvKiAoSENGX1RZUEUpICYgSENGX1RZUEVfQVAgKi8KCglyZXR1cm47Cn0gLy8gdHJhbnNsYXRlX29wdGlvbgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJcGFyc2VfbWFjX2FkZHJlc3MoKQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiAgREVTQ1JJUFRJT046CiAqCiAqICAgICAgVGhpcyBmdW5jdGlvbiB3aWxsIHBhcnNlIGEgbWFjIGFkZHJlc3Mgc3RyaW5nIGFuZCBjb252ZXJ0IGl0IHRvIGEgYnl0ZQogKiAgIGFycmF5LgogKgogKiAgUEFSQU1FVEVSUzoKICoKICogICAgICB2YWx1ZSAgICAgICAtIHRoZSBNQUMgYWRkcmVzcywgcmVwcmVzZW50ZWQgYXMgYSBzdHJpbmcKICogICAgICBieXRlX2FycmF5ICAtIHRoZSBNQUMgYWRkcmVzcywgcmVwcmVzZW50ZWQgYXMgYSBieXRlIGFycmF5IG9mIGxlbmd0aAogKiAgICAgICAgICAgICAgICAgICAgRVRIX0FMRU4KICoKICogIFJFVFVSTlM6CiAqCiAqICAgICAgVGhlIG51bWJlciBvZiBieXRlcyBpbiB0aGUgZmluYWwgTUFDIGFkZHJlc3MsIHNob3VsZCBlcXVhbCB0byBFVEhfQUxFTi4KICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KaW50IHBhcnNlX21hY19hZGRyZXNzKCBjaGFyICp2YWx1ZSwgdV9jaGFyICpieXRlX2FycmF5ICkKewoJaW50ICAgICB2YWx1ZV9vZmZzZXQgPSAwOwoJaW50ICAgICBhcnJheV9vZmZzZXQgPSAwOwoJaW50ICAgICBmaWVsZF9vZmZzZXQgPSAwOwoJY2hhciAgICBieXRlX2ZpZWxkWzNdOwoJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKCW1lbXNldCggYnl0ZV9maWVsZCwgJ1wwJywgMyApOwoKCXdoaWxlKCB2YWx1ZVt2YWx1ZV9vZmZzZXRdICE9ICdcMCcgKSB7CgkJLyogU2tpcCBvdmVyIHRoZSBjb2xvbiBjaGFycyBzZXBlcmF0aW5nIHRoZSBieXRlcywgaWYgdGhleSBleGlzdCAqLwoJCWlmICggdmFsdWVbdmFsdWVfb2Zmc2V0XSA9PSAnOicgKSB7CgkJCXZhbHVlX29mZnNldCsrOwoJCQljb250aW51ZTsKCQl9CgoJCWJ5dGVfZmllbGRbZmllbGRfb2Zmc2V0XSA9IHZhbHVlW3ZhbHVlX29mZnNldF07CgkJZmllbGRfb2Zmc2V0Kys7CgkJdmFsdWVfb2Zmc2V0Kys7CgoJCS8qIE9uY2UgdGhlIGJ5dGVfZmllbGQgaXMgZmlsbGVkLCBjb252ZXJ0IGl0IGFuZCBzdG9yZSBpdCAqLwoJCWlmICggZmllbGRfb2Zmc2V0ID09IDIgKSB7CgkJCWJ5dGVfZmllbGRbZmllbGRfb2Zmc2V0XSA9ICdcMCc7CgkJCWJ5dGVfYXJyYXlbYXJyYXlfb2Zmc2V0XSA9IHNpbXBsZV9zdHJ0b3VsKCBieXRlX2ZpZWxkLCBOVUxMLCAxNiApOwoJCQlmaWVsZF9vZmZzZXQgPSAwOwoJCQlhcnJheV9vZmZzZXQrKzsKCQl9Cgl9CgoJLyogVXNlIHRoZSBhcnJheV9vZmZzZXQgYXMgYSBjaGVjazsgNiBieXRlcyBzaG91bGQgYmUgd3JpdHRlbiB0byB0aGUKCSAgIGJ5dGVfYXJyYXkgKi8KCXJldHVybiBhcnJheV9vZmZzZXQ7Cn0gLy8gcGFyc2VfbWFjX2FkZHJlc3MKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCVBhcnNlQ29uZmlnTGluZSgpCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqICBERVNDUklQVElPTjoKICoKICogICAgICBQYXJzZXMgYSBsaW5lIGZyb20gdGhlIGNvbmZpZ3VyYXRpb24gZmlsZSBpbnRvIGFuIEwtdmFsIGFuZCBhbiBSLXZhbCwKICogIHJlcHJlc2VudGluZyBhIGtleS92YWx1ZSBwYWlyLgogKgogKiAgUEFSQU1FVEVSUzoKICoKICogICAgICBwc3pMaW5lICAgICAtIHRoZSBsaW5lIGZyb20gdGhlIGNvbmZpZyBmaWxlIHRvIHBhcnNlCiAqICAgICAgcHBzekxWYWwgICAgLSB0aGUgcmVzdWx0aW5nIEwtdmFsIChLZXkpCiAqICAgICAgcHBzelJWYWwgICAgLSB0aGUgcmVzdWx0aW5nIFItdmFsIChWYWx1ZSkKICoKICogIFJFVFVSTlM6CiAqCiAqICAgICAgTi9BCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnZvaWQgUGFyc2VDb25maWdMaW5lKCBjaGFyICpwc3pMaW5lLCBjaGFyICoqcHBzekxWYWwsIGNoYXIgKipwcHN6UlZhbCApCnsKCWludCBpOwoJaW50IHNpemU7CgkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgoJREJHX0ZVTkMoICJQYXJzZUNvbmZpZ0xpbmUiICk7CglEQkdfRU5URVIoIERiZ0luZm8gKTsKCgkvKiBnZXQgYSBzbmFwc2hvdCBvZiBvdXIgc3RyaW5nIHNpemUgKi8KCXNpemUgICAgICA9IHN0cmxlbiggcHN6TGluZSApOwoJKnBwc3pMVmFsID0gTlVMTDsKCSpwcHN6UlZhbCA9IE5VTEw7CgoJaWYgKCBwc3pMaW5lWzBdICE9ICcjJyAmJgkJCQkJCQkvKiBza2lwIHRoZSBsaW5lIGlmIGl0IGlzIGEgY29tbWVudCAqLwoJCSBwc3pMaW5lWzBdICE9ICdcbicmJgkJCQkJCQkvKiBpZiBpdCdzIGFuIGVtcHR5IFVOSVggbGluZSwgZG8gbm90aGluZyAqLwoJCSAhKCBwc3pMaW5lWzBdID09ICdccicgJiYgcHN6TGluZVsxXSA9PSAnXG4nICkJLyogaWYgaXQncyBhbiBlbXB0eSBNUy1ET1MgbGluZSwgZG8gbm90aGluZyAqLwoJICAgICkgewoJCS8qIGFkdmFuY2UgcGFzdCBhbnkgd2hpdGVzcGFjZSwgYW5kIGFzc2lnbiB0aGUgTC12YWx1ZSAqLwoJCWZvciggaSA9IDA7IGkgPCBzaXplOyBpKysgKSB7CgkJCWlmICggcHN6TGluZVtpXSAhPSAnICcgKSB7CgkJCQkqcHBzekxWYWwgPSAmcHN6TGluZVtpXTsKCQkJCWJyZWFrOwoJCQl9CgkJfQoJCS8qIGFkdmFuY2UgdG8gdGhlIGVuZCBvZiB0aGUgbC12YWx1ZSovCgkJZm9yKCBpKys7IGkgPCBzaXplOyBpKysgKSB7CgkJCWlmICggcHN6TGluZVtpXSA9PSAnICcgfHwgcHN6TGluZVtpXSA9PSAnPScgKSB7CgkJCQlwc3pMaW5lW2ldID0gJ1wwJzsKCQkJCWJyZWFrOwoJCQl9CgkJfQoJCS8qIG1ha2UgYW55IHdoaXRlc3BhY2UgYW5kIHRoZSBlcXVhbCBzaWduIGEgTlVMTCBjaGFyYWN0ZXIsIGFuZAoJCSAgIGFkdmFuY2UgdG8gdGhlIFItVmFsdWUgKi8KCQlmb3IoIGkrKzsgaSA8IHNpemU7IGkrKyApIHsKCQkJaWYgKCBwc3pMaW5lW2ldID09ICcgJyB8fCBwc3pMaW5lW2ldID09ICc9JyApIHsKCQkJCXBzekxpbmVbaV0gPSAnXDAnOwoJCQkJY29udGludWU7CgkJCX0KCQkJKnBwc3pSVmFsID0gJnBzekxpbmVbaV07CgkJCWJyZWFrOwoJCX0KCQkvKiBtYWtlIHRoZSBsaW5lIGVuZGluZyBjaGFyYWN0ZXIocykgYSBOVUxMICovCgkJZm9yKCBpKys7IGkgPCBzaXplOyBpKysgKSB7CgkJCWlmICggcHN6TGluZVtpXSA9PSAnXG4nICkgewoJCQkJcHN6TGluZVtpXSA9ICdcMCc7CgkJCX0KCQkJaWYgKCggcHN6TGluZVtpXSA9PSAnXHInICkgJiYgKCBwc3pMaW5lW2krMV0gPT0gJ1xuJyApKSB7CgkJCQlwc3pMaW5lW2ldID0gJ1wwJzsKCQkJfQoJCX0KCX0KCURCR19MRUFWRSggRGJnSW5mbyApOwp9IC8vIFBhcnNlQ29uZmlnTGluZQovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKI2VuZGlmICAvLyBVU0VfUFJPRklMRQo=