LyoKICoJT0xFMk5MUyBsaWJyYXJ5CiAqCiAqCUNvcHlyaWdodCAxOTk1CU1hcnRpbiB2b24gTG9ld2lzCiAqICAgICAgQ29weXJpZ2h0IDE5OTggIERhdmlkIExlZSBMYW1iZXJ0CiAqLwoKI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8Y3R5cGUuaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSAid2luZG93cy5oIgojaW5jbHVkZSAiaGVhcC5oIgojaW5jbHVkZSAib2xlLmgiCiNpbmNsdWRlICJvcHRpb25zLmgiCiNpbmNsdWRlICJ3aW5ubHMuaCIKI2luY2x1ZGUgIndpbnJlZy5oIgojaW5jbHVkZSAid2luZXJyb3IuaCIKI2luY2x1ZGUgImRlYnVnLmgiCgovKiBMb2NhbGUgbmFtZSB0byBpZCBtYXAuIHVzZWQgYnkgRW51bVN5c3RlbUxvY2FsZXMsIEdldExvY2FsSW5mb0EgCiAqIE1VU1QgY29udGFpbiBhbGwgI2RlZmluZXMgZnJvbSB3aW5ubHMuaAogKiBsYXN0IGVudHJ5IGhhcyBOVUxMIG5hbWUsIDAgaWQuCiAqLyAKI2RlZmluZSBMT0NBTEVfRU5UUlkoeCkJeyN4LExPQ0FMRV8jI3h9CnN0YXRpYyBzdHJ1Y3QgdGFnTE9DQUxFX05BTUUySUQgewoJY2hhcgkqbmFtZTsKCURXT1JECWlkOwp9IGxvY2FsZV9uYW1lMmlkW109IHsKCUxPQ0FMRV9FTlRSWShJTEFOR1VBR0UpLAoJTE9DQUxFX0VOVFJZKFNMQU5HVUFHRSksCglMT0NBTEVfRU5UUlkoU0VOR0xBTkdVQUdFKSwKCUxPQ0FMRV9FTlRSWShTQUJCUkVWTEFOR05BTUUpLAoJTE9DQUxFX0VOVFJZKFNOQVRJVkVMQU5HTkFNRSksCglMT0NBTEVfRU5UUlkoSUNPVU5UUlkpLAoJTE9DQUxFX0VOVFJZKFNDT1VOVFJZKSwKCUxPQ0FMRV9FTlRSWShTRU5HQ09VTlRSWSksCglMT0NBTEVfRU5UUlkoU0FCQlJFVkNUUllOQU1FKSwKCUxPQ0FMRV9FTlRSWShTTkFUSVZFQ1RSWU5BTUUpLAoJTE9DQUxFX0VOVFJZKElERUZBVUxUTEFOR1VBR0UpLAoJTE9DQUxFX0VOVFJZKElERUZBVUxUQ09VTlRSWSksCglMT0NBTEVfRU5UUlkoSURFRkFVTFRDT0RFUEFHRSksCglMT0NBTEVfRU5UUlkoSURFRkFVTFRBTlNJQ09ERVBBR0UpLAoJTE9DQUxFX0VOVFJZKFNMSVNUKSwKCUxPQ0FMRV9FTlRSWShJTUVBU1VSRSksCglMT0NBTEVfRU5UUlkoU0RFQ0lNQUwpLAoJTE9DQUxFX0VOVFJZKFNUSE9VU0FORCksCglMT0NBTEVfRU5UUlkoU0dST1VQSU5HKSwKCUxPQ0FMRV9FTlRSWShJRElHSVRTKSwKCUxPQ0FMRV9FTlRSWShJTFpFUk8pLAoJTE9DQUxFX0VOVFJZKElORUdOVU1CRVIpLAoJTE9DQUxFX0VOVFJZKFNOQVRJVkVESUdJVFMpLAoJTE9DQUxFX0VOVFJZKFNDVVJSRU5DWSksCglMT0NBTEVfRU5UUlkoU0lOVExTWU1CT0wpLAoJTE9DQUxFX0VOVFJZKFNNT05ERUNJTUFMU0VQKSwKCUxPQ0FMRV9FTlRSWShTTU9OVEhPVVNBTkRTRVApLAoJTE9DQUxFX0VOVFJZKFNNT05HUk9VUElORyksCglMT0NBTEVfRU5UUlkoSUNVUlJESUdJVFMpLAoJTE9DQUxFX0VOVFJZKElJTlRMQ1VSUkRJR0lUUyksCglMT0NBTEVfRU5UUlkoSUNVUlJFTkNZKSwKCUxPQ0FMRV9FTlRSWShJTkVHQ1VSUiksCglMT0NBTEVfRU5UUlkoU0RBVEUpLAoJTE9DQUxFX0VOVFJZKFNUSU1FKSwKCUxPQ0FMRV9FTlRSWShTU0hPUlREQVRFKSwKCUxPQ0FMRV9FTlRSWShTTE9OR0RBVEUpLAoJTE9DQUxFX0VOVFJZKFNUSU1FRk9STUFUKSwKCUxPQ0FMRV9FTlRSWShJREFURSksCglMT0NBTEVfRU5UUlkoSUxEQVRFKSwKCUxPQ0FMRV9FTlRSWShJVElNRSksCglMT0NBTEVfRU5UUlkoSVRJTUVNQVJLUE9TTiksCglMT0NBTEVfRU5UUlkoSUNFTlRVUlkpLAoJTE9DQUxFX0VOVFJZKElUTFpFUk8pLAoJTE9DQUxFX0VOVFJZKElEQVlMWkVSTyksCglMT0NBTEVfRU5UUlkoSU1PTkxaRVJPKSwKCUxPQ0FMRV9FTlRSWShTMTE1OSksCglMT0NBTEVfRU5UUlkoUzIzNTkpLAoJTE9DQUxFX0VOVFJZKElDQUxFTkRBUlRZUEUpLAoJTE9DQUxFX0VOVFJZKElPUFRJT05BTENBTEVOREFSKSwKCUxPQ0FMRV9FTlRSWShJRklSU1REQVlPRldFRUspLAoJTE9DQUxFX0VOVFJZKElGSVJTVFdFRUtPRllFQVIpLAoJTE9DQUxFX0VOVFJZKFNEQVlOQU1FMSksCglMT0NBTEVfRU5UUlkoU0RBWU5BTUUyKSwKCUxPQ0FMRV9FTlRSWShTREFZTkFNRTMpLAoJTE9DQUxFX0VOVFJZKFNEQVlOQU1FNCksCglMT0NBTEVfRU5UUlkoU0RBWU5BTUU1KSwKCUxPQ0FMRV9FTlRSWShTREFZTkFNRTYpLAoJTE9DQUxFX0VOVFJZKFNEQVlOQU1FNyksCglMT0NBTEVfRU5UUlkoU0FCQlJFVkRBWU5BTUUxKSwKCUxPQ0FMRV9FTlRSWShTQUJCUkVWREFZTkFNRTIpLAoJTE9DQUxFX0VOVFJZKFNBQkJSRVZEQVlOQU1FMyksCglMT0NBTEVfRU5UUlkoU0FCQlJFVkRBWU5BTUU0KSwKCUxPQ0FMRV9FTlRSWShTQUJCUkVWREFZTkFNRTUpLAoJTE9DQUxFX0VOVFJZKFNBQkJSRVZEQVlOQU1FNiksCglMT0NBTEVfRU5UUlkoU0FCQlJFVkRBWU5BTUU3KSwKCUxPQ0FMRV9FTlRSWShTTU9OVEhOQU1FMSksCglMT0NBTEVfRU5UUlkoU01PTlRITkFNRTIpLAoJTE9DQUxFX0VOVFJZKFNNT05USE5BTUUzKSwKCUxPQ0FMRV9FTlRSWShTTU9OVEhOQU1FNCksCglMT0NBTEVfRU5UUlkoU01PTlRITkFNRTUpLAoJTE9DQUxFX0VOVFJZKFNNT05USE5BTUU2KSwKCUxPQ0FMRV9FTlRSWShTTU9OVEhOQU1FNyksCglMT0NBTEVfRU5UUlkoU01PTlRITkFNRTgpLAoJTE9DQUxFX0VOVFJZKFNNT05USE5BTUU5KSwKCUxPQ0FMRV9FTlRSWShTTU9OVEhOQU1FMTApLAoJTE9DQUxFX0VOVFJZKFNNT05USE5BTUUxMSksCglMT0NBTEVfRU5UUlkoU01PTlRITkFNRTEyKSwKCUxPQ0FMRV9FTlRSWShTTU9OVEhOQU1FMTMpLAoJTE9DQUxFX0VOVFJZKFNBQkJSRVZNT05USE5BTUUxKSwKCUxPQ0FMRV9FTlRSWShTQUJCUkVWTU9OVEhOQU1FMiksCglMT0NBTEVfRU5UUlkoU0FCQlJFVk1PTlRITkFNRTMpLAoJTE9DQUxFX0VOVFJZKFNBQkJSRVZNT05USE5BTUU0KSwKCUxPQ0FMRV9FTlRSWShTQUJCUkVWTU9OVEhOQU1FNSksCglMT0NBTEVfRU5UUlkoU0FCQlJFVk1PTlRITkFNRTYpLAoJTE9DQUxFX0VOVFJZKFNBQkJSRVZNT05USE5BTUU3KSwKCUxPQ0FMRV9FTlRSWShTQUJCUkVWTU9OVEhOQU1FOCksCglMT0NBTEVfRU5UUlkoU0FCQlJFVk1PTlRITkFNRTkpLAoJTE9DQUxFX0VOVFJZKFNBQkJSRVZNT05USE5BTUUxMCksCglMT0NBTEVfRU5UUlkoU0FCQlJFVk1PTlRITkFNRTExKSwKCUxPQ0FMRV9FTlRSWShTQUJCUkVWTU9OVEhOQU1FMTIpLAoJTE9DQUxFX0VOVFJZKFNBQkJSRVZNT05USE5BTUUxMyksCglMT0NBTEVfRU5UUlkoU1BPU0lUSVZFU0lHTiksCglMT0NBTEVfRU5UUlkoU05FR0FUSVZFU0lHTiksCglMT0NBTEVfRU5UUlkoSVBPU1NJR05QT1NOKSwKCUxPQ0FMRV9FTlRSWShJTkVHU0lHTlBPU04pLAoJTE9DQUxFX0VOVFJZKElQT1NTWU1QUkVDRURFUyksCglMT0NBTEVfRU5UUlkoSVBPU1NFUEJZU1BBQ0UpLAoJTE9DQUxFX0VOVFJZKElORUdTWU1QUkVDRURFUyksCglMT0NBTEVfRU5UUlkoSU5FR1NFUEJZU1BBQ0UpLAovKglMT0NBTEVfRU5UUlkoRk9OVFNJR05BVFVSRSksKi8KCXtOVUxMLDB9LAp9OwoKY29uc3Qgc3RydWN0IG1hcF9sY2lkMnN0ciB7CglMQ0lECQlsYW5naWQ7Cgljb25zdCBjaGFyCSpsYW5nbmFtZTsKfSBsYW5ndWFnZXNbXT17Cgl7MHgwNDAxLCJBcmFiaXNjaCJ9LAoJezB4MDQwMiwiQnVsZ2FyaXNjaCJ9LAoJezB4MDQwMywiS2F0YWxhbmlzY2gifSwKCXsweDA0MDQsIlRyYWRpdGlvbmFsZXMgQ2hpbmVzaXNjaCJ9LAoJezB4MDQwNSwiVHNjaGVjaXNjaCJ9LAoJezB4MDQwNiwiRORuaXNjaCJ9LAoJezB4MDQwNywiRGV1dHNjaCJ9LAoJezB4MDQwOCwiR3JpZWNoaXNjaCJ9LAoJezB4MDQwOSwiQW1lcmlrYW5pc2NoZXMgRW5nbGlzY2gifSwKCXsweDA0MEEsIkthc3RpbGlzY2hlcyBTcGFuaXNjaCJ9LAoJezB4MDQwQiwiRmlubmlzY2gifSwKCXsweDA0MEMsIkZyYW56dnNpc2NoIn0sCgl7MHgwNDBELCJIZWJyZGlzY2gifSwKCXsweDA0MEUsIlVuZ2FyaXNjaCJ9LAoJezB4MDQwRiwiSXNsZG5kaXNjaCJ9LAoJezB4MDQxMCwiSXRhbGllbmlzY2gifSwKCXsweDA0MTEsIkphcGFuaXNjaCJ9LAoJezB4MDQxMiwiS29yZWFuaXNjaCJ9LAoJezB4MDQxMywiTmllZGVybGRuZGlzY2gifSwKCXsweDA0MTQsIk5vcndlZ2lzY2gtQm9rbWFsIn0sCgl7MHgwNDE1LCJQb2xuaXNjaCJ9LAoJezB4MDQxNiwiQnJhc2lsaWFuaXNjaGVzIFBvcnR1Z2llc2lzY2gifSwKCXsweDA0MTcsIlJkdG9yb21hbmlzY2gifSwKCXsweDA0MTgsIlJ1bWRuaXNjaCJ9LAoJezB4MDQxOSwiUnVzc2lzY2gifSwKCXsweDA0MUEsIktyb2F0b3NlcmJpc2NoIChsYXRlaW5pc2NoKSJ9LAoJezB4MDQxQiwiU2xvd2VuaXNjaCJ9LAoJezB4MDQxQywiQWxiYW5pc2NoIn0sCgl7MHgwNDFELCJTY2h3ZWRpc2NoIn0sCgl7MHgwNDFFLCJUaGFpIn0sCgl7MHgwNDFGLCJUfHJraXNjaCJ9LAoJezB4MDQyMCwiVXJkdSJ9LAoJezB4MDQyMSwiQmFoYXNhIn0sCgl7MHgwODA0LCJWZXJlaW5mYWNodGVzIENoaW5lc2lzY2gifSwKCXsweDA4MDcsIlNjaHdlaXplcmRldXRzY2gifSwKCXsweDA4MDksIkJyaXRpc2NoZXMgRW5nbGlzY2gifSwKCXsweDA4MEEsIk1leGlrYW5pc2NoZXMgU3BhbmlzY2gifSwKCXsweDA4MEMsIkJlbGdpc2NoZXMgRnJhbnp2c2lzY2gifSwKCXsweDA4MTAsIlNjaHdlaXplcmlzY2hlcyBJdGFsaWVuaXNjaCJ9LAoJezB4MDgxMywiQmVsZ2lzY2hlcyBOaWVkZXJsZG5kaXNjaCJ9LAoJezB4MDgxNCwiTm9yZ3dlZ2lzY2gtTnlub3JzayJ9LAoJezB4MDgxNiwiUG9ydHVnaWVzaXNjaCJ9LAoJezB4MDgxQSwiU2VyYm9rcmF0aXNjaCAoa3lyaWxsaXNjaCkifSwKCXsweDBDMUMsIkthbmFkaXNjaGVzIEZyYW56dnNpc2NoIn0sCgl7MHgxMDBDLCJTY2h3ZWl6ZXJpc2NoZXMgRnJhbnp2c2lzY2gifSwKCXsweDAwMDAsIlVuYmVrYW5udCJ9LAp9OwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBHZXRVc2VyRGVmYXVsdExDSUQgICAgICAgKE9MRTJOTFMuMSkKICovCkxDSUQgV0lOQVBJIEdldFVzZXJEZWZhdWx0TENJRCgpCnsKLyogRGVmYXVsdCBzb3J0aW5nLCBuZXV0cmFsIHN1Ymxhbmd1YWdlICovCiAgICBzd2l0Y2goT3B0aW9ucy5sYW5ndWFnZSkKICAgIHsKIC8qIGNhc2UgTEFOR19CdTogcmV0dXJuIDB4MDI7ICovICAgICAgLyogQnVsZ2FyaWFuICovCiAvKiBjYXNlIExBTkdfQ2g6IHJldHVybiAweDA0OyAqLyAgICAgIC8qIENoaW5lc2UgKi8KICAgIGNhc2UgTEFOR19DejogcmV0dXJuIDB4MDU7ICAgICAgICAgLyogQ3plY2ggKi8KICAgIGNhc2UgTEFOR19EYTogcmV0dXJuIDB4MDY7ICAgICAgICAgLyogRGFuaXNoICovCiAgICBjYXNlIExBTkdfRGU6IHJldHVybiAweDA3OyAgICAgICAgIC8qIEdlcm1hbiAqLwogLyogY2FzZSBMQU5HX0dyOiByZXR1cm4gMHgwODsgKi8gICAgICAvKiBHcmVlayAqLwogICAgY2FzZSBMQU5HX0VuOiByZXR1cm4gMHgwOTsgICAgICAgICAvKiBFbmdsaXNoICovCiAgICBjYXNlIExBTkdfRXM6IHJldHVybiAweDBhOyAgICAgICAgIC8qIFNwYW5pc2ggKi8KICAgIGNhc2UgTEFOR19GaTogcmV0dXJuIDB4MGI7ICAgICAgICAgLyogRmlubmlzaCAqLwogICAgY2FzZSBMQU5HX0ZyOiByZXR1cm4gMHgwYzsgICAgICAgICAvKiBGcmVuY2ggKi8KICAgIGNhc2UgTEFOR19IdTogcmV0dXJuIDB4MGU7ICAgICAgICAgLyogSHVuZ2FyaWFuICovCiAvKiBjYXNlIExBTkdfSWM6IHJldHVybiAweDBmOyAqLyAgICAgIC8qIEljZWxhbmRpYyAqLwogICAgY2FzZSBMQU5HX0l0OiByZXR1cm4gMHgxMDsgICAgICAgICAvKiBJdGFsaWFuICovCiAvKiBjYXNlIExBTkdfSnA6IHJldHVybiAweDExOyAqLyAgICAgIC8qIEphcGFuZXNlICovCiAgICBjYXNlIExBTkdfS286IHJldHVybiAweDEyOyAgICAgICAgIC8qIEtvcmVhbiAqLwogLyogY2FzZSBMQU5HX0R1OiByZXR1cm4gMHgxMzsgKi8gICAgICAvKiBEdXRjaCAqLwogICAgY2FzZSBMQU5HX05vOiByZXR1cm4gMHgxNDsgICAgICAgICAvKiBOb3J3ZWdpYW4gKi8KICAgIGNhc2UgTEFOR19QbDogcmV0dXJuIDB4MTU7ICAgICAgICAgLyogUG9saXNoICovCiAgICBjYXNlIExBTkdfUG86IHJldHVybiAweDE2OyAgICAgICAgIC8qIFBvcnR1Z3Vlc2UgKi8KIC8qIGNhc2UgTEFOR19SbzogcmV0dXJuIDB4MTg7ICovICAgICAgLyogUm9tYW5pYW4gKi8KIC8qIGNhc2UgTEFOR19SdTogcmV0dXJuIDB4MTk7ICovICAgICAgLyogUnVzc2lhbiAqLwogLyogY2FzZSBMQU5HX0NyOiByZXR1cm4gMHgxYTsgKi8gICAgICAvKiBDcm9hdGlhbiAqLwogLyogY2FzZSBMQU5HX1NsOiByZXR1cm4gMHgxYjsgKi8gICAgICAvKiBTbG92YWsgKi8KICAgIGNhc2UgTEFOR19TdzogcmV0dXJuIDB4MWQ7ICAgICAgICAgLyogU3dlZGlzaCAqLwogLyogY2FzZSBMQU5HX1R1OiByZXR1cm4gMHgxZjsgKi8gICAgICAvKiBUdXJraXNoICovCiAvKiBjYXNlIExBTkdfU3Y6IHJldHVybiAweDI0OyAqLyAgICAgIC8qIFNsb3ZlbmlhbiAqLwogICAgY2FzZSBMQU5HX0VvOiByZXR1cm4gMHgyNTsgICAgICAgICAvKiBFc3BlcmFudG8gKG5vdCBvZmZpY2lhbCkgKi8KICAgIGNhc2UgTEFOR19DYTogcmV0dXJuIDB4MjY7ICAgICAgICAgLyogQ2F0YWxhbiAqLwoKICAgIGRlZmF1bHQ6CglyZXR1cm4gMHgwMDsgICAgICAgICAgICAgICAgICAgLyogTmV1dHJhbCBsYW5ndWFnZSAqLwogICAgfQp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICBHZXRTeXN0ZW1EZWZhdWx0TENJRCAgICAgICAoT0xFMk5MUy4yKQogKi8KTENJRCBXSU5BUEkgR2V0U3lzdGVtRGVmYXVsdExDSUQoKQp7CglyZXR1cm4gR2V0VXNlckRlZmF1bHRMQ0lEKCk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgIEdldFVzZXJEZWZhdWx0TGFuZ0lEICAgICAgIChPTEUyTkxTLjMpCiAqLwpMQU5HSUQgV0lOQVBJIEdldFVzZXJEZWZhdWx0TGFuZ0lEKCkKewoJcmV0dXJuIChXT1JEKUdldFVzZXJEZWZhdWx0TENJRCgpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICBHZXRTeXN0ZW1EZWZhdWx0TGFuZ0lEICAgICAoT0xFMk5MUy40KQogKi8KTEFOR0lEIFdJTkFQSSBHZXRTeXN0ZW1EZWZhdWx0TGFuZ0lEKCkKewoJcmV0dXJuIEdldFVzZXJEZWZhdWx0TGFuZ0lEKCk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgIEdldExvY2FsZUluZm9BICAgICAgICAgICAgIChPTEUyTkxTLjUpCiAqIElzIHRoZSBsYXN0IHBhcmFtZXRlciByZWFsbHkgV09SRCBmb3IgV2luMTY/CiAqLwpJTlQxNiBXSU5BUEkgR2V0TG9jYWxlSW5mbzE2KExDSUQgbGNpZCxMQ1RZUEUgTENUeXBlLExQU1RSIGJ1ZixJTlQxNiBsZW4pCnsKCXJldHVybiBHZXRMb2NhbGVJbmZvMzJBKGxjaWQsTENUeXBlLGJ1ZixsZW4pOwp9CgpJTlQzMiBXSU5BUEkgR2V0TG9jYWxlSW5mbzMyQShMQ0lEIGxjaWQsTENUWVBFIExDVHlwZSxMUFNUUiBidWYsSU5UMzIgbGVuKQp7CgljaGFyCSpyZXRTdHJpbmc7CglpbnQJZm91bmQsaTsKCglUUkFDRShvbGUsIiglOGxYLCU4bFgsJXAsJTRYKVxuIiwKCQkJbGNpZCxMQ1R5cGUsYnVmLGxlbik7CgoJTENUeXBlICY9IH4oTE9DQUxFX05PVVNFUk9WRVJSSURFfExPQ0FMRV9VU0VfQ1BfQUNQKTsKCgkvKiBBcyBhbiBvcHRpb24sIHdlIGNvdWxkIG9idGFpbiB0aGUgdmFsdWUgZnJvbSB3aW4uaW5pLgoJICAgVGhpcyB3b3VsZCBub3QgbWF0Y2ggdGhlIFdpbmUgY29tcGlsZS10aW1lIG9wdGlvbi4KCSAgIEFsc28sIG5vdCBhbGwgaWRlbnRpZmllcnMgYXJlIGF2YWlsYWJsZSBmcm9tIHdpbi5pbmkgKi8KCXJldFN0cmluZz0wOwoJLyogSWYgd2UgYXJlIHRocm91Z2ggYWxsIG9mIHRoaXMsIHJldExlbiBzaG91bGQgbm90IGJlIHplcm8gYW55bW9yZS4KCSAgIElmIGl0IGlzLCB0aGUgdmFsdWUgaXMgbm90IHN1cHBvcnRlZCAqLwoJaT0wOwoJd2hpbGUgKGxvY2FsZV9uYW1lMmlkW2ldLm5hbWUhPU5VTEwpIHsKCQlpZiAoTENUeXBlID09IGxvY2FsZV9uYW1lMmlkW2ldLmlkKSB7CgkJCXJldFN0cmluZyA9IGxvY2FsZV9uYW1lMmlkW2ldLm5hbWU7CgkJCWJyZWFrOwoJCX0KCQlpKys7Cgl9CglpZiAoIXJldFN0cmluZykgewoJCVdBUk4ob2xlLCJVbmtvd24gTEMgdHlwZSAlbFhcbiIsTENUeXBlKTsKCQlyZXR1cm4gMDsKCX0KCiNkZWZpbmUgTE9DVkFMKHR5cGUsdmFsdWUpIGNhc2UgdHlwZTpyZXRTdHJpbmc9dmFsdWU7YnJlYWs7CgovKiBOb3csIHRoZSBsYW5ndWFnZSBzcGVjaWZpYyBkZWZpbml0aW9ucy4gVGhleSBkb24ndCBoYXZlIHRvIGJlCiAgIGNvbXBsZXRlICovCiAgICBmb3VuZD0xOwogICAgc3dpdGNoKE9wdGlvbnMubGFuZ3VhZ2UpCiAgICB7CiAgICBjYXNlIExBTkdfRGU6CiAgICAJc3dpdGNoIChMQ1R5cGUpIHsKI2luY2x1ZGUgIm5scy9kZXUubmxzIgoJZGVmYXVsdDogZm91bmQ9MDticmVhazsKCX0KICAgIGJyZWFrOyAgLyogTEFORyhEZSkgKi8KCiAgICBjYXNlIExBTkdfRGE6CiAgICAJc3dpdGNoIChMQ1R5cGUpIHsKI2luY2x1ZGUgIm5scy9kbmsubmxzIgoJZGVmYXVsdDogZm91bmQ9MDticmVhazsKCX0KICAgIGJyZWFrOyAvKiBMQU5HKERhKSAqLwoKICAgIGNhc2UgTEFOR19FbjoKICAgIAlzd2l0Y2ggKExDVHlwZSkgewojaW5jbHVkZSAibmxzL2VudS5ubHMiCglkZWZhdWx0OiBmb3VuZD0wO2JyZWFrOwoJfQogICAgYnJlYWs7ICAvKiBMQU5HKEVuKSAqLwoKICAgIGNhc2UgTEFOR19FbzoKICAgIAlzd2l0Y2ggKExDVHlwZSkgewojaW5jbHVkZSAibmxzL2VzcGVyYW50by5ubHMiCglkZWZhdWx0OiBmb3VuZD0wO2JyZWFrOwoJfQogICAgYnJlYWs7ICAvKiBMQU5HKEVvKSAqLwoKICAgIGNhc2UgTEFOR19GaToKICAgIAlzd2l0Y2ggKExDVHlwZSkgewojaW5jbHVkZSAibmxzL2Zpbi5ubHMiCglkZWZhdWx0OiBmb3VuZD0wO2JyZWFrOwoJfQogICAgYnJlYWs7ICAvKiBMQU5HKEZpKSAqLwoKICAgIGNhc2UgTEFOR19JdDoKICAgIAlzd2l0Y2ggKExDVHlwZSkgewojaW5jbHVkZSAibmxzL2l0YS5ubHMiCglkZWZhdWx0OiBmb3VuZD0wO2JyZWFrOwoJfQogICAgYnJlYWs7ICAvKiBMQU5HKEl0KSAqLwoKICAgIGNhc2UgMHgwODA5OgogICAgCXN3aXRjaCAoTENUeXBlKSB7CiNpbmNsdWRlICJubHMvZW5nLm5scyIKCWRlZmF1bHQ6IGZvdW5kPTA7YnJlYWs7Cgl9CiAgICBicmVhazsgLyogTEFORygweDA4MDkpIChVLksuIEVuZ2xpc2gpICovCgogICAgY2FzZSBMQU5HX0tvOiAvKiBzdHJpbmcgdXNpbmcgY29kZXBhZ2UgOTQ5ICovCiAgICAgICAgc3dpdGNoIChMQ1R5cGUpIHsKI2luY2x1ZGUgIm5scy9rb3IubmxzIgogICAgICAgIGRlZmF1bHQ6IGZvdW5kPTA7YnJlYWs7CiAgICAgICAgfQogICAgYnJlYWs7ICAvKiBMQU5HKEtvKSAqLwoKICAgIGNhc2UgTEFOR19IdToKICAgIAlzd2l0Y2ggKExDVHlwZSkgewojaW5jbHVkZSAibmxzL2h1bi5ubHMiCglkZWZhdWx0OiBmb3VuZD0wO2JyZWFrOwoJfQogICAgYnJlYWs7ICAvKiBMQU5HKEVuKSAqLwoKICAgIGNhc2UgTEFOR19QbDoKICAgIAlzd2l0Y2ggKExDVHlwZSkgewojaW5jbHVkZSAibmxzL3Bsay5ubHMiCglkZWZhdWx0OiBmb3VuZD0wO2JyZWFrOwoJfQogICAgYnJlYWs7ICAvKiBMQU5HKFBsKSAqLwoKICAgIGNhc2UgTEFOR19QbzoKICAgIAlzd2l0Y2ggKExDVHlwZSkgewojaW5jbHVkZSAibmxzL3B0Yi5ubHMiCglkZWZhdWx0OiBmb3VuZD0wO2JyZWFrOwoJfQogICAgYnJlYWs7IC8qIExBTkcoUG8pICovCgogICAgY2FzZSBMQU5HX1N3OgogICAgCXN3aXRjaCAoTENUeXBlKSB7CiNpbmNsdWRlICJubHMvc3ZlLm5scyIKCWRlZmF1bHQ6IGZvdW5kPTA7YnJlYWs7Cgl9CiAgICBicmVhazsgLyogTEFORyhTdykgKi8KCi8qSW5zZXJ0IG90aGVyIGxhbmd1YWdlcyBoZXJlKi8KCiAgICBkZWZhdWx0OgogICAgCWZvdW5kPTA7CglicmVhazsKICAgIH0gIC8qIHN3aXRjaCAqLwoKCWlmKCFmb3VuZCkgewoJCUVSUihvbGUsIiclcycgbm90IHN1cHBvcnRlZCBmb3IgeW91ciBsYW5ndWFnZS5cbiIsCgkJCXJldFN0cmluZyk7CgkJcmV0U3RyaW5nID0gIjxXSU5FLU5MUy11bmtub3duPiI7CgkJLypyZXR1cm4gMDsqLwoJfQoJaWYgKGJ1ZikKCQlsc3RyY3B5bjMyQShidWYscmV0U3RyaW5nLGxlbik7CglyZXR1cm4gc3RybGVuKHJldFN0cmluZykrMTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgR2V0TG9jYWxlSW5mbzMyVyAgICAgICAgICAgICAoS0VSTkVMMzIuMjMwKQogKiBJcyB0aGUgbGFzdCBwYXJhbWV0ZXIgcmVhbGx5IFdPUkQgZm9yIFdpbjE2PwogKi8KSU5UMzIgV0lOQVBJIEdldExvY2FsZUluZm8zMlcoTENJRCBsY2lkLExDVFlQRSBMQ1R5cGUsTFBXU1RSIHdidWYsSU5UMzIgbGVuKQp7CglMUFNUUiBhYnVmID0gKExQU1RSKUhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLDAsbGVuKTsKCglJTlQzMiBuID0gR2V0TG9jYWxlSW5mbzMyQShsY2lkLCBMQ1R5cGUsIGFidWYsIGxlbik7CglpZiAod2J1ZikKCQlsc3RyY3B5bkF0b1cod2J1ZixhYnVmLGxlbik7CglIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLDAsYWJ1Zik7CglyZXR1cm4gbjsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBTZXRMb2NhbGVJbmZvQSAgICAgICBbS0VSTkVMMzIuNDk5XQogKi8KQk9PTDE2IFdJTkFQSSBTZXRMb2NhbGVJbmZvQShEV09SRCBsY2lkLCBEV09SRCBsY3R5cGUsIExQQ1NUUiBkYXRhKQp7CiAgICBGSVhNRShvbGUsIiglbGQsJWxkLCVzKTogc3R1YlxuIixsY2lkLGxjdHlwZSxkYXRhKTsKICAgIHJldHVybiBUUlVFOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIElzVmFsaWRMb2NhbGUgICAgICAgW0tFUk5FTDMyLjM2MV0KICovCkJPT0wzMiBXSU5BUEkgSXNWYWxpZExvY2FsZShMQ0lEIGxjaWQsRFdPUkQgZmxhZ3MpCnsKCS8qIHdlIHN1cHBvcnQgQU5ZIGxhbmd1YWdlLiBXZWxsLCBhdCBsZWFzdCBzYXkgdGhhdC4uLiovCglyZXR1cm4gVFJVRTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICAgICBFbnVtU3lzdGVtTG9jYWxlczMyVyAgICAgICAgICAgICAgICBbS0VSTkVMMzIuOTNdCiAqLwpCT09MMzIgV0lOQVBJIEVudW1TeXN0ZW1Mb2NhbGVzMzJXKCBMT0NBTEVfRU5VTVBST0MzMlcgbHBmbkxvY2FsZUVudW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIGZsYWdzICkKewoJaW50CWk7CglCT09MMzIJcmV0OwoJV0NIQVIJYnVmZmVyWzIwMF07CglIS0VZCXhoa2V5OwoKCVRSQUNFKHdpbjMyLCIoJXAsJTA4bHgpXG4iLGxwZm5Mb2NhbGVFbnVtLGZsYWdzICk7CgkvKiBzZWUgaWYgd2UgY2FuIHJldXNlIHRoZSBXaW45NSByZWdpc3RyeSBlbnRyaWVzLi4uLiAqLwoJaWYgKEVSUk9SX1NVQ0NFU1M9PVJlZ09wZW5LZXkzMkEoSEtFWV9MT0NBTF9NQUNISU5FLCJcXFN5c3RlbVxcQ3VycmVudENvbnRyb2xTZXRcXGNvbnRyb2xcXE5sc1xcTG9jYWxlXFwiLCZ4aGtleSkpIHsKCQlpPTA7CgkJd2hpbGUgKDEpIHsKCQkJaWYgKEVSUk9SX1NVQ0NFU1MhPVJlZ0VudW1LZXkzMlcoeGhrZXksaSxidWZmZXIsc2l6ZW9mKGJ1ZmZlcikpKQoJCQkJYnJlYWs7CiAgICAgICAgICAgIAkJaWYgKCFscGZuTG9jYWxlRW51bShidWZmZXIpKQoJCQkJYnJlYWs7CgkJCWkrKzsKCQl9CgkJUmVnQ2xvc2VLZXkoeGhrZXkpOwoJCXJldHVybiBUUlVFOwoJfQoKCWk9MDsKCXdoaWxlIChsYW5ndWFnZXNbaV0ubGFuZ25hbWUhPU5VTEwpCiAgICAgICAgewogICAgICAgICAgICBMUFdTVFIgY3A7CgkgICAgY2hhciAgIHhidWZmZXJbMTBdOwogIAkKCSAgICBzcHJpbnRmKHhidWZmZXIsIiUwOGx4IiwoRFdPUkQpbGFuZ3VhZ2VzW2ldLmxhbmdpZCk7CgoJICAgIGNwID0gSEVBUF9zdHJkdXBBdG9XKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCB4YnVmZmVyICk7CiAgICAgICAgICAgIHJldCA9IGxwZm5Mb2NhbGVFbnVtKGNwKTsKICAgICAgICAgICAgSGVhcEZyZWUoIEdldFByb2Nlc3NIZWFwKCksIDAsIGNwICk7CiAgICAgICAgICAgIGlmICghcmV0KSBicmVhazsKICAgICAgICAgICAgaSsrOwoJfQoJcmV0dXJuIFRSVUU7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICAgRW51bVN5c3RlbUxvY2FsZXMzMkEgICAgICAgICAgICAgICAgW0tFUk5FTDMyLjkyXQogKi8KQk9PTDMyIFdJTkFQSSBFbnVtU3lzdGVtTG9jYWxlczMyQShMT0NBTEVfRU5VTVBST0MzMkEgbHBmbkxvY2FsZUVudW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgZmxhZ3MpCnsKCWludAlpOwoJQ0hBUglidWZmZXJbMjAwXTsKCUhLRVkJeGhrZXk7CgoJVFJBQ0Uod2luMzIsIiglcCwlMDhseClcbiIsCgkJbHBmbkxvY2FsZUVudW0sZmxhZ3MKCSk7CglpZiAoRVJST1JfU1VDQ0VTUz09UmVnT3BlbktleTMyQShIS0VZX0xPQ0FMX01BQ0hJTkUsIlxcU3lzdGVtXFxDdXJyZW50Q29udHJvbFNldFxcY29udHJvbFxcTmxzXFxMb2NhbGVcXCIsJnhoa2V5KSkgewoJCWk9MDsKCQl3aGlsZSAoMSkgewoJCQlpZiAoRVJST1JfU1VDQ0VTUyE9UmVnRW51bUtleTMyQSh4aGtleSxpLGJ1ZmZlcixzaXplb2YoYnVmZmVyKSkpCgkJCQlicmVhazsKICAgICAgICAgICAgCQlpZiAoIWxwZm5Mb2NhbGVFbnVtKGJ1ZmZlcikpCgkJCQlicmVhazsKCQkJaSsrOwoJCX0KCQlSZWdDbG9zZUtleSh4aGtleSk7CgkJcmV0dXJuIFRSVUU7Cgl9CglpPTA7Cgl3aGlsZSAobGFuZ3VhZ2VzW2ldLmxhbmduYW1lIT1OVUxMKSB7CgkJc3ByaW50ZihidWZmZXIsIiUwOGx4IiwoRFdPUkQpbGFuZ3VhZ2VzW2ldLmxhbmdpZCk7CgkJaWYgKCFscGZuTG9jYWxlRW51bShidWZmZXIpKQoJCQlicmVhazsKCQlpKys7Cgl9CglyZXR1cm4gVFJVRTsKfQoKc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgQ1RfQ1R5cGUyX0xVVFtdID0gewogIEMyX05PVEFQUExJQ0FCTEUsIC8qICAgLSAgIDAgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiAgIC0gICAxICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogICAtICAgMiAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qICAgLSAgIDMgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiAgIC0gICA0ICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogICAtICAgNSAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qICAgLSAgIDYgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiAgIC0gICA3ICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogICAtICAgOCAqLwogIEMyX1NFR01FTlRTRVBBUkFUT1IsIC8qICAgLSAgIDkgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiAgIC0gIDEwICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogICAtICAxMSAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qICAgLSAgMTIgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiAgIC0gIDEzICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogICAtICAxNCAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qICAgLSAgMTUgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiAgIC0gIDE2ICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogICAtICAxNyAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qICAgLSAgMTggKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiAgIC0gIDE5ICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogICAtICAyMCAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qICAgLSAgMjEgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiAgIC0gIDIyICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogICAtICAyMyAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qICAgLSAgMjQgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiAgIC0gIDI1ICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogICAtICAyNiAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qICAgLSAgMjcgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiAgIC0gIDI4ICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogICAtICAyOSAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qICAgLSAgMzAgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiAgIC0gIDMxICovCiAgQzJfV0hJVEVTUEFDRSwgLyogICAtICAzMiAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogISAtICAzMyAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogIiAtICAzNCAqLyAvKiAiICovCiAgQzJfRVVST1BFVEVSTUlOQVRPUiwgLyogIyAtICAzNSAqLwogIEMyX0VVUk9QRVRFUk1JTkFUT1IsIC8qICQgLSAgMzYgKi8KICBDMl9FVVJPUEVURVJNSU5BVE9SLCAvKiAlIC0gIDM3ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qICYgLSAgMzggKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qICcgLSAgMzkgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qICggLSAgNDAgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qICkgLSAgNDEgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qICogLSAgNDIgKi8KICBDMl9FVVJPUEVURVJNSU5BVE9SLCAvKiArIC0gIDQzICovCiAgQzJfQ09NTU9OU0VQQVJBVE9SLCAvKiAsIC0gIDQ0ICovCiAgQzJfRVVST1BFVEVSTUlOQVRPUiwgLyogLSAtICA0NSAqLwogIEMyX0VVUk9QRVNFUEFSQVRPUiwgLyogLiAtICA0NiAqLwogIEMyX0VVUk9QRVNFUEFSQVRPUiwgLyogLyAtICA0NyAqLwogIEMyX0VVUk9QRU5VTUJFUiwgLyogMCAtICA0OCAqLwogIEMyX0VVUk9QRU5VTUJFUiwgLyogMSAtICA0OSAqLwogIEMyX0VVUk9QRU5VTUJFUiwgLyogMiAtICA1MCAqLwogIEMyX0VVUk9QRU5VTUJFUiwgLyogMyAtICA1MSAqLwogIEMyX0VVUk9QRU5VTUJFUiwgLyogNCAtICA1MiAqLwogIEMyX0VVUk9QRU5VTUJFUiwgLyogNSAtICA1MyAqLwogIEMyX0VVUk9QRU5VTUJFUiwgLyogNiAtICA1NCAqLwogIEMyX0VVUk9QRU5VTUJFUiwgLyogNyAtICA1NSAqLwogIEMyX0VVUk9QRU5VTUJFUiwgLyogOCAtICA1NiAqLwogIEMyX0VVUk9QRU5VTUJFUiwgLyogOSAtICA1NyAqLwogIEMyX0NPTU1PTlNFUEFSQVRPUiwgLyogOiAtICA1OCAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogOyAtICA1OSAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogPCAtICA2MCAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogPSAtICA2MSAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogPiAtICA2MiAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogPyAtICA2MyAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBAIC0gIDY0ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIEEgLSAgNjUgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogQiAtICA2NiAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBDIC0gIDY3ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIEQgLSAgNjggKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogRSAtICA2OSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBGIC0gIDcwICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIEcgLSAgNzEgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogSCAtICA3MiAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBJIC0gIDczICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIEogLSAgNzQgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogSyAtICA3NSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBMIC0gIDc2ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIE0gLSAgNzcgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogTiAtICA3OCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBPIC0gIDc5ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIFAgLSAgODAgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogUSAtICA4MSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBSIC0gIDgyICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIFMgLSAgODMgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogVCAtICA4NCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBVIC0gIDg1ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIFYgLSAgODYgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogVyAtICA4NyAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBYIC0gIDg4ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIFkgLSAgODkgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogWiAtICA5MCAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogWyAtICA5MSAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogXCAtICA5MiAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogXSAtICA5MyAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogXiAtICA5NCAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogXyAtICA5NSAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogYCAtICA5NiAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBhIC0gIDk3ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIGIgLSAgOTggKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogYyAtICA5OSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBkIC0gMTAwICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIGUgLSAxMDEgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogZiAtIDEwMiAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBnIC0gMTAzICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIGggLSAxMDQgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogaSAtIDEwNSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBqIC0gMTA2ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIGsgLSAxMDcgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogbCAtIDEwOCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBtIC0gMTA5ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIG4gLSAxMTAgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogbyAtIDExMSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBwIC0gMTEyICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIHEgLSAxMTMgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogciAtIDExNCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBzIC0gMTE1ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIHQgLSAxMTYgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogdSAtIDExNyAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiB2IC0gMTE4ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIHcgLSAxMTkgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogeCAtIDEyMCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiB5IC0gMTIxICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIHogLSAxMjIgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIHsgLSAxMjMgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIHwgLSAxMjQgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIH0gLSAxMjUgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIH4gLSAxMjYgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiB/IC0gMTI3ICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyoggCAtIDEyOCAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qIIEgLSAxMjkgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIIIgLSAxMzAgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyoggyAtIDEzMSAqLwogIEMyX09USEVSTkVVVFJBTCwgLyoghCAtIDEzMiAqLwogIEMyX09USEVSTkVVVFJBTCwgLyoghSAtIDEzMyAqLwogIEMyX09USEVSTkVVVFJBTCwgLyoghiAtIDEzNCAqLwogIEMyX09USEVSTkVVVFJBTCwgLyoghyAtIDEzNSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiCIIC0gMTM2ICovCiAgQzJfRVVST1BFVEVSTUlOQVRPUiwgLyogiSAtIDEzNyAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiCKIC0gMTM4ICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiCLIC0gMTM5ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIIwgLSAxNDAgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiCNIC0gMTQxICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogjiAtIDE0MiAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qII8gLSAxNDMgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiCQIC0gMTQ0ICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiCRIC0gMTQ1ICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiCSIC0gMTQ2ICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiCTIC0gMTQ3ICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiCUIC0gMTQ4ICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiCVIC0gMTQ5ICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiCWIC0gMTUwICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiCXIC0gMTUxICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIJggLSAxNTIgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIJkgLSAxNTMgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogmiAtIDE1NCAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogmyAtIDE1NSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiCcIC0gMTU2ICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyognSAtIDE1NyAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qIJ4gLSAxNTggKi8KICBDMl9MRUZUVE9SSUdIVCwgLyognyAtIDE1OSAqLwogIEMyX1dISVRFU1BBQ0UsIC8qIKAgLSAxNjAgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIKEgLSAxNjEgKi8KICBDMl9FVVJPUEVURVJNSU5BVE9SLCAvKiCiIC0gMTYyICovCiAgQzJfRVVST1BFVEVSTUlOQVRPUiwgLyogoyAtIDE2MyAqLwogIEMyX0VVUk9QRVRFUk1JTkFUT1IsIC8qIKQgLSAxNjQgKi8KICBDMl9FVVJPUEVURVJNSU5BVE9SLCAvKiClIC0gMTY1ICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiCmIC0gMTY2ICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiCnIC0gMTY3ICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiCoIC0gMTY4ICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiCpIC0gMTY5ICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiCqIC0gMTcwICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiCrIC0gMTcxICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiCsIC0gMTcyICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiCtIC0gMTczICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiCuIC0gMTc0ICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiCvIC0gMTc1ICovCiAgQzJfRVVST1BFVEVSTUlOQVRPUiwgLyogsCAtIDE3NiAqLwogIEMyX0VVUk9QRVRFUk1JTkFUT1IsIC8qILEgLSAxNzcgKi8KICBDMl9FVVJPUEVOVU1CRVIsIC8qILIgLSAxNzggKi8KICBDMl9FVVJPUEVOVU1CRVIsIC8qILMgLSAxNzkgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qILQgLSAxODAgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qILUgLSAxODEgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qILYgLSAxODIgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qILcgLSAxODMgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qILggLSAxODQgKi8KICBDMl9FVVJPUEVOVU1CRVIsIC8qILkgLSAxODUgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qILogLSAxODYgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qILsgLSAxODcgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qILwgLSAxODggKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIL0gLSAxODkgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIL4gLSAxOTAgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIL8gLSAxOTEgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogwCAtIDE5MiAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDBIC0gMTkzICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIMIgLSAxOTQgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogwyAtIDE5NSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDEIC0gMTk2ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIMUgLSAxOTcgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogxiAtIDE5OCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDHIC0gMTk5ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIMggLSAyMDAgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogySAtIDIwMSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDKIC0gMjAyICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIMsgLSAyMDMgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogzCAtIDIwNCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDNIC0gMjA1ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIM4gLSAyMDYgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogzyAtIDIwNyAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDQIC0gMjA4ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qINEgLSAyMDkgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog0iAtIDIxMCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDTIC0gMjExICovCiAgQzJfTEVGVFRPUklHSFQsIC8qINQgLSAyMTIgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog1SAtIDIxMyAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDWIC0gMjE0ICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiDXIC0gMjE1ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qINggLSAyMTYgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog2SAtIDIxNyAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDaIC0gMjE4ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qINsgLSAyMTkgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog3CAtIDIyMCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDdIC0gMjIxICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIN4gLSAyMjIgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog3yAtIDIyMyAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDgIC0gMjI0ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIOEgLSAyMjUgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog4iAtIDIyNiAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDjIC0gMjI3ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIOQgLSAyMjggKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog5SAtIDIyOSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDmIC0gMjMwICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIOcgLSAyMzEgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog6CAtIDIzMiAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDpIC0gMjMzICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIOogLSAyMzQgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog6yAtIDIzNSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDsIC0gMjM2ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIO0gLSAyMzcgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog7iAtIDIzOCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDvIC0gMjM5ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIPAgLSAyNDAgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog8SAtIDI0MSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDyIC0gMjQyICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIPMgLSAyNDMgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog9CAtIDI0NCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiD1IC0gMjQ1ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIPYgLSAyNDYgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIPcgLSAyNDcgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog+CAtIDI0OCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiD5IC0gMjQ5ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIPogLSAyNTAgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog+yAtIDI1MSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiD8IC0gMjUyICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIP0gLSAyNTMgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog/iAtIDI1NCAqLwogIEMyX0xFRlRUT1JJR0hUIC8qIP8gLSAyNTUgKi8KfTsKCnN0YXRpYyBjb25zdCBXT1JEIENUX0NUeXBlM19MVVRbXSA9IHsgCiAgMHgwMDAwLCAvKiAgIC0gICAwICovCiAgMHgwMDAwLCAvKiAgIC0gICAxICovCiAgMHgwMDAwLCAvKiAgIC0gICAyICovCiAgMHgwMDAwLCAvKiAgIC0gICAzICovCiAgMHgwMDAwLCAvKiAgIC0gICA0ICovCiAgMHgwMDAwLCAvKiAgIC0gICA1ICovCiAgMHgwMDAwLCAvKiAgIC0gICA2ICovCiAgMHgwMDAwLCAvKiAgIC0gICA3ICovCiAgMHgwMDAwLCAvKiAgIC0gICA4ICovCiAgMHgwMDA4LCAvKiAgIC0gICA5ICovCiAgMHgwMDA4LCAvKiAgIC0gIDEwICovCiAgMHgwMDA4LCAvKiAgIC0gIDExICovCiAgMHgwMDA4LCAvKiAgIC0gIDEyICovCiAgMHgwMDA4LCAvKiAgIC0gIDEzICovCiAgMHgwMDAwLCAvKiAgIC0gIDE0ICovCiAgMHgwMDAwLCAvKiAgIC0gIDE1ICovCiAgMHgwMDAwLCAvKiAgIC0gIDE2ICovCiAgMHgwMDAwLCAvKiAgIC0gIDE3ICovCiAgMHgwMDAwLCAvKiAgIC0gIDE4ICovCiAgMHgwMDAwLCAvKiAgIC0gIDE5ICovCiAgMHgwMDAwLCAvKiAgIC0gIDIwICovCiAgMHgwMDAwLCAvKiAgIC0gIDIxICovCiAgMHgwMDAwLCAvKiAgIC0gIDIyICovCiAgMHgwMDAwLCAvKiAgIC0gIDIzICovCiAgMHgwMDAwLCAvKiAgIC0gIDI0ICovCiAgMHgwMDAwLCAvKiAgIC0gIDI1ICovCiAgMHgwMDAwLCAvKiAgIC0gIDI2ICovCiAgMHgwMDAwLCAvKiAgIC0gIDI3ICovCiAgMHgwMDAwLCAvKiAgIC0gIDI4ICovCiAgMHgwMDAwLCAvKiAgIC0gIDI5ICovCiAgMHgwMDAwLCAvKiAgIC0gIDMwICovCiAgMHgwMDAwLCAvKiAgIC0gIDMxICovCiAgMHgwMDQ4LCAvKiAgIC0gIDMyICovCiAgMHgwMDQ4LCAvKiAhIC0gIDMzICovCiAgMHgwNDQ4LCAvKiAiIC0gIDM0ICovIC8qICIgKi8KICAweDAwNDgsIC8qICMgLSAgMzUgKi8KICAweDA0NDgsIC8qICQgLSAgMzYgKi8KICAweDAwNDgsIC8qICUgLSAgMzcgKi8KICAweDAwNDgsIC8qICYgLSAgMzggKi8KICAweDA0NDAsIC8qICcgLSAgMzkgKi8KICAweDAwNDgsIC8qICggLSAgNDAgKi8KICAweDAwNDgsIC8qICkgLSAgNDEgKi8KICAweDAwNDgsIC8qICogLSAgNDIgKi8KICAweDAwNDgsIC8qICsgLSAgNDMgKi8KICAweDAwNDgsIC8qICwgLSAgNDQgKi8KICAweDA0NDAsIC8qIC0gLSAgNDUgKi8KICAweDAwNDgsIC8qIC4gLSAgNDYgKi8KICAweDA0NDgsIC8qIC8gLSAgNDcgKi8KICAweDAwNDAsIC8qIDAgLSAgNDggKi8KICAweDAwNDAsIC8qIDEgLSAgNDkgKi8KICAweDAwNDAsIC8qIDIgLSAgNTAgKi8KICAweDAwNDAsIC8qIDMgLSAgNTEgKi8KICAweDAwNDAsIC8qIDQgLSAgNTIgKi8KICAweDAwNDAsIC8qIDUgLSAgNTMgKi8KICAweDAwNDAsIC8qIDYgLSAgNTQgKi8KICAweDAwNDAsIC8qIDcgLSAgNTUgKi8KICAweDAwNDAsIC8qIDggLSAgNTYgKi8KICAweDAwNDAsIC8qIDkgLSAgNTcgKi8KICAweDAwNDgsIC8qIDogLSAgNTggKi8KICAweDAwNDgsIC8qIDsgLSAgNTkgKi8KICAweDAwNDgsIC8qIDwgLSAgNjAgKi8KICAweDA0NDgsIC8qID0gLSAgNjEgKi8KICAweDAwNDgsIC8qID4gLSAgNjIgKi8KICAweDAwNDgsIC8qID8gLSAgNjMgKi8KICAweDA0NDgsIC8qIEAgLSAgNjQgKi8KICAweDgwNDAsIC8qIEEgLSAgNjUgKi8KICAweDgwNDAsIC8qIEIgLSAgNjYgKi8KICAweDgwNDAsIC8qIEMgLSAgNjcgKi8KICAweDgwNDAsIC8qIEQgLSAgNjggKi8KICAweDgwNDAsIC8qIEUgLSAgNjkgKi8KICAweDgwNDAsIC8qIEYgLSAgNzAgKi8KICAweDgwNDAsIC8qIEcgLSAgNzEgKi8KICAweDgwNDAsIC8qIEggLSAgNzIgKi8KICAweDgwNDAsIC8qIEkgLSAgNzMgKi8KICAweDgwNDAsIC8qIEogLSAgNzQgKi8KICAweDgwNDAsIC8qIEsgLSAgNzUgKi8KICAweDgwNDAsIC8qIEwgLSAgNzYgKi8KICAweDgwNDAsIC8qIE0gLSAgNzcgKi8KICAweDgwNDAsIC8qIE4gLSAgNzggKi8KICAweDgwNDAsIC8qIE8gLSAgNzkgKi8KICAweDgwNDAsIC8qIFAgLSAgODAgKi8KICAweDgwNDAsIC8qIFEgLSAgODEgKi8KICAweDgwNDAsIC8qIFIgLSAgODIgKi8KICAweDgwNDAsIC8qIFMgLSAgODMgKi8KICAweDgwNDAsIC8qIFQgLSAgODQgKi8KICAweDgwNDAsIC8qIFUgLSAgODUgKi8KICAweDgwNDAsIC8qIFYgLSAgODYgKi8KICAweDgwNDAsIC8qIFcgLSAgODcgKi8KICAweDgwNDAsIC8qIFggLSAgODggKi8KICAweDgwNDAsIC8qIFkgLSAgODkgKi8KICAweDgwNDAsIC8qIFogLSAgOTAgKi8KICAweDAwNDgsIC8qIFsgLSAgOTEgKi8KICAweDA0NDgsIC8qIFwgLSAgOTIgKi8KICAweDAwNDgsIC8qIF0gLSAgOTMgKi8KICAweDA0NDgsIC8qIF4gLSAgOTQgKi8KICAweDA0NDgsIC8qIF8gLSAgOTUgKi8KICAweDA0NDgsIC8qIGAgLSAgOTYgKi8KICAweDgwNDAsIC8qIGEgLSAgOTcgKi8KICAweDgwNDAsIC8qIGIgLSAgOTggKi8KICAweDgwNDAsIC8qIGMgLSAgOTkgKi8KICAweDgwNDAsIC8qIGQgLSAxMDAgKi8KICAweDgwNDAsIC8qIGUgLSAxMDEgKi8KICAweDgwNDAsIC8qIGYgLSAxMDIgKi8KICAweDgwNDAsIC8qIGcgLSAxMDMgKi8KICAweDgwNDAsIC8qIGggLSAxMDQgKi8KICAweDgwNDAsIC8qIGkgLSAxMDUgKi8KICAweDgwNDAsIC8qIGogLSAxMDYgKi8KICAweDgwNDAsIC8qIGsgLSAxMDcgKi8KICAweDgwNDAsIC8qIGwgLSAxMDggKi8KICAweDgwNDAsIC8qIG0gLSAxMDkgKi8KICAweDgwNDAsIC8qIG4gLSAxMTAgKi8KICAweDgwNDAsIC8qIG8gLSAxMTEgKi8KICAweDgwNDAsIC8qIHAgLSAxMTIgKi8KICAweDgwNDAsIC8qIHEgLSAxMTMgKi8KICAweDgwNDAsIC8qIHIgLSAxMTQgKi8KICAweDgwNDAsIC8qIHMgLSAxMTUgKi8KICAweDgwNDAsIC8qIHQgLSAxMTYgKi8KICAweDgwNDAsIC8qIHUgLSAxMTcgKi8KICAweDgwNDAsIC8qIHYgLSAxMTggKi8KICAweDgwNDAsIC8qIHcgLSAxMTkgKi8KICAweDgwNDAsIC8qIHggLSAxMjAgKi8KICAweDgwNDAsIC8qIHkgLSAxMjEgKi8KICAweDgwNDAsIC8qIHogLSAxMjIgKi8KICAweDAwNDgsIC8qIHsgLSAxMjMgKi8KICAweDAwNDgsIC8qIHwgLSAxMjQgKi8KICAweDAwNDgsIC8qIH0gLSAxMjUgKi8KICAweDA0NDgsIC8qIH4gLSAxMjYgKi8KICAweDAwMDAsIC8qIH8gLSAxMjcgKi8KICAweDAwMDAsIC8qIIAgLSAxMjggKi8KICAweDAwMDAsIC8qIIEgLSAxMjkgKi8KICAweDAwMDgsIC8qIIIgLSAxMzAgKi8KICAweDgwMDAsIC8qIIMgLSAxMzEgKi8KICAweDAwMDgsIC8qIIQgLSAxMzIgKi8KICAweDAwMDgsIC8qIIUgLSAxMzMgKi8KICAweDAwMDgsIC8qIIYgLSAxMzQgKi8KICAweDAwMDgsIC8qIIcgLSAxMzUgKi8KICAweDAwMDEsIC8qIIggLSAxMzYgKi8KICAweDAwMDgsIC8qIIkgLSAxMzcgKi8KICAweDgwMDMsIC8qIIogLSAxMzggKi8KICAweDAwMDgsIC8qIIsgLSAxMzkgKi8KICAweDgwMDAsIC8qIIwgLSAxNDAgKi8KICAweDAwMDAsIC8qII0gLSAxNDEgKi8KICAweDAwMDAsIC8qII4gLSAxNDIgKi8KICAweDAwMDAsIC8qII8gLSAxNDMgKi8KICAweDAwMDAsIC8qIJAgLSAxNDQgKi8KICAweDAwODgsIC8qIJEgLSAxNDUgKi8KICAweDAwODgsIC8qIJIgLSAxNDYgKi8KICAweDAwODgsIC8qIJMgLSAxNDcgKi8KICAweDAwODgsIC8qIJQgLSAxNDggKi8KICAweDAwMDgsIC8qIJUgLSAxNDkgKi8KICAweDA0MDAsIC8qIJYgLSAxNTAgKi8KICAweDA0MDAsIC8qIJcgLSAxNTEgKi8KICAweDA0MDgsIC8qIJggLSAxNTIgKi8KICAweDAwMDAsIC8qIJkgLSAxNTMgKi8KICAweDgwMDMsIC8qIJogLSAxNTQgKi8KICAweDAwMDgsIC8qIJsgLSAxNTUgKi8KICAweDgwMDAsIC8qIJwgLSAxNTYgKi8KICAweDAwMDAsIC8qIJ0gLSAxNTcgKi8KICAweDAwMDAsIC8qIJ4gLSAxNTggKi8KICAweDgwMDMsIC8qIJ8gLSAxNTkgKi8KICAweDAwMDgsIC8qIKAgLSAxNjAgKi8KICAweDAwMDgsIC8qIKEgLSAxNjEgKi8KICAweDAwNDgsIC8qIKIgLSAxNjIgKi8KICAweDAwNDgsIC8qIKMgLSAxNjMgKi8KICAweDAwMDgsIC8qIKQgLSAxNjQgKi8KICAweDAwNDgsIC8qIKUgLSAxNjUgKi8KICAweDAwNDgsIC8qIKYgLSAxNjYgKi8KICAweDAwMDgsIC8qIKcgLSAxNjcgKi8KICAweDA0MDgsIC8qIKggLSAxNjggKi8KICAweDAwMDgsIC8qIKkgLSAxNjkgKi8KICAweDA0MDAsIC8qIKogLSAxNzAgKi8KICAweDAwMDgsIC8qIKsgLSAxNzEgKi8KICAweDAwNDgsIC8qIKwgLSAxNzIgKi8KICAweDA0MDgsIC8qIK0gLSAxNzMgKi8KICAweDAwMDgsIC8qIK4gLSAxNzQgKi8KICAweDA0NDgsIC8qIK8gLSAxNzUgKi8KICAweDAwMDgsIC8qILAgLSAxNzYgKi8KICAweDAwMDgsIC8qILEgLSAxNzcgKi8KICAweDAwMDAsIC8qILIgLSAxNzggKi8KICAweDAwMDAsIC8qILMgLSAxNzkgKi8KICAweDA0MDgsIC8qILQgLSAxODAgKi8KICAweDAwMDgsIC8qILUgLSAxODEgKi8KICAweDAwMDgsIC8qILYgLSAxODIgKi8KICAweDAwMDgsIC8qILcgLSAxODMgKi8KICAweDA0MDgsIC8qILggLSAxODQgKi8KICAweDAwMDAsIC8qILkgLSAxODUgKi8KICAweDA0MDAsIC8qILogLSAxODYgKi8KICAweDAwMDgsIC8qILsgLSAxODcgKi8KICAweDAwMDAsIC8qILwgLSAxODggKi8KICAweDAwMDAsIC8qIL0gLSAxODkgKi8KICAweDAwMDAsIC8qIL4gLSAxOTAgKi8KICAweDAwMDgsIC8qIL8gLSAxOTEgKi8KICAweDgwMDMsIC8qIMAgLSAxOTIgKi8KICAweDgwMDMsIC8qIMEgLSAxOTMgKi8KICAweDgwMDMsIC8qIMIgLSAxOTQgKi8KICAweDgwMDMsIC8qIMMgLSAxOTUgKi8KICAweDgwMDMsIC8qIMQgLSAxOTYgKi8KICAweDgwMDMsIC8qIMUgLSAxOTcgKi8KICAweDgwMDAsIC8qIMYgLSAxOTggKi8KICAweDgwMDMsIC8qIMcgLSAxOTkgKi8KICAweDgwMDMsIC8qIMggLSAyMDAgKi8KICAweDgwMDMsIC8qIMkgLSAyMDEgKi8KICAweDgwMDMsIC8qIMogLSAyMDIgKi8KICAweDgwMDMsIC8qIMsgLSAyMDMgKi8KICAweDgwMDMsIC8qIMwgLSAyMDQgKi8KICAweDgwMDMsIC8qIM0gLSAyMDUgKi8KICAweDgwMDMsIC8qIM4gLSAyMDYgKi8KICAweDgwMDMsIC8qIM8gLSAyMDcgKi8KICAweDgwMDAsIC8qINAgLSAyMDggKi8KICAweDgwMDMsIC8qINEgLSAyMDkgKi8KICAweDgwMDMsIC8qINIgLSAyMTAgKi8KICAweDgwMDMsIC8qINMgLSAyMTEgKi8KICAweDgwMDMsIC8qINQgLSAyMTIgKi8KICAweDgwMDMsIC8qINUgLSAyMTMgKi8KICAweDgwMDMsIC8qINYgLSAyMTQgKi8KICAweDAwMDgsIC8qINcgLSAyMTUgKi8KICAweDgwMDMsIC8qINggLSAyMTYgKi8KICAweDgwMDMsIC8qINkgLSAyMTcgKi8KICAweDgwMDMsIC8qINogLSAyMTggKi8KICAweDgwMDMsIC8qINsgLSAyMTkgKi8KICAweDgwMDMsIC8qINwgLSAyMjAgKi8KICAweDgwMDMsIC8qIN0gLSAyMjEgKi8KICAweDgwMDAsIC8qIN4gLSAyMjIgKi8KICAweDgwMDAsIC8qIN8gLSAyMjMgKi8KICAweDgwMDMsIC8qIOAgLSAyMjQgKi8KICAweDgwMDMsIC8qIOEgLSAyMjUgKi8KICAweDgwMDMsIC8qIOIgLSAyMjYgKi8KICAweDgwMDMsIC8qIOMgLSAyMjcgKi8KICAweDgwMDMsIC8qIOQgLSAyMjggKi8KICAweDgwMDMsIC8qIOUgLSAyMjkgKi8KICAweDgwMDAsIC8qIOYgLSAyMzAgKi8KICAweDgwMDMsIC8qIOcgLSAyMzEgKi8KICAweDgwMDMsIC8qIOggLSAyMzIgKi8KICAweDgwMDMsIC8qIOkgLSAyMzMgKi8KICAweDgwMDMsIC8qIOogLSAyMzQgKi8KICAweDgwMDMsIC8qIOsgLSAyMzUgKi8KICAweDgwMDMsIC8qIOwgLSAyMzYgKi8KICAweDgwMDMsIC8qIO0gLSAyMzcgKi8KICAweDgwMDMsIC8qIO4gLSAyMzggKi8KICAweDgwMDMsIC8qIO8gLSAyMzkgKi8KICAweDgwMDAsIC8qIPAgLSAyNDAgKi8KICAweDgwMDMsIC8qIPEgLSAyNDEgKi8KICAweDgwMDMsIC8qIPIgLSAyNDIgKi8KICAweDgwMDMsIC8qIPMgLSAyNDMgKi8KICAweDgwMDMsIC8qIPQgLSAyNDQgKi8KICAweDgwMDMsIC8qIPUgLSAyNDUgKi8KICAweDgwMDMsIC8qIPYgLSAyNDYgKi8KICAweDAwMDgsIC8qIPcgLSAyNDcgKi8KICAweDgwMDMsIC8qIPggLSAyNDggKi8KICAweDgwMDMsIC8qIPkgLSAyNDkgKi8KICAweDgwMDMsIC8qIPogLSAyNTAgKi8KICAweDgwMDMsIC8qIPsgLSAyNTEgKi8KICAweDgwMDMsIC8qIPwgLSAyNTIgKi8KICAweDgwMDMsIC8qIP0gLSAyNTMgKi8KICAweDgwMDAsIC8qIP4gLSAyNTQgKi8KICAweDgwMDMgIC8qIP8gLSAyNTUgKi8KfTsKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICAgR2V0U3RyaW5nVHlwZUEgICAgICAgICAgICAgICAgW09MRTJOTFMuN10KICovCkJPT0wxNiBXSU5BUEkgR2V0U3RyaW5nVHlwZTE2KExDSUQgbG9jYWxlLERXT1JEIGR3SW5mb1R5cGUsTFBDU1RSIHNyYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UMTYgY2NoU3JjLExQV09SRCBjaGFydHlwZSkKewoJcmV0dXJuIEdldFN0cmluZ1R5cGVFeDMyQShsb2NhbGUsZHdJbmZvVHlwZSxzcmMsY2NoU3JjLGNoYXJ0eXBlKTsKfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgICAgIEdldFN0cmluZ1R5cGVBICAgICAgICAgICAgICAgIFtLRVJORUwzMi4yNzddCiAqLwpCT09MMzIgV0lOQVBJIEdldFN0cmluZ1R5cGUzMkEoTENJRCBsb2NhbGUsRFdPUkQgZHdJbmZvVHlwZSxMUENTVFIgc3JjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UMzIgY2NoU3JjLExQV09SRCBjaGFydHlwZSkKewoJcmV0dXJuIEdldFN0cmluZ1R5cGVFeDMyQShsb2NhbGUsZHdJbmZvVHlwZSxzcmMsY2NoU3JjLGNoYXJ0eXBlKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICAgICBHZXRTdHJpbmdUeXBlRXhBICAgICAgICAgICAgICAgIFtLRVJORUwzMi4yNzZdCiAqCiAqIEZJWE1FOiBJZ25vcmVzIHRoZSBsb2NhbGUuCiAqLwpCT09MMzIgV0lOQVBJIEdldFN0cmluZ1R5cGVFeDMyQShMQ0lEIGxvY2FsZSxEV09SRCBkd0luZm9UeXBlLExQQ1NUUiBzcmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVDMyIGNjaFNyYyxMUFdPUkQgY2hhcnR5cGUpCnsKCWludAlpOwoJCglpZiAoKHNyYz09TlVMTCkgfHwgKGNoYXJ0eXBlPT1OVUxMKSB8fCAoc3JjPT0oTFBTVFIpY2hhcnR5cGUpKQoJewoJICBTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOwoJICByZXR1cm4gRkFMU0U7Cgl9CgoJaWYgKGNjaFNyYz09LTEpCgkgIGNjaFNyYz1sc3RybGVuMzJBKHNyYykrMTsKCSAgCglzd2l0Y2ggKGR3SW5mb1R5cGUpIHsKCWNhc2UgQ1RfQ1RZUEUxOgoJICBmb3IgKGk9MDtpPGNjaFNyYztpKyspIAoJICB7CgkgICAgY2hhcnR5cGVbaV0gPSAwOwoJICAgIGlmIChpc2RpZ2l0KHNyY1tpXSkpIGNoYXJ0eXBlW2ldfD1DMV9ESUdJVDsKCSAgICBpZiAoaXNhbHBoYShzcmNbaV0pKSBjaGFydHlwZVtpXXw9QzFfQUxQSEE7CgkgICAgaWYgKGlzbG93ZXIoc3JjW2ldKSkgY2hhcnR5cGVbaV18PUMxX0xPV0VSOwoJICAgIGlmIChpc3VwcGVyKHNyY1tpXSkpIGNoYXJ0eXBlW2ldfD1DMV9VUFBFUjsKCSAgICBpZiAoaXNzcGFjZShzcmNbaV0pKSBjaGFydHlwZVtpXXw9QzFfU1BBQ0U7CgkgICAgaWYgKGlzcHVuY3Qoc3JjW2ldKSkgY2hhcnR5cGVbaV18PUMxX1BVTkNUOwoJICAgIGlmIChpc2NudHJsKHNyY1tpXSkpIGNoYXJ0eXBlW2ldfD1DMV9DTlRSTDsKLyogRklYTUU6IGlzYmxhbmsoKSBpcyBhIEdOVSBleHRlbnNpb24gKi8KLyoJCWlmIChpc2JsYW5rKHNyY1tpXSkpIGNoYXJ0eXBlW2ldfD1DMV9CTEFOSzsgKi8KCSAgICBpZiAoKHNyY1tpXSA9PSAnICcpIHx8IChzcmNbaV0gPT0gJ1x0JykpIGNoYXJ0eXBlW2ldfD1DMV9CTEFOSzsKCSAgICAvKiBDMV9YRElHSVQgKi8KCX0KCXJldHVybiBUUlVFOwoKCWNhc2UgQ1RfQ1RZUEUyOgoJICBmb3IgKGk9MDtpPGNjaFNyYztpKyspIAoJICB7CgkgICAgY2hhcnR5cGVbaV09KFdPUkQpQ1RfQ1R5cGUyX0xVVFtpXTsKCSAgfQoJICByZXR1cm4gVFJVRTsKCgljYXNlIENUX0NUWVBFMzoKCSAgZm9yIChpPTA7aTxjY2hTcmM7aSsrKSAKCSAgewoJICAgIGNoYXJ0eXBlW2ldPUNUX0NUeXBlM19MVVRbaV07CgkgIH0KCSAgcmV0dXJuIFRSVUU7CgoJZGVmYXVsdDoKCSAgRVJSKG9sZSwiVW5rbm93biBkd0luZm9UeXBlOiVsZFxuIixkd0luZm9UeXBlKTsKCSAgcmV0dXJuIEZBTFNFOwoJfQp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICBHZXRTdHJpbmdUeXBlVyBbS0VSTkVMMzIuMjc5XQogKgogKiBOT1RFUwogKiBZZXMsIHRoaXMgaXMgbWlzc2luZyBMQ0lEIGxvY2FsZS4gTVMgZmF1bHQuCiAqLwpCT09MMzIgV0lOQVBJIEdldFN0cmluZ1R5cGUzMlcoRFdPUkQgZHdJbmZvVHlwZSxMUENXU1RSIHNyYyxJTlQzMiBjY2hTcmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUFdPUkQgY2hhcnR5cGUpCnsKCXJldHVybiBHZXRTdHJpbmdUeXBlRXgzMlcoMC8qZGVmYXVsdGxvY2FsZSovLGR3SW5mb1R5cGUsc3JjLGNjaFNyYyxjaGFydHlwZSk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICBHZXRTdHJpbmdUeXBlVyAgIFtLRVJORUwzMi4yNzhdCiAqIEZJWE1FOiB1bmljb2RlIGNoYXJzIGFyZSBhc3N1bWVkIGNoYXJzCiAqLwpCT09MMzIgV0lOQVBJIEdldFN0cmluZ1R5cGVFeDMyVyhMQ0lEIGxvY2FsZSxEV09SRCBkd0luZm9UeXBlLExQQ1dTVFIgc3JjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQzMiBjY2hTcmMsTFBXT1JEIGNoYXJ0eXBlKQp7CglpbnQJaTsKCgoJaWYgKGNjaFNyYz09LTEpCgkgIGNjaFNyYz1sc3RybGVuMzJXKHNyYykrMTsKCQoJc3dpdGNoIChkd0luZm9UeXBlKSB7CgljYXNlIENUX0NUWVBFMjoKCQlGSVhNRShvbGUsIkNUX0NUWVBFMiBub3Qgc3VwcG9ydGVkLlxuIik7CgkJcmV0dXJuIEZBTFNFOwoJY2FzZSBDVF9DVFlQRTM6CgkJRklYTUUob2xlLCJDVF9DVFlQRTMgbm90IHN1cHBvcnRlZC5cbiIpOwoJCXJldHVybiBGQUxTRTsKCWRlZmF1bHQ6YnJlYWs7Cgl9Cglmb3IgKGk9MDtpPGNjaFNyYztpKyspIHsKCQljaGFydHlwZVtpXSA9IDA7CgkJaWYgKGlzZGlnaXQoc3JjW2ldKSkgY2hhcnR5cGVbaV18PUMxX0RJR0lUOwoJCWlmIChpc2FscGhhKHNyY1tpXSkpIGNoYXJ0eXBlW2ldfD1DMV9BTFBIQTsKCQlpZiAoaXNsb3dlcihzcmNbaV0pKSBjaGFydHlwZVtpXXw9QzFfTE9XRVI7CgkJaWYgKGlzdXBwZXIoc3JjW2ldKSkgY2hhcnR5cGVbaV18PUMxX1VQUEVSOwoJCWlmIChpc3NwYWNlKHNyY1tpXSkpIGNoYXJ0eXBlW2ldfD1DMV9TUEFDRTsKCQlpZiAoaXNwdW5jdChzcmNbaV0pKSBjaGFydHlwZVtpXXw9QzFfUFVOQ1Q7CgkJaWYgKGlzY250cmwoc3JjW2ldKSkgY2hhcnR5cGVbaV18PUMxX0NOVFJMOwovKiBGSVhNRTogaXNibGFuaygpIGlzIGEgR05VIGV4dGVuc2lvbiAqLwovKgkJaWYgKGlzYmxhbmsoc3JjW2ldKSkgY2hhcnR5cGVbaV18PUMxX0JMQU5LOyAqLwogICAgICAgICAgICAgICAgaWYgKChzcmNbaV0gPT0gJyAnKSB8fCAoc3JjW2ldID09ICdcdCcpKSBjaGFydHlwZVtpXXw9QzFfQkxBTks7CgkJLyogQzFfWERJR0lUICovCgl9CglyZXR1cm4gVFJVRTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFZlckxhbmd1YWdlTmFtZTE2ICAgW1ZFUi4xMF0gCiAqLwpEV09SRCBXSU5BUEkgVmVyTGFuZ3VhZ2VOYW1lMTYoVUlOVDE2IGxhbmdpZCxMUFNUUiBsYW5nbmFtZSxVSU5UMTYgbGFuZ25hbWVsZW4pCnsKCWludAlpOwoJRFdPUkQJcmVzdWx0OwoJY2hhcglidWZmZXJbODBdOwoKCVRSQUNFKHZlciwiKCVkLCVwLCVkKVxuIixsYW5naWQsbGFuZ25hbWUsbGFuZ25hbWVsZW4pOwoJLyogRmlyc3QsIGNoZWNrIFxTeXN0ZW1cQ3VycmVudENvbnRyb2xTZXRcY29udHJvbFxObHNcTG9jYWxlXDxsYW5naWQ+CgkgKiBmcm9tIHRoZSByZWdpc3RyeS4gCgkgKi8KCXNwcmludGYoYnVmZmVyLAoJCSJcXFN5c3RlbVxcQ3VycmVudENvbnRyb2xTZXRcXGNvbnRyb2xcXE5sc1xcTG9jYWxlXFwlMDh4IiwKCQlsYW5naWQpOwoJcmVzdWx0ID0gUmVnUXVlcnlWYWx1ZTE2KEhLRVlfTE9DQUxfTUFDSElORSwgYnVmZmVyLCBsYW5nbmFtZSwKCQkJCShMUERXT1JEKSZsYW5nbmFtZWxlbik7CglpZiAocmVzdWx0ID09IEVSUk9SX1NVQ0NFU1MpIHsKCQlsYW5nbmFtZVtsYW5nbmFtZWxlbi0xXT0nXDAnOwoJCXJldHVybiBsYW5nbmFtZWxlbjsKCX0KCS8qIGlmIHRoYXQgZmFpbHMsIHVzZSB0aGUgaW50ZXJuYWwgdGFibGUgKi8KCWZvciAoaT0wO2xhbmd1YWdlc1tpXS5sYW5naWQhPTA7aSsrKQoJCWlmIChsYW5naWQ9PWxhbmd1YWdlc1tpXS5sYW5naWQpCgkJCWJyZWFrOwoJc3RybmNweShsYW5nbmFtZSxsYW5ndWFnZXNbaV0ubGFuZ25hbWUsbGFuZ25hbWVsZW4pOwoJbGFuZ25hbWVbbGFuZ25hbWVsZW4tMV09J1wwJzsKCXJldHVybiBzdHJsZW4obGFuZ3VhZ2VzW2ldLmxhbmduYW1lKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFZlckxhbmd1YWdlTmFtZTMyQQkJCQlbVkVSU0lPTi45XSAKICovCkRXT1JEIFdJTkFQSSBWZXJMYW5ndWFnZU5hbWUzMkEoVUlOVDMyIGxhbmdpZCxMUFNUUiBsYW5nbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UMzIgbGFuZ25hbWVsZW4pCnsKCXJldHVybiBWZXJMYW5ndWFnZU5hbWUxNihsYW5naWQsbGFuZ25hbWUsbGFuZ25hbWVsZW4pOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogVmVyTGFuZ3VhZ2VOYW1lMzJXCQkJCVtWRVJTSU9OLjEwXSAKICovCkRXT1JEIFdJTkFQSSBWZXJMYW5ndWFnZU5hbWUzMlcoVUlOVDMyIGxhbmdpZCxMUFdTVFIgbGFuZ25hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVDMyIGxhbmduYW1lbGVuKQp7CglpbnQJaTsKCUxQV1NUUglrZXluYW1lOwoJRFdPUkQJcmVzdWx0OwoJY2hhcglidWZmZXJbODBdOwoKCS8qIEZpcnN0LCBjaGVjayBcU3lzdGVtXEN1cnJlbnRDb250cm9sU2V0XGNvbnRyb2xcTmxzXExvY2FsZVw8bGFuZ2lkPgoJICogZnJvbSB0aGUgcmVnaXN0cnkuIAoJICovCglzcHJpbnRmKGJ1ZmZlciwKCQkiXFxTeXN0ZW1cXEN1cnJlbnRDb250cm9sU2V0XFxjb250cm9sXFxObHNcXExvY2FsZVxcJTA4eCIsCgkJbGFuZ2lkKTsKCWtleW5hbWUgPSBIRUFQX3N0cmR1cEF0b1coIEdldFByb2Nlc3NIZWFwKCksIDAsIGJ1ZmZlciApOwoJcmVzdWx0ID0gUmVnUXVlcnlWYWx1ZTMyVyhIS0VZX0xPQ0FMX01BQ0hJTkUsIGtleW5hbWUsIGxhbmduYW1lLAoJCQkJKExQRFdPUkQpJmxhbmduYW1lbGVuKTsKCUhlYXBGcmVlKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCBrZXluYW1lICk7CglpZiAocmVzdWx0ICE9IEVSUk9SX1NVQ0NFU1MpIHsKCQkvKiBpZiB0aGF0IGZhaWxzLCB1c2UgdGhlIGludGVybmFsIHRhYmxlICovCgkJZm9yIChpPTA7bGFuZ3VhZ2VzW2ldLmxhbmdpZCE9MDtpKyspCgkJCWlmIChsYW5naWQ9PWxhbmd1YWdlc1tpXS5sYW5naWQpCgkJCQlicmVhazsKICAgICAgICAJbHN0cmNweUF0b1coIGxhbmduYW1lLCBsYW5ndWFnZXNbaV0ubGFuZ25hbWUgKTsKCQlsYW5nbmFtZWxlbiA9IHN0cmxlbihsYW5ndWFnZXNbaV0ubGFuZ25hbWUpOwoJIAkvKiBzYW1lIGFzIHN0cmxlblcobGFuZ25hbWUpOyAqLwoJfQoJcmV0dXJuIGxhbmduYW1lbGVuOwp9CiAKc3RhdGljIGludCBpc19wdW5jdHVhdGlvbih1bnNpZ25lZCBjaGFyIGMpIAp7CiAgLyogcHVuY3R1YXRpb24gY2hhcmFjdGVycyBhcmUgOgogICAgIDEtOCwgMTQtMzEsIDM5LCA0NSwgMTI3LTEyOSwgMTQxLTE0NCwgMTUwLTE1MSwgMTU3LTE1OCwgMTczIAoKICAgICAicHVuY3R1YXRpb24gY2hhcmFjdGVyIiBpbiB0aGlzIGNvbnRleHQgaXMgYSBjaGFyYWN0ZXIgd2hpY2ggaXMgCiAgICAgY29uc2lkZXJlZCAibGVzcyBpbXBvcnRhbnQiIGR1cmluZyB3b3JkIHNvcnQgY29tcGFyaXNvbi4KICAgICBTZWUgTENNYXBTdHJpbmcgZm9yIHRoZSBwcmVjaXNlIGRlZmluaXRpb24gb2YgImxlc3MgaW1wb3J0YW50Ii4gKi8KICBpZiAoYz49MTQxKQogIHsKICAgIGlmIChjPD0xNTEpCiAgICAgIHJldHVybiAoYzw9MTQ0KSB8fCAoYz49MTUwKTsKICAgIGlmIChjPD0xNTgpCiAgICAgIHJldHVybiAoYz49MTU3KTsKICAgIHJldHVybiAoYz09MTczKTsKICB9CiAgaWYgKGM+PTEyNykKICAgIHJldHVybiAoYzw9MTI5KTsKICBpZiAoYz49MTQpCiAgICByZXR1cm4gKGM8PTMxKSB8fCAoYz09MzkpIHx8IChjPT00NSk7CiAgcmV0dXJuIChjPD04KTsKfQoKc3RhdGljIGludCBpZGVudGl0eShpbnQgYykKewogIHJldHVybiBjOwp9CgpzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBMQ01fVW5pY29kZV9MVVRbXSA9IHsKICA2ICAgICAgLCAgIDMsIC8qICAgLSAgIDEgKi8gIAogIDYgICAgICAsICAgNCwgLyogICAtICAgMiAqLyAgCiAgNiAgICAgICwgICA1LCAvKiAgIC0gICAzICovICAKICA2ICAgICAgLCAgIDYsIC8qICAgLSAgIDQgKi8gIAogIDYgICAgICAsICAgNywgLyogICAtICAgNSAqLyAgCiAgNiAgICAgICwgICA4LCAvKiAgIC0gICA2ICovICAKICA2ICAgICAgLCAgIDksIC8qICAgLSAgIDcgKi8gIAogIDYgICAgICAsICAxMCwgLyogICAtICAgOCAqLyAgCiAgNyAgICAgICwgICA1LCAvKiAgIC0gICA5ICovICAKICA3ICAgICAgLCAgIDYsIC8qICAgLSAgMTAgKi8gIAogIDcgICAgICAsICAgNywgLyogICAtICAxMSAqLyAgCiAgNyAgICAgICwgICA4LCAvKiAgIC0gIDEyICovICAKICA3ICAgICAgLCAgIDksIC8qICAgLSAgMTMgKi8gIAogIDYgICAgICAsICAxMSwgLyogICAtICAxNCAqLyAgCiAgNiAgICAgICwgIDEyLCAvKiAgIC0gIDE1ICovICAKICA2ICAgICAgLCAgMTMsIC8qICAgLSAgMTYgKi8gIAogIDYgICAgICAsICAxNCwgLyogICAtICAxNyAqLyAgCiAgNiAgICAgICwgIDE1LCAvKiAgIC0gIDE4ICovICAKICA2ICAgICAgLCAgMTYsIC8qICAgLSAgMTkgKi8gIAogIDYgICAgICAsICAxNywgLyogICAtICAyMCAqLyAgCiAgNiAgICAgICwgIDE4LCAvKiAgIC0gIDIxICovICAKICA2ICAgICAgLCAgMTksIC8qICAgLSAgMjIgKi8gIAogIDYgICAgICAsICAyMCwgLyogICAtICAyMyAqLyAgCiAgNiAgICAgICwgIDIxLCAvKiAgIC0gIDI0ICovICAKICA2ICAgICAgLCAgMjIsIC8qICAgLSAgMjUgKi8gIAogIDYgICAgICAsICAyMywgLyogICAtICAyNiAqLyAgCiAgNiAgICAgICwgIDI0LCAvKiAgIC0gIDI3ICovICAKICA2ICAgICAgLCAgMjUsIC8qICAgLSAgMjggKi8gIAogIDYgICAgICAsICAyNiwgLyogICAtICAyOSAqLyAgCiAgNiAgICAgICwgIDI3LCAvKiAgIC0gIDMwICovICAKICA2ICAgICAgLCAgMjgsIC8qICAgLSAgMzEgKi8gIAogIDcgICAgICAsICAgMiwgLyogICAtICAzMiAqLwogIDcgICAgICAsICAyOCwgLyogISAtICAzMyAqLwogIDcgICAgICAsICAyOSwgLyogIiAtICAzNCAqLyAvKiAiICovCiAgNyAgICAgICwgIDMxLCAvKiAjIC0gIDM1ICovCiAgNyAgICAgICwgIDMzLCAvKiAkIC0gIDM2ICovCiAgNyAgICAgICwgIDM1LCAvKiAlIC0gIDM3ICovCiAgNyAgICAgICwgIDM3LCAvKiAmIC0gIDM4ICovCiAgNiAgICAgICwgMTI4LCAvKiAnIC0gIDM5ICovCiAgNyAgICAgICwgIDM5LCAvKiAoIC0gIDQwICovCiAgNyAgICAgICwgIDQyLCAvKiApIC0gIDQxICovCiAgNyAgICAgICwgIDQ1LCAvKiAqIC0gIDQyICovCiAgOCAgICAgICwgICAzLCAvKiArIC0gIDQzICovCiAgNyAgICAgICwgIDQ3LCAvKiAsIC0gIDQ0ICovCiAgNiAgICAgICwgMTMwLCAvKiAtIC0gIDQ1ICovCiAgNyAgICAgICwgIDUxLCAvKiAuIC0gIDQ2ICovCiAgNyAgICAgICwgIDUzLCAvKiAvIC0gIDQ3ICovCiAxMiAgICAgICwgICAzLCAvKiAwIC0gIDQ4ICovCiAxMiAgICAgICwgIDMzLCAvKiAxIC0gIDQ5ICovCiAxMiAgICAgICwgIDUxLCAvKiAyIC0gIDUwICovCiAxMiAgICAgICwgIDcwLCAvKiAzIC0gIDUxICovCiAxMiAgICAgICwgIDg4LCAvKiA0IC0gIDUyICovCiAxMiAgICAgICwgMTA2LCAvKiA1IC0gIDUzICovCiAxMiAgICAgICwgMTI1LCAvKiA2IC0gIDU0ICovCiAxMiAgICAgICwgMTQ0LCAvKiA3IC0gIDU1ICovCiAxMiAgICAgICwgMTYyLCAvKiA4IC0gIDU2ICovCiAxMiAgICAgICwgMTgwLCAvKiA5IC0gIDU3ICovCiAgNyAgICAgICwgIDU1LCAvKiA6IC0gIDU4ICovCiAgNyAgICAgICwgIDU4LCAvKiA7IC0gIDU5ICovCiAgOCAgICAgICwgIDE0LCAvKiA8IC0gIDYwICovCiAgOCAgICAgICwgIDE4LCAvKiA9IC0gIDYxICovCiAgOCAgICAgICwgIDIwLCAvKiA+IC0gIDYyICovCiAgNyAgICAgICwgIDYwLCAvKiA/IC0gIDYzICovCiAgNyAgICAgICwgIDYyLCAvKiBAIC0gIDY0ICovCiAxNCAgICAgICwgICAyLCAvKiBBIC0gIDY1ICovCiAxNCAgICAgICwgICA5LCAvKiBCIC0gIDY2ICovCiAxNCAgICAgICwgIDEwLCAvKiBDIC0gIDY3ICovCiAxNCAgICAgICwgIDI2LCAvKiBEIC0gIDY4ICovCiAxNCAgICAgICwgIDMzLCAvKiBFIC0gIDY5ICovCiAxNCAgICAgICwgIDM1LCAvKiBGIC0gIDcwICovCiAxNCAgICAgICwgIDM3LCAvKiBHIC0gIDcxICovCiAxNCAgICAgICwgIDQ0LCAvKiBIIC0gIDcyICovCiAxNCAgICAgICwgIDUwLCAvKiBJIC0gIDczICovCiAxNCAgICAgICwgIDUzLCAvKiBKIC0gIDc0ICovCiAxNCAgICAgICwgIDU0LCAvKiBLIC0gIDc1ICovCiAxNCAgICAgICwgIDcyLCAvKiBMIC0gIDc2ICovCiAxNCAgICAgICwgIDgxLCAvKiBNIC0gIDc3ICovCiAxNCAgICAgICwgMTEyLCAvKiBOIC0gIDc4ICovCiAxNCAgICAgICwgMTI0LCAvKiBPIC0gIDc5ICovCiAxNCAgICAgICwgMTI2LCAvKiBQIC0gIDgwICovCiAxNCAgICAgICwgMTM3LCAvKiBRIC0gIDgxICovCiAxNCAgICAgICwgMTM4LCAvKiBSIC0gIDgyICovCiAxNCAgICAgICwgMTQ1LCAvKiBTIC0gIDgzICovCiAxNCAgICAgICwgMTUzLCAvKiBUIC0gIDg0ICovCiAxNCAgICAgICwgMTU5LCAvKiBVIC0gIDg1ICovCiAxNCAgICAgICwgMTYyLCAvKiBWIC0gIDg2ICovCiAxNCAgICAgICwgMTY0LCAvKiBXIC0gIDg3ICovCiAxNCAgICAgICwgMTY2LCAvKiBYIC0gIDg4ICovCiAxNCAgICAgICwgMTY3LCAvKiBZIC0gIDg5ICovCiAxNCAgICAgICwgMTY5LCAvKiBaIC0gIDkwICovCiAgNyAgICAgICwgIDYzLCAvKiBbIC0gIDkxICovCiAgNyAgICAgICwgIDY1LCAvKiBcIC0gIDkyICovCiAgNyAgICAgICwgIDY2LCAvKiBdIC0gIDkzICovCiAgNyAgICAgICwgIDY3LCAvKiBeIC0gIDk0ICovCiAgNyAgICAgICwgIDY4LCAvKiBfIC0gIDk1ICovCiAgNyAgICAgICwgIDcyLCAvKiBgIC0gIDk2ICovCiAxNCAgICAgICwgICAyLCAvKiBhIC0gIDk3ICovCiAxNCAgICAgICwgICA5LCAvKiBiIC0gIDk4ICovCiAxNCAgICAgICwgIDEwLCAvKiBjIC0gIDk5ICovCiAxNCAgICAgICwgIDI2LCAvKiBkIC0gMTAwICovCiAxNCAgICAgICwgIDMzLCAvKiBlIC0gMTAxICovCiAxNCAgICAgICwgIDM1LCAvKiBmIC0gMTAyICovCiAxNCAgICAgICwgIDM3LCAvKiBnIC0gMTAzICovCiAxNCAgICAgICwgIDQ0LCAvKiBoIC0gMTA0ICovCiAxNCAgICAgICwgIDUwLCAvKiBpIC0gMTA1ICovCiAxNCAgICAgICwgIDUzLCAvKiBqIC0gMTA2ICovCiAxNCAgICAgICwgIDU0LCAvKiBrIC0gMTA3ICovCiAxNCAgICAgICwgIDcyLCAvKiBsIC0gMTA4ICovCiAxNCAgICAgICwgIDgxLCAvKiBtIC0gMTA5ICovCiAxNCAgICAgICwgMTEyLCAvKiBuIC0gMTEwICovCiAxNCAgICAgICwgMTI0LCAvKiBvIC0gMTExICovCiAxNCAgICAgICwgMTI2LCAvKiBwIC0gMTEyICovCiAxNCAgICAgICwgMTM3LCAvKiBxIC0gMTEzICovCiAxNCAgICAgICwgMTM4LCAvKiByIC0gMTE0ICovCiAxNCAgICAgICwgMTQ1LCAvKiBzIC0gMTE1ICovCiAxNCAgICAgICwgMTUzLCAvKiB0IC0gMTE2ICovCiAxNCAgICAgICwgMTU5LCAvKiB1IC0gMTE3ICovCiAxNCAgICAgICwgMTYyLCAvKiB2IC0gMTE4ICovCiAxNCAgICAgICwgMTY0LCAvKiB3IC0gMTE5ICovCiAxNCAgICAgICwgMTY2LCAvKiB4IC0gMTIwICovCiAxNCAgICAgICwgMTY3LCAvKiB5IC0gMTIxICovCiAxNCAgICAgICwgMTY5LCAvKiB6IC0gMTIyICovCiAgNyAgICAgICwgIDc0LCAvKiB7IC0gMTIzICovCiAgNyAgICAgICwgIDc2LCAvKiB8IC0gMTI0ICovCiAgNyAgICAgICwgIDc4LCAvKiB9IC0gMTI1ICovCiAgNyAgICAgICwgIDgwLCAvKiB+IC0gMTI2ICovCiAgNiAgICAgICwgIDI5LCAvKiB/IC0gMTI3ICovCiAgNiAgICAgICwgIDMwLCAvKiCAIC0gMTI4ICovCiAgNiAgICAgICwgIDMxLCAvKiCBIC0gMTI5ICovCiAgNyAgICAgICwgMTIzLCAvKiCCIC0gMTMwICovCiAxNCAgICAgICwgIDM1LCAvKiCDIC0gMTMxICovCiAgNyAgICAgICwgMTI3LCAvKiCEIC0gMTMyICovCiAxMCAgICAgICwgIDIxLCAvKiCFIC0gMTMzICovCiAxMCAgICAgICwgIDE1LCAvKiCGIC0gMTM0ICovCiAxMCAgICAgICwgIDE2LCAvKiCHIC0gMTM1ICovCiAgNyAgICAgICwgIDY3LCAvKiCIIC0gMTM2ICovCiAxMCAgICAgICwgIDIyLCAvKiCJIC0gMTM3ICovCiAxNCAgICAgICwgMTQ1LCAvKiCKIC0gMTM4ICovCiAgNyAgICAgICwgMTM2LCAvKiCLIC0gMTM5ICovCiAxNCArIDE2ICwgMTI0LCAvKiCMIC0gMTQwICovCiAgNiAgICAgICwgIDQzLCAvKiCNIC0gMTQxICovCiAgNiAgICAgICwgIDQ0LCAvKiCOIC0gMTQyICovCiAgNiAgICAgICwgIDQ1LCAvKiCPIC0gMTQzICovCiAgNiAgICAgICwgIDQ2LCAvKiCQIC0gMTQ0ICovCiAgNyAgICAgICwgMTIxLCAvKiCRIC0gMTQ1ICovCiAgNyAgICAgICwgMTIyLCAvKiCSIC0gMTQ2ICovCiAgNyAgICAgICwgMTI1LCAvKiCTIC0gMTQ3ICovCiAgNyAgICAgICwgMTI2LCAvKiCUIC0gMTQ4ICovCiAxMCAgICAgICwgIDE3LCAvKiCVIC0gMTQ5ICovCiAgNiAgICAgICwgMTM3LCAvKiCWIC0gMTUwICovCiAgNiAgICAgICwgMTM5LCAvKiCXIC0gMTUxICovCiAgNyAgICAgICwgIDkzLCAvKiCYIC0gMTUyICovCiAxNCAgICAgICwgMTU2LCAvKiCZIC0gMTUzICovCiAxNCAgICAgICwgMTQ1LCAvKiCaIC0gMTU0ICovCiAgNyAgICAgICwgMTM3LCAvKiCbIC0gMTU1ICovCiAxNCArIDE2ICwgMTI0LCAvKiCcIC0gMTU2ICovCiAgNiAgICAgICwgIDU5LCAvKiCdIC0gMTU3ICovCiAgNiAgICAgICwgIDYwLCAvKiCeIC0gMTU4ICovCiAxNCAgICAgICwgMTY3LCAvKiCfIC0gMTU5ICovCiAgNyAgICAgICwgICA0LCAvKiCgIC0gMTYwICovCiAgNyAgICAgICwgIDgxLCAvKiChIC0gMTYxICovCiAxMCAgICAgICwgICAyLCAvKiCiIC0gMTYyICovCiAxMCAgICAgICwgICAzLCAvKiCjIC0gMTYzICovCiAxMCAgICAgICwgICA0LCAvKiCkIC0gMTY0ICovCiAxMCAgICAgICwgICA1LCAvKiClIC0gMTY1ICovCiAgNyAgICAgICwgIDgyLCAvKiCmIC0gMTY2ICovCiAxMCAgICAgICwgICA2LCAvKiCnIC0gMTY3ICovCiAgNyAgICAgICwgIDgzLCAvKiCoIC0gMTY4ICovCiAxMCAgICAgICwgICA3LCAvKiCpIC0gMTY5ICovCiAxNCAgICAgICwgICAyLCAvKiCqIC0gMTcwICovCiAgOCAgICAgICwgIDI0LCAvKiCrIC0gMTcxICovCiAxMCAgICAgICwgICA4LCAvKiCsIC0gMTcyICovCiAgNiAgICAgICwgMTMxLCAvKiCtIC0gMTczICovCiAxMCAgICAgICwgICA5LCAvKiCuIC0gMTc0ICovCiAgNyAgICAgICwgIDg0LCAvKiCvIC0gMTc1ICovCiAxMCAgICAgICwgIDEwLCAvKiCwIC0gMTc2ICovCiAgOCAgICAgICwgIDIzLCAvKiCxIC0gMTc3ICovCiAxMiAgICAgICwgIDUxLCAvKiCyIC0gMTc4ICovCiAxMiAgICAgICwgIDcwLCAvKiCzIC0gMTc5ICovCiAgNyAgICAgICwgIDg1LCAvKiC0IC0gMTgwICovCiAxMCAgICAgICwgIDExLCAvKiC1IC0gMTgxICovCiAxMCAgICAgICwgIDEyLCAvKiC2IC0gMTgyICovCiAxMCAgICAgICwgIDEzLCAvKiC3IC0gMTgzICovCiAgNyAgICAgICwgIDg2LCAvKiC4IC0gMTg0ICovCiAxMiAgICAgICwgIDMzLCAvKiC5IC0gMTg1ICovCiAxNCAgICAgICwgMTI0LCAvKiC6IC0gMTg2ICovCiAgOCAgICAgICwgIDI2LCAvKiC7IC0gMTg3ICovCiAxMiAgICAgICwgIDIxLCAvKiC8IC0gMTg4ICovCiAxMiAgICAgICwgIDI1LCAvKiC9IC0gMTg5ICovCiAxMiAgICAgICwgIDI5LCAvKiC+IC0gMTkwICovCiAgNyAgICAgICwgIDg3LCAvKiC/IC0gMTkxICovCiAxNCAgICAgICwgICAyLCAvKiDAIC0gMTkyICovCiAxNCAgICAgICwgICAyLCAvKiDBIC0gMTkzICovCiAxNCAgICAgICwgICAyLCAvKiDCIC0gMTk0ICovCiAxNCAgICAgICwgICAyLCAvKiDDIC0gMTk1ICovCiAxNCAgICAgICwgICAyLCAvKiDEIC0gMTk2ICovCiAxNCAgICAgICwgICAyLCAvKiDFIC0gMTk3ICovCiAxNCArIDE2ICwgICAyLCAvKiDGIC0gMTk4ICovCiAxNCAgICAgICwgIDEwLCAvKiDHIC0gMTk5ICovCiAxNCAgICAgICwgIDMzLCAvKiDIIC0gMjAwICovCiAxNCAgICAgICwgIDMzLCAvKiDJIC0gMjAxICovCiAxNCAgICAgICwgIDMzLCAvKiDKIC0gMjAyICovCiAxNCAgICAgICwgIDMzLCAvKiDLIC0gMjAzICovCiAxNCAgICAgICwgIDUwLCAvKiDMIC0gMjA0ICovCiAxNCAgICAgICwgIDUwLCAvKiDNIC0gMjA1ICovCiAxNCAgICAgICwgIDUwLCAvKiDOIC0gMjA2ICovCiAxNCAgICAgICwgIDUwLCAvKiDPIC0gMjA3ICovCiAxNCAgICAgICwgIDI2LCAvKiDQIC0gMjA4ICovCiAxNCAgICAgICwgMTEyLCAvKiDRIC0gMjA5ICovCiAxNCAgICAgICwgMTI0LCAvKiDSIC0gMjEwICovCiAxNCAgICAgICwgMTI0LCAvKiDTIC0gMjExICovCiAxNCAgICAgICwgMTI0LCAvKiDUIC0gMjEyICovCiAxNCAgICAgICwgMTI0LCAvKiDVIC0gMjEzICovCiAxNCAgICAgICwgMTI0LCAvKiDWIC0gMjE0ICovCiAgOCAgICAgICwgIDI4LCAvKiDXIC0gMjE1ICovCiAxNCAgICAgICwgMTI0LCAvKiDYIC0gMjE2ICovCiAxNCAgICAgICwgMTU5LCAvKiDZIC0gMjE3ICovCiAxNCAgICAgICwgMTU5LCAvKiDaIC0gMjE4ICovCiAxNCAgICAgICwgMTU5LCAvKiDbIC0gMjE5ICovCiAxNCAgICAgICwgMTU5LCAvKiDcIC0gMjIwICovCiAxNCAgICAgICwgMTY3LCAvKiDdIC0gMjIxICovCiAxNCArIDMyICwgMTUzLCAvKiDeIC0gMjIyICovCiAxNCArIDQ4ICwgMTQ1LCAvKiDfIC0gMjIzICovCiAxNCAgICAgICwgICAyLCAvKiDgIC0gMjI0ICovCiAxNCAgICAgICwgICAyLCAvKiDhIC0gMjI1ICovCiAxNCAgICAgICwgICAyLCAvKiDiIC0gMjI2ICovCiAxNCAgICAgICwgICAyLCAvKiDjIC0gMjI3ICovCiAxNCAgICAgICwgICAyLCAvKiDkIC0gMjI4ICovCiAxNCAgICAgICwgICAyLCAvKiDlIC0gMjI5ICovCiAxNCArIDE2ICwgICAyLCAvKiDmIC0gMjMwICovCiAxNCAgICAgICwgIDEwLCAvKiDnIC0gMjMxICovCiAxNCAgICAgICwgIDMzLCAvKiDoIC0gMjMyICovCiAxNCAgICAgICwgIDMzLCAvKiDpIC0gMjMzICovCiAxNCAgICAgICwgIDMzLCAvKiDqIC0gMjM0ICovCiAxNCAgICAgICwgIDMzLCAvKiDrIC0gMjM1ICovCiAxNCAgICAgICwgIDUwLCAvKiDsIC0gMjM2ICovCiAxNCAgICAgICwgIDUwLCAvKiDtIC0gMjM3ICovCiAxNCAgICAgICwgIDUwLCAvKiDuIC0gMjM4ICovCiAxNCAgICAgICwgIDUwLCAvKiDvIC0gMjM5ICovCiAxNCAgICAgICwgIDI2LCAvKiDwIC0gMjQwICovCiAxNCAgICAgICwgMTEyLCAvKiDxIC0gMjQxICovCiAxNCAgICAgICwgMTI0LCAvKiDyIC0gMjQyICovCiAxNCAgICAgICwgMTI0LCAvKiDzIC0gMjQzICovCiAxNCAgICAgICwgMTI0LCAvKiD0IC0gMjQ0ICovCiAxNCAgICAgICwgMTI0LCAvKiD1IC0gMjQ1ICovCiAxNCAgICAgICwgMTI0LCAvKiD2IC0gMjQ2ICovCiAgOCAgICAgICwgIDI5LCAvKiD3IC0gMjQ3ICovCiAxNCAgICAgICwgMTI0LCAvKiD4IC0gMjQ4ICovCiAxNCAgICAgICwgMTU5LCAvKiD5IC0gMjQ5ICovCiAxNCAgICAgICwgMTU5LCAvKiD6IC0gMjUwICovCiAxNCAgICAgICwgMTU5LCAvKiD7IC0gMjUxICovCiAxNCAgICAgICwgMTU5LCAvKiD8IC0gMjUyICovCiAxNCAgICAgICwgMTY3LCAvKiD9IC0gMjUzICovCiAxNCArIDMyICwgMTUzLCAvKiD+IC0gMjU0ICovCiAxNCAgICAgICwgMTY3ICAvKiD/IC0gMjU1ICovIH07CgpzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBMQ01fVW5pY29kZV9MVVRfMltdID0geyAzMywgNDQsIDE0NSB9OwoKI2RlZmluZSBMQ01fRGlhY3JpdGljX1N0YXJ0IDEzMQoKc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgTENNX0RpYWNyaXRpY19MVVRbXSA9IHsgCjEyMywgIC8qIIMgLSAxMzEgKi8KICAyLCAgLyoghCAtIDEzMiAqLwogIDIsICAvKiCFIC0gMTMzICovCiAgMiwgIC8qIIYgLSAxMzQgKi8KICAyLCAgLyoghyAtIDEzNSAqLwogIDMsICAvKiCIIC0gMTM2ICovCiAgMiwgIC8qIIkgLSAxMzcgKi8KIDIwLCAgLyogiiAtIDEzOCAqLwogIDIsICAvKiCLIC0gMTM5ICovCiAgMiwgIC8qIIwgLSAxNDAgKi8KICAyLCAgLyogjSAtIDE0MSAqLwogIDIsICAvKiCOIC0gMTQyICovCiAgMiwgIC8qII8gLSAxNDMgKi8KICAyLCAgLyogkCAtIDE0NCAqLwogIDIsICAvKiCRIC0gMTQ1ICovCiAgMiwgIC8qIJIgLSAxNDYgKi8KICAyLCAgLyogkyAtIDE0NyAqLwogIDIsICAvKiCUIC0gMTQ4ICovCiAgMiwgIC8qIJUgLSAxNDkgKi8KICAyLCAgLyogliAtIDE1MCAqLwogIDIsICAvKiCXIC0gMTUxICovCiAgMiwgIC8qIJggLSAxNTIgKi8KICAyLCAgLyogmSAtIDE1MyAqLwogMjAsICAvKiCaIC0gMTU0ICovCiAgMiwgIC8qIJsgLSAxNTUgKi8KICAyLCAgLyognCAtIDE1NiAqLwogIDIsICAvKiCdIC0gMTU3ICovCiAgMiwgIC8qIJ4gLSAxNTggKi8KIDE5LCAgLyognyAtIDE1OSAqLwogIDIsICAvKiCgIC0gMTYwICovCiAgMiwgIC8qIKEgLSAxNjEgKi8KICAyLCAgLyogoiAtIDE2MiAqLwogIDIsICAvKiCjIC0gMTYzICovCiAgMiwgIC8qIKQgLSAxNjQgKi8KICAyLCAgLyogpSAtIDE2NSAqLwogIDIsICAvKiCmIC0gMTY2ICovCiAgMiwgIC8qIKcgLSAxNjcgKi8KICAyLCAgLyogqCAtIDE2OCAqLwogIDIsICAvKiCpIC0gMTY5ICovCiAgMywgIC8qIKogLSAxNzAgKi8KICAyLCAgLyogqyAtIDE3MSAqLwogIDIsICAvKiCsIC0gMTcyICovCiAgMiwgIC8qIK0gLSAxNzMgKi8KICAyLCAgLyogriAtIDE3NCAqLwogIDIsICAvKiCvIC0gMTc1ICovCiAgMiwgIC8qILAgLSAxNzYgKi8KICAyLCAgLyogsSAtIDE3NyAqLwogIDIsICAvKiCyIC0gMTc4ICovCiAgMiwgIC8qILMgLSAxNzkgKi8KICAyLCAgLyogtCAtIDE4MCAqLwogIDIsICAvKiC1IC0gMTgxICovCiAgMiwgIC8qILYgLSAxODIgKi8KICAyLCAgLyogtyAtIDE4MyAqLwogIDIsICAvKiC4IC0gMTg0ICovCiAgMiwgIC8qILkgLSAxODUgKi8KICAzLCAgLyoguiAtIDE4NiAqLwogIDIsICAvKiC7IC0gMTg3ICovCiAgMiwgIC8qILwgLSAxODggKi8KICAyLCAgLyogvSAtIDE4OSAqLwogIDIsICAvKiC+IC0gMTkwICovCiAgMiwgIC8qIL8gLSAxOTEgKi8KIDE1LCAgLyogwCAtIDE5MiAqLwogMTQsICAvKiDBIC0gMTkzICovCiAxOCwgIC8qIMIgLSAxOTQgKi8KIDI1LCAgLyogwyAtIDE5NSAqLwogMTksICAvKiDEIC0gMTk2ICovCiAyNiwgIC8qIMUgLSAxOTcgKi8KICAyLCAgLyogxiAtIDE5OCAqLwogMjgsICAvKiDHIC0gMTk5ICovCiAxNSwgIC8qIMggLSAyMDAgKi8KIDE0LCAgLyogySAtIDIwMSAqLwogMTgsICAvKiDKIC0gMjAyICovCiAxOSwgIC8qIMsgLSAyMDMgKi8KIDE1LCAgLyogzCAtIDIwNCAqLwogMTQsICAvKiDNIC0gMjA1ICovCiAxOCwgIC8qIM4gLSAyMDYgKi8KIDE5LCAgLyogzyAtIDIwNyAqLwoxMDQsICAvKiDQIC0gMjA4ICovCiAyNSwgIC8qINEgLSAyMDkgKi8KIDE1LCAgLyog0iAtIDIxMCAqLwogMTQsICAvKiDTIC0gMjExICovCiAxOCwgIC8qINQgLSAyMTIgKi8KIDI1LCAgLyog1SAtIDIxMyAqLwogMTksICAvKiDWIC0gMjE0ICovCiAgMiwgIC8qINcgLSAyMTUgKi8KIDMzLCAgLyog2CAtIDIxNiAqLwogMTUsICAvKiDZIC0gMjE3ICovCiAxNCwgIC8qINogLSAyMTggKi8KIDE4LCAgLyog2yAtIDIxOSAqLwogMTksICAvKiDcIC0gMjIwICovCiAxNCwgIC8qIN0gLSAyMjEgKi8KICAyLCAgLyog3iAtIDIyMiAqLwogIDIsICAvKiDfIC0gMjIzICovCiAxNSwgIC8qIOAgLSAyMjQgKi8KIDE0LCAgLyog4SAtIDIyNSAqLwogMTgsICAvKiDiIC0gMjI2ICovCiAyNSwgIC8qIOMgLSAyMjcgKi8KIDE5LCAgLyog5CAtIDIyOCAqLwogMjYsICAvKiDlIC0gMjI5ICovCiAgMiwgIC8qIOYgLSAyMzAgKi8KIDI4LCAgLyog5yAtIDIzMSAqLwogMTUsICAvKiDoIC0gMjMyICovCiAxNCwgIC8qIOkgLSAyMzMgKi8KIDE4LCAgLyog6iAtIDIzNCAqLwogMTksICAvKiDrIC0gMjM1ICovCiAxNSwgIC8qIOwgLSAyMzYgKi8KIDE0LCAgLyog7SAtIDIzNyAqLwogMTgsICAvKiDuIC0gMjM4ICovCiAxOSwgIC8qIO8gLSAyMzkgKi8KMTA0LCAgLyog8CAtIDI0MCAqLwogMjUsICAvKiDxIC0gMjQxICovCiAxNSwgIC8qIPIgLSAyNDIgKi8KIDE0LCAgLyog8yAtIDI0MyAqLwogMTgsICAvKiD0IC0gMjQ0ICovCiAyNSwgIC8qIPUgLSAyNDUgKi8KIDE5LCAgLyog9iAtIDI0NiAqLwogIDIsICAvKiD3IC0gMjQ3ICovCiAzMywgIC8qIPggLSAyNDggKi8KIDE1LCAgLyog+SAtIDI0OSAqLwogMTQsICAvKiD6IC0gMjUwICovCiAxOCwgIC8qIPsgLSAyNTEgKi8KIDE5LCAgLyog/CAtIDI1MiAqLwogMTQsICAvKiD9IC0gMjUzICovCiAgMiwgIC8qIP4gLSAyNTQgKi8KIDE5LCAgLyog/yAtIDI1NSAqLwp9IDsKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIENvbnZlcnQgYSBzdHJpbmcsIG9yIGdlbmVyYXRlIGEgc29ydCBrZXkgZnJvbSBpdC4KICoKICogSWYgKG1hcGZsYWdzICYgTENNQVBfU09SVEtFWSksIHRoZSBmdW5jdGlvbiB3aWxsIGdlbmVyYXRlCiAqIGEgc29ydCBrZXkgZm9yIHRoZSBzb3VyY2Ugc3RyaW5nLiAgRWxzZSwgaXQgd2lsbCBjb252ZXJ0IGl0CiAqIGFjY29yZGluZ2x5IHRvIHRoZSBmbGFncyBMQ01BUF9VUFBFUkNBU0UsIExDTUFQX0xPV0VSQ0FTRSwuLi4KICoKICogUkVUVVJOUwogKiAgICBFcnJvciA6IDAuCiAqICAgIFN1Y2Nlc3MgOiBsZW5ndGggb2YgdGhlIHJlc3VsdCBzdHJpbmcuCiAqCiAqIFJFTUFSS1MKICogICAgSWYgY2FsbGVkIHdpdGggc2NybGVuID0gLTEsIHRoZSBmdW5jdGlvbiB3aWxsIGNvbXB1dGUgdGhlIGxlbmd0aAogKiAgICAgIG9mIHRoZSAwLXRlcm1pbmF0ZWQgc3RyaW5nIHN0cnNyYyBieSBpdHNlbGYuICAgICAgCiAqIAogKiAgICBJZiBjYWxsZWQgd2l0aCBkc3RsZW4gPSAwLCByZXR1cm5zIHRoZSBidWZmZXIgbGVuZ3RoIHRoYXQgCiAqICAgICAgd291bGQgYmUgcmVxdWlyZWQuCiAqLwpJTlQzMiBXSU5BUEkgTENNYXBTdHJpbmczMkEoCglMQ0lEIGxjaWQgLyogbG9jYWxlIGlkZW50aWZpZXIgY3JlYXRlZCB3aXRoIE1BS0VMQ0lEOyAKCQkgICAgIExPQ0FMRV9TWVNURU1fREVGQVVMVCBhbmQgTE9DQUxFX1VTRVJfREVGQVVMVCBhcmUgcHJlZGVmaW5lZAoJCSAgICAgdmFsdWVzLiAqLywKCURXT1JEIG1hcGZsYWdzIC8qIGZsYWdzICovLAoJTFBDU1RSIHNyY3N0ciAgLyogc291cmNlIGJ1ZmZlciAqLywKCUlOVDMyIHNyY2xlbiAgIC8qIHNvdXJjZSBsZW5ndGggKi8sCglMUFNUUiBkc3RzdHIgICAvKiBkZXN0aW5hdGlvbiBidWZmZXIgKi8sCglJTlQzMiBkc3RsZW4gICAvKiBkZXN0aW5hdGlvbiBidWZmZXIgbGVuZ3RoICovKSAKewogIGludCBpOwoKICBUUkFDRShzdHJpbmcsIigweCUwNGx4LDB4JTA4bHgsJXMsJWQsJXAsJWQpXG4iLAoJbGNpZCxtYXBmbGFncyxzcmNzdHIsc3JjbGVuLGRzdHN0cixkc3RsZW4pOwoKICBpZiAoICgoZHN0bGVuIT0wKSAmJiAoZHN0c3RyPT1OVUxMKSkgfHwgKHNyY3N0cj09TlVMTCkgKQogIHsKICAgIFNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CiAgICByZXR1cm4gMDsKICB9CiAgaWYgKHNyY2xlbj09LTEpIAogICAgc3JjbGVuID0gbHN0cmxlbjMyQShzcmNzdHIpICsgMSA7ICAgIC8qIChpbmNsdWRlIGZpbmFsICdcMCcpICovCgogIGlmIChtYXBmbGFncyAmIH4gKCBMQ01BUF9VUFBFUkNBU0UgfCBMQ01BUF9MT1dFUkNBU0UgfCBMQ01BUF9TT1JUS0VZIHwKCQkgICAgIE5PUk1fSUdOT1JFQ0FTRSB8IE5PUk1fSUdOT1JFTk9OU1BBQ0UgfCBTT1JUX1NUUklOR1NPUlQpICkKICB7CiAgICBGSVhNRShzdHJpbmcsIigweCUwNGx4LDB4JTA4bHgsJXAsJWQsJXAsJWQpOiAiCgkgICJ1bmltcGxlbWVudGVkIGZsYWdzOiAweCUwOGx4XG4iLAoJICBsY2lkLG1hcGZsYWdzLHNyY3N0cixzcmNsZW4sZHN0c3RyLGRzdGxlbixtYXBmbGFncyk7CiAgfQogIAogIGlmICggIShtYXBmbGFncyAmIExDTUFQX1NPUlRLRVkpICkKICB7CiAgICBpbnQgKCpmKShpbnQpPWlkZW50aXR5OyAKCiAgICBpZiAoZHN0bGVuPT0wKQogICAgICByZXR1cm4gc3JjbGVuOyAgLyogZHN0bGVuPTAgbWVhbnMgImRvIG5vdGhpbmcgYnV0IHJldHVybiByZXF1aXJlZCBsZW5ndGgiICovCiAgICBpZiAoZHN0bGVuPHNyY2xlbikKICAgICAgc3JjbGVuPWRzdGxlbjsgIC8qIE5vLCB0aGlzIGNhc2UgaXMgbm90IGFuIGVycm9yIHVuZGVyIFdpbmRvd3MgOTUuCgkJICAgICAgICAgQW5kIG5vICdcMCcgZ2V0cyB3cml0dGVuLiAqLwogICAgaWYgKG1hcGZsYWdzICYgTENNQVBfVVBQRVJDQVNFKQogICAgICBmID0gdG91cHBlcjsKICAgIGVsc2UgaWYgKG1hcGZsYWdzICYgTENNQVBfTE9XRVJDQVNFKQogICAgICBmID0gdG9sb3dlcjsKICAgIGZvciAoaT0wOyBpIDwgc3JjbGVuOyBpKyspCiAgICAgIGRzdHN0cltpXSA9IChDSEFSKSBmKHNyY3N0cltpXSk7CiAgICByZXR1cm4gc3JjbGVuOwogIH0KCiAgLyogZWxzZSAuLi4gKG1hcGZsYWdzICYgTENNQVBfU09SVEtFWSkgICovCiAgewogICAgaW50IHVuaWNvZGVfbGVuPTA7CiAgICBpbnQgY2FzZV9sZW49MDsKICAgIGludCBkaWFjcml0aWNfbGVuPTA7CiAgICBpbnQgZGVsYXllZF9wdW5jdHVhdGlvbl9sZW49MDsKICAgIGNoYXIgKmNhc2VfY29tcG9uZW50OwogICAgY2hhciAqZGlhY3JpdGljX2NvbXBvbmVudDsKICAgIGNoYXIgKmRlbGF5ZWRfcHVuY3R1YXRpb25fY29tcG9uZW50OwogICAgaW50IHJvb20sY291bnQ7CiAgICBpbnQgZmxhZ19zdHJpbmdzb3J0ID0gbWFwZmxhZ3MgJiBTT1JUX1NUUklOR1NPUlQ7CgogICAgLyogY29tcHV0ZSBob3cgbXVjaCByb29tIHdlIHdpbGwgbmVlZCAqLwogICAgZm9yIChpPTA7aTxzcmNsZW47aSsrKQogICAgewogICAgICBpbnQgb2ZzOwogICAgICB1bnNpZ25lZCBjaGFyIHNvdXJjZV9jaGFyID0gc3Jjc3RyW2ldOwogICAgICBpZiAoc291cmNlX2NoYXIhPSdcMCcpIAogICAgICB7CglpZiAoZmxhZ19zdHJpbmdzb3J0IHx8ICFpc19wdW5jdHVhdGlvbihzb3VyY2VfY2hhcikpCgl7CgkgIHVuaWNvZGVfbGVuKys7CgkgIGlmICggTENNX1VuaWNvZGVfTFVUWy0yKzIqc291cmNlX2NoYXJdICYgfjE1ICkKCSAgICB1bmljb2RlX2xlbisrOyAgICAgICAgICAgICAvKiBkb3VibGUgbGV0dGVyICovCgl9CgllbHNlCgl7CgkgIGRlbGF5ZWRfcHVuY3R1YXRpb25fbGVuKys7Cgl9CSAgCiAgICAgIH0KCSAgCiAgICAgIGlmIChpc3VwcGVyKHNvdXJjZV9jaGFyKSkKCWNhc2VfbGVuPXVuaWNvZGVfbGVuOyAKCiAgICAgIG9mcyA9IHNvdXJjZV9jaGFyIC0gTENNX0RpYWNyaXRpY19TdGFydDsKICAgICAgaWYgKChvZnM+PTApICYmIChMQ01fRGlhY3JpdGljX0xVVFtvZnNdIT0yKSkKCWRpYWNyaXRpY19sZW49dW5pY29kZV9sZW47CiAgICB9CgogICAgaWYgKG1hcGZsYWdzICYgTk9STV9JR05PUkVDQVNFKQogICAgICBjYXNlX2xlbj0wOyAgICAgICAgICAgICAgICAgICAKICAgIGlmIChtYXBmbGFncyAmIE5PUk1fSUdOT1JFTk9OU1BBQ0UpCiAgICAgIGRpYWNyaXRpY19sZW49MDsKCiAgICByb29tID0gIDIgKiB1bmljb2RlX2xlbiAgICAgICAgICAgICAgLyogInVuaWNvZGUiIGNvbXBvbmVudCAqLwogICAgICArICAgICBkaWFjcml0aWNfbGVuICAgICAgICAgICAgICAgIC8qICJkaWFjcml0aWMiIGNvbXBvbmVudCAqLwogICAgICArICAgICBjYXNlX2xlbiAgICAgICAgICAgICAgICAgICAgIC8qICJjYXNlIiBjb21wb25lbnQgKi8KICAgICAgKyAgICAgNCAqIGRlbGF5ZWRfcHVuY3R1YXRpb25fbGVuICAvKiBwdW5jdHVhdGlvbiBpbiB3b3JkIHNvcnQgbW9kZSAqLwogICAgICArICAgICA0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZvdXIgJ1wxJyBzZXBhcmF0b3JzICovCiAgICAgICsgICAgIDEgIDsgICAgICAgICAgICAgICAgICAgICAgICAgLyogdGVybWluYWwgJ1wwJyAqLwogICAgaWYgKGRzdGxlbj09MCkKICAgICAgcmV0dXJuIHJvb207ICAgICAgCiAgICBlbHNlIGlmIChkc3RsZW48cm9vbSkKICAgIHsKICAgICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOU1VGRklDSUVOVF9CVUZGRVIpOwogICAgICByZXR1cm4gMDsKICAgIH0KCiAgICAvKkZJWE1FIHRoZSBQb2ludGVyY2hlY2sgc2hvdWxkIG5vdCBiZSBuZXNzZXNhcnkgKi8KICAgIGlmIChJc0JhZFdyaXRlUHRyMzIgKGRzdHN0cixyb29tKSkKICAgIHsgRVJSIChzdHJpbmcsImJhZCBkZXN0aW5hdGlvbiBidWZmZXIgKGRzdHN0cikgOiAlcCwlZFxuIixkc3RzdHIsZHN0bGVuKTsKICAgICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOU1VGRklDSUVOVF9CVUZGRVIpOwogICAgICByZXR1cm4gMDsKICAgIH0KCiAgICAvKiBsb2NhdGUgZWFjaCBjb21wb25lbnQsIHdyaXRlIHNlcGFyYXRvcnMgKi8KICAgIGRpYWNyaXRpY19jb21wb25lbnQgPSBkc3RzdHIgKyAyKnVuaWNvZGVfbGVuIDsKICAgICpkaWFjcml0aWNfY29tcG9uZW50KysgPSAnXDEnOyAKICAgIGNhc2VfY29tcG9uZW50ID0gZGlhY3JpdGljX2NvbXBvbmVudCArIGRpYWNyaXRpY19sZW4gOwogICAgKmNhc2VfY29tcG9uZW50KysgPSAnXDEnOyAKICAgIGRlbGF5ZWRfcHVuY3R1YXRpb25fY29tcG9uZW50ID0gY2FzZV9jb21wb25lbnQgKyBjYXNlX2xlbiA7CiAgICAqZGVsYXllZF9wdW5jdHVhdGlvbl9jb21wb25lbnQrKyA9ICdcMSc7CiAgICAqZGVsYXllZF9wdW5jdHVhdGlvbl9jb21wb25lbnQrKyA9ICdcMSc7CgogICAgLyogcmVhZCBzb3VyY2Ugc3RyaW5nIGNoYXIgYnkgY2hhciwgd3JpdGUgCiAgICAgICBjb3JyZXNwb25kaW5nIHdlaWdodCBpbiBlYWNoIGNvbXBvbmVudC4gKi8KICAgIGZvciAoaT0wLGNvdW50PTA7aTxzcmNsZW47aSsrKQogICAgewogICAgICB1bnNpZ25lZCBjaGFyIHNvdXJjZV9jaGFyPXNyY3N0cltpXTsKICAgICAgaWYgKHNvdXJjZV9jaGFyIT0nXDAnKSAKICAgICAgewoJaW50IHR5cGUsbG9uZ2NvZGU7Cgl0eXBlID0gTENNX1VuaWNvZGVfTFVUWy0yKzIqc291cmNlX2NoYXJdOwoJbG9uZ2NvZGUgPSB0eXBlID4+IDQ7Cgl0eXBlICY9IDE1OwoJaWYgKCFmbGFnX3N0cmluZ3NvcnQgJiYgaXNfcHVuY3R1YXRpb24oc291cmNlX2NoYXIpKSAKCXsKCSAgVUlOVDE2IGVuY3J5cHRlZF9sb2NhdGlvbiA9ICgxPDwxNSkgKyA3ICsgNCpjb3VudDsKCSAgKmRlbGF5ZWRfcHVuY3R1YXRpb25fY29tcG9uZW50KysgPSAodW5zaWduZWQgY2hhcikgKGVuY3J5cHRlZF9sb2NhdGlvbj4+OCk7CgkgICpkZWxheWVkX3B1bmN0dWF0aW9uX2NvbXBvbmVudCsrID0gKHVuc2lnbmVkIGNoYXIpIChlbmNyeXB0ZWRfbG9jYXRpb24mMjU1KTsKICAgICAgICAgICAgICAgICAgICAgLyogYmlnLWVuZGlhbiBpcyB1c2VkIGhlcmUgYmVjYXVzZSBpdCBsZXRzIHN0cmluZyBjb21wYXJpc29uIGJlCgkJCWNvbXBhdGlibGUgd2l0aCBudW1lcmljYWwgY29tcGFyaXNvbiAqLwoKCSAgKmRlbGF5ZWRfcHVuY3R1YXRpb25fY29tcG9uZW50KysgPSB0eXBlOwoJICAqZGVsYXllZF9wdW5jdHVhdGlvbl9jb21wb25lbnQrKyA9IExDTV9Vbmljb2RlX0xVVFstMSsyKnNvdXJjZV9jaGFyXTsgIAogICAgICAgICAgICAgICAgICAgICAvKiBhc3N1bXB0aW9uIDogYSBwdW5jdHVhdGlvbiBjaGFyYWN0ZXIgaXMgbmV2ZXIgYSAKCQkJZG91YmxlIG9yIGFjY2VudGVkIGxldHRlciAqLwoJfQoJZWxzZQoJewoJICBkc3RzdHJbMipjb3VudF0gPSB0eXBlOwoJICBkc3RzdHJbMipjb3VudCsxXSA9IExDTV9Vbmljb2RlX0xVVFstMSsyKnNvdXJjZV9jaGFyXTsgIAoJICBpZiAobG9uZ2NvZGUpCgkgIHsKCSAgICBpZiAoY291bnQ8Y2FzZV9sZW4pCgkgICAgICBjYXNlX2NvbXBvbmVudFtjb3VudF0gPSAoIGlzdXBwZXIoc291cmNlX2NoYXIpID8gMTggOiAyICkgOwoJICAgIGlmIChjb3VudDxkaWFjcml0aWNfbGVuKQoJICAgICAgZGlhY3JpdGljX2NvbXBvbmVudFtjb3VudF0gPSAyOyAvKiBhc3N1bXB0aW9uOiBhIGRvdWJsZSBsZXR0ZXIKCQkJCQkJIGlzIG5ldmVyIGFjY2VudGVkICovCgkgICAgY291bnQrKzsKCSAgICAKCSAgICBkc3RzdHJbMipjb3VudF0gPSB0eXBlOwoJICAgIGRzdHN0clsyKmNvdW50KzFdID0gKihMQ01fVW5pY29kZV9MVVRfMiAtIDEgKyBsb25nY29kZSk7IAoJICAgIC8qIDE2IGluIHRoZSBmaXJzdCBjb2x1bW4gb2YgTENNX1VuaWNvZGVfTFVUICAtLT4gIGxvbmdjb2RlID0gMSAKCSAgICAgICAzMiBpbiB0aGUgZmlyc3QgY29sdW1uIG9mIExDTV9Vbmljb2RlX0xVVCAgLS0+ICBsb25nY29kZSA9IDIgCgkgICAgICAgNDggaW4gdGhlIGZpcnN0IGNvbHVtbiBvZiBMQ01fVW5pY29kZV9MVVQgIC0tPiAgbG9uZ2NvZGUgPSAzICovCgkgIH0KCgkgIGlmIChjb3VudDxjYXNlX2xlbikKCSAgICBjYXNlX2NvbXBvbmVudFtjb3VudF0gPSAoIGlzdXBwZXIoc291cmNlX2NoYXIpID8gMTggOiAyICkgOwoJICBpZiAoY291bnQ8ZGlhY3JpdGljX2xlbikKCSAgewoJICAgIGludCBvZnMgPSBzb3VyY2VfY2hhciAtIExDTV9EaWFjcml0aWNfU3RhcnQ7CgkgICAgZGlhY3JpdGljX2NvbXBvbmVudFtjb3VudF0gPSAob2ZzPj0wID8gTENNX0RpYWNyaXRpY19MVVRbb2ZzXSA6IDIpOwoJICB9CgkgIGNvdW50Kys7Cgl9CiAgICAgIH0KICAgIH0KICAgIGRzdHN0cltyb29tLTFdID0gJ1wwJzsKICAgIHJldHVybiByb29tOwogIH0KfQoJCSAgICAgCklOVDMyIFdJTkFQSSBMQ01hcFN0cmluZzMyVygKCUxDSUQgbGNpZCxEV09SRCBtYXBmbGFncyxMUENXU1RSIHNyY3N0cixJTlQzMiBzcmNsZW4sTFBXU1RSIGRzdHN0ciwKCUlOVDMyIGRzdGxlbikKewogIGludCBpOwogCiAgVFJBQ0Uoc3RyaW5nLCIoMHglMDRseCwweCUwOGx4LCVwLCVkLCVwLCVkKVxuIiwKCWxjaWQsbWFwZmxhZ3Msc3Jjc3RyLHNyY2xlbixkc3RzdHIsZHN0bGVuKTsKCiAgaWYgKCAoKGRzdGxlbiE9MCkgJiYgKGRzdHN0cj09TlVMTCkpIHx8IChzcmNzdHI9PU5VTEwpICkKICB7CiAgICBTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOwogICAgcmV0dXJuIDA7CiAgfQogIGlmIChzcmNsZW49PS0xKSAKICAgIHNyY2xlbiA9IGxzdHJsZW4zMlcoc3Jjc3RyKSsxOwogIGlmIChtYXBmbGFncyAmIExDTUFQX1NPUlRLRVkpIAogIHsKICAgIEZJWE1FKHN0cmluZywiKDB4JTA0bHgsMHglMDhseCwlcCwlZCwlcCwlZCk6ICIKCSAgInVuaW1wbGVtZW50ZWQgZmxhZ3M6IDB4JTA4bHhcbiIsCgkgIGxjaWQsbWFwZmxhZ3Msc3Jjc3RyLHNyY2xlbixkc3RzdHIsZHN0bGVuLG1hcGZsYWdzKTsKICAgIHJldHVybiAwOwogIH0KICBlbHNlCiAgewogICAgaW50ICgqZikoaW50KT1pZGVudGl0eTsgCgogICAgaWYgKGRzdGxlbj09MCkKICAgICAgcmV0dXJuIHNyY2xlbjsgIAogICAgaWYgKGRzdGxlbjxzcmNsZW4pCiAgICAgIHJldHVybiAwOyAgICAgICAKICAgIGlmIChtYXBmbGFncyAmIExDTUFQX1VQUEVSQ0FTRSkKICAgICAgZiA9IHRvdXBwZXI7CiAgICBlbHNlIGlmIChtYXBmbGFncyAmIExDTUFQX0xPV0VSQ0FTRSkKICAgICAgZiA9IHRvbG93ZXI7CiAgICBmb3IgKGk9MDsgaSA8IHNyY2xlbjsgaSsrKQogICAgICBkc3RzdHJbaV0gPSAoV0NIQVIpIGYoc3Jjc3RyW2ldKTsKICAgIHJldHVybiBzcmNsZW47CiAgfQp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIENvbXBhcmVTdHJpbmcxNiAgICAgICAoT0xFMk5MUy44KQogKi8KVUlOVDE2IFdJTkFQSSBDb21wYXJlU3RyaW5nMTYoRFdPUkQgbGNpZCxEV09SRCBmZHdTdHlsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBDU1RSIHMxLERXT1JEIGwxLExQQ1NUUiBzMixEV09SRCBsMikKewoJcmV0dXJuIChVSU5UMTYpQ29tcGFyZVN0cmluZzMyQShsY2lkLGZkd1N0eWxlLHMxLGwxLHMyLGwyKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBDb21wYXJlU3RyaW5nMzJBICAgKEtFUk5FTDMyLjI5KQogKiBUaGlzIGltcGxlbWVudGF0aW9uIGlnbm9yZXMgdGhlIGxvY2FsZQogKiBGSVhNRQogKiBNb3Jlb3ZlciBpdCBpcyBxdWl0ZSBpbmVmZmljaWVudC4gRklYTUUgdG9vIQogKi8KVUlOVDMyIFdJTkFQSSBDb21wYXJlU3RyaW5nMzJBKERXT1JEIGxjaWQsIERXT1JEIGZkd1N0eWxlLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQQ1NUUiBzMSwgRFdPUkQgbDEsIExQQ1NUUiBzMixEV09SRCBsMikKewogIGludCBtYXBzdHJpbmdfZmxhZ3M7CiAgaW50IGxlbjEsbGVuMjsKICBpbnQgcmVzdWx0OwogIExQU1RSIHNrMSxzazI7CiAgVFJBQ0Uob2xlLCIlcyBhbmQgJXNcbiIsCglkZWJ1Z3N0cl9hIChzMSksIGRlYnVnc3RyX2EgKHMyKSk7CgogIGlmICggKHMxPT1OVUxMKSB8fCAoczI9PU5VTEwpICkKICB7ICAgIAogICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKICAgIHJldHVybiAwOwogIH0KCiAgaWYoZmR3U3R5bGUgJiBOT1JNX0lHTk9SRVNZTUJPTFMpCiAgICBGSVhNRShvbGUsICJJR05PUkVTWU1CT0xTIG5vdCBzdXBwb3J0ZWRcbiIpOwogIAkKICBtYXBzdHJpbmdfZmxhZ3MgPSBMQ01BUF9TT1JUS0VZIHwgZmR3U3R5bGUgOwogIGxlbjEgPSBMQ01hcFN0cmluZzMyQShsY2lkLG1hcHN0cmluZ19mbGFncyxzMSxsMSxOVUxMLDApOwogIGxlbjIgPSBMQ01hcFN0cmluZzMyQShsY2lkLG1hcHN0cmluZ19mbGFncyxzMixsMixOVUxMLDApOwoKICBpZiAoKGxlbjE9PTApfHwobGVuMj09MCkpCiAgICByZXR1cm4gMDsgICAgIC8qIHNvbWV0aGluZyB3cm9uZyBoYXBwZW5lZCAqLwoKICBzazEgPSAoTFBTVFIpSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksMCxsZW4xKTsKICBzazIgPSAoTFBTVFIpSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksMCxsZW4yKTsKICBpZiAoICghTENNYXBTdHJpbmczMkEobGNpZCxtYXBzdHJpbmdfZmxhZ3MsczEsbDEsc2sxLGxlbjEpKQoJIHx8ICghTENNYXBTdHJpbmczMkEobGNpZCxtYXBzdHJpbmdfZmxhZ3MsczIsbDIsc2syLGxlbjIpKSApCiAgeyBFUlIob2xlLCJCdWcgaW4gTENtYXBTdHJpbmczMkEuXG4iKTsKICAgIHJlc3VsdCA9IDA7CiAgfQogIGVsc2UKICB7IHJlc3VsdCA9IHN0cmNtcChzazEsc2syKSsyOwogIH0KICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLDAsc2sxKTsKICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLDAsc2syKTsKICByZXR1cm4gcmVzdWx0Owp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIENvbXBhcmVTdHJpbmczMlcgICAgICAgKEtFUk5FTDMyLjMwKQogKiBUaGlzIGltcGxlbWVudGF0aW9uIGlnbm9yZXMgdGhlIGxvY2FsZQogKiBGSVhNRSA6ICBEb2VzIG9ubHkgc3RyaW5nIHNvcnQuICBTaG91bGQKICogYmUgcmVpbXBsZW1lbnRlZCB0aGUgc2FtZSB3YXkgYXMgQ29tcGFyZVN0cmluZzMyQS4KICovClVJTlQzMiBXSU5BUEkgQ29tcGFyZVN0cmluZzMyVyhEV09SRCBsY2lkLCBEV09SRCBmZHdTdHlsZSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUENXU1RSIHMxLCBEV09SRCBsMSwgTFBDV1NUUiBzMixEV09SRCBsMikKewoJaW50IGxlbixyZXQ7CglpZihmZHdTdHlsZSAmIE5PUk1fSUdOT1JFTk9OU1BBQ0UpCgkJRklYTUUob2xlLCJJR05PUkVOT05TUEFDRSBub3Qgc3VwcHJ0ZWRcbiIpOwoJaWYoZmR3U3R5bGUgJiBOT1JNX0lHTk9SRVNZTUJPTFMpCgkJRklYTUUob2xlLCJJR05PUkVTWU1CT0xTIG5vdCBzdXBwb3J0ZWRcbiIpOwoKCS8qIElzIHN0cmNtcCBkZWZhdWx0aW5nIHRvIHN0cmluZyBzb3J0IG9yIHRvIHdvcmQgc29ydD8/ICovCgkvKiBGSVhNRTogSGFuZGxlIE5PUk1fU1RSSU5HU09SVCAqLwoJbDEgPSAobDE9PS0xKT9sc3RybGVuMzJXKHMxKTpsMTsKCWwyID0gKGwyPT0tMSk/bHN0cmxlbjMyVyhzMik6bDI7CglsZW4gPSBsMTxsMiA/IGwxOmwyOwoJcmV0ID0gKGZkd1N0eWxlICYgTk9STV9JR05PUkVDQVNFKSA/CgkJbHN0cm5jbXBpMzJXKHMxLHMyLGxlbikJOiBsc3RybmNtcDMyVyhzMSxzMixsZW4pOwoJLyogbm90IGVxdWFsLCByZXR1cm4gMSBvciAzICovCglpZihyZXQhPTApIHJldHVybiByZXQrMjsKCS8qIHNhbWUgbGVuLCByZXR1cm4gMiAqLwoJaWYobDE9PWwyKSByZXR1cm4gMjsKCS8qIHRoZSBsb25nZXIgb25lIGlzIGxleGljYWxseSBncmVhdGVyICovCglyZXR1cm4gKGwxPGwyKT8gMSA6IDM7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiAgT0xFX0dldEZvcm1hdEEoKSBbaW50ZXJuYWxdCgoKIFRoaXMgZnVuY3Rpb24gaW1wbGVtZW50cyBzdHVmZiBmb3IgR2V0RGF0ZUZvcm1hdCgpIGFuZCAKIEdldFRpbWVGb3JtYXQoKS4KCiAgZCAgICBzaW5nbGUtZGlnaXQgKG5vIGxlYWRpbmcgemVybykgZGF5IChvZiBtb250aCkKICBkZCAgIHR3by1kaWdpdCBkYXkgKG9mIG1vbnRoKQogIGRkZCAgc2hvcnQgZGF5LW9mLXdlZWsgbmFtZQogIGRkZGQgbG9uZyBkYXktb2Ytd2VlayBuYW1lCiAgTSAgICBzaW5nbGUtZGlnaXQgbW9udGgKICBNTSAgIHR3by1kaWdpdCBtb250aAogIE1NTSAgc2hvcnQgbW9udGggbmFtZQogIE1NTU0gZnVsbCBtb250aCBuYW1lCiAgeSAgICB0d28tZGlnaXQgeWVhciwgbm8gbGVhZGluZyAwCiAgeXkgICB0d28tZGlnaXQgeWVhcgogIHl5eXkgZm91ci1kaWdpdCB5ZWFyCiAgZ2cgICBlcmEgc3RyaW5nCiAgaCAgICBob3VycyB3aXRoIG5vIGxlYWRpbmcgemVybyAoMTItaG91cikKICBoaCAgIGhvdXJzIHdpdGggZnVsbCB0d28gZGlnaXRzCiAgSCAgICBob3VycyB3aXRoIG5vIGxlYWRpbmcgemVybyAoMjQtaG91cikKICBISCAgIGhvdXJzIHdpdGggZnVsbCB0d28gZGlnaXRzCiAgbSAgICBtaW51dGVzIHdpdGggbm8gbGVhZGluZyB6ZXJvCiAgbW0gICBtaW51dGVzIHdpdGggZnVsbCB0d28gZGlnaXRzCiAgcyAgICBzZWNvbmRzIHdpdGggbm8gbGVhZGluZyB6ZXJvCiAgc3MgICBzZWNvbmRzIHdpdGggZnVsbCB0d28gZGlnaXRzCiAgdCAgICB0aW1lIG1hcmtlciAoQSBvciBQKQogIHR0ICAgdGltZSBtYXJrZXIgKEFNLCBQTSkKICAnJyAgIHVzZWQgdG8gcXVvdGUgbGl0ZXJhbCBjaGFyYWN0ZXJzCiAgJycgICAod2l0aGluIGEgcXVvdGVkIHN0cmluZykgaW5kaWNhdGVzIGEgbGl0ZXJhbCAnCgogVGhlc2UgZnVuY3Rpb25zIFJFUVVJUkUgdmFsaWQgbG9jYWxlLCBkYXRlLCAgYW5kIGZvcm1hdC4gCgogKi8KCklOVDMyIFdJTkFQSSBPTEVfR2V0Rm9ybWF0QShMQ0lEIGxvY2FsZSwKCQkJICAgIERXT1JEIGZsYWdzLAoJCQkgICAgTFBTWVNURU1USU1FIHh0aW1lLAoJCQkgICAgTFBDU1RSIGZvcm1hdCwgCgkJCSAgICBMUFNUUiBkYXRlLCBJTlQzMiBkYXRlbGVuKQp7CiAgIElOVDMyIGlucG9zLCBvdXRwb3M7CiAgIGludCBjb3VudCwgdHlwZSwgaW5xdW90ZSwgT3ZlcmZsb3c7CiAgIGNoYXIgYnVmWzQwXTsKICAgaW50IGJ1ZmxlbjsKCiAgIGNvbnN0IGNoYXIgKiBfZGdmbXRbXSA9IHsgIiVkIiwgIiUwMmQiIH07CiAgIGNvbnN0IGNoYXIgKiogZGdmbXQgPSBfZGdmbXQgLSAxOyAKCiAgIC8qIHJlcG9ydCwgZm9yIGRlYnVnZ2luZyAqLwogICBUUkFDRShvbGUsICJmdW5jKCU4bHgsJThseCwgdGltZShkPSVkLGg9JWQsbT0lZCxzPSVkKSwgZm10OlwnJXNcJyAoYXQgJXApLCAlcCAoJTlzKSwgbGVuPSVkKVxuIiwgbG9jYWxlLCBmbGFncywKCSB4dGltZS0+d0RheSwgeHRpbWUtPndIb3VyLCB4dGltZS0+d01pbnV0ZSwgeHRpbWUtPndTZWNvbmQsCgkgZm9ybWF0LCBmb3JtYXQsIGRhdGUsIGRhdGUsIGRhdGVsZW4pOwogIAogICAvKiBpbml0YWxpemUgc3RhdGUgdmFyaWFibGVzIGFuZCBvdXRwdXQgYnVmZmVyICovCiAgIGlucG9zID0gb3V0cG9zID0gMDsKICAgY291bnQgPSAwOyBpbnF1b3RlID0gMDsgT3ZlcmZsb3cgPSAwOwogICB0eXBlID0gJ1wwJzsKICAgZGF0ZVswXSA9IGJ1ZlswXSA9ICdcMCc7CiAgICAgIAogICBmb3IgKGlucG9zID0gMDs7IGlucG9zKyspIHsKICAgICAgLyogVFJBQ0Uob2xlLCAiU1RBVEUgaW5wb3M9JTJkIG91dHBvcz0lMmQgY291bnQ9JWQgaW5xdW90ZT0lZCB0eXBlPSVjIGJ1ZixkYXRlID0gJWMsJWNcbiIsIGlucG9zLCBvdXRwb3MsIGNvdW50LCBpbnF1b3RlLCB0eXBlLCBidWZbaW5wb3NdLCBkYXRlW291dHBvc10pOyAqLwogICAgICBpZiAoaW5xdW90ZSkgewoJIGlmIChmb3JtYXRbaW5wb3NdID09ICdcJycpIHsKCSAgICBpZiAoZm9ybWF0W2lucG9zKzFdID09ICdcJycpIHsKCSAgICAgICBpbnBvcyArPSAxOwoJICAgICAgIGRhdGVbb3V0cG9zKytdID0gJ1wnJzsKCSAgICB9IGVsc2UgewoJICAgICAgIGlucXVvdGUgPSAwOwoJICAgICAgIGNvbnRpbnVlOyAvKiB3ZSBkaWQgbm90aGluZyB0byB0aGUgb3V0cHV0ICovCgkgICAgfQoJIH0gZWxzZSBpZiAoZm9ybWF0W2lucG9zXSA9PSAnXDAnKSB7CgkgICAgZGF0ZVtvdXRwb3MrK10gPSAnXDAnOwoJICAgIGlmIChvdXRwb3MgPiBkYXRlbGVuKSBPdmVyZmxvdyA9IDE7CgkgICAgYnJlYWs7CgkgfSBlbHNlIHsKCSAgICBkYXRlW291dHBvcysrXSA9IGZvcm1hdFtpbnBvc107CgkgICAgaWYgKG91dHBvcyA+IGRhdGVsZW4pIHsKCSAgICAgICBPdmVyZmxvdyA9IDE7CgkgICAgICAgZGF0ZVtvdXRwb3MtMV0gPSAnXDAnOyAvKiB0aGlzIGlzIHRoZSBsYXN0IHBsYWNlIHdoZXJlCgkJCQkJIGl0J3Mgc2FmZSB0byB3cml0ZSAqLwoJICAgICAgIGJyZWFrOwoJICAgIH0KCSB9CiAgICAgIH0gZWxzZSBpZiAoICAoY291bnQgJiYgKGZvcm1hdFtpbnBvc10gIT0gdHlwZSkpCgkJICAgfHwgY291bnQgPT0gNAoJCSAgIHx8IChjb3VudCA9PSAyICYmIHN0cmNocigiZ2hIbXN0IiwgdHlwZSkpICkKICAgICAgIHsKCSAgICBpZiAgICAgICAgICh0eXBlID09ICdkJykgewoJICAgICAgIGlmICAgICAgICAoY291bnQgPT0gNCkgewoJCSAgR2V0TG9jYWxlSW5mbzMyQShsb2NhbGUsCgkJCQkgICBMT0NBTEVfU0RBWU5BTUUxCgkJCQkgICArIHh0aW1lLT53RGF5T2ZXZWVrIC0gMSwKCQkJCSAgIGJ1Ziwgc2l6ZW9mKGJ1ZikpOwoJICAgICAgIH0gZWxzZSBpZiAoY291bnQgPT0gMykgewoJCQkgICBHZXRMb2NhbGVJbmZvMzJBKGxvY2FsZSwgCgkJCQkJICAgIExPQ0FMRV9TQUJCUkVWREFZTkFNRTEgCgkJCQkJICAgICsgeHRpbWUtPndEYXlPZldlZWsgLSAxLAoJCQkJCSAgICBidWYsIHNpemVvZihidWYpKTsKCQkgICAgICB9IGVsc2UgewoJCSAgc3ByaW50ZihidWYsIGRnZm10W2NvdW50XSwgeHRpbWUtPndEYXkpOwoJICAgICAgIH0KCSAgICB9IGVsc2UgaWYgKHR5cGUgPT0gJ00nKSB7CgkgICAgICAgaWYgKGNvdW50ID09IDMpIHsKCQkgIEdldExvY2FsZUluZm8zMkEobG9jYWxlLCAKCQkJCSAgIExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FMQoJCQkJICAgKyB4dGltZS0+d01vbnRoIC0gMSwKCQkJCSAgIGJ1Ziwgc2l6ZW9mKGJ1ZikpOwoJICAgICAgIH0gZWxzZSBpZiAoY291bnQgPT0gNCkgewoJCSAgR2V0TG9jYWxlSW5mbzMyQShsb2NhbGUsCgkJCQkgICBMT0NBTEVfU01PTlRITkFNRTEKCQkJCSAgICsgeHRpbWUtPndNb250aCAtIDEsCgkJCQkgICBidWYsIHNpemVvZihidWYpKTsKCQkgfSBlbHNlIHsKCQkgIHNwcmludGYoYnVmLCBkZ2ZtdFtjb3VudF0sIHh0aW1lLT53TW9udGgpOwoJICAgICAgIH0KCSAgICB9IGVsc2UgaWYgKHR5cGUgPT0gJ3knKSB7CgkgICAgICAgaWYgKGNvdW50ID09IDQpIHsKCQkgICAgICBzcHJpbnRmKGJ1ZiwgIiVkIiwgeHRpbWUtPndZZWFyKTsKCSAgICAgICB9IGVsc2UgaWYgKGNvdW50ID09IDMpIHsKCQkgIHN0cmNweShidWYsICJ5eXkiKTsKCQkgIFdBUk4ob2xlLAoJCQkgICAgICAidW5rbm93biBmb3JtYXQsXApjPSVjLCBuPSVkXG4iLCAgdHlwZSwgY291bnQpOwoJCSB9IGVsc2UgewoJCSAgc3ByaW50ZihidWYsIGRnZm10W2NvdW50XSwgeHRpbWUtPndZZWFyICUgMTAwKTsKCSAgICAgICB9CgkgICAgfSBlbHNlIGlmICh0eXBlID09ICdnJykgewoJICAgICAgIGlmICAgICAgICAoY291bnQgPT0gMikgewoJCSAgRklYTUUob2xlLCAiTE9DQUxFX0lDQUxFTkRBUlRZUEUgdW5pbXAuXG4iKTsKCQkgIHN0cmNweShidWYsICJBRCIpOwoJICAgIH0gZWxzZSB7CgkJICBzdHJjcHkoYnVmLCAiZyIpOwoJCSAgV0FSTihvbGUsCgkJCSAgICAgICAidW5rbm93biBmb3JtYXQsIFwKYz0lYywgbj0lZFxuIiwgdHlwZSwgY291bnQpOwoJICAgICAgIH0KCSAgICB9IGVsc2UgaWYgKHR5cGUgPT0gJ2gnKSB7CgkgICAgICAgLyogZ2l2ZXMgdXMgaG91cnMgMTowMCAtLSAxMjowMCAqLwoJICAgICAgIHNwcmludGYoYnVmLCBkZ2ZtdFtjb3VudF0sICh4dGltZS0+d0hvdXItMSklMTIgKzEpOwoJICAgIH0gZWxzZSBpZiAodHlwZSA9PSAnSCcpIHsKCSAgICAgICAvKiAyNC1ob3VyIHRpbWUgKi8KCSAgICAgICBzcHJpbnRmKGJ1ZiwgZGdmbXRbY291bnRdLCB4dGltZS0+d0hvdXIpOwoJICAgIH0gZWxzZSBpZiAodHlwZSA9PSAnbScpIHsKCSAgICAgICBzcHJpbnRmKGJ1ZiwgZGdmbXRbY291bnRdLCB4dGltZS0+d01pbnV0ZSk7CgkgICAgfSBlbHNlIGlmICh0eXBlID09ICdzJykgewoJICAgICAgIHNwcmludGYoYnVmLCBkZ2ZtdFtjb3VudF0sIHh0aW1lLT53U2Vjb25kKTsKCSAgICB9IGVsc2UgaWYgKHR5cGUgPT0gJ3QnKSB7CgkgICAgICAgaWYgICAgICAgIChjb3VudCA9PSAxKSB7CgkJICBzcHJpbnRmKGJ1ZiwgIiVjIiwgKHh0aW1lLT53SG91ciA8IDEyKSA/ICdBJyA6ICdQJyk7CgkgICAgICAgfSBlbHNlIGlmIChjb3VudCA9PSAyKSB7CgkJICAvKiBzcHJpbnRmKGJ1ZiwgIiVzIiwgKHh0aW1lLT53SG91ciA8IDEyKSA/ICJBTSIgOiAiUE0iKTsgKi8KCQkgIEdldExvY2FsZUluZm8zMkEobG9jYWxlLAoJCQkJICAgKHh0aW1lLT53SG91cjwxMikgCgkJCQkgICA/IExPQ0FMRV9TMTE1OSA6IExPQ0FMRV9TMjM1OSwKCQkJCSAgIGJ1Ziwgc2l6ZW9mKGJ1ZikpOwoJICAgICAgIH0KCSAgICB9OwoKCSAgICAvKiB3ZSBuZWVkIHRvIGNoZWNrIHRoZSBuZXh0IGNoYXIgaW4gdGhlIGZvcm1hdCBzdHJpbmcgCgkgICAgICAgYWdhaW4sIG5vIG1hdHRlciB3aGF0IGhhcHBlbmVkICovCgkgICAgaW5wb3MtLTsKCSAgICAKCSAgICAvKiBhZGQgdGhlIGNvbnRlbnRzIG9mIGJ1ZiB0byB0aGUgb3V0cHV0ICovCgkgICAgYnVmbGVuID0gc3RybGVuKGJ1Zik7CgkgICAgaWYgKG91dHBvcyArIGJ1ZmxlbiA8IGRhdGVsZW4pIHsKCSAgICAgICBkYXRlW291dHBvc10gPSAnXDAnOyAvKiBmb3Igc3RyY2F0IHRvIGhvb2sgb250byAqLwoJCSBzdHJjYXQoZGF0ZSwgYnVmKTsKCSAgICAgICBvdXRwb3MgKz0gYnVmbGVuOwoJICAgIH0gZWxzZSB7CgkgICAgICAgZGF0ZVtvdXRwb3NdID0gJ1wwJzsKCSAgICAgICBzdHJuY2F0KGRhdGUsIGJ1ZiwgZGF0ZWxlbiAtIG91dHBvcyk7CgkJIGRhdGVbZGF0ZWxlbiAtIDFdID0gJ1wwJzsKCQkgU2V0TGFzdEVycm9yKEVSUk9SX0lOU1VGRklDSUVOVF9CVUZGRVIpOwoJICAgICAgIFdBUk4ob2xlLCAiaW5zdWZmaWNpZW50IGJ1ZmZlclxuIik7CgkJIHJldHVybiAwOwoJICAgIH0KCgkgICAgLyogcmVzZXQgdGhlIHZhcmlhYmxlcyB3ZSB1c2VkIHRvIGtlZXAgdHJhY2sgb2YgdGhpcyBpdGVtICovCgkgICAgY291bnQgPSAwOwoJICAgIHR5cGUgPSAnXDAnOwoJIH0gZWxzZSBpZiAoZm9ybWF0W2lucG9zXSA9PSAnXDAnKSB7CgkgICAgLyogd2UgY2FuJ3QgY2hlY2sgZm9yIHRoaXMgYXQgdGhlIGxvb3AtaGVhZCwgYmVjYXVzZQoJICAgICAgIHRoYXQgYnJlYWtzIHRoZSBwcmludGluZyBvZiB0aGUgbGFzdCBmb3JtYXQtaXRlbSAqLwoJICAgIGRhdGVbb3V0cG9zXSA9ICdcMCc7CgkgICAgYnJlYWs7CiAgICAgICAgIH0gZWxzZSBpZiAoY291bnQpIHsKCSAgICAvKiBjb250aW51aW5nIGEgY29kZSBmb3IgYW4gaXRlbSAqLwoJICAgIGNvdW50ICs9MTsKCSAgICBjb250aW51ZTsKCSB9IGVsc2UgaWYgKHN0cmNocigiaEhtc3R5TWRnIiwgZm9ybWF0W2lucG9zXSkpIHsKCSAgICB0eXBlID0gZm9ybWF0W2lucG9zXTsKCSAgICBjb3VudCA9IDE7CgkgICAgY29udGludWU7CgkgfSBlbHNlIGlmIChmb3JtYXRbaW5wb3NdID09ICdcJycpIHsKCSAgICBpbnF1b3RlID0gMTsKCSAgICBjb250aW51ZTsKICAgICAgIH0gZWxzZSB7CgkgICAgZGF0ZVtvdXRwb3MrK10gPSBmb3JtYXRbaW5wb3NdOwoJIH0KICAgICAgLyogbm93IGRlYWwgd2l0aCBhIHBvc3NpYmxlIGJ1ZmZlciBvdmVyZmxvdyAqLwogICAgICBpZiAob3V0cG9zID49IGRhdGVsZW4pIHsKICAgICAgIGRhdGVbZGF0ZWxlbiAtIDFdID0gJ1wwJzsKICAgICAgIFNldExhc3RFcnJvcihFUlJPUl9JTlNVRkZJQ0lFTlRfQlVGRkVSKTsKICAgICAgIHJldHVybiAwOwogICAgICB9CiAgIH0KICAgCiAgIGlmIChPdmVyZmxvdykgewogICAgICBTZXRMYXN0RXJyb3IoRVJST1JfSU5TVUZGSUNJRU5UX0JVRkZFUik7CiAgIH07CgogICAvKiBmaW5pc2ggaXQgb2ZmIHdpdGggYSBzdHJpbmcgdGVybWluYXRvciAqLwogICBvdXRwb3MrKzsKICAgLyogc2FuaXR5IGNoZWNrICovCiAgIGlmIChvdXRwb3MgPiBkYXRlbGVuLTEpIG91dHBvcyA9IGRhdGVsZW4tMTsKICAgZGF0ZVtvdXRwb3NdID0gJ1wwJzsKICAgCiAgIFRSQUNFKG9sZSwgIk9MRV9HZXRGb3JtYXRBIHJldHVybnMgc3RyaW5nICclcycsIGxlbiAlZFxuIiwKCSAgICAgICBkYXRlLCBvdXRwb3MpOwogICByZXR1cm4gb3V0cG9zOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogT0xFX0dldEZvcm1hdFcgIFtpbnRlcm5hbF0gIAogKi8KSU5UMzIgV0lOQVBJIE9MRV9HZXRGb3JtYXRXKExDSUQgbG9jYWxlLCBEV09SRCBmbGFncywKCQkJICAgIExQU1lTVEVNVElNRSB4dGltZSwKCQkJICAgIExQQ1dTVFIgZm9ybWF0LAoJCQkgICAgTFBXU1RSIG91dHB1dCwgSU5UMzIgb3V0bGVuKQp7CiAgIElOVDMyICAgaW5wb3MsIG91dHBvczsKICAgaW50ICAgICBjb3VudCwgdHlwZT0wLCBpbnF1b3RlOwogICBpbnQgICAgIE92ZXJmbG93OyAvKiBsb29wIGNoZWNrICovCiAgIGludCB1c2VkYXRlLCB1c2V0aW1lOwogICBXQ0hBUiAgIGJ1Zls0MF07CiAgIGludCAgICAgYnVmbGVuPTA7CiAgIGNoYXIgICAgYWJ1Zls0MF07CiAgIFdDSEFSICAgYXJnMFtdID0gezB9LCBhcmcxW10gPSB7JyUnLCdkJywwfTsKICAgV0NIQVIgICBhcmcyW10gPSB7JyUnLCcwJywnMicsJ2QnLDB9OwogICBXQ0hBUiAgKmFyZ2FycltdID0ge2FyZzAsIGFyZzEsIGFyZzJ9OwogICBpbnQgICAgIGRhdGV2YXJzPTAsIHRpbWV2YXJzPTA7CgogICAvKiBtYWtlIGEgZGVidWcgcmVwb3J0ICovCiAgIGxzdHJjcHluV3RvQShhYnVmLCBmb3JtYXQsIHNpemVvZihmb3JtYXQpKTsKICAgVFJBQ0Uob2xlLCAiYXJnczogJThseCwgJThseCwgdGltZShkPSVkLGg9JWQsbT0lZCxzPSVkKSwgZm10OlwnJXNcJyAoYXQgJXApLCAlcCB3aXRoIG1heCBsZW4gJWRcbiIsCgkgbG9jYWxlLCBmbGFncywgCgkgeHRpbWUtPndEYXksIHh0aW1lLT53SG91ciwgeHRpbWUtPndNaW51dGUsIHh0aW1lLT53U2Vjb25kLAoJIGFidWYsIGZvcm1hdCwgb3V0cHV0LCBvdXRsZW4pOwogICAKCiAgIC8qIGluaXRpYWxpemUgc3RhdGUgdmFyaWFibGVzICovCiAgIGlucG9zID0gb3V0cG9zID0gMDsKICAgY291bnQgPSAwOwogICBpbnF1b3RlID0gT3ZlcmZsb3cgPSAwOwogICAvKiB0aGlzIGlzIHJlYWxseSBqdXN0IGEgc2FuaXR5IGNoZWNrICovCiAgIG91dHB1dFswXSA9IGJ1ZlswXSA9IDA7CiAgIGFidWZbMF0gPSAnXDAnOwogICAvKiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG9mZmljaWFsIFdpbmRvd3MgYmVoYXZpb3IgKi8KICAgdXNlZGF0ZSA9IGZsYWdzICYgREFURV9EQVRFVkFSU09OTFk7CiAgIHVzZXRpbWUgPSBmbGFncyAmIFRJTUVfVElNRVZBUlNPTkxZOwogICAKICAgLyogdGhpcyBsb29wIGlzIHRoZSBjb3JlIG9mIHRoZSBmdW5jdGlvbiAqLwogICBmb3IgKGlucG9zID0gMDsgLyogd2UgaGF2ZSBzZXZlcmFsIGJyZWFrIHBvaW50cyAqLyA7IGlucG9zKyspIHsKICAgICAgaWYgKGlucXVvdGUpIHsKCSBpZiAoZm9ybWF0W2lucG9zXSA9PSAoV0NIQVIpICdcJycpIHsKCSAgICBpZiAoZm9ybWF0W2lucG9zKzFdID09ICdcJycpIHsKCSAgICAgICBpbnBvcysrOwoJICAgICAgIG91dHB1dFtvdXRwb3MrK10gPSAnXCcnOwoJICAgIH0gZWxzZSB7CgkgICAgICAgaW5xdW90ZSA9IDA7CgkgICAgICAgY29udGludWU7CgkgICAgfQoJIH0gZWxzZSBpZiAoZm9ybWF0W2lucG9zXSA9PSAwKSB7CgkgICAgb3V0cHV0W291dHBvcysrXSA9IDA7CgkgICAgaWYgKG91dHBvcyA+IG91dGxlbikgT3ZlcmZsb3cgPSAxOwoJICAgIGJyZWFrOyAgLyogIG5vcm1hbCBleGl0ICh3aXRoaW4gYSBxdW90ZSkgKi8KCSB9IGVsc2UgewoJICAgIG91dHB1dFtvdXRwb3MrK10gPSBmb3JtYXRbaW5wb3NdOyAvKiBjb3B5IGlucHV0ICovCgkgICAgaWYgKG91dHBvcyA+IG91dGxlbikgewoJICAgICAgIE92ZXJmbG93ID0gMTsKCSAgICAgICBvdXRwdXRbb3V0cG9zLTFdID0gMDsgCgkgICAgICAgYnJlYWs7CgkgICAgfQoJIH0KICAgICAgfSBlbHNlIGlmICggIChjb3VudCAmJiAoZm9ybWF0W2lucG9zXSAhPSB0eXBlKSkKCQkgICB8fCAoIChjb3VudD09NCAmJiB0eXBlID09J3knKSB8fAoJCQkoY291bnQ9PTQgJiYgdHlwZSA9PSdNJykgfHwKCQkJKGNvdW50PT00ICYmIHR5cGUgPT0nZCcpIHx8CgkJCShjb3VudD09MiAmJiB0eXBlID09J2cnKSB8fAoJCQkoY291bnQ9PTIgJiYgdHlwZSA9PSdoJykgfHwKCQkJKGNvdW50PT0yICYmIHR5cGUgPT0nSCcpIHx8CgkJCShjb3VudD09MiAmJiB0eXBlID09J20nKSB8fAoJCQkoY291bnQ9PTIgJiYgdHlwZSA9PSdzJykgfHwKCQkJKGNvdW50PT0yICYmIHR5cGUgPT0ndCcpICkgICkgewoJIGlmICAgICAgICAodHlwZSA9PSAnZCcpIHsKCSAgICBpZiAgICAgICAgKGNvdW50ID09IDMpIHsKCSAgICAgICBHZXRMb2NhbGVJbmZvMzJXKGxvY2FsZSwKCQkJICAgICBMT0NBTEVfU0RBWU5BTUUxICsgeHRpbWUtPndEYXlPZldlZWsgLTEsCgkJCSAgICAgYnVmLCBzaXplb2YoYnVmKS9zaXplb2YoV0NIQVIpICk7CgkgICAgfSBlbHNlIGlmIChjb3VudCA9PSAzKSB7CgkgICAgICAgR2V0TG9jYWxlSW5mbzMyVyhsb2NhbGUsCgkJCQlMT0NBTEVfU0FCQlJFVkRBWU5BTUUxICsKCQkJCXh0aW1lLT53RGF5T2ZXZWVrIC0xLAoJCQkJYnVmLCBzaXplb2YoYnVmKS9zaXplb2YoV0NIQVIpICk7CgkgICAgfSBlbHNlIHsKCSAgICAgICB3c25wcmludGYzMlcoYnVmLCA1LCBhcmdhcnJbY291bnRdLCB4dGltZS0+d0RheSApOwoJICAgIH07CgkgfSBlbHNlIGlmICh0eXBlID09ICdNJykgewoJICAgIGlmICAgICAgICAoY291bnQgPT0gNCkgewoJICAgICAgIEdldExvY2FsZUluZm8zMlcobG9jYWxlLCAgTE9DQUxFX1NNT05USE5BTUUxICsKCQkJCXh0aW1lLT53TW9udGggLTEsIGJ1ZiwKCQkJCXNpemVvZihidWYpL3NpemVvZihXQ0hBUikgKTsKCSAgICB9IGVsc2UgaWYgKGNvdW50ID09IDMpIHsKCSAgICAgICBHZXRMb2NhbGVJbmZvMzJXKGxvY2FsZSwgIExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FMSArCgkJCQl4dGltZS0+d01vbnRoIC0xLCBidWYsCgkJCQlzaXplb2YoYnVmKS9zaXplb2YoV0NIQVIpICk7CgkgICAgfSBlbHNlIHsKCSAgICAgICB3c25wcmludGYzMlcoYnVmLCA1LCBhcmdhcnJbY291bnRdLCB4dGltZS0+d01vbnRoKTsKCSAgICB9CgkgfSBlbHNlIGlmICh0eXBlID09ICd5JykgewoJICAgIGlmICAgICAgICAoY291bnQgPT0gNCkgewoJICAgICAgIHdzbnByaW50ZjMyVyhidWYsIDYsIGFyZ2FyclsxXSAvKiAiJWQiICovLAoJCQkgeHRpbWUtPndZZWFyKTsKCSAgICB9IGVsc2UgaWYgKGNvdW50ID09IDMpIHsKCSAgICAgICBsc3RyY3B5bkF0b1coYnVmLCAieXl5IiwgNSk7CgkgICAgfSBlbHNlIHsKCSAgICAgICB3c25wcmludGYzMlcoYnVmLCA2LCBhcmdhcnJbY291bnRdLAoJCQkgICAgeHRpbWUtPndZZWFyICUgMTAwKTsKCSAgICB9CgkgfSBlbHNlIGlmICh0eXBlID09ICdnJykgewoJICAgIGlmICAgICAgICAoY291bnQgPT0gMikgewoJICAgICAgIEZJWE1FKG9sZSwgIkxPQ0FMRV9JQ0FMRU5EQVJUWVBFIHVuaW1wbGVtZW50ZWRcbiIpOwoJICAgICAgIGxzdHJjcHluQXRvVyhidWYsICJBRCIsIDUpOwoJICAgIH0gZWxzZSB7CgkgICAgICAgLyogV2luIEFQSSBzZXogd2UgY29weSBpdCB2ZXJiYXRpbSAqLwoJICAgICAgIGxzdHJjcHluQXRvVyhidWYsICJnIiwgNSk7CgkgICAgfQoJIH0gZWxzZSBpZiAodHlwZSA9PSAnaCcpIHsKCSAgICAvKiBob3VycyAxOjAwLTEyOjAwIC0tLSBpcyB0aGlzIHJpZ2h0PyAqLwoJICAgIHdzbnByaW50ZjMyVyhidWYsIDUsIGFyZ2Fycltjb3VudF0sIAoJCQkgKHh0aW1lLT53SG91ci0xKSUxMiArMSk7CgkgfSBlbHNlIGlmICh0eXBlID09ICdIJykgewoJICAgIHdzbnByaW50ZjMyVyhidWYsIDUsIGFyZ2Fycltjb3VudF0sIAoJCQkgeHRpbWUtPndIb3VyKTsKCSB9IGVsc2UgaWYgKHR5cGUgPT0gJ20nKSB7CgkgICAgd3NucHJpbnRmMzJXKGJ1ZiwgNSwgYXJnYXJyW2NvdW50XSwKCQkJIHh0aW1lLT53TWludXRlKTsKCSB9IGVsc2UgaWYgKHR5cGUgPT0gJ3MnKSB7CgkgICAgd3NucHJpbnRmMzJXKGJ1ZiwgNSwgYXJnYXJyW2NvdW50XSwKCQkJIHh0aW1lLT53U2Vjb25kKTsKCSB9IGVsc2UgaWYgKHR5cGUgPT0gJ3QnKSB7CgkgICAgR2V0TG9jYWxlSW5mbzMyVyhsb2NhbGUsICh4dGltZS0+d0hvdXIgPCAxMikgPwoJCQkgICAgIExPQ0FMRV9TMTE1OSA6IExPQ0FMRV9TMjM1OSwKCQkJICAgICBidWYsIHNpemVvZihidWYpICk7CgkgICAgaWYgICAgICAgIChjb3VudCA9PSAxKSB7CgkgICAgICAgYnVmWzFdID0gMDsKCSAgICB9Cn0KCgkgLyogbm8gbWF0dGVyIHdoYXQgaGFwcGVuZWQsICB3ZSBuZWVkIHRvIGNoZWNrIHRoaXMgbmV4dCAKCSAgICBjaGFyYWN0ZXIgdGhlIG5leHQgdGltZSB3ZSBsb29wIHRocm91Z2ggKi8KCSBpbnBvcy0tOwoKCSAvKiBjYXQgYnVmIG9udG8gdGhlIG91dHB1dCAqLwoJIG91dGxlbiA9IGxzdHJsZW4zMlcoYnVmKTsKCSBpZiAob3V0cG9zICsgYnVmbGVuIDwgb3V0bGVuKSB7CgkgICAgb3V0cHV0W291dHBvc10gPSAwOyAgLyogYSAiaG9vayIgZm9yIHN0cmNhdCAqLwoJICAgIGxzdHJjYXQzMlcob3V0cHV0LCBidWYpOwoJICAgIG91dHBvcyArPSBidWZsZW47CgkgfSBlbHNlIHsKCSAgICBvdXRwdXRbb3V0cG9zXSA9IDA7CgkgICAgbHN0cmNhdG4zMlcob3V0cHV0LCBidWYsIG91dGxlbiAtIG91dHBvcyk7CgkgICAgb3V0cHV0W291dGxlbiAtIDFdID0gMDsKCSAgICBPdmVyZmxvdyA9IDE7CgkgICAgYnJlYWs7IC8qIEFibm9ybWFsIGV4aXQgKi8KCSB9CgoJIC8qIHJlc2V0IHRoZSB2YXJpYWJsZXMgd2UgdXNlZCB0aGlzIHRpbWUgKi8KCSBjb3VudCA9IDA7CgkgdHlwZSA9ICdcMCc7CiAgICAgIH0gZWxzZSBpZiAoZm9ybWF0W2lucG9zXSA9PSAwKSB7CgkgLyogd2UgY2FuJ3QgY2hlY2sgZm9yIHRoaXMgYXQgdGhlIGJlZ2lubmluZywgIGJlY2F1c2UgdGhhdCAKCSB3b3VsZCBrZWVwIHVzIGZyb20gcHJpbnRpbmcgYSBmb3JtYXQgc3BlYyB0aGF0IGVuZGVkIHRoZSAKCSBzdHJpbmcgKi8KCSBvdXRwdXRbb3V0cG9zXSA9IDA7CgkgYnJlYWs7ICAvKiAgTk9STUFMIEVYSVQgICovCiAgICAgIH0gZWxzZSBpZiAoY291bnQpIHsKCSAvKiBob3cgd2Uga2VlcCB0cmFjayBvZiB0aGUgbWlkZGxlIG9mIGEgZm9ybWF0IHNwZWMgKi8KCSBjb3VudCsrOwoJIGNvbnRpbnVlOwogICAgICB9IGVsc2UgaWYgKCAoZGF0ZXZhcnMgJiYgKGZvcm1hdFtpbnBvc109PSdkJyB8fAoJCQkJZm9ybWF0W2lucG9zXT09J00nIHx8CgkJCQlmb3JtYXRbaW5wb3NdPT0neScgfHwKCQkJCWZvcm1hdFtpbnBvc109PSdnJykgICkgfHwKCQkgICh0aW1ldmFycyAmJiAoZm9ybWF0W2lucG9zXT09J0gnIHx8CgkJCQlmb3JtYXRbaW5wb3NdPT0naCcgfHwKCQkJCWZvcm1hdFtpbnBvc109PSdtJyB8fAoJCQkJZm9ybWF0W2lucG9zXT09J3MnIHx8CgkJCQlmb3JtYXRbaW5wb3NdPT0ndCcpICkgICAgKSB7CgkgdHlwZSA9IGZvcm1hdFtpbnBvc107CgkgY291bnQgPSAxOwoJIGNvbnRpbnVlOwogICAgICB9IGVsc2UgaWYgKGZvcm1hdFtpbnBvc10gPT0gJ1wnJykgewoJIGlucXVvdGUgPSAxOwoJIGNvbnRpbnVlOwogICAgICB9IGVsc2UgewoJIC8qIHVucXVvdGVkIGxpdGVyYWxzICovCgkgb3V0cHV0W291dHBvcysrXSA9IGZvcm1hdFtpbnBvc107CiAgICAgIH0KICAgfQoKICAgaWYgKE92ZXJmbG93KSB7CiAgICAgIFNldExhc3RFcnJvcihFUlJPUl9JTlNVRkZJQ0lFTlRfQlVGRkVSKTsKICAgICAgV0FSTihvbGUsICIgYnVmZmVyIG92ZXJmbG93XG4iKTsKICAgfTsKCiAgIC8qIGZpbmFsIHN0cmluZyB0ZXJtaW5hdG9yIGFuZCBzYW5pdHkgY2hlY2sgKi8KICAgb3V0cG9zKys7CiAgIGlmIChvdXRwb3MgPiBvdXRsZW4tMSkgb3V0cG9zID0gb3V0bGVuLTE7CiAgIG91dHB1dFtvdXRwb3NdID0gJzAnOwoKICAgbHN0cmNweW5XdG9BKGFidWYsIG91dHB1dCwgc2l6ZW9mKGFidWYpICk7CiAgIFRSQUNFKG9sZSwgIiByZXR1cm5pbmcgc3RyaW5nIFwnJXNcJ1xuIiwgYWJ1Zik7CgkKICAgcmV0dXJuICghT3ZlcmZsb3cpID8gb3V0bGVuIDogMDsKICAgCn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogIEdldERhdGVGb3JtYXQzMkEoKSBbS0VSTkVMMzIuMzEwXSBNYWtlcyBhbiBBU0NJSSBzdHJpbmcgb2YgdGhlIGRhdGUKICoKICogVGhpcyBmdW5jdGlvbiB1c2VzIGZvcm1hdCB0byBmb3JtYXQgdGhlIGRhdGUsICBvciwgIGlmIGZvcm1hdAogKiBpcyBOVUxMLCB1c2VzIHRoZSBkZWZhdWx0IGZvciB0aGUgbG9jYWxlLiAgZm9ybWF0IGlzIGEgc3RyaW5nCiAqIG9mIGxpdGVyYWwgZmllbGRzIGFuZCBjaGFyYWN0ZXJzIGFzIGZvbGxvd3M6CiAqCiAqIC0gZCAgICBzaW5nbGUtZGlnaXQgKG5vIGxlYWRpbmcgemVybykgZGF5IChvZiBtb250aCkKICogLSBkZCAgIHR3by1kaWdpdCBkYXkgKG9mIG1vbnRoKQogKiAtIGRkZCAgc2hvcnQgZGF5LW9mLXdlZWsgbmFtZQogKiAtIGRkZGQgbG9uZyBkYXktb2Ytd2VlayBuYW1lCiAqIC0gTSAgICBzaW5nbGUtZGlnaXQgbW9udGgKICogLSBNTSAgIHR3by1kaWdpdCBtb250aAogKiAtIE1NTSAgc2hvcnQgbW9udGggbmFtZQogKiAtIE1NTU0gZnVsbCBtb250aCBuYW1lCiAqIC0geSAgICB0d28tZGlnaXQgeWVhciwgbm8gbGVhZGluZyAwCiAqIC0geXkgICB0d28tZGlnaXQgeWVhcgogKiAtIHl5eXkgZm91ci1kaWdpdCB5ZWFyCiAqIC0gZ2cgICBlcmEgc3RyaW5nCiAqCiAqLwoKSU5UMzIgV0lOQVBJIEdldERhdGVGb3JtYXQzMkEoTENJRCBsb2NhbGUsRFdPUkQgZmxhZ3MsCgkJCSAgICAgIExQU1lTVEVNVElNRSB4dGltZSwKCQkJICAgICAgTFBDU1RSIGZvcm1hdCwgTFBTVFIgZGF0ZSxJTlQzMiBkYXRlbGVuKSAKewogICAKICBjaGFyIGZvcm1hdF9idWZbNDBdOwogIExQQ1NUUiB0aGlzZm9ybWF0OwogIFNZU1RFTVRJTUUgdDsKICBMUFNZU1RFTVRJTUUgdGhpc3RpbWU7CiAgTENJRCB0aGlzbG9jYWxlOwoKICBJTlQzMiByZXQ7CgogIFRSQUNFKG9sZSwiKDB4JTA0bHgsMHglMDhseCwlcCwlcywlcCwlZClcbiIsCgkgICAgICBsb2NhbGUsZmxhZ3MseHRpbWUsZm9ybWF0LGRhdGUsZGF0ZWxlbik7CiAgCiAgaWYgKCFsb2NhbGUpIHsKICAgICBsb2NhbGUgPSBMT0NBTEVfU1lTVEVNX0RFRkFVTFQ7CiAgICAgfTsKICAKICBpZiAobG9jYWxlID09IExPQ0FMRV9TWVNURU1fREVGQVVMVCkgewogICAgIHRoaXNsb2NhbGUgPSBHZXRTeXN0ZW1EZWZhdWx0TENJRCgpOwogIH0gZWxzZSBpZiAobG9jYWxlID09IExPQ0FMRV9VU0VSX0RFRkFVTFQpIHsKICAgICB0aGlzbG9jYWxlID0gR2V0VXNlckRlZmF1bHRMQ0lEKCk7CiAgfSBlbHNlIHsKICAgICB0aGlzbG9jYWxlID0gbG9jYWxlOwogICB9OwoKICBpZiAoeHRpbWUgPT0gTlVMTCkgewogICAgIEdldFN5c3RlbVRpbWUoJnQpOwogICAgIHRoaXN0aW1lID0gJnQ7CiAgfSBlbHNlIHsKICAgICB0aGlzdGltZSA9IHh0aW1lOwogIH07CgogIGlmIChmb3JtYXQgPT0gTlVMTCkgewogICAgIEdldExvY2FsZUluZm8zMkEodGhpc2xvY2FsZSwgKChmbGFncyZEQVRFX0xPTkdEQVRFKSAKCQkJCSAgID8gTE9DQUxFX1NMT05HREFURQoJCQkJICAgOiBMT0NBTEVfU1NIT1JUREFURSksCgkJICAgICAgZm9ybWF0X2J1Ziwgc2l6ZW9mKGZvcm1hdF9idWYpKTsKICAgICB0aGlzZm9ybWF0ID0gZm9ybWF0X2J1ZjsKICB9IGVsc2UgewogICAgIHRoaXNmb3JtYXQgPSBmb3JtYXQ7CiAgfTsKCiAgCiAgcmV0ID0gT0xFX0dldEZvcm1hdEEodGhpc2xvY2FsZSwgZmxhZ3MsIHRoaXN0aW1lLCB0aGlzZm9ybWF0LCAKCQkgICAgICAgZGF0ZSwgZGF0ZWxlbik7CiAgCgogICBUUkFDRShvbGUsIAoJICAgICAgICJHZXREYXRlRm9ybWF0MzJBKCkgcmV0dXJuaW5nICVkLCB3aXRoIGRhdGE9JXNcbiIsCgkgICAgICAgcmV0LCBkYXRlKTsKICByZXR1cm4gcmV0Owp9CgovKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIEdldERhdGVGb3JtYXQzMlcoKSBbS0VSTkVMMzIuMzExXSBNYWtlcyBhIFVuaWNvZGUgc3RyaW5nIG9mIHRoZSBkYXRlCiAqCiAqIEFjdHMgdGhlIHNhbWUgYXMgR2V0RGF0ZUZvcm1hdDMyQSgpLCAgZXhjZXB0IHRoYXQgaXQncyBVbmljb2RlLgogKiBBY2NlcHRzICYgcmV0dXJucyBzaXplcyBhcyBjb3VudHMgb2YgVW5pY29kZSBjaGFyYWN0ZXJzLgogKgogKi8KSU5UMzIgV0lOQVBJIEdldERhdGVGb3JtYXQzMlcoTENJRCBsb2NhbGUsRFdPUkQgZmxhZ3MsCgkJCSAgICAgIExQU1lTVEVNVElNRSB4dGltZSwKCQkJICAgICAgTFBDV1NUUiBmb3JtYXQsCgkJCSAgICAgIExQV1NUUiBkYXRlLCBJTlQzMiBkYXRlbGVuKQp7CiAgIHNob3J0IGRhdGVhcnJbXSA9IHsnMScsJzknLCc5JywnNCcsJy0nLCcxJywnLScsJzEnLDB9OwoKICAgRklYTUUob2xlLCAiU1RVQiAoc2hvdWxkIGNhbGwgT0xFX0dldEZvcm1hdFcpXG4iKTsgICAKICAgbHN0cmNweW4zMlcoZGF0ZSwgZGF0ZWFyciwgZGF0ZWxlbik7CiAgIHJldHVybiAoICBkYXRlbGVuIDwgOSkgPyBkYXRlbGVuIDogOTsKICAgCiAgIAp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICAgICBHZXROdW1iZXJGb3JtYXQzMkEJKEtFUk5FTDMyLjM1NSkKICogTk9URTogdHlwZSBvZiBscEZvcm1hdCBzaG91bGQgYmUgQ09OU1QgTlVNQkVSRk9STUFUIAogKi8KSU5UMzIgV0lOQVBJIEdldE51bWJlckZvcm1hdDMyQShMQ0lEIGxvY2FsZSwgRFdPUkQgZHdmbGFncywKCQkJICAgICAgIExQQ1NUUiBscHZhbHVlLCAgY2hhciAqbHBGb3JtYXQsCgkJCSAgICAgICBMUFNUUiBscE51bWJlclN0ciwgaW50IGNjaE51bWJlcikKewogaW50IG47CgogRklYTUUoZmlsZSwiJXM6IHN0dWIsIG5vIHJlZm9ybWF0aW5nIGRvbmVcbiIsbHB2YWx1ZSk7CgogbiA9IHN0cmxlbihscHZhbHVlKTsKIGlmIChjY2hOdW1iZXIpIHsgCiAgIHN0cm5jcHkobHBOdW1iZXJTdHIsbHB2YWx1ZSxjY2hOdW1iZXIpOwogICBpZiAoY2NoTnVtYmVyIDw9IG4pIHsKICAgICBscE51bWJlclN0cltjY2hOdW1iZXItMV0gPSAwOwogICAgIG4gPSBjY2hOdW1iZXItMTsKICAgfQogfQogcmV0dXJuIG47Cn0KIAoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiBHZXRUaW1lRm9ybWF0MzJBKCkgW0tFUk5FTDMyLjQyMl0gTWFrZXMgYW4gQVNDSUkgc3RyaW5nIG9mIHRoZSB0aW1lCiAqCiAqIEZvcm1hdHMgZGF0ZSBhY2NvcmRpbmcgdG8gZm9ybWF0LCAgb3IgbG9jYWxlIGRlZmF1bHQgaWYgZm9ybWF0IGlzCiAqIE5VTEwuIFRoZSBmb3JtYXQgY29uc2lzdHMgb2YgbGl0ZXJhbCBjaGFyYWN0ZXJzIGFuZCBmaWVsZHMgYXMgZm9sbG93czoKICoKICogaCAgaG91cnMgd2l0aCBubyBsZWFkaW5nIHplcm8gKDEyLWhvdXIpCiAqIGhoIGhvdXJzIHdpdGggZnVsbCB0d28gZGlnaXRzCiAqIEggIGhvdXJzIHdpdGggbm8gbGVhZGluZyB6ZXJvICgyNC1ob3VyKQogKiBISCBob3VycyB3aXRoIGZ1bGwgdHdvIGRpZ2l0cwogKiBtICBtaW51dGVzIHdpdGggbm8gbGVhZGluZyB6ZXJvCiAqIG1tIG1pbnV0ZXMgd2l0aCBmdWxsIHR3byBkaWdpdHMKICogcyAgc2Vjb25kcyB3aXRoIG5vIGxlYWRpbmcgemVybwogKiBzcyBzZWNvbmRzIHdpdGggZnVsbCB0d28gZGlnaXRzCiAqIHQgIHRpbWUgbWFya2VyIChBIG9yIFApCiAqIHR0IHRpbWUgbWFya2VyIChBTSwgUE0pCiAqCiAqLwoKSU5UMzIgV0lOQVBJIApHZXRUaW1lRm9ybWF0MzJBKExDSUQgbG9jYWxlLCAgICAgICAgLyogaW4gICovCgkJIERXT1JEIGZsYWdzLCAgICAgICAgLyogaW4gICovCgkJIExQU1lTVEVNVElNRSB4dGltZSwgLyogaW4gICovIAoJCSBMUENTVFIgZm9ybWF0LCAgICAgIC8qIGluICAqLwoJCSBMUFNUUiB0aW1lc3RyLCAgICAgIC8qIG91dCAqLwoJCSBJTlQzMiB0aW1lbGVuICAgICAgIC8qIGluICAqLykgCnsKICAgTFBDU1RSIHJlYWxmb3JtYXQ7CiAgIGNoYXIgZm10X2J1Zls0MF07CiAgIAogICBUUkFDRShvbGUsIkdldFRpbWVGb3JtYXQoMHglMDRseCwweCUwOGx4LCVwLCVzLCVwLCVkKVxuIiwKCSBsb2NhbGUsZmxhZ3MseHRpbWUsZm9ybWF0LHRpbWVzdHIsdGltZWxlbik7CiAgIAogICBpZiAoZm9ybWF0KSB7CiAgICAgIHJlYWxmb3JtYXQgPSBmb3JtYXQ7CiAgIH0gZWxzZSBpZiAobG9jYWxlKSB7CiAgICAgIEdldExvY2FsZUluZm8zMkEobG9jYWxlLCBMT0NBTEVfU1RJTUVGT1JNQVQsCgkJICAgICAgIGZtdF9idWYsICBzaXplb2YoZm10X2J1ZikpOwogICAgICByZWFsZm9ybWF0ID0gZm10X2J1ZjsKICAgfSBlbHNlIHsKICAgICAgV0FSTihvbGUsICJDYWxsZXIgZ2F2ZSBubyBsb2NhbGUgYW5kIG5vIGZvcm1hdFxuIik7CiAgICAgIHJlYWxmb3JtYXQgPSAiaGg6bW06c3MiOwogICB9OwogICBpZiAoIWxvY2FsZSkgewogICAgICBsb2NhbGUgPSBHZXRTeXN0ZW1EZWZhdWx0TENJRCgpOwogICB9CiAgIHJldHVybiBPTEVfR2V0Rm9ybWF0QShsb2NhbGUsIGZsYWdzLCB4dGltZSwgcmVhbGZvcm1hdCwgdGltZXN0ciwgdGltZWxlbik7Cn0KCgovKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICBHZXRUaW1lRm9ybWF0MzJXKCkgIFtLRVJORUwzMi40MjNdIE1ha2VzIGEgVW5pY29kZSBzdHJpbmcgb2YgdGhlIHRpbWUKICogCiAqCiAqLwoKSU5UMzIgV0lOQVBJIApHZXRUaW1lRm9ybWF0MzJXKExDSUQgbG9jYWxlLERXT1JEIGZsYWdzLAoJCQkgICAgICBMUFNZU1RFTVRJTUUgeHRpbWUsCgkJCSAgICAgIExQQ1dTVFIgZm9ybWF0LCAKCQkJICAgICAgTFBXU1RSIHRpbWVzdHIsSU5UMzIgdGltZWxlbikgCnsKICAgY2hhciBkZWJ1Z2J1Zls0MF07CiAgIFdDSEFSIGJ1ZlsyMF07CiAgIExQQ1dTVFIgcmVhbGZvcm1hdD0wOwogICBTWVNURU1USU1FIHQ7CiAgIExQU1lTVEVNVElNRSByZWFsdGltZTsKICAgV0NIQVIgKiBmbXRfYnVmID0gTlVMTDsKICAgaW50IGZtdF9idWZfc2l6ZSA9IDA7IC8qIHVuaXRzIG9mIFdDSEFScyAqLwogICBJTlQzMiByZXR2YWw7CiAgIAogICBsc3RyY3B5bld0b0EoZGVidWdidWYsIGZvcm1hdCwgKHNpemVvZihidWYpKS8yKTsKICAgVFJBQ0Uob2xlLCAiR2V0VGltZUZvcm1hdFcgbGVuICVkIGZsYWdzIDB4JWxYIGZvcm1hdCA+JXM8XG4iLAoJCXRpbWVsZW4sIGZsYWdzLCBkZWJ1Z2J1Zik7CgogICAvKiBFbmZvcmNlIHRoZSBXaW5kb3dzIGJlaGF2aW9yICovCiAgIGZsYWdzIHw9IH5MT0NBTEVfVElNRURBVEVCT1RIOwogICBmbGFncyB8PSBUSU1FX1RJTUVWQVJTT05MWTsKCiAgIC8qIHRha2UgY2FyZSBvZiB0aGUgZm9ybWF0IG9yIGxvY2FsZSBub3QgYmVpbmcgZ2l2ZW4gKi8KICAgaWYgKGZvcm1hdCkgewogICAgICByZWFsZm9ybWF0ID0gZm9ybWF0OwogICB9IGVsc2UgaWYgKGxvY2FsZSkgewogICAgICAvKiBhbGxvY2F0ZSBtZW1vcnkgKi8KICAgICAgcmV0dmFsID0gRVJST1JfSU5TVUZGSUNJRU5UX0JVRkZFUjsKICAgICAgZm10X2J1ZiA9IG1hbGxvYygoZm10X2J1Zl9zaXplKz03KSAqIHNpemVvZihXQ0hBUikpOwogICAgICBpZiAoIWZtdF9idWYpCglnb3RvIG91dF9ub21lbTsKCiAgICAgIHdoaWxlKCFHZXRMb2NhbGVJbmZvMzJXKGxvY2FsZSwgTE9DQUxFX1NUSU1FRk9STUFULAoJCQkgICAgICBmbXRfYnVmLCBmbXRfYnVmX3NpemUpKSB7CglyZXR2YWwgPSBFUlJPUl9PVVRPRk1FTU9SWTsKCWZtdF9idWYgPSByZWFsbG9jKGZtdF9idWYsIAoJCQkgICAoZm10X2J1Zl9zaXplICs9IDEwKSAqIHNpemVvZihXQ0hBUikpOwoJaWYgKCFmbXRfYnVmKQoJCWdvdG8gb3V0X25vbWVtOwogICAgICB9CiAgICAgIHJlYWxmb3JtYXQgPSBmbXRfYnVmOwogICB9IGVsc2UgewogICAgICBGSVhNRShvbGUsICAiY2FsbGVyIGdhdmUgbm8gbG9jYWxlLCAgbm8gZm9ybWF0OyAgd2hhdCBzaG91bGQgd2UgZG8/XG4iKTsKICAgICAgU2V0TGFzdEVycm9yKEVSUk9SX0JBRF9GT1JNQVQpOwogICB9CiAgIGlmICghbG9jYWxlKQogICAgICBsb2NhbGUgPSBHZXRTeXN0ZW1EZWZhdWx0TENJRCgpOwoKICAgcmVhbHRpbWUgPSB4dGltZTsKICAgaWYgKCFyZWFsdGltZSkgewogICAgICByZWFsdGltZSA9ICZ0OwogICAgICBHZXRTeXN0ZW1UaW1lKHJlYWx0aW1lKTsKICAgfQoKICAgcmV0dmFsID0gT0xFX0dldEZvcm1hdFcobG9jYWxlLCBmbGFncywgcmVhbHRpbWUsIHJlYWxmb3JtYXQsIHRpbWVzdHIsICB0aW1lbGVuKTsKICAgaWYgKGZtdF9idWYpCglmcmVlKGZtdF9idWYpOwogICByZXR1cm4gcmV0dmFsOwoKb3V0X25vbWVtOgoJU2V0TGFzdEVycm9yKHJldHZhbCk7CglXQVJOKG9sZSwgImNvdWxkIG5vdCBhbGxvY2F0ZSAlZCBjaGFycyBvZiBtZW1vcnlcbiIsIGZtdF9idWZfc2l6ZSk7IAoJcmV0dXJuIDA7Cn0K