IwojIEZyZWVUeXBlIDIgaG9zdCBwbGF0Zm9ybSBkZXRlY3Rpb24gcnVsZXMKIwoKCiMgQ29weXJpZ2h0IDE5OTYtMjAxNSBieQojIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KIwojIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgbW9kaWZpZWQsCiMgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCBsaWNlbnNlLAojIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgeW91CiMgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQKIyBmdWxseS4KCgojIFRoaXMgc3ViLU1ha2VmaWxlIGlzIGluIGNoYXJnZSBvZiBkZXRlY3RpbmcgdGhlIGN1cnJlbnQgcGxhdGZvcm0uICBJdCBzZXRzCiMgdGhlIGZvbGxvd2luZyB2YXJpYWJsZXM6CiMKIyAgIEJVSUxEX0RJUiAgICBUaGUgY29uZmlndXJhdGlvbiBhbmQgc3lzdGVtLXNwZWNpZmljIGRpcmVjdG9yeS4gIFVzdWFsbHkKIyAgICAgICAgICAgICAgICBgYnVpbGRzLyQoUExBVEZPUk0pJyBidXQgY2FuIGJlIGRpZmZlcmVudCBmb3IgY3VzdG9tIGJ1aWxkcwojICAgICAgICAgICAgICAgIG9mIHRoZSBsaWJyYXJ5LgojCiMgVGhlIGZvbGxvd2luZyB2YXJpYWJsZXMgbXVzdCBiZSBkZWZpbmVkIGluIHN5c3RlbSBzcGVjaWZpYyBgZGV0ZWN0Lm1rJwojIGZpbGVzOgojCiMgICBQTEFURk9STSAgICAgVGhlIGRldGVjdGVkIHBsYXRmb3JtLiAgVGhpcyB3aWxsIGRlZmF1bHQgdG8gYGFuc2knIGlmCiMgICAgICAgICAgICAgICAgYXV0by1kZXRlY3Rpb24gZmFpbHMuCiMgICBDT05GSUdfRklMRSAgVGhlIGNvbmZpZ3VyYXRpb24gc3ViLW1ha2VmaWxlIHRvIHVzZS4gIFRoaXMgdXN1YWxseSBkZXBlbmRzCiMgICAgICAgICAgICAgICAgb24gdGhlIGNvbXBpbGVyIGRlZmluZWQgaW4gdGhlIGBDQycgZW52aXJvbm1lbnQgdmFyaWFibGUuCiMgICBERUxFVEUgICAgICAgVGhlIHNoZWxsIGNvbW1hbmQgdXNlZCB0byByZW1vdmUgYSBnaXZlbiBmaWxlLgojICAgQ09QWSAgICAgICAgIFRoZSBzaGVsbCBjb21tYW5kIHVzZWQgdG8gY29weSBvbmUgZmlsZS4KIyAgIFNFUCAgICAgICAgICBUaGUgcGxhdGZvcm0tc3BlY2lmaWMgZGlyZWN0b3J5IHNlcGFyYXRvci4KIyAgIENPTVBJTEVSX1NFUCBUaGUgc2VwYXJhdG9yIHVzZWQgaW4gYXJndW1lbnRzIG9mIHRoZSBjb21waWxhdGlvbiB0b29scy4KIyAgIENDICAgICAgICAgICBUaGUgY29tcGlsZXIgdG8gdXNlLgojCiMgWW91IG5lZWQgdG8gc2V0IHRoZSBmb2xsb3dpbmcgdmFyaWFibGUocykgYmVmb3JlIGNhbGxpbmcgaXQ6CiMKIyAgIFRPUF9ESVIgICAgICBUaGUgdG9wLW1vc3QgZGlyZWN0b3J5IGluIHRoZSBGcmVlVHlwZSBsaWJyYXJ5IHNvdXJjZQojICAgICAgICAgICAgICAgIGhpZXJhcmNoeS4gIElmIG5vdCBkZWZpbmVkLCBpdCB3aWxsIGRlZmF1bHQgdG8gYC4nLgoKIyBTZXQgYXV0by1kZXRlY3Rpb24gZGVmYXVsdCB0byBgYW5zaScgcmVzcC4gVU5JWC1saWtlIG9wZXJhdGluZyBzeXN0ZW1zLgojClBMQVRGT1JNICAgICA6PSBhbnNpCkRFTEVURSAgICAgICA6PSAkKFJNKQpDT1BZICAgICAgICAgOj0gY3AKQ0FUICAgICAgICAgIDo9IGNhdApTRVAgICAgICAgICAgOj0gLwoKQlVJTERfQ09ORklHIDo9ICQoVE9QX0RJUikvYnVpbGRzCgojIFRoZXNlIHR3byBhc3NpZ25tZW50cyBtdXN0IGJlIGRlbGF5ZWQuCkJVSUxEX0RJUiAgICA9ICQoQlVJTERfQ09ORklHKS8kKFBMQVRGT1JNKQpDT05GSUdfUlVMRVMgPSAkKEJVSUxEX0RJUikvJChDT05GSUdfRklMRSkKCiMgV2UgZGVmaW5lIHRoZSBCQUNLU0xBU0ggdmFyaWFibGUgdG8gaG9sZCBhIHNpbmdsZSBiYWNrLXNsYXNoIGNoYXJhY3Rlci4KIyBUaGlzIGlzIG5lZWRlZCBiZWNhdXNlIGEgbGluZSBsaWtlCiMKIyAgIFNFUCA6PSBcCiMKIyBkb2VzIG5vdCB3b3JrIHdpdGggR05VIE1ha2UgKHRoZSBiYWNrc2xhc2ggaXMgaW50ZXJwcmV0ZWQgYXMgYSBsaW5lCiMgY29udGludWF0aW9uKS4gIFdoaWxlIGEgbGluZSBsaWtlCiMKIyAgIFNFUCA6PSBcXAojCiMgcmVhbGx5IGRlZmluZXMgJChTRVApIGFzIGBcJyBvbiBVbml4LCBhbmQgYFxcJyBvbiBEb3MgYW5kIFdpbmRvd3MhCiMKQkFDS1NMQVNIIDo9ICQoc3RyaXAgXCApCgojIEZpbmQgYWxsIGF1dG8tZGV0ZWN0YWJsZSBwbGF0Zm9ybXMuCiMKUExBVEZPUk1TIDo9ICQobm90ZGlyICQoc3Vic3QgL2RldGVjdC5taywsJCh3aWxkY2FyZCAkKEJVSUxEX0NPTkZJRykvKi9kZXRlY3QubWspKSkKLlBIT05ZOiAkKFBMQVRGT1JNUykgYW5zaQoKIyBGaWx0ZXIgb3V0IHBsYXRmb3JtIHNwZWNpZmllZCBhcyBzZXR1cCB0YXJnZXQuCiMKUExBVEZPUk0gOj0gJChmaXJzdHdvcmQgJChmaWx0ZXIgJChNQUtFQ01ER09BTFMpLCQoUExBVEZPUk1TKSkpCgojIElmIG5vIHNldHVwIHRhcmdldCBwbGF0Zm9ybSB3YXMgc3BlY2lmaWVkLCBlbmFibGUgYXV0by1kZXRlY3Rpb24vCiMgZGVmYXVsdCBwbGF0Zm9ybS4KIwppZmVxICgkKFBMQVRGT1JNKSwpCiAgUExBVEZPUk0gOj0gYW5zaQplbmRpZgoKIyBJZiB0aGUgdXNlciBoYXMgZXhwbGljaXRseSBhc2tlZCBmb3IgYGFuc2knIG9uIHRoZSBjb21tYW5kIGxpbmUsCiMgZGlzYWJsZSBhdXRvLWRldGVjdGlvbi4KIwppZmVxICgkKGZpbmRzdHJpbmcgYW5zaSwkKE1BS0VDTURHT0FMUykpLCkKICAjIE5vdywgaW5jbHVkZSBhbGwgZGV0ZWN0aW9uIHJ1bGUgZmlsZXMgZm91bmQgaW4gdGhlIGBidWlsZHMvPHN5c3RlbT4nCiAgIyBkaXJlY3Rvcmllcy4gIE5vdGUgdGhhdCB0aGUgY2FsbGluZyBvcmRlciBvZiB0aGUgdmFyaW91cyBgZGV0ZWN0Lm1rJwogICMgZmlsZXMgaXNuJ3QgcHJlZGljdGFibGUuCiAgIwogIGluY2x1ZGUgJCh3aWxkY2FyZCAkKEJVSUxEX0NPTkZJRykvKi9kZXRlY3QubWspCmVuZGlmCgojIEluIGNhc2Ugbm8gZGV0ZWN0aW9uIHJ1bGUgZmlsZSB3YXMgc3VjY2Vzc2Z1bCwgdXNlIHRoZSBkZWZhdWx0LgojCmlmbmRlZiBDT05GSUdfRklMRQogIENPTkZJR19GSUxFIDo9IGFuc2kubWsKICBzZXR1cDogc3RkX3NldHVwCiAgLlBIT05ZOiBzZXR1cAplbmRpZgoKIyBUaGUgZm9sbG93aW5nIHRhcmdldHMgYXJlIGVxdWl2YWxlbnQsIHdpdGggdGhlIGV4Y2VwdGlvbiB0aGF0IHRoZXkgdXNlCiMgYSBzbGlnaHRseSBkaWZmZXJlbnQgc3ludGF4IGZvciB0aGUgYGVjaG8nIGNvbW1hbmQuCiMKIyBzdGRfc2V0dXA6IGRlZmluZWQgZm9yIG1vc3QgKGkuZS4gVW5peC1saWtlKSBwbGF0Zm9ybXMKIyBkb3Nfc2V0dXA6IGRlZmluZWQgZm9yIERvcy1pc2ggcGxhdGZvcm1zIGxpa2UgRG9zLCBXaW5kb3dzICYgT1MvMgojCi5QSE9OWTogc3RkX3NldHVwIGRvc19zZXR1cAoKc3RkX3NldHVwOgoJQGVjaG8gIiIKCUBlY2hvICIkKFBST0pFQ1RfVElUTEUpIGJ1aWxkIHN5c3RlbSAtLSBhdXRvbWF0aWMgc3lzdGVtIGRldGVjdGlvbiIKCUBlY2hvICIiCglAZWNobyAiVGhlIGZvbGxvd2luZyBzZXR0aW5ncyBhcmUgdXNlZDoiCglAZWNobyAiIgoJQGVjaG8gIiAgcGxhdGZvcm0gICAgICAgICAgICAgICAgICAgICQoUExBVEZPUk0pIgoJQGVjaG8gIiAgY29tcGlsZXIgICAgICAgICAgICAgICAgICAgICQoQ0MpIgoJQGVjaG8gIiAgY29uZmlndXJhdGlvbiBkaXJlY3RvcnkgICAgICQoQlVJTERfRElSKSIKCUBlY2hvICIgIGNvbmZpZ3VyYXRpb24gcnVsZXMgICAgICAgICAkKENPTkZJR19SVUxFUykiCglAZWNobyAiIgoJQGVjaG8gIklmIHRoaXMgZG9lcyBub3QgY29ycmVzcG9uZCB0byB5b3VyIHN5c3RlbSBvciBzZXR0aW5ncyBwbGVhc2UgcmVtb3ZlIHRoZSBmaWxlIgoJQGVjaG8gIlxgJChDT05GSUdfTUspJyBmcm9tIHRoaXMgZGlyZWN0b3J5IHRoZW4gcmVhZCB0aGUgSU5TVEFMTCBmaWxlIGZvciBoZWxwLiIKCUBlY2hvICIiCglAZWNobyAiT3RoZXJ3aXNlLCBzaW1wbHkgdHlwZSBcYCQoTUFLRSknIGFnYWluIHRvIGJ1aWxkIHRoZSBsaWJyYXJ5LCIKCUBlY2hvICJvciBcYCQoTUFLRSkgcmVmZG9jJyB0byBidWlsZCB0aGUgQVBJIHJlZmVyZW5jZSAodGhpcyBuZWVkcyBweXRob24gPj0gMi42KS4iCglAZWNobyAiIgoJQCQoQ09QWSkgJChDT05GSUdfUlVMRVMpICQoQ09ORklHX01LKQoKCiMgU3BlY2lhbCBjYXNlIGZvciBEb3MsIFdpbmRvd3MsIE9TLzIsIHdoZXJlIGVjaG8gIiIgZG9lc24ndCB3b3JrIGNvcnJlY3RseSEKIwpkb3Nfc2V0dXA6CglAdHlwZSBidWlsZHMkKFNFUCluZXdsaW5lCglAZWNobyAkKFBST0pFQ1RfVElUTEUpIGJ1aWxkIHN5c3RlbSAtLSBhdXRvbWF0aWMgc3lzdGVtIGRldGVjdGlvbgoJQHR5cGUgYnVpbGRzJChTRVApbmV3bGluZQoJQGVjaG8gVGhlIGZvbGxvd2luZyBzZXR0aW5ncyBhcmUgdXNlZDoKCUB0eXBlIGJ1aWxkcyQoU0VQKW5ld2xpbmUKCUBlY2hvICAgcGxhdGZvcm3///////////////////////////8kKFBMQVRGT1JNKQoJQGVjaG8gICBjb21waWxlcv///////////////////////////yQoQ0MpCglAZWNobyAgIGNvbmZpZ3VyYXRpb24gZGlyZWN0b3J5////////JChzdWJzdCAvLCQoU0VQKSwkKEJVSUxEX0RJUikpCglAZWNobyAgIGNvbmZpZ3VyYXRpb24gcnVsZXP/////////////JChzdWJzdCAvLCQoU0VQKSwkKENPTkZJR19SVUxFUykpCglAdHlwZSBidWlsZHMkKFNFUCluZXdsaW5lCglAZWNobyBJZiB0aGlzIGRvZXMgbm90IGNvcnJlc3BvbmQgdG8geW91ciBzeXN0ZW0gb3Igc2V0dGluZ3MgcGxlYXNlIHJlbW92ZSB0aGUgZmlsZQoJQGVjaG8gJyQoQ09ORklHX01LKScgZnJvbSB0aGlzIGRpcmVjdG9yeSB0aGVuIHJlYWQgdGhlIElOU1RBTEwgZmlsZSBmb3IgaGVscC4KCUB0eXBlIGJ1aWxkcyQoU0VQKW5ld2xpbmUKCUBlY2hvIE90aGVyd2lzZSwgc2ltcGx5IHR5cGUgJ21ha2UnIGFnYWluIHRvIGJ1aWxkIHRoZSBsaWJyYXJ5LgoJQGVjaG8gb3IgJ21ha2UgcmVmZG9jJyB0byBidWlsZCB0aGUgQVBJIHJlZmVyZW5jZSAodGhpcyBuZWVkcyBweXRob24gPj0gMi42KS4KCUB0eXBlIGJ1aWxkcyQoU0VQKW5ld2xpbmUKCUAkKENPUFkpICQoc3Vic3QgLywkKFNFUCksJChDT05GSUdfUlVMRVMpICQoQ09ORklHX01LKSkgPiBudWwKCgojIEVPRgo=