Lyogdmk6c2V0IHRzPTggc3RzPTQgc3c9NDoKICoKICogVklNIC0gVmkgSU1wcm92ZWQJYnkgQnJhbSBNb29sZW5hYXIKICoKICogRG8gIjpoZWxwIHVnYW5kYSIgIGluIFZpbSB0byByZWFkIGNvcHlpbmcgYW5kIHVzYWdlIGNvbmRpdGlvbnMuCiAqIERvICI6aGVscCBjcmVkaXRzIiBpbiBWaW0gdG8gc2VlIGEgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkLgogKiBTZWUgUkVBRE1FLnR4dCBmb3IgYW4gb3ZlcnZpZXcgb2YgdGhlIFZpbSBzb3VyY2UgY29kZS4KICovCi8qCiAqCiAqIHRlcm0uYzogZnVuY3Rpb25zIGZvciBjb250cm9sbGluZyB0aGUgdGVybWluYWwKICoKICogcHJpbWl0aXZlIHRlcm1jYXAgc3VwcG9ydCBmb3IgQW1pZ2EsIE1TRE9TLCBhbmQgV2luMzIgaW5jbHVkZWQKICoKICogTk9URTogcGFkZGluZyBhbmQgdmFyaWFibGUgc3Vic3RpdHV0aW9uIGlzIG5vdCBwZXJmb3JtZWQsCiAqIHdoZW4gY29tcGlsaW5nIHdpdGhvdXQgSEFWRV9UR0VURU5ULCB3ZSB1c2UgdHB1dHMoKSBhbmQgdGdvdG8oKSBkdW1taWVzLgogKi8KCi8qCiAqIFNvbWUgc3lzdGVtcyBoYXZlIGEgcHJvdG90eXBlIGZvciB0Z2V0c3RyKCkgd2l0aCAoY2hhciAqKSBpbnN0ZWFkIG9mCiAqIChjaGFyICoqKS4gVGhpcyBkZWZpbmUgcmVtb3ZlcyB0aGF0IHByb3RvdHlwZS4gV2UgaW5jbHVkZSBvdXIgb3duIHByb3RvdHlwZQogKiBiZWxvdy4KICovCgojZGVmaW5lIHRnZXRzdHIgdGdldHN0cl9kZWZpbmVkX3dyb25nCiNpbmNsdWRlICJ2aW0uaCIKCiNpZmRlZiBIQVZFX1RHRVRFTlQKIyBpZmRlZiBIQVZFX1RFUk1JT1NfSAojICBpbmNsdWRlIDx0ZXJtaW9zLmg+CSAgICAvKiBzZWVtcyB0byBiZSByZXF1aXJlZCBmb3Igc29tZSBMaW51eCAqLwojIGVuZGlmCiMgaWZkZWYgSEFWRV9URVJNQ0FQX0gKIyAgaW5jbHVkZSA8dGVybWNhcC5oPgojIGVuZGlmCgovKgogKiBBIGZldyBsaW51eCBzeXN0ZW1zIGRlZmluZSBvdXRmdW50eXBlIGluIHRlcm1jYXAuaCB0byBiZSB1c2VkIGFzIHRoZSB0aGlyZAogKiBhcmd1bWVudCBmb3IgdHB1dHMoKS4KICovCiMgaWZkZWYgVk1TCiMgIGRlZmluZSBUUFVUU0ZVTkNBU1QKIyBlbHNlCiMgIGlmZGVmIEhBVkVfT1VURlVOVFlQRQojICAgZGVmaW5lIFRQVVRTRlVOQ0FTVCAob3V0ZnVudHlwZSkKIyAgZWxzZQojICAgZGVmaW5lIFRQVVRTRlVOQ0FTVCAoaW50ICgqKSgpKQojICBlbmRpZgojIGVuZGlmCiNlbmRpZgoKI3VuZGVmIHRnZXRzdHIKCi8qCiAqIEhlcmUgYXJlIHRoZSBidWlsdGluIHRlcm1jYXAgZW50cmllcy4gIFRoZXkgYXJlIG5vdCBzdG9yZWQgYXMgY29tcGxldGUKICogVGNhcnIgc3RydWN0dXJlcywgYXMgc3VjaCBhIHN0cnVjdHVyZSBpcyB0b28gYmlnLgogKgogKiBUaGUgZW50cmllcyBhcmUgY29tcGFjdCwgdGhlcmVmb3JlIHRoZXkgbm9ybWFsbHkgYXJlIGluY2x1ZGVkIGV2ZW4gd2hlbgogKiBIQVZFX1RHRVRFTlQgaXMgZGVmaW5lZC4gV2hlbiBIQVZFX1RHRVRFTlQgaXMgZGVmaW5lZCwgdGhlIGJ1aWx0aW4gZW50cmllcwogKiBjYW4gYmUgYWNjZXNzZWQgd2l0aCAiYnVpbHRpbl9hbWlnYSIsICJidWlsdGluX2Fuc2kiLCAiYnVpbHRpbl9kZWJ1ZyIsIGV0Yy4KICoKICogRWFjaCB0ZXJtY2FwIGlzIGEgbGlzdCBvZiBidWlsdGluX3Rlcm0gc3RydWN0dXJlcy4gSXQgYWx3YXlzIHN0YXJ0cyB3aXRoCiAqIEtTX05BTUUsIHdoaWNoIHNlcGFyYXRlcyB0aGUgZW50cmllcy4gIFNlZSBwYXJzZV9idWlsdGluX3RjYXAoKSBmb3IgYWxsCiAqIGRldGFpbHMuCiAqIGJ0X2VudHJ5IGlzIGVpdGhlciBhIEtTX3h4eCBjb2RlICg+PSAwKSwgb3IgYSBLX3h4eCBjb2RlLgogKgogKiBFbnRyaWVzIG1hcmtlZCB3aXRoICJndWVzc2VkIiBtYXkgYmUgd3JvbmcuCiAqLwpzdHJ1Y3QgYnVpbHRpbl90ZXJtCnsKICAgIGludAkJYnRfZW50cnk7CiAgICBjaGFyCSpidF9zdHJpbmc7Cn07CgovKiBzdGFydCBvZiBrZXlzIHRoYXQgYXJlIG5vdCBkaXJlY3RseSB1c2VkIGJ5IFZpbSBidXQgY2FuIGJlIG1hcHBlZCAqLwojZGVmaW5lIEJUX0VYVFJBX0tFWVMJMHgxMDEKCnN0YXRpYyBzdHJ1Y3QgYnVpbHRpbl90ZXJtICpmaW5kX2J1aWx0aW5fdGVybSBfX0FSR1MoKGNoYXJfdSAqbmFtZSkpOwpzdGF0aWMgdm9pZCBwYXJzZV9idWlsdGluX3RjYXAgX19BUkdTKChjaGFyX3UgKnMpKTsKc3RhdGljIHZvaWQgdGVybV9jb2xvciBfX0FSR1MoKGNoYXJfdSAqcywgaW50IG4pKTsKc3RhdGljIHZvaWQgZ2F0aGVyX3Rlcm1sZWFkZXIgX19BUkdTKCh2b2lkKSk7CiNpZmRlZiBGRUFUX1RFUk1SRVNQT05TRQpzdGF0aWMgdm9pZCByZXFfY29kZXNfZnJvbV90ZXJtIF9fQVJHUygodm9pZCkpOwpzdGF0aWMgdm9pZCByZXFfbW9yZV9jb2Rlc19mcm9tX3Rlcm0gX19BUkdTKCh2b2lkKSk7CnN0YXRpYyB2b2lkIGdvdF9jb2RlX2Zyb21fdGVybSBfX0FSR1MoKGNoYXJfdSAqY29kZSwgaW50IGxlbikpOwpzdGF0aWMgdm9pZCBjaGVja19mb3JfY29kZXNfZnJvbV90ZXJtIF9fQVJHUygodm9pZCkpOwojZW5kaWYKI2lmIGRlZmluZWQoRkVBVF9HVUkpIFwKICAgIHx8IChkZWZpbmVkKEZFQVRfTU9VU0UpICYmICghZGVmaW5lZChVTklYKSB8fCBkZWZpbmVkKEZFQVRfTU9VU0VfWFRFUk0pKSkKc3RhdGljIGludCBnZXRfYnl0ZXNfZnJvbV9idWYgX19BUkdTKChjaGFyX3UgKiwgY2hhcl91ICosIGludCkpOwojZW5kaWYKI2lmZGVmIEZFQVRfVEVSTVJFU1BPTlNFCnN0YXRpYyB2b2lkIG1heV9yZXFfdGVybXJlc3BvbnNlIF9fQVJHUygodm9pZCkpOwojZW5kaWYKc3RhdGljIHZvaWQgZGVsX3Rlcm1jb2RlX2lkeCBfX0FSR1MoKGludCBpZHgpKTsKc3RhdGljIGludCB0ZXJtX2lzX2J1aWx0aW4gX19BUkdTKChjaGFyX3UgKm5hbWUpKTsKc3RhdGljIGludCB0ZXJtXzd0bzhiaXQgX19BUkdTKChjaGFyX3UgKnApKTsKI2lmZGVmIEZFQVRfVEVSTVJFU1BPTlNFCnN0YXRpYyB2b2lkIHN3aXRjaF90b184Yml0IF9fQVJHUygodm9pZCkpOwojZW5kaWYKCiNpZmRlZiBIQVZFX1RHRVRFTlQKc3RhdGljIGNoYXJfdSAqdGdldGVudF9lcnJvciBfX0FSR1MoKGNoYXJfdSAqLCBjaGFyX3UgKikpOwoKLyoKICogSGVyZSBpcyBvdXIgb3duIHByb3RvdHlwZSBmb3IgdGdldHN0cigpLCBhbnkgcHJvdG90eXBlcyBmcm9tIHRoZSBpbmNsdWRlCiAqIGZpbGVzIGhhdmUgYmVlbiBkaXNhYmxlZCBieSB0aGUgZGVmaW5lIGF0IHRoZSBzdGFydCBvZiB0aGlzIGZpbGUuCiAqLwpjaGFyCQkqdGdldHN0ciBfX0FSR1MoKGNoYXIgKiwgY2hhciAqKikpOwoKIyBpZmRlZiBGRUFUX1RFUk1SRVNQT05TRQovKiBSZXF1ZXN0IFRlcm1pbmFsIFZlcnNpb24gc3RhdHVzOiAqLwojICBkZWZpbmUgQ1JWX0dFVAkxCS8qIHNlbmQgVF9DUlYgd2hlbiBzd2l0Y2hlZCB0byBSQVcgbW9kZSAqLwojICBkZWZpbmUgQ1JWX1NFTlQJMgkvKiBkaWQgc2VuZCBUX0NSViwgd2FpdGluZyBmb3IgYW5zd2VyICovCiMgIGRlZmluZSBDUlZfR09UCTMJLyogcmVjZWl2ZWQgVF9DUlYgcmVzcG9uc2UgKi8Kc3RhdGljIGludCBjcnZfc3RhdHVzID0gQ1JWX0dFVDsKIyBlbmRpZgoKLyoKICogRG9uJ3QgZGVjbGFyZSB0aGVzZSB2YXJpYWJsZXMgaWYgdGVybWNhcC5oIGNvbnRhaW5zIHRoZW0uCiAqIEF1dG9jb25mIGNoZWNrcyBpZiB0aGVzZSB2YXJpYWJsZXMgc2hvdWxkIGJlIGRlY2xhcmVkIGV4dGVybiAobm90IGFsbAogKiBzeXN0ZW1zIGhhdmUgdGhlbSkuCiAqIFNvbWUgdmVyc2lvbnMgZGVmaW5lIG9zcGVlZCB0byBiZSBzcGVlZF90LCBidXQgdGhhdCBpcyBpbmNvbXBhdGlibGUgd2l0aAogKiBCU0QsIHdoZXJlIG9zcGVlZCBpcyBzaG9ydCBhbmQgc3BlZWRfdCBpcyBsb25nLgogKi8KIyBpZm5kZWYgSEFWRV9PU1BFRUQKIyAgaWZkZWYgT1NQRUVEX0VYVEVSTgpleHRlcm4gc2hvcnQgb3NwZWVkOwojICAgZWxzZQpzaG9ydCBvc3BlZWQ7CiMgICBlbmRpZgojIGVuZGlmCiMgaWZuZGVmIEhBVkVfVVBfQkNfUEMKIyAgaWZkZWYgVVBfQkNfUENfRVhURVJOCmV4dGVybiBjaGFyICpVUCwgKkJDLCBQQzsKIyAgZWxzZQpjaGFyICpVUCwgKkJDLCBQQzsKIyAgZW5kaWYKIyBlbmRpZgoKIyBkZWZpbmUgVEdFVFNUUihzLCBwKQl2aW1fdGdldHN0cigocyksIChwKSkKIyBkZWZpbmUgVEdFVEVOVChiLCB0KQl0Z2V0ZW50KChjaGFyICopKGIpLCAoY2hhciAqKSh0KSkKc3RhdGljIGNoYXJfdSAqdmltX3RnZXRzdHIgX19BUkdTKChjaGFyICpzLCBjaGFyX3UgKipwcCkpOwojZW5kaWYgLyogSEFWRV9UR0VURU5UICovCgpzdGF0aWMgaW50ICBkZXRlY3RlZF84Yml0ID0gRkFMU0U7CS8qIGRldGVjdGVkIDgtYml0IHRlcm1pbmFsICovCgpzdHJ1Y3QgYnVpbHRpbl90ZXJtIGJ1aWx0aW5fdGVybWNhcHNbXSA9CnsKCiNpZiBkZWZpbmVkKEZFQVRfR1VJKQovKgogKiBHVUkgcHNldWRvIHRlcm0tY2FwLgogKi8KICAgIHsoaW50KUtTX05BTUUsCSJndWkifSwKICAgIHsoaW50KUtTX0NFLAlJRl9FQigiXDAzM3wkIiwgRVNDX1NUUiAifCQiKX0sCiAgICB7KGludClLU19BTCwJSUZfRUIoIlwwMzN8aSIsIEVTQ19TVFIgInxpIil9LAojIGlmZGVmIFRFUk1JTkZPCiAgICB7KGludClLU19DQUwsCUlGX0VCKCJcMDMzfCVwMSVkSSIsIEVTQ19TVFIgInwlcDElZEkiKX0sCiMgZWxzZQogICAgeyhpbnQpS1NfQ0FMLAlJRl9FQigiXDAzM3wlZEkiLCBFU0NfU1RSICJ8JWRJIil9LAojIGVuZGlmCiAgICB7KGludClLU19ETCwJSUZfRUIoIlwwMzN8ZCIsIEVTQ19TVFIgInxkIil9LAojIGlmZGVmIFRFUk1JTkZPCiAgICB7KGludClLU19DREwsCUlGX0VCKCJcMDMzfCVwMSVkRCIsIEVTQ19TVFIgInwlcDElZEQiKX0sCiAgICB7KGludClLU19DUywJSUZfRUIoIlwwMzN8JXAxJWQ7JXAyJWRSIiwgRVNDX1NUUiAifCVwMSVkOyVwMiVkUiIpfSwKIyAgaWZkZWYgRkVBVF9WRVJUU1BMSVQKICAgIHsoaW50KUtTX0NTViwJSUZfRUIoIlwwMzN8JXAxJWQ7JXAyJWRWIiwgRVNDX1NUUiAifCVwMSVkOyVwMiVkViIpfSwKIyAgZW5kaWYKIyBlbHNlCiAgICB7KGludClLU19DREwsCUlGX0VCKCJcMDMzfCVkRCIsIEVTQ19TVFIgInwlZEQiKX0sCiAgICB7KGludClLU19DUywJSUZfRUIoIlwwMzN8JWQ7JWRSIiwgRVNDX1NUUiAifCVkOyVkUiIpfSwKIyAgaWZkZWYgRkVBVF9WRVJUU1BMSVQKICAgIHsoaW50KUtTX0NTViwJSUZfRUIoIlwwMzN8JWQ7JWRWIiwgRVNDX1NUUiAifCVkOyVkViIpfSwKIyAgZW5kaWYKIyBlbmRpZgogICAgeyhpbnQpS1NfQ0wsCUlGX0VCKCJcMDMzfEMiLCBFU0NfU1RSICJ8QyIpfSwKCQkJLyogYXR0cmlidXRlcyBzd2l0Y2hlZCBvbiB3aXRoICdoJywgb2ZmIHdpdGggKiAnSCcgKi8KICAgIHsoaW50KUtTX01FLAlJRl9FQigiXDAzM3wzMUgiLCBFU0NfU1RSICJ8MzFIIil9LCAvKiBITF9BTEwgKi8KICAgIHsoaW50KUtTX01SLAlJRl9FQigiXDAzM3wxaCIsIEVTQ19TVFIgInwxaCIpfSwgICAvKiBITF9JTlZFUlNFICovCiAgICB7KGludClLU19NRCwJSUZfRUIoIlwwMzN8MmgiLCBFU0NfU1RSICJ8MmgiKX0sICAgLyogSExfQk9MRCAqLwogICAgeyhpbnQpS1NfU0UsCUlGX0VCKCJcMDMzfDE2SCIsIEVTQ19TVFIgInwxNkgiKX0sIC8qIEhMX1NUQU5ET1VUICovCiAgICB7KGludClLU19TTywJSUZfRUIoIlwwMzN8MTZoIiwgRVNDX1NUUiAifDE2aCIpfSwgLyogSExfU1RBTkRPVVQgKi8KICAgIHsoaW50KUtTX1VFLAlJRl9FQigiXDAzM3w4SCIsIEVTQ19TVFIgInw4SCIpfSwgICAvKiBITF9VTkRFUkxJTkUgKi8KICAgIHsoaW50KUtTX1VTLAlJRl9FQigiXDAzM3w4aCIsIEVTQ19TVFIgInw4aCIpfSwgICAvKiBITF9VTkRFUkxJTkUgKi8KICAgIHsoaW50KUtTX0NaUiwJSUZfRUIoIlwwMzN8NEgiLCBFU0NfU1RSICJ8NEgiKX0sICAgLyogSExfSVRBTElDICovCiAgICB7KGludClLU19DWkgsCUlGX0VCKCJcMDMzfDRoIiwgRVNDX1NUUiAifDRoIil9LCAgIC8qIEhMX0lUQUxJQyAqLwogICAgeyhpbnQpS1NfVkIsCUlGX0VCKCJcMDMzfGYiLCBFU0NfU1RSICJ8ZiIpfSwKICAgIHsoaW50KUtTX01TLAkieSJ9LAogICAgeyhpbnQpS1NfVVQsCSJ5In0sCiAgICB7KGludClLU19MRSwJIlxiIn0sCQkvKiBjdXJzb3ItbGVmdCA9IEJTICovCiAgICB7KGludClLU19ORCwJIlwwMTQifSwJLyogY3Vyc29yLXJpZ2h0ID0gQ1RSTC1MICovCiMgaWZkZWYgVEVSTUlORk8KICAgIHsoaW50KUtTX0NNLAlJRl9FQigiXDAzM3wlcDElZDslcDIlZE0iLCBFU0NfU1RSICJ8JXAxJWQ7JXAyJWRNIil9LAojIGVsc2UKICAgIHsoaW50KUtTX0NNLAlJRl9FQigiXDAzM3wlZDslZE0iLCBFU0NfU1RSICJ8JWQ7JWRNIil9LAojIGVuZGlmCgkvKiB0aGVyZSBhcmUgbm8ga2V5IHNlcXVlbmNlcyBoZXJlLCB0aGUgR1VJIHNlcXVlbmNlcyBhcmUgcmVjb2duaXplZAoJICogaW4gY2hlY2tfdGVybWNvZGVzKCkgKi8KI2VuZGlmCgojaWZuZGVmIE5PX0JVSUxUSU5fVENBUFMKIyBpZiBkZWZpbmVkKFJJU0NPUykgfHwgZGVmaW5lZChBTExfQlVJTFRJTl9UQ0FQUykKLyoKICogRGVmYXVsdCBmb3IgdGhlIEFjb3JuLgogKi8KICAgIHsoaW50KUtTX05BTUUsCSJyaXNjb3MifSwKICAgIHsoaW50KUtTX0NMLAkiXDAxNCJ9LAkJLyogQ2xzIGFuZCBIb21lIEN1cnNvciAqLwogICAgeyhpbnQpS1NfQ00sCSJcMDAxJWRcMDAxJWRcMDAyIn0sCS8qIFBvc2l0aW9uIGN1cnNvciAqLwoKICAgIHsoaW50KUtTX0NDTywJIjE2In0sCQkJLyogQWxsb3cgMTYgY29sb3JzICovCgogICAgeyhpbnQpS1NfQ0FGLAkiXDAwMSVkXDAyMSJ9LAkJLyogU2V0IGZvcmVncm91bmQgY29sb3VyICovCiAgICB7KGludClLU19DQUIsCSJcMDAxJWRcMDIyIn0sCQkvKiBTZXQgYmFja2dyb3VuZCBjb2xvdXIgKi8KCgogICAgeyhpbnQpS1NfTUUsCSJcMDA0In0sCQkvKiBOb3JtYWwgbW9kZSAqLwogICAgeyhpbnQpS1NfTVIsCSJcMDA1In0sCQkvKiBSZXZlcnNlICovCgogICAgeyhpbnQpS1NfVkksCSJcMDE2In0sCQkvKiBDdXJzb3IgaW52aXNpYmxlICovCiAgICB7KGludClLU19WRSwJIlwwMTcifSwJCS8qIEN1cnNvciB2aXNpYmxlICovCiAgICB7KGludClLU19WUywJIlwwMjAifSwJCS8qIEN1cnNvciB2ZXJ5IHZpc2libGUgKi8KCiAgICB7KGludClLU19DUywJIlwwMDElZFwwMDElZFwwMDMifSwJLyogU2V0IHNjcm9sbCByZWdpb24gKi8KICAgIHsoaW50KUtTX1NSLAkiXDAyMyJ9LAkJLyogU2Nyb2xsIHRleHQgZG93biAqLwogICAge0tfVVAsCQkiXDIxNyJ9LAogICAge0tfRE9XTiwJCSJcMjE2In0sCiAgICB7S19MRUZULAkJIlwyMTQifSwKICAgIHtLX1JJR0hULAkJIlwyMTUifSwKICAgIHtLX1NfVVAsCQkiXDIzNyJ9LAogICAge0tfU19ET1dOLAkJIlwyMzYifSwKICAgIHtLX1NfTEVGVCwJCSJcMjM0In0sCiAgICB7S19TX1JJR0hULAkJIlwyMzUifSwKCiAgICB7S19GMSwJCSJcMjAxIn0sCiAgICB7S19GMiwJCSJcMjAyIn0sCiAgICB7S19GMywJCSJcMjAzIn0sCiAgICB7S19GNCwJCSJcMjA0In0sCiAgICB7S19GNSwJCSJcMjA1In0sCiAgICB7S19GNiwJCSJcMjA2In0sCiAgICB7S19GNywJCSJcMjA3In0sCiAgICB7S19GOCwJCSJcMjEwIn0sCiAgICB7S19GOSwJCSJcMjExIn0sCiAgICB7S19GMTAsCQkiXDMxMiJ9LAogICAge0tfRjExLAkJIlwzMTMifSwKICAgIHtLX0YxMiwJCSJcMzE0In0sCiAgICB7S19TX0YxLAkJIlwyMjEifSwKICAgIHtLX1NfRjIsCQkiXDIyMiJ9LAogICAge0tfU19GMywJCSJcMjIzIn0sCiAgICB7S19TX0Y0LAkJIlwyMjQifSwKICAgIHtLX1NfRjUsCQkiXDIyNSJ9LAogICAge0tfU19GNiwJCSJcMjI2In0sCiAgICB7S19TX0Y3LAkJIlwyMjcifSwKICAgIHtLX1NfRjgsCQkiXDIzMCJ9LAogICAge0tfU19GOSwJCSJcMjMxIn0sCiAgICB7S19TX0YxMCwJCSJcMzMyIn0sCiAgICB7S19TX0YxMSwJCSJcMzMzIn0sCiAgICB7S19TX0YxMiwJCSJcMzM0In0sCiAgICB7S19CUywJCSJcMDEwIn0sCiAgICB7S19JTlMsCQkiXDMxNSJ9LAogICAge0tfREVMLAkJIlwxNzcifSwKICAgIHtLX0hPTUUsCQkiXDAzNiJ9LAogICAge0tfRU5ELAkJIlwyMTMifSwKICAgIHtLX1BBR0VVUCwJCSJcMjM3In0sCiAgICB7S19QQUdFRE9XTiwJIlwyMzYifSwKIyBlbmRpZgkvKiBBY29ybiB0ZXJtaW5hbCAqLwoKCiMgaWYgZGVmaW5lZChBTUlHQSkgfHwgZGVmaW5lZChBTExfQlVJTFRJTl9UQ0FQUykKLyoKICogQW1pZ2EgY29uc29sZSB3aW5kb3csIGRlZmF1bHQgZm9yIEFtaWdhCiAqLwogICAgeyhpbnQpS1NfTkFNRSwJImFtaWdhIn0sCiAgICB7KGludClLU19DRSwJIlwwMzNbSyJ9LAogICAgeyhpbnQpS1NfQ0QsCSJcMDMzW0oifSwKICAgIHsoaW50KUtTX0FMLAkiXDAzM1tMIn0sCiMgIGlmZGVmIFRFUk1JTkZPCiAgICB7KGludClLU19DQUwsCSJcMDMzWyVwMSVkTCJ9LAojICBlbHNlCiAgICB7KGludClLU19DQUwsCSJcMDMzWyVkTCJ9LAojICBlbmRpZgogICAgeyhpbnQpS1NfREwsCSJcMDMzW00ifSwKIyAgaWZkZWYgVEVSTUlORk8KICAgIHsoaW50KUtTX0NETCwJIlwwMzNbJXAxJWRNIn0sCiMgIGVsc2UKICAgIHsoaW50KUtTX0NETCwJIlwwMzNbJWRNIn0sCiMgIGVuZGlmCiAgICB7KGludClLU19DTCwJIlwwMTQifSwKICAgIHsoaW50KUtTX1ZJLAkiXDAzM1swIHAifSwKICAgIHsoaW50KUtTX1ZFLAkiXDAzM1sxIHAifSwKICAgIHsoaW50KUtTX01FLAkiXDAzM1swbSJ9LAogICAgeyhpbnQpS1NfTVIsCSJcMDMzWzdtIn0sCiAgICB7KGludClLU19NRCwJIlwwMzNbMW0ifSwKICAgIHsoaW50KUtTX1NFLAkiXDAzM1swbSJ9LAogICAgeyhpbnQpS1NfU08sCSJcMDMzWzMzbSJ9LAogICAgeyhpbnQpS1NfVVMsCSJcMDMzWzRtIn0sCiAgICB7KGludClLU19VRSwJIlwwMzNbMG0ifSwKICAgIHsoaW50KUtTX0NaSCwJIlwwMzNbM20ifSwKICAgIHsoaW50KUtTX0NaUiwJIlwwMzNbMG0ifSwKI2lmIGRlZmluZWQoX19NT1JQSE9TX18pIHx8IGRlZmluZWQoX19BUk9TX18pCiAgICB7KGludClLU19DQ08sCSI4In0sCQkvKiBhbGxvdyA4IGNvbG9ycyAqLwojICBpZmRlZiBURVJNSU5GTwogICAgeyhpbnQpS1NfQ0FCLAkiXDAzM1s0JXAxJWRtIn0sLyogc2V0IGJhY2tncm91bmQgY29sb3IgKi8KICAgIHsoaW50KUtTX0NBRiwJIlwwMzNbMyVwMSVkbSJ9LC8qIHNldCBmb3JlZ3JvdW5kIGNvbG9yICovCiMgIGVsc2UKICAgIHsoaW50KUtTX0NBQiwJIlwwMzNbNCVkbSJ9LAkvKiBzZXQgYmFja2dyb3VuZCBjb2xvciAqLwogICAgeyhpbnQpS1NfQ0FGLAkiXDAzM1szJWRtIn0sCS8qIHNldCBmb3JlZ3JvdW5kIGNvbG9yICovCiMgIGVuZGlmCiAgICB7KGludClLU19PUCwJIlwwMzNbbSJ9LAkvKiByZXNldCBjb2xvcnMgKi8KI2VuZGlmCiAgICB7KGludClLU19NUywJInkifSwKICAgIHsoaW50KUtTX1VULAkieSJ9LAkJLyogZ3Vlc3NlZCAqLwogICAgeyhpbnQpS1NfTEUsCSJcYiJ9LAojICBpZmRlZiBURVJNSU5GTwogICAgeyhpbnQpS1NfQ00sCSJcMDMzWyVpJXAxJWQ7JXAyJWRIIn0sCiMgIGVsc2UKICAgIHsoaW50KUtTX0NNLAkiXDAzM1slaSVkOyVkSCJ9LAojICBlbmRpZgojaWYgZGVmaW5lZChfX01PUlBIT1NfXykKICAgIHsoaW50KUtTX1NSLAkiXDAzM00ifSwKI2VuZGlmCiMgIGlmZGVmIFRFUk1JTkZPCiAgICB7KGludClLU19DUkksCSJcMDMzWyVwMSVkQyJ9LAojICBlbHNlCiAgICB7KGludClLU19DUkksCSJcMDMzWyVkQyJ9LAojICBlbmRpZgogICAge0tfVVAsCQkiXDIzM0EifSwKICAgIHtLX0RPV04sCQkiXDIzM0IifSwKICAgIHtLX0xFRlQsCQkiXDIzM0QifSwKICAgIHtLX1JJR0hULAkJIlwyMzNDIn0sCiAgICB7S19TX1VQLAkJIlwyMzNUIn0sCiAgICB7S19TX0RPV04sCQkiXDIzM1MifSwKICAgIHtLX1NfTEVGVCwJCSJcMjMzIEEifSwKICAgIHtLX1NfUklHSFQsCQkiXDIzMyBAIn0sCiAgICB7S19TX1RBQiwJCSJcMjMzWiJ9LAogICAge0tfRjEsCQkiXDIzM1wwNjB+In0sLyogc29tZSBjb21waWxlcnMgZG9uJ3QgZGlnICJcMjMzMCIgKi8KICAgIHtLX0YyLAkJIlwyMzNcMDYxfiJ9LAogICAge0tfRjMsCQkiXDIzM1wwNjJ+In0sCiAgICB7S19GNCwJCSJcMjMzXDA2M34ifSwKICAgIHtLX0Y1LAkJIlwyMzNcMDY0fiJ9LAogICAge0tfRjYsCQkiXDIzM1wwNjV+In0sCiAgICB7S19GNywJCSJcMjMzXDA2Nn4ifSwKICAgIHtLX0Y4LAkJIlwyMzNcMDY3fiJ9LAogICAge0tfRjksCQkiXDIzM1wwNzB+In0sCiAgICB7S19GMTAsCQkiXDIzM1wwNzF+In0sCiAgICB7S19TX0YxLAkJIlwyMzNcMDYxXDA2MH4ifSwKICAgIHtLX1NfRjIsCQkiXDIzM1wwNjFcMDYxfiJ9LAogICAge0tfU19GMywJCSJcMjMzXDA2MVwwNjJ+In0sCiAgICB7S19TX0Y0LAkJIlwyMzNcMDYxXDA2M34ifSwKICAgIHtLX1NfRjUsCQkiXDIzM1wwNjFcMDY0fiJ9LAogICAge0tfU19GNiwJCSJcMjMzXDA2MVwwNjV+In0sCiAgICB7S19TX0Y3LAkJIlwyMzNcMDYxXDA2Nn4ifSwKICAgIHtLX1NfRjgsCQkiXDIzM1wwNjFcMDY3fiJ9LAogICAge0tfU19GOSwJCSJcMjMzXDA2MVwwNzB+In0sCiAgICB7S19TX0YxMCwJCSJcMjMzXDA2MVwwNzF+In0sCiAgICB7S19IRUxQLAkJIlwyMzM/fiJ9LAogICAge0tfSU5TLAkJIlwyMzNcMDY0XDA2MH4ifSwJLyogMTAxIGtleSBrZXlib2FyZCAqLwogICAge0tfUEFHRVVQLAkJIlwyMzNcMDY0XDA2MX4ifSwJLyogMTAxIGtleSBrZXlib2FyZCAqLwogICAge0tfUEFHRURPV04sCSJcMjMzXDA2NFwwNjJ+In0sCS8qIDEwMSBrZXkga2V5Ym9hcmQgKi8KICAgIHtLX0hPTUUsCQkiXDIzM1wwNjRcMDY0fiJ9LAkvKiAxMDEga2V5IGtleWJvYXJkICovCiAgICB7S19FTkQsCQkiXDIzM1wwNjRcMDY1fiJ9LAkvKiAxMDEga2V5IGtleWJvYXJkICovCgogICAge0JUX0VYVFJBX0tFWVMsCSIifSwKICAgIHtURVJNQ0FQMktFWSgnIycsICcyJyksICJcMjMzXDA2NVwwNjR+In0sCS8qIHNoaWZ0ZWQgaG9tZSBrZXkgKi8KICAgIHtURVJNQ0FQMktFWSgnIycsICczJyksICJcMjMzXDA2NVwwNjB+In0sCS8qIHNoaWZ0ZWQgaW5zZXJ0IGtleSAqLwogICAge1RFUk1DQVAyS0VZKCcqJywgJzcnKSwgIlwyMzNcMDY1XDA2NX4ifSwJLyogc2hpZnRlZCBlbmQga2V5ICovCiMgZW5kaWYKCiMgaWYgZGVmaW5lZChfX0JFT1NfXykgfHwgZGVmaW5lZChBTExfQlVJTFRJTl9UQ0FQUykKLyoKICogYWxtb3N0IHN0YW5kYXJkIEFOU0kgdGVybWluYWwsIGRlZmF1bHQgZm9yIGJlYm94CiAqLwogICAgeyhpbnQpS1NfTkFNRSwJImJlb3MtYW5zaSJ9LAogICAgeyhpbnQpS1NfQ0UsCSJcMDMzW0sifSwKICAgIHsoaW50KUtTX0NELAkiXDAzM1tKIn0sCiAgICB7KGludClLU19BTCwJIlwwMzNbTCJ9LAojICBpZmRlZiBURVJNSU5GTwogICAgeyhpbnQpS1NfQ0FMLAkiXDAzM1slcDElZEwifSwKIyAgZWxzZQogICAgeyhpbnQpS1NfQ0FMLAkiXDAzM1slZEwifSwKIyAgZW5kaWYKICAgIHsoaW50KUtTX0RMLAkiXDAzM1tNIn0sCiMgIGlmZGVmIFRFUk1JTkZPCiAgICB7KGludClLU19DREwsCSJcMDMzWyVwMSVkTSJ9LAojICBlbHNlCiAgICB7KGludClLU19DREwsCSJcMDMzWyVkTSJ9LAojICBlbmRpZgojaWZkZWYgQkVPU19QUl9PUl9CRVRURVIKIyAgaWZkZWYgVEVSTUlORk8KICAgIHsoaW50KUtTX0NTLAkiXDAzM1slaSVwMSVkOyVwMiVkciJ9LAojICBlbHNlCiAgICB7KGludClLU19DUywJIlwwMzNbJWklZDslZHIifSwJLyogc2Nyb2xsIHJlZ2lvbiAqLwojICBlbmRpZgojZW5kaWYKICAgIHsoaW50KUtTX0NMLAkiXDAzM1tIXDAzM1sySiJ9LAojaWZkZWYgbm90eWV0CiAgICB7KGludClLU19WSSwJIltWSV0ifSwgLyogY3Vyc29yIGludmlzaWJsZSwgVlQzMjA6IENTSSA/IDI1IGwgKi8KICAgIHsoaW50KUtTX1ZFLAkiW1ZFXSJ9LCAvKiBjdXJzb3IgdmlzaWJsZSwgVlQzMjA6IENTSSA/IDI1IGggKi8KI2VuZGlmCiAgICB7KGludClLU19NRSwJIlwwMzNbbSJ9LAkvKiBub3JtYWwgbW9kZSAqLwogICAgeyhpbnQpS1NfTVIsCSJcMDMzWzdtIn0sCS8qIHJldmVyc2UgKi8KICAgIHsoaW50KUtTX01ELAkiXDAzM1sxbSJ9LAkvKiBib2xkICovCiAgICB7KGludClLU19TTywJIlwwMzNbMzFtIn0sCS8qIHN0YW5kb3V0IG1vZGU6IHJlZCAqLwogICAgeyhpbnQpS1NfU0UsCSJcMDMzW20ifSwJLyogc3RhbmRvdXQgZW5kICovCiAgICB7KGludClLU19DWkgsCSJcMDMzWzM1bSJ9LAkvKiBpdGFsaWM6IHB1cnBsZSAqLwogICAgeyhpbnQpS1NfQ1pSLAkiXDAzM1ttIn0sCS8qIGl0YWxpYyBlbmQgKi8KICAgIHsoaW50KUtTX1VTLAkiXDAzM1s0bSJ9LAkvKiB1bmRlcnNjb3JlIG1vZGUgKi8KICAgIHsoaW50KUtTX1VFLAkiXDAzM1ttIn0sCS8qIHVuZGVyc2NvcmUgZW5kICovCiAgICB7KGludClLU19DQ08sCSI4In0sCQkvKiBhbGxvdyA4IGNvbG9ycyAqLwojICBpZmRlZiBURVJNSU5GTwogICAgeyhpbnQpS1NfQ0FCLAkiXDAzM1s0JXAxJWRtIn0sLyogc2V0IGJhY2tncm91bmQgY29sb3IgKi8KICAgIHsoaW50KUtTX0NBRiwJIlwwMzNbMyVwMSVkbSJ9LC8qIHNldCBmb3JlZ3JvdW5kIGNvbG9yICovCiMgIGVsc2UKICAgIHsoaW50KUtTX0NBQiwJIlwwMzNbNCVkbSJ9LAkvKiBzZXQgYmFja2dyb3VuZCBjb2xvciAqLwogICAgeyhpbnQpS1NfQ0FGLAkiXDAzM1szJWRtIn0sCS8qIHNldCBmb3JlZ3JvdW5kIGNvbG9yICovCiMgIGVuZGlmCiAgICB7KGludClLU19PUCwJIlwwMzNbbSJ9LAkvKiByZXNldCBjb2xvcnMgKi8KICAgIHsoaW50KUtTX01TLAkieSJ9LAkJLyogc2FmZSB0byBtb3ZlIGN1ciBpbiByZXZlcnNlIG1vZGUgKi8KICAgIHsoaW50KUtTX1VULAkieSJ9LAkJLyogZ3Vlc3NlZCAqLwogICAgeyhpbnQpS1NfTEUsCSJcYiJ9LAojICBpZmRlZiBURVJNSU5GTwogICAgeyhpbnQpS1NfQ00sCSJcMDMzWyVpJXAxJWQ7JXAyJWRIIn0sCiMgIGVsc2UKICAgIHsoaW50KUtTX0NNLAkiXDAzM1slaSVkOyVkSCJ9LAojICBlbmRpZgogICAgeyhpbnQpS1NfU1IsCSJcMDMzTSJ9LAojICBpZmRlZiBURVJNSU5GTwogICAgeyhpbnQpS1NfQ1JJLAkiXDAzM1slcDElZEMifSwKIyAgZWxzZQogICAgeyhpbnQpS1NfQ1JJLAkiXDAzM1slZEMifSwKIyAgZW5kaWYKI2lmIGRlZmluZWQoQkVPU19EUjgpCiAgICB7KGludClLU19EQiwJIiJ9LAkJLyogaGFjayEgc2VlIHNjcmVlbi5jICovCiNlbmRpZgoKICAgIHtLX1VQLAkJIlwwMzNbQSJ9LAogICAge0tfRE9XTiwJCSJcMDMzW0IifSwKICAgIHtLX0xFRlQsCQkiXDAzM1tEIn0sCiAgICB7S19SSUdIVCwJCSJcMDMzW0MifSwKIyBlbmRpZgoKIyBpZiBkZWZpbmVkKFVOSVgpIHx8IGRlZmluZWQoQUxMX0JVSUxUSU5fVENBUFMpIHx8IGRlZmluZWQoU09NRV9CVUlMVElOX1RDQVBTKSB8fCBkZWZpbmVkKF9fRU1YX18pCi8qCiAqIHN0YW5kYXJkIEFOU0kgdGVybWluYWwsIGRlZmF1bHQgZm9yIHVuaXgKICovCiAgICB7KGludClLU19OQU1FLAkiYW5zaSJ9LAogICAgeyhpbnQpS1NfQ0UsCUlGX0VCKCJcMDMzW0siLCBFU0NfU1RSICJbSyIpfSwKICAgIHsoaW50KUtTX0FMLAlJRl9FQigiXDAzM1tMIiwgRVNDX1NUUiAiW0wiKX0sCiMgIGlmZGVmIFRFUk1JTkZPCiAgICB7KGludClLU19DQUwsCUlGX0VCKCJcMDMzWyVwMSVkTCIsIEVTQ19TVFIgIlslcDElZEwiKX0sCiMgIGVsc2UKICAgIHsoaW50KUtTX0NBTCwJSUZfRUIoIlwwMzNbJWRMIiwgRVNDX1NUUiAiWyVkTCIpfSwKIyAgZW5kaWYKICAgIHsoaW50KUtTX0RMLAlJRl9FQigiXDAzM1tNIiwgRVNDX1NUUiAiW00iKX0sCiMgIGlmZGVmIFRFUk1JTkZPCiAgICB7KGludClLU19DREwsCUlGX0VCKCJcMDMzWyVwMSVkTSIsIEVTQ19TVFIgIlslcDElZE0iKX0sCiMgIGVsc2UKICAgIHsoaW50KUtTX0NETCwJSUZfRUIoIlwwMzNbJWRNIiwgRVNDX1NUUiAiWyVkTSIpfSwKIyAgZW5kaWYKICAgIHsoaW50KUtTX0NMLAlJRl9FQigiXDAzM1tIXDAzM1sySiIsIEVTQ19TVFIgIltIIiBFU0NfU1RSX25jICJbMkoiKX0sCiAgICB7KGludClLU19NRSwJSUZfRUIoIlwwMzNbMG0iLCBFU0NfU1RSICJbMG0iKX0sCiAgICB7KGludClLU19NUiwJSUZfRUIoIlwwMzNbN20iLCBFU0NfU1RSICJbN20iKX0sCiAgICB7KGludClLU19NUywJInkifSwKICAgIHsoaW50KUtTX1VULAkieSJ9LAkJLyogZ3Vlc3NlZCAqLwogICAgeyhpbnQpS1NfTEUsCSJcYiJ9LAojICBpZmRlZiBURVJNSU5GTwogICAgeyhpbnQpS1NfQ00sCUlGX0VCKCJcMDMzWyVpJXAxJWQ7JXAyJWRIIiwgRVNDX1NUUiAiWyVpJXAxJWQ7JXAyJWRIIil9LAojICBlbHNlCiAgICB7KGludClLU19DTSwJSUZfRUIoIlwwMzNbJWklZDslZEgiLCBFU0NfU1RSICJbJWklZDslZEgiKX0sCiMgIGVuZGlmCiMgIGlmZGVmIFRFUk1JTkZPCiAgICB7KGludClLU19DUkksCUlGX0VCKCJcMDMzWyVwMSVkQyIsIEVTQ19TVFIgIlslcDElZEMiKX0sCiMgIGVsc2UKICAgIHsoaW50KUtTX0NSSSwJSUZfRUIoIlwwMzNbJWRDIiwgRVNDX1NUUiAiWyVkQyIpfSwKIyAgZW5kaWYKIyBlbmRpZgoKIyBpZiBkZWZpbmVkKE1TRE9TKSB8fCBkZWZpbmVkKEFMTF9CVUlMVElOX1RDQVBTKSB8fCBkZWZpbmVkKF9fRU1YX18pCi8qCiAqIFRoZXNlIGNvZGVzIGFyZSB2YWxpZCB3aGVuIG5hbnNpLnN5cyBvciBlcXVpdmFsZW50IGhhcyBiZWVuIGluc3RhbGxlZC4KICogRnVuY3Rpb24ga2V5cyBvbiBhIFBDIGFyZSBwcmVjZWRlZCB3aXRoIGEgTlVMLiBUaGVzZSBhcmUgY29udmVydGVkIGludG8KICogS19OVUwgJ1wzMTYnIGluIG1jaF9pbmNoYXIoKSwgYmVjYXVzZSB3ZSBjYW5ub3QgaGFuZGxlIE5VTHMgaW4ga2V5IGNvZGVzLgogKiBDVFJMLWFycm93IGlzIHVzZWQgaW5zdGVhZCBvZiBTSElGVC1hcnJvdy4KICovCiNpZmRlZiBfX0VNWF9fCiAgICB7KGludClLU19OQU1FLAkib3MyYW5zaSJ9LAojZWxzZQogICAgeyhpbnQpS1NfTkFNRSwJInBjYW5zaSJ9LAogICAgeyhpbnQpS1NfREwsCSJcMDMzW00ifSwKICAgIHsoaW50KUtTX0FMLAkiXDAzM1tMIn0sCiNlbmRpZgogICAgeyhpbnQpS1NfQ0UsCSJcMDMzW0sifSwKICAgIHsoaW50KUtTX0NMLAkiXDAzM1sySiJ9LAogICAgeyhpbnQpS1NfTUUsCSJcMDMzWzBtIn0sCiAgICB7KGludClLU19NUiwJIlwwMzNbNW0ifSwJLyogcmV2ZXJzZTogYmxhY2sgb24gbGlnaHRncmV5ICovCiAgICB7KGludClLU19NRCwJIlwwMzNbMW0ifSwJLyogYm9sZDogd2hpdGUgdGV4dCAqLwogICAgeyhpbnQpS1NfU0UsCSJcMDMzWzBtIn0sCS8qIHN0YW5kb3V0IGVuZCAqLwogICAgeyhpbnQpS1NfU08sCSJcMDMzWzMxbSJ9LAkvKiBzdGFuZG91dDogd2hpdGUgb24gYmx1ZSAqLwogICAgeyhpbnQpS1NfQ1pILAkiXDAzM1szNDs0M20ifSwJLyogaXRhbGljIG1vZGU6IGJsdWUgdGV4dCBvbiB5ZWxsb3cgKi8KICAgIHsoaW50KUtTX0NaUiwJIlwwMzNbMG0ifSwJLyogaXRhbGljIG1vZGUgZW5kICovCiAgICB7KGludClLU19VUywJIlwwMzNbMzY7NDFtIn0sCS8qIHVuZGVyc2NvcmUgbW9kZTogY3lhbiB0ZXh0IG9uIHJlZCAqLwogICAgeyhpbnQpS1NfVUUsCSJcMDMzWzBtIn0sCS8qIHVuZGVyc2NvcmUgbW9kZSBlbmQgKi8KICAgIHsoaW50KUtTX0NDTywJIjgifSwJCS8qIGFsbG93IDggY29sb3JzICovCiMgIGlmZGVmIFRFUk1JTkZPCiAgICB7KGludClLU19DQUIsCSJcMDMzWzQlcDElZG0ifSwvKiBzZXQgYmFja2dyb3VuZCBjb2xvciAqLwogICAgeyhpbnQpS1NfQ0FGLAkiXDAzM1szJXAxJWRtIn0sLyogc2V0IGZvcmVncm91bmQgY29sb3IgKi8KIyAgZWxzZQogICAgeyhpbnQpS1NfQ0FCLAkiXDAzM1s0JWRtIn0sCS8qIHNldCBiYWNrZ3JvdW5kIGNvbG9yICovCiAgICB7KGludClLU19DQUYsCSJcMDMzWzMlZG0ifSwJLyogc2V0IGZvcmVncm91bmQgY29sb3IgKi8KIyAgZW5kaWYKICAgIHsoaW50KUtTX09QLAkiXDAzM1swbSJ9LAkvKiByZXNldCBjb2xvcnMgKi8KICAgIHsoaW50KUtTX01TLAkieSJ9LAogICAgeyhpbnQpS1NfVVQsCSJ5In0sCQkvKiBndWVzc2VkICovCiAgICB7KGludClLU19MRSwJIlxiIn0sCiMgIGlmZGVmIFRFUk1JTkZPCiAgICB7KGludClLU19DTSwJIlwwMzNbJWklcDElZDslcDIlZEgifSwKIyAgZWxzZQogICAgeyhpbnQpS1NfQ00sCSJcMDMzWyVpJWQ7JWRIIn0sCiMgIGVuZGlmCiMgIGlmZGVmIFRFUk1JTkZPCiAgICB7KGludClLU19DUkksCSJcMDMzWyVwMSVkQyJ9LAojICBlbHNlCiAgICB7KGludClLU19DUkksCSJcMDMzWyVkQyJ9LAojICBlbmRpZgogICAge0tfVVAsCQkiXDMxNkgifSwKICAgIHtLX0RPV04sCQkiXDMxNlAifSwKICAgIHtLX0xFRlQsCQkiXDMxNksifSwKICAgIHtLX1JJR0hULAkJIlwzMTZNIn0sCiAgICB7S19TX0xFRlQsCQkiXDMxNnMifSwKICAgIHtLX1NfUklHSFQsCQkiXDMxNnQifSwKICAgIHtLX0YxLAkJIlwzMTY7In0sCiAgICB7S19GMiwJCSJcMzE2PCJ9LAogICAge0tfRjMsCQkiXDMxNj0ifSwKICAgIHtLX0Y0LAkJIlwzMTY+In0sCiAgICB7S19GNSwJCSJcMzE2PyJ9LAogICAge0tfRjYsCQkiXDMxNkAifSwKICAgIHtLX0Y3LAkJIlwzMTZBIn0sCiAgICB7S19GOCwJCSJcMzE2QiJ9LAogICAge0tfRjksCQkiXDMxNkMifSwKICAgIHtLX0YxMCwJCSJcMzE2RCJ9LAogICAge0tfRjExLAkJIlwzMTZcMjA1In0sCS8qIGd1ZXNzZWQgKi8KICAgIHtLX0YxMiwJCSJcMzE2XDIwNiJ9LAkvKiBndWVzc2VkICovCiAgICB7S19TX0YxLAkJIlwzMTZUIn0sCiAgICB7S19TX0YyLAkJIlwzMTZVIn0sCiAgICB7S19TX0YzLAkJIlwzMTZWIn0sCiAgICB7S19TX0Y0LAkJIlwzMTZXIn0sCiAgICB7S19TX0Y1LAkJIlwzMTZYIn0sCiAgICB7S19TX0Y2LAkJIlwzMTZZIn0sCiAgICB7S19TX0Y3LAkJIlwzMTZaIn0sCiAgICB7S19TX0Y4LAkJIlwzMTZbIn0sCiAgICB7S19TX0Y5LAkJIlwzMTZcXCJ9LAogICAge0tfU19GMTAsCQkiXDMxNl0ifSwKICAgIHtLX1NfRjExLAkJIlwzMTZcMjA3In0sCS8qIGd1ZXNzZWQgKi8KICAgIHtLX1NfRjEyLAkJIlwzMTZcMjEwIn0sCS8qIGd1ZXNzZWQgKi8KICAgIHtLX0lOUywJCSJcMzE2UiJ9LAogICAge0tfREVMLAkJIlwzMTZTIn0sCiAgICB7S19IT01FLAkJIlwzMTZHIn0sCiAgICB7S19FTkQsCQkiXDMxNk8ifSwKICAgIHtLX1BBR0VET1dOLAkiXDMxNlEifSwKICAgIHtLX1BBR0VVUCwJCSJcMzE2SSJ9LAojIGVuZGlmCgojIGlmIGRlZmluZWQoTVNET1MpCi8qCiAqIFRoZXNlIGNvZGVzIGFyZSB2YWxpZCBmb3IgdGhlIHBjIHZpZGVvLiAgVGhlIGVudHJpZXMgdGhhdCBzdGFydCB3aXRoIEVTQyB8CiAqIGFyZSB0cmFuc2xhdGVkIGludG8gY29uaW8gY2FsbHMgaW4gb3NfbXNkb3MuYy4gRGVmYXVsdCBmb3IgTVNET1MuCiAqLwogICAgeyhpbnQpS1NfTkFNRSwJInBjdGVybSJ9LAogICAgeyhpbnQpS1NfQ0UsCSJcMDMzfEsifSwKICAgIHsoaW50KUtTX0FMLAkiXDAzM3xMIn0sCiAgICB7KGludClLU19ETCwJIlwwMzN8TSJ9LAojICBpZmRlZiBURVJNSU5GTwogICAgeyhpbnQpS1NfQ1MsCSJcMDMzfCVpJXAxJWQ7JXAyJWRyIn0sCiMgICBpZmRlZiBGRUFUX1ZFUlRTUExJVAogICAgeyhpbnQpS1NfQ1NWLAkiXDAzM3wlaSVwMSVkOyVwMiVkViJ9LAojICAgZW5kaWYKIyAgZWxzZQogICAgeyhpbnQpS1NfQ1MsCSJcMDMzfCVpJWQ7JWRyIn0sCiMgICBpZmRlZiBGRUFUX1ZFUlRTUExJVAogICAgeyhpbnQpS1NfQ1NWLAkiXDAzM3wlaSVkOyVkViJ9LAojICAgZW5kaWYKIyAgZW5kaWYKICAgIHsoaW50KUtTX0NMLAkiXDAzM3xKIn0sCiAgICB7KGludClLU19NRSwJIlwwMzN8MG0ifSwJLyogbm9ybWFsICovCiAgICB7KGludClLU19NUiwJIlwwMzN8MTEybSJ9LAkvKiByZXZlcnNlOiBibGFjayBvbiBsaWdodGdyZXkgKi8KICAgIHsoaW50KUtTX01ELAkiXDAzM3wxNW0ifSwJLyogYm9sZDogd2hpdGUgdGV4dCAqLwogICAgeyhpbnQpS1NfU0UsCSJcMDMzfDBtIn0sCS8qIHN0YW5kb3V0IGVuZCAqLwogICAgeyhpbnQpS1NfU08sCSJcMDMzfDMxbSJ9LAkvKiBzdGFuZG91dDogd2hpdGUgb24gYmx1ZSAqLwogICAgeyhpbnQpS1NfQ1pILAkiXDAzM3wyMjVtIn0sCS8qIGl0YWxpYyBtb2RlOiBibHVlIHRleHQgb24geWVsbG93ICovCiAgICB7KGludClLU19DWlIsCSJcMDMzfDBtIn0sCS8qIGl0YWxpYyBtb2RlIGVuZCAqLwogICAgeyhpbnQpS1NfVVMsCSJcMDMzfDY3bSJ9LAkvKiB1bmRlcnNjb3JlIG1vZGU6IGN5YW4gdGV4dCBvbiByZWQgKi8KICAgIHsoaW50KUtTX1VFLAkiXDAzM3wwbSJ9LAkvKiB1bmRlcnNjb3JlIG1vZGUgZW5kICovCiAgICB7KGludClLU19DQ08sCSIxNiJ9LAkJLyogYWxsb3cgMTYgY29sb3JzICovCiMgIGlmZGVmIFRFUk1JTkZPCiAgICB7KGludClLU19DQUIsCSJcMDMzfCVwMSVkYiJ9LAkvKiBzZXQgYmFja2dyb3VuZCBjb2xvciAqLwogICAgeyhpbnQpS1NfQ0FGLAkiXDAzM3wlcDElZGYifSwJLyogc2V0IGZvcmVncm91bmQgY29sb3IgKi8KIyAgZWxzZQogICAgeyhpbnQpS1NfQ0FCLAkiXDAzM3wlZGIifSwJLyogc2V0IGJhY2tncm91bmQgY29sb3IgKi8KICAgIHsoaW50KUtTX0NBRiwJIlwwMzN8JWRmIn0sCS8qIHNldCBmb3JlZ3JvdW5kIGNvbG9yICovCiMgIGVuZGlmCiAgICB7KGludClLU19NUywJInkifSwKICAgIHsoaW50KUtTX1VULAkieSJ9LAogICAgeyhpbnQpS1NfTEUsCSJcYiJ9LAojICBpZmRlZiBURVJNSU5GTwogICAgeyhpbnQpS1NfQ00sCSJcMDMzfCVpJXAxJWQ7JXAyJWRIIn0sCiMgIGVsc2UKICAgIHsoaW50KUtTX0NNLAkiXDAzM3wlaSVkOyVkSCJ9LAojICBlbmRpZgojaWZkZWYgREpHUFAKICAgIHsoaW50KUtTX1ZCLAkiXDAzM3xCIn0sCS8qIHZpc3VhbCBiZWxsICovCiNlbmRpZgogICAge0tfVVAsCQkiXDMxNkgifSwKICAgIHtLX0RPV04sCQkiXDMxNlAifSwKICAgIHtLX0xFRlQsCQkiXDMxNksifSwKICAgIHtLX1JJR0hULAkJIlwzMTZNIn0sCiAgICB7S19TX0xFRlQsCQkiXDMxNnMifSwKICAgIHtLX1NfUklHSFQsCQkiXDMxNnQifSwKICAgIHtLX1NfVEFCLAkJIlwzMTZcMDE3In0sCiAgICB7S19GMSwJCSJcMzE2OyJ9LAogICAge0tfRjIsCQkiXDMxNjwifSwKICAgIHtLX0YzLAkJIlwzMTY9In0sCiAgICB7S19GNCwJCSJcMzE2PiJ9LAogICAge0tfRjUsCQkiXDMxNj8ifSwKICAgIHtLX0Y2LAkJIlwzMTZAIn0sCiAgICB7S19GNywJCSJcMzE2QSJ9LAogICAge0tfRjgsCQkiXDMxNkIifSwKICAgIHtLX0Y5LAkJIlwzMTZDIn0sCiAgICB7S19GMTAsCQkiXDMxNkQifSwKICAgIHtLX0YxMSwJCSJcMzE2XDIwNSJ9LAogICAge0tfRjEyLAkJIlwzMTZcMjA2In0sCiAgICB7S19TX0YxLAkJIlwzMTZUIn0sCiAgICB7S19TX0YyLAkJIlwzMTZVIn0sCiAgICB7S19TX0YzLAkJIlwzMTZWIn0sCiAgICB7S19TX0Y0LAkJIlwzMTZXIn0sCiAgICB7S19TX0Y1LAkJIlwzMTZYIn0sCiAgICB7S19TX0Y2LAkJIlwzMTZZIn0sCiAgICB7S19TX0Y3LAkJIlwzMTZaIn0sCiAgICB7S19TX0Y4LAkJIlwzMTZbIn0sCiAgICB7S19TX0Y5LAkJIlwzMTZcXCJ9LAogICAge0tfU19GMTAsCQkiXDMxNl0ifSwKICAgIHtLX1NfRjExLAkJIlwzMTZcMjA3In0sCiAgICB7S19TX0YxMiwJCSJcMzE2XDIxMCJ9LAogICAge0tfSU5TLAkJIlwzMTZSIn0sCiAgICB7S19ERUwsCQkiXDMxNlMifSwKICAgIHtLX0hPTUUsCQkiXDMxNkcifSwKICAgIHtLX0VORCwJCSJcMzE2TyJ9LAogICAge0tfUEFHRURPV04sCSJcMzE2USJ9LAogICAge0tfUEFHRVVQLAkJIlwzMTZJIn0sCiAgICB7S19LUExVUywJCSJcMzE2TiJ9LAogICAge0tfS01JTlVTLAkJIlwzMTZKIn0sCiAgICB7S19LTVVMVElQTFksCSJcMzE2NyJ9LAogICAge0tfSzAsCQkiXDMxNlwzMzIifSwKICAgIHtLX0sxLAkJIlwzMTZcMzM2In0sCiAgICB7S19LMiwJCSJcMzE2XDM0MiJ9LAogICAge0tfSzMsCQkiXDMxNlwzNDYifSwKICAgIHtLX0s0LAkJIlwzMTZcMzUyIn0sCiAgICB7S19LNSwJCSJcMzE2XDM1NiJ9LAogICAge0tfSzYsCQkiXDMxNlwzNjIifSwKICAgIHtLX0s3LAkJIlwzMTZcMzY2In0sCiAgICB7S19LOCwJCSJcMzE2XDM3MiJ9LAogICAge0tfSzksCQkiXDMxNlwzNzYifSwKIyBlbmRpZgoKIyBpZiBkZWZpbmVkKFdJTjMyNjQpIHx8IGRlZmluZWQoQUxMX0JVSUxUSU5fVENBUFMpIHx8IGRlZmluZWQoX19FTVhfXykKLyoKICogVGhlc2UgY29kZXMgYXJlIHZhbGlkIGZvciB0aGUgV2luMzIgQ29uc29sZSAuICBUaGUgZW50cmllcyB0aGF0IHN0YXJ0IHdpdGgKICogRVNDIHwgYXJlIHRyYW5zbGF0ZWQgaW50byBjb25zb2xlIGNhbGxzIGluIG9zX3dpbjMyLmMuICBUaGUgZnVuY3Rpb24ga2V5cwogKiBhcmUgYWxzbyB0cmFuc2xhdGVkIGluIG9zX3dpbjMyLmMuCiAqLwogICAgeyhpbnQpS1NfTkFNRSwJIndpbjMyIn0sCiAgICB7KGludClLU19DRSwJIlwwMzN8SyJ9LAkvKiBjbGVhciB0byBlbmQgb2YgbGluZSAqLwogICAgeyhpbnQpS1NfQUwsCSJcMDMzfEwifSwJLyogYWRkIG5ldyBibGFuayBsaW5lICovCiMgIGlmZGVmIFRFUk1JTkZPCiAgICB7KGludClLU19DQUwsCSJcMDMzfCVwMSVkTCJ9LAkvKiBhZGQgbnVtYmVyIG9mIG5ldyBibGFuayBsaW5lcyAqLwojICBlbHNlCiAgICB7KGludClLU19DQUwsCSJcMDMzfCVkTCJ9LAkvKiBhZGQgbnVtYmVyIG9mIG5ldyBibGFuayBsaW5lcyAqLwojICBlbmRpZgogICAgeyhpbnQpS1NfREwsCSJcMDMzfE0ifSwJLyogZGVsZXRlIGxpbmUgKi8KIyAgaWZkZWYgVEVSTUlORk8KICAgIHsoaW50KUtTX0NETCwJIlwwMzN8JXAxJWRNIn0sCS8qIGRlbGV0ZSBudW1iZXIgb2YgbGluZXMgKi8KIyAgZWxzZQogICAgeyhpbnQpS1NfQ0RMLAkiXDAzM3wlZE0ifSwJLyogZGVsZXRlIG51bWJlciBvZiBsaW5lcyAqLwojICBlbmRpZgogICAgeyhpbnQpS1NfQ0wsCSJcMDMzfEoifSwJLyogY2xlYXIgc2NyZWVuICovCiAgICB7KGludClLU19DRCwJIlwwMzN8aiJ9LAkvKiBjbGVhciB0byBlbmQgb2YgZGlzcGxheSAqLwogICAgeyhpbnQpS1NfVkksCSJcMDMzfHYifSwJLyogY3Vyc29yIGludmlzaWJsZSAqLwogICAgeyhpbnQpS1NfVkUsCSJcMDMzfFYifSwJLyogY3Vyc29yIHZpc2libGUgKi8KCiAgICB7KGludClLU19NRSwJIlwwMzN8MG0ifSwJLyogbm9ybWFsICovCiAgICB7KGludClLU19NUiwJIlwwMzN8MTEybSJ9LAkvKiByZXZlcnNlOiBibGFjayBvbiBsaWdodGdyYXkgKi8KICAgIHsoaW50KUtTX01ELAkiXDAzM3wxNW0ifSwJLyogYm9sZDogd2hpdGUgb24gYmxhY2sgKi8KI2lmIDEKICAgIHsoaW50KUtTX1NPLAkiXDAzM3wzMW0ifSwJLyogc3RhbmRvdXQ6IHdoaXRlIG9uIGJsdWUgKi8KICAgIHsoaW50KUtTX1NFLAkiXDAzM3wwbSJ9LAkvKiBzdGFuZG91dCBlbmQgKi8KI2Vsc2UKICAgIHsoaW50KUtTX1NPLAkiXDAzM3xGIn0sCS8qIHN0YW5kb3V0OiBoaWdoIGludGVuc2l0eSAqLwogICAgeyhpbnQpS1NfU0UsCSJcMDMzfGYifSwJLyogc3RhbmRvdXQgZW5kICovCiNlbmRpZgogICAgeyhpbnQpS1NfQ1pILAkiXDAzM3wyMjVtIn0sCS8qIGl0YWxpYzogYmx1ZSB0ZXh0IG9uIHllbGxvdyAqLwogICAgeyhpbnQpS1NfQ1pSLAkiXDAzM3wwbSJ9LAkvKiBpdGFsaWMgZW5kICovCiAgICB7KGludClLU19VUywJIlwwMzN8NjdtIn0sCS8qIHVuZGVyc2NvcmU6IGN5YW4gdGV4dCBvbiByZWQgKi8KICAgIHsoaW50KUtTX1VFLAkiXDAzM3wwbSJ9LAkvKiB1bmRlcnNjb3JlIGVuZCAqLwogICAgeyhpbnQpS1NfQ0NPLAkiMTYifSwJCS8qIGFsbG93IDE2IGNvbG9ycyAqLwojICBpZmRlZiBURVJNSU5GTwogICAgeyhpbnQpS1NfQ0FCLAkiXDAzM3wlcDElZGIifSwJLyogc2V0IGJhY2tncm91bmQgY29sb3IgKi8KICAgIHsoaW50KUtTX0NBRiwJIlwwMzN8JXAxJWRmIn0sCS8qIHNldCBmb3JlZ3JvdW5kIGNvbG9yICovCiMgIGVsc2UKICAgIHsoaW50KUtTX0NBQiwJIlwwMzN8JWRiIn0sCS8qIHNldCBiYWNrZ3JvdW5kIGNvbG9yICovCiAgICB7KGludClLU19DQUYsCSJcMDMzfCVkZiJ9LAkvKiBzZXQgZm9yZWdyb3VuZCBjb2xvciAqLwojICBlbmRpZgoKICAgIHsoaW50KUtTX01TLAkieSJ9LAkJLyogc2F2ZSB0byBtb3ZlIGN1ciBpbiByZXZlcnNlIG1vZGUgKi8KICAgIHsoaW50KUtTX1VULAkieSJ9LAogICAgeyhpbnQpS1NfTEUsCSJcYiJ9LAojICBpZmRlZiBURVJNSU5GTwogICAgeyhpbnQpS1NfQ00sCSJcMDMzfCVpJXAxJWQ7JXAyJWRIIn0sLyogY3Vyc29yIG1vdGlvbiAqLwojICBlbHNlCiAgICB7KGludClLU19DTSwJIlwwMzN8JWklZDslZEgifSwvKiBjdXJzb3IgbW90aW9uICovCiMgIGVuZGlmCiAgICB7KGludClLU19WQiwJIlwwMzN8QiJ9LAkvKiB2aXN1YWwgYmVsbCAqLwogICAgeyhpbnQpS1NfVEksCSJcMDMzfFMifSwJLyogcHV0IHRlcm1pbmFsIGluIHRlcm1jYXAgbW9kZSAqLwogICAgeyhpbnQpS1NfVEUsCSJcMDMzfEUifSwJLyogb3V0IG9mIHRlcm1jYXAgbW9kZSAqLwojICBpZmRlZiBURVJNSU5GTwogICAgeyhpbnQpS1NfQ1MsCSJcMDMzfCVpJXAxJWQ7JXAyJWRyIn0sLyogc2Nyb2xsIHJlZ2lvbiAqLwojICBlbHNlCiAgICB7KGludClLU19DUywJIlwwMzN8JWklZDslZHIifSwvKiBzY3JvbGwgcmVnaW9uICovCiMgIGVuZGlmCgogICAge0tfVVAsCQkiXDMxNkgifSwKICAgIHtLX0RPV04sCQkiXDMxNlAifSwKICAgIHtLX0xFRlQsCQkiXDMxNksifSwKICAgIHtLX1JJR0hULAkJIlwzMTZNIn0sCiAgICB7S19TX1VQLAkJIlwzMTZcMzA0In0sCiAgICB7S19TX0RPV04sCQkiXDMxNlwzMTcifSwKICAgIHtLX1NfTEVGVCwJCSJcMzE2XDMxMSJ9LAogICAge0tfQ19MRUZULAkJIlwzMTZzIn0sCiAgICB7S19TX1JJR0hULAkJIlwzMTZcMzEzIn0sCiAgICB7S19DX1JJR0hULAkJIlwzMTZ0In0sCiAgICB7S19TX1RBQiwJCSJcMzE2XDAxNyJ9LAogICAge0tfRjEsCQkiXDMxNjsifSwKICAgIHtLX0YyLAkJIlwzMTY8In0sCiAgICB7S19GMywJCSJcMzE2PSJ9LAogICAge0tfRjQsCQkiXDMxNj4ifSwKICAgIHtLX0Y1LAkJIlwzMTY/In0sCiAgICB7S19GNiwJCSJcMzE2QCJ9LAogICAge0tfRjcsCQkiXDMxNkEifSwKICAgIHtLX0Y4LAkJIlwzMTZCIn0sCiAgICB7S19GOSwJCSJcMzE2QyJ9LAogICAge0tfRjEwLAkJIlwzMTZEIn0sCiAgICB7S19GMTEsCQkiXDMxNlwyMDUifSwKICAgIHtLX0YxMiwJCSJcMzE2XDIwNiJ9LAogICAge0tfU19GMSwJCSJcMzE2VCJ9LAogICAge0tfU19GMiwJCSJcMzE2VSJ9LAogICAge0tfU19GMywJCSJcMzE2ViJ9LAogICAge0tfU19GNCwJCSJcMzE2VyJ9LAogICAge0tfU19GNSwJCSJcMzE2WCJ9LAogICAge0tfU19GNiwJCSJcMzE2WSJ9LAogICAge0tfU19GNywJCSJcMzE2WiJ9LAogICAge0tfU19GOCwJCSJcMzE2WyJ9LAogICAge0tfU19GOSwJCSJcMzE2XFwifSwKICAgIHtLX1NfRjEwLAkJIlwzMTZdIn0sCiAgICB7S19TX0YxMSwJCSJcMzE2XDIwNyJ9LAogICAge0tfU19GMTIsCQkiXDMxNlwyMTAifSwKICAgIHtLX0lOUywJCSJcMzE2UiJ9LAogICAge0tfREVMLAkJIlwzMTZTIn0sCiAgICB7S19IT01FLAkJIlwzMTZHIn0sCiAgICB7S19TX0hPTUUsCQkiXDMxNlwzMDIifSwKICAgIHtLX0NfSE9NRSwJCSJcMzE2dyJ9LAogICAge0tfRU5ELAkJIlwzMTZPIn0sCiAgICB7S19TX0VORCwJCSJcMzE2XDMxNSJ9LAogICAge0tfQ19FTkQsCQkiXDMxNnUifSwKICAgIHtLX1BBR0VET1dOLAkiXDMxNlEifSwKICAgIHtLX1BBR0VVUCwJCSJcMzE2SSJ9LAogICAge0tfS1BMVVMsCQkiXDMxNk4ifSwKICAgIHtLX0tNSU5VUywJCSJcMzE2SiJ9LAogICAge0tfS01VTFRJUExZLAkiXDMxNlwwNjcifSwKICAgIHtLX0swLAkJIlwzMTZcMzMyIn0sCiAgICB7S19LMSwJCSJcMzE2XDMzNiJ9LAogICAge0tfSzIsCQkiXDMxNlwzNDIifSwKICAgIHtLX0szLAkJIlwzMTZcMzQ2In0sCiAgICB7S19LNCwJCSJcMzE2XDM1MiJ9LAogICAge0tfSzUsCQkiXDMxNlwzNTYifSwKICAgIHtLX0s2LAkJIlwzMTZcMzYyIn0sCiAgICB7S19LNywJCSJcMzE2XDM2NiJ9LAogICAge0tfSzgsCQkiXDMxNlwzNzIifSwKICAgIHtLX0s5LAkJIlwzMTZcMzc2In0sCiMgZW5kaWYKCiMgaWYgZGVmaW5lZChWTVMpIHx8IGRlZmluZWQoQUxMX0JVSUxUSU5fVENBUFMpCi8qCiAqIFZUMzIwIGlzIHdvcmtpbmcgYXMgYW4gQU5TSSB0ZXJtaW5hbCBjb21wYXRpYmxlIERFQyB0ZXJtaW5hbC4KICogKGl0IGNvdmVycyBWVDF4MCwgVlQyeDAgYW5kIFZUM3gwIHVwIHRvIFZUMzIwIG9uIFZNUyBhcyB3ZWxsKQogKiBOb3RlOiBLX0YxLi4uS19GNSBhcmUgZm9yIGludGVybmFsIHVzZSwgc2hvdWxkIG5vdCBiZSBkZWZpbmVkLgogKiBUT0RPOi0gcmV3cml0ZSBFU0NbIGNvZGVzIHRvIENTSQogKiAgICAgIC0ga2V5Ym9hcmQgbGFuZ3VhZ2VzIChDU0kgPyAyNiBuKQogKi8KICAgIHsoaW50KUtTX05BTUUsCSJ2dDMyMCJ9LAogICAgeyhpbnQpS1NfQ0UsCUlGX0VCKCJcMDMzW0siLCBFU0NfU1RSICJbSyIpfSwKICAgIHsoaW50KUtTX0FMLAlJRl9FQigiXDAzM1tMIiwgRVNDX1NUUiAiW0wiKX0sCiMgIGlmZGVmIFRFUk1JTkZPCiAgICB7KGludClLU19DQUwsCUlGX0VCKCJcMDMzWyVwMSVkTCIsIEVTQ19TVFIgIlslcDElZEwiKX0sCiMgIGVsc2UKICAgIHsoaW50KUtTX0NBTCwJSUZfRUIoIlwwMzNbJWRMIiwgRVNDX1NUUiAiWyVkTCIpfSwKIyAgZW5kaWYKICAgIHsoaW50KUtTX0RMLAlJRl9FQigiXDAzM1tNIiwgRVNDX1NUUiAiW00iKX0sCiMgIGlmZGVmIFRFUk1JTkZPCiAgICB7KGludClLU19DREwsCUlGX0VCKCJcMDMzWyVwMSVkTSIsIEVTQ19TVFIgIlslcDElZE0iKX0sCiMgIGVsc2UKICAgIHsoaW50KUtTX0NETCwJSUZfRUIoIlwwMzNbJWRNIiwgRVNDX1NUUiAiWyVkTSIpfSwKIyAgZW5kaWYKICAgIHsoaW50KUtTX0NMLAlJRl9FQigiXDAzM1tIXDAzM1sySiIsIEVTQ19TVFIgIltIIiBFU0NfU1RSX25jICJbMkoiKX0sCiAgICB7KGludClLU19DRCwJSUZfRUIoIlwwMzNbSiIsIEVTQ19TVFIgIltKIil9LAogICAgeyhpbnQpS1NfQ0NPLAkiOCJ9LAkJCS8qIGFsbG93IDggY29sb3JzICovCiAgICB7KGludClLU19NRSwJSUZfRUIoIlwwMzNbMG0iLCBFU0NfU1RSICJbMG0iKX0sCiAgICB7KGludClLU19NUiwJSUZfRUIoIlwwMzNbN20iLCBFU0NfU1RSICJbN20iKX0sCiAgICB7KGludClLU19NRCwgICAgICAgIElGX0VCKCJcMDMzWzFtIiwgRVNDX1NUUiAiWzFtIil9LCAgLyogYm9sZCBtb2RlICovCiAgICB7KGludClLU19TRSwgICAgICAgIElGX0VCKCJcMDMzWzIybSIsIEVTQ19TVFIgIlsyMm0iKX0sLyogbm9ybWFsIG1vZGUgKi8KICAgIHsoaW50KUtTX1VFLCAgICAgICAgSUZfRUIoIlwwMzNbMjRtIiwgRVNDX1NUUiAiWzI0bSIpfSwvKiBleGl0IHVuZGVyc2NvcmUgbW9kZSAqLwogICAgeyhpbnQpS1NfVVMsICAgICAgICBJRl9FQigiXDAzM1s0bSIsIEVTQ19TVFIgIls0bSIpfSwgIC8qIHVuZGVyc2NvcmUgbW9kZSAqLwogICAgeyhpbnQpS1NfQ1pILCAgICAgICBJRl9FQigiXDAzM1szNDs0M20iLCBFU0NfU1RSICJbMzQ7NDNtIiApfSwgIC8qIGl0YWxpYyBtb2RlOiBibHVlIHRleHQgb24geWVsbG93ICovCiAgICB7KGludClLU19DWlIsICAgICAgIElGX0VCKCJcMDMzWzBtIiwgRVNDX1NUUiAiWzBtIil9LCAgICAgICAgICAgLyogaXRhbGljIG1vZGUgZW5kICovCiAgICB7KGludClLU19DQUIsICAgICAgIElGX0VCKCJcMDMzWzQlZG0iLCBFU0NfU1RSICJbNCVkbSIgKX0sICAgICAgLyogc2V0IGJhY2tncm91bmQgY29sb3IgKEFOU0kpICovCiAgICB7KGludClLU19DQUYsICAgICAgIElGX0VCKCJcMDMzWzMlZG0iLCBFU0NfU1RSICJbMyVkbSIgKX0sICAgICAgLyogc2V0IGZvcmVncm91bmQgY29sb3IgKEFOU0kpICovCiAgICB7KGludClLU19DU0IsICAgICAgIElGX0VCKCJcMDMzWzEwMjslZG0iLCBFU0NfU1RSICJbMTAyOyVkbSIgKX0sICAgIC8qIHNldCBzY3JlZW4gYmFja2dyb3VuZCBjb2xvciAqLwogICAgeyhpbnQpS1NfQ1NGLCAgICAgICBJRl9FQigiXDAzM1sxMDE7JWRtIiwgRVNDX1NUUiAiWzEwMTslZG0iICl9LCAgICAvKiBzZXQgc2NyZWVuIGZvcmVncm91bmQgY29sb3IgKi8KICAgIHsoaW50KUtTX01TLAkieSJ9LAogICAgeyhpbnQpS1NfVVQsCSJ5In0sCiAgICB7KGludClLU19MRSwJIlxiIn0sCiMgIGlmZGVmIFRFUk1JTkZPCiAgICB7KGludClLU19DTSwJSUZfRUIoIlwwMzNbJWklcDElZDslcDIlZEgiLAoJCQkJCQkgIEVTQ19TVFIgIlslaSVwMSVkOyVwMiVkSCIpfSwKIyAgZWxzZQogICAgeyhpbnQpS1NfQ00sCUlGX0VCKCJcMDMzWyVpJWQ7JWRIIiwgRVNDX1NUUiAiWyVpJWQ7JWRIIil9LAojICBlbmRpZgojICBpZmRlZiBURVJNSU5GTwogICAgeyhpbnQpS1NfQ1JJLAlJRl9FQigiXDAzM1slcDElZEMiLCBFU0NfU1RSICJbJXAxJWRDIil9LAojICBlbHNlCiAgICB7KGludClLU19DUkksCUlGX0VCKCJcMDMzWyVkQyIsIEVTQ19TVFIgIlslZEMiKX0sCiMgIGVuZGlmCiAgICB7S19VUCwJCUlGX0VCKCJcMDMzW0EiLCBFU0NfU1RSICJbQSIpfSwKICAgIHtLX0RPV04sCQlJRl9FQigiXDAzM1tCIiwgRVNDX1NUUiAiW0IiKX0sCiAgICB7S19SSUdIVCwJCUlGX0VCKCJcMDMzW0MiLCBFU0NfU1RSICJbQyIpfSwKICAgIHtLX0xFRlQsCQlJRl9FQigiXDAzM1tEIiwgRVNDX1NUUiAiW0QiKX0sCiAgICB7S19GNiwJCUlGX0VCKCJcMDMzWzE3fiIsIEVTQ19TVFIgIlsxN34iKX0sCiAgICB7S19GNywJCUlGX0VCKCJcMDMzWzE4fiIsIEVTQ19TVFIgIlsxOH4iKX0sCiAgICB7S19GOCwJCUlGX0VCKCJcMDMzWzE5fiIsIEVTQ19TVFIgIlsxOX4iKX0sCiAgICB7S19GOSwJCUlGX0VCKCJcMDMzWzIwfiIsIEVTQ19TVFIgIlsyMH4iKX0sCiAgICB7S19GMTAsCQlJRl9FQigiXDAzM1syMX4iLCBFU0NfU1RSICJbMjF+Iil9LAovKiAge0tfRjExLAkJSUZfRUIoIlwwMzNbMjN+IiwgRVNDX1NUUiAiWzIzfiIpfSwKCQkJKiAgKEVTQykgc2hvdWxkIG5vdCBkZWZpbmUsIHNvbWV0aW1lcyBkb2VzIG5vdCB3b3JrICovCiAgICB7S19GMTIsCQlJRl9FQigiXDAzM1syNH4iLCBFU0NfU1RSICJbMjR+Iil9LAogICAge0tfRjEzLAkJSUZfRUIoIlwwMzNbMjV+IiwgRVNDX1NUUiAiWzI1fiIpfSwKICAgIHtLX0YxNCwJCUlGX0VCKCJcMDMzWzI2fiIsIEVTQ19TVFIgIlsyNn4iKX0sCiAgICB7S19GMTUsCQlJRl9FQigiXDAzM1syOH4iLCBFU0NfU1RSICJbMjh+Iil9LAkvKiBIZWxwICovCiAgICB7S19GMTYsCQlJRl9FQigiXDAzM1syOX4iLCBFU0NfU1RSICJbMjl+Iil9LAkvKiBTZWxlY3QgKi8KICAgIHtLX0YxNywJCUlGX0VCKCJcMDMzWzMxfiIsIEVTQ19TVFIgIlszMX4iKX0sCiAgICB7S19GMTgsCQlJRl9FQigiXDAzM1szMn4iLCBFU0NfU1RSICJbMzJ+Iil9LAogICAge0tfRjE5LAkJSUZfRUIoIlwwMzNbMzN+IiwgRVNDX1NUUiAiWzMzfiIpfSwKICAgIHtLX0YyMCwJCUlGX0VCKCJcMDMzWzM0fiIsIEVTQ19TVFIgIlszNH4iKX0sCiAgICB7S19JTlMsCQlJRl9FQigiXDAzM1syfiIsIEVTQ19TVFIgIlsyfiIpfSwKICAgIHtLX0RFTCwJCUlGX0VCKCJcMDMzWzN+IiwgRVNDX1NUUiAiWzN+Iil9LAogICAge0tfSE9NRSwJCUlGX0VCKCJcMDMzWzF+IiwgRVNDX1NUUiAiWzF+Iil9LAogICAge0tfRU5ELAkJSUZfRUIoIlwwMzNbNH4iLCBFU0NfU1RSICJbNH4iKX0sCiAgICB7S19QQUdFVVAsCQlJRl9FQigiXDAzM1s1fiIsIEVTQ19TVFIgIls1fiIpfSwKICAgIHtLX1BBR0VET1dOLAlJRl9FQigiXDAzM1s2fiIsIEVTQ19TVFIgIls2fiIpfSwKICAgIHtLX0tQTFVTLAkJSUZfRUIoIlwwMzNPayIsIEVTQ19TVFIgIk9rIil9LAkvKiBrZXlwYWQgcGx1cyAqLwogICAge0tfS01JTlVTLAkJSUZfRUIoIlwwMzNPbSIsIEVTQ19TVFIgIk9tIil9LAkvKiBrZXlwYWQgbWludXMgKi8KICAgIHtLX0tESVZJREUsCQlJRl9FQigiXDAzM09vIiwgRVNDX1NUUiAiT28iKX0sCS8qIGtleXBhZCAvICovCiAgICB7S19LTVVMVElQTFksCUlGX0VCKCJcMDMzT2oiLCBFU0NfU1RSICJPaiIpfSwJLyoga2V5cGFkICogKi8KICAgIHtLX0tFTlRFUiwJCUlGX0VCKCJcMDMzT00iLCBFU0NfU1RSICJPTSIpfSwJLyoga2V5cGFkIEVudGVyICovCiAgICB7S19CUywJCSJceDdmIn0sCS8qIGZvciBzb21lIHJlYXNvbiAwMTc3IGRvZXNuJ3Qgd29yayAqLwojIGVuZGlmCgojIGlmIGRlZmluZWQoQUxMX0JVSUxUSU5fVENBUFMpIHx8IGRlZmluZWQoX19NSU5UX18pCi8qCiAqIE9yZGluYXJ5IHZ0NTIKICovCiAgICB7KGludClLU19OQU1FLAkidnQ1MiJ9LAogICAgeyhpbnQpS1NfQ0UsCUlGX0VCKCJcMDMzSyIsIEVTQ19TVFIgIksiKX0sCiAgICB7KGludClLU19DRCwJSUZfRUIoIlwwMzNKIiwgRVNDX1NUUiAiSiIpfSwKICAgIHsoaW50KUtTX0NNLAlJRl9FQigiXDAzM1klKyAlKyAiLCBFU0NfU1RSICJZJSsgJSsgIil9LAogICAgeyhpbnQpS1NfTEUsCSJcYiJ9LAojICBpZmRlZiBfX01JTlRfXwogICAgeyhpbnQpS1NfQUwsCUlGX0VCKCJcMDMzTCIsIEVTQ19TVFIgIkwiKX0sCiAgICB7KGludClLU19ETCwJSUZfRUIoIlwwMzNNIiwgRVNDX1NUUiAiTSIpfSwKICAgIHsoaW50KUtTX0NMLAlJRl9FQigiXDAzM0UiLCBFU0NfU1RSICJFIil9LAogICAgeyhpbnQpS1NfU1IsCUlGX0VCKCJcMDMzSSIsIEVTQ19TVFIgIkkiKX0sCiAgICB7KGludClLU19WRSwJSUZfRUIoIlwwMzNlIiwgRVNDX1NUUiAiZSIpfSwKICAgIHsoaW50KUtTX1ZJLAlJRl9FQigiXDAzM2YiLCBFU0NfU1RSICJmIil9LAogICAgeyhpbnQpS1NfU08sCUlGX0VCKCJcMDMzcCIsIEVTQ19TVFIgInAiKX0sCiAgICB7KGludClLU19TRSwJSUZfRUIoIlwwMzNxIiwgRVNDX1NUUiAicSIpfSwKICAgIHtLX1VQLAkJSUZfRUIoIlwwMzNBIiwgRVNDX1NUUiAiQSIpfSwKICAgIHtLX0RPV04sCQlJRl9FQigiXDAzM0IiLCBFU0NfU1RSICJCIil9LAogICAge0tfTEVGVCwJCUlGX0VCKCJcMDMzRCIsIEVTQ19TVFIgIkQiKX0sCiAgICB7S19SSUdIVCwJCUlGX0VCKCJcMDMzQyIsIEVTQ19TVFIgIkMiKX0sCiAgICB7S19TX1VQLAkJSUZfRUIoIlwwMzNhIiwgRVNDX1NUUiAiYSIpfSwKICAgIHtLX1NfRE9XTiwJCUlGX0VCKCJcMDMzYiIsIEVTQ19TVFIgImIiKX0sCiAgICB7S19TX0xFRlQsCQlJRl9FQigiXDAzM2QiLCBFU0NfU1RSICJkIil9LAogICAge0tfU19SSUdIVCwJCUlGX0VCKCJcMDMzYyIsIEVTQ19TVFIgImMiKX0sCiAgICB7S19GMSwJCUlGX0VCKCJcMDMzUCIsIEVTQ19TVFIgIlAiKX0sCiAgICB7S19GMiwJCUlGX0VCKCJcMDMzUSIsIEVTQ19TVFIgIlEiKX0sCiAgICB7S19GMywJCUlGX0VCKCJcMDMzUiIsIEVTQ19TVFIgIlIiKX0sCiAgICB7S19GNCwJCUlGX0VCKCJcMDMzUyIsIEVTQ19TVFIgIlMiKX0sCiAgICB7S19GNSwJCUlGX0VCKCJcMDMzVCIsIEVTQ19TVFIgIlQiKX0sCiAgICB7S19GNiwJCUlGX0VCKCJcMDMzVSIsIEVTQ19TVFIgIlUiKX0sCiAgICB7S19GNywJCUlGX0VCKCJcMDMzViIsIEVTQ19TVFIgIlYiKX0sCiAgICB7S19GOCwJCUlGX0VCKCJcMDMzVyIsIEVTQ19TVFIgIlciKX0sCiAgICB7S19GOSwJCUlGX0VCKCJcMDMzWCIsIEVTQ19TVFIgIlgiKX0sCiAgICB7S19GMTAsCQlJRl9FQigiXDAzM1kiLCBFU0NfU1RSICJZIil9LAogICAge0tfU19GMSwJCUlGX0VCKCJcMDMzcCIsIEVTQ19TVFIgInAiKX0sCiAgICB7S19TX0YyLAkJSUZfRUIoIlwwMzNxIiwgRVNDX1NUUiAicSIpfSwKICAgIHtLX1NfRjMsCQlJRl9FQigiXDAzM3IiLCBFU0NfU1RSICJyIil9LAogICAge0tfU19GNCwJCUlGX0VCKCJcMDMzcyIsIEVTQ19TVFIgInMiKX0sCiAgICB7S19TX0Y1LAkJSUZfRUIoIlwwMzN0IiwgRVNDX1NUUiAidCIpfSwKICAgIHtLX1NfRjYsCQlJRl9FQigiXDAzM3UiLCBFU0NfU1RSICJ1Iil9LAogICAge0tfU19GNywJCUlGX0VCKCJcMDMzdiIsIEVTQ19TVFIgInYiKX0sCiAgICB7S19TX0Y4LAkJSUZfRUIoIlwwMzN3IiwgRVNDX1NUUiAidyIpfSwKICAgIHtLX1NfRjksCQlJRl9FQigiXDAzM3giLCBFU0NfU1RSICJ4Iil9LAogICAge0tfU19GMTAsCQlJRl9FQigiXDAzM3kiLCBFU0NfU1RSICJ5Iil9LAogICAge0tfSU5TLAkJSUZfRUIoIlwwMzNJIiwgRVNDX1NUUiAiSSIpfSwKICAgIHtLX0hPTUUsCQlJRl9FQigiXDAzM0UiLCBFU0NfU1RSICJFIil9LAogICAge0tfUEFHRURPV04sCUlGX0VCKCJcMDMzYiIsIEVTQ19TVFIgImIiKX0sCiAgICB7S19QQUdFVVAsCQlJRl9FQigiXDAzM2EiLCBFU0NfU1RSICJhIil9LAojICBlbHNlCiAgICB7KGludClLU19BTCwJSUZfRUIoIlwwMzNUIiwgRVNDX1NUUiAiVCIpfSwKICAgIHsoaW50KUtTX0RMLAlJRl9FQigiXDAzM1UiLCBFU0NfU1RSICJVIil9LAogICAgeyhpbnQpS1NfQ0wsCUlGX0VCKCJcMDMzSFwwMzNKIiwgRVNDX1NUUiAiSCIgRVNDX1NUUl9uYyAiSiIpfSwKICAgIHsoaW50KUtTX01FLAlJRl9FQigiXDAzM1NPIiwgRVNDX1NUUiAiU08iKX0sCiAgICB7KGludClLU19NUiwJSUZfRUIoIlwwMzNTMiIsIEVTQ19TVFIgIlMyIil9LAogICAgeyhpbnQpS1NfTVMsCSJ5In0sCiMgIGVuZGlmCiMgZW5kaWYKCiMgaWYgZGVmaW5lZChVTklYKSB8fCBkZWZpbmVkKEFMTF9CVUlMVElOX1RDQVBTKSB8fCBkZWZpbmVkKFNPTUVfQlVJTFRJTl9UQ0FQUykgfHwgZGVmaW5lZChfX0VNWF9fKQovKgogKiBUaGUgeHRlcm0gdGVybWNhcCBpcyBtaXNzaW5nIEYxNCBhbmQgRjE1LCBiZWNhdXNlIHRoZXkgc2VuZCB0aGUgc2FtZQogKiBjb2RlcyBhcyB0aGUgdW5kbyBhbmQgaGVscCBrZXksIGFsdGhvdWdoIHRoZXkgZG9uJ3Qgd29yayBvbiBhbGwga2V5Ym9hcmRzLgogKi8KICAgIHsoaW50KUtTX05BTUUsCSJ4dGVybSJ9LAogICAgeyhpbnQpS1NfQ0UsCUlGX0VCKCJcMDMzW0siLCBFU0NfU1RSICJbSyIpfSwKICAgIHsoaW50KUtTX0FMLAlJRl9FQigiXDAzM1tMIiwgRVNDX1NUUiAiW0wiKX0sCiMgIGlmZGVmIFRFUk1JTkZPCiAgICB7KGludClLU19DQUwsCUlGX0VCKCJcMDMzWyVwMSVkTCIsIEVTQ19TVFIgIlslcDElZEwiKX0sCiMgIGVsc2UKICAgIHsoaW50KUtTX0NBTCwJSUZfRUIoIlwwMzNbJWRMIiwgRVNDX1NUUiAiWyVkTCIpfSwKIyAgZW5kaWYKICAgIHsoaW50KUtTX0RMLAlJRl9FQigiXDAzM1tNIiwgRVNDX1NUUiAiW00iKX0sCiMgIGlmZGVmIFRFUk1JTkZPCiAgICB7KGludClLU19DREwsCUlGX0VCKCJcMDMzWyVwMSVkTSIsIEVTQ19TVFIgIlslcDElZE0iKX0sCiMgIGVsc2UKICAgIHsoaW50KUtTX0NETCwJSUZfRUIoIlwwMzNbJWRNIiwgRVNDX1NUUiAiWyVkTSIpfSwKIyAgZW5kaWYKIyAgaWZkZWYgVEVSTUlORk8KICAgIHsoaW50KUtTX0NTLAlJRl9FQigiXDAzM1slaSVwMSVkOyVwMiVkciIsCgkJCQkJCSAgRVNDX1NUUiAiWyVpJXAxJWQ7JXAyJWRyIil9LAojICBlbHNlCiAgICB7KGludClLU19DUywJSUZfRUIoIlwwMzNbJWklZDslZHIiLCBFU0NfU1RSICJbJWklZDslZHIiKX0sCiMgIGVuZGlmCiAgICB7KGludClLU19DTCwJSUZfRUIoIlwwMzNbSFwwMzNbMkoiLCBFU0NfU1RSICJbSCIgRVNDX1NUUl9uYyAiWzJKIil9LAogICAgeyhpbnQpS1NfQ0QsCUlGX0VCKCJcMDMzW0oiLCBFU0NfU1RSICJbSiIpfSwKICAgIHsoaW50KUtTX01FLAlJRl9FQigiXDAzM1ttIiwgRVNDX1NUUiAiW20iKX0sCiAgICB7KGludClLU19NUiwJSUZfRUIoIlwwMzNbN20iLCBFU0NfU1RSICJbN20iKX0sCiAgICB7KGludClLU19NRCwJSUZfRUIoIlwwMzNbMW0iLCBFU0NfU1RSICJbMW0iKX0sCiAgICB7KGludClLU19VRSwJSUZfRUIoIlwwMzNbbSIsIEVTQ19TVFIgIlttIil9LAogICAgeyhpbnQpS1NfVVMsCUlGX0VCKCJcMDMzWzRtIiwgRVNDX1NUUiAiWzRtIil9LAogICAgeyhpbnQpS1NfTVMsCSJ5In0sCiAgICB7KGludClLU19VVCwJInkifSwKICAgIHsoaW50KUtTX0xFLAkiXGIifSwKIyAgaWZkZWYgVEVSTUlORk8KICAgIHsoaW50KUtTX0NNLAlJRl9FQigiXDAzM1slaSVwMSVkOyVwMiVkSCIsCgkJCQkJCSAgRVNDX1NUUiAiWyVpJXAxJWQ7JXAyJWRIIil9LAojICBlbHNlCiAgICB7KGludClLU19DTSwJSUZfRUIoIlwwMzNbJWklZDslZEgiLCBFU0NfU1RSICJbJWklZDslZEgiKX0sCiMgIGVuZGlmCiAgICB7KGludClLU19TUiwJSUZfRUIoIlwwMzNNIiwgRVNDX1NUUiAiTSIpfSwKIyAgaWZkZWYgVEVSTUlORk8KICAgIHsoaW50KUtTX0NSSSwJSUZfRUIoIlwwMzNbJXAxJWRDIiwgRVNDX1NUUiAiWyVwMSVkQyIpfSwKIyAgZWxzZQogICAgeyhpbnQpS1NfQ1JJLAlJRl9FQigiXDAzM1slZEMiLCBFU0NfU1RSICJbJWRDIil9LAojICBlbmRpZgogICAgeyhpbnQpS1NfS1MsCUlGX0VCKCJcMDMzWz8xaFwwMzM9IiwgRVNDX1NUUiAiWz8xaCIgRVNDX1NUUl9uYyAiPSIpfSwKICAgIHsoaW50KUtTX0tFLAlJRl9FQigiXDAzM1s/MWxcMDMzPiIsIEVTQ19TVFIgIls/MWwiIEVTQ19TVFJfbmMgIj4iKX0sCiMgIGlmZGVmIEZFQVRfWFRFUk1fU0FWRQogICAgeyhpbnQpS1NfVEksCUlGX0VCKCJcMDMzN1wwMzNbPzQ3aCIsIEVTQ19TVFIgIjciIEVTQ19TVFJfbmMgIls/NDdoIil9LAogICAgeyhpbnQpS1NfVEUsCUlGX0VCKCJcMDMzWzJKXDAzM1s/NDdsXDAzMzgiLAoJCQkJICBFU0NfU1RSICJbMkoiIEVTQ19TVFJfbmMgIls/NDdsIiBFU0NfU1RSX25jICI4Iil9LAojICBlbmRpZgogICAgeyhpbnQpS1NfQ0lTLAlJRl9FQigiXDAzM10xOyIsIEVTQ19TVFIgIl0xOyIpfSwKICAgIHsoaW50KUtTX0NJRSwJIlwwMDcifSwKICAgIHsoaW50KUtTX1RTLAlJRl9FQigiXDAzM10yOyIsIEVTQ19TVFIgIl0yOyIpfSwKICAgIHsoaW50KUtTX0ZTLAkiXDAwNyJ9LAojICBpZmRlZiBURVJNSU5GTwogICAgeyhpbnQpS1NfQ1dTLAlJRl9FQigiXDAzM1s4OyVwMSVkOyVwMiVkdCIsCgkJCQkJCSAgRVNDX1NUUiAiWzg7JXAxJWQ7JXAyJWR0Iil9LAogICAgeyhpbnQpS1NfQ1dQLAlJRl9FQigiXDAzM1szOyVwMSVkOyVwMiVkdCIsCgkJCQkJCSAgRVNDX1NUUiAiWzM7JXAxJWQ7JXAyJWR0Iil9LAojICBlbHNlCiAgICB7KGludClLU19DV1MsCUlGX0VCKCJcMDMzWzg7JWQ7JWR0IiwgRVNDX1NUUiAiWzg7JWQ7JWR0Iil9LAogICAgeyhpbnQpS1NfQ1dQLAlJRl9FQigiXDAzM1szOyVkOyVkdCIsIEVTQ19TVFIgIlszOyVkOyVkdCIpfSwKIyAgZW5kaWYKICAgIHsoaW50KUtTX0NSViwJSUZfRUIoIlwwMzNbPmMiLCBFU0NfU1RSICJbPmMiKX0sCiAgICB7S19VUCwJCUlGX0VCKCJcMDMzT0EiLCBFU0NfU1RSICJPQSIpfSwKICAgIHtLX0RPV04sCQlJRl9FQigiXDAzM09CIiwgRVNDX1NUUiAiT0IiKX0sCiAgICB7S19SSUdIVCwJCUlGX0VCKCJcMDMzT0MiLCBFU0NfU1RSICJPQyIpfSwKICAgIHtLX0xFRlQsCQlJRl9FQigiXDAzM09EIiwgRVNDX1NUUiAiT0QiKX0sCiAgICB7S19TX1VQLAkJSUZfRUIoIlwwMzNPMkEiLCBFU0NfU1RSICJPMkEiKX0sCiAgICB7S19TX0RPV04sCQlJRl9FQigiXDAzM08yQiIsIEVTQ19TVFIgIk8yQiIpfSwKICAgIHtLX1NfUklHSFQsCQlJRl9FQigiXDAzM08yQyIsIEVTQ19TVFIgIk8yQyIpfSwKICAgIHtLX0NfUklHSFQsCQlJRl9FQigiXDAzM081QyIsIEVTQ19TVFIgIk81QyIpfSwKICAgIHtLX1NfTEVGVCwJCUlGX0VCKCJcMDMzTzJEIiwgRVNDX1NUUiAiTzJEIil9LAogICAge0tfQ19MRUZULAkJSUZfRUIoIlwwMzNPNUQiLCBFU0NfU1RSICJPNUQiKX0sCiAgICAvKiBBbiBleHRyYSBzZXQgb2YgZnVuY3Rpb24ga2V5cyBmb3IgdnQxMDAgbW9kZSAqLwogICAge0tfWEYxLAkJSUZfRUIoIlwwMzNPUCIsIEVTQ19TVFIgIk9QIil9LAogICAge0tfWEYyLAkJSUZfRUIoIlwwMzNPUSIsIEVTQ19TVFIgIk9RIil9LAogICAge0tfWEYzLAkJSUZfRUIoIlwwMzNPUiIsIEVTQ19TVFIgIk9SIil9LAogICAge0tfWEY0LAkJSUZfRUIoIlwwMzNPUyIsIEVTQ19TVFIgIk9TIil9LAogICAge0tfRjEsCQlJRl9FQigiXDAzM1sxMX4iLCBFU0NfU1RSICJbMTF+Iil9LAogICAge0tfRjIsCQlJRl9FQigiXDAzM1sxMn4iLCBFU0NfU1RSICJbMTJ+Iil9LAogICAge0tfRjMsCQlJRl9FQigiXDAzM1sxM34iLCBFU0NfU1RSICJbMTN+Iil9LAogICAge0tfRjQsCQlJRl9FQigiXDAzM1sxNH4iLCBFU0NfU1RSICJbMTR+Iil9LAogICAge0tfRjUsCQlJRl9FQigiXDAzM1sxNX4iLCBFU0NfU1RSICJbMTV+Iil9LAogICAge0tfRjYsCQlJRl9FQigiXDAzM1sxN34iLCBFU0NfU1RSICJbMTd+Iil9LAogICAge0tfRjcsCQlJRl9FQigiXDAzM1sxOH4iLCBFU0NfU1RSICJbMTh+Iil9LAogICAge0tfRjgsCQlJRl9FQigiXDAzM1sxOX4iLCBFU0NfU1RSICJbMTl+Iil9LAogICAge0tfRjksCQlJRl9FQigiXDAzM1syMH4iLCBFU0NfU1RSICJbMjB+Iil9LAogICAge0tfRjEwLAkJSUZfRUIoIlwwMzNbMjF+IiwgRVNDX1NUUiAiWzIxfiIpfSwKICAgIHtLX0YxMSwJCUlGX0VCKCJcMDMzWzIzfiIsIEVTQ19TVFIgIlsyM34iKX0sCiAgICB7S19GMTIsCQlJRl9FQigiXDAzM1syNH4iLCBFU0NfU1RSICJbMjR+Iil9LAogICAge0tfU19YRjEsCQlJRl9FQigiXDAzM08yUCIsIEVTQ19TVFIgIk8yUCIpfSwKICAgIHtLX1NfWEYyLAkJSUZfRUIoIlwwMzNPMlEiLCBFU0NfU1RSICJPMlEiKX0sCiAgICB7S19TX1hGMywJCUlGX0VCKCJcMDMzTzJSIiwgRVNDX1NUUiAiTzJSIil9LAogICAge0tfU19YRjQsCQlJRl9FQigiXDAzM08yUyIsIEVTQ19TVFIgIk8yUyIpfSwKICAgIHtLX1NfRjEsCQlJRl9FQigiXDAzM1sxMTsyfiIsIEVTQ19TVFIgIlsxMTsyfiIpfSwKICAgIHtLX1NfRjIsCQlJRl9FQigiXDAzM1sxMjsyfiIsIEVTQ19TVFIgIlsxMjsyfiIpfSwKICAgIHtLX1NfRjMsCQlJRl9FQigiXDAzM1sxMzsyfiIsIEVTQ19TVFIgIlsxMzsyfiIpfSwKICAgIHtLX1NfRjQsCQlJRl9FQigiXDAzM1sxNDsyfiIsIEVTQ19TVFIgIlsxNDsyfiIpfSwKICAgIHtLX1NfRjUsCQlJRl9FQigiXDAzM1sxNTsyfiIsIEVTQ19TVFIgIlsxNTsyfiIpfSwKICAgIHtLX1NfRjYsCQlJRl9FQigiXDAzM1sxNzsyfiIsIEVTQ19TVFIgIlsxNzsyfiIpfSwKICAgIHtLX1NfRjcsCQlJRl9FQigiXDAzM1sxODsyfiIsIEVTQ19TVFIgIlsxODsyfiIpfSwKICAgIHtLX1NfRjgsCQlJRl9FQigiXDAzM1sxOTsyfiIsIEVTQ19TVFIgIlsxOTsyfiIpfSwKICAgIHtLX1NfRjksCQlJRl9FQigiXDAzM1syMDsyfiIsIEVTQ19TVFIgIlsyMDsyfiIpfSwKICAgIHtLX1NfRjEwLAkJSUZfRUIoIlwwMzNbMjE7Mn4iLCBFU0NfU1RSICJbMjE7Mn4iKX0sCiAgICB7S19TX0YxMSwJCUlGX0VCKCJcMDMzWzIzOzJ+IiwgRVNDX1NUUiAiWzIzOzJ+Iil9LAogICAge0tfU19GMTIsCQlJRl9FQigiXDAzM1syNDsyfiIsIEVTQ19TVFIgIlsyNDsyfiIpfSwKICAgIHtLX1NfVEFCLAkJSUZfRUIoIlwwMzNbWiIsIEVTQ19TVFIgIltaIil9LAogICAge0tfSEVMUCwJCUlGX0VCKCJcMDMzWzI4fiIsIEVTQ19TVFIgIlsyOH4iKX0sCiAgICB7S19VTkRPLAkJSUZfRUIoIlwwMzNbMjZ+IiwgRVNDX1NUUiAiWzI2fiIpfSwKICAgIHtLX0lOUywJCUlGX0VCKCJcMDMzWzJ+IiwgRVNDX1NUUiAiWzJ+Iil9LAogICAge0tfSE9NRSwJCUlGX0VCKCJcMDMzWzd+IiwgRVNDX1NUUiAiWzd+Iil9LAogICAge0tfU19IT01FLAkJSUZfRUIoIlwwMzNPMkgiLCBFU0NfU1RSICJPMkgiKX0sCiAgICB7S19DX0hPTUUsCQlJRl9FQigiXDAzM081SCIsIEVTQ19TVFIgIk81SCIpfSwKICAgIHtLX0tIT01FLAkJSUZfRUIoIlwwMzNbMX4iLCBFU0NfU1RSICJbMX4iKX0sCiAgICB7S19YSE9NRSwJCUlGX0VCKCJcMDMzT0giLCBFU0NfU1RSICJPSCIpfSwJLyogYWx0ZXJuYXRlIEhvbWUgKi8KICAgIHtLX0VORCwJCUlGX0VCKCJcMDMzWzh+IiwgRVNDX1NUUiAiWzh+Iil9LAogICAge0tfU19FTkQsCQlJRl9FQigiXDAzM08yRiIsIEVTQ19TVFIgIk8yRiIpfSwKICAgIHtLX0NfRU5ELAkJSUZfRUIoIlwwMzNPNUYiLCBFU0NfU1RSICJPNUYiKX0sCiAgICB7S19LRU5ELAkJSUZfRUIoIlwwMzNbNH4iLCBFU0NfU1RSICJbNH4iKX0sCiAgICB7S19YRU5ELAkJSUZfRUIoIlwwMzNPRiIsIEVTQ19TVFIgIk9GIil9LAkvKiBhbHRlcm5hdGUgRW5kICovCiAgICB7S19QQUdFVVAsCQlJRl9FQigiXDAzM1s1fiIsIEVTQ19TVFIgIls1fiIpfSwKICAgIHtLX1BBR0VET1dOLAlJRl9FQigiXDAzM1s2fiIsIEVTQ19TVFIgIls2fiIpfSwKICAgIHtLX0tQTFVTLAkJSUZfRUIoIlwwMzNPayIsIEVTQ19TVFIgIk9rIil9LAkvKiBrZXlwYWQgcGx1cyAqLwogICAge0tfS01JTlVTLAkJSUZfRUIoIlwwMzNPbSIsIEVTQ19TVFIgIk9tIil9LAkvKiBrZXlwYWQgbWludXMgKi8KICAgIHtLX0tESVZJREUsCQlJRl9FQigiXDAzM09vIiwgRVNDX1NUUiAiT28iKX0sCS8qIGtleXBhZCAvICovCiAgICB7S19LTVVMVElQTFksCUlGX0VCKCJcMDMzT2oiLCBFU0NfU1RSICJPaiIpfSwJLyoga2V5cGFkICogKi8KICAgIHtLX0tFTlRFUiwJCUlGX0VCKCJcMDMzT00iLCBFU0NfU1RSICJPTSIpfSwJLyoga2V5cGFkIEVudGVyICovCiAgICB7S19LREVMLAkJSUZfRUIoIlwwMzNbM34iLCBFU0NfU1RSICJbM34iKX0sCS8qIGtleXBhZCBEZWwgKi8KCiAgICB7QlRfRVhUUkFfS0VZUywgICAiIn0sCiAgICB7VEVSTUNBUDJLRVkoJ2snLCAnMCcpLCBJRl9FQigiXDAzM1sxMH4iLCBFU0NfU1RSICJbMTB+Iil9LAkvKiBGMCAqLwogICAge1RFUk1DQVAyS0VZKCdGJywgJzMnKSwgSUZfRUIoIlwwMzNbMjV+IiwgRVNDX1NUUiAiWzI1fiIpfSwJLyogRjEzICovCiAgICB7VEVSTUNBUDJLRVkoJ0YnLCAnNicpLCBJRl9FQigiXDAzM1syOX4iLCBFU0NfU1RSICJbMjl+Iil9LAkvKiBGMTYgKi8KICAgIHtURVJNQ0FQMktFWSgnRicsICc3JyksIElGX0VCKCJcMDMzWzMxfiIsIEVTQ19TVFIgIlszMX4iKX0sCS8qIEYxNyAqLwogICAge1RFUk1DQVAyS0VZKCdGJywgJzgnKSwgSUZfRUIoIlwwMzNbMzJ+IiwgRVNDX1NUUiAiWzMyfiIpfSwJLyogRjE4ICovCiAgICB7VEVSTUNBUDJLRVkoJ0YnLCAnOScpLCBJRl9FQigiXDAzM1szM34iLCBFU0NfU1RSICJbMzN+Iil9LAkvKiBGMTkgKi8KICAgIHtURVJNQ0FQMktFWSgnRicsICdBJyksIElGX0VCKCJcMDMzWzM0fiIsIEVTQ19TVFIgIlszNH4iKX0sCS8qIEYyMCAqLwojIGVuZGlmCgojIGlmIGRlZmluZWQoVU5JWCkgfHwgZGVmaW5lZChBTExfQlVJTFRJTl9UQ0FQUykKLyoKICogaXJpcy1hbnNpIGZvciBTaWxpY29uIEdyYXBoaWNzIG1hY2hpbmVzLgogKi8KICAgIHsoaW50KUtTX05BTUUsCSJpcmlzLWFuc2kifSwKICAgIHsoaW50KUtTX0NFLAkiXDAzM1tLIn0sCiAgICB7KGludClLU19DRCwJIlwwMzNbSiJ9LAogICAgeyhpbnQpS1NfQUwsCSJcMDMzW0wifSwKIyAgaWZkZWYgVEVSTUlORk8KICAgIHsoaW50KUtTX0NBTCwJIlwwMzNbJXAxJWRMIn0sCiMgIGVsc2UKICAgIHsoaW50KUtTX0NBTCwJIlwwMzNbJWRMIn0sCiMgIGVuZGlmCiAgICB7KGludClLU19ETCwJIlwwMzNbTSJ9LAojICBpZmRlZiBURVJNSU5GTwogICAgeyhpbnQpS1NfQ0RMLAkiXDAzM1slcDElZE0ifSwKIyAgZWxzZQogICAgeyhpbnQpS1NfQ0RMLAkiXDAzM1slZE0ifSwKIyAgZW5kaWYKI2lmIDAJLyogVGhlIHNjcm9sbCByZWdpb24gaXMgbm90IHdvcmtpbmcgYXMgVmltIGV4cGVjdHMuICovCiMgIGlmZGVmIFRFUk1JTkZPCiAgICB7KGludClLU19DUywJIlwwMzNbJWklcDElZDslcDIlZHIifSwKIyAgZWxzZQogICAgeyhpbnQpS1NfQ1MsCSJcMDMzWyVpJWQ7JWRyIn0sCiMgIGVuZGlmCiNlbmRpZgogICAgeyhpbnQpS1NfQ0wsCSJcMDMzW0hcMDMzWzJKIn0sCiAgICB7KGludClLU19WRSwJIlwwMzNbOS95XDAzM1sxMi95In0sCS8qIFRoZXNlIGFyZW4ndCBkb2N1bWVudGVkICovCiAgICB7KGludClLU19WUywJIlwwMzNbMTAveVwwMzNbPTFoXDAzM1s9MmwifSwgLyogVGhlc2UgYXJlbid0IGRvY3VtZW50ZWQgKi8KICAgIHsoaW50KUtTX1RJLAkiXDAzM1s9NmgifSwKICAgIHsoaW50KUtTX1RFLAkiXDAzM1s9NmwifSwKICAgIHsoaW50KUtTX1NFLAkiXDAzM1syMTsyN20ifSwKICAgIHsoaW50KUtTX1NPLAkiXDAzM1sxOzdtIn0sCiAgICB7KGludClLU19NRSwJIlwwMzNbbSJ9LAogICAgeyhpbnQpS1NfTVIsCSJcMDMzWzdtIn0sCiAgICB7KGludClLU19NRCwJIlwwMzNbMW0ifSwKICAgIHsoaW50KUtTX0NDTywJIjgifSwJCQkvKiBhbGxvdyA4IGNvbG9ycyAqLwogICAgeyhpbnQpS1NfQ1pILAkiXDAzM1szbSJ9LAkJLyogaXRhbGljIG1vZGUgb24gKi8KICAgIHsoaW50KUtTX0NaUiwJIlwwMzNbMjNtIn0sCQkvKiBpdGFsaWMgbW9kZSBvZmYgKi8KICAgIHsoaW50KUtTX1VTLAkiXDAzM1s0bSJ9LAkJLyogdW5kZXJsaW5lIG9uICovCiAgICB7KGludClLU19VRSwJIlwwMzNbMjRtIn0sCQkvKiB1bmRlcmxpbmUgb2ZmICovCiMgIGlmZGVmIFRFUk1JTkZPCiAgICB7KGludClLU19DQUIsCSJcMDMzWzQlcDElZG0ifSwgICAgLyogc2V0IGJhY2tncm91bmQgY29sb3IgKEFOU0kpICovCiAgICB7KGludClLU19DQUYsCSJcMDMzWzMlcDElZG0ifSwgICAgLyogc2V0IGZvcmVncm91bmQgY29sb3IgKEFOU0kpICovCiAgICB7KGludClLU19DU0IsCSJcMDMzWzEwMjslcDElZG0ifSwgLyogc2V0IHNjcmVlbiBiYWNrZ3JvdW5kIGNvbG9yICovCiAgICB7KGludClLU19DU0YsCSJcMDMzWzEwMTslcDElZG0ifSwgLyogc2V0IHNjcmVlbiBmb3JlZ3JvdW5kIGNvbG9yICovCiMgIGVsc2UKICAgIHsoaW50KUtTX0NBQiwJIlwwMzNbNCVkbSJ9LAkgICAgLyogc2V0IGJhY2tncm91bmQgY29sb3IgKEFOU0kpICovCiAgICB7KGludClLU19DQUYsCSJcMDMzWzMlZG0ifSwJICAgIC8qIHNldCBmb3JlZ3JvdW5kIGNvbG9yIChBTlNJKSAqLwogICAgeyhpbnQpS1NfQ1NCLAkiXDAzM1sxMDI7JWRtIn0sICAgIC8qIHNldCBzY3JlZW4gYmFja2dyb3VuZCBjb2xvciAqLwogICAgeyhpbnQpS1NfQ1NGLAkiXDAzM1sxMDE7JWRtIn0sICAgIC8qIHNldCBzY3JlZW4gZm9yZWdyb3VuZCBjb2xvciAqLwojICBlbmRpZgogICAgeyhpbnQpS1NfTVMsCSJ5In0sCQkvKiBndWVzc2VkICovCiAgICB7KGludClLU19VVCwJInkifSwJCS8qIGd1ZXNzZWQgKi8KICAgIHsoaW50KUtTX0xFLAkiXGIifSwKIyAgaWZkZWYgVEVSTUlORk8KICAgIHsoaW50KUtTX0NNLAkiXDAzM1slaSVwMSVkOyVwMiVkSCJ9LAojICBlbHNlCiAgICB7KGludClLU19DTSwJIlwwMzNbJWklZDslZEgifSwKIyAgZW5kaWYKICAgIHsoaW50KUtTX1NSLAkiXDAzM00ifSwKIyAgaWZkZWYgVEVSTUlORk8KICAgIHsoaW50KUtTX0NSSSwJIlwwMzNbJXAxJWRDIn0sCiMgIGVsc2UKICAgIHsoaW50KUtTX0NSSSwJIlwwMzNbJWRDIn0sCiMgIGVuZGlmCiAgICB7KGludClLU19DSVMsCSJcMDMzUDMueSJ9LAogICAgeyhpbnQpS1NfQ0lFLAkiXDIzNCJ9LCAgICAvKiBTVCAiU3RyaW5nIFRlcm1pbmF0b3IiICovCiAgICB7KGludClLU19UUywJIlwwMzNQMS55In0sCiAgICB7KGludClLU19GUywJIlwyMzQifSwgICAgLyogU1QgIlN0cmluZyBUZXJtaW5hdG9yIiAqLwojICBpZmRlZiBURVJNSU5GTwogICAgeyhpbnQpS1NfQ1dTLAkiXDAzM1syMDM7JXAxJWQ7JXAyJWQveSJ9LAogICAgeyhpbnQpS1NfQ1dQLAkiXDAzM1syMDU7JXAxJWQ7JXAyJWQveSJ9LAojICBlbHNlCiAgICB7KGludClLU19DV1MsCSJcMDMzWzIwMzslZDslZC95In0sCiAgICB7KGludClLU19DV1AsCSJcMDMzWzIwNTslZDslZC95In0sCiMgIGVuZGlmCiAgICB7S19VUCwJCSJcMDMzW0EifSwKICAgIHtLX0RPV04sCQkiXDAzM1tCIn0sCiAgICB7S19MRUZULAkJIlwwMzNbRCJ9LAogICAge0tfUklHSFQsCQkiXDAzM1tDIn0sCiAgICB7S19TX1VQLAkJIlwwMzNbMTYxcSJ9LAogICAge0tfU19ET1dOLAkJIlwwMzNbMTY0cSJ9LAogICAge0tfU19MRUZULAkJIlwwMzNbMTU4cSJ9LAogICAge0tfU19SSUdIVCwJCSJcMDMzWzE2N3EifSwKICAgIHtLX0YxLAkJIlwwMzNbMDAxcSJ9LAogICAge0tfRjIsCQkiXDAzM1swMDJxIn0sCiAgICB7S19GMywJCSJcMDMzWzAwM3EifSwKICAgIHtLX0Y0LAkJIlwwMzNbMDA0cSJ9LAogICAge0tfRjUsCQkiXDAzM1swMDVxIn0sCiAgICB7S19GNiwJCSJcMDMzWzAwNnEifSwKICAgIHtLX0Y3LAkJIlwwMzNbMDA3cSJ9LAogICAge0tfRjgsCQkiXDAzM1swMDhxIn0sCiAgICB7S19GOSwJCSJcMDMzWzAwOXEifSwKICAgIHtLX0YxMCwJCSJcMDMzWzAxMHEifSwKICAgIHtLX0YxMSwJCSJcMDMzWzAxMXEifSwKICAgIHtLX0YxMiwJCSJcMDMzWzAxMnEifSwKICAgIHtLX1NfRjEsCQkiXDAzM1swMTNxIn0sCiAgICB7S19TX0YyLAkJIlwwMzNbMDE0cSJ9LAogICAge0tfU19GMywJCSJcMDMzWzAxNXEifSwKICAgIHtLX1NfRjQsCQkiXDAzM1swMTZxIn0sCiAgICB7S19TX0Y1LAkJIlwwMzNbMDE3cSJ9LAogICAge0tfU19GNiwJCSJcMDMzWzAxOHEifSwKICAgIHtLX1NfRjcsCQkiXDAzM1swMTlxIn0sCiAgICB7S19TX0Y4LAkJIlwwMzNbMDIwcSJ9LAogICAge0tfU19GOSwJCSJcMDMzWzAyMXEifSwKICAgIHtLX1NfRjEwLAkJIlwwMzNbMDIycSJ9LAogICAge0tfU19GMTEsCQkiXDAzM1swMjNxIn0sCiAgICB7S19TX0YxMiwJCSJcMDMzWzAyNHEifSwKICAgIHtLX0lOUywJCSJcMDMzWzEzOXEifSwKICAgIHtLX0hPTUUsCQkiXDAzM1tIIn0sCiAgICB7S19FTkQsCQkiXDAzM1sxNDZxIn0sCiAgICB7S19QQUdFVVAsCQkiXDAzM1sxNTBxIn0sCiAgICB7S19QQUdFRE9XTiwJIlwwMzNbMTU0cSJ9LAojIGVuZGlmCgojIGlmIGRlZmluZWQoREVCVUcpIHx8IGRlZmluZWQoQUxMX0JVSUxUSU5fVENBUFMpCi8qCiAqIGZvciBkZWJ1Z2dpbmcKICovCiAgICB7KGludClLU19OQU1FLAkiZGVidWcifSwKICAgIHsoaW50KUtTX0NFLAkiW0NFXSJ9LAogICAgeyhpbnQpS1NfQ0QsCSJbQ0RdIn0sCiAgICB7KGludClLU19BTCwJIltBTF0ifSwKIyAgaWZkZWYgVEVSTUlORk8KICAgIHsoaW50KUtTX0NBTCwJIltDQUwlcDElZF0ifSwKIyAgZWxzZQogICAgeyhpbnQpS1NfQ0FMLAkiW0NBTCVkXSJ9LAojICBlbmRpZgogICAgeyhpbnQpS1NfREwsCSJbRExdIn0sCiMgIGlmZGVmIFRFUk1JTkZPCiAgICB7KGludClLU19DREwsCSJbQ0RMJXAxJWRdIn0sCiMgIGVsc2UKICAgIHsoaW50KUtTX0NETCwJIltDREwlZF0ifSwKIyAgZW5kaWYKIyAgaWZkZWYgVEVSTUlORk8KICAgIHsoaW50KUtTX0NTLAkiWyVwMSVkQ1MlcDIlZF0ifSwKIyAgZWxzZQogICAgeyhpbnQpS1NfQ1MsCSJbJWRDUyVkXSJ9LAojICBlbmRpZgojICBpZmRlZiBGRUFUX1ZFUlRTUExJVAojICAgaWZkZWYgVEVSTUlORk8KICAgIHsoaW50KUtTX0NTViwJIlslcDElZENTViVwMiVkXSJ9LAojICAgZWxzZQogICAgeyhpbnQpS1NfQ1NWLAkiWyVkQ1NWJWRdIn0sCiMgICBlbmRpZgojICBlbmRpZgojICBpZmRlZiBURVJNSU5GTwogICAgeyhpbnQpS1NfQ0FCLAkiW0NBQiVwMSVkXSJ9LAogICAgeyhpbnQpS1NfQ0FGLAkiW0NBRiVwMSVkXSJ9LAogICAgeyhpbnQpS1NfQ1NCLAkiW0NTQiVwMSVkXSJ9LAogICAgeyhpbnQpS1NfQ1NGLAkiW0NTRiVwMSVkXSJ9LAojICBlbHNlCiAgICB7KGludClLU19DQUIsCSJbQ0FCJWRdIn0sCiAgICB7KGludClLU19DQUYsCSJbQ0FGJWRdIn0sCiAgICB7KGludClLU19DU0IsCSJbQ1NCJWRdIn0sCiAgICB7KGludClLU19DU0YsCSJbQ1NGJWRdIn0sCiMgIGVuZGlmCiAgICB7KGludClLU19PUCwJIltPUF0ifSwKICAgIHsoaW50KUtTX0xFLAkiW0xFXSJ9LAogICAgeyhpbnQpS1NfQ0wsCSJbQ0xdIn0sCiAgICB7KGludClLU19WSSwJIltWSV0ifSwKICAgIHsoaW50KUtTX1ZFLAkiW1ZFXSJ9LAogICAgeyhpbnQpS1NfVlMsCSJbVlNdIn0sCiAgICB7KGludClLU19NRSwJIltNRV0ifSwKICAgIHsoaW50KUtTX01SLAkiW01SXSJ9LAogICAgeyhpbnQpS1NfTUIsCSJbTUJdIn0sCiAgICB7KGludClLU19NRCwJIltNRF0ifSwKICAgIHsoaW50KUtTX1NFLAkiW1NFXSJ9LAogICAgeyhpbnQpS1NfU08sCSJbU09dIn0sCiAgICB7KGludClLU19VRSwJIltVRV0ifSwKICAgIHsoaW50KUtTX1VTLAkiW1VTXSJ9LAogICAgeyhpbnQpS1NfTVMsCSJbTVNdIn0sCiAgICB7KGludClLU19VVCwJIltVVF0ifSwKIyAgaWZkZWYgVEVSTUlORk8KICAgIHsoaW50KUtTX0NNLAkiWyVwMSVkQ00lcDIlZF0ifSwKIyAgZWxzZQogICAgeyhpbnQpS1NfQ00sCSJbJWRDTSVkXSJ9LAojICBlbmRpZgogICAgeyhpbnQpS1NfU1IsCSJbU1JdIn0sCiMgIGlmZGVmIFRFUk1JTkZPCiAgICB7KGludClLU19DUkksCSJbQ1JJJXAxJWRdIn0sCiMgIGVsc2UKICAgIHsoaW50KUtTX0NSSSwJIltDUkklZF0ifSwKIyAgZW5kaWYKICAgIHsoaW50KUtTX1ZCLAkiW1ZCXSJ9LAogICAgeyhpbnQpS1NfS1MsCSJbS1NdIn0sCiAgICB7KGludClLU19LRSwJIltLRV0ifSwKICAgIHsoaW50KUtTX1RJLAkiW1RJXSJ9LAogICAgeyhpbnQpS1NfVEUsCSJbVEVdIn0sCiAgICB7KGludClLU19DSVMsCSJbQ0lTXSJ9LAogICAgeyhpbnQpS1NfQ0lFLAkiW0NJRV0ifSwKICAgIHsoaW50KUtTX1RTLAkiW1RTXSJ9LAogICAgeyhpbnQpS1NfRlMsCSJbRlNdIn0sCiMgIGlmZGVmIFRFUk1JTkZPCiAgICB7KGludClLU19DV1MsCSJbJXAxJWRDV1MlcDIlZF0ifSwKICAgIHsoaW50KUtTX0NXUCwJIlslcDElZENXUCVwMiVkXSJ9LAojICBlbHNlCiAgICB7KGludClLU19DV1MsCSJbJWRDV1MlZF0ifSwKICAgIHsoaW50KUtTX0NXUCwJIlslZENXUCVkXSJ9LAojICBlbmRpZgogICAgeyhpbnQpS1NfQ1JWLAkiW0NSVl0ifSwKICAgIHtLX1VQLAkJIltLVV0ifSwKICAgIHtLX0RPV04sCQkiW0tEXSJ9LAogICAge0tfTEVGVCwJCSJbS0xdIn0sCiAgICB7S19SSUdIVCwJCSJbS1JdIn0sCiAgICB7S19TX1VQLAkJIltTLUtVXSJ9LAogICAge0tfU19ET1dOLAkJIltTLUtEXSJ9LAogICAge0tfU19MRUZULAkJIltTLUtMXSJ9LAogICAge0tfQ19MRUZULAkJIltDLUtMXSJ9LAogICAge0tfU19SSUdIVCwJCSJbUy1LUl0ifSwKICAgIHtLX0NfUklHSFQsCQkiW0MtS1JdIn0sCiAgICB7S19GMSwJCSJbRjFdIn0sCiAgICB7S19YRjEsCQkiW3hGMV0ifSwKICAgIHtLX0YyLAkJIltGMl0ifSwKICAgIHtLX1hGMiwJCSJbeEYyXSJ9LAogICAge0tfRjMsCQkiW0YzXSJ9LAogICAge0tfWEYzLAkJIlt4RjNdIn0sCiAgICB7S19GNCwJCSJbRjRdIn0sCiAgICB7S19YRjQsCQkiW3hGNF0ifSwKICAgIHtLX0Y1LAkJIltGNV0ifSwKICAgIHtLX0Y2LAkJIltGNl0ifSwKICAgIHtLX0Y3LAkJIltGN10ifSwKICAgIHtLX0Y4LAkJIltGOF0ifSwKICAgIHtLX0Y5LAkJIltGOV0ifSwKICAgIHtLX0YxMCwJCSJbRjEwXSJ9LAogICAge0tfRjExLAkJIltGMTFdIn0sCiAgICB7S19GMTIsCQkiW0YxMl0ifSwKICAgIHtLX1NfRjEsCQkiW1MtRjFdIn0sCiAgICB7S19TX1hGMSwJCSJbUy14RjFdIn0sCiAgICB7S19TX0YyLAkJIltTLUYyXSJ9LAogICAge0tfU19YRjIsCQkiW1MteEYyXSJ9LAogICAge0tfU19GMywJCSJbUy1GM10ifSwKICAgIHtLX1NfWEYzLAkJIltTLXhGM10ifSwKICAgIHtLX1NfRjQsCQkiW1MtRjRdIn0sCiAgICB7S19TX1hGNCwJCSJbUy14RjRdIn0sCiAgICB7S19TX0Y1LAkJIltTLUY1XSJ9LAogICAge0tfU19GNiwJCSJbUy1GNl0ifSwKICAgIHtLX1NfRjcsCQkiW1MtRjddIn0sCiAgICB7S19TX0Y4LAkJIltTLUY4XSJ9LAogICAge0tfU19GOSwJCSJbUy1GOV0ifSwKICAgIHtLX1NfRjEwLAkJIltTLUYxMF0ifSwKICAgIHtLX1NfRjExLAkJIltTLUYxMV0ifSwKICAgIHtLX1NfRjEyLAkJIltTLUYxMl0ifSwKICAgIHtLX0hFTFAsCQkiW0hFTFBdIn0sCiAgICB7S19VTkRPLAkJIltVTkRPXSJ9LAogICAge0tfQlMsCQkiW0JTXSJ9LAogICAge0tfSU5TLAkJIltJTlNdIn0sCiAgICB7S19LSU5TLAkJIltLSU5TXSJ9LAogICAge0tfREVMLAkJIltERUxdIn0sCiAgICB7S19LREVMLAkJIltLREVMXSJ9LAogICAge0tfSE9NRSwJCSJbSE9NRV0ifSwKICAgIHtLX1NfSE9NRSwJCSJbQy1IT01FXSJ9LAogICAge0tfQ19IT01FLAkJIltDLUhPTUVdIn0sCiAgICB7S19LSE9NRSwJCSJbS0hPTUVdIn0sCiAgICB7S19YSE9NRSwJCSJbWEhPTUVdIn0sCiAgICB7S19FTkQsCQkiW0VORF0ifSwKICAgIHtLX1NfRU5ELAkJIltDLUVORF0ifSwKICAgIHtLX0NfRU5ELAkJIltDLUVORF0ifSwKICAgIHtLX0tFTkQsCQkiW0tFTkRdIn0sCiAgICB7S19YRU5ELAkJIltYRU5EXSJ9LAogICAge0tfUEFHRVVQLAkJIltQQUdFVVBdIn0sCiAgICB7S19QQUdFRE9XTiwJIltQQUdFRE9XTl0ifSwKICAgIHtLX0tQQUdFVVAsCQkiW0tQQUdFVVBdIn0sCiAgICB7S19LUEFHRURPV04sCSJbS1BBR0VET1dOXSJ9LAogICAge0tfTU9VU0UsCQkiW01PVVNFXSJ9LAogICAge0tfS1BMVVMsCQkiW0tQTFVTXSJ9LAogICAge0tfS01JTlVTLAkJIltLTUlOVVNdIn0sCiAgICB7S19LRElWSURFLAkJIltLRElWSURFXSJ9LAogICAge0tfS01VTFRJUExZLAkiW0tNVUxUSVBMWV0ifSwKICAgIHtLX0tFTlRFUiwJCSJbS0VOVEVSXSJ9LAogICAge0tfS1BPSU5ULAkJIltLUE9JTlRdIn0sCiAgICB7S19LMCwJCSJbSzBdIn0sCiAgICB7S19LMSwJCSJbSzFdIn0sCiAgICB7S19LMiwJCSJbSzJdIn0sCiAgICB7S19LMywJCSJbSzNdIn0sCiAgICB7S19LNCwJCSJbSzRdIn0sCiAgICB7S19LNSwJCSJbSzVdIn0sCiAgICB7S19LNiwJCSJbSzZdIn0sCiAgICB7S19LNywJCSJbSzddIn0sCiAgICB7S19LOCwJCSJbSzhdIn0sCiAgICB7S19LOSwJCSJbSzldIn0sCiMgZW5kaWYKCiNlbmRpZiAvKiBOT19CVUlMVElOX1RDQVBTICovCgovKgogKiBUaGUgbW9zdCBtaW5pbWFsIHRlcm1pbmFsOiBvbmx5IGNsZWFyIHNjcmVlbiBhbmQgY3Vyc29yIHBvc2l0aW9uaW5nCiAqIEFsd2F5cyBpbmNsdWRlZC4KICovCiAgICB7KGludClLU19OQU1FLAkiZHVtYiJ9LAogICAgeyhpbnQpS1NfQ0wsCSJcMDE0In0sCiNpZmRlZiBURVJNSU5GTwogICAgeyhpbnQpS1NfQ00sCUlGX0VCKCJcMDMzWyVpJXAxJWQ7JXAyJWRIIiwKCQkJCQkJICBFU0NfU1RSICJbJWklcDElZDslcDIlZEgiKX0sCiNlbHNlCiAgICB7KGludClLU19DTSwJSUZfRUIoIlwwMzNbJWklZDslZEgiLCBFU0NfU1RSICJbJWklZDslZEgiKX0sCiNlbmRpZgoKLyoKICogZW5kIG1hcmtlcgogKi8KICAgIHsoaW50KUtTX05BTUUsCU5VTEx9Cgp9OwkvKiBlbmQgb2YgYnVpbHRpbl90ZXJtY2FwcyAqLwoKLyoKICogREVGQVVMVF9URVJNIGlzIHVzZWQsIHdoZW4gbm8gdGVybWluYWwgaXMgc3BlY2lmaWVkIHdpdGggLVQgb3B0aW9uIG9yICRURVJNLgogKi8KI2lmZGVmIFJJU0NPUwojIGRlZmluZSBERUZBVUxUX1RFUk0JKGNoYXJfdSAqKSJyaXNjb3MiCiNlbmRpZgoKI2lmZGVmIEFNSUdBCiMgZGVmaW5lIERFRkFVTFRfVEVSTQkoY2hhcl91ICopImFtaWdhIgojZW5kaWYKCiNpZmRlZiBNU1dJTgojIGRlZmluZSBERUZBVUxUX1RFUk0JKGNoYXJfdSAqKSJ3aW4zMiIKI2VuZGlmCgojaWZkZWYgTVNET1MKIyBkZWZpbmUgREVGQVVMVF9URVJNCShjaGFyX3UgKikicGN0ZXJtIgojZW5kaWYKCiNpZiBkZWZpbmVkKFVOSVgpICYmICFkZWZpbmVkKF9fTUlOVF9fKQojIGRlZmluZSBERUZBVUxUX1RFUk0JKGNoYXJfdSAqKSJhbnNpIgojZW5kaWYKCiNpZmRlZiBfX01JTlRfXwojIGRlZmluZSBERUZBVUxUX1RFUk0JKGNoYXJfdSAqKSJ2dDUyIgojZW5kaWYKCiNpZmRlZiBfX0VNWF9fCiMgZGVmaW5lIERFRkFVTFRfVEVSTQkoY2hhcl91ICopIm9zMmFuc2kiCiNlbmRpZgoKI2lmZGVmIFZNUwojIGRlZmluZSBERUZBVUxUX1RFUk0JKGNoYXJfdSAqKSJ2dDMyMCIKI2VuZGlmCgojaWZkZWYgX19CRU9TX18KIyB1bmRlZiBERUZBVUxUX1RFUk0KIyBkZWZpbmUgREVGQVVMVF9URVJNCShjaGFyX3UgKikiYmVvcy1hbnNpIgojZW5kaWYKCiNpZm5kZWYgREVGQVVMVF9URVJNCiMgZGVmaW5lIERFRkFVTFRfVEVSTQkoY2hhcl91ICopImR1bWIiCiNlbmRpZgoKLyoKICogVGVybV9zdHJpbmdzIGNvbnRhaW5zIGN1cnJlbnRseSB1c2VkIHRlcm1pbmFsIG91dHB1dCBzdHJpbmdzLgogKiBJdCBpcyBpbml0aWFsaXplZCB3aXRoIHRoZSBkZWZhdWx0IHZhbHVlcyBieSBwYXJzZV9idWlsdGluX3RjYXAoKS4KICogVGhlIHZhbHVlcyBjYW4gYmUgY2hhbmdlZCBieSBzZXR0aW5nIHRoZSBvcHRpb24gd2l0aCB0aGUgc2FtZSBuYW1lLgogKi8KY2hhcl91ICoodGVybV9zdHJpbmdzWyhpbnQpS1NfTEFTVCArIDFdKTsKCnN0YXRpYyBpbnQJbmVlZF9nYXRoZXIgPSBGQUxTRTsJCS8qIG5lZWQgdG8gZmlsbCB0ZXJtbGVhZGVyW10gKi8Kc3RhdGljIGNoYXJfdQl0ZXJtbGVhZGVyWzI1NiArIDFdOwkJLyogZm9yIGNoZWNrX3Rlcm1jb2RlKCkgKi8KI2lmZGVmIEZFQVRfVEVSTVJFU1BPTlNFCnN0YXRpYyBpbnQJY2hlY2tfZm9yX2NvZGVzID0gRkFMU0U7CS8qIGNoZWNrIGZvciBrZXkgY29kZSByZXBvbnNlICovCiNlbmRpZgoKICAgIHN0YXRpYyBzdHJ1Y3QgYnVpbHRpbl90ZXJtICoKZmluZF9idWlsdGluX3Rlcm0odGVybSkKICAgIGNoYXJfdQkqdGVybTsKewogICAgc3RydWN0IGJ1aWx0aW5fdGVybSAqcDsKCiAgICBwID0gYnVpbHRpbl90ZXJtY2FwczsKICAgIHdoaWxlIChwLT5idF9zdHJpbmcgIT0gTlVMTCkKICAgIHsKCWlmIChwLT5idF9lbnRyeSA9PSAoaW50KUtTX05BTUUpCgl7CiNpZmRlZiBVTklYCgkgICAgaWYgKFNUUkNNUChwLT5idF9zdHJpbmcsICJpcmlzLWFuc2kiKSA9PSAwICYmIHZpbV9pc19pcmlzKHRlcm0pKQoJCXJldHVybiBwOwoJICAgIGVsc2UgaWYgKFNUUkNNUChwLT5idF9zdHJpbmcsICJ4dGVybSIpID09IDAgJiYgdmltX2lzX3h0ZXJtKHRlcm0pKQoJCXJldHVybiBwOwoJICAgIGVsc2UKI2VuZGlmCiNpZmRlZiBWTVMKCQlpZiAoU1RSQ01QKHAtPmJ0X3N0cmluZywgInZ0MzIwIikgPT0gMCAmJiB2aW1faXNfdnQzMDAodGVybSkpCgkJICAgIHJldHVybiBwOwoJCWVsc2UKI2VuZGlmCgkJICBpZiAoU1RSQ01QKHRlcm0sIHAtPmJ0X3N0cmluZykgPT0gMCkKCQkgICAgcmV0dXJuIHA7Cgl9CgkrK3A7CiAgICB9CiAgICByZXR1cm4gcDsKfQoKLyoKICogUGFyc2luZyBvZiB0aGUgYnVpbHRpbiB0ZXJtY2FwIGVudHJpZXMuCiAqIENhbGxlciBzaG91bGQgY2hlY2sgaWYgJ25hbWUnIGlzIGEgdmFsaWQgYnVpbHRpbiB0ZXJtLgogKiBUaGUgdGVybWluYWwncyBuYW1lIGlzIG5vdCBzZXQsIGFzIHRoaXMgaXMgYWxyZWFkeSBkb25lIGluIHRlcm1jYXBpbml0KCkuCiAqLwogICAgc3RhdGljIHZvaWQKcGFyc2VfYnVpbHRpbl90Y2FwKHRlcm0pCiAgICBjaGFyX3UgICp0ZXJtOwp7CiAgICBzdHJ1Y3QgYnVpbHRpbl90ZXJtCSAgICAqcDsKICAgIGNoYXJfdQkJICAgIG5hbWVbMl07CiAgICBpbnQJCQkgICAgdGVybV84Yml0OwoKICAgIHAgPSBmaW5kX2J1aWx0aW5fdGVybSh0ZXJtKTsKICAgIHRlcm1fOGJpdCA9IHRlcm1faXNfOGJpdCh0ZXJtKTsKCiAgICAvKiBEbyBub3QgcGFyc2UgaWYgYnVpbHRpbiB0ZXJtIG5vdCBmb3VuZCAqLwogICAgaWYgKHAtPmJ0X3N0cmluZyA9PSBOVUxMKQoJcmV0dXJuOwoKICAgIGZvciAoKytwOyBwLT5idF9lbnRyeSAhPSAoaW50KUtTX05BTUUgJiYgcC0+YnRfZW50cnkgIT0gQlRfRVhUUkFfS0VZUzsgKytwKQogICAgewoJaWYgKChpbnQpcC0+YnRfZW50cnkgPj0gMCkJLyogS1NfeHggZW50cnkgKi8KCXsKCSAgICAvKiBPbmx5IHNldCB0aGUgdmFsdWUgaWYgaXQgd2Fzbid0IHNldCB5ZXQuICovCgkgICAgaWYgKHRlcm1fc3RyaW5nc1twLT5idF9lbnRyeV0gPT0gTlVMTAoJCQkJIHx8IHRlcm1fc3RyaW5nc1twLT5idF9lbnRyeV0gPT0gZW1wdHlfb3B0aW9uKQoJICAgIHsKCQkvKiA4Yml0IHRlcm1pbmFsOiB1c2UgQ1NJIGluc3RlYWQgb2YgPEVzYz5bICovCgkJaWYgKHRlcm1fOGJpdCAmJiB0ZXJtXzd0bzhiaXQoKGNoYXJfdSAqKXAtPmJ0X3N0cmluZykgIT0gMCkKCQl7CgkJICAgIGNoYXJfdSAgKnMsICp0OwoKCQkgICAgcyA9IHZpbV9zdHJzYXZlKChjaGFyX3UgKilwLT5idF9zdHJpbmcpOwoJCSAgICBpZiAocyAhPSBOVUxMKQoJCSAgICB7CgkJCWZvciAodCA9IHM7ICp0OyArK3QpCgkJCSAgICBpZiAodGVybV83dG84Yml0KHQpKQoJCQkgICAgewoJCQkJKnQgPSB0ZXJtXzd0bzhiaXQodCk7CgkJCQlTVFJDUFkodCArIDEsIHQgKyAyKTsKCQkJICAgIH0KCQkJdGVybV9zdHJpbmdzW3AtPmJ0X2VudHJ5XSA9IHM7CgkJCXNldF90ZXJtX29wdGlvbl9hbGxvY2VkKCZ0ZXJtX3N0cmluZ3NbcC0+YnRfZW50cnldKTsKCQkgICAgfQoJCX0KCQllbHNlCgkJICAgIHRlcm1fc3RyaW5nc1twLT5idF9lbnRyeV0gPSAoY2hhcl91ICopcC0+YnRfc3RyaW5nOwoJICAgIH0KCX0KCWVsc2UKCXsKCSAgICBuYW1lWzBdID0gS0VZMlRFUk1DQVAwKChpbnQpcC0+YnRfZW50cnkpOwoJICAgIG5hbWVbMV0gPSBLRVkyVEVSTUNBUDEoKGludClwLT5idF9lbnRyeSk7CgkgICAgaWYgKGZpbmRfdGVybWNvZGUobmFtZSkgPT0gTlVMTCkKCQlhZGRfdGVybWNvZGUobmFtZSwgKGNoYXJfdSAqKXAtPmJ0X3N0cmluZywgdGVybV84Yml0KTsKCX0KICAgIH0KfQojaWYgZGVmaW5lZChIQVZFX1RHRVRFTlQpIHx8IGRlZmluZWQoRkVBVF9URVJNUkVTUE9OU0UpCnN0YXRpYyB2b2lkIHNldF9jb2xvcl9jb3VudCBfX0FSR1MoKGludCBucikpOwoKLyoKICogU2V0IG51bWJlciBvZiBjb2xvcnMuCiAqIFN0b3JlIGl0IGFzIGEgbnVtYmVyIGluIHRfY29sb3JzLgogKiBTdG9yZSBpdCBhcyBhIHN0cmluZyBpbiBUX0NDTyAodXNpbmcgbnJfY29sb3JzW10pLgogKi8KICAgIHN0YXRpYyB2b2lkCnNldF9jb2xvcl9jb3VudChucikKICAgIGludAkJbnI7CnsKICAgIGNoYXJfdQlucl9jb2xvcnNbMjBdOwkJLyogc3RyaW5nIGZvciBudW1iZXIgb2YgY29sb3JzICovCgogICAgdF9jb2xvcnMgPSBucjsKICAgIGlmICh0X2NvbG9ycyA+IDEpCglzcHJpbnRmKChjaGFyICopbnJfY29sb3JzLCAiJWQiLCB0X2NvbG9ycyk7CiAgICBlbHNlCgkqbnJfY29sb3JzID0gTlVMOwogICAgc2V0X3N0cmluZ19vcHRpb25fZGlyZWN0KChjaGFyX3UgKikidF9DbyIsIC0xLCBucl9jb2xvcnMsIE9QVF9GUkVFKTsKfQojZW5kaWYKCiNpZmRlZiBIQVZFX1RHRVRFTlQKc3RhdGljIGNoYXIgKihrZXlfbmFtZXNbXSkgPQp7CiNpZmRlZiBGRUFUX1RFUk1SRVNQT05TRQogICAgLyogRG8gdGhpcyBvbmUgZmlyc3QsIGl0IG1heSBjYXVzZSBhIHNjcmVlbiByZWRyYXcuICovCiAgICAiQ28iLAojZW5kaWYKICAgICJrdSIsICJrZCIsICJrciIsICJrbCIsCiMgaWZkZWYgQVJDSElFCiAgICAic3UiLCAic2QiLAkJLyogVGVybWNhcCBjb2RlIG1hZGUgdXAhICovCiMgZW5kaWYKICAgICIjMiIsICIjNCIsICIlaSIsICIqNyIsCiAgICAiazEiLCAiazIiLCAiazMiLCAiazQiLCAiazUiLCAiazYiLAogICAgIms3IiwgIms4IiwgIms5IiwgIms7IiwgIkYxIiwgIkYyIiwKICAgICIlMSIsICImOCIsICJrYiIsICJrSSIsICJrRCIsICJraCIsCiAgICAiQDciLCAia1AiLCAia04iLCAiSzEiLCAiSzMiLCAiSzQiLCAiSzUiLCAia0IiLAogICAgTlVMTAp9OwojZW5kaWYKCi8qCiAqIFNldCB0ZXJtaW5hbCBvcHRpb25zIGZvciB0ZXJtaW5hbCAidGVybSIuCiAqIFJldHVybiBPSyBpZiB0ZXJtaW5hbCAndGVybScgd2FzIGZvdW5kIGluIGEgdGVybWNhcCwgRkFJTCBvdGhlcndpc2UuCiAqCiAqIFdoaWxlIGRvaW5nIHRoaXMsIHVudGlsIHR0ZXN0KCksIHNvbWUgb3B0aW9ucyBtYXkgYmUgTlVMTCwgYmUgY2FyZWZ1bC4KICovCiAgICBpbnQKc2V0X3Rlcm1uYW1lKHRlcm0pCiAgICBjaGFyX3UgKnRlcm07CnsKICAgIHN0cnVjdCBidWlsdGluX3Rlcm0gKnRlcm1wOwojaWZkZWYgSEFWRV9UR0VURU5UCiAgICBpbnQJCWJ1aWx0aW5fZmlyc3QgPSBwX3RiaTsKICAgIGludAkJdHJ5OwogICAgaW50CQl0ZXJtY2FwX2NsZWFyZWQgPSBGQUxTRTsKI2VuZGlmCiAgICBpbnQJCXdpZHRoID0gMCwgaGVpZ2h0ID0gMDsKICAgIGNoYXJfdQkqZXJyb3JfbXNnID0gTlVMTDsKICAgIGNoYXJfdQkqYnNfcCwgKmRlbF9wOwoKICAgIGRldGVjdGVkXzhiaXQgPSBGQUxTRTsJCS8qIHJlc2V0IDgtYml0IGRldGVjdGlvbiAqLwoKICAgIGlmICh0ZXJtX2lzX2J1aWx0aW4odGVybSkpCiAgICB7Cgl0ZXJtICs9IDg7CiNpZmRlZiBIQVZFX1RHRVRFTlQKCWJ1aWx0aW5fZmlyc3QgPSAxOwojZW5kaWYKICAgIH0KCi8qCiAqIElmIEhBVkVfVEdFVEVOVCBpcyBub3QgZGVmaW5lZCwgb25seSB0aGUgYnVpbHRpbiB0ZXJtY2FwIGlzIHVzZWQsIG90aGVyd2lzZToKICogICBJZiBidWlsdGluX2ZpcnN0IGlzIFRSVUU6CiAqICAgICAwLiB0cnkgYnVpbHRpbiB0ZXJtY2FwCiAqICAgICAxLiB0cnkgZXh0ZXJuYWwgdGVybWNhcAogKiAgICAgMi4gaWYgYm90aCBmYWlsIGRlZmF1bHQgdG8gYSBidWlsdGluIHRlcm1pbmFsCiAqICAgSWYgYnVpbHRpbl9maXJzdCBpcyBGQUxTRToKICogICAgIDEuIHRyeSBleHRlcm5hbCB0ZXJtY2FwCiAqICAgICAyLiB0cnkgYnVpbHRpbiB0ZXJtY2FwLCBpZiBib3RoIGZhaWwgZGVmYXVsdCB0byBhIGJ1aWx0aW4gdGVybWluYWwKICovCiNpZmRlZiBIQVZFX1RHRVRFTlQKICAgIGZvciAodHJ5ID0gYnVpbHRpbl9maXJzdCA/IDAgOiAxOyB0cnkgPCAzOyArK3RyeSkKICAgIHsKCS8qCgkgKiBVc2UgZXh0ZXJuYWwgdGVybWNhcAoJICovCglpZiAodHJ5ID09IDEpCgl7CgkgICAgY2hhcl91CSAgICAqcDsKCSAgICBzdGF0aWMgY2hhcl91ICAgdHN0cmJ1ZltUQlVGU1pdOwoJICAgIGludAkJICAgIGk7CgkgICAgY2hhcl91CSAgICB0YnVmW1RCVUZTWl07CgkgICAgY2hhcl91CSAgICAqdHA7CgkgICAgc3RhdGljIHN0cnVjdCB7CgkJCSAgICBlbnVtIFNwZWNpYWxLZXkgZGVzdDsgLyogaW5kZXggaW4gdGVybV9zdHJpbmdzW10gKi8KCQkJICAgIGNoYXIgKm5hbWU7CQkgIC8qIHRlcm1jYXAgbmFtZSBmb3Igc3RyaW5nICovCgkJCSAgfSBzdHJpbmdfbmFtZXNbXSA9CgkJCSAgICB7CXtLU19DRSwgImNlIn0sIHtLU19BTCwgImFsIn0sIHtLU19DQUwsIkFMIn0sCgkJCQl7S1NfREwsICJkbCJ9LCB7S1NfQ0RMLCJETCJ9LCB7S1NfQ1MsICJjcyJ9LAoJCQkJe0tTX0NMLCAiY2wifSwge0tTX0NELCAiY2QifSwKCQkJCXtLU19WSSwgInZpIn0sIHtLU19WRSwgInZlIn0sIHtLU19NQiwgIm1iIn0sCgkJCQl7S1NfVlMsICJ2cyJ9LCB7S1NfTUUsICJtZSJ9LCB7S1NfTVIsICJtciJ9LAoJCQkJe0tTX01ELCAibWQifSwge0tTX1NFLCAic2UifSwge0tTX1NPLCAic28ifSwKCQkJCXtLU19DWkgsIlpIIn0sIHtLU19DWlIsIlpSIn0sIHtLU19VRSwgInVlIn0sCgkJCQl7S1NfVVMsICJ1cyJ9LCB7S1NfQ00sICJjbSJ9LCB7S1NfU1IsICJzciJ9LAoJCQkJe0tTX0NSSSwiUkkifSwge0tTX1ZCLCAidmIifSwge0tTX0tTLCAia3MifSwKCQkJCXtLU19LRSwgImtlIn0sIHtLU19USSwgInRpIn0sIHtLU19URSwgInRlIn0sCgkJCQl7S1NfQkMsICJiYyJ9LCB7S1NfQ1NCLCJTYiJ9LCB7S1NfQ1NGLCJTZiJ9LAoJCQkJe0tTX0NBQiwiQUIifSwge0tTX0NBRiwiQUYifSwge0tTX0xFLCAibGUifSwKCQkJCXtLU19ORCwgIm5kIn0sIHtLU19PUCwgIm9wIn0sIHtLU19DUlYsICJSViJ9LAoJCQkJe0tTX0NJUywgIklTIn0sIHtLU19DSUUsICJJRSJ9LAoJCQkJe0tTX1RTLCAidHMifSwge0tTX0ZTLCAiZnMifSwKCQkJCXtLU19DV1AsICJXUCJ9LCB7S1NfQ1dTLCAiV1MifSwKCQkJCXtLU19DU0ksICJTSSJ9LCB7S1NfQ0VJLCAiRUkifSwKCQkJCXsoZW51bSBTcGVjaWFsS2V5KTAsIE5VTEx9CgkJCSAgICB9OwoKCSAgICAvKgoJICAgICAqIElmIHRoZSBleHRlcm5hbCB0ZXJtY2FwIGRvZXMgbm90IGhhdmUgYSBtYXRjaGluZyBlbnRyeSwgdHJ5IHRoZQoJICAgICAqIGJ1aWx0aW4gb25lcy4KCSAgICAgKi8KCSAgICBpZiAoKGVycm9yX21zZyA9IHRnZXRlbnRfZXJyb3IodGJ1ZiwgdGVybSkpID09IE5VTEwpCgkgICAgewoJCXRwID0gdHN0cmJ1ZjsKCQlpZiAoIXRlcm1jYXBfY2xlYXJlZCkKCQl7CgkJICAgIGNsZWFyX3Rlcm1vcHRpb25zKCk7CS8qIGNsZWFyIG9sZCBvcHRpb25zICovCgkJICAgIHRlcm1jYXBfY2xlYXJlZCA9IFRSVUU7CgkJfQoKCSAgICAvKiBnZXQgb3V0cHV0IHN0cmluZ3MgKi8KCQlmb3IgKGkgPSAwOyBzdHJpbmdfbmFtZXNbaV0ubmFtZSAhPSBOVUxMOyArK2kpCgkJewoJCSAgICBpZiAodGVybV9zdHIoc3RyaW5nX25hbWVzW2ldLmRlc3QpID09IE5VTEwKCQkJICAgIHx8IHRlcm1fc3RyKHN0cmluZ19uYW1lc1tpXS5kZXN0KSA9PSBlbXB0eV9vcHRpb24pCgkJCXRlcm1fc3RyKHN0cmluZ19uYW1lc1tpXS5kZXN0KSA9CgkJCQkJICAgVEdFVFNUUihzdHJpbmdfbmFtZXNbaV0ubmFtZSwgJnRwKTsKCQl9CgoJCS8qIHRnZXRmbGFnKCkgcmV0dXJucyAxIGlmIHRoZSBmbGFnIGlzIHByZXNlbnQsIDAgaWYgbm90IGFuZAoJCSAqIHBvc3NpYmx5IC0xIGlmIHRoZSBmbGFnIGRvZXNuJ3QgZXhpc3QuICovCgkJaWYgKChUX01TID09IE5VTEwgfHwgVF9NUyA9PSBlbXB0eV9vcHRpb24pCgkJCQkJCQkmJiB0Z2V0ZmxhZygibXMiKSA+IDApCgkJICAgIFRfTVMgPSAoY2hhcl91ICopInkiOwoJCWlmICgoVF9YUyA9PSBOVUxMIHx8IFRfWFMgPT0gZW1wdHlfb3B0aW9uKQoJCQkJCQkJJiYgdGdldGZsYWcoInhzIikgPiAwKQoJCSAgICBUX1hTID0gKGNoYXJfdSAqKSJ5IjsKCQlpZiAoKFRfREIgPT0gTlVMTCB8fCBUX0RCID09IGVtcHR5X29wdGlvbikKCQkJCQkJCSYmIHRnZXRmbGFnKCJkYiIpID4gMCkKCQkgICAgVF9EQiA9IChjaGFyX3UgKikieSI7CgkJaWYgKChUX0RBID09IE5VTEwgfHwgVF9EQSA9PSBlbXB0eV9vcHRpb24pCgkJCQkJCQkmJiB0Z2V0ZmxhZygiZGEiKSA+IDApCgkJICAgIFRfREEgPSAoY2hhcl91ICopInkiOwoJCWlmICgoVF9VVCA9PSBOVUxMIHx8IFRfVVQgPT0gZW1wdHlfb3B0aW9uKQoJCQkJCQkJJiYgdGdldGZsYWcoInV0IikgPiAwKQoJCSAgICBUX1VUID0gKGNoYXJfdSAqKSJ5IjsKCgoJCS8qCgkJICogZ2V0IGtleSBjb2RlcwoJCSAqLwoJCWZvciAoaSA9IDA7IGtleV9uYW1lc1tpXSAhPSBOVUxMOyArK2kpCgkJewoJCSAgICBpZiAoZmluZF90ZXJtY29kZSgoY2hhcl91ICopa2V5X25hbWVzW2ldKSA9PSBOVUxMKQoJCSAgICB7CgkJCXAgPSBUR0VUU1RSKGtleV9uYW1lc1tpXSwgJnRwKTsKCQkJLyogaWYgY3Vyc29yLWxlZnQgPT0gYmFja3NwYWNlLCBpZ25vcmUgaXQgKHRlbGV2aWRlbwoJCQkgKiA5MjUpICovCgkJCWlmIChwICE9IE5VTEwKCQkJCSYmICgqcCAhPSBDdHJsX0gKCQkJCSAgICB8fCBrZXlfbmFtZXNbaV1bMF0gIT0gJ2snCgkJCQkgICAgfHwga2V5X25hbWVzW2ldWzFdICE9ICdsJykpCgkJCSAgICBhZGRfdGVybWNvZGUoKGNoYXJfdSAqKWtleV9uYW1lc1tpXSwgcCwgRkFMU0UpOwoJCSAgICB9CgkJfQoKCQlpZiAoaGVpZ2h0ID09IDApCgkJICAgIGhlaWdodCA9IHRnZXRudW0oImxpIik7CgkJaWYgKHdpZHRoID09IDApCgkJICAgIHdpZHRoID0gdGdldG51bSgiY28iKTsKCgkJLyoKCQkgKiBHZXQgbnVtYmVyIG9mIGNvbG9ycyAoaWYgbm90IGRvbmUgYWxyZWFkeSkuCgkJICovCgkJaWYgKHRlcm1fc3RyKEtTX0NDTykgPT0gTlVMTAoJCQl8fCB0ZXJtX3N0cihLU19DQ08pID09IGVtcHR5X29wdGlvbikKCQkgICAgc2V0X2NvbG9yX2NvdW50KHRnZXRudW0oIkNvIikpOwoKIyBpZm5kZWYgaHB1eAoJCUJDID0gKGNoYXIgKilUR0VUU1RSKCJiYyIsICZ0cCk7CgkJVVAgPSAoY2hhciAqKVRHRVRTVFIoInVwIiwgJnRwKTsKCQlwID0gVEdFVFNUUigicGMiLCAmdHApOwoJCWlmIChwKQoJCSAgICBQQyA9ICpwOwojIGVuZGlmIC8qIGhwdXggKi8KCSAgICB9Cgl9CgllbHNlCSAgICAvKiB0cnkgPT0gMCB8fCB0cnkgPT0gMiAqLwojZW5kaWYgLyogSEFWRV9UR0VURU5UICovCgkvKgoJICogVXNlIGJ1aWx0aW4gdGVybWNhcAoJICovCgl7CiNpZmRlZiBIQVZFX1RHRVRFTlQKCSAgICAvKgoJICAgICAqIElmIGJ1aWx0aW4gdGVybWNhcCB3YXMgYWxyZWFkeSB1c2VkLCB0aGVyZSBpcyBubyBuZWVkIHRvIHNlYXJjaAoJICAgICAqIGZvciB0aGUgYnVpbHRpbiB0ZXJtY2FwIGFnYWluLCBxdWl0IG5vdy4KCSAgICAgKi8KCSAgICBpZiAodHJ5ID09IDIgJiYgYnVpbHRpbl9maXJzdCAmJiB0ZXJtY2FwX2NsZWFyZWQpCgkJYnJlYWs7CiNlbmRpZgoJICAgIC8qCgkgICAgICogc2VhcmNoIGZvciAndGVybScgaW4gYnVpbHRpbl90ZXJtY2Fwc1tdCgkgICAgICovCgkgICAgdGVybXAgPSBmaW5kX2J1aWx0aW5fdGVybSh0ZXJtKTsKCSAgICBpZiAodGVybXAtPmJ0X3N0cmluZyA9PSBOVUxMKQkvKiBkaWQgbm90IGZpbmQgaXQgKi8KCSAgICB7CiNpZmRlZiBIQVZFX1RHRVRFTlQKCQkvKgoJCSAqIElmIHRyeSA9PSAwLCBmaXJzdCB0cnkgdGhlIGV4dGVybmFsIHRlcm1jYXAuIElmIHRoYXQgaXMgbm90CgkJICogZm91bmQgd2UnbGwgZ2V0IGJhY2sgaGVyZSB3aXRoIHRyeSA9PSAyLgoJCSAqIElmIHRlcm1jYXBfY2xlYXJlZCBpcyBzZXQgd2UgdXNlZCB0aGUgZXh0ZXJuYWwgdGVybWNhcCwKCQkgKiBkb24ndCBjb21wbGFpbiBhYm91dCBub3QgZmluZGluZyB0aGUgdGVybSBpbiB0aGUgYnVpbHRpbgoJCSAqIHRlcm1jYXAuCgkJICovCgkJaWYgKHRyeSA9PSAwKQkJCS8qIHRyeSBleHRlcm5hbCBvbmUgKi8KCQkgICAgY29udGludWU7CgkJaWYgKHRlcm1jYXBfY2xlYXJlZCkJCS8qIGZvdW5kIGluIGV4dGVybmFsIHRlcm1jYXAgKi8KCQkgICAgYnJlYWs7CiNlbmRpZgoKCQltY2hfZXJybXNnKCJcclxuIik7CgkJaWYgKGVycm9yX21zZyAhPSBOVUxMKQoJCXsKCQkgICAgbWNoX2Vycm1zZygoY2hhciAqKWVycm9yX21zZyk7CgkJICAgIG1jaF9lcnJtc2coIlxyXG4iKTsKCQl9CgkJbWNoX2Vycm1zZygiJyIpOwoJCW1jaF9lcnJtc2coKGNoYXIgKil0ZXJtKTsKCQltY2hfZXJybXNnKF8oIicgbm90IGtub3duLiBBdmFpbGFibGUgYnVpbHRpbiB0ZXJtaW5hbHMgYXJlOiIpKTsKCQltY2hfZXJybXNnKCJcclxuIik7CgkJZm9yICh0ZXJtcCA9ICYoYnVpbHRpbl90ZXJtY2Fwc1swXSk7IHRlcm1wLT5idF9zdHJpbmcgIT0gTlVMTDsKCQkJCQkJCQkgICAgICArK3Rlcm1wKQoJCXsKCQkgICAgaWYgKHRlcm1wLT5idF9lbnRyeSA9PSAoaW50KUtTX05BTUUpCgkJICAgIHsKI2lmZGVmIEhBVkVfVEdFVEVOVAoJCQltY2hfZXJybXNnKCIgICAgYnVpbHRpbl8iKTsKI2Vsc2UKCQkJbWNoX2Vycm1zZygiICAgICIpOwojZW5kaWYKCQkJbWNoX2Vycm1zZyh0ZXJtcC0+YnRfc3RyaW5nKTsKCQkJbWNoX2Vycm1zZygiXHJcbiIpOwoJCSAgICB9CgkJfQoJCS8qIHdoZW4gdXNlciB0eXBlZCA6c2V0IHRlcm09eHh4LCBxdWl0IGhlcmUgKi8KCQlpZiAoc3RhcnRpbmcgIT0gTk9fU0NSRUVOKQoJCXsKCQkgICAgc2NyZWVuX3N0YXJ0KCk7CS8qIGRvbid0IGtub3cgd2hlcmUgY3Vyc29yIGlzIG5vdyAqLwoJCSAgICB3YWl0X3JldHVybihUUlVFKTsKCQkgICAgcmV0dXJuIEZBSUw7CgkJfQoJCXRlcm0gPSBERUZBVUxUX1RFUk07CgkJbWNoX2Vycm1zZyhfKCJkZWZhdWx0aW5nIHRvICciKSk7CgkJbWNoX2Vycm1zZygoY2hhciAqKXRlcm0pOwoJCW1jaF9lcnJtc2coIidcclxuIik7CgkJaWYgKGVtc2dfc2lsZW50ID09IDApCgkJewoJCSAgICBzY3JlZW5fc3RhcnQoKTsJLyogZG9uJ3Qga25vdyB3aGVyZSBjdXJzb3IgaXMgbm93ICovCgkJICAgIG91dF9mbHVzaCgpOwoJCSAgICB1aV9kZWxheSgyMDAwTCwgVFJVRSk7CgkJfQoJCXNldF9zdHJpbmdfb3B0aW9uX2RpcmVjdCgoY2hhcl91ICopInRlcm0iLCAtMSwgdGVybSwgT1BUX0ZSRUUpOwoJCWRpc3BsYXlfZXJyb3JzKCk7CgkgICAgfQoJICAgIG91dF9mbHVzaCgpOwojaWZkZWYgSEFWRV9UR0VURU5UCgkgICAgaWYgKCF0ZXJtY2FwX2NsZWFyZWQpCgkgICAgewojZW5kaWYKCQljbGVhcl90ZXJtb3B0aW9ucygpOwkgICAgLyogY2xlYXIgb2xkIG9wdGlvbnMgKi8KI2lmZGVmIEhBVkVfVEdFVEVOVAoJCXRlcm1jYXBfY2xlYXJlZCA9IFRSVUU7CgkgICAgfQojZW5kaWYKCSAgICBwYXJzZV9idWlsdGluX3RjYXAodGVybSk7CiNpZmRlZiBGRUFUX0dVSQoJICAgIGlmICh0ZXJtX2lzX2d1aSh0ZXJtKSkKCSAgICB7CgkJb3V0X2ZsdXNoKCk7CgkJZ3VpX2luaXQoKTsKCQkvKiBJZiBzdGFydGluZyB0aGUgR1VJIGZhaWxlZCwgZG9uJ3QgZG8gYW55IG9mIHRoZSBvdGhlcgoJCSAqIHRoaW5ncyBmb3IgdGhpcyB0ZXJtaW5hbCAqLwoJCWlmICghZ3VpLmluX3VzZSkKCQkgICAgcmV0dXJuIEZBSUw7CiNpZmRlZiBIQVZFX1RHRVRFTlQKCQlicmVhazsJCS8qIGRvbid0IHRyeSB1c2luZyBleHRlcm5hbCB0ZXJtY2FwICovCiNlbmRpZgoJICAgIH0KI2VuZGlmIC8qIEZFQVRfR1VJICovCgl9CiNpZmRlZiBIQVZFX1RHRVRFTlQKICAgIH0KI2VuZGlmCgovKgogKiBzcGVjaWFsOiBUaGVyZSBpcyBubyBpbmZvIGluIHRoZSB0ZXJtY2FwIGFib3V0IHdoZXRoZXIgdGhlIGN1cnNvcgogKiBwb3NpdGlvbmluZyBpcyByZWxhdGl2ZSB0byB0aGUgc3RhcnQgb2YgdGhlIHNjcmVlbiBvciB0byB0aGUgc3RhcnQgb2YgdGhlCiAqIHNjcm9sbGluZyByZWdpb24uICBXZSBqdXN0IGd1ZXNzIGhlcmUuIE9ubHkgbXNkb3MgcGN0ZXJtIGlzIGtub3duIHRvIGRvIGl0CiAqIHJlbGF0aXZlLgogKi8KICAgIGlmIChTVFJDTVAodGVybSwgInBjdGVybSIpID09IDApCglUX0NDUyA9IChjaGFyX3UgKikieWVzIjsKICAgIGVsc2UKCVRfQ0NTID0gZW1wdHlfb3B0aW9uOwoKI2lmZGVmIFVOSVgKLyoKICogQW55ICJzdHR5IiBzZXR0aW5ncyBvdmVycmlkZSB0aGUgZGVmYXVsdCBmb3IgdF9rYiBmcm9tIHRoZSB0ZXJtY2FwLgogKiBUaGlzIGlzIGluIG9zX3VuaXguYywgYmVjYXVzZSBpdCBkZXBlbmRzIGEgbG90IG9uIHRoZSB2ZXJzaW9uIG9mIHVuaXggdGhhdAogKiBpcyBiZWluZyB1c2VkLgogKiBEb24ndCBkbyB0aGlzIHdoZW4gdGhlIEdVSSBpcyBhY3RpdmUsIGl0IHVzZXMgInRfa2IiIGFuZCAidF9rRCIgZGlyZWN0bHkuCiAqLwojaWZkZWYgRkVBVF9HVUkKICAgIGlmICghZ3VpLmluX3VzZSkKI2VuZGlmCglnZXRfc3R0eSgpOwojZW5kaWYKCi8qCiAqIElmIHRoZSB0ZXJtY2FwIGhhcyBubyBlbnRyeSBmb3IgJ2JzJyBhbmQvb3IgJ2RlbCcgYW5kIHRoZSBpb2N0bCgpIGFsc28KICogZGlkbid0IHdvcmssIHVzZSB0aGUgZGVmYXVsdCBDVFJMLUgKICogVGhlIGRlZmF1bHQgZm9yIHRfa0QgaXMgREVMLCB1bmxlc3MgdF9rYiBpcyBERUwuCiAqIFRoZSB2aW1fc3Ryc2F2ZSdkIHN0cmluZ3MgYXJlIHByb2JhYmx5IGxvc3QgZm9yZXZlciwgd2VsbCBpdCdzIG9ubHkgdHdvCiAqIGJ5dGVzLiAgRG9uJ3QgZG8gdGhpcyB3aGVuIHRoZSBHVUkgaXMgYWN0aXZlLCBpdCB1c2VzICJ0X2tiIiBhbmQgInRfa0QiCiAqIGRpcmVjdGx5LgogKi8KI2lmZGVmIEZFQVRfR1VJCiAgICBpZiAoIWd1aS5pbl91c2UpCiNlbmRpZgogICAgewoJYnNfcCA9IGZpbmRfdGVybWNvZGUoKGNoYXJfdSAqKSJrYiIpOwoJZGVsX3AgPSBmaW5kX3Rlcm1jb2RlKChjaGFyX3UgKikia0QiKTsKCWlmIChic19wID09IE5VTEwgfHwgKmJzX3AgPT0gTlVMKQoJICAgIGFkZF90ZXJtY29kZSgoY2hhcl91ICopImtiIiwgKGJzX3AgPSAoY2hhcl91ICopQ1RSTF9IX1NUUiksIEZBTFNFKTsKCWlmICgoZGVsX3AgPT0gTlVMTCB8fCAqZGVsX3AgPT0gTlVMKSAmJgoJCQkJCSAgICAoYnNfcCA9PSBOVUxMIHx8ICpic19wICE9IERFTCkpCgkgICAgYWRkX3Rlcm1jb2RlKChjaGFyX3UgKikia0QiLCAoY2hhcl91ICopREVMX1NUUiwgRkFMU0UpOwogICAgfQoKI2lmIGRlZmluZWQoVU5JWCkgfHwgZGVmaW5lZChWTVMpCiAgICB0ZXJtX2lzX3h0ZXJtID0gdmltX2lzX3h0ZXJtKHRlcm0pOwojZW5kaWYKCiNpZmRlZiBGRUFUX01PVVNFCiMgaWYgZGVmaW5lZChVTklYKSB8fCBkZWZpbmVkKFZNUykKIyAgaWZkZWYgRkVBVF9NT1VTRV9UVFkKICAgIC8qCiAgICAgKiBGb3IgVW5peCwgc2V0IHRoZSAndHR5bW91c2UnIG9wdGlvbiB0byB0aGUgdHlwZSBvZiBtb3VzZSB0byBiZSB1c2VkLgogICAgICogVGhlIHRlcm1jb2RlIGZvciB0aGUgbW91c2UgaXMgYWRkZWQgYXMgYSBzaWRlIGVmZmVjdCBpbiBvcHRpb24uYy4KICAgICAqLwogICAgewoJY2hhcl91CSpwOwoKCXAgPSAoY2hhcl91ICopIiI7CiMgIGlmZGVmIEZFQVRfTU9VU0VfWFRFUk0KIyAgIGlmZGVmIEZFQVRfQ0xJUEJPQVJECiMgICAgaWZkZWYgRkVBVF9HVUkKCWlmICghZ3VpLmluX3VzZSkKIyAgICBlbmRpZgoJICAgIGNsaXBfaW5pdChGQUxTRSk7CiMgICBlbmRpZgoJaWYgKHRlcm1faXNfeHRlcm0pCgl7CgkgICAgaWYgKHVzZV94dGVybV9tb3VzZSgpKQoJCXAgPSBOVUxMOwkvKiBrZWVwIGV4aXN0aW5nIHZhbHVlLCBtaWdodCBiZSAieHRlcm0yIiAqLwoJICAgIGVsc2UKCQlwID0gKGNoYXJfdSAqKSJ4dGVybSI7Cgl9CiMgIGVuZGlmCglpZiAocCAhPSBOVUxMKQoJICAgIHNldF9vcHRpb25fdmFsdWUoKGNoYXJfdSAqKSJ0dHltIiwgMEwsIHAsIDApOwoJaWYgKHAgPT0gTlVMTAojICAgaWZkZWYgRkVBVF9HVUkKCQl8fCBndWkuaW5fdXNlCiMgICBlbmRpZgoJCSkKCSAgICBjaGVja19tb3VzZV90ZXJtY29kZSgpOwkvKiBzZXQgbW91c2UgdGVybWNvZGUgYW55d2F5ICovCiAgICB9CiMgIGVuZGlmCiMgZWxzZQogICAgc2V0X21vdXNlX3Rlcm1jb2RlKEtTX01PVVNFLCAoY2hhcl91ICopIlwyMzNNIik7CiMgZW5kaWYKI2VuZGlmCS8qIEZFQVRfTU9VU0UgKi8KCiNpZmRlZiBGRUFUX1NOSUZGCiAgICB7CgljaGFyX3UJbmFtZVsyXTsKCgluYW1lWzBdID0gKGludClLU19FWFRSQTsKCW5hbWVbMV0gPSAoaW50KUtFX1NOSUZGOwoJYWRkX3Rlcm1jb2RlKG5hbWUsIChjaGFyX3UgKikiXDIzM3NuaWZmIiwgRkFMU0UpOwogICAgfQojZW5kaWYKCiNpZmRlZiBVU0VfVEVSTV9DT05TT0xFCiAgICAvKiBERUZBVUxUX1RFUk0gaW5kaWNhdGVzIHRoYXQgaXQgaXMgdGhlIG1hY2hpbmUgY29uc29sZS4gKi8KICAgIGlmIChTVFJDTVAodGVybSwgREVGQVVMVF9URVJNKSAhPSAwKQoJdGVybV9jb25zb2xlID0gRkFMU0U7CiAgICBlbHNlCiAgICB7Cgl0ZXJtX2NvbnNvbGUgPSBUUlVFOwojIGlmZGVmIEFNSUdBCgl3aW5fcmVzaXplX29uKCk7CS8qIGVuYWJsZSB3aW5kb3cgcmVzaXppbmcgcmVwb3J0cyAqLwojIGVuZGlmCiAgICB9CiNlbmRpZgoKI2lmIGRlZmluZWQoVU5JWCkgfHwgZGVmaW5lZChWTVMpCiAgICAvKgogICAgICogJ3R0eWZhc3QnIGlzIGRlZmF1bHQgb24gZm9yIHh0ZXJtLCBpcmlzLWFuc2kgYW5kIGEgZmV3IG90aGVycy4KICAgICAqLwogICAgaWYgKHZpbV9pc19mYXN0dGVybSh0ZXJtKSkKCXBfdGYgPSBUUlVFOwojZW5kaWYKI2lmZGVmIFVTRV9URVJNX0NPTlNPTEUKICAgIC8qCiAgICAgKiAndHR5ZmFzdCcgaXMgZGVmYXVsdCBvbiBjb25zb2xlcwogICAgICovCiAgICBpZiAodGVybV9jb25zb2xlKQoJcF90ZiA9IFRSVUU7CiNlbmRpZgoKICAgIHR0ZXN0KFRSVUUpOwkvKiBtYWtlIHN1cmUgd2UgaGF2ZSBhIHZhbGlkIHNldCBvZiB0ZXJtaW5hbCBjb2RlcyAqLwoKICAgIGZ1bGxfc2NyZWVuID0gVFJVRTsJCS8qIHdlIGNhbiB1c2UgdGVybWNhcCBjb2RlcyBmcm9tIG5vdyBvbiAqLwogICAgc2V0X3Rlcm1fZGVmYXVsdHMoKTsJLyogdXNlIGN1cnJlbnQgdmFsdWVzIGFzIGRlZmF1bHRzICovCiNpZmRlZiBGRUFUX1RFUk1SRVNQT05TRQogICAgY3J2X3N0YXR1cyA9IENSVl9HRVQ7CS8qIEdldCB0ZXJtaW5hbCB2ZXJzaW9uIGxhdGVyICovCiNlbmRpZgoKICAgIC8qCiAgICAgKiBJbml0aWFsaXplIHRoZSB0ZXJtaW5hbCB3aXRoIHRoZSBhcHByb3ByaWF0ZSB0ZXJtY2FwIGNvZGVzLgogICAgICogU2V0IHRoZSBtb3VzZSBhbmQgd2luZG93IHRpdGxlIGlmIHBvc3NpYmxlLgogICAgICogRG9uJ3QgZG8gdGhpcyB3aGVuIHN0YXJ0aW5nLCBuZWVkIHRvIHBhcnNlIHRoZSAudmltcmMgZmlyc3QsIGJlY2F1c2UgaXQKICAgICAqIG1heSByZWRlZmluZSB0X1RJIGV0Yy4KICAgICAqLwogICAgaWYgKHN0YXJ0aW5nICE9IE5PX1NDUkVFTikKICAgIHsKCXN0YXJ0dGVybWNhcCgpOwkJLyogbWF5IGNoYW5nZSB0ZXJtaW5hbCBtb2RlICovCiNpZmRlZiBGRUFUX01PVVNFCglzZXRtb3VzZSgpOwkJLyogbWF5IHN0YXJ0IHVzaW5nIHRoZSBtb3VzZSAqLwojZW5kaWYKI2lmZGVmIEZFQVRfVElUTEUKCW1ha2V0aXRsZSgpOwkJLyogbWF5IGRpc3BsYXkgd2luZG93IHRpdGxlICovCiNlbmRpZgogICAgfQoKCS8qIGRpc3BsYXkgaW5pdGlhbCBzY3JlZW4gYWZ0ZXIgdHRlc3QoKSBjaGVja2luZy4gancuICovCiAgICBpZiAod2lkdGggPD0gMCB8fCBoZWlnaHQgPD0gMCkKICAgIHsKCS8qIHRlcm1jYXAgZmFpbGVkIHRvIHJlcG9ydCBzaXplICovCgkvKiBzZXQgZGVmYXVsdHMsIGluIGNhc2UgdWlfZ2V0X3NoZWxsc2l6ZSgpIGFsc28gZmFpbHMgKi8KCXdpZHRoID0gODA7CiNpZiBkZWZpbmVkKE1TRE9TKSB8fCBkZWZpbmVkKFdJTjMyNjQpCgloZWlnaHQgPSAyNTsJICAgIC8qIGNvbnNvbGUgaXMgb2Z0ZW4gMjUgbGluZXMgKi8KI2Vsc2UKCWhlaWdodCA9IDI0OwkgICAgLyogbW9zdCB0ZXJtaW5hbHMgYXJlIDI0IGxpbmVzICovCiNlbmRpZgogICAgfQogICAgc2V0X3NoZWxsc2l6ZSh3aWR0aCwgaGVpZ2h0LCBGQUxTRSk7CS8qIG1heSBjaGFuZ2UgUm93cyAqLwogICAgaWYgKHN0YXJ0aW5nICE9IE5PX1NDUkVFTikKICAgIHsKCWlmIChzY3JvbGxfcmVnaW9uKQoJICAgIHNjcm9sbF9yZWdpb25fcmVzZXQoKTsJCS8qIEluIGNhc2UgUm93cyBjaGFuZ2VkICovCgljaGVja19tYXBfa2V5Y29kZXMoKTsJLyogY2hlY2sgbWFwcGluZ3MgZm9yIHRlcm1pbmFsIGNvZGVzIHVzZWQgKi8KCiNpZmRlZiBGRUFUX0FVVE9DTUQKCXsKCSAgICBidWZfVAkqb2xkX2N1cmJ1ZjsKCgkgICAgLyoKCSAgICAgKiBFeGVjdXRlIHRoZSBUZXJtQ2hhbmdlZCBhdXRvY29tbWFuZHMgZm9yIGVhY2ggYnVmZmVyIHRoYXQgaXMKCSAgICAgKiBsb2FkZWQuCgkgICAgICovCgkgICAgb2xkX2N1cmJ1ZiA9IGN1cmJ1ZjsKCSAgICBmb3IgKGN1cmJ1ZiA9IGZpcnN0YnVmOyBjdXJidWYgIT0gTlVMTDsgY3VyYnVmID0gY3VyYnVmLT5iX25leHQpCgkgICAgewoJCWlmIChjdXJidWYtPmJfbWwubWxfbWZwICE9IE5VTEwpCgkJICAgIGFwcGx5X2F1dG9jbWRzKEVWRU5UX1RFUk1DSEFOR0VELCBOVUxMLCBOVUxMLCBGQUxTRSwKCQkJCQkJCQkgICAgICBjdXJidWYpOwoJICAgIH0KCSAgICBpZiAoYnVmX3ZhbGlkKG9sZF9jdXJidWYpKQoJCWN1cmJ1ZiA9IG9sZF9jdXJidWY7Cgl9CiNlbmRpZgogICAgfQoKI2lmZGVmIEZFQVRfVEVSTVJFU1BPTlNFCiAgICBtYXlfcmVxX3Rlcm1yZXNwb25zZSgpOwojZW5kaWYKCiAgICByZXR1cm4gT0s7Cn0KCiNpZiBkZWZpbmVkKEZFQVRfTU9VU0UpIHx8IGRlZmluZWQoUFJPVE8pCgojIGlmZGVmIEZFQVRfTU9VU0VfVFRZCiMgIGRlZmluZSBITVRfTk9STUFMCTEKIyAgZGVmaW5lIEhNVF9ORVRURVJNCTIKIyAgZGVmaW5lIEhNVF9ERUMJNAojICBkZWZpbmUgSE1UX0pTQlRFUk0JOAojICBkZWZpbmUgSE1UX1BURVJNCTE2CnN0YXRpYyBpbnQgaGFzX21vdXNlX3Rlcm1jb2RlID0gMDsKIyBlbmRpZgoKIyBpZiAoIWRlZmluZWQoVU5JWCkgfHwgZGVmaW5lZChGRUFUX01PVVNFX1hURVJNKSB8fCBkZWZpbmVkKEZFQVRfTU9VU0VfTkVUKSBcCgl8fCBkZWZpbmVkKEZFQVRfTU9VU0VfREVDKSkgfHwgZGVmaW5lZChGRUFUX01PVVNFX0pTQikgXAoJfHwgZGVmaW5lZChGRUFUX01PVVNFX1BURVJNKSB8fCBkZWZpbmVkKFBST1RPKQogICAgdm9pZApzZXRfbW91c2VfdGVybWNvZGUobiwgcykKICAgIGludAkJbjsJLyogS1NfTU9VU0UsIEtTX05FVFRFUk1fTU9VU0Ugb3IgS1NfREVDX01PVVNFICovCiAgICBjaGFyX3UJKnM7CnsKICAgIGNoYXJfdQluYW1lWzJdOwoKICAgIG5hbWVbMF0gPSBuOwogICAgbmFtZVsxXSA9IEtFX0ZJTExFUjsKICAgIGFkZF90ZXJtY29kZShuYW1lLCBzLCBGQUxTRSk7CiMgIGlmZGVmIEZFQVRfTU9VU0VfVFRZCiMgICBpZmRlZiBGRUFUX01PVVNFX0pTQgogICAgaWYgKG4gPT0gS1NfSlNCVEVSTV9NT1VTRSkKCWhhc19tb3VzZV90ZXJtY29kZSB8PSBITVRfSlNCVEVSTTsKICAgIGVsc2UKIyAgIGVuZGlmCiMgICBpZmRlZiBGRUFUX01PVVNFX05FVAogICAgaWYgKG4gPT0gS1NfTkVUVEVSTV9NT1VTRSkKCWhhc19tb3VzZV90ZXJtY29kZSB8PSBITVRfTkVUVEVSTTsKICAgIGVsc2UKIyAgIGVuZGlmCiMgICBpZmRlZiBGRUFUX01PVVNFX0RFQwogICAgaWYgKG4gPT0gS1NfREVDX01PVVNFKQoJaGFzX21vdXNlX3Rlcm1jb2RlIHw9IEhNVF9ERUM7CiAgICBlbHNlCiMgICBlbmRpZgojICAgaWZkZWYgRkVBVF9NT1VTRV9QVEVSTQogICAgaWYgKG4gPT0gS1NfUFRFUk1fTU9VU0UpCgloYXNfbW91c2VfdGVybWNvZGUgfD0gSE1UX1BURVJNOwogICAgZWxzZQojICAgZW5kaWYKCWhhc19tb3VzZV90ZXJtY29kZSB8PSBITVRfTk9STUFMOwojICBlbmRpZgp9CiMgZW5kaWYKCiMgaWYgKChkZWZpbmVkKFVOSVgpIHx8IGRlZmluZWQoVk1TKSB8fCBkZWZpbmVkKE9TMikpIFwKCSYmIChkZWZpbmVkKEZFQVRfTU9VU0VfWFRFUk0pIHx8IGRlZmluZWQoRkVBVF9NT1VTRV9ERUMpIFwKCSAgICB8fCBkZWZpbmVkKEZFQVRfTU9VU0VfR1BNKSB8fCBkZWZpbmVkKEZFQVRfTU9VU0VfUFRFUk0pKSkgXAoJICAgIHx8IGRlZmluZWQoUFJPVE8pCiAgICB2b2lkCmRlbF9tb3VzZV90ZXJtY29kZShuKQogICAgaW50CQluOwkvKiBLU19NT1VTRSwgS1NfTkVUVEVSTV9NT1VTRSBvciBLU19ERUNfTU9VU0UgKi8KewogICAgY2hhcl91CW5hbWVbMl07CgogICAgbmFtZVswXSA9IG47CiAgICBuYW1lWzFdID0gS0VfRklMTEVSOwogICAgZGVsX3Rlcm1jb2RlKG5hbWUpOwojICBpZmRlZiBGRUFUX01PVVNFX1RUWQojICAgaWZkZWYgRkVBVF9NT1VTRV9KU0IKICAgIGlmIChuID09IEtTX0pTQlRFUk1fTU9VU0UpCgloYXNfbW91c2VfdGVybWNvZGUgJj0gfkhNVF9KU0JURVJNOwogICAgZWxzZQojICAgZW5kaWYKIyAgIGlmZGVmIEZFQVRfTU9VU0VfTkVUCiAgICBpZiAobiA9PSBLU19ORVRURVJNX01PVVNFKQoJaGFzX21vdXNlX3Rlcm1jb2RlICY9IH5ITVRfTkVUVEVSTTsKICAgIGVsc2UKIyAgIGVuZGlmCiMgICBpZmRlZiBGRUFUX01PVVNFX0RFQwogICAgaWYgKG4gPT0gS1NfREVDX01PVVNFKQoJaGFzX21vdXNlX3Rlcm1jb2RlICY9IH5ITVRfREVDOwogICAgZWxzZQojICAgZW5kaWYKIyAgIGlmZGVmIEZFQVRfTU9VU0VfUFRFUk0KICAgIGlmIChuID09IEtTX1BURVJNX01PVVNFKQoJaGFzX21vdXNlX3Rlcm1jb2RlICY9IH5ITVRfUFRFUk07CiAgICBlbHNlCiMgICBlbmRpZgoJaGFzX21vdXNlX3Rlcm1jb2RlICY9IH5ITVRfTk9STUFMOwojICBlbmRpZgp9CiMgZW5kaWYKI2VuZGlmCgojaWZkZWYgSEFWRV9UR0VURU5UCi8qCiAqIENhbGwgdGdldGVudCgpCiAqIFJldHVybiBlcnJvciBtZXNzYWdlIGlmIGl0IGZhaWxzLCBOVUxMIGlmIGl0J3MgT0suCiAqLwogICAgc3RhdGljIGNoYXJfdSAqCnRnZXRlbnRfZXJyb3IodGJ1ZiwgdGVybSkKICAgIGNoYXJfdSAgKnRidWY7CiAgICBjaGFyX3UgICp0ZXJtOwp7CiAgICBpbnQJICAgIGk7CgogICAgaSA9IFRHRVRFTlQodGJ1ZiwgdGVybSk7CiAgICBpZiAoaSA8IDAJCSAgICAvKiAtMSBpcyBhbHdheXMgYW4gZXJyb3IgKi8KIyBpZmRlZiBUR0VURU5UX1pFUk9fRVJSCgkgICAgfHwgaSA9PSAwCSAgICAvKiBzb21ldGltZXMgemVybyBpcyBhbHNvIGFuIGVycm9yICovCiMgZW5kaWYKICAgICAgICkKICAgIHsKCS8qIE9uIEZyZWVCU0QgdHB1dHMoKSBnZXRzIGEgU0VHViBhZnRlciBhIHRnZXRlbnQoKSB3aGljaCBmYWlscy4gIENhbGwKCSAqIHRnZXRlbnQoKSB3aXRoIHRoZSBhbHdheXMgZXhpc3RpbmcgImR1bWIiIGVudHJ5IHRvIGF2b2lkIGEgY3Jhc2ggb3IKCSAqIGhhbmcuICovCgkodm9pZClUR0VURU5UKHRidWYsICJkdW1iIik7CgoJaWYgKGkgPCAwKQojIGlmZGVmIFRHRVRFTlRfWkVST19FUlIKCSAgICByZXR1cm4gKGNoYXJfdSAqKV8oIkU1NTc6IENhbm5vdCBvcGVuIHRlcm1jYXAgZmlsZSIpOwoJaWYgKGkgPT0gMCkKIyBlbmRpZgojaWZkZWYgVEVSTUlORk8KCSAgICByZXR1cm4gKGNoYXJfdSAqKV8oIkU1NTg6IFRlcm1pbmFsIGVudHJ5IG5vdCBmb3VuZCBpbiB0ZXJtaW5mbyIpOwojZWxzZQoJICAgIHJldHVybiAoY2hhcl91ICopXygiRTU1OTogVGVybWluYWwgZW50cnkgbm90IGZvdW5kIGluIHRlcm1jYXAiKTsKI2VuZGlmCiAgICB9CiAgICByZXR1cm4gTlVMTDsKfQoKLyoKICogU29tZSB2ZXJzaW9ucyBvZiB0Z2V0c3RyKCkgaGF2ZSBiZWVuIHJlcG9ydGVkIHRvIHJldHVybiAtMSBpbnN0ZWFkIG9mIE5VTEwuCiAqIEZpeCB0aGF0IGhlcmUuCiAqLwogICAgc3RhdGljIGNoYXJfdSAqCnZpbV90Z2V0c3RyKHMsIHBwKQogICAgY2hhcgkqczsKICAgIGNoYXJfdQkqKnBwOwp7CiAgICBjaGFyCSpwOwoKICAgIHAgPSB0Z2V0c3RyKHMsIChjaGFyICoqKXBwKTsKICAgIGlmIChwID09IChjaGFyICopLTEpCglwID0gTlVMTDsKICAgIHJldHVybiAoY2hhcl91ICopcDsKfQojZW5kaWYgLyogSEFWRV9UR0VURU5UICovCgojaWYgZGVmaW5lZChIQVZFX1RHRVRFTlQpICYmIChkZWZpbmVkKFVOSVgpIHx8IGRlZmluZWQoX19FTVhfXykgfHwgZGVmaW5lZChWTVMpIHx8IGRlZmluZWQoTUFDT1NfWCkpCi8qCiAqIEdldCBDb2x1bW5zIGFuZCBSb3dzIGZyb20gdGhlIHRlcm1jYXAuIFVzZWQgYWZ0ZXIgYSB3aW5kb3cgc2lnbmFsIGlmIHRoZQogKiBpb2N0bCgpIGZhaWxzLiBJdCBkb2Vzbid0IG1ha2Ugc2Vuc2UgdG8gY2FsbCB0Z2V0ZW50IGVhY2ggdGltZSBpZiB0aGUgImNvIgogKiBhbmQgImxpIiBlbnRyaWVzIG5ldmVyIGNoYW5nZS4gQnV0IG9uIHNvbWUgc3lzdGVtcyB0aGlzIHdvcmtzLgogKiBFcnJvcnMgd2hpbGUgZ2V0dGluZyB0aGUgZW50cmllcyBhcmUgaWdub3JlZC4KICovCiAgICB2b2lkCmdldGxpbmVjb2woY3AsIHJwKQogICAgbG9uZwkqY3A7CS8qIHBvaW50ZXIgdG8gY29sdW1ucyAqLwogICAgbG9uZwkqcnA7CS8qIHBvaW50ZXIgdG8gcm93cyAqLwp7CiAgICBjaGFyX3UJdGJ1ZltUQlVGU1pdOwoKICAgIGlmIChUX05BTUUgIT0gTlVMTCAmJiAqVF9OQU1FICE9IE5VTCAmJiB0Z2V0ZW50X2Vycm9yKHRidWYsIFRfTkFNRSkgPT0gTlVMTCkKICAgIHsKCWlmICgqY3AgPT0gMCkKCSAgICAqY3AgPSB0Z2V0bnVtKCJjbyIpOwoJaWYgKCpycCA9PSAwKQoJICAgICpycCA9IHRnZXRudW0oImxpIik7CiAgICB9Cn0KI2VuZGlmIC8qIGRlZmluZWQoSEFWRV9UR0VURU5UKSAmJiBkZWZpbmVkKFVOSVgpICovCgovKgogKiBHZXQgYSBzdHJpbmcgZW50cnkgZnJvbSB0aGUgdGVybWNhcCBhbmQgYWRkIGl0IHRvIHRoZSBsaXN0IG9mIHRlcm1jb2Rlcy4KICogVXNlZCBmb3IgPHRfeHg+IHNwZWNpYWwga2V5cy4KICogR2l2ZSBhbiBlcnJvciBtZXNzYWdlIGZvciBmYWlsdXJlIHdoZW4gbm90IHNvdXJjaW5nLgogKiBJZiBmb3JjZSBnaXZlbiwgcmVwbGFjZSBhbiBleGlzdGluZyBlbnRyeS4KICogUmV0dXJuIEZBSUwgaWYgdGhlIGVudHJ5IHdhcyBub3QgZm91bmQsIE9LIGlmIHRoZSBlbnRyeSB3YXMgYWRkZWQuCiAqLwogICAgaW50CmFkZF90ZXJtY2FwX2VudHJ5KG5hbWUsIGZvcmNlKQogICAgY2hhcl91ICAqbmFtZTsKICAgIGludAkgICAgZm9yY2U7CnsKICAgIGNoYXJfdSAgKnRlcm07CiAgICBpbnQJICAgIGtleTsKICAgIHN0cnVjdCBidWlsdGluX3Rlcm0gKnRlcm1wOwojaWZkZWYgSEFWRV9UR0VURU5UCiAgICBjaGFyX3UgICpzdHJpbmc7CiAgICBpbnQJICAgIGk7CiAgICBpbnQJICAgIGJ1aWx0aW5fZmlyc3Q7CiAgICBjaGFyX3UgIHRidWZbVEJVRlNaXTsKICAgIGNoYXJfdSAgdHN0cmJ1ZltUQlVGU1pdOwogICAgY2hhcl91ICAqdHAgPSB0c3RyYnVmOwogICAgY2hhcl91ICAqZXJyb3JfbXNnID0gTlVMTDsKI2VuZGlmCgovKgogKiBJZiB0aGUgR1VJIGlzIHJ1bm5pbmcgb3Igd2lsbCBzdGFydCBpbiBhIG1vbWVudCwgd2Ugb25seSBzdXBwb3J0IHRoZSBrZXlzCiAqIHRoYXQgdGhlIEdVSSBjYW4gcHJvZHVjZS4KICovCiNpZmRlZiBGRUFUX0dVSQogICAgaWYgKGd1aS5pbl91c2UgfHwgZ3VpLnN0YXJ0aW5nKQoJcmV0dXJuIGd1aV9tY2hfaGFza2V5KG5hbWUpOwojZW5kaWYKCiAgICBpZiAoIWZvcmNlICYmIGZpbmRfdGVybWNvZGUobmFtZSkgIT0gTlVMTCkJICAgIC8qIGl0J3MgYWxyZWFkeSB0aGVyZSAqLwoJcmV0dXJuIE9LOwoKICAgIHRlcm0gPSBUX05BTUU7CiAgICBpZiAodGVybSA9PSBOVUxMIHx8ICp0ZXJtID09IE5VTCkJICAgIC8qICd0ZXJtJyBub3QgZGVmaW5lZCB5ZXQgKi8KCXJldHVybiBGQUlMOwoKICAgIGlmICh0ZXJtX2lzX2J1aWx0aW4odGVybSkpCQkgICAgLyogbmFtZSBzdGFydHMgd2l0aCAiYnVpbHRpbl8iICovCiAgICB7Cgl0ZXJtICs9IDg7CiNpZmRlZiBIQVZFX1RHRVRFTlQKCWJ1aWx0aW5fZmlyc3QgPSBUUlVFOwojZW5kaWYKICAgIH0KI2lmZGVmIEhBVkVfVEdFVEVOVAogICAgZWxzZQoJYnVpbHRpbl9maXJzdCA9IHBfdGJpOwojZW5kaWYKCiNpZmRlZiBIQVZFX1RHRVRFTlQKLyoKICogV2UgY2FuIGdldCB0aGUgZW50cnkgZnJvbSB0aGUgYnVpbHRpbiB0ZXJtY2FwIGFuZCBmcm9tIHRoZSBleHRlcm5hbCBvbmUuCiAqIElmICd0dHlidWlsdGluJyBpcyBvbiBvciB0aGUgdGVybWluYWwgbmFtZSBzdGFydHMgd2l0aCAiYnVpbHRpbl8iLCB0cnkKICogYnVpbHRpbiB0ZXJtY2FwIGZpcnN0LgogKiBJZiAndHR5YnVpbHRpbicgaXMgb2ZmLCB0cnkgZXh0ZXJuYWwgdGVybWNhcCBmaXJzdC4KICovCiAgICBmb3IgKGkgPSAwOyBpIDwgMjsgKytpKQogICAgewoJaWYgKCFidWlsdGluX2ZpcnN0ID09IGkpCiNlbmRpZgoJLyoKCSAqIFNlYXJjaCBpbiBidWlsdGluIHRlcm1jYXAKCSAqLwoJewoJICAgIHRlcm1wID0gZmluZF9idWlsdGluX3Rlcm0odGVybSk7CgkgICAgaWYgKHRlcm1wLT5idF9zdHJpbmcgIT0gTlVMTCkJLyogZm91bmQgaXQgKi8KCSAgICB7CgkJa2V5ID0gVEVSTUNBUDJLRVkobmFtZVswXSwgbmFtZVsxXSk7CgkJd2hpbGUgKHRlcm1wLT5idF9lbnRyeSAhPSAoaW50KUtTX05BTUUpCgkJewoJCSAgICBpZiAoKGludCl0ZXJtcC0+YnRfZW50cnkgPT0ga2V5KQoJCSAgICB7CgkJCWFkZF90ZXJtY29kZShuYW1lLCAoY2hhcl91ICopdGVybXAtPmJ0X3N0cmluZywKCQkJCQkJCSAgdGVybV9pc184Yml0KHRlcm0pKTsKCQkJcmV0dXJuIE9LOwoJCSAgICB9CgkJICAgICsrdGVybXA7CgkJfQoJICAgIH0KCX0KI2lmZGVmIEhBVkVfVEdFVEVOVAoJZWxzZQoJLyoKCSAqIFNlYXJjaCBpbiBleHRlcm5hbCB0ZXJtY2FwCgkgKi8KCXsKCSAgICBlcnJvcl9tc2cgPSB0Z2V0ZW50X2Vycm9yKHRidWYsIHRlcm0pOwoJICAgIGlmIChlcnJvcl9tc2cgPT0gTlVMTCkKCSAgICB7CgkJc3RyaW5nID0gVEdFVFNUUigoY2hhciAqKW5hbWUsICZ0cCk7CgkJaWYgKHN0cmluZyAhPSBOVUxMICYmICpzdHJpbmcgIT0gTlVMKQoJCXsKCQkgICAgYWRkX3Rlcm1jb2RlKG5hbWUsIHN0cmluZywgRkFMU0UpOwoJCSAgICByZXR1cm4gT0s7CgkJfQoJICAgIH0KCX0KICAgIH0KI2VuZGlmCgogICAgaWYgKHNvdXJjaW5nX25hbWUgPT0gTlVMTCkKICAgIHsKI2lmZGVmIEhBVkVfVEdFVEVOVAoJaWYgKGVycm9yX21zZyAhPSBOVUxMKQoJICAgIEVNU0coZXJyb3JfbXNnKTsKCWVsc2UKI2VuZGlmCgkgICAgRU1TRzIoXygiRTQzNjogTm8gXCIlc1wiIGVudHJ5IGluIHRlcm1jYXAiKSwgbmFtZSk7CiAgICB9CiAgICByZXR1cm4gRkFJTDsKfQoKICAgIHN0YXRpYyBpbnQKdGVybV9pc19idWlsdGluKG5hbWUpCiAgICBjaGFyX3UgICpuYW1lOwp7CiAgICByZXR1cm4gKFNUUk5DTVAobmFtZSwgImJ1aWx0aW5fIiwgKHNpemVfdCk4KSA9PSAwKTsKfQoKLyoKICogUmV0dXJuIFRSVUUgaWYgdGVybWluYWwgIm5hbWUiIHVzZXMgQ1NJIGluc3RlYWQgb2YgPEVzYz5bLgogKiBBc3N1bWUgdGhhdCB0aGUgdGVybWluYWwgaXMgdXNpbmcgOC1iaXQgY29udHJvbHMgd2hlbiB0aGUgbmFtZSBjb250YWlucwogKiAiOGJpdCIsIGxpa2UgaW4gInh0ZXJtLThiaXQiLgogKi8KICAgIGludAp0ZXJtX2lzXzhiaXQobmFtZSkKICAgIGNoYXJfdSAgKm5hbWU7CnsKICAgIHJldHVybiAoZGV0ZWN0ZWRfOGJpdCB8fCBzdHJzdHIoKGNoYXIgKiluYW1lLCAiOGJpdCIpICE9IE5VTEwpOwp9CgovKgogKiBUcmFuc2xhdGUgdGVybWluYWwgY29udHJvbCBjaGFycyBmcm9tIDctYml0IHRvIDgtYml0OgogKiA8RXNjPlsgLT4gQ1NJCiAqIDxFc2M+XSAtPiA8TS1DLV0+CiAqIDxFc2M+TyAtPiA8TS1DLU8+CiAqLwogICAgc3RhdGljIGludAp0ZXJtXzd0bzhiaXQocCkKICAgIGNoYXJfdSAgKnA7CnsKICAgIGlmICgqcCA9PSBFU0MpCiAgICB7CglpZiAocFsxXSA9PSAnWycpCgkgICAgcmV0dXJuIENTSTsKCWlmIChwWzFdID09ICddJykKCSAgICByZXR1cm4gMHg5ZDsKCWlmIChwWzFdID09ICdPJykKCSAgICByZXR1cm4gMHg4ZjsKICAgIH0KICAgIHJldHVybiAwOwp9CgojaWZkZWYgRkVBVF9HVUkKICAgIGludAp0ZXJtX2lzX2d1aShuYW1lKQogICAgY2hhcl91ICAqbmFtZTsKewogICAgcmV0dXJuIChTVFJDTVAobmFtZSwgImJ1aWx0aW5fZ3VpIikgPT0gMCB8fCBTVFJDTVAobmFtZSwgImd1aSIpID09IDApOwp9CiNlbmRpZgoKI2lmICFkZWZpbmVkKEhBVkVfVEdFVEVOVCkgfHwgZGVmaW5lZChBTUlHQSkgfHwgZGVmaW5lZChQUk9UTykKCiAgICBjaGFyX3UgKgp0bHRvYShpKQogICAgdW5zaWduZWQgbG9uZyBpOwp7CiAgICBzdGF0aWMgY2hhcl91IGJ1ZlsxNl07CiAgICBjaGFyX3UJKnA7CgogICAgcCA9IGJ1ZiArIDE1OwogICAgKnAgPSAnXDAnOwogICAgZG8KICAgIHsKCS0tcDsKCSpwID0gKGNoYXJfdSkgKGkgJSAxMCArICcwJyk7CglpIC89IDEwOwogICAgfQogICAgd2hpbGUgKGkgPiAwICYmIHAgPiBidWYpOwogICAgcmV0dXJuIHA7Cn0KI2VuZGlmCgojaWZuZGVmIEhBVkVfVEdFVEVOVAoKLyoKICogbWluaW1hbCB0Z290bygpIGltcGxlbWVudGF0aW9uLgogKiBubyBwYWRkaW5nIGFuZCB3ZSBvbmx5IHBhcnNlIGZvciAlaSAlZCBhbmQgJStjaGFyCiAqLwpjaGFyICp0Z290byBfX0FSR1MoKGNoYXIgKiwgaW50LCBpbnQpKTsKCiAgICBjaGFyICoKdGdvdG8oY20sIHgsIHkpCiAgICBjaGFyICpjbTsKICAgIGludCB4LCB5Owp7CiAgICBzdGF0aWMgY2hhciBidWZbMzBdOwogICAgY2hhciAqcCwgKnMsICplOwoKICAgIGlmICghY20pCglyZXR1cm4gIk9PUFMiOwogICAgZSA9IGJ1ZiArIDI5OwogICAgZm9yIChzID0gYnVmOyBzIDwgZSAmJiAqY207IGNtKyspCiAgICB7CglpZiAoKmNtICE9ICclJykKCXsKCSAgICAqcysrID0gKmNtOwoJICAgIGNvbnRpbnVlOwoJfQoJc3dpdGNoICgqKytjbSkKCXsKCWNhc2UgJ2QnOgoJICAgIHAgPSAoY2hhciAqKXRsdG9hKCh1bnNpZ25lZCBsb25nKXkpOwoJICAgIHkgPSB4OwoJICAgIHdoaWxlICgqcCkKCQkqcysrID0gKnArKzsKCSAgICBicmVhazsKCWNhc2UgJ2knOgoJICAgIHgrKzsKCSAgICB5Kys7CgkgICAgYnJlYWs7CgljYXNlICcrJzoKCSAgICAqcysrID0gKGNoYXIpKCorK2NtICsgeSk7CgkgICAgeSA9IHg7CgkgICAgYnJlYWs7CgljYXNlICclJzoKCSAgICAqcysrID0gKmNtOwoJICAgIGJyZWFrOwoJZGVmYXVsdDoKCSAgICByZXR1cm4gIk9PUFMiOwoJfQogICAgfQogICAgKnMgPSAnXDAnOwogICAgcmV0dXJuIGJ1ZjsKfQoKI2VuZGlmIC8qIEhBVkVfVEdFVEVOVCAqLwoKLyoKICogU2V0IHRoZSB0ZXJtaW5hbCBuYW1lIGFuZCBpbml0aWFsaXplIHRoZSB0ZXJtaW5hbCBvcHRpb25zLgogKiBJZiAibmFtZSIgaXMgTlVMTCBvciBlbXB0eSwgZ2V0IHRoZSB0ZXJtaW5hbCBuYW1lIGZyb20gdGhlIGVudmlyb25tZW50LgogKiBJZiB0aGF0IGZhaWxzLCB1c2UgdGhlIGRlZmF1bHQgdGVybWluYWwgbmFtZS4KICovCiAgICB2b2lkCnRlcm1jYXBpbml0KG5hbWUpCiAgICBjaGFyX3UgKm5hbWU7CnsKICAgIGNoYXJfdQkqdGVybTsKCiAgICBpZiAobmFtZSAhPSBOVUxMICYmICpuYW1lID09IE5VTCkKCW5hbWUgPSBOVUxMOwkgICAgLyogZW1wdHkgbmFtZSBpcyBlcXVhbCB0byBubyBuYW1lICovCiAgICB0ZXJtID0gbmFtZTsKCiNpZmRlZiBfX0JFT1NfXwogICAgLyoKICAgICAqIFRFUk0gZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgbm9ybWFsbHkgc2V0IHRvICdhbnNpJyBvbiB0aGUgQmVib3g7CiAgICAgKiBTaW5jZSB0aGUgQmVCb3ggZG9lc24ndCBxdWl0ZSBzdXBwb3J0IGZ1bGwgQU5TSSB5ZXQsIHdlIHVzZSBvdXIKICAgICAqIG93biBjdXN0b20gJ2Fuc2ktYmVvcycgdGVybWNhcCBpbnN0ZWFkLCB1bmxlc3MgdGhlIC1UIG9wdGlvbiBoYXMKICAgICAqIGJlZW4gZ2l2ZW4gb24gdGhlIGNvbW1hbmQgbGluZS4KICAgICAqLwogICAgaWYgKHRlcm0gPT0gTlVMTAoJCSAmJiBzdHJjbXAoKGNoYXIgKiltY2hfZ2V0ZW52KChjaGFyX3UgKikiVEVSTSIpLCAiYW5zaSIpID09IDApCgl0ZXJtID0gREVGQVVMVF9URVJNOwojZW5kaWYKI2lmbmRlZiBNU1dJTgogICAgaWYgKHRlcm0gPT0gTlVMTCkKCXRlcm0gPSBtY2hfZ2V0ZW52KChjaGFyX3UgKikiVEVSTSIpOwojZW5kaWYKICAgIGlmICh0ZXJtID09IE5VTEwgfHwgKnRlcm0gPT0gTlVMKQoJdGVybSA9IERFRkFVTFRfVEVSTTsKICAgIHNldF9zdHJpbmdfb3B0aW9uX2RpcmVjdCgoY2hhcl91ICopInRlcm0iLCAtMSwgdGVybSwgT1BUX0ZSRUUpOwoKICAgIC8qIFNldCB0aGUgZGVmYXVsdCB0ZXJtaW5hbCBuYW1lLiAqLwogICAgc2V0X3N0cmluZ19kZWZhdWx0KCJ0ZXJtIiwgdGVybSk7CiAgICBzZXRfc3RyaW5nX2RlZmF1bHQoInR0eXR5cGUiLCB0ZXJtKTsKCiAgICAvKgogICAgICogQXZvaWQgdXNpbmcgInRlcm0iIGhlcmUsIGJlY2F1c2UgdGhlIG5leHQgbWNoX2dldGVudigpIG1heSBvdmVyd3JpdGUgaXQuCiAgICAgKi8KICAgIHNldF90ZXJtbmFtZShUX05BTUUgIT0gTlVMTCA/IFRfTkFNRSA6IHRlcm0pOwp9CgovKgogKiB0aGUgbnVtYmVyIG9mIGNhbGxzIHRvIHVpX3dyaXRlIGlzIHJlZHVjZWQgYnkgdXNpbmcgdGhlIGJ1ZmZlciAib3V0X2J1ZiIKICovCiNpZmRlZiBET1MxNgojIGRlZmluZSBPVVRfU0laRQkyNTUJCS8qIG9ubHkgaGF2ZSA2NDBLIHRvdGFsLi4uICovCiNlbHNlCiMgaWZkZWYgRkVBVF9HVUlfVzE2CiMgIGRlZmluZSBPVVRfU0laRQkxMDIzCQkvKiBTYXZlIHByZWNpb3VzIDFLIG5lYXIgZGF0YSAqLwojIGVsc2UKIyAgZGVmaW5lIE9VVF9TSVpFCTIwNDcKIyBlbmRpZgojZW5kaWYKCSAgICAvKiBBZGQgb25lIHRvIGFsbG93IG1jaF93cml0ZSgpIGluIG9zX3dpbjMyLmMgdG8gYXBwZW5kIGEgTlVMICovCnN0YXRpYyBjaGFyX3UJCW91dF9idWZbT1VUX1NJWkUgKyAxXTsKc3RhdGljIGludAkJb3V0X3BvcyA9IDA7CS8qIG51bWJlciBvZiBjaGFycyBpbiBvdXRfYnVmICovCgovKgogKiBvdXRfZmx1c2goKTogZmx1c2ggdGhlIG91dHB1dCBidWZmZXIKICovCiAgICB2b2lkCm91dF9mbHVzaCgpCnsKICAgIGludAkgICAgbGVuOwoKICAgIGlmIChvdXRfcG9zICE9IDApCiAgICB7CgkvKiBzZXQgb3V0X3BvcyB0byAwIGJlZm9yZSB1aV93cml0ZSwgdG8gYXZvaWQgcmVjdXJzaXZlbmVzcyAqLwoJbGVuID0gb3V0X3BvczsKCW91dF9wb3MgPSAwOwoJdWlfd3JpdGUob3V0X2J1ZiwgbGVuKTsKICAgIH0KfQoKI2lmIGRlZmluZWQoRkVBVF9NQllURSkgfHwgZGVmaW5lZChQUk9UTykKLyoKICogU29tZXRpbWVzIGEgYnl0ZSBvdXQgb2YgYSBtdWx0aS1ieXRlIGNoYXJhY3RlciBpcyB3cml0dGVuIHdpdGggb3V0X2NoYXIoKS4KICogVG8gYXZvaWQgZmx1c2hpbmcgaGFsZiBvZiB0aGUgY2hhcmFjdGVyLCBjYWxsIHRoaXMgZnVuY3Rpb24gZmlyc3QuCiAqLwogICAgdm9pZApvdXRfZmx1c2hfY2hlY2soKQp7CiAgICBpZiAoZW5jX2RiY3MgIT0gMCAmJiBvdXRfcG9zID49IE9VVF9TSVpFIC0gTUJfTUFYQllURVMpCglvdXRfZmx1c2goKTsKfQojZW5kaWYKCiNpZmRlZiBGRUFUX0dVSQovKgogKiBvdXRfdHJhc2goKTogVGhyb3cgYXdheSB0aGUgY29udGVudHMgb2YgdGhlIG91dHB1dCBidWZmZXIKICovCiAgICB2b2lkCm91dF90cmFzaCgpCnsKICAgIG91dF9wb3MgPSAwOwp9CiNlbmRpZgoKLyoKICogb3V0X2NoYXIoYyk6IHB1dCBhIGJ5dGUgaW50byB0aGUgb3V0cHV0IGJ1ZmZlci4KICoJCUZsdXNoIGl0IGlmIGl0IGJlY29tZXMgZnVsbC4KICogVGhpcyBzaG91bGQgbm90IGJlIHVzZWQgZm9yIG91dHB1dHRpbmcgdGV4dCBvbiB0aGUgc2NyZWVuICh1c2UgZnVuY3Rpb25zCiAqIGxpa2UgbXNnX3B1dHMoKSBhbmQgc2NyZWVuX3B1dGNoYXIoKSBmb3IgdGhhdCkuCiAqLwogICAgdm9pZApvdXRfY2hhcihjKQogICAgdW5zaWduZWQJYzsKewojaWYgZGVmaW5lZChVTklYKSB8fCBkZWZpbmVkKFZNUykgfHwgZGVmaW5lZChBTUlHQSkgfHwgZGVmaW5lZChNQUNPU19YX1VOSVgpCiAgICBpZiAoYyA9PSAnXG4nKQkvKiB0dXJuIExGIGludG8gQ1ItTEYgKENSTU9EIGRvZXNuJ3Qgc2VlbSB0byBkbyB0aGlzKSAqLwoJb3V0X2NoYXIoJ1xyJyk7CiNlbmRpZgoKICAgIG91dF9idWZbb3V0X3BvcysrXSA9IGM7CgogICAgLyogRm9yIHRlc3Rpbmcgd2UgZmx1c2ggZWFjaCB0aW1lLiAqLwogICAgaWYgKG91dF9wb3MgPj0gT1VUX1NJWkUgfHwgcF93ZCkKCW91dF9mbHVzaCgpOwp9CgpzdGF0aWMgdm9pZCBvdXRfY2hhcl9uZiBfX0FSR1MoKHVuc2lnbmVkKSk7CgovKgogKiBvdXRfY2hhcl9uZihjKTogbGlrZSBvdXRfY2hhcigpLCBidXQgZG9uJ3QgZmx1c2ggd2hlbiBwX3dkIGlzIHNldAogKi8KICAgIHN0YXRpYyB2b2lkCm91dF9jaGFyX25mKGMpCiAgICB1bnNpZ25lZAljOwp7CiNpZiBkZWZpbmVkKFVOSVgpIHx8IGRlZmluZWQoVk1TKSB8fCBkZWZpbmVkKEFNSUdBKSB8fCBkZWZpbmVkKE1BQ09TX1hfVU5JWCkKICAgIGlmIChjID09ICdcbicpCS8qIHR1cm4gTEYgaW50byBDUi1MRiAoQ1JNT0QgZG9lc24ndCBzZWVtIHRvIGRvIHRoaXMpICovCglvdXRfY2hhcl9uZignXHInKTsKI2VuZGlmCgogICAgb3V0X2J1ZltvdXRfcG9zKytdID0gYzsKCiAgICBpZiAob3V0X3BvcyA+PSBPVVRfU0laRSkKCW91dF9mbHVzaCgpOwp9CgovKgogKiBBIG5ldmVyLXBhZGRpbmcgb3V0X3N0ci4KICogdXNlIHRoaXMgd2hlbmV2ZXIgeW91IGRvbid0IHdhbnQgdG8gcnVuIHRoZSBzdHJpbmcgdGhyb3VnaCB0cHV0cy4KICogdHB1dHMgYWJvdmUgaXMgaGFybWxlc3MsIGJ1dCB0cHV0cyBmcm9tIHRoZSB0ZXJtY2FwIGxpYnJhcnkKICogaXMgbGlrZWx5IHRvIHN0cmlwIG9mZiBsZWFkaW5nIGRpZ2l0cywgdGhhdCBpdCBtaXN0YWtlcyBmb3IgcGFkZGluZwogKiBpbmZvcm1hdGlvbiwgYW5kICIlaSIsICIlZCIsIGV0Yy4KICogVGhpcyBzaG91bGQgb25seSBiZSB1c2VkIGZvciB3cml0aW5nIHRlcm1pbmFsIGNvZGVzLCBub3QgZm9yIG91dHB1dHRpbmcKICogbm9ybWFsIHRleHQgKHVzZSBmdW5jdGlvbnMgbGlrZSBtc2dfcHV0cygpIGFuZCBzY3JlZW5fcHV0Y2hhcigpIGZvciB0aGF0KS4KICovCiAgICB2b2lkCm91dF9zdHJfbmYocykKICAgIGNoYXJfdSAqczsKewogICAgaWYgKG91dF9wb3MgPiBPVVRfU0laRSAtIDIwKSAgLyogYXZvaWQgdGVybWluYWwgc3RyaW5ncyBiZWluZyBzcGxpdCB1cCAqLwoJb3V0X2ZsdXNoKCk7CiAgICB3aGlsZSAoKnMpCglvdXRfY2hhcl9uZigqcysrKTsKCiAgICAvKiBGb3IgdGVzdGluZyB3ZSB3cml0ZSBvbmUgc3RyaW5nIGF0IGEgdGltZS4gKi8KICAgIGlmIChwX3dkKQoJb3V0X2ZsdXNoKCk7Cn0KCi8qCiAqIG91dF9zdHIocyk6IFB1dCBhIGNoYXJhY3RlciBzdHJpbmcgYSBieXRlIGF0IGEgdGltZSBpbnRvIHRoZSBvdXRwdXQgYnVmZmVyLgogKiBJZiBIQVZFX1RHRVRFTlQgaXMgZGVmaW5lZCB1c2UgdGhlIHRlcm1jYXAgcGFyc2VyLiAoancpCiAqIFRoaXMgc2hvdWxkIG9ubHkgYmUgdXNlZCBmb3Igd3JpdGluZyB0ZXJtaW5hbCBjb2Rlcywgbm90IGZvciBvdXRwdXR0aW5nCiAqIG5vcm1hbCB0ZXh0ICh1c2UgZnVuY3Rpb25zIGxpa2UgbXNnX3B1dHMoKSBhbmQgc2NyZWVuX3B1dGNoYXIoKSBmb3IgdGhhdCkuCiAqLwogICAgdm9pZApvdXRfc3RyKHMpCiAgICBjaGFyX3UJICpzOwp7CiAgICBpZiAocyAhPSBOVUxMICYmICpzKQogICAgewojaWZkZWYgRkVBVF9HVUkKCS8qIERvbid0IHVzZSB0cHV0cygpIHdoZW4gR1VJIGlzIHVzZWQsIG5jdXJzZXMgY3Jhc2hlcy4gKi8KCWlmIChndWkuaW5fdXNlKQoJewoJICAgIG91dF9zdHJfbmYocyk7CgkgICAgcmV0dXJuOwoJfQojZW5kaWYKCS8qIGF2b2lkIHRlcm1pbmFsIHN0cmluZ3MgYmVpbmcgc3BsaXQgdXAgKi8KCWlmIChvdXRfcG9zID4gT1VUX1NJWkUgLSAyMCkKCSAgICBvdXRfZmx1c2goKTsKI2lmZGVmIEhBVkVfVEdFVEVOVAoJdHB1dHMoKGNoYXIgKilzLCAxLCBUUFVUU0ZVTkNBU1Qgb3V0X2NoYXJfbmYpOwojZWxzZQoJd2hpbGUgKCpzKQoJICAgIG91dF9jaGFyX25mKCpzKyspOwojZW5kaWYKCgkvKiBGb3IgdGVzdGluZyB3ZSB3cml0ZSBvbmUgc3RyaW5nIGF0IGEgdGltZS4gKi8KCWlmIChwX3dkKQoJICAgIG91dF9mbHVzaCgpOwogICAgfQp9CgovKgogKiBjdXJzb3IgcG9zaXRpb25pbmcgdXNpbmcgdGVybWNhcCBwYXJzZXIuIChqdykKICovCiAgICB2b2lkCnRlcm1fd2luZGdvdG8ocm93LCBjb2wpCiAgICBpbnQJICAgIHJvdzsKICAgIGludAkgICAgY29sOwp7CiAgICBPVVRfU1RSKHRnb3RvKChjaGFyICopVF9DTSwgY29sLCByb3cpKTsKfQoKICAgIHZvaWQKdGVybV9jdXJzb3JfcmlnaHQoaSkKICAgIGludAkgICAgaTsKewogICAgT1VUX1NUUih0Z290bygoY2hhciAqKVRfQ1JJLCAwLCBpKSk7Cn0KCiAgICB2b2lkCnRlcm1fYXBwZW5kX2xpbmVzKGxpbmVfY291bnQpCiAgICBpbnQJICAgIGxpbmVfY291bnQ7CnsKICAgIE9VVF9TVFIodGdvdG8oKGNoYXIgKilUX0NBTCwgMCwgbGluZV9jb3VudCkpOwp9CgogICAgdm9pZAp0ZXJtX2RlbGV0ZV9saW5lcyhsaW5lX2NvdW50KQogICAgaW50CSAgICBsaW5lX2NvdW50Owp7CiAgICBPVVRfU1RSKHRnb3RvKChjaGFyICopVF9DREwsIDAsIGxpbmVfY291bnQpKTsKfQoKI2lmIGRlZmluZWQoSEFWRV9UR0VURU5UKSB8fCBkZWZpbmVkKFBST1RPKQogICAgdm9pZAp0ZXJtX3NldF93aW5wb3MoeCwgeSkKICAgIGludAkgICAgeDsKICAgIGludAkgICAgeTsKewogICAgLyogQ2FuJ3QgaGFuZGxlIGEgbmVnYXRpdmUgdmFsdWUgaGVyZSAqLwogICAgaWYgKHggPCAwKQoJeCA9IDA7CiAgICBpZiAoeSA8IDApCgl5ID0gMDsKICAgIE9VVF9TVFIodGdvdG8oKGNoYXIgKilUX0NXUCwgeSwgeCkpOwp9CgogICAgdm9pZAp0ZXJtX3NldF93aW5zaXplKHdpZHRoLCBoZWlnaHQpCiAgICBpbnQJICAgIHdpZHRoOwogICAgaW50CSAgICBoZWlnaHQ7CnsKICAgIE9VVF9TVFIodGdvdG8oKGNoYXIgKilUX0NXUywgaGVpZ2h0LCB3aWR0aCkpOwp9CiNlbmRpZgoKICAgIHZvaWQKdGVybV9mZ19jb2xvcihuKQogICAgaW50CSAgICBuOwp7CiAgICAvKiBVc2UgIkFGIiB0ZXJtY2FwIGVudHJ5IGlmIHByZXNlbnQsICJTZiIgZW50cnkgb3RoZXJ3aXNlICovCiAgICBpZiAoKlRfQ0FGKQoJdGVybV9jb2xvcihUX0NBRiwgbik7CiAgICBlbHNlIGlmICgqVF9DU0YpCgl0ZXJtX2NvbG9yKFRfQ1NGLCBuKTsKfQoKICAgIHZvaWQKdGVybV9iZ19jb2xvcihuKQogICAgaW50CSAgICBuOwp7CiAgICAvKiBVc2UgIkFCIiB0ZXJtY2FwIGVudHJ5IGlmIHByZXNlbnQsICJTYiIgZW50cnkgb3RoZXJ3aXNlICovCiAgICBpZiAoKlRfQ0FCKQoJdGVybV9jb2xvcihUX0NBQiwgbik7CiAgICBlbHNlIGlmICgqVF9DU0IpCgl0ZXJtX2NvbG9yKFRfQ1NCLCBuKTsKfQoKICAgIHN0YXRpYyB2b2lkCnRlcm1fY29sb3IocywgbikKICAgIGNoYXJfdQkqczsKICAgIGludAkJbjsKewogICAgY2hhcglidWZbMjBdOwogICAgaW50IGkgPSAyOwkvKiBpbmRleCBpbiBzW10ganVzdCBhZnRlciA8RXNjPlsgb3IgQ1NJICovCgogICAgLyogU3BlY2lhbCBoYW5kbGluZyBvZiAxNiBjb2xvcnMsIGJlY2F1c2UgdGVybWNhcCBjYW4ndCBoYW5kbGUgaXQgKi8KICAgIC8qIEFsc28gYWNjZXB0ICJcZVszJWRtIiBmb3IgVEVSTUlORk8sIGl0IGlzIHNvbWV0aW1lcyB1c2VkICovCiAgICAvKiBBbHNvIGFjY2VwdCBDU0kgaW5zdGVhZCBvZiA8RXNjPlsgKi8KICAgIGlmIChuID49IDggJiYgdF9jb2xvcnMgPj0gMTYKCSAgICAgICYmICgoc1swXSA9PSBFU0MgJiYgc1sxXSA9PSAnWycpIHx8IChzWzBdID09IENTSSAmJiAoaSA9IDEpID09IDEpKQoJICAgICAgJiYgc1tpXSAhPSBOVUwKCSAgICAgICYmIChTVFJDTVAocyArIGkgKyAxLCAiJXAxJWRtIikgPT0gMAoJCSAgfHwgU1RSQ01QKHMgKyBpICsgMSwgIiVkbSIpID09IDApCgkgICAgICAmJiAoc1tpXSA9PSAnMycgfHwgc1tpXSA9PSAnNCcpKQogICAgewoJc3ByaW50ZihidWYsCiNpZmRlZiBURVJNSU5GTwoJCSIlcyVzJSVwMSUlZG0iLAojZWxzZQoJCSIlcyVzJSVkbSIsCiNlbmRpZgoJCWkgPT0gMiA/IElGX0VCKCJcMDMzWyIsIEVTQ19TVFIgIlsiKSA6ICJcMjMzIiwKCQlzW2ldID09ICczJyA/IChuID49IDE2ID8gIjM4OzU7IiA6ICI5IikKCQkJICAgIDogKG4gPj0gMTYgPyAiNDg7NTsiIDogIjEwIikpOwoJT1VUX1NUUih0Z290byhidWYsIDAsIG4gPj0gMTYgPyBuIDogbiAtIDgpKTsKICAgIH0KICAgIGVsc2UKCU9VVF9TVFIodGdvdG8oKGNoYXIgKilzLCAwLCBuKSk7Cn0KCiNpZiAoZGVmaW5lZChGRUFUX1RJVExFKSAmJiAoZGVmaW5lZChVTklYKSB8fCBkZWZpbmVkKE9TMikgfHwgZGVmaW5lZChWTVMpIHx8IGRlZmluZWQoTUFDT1NfWCkpKSB8fCBkZWZpbmVkKFBST1RPKQovKgogKiBHZW5lcmljIGZ1bmN0aW9uIHRvIHNldCB3aW5kb3cgdGl0bGUsIHVzaW5nIHRfdHMgYW5kIHRfZnMuCiAqLwogICAgdm9pZAp0ZXJtX3NldHRpdGxlKHRpdGxlKQogICAgY2hhcl91CSp0aXRsZTsKewogICAgLyogdF90cyB0YWtlcyBvbmUgYXJndW1lbnQ6IGNvbHVtbiBpbiBzdGF0dXMgbGluZSAqLwogICAgT1VUX1NUUih0Z290bygoY2hhciAqKVRfVFMsIDAsIDApKTsJLyogc2V0IHRpdGxlIHN0YXJ0ICovCiAgICBvdXRfc3RyX25mKHRpdGxlKTsKICAgIG91dF9zdHIoVF9GUyk7CQkJLyogc2V0IHRpdGxlIGVuZCAqLwogICAgb3V0X2ZsdXNoKCk7Cn0KI2VuZGlmCgovKgogKiBNYWtlIHN1cmUgd2UgaGF2ZSBhIHZhbGlkIHNldCBvciB0ZXJtaW5hbCBvcHRpb25zLgogKiBSZXBsYWNlIGFsbCBlbnRyaWVzIHRoYXQgYXJlIE5VTEwgYnkgZW1wdHlfb3B0aW9uCiAqLwogICAgdm9pZAp0dGVzdChwYWlycykKICAgIGludAlwYWlyczsKewogICAgY2hlY2tfb3B0aW9ucygpOwkJICAgIC8qIG1ha2Ugc3VyZSBubyBvcHRpb25zIGFyZSBOVUxMICovCgogICAgLyoKICAgICAqIE1VU1QgaGF2ZSAiY20iOiBjdXJzb3IgbW90aW9uLgogICAgICovCiAgICBpZiAoKlRfQ00gPT0gTlVMKQoJRU1TRyhfKCJFNDM3OiB0ZXJtaW5hbCBjYXBhYmlsaXR5IFwiY21cIiByZXF1aXJlZCIpKTsKCiAgICAvKgogICAgICogaWYgImNzIiBkZWZpbmVkLCB1c2UgYSBzY3JvbGwgcmVnaW9uLCBpdCdzIGZhc3Rlci4KICAgICAqLwogICAgaWYgKCpUX0NTICE9IE5VTCkKCXNjcm9sbF9yZWdpb24gPSBUUlVFOwogICAgZWxzZQoJc2Nyb2xsX3JlZ2lvbiA9IEZBTFNFOwoKICAgIGlmIChwYWlycykKICAgIHsKCS8qCgkgKiBvcHRpb25hbCBwYWlycwoJICovCgkvKiBUUCBnb2VzIHRvIG5vcm1hbCBtb2RlIGZvciBUSSAoaW52ZXJ0KSBhbmQgVEIgKGJvbGQpICovCglpZiAoKlRfTUUgPT0gTlVMKQoJICAgIFRfTUUgPSBUX01SID0gVF9NRCA9IFRfTUIgPSBlbXB0eV9vcHRpb247CglpZiAoKlRfU08gPT0gTlVMIHx8ICpUX1NFID09IE5VTCkKCSAgICBUX1NPID0gVF9TRSA9IGVtcHR5X29wdGlvbjsKCWlmICgqVF9VUyA9PSBOVUwgfHwgKlRfVUUgPT0gTlVMKQoJICAgIFRfVVMgPSBUX1VFID0gZW1wdHlfb3B0aW9uOwoJaWYgKCpUX0NaSCA9PSBOVUwgfHwgKlRfQ1pSID09IE5VTCkKCSAgICBUX0NaSCA9IFRfQ1pSID0gZW1wdHlfb3B0aW9uOwoKCS8qIFRfVkUgaXMgbmVlZGVkIGV2ZW4gdGhvdWdoIFRfVkkgaXMgbm90IGRlZmluZWQgKi8KCWlmICgqVF9WRSA9PSBOVUwpCgkgICAgVF9WSSA9IGVtcHR5X29wdGlvbjsKCgkvKiBpZiAnbXInIG9yICdtZScgaXMgbm90IGRlZmluZWQgdXNlICdzbycgYW5kICdzZScgKi8KCWlmICgqVF9NRSA9PSBOVUwpCgl7CgkgICAgVF9NRSA9IFRfU0U7CgkgICAgVF9NUiA9IFRfU087CgkgICAgVF9NRCA9IFRfU087Cgl9CgoJLyogaWYgJ3NvJyBvciAnc2UnIGlzIG5vdCBkZWZpbmVkIHVzZSAnbXInIGFuZCAnbWUnICovCglpZiAoKlRfU08gPT0gTlVMKQoJewoJICAgIFRfU0UgPSBUX01FOwoJICAgIGlmICgqVF9NUiA9PSBOVUwpCgkJVF9TTyA9IFRfTUQ7CgkgICAgZWxzZQoJCVRfU08gPSBUX01SOwoJfQoKCS8qIGlmICdaSCcgb3IgJ1pSJyBpcyBub3QgZGVmaW5lZCB1c2UgJ21yJyBhbmQgJ21lJyAqLwoJaWYgKCpUX0NaSCA9PSBOVUwpCgl7CgkgICAgVF9DWlIgPSBUX01FOwoJICAgIGlmICgqVF9NUiA9PSBOVUwpCgkJVF9DWkggPSBUX01EOwoJICAgIGVsc2UKCQlUX0NaSCA9IFRfTVI7Cgl9CgoJLyogIlNiIiBhbmQgIlNmIiBjb21lIGluIHBhaXJzICovCglpZiAoKlRfQ1NCID09IE5VTCB8fCAqVF9DU0YgPT0gTlVMKQoJewoJICAgIFRfQ1NCID0gZW1wdHlfb3B0aW9uOwoJICAgIFRfQ1NGID0gZW1wdHlfb3B0aW9uOwoJfQoKCS8qICJBQiIgYW5kICJBRiIgY29tZSBpbiBwYWlycyAqLwoJaWYgKCpUX0NBQiA9PSBOVUwgfHwgKlRfQ0FGID09IE5VTCkKCXsKCSAgICBUX0NBQiA9IGVtcHR5X29wdGlvbjsKCSAgICBUX0NBRiA9IGVtcHR5X29wdGlvbjsKCX0KCgkvKiBpZiAnU2InIGFuZCAnQUInIGFyZSBub3QgZGVmaW5lZCwgcmVzZXQgIkNvIiAqLwoJaWYgKCpUX0NTQiA9PSBOVUwgJiYgKlRfQ0FCID09IE5VTCkKCSAgICBUX0NDTyA9IGVtcHR5X29wdGlvbjsKCgkvKiBTZXQgJ3dlaXJkaW52ZXJ0JyBhY2NvcmRpbmcgdG8gdmFsdWUgb2YgJ3RfeHMnICovCglwX3dpdiA9ICgqVF9YUyAhPSBOVUwpOwogICAgfQogICAgbmVlZF9nYXRoZXIgPSBUUlVFOwoKICAgIC8qIFNldCB0X2NvbG9ycyB0byB0aGUgdmFsdWUgb2YgdF9Dby4gKi8KICAgIHRfY29sb3JzID0gYXRvaSgoY2hhciAqKVRfQ0NPKTsKfQoKI2lmIChkZWZpbmVkKEZFQVRfR1VJKSAmJiAoZGVmaW5lZChGRUFUX01FTlUpIHx8ICFkZWZpbmVkKFVTRV9PTl9GTFlfU0NST0xMKSkpIFwKCXx8IGRlZmluZWQoUFJPVE8pCi8qCiAqIFJlcHJlc2VudCB0aGUgZ2l2ZW4gbG9uZ191IGFzIGluZGl2aWR1YWwgYnl0ZXMsIHdpdGggdGhlIG1vc3Qgc2lnbmlmaWNhbnQKICogYnl0ZSBmaXJzdCwgYW5kIHN0b3JlIHRoZW0gaW4gZHN0LgogKi8KICAgIHZvaWQKYWRkX2xvbmdfdG9fYnVmKHZhbCwgZHN0KQogICAgbG9uZ191ICB2YWw7CiAgICBjaGFyX3UgICpkc3Q7CnsKICAgIGludAkgICAgaTsKICAgIGludAkgICAgc2hpZnQ7CgogICAgZm9yIChpID0gMTsgaSA8PSBzaXplb2YobG9uZ191KTsgaSsrKQogICAgewoJc2hpZnQgPSA4ICogKHNpemVvZihsb25nX3UpIC0gaSk7Cglkc3RbaSAtIDFdID0gKGNoYXJfdSkgKCh2YWwgPj4gc2hpZnQpICYgMHhmZik7CiAgICB9Cn0KCnN0YXRpYyBpbnQgZ2V0X2xvbmdfZnJvbV9idWYgX19BUkdTKChjaGFyX3UgKmJ1ZiwgbG9uZ191ICp2YWwpKTsKCi8qCiAqIEludGVycHJldCB0aGUgbmV4dCBzdHJpbmcgb2YgYnl0ZXMgaW4gYnVmIGFzIGEgbG9uZyBpbnRlZ2VyLCB3aXRoIHRoZSBtb3N0CiAqIHNpZ25pZmljYW50IGJ5dGUgZmlyc3QuICBOb3RlIHRoYXQgaXQgaXMgYXNzdW1lZCB0aGF0IGJ1ZiBoYXMgYmVlbiB0aHJvdWdoCiAqIGluY2hhcigpLCBzbyB0aGF0IE5VTCBhbmQgS19TUEVDSUFMIHdpbGwgYmUgcmVwcmVzZW50ZWQgYXMgdGhyZWUgYnl0ZXMgZWFjaC4KICogUHV0cyByZXN1bHQgaW4gdmFsLCBhbmQgcmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlYWQgZnJvbSBidWYKICogKGJldHdlZW4gc2l6ZW9mKGxvbmdfdSkgYW5kIDIgKiBzaXplb2YobG9uZ191KSksIG9yIC0xIGlmIG5vdCBlbm91Z2ggYnl0ZXMKICogd2VyZSBwcmVzZW50LgogKi8KICAgIHN0YXRpYyBpbnQKZ2V0X2xvbmdfZnJvbV9idWYoYnVmLCB2YWwpCiAgICBjaGFyX3UgICpidWY7CiAgICBsb25nX3UgICp2YWw7CnsKICAgIGludAkgICAgbGVuOwogICAgY2hhcl91ICBieXRlc1tzaXplb2YobG9uZ191KV07CiAgICBpbnQJICAgIGk7CiAgICBpbnQJICAgIHNoaWZ0OwoKICAgICp2YWwgPSAwOwogICAgbGVuID0gZ2V0X2J5dGVzX2Zyb21fYnVmKGJ1ZiwgYnl0ZXMsIChpbnQpc2l6ZW9mKGxvbmdfdSkpOwogICAgaWYgKGxlbiAhPSAtMSkKICAgIHsKCWZvciAoaSA9IDA7IGkgPCBzaXplb2YobG9uZ191KTsgaSsrKQoJewoJICAgIHNoaWZ0ID0gOCAqIChzaXplb2YobG9uZ191KSAtIDEgLSBpKTsKCSAgICAqdmFsICs9IChsb25nX3UpYnl0ZXNbaV0gPDwgc2hpZnQ7Cgl9CiAgICB9CiAgICByZXR1cm4gbGVuOwp9CiNlbmRpZgoKI2lmIGRlZmluZWQoRkVBVF9HVUkpIFwKICAgIHx8IChkZWZpbmVkKEZFQVRfTU9VU0UpICYmICghZGVmaW5lZChVTklYKSB8fCBkZWZpbmVkKEZFQVRfTU9VU0VfWFRFUk0pKSkKLyoKICogUmVhZCB0aGUgbmV4dCBudW1fYnl0ZXMgYnl0ZXMgZnJvbSBidWYsIGFuZCBzdG9yZSB0aGVtIGluIGJ5dGVzLiAgQXNzdW1lCiAqIHRoYXQgYnVmIGhhcyBiZWVuIHRocm91Z2ggaW5jaGFyKCkuCVJldHVybnMgdGhlIGFjdHVhbCBudW1iZXIgb2YgYnl0ZXMgdXNlZAogKiBmcm9tIGJ1ZiAoYmV0d2VlbiBudW1fYnl0ZXMgYW5kIG51bV9ieXRlcyoyKSwgb3IgLTEgaWYgbm90IGVub3VnaCBieXRlcyB3ZXJlCiAqIGF2YWlsYWJsZS4KICovCiAgICBzdGF0aWMgaW50CmdldF9ieXRlc19mcm9tX2J1ZihidWYsIGJ5dGVzLCBudW1fYnl0ZXMpCiAgICBjaGFyX3UgICpidWY7CiAgICBjaGFyX3UgICpieXRlczsKICAgIGludAkgICAgbnVtX2J5dGVzOwp7CiAgICBpbnQJICAgIGxlbiA9IDA7CiAgICBpbnQJICAgIGk7CiAgICBjaGFyX3UgIGM7CgogICAgZm9yIChpID0gMDsgaSA8IG51bV9ieXRlczsgaSsrKQogICAgewoJaWYgKChjID0gYnVmW2xlbisrXSkgPT0gTlVMKQoJICAgIHJldHVybiAtMTsKCWlmIChjID09IEtfU1BFQ0lBTCkKCXsKCSAgICBpZiAoYnVmW2xlbl0gPT0gTlVMIHx8IGJ1ZltsZW4gKyAxXSA9PSBOVUwpCSAgICAvKiBjYW5ub3QgaGFwcGVuPyAqLwoJCXJldHVybiAtMTsKCSAgICBpZiAoYnVmW2xlbisrXSA9PSAoaW50KUtTX1pFUk8pCgkJYyA9IE5VTDsKCSAgICArK2xlbjsJLyogc2tpcCBLRV9GSUxMRVIgKi8KCSAgICAvKiBlbHNlIGl0IHNob3VsZCBiZSBLU19TUEVDSUFMLCBhbmQgYyBhbHJlYWR5IGVxdWFscyBLX1NQRUNJQUwgKi8KCX0KCWJ5dGVzW2ldID0gYzsKICAgIH0KICAgIHJldHVybiBsZW47Cn0KI2VuZGlmCgovKgogKiBDaGVjayBpZiB0aGUgbmV3IHNoZWxsIHNpemUgaXMgdmFsaWQsIGNvcnJlY3QgaXQgaWYgaXQncyB0b28gc21hbGwuCiAqLwogICAgdm9pZApjaGVja19zaGVsbHNpemUoKQp7CiAgICBpZiAoQ29sdW1ucyA8IE1JTl9DT0xVTU5TKQoJQ29sdW1ucyA9IE1JTl9DT0xVTU5TOwogICAgaWYgKFJvd3MgPCBtaW5fcm93cygpKQkvKiBuZWVkIHJvb20gZm9yIG9uZSB3aW5kb3cgYW5kIGNvbW1hbmQgbGluZSAqLwoJUm93cyA9IG1pbl9yb3dzKCk7Cn0KCi8qCiAqIEludm9rZWQganVzdCBiZWZvcmUgdGhlIHNjcmVlbiBzdHJ1Y3R1cmVzIGFyZSBnb2luZyB0byBiZSAocmUpYWxsb2NhdGVkLgogKi8KICAgIHZvaWQKd2luX25ld19zaGVsbHNpemUoKQp7CiAgICBzdGF0aWMgaW50CW9sZF9Sb3dzID0gMDsKICAgIHN0YXRpYyBpbnQJb2xkX0NvbHVtbnMgPSAwOwoKICAgIGlmIChvbGRfUm93cyAhPSBSb3dzIHx8IG9sZF9Db2x1bW5zICE9IENvbHVtbnMpCgl1aV9uZXdfc2hlbGxzaXplKCk7CiAgICBpZiAob2xkX1Jvd3MgIT0gUm93cykKICAgIHsKCW9sZF9Sb3dzID0gUm93czsKCXNoZWxsX25ld19yb3dzKCk7CS8qIHVwZGF0ZSB3aW5kb3cgc2l6ZXMgKi8KICAgIH0KICAgIGlmIChvbGRfQ29sdW1ucyAhPSBDb2x1bW5zKQogICAgewoJb2xkX0NvbHVtbnMgPSBDb2x1bW5zOwojaWZkZWYgRkVBVF9WRVJUU1BMSVQKCXNoZWxsX25ld19jb2x1bW5zKCk7CS8qIHVwZGF0ZSB3aW5kb3cgc2l6ZXMgKi8KI2VuZGlmCiAgICB9Cn0KCi8qCiAqIENhbGwgdGhpcyBmdW5jdGlvbiB3aGVuIHRoZSBWaW0gc2hlbGwgaGFzIGJlZW4gcmVzaXplZCBpbiBhbnkgd2F5LgogKiBXaWxsIG9idGFpbiB0aGUgY3VycmVudCBzaXplIGFuZCByZWRyYXcgKGFsc28gd2hlbiBzaXplIGRpZG4ndCBjaGFuZ2UpLgogKi8KICAgIHZvaWQKc2hlbGxfcmVzaXplZCgpCnsKICAgIHNldF9zaGVsbHNpemUoMCwgMCwgRkFMU0UpOwp9CgovKgogKiBDaGVjayBpZiB0aGUgc2hlbGwgc2l6ZSBjaGFuZ2VkLiAgSGFuZGxlIGEgcmVzaXplLgogKiBXaGVuIHRoZSBzaXplIGRpZG4ndCBjaGFuZ2UsIG5vdGhpbmcgaGFwcGVucy4KICovCiAgICB2b2lkCnNoZWxsX3Jlc2l6ZWRfY2hlY2soKQp7CiAgICBpbnQJCW9sZF9Sb3dzID0gUm93czsKICAgIGludAkJb2xkX0NvbHVtbnMgPSBDb2x1bW5zOwoKICAgICh2b2lkKXVpX2dldF9zaGVsbHNpemUoKTsKICAgIGNoZWNrX3NoZWxsc2l6ZSgpOwogICAgaWYgKG9sZF9Sb3dzICE9IFJvd3MgfHwgb2xkX0NvbHVtbnMgIT0gQ29sdW1ucykKCXNoZWxsX3Jlc2l6ZWQoKTsKfQoKLyoKICogU2V0IHNpemUgb2YgdGhlIFZpbSBzaGVsbC4KICogSWYgJ211c3RzZXQnIGlzIFRSVUUsIHdlIG11c3Qgc2V0IFJvd3MgYW5kIENvbHVtbnMsIGRvIG5vdCBnZXQgdGhlIHJlYWwKICogd2luZG93IHNpemUgKHRoaXMgaXMgdXNlZCBmb3IgdGhlIDp3aW4gY29tbWFuZCkuCiAqIElmICdtdXN0c2V0JyBpcyBGQUxTRSwgd2UgbWF5IHRyeSB0byBnZXQgdGhlIHJlYWwgd2luZG93IHNpemUgYW5kIGlmCiAqIGl0IGZhaWxzIHVzZSAnd2lkdGgnIGFuZCAnaGVpZ2h0Jy4KICovCiAgICB2b2lkCnNldF9zaGVsbHNpemUod2lkdGgsIGhlaWdodCwgbXVzdHNldCkKICAgIGludAkgICAgd2lkdGgsIGhlaWdodDsKICAgIGludAkgICAgbXVzdHNldDsKewogICAgc3RhdGljIGludAkJYnVzeSA9IEZBTFNFOwoKICAgIC8qCiAgICAgKiBBdm9pZCByZWN1cnNpdmVuZXNzLCBjYW4gaGFwcGVuIHdoZW4gc2V0dGluZyB0aGUgd2luZG93IHNpemUgY2F1c2VzCiAgICAgKiBhbm90aGVyIHdpbmRvdy1jaGFuZ2VkIHNpZ25hbC4KICAgICAqLwogICAgaWYgKGJ1c3kpCglyZXR1cm47CgogICAgaWYgKHdpZHRoIDwgMCB8fCBoZWlnaHQgPCAwKSAgICAvKiBqdXN0IGNoZWNraW5nLi4uICovCglyZXR1cm47CgogICAgaWYgKFN0YXRlID09IEhJVFJFVFVSTiB8fCBTdGF0ZSA9PSBTRVRXU0laRSkgLyogcG9zdHBvbmUgdGhlIHJlc2l6aW5nICovCiAgICB7CglTdGF0ZSA9IFNFVFdTSVpFOwoJcmV0dXJuOwogICAgfQoKICAgICsrYnVzeTsKCiNpZmRlZiBBTUlHQQogICAgb3V0X2ZsdXNoKCk7CSAgICAvKiBtdXN0IGRvIHRoaXMgYmVmb3JlIG1jaF9nZXRfc2hlbGxzaXplKCkgZm9yCgkJCSAgICAgICBzb21lIG9ic2N1cmUgcmVhc29uICovCiNlbmRpZgoKICAgIGlmIChtdXN0c2V0IHx8ICh1aV9nZXRfc2hlbGxzaXplKCkgPT0gRkFJTCAmJiBoZWlnaHQgIT0gMCkpCiAgICB7CglSb3dzID0gaGVpZ2h0OwoJQ29sdW1ucyA9IHdpZHRoOwoJY2hlY2tfc2hlbGxzaXplKCk7Cgl1aV9zZXRfc2hlbGxzaXplKG11c3RzZXQpOwogICAgfQogICAgZWxzZQoJY2hlY2tfc2hlbGxzaXplKCk7CgogICAgLyogVGhlIHdpbmRvdyBsYXlvdXQgdXNlZCB0byBiZSBhZGp1c3RlZCBoZXJlLCBidXQgaXQgbm93IGhhcHBlbnMgaW4KICAgICAqIHNjcmVlbmFsbG9jKCkgKGFsc28gaW52b2tlZCBmcm9tIHNjcmVlbmNsZWFyKCkpLiAgVGhhdCBpcyBiZWNhdXNlIHRoZQogICAgICogImJ1c3kiIGNoZWNrIGFib3ZlIG1heSBza2lwIHRoaXMsIGJ1dCBub3Qgc2NyZWVuYWxsb2MoKS4gKi8KCiAgICBpZiAoU3RhdGUgIT0gQVNLTU9SRSAmJiBTdGF0ZSAhPSBFWFRFUk5DTUQgJiYgU3RhdGUgIT0gQ09ORklSTSkKCXNjcmVlbmNsZWFyKCk7CiAgICBlbHNlCglzY3JlZW5fc3RhcnQoKTsJICAgIC8qIGRvbid0IGtub3cgd2hlcmUgY3Vyc29yIGlzIG5vdyAqLwoKICAgIGlmIChzdGFydGluZyAhPSBOT19TQ1JFRU4pCiAgICB7CiNpZmRlZiBGRUFUX1RJVExFCgltYWtldGl0bGUoKTsKI2VuZGlmCgljaGFuZ2VkX2xpbmVfYWJ2X2N1cnMoKTsKCWludmFsaWRhdGVfYm90bGluZSgpOwoKCS8qCgkgKiBXZSBvbmx5IHJlZHJhdyB3aGVuIGl0J3MgbmVlZGVkOgoJICogLSBXaGlsZSBhdCB0aGUgbW9yZSBwcm9tcHQgb3IgZXhlY3V0aW5nIGFuIGV4dGVybmFsIGNvbW1hbmQsIGRvbid0CgkgKiAgIHJlZHJhdywgYnV0IHBvc2l0aW9uIHRoZSBjdXJzb3IuCgkgKiAtIFdoaWxlIGVkaXRpbmcgdGhlIGNvbW1hbmQgbGluZSwgb25seSByZWRyYXcgdGhhdC4KCSAqIC0gaW4gRXggbW9kZSwgZG9uJ3QgcmVkcmF3IGFueXRoaW5nLgoJICogLSBPdGhlcndpc2UsIHJlZHJhdyByaWdodCBub3csIGFuZCBwb3NpdGlvbiB0aGUgY3Vyc29yLgoJICogQWx3YXlzIG5lZWQgdG8gY2FsbCB1cGRhdGVfc2NyZWVuKCkgb3Igc2NyZWVuYWxsb2MoKSwgdG8gbWFrZQoJICogc3VyZSBSb3dzL0NvbHVtbnMgYW5kIHRoZSBzaXplIG9mIFNjcmVlbkxpbmVzW10gaXMgY29ycmVjdCEKCSAqLwoJaWYgKFN0YXRlID09IEFTS01PUkUgfHwgU3RhdGUgPT0gRVhURVJOQ01EIHx8IFN0YXRlID09IENPTkZJUk0KCQkJCQkJCSAgICAgfHwgZXhtb2RlX2FjdGl2ZSkKCXsKCSAgICBzY3JlZW5hbGxvYyhGQUxTRSk7CgkgICAgcmVwZWF0X21lc3NhZ2UoKTsKCX0KCWVsc2UgaWYgKFN0YXRlICYgQ01ETElORSkKCXsKCSAgICB1cGRhdGVfc2NyZWVuKE5PVF9WQUxJRCk7CgkgICAgcmVkcmF3Y21kbGluZSgpOwoJfQoJZWxzZQoJewoJICAgIHVwZGF0ZV90b3BsaW5lKCk7CgkgICAgdXBkYXRlX3NjcmVlbihOT1RfVkFMSUQpOwoJICAgIGlmIChyZWRyYXdpbmcoKSkKCQlzZXRjdXJzb3IoKTsKCX0KCWN1cnNvcl9vbigpOwkgICAgLyogcmVkcmF3aW5nIG1heSBoYXZlIHN3aXRjaGVkIGl0IG9mZiAqLwogICAgfQogICAgb3V0X2ZsdXNoKCk7CiAgICAtLWJ1c3k7Cn0KCi8qCiAqIFNldCB0aGUgdGVybWluYWwgdG8gVE1PREVfUkFXIChmb3IgTm9ybWFsIG1vZGUpIG9yIFRNT0RFX0NPT0sgKGZvciBleHRlcm5hbAogKiBjb21tYW5kcyBhbmQgRXggbW9kZSkuCiAqLwogICAgdm9pZApzZXR0bW9kZSh0bW9kZSkKICAgIGludAkgdG1vZGU7CnsKI2lmZGVmIEZFQVRfR1VJCiAgICAvKiBkb24ndCBzZXQgdGhlIHRlcm0gd2hlcmUgZ3ZpbSB3YXMgc3RhcnRlZCB0byBhbnkgbW9kZSAqLwogICAgaWYgKGd1aS5pbl91c2UpCglyZXR1cm47CiNlbmRpZgoKICAgIGlmIChmdWxsX3NjcmVlbikKICAgIHsKCS8qIEluIEV4IG1vZGUsIG5ldmVyIHNldCB0byBSQVcgKi8KCWlmIChleG1vZGVfYWN0aXZlID09IEVYTU9ERV9OT1JNQUwpCgkgICAgdG1vZGUgPSBUTU9ERV9DT09LOwoKCS8qCgkgKiBXaGVuIHJldHVybmluZyBhZnRlciBjYWxsaW5nIGEgc2hlbGwgd2Ugd2FudCB0byByZWFsbHkgc2V0IHRoZQoJICogdGVybWluYWwgdG8gcmF3IG1vZGUsIGV2ZW4gdGhvdWdoIHdlIHRoaW5rIGl0IGFscmVhZHkgaXMsIGJlY2F1c2UKCSAqIHRoZSBzaGVsbCBwcm9ncmFtIG1heSBoYXZlIHJlc2V0IHRoZSB0ZXJtaW5hbCBtb2RlLgoJICogV2hlbiB3ZSB0aGluayB0aGUgdGVybWluYWwgaXMgbm9ybWFsLCBkb24ndCB0cnkgdG8gc2V0IGl0IHRvCgkgKiBub3JtYWwgYWdhaW4sIGJlY2F1c2UgdGhhdCBjYXVzZXMgcHJvYmxlbXMgKGxvZ291dCEpIG9uIHNvbWUKCSAqIG1hY2hpbmVzLgoJICovCglpZiAodG1vZGUgIT0gVE1PREVfQ09PSyB8fCBjdXJfdG1vZGUgIT0gVE1PREVfQ09PSykKCXsKI2lmZGVmIEZFQVRfVEVSTVJFU1BPTlNFCgkgICAgLyogTWF5IG5lZWQgdG8gY2hlY2sgZm9yIFRfQ1JWIHJlc3BvbnNlIGFuZCB0ZXJtY29kZXMsIGl0IGRvZXNuJ3QKCSAgICAgKiB3b3JrIGluIENvb2tlZCBtb2RlLCBhbiBleHRlcm5hbCBwcm9ncmFtIG1heSBnZXQgdGhlbS4gKi8KCSAgICBpZiAodG1vZGUgIT0gVE1PREVfUkFXICYmIGNydl9zdGF0dXMgPT0gQ1JWX1NFTlQpCgkJKHZvaWQpdnBlZWtjX25vbWFwKCk7CgkgICAgY2hlY2tfZm9yX2NvZGVzX2Zyb21fdGVybSgpOwojZW5kaWYKI2lmZGVmIEZFQVRfTU9VU0VfVFRZCgkgICAgaWYgKHRtb2RlICE9IFRNT0RFX1JBVykKCQltY2hfc2V0bW91c2UoRkFMU0UpOwkJLyogc3dpdGNoIG1vdXNlIG9mZiAqLwojZW5kaWYKCSAgICBvdXRfZmx1c2goKTsKCSAgICBtY2hfc2V0dG1vZGUodG1vZGUpOyAgICAvKiBtYWNoaW5lIHNwZWNpZmljIGZ1bmN0aW9uICovCgkgICAgY3VyX3Rtb2RlID0gdG1vZGU7CiNpZmRlZiBGRUFUX01PVVNFCgkgICAgaWYgKHRtb2RlID09IFRNT0RFX1JBVykKCQlzZXRtb3VzZSgpOwkJCS8qIG1heSBzd2l0Y2ggbW91c2Ugb24gKi8KI2VuZGlmCgkgICAgb3V0X2ZsdXNoKCk7Cgl9CiNpZmRlZiBGRUFUX1RFUk1SRVNQT05TRQoJbWF5X3JlcV90ZXJtcmVzcG9uc2UoKTsKI2VuZGlmCiAgICB9Cn0KCiAgICB2b2lkCnN0YXJ0dGVybWNhcCgpCnsKICAgIGlmIChmdWxsX3NjcmVlbiAmJiAhdGVybWNhcF9hY3RpdmUpCiAgICB7CglvdXRfc3RyKFRfVEkpOwkJCS8qIHN0YXJ0IHRlcm1jYXAgbW9kZSAqLwoJb3V0X3N0cihUX0tTKTsJCQkvKiBzdGFydCAia2V5cGFkIHRyYW5zbWl0IiBtb2RlICovCglvdXRfZmx1c2goKTsKCXRlcm1jYXBfYWN0aXZlID0gVFJVRTsKCXNjcmVlbl9zdGFydCgpOwkJCS8qIGRvbid0IGtub3cgd2hlcmUgY3Vyc29yIGlzIG5vdyAqLwojaWZkZWYgRkVBVF9URVJNUkVTUE9OU0UKCW1heV9yZXFfdGVybXJlc3BvbnNlKCk7CgkvKiBJbW1lZGlhdGVseSBjaGVjayBmb3IgYSByZXNwb25zZS4gIElmIHRfQ28gY2hhbmdlcywgd2UgZG9uJ3Qgd2FudAoJICogdG8gcmVkcmF3IHdpdGggd3JvbmcgY29sb3JzIGZpcnN0LiAqLwoJY2hlY2tfZm9yX2NvZGVzX2Zyb21fdGVybSgpOwojZW5kaWYKICAgIH0KfQoKICAgIHZvaWQKc3RvcHRlcm1jYXAoKQp7CiAgICBzY3JlZW5fc3RvcF9oaWdobGlnaHQoKTsKICAgIHJlc2V0X2N0ZXJtX2NvbG9ycygpOwogICAgaWYgKHRlcm1jYXBfYWN0aXZlKQogICAgewojaWZkZWYgRkVBVF9URVJNUkVTUE9OU0UKCS8qIE1heSBuZWVkIHRvIGNoZWNrIGZvciBUX0NSViByZXNwb25zZS4gKi8KCWlmIChjcnZfc3RhdHVzID09IENSVl9TRU5UKQoJICAgICh2b2lkKXZwZWVrY19ub21hcCgpOwoJLyogQ2hlY2sgZm9yIHRlcm1jb2RlcyBmaXJzdCwgb3RoZXJ3aXNlIGFuIGV4dGVybmFsIHByb2dyYW0gbWF5IGdldAoJICogdGhlbS4gKi8KCWNoZWNrX2Zvcl9jb2Rlc19mcm9tX3Rlcm0oKTsKI2VuZGlmCglvdXRfc3RyKFRfS0UpOwkJCS8qIHN0b3AgImtleXBhZCB0cmFuc21pdCIgbW9kZSAqLwoJb3V0X2ZsdXNoKCk7Cgl0ZXJtY2FwX2FjdGl2ZSA9IEZBTFNFOwoJY3Vyc29yX29uKCk7CQkJLyoganVzdCBpbiBjYXNlIGl0IGlzIHN0aWxsIG9mZiAqLwoJb3V0X3N0cihUX1RFKTsJCQkvKiBzdG9wIHRlcm1jYXAgbW9kZSAqLwoJc2NyZWVuX3N0YXJ0KCk7CQkJLyogZG9uJ3Qga25vdyB3aGVyZSBjdXJzb3IgaXMgbm93ICovCglvdXRfZmx1c2goKTsKICAgIH0KfQoKI2lmZGVmIEZFQVRfVEVSTVJFU1BPTlNFCi8qCiAqIFJlcXVlc3QgdmVyc2lvbiBzdHJpbmcgKGZvciB4dGVybSkgd2hlbiBuZWVkZWQuCiAqIE9ubHkgZG8gdGhpcyBhZnRlciBzd2l0Y2hpbmcgdG8gcmF3IG1vZGUsIG90aGVyd2lzZSB0aGUgcmVzdWx0IHdpbGwgYmUKICogZWNob2VkLgogKiBPbmx5IGRvIHRoaXMgYWZ0ZXIgdGVybWNhcCBtb2RlIGhhcyBiZWVuIHN0YXJ0ZWQsIG90aGVyd2lzZSB0aGUgY29kZXMgZm9yCiAqIHRoZSBjdXJzb3Iga2V5cyBtYXkgYmUgd3JvbmcuCiAqIFRoZSByZXN1bHQgaXMgY2F1Z2h0IGluIGNoZWNrX3Rlcm1jb2RlKCkuCiAqLwogICAgc3RhdGljIHZvaWQKbWF5X3JlcV90ZXJtcmVzcG9uc2UoKQp7CiAgICBpZiAoY3J2X3N0YXR1cyA9PSBDUlZfR0VUCgkgICAgJiYgY3VyX3Rtb2RlID09IFRNT0RFX1JBVwoJICAgICYmIHRlcm1jYXBfYWN0aXZlCiNpZmRlZiBVTklYCgkgICAgJiYgaXNhdHR5KDEpCiNlbmRpZgoJICAgICYmICpUX0NSViAhPSBOVUwpCiAgICB7CglvdXRfc3RyKFRfQ1JWKTsKCWNydl9zdGF0dXMgPSBDUlZfU0VOVDsKCS8qIGNoZWNrIGZvciB0aGUgY2hhcmFjdGVycyBub3csIG90aGVyd2lzZSB0aGV5IG1pZ2h0IGJlIGVhdGVuIGJ5CgkgKiBnZXRfa2V5c3Ryb2tlKCkgKi8KCW91dF9mbHVzaCgpOwoJKHZvaWQpdnBlZWtjX25vbWFwKCk7CiAgICB9Cn0KI2VuZGlmCgovKgogKiBSZXR1cm4gVFJVRSB3aGVuIHNhdmluZyBhbmQgcmVzdG9yaW5nIHRoZSBzY3JlZW4uCiAqLwogICAgaW50CnN3YXBwaW5nX3NjcmVlbigpCnsKICAgIHJldHVybiAoZnVsbF9zY3JlZW4gJiYgKlRfVEkgIT0gTlVMKTsKfQoKI2lmZGVmIEZFQVRfTU9VU0UKLyoKICogc2V0bW91c2UoKSAtIHN3aXRjaCBtb3VzZSBvbi9vZmYgZGVwZW5kaW5nIG9uIGN1cnJlbnQgbW9kZSBhbmQgJ21vdXNlJwogKi8KICAgIHZvaWQKc2V0bW91c2UoKQp7CiMgaWZkZWYgRkVBVF9NT1VTRV9UVFkKICAgIGludAkgICAgY2hlY2tmb3I7CiMgZW5kaWYKCiMgaWZkZWYgRkVBVF9NT1VTRVNIQVBFCiAgICB1cGRhdGVfbW91c2VzaGFwZSgtMSk7CiMgZW5kaWYKCiMgaWZkZWYgRkVBVF9NT1VTRV9UVFkgLyogU2hvdWxkIGJlIG91dHNpZGUgcHJvYywgYnV0IG1heSBicmVhayBNT1VTRVNIQVBFICovCiMgIGlmZGVmIEZFQVRfR1VJCiAgICAvKiBJbiB0aGUgR1VJIHRoZSBtb3VzZSBpcyBhbHdheXMgZW5hYmxlZC4gKi8KICAgIGlmIChndWkuaW5fdXNlKQoJcmV0dXJuOwojICBlbmRpZgogICAgLyogYmUgcXVpY2sgd2hlbiBtb3VzZSBpcyBvZmYgKi8KICAgIGlmICgqcF9tb3VzZSA9PSBOVUwgfHwgaGFzX21vdXNlX3Rlcm1jb2RlID09IDApCglyZXR1cm47CgogICAgLyogZG9uJ3Qgc3dpdGNoIG1vdXNlIG9uIHdoZW4gbm90IGluIHJhdyBtb2RlIChFeCBtb2RlKSAqLwogICAgaWYgKGN1cl90bW9kZSAhPSBUTU9ERV9SQVcpCiAgICB7CgltY2hfc2V0bW91c2UoRkFMU0UpOwoJcmV0dXJuOwogICAgfQoKIyAgaWZkZWYgRkVBVF9WSVNVQUwKICAgIGlmIChWSXN1YWxfYWN0aXZlKQoJY2hlY2tmb3IgPSBNT1VTRV9WSVNVQUw7CiAgICBlbHNlCiMgIGVuZGlmCglpZiAoU3RhdGUgPT0gSElUUkVUVVJOIHx8IFN0YXRlID09IEFTS01PUkUgfHwgU3RhdGUgPT0gU0VUV1NJWkUpCgljaGVja2ZvciA9IE1PVVNFX1JFVFVSTjsKICAgIGVsc2UgaWYgKFN0YXRlICYgSU5TRVJUKQoJY2hlY2tmb3IgPSBNT1VTRV9JTlNFUlQ7CiAgICBlbHNlIGlmIChTdGF0ZSAmIENNRExJTkUpCgljaGVja2ZvciA9IE1PVVNFX0NPTU1BTkQ7CiAgICBlbHNlIGlmIChTdGF0ZSA9PSBDT05GSVJNIHx8IFN0YXRlID09IEVYVEVSTkNNRCkKCWNoZWNrZm9yID0gJyAnOyAvKiBkb24ndCB1c2UgbW91c2UgZm9yICI6Y29uZmlybSIgb3IgIjohY21kIiAqLwogICAgZWxzZQoJY2hlY2tmb3IgPSBNT1VTRV9OT1JNQUw7ICAgIC8qIGFzc3VtZSBub3JtYWwgbW9kZSAqLwoKICAgIGlmIChtb3VzZV9oYXMoY2hlY2tmb3IpKQoJbWNoX3NldG1vdXNlKFRSVUUpOwogICAgZWxzZQoJbWNoX3NldG1vdXNlKEZBTFNFKTsKIyBlbmRpZgp9CgovKgogKiBSZXR1cm4gVFJVRSBpZgogKiAtICJjIiBpcyBpbiAnbW91c2UnLCBvcgogKiAtICdhJyBpcyBpbiAnbW91c2UnIGFuZCAiYyIgaXMgaW4gTU9VU0VfQSwgb3IKICogLSB0aGUgY3VycmVudCBidWZmZXIgaXMgYSBoZWxwIGZpbGUgYW5kICdoJyBpcyBpbiAnbW91c2UnIGFuZCB3ZSBhcmUgaW4gYQogKiAgIG5vcm1hbCBlZGl0aW5nIG1vZGUgKG5vdCBhdCBoaXQtcmV0dXJuIG1lc3NhZ2UpLgogKi8KICAgIGludAptb3VzZV9oYXMoYykKICAgIGludAkgICAgYzsKewogICAgY2hhcl91CSpwOwoKICAgIGZvciAocCA9IHBfbW91c2U7ICpwOyArK3ApCglzd2l0Y2ggKCpwKQoJewoJICAgIGNhc2UgJ2EnOiBpZiAodmltX3N0cmNocigoY2hhcl91ICopTU9VU0VfQSwgYykgIT0gTlVMTCkKCQkJICByZXR1cm4gVFJVRTsKCQkgICAgICBicmVhazsKCSAgICBjYXNlIE1PVVNFX0hFTFA6IGlmIChjICE9IE1PVVNFX1JFVFVSTiAmJiBjdXJidWYtPmJfaGVscCkKCQkJCSByZXR1cm4gVFJVRTsKCQkJICAgICBicmVhazsKCSAgICBkZWZhdWx0OiBpZiAoYyA9PSAqcCkgcmV0dXJuIFRSVUU7IGJyZWFrOwoJfQogICAgcmV0dXJuIEZBTFNFOwp9CgovKgogKiBSZXR1cm4gVFJVRSB3aGVuICdtb3VzZW1vZGVsJyBpcyBzZXQgdG8gInBvcHVwIiBvciAicG9wdXBfc2V0cG9zIi4KICovCiAgICBpbnQKbW91c2VfbW9kZWxfcG9wdXAoKQp7CiAgICByZXR1cm4gKHBfbW91c2VtWzBdID09ICdwJyk7Cn0KI2VuZGlmCgovKgogKiBCeSBvdXRwdXR0aW5nIHRoZSAnY3Vyc29yIHZlcnkgdmlzaWJsZScgdGVybWNhcCBjb2RlLCBmb3Igc29tZSB3aW5kb3dlZAogKiB0ZXJtaW5hbHMgdGhpcyBtYWtlcyB0aGUgc2NyZWVuIHNjcm9sbGVkIHRvIHRoZSBjb3JyZWN0IHBvc2l0aW9uLgogKiBVc2VkIHdoZW4gc3RhcnRpbmcgVmltIG9yIHJldHVybmluZyBmcm9tIGEgc2hlbGwuCiAqLwogICAgdm9pZApzY3JvbGxfc3RhcnQoKQp7CiAgICBpZiAoKlRfVlMgIT0gTlVMKQogICAgewoJb3V0X3N0cihUX1ZTKTsKCW91dF9zdHIoVF9WRSk7CglzY3JlZW5fc3RhcnQoKTsJCQkvKiBkb24ndCBrbm93IHdoZXJlIGN1cnNvciBpcyBub3cgKi8KICAgIH0KfQoKc3RhdGljIGludCBjdXJzb3JfaXNfb2ZmID0gRkFMU0U7CgovKgogKiBFbmFibGUgdGhlIGN1cnNvci4KICovCiAgICB2b2lkCmN1cnNvcl9vbigpCnsKICAgIGlmIChjdXJzb3JfaXNfb2ZmKQogICAgewoJb3V0X3N0cihUX1ZFKTsKCWN1cnNvcl9pc19vZmYgPSBGQUxTRTsKICAgIH0KfQoKLyoKICogRGlzYWJsZSB0aGUgY3Vyc29yLgogKi8KICAgIHZvaWQKY3Vyc29yX29mZigpCnsKICAgIGlmIChmdWxsX3NjcmVlbikKICAgIHsKCWlmICghY3Vyc29yX2lzX29mZikKCSAgICBvdXRfc3RyKFRfVkkpOwkgICAgLyogZGlzYWJsZSBjdXJzb3IgKi8KCWN1cnNvcl9pc19vZmYgPSBUUlVFOwogICAgfQp9CgojaWYgZGVmaW5lZChDVVJTT1JfU0hBUEUpIHx8IGRlZmluZWQoUFJPVE8pCi8qCiAqIFNldCBjdXJzb3Igc2hhcGUgdG8gbWF0Y2ggSW5zZXJ0IG1vZGUuCiAqLwogICAgdm9pZAp0ZXJtX2N1cnNvcl9zaGFwZSgpCnsKICAgIHN0YXRpYyBpbnQgc2hvd2luZ19pbnNlcnRfbW9kZSA9IE1BWUJFOwoKICAgIGlmICghZnVsbF9zY3JlZW4gfHwgKlRfQ1NJID09IE5VTCB8fCAqVF9DRUkgPT0gTlVMKQoJcmV0dXJuOwoKICAgIGlmIChTdGF0ZSAmIElOU0VSVCkKICAgIHsKCWlmIChzaG93aW5nX2luc2VydF9tb2RlICE9IFRSVUUpCgkgICAgb3V0X3N0cihUX0NTSSk7CSAgICAvKiBkaXNhYmxlIGN1cnNvciAqLwoJc2hvd2luZ19pbnNlcnRfbW9kZSA9IFRSVUU7CiAgICB9CiAgICBlbHNlCiAgICB7CglpZiAoc2hvd2luZ19pbnNlcnRfbW9kZSAhPSBGQUxTRSkKCSAgICBvdXRfc3RyKFRfQ0VJKTsJICAgIC8qIGRpc2FibGUgY3Vyc29yICovCglzaG93aW5nX2luc2VydF9tb2RlID0gRkFMU0U7CiAgICB9Cn0KI2VuZGlmCgovKgogKiBTZXQgc2Nyb2xsaW5nIHJlZ2lvbiBmb3Igd2luZG93ICd3cCcuCiAqIFRoZSByZWdpb24gc3RhcnRzICdvZmYnIGxpbmVzIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSB3aW5kb3cuCiAqIEFsc28gc2V0IHRoZSB2ZXJ0aWNhbCBzY3JvbGwgcmVnaW9uIGZvciBhIHZlcnRpY2FsbHkgc3BsaXQgd2luZG93LiAgQWx3YXlzCiAqIHRoZSBmdWxsIHdpZHRoIG9mIHRoZSB3aW5kb3csIGV4Y2x1ZGluZyB0aGUgdmVydGljYWwgc2VwYXJhdG9yLgogKi8KICAgIHZvaWQKc2Nyb2xsX3JlZ2lvbl9zZXQod3AsIG9mZikKICAgIHdpbl9UCSp3cDsKICAgIGludAkJb2ZmOwp7CiAgICBPVVRfU1RSKHRnb3RvKChjaGFyICopVF9DUywgV19XSU5ST1cod3ApICsgd3AtPndfaGVpZ2h0IC0gMSwKCQkJCQkJCSBXX1dJTlJPVyh3cCkgKyBvZmYpKTsKI2lmZGVmIEZFQVRfVkVSVFNQTElUCiAgICBpZiAoKlRfQ1NWICE9IE5VTCAmJiB3cC0+d193aWR0aCAhPSBDb2x1bW5zKQoJT1VUX1NUUih0Z290bygoY2hhciAqKVRfQ1NWLCBXX1dJTkNPTCh3cCkgKyB3cC0+d193aWR0aCAtIDEsCgkJCQkJCQkgICAgICAgV19XSU5DT0wod3ApKSk7CiNlbmRpZgogICAgc2NyZWVuX3N0YXJ0KCk7CQkgICAgLyogZG9uJ3Qga25vdyB3aGVyZSBjdXJzb3IgaXMgbm93ICovCn0KCi8qCiAqIFJlc2V0IHNjcm9sbGluZyByZWdpb24gdG8gdGhlIHdob2xlIHNjcmVlbi4KICovCiAgICB2b2lkCnNjcm9sbF9yZWdpb25fcmVzZXQoKQp7CiAgICBPVVRfU1RSKHRnb3RvKChjaGFyICopVF9DUywgKGludClSb3dzIC0gMSwgMCkpOwojaWZkZWYgRkVBVF9WRVJUU1BMSVQKICAgIGlmICgqVF9DU1YgIT0gTlVMKQoJT1VUX1NUUih0Z290bygoY2hhciAqKVRfQ1NWLCAoaW50KUNvbHVtbnMgLSAxLCAwKSk7CiNlbmRpZgogICAgc2NyZWVuX3N0YXJ0KCk7CQkgICAgLyogZG9uJ3Qga25vdyB3aGVyZSBjdXJzb3IgaXMgbm93ICovCn0KCgovKgogKiBMaXN0IG9mIHRlcm1pbmFsIGNvZGVzIHRoYXQgYXJlIGN1cnJlbnRseSByZWNvZ25pemVkLgogKi8KCnN0cnVjdCB0ZXJtY29kZQp7CiAgICBjaGFyX3UgIG5hbWVbMl07CSAgICAvKiB0ZXJtY2FwIG5hbWUgb2YgZW50cnkgKi8KICAgIGNoYXJfdSAgKmNvZGU7CSAgICAvKiB0ZXJtaW5hbCBjb2RlIChpbiBhbGxvY2F0ZWQgbWVtb3J5KSAqLwogICAgaW50CSAgICBsZW47CSAgICAvKiBTVFJMRU4oY29kZSkgKi8KfSAqdGVybWNvZGVzID0gTlVMTDsKCnN0YXRpYyBpbnQgIHRjX21heF9sZW4gPSAwOyAvKiBudW1iZXIgb2YgZW50cmllcyB0aGF0IHRlcm1jb2Rlc1tdIGNhbiBob2xkICovCnN0YXRpYyBpbnQgIHRjX2xlbiA9IDA7CSAgICAvKiBjdXJyZW50IG51bWJlciBvZiBlbnRyaWVzIGluIHRlcm1jb2Rlc1tdICovCgogICAgdm9pZApjbGVhcl90ZXJtY29kZXMoKQp7CiAgICB3aGlsZSAodGNfbGVuID4gMCkKCXZpbV9mcmVlKHRlcm1jb2Rlc1stLXRjX2xlbl0uY29kZSk7CiAgICB2aW1fZnJlZSh0ZXJtY29kZXMpOwogICAgdGVybWNvZGVzID0gTlVMTDsKICAgIHRjX21heF9sZW4gPSAwOwoKI2lmZGVmIEhBVkVfVEdFVEVOVAogICAgQkMgPSAoY2hhciAqKWVtcHR5X29wdGlvbjsKICAgIFVQID0gKGNoYXIgKillbXB0eV9vcHRpb247CiAgICBQQyA9IE5VTDsJCQkvKiBzZXQgcGFkIGNoYXJhY3RlciB0byBOVUwgKi8KICAgIG9zcGVlZCA9IDA7CiNlbmRpZgoKICAgIG5lZWRfZ2F0aGVyID0gVFJVRTsJCS8qIG5lZWQgdG8gZmlsbCB0ZXJtbGVhZGVyW10gKi8KfQoKLyoKICogQWRkIGEgbmV3IGVudHJ5IHRvIHRoZSBsaXN0IG9mIHRlcm1pbmFsIGNvZGVzLgogKiBUaGUgbGlzdCBpcyBrZXB0IGFscGhhYmV0aWNhbCBmb3IgIjpzZXQgdGVybWNhcCIKICovCiAgICB2b2lkCmFkZF90ZXJtY29kZShuYW1lLCBzdHJpbmcsIHVzZV84Yml0KQogICAgY2hhcl91CSpuYW1lOwogICAgY2hhcl91CSpzdHJpbmc7CiAgICBpbnQJCXVzZV84Yml0OwkvKiByZXBsYWNlIDctYml0IGNvbnRyb2wgYnkgOC1iaXQgb25lICovCnsKICAgIHN0cnVjdCB0ZXJtY29kZSAqbmV3X3RjOwogICAgaW50CQkgICAgaSwgajsKICAgIGNoYXJfdQkgICAgKnM7CgogICAgaWYgKHN0cmluZyA9PSBOVUxMIHx8ICpzdHJpbmcgPT0gTlVMKQogICAgewoJZGVsX3Rlcm1jb2RlKG5hbWUpOwoJcmV0dXJuOwogICAgfQoKICAgIHMgPSB2aW1fc3Ryc2F2ZShzdHJpbmcpOwogICAgaWYgKHMgPT0gTlVMTCkKCXJldHVybjsKCiAgICAvKiBDaGFuZ2UgbGVhZGluZyA8RXNjPlsgdG8gQ1NJLCBjaGFuZ2UgPEVzYz5PIHRvIDxNLU8+LiAqLwogICAgaWYgKHVzZV84Yml0ICYmIHRlcm1fN3RvOGJpdChzdHJpbmcpICE9IDApCiAgICB7CgltY2hfbWVtbW92ZShzLCBzICsgMSwgU1RSTEVOKHMpKTsKCXNbMF0gPSB0ZXJtXzd0bzhiaXQoc3RyaW5nKTsKICAgIH0KCiAgICBuZWVkX2dhdGhlciA9IFRSVUU7CQkvKiBuZWVkIHRvIGZpbGwgdGVybWxlYWRlcltdICovCgogICAgLyoKICAgICAqIG5lZWQgdG8gbWFrZSBzcGFjZSBmb3IgbW9yZSBlbnRyaWVzCiAgICAgKi8KICAgIGlmICh0Y19sZW4gPT0gdGNfbWF4X2xlbikKICAgIHsKCXRjX21heF9sZW4gKz0gMjA7CgluZXdfdGMgPSAoc3RydWN0IHRlcm1jb2RlICopYWxsb2MoCgkJCSAgICAodW5zaWduZWQpKHRjX21heF9sZW4gKiBzaXplb2Yoc3RydWN0IHRlcm1jb2RlKSkpOwoJaWYgKG5ld190YyA9PSBOVUxMKQoJewoJICAgIHRjX21heF9sZW4gLT0gMjA7CgkgICAgcmV0dXJuOwoJfQoJZm9yIChpID0gMDsgaSA8IHRjX2xlbjsgKytpKQoJICAgIG5ld190Y1tpXSA9IHRlcm1jb2Rlc1tpXTsKCXZpbV9mcmVlKHRlcm1jb2Rlcyk7Cgl0ZXJtY29kZXMgPSBuZXdfdGM7CiAgICB9CgogICAgLyoKICAgICAqIExvb2sgZm9yIGV4aXN0aW5nIGVudHJ5IHdpdGggdGhlIHNhbWUgbmFtZSwgaXQgaXMgcmVwbGFjZWQuCiAgICAgKiBMb29rIGZvciBhbiBleGlzdGluZyBlbnRyeSB0aGF0IGlzIGFscGhhYmV0aWNhbCBoaWdoZXIsIHRoZSBuZXcgZW50cnkKICAgICAqIGlzIGluc2VydGVkIGluIGZyb250IG9mIGl0LgogICAgICovCiAgICBmb3IgKGkgPSAwOyBpIDwgdGNfbGVuOyArK2kpCiAgICB7CglpZiAodGVybWNvZGVzW2ldLm5hbWVbMF0gPCBuYW1lWzBdKQoJICAgIGNvbnRpbnVlOwoJaWYgKHRlcm1jb2Rlc1tpXS5uYW1lWzBdID09IG5hbWVbMF0pCgl7CgkgICAgaWYgKHRlcm1jb2Rlc1tpXS5uYW1lWzFdIDwgbmFtZVsxXSkKCQljb250aW51ZTsKCSAgICAvKgoJICAgICAqIEV4YWN0IG1hdGNoOiBSZXBsYWNlIG9sZCBjb2RlLgoJICAgICAqLwoJICAgIGlmICh0ZXJtY29kZXNbaV0ubmFtZVsxXSA9PSBuYW1lWzFdKQoJICAgIHsKCQl2aW1fZnJlZSh0ZXJtY29kZXNbaV0uY29kZSk7CgkJLS10Y19sZW47CgkJYnJlYWs7CgkgICAgfQoJfQoJLyoKCSAqIEZvdW5kIGFscGhhYmV0aWNhbCBsYXJnZXIgZW50cnksIG1vdmUgcmVzdCB0byBpbnNlcnQgbmV3IGVudHJ5CgkgKi8KCWZvciAoaiA9IHRjX2xlbjsgaiA+IGk7IC0taikKCSAgICB0ZXJtY29kZXNbal0gPSB0ZXJtY29kZXNbaiAtIDFdOwoJYnJlYWs7CiAgICB9CgogICAgdGVybWNvZGVzW2ldLm5hbWVbMF0gPSBuYW1lWzBdOwogICAgdGVybWNvZGVzW2ldLm5hbWVbMV0gPSBuYW1lWzFdOwogICAgdGVybWNvZGVzW2ldLmNvZGUgPSBzOwogICAgdGVybWNvZGVzW2ldLmxlbiA9IChpbnQpU1RSTEVOKHMpOwogICAgKyt0Y19sZW47Cn0KCiAgICBjaGFyX3UgICoKZmluZF90ZXJtY29kZShuYW1lKQogICAgY2hhcl91ICAqbmFtZTsKewogICAgaW50CSAgICBpOwoKICAgIGZvciAoaSA9IDA7IGkgPCB0Y19sZW47ICsraSkKCWlmICh0ZXJtY29kZXNbaV0ubmFtZVswXSA9PSBuYW1lWzBdICYmIHRlcm1jb2Rlc1tpXS5uYW1lWzFdID09IG5hbWVbMV0pCgkgICAgcmV0dXJuIHRlcm1jb2Rlc1tpXS5jb2RlOwogICAgcmV0dXJuIE5VTEw7Cn0KCiNpZiBkZWZpbmVkKEZFQVRfQ01ETF9DT01QTCkgfHwgZGVmaW5lZChQUk9UTykKICAgIGNoYXJfdSAqCmdldF90ZXJtY29kZShpKQogICAgaW50CSAgICBpOwp7CiAgICBpZiAoaSA+PSB0Y19sZW4pCglyZXR1cm4gTlVMTDsKICAgIHJldHVybiAmdGVybWNvZGVzW2ldLm5hbWVbMF07Cn0KI2VuZGlmCgogICAgdm9pZApkZWxfdGVybWNvZGUobmFtZSkKICAgIGNoYXJfdSAgKm5hbWU7CnsKICAgIGludAkgICAgaTsKCiAgICBpZiAodGVybWNvZGVzID09IE5VTEwpCS8qIG5vdGhpbmcgdGhlcmUgeWV0ICovCglyZXR1cm47CgogICAgbmVlZF9nYXRoZXIgPSBUUlVFOwkJLyogbmVlZCB0byBmaWxsIHRlcm1sZWFkZXJbXSAqLwoKICAgIGZvciAoaSA9IDA7IGkgPCB0Y19sZW47ICsraSkKCWlmICh0ZXJtY29kZXNbaV0ubmFtZVswXSA9PSBuYW1lWzBdICYmIHRlcm1jb2Rlc1tpXS5uYW1lWzFdID09IG5hbWVbMV0pCgl7CgkgICAgZGVsX3Rlcm1jb2RlX2lkeChpKTsKCSAgICByZXR1cm47Cgl9CiAgICAvKiBub3QgZm91bmQuIEdpdmUgZXJyb3IgbWVzc2FnZT8gKi8KfQoKICAgIHN0YXRpYyB2b2lkCmRlbF90ZXJtY29kZV9pZHgoaWR4KQogICAgaW50CQlpZHg7CnsKICAgIGludAkJaTsKCiAgICB2aW1fZnJlZSh0ZXJtY29kZXNbaWR4XS5jb2RlKTsKICAgIC0tdGNfbGVuOwogICAgZm9yIChpID0gaWR4OyBpIDwgdGNfbGVuOyArK2kpCgl0ZXJtY29kZXNbaV0gPSB0ZXJtY29kZXNbaSArIDFdOwp9CgojaWZkZWYgRkVBVF9URVJNUkVTUE9OU0UKLyoKICogQ2FsbGVkIHdoZW4gZGV0ZWN0ZWQgdGhhdCB0aGUgdGVybWluYWwgc2VuZHMgOC1iaXQgY29kZXMuCiAqIENvbnZlcnQgYWxsIDctYml0IGNvZGVzIHRvIHRoZWlyIDgtYml0IGVxdWl2YWxlbnQuCiAqLwogICAgc3RhdGljIHZvaWQKc3dpdGNoX3RvXzhiaXQoKQp7CiAgICBpbnQJCWk7CiAgICBpbnQJCWM7CgogICAgLyogT25seSBuZWVkIHRvIGRvIHNvbWV0aGluZyB3aGVuIG5vdCBhbHJlYWR5IHVzaW5nIDgtYml0IGNvZGVzLiAqLwogICAgaWYgKCF0ZXJtX2lzXzhiaXQoVF9OQU1FKSkKICAgIHsKCWZvciAoaSA9IDA7IGkgPCB0Y19sZW47ICsraSkKCXsKCSAgICBjID0gdGVybV83dG84Yml0KHRlcm1jb2Rlc1tpXS5jb2RlKTsKCSAgICBpZiAoYyAhPSAwKQoJICAgIHsKCQltY2hfbWVtbW92ZSh0ZXJtY29kZXNbaV0uY29kZSArIDEsIHRlcm1jb2Rlc1tpXS5jb2RlICsgMiwKCQkJCQkgICAgICAgU1RSTEVOKHRlcm1jb2Rlc1tpXS5jb2RlICsgMSkpOwoJCXRlcm1jb2Rlc1tpXS5jb2RlWzBdID0gYzsKCSAgICB9Cgl9CgluZWVkX2dhdGhlciA9IFRSVUU7CQkvKiBuZWVkIHRvIGZpbGwgdGVybWxlYWRlcltdICovCiAgICB9CiAgICBkZXRlY3RlZF84Yml0ID0gVFJVRTsKfQojZW5kaWYKCiNpZmRlZiBDSEVDS19ET1VCTEVfQ0xJQ0sKc3RhdGljIGxpbmVucl9UIG9yaWdfdG9wbGluZSA9IDA7CiMgaWZkZWYgRkVBVF9ESUZGCnN0YXRpYyBpbnQgb3JpZ190b3BmaWxsID0gMDsKIyBlbmRpZgojZW5kaWYKI2lmIChkZWZpbmVkKEZFQVRfV0lORE9XUykgJiYgZGVmaW5lZChDSEVDS19ET1VCTEVfQ0xJQ0spKSB8fCBkZWZpbmVkKFBST1RPKQovKgogKiBDaGVja2luZyBmb3IgZG91YmxlIGNsaWNrcyBvdXJzZWx2ZXMuCiAqICJvcmlnX3RvcGxpbmUiIGlzIHVzZWQgdG8gYXZvaWQgZGV0ZWN0aW5nIGEgZG91YmxlLWNsaWNrIHdoZW4gdGhlIHdpbmRvdwogKiBjb250ZW50cyBzY3JvbGxlZCAoZS5nLiwgd2hlbiAnc2Nyb2xsb2ZmJyBpcyBub24temVybykuCiAqLwovKgogKiBTZXQgb3JpZ190b3BsaW5lLiAgVXNlZCB3aGVuIGp1bXBpbmcgdG8gYW5vdGhlciB3aW5kb3csIHNvIHRoYXQgYSBkb3VibGUKICogY2xpY2sgc3RpbGwgd29ya3MuCiAqLwogICAgdm9pZApzZXRfbW91c2VfdG9wbGluZSh3cCkKICAgIHdpbl9UCSp3cDsKewogICAgb3JpZ190b3BsaW5lID0gd3AtPndfdG9wbGluZTsKIyBpZmRlZiBGRUFUX0RJRkYKICAgIG9yaWdfdG9wZmlsbCA9IHdwLT53X3RvcGZpbGw7CiMgZW5kaWYKfQojZW5kaWYKCi8qCiAqIENoZWNrIGlmIHR5cGVidWYudGJfYnVmW10gY29udGFpbnMgYSB0ZXJtaW5hbCBrZXkgY29kZS4KICogQ2hlY2sgZnJvbSB0eXBlYnVmLnRiX2J1Zlt0eXBlYnVmLnRiX29mZl0gdG8gdHlwZWJ1Zi50Yl9idWZbdHlwZWJ1Zi50Yl9vZmYKICogKyBtYXhfb2Zmc2V0XS4KICogUmV0dXJuIDAgZm9yIG5vIG1hdGNoLCAtMSBmb3IgcGFydGlhbCBtYXRjaCwgPiAwIGZvciBmdWxsIG1hdGNoLgogKiBXaXRoIGEgbWF0Y2gsIHRoZSBtYXRjaCBpcyByZW1vdmVkLCB0aGUgcmVwbGFjZW1lbnQgY29kZSBpcyBpbnNlcnRlZCBpbgogKiB0eXBlYnVmLnRiX2J1ZltdIGFuZCB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgaW4gdHlwZWJ1Zi50Yl9idWZbXSBpcwogKiByZXR1cm5lZC4KICogV2hlbiAiYnVmIiBpcyBub3QgTlVMTCwgaXQgaXMgdXNlZCBpbnN0ZWFkIG9mIHR5cGVidWYudGJfYnVmW10uICJidWZsZW4iIGlzCiAqIHRoZW4gdGhlIGxlbmd0aCBvZiB0aGUgc3RyaW5nIGluIGJ1ZltdLgogKi8KICAgIGludApjaGVja190ZXJtY29kZShtYXhfb2Zmc2V0LCBidWYsIGJ1ZmxlbikKICAgIGludAkJbWF4X29mZnNldDsKICAgIGNoYXJfdQkqYnVmOwogICAgaW50CQlidWZsZW47CnsKICAgIGNoYXJfdQkqdHA7CiAgICBjaGFyX3UJKnA7CiAgICBpbnQJCXNsZW4gPSAwOwkvKiBpbml0IGZvciBHQ0MgKi8KICAgIGludAkJbGVuOwogICAgaW50CQlvZmZzZXQ7CiAgICBjaGFyX3UJa2V5X25hbWVbMl07CiAgICBpbnQJCW5ld19zbGVuOwogICAgaW50CQlleHRyYTsKICAgIGNoYXJfdQlzdHJpbmdbTUFYX0tFWV9DT0RFX0xFTiArIDFdOwogICAgaW50CQlpLCBqOwogICAgaW50CQlpZHggPSAwOwojaWZkZWYgRkVBVF9NT1VTRQojIGlmICFkZWZpbmVkKFVOSVgpIHx8IGRlZmluZWQoRkVBVF9NT1VTRV9YVEVSTSkgfHwgZGVmaW5lZChGRUFUX0dVSSkKICAgIGNoYXJfdQlieXRlc1s2XTsKICAgIGludAkJbnVtX2J5dGVzOwojIGVuZGlmCiAgICBpbnQJCW1vdXNlX2NvZGUgPSAwOwkgICAgLyogaW5pdCBmb3IgR0NDICovCiAgICBpbnQJCW1vZGlmaWVyczsKICAgIGludAkJaXNfY2xpY2ssIGlzX2RyYWc7CiAgICBpbnQJCXdoZWVsX2NvZGUgPSAwOwogICAgaW50CQljdXJyZW50X2J1dHRvbjsKICAgIHN0YXRpYyBpbnQJaGVsZF9idXR0b24gPSBNT1VTRV9SRUxFQVNFOwogICAgc3RhdGljIGludAlvcmlnX251bV9jbGlja3MgPSAxOwogICAgc3RhdGljIGludAlvcmlnX21vdXNlX2NvZGUgPSAweDA7CiMgaWZkZWYgQ0hFQ0tfRE9VQkxFX0NMSUNLCiAgICBzdGF0aWMgaW50CW9yaWdfbW91c2VfY29sID0gMDsKICAgIHN0YXRpYyBpbnQJb3JpZ19tb3VzZV9yb3cgPSAwOwogICAgc3RhdGljIHN0cnVjdCB0aW1ldmFsICBvcmlnX21vdXNlX3RpbWUgPSB7MCwgMH07CgkJCQkJLyogdGltZSBvZiBwcmV2aW91cyBtb3VzZSBjbGljayAqLwogICAgc3RydWN0IHRpbWV2YWwgIG1vdXNlX3RpbWU7CQkvKiB0aW1lIG9mIGN1cnJlbnQgbW91c2UgY2xpY2sgKi8KICAgIGxvbmcJdGltZWRpZmY7CQkvKiBlbGFwc2VkIHRpbWUgaW4gbXNlYyAqLwojIGVuZGlmCiNlbmRpZgogICAgaW50CQljcG9fa29mZnNldDsKI2lmZGVmIEZFQVRfTU9VU0VfR1BNCiAgICBleHRlcm4gaW50CWdwbV9mbGFnOyAvKiBncG0gbGlicmFyeSB2YXJpYWJsZSAqLwojZW5kaWYKCiAgICBjcG9fa29mZnNldCA9ICh2aW1fc3RyY2hyKHBfY3BvLCBDUE9fS09GRlNFVCkgIT0gTlVMTCk7CgogICAgLyoKICAgICAqIFNwZWVkIHVwIHRoZSBjaGVja3MgZm9yIHRlcm1pbmFsIGNvZGVzIGJ5IGdhdGhlcmluZyBhbGwgZmlyc3QgYnl0ZXMKICAgICAqIHVzZWQgaW4gdGVybWxlYWRlcltdLiAgT2Z0ZW4gdGhpcyBpcyBqdXN0IGEgc2luZ2xlIDxFc2M+LgogICAgICovCiAgICBpZiAobmVlZF9nYXRoZXIpCglnYXRoZXJfdGVybWxlYWRlcigpOwoKICAgIC8qCiAgICAgKiBDaGVjayBhdCBzZXZlcmFsIHBvc2l0aW9ucyBpbiB0eXBlYnVmLnRiX2J1ZltdLCB0byBjYXRjaCBzb21ldGhpbmcgbGlrZQogICAgICogIng8VXA+IiB0aGF0IGNhbiBiZSBtYXBwZWQuIFN0b3AgYXQgbWF4X29mZnNldCwgYmVjYXVzZSBjaGFyYWN0ZXJzCiAgICAgKiBhZnRlciB0aGF0IGNhbm5vdCBiZSB1c2VkIGZvciBtYXBwaW5nLCBhbmQgd2l0aCBAciBjb21tYW5kcwogICAgICogdHlwZWJ1Zi50Yl9idWZbXQogICAgICogY2FuIGJlY29tZSB2ZXJ5IGxvbmcuCiAgICAgKiBUaGlzIGlzIHVzZWQgb2Z0ZW4sIEtFRVAgSVQgRkFTVCEKICAgICAqLwogICAgZm9yIChvZmZzZXQgPSAwOyBvZmZzZXQgPCBtYXhfb2Zmc2V0OyArK29mZnNldCkKICAgIHsKCWlmIChidWYgPT0gTlVMTCkKCXsKCSAgICBpZiAob2Zmc2V0ID49IHR5cGVidWYudGJfbGVuKQoJCWJyZWFrOwoJICAgIHRwID0gdHlwZWJ1Zi50Yl9idWYgKyB0eXBlYnVmLnRiX29mZiArIG9mZnNldDsKCSAgICBsZW4gPSB0eXBlYnVmLnRiX2xlbiAtIG9mZnNldDsJLyogbGVuZ3RoIG9mIHRoZSBpbnB1dCAqLwoJfQoJZWxzZQoJewoJICAgIGlmIChvZmZzZXQgPj0gYnVmbGVuKQoJCWJyZWFrOwoJICAgIHRwID0gYnVmICsgb2Zmc2V0OwoJICAgIGxlbiA9IGJ1ZmxlbiAtIG9mZnNldDsKCX0KCgkvKgoJICogRG9uJ3QgY2hlY2sgY2hhcmFjdGVycyBhZnRlciBLX1NQRUNJQUwsIHRob3NlIGFyZSBhbHJlYWR5CgkgKiB0cmFuc2xhdGVkIHRlcm1pbmFsIGNoYXJzIChhdm9pZCB0cmFuc2xhdGluZyB+QF5IeCkuCgkgKi8KCWlmICgqdHAgPT0gS19TUEVDSUFMKQoJewoJICAgIG9mZnNldCArPSAyOwkvKiB0aGVyZSBhcmUgYWx3YXlzIDIgZXh0cmEgY2hhcmFjdGVycyAqLwoJICAgIGNvbnRpbnVlOwoJfQoKCS8qCgkgKiBTa2lwIHRoaXMgcG9zaXRpb24gaWYgdGhlIGNoYXJhY3RlciBkb2VzIG5vdCBhcHBlYXIgYXMgdGhlIGZpcnN0CgkgKiBjaGFyYWN0ZXIgaW4gdGVybV9zdHJpbmdzLiBUaGlzIHNwZWVkcyB1cCBhIGxvdCwgc2luY2UgbW9zdAoJICogdGVybWNvZGVzIHN0YXJ0IHdpdGggdGhlIHNhbWUgY2hhcmFjdGVyIChFU0Mgb3IgQ1NJKS4KCSAqLwoJaSA9ICp0cDsKCWZvciAocCA9IHRlcm1sZWFkZXI7ICpwICYmICpwICE9IGk7ICsrcCkKCSAgICA7CglpZiAoKnAgPT0gTlVMKQoJICAgIGNvbnRpbnVlOwoKCS8qCgkgKiBTa2lwIHRoaXMgcG9zaXRpb24gaWYgcF9layBpcyBub3Qgc2V0IGFuZCB0cFswXSBpcyBhbiBFU0MgYW5kIHdlCgkgKiBhcmUgaW4gSW5zZXJ0IG1vZGUuCgkgKi8KCWlmICgqdHAgPT0gRVNDICYmICFwX2VrICYmIChTdGF0ZSAmIElOU0VSVCkpCgkgICAgY29udGludWU7CgoJbmV3X3NsZW4gPSAwOwkJLyogTGVuZ3RoIG9mIHdoYXQgd2lsbCByZXBsYWNlIHRoZSB0ZXJtY29kZSAqLwoJa2V5X25hbWVbMF0gPSBOVUw7CS8qIG5vIGtleSBuYW1lIGZvdW5kIHlldCAqLwoKI2lmZGVmIEZFQVRfR1VJCglpZiAoZ3VpLmluX3VzZSkKCXsKCSAgICAvKgoJICAgICAqIEdVSSBzcGVjaWFsIGtleSBjb2RlcyBhcmUgYWxsIG9mIHRoZSBmb3JtIFtDU0kgeHhdLgoJICAgICAqLwoJICAgIGlmICgqdHAgPT0gQ1NJKQkgICAgLyogU3BlY2lhbCBrZXkgZnJvbSBHVUkgKi8KCSAgICB7CgkJaWYgKGxlbiA8IDMpCgkJICAgIHJldHVybiAtMTsJICAgIC8qIFNob3VsZG4ndCBoYXBwZW4gKi8KCQlzbGVuID0gMzsKCQlrZXlfbmFtZVswXSA9IHRwWzFdOwoJCWtleV9uYW1lWzFdID0gdHBbMl07CgkgICAgfQoJfQoJZWxzZQojZW5kaWYgLyogRkVBVF9HVUkgKi8KCXsKCSAgICBmb3IgKGlkeCA9IDA7IGlkeCA8IHRjX2xlbjsgKytpZHgpCgkgICAgewoJCS8qCgkJICogSWdub3JlIHRoZSBlbnRyeSBpZiB3ZSBhcmUgbm90IGF0IHRoZSBzdGFydCBvZgoJCSAqIHR5cGVidWYudGJfYnVmW10KCQkgKiBhbmQgdGhlcmUgYXJlIG5vdCBlbm91Z2ggY2hhcmFjdGVycyB0byBtYWtlIGEgbWF0Y2guCgkJICogQnV0IG9ubHkgd2hlbiB0aGUgJ0snIGZsYWcgaXMgaW4gJ2Nwb3B0aW9ucycuCgkJICovCgkJc2xlbiA9IHRlcm1jb2Rlc1tpZHhdLmxlbjsKCQlpZiAoY3BvX2tvZmZzZXQgJiYgb2Zmc2V0ICYmIGxlbiA8IHNsZW4pCgkJICAgIGNvbnRpbnVlOwoJCWlmIChTVFJOQ01QKHRlcm1jb2Rlc1tpZHhdLmNvZGUsIHRwLAoJCQkJICAgICAoc2l6ZV90KShzbGVuID4gbGVuID8gbGVuIDogc2xlbikpID09IDApCgkJewoJCSAgICBpZiAobGVuIDwgc2xlbikJCS8qIGdvdCBhIHBhcnRpYWwgc2VxdWVuY2UgKi8KCQkJcmV0dXJuIC0xOwkJLyogbmVlZCB0byBnZXQgbW9yZSBjaGFycyAqLwoKCQkgICAgLyoKCQkgICAgICogV2hlbiBmb3VuZCBhIGtleXBhZCBrZXksIGNoZWNrIGlmIHRoZXJlIGlzIGFub3RoZXIga2V5CgkJICAgICAqIHRoYXQgbWF0Y2hlcyBhbmQgdXNlIHRoYXQgb25lLiAgVGhpcyBtYWtlcyA8SG9tZT4gdG8gYmUKCQkgICAgICogZm91bmQgaW5zdGVhZCBvZiA8a0hvbWU+IHdoZW4gdGhleSBwcm9kdWNlIHRoZSBzYW1lCgkJICAgICAqIGtleSBjb2RlLgoJCSAgICAgKi8KCQkgICAgaWYgKHRlcm1jb2Rlc1tpZHhdLm5hbWVbMF0gPT0gJ0snCgkJCQkgICAgICAgJiYgVklNX0lTRElHSVQodGVybWNvZGVzW2lkeF0ubmFtZVsxXSkpCgkJICAgIHsKCQkJZm9yIChqID0gaWR4ICsgMTsgaiA8IHRjX2xlbjsgKytqKQoJCQkgICAgaWYgKHRlcm1jb2Rlc1tqXS5sZW4gPT0gc2xlbiAmJgoJCQkJICAgIFNUUk5DTVAodGVybWNvZGVzW2lkeF0uY29kZSwKCQkJCQkgICAgdGVybWNvZGVzW2pdLmNvZGUsIHNsZW4pID09IDApCgkJCSAgICB7CgkJCQlpZHggPSBqOwoJCQkJYnJlYWs7CgkJCSAgICB9CgkJICAgIH0KCgkJICAgIGtleV9uYW1lWzBdID0gdGVybWNvZGVzW2lkeF0ubmFtZVswXTsKCQkgICAga2V5X25hbWVbMV0gPSB0ZXJtY29kZXNbaWR4XS5uYW1lWzFdOwoKCQkgICAgYnJlYWs7CgkJfQoJICAgIH0KCX0KCiNpZmRlZiBGRUFUX1RFUk1SRVNQT05TRQoJaWYgKGtleV9uYW1lWzBdID09IE5VTCkKCXsKCSAgICAvKiBDaGVjayBmb3IgeHRlcm0gdmVyc2lvbiBzdHJpbmc6ICI8RXNjPls+e3h9O3t2ZXJzfTt7eX1jIi4gIEFsc28KCSAgICAgKiBlYXQgb3RoZXIgcG9zc2libGUgcmVzcG9uc2VzIHRvIHRfUlYsIHJ4dnQgcmV0dXJucwoJICAgICAqICI8RXNjPls/MTsyYyIuICBBbHNvIGFjY2VwdCBDU0kgaW5zdGVhZCBvZiA8RXNjPlsuICovCgkgICAgaWYgKCpUX0NSViAhPSBOVUwgJiYgKCh0cFswXSA9PSBFU0MgJiYgdHBbMV0gPT0gJ1snICYmIGxlbiA+PSAzKQoJCQkJCSAgICAgICB8fCAodHBbMF0gPT0gQ1NJICYmIGxlbiA+PSAyKSkpCgkgICAgewoJCWogPSAwOwoJCWV4dHJhID0gMDsKCQlmb3IgKGkgPSAyICsgKHRwWzBdICE9IENTSSk7CgkJCWkgPCBsZW4gJiYgKFZJTV9JU0RJR0lUKHRwW2ldKQoJCQkgICAgfHwgdHBbaV0gPT0gJzsnIHx8IHRwW2ldID09ICcuJyk7ICsraSkKCQkgICAgaWYgKHRwW2ldID09ICc7JyAmJiArK2ogPT0gMSkKCQkJZXh0cmEgPSBhdG9pKChjaGFyICopdHAgKyBpICsgMSk7CgkJaWYgKGkgPT0gbGVuKQoJCSAgICByZXR1cm4gLTE7CQkvKiBub3QgZW5vdWdoIGNoYXJhY3RlcnMgKi8KCgkJLyogZWF0IGl0IHdoZW4gYXQgbGVhc3Qgb25lIGRpZ2l0IGFuZCBlbmRpbmcgaW4gJ2MnICovCgkJaWYgKGkgPiAyICsgKHRwWzBdICE9IENTSSkgJiYgdHBbaV0gPT0gJ2MnKQoJCXsKCQkgICAgY3J2X3N0YXR1cyA9IENSVl9HT1Q7CgoJCSAgICAvKiBJZiB0aGlzIGNvZGUgc3RhcnRzIHdpdGggQ1NJLCB5b3UgY2FuIGJldCB0aGF0IHRoZQoJCSAgICAgKiB0ZXJtaW5hbCB1c2VzIDgtYml0IGNvZGVzLiAqLwoJCSAgICBpZiAodHBbMF0gPT0gQ1NJKQoJCQlzd2l0Y2hfdG9fOGJpdCgpOwoKCQkgICAgLyogcnh2dCBzZW5kcyBpdHMgdmVyc2lvbiBudW1iZXI6ICIyMDcwMyIgaXMgMi43LjMuCgkJICAgICAqIElnbm9yZSBpdCBmb3Igd2hlbiB0aGUgdXNlciBoYXMgc2V0ICd0ZXJtJyB0byB4dGVybSwKCQkgICAgICogZXZlbiB0aG91Z2ggaXQncyBhbiByeHZ0LiAqLwoJCSAgICBpZiAoZXh0cmEgPiAyMDAwMCkKCQkJZXh0cmEgPSAwOwoKCQkgICAgaWYgKHRwWzEgKyAodHBbMF0gIT0gQ1NJKV0gPT0gJz4nICYmIGogPT0gMikKCQkgICAgewoJCQkvKiBpZiB4dGVybSB2ZXJzaW9uID49IDk1IHVzZSBtb3VzZSBkcmFnZ2luZyAqLwoJCQlpZiAoZXh0cmEgPj0gOTUpCgkJCSAgICBzZXRfb3B0aW9uX3ZhbHVlKChjaGFyX3UgKikidHR5bSIsIDBMLAoJCQkJCQkgICAgICAgKGNoYXJfdSAqKSJ4dGVybTIiLCAwKTsKCQkJLyogaWYgeHRlcm0gdmVyc2lvbiA+PSAxNDEgdHJ5IHRvIGdldCB0ZXJtY2FwIGNvZGVzICovCgkJCWlmIChleHRyYSA+PSAxNDEpCgkJCXsKCQkJICAgIGNoZWNrX2Zvcl9jb2RlcyA9IFRSVUU7CgkJCSAgICBuZWVkX2dhdGhlciA9IFRSVUU7CgkJCSAgICByZXFfY29kZXNfZnJvbV90ZXJtKCk7CgkJCX0KCQkgICAgfQojIGlmZGVmIEZFQVRfRVZBTAoJCSAgICBzZXRfdmltX3Zhcl9zdHJpbmcoVlZfVEVSTVJFU1BPTlNFLCB0cCwgaSArIDEpOwojIGVuZGlmCiMgaWZkZWYgRkVBVF9BVVRPQ01ECgkJICAgIGFwcGx5X2F1dG9jbWRzKEVWRU5UX1RFUk1SRVNQT05TRSwKCQkJCQkJICAgTlVMTCwgTlVMTCwgRkFMU0UsIGN1cmJ1Zik7CiMgZW5kaWYKCQkgICAga2V5X25hbWVbMF0gPSAoaW50KUtTX0VYVFJBOwoJCSAgICBrZXlfbmFtZVsxXSA9IChpbnQpS0VfSUdOT1JFOwoJCSAgICBzbGVuID0gaSArIDE7CgkJfQoJICAgIH0KCgkgICAgLyogQ2hlY2sgZm9yICc8RXNjPlAxK3I8aGV4IGJ5dGVzPjxFc2M+XCcuICBBICIwIiBpbnN0ZWFkIG9mIHRoZQoJICAgICAqICIxIiBtZWFucyBhbiBpbnZhbGlkIHJlcXVlc3QuICovCgkgICAgZWxzZSBpZiAoY2hlY2tfZm9yX2NvZGVzCgkJICAgICYmICgodHBbMF0gPT0gRVNDICYmIHRwWzFdID09ICdQJyAmJiBsZW4gPj0gMikKCQkJfHwgdHBbMF0gPT0gRENTKSkKCSAgICB7CgkJaiA9IDEgKyAodHBbMF0gIT0gRENTKTsKCQlmb3IgKGkgPSBqOyBpIDwgbGVuOyArK2kpCgkJICAgIGlmICgodHBbaV0gPT0gRVNDICYmIHRwW2kgKyAxXSA9PSAnXFwnICYmIGkgKyAxIDwgbGVuKQoJCQkgICAgfHwgdHBbaV0gPT0gU1RFUk0pCgkJICAgIHsKCQkJaWYgKGkgLSBqID49IDMgJiYgdHBbaiArIDFdID09ICcrJyAmJiB0cFtqICsgMl0gPT0gJ3InKQoJCQkgICAgZ290X2NvZGVfZnJvbV90ZXJtKHRwICsgaiwgaSk7CgkJCWtleV9uYW1lWzBdID0gKGludClLU19FWFRSQTsKCQkJa2V5X25hbWVbMV0gPSAoaW50KUtFX0lHTk9SRTsKCQkJc2xlbiA9IGkgKyAxICsgKHRwW2ldID09IEVTQyk7CgkJCWJyZWFrOwoJCSAgICB9CgoJCWlmIChpID09IGxlbikKCQkgICAgcmV0dXJuIC0xOwkJLyogbm90IGVub3VnaCBjaGFyYWN0ZXJzICovCgkgICAgfQoJfQojZW5kaWYKCglpZiAoa2V5X25hbWVbMF0gPT0gTlVMKQoJICAgIGNvbnRpbnVlOwkgICAgLyogTm8gbWF0Y2ggYXQgdGhpcyBwb3NpdGlvbiwgdHJ5IG5leHQgb25lICovCgoJLyogV2Ugb25seSBnZXQgaGVyZSB3aGVuIHdlIGhhdmUgYSBjb21wbGV0ZSB0ZXJtY29kZSBtYXRjaCAqLwoKI2lmZGVmIEZFQVRfTU9VU0UKIyBpZmRlZiBGRUFUX0dVSQoJLyoKCSAqIE9ubHkgaW4gdGhlIEdVSTogRmV0Y2ggdGhlIHBvaW50ZXIgY29vcmRpbmF0ZXMgb2YgdGhlIHNjcm9sbCBldmVudAoJICogc28gdGhhdCB3ZSBrbm93IHdoaWNoIHdpbmRvdyB0byBzY3JvbGwgbGF0ZXIuCgkgKi8KCWlmIChndWkuaW5fdXNlCgkJJiYga2V5X25hbWVbMF0gPT0gKGludClLU19FWFRSQQoJCSYmIChrZXlfbmFtZVsxXSA9PSAoaW50KUtFX1gxTU9VU0UKCQkgICAgfHwga2V5X25hbWVbMV0gPT0gKGludClLRV9YMk1PVVNFCgkJICAgIHx8IGtleV9uYW1lWzFdID09IChpbnQpS0VfTU9VU0VET1dOCgkJICAgIHx8IGtleV9uYW1lWzFdID09IChpbnQpS0VfTU9VU0VVUCkpCgl7CgkgICAgbnVtX2J5dGVzID0gZ2V0X2J5dGVzX2Zyb21fYnVmKHRwICsgc2xlbiwgYnl0ZXMsIDQpOwoJICAgIGlmIChudW1fYnl0ZXMgPT0gLTEpCS8qIG5vdCBlbm91Z2ggY29vcmRpbmF0ZXMgKi8KCQlyZXR1cm4gLTE7CgkgICAgbW91c2VfY29sID0gMTI4ICogKGJ5dGVzWzBdIC0gJyAnIC0gMSkgKyBieXRlc1sxXSAtICcgJyAtIDE7CgkgICAgbW91c2Vfcm93ID0gMTI4ICogKGJ5dGVzWzJdIC0gJyAnIC0gMSkgKyBieXRlc1szXSAtICcgJyAtIDE7CgkgICAgc2xlbiArPSBudW1fYnl0ZXM7Cgl9CgllbHNlCiMgZW5kaWYKCS8qCgkgKiBJZiBpdCBpcyBhIG1vdXNlIGNsaWNrLCBnZXQgdGhlIGNvb3JkaW5hdGVzLgoJICovCglpZiAoa2V5X25hbWVbMF0gPT0gKGludClLU19NT1VTRQojIGlmZGVmIEZFQVRfTU9VU0VfSlNCCgkJfHwga2V5X25hbWVbMF0gPT0gKGludClLU19KU0JURVJNX01PVVNFCiMgZW5kaWYKIyBpZmRlZiBGRUFUX01PVVNFX05FVAoJCXx8IGtleV9uYW1lWzBdID09IChpbnQpS1NfTkVUVEVSTV9NT1VTRQojIGVuZGlmCiMgaWZkZWYgRkVBVF9NT1VTRV9ERUMKCQl8fCBrZXlfbmFtZVswXSA9PSAoaW50KUtTX0RFQ19NT1VTRQojIGVuZGlmCiMgaWZkZWYgRkVBVF9NT1VTRV9QVEVSTQoJCXx8IGtleV9uYW1lWzBdID09IChpbnQpS1NfUFRFUk1fTU9VU0UKIyBlbmRpZgoJCSkKCXsKCSAgICBpc19jbGljayA9IGlzX2RyYWcgPSBGQUxTRTsKCiMgaWYgIWRlZmluZWQoVU5JWCkgfHwgZGVmaW5lZChGRUFUX01PVVNFX1hURVJNKSB8fCBkZWZpbmVkKEZFQVRfR1VJKQoJICAgIGlmIChrZXlfbmFtZVswXSA9PSAoaW50KUtTX01PVVNFKQoJICAgIHsKCQkvKgoJCSAqIEZvciB4dGVybSBhbmQgTVNET1Mgd2UgZ2V0ICI8dF9tb3VzZT5zY3IiLCB3aGVyZQoJCSAqICBzID09IGVuY29kZWQgYnV0dG9uIHN0YXRlOgoJCSAqCSAgIDB4MjAgPSBsZWZ0IGJ1dHRvbiBkb3duCgkJICoJICAgMHgyMSA9IG1pZGRsZSBidXR0b24gZG93bgoJCSAqCSAgIDB4MjIgPSByaWdodCBidXR0b24gZG93bgoJCSAqCSAgIDB4MjMgPSBhbnkgYnV0dG9uIHJlbGVhc2UKCQkgKgkgICAweDYwID0gYnV0dG9uIDQgZG93biAoc2Nyb2xsIHdoZWVsIGRvd24pCgkJICoJICAgMHg2MSA9IGJ1dHRvbiA1IGRvd24gKHNjcm9sbCB3aGVlbCB1cCkKCQkgKglhZGQgMHgwNCBmb3IgU0hJRlQKCQkgKglhZGQgMHgwOCBmb3IgQUxUCgkJICoJYWRkIDB4MTAgZm9yIENUUkwKCQkgKglhZGQgMHgyMCBmb3IgbW91c2UgZHJhZyAoMHg0MCBpcyBkcmFnIHdpdGggbGVmdCBidXR0b24pCgkJICogIGMgPT0gY29sdW1uICsgJyAnICsgMSA9PSBjb2x1bW4gKyAzMwoJCSAqICByID09IHJvdyArICcgJyArIDEgPT0gcm93ICsgMzMKCQkgKgoJCSAqIFRoZSBjb29yZGluYXRlcyBhcmUgcGFzc2VkIG9uIHRocm91Z2ggZ2xvYmFsIHZhcmlhYmxlcy4KCQkgKiBVZ2x5LCBidXQgdGhpcyBhdm9pZHMgdHJvdWJsZSB3aXRoIG1vdXNlIGNsaWNrcyBhdCBhbgoJCSAqIHVuZXhwZWN0ZWQgbW9tZW50IGFuZCBhbGxvd3MgZm9yIG1hcHBpbmcgdGhlbS4KCQkgKi8KCQlmb3IgKDs7KQoJCXsKI2lmZGVmIEZFQVRfR1VJCgkJICAgIGlmIChndWkuaW5fdXNlKQoJCSAgICB7CgkJCS8qIEdVSSB1c2VzIG1vcmUgYml0cyBmb3IgY29sdW1ucyA+IDIyMyAqLwoJCQludW1fYnl0ZXMgPSBnZXRfYnl0ZXNfZnJvbV9idWYodHAgKyBzbGVuLCBieXRlcywgNSk7CgkJCWlmIChudW1fYnl0ZXMgPT0gLTEpCS8qIG5vdCBlbm91Z2ggY29vcmRpbmF0ZXMgKi8KCQkJICAgIHJldHVybiAtMTsKCQkJbW91c2VfY29kZSA9IGJ5dGVzWzBdOwoJCQltb3VzZV9jb2wgPSAxMjggKiAoYnl0ZXNbMV0gLSAnICcgLSAxKQoJCQkJCQkJICsgYnl0ZXNbMl0gLSAnICcgLSAxOwoJCQltb3VzZV9yb3cgPSAxMjggKiAoYnl0ZXNbM10gLSAnICcgLSAxKQoJCQkJCQkJICsgYnl0ZXNbNF0gLSAnICcgLSAxOwoJCSAgICB9CgkJICAgIGVsc2UKI2VuZGlmCgkJICAgIHsKCQkJbnVtX2J5dGVzID0gZ2V0X2J5dGVzX2Zyb21fYnVmKHRwICsgc2xlbiwgYnl0ZXMsIDMpOwoJCQlpZiAobnVtX2J5dGVzID09IC0xKQkvKiBub3QgZW5vdWdoIGNvb3JkaW5hdGVzICovCgkJCSAgICByZXR1cm4gLTE7CgkJCW1vdXNlX2NvZGUgPSBieXRlc1swXTsKCQkJbW91c2VfY29sID0gYnl0ZXNbMV0gLSAnICcgLSAxOwoJCQltb3VzZV9yb3cgPSBieXRlc1syXSAtICcgJyAtIDE7CgkJICAgIH0KCQkgICAgc2xlbiArPSBudW1fYnl0ZXM7CgoJCSAgICAvKiBJZiB0aGUgZm9sbG93aW5nIGJ5dGVzIGlzIGFsc28gYSBtb3VzZSBjb2RlIGFuZCBpdCBoYXMKCQkgICAgICogdGhlIHNhbWUgY29kZSwgZHVtcCB0aGlzIG9uZSBhbmQgZ2V0IHRoZSBuZXh0LiAgVGhpcwoJCSAgICAgKiBtYWtlcyBkcmFnZ2luZyBhIHdob2xlIGxvdCBmYXN0ZXIuICovCiNpZmRlZiBGRUFUX0dVSQoJCSAgICBpZiAoZ3VpLmluX3VzZSkKCQkJaiA9IDM7CgkJICAgIGVsc2UKI2VuZGlmCgkJCWogPSB0ZXJtY29kZXNbaWR4XS5sZW47CgkJICAgIGlmIChTVFJOQ01QKHRwLCB0cCArIHNsZW4sIChzaXplX3QpaikgPT0gMAoJCQkgICAgJiYgdHBbc2xlbiArIGpdID09IG1vdXNlX2NvZGUKCQkJICAgICYmIHRwW3NsZW4gKyBqICsgMV0gIT0gTlVMCgkJCSAgICAmJiB0cFtzbGVuICsgaiArIDJdICE9IE5VTAojaWZkZWYgRkVBVF9HVUkKCQkJICAgICYmICghZ3VpLmluX3VzZQoJCQkJfHwgKHRwW3NsZW4gKyBqICsgM10gIT0gTlVMCgkJCQkJJiYgdHBbc2xlbiArIGogKyA0XSAhPSBOVUwpKQojZW5kaWYKCQkJICAgICkKCQkJc2xlbiArPSBqOwoJCSAgICBlbHNlCgkJCWJyZWFrOwoJCX0KCiMgIGlmICFkZWZpbmVkKE1TV0lOKSAmJiAhZGVmaW5lZChNU0RPUykKCQkvKgoJCSAqIEhhbmRsZSBtb3VzZSBldmVudHMuCgkJICogUmVjb2duaXplIHRoZSB4dGVybSBtb3VzZSB3aGVlbCwgYnV0IG5vdCBpbiB0aGUgR1VJLCB0aGUKCQkgKiBMaW51eCBjb25zb2xlIHdpdGggR1BNIGFuZCB0aGUgTVMtRE9TIG9yIFdpbjMyIGNvbnNvbGUKCQkgKiAobXVsdGktY2xpY2tzIHVzZSA+PSAweDYwKS4KCQkgKi8KCQlpZiAobW91c2VfY29kZSA+PSBNT1VTRVdIRUVMX0xPVwojICAgaWZkZWYgRkVBVF9HVUkKCQkJJiYgIWd1aS5pbl91c2UKIyAgIGVuZGlmCiMgICBpZmRlZiBGRUFUX01PVVNFX0dQTQoJCQkmJiBncG1fZmxhZyA9PSAwCiMgICBlbmRpZgoJCQkpCgkJewoJCSAgICAvKiBLZWVwIHRoZSBtb3VzZV9jb2RlIGJlZm9yZSBpdCdzIGNoYW5nZWQsIHNvIHRoYXQgd2UKCQkgICAgICogcmVtZW1iZXIgdGhhdCBpdCB3YXMgYSBtb3VzZSB3aGVlbCBjbGljay4gKi8KCQkgICAgd2hlZWxfY29kZSA9IG1vdXNlX2NvZGU7CgkJfQojICAgaWZkZWYgRkVBVF9NT1VTRV9YVEVSTQoJCWVsc2UgaWYgKGhlbGRfYnV0dG9uID09IE1PVVNFX1JFTEVBU0UKIyAgICBpZmRlZiBGRUFUX0dVSQoJCQkmJiAhZ3VpLmluX3VzZQojICAgIGVuZGlmCgkJCSYmIChtb3VzZV9jb2RlID09IDB4MjMgfHwgbW91c2VfY29kZSA9PSAweDI0KSkKCQl7CgkJICAgIC8qIEFwcGFyZW50bHkgdXNlZCBieSByeHZ0IHNjcm9sbCB3aGVlbC4gKi8KCQkgICAgd2hlZWxfY29kZSA9IG1vdXNlX2NvZGUgLSAweDIzICsgTU9VU0VXSEVFTF9MT1c7CgkJfQojICAgZW5kaWYKCiMgICBpZiBkZWZpbmVkKFVOSVgpICYmIGRlZmluZWQoRkVBVF9NT1VTRV9UVFkpCgkJZWxzZSBpZiAodXNlX3h0ZXJtX21vdXNlKCkgPiAxKQoJCXsKCQkgICAgaWYgKG1vdXNlX2NvZGUgJiBNT1VTRV9EUkFHX1hURVJNKQoJCQltb3VzZV9jb2RlIHw9IE1PVVNFX0RSQUc7CgkJfQojICAgZW5kaWYKIyAgIGlmZGVmIEZFQVRfWENMSVBCT0FSRAoJCWVsc2UgaWYgKCEobW91c2VfY29kZSAmIE1PVVNFX0RSQUcgJiB+TU9VU0VfQ0xJQ0tfTUFTSykpCgkJewoJCSAgICBpZiAoKG1vdXNlX2NvZGUgJiBNT1VTRV9SRUxFQVNFKSA9PSBNT1VTRV9SRUxFQVNFKQoJCQlzdG9wX3h0ZXJtX3RyYWNlKCk7CgkJICAgIGVsc2UKCQkJc3RhcnRfeHRlcm1fdHJhY2UobW91c2VfY29kZSk7CgkJfQojICAgZW5kaWYKIyAgZW5kaWYKCSAgICB9CiMgZW5kaWYgLyogIVVOSVggfHwgRkVBVF9NT1VTRV9YVEVSTSAqLwojIGlmZGVmIEZFQVRfTU9VU0VfTkVUCgkgICAgaWYgKGtleV9uYW1lWzBdID09IChpbnQpS1NfTkVUVEVSTV9NT1VTRSkKCSAgICB7CgkJaW50IG1jLCBtcjsKCgkJLyogZXhwZWN0IGEgcmF0aGVyIGxpbWl0ZWQgc2VxdWVuY2UgbGlrZTogYmFsYW5jaW5nIHsKCQkgKiBcMDMzfTYsNDVccgoJCSAqICc2JyBpcyB0aGUgcm93LCA0NSBpcyB0aGUgY29sdW1uCgkJICovCgkJcCA9IHRwICsgc2xlbjsKCQltciA9IGdldGRpZ2l0cygmcCk7CgkJaWYgKCpwKysgIT0gJywnKQoJCSAgICByZXR1cm4gLTE7CgkJbWMgPSBnZXRkaWdpdHMoJnApOwoJCWlmICgqcCsrICE9ICdccicpCgkJICAgIHJldHVybiAtMTsKCgkJbW91c2VfY29sID0gbWMgLSAxOwoJCW1vdXNlX3JvdyA9IG1yIC0gMTsKCQltb3VzZV9jb2RlID0gTU9VU0VfTEVGVDsKCQlzbGVuICs9IChpbnQpKHAgLSAodHAgKyBzbGVuKSk7CgkgICAgfQojIGVuZGlmCS8qIEZFQVRfTU9VU0VfTkVUICovCiMgaWZkZWYgRkVBVF9NT1VTRV9KU0IKCSAgICBpZiAoa2V5X25hbWVbMF0gPT0gKGludClLU19KU0JURVJNX01PVVNFKQoJICAgIHsKCQlpbnQgbXVsdCwgdmFsLCBpdGVyLCBidXR0b24sIHN0YXR1czsKCgkJLyogSlNCVEVSTSBJbnB1dCBNb2RlbAoJCSAqIFwwMzNbMH56dyB1bmlxIGVzY2FwZSBzZXF1ZW5jZQoJCSAqIChMLXgpICBMZWZ0IGJ1dHRvbiBwcmVzc2VkIC0gbm90IHByZXNzZWQgeCBub3QgcmVwb3J0aW5nCgkJICogKE0teCkgIE1pZGRsZSBidXR0b24gcHJlc3NlZCAtIG5vdCBwcmVzc2VkIHggbm90IHJlcG9ydGluZwoJCSAqIChSLXgpICBSaWdodCBidXR0b24gcHJlc3NlZCAtIG5vdCBwcmVzc2VkIHggbm90IHJlcG9ydGluZwoJCSAqIChTRG1kdSkgIFNpbmdsZSAsIERvdWJsZSBjbGljaywgbSBtb3VzZSBtb3ZlIGQgYnV0dG9uIGRvd24KCQkgKgkJCQkJCSAgIHUgYnV0dG9uIHVwCgkJICogICMjIyAgIFggY3Vyc29yIHBvc2l0aW9uIHBhZGRlZCB0byAzIGRpZ2l0cwoJCSAqICAjIyMgICBZIGN1cnNvciBwb3NpdGlvbiBwYWRkZWQgdG8gMyBkaWdpdHMKCQkgKiAocy14KSAgU0hJRlQga2V5IHByZXNzZWQgLSBub3QgcHJlc3NlZCB4IG5vdCByZXBvcnRpbmcKCQkgKiAoYy14KSAgQ1RSTCBrZXkgcHJlc3NlZCAtIG5vdCBwcmVzc2VkIHggbm90IHJlcG9ydGluZwoJCSAqIFwwMzNcXCB0ZXJtaW5hdGVpbmcgc2VxdWVuY2UKCQkgKi8KCgkJcCA9IHRwICsgc2xlbjsKCQlidXR0b24gPSBtb3VzZV9jb2RlID0gMDsKCQlzd2l0Y2ggKCpwKyspCgkJewoJCSAgICBjYXNlICdMJzogYnV0dG9uID0gMTsgYnJlYWs7CgkJICAgIGNhc2UgJy0nOiBicmVhazsKCQkgICAgY2FzZSAneCc6IGJyZWFrOyAvKiBpZ25vcmUgc2VxdWVuY2UgKi8KCQkgICAgZGVmYXVsdDogIHJldHVybiAtMTsgLyogVW5rbm93biBSZXN1bHQgKi8KCQl9CgkJc3dpdGNoICgqcCsrKQoJCXsKCQkgICAgY2FzZSAnTSc6IGJ1dHRvbiB8PSAyOyBicmVhazsKCQkgICAgY2FzZSAnLSc6IGJyZWFrOwoJCSAgICBjYXNlICd4JzogYnJlYWs7IC8qIGlnbm9yZSBzZXF1ZW5jZSAqLwoJCSAgICBkZWZhdWx0OiAgcmV0dXJuIC0xOyAvKiBVbmtub3duIFJlc3VsdCAqLwoJCX0KCQlzd2l0Y2ggKCpwKyspCgkJewoJCSAgICBjYXNlICdSJzogYnV0dG9uIHw9IDQ7IGJyZWFrOwoJCSAgICBjYXNlICctJzogYnJlYWs7CgkJICAgIGNhc2UgJ3gnOiBicmVhazsgLyogaWdub3JlIHNlcXVlbmNlICovCgkJICAgIGRlZmF1bHQ6ICByZXR1cm4gLTE7IC8qIFVua25vd24gUmVzdWx0ICovCgkJfQoJCXN0YXR1cyA9ICpwKys7CgkJZm9yICh2YWwgPSAwLCBtdWx0ID0gMTAwLCBpdGVyID0gMDsgaXRlciA8IDM7IGl0ZXIrKywKCQkJCQkJCSAgICAgIG11bHQgLz0gMTAsIHArKykKCQkgICAgaWYgKCpwID49ICcwJyAmJiAqcCA8PSAnOScpCgkJCXZhbCArPSAoKnAgLSAnMCcpICogbXVsdDsKCQkgICAgZWxzZQoJCQlyZXR1cm4gLTE7CgkJbW91c2VfY29sID0gdmFsOwoJCWZvciAodmFsID0gMCwgbXVsdCA9IDEwMCwgaXRlciA9IDA7IGl0ZXIgPCAzOyBpdGVyKyssCgkJCQkJCQkgICAgICBtdWx0IC89IDEwLCBwKyspCgkJICAgIGlmICgqcCA+PSAnMCcgJiYgKnAgPD0gJzknKQoJCQl2YWwgKz0gKCpwIC0gJzAnKSAqIG11bHQ7CgkJICAgIGVsc2UKCQkJcmV0dXJuIC0xOwoJCW1vdXNlX3JvdyA9IHZhbDsKCQlzd2l0Y2ggKCpwKyspCgkJewoJCSAgICBjYXNlICdzJzogYnV0dG9uIHw9IDg7IGJyZWFrOyAgLyogU0hJRlQga2V5IFByZXNzZWQgKi8KCQkgICAgY2FzZSAnLSc6IGJyZWFrOyAgLyogTm90IFByZXNzZWQgKi8KCQkgICAgY2FzZSAneCc6IGJyZWFrOyAgLyogTm90IFJlcG9ydGluZyAqLwoJCSAgICBkZWZhdWx0OiAgcmV0dXJuIC0xOyAvKiBVbmtub3duIFJlc3VsdCAqLwoJCX0KCQlzd2l0Y2ggKCpwKyspCgkJewoJCSAgICBjYXNlICdjJzogYnV0dG9uIHw9IDE2OyBicmVhazsgIC8qIENUUkwga2V5IFByZXNzZWQgKi8KCQkgICAgY2FzZSAnLSc6IGJyZWFrOyAgLyogTm90IFByZXNzZWQgKi8KCQkgICAgY2FzZSAneCc6IGJyZWFrOyAgLyogTm90IFJlcG9ydGluZyAqLwoJCSAgICBkZWZhdWx0OiAgcmV0dXJuIC0xOyAvKiBVbmtub3duIFJlc3VsdCAqLwoJCX0KCQlpZiAoKnArKyAhPSAnXDAzMycpCgkJICAgIHJldHVybiAtMTsKCQlpZiAoKnArKyAhPSAnXFwnKQoJCSAgICByZXR1cm4gLTE7CgkJc3dpdGNoIChzdGF0dXMpCgkJewoJCSAgICBjYXNlICdEJzogLyogRG91YmxlIENsaWNrICovCgkJICAgIGNhc2UgJ1MnOiAvKiBTaW5nbGUgQ2xpY2sgKi8KCQkJaWYgKGJ1dHRvbiAmIDEpIG1vdXNlX2NvZGUgfD0gTU9VU0VfTEVGVDsKCQkJaWYgKGJ1dHRvbiAmIDIpIG1vdXNlX2NvZGUgfD0gTU9VU0VfTUlERExFOwoJCQlpZiAoYnV0dG9uICYgNCkgbW91c2VfY29kZSB8PSBNT1VTRV9SSUdIVDsKCQkJaWYgKGJ1dHRvbiAmIDgpIG1vdXNlX2NvZGUgfD0gTU9VU0VfU0hJRlQ7CgkJCWlmIChidXR0b24gJiAxNikgbW91c2VfY29kZSB8PSBNT1VTRV9DVFJMOwoJCQlicmVhazsKCQkgICAgY2FzZSAnbSc6IC8qIE1vdXNlIG1vdmUgKi8KCQkJaWYgKGJ1dHRvbiAmIDEpIG1vdXNlX2NvZGUgfD0gTU9VU0VfTEVGVDsKCQkJaWYgKGJ1dHRvbiAmIDIpIG1vdXNlX2NvZGUgfD0gTU9VU0VfTUlERExFOwoJCQlpZiAoYnV0dG9uICYgNCkgbW91c2VfY29kZSB8PSBNT1VTRV9SSUdIVDsKCQkJaWYgKGJ1dHRvbiAmIDgpIG1vdXNlX2NvZGUgfD0gTU9VU0VfU0hJRlQ7CgkJCWlmIChidXR0b24gJiAxNikgbW91c2VfY29kZSB8PSBNT1VTRV9DVFJMOwoJCQlpZiAoKGJ1dHRvbiAmIDcpICE9IDApCgkJCXsKCQkJICAgIGhlbGRfYnV0dG9uID0gbW91c2VfY29kZTsKCQkJICAgIG1vdXNlX2NvZGUgfD0gTU9VU0VfRFJBRzsKCQkJfQoJCQlpc19kcmFnID0gVFJVRTsKCQkJc2hvd21vZGUoKTsKCQkJYnJlYWs7CgkJICAgIGNhc2UgJ2QnOiAvKiBCdXR0b24gRG93biAqLwoJCQlpZiAoYnV0dG9uICYgMSkgbW91c2VfY29kZSB8PSBNT1VTRV9MRUZUOwoJCQlpZiAoYnV0dG9uICYgMikgbW91c2VfY29kZSB8PSBNT1VTRV9NSURETEU7CgkJCWlmIChidXR0b24gJiA0KSBtb3VzZV9jb2RlIHw9IE1PVVNFX1JJR0hUOwoJCQlpZiAoYnV0dG9uICYgOCkgbW91c2VfY29kZSB8PSBNT1VTRV9TSElGVDsKCQkJaWYgKGJ1dHRvbiAmIDE2KSBtb3VzZV9jb2RlIHw9IE1PVVNFX0NUUkw7CgkJCWJyZWFrOwoJCSAgICBjYXNlICd1JzogLyogQnV0dG9uIFVwICovCgkJCWlmIChidXR0b24gJiAxKQoJCQkgICAgbW91c2VfY29kZSB8PSBNT1VTRV9MRUZUIHwgTU9VU0VfUkVMRUFTRTsKCQkJaWYgKGJ1dHRvbiAmIDIpCgkJCSAgICBtb3VzZV9jb2RlIHw9IE1PVVNFX01JRERMRSB8IE1PVVNFX1JFTEVBU0U7CgkJCWlmIChidXR0b24gJiA0KQoJCQkgICAgbW91c2VfY29kZSB8PSBNT1VTRV9SSUdIVCB8IE1PVVNFX1JFTEVBU0U7CgkJCWlmIChidXR0b24gJiA4KQoJCQkgICAgbW91c2VfY29kZSB8PSBNT1VTRV9TSElGVDsKCQkJaWYgKGJ1dHRvbiAmIDE2KQoJCQkgICAgbW91c2VfY29kZSB8PSBNT1VTRV9DVFJMOwoJCQlicmVhazsKCQkgICAgZGVmYXVsdDogcmV0dXJuIC0xOyAvKiBVbmtub3duIFJlc3VsdCAqLwoJCX0KCgkJc2xlbiArPSAocCAtICh0cCArIHNsZW4pKTsKCSAgICB9CiMgZW5kaWYgLyogRkVBVF9NT1VTRV9KU0IgKi8KIyBpZmRlZiBGRUFUX01PVVNFX0RFQwoJICAgIGlmIChrZXlfbmFtZVswXSA9PSAoaW50KUtTX0RFQ19NT1VTRSkKCSAgICB7CgkgICAgICAgLyogVGhlIERFQyBMb2NhdG9yIElucHV0IE1vZGVsCgkJKiBOZXR0ZXJtIGRlbGl2ZXJzIHRoZSBjb2RlIHNlcXVlbmNlOgoJCSogIFwwMzNbMjs0OzI0OzgwJncgIChsZWZ0IGJ1dHRvbiBkb3duKQoJCSogIFwwMzNbMzswOzI0OzgwJncgIChsZWZ0IGJ1dHRvbiB1cCkKCQkqICBcMDMzWzY7MTsyNDs4MCZ3ICAocmlnaHQgYnV0dG9uIGRvd24pCgkJKiAgXDAzM1s3OzA7MjQ7ODAmdyAgKHJpZ2h0IGJ1dHRvbiB1cCkKCQkqIENTSSBQZSA7IFBiIDsgUHIgOyBQYyA7IFBwICYgdwoJCSogUGUgaXMgdGhlIGV2ZW50IGNvZGUKCQkqIFBiIGlzIHRoZSBidXR0b24gY29kZQoJCSogUHIgaXMgdGhlIHJvdyBjb29yZGluYXRlCgkJKiBQYyBpcyB0aGUgY29sdW1uIGNvb3JkaW5hdGUKCQkqIFBwIGlzIHRoZSB0aGlyZCBjb29yZGluYXRlIChwYWdlIG51bWJlcikKCQkqIFBlLCB0aGUgZXZlbnQgY29kZSBpbmRpY2F0ZXMgd2hhdCBldmVudCBjYXVzZWQgdGhpcyByZXBvcnQKCQkqICAgIFRoZSBmb2xsb3dpbmcgZXZlbnQgY29kZXMgYXJlIGRlZmluZWQ6CgkJKiAgICAwIC0gcmVxdWVzdCwgdGhlIHRlcm1pbmFsIHJlY2VpdmVkIGFuIGV4cGxpY2l0IHJlcXVlc3QKCQkqCSBmb3IgYSBsb2NhdG9yIHJlcG9ydCwgYnV0IHRoZSBsb2NhdG9yIGlzIHVuYXZhaWxhYmxlCgkJKiAgICAxIC0gcmVxdWVzdCwgdGhlIHRlcm1pbmFsIHJlY2VpdmVkIGFuIGV4cGxpY2l0IHJlcXVlc3QKCQkqCSBmb3IgYSBsb2NhdG9yIHJlcG9ydAoJCSogICAgMiAtIGxlZnQgYnV0dG9uIGRvd24KCQkqICAgIDMgLSBsZWZ0IGJ1dHRvbiB1cAoJCSogICAgNCAtIG1pZGRsZSBidXR0b24gZG93bgoJCSogICAgNSAtIG1pZGRsZSBidXR0b24gdXAKCQkqICAgIDYgLSByaWdodCBidXR0b24gZG93bgoJCSogICAgNyAtIHJpZ2h0IGJ1dHRvbiB1cAoJCSogICAgOCAtIGZvdXJ0aCBidXR0b24gZG93bgoJCSogICAgOSAtIGZvdXJ0aCBidXR0b24gdXAKCQkqICAgIDEwIC0gbG9jYXRvciBvdXRzaWRlIGZpbHRlciByZWN0YW5nbGUKCQkqIFBiLCB0aGUgYnV0dG9uIGNvZGUsIEFTQ0lJIGRlY2ltYWwgMC0xNSBpbmRpY2F0aW5nIHdoaWNoCgkJKiAgIGJ1dHRvbnMgYXJlIGRvd24gaWYgYW55LiBUaGUgc3RhdGUgb2YgdGhlIGZvdXIgYnV0dG9ucwoJCSogICBvbiB0aGUgbG9jYXRvciBjb3JyZXNwb25kIHRvIHRoZSBsb3cgZm91ciBiaXRzIG9mIHRoZQoJCSogICBkZWNpbWFsIHZhbHVlLAoJCSogICAiMSIgbWVhbnMgYnV0dG9uIGRlcHJlc3NlZAoJCSogICAwIC0gbm8gYnV0dG9ucyBkb3duLAoJCSogICAxIC0gcmlnaHQsCgkJKiAgIDIgLSBtaWRkbGUsCgkJKiAgIDQgLSBsZWZ0LAoJCSogICA4IC0gZm91cnRoCgkJKiBQciBpcyB0aGUgcm93IGNvb3JkaW5hdGUgb2YgdGhlIGxvY2F0b3IgcG9zaXRpb24gaW4gdGhlIHBhZ2UsCgkJKiAgIGVuY29kZWQgYXMgYW4gQVNDSUkgZGVjaW1hbCB2YWx1ZS4KCQkqICAgSWYgUHIgaXMgb21pdHRlZCwgdGhlIGxvY2F0b3IgcG9zaXRpb24gaXMgdW5kZWZpbmVkCgkJKiAgIChvdXRzaWRlIHRoZSB0ZXJtaW5hbCB3aW5kb3cgZm9yIGV4YW1wbGUpLgoJCSogUGMgaXMgdGhlIGNvbHVtbiBjb29yZGluYXRlIG9mIHRoZSBsb2NhdG9yIHBvc2l0aW9uIGluIHRoZQoJCSogICBwYWdlLCBlbmNvZGVkIGFzIGFuIEFTQ0lJIGRlY2ltYWwgdmFsdWUuCgkJKiAgIElmIFBjIGlzIG9taXR0ZWQsIHRoZSBsb2NhdG9yIHBvc2l0aW9uIGlzIHVuZGVmaW5lZAoJCSogICAob3V0c2lkZSB0aGUgdGVybWluYWwgd2luZG93IGZvciBleGFtcGxlKS4KCQkqIFBwIGlzIHRoZSBwYWdlIGNvb3JkaW5hdGUgb2YgdGhlIGxvY2F0b3IgcG9zaXRpb24KCQkqICAgZW5jb2RlZCBhcyBhbiBBU0NJSSBkZWNpbWFsIHZhbHVlLgoJCSogICBUaGUgcGFnZSBjb29yZGluYXRlIG1heSBiZSBvbWl0dGVkIGlmIHRoZSBsb2NhdG9yIGlzIG9uCgkJKiAgIHBhZ2Ugb25lICh0aGUgZGVmYXVsdCkuICBXZSBpZ25vcmUgaXQgYW55d2F5LgoJCSovCgkJaW50IFBlLCBQYiwgUHIsIFBjOwoKCQlwID0gdHAgKyBzbGVuOwoKCQkvKiBnZXQgZXZlbnQgc3RhdHVzICovCgkJUGUgPSBnZXRkaWdpdHMoJnApOwoJCWlmICgqcCsrICE9ICc7JykKCQkgICAgcmV0dXJuIC0xOwoKCQkvKiBnZXQgYnV0dG9uIHN0YXR1cyAqLwoJCVBiID0gZ2V0ZGlnaXRzKCZwKTsKCQlpZiAoKnArKyAhPSAnOycpCgkJICAgIHJldHVybiAtMTsKCgkJLyogZ2V0IHJvdyBzdGF0dXMgKi8KCQlQciA9IGdldGRpZ2l0cygmcCk7CgkJaWYgKCpwKysgIT0gJzsnKQoJCSAgICByZXR1cm4gLTE7CgoJCS8qIGdldCBjb2x1bW4gc3RhdHVzICovCgkJUGMgPSBnZXRkaWdpdHMoJnApOwoKCQkvKiB0aGUgcGFnZSBwYXJhbWV0ZXIgaXMgb3B0aW9uYWwgKi8KCQlpZiAoKnAgPT0gJzsnKQoJCXsKCQkgICAgcCsrOwoJCSAgICAodm9pZClnZXRkaWdpdHMoJnApOwoJCX0KCQlpZiAoKnArKyAhPSAnJicpCgkJICAgIHJldHVybiAtMTsKCQlpZiAoKnArKyAhPSAndycpCgkJICAgIHJldHVybiAtMTsKCgkJbW91c2VfY29kZSA9IDA7CgkJc3dpdGNoIChQZSkKCQl7CgkJY2FzZSAgMDogcmV0dXJuIC0xOyAvKiBwb3NpdGlvbiByZXF1ZXN0IHdoaWxlIHVuYXZhaWxhYmxlICovCgkJY2FzZSAgMTogLyogYSByZXNwb25zZSB0byBhIGxvY2F0b3IgcG9zaXRpb24gcmVxdWVzdCBpbmNsdWRlcwoJCQkgICAgdGhlIHN0YXR1cyBvZiBhbGwgYnV0dG9ucyAqLwoJCQkgUGIgJj0gNzsgICAvKiBtYXNrIG9mZiBhbmQgaWdub3JlIGZvdXJ0aCBidXR0b24gKi8KCQkJIGlmIChQYiAmIDQpCgkJCSAgICAgbW91c2VfY29kZSAgPSBNT1VTRV9MRUZUOwoJCQkgaWYgKFBiICYgMikKCQkJICAgICBtb3VzZV9jb2RlICA9IE1PVVNFX01JRERMRTsKCQkJIGlmIChQYiAmIDEpCgkJCSAgICAgbW91c2VfY29kZSAgPSBNT1VTRV9SSUdIVDsKCQkJIGlmIChQYikKCQkJIHsKCQkJICAgICBoZWxkX2J1dHRvbiA9IG1vdXNlX2NvZGU7CgkJCSAgICAgbW91c2VfY29kZSB8PSBNT1VTRV9EUkFHOwoJCQkgICAgIFdhbnRRdWVyeU1vdXNlID0gMTsKCQkJIH0KCQkJIGlzX2RyYWcgPSBUUlVFOwoJCQkgc2hvd21vZGUoKTsKCQkJIGJyZWFrOwoJCWNhc2UgIDI6IG1vdXNlX2NvZGUgPSBNT1VTRV9MRUZUOwoJCQkgV2FudFF1ZXJ5TW91c2UgPSAxOwoJCQkgYnJlYWs7CgkJY2FzZSAgMzogbW91c2VfY29kZSA9IE1PVVNFX1JFTEVBU0UgfCBNT1VTRV9MRUZUOwoJCQkgYnJlYWs7CgkJY2FzZSAgNDogbW91c2VfY29kZSA9IE1PVVNFX01JRERMRTsKCQkJIFdhbnRRdWVyeU1vdXNlID0gMTsKCQkJIGJyZWFrOwoJCWNhc2UgIDU6IG1vdXNlX2NvZGUgPSBNT1VTRV9SRUxFQVNFIHwgTU9VU0VfTUlERExFOwoJCQkgYnJlYWs7CgkJY2FzZSAgNjogbW91c2VfY29kZSA9IE1PVVNFX1JJR0hUOwoJCQkgV2FudFF1ZXJ5TW91c2UgPSAxOwoJCQkgYnJlYWs7CgkJY2FzZSAgNzogbW91c2VfY29kZSA9IE1PVVNFX1JFTEVBU0UgfCBNT1VTRV9SSUdIVDsKCQkJIGJyZWFrOwoJCWNhc2UgIDg6IHJldHVybiAtMTsgLyogZm91cnRoIGJ1dHRvbiBkb3duICovCgkJY2FzZSAgOTogcmV0dXJuIC0xOyAvKiBmb3VydGggYnV0dG9uIHVwICovCgkJY2FzZSAxMDogcmV0dXJuIC0xOyAvKiBtb3VzZSBvdXRzaWRlIG9mIGZpbHRlciByZWN0YW5nbGUgKi8KCQlkZWZhdWx0OiByZXR1cm4gLTE7IC8qIHNob3VsZCBuZXZlciBvY2N1ciAqLwoJCX0KCgkJbW91c2VfY29sID0gUGMgLSAxOwoJCW1vdXNlX3JvdyA9IFByIC0gMTsKCgkJc2xlbiArPSAoaW50KShwIC0gKHRwICsgc2xlbikpOwoJICAgIH0KIyBlbmRpZiAvKiBGRUFUX01PVVNFX0RFQyAqLwojIGlmZGVmIEZFQVRfTU9VU0VfUFRFUk0KCSAgICBpZiAoa2V5X25hbWVbMF0gPT0gKGludClLU19QVEVSTV9NT1VTRSkKCSAgICB7CgkJaW50IGJ1dHRvbiwgbnVtX2NsaWNrcywgYWN0aW9uLCBtYywgbXI7CgoJCXAgPSB0cCArIHNsZW47CgoJCWFjdGlvbiA9IGdldGRpZ2l0cygmcCk7CgkJaWYgKCpwKysgIT0gJzsnKQoJCSAgICByZXR1cm4gLTE7CgoJCW1vdXNlX3JvdyA9IGdldGRpZ2l0cygmcCk7CgkJaWYgKCpwKysgIT0gJzsnKQoJCSAgICByZXR1cm4gLTE7CgkJbW91c2VfY29sID0gZ2V0ZGlnaXRzKCZwKTsKCQlpZiAoKnArKyAhPSAnOycpCgkJICAgIHJldHVybiAtMTsKCgkJYnV0dG9uID0gZ2V0ZGlnaXRzKCZwKTsKCQltb3VzZV9jb2RlID0gMDsKCgkJc3dpdGNoKCBidXR0b24gKQoJCXsKCQkgICAgY2FzZSA0OiBtb3VzZV9jb2RlID0gTU9VU0VfTEVGVDsgYnJlYWs7CgkJICAgIGNhc2UgMTogbW91c2VfY29kZSA9IE1PVVNFX1JJR0hUOyBicmVhazsKCQkgICAgY2FzZSAyOiBtb3VzZV9jb2RlID0gTU9VU0VfTUlERExFOyBicmVhazsKCQkgICAgZGVmYXVsdDogcmV0dXJuIC0xOwoJCX0KCgkJc3dpdGNoKCBhY3Rpb24gKQoJCXsKCQkgICAgY2FzZSAzMTogLyogSW5pdGlhbCBwcmVzcyAqLwoJCQlpZiAoKnArKyAhPSAnOycpCgkJCSAgICByZXR1cm4gLTE7CgoJCQludW1fY2xpY2tzID0gZ2V0ZGlnaXRzKCZwKTsgLyogTm90IHVzZWQgKi8KCQkJYnJlYWs7CgoJCSAgICBjYXNlIDMyOiAvKiBSZWxlYXNlICovCgkJCW1vdXNlX2NvZGUgfD0gTU9VU0VfUkVMRUFTRTsKCQkJYnJlYWs7CgoJCSAgICBjYXNlIDMzOiAvKiBEcmFnICovCgkJCWhlbGRfYnV0dG9uID0gbW91c2VfY29kZTsKCQkJbW91c2VfY29kZSB8PSBNT1VTRV9EUkFHOwoJCQlicmVhazsKCgkJICAgIGRlZmF1bHQ6CgkJCXJldHVybiAtMTsKCQl9CgoJCWlmICgqcCsrICE9ICd0JykKCQkgICAgcmV0dXJuIC0xOwoKCQlzbGVuICs9IChwIC0gKHRwICsgc2xlbikpOwoJICAgIH0KIyBlbmRpZiAvKiBGRUFUX01PVVNFX1BURVJNICovCgoJICAgIC8qIEludGVycHJldCB0aGUgbW91c2UgY29kZSAqLwoJICAgIGN1cnJlbnRfYnV0dG9uID0gKG1vdXNlX2NvZGUgJiBNT1VTRV9DTElDS19NQVNLKTsKCSAgICBpZiAoY3VycmVudF9idXR0b24gPT0gTU9VU0VfUkVMRUFTRQojIGlmZGVmIEZFQVRfTU9VU0VfWFRFUk0KCQkgICAgJiYgd2hlZWxfY29kZSA9PSAwCiMgZW5kaWYKCQkgICAgKQoJICAgIHsKCQkvKgoJCSAqIElmIHdlIGdldCBhIG1vdXNlIGRyYWcgb3IgcmVsZWFzZSBldmVudCB3aGVuCgkJICogdGhlcmUgaXMgbm8gbW91c2UgYnV0dG9uIGhlbGQgZG93biAoaGVsZF9idXR0b24gPT0KCQkgKiBNT1VTRV9SRUxFQVNFKSwgcHJvZHVjZSBhIEtfSUdOT1JFIGJlbG93LgoJCSAqIChjYW4gaGFwcGVuIHdoZW4geW91IGhvbGQgZG93biB0d28gYnV0dG9ucwoJCSAqIGFuZCB0aGVuIGxldCB0aGVtIGdvLCBvciBjbGljayBpbiB0aGUgbWVudSBiYXIsIGJ1dCBub3QKCQkgKiBvbiBhIG1lbnUsIGFuZCBkcmFnIGludG8gdGhlIHRleHQpLgoJCSAqLwoJCWlmICgobW91c2VfY29kZSAmIE1PVVNFX0RSQUcpID09IE1PVVNFX0RSQUcpCgkJICAgIGlzX2RyYWcgPSBUUlVFOwoJCWN1cnJlbnRfYnV0dG9uID0gaGVsZF9idXR0b247CgkgICAgfQoJICAgIGVsc2UgaWYgKHdoZWVsX2NvZGUgPT0gMCkKCSAgICB7CiMgaWZkZWYgQ0hFQ0tfRE9VQkxFX0NMSUNLCiMgIGlmZGVmIEZFQVRfTU9VU0VfR1BNCiMgICBpZmRlZiBGRUFUX0dVSQoJCS8qCgkJICogT25seSBmb3IgVW5peCwgd2hlbiBHVUkgb3IgZ3BtIGlzIG5vdCBhY3RpdmUsIHdlIGhhbmRsZQoJCSAqIG11bHRpLWNsaWNrcyBoZXJlLgoJCSAqLwoJCWlmIChncG1fZmxhZyA9PSAwICYmICFndWkuaW5fdXNlKQojICAgZWxzZQoJCWlmIChncG1fZmxhZyA9PSAwKQojICAgZW5kaWYKIyAgZWxzZQojICAgaWZkZWYgRkVBVF9HVUkKCQlpZiAoIWd1aS5pbl91c2UpCiMgICBlbmRpZgojICBlbmRpZgoJCXsKCQkgICAgLyoKCQkgICAgICogQ29tcHV0ZSB0aGUgdGltZSBlbGFwc2VkIHNpbmNlIHRoZSBwcmV2aW91cyBtb3VzZSBjbGljay4KCQkgICAgICovCgkJICAgIGdldHRpbWVvZmRheSgmbW91c2VfdGltZSwgTlVMTCk7CgkJICAgIHRpbWVkaWZmID0gKG1vdXNlX3RpbWUudHZfdXNlYwoJCQkJCSAgICAtIG9yaWdfbW91c2VfdGltZS50dl91c2VjKSAvIDEwMDA7CgkJICAgIGlmICh0aW1lZGlmZiA8IDApCgkJCS0tb3JpZ19tb3VzZV90aW1lLnR2X3NlYzsKCQkgICAgdGltZWRpZmYgKz0gKG1vdXNlX3RpbWUudHZfc2VjCgkJCQkJICAgICAtIG9yaWdfbW91c2VfdGltZS50dl9zZWMpICogMTAwMDsKCQkgICAgb3JpZ19tb3VzZV90aW1lID0gbW91c2VfdGltZTsKCQkgICAgaWYgKG1vdXNlX2NvZGUgPT0gb3JpZ19tb3VzZV9jb2RlCgkJCSAgICAmJiB0aW1lZGlmZiA8IHBfbW91c2V0CgkJCSAgICAmJiBvcmlnX251bV9jbGlja3MgIT0gNAoJCQkgICAgJiYgb3JpZ19tb3VzZV9jb2wgPT0gbW91c2VfY29sCgkJCSAgICAmJiBvcmlnX21vdXNlX3JvdyA9PSBtb3VzZV9yb3cKI2lmZGVmIEZFQVRfRElGRgoJCQkgICAgJiYgb3JpZ190b3BmaWxsID09IGN1cndpbi0+d190b3BmaWxsCiNlbmRpZgoJCQkgICAgJiYgb3JpZ190b3BsaW5lID09IGN1cndpbi0+d190b3BsaW5lKQoJCQkrK29yaWdfbnVtX2NsaWNrczsKCQkgICAgZWxzZQoJCQlvcmlnX251bV9jbGlja3MgPSAxOwoJCSAgICBvcmlnX21vdXNlX2NvbCA9IG1vdXNlX2NvbDsKCQkgICAgb3JpZ19tb3VzZV9yb3cgPSBtb3VzZV9yb3c7CgkJICAgIG9yaWdfdG9wbGluZSA9IGN1cndpbi0+d190b3BsaW5lOwojaWZkZWYgRkVBVF9ESUZGCgkJICAgIG9yaWdfdG9wZmlsbCA9IGN1cndpbi0+d190b3BmaWxsOwojZW5kaWYKCQl9CiMgIGlmIGRlZmluZWQoRkVBVF9HVUkpIHx8IGRlZmluZWQoRkVBVF9NT1VTRV9HUE0pCgkJZWxzZQoJCSAgICBvcmlnX251bV9jbGlja3MgPSBOVU1fTU9VU0VfQ0xJQ0tTKG1vdXNlX2NvZGUpOwojICBlbmRpZgojIGVsc2UKCQlvcmlnX251bV9jbGlja3MgPSBOVU1fTU9VU0VfQ0xJQ0tTKG1vdXNlX2NvZGUpOwojIGVuZGlmCgkJaXNfY2xpY2sgPSBUUlVFOwoJCW9yaWdfbW91c2VfY29kZSA9IG1vdXNlX2NvZGU7CgkgICAgfQoJICAgIGlmICghaXNfZHJhZykKCQloZWxkX2J1dHRvbiA9IG1vdXNlX2NvZGUgJiBNT1VTRV9DTElDS19NQVNLOwoKCSAgICAvKgoJICAgICAqIFRyYW5zbGF0ZSB0aGUgYWN0dWFsIG1vdXNlIGV2ZW50IGludG8gYSBwc2V1ZG8gbW91c2UgZXZlbnQuCgkgICAgICogRmlyc3Qgd29yayBvdXQgd2hhdCBtb2RpZmllcnMgYXJlIHRvIGJlIHVzZWQuCgkgICAgICovCgkgICAgbW9kaWZpZXJzID0gMHgwOwoJICAgIGlmIChvcmlnX21vdXNlX2NvZGUgJiBNT1VTRV9TSElGVCkKCQltb2RpZmllcnMgfD0gTU9EX01BU0tfU0hJRlQ7CgkgICAgaWYgKG9yaWdfbW91c2VfY29kZSAmIE1PVVNFX0NUUkwpCgkJbW9kaWZpZXJzIHw9IE1PRF9NQVNLX0NUUkw7CgkgICAgaWYgKG9yaWdfbW91c2VfY29kZSAmIE1PVVNFX0FMVCkKCQltb2RpZmllcnMgfD0gTU9EX01BU0tfQUxUOwoJICAgIGlmIChvcmlnX251bV9jbGlja3MgPT0gMikKCQltb2RpZmllcnMgfD0gTU9EX01BU0tfMkNMSUNLOwoJICAgIGVsc2UgaWYgKG9yaWdfbnVtX2NsaWNrcyA9PSAzKQoJCW1vZGlmaWVycyB8PSBNT0RfTUFTS18zQ0xJQ0s7CgkgICAgZWxzZSBpZiAob3JpZ19udW1fY2xpY2tzID09IDQpCgkJbW9kaWZpZXJzIHw9IE1PRF9NQVNLXzRDTElDSzsKCgkgICAgLyogQWRkIHRoZSBtb2RpZmllciBjb2RlcyB0byBvdXIgc3RyaW5nICovCgkgICAgaWYgKG1vZGlmaWVycyAhPSAwKQoJICAgIHsKCQlzdHJpbmdbbmV3X3NsZW4rK10gPSBLX1NQRUNJQUw7CgkJc3RyaW5nW25ld19zbGVuKytdID0gKGludClLU19NT0RJRklFUjsKCQlzdHJpbmdbbmV3X3NsZW4rK10gPSBtb2RpZmllcnM7CgkgICAgfQoKCSAgICAvKiBXb3JrIG91dCBvdXIgcHNldWRvIG1vdXNlIGV2ZW50ICovCgkgICAga2V5X25hbWVbMF0gPSAoaW50KUtTX0VYVFJBOwoJICAgIGlmICh3aGVlbF9jb2RlICE9IDApCgkJa2V5X25hbWVbMV0gPSAod2hlZWxfY29kZSAmIDEpCgkJCQkJPyAoaW50KUtFX01PVVNFVVAgOiAoaW50KUtFX01PVVNFRE9XTjsKCSAgICBlbHNlCgkJa2V5X25hbWVbMV0gPSBnZXRfcHNldWRvX21vdXNlX2NvZGUoY3VycmVudF9idXR0b24sCgkJCQkJCQkgICBpc19jbGljaywgaXNfZHJhZyk7Cgl9CiNlbmRpZiAvKiBGRUFUX01PVVNFICovCgojaWZkZWYgRkVBVF9HVUkKCS8qCgkgKiBJZiB1c2luZyB0aGUgR1VJLCB0aGVuIHdlIGdldCBtZW51IGFuZCBzY3JvbGxiYXIgZXZlbnRzLgoJICoKCSAqIEEgbWVudSBldmVudCBpcyBlbmNvZGVkIGFzIEtfU1BFQ0lBTCwgS1NfTUVOVSwgS0VfRklMTEVSIGZvbGxvd2VkIGJ5CgkgKiBmb3VyIGJ5dGVzIHdoaWNoIGFyZSB0byBiZSB0YWtlbiBhcyBhIHBvaW50ZXIgdG8gdGhlIHZpbW1lbnVfVAoJICogc3RydWN0dXJlLgoJICoKCSAqIEEgc2Nyb2xsYmFyIGV2ZW50IGlzIEtfU1BFQ0lBTCwgS1NfVkVSX1NDUk9MTEJBUiwgS0VfRklMTEVSIGZvbGxvd2VkCgkgKiBieSBvbmUgYnl0ZSByZXByZXNlbnRpbmcgdGhlIHNjcm9sbGJhciBudW1iZXIsIGFuZCB0aGVuIGZvdXIgYnl0ZXMKCSAqIHJlcHJlc2VudGluZyBhIGxvbmdfdSB3aGljaCBpcyB0aGUgbmV3IHZhbHVlIG9mIHRoZSBzY3JvbGxiYXIuCgkgKgoJICogQSBob3Jpem9udGFsIHNjcm9sbGJhciBldmVudCBpcyBLX1NQRUNJQUwsIEtTX0hPUl9TQ1JPTExCQVIsCgkgKiBLRV9GSUxMRVIgZm9sbG93ZWQgYnkgZm91ciBieXRlcyByZXByZXNlbnRpbmcgYSBsb25nX3Ugd2hpY2ggaXMgdGhlCgkgKiBuZXcgdmFsdWUgb2YgdGhlIHNjcm9sbGJhci4KCSAqLwojIGlmZGVmIEZFQVRfTUVOVQoJZWxzZSBpZiAoa2V5X25hbWVbMF0gPT0gKGludClLU19NRU5VKQoJewoJICAgIGxvbmdfdQl2YWw7CgoJICAgIG51bV9ieXRlcyA9IGdldF9sb25nX2Zyb21fYnVmKHRwICsgc2xlbiwgJnZhbCk7CgkgICAgaWYgKG51bV9ieXRlcyA9PSAtMSkKCQlyZXR1cm4gLTE7CgkgICAgY3VycmVudF9tZW51ID0gKHZpbW1lbnVfVCAqKXZhbDsKCSAgICBzbGVuICs9IG51bV9ieXRlczsKCX0KIyBlbmRpZgojIGlmbmRlZiBVU0VfT05fRkxZX1NDUk9MTAoJZWxzZSBpZiAoa2V5X25hbWVbMF0gPT0gKGludClLU19WRVJfU0NST0xMQkFSKQoJewoJICAgIGxvbmdfdQl2YWw7CgoJICAgIC8qIEdldCB0aGUgbGFzdCBzY3JvbGxiYXIgZXZlbnQgaW4gdGhlIHF1ZXVlIG9mIHRoZSBzYW1lIHR5cGUgKi8KCSAgICBqID0gMDsKCSAgICBmb3IgKGkgPSAwOyB0cFtqXSA9PSBDU0kgJiYgdHBbaiArIDFdID09IEtTX1ZFUl9TQ1JPTExCQVIKCQkJCQkJICAgICAmJiB0cFtqICsgMl0gIT0gTlVMOyArK2kpCgkgICAgewoJCWogKz0gMzsKCQludW1fYnl0ZXMgPSBnZXRfYnl0ZXNfZnJvbV9idWYodHAgKyBqLCBieXRlcywgMSk7CgkJaWYgKG51bV9ieXRlcyA9PSAtMSkKCQkgICAgYnJlYWs7CgkJaWYgKGkgPT0gMCkKCQkgICAgY3VycmVudF9zY3JvbGxiYXIgPSAoaW50KWJ5dGVzWzBdOwoJCWVsc2UgaWYgKGN1cnJlbnRfc2Nyb2xsYmFyICE9IChpbnQpYnl0ZXNbMF0pCgkJICAgIGJyZWFrOwoJCWogKz0gbnVtX2J5dGVzOwoJCW51bV9ieXRlcyA9IGdldF9sb25nX2Zyb21fYnVmKHRwICsgaiwgJnZhbCk7CgkJaWYgKG51bV9ieXRlcyA9PSAtMSkKCQkgICAgYnJlYWs7CgkJc2Nyb2xsYmFyX3ZhbHVlID0gdmFsOwoJCWogKz0gbnVtX2J5dGVzOwoJCXNsZW4gPSBqOwoJICAgIH0KCSAgICBpZiAoaSA9PSAwKQkJLyogbm90IGVub3VnaCBjaGFyYWN0ZXJzIHRvIG1ha2Ugb25lICovCgkJcmV0dXJuIC0xOwoJfQoJZWxzZSBpZiAoa2V5X25hbWVbMF0gPT0gKGludClLU19IT1JfU0NST0xMQkFSKQoJewoJICAgIGxvbmdfdQl2YWw7CgoJICAgIC8qIEdldCB0aGUgbGFzdCBob3Jpei4gc2Nyb2xsYmFyIGV2ZW50IGluIHRoZSBxdWV1ZSAqLwoJICAgIGogPSAwOwoJICAgIGZvciAoaSA9IDA7IHRwW2pdID09IENTSSAmJiB0cFtqICsgMV0gPT0gS1NfSE9SX1NDUk9MTEJBUgoJCQkJCQkgICAgICYmIHRwW2ogKyAyXSAhPSBOVUw7ICsraSkKCSAgICB7CgkJaiArPSAzOwoJCW51bV9ieXRlcyA9IGdldF9sb25nX2Zyb21fYnVmKHRwICsgaiwgJnZhbCk7CgkJaWYgKG51bV9ieXRlcyA9PSAtMSkKCQkgICAgYnJlYWs7CgkJc2Nyb2xsYmFyX3ZhbHVlID0gdmFsOwoJCWogKz0gbnVtX2J5dGVzOwoJCXNsZW4gPSBqOwoJICAgIH0KCSAgICBpZiAoaSA9PSAwKQkJLyogbm90IGVub3VnaCBjaGFyYWN0ZXJzIHRvIG1ha2Ugb25lICovCgkJcmV0dXJuIC0xOwoJfQojIGVuZGlmIC8qICFVU0VfT05fRkxZX1NDUk9MTCAqLwojZW5kaWYgLyogRkVBVF9HVUkgKi8KCgkvKiBGaW5hbGx5LCBhZGQgdGhlIHNwZWNpYWwga2V5IGNvZGUgdG8gb3VyIHN0cmluZyAqLwoJaWYgKGtleV9uYW1lWzBdID09IEtTX0tFWSkKCSAgICBzdHJpbmdbbmV3X3NsZW4rK10gPSBrZXlfbmFtZVsxXTsJLyogZnJvbSAiOnNldCA8TS1iPj14eCIgKi8KCWVsc2UKCXsKCSAgICBzdHJpbmdbbmV3X3NsZW4rK10gPSBLX1NQRUNJQUw7CgkgICAgc3RyaW5nW25ld19zbGVuKytdID0ga2V5X25hbWVbMF07CgkgICAgc3RyaW5nW25ld19zbGVuKytdID0ga2V5X25hbWVbMV07Cgl9CglzdHJpbmdbbmV3X3NsZW5dID0gTlVMOwoJZXh0cmEgPSBuZXdfc2xlbiAtIHNsZW47CglpZiAoYnVmID09IE5VTEwpCgl7CgkgICAgaWYgKGV4dHJhIDwgMCkKCQkvKiByZW1vdmUgbWF0Y2hlZCBjaGFycywgdGFraW5nIGNhcmUgb2Ygbm9yZW1hcCAqLwoJCWRlbF90eXBlYnVmKC1leHRyYSwgb2Zmc2V0KTsKCSAgICBlbHNlIGlmIChleHRyYSA+IDApCgkJLyogaW5zZXJ0IHRoZSBleHRyYSBzcGFjZSB3ZSBuZWVkICovCgkJaW5zX3R5cGVidWYoc3RyaW5nICsgc2xlbiwgUkVNQVBfWUVTLCBvZmZzZXQsIEZBTFNFLCBGQUxTRSk7CgoJICAgIC8qCgkgICAgICogQ2FyZWZ1bDogZGVsX3R5cGVidWYoKSBhbmQgaW5zX3R5cGVidWYoKSBtYXkgaGF2ZSByZWFsbG9jYXRlZAoJICAgICAqIHR5cGVidWYudGJfYnVmW10hCgkgICAgICovCgkgICAgbWNoX21lbW1vdmUodHlwZWJ1Zi50Yl9idWYgKyB0eXBlYnVmLnRiX29mZiArIG9mZnNldCwgc3RyaW5nLAoJCQkJCQkJICAgIChzaXplX3QpbmV3X3NsZW4pOwoJfQoJZWxzZQoJewoJICAgIGlmIChleHRyYSA8IDApCgkJLyogcmVtb3ZlIG1hdGNoZWQgY2hhcmFjdGVycyAqLwoJCW1jaF9tZW1tb3ZlKGJ1ZiArIG9mZnNldCwgYnVmICsgb2Zmc2V0IC0gZXh0cmEsCgkJCQkJICAgKHNpemVfdCkoYnVmbGVuICsgb2Zmc2V0ICsgZXh0cmEpKTsKCSAgICBlbHNlIGlmIChleHRyYSA+IDApCgkJLyogaW5zZXJ0IHRoZSBleHRyYSBzcGFjZSB3ZSBuZWVkICovCgkJbWNoX21lbW1vdmUoYnVmICsgb2Zmc2V0ICsgZXh0cmEsIGJ1ZiArIG9mZnNldCwKCQkJCQkJICAgKHNpemVfdCkoYnVmbGVuIC0gb2Zmc2V0KSk7CgkgICAgbWNoX21lbW1vdmUoYnVmICsgb2Zmc2V0LCBzdHJpbmcsIChzaXplX3QpbmV3X3NsZW4pOwoJfQoJcmV0dXJuIChsZW4gKyBleHRyYSArIG9mZnNldCk7CiAgICB9CgogICAgcmV0dXJuIDA7CQkJICAgIC8qIG5vIG1hdGNoIGZvdW5kICovCn0KCi8qCiAqIFJlcGxhY2UgYW55IHRlcm1pbmFsIGNvZGUgc3RyaW5ncyBpbiBmcm9tW10gd2l0aCB0aGUgZXF1aXZhbGVudCBpbnRlcm5hbAogKiB2aW0gcmVwcmVzZW50YXRpb24uCVRoaXMgaXMgdXNlZCBmb3IgdGhlICJmcm9tIiBhbmQgInRvIiBwYXJ0IG9mIGEKICogbWFwcGluZywgYW5kIHRoZSAidG8iIHBhcnQgb2YgYSBtZW51IGNvbW1hbmQuCiAqIEFueSBzdHJpbmdzIGxpa2UgIjxDLVVQPiIgYXJlIGFsc28gcmVwbGFjZWQsIHVubGVzcyAnY3BvcHRpb25zJyBjb250YWlucwogKiAnPCcuCiAqIEtfU1BFQ0lBTCBieSBpdHNlbGYgaXMgcmVwbGFjZWQgYnkgS19TUEVDSUFMIEtTX1NQRUNJQUwgS0VfRklMTEVSLgogKgogKiBUaGUgcmVwbGFjZW1lbnQgaXMgZG9uZSBpbiByZXN1bHRbXSBhbmQgZmluYWxseSBjb3BpZWQgaW50byBhbGxvY2F0ZWQKICogbWVtb3J5LiBJZiB0aGlzIGFsbCB3b3JrcyB3ZWxsICpidWZwIGlzIHNldCB0byB0aGUgYWxsb2NhdGVkIG1lbW9yeSBhbmQgYQogKiBwb2ludGVyIHRvIGl0IGlzIHJldHVybmVkLiBJZiBzb21ldGhpbmcgZmFpbHMgKmJ1ZnAgaXMgc2V0IHRvIE5VTEwgYW5kIGZyb20KICogaXMgcmV0dXJuZWQuCiAqCiAqIENUUkwtViBjaGFyYWN0ZXJzIGFyZSByZW1vdmVkLiAgV2hlbiAiZnJvbV9wYXJ0IiBpcyBUUlVFLCBhIHRyYWlsaW5nIENUUkwtVgogKiBpcyBpbmNsdWRlZCwgb3RoZXJ3aXNlIGl0IGlzIHJlbW92ZWQgKGZvciAiOm1hcCB4eCBeViIsIG1hcHMgeHggdG8KICogbm90aGluZykuICBXaGVuICdjcG9wdGlvbnMnIGRvZXMgbm90IGNvbnRhaW4gJ0InLCBhIGJhY2tzbGFzaCBjYW4gYmUgdXNlZAogKiBpbnN0ZWFkIG9mIGEgQ1RSTC1WLgogKi8KICAgIGNoYXJfdSAgKgpyZXBsYWNlX3Rlcm1jb2Rlcyhmcm9tLCBidWZwLCBmcm9tX3BhcnQsIGRvX2x0KQogICAgY2hhcl91CSpmcm9tOwogICAgY2hhcl91CSoqYnVmcDsKICAgIGludAkJZnJvbV9wYXJ0OwogICAgaW50CQlkb19sdDsJCS8qIGFsc28gdHJhbnNsYXRlIDxsdD4gKi8KewogICAgaW50CQlpOwogICAgaW50CQlzbGVuOwogICAgaW50CQlrZXk7CiAgICBpbnQJCWRsZW4gPSAwOwogICAgY2hhcl91CSpzcmM7CiAgICBpbnQJCWRvX2JhY2tzbGFzaDsJLyogYmFja3NsYXNoIGlzIGEgc3BlY2lhbCBjaGFyYWN0ZXIgKi8KICAgIGludAkJZG9fc3BlY2lhbDsJLyogcmVjb2duaXplIDw+IGtleSBjb2RlcyAqLwogICAgaW50CQlkb19rZXlfY29kZTsJLyogcmVjb2duaXplIHJhdyBrZXkgY29kZXMgKi8KICAgIGNoYXJfdQkqcmVzdWx0OwkvKiBidWZmZXIgZm9yIHJlc3VsdGluZyBzdHJpbmcgKi8KCiAgICBkb19iYWNrc2xhc2ggPSAodmltX3N0cmNocihwX2NwbywgQ1BPX0JTTEFTSCkgPT0gTlVMTCk7CiAgICBkb19zcGVjaWFsID0gKHZpbV9zdHJjaHIocF9jcG8sIENQT19TUEVDSSkgPT0gTlVMTCk7CiAgICBkb19rZXlfY29kZSA9ICh2aW1fc3RyY2hyKHBfY3BvLCBDUE9fS0VZQ09ERSkgPT0gTlVMTCk7CgogICAgLyoKICAgICAqIEFsbG9jYXRlIHNwYWNlIGZvciB0aGUgdHJhbnNsYXRpb24uICBXb3JzdCBjYXNlIGEgc2luZ2xlIGNoYXJhY3RlciBpcwogICAgICogcmVwbGFjZWQgYnkgNiBieXRlcyAoc2hpZnRlZCBzcGVjaWFsIGtleSksIHBsdXMgYSBOVUwgYXQgdGhlIGVuZC4KICAgICAqLwogICAgcmVzdWx0ID0gYWxsb2MoKHVuc2lnbmVkKVNUUkxFTihmcm9tKSAqIDYgKyAxKTsKICAgIGlmIChyZXN1bHQgPT0gTlVMTCkJCS8qIG91dCBvZiBtZW1vcnkgKi8KICAgIHsKCSpidWZwID0gTlVMTDsKCXJldHVybiBmcm9tOwogICAgfQoKICAgIHNyYyA9IGZyb207CgogICAgLyoKICAgICAqIENoZWNrIGZvciAjbiBhdCBzdGFydCBvbmx5OiBmdW5jdGlvbiBrZXkgbgogICAgICovCiAgICBpZiAoZnJvbV9wYXJ0ICYmIHNyY1swXSA9PSAnIycgJiYgVklNX0lTRElHSVQoc3JjWzFdKSkgIC8qIGZ1bmN0aW9uIGtleSAqLwogICAgewoJcmVzdWx0W2RsZW4rK10gPSBLX1NQRUNJQUw7CglyZXN1bHRbZGxlbisrXSA9ICdrJzsKCWlmIChzcmNbMV0gPT0gJzAnKQoJICAgIHJlc3VsdFtkbGVuKytdID0gJzsnOwkvKiAjMCBpcyBGMTAgaXMgIms7IiAqLwoJZWxzZQoJICAgIHJlc3VsdFtkbGVuKytdID0gc3JjWzFdOwkvKiAjMyBpcyBGMyBpcyAiazMiICovCglzcmMgKz0gMjsKICAgIH0KCiAgICAvKgogICAgICogQ29weSBlYWNoIGJ5dGUgZnJvbSAqZnJvbSB0byByZXN1bHRbZGxlbl0KICAgICAqLwogICAgd2hpbGUgKCpzcmMgIT0gTlVMKQogICAgewoJLyoKCSAqIElmICdjcG9wdGlvbnMnIGRvZXMgbm90IGNvbnRhaW4gJzwnLCBjaGVjayBmb3Igc3BlY2lhbCBrZXkgY29kZXMsCgkgKiBsaWtlICI8Qy1TLU1vdXNlTGVmdD4iCgkgKi8KCWlmIChkb19zcGVjaWFsICYmIChkb19sdCB8fCBTVFJOQ01QKHNyYywgIjxsdD4iLCA0KSAhPSAwKSkKCXsKI2lmZGVmIEZFQVRfRVZBTAoJICAgIC8qCgkgICAgICogUmVwbGFjZSA8U0lEPiBieSBLX1NOUiA8c2NyaXB0LW5yPiBfLgoJICAgICAqIChyb29tOiA1ICogNiA9IDMwIGJ5dGVzOyBuZWVkZWQ6IDMgKyA8bnI+ICsgMSA8PSAxNCkKCSAgICAgKi8KCSAgICBpZiAoU1RSTklDTVAoc3JjLCAiPFNJRD4iLCA1KSA9PSAwKQoJICAgIHsKCQlpZiAoY3VycmVudF9TSUQgPD0gMCkKCQkgICAgRU1TRyhfKGVfdXNpbmdzaWQpKTsKCQllbHNlCgkJewoJCSAgICBzcmMgKz0gNTsKCQkgICAgcmVzdWx0W2RsZW4rK10gPSBLX1NQRUNJQUw7CgkJICAgIHJlc3VsdFtkbGVuKytdID0gKGludClLU19FWFRSQTsKCQkgICAgcmVzdWx0W2RsZW4rK10gPSAoaW50KUtFX1NOUjsKCQkgICAgc3ByaW50ZigoY2hhciAqKXJlc3VsdCArIGRsZW4sICIlbGQiLCAobG9uZyljdXJyZW50X1NJRCk7CgkJICAgIGRsZW4gKz0gKGludClTVFJMRU4ocmVzdWx0ICsgZGxlbik7CgkJICAgIHJlc3VsdFtkbGVuKytdID0gJ18nOwoJCSAgICBjb250aW51ZTsKCQl9CgkgICAgfQojZW5kaWYKCgkgICAgc2xlbiA9IHRyYW5zX3NwZWNpYWwoJnNyYywgcmVzdWx0ICsgZGxlbiwgVFJVRSk7CgkgICAgaWYgKHNsZW4pCgkgICAgewoJCWRsZW4gKz0gc2xlbjsKCQljb250aW51ZTsKCSAgICB9Cgl9CgoJLyoKCSAqIElmICdjcG9wdGlvbnMnIGRvZXMgbm90IGNvbnRhaW4gJ2snLCBzZWUgaWYgaXQncyBhbiBhY3R1YWwga2V5LWNvZGUuCgkgKiBOb3RlIHRoYXQgdGhpcyBpcyBhbHNvIGNoZWNrZWQgYWZ0ZXIgcmVwbGFjaW5nIHRoZSA8PiBmb3JtLgoJICogU2luZ2xlIGNoYXJhY3RlciBjb2RlcyBhcmUgTk9UIHJlcGxhY2VkIChlLmcuIF5IIG9yIERFTCksIGJlY2F1c2UKCSAqIGl0IGNvdWxkIGJlIGEgY2hhcmFjdGVyIGluIHRoZSBmaWxlLgoJICovCglpZiAoZG9fa2V5X2NvZGUpCgl7CgkgICAgaSA9IGZpbmRfdGVybV9ieWtleXMoc3JjKTsKCSAgICBpZiAoaSA+PSAwKQoJICAgIHsKCQlyZXN1bHRbZGxlbisrXSA9IEtfU1BFQ0lBTDsKCQlyZXN1bHRbZGxlbisrXSA9IHRlcm1jb2Rlc1tpXS5uYW1lWzBdOwoJCXJlc3VsdFtkbGVuKytdID0gdGVybWNvZGVzW2ldLm5hbWVbMV07CgkJc3JjICs9IHRlcm1jb2Rlc1tpXS5sZW47CgkJLyogSWYgdGVybWluYWwgY29kZSBtYXRjaGVkLCBjb250aW51ZSBhZnRlciBpdC4gKi8KCQljb250aW51ZTsKCSAgICB9Cgl9CgojaWZkZWYgRkVBVF9FVkFMCglpZiAoZG9fc3BlY2lhbCkKCXsKCSAgICBjaGFyX3UJKnAsICpzLCBsZW47CgoJICAgIC8qCgkgICAgICogUmVwbGFjZSA8TGVhZGVyPiBieSB0aGUgdmFsdWUgb2YgIm1hcGxlYWRlciIuCgkgICAgICogUmVwbGFjZSA8TG9jYWxMZWFkZXI+IGJ5IHRoZSB2YWx1ZSBvZiAibWFwbG9jYWxsZWFkZXIiLgoJICAgICAqIElmICJtYXBsZWFkZXIiIG9yICJtYXBsb2NhbGxlYWRlciIgaXNuJ3Qgc2V0IHVzZSBhIGJhY2tzbGFzaC4KCSAgICAgKi8KCSAgICBpZiAoU1RSTklDTVAoc3JjLCAiPExlYWRlcj4iLCA4KSA9PSAwKQoJICAgIHsKCQlsZW4gPSA4OwoJCXAgPSBnZXRfdmFyX3ZhbHVlKChjaGFyX3UgKikiZzptYXBsZWFkZXIiKTsKCSAgICB9CgkgICAgZWxzZSBpZiAoU1RSTklDTVAoc3JjLCAiPExvY2FsTGVhZGVyPiIsIDEzKSA9PSAwKQoJICAgIHsKCQlsZW4gPSAxMzsKCQlwID0gZ2V0X3Zhcl92YWx1ZSgoY2hhcl91ICopImc6bWFwbG9jYWxsZWFkZXIiKTsKCSAgICB9CgkgICAgZWxzZQoJICAgIHsKCQlsZW4gPSAwOwoJCXAgPSBOVUxMOwoJICAgIH0KCSAgICBpZiAobGVuICE9IDApCgkgICAgewoJCS8qIEFsbG93IHVwIHRvIDggKiA2IGNoYXJhY3RlcnMgZm9yICJtYXBsZWFkZXIiLiAqLwoJCWlmIChwID09IE5VTEwgfHwgKnAgPT0gTlVMIHx8IFNUUkxFTihwKSA+IDggKiA2KQoJCSAgICBzID0gKGNoYXJfdSAqKSJcXCI7CgkJZWxzZQoJCSAgICBzID0gcDsKCQl3aGlsZSAoKnMgIT0gTlVMKQoJCSAgICByZXN1bHRbZGxlbisrXSA9ICpzKys7CgkJc3JjICs9IGxlbjsKCQljb250aW51ZTsKCSAgICB9Cgl9CiNlbmRpZgoKCS8qCgkgKiBSZW1vdmUgQ1RSTC1WIGFuZCBpZ25vcmUgdGhlIG5leHQgY2hhcmFjdGVyLgoJICogRm9yICJmcm9tIiBzaWRlIHRoZSBDVFJMLVYgYXQgdGhlIGVuZCBpcyBpbmNsdWRlZCwgZm9yIHRoZSAidG8iCgkgKiBwYXJ0IGl0IGlzIHJlbW92ZWQuCgkgKiBJZiAnY3BvcHRpb25zJyBkb2VzIG5vdCBjb250YWluICdCJywgYWxzbyBhY2NlcHQgYSBiYWNrc2xhc2guCgkgKi8KCWtleSA9ICpzcmM7CglpZiAoa2V5ID09IEN0cmxfViB8fCAoZG9fYmFja3NsYXNoICYmIGtleSA9PSAnXFwnKSkKCXsKCSAgICArK3NyYzsJCQkJLyogc2tpcCBDVFJMLVYgb3IgYmFja3NsYXNoICovCgkgICAgaWYgKCpzcmMgPT0gTlVMKQoJICAgIHsKCQlpZiAoZnJvbV9wYXJ0KQoJCSAgICByZXN1bHRbZGxlbisrXSA9IGtleTsKCQlicmVhazsKCSAgICB9Cgl9CgojaWZkZWYgRkVBVF9NQllURQoJLyogc2tpcCBtdWx0aWJ5dGUgY2hhciBjb3JyZWN0bHkgKi8KCWZvciAoaSA9ICgqbWJfcHRyMmxlbl9jaGVjaykoc3JjKTsgaSA+IDA7IC0taSkKI2VuZGlmCgl7CgkgICAgLyoKCSAgICAgKiBJZiB0aGUgY2hhcmFjdGVyIGlzIEtfU1BFQ0lBTCwgcmVwbGFjZSBpdCB3aXRoIEtfU1BFQ0lBTAoJICAgICAqIEtTX1NQRUNJQUwgS0VfRklMTEVSLgoJICAgICAqIElmIGNvbXBpbGVkIHdpdGggdGhlIEdVSSByZXBsYWNlIENTSSB3aXRoIEtfQ1NJLgoJICAgICAqLwoJICAgIGlmICgqc3JjID09IEtfU1BFQ0lBTCkKCSAgICB7CgkJcmVzdWx0W2RsZW4rK10gPSBLX1NQRUNJQUw7CgkJcmVzdWx0W2RsZW4rK10gPSBLU19TUEVDSUFMOwoJCXJlc3VsdFtkbGVuKytdID0gS0VfRklMTEVSOwoJICAgIH0KIyBpZmRlZiBGRUFUX0dVSQoJICAgIGVsc2UgaWYgKCpzcmMgPT0gQ1NJKQoJICAgIHsKCQlyZXN1bHRbZGxlbisrXSA9IEtfU1BFQ0lBTDsKCQlyZXN1bHRbZGxlbisrXSA9IEtTX0VYVFJBOwoJCXJlc3VsdFtkbGVuKytdID0gKGludClLRV9DU0k7CgkgICAgfQojIGVuZGlmCgkgICAgZWxzZQoJCXJlc3VsdFtkbGVuKytdID0gKnNyYzsKCSAgICArK3NyYzsKCX0KICAgIH0KICAgIHJlc3VsdFtkbGVuXSA9IE5VTDsKCiAgICAvKgogICAgICogQ29weSB0aGUgbmV3IHN0cmluZyB0byBhbGxvY2F0ZWQgbWVtb3J5LgogICAgICogSWYgdGhpcyBmYWlscywganVzdCByZXR1cm4gZnJvbS4KICAgICAqLwogICAgaWYgKCgqYnVmcCA9IHZpbV9zdHJzYXZlKHJlc3VsdCkpICE9IE5VTEwpCglmcm9tID0gKmJ1ZnA7CiAgICB2aW1fZnJlZShyZXN1bHQpOwogICAgcmV0dXJuIGZyb207Cn0KCi8qCiAqIEZpbmQgYSB0ZXJtY29kZSB3aXRoIGtleXMgJ3NyYycgKG11c3QgYmUgTlVMIHRlcm1pbmF0ZWQpLgogKiBSZXR1cm4gdGhlIGluZGV4IGluIHRlcm1jb2Rlc1tdLCBvciAtMSBpZiBub3QgZm91bmQuCiAqLwogICAgaW50CmZpbmRfdGVybV9ieWtleXMoc3JjKQogICAgY2hhcl91CSpzcmM7CnsKICAgIGludAkJaTsKICAgIGludAkJc2xlbjsKCiAgICBmb3IgKGkgPSAwOyBpIDwgdGNfbGVuOyArK2kpCiAgICB7CglzbGVuID0gdGVybWNvZGVzW2ldLmxlbjsKCWlmIChzbGVuID4gMSAmJiBTVFJOQ01QKHRlcm1jb2Rlc1tpXS5jb2RlLCBzcmMsIChzaXplX3Qpc2xlbikgPT0gMCkKCSAgICByZXR1cm4gaTsKICAgIH0KICAgIHJldHVybiAtMTsKfQoKLyoKICogR2F0aGVyIHRoZSBmaXJzdCBjaGFyYWN0ZXJzIGluIHRoZSB0ZXJtaW5hbCBrZXkgY29kZXMgaW50byBhIHN0cmluZy4KICogVXNlZCB0byBzcGVlZCB1cCBjaGVja190ZXJtY29kZSgpLgogKi8KICAgIHN0YXRpYyB2b2lkCmdhdGhlcl90ZXJtbGVhZGVyKCkKewogICAgaW50CSAgICBpOwogICAgaW50CSAgICBsZW4gPSAwOwoKI2lmZGVmIEZFQVRfR1VJCiAgICBpZiAoZ3VpLmluX3VzZSkKCXRlcm1sZWFkZXJbbGVuKytdID0gQ1NJOyAgICAvKiB0aGUgR1VJIGNvZGVzIGFyZSBub3QgaW4gdGVybWNvZGVzW10gKi8KI2VuZGlmCiNpZmRlZiBGRUFUX1RFUk1SRVNQT05TRQogICAgaWYgKGNoZWNrX2Zvcl9jb2RlcykKCXRlcm1sZWFkZXJbbGVuKytdID0gRENTOyAgICAvKiB0aGUgdGVybWNvZGUgcmVzcG9uc2Ugc3RhcnRzIHdpdGggRENTCgkJCQkgICAgICAgaW4gOC1iaXQgbW9kZSAqLwojZW5kaWYKICAgIHRlcm1sZWFkZXJbbGVuXSA9IE5VTDsKCiAgICBmb3IgKGkgPSAwOyBpIDwgdGNfbGVuOyArK2kpCglpZiAodmltX3N0cmNocih0ZXJtbGVhZGVyLCB0ZXJtY29kZXNbaV0uY29kZVswXSkgPT0gTlVMTCkKCXsKCSAgICB0ZXJtbGVhZGVyW2xlbisrXSA9IHRlcm1jb2Rlc1tpXS5jb2RlWzBdOwoJICAgIHRlcm1sZWFkZXJbbGVuXSA9IE5VTDsKCX0KCiAgICBuZWVkX2dhdGhlciA9IEZBTFNFOwp9CgovKgogKiBTaG93IGFsbCB0ZXJtY29kZXMgKGZvciAiOnNldCB0ZXJtY2FwIikKICogVGhpcyBjb2RlIGxvb2tzIGEgbG90IGxpa2Ugc2hvd29wdGlvbnMoKSwgYnV0IGlzIGRpZmZlcmVudC4KICovCiAgICB2b2lkCnNob3dfdGVybWNvZGVzKCkKewogICAgaW50CQljb2w7CiAgICBpbnQJCSppdGVtczsKICAgIGludAkJaXRlbV9jb3VudDsKICAgIGludAkJcnVuOwogICAgaW50CQlyb3csIHJvd3M7CiAgICBpbnQJCWNvbHM7CiAgICBpbnQJCWk7CiAgICBpbnQJCWxlbjsKCiNkZWZpbmUgSU5DIDI3CSAgICAvKiB0cnkgdG8gbWFrZSB0aHJlZSBjb2x1bW5zICovCiNkZWZpbmUgR0FQIDIJICAgIC8qIHNwYWNlcyBiZXR3ZWVuIGNvbHVtbnMgKi8KCiAgICBpZiAodGNfbGVuID09IDApCSAgICAvKiBubyB0ZXJtaW5hbCBjb2RlcyAobXVzdCBiZSBHVUkpICovCglyZXR1cm47CiAgICBpdGVtcyA9IChpbnQgKilhbGxvYygodW5zaWduZWQpKHNpemVvZihpbnQpICogdGNfbGVuKSk7CiAgICBpZiAoaXRlbXMgPT0gTlVMTCkKCXJldHVybjsKCiAgICAvKiBIaWdobGlnaHQgdGl0bGUgKi8KICAgIE1TR19QVVRTX1RJVExFKF8oIlxuLS0tIFRlcm1pbmFsIGtleXMgLS0tIikpOwoKICAgIC8qCiAgICAgKiBkbyB0aGUgbG9vcCB0d28gdGltZXM6CiAgICAgKiAxLiBkaXNwbGF5IHRoZSBzaG9ydCBpdGVtcyAobm9uLXN0cmluZ3MgYW5kIHNob3J0IHN0cmluZ3MpCiAgICAgKiAyLiBkaXNwbGF5IHRoZSBsb25nIGl0ZW1zIChzdHJpbmdzKQogICAgICovCiAgICBmb3IgKHJ1biA9IDE7IHJ1biA8PSAyICYmICFnb3RfaW50OyArK3J1bikKICAgIHsKCS8qCgkgKiBjb2xsZWN0IHRoZSBpdGVtcyBpbiBpdGVtc1tdCgkgKi8KCWl0ZW1fY291bnQgPSAwOwoJZm9yIChpID0gMDsgaSA8IHRjX2xlbjsgaSsrKQoJewoJICAgIGxlbiA9IHNob3dfb25lX3Rlcm1jb2RlKHRlcm1jb2Rlc1tpXS5uYW1lLAoJCQkJCQkgICAgdGVybWNvZGVzW2ldLmNvZGUsIEZBTFNFKTsKCSAgICBpZiAoKGxlbiA8PSBJTkMgLSBHQVAgJiYgcnVuID09IDEpIHx8IChsZW4gPiBJTkMgLSBHQVAgJiYgcnVuID09IDIpKQoJCWl0ZW1zW2l0ZW1fY291bnQrK10gPSBpOwoJfQoKCS8qCgkgKiBkaXNwbGF5IHRoZSBpdGVtcwoJICovCglpZiAocnVuID09IDEpCgl7CgkgICAgY29scyA9IChDb2x1bW5zICsgR0FQKSAvIElOQzsKCSAgICBpZiAoY29scyA9PSAwKQoJCWNvbHMgPSAxOwoJICAgIHJvd3MgPSAoaXRlbV9jb3VudCArIGNvbHMgLSAxKSAvIGNvbHM7Cgl9CgllbHNlCS8qIHJ1biA9PSAyICovCgkgICAgcm93cyA9IGl0ZW1fY291bnQ7Cglmb3IgKHJvdyA9IDA7IHJvdyA8IHJvd3MgJiYgIWdvdF9pbnQ7ICsrcm93KQoJewoJICAgIG1zZ19wdXRjaGFyKCdcbicpOwkJCS8qIGdvIHRvIG5leHQgbGluZSAqLwoJICAgIGlmIChnb3RfaW50KQkJCS8qICdxJyB0eXBlZCBpbiBtb3JlICovCgkJYnJlYWs7CgkgICAgY29sID0gMDsKCSAgICBmb3IgKGkgPSByb3c7IGkgPCBpdGVtX2NvdW50OyBpICs9IHJvd3MpCgkgICAgewoJCW1zZ19jb2wgPSBjb2w7CQkJLyogbWFrZSBjb2x1bW5zICovCgkJc2hvd19vbmVfdGVybWNvZGUodGVybWNvZGVzW2l0ZW1zW2ldXS5uYW1lLAoJCQkJCSAgICAgIHRlcm1jb2Rlc1tpdGVtc1tpXV0uY29kZSwgVFJVRSk7CgkJY29sICs9IElOQzsKCSAgICB9CgkgICAgb3V0X2ZsdXNoKCk7CgkgICAgdWlfYnJlYWtjaGVjaygpOwoJfQogICAgfQogICAgdmltX2ZyZWUoaXRlbXMpOwp9CgovKgogKiBTaG93IG9uZSB0ZXJtY29kZSBlbnRyeS4KICogT3V0cHV0IGdvZXMgaW50byBJT2J1ZmZbXQogKi8KICAgIGludApzaG93X29uZV90ZXJtY29kZShuYW1lLCBjb2RlLCBwcmludGl0KQogICAgY2hhcl91ICAqbmFtZTsKICAgIGNoYXJfdSAgKmNvZGU7CiAgICBpbnQJICAgIHByaW50aXQ7CnsKICAgIGNoYXJfdQkqcDsKICAgIGludAkJbGVuOwoKICAgIGlmIChuYW1lWzBdID4gJ34nKQogICAgewoJSU9idWZmWzBdID0gJyAnOwoJSU9idWZmWzFdID0gJyAnOwoJSU9idWZmWzJdID0gJyAnOwoJSU9idWZmWzNdID0gJyAnOwogICAgfQogICAgZWxzZQogICAgewoJSU9idWZmWzBdID0gJ3QnOwoJSU9idWZmWzFdID0gJ18nOwoJSU9idWZmWzJdID0gbmFtZVswXTsKCUlPYnVmZlszXSA9IG5hbWVbMV07CiAgICB9CiAgICBJT2J1ZmZbNF0gPSAnICc7CgogICAgcCA9IGdldF9zcGVjaWFsX2tleV9uYW1lKFRFUk1DQVAyS0VZKG5hbWVbMF0sIG5hbWVbMV0pLCAwKTsKICAgIGlmIChwWzFdICE9ICd0JykKCVNUUkNQWShJT2J1ZmYgKyA1LCBwKTsKICAgIGVsc2UKCUlPYnVmZls1XSA9IE5VTDsKICAgIGxlbiA9IChpbnQpU1RSTEVOKElPYnVmZik7CiAgICBkbwoJSU9idWZmW2xlbisrXSA9ICcgJzsKICAgIHdoaWxlIChsZW4gPCAxNyk7CiAgICBJT2J1ZmZbbGVuXSA9IE5VTDsKICAgIGlmIChjb2RlID09IE5VTEwpCglsZW4gKz0gNDsKICAgIGVsc2UKCWxlbiArPSB2aW1fc3Ryc2l6ZShjb2RlKTsKCiAgICBpZiAocHJpbnRpdCkKICAgIHsKCW1zZ19wdXRzKElPYnVmZik7CglpZiAoY29kZSA9PSBOVUxMKQoJICAgIG1zZ19wdXRzKChjaGFyX3UgKikiTlVMTCIpOwoJZWxzZQoJICAgIG1zZ19vdXR0cmFucyhjb2RlKTsKICAgIH0KICAgIHJldHVybiBsZW47Cn0KCiNpZiBkZWZpbmVkKEZFQVRfVEVSTVJFU1BPTlNFKSB8fCBkZWZpbmVkKFBST1RPKQovKgogKiBGb3IgWHRlcm0gPj0gMTQwIGNvbXBpbGVkIHdpdGggT1BUX1RDQVBfUVVFUlk6IE9idGFpbiB0aGUgYWN0dWFsbHkgdXNlZAogKiB0ZXJtY2FwIGNvZGVzIGZyb20gdGhlIHRlcm1pbmFsIGl0c2VsZi4KICogV2UgZ2V0IHRoZW0gb25lIGJ5IG9uZSB0byBhdm9pZCBhIHZlcnkgbG9uZyByZXNwb25zZSBzdHJpbmcuCiAqLwpzdGF0aWMgaW50IHh0X2luZGV4X2luID0gMDsKc3RhdGljIGludCB4dF9pbmRleF9vdXQgPSAwOwoKICAgIHN0YXRpYyB2b2lkCnJlcV9jb2Rlc19mcm9tX3Rlcm0oKQp7CiAgICB4dF9pbmRleF9vdXQgPSAwOwogICAgeHRfaW5kZXhfaW4gPSAwOwogICAgcmVxX21vcmVfY29kZXNfZnJvbV90ZXJtKCk7Cn0KCiAgICBzdGF0aWMgdm9pZApyZXFfbW9yZV9jb2Rlc19mcm9tX3Rlcm0oKQp7CiAgICBjaGFyCWJ1ZlsxMV07CiAgICBpbnQJCW9sZF9pZHggPSB4dF9pbmRleF9vdXQ7CgogICAgLyogRG9uJ3QgZG8gYW55dGhpbmcgd2hlbiBnb2luZyB0byBleGl0LiAqLwogICAgaWYgKGV4aXRpbmcpCglyZXR1cm47CgogICAgLyogU2VuZCB1cCB0byAxMCBtb3JlIHJlcXVlc3RzIG91dCB0aGFuIHdlIHJlY2VpdmVkLiAgQXZvaWQgc2VuZGluZyB0b28KICAgICAqIG1hbnksIHRoZXJlIGNhbiBiZSBhIGJ1ZmZlciBvdmVyZmxvdyBzb21ld2hlcmUuICovCiAgICB3aGlsZSAoeHRfaW5kZXhfb3V0IDwgeHRfaW5kZXhfaW4gKyAxMCAmJiBrZXlfbmFtZXNbeHRfaW5kZXhfb3V0XSAhPSBOVUxMKQogICAgewoJc3ByaW50ZihidWYsICJcMDMzUCtxJTAyeCUwMnhcMDMzXFwiLAoJCSAgICAgIGtleV9uYW1lc1t4dF9pbmRleF9vdXRdWzBdLCBrZXlfbmFtZXNbeHRfaW5kZXhfb3V0XVsxXSk7CglvdXRfc3RyX25mKChjaGFyX3UgKilidWYpOwoJKyt4dF9pbmRleF9vdXQ7CiAgICB9CgogICAgLyogU2VuZCB0aGUgY29kZXMgb3V0IHJpZ2h0IGF3YXkuICovCiAgICBpZiAoeHRfaW5kZXhfb3V0ICE9IG9sZF9pZHgpCglvdXRfZmx1c2goKTsKfQoKLyoKICogRGVjb2RlIGtleSBjb2RlIHJlc3BvbnNlIGZyb20geHRlcm06ICc8RXNjPlAxK3I8bmFtZT49PHN0cmluZz48RXNjPlwnLgogKiBBICIwIiBpbnN0ZWFkIG9mIHRoZSAiMSIgaW5kaWNhdGVzIGEgY29kZSB0aGF0IGlzbid0IHN1cHBvcnRlZC4KICogQm90aCA8bmFtZT4gYW5kIDxzdHJpbmc+IGFyZSBlbmNvZGVkIGluIGhleC4KICogImNvZGUiIHBvaW50cyB0byB0aGUgIjAiIG9yICIxIi4KICovCiAgICBzdGF0aWMgdm9pZApnb3RfY29kZV9mcm9tX3Rlcm0oY29kZSwgbGVuKQogICAgY2hhcl91CSpjb2RlOwogICAgaW50CQlsZW47CnsKI2RlZmluZSBYVF9MRU4gMTAwCiAgICBjaGFyX3UJbmFtZVszXTsKICAgIGNoYXJfdQlzdHJbWFRfTEVOXTsKICAgIGludAkJaTsKICAgIGludAkJaiA9IDA7CiAgICBpbnQJCWM7CgogICAgLyogQSAnMScgbWVhbnMgdGhlIGNvZGUgaXMgc3VwcG9ydGVkLCBhICcwJyBtZWFucyBpdCBpc24ndC4KICAgICAqIFdoZW4gaGFsZiB0aGUgbGVuZ3RoIGlzID4gWFRfTEVOIHdlIGNhbid0IHVzZSBpdC4KICAgICAqIE91ciBuYW1lcyBhcmUgY3VycmVudGx5IGFsbCAyIGNoYXJhY3RlcnMuICovCiAgICBpZiAoY29kZVswXSA9PSAnMScgJiYgY29kZVs3XSA9PSAnPScgJiYgbGVuIC8gMiA8IFhUX0xFTikKICAgIHsKCS8qIEdldCB0aGUgbmFtZSBmcm9tIHRoZSByZXNwb25zZSBhbmQgZmluZCBpdCBpbiB0aGUgdGFibGUuICovCgluYW1lWzBdID0gaGV4aGV4Mm5yKGNvZGUgKyAzKTsKCW5hbWVbMV0gPSBoZXhoZXgybnIoY29kZSArIDUpOwoJbmFtZVsyXSA9IE5VTDsKCWZvciAoaSA9IDA7IGtleV9uYW1lc1tpXSAhPSBOVUxMOyArK2kpCgl7CgkgICAgaWYgKFNUUkNNUChrZXlfbmFtZXNbaV0sIG5hbWUpID09IDApCgkgICAgewoJCXh0X2luZGV4X2luID0gaTsKCQlicmVhazsKCSAgICB9Cgl9CglpZiAoa2V5X25hbWVzW2ldICE9IE5VTEwpCgl7CgkgICAgZm9yIChpID0gODsgKGMgPSBoZXhoZXgybnIoY29kZSArIGkpKSA+PSAwOyBpICs9IDIpCgkJc3RyW2orK10gPSBjOwoJICAgIHN0cltqXSA9IE5VTDsKCSAgICBpZiAobmFtZVswXSA9PSAnQycgJiYgbmFtZVsxXSA9PSAnbycpCgkgICAgewoJCS8qIENvbG9yIGNvdW50IGlzIG5vdCBhIGtleSBjb2RlLiAqLwoJCWkgPSBhdG9pKChjaGFyICopc3RyKTsKCQlpZiAoaSAhPSB0X2NvbG9ycykKCQl7CgkJICAgIC8qIE5yIG9mIGNvbG9ycyBjaGFuZ2VkLCBpbml0aWFsaXplIGhpZ2hsaWdodGluZyBhbmQKCQkgICAgICogcmVkcmF3IGV2ZXJ5dGhpbmcuICovCgkJICAgIHNldF9jb2xvcl9jb3VudChpKTsKCQkgICAgaW5pdF9oaWdobGlnaHQoVFJVRSwgRkFMU0UpOwoJCSAgICByZWRyYXdfbGF0ZXIoQ0xFQVIpOwoJCX0KCSAgICB9CgkgICAgZWxzZQoJICAgIHsKCQkvKiBGaXJzdCBkZWxldGUgYW55IGV4aXN0aW5nIGVudHJ5IHdpdGggdGhlIHNhbWUgY29kZS4gKi8KCQlpID0gZmluZF90ZXJtX2J5a2V5cyhzdHIpOwoJCWlmIChpID49IDApCgkJICAgIGRlbF90ZXJtY29kZV9pZHgoaSk7CgkJYWRkX3Rlcm1jb2RlKG5hbWUsIHN0ciwgRkFMU0UpOwoJICAgIH0KCX0KICAgIH0KCiAgICAvKiBNYXkgcmVxdWVzdCBtb3JlIGNvZGVzIG5vdyB0aGF0IHdlIHJlY2VpdmVkIG9uZS4gKi8KICAgICsreHRfaW5kZXhfaW47CiAgICByZXFfbW9yZV9jb2Rlc19mcm9tX3Rlcm0oKTsKfQoKLyoKICogQ2hlY2sgaWYgdGhlcmUgYXJlIGFueSB1bmFuc3dlcmVkIHJlcXVlc3RzIGFuZCBkZWFsIHdpdGggdGhlbS4KICogVGhpcyBpcyBjYWxsZWQgYmVmb3JlIHN0YXJ0aW5nIGFuIGV4dGVybmFsIHByb2dyYW0gb3IgZ2V0dGluZyBkaXJlY3QKICoga2V5Ym9hcmQgaW5wdXQuICBXZSBkb24ndCB3YW50IHJlc3BvbnNlcyB0byBiZSBzZW5kIHRvIHRoYXQgcHJvZ3JhbSBvcgogKiBoYW5kbGVkIGFzIHR5cGVkIHRleHQuCiAqLwogICAgc3RhdGljIHZvaWQKY2hlY2tfZm9yX2NvZGVzX2Zyb21fdGVybSgpCnsKICAgIGludAkJYzsKCiAgICAvKiBJZiBubyBjb2RlcyByZXF1ZXN0ZWQgb3IgYWxsIGFyZSBhbnN3ZXJlZCwgbm8gbmVlZCB0byB3YWl0LiAqLwogICAgaWYgKHh0X2luZGV4X291dCA9PSAwIHx8IHh0X2luZGV4X291dCA9PSB4dF9pbmRleF9pbikKCXJldHVybjsKCiAgICAvKiBWZ2V0YygpIHdpbGwgY2hlY2sgZm9yIGFuZCBoYW5kbGUgYW55IHJlc3BvbnNlLgogICAgICogS2VlcCBjYWxsaW5nIHZwZWVrYygpIHVudGlsIHdlIGRvbid0IGdldCBhbnkgcmVzcG9uc2VzLiAqLwogICAgKytub19tYXBwaW5nOwogICAgKythbGxvd19rZXlzOwogICAgZm9yICg7OykKICAgIHsKCWMgPSB2cGVla2MoKTsKCWlmIChjID09IE5VTCkJICAgIC8qIG5vdGhpbmcgYXZhaWxhYmxlICovCgkgICAgYnJlYWs7CgoJLyogSWYgYSByZXNwb25zZSBpcyByZWNvZ25pemVkIGl0J3MgcmVwbGFjZWQgd2l0aCBLX0lHTk9SRSwgbXVzdCByZWFkCgkgKiBpdCBmcm9tIHRoZSBpbnB1dCBzdHJlYW0uICBJZiB0aGVyZSBpcyBubyBLX0lHTk9SRSB3ZSBjYW4ndCBkbwoJICogYW55dGhpbmcsIGJyZWFrIGhlcmUgKHRoZXJlIG1pZ2h0IGJlIHNvbWUgcmVzcG9uc2VzIGZ1cnRoZXIgb24sIGJ1dAoJICogd2UgZG9uJ3Qgd2FudCB0byB0aHJvdyBhd2F5IGFueSB0eXBlZCBjaGFycykuICovCglpZiAoYyAhPSBLX1NQRUNJQUwgJiYgYyAhPSBLX0lHTk9SRSkKCSAgICBicmVhazsKCWMgPSB2Z2V0YygpOwoJaWYgKGMgIT0gS19JR05PUkUpCgl7CgkgICAgdnVuZ2V0YyhjKTsKCSAgICBicmVhazsKCX0KICAgIH0KICAgIC0tbm9fbWFwcGluZzsKICAgIC0tYWxsb3dfa2V5czsKfQojZW5kaWYKCiNpZiBkZWZpbmVkKEZFQVRfQ01ETF9DT01QTCkgfHwgZGVmaW5lZChQUk9UTykKLyoKICogVHJhbnNsYXRlIGFuIGludGVybmFsIG1hcHBpbmcvYWJicmV2aWF0aW9uIHJlcHJlc2VudGF0aW9uIGludG8gdGhlCiAqIGNvcnJlc3BvbmRpbmcgZXh0ZXJuYWwgb25lIHJlY29nbml6ZWQgYnkgOm1hcC86YWJicmV2IGNvbW1hbmRzOwogKiByZXNwZWN0cyB0aGUgY3VycmVudCBCL2svPCBzZXR0aW5ncyBvZiAnY3BvcHRpb24nLgogKgogKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIGV4cGFuZGluZyBtYXBwaW5ncy9hYmJyZXZpYXRpb25zIG9uIHRoZQogKiBjb21tYW5kLWxpbmUsIGFuZCBmb3IgYnVpbGRpbmcgdGhlICJBbWJpZ3VvdXMgbWFwcGluZy4uLiIgZXJyb3IgbWVzc+ZnZS4KICoKICogSXQgdXNlcyBhIGdyb3dhcnJheSB0byBidWlsZCB0aGUgdHJhbnNsYXRpb24gc3RyaW5nIHNpbmNlIHRoZQogKiBsYXR0ZXIgY2FuIGJlIHdpZGVyIHRoYW4gdGhlIG9yaWdpbmFsIGRlc2NyaXB0aW9uLiBUaGUgY2FsbGVyIGhhcyB0bwogKiBmcmVlIHRoZSBzdHJpbmcgYWZ0ZXJ3YXJkcy4KICoKICogUmV0dXJucyBOVUxMIHdoZW4gdGhlcmUgaXMgYSBwcm9ibGVtLgogKi8KICAgIGNoYXJfdSAqCnRyYW5zbGF0ZV9tYXBwaW5nKHN0ciwgZXhwbWFwKQogICAgY2hhcl91CSpzdHI7CiAgICBpbnQJCWV4cG1hcDsgIC8qIFRSVUUgd2hlbiBleHBhbmRpbmcgbWFwcGluZ3Mgb24gY29tbWFuZC1saW5lICovCnsKICAgIGdhcnJheV9UCWdhOwogICAgaW50CQljOwogICAgaW50CQltb2RpZmllcnM7CiAgICBpbnQJCWNwb19ic2xhc2g7CiAgICBpbnQJCWNwb19zcGVjaWFsOwogICAgaW50CQljcG9fa2V5Y29kZTsKCiAgICBnYV9pbml0KCZnYSk7CiAgICBnYS5nYV9pdGVtc2l6ZSA9IDE7CiAgICBnYS5nYV9ncm93c2l6ZSA9IDQwOwoKICAgIGNwb19ic2xhc2ggPSAodmltX3N0cmNocihwX2NwbywgQ1BPX0JTTEFTSCkgIT0gTlVMTCk7CiAgICBjcG9fc3BlY2lhbCA9ICh2aW1fc3RyY2hyKHBfY3BvLCBDUE9fU1BFQ0kpICE9IE5VTEwpOwogICAgY3BvX2tleWNvZGUgPSAodmltX3N0cmNocihwX2NwbywgQ1BPX0tFWUNPREUpID09IE5VTEwpOwoKICAgIGZvciAoOyAqc3RyOyArK3N0cikKICAgIHsKCWMgPSAqc3RyOwoJaWYgKGMgPT0gS19TUEVDSUFMICYmIHN0clsxXSAhPSBOVUwgJiYgc3RyWzJdICE9IE5VTCkKCXsKCSAgICBtb2RpZmllcnMgPSAwOwoJICAgIGlmIChzdHJbMV0gPT0gS1NfTU9ESUZJRVIpCgkgICAgewoJCXN0cisrOwoJCW1vZGlmaWVycyA9ICorK3N0cjsKCQljID0gKisrc3RyOwoJICAgIH0KCSAgICBpZiAoY3BvX3NwZWNpYWwgJiYgY3BvX2tleWNvZGUgJiYgYyA9PSBLX1NQRUNJQUwgJiYgIW1vZGlmaWVycykKCSAgICB7CgkJaW50CWk7CgoJCS8qIHRyeSB0byBmaW5kIHNwZWNpYWwga2V5IGluIHRlcm1jb2RlcyAqLwoJCWZvciAoaSA9IDA7IGkgPCB0Y19sZW47ICsraSkKCQkgICAgaWYgKHRlcm1jb2Rlc1tpXS5uYW1lWzBdID09IHN0clsxXQoJCQkJCSAgICAmJiB0ZXJtY29kZXNbaV0ubmFtZVsxXSA9PSBzdHJbMl0pCgkJCWJyZWFrOwoJCWlmIChpIDwgdGNfbGVuKQoJCXsKCQkgICAgZ2FfY29uY2F0KCZnYSwgdGVybWNvZGVzW2ldLmNvZGUpOwoJCSAgICBzdHIgKz0gMjsKCQkgICAgY29udGludWU7IC8qIGZvciAoc3RyKSAqLwoJCX0KCSAgICB9CgkgICAgaWYgKGMgPT0gS19TUEVDSUFMICYmIHN0clsxXSAhPSBOVUwgJiYgc3RyWzJdICE9IE5VTCkKCSAgICB7CgkJaWYgKGV4cG1hcCAmJiBjcG9fc3BlY2lhbCkKCQl7CgkJICAgIGdhX2NsZWFyKCZnYSk7CgkJICAgIHJldHVybiBOVUxMOwoJCX0KCQljID0gVE9fU1BFQ0lBTChzdHJbMV0sIHN0clsyXSk7CgkJaWYgKGMgPT0gS19aRVJPKQkvKiBkaXNwbGF5IDxOdWw+IGFzIF5AICovCgkJICAgIGMgPSBOVUw7CgkJc3RyICs9IDI7CgkgICAgfQoJICAgIGlmIChJU19TUEVDSUFMKGMpIHx8IG1vZGlmaWVycykJLyogc3BlY2lhbCBrZXkgKi8KCSAgICB7CgkJaWYgKGV4cG1hcCAmJiBjcG9fc3BlY2lhbCkKCQl7CgkJICAgIGdhX2NsZWFyKCZnYSk7CgkJICAgIHJldHVybiBOVUxMOwoJCX0KCQlnYV9jb25jYXQoJmdhLCBnZXRfc3BlY2lhbF9rZXlfbmFtZShjLCBtb2RpZmllcnMpKTsKCQljb250aW51ZTsgLyogZm9yIChzdHIpICovCgkgICAgfQoJfQoJaWYgKGMgPT0gJyAnIHx8IGMgPT0gJ1x0JyB8fCBjID09IEN0cmxfSiB8fCBjID09IEN0cmxfVgoJICAgIHx8IChjID09ICc8JyAmJiAhY3BvX3NwZWNpYWwpIHx8IChjID09ICdcXCcgJiYgIWNwb19ic2xhc2gpKQoJICAgIGdhX2FwcGVuZCgmZ2EsIGNwb19ic2xhc2ggPyBDdHJsX1YgOiAnXFwnKTsKCWlmIChjKQoJICAgIGdhX2FwcGVuZCgmZ2EsIGMpOwogICAgfQogICAgZ2FfYXBwZW5kKCZnYSwgTlVMKTsKICAgIHJldHVybiAoY2hhcl91ICopKGdhLmdhX2RhdGEpOwp9CiNlbmRpZgoKI2lmIChkZWZpbmVkKFdJTjMyNjQpICYmICFkZWZpbmVkKEZFQVRfR1VJKSkgfHwgZGVmaW5lZChQUk9UTykKc3RhdGljIGNoYXIga3NtZV9zdHJbMjBdOwpzdGF0aWMgY2hhciBrc21yX3N0clsyMF07CnN0YXRpYyBjaGFyIGtzbWRfc3RyWzIwXTsKCi8qCiAqIEZvciBXaW4zMiBjb25zb2xlOiB1cGRhdGUgdGVybWNhcCBjb2RlcyBmb3IgZXhpc3RpbmcgY29uc29sZSBhdHRyaWJ1dGVzLgogKi8KICAgIHZvaWQKdXBkYXRlX3RjYXAoYXR0cikKICAgIGludCBhdHRyOwp7CiAgICBzdHJ1Y3QgYnVpbHRpbl90ZXJtICpwOwoKICAgIHAgPSBmaW5kX2J1aWx0aW5fdGVybShERUZBVUxUX1RFUk0pOwogICAgc3ByaW50Zihrc21lX3N0ciwgSUZfRUIoIlwwMzN8JWRtIiwgRVNDX1NUUiAifCVkbSIpLCBhdHRyKTsKICAgIHNwcmludGYoa3NtZF9zdHIsIElGX0VCKCJcMDMzfCVkbSIsIEVTQ19TVFIgInwlZG0iKSwKCQkJCSAgICAgYXR0ciB8IDB4MDgpOyAgLyogRk9SRUdST1VORF9JTlRFTlNJVFkgKi8KICAgIHNwcmludGYoa3Ntcl9zdHIsIElGX0VCKCJcMDMzfCVkbSIsIEVTQ19TVFIgInwlZG0iKSwKCQkJCSAoKGF0dHIgJiAweDBGKSA8PCA0KSB8ICgoYXR0ciAmIDB4RjApID4+IDQpKTsKCiAgICB3aGlsZSAocC0+YnRfc3RyaW5nICE9IE5VTEwpCiAgICB7CiAgICAgIGlmIChwLT5idF9lbnRyeSA9PSAoaW50KUtTX01FKQoJICBwLT5idF9zdHJpbmcgPSAma3NtZV9zdHJbMF07CiAgICAgIGVsc2UgaWYgKHAtPmJ0X2VudHJ5ID09IChpbnQpS1NfTVIpCgkgIHAtPmJ0X3N0cmluZyA9ICZrc21yX3N0clswXTsKICAgICAgZWxzZSBpZiAocC0+YnRfZW50cnkgPT0gKGludClLU19NRCkKCSAgcC0+YnRfc3RyaW5nID0gJmtzbWRfc3RyWzBdOwogICAgICArK3A7CiAgICB9Cn0KI2VuZGlmCg==