LyoKICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCiAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAogKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCiAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCiAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqCiAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAqCiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAqLwpwYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5pbWFnaW5nLmljYzsKCnB1YmxpYyBlbnVtIEljY1RhZ1R5cGVzIGltcGxlbWVudHMgSWNjVGFnVHlwZSB7CiAgICBBX1RPX0IwX1RBRygiQVRvQjBUYWciLAogICAgICAgICAgICAibHV0OFR5cGUgb3IgbHV0MTZUeXBlIG9yIGx1dEF0b0JUeXBlIiwgMHg0MTMyNDIzMAogICAgLy8gICAgICAgICAgICAiVGhpcyB0YWcgZGVmaW5lcyBhIGNvbG9yIHRyYW5zZm9ybSBmcm9tIERldmljZSB0byBQQ1MgdXNpbmcgbG9va3VwIHRhYmxlIHRhZyBlbGVtZW50IHN0cnVjdHVyZXMuIFRoZSBwcm9jZXNzaW5nIG1lY2hhbmlzbXMgYXJlIGRlc2NyaWJlZCBpbiBsdXQ4VHlwZSBvciBsdXQxNlR5cGUgb3IgbHV0QXRvQlR5cGUuIik7CiAgICApLAoKICAgIC8vICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgSWNjVGFnVHlwZSBBVG9CMFRhZyA9IG5ldyBJY2NUYWdUeXBlKAogICAgLy8gICAgIkFUb0IwVGFnIiwKICAgIC8vICAgICJsdXQ4VHlwZSBvciBsdXQxNlR5cGUgb3IgbHV0QXRvQlR5cGUiLAogICAgLy8gICAgIpFBMkIwkiAoNDEzMjQyMzBoKSIsCiAgICAvLyAgICAiVGhpcyB0YWcgZGVmaW5lcyBhIGNvbG9yIHRyYW5zZm9ybSBmcm9tIERldmljZSB0byBQQ1MgdXNpbmcgbG9va3VwIHRhYmxlIHRhZyBlbGVtZW50IHN0cnVjdHVyZXMuIFRoZSBwcm9jZXNzaW5nIiwKICAgIC8vICAgICJtZWNoYW5pc21zIGFyZSBkZXNjcmliZWQgaW4gbHV0OFR5cGUgb3IgbHV0MTZUeXBlIG9yIGx1dEF0b0JUeXBlLiIsCiAgICAvLyAgICApOwoKICAgIEFfVE9fQjFfVEFHKCJBVG9CMVRhZyIsCiAgICAgICAgICAgICJsdXQ4VHlwZSBvciBsdXQxNlR5cGUgb3IgbHV0QXRvQlR5cGUiLCAweDQxMzI0MjMxCiAgICAvLyAgICAiVGhpcyB0YWcgZGVmaW5lcyBhIGNvbG9yIHRyYW5zZm9ybSBmcm9tIERldmljZSB0byBQQ1MgdXNpbmcgbG9va3VwIHRhYmxlIHRhZyBlbGVtZW50IHN0cnVjdHVyZXMuIFRoZSBwcm9jZXNzaW5nIiwKICAgIC8vICAgICJtZWNoYW5pc21zIGFyZSBkZXNjcmliZWQgaW4gbHV0OFR5cGUgb3IgbHV0MTZUeXBlIG9yIGx1dEF0b0JUeXBlLiIsCiAgICApLAoKICAgIEFfVE9fQjJfVEFHKCJBVG9CMlRhZyIsCiAgICAgICAgICAgICJsdXQ4VHlwZSBvciBsdXQxNlR5cGUgb3IgbHV0QXRvQlR5cGUiLCAweDQxMzI0MjMyCiAgICAvLyAgICAiVGhpcyB0YWcgZGVmaW5lcyBhIGNvbG9yIHRyYW5zZm9ybSBmcm9tIERldmljZSB0byBQQ1MgdXNpbmcgbG9va3VwIHRhYmxlIHRhZyBlbGVtZW50IHN0cnVjdHVyZXMuIFRoZSBwcm9jZXNzaW5nIiwKICAgIC8vICAgICJtZWNoYW5pc21zIGFyZSBkZXNjcmliZWQgaW4gbHV0OFR5cGUgb3IgbHV0MTZUeXBlIG9yIGx1dEF0b0JUeXBlLiIsCiAgICApLAoKICAgIEJMVUVfTUFUUklYX0NPTFVNTl9UQUcoCiAgICAgICAgICAgICJibHVlTWF0cml4Q29sdW1uVGFnIiwgIlhZWlR5cGUiLCAweDYyNTg1OTVBCiAgICAvLyAgICAiVGhlIHRoaXJkIGNvbHVtbiBpbiB0aGUgbWF0cml4IHVzZWQgaW4gVFJDL21hdHJpeCB0cmFuc2Zvcm1zLiIsCiAgICApLAoKICAgIEJMVUVfVFJDX1RBRygiYmx1ZVRSQ1RhZyIsCiAgICAgICAgICAgICJjdXJ2ZVR5cGUgb3IgcGFyYW1ldHJpY0N1cnZlVHlwZSIsIDB4NjI1NDUyNDMKICAgIC8vICAgICJCbHVlIGNoYW5uZWwgdG9uZSByZXByb2R1Y3Rpb24gY3VydmUuIFRoZSBmaXJzdCBlbGVtZW50IHJlcHJlc2VudHMgbm8gY29sb3JhbnQgKHdoaXRlKSBvciBwaG9zcGhvcnMiLAogICAgLy8gICAgIihibGFjaykgYW5kIHRoZSBsYXN0IGVsZW1lbnQgcmVwcmVzZW50cyAxMDAgcGVyY2VudCBjb2xvcmFudCAoYmx1ZSkgb3IgMTAwIHBlcmNlbnQgcGhvc3Bob3IgKGJsdWUpLiIsCiAgICApLAoKICAgIEJfVE9fQTBfVEFHKCJCVG9BMFRhZyIsCiAgICAgICAgICAgICJsdXQ4VHlwZSBvciBsdXQxNlR5cGUgb3IgbHV0QnRvQVR5cGUiLCAweDQyMzI0MTMwCiAgICAvLyAgICAiVGhpcyB0YWcgZGVmaW5lcyBhIGNvbG9yIHRyYW5zZm9ybSBmcm9tIFBDUyB0byBEZXZpY2UgdXNpbmcgdGhlIGxvb2t1cCB0YWJsZSB0YWcgZWxlbWVudCBzdHJ1Y3R1cmVzLiBUaGUiLAogICAgLy8gICAgInByb2Nlc3NpbmcgbWVjaGFuaXNtcyBhcmUgZGVzY3JpYmVkIGluIGx1dDhUeXBlIG9yIGx1dDE2VHlwZSBvciBsdXRCdG9BVHlwZS4iLAogICAgKSwKCiAgICBCX1RPX0ExX1RBRygiQlRvQTFUYWciLAogICAgICAgICAgICAibHV0OFR5cGUgb3IgbHV0MTZUeXBlIG9yIGx1dEJ0b0FUeXBlIiwgMHg0MjMyNDEzMQogICAgLy8gICAgIlRoaXMgdGFnIGRlZmluZXMgYSBjb2xvciB0cmFuc2Zvcm0gZnJvbSBQQ1MgdG8gRGV2aWNlIHVzaW5nIHRoZSBsb29rdXAgdGFibGUgdGFnIGVsZW1lbnQgc3RydWN0dXJlcy4gVGhlIiwKICAgIC8vICAgICJwcm9jZXNzaW5nIG1lY2hhbmlzbXMgYXJlIGRlc2NyaWJlZCBpbiBsdXQ4VHlwZSBvciBsdXQxNlR5cGUgb3IgbHV0QnRvQVR5cGUuIiwKICAgICksCgogICAgQl9UT19BMl9UQUcoIkJUb0EyVGFnIiwKICAgICAgICAgICAgImx1dDhUeXBlIG9yIGx1dDE2VHlwZSBvciBsdXRCdG9BVHlwZSIsIDB4NDIzMjQxMzIKICAgIC8vICAgICJUaGlzIHRhZyBkZWZpbmVzIGEgY29sb3IgdHJhbnNmb3JtIGZyb20gUENTIHRvIERldmljZSB1c2luZyB0aGUgbG9va3VwIHRhYmxlIHRhZyBlbGVtZW50IHN0cnVjdHVyZXMuIFRoZSIsCiAgICAvLyAgICAicHJvY2Vzc2luZyBtZWNoYW5pc21zIGFyZSBkZXNjcmliZWQgaW4gbHV0OFR5cGUgb3IgbHV0MTZUeXBlIG9yIGx1dEJ0b0FUeXBlLiIsCiAgICApLAoKICAgIENBTElCUkFUSU9OX0RBVEVfVElNRV9UQUcoCiAgICAgICAgICAgICJjYWxpYnJhdGlvbkRhdGVUaW1lVGFnIiwgImRhdGVUaW1lVHlwZSIsIDB4NjM2MTZDNzQKICAgIC8vICAgICJQcm9maWxlIGNhbGlicmF0aW9uIGRhdGUgYW5kIHRpbWUuIEluaXRpYWxseSwgdGhpcyB0YWcgbWF0Y2hlcyB0aGUgY29udGVudHMgb2YgdGhlIHByb2ZpbGUgaGVhZGVyknMgY3JlYXRpb24iLAogICAgLy8gICAgImRhdGUvdGltZSBmaWVsZC4gVGhpcyBhbGxvd3MgYXBwbGljYXRpb25zIGFuZCB1dGlsaXRpZXMgdG8gdmVyaWZ5IGlmIHRoaXMgcHJvZmlsZSBtYXRjaGVzIGEgdmVuZG9yknMgcHJvZmlsZSBhbmQiLAogICAgLy8gICAgImhvdyByZWNlbnRseSBjYWxpYnJhdGlvbiBoYXMgYmVlbiBwZXJmb3JtZWQuIiwKICAgICksCgogICAgQ0hBUl9UQVJHRVRfVEFHKAogICAgICAgICAgICAiY2hhclRhcmdldFRhZyIsICJ0ZXh0VHlwZSIsIDB4NzQ2MTcyNjcKICAgIC8vICAgICJUaGlzIHRhZyBjb250YWlucyB0aGUgbmFtZSBvZiB0aGUgcmVnaXN0ZXJlZCBjaGFyYWN0ZXJpemF0aW9uIGRhdGEgc2V0LCBvciBpdCBjb250YWlucyB0aGUgbWVhc3VyZW1lbnQgZGF0YSIsCiAgICAvLyAgICAiZm9yIGEgY2hhcmFjdGVyaXphdGlvbiB0YXJnZXQuIFRoaXMgdGFnIGlzIHByb3ZpZGVkIHNvIHRoYXQgZGlzdHJpYnV0ZWQgdXRpbGl0aWVzIGNhbiBpZGVudGlmeSB0aGUgdW5kZXJseWluZyIsCiAgICAvLyAgICAiY2hhcmFjdGVyaXphdGlvbiBkYXRhLCBjcmVhdGUgdHJhbnNmb3JtcyBcIm9uIHRoZSBmbHlcIiBvciBjaGVjayB0aGUgY3VycmVudCBwZXJmb3JtYW5jZSBhZ2FpbnN0IHRoZSBvcmlnaW5hbCIsCiAgICAvLyAgICAiZGV2aWNlIHBlcmZvcm1hbmNlLiIsCiAgICAvLyAgICAiVGhlIGZpcnN0IHNldmVuIGNoYXJhY3RlcnMgb2YgdGhlIHRleHQgc2hhbGwgaWRlbnRpZnkgdGhlIG5hdHVyZSBvZiB0aGUgY2hhcmFjdGVyaXphdGlvbiBkYXRhLiIsCiAgICAvLyAgICAiSWYgdGhlIGZpcnN0IHNldmVuIGNoYXJhY3RlcnMgYXJlIFwiSUNDSERBVFwiLCB0aGVuIHRoZSByZW1haW5kZXIgb2YgdGhlIHRleHQgc2hhbGwgYmUgYSBzaW5nbGUgc3BhY2UgZm9sbG93ZWQiLAogICAgLy8gICAgImJ5IHRoZSBSZWZlcmVuY2UgTmFtZSBvZiBhIGNoYXJhY3Rlcml6YXRpb24gZGF0YSBzZXQgaW4gdGhlIElDQyBDaGFyYWN0ZXJpemF0aW9uIERhdGEgUmVnaXN0cnkgYW5kIHRlcm1pbmF0ZWQiLAogICAgLy8gICAgIndpdGggYSBOVUxMIGJ5dGUgKDAwaCkuIFRoZSBSZWZlcmVuY2UgTmFtZSBpbiB0aGUgdGV4dCBtdXN0IG1hdGNoIGV4YWN0bHkgKGluY2x1ZGluZyBjYXNlKSB0aGUiLAogICAgLy8gICAgIlJlZmVyZW5jZSBOYW1lIGluIHRoZSByZWdpc3RyeS4iLAogICAgLy8gICAgIklmIHRoZSBmaXJzdCBzZXZlbiBjaGFyYWN0ZXJzIG1hdGNoIG9uZSBvZiB0aGUgaWRlbnRpZmllcnMgZGVmaW5lZCBpbiBhbiBBTlNJIG9yIElTTyBzdGFuZGFyZCwgdGhlbiB0aGUgdGFnIiwKICAgIC8vICAgICJlbWJlZHMgdGhlIGV4YWN0IGRhdGEgZmlsZSBmb3JtYXQgZGVmaW5lZCBpbiB0aGF0IHN0YW5kYXJkLiBFYWNoIG9mIHRoZXNlIGZpbGUgZm9ybWF0cyBjb250YWlucyBhbiBpZGVudGlmeWluZyIsCiAgICAvLyAgICAiY2hhcmFjdGVyIHN0cmluZyBhcyB0aGUgZmlyc3Qgc2V2ZW4gY2hhcmFjdGVycyBvZiB0aGUgZm9ybWF0LCBhbGxvd2luZyBhbiBleHRlcm5hbCBwYXJzZXIgdG8gZGV0ZXJtaW5lIiwKICAgIC8vICAgICJ3aGljaCBkYXRhIGZpbGUgZm9ybWF0IGlzIGJlaW5nIHVzZWQuIFRoaXMgcHJvdmlkZXMgdGhlIGZhY2lsaXRpZXMgdG8gaW5jbHVkZSBhIHdpZGUgcmFuZ2Ugb2YgdGFyZ2V0cyB1c2luZyBhIiwKICAgIC8vICAgICJ2YXJpZXR5IG9mIG1lYXN1cmVtZW50IHNwZWNpZmljYXRpb25zIGluIGEgc3RhbmRhcmQgbWFubmVyLiIsCiAgICAvLyAgICAiTk9URTogSXQgaXMgaGlnaGx5IHJlY29tbWVuZGVkIHRoYXQgdGhlIHByb2ZpbGVEZXNjcmlwdGlvblRhZyBhbHNvIGluY2x1ZGUgYW4gaWRlbnRpZmljYXRpb24gb2YgdGhlIGNoYXJhY3Rlcml6YXRpb24iLAogICAgLy8gICAgImRhdGEgdGhhdCB3YXMgdXNlZCBpbiB0aGUgY3JlYXRpb24gb2YgdGhlIHByb2ZpbGUgKGUuZy4gXCJCYXNlZCBvbiBDR0FUUyBUUiAwMDFcIikuIiwKICAgICksCgogICAgQ0hST01BVElDX0FEQVBUQVRJT05fVEFHKAogICAgICAgICAgICAiY2hyb21hdGljQWRhcHRhdGlvblRhZyIsICJzMTVGaXhlZDE2QXJyYXlUeXBlIiwgMHg2MzY4NjE2NAogICAgLy8gICAgIlRoaXMgdGFnIGNvbnZlcnRzIGFuIFhZWiBjb2xvciwgbWVhc3VyZWQgYXQgYSBkZXZpY2UncyBzcGVjaWZpYyBpbGx1bWluYXRpb24gY29uZGl0aW9ucywgdG8gYW4gWFlaIGNvbG9yIGluIiwKICAgIC8vICAgICJ0aGUgUENTIGlsbHVtaW5hdGlvbiBjb25kaXRpb25zIGFmdGVyIGNvbXBsZXRlIGFkYXB0YXRpb24uIiwKICAgIC8vICAgICJUaGUgdGFnIHJlZmxlY3RzIGEgc3VydmV5IG9mIHRoZSBjdXJyZW50bHkgdXNlZCBtZXRob2RzIG9mIGNvbnZlcnNpb24sIGFsbCBvZiB3aGljaCBjYW4gYmUgZm9ybXVsYXRlZCBhcyBhIiwKICAgIC8vICAgICJtYXRyaXggdHJhbnNmb3JtYXRpb24gKHNlZSBBbm5leCBFKS4gU3VjaCBhIDMgYnkgMyBjaHJvbWF0aWMgYWRhcHRhdGlvbiBtYXRyaXggaXMgb3JnYW5pemVkIGFzIGEgOS1lbGVtZW50IiwKICAgIC8vICAgICJhcnJheSBvZiBzaWduZWQgMTUuMTYgbnVtYmVycyAoczE1Rml4ZWQxNkFycmF5VHlwZSB0YWcpLiBTaW1pbGFybHkgYXMgaW4gdGhlIG90aGVyIG9jY3VycmVuY2VzIG9mIGEiLAogICAgLy8gICAgIjMgYnkgMyBtYXRyaXggaW4gdGhlIElDQyB0YWdzLCB0aGUgZGltZW5zaW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhlIG1hdHJpeCByb3dzIHZhcmllcyBsZWFzdCByYXBpZGx5IHdoaWxlIHRoZSIsCiAgICAvLyAgICAib25lIGNvcnJlc3BvbmRpbmcgdG8gdGhlIG1hdHJpeCBjb2x1bW5zIHZhcmllcyBtb3N0IHJhcGlkbHkuIiwKICAgIC8vICAgICIoMTkpIiwKICAgIC8vICAgICIoMjApIiwKICAgIC8vICAgICJhcnJheSBhMCBhMSBhMiBhMyBhNCBhNSBhNiBhNyBhOCA9IiwKICAgIC8vICAgICJYcGNzIiwKICAgIC8vICAgICJZcGNzIiwKICAgIC8vICAgICJacGNzIiwKICAgIC8vICAgICJhMCBhMSBhMiIsCiAgICAvLyAgICAiYTMgYTQgYTUiLAogICAgLy8gICAgImE2IGE3IGE4IiwKICAgIC8vICAgICJYc3JjIiwKICAgIC8vICAgICJZc3JjIiwKICAgIC8vICAgICJac3JjIiwKICAgIC8vICAgICI9IiwKICAgIC8vICAgICJXaGVyZSBYWVpzcmMgcmVwcmVzZW50cyB0aGUgbWVhc3VyZWQgdmFsdWUgaW4gdGhlIGFjdHVhbCBkZXZpY2Ugdmlld2luZyBjb25kaXRpb24gYW5kIFhZWnBjcyByZXByZXNlbnRzIiwKICAgIC8vICAgICJ0aGUgY2hyb21hdGljYWxseSBhZGFwdGVkIHZhbHVlIGluIHRoZSBQQ1MuIiwKICAgIC8vICAgICJUaGUgY2hyb21hdGljIGFkYXB0YXRpb24gbWF0cml4IGlzIGEgY29tYmluYXRpb24gb2YgdGhyZWUgc2VwYXJhdGUgY29udmVyc2lvbnM6IiwKICAgIC8vICAgICIxKSBDb252ZXJzaW9uIG9mIHNvdXJjZSBDSUUgWFlaIHRyaXN0aW11bHVzIHZhbHVlcyB0byBjb25lIHJlc3BvbnNlIHRyaXN0aW11bHVzIHZhbHVlcy4iLAogICAgLy8gICAgIjIpIEFkanVzdG1lbnQgb2YgdGhlIGNvbmUgcmVzcG9uc2UgdmFsdWVzIGZvciBhbiBvYnNlcnZlcpJzIGNocm9tYXRpYyBhZGFwdGF0aW9uLiIsCiAgICAvLyAgICAiMykgQ29udmVyc2lvbiBvZiB0aGUgYWRqdXN0ZWQgY29uZSByZXNwb25zZSB0cmlzdGltdWx1cyBiYWNrIHRvIENJRSBYWVogdmFsdWVzLiIsCiAgICApLAoKICAgIENIUk9NQVRJQ0lUWV9UQUcoCiAgICAgICAgICAgICJjaHJvbWF0aWNpdHlUYWciLCAiY2hyb21hdGljaXR5VHlwZSIsIDB4NjM2ODcyNkQKICAgIC8vICAgICJUaGUgZGF0YSBhbmQgdHlwZSBvZiBwaG9zcGhvci9jb2xvcmFudCBjaHJvbWF0aWNpdHkgc2V0LiIsCiAgICApLAoKICAgIENPTE9SQU5UX09SREVSX1RBRygKICAgICAgICAgICAgImNvbG9yYW50T3JkZXJUYWciLCAiY29sb3JhbnRPcmRlclR5cGUiLCAweDYzNkM3MjZGCiAgICAvLyAgICAiVGhpcyB0YWcgc3BlY2lmaWVzIHRoZSBsYXlkb3duIG9yZGVyIG9mIGNvbG9yYW50cy4iLAogICAgKSwKCiAgICBDT0xPUkFOVF9UQUJMRV9UQUcoCiAgICAgICAgICAgICJjb2xvcmFudFRhYmxlVGFnIiwgImNvbG9yYW50VGFibGVUeXBlIiwgMHg2MzZDNzI3NAogICAgLy8gICAgIlRoaXMgdGFnIGlkZW50aWZpZXMgdGhlIGNvbG9yYW50cyB1c2VkIGluIHRoZSBwcm9maWxlIGJ5IGEgdW5pcXVlIG5hbWUgYW5kIGFuIFhZWiBvciBMKmEqYiogdmFsdWUuIiwKICAgIC8vICAgICJUaGlzIGlzIGEgcmVxdWlyZWQgdGFnIGZvciBwcm9maWxlcyB3aGVyZSB0aGUgY29sb3Igc3BhY2UgZGVmaW5lZCBpbiB0aGUgaGVhZGVyIGlzIHhDTFIsIHdoZXJlIHggaXMgb25lIG9mIiwKICAgIC8vICAgICJ0aGUgYWxsb3dlZCBudW1iZXJzIGZyb20gMiB0aHJvdWdoIEZoLCBwZXIgVGFibGUgMTMuIFNlZSBTZWN0aW9uIDYuMy4zLjIsIFNlY3Rpb24gNi4zLjQuMS4iLAogICAgKSwKCiAgICBDT1BZUklHSFRfVEFHKAogICAgICAgICAgICAiY29weXJpZ2h0VGFnIiwgIm11bHRpTG9jYWxpemVkVW5pY29kZVR5cGUiLCAweDYzNzA3Mjc0CiAgICAvLyAgICAiVGhpcyB0YWcgY29udGFpbnMgdGhlIHRleHQgY29weXJpZ2h0IGluZm9ybWF0aW9uIGZvciB0aGUgcHJvZmlsZS4iLAogICAgKSwKCiAgICBERVZJQ0VfTUZHX0RFU0NfVEFHKAogICAgICAgICAgICAiZGV2aWNlTWZnRGVzY1RhZyIsICJtdWx0aUxvY2FsaXplZFVuaWNvZGVUeXBlIiwgMHg2NDZENkU2NAogICAgLy8gICAgIlN0cnVjdHVyZSBjb250YWluaW5nIGludmFyaWFudCBhbmQgbG9jYWxpemFibGUgdmVyc2lvbnMgb2YgdGhlIGRldmljZSBtYW51ZmFjdHVyZXIgZm9yIGRpc3BsYXkuIFRoZSBjb250ZW50IiwKICAgIC8vICAgICJvZiB0aGlzIHN0cnVjdHVyZSBpcyBkZXNjcmliZWQgaW4gNi41LjEyLiIsCiAgICApLAoKICAgIERFVklDRV9NT0RFTF9ERVNDX1RBRygKICAgICAgICAgICAgImRldmljZU1vZGVsRGVzY1RhZyIsICJtdWx0aUxvY2FsaXplZFVuaWNvZGVUeXBlIiwgMHg2NDZENjQ2NAogICAgLy8gICAgIlN0cnVjdHVyZSBjb250YWluaW5nIGludmFyaWFudCBhbmQgbG9jYWxpemFibGUgdmVyc2lvbnMgb2YgdGhlIGRldmljZSBtb2RlbCBmb3IgZGlzcGxheS4gVGhlIGNvbnRlbnQgb2YgdGhpcyIsCiAgICAvLyAgICAic3RydWN0dXJlIGlzIGRlc2NyaWJlZCBpbiA2LjUuMTIuIiwKICAgICksCgogICAgR0FNVVRfVEFHKCJnYW11dFRhZyIsCiAgICAgICAgICAgICJsdXQ4VHlwZSBvciBsdXQxNlR5cGUgb3IgbHV0QnRvQVR5cGUiLCAweDY3NjE2RDc0CiAgICAvLyAgICAiT3V0IG9mIGdhbXV0IHRhZy4gVGhlIHByb2Nlc3NpbmcgbWVjaGFuaXNtcyBhcmUgZGVzY3JpYmVkIGluIGx1dDhUeXBlIG9yIGx1dDE2VHlwZSBvciBsdXRCdG9BVHlwZS4iLAogICAgLy8gICAgIlRoaXMgdGFnIHRha2VzIFBDUyB2YWx1ZXMgYXMgaXRzIGlucHV0IGFuZCBwcm9kdWNlcyBhIHNpbmdsZSBjaGFubmVsIG9mIG91dHB1dC4gSWYgdGhlIG91dHB1dCB2YWx1ZSBpcyAwLCB0aGUiLAogICAgLy8gICAgIlBDUyBjb2xvciBpcyBpbi1nYW11dC4gSWYgdGhlIG91dHB1dCBpcyBub24temVybywgdGhlIFBDUyBjb2xvciBpcyBvdXQtb2YtZ2FtdXQsIHdpdGggdGhlIG91dHB1dCB2YWx1ZSCTbisxlCIsCiAgICAvLyAgICAiYmVpbmcgYXQgbGVhc3QgYXMgZmFyIG91dCBvZiBnYW11dCBhcyB0aGUgb3V0cHV0IHZhbHVlIJNulC4iLAogICAgKSwKCiAgICBHUkFZX1RSQ19UQUcoImdyYXlUUkNUYWciLAogICAgICAgICAgICAiY3VydmVUeXBlIG9yIHBhcmFtZXRyaWNDdXJ2ZVR5cGUiLCAweDZCNTQ1MjQzCiAgICAvLyAgICAiR3JheSB0b25lIHJlcHJvZHVjdGlvbiBjdXJ2ZS4gVGhlIHRvbmUgcmVwcm9kdWN0aW9uIGN1cnZlIHByb3ZpZGVzIHRoZSBuZWNlc3NhcnkgaW5mb3JtYXRpb24gdG8gY29udmVydCIsCiAgICAvLyAgICAiYmV0d2VlbiBhIHNpbmdsZSBkZXZpY2UgY2hhbm5lbCBhbmQgdGhlIENJRVhZWiBlbmNvZGluZyBvZiB0aGUgcHJvZmlsZSBjb25uZWN0aW9uIHNwYWNlLiBUaGUgZmlyc3QgZWxlbWVudCIsCiAgICAvLyAgICAicmVwcmVzZW50cyBibGFjayBhbmQgdGhlIGxhc3QgZWxlbWVudCByZXByZXNlbnRzIHdoaXRlLiIsCiAgICApLAoKICAgIEdSRUVOX01BVFJJWF9DT0xVTU5fVEFHKAogICAgICAgICAgICAiZ3JlZW5NYXRyaXhDb2x1bW5UYWciLCAiWFlaVHlwZSIsIDB4Njc1ODU5NUEKICAgIC8vICAgICJUaGUgc2Vjb25kIGNvbHVtbiBpbiB0aGUgbWF0cml4IHVzZWQgaW4gVFJDL21hdHJpeCB0cmFuc2Zvcm1zLiIsCiAgICApLAoKICAgIEdSRUVOX1RSQ19UQUcoCiAgICAvLyAgICAiNi40LjIxICIsCiAgICAgICAgICAgICJncmVlblRSQ1RhZyIsICJjdXJ2ZVR5cGUgb3IgcGFyYW1ldHJpY0N1cnZlVHlwZSIsIDB4Njc1NDUyNDMKICAgIC8vICAgICJHcmVlbiBjaGFubmVsIHRvbmUgcmVwcm9kdWN0aW9uIGN1cnZlLiBUaGUgZmlyc3QgZWxlbWVudCByZXByZXNlbnRzIG5vIGNvbG9yYW50ICh3aGl0ZSkgb3IgcGhvc3Bob3JzIiwKICAgIC8vICAgICIoYmxhY2spIGFuZCB0aGUgbGFzdCBlbGVtZW50IHJlcHJlc2VudHMgMTAwIHBlcmNlbnQgY29sb3JhbnQgKGdyZWVuKSBvciAxMDAgcGVyY2VudCBwaG9zcGhvciAoZ3JlZW4pLiIsCiAgICApLAoKICAgIExVTUlOQU5DRV9UQUcoCiAgICAvLyAgICAiNi40LjIyICIsCiAgICAgICAgICAgICJsdW1pbmFuY2VUYWciLCAiWFlaVHlwZSIsIDB4NkM3NTZENjkKICAgIC8vICAgICJBYnNvbHV0ZSBsdW1pbmFuY2Ugb2YgZW1pc3NpdmUgZGV2aWNlcyBpbiBjYW5kZWxhcyBwZXIgc3F1YXJlIG1ldGVyIGFzIGRlc2NyaWJlZCBieSB0aGUgWSBjaGFubmVsLiBUaGUiLAogICAgLy8gICAgIlggYW5kIFogY2hhbm5lbHMgYXJlIGlnbm9yZWQgaW4gYWxsIGNhc2VzLiIsCiAgICApLAoKICAgIE1FQVNVUkVNRU5UX1RBRygKICAgIC8vICAgICI2LjQuMjMgIiwKICAgICAgICAgICAgIm1lYXN1cmVtZW50VGFnIiwgIm1lYXN1cmVtZW50VHlwZSIsIDB4NkQ2NTYxNzMKICAgIC8vICAgICJBbHRlcm5hdGl2ZSBtZWFzdXJlbWVudCBzcGVjaWZpY2F0aW9uIHN1Y2ggYXMgYSBENjUgaWxsdW1pbmFudCBpbnN0ZWFkIG9mIHRoZSBkZWZhdWx0IEQ1MC4iLAogICAgKSwKCiAgICBNRURJQV9CTEFDS19QT0lOVF9UQUcoCiAgICAvLyAgICAiNi40LjI0ICIsCiAgICAgICAgICAgICJtZWRpYUJsYWNrUG9pbnRUYWciLCAiWFlaVHlwZSIsIDB4NjI2QjcwNzQKICAgIC8vICAgICJUaGlzIHRhZyBzcGVjaWZpZXMgdGhlIG1lZGlhIGJsYWNrIHBvaW50IGFuZCBjb250YWlucyB0aGUgQ0lFIDE5MzEgWFlaIGNvbG9yaW1ldHJ5IG9mIHRoZSBibGFjayBwb2ludCBvZiIsCiAgICAvLyAgICAidGhlIGFjdHVhbCBtZWRpdW0uIiwKICAgIC8vICAgICJOT1RFIFByZXZpb3VzIHJldmlzaW9ucyBvZiB0aGlzIHNwZWNpZmljYXRpb24gY29udGFpbmVkIGFuIGVycm9yIGluZGljYXRpbmcgdGhhdCB0aGlzIHRhZyBpcyB1c2VkIHRvIGNhbGN1bGF0ZSIsCiAgICAvLyAgICAiSUNDLWFic29sdXRlIGNvbG9yaW1ldHJ5LiBUaGlzIGlzIG5vdCB0aGUgY2FzZS4iLAogICAgKSwKCiAgICBNRURJQV9XSElURV9QT0lOVF9UQUcoCiAgICAvLyAgICAiNi40LjI1ICIsCiAgICAgICAgICAgICJtZWRpYVdoaXRlUG9pbnRUYWciLCAiWFlaVHlwZSIsIDB4Nzc3NDcwNzQKICAgIC8vICAgICJUaGlzIHRhZywgd2hpY2ggaXMgdXNlZCBmb3IgZ2VuZXJhdGluZyBJQ0MtYWJzb2x1dGUgY29sb3JpbWV0cmljIGludGVudCwgc3BlY2lmaWVzIHRoZSBYWVogdHJpc3RpbXVsdXMgdmFsdWVzIiwKICAgIC8vICAgICJvZiB0aGUgbWVkaWEgd2hpdGUgcG9pbnQuIElmIHRoZSBtZWRpYSBpcyBtZWFzdXJlZCB1bmRlciBhbiBpbGx1bWluYXRpb24gc291cmNlIHdoaWNoIGhhcyBhIGNocm9tYXRpY2l0eSIsCiAgICAvLyAgICAib3RoZXIgdGhhbiBENTAsIHRoZSBtZWFzdXJlZCB2YWx1ZXMgbXVzdCBiZSBhZGp1c3RlZCB0byBENTAgdXNpbmcgdGhlIGNocm9tYXRpY0FkYXB0YXRpb25UYWcgbWF0cml4IiwKICAgIC8vICAgICJiZWZvcmUgcmVjb3JkaW5nIGluIHRoZSB0YWcuIEZvciByZWZsZWN0aW5nIGFuZCB0cmFuc21pdHRpbmcgbWVkaWEsIHRoZSB0YWcgdmFsdWVzIGFyZSBzcGVjaWZpZWQgcmVsYXRpdmUgdG8iLAogICAgLy8gICAgInRoZSBwZXJmZWN0IGRpZmZ1c2VyICh3aGljaCBpcyBub3JtYWxpemVkIHRvIGEgWSB2YWx1ZSBvZiAxLDApIGZvciBpbGx1bWluYW50IEQ1MC4gRm9yIGRpc3BsYXlzLCB0aGUgdmFsdWVzIiwKICAgIC8vICAgICJzcGVjaWZpZWQgbXVzdCBiZSB0aG9zZSBvZiBENTAgKGkuZS4gMCw5NjQyLCAxLDAgMCw4MjQ5KSBub3JtYWxpemVkIHN1Y2ggdGhhdCBZID0gMSwwLiIsCiAgICAvLyAgICAiU2VlIEFubmV4IEEgZm9yIGEgbW9yZSBjb21wbGV0ZSBkZXNjcmlwdGlvbiBvZiB0aGUgdXNlIG9mIHRoZSBtZWRpYSB3aGl0ZSBwb2ludC4iLAogICAgKSwKCiAgICBOQU1FRF9DT0xPUl8yX1RBRygKICAgIC8vICAgICI2LjQuMjYgIiwKICAgICAgICAgICAgIm5hbWVkQ29sb3IyVGFnIiwgIm5hbWVkQ29sb3IyVHlwZSIsIDB4NkU2MzZDMzIKICAgIC8vICAgICJOYW1lZCBjb2xvciBpbmZvcm1hdGlvbiBwcm92aWRpbmcgYSBQQ1MgYW5kIG9wdGlvbmFsIGRldmljZSByZXByZXNlbnRhdGlvbiBmb3IgYSBsaXN0IG9mIG5hbWVkIGNvbG9ycy4iLAogICAgKSwKCiAgICBPVVRQVVRfUkVTUE9OU0VfVEFHKAogICAgLy8gICAgIjYuNC4yNyAiLAogICAgICAgICAgICAib3V0cHV0UmVzcG9uc2VUYWciLCAicmVzcG9uc2VDdXJ2ZVNldDE2VHlwZSIsIDB4NzI2NTczNzAKICAgIC8vICAgICJTdHJ1Y3R1cmUgY29udGFpbmluZyBhIGRlc2NyaXB0aW9uIG9mIHRoZSBkZXZpY2UgcmVzcG9uc2UgZm9yIHdoaWNoIHRoZSBwcm9maWxlIGlzIGludGVuZGVkLiBUaGUgY29udGVudCBvZiIsCiAgICAvLyAgICAidGhpcyBzdHJ1Y3R1cmUgaXMgZGVzY3JpYmVkIGluIDYuNS4xNi4iLAogICAgLy8gICAgIk5PVEUgVGhlIHVzZXKScyBhdHRlbnRpb24gaXMgY2FsbGVkIHRvIHRoZSBwb3NzaWJpbGl0eSB0aGF0IHRoZSB1c2Ugb2YgdGhpcyB0YWcgZm9yIGRldmljZSBjYWxpYnJhdGlvbiBtYXkiLAogICAgLy8gICAgInJlcXVpcmUgdXNlIG9mIGFuIGludmVudGlvbiBjb3ZlcmVkIGJ5IHBhdGVudCByaWdodHMuIEJ5IHB1YmxpY2F0aW9uIG9mIHRoaXMgc3BlY2lmaWNhdGlvbiwgbm8gcG9zaXRpb24gaXMiLAogICAgLy8gICAgInRha2VuIHdpdGggcmVzcGVjdCB0byB0aGUgdmFsaWRpdHkgb2YgdGhpcyBjbGFpbSBvciBvZiBhbnkgcGF0ZW50IHJpZ2h0cyBpbiBjb25uZWN0aW9uIHRoZXJld2l0aC4gVGhlIHBhdGVudCIsCiAgICAvLyAgICAiaG9sZGVyIGhhcywgaG93ZXZlciwgZmlsZWQgYSBzdGF0ZW1lbnQgb2Ygd2lsbGluZ25lc3MgdG8gZ3JhbnQgYSBsaWNlbnNlIHVuZGVyIHRoZXNlIHJpZ2h0cyBvbiByZWFzb25hYmxlIiwKICAgIC8vICAgICJhbmQgbm9uZGlzY3JpbWluYXRvcnkgdGVybXMgYW5kIGNvbmRpdGlvbnMgdG8gYXBwbGljYW50cyBkZXNpcmluZyB0byBvYnRhaW4gc3VjaCBhIGxpY2Vuc2UuIERldGFpbHMgbWF5IGJlIiwKICAgIC8vICAgICJvYnRhaW5lZCBmcm9tIHRoZSBwdWJsaXNoZXIuIiwKICAgICksCgogICAgUFJFVklFV18wX1RBRygKICAgIC8vICAgICI2LjQuMjggIiwKICAgICAgICAgICAgInByZXZpZXcwVGFnIiwgImx1dDhUeXBlIG9yIGx1dDE2VHlwZSBvciBsdXRCdG9BVHlwZSIsIDB4NzA3MjY1MzAKICAgIC8vICAgICJQcmV2aWV3IHRyYW5zZm9ybWF0aW9uIGZyb20gUENTIHRvIGRldmljZSBzcGFjZSBhbmQgYmFjayB0byB0aGUgUENTLiBUaGUgcHJvY2Vzc2luZyBtZWNoYW5pc21zIGFyZSIsCiAgICAvLyAgICAiZGVzY3JpYmVkIGluIGx1dDhUeXBlIG9yIGx1dDE2VHlwZSBvciBsdXRCdG9BVHlwZS4iLAogICAgLy8gICAgIlRoaXMgdGFnIGNvbnRhaW5zIHRoZSBjb21iaW5hdGlvbiBvZiB0YWcgQjJBMCBhbmQgdGFnIEEyQjEuIiwKICAgICksCgogICAgUFJFVklFV18xX1RBRygKICAgIC8vICAgICI2LjQuMjkgIiwKICAgICAgICAgICAgInByZXZpZXcxVGFnIiwgImx1dDhUeXBlIG9yIGx1dDE2VHlwZSBvciBsdXRCdG9BVHlwZSIsIDB4NzA3MjY1MzEKICAgIC8vICAgICJQcmV2aWV3IHRyYW5zZm9ybWF0aW9uIGZyb20gdGhlIFBDUyB0byBkZXZpY2Ugc3BhY2UgYW5kIGJhY2sgdG8gdGhlIFBDUy4gVGhlIHByb2Nlc3NpbmcgbWVjaGFuaXNtcyIsCiAgICAvLyAgICAiYXJlIGRlc2NyaWJlZCBpbiBsdXQ4VHlwZSBvciBsdXQxNlR5cGUgb3IgbHV0QnRvQVR5cGUuIiwKICAgIC8vICAgICJUaGlzIHRhZyBjb250YWlucyB0aGUgY29tYmluYXRpb24gb2YgdGFnIEIyQTEgYW5kIHRhZyBBMkIxLiIsCiAgICApLAoKICAgIFBSRVZJRVdfMl9UQUcoCiAgICAvLyAgICAiNi40LjMwICIsCiAgICAgICAgICAgICJwcmV2aWV3MlRhZyIsICJsdXQ4VHlwZSBvciBsdXQxNlR5cGUgb3IgbHV0QnRvQVR5cGUiLCAweDcwNzI2NTMyCiAgICAvLyAgICAiUHJldmlldyB0cmFuc2Zvcm1hdGlvbiBmcm9tIFBDUyB0byBkZXZpY2Ugc3BhY2UgYW5kIGJhY2sgdG8gdGhlIFBDUy4gVGhlIHByb2Nlc3NpbmcgbWVjaGFuaXNtcyBhcmUiLAogICAgLy8gICAgImRlc2NyaWJlZCBpbiBsdXQ4VHlwZSBvciBsdXQxNlR5cGUgb3IgbHV0QnRvQVR5cGUuIiwKICAgIC8vICAgICJUaGlzIHRhZyBjb250YWlucyB0aGUgY29tYmluYXRpb24gb2YgdGFnIEIyQTIgYW5kIHRhZyBBMkIxLiIsCiAgICApLAoKICAgIFBST0ZJTEVfREVTQ1JJUFRJT05fVEFHKAogICAgLy8gICAgIjYuNC4zMSAiLAogICAgICAgICAgICAicHJvZmlsZURlc2NyaXB0aW9uVGFnIiwgIm11bHRpTG9jYWxpemVkVW5pY29kZVR5cGUiLCAweDY0NjU3MzYzCiAgICAvLyAgICAiU3RydWN0dXJlIGNvbnRhaW5pbmcgaW52YXJpYW50IGFuZCBsb2NhbGl6YWJsZSB2ZXJzaW9ucyBvZiB0aGUgcHJvZmlsZSBkZXNjcmlwdGlvbiBmb3IgZGlzcGxheS4gVGhlIGNvbnRlbnQgb2YiLAogICAgLy8gICAgInRoaXMgc3RydWN0dXJlIGlzIGRlc2NyaWJlZCBpbiA2LjUuMTIuIFRoaXMgaW52YXJpYW50IGRlc2NyaXB0aW9uIGhhcyBubyBmaXhlZCByZWxhdGlvbnNoaXAgdG8gdGhlIGFjdHVhbCBwcm9maWxlIiwKICAgIC8vICAgICJkaXNrIGZpbGUgbmFtZS4iLAogICAgKSwKCiAgICBQUk9GSUxFX1NFUVVFTkNFX0RFU0NfVEFHKAogICAgLy8gICAgIjYuNC4zMiAiLAogICAgICAgICAgICAicHJvZmlsZVNlcXVlbmNlRGVzY1RhZyIsICJwcm9maWxlU2VxdWVuY2VEZXNjVHlwZSIsIDB4NzA3MzY1NzEKICAgIC8vICAgICJTdHJ1Y3R1cmUgY29udGFpbmluZyBhIGRlc2NyaXB0aW9uIG9mIHRoZSBwcm9maWxlIHNlcXVlbmNlIGZyb20gc291cmNlIHRvIGRlc3RpbmF0aW9uLCB0eXBpY2FsbHkgdXNlZCB3aXRoIiwKICAgIC8vICAgICJ0aGUgRGV2aWNlTGluayBwcm9maWxlLiBUaGUgY29udGVudCBvZiB0aGlzIHN0cnVjdHVyZSBpcyBkZXNjcmliZWQgaW4gNi41LjE1LiIsCiAgICApLAoKICAgIFJFRF9NQVRSSVhfQ09MVU1OX1RBRygKICAgIC8vICAgICI2LjQuMzMgIiwKICAgICAgICAgICAgInJlZE1hdHJpeENvbHVtblRhZyIsICJYWVpUeXBlIiwgMHg3MjU4NTk1QQogICAgLy8gICAgIlRoZSBmaXJzdCBjb2x1bW4gaW4gdGhlIG1hdHJpeCB1c2VkIGluIFRSQy9tYXRyaXggdHJhbnNmb3Jtcy4iLAogICAgKSwKCiAgICBSRURfVFJDX1RBRygKICAgIC8vICAgICI2LjQuMzQgIiwKICAgICAgICAgICAgInJlZFRSQ1RhZyIsICJjdXJ2ZVR5cGUgb3IgcGFyYW1ldHJpY0N1cnZlVHlwZSIsIDB4NzI1NDUyNDMKICAgIC8vICAgICJSZWQgY2hhbm5lbCB0b25lIHJlcHJvZHVjdGlvbiBjdXJ2ZS4gVGhlIGZpcnN0IGVsZW1lbnQgcmVwcmVzZW50cyBubyBjb2xvcmFudCAod2hpdGUpIG9yIHBob3NwaG9ycyIsCiAgICAvLyAgICAiKGJsYWNrKSBhbmQgdGhlIGxhc3QgZWxlbWVudCByZXByZXNlbnRzIDEwMCBwZXJjZW50IGNvbG9yYW50IChyZWQpIG9yIDEwMCBwZXJjZW50IHBob3NwaG9yIChyZWQpLiIsCiAgICApLAoKICAgIFRFQ0hOT0xPR1lfVEFHKAogICAgLy8gICAgIjYuNC4zNSAiLAogICAgICAgICAgICAidGVjaG5vbG9neVRhZyIsICJzaWduYXR1cmVUeXBlIiwgMHg3NDY1NjM2OAogICAgLy8gICAgIkRldmljZSB0ZWNobm9sb2d5IGluZm9ybWF0aW9uIHN1Y2ggYXMgQ1JULCBEeWUgU3VibGltYXRpb24sIGV0Yy4gVGhlIGVuY29kaW5nIGlzIHN1Y2ggdGhhdDoiLAogICAgKSwKCiAgICBWSUVXSU5HX0NPTkRfREVTQ19UQUcoCiAgICAvLyAgICAiNi40LjM2ICIsCiAgICAgICAgICAgICJ2aWV3aW5nQ29uZERlc2NUYWciLCAibXVsdGlMb2NhbGl6ZWRVbmljb2RlVHlwZSIsIDB4NzY3NTY1NjQKICAgIC8vICAgICJTdHJ1Y3R1cmUgY29udGFpbmluZyBpbnZhcmlhbnQgYW5kIGxvY2FsaXphYmxlIHZlcnNpb25zIG9mIHRoZSB2aWV3aW5nIGNvbmRpdGlvbnMuIFRoZSBjb250ZW50IG9mIHRoaXMgc3RydWN0dXJlIiwKICAgIC8vICAgICJpcyBkZXNjcmliZWQgaW4gNi41LjEyLiIsCgogICAgKSwKCiAgICBWSUVXSU5HX0NPTkRJVElPTlNfVEFHKAogICAgLy8gICAgIjYuNC4zNyAiLAogICAgICAgICAgICAidmlld2luZ0NvbmRpdGlvbnNUYWciLCAidmlld2luZ0NvbmRpdGlvbnNUeXBlIiwgMHg3NjY5NjU3NwogICAgLy8gICAgIlZpZXdpbmcgY29uZGl0aW9ucyBwYXJhbWV0ZXJzLiBUaGUgY29udGVudCBvZiB0aGlzIHN0cnVjdHVyZSBpcyBkZXNjcmliZWQgaW4gNi41LjI1LiIsCiAgICApOwoKICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgbmFtZTsKICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgdHlwZV9kZXNjcmlwdGlvbjsKICAgIHB1YmxpYyBmaW5hbCBpbnQgc2lnbmF0dXJlOwoKICAgIEljY1RhZ1R5cGVzKFN0cmluZyBuYW1lLCBTdHJpbmcgdHlwZV9kZXNjcmlwdGlvbiwgaW50IHNpZ25hdHVyZSkKICAgIHsKICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOwogICAgICAgIHRoaXMudHlwZV9kZXNjcmlwdGlvbiA9IHR5cGVfZGVzY3JpcHRpb247CiAgICAgICAgdGhpcy5zaWduYXR1cmUgPSBzaWduYXR1cmU7CiAgICB9CgogICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewogICAgICAgIHJldHVybiBuYW1lOwogICAgfQogICAgCiAgICBwdWJsaWMgU3RyaW5nIGdldFR5cGVEZXNjcmlwdGlvbigpIHsKICAgICAgICByZXR1cm4gdHlwZV9kZXNjcmlwdGlvbjsKICAgIH0KICAgIAogICAgcHVibGljIGludCBnZXRTaWduYXR1cmUoKSB7CiAgICAgICAgcmV0dXJuIHNpZ25hdHVyZTsKICAgIH0KfQo=