LyogJFhGcmVlODYkICovIC8qIC0qLSBtb2RlOiBjOyBjLWJhc2ljLW9mZnNldDogMyAtKi0gKi8KLyoKICogQ29weXJpZ2h0IDIwMDAgR2FyZXRoIEh1Z2hlcwogKiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQogKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAogKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCiAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAogKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKICoKICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAogKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCiAqIFNvZnR3YXJlLgogKgogKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgogKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCiAqIEdBUkVUSCBIVUdIRVMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSCiAqIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCiAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCiAqLwoKLyoKICogQXV0aG9yczoKICoJR2FyZXRoIEh1Z2hlcyA8Z2FyZXRoQHZhbGludXguY29tPgogKglMZWlmIERlbGdhc3MgPGxkZWxnYXNzQHJldGluYWxidXJuLm5ldD4KICoJSm9z6SBGb25zZWNhIDxqX3JfZm9uc2VjYUB5YWhvby5jby51az4KICovCgojaW5jbHVkZSAiZ2xoZWFkZXIuaCIKI2luY2x1ZGUgIm10eXBlcy5oIgojaW5jbHVkZSAiY29sb3JtYWMuaCIKI2luY2x1ZGUgIm1hY3Jvcy5oIgoKI2luY2x1ZGUgInN3cmFzdC9zd3Jhc3QuaCIKI2luY2x1ZGUgInN3cmFzdF9zZXR1cC9zd3Jhc3Rfc2V0dXAuaCIKI2luY2x1ZGUgInRubC90bmwuaCIKI2luY2x1ZGUgInRubC90X2NvbnRleHQuaCIKI2luY2x1ZGUgInRubC90X3BpcGVsaW5lLmgiCgojaW5jbHVkZSAibWFjaDY0X3RyaXMuaCIKI2luY2x1ZGUgIm1hY2g2NF9zdGF0ZS5oIgojaW5jbHVkZSAibWFjaDY0X2NvbnRleHQuaCIKI2luY2x1ZGUgIm1hY2g2NF92Yi5oIgojaW5jbHVkZSAibWFjaDY0X2lvY3RsLmgiCgpzdGF0aWMgY29uc3QgR0x1aW50IGh3X3ByaW1bR0xfUE9MWUdPTisxXSA9IHsKICAgTUFDSDY0X1BSSU1fUE9JTlRTLAogICBNQUNINjRfUFJJTV9MSU5FUywKICAgTUFDSDY0X1BSSU1fTElORV9MT09QLAogICBNQUNINjRfUFJJTV9MSU5FX1NUUklQLAogICBNQUNINjRfUFJJTV9UUklBTkdMRVMsCiAgIE1BQ0g2NF9QUklNX1RSSUFOR0xFX1NUUklQLAogICBNQUNINjRfUFJJTV9UUklBTkdMRV9GQU4sCiAgIE1BQ0g2NF9QUklNX1FVQURTLAogICBNQUNINjRfUFJJTV9RVUFEX1NUUklQLAogICBNQUNINjRfUFJJTV9QT0xZR09OLAp9OwoKc3RhdGljIHZvaWQgbWFjaDY0UmFzdGVyUHJpbWl0aXZlKCBHTGNvbnRleHQgKmN0eCwgR0x1aW50IGh3cHJpbSApOwpzdGF0aWMgdm9pZCBtYWNoNjRSZW5kZXJQcmltaXRpdmUoIEdMY29udGV4dCAqY3R4LCBHTGVudW0gcHJpbSApOwoKCi8qIEZJWE1FOiBSZW1vdmUgdGhpcyB3aGVuIG5hdGl2ZSB0ZW1wbGF0ZSBpcyBmaW5pc2hlZC4gKi8KI2RlZmluZSBNQUNINjRfUFJJTlRfQlVGRkVSIDAKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICAgICAgICAgRW1pdCBwcmltaXRpdmVzIGFzIGlubGluZSB2ZXJ0aWNlcyAgICAgICAgICAgICAgICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKI2lmIGRlZmluZWQoVVNFX1g4Nl9BU00pCiNkZWZpbmUgRE9fQ09QWV9WRVJURVgoIHZiLCB2ZXJ0c2l6ZSwgdiwgbiwgbSApCQkJCQlcCmRvIHsJCQkJCQkJCQkJXAogICByZWdpc3RlciBjb25zdCBDQVJEMzIgKl9fcCBfX2FzbV9fKCAiZXNpIiApID0gKENBUkQzMiAqKXYgKyAxMCAtIHZlcnRzaXplOwlcCiAgIHJlZ2lzdGVyIGludCBfX3MgX19hc21fXyggImVjeCIgKSA9IHZlcnRzaXplOwkJCQlcCiAgIGlmICggdmVydHNpemUgPiA3ICkgewkJCQkJCQlcCiAgICAgICp2YisrID0gKDIgPDwgMTYpIHwgQURSSU5ERVgoIE1BQ0g2NF9WRVJURVhfIyNuIyNfU0VDT05EQVJZX1MgKTsJCVwKICAgICAgX19hc21fXyBfX3ZvbGF0aWxlX18oICJtb3ZzbCA7IG1vdnNsIDsgbW92c2wiCQkJCVwKCQkJICAgIDogIj1EIiAodmIpLCAiPVMiIChfX3ApCQkJCVwKCQkJICAgIDogIjAiICh2YiksICIxIiAoX19wKSApOwkJCQlcCiAgICAgIF9fcyAtPSAzOwkJCQkJCQkJCVwKICAgfQkJCQkJCQkJCQlcCiAgICp2YisrID0gKChfX3MgLSAxICsgbSkgPDwgMTYpIHwJCQkJCQlcCiAgIAkgICAoQURSSU5ERVgoIE1BQ0g2NF9WRVJURVhfIyNuIyNfWF9ZICkgLSAoX19zIC0gMSkgKTsJCQlcCiAgIF9fYXNtX18gX192b2xhdGlsZV9fKCAicmVwIDsgbW92c2wiCQkJCQkJXAoJCQkgOiAiPSVjIiAoX19zKSwgIj1EIiAodmIpLCAiPVMiIChfX3ApCQkJXAoJCQkgOiAiMCIgKF9fcyksICIxIiAodmIpLCAiMiIgKF9fcCkgKTsJCQlcCn0gd2hpbGUgKDApCiNlbHNlCiNkZWZpbmUgRE9fQ09QWV9WRVJURVgoIHZiLCB2ZXJ0c2l6ZSwgdiwgbiwgbSApCQkJCVwKZG8gewkJCQkJCQkJCVwKICAgQ0FSRDMyICpfX3AgPSAoQ0FSRDMyICopdiArIDEwIC0gdmVydHNpemU7CQkJCVwKICAgaW50IF9fcyA9IHZlcnRzaXplOwkJCQkJCQlcCiAgIGlmICggdmVydHNpemUgPiA3ICkgewkJCQkJCVwKICAgICAgTEUzMl9PVVQoIHZiKyssICgyIDw8IDE2KSB8CQkJCQlcCgkgICAgCSAgICAgIEFEUklOREVYKCBNQUNINjRfVkVSVEVYXyMjbiMjX1NFQ09OREFSWV9TICkgKTsJXAogICAgICAqdmIrKyA9ICpfX3ArKzsJCQkJCQkJXAogICAgICAqdmIrKyA9ICpfX3ArKzsJCQkJCQkJXAogICAgICAqdmIrKyA9ICpfX3ArKzsJCQkJCQkJXAogICAgICBfX3MgLT0gMzsJCQkJCQkJCVwKICAgfQkJCQkJCQkJCVwKICAgTEUzMl9PVVQoIHZiKyssICgoX19zIC0gMSArIG0pIDw8IDE2KSB8CQkJCVwKCSAgICAgICAgICAgKEFEUklOREVYKCBNQUNINjRfVkVSVEVYXyMjbiMjX1hfWSApIC0gKF9fcyAtIDEpKSApOwlcCiAgIHdoaWxlICggX19zLS0gKSB7CQkJCQkJCVwKICAgICAgKnZiKysgPSAqX19wKys7CQkJCQkJCVwKICAgfQkJCQkJCQkJCVwKfSB3aGlsZSAoMCkKI2VuZGlmCgojZGVmaW5lIENPUFlfVkVSVEVYKCB2YiwgdmVydHNpemUsIHYsIG4gKQlET19DT1BZX1ZFUlRFWCggdmIsIHZlcnRzaXplLCB2LCBuLCAwICkKI2RlZmluZSBDT1BZX1ZFUlRFWF9PT0EoIHZiLCB2ZXJ0c2l6ZSwgdiwgbiApCURPX0NPUFlfVkVSVEVYKCB2YiwgdmVydHNpemUsIHYsIG4sIDEgKQoKCnN0YXRpYyBJTkxJTkUgdm9pZCBtYWNoNjRfZHJhd19xdWFkKCBtYWNoNjRDb250ZXh0UHRyIG1tZXNhLAoJCQkJICAgICAgIG1hY2g2NFZlcnRleFB0ciB2MCwKCQkJCSAgICAgICBtYWNoNjRWZXJ0ZXhQdHIgdjEsCgkJCQkgICAgICAgbWFjaDY0VmVydGV4UHRyIHYyLAoJCQkJICAgICAgIG1hY2g2NFZlcnRleFB0ciB2MyApCnsKI2lmIE1BQ0g2NF9OQVRJVkVfVlRYRk1UCiAgIEdMY29udGV4dCAqY3R4ID0gbW1lc2EtPmdsQ3R4OwogICBjb25zdCBHTHVpbnQgdmVydHNpemUgPSBtbWVzYS0+dmVydGV4X3NpemU7CiAgIEdMaW50IGE7CiAgIEdMZmxvYXQgb29hOwogICBHTHVpbnQgeHk7CiAgIGNvbnN0IEdMdWludCB4eW9mZnNldCA9IDk7CiAgIEdMaW50IHh4WzNdLCB5eVszXTsgLyogMiBmcmFjdGlvbmFsIGJpdHMgZm9yIGhhcmR3YXJlICovCiAgIHVuc2lnbmVkIHZic2l6ID0gKHZlcnRzaXplICsgKHZlcnRzaXplID4gNyA/IDIgOiAxKSkgKiA0ICsgMjsKICAgQ0FSRDMyICp2YiwgKnZiY2hrOwoKICAgaWYgKCBNQUNINjRfREVCVUcgJiBERUJVR19WRVJCT1NFX1BSSU1TICkgewogICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOlxuIiwgX19GVU5DVElPTl9fKTsKICAgICAgZnByaW50ZihzdGRlcnIsIlZlcnRleCAxOlxuIik7CiAgICAgIG1hY2g2NF9wcmludF92ZXJ0ZXgoIGN0eCwgdjAgKTsKICAgICAgZnByaW50ZihzdGRlcnIsIlZlcnRleCAyOlxuIik7CiAgICAgIG1hY2g2NF9wcmludF92ZXJ0ZXgoIGN0eCwgdjEgKTsKICAgICAgZnByaW50ZihzdGRlcnIsIlZlcnRleCAzOlxuIik7CiAgICAgIG1hY2g2NF9wcmludF92ZXJ0ZXgoIGN0eCwgdjIgKTsKICAgICAgZnByaW50ZihzdGRlcnIsIlZlcnRleCA0OlxuIik7CiAgICAgIG1hY2g2NF9wcmludF92ZXJ0ZXgoIGN0eCwgdjMgKTsKICAgfQogICAKICAgeHkgPSBMRTMyX0lOKCAmdjAtPnVpW3h5b2Zmc2V0XSApOwogICB4eFswXSA9IChHTHNob3J0KSggeHkgPj4gMTYgKTsKICAgeXlbMF0gPSAoR0xzaG9ydCkoIHh5ICYgMHhmZmZmICk7CiAgIAogICB4eSA9IExFMzJfSU4oICZ2MS0+dWlbeHlvZmZzZXRdICk7CiAgIHh4WzFdID0gKEdMc2hvcnQpKCB4eSA+PiAxNiApOwogICB5eVsxXSA9IChHTHNob3J0KSggeHkgJiAweGZmZmYgKTsKICAgCiAgIHh5ID0gTEUzMl9JTiggJnYzLT51aVt4eW9mZnNldF0gKTsKICAgeHhbMl0gPSAoR0xzaG9ydCkoIHh5ID4+IDE2ICk7CiAgIHl5WzJdID0gKEdMc2hvcnQpKCB4eSAmIDB4ZmZmZiApOwoJICAgCiAgIGEgPSAoeHhbMF0gLSB4eFsyXSkgKiAoeXlbMV0gLSB5eVsyXSkgLQogICAgICAgKHl5WzBdIC0geXlbMl0pICogKHh4WzFdIC0geHhbMl0pOwoKICAgaWYgKCAobW1lc2EtPmJhY2tmYWNlX3NpZ24gJiYKCSgoYSA8IDAgJiYgIXNpZ25iaXQoIG1tZXNhLT5iYWNrZmFjZV9zaWduICkpIHx8IAoJKGEgPiAwICYmIHNpZ25iaXQoIG1tZXNhLT5iYWNrZmFjZV9zaWduICkpKSkgKSB7CiAgICAgIC8qIGN1bGwgcXVhZCAqLwogICAgICBpZiAoIE1BQ0g2NF9ERUJVRyAmIERFQlVHX1ZFUkJPU0VfUFJJTVMgKQoJIGZwcmludGYoc3RkZXJyLCJRdWFkIGN1bGxlZFxuIik7CiAgICAgIHJldHVybjsKICAgfQogICAKICAgb29hID0gMTYuMCAvIGE7CiAgIAogICB2YiA9IChDQVJEMzIgKiltYWNoNjRBbGxvY0RtYUxvdyggbW1lc2EsIHZic2l6ICogc2l6ZW9mKENBUkQzMikgKTsKICAgdmJjaGsgPSB2YiArIHZic2l6OwoKICAgQ09QWV9WRVJURVgoIHZiLCB2ZXJ0c2l6ZSwgdjAsIDEgKTsKICAgQ09QWV9WRVJURVgoIHZiLCB2ZXJ0c2l6ZSwgdjEsIDIgKTsKICAgQ09QWV9WRVJURVhfT09BKCB2YiwgdmVydHNpemUsIHYzLCAzICk7CiAgIExFMzJfT1VUKCB2YisrLCAqKENBUkQzMiAqKSZvb2EgKTsKCiAgIHh5ID0gTEUzMl9JTiggJnYyLT51aVt4eW9mZnNldF0gKTsKICAgeHhbMF0gPSAoR0xzaG9ydCkoIHh5ID4+IDE2ICk7CiAgIHl5WzBdID0gKEdMc2hvcnQpKCB4eSAmIDB4ZmZmZiApOwoJICAgCiAgIGEgPSAoeHhbMF0gLSB4eFsyXSkgKiAoeXlbMV0gLSB5eVsyXSkgLQogICAgICAgKHl5WzBdIC0geXlbMl0pICogKHh4WzFdIC0geHhbMl0pOwogICAKICAgb29hID0gMTYuMCAvIGE7CiAgIAogICBDT1BZX1ZFUlRFWF9PT0EoIHZiLCB2ZXJ0c2l6ZSwgdjIsIDEgKTsKICAgTEUzMl9PVVQoIHZiKyssICooQ0FSRDMyICopJm9vYSApOwoKICAgYXNzZXJ0KCB2YiA9PSB2YmNoayApOwogICAKI2lmIE1BQ0g2NF9QUklOVF9CVUZGRVIKICAgewogICAgICBpbnQgaTsKICAgICAgZnByaW50ZihzdGRlcnIsICJxdWFkOlxuIik7CiAgICAgIGZvciAoaSA9IDA7IGkgPCB2YnNpejsgaSsrKQoJIGZwcmludGYoc3RkZXJyLCAiICAlMDhseFxuIiwgKih2YiAtIHZic2l6ICsgaSkpOwogICAgICBmcHJpbnRmKHN0ZGVyciwgIlxuIik7CiAgIH0KI2VuZGlmCiNlbHNlCiAgIEdMdWludCB2ZXJ0c2l6ZSA9IG1tZXNhLT52ZXJ0ZXhfc2l6ZTsKICAgR0xpbnQgY29sb3JpZHg7CiAgIEdMZmxvYXQgb29hOwogICBHTGludCB4eFszXSwgeXlbM107IC8qIDIgZnJhY3Rpb25hbCBiaXRzIGZvciBoYXJkd2FyZSAqLwogICB1bnNpZ25lZCB2YnNpeiA9IAoJICgoCgkgICAgMSArCgkgICAgKHZlcnRzaXplID4gNiA/IDIgOiAwKSArCgkgICAgKHZlcnRzaXplID4gNCA/IDIgOiAwKSArCgkgICAgMyArCgkgICAgKG1tZXNhLT5tdWx0aXRleCA/IDQgOiAwKQoJICkgKiA0ICsgNCk7CiAgIENBUkQzMiAqdmI7CiAgIHVuc2lnbmVkIHZiaWR4ID0gMDsKCiAgIGlmICggTUFDSDY0X0RFQlVHICYgREVCVUdfVkVSQk9TRV9QUklNUyApIHsKICAgICAgZnByaW50ZihzdGRlcnIsICIlczpcbiIsIF9fRlVOQ1RJT05fXyk7CiAgICAgIGZwcmludGYoc3RkZXJyLCJWZXJ0ZXggMTogeDogJS4yZiwgeTogJS4yZiwgejogJS4yZiwgdzogJWZcblx0czA6ICVmLCB0MDogJWZcblx0czE6ICVmLCB0MTogJWZcbiIsIAoJICAgICAgdjAtPnYueCwgdjAtPnYueSwgdjAtPnYueiwgdjAtPnYudywgdjAtPnYudTAsIHYwLT52LnYwLCB2MC0+di51MSwgdjAtPnYudjEpOwogICAgICBmcHJpbnRmKHN0ZGVyciwiVmVydGV4IDI6IHg6ICUuMmYsIHk6ICUuMmYsIHo6ICUuMmYsIHc6ICVmXG5cdHMwOiAlZiwgdDA6ICVmXG5cdHMxOiAlZiwgdDE6ICVmXG4iLCAKCSAgICAgIHYxLT52LngsIHYxLT52LnksIHYxLT52LnosIHYxLT52LncsIHYxLT52LnUwLCB2MS0+di52MCwgdjEtPnYudTEsIHYxLT52LnYxKTsKICAgICAgZnByaW50ZihzdGRlcnIsIlZlcnRleCAzOiB4OiAlLjJmLCB5OiAlLjJmLCB6OiAlLjJmLCB3OiAlZlxuXHRzMDogJWYsIHQwOiAlZlxuXHRzMTogJWYsIHQxOiAlZlxuIiwgCgkgICAgICB2Mi0+di54LCB2Mi0+di55LCB2Mi0+di56LCB2Mi0+di53LCB2Mi0+di51MCwgdjItPnYudjAsIHYyLT52LnUxLCB2Mi0+di52MSk7CiAgICAgIGZwcmludGYoc3RkZXJyLCJWZXJ0ZXggNDogeDogJS4yZiwgeTogJS4yZiwgejogJS4yZiwgdzogJWZcblx0czA6ICVmLCB0MDogJWZcblx0czE6ICVmLCB0MTogJWZcbiIsIAoJICAgICAgdjMtPnYueCwgdjMtPnYueSwgdjMtPnYueiwgdjMtPnYudywgdjMtPnYudTAsIHYzLT52LnYwLCB2My0+di51MSwgdjMtPnYudjEpOwogICB9CgojaWYgTUFDSDY0X0NMSUVOVF9TVEFURV9FTUlUUwogICAvKiBFbmFibGUgZm9yIGludGVybGVhdmVkIGNsaWVudC1zaWRlIHN0YXRlIGVtaXRzICovCiAgIExPQ0tfSEFSRFdBUkUoIG1tZXNhICk7CiAgIGlmICggbW1lc2EtPmRpcnR5ICkgewogICAgICBtYWNoNjRFbWl0SHdTdGF0ZUxvY2tlZCggbW1lc2EgKTsKICAgfQogICBpZiAoIG1tZXNhLT5zYXJlYS0+ZGlydHkgKSB7CiAgICAgIG1hY2g2NFVwbG9hZEh3U3RhdGVMb2NrZWQoIG1tZXNhICk7CiAgIH0KICAgVU5MT0NLX0hBUkRXQVJFKCBtbWVzYSApOwojZW5kaWYKCiAgIHh4WzBdID0gKEdMaW50KSh2MC0+di54ICogNCk7CiAgIHl5WzBdID0gKEdMaW50KSh2MC0+di55ICogNCk7CgogICB4eFsxXSA9IChHTGludCkodjEtPnYueCAqIDQpOwogICB5eVsxXSA9IChHTGludCkodjEtPnYueSAqIDQpOwoKICAgeHhbMl0gPSAoR0xpbnQpKHYzLT52LnggKiA0KTsKICAgeXlbMl0gPSAoR0xpbnQpKHYzLT52LnkgKiA0KTsKCiAgIG9vYSA9IDAuMjUgKiAwLjI1ICogKCh4eFswXSAtIHh4WzJdKSAqICh5eVsxXSAtIHl5WzJdKSAtCgkJCSh5eVswXSAtIHl5WzJdKSAqICh4eFsxXSAtIHh4WzJdKSk7CiAgIAogICBpZiAoIG9vYSAqIG1tZXNhLT5iYWNrZmFjZV9zaWduIDwgMCApIHsKICAgICAgLyogY3VsbCBxdWFkICovCiAgICAgIGlmICggTUFDSDY0X0RFQlVHICYgREVCVUdfVkVSQk9TRV9QUklNUyApCgkgZnByaW50ZihzdGRlcnIsIlF1YWQgY3VsbGVkXG4iKTsKICAgICAgcmV0dXJuOwogICB9CiAgIAogICB2YiA9IChDQVJEMzIgKiltYWNoNjRBbGxvY0RtYUxvdyggbW1lc2EsIHZic2l6ICogNCApOwogICAKICAgb29hID0gMS4wIC8gb29hOwoKICAgY29sb3JpZHggPSAodmVydHNpemUgPiA0KSA/IDQ6IDM7CgogICAvKiBzZXR1cCBmb3IgMyw1LCBvciA3IHNlcXVlbnRpYWwgcmVnIHdyaXRlcyBiYXNlZCBvbiB2ZXJ0ZXggZm9ybWF0ICovCiAgIHN3aXRjaCAodmVydHNpemUpIHsKICAgY2FzZSA2OgogICAgICBMRTMyX09VVCggJnZiW3ZiaWR4KytdLCAoNCA8PCAxNikgfCBBRFJJTkRFWChNQUNINjRfVkVSVEVYXzFfVykgKTsKICAgICAgYnJlYWs7CiAgIGNhc2UgNDoKICAgICAgTEUzMl9PVVQoICZ2Ylt2YmlkeCsrXSwgKDIgPDwgMTYpIHwgQURSSU5ERVgoTUFDSDY0X1ZFUlRFWF8xX1opICk7CiAgICAgIGJyZWFrOwogICBkZWZhdWx0OiAvKiB2ZXJ0c2l6ZSA+PSA4ICovCiAgICAgIExFMzJfT1VUKCAmdmJbdmJpZHgrK10sICg2IDw8IDE2KSB8IEFEUklOREVYKE1BQ0g2NF9WRVJURVhfMV9TKSApOwogICAgICBicmVhazsKICAgfQogICBpZiAodmVydHNpemUgPiA2KSB7CiAgICAgIExFMzJfT1VUKCAmdmJbdmJpZHgrK10sIHYwLT51aVs2XSApOyAvKiBNQUNINjRfVkVSVEVYXzFfUyAqLwogICAgICBMRTMyX09VVCggJnZiW3ZiaWR4KytdLCB2MC0+dWlbN10gKTsgLyogTUFDSDY0X1ZFUlRFWF8xX1QgKi8KICAgfQogICBpZiAodmVydHNpemUgPiA0KSB7CiAgICAgIExFMzJfT1VUKCAmdmJbdmJpZHgrK10sIHYwLT51aVszXSApOyAvKiBNQUNINjRfVkVSVEVYXzFfVyAqLwogICAgICBMRTMyX09VVCggJnZiW3ZiaWR4KytdLCB2MC0+dWlbNV0gKTsgLyogTUFDSDY0X1ZFUlRFWF8xX1NQRUNfQVJHQiAqLwogICB9CiAgIExFMzJfT1VUKCAmdmJbdmJpZHgrK10sICgoR0xpbnQpKHYwLT52LnopIDw8IDE1KSApOyAgICAgICAgIC8qIE1BQ0g2NF9WRVJURVhfMV9aICovCiAgIHZiW3ZiaWR4KytdID0gdjAtPnVpW2NvbG9yaWR4XTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTUFDSDY0X1ZFUlRFWF8xX0FSR0IgKi8KICAgTEUzMl9PVVQoICZ2Ylt2YmlkeCsrXSwgKHh4WzBdIDw8IDE2KSB8ICh5eVswXSAmIDB4ZmZmZikgKTsgLyogTUFDSDY0X1ZFUlRFWF8xX1hfWSAqLwoKICAgaWYgKG1tZXNhLT5tdWx0aXRleCkgewogICAgICAvKiBzZXR1cCBmb3IgMyBzZXF1ZW50aWFsIHJlZyB3cml0ZXMgKi8KICAgICAgTEUzMl9PVVQoICZ2Ylt2YmlkeCsrXSwgKDIgPDwgMTYpIHwgQURSSU5ERVgoTUFDSDY0X1ZFUlRFWF8xX1NFQ09OREFSWV9TKSApOwogICAgICBMRTMyX09VVCggJnZiW3ZiaWR4KytdLCB2MC0+dWlbOF0gKTsgLyogTUFDSDY0X1ZFUlRFWF8xX1NFQ09OREFSWV9TICovCiAgICAgIExFMzJfT1VUKCAmdmJbdmJpZHgrK10sIHYwLT51aVs5XSApOyAvKiBNQUNINjRfVkVSVEVYXzFfU0VDT05EQVJZX1QgKi8KICAgICAgTEUzMl9PVVQoICZ2Ylt2YmlkeCsrXSwgdjAtPnVpWzNdICk7IC8qIE1BQ0g2NF9WRVJURVhfMV9TRUNPTkRBUllfVyAqLwogICB9CgogICAvKiBzZXR1cCBmb3IgMyw1LCBvciA3IHNlcXVlbnRpYWwgcmVnIHdyaXRlcyBiYXNlZCBvbiB2ZXJ0ZXggZm9ybWF0ICovCiAgIHN3aXRjaCAodmVydHNpemUpIHsKICAgY2FzZSA2OgogICAgICBMRTMyX09VVCggJnZiW3ZiaWR4KytdLCAoNCA8PCAxNikgfCBBRFJJTkRFWChNQUNINjRfVkVSVEVYXzJfVykgKTsKICAgICAgYnJlYWs7CiAgIGNhc2UgNDoKICAgICAgTEUzMl9PVVQoICZ2Ylt2YmlkeCsrXSwgKDIgPDwgMTYpIHwgQURSSU5ERVgoTUFDSDY0X1ZFUlRFWF8yX1opICk7CiAgICAgIGJyZWFrOwogICBkZWZhdWx0OiAvKiB2ZXJ0c2l6ZSA+PSA4ICovCiAgICAgIExFMzJfT1VUKCAmdmJbdmJpZHgrK10sICg2IDw8IDE2KSB8IEFEUklOREVYKE1BQ0g2NF9WRVJURVhfMl9TKSApOwogICAgICBicmVhazsKICAgfQogICBpZiAodmVydHNpemUgPiA2KSB7CiAgICAgIExFMzJfT1VUKCAmdmJbdmJpZHgrK10sIHYxLT51aVs2XSApOyAvKiBNQUNINjRfVkVSVEVYXzJfUyAqLwogICAgICBMRTMyX09VVCggJnZiW3ZiaWR4KytdLCB2MS0+dWlbN10gKTsgLyogTUFDSDY0X1ZFUlRFWF8yX1QgKi8KICAgfQogICBpZiAodmVydHNpemUgPiA0KSB7CiAgICAgIExFMzJfT1VUKCAmdmJbdmJpZHgrK10sIHYxLT51aVszXSApOyAvKiBNQUNINjRfVkVSVEVYXzJfVyAqLwogICAgICBMRTMyX09VVCggJnZiW3ZiaWR4KytdLCB2MS0+dWlbNV0gKTsgLyogTUFDSDY0X1ZFUlRFWF8yX1NQRUNfQVJHQiAqLwogICB9CiAgIExFMzJfT1VUKCAmdmJbdmJpZHgrK10sICgoR0xpbnQpKHYxLT52LnopIDw8IDE1KSApOyAgICAgICAgIC8qIE1BQ0g2NF9WRVJURVhfMl9aICovCiAgIHZiW3ZiaWR4KytdID0gdjEtPnVpW2NvbG9yaWR4XTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTUFDSDY0X1ZFUlRFWF8yX0FSR0IgKi8KICAgTEUzMl9PVVQoICZ2Ylt2YmlkeCsrXSwgKHh4WzFdIDw8IDE2KSB8ICh5eVsxXSAmIDB4ZmZmZikgKTsgLyogTUFDSDY0X1ZFUlRFWF8yX1hfWSAqLwoKICAgaWYgKG1tZXNhLT5tdWx0aXRleCkgewogICAgICAvKiBzZXR1cCBmb3IgMyBzZXF1ZW50aWFsIHJlZyB3cml0ZXMgKi8KICAgICAgTEUzMl9PVVQoICZ2Ylt2YmlkeCsrXSwgKDIgPDwgMTYpIHwgQURSSU5ERVgoTUFDSDY0X1ZFUlRFWF8yX1NFQ09OREFSWV9TKSApOwogICAgICBMRTMyX09VVCggJnZiW3ZiaWR4KytdLCB2MS0+dWlbOF0gKTsgLyogTUFDSDY0X1ZFUlRFWF8yX1NFQ09OREFSWV9TICovCiAgICAgIExFMzJfT1VUKCAmdmJbdmJpZHgrK10sIHYxLT51aVs5XSApOyAvKiBNQUNINjRfVkVSVEVYXzJfU0VDT05EQVJZX1QgKi8KICAgICAgTEUzMl9PVVQoICZ2Ylt2YmlkeCsrXSwgdjEtPnVpWzNdICk7IC8qIE1BQ0g2NF9WRVJURVhfMl9TRUNPTkRBUllfVyAqLwogICB9CgogICAvKiBzZXR1cCBmb3IgMyw1LCBvciA3IHNlcXVlbnRpYWwgcmVnIHdyaXRlcyBiYXNlZCBvbiB2ZXJ0ZXggZm9ybWF0ICovCiAgIHN3aXRjaCAodmVydHNpemUpIHsKICAgY2FzZSA2OgogICAgICBMRTMyX09VVCggJnZiW3ZiaWR4KytdLCAoNCA8PCAxNikgfCBBRFJJTkRFWChNQUNINjRfVkVSVEVYXzNfVykgKTsKICAgICAgYnJlYWs7CiAgIGNhc2UgNDoKICAgICAgTEUzMl9PVVQoICZ2Ylt2YmlkeCsrXSwgKDIgPDwgMTYpIHwgQURSSU5ERVgoTUFDSDY0X1ZFUlRFWF8zX1opICk7CiAgICAgIGJyZWFrOwogICBkZWZhdWx0OiAvKiB2ZXJ0c2l6ZSA+PSA4ICovCiAgICAgIExFMzJfT1VUKCAmdmJbdmJpZHgrK10sICg2IDw8IDE2KSB8IEFEUklOREVYKE1BQ0g2NF9WRVJURVhfM19TKSApOwogICAgICBicmVhazsKICAgfQogICBpZiAodmVydHNpemUgPiA2KSB7CiAgICAgIExFMzJfT1VUKCAmdmJbdmJpZHgrK10sIHYzLT51aVs2XSApOyAvKiBNQUNINjRfVkVSVEVYXzNfUyAqLwogICAgICBMRTMyX09VVCggJnZiW3ZiaWR4KytdLCB2My0+dWlbN10gKTsgLyogTUFDSDY0X1ZFUlRFWF8zX1QgKi8KICAgfQogICBpZiAodmVydHNpemUgPiA0KSB7CiAgICAgIExFMzJfT1VUKCAmdmJbdmJpZHgrK10sIHYzLT51aVszXSApOyAvKiBNQUNINjRfVkVSVEVYXzNfVyAqLwogICAgICBMRTMyX09VVCggJnZiW3ZiaWR4KytdLCB2My0+dWlbNV0gKTsgLyogTUFDSDY0X1ZFUlRFWF8zX1NQRUNfQVJHQiAqLwogICB9CiAgIExFMzJfT1VUKCAmdmJbdmJpZHgrK10sICgoR0xpbnQpKHYzLT52LnopIDw8IDE1KSApOyAgICAgICAgIC8qIE1BQ0g2NF9WRVJURVhfM19aICovCiAgIHZiW3ZiaWR4KytdID0gdjMtPnVpW2NvbG9yaWR4XTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE1BQ0g2NF9WRVJURVhfM19BUkdCICovCiAgIExFMzJfT1VUKCAmdmJbdmJpZHgrK10sICh4eFsyXSA8PCAxNikgfCAoeXlbMl0gJiAweGZmZmYpICk7IC8qIE1BQ0g2NF9WRVJURVhfM19YX1kgKi8KCiAgIGlmIChtbWVzYS0+bXVsdGl0ZXgpIHsKICAgICAgLyogc2V0dXAgZm9yIDMgc2VxdWVudGlhbCByZWcgd3JpdGVzICovCiAgICAgIExFMzJfT1VUKCAmdmJbdmJpZHgrK10sICgyIDw8IDE2KSB8IEFEUklOREVYKE1BQ0g2NF9WRVJURVhfM19TRUNPTkRBUllfUykgKTsKICAgICAgTEUzMl9PVVQoICZ2Ylt2YmlkeCsrXSwgdjMtPnVpWzhdICk7IC8qIE1BQ0g2NF9WRVJURVhfM19TRUNPTkRBUllfUyAqLwogICAgICBMRTMyX09VVCggJnZiW3ZiaWR4KytdLCB2My0+dWlbOV0gKTsgLyogTUFDSDY0X1ZFUlRFWF8zX1NFQ09OREFSWV9UICovCiAgICAgIExFMzJfT1VUKCAmdmJbdmJpZHgrK10sIHYzLT51aVszXSApOyAvKiBNQUNINjRfVkVSVEVYXzNfU0VDT05EQVJZX1cgKi8KICAgfQoKICAgTEUzMl9PVVQoICZ2Ylt2YmlkeCsrXSwgQURSSU5ERVgoTUFDSDY0X09ORV9PVkVSX0FSRUFfVUMpICk7CiAgIExFMzJfT1VUKCAmdmJbdmJpZHgrK10sICooR0x1aW50ICopJm9vYSApOwoKICAgeHhbMF0gPSAoR0xpbnQpKHYyLT52LnggKiA0KTsKICAgeXlbMF0gPSAoR0xpbnQpKHYyLT52LnkgKiA0KTsKCiAgIG9vYSA9IDAuMjUgKiAwLjI1ICogKCh4eFswXSAtIHh4WzJdKSAqICh5eVsxXSAtIHl5WzJdKSAtCgkJCSh5eVswXSAtIHl5WzJdKSAqICh4eFsxXSAtIHh4WzJdKSk7CiAgIG9vYSA9IDEuMCAvIG9vYTsKCiAgIC8qIHNldHVwIGZvciAzLDUsIG9yIDcgc2VxdWVudGlhbCByZWcgd3JpdGVzIGJhc2VkIG9uIHZlcnRleCBmb3JtYXQgKi8KICAgc3dpdGNoICh2ZXJ0c2l6ZSkgewogICBjYXNlIDY6CiAgICAgIExFMzJfT1VUKCAmdmJbdmJpZHgrK10sICg0IDw8IDE2KSB8IEFEUklOREVYKE1BQ0g2NF9WRVJURVhfMV9XKSApOwogICAgICBicmVhazsKICAgY2FzZSA0OgogICAgICBMRTMyX09VVCggJnZiW3ZiaWR4KytdLCAoMiA8PCAxNikgfCBBRFJJTkRFWChNQUNINjRfVkVSVEVYXzFfWikgKTsKICAgICAgYnJlYWs7CiAgIGRlZmF1bHQ6IC8qIHZlcnRzaXplID49IDggKi8KICAgICAgTEUzMl9PVVQoICZ2Ylt2YmlkeCsrXSwgKDYgPDwgMTYpIHwgQURSSU5ERVgoTUFDSDY0X1ZFUlRFWF8xX1MpICk7CiAgICAgIGJyZWFrOwogICB9CiAgIGlmICh2ZXJ0c2l6ZSA+IDYpIHsKICAgICAgTEUzMl9PVVQoICZ2Ylt2YmlkeCsrXSwgdjItPnVpWzZdICk7IC8qIE1BQ0g2NF9WRVJURVhfMV9TICovCiAgICAgIExFMzJfT1VUKCAmdmJbdmJpZHgrK10sIHYyLT51aVs3XSApOyAvKiBNQUNINjRfVkVSVEVYXzFfVCAqLwogICB9CiAgIGlmICh2ZXJ0c2l6ZSA+IDQpIHsKICAgICAgTEUzMl9PVVQoICZ2Ylt2YmlkeCsrXSwgdjItPnVpWzNdICk7IC8qIE1BQ0g2NF9WRVJURVhfMV9XICovCiAgICAgIExFMzJfT1VUKCAmdmJbdmJpZHgrK10sIHYyLT51aVs1XSApOyAvKiBNQUNINjRfVkVSVEVYXzFfU1BFQ19BUkdCICovCiAgIH0KICAgTEUzMl9PVVQoICZ2Ylt2YmlkeCsrXSwgKChHTGludCkodjItPnYueikgPDwgMTUpICk7ICAgICAgICAgLyogTUFDSDY0X1ZFUlRFWF8xX1ogKi8KICAgdmJbdmJpZHgrK10gPSB2Mi0+dWlbY29sb3JpZHhdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTUFDSDY0X1ZFUlRFWF8xX0FSR0IgKi8KICAgTEUzMl9PVVQoICZ2Ylt2YmlkeCsrXSwgKHh4WzBdIDw8IDE2KSB8ICh5eVswXSAmIDB4ZmZmZikgKTsgLyogTUFDSDY0X1ZFUlRFWF8xX1hfWSAqLwoKICAgaWYgKG1tZXNhLT5tdWx0aXRleCkgewogICAgICAvKiBzZXR1cCBmb3IgMyBzZXF1ZW50aWFsIHJlZyB3cml0ZXMgKi8KICAgICAgTEUzMl9PVVQoICZ2Ylt2YmlkeCsrXSwgKDIgPDwgMTYpIHwgQURSSU5ERVgoTUFDSDY0X1ZFUlRFWF8xX1NFQ09OREFSWV9TKSApOwogICAgICBMRTMyX09VVCggJnZiW3ZiaWR4KytdLCB2Mi0+dWlbOF0gKTsgLyogTUFDSDY0X1ZFUlRFWF8xX1NFQ09OREFSWV9TICovCiAgICAgIExFMzJfT1VUKCAmdmJbdmJpZHgrK10sIHYyLT51aVs5XSApOyAvKiBNQUNINjRfVkVSVEVYXzFfU0VDT05EQVJZX1QgKi8KICAgICAgTEUzMl9PVVQoICZ2Ylt2YmlkeCsrXSwgdjItPnVpWzNdICk7IC8qIE1BQ0g2NF9WRVJURVhfMV9TRUNPTkRBUllfVyAqLwogICB9CgogICBMRTMyX09VVCggJnZiW3ZiaWR4KytdLCBBRFJJTkRFWChNQUNINjRfT05FX09WRVJfQVJFQV9VQykgKTsKICAgTEUzMl9PVVQoICZ2Ylt2YmlkeCsrXSwgKihHTHVpbnQgKikmb29hICk7CgogICBhc3NlcnQodmJzaXogPT0gdmJpZHgpOwoKI2lmIE1BQ0g2NF9QUklOVF9CVUZGRVIKICAgewogICAgICBpbnQgaTsKICAgICAgZnByaW50ZihzdGRlcnIsICJxdWFkOlxuIik7CiAgICAgIGZvciAoaSA9IDA7IGkgPCB2YnNpejsgaSsrKQoJIGZwcmludGYoc3RkZXJyLCAiICAlMDhseFxuIiwgKih2YiArIGkpKTsKICAgICAgZnByaW50ZihzdGRlcnIsICJcbiIpOwogICB9CiNlbmRpZgojZW5kaWYKfQoKc3RhdGljIElOTElORSB2b2lkIG1hY2g2NF9kcmF3X3RyaWFuZ2xlKCBtYWNoNjRDb250ZXh0UHRyIG1tZXNhLAoJCQkJCSAgIG1hY2g2NFZlcnRleFB0ciB2MCwKCQkJCQkgICBtYWNoNjRWZXJ0ZXhQdHIgdjEsCgkJCQkJICAgbWFjaDY0VmVydGV4UHRyIHYyICkKewojaWYgTUFDSDY0X05BVElWRV9WVFhGTVQKICAgR0xjb250ZXh0ICpjdHggPSBtbWVzYS0+Z2xDdHg7CiAgIEdMdWludCB2ZXJ0c2l6ZSA9IG1tZXNhLT52ZXJ0ZXhfc2l6ZTsKICAgR0xpbnQgYTsKICAgR0xmbG9hdCBvb2E7CiAgIEdMdWludCB4eTsKICAgY29uc3QgR0x1aW50IHh5b2Zmc2V0ID0gOTsKICAgR0xpbnQgeHhbM10sIHl5WzNdOyAvKiAyIGZyYWN0aW9uYWwgYml0cyBmb3IgaGFyZHdhcmUgKi8KICAgdW5zaWduZWQgdmJzaXogPSAodmVydHNpemUgKyAodmVydHNpemUgPiA3ID8gMiA6IDEpKSAqIDMgKyAxOwogICBDQVJEMzIgKnZiLCAqdmJjaGs7CgogICBpZiAoIE1BQ0g2NF9ERUJVRyAmIERFQlVHX1ZFUkJPU0VfUFJJTVMgKSB7CiAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6XG4iLCBfX0ZVTkNUSU9OX18pOwogICAgICBmcHJpbnRmKHN0ZGVyciwiVmVydGV4IDE6XG4iKTsKICAgICAgbWFjaDY0X3ByaW50X3ZlcnRleCggY3R4LCB2MCApOwogICAgICBmcHJpbnRmKHN0ZGVyciwiVmVydGV4IDI6XG4iKTsKICAgICAgbWFjaDY0X3ByaW50X3ZlcnRleCggY3R4LCB2MSApOwogICAgICBmcHJpbnRmKHN0ZGVyciwiVmVydGV4IDM6XG4iKTsKICAgICAgbWFjaDY0X3ByaW50X3ZlcnRleCggY3R4LCB2MiApOwogICB9CiAgIAogICB4eSA9IExFMzJfSU4oICZ2MC0+dWlbeHlvZmZzZXRdICk7CiAgIHh4WzBdID0gKEdMc2hvcnQpKCB4eSA+PiAxNiApOwogICB5eVswXSA9IChHTHNob3J0KSggeHkgJiAweGZmZmYgKTsKICAgCiAgIHh5ID0gTEUzMl9JTiggJnYxLT51aVt4eW9mZnNldF0gKTsKICAgeHhbMV0gPSAoR0xzaG9ydCkoIHh5ID4+IDE2ICk7CiAgIHl5WzFdID0gKEdMc2hvcnQpKCB4eSAmIDB4ZmZmZiApOwogICAKICAgeHkgPSBMRTMyX0lOKCAmdjItPnVpW3h5b2Zmc2V0XSApOwogICB4eFsyXSA9IChHTHNob3J0KSggeHkgPj4gMTYgKTsKICAgeXlbMl0gPSAoR0xzaG9ydCkoIHh5ICYgMHhmZmZmICk7CgkgICAKICAgYSA9ICh4eFswXSAtIHh4WzJdKSAqICh5eVsxXSAtIHl5WzJdKSAtCiAgICAgICAoeXlbMF0gLSB5eVsyXSkgKiAoeHhbMV0gLSB4eFsyXSk7CiAgIAogICBpZiAoIG1tZXNhLT5iYWNrZmFjZV9zaWduICYmCgkoKGEgPCAwICYmICFzaWduYml0KCBtbWVzYS0+YmFja2ZhY2Vfc2lnbiApKSB8fCAKCShhID4gMCAmJiBzaWduYml0KCBtbWVzYS0+YmFja2ZhY2Vfc2lnbiApKSkgKSB7CiAgICAgIC8qIGN1bGwgdHJpYW5nbGUgKi8KICAgICAgaWYgKCBNQUNINjRfREVCVUcgJiBERUJVR19WRVJCT1NFX1BSSU1TICkKCSBmcHJpbnRmKHN0ZGVyciwiVHJpYW5nbGUgY3VsbGVkXG4iKTsKICAgICAgcmV0dXJuOwogICB9CiAgIAogICBvb2EgPSAxNi4wIC8gYTsKICAgCiAgIHZiID0gKENBUkQzMiAqKW1hY2g2NEFsbG9jRG1hTG93KCBtbWVzYSwgdmJzaXogKiBzaXplb2YoQ0FSRDMyKSApOwogICB2YmNoayA9IHZiICsgdmJzaXo7CgogICBDT1BZX1ZFUlRFWCggdmIsIHZlcnRzaXplLCB2MCwgMSApOwogICBDT1BZX1ZFUlRFWCggdmIsIHZlcnRzaXplLCB2MSwgMiApOwogICBDT1BZX1ZFUlRFWF9PT0EoIHZiLCB2ZXJ0c2l6ZSwgdjIsIDMgKTsKICAgTEUzMl9PVVQoIHZiKyssICooQ0FSRDMyICopJm9vYSApOwoKICAgYXNzZXJ0KCB2YiA9PSB2YmNoayApOwoKI2lmIE1BQ0g2NF9QUklOVF9CVUZGRVIKICAgewogICAgICBpbnQgaTsKICAgICAgZnByaW50ZihzdGRlcnIsICJ0cmk6XG4iKTsKICAgICAgZm9yIChpID0gMDsgaSA8IHZic2l6OyBpKyspCgkgZnByaW50ZihzdGRlcnIsICIgICUwOGx4XG4iLCAqKHZiIC0gdmJzaXogKyBpKSk7CiAgICAgIGZwcmludGYoc3RkZXJyLCAiXG4iKTsKICAgfQojZW5kaWYKI2Vsc2UKICAgR0x1aW50IHZlcnRzaXplID0gbW1lc2EtPnZlcnRleF9zaXplOwogICBHTGludCBjb2xvcmlkeDsKICAgR0xmbG9hdCBvb2E7CiAgIEdMaW50IHh4WzNdLCB5eVszXTsgLyogMiBmcmFjdGlvbmFsIGJpdHMgZm9yIGhhcmR3YXJlICovCiAgIHVuc2lnbmVkIHZic2l6ID0gCgkgKCgKCSAgICAxICsKCSAgICAodmVydHNpemUgPiA2ID8gMiA6IDApICsKCSAgICAodmVydHNpemUgPiA0ID8gMiA6IDApICsKCSAgICAzICsKCSAgICAobW1lc2EtPm11bHRpdGV4ID8gNCA6IDApCgkgKSAqIDMgKyAyKTsKICAgQ0FSRDMyICp2YjsKICAgdW5zaWduZWQgdmJpZHggPSAwOwoKICAgaWYgKCBNQUNINjRfREVCVUcgJiBERUJVR19WRVJCT1NFX1BSSU1TICkgewogICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOlxuIiwgX19GVU5DVElPTl9fKTsKICAgICAgZnByaW50ZihzdGRlcnIsIlZlcnRleCAxOiB4OiAlLjJmLCB5OiAlLjJmLCB6OiAlLjJmLCB3OiAlZlxuXHRzMDogJWYsIHQwOiAlZlxuXHRzMTogJWYsIHQxOiAlZlxuIiwgCgkgICAgICB2MC0+di54LCB2MC0+di55LCB2MC0+di56LCB2MC0+di53LCB2MC0+di51MCwgdjAtPnYudjAsIHYwLT52LnUxLCB2MC0+di52MSk7CiAgICAgIGZwcmludGYoc3RkZXJyLCJWZXJ0ZXggMjogeDogJS4yZiwgeTogJS4yZiwgejogJS4yZiwgdzogJWZcblx0czA6ICVmLCB0MDogJWZcblx0czE6ICVmLCB0MTogJWZcbiIsIAoJICAgICAgdjEtPnYueCwgdjEtPnYueSwgdjEtPnYueiwgdjEtPnYudywgdjEtPnYudTAsIHYxLT52LnYwLCB2MS0+di51MSwgdjEtPnYudjEpOwogICAgICBmcHJpbnRmKHN0ZGVyciwiVmVydGV4IDM6IHg6ICUuMmYsIHk6ICUuMmYsIHo6ICUuMmYsIHc6ICVmXG5cdHMwOiAlZiwgdDA6ICVmXG5cdHMxOiAlZiwgdDE6ICVmXG4iLCAKCSAgICAgIHYyLT52LngsIHYyLT52LnksIHYyLT52LnosIHYyLT52LncsIHYyLT52LnUwLCB2Mi0+di52MCwgdjItPnYudTEsIHYyLT52LnYxKTsKICAgfQoKI2lmIE1BQ0g2NF9DTElFTlRfU1RBVEVfRU1JVFMKICAgLyogRW5hYmxlIGZvciBpbnRlcmxlYXZlZCBjbGllbnQtc2lkZSBzdGF0ZSBlbWl0cyAqLwogICBMT0NLX0hBUkRXQVJFKCBtbWVzYSApOwogICBpZiAoIG1tZXNhLT5kaXJ0eSApIHsKICAgICAgbWFjaDY0RW1pdEh3U3RhdGVMb2NrZWQoIG1tZXNhICk7CiAgIH0KICAgaWYgKCBtbWVzYS0+c2FyZWEtPmRpcnR5ICkgewogICAgICBtYWNoNjRVcGxvYWRId1N0YXRlTG9ja2VkKCBtbWVzYSApOwogICB9CiAgIFVOTE9DS19IQVJEV0FSRSggbW1lc2EgKTsKI2VuZGlmCgogICB4eFswXSA9IChHTGludCkodjAtPnYueCAqIDQpOwogICB5eVswXSA9IChHTGludCkodjAtPnYueSAqIDQpOwoKICAgeHhbMV0gPSAoR0xpbnQpKHYxLT52LnggKiA0KTsKICAgeXlbMV0gPSAoR0xpbnQpKHYxLT52LnkgKiA0KTsKCiAgIHh4WzJdID0gKEdMaW50KSh2Mi0+di54ICogNCk7CiAgIHl5WzJdID0gKEdMaW50KSh2Mi0+di55ICogNCk7CgogICBvb2EgPSAwLjI1ICogMC4yNSAqICgoeHhbMF0gLSB4eFsyXSkgKiAoeXlbMV0gLSB5eVsyXSkgLQoJCQkoeXlbMF0gLSB5eVsyXSkgKiAoeHhbMV0gLSB4eFsyXSkpOwoKICAgaWYgKCBvb2EgKiBtbWVzYS0+YmFja2ZhY2Vfc2lnbiA8IDAgKSB7CiAgICAgIC8qIGN1bGwgdHJpYW5nbGUgKi8KICAgICAgIGlmICggTUFDSDY0X0RFQlVHICYgREVCVUdfVkVSQk9TRV9QUklNUyApCgkgZnByaW50ZihzdGRlcnIsIlRyaWFuZ2xlIGN1bGxlZFxuIik7CiAgICAgIHJldHVybjsKICAgfQoKICAgdmIgPSAoQ0FSRDMyICopbWFjaDY0QWxsb2NEbWFMb3coIG1tZXNhLCB2YnNpeiAqIDQgKTsKICAgCiAgIG9vYSA9IDEuMCAvIG9vYTsKCiAgIGNvbG9yaWR4ID0gKHZlcnRzaXplID4gNCkgPyA0OiAzOwoKICAgLyogc2V0dXAgZm9yIDMsNSwgb3IgNyBzZXF1ZW50aWFsIHJlZyB3cml0ZXMgYmFzZWQgb24gdmVydGV4IGZvcm1hdCAqLwogICBzd2l0Y2ggKHZlcnRzaXplKSB7CiAgIGNhc2UgNjoKICAgICAgTEUzMl9PVVQoICZ2Ylt2YmlkeCsrXSwgKDQgPDwgMTYpIHwgQURSSU5ERVgoTUFDSDY0X1ZFUlRFWF8xX1cpICk7CiAgICAgIGJyZWFrOwogICBjYXNlIDQ6CiAgICAgIExFMzJfT1VUKCAmdmJbdmJpZHgrK10sICgyIDw8IDE2KSB8IEFEUklOREVYKE1BQ0g2NF9WRVJURVhfMV9aKSApOwogICAgICBicmVhazsKICAgZGVmYXVsdDogLyogdmVydHNpemUgPj0gOCAqLwogICAgICBMRTMyX09VVCggJnZiW3ZiaWR4KytdLCAoNiA8PCAxNikgfCBBRFJJTkRFWChNQUNINjRfVkVSVEVYXzFfUykgKTsKICAgICAgYnJlYWs7CiAgIH0KICAgaWYgKHZlcnRzaXplID4gNikgewogICAgICBMRTMyX09VVCggJnZiW3ZiaWR4KytdLCB2MC0+dWlbNl0gKTsgLyogTUFDSDY0X1ZFUlRFWF8xX1MgKi8KICAgICAgTEUzMl9PVVQoICZ2Ylt2YmlkeCsrXSwgdjAtPnVpWzddICk7IC8qIE1BQ0g2NF9WRVJURVhfMV9UICovCiAgIH0KICAgaWYgKHZlcnRzaXplID4gNCkgewogICAgICBMRTMyX09VVCggJnZiW3ZiaWR4KytdLCB2MC0+dWlbM10gKTsgLyogTUFDSDY0X1ZFUlRFWF8xX1cgKi8KICAgICAgTEUzMl9PVVQoICZ2Ylt2YmlkeCsrXSwgdjAtPnVpWzVdICk7IC8qIE1BQ0g2NF9WRVJURVhfMV9TUEVDX0FSR0IgKi8KICAgfQogICBMRTMyX09VVCggJnZiW3ZiaWR4KytdLCAoKEdMaW50KSh2MC0+di56KSA8PCAxNSkgKTsgICAgICAgICAvKiBNQUNINjRfVkVSVEVYXzFfWiAqLwogICB2Ylt2YmlkeCsrXSA9IHYwLT51aVtjb2xvcmlkeF07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBNQUNINjRfVkVSVEVYXzFfQVJHQiAqLwogICBMRTMyX09VVCggJnZiW3ZiaWR4KytdLCAoeHhbMF0gPDwgMTYpIHwgKHl5WzBdICYgMHhmZmZmKSApOyAvKiBNQUNINjRfVkVSVEVYXzFfWF9ZICovCgogICBpZiAobW1lc2EtPm11bHRpdGV4KSB7CiAgICAgIC8qIHNldHVwIGZvciAzIHNlcXVlbnRpYWwgcmVnIHdyaXRlcyAqLwogICAgICBMRTMyX09VVCggJnZiW3ZiaWR4KytdLCAoMiA8PCAxNikgfCBBRFJJTkRFWChNQUNINjRfVkVSVEVYXzFfU0VDT05EQVJZX1MpICk7CiAgICAgIExFMzJfT1VUKCAmdmJbdmJpZHgrK10sIHYwLT51aVs4XSApOyAvKiBNQUNINjRfVkVSVEVYXzFfU0VDT05EQVJZX1MgKi8KICAgICAgTEUzMl9PVVQoICZ2Ylt2YmlkeCsrXSwgdjAtPnVpWzldICk7IC8qIE1BQ0g2NF9WRVJURVhfMV9TRUNPTkRBUllfVCAqLwogICAgICBMRTMyX09VVCggJnZiW3ZiaWR4KytdLCB2MC0+dWlbM10gKTsgLyogTUFDSDY0X1ZFUlRFWF8xX1NFQ09OREFSWV9XICovCiAgIH0KCiAgIC8qIHNldHVwIGZvciAzLDUsIG9yIDcgc2VxdWVudGlhbCByZWcgd3JpdGVzIGJhc2VkIG9uIHZlcnRleCBmb3JtYXQgKi8KICAgc3dpdGNoICh2ZXJ0c2l6ZSkgewogICBjYXNlIDY6CiAgICAgIExFMzJfT1VUKCAmdmJbdmJpZHgrK10sICg0IDw8IDE2KSB8IEFEUklOREVYKE1BQ0g2NF9WRVJURVhfMl9XKSApOwogICAgICBicmVhazsKICAgY2FzZSA0OgogICAgICBMRTMyX09VVCggJnZiW3ZiaWR4KytdLCAoMiA8PCAxNikgfCBBRFJJTkRFWChNQUNINjRfVkVSVEVYXzJfWikgKTsKICAgICAgYnJlYWs7CiAgIGRlZmF1bHQ6IC8qIHZlcnRzaXplID49IDggKi8KICAgICAgTEUzMl9PVVQoICZ2Ylt2YmlkeCsrXSwgKDYgPDwgMTYpIHwgQURSSU5ERVgoTUFDSDY0X1ZFUlRFWF8yX1MpICk7CiAgICAgIGJyZWFrOwogICB9CiAgIGlmICh2ZXJ0c2l6ZSA+IDYpIHsKICAgICAgTEUzMl9PVVQoICZ2Ylt2YmlkeCsrXSwgdjEtPnVpWzZdICk7IC8qIE1BQ0g2NF9WRVJURVhfMl9TICovCiAgICAgIExFMzJfT1VUKCAmdmJbdmJpZHgrK10sIHYxLT51aVs3XSApOyAvKiBNQUNINjRfVkVSVEVYXzJfVCAqLwogICB9CiAgIGlmICh2ZXJ0c2l6ZSA+IDQpIHsKICAgICAgTEUzMl9PVVQoICZ2Ylt2YmlkeCsrXSwgdjEtPnVpWzNdICk7IC8qIE1BQ0g2NF9WRVJURVhfMl9XICovCiAgICAgIExFMzJfT1VUKCAmdmJbdmJpZHgrK10sIHYxLT51aVs1XSApOyAvKiBNQUNINjRfVkVSVEVYXzJfU1BFQ19BUkdCICovCiAgIH0KICAgTEUzMl9PVVQoICZ2Ylt2YmlkeCsrXSwgKChHTGludCkodjEtPnYueikgPDwgMTUpICk7ICAgICAgICAgLyogTUFDSDY0X1ZFUlRFWF8yX1ogKi8KICAgdmJbdmJpZHgrK10gPSB2MS0+dWlbY29sb3JpZHhdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTUFDSDY0X1ZFUlRFWF8yX0FSR0IgKi8KICAgTEUzMl9PVVQoICZ2Ylt2YmlkeCsrXSwgKHh4WzFdIDw8IDE2KSB8ICh5eVsxXSAmIDB4ZmZmZikgKTsgLyogTUFDSDY0X1ZFUlRFWF8yX1hfWSAqLwoKICAgaWYgKG1tZXNhLT5tdWx0aXRleCkgewogICAgICAvKiBzZXR1cCBmb3IgMyBzZXF1ZW50aWFsIHJlZyB3cml0ZXMgKi8KICAgICAgTEUzMl9PVVQoICZ2Ylt2YmlkeCsrXSwgKDIgPDwgMTYpIHwgQURSSU5ERVgoTUFDSDY0X1ZFUlRFWF8yX1NFQ09OREFSWV9TKSApOwogICAgICBMRTMyX09VVCggJnZiW3ZiaWR4KytdLCB2MS0+dWlbOF0gKTsgLyogTUFDSDY0X1ZFUlRFWF8yX1NFQ09OREFSWV9TICovCiAgICAgIExFMzJfT1VUKCAmdmJbdmJpZHgrK10sIHYxLT51aVs5XSApOyAvKiBNQUNINjRfVkVSVEVYXzJfU0VDT05EQVJZX1QgKi8KICAgICAgTEUzMl9PVVQoICZ2Ylt2YmlkeCsrXSwgdjEtPnVpWzNdICk7IC8qIE1BQ0g2NF9WRVJURVhfMl9TRUNPTkRBUllfVyAqLwogICB9CgogICAvKiBzZXR1cCBmb3IgMyw1LCBvciA3IHNlcXVlbnRpYWwgcmVnIHdyaXRlcyBiYXNlZCBvbiB2ZXJ0ZXggZm9ybWF0ICovCiAgIHN3aXRjaCAodmVydHNpemUpIHsKICAgY2FzZSA2OgogICAgICBMRTMyX09VVCggJnZiW3ZiaWR4KytdLCAoNCA8PCAxNikgfCBBRFJJTkRFWChNQUNINjRfVkVSVEVYXzNfVykgKTsKICAgICAgYnJlYWs7CiAgIGNhc2UgNDoKICAgICAgTEUzMl9PVVQoICZ2Ylt2YmlkeCsrXSwgKDIgPDwgMTYpIHwgQURSSU5ERVgoTUFDSDY0X1ZFUlRFWF8zX1opICk7CiAgICAgIGJyZWFrOwogICBkZWZhdWx0OiAvKiB2ZXJ0c2l6ZSA+PSA4ICovCiAgICAgIExFMzJfT1VUKCAmdmJbdmJpZHgrK10sICg2IDw8IDE2KSB8IEFEUklOREVYKE1BQ0g2NF9WRVJURVhfM19TKSApOwogICAgICBicmVhazsKICAgfQogICBpZiAodmVydHNpemUgPiA2KSB7CiAgICAgIExFMzJfT1VUKCAmdmJbdmJpZHgrK10sIHYyLT51aVs2XSApOyAvKiBNQUNINjRfVkVSVEVYXzNfUyAqLwogICAgICBMRTMyX09VVCggJnZiW3ZiaWR4KytdLCB2Mi0+dWlbN10gKTsgLyogTUFDSDY0X1ZFUlRFWF8zX1QgKi8KICAgfQogICBpZiAodmVydHNpemUgPiA0KSB7CiAgICAgIExFMzJfT1VUKCAmdmJbdmJpZHgrK10sIHYyLT51aVszXSApOyAvKiBNQUNINjRfVkVSVEVYXzNfVyAqLwogICAgICBMRTMyX09VVCggJnZiW3ZiaWR4KytdLCB2Mi0+dWlbNV0gKTsgLyogTUFDSDY0X1ZFUlRFWF8zX1NQRUNfQVJHQiAqLwogICB9CiAgIExFMzJfT1VUKCAmdmJbdmJpZHgrK10sICgoR0xpbnQpKHYyLT52LnopIDw8IDE1KSApOyAgICAgICAgIC8qIE1BQ0g2NF9WRVJURVhfM19aICovCiAgIHZiW3ZiaWR4KytdID0gdjItPnVpW2NvbG9yaWR4XTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE1BQ0g2NF9WRVJURVhfM19BUkdCICovCiAgIExFMzJfT1VUKCAmdmJbdmJpZHgrK10sICh4eFsyXSA8PCAxNikgfCAoeXlbMl0gJiAweGZmZmYpICk7IC8qIE1BQ0g2NF9WRVJURVhfM19YX1kgKi8KCiAgIGlmIChtbWVzYS0+bXVsdGl0ZXgpIHsKICAgICAgLyogc2V0dXAgZm9yIDMgc2VxdWVudGlhbCByZWcgd3JpdGVzICovCiAgICAgIExFMzJfT1VUKCAmdmJbdmJpZHgrK10sICgyIDw8IDE2KSB8IEFEUklOREVYKE1BQ0g2NF9WRVJURVhfM19TRUNPTkRBUllfUykgKTsKICAgICAgTEUzMl9PVVQoICZ2Ylt2YmlkeCsrXSwgdjItPnVpWzhdICk7IC8qIE1BQ0g2NF9WRVJURVhfM19TRUNPTkRBUllfUyAqLwogICAgICBMRTMyX09VVCggJnZiW3ZiaWR4KytdLCB2Mi0+dWlbOV0gKTsgLyogTUFDSDY0X1ZFUlRFWF8zX1NFQ09OREFSWV9UICovCiAgICAgIExFMzJfT1VUKCAmdmJbdmJpZHgrK10sIHYyLT51aVszXSApOyAvKiBNQUNINjRfVkVSVEVYXzNfU0VDT05EQVJZX1cgKi8KICAgfQoKICAgTEUzMl9PVVQoICZ2Ylt2YmlkeCsrXSwgQURSSU5ERVgoTUFDSDY0X09ORV9PVkVSX0FSRUFfVUMpICk7CiAgIExFMzJfT1VUKCAmdmJbdmJpZHgrK10sICooR0x1aW50ICopJm9vYSApOwoKICAgYXNzZXJ0KHZic2l6ID09IHZiaWR4KTsKCiNpZiBNQUNINjRfUFJJTlRfQlVGRkVSCiAgIHsKICAgICAgaW50IGk7CiAgICAgIGZwcmludGYoc3RkZXJyLCAidHJpOlxuIik7CiAgICAgIGZvciAoaSA9IDA7IGkgPCB2YnNpejsgKytpKQoJIGZwcmludGYoc3RkZXJyLCAiICAlMDhseFxuIiwgKih2YiArIGkpKTsKICAgICAgZnByaW50ZihzdGRlcnIsICJcbiIpOwogICB9CiNlbmRpZgojZW5kaWYKfQoKc3RhdGljIElOTElORSB2b2lkIG1hY2g2NF9kcmF3X2xpbmUoIG1hY2g2NENvbnRleHRQdHIgbW1lc2EsCgkJCQkgICAgIG1hY2g2NFZlcnRleFB0ciB2MCwKCQkJCSAgICAgbWFjaDY0VmVydGV4UHRyIHYxICkKewojaWYgTUFDSDY0X05BVElWRV9WVFhGTVQKICAgR0xjb250ZXh0ICpjdHggPSBtbWVzYS0+Z2xDdHg7CiAgIGNvbnN0IEdMdWludCB2ZXJ0c2l6ZSA9IG1tZXNhLT52ZXJ0ZXhfc2l6ZTsKICAgLyogMiBmcmFjdGlvbmFsIGJpdHMgZm9yIGhhcmR3YXJlOiAqLwogICBjb25zdCBpbnQgd2lkdGggPSAoaW50KSAoMi4wICogQ0xBTVAobW1lc2EtPmdsQ3R4LT5MaW5lLldpZHRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW1lc2EtPmdsQ3R4LT5Db25zdC5NaW5MaW5lV2lkdGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbWVzYS0+Z2xDdHgtPkNvbnN0Lk1heExpbmVXaWR0aCkpOwogICBHTGZsb2F0IG9vYTsKICAgR0x1aW50ICpweHkwLCAqcHh5MTsKICAgR0x1aW50IHh5MG9sZCwgeHkwLCB4eTFvbGQsIHh5MTsKICAgY29uc3QgR0x1aW50IHh5b2Zmc2V0ID0gOTsKICAgR0xpbnQgeDAsIHkwLCB4MSwgeTE7CiAgIEdMaW50IGR4LCBkeSwgaXgsIGl5OwogICB1bnNpZ25lZCB2YnNpeiA9ICh2ZXJ0c2l6ZSArICh2ZXJ0c2l6ZSA+IDcgPyAyIDogMSkpICogNCArIDI7CiAgIENBUkQzMiAqdmIsICp2YmNoazsKCiAgIGlmICggTUFDSDY0X0RFQlVHICYgREVCVUdfVkVSQk9TRV9QUklNUyApIHsKICAgICAgZnByaW50ZihzdGRlcnIsICIlczpcbiIsIF9fRlVOQ1RJT05fXyk7CiAgICAgIGZwcmludGYoc3RkZXJyLCJWZXJ0ZXggMTpcbiIpOwogICAgICBtYWNoNjRfcHJpbnRfdmVydGV4KCBjdHgsIHYwICk7CiAgICAgIGZwcmludGYoc3RkZXJyLCJWZXJ0ZXggMjpcbiIpOwogICAgICBtYWNoNjRfcHJpbnRfdmVydGV4KCBjdHgsIHYxICk7CiAgIH0KICAKICAgcHh5MCA9ICZ2MC0+dWlbeHlvZmZzZXRdOwogICB4eTBvbGQgPSAqcHh5MDsKICAgeHkwID0gTEUzMl9JTiggJnh5MG9sZCApOwogICB4MCA9IChHTHNob3J0KSggeHkwID4+IDE2ICk7CiAgIHkwID0gKEdMc2hvcnQpKCB4eTAgJiAweGZmZmYgKTsKICAgCiAgIHB4eTEgPSAmdjEtPnVpW3h5b2Zmc2V0XTsKICAgeHkxb2xkID0gKnB4eTE7CiAgIHh5MSA9IExFMzJfSU4oICZ4eTFvbGQgKTsKICAgeDEgPSAoR0xzaG9ydCkoIHh5MSA+PiAxNiApOwogICB5MSA9IChHTHNob3J0KSggeHkxICYgMHhmZmZmICk7CiAgIAogICBpZiAoIChkeCA9IHgxIC0geDApIDwgMCApIHsKICAgICAgZHggPSAtZHg7CiAgIH0KICAgaWYgKCAoZHkgPSB5MSAtIHkwKSA8IDAgKSB7CiAgICAgIGR5ID0gLWR5OwogICB9CiAgIAogICAvKiBhZGp1c3QgdmVydGljZXMgZGVwZW5kaW5nIG9uIGxpbmUgZGlyZWN0aW9uICovCiAgIGlmICggZHggPiBkeSApIHsKICAgICAgaXggPSAwOwogICAgICBpeSA9IHdpZHRoOwogICAgICBvb2EgPSA4LjAgLyAoKHgxIC0geDApICogd2lkdGgpOwogICB9IGVsc2UgewogICAgICBpeCA9IHdpZHRoOwogICAgICBpeSA9IDA7CiAgICAgIG9vYSA9IDguMCAvICgoeTAgLSB5MSkgKiB3aWR0aCk7CiAgIH0KCiAgIHZiID0gKENBUkQzMiAqKW1hY2g2NEFsbG9jRG1hTG93KCBtbWVzYSwgdmJzaXogKiBzaXplb2YoQ0FSRDMyKSApOwogICB2YmNoayA9IHZiICsgdmJzaXo7CgogICBMRTMyX09VVCggcHh5MCwgKCggeDAgLSBpeCApIDw8IDE2KSB8ICgoIHkwIC0gaXkgKSAmIDB4ZmZmZikgKTsKICAgQ09QWV9WRVJURVgoIHZiLCB2ZXJ0c2l6ZSwgdjAsIDEgKTsKICAgTEUzMl9PVVQoIHB4eTEsICgoIHgxIC0gaXggKSA8PCAxNikgfCAoKCB5MSAtIGl5ICkgJiAweGZmZmYpICk7CiAgIENPUFlfVkVSVEVYKCB2YiwgdmVydHNpemUsIHYxLCAyICk7CiAgIExFMzJfT1VUKCBweHkwLCAoKCB4MCArIGl4ICkgPDwgMTYpIHwgKCggeTAgKyBpeSApICYgMHhmZmZmKSApOwogICBDT1BZX1ZFUlRFWF9PT0EoIHZiLCB2ZXJ0c2l6ZSwgdjAsIDMgKTsKICAgTEUzMl9PVVQoIHZiKyssICooQ0FSRDMyICopJm9vYSApOwoKICAgb29hID0gLW9vYTsKICAgCiAgIExFMzJfT1VUKCBweHkxLCAoKCB4MSArIGl4ICkgPDwgMTYpIHwgKCggeTEgKyBpeSApICYgMHhmZmZmKSApOwogICBDT1BZX1ZFUlRFWF9PT0EoIHZiLCB2ZXJ0c2l6ZSwgdjEsIDEgKTsKICAgTEUzMl9PVVQoIHZiKyssICooQ0FSRDMyICopJm9vYSApOwoKICAgKnB4eTAgPSB4eTBvbGQ7CiAgICpweHkxID0geHkxb2xkOwojZWxzZSAvKiAhTUFDSDY0X05BVElWRV9WVFhGTVQgKi8KICAgR0x1aW50IHZlcnRzaXplID0gbW1lc2EtPnZlcnRleF9zaXplOwogICBHTGludCBjb2xvcmlkeDsKICAgZmxvYXQgd2lkdGggPSAxLjA7IC8qIE9ubHkgc3VwcG9ydCAxIHBpeCBsaW5lcyBub3cgKi8KICAgR0xmbG9hdCBvb2E7CiAgIEdMaW50IHh4WzNdLCB5eVszXTsgLyogMiBmcmFjdGlvbmFsIGJpdHMgZm9yIGhhcmR3YXJlICovCiAgIHVuc2lnbmVkIHZic2l6ID0gCgkgKCgKCSAgICAxICsKCSAgICAodmVydHNpemUgPiA2ID8gMiA6IDApICsKCSAgICAodmVydHNpemUgPiA0ID8gMiA6IDApICsKCSAgICAzICsKCSAgICAobW1lc2EtPm11bHRpdGV4ID8gNCA6IDApCgkgKSAqIDQgKyA0KTsKICAgQ0FSRDMyICp2YjsKICAgdW5zaWduZWQgdmJpZHggPSAwOwogICAKICAgR0xmbG9hdCBodywgZHgsIGR5LCBpeCwgaXk7CiAgIEdMZmxvYXQgeDAgPSB2MC0+di54OwogICBHTGZsb2F0IHkwID0gdjAtPnYueTsKICAgR0xmbG9hdCB4MSA9IHYxLT52Lng7CiAgIEdMZmxvYXQgeTEgPSB2MS0+di55OwoKI2lmIE1BQ0g2NF9DTElFTlRfU1RBVEVfRU1JVFMKICAgLyogRW5hYmxlIGZvciBpbnRlcmxlYXZlZCBjbGllbnQtc2lkZSBzdGF0ZSBlbWl0cyAqLwogICBMT0NLX0hBUkRXQVJFKCBtbWVzYSApOwogICBpZiAoIG1tZXNhLT5kaXJ0eSApIHsKICAgICAgbWFjaDY0RW1pdEh3U3RhdGVMb2NrZWQoIG1tZXNhICk7CiAgIH0KICAgaWYgKCBtbWVzYS0+c2FyZWEtPmRpcnR5ICkgewogICAgICBtYWNoNjRVcGxvYWRId1N0YXRlTG9ja2VkKCBtbWVzYSApOwogICB9CiAgIFVOTE9DS19IQVJEV0FSRSggbW1lc2EgKTsKI2VuZGlmCgogICBpZiAoIE1BQ0g2NF9ERUJVRyAmIERFQlVHX1ZFUkJPU0VfUFJJTVMgKSB7CiAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6XG4iLCBfX0ZVTkNUSU9OX18pOwogICAgICBmcHJpbnRmKHN0ZGVyciwiVmVydGV4IDE6IHg6ICUuMmYsIHk6ICUuMmYsIHo6ICUuMmYsIHc6ICVmXG4iLCAKCSAgICAgIHYwLT52LngsIHYwLT52LnksIHYwLT52LnosIHYwLT52LncpOwogICAgICBmcHJpbnRmKHN0ZGVyciwiVmVydGV4IDI6IHg6ICUuMmYsIHk6ICUuMmYsIHo6ICUuMmYsIHc6ICVmXG4iLCAKCSAgICAgIHYxLT52LngsIHYxLT52LnksIHYxLT52LnosIHYxLT52LncpOwogICB9CgogICBodyA9IDAuNUYgKiB3aWR0aDsKICAgaWYgKGh3ID4gMC4xRiAmJiBodyA8IDAuNUYpIHsKICAgICAgaHcgPSAwLjVGOwogICB9CgogICAvKiBhZGp1c3QgdmVydGljZXMgZGVwZW5kaW5nIG9uIGxpbmUgZGlyZWN0aW9uICovCiAgIGR4ID0gdjAtPnYueCAtIHYxLT52Lng7CiAgIGR5ID0gdjAtPnYueSAtIHYxLT52Lnk7CiAgIGlmIChkeCAqIGR4ID4gZHkgKiBkeSkgewogICAgICAvKiBYLW1ham9yIGxpbmUgKi8KICAgICAgaXggPSAwLjBGOwogICAgICBpeSA9IGh3OwogICAgICBpZiAoeDEgPCB4MCkgewogICAgICAgICB4MCArPSAwLjVGOwogICAgICAgICB4MSArPSAwLjVGOwogICAgICB9CiAgICAgIHkwIC09IDAuNUY7CiAgICAgIHkxIC09IDAuNUY7CiAgIH0KICAgZWxzZSB7CiAgICAgIC8qIFktbWFqb3IgbGluZSAqLwogICAgICBpeCA9IGh3OwogICAgICBpeSA9IDAuMEY7CiAgICAgIGlmICh5MSA+IHkwKSB7CiAgICAgICAgIHkwIC09IDAuNUY7CiAgICAgICAgIHkxIC09IDAuNUY7CiAgICAgIH0KICAgICAgeDAgKz0gMC41RjsKICAgICAgeDEgKz0gMC41RjsKICAgfQoKICAgeHhbMF0gPSAoR0xpbnQpKCh4MCAtIGl4KSAqIDQpOwogICB5eVswXSA9IChHTGludCkoKHkwIC0gaXkpICogNCk7CgogICB4eFsxXSA9IChHTGludCkoKHgxIC0gaXgpICogNCk7CiAgIHl5WzFdID0gKEdMaW50KSgoeTEgLSBpeSkgKiA0KTsKCiAgIHh4WzJdID0gKEdMaW50KSgoeDAgKyBpeCkgKiA0KTsKICAgeXlbMl0gPSAoR0xpbnQpKCh5MCArIGl5KSAqIDQpOwoKICAgb29hID0gMC4yNSAqIDAuMjUgKiAoKHh4WzBdIC0geHhbMl0pICogKHl5WzFdIC0geXlbMl0pIC0KCQkJKHl5WzBdIC0geXlbMl0pICogKHh4WzFdIC0geHhbMl0pKTsKCiAgIGlmICggb29hICogbW1lc2EtPmJhY2tmYWNlX3NpZ24gPCAwICkgewogICAgICAvKiBjdWxsIGxpbmUgKi8KICAgICAgaWYgKCBNQUNINjRfREVCVUcgJiBERUJVR19WRVJCT1NFX1BSSU1TICkKCSBmcHJpbnRmKHN0ZGVyciwiTGluZSBjdWxsZWRcbiIpOwogICAgICByZXR1cm47CiAgIH0KCiAgIHZiID0gKENBUkQzMiAqKW1hY2g2NEFsbG9jRG1hTG93KCBtbWVzYSwgdmJzaXogKiA0ICk7CiAgIAogICBvb2EgPSAxLjAgLyBvb2E7CgogICBjb2xvcmlkeCA9ICh2ZXJ0c2l6ZSA+IDQpID8gNDogMzsKCiAgIC8qIHNldHVwIGZvciAzLDUsIG9yIDcgc2VxdWVudGlhbCByZWcgd3JpdGVzIGJhc2VkIG9uIHZlcnRleCBmb3JtYXQgKi8KICAgc3dpdGNoICh2ZXJ0c2l6ZSkgewogICBjYXNlIDY6CiAgICAgIExFMzJfT1VUKCAmdmJbdmJpZHgrK10sICg0IDw8IDE2KSB8IEFEUklOREVYKE1BQ0g2NF9WRVJURVhfMV9XKSApOwogICAgICBicmVhazsKICAgY2FzZSA0OgogICAgICBMRTMyX09VVCggJnZiW3ZiaWR4KytdLCAoMiA8PCAxNikgfCBBRFJJTkRFWChNQUNINjRfVkVSVEVYXzFfWikgKTsKICAgICAgYnJlYWs7CiAgIGRlZmF1bHQ6IC8qIHZlcnRzaXplID49IDggKi8KICAgICAgTEUzMl9PVVQoICZ2Ylt2YmlkeCsrXSwgKDYgPDwgMTYpIHwgQURSSU5ERVgoTUFDSDY0X1ZFUlRFWF8xX1MpICk7CiAgICAgIGJyZWFrOwogICB9CiAgIGlmICh2ZXJ0c2l6ZSA+IDYpIHsKICAgICAgTEUzMl9PVVQoICZ2Ylt2YmlkeCsrXSwgdjAtPnVpWzZdICk7IC8qIE1BQ0g2NF9WRVJURVhfMV9TICovCiAgICAgIExFMzJfT1VUKCAmdmJbdmJpZHgrK10sIHYwLT51aVs3XSApOyAvKiBNQUNINjRfVkVSVEVYXzFfVCAqLwogICB9CiAgIGlmICh2ZXJ0c2l6ZSA+IDQpIHsKICAgICAgTEUzMl9PVVQoICZ2Ylt2YmlkeCsrXSwgdjAtPnVpWzNdICk7IC8qIE1BQ0g2NF9WRVJURVhfMV9XICovCiAgICAgIExFMzJfT1VUKCAmdmJbdmJpZHgrK10sIHYwLT51aVs1XSApOyAvKiBNQUNINjRfVkVSVEVYXzFfU1BFQ19BUkdCICovCiAgIH0KICAgTEUzMl9PVVQoICZ2Ylt2YmlkeCsrXSwgKChHTGludCkodjAtPnYueikgPDwgMTUpICk7ICAgICAgICAgLyogTUFDSDY0X1ZFUlRFWF8xX1ogKi8KICAgdmJbdmJpZHgrK10gPSB2MC0+dWlbY29sb3JpZHhdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTUFDSDY0X1ZFUlRFWF8xX0FSR0IgKi8KICAgTEUzMl9PVVQoICZ2Ylt2YmlkeCsrXSwgKHh4WzBdIDw8IDE2KSB8ICh5eVswXSAmIDB4ZmZmZikgKTsgLyogTUFDSDY0X1ZFUlRFWF8xX1hfWSAqLwoKICAgLyogc2V0dXAgZm9yIDMsNSwgb3IgNyBzZXF1ZW50aWFsIHJlZyB3cml0ZXMgYmFzZWQgb24gdmVydGV4IGZvcm1hdCAqLwogICBzd2l0Y2ggKHZlcnRzaXplKSB7CiAgIGNhc2UgNjoKICAgICAgTEUzMl9PVVQoICZ2Ylt2YmlkeCsrXSwgKDQgPDwgMTYpIHwgQURSSU5ERVgoTUFDSDY0X1ZFUlRFWF8yX1cpICk7CiAgICAgIGJyZWFrOwogICBjYXNlIDQ6CiAgICAgIExFMzJfT1VUKCAmdmJbdmJpZHgrK10sICgyIDw8IDE2KSB8IEFEUklOREVYKE1BQ0g2NF9WRVJURVhfMl9aKSApOwogICAgICBicmVhazsKICAgZGVmYXVsdDogLyogdmVydHNpemUgPj0gOCAqLwogICAgICBMRTMyX09VVCggJnZiW3ZiaWR4KytdLCAoNiA8PCAxNikgfCBBRFJJTkRFWChNQUNINjRfVkVSVEVYXzJfUykgKTsKICAgICAgYnJlYWs7CiAgIH0KICAgaWYgKHZlcnRzaXplID4gNikgewogICAgICBMRTMyX09VVCggJnZiW3ZiaWR4KytdLCB2MS0+dWlbNl0gKTsgLyogTUFDSDY0X1ZFUlRFWF8yX1MgKi8KICAgICAgTEUzMl9PVVQoICZ2Ylt2YmlkeCsrXSwgdjEtPnVpWzddICk7IC8qIE1BQ0g2NF9WRVJURVhfMl9UICovCiAgIH0KICAgaWYgKHZlcnRzaXplID4gNCkgewogICAgICBMRTMyX09VVCggJnZiW3ZiaWR4KytdLCB2MS0+dWlbM10gKTsgLyogTUFDSDY0X1ZFUlRFWF8yX1cgKi8KICAgICAgTEUzMl9PVVQoICZ2Ylt2YmlkeCsrXSwgdjEtPnVpWzVdICk7IC8qIE1BQ0g2NF9WRVJURVhfMl9TUEVDX0FSR0IgKi8KICAgfQogICBMRTMyX09VVCggJnZiW3ZiaWR4KytdLCAoKEdMaW50KSh2MS0+di56KSA8PCAxNSkgKTsgICAgICAgICAvKiBNQUNINjRfVkVSVEVYXzJfWiAqLwogICB2Ylt2YmlkeCsrXSA9IHYxLT51aVtjb2xvcmlkeF07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBNQUNINjRfVkVSVEVYXzJfQVJHQiAqLwogICBMRTMyX09VVCggJnZiW3ZiaWR4KytdLCAoeHhbMV0gPDwgMTYpIHwgKHl5WzFdICYgMHhmZmZmKSApOyAvKiBNQUNINjRfVkVSVEVYXzJfWF9ZICovCgogICAvKiBzZXR1cCBmb3IgMyw1LCBvciA3IHNlcXVlbnRpYWwgcmVnIHdyaXRlcyBiYXNlZCBvbiB2ZXJ0ZXggZm9ybWF0ICovCiAgIHN3aXRjaCAodmVydHNpemUpIHsKICAgY2FzZSA2OgogICAgICBMRTMyX09VVCggJnZiW3ZiaWR4KytdLCAoNCA8PCAxNikgfCBBRFJJTkRFWChNQUNINjRfVkVSVEVYXzNfVykgKTsKICAgICAgYnJlYWs7CiAgIGNhc2UgNDoKICAgICAgTEUzMl9PVVQoICZ2Ylt2YmlkeCsrXSwgKDIgPDwgMTYpIHwgQURSSU5ERVgoTUFDSDY0X1ZFUlRFWF8zX1opICk7CiAgICAgIGJyZWFrOwogICBkZWZhdWx0OiAvKiB2ZXJ0c2l6ZSA+PSA4ICovCiAgICAgIExFMzJfT1VUKCAmdmJbdmJpZHgrK10sICg2IDw8IDE2KSB8IEFEUklOREVYKE1BQ0g2NF9WRVJURVhfM19TKSApOwogICAgICBicmVhazsKICAgfQogICBpZiAodmVydHNpemUgPiA2KSB7CiAgICAgIExFMzJfT1VUKCAmdmJbdmJpZHgrK10sIHYwLT51aVs2XSApOyAvKiBNQUNINjRfVkVSVEVYXzNfUyAqLwogICAgICBMRTMyX09VVCggJnZiW3ZiaWR4KytdLCB2MC0+dWlbN10gKTsgLyogTUFDSDY0X1ZFUlRFWF8zX1QgKi8KICAgfQogICBpZiAodmVydHNpemUgPiA0KSB7CiAgICAgIExFMzJfT1VUKCAmdmJbdmJpZHgrK10sIHYwLT51aVszXSApOyAvKiBNQUNINjRfVkVSVEVYXzNfVyAqLwogICAgICBMRTMyX09VVCggJnZiW3ZiaWR4KytdLCB2MC0+dWlbNV0gKTsgLyogTUFDSDY0X1ZFUlRFWF8zX1NQRUNfQVJHQiAqLwogICB9CiAgIExFMzJfT1VUKCAmdmJbdmJpZHgrK10sICgoR0xpbnQpKHYwLT52LnopIDw8IDE1KSApOyAgICAgICAgIC8qIE1BQ0g2NF9WRVJURVhfM19aICovCiAgIHZiW3ZiaWR4KytdID0gdjAtPnVpW2NvbG9yaWR4XTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE1BQ0g2NF9WRVJURVhfM19BUkdCICovCiAgIExFMzJfT1VUKCAmdmJbdmJpZHgrK10sICh4eFsyXSA8PCAxNikgfCAoeXlbMl0gJiAweGZmZmYpICk7IC8qIE1BQ0g2NF9WRVJURVhfM19YX1kgKi8KCiAgIExFMzJfT1VUKCAmdmJbdmJpZHgrK10sIEFEUklOREVYKE1BQ0g2NF9PTkVfT1ZFUl9BUkVBX1VDKSApOwogICBMRTMyX09VVCggJnZiW3ZiaWR4KytdLCAqKEdMdWludCAqKSZvb2EgKTsKCiAgIHh4WzBdID0gKEdMaW50KSgoeDEgKyBpeCkgKiA0KTsKICAgeXlbMF0gPSAoR0xpbnQpKCh5MSArIGl5KSAqIDQpOwoKICAgb29hID0gMC4yNSAqIDAuMjUgKiAoKHh4WzBdIC0geHhbMl0pICogKHl5WzFdIC0geXlbMl0pIC0KCQkJKHl5WzBdIC0geXlbMl0pICogKHh4WzFdIC0geHhbMl0pKTsKICAgb29hID0gMS4wIC8gb29hOwoKICAgLyogc2V0dXAgZm9yIDMsNSwgb3IgNyBzZXF1ZW50aWFsIHJlZyB3cml0ZXMgYmFzZWQgb24gdmVydGV4IGZvcm1hdCAqLwogICBzd2l0Y2ggKHZlcnRzaXplKSB7CiAgIGNhc2UgNjoKICAgICAgTEUzMl9PVVQoICZ2Ylt2YmlkeCsrXSwgKDQgPDwgMTYpIHwgQURSSU5ERVgoTUFDSDY0X1ZFUlRFWF8xX1cpICk7CiAgICAgIGJyZWFrOwogICBjYXNlIDQ6CiAgICAgIExFMzJfT1VUKCAmdmJbdmJpZHgrK10sICgyIDw8IDE2KSB8IEFEUklOREVYKE1BQ0g2NF9WRVJURVhfMV9aKSApOwogICAgICBicmVhazsKICAgZGVmYXVsdDogLyogdmVydHNpemUgPj0gOCAqLwogICAgICBMRTMyX09VVCggJnZiW3ZiaWR4KytdLCAoNiA8PCAxNikgfCBBRFJJTkRFWChNQUNINjRfVkVSVEVYXzFfUykgKTsKICAgICAgYnJlYWs7CiAgIH0KICAgaWYgKHZlcnRzaXplID4gNikgewogICAgICBMRTMyX09VVCggJnZiW3ZiaWR4KytdLCB2MS0+dWlbNl0gKTsgLyogTUFDSDY0X1ZFUlRFWF8xX1MgKi8KICAgICAgTEUzMl9PVVQoICZ2Ylt2YmlkeCsrXSwgdjEtPnVpWzddICk7IC8qIE1BQ0g2NF9WRVJURVhfMV9UICovCiAgIH0KICAgaWYgKHZlcnRzaXplID4gNCkgewogICAgICBMRTMyX09VVCggJnZiW3ZiaWR4KytdLCB2MS0+dWlbM10gKTsgLyogTUFDSDY0X1ZFUlRFWF8xX1cgKi8KICAgICAgTEUzMl9PVVQoICZ2Ylt2YmlkeCsrXSwgdjEtPnVpWzVdICk7IC8qIE1BQ0g2NF9WRVJURVhfMV9TUEVDX0FSR0IgKi8KICAgfQogICBMRTMyX09VVCggJnZiW3ZiaWR4KytdLCAoKEdMaW50KSh2MS0+di56KSA8PCAxNSkgKTsgICAgICAgICAvKiBNQUNINjRfVkVSVEVYXzFfWiAqLwogICB2Ylt2YmlkeCsrXSA9IHYxLT51aVtjb2xvcmlkeF07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBNQUNINjRfVkVSVEVYXzFfQVJHQiAqLwogICBMRTMyX09VVCggJnZiW3ZiaWR4KytdLCAoeHhbMF0gPDwgMTYpIHwgKHl5WzBdICYgMHhmZmZmKSApOyAvKiBNQUNINjRfVkVSVEVYXzFfWF9ZICovCgogICBMRTMyX09VVCggJnZiW3ZiaWR4KytdLCBBRFJJTkRFWChNQUNINjRfT05FX09WRVJfQVJFQV9VQykgKTsKICAgTEUzMl9PVVQoICZ2Ylt2YmlkeCsrXSwgKihHTHVpbnQgKikmb29hICk7CgogICBhc3NlcnQodmJzaXogPT0gdmJpZHgpOwojZW5kaWYKfQoKc3RhdGljIElOTElORSB2b2lkIG1hY2g2NF9kcmF3X3BvaW50KCBtYWNoNjRDb250ZXh0UHRyIG1tZXNhLAoJCQkJICAgICAgbWFjaDY0VmVydGV4UHRyIHYwICkKewojaWYgTUFDSDY0X05BVElWRV9WVFhGTVQKICAgR0xjb250ZXh0ICpjdHggPSBtbWVzYS0+Z2xDdHg7CiAgIGNvbnN0IEdMdWludCB2ZXJ0c2l6ZSA9IG1tZXNhLT52ZXJ0ZXhfc2l6ZTsKICAgLyogMiBmcmFjdGlvbmFsIGJpdHMgZm9yIGhhcmR3YXJlOiAqLwogICBHTGludCBzeiA9IChHTGludCkgKDIuMCAqIENMQU1QKG1tZXNhLT5nbEN0eC0+UG9pbnQuU2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPkNvbnN0Lk1pblBvaW50U2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPkNvbnN0Lk1heFBvaW50U2l6ZSkpOwogICBHTGZsb2F0IG9vYTsKICAgR0x1aW50ICpweHk7CiAgIEdMdWludCB4eW9sZCwgeHk7CiAgIGNvbnN0IEdMdWludCB4eW9mZnNldCA9IDk7CiAgIEdMaW50IHgsIHk7CiAgIHVuc2lnbmVkIHZic2l6ID0gKHZlcnRzaXplICsgKHZlcnRzaXplID4gNyA/IDIgOiAxKSkgKiA0ICsgMjsKICAgQ0FSRDMyICp2YiwgKnZiY2hrOwoKICAgaWYgKCBNQUNINjRfREVCVUcgJiBERUJVR19WRVJCT1NFX1BSSU1TICkgewogICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOlxuIiwgX19GVU5DVElPTl9fKTsKICAgICAgZnByaW50ZihzdGRlcnIsIlZlcnRleCAxOlxuIik7CiAgICAgIG1hY2g2NF9wcmludF92ZXJ0ZXgoIGN0eCwgdjAgKTsKICAgfQogIAogICBpZiggIXN6ICkKICAgICAgc3ogPSAxOwkvKiByb3VuZCB0byB0aGUgbmVhcmVzdCBzdXBwb3J0ZWQgc2l6ZSAqLwogICAgICAKICAgcHh5ID0gJnYwLT51aVt4eW9mZnNldF07CiAgIHh5b2xkID0gKnB4eTsKICAgeHkgPSBMRTMyX0lOKCAmeHlvbGQgKTsKICAgeCA9IChHTHNob3J0KSggeHkgPj4gMTYgKTsKICAgeSA9IChHTHNob3J0KSggeHkgJiAweGZmZmYgKTsKICAgCiAgIG9vYSA9IDQuMCAvIChzeiAqIHN6KTsKICAgCiAgIHZiID0gKENBUkQzMiAqKW1hY2g2NEFsbG9jRG1hTG93KCBtbWVzYSwgdmJzaXogKiBzaXplb2YoQ0FSRDMyKSApOwogICB2YmNoayA9IHZiICsgdmJzaXo7CgogICBMRTMyX09VVCggcHh5LCAoKCB4IC0gc3ogKSA8PCAxNikgfCAoKCB5IC0gc3ogKSAmIDB4ZmZmZikgKTsKICAgQ09QWV9WRVJURVgoIHZiLCB2ZXJ0c2l6ZSwgdjAsIDEgKTsKICAgTEUzMl9PVVQoIHB4eSwgKCggeCArIHN6ICkgPDwgMTYpIHwgKCggeSAtIHN6ICkgJiAweGZmZmYpICk7CiAgIENPUFlfVkVSVEVYKCB2YiwgdmVydHNpemUsIHYwLCAyICk7CiAgIExFMzJfT1VUKCBweHksICgoIHggLSBzeiApIDw8IDE2KSB8ICgoIHkgKyBzeiApICYgMHhmZmZmKSApOwogICBDT1BZX1ZFUlRFWF9PT0EoIHZiLCB2ZXJ0c2l6ZSwgdjAsIDMgKTsKICAgTEUzMl9PVVQoIHZiKyssICooQ0FSRDMyICopJm9vYSApOwoKICAgb29hID0gLW9vYTsKICAgCiAgIExFMzJfT1VUKCBweHksICgoIHggKyBzeiApIDw8IDE2KSB8ICgoIHkgKyBzeiApICYgMHhmZmZmKSApOwogICBDT1BZX1ZFUlRFWF9PT0EoIHZiLCB2ZXJ0c2l6ZSwgdjAsIDEgKTsKICAgTEUzMl9PVVQoIHZiKyssICooQ0FSRDMyICopJm9vYSApOwoKICAgKnB4eSA9IHh5b2xkOwojZWxzZSAvKiAhTUFDSDY0X05BVElWRV9WVFhGTVQgKi8KICAgR0x1aW50IHZlcnRzaXplID0gbW1lc2EtPnZlcnRleF9zaXplOyAKICAgR0xpbnQgY29sb3JpZHg7CiAgIGZsb2F0IHN6ID0gMS4wOyAvKiBPbmx5IHN1cHBvcnQgMSBwaXggcG9pbnRzIG5vdyAqLwogICBHTGZsb2F0IG9vYTsKICAgR0xpbnQgeHhbM10sIHl5WzNdOyAvKiAyIGZyYWN0aW9uYWwgYml0cyBmb3IgaGFyZHdhcmUgKi8KICAgdW5zaWduZWQgdmJzaXogPSAKCSAoKAoJICAgIDEgKwoJICAgICh2ZXJ0c2l6ZSA+IDYgPyAyIDogMCkgKwoJICAgICh2ZXJ0c2l6ZSA+IDQgPyAyIDogMCkgKwoJICAgIDMgKwoJICAgIChtbWVzYS0+bXVsdGl0ZXggPyA0IDogMCkKCSApICogNCArIDQpOwogICBDQVJEMzIgKnZiOwogICB1bnNpZ25lZCB2YmlkeCA9IDA7CiAgIAogICBpZiAoIE1BQ0g2NF9ERUJVRyAmIERFQlVHX1ZFUkJPU0VfUFJJTVMgKSB7CiAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6XG4iLCBfX0ZVTkNUSU9OX18pOwogICAgICBmcHJpbnRmKHN0ZGVyciwiVmVydGV4IDE6IHg6ICUuMmYsIHk6ICUuMmYsIHo6ICUuMmYsIHc6ICVmXG4iLCAKCSAgICAgIHYwLT52LngsIHYwLT52LnksIHYwLT52LnosIHYwLT52LncpOwogICB9CgojaWYgTUFDSDY0X0NMSUVOVF9TVEFURV9FTUlUUwogICAvKiBFbmFibGUgZm9yIGludGVybGVhdmVkIGNsaWVudC1zaWRlIHN0YXRlIGVtaXRzICovCiAgIExPQ0tfSEFSRFdBUkUoIG1tZXNhICk7CiAgIGlmICggbW1lc2EtPmRpcnR5ICkgewogICAgICBtYWNoNjRFbWl0SHdTdGF0ZUxvY2tlZCggbW1lc2EgKTsKICAgfQogICBpZiAoIG1tZXNhLT5zYXJlYS0+ZGlydHkgKSB7CiAgICAgIG1hY2g2NFVwbG9hZEh3U3RhdGVMb2NrZWQoIG1tZXNhICk7CiAgIH0KICAgVU5MT0NLX0hBUkRXQVJFKCBtbWVzYSApOwojZW5kaWYKCiAgIHh4WzBdID0gKEdMaW50KSgodjAtPnYueCAtIHN6KSAqIDQpOwogICB5eVswXSA9IChHTGludCkoKHYwLT52LnkgLSBzeikgKiA0KTsKCiAgIHh4WzFdID0gKEdMaW50KSgodjAtPnYueCArIHN6KSAqIDQpOwogICB5eVsxXSA9IChHTGludCkoKHYwLT52LnkgLSBzeikgKiA0KTsKCiAgIHh4WzJdID0gKEdMaW50KSgodjAtPnYueCAtIHN6KSAqIDQpOwogICB5eVsyXSA9IChHTGludCkoKHYwLT52LnkgKyBzeikgKiA0KTsKCiAgIG9vYSA9IDAuMjUgKiAwLjI1ICogKCh4eFswXSAtIHh4WzJdKSAqICh5eVsxXSAtIHl5WzJdKSAtCgkJCSh5eVswXSAtIHl5WzJdKSAqICh4eFsxXSAtIHh4WzJdKSk7CgogICBpZiAoIG9vYSAqIG1tZXNhLT5iYWNrZmFjZV9zaWduIDwgMCApIHsKICAgICAgLyogY3VsbCBxdWFkICovCiAgICAgIGlmICggTUFDSDY0X0RFQlVHICYgREVCVUdfVkVSQk9TRV9QUklNUyApCgkgZnByaW50ZihzdGRlcnIsIlBvaW50IGN1bGxlZFxuIik7CiAgICAgIHJldHVybjsKICAgfQoKICAgdmIgPSAoQ0FSRDMyICopbWFjaDY0QWxsb2NEbWFMb3coIG1tZXNhLCB2YnNpeiAqIDQgKTsKICAgCiAgIG9vYSA9IDEuMCAvIG9vYTsKCiAgIGNvbG9yaWR4ID0gKHZlcnRzaXplID4gNCkgPyA0OiAzOwoKICAgLyogc2V0dXAgZm9yIDMsNSwgb3IgNyBzZXF1ZW50aWFsIHJlZyB3cml0ZXMgYmFzZWQgb24gdmVydGV4IGZvcm1hdCAqLwogICBzd2l0Y2ggKHZlcnRzaXplKSB7CiAgIGNhc2UgNjoKICAgICAgTEUzMl9PVVQoICZ2Ylt2YmlkeCsrXSwgKDQgPDwgMTYpIHwgQURSSU5ERVgoTUFDSDY0X1ZFUlRFWF8xX1cpICk7CiAgICAgIGJyZWFrOwogICBjYXNlIDQ6CiAgICAgIExFMzJfT1VUKCAmdmJbdmJpZHgrK10sICgyIDw8IDE2KSB8IEFEUklOREVYKE1BQ0g2NF9WRVJURVhfMV9aKSApOwogICAgICBicmVhazsKICAgZGVmYXVsdDogLyogdmVydHNpemUgPj0gOCAqLwogICAgICBMRTMyX09VVCggJnZiW3ZiaWR4KytdLCAoNiA8PCAxNikgfCBBRFJJTkRFWChNQUNINjRfVkVSVEVYXzFfUykgKTsKICAgICAgYnJlYWs7CiAgIH0KICAgaWYgKHZlcnRzaXplID4gNikgewogICAgICBMRTMyX09VVCggJnZiW3ZiaWR4KytdLCB2MC0+dWlbNl0gKTsgLyogTUFDSDY0X1ZFUlRFWF8xX1MgKi8KICAgICAgTEUzMl9PVVQoICZ2Ylt2YmlkeCsrXSwgdjAtPnVpWzddICk7IC8qIE1BQ0g2NF9WRVJURVhfMV9UICovCiAgIH0KICAgaWYgKHZlcnRzaXplID4gNCkgewogICAgICBMRTMyX09VVCggJnZiW3ZiaWR4KytdLCB2MC0+dWlbM10gKTsgLyogTUFDSDY0X1ZFUlRFWF8xX1cgKi8KICAgICAgTEUzMl9PVVQoICZ2Ylt2YmlkeCsrXSwgdjAtPnVpWzVdICk7IC8qIE1BQ0g2NF9WRVJURVhfMV9TUEVDX0FSR0IgKi8KICAgfQogICBMRTMyX09VVCggJnZiW3ZiaWR4KytdLCAoKEdMaW50KSh2MC0+di56KSA8PCAxNSkgKTsgICAgICAgICAvKiBNQUNINjRfVkVSVEVYXzFfWiAqLwogICB2Ylt2YmlkeCsrXSA9IHYwLT51aVtjb2xvcmlkeF07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBNQUNINjRfVkVSVEVYXzFfQVJHQiAqLwogICBMRTMyX09VVCggJnZiW3ZiaWR4KytdLCAoeHhbMF0gPDwgMTYpIHwgKHl5WzBdICYgMHhmZmZmKSApOyAvKiBNQUNINjRfVkVSVEVYXzFfWF9ZICovCgogICAvKiBzZXR1cCBmb3IgMyw1LCBvciA3IHNlcXVlbnRpYWwgcmVnIHdyaXRlcyBiYXNlZCBvbiB2ZXJ0ZXggZm9ybWF0ICovCiAgIHN3aXRjaCAodmVydHNpemUpIHsKICAgY2FzZSA2OgogICAgICBMRTMyX09VVCggJnZiW3ZiaWR4KytdLCAoNCA8PCAxNikgfCBBRFJJTkRFWChNQUNINjRfVkVSVEVYXzJfVykgKTsKICAgICAgYnJlYWs7CiAgIGNhc2UgNDoKICAgICAgTEUzMl9PVVQoICZ2Ylt2YmlkeCsrXSwgKDIgPDwgMTYpIHwgQURSSU5ERVgoTUFDSDY0X1ZFUlRFWF8yX1opICk7CiAgICAgIGJyZWFrOwogICBkZWZhdWx0OiAvKiB2ZXJ0c2l6ZSA+PSA4ICovCiAgICAgIExFMzJfT1VUKCAmdmJbdmJpZHgrK10sICg2IDw8IDE2KSB8IEFEUklOREVYKE1BQ0g2NF9WRVJURVhfMl9TKSApOwogICAgICBicmVhazsKICAgfQogICBpZiAodmVydHNpemUgPiA2KSB7CiAgICAgIExFMzJfT1VUKCAmdmJbdmJpZHgrK10sIHYwLT51aVs2XSApOyAvKiBNQUNINjRfVkVSVEVYXzJfUyAqLwogICAgICBMRTMyX09VVCggJnZiW3ZiaWR4KytdLCB2MC0+dWlbN10gKTsgLyogTUFDSDY0X1ZFUlRFWF8yX1QgKi8KICAgfQogICBpZiAodmVydHNpemUgPiA0KSB7CiAgICAgIExFMzJfT1VUKCAmdmJbdmJpZHgrK10sIHYwLT51aVszXSApOyAvKiBNQUNINjRfVkVSVEVYXzJfVyAqLwogICAgICBMRTMyX09VVCggJnZiW3ZiaWR4KytdLCB2MC0+dWlbNV0gKTsgLyogTUFDSDY0X1ZFUlRFWF8yX1NQRUNfQVJHQiAqLwogICB9CiAgIExFMzJfT1VUKCAmdmJbdmJpZHgrK10sICgoR0xpbnQpKHYwLT52LnopIDw8IDE1KSApOyAgICAgICAgIC8qIE1BQ0g2NF9WRVJURVhfMl9aICovCiAgIHZiW3ZiaWR4KytdID0gdjAtPnVpW2NvbG9yaWR4XTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE1BQ0g2NF9WRVJURVhfMl9BUkdCICovCiAgIExFMzJfT1VUKCAmdmJbdmJpZHgrK10sICh4eFsxXSA8PCAxNikgfCAoeXlbMV0gJiAweGZmZmYpICk7IC8qIE1BQ0g2NF9WRVJURVhfMl9YX1kgKi8KCiAgIC8qIHNldHVwIGZvciAzLDUsIG9yIDcgc2VxdWVudGlhbCByZWcgd3JpdGVzIGJhc2VkIG9uIHZlcnRleCBmb3JtYXQgKi8KICAgc3dpdGNoICh2ZXJ0c2l6ZSkgewogICBjYXNlIDY6CiAgICAgIExFMzJfT1VUKCAmdmJbdmJpZHgrK10sICg0IDw8IDE2KSB8IEFEUklOREVYKE1BQ0g2NF9WRVJURVhfM19XKSApOwogICAgICBicmVhazsKICAgY2FzZSA0OgogICAgICBMRTMyX09VVCggJnZiW3ZiaWR4KytdLCAoMiA8PCAxNikgfCBBRFJJTkRFWChNQUNINjRfVkVSVEVYXzNfWikgKTsKICAgICAgYnJlYWs7CiAgIGRlZmF1bHQ6IC8qIHZlcnRzaXplID49IDggKi8KICAgICAgTEUzMl9PVVQoICZ2Ylt2YmlkeCsrXSwgKDYgPDwgMTYpIHwgQURSSU5ERVgoTUFDSDY0X1ZFUlRFWF8zX1MpICk7CiAgICAgIGJyZWFrOwogICB9CiAgIGlmICh2ZXJ0c2l6ZSA+IDYpIHsKICAgICAgTEUzMl9PVVQoICZ2Ylt2YmlkeCsrXSwgdjAtPnVpWzZdICk7IC8qIE1BQ0g2NF9WRVJURVhfM19TICovCiAgICAgIExFMzJfT1VUKCAmdmJbdmJpZHgrK10sIHYwLT51aVs3XSApOyAvKiBNQUNINjRfVkVSVEVYXzNfVCAqLwogICB9CiAgIGlmICh2ZXJ0c2l6ZSA+IDQpIHsKICAgICAgTEUzMl9PVVQoICZ2Ylt2YmlkeCsrXSwgdjAtPnVpWzNdICk7IC8qIE1BQ0g2NF9WRVJURVhfM19XICovCiAgICAgIExFMzJfT1VUKCAmdmJbdmJpZHgrK10sIHYwLT51aVs1XSApOyAvKiBNQUNINjRfVkVSVEVYXzNfU1BFQ19BUkdCICovCiAgIH0KICAgTEUzMl9PVVQoICZ2Ylt2YmlkeCsrXSwgKChHTGludCkodjAtPnYueikgPDwgMTUpICk7ICAgICAgICAgLyogTUFDSDY0X1ZFUlRFWF8zX1ogKi8KICAgdmJbdmJpZHgrK10gPSB2MC0+dWlbY29sb3JpZHhdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTUFDSDY0X1ZFUlRFWF8zX0FSR0IgKi8KICAgTEUzMl9PVVQoICZ2Ylt2YmlkeCsrXSwgKHh4WzJdIDw8IDE2KSB8ICh5eVsyXSAmIDB4ZmZmZikgKTsgLyogTUFDSDY0X1ZFUlRFWF8zX1hfWSAqLwoKICAgTEUzMl9PVVQoICZ2Ylt2YmlkeCsrXSwgQURSSU5ERVgoTUFDSDY0X09ORV9PVkVSX0FSRUFfVUMpICk7CiAgIExFMzJfT1VUKCAmdmJbdmJpZHgrK10sICooR0x1aW50ICopJm9vYSApOwoKICAgeHhbMF0gPSAoR0xpbnQpKCh2MC0+di54ICsgc3opICogNCk7CiAgIHl5WzBdID0gKEdMaW50KSgodjAtPnYueSArIHN6KSAqIDQpOwoKICAgb29hID0gMC4yNSAqIDAuMjUgKiAoKHh4WzBdIC0geHhbMl0pICogKHl5WzFdIC0geXlbMl0pIC0KCQkJKHl5WzBdIC0geXlbMl0pICogKHh4WzFdIC0geHhbMl0pKTsKICAgb29hID0gMS4wIC8gb29hOwoKICAgLyogc2V0dXAgZm9yIDMsNSwgb3IgNyBzZXF1ZW50aWFsIHJlZyB3cml0ZXMgYmFzZWQgb24gdmVydGV4IGZvcm1hdCAqLwogICBzd2l0Y2ggKHZlcnRzaXplKSB7CiAgIGNhc2UgNjoKICAgICAgTEUzMl9PVVQoICZ2Ylt2YmlkeCsrXSwgKDQgPDwgMTYpIHwgQURSSU5ERVgoTUFDSDY0X1ZFUlRFWF8xX1cpICk7CiAgICAgIGJyZWFrOwogICBjYXNlIDQ6CiAgICAgIExFMzJfT1VUKCAmdmJbdmJpZHgrK10sICgyIDw8IDE2KSB8IEFEUklOREVYKE1BQ0g2NF9WRVJURVhfMV9aKSApOwogICAgICBicmVhazsKICAgZGVmYXVsdDogLyogdmVydHNpemUgPj0gOCAqLwogICAgICBMRTMyX09VVCggJnZiW3ZiaWR4KytdLCAoNiA8PCAxNikgfCBBRFJJTkRFWChNQUNINjRfVkVSVEVYXzFfUykgKTsKICAgICAgYnJlYWs7CiAgIH0KICAgaWYgKHZlcnRzaXplID4gNikgewogICAgICBMRTMyX09VVCggJnZiW3ZiaWR4KytdLCB2MC0+dWlbNl0gKTsgLyogTUFDSDY0X1ZFUlRFWF8xX1MgKi8KICAgICAgTEUzMl9PVVQoICZ2Ylt2YmlkeCsrXSwgdjAtPnVpWzddICk7IC8qIE1BQ0g2NF9WRVJURVhfMV9UICovCiAgIH0KICAgaWYgKHZlcnRzaXplID4gNCkgewogICAgICBMRTMyX09VVCggJnZiW3ZiaWR4KytdLCB2MC0+dWlbM10gKTsgLyogTUFDSDY0X1ZFUlRFWF8xX1cgKi8KICAgICAgTEUzMl9PVVQoICZ2Ylt2YmlkeCsrXSwgdjAtPnVpWzVdICk7IC8qIE1BQ0g2NF9WRVJURVhfMV9TUEVDX0FSR0IgKi8KICAgfQogICBMRTMyX09VVCggJnZiW3ZiaWR4KytdLCAoKEdMaW50KSh2MC0+di56KSA8PCAxNSkgKTsgICAgICAgICAvKiBNQUNINjRfVkVSVEVYXzFfWiAqLwogICB2Ylt2YmlkeCsrXSA9IHYwLT51aVtjb2xvcmlkeF07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBNQUNINjRfVkVSVEVYXzFfQVJHQiAqLwogICBMRTMyX09VVCggJnZiW3ZiaWR4KytdLCAoeHhbMF0gPDwgMTYpIHwgKHl5WzBdICYgMHhmZmZmKSApOyAvKiBNQUNINjRfVkVSVEVYXzFfWF9ZICovCgogICBMRTMyX09VVCggJnZiW3ZiaWR4KytdLCBBRFJJTkRFWChNQUNINjRfT05FX09WRVJfQVJFQV9VQykgKTsKICAgTEUzMl9PVVQoICZ2Ylt2YmlkeCsrXSwgKihHTHVpbnQgKikmb29hICk7CgogICBhc3NlcnQodmJzaXogPT0gdmJpZHgpOwojZW5kaWYKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgIE1hY3JvcyBmb3IgdF9kZF90cml0bXAuaCB0byBkcmF3IGJhc2ljIHByaW1pdGl2ZXMgICAgICAgICAgKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgojZGVmaW5lIFRSSSggYSwgYiwgYyApCQkJCVwKZG8gewkJCQkJCVwKICAgaWYgKERPX0ZBTExCQUNLKQkJCQlcCiAgICAgIG1tZXNhLT5kcmF3X3RyaSggbW1lc2EsIGEsIGIsIGMgKTsJXAogICBlbHNlCQkJCQkJXAogICAgICBtYWNoNjRfZHJhd190cmlhbmdsZSggbW1lc2EsIGEsIGIsIGMgKTsJXAp9IHdoaWxlICgwKQoKI2RlZmluZSBRVUFEKCBhLCBiLCBjLCBkICkJCQlcCmRvIHsJCQkJCQlcCiAgIGlmIChET19GQUxMQkFDSykgewkJCQlcCiAgICAgIG1tZXNhLT5kcmF3X3RyaSggbW1lc2EsIGEsIGIsIGQgKTsJXAogICAgICBtbWVzYS0+ZHJhd190cmkoIG1tZXNhLCBiLCBjLCBkICk7CVwKICAgfSBlbHNlIAkJCQkJXAogICAgICBtYWNoNjRfZHJhd19xdWFkKCBtbWVzYSwgYSwgYiwgYywgZCApOwlcCn0gd2hpbGUgKDApCgojZGVmaW5lIExJTkUoIHYwLCB2MSApCQkJCVwKZG8gewkJCQkJCVwKICAgaWYgKERPX0ZBTExCQUNLKQkJCQlcCiAgICAgIG1tZXNhLT5kcmF3X2xpbmUoIG1tZXNhLCB2MCwgdjEgKTsJXAogICBlbHNlIAkJCQkJXAogICAgICBtYWNoNjRfZHJhd19saW5lKCBtbWVzYSwgdjAsIHYxICk7CVwKfSB3aGlsZSAoMCkKCiNkZWZpbmUgUE9JTlQoIHYwICkJCQkJXApkbyB7CQkJCQkJXAogICBpZiAoRE9fRkFMTEJBQ0spCQkJCVwKICAgICAgbW1lc2EtPmRyYXdfcG9pbnQoIG1tZXNhLCB2MCApOwkJXAogICBlbHNlIAkJCQkJXAogICAgICBtYWNoNjRfZHJhd19wb2ludCggbW1lc2EsIHYwICk7CQlcCn0gd2hpbGUgKDApCgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICAgICBCdWlsZCByZW5kZXIgZnVuY3Rpb25zIGZyb20gZGQgdGVtcGxhdGVzICAgICAgICAgICAgICAgKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgojZGVmaW5lIE1BQ0g2NF9PRkZTRVRfQklUCTB4MDEKI2RlZmluZSBNQUNINjRfVFdPU0lERV9CSVQJMHgwMgojZGVmaW5lIE1BQ0g2NF9VTkZJTExFRF9CSVQJMHgwNAojZGVmaW5lIE1BQ0g2NF9GQUxMQkFDS19CSVQJMHgwOAojZGVmaW5lIE1BQ0g2NF9NQVhfVFJJRlVOQwkweDEwCgpzdGF0aWMgc3RydWN0IHsKICAgdG5sX3BvaW50c19mdW5jCSAgICAgICAgcG9pbnRzOwogICB0bmxfbGluZV9mdW5jCQlsaW5lOwogICB0bmxfdHJpYW5nbGVfZnVuYwl0cmlhbmdsZTsKICAgdG5sX3F1YWRfZnVuYwkJcXVhZDsKfSByYXN0X3RhYltNQUNINjRfTUFYX1RSSUZVTkNdOwoKCiNkZWZpbmUgRE9fRkFMTEJBQ0sgKElORCAmIE1BQ0g2NF9GQUxMQkFDS19CSVQpCiNkZWZpbmUgRE9fT0ZGU0VUICAgKElORCAmIE1BQ0g2NF9PRkZTRVRfQklUKQojZGVmaW5lIERPX1VORklMTEVEIChJTkQgJiBNQUNINjRfVU5GSUxMRURfQklUKQojZGVmaW5lIERPX1RXT1NJREUgIChJTkQgJiBNQUNINjRfVFdPU0lERV9CSVQpCiNkZWZpbmUgRE9fRkxBVCAgICAgIDAKI2RlZmluZSBET19UUkkgICAgICAgMQojZGVmaW5lIERPX1FVQUQgICAgICAxCiNkZWZpbmUgRE9fTElORSAgICAgIDEKI2RlZmluZSBET19QT0lOVFMgICAgMQojZGVmaW5lIERPX0ZVTExfUVVBRCAxCgojZGVmaW5lIEhBVkVfUkdCQSAgIDEKI2RlZmluZSBIQVZFX1NQRUMgICAxCiNkZWZpbmUgSEFWRV9CQUNLX0NPTE9SUyAgMAojZGVmaW5lIEhBVkVfSFdfRkxBVFNIQURFIDEKI2RlZmluZSBWRVJURVggbWFjaDY0VmVydGV4CiNkZWZpbmUgVEFCIHJhc3RfdGFiCgojaWYgTUFDSDY0X05BVElWRV9WVFhGTVQKCi8qICNkZWZpbmUgREVQVEhfU0NBTEUgNjU1MzYuMCAqLwojZGVmaW5lIERFUFRIX1NDQUxFIDEKI2RlZmluZSBVTkZJTExFRF9UUkkgdW5maWxsZWRfdHJpCiNkZWZpbmUgVU5GSUxMRURfUVVBRCB1bmZpbGxlZF9xdWFkCiNkZWZpbmUgVkVSVF9YKF92KSAoKEdMZmxvYXQpKEdMc2hvcnQpKExFMzJfSU4oICYoX3YpLT51aVt4eW9mZnNldF0gKSAmIDB4ZmZmZikgLyA0LjApCiNkZWZpbmUgVkVSVF9ZKF92KSAoKEdMZmxvYXQpKEdMc2hvcnQpKExFMzJfSU4oICYoX3YpLT51aVt4eW9mZnNldF0gKSA+PiAxNikgLyA0LjApCiNkZWZpbmUgVkVSVF9aKF92KSAoKEdMZmxvYXQpIExFMzJfSU4oICYoX3YpLT51aVt6b2Zmc2V0XSApKQojZGVmaW5lIElOU0FORV9WRVJUSUNFUwojZGVmaW5lIFZFUlRfU0VUX1ooX3YsdmFsKSBMRTMyX09VVCggJihfdiktPnVpW3pvZmZzZXRdLCAoR0x1aW50KSh2YWwpICkKI2RlZmluZSBWRVJUX1pfQUREKF92LHZhbCkgTEUzMl9PVVQoICYoX3YpLT51aVt6b2Zmc2V0XSwgTEUzMl9JTiggJihfdiktPnVpW3pvZmZzZXRdICkgKyAoR0x1aW50KSh2YWwpICkKI2RlZmluZSBBUkVBX0lTX0NDVyggYSApICgoYSkgPCAwKQojZGVmaW5lIEdFVF9WRVJURVgoZSkgKG1tZXNhLT52ZXJ0cyArICgoZSkgKiBtbWVzYS0+dmVydGV4X3NpemUgKiBzaXplb2YoaW50KSkpCgojZGVmaW5lIE1BQ0g2NF9DT0xPUiggZHN0LCBzcmMgKSAgICAgICAgICAgICAgICBcCmRvIHsJCQkJCQlcCiAgIFVOQ0xBTVBFRF9GTE9BVF9UT19VQllURShkc3RbMF0sIHNyY1syXSk7CVwKICAgVU5DTEFNUEVEX0ZMT0FUX1RPX1VCWVRFKGRzdFsxXSwgc3JjWzFdKTsJCQkJXAogICBVTkNMQU1QRURfRkxPQVRfVE9fVUJZVEUoZHN0WzJdLCBzcmNbMF0pOwkJCQlcCiAgIFVOQ0xBTVBFRF9GTE9BVF9UT19VQllURShkc3RbM10sIHNyY1szXSk7CQkJCVwKfSB3aGlsZSAoMCkKCiNkZWZpbmUgTUFDSDY0X1NQRUMoIGRzdCwgc3JjICkJCQlcCmRvIHsJCQkJCQlcCiAgIFVOQ0xBTVBFRF9GTE9BVF9UT19VQllURShkc3RbMF0sIHNyY1syXSk7CVwKICAgVU5DTEFNUEVEX0ZMT0FUX1RPX1VCWVRFKGRzdFsxXSwgc3JjWzFdKTsJXAogICBVTkNMQU1QRURfRkxPQVRfVE9fVUJZVEUoZHN0WzJdLCBzcmNbMF0pOwlcCn0gd2hpbGUgKDApCgojZGVmaW5lIFZFUlRfU0VUX1JHQkEoIHYsIGMgKSAgICBNQUNINjRfQ09MT1IoIHYtPnViNFtjb2xvcm9mZnNldF0sIGMgKQojZGVmaW5lIFZFUlRfQ09QWV9SR0JBKCB2MCwgdjEgKSB2MC0+dWlbY29sb3JvZmZzZXRdID0gdjEtPnVpW2NvbG9yb2Zmc2V0XQojZGVmaW5lIFZFUlRfU0FWRV9SR0JBKCBpZHggKSAgICBjb2xvcltpZHhdID0gdltpZHhdLT51aVtjb2xvcm9mZnNldF0KI2RlZmluZSBWRVJUX1JFU1RPUkVfUkdCQSggaWR4ICkgdltpZHhdLT51aVtjb2xvcm9mZnNldF0gPSBjb2xvcltpZHhdCgojZGVmaW5lIFZFUlRfU0VUX1NQRUMoIHYsIGMgKSAgICBpZiAoaGF2ZXNwZWMpIE1BQ0g2NF9TUEVDKCB2LT51YjRbc3BlY29mZnNldF0sIGMgKQojZGVmaW5lIFZFUlRfQ09QWV9TUEVDKCB2MCwgdjEgKSBpZiAoaGF2ZXNwZWMpIENPUFlfM1YoIHYwLT51YjRbc3BlY29mZnNldF0sIHYxLT51YjRbc3BlY29mZnNldF0gKQojZGVmaW5lIFZFUlRfU0FWRV9TUEVDKCBpZHggKSAgICBpZiAoaGF2ZXNwZWMpIHNwZWNbaWR4XSA9IHZbaWR4XS0+dWlbc3BlY29mZnNldF0KI2RlZmluZSBWRVJUX1JFU1RPUkVfU1BFQyggaWR4ICkgaWYgKGhhdmVzcGVjKSB2W2lkeF0tPnVpW3NwZWNvZmZzZXRdID0gc3BlY1tpZHhdCgojZGVmaW5lIExPQ0FMX1ZBUlMobikJCQkJCQlcCiAgIG1hY2g2NENvbnRleHRQdHIgbW1lc2EgPSBNQUNINjRfQ09OVEVYVChjdHgpOwkJXAogICBHTHVpbnQgY29sb3Jbbl0sIHNwZWNbbl07CQkJCQlcCiAgIEdMdWludCB2ZXJ0ZXhfc2l6ZSA9IG1tZXNhLT52ZXJ0ZXhfc2l6ZTsJCQlcCiAgIGNvbnN0IEdMdWludCB4eW9mZnNldCA9IDk7CQkJCQlcCiAgIGNvbnN0IEdMdWludCBjb2xvcm9mZnNldCA9IDg7CQkJCVwKICAgY29uc3QgR0x1aW50IHpvZmZzZXQgPSA3OwkJCQkJXAogICBjb25zdCBHTHVpbnQgc3BlY29mZnNldCA9IDY7CQkJCQlcCiAgIEdMYm9vbGVhbiBoYXZlc3BlYyA9IHZlcnRleF9zaXplID49IDQgPyAxIDogMDsJCVwKICAgKHZvaWQpIGNvbG9yOyAodm9pZCkgc3BlYzsgKHZvaWQpIHZlcnRleF9zaXplOyAJCVwKICAgKHZvaWQpIHh5b2Zmc2V0OyAodm9pZCkgY29sb3JvZmZzZXQ7ICh2b2lkKSB6b2Zmc2V0OwkJXAogICAodm9pZCkgc3BlY29mZnNldDsgKHZvaWQpIGhhdmVzcGVjOwoKI2Vsc2UKCiNkZWZpbmUgREVQVEhfU0NBTEUgMS4wCiNkZWZpbmUgVU5GSUxMRURfVFJJIHVuZmlsbGVkX3RyaQojZGVmaW5lIFVORklMTEVEX1FVQUQgdW5maWxsZWRfcXVhZAojZGVmaW5lIFZFUlRfWChfdikgX3YtPnYueAojZGVmaW5lIFZFUlRfWShfdikgX3YtPnYueQojZGVmaW5lIFZFUlRfWihfdikgX3YtPnYuegojZGVmaW5lIEFSRUFfSVNfQ0NXKCBhICkgKGEgPiAwKQojZGVmaW5lIEdFVF9WRVJURVgoZSkgKG1tZXNhLT52ZXJ0cyArICgoZSkgKiBtbWVzYS0+dmVydGV4X3NpemUgKiBzaXplb2YoaW50KSkpCgojZGVmaW5lIE1BQ0g2NF9DT0xPUiggZHN0LCBzcmMgKSAgICAgICAgICAgICAgICBcCmRvIHsJCQkJCQlcCiAgIFVOQ0xBTVBFRF9GTE9BVF9UT19VQllURShkc3RbMF0sIHNyY1syXSk7CVwKICAgVU5DTEFNUEVEX0ZMT0FUX1RPX1VCWVRFKGRzdFsxXSwgc3JjWzFdKTsJCQkJXAogICBVTkNMQU1QRURfRkxPQVRfVE9fVUJZVEUoZHN0WzJdLCBzcmNbMF0pOwkJCQlcCiAgIFVOQ0xBTVBFRF9GTE9BVF9UT19VQllURShkc3RbM10sIHNyY1szXSk7CQkJCVwKfSB3aGlsZSAoMCkKCiNkZWZpbmUgTUFDSDY0X1NQRUMoIGRzdCwgc3JjICkJCQlcCmRvIHsJCQkJCQlcCiAgIFVOQ0xBTVBFRF9GTE9BVF9UT19VQllURShkc3RbMF0sIHNyY1syXSk7CVwKICAgVU5DTEFNUEVEX0ZMT0FUX1RPX1VCWVRFKGRzdFsxXSwgc3JjWzFdKTsJXAogICBVTkNMQU1QRURfRkxPQVRfVE9fVUJZVEUoZHN0WzJdLCBzcmNbMF0pOwlcCn0gd2hpbGUgKDApCgojZGVmaW5lIFZFUlRfU0VUX1JHQkEoIHYsIGMgKSAgICBNQUNINjRfQ09MT1IoIHYtPnViNFtjb2xvcm9mZnNldF0sIGMgKQojZGVmaW5lIFZFUlRfQ09QWV9SR0JBKCB2MCwgdjEgKSB2MC0+dWlbY29sb3JvZmZzZXRdID0gdjEtPnVpW2NvbG9yb2Zmc2V0XQojZGVmaW5lIFZFUlRfU0FWRV9SR0JBKCBpZHggKSAgICBjb2xvcltpZHhdID0gdltpZHhdLT51aVtjb2xvcm9mZnNldF0KI2RlZmluZSBWRVJUX1JFU1RPUkVfUkdCQSggaWR4ICkgdltpZHhdLT51aVtjb2xvcm9mZnNldF0gPSBjb2xvcltpZHhdCgojZGVmaW5lIFZFUlRfU0VUX1NQRUMoIHYsIGMgKSAgICBpZiAoaGF2ZXNwZWMpIE1BQ0g2NF9TUEVDKCB2LT51YjRbNV0sIGMgKQojZGVmaW5lIFZFUlRfQ09QWV9TUEVDKCB2MCwgdjEgKSBpZiAoaGF2ZXNwZWMpIENPUFlfM1YodjAtPnViNFs1XSwgdjEtPnViNFs1XSkKI2RlZmluZSBWRVJUX1NBVkVfU1BFQyggaWR4ICkgICAgaWYgKGhhdmVzcGVjKSBzcGVjW2lkeF0gPSB2W2lkeF0tPnVpWzVdCiNkZWZpbmUgVkVSVF9SRVNUT1JFX1NQRUMoIGlkeCApIGlmIChoYXZlc3BlYykgdltpZHhdLT51aVs1XSA9IHNwZWNbaWR4XQoKI2RlZmluZSBMT0NBTF9WQVJTKG4pCQkJCQkJXAogICBtYWNoNjRDb250ZXh0UHRyIG1tZXNhID0gTUFDSDY0X0NPTlRFWFQoY3R4KTsJCVwKICAgR0x1aW50IGNvbG9yW25dLCBzcGVjW25dOwkJCQkJXAogICBHTHVpbnQgY29sb3JvZmZzZXQgPSAobW1lc2EtPnZlcnRleF9zaXplID09IDQgPyAzIDogNCk7CVwKICAgR0xib29sZWFuIGhhdmVzcGVjID0gKG1tZXNhLT52ZXJ0ZXhfc2l6ZSA9PSA0ID8gMCA6IDEpOwlcCiAgICh2b2lkKSBjb2xvcjsgKHZvaWQpIHNwZWM7ICh2b2lkKSBjb2xvcm9mZnNldDsgKHZvaWQpIGhhdmVzcGVjOwoKI2VuZGlmCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgICAgICAgSGVscGVycyBmb3IgcmVuZGVyaW5nIHVuZmlsbGVkIHByaW1pdGl2ZXMgICAgICAgICAgICAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCiNkZWZpbmUgUkFTVEVSSVpFKHgpIGlmIChtbWVzYS0+aHdfcHJpbWl0aXZlICE9IGh3X3ByaW1beF0pIFwKICAgICAgICAgICAgICAgICAgICAgICAgbWFjaDY0UmFzdGVyUHJpbWl0aXZlKCBjdHgsIGh3X3ByaW1beF0gKQojZGVmaW5lIFJFTkRFUl9QUklNSVRJVkUgbW1lc2EtPnJlbmRlcl9wcmltaXRpdmUKI2RlZmluZSBJTkQgTUFDSDY0X0ZBTExCQUNLX0JJVAojZGVmaW5lIFRBRyh4KSB4CiNpbmNsdWRlICJ0bmxfZGQvdF9kZF91bmZpbGxlZC5oIgojdW5kZWYgSU5ECgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICAgICAgICAgICAgIEdlbmVyYXRlIEdMIHJlbmRlciBmdW5jdGlvbnMgICAgICAgICAgICAgICAgICAgKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgoKI2RlZmluZSBJTkQgKDApCiNkZWZpbmUgVEFHKHgpIHgKI2luY2x1ZGUgInRubF9kZC90X2RkX3RyaXRtcC5oIgoKI2RlZmluZSBJTkQgKE1BQ0g2NF9PRkZTRVRfQklUKQojZGVmaW5lIFRBRyh4KSB4IyNfb2Zmc2V0CiNpbmNsdWRlICJ0bmxfZGQvdF9kZF90cml0bXAuaCIKCiNkZWZpbmUgSU5EIChNQUNINjRfVFdPU0lERV9CSVQpCiNkZWZpbmUgVEFHKHgpIHgjI190d29zaWRlCiNpbmNsdWRlICJ0bmxfZGQvdF9kZF90cml0bXAuaCIKCiNkZWZpbmUgSU5EIChNQUNINjRfVFdPU0lERV9CSVR8TUFDSDY0X09GRlNFVF9CSVQpCiNkZWZpbmUgVEFHKHgpIHgjI190d29zaWRlX29mZnNldAojaW5jbHVkZSAidG5sX2RkL3RfZGRfdHJpdG1wLmgiCgojZGVmaW5lIElORCAoTUFDSDY0X1VORklMTEVEX0JJVCkKI2RlZmluZSBUQUcoeCkgeCMjX3VuZmlsbGVkCiNpbmNsdWRlICJ0bmxfZGQvdF9kZF90cml0bXAuaCIKCiNkZWZpbmUgSU5EIChNQUNINjRfT0ZGU0VUX0JJVHxNQUNINjRfVU5GSUxMRURfQklUKQojZGVmaW5lIFRBRyh4KSB4IyNfb2Zmc2V0X3VuZmlsbGVkCiNpbmNsdWRlICJ0bmxfZGQvdF9kZF90cml0bXAuaCIKCiNkZWZpbmUgSU5EIChNQUNINjRfVFdPU0lERV9CSVR8TUFDSDY0X1VORklMTEVEX0JJVCkKI2RlZmluZSBUQUcoeCkgeCMjX3R3b3NpZGVfdW5maWxsZWQKI2luY2x1ZGUgInRubF9kZC90X2RkX3RyaXRtcC5oIgoKI2RlZmluZSBJTkQgKE1BQ0g2NF9UV09TSURFX0JJVHxNQUNINjRfT0ZGU0VUX0JJVHxNQUNINjRfVU5GSUxMRURfQklUKQojZGVmaW5lIFRBRyh4KSB4IyNfdHdvc2lkZV9vZmZzZXRfdW5maWxsZWQKI2luY2x1ZGUgInRubF9kZC90X2RkX3RyaXRtcC5oIgoKI2RlZmluZSBJTkQgKE1BQ0g2NF9GQUxMQkFDS19CSVQpCiNkZWZpbmUgVEFHKHgpIHgjI19mYWxsYmFjawojaW5jbHVkZSAidG5sX2RkL3RfZGRfdHJpdG1wLmgiCgojZGVmaW5lIElORCAoTUFDSDY0X09GRlNFVF9CSVR8TUFDSDY0X0ZBTExCQUNLX0JJVCkKI2RlZmluZSBUQUcoeCkgeCMjX29mZnNldF9mYWxsYmFjawojaW5jbHVkZSAidG5sX2RkL3RfZGRfdHJpdG1wLmgiCgojZGVmaW5lIElORCAoTUFDSDY0X1RXT1NJREVfQklUfE1BQ0g2NF9GQUxMQkFDS19CSVQpCiNkZWZpbmUgVEFHKHgpIHgjI190d29zaWRlX2ZhbGxiYWNrCiNpbmNsdWRlICJ0bmxfZGQvdF9kZF90cml0bXAuaCIKCiNkZWZpbmUgSU5EIChNQUNINjRfVFdPU0lERV9CSVR8TUFDSDY0X09GRlNFVF9CSVR8TUFDSDY0X0ZBTExCQUNLX0JJVCkKI2RlZmluZSBUQUcoeCkgeCMjX3R3b3NpZGVfb2Zmc2V0X2ZhbGxiYWNrCiNpbmNsdWRlICJ0bmxfZGQvdF9kZF90cml0bXAuaCIKCiNkZWZpbmUgSU5EIChNQUNINjRfVU5GSUxMRURfQklUfE1BQ0g2NF9GQUxMQkFDS19CSVQpCiNkZWZpbmUgVEFHKHgpIHgjI191bmZpbGxlZF9mYWxsYmFjawojaW5jbHVkZSAidG5sX2RkL3RfZGRfdHJpdG1wLmgiCgojZGVmaW5lIElORCAoTUFDSDY0X09GRlNFVF9CSVR8TUFDSDY0X1VORklMTEVEX0JJVHxNQUNINjRfRkFMTEJBQ0tfQklUKQojZGVmaW5lIFRBRyh4KSB4IyNfb2Zmc2V0X3VuZmlsbGVkX2ZhbGxiYWNrCiNpbmNsdWRlICJ0bmxfZGQvdF9kZF90cml0bXAuaCIKCiNkZWZpbmUgSU5EIChNQUNINjRfVFdPU0lERV9CSVR8TUFDSDY0X1VORklMTEVEX0JJVHxNQUNINjRfRkFMTEJBQ0tfQklUKQojZGVmaW5lIFRBRyh4KSB4IyNfdHdvc2lkZV91bmZpbGxlZF9mYWxsYmFjawojaW5jbHVkZSAidG5sX2RkL3RfZGRfdHJpdG1wLmgiCgojZGVmaW5lIElORCAoTUFDSDY0X1RXT1NJREVfQklUfE1BQ0g2NF9PRkZTRVRfQklUfE1BQ0g2NF9VTkZJTExFRF9CSVR8IFwKCSAgICAgTUFDSDY0X0ZBTExCQUNLX0JJVCkKI2RlZmluZSBUQUcoeCkgeCMjX3R3b3NpZGVfb2Zmc2V0X3VuZmlsbGVkX2ZhbGxiYWNrCiNpbmNsdWRlICJ0bmxfZGQvdF9kZF90cml0bXAuaCIKCgpzdGF0aWMgdm9pZCBpbml0X3Jhc3RfdGFiKCB2b2lkICkKewogICBpbml0KCk7CiAgIGluaXRfb2Zmc2V0KCk7CiAgIGluaXRfdHdvc2lkZSgpOwogICBpbml0X3R3b3NpZGVfb2Zmc2V0KCk7CiAgIGluaXRfdW5maWxsZWQoKTsKICAgaW5pdF9vZmZzZXRfdW5maWxsZWQoKTsKICAgaW5pdF90d29zaWRlX3VuZmlsbGVkKCk7CiAgIGluaXRfdHdvc2lkZV9vZmZzZXRfdW5maWxsZWQoKTsKICAgaW5pdF9mYWxsYmFjaygpOwogICBpbml0X29mZnNldF9mYWxsYmFjaygpOwogICBpbml0X3R3b3NpZGVfZmFsbGJhY2soKTsKICAgaW5pdF90d29zaWRlX29mZnNldF9mYWxsYmFjaygpOwogICBpbml0X3VuZmlsbGVkX2ZhbGxiYWNrKCk7CiAgIGluaXRfb2Zmc2V0X3VuZmlsbGVkX2ZhbGxiYWNrKCk7CiAgIGluaXRfdHdvc2lkZV91bmZpbGxlZF9mYWxsYmFjaygpOwogICBpbml0X3R3b3NpZGVfb2Zmc2V0X3VuZmlsbGVkX2ZhbGxiYWNrKCk7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgICAgICAgICAgIFJhc3Rlcml6YXRpb24gZmFsbGJhY2sgaGVscGVycyAgICAgICAgICAgICAgICAgICAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCgovKiBUaGlzIGNvZGUgaXMgaGl0IG9ubHkgd2hlbiBhIG1peCBvZiBhY2NlbGVyYXRlZCBhbmQgdW5hY2NlbGVyYXRlZAogKiBwcmltaXRpdmVzIGFyZSBiZWluZyBkcmF3biwgYW5kIG9ubHkgZm9yIHRoZSB1bmFjY2VsZXJhdGVkCiAqIHByaW1pdGl2ZXMuCiAqLwpzdGF0aWMgdm9pZAptYWNoNjRfZmFsbGJhY2tfdHJpKCBtYWNoNjRDb250ZXh0UHRyIG1tZXNhLAoJCSAgICAgbWFjaDY0VmVydGV4ICp2MCwKCQkgICAgIG1hY2g2NFZlcnRleCAqdjEsCgkJICAgICBtYWNoNjRWZXJ0ZXggKnYyICkKewogICBHTGNvbnRleHQgKmN0eCA9IG1tZXNhLT5nbEN0eDsKICAgU1d2ZXJ0ZXggdlszXTsKICAgbWFjaDY0X3RyYW5zbGF0ZV92ZXJ0ZXgoIGN0eCwgdjAsICZ2WzBdICk7CiAgIG1hY2g2NF90cmFuc2xhdGVfdmVydGV4KCBjdHgsIHYxLCAmdlsxXSApOwogICBtYWNoNjRfdHJhbnNsYXRlX3ZlcnRleCggY3R4LCB2MiwgJnZbMl0gKTsKICAgX3N3cmFzdF9UcmlhbmdsZSggY3R4LCAmdlswXSwgJnZbMV0sICZ2WzJdICk7Cn0KCgpzdGF0aWMgdm9pZAptYWNoNjRfZmFsbGJhY2tfbGluZSggbWFjaDY0Q29udGV4dFB0ciBtbWVzYSwKCQkgICAgbWFjaDY0VmVydGV4ICp2MCwKCQkgICAgbWFjaDY0VmVydGV4ICp2MSApCnsKICAgR0xjb250ZXh0ICpjdHggPSBtbWVzYS0+Z2xDdHg7CiAgIFNXdmVydGV4IHZbMl07CiAgIG1hY2g2NF90cmFuc2xhdGVfdmVydGV4KCBjdHgsIHYwLCAmdlswXSApOwogICBtYWNoNjRfdHJhbnNsYXRlX3ZlcnRleCggY3R4LCB2MSwgJnZbMV0gKTsKICAgX3N3cmFzdF9MaW5lKCBjdHgsICZ2WzBdLCAmdlsxXSApOwp9CgoKc3RhdGljIHZvaWQKbWFjaDY0X2ZhbGxiYWNrX3BvaW50KCBtYWNoNjRDb250ZXh0UHRyIG1tZXNhLAoJCSAgICAgbWFjaDY0VmVydGV4ICp2MCApCnsKICAgR0xjb250ZXh0ICpjdHggPSBtbWVzYS0+Z2xDdHg7CiAgIFNXdmVydGV4IHZbMV07CiAgIG1hY2g2NF90cmFuc2xhdGVfdmVydGV4KCBjdHgsIHYwLCAmdlswXSApOwogICBfc3dyYXN0X1BvaW50KCBjdHgsICZ2WzBdICk7Cn0KCgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qICAgICAgICAgICAgICAgUmVuZGVyIHVuY2xpcHBlZCBiZWdpbi9lbmQgb2JqZWN0cyAgICAgICAgICAgICAgICAgICAqLwovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCiNkZWZpbmUgVkVSVCh4KSAobWFjaDY0VmVydGV4ICopKG1hY2g2NHZlcnRzICsgKCh4KSAqIHZlcnRzaXplICogc2l6ZW9mKGludCkpKQojZGVmaW5lIFJFTkRFUl9QT0lOVFMoIHN0YXJ0LCBjb3VudCApCQlcCiAgIGZvciAoIDsgc3RhcnQgPCBjb3VudCA7IHN0YXJ0KyspCQlcCiAgICAgIG1hY2g2NF9kcmF3X3BvaW50KCBtbWVzYSwgVkVSVChzdGFydCkgKQojZGVmaW5lIFJFTkRFUl9MSU5FKCB2MCwgdjEgKSBcCiAgIG1hY2g2NF9kcmF3X2xpbmUoIG1tZXNhLCBWRVJUKHYwKSwgVkVSVCh2MSkgKQojZGVmaW5lIFJFTkRFUl9UUkkoIHYwLCB2MSwgdjIgKSAgXAogICBtYWNoNjRfZHJhd190cmlhbmdsZSggbW1lc2EsIFZFUlQodjApLCBWRVJUKHYxKSwgVkVSVCh2MikgKQojZGVmaW5lIFJFTkRFUl9RVUFEKCB2MCwgdjEsIHYyLCB2MyApIFwKICAgbWFjaDY0X2RyYXdfcXVhZCggbW1lc2EsIFZFUlQodjApLCBWRVJUKHYxKSwgVkVSVCh2MiksIFZFUlQodjMpICkKI2RlZmluZSBJTklUKHgpIGRvIHsJCQkJCVwKICAgaWYgKDApIGZwcmludGYoc3RkZXJyLCAiJXNcbiIsIF9fRlVOQ1RJT05fXyk7CVwKICAgbWFjaDY0UmVuZGVyUHJpbWl0aXZlKCBjdHgsIHggKTsJCQlcCn0gd2hpbGUgKDApCiN1bmRlZiBMT0NBTF9WQVJTCiNkZWZpbmUgTE9DQUxfVkFSUwkJCQkJCVwKICAgIG1hY2g2NENvbnRleHRQdHIgbW1lc2EgPSBNQUNINjRfQ09OVEVYVChjdHgpOwkJXAogICAgY29uc3QgR0x1aW50IHZlcnRzaXplID0gbW1lc2EtPnZlcnRleF9zaXplOyAgICAgICAgICAgICAgICAgXAogICAgY29uc3QgY2hhciAqbWFjaDY0dmVydHMgPSAoY2hhciAqKW1tZXNhLT52ZXJ0czsJCVwKICAgIGNvbnN0IEdMdWludCAqIGNvbnN0IGVsdCA9IFROTF9DT05URVhUKGN0eCktPnZiLkVsdHM7CVwKICAgICh2b2lkKSBlbHQ7CiNkZWZpbmUgUkVTRVRfU1RJUFBMRQojZGVmaW5lIFJFU0VUX09DQ0xVU0lPTgojZGVmaW5lIFBSRVNFUlZFX1ZCX0RFRlMKI2RlZmluZSBFTFQoeCkgKHgpCiNkZWZpbmUgVEFHKHgpIG1hY2g2NF8jI3gjI192ZXJ0cwojaW5jbHVkZSAidG5sL3RfdmJfcmVuZGVydG1wLmgiCiN1bmRlZiBFTFQKI3VuZGVmIFRBRwojZGVmaW5lIFRBRyh4KSBtYWNoNjRfIyN4IyNfZWx0cwojZGVmaW5lIEVMVCh4KSBlbHRbeF0KI2luY2x1ZGUgInRubC90X3ZiX3JlbmRlcnRtcC5oIgoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKiAgICAgICAgICAgICAgICAgICAgUmVuZGVyIGNsaXBwZWQgcHJpbWl0aXZlcyAgICAgICAgICAgICAgICAgICAgICAgKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgpzdGF0aWMgdm9pZCBtYWNoNjRSZW5kZXJDbGlwcGVkUG9seSggR0xjb250ZXh0ICpjdHgsIGNvbnN0IEdMdWludCAqZWx0cywKCQkJCSAgICAgR0x1aW50IG4gKQp7CiAgIG1hY2g2NENvbnRleHRQdHIgbW1lc2EgPSBNQUNINjRfQ09OVEVYVCggY3R4ICk7CiAgIFROTGNvbnRleHQgKnRubCA9IFROTF9DT05URVhUKGN0eCk7CiAgIHN0cnVjdCB2ZXJ0ZXhfYnVmZmVyICpWQiA9ICZUTkxfQ09OVEVYVChjdHgpLT52YjsKICAgR0x1aW50IHByaW0gPSBtbWVzYS0+cmVuZGVyX3ByaW1pdGl2ZTsKCiAgIC8qIFJlbmRlciB0aGUgbmV3IHZlcnRpY2VzIGFzIGFuIHVuY2xpcHBlZCBwb2x5Z29uLgogICAgKi8KICAgewogICAgICBHTHVpbnQgKnRtcCA9IFZCLT5FbHRzOwogICAgICBWQi0+RWx0cyA9IChHTHVpbnQgKillbHRzOwogICAgICB0bmwtPkRyaXZlci5SZW5kZXIuUHJpbVRhYkVsdHNbR0xfUE9MWUdPTl0oIGN0eCwgMCwgbiwgUFJJTV9CRUdJTnxQUklNX0VORCApOwogICAgICBWQi0+RWx0cyA9IHRtcDsKICAgfQoKICAgLyogUmVzdG9yZSB0aGUgcmVuZGVyIHByaW1pdGl2ZQogICAgKi8KICAgaWYgKHByaW0gIT0gR0xfUE9MWUdPTikKICAgICAgdG5sLT5Ecml2ZXIuUmVuZGVyLlByaW1pdGl2ZU5vdGlmeSggY3R4LCBwcmltICk7Cgp9CgpzdGF0aWMgdm9pZCBtYWNoNjRSZW5kZXJDbGlwcGVkTGluZSggR0xjb250ZXh0ICpjdHgsIEdMdWludCBpaSwgR0x1aW50IGpqICkKewogICBUTkxjb250ZXh0ICp0bmwgPSBUTkxfQ09OVEVYVChjdHgpOwogICB0bmwtPkRyaXZlci5SZW5kZXIuTGluZSggY3R4LCBpaSwgamogKTsKfQoKI2lmIE1BQ0g2NF9OQVRJVkVfVlRYRk1UCnN0YXRpYyB2b2lkIG1hY2g2NEZhc3RSZW5kZXJDbGlwcGVkUG9seSggR0xjb250ZXh0ICpjdHgsIGNvbnN0IEdMdWludCAqZWx0cywKCQkJCQkgR0x1aW50IG4gKQp7CiAgIG1hY2g2NENvbnRleHRQdHIgbW1lc2EgPSBNQUNINjRfQ09OVEVYVCggY3R4ICk7CiAgIGNvbnN0IEdMdWludCB2ZXJ0c2l6ZSA9IG1tZXNhLT52ZXJ0ZXhfc2l6ZTsKICAgR0xpbnQgYTsKICAgdW5pb24gewogICAgICBHTGZsb2F0IGY7CiAgICAgIENBUkQzMiB1OwogICB9IG9vYTsKICAgR0x1aW50IHh5OwogICBjb25zdCBHTHVpbnQgeHlvZmZzZXQgPSA5OwogICBHTGludCB4eFszXSwgeXlbM107IC8qIDIgZnJhY3Rpb25hbCBiaXRzIGZvciBoYXJkd2FyZSAqLwogICB1bnNpZ25lZCB2YnNpeiA9ICh2ZXJ0c2l6ZSArICh2ZXJ0c2l6ZSA+IDcgPyAyIDogMSkpICogbiArIChuLTIpOwogICBDQVJEMzIgKnZiLCAqdmJjaGs7CiAgIEdMdWJ5dGUgKm1hY2g2NHZlcnRzID0gKEdMdWJ5dGUgKiltbWVzYS0+dmVydHM7CiAgIG1hY2g2NFZlcnRleFB0ciB2MCwgdjEsIHYyOwogICBpbnQgaTsKICAgCiAgIHYwID0gKG1hY2g2NFZlcnRleFB0cilWRVJUKGVsdHNbMV0pOwogICB2MSA9IChtYWNoNjRWZXJ0ZXhQdHIpVkVSVChlbHRzWzJdKTsKICAgdjIgPSAobWFjaDY0VmVydGV4UHRyKVZFUlQoZWx0c1swXSk7CiAgICAgIAogICB4eSA9IExFMzJfSU4oICZ2MC0+dWlbeHlvZmZzZXRdICk7CiAgIHh4WzBdID0gKEdMc2hvcnQpKCB4eSA+PiAxNiApOwogICB5eVswXSA9IChHTHNob3J0KSggeHkgJiAweGZmZmYgKTsKICAgCiAgIHh5ID0gTEUzMl9JTiggJnYxLT51aVt4eW9mZnNldF0gKTsKICAgeHhbMV0gPSAoR0xzaG9ydCkoIHh5ID4+IDE2ICk7CiAgIHl5WzFdID0gKEdMc2hvcnQpKCB4eSAmIDB4ZmZmZiApOwogICAKICAgeHkgPSBMRTMyX0lOKCAmdjItPnVpW3h5b2Zmc2V0XSApOwogICB4eFsyXSA9IChHTHNob3J0KSggeHkgPj4gMTYgKTsKICAgeXlbMl0gPSAoR0xzaG9ydCkoIHh5ICYgMHhmZmZmICk7CgkgICAKICAgYSA9ICh4eFswXSAtIHh4WzJdKSAqICh5eVsxXSAtIHl5WzJdKSAtCiAgICAgICAoeXlbMF0gLSB5eVsyXSkgKiAoeHhbMV0gLSB4eFsyXSk7CgogICBpZiAoIChtbWVzYS0+YmFja2ZhY2Vfc2lnbiAmJgoJKChhIDwgMCAmJiAhc2lnbmJpdCggbW1lc2EtPmJhY2tmYWNlX3NpZ24gKSkgfHwgCgkoYSA+IDAgJiYgc2lnbmJpdCggbW1lc2EtPmJhY2tmYWNlX3NpZ24gKSkpKSApIHsKICAgICAgLyogY3VsbCBwb2x5Z29uICovCiAgICAgIGlmICggTUFDSDY0X0RFQlVHICYgREVCVUdfVkVSQk9TRV9QUklNUyApCgkgZnByaW50ZihzdGRlcnIsIlBvbHlnb24gY3VsbGVkXG4iKTsKICAgICAgcmV0dXJuOwogICB9CiAgIAogICBvb2EuZiA9IDE2LjAgLyBhOwogICAKICAgdmIgPSAoQ0FSRDMyICopbWFjaDY0QWxsb2NEbWFMb3coIG1tZXNhLCB2YnNpeiAqIHNpemVvZihDQVJEMzIpICk7CiAgIHZiY2hrID0gdmIgKyB2YnNpejsKCiAgIENPUFlfVkVSVEVYKCB2YiwgdmVydHNpemUsIHYwLCAxICk7CiAgIENPUFlfVkVSVEVYKCB2YiwgdmVydHNpemUsIHYxLCAyICk7CiAgIENPUFlfVkVSVEVYX09PQSggdmIsIHZlcnRzaXplLCB2MiwgMyApOwogICBMRTMyX09VVCggdmIrKywgb29hLnUgKTsKCiAgIGkgPSAzOwogICB3aGlsZSAoMSkgewogICAgICBpZiAoaSA+PSBuKQoJIGJyZWFrOwogICAgICB2MCA9IChtYWNoNjRWZXJ0ZXhQdHIpVkVSVChlbHRzW2ldKTsKICAgICAgaSsrOwoKICAgICAgeHkgPSBMRTMyX0lOKCAmdjAtPnVpW3h5b2Zmc2V0XSApOwogICAgICB4eFswXSA9IChHTHNob3J0KSggeHkgPj4gMTYgKTsKICAgICAgeXlbMF0gPSAoR0xzaG9ydCkoIHh5ICYgMHhmZmZmICk7CgkgICAgICAKICAgICAgYSA9ICh4eFswXSAtIHh4WzJdKSAqICh5eVsxXSAtIHl5WzJdKSAtCgkgICh5eVswXSAtIHl5WzJdKSAqICh4eFsxXSAtIHh4WzJdKTsKICAgICAgb29hLmYgPSAxNi4wIC8gYTsKICAgCiAgICAgIENPUFlfVkVSVEVYX09PQSggdmIsIHZlcnRzaXplLCB2MCwgMSApOwogICAgICBMRTMyX09VVCggdmIrKywgb29hLnUgKTsKICAgICAgCiAgICAgIGlmIChpID49IG4pCgkgYnJlYWs7CiAgICAgIHYxID0gKG1hY2g2NFZlcnRleFB0cilWRVJUKGVsdHNbaV0pOwogICAgICBpKys7CgogICAgICB4eSA9IExFMzJfSU4oICZ2MS0+dWlbeHlvZmZzZXRdICk7CiAgICAgIHh4WzFdID0gKEdMc2hvcnQpKCB4eSA+PiAxNiApOwogICAgICB5eVsxXSA9IChHTHNob3J0KSggeHkgJiAweGZmZmYgKTsKCSAgICAgIAogICAgICBhID0gKHh4WzBdIC0geHhbMl0pICogKHl5WzFdIC0geXlbMl0pIC0KCSAgKHl5WzBdIC0geXlbMl0pICogKHh4WzFdIC0geHhbMl0pOwogICAgICBvb2EuZiA9IDE2LjAgLyBhOwogICAKICAgICAgQ09QWV9WRVJURVhfT09BKCB2YiwgdmVydHNpemUsIHYxLCAyICk7CiAgICAgIExFMzJfT1VUKCB2YisrLCBvb2EudSApOwogICB9CgogICBhc3NlcnQoIHZiID09IHZiY2hrICk7Cn0KI2Vsc2UKc3RhdGljIHZvaWQgbWFjaDY0RmFzdFJlbmRlckNsaXBwZWRQb2x5KCBHTGNvbnRleHQgKmN0eCwgY29uc3QgR0x1aW50ICplbHRzLAoJCQkJCSBHTHVpbnQgbiApCnsKICAgbWFjaDY0Q29udGV4dFB0ciBtbWVzYSA9IE1BQ0g2NF9DT05URVhUKCBjdHggKTsKICAgY29uc3QgR0x1aW50IHZlcnRzaXplID0gbW1lc2EtPnZlcnRleF9zaXplOwogICBHTHVieXRlICptYWNoNjR2ZXJ0cyA9IChHTHVieXRlICopbW1lc2EtPnZlcnRzOwogICBjb25zdCBHTHVpbnQgKnN0YXJ0ID0gKGNvbnN0IEdMdWludCAqKVZFUlQoZWx0c1swXSk7CiAgIGludCBpOwoKICAgZm9yIChpID0gMiA7IGkgPCBuIDsgaSsrKSB7CiAgICAgIG1hY2g2NF9kcmF3X3RyaWFuZ2xlKCBtbWVzYSwgCgkJCSAgICBWRVJUKGVsdHNbaS0xXSksIAoJCQkgICAgVkVSVChlbHRzW2ldKSwgCgkJCSAgICAobWFjaDY0VmVydGV4UHRyKSBzdGFydAoJCQkgICAgKTsKICAgfQp9CiNlbmRpZiAvKiBNQUNINjRfTkFUSVZFX1ZUWEZNVCAqLwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qICAgICAgICAgICAgICAgICAgICBDaG9vc2UgcmVuZGVyIGZ1bmN0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCiNkZWZpbmUgX01BQ0g2NF9ORVdfUkVOREVSX1NUQVRFIChfRERfTkVXX1BPSU5UX1NNT09USCB8CVwKCQkJICAgICAgICAgIF9ERF9ORVdfTElORV9TTU9PVEggfAkJXAoJCQkgICAgICAgICAgX0REX05FV19MSU5FX1NUSVBQTEUgfAlcCgkJCSAgICAgICAgICBfRERfTkVXX1RSSV9TTU9PVEggfAkJXAoJCQkgICAgICAgICAgX0REX05FV19UUklfU1RJUFBMRSB8CQlcCgkJCSAgICAgICAgICBfTkVXX1BPTFlHT05TVElQUExFIHwJCVwKCQkJICAgICAgICAgIF9ERF9ORVdfVFJJX1VORklMTEVEIHwJXAoJCQkgICAgICAgICAgX0REX05FV19UUklfTElHSFRfVFdPU0lERSB8CVwKCQkJICAgICAgICAgIF9ERF9ORVdfVFJJX09GRlNFVCkJCVwKCiNkZWZpbmUgUE9JTlRfRkFMTEJBQ0sgKEREX1BPSU5UX1NNT09USCkKI2RlZmluZSBMSU5FX0ZBTExCQUNLIChERF9MSU5FX1NNT09USHxERF9MSU5FX1NUSVBQTEUpCiNkZWZpbmUgVFJJX0ZBTExCQUNLIChERF9UUklfU01PT1RIfEREX1RSSV9TVElQUExFKQojZGVmaW5lIEFOWV9GQUxMQkFDS19GTEFHUyAoUE9JTlRfRkFMTEJBQ0t8TElORV9GQUxMQkFDS3xUUklfRkFMTEJBQ0spCiNkZWZpbmUgQU5ZX1JBU1RFUl9GTEFHUyAoRERfVFJJX0xJR0hUX1RXT1NJREV8RERfVFJJX09GRlNFVHxERF9UUklfVU5GSUxMRUQpCgoKc3RhdGljIHZvaWQgbWFjaDY0Q2hvb3NlUmVuZGVyU3RhdGUoR0xjb250ZXh0ICpjdHgpCnsKICAgbWFjaDY0Q29udGV4dFB0ciBtbWVzYSA9IE1BQ0g2NF9DT05URVhUKGN0eCk7CiAgIEdMdWludCBmbGFncyA9IGN0eC0+X1RyaWFuZ2xlQ2FwczsKICAgR0x1aW50IGluZGV4ID0gMDsKCiAgIGlmIChmbGFncyAmIChBTllfUkFTVEVSX0ZMQUdTfEFOWV9GQUxMQkFDS19GTEFHUykpIHsKICAgICAgbW1lc2EtPmRyYXdfcG9pbnQgPSBtYWNoNjRfZHJhd19wb2ludDsKICAgICAgbW1lc2EtPmRyYXdfbGluZSA9IG1hY2g2NF9kcmF3X2xpbmU7CiAgICAgIG1tZXNhLT5kcmF3X3RyaSA9IG1hY2g2NF9kcmF3X3RyaWFuZ2xlOwoKICAgICAgaWYgKGZsYWdzICYgQU5ZX1JBU1RFUl9GTEFHUykgewoJIGlmIChmbGFncyAmIEREX1RSSV9MSUdIVF9UV09TSURFKSBpbmRleCB8PSBNQUNINjRfVFdPU0lERV9CSVQ7CgkgaWYgKGZsYWdzICYgRERfVFJJX09GRlNFVCkgICAgICAgIGluZGV4IHw9IE1BQ0g2NF9PRkZTRVRfQklUOwoJIGlmIChmbGFncyAmIEREX1RSSV9VTkZJTExFRCkgICAgICBpbmRleCB8PSBNQUNINjRfVU5GSUxMRURfQklUOwogICAgICB9CgogICAgICAvKiBIb29rIGluIGZhbGxiYWNrcyBmb3Igc3BlY2lmaWMgcHJpbWl0aXZlcy4KICAgICAgICovCiAgICAgIGlmIChmbGFncyAmIChQT0lOVF9GQUxMQkFDS3xMSU5FX0ZBTExCQUNLfFRSSV9GQUxMQkFDSykpIHsKCSBpZiAoZmxhZ3MgJiBQT0lOVF9GQUxMQkFDSykgbW1lc2EtPmRyYXdfcG9pbnQgPSBtYWNoNjRfZmFsbGJhY2tfcG9pbnQ7CgkgaWYgKGZsYWdzICYgTElORV9GQUxMQkFDSykgIG1tZXNhLT5kcmF3X2xpbmUgPSBtYWNoNjRfZmFsbGJhY2tfbGluZTsKCSBpZiAoZmxhZ3MgJiBUUklfRkFMTEJBQ0spICAgbW1lc2EtPmRyYXdfdHJpID0gbWFjaDY0X2ZhbGxiYWNrX3RyaTsKCSBpbmRleCB8PSBNQUNINjRfRkFMTEJBQ0tfQklUOwogICAgICB9CiAgIH0KCiAgIGlmIChpbmRleCAhPSBtbWVzYS0+UmVuZGVySW5kZXgpIHsKICAgICAgVE5MY29udGV4dCAqdG5sID0gVE5MX0NPTlRFWFQoY3R4KTsKICAgICAgdG5sLT5Ecml2ZXIuUmVuZGVyLlBvaW50cyA9IHJhc3RfdGFiW2luZGV4XS5wb2ludHM7CiAgICAgIHRubC0+RHJpdmVyLlJlbmRlci5MaW5lID0gcmFzdF90YWJbaW5kZXhdLmxpbmU7CiAgICAgIHRubC0+RHJpdmVyLlJlbmRlci5UcmlhbmdsZSA9IHJhc3RfdGFiW2luZGV4XS50cmlhbmdsZTsKICAgICAgdG5sLT5Ecml2ZXIuUmVuZGVyLlF1YWQgPSByYXN0X3RhYltpbmRleF0ucXVhZDsKCiAgICAgIGlmIChpbmRleCA9PSAwKSB7CgkgdG5sLT5Ecml2ZXIuUmVuZGVyLlByaW1UYWJWZXJ0cyA9IG1hY2g2NF9yZW5kZXJfdGFiX3ZlcnRzOwoJIHRubC0+RHJpdmVyLlJlbmRlci5QcmltVGFiRWx0cyA9IG1hY2g2NF9yZW5kZXJfdGFiX2VsdHM7CgkgdG5sLT5Ecml2ZXIuUmVuZGVyLkNsaXBwZWRMaW5lID0gcmFzdF90YWJbaW5kZXhdLmxpbmU7CgkgdG5sLT5Ecml2ZXIuUmVuZGVyLkNsaXBwZWRQb2x5Z29uID0gbWFjaDY0RmFzdFJlbmRlckNsaXBwZWRQb2x5OwogICAgICB9IGVsc2UgewoJIHRubC0+RHJpdmVyLlJlbmRlci5QcmltVGFiVmVydHMgPSBfdG5sX3JlbmRlcl90YWJfdmVydHM7CgkgdG5sLT5Ecml2ZXIuUmVuZGVyLlByaW1UYWJFbHRzID0gX3RubF9yZW5kZXJfdGFiX2VsdHM7CgkgdG5sLT5Ecml2ZXIuUmVuZGVyLkNsaXBwZWRMaW5lID0gbWFjaDY0UmVuZGVyQ2xpcHBlZExpbmU7CgkgdG5sLT5Ecml2ZXIuUmVuZGVyLkNsaXBwZWRQb2x5Z29uID0gbWFjaDY0UmVuZGVyQ2xpcHBlZFBvbHk7CiAgICAgIH0KCiAgICAgIG1tZXNhLT5SZW5kZXJJbmRleCA9IGluZGV4OwogICB9Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKiAgICAgICAgICAgICAgICAgVmFsaWRhdGUgc3RhdGUgYXQgcGlwZWxpbmUgc3RhcnQgICAgICAgICAgICAgICAgICAgKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgpzdGF0aWMgdm9pZCBtYWNoNjRSdW5QaXBlbGluZSggR0xjb250ZXh0ICpjdHggKQp7CiAgIG1hY2g2NENvbnRleHRQdHIgbW1lc2EgPSBNQUNINjRfQ09OVEVYVChjdHgpOwoKICAgaWYgKG1tZXNhLT5uZXdfc3RhdGUpCiAgICAgIG1hY2g2NEREVXBkYXRlSFdTdGF0ZSggY3R4ICk7CgogICBpZiAoIW1tZXNhLT5GYWxsYmFjayAmJiBtbWVzYS0+TmV3R0xTdGF0ZSkgewogICAgICBpZiAobW1lc2EtPk5ld0dMU3RhdGUgJiBfTUFDSDY0X05FV19WRVJURVhfU1RBVEUpCgkgbWFjaDY0Q2hvb3NlVmVydGV4U3RhdGUoIGN0eCApOwoKICAgICAgaWYgKG1tZXNhLT5OZXdHTFN0YXRlICYgX01BQ0g2NF9ORVdfUkVOREVSX1NUQVRFKQoJIG1hY2g2NENob29zZVJlbmRlclN0YXRlKCBjdHggKTsKCiAgICAgIG1tZXNhLT5OZXdHTFN0YXRlID0gMDsKICAgfQoKICAgX3RubF9ydW5fcGlwZWxpbmUoIGN0eCApOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyogICAgICAgICAgICAgICAgIEhpZ2ggbGV2ZWwgaG9va3MgZm9yIHRfdmJfcmVuZGVyLmMgICAgICAgICAgICAgICAgICovCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKLyogVGhpcyBpcyBjYWxsZWQgd2hlbiBNZXNhIHN3aXRjaGVzIGJldHdlZW4gcmVuZGVyaW5nIHRyaWFuZ2xlCiAqIHByaW1pdGl2ZXMgKHN1Y2ggYXMgR0xfUE9MWUdPTiwgR0xfUVVBRFMsIEdMX1RSSUFOR0xFX1NUUklQLCBldGMpLAogKiBhbmQgbGluZXMsIHBvaW50cyBhbmQgYml0bWFwcy4KICovCgpzdGF0aWMgdm9pZCBtYWNoNjRSYXN0ZXJQcmltaXRpdmUoIEdMY29udGV4dCAqY3R4LCBHTHVpbnQgaHdwcmltICkKewogICBtYWNoNjRDb250ZXh0UHRyIG1tZXNhID0gTUFDSDY0X0NPTlRFWFQoY3R4KTsKCiAgIG1tZXNhLT5uZXdfc3RhdGUgfD0gTUFDSDY0X05FV19DT05URVhUOwogICBtbWVzYS0+ZGlydHkgfD0gTUFDSDY0X1VQTE9BRF9DT05URVhUOwoKICAgaWYgKG1tZXNhLT5od19wcmltaXRpdmUgIT0gaHdwcmltKSB7CiAgICAgIEZMVVNIX0JBVENIKCBtbWVzYSApOwogICAgICBtbWVzYS0+aHdfcHJpbWl0aXZlID0gaHdwcmltOwogICB9Cn0KCnN0YXRpYyB2b2lkIG1hY2g2NFJlbmRlclByaW1pdGl2ZSggR0xjb250ZXh0ICpjdHgsIEdMZW51bSBwcmltICkKewogICBtYWNoNjRDb250ZXh0UHRyIG1tZXNhID0gTUFDSDY0X0NPTlRFWFQoY3R4KTsKICAgR0x1aW50IGh3ID0gaHdfcHJpbVtwcmltXTsKCiAgIG1tZXNhLT5yZW5kZXJfcHJpbWl0aXZlID0gcHJpbTsKCiAgIGlmIChwcmltID49IEdMX1RSSUFOR0xFUyAmJiAoY3R4LT5fVHJpYW5nbGVDYXBzICYgRERfVFJJX1VORklMTEVEKSkKICAgICAgcmV0dXJuOwoKICAgbWFjaDY0UmFzdGVyUHJpbWl0aXZlKCBjdHgsIGh3ICk7Cn0KCgpzdGF0aWMgdm9pZCBtYWNoNjRSZW5kZXJTdGFydCggR0xjb250ZXh0ICpjdHggKQp7CiAgIC8qIENoZWNrIGZvciBwcm9qZWN0aXZlIHRleHR1cmluZy4gIE1ha2Ugc3VyZSBhbGwgdGV4Y29vcmQKICAgICogcG9pbnRlcnMgcG9pbnQgdG8gc29tZXRoaW5nLiAgKGZpeCBpbiBtZXNhPykKICAgICovCiAgIG1hY2g2NENoZWNrVGV4U2l6ZXMoIGN0eCApOwp9CgpzdGF0aWMgdm9pZCBtYWNoNjRSZW5kZXJGaW5pc2goIEdMY29udGV4dCAqY3R4ICkKewogICBpZiAoTUFDSDY0X0NPTlRFWFQoY3R4KS0+UmVuZGVySW5kZXggJiBNQUNINjRfRkFMTEJBQ0tfQklUKQogICAgICBfc3dyYXN0X2ZsdXNoKCBjdHggKTsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKiAgICAgICAgICAgVHJhbnNpdGlvbiB0by9mcm9tIGhhcmR3YXJlIHJhc3Rlcml6YXRpb24uICAgICAgICAgICAgICAgKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgpzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGZhbGxiYWNrU3RyaW5nc1tdID0gewogICAiVGV4dHVyZSBtb2RlIiwKICAgImdsRHJhd0J1ZmZlcihHTF9GUk9OVF9BTkRfQkFDSykiLAogICAiZ2xSZWFkQnVmZmVyIiwKICAgImdsRW5hYmxlKEdMX1NURU5DSUwpIHdpdGhvdXQgaHcgc3RlbmNpbCBidWZmZXIiLAogICAiZ2xSZW5kZXJNb2RlKHNlbGVjdGlvbiBvciBmZWVkYmFjaykiLAogICAiZ2xMb2dpY09wIChtb2RlICE9IEdMX0NPUFkpIiwKICAgIkdMX1NFUEFSQVRFX1NQRUNVTEFSX0NPTE9SIiwKICAgImdsQmxlbmRFcXVhdGlvbiAobW9kZSAhPSBBREQpIiwKICAgImdsQmxlbmRGdW5jIiwKICAgIlJhc3Rlcml6YXRpb24gZGlzYWJsZSIsCn07CgoKc3RhdGljIGNvbnN0IGNoYXIgKmdldEZhbGxiYWNrU3RyaW5nKEdMdWludCBiaXQpCnsKICAgaW50IGkgPSAwOwogICB3aGlsZSAoYml0ID4gMSkgewogICAgICBpKys7CiAgICAgIGJpdCA+Pj0gMTsKICAgfQogICByZXR1cm4gZmFsbGJhY2tTdHJpbmdzW2ldOwp9Cgp2b2lkIG1hY2g2NEZhbGxiYWNrKCBHTGNvbnRleHQgKmN0eCwgR0x1aW50IGJpdCwgR0xib29sZWFuIG1vZGUgKQp7CiAgIFROTGNvbnRleHQgKnRubCA9IFROTF9DT05URVhUKGN0eCk7CiAgIG1hY2g2NENvbnRleHRQdHIgbW1lc2EgPSBNQUNINjRfQ09OVEVYVChjdHgpOwogICBHTHVpbnQgb2xkZmFsbGJhY2sgPSBtbWVzYS0+RmFsbGJhY2s7CgogICBpZiAobW9kZSkgewogICAgICBtbWVzYS0+RmFsbGJhY2sgfD0gYml0OwogICAgICBpZiAob2xkZmFsbGJhY2sgPT0gMCkgewoJIEZMVVNIX0JBVENIKCBtbWVzYSApOwoJIF9zd3NldHVwX1dha2V1cCggY3R4ICk7CgkgbW1lc2EtPlJlbmRlckluZGV4ID0gfjA7CgkgaWYgKE1BQ0g2NF9ERUJVRyAmIERFQlVHX1ZFUkJPU0VfRkFMTEJBQ0spIHsKCSAgICBmcHJpbnRmKHN0ZGVyciwgIk1hY2g2NCBiZWdpbiByYXN0ZXJpemF0aW9uIGZhbGxiYWNrOiAweCV4ICVzXG4iLAoJCSAgICBiaXQsIGdldEZhbGxiYWNrU3RyaW5nKGJpdCkpOwoJIH0KICAgICAgfQogICB9CiAgIGVsc2UgewogICAgICBtbWVzYS0+RmFsbGJhY2sgJj0gfmJpdDsKICAgICAgaWYgKG9sZGZhbGxiYWNrID09IGJpdCkgewoJIF9zd3Jhc3RfZmx1c2goIGN0eCApOwoJIHRubC0+RHJpdmVyLlJlbmRlci5TdGFydCA9IG1hY2g2NFJlbmRlclN0YXJ0OwoJIHRubC0+RHJpdmVyLlJlbmRlci5QcmltaXRpdmVOb3RpZnkgPSBtYWNoNjRSZW5kZXJQcmltaXRpdmU7CgkgdG5sLT5Ecml2ZXIuUmVuZGVyLkZpbmlzaCA9IG1hY2g2NFJlbmRlckZpbmlzaDsKCSB0bmwtPkRyaXZlci5SZW5kZXIuQnVpbGRWZXJ0aWNlcyA9IG1hY2g2NEJ1aWxkVmVydGljZXM7CgkgbW1lc2EtPk5ld0dMU3RhdGUgfD0gKF9NQUNINjRfTkVXX1JFTkRFUl9TVEFURXwKCQkJICAgICAgIF9NQUNINjRfTkVXX1ZFUlRFWF9TVEFURSk7CgkgaWYgKE1BQ0g2NF9ERUJVRyAmIERFQlVHX1ZFUkJPU0VfRkFMTEJBQ0spIHsKCSAgICBmcHJpbnRmKHN0ZGVyciwgIk1hY2g2NCBlbmQgcmFzdGVyaXphdGlvbiBmYWxsYmFjazogMHgleCAlc1xuIiwKCQkgICAgYml0LCBnZXRGYWxsYmFja1N0cmluZyhiaXQpKTsKCSB9CiAgICAgIH0KICAgfQp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5pdGlhbGl6YXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKdm9pZCBtYWNoNjRJbml0VHJpRnVuY3MoIEdMY29udGV4dCAqY3R4ICkKewogICBUTkxjb250ZXh0ICp0bmwgPSBUTkxfQ09OVEVYVChjdHgpOwogICBzdGF0aWMgaW50IGZpcnN0dGltZSA9IDE7CgogICBpZiAoZmlyc3R0aW1lKSB7CiAgICAgIGluaXRfcmFzdF90YWIoKTsKICAgICAgZmlyc3R0aW1lID0gMDsKICAgfQoKICAgdG5sLT5Ecml2ZXIuUnVuUGlwZWxpbmUgPSBtYWNoNjRSdW5QaXBlbGluZTsKICAgdG5sLT5Ecml2ZXIuUmVuZGVyLlN0YXJ0ID0gbWFjaDY0UmVuZGVyU3RhcnQ7CiAgIHRubC0+RHJpdmVyLlJlbmRlci5GaW5pc2ggPSBtYWNoNjRSZW5kZXJGaW5pc2g7CiAgIHRubC0+RHJpdmVyLlJlbmRlci5QcmltaXRpdmVOb3RpZnkgPSBtYWNoNjRSZW5kZXJQcmltaXRpdmU7CiAgIHRubC0+RHJpdmVyLlJlbmRlci5SZXNldExpbmVTdGlwcGxlID0gX3N3cmFzdF9SZXNldExpbmVTdGlwcGxlOwogICB0bmwtPkRyaXZlci5SZW5kZXIuQnVpbGRWZXJ0aWNlcyA9IG1hY2g2NEJ1aWxkVmVydGljZXM7Cn0K