LyoNCiAgICBGcmVlUlRPUyBWNy40LjEgLSBDb3B5cmlnaHQgKEMpIDIwMTMgUmVhbCBUaW1lIEVuZ2luZWVycyBMdGQuDQoNCiAgICBGRUFUVVJFUyBBTkQgUE9SVFMgQVJFIEFEREVEIFRPIEZSRUVSVE9TIEFMTCBUSEUgVElNRS4gIFBMRUFTRSBWSVNJVA0KICAgIGh0dHA6Ly93d3cuRnJlZVJUT1Mub3JnIFRPIEVOU1VSRSBZT1UgQVJFIFVTSU5HIFRIRSBMQVRFU1QgVkVSU0lPTi4NCg0KICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQogICAgICogICAgRnJlZVJUT1MgdHV0b3JpYWwgYm9va3MgYXJlIGF2YWlsYWJsZSBpbiBwZGYgYW5kIHBhcGVyYmFjay4gICAgICAgICoNCiAgICAgKiAgICBDb21wbGV0ZSwgcmV2aXNlZCwgYW5kIGVkaXRlZCBwZGYgcmVmZXJlbmNlIG1hbnVhbHMgYXJlIGFsc28gICAgICAgKg0KICAgICAqICAgIGF2YWlsYWJsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQogICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCiAgICAgKiAgICBQdXJjaGFzaW5nIEZyZWVSVE9TIGRvY3VtZW50YXRpb24gd2lsbCBub3Qgb25seSBoZWxwIHlvdSwgYnkgICAgICAgKg0KICAgICAqICAgIGVuc3VyaW5nIHlvdSBnZXQgcnVubmluZyBhcyBxdWlja2x5IGFzIHBvc3NpYmxlIGFuZCB3aXRoIGFuICAgICAgICAqDQogICAgICogICAgaW4tZGVwdGgga25vd2xlZGdlIG9mIGhvdyB0byB1c2UgRnJlZVJUT1MsIGl0IHdpbGwgYWxzbyBoZWxwICAgICAgICoNCiAgICAgKiAgICB0aGUgRnJlZVJUT1MgcHJvamVjdCB0byBjb250aW51ZSB3aXRoIGl0cyBtaXNzaW9uIG9mIHByb3ZpZGluZyAgICAgKg0KICAgICAqICAgIHByb2Zlc3Npb25hbCBncmFkZSwgY3Jvc3MgcGxhdGZvcm0sIGRlIGZhY3RvIHN0YW5kYXJkIHNvbHV0aW9ucyAgICAqDQogICAgICogICAgZm9yIG1pY3JvY29udHJvbGxlcnMgLSBjb21wbGV0ZWx5IGZyZWUgb2YgY2hhcmdlISAgICAgICAgICAgICAgICAgICoNCiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KICAgICAqICAgID4+PiBTZWUgaHR0cDovL3d3dy5GcmVlUlRPUy5vcmcvRG9jdW1lbnRhdGlvbiBmb3IgZGV0YWlscy4gPDw8ICAgICAqDQogICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCiAgICAgKiAgICBUaGFuayB5b3UgZm9yIHVzaW5nIEZyZWVSVE9TLCBhbmQgdGhhbmsgeW91IGZvciB5b3VyIHN1cHBvcnQhICAgICAgKg0KICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQogICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoNCg0KICAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlUlRPUyBkaXN0cmlidXRpb24uDQoNCiAgICBGcmVlUlRPUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyDQogICAgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAodmVyc2lvbiAyKSBhcyBwdWJsaXNoZWQgYnkgdGhlDQogICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIEFORCBNT0RJRklFRCBCWSB0aGUgRnJlZVJUT1MgZXhjZXB0aW9uLg0KDQogICAgPj4+Pj4+Tk9URTw8PDw8PCBUaGUgbW9kaWZpY2F0aW9uIHRvIHRoZSBHUEwgaXMgaW5jbHVkZWQgdG8gYWxsb3cgeW91IHRvDQogICAgZGlzdHJpYnV0ZSBhIGNvbWJpbmVkIHdvcmsgdGhhdCBpbmNsdWRlcyBGcmVlUlRPUyB3aXRob3V0IGJlaW5nIG9ibGlnZWQgdG8NCiAgICBwcm92aWRlIHRoZSBzb3VyY2UgY29kZSBmb3IgcHJvcHJpZXRhcnkgY29tcG9uZW50cyBvdXRzaWRlIG9mIHRoZSBGcmVlUlRPUw0KICAgIGtlcm5lbC4NCg0KICAgIEZyZWVSVE9TIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWQ0KICAgIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MNCiAgICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlDQogICAgZGV0YWlscy4gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UNCiAgICBhbmQgdGhlIEZyZWVSVE9TIGxpY2Vuc2UgZXhjZXB0aW9uIGFsb25nIHdpdGggRnJlZVJUT1M7IGlmIG5vdCBpdCBjYW4gYmUNCiAgICB2aWV3ZWQgaGVyZTogaHR0cDovL3d3dy5mcmVlcnRvcy5vcmcvYTAwMTE0Lmh0bWwgYW5kIGFsc28gb2J0YWluZWQgYnkNCiAgICB3cml0aW5nIHRvIFJlYWwgVGltZSBFbmdpbmVlcnMgTHRkLiwgY29udGFjdCBkZXRhaWxzIGZvciB3aG9tIGFyZSBhdmFpbGFibGUNCiAgICBvbiB0aGUgRnJlZVJUT1MgV0VCIHNpdGUuDQoNCiAgICAxIHRhYiA9PSA0IHNwYWNlcyENCg0KICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQogICAgICogICAgSGF2aW5nIGEgcHJvYmxlbT8gIFN0YXJ0IGJ5IHJlYWRpbmcgdGhlIEZBUSAiTXkgYXBwbGljYXRpb24gZG9lcyAgICoNCiAgICAgKiAgICBub3QgcnVuLCB3aGF0IGNvdWxkIGJlIHdyb25nPyIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQogICAgICogICAgaHR0cDovL3d3dy5GcmVlUlRPUy5vcmcvRkFRSGVscC5odG1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KDQoNCiAgICBodHRwOi8vd3d3LkZyZWVSVE9TLm9yZyAtIERvY3VtZW50YXRpb24sIGJvb2tzLCB0cmFpbmluZywgbGF0ZXN0IHZlcnNpb25zLCANCiAgICBsaWNlbnNlIGFuZCBSZWFsIFRpbWUgRW5naW5lZXJzIEx0ZC4gY29udGFjdCBkZXRhaWxzLg0KDQogICAgaHR0cDovL3d3dy5GcmVlUlRPUy5vcmcvcGx1cyAtIEEgc2VsZWN0aW9uIG9mIEZyZWVSVE9TIGVjb3N5c3RlbSBwcm9kdWN0cywNCiAgICBpbmNsdWRpbmcgRnJlZVJUT1MrVHJhY2UgLSBhbiBpbmRpc3BlbnNhYmxlIHByb2R1Y3Rpdml0eSB0b29sLCBhbmQgb3VyIG5ldw0KICAgIGZ1bGx5IHRocmVhZCBhd2FyZSBhbmQgcmVlbnRyYW50IFVEUC9JUCBzdGFjay4NCg0KICAgIGh0dHA6Ly93d3cuT3BlblJUT1MuY29tIC0gUmVhbCBUaW1lIEVuZ2luZWVycyBsdGQgbGljZW5zZSBGcmVlUlRPUyB0byBIaWdoIA0KICAgIEludGVncml0eSBTeXN0ZW1zLCB3aG8gc2VsbCB0aGUgY29kZSB3aXRoIGNvbW1lcmNpYWwgc3VwcG9ydCwgDQogICAgaW5kZW1uaWZpY2F0aW9uIGFuZCBtaWRkbGV3YXJlLCB1bmRlciB0aGUgT3BlblJUT1MgYnJhbmQuDQogICAgDQogICAgaHR0cDovL3d3dy5TYWZlUlRPUy5jb20gLSBIaWdoIEludGVncml0eSBTeXN0ZW1zIGFsc28gcHJvdmlkZSBhIHNhZmV0eSANCiAgICBlbmdpbmVlcmVkIGFuZCBpbmRlcGVuZGVudGx5IFNJTDMgY2VydGlmaWVkIHZlcnNpb24gZm9yIHVzZSBpbiBzYWZldHkgYW5kIA0KICAgIG1pc3Npb24gY3JpdGljYWwgYXBwbGljYXRpb25zIHRoYXQgcmVxdWlyZSBwcm92YWJsZSBkZXBlbmRhYmlsaXR5Lg0KKi8NCg0KDQovKg0KICogQ3JlYXRlcyBhbGwgdGhlIGRlbW8gYXBwbGljYXRpb24gdGFza3MsIHRoZW4gc3RhcnRzIHRoZSBzY2hlZHVsZXIuICBUaGUgV0VCDQogKiBkb2N1bWVudGF0aW9uIHByb3ZpZGVzIG1vcmUgZGV0YWlscyBvZiB0aGUgc3RhbmRhcmQgZGVtbyBhcHBsaWNhdGlvbiB0YXNrcw0KICogKHdoaWNoIGp1c3QgZXhpc3QgdG8gdGVzdCB0aGUga2VybmVsIHBvcnQgYW5kIHByb3ZpZGUgYW4gZXhhbXBsZSBvZiBob3cgdG8gdXNlDQogKiBlYWNoIEZyZWVSVE9TIEFQSSBmdW5jdGlvbikuDQogKg0KICogSW4gYWRkaXRpb24gdG8gdGhlIHN0YW5kYXJkIGRlbW8gdGFza3MsIHRoZSBmb2xsb3dpbmcgdGFza3MgYW5kIHRlc3RzIGFyZQ0KICogZGVmaW5lZCBhbmQvb3IgY3JlYXRlZCB3aXRoaW4gdGhpcyBmaWxlOg0KICoNCiAqICJDaGVjayIgdGFzayAtIFRoaXMgb25seSBleGVjdXRlcyBldmVyeSBmaXZlIHNlY29uZHMgYnV0IGhhcyB0aGUgaGlnaGVzdA0KICogcHJpb3JpdHkgc28gaXMgZ3VhcmFudGVlZCB0byBnZXQgcHJvY2Vzc29yIHRpbWUuICBJdHMgbWFpbiBmdW5jdGlvbiBpcyB0byANCiAqIGNoZWNrIHRoYXQgYWxsIHRoZSBzdGFuZGFyZCBkZW1vIHRhc2tzIGFyZSBzdGlsbCBvcGVyYXRpb25hbC4gVGhlIGNoZWNrIHRhc2sNCiAqIHdpbGwgdG9nZ2xlIExFRCAzIChQQjExKSBldmVyeSBmaXZlIHNlY29uZHMgc28gbG9uZyBhcyBubyBlcnJvcnMgaGF2ZSBiZWVuDQogKiBkZXRlY3RlZC4gIFRoZSB0b2dnbGUgcmF0ZSB3aWxsIGluY3JlYXNlIHRvIGhhbGYgYSBzZWNvbmQgaWYgYW4gZXJyb3IgaGFzIA0KICogYmVlbiBmb3VuZCBpbiBhbnkgdGFzay4NCiAqDQogKiAiRWNobyIgdGFzayAtIFRoaXMgaXMgYSB2ZXJ5IGJhc2ljIHRhc2sgdGhhdCBzaW1wbHkgZWNob2VzIGFueSBjaGFyYWN0ZXJzIA0KICogcmVjZWl2ZWQgb24gQ09NMCAoVVNBUlQxKS4gIFRoaXMgY2FuIGJlIHRlc3RlZCBieSB0cmFuc21pdHRpbmcgYSB0ZXh0IGZpbGUNCiAqIGZyb20gYSBkdW1iIHRlcm1pbmFsIHRvIHRoZSBTVE0zMiBVU0FSVCB0aGVuIG9ic2VydmluZyBvciBjYXB0dXJpbmcgdGhlIHRleHQNCiAqIHRoYXQgaXMgZWNob2VkIGJhY2suICBNaXNzaW5nIGNoYXJhY3RlcnMgd2lsbCBiZSBhbGwgdGhlIG1vcmUgb2J2aW91cyBpZiB0aGUgDQogKiBmaWxlIGNvbnRhaW5zIGEgc2ltcGxlIHJlcGVhdGluZyBzdHJpbmcgb2YgZml4ZWQgd2lkdGguDQogKg0KICogQ3VycmVudGx5IHRoaXMgZGVtbyBkb2VzIG5vdCBpbmNsdWRlIGludGVycnVwdCBuZXN0aW5nIGV4YW1wbGVzLiAgSGlnaCANCiAqIGZyZXF1ZW5jeSB0aW1lciBhbmQgc2ltcGxlciBuZXN0aW5nIGV4YW1wbGVzIGNhbiBiZSBmb3VuZCBpbiBtb3N0IENvcnRleC1NMw0KICogZGVtbyBhcHBsaWNhdGlvbnMuDQogKg0KICogVGhlIGZ1bmN0aW9ucyB1c2VkIHRvIGluaXRpYWxpc2UsIHNldCBhbmQgY2xlYXIgTEVEIG91dHB1dHMgYXJlIG5vcm1hbGx5IA0KICogZGVmaW5lZCBpbiBwYXJ0ZXN0LmMuICBUaGlzIGRlbW8gaW5jbHVkZXMgdHdvIHBhcnRlc3QgZmlsZXMsIG9uZSB0aGF0IGlzIA0KICogY29uZmlndXJlZCBmb3IgdXNlIHdpdGggdGhlIEtlaWwgTUNCU1RNMzIgZXZhbHVhdGlvbiBib2FyZCAoY2FsbGVkIA0KICogUGFyVGVzdF9NQ0JTVE0zMi5jKSBhbmQgb25lIHRoYXQgaXMgY29uZmlndXJlZCBmb3IgdXNlIHdpdGggdGhlIG9mZmljaWFsDQogKiBTVCBFdmFsIGJvYXJkIChjYWxsZWQgUGFyVGVzdF9TVF9FdmFsLmMpLiAgT25lIG9uZSBvZiB0aGVzZSBmaWxlcyBzaG91bGQgYmUNCiAqIGluY2x1ZGVkIGluIHRoZSBidWlsZCBhdCBhbnkgb25lIHRpbWUsIGFzIGFwcHJvcHJpYXRlIGZvciB0aGUgaGFyZHdhcmUgDQogKiBhY3R1YWxseSBiZWluZyB1c2VkLg0KICovDQoNCi8qIFN0YW5kYXJkIGluY2x1ZGVzLiAqLw0KI2luY2x1ZGUgPHN0cmluZy5oPg0KDQovKiBTY2hlZHVsZXIgaW5jbHVkZXMuICovDQojaW5jbHVkZSAiRnJlZVJUT1MuaCINCiNpbmNsdWRlICJ0YXNrLmgiDQojaW5jbHVkZSAicXVldWUuaCINCg0KLyogTGlicmFyeSBpbmNsdWRlcy4gKi8NCiNpbmNsdWRlICJzdG0zMmYxMHhfaXQuaCINCg0KLyogRGVtbyBhcHAgaW5jbHVkZXMuICovDQojaW5jbHVkZSAiQmxvY2tRLmgiDQojaW5jbHVkZSAiaW50ZWdlci5oIg0KI2luY2x1ZGUgImZsYXNoLmgiDQojaW5jbHVkZSAicGFydGVzdC5oIg0KI2luY2x1ZGUgInNlbXRlc3QuaCINCiNpbmNsdWRlICJHZW5RVGVzdC5oIg0KI2luY2x1ZGUgIlFQZWVrLmgiDQojaW5jbHVkZSAicmVjbXV0ZXguaCINCg0KLyogRHJpdmVyIGluY2x1ZGVzLiAqLw0KI2luY2x1ZGUgIlNUTTMyX1VTQVJULmgiDQoNCg0KLyogVGhlIHRpbWUgYmV0d2VlbiBjeWNsZXMgb2YgdGhlICdjaGVjaycgdGFzayAtIHdoaWNoIGRlcGVuZHMgb24gd2hldGhlciB0aGUNCmNoZWNrIHRhc2sgaGFzIGRldGVjdGVkIGFuIGVycm9yIG9yIG5vdC4gKi8NCiNkZWZpbmUgbWFpbkNIRUNLX0RFTEFZX05PX0VSUk9SCQkJKCAoIHBvcnRUaWNrVHlwZSApIDUwMDAgLyBwb3J0VElDS19SQVRFX01TICkNCiNkZWZpbmUgbWFpbkNIRUNLX0RFTEFZX0VSUk9SCQkJCSggKCBwb3J0VGlja1R5cGUgKSA1MDAgLyBwb3J0VElDS19SQVRFX01TICkNCg0KLyogVGhlIExFRCBjb250cm9sbGVkIGJ5IHRoZSAnY2hlY2snIHRhc2suICovDQojZGVmaW5lIG1haW5DSEVDS19MRUQJCQkJCQkoIDMgKQ0KDQovKiBUYXNrIHByaW9yaXRpZXMuICovDQojZGVmaW5lIG1haW5TRU1fVEVTVF9QUklPUklUWQkJCQkoIHRza0lETEVfUFJJT1JJVFkgKyAxICkNCiNkZWZpbmUgbWFpbkJMT0NLX1FfUFJJT1JJVFkJCQkJKCB0c2tJRExFX1BSSU9SSVRZICsgMiApDQojZGVmaW5lIG1haW5DSEVDS19UQVNLX1BSSU9SSVRZCQkJCSggdHNrSURMRV9QUklPUklUWSArIDMgKQ0KI2RlZmluZSBtYWluRkxBU0hfVEFTS19QUklPUklUWQkJCQkoIHRza0lETEVfUFJJT1JJVFkgKyAyICkNCiNkZWZpbmUgbWFpbkVDSE9fVEFTS19QUklPUklUWQkJCQkoIHRza0lETEVfUFJJT1JJVFkgKyAxICkNCiNkZWZpbmUgbWFpbklOVEVHRVJfVEFTS19QUklPUklUWSAgICAgICAgICAgKCB0c2tJRExFX1BSSU9SSVRZICkNCiNkZWZpbmUgbWFpbkdFTl9RVUVVRV9UQVNLX1BSSU9SSVRZCQkJKCB0c2tJRExFX1BSSU9SSVRZICkNCg0KLyogQ09NIHBvcnQgYW5kIGJhdWQgcmF0ZSB1c2VkIGJ5IHRoZSBlY2hvIHRhc2suICovDQojZGVmaW5lIG1haW5DT00wCQkJCQkJCSggMCApDQojZGVmaW5lIG1haW5CQVVEX1JBVEUJCQkJCQkoIDExNTIwMCApDQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KDQovKg0KICogQ29uZmlndXJlIHRoZSBoYXJkd2FyZSBmb3IgdGhlIGRlbW8uDQogKi8NCnN0YXRpYyB2b2lkIHBydlNldHVwSGFyZHdhcmUoIHZvaWQgKTsNCg0KLyogVGhlICdjaGVjaycgdGFzayBhcyBkZXNjcmliZWQgYXQgdGhlIHRvcCBvZiB0aGlzIGZpbGUuICovDQpzdGF0aWMgdm9pZCBwcnZDaGVja1Rhc2soIHZvaWQgKnB2UGFyYW1ldGVycyApOw0KDQovKiBBIHNpbXBsZSB0YXNrIHRoYXQgZWNob2VzIGFsbCB0aGUgY2hhcmFjdGVycyB0aGF0IGFyZSByZWNlaXZlZCBvbiBDT00wIA0KKFVTQVJUMSkuICovDQpzdGF0aWMgdm9pZCBwcnZVU0FSVEVjaG9UYXNrKCB2b2lkICpwdlBhcmFtZXRlcnMgKTsNCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQoNCmludCBtYWluKCB2b2lkICkNCnsNCiNpZmRlZiBERUJVRw0KICBkZWJ1ZygpOw0KI2VuZGlmDQoNCgkvKiBTZXQgdXAgdGhlIGNsb2NrcyBhbmQgbWVtb3J5IGludGVyZmFjZS4gKi8NCglwcnZTZXR1cEhhcmR3YXJlKCk7DQoNCgkvKiBTdGFydCB0aGUgc3RhbmRhcmQgZGVtbyB0YXNrcy4gIFRoZXNlIGFyZSBqdXN0IGhlcmUgdG8gZXhlcmNpc2UgdGhlDQoJa2VybmVsIHBvcnQgYW5kIHByb3ZpZGUgZXhhbXBsZXMgb2YgaG93IHRoZSBGcmVlUlRPUyBBUEkgY2FuIGJlIHVzZWQuICovDQoJdlN0YXJ0QmxvY2tpbmdRdWV1ZVRhc2tzKCBtYWluQkxPQ0tfUV9QUklPUklUWSApOw0KICAgIHZTdGFydFNlbWFwaG9yZVRhc2tzKCBtYWluU0VNX1RFU1RfUFJJT1JJVFkgKTsNCiAgICB2U3RhcnRJbnRlZ2VyTWF0aFRhc2tzKCBtYWluSU5URUdFUl9UQVNLX1BSSU9SSVRZICk7DQogICAgdlN0YXJ0R2VuZXJpY1F1ZXVlVGFza3MoIG1haW5HRU5fUVVFVUVfVEFTS19QUklPUklUWSApOw0KCXZTdGFydExFREZsYXNoVGFza3MoIG1haW5GTEFTSF9UQVNLX1BSSU9SSVRZICk7DQogICAgdlN0YXJ0UXVldWVQZWVrVGFza3MoKTsNCiAgICB2U3RhcnRSZWN1cnNpdmVNdXRleFRhc2tzKCk7DQoNCgkvKiBDcmVhdGUgdGhlICdlY2hvJyB0YXNrLCB3aGljaCBpcyBhbHNvIGRlZmluZWQgd2l0aGluIHRoaXMgZmlsZS4gKi8NCgl4VGFza0NyZWF0ZSggcHJ2VVNBUlRFY2hvVGFzaywgKCBzaWduZWQgY2hhciAqICkgIkVjaG8iLCBjb25maWdNSU5JTUFMX1NUQUNLX1NJWkUsIE5VTEwsIG1haW5FQ0hPX1RBU0tfUFJJT1JJVFksIE5VTEwgKTsNCg0KCS8qIENyZWF0ZSB0aGUgJ2NoZWNrJyB0YXNrLCB3aGljaCBpcyBhbHNvIGRlZmluZWQgd2l0aGluIHRoaXMgZmlsZS4gKi8NCgl4VGFza0NyZWF0ZSggcHJ2Q2hlY2tUYXNrLCAoIHNpZ25lZCBjaGFyICogKSAiQ2hlY2siLCBjb25maWdNSU5JTUFMX1NUQUNLX1NJWkUsIE5VTEwsIG1haW5DSEVDS19UQVNLX1BSSU9SSVRZLCBOVUxMICk7DQoNCiAgICAvKiBTdGFydCB0aGUgc2NoZWR1bGVyLiAqLw0KCXZUYXNrU3RhcnRTY2hlZHVsZXIoKTsNCg0KICAgIC8qIFdpbGwgb25seSBnZXQgaGVyZSBpZiB0aGVyZSB3YXMgaW5zdWZmaWNpZW50IG1lbW9yeSB0byBjcmVhdGUgdGhlIGlkbGUNCiAgICB0YXNrLiAgVGhlIGlkbGUgdGFzayBpcyBjcmVhdGVkIHdpdGhpbiB2VGFza1N0YXJ0U2NoZWR1bGVyKCkuICovDQoJZm9yKCA7OyApOw0KfQ0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQoNCi8qIERlc2NyaWJlZCBhdCB0aGUgdG9wIG9mIHRoaXMgZmlsZS4gKi8NCnN0YXRpYyB2b2lkIHBydkNoZWNrVGFzayggdm9pZCAqcHZQYXJhbWV0ZXJzICkNCnsNCnBvcnRUaWNrVHlwZSB4TGFzdEV4ZWN1dGlvblRpbWU7DQp1bnNpZ25lZCBsb25nIHVsVGlja3NUb1dhaXQgPSBtYWluQ0hFQ0tfREVMQVlfTk9fRVJST1I7DQoNCgkvKiBKdXN0IHRvIHJlbW92ZSB0aGUgY29tcGlsZXIgd2FybmluZyBhYm91dCB0aGUgdW51c2VkIHBhcmFtZXRlci4gKi8NCgkoIHZvaWQgKSBwdlBhcmFtZXRlcnM7DQoNCgkvKiBJbml0aWFsaXNlIHRoZSB2YXJpYWJsZSB1c2VkIHRvIGNvbnRyb2wgb3VyIGl0ZXJhdGlvbiByYXRlIHByaW9yIHRvDQoJaXRzIGZpcnN0IHVzZS4gKi8NCgl4TGFzdEV4ZWN1dGlvblRpbWUgPSB4VGFza0dldFRpY2tDb3VudCgpOw0KDQoJZm9yKCA7OyApDQoJew0KCQkvKiBXYWl0IHVudGlsIGl0IGlzIHRpbWUgdG8gcnVuIHRoZSB0ZXN0cyBhZ2Fpbi4gKi8NCgkJdlRhc2tEZWxheVVudGlsKCAmeExhc3RFeGVjdXRpb25UaW1lLCB1bFRpY2tzVG9XYWl0ICk7DQoNCgkJLyogSGFzIGFuIGVycm9yIGJlZW4gZm91bmQgaW4gYW55IHRhc2s/ICovDQoJCWlmKCB4QXJlR2VuZXJpY1F1ZXVlVGFza3NTdGlsbFJ1bm5pbmcoKSAhPSBwZFRSVUUgKQ0KCQl7DQoJCQkvKiBSZWR1Y2UgdGhlIHRpbWUgYmV0d2VlbiBjeWNsZXMgb2YgdGhpcyB0YXNrIC0gd2hpY2ggaGFzIHRoZQ0KCQkJZWZmZWN0IG9mIGluY3JlYXNpbmcgdGhlIHJhdGUgYXQgd2hpY2ggdGhlICdjaGVjaycgTEVEIHRvZ2dsZXMgdG8NCgkJCWluZGljYXRlIHRoZSBleGlzdGVuY2Ugb2YgYW4gZXJyb3IgdG8gYW4gb2JzZXJ2ZXIuICovDQoJCQl1bFRpY2tzVG9XYWl0ID0gbWFpbkNIRUNLX0RFTEFZX0VSUk9SOw0KCQl9DQoJCWVsc2UgaWYoIHhBcmVRdWV1ZVBlZWtUYXNrc1N0aWxsUnVubmluZygpICE9IHBkVFJVRSApDQoJCXsNCgkJCXVsVGlja3NUb1dhaXQgPSBtYWluQ0hFQ0tfREVMQVlfRVJST1I7DQoJCX0NCgkJZWxzZSBpZiggeEFyZUJsb2NraW5nUXVldWVzU3RpbGxSdW5uaW5nKCkgIT0gcGRUUlVFICkNCgkJew0KCQkJdWxUaWNrc1RvV2FpdCA9IG1haW5DSEVDS19ERUxBWV9FUlJPUjsNCgkJfQ0KCSAgICBlbHNlIGlmKCB4QXJlU2VtYXBob3JlVGFza3NTdGlsbFJ1bm5pbmcoKSAhPSBwZFRSVUUgKQ0KCSAgICB7DQoJICAgICAgICB1bFRpY2tzVG9XYWl0ID0gbWFpbkNIRUNLX0RFTEFZX0VSUk9SOw0KCSAgICB9DQoJICAgIGVsc2UgaWYoIHhBcmVJbnRlZ2VyTWF0aHNUYXNrU3RpbGxSdW5uaW5nKCkgIT0gcGRUUlVFICkNCgkgICAgew0KCSAgICAgICAgdWxUaWNrc1RvV2FpdCA9IG1haW5DSEVDS19ERUxBWV9FUlJPUjsNCgkgICAgfQ0KCSAgICBlbHNlIGlmKCB4QXJlUmVjdXJzaXZlTXV0ZXhUYXNrc1N0aWxsUnVubmluZygpICE9IHBkVFJVRSApDQoJICAgIHsNCgkgICAgCXVsVGlja3NUb1dhaXQgPSBtYWluQ0hFQ0tfREVMQVlfRVJST1I7DQoJICAgIH0NCg0KCQl2UGFyVGVzdFRvZ2dsZUxFRCggbWFpbkNIRUNLX0xFRCApOw0KCX0NCn0NCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KDQovKiBEZXNjcmliZWQgYXQgdGhlIHRvcCBvZiB0aGlzIGZpbGUuICovDQpzdGF0aWMgdm9pZCBwcnZVU0FSVEVjaG9UYXNrKCB2b2lkICpwdlBhcmFtZXRlcnMgKQ0Kew0Kc2lnbmVkIGNoYXIgY0NoYXI7DQoNCi8qIFN0cmluZyBkZWNsYXJlZCBzdGF0aWMgdG8gZW5zdXJlIGl0IGRvZXMgbm90IGVuZCB1cCBvbiB0aGUgc3RhY2ssIG5vIG1hdHRlcg0Kd2hhdCB0aGUgb3B0aW1pc2F0aW9uIGxldmVsLiAqLw0Kc3RhdGljIGNvbnN0IGNoYXIgKnBjTG9uZ2lzaFN0cmluZyA9IA0KIkFCQkEgd2FzIGEgU3dlZGlzaCBwb3AgbXVzaWMgZ3JvdXAgZm9ybWVkIGluIFN0b2NraG9sbSBpbiAxOTcyLCBjb25zaXN0aW5nIG9mIEFubmktRnJpZCBGcmlkYSBMeW5nc3RhZCwgIg0KIkJq9nJuIFVsdmFldXMsIEJlbm55IEFuZGVyc3NvbiBhbmQgQWduZXRoYSBG5Gx0c2tvZy4gVGhyb3VnaG91dCB0aGUgYmFuZCdzIGV4aXN0ZW5jZSwgRuRsdHNrb2cgYW5kIFVsdmFldXMgIg0KIndlcmUgYSBtYXJyaWVkIGNvdXBsZSwgYXMgd2VyZSBMeW5nc3RhZCBhbmQgQW5kZXJzc29uIC0gYWx0aG91Z2ggYm90aCBjb3VwbGVzIGxhdGVyIGRpdm9yY2VkLiBUaGV5IGJlY2FtZSBvbmUgIg0KIm9mIHRoZSBtb3N0IGNvbW1lcmNpYWxseSBzdWNjZXNzZnVsIGFjdHMgaW4gdGhlIGhpc3Rvcnkgb2YgcG9wdWxhciBtdXNpYywgYW5kIHRoZXkgdG9wcGVkIHRoZSBjaGFydHMgd29ybGR3aWRlICINCiJmcm9tIDE5NzIgdG8gMTk4My4gIEFCQkEgZ2FpbmVkIGludGVybmF0aW9uYWwgcG9wdWxhcml0eSBlbXBsb3lpbmcgY2F0Y2h5IHNvbmcgaG9va3MsIHNpbXBsZSBseXJpY3MsIHNvdW5kICINCiJlZmZlY3RzIChyZXZlcmIsIHBoYXNpbmcpIGFuZCBhIFdhbGwgb2YgU291bmQgYWNoaWV2ZWQgYnkgb3ZlcmR1YmJpbmcgdGhlIGZlbWFsZSBzaW5nZXJzJyB2b2ljZXMgaW4gbXVsdGlwbGUgIg0KImhhcm1vbmllcy4gQXMgdGhlaXIgcG9wdWxhcml0eSBncmV3LCB0aGV5IHdlcmUgc291Z2h0IGFmdGVyIHRvIHRvdXIgRXVyb3BlLCBBdXN0cmFsaWEsIGFuZCBOb3J0aCBBbWVyaWNhLCBkcmF3aW5nICINCiJjcm93ZHMgb2YgYXJkZW50IGZhbnMsIG5vdGFibHkgaW4gQXVzdHJhbGlhLiBUb3VyaW5nIGJlY2FtZSBhIGNvbnRlbnRpb3VzIGlzc3VlLCBiZWluZyBwYXJ0aWN1bGFybHkgY3VtYmVyc29tZSBmb3IgIg0KIkbkbHRza29nLCBidXQgdGhleSBjb250aW51ZWQgdG8gcmVsZWFzZSBzdHVkaW8gYWxidW1zIHRvIHdpZGVzcHJlYWQgY29tbWVyY2lhbCBzdWNjZXNzLiBBdCB0aGUgaGVpZ2h0IG9mIHRoZWlyICINCiJwb3B1bGFyaXR5LCBob3dldmVyLCBib3RoIHJlbGF0aW9uc2hpcHMgYmVnYW4gc3VmZmVyaW5nIHN0cmFpbiB0aGF0IGxlZCB1bHRpbWF0ZWx5IHRvIHRoZSBjb2xsYXBzZSBvZiBmaXJzdCB0aGUgIg0KIlVsdmFldXMtRuRsdHNrb2cgbWFycmlhZ2UgKGluIDE5NzkpIGFuZCB0aGVuIG9mIHRoZSBBbmRlcnNzb24tTHluZ3N0YWQgbWFycmlhZ2UgaW4gMTk4MS4gSW4gdGhlIGxhdGUgMTk3MHMgYW5kIGVhcmx5ICINCiIxOTgwcyB0aGVzZSByZWxhdGlvbnNoaXAgY2hhbmdlcyBiZWdhbiBtYW5pZmVzdGluZyBpbiB0aGUgZ3JvdXAncyBtdXNpYywgYXMgdGhleSBwcm9kdWNlZCBtb3JlIHRob3VnaHRmdWwsICINCiJpbnRyb3NwZWN0aXZlIGx5cmljcyB3aXRoIGRpZmZlcmVudCBjb21wb3NpdGlvbnMuIjsNCg0KCS8qIEp1c3QgdG8gYXZvaWQgY29tcGlsZXIgd2FybmluZ3MuICovDQoJKCB2b2lkICkgcHZQYXJhbWV0ZXJzOw0KDQoJLyogSW5pdGlhbGlzZSBDT00wLCB3aGljaCBpcyBVU0FSVDEgYWNjb3JkaW5nIHRvIHRoZSBTVE0zMiBsaWJyYXJpZXMuICovDQoJbENPTVBvcnRJbml0KCBtYWluQ09NMCwgbWFpbkJBVURfUkFURSApOw0KDQoJLyogVHJ5IHNlbmRpbmcgb3V0IGEgc3RyaW5nIGFsbCBpbiBvbmUgZ28sIGFzIGEgdmVyeSBiYXNpYyB0ZXN0IG9mIHRoZQ0KICAgIGxTZXJpYWxQdXRTdHJpbmcoKSBmdW5jdGlvbi4gKi8NCiAgICBsU2VyaWFsUHV0U3RyaW5nKCBtYWluQ09NMCwgcGNMb25naXNoU3RyaW5nLCBzdHJsZW4oIHBjTG9uZ2lzaFN0cmluZyApICk7DQoNCglmb3IoIDs7ICkNCgl7DQoJCS8qIEJsb2NrIHRvIHdhaXQgZm9yIGEgY2hhcmFjdGVyIHRvIGJlIHJlY2VpdmVkIG9uIENPTTAuICovDQoJCXhTZXJpYWxHZXRDaGFyKCBtYWluQ09NMCwgJmNDaGFyLCBwb3J0TUFYX0RFTEFZICk7DQoNCgkJLyogV3JpdGUgdGhlIHJlY2VpdmVkIGNoYXJhY3RlciBiYWNrIHRvIENPTTAuICovDQoJCXhTZXJpYWxQdXRDaGFyKCBtYWluQ09NMCwgY0NoYXIsIDAgKTsNCgl9DQp9DQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCg0Kc3RhdGljIHZvaWQgcHJ2U2V0dXBIYXJkd2FyZSggdm9pZCApDQp7DQoJLyogUkNDIHN5c3RlbSByZXNldChmb3IgZGVidWcgcHVycG9zZSkuICovDQoJUkNDX0RlSW5pdCAoKTsgICAgICAgICAgICAgICAgICAgICAgICANCg0KICAgIC8qIEVuYWJsZSBIU0UuICovDQoJUkNDX0hTRUNvbmZpZyggUkNDX0hTRV9PTiApOyAgICAgICAgICAgDQoJDQoJLyogV2FpdCB0aWxsIEhTRSBpcyByZWFkeS4gKi8NCgl3aGlsZSAoUkNDX0dldEZsYWdTdGF0dXMoUkNDX0ZMQUdfSFNFUkRZKSA9PSBSRVNFVCk7DQoJDQogICAgLyogSENMSyA9IFNZU0NMSy4gKi8NCglSQ0NfSENMS0NvbmZpZyggUkNDX1NZU0NMS19EaXYxICk7ICAgDQoNCiAgICAvKiBQQ0xLMiAgPSBIQ0xLLiAqLw0KCVJDQ19QQ0xLMkNvbmZpZyggUkNDX0hDTEtfRGl2MSApOyAgICAgDQoNCiAgICAvKiBQQ0xLMSAgPSBIQ0xLLzIuICovDQoJUkNDX1BDTEsxQ29uZmlnKCBSQ0NfSENMS19EaXYyICk7ICAgICANCg0KCS8qIEFEQ0NMSyA9IFBDTEsyLzQuICovDQoJUkNDX0FEQ0NMS0NvbmZpZyggUkNDX1BDTEsyX0RpdjQgKTsgICAgDQoJDQogICAgLyogRmxhc2ggMiB3YWl0IHN0YXRlLiAqLw0KCSooIHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgICogKTB4NDAwMjIwMDAgPSAweDAxOyAgICAgICAgICAgDQoJDQoJLyogUExMQ0xLID0gOE1IeiAqIDkgPSA3MiBNSHogKi8NCglSQ0NfUExMQ29uZmlnKCBSQ0NfUExMU291cmNlX0hTRV9EaXYxLCBSQ0NfUExMTXVsXzkgKTsNCgkNCiAgICAvKiBFbmFibGUgUExMLiAqLw0KCVJDQ19QTExDbWQoIEVOQUJMRSApOw0KCQ0KCS8qIFdhaXQgdGlsbCBQTEwgaXMgcmVhZHkuICovDQoJd2hpbGUgKFJDQ19HZXRGbGFnU3RhdHVzKFJDQ19GTEFHX1BMTFJEWSkgPT0gUkVTRVQpOw0KCQ0KCS8qIFNlbGVjdCBQTEwgYXMgc3lzdGVtIGNsb2NrIHNvdXJjZS4gKi8NCglSQ0NfU1lTQ0xLQ29uZmlnIChSQ0NfU1lTQ0xLU291cmNlX1BMTENMSyk7DQoJDQoJLyogV2FpdCB0aWxsIFBMTCBpcyB1c2VkIGFzIHN5c3RlbSBjbG9jayBzb3VyY2UuICovDQoJd2hpbGUgKFJDQ19HZXRTWVNDTEtTb3VyY2UoKSAhPSAweDA4KTsNCg0KCS8qIEVuYWJsZSBHUElPQSwgR1BJT0IsIEdQSU9DLCBHUElPRCwgR1BJT0UgYW5kIEFGSU8gY2xvY2tzICovDQoJUkNDX0FQQjJQZXJpcGhDbG9ja0NtZCgJUkNDX0FQQjJQZXJpcGhfR1BJT0EgfCBSQ0NfQVBCMlBlcmlwaF9HUElPQiB8UkNDX0FQQjJQZXJpcGhfR1BJT0MNCgkJCQkJCQl8IFJDQ19BUEIyUGVyaXBoX0dQSU9EIHwgUkNDX0FQQjJQZXJpcGhfR1BJT0UgfCBSQ0NfQVBCMlBlcmlwaF9BRklPLCBFTkFCTEUgKTsNCg0KCS8qIFNldCB0aGUgVmVjdG9yIFRhYmxlIGJhc2UgYWRkcmVzcyBhdCAweDA4MDAwMDAwLiAqLw0KCU5WSUNfU2V0VmVjdG9yVGFibGUoIE5WSUNfVmVjdFRhYl9GTEFTSCwgMHgwICk7DQoNCglOVklDX1ByaW9yaXR5R3JvdXBDb25maWcoIE5WSUNfUHJpb3JpdHlHcm91cF80ICk7DQoNCgkvKiBDb25maWd1cmUgSENMSyBjbG9jayBhcyBTeXNUaWNrIGNsb2NrIHNvdXJjZS4gKi8NCglTeXNUaWNrX0NMS1NvdXJjZUNvbmZpZyggU3lzVGlja19DTEtTb3VyY2VfSENMSyApOw0KDQoJLyogSW5pdGlhbGlzZSB0aGUgSU8gdXNlZCBmb3IgdGhlIExFRCBvdXRwdXRzLiAqLw0KCXZQYXJUZXN0SW5pdGlhbGlzZSgpOw0KDQoJLyogU1BJMiBQZXJpcGggY2xvY2sgZW5hYmxlICovDQoJUkNDX0FQQjFQZXJpcGhDbG9ja0NtZCggUkNDX0FQQjFQZXJpcGhfU1BJMiwgRU5BQkxFICk7DQp9DQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCg0Kdm9pZCB2QXBwbGljYXRpb25TdGFja092ZXJmbG93SG9vayggeFRhc2tIYW5kbGUgcHhUYXNrLCBzaWduZWQgY2hhciAqcGNUYXNrTmFtZSApDQp7DQoJLyogVGhpcyBmdW5jdGlvbiB3aWxsIGdldCBjYWxsZWQgaWYgYSB0YXNrIG92ZXJmbG93cyBpdHMgc3RhY2suICAgSWYgdGhlDQoJcGFyYW1ldGVycyBhcmUgY29ycnVwdCB0aGVuIGluc3BlY3QgcHhDdXJyZW50VENCIHRvIGZpbmQgd2hpY2ggd2FzIHRoZQ0KCW9mZmVuZGluZyB0YXNrLiAqLw0KDQoJKCB2b2lkICkgcHhUYXNrOw0KCSggdm9pZCApIHBjVGFza05hbWU7DQoNCglmb3IoIDs7ICk7DQp9DQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCg0Kdm9pZCBhc3NlcnRfZmFpbGVkKCB1bnNpZ25lZCBjaGFyICpwdWNGaWxlLCB1bnNpZ25lZCBsb25nIHVsTGluZSApDQp7DQoJKCB2b2lkICkgcHVjRmlsZTsNCgkoIHZvaWQgKSB1bExpbmU7DQoNCglmb3IoIDs7ICk7DQp9DQoNCg==