LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQogKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCiAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICoKICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICoKICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAogKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgogKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKICogdW5kZXIgdGhlIExpY2Vuc2UuCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKI2luY2x1ZGUgPHByZWNvbXAuaD4KI2luY2x1ZGUgPHMyX2x1aWRsL2N4X2lkbGNvLmh4eD4KCgovLyBOT1QgRlVMTFkgREVDTEFSRUQgU0VSVklDRVMKI2luY2x1ZGUgPHMyX2x1aWRsL2N4X3N1Yi5oeHg+CiNpbmNsdWRlIDxzMl9kc2FwaS9jeF9kc2FwaS5oeHg+CiNpbmNsdWRlIDx0b29scy90a3BjaGFycy5oeHg+CiNpbmNsdWRlIDx0b2tlbnMvdGtwc3RhbTIuaHh4PgojaW5jbHVkZSA8czJfbHVpZGwvdGtfaWRlbnQuaHh4PgojaW5jbHVkZSA8czJfbHVpZGwvdGtfa2V5dy5oeHg+CiNpbmNsdWRlIDxzMl9sdWlkbC90a19wdW5jdC5oeHg+CiNpbmNsdWRlIDxzMl9sdWlkbC90b2tyZWN2Lmh4eD4KI2luY2x1ZGUgPHhfcGFyc2UyLmh4eD4KCgpuYW1lc3BhY2UgY3NpCnsKbmFtZXNwYWNlIHVpZGwKewoKCmNvbnN0IGludHQgQ19uQ3BwSW5pdGlhbE5yT2ZTdGF0aSA9IDQwMDsKY29uc3QgaW50dCBDX25TdGF0dXNTaXplID0gMTI4OwoKCgpjb25zdCB1aW50dCBuRl9maW5fRXJyb3IgPSAxOwpjb25zdCB1aW50dCBuRl9maW5fSWdub3JlID0gMjsKY29uc3QgdWludHQgbkZfZmluX0lkZW50aWZpZXIgPSAzOwpjb25zdCB1aW50dCBuRl9maW5fS2V5d29yZCA9IDQ7CmNvbnN0IHVpbnR0IG5GX2Zpbl9QdW5jdHVhdGlvbiA9IDU7CmNvbnN0IHVpbnR0IG5GX2Zpbl9FT0wgPSA2Owpjb25zdCB1aW50dCBuRl9maW5fRU9GID0gNzsKCmNvbnN0IHVpbnR0IG5GX2dvdG9fTUxEb2N1ID0gMTA7CmNvbnN0IHVpbnR0IG5GX2dvdG9fU0xEb2N1ID0gMTE7CmNvbnN0IHVpbnR0IG5GX2dvdG9fTUxDb21tZW50ID0gMTI7CmNvbnN0IHVpbnR0IG5GX2dvdG9fU0xDb21tZW50ID0gMTM7CmNvbnN0IHVpbnR0IG5GX2dvdG9fUHJhZXByb2Nlc3NvciA9IDE0Owpjb25zdCB1aW50dCBuRl9nb3RvX0Fzc2lnbm1lbnQgPSAxNTsKCgoKY29uc3QgVUlOVDE2IG5Ub2tfYnR5X2FueSA9IDEwMCArIFRva0J1aWx0SW5UeXBlOjpidHlfYW55Owpjb25zdCBVSU5UMTYgblRva19idHlfYm9vbGVhbiA9IDEwMCArIFRva0J1aWx0SW5UeXBlOjpidHlfYm9vbGVhbjsKY29uc3QgVUlOVDE2IG5Ub2tfYnR5X2J5dGUgPSAxMDAgKyBUb2tCdWlsdEluVHlwZTo6YnR5X2J5dGU7CmNvbnN0IFVJTlQxNiBuVG9rX2J0eV9jaGFyID0gMTAwICsgVG9rQnVpbHRJblR5cGU6OmJ0eV9jaGFyOwpjb25zdCBVSU5UMTYgblRva19idHlfZG91YmxlID0gMTAwICsgVG9rQnVpbHRJblR5cGU6OmJ0eV9kb3VibGU7CmNvbnN0IFVJTlQxNiBuVG9rX2J0eV9oeXBlciA9IDEwMCArIFRva0J1aWx0SW5UeXBlOjpidHlfaHlwZXI7CmNvbnN0IFVJTlQxNiBuVG9rX2J0eV9sb25nID0gMTAwICsgVG9rQnVpbHRJblR5cGU6OmJ0eV9sb25nOwpjb25zdCBVSU5UMTYgblRva19idHlfc2hvcnQgPSAxMDAgKyBUb2tCdWlsdEluVHlwZTo6YnR5X3Nob3J0Owpjb25zdCBVSU5UMTYgblRva19idHlfc3RyaW5nID0gMTAwICsgVG9rQnVpbHRJblR5cGU6OmJ0eV9zdHJpbmc7CmNvbnN0IFVJTlQxNiBuVG9rX2J0eV92b2lkID0gMTAwICsgVG9rQnVpbHRJblR5cGU6OmJ0eV92b2lkOwpjb25zdCBVSU5UMTYgblRva19idHlfZWxsaXBzZSA9IDEwMCArIFRva0J1aWx0SW5UeXBlOjpidHlfZWxsaXBzZTsKCmNvbnN0IFVJTlQxNiBuVG9rX3Rtb2RfdW5zaWduZWQgPSAyMDAgKyBUb2tUeXBlTW9kaWZpZXI6OnRtb2RfdW5zaWduZWQ7CmNvbnN0IFVJTlQxNiBuVG9rX3Rtb2Rfc2VxdWVuY2UgPSAyMDAgKyBUb2tUeXBlTW9kaWZpZXI6OnRtb2Rfc2VxdWVuY2U7Cgpjb25zdCBVSU5UMTYgblRva19waF9pbiA9IDI1MCArIFRva1BhcmFtZXRlckhhbmRsaW5nOjpwaF9pbjsKY29uc3QgVUlOVDE2IG5Ub2tfcGhfb3V0ID0gMjUwICsgVG9rUGFyYW1ldGVySGFuZGxpbmc6OnBoX291dDsKY29uc3QgVUlOVDE2IG5Ub2tfcGhfaW5vdXQgPSAyNTAgKyBUb2tQYXJhbWV0ZXJIYW5kbGluZzo6cGhfaW5vdXQ7Cgpjb25zdCBVSU5UMTYgblRva19tdF9hdHRyaWJ1dGUgPSAzMDAgKyBUb2tNZXRhVHlwZTo6bXRfYXR0cmlidXRlOwpjb25zdCBVSU5UMTYgblRva19tdF9jb25zdGFudHMgPSAzMDAgKyBUb2tNZXRhVHlwZTo6bXRfY29uc3RhbnRzOwpjb25zdCBVSU5UMTYgblRva19tdF9lbnVtID0gMzAwICsgVG9rTWV0YVR5cGU6Om10X2VudW07CmNvbnN0IFVJTlQxNiBuVG9rX210X2V4Y2VwdGlvbiA9IDMwMCArIFRva01ldGFUeXBlOjptdF9leGNlcHRpb247CmNvbnN0IFVJTlQxNiBuVG9rX210X2lkZW50ID0gMzAwICsgVG9rTWV0YVR5cGU6Om10X2lkZW50Owpjb25zdCBVSU5UMTYgblRva19tdF9pbnRlcmZhY2UgPSAzMDAgKyBUb2tNZXRhVHlwZTo6bXRfaW50ZXJmYWNlOwpjb25zdCBVSU5UMTYgblRva19tdF9tb2R1bGUgPSAzMDAgKyBUb2tNZXRhVHlwZTo6bXRfbW9kdWxlOwpjb25zdCBVSU5UMTYgblRva19tdF9wcm9wZXJ0eSA9IDMwMCArIFRva01ldGFUeXBlOjptdF9wcm9wZXJ0eTsKY29uc3QgVUlOVDE2IG5Ub2tfbXRfc2VydmljZSA9IDMwMCArIFRva01ldGFUeXBlOjptdF9zZXJ2aWNlOwpjb25zdCBVSU5UMTYgblRva19tdF9zaW5nbGV0b24gPSAzMDAgKyBUb2tNZXRhVHlwZTo6bXRfc2luZ2xldG9uOwpjb25zdCBVSU5UMTYgblRva19tdF9zdHJ1Y3QgPSAzMDAgKyBUb2tNZXRhVHlwZTo6bXRfc3RydWN0Owpjb25zdCBVSU5UMTYgblRva19tdF90eXBlZGVmID0gMzAwICsgVG9rTWV0YVR5cGU6Om10X3R5cGVkZWY7CmNvbnN0IFVJTlQxNiBuVG9rX210X3VpayA9IDMwMCArIFRva01ldGFUeXBlOjptdF91aWs7Cgpjb25zdCBVSU5UMTYgblRva19zdGVfYm91bmQgPSA0MDAgKyBUb2tTdGVyZW90eXBlOjpzdGVfYm91bmQ7CmNvbnN0IFVJTlQxNiBuVG9rX3N0ZV9jb25zdHJhaW5lZCA9IDQwMCArIFRva1N0ZXJlb3R5cGU6OnN0ZV9jb25zdHJhaW5lZDsKY29uc3QgVUlOVDE2IG5Ub2tfc3RlX2NvbnN0ID0gNDAwICsgVG9rU3RlcmVvdHlwZTo6c3RlX2NvbnN0Owpjb25zdCBVSU5UMTYgblRva19zdGVfbWF5YmVhbWJpZ3VvdXMgPSA0MDAgKyBUb2tTdGVyZW90eXBlOjpzdGVfbWF5YmVhbWJpZ3VvdXM7CmNvbnN0IFVJTlQxNiBuVG9rX3N0ZV9tYXliZWRlZmF1bHQgPSA0MDAgKyBUb2tTdGVyZW90eXBlOjpzdGVfbWF5YmVkZWZhdWx0Owpjb25zdCBVSU5UMTYgblRva19zdGVfbWF5YmV2b2lkID0gNDAwICsgVG9rU3RlcmVvdHlwZTo6c3RlX21heWJldm9pZDsKY29uc3QgVUlOVDE2IG5Ub2tfc3RlX29uZXdheSA9IDQwMCArIFRva1N0ZXJlb3R5cGU6OnN0ZV9vbmV3YXk7CmNvbnN0IFVJTlQxNiBuVG9rX3N0ZV9vcHRpb25hbCA9IDQwMCArIFRva1N0ZXJlb3R5cGU6OnN0ZV9vcHRpb25hbDsKY29uc3QgVUlOVDE2IG5Ub2tfc3RlX3JlYWRvbmx5ID0gNDAwICsgVG9rU3RlcmVvdHlwZTo6c3RlX3JlYWRvbmx5Owpjb25zdCBVSU5UMTYgblRva19zdGVfcmVtb3ZhYmxlID0gNDAwICsgVG9rU3RlcmVvdHlwZTo6c3RlX3JlbW92YWJsZTsKY29uc3QgVUlOVDE2IG5Ub2tfc3RlX3ZpcnR1YWwgPSA0MDAgKyBUb2tTdGVyZW90eXBlOjpzdGVfdmlydHVhbDsKY29uc3QgVUlOVDE2IG5Ub2tfc3RlX3RyYW5zaWVudCA9IDQwMCArIFRva1N0ZXJlb3R5cGU6OnN0ZV90cmFuc2llbnQ7CmNvbnN0IFVJTlQxNiBuVG9rX3N0ZV9wdWJsaXNoZWQgPSA0MDAgKyBUb2tTdGVyZW90eXBlOjpzdGVfcHVibGlzaGVkOwoKY29uc3QgVUlOVDE2IG5Ub2tfcmFpc2VzID0gNTAxOwpjb25zdCBVSU5UMTYgblRva19uZWVkcyA9IDUwMjsKY29uc3QgVUlOVDE2IG5Ub2tfb2JzZXJ2ZXMgPSA1MDM7Cgpjb25zdCBVSU5UMTYgblRva19hc3NpZ25tZW50ID0gNTUwOwoKY29uc3QgVUlOVDE2IG5Ub2tfaWdub3JlID0gNjAwOwpjb25zdCBVSU5UMTYgblRva19ub25lX01MQ29tbWVudEJlZ2luID0gNjAxOwpjb25zdCBVSU5UMTYgblRva19ub25lX1NMQ29tbWVudEJlZ2luID0gNjAyOwpjb25zdCBVSU5UMTYgblRva19ub25lX01MRG9jdUJlZ2luID0gNjAzOwpjb25zdCBVSU5UMTYgblRva19ub25lX1NMRG9jdUJlZ2luID0gNjA0Owpjb25zdCBVSU5UMTYgblRva19ub25lX1ByYWVwcm9jZXNzb3JCZWdpbiA9IDYwNTsKCgpjb25zdCBVSU5UMTYgblRva19wdW5jdF9CcmFja2V0T3BlbiA9IDcwMCArIFRva1B1bmN0dWF0aW9uOjpCcmFja2V0T3BlbjsKY29uc3QgVUlOVDE2IG5Ub2tfcHVuY3RfQnJhY2tldENsb3NlID0gNzAwICsgVG9rUHVuY3R1YXRpb246OkJyYWNrZXRDbG9zZTsKY29uc3QgVUlOVDE2IG5Ub2tfcHVuY3RfQXJyYXlCcmFja2V0T3BlbiA9IDcwMCArIFRva1B1bmN0dWF0aW9uOjpBcnJheUJyYWNrZXRPcGVuOwpjb25zdCBVSU5UMTYgblRva19wdW5jdF9BcnJheUJyYWNrZXRDbG9zZSA9IDcwMCArIFRva1B1bmN0dWF0aW9uOjpBcnJheUJyYWNrZXRDbG9zZTsKY29uc3QgVUlOVDE2IG5Ub2tfcHVuY3RfQ3VybGVkQnJhY2tldE9wZW4gPSA3MDAgKyBUb2tQdW5jdHVhdGlvbjo6Q3VybGVkQnJhY2tldE9wZW47CmNvbnN0IFVJTlQxNiBuVG9rX3B1bmN0X0N1cmxlZEJyYWNrZXRDbG9zZSA9IDcwMCArIFRva1B1bmN0dWF0aW9uOjpDdXJsZWRCcmFja2V0Q2xvc2U7CmNvbnN0IFVJTlQxNiBuVG9rX3B1bmN0X1NlbWljb2xvbiA9IDcwMCArIFRva1B1bmN0dWF0aW9uOjpTZW1pY29sb247CmNvbnN0IFVJTlQxNiBuVG9rX3B1bmN0X0NvbG9uID0gNzAwICsgVG9rUHVuY3R1YXRpb246OkNvbG9uOwpjb25zdCBVSU5UMTYgblRva19wdW5jdF9Eb3VibGVDb2xvbiA9IDcwMCArIFRva1B1bmN0dWF0aW9uOjpEb3VibGVDb2xvbjsKY29uc3QgVUlOVDE2IG5Ub2tfcHVuY3RfQ29tbWEgPSA3MDAgKyBUb2tQdW5jdHVhdGlvbjo6Q29tbWE7CmNvbnN0IFVJTlQxNiBuVG9rX3B1bmN0X01pbnVzID0gNzAwICsgVG9rUHVuY3R1YXRpb246Ok1pbnVzOwpjb25zdCBVSU5UMTYgblRva19wdW5jdF9GdWxsc3RvcCA9IDcwMCArIFRva1B1bmN0dWF0aW9uOjpGdWxsc3RvcDsKY29uc3QgVUlOVDE2IG5Ub2tfcHVuY3RfTGVzc2VyID0gNzAwICsgVG9rUHVuY3R1YXRpb246Okxlc3NlcjsKY29uc3QgVUlOVDE2IG5Ub2tfcHVuY3RfR3JlYXRlciA9IDcwMCArIFRva1B1bmN0dWF0aW9uOjpHcmVhdGVyOwoKY29uc3QgVUlOVDE2IG5Ub2tfRU9MID0gODAxOwpjb25zdCBVSU5UMTYgblRva19FT0YgPSA4MDI7CgoKCkNvbnRleHRfVWlkbENvZGU6OkNvbnRleHRfVWlkbENvZGUoIFRva2VuX1JlY2VpdmVyICYJIG9fclJlY2VpdmVyLAoJCQkJCQkJCQlEWU4gVGtwRG9jdUNvbnRleHQgJiBsZXRfZHJDb250ZXh0X0RvY3UgKQoJOglhU3RhdGVNYWNoaW5lKENfblN0YXR1c1NpemUsQ19uQ3BwSW5pdGlhbE5yT2ZTdGF0aSksCgkJcFJlY2VpdmVyKCZvX3JSZWNlaXZlciksCgkJcERvY3VDb250ZXh0KCZsZXRfZHJDb250ZXh0X0RvY3UpLAoJCWRwQ29udGV4dF9NTENvbW1lbnQoMCksCgkJZHBDb250ZXh0X1NMQ29tbWVudCgwKSwKCQlkcENvbnRleHRfUHJlcHJvY2Vzc29yKDApLAoJCWRwQ29udGV4dF9Bc3NpZ25tZW50KDApLAoJCXBOZXdUb2tlbigwKSwKCQlwRm9sbG93VXBDb250ZXh0KDApCnsKCWRwQ29udGV4dF9NTENvbW1lbnQgPSBuZXcgQ29udGV4dF9NTENvbW1lbnQob19yUmVjZWl2ZXIsKnRoaXMpLAoJZHBDb250ZXh0X1NMQ29tbWVudCA9IG5ldyBDb250ZXh0X1NMQ29tbWVudChvX3JSZWNlaXZlciwqdGhpcyksCglkcENvbnRleHRfUHJlcHJvY2Vzc29yID0gbmV3IENvbnRleHRfUHJhZXByb2Nlc3NvcihvX3JSZWNlaXZlciwqdGhpcyksCglkcENvbnRleHRfQXNzaWdubWVudCA9IG5ldyBDb250ZXh0X0Fzc2lnbm1lbnQob19yUmVjZWl2ZXIsKnRoaXMpLAoKCXBEb2N1Q29udGV4dC0+U2V0UGFyZW50Q29udGV4dCgqdGhpcywiKi8iKTsKCVNldHVwU3RhdGVNYWNoaW5lKCk7Cn0KCkNvbnRleHRfVWlkbENvZGU6On5Db250ZXh0X1VpZGxDb2RlKCkKewp9Cgp2b2lkCkNvbnRleHRfVWlkbENvZGU6OlJlYWRDaGFyQ2hhaW4oIENoYXJhY3RlclNvdXJjZSAmIGlvX3JUZXh0ICkKewoJcE5ld1Rva2VuID0gMDsKCglVSU5UMTYgblRva2VuSWQgPSAwOwoJU3RtQm91bmRzU3RhdHUyICYgckJvdW5kID0gYVN0YXRlTWFjaGluZS5HZXRDaGFyQ2hhaW4oblRva2VuSWQsIGlvX3JUZXh0KTsKCgkvLyAhISEKCS8vIAkgVGhlIG9yZGVyIG9mIHRoZSBuZXh0IHR3byBsaW5lcyBpcyBlc3NlbnRpYWwsIGJlY2F1c2UKCS8vICAgcEZvbGxvd1VwQ29udGV4dCBtYXkgYmUgY2hhbmdlZCBieSBQZXJmb3JtU3RhdHVzRnVuY3Rpb24oKSBhbHNvLAoJLy8gICB3aGljaCB0aGVuIE1VU1Qgb3ZlcnJpZGUgdGhlIHByZXZpb3VzIGFzc2lnbm1lbnQuCglwRm9sbG93VXBDb250ZXh0ID0gckJvdW5kLkZvbGxvd1VwQ29udGV4dCgpOwoJUGVyZm9ybVN0YXR1c0Z1bmN0aW9uKHJCb3VuZC5TdGF0dXNGdW5jdGlvbk5yKCksIG5Ub2tlbklkLCBpb19yVGV4dCk7Cn0KCmJvb2wKQ29udGV4dF9VaWRsQ29kZTo6UGFzc05ld1Rva2VuKCkKewoJaWYgKHBOZXdUb2tlbikKCXsKCQlwUmVjZWl2ZXItPlJlY2VpdmUoKnBOZXdUb2tlbi5SZWxlYXNlKCkpOwoJCXJldHVybiB0cnVlOwoJfQoJcmV0dXJuIGZhbHNlOwp9CgpUa3BDb250ZXh0ICYKQ29udGV4dF9VaWRsQ29kZTo6Rm9sbG93VXBDb250ZXh0KCkKewoJY3N2X2Fzc2VydChwRm9sbG93VXBDb250ZXh0ICE9IDApOwoJcmV0dXJuICpwRm9sbG93VXBDb250ZXh0Owp9Cgp2b2lkCkNvbnRleHRfVWlkbENvZGU6OlBlcmZvcm1TdGF0dXNGdW5jdGlvbiggdWludHQJCQkJaV9uU3RhdHVzU2lnbmFsLAoJCQkJCQkJCQkJIFVJTlQxNiAJICAgICAgCWlfblRva2VuSWQsCgkJCQkJCQkJCQkgQ2hhcmFjdGVyU291cmNlICYJaW9fclRleHQgKQp7Cglzd2l0Y2ggKGlfblN0YXR1c1NpZ25hbCkKCXsKCQljYXNlIG5GX2Zpbl9FcnJvcjoKCQkJLy8gS09SUl9GVVRVUkUKCQkJdGhyb3cgWF9BdXRvZG9jUGFyc2VyKFhfQXV0b2RvY1BhcnNlcjo6eF9JbnZhbGlkQ2hhcik7CgkJCS8vIG5vIGJyZWFrLCBiZWNhdXNlIG9mIHRocm93CgkJY2FzZSBuRl9maW5fSWdub3JlOgoJCQlwTmV3VG9rZW4gPSAwOwoJCQlpb19yVGV4dC5DdXRUb2tlbigpOwoJCQlicmVhazsKCQljYXNlIG5GX2Zpbl9JZGVudGlmaWVyOgoJCQlwTmV3VG9rZW4gPSBuZXcgVG9rSWRlbnRpZmllcihpb19yVGV4dC5DdXRUb2tlbigpKTsKCQkJYnJlYWs7CgkJY2FzZSBuRl9maW5fS2V5d29yZDoKCQkJaW9fclRleHQuQ3V0VG9rZW4oKTsKCQkJc3dpdGNoICggaV9uVG9rZW5JZCAvIDUwICkKCQkJewoJCQkJY2FzZSAyOgoJCQkJCXBOZXdUb2tlbiA9IG5ldyBUb2tCdWlsdEluVHlwZShpX25Ub2tlbklkIC0gMTAwKTsKCQkJCQlicmVhazsKCQkJCWNhc2UgNDoKCQkJCQlwTmV3VG9rZW4gPSBuZXcgVG9rVHlwZU1vZGlmaWVyKGlfblRva2VuSWQgLSAyMDApOwoJCQkJCWJyZWFrOwoJCQkJY2FzZSA1OgoJCQkJCXBOZXdUb2tlbiA9IG5ldyBUb2tQYXJhbWV0ZXJIYW5kbGluZyhpX25Ub2tlbklkIC0gMjUwKTsKCQkJCQlicmVhazsKCQkJCWNhc2UgNjoKCQkJCQlwTmV3VG9rZW4gPSBuZXcgVG9rTWV0YVR5cGUoaV9uVG9rZW5JZCAtIDMwMCk7CgkJCQkJYnJlYWs7CgkJCQljYXNlIDg6CgkJCQkJcE5ld1Rva2VuID0gbmV3IFRva1N0ZXJlb3R5cGUoaV9uVG9rZW5JZCAtIDQwMCk7CgkJCQkJYnJlYWs7CgkJCQljYXNlIDEwOgoJCQkJCXN3aXRjaCAoaV9uVG9rZW5JZC01MDApCgkJCQkJewoJCQkJCQljYXNlIDE6CgkJCQkJCQlwTmV3VG9rZW4gPSBuZXcgVG9rUmFpc2VzOwoJCQkJCQkJYnJlYWs7CgkJCQkJCWNhc2UgMjoKCQkJCQkJCXBOZXdUb2tlbiA9IG5ldyBUb2tOZWVkczsKCQkJCQkJCWJyZWFrOwoJCQkJCQljYXNlIDM6CgkJCQkJCQlwTmV3VG9rZW4gPSBuZXcgVG9rT2JzZXJ2ZXM7CgkJCQkJCQlicmVhazsKCQkJCQkJZGVmYXVsdDoKCQkJCQkJCWNzdl9hc3NlcnQoZmFsc2UpOwoJCQkJCX0KCQkJCQlicmVhazsKCQkJCWRlZmF1bHQ6CgkJCQkJY3N2X2Fzc2VydChmYWxzZSk7CgkJCX0JLy8gZW5kIHN3aXRjaCAoIGlfblRva2VuSWQgLyA1MCApCgkJCWJyZWFrOwoJCWNhc2UgbkZfZmluX1B1bmN0dWF0aW9uOgoJCQlpb19yVGV4dC5DdXRUb2tlbigpOwoJCQlpZiAoaV9uVG9rZW5JZCA9PSBuVG9rX3B1bmN0X0RvdWJsZUNvbG9uKQoJCQkJcE5ld1Rva2VuID0gbmV3IFRva05hbWVTZXBhcmF0b3I7CgkJCWVsc2UKCQkJCXBOZXdUb2tlbiA9IG5ldyBUb2tQdW5jdHVhdGlvbihpX25Ub2tlbklkIC0gNzAwKTsKCQkJYnJlYWs7CgkJY2FzZSBuRl9maW5fRU9MOgoJCQlpb19yVGV4dC5DdXRUb2tlbigpOwoJCQlwTmV3VG9rZW4gPSBuZXcgVG9rX0VPTDsKCQkJcFJlY2VpdmVyLT5JbmNyZW1lbnRfQ3VyTGluZSgpOwoJCQlicmVhazsKCQljYXNlIG5GX2Zpbl9FT0Y6CgkJCXBOZXdUb2tlbiA9IG5ldyBUb2tfRU9GOwoJCQlicmVhazsKCQljYXNlIG5GX2dvdG9fTUxEb2N1OgoJCQl3aGlsZSAoIGlvX3JUZXh0LkN1ckNoYXIoKSA9PSAnKicpCgkJCQlpb19yVGV4dC5Nb3ZlT24oKTsKCQkJaW9fclRleHQuQ3V0VG9rZW4oKTsKCQkJcERvY3VDb250ZXh0LT5TZXRNb2RlX0lzTXVsdGlMaW5lKHRydWUpOwoJCQlicmVhazsKCQljYXNlIG5GX2dvdG9fU0xEb2N1OgoJCQlpb19yVGV4dC5DdXRUb2tlbigpOwoJCQlwRG9jdUNvbnRleHQtPlNldE1vZGVfSXNNdWx0aUxpbmUoZmFsc2UpOwoJCQlicmVhazsKCQljYXNlIG5GX2dvdG9fTUxDb21tZW50OgoJCQlicmVhazsKCQljYXNlIG5GX2dvdG9fU0xDb21tZW50OgoJCQlicmVhazsKCQljYXNlIG5GX2dvdG9fUHJhZXByb2Nlc3NvcjoKCQkJYnJlYWs7CgkJY2FzZSBuRl9nb3RvX0Fzc2lnbm1lbnQ6CgkJCWJyZWFrOwoJCWRlZmF1bHQ6CgkJCWNzdl9hc3NlcnQoZmFsc2UpOwoJfQkvLyBlbmQgc3dpdGNoIChpX25TdGF0dXNTaWduYWwpCn0KCnZvaWQKQ29udGV4dF9VaWRsQ29kZTo6U2V0dXBTdGF0ZU1hY2hpbmUoKQp7CgkvLyBCZXNvbmRlcmUgQXJyYXktU3RhdGkgKGtlaW4gVG9rZW5hYnNjaGx1c3Mgb2RlciBLb250ZXh0d2VjaHNlbCk6Ci8vCWNvbnN0IElOVDE2CXRvcCA9IDA7CQkvLyBUb3AtU3RhdHVzCgljb25zdCBJTlQxNgl3aHQgPSAxOwkJLy8gV2hpdGVzcGFjZS38YmVybGVzZS1TdGF0dXMKCWNvbnN0IElOVDE2CWJleiA9IDI7ICAgICAgICAvLyBCZXplaWNobmVyLWxlc2UtU3RhdHVzCgoJLy8gVG9rZW5maW5pc2gtU3RhdGk6Cgljb25zdCBJTlQxNglmaW5FcnIgPSAzOwoJY29uc3QgSU5UMTYgZmluSWduID0gNDsKCWNvbnN0IElOVDE2IGZpbkJleiA9IDU7Cgljb25zdCBJTlQxNiBmaW5LZXl3ID0gNjsKCWNvbnN0IElOVDE2IGZpblB1bmN0ID0gNzsKCWNvbnN0IElOVDE2IGZpbkVPTCA9IDg7Cgljb25zdCBJTlQxNiBmaW5FT0YgPSA5OwoKCS8vIEtvbnRleHR3ZWNoc2VsLVN0YXRpOgoJY29uc3QgSU5UMTYJZ290b01sZCA9IDEwOwoJY29uc3QgSU5UMTYJZ290b1NsZCA9IDExOwoJY29uc3QgSU5UMTYJZ290b01sYyA9IDEyOwoJY29uc3QgSU5UMTYJZ290b1NsYyA9IDEzOwoJY29uc3QgSU5UMTYgZ290b1BycCA9IDE0OwoJY29uc3QgSU5UMTYJZ290b0FzZyA9IDE1OwoKCS8vIEtvbnN0YW50ZW4genVyIEJlbnV0enVuZyBpbiBkZXIgVGFiZWxsZToKCWNvbnN0IElOVDE2IGVyciA9IGZpbkVycjsKCWNvbnN0IElOVDE2IGZieiA9IGZpbkJlejsKCWNvbnN0IElOVDE2IGZpZyA9IGZpbklnbjsKCWNvbnN0IElOVDE2IGZvZiA9IGZpbkVPRjsKLy8JY29uc3QgSU5UMTYgZmt3ID0gZmluS2V5dzsKLy8JY29uc3QgSU5UMTYgZnBjID0gZmluUHVuY3Q7CgoJLy8vIERpZSAnMCdlbiB3ZXJkZW4gc3BhZXRlciBkdXJjaCBBZGRUb2tlbigpIGVyc2V0enQuCgoJY29uc3QgSU5UMTYgQV9uVG9wU3RhdHVzW0NfblN0YXR1c1NpemVdID0KCS8vICAwCTEJMgkzCTQJNQk2CTcJOAk5ICAxMCAgMTEgIDEyICAxMyAgMTQgIDE1Cgl7Zm9mLGVycixlcnIsZXJyLGVycixlcnIsZXJyLGVycixlcnIsd2h0LCAgMCx3aHQsd2h0LCAgMCxlcnIsZXJyLAoJIGVycixlcnIsZXJyLGVycixlcnIsZXJyLGVycixlcnIsZXJyLGVycixmb2YsZXJyLGVycixlcnIsZXJyLGVyciwgLy8gMTYgLi4uCgkgd2h0LGVycix3aHQsICAwLGVycixlcnIsZXJyLGVyciwgIDAsICAwLGVycixlcnIsICAwLCAgMCwgIDAsZXJyLAoJIGJleixiZXosYmV6LGJleixiZXosYmV6LGJleixiZXosYmV6LGJleixlcnIsZXJyLGVycixlcnIsZXJyLGVyciwgLy8gNDggLi4uCgkgZXJyLGJleixiZXosYmV6LGJleixiZXosYmV6LGJleixiZXosYmV6LGJleixiZXosYmV6LGJleixiZXosYmV6LAoJIGJleixiZXosYmV6LGJleixiZXosYmV6LGJleixiZXosYmV6LGJleixiZXosICAwLGVyciwgIDAsZXJyLGJleiwgLy8gODAgLi4uCgkgZXJyLGJleixiZXosYmV6LGJleixiZXosYmV6LGJleixiZXosYmV6LGJleixiZXosYmV6LGJleixiZXosYmV6LAoJIGJleixiZXosYmV6LGJleixiZXosYmV6LGJleixiZXosYmV6LGJleixiZXosICAwLGVyciwgIDAsZXJyLGVyciwgLy8gMTEyIC4uLgoJfTsKCgljb25zdCBJTlQxNiBBX25XaGl0ZXNwYWNlU3RhdHVzW0NfblN0YXR1c1NpemVdID0KCS8vIAkwCTEJMgkzCTQJNQk2CTcJOAk5ICAxMCAgMTEgIDEyICAxMyAgMTQgIDE1Cgl7Zm9mLGVycixlcnIsZXJyLGVycixlcnIsZXJyLGVycixlcnIsd2h0LGZpZyx3aHQsd2h0LGZpZyxlcnIsZXJyLAoJIGVycixlcnIsZXJyLGVycixlcnIsZXJyLGVycixlcnIsZXJyLGVycixmb2YsZXJyLGVycixlcnIsZXJyLGVyciwgLy8gMTYgLi4uCgkgd2h0LGZpZyx3aHQsZmlnLGZpZyxmaWcsZmlnLGZpZyxmaWcsZmlnLGZpZyxmaWcsZmlnLGZpZyxmaWcsZmlnLAoJIGZpZyxmaWcsZmlnLGZpZyxmaWcsZmlnLGZpZyxmaWcsZmlnLGZpZyxmaWcsZmlnLGZpZyxmaWcsZmlnLGZpZywgLy8gNDggLi4uCgkgZmlnLGZpZyxmaWcsZmlnLGZpZyxmaWcsZmlnLGZpZyxmaWcsZmlnLGZpZyxmaWcsZmlnLGZpZyxmaWcsZmlnLAoJIGZpZyxmaWcsZmlnLGZpZyxmaWcsZmlnLGZpZyxmaWcsZmlnLGZpZyxmaWcsZmlnLGZpZyxmaWcsZmlnLGZpZywgLy8gODAgLi4uCgkgZmlnLGZpZyxmaWcsZmlnLGZpZyxmaWcsZmlnLGZpZyxmaWcsZmlnLGZpZyxmaWcsZmlnLGZpZyxmaWcsZmlnLAoJIGZpZyxmaWcsZmlnLGZpZyxmaWcsZmlnLGZpZyxmaWcsZmlnLGZpZyxmaWcsZmlnLGZpZyxmaWcsZmlnLGVyciAgLy8gMTEyIC4uLgoJfTsKCgljb25zdCBJTlQxNiBBX25CZXplaWNobmVyU3RhdHVzW0NfblN0YXR1c1NpemVdID0KCS8vIAkwCTEJMgkzCTQJNQk2CTcJOAk5ICAxMCAgMTEgIDEyICAxMyAgMTQgIDE1Cgl7ZmJ6LGVycixlcnIsZXJyLGVycixlcnIsZXJyLGVycixlcnIsZmJ6LGZieixmYnosZmJ6LGZieixlcnIsZXJyLAoJIGVycixlcnIsZXJyLGVycixlcnIsZXJyLGVycixlcnIsZXJyLGVycixmYnosZXJyLGVycixlcnIsZXJyLGVyciwgLy8gMTYgLi4uCgkgZmJ6LGZieixmYnosZmJ6LGZieixmYnosZmJ6LGZieixmYnosZmJ6LGZieixmYnosZmJ6LGZieixmYnosZmJ6LAoJIGJleixiZXosYmV6LGJleixiZXosYmV6LGJleixiZXosYmV6LGJleixmYnosZmJ6LGZieixmYnosZmJ6LGZieiwgLy8gNDggLi4uCgkgZmJ6LGJleixiZXosYmV6LGJleixiZXosYmV6LGJleixiZXosYmV6LGJleixiZXosYmV6LGJleixiZXosYmV6LAoJIGJleixiZXosYmV6LGJleixiZXosYmV6LGJleixiZXosYmV6LGJleixiZXosZmJ6LGZieixmYnosZmJ6LGJleiwgLy8gODAgLi4uCgkgZmJ6LGJleixiZXosYmV6LGJleixiZXosYmV6LGJleixiZXosYmV6LGJleixiZXosYmV6LGJleixiZXosYmV6LAoJIGJleixiZXosYmV6LGJleixiZXosYmV6LGJleixiZXosYmV6LGJleixiZXosZmJ6LGZieixmYnosZmJ6LGVyciAgLy8gMTEyIC4uLgoJfTsKCgljb25zdCBJTlQxNiBBX25QdW5jdERlZlN0YXR1c1tDX25TdGF0dXNTaXplXSA9CgkvLyAJMAkxCTIJMwk0CTUJNgk3CTgJOSAgMTAgIDExICAxMiAgMTMgIDE0ICAxNQoJe2VycixlcnIsZXJyLGVycixlcnIsZXJyLGVycixlcnIsZXJyLGVycixlcnIsZXJyLGVycixlcnIsZXJyLGVyciwKCSBlcnIsZXJyLGVycixlcnIsZXJyLGVycixlcnIsZXJyLGVycixlcnIsZXJyLGVycixlcnIsZXJyLGVycixlcnIsIC8vIDE2IC4uLgoJIGVycixlcnIsZXJyLGVycixlcnIsZXJyLGVycixlcnIsZXJyLGVycixlcnIsZXJyLGVycixlcnIsZXJyLGVyciwKCSBlcnIsZXJyLGVycixlcnIsZXJyLGVycixlcnIsZXJyLGVycixlcnIsZXJyLGVycixlcnIsZXJyLGVycixlcnIsIC8vIDQ4IC4uLgoJIGVycixlcnIsZXJyLGVycixlcnIsZXJyLGVycixlcnIsZXJyLGVycixlcnIsZXJyLGVycixlcnIsZXJyLGVyciwKCSBlcnIsZXJyLGVycixlcnIsZXJyLGVycixlcnIsZXJyLGVycixlcnIsZXJyLGVycixlcnIsZXJyLGVycixlcnIsIC8vIDgwIC4uLgoJIGVycixlcnIsZXJyLGVycixlcnIsZXJyLGVycixlcnIsZXJyLGVycixlcnIsZXJyLGVycixlcnIsZXJyLGVyciwKCSBlcnIsZXJyLGVycixlcnIsZXJyLGVycixlcnIsZXJyLGVycixlcnIsZXJyLGVycixlcnIsZXJyLGVycixlcnIgIC8vIDExMiAuLi4KCX07CgoJY29uc3QgSU5UMTYgQV9uS2V5d29yZERlZlN0YXR1c1tDX25TdGF0dXNTaXplXSA9CgkvLyAJMAkxCTIJMwk0CTUJNgk3CTgJOSAgMTAgIDExICAxMiAgMTMgIDE0ICAxNQoJe2ZieixlcnIsZXJyLGVycixlcnIsZXJyLGVycixlcnIsZXJyLGZieixmYnosZmJ6LGZieixmYnosZXJyLGVyciwKCSBlcnIsZXJyLGVycixlcnIsZXJyLGVycixlcnIsZXJyLGVycixlcnIsZmJ6LGVycixlcnIsZXJyLGVycixlcnIsIC8vIDE2IC4uLgoJIGZieixmYnosZmJ6LGZieixmYnosZmJ6LGZieixmYnosZmJ6LGZieixmYnosZmJ6LGZieixmYnosZmJ6LGZieiwKCSBiZXosYmV6LGJleixiZXosYmV6LGJleixiZXosYmV6LGJleixiZXosZmJ6LGZieixmYnosZmJ6LGZieixmYnosIC8vIDQ4IC4uLgoJIGZieixiZXosYmV6LGJleixiZXosYmV6LGJleixiZXosYmV6LGJleixiZXosYmV6LGJleixiZXosYmV6LGJleiwKCSBiZXosYmV6LGJleixiZXosYmV6LGJleixiZXosYmV6LGJleixiZXosYmV6LGZieixmYnosZmJ6LGZieixiZXosIC8vIDgwIC4uLgoJIGZieixiZXosYmV6LGJleixiZXosYmV6LGJleixiZXosYmV6LGJleixiZXosYmV6LGJleixiZXosYmV6LGJleiwKCSBiZXosYmV6LGJleixiZXosYmV6LGJleixiZXosYmV6LGJleixiZXosYmV6LGZieixmYnosZmJ6LGZieixlcnIgIC8vIDExMiAuLi4KCX07CgoJRFlOIFN0bUFycmF5U3RhdHUyICogZHBTdGF0dXNUb3AKCQkJPSBuZXcgU3RtQXJyYXlTdGF0dTIoIENfblN0YXR1c1NpemUsIEFfblRvcFN0YXR1cywgMCwgdHJ1ZSk7CglEWU4gU3RtQXJyYXlTdGF0dTIgKiBkcFN0YXR1c1doaXRlCgkJCT0gbmV3IFN0bUFycmF5U3RhdHUyKCBDX25TdGF0dXNTaXplLCBBX25XaGl0ZXNwYWNlU3RhdHVzLCAwLCB0cnVlKTsKCURZTiBTdG1BcnJheVN0YXR1MiAqIGRwU3RhdHVzQmV6CgkJCT0gbmV3IFN0bUFycmF5U3RhdHUyKCBDX25TdGF0dXNTaXplLCBBX25CZXplaWNobmVyU3RhdHVzLCAwLCB0cnVlKTsKCglEWU4gU3RtQm91bmRzU3RhdHUyICogIAlkcEJzdF9maW5FcnIKCQkJPSBuZXcgU3RtQm91bmRzU3RhdHUyKCAqdGhpcywgVGtwQ29udGV4dF9OdWxsMl8oKSwgbkZfZmluX0Vycm9yLCB0cnVlICk7CglEWU4gU3RtQm91bmRzU3RhdHUyICogIAlkcEJzdF9maW5JZ24KCQkJPSBuZXcgU3RtQm91bmRzU3RhdHUyKCAqdGhpcywgKnRoaXMsIG5GX2Zpbl9JZ25vcmUsIHRydWUgKTsKCURZTiBTdG1Cb3VuZHNTdGF0dTIgKiAgCWRwQnN0X2ZpbkJlegoJCQk9IG5ldyBTdG1Cb3VuZHNTdGF0dTIoICp0aGlzLCAqdGhpcywgbkZfZmluX0lkZW50aWZpZXIsIHRydWUgKTsKCURZTiBTdG1Cb3VuZHNTdGF0dTIgKiAgCWRwQnN0X2ZpbktleXcKCQkJPSBuZXcgU3RtQm91bmRzU3RhdHUyKCAqdGhpcywgKnRoaXMsIG5GX2Zpbl9LZXl3b3JkLCBmYWxzZSApOwoJRFlOIFN0bUJvdW5kc1N0YXR1MiAqICAJZHBCc3RfZmluUHVuY3QKCQkJPSBuZXcgU3RtQm91bmRzU3RhdHUyKCAqdGhpcywgKnRoaXMsIG5GX2Zpbl9QdW5jdHVhdGlvbiwgZmFsc2UgKTsKCURZTiBTdG1Cb3VuZHNTdGF0dTIgKiAgCWRwQnN0X2ZpbkVPTAoJCQk9IG5ldyBTdG1Cb3VuZHNTdGF0dTIoICp0aGlzLCAqdGhpcywgbkZfZmluX0VPTCwgZmFsc2UgKTsKCURZTiBTdG1Cb3VuZHNTdGF0dTIgKiAgCWRwQnN0X2ZpbkVPRgoJCQk9IG5ldyBTdG1Cb3VuZHNTdGF0dTIoICp0aGlzLCBUa3BDb250ZXh0X051bGwyXygpLCBuRl9maW5fRU9GLCBmYWxzZSApOwoKCURZTiBTdG1Cb3VuZHNTdGF0dTIgKiAgCWRwQnN0X2dvdG9NbGQKCQkJPSBuZXcgU3RtQm91bmRzU3RhdHUyKCAqdGhpcywgKnBEb2N1Q29udGV4dCwgbkZfZ290b19NTERvY3UsIGZhbHNlICk7CglEWU4gU3RtQm91bmRzU3RhdHUyICogIAlkcEJzdF9nb3RvU2xkCgkJCT0gbmV3IFN0bUJvdW5kc1N0YXR1MiggKnRoaXMsICpwRG9jdUNvbnRleHQsIG5GX2dvdG9fU0xEb2N1LCBmYWxzZSApOwoJRFlOIFN0bUJvdW5kc1N0YXR1MiAqICAJZHBCc3RfZ290b01sYwoJCQk9IG5ldyBTdG1Cb3VuZHNTdGF0dTIoICp0aGlzLCAqZHBDb250ZXh0X01MQ29tbWVudCwgbkZfZ290b19NTENvbW1lbnQsIGZhbHNlICk7CglEWU4gU3RtQm91bmRzU3RhdHUyICogIAlkcEJzdF9nb3RvU2xjCgkJCT0gbmV3IFN0bUJvdW5kc1N0YXR1MiggKnRoaXMsICpkcENvbnRleHRfU0xDb21tZW50LCBuRl9nb3RvX1NMQ29tbWVudCwgZmFsc2UgKTsKCURZTiBTdG1Cb3VuZHNTdGF0dTIgKiAgCWRwQnN0X2dvdG9QcnAKCQkJPSBuZXcgU3RtQm91bmRzU3RhdHUyKCAqdGhpcywgKmRwQ29udGV4dF9QcmVwcm9jZXNzb3IsIG5GX2dvdG9fUHJhZXByb2Nlc3NvciwgZmFsc2UgKTsKCURZTiBTdG1Cb3VuZHNTdGF0dTIgKiAgCWRwQnN0X2dvdG9Bc2cKCQkJPSBuZXcgU3RtQm91bmRzU3RhdHUyKCAqdGhpcywgKmRwQ29udGV4dF9Bc3NpZ25tZW50LCBuRl9nb3RvX0Fzc2lnbm1lbnQsIGZhbHNlICk7CgoJLy8gZHBNYWluIGF1ZmJhdWVuOgoJYVN0YXRlTWFjaGluZS5BZGRTdGF0dXMoZHBTdGF0dXNUb3ApOwoKCWFTdGF0ZU1hY2hpbmUuQWRkU3RhdHVzKGRwU3RhdHVzV2hpdGUpOwoJYVN0YXRlTWFjaGluZS5BZGRTdGF0dXMoZHBTdGF0dXNCZXopOwoKCWFTdGF0ZU1hY2hpbmUuQWRkU3RhdHVzKGRwQnN0X2ZpbkVycik7CglhU3RhdGVNYWNoaW5lLkFkZFN0YXR1cyhkcEJzdF9maW5JZ24pOwoJYVN0YXRlTWFjaGluZS5BZGRTdGF0dXMoZHBCc3RfZmluQmV6KTsKCWFTdGF0ZU1hY2hpbmUuQWRkU3RhdHVzKGRwQnN0X2ZpbktleXcpOwoJYVN0YXRlTWFjaGluZS5BZGRTdGF0dXMoZHBCc3RfZmluUHVuY3QpOwoJYVN0YXRlTWFjaGluZS5BZGRTdGF0dXMoZHBCc3RfZmluRU9MKTsKCWFTdGF0ZU1hY2hpbmUuQWRkU3RhdHVzKGRwQnN0X2ZpbkVPRik7CgoJYVN0YXRlTWFjaGluZS5BZGRTdGF0dXMoZHBCc3RfZ290b01sZCk7CglhU3RhdGVNYWNoaW5lLkFkZFN0YXR1cyhkcEJzdF9nb3RvU2xkKTsKCWFTdGF0ZU1hY2hpbmUuQWRkU3RhdHVzKGRwQnN0X2dvdG9NbGMpOwoJYVN0YXRlTWFjaGluZS5BZGRTdGF0dXMoZHBCc3RfZ290b1NsYyk7CglhU3RhdGVNYWNoaW5lLkFkZFN0YXR1cyhkcEJzdF9nb3RvUHJwKTsKCWFTdGF0ZU1hY2hpbmUuQWRkU3RhdHVzKGRwQnN0X2dvdG9Bc2cpOwoKCWFTdGF0ZU1hY2hpbmUuQWRkVG9rZW4oImFueSIsCQluVG9rX2J0eV9hbnksCQkJQV9uS2V5d29yZERlZlN0YXR1cywJZmluS2V5dyk7CglhU3RhdGVNYWNoaW5lLkFkZFRva2VuKCJhdHRyaWJ1dGUiLCBuVG9rX210X2F0dHJpYnV0ZSwgICAgICBBX25LZXl3b3JkRGVmU3RhdHVzLAlmaW5LZXl3KTsKCWFTdGF0ZU1hY2hpbmUuQWRkVG9rZW4oImJvb2xlYW4iLCAgIG5Ub2tfYnR5X2Jvb2xlYW4sICAgICAgIEFfbktleXdvcmREZWZTdGF0dXMsICAgIGZpbktleXcpOwoJYVN0YXRlTWFjaGluZS5BZGRUb2tlbigiYm91bmQiLCAgICAgblRva19zdGVfYm91bmQsICAgICAgICAgQV9uS2V5d29yZERlZlN0YXR1cywgICAgZmluS2V5dyk7CglhU3RhdGVNYWNoaW5lLkFkZFRva2VuKCJieXRlIiwgICAgICBuVG9rX2J0eV9ieXRlLCAgICAgICAgICBBX25LZXl3b3JkRGVmU3RhdHVzLCAgICBmaW5LZXl3KTsKCWFTdGF0ZU1hY2hpbmUuQWRkVG9rZW4oImNoYXIiLCAgICAgIG5Ub2tfYnR5X2NoYXIsICAgICAgICAgIEFfbktleXdvcmREZWZTdGF0dXMsICAgIGZpbktleXcpOwoJYVN0YXRlTWFjaGluZS5BZGRUb2tlbigiY29uc3QiLCAgICAgblRva19zdGVfY29uc3QsICAgICAgICAgQV9uS2V5d29yZERlZlN0YXR1cywgICAgZmluS2V5dyk7CglhU3RhdGVNYWNoaW5lLkFkZFRva2VuKCJjb25zdGFudHMiLCBuVG9rX210X2NvbnN0YW50cywgICAgICBBX25LZXl3b3JkRGVmU3RhdHVzLCAgICBmaW5LZXl3KTsKCWFTdGF0ZU1hY2hpbmUuQWRkVG9rZW4oImNvbnN0cmFpbmVkIiwKCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5Ub2tfc3RlX2NvbnN0cmFpbmVkLCAgIEFfbktleXdvcmREZWZTdGF0dXMsICAgIGZpbktleXcpOwoJYVN0YXRlTWFjaGluZS5BZGRUb2tlbigiZG91YmxlIiwgICAgblRva19idHlfZG91YmxlLCAgICAgICAgQV9uS2V5d29yZERlZlN0YXR1cywgICAgZmluS2V5dyk7CglhU3RhdGVNYWNoaW5lLkFkZFRva2VuKCJlbnVtIiwgICAgICBuVG9rX210X2VudW0sICAgICAgICAgICBBX25LZXl3b3JkRGVmU3RhdHVzLCAgICBmaW5LZXl3KTsKCWFTdGF0ZU1hY2hpbmUuQWRkVG9rZW4oImV4Y2VwdGlvbiIsIG5Ub2tfbXRfZXhjZXB0aW9uLCAgICAgIEFfbktleXdvcmREZWZTdGF0dXMsICAgIGZpbktleXcpOwoJYVN0YXRlTWFjaGluZS5BZGRUb2tlbigiaHlwZXIiLCAgICAgblRva19idHlfaHlwZXIsICAgICAgICAgQV9uS2V5d29yZERlZlN0YXR1cywgICAgZmluS2V5dyk7CglhU3RhdGVNYWNoaW5lLkFkZFRva2VuKCJpZGVudCIsICAgICBuVG9rX210X2lkZW50LCAgICAgICAgICBBX25LZXl3b3JkRGVmU3RhdHVzLCAgICBmaW5LZXl3KTsKCWFTdGF0ZU1hY2hpbmUuQWRkVG9rZW4oImluIiwgICAgICAgIG5Ub2tfcGhfaW4sICAgICAgICAgICAgIEFfbktleXdvcmREZWZTdGF0dXMsICAgIGZpbktleXcpOwoJYVN0YXRlTWFjaGluZS5BZGRUb2tlbigiaW5vdXQiLCAgICAgblRva19waF9pbm91dCwgICAgICAgICAgQV9uS2V5d29yZERlZlN0YXR1cywgICAgZmluS2V5dyk7CglhU3RhdGVNYWNoaW5lLkFkZFRva2VuKCJpbnRlcmZhY2UiLCBuVG9rX210X2ludGVyZmFjZSwgICAgICBBX25LZXl3b3JkRGVmU3RhdHVzLCAgICBmaW5LZXl3KTsKCWFTdGF0ZU1hY2hpbmUuQWRkVG9rZW4oImxvbmciLCAgICAgIG5Ub2tfYnR5X2xvbmcsICAgICAgICAgIEFfbktleXdvcmREZWZTdGF0dXMsICAgIGZpbktleXcpOwoJYVN0YXRlTWFjaGluZS5BZGRUb2tlbigibWF5YmVhbWJpZ3VvdXMiLAoJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgblRva19zdGVfbWF5YmVhbWJpZ3VvdXMsQV9uS2V5d29yZERlZlN0YXR1cywgICAgZmluS2V5dyk7CglhU3RhdGVNYWNoaW5lLkFkZFRva2VuKCJtYXliZWRlZmF1bHQiLAoJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgblRva19zdGVfbWF5YmVkZWZhdWx0LCAgQV9uS2V5d29yZERlZlN0YXR1cywgICAgZmluS2V5dyk7CglhU3RhdGVNYWNoaW5lLkFkZFRva2VuKCJtYXliZXZvaWQiLCBuVG9rX3N0ZV9tYXliZXZvaWQsICAgICBBX25LZXl3b3JkRGVmU3RhdHVzLCAgICBmaW5LZXl3KTsKCWFTdGF0ZU1hY2hpbmUuQWRkVG9rZW4oIm1vZHVsZSIsICAgIG5Ub2tfbXRfbW9kdWxlLCAgICAgICAgIEFfbktleXdvcmREZWZTdGF0dXMsICAgIGZpbktleXcpOwoJYVN0YXRlTWFjaGluZS5BZGRUb2tlbigibmVlZHMiLCAgICAgblRva19uZWVkcywgICAgICAgICAgICAgQV9uS2V5d29yZERlZlN0YXR1cywgICAgZmluS2V5dyk7CglhU3RhdGVNYWNoaW5lLkFkZFRva2VuKCJvYnNlcnZlcyIsICBuVG9rX29ic2VydmVzLCAgICAgICAgICBBX25LZXl3b3JkRGVmU3RhdHVzLCAgICBmaW5LZXl3KTsKCWFTdGF0ZU1hY2hpbmUuQWRkVG9rZW4oIm9uZXdheSIsICAgIG5Ub2tfc3RlX29uZXdheSwgICAgICAgIEFfbktleXdvcmREZWZTdGF0dXMsICAgIGZpbktleXcpOwoJYVN0YXRlTWFjaGluZS5BZGRUb2tlbigib3B0aW9uYWwiLCAgblRva19zdGVfb3B0aW9uYWwsICAgICAgQV9uS2V5d29yZERlZlN0YXR1cywgICAgZmluS2V5dyk7CglhU3RhdGVNYWNoaW5lLkFkZFRva2VuKCJvdXQiLCAgICAgICBuVG9rX3BoX291dCwgICAgICAgICAgICBBX25LZXl3b3JkRGVmU3RhdHVzLCAgICBmaW5LZXl3KTsKCWFTdGF0ZU1hY2hpbmUuQWRkVG9rZW4oInByb3BlcnR5IiwgIG5Ub2tfbXRfcHJvcGVydHksICAgICAgIEFfbktleXdvcmREZWZTdGF0dXMsICAgIGZpbktleXcpOwoJYVN0YXRlTWFjaGluZS5BZGRUb2tlbigicHVibGlzaGVkIiwgblRva19zdGVfcHVibGlzaGVkLCAgICAgQV9uS2V5d29yZERlZlN0YXR1cywgICAgZmluS2V5dyk7CglhU3RhdGVNYWNoaW5lLkFkZFRva2VuKCJyYWlzZXMiLCAgICBuVG9rX3JhaXNlcywgICAgICAgICAgICBBX25LZXl3b3JkRGVmU3RhdHVzLCAgICBmaW5LZXl3KTsKCWFTdGF0ZU1hY2hpbmUuQWRkVG9rZW4oInJlYWRvbmx5IiwgIG5Ub2tfc3RlX3JlYWRvbmx5LCAgICAgIEFfbktleXdvcmREZWZTdGF0dXMsICAgIGZpbktleXcpOwoJYVN0YXRlTWFjaGluZS5BZGRUb2tlbigicmVtb3ZhYmxlIiwgblRva19zdGVfcmVtb3ZhYmxlLCAgICAgQV9uS2V5d29yZERlZlN0YXR1cywgICAgZmluS2V5dyk7CglhU3RhdGVNYWNoaW5lLkFkZFRva2VuKCJzZXF1ZW5jZSIsICBuVG9rX3Rtb2Rfc2VxdWVuY2UsICAgICBBX25LZXl3b3JkRGVmU3RhdHVzLCAgICBmaW5LZXl3KTsKCWFTdGF0ZU1hY2hpbmUuQWRkVG9rZW4oInNlcnZpY2UiLCAgIG5Ub2tfbXRfc2VydmljZSwgICAgICAgIEFfbktleXdvcmREZWZTdGF0dXMsICAgIGZpbktleXcpOwoJYVN0YXRlTWFjaGluZS5BZGRUb2tlbigic2hvcnQiLCAgICAgblRva19idHlfc2hvcnQsICAgICAgICAgQV9uS2V5d29yZERlZlN0YXR1cywgICAgZmluS2V5dyk7CglhU3RhdGVNYWNoaW5lLkFkZFRva2VuKCJzaW5nbGV0b24iLCBuVG9rX210X3NpbmdsZXRvbiwgICAgICBBX25LZXl3b3JkRGVmU3RhdHVzLCAgICBmaW5LZXl3KTsKCWFTdGF0ZU1hY2hpbmUuQWRkVG9rZW4oInN0cmluZyIsICAgIG5Ub2tfYnR5X3N0cmluZywgICAgICAgIEFfbktleXdvcmREZWZTdGF0dXMsICAgIGZpbktleXcpOwoJYVN0YXRlTWFjaGluZS5BZGRUb2tlbigic3RydWN0IiwgICAgblRva19tdF9zdHJ1Y3QsICAgICAgICAgQV9uS2V5d29yZERlZlN0YXR1cywgICAgZmluS2V5dyk7CglhU3RhdGVNYWNoaW5lLkFkZFRva2VuKCJ0cmFuc2llbnQiLCBuVG9rX3N0ZV90cmFuc2llbnQsICAgICBBX25LZXl3b3JkRGVmU3RhdHVzLCAgICBmaW5LZXl3KTsKCWFTdGF0ZU1hY2hpbmUuQWRkVG9rZW4oInR5cGVkZWYiLCAgIG5Ub2tfbXRfdHlwZWRlZiwgICAgICAgIEFfbktleXdvcmREZWZTdGF0dXMsICAgIGZpbktleXcpOwoJYVN0YXRlTWFjaGluZS5BZGRUb2tlbigidWlrIiwgICAgICAgblRva19tdF91aWssICAgICAgICAgICAgQV9uS2V5d29yZERlZlN0YXR1cywgICAgZmluS2V5dyk7CglhU3RhdGVNYWNoaW5lLkFkZFRva2VuKCJ1bnNpZ25lZCIsICBuVG9rX3Rtb2RfdW5zaWduZWQsICAgICBBX25LZXl3b3JkRGVmU3RhdHVzLCAgICBmaW5LZXl3KTsKCWFTdGF0ZU1hY2hpbmUuQWRkVG9rZW4oInZpcnR1YWwiLCAgIG5Ub2tfc3RlX3ZpcnR1YWwsICAgICAgIEFfbktleXdvcmREZWZTdGF0dXMsICAgIGZpbktleXcpOwoJYVN0YXRlTWFjaGluZS5BZGRUb2tlbigidm9pZCIsICAgICAgblRva19idHlfdm9pZCwgICAgICAgICAgQV9uS2V5d29yZERlZlN0YXR1cywgICAgZmluS2V5dyk7CglhU3RhdGVNYWNoaW5lLkFkZFRva2VuKCIuLi4iLCAgICAgICBuVG9rX2J0eV9lbGxpcHNlLCAgICAgICBBX25QdW5jdERlZlN0YXR1cywgICAgICBmaW5LZXl3KTsKCglhU3RhdGVNYWNoaW5lLkFkZFRva2VuKCI9IiwgICAgICAgICBuVG9rX2Fzc2lnbm1lbnQsICAgICAgICBBX25QdW5jdERlZlN0YXR1cywgICAgICBnb3RvQXNnKTsKCglhU3RhdGVNYWNoaW5lLkFkZFRva2VuKCIoIiwgICAgICAgICBuVG9rX3B1bmN0X0JyYWNrZXRPcGVuLCBBX25QdW5jdERlZlN0YXR1cywgICAgICBmaW5QdW5jdCk7CglhU3RhdGVNYWNoaW5lLkFkZFRva2VuKCIpIiwgICAgICAgICBuVG9rX3B1bmN0X0JyYWNrZXRDbG9zZSxBX25QdW5jdERlZlN0YXR1cywgICAgICBmaW5QdW5jdCk7CglhU3RhdGVNYWNoaW5lLkFkZFRva2VuKCJbIiwgICAgICAgICBuVG9rX3B1bmN0X0FycmF5QnJhY2tldE9wZW4sCgkJCQkJCQkJCQkJCQkJCQlBX25QdW5jdERlZlN0YXR1cywgICAgICBmaW5JZ24pOwoJYVN0YXRlTWFjaGluZS5BZGRUb2tlbigiXSIsICAgICAgICAgblRva19wdW5jdF9BcnJheUJyYWNrZXRDbG9zZSwKCQkJCQkJCQkJCQkJCQkJCUFfblB1bmN0RGVmU3RhdHVzLCAgICAgIGZpbklnbik7CglhU3RhdGVNYWNoaW5lLkFkZFRva2VuKCJ7IiwgICAgICAgICBuVG9rX3B1bmN0X0N1cmxlZEJyYWNrZXRPcGVuLAoJCQkJCQkJCQkJCQkJCQkJQV9uUHVuY3REZWZTdGF0dXMsICAgICAgZmluUHVuY3QpOwoJYVN0YXRlTWFjaGluZS5BZGRUb2tlbigifSIsICAgICAgICAgblRva19wdW5jdF9DdXJsZWRCcmFja2V0Q2xvc2UsCgkJCQkJCQkJCQkJCQkJCQlBX25QdW5jdERlZlN0YXR1cywgICAgICBmaW5QdW5jdCk7CglhU3RhdGVNYWNoaW5lLkFkZFRva2VuKCI8IiwgICAgICAgICBuVG9rX3B1bmN0X0xlc3NlciwJCUFfblB1bmN0RGVmU3RhdHVzLCAgICAgIGZpblB1bmN0KTsKCWFTdGF0ZU1hY2hpbmUuQWRkVG9rZW4oIj4iLCAgICAgICAgIG5Ub2tfcHVuY3RfR3JlYXRlciwgICAgIEFfblB1bmN0RGVmU3RhdHVzLCAgICAgIGZpblB1bmN0KTsKCWFTdGF0ZU1hY2hpbmUuQWRkVG9rZW4oIjsiLCAgICAgICAgIG5Ub2tfcHVuY3RfU2VtaWNvbG9uLCAgIEFfblB1bmN0RGVmU3RhdHVzLCAgICAgIGZpblB1bmN0KTsKCWFTdGF0ZU1hY2hpbmUuQWRkVG9rZW4oIjoiLCAgICAgICAgIG5Ub2tfcHVuY3RfQ29sb24sICAgICAgIEFfblB1bmN0RGVmU3RhdHVzLCAgICAgIGZpblB1bmN0KTsKCWFTdGF0ZU1hY2hpbmUuQWRkVG9rZW4oIjo6IiwgICAgICAgIG5Ub2tfcHVuY3RfRG91YmxlQ29sb24sIEFfblB1bmN0RGVmU3RhdHVzLCAgICAgIGZpblB1bmN0KTsKCWFTdGF0ZU1hY2hpbmUuQWRkVG9rZW4oIiwiLCAgICAgICAgIG5Ub2tfcHVuY3RfQ29tbWEsICAgICAgIEFfblB1bmN0RGVmU3RhdHVzLCAgICAgIGZpblB1bmN0KTsKCWFTdGF0ZU1hY2hpbmUuQWRkVG9rZW4oIi0iLCAgICAgICAgIG5Ub2tfcHVuY3RfTWludXMsICAgICAgIEFfblB1bmN0RGVmU3RhdHVzLCAgICAgIGZpblB1bmN0KTsKCWFTdGF0ZU1hY2hpbmUuQWRkVG9rZW4oIi4iLCAgICAgICAgIG5Ub2tfcHVuY3RfRnVsbHN0b3AsICAgIEFfblB1bmN0RGVmU3RhdHVzLCAgICAgIGZpblB1bmN0KTsKCWFTdGF0ZU1hY2hpbmUuQWRkVG9rZW4oIi8qKiIsICAgICAgIG5Ub2tfbm9uZV9NTERvY3VCZWdpbiwgIEFfblB1bmN0RGVmU3RhdHVzLCAgICAgIGdvdG9NbGQpOwoJYVN0YXRlTWFjaGluZS5BZGRUb2tlbigiLy8vIiwJCW5Ub2tfbm9uZV9TTERvY3VCZWdpbiwgIEFfblB1bmN0RGVmU3RhdHVzLCAgICAgIGdvdG9TbGQpOwoJYVN0YXRlTWFjaGluZS5BZGRUb2tlbigiLyoiLCAgICAgICAgblRva19ub25lX01MQ29tbWVudEJlZ2luLAoJCQkJCQkJCQkJCQkJCQkJQV9uUHVuY3REZWZTdGF0dXMsICAgICAgZ290b01sYyk7CglhU3RhdGVNYWNoaW5lLkFkZFRva2VuKCIvLyIsICAgICAgICBuVG9rX25vbmVfU0xDb21tZW50QmVnaW4sCgkJCQkJCQkJCQkJCQkJCQlBX25QdW5jdERlZlN0YXR1cywgICAgICBnb3RvU2xjKTsKCWFTdGF0ZU1hY2hpbmUuQWRkVG9rZW4oIi8qKi8iLCAgICAgIG5Ub2tfaWdub3JlLCAgICAgICAgICAgIEFfblB1bmN0RGVmU3RhdHVzLCAgICAgIGZpbklnbik7CglhU3RhdGVNYWNoaW5lLkFkZFRva2VuKCIjIiwgICAgICAgICBuVG9rX25vbmVfUHJhZXByb2Nlc3NvckJlZ2luLAoJCQkJCQkJCQkJCQkJCQkJQV9uUHVuY3REZWZTdGF0dXMsICAgICAgZ290b1BycCk7CglhU3RhdGVNYWNoaW5lLkFkZFRva2VuKCJcclxuIiwgICAgICBuVG9rX0VPTCwgICAgICAgICAgICAgICBBX25QdW5jdERlZlN0YXR1cywgICAgICBmaW5FT0wpOwoJYVN0YXRlTWFjaGluZS5BZGRUb2tlbigiXHIiLCAgICAgICAgblRva19FT0wsICAgICAgICAgICAgICAgQV9uUHVuY3REZWZTdGF0dXMsICAgICAgZmluRU9MKTsKCWFTdGF0ZU1hY2hpbmUuQWRkVG9rZW4oIlxuIiwgICAgICAgIG5Ub2tfRU9MLCAgICAgICAgICAgICAgIEFfblB1bmN0RGVmU3RhdHVzLCAgICAgIGZpbkVPTCk7CglhU3RhdGVNYWNoaW5lLkFkZFRva2VuKCJcblxyIiwgICAgICBuVG9rX0VPTCwgICAgICAgICAgICAgICBBX25QdW5jdERlZlN0YXR1cywgICAgICBmaW5FT0wpOwp9OwoKCn0gICAvLyBuYW1lc3BhY2UgdWlkbAp9ICAgLy8gbmFtZXNwYWNlIGNzaQo=