LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQWdlcmUgU3lzdGVtcyBJbmMuCiAqIFdpcmVsZXNzIGRldmljZSBkcml2ZXIgZm9yIExpbnV4ICh3bGFnczQ5KS4KICoKICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMDMgQWdlcmUgU3lzdGVtcyBJbmMuCiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAqICAgaHR0cDovL3d3dy5hZ2VyZS5jb20KICoKICogSW5pdGlhbGx5IGRldmVsb3BlZCBieSBUcmlwbGVQb2ludCwgSW5jLgogKiAgIGh0dHA6Ly93d3cudHJpcGxlcG9pbnQuY29tCiAqCiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqCiAqICAgVGhpcyBmaWxlIGRlZmluZXMgcm91dGluZXMgcmVxdWlyZWQgdG8gcGFyc2UgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzCiAqICAgbGlzdGVkIGluIGEgY29uZmlnIGZpbGUsIGlmIHRoYXQgY29uZmlnIGZpbGUgZXhpc3RzLgogKgogKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKgogKiBTT0ZUV0FSRSBMSUNFTlNFCiAqCiAqIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHRlcm1zIGFuZCBjb25kaXRpb25zLAogKiB3aGljaCB5b3Ugc2hvdWxkIHJlYWQgY2FyZWZ1bGx5IGJlZm9yZSB1c2luZyB0aGUgc29mdHdhcmUuICBVc2luZyB0aGlzCiAqIHNvZnR3YXJlIGluZGljYXRlcyB5b3VyIGFjY2VwdGFuY2Ugb2YgdGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMuICBJZiB5b3UgZG8KICogbm90IGFncmVlIHdpdGggdGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMsIGRvIG5vdCB1c2UgdGhlIHNvZnR3YXJlLgogKgogKiBDb3B5cmlnaHQgqSAyMDAzIEFnZXJlIFN5c3RlbXMgSW5jLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogKgogKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBvciBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogKiBtb2RpZmljYXRpb25zLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CiAqCiAqIC4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzCiAqICAgIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBEaXNjbGFpbWVyIGFzIGNvbW1lbnRzIGluIHRoZSBjb2RlIGFzCiAqICAgIHdlbGwgYXMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQogKiAgICBkaXN0cmlidXRpb24uCiAqCiAqIC4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAogKiAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBEaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCiAqICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgogKgogKiAuIE5laXRoZXIgdGhlIG5hbWUgb2YgQWdlcmUgU3lzdGVtcyBJbmMuIG5vciB0aGUgbmFtZXMgb2YgdGhlIGNvbnRyaWJ1dG9ycwogKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAqCiAqIERpc2NsYWltZXIKICoKICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCCTQVMgSVOUIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCiAqIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBJTkZSSU5HRU1FTlQgQU5EIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIEFOWQogKiBVU0UsIE1PRElGSUNBVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhJUyBTT0ZUV0FSRSBJUyBTT0xFTFkgQVQgVEhFIFVTRVJTIE9XTgogKiBSSVNLLiBJTiBOTyBFVkVOVCBTSEFMTCBBR0VSRSBTWVNURU1TIElOQy4gT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCiAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCiAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECiAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgQ09OVFJBQ1QsIFNUUklDVAogKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAogKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSAogKiBEQU1BR0UuCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgovKiBPbmx5IGluY2x1ZGUgdGhpcyBmaWxlIGlmIFVTRV9QUk9GSUxFIGlzIGRlZmluZWQgKi8KI2lmZGVmIFVTRV9QUk9GSUxFCgoKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgY29uc3RhbnQgZGVmaW5pdGlvbnMKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCgovKiBBbGxvdyBzdXBwb3J0IGZvciBjYWxsaW5nIHN5c3RlbSBmY25zIHRvIHBhcnNlIGNvbmZpZyBmaWxlICovCiNkZWZpbmUgX19LRVJORUxfU1lTQ0FMTFNfXwoKCgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogaW5jbHVkZSBmaWxlcwogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwojaW5jbHVkZSA8d2xfdmVyc2lvbi5oPgoKI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgojaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KI2luY2x1ZGUgPGxpbnV4L3VuaXN0ZC5oPgojaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KI2luY2x1ZGUgPGxpbWl0cy5oPgoKI2RlZmluZSBCSU5fREwgMQoKI2luY2x1ZGUgPGRlYnVnLmg+CiNpbmNsdWRlIDxoY2YuaD4KLyogI2luY2x1ZGUgPGhjZmRlZi5oPiAqLwoKI2luY2x1ZGUgPHdsX2lmLmg+CiNpbmNsdWRlIDx3bF9pbnRlcm5hbC5oPgojaW5jbHVkZSA8d2xfdXRpbC5oPgojaW5jbHVkZSA8d2xfZW5jLmg+CiNpbmNsdWRlIDx3bF9tYWluLmg+CiNpbmNsdWRlIDx3bF9wcm9maWxlLmg+CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogZ2xvYmFsIHZhcmlhYmxlcwogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKLyogRGVmaW5pdGlvbiBuZWVkZWQgdG8gcHJldmVudCB1bnJlc29sdmVkIGV4dGVybmFsIGluIHVuaXN0ZC5oICovCnN0YXRpYyBpbnQgZXJybm87CgojaWYgREJHCmV4dGVybiBwX3UzMiAgICBEZWJ1Z0ZsYWc7CmV4dGVybiBkYmdfaW5mb190ICpEYmdJbmZvOwojZW5kaWYKCmludCBwYXJzZV95ZXNfbm8oY2hhciAqdmFsdWUpOwoKCmludCBwYXJzZV95ZXNfbm8oY2hhciAqdmFsdWUpCnsKaW50IHJjID0gMDsJCQkJCQkJCQkJLyogZGVmYXVsdCB0byBOTyBmb3IgaW52YWxpZCBwYXJhbWV0ZXJzICovCgoJaWYgKHN0cmxlbih2YWx1ZSkgPT0gMSkgewoJCWlmICgodmFsdWVbMF0gfCAoJ1knXid5JykpID09ICd5JykKCQkJcmMgPSAxOwoJLyogfSBlbHNlIHsgKi8KCQkvKiB0aGlzIHNob3VsZCBub3QgYmUgZGVidWcgdGltZSBpbmZvLCBpdCBpcyBhbiBlbmR1c2VyIGRhdGEgZW50cnkgZXJyb3IgOz8gKi8KCQkvKiBEQkdfV0FSTklORyhEYmdJbmZvLCAiJXMgaW52YWxpZDsgd2lsbCBiZSBpZ25vcmVkXG4iLCBQQVJNX05BTUVfTUlDUk9XQVZFX1JPQlVTVE5FU1MpOyAqLwoJfQoJcmV0dXJuIHJjOwp9IC8qIHBhcnNlX3llc19ubyAqLwoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCXBhcnNlX2NvbmZpZygpCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqICBERVNDUklQVElPTjoKICoKICogICAgICBUaGlzIGZ1bmN0aW9uIG9wZW5zIHRoZSBkZXZpY2UncyBjb25maWcgZmlsZSBhbmQgcGFyc2VzIHRoZSBvcHRpb25zIGZyb20KICogICBpdCwgc28gdGhhdCBpdCBjYW4gcHJvcGVybHkgY29uZmlndXJlIGl0c2VsZi4gSWYgbm8gY29uZmlndXJhdGlvbiBmaWxlCiAqICAgb3IgY29uZmlndXJhdGlvbiBpcyBwcmVzZW50LCB0aGVuIGNvbnRpbnVlIHRvIHVzZSB0aGUgb3B0aW9ucyBhbHJlYWR5CiAqICAgcGFyc2VkIGZyb20gY29uZmlnLm9wdHMgb3Igd2lyZWxlc3Mub3B0cy4KICoKICogIFBBUkFNRVRFUlM6CiAqCiAqICAgICAgZGV2IC0gYSBwb2ludGVyIHRvIHRoZSBkZXZpY2UncyBuZXRfZGV2aWNlIHN0cnVjdHVyZQogKgogKiAgUkVUVVJOUzoKICoKICogICAgICBOL0EKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kdm9pZCBwYXJzZV9jb25maWcoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKewoJaW50CQkJCSAgICBmaWxlX2Rlc2M7CiNpZiAwIC8qIEJJTl9ETCAqLwoJaW50CQkJCXJjOwoJY2hhcgkJCQkqY3AgPSBOVUxMOwojZW5kaWYgLyogQklOX0RMICovCgljaGFyICAgICAgICAgICAgICAgIGJ1ZmZlcltNQVhfTElORV9TSVpFXTsKCWNoYXIgICAgICAgICAgICAgICAgZmlsZW5hbWVbTUFYX0xJTkVfU0laRV07CgltbV9zZWdtZW50X3QJICAgIGZzOwoJc3RydWN0IHdsX3ByaXZhdGUgICAqd3ZsYW5fY29uZmlnID0gTlVMTDsKCUVOQ1NUUkNUICAgICAgICAgICAgc0VuY3J5cHRpb247CgkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgoJREJHX0ZVTkMoInBhcnNlX2NvbmZpZyIpOwoJREJHX0VOVEVSKERiZ0luZm8pOwoKCS8qIEdldCB0aGUgd2F2ZWxhbiBzcGVjaWZpYyBpbmZvIGZvciB0aGlzIGRldmljZSAqLwoJd3ZsYW5fY29uZmlnID0gKHN0cnVjdCB3bF9wcml2YXRlICopZGV2LT5wcml2OwoJaWYgKHd2bGFuX2NvbmZpZyA9PSBOVUxMKSB7CgkJREJHX0VSUk9SKERiZ0luZm8sICJXYXZlbGFuIHNwZWNpZmljIGluZm8gc3RydWN0IG5vdCBwcmVzZW50P1xuIik7CgkJcmV0dXJuOwoJfQoKCS8qIHNldHVwIHRoZSBkZWZhdWx0IGVuY3J5cHRpb24gc3RyaW5nICovCglzdHJjcHkod3ZsYW5fY29uZmlnLT5zekVuY3J5cHRpb24sIERFRl9DUllQVF9TVFIpOwoKCS8qIE9idGFpbiBhIHVzZXItc3BhY2UgcHJvY2VzcyBjb250ZXh0LCBzdG9yaW5nIHRoZSBvcmlnaW5hbCBjb250ZXh0ICovCglmcyA9IGdldF9mcygpOwoJc2V0X2ZzKGdldF9kcygpKTsKCgkvKiBEZXRlcm1pbmUgdGhlIGZpbGVuYW1lIGZvciB0aGlzIGRldmljZSBhbmQgYXR0ZW1wdCB0byBvcGVuIGl0ICovCglzcHJpbnRmKGZpbGVuYW1lLCAiJXMlcyIsIFJPT1RfQ09ORklHX0ZJTEVOQU1FLCBkZXYtPm5hbWUpOwoJZmlsZV9kZXNjID0gb3BlbihmaWxlbmFtZSwgT19SRE9OTFksIDApOwoJaWYgKGZpbGVfZGVzYyAhPSAtMSkgewoJCURCR19UUkFDRShEYmdJbmZvLCAiV2lyZWxlc3MgY29uZmlnIGZpbGUgZm91bmQuIFBhcnNpbmcgb3B0aW9ucy4uLlxuIik7CgoJCS8qIFJlYWQgb3V0IHRoZSBvcHRpb25zICovCgkJd2hpbGUgKHJlYWRsaW5lKGZpbGVfZGVzYywgYnVmZmVyKSkKCQkJdHJhbnNsYXRlX29wdGlvbihidWZmZXIsIHd2bGFuX2NvbmZpZyk7CgkJLyogQ2xvc2UgdGhlIGZpbGUgKi8KCQljbG9zZShmaWxlX2Rlc2MpOwkvKiA7P2V2ZW4gaWYgZmlsZV9kZXNjID09IC0xID8/PyAqLwoJfSBlbHNlIHsKCQlEQkdfVFJBQ0UoRGJnSW5mbywgIk5vIGl3Y29uZmlnIGZpbGUgZm91bmQgZm9yIHRoaXMgZGV2aWNlOyAiCgkJCQkgICAiY29uZmlnLm9wdHMgb3Igd2lyZWxlc3Mub3B0cyB3aWxsIGJlIHVzZWRcbiIpOwoJfQoJLyogUmV0dXJuIHRvIHRoZSBvcmlnaW5hbCBjb250ZXh0ICovCglzZXRfZnMoZnMpOwoKCS8qIGNvbnZlcnQgdGhlIFdFUCBrZXlzLCBpZiByZWFkIGluIGFzIGtleTEsIGtleTIsIHR5cGUgb2YgZGF0YSAqLwoJaWYgKHd2bGFuX2NvbmZpZy0+RW5hYmxlRW5jcnlwdGlvbikgewoJCW1lbXNldCgmc0VuY3J5cHRpb24sIDAsIHNpemVvZihzRW5jcnlwdGlvbikpOwoKCQl3bF93ZXBfZGVjb2RlKENSWVBUX0NPREUsICZzRW5jcnlwdGlvbiwKCQkJCQkJICAgd3ZsYW5fY29uZmlnLT5zekVuY3J5cHRpb24pOwoKCQkvKiB0aGUgTGludXggZHJpdmVyIGxpa2VzIHRvIHVzZSAxLTQgZm9yIHRoZSBrZXkgSURzLCBhbmQgdGhlbgoJCSAgIGNvbnZlcnQgdG8gMC0zIHdoZW4gc2VuZGluZyB0byB0aGUgY2FyZC4gIFRoZSBXaW5kb3dzIGNvZGUKCQkgICBiYXNlIHVzZWQgMC0zIGluIHRoZSBBUEkgRExMLCB3aGljaCB3YXMgcG9ydGVkIHRvIExpbnV4LiAgRm9yCgkJICAgdGhlIHNha2Ugb2YgdGhlIHVzZXIgZXhwZXJpZW5jZSwgd2UgZGVjaWRlZCB0byBrZWVwIDAtMyBhcyB0aGUKCQkgICBudW1iZXJzIHVzZWQgaW4gdGhlIERMTDsgYW5kIHdpbGwgcGVyZm9ybSB0aGUgKzEgY29udmVyc2lvbiBoZXJlLgoJCSAgIFdlIGNvdWxkIGhhdmUgY29udmVydGVkICB0aGUgZW50aXJlIExpbnV4IGRyaXZlciwgYnV0IHRoaXMgaXMKCQkgICBsZXNzIG9idHJ1c2l2ZS4gIFRoaXMgbWF5IGJlIGEgInRvZG8iIHRvIGNvbnZlcnQgdGhlIHdob2xlIGRyaXZlciAqLwoJCXNFbmNyeXB0aW9uLndFbmFibGVkID0gd3ZsYW5fY29uZmlnLT5FbmFibGVFbmNyeXB0aW9uOwoJCXNFbmNyeXB0aW9uLndUeEtleUlEID0gd3ZsYW5fY29uZmlnLT5UcmFuc21pdEtleUlEIC0gMTsKCgkJbWVtY3B5KCZzRW5jcnlwdGlvbi5FbmNTdHIsICZ3dmxhbl9jb25maWctPkRlZmF1bHRLZXlzLAoJCQkJc2l6ZW9mKENGR19ERUZBVUxUX0tFWVNfU1RSQ1QpKTsKCgkJbWVtc2V0KHd2bGFuX2NvbmZpZy0+c3pFbmNyeXB0aW9uLCAwLCBzaXplb2Yod3ZsYW5fY29uZmlnLT5zekVuY3J5cHRpb24pKTsKCgkJd2xfd2VwX2NvZGUoQ1JZUFRfQ09ERSwgd3ZsYW5fY29uZmlnLT5zekVuY3J5cHRpb24sICZzRW5jcnlwdGlvbiwKCQkJCQkJIHNpemVvZihzRW5jcnlwdGlvbikpOwoJfQoKCS8qIGRlY29kZSB0aGUgZW5jcnlwdGlvbiBzdHJpbmcgZm9yIHRoZSBjYWxsIHRvIHdsX2NvbW1pdCgpICovCgl3bF93ZXBfZGVjb2RlKENSWVBUX0NPREUsICZzRW5jcnlwdGlvbiwgd3ZsYW5fY29uZmlnLT5zekVuY3J5cHRpb24pOwoKCXd2bGFuX2NvbmZpZy0+VHJhbnNtaXRLZXlJRCAgICA9IHNFbmNyeXB0aW9uLndUeEtleUlEICsgMTsKCXd2bGFuX2NvbmZpZy0+RW5hYmxlRW5jcnlwdGlvbiA9IHNFbmNyeXB0aW9uLndFbmFibGVkOwoKCW1lbWNweSgmd3ZsYW5fY29uZmlnLT5EZWZhdWx0S2V5cywgJnNFbmNyeXB0aW9uLkVuY1N0ciwKCQkJc2l6ZW9mKENGR19ERUZBVUxUX0tFWVNfU1RSQ1QpKTsKCiNpZiAwIC8qIEJJTl9ETCAqLwoJCS8qIE9idGFpbiBhIHVzZXItc3BhY2UgcHJvY2VzcyBjb250ZXh0LCBzdG9yaW5nIHRoZSBvcmlnaW5hbCBjb250ZXh0ICovCgkJZnMgPSBnZXRfZnMoKTsKCQlzZXRfZnMoZ2V0X2RzKCkpOwoKCQkvKiA7P2p1c3QgdG8gZmFrZSBzb21ldGhpbmcgKi8KCQlzdHJjcHkoLyp3dmxhbl9jb25maWctPmZ3X2ltYWdlXyovZmlsZW5hbWUsICIvZXRjL2FnZXJlL2Z3LmJpbiIpOwoJCWZpbGVfZGVzYyA9IG9wZW4oLyp3dmxhbl9jb25maWctPmZ3X2ltYWdlXyovZmlsZW5hbWUsIDAsIDApOwoJCWlmIChmaWxlX2Rlc2MgPT0gLTEpIHsKCQkJREJHX0VSUk9SKERiZ0luZm8sICJObyBpbWFnZSBmaWxlIGZvdW5kXG4iKTsKCQl9IGVsc2UgewoJCQlEQkdfVFJBQ0UoRGJnSW5mbywgIkYvVyBpbWFnZSBmaWxlIGZvdW5kXG4iKTsKI2RlZmluZSBESEZfQUxMT0NfU0laRSA5NjAwMAkJCS8qIGp1c3QgYmVsb3cgOTZLLCBsZXQncyBob3BlIGl0IHN1ZmZpY2VzIGZvciBub3cgYW5kIGZvciB0aGUgZnV0dXJlICovCgkJCWNwID0gKGNoYXIgKil2bWFsbG9jKERIRl9BTExPQ19TSVpFKTsKCQkJaWYgKGNwID09IE5VTEwpIHsKCQkJCURCR19FUlJPUihEYmdJbmZvLCAiZXJyb3IgaW4gdm1hbGxvY1xuIik7CgkJCX0gZWxzZSB7CgkJCQlyYyA9IHJlYWQoZmlsZV9kZXNjLCBjcCwgREhGX0FMTE9DX1NJWkUpOwoJCQkJaWYgKHJjID09IERIRl9BTExPQ19TSVpFKSB7CgkJCQkJREJHX0VSUk9SKERiZ0luZm8sICJidWZmZXIgdG9vIHNtYWxsLCAlZFxuIiwgREhGX0FMTE9DX1NJWkUpOwoJCQkJfSBlbHNlIGlmIChyYyA+IDApIHsKCQkJCQlEQkdfVFJBQ0UoRGJnSW5mbywgInJlYWQgTy5LLjogJWQgYnl0ZXMgICUuMTJzXG4iLCByYywgY3ApOwoJCQkJCXJjID0gcmVhZChmaWxlX2Rlc2MsICZjcFtyY10sIDEpOwoJCQkJCWlmIChyYyA9PSAwKQoJCQkJCQlEQkdfVFJBQ0UoRGJnSW5mbywgIm5vIG1vcmUgdG8gcmVhZFxuIik7CgkJCQl9CgkJCQlpZiAocmMgIT0gMCkgewoJCQkJCURCR19FUlJPUihEYmdJbmZvLCAiZmlsZSBub3QgcmVhZCBpbiBvbmUgc3dvb3Agb3Igb3RoZXIgZXJyb3IiXAoJCQkJCQkJCQkJIiwgZ2l2ZSB1cCwgdG9vIGNvbXBsaWNhdGVkLCByYyA9ICUwWFxuIiwgcmMpOwoJCQkJfQoJCQkJdmZyZWUoY3ApOwoJCQl9CgkJCWNsb3NlKGZpbGVfZGVzYyk7CgkJfQoJCXNldF9mcyhmcyk7CQkJLyogUmV0dXJuIHRvIHRoZSBvcmlnaW5hbCBjb250ZXh0ICovCiNlbmRpZiAvKiBCSU5fREwgKi8KCglEQkdfTEVBVkUoRGJnSW5mbyk7CglyZXR1cm47Cn0gLyogcGFyc2VfY29uZmlnICovCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKglyZWFkbGluZSgpCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqICBERVNDUklQVElPTjoKICoKICogICAgICBUaGlzIGZ1bmN0aW9uIHJlYWRzIGluIGRhdGEgZnJvbSBhIGdpdmVuIGZpbGUgb25lIGxpbmUgYXQgYSB0aW1lLAogKiAgIGNvbnZlcnRpbmcgdGhlIGRldGVjdGVkIG5ld2xpbmUgY2hhcmFjdGVyICdcbicgdG8gYSBudWxsICdcMCcuIE5vdGUgdGhhdAogKiAgIHRoZSBmaWxlIGRlc2NyaXB0b3IgbXVzdCBiZSB2YWxpZCBiZWZvcmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLgogKgogKiAgUEFSQU1FVEVSUzoKICoKICogICAgICBmaWxlZGVzYyAgICAtIHRoZSBmaWxlIGRlc2NyaXB0b3IgZm9yIHRoZSBvcGVuIGNvbmZpZ3VyYXRpb24gZmlsZQogKiAgICAgIGJ1ZmZlciAgICAgIC0gYSBidWZmZXIgcG9pbnRlciwgcGFzc2VkIGluIGJ5IHRoZSBjYWxsZXIsIHRvIHdoaWNoIHRoZQogKiAgICAgICAgICAgICAgICAgICAgbGluZSB3aWxsIGJlIHN0b3JlZC4KICoKICogIFJFVFVSTlM6CiAqCiAqICAgICAgdGhlIG51bWJlciBvZiBieXRlcyByZWFkCiAqICAgICAgLTEgb24gZXJyb3IKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KaW50IHJlYWRsaW5lKGludCBmaWxlZGVzYywgY2hhciAqYnVmZmVyKQp7CglpbnQgcmVzdWx0ID0gLTE7CglpbnQgYnl0ZXNfcmVhZCA9IDA7CgkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgoJLyogTWFrZSBzdXJlIHRoZSBmaWxlIGRlc2NyaXB0b3IgaXMgZ29vZCAqLwoJaWYgKGZpbGVkZXNjICE9IC0xKSB7CgkJLyogUmVhZCBpbiBmcm9tIHRoZSBmaWxlIGJ5dGUgYnkgYnl0ZSB1bnRpbCBhIG5ld2xpbmUgaXMgcmVhY2hlZCAqLwoJCXdoaWxlICgocmVzdWx0ID0gcmVhZChmaWxlZGVzYywgJmJ1ZmZlcltieXRlc19yZWFkXSwgMSkpID09IDEpIHsKCQkJaWYgKGJ1ZmZlcltieXRlc19yZWFkXSA9PSAnXG4nKSB7CgkJCQlidWZmZXJbYnl0ZXNfcmVhZF0gPSAnXDAnOwoJCQkJYnl0ZXNfcmVhZCsrOwoJCQkJYnJlYWs7CgkJCX0KCQkJYnl0ZXNfcmVhZCsrOwoJCX0KCX0KCgkvKiBSZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyByZWFkICovCglpZiAocmVzdWx0ID09IC0xKQoJCXJldHVybiByZXN1bHQ7CgllbHNlCgkJcmV0dXJuIGJ5dGVzX3JlYWQ7Cn0gLyogcmVhZGxpbmUgKi8KLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCXRyYW5zbGF0ZV9vcHRpb24oKQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiAgREVTQ1JJUFRJT046CiAqCiAqICAgICAgVGhpcyBmdW5jdGlvbiB0YWtlcyBhIGxpbmUgcmVhZCBpbiBmcm9tIHRoZSBjb25maWcgZmlsZSBhbmQgcGFyc2VzIG91dAogKiAgIHRoZSBrZXkvdmFsdWUgcGFpcnMuIEl0IHRoZW4gZGV0ZXJtaW5lcyB3aGljaCBrZXkgaGFzIGJlZW4gcGFyc2VkIGFuZCBzZXRzCiAqICAgdGhlIGNhcmQncyBjb25maWd1cmF0aW9uIGJhc2VkIG9uIHRoZSB2YWx1ZSBnaXZlbi4KICoKICogIFBBUkFNRVRFUlM6CiAqCiAqICAgICAgYnVmZmVyIC0gYSBidWZmZXIgY29udGFpbmluZyBhIGxpbmUgdG8gdHJhbnNsYXRlCiAqICAgICAgY29uZmlnIC0gYSBwb2ludGVyIHRvIHRoZSBkZXZpY2UncyBwcml2YXRlIGFkYXB0ZXIgc3RydWN0dXJlCiAqCiAqICBSRVRVUk5TOgogKgogKiAgICAgIE4vQQogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp2b2lkIHRyYW5zbGF0ZV9vcHRpb24oY2hhciAqYnVmZmVyLCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHApCnsKCXVuc2lnbmVkIGludCB2YWx1ZV9jb252ZXJ0ID0gMDsKCWludCBzdHJpbmdfbGVuZ3RoID0gMDsKCWNoYXIgKmtleSA9IE5VTEw7CgljaGFyICp2YWx1ZSA9IE5VTEw7Cgl1X2NoYXIgbWFjX3ZhbHVlW0VUSF9BTEVOXTsKCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCglEQkdfRlVOQygidHJhbnNsYXRlX29wdGlvbiIpOwoKCWlmIChidWZmZXIgPT0gTlVMTCB8fCBscCA9PSBOVUxMKSB7CgkJREJHX0VSUk9SKERiZ0luZm8sICJDb25maWcgZmlsZSBidWZmZXIgYW5kL29yIHdhdmVsYW4gYnVmZmVyIHB0ciBOVUxMXG4iKTsKCQlyZXR1cm47Cgl9CgoJUGFyc2VDb25maWdMaW5lKGJ1ZmZlciwgJmtleSwgJnZhbHVlKTsKCglpZiAoa2V5ID09IE5VTEwgfHwgdmFsdWUgPT0gTlVMTCkKCQlyZXR1cm47CgoJLyogRGV0ZXJtaW5lIHdoaWNoIGtleSBpdCBpcyBhbmQgcGVyZm9ybSB0aGUgYXBwcm9wcmlhdGUgYWN0aW9uICovCgoJLyogQ29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzIHVzZWQgaW4gYWxsIHNjZW5hcmlvcyAqLwojaWYgREJHCgkvKiBoYW5kbGUgRGVidWdGbGFnIGFzIGVhcmx5IGFzIHBvc3NpYmxlIHNvIGl0IHN0YXJ0cyBpdHMgaW5mbHVlbmNlIGFzIGVhcmx5CgkgKiBhcyBwb3NzaWJsZQoJICovCglpZiAoc3RyY21wKGtleSwgUEFSTV9OQU1FX0RFQlVHX0ZMQUcpID09IDApIHsKCQlpZiAoRGVidWdGbGFnID09IH4wKSB7CQkJLyogaWYgRGVidWdGbGFnIGlzIG5vdCBzcGVjaWZpZWQgb24gdGhlIGNvbW1hbmQgbGluZSAqLwoJCQlpZiAoRGJnSW5mby0+RGVidWdGbGFnID09IDApIHsJLyogaWYgcGNfZGVidWcgZGlkIG5vdCBzZXQgRGVidWdGbGFnIChpLmUucGNfZGVidWcgaXMKCQkJCQkJCQkJCQkgKiBub3Qgc3BlY2lmaWVkIG9yIHNwZWNpZmllZCBvdXRzaWRlIHRoZSA0LTggcmFuZ2UKCQkJCQkJCQkJCQkgKi8KCQkJCURiZ0luZm8tPkRlYnVnRmxhZyB8PSBEQkdfREVGQVVMVFM7CgkJCX0KCQl9IGVsc2UgewoJCQlEYmdJbmZvLT5EZWJ1Z0ZsYWcgPSBzaW1wbGVfc3RydG91bCh2YWx1ZSwgTlVMTCwgMCk7IC8qIDs/RGVidWdGbGFnOyAqLwoJCX0KCQlEYmdJbmZvLT5EZWJ1Z0ZsYWcgPSBzaW1wbGVfc3RydG91bCh2YWx1ZSwgTlVMTCwgMCk7IC8qIDs/RGVsZXRlIEFTQVAgKi8KCX0KI2VuZGlmIC8qIERCRyAqLwoJaWYgKHN0cmNtcChrZXksIFBBUk1fTkFNRV9BVVRIX0tFWV9NR01UX1NVSVRFKSA9PSAwKSB7CgkJREJHX1RSQUNFKERiZ0luZm8sICIlcywgdmFsdWU6ICVzXG4iLCBQQVJNX05BTUVfQVVUSF9LRVlfTUdNVF9TVUlURSwgdmFsdWUpOwoKCQl2YWx1ZV9jb252ZXJ0ID0gc2ltcGxlX3N0cnRvdWwodmFsdWUsIE5VTEwsIDApOwoJCWlmICgodmFsdWVfY29udmVydCA+PSBQQVJNX01JTl9BVVRIX0tFWV9NR01UX1NVSVRFKSB8fCAodmFsdWVfY29udmVydCA8PSBQQVJNX01BWF9BVVRIX0tFWV9NR01UX1NVSVRFKSkKCQkJbHAtPkF1dGhLZXlNZ210U3VpdGUgPSB2YWx1ZV9jb252ZXJ0OwoJCWVsc2UKCQkJREJHX1dBUk5JTkcoRGJnSW5mbywgIiVzIGludmFsaWQ7IHdpbGwgYmUgaWdub3JlZFxuIiwgUEFSTV9OQU1FX0FVVEhfS0VZX01HTVRfU1VJVEUpOwoJfSBlbHNlIGlmIChzdHJjbXAoa2V5LCBQQVJNX05BTUVfQlJTQ18yR0haKSA9PSAwKSB7CgkJREJHX1RSQUNFKERiZ0luZm8sICIlcywgdmFsdWU6ICVzXG4iLCBQQVJNX05BTUVfQlJTQ18yR0haLCB2YWx1ZSk7CgoJCXZhbHVlX2NvbnZlcnQgPSBzaW1wbGVfc3RydG91bCh2YWx1ZSwgTlVMTCwgMCk7CgkJaWYgKCh2YWx1ZV9jb252ZXJ0ID49IFBBUk1fTUlOX0JSU0MpIHx8ICh2YWx1ZV9jb252ZXJ0IDw9IFBBUk1fTUFYX0JSU0MpKQoJCQlscC0+YnJzY1swXSA9IHZhbHVlX2NvbnZlcnQ7CgkJZWxzZQoJCQlEQkdfV0FSTklORyhEYmdJbmZvLCAiJXMgaW52YWlkOyB3aWxsIGJlIGlnbm9yZWRcbiIsIFBBUk1fTkFNRV9CUlNDXzJHSFopOwoJfSBlbHNlIGlmIChzdHJjbXAoa2V5LCBQQVJNX05BTUVfQlJTQ181R0haKSA9PSAwKSB7CgkJREJHX1RSQUNFKERiZ0luZm8sICIlcywgdmFsdWU6ICVzXG4iLCBQQVJNX05BTUVfQlJTQ181R0haLCB2YWx1ZSk7CgoJCXZhbHVlX2NvbnZlcnQgPSBzaW1wbGVfc3RydG91bCh2YWx1ZSwgTlVMTCwgMCk7CgkJaWYgKCh2YWx1ZV9jb252ZXJ0ID49IFBBUk1fTUlOX0JSU0MpIHx8ICh2YWx1ZV9jb252ZXJ0IDw9IFBBUk1fTUFYX0JSU0MpKQoJCQlscC0+YnJzY1sxXSA9IHZhbHVlX2NvbnZlcnQ7CgkJZWxzZQoJCQlEQkdfV0FSTklORyhEYmdJbmZvLCAiJXMgaW52YWlkOyB3aWxsIGJlIGlnbm9yZWRcbiIsIFBBUk1fTkFNRV9CUlNDXzVHSFopOwoJfSBlbHNlIGlmICgoc3RyY21wKGtleSwgUEFSTV9OQU1FX0RFU0lSRURfU1NJRCkgPT0gMCkgfHwgKHN0cmNtcChrZXksIFBBUk1fTkFNRV9PV05fU1NJRCkgPT0gMCkpIHsKCQlEQkdfVFJBQ0UoRGJnSW5mbywgIlNTSUQsIHZhbHVlOiAlc1xuIiwgdmFsdWUpOwoKCQltZW1zZXQobHAtPk5ldHdvcmtOYW1lLCAwLCAoUEFSTV9NQVhfTkFNRV9MRU4gKyAxKSk7CgoJCS8qIE1ha2Ugc3VyZSB0aGUgdmFsdWUgaXNuJ3QgdG9vIGxvbmcgKi8KCQlzdHJpbmdfbGVuZ3RoID0gc3RybGVuKHZhbHVlKTsKCQlpZiAoc3RyaW5nX2xlbmd0aCA+IFBBUk1fTUFYX05BTUVfTEVOKSB7CgkJCURCR19XQVJOSU5HKERiZ0luZm8sICJTU0lEIHRvbyBsb25nOyB3aWxsIGJlIHRydW5jYXRlZFxuIik7CgkJCXN0cmluZ19sZW5ndGggPSBQQVJNX01BWF9OQU1FX0xFTjsKCQl9CgoJCW1lbWNweShscC0+TmV0d29ya05hbWUsIHZhbHVlLCBzdHJpbmdfbGVuZ3RoKTsKCX0KI2lmIDAKCWVsc2UgaWYgKHN0cmNtcChrZXksIFBBUk1fTkFNRV9ET1dOTE9BRF9GSVJNV0FSRSkgPT0gMCkgewoJCURCR19UUkFDRShEYmdJbmZvLCAiRE9XTkxPQURfRklSTVdBUkUsIHZhbHVlOiAlc1xuIiwgdmFsdWUpOwoJCW1lbXNldChscC0+ZndfaW1hZ2VfZmlsZW5hbWUsIDAsIChNQVhfTElORV9TSVpFICsgMSkpOwoJCS8qIE1ha2Ugc3VyZSB0aGUgdmFsdWUgaXNuJ3QgdG9vIGxvbmcgKi8KCQlzdHJpbmdfbGVuZ3RoID0gc3RybGVuKHZhbHVlKTsKCQlpZiAoc3RyaW5nX2xlbmd0aCA+IE1BWF9MSU5FX1NJWkUpCgkJCURCR19XQVJOSU5HKERiZ0luZm8sICJGL1cgaW1hZ2UgZmlsZSBuYW1lIHRvbyBsb25nOyB3aWxsIGJlIGlnbm9yZWRcbiIpOwoJCWVsc2UKCQkJbWVtY3B5KGxwLT5md19pbWFnZV9maWxlbmFtZSwgdmFsdWUsIHN0cmluZ19sZW5ndGgpOwoJfQojZW5kaWYKCWVsc2UgaWYgKHN0cmNtcChrZXksIFBBUk1fTkFNRV9FTkFCTEVfRU5DUllQVElPTikgPT0gMCkgewoJCURCR19UUkFDRShEYmdJbmZvLCAiJXMsIHZhbHVlOiAlc1xuIiwgUEFSTV9OQU1FX0VOQUJMRV9FTkNSWVBUSU9OLCB2YWx1ZSk7CgoJCXZhbHVlX2NvbnZlcnQgPSBzaW1wbGVfc3RydG91bCh2YWx1ZSwgTlVMTCwgMCk7CgkJaWYgKCh2YWx1ZV9jb252ZXJ0ID49IFBBUk1fTUlOX0VOQUJMRV9FTkNSWVBUSU9OKSAmJiAodmFsdWVfY29udmVydCA8PSBQQVJNX01BWF9FTkFCTEVfRU5DUllQVElPTikpCgkJCWxwLT5FbmFibGVFbmNyeXB0aW9uID0gdmFsdWVfY29udmVydDsKCQllbHNlCgkJCURCR19XQVJOSU5HKERiZ0luZm8sICIlcyBpbnZhbGlkOyB3aWxsIGJlIGlnbm9yZWRcbiIsIFBBUk1fTkFNRV9FTkFCTEVfRU5DUllQVElPTik7Cgl9IGVsc2UgaWYgKHN0cmNtcChrZXksIFBBUk1fTkFNRV9FTkNSWVBUSU9OKSA9PSAwKSB7CgkJREJHX1RSQUNFKERiZ0luZm8sICIlcywgdmFsdWU6ICVzXG4iLCBQQVJNX05BTUVfRU5DUllQVElPTiwgdmFsdWUpOwoKCQltZW1zZXQobHAtPnN6RW5jcnlwdGlvbiwgMCwgc2l6ZW9mKGxwLT5zekVuY3J5cHRpb24pKTsKCgkJLyogTWFrZSBzdXJlIHRoZSB2YWx1ZSBpc24ndCB0b28gbG9uZyAqLwoJCXN0cmluZ19sZW5ndGggPSBzdHJsZW4odmFsdWUpOwoJCWlmIChzdHJpbmdfbGVuZ3RoID4gc2l6ZW9mKGxwLT5zekVuY3J5cHRpb24pKSB7CgkJCURCR19XQVJOSU5HKERiZ0luZm8sICIlcyB0b28gbG9uZzsgd2lsbCBiZSB0cnVuY2F0ZWRcbiIsIFBBUk1fTkFNRV9FTkNSWVBUSU9OKTsKCQkJc3RyaW5nX2xlbmd0aCA9IHNpemVvZihscC0+c3pFbmNyeXB0aW9uKTsKCQl9CgoJCW1lbWNweShscC0+c3pFbmNyeXB0aW9uLCB2YWx1ZSwgc3RyaW5nX2xlbmd0aCk7Cgl9IGVsc2UgaWYgKHN0cmNtcChrZXksIFBBUk1fTkFNRV9LRVkxKSA9PSAwKSB7CgkJREJHX1RSQUNFKERiZ0luZm8sICIlcywgdmFsdWU6ICVzXG4iLCBQQVJNX05BTUVfS0VZMSwgdmFsdWUpOwoKCQlpZiAoaXNfdmFsaWRfa2V5X3N0cmluZyh2YWx1ZSkpIHsKCQkJbWVtc2V0KGxwLT5EZWZhdWx0S2V5cy5rZXlbMF0ua2V5LCAwLCBNQVhfS0VZX1NJWkUpOwoKCQkJa2V5X3N0cmluZzJrZXkodmFsdWUsICZscC0+RGVmYXVsdEtleXMua2V5WzBdKTsKCQl9IGVsc2UgewoJCQkgREJHX1dBUk5JTkcoRGJnSW5mbywgIiVzIGludmFsaWQ7IHdpbGwgYmUgaWdub3JlZFxuIiwgUEFSTV9OQU1FX0tFWTEpOwoJCX0KCX0gZWxzZSBpZiAoc3RyY21wKGtleSwgUEFSTV9OQU1FX0tFWTIpID09IDApIHsKCQlEQkdfVFJBQ0UoRGJnSW5mbywgIiVzLCB2YWx1ZTogJXNcbiIsIFBBUk1fTkFNRV9LRVkyLCB2YWx1ZSk7CgoJCWlmIChpc192YWxpZF9rZXlfc3RyaW5nKHZhbHVlKSkgewoJCQltZW1zZXQobHAtPkRlZmF1bHRLZXlzLmtleVsxXS5rZXksIDAsIE1BWF9LRVlfU0laRSk7CgoJCQlrZXlfc3RyaW5nMmtleSh2YWx1ZSwgJmxwLT5EZWZhdWx0S2V5cy5rZXlbMV0pOwoJCX0gZWxzZSB7CgkJCSBEQkdfV0FSTklORyhEYmdJbmZvLCAiJXMgaW52YWxpZDsgd2lsbCBiZSBpZ25vcmVkXG4iLCBQQVJNX05BTUVfS0VZMik7CgkJfQoJfSBlbHNlIGlmIChzdHJjbXAoa2V5LCBQQVJNX05BTUVfS0VZMykgPT0gMCkgewoJCURCR19UUkFDRShEYmdJbmZvLCAiJXMsIHZhbHVlOiAlc1xuIiwgUEFSTV9OQU1FX0tFWTMsIHZhbHVlKTsKCgkJaWYgKGlzX3ZhbGlkX2tleV9zdHJpbmcodmFsdWUpKSB7CgkJCW1lbXNldChscC0+RGVmYXVsdEtleXMua2V5WzJdLmtleSwgMCwgTUFYX0tFWV9TSVpFKTsKCgkJCWtleV9zdHJpbmcya2V5KHZhbHVlLCAmbHAtPkRlZmF1bHRLZXlzLmtleVsyXSk7CgkJfSBlbHNlIHsKCQkJIERCR19XQVJOSU5HKERiZ0luZm8sICIlcyBpbnZhbGlkOyB3aWxsIGJlIGlnbm9yZWRcbiIsIFBBUk1fTkFNRV9LRVkzKTsKCQl9Cgl9IGVsc2UgaWYgKHN0cmNtcChrZXksIFBBUk1fTkFNRV9LRVk0KSA9PSAwKSB7CgkJREJHX1RSQUNFKERiZ0luZm8sICIlcywgdmFsdWU6ICVzXG4iLCBQQVJNX05BTUVfS0VZNCwgdmFsdWUpOwoKCQlpZiAoaXNfdmFsaWRfa2V5X3N0cmluZyh2YWx1ZSkpIHsKCQkJbWVtc2V0KGxwLT5EZWZhdWx0S2V5cy5rZXlbM10ua2V5LCAwLCBNQVhfS0VZX1NJWkUpOwoKCQkJa2V5X3N0cmluZzJrZXkodmFsdWUsICZscC0+RGVmYXVsdEtleXMua2V5WzNdKTsKCQl9IGVsc2UgewoJCQkgREJHX1dBUk5JTkcoRGJnSW5mbywgIiVzIGludmFsaWQ7IHdpbGwgYmUgaWdub3JlZFxuIiwgUEFSTV9OQU1FX0tFWTQpOwoJCX0KCX0KCS8qIE5ldyBQYXJhbWV0ZXJzIGZvciBXQVJQICovCgllbHNlIGlmIChzdHJjbXAoa2V5LCBQQVJNX05BTUVfTE9BRF9CQUxBTkNJTkcpID09IDApIHsKCQlEQkdfVFJBQ0UoRGJnSW5mbywgIiVzLCB2YWx1ZTogJXNcbiIsIFBBUk1fTkFNRV9MT0FEX0JBTEFOQ0lORywgdmFsdWUpOwoJCWxwLT5sb2FkQmFsYW5jaW5nID0gcGFyc2VfeWVzX25vKHZhbHVlKTsKCX0gZWxzZSBpZiAoc3RyY21wKGtleSwgUEFSTV9OQU1FX01FRElVTV9ESVNUUklCVVRJT04pID09IDApIHsKCQlEQkdfVFJBQ0UoRGJnSW5mbywgIiVzLCB2YWx1ZTogJXNcbiIsIFBBUk1fTkFNRV9NRURJVU1fRElTVFJJQlVUSU9OLCB2YWx1ZSk7CgkJbHAtPm1lZGl1bURpc3RyaWJ1dGlvbiA9IHBhcnNlX3llc19ubyh2YWx1ZSk7Cgl9IGVsc2UgaWYgKHN0cmNtcChrZXksIFBBUk1fTkFNRV9NSUNST1dBVkVfUk9CVVNUTkVTUykgPT0gMCkgewoJCURCR19UUkFDRShEYmdJbmZvLCAiJXMsIHZhbHVlOiAlc1xuIiwgUEFSTV9OQU1FX01JQ1JPV0FWRV9ST0JVU1RORVNTLCB2YWx1ZSk7CgkJbHAtPk1pY3Jvd2F2ZVJvYnVzdG5lc3MgPSBwYXJzZV95ZXNfbm8odmFsdWUpOwoJfSBlbHNlIGlmIChzdHJjbXAoa2V5LCBQQVJNX05BTUVfTVVMVElDQVNUX1JBVEUpID09IDApIHsKCQlEQkdfVFJBQ0UoRGJnSW5mbywgIiVzLCB2YWx1ZTogJXNcbiIsIFBBUk1fTkFNRV9NVUxUSUNBU1RfUkFURSwgdmFsdWUpOwoKCQl2YWx1ZV9jb252ZXJ0ID0gc2ltcGxlX3N0cnRvdWwodmFsdWUsIE5VTEwsIDApOwoKCQlpZiAoKHZhbHVlX2NvbnZlcnQgPj0gUEFSTV9NSU5fTVVMVElDQVNUX1JBVEUpICYmICh2YWx1ZV9jb252ZXJ0IDw9IFBBUk1fTUFYX01VTFRJQ0FTVF9SQVRFKSkKCQkJbHAtPk11bHRpY2FzdFJhdGVbMF0gPSB2YWx1ZV9jb252ZXJ0OwoJCWVsc2UKCQkJREJHX1dBUk5JTkcoRGJnSW5mbywgIiVzIGludmFsaWQ7IHdpbGwgYmUgaWdub3JlZFxuIiwgUEFSTV9OQU1FX01VTFRJQ0FTVF9SQVRFKTsKCX0gZWxzZSBpZiAoc3RyY21wKGtleSwgUEFSTV9OQU1FX09XTl9DSEFOTkVMKSA9PSAwKSB7CgkJREJHX1RSQUNFKERiZ0luZm8sICIlcywgdmFsdWU6ICVzXG4iLCBQQVJNX05BTUVfT1dOX0NIQU5ORUwsIHZhbHVlKTsKCgkJdmFsdWVfY29udmVydCA9IHNpbXBsZV9zdHJ0b3VsKHZhbHVlLCBOVUxMLCAwKTsKCQlpZiAod2xfaXNfYV92YWxpZF9jaGFuKHZhbHVlX2NvbnZlcnQpKSB7CgkJCWlmICh2YWx1ZV9jb252ZXJ0ID4gMTQpCgkJCQl2YWx1ZV9jb252ZXJ0ID0gdmFsdWVfY29udmVydCB8IDB4MTAwOwoJCQlscC0+Q2hhbm5lbCA9IHZhbHVlX2NvbnZlcnQ7CgkJfSBlbHNlIHsKCQkJREJHX1dBUk5JTkcoRGJnSW5mbywgIiVzIGludmFsaWQ7IHdpbGwgYmUgaWdub3JlZFxuIiwgUEFSTV9OQU1FX09XTl9DSEFOTkVMKTsKCQl9Cgl9IGVsc2UgaWYgKHN0cmNtcChrZXksIFBBUk1fTkFNRV9PV05fTkFNRSkgPT0gMCkgewoJCURCR19UUkFDRShEYmdJbmZvLCAiJXMsIHZhbHVlOiAlc1xuIiwgUEFSTV9OQU1FX09XTl9OQU1FLCB2YWx1ZSk7CgoJCW1lbXNldChscC0+U3RhdGlvbk5hbWUsIDAsIChQQVJNX01BWF9OQU1FX0xFTiArIDEpKTsKCgkJLyogTWFrZSBzdXJlIHRoZSB2YWx1ZSBpc24ndCB0b28gbG9uZyAqLwoJCXN0cmluZ19sZW5ndGggPSBzdHJsZW4odmFsdWUpOwoJCWlmIChzdHJpbmdfbGVuZ3RoID4gUEFSTV9NQVhfTkFNRV9MRU4pIHsKCQkJREJHX1dBUk5JTkcoRGJnSW5mbywgIiVzIHRvbyBsb25nOyB3aWxsIGJlIHRydW5jYXRlZFxuIiwgUEFSTV9OQU1FX09XTl9OQU1FKTsKCQkJc3RyaW5nX2xlbmd0aCA9IFBBUk1fTUFYX05BTUVfTEVOOwoJCX0KCgkJbWVtY3B5KGxwLT5TdGF0aW9uTmFtZSwgdmFsdWUsIHN0cmluZ19sZW5ndGgpOwoJfSBlbHNlIGlmIChzdHJjbXAoa2V5LCBQQVJNX05BTUVfUlRTX1RIUkVTSE9MRCkgPT0gMCkgewoJCURCR19UUkFDRShEYmdJbmZvLCAiJXMsIHZhbHVlOiAlc1xuIiwgUEFSTV9OQU1FX1JUU19USFJFU0hPTEQsIHZhbHVlKTsKCgkJdmFsdWVfY29udmVydCA9IHNpbXBsZV9zdHJ0b3VsKHZhbHVlLCBOVUxMLCAwKTsKCQlpZiAoKHZhbHVlX2NvbnZlcnQgPj0gUEFSTV9NSU5fUlRTX1RIUkVTSE9MRCkgJiYgKHZhbHVlX2NvbnZlcnQgPD0gUEFSTV9NQVhfUlRTX1RIUkVTSE9MRCkpCgkJCWxwLT5SVFNUaHJlc2hvbGQgPSB2YWx1ZV9jb252ZXJ0OwoJCWVsc2UKCQkJREJHX1dBUk5JTkcoRGJnSW5mbywgIiVzIGludmFsaWQ7IHdpbGwgYmUgaWdub3JlZFxuIiwgUEFSTV9OQU1FX1JUU19USFJFU0hPTEQpOwoJfSBlbHNlIGlmIChzdHJjbXAoa2V5LCBQQVJNX05BTUVfU1JTQ18yR0haKSA9PSAwKSB7CgkJREJHX1RSQUNFKERiZ0luZm8sICIlcywgdmFsdWU6ICVzXG4iLCBQQVJNX05BTUVfU1JTQ18yR0haLCB2YWx1ZSk7CgoJCXZhbHVlX2NvbnZlcnQgPSBzaW1wbGVfc3RydG91bCh2YWx1ZSwgTlVMTCwgMCk7CgkJaWYgKCh2YWx1ZV9jb252ZXJ0ID49IFBBUk1fTUlOX1NSU0MpIHx8ICh2YWx1ZV9jb252ZXJ0IDw9IFBBUk1fTUFYX1NSU0MpKQoJCQlscC0+c3JzY1swXSA9IHZhbHVlX2NvbnZlcnQ7CgkJZWxzZQoJCQlEQkdfV0FSTklORyhEYmdJbmZvLCAiJXMgaW52YWlkOyB3aWxsIGJlIGlnbm9yZWRcbiIsIFBBUk1fTkFNRV9TUlNDXzJHSFopOwoJfSBlbHNlIGlmIChzdHJjbXAoa2V5LCBQQVJNX05BTUVfU1JTQ181R0haKSA9PSAwKSB7CgkJREJHX1RSQUNFKERiZ0luZm8sICIlcywgdmFsdWU6ICVzXG4iLCBQQVJNX05BTUVfU1JTQ181R0haLCB2YWx1ZSk7CgoJCXZhbHVlX2NvbnZlcnQgPSBzaW1wbGVfc3RydG91bCh2YWx1ZSwgTlVMTCwgMCk7CgkJaWYgKCh2YWx1ZV9jb252ZXJ0ID49IFBBUk1fTUlOX1NSU0MpIHx8ICh2YWx1ZV9jb252ZXJ0IDw9IFBBUk1fTUFYX1NSU0MpKQoJCQlscC0+c3JzY1sxXSA9IHZhbHVlX2NvbnZlcnQ7CgkJZWxzZQoJCQlEQkdfV0FSTklORyhEYmdJbmZvLCAiJXMgaW52YWlkOyB3aWxsIGJlIGlnbm9yZWRcbiIsIFBBUk1fTkFNRV9TUlNDXzVHSFopOwoJfSBlbHNlIGlmIChzdHJjbXAoa2V5LCBQQVJNX05BTUVfU1lTVEVNX1NDQUxFKSA9PSAwKSB7CgkJREJHX1RSQUNFKERiZ0luZm8sICIlcywgdmFsdWU6ICVzXG4iLCBQQVJNX05BTUVfU1lTVEVNX1NDQUxFLCB2YWx1ZSk7CgoJCXZhbHVlX2NvbnZlcnQgPSBzaW1wbGVfc3RydG91bCh2YWx1ZSwgTlVMTCwgMCk7CgkJaWYgKCh2YWx1ZV9jb252ZXJ0ID49IFBBUk1fTUlOX1NZU1RFTV9TQ0FMRSkgJiYgKHZhbHVlX2NvbnZlcnQgPD0gUEFSTV9NQVhfU1lTVEVNX1NDQUxFKSkKCQkJbHAtPkRpc3RhbmNlQmV0d2VlbkFQcyA9IHZhbHVlX2NvbnZlcnQ7CgkJZWxzZQoJCQlEQkdfV0FSTklORyhEYmdJbmZvLCAiJXMgaW52YWxpZDsgd2lsbCBiZSBpZ25vcmVkXG4iLCBQQVJNX05BTUVfU1lTVEVNX1NDQUxFKTsKCX0gZWxzZSBpZiAoc3RyY21wKGtleSwgUEFSTV9OQU1FX1RYX0tFWSkgPT0gMCkgewoJCURCR19UUkFDRShEYmdJbmZvLCAiJXMsIHZhbHVlOiAlc1xuIiwgUEFSTV9OQU1FX1RYX0tFWSwgdmFsdWUpOwoKCQl2YWx1ZV9jb252ZXJ0ID0gc2ltcGxlX3N0cnRvdWwodmFsdWUsIE5VTEwsIDApOwoJCWlmICgodmFsdWVfY29udmVydCA+PSBQQVJNX01JTl9UWF9LRVkpICYmICh2YWx1ZV9jb252ZXJ0IDw9IFBBUk1fTUFYX1RYX0tFWSkpCgkJCWxwLT5UcmFuc21pdEtleUlEID0gc2ltcGxlX3N0cnRvdWwodmFsdWUsIE5VTEwsIDApOwoJCWVsc2UKCQkJREJHX1dBUk5JTkcoRGJnSW5mbywgIiVzIGludmFsaWQ7IHdpbGwgYmUgaWdub3JlZFxuIiwgUEFSTV9OQU1FX1RYX0tFWSk7Cgl9IGVsc2UgaWYgKHN0cmNtcChrZXksIFBBUk1fTkFNRV9UWF9SQVRFKSA9PSAwKSB7CgkJREJHX1RSQUNFKERiZ0luZm8sICIlcywgdmFsdWU6ICVzXG4iLCBQQVJNX05BTUVfVFhfUkFURSwgdmFsdWUpOwoKCQl2YWx1ZV9jb252ZXJ0ID0gc2ltcGxlX3N0cnRvdWwodmFsdWUsIE5VTEwsIDApOwoJCWlmICgodmFsdWVfY29udmVydCA+PSBQQVJNX01JTl9UWF9SQVRFKSAmJiAodmFsdWVfY29udmVydCA8PSBQQVJNX01BWF9UWF9SQVRFKSkKCQkJbHAtPlR4UmF0ZUNvbnRyb2xbMF0gPSB2YWx1ZV9jb252ZXJ0OwoJCWVsc2UKCQkJREJHX1dBUk5JTkcoRGJnSW5mbywgIiVzIGludmFsaWQ7IHdpbGwgYmUgaWdub3JlZFxuIiwgUEFSTV9OQU1FX1RYX1JBVEUpOwoJfSBlbHNlIGlmIChzdHJjbXAoa2V5LCBQQVJNX05BTUVfVFhfUE9XX0xFVkVMKSA9PSAwKSB7CgkJREJHX1RSQUNFKERiZ0luZm8sICIlcywgdmFsdWU6ICVzXG4iLCBQQVJNX05BTUVfVFhfUE9XX0xFVkVMLCB2YWx1ZSk7CgoJCXZhbHVlX2NvbnZlcnQgPSBzaW1wbGVfc3RydG91bCh2YWx1ZSwgTlVMTCwgMCk7CgkJaWYgKCh2YWx1ZV9jb252ZXJ0ID49IFBBUk1fTUlOX1RYX1BPV19MRVZFTCkgfHwgKHZhbHVlX2NvbnZlcnQgPD0gUEFSTV9NQVhfVFhfUE9XX0xFVkVMKSkKCQkJbHAtPnR4UG93TGV2ZWwgPSB2YWx1ZV9jb252ZXJ0OwoJCWVsc2UKCQkJREJHX1dBUk5JTkcoRGJnSW5mbywgIiVzIGludmFsaWQ7IHdpbGwgYmUgaWdub3JlZFxuIiwgUEFSTV9OQU1FX1RYX1BPV19MRVZFTCk7Cgl9CgoJLyogTmVlZCB0byBhZGQ/IDogQ291bnRyeSBjb2RlLCBTaG9ydC9Mb25nIHJldHJ5ICovCgoJLyogQ29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzIHNwZWNpZmljIHRvIFNUQSBtb2RlICovCiNpZiAxIC8qIDs/IChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9TVEEgKi8KLyogOz9zZWVtcyByZWFzb25hYmxlIHRoYXQgZXZlbiBhbiBBUC1vbmx5IGRyaXZlciBjb3VsZCBhZmZvcmQgdGhpcyBzbWFsbCBhZGRpdGlvbmFsIGZvb3RwcmludCAqLwoJaWYgKENOVl9JTlRfVE9fTElUVExFKGxwLT5oY2ZDdHguSUZCX0ZXSWRlbnRpdHkuY29tcF9pZCkgPT0gQ09NUF9JRF9GV19TVEEpIHsKCQkJCQkvKiA7P3Nob3VsZCB3ZSByZXR1cm4gYW4gZXJyb3Igc3RhdHVzIGluIEFQIG1vZGUgKi8KCQlpZiAoc3RyY21wKGtleSwgUEFSTV9OQU1FX1BPUlRfVFlQRSkgPT0gMCkgewoJCQlEQkdfVFJBQ0UoRGJnSW5mbywgIiVzLCB2YWx1ZTogJXNcbiIsIFBBUk1fTkFNRV9QT1JUX1RZUEUsIHZhbHVlKTsKCgkJCXZhbHVlX2NvbnZlcnQgPSBzaW1wbGVfc3RydG91bCh2YWx1ZSwgTlVMTCwgMCk7CgkJCWlmICgodmFsdWVfY29udmVydCA9PSBQQVJNX01JTl9QT1JUX1RZUEUpIHx8ICh2YWx1ZV9jb252ZXJ0ID09IFBBUk1fTUFYX1BPUlRfVFlQRSkpCgkJCQlscC0+UG9ydFR5cGUgPSB2YWx1ZV9jb252ZXJ0OwoJCQllbHNlCgkJCQlEQkdfV0FSTklORyhEYmdJbmZvLCAiJXMgaW52YWxpZDsgd2lsbCBiZSBpZ25vcmVkXG4iLCBQQVJNX05BTUVfUE9SVF9UWVBFKTsKCQl9IGVsc2UgaWYgKHN0cmNtcChrZXksIFBBUk1fTkFNRV9QTV9FTkFCTEVEKSA9PSAwKSB7CgkJCURCR19UUkFDRShEYmdJbmZvLCAiJXMsIHZhbHVlOiAlc1xuIiwgUEFSTV9OQU1FX1BNX0VOQUJMRUQsIHZhbHVlKTsKCQkJdmFsdWVfY29udmVydCA9IHNpbXBsZV9zdHJ0b3VsKHZhbHVlLCBOVUxMLCAwKTsKCS8qIDs/IGhvdyBhYm91dCB3bF9tYWluLmMgY29udGFpbmluZwoJICogVkFMSURfUEFSQU0oUEFSTV9QTV9FTkFCTEVEIDw9IFdWTEFOX1BNX1NUQVRFX1NUQU5EQVJEIHx8CgkgKgkJCQkJIChQQVJNX1BNX0VOQUJMRUQgJiAweDdGRkYpIDw9IFdWTEFOX1BNX1NUQVRFX1NUQU5EQVJEKTsKCSAqLwoJCQlpZiAoKHZhbHVlX2NvbnZlcnQgJiAweDdGRkYpIDw9IFBBUk1fTUFYX1BNX0VOQUJMRUQpIHsKCQkJCWxwLT5QTUVuYWJsZWQgPSB2YWx1ZV9jb252ZXJ0OwoJCQl9IGVsc2UgewoJCQkJREJHX1dBUk5JTkcoRGJnSW5mbywgIiVzIGludmFsaWQ7IHdpbGwgYmUgaWdub3JlZFxuIiwgUEFSTV9OQU1FX1BNX0VOQUJMRUQpOwoJCQkJLyogOz90aGlzIGlzIGEgZGF0YSBlbnRyeSBlcnJvciwgaGVuY2Ugbm90IGEgREJHX1dBUk5JTkcgKi8KCQkJfQoJCX0gZWxzZSBpZiAoc3RyY21wKGtleSwgUEFSTV9OQU1FX0NSRUFURV9JQlNTKSA9PSAwKSB7CgkJCURCR19UUkFDRShEYmdJbmZvLCAiJXMsIHZhbHVlOiAlc1xuIiwgUEFSTV9OQU1FX0NSRUFURV9JQlNTLCB2YWx1ZSk7CgkJCWxwLT5DcmVhdGVJQlNTID0gcGFyc2VfeWVzX25vKHZhbHVlKTsKCQl9IGVsc2UgaWYgKHN0cmNtcChrZXksIFBBUk1fTkFNRV9NVUxUSUNBU1RfUlgpID09IDApIHsKCQkJREJHX1RSQUNFKERiZ0luZm8sICIlcywgdmFsdWU6ICVzXG4iLCBQQVJNX05BTUVfTVVMVElDQVNUX1JYLCB2YWx1ZSk7CgkJCWxwLT5NdWx0aWNhc3RSZWNlaXZlID0gcGFyc2VfeWVzX25vKHZhbHVlKTsKCQl9IGVsc2UgaWYgKHN0cmNtcChrZXksIFBBUk1fTkFNRV9NQVhfU0xFRVApID09IDApIHsKCQkJREJHX1RSQUNFKERiZ0luZm8sICIlcywgdmFsdWU6ICVzXG4iLCBQQVJNX05BTUVfTUFYX1NMRUVQLCB2YWx1ZSk7CgoJCQl2YWx1ZV9jb252ZXJ0ID0gc2ltcGxlX3N0cnRvdWwodmFsdWUsIE5VTEwsIDApOwoJCQlpZiAoKHZhbHVlX2NvbnZlcnQgPj0gMCkgJiYgKHZhbHVlX2NvbnZlcnQgPD0gNjU1MzUpKQoJCQkJbHAtPk1heFNsZWVwRHVyYXRpb24gPSB2YWx1ZV9jb252ZXJ0OwoJCQllbHNlCgkJCQlEQkdfV0FSTklORyhEYmdJbmZvLCAiJXMgaW52YWxpZDsgd2lsbCBiZSBpZ25vcmVkXG4iLCBQQVJNX05BTUVfTUFYX1NMRUVQKTsKCQl9IGVsc2UgaWYgKHN0cmNtcChrZXksIFBBUk1fTkFNRV9ORVRXT1JLX0FERFIpID09IDApIHsKCQkJREJHX1RSQUNFKERiZ0luZm8sICIlcywgdmFsdWU6ICVzXG4iLCBQQVJNX05BTUVfTkVUV09SS19BRERSLCB2YWx1ZSk7CgoJCQlpZiAocGFyc2VfbWFjX2FkZHJlc3ModmFsdWUsIG1hY192YWx1ZSkgPT0gRVRIX0FMRU4pCgkJCQltZW1jcHkobHAtPk1BQ0FkZHJlc3MsIG1hY192YWx1ZSwgRVRIX0FMRU4pOwoJCQllbHNlCgkJCQlEQkdfV0FSTklORyhEYmdJbmZvLCAiJXMgaW52YWxpZDsgd2lsbCBiZSBpZ25vcmVkXG4iLCBQQVJNX05BTUVfTkVUV09SS19BRERSKTsKCQl9IGVsc2UgaWYgKHN0cmNtcChrZXksIFBBUk1fTkFNRV9BVVRIRU5USUNBVElPTikgPT0gMCkgewoJCQlEQkdfVFJBQ0UoRGJnSW5mbywgIiVzLCB2YWx1ZTogJXNcbiIsIFBBUk1fTkFNRV9BVVRIRU5USUNBVElPTiwgdmFsdWUpOwoKCQkJdmFsdWVfY29udmVydCA9IHNpbXBsZV9zdHJ0b3VsKHZhbHVlLCBOVUxMLCAwKTsKCQkJaWYgKCh2YWx1ZV9jb252ZXJ0ID49IFBBUk1fTUlOX0FVVEhFTlRJQ0FUSU9OKSAmJiAodmFsdWVfY29udmVydCA8PSBQQVJNX01BWF9BVVRIRU5USUNBVElPTikpCgkJCQlscC0+YXV0aGVudGljYXRpb24gPSB2YWx1ZV9jb252ZXJ0OwoJCQllbHNlCgkJCQlEQkdfV0FSTklORyhEYmdJbmZvLCAiJXMgaW52YWxpZDsgd2lsbCBiZSBpZ25vcmVkXG4iLCBQQVJNX05BTUVfQVVUSEVOVElDQVRJT04pOwoJCX0gZWxzZSBpZiAoc3RyY21wKGtleSwgUEFSTV9OQU1FX09XTl9BVElNX1dJTkRPVykgPT0gMCkgewoJCQlEQkdfVFJBQ0UoRGJnSW5mbywgIiVzLCB2YWx1ZTogJXNcbiIsIFBBUk1fTkFNRV9PV05fQVRJTV9XSU5ET1csIHZhbHVlKTsKCgkJCXZhbHVlX2NvbnZlcnQgPSBzaW1wbGVfc3RydG91bCh2YWx1ZSwgTlVMTCwgMCk7CgkJCWlmICgodmFsdWVfY29udmVydCA+PSBQQVJNX01JTl9PV05fQVRJTV9XSU5ET1cpICYmICh2YWx1ZV9jb252ZXJ0IDw9IFBBUk1fTUFYX09XTl9BVElNX1dJTkRPVykpCgkJCQlscC0+YXRpbVdpbmRvdyA9IHZhbHVlX2NvbnZlcnQ7CgkJCWVsc2UKCQkJCURCR19XQVJOSU5HKERiZ0luZm8sICIlcyBpbnZhbGlkOyB3aWxsIGJlIGlnbm9yZWRcbiIsIFBBUk1fTkFNRV9PV05fQVRJTV9XSU5ET1cpOwoJCX0gZWxzZSBpZiAoc3RyY21wKGtleSwgUEFSTV9OQU1FX1BNX0hPTERPVkVSX0RVUkFUSU9OKSA9PSAwKSB7CgkJCURCR19UUkFDRShEYmdJbmZvLCAiJXMsIHZhbHVlOiAlc1xuIiwgUEFSTV9OQU1FX1BNX0hPTERPVkVSX0RVUkFUSU9OLCB2YWx1ZSk7CgoJCQl2YWx1ZV9jb252ZXJ0ID0gc2ltcGxlX3N0cnRvdWwodmFsdWUsIE5VTEwsIDApOwoJCQlpZiAoKHZhbHVlX2NvbnZlcnQgPj0gUEFSTV9NSU5fUE1fSE9MRE9WRVJfRFVSQVRJT04pICYmICh2YWx1ZV9jb252ZXJ0IDw9IFBBUk1fTUFYX1BNX0hPTERPVkVSX0RVUkFUSU9OKSkKCQkJCWxwLT5ob2xkb3ZlckR1cmF0aW9uID0gdmFsdWVfY29udmVydDsKCQkJZWxzZQoJCQkJREJHX1dBUk5JTkcoRGJnSW5mbywgIiVzIGludmFsaWQ7IHdpbGwgYmUgaWdub3JlZFxuIiwgUEFSTV9OQU1FX1BNX0hPTERPVkVSX0RVUkFUSU9OKTsKCQl9IGVsc2UgaWYgKHN0cmNtcChrZXksIFBBUk1fTkFNRV9QUk9NSVNDVU9VU19NT0RFKSA9PSAwKSB7CgkJCURCR19UUkFDRShEYmdJbmZvLCAiJXMsIHZhbHVlOiAlc1xuIiwgUEFSTV9OQU1FX1BST01JU0NVT1VTX01PREUsIHZhbHVlKTsKCQkJbHAtPnByb21pc2N1b3VzTW9kZSA9IHBhcnNlX3llc19ubyh2YWx1ZSk7CgkJfSBlbHNlIGlmIChzdHJjbXAoa2V5LCBQQVJNX05BTUVfQ09OTkVDVElPTl9DT05UUk9MKSA9PSAwKSB7CgkJCURCR19UUkFDRShEYmdJbmZvLCAiJXMsIHZhbHVlOiAlc1xuIiwgUEFSTV9OQU1FX0NPTk5FQ1RJT05fQ09OVFJPTCwgdmFsdWUpOwoKCQkJdmFsdWVfY29udmVydCA9IHNpbXBsZV9zdHJ0b3VsKHZhbHVlLCBOVUxMLCAwKTsKCQkJaWYgKCh2YWx1ZV9jb252ZXJ0ID49IFBBUk1fTUlOX0NPTk5FQ1RJT05fQ09OVFJPTCkgJiYgKHZhbHVlX2NvbnZlcnQgPD0gUEFSTV9NQVhfQ09OTkVDVElPTl9DT05UUk9MKSkKCQkJCWxwLT5jb25uZWN0aW9uQ29udHJvbCA9IHZhbHVlX2NvbnZlcnQ7CgkJCWVsc2UKCQkJCURCR19XQVJOSU5HKERiZ0luZm8sICIlcyBpbnZhbGlkOyB3aWxsIGJlIGlnbm9yZWRcbiIsIFBBUk1fTkFNRV9DT05ORUNUSU9OX0NPTlRST0wpOwoJCX0KCgkJLyogTmVlZCB0byBhZGQ/IDogUHJvYmUgRGF0YSBSYXRlICovCgl9CiNlbmRpZiAgLyogKEhDRl9UWVBFKSAmIEhDRl9UWVBFX1NUQSAqLwoKCS8qIENvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyBzcGVjaWZpYyB0byBBUCBtb2RlICovCiNpZiAxIC8qIDs/IChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9BUCAqLwoJCS8qIDs/c2hvdWxkIHdlIHJlc3RvcmUgdGhpcyB0byBhbGxvdyBzbWFsbGVyIG1lbW9yeSBmb290cHJpbnQgKi8KCWlmIChDTlZfSU5UX1RPX0xJVFRMRShscC0+aGNmQ3R4LklGQl9GV0lkZW50aXR5LmNvbXBfaWQpID09IENPTVBfSURfRldfQVApIHsKCQlpZiAoc3RyY21wKGtleSwgUEFSTV9OQU1FX09XTl9EVElNX1BFUklPRCkgPT0gMCkgewoJCQlEQkdfVFJBQ0UoRGJnSW5mbywgIiVzLCB2YWx1ZTogJXNcbiIsIFBBUk1fTkFNRV9PV05fRFRJTV9QRVJJT0QsIHZhbHVlKTsKCgkJCXZhbHVlX2NvbnZlcnQgPSBzaW1wbGVfc3RydG91bCh2YWx1ZSwgTlVMTCwgMCk7CgkJCWlmICh2YWx1ZV9jb252ZXJ0ID49IFBBUk1fTUlOX09XTl9EVElNX1BFUklPRCkKCQkJCWxwLT5EVElNUGVyaW9kID0gdmFsdWVfY29udmVydDsKCQkJZWxzZQoJCQkJREJHX1dBUk5JTkcoRGJnSW5mbywgIiVzIGludmFsaWQ7IHdpbGwgYmUgaWdub3JlZFxuIiwgUEFSTV9OQU1FX09XTl9EVElNX1BFUklPRCk7CgkJfSBlbHNlIGlmIChzdHJjbXAoa2V5LCBQQVJNX05BTUVfUkVKRUNUX0FOWSkgPT0gMCkgewoJCQlEQkdfVFJBQ0UoRGJnSW5mbywgIiVzLCB2YWx1ZTogJXNcbiIsIFBBUk1fTkFNRV9SRUpFQ1RfQU5ZLCB2YWx1ZSk7CgkJCWxwLT5SZWplY3RBbnkgPSBwYXJzZV95ZXNfbm8odmFsdWUpOwoJCX0gZWxzZSBpZiAoc3RyY21wKGtleSwgUEFSTV9OQU1FX0VYQ0xVREVfVU5FTkNSWVBURUQpID09IDApIHsKCQkJREJHX1RSQUNFKERiZ0luZm8sICIlcywgdmFsdWU6ICVzXG4iLCBQQVJNX05BTUVfRVhDTFVERV9VTkVOQ1JZUFRFRCwgdmFsdWUpOwoJCQlscC0+RXhjbHVkZVVuZW5jcnlwdGVkID0gcGFyc2VfeWVzX25vKHZhbHVlKTsKCQl9IGVsc2UgaWYgKHN0cmNtcChrZXksIFBBUk1fTkFNRV9NVUxUSUNBU1RfUE1fQlVGRkVSSU5HKSA9PSAwKSB7CgkJCURCR19UUkFDRShEYmdJbmZvLCAiJXMsIHZhbHVlOiAlc1xuIiwgUEFSTV9OQU1FX01VTFRJQ0FTVF9QTV9CVUZGRVJJTkcsIHZhbHVlKTsKCQkJbHAtPkV4Y2x1ZGVVbmVuY3J5cHRlZCA9IHBhcnNlX3llc19ubyh2YWx1ZSk7CgkJfSBlbHNlIGlmIChzdHJjbXAoa2V5LCBQQVJNX05BTUVfSU5UUkFfQlNTX1JFTEFZKSA9PSAwKSB7CgkJCURCR19UUkFDRShEYmdJbmZvLCAiJXMsIHZhbHVlOiAlc1xuIiwgUEFSTV9OQU1FX0lOVFJBX0JTU19SRUxBWSwgdmFsdWUpOwoJCQlscC0+RXhjbHVkZVVuZW5jcnlwdGVkID0gcGFyc2VfeWVzX25vKHZhbHVlKTsKCQl9IGVsc2UgaWYgKHN0cmNtcChrZXksIFBBUk1fTkFNRV9PV05fQkVBQ09OX0lOVEVSVkFMKSA9PSAwKSB7CgkJCURCR19UUkFDRShEYmdJbmZvLCAiJXMsIHZhbHVlOiAlc1xuIiwgUEFSTV9OQU1FX09XTl9CRUFDT05fSU5URVJWQUwsIHZhbHVlKTsKCgkJCXZhbHVlX2NvbnZlcnQgPSBzaW1wbGVfc3RydG91bCh2YWx1ZSwgTlVMTCwgMCk7CgkJCWlmICh2YWx1ZV9jb252ZXJ0ID49IFBBUk1fTUlOX09XTl9CRUFDT05fSU5URVJWQUwpCgkJCQlscC0+b3duQmVhY29uSW50ZXJ2YWwgPSB2YWx1ZV9jb252ZXJ0OwoJCQllbHNlCgkJCQlEQkdfV0FSTklORyhEYmdJbmZvLCAiJXMgaW52YWxpZDsgd2lsbCBiZSBpZ25vcmVkXG4iLCBQQVJNX05BTUVfT1dOX0JFQUNPTl9JTlRFUlZBTCk7CgkJfSBlbHNlIGlmIChzdHJjbXAoa2V5LCBQQVJNX05BTUVfQ09FWElTVEVOQ0UpID09IDApIHsKCQkJREJHX1RSQUNFKERiZ0luZm8sICIlcywgdmFsdWU6ICVzXG4iLCBQQVJNX05BTUVfQ09FWElTVEVOQ0UsIHZhbHVlKTsKCgkJCXZhbHVlX2NvbnZlcnQgPSBzaW1wbGVfc3RydG91bCh2YWx1ZSwgTlVMTCwgMCk7CgkJCWlmICh2YWx1ZV9jb252ZXJ0ID49IFBBUk1fTUlOX0NPRVhJU1RFTkNFKQoJCQkJbHAtPmNvZXhpc3RlbmNlID0gdmFsdWVfY29udmVydDsKCQkJZWxzZQoJCQkJREJHX1dBUk5JTkcoRGJnSW5mbywgIiVzIGludmFsaWQ7IHdpbGwgYmUgaWdub3JlZFxuIiwgUEFSTV9OQU1FX0NPRVhJU1RFTkNFKTsKCQl9CgojaWZkZWYgVVNFX1dEUwoJCWVsc2UgaWYgKHN0cmNtcChrZXksIFBBUk1fTkFNRV9SVFNfVEhSRVNIT0xEMSkgPT0gMCkgewoJCQlEQkdfVFJBQ0UoRGJnSW5mbywgIiVzLCB2YWx1ZTogJXNcbiIsIFBBUk1fTkFNRV9SVFNfVEhSRVNIT0xEMSwgdmFsdWUpOwoKCQkJdmFsdWVfY29udmVydCA9IHNpbXBsZV9zdHJ0b3VsKHZhbHVlLCBOVUxMLCAwKTsKCQkJaWYgKCh2YWx1ZV9jb252ZXJ0ID49IFBBUk1fTUlOX1JUU19USFJFU0hPTEQpICYmICh2YWx1ZV9jb252ZXJ0IDw9IFBBUk1fTUFYX1JUU19USFJFU0hPTEQpKQoJCQkJbHAtPndkc19wb3J0WzBdLnJ0c1RocmVzaG9sZCA9IHZhbHVlX2NvbnZlcnQ7CgkJCWVsc2UKCQkJCURCR19XQVJOSU5HKERiZ0luZm8sICIlcyBpbnZhbGlkOyB3aWxsIGJlIGlnbm9yZWRcbiIsIFBBUk1fTkFNRV9SVFNfVEhSRVNIT0xEMSk7CgkJfSBlbHNlIGlmIChzdHJjbXAoa2V5LCBQQVJNX05BTUVfUlRTX1RIUkVTSE9MRDIpID09IDApIHsKCQkJREJHX1RSQUNFKERiZ0luZm8sICIlcywgdmFsdWU6ICVzXG4iLCBQQVJNX05BTUVfUlRTX1RIUkVTSE9MRDIsIHZhbHVlKTsKCgkJCXZhbHVlX2NvbnZlcnQgPSBzaW1wbGVfc3RydG91bCh2YWx1ZSwgTlVMTCwgMCk7CgkJCWlmICgodmFsdWVfY29udmVydCA+PSBQQVJNX01JTl9SVFNfVEhSRVNIT0xEKSAmJiAodmFsdWVfY29udmVydCA8PSBQQVJNX01BWF9SVFNfVEhSRVNIT0xEKSkKCQkJCWxwLT53ZHNfcG9ydFsxXS5ydHNUaHJlc2hvbGQgPSB2YWx1ZV9jb252ZXJ0OwoJCQllbHNlCgkJCQlEQkdfV0FSTklORyhEYmdJbmZvLCAiJXMgaW52YWxpZDsgd2lsbCBiZSBpZ25vcmVkXG4iLCBQQVJNX05BTUVfUlRTX1RIUkVTSE9MRDIpOwoJCX0gZWxzZSBpZiAoc3RyY21wKGtleSwgUEFSTV9OQU1FX1JUU19USFJFU0hPTEQzKSA9PSAwKSB7CgkJCURCR19UUkFDRShEYmdJbmZvLCAiJXMsIHZhbHVlOiAlc1xuIiwgUEFSTV9OQU1FX1JUU19USFJFU0hPTEQzLCB2YWx1ZSk7CgoJCQl2YWx1ZV9jb252ZXJ0ID0gc2ltcGxlX3N0cnRvdWwodmFsdWUsIE5VTEwsIDApOwoJCQlpZiAoKHZhbHVlX2NvbnZlcnQgPj0gUEFSTV9NSU5fUlRTX1RIUkVTSE9MRCkgJiYgKHZhbHVlX2NvbnZlcnQgPD0gUEFSTV9NQVhfUlRTX1RIUkVTSE9MRCkpCgkJCQlscC0+d2RzX3BvcnRbMl0ucnRzVGhyZXNob2xkID0gdmFsdWVfY29udmVydDsKCQkJZWxzZQoJCQkJREJHX1dBUk5JTkcoRGJnSW5mbywgIiVzIGludmFsaWQ7IHdpbGwgYmUgaWdub3JlZFxuIiwgUEFSTV9OQU1FX1JUU19USFJFU0hPTEQzKTsKCQl9IGVsc2UgaWYgKHN0cmNtcChrZXksIFBBUk1fTkFNRV9SVFNfVEhSRVNIT0xENCkgPT0gMCkgewoJCQlEQkdfVFJBQ0UoRGJnSW5mbywgIiVzLCB2YWx1ZTogJXNcbiIsIFBBUk1fTkFNRV9SVFNfVEhSRVNIT0xENCwgdmFsdWUpOwoKCQkJdmFsdWVfY29udmVydCA9IHNpbXBsZV9zdHJ0b3VsKHZhbHVlLCBOVUxMLCAwKTsKCQkJaWYgKCh2YWx1ZV9jb252ZXJ0ID49IFBBUk1fTUlOX1JUU19USFJFU0hPTEQpICYmICh2YWx1ZV9jb252ZXJ0IDw9IFBBUk1fTUFYX1JUU19USFJFU0hPTEQpKQoJCQkJbHAtPndkc19wb3J0WzNdLnJ0c1RocmVzaG9sZCA9IHZhbHVlX2NvbnZlcnQ7CgkJCWVsc2UKCQkJCURCR19XQVJOSU5HKERiZ0luZm8sICIlcyBpbnZhbGlkOyB3aWxsIGJlIGlnbm9yZWRcbiIsIFBBUk1fTkFNRV9SVFNfVEhSRVNIT0xENCk7CgkJfSBlbHNlIGlmIChzdHJjbXAoa2V5LCBQQVJNX05BTUVfUlRTX1RIUkVTSE9MRDUpID09IDApIHsKCQkJREJHX1RSQUNFKERiZ0luZm8sICIlcywgdmFsdWU6ICVzXG4iLCBQQVJNX05BTUVfUlRTX1RIUkVTSE9MRDUsIHZhbHVlKTsKCgkJCXZhbHVlX2NvbnZlcnQgPSBzaW1wbGVfc3RydG91bCh2YWx1ZSwgTlVMTCwgMCk7CgkJCWlmICgodmFsdWVfY29udmVydCA+PSBQQVJNX01JTl9SVFNfVEhSRVNIT0xEKSAmJiAodmFsdWVfY29udmVydCA8PSBQQVJNX01BWF9SVFNfVEhSRVNIT0xEKSkKCQkJCWxwLT53ZHNfcG9ydFs0XS5ydHNUaHJlc2hvbGQgPSB2YWx1ZV9jb252ZXJ0OwoJCQllbHNlCgkJCQlEQkdfV0FSTklORyhEYmdJbmZvLCAiJXMgaW52YWxpZDsgd2lsbCBiZSBpZ25vcmVkXG4iLCBQQVJNX05BTUVfUlRTX1RIUkVTSE9MRDUpOwoJCX0gZWxzZSBpZiAoc3RyY21wKGtleSwgUEFSTV9OQU1FX1JUU19USFJFU0hPTEQ2KSA9PSAwKSB7CgkJCURCR19UUkFDRShEYmdJbmZvLCAiJXMsIHZhbHVlOiAlc1xuIiwgUEFSTV9OQU1FX1JUU19USFJFU0hPTEQ2LCB2YWx1ZSk7CgoJCQl2YWx1ZV9jb252ZXJ0ID0gc2ltcGxlX3N0cnRvdWwodmFsdWUsIE5VTEwsIDApOwoJCQlpZiAoKHZhbHVlX2NvbnZlcnQgPj0gUEFSTV9NSU5fUlRTX1RIUkVTSE9MRCkgJiYgKHZhbHVlX2NvbnZlcnQgPD0gUEFSTV9NQVhfUlRTX1RIUkVTSE9MRCkpCgkJCQlscC0+d2RzX3BvcnRbNV0ucnRzVGhyZXNob2xkID0gdmFsdWVfY29udmVydDsKCQkJZWxzZQoJCQkJREJHX1dBUk5JTkcoRGJnSW5mbywgIiVzIGludmFsaWQ7IHdpbGwgYmUgaWdub3JlZFxuIiwgUEFSTV9OQU1FX1JUU19USFJFU0hPTEQ2KTsKCQl9IGVsc2UgaWYgKHN0cmNtcChrZXksIFBBUk1fTkFNRV9UWF9SQVRFMSkgPT0gMCkgewoJCQlEQkdfVFJBQ0UoRGJnSW5mbywgIiVzLCB2YWx1ZTogJXNcbiIsIFBBUk1fTkFNRV9UWF9SQVRFMSwgdmFsdWUpOwoKCQkJdmFsdWVfY29udmVydCA9IHNpbXBsZV9zdHJ0b3VsKHZhbHVlLCBOVUxMLCAwKTsKCQkJaWYgKCh2YWx1ZV9jb252ZXJ0ID49IFBBUk1fTUlOX1RYX1JBVEUpICYmICh2YWx1ZV9jb252ZXJ0IDw9IFBBUk1fTUFYX1RYX1JBVEUpKQoJCQkJbHAtPndkc19wb3J0WzBdLnR4UmF0ZUNudGwgPSB2YWx1ZV9jb252ZXJ0OwoJCQllbHNlCgkJCQlEQkdfV0FSTklORyhEYmdJbmZvLCAiJXMgaW52YWxpZDsgd2lsbCBiZSBpZ25vcmVkXG4iLCBQQVJNX05BTUVfVFhfUkFURTEpOwoJCX0gZWxzZSBpZiAoc3RyY21wKGtleSwgUEFSTV9OQU1FX1RYX1JBVEUyKSA9PSAwKSB7CgkJCURCR19UUkFDRShEYmdJbmZvLCAiJXMsIHZhbHVlOiAlc1xuIiwgUEFSTV9OQU1FX1RYX1JBVEUyLCB2YWx1ZSk7CgoJCQl2YWx1ZV9jb252ZXJ0ID0gc2ltcGxlX3N0cnRvdWwodmFsdWUsIE5VTEwsIDApOwoJCQlpZiAoKHZhbHVlX2NvbnZlcnQgPj0gUEFSTV9NSU5fVFhfUkFURSkgJiYgKHZhbHVlX2NvbnZlcnQgPD0gUEFSTV9NQVhfVFhfUkFURSkpCgkJCQlscC0+d2RzX3BvcnRbMV0udHhSYXRlQ250bCA9IHZhbHVlX2NvbnZlcnQ7CgkJCWVsc2UKCQkJCURCR19XQVJOSU5HKERiZ0luZm8sICIlcyBpbnZhbGlkOyB3aWxsIGJlIGlnbm9yZWRcbiIsIFBBUk1fTkFNRV9UWF9SQVRFMik7CgkJfSBlbHNlIGlmIChzdHJjbXAoa2V5LCBQQVJNX05BTUVfVFhfUkFURTMpID09IDApIHsKCQkJREJHX1RSQUNFKERiZ0luZm8sICIlcywgdmFsdWU6ICVzXG4iLCBQQVJNX05BTUVfVFhfUkFURTMsIHZhbHVlKTsKCgkJCXZhbHVlX2NvbnZlcnQgPSBzaW1wbGVfc3RydG91bCh2YWx1ZSwgTlVMTCwgMCk7CgkJCWlmICgodmFsdWVfY29udmVydCA+PSBQQVJNX01JTl9UWF9SQVRFKSAmJiAodmFsdWVfY29udmVydCA8PSBQQVJNX01BWF9UWF9SQVRFKSkKCQkJCWxwLT53ZHNfcG9ydFsyXS50eFJhdGVDbnRsID0gdmFsdWVfY29udmVydDsKCQkJZWxzZQoJCQkJREJHX1dBUk5JTkcoRGJnSW5mbywgIiVzIGludmFsaWQ7IHdpbGwgYmUgaWdub3JlZFxuIiwgUEFSTV9OQU1FX1RYX1JBVEUzKTsKCQl9IGVsc2UgaWYgKHN0cmNtcChrZXksIFBBUk1fTkFNRV9UWF9SQVRFNCkgPT0gMCkgewoJCQlEQkdfVFJBQ0UoRGJnSW5mbywgIiVzLCB2YWx1ZTogJXNcbiIsIFBBUk1fTkFNRV9UWF9SQVRFNCwgdmFsdWUpOwoKCQkJdmFsdWVfY29udmVydCA9IHNpbXBsZV9zdHJ0b3VsKHZhbHVlLCBOVUxMLCAwKTsKCQkJaWYgKCh2YWx1ZV9jb252ZXJ0ID49IFBBUk1fTUlOX1RYX1JBVEUpICYmICh2YWx1ZV9jb252ZXJ0IDw9IFBBUk1fTUFYX1RYX1JBVEUpKQoJCQkJbHAtPndkc19wb3J0WzNdLnR4UmF0ZUNudGwgPSB2YWx1ZV9jb252ZXJ0OwoJCQllbHNlCgkJCQlEQkdfV0FSTklORyhEYmdJbmZvLCAiJXMgaW52YWxpZDsgd2lsbCBiZSBpZ25vcmVkXG4iLCBQQVJNX05BTUVfVFhfUkFURTQpOwoJCX0gZWxzZSBpZiAoc3RyY21wKGtleSwgUEFSTV9OQU1FX1RYX1JBVEU1KSA9PSAwKSB7CgkJCURCR19UUkFDRShEYmdJbmZvLCAiJXMsIHZhbHVlOiAlc1xuIiwgUEFSTV9OQU1FX1RYX1JBVEU1LCB2YWx1ZSk7CgoJCQl2YWx1ZV9jb252ZXJ0ID0gc2ltcGxlX3N0cnRvdWwodmFsdWUsIE5VTEwsIDApOwoJCQlpZiAoKHZhbHVlX2NvbnZlcnQgPj0gUEFSTV9NSU5fVFhfUkFURSkgJiYgKHZhbHVlX2NvbnZlcnQgPD0gUEFSTV9NQVhfVFhfUkFURSkpCgkJCQlscC0+d2RzX3BvcnRbNF0udHhSYXRlQ250bCA9IHZhbHVlX2NvbnZlcnQ7CgkJCWVsc2UKCQkJCURCR19XQVJOSU5HKERiZ0luZm8sICIlcyBpbnZhbGlkOyB3aWxsIGJlIGlnbm9yZWRcbiIsIFBBUk1fTkFNRV9UWF9SQVRFNSk7CgkJfSBlbHNlIGlmIChzdHJjbXAoa2V5LCBQQVJNX05BTUVfVFhfUkFURTYpID09IDApIHsKCQkJREJHX1RSQUNFKERiZ0luZm8sICIlcywgdmFsdWU6ICVzXG4iLCBQQVJNX05BTUVfVFhfUkFURTYsIHZhbHVlKTsKCgkJCXZhbHVlX2NvbnZlcnQgPSBzaW1wbGVfc3RydG91bCh2YWx1ZSwgTlVMTCwgMCk7CgkJCWlmICgodmFsdWVfY29udmVydCA+PSBQQVJNX01JTl9UWF9SQVRFKSAmJiAodmFsdWVfY29udmVydCA8PSBQQVJNX01BWF9UWF9SQVRFKSkKCQkJCWxwLT53ZHNfcG9ydFs1XS50eFJhdGVDbnRsID0gdmFsdWVfY29udmVydDsKCQkJZWxzZQoJCQkJREJHX1dBUk5JTkcoRGJnSW5mbywgIiVzIGludmFsaWQ7IHdpbGwgYmUgaWdub3JlZFxuIiwgUEFSTV9OQU1FX1RYX1JBVEU2KTsKCQl9IGVsc2UgaWYgKHN0cmNtcChrZXksIFBBUk1fTkFNRV9XRFNfQUREUkVTUzEpID09IDApIHsKCQkJREJHX1RSQUNFKERiZ0luZm8sICIlcywgdmFsdWU6ICVzXG4iLCBQQVJNX05BTUVfV0RTX0FERFJFU1MxLCB2YWx1ZSk7CgoJCQlpZiAocGFyc2VfbWFjX2FkZHJlc3ModmFsdWUsIG1hY192YWx1ZSkgPT0gRVRIX0FMRU4pCgkJCQltZW1jcHkobHAtPndkc19wb3J0WzBdLndkc0FkZHJlc3MsIG1hY192YWx1ZSwgRVRIX0FMRU4pOwoJCQllbHNlCgkJCQlEQkdfV0FSTklORyhEYmdJbmZvLCAiJXMgaW52YWxpZDsgd2lsbCBiZSBpZ25vcmVkXG4iLCBQQVJNX05BTUVfV0RTX0FERFJFU1MxKTsKCQl9IGVsc2UgaWYgKHN0cmNtcChrZXksIFBBUk1fTkFNRV9XRFNfQUREUkVTUzIpID09IDApIHsKCQkJREJHX1RSQUNFKERiZ0luZm8sICIlcywgdmFsdWU6ICVzXG4iLCBQQVJNX05BTUVfV0RTX0FERFJFU1MyLCB2YWx1ZSk7CgoJCQlpZiAocGFyc2VfbWFjX2FkZHJlc3ModmFsdWUsIG1hY192YWx1ZSkgPT0gRVRIX0FMRU4pCgkJCQltZW1jcHkobHAtPndkc19wb3J0WzFdLndkc0FkZHJlc3MsIG1hY192YWx1ZSwgRVRIX0FMRU4pOwoJCQllbHNlCgkJCQlEQkdfV0FSTklORyhEYmdJbmZvLCAiJXMgaW52YWxpZDsgd2lsbCBiZSBpZ25vcmVkXG4iLCBQQVJNX05BTUVfV0RTX0FERFJFU1MyKTsKCQl9IGVsc2UgaWYgKHN0cmNtcChrZXksIFBBUk1fTkFNRV9XRFNfQUREUkVTUzMpID09IDApIHsKCQkJREJHX1RSQUNFKERiZ0luZm8sICIlcywgdmFsdWU6ICVzXG4iLCBQQVJNX05BTUVfV0RTX0FERFJFU1MzLCB2YWx1ZSk7CgoJCQlpZiAocGFyc2VfbWFjX2FkZHJlc3ModmFsdWUsIG1hY192YWx1ZSkgPT0gRVRIX0FMRU4pCgkJCQltZW1jcHkobHAtPndkc19wb3J0WzJdLndkc0FkZHJlc3MsIG1hY192YWx1ZSwgRVRIX0FMRU4pOwoJCQllbHNlCgkJCQlEQkdfV0FSTklORyhEYmdJbmZvLCAiJXMgaW52YWxpZDsgd2lsbCBiZSBpZ25vcmVkXG4iLCBQQVJNX05BTUVfV0RTX0FERFJFU1MzKTsKCQl9IGVsc2UgaWYgKHN0cmNtcChrZXksIFBBUk1fTkFNRV9XRFNfQUREUkVTUzQpID09IDApIHsKCQkJREJHX1RSQUNFKERiZ0luZm8sICIlcywgdmFsdWU6ICVzXG4iLCBQQVJNX05BTUVfV0RTX0FERFJFU1M0LCB2YWx1ZSk7CgoJCQlpZiAocGFyc2VfbWFjX2FkZHJlc3ModmFsdWUsIG1hY192YWx1ZSkgPT0gRVRIX0FMRU4pCgkJCQltZW1jcHkobHAtPndkc19wb3J0WzNdLndkc0FkZHJlc3MsIG1hY192YWx1ZSwgRVRIX0FMRU4pOwoJCQllbHNlCgkJCQlEQkdfV0FSTklORyhEYmdJbmZvLCAiJXMgaW52YWxpZDsgd2lsbCBiZSBpZ25vcmVkXG4iLCBQQVJNX05BTUVfV0RTX0FERFJFU1M0KTsKCQl9IGVsc2UgaWYgKHN0cmNtcChrZXksIFBBUk1fTkFNRV9XRFNfQUREUkVTUzUpID09IDApIHsKCQkJREJHX1RSQUNFKERiZ0luZm8sICIlcywgdmFsdWU6ICVzXG4iLCBQQVJNX05BTUVfV0RTX0FERFJFU1M1LCB2YWx1ZSk7CgoJCQlpZiAocGFyc2VfbWFjX2FkZHJlc3ModmFsdWUsIG1hY192YWx1ZSkgPT0gRVRIX0FMRU4pCgkJCQltZW1jcHkobHAtPndkc19wb3J0WzRdLndkc0FkZHJlc3MsIG1hY192YWx1ZSwgRVRIX0FMRU4pOwoJCQllbHNlCgkJCQlEQkdfV0FSTklORyhEYmdJbmZvLCAiJXMgaW52YWxpZDsgd2lsbCBiZSBpZ25vcmVkXG4iLCBQQVJNX05BTUVfV0RTX0FERFJFU1M1KTsKCQl9IGVsc2UgaWYgKHN0cmNtcChrZXksIFBBUk1fTkFNRV9XRFNfQUREUkVTUzYpID09IDApIHsKCQkJREJHX1RSQUNFKERiZ0luZm8sICIlcywgdmFsdWU6ICVzXG4iLCBQQVJNX05BTUVfV0RTX0FERFJFU1M2LCB2YWx1ZSk7CgoJCQlpZiAocGFyc2VfbWFjX2FkZHJlc3ModmFsdWUsIG1hY192YWx1ZSkgPT0gRVRIX0FMRU4pCgkJCQltZW1jcHkobHAtPndkc19wb3J0WzVdLndkc0FkZHJlc3MsIG1hY192YWx1ZSwgRVRIX0FMRU4pOwoJCQllbHNlCgkJCQlEQkdfV0FSTklORyhEYmdJbmZvLCAiJXMgaW52YWxpZDsgd2lsbCBiZSBpZ25vcmVkXG4iLCBQQVJNX05BTUVfV0RTX0FERFJFU1M2KTsKCQl9CiNlbmRpZiAgLyogVVNFX1dEUyAqLwoJfQojZW5kaWYgIC8qIChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9BUCAqLwoKCXJldHVybjsKfSAvKiB0cmFuc2xhdGVfb3B0aW9uICovCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKglwYXJzZV9tYWNfYWRkcmVzcygpCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqICBERVNDUklQVElPTjoKICoKICogICAgICBUaGlzIGZ1bmN0aW9uIHdpbGwgcGFyc2UgYSBtYWMgYWRkcmVzcyBzdHJpbmcgYW5kIGNvbnZlcnQgaXQgdG8gYSBieXRlCiAqICAgYXJyYXkuCiAqCiAqICBQQVJBTUVURVJTOgogKgogKiAgICAgIHZhbHVlICAgICAgIC0gdGhlIE1BQyBhZGRyZXNzLCByZXByZXNlbnRlZCBhcyBhIHN0cmluZwogKiAgICAgIGJ5dGVfYXJyYXkgIC0gdGhlIE1BQyBhZGRyZXNzLCByZXByZXNlbnRlZCBhcyBhIGJ5dGUgYXJyYXkgb2YgbGVuZ3RoCiAqICAgICAgICAgICAgICAgICAgICBFVEhfQUxFTgogKgogKiAgUkVUVVJOUzoKICoKICogICAgICBUaGUgbnVtYmVyIG9mIGJ5dGVzIGluIHRoZSBmaW5hbCBNQUMgYWRkcmVzcywgc2hvdWxkIGVxdWFsIHRvIEVUSF9BTEVOLgogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwppbnQgcGFyc2VfbWFjX2FkZHJlc3MoY2hhciAqdmFsdWUsIHVfY2hhciAqYnl0ZV9hcnJheSkKewoJaW50ICAgICB2YWx1ZV9vZmZzZXQgPSAwOwoJaW50ICAgICBhcnJheV9vZmZzZXQgPSAwOwoJaW50ICAgICBmaWVsZF9vZmZzZXQgPSAwOwoJY2hhciAgICBieXRlX2ZpZWxkWzNdOwoJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKCW1lbXNldChieXRlX2ZpZWxkLCAnXDAnLCAzKTsKCgl3aGlsZSAodmFsdWVbdmFsdWVfb2Zmc2V0XSAhPSAnXDAnKSB7CgkJLyogU2tpcCBvdmVyIHRoZSBjb2xvbiBjaGFycyBzZXBlcmF0aW5nIHRoZSBieXRlcywgaWYgdGhleSBleGlzdCAqLwoJCWlmICh2YWx1ZVt2YWx1ZV9vZmZzZXRdID09ICc6JykgewoJCQl2YWx1ZV9vZmZzZXQrKzsKCQkJY29udGludWU7CgkJfQoKCQlieXRlX2ZpZWxkW2ZpZWxkX29mZnNldF0gPSB2YWx1ZVt2YWx1ZV9vZmZzZXRdOwoJCWZpZWxkX29mZnNldCsrOwoJCXZhbHVlX29mZnNldCsrOwoKCQkvKiBPbmNlIHRoZSBieXRlX2ZpZWxkIGlzIGZpbGxlZCwgY29udmVydCBpdCBhbmQgc3RvcmUgaXQgKi8KCQlpZiAoZmllbGRfb2Zmc2V0ID09IDIpIHsKCQkJYnl0ZV9maWVsZFtmaWVsZF9vZmZzZXRdID0gJ1wwJzsKCQkJYnl0ZV9hcnJheVthcnJheV9vZmZzZXRdID0gc2ltcGxlX3N0cnRvdWwoYnl0ZV9maWVsZCwgTlVMTCwgMTYpOwoJCQlmaWVsZF9vZmZzZXQgPSAwOwoJCQlhcnJheV9vZmZzZXQrKzsKCQl9Cgl9CgoJLyogVXNlIHRoZSBhcnJheV9vZmZzZXQgYXMgYSBjaGVjazsgNiBieXRlcyBzaG91bGQgYmUgd3JpdHRlbiB0byB0aGUKCSAgIGJ5dGVfYXJyYXkgKi8KCXJldHVybiBhcnJheV9vZmZzZXQ7Cn0gLyogcGFyc2VfbWFjX2FkZHJlc3MgKi8KLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCVBhcnNlQ29uZmlnTGluZSgpCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqICBERVNDUklQVElPTjoKICoKICogICAgICBQYXJzZXMgYSBsaW5lIGZyb20gdGhlIGNvbmZpZ3VyYXRpb24gZmlsZSBpbnRvIGFuIEwtdmFsIGFuZCBhbiBSLXZhbCwKICogIHJlcHJlc2VudGluZyBhIGtleS92YWx1ZSBwYWlyLgogKgogKiAgUEFSQU1FVEVSUzoKICoKICogICAgICBwc3pMaW5lICAgICAtIHRoZSBsaW5lIGZyb20gdGhlIGNvbmZpZyBmaWxlIHRvIHBhcnNlCiAqICAgICAgcHBzekxWYWwgICAgLSB0aGUgcmVzdWx0aW5nIEwtdmFsIChLZXkpCiAqICAgICAgcHBzelJWYWwgICAgLSB0aGUgcmVzdWx0aW5nIFItdmFsIChWYWx1ZSkKICoKICogIFJFVFVSTlM6CiAqCiAqICAgICAgTi9BCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnZvaWQgUGFyc2VDb25maWdMaW5lKGNoYXIgKnBzekxpbmUsIGNoYXIgKipwcHN6TFZhbCwgY2hhciAqKnBwc3pSVmFsKQp7CglpbnQgaTsKCWludCBzaXplOwoJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKCURCR19GVU5DKCJQYXJzZUNvbmZpZ0xpbmUiKTsKCURCR19FTlRFUihEYmdJbmZvKTsKCgkvKiBnZXQgYSBzbmFwc2hvdCBvZiBvdXIgc3RyaW5nIHNpemUgKi8KCXNpemUgICAgICA9IHN0cmxlbihwc3pMaW5lKTsKCSpwcHN6TFZhbCA9IE5VTEw7CgkqcHBzelJWYWwgPSBOVUxMOwoKCWlmIChwc3pMaW5lWzBdICE9ICcjJyAmJgkJCQkJCQkvKiBza2lwIHRoZSBsaW5lIGlmIGl0IGlzIGEgY29tbWVudCAqLwoJCSBwc3pMaW5lWzBdICE9ICdcbicgJiYJCQkJCQkJLyogaWYgaXQncyBhbiBlbXB0eSBVTklYIGxpbmUsIGRvIG5vdGhpbmcgKi8KCQkgIShwc3pMaW5lWzBdID09ICdccicgJiYgcHN6TGluZVsxXSA9PSAnXG4nKQkvKiBpZiBpdCdzIGFuIGVtcHR5IE1TLURPUyBsaW5lLCBkbyBub3RoaW5nICovCgkgICApIHsKCQkvKiBhZHZhbmNlIHBhc3QgYW55IHdoaXRlc3BhY2UsIGFuZCBhc3NpZ24gdGhlIEwtdmFsdWUgKi8KCQlmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CgkJCWlmIChwc3pMaW5lW2ldICE9ICcgJykgewoJCQkJKnBwc3pMVmFsID0gJnBzekxpbmVbaV07CgkJCQlicmVhazsKCQkJfQoJCX0KCQkvKiBhZHZhbmNlIHRvIHRoZSBlbmQgb2YgdGhlIGwtdmFsdWUqLwoJCWZvciAoaSsrOyBpIDwgc2l6ZTsgaSsrKSB7CgkJCWlmIChwc3pMaW5lW2ldID09ICcgJyB8fCBwc3pMaW5lW2ldID09ICc9JykgewoJCQkJcHN6TGluZVtpXSA9ICdcMCc7CgkJCQlicmVhazsKCQkJfQoJCX0KCQkvKiBtYWtlIGFueSB3aGl0ZXNwYWNlIGFuZCB0aGUgZXF1YWwgc2lnbiBhIE5VTEwgY2hhcmFjdGVyLCBhbmQKCQkgICBhZHZhbmNlIHRvIHRoZSBSLVZhbHVlICovCgkJZm9yIChpKys7IGkgPCBzaXplOyBpKyspIHsKCQkJaWYgKHBzekxpbmVbaV0gPT0gJyAnIHx8IHBzekxpbmVbaV0gPT0gJz0nKSB7CgkJCQlwc3pMaW5lW2ldID0gJ1wwJzsKCQkJCWNvbnRpbnVlOwoJCQl9CgkJCSpwcHN6UlZhbCA9ICZwc3pMaW5lW2ldOwoJCQlicmVhazsKCQl9CgkJLyogbWFrZSB0aGUgbGluZSBlbmRpbmcgY2hhcmFjdGVyKHMpIGEgTlVMTCAqLwoJCWZvciAoaSsrOyBpIDwgc2l6ZTsgaSsrKSB7CgkJCWlmIChwc3pMaW5lW2ldID09ICdcbicpCgkJCQlwc3pMaW5lW2ldID0gJ1wwJzsKCQkJaWYgKChwc3pMaW5lW2ldID09ICdccicpICYmIChwc3pMaW5lW2krMV0gPT0gJ1xuJykpCgkJCQlwc3pMaW5lW2ldID0gJ1wwJzsKCQl9Cgl9CglEQkdfTEVBVkUoRGJnSW5mbyk7Cn0gLyogUGFyc2VDb25maWdMaW5lICovCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgojZW5kaWYgIC8qIFVTRV9QUk9GSUxFICovCg==