LyoKICogVkdBIGhhcmR3YXJlIGVtdWxhdGlvbgogKgogKiBDb3B5cmlnaHQgMTk5OCBPdmUgS+V2ZW4gKHdpdGggc29tZSBoZWxwIGZyb20gTWFyY3VzIE1laXNzbmVyKQogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EKICovCgojaW5jbHVkZSA8c3RkYXJnLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KCiNkZWZpbmUgTk9OQU1FTEVTU1VOSU9OCiNkZWZpbmUgTk9OQU1FTEVTU1NUUlVDVAojaW5jbHVkZSAid2luZGVmLmgiCiNpbmNsdWRlICJ3aW5iYXNlLmgiCiNpbmNsdWRlICJ3aW5nZGkuaCIKI2luY2x1ZGUgIndpbnVzZXIuaCIKI2luY2x1ZGUgIndpbmNvbi5oIgojaW5jbHVkZSAiZG9zZXhlLmgiCiNpbmNsdWRlICJ2Z2EuaCIKI2luY2x1ZGUgImRkcmF3LmgiCiNpbmNsdWRlICJ3aW5lL2RlYnVnLmgiCgpXSU5FX0RFRkFVTFRfREVCVUdfQ0hBTk5FTChkZHJhdyk7CgpzdGF0aWMgSURpcmVjdERyYXcgKmxwZGRyYXcgPSBOVUxMOwpzdGF0aWMgSURpcmVjdERyYXdTdXJmYWNlICpscGRkc3VyZjsKc3RhdGljIElEaXJlY3REcmF3UGFsZXR0ZSAqbHBkZHBhbDsKc3RhdGljIEREU1VSRkFDRURFU0Mgc2Rlc2M7CgpzdGF0aWMgQk9PTCB2Z2FfcmV0cmFjZV92ZXJ0aWNhbDsKc3RhdGljIEJPT0wgdmdhX3JldHJhY2VfaG9yaXpvbnRhbDsKCi8qCiAqIFNpemUgYW5kIGxvY2F0aW9uIG9mIFZHQSBjb250cm9sbGVyIHdpbmRvdyB0byBmcmFtZWJ1ZmZlci4KICoKICogTm90ZTogV2Ugc3VwcG9ydCBvbmx5IHNpbmdsZSB3aW5kb3cgZXZlbiB0aG91Z2ggc29tZQogKiAgICAgICBjb250cm9sbGVycyBzdXBwb3J0IHR3by4gVGhpcyBzaG91bGQgbm90IGJlIGNoYW5nZWQgdW5sZXNzCiAqICAgICAgIHRoZXJlIGFyZSBwcm9ncmFtcyB0aGF0IGRlcGVuZCBvbiBoYXZpbmcgdHdvIHdpbmRvd3MuCiAqLwojZGVmaW5lIFZHQV9XSU5ET1dfU0laRSAgKDY0ICogMTAyNCkKI2RlZmluZSBWR0FfV0lORE9XX1NUQVJUICgoY2hhciAqKTB4YTAwMDApCgovKgogKiBWR0EgY29udHJvbGxlciBtZW1vcnkgaXMgZW11bGF0ZWQgdXNpbmcgbGluZWFyIGZyYW1lYnVmZmVyLgogKiBUaGlzIGZyYW1idWZmZXIgYWxzbyBhY3RzIGFzIGFuIGludGVyZmFjZQogKiBiZXR3ZWVuIFZHQSBjb250cm9sbGVyIGVtdWxhdGlvbiBhbmQgRGlyZWN0RHJhdy4KICoKICogdmdhX2ZiX3dpZHRoOiBEaXNwbGF5IHdpZHRoIGluIHBpeGVscy4gQ2FuIGJlIG1vZGlmaWVkIHdoZW4KICogICAgICAgICAgICAgICBkaXNwbGF5IG1vZGUgaXMgY2hhbmdlZC4KICogdmdhX2ZiX2hlaWdodDogRGlzcGxheSBoZWlnaHQgaW4gcGl4ZWxzLiBDYW4gYmUgbW9kaWZpZWQgd2hlbgogKiAgICAgICAgICAgICAgICBkaXNwbGF5IG1vZGUgaXMgY2hhbmdlZC4KICogdmdhX2ZiX2RlcHRoOiBOdW1iZXIgb2YgYml0cyB1c2VkIHRvIHN0b3JlIHNpbmdsZSBwaXhlbCBjb2xvciBpbmZvcm1hdGlvbi4KICogICAgICAgICAgICAgICBFYWNoIHBpeGVsIHVzZXMgKHZnYV9mYl9kZXB0aCs3KS84IGJ5dGVzIGJlY2F1c2UKICogICAgICAgICAgICAgICAxLTE2IGNvbG9yIG1vZGVzIGFyZSBtYXBwZWQgdG8gMjU2IGNvbG9yIG1vZGUuCiAqICAgICAgICAgICAgICAgQ2FuIGJlIG1vZGlmaWVkIHdoZW4gZGlzcGxheSBtb2RlIGlzIGNoYW5nZWQuCiAqIHZnYV9mYl9waXRjaDogSG93IG1hbnkgYnl0ZXMgdG8gYWRkIHRvIHBvaW50ZXIgaW4gb3JkZXIgdG8gbW92ZQogKiAgICAgICAgICAgICAgIGZyb20gb25lIHJvdyB0byBhbm90aGVyLiBUaGlzIGlzIGZpeGVkIGluIFZHQSBtb2RlcywKICogICAgICAgICAgICAgICBidXQgY2FuIGJlIG1vZGlmaWVkIGluIFNWR0EgbW9kZXMuCiAqIHZnYV9mYl9vZmZzZXQ6IE9mZnNldCBhZGRlZCB0byBmcmFtZWJ1ZmZlciBzdGFydCBhZGRyZXNzIGluIG9yZGVyCiAqICAgICAgICAgICAgICAgIHRvIGZpbmQgdGhlIGRpc3BsYXkgb3JpZ2luLiBQcm9ncmFtcyB1c2UgdGhpcyB0byBkbwogKiAgICAgICAgICAgICAgICBkb3VibGUgYnVmZmVyaW5nIGFuZCB0byBzY3JvbGwgZGlzcGxheS4gVGhlIHZhbHVlIGNhbgogKiAgICAgICAgICAgICAgICBiZSBtb2RpZmllZCBpbiBWR0EgYW5kIFNWR0EgbW9kZXMuCiAqIHZnYV9mYl9zaXplOiBIb3cgbWFueSBieXRlcyBhcmUgYWxsb2NhdGVkIHRvIGZyYW1lYnVmZmVyLgogKiAgICAgICAgICAgICAgVkdBIGZyYW1lYnVmZmVycyBhcmUgYWx3YXlzIGxhcmdlciB0aGFuIGRpc3BsYXkgc2l6ZSBhbmQKICogICAgICAgICAgICAgIFNWR0EgZnJhbWVidWZmZXJzIG1heSBhbHNvIGJlLgogKiB2Z2FfZmJfZGF0YTogUG9pbnRlciB0byBmcmFtZWJ1ZmZlciBzdGFydC4KICogdmdhX2ZiX3dpbmRvdzogT2Zmc2V0IG9mIDY0ayB3aW5kb3cgMHhhMDAwMCBpbiBieXRlcyBmcm9tIGZyYW1lYnVmZmVyIHN0YXJ0LgogKiAgICAgICAgICAgICAgICBUaGlzIHZhbHVlIGlzID49IDAsIGlmIG1vZGUgdXNlcyBsaW5lYXIgZnJhbWVidWZmZXIgYW5kCiAqICAgICAgICAgICAgICAgIC0xLCBpZiBtb2RlIHVzZXMgY29sb3IgcGxhbmVzLiBUaGlzIHZhbHVlIGlzIGZpeGVkCiAqICAgICAgICAgICAgICAgIGluIGFsbCBtb2RlcyBleGNlcHQgMHgxMyAoMjU2IGNvbG9yIFZHQSkgd2hlcmUKICogICAgICAgICAgICAgICAgMCBtZWFucyBub3JtYWwgbW9kZSBhbmQgLTEgbWVhbnMgTW9kZS1YICh1bmNoYWluZWQgbW9kZSkuCiAqLwpzdGF0aWMgaW50ICAgdmdhX2ZiX3dpZHRoOwpzdGF0aWMgaW50ICAgdmdhX2ZiX2hlaWdodDsKc3RhdGljIGludCAgIHZnYV9mYl9kZXB0aDsKc3RhdGljIGludCAgIHZnYV9mYl9waXRjaDsKc3RhdGljIGludCAgIHZnYV9mYl9vZmZzZXQ7CnN0YXRpYyBpbnQgICB2Z2FfZmJfc2l6ZSA9IDA7CnN0YXRpYyBjaGFyICp2Z2FfZmJfZGF0YSA9IDA7CnN0YXRpYyBpbnQgICB2Z2FfZmJfd2luZG93ID0gMDsKCi8qCiAqIFZHQSB0ZXh0IG1vZGUgZGF0YS4KICoKICogdmdhX3RleHRfYXR0cjogQ3VycmVudCBhY3RpdmUgYXR0cmlidXRlLgogKiB2Z2FfdGV4dF9vbGQ6IExhc3QgZGF0YSBzZW50IHRvIGNvbnNvbGUuIAogKiAgICAgICAgICAgICAgIFRoaXMgaXMgdXNlZCB0byBvcHRpbWl6ZSBjb25zb2xlIHVwZGF0ZXMuCiAqIHZnYV90ZXh0X3dpZHRoOiAgV2lkdGggb2YgdGhlIHRleHQgZGlzcGxheSBpbiBjaGFyYWN0ZXJzLgogKiB2Z2FfdGV4dF9oZWlnaHQ6IEhlaWdodCBvZiB0aGUgdGV4dCBkaXNwbGF5IGluIGNoYXJhY3RlcnMuCiAqIHZnYV90ZXh0X3g6IEN1cnJlbnQgY3Vyc29yIFgtcG9zaXRpb24uIFN0YXJ0cyBmcm9tIHplcm8uCiAqIHZnYV90ZXh0X3k6IEN1cnJlbnQgY3Vyc29yIFktcG9zaXRpb24uIFN0YXJ0cyBmcm9tIHplcm8uCiAqIHZnYV90ZXh0X2NvbnNvbGU6IFRSVUUgaWYgc3Rkb3V0IGlzIGNvbnNvbGUsIAogKiAgICAgICAgICAgICAgICAgICBGQUxTRSBpZiBpdCBpcyByZWd1bGFyIGZpbGUuCiAqLwpzdGF0aWMgQllURSAgdmdhX3RleHRfYXR0cjsKc3RhdGljIGNoYXIgKnZnYV90ZXh0X29sZCA9IE5VTEw7CnN0YXRpYyBCWVRFICB2Z2FfdGV4dF93aWR0aDsKc3RhdGljIEJZVEUgIHZnYV90ZXh0X2hlaWdodDsKc3RhdGljIEJZVEUgIHZnYV90ZXh0X3g7CnN0YXRpYyBCWVRFICB2Z2FfdGV4dF95OwpzdGF0aWMgQk9PTCAgdmdhX3RleHRfY29uc29sZTsKCi8qCiAqIFZHQSBjb250cm9sbGVyIHBvcnRzIDB4M2MwLCAweDNjNCwgMHgzY2UgYW5kIDB4M2Q0IGFyZQogKiBpbmRleGVkIHJlZ2lzdGVycy4gVGhlc2UgcG9ydHMgYXJlIHVzZWQgdG8gc2VsZWN0IFZHQSBjb250cm9sbGVyCiAqIHN1YnJlZ2lzdGVyIHRoYXQgY2FuIGJlIHdyaXR0ZW4gdG8gb3IgcmVhZCBmcm9tIHVzaW5nIHBvcnRzIDB4M2MxLAogKiAweDNjNSwgMHgzY2Ygb3IgMHgzZDUuIFNlbGVjdGVkIHN1YnJlZ2lzdGVyIGluZGV4ZXMgYXJlCiAqIHN0b3JlZCBpbiB2YXJpYWJsZXMgdmdhX2luZGV4XyouCiAqCiAqIFBvcnQgMHgzYzAgaXMgc3BlY2lhbCBiZWNhdXNlIGl0IGlzIGJvdGggaW5kZXggYW5kCiAqIGRhdGEtd3JpdGUgcmVnaXN0ZXIuIEZsaXAtZmxvcCB2Z2FfYWRkcmVzc18zYzAgdGVsbHMgd2hldGhlcgogKiB0aGUgcG9ydCBhY3RzIGN1cnJlbnRseSBhcyBhbiBhZGRyZXNzIHJlZ2lzdGVyLiBSZWFkaW5nIGZyb20gcG9ydAogKiAweDNkYSByZXNldHMgdGhlIGZsaXAtZmxvcCB0byBhZGRyZXNzIG1vZGUuCiAqLwpzdGF0aWMgQllURSB2Z2FfaW5kZXhfM2MwOwpzdGF0aWMgQllURSB2Z2FfaW5kZXhfM2M0OwpzdGF0aWMgQllURSB2Z2FfaW5kZXhfM2NlOwpzdGF0aWMgQllURSB2Z2FfaW5kZXhfM2Q0OwpzdGF0aWMgQk9PTCB2Z2FfYWRkcmVzc18zYzAgPSBUUlVFOwoKLyoKICogVGhpcyBtdXRleCBpcyB1c2VkIHRvIHByb3RlY3QgVkdBIHN0YXRlIGR1cmluZyBhc3luY2hyb25vdXMKICogc2NyZWVuIHVwZGF0ZXMgKHNlZSBWR0FfUG9sbCkuIEl0IG1ha2VzIHN1cmUgdGhhdCBWR0Egc3RhdGUgY2hhbmdlcwogKiBhcmUgYXRvbWljIGFuZCB0aGUgdXNlciBpbnRlcmZhY2UgaXMgcHJvdGVjdGVkIGZyb20gZmxpY2tlciBhbmQKICogY29ycnVwdGlvbi4KICoKICogVGhlIG11dGV4IGFjdHVhbGx5IHNlcmlhbGl6ZXMgVkdBIG9wZXJhdGlvbnMgYW5kIHRoZSBzY3JlZW4gdXBkYXRlLiAKICogV2hpY2ggbWVhbnMgdGhhdCB3aGVuZXZlciBWR0FfUG9sbCBvY2N1cnMsIGFwcGxpY2F0aW9uIHN0YWxscyBpZiBpdCAKICogdHJpZXMgdG8gbW9kaWZ5IFZHQSBzdGF0ZS4gVGhpcyBpcyBub3QgaG93IHJlYWwgVkdBIGFkYXB0ZXJzIHdvcmssCiAqIGJ1dCBpdCBtYWtlcyB0aW1pbmcgYW5kIGNvcnJlY3RuZXNzIGlzc3VlcyBtdWNoIGVhc2llciB0byBkZWFsIHdpdGguCiAqLwpzdGF0aWMgQ1JJVElDQUxfU0VDVElPTiB2Z2FfbG9jazsKc3RhdGljIENSSVRJQ0FMX1NFQ1RJT05fREVCVUcgY3JpdHNlY3RfZGVidWcgPQp7CiAgICAwLCAwLCAmdmdhX2xvY2ssCiAgICB7ICZjcml0c2VjdF9kZWJ1Zy5Qcm9jZXNzTG9ja3NMaXN0LCAmY3JpdHNlY3RfZGVidWcuUHJvY2Vzc0xvY2tzTGlzdCB9LAogICAgICAwLCAwLCB7IChEV09SRF9QVFIpKF9fRklMRV9fICI6IHZnYV9sb2NrIikgfQp9OwpzdGF0aWMgQ1JJVElDQUxfU0VDVElPTiB2Z2FfbG9jayA9IHsgJmNyaXRzZWN0X2RlYnVnLCAtMSwgMCwgMCwgMCwgMCB9OwoKdHlwZWRlZiBIUkVTVUxUIChXSU5BUEkgKkRpcmVjdERyYXdDcmVhdGVQcm9jKShMUEdVSUQsTFBESVJFQ1REUkFXICosTFBVTktOT1dOKTsKc3RhdGljIERpcmVjdERyYXdDcmVhdGVQcm9jIHBEaXJlY3REcmF3Q3JlYXRlOwoKc3RhdGljIHZvaWQgQ0FMTEJBQ0sgVkdBX1BvbGwoIExQVk9JRCBhcmcsIERXT1JEIGxvdywgRFdPUkQgaGlnaCApOwoKc3RhdGljIEhXTkQgdmdhX2h3bmQgPSBOVUxMOwoKLyoKICogRm9yIHNpbXBsaWNpdHksIEknbSBjcmVhdGluZyBhIHNlY29uZCBwYWxldHRlLgogKiAxNiBjb2xvciBhY2Nlc3NlcyB3aWxsIHVzZSB0aGVzZSBwb2ludGVycyBhbmQgaW5zZXJ0CiAqIGVudHJpZXMgZnJvbSB0aGUgNjQtY29sb3IgcGFsZXR0ZSBpbnRvIHRoZSBkZWZhdWx0CiAqIHBhbGV0dGUuICAgLS1Sb2JlcnQgJ0FkbWlyYWwnIENvZXltYW4KICovCgpzdGF0aWMgY2hhciB2Z2FfMTZfcGFsZXR0ZVsxN109ewogIDB4MDAsICAvKiAwIC0gQmxhY2sgICAgICAgICAqLwogIDB4MDEsICAvKiAxIC0gQmx1ZSAgICAgICAgICAqLwogIDB4MDIsICAvKiAyIC0gR3JlZW4gICAgICAgICAqLwogIDB4MDMsICAvKiAzIC0gQ3lhbiAgICAgICAgICAqLwogIDB4MDQsICAvKiA0IC0gUmVkICAgICAgICAgICAqLwogIDB4MDUsICAvKiA1IC0gTWFnZW50YSAgICAgICAqLwogIDB4MTQsICAvKiA2IC0gQnJvd24gICAgICAgICAqLwogIDB4MDcsICAvKiA3IC0gTGlnaHQgZ3JheSAgICAqLwogIDB4MzgsICAvKiA4IC0gRGFyayBncmF5ICAgICAqLwogIDB4MzksICAvKiA5IC0gTGlnaHQgYmx1ZSAgICAqLwogIDB4M2EsICAvKiBBIC0gTGlnaHQgZ3JlZW4gICAqLwogIDB4M2IsICAvKiBCIC0gTGlnaHQgY3lhbiAgICAqLwogIDB4M2MsICAvKiBDIC0gTGlnaHQgcmVkICAgICAqLwogIDB4M2QsICAvKiBEIC0gTGlnaHQgbWFnZW50YSAqLwogIDB4M2UsICAvKiBFIC0gWWVsbG93ICAgICAgICAqLwogIDB4M2YsICAvKiBGIC0gV2hpdGUgICAgICAgICAqLwogIDB4MDAgICAvKiBCb3JkZXIgQ29sb3IgICAgICAqLwp9OwoKc3RhdGljIFBBTEVUVEVFTlRSWSB2Z2FfZGVmX3BhbGV0dGVbMjU2XT17Ci8qIHJlZCAgZ3JlZW4gIGJsdWUgKi8KICB7MHgwMCwgMHgwMCwgMHgwMH0sIC8qIDAgLSBCbGFjayAqLwogIHsweDAwLCAweDAwLCAweDgwfSwgLyogMSAtIEJsdWUgKi8KICB7MHgwMCwgMHg4MCwgMHgwMH0sIC8qIDIgLSBHcmVlbiAqLwogIHsweDAwLCAweDgwLCAweDgwfSwgLyogMyAtIEN5YW4gKi8KICB7MHg4MCwgMHgwMCwgMHgwMH0sIC8qIDQgLSBSZWQgKi8KICB7MHg4MCwgMHgwMCwgMHg4MH0sIC8qIDUgLSBNYWdlbnRhICovCiAgezB4ODAsIDB4ODAsIDB4MDB9LCAvKiA2IC0gQnJvd24gKi8KICB7MHhDMCwgMHhDMCwgMHhDMH0sIC8qIDcgLSBMaWdodCBncmF5ICovCiAgezB4ODAsIDB4ODAsIDB4ODB9LCAvKiA4IC0gRGFyayBncmF5ICovCiAgezB4MDAsIDB4MDAsIDB4RkZ9LCAvKiA5IC0gTGlnaHQgYmx1ZSAqLwogIHsweDAwLCAweEZGLCAweDAwfSwgLyogQSAtIExpZ2h0IGdyZWVuICovCiAgezB4MDAsIDB4RkYsIDB4RkZ9LCAvKiBCIC0gTGlnaHQgY3lhbiAqLwogIHsweEZGLCAweDAwLCAweDAwfSwgLyogQyAtIExpZ2h0IHJlZCAqLwogIHsweEZGLCAweDAwLCAweEZGfSwgLyogRCAtIExpZ2h0IG1hZ2VudGEgKi8KICB7MHhGRiwgMHhGRiwgMHgwMH0sIC8qIEUgLSBZZWxsb3cgKi8KICB7MHhGRiwgMHhGRiwgMHhGRn0sIC8qIEYgLSBXaGl0ZSAqLwogIHswLDAsMH0gLyogRklYTUU6IGEgc2VyaWVzIG9mIGNvbnRpbnVvdXMgcmFpbmJvdyBodWVzIHNob3VsZCBmb2xsb3cgKi8KfTsKCi8qCiAqICAgVGhpcyBwYWxldHRlIGlzIHRoZSBkb3MgZGVmYXVsdCwgY29udmVydGVkIGZyb20gMTggYml0IGNvbG9yIHRvIDI0LgogKiAgICAgIEl0IGNvbnRhaW5zIG9ubHkgNjQgZW50cmllcyBvZiBjb2xvcnMtLWFsbCBvdGhlcnMgYXJlIHplcm9zLgogKiAgICAgICAgICAtLVJvYmVydCAnQWRtaXJhbCcgQ29leW1hbgogKi8Kc3RhdGljIFBBTEVUVEVFTlRSWSB2Z2FfZGVmNjRfcGFsZXR0ZVsyNTZdPXsKLyogcmVkICBncmVlbiAgYmx1ZSAqLwogIHsweDAwLCAweDAwLCAweDAwfSwgLyogMHgwMCAgICAgIEJsYWNrICAgICAgKi8KICB7MHgwMCwgMHgwMCwgMHhhYX0sIC8qIDB4MDEgICAgICBCbHVlICAgICAgICovCiAgezB4MDAsIDB4YWEsIDB4MDB9LCAvKiAweDAyICAgICAgR3JlZW4gICAgICAqLwogIHsweDAwLCAweGFhLCAweGFhfSwgLyogMHgwMyAgICAgIEN5YW4gICAgICAgKi8KICB7MHhhYSwgMHgwMCwgMHgwMH0sIC8qIDB4MDQgICAgICBSZWQgICAgICAgICovCiAgezB4YWEsIDB4MDAsIDB4YWF9LCAvKiAweDA1ICAgICAgTWFnZW50YSAgICAqLwogIHsweGFhLCAweGFhLCAweDAwfSwgLyogMHgwNiAgICAgICovCiAgezB4YWEsIDB4YWEsIDB4YWF9LCAvKiAweDA3ICAgICAgTGlnaHQgR3JheSAqLwogIHsweDAwLCAweDAwLCAweDU1fSwgLyogMHgwOCAgICAgICovCiAgezB4MDAsIDB4MDAsIDB4ZmZ9LCAvKiAweDA5ICAgICAgKi8KICB7MHgwMCwgMHhhYSwgMHg1NX0sIC8qIDB4MGEgICAgICAqLwogIHsweDAwLCAweGFhLCAweGZmfSwgLyogMHgwYiAgICAgICovCiAgezB4YWEsIDB4MDAsIDB4NTV9LCAvKiAweDBjICAgICAgKi8KICB7MHhhYSwgMHgwMCwgMHhmZn0sIC8qIDB4MGQgICAgICAqLwogIHsweGFhLCAweGFhLCAweDU1fSwgLyogMHgwZSAgICAgICovCiAgezB4YWEsIDB4YWEsIDB4ZmZ9LCAvKiAweDBmICAgICAgKi8KICB7MHgwMCwgMHg1NSwgMHgwMH0sIC8qIDB4MTAgICAgICAqLwogIHsweDAwLCAweDU1LCAweGFhfSwgLyogMHgxMSAgICAgICovCiAgezB4MDAsIDB4ZmYsIDB4MDB9LCAvKiAweDEyICAgICAgKi8KICB7MHgwMCwgMHhmZiwgMHhhYX0sIC8qIDB4MTMgICAgICAqLwogIHsweGFhLCAweDU1LCAweDAwfSwgLyogMHgxNCAgICAgIEJyb3duICAgICAgKi8KICB7MHhhYSwgMHg1NSwgMHhhYX0sIC8qIDB4MTUgICAgICAqLwogIHsweGFhLCAweGZmLCAweDAwfSwgLyogMHgxNiAgICAgICovCiAgezB4YWEsIDB4ZmYsIDB4YWF9LCAvKiAweDE3ICAgICAgKi8KICB7MHgwMCwgMHg1NSwgMHg1NX0sIC8qIDB4MTggICAgICAqLwogIHsweDAwLCAweDU1LCAweGZmfSwgLyogMHgxOSAgICAgICovCiAgezB4MDAsIDB4ZmYsIDB4NTV9LCAvKiAweDFhICAgICAgKi8KICB7MHgwMCwgMHhmZiwgMHhmZn0sIC8qIDB4MWIgICAgICAqLwogIHsweGFhLCAweDU1LCAweDU1fSwgLyogMHgxYyAgICAgICovCiAgezB4YWEsIDB4NTUsIDB4ZmZ9LCAvKiAweDFkICAgICAgKi8KICB7MHhhYSwgMHhmZiwgMHg1NX0sIC8qIDB4MWUgICAgICAqLwogIHsweGFhLCAweGZmLCAweGZmfSwgLyogMHgxZiAgICAgICovCiAgezB4NTUsIDB4MDAsIDB4MDB9LCAvKiAweDIwICAgICAgKi8KICB7MHg1NSwgMHgwMCwgMHhhYX0sIC8qIDB4MjEgICAgICAqLwogIHsweDU1LCAweGFhLCAweDAwfSwgLyogMHgyMiAgICAgICovCiAgezB4NTUsIDB4YWEsIDB4YWF9LCAvKiAweDIzICAgICAgKi8KICB7MHhmZiwgMHgwMCwgMHgwMH0sIC8qIDB4MjQgICAgICAqLwogIHsweGZmLCAweDAwLCAweGFhfSwgLyogMHgyNSAgICAgICovCiAgezB4ZmYsIDB4YWEsIDB4MDB9LCAvKiAweDI2ICAgICAgKi8KICB7MHhmZiwgMHhhYSwgMHhhYX0sIC8qIDB4MjcgICAgICAqLwogIHsweDU1LCAweDAwLCAweDU1fSwgLyogMHgyOCAgICAgICovCiAgezB4NTUsIDB4MDAsIDB4ZmZ9LCAvKiAweDI5ICAgICAgKi8KICB7MHg1NSwgMHhhYSwgMHg1NX0sIC8qIDB4MmEgICAgICAqLwogIHsweDU1LCAweGFhLCAweGZmfSwgLyogMHgyYiAgICAgICovCiAgezB4ZmYsIDB4MDAsIDB4NTV9LCAvKiAweDJjICAgICAgKi8KICB7MHhmZiwgMHgwMCwgMHhmZn0sIC8qIDB4MmQgICAgICAqLwogIHsweGZmLCAweGFhLCAweDU1fSwgLyogMHgyZSAgICAgICovCiAgezB4ZmYsIDB4YWEsIDB4ZmZ9LCAvKiAweDJmICAgICAgKi8KICB7MHg1NSwgMHg1NSwgMHgwMH0sIC8qIDB4MzAgICAgICAqLwogIHsweDU1LCAweDU1LCAweGFhfSwgLyogMHgzMSAgICAgICovCiAgezB4NTUsIDB4ZmYsIDB4MDB9LCAvKiAweDMyICAgICAgKi8KICB7MHg1NSwgMHhmZiwgMHhhYX0sIC8qIDB4MzMgICAgICAqLwogIHsweGZmLCAweDU1LCAweDAwfSwgLyogMHgzNCAgICAgICovCiAgezB4ZmYsIDB4NTUsIDB4YWF9LCAvKiAweDM1ICAgICAgKi8KICB7MHhmZiwgMHhmZiwgMHgwMH0sIC8qIDB4MzYgICAgICAqLwogIHsweGZmLCAweGZmLCAweGFhfSwgLyogMHgzNyAgICAgICovCiAgezB4NTUsIDB4NTUsIDB4NTV9LCAvKiAweDM4ICAgICAgRGFyayBHcmF5ICAgICAqLwogIHsweDU1LCAweDU1LCAweGZmfSwgLyogMHgzOSAgICAgIExpZ2h0IEJsdWUgICAgKi8KICB7MHg1NSwgMHhmZiwgMHg1NX0sIC8qIDB4M2EgICAgICBMaWdodCBHcmVlbiAgICovCiAgezB4NTUsIDB4ZmYsIDB4ZmZ9LCAvKiAweDNiICAgICAgTGlnaHQgQ3lhbiAgICAqLwogIHsweGZmLCAweDU1LCAweDU1fSwgLyogMHgzYyAgICAgIExpZ2h0IFJlZCAgICAgKi8KICB7MHhmZiwgMHg1NSwgMHhmZn0sIC8qIDB4M2QgICAgICBMaWdodCBNYWdlbnRhICovCiAgezB4ZmYsIDB4ZmYsIDB4NTV9LCAvKiAweDNlICAgICAgWWVsbG93ICAgICAgICAqLwogIHsweGZmLCAweGZmLCAweGZmfSwgLyogMHgzZiAgICAgIFdoaXRlICAgICAgICAgKi8KICB7MCwwLDB9IC8qIFRoZSBuZXh0IDE5MiBlbnRyaWVzIGFyZSBhbGwgemVyb3MgICovCn07CgpzdGF0aWMgSEFORExFIFZHQV90aW1lcjsKc3RhdGljIEhBTkRMRSBWR0FfdGltZXJfdGhyZWFkOwoKLyogc2V0IHRoZSB0aW1lciByYXRlOyBjYWxsZWQgaW4gdGhlIHBvbGxpbmcgdGhyZWFkIGNvbnRleHQgKi8Kc3RhdGljIHZvaWQgQ0FMTEJBQ0sgc2V0X3RpbWVyX3JhdGUoIFVMT05HX1BUUiBhcmcgKQp7CiAgICBMQVJHRV9JTlRFR0VSIHdoZW47CgogICAgd2hlbi51Lkxvd1BhcnQgPSB3aGVuLnUuSGlnaFBhcnQgPSAwOwogICAgU2V0V2FpdGFibGVUaW1lciggVkdBX3RpbWVyLCAmd2hlbiwgYXJnLCBWR0FfUG9sbCwgMCwgRkFMU0UgKTsKfQoKc3RhdGljIERXT1JEIENBTExCQUNLIFZHQV9UaW1lclRocmVhZCggdm9pZCAqZHVtbXkgKQp7CiAgICBmb3IgKDs7KSBTbGVlcEV4KCBJTkZJTklURSwgVFJVRSApOwp9CgpzdGF0aWMgdm9pZCBWR0FfRGVpbnN0YWxsVGltZXIodm9pZCkKewogICAgaWYgKFZHQV90aW1lcl90aHJlYWQpCiAgICB7CiAgICAgICAgLyoKICAgICAgICAgKiBNYWtlIHN1cmUgdGhlIHVwZGF0ZSB0aHJlYWQgaXMgbm90IGhvbGRpbmcKICAgICAgICAgKiBzeXN0ZW0gcmVzb3VyY2VzIHdoZW4gd2Uga2lsbCBpdC4KICAgICAgICAgKgogICAgICAgICAqIE5vdywgd2Ugb25seSBuZWVkIHRvIHdvcnJ5IGFib3V0IHVwZGF0ZSB0aHJlYWQKICAgICAgICAgKiBnZXR0aW5nIHRlcm1pbmF0ZWQgd2hpbGUgaW4gRW50ZXJDcml0aWNhbFNlY3Rpb24gCiAgICAgICAgICogb3IgV2FpdEZvck11bHRpcGxlT2JqZWN0c0V4LgogICAgICAgICAqCiAgICAgICAgICogRklYTUU6IElzIHRoaXMgYSBwcm9ibGVtPwogICAgICAgICAqLwogICAgICAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCZ2Z2FfbG9jayk7CgogICAgICAgIENhbmNlbFdhaXRhYmxlVGltZXIoIFZHQV90aW1lciApOwogICAgICAgIENsb3NlSGFuZGxlKCBWR0FfdGltZXIgKTsKICAgICAgICBUZXJtaW5hdGVUaHJlYWQoIFZHQV90aW1lcl90aHJlYWQsIDAgKTsKICAgICAgICBDbG9zZUhhbmRsZSggVkdBX3RpbWVyX3RocmVhZCApOwogICAgICAgIFZHQV90aW1lcl90aHJlYWQgPSAwOwoKICAgICAgICBMZWF2ZUNyaXRpY2FsU2VjdGlvbigmdmdhX2xvY2spOwoKICAgICAgICAvKgogICAgICAgICAqIFN5bmNocm9uaXplIGRpc3BsYXkuIFRoaXMgbWFrZXMgc3VyZSB0aGF0CiAgICAgICAgICogY2hhbmdlcyB0byBkaXNwbGF5IGJlY29tZSB2aXNpYmxlIGV2ZW4gaWYgcHJvZ3JhbSAKICAgICAgICAgKiB0ZXJtaW5hdGVzIGJlZm9yZSB1cGRhdGUgdGhyZWFkIGhhZCB0aW1lIHRvIHJ1bi4KICAgICAgICAgKi8KICAgICAgICBWR0FfUG9sbCggMCwgMCwgMCApOwogICAgfQp9CgpzdGF0aWMgdm9pZCBWR0FfSW5zdGFsbFRpbWVyKHVuc2lnbmVkIFJhdGUpCnsKICAgIGlmICghVkdBX3RpbWVyX3RocmVhZCkKICAgIHsKICAgICAgICBWR0FfdGltZXIgPSBDcmVhdGVXYWl0YWJsZVRpbWVyQSggTlVMTCwgRkFMU0UsIE5VTEwgKTsKICAgICAgICBWR0FfdGltZXJfdGhyZWFkID0gQ3JlYXRlVGhyZWFkKCBOVUxMLCAwLCBWR0FfVGltZXJUaHJlYWQsIE5VTEwsIDAsIE5VTEwgKTsKICAgIH0KICAgIFF1ZXVlVXNlckFQQyggc2V0X3RpbWVyX3JhdGUsIFZHQV90aW1lcl90aHJlYWQsIChVTE9OR19QVFIpUmF0ZSApOwp9CgpzdGF0aWMgQk9PTCBWR0FfSXNUaW1lclJ1bm5pbmcodm9pZCkKewogICAgcmV0dXJuIFZHQV90aW1lcl90aHJlYWQgPyBUUlVFIDogRkFMU0U7Cn0KCnN0YXRpYyBIQU5ETEUgVkdBX0FscGhhQ29uc29sZSh2b2lkKQp7CiAgICAvKiB0aGlzIGFzc3VtZXMgdGhhdCBubyBXaW4zMiByZWRpcmVjdGlvbiBoYXMgdGFrZW4gcGxhY2UsIGJ1dCB0aGVuIGFnYWluLAogICAgICogb25seSAxNi1iaXQgYXBwcyBhcmUgbGlrZWx5IHRvIHVzZSB0aGlzIHBhcnQgb2YgV2luZS4uLiAqLwogICAgcmV0dXJuIEdldFN0ZEhhbmRsZShTVERfT1VUUFVUX0hBTkRMRSk7Cn0KCnN0YXRpYyBjaGFyKlZHQV9BbHBoYUJ1ZmZlcih2b2lkKQp7CiAgICByZXR1cm4gKGNoYXIgKikweGI4MDAwOwp9CgovKioqIEdSQVBISUNTIE1PREUgKioqLwoKdHlwZWRlZiBzdHJ1Y3QgewogIHVuc2lnbmVkIFhyZXMsIFlyZXMsIERlcHRoOwogIGludCByZXQ7Cn0gTW9kZVNldDsKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgIFZHQV9TeW5jV2luZG93CiAqCiAqIENvcHkgVkdBIHdpbmRvdyBpbnRvIGZyYW1lYnVmZmVyIChpZiBhcmd1bWVudCBpcyBUUlVFKSBvcgogKiBwYXJ0IG9mIGZyYW1lYnVmZmVyIGludG8gVkdBIHdpbmRvdyAoaWYgYXJndW1lbnQgaXMgRkFMU0UpLgogKi8Kc3RhdGljIHZvaWQgVkdBX1N5bmNXaW5kb3coIEJPT0wgdGFyZ2V0X2lzX2ZiICkKewogICAgaW50IHNpemUgPSBWR0FfV0lORE9XX1NJWkU7CgogICAgLyogV2luZG93IGRvZXMgbm90IG92ZXJsYXAgZnJhbWVidWZmZXIuICovCiAgICBpZiAodmdhX2ZiX3dpbmRvdyA+PSB2Z2FfZmJfc2l6ZSkKICAgICAgICByZXR1cm47CgogICAgLyogQ2hlY2sgaWYgd2luZG93IG92ZXJsYXBzIGZyYW1lYnVmZmVyIG9ubHkgcGFydGlhbGx5LiAqLwogICAgaWYgKHZnYV9mYl9zaXplIC0gdmdhX2ZiX3dpbmRvdyA8IFZHQV9XSU5ET1dfU0laRSkKICAgICAgICBzaXplID0gdmdhX2ZiX3NpemUgLSB2Z2FfZmJfd2luZG93OwoKICAgIGlmICh0YXJnZXRfaXNfZmIpCiAgICAgICAgbWVtbW92ZSggdmdhX2ZiX2RhdGEgKyB2Z2FfZmJfd2luZG93LCBWR0FfV0lORE9XX1NUQVJULCBzaXplICk7CiAgICBlbHNlCiAgICAgICAgbWVtbW92ZSggVkdBX1dJTkRPV19TVEFSVCwgdmdhX2ZiX2RhdGEgKyB2Z2FfZmJfd2luZG93LCBzaXplICk7Cn0KCgpzdGF0aWMgdm9pZCBXSU5BUEkgVkdBX0RvRXhpdChVTE9OR19QVFIgYXJnKQp7CiAgICBWR0FfRGVpbnN0YWxsVGltZXIoKTsKICAgIElEaXJlY3REcmF3U3VyZmFjZV9TZXRQYWxldHRlKGxwZGRzdXJmLE5VTEwpOwogICAgSURpcmVjdERyYXdTdXJmYWNlX1JlbGVhc2UobHBkZHN1cmYpOwogICAgbHBkZHN1cmY9TlVMTDsKICAgIElEaXJlY3REcmF3UGFsZXR0ZV9SZWxlYXNlKGxwZGRwYWwpOwogICAgbHBkZHBhbD1OVUxMOwogICAgSURpcmVjdERyYXdfUmVsZWFzZShscGRkcmF3KTsKICAgIGxwZGRyYXc9TlVMTDsKfQoKc3RhdGljIHZvaWQgV0lOQVBJIFZHQV9Eb1NldE1vZGUoVUxPTkdfUFRSIGFyZykKewogICAgTFJFU1VMVAlyZXM7CiAgICBNb2RlU2V0ICpwYXIgPSAoTW9kZVNldCAqKWFyZzsKICAgIHBhci0+cmV0PTE7CgogICAgaWYgKGxwZGRyYXcpIFZHQV9Eb0V4aXQoMCk7CiAgICBpZiAoIWxwZGRyYXcpIHsKICAgICAgICBpZiAoIXBEaXJlY3REcmF3Q3JlYXRlKQogICAgICAgIHsKICAgICAgICAgICAgSE1PRFVMRSBobW9kID0gTG9hZExpYnJhcnlBKCAiZGRyYXcuZGxsIiApOwogICAgICAgICAgICBpZiAoaG1vZCkgcERpcmVjdERyYXdDcmVhdGUgPSAoRGlyZWN0RHJhd0NyZWF0ZVByb2MpR2V0UHJvY0FkZHJlc3MoIGhtb2QsICJEaXJlY3REcmF3Q3JlYXRlIiApOwoJICAgIGlmICghcERpcmVjdERyYXdDcmVhdGUpIHsKCQlFUlIoIkNhbid0IGxvb2t1cCBEaXJlY3REcmF3Q3JlYXRlIGZyb20gZGRyYXcuZGxsLlxuIik7CgkJcmV0dXJuOwoJICAgIH0KICAgICAgICB9CiAgICAgICAgcmVzID0gcERpcmVjdERyYXdDcmVhdGUoTlVMTCwmbHBkZHJhdyxOVUxMKTsKICAgICAgICBpZiAoIWxwZGRyYXcpIHsKICAgICAgICAgICAgRVJSKCJEaXJlY3REcmF3IGlzIG5vdCBhdmFpbGFibGUgKHJlcyA9ICVseClcbiIscmVzKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBpZiAoIXZnYV9od25kKSB7CiAgICAgICAgICAgIHZnYV9od25kID0gQ3JlYXRlV2luZG93RXhBKDAsIlNUQVRJQyIsIldJTkVET1MgVkdBIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1NfUE9QVVB8V1NfVklTSUJMRXxTU19OT1RJRlksMCwwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXItPlhyZXMscGFyLT5ZcmVzLDAsMCwwLE5VTEwpOwogICAgICAgICAgICBpZiAoIXZnYV9od25kKSB7CiAgICAgICAgICAgICAgICBFUlIoIkZhaWxlZCB0byBjcmVhdGUgdXNlciB3aW5kb3cuXG4iKTsKICAgICAgICAgICAgICAgIElEaXJlY3REcmF3X1JlbGVhc2UobHBkZHJhdyk7CiAgICAgICAgICAgICAgICBscGRkcmF3PU5VTEw7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgICAgICBTZXRXaW5kb3dQb3ModmdhX2h3bmQsMCwwLDAscGFyLT5YcmVzLHBhci0+WXJlcyxTV1BfTk9NT1ZFfFNXUF9OT1pPUkRFUik7CgogICAgICAgIGlmICgocmVzPUlEaXJlY3REcmF3X1NldENvb3BlcmF0aXZlTGV2ZWwobHBkZHJhdyx2Z2FfaHduZCxERFNDTF9GVUxMU0NSRUVOfEREU0NMX0VYQ0xVU0lWRSkpKSB7CgkgICAgRVJSKCJDb3VsZCBub3Qgc2V0IGNvb3BlcmF0aXZlIGxldmVsIHRvIGV4Y2x1c2l2ZSAoJWx4KVxuIixyZXMpOwoJfQoKICAgICAgICBpZiAoKHJlcz1JRGlyZWN0RHJhd19TZXREaXNwbGF5TW9kZShscGRkcmF3LHBhci0+WHJlcyxwYXItPllyZXMscGFyLT5EZXB0aCkpKSB7CiAgICAgICAgICAgIEVSUigiRGlyZWN0RHJhdyBkb2VzIG5vdCBzdXBwb3J0IHJlcXVlc3RlZCBkaXNwbGF5IG1vZGUgKCVkeCVkeCVkKSwgcmVzID0gJWx4IVxuIixwYXItPlhyZXMscGFyLT5ZcmVzLHBhci0+RGVwdGgscmVzKTsKICAgICAgICAgICAgSURpcmVjdERyYXdfUmVsZWFzZShscGRkcmF3KTsKICAgICAgICAgICAgbHBkZHJhdz1OVUxMOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICByZXM9SURpcmVjdERyYXdfQ3JlYXRlUGFsZXR0ZShscGRkcmF3LEREUENBUFNfOEJJVCxOVUxMLCZscGRkcGFsLE5VTEwpOwogICAgICAgIGlmIChyZXMpIHsKCSAgICBFUlIoIkNvdWxkIG5vdCBjcmVhdGUgcGFsZXR0ZSAocmVzID0gJWx4KVxuIixyZXMpOwogICAgICAgICAgICBJRGlyZWN0RHJhd19SZWxlYXNlKGxwZGRyYXcpOwogICAgICAgICAgICBscGRkcmF3PU5VTEw7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgaWYgKChyZXM9SURpcmVjdERyYXdQYWxldHRlX1NldEVudHJpZXMobHBkZHBhbCwwLDAsMjU2LHZnYV9kZWZfcGFsZXR0ZSkpKSB7CiAgICAgICAgICAgIEVSUigiQ291bGQgbm90IHNldCBkZWZhdWx0IHBhbGV0dGUgZW50cmllcyAocmVzID0gJWx4KVxuIiwgcmVzKTsKICAgICAgICB9CgogICAgICAgIG1lbXNldCgmc2Rlc2MsMCxzaXplb2Yoc2Rlc2MpKTsKICAgICAgICBzZGVzYy5kd1NpemU9c2l6ZW9mKHNkZXNjKTsKCXNkZXNjLmR3RmxhZ3MgPSBERFNEX0NBUFM7CglzZGVzYy5kZHNDYXBzLmR3Q2FwcyA9IEREU0NBUFNfUFJJTUFSWVNVUkZBQ0U7CiAgICAgICAgaWYgKElEaXJlY3REcmF3X0NyZWF0ZVN1cmZhY2UobHBkZHJhdywmc2Rlc2MsJmxwZGRzdXJmLE5VTEwpfHwoIWxwZGRzdXJmKSkgewogICAgICAgICAgICBFUlIoIkRpcmVjdERyYXcgc3VyZmFjZSBpcyBub3QgYXZhaWxhYmxlXG4iKTsKICAgICAgICAgICAgSURpcmVjdERyYXdfUmVsZWFzZShscGRkcmF3KTsKICAgICAgICAgICAgbHBkZHJhdz1OVUxMOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIElEaXJlY3REcmF3U3VyZmFjZV9TZXRQYWxldHRlKGxwZGRzdXJmLGxwZGRwYWwpOwogICAgICAgIHZnYV9yZXRyYWNlX3ZlcnRpY2FsID0gdmdhX3JldHJhY2VfaG9yaXpvbnRhbCA9IEZBTFNFOwogICAgICAgIC8qIHBvbGwgZXZlcnkgMjBtcyAoNTBmcHMgc2hvdWxkIHByb3ZpZGUgYWRlcXVhdGUgcmVzcG9uc2l2ZW5lc3MpICovCiAgICAgICAgVkdBX0luc3RhbGxUaW1lcigyMCk7CiAgICB9CiAgICBwYXItPnJldD0wOwogICAgcmV0dXJuOwp9CgppbnQgVkdBX1NldE1vZGUodW5zaWduZWQgWHJlcyx1bnNpZ25lZCBZcmVzLHVuc2lnbmVkIERlcHRoKQp7CiAgICBNb2RlU2V0IHBhcjsKICAgIGludCAgICAgbmV3U2l6ZTsKCiAgICB2Z2FfZmJfd2lkdGggPSBYcmVzOwogICAgdmdhX2ZiX2hlaWdodCA9IFlyZXM7CiAgICB2Z2FfZmJfZGVwdGggPSBEZXB0aDsKICAgIHZnYV9mYl9vZmZzZXQgPSAwOwogICAgdmdhX2ZiX3BpdGNoID0gWHJlcyAqICgoRGVwdGggKyA3KSAvIDgpOwoKICAgIG5ld1NpemUgPSBYcmVzICogWXJlcyAqICgoRGVwdGggKyA3KSAvIDgpOwogICAgaWYobmV3U2l6ZSA8IDI1NiAqIDEwMjQpCiAgICAgIG5ld1NpemUgPSAyNTYgKiAxMDI0OwoKICAgIGlmKHZnYV9mYl9zaXplIDwgbmV3U2l6ZSkgewogICAgICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCB2Z2FfZmJfZGF0YSk7CiAgICAgIHZnYV9mYl9kYXRhID0gSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksIDAsIG5ld1NpemUpOwogICAgICB2Z2FfZmJfc2l6ZSA9IG5ld1NpemU7CiAgICB9CgogICAgaWYoWHJlcyA+PSA2NDAgfHwgWXJlcyA+PSA0ODApIHsKICAgICAgcGFyLlhyZXMgPSBYcmVzOwogICAgICBwYXIuWXJlcyA9IFlyZXM7CiAgICB9IGVsc2UgewogICAgICBwYXIuWHJlcyA9IDY0MDsKICAgICAgcGFyLllyZXMgPSA0ODA7CiAgICB9CgogICAgVkdBX1NldFdpbmRvd1N0YXJ0KChEZXB0aCA8IDgpID8gLTEgOiAwKTsKCiAgICBwYXIuRGVwdGggPSAoRGVwdGggPCA4KSA/IDggOiBEZXB0aDsKCiAgICBNWl9SdW5JblRocmVhZChWR0FfRG9TZXRNb2RlLCAoVUxPTkdfUFRSKSZwYXIpOwogICAgcmV0dXJuIHBhci5yZXQ7Cn0KCmludCBWR0FfR2V0TW9kZSh1bnNpZ25lZCpIZWlnaHQsdW5zaWduZWQqV2lkdGgsdW5zaWduZWQqRGVwdGgpCnsKICAgIGlmICghbHBkZHJhdykgcmV0dXJuIDE7CiAgICBpZiAoIWxwZGRzdXJmKSByZXR1cm4gMTsKICAgIGlmIChIZWlnaHQpICpIZWlnaHQ9c2Rlc2MuZHdIZWlnaHQ7CiAgICBpZiAoV2lkdGgpICpXaWR0aD1zZGVzYy5kd1dpZHRoOwogICAgaWYgKERlcHRoKSAqRGVwdGg9c2Rlc2MuZGRwZlBpeGVsRm9ybWF0LnUxLmR3UkdCQml0Q291bnQ7CiAgICByZXR1cm4gMDsKfQoKc3RhdGljIHZvaWQgVkdBX0V4aXQodm9pZCkKewogICAgaWYgKGxwZGRyYXcpIE1aX1J1bkluVGhyZWFkKFZHQV9Eb0V4aXQsIDApOwp9Cgp2b2lkIFZHQV9TZXRQYWxldHRlKFBBTEVUVEVFTlRSWSpwYWwsaW50IHN0YXJ0LGludCBsZW4pCnsKICAgIGlmICghbHBkZHJhdykgcmV0dXJuOwogICAgSURpcmVjdERyYXdQYWxldHRlX1NldEVudHJpZXMobHBkZHBhbCwwLHN0YXJ0LGxlbixwYWwpOwp9CgovKiBzZXQgYSBzaW5nbGUgW2NoYXIgd2lkZV0gY29sb3IgaW4gMTYgY29sb3IgbW9kZS4gKi8Kdm9pZCBWR0FfU2V0Q29sb3IxNihpbnQgcmVnLGludCBjb2xvcikKewoJUEFMRVRURUVOVFJZICpwYWw7CgogICAgaWYgKCFscGRkcmF3KSByZXR1cm47CglwYWw9ICZ2Z2FfZGVmNjRfcGFsZXR0ZVtjb2xvcl07CiAgICAgICAgSURpcmVjdERyYXdQYWxldHRlX1NldEVudHJpZXMobHBkZHBhbCwwLHJlZywxLHBhbCk7Cgl2Z2FfMTZfcGFsZXR0ZVtyZWddPShjaGFyKWNvbG9yOwp9CgovKiBHZXQgYSBzaW5nbGUgW2NoYXIgd2lkZV0gY29sb3IgaW4gMTYgY29sb3IgbW9kZS4gKi8KY2hhciBWR0FfR2V0Q29sb3IxNihpbnQgcmVnKQp7CgogICAgaWYgKCFscGRkcmF3KSByZXR1cm4gMDsKCXJldHVybiAoY2hhcil2Z2FfMTZfcGFsZXR0ZVtyZWddOwp9CgovKiBzZXQgYWxsIDE3IFtjaGFyIHdpZGVdIGNvbG9ycyBhdCBvbmNlIGluIDE2IGNvbG9yIG1vZGUuICovCnZvaWQgVkdBX1NldDE2UGFsZXR0ZShjaGFyICpUYWJsZSkKewoJUEFMRVRURUVOVFJZICpwYWw7CglpbnQgYzsKCiAgICBpZiAoIWxwZGRyYXcpIHJldHVybjsgICAgICAgICAvKiByZXR1cm4gaWYgd2UncmUgaW4gdGV4dCBvbmx5IG1vZGUgKi8KICAgIG1lbWNweSggVGFibGUsICZ2Z2FfMTZfcGFsZXR0ZSwgMTcgKTsgLyogY29weSB0aGUgZW50cmllcyBpbnRvIHRoZSB0YWJsZSAqLwoKICAgIGZvciAoYz0wOyBjPDE3OyBjKyspIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDE3IGVudHJpZXMgKi8KCXBhbD0gJnZnYV9kZWY2NF9wYWxldHRlWyhpbnQpdmdhXzE2X3BhbGV0dGVbY11dOyAgLyogZ2V0IGNvbG9yICAqLwogICAgICAgIElEaXJlY3REcmF3UGFsZXR0ZV9TZXRFbnRyaWVzKGxwZGRwYWwsMCxjLDEscGFsKTsgLyogc2V0IGVudHJ5ICAqLwoJVFJBQ0UoIlBhbGV0dGUgcmVnaXN0ZXIgJWQgc2V0IHRvICVkXG4iLGMsKGludCl2Z2FfMTZfcGFsZXR0ZVtjXSk7CiAgIH0gLyogZW5kIG9mIHRoZSBjb3VudGluZyBsb29wICovCn0KCi8qIEdldCBhbGwgMTcgWyBjaGFyIHdpZGUgXSBjb2xvcnMgYXQgb25jZSBpbiAxNiBjb2xvciBtb2RlLiAqLwp2b2lkIFZHQV9HZXQxNlBhbGV0dGUoY2hhciAqVGFibGUpCnsKCiAgICBpZiAoIWxwZGRyYXcpIHJldHVybjsgICAgICAgICAvKiByZXR1cm4gaWYgd2UncmUgaW4gdGV4dCBvbmx5IG1vZGUgKi8KICAgIG1lbWNweSggJnZnYV8xNl9wYWxldHRlLCBUYWJsZSwgMTcgKTsgLyogY29weSB0aGUgZW50cmllcyBpbnRvIHRoZSB0YWJsZSAqLwp9Cgp2b2lkIFZHQV9TZXRRdWFkUGFsZXR0ZShSR0JRVUFEKmNvbG9yLGludCBzdGFydCxpbnQgbGVuKQp7CiAgICBQQUxFVFRFRU5UUlkgcGFsWzI1Nl07CiAgICBpbnQgYzsKCiAgICBpZiAoIWxwZGRyYXcpIHJldHVybjsKICAgIGZvciAoYz0wOyBjPGxlbjsgYysrKSB7CiAgICAgICAgcGFsW2NdLnBlUmVkICA9Y29sb3JbY10ucmdiUmVkOwogICAgICAgIHBhbFtjXS5wZUdyZWVuPWNvbG9yW2NdLnJnYkdyZWVuOwogICAgICAgIHBhbFtjXS5wZUJsdWUgPWNvbG9yW2NdLnJnYkJsdWU7CiAgICAgICAgcGFsW2NdLnBlRmxhZ3M9MDsKICAgIH0KICAgIElEaXJlY3REcmF3UGFsZXR0ZV9TZXRFbnRyaWVzKGxwZGRwYWwsMCxzdGFydCxsZW4scGFsKTsKfQoKc3RhdGljIExQU1RSIFZHQV9Mb2NrKHVuc2lnbmVkKlBpdGNoLHVuc2lnbmVkKkhlaWdodCx1bnNpZ25lZCpXaWR0aCx1bnNpZ25lZCpEZXB0aCkKewogICAgaWYgKCFscGRkcmF3KSByZXR1cm4gTlVMTDsKICAgIGlmICghbHBkZHN1cmYpIHJldHVybiBOVUxMOwogICAgaWYgKElEaXJlY3REcmF3U3VyZmFjZV9Mb2NrKGxwZGRzdXJmLE5VTEwsJnNkZXNjLDAsMCkpIHsKICAgICAgICBFUlIoImNvdWxkIG5vdCBsb2NrIHN1cmZhY2UhXG4iKTsKICAgICAgICByZXR1cm4gTlVMTDsKICAgIH0KICAgIGlmIChQaXRjaCkgKlBpdGNoPXNkZXNjLnUxLmxQaXRjaDsKICAgIGlmIChIZWlnaHQpICpIZWlnaHQ9c2Rlc2MuZHdIZWlnaHQ7CiAgICBpZiAoV2lkdGgpICpXaWR0aD1zZGVzYy5kd1dpZHRoOwogICAgaWYgKERlcHRoKSAqRGVwdGg9c2Rlc2MuZGRwZlBpeGVsRm9ybWF0LnUxLmR3UkdCQml0Q291bnQ7CiAgICByZXR1cm4gc2Rlc2MubHBTdXJmYWNlOwp9CgpzdGF0aWMgdm9pZCBWR0FfVW5sb2NrKHZvaWQpCnsKICAgIElEaXJlY3REcmF3U3VyZmFjZV9VbmxvY2sobHBkZHN1cmYsc2Rlc2MubHBTdXJmYWNlKTsKfQoKLyoKICogU2V0IHN0YXJ0IG9mIDY0ayB3aW5kb3cgYXQgMHhhMDAwMCBpbiBieXRlcy4KICogSWYgdmFsdWUgaXMgLTEsIGluaXRpYWxpemUgY29sb3IgcGxhbmUgc3VwcG9ydC4KICogSWYgdmFsdWUgaXMgPj0gMCwgd2luZG93IGNvbnRhaW5zIGRpcmVjdCBjb3B5IG9mIGZyYW1lYnVmZmVyLgogKi8Kdm9pZCBWR0FfU2V0V2luZG93U3RhcnQoaW50IHN0YXJ0KQp7CiAgICBpZihzdGFydCA9PSB2Z2FfZmJfd2luZG93KQogICAgICAgIHJldHVybjsKCiAgICBFbnRlckNyaXRpY2FsU2VjdGlvbigmdmdhX2xvY2spOwoKICAgIGlmKHZnYV9mYl93aW5kb3cgPT0gLTEpCiAgICAgICAgRklYTUUoIlJlbW92ZSBWR0EgbWVtb3J5IGVtdWxhdGlvbi5cbiIpOwogICAgZWxzZQogICAgICAgIFZHQV9TeW5jV2luZG93KCBUUlVFICk7CgogICAgdmdhX2ZiX3dpbmRvdyA9IHN0YXJ0OwoKICAgIGlmKHZnYV9mYl93aW5kb3cgPT0gLTEpCiAgICAgICAgRklYTUUoIkluc3RhbGwgVkdBIG1lbW9yeSBlbXVsYXRpb24uXG4iKTsKICAgIGVsc2UKICAgICAgICBWR0FfU3luY1dpbmRvdyggRkFMU0UgKTsKCiAgICBMZWF2ZUNyaXRpY2FsU2VjdGlvbigmdmdhX2xvY2spOwp9CgovKgogKiBHZXQgc3RhcnQgb2YgNjRrIHdpbmRvdyBhdCAweGEwMDAwIGluIGJ5dGVzLgogKiBWYWx1ZSBpcyAtMSBpbiBjb2xvciBwbGFuZSBtb2Rlcy4KICovCmludCBWR0FfR2V0V2luZG93U3RhcnQodm9pZCkKewogICAgcmV0dXJuIHZnYV9mYl93aW5kb3c7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgIFZHQV9Eb1Nob3dNb3VzZQogKgogKiBDYWxsYmFjayBmb3IgVkdBX1Nob3dNb3VzZS4KICovCnN0YXRpYyBXSU5BUEkgdm9pZCBWR0FfRG9TaG93TW91c2UoIFVMT05HX1BUUiBzaG93ICkKewogICAgSU5UIHJ2OwoKICAgIGRvCiAgICB7CiAgICAgICAgcnYgPSBTaG93Q3Vyc29yKCBzaG93ICk7CiAgICB9CiAgICB3aGlsZSggc2hvdyA/IChydiA8IDApIDogKHJ2ID49IDApICk7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgIFZHQV9TaG93TW91c2UKICoKICogSWYgYXJndW1lbnQgaXMgVFJVRSwgdW5jb25kaXRpb25hbGx5IHNob3cgbW91c2UgY3Vyc29yLgogKiBJZiBhcmd1bWVudCBpcyBGQUxTRSwgdW5jb25kaXRpb25hbGx5IGhpZGUgbW91c2UgY3Vyc29yLgogKiBUaGlzIG9ubHkgd29ya3MgaW4gZ3JhcGhpY3MgbW9kZS4KICovCnZvaWQgVkdBX1Nob3dNb3VzZSggQk9PTCBzaG93ICkKewogICAgaWYgKGxwZGRyYXcpCiAgICAgICAgTVpfUnVuSW5UaHJlYWQoIFZHQV9Eb1Nob3dNb3VzZSwgKFVMT05HX1BUUilzaG93ICk7Cn0KCgovKioqIFRFWFQgTU9ERSAqKiovCgovKiBwcmVwYXJlIHRoZSB0ZXh0IG1vZGUgdmlkZW8gbWVtb3J5IGNvcHkgdGhhdCBpcyB1c2VkIHRvIG9ubHkKICogdXBkYXRlIHRoZSB2aWRlbyBtZW1vcnkgbGluZSB0aGF0IGRpZCBnZXQgdXBkYXRlZC4gKi8Kc3RhdGljIHZvaWQgVkdBX1ByZXBhcmVWaWRlb01lbUNvcHkodW5zaWduZWQgWHJlcywgdW5zaWduZWQgWXJlcykKewogICAgY2hhciAqcCwgKnAyOwogICAgdW5zaWduZWQgaW50IGk7CgogICAgLyoKICAgICAqIEFsbG9jYXRlIHNwYWNlIGZvciBjaGFyICsgYXR0ci4KICAgICAqLwoKICAgIGlmICh2Z2FfdGV4dF9vbGQpCiAgICAgICAgdmdhX3RleHRfb2xkID0gSGVhcFJlQWxsb2MoIEdldFByb2Nlc3NIZWFwKCksIEhFQVBfWkVST19NRU1PUlksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZnYV90ZXh0X29sZCwgWHJlcyAqIFlyZXMgKiAyICk7CiAgICBlbHNlCiAgICAgICAgdmdhX3RleHRfb2xkID0gSGVhcEFsbG9jKCBHZXRQcm9jZXNzSGVhcCgpLCBIRUFQX1pFUk9fTUVNT1JZLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWHJlcyAqIFlyZXMgKiAyICk7CiAgICBwID0gVkdBX0FscGhhQnVmZmVyKCk7CiAgICBwMiA9IHZnYV90ZXh0X29sZDsKCiAgICAvKiBtYWtlIHN1cmUgdGhlIHZpZGVvIG1lbSBjb3B5IGNvbnRhaW5zIHRoZSBleGFjdCBvcHBvc2l0ZSBvZiBvdXIKICAgICAqIGFjdHVhbCB0ZXh0IG1vZGUgbWVtb3J5IGFyZWEgdG8gbWFrZSBzdXJlIHRoZSBzY3JlZW4KICAgICAqIGRvZXMgZ2V0IHVwZGF0ZWQgZnVsbHkgaW5pdGlhbGx5ICovCiAgICBmb3IgKGk9MDsgaSA8IFhyZXMqWXJlcyoyOyBpKyspCgkqcDIrKyA9ICpwKysgXiAweGZmOyAvKiBYT1IgaXQgKi8KfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICBWR0FfU2V0QWxwaGFNb2RlCiAqCiAqIFNldCBWR0EgZW11bGF0aW9uIHRvIHRleHQgbW9kZS4KICovCnZvaWQgVkdBX1NldEFscGhhTW9kZSh1bnNpZ25lZCBYcmVzLHVuc2lnbmVkIFlyZXMpCnsKICAgIFZHQV9FeGl0KCk7CiAgICBWR0FfRGVpbnN0YWxsVGltZXIoKTsKICAgIAogICAgVkdBX1ByZXBhcmVWaWRlb01lbUNvcHkoWHJlcywgWXJlcyk7CiAgICB2Z2FfdGV4dF93aWR0aCA9IFhyZXM7CiAgICB2Z2FfdGV4dF9oZWlnaHQgPSBZcmVzOwoKICAgIGlmICh2Z2FfdGV4dF94ID49IHZnYV90ZXh0X3dpZHRoIHx8IHZnYV90ZXh0X3kgPj0gdmdhX3RleHRfaGVpZ2h0KQogICAgICAgIFZHQV9TZXRDdXJzb3JQb3MoMCwwKTsKCiAgICBpZih2Z2FfdGV4dF9jb25zb2xlKSB7CiAgICAgICAgQ09PUkQgc2l6ZTsKICAgICAgICBzaXplLlggPSBYcmVzOwogICAgICAgIHNpemUuWSA9IFlyZXM7CiAgICAgICAgU2V0Q29uc29sZVNjcmVlbkJ1ZmZlclNpemUoIFZHQV9BbHBoYUNvbnNvbGUoKSwgc2l6ZSApOwoKICAgICAgICAvKiBwb2xsIGV2ZXJ5IDMwbXMgKDMzZnBzIHNob3VsZCBwcm92aWRlIGFkZXF1YXRlIHJlc3BvbnNpdmVuZXNzKSAqLwogICAgICAgIFZHQV9JbnN0YWxsVGltZXIoMzApOwogICAgfQp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgIFZHQV9Jbml0QWxwaGFNb2RlCiAqCiAqIEluaXRpYWxpemUgVkdBIHRleHQgbW9kZSBoYW5kbGluZyBhbmQgcmV0dXJuIGRlZmF1bHQgdGV4dCBtb2RlLgogKiBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IHNldCBWR0EgZW11bGF0aW9uIHRvIHRleHQgbW9kZS4KICovCnZvaWQgVkdBX0luaXRBbHBoYU1vZGUodW5zaWduZWQqWHJlcyx1bnNpZ25lZCpZcmVzKQp7CiAgICBDT05TT0xFX1NDUkVFTl9CVUZGRVJfSU5GTyBpbmZvOwoKICAgIGlmKEdldENvbnNvbGVTY3JlZW5CdWZmZXJJbmZvKCBWR0FfQWxwaGFDb25zb2xlKCksICZpbmZvICkpCiAgICB7CiAgICAgICAgdmdhX3RleHRfY29uc29sZSA9IFRSVUU7CiAgICAgICAgdmdhX3RleHRfeCA9IGluZm8uZHdDdXJzb3JQb3NpdGlvbi5YOwogICAgICAgIHZnYV90ZXh0X3kgPSBpbmZvLmR3Q3Vyc29yUG9zaXRpb24uWTsKICAgICAgICB2Z2FfdGV4dF9hdHRyID0gaW5mby53QXR0cmlidXRlczsKICAgICAgICAqWHJlcyA9IGluZm8uZHdTaXplLlg7CiAgICAgICAgKllyZXMgPSBpbmZvLmR3U2l6ZS5ZOwogICAgfSAKICAgIGVsc2UKICAgIHsKICAgICAgICB2Z2FfdGV4dF9jb25zb2xlID0gRkFMU0U7CiAgICAgICAgdmdhX3RleHRfeCA9IDA7CiAgICAgICAgdmdhX3RleHRfeSA9IDA7CiAgICAgICAgdmdhX3RleHRfYXR0ciA9IDB4MGY7CiAgICAgICAgKlhyZXMgPSA4MDsKICAgICAgICAqWXJlcyA9IDI1OwogICAgfQp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgIFZHQV9HZXRBbHBoYU1vZGUKICoKICogR2V0IGN1cnJlbnQgdGV4dCBtb2RlLiBSZXR1cm5zIFRSVUUgYW5kIHNldHMgcmVzb2x1dGlvbiBpZgogKiBhbnkgVkdBIHRleHQgbW9kZSBoYXMgYmVlbiBpbml0aWFsaXplZC4KICovCkJPT0wgVkdBX0dldEFscGhhTW9kZSh1bnNpZ25lZCpYcmVzLHVuc2lnbmVkKllyZXMpCnsKICAgIGlmICh2Z2FfdGV4dF93aWR0aCAhPSAwICYmIHZnYV90ZXh0X2hlaWdodCAhPSAwKSB7CiAgICAgICAgKlhyZXMgPSB2Z2FfdGV4dF93aWR0aDsKICAgICAgICAqWXJlcyA9IHZnYV90ZXh0X2hlaWdodDsKICAgICAgICByZXR1cm4gVFJVRTsKICAgIH0gZWxzZQogICAgICAgIHJldHVybiBGQUxTRTsKfQoKdm9pZCBWR0FfU2V0Q3Vyc29yU2hhcGUodW5zaWduZWQgY2hhciBzdGFydF9vcHRpb25zLCB1bnNpZ25lZCBjaGFyIGVuZCkKewogICAgQ09OU09MRV9DVVJTT1JfSU5GTyBjY2k7CgogICAgLyogc3RhbmRhcmQgY3Vyc29yIHNldHRpbmdzOgogICAgICogMHgwNjA3ID09IENHQSwgMHgwYjBjID09IG1vbm9jaHJvbWUsIDB4MGQwZSA9PSBFR0EvVkdBICovCgogICAgLyogY2FsY3VsYXRlIHBlcmNlbnRhZ2UgZnJvbSBib3R0b20gLSBhc3N1bWluZyBWR0EgKGJvdHRvbSAweDBlKSAqLwogICAgY2NpLmR3U2l6ZSA9ICgoZW5kICYgMHgxZikgLSAoc3RhcnRfb3B0aW9ucyAmIDB4MWYpKS8weDBlICogMTAwOwogICAgaWYgKCFjY2kuZHdTaXplKSBjY2kuZHdTaXplKys7IC8qIE5VTEwgY3Vyc29yIHdvdWxkIG1ha2UgU0NDSSgpIGZhaWwgISAqLwogICAgY2NpLmJWaXNpYmxlID0gKChzdGFydF9vcHRpb25zICYgMHg2MCkgIT0gMHgyMCk7IC8qIGludmlzaWJsZSA/ICovCgogICAgU2V0Q29uc29sZUN1cnNvckluZm8oVkdBX0FscGhhQ29uc29sZSgpLCZjY2kpOwp9Cgp2b2lkIFZHQV9TZXRDdXJzb3JQb3ModW5zaWduZWQgWCx1bnNpZ25lZCBZKQp7CiAgICB2Z2FfdGV4dF94ID0gWDsKICAgIHZnYV90ZXh0X3kgPSBZOwp9Cgp2b2lkIFZHQV9HZXRDdXJzb3JQb3ModW5zaWduZWQqWCx1bnNpZ25lZCpZKQp7CiAgICBpZiAoWCkgKlggPSB2Z2FfdGV4dF94OwogICAgaWYgKFkpICpZID0gdmdhX3RleHRfeTsKfQoKc3RhdGljIHZvaWQgVkdBX1B1dENoYXJBdCh1bnNpZ25lZCB4LCB1bnNpZ25lZCB5LCBCWVRFIGFzY2lpLCBpbnQgYXR0cikKewogICAgY2hhciAqZGF0ID0gVkdBX0FscGhhQnVmZmVyKCkgKyAoKHZnYV90ZXh0X3dpZHRoICogeSArIHgpICogMik7CiAgICBkYXRbMF0gPSBhc2NpaTsKICAgIGlmIChhdHRyPj0wKQogICAgICAgIGRhdFsxXSA9IGF0dHI7Cn0KCnZvaWQgVkdBX1dyaXRlQ2hhcnModW5zaWduZWQgWCx1bnNpZ25lZCBZLHVuc2lnbmVkIGNoLGludCBhdHRyLGludCBjb3VudCkKewogICAgRW50ZXJDcml0aWNhbFNlY3Rpb24oJnZnYV9sb2NrKTsKCiAgICB3aGlsZSAoY291bnQtLSkgCiAgICAgICAgVkdBX1B1dENoYXJBdChYICsgY291bnQsIFksIGNoLCBhdHRyKTsKCiAgICBMZWF2ZUNyaXRpY2FsU2VjdGlvbigmdmdhX2xvY2spOwp9Cgp2b2lkIFZHQV9QdXRDaGFyKEJZVEUgYXNjaWkpCnsKICAgIERXT1JEIHc7CgogICAgRW50ZXJDcml0aWNhbFNlY3Rpb24oJnZnYV9sb2NrKTsKCiAgICBzd2l0Y2goYXNjaWkpIHsKICAgIGNhc2UgJ1xiJzoKICAgICAgICBpZiAodmdhX3RleHRfeCkKICAgICAgICB7CiAgICAgICAgICAgIHZnYV90ZXh0X3gtLTsKICAgICAgICAgICAgVkdBX1B1dENoYXJBdCh2Z2FfdGV4dF94LCB2Z2FfdGV4dF95LCAnICcsIDApOwogICAgICAgIH0KICAgICAgICBicmVhazsKCiAgICBjYXNlICdcdCc6CiAgICAgICAgdmdhX3RleHRfeCArPSAoKHZnYV90ZXh0X3ggKyA4KSAmIH43KSAtIHZnYV90ZXh0X3g7CiAgICAgICAgYnJlYWs7CgogICAgY2FzZSAnXG4nOgogICAgICAgIHZnYV90ZXh0X3krKzsKICAgICAgICB2Z2FfdGV4dF94ID0gMDsKICAgICAgICBicmVhazsKCiAgICBjYXNlICdcYSc6CiAgICAgICAgYnJlYWs7CgogICAgY2FzZSAnXHInOgogICAgICAgIHZnYV90ZXh0X3ggPSAwOwogICAgICAgIGJyZWFrOwoKICAgIGRlZmF1bHQ6CiAgICAgICAgVkdBX1B1dENoYXJBdCh2Z2FfdGV4dF94LCB2Z2FfdGV4dF95LCBhc2NpaSwgdmdhX3RleHRfYXR0cik7CiAgICAgICAgdmdhX3RleHRfeCsrOwogICAgfQoKICAgIGlmICh2Z2FfdGV4dF94ID49IHZnYV90ZXh0X3dpZHRoKQogICAgewogICAgICAgIHZnYV90ZXh0X3ggPSAwOwogICAgICAgIHZnYV90ZXh0X3krKzsKICAgIH0KCiAgICBpZiAodmdhX3RleHRfeSA+PSB2Z2FfdGV4dF9oZWlnaHQpCiAgICB7CiAgICAgICAgdmdhX3RleHRfeSA9IHZnYV90ZXh0X2hlaWdodCAtIDE7CiAgICAgICAgVkdBX1Njcm9sbFVwVGV4dCggMCwgMCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgdmdhX3RleHRfaGVpZ2h0IC0gMSwgdmdhX3RleHRfd2lkdGggLSAxLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAxLCB2Z2FfdGV4dF9hdHRyICk7CiAgICB9CgogICAgLyoKICAgICAqIElmIHdlIGRvbid0IGhhdmUgYSBjb25zb2xlLCB3cml0ZSBkaXJlY3RseSB0byBzdGFuZGFyZCBvdXRwdXQuCiAgICAgKi8KICAgIGlmKCF2Z2FfdGV4dF9jb25zb2xlKQogICAgICAgIFdyaXRlRmlsZShWR0FfQWxwaGFDb25zb2xlKCksICZhc2NpaSwgMSwgJncsIE5VTEwpOwoKICAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCZ2Z2FfbG9jayk7Cn0KCnZvaWQgVkdBX1NldFRleHRBdHRyaWJ1dGUoQllURSBhdHRyKQp7CiAgICB2Z2FfdGV4dF9hdHRyID0gYXR0cjsKfQoKdm9pZCBWR0FfQ2xlYXJUZXh0KHVuc2lnbmVkIHJvdzEsIHVuc2lnbmVkIGNvbDEsCiAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCByb3cyLCB1bnNpZ25lZCBjb2wyLAogICAgICAgICAgICAgICAgICAgQllURSBhdHRyKQp7CiAgICB1bnNpZ25lZCB4LCB5OwoKICAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCZ2Z2FfbG9jayk7CgogICAgZm9yKHk9cm93MTsgeTw9cm93MjsgeSsrKQogICAgICAgIGZvcih4PWNvbDE7IHg8PWNvbDI7IHgrKykKICAgICAgICAgICAgVkdBX1B1dENoYXJBdCh4LCB5LCAweDIwLCBhdHRyKTsKCiAgICBMZWF2ZUNyaXRpY2FsU2VjdGlvbigmdmdhX2xvY2spOwp9Cgp2b2lkIFZHQV9TY3JvbGxVcFRleHQodW5zaWduZWQgcm93MSwgIHVuc2lnbmVkIGNvbDEsCiAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCByb3cyLCAgdW5zaWduZWQgY29sMiwKICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxpbmVzLCBCWVRFIGF0dHIpCnsKICAgIGNoYXIgICAgKmJ1ZmZlciA9IFZHQV9BbHBoYUJ1ZmZlcigpOwogICAgdW5zaWduZWQgeTsKCiAgICBFbnRlckNyaXRpY2FsU2VjdGlvbigmdmdhX2xvY2spOwoKICAgIC8qCiAgICAgKiBTY3JvbGwgYnVmZmVyLgogICAgICovCiAgICBmb3IgKHkgPSByb3cxOyB5IDw9IHJvdzIgLSBsaW5lczsgeSsrKQogICAgICAgIG1lbW1vdmUoIGJ1ZmZlciArIGNvbDEgKyB5ICogdmdhX3RleHRfd2lkdGggKiAyLAogICAgICAgICAgICAgICAgIGJ1ZmZlciArIGNvbDEgKyAoeSArIGxpbmVzKSAqIHZnYV90ZXh0X3dpZHRoICogMiwKICAgICAgICAgICAgICAgICAoY29sMiAtIGNvbDEgKyAxKSAqIDIgKTsKCiAgICAvKgogICAgICogRmlsbCBleHBvc2VkIGxpbmVzLgogICAgICovCiAgICBmb3IgKHkgPSBtYXgocm93MSwgcm93MiAtIGxpbmVzICsgMSk7IHkgPD0gcm93MjsgeSsrKQogICAgICAgIFZHQV9Xcml0ZUNoYXJzKCBjb2wxLCB5LCAnICcsIGF0dHIsIGNvbDIgLSBjb2wxICsgMSApOwoKICAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCZ2Z2FfbG9jayk7Cn0KCnZvaWQgVkdBX1Njcm9sbERvd25UZXh0KHVuc2lnbmVkIHJvdzEsICB1bnNpZ25lZCBjb2wxLAogICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCByb3cyLCAgdW5zaWduZWQgY29sMiwKICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbGluZXMsIEJZVEUgYXR0cikKewogICAgY2hhciAgICAqYnVmZmVyID0gVkdBX0FscGhhQnVmZmVyKCk7CiAgICB1bnNpZ25lZCB5OwoKICAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCZ2Z2FfbG9jayk7CgogICAgLyoKICAgICAqIFNjcm9sbCBidWZmZXIuCiAgICAgKi8KICAgIGZvciAoeSA9IHJvdzI7IHkgPj0gcm93MSArIGxpbmVzOyB5LS0pCiAgICAgICAgbWVtbW92ZSggYnVmZmVyICsgY29sMSArIHkgKiB2Z2FfdGV4dF93aWR0aCAqIDIsCiAgICAgICAgICAgICAgICAgYnVmZmVyICsgY29sMSArICh5IC0gbGluZXMpICogdmdhX3RleHRfd2lkdGggKiAyLAogICAgICAgICAgICAgICAgIChjb2wyIC0gY29sMSArIDEpICogMiApOwoKICAgIC8qCiAgICAgKiBGaWxsIGV4cG9zZWQgbGluZXMuCiAgICAgKi8KICAgIGZvciAoeSA9IHJvdzE7IHkgPD0gbWluKHJvdzEgKyBsaW5lcyAtIDEsIHJvdzIpOyB5KyspCiAgICAgICAgVkdBX1dyaXRlQ2hhcnMoIGNvbDEsIHksICcgJywgYXR0ciwgY29sMiAtIGNvbDEgKyAxICk7CgogICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oJnZnYV9sb2NrKTsKfQoKdm9pZCBWR0FfR2V0Q2hhcmFjdGVyQXRDdXJzb3IoQllURSAqYXNjaWksIEJZVEUgKmF0dHIpCnsKICAgIGNoYXIgKmRhdDsKCiAgICBkYXQgPSBWR0FfQWxwaGFCdWZmZXIoKSArICgodmdhX3RleHRfd2lkdGggKiB2Z2FfdGV4dF95ICsgdmdhX3RleHRfeCkgKiAyKTsKCiAgICAqYXNjaWkgPSBkYXRbMF07CiAgICAqYXR0ciA9IGRhdFsxXTsKfQoKCi8qKiogQ09OVFJPTCAqKiovCgovKiBGSVhNRTogb3B0aW1pemUgYnkgZG9pbmcgdGhpcyBvbmx5IGlmIHRoZSBkYXRhIGhhcyBhY3R1YWxseSBjaGFuZ2VkCiAqICAgICAgICAoaW4gYSB3YXkgc2ltaWxhciB0byBESUJTZWN0aW9uLCBwZXJoYXBzKSAqLwpzdGF0aWMgdm9pZCBWR0FfUG9sbF9HcmFwaGljcyh2b2lkKQp7CiAgdW5zaWduZWQgaW50IFBpdGNoLCBIZWlnaHQsIFdpZHRoLCBYLCBZOwogIGNoYXIgKnN1cmY7CiAgY2hhciAqZGF0ID0gdmdhX2ZiX2RhdGEgKyB2Z2FfZmJfb2Zmc2V0OwogIGludCAgIGJwcCA9ICh2Z2FfZmJfZGVwdGggKyA3KSAvIDg7CgogIHN1cmYgPSBWR0FfTG9jaygmUGl0Y2gsJkhlaWdodCwmV2lkdGgsTlVMTCk7CiAgaWYgKCFzdXJmKSByZXR1cm47CgogIC8qCiAgICogU3luY2hyb25pemUgZnJhbWVidWZmZXIgY29udGVudHMuCiAgICovCiAgaWYgKHZnYV9mYl93aW5kb3cgIT0gLTEpCiAgICAgIFZHQV9TeW5jV2luZG93KCBUUlVFICk7CgogIC8qCiAgICogRG91YmxlIFZHQSBmcmFtZWJ1ZmZlciAoMzIweDIwMCAtPiA2NDB4NDAwKSwgaWYgbmVlZGVkLgogICAqLwogIGlmKEhlaWdodCA+PSAyICogdmdhX2ZiX2hlaWdodCAmJiBXaWR0aCA+PSAyICogdmdhX2ZiX3dpZHRoICYmIGJwcCA9PSAxKQogICAgZm9yIChZPTA7IFk8dmdhX2ZiX2hlaWdodDsgWSsrLHN1cmYrPVBpdGNoKjIsZGF0Kz12Z2FfZmJfcGl0Y2gpCiAgICAgIGZvciAoWD0wOyBYPHZnYV9mYl93aWR0aDsgWCsrKSB7CiAgICAgICBCWVRFIHZhbHVlID0gZGF0W1hdOwogICAgICAgc3VyZltYKjJdID0gdmFsdWU7CiAgICAgICBzdXJmW1gqMisxXSA9IHZhbHVlOwogICAgICAgc3VyZltYKjIrUGl0Y2hdID0gdmFsdWU7CiAgICAgICBzdXJmW1gqMitQaXRjaCsxXSA9IHZhbHVlOwogICAgICB9CiAgZWxzZQogICAgZm9yIChZPTA7IFk8dmdhX2ZiX2hlaWdodDsgWSsrLHN1cmYrPVBpdGNoLGRhdCs9dmdhX2ZiX3BpdGNoKQogICAgICBtZW1jcHkoc3VyZiwgZGF0LCB2Z2FfZmJfd2lkdGggKiBicHApOwoKICBWR0FfVW5sb2NrKCk7Cn0KCnN0YXRpYyB2b2lkIFZHQV9Qb2xsX1RleHQodm9pZCkKewogICAgY2hhciAqZGF0LCAqb2xkLCAqcF9saW5lOwogICAgdW5zaWduZWQgaW50IFgsIFk7CiAgICBDSEFSX0lORk8gY2hbMjU2XTsgLyogdGhhdCBzaG91bGQgc3VmZmljZSBmb3IgdGhlIGxhcmdlc3QgdGV4dCB3aWR0aCAqLwogICAgQ09PUkQgc2l6LCBvZmY7CiAgICBTTUFMTF9SRUNUIGRlc3Q7CiAgICBIQU5ETEUgY29uID0gVkdBX0FscGhhQ29uc29sZSgpOwogICAgQk9PTCBsaW5lY2hhbmdlZCA9IEZBTFNFOyAvKiB2aWRlbyBtZW1vcnkgYXJlYSBkaWZmZXJzIGZyb20gc3RvcmVkIGNvcHk/ICovCgogICAgLyogU3luY2hyb25pemUgY3Vyc29yIHBvc2l0aW9uLiAqLwogICAgb2ZmLlggPSB2Z2FfdGV4dF94OwogICAgb2ZmLlkgPSB2Z2FfdGV4dF95OwogICAgU2V0Q29uc29sZUN1cnNvclBvc2l0aW9uKGNvbixvZmYpOwoKICAgIGRhdCA9IFZHQV9BbHBoYUJ1ZmZlcigpOwogICAgb2xkID0gdmdhX3RleHRfb2xkOyAvKiBwb2ludGVyIHRvIHN0b3JlZCB2aWRlbyBtZW0gY29weSAqLwogICAgc2l6LlggPSB2Z2FfdGV4dF93aWR0aDsgc2l6LlkgPSAxOwogICAgb2ZmLlggPSAwOyBvZmYuWSA9IDA7CgogICAgLyogY29weSBmcm9tIHZpcnR1YWwgVkdBIGZyYW1lIGJ1ZmZlciB0byBjb25zb2xlICovCiAgICBmb3IgKFk9MDsgWTx2Z2FfdGV4dF9oZWlnaHQ7IFkrKykgewoJbGluZWNoYW5nZWQgPSBtZW1jbXAoZGF0LCBvbGQsIHZnYV90ZXh0X3dpZHRoKjIpOwoJaWYgKGxpbmVjaGFuZ2VkKQoJewoJICAgIC8qVFJBQ0UoImxpbmUgJWQgY2hhbmdlZFxuIiwgWSk7Ki8KCSAgICBwX2xpbmUgPSBkYXQ7CiAgICAgICAgICAgIGZvciAoWD0wOyBYPHZnYV90ZXh0X3dpZHRoOyBYKyspIHsKICAgICAgICAgICAgICAgIGNoW1hdLkNoYXIuQXNjaWlDaGFyID0gKnBfbGluZSsrOwogICAgICAgICAgICAgICAgLyogV3JpdGVDb25zb2xlT3V0cHV0QSBkb2Vzbid0IGxpa2UgImRlYWQiIGNoYXJzICovCiAgICAgICAgICAgICAgICBpZiAoY2hbWF0uQ2hhci5Bc2NpaUNoYXIgPT0gJ1wwJykKICAgICAgICAgICAgICAgICAgICBjaFtYXS5DaGFyLkFzY2lpQ2hhciA9ICcgJzsKICAgICAgICAgICAgICAgIGNoW1hdLkF0dHJpYnV0ZXMgPSAqcF9saW5lKys7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZGVzdC5Ub3A9WTsgZGVzdC5Cb3R0b209WTsKICAgICAgICAgICAgZGVzdC5MZWZ0PTA7IGRlc3QuUmlnaHQ9dmdhX3RleHRfd2lkdGgrMTsKICAgICAgICAgICAgV3JpdGVDb25zb2xlT3V0cHV0QShjb24sIGNoLCBzaXosIG9mZiwgJmRlc3QpOwoJICAgIG1lbWNweShvbGQsIGRhdCwgdmdhX3RleHRfd2lkdGgqMik7Cgl9CgkvKiBhZHZhbmNlIHRvIG5leHQgdGV4dCBsaW5lICovCglkYXQgKz0gdmdhX3RleHRfd2lkdGgqMjsKCW9sZCArPSB2Z2FfdGV4dF93aWR0aCoyOwogICAgfQp9CgpzdGF0aWMgdm9pZCBDQUxMQkFDSyBWR0FfUG9sbCggTFBWT0lEIGFyZywgRFdPUkQgbG93LCBEV09SRCBoaWdoICkKewogICAgRW50ZXJDcml0aWNhbFNlY3Rpb24oJnZnYV9sb2NrKTsKCiAgICBpZiAobHBkZHJhdykKICAgICAgICBWR0FfUG9sbF9HcmFwaGljcygpOwogICAgZWxzZQogICAgICAgIFZHQV9Qb2xsX1RleHQoKTsKCiAgICAvKgogICAgICogRmFrZSBzdGFydCBvZiByZXRyYWNlLgogICAgICovCiAgICB2Z2FfcmV0cmFjZV92ZXJ0aWNhbCA9IFRSVUU7CgogICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oJnZnYV9sb2NrKTsKfQoKc3RhdGljIEJZVEUgcGFscmVnLHBhbGNudDsKc3RhdGljIFBBTEVUVEVFTlRSWSBwYWxkYXQ7Cgp2b2lkIFZHQV9pb3BvcnRfb3V0KCBXT1JEIHBvcnQsIEJZVEUgdmFsICkKewogICAgc3dpdGNoIChwb3J0KSB7CiAgICAgICAgY2FzZSAweDNjMDoKICAgICAgICAgICBpZiAodmdhX2FkZHJlc3NfM2MwKQogICAgICAgICAgICAgICB2Z2FfaW5kZXhfM2MwID0gdmFsOwogICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgRklYTUUoIlVuc3VwcG9ydGVkIGluZGV4LCByZWdpc3RlciAweDNjMDogMHglMDJ4ICh2YWx1ZSAweCUwMngpXG4iLAogICAgICAgICAgICAgICAgICAgICB2Z2FfaW5kZXhfM2MwLCB2YWwpOwogICAgICAgICAgIHZnYV9hZGRyZXNzXzNjMCA9ICF2Z2FfYWRkcmVzc18zYzA7CiAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAweDNjNDoKICAgICAgICAgICB2Z2FfaW5kZXhfM2M0ID0gdmFsOwogICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMHgzYzU6CiAgICAgICAgICBzd2l0Y2godmdhX2luZGV4XzNjNCkgewogICAgICAgICAgICAgICBjYXNlIDB4MDQ6IC8qIFNlcXVlbmNlcjogTWVtb3J5IE1vZGUgUmVnaXN0ZXIgKi8KICAgICAgICAgICAgICAgICAgaWYodmdhX2ZiX2RlcHRoID09IDgpCiAgICAgICAgICAgICAgICAgICAgICBWR0FfU2V0V2luZG93U3RhcnQoKHZhbCAmIDgpID8gMCA6IC0xKTsKICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgRklYTUUoIk1lbW9yeSBNb2RlIFJlZ2lzdGVyIG5vdCBzdXBwb3J0ZWQgaW4gdGhpcyBtb2RlLlxuIik7CiAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICBGSVhNRSgiVW5zdXBwb3J0ZWQgaW5kZXgsIHJlZ2lzdGVyIDB4M2M0OiAweCUwMnggKHZhbHVlIDB4JTAyeClcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgIHZnYV9pbmRleF8zYzQsIHZhbCk7CiAgICAgICAgICAgfQogICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMHgzYzg6CiAgICAgICAgICAgIHBhbHJlZz12YWw7IHBhbGNudD0wOyBicmVhazsKICAgICAgICBjYXNlIDB4M2M5OgogICAgICAgICAgICAoKEJZVEUqKSZwYWxkYXQpW3BhbGNudCsrXT12YWwgPDwgMjsKICAgICAgICAgICAgaWYgKHBhbGNudD09MykgewogICAgICAgICAgICAgICAgVkdBX1NldFBhbGV0dGUoJnBhbGRhdCxwYWxyZWcrKywxKTsKICAgICAgICAgICAgICAgIHBhbGNudD0wOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMHgzY2U6CiAgICAgICAgICAgIHZnYV9pbmRleF8zY2UgPSB2YWw7CiAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAweDNjZjoKICAgICAgICAgICBGSVhNRSgiVW5zdXBwb3J0ZWQgaW5kZXgsIHJlZ2lzdGVyIDB4M2NlOiAweCUwMnggKHZhbHVlIDB4JTAyeClcbiIsCiAgICAgICAgICAgICAgICAgdmdhX2luZGV4XzNjZSwgdmFsKTsKICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDB4M2Q0OgogICAgICAgICAgIHZnYV9pbmRleF8zZDQgPSB2YWw7CiAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAweDNkNToKICAgICAgICAgICBGSVhNRSgiVW5zdXBwb3J0ZWQgaW5kZXgsIHJlZ2lzdGVyIDB4M2Q0OiAweCUwMnggKHZhbHVlIDB4JTAyeClcbiIsCiAgICAgICAgICAgICAgICAgdmdhX2luZGV4XzNkNCwgdmFsKTsKICAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICBGSVhNRSgiVW5zdXBwb3J0ZWQgVkdBIHJlZ2lzdGVyOiAweCUwNHggKHZhbHVlIDB4JTAyeClcbiIsIHBvcnQsIHZhbCk7CiAgICB9Cn0KCkJZVEUgVkdBX2lvcG9ydF9pbiggV09SRCBwb3J0ICkKewogICAgQllURSByZXQ7CgogICAgc3dpdGNoIChwb3J0KSB7CiAgICAgICAgY2FzZSAweDNjMToKICAgICAgICAgICBGSVhNRSgiVW5zdXBwb3J0ZWQgaW5kZXgsIHJlZ2lzdGVyIDB4M2MwOiAweCUwMnhcbiIsCiAgICAgICAgICAgICAgICAgdmdhX2luZGV4XzNjMCk7CiAgICAgICAgICAgcmV0dXJuIDB4ZmY7CiAgICAgICAgY2FzZSAweDNjNToKICAgICAgICAgICBzd2l0Y2godmdhX2luZGV4XzNjNCkgewogICAgICAgICAgICAgICBjYXNlIDB4MDQ6IC8qIFNlcXVlbmNlcjogTWVtb3J5IE1vZGUgUmVnaXN0ZXIgKi8KICAgICAgICAgICAgICAgICAgICByZXR1cm4gKFZHQV9HZXRXaW5kb3dTdGFydCgpID09IC0xKSA/IDB4ZjcgOiAweGZmOwogICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgRklYTUUoIlVuc3VwcG9ydGVkIGluZGV4LCByZWdpc3RlciAweDNjNDogMHglMDJ4XG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgdmdhX2luZGV4XzNjNCk7CiAgICAgICAgICAgICAgICAgICByZXR1cm4gMHhmZjsKICAgICAgICAgICB9CiAgICAgICAgY2FzZSAweDNjZjoKICAgICAgICAgICBGSVhNRSgiVW5zdXBwb3J0ZWQgaW5kZXgsIHJlZ2lzdGVyIDB4M2NlOiAweCUwMnhcbiIsCiAgICAgICAgICAgICAgICAgdmdhX2luZGV4XzNjZSk7CiAgICAgICAgICAgcmV0dXJuIDB4ZmY7CiAgICAgICAgY2FzZSAweDNkNToKICAgICAgICAgICBGSVhNRSgiVW5zdXBwb3J0ZWQgaW5kZXgsIHJlZ2lzdGVyIDB4M2Q0OiAweCUwMnhcbiIsCiAgICAgICAgICAgICAgICAgdmdhX2luZGV4XzNkNCk7CiAgICAgICAgICAgcmV0dXJuIDB4ZmY7CgogICAgICAgIGNhc2UgMHgzZGE6CiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIFJlYWQgZnJvbSB0aGlzIHJlZ2lzdGVyIHJlc2V0cyByZWdpc3RlciAweDNjMCBhZGRyZXNzIGZsaXAtZmxvcC4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHZnYV9hZGRyZXNzXzNjMCA9IFRSVUU7CgogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiBSZWFkIGZyb20gdGhpcyByZWdpc3RlciByZXR1cm5zIGZvbGxvd2luZyBiaXRzOgogICAgICAgICAgICAgKiAgIHh4eHgxeHh4ID0gVmVydGljYWwgcmV0cmFjZSBpbiBwcm9ncmVzcyBpZiBzZXQuCiAgICAgICAgICAgICAqICAgeHh4eHgxeHggPSBMaWdodCBwZW4gc3dpdGNoZWQgb24uCiAgICAgICAgICAgICAqICAgeHh4eHh4MXggPSBMaWdodCBwZW4gdHJpZ2dlciBzZXQuCiAgICAgICAgICAgICAqICAgeHh4eHh4eDEgPSBFaXRoZXIgdmVydGljYWwgb3IgaG9yaXpvbnRhbCByZXRyYWNlIAogICAgICAgICAgICAgKiAgICAgICAgICAgICAgaW4gcHJvZ3Jlc3MgaWYgc2V0LgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgcmV0ID0gMDsKICAgICAgICAgICAgaWYgKHZnYV9yZXRyYWNlX3ZlcnRpY2FsKQogICAgICAgICAgICAgICAgcmV0IHw9IDk7CiAgICAgICAgICAgIGlmICh2Z2FfcmV0cmFjZV9ob3Jpem9udGFsKQogICAgICAgICAgICAgICAgcmV0IHw9IDM7CiAgICAgICAgICAgIAogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiBJZiBWR0EgbW9kZSBoYXMgYmVlbiBzZXQsIHZlcnRpY2FsIHJldHJhY2UgaXMKICAgICAgICAgICAgICogdHVybmVkIG9uIG9uY2UgYSBmcmFtZSBhbmQgY2xlYXJlZCBhZnRlciBlYWNoIHJlYWQuCiAgICAgICAgICAgICAqIFRoaXMgbWlnaHQgY2F1c2UgYXBwbGljYXRpb25zIHRoYXQgc3luY2hyb25pemUgd2l0aAogICAgICAgICAgICAgKiB2ZXJ0aWNhbCByZXRyYWNlIHRvIGFjdHVhbGx5IHNraXAgb25lIGZyYW1lIGJ1dCB0aGF0CiAgICAgICAgICAgICAqIGlzIHByb2JhYmx5IG5vdCBhIHByb2JsZW0uCiAgICAgICAgICAgICAqIAogICAgICAgICAgICAgKiBJZiBubyBWR0EgbW9kZSBoYXMgYmVlbiBzZXQsIHZlcnRpY2FsIHJldHJhY2UgaXMgZmFrZWQKICAgICAgICAgICAgICogYnkgdG9nZ2xpbmcgdGhlIHZhbHVlIGFmdGVyIGV2ZXJ5IHJlYWQuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBpZiAoVkdBX0lzVGltZXJSdW5uaW5nKCkpCiAgICAgICAgICAgICAgICB2Z2FfcmV0cmFjZV92ZXJ0aWNhbCA9IEZBTFNFOwogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB2Z2FfcmV0cmFjZV92ZXJ0aWNhbCA9ICF2Z2FfcmV0cmFjZV92ZXJ0aWNhbDsKCiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIFRvZ2dsZSBob3Jpem9udGFsIHJldHJhY2UuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB2Z2FfcmV0cmFjZV9ob3Jpem9udGFsID0gIXZnYV9yZXRyYWNlX2hvcml6b250YWw7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICByZXQ9MHhmZjsKICAgICAgICAgICAgRklYTUUoIlVuc3VwcG9ydGVkIFZHQSByZWdpc3RlcjogMHglMDR4XG4iLCBwb3J0KTsKICAgIH0KICAgIHJldHVybiByZXQ7Cn0KCnZvaWQgVkdBX0NsZWFuKHZvaWQpCnsKICAgIFZHQV9FeGl0KCk7CiAgICBWR0FfRGVpbnN0YWxsVGltZXIoKTsKfQo=