#include <type_traits>
using namespace std;
template <typename T>
struct A
{
typedef typename add_const<T>::type TT;
};
template <typename T>
struct B
{
typedef const T TT;
};
static_assert(is_same<const int, A<int>::TT>::value, "A<int> wrong");
static_assert(is_same<const int, A<const int>::TT>::value, "A<const int> wrong");
static_assert(is_same<int&, A<int&>::TT>::value, "A<int&> wrong");
static_assert(is_same<const int, B<int>::TT>::value, "B<int> wrong");
static_assert(is_same<const int, B<const int>::TT>::value, "B<const int> wrong");
static_assert(is_same<int&, B<int&>::TT>::value, "B<int&> wrong");
int main() {}
I2luY2x1ZGUgPHR5cGVfdHJhaXRzPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCnRlbXBsYXRlIDx0eXBlbmFtZSBUPgpzdHJ1Y3QgQQp7CiAgICB0eXBlZGVmIHR5cGVuYW1lIGFkZF9jb25zdDxUPjo6dHlwZSBUVDsKfTsKCnRlbXBsYXRlIDx0eXBlbmFtZSBUPgpzdHJ1Y3QgQgp7CiAgICB0eXBlZGVmIGNvbnN0IFQgVFQ7Cn07CgpzdGF0aWNfYXNzZXJ0KGlzX3NhbWU8Y29uc3QgaW50LCBBPGludD46OlRUPjo6dmFsdWUsICJBPGludD4gd3JvbmciKTsKc3RhdGljX2Fzc2VydChpc19zYW1lPGNvbnN0IGludCwgQTxjb25zdCBpbnQ+OjpUVD46OnZhbHVlLCAiQTxjb25zdCBpbnQ+IHdyb25nIik7CnN0YXRpY19hc3NlcnQoaXNfc2FtZTxpbnQmLCBBPGludCY+OjpUVD46OnZhbHVlLCAiQTxpbnQmPiB3cm9uZyIpOwpzdGF0aWNfYXNzZXJ0KGlzX3NhbWU8Y29uc3QgaW50LCBCPGludD46OlRUPjo6dmFsdWUsICJCPGludD4gd3JvbmciKTsKc3RhdGljX2Fzc2VydChpc19zYW1lPGNvbnN0IGludCwgQjxjb25zdCBpbnQ+OjpUVD46OnZhbHVlLCAiQjxjb25zdCBpbnQ+IHdyb25nIik7CnN0YXRpY19hc3NlcnQoaXNfc2FtZTxpbnQmLCBCPGludCY+OjpUVD46OnZhbHVlLCAiQjxpbnQmPiB3cm9uZyIpOwoKaW50IG1haW4oKSB7fQo=