LyoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCioKKiAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDAxLCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzCiogICBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKgoqICBGSUxFIE5BTUUgOiBwdXRpbC5oCioKKiAgIERhdGUgICAgICAgIE5hbWUgICAgICAgIERlc2NyaXB0aW9uCiogICAwNS8xNC85OCAgICBub3MgICAgICAgICBDcmVhdGlvbiAoY29udGVudCBtb3ZlZCBoZXJlIGZyb20gdXR5cGVzLmgpLgoqICAgMDYvMTcvOTkgICAgZXJtICAgICAgICAgQWRkZWQgSUVFRV83NTQKKiAgIDA3LzIyLzk4ICAgIHN0ZXBoZW4gICAgIEFkZGVkIElFRUVyZW1haW5kZXIsIG1heCwgbWluLCB0cnVuYwoqICAgMDgvMTMvOTggICAgc3RlcGhlbiAgICAgQWRkZWQgaXNOZWdhdGl2ZUluZmluaXR5LCBpc1Bvc2l0aXZlSW5maW5pdHkKKiAgIDA4LzI0Lzk4ICAgIHN0ZXBoZW4gICAgIEFkZGVkIGxvbmdCaXRzRnJvbURvdWJsZQoqICAgMDMvMDIvOTkgICAgc3RlcGhlbiAgICAgUmVtb3ZlZCBvcGVuRmlsZSgpLiAgQWRkZWQgQVM0MDAgc3VwcG9ydC4KKiAgIDA0LzE1Lzk5ICAgIHN0ZXBoZW4gICAgIENvbnZlcnRlZCB0byBDCiogICAxMS8xNS85OSAgICBoZWxlbmEgICAgICBJbnRlZ3JhdGVkIFMvMzkwIGNoYW5nZXMgZm9yIElFRUUgc3VwcG9ydC4KKiAgIDAxLzExLzAwICAgIGhlbGVuYSAgICAgIEFkZGVkIHVfZ2V0VmVyc2lvbi4KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiovCgojaWZuZGVmIFBVVElMX0gKI2RlZmluZSBQVVRJTF9ICgojaW5jbHVkZSAidW5pY29kZS91dHlwZXMuaCIKCi8qIERlZmluZSB0aGlzIHRvIDEgaWYgeW91ciBwbGF0Zm9ybSBzdXBwb3J0cyBJRUVFIDc1NCBmbG9hdGluZyBwb2ludCwKICAgdG8gMCBpZiBpdCBkb2VzIG5vdC4gKi8KI2lmbmRlZiBJRUVFXzc1NAojICAgZGVmaW5lIElFRUVfNzU0IDEKI2VuZGlmCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLyogUGxhdGZvcm0gdXRpbGl0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKLyoqCiAqIFBsYXRmb3JtIHV0aWxpdGllcyBpc29sYXRlcyB0aGUgcGxhdGZvcm0gZGVwZW5kZW5jaWVzIG9mIHRoZQogKiBsaWJhcmFyeS4gIEZvciBlYWNoIHBsYXRmb3JtIHdoaWNoIHRoaXMgY29kZSBpcyBwb3J0ZWQgdG8sIHRoZXNlCiAqIGZ1bmN0aW9ucyBtYXkgaGF2ZSB0byBiZSByZS1pbXBsZW1lbnRlZC4KICovCgovKiBGbG9hdGluZyBwb2ludCB1dGlsaXRpZXMgCiAqLwpVX0NBUEkgVUJvb2wgICBVX0VYUE9SVDIgdXBydl9pc05hTihkb3VibGUpOwpVX0NBUEkgVUJvb2wgICBVX0VYUE9SVDIgdXBydl9pc0luZmluaXRlKGRvdWJsZSk7ClVfQ0FQSSBVQm9vbCAgIFVfRVhQT1JUMiB1cHJ2X2lzUG9zaXRpdmVJbmZpbml0eShkb3VibGUpOwpVX0NBUEkgVUJvb2wgICBVX0VYUE9SVDIgdXBydl9pc05lZ2F0aXZlSW5maW5pdHkoZG91YmxlKTsKVV9DQVBJIGRvdWJsZSAgVV9FWFBPUlQyIHVwcnZfZ2V0TmFOKHZvaWQpOwpVX0NBUEkgZG91YmxlICBVX0VYUE9SVDIgdXBydl9nZXRJbmZpbml0eSh2b2lkKTsKClVfQ0FQSSBkb3VibGUgIFVfRVhQT1JUMiB1cHJ2X3RydW5jKGRvdWJsZSBkKTsKVV9DQVBJIGRvdWJsZSAgVV9FWFBPUlQyIHVwcnZfZmxvb3IoZG91YmxlIHgpOwpVX0NBUEkgZG91YmxlICBVX0VYUE9SVDIgdXBydl9jZWlsKGRvdWJsZSB4KTsKVV9DQVBJIGRvdWJsZSAgVV9FWFBPUlQyIHVwcnZfZmFicyhkb3VibGUgeCk7ClVfQ0FQSSBkb3VibGUgIFVfRVhQT1JUMiB1cHJ2X21vZGYoZG91YmxlIHgsIGRvdWJsZSogeSk7ClVfQ0FQSSBkb3VibGUgIFVfRVhQT1JUMiB1cHJ2X2Ztb2QoZG91YmxlIHgsIGRvdWJsZSB5KTsKVV9DQVBJIGRvdWJsZSAgVV9FWFBPUlQyIHVwcnZfcG93KGRvdWJsZSB4LCBkb3VibGUgeSk7ClVfQ0FQSSBkb3VibGUgIFVfRVhQT1JUMiB1cHJ2X3BvdzEwKGludDMyX3QgeCk7ClVfQ0FQSSBkb3VibGUgIFVfRVhQT1JUMiB1cHJ2X2ZtYXgoZG91YmxlIHgsIGRvdWJsZSB5KTsKVV9DQVBJIGRvdWJsZSAgVV9FWFBPUlQyIHVwcnZfZm1pbihkb3VibGUgeCwgZG91YmxlIHkpOwpVX0NBUEkgaW50MzJfdCBVX0VYUE9SVDIgdXBydl9tYXgoaW50MzJfdCB4LCBpbnQzMl90IHkpOwpVX0NBUEkgaW50MzJfdCBVX0VYUE9SVDIgdXBydl9taW4oaW50MzJfdCB4LCBpbnQzMl90IHkpOwoKI2lmIFVfSVNfQklHX0VORElBTgojICAgZGVmaW5lIHVwcnZfaXNOZWdhdGl2ZShudW1iZXIpICgqKChzaWduZWQgY2hhciAqKSYobnVtYmVyKSk8MCkKI2Vsc2UKIyAgIGRlZmluZSB1cHJ2X2lzTmVnYXRpdmUobnVtYmVyKSAoKigoc2lnbmVkIGNoYXIgKikmKG51bWJlcikrc2l6ZW9mKG51bWJlciktMSk8MCkKI2VuZGlmCgovKioKICogUmV0dXJuIHRoZSBsYXJnZXN0IHBvc2l0aXZlIG51bWJlciB0aGF0IGNhbiBiZSByZXByZXNlbnRlZCBieSBhbiBpbnRlZ2VyCiAqIHR5cGUgb2YgYXJiaXRyYXJ5IGJpdCBsZW5ndGguCiAqLwpVX0NBUEkgZG91YmxlICBVX0VYUE9SVDIgdXBydl9tYXhNYW50aXNzYSh2b2lkKTsKCi8qKgogKiBSZXR1cm4gdGhlIGZsb29yIG9mIHRoZSBsb2cgYmFzZSAxMCBvZiBhIGdpdmVuIGRvdWJsZS4KICogVGhpcyBtZXRob2QgY29tcGVuc2F0ZXMgZm9yIGluYWNjdXJhY2llcyB3aGljaCBhcmlzZSBuYXR1cmFsbHkgd2hlbgogKiBjb21wdXRpbmcgbG9ncywgYW5kIGFsd2F5cyBnaXZlcyB0aGUgY29ycmVjdCB2YWx1ZS4gIFRoZSBwYXJhbWV0ZXIKICogbXVzdCBiZSBwb3NpdGl2ZSBhbmQgZmluaXRlLgogKiAoVGhhbmtzIHRvIEFsYW4gTGl1IGZvciBzdXBwbHlpbmcgdGhpcyBmdW5jdGlvbi4pCiAqCiAqIEBwYXJhbSBkIHRoZSBkb3VibGUgdmFsdWUgdG8gYXBwbHkgdGhlIGNvbW1vbiBsb2cgZnVuY3Rpb24gZm9yLgogKiBAcmV0dXJuIHRoZSBsb2cgb2YgdmFsdWUgZC4KICovClVfQ0FQSSBpbnQxNl90ICBVX0VYUE9SVDIgdXBydl9sb2cxMChkb3VibGUgZCk7CgpVX0NBUEkgZG91YmxlICBVX0VYUE9SVDIgdXBydl9sb2coZG91YmxlIGQpOwoKLyoqIERvZXMgY29tbW9uIG5vdGlvbiBvZiByb3VuZGluZyBlLmcuIHVwcnZfZmxvb3IoeCArIDAuNSk7ICovClVfQ0FQSSBkb3VibGUgIFVfRVhQT1JUMiB1cHJ2X3JvdW5kKGRvdWJsZSB4KTsKCi8qKgogKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZGlnaXRzIGFmdGVyIHRoZSBkZWNpbWFsIHBvaW50IGluIGEgZG91YmxlIG51bWJlciB4LgogKgogKiBAcGFyYW0geCB0aGUgZG91YmxlIG51bWJlcgogKi8KVV9DQVBJIGludDMyX3QgIFVfRVhQT1JUMiB1cHJ2X2RpZ2l0c0FmdGVyRGVjaW1hbChkb3VibGUgeCk7CgovKioKICogVGltZSB6b25lIHV0aWxpdGllcwogKgogKiBXcmFwcGVycyBmb3IgQyBydW50aW1lIGxpYnJhcnkgZnVuY3Rpb25zIHJlbGF0aW5nIHRvIHRpbWV6b25lcy4KICogVGhlIHRfdHpzZXQoKSBmdW5jdGlvbiAoc2ltaWxhciB0byB0enNldCkgdXNlcyB0aGUgY3VycmVudCBzZXR0aW5nIAogKiBvZiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgVFogdG8gYXNzaWduIHZhbHVlcyB0byB0aHJlZSBnbG9iYWwgCiAqIHZhcmlhYmxlczogZGF5bGlnaHQsIHRpbWV6b25lLCBhbmQgdHpuYW1lLiBUaGVzZSB2YXJpYWJsZXMgaGF2ZSB0aGUgCiAqIGZvbGxvd2luZyBtZWFuaW5ncywgYW5kIGFyZSBkZWNsYXJlZCBpbiAmbHQ7dGltZS5oJmd0Oy4KICoKICogICBkYXlsaWdodCAgIE5vbnplcm8gaWYgZGF5bGlnaHQtc2F2aW5nLXRpbWUgem9uZSAoRFNUKSBpcyBzcGVjaWZpZWQKICogICAgICAgICAgICAgIGluIFRaOyBvdGhlcndpc2UsIDAuIERlZmF1bHQgdmFsdWUgaXMgMS4KICogICB0aW1lem9uZSAgIERpZmZlcmVuY2UgaW4gc2Vjb25kcyBiZXR3ZWVuIGNvb3JkaW5hdGVkIHVuaXZlcnNhbAogKiAgICAgICAgICAgICAgdGltZSBhbmQgbG9jYWwgdGltZS4gRS5nLiwgLTI4LDgwMCBmb3IgUFNUIChHTVQtOGhycykKICogICB0em5hbWUoMCkgIFRocmVlLWxldHRlciB0aW1lLXpvbmUgbmFtZSBkZXJpdmVkIGZyb20gVFogZW52aXJvbm1lbnQKICogICAgICAgICAgICAgIHZhcmlhYmxlLiBFLmcuLCAiUFNUIi4KICogICB0em5hbWUoMSkgIFRocmVlLWxldHRlciBEU1Qgem9uZSBuYW1lIGRlcml2ZWQgZnJvbSBUWiBlbnZpcm9ubWVudAogKiAgICAgICAgICAgICAgdmFyaWFibGUuICBFLmcuLCAiUERUIi4gSWYgRFNUIHpvbmUgaXMgb21pdHRlZCBmcm9tIFRaLAogKiAgICAgICAgICAgICAgdHpuYW1lKDEpIGlzIGFuIGVtcHR5IHN0cmluZy4KICoKICogTm90ZXM6IEZvciBleGFtcGxlLCB0byBzZXQgdGhlIFRaIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIGNvcnJlc3BvbmQKICogdG8gdGhlIGN1cnJlbnQgdGltZSB6b25lIGluIEdlcm1hbnksIHlvdSBjYW4gdXNlIG9uZSBvZiB0aGUKICogZm9sbG93aW5nIHN0YXRlbWVudHM6CiAqCiAqICAgc2V0IFRaPUdTVDFHRFQKICogICBzZXQgVFo9R1NUKzFHRFQKICoKICogSWYgdGhlIFRaIHZhbHVlIGlzIG5vdCBzZXQsIHRfdHpzZXQoKSBhdHRlbXB0cyB0byB1c2UgdGhlIHRpbWUgem9uZQogKiBpbmZvcm1hdGlvbiBzcGVjaWZpZWQgYnkgdGhlIG9wZXJhdGluZyBzeXN0ZW0uIFVuZGVyIFdpbmRvd3MgTlQKICogYW5kIFdpbmRvd3MgOTUsIHRoaXMgaW5mb3JtYXRpb24gaXMgc3BlY2lmaWVkIGluIHRoZSBDb250cm9sIFBhbmVsknMKICogRGF0ZS9UaW1lIGFwcGxpY2F0aW9uLgogKiBAc3RhYmxlCiAqLwpVX0NBUEkgdm9pZCAgICAgVV9FWFBPUlQyIHVwcnZfdHpzZXQodm9pZCk7CgovKioKICogRGlmZmVyZW5jZSBpbiBzZWNvbmRzIGJldHdlZW4gY29vcmRpbmF0ZWQgdW5pdmVyc2FsCiAqIHRpbWUgYW5kIGxvY2FsIHRpbWUuIEUuZy4sIC0yOCw4MDAgZm9yIFBTVCAoR01ULThocnMpCiAqLwpVX0NBUEkgaW50MzJfdCAgVV9FWFBPUlQyIHVwcnZfdGltZXpvbmUodm9pZCk7CgovKioKICogICB0em5hbWUoMCkgIFRocmVlLWxldHRlciB0aW1lLXpvbmUgbmFtZSBkZXJpdmVkIGZyb20gVFogZW52aXJvbm1lbnQKICogICAgICAgICAgICAgIHZhcmlhYmxlLiBFLmcuLCAiUFNUIi4KICogICB0em5hbWUoMSkgIFRocmVlLWxldHRlciBEU1Qgem9uZSBuYW1lIGRlcml2ZWQgZnJvbSBUWiBlbnZpcm9ubWVudAogKiAgICAgICAgICAgICAgdmFyaWFibGUuICBFLmcuLCAiUERUIi4gSWYgRFNUIHpvbmUgaXMgb21pdHRlZCBmcm9tIFRaLAogKiAgICAgICAgICAgICAgdHpuYW1lKDEpIGlzIGFuIGVtcHR5IHN0cmluZy4KICovClVfQ0FQSSBjaGFyKiAgICBVX0VYUE9SVDIgdXBydl90em5hbWUoaW50IG4pOwoKLyoqCiAqIEdldCBVVEMgKEdNVCkgdGltZSBtZWFzdXJlZCBpbiBzZWNvbmRzIHNpbmNlIDA6MDAgb24gMS8xLzcwLiAKICogQHN0YWJsZQogKi8KVV9DQVBJIGludDMyX3QgIFVfRVhQT1JUMiB1cHJ2X2dldFVUQ3RpbWUodm9pZCk7CgovKioKICogUmV0dXJuIHRoZSBJQ1UgZGF0YSBkaXJlY3RvcnkuIAogKiBUaGUgZGF0YSBkaXJlY3RvcnkgaXMgd2hlcmUgY29tbW9uIGZvcm1hdCBJQ1UgZGF0YSBmaWxlcyAoLmRhdCBmaWxlcykKICogICBhcmUgbG9hZGVkIGZyb20uICBOb3RlIHRoYXQgbm9ybWFsIHVzZSBvZiB0aGUgYnVpbHQtaW4gSUNVCiAqICAgZmFjaWxpdGllcyBkb2VzIG5vdCByZXF1aXJlIGxvYWRpbmcgb2YgYW4gZXh0ZXJuYWwgZGF0YSBmaWxlOwogKiAgIHVubGVzcyB5b3UgYXJlIGFkZGluZyBjdXN0b20gZGF0YSB0byBJQ1UsIHRoZSBkYXRhIGRpcmVjdG9yeQogKiAgIGRvZXMgbm90IG5lZWQgdG8gYmUgc2V0LgogKgogKiBUaGUgZGF0YSBkaXJlY3RvcnkgaXMgZGV0ZXJtaW5lZCBhcyBmb2xsb3dzOgogKiAgICBJZiB1X3NldERhdGFEaXJlY3RvcnkoKSBoYXMgYmVlbiBjYWxsZWQsIHRoYXQgaXMgaXQsIG90aGVyd2lzZQogKiAgICBpZiB0aGUgSUNVX0RBVEEgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgc2V0LCB1c2UgdGhhdCwgb3RoZXJ3aXNlCiAqICAgIE9uIFdpbmRvd3MsIGlmIHRoZSBTT0ZUV0FSRVxJQ1VcVW5pY29kZVxEYXRhIHJlZ2lzdHJ5IGVudHJ5IGV4aXN0cywgdXNlIHRoYXQKICogICAgICAgICAgICh1c2Ugb2YgdGhlIHJlZ2lzdHJ5IGluIHRoaXMgd2F5IGlzIG5vdCByZWNvbW1lbmRlZC4pICBvdGhlcndpc2UKICogICAgSWYgYSBkYXRhIGRpcmVjdG9yeSB3YXMgc3BlY2lmZWQgYXQgSUNVIGJ1aWxkIHRpbWUsIHVzZSB0aGF0CiAqICAgIG90aGVyd2lzZSBubyBkYXRhIGRpcmVjdG9yeSBpcyBhdmFpbGFibGUuCiAqCiAqIEByZXR1cm4gdGhlIGRhdGEgZGlyZWN0b3J5LCBvciBhbiBlbXB0eSBzdHJpbmcgKCIiKSBpZiBubyBkYXRhIGRpcmVjdG9yeSBoYXMKICogICAgICAgICBiZWVuIHNwZWNpZmllZC4KICogICAKICogQHN0YWJsZQogKi8KVV9DQVBJIGNvbnN0IGNoYXIqIFVfRVhQT1JUMiB1X2dldERhdGFEaXJlY3Rvcnkodm9pZCk7CgovKiogCiAqIFNldCB0aGUgSUNVIGRhdGEgZGlyZWN0b3J5LiAKICogVGhlIGRhdGEgZGlyZWN0b3J5IGlzIHdoZXJlIGNvbW1vbiBmb3JtYXQgSUNVIGRhdGEgZmlsZXMgKC5kYXQgZmlsZXMpCiAqICAgYXJlIGxvYWRlZCBmcm9tLiAgTm90ZSB0aGF0IG5vcm1hbCB1c2Ugb2YgdGhlIGJ1aWx0LWluIElDVQogKiAgIGZhY2lsaXRpZXMgZG9lcyBub3QgcmVxdWlyZSBsb2FkaW5nIG9mIGFuIGV4dGVybmFsIGRhdGEgZmlsZTsKICogICB1bmxlc3MgeW91IGFyZSBhZGRpbmcgY3VzdG9tIGRhdGEgdG8gSUNVLCB0aGUgZGF0YSBkaXJlY3RvcnkKICogICBkb2VzIG5vdCBuZWVkIHRvIGJlIHNldC4KICoKICogVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIGF0IG1vc3Qgb25jZSBpbiBhIHByb2Nlc3MsIGJlZm9yZSB0aGUKICogZmlyc3QgSUNVIG9wZXJhdGlvbiB0aGF0IHdpbGwgcmVxdWlyZSB0aGUgbG9hZGluZyBvZiBhbiBJQ1UgZGF0YSBmaWxlLgogKgogKiBAc3RhYmxlCiAqLwpVX0NBUEkgdm9pZCBVX0VYUE9SVDIgdV9zZXREYXRhRGlyZWN0b3J5KGNvbnN0IGNoYXIgKmRpcmVjdG9yeSk7CgovKioKICogUmV0dXJuIHRoZSBkZWZhdWx0IGNvZGVwYWdlIGZvciB0aGlzIHBsYXRmb3JtIGFuZCBsb2NhbGUgCiAqIEBzdGFibGUKICovClVfQ0FQSSBjb25zdCBjaGFyKiAgVV9FWFBPUlQyIHVwcnZfZ2V0RGVmYXVsdENvZGVwYWdlKHZvaWQpOwoKLyoqCiAqIFJldHVybiB0aGUgZGVmYXVsdCBsb2NhbGUgSUQgc3RyaW5nIGJ5IHF1ZXJ5aW5nIHRocyBzeXN0ZW0sIG9yCiAqICAgICB6ZXJvIGlmIG9uZSBjYW5ub3QgYmUgZm91bmQuIAogKiBAc3RhYmxlCiAqLwpVX0NBUEkgY29uc3QgY2hhciogIFVfRVhQT1JUMiB1cHJ2X2dldERlZmF1bHRMb2NhbGVJRCh2b2lkKTsKCi8qCiAqIEZpbmRzIHRoZSBsZWFzdCBkb3VibGUgZ3JlYXRlciB0aGFuIGQgKGlmIHBvc2l0aXZlID09IHRydWUpLAogKiBvciB0aGUgZ3JlYXRlc3QgZG91YmxlIGxlc3MgdGhhbiBkIChpZiBwb3NpdGl2ZSA9PSBmYWxzZSkuCiAqCiAqIFRoaXMgaXMgYSBzcGVjaWFsIHB1cnBvc2UgZnVuY3Rpb24gZGVmaW5lZCBieSB0aGUgQ2hvaWNlRm9ybWF0IEFQSQogKiBkb2N1bWVudGF0aW9uLgogKiBJdCBpcyBub3QgYSBnZW5lcmFsIHB1cnBvc2UgZnVuY3Rpb24gYW5kIG5vdCBkZWZpbmVkIGZvciBOYU4gb3IgSW5maW5pdHkKICogQGRlcHJlY2F0ZWQgVGhpcyB3aWxsIGJlIHJlbW92ZWQgYWZ0ZXIgMjAwMi1KdW4tMzAuIFVzZSB0aGUgQ2hvaWNlRm9ybWF0IGNsb3N1cmVzIEFQSSBpbnN0ZWFkLgogKi8KVV9DQVBJIGRvdWJsZSAgICAgICBVX0VYUE9SVDIgdXBydl9uZXh0RG91YmxlKGRvdWJsZSBkLCBVQm9vbCBwb3NpdGl2ZSk7CgovKioKICogRmlsZXN5c3RlbSBmaWxlIGFuZCBwYXRoIHNlcGFyYXRvciBjaGFyYWN0ZXJzLgogKiBFeGFtcGxlOiAnLycgYW5kICc6JyBvbiBVbml4LCAnXFwnIGFuZCAnOycgb24gV2luZG93cy4KICogQHN0YWJsZQogKi8KI2lmZGVmIFhQX01BQwojICAgZGVmaW5lIFVfRklMRV9TRVBfQ0hBUiAnOicKIyAgIGRlZmluZSBVX1BBVEhfU0VQX0NIQVIgJzsnCiMgICBkZWZpbmUgVV9GSUxFX1NFUF9TVFJJTkcgIjoiCiMgICBkZWZpbmUgVV9QQVRIX1NFUF9TVFJJTkcgIjsiCiNlbGlmIGRlZmluZWQoV0lOMzIpIHx8IGRlZmluZWQoT1MyKQojICAgZGVmaW5lIFVfRklMRV9TRVBfQ0hBUiAnXFwnCiMgICBkZWZpbmUgVV9QQVRIX1NFUF9DSEFSICc7JwojICAgZGVmaW5lIFVfRklMRV9TRVBfU1RSSU5HICJcXCIKIyAgIGRlZmluZSBVX1BBVEhfU0VQX1NUUklORyAiOyIKI2Vsc2UKIyAgIGRlZmluZSBVX0ZJTEVfU0VQX0NIQVIgJy8nCiMgICBkZWZpbmUgVV9QQVRIX1NFUF9DSEFSICc6JwojICAgZGVmaW5lIFVfRklMRV9TRVBfU1RSSU5HICIvIgojICAgZGVmaW5lIFVfUEFUSF9TRVBfU1RSSU5HICI6IgojZW5kaWYKCi8qKgogKiBDb252ZXJ0IGNoYXIgY2hhcmFjdGVycyB0byBVQ2hhciBjaGFyYWN0ZXJzLgogKiBUaGlzIHV0aWxpdHkgZnVuY3Rpb24gaXMgdXNlZnVsIG9ubHkgZm9yICJpbnZhcmlhbnQgY2hhcmFjdGVycyIKICogdGhhdCBhcmUgZW5jb2RlZCBpbiB0aGUgcGxhdGZvcm0gZGVmYXVsdCBlbmNvZGluZy4KICogVGhleSBhcmUgYSBzbWFsbCwgY29uc3RhbnQgc3Vic2V0IG9mIHRoZSBlbmNvZGluZyBhbmQgaW5jbHVkZQogKiBqdXN0IHRoZSBsYXRpbiBsZXR0ZXJzLCBkaWdpdHMsIGFuZCBzb21lIHB1bmN0dWF0aW9uLgogKiBGb3IgZGV0YWlscywgc2VlIHV0eXBlcy5oIC4KICoKICogQHBhcmFtIGNzIElucHV0IHN0cmluZywgcG9pbnRzIHRvIDxjb2RlPmxlbmd0aDwvY29kZT4KICogICAgICAgICAgIGNoYXJhY3RlciBieXRlcyBmcm9tIGEgc3Vic2V0IG9mIHRoZSBwbGF0Zm9ybSBlbmNvZGluZy4KICogQHBhcmFtIHVzIE91dHB1dCBzdHJpbmcsIHBvaW50cyB0byBtZW1vcnkgZm9yIDxjb2RlPmxlbmd0aDwvY29kZT4KICogICAgICAgICAgIFVuaWNvZGUgY2hhcmFjdGVycy4KICogQHBhcmFtIGxlbmd0aCBUaGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gY29udmVydDsgdGhpcyBtYXkKICogICAgICAgICAgICAgICBpbmNsdWRlIHRoZSB0ZXJtaW5hdGluZyA8Y29kZT5OVUw8L2NvZGU+LgogKiBAc3RhYmxlCiAqLwpVX0NBUEkgdm9pZCBVX0VYUE9SVDIKdV9jaGFyc1RvVUNoYXJzKGNvbnN0IGNoYXIgKmNzLCBVQ2hhciAqdXMsIGludDMyX3QgbGVuZ3RoKTsKCi8qKgogKiBDb252ZXJ0IFVDaGFyIGNoYXJhY3RlcnMgdG8gY2hhciBjaGFyYWN0ZXJzLgogKiBUaGlzIHV0aWxpdHkgZnVuY3Rpb24gaXMgdXNlZnVsIG9ubHkgZm9yICJpbnZhcmlhbnQgY2hhcmFjdGVycyIKICogdGhhdCBjYW4gYmUgZW5jb2RlZCBpbiB0aGUgcGxhdGZvcm0gZGVmYXVsdCBlbmNvZGluZy4KICogVGhleSBhcmUgYSBzbWFsbCwgY29uc3RhbnQgc3Vic2V0IG9mIHRoZSBlbmNvZGluZyBhbmQgaW5jbHVkZQogKiBqdXN0IHRoZSBsYXRpbiBsZXR0ZXJzLCBkaWdpdHMsIGFuZCBzb21lIHB1bmN0dWF0aW9uLgogKiBGb3IgZGV0YWlscywgc2VlIHV0eXBlcy5oIC4KICoKICogQHBhcmFtIHVzIElucHV0IHN0cmluZywgcG9pbnRzIHRvIDxjb2RlPmxlbmd0aDwvY29kZT4KICogICAgICAgICAgIFVuaWNvZGUgY2hhcmFjdGVycyB0aGF0IGNhbiBiZSBlbmNvZGVkIHdpdGggdGhlCiAqICAgICAgICAgICBjb2RlcGFnZS1pbnZhcmlhbnQgc3Vic2V0IG9mIHRoZSBwbGF0Zm9ybSBlbmNvZGluZy4KICogQHBhcmFtIGNzIE91dHB1dCBzdHJpbmcsIHBvaW50cyB0byBtZW1vcnkgZm9yIDxjb2RlPmxlbmd0aDwvY29kZT4KICogICAgICAgICAgIGNoYXJhY3RlciBieXRlcy4KICogQHBhcmFtIGxlbmd0aCBUaGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gY29udmVydDsgdGhpcyBtYXkKICogICAgICAgICAgICAgICBpbmNsdWRlIHRoZSB0ZXJtaW5hdGluZyA8Y29kZT5OVUw8L2NvZGU+LgogKiBAc3RhYmxlCiAqLwpVX0NBUEkgdm9pZCBVX0VYUE9SVDIKdV9VQ2hhcnNUb0NoYXJzKGNvbnN0IFVDaGFyICp1cywgY2hhciAqY3MsIGludDMyX3QgbGVuZ3RoKTsKCi8qIERlZmluZSBVX1VQUEVSX09SRElOQUwgKi8KI2lmIFVfQ0hBUlNFVF9GQU1JTFk9PVVfQVNDSUlfRkFNSUxZCiMgICBkZWZpbmUgVV9VUFBFUl9PUkRJTkFMKHgpICgoeCktJ0EnKQojZWxpZiBVX0NIQVJTRVRfRkFNSUxZPT1VX0VCQ0RJQ19GQU1JTFkKIyAgIGRlZmluZSBVX1VQUEVSX09SRElOQUwoeCkgKCgoeCkgPCAnSicpID8gKCh4KS0nQScpIDogXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKCh4KSA8ICdTJykgPyAoKHgpLSdKJys5KSA6IFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoeCktJ1MnKzE4KSkpCiNlbHNlCiMgICBlcnJvciBVbmtub3duIGNoYXJzZXQgZmFtaWx5IQojZW5kaWYKCi8qKgogKiBNYXhpbXVtIHZhbHVlIG9mIGEgKHZvaWQqKSAtIHVzZSB0byBpbmRpY2F0ZSB0aGUgbGltaXQgb2YgYW4gJ2luZmluaXRlJyBidWZmZXIuCiAqIEluIGZhY3QsIGJ1ZmZlciBzaXplcyBtdXN0IG5vdCBleGNlZWQgMkdCIHNvIHRoYXQgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbgogKiB0aGUgYnVmZmVyIGxpbWl0IGFuZCB0aGUgYnVmZmVyIHN0YXJ0IGNhbiBiZSBleHByZXNzZWQgaW4gYW4gaW50MzJfdC4KICoKICogVGhlIGRlZmluaXRpb24gb2YgVV9NQVhfUFRSIG11c3QgZnVsZmlsbCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAqIC0gcmV0dXJuIHRoZSBsYXJnZXN0IHBvc3NpYmxlIHBvaW50ZXIgZ3JlYXRlciB0aGFuIGJhc2UKICogLSByZXR1cm4gYSB2YWxpZCBwb2ludGVyIGFjY29yZGluZyB0byB0aGUgbWFjaGluZSBhcmNoaXRlY3R1cmUgKEFTLzQwMCwgNjQtYml0LCBldGMuKQogKiAtIGF2b2lkIHdyYXBwaW5nIGFyb3VuZCBhdCBoaWdoIGFkZHJlc3NlcwogKiAtIG1ha2Ugc3VyZSB0aGF0IHRoZSByZXR1cm5lZCBwb2ludGVyIGlzIG5vdCBmYXJ0aGVyIGZyb20gYmFzZSB0aGFuIDB4N2ZmZmZmZmYKICoKICogQHBhcmFtIGJhc2UgVGhlIGJlZ2lubmluZyBvZiBhIGJ1ZmZlciB0byBmaW5kIHRoZSBtYXhpbXVtIG9mZnNldCBmcm9tCiAqIEBpbnRlcm5hbAogKi8KI2lmbmRlZiBVX01BWF9QVFIKIyAgaWZkZWYgT1MzOTAKIyAgICBkZWZpbmUgVV9NQVhfUFRSKGJhc2UpICgodm9pZCAqKTB4N2ZmZmZmZmYpCiMgIGVsaWYgZGVmaW5lZChPUzQwMCkKLyoKICogV2l0aCB0aGUgcHJvdmlkZWQgbWFjcm8gd2Ugc2hvdWxkIG5ldmVyIGJlIG91dCBvZiByYW5nZSBvZiBhIGdpdmVuIHNlZ21lbnQKICogKGEgdHJhZGl0aW9uYWwvdHlwaWNhbCBzZWdtZW50IHRoYXQgaXMpLiAgT3VyIHNlZ21lbnRzIGhhdmUgNSBieXRlcyBmb3IgdGhlIGlkCiAqIGFuZCAzIGJ5dGVzIGZvciB0aGUgb2Zmc2V0LiAgVGhlIGtleSBpcyB0aGF0IHRoZSBjYXN0aW5nIHRha2VzIGNhcmUgb2Ygb25seQogKiByZXRyaWV2aW5nIHRoZSBvZmZzZXQgcG9ydGlvbiBtaW51cyB4MTAwMC4gIEhlbmNlLCB0aGUgc21hbGxlc3Qgb2Zmc2V0IHNlZW4gaW4KICogYSBwcm9ncmFtIGlzIHgwMDEwMDAgYW5kIHdoZW4gY2FzdGVkIHRvIGFuIGludCB3b3VsZCBiZSAwLiAgVGhhdCdzIHdoeSB3ZSBjYW4KICogb25seSBhZGQgMHhmZmVmZmYuICBPdGhlcndpc2UsIHdlIHdvdWxkIGV4Y2VlZCB0aGUgc2VnbWVudC4KICoKICogQ3VycmVudGx5LCAxNk1CIGlzIHRoZSBjdXJyZW50IGFkZHJlc3NpbmcgbGltaXRhdGlvbiBvbiBhcy80MDAuICBUaGlzIG1hY3JvCiAqIG1heSBldmVudHVhbGx5IGJlIGNoYW5nZWQgdG8gdXNlIDJHQiBhZGRyZXNzYWJpbGl0eSBmb3IgdGhlIG5ld2VyIHZlcnNpb24gb2YKICogYXMvNDAwIG1hY2hpbmVzLgogKi8KIyAgICBkZWZpbmUgVV9NQVhfUFRSKGJhc2UpICgodm9pZCAqKSgoKGNoYXIgKiliYXNlKS0oKGludDMyX3QpKGJhc2UpKSsoKGludDMyX3QpMHhmZmVmZmYpKSkKIyAgZWxzZQojICAgIGRlZmluZSBVX01BWF9QVFIoYmFzZSkgKCh2b2lkICopKCgoY2hhciAqKShiYXNlKSsweDdmZmZmZmZmKSA+IChjaGFyICopKGJhc2UpID8gKChjaGFyICopKGJhc2UpKzB4N2ZmZmZmZmYpIDogKGNoYXIgKiktMSkpCiMgIGVuZGlmCiNlbmRpZgoKI2VuZGlmCg==