LyoKICogU3RhcnQgKER1dGNoIHJlc291cmNlcykKICoKICogQ29weXJpZ2h0IDIwMDMgSGFucyBMZWlkZWtrZXIKICogQ29weXJpZ2h0IDIwMDggRnJhbnMgS29vbAogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EKICovCgpMQU5HVUFHRSBMQU5HX0RVVENILCBTVUJMQU5HX05FVVRSQUwKClNUUklOR1RBQkxFIERJU0NBUkRBQkxFIExBTkdVQUdFIExBTkdfRFVUQ0gsIFNVQkxBTkdfTkVVVFJBTAp7ClNUUklOR19VU0FHRSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTdGFydCBlZW4gcHJvZ3JhbW1hLCBvZiBvcGVuIGVlbiBkb2N1bWVudCBtZXQgaGV0IHByb2dyYW1tYSBkYXQgbm9ybWFhbCB2b29yIGJlc3RhbmRlbiBtZXQgZGllIGV4dGVuc2llIGdlYnJ1aWt0IHdvcmR0LiBcblwKR2VicnVpazogXG5cCnN0YXJ0IFtvcHRpb25zXSBwcm9ncmFtbWFfbmFhbSBbLi4uXSBcblwKc3RhcnQgW29wdGlvbnNdIGRvY3VtZW50X25hYW0gXG5cCiBcblwKT3B0aW9uczogXG5cCi9NW2luaW1pemVkXSBTdGFydCBoZXQgcHJvZ3JhbW1hIGdlbWluaW1hbGlzZWVyZC4gXG5cCi9NQVhbaW1pemVkXSBTdGFydCBoZXQgcHJvZ3JhbW1hIGdlbWF4aW1hbGlzZWVyZC4gXG5cCi9SW2VzdG9yZWRdICBTdGFydCBoZXQgcHJvZ3JhbW1hIG5vcm1hYWwgKG5vY2ggZ2VtaW5pbWFsaXNlZXJkIG5vY2ggZ2VtYXhpbWFsaXNlZXJkKS4gXG5cCi9XW2FpdF0gICAgICBXYWNodCB0b3RkYXQgaGV0IGdlc3RhcnRlIHByb2dyYW1tYSBpcyBiZetpbmRpZ2QsIGVpbmRpZyBkYW4gbWV0IGRlIGV4aXQgY29kZSB2YW4gZGF0IHByb2dyYW1tYS4gXG5cCi9Vbml4ICAgICAgICBHZWJydWlrIGVlbiBVbml4IGJlc3RhbmRzbmFhbSBlbiBzdGFydCBoZXQgYmVzdGFuZCBhbHMgZGUgd2luZG93cyB2ZXJrZW5uZXIuIFxuXAovTCAgICAgICAgICAgTGFhdCBkZSBnZWJydWlrZXJzbGljZW50aWUgemllbi4gXG5cCiBcblwKc3RhcnQuZXhlIHZlcnNpb24gMC4yIENvcHlyaWdodCAoQykgMjAwMywgRGFuIEtlZ2VsIFxuXApTdGFydCB3b3JkdCB1IEFCU09MVVVUIFpPTkRFUiBHQVJBTlRJRSBhYW5nZWJvZGVuOyBkcmFhaSBkaXQgcHJvZ3JhbW1hIG1ldCBkZSAvTCBvcHRpZSB2b29yIGRldGFpbHMuIFxuXApEaXQgaXMgdnJpamUgc29mdHdhcmUsIGVuIHUgd29yZHQgdWl0Z2Vub2RpZ2Qgb20gaGV0IHZlcmRlciB0ZSB2ZXJzcHJlaWRlbiBcblwKb25kZXIgYmVwYWFsZGUgdm9vcndhYXJkZW47IGRyYWFpICdzdGFydCAvTCcgdm9vciBkZXRhaWxzLiBcblwKIgoKU1RSSU5HX0xJQ0VOU0UsICJzdGFydC5leGUgdmVyc2lvbiAwLjIgQ29weXJpZ2h0IChDKSAyMDAzLCBEYW4gS2VnZWwgXG5cClRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgXG5cCm1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgUHVibGljIExpY2Vuc2UgXG5cCmFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgXG5cCm9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiBcblwKIFxuXApUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgXG5cCmJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIFxuXApNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIFxuXApHTlUgTGVzc2VyIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuIFxuXAogXG5cCllvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgUHVibGljIExpY2Vuc2UgXG5cCmFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIFxuXApGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLiBcblwKIFxuXApTZWUgdGhlIENPUFlJTkcuTElCIGZpbGUgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uIFxuXAoiCgpTVFJJTkdfRVhFQ0ZBSUwgIlByb2dyYW1tYSBrYW4gbmlldCB3b3JkZW4gZ2VzdGFydCwgb2YgZXIgaXMgZ2VlbiBwcm9ncmFtbWEgdmVyYm9uZGVuIG1ldCBoZXQgb3BnZWdldmVuIGJlc3RhbmQuXG5TaGVsbEV4ZWN1dGVFeCBpcyBtaXNsdWt0IgoKU1RSSU5HX1VOSVhGQUlMICJLb24gZGUgb3BnZWdldmVuIFVuaXggYmVzdGFuZHNuYWFtIG5pZXQgb216ZXR0ZW4gbmFhciBlZW4gRE9TIGJlc3RhbmRzbmFhbS4iCn0K