LyoKICogQ09NIGludGVyZmFjZXMgZm9yIHNoZWxsIG9iamVjdHMKICoKICogQ29weXJpZ2h0IChDKSAyMDA0IE1heGltZSBCZWxsZW5n6QogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EKICovCgppbXBvcnQgIm9iamlkbC5pZGwiOwppbXBvcnQgIm9sZWlkbC5pZGwiOwppbXBvcnQgIm9haWRsLmlkbCI7CmltcG9ydCAic2h0eXBlcy5pZGwiOwppbXBvcnQgInNlcnZwcm92LmlkbCI7CmltcG9ydCAiY29tY2F0LmlkbCI7CgojaW5jbHVkZSA8c2hkaXNwaWQuaD4KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJQXV0b0NvbXBsZXRlIGludGVyZmFjZQogKi8KWwogICAgb2JqZWN0LAogICAgdXVpZCgwMGJiMjc2Mi02YTc3LTExZDAtYTUzNS0wMGMwNGZkN2QwNjIpLAogICAgcG9pbnRlcl9kZWZhdWx0KHVuaXF1ZSkKXQppbnRlcmZhY2UgSUF1dG9Db21wbGV0ZSA6IElVbmtub3duCnsKICAgIHR5cGVkZWYgSUF1dG9Db21wbGV0ZSAqTFBBVVRPQ09NUExFVEU7CgogICAgSFJFU1VMVCBJbml0KCBbaW5dIEhXTkQgaHduZEVkaXQsCgkJICBbaW5dIElVbmtub3duICpwdW5rQUNMLAoJCSAgW2luXSBMUENPTEVTVFIgcHdzelJlZ0tleVBhdGgsCgkJICBbaW5dIExQQ09MRVNUUiBwd3N6UXVpY2tDb21wbGV0ZSk7CiAgICAKICAgIEhSRVNVTFQgRW5hYmxlKCBbaW5dIEJPT0wgZkVuYWJsZSApOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSUF1dG9Db21wbGV0ZTIgaW50ZXJmYWNlCiAqLwpbCiAgICBvYmplY3QsCiAgICB1dWlkKGVhYzA0YmMwLTM3OTEtMTFkMi1iYjk1LTAwNjA5NzdiNDY0YyksCiAgICBwb2ludGVyX2RlZmF1bHQodW5pcXVlKQpdCmludGVyZmFjZSBJQXV0b0NvbXBsZXRlMiA6IElBdXRvQ29tcGxldGUKewogICAgdHlwZWRlZiBJQXV0b0NvbXBsZXRlMiAqTFBBVVRPQ09NUExFVEUyOwoKICAgIHR5cGVkZWYgZW51bSBfdGFnQVVUT0NPTVBMRVRFT1BUSU9OUwoJewoJICAgIEFDT19OT05FICAgICAgICAgICA9IDB4MDAsICAgICAgLyogTm8gQXV0b0NvbXBsZXRlICovCgkgICAgQUNPX0FVVE9TVUdHRVNUICAgID0gMHgwMSwgICAgICAvKiBlbmFibGUgYXV0b3N1Z2dlc3QgZHJvcGRvd24gKi8KCSAgICBBQ09fQVVUT0FQUEVORCAgICAgPSAweDAyLCAgICAgIC8qIGVuYWJsZSBhdXRvYXBwZW5kICovCgkgICAgQUNPX1NFQVJDSCAgICAgICAgID0gMHgwNCwgICAgICAvKiBhZGQgc2VhcmNoIGVudHJ5IHRvIGNvbXBsZXRpb24gbGlzdCAqLwoJICAgIEFDT19GSUxURVJQUkVGSVhFUyA9IDB4MDgsICAgICAgLyogZG9uJ3QgbWF0Y2ggY29tbW9uIHByZWZpeGVzICh3d3cuLCBodHRwOi8vLCBldGMpICovCgkgICAgQUNPX1VTRVRBQiAgICAgICAgID0gMHgxMCwgICAgICAvKiB1c2UgdGFiIHRvIHNlbGVjdCBhdXRvc3VnZ2VzdCBlbnRyaWVzICovCgkgICAgQUNPX1VQRE9XTktFWURST1BTTElTVCA9IDB4MjAsICAvKiB1cC9kb3duIGFycm93IGtleSBpbnZva2VzIGF1dG9zdWdnZXN0IGRyb3Bkb3duIChpZiBlbmFibGVkKSAqLwoJICAgIEFDT19SVExSRUFESU5HICAgICA9IDB4NDAsICAgICAgLyogZW5hYmxlIFJUTCByZWFkaW5nIG9yZGVyIGZvciBkcm9wZG93biAqLwoJfSBBVVRPQ09NUExFVEVPUFRJT05TOwoKICAgIEhSRVNVTFQgU2V0T3B0aW9ucyggW2luXSBEV09SRCBkd0ZsYWcpOwoKICAgIEhSRVNVTFQgR2V0T3B0aW9ucyggW291dF0gRFdPUkQgKnBkd0ZsYWcpOwp9CgpbCiAgICBvYmplY3QsCiAgICB1dWlkKDliYTA1OTcwLWY2YTgtMTFjZi1hNDQyLTAwYTBjOTBhOGYzOSksCiAgICBwb2ludGVyX2RlZmF1bHQodW5pcXVlKQpdCmludGVyZmFjZSBJRm9sZGVyVmlld09DIDogSURpc3BhdGNoCnsKICAgIEhSRVNVTFQgU2V0Rm9sZGVyVmlldyggW2luXSBJRGlzcGF0Y2ggKnBkaXNwICk7Cn0KClsKICAgIHV1aWQoNjIxMTJhYTItZWJlNC0xMWNmLWE1ZmItMDAyMGFmZTcyOTJkKQpdCmRpc3BpbnRlcmZhY2UgRFNoZWxsRm9sZGVyVmlld0V2ZW50cwp7CiAgICBwcm9wZXJ0aWVzOgogICAgbWV0aG9kczoKICAgIFtpZChESVNQSURfU0VMRUNUSU9OQ0hBTkdFRCldCiAgICB2b2lkIFNlbGVjdGlvbkNoYW5nZWQoKTsKCiAgICBbaWQoRElTUElEX0ZJTEVMSVNURU5VTURPTkUpXQogICAgdm9pZCBFbnVtRG9uZSgpOwoKICAgIFtpZChESVNQSURfVkVSQklOVk9LRUQpXQogICAgVkFSSUFOVF9CT09MIFZlcmJJbnZva2VkKCk7CgogICAgW2lkKERJU1BJRF9ERUZBVUxUVkVSQklOVk9LRUQpXQogICAgVkFSSUFOVF9CT09MIERlZmF1bHRWZXJiSW52b2tlZCgpOwoKICAgIFtpZChESVNQSURfQkVHSU5EUkFHKV0KICAgIFZBUklBTlRfQk9PTCBCZWdpbkRyYWcoKTsKfQoKWwogICAgdXVpZCg5YmEwNTk3MS1mNmE4LTExY2YtYTQ0Mi0wMGEwYzkwYThmMzkpLAogICAgaGlkZGVuCl0KY29jbGFzcyBTaGVsbEZvbGRlclZpZXdPQwp7CiAgICBbZGVmYXVsdF0gICAgICAgICBpbnRlcmZhY2UgICAgIElGb2xkZXJWaWV3T0M7CiAgICBbZGVmYXVsdCwgc291cmNlXSBkaXNwaW50ZXJmYWNlIERTaGVsbEZvbGRlclZpZXdFdmVudHM7Cn0K