IwojIEZyZWVUeXBlIDIgaG9zdCBwbGF0Zm9ybSBkZXRlY3Rpb24gcnVsZXMKIwoKCiMgQ29weXJpZ2h0IDE5OTYtMjAwMCBieQojIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KIwojIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCBtb2RpZmllZAojIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgbGljZW5zZSwKIyBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIHlvdQojIGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0CiMgZnVsbHkuCgoKIyBUaGlzIHN1Yi1NYWtlZmlsZSBpcyBpbiBjaGFyZ2Ugb2YgZGV0ZWN0aW5nIHRoZSBjdXJyZW50IHBsYXRmb3JtLiAgSXQgc2V0cwojIHRoZSBmb2xsb3dpbmcgdmFyaWFibGVzOgojCiMgICBCVUlMRCAgICAgICAgVGhlIGNvbmZpZ3VyYXRpb24gYW5kIHN5c3RlbS1zcGVjaWZpYyBkaXJlY3RvcnkuICBVc3VhbGx5CiMgICAgICAgICAgICAgICAgYGZyZWV0eXBlL2NvbmZpZy8kKFBMQVRGT1JNKScgYnV0IGNhbiBiZSBkaWZmZXJlbnQgaWYgYQojICAgICAgICAgICAgICAgIHNwZWNpZmljIGNvbXBpbGVyIGhhcyBiZWVuIHJlcXVlc3RlZCBvbiB0aGUgY29tbWFuZCBsaW5lLgojCiMgVGhlIGZvbGxvd2luZyB2YXJpYWJsZXMgbXVzdCBiZSBkZWZpbmVkIGluIHN5c3RlbSBzcGVjaWZpYyBgZGV0ZWN0Lm1rJwojIGZpbGVzOgojCiMgICBQTEFURk9STSAgICAgVGhlIGRldGVjdGVkIHBsYXRmb3JtLiAgVGhpcyB3aWxsIGRlZmF1bHQgdG8gYGFuc2knIGlmCiMgICAgICAgICAgICAgICAgYXV0by1kZXRlY3Rpb24gZmFpbHMuCiMgICBDT05GSUdfRklMRSAgVGhlIE1ha2VmaWxlIHRvIHVzZS4gIFRoaXMgdXN1YWxseSBkZXBlbmRzIG9uIHRoZSBjb21waWxlcgojICAgICAgICAgICAgICAgIGRlZmluZWQgaW4gdGhlIGBDQycgZW52aXJvbm1lbnQgdmFyaWFibGUuCiMgICBERUxFVEUgICAgICAgVGhlIHNoZWxsIGNvbW1hbmQgdXNlZCB0byByZW1vdmUgYSBnaXZlbiBmaWxlLgojICAgQ09QWSAgICAgICAgIFRoZSBzaGVsbCBjb21tYW5kIHVzZWQgdG8gY29weSBvbmUgZmlsZS4KIyAgIFNFUCAgICAgICAgICBUaGUgcGxhdGZvcm0tc3BlY2lmaWMgZGlyZWN0b3J5IHNlcGFyYXRvci4KIyAgIENDICAgICAgICAgICBUaGUgY29tcGlsZXIgdG8gdXNlLgojCiMgWW91IG5lZWQgdG8gc2V0IHRoZSBmb2xsb3dpbmcgdmFyaWFibGUocykgYmVmb3JlIGNhbGxpbmcgaXQ6CiMKIyAgIFRPUCAgICAgICAgICBUaGUgdG9wLW1vc3QgZGlyZWN0b3J5IGluIHRoZSBGcmVlVHlwZSBsaWJyYXJ5IHNvdXJjZQojICAgICAgICAgICAgICAgIGhpZXJhcmNoeS4gIElmIG5vdCBkZWZpbmVkLCBpdCB3aWxsIGRlZmF1bHQgdG8gYC4nLgoKIyBJZiBUT1AgaXMgbm90IGRlZmluZWQsIGRlZmF1bHQgaXQgdG8gYC4nCiMKaWZuZGVmIFRPUApUT1AgOj0gLgplbmRpZgoKIyBTZXQgYXV0by1kZXRlY3Rpb24gZGVmYXVsdCB0byBgYW5zaScuCiMgTm90ZSB0aGF0IHdlIGRlbGF5IHRoZSBldmFsdWF0aW9uIG9mICQoQ09ORklHXyksICQoQlVJTEQpLCBhbmQKIyAkKENPTkZJR19SVUxFUykuCiMKUExBVEZPUk0gICAgOj0gYW5zaQpERUxFVEUgICAgICA6PSAkKFJNKQpDT1BZICAgICAgICA6PSBjcApTRVAgICAgICAgICA6PSAvCgpDT05GSUdfICAgICAgPSAkKFRPUCkkKFNFUCljb25maWckKFNFUCkKQlVJTEQgICAgICAgID0gJChDT05GSUdfKSQoUExBVEZPUk0pCkNPTkZJR19SVUxFUyA9ICQoQlVJTEQpJChTRVApJChDT05GSUdfRklMRSkKCiMgV2UgZGVmaW5lIHRoZSBCQUNLU0xBU0ggdmFyaWFibGUgdG8gaG9sZCBhIHNpbmdsZSBiYWNrLXNsYXNoIGNoYXJhY3Rlci4KIyBUaGlzIGlzIG5lZWRlZCBiZWNhdXNlIGEgbGluZSBsaWtlCiMKIyAgIFNFUCA6PSBcCiMKIyBkb2VzIG5vdCB3b3JrIHdpdGggR05VIE1ha2UgKHRoZSBiYWNrc2xhc2ggaXMgaW50ZXJwcmV0ZWQgYXMgYSBsaW5lCiMgY29udGludWF0aW9uKS4gIFdoaWxlIGEgbGluZSBsaWtlCiMKIyAgIFNFUCA6PSBcXAojCiMgcmVhbGx5IGRlZmluZXMgJChTRVApIGFzIGBcJyBvbiBVbml4LCBhbmQgYFxcJyBvbiBEb3MgYW5kIFdpbmRvd3MhCiMKQkFDS1NMQVNIIDo9ICQoc3RyaXAgXCApCgojIE5vdywgaW5jbHVkZSBhbGwgZGV0ZWN0aW9uIHJ1bGUgZmlsZXMgZm91bmQgaW4gdGhlIGBjb25maWcvPHN5c3RlbT4nCiMgZGlyZWN0b3JpZXMuICBOb3RlIHRoYXQgdGhlIGNhbGxpbmcgb3JkZXIgb2YgdGhlIHZhcmlvdXMgYGRldGVjdC5taycgZmlsZXMKIyBpc24ndCBwcmVkaWN0YWJsZS4KIwppbmNsdWRlICQod2lsZGNhcmQgJChDT05GSUdfKSovZGV0ZWN0Lm1rKQoKIyBJbiBjYXNlIG5vIGRldGVjdGlvbiBydWxlIGZpbGUgd2FzIHN1Y2Nlc3NmdWwsIHVzZSB0aGUgZGVmYXVsdC4KIwppZm5kZWYgQ09ORklHX0ZJTEUKICBDT05GSUdfRklMRSA6PSBhbnNpLm1rCiAgc2V0dXA6IHN0ZF9zZXR1cAplbmRpZgoKIyBUaGUgZm9sbG93aW5nIHRhcmdldHMgYXJlIGVxdWl2YWxlbnQsIHdpdGggdGhlIGV4Y2VwdGlvbiB0aGF0IHRoZXkgdXNlCiMgc2xpZ2h0bHkgZGlmZmVyZW50IHN5bnRheGVzIGZvciB0aGUgYGVjaG8nIGNvbW1hbmQuCiMKIyBzdGRfc2V0dXA6IGRlZmluZWQgZm9yIG1vc3QgcGxhdGZvcm1zCiMgZG9zX3NldHVwOiBkZWZpbmVkIGZvciBEb3MtaXNoIHBsYXRmb3JtcyBsaWtlIERvcywgV2luZG93cyAmIE9TLzIKIwouUEhPTlk6IHN0ZF9zZXR1cCBkb3Nfc2V0dXAKCnN0ZF9zZXR1cDoKCUBlY2hvICIiCglAZWNobyAiRnJlZVR5cGUgYnVpbGQgc3lzdGVtIC0tIGF1dG9tYXRpYyBzeXN0ZW0gZGV0ZWN0aW9uIgoJQGVjaG8gIiIKCUBlY2hvICJUaGUgZm9sbG93aW5nIHNldHRpbmdzIGFyZSB1c2VkOiIKCUBlY2hvICIiCglAZWNobyAiICBwbGF0Zm9ybSAgICAgICAgICAgICAgICAgICAgJChQTEFURk9STSkiCglAZWNobyAiICBjb21waWxlciAgICAgICAgICAgICAgICAgICAgJChDQykiCglAZWNobyAiICBjb25maWd1cmF0aW9uIGRpcmVjdG9yeSAgICAgJChCVUlMRCkiCglAZWNobyAiICBjb25maWd1cmF0aW9uIHJ1bGVzICAgICAgICAgJChDT05GSUdfUlVMRVMpIgoJQGVjaG8gIiIKCUBlY2hvICJJZiB0aGlzIGRvZXMgbm90IGNvcnJlc3BvbmQgdG8geW91ciBzeXN0ZW0gb3Igc2V0dGluZ3MgcGxlYXNlIHJlbW92ZSB0aGUgZmlsZSIKCUBlY2hvICJcYCQoQ09ORklHX01LKScgZnJvbSB0aGlzIGRpcmVjdG9yeSB0aGVuIHJlYWQgdGhlIElOU1RBTEwgZmlsZSBmb3IgaGVscC4iCglAZWNobyAiIgoJQGVjaG8gIk90aGVyd2lzZSwgc2ltcGx5IHR5cGUgXGBtYWtlJyBhZ2FpbiB0byBidWlsZCB0aGUgbGlicmFyeS4iCglAZWNobyAiIgoJQCQoQ09QWSkgJChDT05GSUdfUlVMRVMpICQoQ09ORklHX01LKQoKZG9zX3NldHVwOgoJQGVjaG8g/woJQGVjaG8gRnJlZVR5cGUgYnVpbGQgc3lzdGVtIC0tIGF1dG9tYXRpYyBzeXN0ZW0gZGV0ZWN0aW9uCglAZWNobyD/CglAZWNobyBUaGUgZm9sbG93aW5nIHNldHRpbmdzIGFyZSB1c2VkOgoJQGVjaG8g/woJQGVjaG8g//9wbGF0Zm9ybf///////////////////////////yQoUExBVEZPUk0pCglAZWNobyD//2NvbXBpbGVy////////////////////////////JChDQykKCUBlY2hvIP//Y29uZmlndXJhdGlvbiBkaXJlY3Rvcnn///////8kKEJVSUxEKQoJQGVjaG8g//9jb25maWd1cmF0aW9uIHJ1bGVz/////////////yQoQ09ORklHX1JVTEVTKQoJQGVjaG8g/woJQGVjaG8gSWYgdGhpcyBkb2VzIG5vdCBjb3JyZXNwb25kIHRvIHlvdXIgc3lzdGVtIG9yIHNldHRpbmdzIHBsZWFzZSByZW1vdmUgdGhlIGZpbGUKCUBlY2hvICckKENPTkZJR19NSyknIGZyb20gdGhpcyBkaXJlY3RvcnkgdGhlbiByZWFkIHRoZSBJTlNUQUxMIGZpbGUgZm9yIGhlbHAuCglAZWNobyD/CglAZWNobyBPdGhlcndpc2UsIHNpbXBseSB0eXBlICdtYWtlJyBhZ2FpbiB0byBidWlsZCB0aGUgbGlicmFyeS4KCUBlY2hvIP8KCUAkKENPUFkpICQoc3Vic3QgLyxcLCQoQ09ORklHX1JVTEVTKSAkKENPTkZJR19NSykpID4gbnVsCgojIEVPRgo=