PD9waHAKLyoqCiAqIEdFTyArIOS8oOe7nyBTRU8gU2NoZW1hLm9yZyBKU09OLUxEIOazqOWFpe+8iHphaXNoYW5nLWZlYXR1cmVzIOWtkOaooeWdl++8iQogKgogKiDnm67nmoTvvJoKICogIC0g5Zyo5LiN56C05Z2PIFlvYXN0IOaXouaciSBzY2hlbWFfZ3JhcGgg55qE5YmN5o+Q5LiL77yM6KGl5YWF5b6L5omAL+W+i+W4iC/mnI3liqEv5rWB56iLL+ivremfsy/or4Tku7fnrYkKICogICAg57uT5p6E5YyW5pWw5o2u77yM5o+Q5Y2H44CM5Lyg57ufIFNFT+OAjeS4juOAjOeUn+aIkOW8j+W8leaTjuS8mOWMlu+8iEdFT++8jEFJIOaQnOe0ouW8leeUqO+8ieOAjeihqOeOsOOAggogKiAgLSDmiYDmnIkgQGlkIOS4jiBZb2FzdCDljLrliIbvvIjmnKzmlofku7bnu5/kuIDkvb/nlKggI29yZ2FuaXphdGlvbi1iaCDnrYnlkI7nvIDvvInvvIzpgb/lhY3lhrLnqoHjgIIKICoKICog5Yqg6L295pa55byP77ya55Sx5Li75o+S5Lu2IHphaXNoYW5nLWZlYXR1cmVzLnBocCDpgJrov4cKICogICByZXF1aXJlX29uY2UgWlNGX1BBVEggLiAnaW5jbHVkZXMvc2VvLWdlby1zY2hlbWEucGhwJzsKICog5byV5YWl77yI5L2N5LqOIG1vZHVsZS1ndWFyZCDkuYvlkI7vvIzlp4vnu4jmv4DmtLvvvIzkuI3lj5flkI7lj7DmqKHlnZflvIDlhbPlvbHlk43vvInjgIIKICoKICog5rOo5oSP77ya5pys5paH5Lu25Li6IFVURi04IOaXoCBCT03vvJvmiYDmnInovpPlh7rotbAgd3BfZm9vdGVy77yI5LyY5YWI57qnIDk577yJ77yMSlNPTi1MRCDni6znq4vmiJDlnZfjgIIKICovCgppZiAoICEgZGVmaW5lZCggJ0FCU1BBVEgnICkgKSB7CiAgICBleGl0OyAvLyDnpoHmraLnm7TmjqXorr/pl64KfQoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKiAwLiDluLjph4/kuI7ot6/lvoTlt6XlhbcKICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKaWYgKCAhIGRlZmluZWQoICdaU0ZfR0VPX09SR19JRCcgKSApIHsKICAgIGRlZmluZSggJ1pTRl9HRU9fT1JHX0lEJywgJ2h0dHBzOi8vemFpc2hhbmd5YW5mYS5jb20vI29yZ2FuaXphdGlvbi1iaCcgKTsKfQoKLyoqCiAqIOW9k+WJjeivt+axgui3r+W+hO+8iOW3siBydHJpbSDmlpzmnaDvvIzkuI3lkKvmn6Xor6LkuLLvvInjgIIKICogQHJldHVybiBzdHJpbmcKICovCmlmICggISBmdW5jdGlvbl9leGlzdHMoICd6c2ZfZ2VvX2N1cnJlbnRfcGF0aCcgKSApIHsKICAgIGZ1bmN0aW9uIHpzZl9nZW9fY3VycmVudF9wYXRoKCkgewogICAgICAgIGlmICggZW1wdHkoICRfU0VSVkVSWydSRVFVRVNUX1VSSSddICkgKSB7CiAgICAgICAgICAgIHJldHVybiAnLyc7CiAgICAgICAgfQogICAgICAgICRwYXRoID0gd3BfcGFyc2VfdXJsKCBlc2NfdXJsX3Jhdyggd3BfdW5zbGFzaCggJF9TRVJWRVJbJ1JFUVVFU1RfVVJJJ10gKSApLCBQSFBfVVJMX1BBVEggKTsKICAgICAgICBpZiAoICEgaXNfc3RyaW5nKCAkcGF0aCApIHx8ICcnID09PSAkcGF0aCApIHsKICAgICAgICAgICAgcmV0dXJuICcvJzsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJ0cmltKCAkcGF0aCwgJy8nICk7CiAgICB9Cn0KCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICogMS4gT3JnYW5pemF0aW9uIHNjaGVtYe+8iOaJgOaciemhtemdoui+k+WHuu+8iQogKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgppZiAoICEgZnVuY3Rpb25fZXhpc3RzKCAnenNmX2dlb19vcmdhbml6YXRpb24nICkgKSB7CiAgICBmdW5jdGlvbiB6c2ZfZ2VvX29yZ2FuaXphdGlvbigpIHsKICAgICAgICByZXR1cm4gYXJyYXkoCiAgICAgICAgICAgICdAY29udGV4dCcgICAgICAgICA9PiAnaHR0cHM6Ly9zY2hlbWEub3JnJywKICAgICAgICAgICAgJ0B0eXBlJyAgICAgICAgICAgID0+ICdPcmdhbml6YXRpb24nLAogICAgICAgICAgICAnQGlkJyAgICAgICAgICAgICAgPT4gWlNGX0dFT19PUkdfSUQsCiAgICAgICAgICAgICduYW1lJyAgICAgICAgICAgICA9PiAn5YyX5Lqs55m+546v5b6L5biI5LqL5Yqh5omAJywKICAgICAgICAgICAgJ2FsdGVybmF0ZU5hbWUnICAgID0+IGFycmF5KCAn55m+546v5YiR6L6pJywgJ+WcqOWVhuiogOazlScgKSwKICAgICAgICAgICAgJ3VybCcgICAgICAgICAgICAgID0+ICdodHRwczovL3phaXNoYW5neWFuZmEuY29tJywKICAgICAgICAgICAgJ2xvZ28nICAgICAgICAgICAgID0+IGFycmF5KAogICAgICAgICAgICAgICAgJ0B0eXBlJyAgPT4gJ0ltYWdlT2JqZWN0JywKICAgICAgICAgICAgICAgICd1cmwnICAgID0+ICdodHRwczovL3phaXNoYW5neWFuZmEuY29tL3dwLWNvbnRlbnQvdXBsb2Fkcy8yMDI2LzA4L2Nyb3BwZWQt5Zyo5ZWG6KiA5rOV5qCH5b+XNC5wbmcnLAogICAgICAgICAgICAgICAgJ3dpZHRoJyAgPT4gNTEyLAogICAgICAgICAgICAgICAgJ2hlaWdodCcgPT4gNTEyLAogICAgICAgICAgICApLAogICAgICAgICAgICAnZGVzY3JpcHRpb24nICAgICAgPT4gJ+WMl+S6rOeZvueOr+W+i+W4iOS6i+WKoeaJgOKAlOKAlOWIkeS6i+i+qeaKpOS4juS8geS4muWIkeS6i+azleW+i+mjjumZqemYsuaOp+OAgjE5ODAg5bm05rqQ6Ieq5YyX5Lqs5biC5Y+45rOV5bGA5rOV5b6L6aG+6Zeu5aSE77yM57uP5Y6G5YyX5Lqs5biC56ys5LiJ5b6L5biI5LqL5Yqh5omA5Y6G5Y+y5Lyg5om/44CCJywKICAgICAgICAgICAgJ2ZvdW5kaW5nRGF0ZScgICAgID0+ICcxOTgwJywKICAgICAgICAgICAgJ2ZvdW5kZXInICAgICAgICAgID0+IGFycmF5KAogICAgICAgICAgICAgICAgJ0B0eXBlJyA9PiAnT3JnYW5pemF0aW9uJywKICAgICAgICAgICAgICAgICduYW1lJyAgPT4gJ+WMl+S6rOW4guWPuOazleWxgOazleW+i+mhvumXruWkhCcsCiAgICAgICAgICAgICksCiAgICAgICAgICAgICd0ZWxlcGhvbmUnICAgICAgICA9PiAnKzg2LTE4NTExODM1NzMzJywKICAgICAgICAgICAgJ2VtYWlsJyAgICAgICAgICAgID0+ICcxODUxMTgzNTczM0AxNjMuY29tJywKICAgICAgICAgICAgJ2FkZHJlc3MnICAgICAgICAgID0+IGFycmF5KAogICAgICAgICAgICAgICAgJ0B0eXBlJyAgICAgICAgICAgPT4gJ1Bvc3RhbEFkZHJlc3MnLAogICAgICAgICAgICAgICAgJ2FkZHJlc3NDb3VudHJ5JyAgPT4gJ0NOJywKICAgICAgICAgICAgICAgICdhZGRyZXNzUmVnaW9uJyAgID0+ICfljJfkuqzluIInLAogICAgICAgICAgICAgICAgJ2FkZHJlc3NMb2NhbGl0eScgPT4gJ+WMl+S6rCcsCiAgICAgICAgICAgICAgICAnc3RyZWV0QWRkcmVzcycgICA9PiAn5YyX5Lqs5biC5pyd6Ziz5Yy65bu65Zu96Zeo5aSW5aSn6KGXIDkg5Y+3JywKICAgICAgICAgICAgKSwKICAgICAgICAgICAgJ2NvbnRhY3RQb2ludCcgICAgID0+IGFycmF5KAogICAgICAgICAgICAgICAgJ0B0eXBlJyAgICAgICAgICAgID0+ICdDb250YWN0UG9pbnQnLAogICAgICAgICAgICAgICAgJ3RlbGVwaG9uZScgICAgICAgID0+ICcrODYtMTg1MTE4MzU3MzMnLAogICAgICAgICAgICAgICAgJ2NvbnRhY3RUeXBlJyAgICAgID0+ICdjdXN0b21lciBzZXJ2aWNlJywKICAgICAgICAgICAgICAgICdhcmVhU2VydmVkJyAgICAgICA9PiBhcnJheSgKICAgICAgICAgICAgICAgICAgICBhcnJheSggJ0B0eXBlJyA9PiAnQ291bnRyeScsICduYW1lJyA9PiAn5Lit5Zu9JyApLAogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICdhdmFpbGFibGVMYW5ndWFnZScgPT4gYXJyYXkoICdDaGluZXNlJywgJ3poLUhhbnMnICksCiAgICAgICAgICAgICksCiAgICAgICAgICAgICdhcmVhU2VydmVkJyAgICAgICA9PiBhcnJheSgKICAgICAgICAgICAgICAgIGFycmF5KCAnQHR5cGUnID0+ICdDb3VudHJ5JywgJ25hbWUnID0+ICfkuK3lm70nICksCiAgICAgICAgICAgICksCiAgICAgICAgICAgICdzYW1lQXMnICAgICAgICAgICA9PiBhcnJheSgKICAgICAgICAgICAgICAgICdodHRwczovL2JhaWtlLmJhaWR1LmNvbS9pdGVtL+WMl+S6rOeZvueOr+W+i+W4iOS6i+WKoeaJgCcsCiAgICAgICAgICAgICAgICAnaHR0cHM6Ly93d3cucWNjLmNvbS9maXJtX3h4eC5odG1sJywKICAgICAgICAgICAgICAgICdodHRwczovL3d3dy50aWFueWFuY2hhLmNvbS9jb21wYW55X3h4eCcsCiAgICAgICAgICAgICAgICAnaHR0cHM6Ly9tYXAuYmFpZHUuY29tL3BvaS/ljJfkuqznmb7njq/lvovluIjkuovliqHmiYAnLAogICAgICAgICAgICAgICAgJ2h0dHBzOi8vd3d3LmFtYXAuY29tL3BvaS9CMHh4eCcsCiAgICAgICAgICAgICksCiAgICAgICAgICAgICdrbm93c0Fib3V0JyAgICAgICA9PiBhcnJheSgKICAgICAgICAgICAgICAgICfliJHkuovovqnmiqQnLAogICAgICAgICAgICAgICAgJ+WPluS/neWAmeWuoScsCiAgICAgICAgICAgICAgICAn57uP5rWO54qv572q6L6p5oqkJywKICAgICAgICAgICAgICAgICfogYzliqHniq/nvarovqnmiqQnLAogICAgICAgICAgICAgICAgJ+W+i+W4iOS8muingScsCiAgICAgICAgICAgICAgICAn5YiR5LqL5ZCI6KeEJywKICAgICAgICAgICAgKSwKICAgICAgICApOwogICAgfQp9CgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqIDIuIEF0dG9ybmV5IHNjaGVtYe+8iOW+i+W4iOivpuaDhemhte+8mnBvc3RfdHlwZSA9IHpzX2xhd3llciDmiJYgbGF3eWVy77yJCiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCmlmICggISBmdW5jdGlvbl9leGlzdHMoICd6c2ZfZ2VvX2F0dG9ybmV5JyApICkgewogICAgZnVuY3Rpb24genNmX2dlb19hdHRvcm5leSgpIHsKICAgICAgICAkcG9zdCA9IGdldF9wb3N0KCk7CiAgICAgICAgaWYgKCAhICRwb3N0ICkgewogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CgogICAgICAgICRqb2JfdGl0bGUgPSBnZXRfcG9zdF9tZXRhKCAkcG9zdC0+SUQsICdfenN5Zl9qb2JfdGl0bGUnLCB0cnVlICk7CiAgICAgICAgaWYgKCAhICRqb2JfdGl0bGUgKSB7CiAgICAgICAgICAgICRqb2JfdGl0bGUgPSAn5omn5Lia5b6L5biIJzsKICAgICAgICB9CgogICAgICAgICRhbHVtbmkgPSBnZXRfcG9zdF9tZXRhKCAkcG9zdC0+SUQsICdfenN5Zl9hbHVtbmlfb2YnLCB0cnVlICk7CiAgICAgICAgaWYgKCAhIGlzX2FycmF5KCAkYWx1bW5pICkgKSB7CiAgICAgICAgICAgICRhbHVtbmkgPSAkYWx1bW5pID8gYXJyYXkoICRhbHVtbmkgKSA6IGFycmF5KCk7CiAgICAgICAgfQoKICAgICAgICAka25vd3MgPSBnZXRfcG9zdF9tZXRhKCAkcG9zdC0+SUQsICdfenN5Zl9rbm93c19hYm91dCcsIHRydWUgKTsKICAgICAgICBpZiAoICEgaXNfYXJyYXkoICRrbm93cyApICkgewogICAgICAgICAgICAka25vd3MgPSAka25vd3MgPyBhcnJheSggJGtub3dzICkgOiBhcnJheSggJ+WIkeS6i+i+qeaKpCcsICflj5bkv53lgJnlrqEnICk7CiAgICAgICAgfQoKICAgICAgICAkc2FtZV9hcyA9IGdldF9wb3N0X21ldGEoICRwb3N0LT5JRCwgJ196c3lmX3NhbWVfYXMnLCB0cnVlICk7CiAgICAgICAgaWYgKCAhIGlzX2FycmF5KCAkc2FtZV9hcyApICkgewogICAgICAgICAgICAkc2FtZV9hcyA9ICRzYW1lX2FzID8gYXJyYXkoICRzYW1lX2FzICkgOiBhcnJheSgpOwogICAgICAgIH0KCiAgICAgICAgJHNjaGVtYSA9IGFycmF5KAogICAgICAgICAgICAnQGNvbnRleHQnICA9PiAnaHR0cHM6Ly9zY2hlbWEub3JnJywKICAgICAgICAgICAgJ0B0eXBlJyAgICAgPT4gJ0F0dG9ybmV5JywKICAgICAgICAgICAgJ0BpZCcgICAgICAgPT4gZ2V0X3Blcm1hbGluayggJHBvc3QtPklEICkgLiAnI2F0dG9ybmV5JywKICAgICAgICAgICAgJ25hbWUnICAgICAgPT4gZ2V0X3RoZV90aXRsZSggJHBvc3QtPklEICksCiAgICAgICAgICAgICd1cmwnICAgICAgID0+IGdldF9wZXJtYWxpbmsoICRwb3N0LT5JRCApLAogICAgICAgICAgICAnd29ya3NGb3InICA9PiBhcnJheSggJ0BpZCcgPT4gWlNGX0dFT19PUkdfSUQgKSwKICAgICAgICAgICAgJ3RlbGVwaG9uZScgPT4gJys4Ni0xODUxMTgzNTczMycsCiAgICAgICAgICAgICdpbWFnZScgICAgID0+IGdldF90aGVfcG9zdF90aHVtYm5haWxfdXJsKCAkcG9zdC0+SUQsICdmdWxsJyApID86ICcnLAogICAgICAgICAgICAnam9iVGl0bGUnICA9PiAkam9iX3RpdGxlLAogICAgICAgICAgICAnYWx1bW5pT2YnICA9PiAkYWx1bW5pLAogICAgICAgICAgICAna25vd3NBYm91dCcgPT4gJGtub3dzLAogICAgICAgICAgICAnc2FtZUFzJyAgICA9PiAkc2FtZV9hcywKICAgICAgICApOwoKICAgICAgICAkcmF0aW5nID0genNmX2dlb19yYXRpbmcoICRwb3N0LT5JRCApOwogICAgICAgIGlmICggJHJhdGluZyApIHsKICAgICAgICAgICAgJHNjaGVtYVsnYWdncmVnYXRlUmF0aW5nJ10gPSAkcmF0aW5nOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRzY2hlbWE7CiAgICB9Cn0KCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICogMy4gTGVnYWxTZXJ2aWNlIHNjaGVtYe+8iC9hYm91dC8g6aG16Z2i77yJCiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCmlmICggISBmdW5jdGlvbl9leGlzdHMoICd6c2ZfZ2VvX2xlZ2FsX3NlcnZpY2UnICkgKSB7CiAgICBmdW5jdGlvbiB6c2ZfZ2VvX2xlZ2FsX3NlcnZpY2UoKSB7CiAgICAgICAgJHNjaGVtYSA9IGFycmF5KAogICAgICAgICAgICAnQGNvbnRleHQnICAgICAgICAgICAgPT4gJ2h0dHBzOi8vc2NoZW1hLm9yZycsCiAgICAgICAgICAgICdAdHlwZScgICAgICAgICAgICAgICA9PiAnTGVnYWxTZXJ2aWNlJywKICAgICAgICAgICAgJ0BpZCcgICAgICAgICAgICAgICAgID0+ICdodHRwczovL3phaXNoYW5neWFuZmEuY29tL2Fib3V0LyNsZWdhbC1zZXJ2aWNlJywKICAgICAgICAgICAgJ25hbWUnICAgICAgICAgICAgICAgID0+ICfljJfkuqznmb7njq/lvovluIjkuovliqHmiYAnLAogICAgICAgICAgICAndXJsJyAgICAgICAgICAgICAgICAgPT4gJ2h0dHBzOi8vemFpc2hhbmd5YW5mYS5jb20nLAogICAgICAgICAgICAndGVsZXBob25lJyAgICAgICAgICAgPT4gJys4Ni0xODUxMTgzNTczMycsCiAgICAgICAgICAgICdwcmljZVJhbmdlJyAgICAgICAgICA9PiAnwqXCpScsCiAgICAgICAgICAgICdhZGRyZXNzJyAgICAgICAgICAgICA9PiBhcnJheSgKICAgICAgICAgICAgICAgICdAdHlwZScgICAgICAgICAgID0+ICdQb3N0YWxBZGRyZXNzJywKICAgICAgICAgICAgICAgICdhZGRyZXNzQ291bnRyeScgID0+ICdDTicsCiAgICAgICAgICAgICAgICAnYWRkcmVzc0xvY2FsaXR5JyA9PiAn5YyX5LqsJywKICAgICAgICAgICAgKSwKICAgICAgICAgICAgJ2FyZWFTZXJ2ZWQnICAgICAgICAgID0+IGFycmF5KAogICAgICAgICAgICAgICAgYXJyYXkoICdAdHlwZScgPT4gJ0NvdW50cnknLCAnbmFtZScgPT4gJ+S4reWbvScgKSwKICAgICAgICAgICAgKSwKICAgICAgICAgICAgJ3BhcmVudE9yZ2FuaXphdGlvbicgID0+IGFycmF5KCAnQGlkJyA9PiBaU0ZfR0VPX09SR19JRCApLAogICAgICAgICk7CgogICAgICAgICRyYXRpbmcgPSB6c2ZfZ2VvX3JhdGluZyggZ2V0X3RoZV9JRCgpICk7CiAgICAgICAgaWYgKCAkcmF0aW5nICkgewogICAgICAgICAgICAkc2NoZW1hWydhZ2dyZWdhdGVSYXRpbmcnXSA9ICRyYXRpbmc7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJHNjaGVtYTsKICAgIH0KfQoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKiA0LiBTZXJ2aWNlIHNjaGVtYe+8iC9wcmFjdGljZS9wLSog5pyN5Yqh6aG15LiOIC90b29scy9jb25zdWx077yJCiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCmlmICggISBmdW5jdGlvbl9leGlzdHMoICd6c2ZfZ2VvX3NlcnZpY2UnICkgKSB7CiAgICBmdW5jdGlvbiB6c2ZfZ2VvX3NlcnZpY2UoKSB7CiAgICAgICAgJHBvc3QgPSBnZXRfcG9zdCgpOwogICAgICAgICRuYW1lID0gJHBvc3QgPyBnZXRfdGhlX3RpdGxlKCAkcG9zdC0+SUQgKSA6ICfliJHkuovovqnmiqQnOwoKICAgICAgICAkc2VydmljZV90eXBlID0gZ2V0X3Bvc3RfbWV0YSggJHBvc3QgPyAkcG9zdC0+SUQgOiAwLCAnX3pzeWZfc2VydmljZV90eXBlJywgdHJ1ZSApOwogICAgICAgIGlmICggISAkc2VydmljZV90eXBlICkgewogICAgICAgICAgICAkc2VydmljZV90eXBlID0gJ+WIkeS6i+i+qeaKpCc7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gYXJyYXkoCiAgICAgICAgICAgICdAY29udGV4dCcgICAgPT4gJ2h0dHBzOi8vc2NoZW1hLm9yZycsCiAgICAgICAgICAgICdAdHlwZScgICAgICAgPT4gJ1NlcnZpY2UnLAogICAgICAgICAgICAnQGlkJyAgICAgICAgID0+ICggJHBvc3QgPyBnZXRfcGVybWFsaW5rKCAkcG9zdC0+SUQgKSA6ICdodHRwczovL3phaXNoYW5neWFuZmEuY29tJyApIC4gJyNzZXJ2aWNlJywKICAgICAgICAgICAgJ3NlcnZpY2VUeXBlJyA9PiAkc2VydmljZV90eXBlLAogICAgICAgICAgICAnbmFtZScgICAgICAgID0+ICRuYW1lLAogICAgICAgICAgICAncHJvdmlkZXInICAgID0+IGFycmF5KCAnQGlkJyA9PiBaU0ZfR0VPX09SR19JRCApLAogICAgICAgICAgICAnYXJlYVNlcnZlZCcgID0+IGFycmF5KAogICAgICAgICAgICAgICAgYXJyYXkoICdAdHlwZScgPT4gJ0NvdW50cnknLCAnbmFtZScgPT4gJ+S4reWbvScgKSwKICAgICAgICAgICAgKSwKICAgICAgICAgICAgJ2Rlc2NyaXB0aW9uJyA9PiAkcG9zdCA/IHdwX3N0cmlwX2FsbF90YWdzKCBnZXRfdGhlX2V4Y2VycHQoICRwb3N0LT5JRCApICkgOiAnJywKICAgICAgICApOwogICAgfQp9CgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqIDUuIEhvd1RvIHNjaGVtYe+8iOato+aWh+WQq+OAjOatpemqpC/mtYHnqIvjgI3kuJTkuLrljZXnr4cgcG9zdO+8jOino+aekCA8b2w+PGxpPu+8iQogKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgppZiAoICEgZnVuY3Rpb25fZXhpc3RzKCAnenNmX2dlb19ob3d0bycgKSApIHsKICAgIGZ1bmN0aW9uIHpzZl9nZW9faG93dG8oKSB7CiAgICAgICAgJHBvc3QgPSBnZXRfcG9zdCgpOwogICAgICAgIGlmICggISAkcG9zdCApIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQoKICAgICAgICAvLyDkvb/nlKjmuLLmn5PlkI7nmoTmraPmlofvvIh0aGVfY29udGVudCDov4fmu6TlmajlsZXlvIDljLrlnZcv55+t5Luj56CB5ZCO55qE55yf5a6eIDxvbD4vPHVsPiDliJfooajvvInjgIIKICAgICAgICAkY29udGVudCA9IGFwcGx5X2ZpbHRlcnMoICd0aGVfY29udGVudCcsICRwb3N0LT5wb3N0X2NvbnRlbnQgKTsKICAgICAgICBpZiAoICEgcHJlZ19tYXRjaCggJy/mraXpqqR85rWB56iLLycsICRjb250ZW50ICkgKSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KCiAgICAgICAgLy8g6Kej5p6Q5pyJ5bqP5YiX6KGoIDxvbD7vvJvoi6Xml6DliJnlhZzlupXop6PmnpDml6Dluo/liJfooaggPHVsPu+8iOacrOermea1geeoi+Wei+aWh+eroOWkmueUqCA8dWw+PGxpPu+8ieOAggogICAgICAgICRsaXN0X2lubmVyID0gbnVsbDsKICAgICAgICBpZiAoIHByZWdfbWF0Y2goICcvPG9sW14+XSo+KFtcc1xTXSo/KTxcL29sPi9pJywgJGNvbnRlbnQsICRsbSApICkgewogICAgICAgICAgICAkbGlzdF9pbm5lciA9ICRsbVsxXTsKICAgICAgICB9IGVsc2VpZiAoIHByZWdfbWF0Y2goICcvPHVsW14+XSo+KFtcc1xTXSo/KTxcL3VsPi9pJywgJGNvbnRlbnQsICRsbSApICkgewogICAgICAgICAgICAkbGlzdF9pbm5lciA9ICRsbVsxXTsKICAgICAgICB9CiAgICAgICAgaWYgKCBudWxsID09PSAkbGlzdF9pbm5lciApIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQoKICAgICAgICAkc3RlcHMgPSBhcnJheSgpOwogICAgICAgIGlmICggcHJlZ19tYXRjaF9hbGwoICcvPGxpW14+XSo+KFtcc1xTXSo/KTxcL2xpPi9pJywgJGxpc3RfaW5uZXIsICRsaV9tYXRjaGVzICkgKSB7CiAgICAgICAgICAgIGZvcmVhY2ggKCAkbGlfbWF0Y2hlc1sxXSBhcyAkaWR4ID0+ICRsaV9odG1sICkgewogICAgICAgICAgICAgICAgJHRleHQgPSB0cmltKCB3cF9zdHJpcF9hbGxfdGFncyggJGxpX2h0bWwgKSApOwogICAgICAgICAgICAgICAgaWYgKCAnJyA9PT0gJHRleHQgKSB7CiAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkc3RlcHNbXSA9IGFycmF5KAogICAgICAgICAgICAgICAgICAgICdAdHlwZScgICAgPT4gJ0hvd1RvU3RlcCcsCiAgICAgICAgICAgICAgICAgICAgJ3Bvc2l0aW9uJyA9PiAkaWR4ICsgMSwKICAgICAgICAgICAgICAgICAgICAnbmFtZScgICAgID0+ICR0ZXh0LAogICAgICAgICAgICAgICAgICAgICd0ZXh0JyAgICAgPT4gJHRleHQsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoIGVtcHR5KCAkc3RlcHMgKSApIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gYXJyYXkoCiAgICAgICAgICAgICdAY29udGV4dCcgICAgPT4gJ2h0dHBzOi8vc2NoZW1hLm9yZycsCiAgICAgICAgICAgICdAdHlwZScgICAgICAgPT4gJ0hvd1RvJywKICAgICAgICAgICAgJ0BpZCcgICAgICAgICA9PiBnZXRfcGVybWFsaW5rKCAkcG9zdC0+SUQgKSAuICcjaG93dG8nLAogICAgICAgICAgICAnbmFtZScgICAgICAgID0+IGdldF90aGVfdGl0bGUoICRwb3N0LT5JRCApLAogICAgICAgICAgICAnZGVzY3JpcHRpb24nID0+IHdwX3N0cmlwX2FsbF90YWdzKCBnZXRfdGhlX2V4Y2VycHQoICRwb3N0LT5JRCApICksCiAgICAgICAgICAgICdzdGVwJyAgICAgICAgPT4gJHN0ZXBzLAogICAgICAgICk7CiAgICB9Cn0KCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICogNi4gU3BlYWthYmxlIHNjaGVtYe+8iOWFs+mUrumhte+8mi9sYXd5ZXJzL+OAgS9wcmFjdGljZS/jgIEvYWJvdXQv44CBUUEg6K+m5oOF77yJCiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCmlmICggISBmdW5jdGlvbl9leGlzdHMoICd6c2ZfZ2VvX3NwZWFrYWJsZScgKSApIHsKICAgIGZ1bmN0aW9uIHpzZl9nZW9fc3BlYWthYmxlKCkgewogICAgICAgIHJldHVybiBhcnJheSgKICAgICAgICAgICAgJ0Bjb250ZXh0JyA9PiAnaHR0cHM6Ly9zY2hlbWEub3JnJywKICAgICAgICAgICAgJ0B0eXBlJyAgICA9PiAnU3BlYWthYmxlU3BlY2lmaWNhdGlvbicsCiAgICAgICAgICAgICd4cGF0aCcgICAgPT4gYXJyYXkoCiAgICAgICAgICAgICAgICAnL2h0bWwvaGVhZC90aXRsZScsCiAgICAgICAgICAgICAgICAnL2h0bWwvYm9keS9tYWluL2gxJywKICAgICAgICAgICAgKSwKICAgICAgICApOwogICAgfQp9CgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqIDcuIFJldmlldyAvIEFnZ3JlZ2F0ZVJhdGluZyDor7vlj5bvvIjoh6rlrprkuYnlrZfmrrXvvIkKICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKaWYgKCAhIGZ1bmN0aW9uX2V4aXN0cyggJ3pzZl9nZW9fcmF0aW5nJyApICkgewogICAgZnVuY3Rpb24genNmX2dlb19yYXRpbmcoICRwb3N0X2lkICkgewogICAgICAgICRhdmcgICA9IGdldF9wb3N0X21ldGEoICRwb3N0X2lkLCAnX3pzeWZfcmF0aW5nX2F2ZycsIHRydWUgKTsKICAgICAgICAkY291bnQgPSBnZXRfcG9zdF9tZXRhKCAkcG9zdF9pZCwgJ196c3lmX3Jldmlld19jb3VudCcsIHRydWUgKTsKICAgICAgICBpZiAoICRhdmcgPT09ICcnIHx8ICRjb3VudCA9PT0gJycgKSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgICAgICAkYXZnX2YgICA9IGZsb2F0dmFsKCAkYXZnICk7CiAgICAgICAgJGNvdW50X2kgPSBpbnR2YWwoICRjb3VudCApOwogICAgICAgIGlmICggJGNvdW50X2kgPD0gMCB8fCAkYXZnX2YgPD0gMCApIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgICAgIHJldHVybiBhcnJheSgKICAgICAgICAgICAgJ0B0eXBlJyAgICAgICA9PiAnQWdncmVnYXRlUmF0aW5nJywKICAgICAgICAgICAgJ3JhdGluZ1ZhbHVlJyA9PiAkYXZnX2YsCiAgICAgICAgICAgICdyZXZpZXdDb3VudCcgPT4gJGNvdW50X2ksCiAgICAgICAgICAgICdiZXN0UmF0aW5nJyAgPT4gNSwKICAgICAgICAgICAgJ3dvcnN0UmF0aW5nJyA9PiAxLAogICAgICAgICk7CiAgICB9Cn0KCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICogOC4g6aG16Z2i5LiK5LiL5paH5Yik5patCiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCmlmICggISBmdW5jdGlvbl9leGlzdHMoICd6c2ZfZ2VvX2lzX2xhd3llcl9kZXRhaWwnICkgKSB7CiAgICBmdW5jdGlvbiB6c2ZfZ2VvX2lzX2xhd3llcl9kZXRhaWwoKSB7CiAgICAgICAgcmV0dXJuIGlzX3Npbmd1bGFyKCBhcnJheSggJ3pzX2xhd3llcicsICdsYXd5ZXInICkgKTsKICAgIH0KfQoKaWYgKCAhIGZ1bmN0aW9uX2V4aXN0cyggJ3pzZl9nZW9faXNfYWJvdXQnICkgKSB7CiAgICBmdW5jdGlvbiB6c2ZfZ2VvX2lzX2Fib3V0KCkgewogICAgICAgIHJldHVybiB6c2ZfZ2VvX2N1cnJlbnRfcGF0aCgpID09PSAnL2Fib3V0JzsKICAgIH0KfQoKaWYgKCAhIGZ1bmN0aW9uX2V4aXN0cyggJ3pzZl9nZW9faXNfc2VydmljZV9wYWdlJyApICkgewogICAgZnVuY3Rpb24genNmX2dlb19pc19zZXJ2aWNlX3BhZ2UoKSB7CiAgICAgICAgJHBhdGggPSB6c2ZfZ2VvX2N1cnJlbnRfcGF0aCgpOwogICAgICAgIGlmICggcHJlZ19tYXRjaCggJyNeL3ByYWN0aWNlL3AtIycsICRwYXRoICkgKSB7CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgICBpZiAoIHByZWdfbWF0Y2goICcjXi90b29scy9jb25zdWx0IycsICRwYXRoICkgKSB7CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9Cn0KCmlmICggISBmdW5jdGlvbl9leGlzdHMoICd6c2ZfZ2VvX2lzX3NwZWFrYWJsZV9wYWdlJyApICkgewogICAgZnVuY3Rpb24genNmX2dlb19pc19zcGVha2FibGVfcGFnZSgpIHsKICAgICAgICAkcGF0aCA9IHpzZl9nZW9fY3VycmVudF9wYXRoKCk7CiAgICAgICAgaWYgKCAkcGF0aCA9PT0gJy9sYXd5ZXJzJyB8fCBzdHJwb3MoICRwYXRoLCAnL2xhd3llcnMvJyApID09PSAwICkgewogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgaWYgKCBzdHJwb3MoICRwYXRoLCAnL3ByYWN0aWNlJyApID09PSAwICkgewogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgaWYgKCAkcGF0aCA9PT0gJy9hYm91dCcgKSB7CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgICAvLyBRQSDor6bmg4XpobUKICAgICAgICBpZiAoIHN0cnBvcyggJHBhdGgsICcvcWEvJyApICE9PSBmYWxzZSApIHsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KfQoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKiA5LiDkuLvovpPlh7rvvJp3cF9mb290ZXIg5LyY5YWI57qnIDk5CiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCmlmICggISBmdW5jdGlvbl9leGlzdHMoICd6c2ZfZ2VvX3NjaGVtYV9lbWl0JyApICkgewogICAgZnVuY3Rpb24genNmX2dlb19zY2hlbWFfZW1pdCgpIHsKICAgICAgICBpZiAoIGlzX2FkbWluKCkgKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgICRzY2hlbWFzID0gYXJyYXkoKTsKCiAgICAgICAgLy8g5omA5pyJ6aG16Z2i77yaT3JnYW5pemF0aW9uCiAgICAgICAgJHNjaGVtYXNbXSA9IHpzZl9nZW9fb3JnYW5pemF0aW9uKCk7CgogICAgICAgIC8vIOW+i+W4iOivpuaDhemhte+8mkF0dG9ybmV577yIKyDlj6/pgIkgQWdncmVnYXRlUmF0aW5n77yJCiAgICAgICAgaWYgKCB6c2ZfZ2VvX2lzX2xhd3llcl9kZXRhaWwoKSApIHsKICAgICAgICAgICAgJGF0dG9ybmV5ID0genNmX2dlb19hdHRvcm5leSgpOwogICAgICAgICAgICBpZiAoICRhdHRvcm5leSApIHsKICAgICAgICAgICAgICAgICRzY2hlbWFzW10gPSAkYXR0b3JuZXk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8vIOWFs+S6jumhte+8mkxlZ2FsU2VydmljZe+8iCsg5Y+v6YCJIEFnZ3JlZ2F0ZVJhdGluZ++8iQogICAgICAgIGlmICggenNmX2dlb19pc19hYm91dCgpICkgewogICAgICAgICAgICAkc2NoZW1hc1tdID0genNmX2dlb19sZWdhbF9zZXJ2aWNlKCk7CiAgICAgICAgfQoKICAgICAgICAvLyDmnI3liqHpobXvvJpTZXJ2aWNlCiAgICAgICAgaWYgKCB6c2ZfZ2VvX2lzX3NlcnZpY2VfcGFnZSgpICkgewogICAgICAgICAgICAkc2NoZW1hc1tdID0genNmX2dlb19zZXJ2aWNlKCk7CiAgICAgICAgfQoKICAgICAgICAvLyDljZXnr4cgcG9zdCDkuJTmraPmloflkKvmraXpqqQv5rWB56iL77yaSG93VG8KICAgICAgICBpZiAoIGlzX3Npbmd1bGFyKCAncG9zdCcgKSApIHsKICAgICAgICAgICAgJGRiZ19jb250ZW50ID0gYXBwbHlfZmlsdGVycyggJ3RoZV9jb250ZW50JywgZ2V0X3Bvc3QoKS0+cG9zdF9jb250ZW50ICk7CiAgICAgICAgICAgICRkYmdfc3RlcCA9IChib29sKSBwcmVnX21hdGNoKCAnL+atpemqpHzmtYHnqIsvJywgJGRiZ19jb250ZW50ICk7CiAgICAgICAgICAgICRkYmdfb2wgPSAoYm9vbCkgcHJlZ19tYXRjaCggJy88b2xbXj5dKj4vaScsICRkYmdfY29udGVudCApOwogICAgICAgICAgICAkZGJnX3VsID0gKGJvb2wpIHByZWdfbWF0Y2goICcvPHVsW14+XSo+L2knLCAkZGJnX2NvbnRlbnQgKTsKICAgICAgICAgICAgJGRiZ19saSA9IChib29sKSBwcmVnX21hdGNoKCAnLzxsaVtePl0qPi9pJywgJGRiZ19jb250ZW50ICk7CiAgICAgICAgICAgIGVjaG8gIlxuPCEtLSBaU0ZfREVCVUcgaG93dG86IHN0ZXA9JGRiZ19zdGVwIG9sPSRkYmdfb2wgdWw9JGRiZ191bCBsaT0kZGJnX2xpIGNsZW49IiAuIHN0cmxlbiggJGRiZ19jb250ZW50ICkgLiAiIC0tPlxuIjsKICAgICAgICAgICAgJGhvd3RvID0genNmX2dlb19ob3d0bygpOwogICAgICAgICAgICBpZiAoICRob3d0byApIHsKICAgICAgICAgICAgICAgICRzY2hlbWFzW10gPSAkaG93dG87CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8vIOWFs+mUrumhte+8mlNwZWFrYWJsZQogICAgICAgIGlmICggenNmX2dlb19pc19zcGVha2FibGVfcGFnZSgpICkgewogICAgICAgICAgICAkc2NoZW1hc1tdID0genNmX2dlb19zcGVha2FibGUoKTsKICAgICAgICB9CgogICAgICAgIGZvcmVhY2ggKCAkc2NoZW1hcyBhcyAkc2NoZW1hICkgewogICAgICAgICAgICBpZiAoIGVtcHR5KCAkc2NoZW1hICkgfHwgISBpc19hcnJheSggJHNjaGVtYSApICkgewogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJGpzb24gPSB3cF9qc29uX2VuY29kZSggJHNjaGVtYSwgSlNPTl9VTkVTQ0FQRURfU0xBU0hFUyB8IEpTT05fVU5FU0NBUEVEX1VOSUNPREUgfCBKU09OX1BSRVRUWV9QUklOVCApOwogICAgICAgICAgICBpZiAoIGZhbHNlID09PSAkanNvbiApIHsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVjaG8gIlxuIiAuICc8c2NyaXB0IHR5cGU9ImFwcGxpY2F0aW9uL2xkK2pzb24iPicgLiAkanNvbiAuICc8L3NjcmlwdD4nIC4gIlxuIjsKICAgICAgICB9CiAgICB9Cn0KCmFkZF9hY3Rpb24oICd3cF9mb290ZXInLCAnenNmX2dlb19zY2hlbWFfZW1pdCcsIDk5ICk7CgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqIDEwLiBBcnRpY2xlIHNjaGVtYSDkv67mraPvvJrloavlhYUgcHVibGlzaGVyIOS4jiBhdXRob3IubmFtZQogKiAgICAg77yIWW9hc3Qgd3BzZW9fc2NoZW1hX2FydGljbGUgZmlsdGVy77yJCiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCmlmICggISBmdW5jdGlvbl9leGlzdHMoICd6c2ZfZml4X2FydGljbGVfcHVibGlzaGVyJyApICkgewogICAgZnVuY3Rpb24genNmX2ZpeF9hcnRpY2xlX3B1Ymxpc2hlciggJHNjaGVtYSApIHsKICAgICAgICBpZiAoICEgaXNfYXJyYXkoICRzY2hlbWEgKSApIHsKICAgICAgICAgICAgcmV0dXJuICRzY2hlbWE7CiAgICAgICAgfQoKICAgICAgICAkc2NoZW1hWydwdWJsaXNoZXInXSA9IGFycmF5KAogICAgICAgICAgICAnQHR5cGUnID0+ICdPcmdhbml6YXRpb24nLAogICAgICAgICAgICAnQGlkJyAgID0+IFpTRl9HRU9fT1JHX0lELAogICAgICAgICAgICAnbmFtZScgID0+ICfljJfkuqznmb7njq/lvovluIjkuovliqHmiYAnLAogICAgICAgICk7CgogICAgICAgIGlmICggZW1wdHkoICRzY2hlbWFbJ2F1dGhvciddWyduYW1lJ10gKSApIHsKICAgICAgICAgICAgJHNjaGVtYVsnYXV0aG9yJ11bJ25hbWUnXSA9ICfljJfkuqznmb7njq/lvovluIjkuovliqHmiYAnOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRzY2hlbWE7CiAgICB9Cn0KCmFkZF9maWx0ZXIoICd3cHNlb19zY2hlbWFfYXJ0aWNsZScsICd6c2ZfZml4X2FydGljbGVfcHVibGlzaGVyJywgMTAsIDEgKTsK 刑事诉讼法强制措施有哪几种?期限规定一览_法律法规 - 北京百环律师事务所 刑事诉讼法强制措施有哪几种?期限规定一览_法律法规 - 北京百环律师事务所
10万+问答 5万+专业文章 50+实用工具 100+合作律师
📞 18511835733 18511835733@163.com
首页 > 刑事诉讼法强制措施有哪几种?期限规定一览_法律法规
首页 » 刑事诉讼法强制措施有哪几种?期限规定一览

刑事诉讼法强制措施有哪几种?期限规定一览

2026年9月2日 · 分类:法律法规

本文要点(AI 摘要)

  • 刑事强制措施是办案机关对嫌疑人、被告人采取的临时性人身约束手段,从轻到重依次为拘传、取保候审、监视居住、拘留、逮捕。
  • 对未被羁押的嫌疑人、被告人强制其到案接受讯问。
  • 最长不得超过十二个月。
  • 最长不得超过六个月。
  • 一般情形:拘留后三日内提请批捕,可延长一至四日,合计最长七日;
文章摘要

刑事强制措施是办案机关对嫌疑人、被告人采取的临时性人身约束手段,从轻到重依次为拘传、取保候审、监视居住、拘留、逮捕。每种措施的期限与适用条件都有明确的法律边界,家属了解这些数字,就能判断案件走到了哪一步、还有多少时间窗口。一、拘传对未被羁押的嫌疑人、被告人强制其到案接受讯问。持续时间不得超过十二小时,案情特别重大、复杂的不得超过二十四小时,且不得以连续拘传变相拘禁。二、取保候审最长不得超过十二个月。适用对象包括可能判处管制拘役、有期徒刑以上但无社会危险性、严重疾病或怀孕哺乳、羁押届满案件未结等情...

刑事强制措施是办案机关对嫌疑人、被告人采取的临时性人身约束手段,从轻到重依次为拘传、取保候审、监视居住、拘留、逮捕。每种措施的期限与适用条件都有明确的法律边界,家属了解这些数字,就能判断案件走到了哪一步、还有多少时间窗口。

一、拘传

对未被羁押的嫌疑人、被告人强制其到案接受讯问。持续时间不得超过十二小时,案情特别重大、复杂的不得超过二十四小时,且不得以连续拘传变相拘禁。

二、取保候审

最长不得超过十二个月。适用对象包括可能判处管制拘役、有期徒刑以上但无社会危险性、严重疾病或怀孕哺乳、羁押届满案件未结等情形。取保期间需遵守报告、传唤等义务,违反可能被重新羁押。

三、监视居住

最长不得超过六个月。一般适用于符合取保条件但无法提出保证人或交纳保证金的情形;指定居所监视居住仅在无固定住处或涉特定严重犯罪时适用,其期限可以折抵刑期。

四、刑事拘留

期限的分段计算

  • 一般情形:拘留后三日内提请批捕,可延长一至四日,合计最长七日;
  • 流窜作案、多次作案、结伙作案的重大嫌疑分子:提请批捕时间可延长至三十日;
  • 检察机关审查批捕:七日;
  • 因此拘留阶段最长为三十七天——即著名的黄金 37 天。

拘留后,除无法通知或涉特定犯罪妨碍侦查的情形外,应当在二十四小时内通知家属,并将嫌疑人送看守所羁押。

五、逮捕

逮捕后的侦查羁押期限一般为二个月;案情复杂、期限届满不能终结的,可经上一级检察院批准延长一个月;四类特定案件经省级检察院批准可再延长二个月;可能判处十年以上刑罚仍未侦查终结的,可再延长二个月。发现不应当逮捕的,必须立即释放。

六、期限届满怎么办

强制措施法定期限届满的,嫌疑人、被告人及其法定代理人、近亲属或辩护人有权要求解除强制措施。实务中,律师在期限节点前提交的法律意见(如羁押必要性审查申请)是推动变更的重要抓手。

七、五种强制措施对照一览

  • 拘传:最轻,强制到案接受讯问,一般不超过十二小时,重大复杂案件不超过二十四小时;
  • 取保候审:非羁押,最长十二个月,需提供保证人或交纳保证金,活动范围受限;
  • 监视居住:限制居所与活动,最长六个月,强度介于取保与拘留之间;
  • 拘留:羁押状态,一般最长七日,特定情形可延长至三十日,加上批捕审查最长三十七天;
  • 逮捕:最重,侦查羁押一般二个月,可依法延长,期限届满未办结的应当变更或释放。

八、家属常见错误做法与后果

  • 把各种措施混为一谈:以为「取保了就没事」或「拘留了就一定判刑」,误判导致行动迟缓或过度恐慌;
  • 不在期限节点上做文章:期限届满前是提出解除、变更申请的更合适时机,错过等于放弃权利;
  • 轻信「捞人」说法:声称能内定结果的都是骗局,强制措施的适用与变更只能依法进行;
  • 对超期不闻不问:嫌疑人及其近亲属、辩护人均有权要求解除超期的强制措施,不行使就白白多关。

常见问题

37 天过了是不是就一定被批捕了?

不一定。37 天是侦查机关提请批捕加检察机关审查的最长时限,实际批捕与否取决于证据与社会危险性评估。

监视居住比取保候审更严重吗?

监视居住对人身自由的限制强于取保候审,介于取保与拘留之间。

分不清家人现在处于哪个阶段?拨打 18511835733 或通过 在线咨询,报出拘留日期,律师帮您算清每个期限节点。

本文由 北京百环律师事务所刑事律师团队 审核并授权发布,内容为普法信息、不构成个案法律意见。预约面谈请拨 18511835733
相关法律问题,在线咨询
💬📞
在商言法(北京)文化有限公司负责本平台运营与技术服务;具体法律服务由用户实际委托的律师或机构提供。 了解平台
💻
添加律师微信

微信号与手机号相同

18511835733