LyoKICogKEMpIENvcHlyaWdodCAyMDAyCiAqIERhbmllbCBFbmdzdHL2bSwgT21pY3JvbiBDZXRpIEFCLCBkYW5pZWxAb21pY3Jvbi5zZS4KICoKICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKICogcHJvamVjdC4KICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwogKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgogKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKICogTUEgMDIxMTEtMTMwNyBVU0EKICovCgojaW5jbHVkZSA8Y29tbW9uLmg+CiNpbmNsdWRlIDxtYWxsb2MuaD4KI2luY2x1ZGUgPGFzbS9pby5oPgojaW5jbHVkZSA8YXNtL2k4MjU5Lmg+CiNpbmNsdWRlIDxhc20vaWJtcGMuaD4KI2luY2x1ZGUgPGFzbS9pbnRlcnJ1cHQuaD4KCgpzdHJ1Y3QgaWR0X2VudHJ5IHsKCXUxNgliYXNlX2xvdzsKCXUxNglzZWxlY3RvcjsKCXU4CXJlczsKCXU4CWFjY2VzczsKCXUxNgliYXNlX2hpZ2g7Cn0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwoKCnN0cnVjdCBpZHRfZW50cnkgaWR0WzI1Nl07CgoKI2RlZmluZSBNQVhfSVJRIDE2Cgp0eXBlZGVmIHN0cnVjdCBpcnFfaGFuZGxlciB7CglzdHJ1Y3QgaXJxX2hhbmRsZXIgKm5leHQ7CglpbnRlcnJ1cHRfaGFuZGxlcl90KiBpc3JfZnVuYzsKCXZvaWQgKmlzcl9kYXRhOwp9IGlycV9oYW5kbGVyX3Q7CgojZGVmaW5lIElSUV9ESVNBQkxFRCAgIDEKCnR5cGVkZWYgc3RydWN0IHsKCWlycV9oYW5kbGVyX3QgKmhhbmRsZXI7Cgl1bnNpZ25lZCBsb25nIHN0YXR1czsKfSBpcnFfZGVzY190OwoKc3RhdGljIGlycV9kZXNjX3QgaXJxX3RhYmxlW01BWF9JUlFdOwoKYXNtICgiaXJxX3JldHVybjpcbiIKICAgICAiICAgICBhZGRsICAkNCwgJWVzcFxuIgogICAgICIgICAgIHBvcGFcbiIKICAgICAiICAgICBpcmV0XG4iKTsKCmFzbSAoImV4cF9yZXR1cm46XG4iCiAgICAgIiAgICAgYWRkbCAgJDEyLCAlZXNwXG4iCiAgICAgIiAgICAgcG9wICAgJWVzcFxuIgogICAgICIgICAgIHBvcGFcbiIKICAgICAiICAgICBpcmV0XG4iKTsKCmNoYXIgZXhjZXB0aW9uX3N0YWNrWzQwOTZdOwoKI2RlZmluZSBERUNMQVJFX0lOVEVSUlVQVCh4KSBcCglhc20oIi5nbG9ibCBpcnFfIiN4IlxuIiBcCgkJICAgICJpcnFfIiN4IjpcbiIgXAoJCSAgICAicHVzaGEgXG4iIFwKCQkgICAgInB1c2hsICQiI3giXG4iIFwKCQkgICAgInB1c2hsICRpcnFfcmV0dXJuXG4iIFwKCQkgICAgImptcCAgIGRvX2lycVxuIik7IFwKCXZvaWQgX19hdHRyaWJ1dGVfXyAoKHJlZ3Bhcm0oMCkpKSBpcnFfIyN4KHZvaWQpCgojZGVmaW5lIERFQ0xBUkVfRVhDRVBUSU9OKHgsIGYpIFwKCWFzbSgiLmdsb2JsIGV4cF8iI3giXG4iIFwKCQkgICAgImV4cF8iI3giOlxuIiBcCgkJICAgICJwdXNoYSBcbiIgXAoJCSAgICAibW92bCAgICAgJWVzcCwgJWVieFxuIiBcCgkJICAgICJtb3ZsICAgICAkZXhjZXB0aW9uX3N0YWNrLCAlZWF4XG4iIFwKCQkgICAgIm1vdmwgICAgICVlYXgsICVlc3AgXG4iIFwKCQkgICAgInB1c2hsICAgICVlYnhcbiIgXAoJCSAgICAibW92bCAgICAgMzIoJWVzcCksICVlYnhcbiIgXAoJCSAgICAieG9ybCAgICAgJWVkeCwgJWVkeFxuIiBcCgkJICAgICJtb3Z3ICAgICAzNiglZXNwKSwgJWR4XG4iIFwKCQkgICAgInB1c2hsICAgICVlZHhcbiIgXAoJCSAgICAicHVzaGwgICAgJWVieFxuIiBcCgkJICAgICJwdXNobCAgICAkIiN4IlxuIiBcCgkJICAgICJwdXNobCAgICAkZXhwX3JldHVyblxuIiBcCgkJICAgICJqbXAgICAgICAiI2YiXG4iKTsgXAoJdm9pZCBfX2F0dHJpYnV0ZV9fICgocmVncGFybSgwKSkpIGV4cF8jI3godm9pZCkKCkRFQ0xBUkVfRVhDRVBUSU9OKDAsIGRpdmlkZV9leGNlcHRpb25fZW50cnkpOyAgICAgIC8qIERpdmlkZSBleGNlcHRpb24gKi8KREVDTEFSRV9FWENFUFRJT04oMSwgZGVidWdfZXhjZXB0aW9uX2VudHJ5KTsgICAgICAgLyogRGVidWcgZXhjZXB0aW9uICovCkRFQ0xBUkVfRVhDRVBUSU9OKDIsIG5taV9lbnRyeSk7ICAgICAgICAgICAgICAgICAgIC8qIE5NSSAqLwpERUNMQVJFX0VYQ0VQVElPTigzLCB1bmtub3duX2V4Y2VwdGlvbl9lbnRyeSk7ICAgICAvKiBCcmVha3BvaW50L0NvcHJvY2Vzc29yIEVycm9yICovCkRFQ0xBUkVfRVhDRVBUSU9OKDQsIHVua25vd25fZXhjZXB0aW9uX2VudHJ5KTsgICAgIC8qIE92ZXJmbG93ICovCkRFQ0xBUkVfRVhDRVBUSU9OKDUsIHVua25vd25fZXhjZXB0aW9uX2VudHJ5KTsgICAgIC8qIEJvdW5kcyAqLwpERUNMQVJFX0VYQ0VQVElPTig2LCBpbnZhbGlkX2luc3RydWN0aW9uX2VudHJ5KTsgICAvKiBJbnZhbGlkIGluc3RydWN0aW9uICovCkRFQ0xBUkVfRVhDRVBUSU9OKDcsIHVua25vd25fZXhjZXB0aW9uX2VudHJ5KTsgICAgIC8qIERldmljZSBub3QgcHJlc2VudCAqLwpERUNMQVJFX0VYQ0VQVElPTig4LCBkb3VibGVfZmF1bHRfZW50cnkpOyAgICAgICAgICAvKiBEb3VibGUgZmF1bHQgKi8KREVDTEFSRV9FWENFUFRJT04oOSwgdW5rbm93bl9leGNlcHRpb25fZW50cnkpOyAgICAgLyogQ28tcHJvY2Vzc29yIHNlZ21lbnQgb3ZlcnJ1biAqLwpERUNMQVJFX0VYQ0VQVElPTigxMCwgaW52YWxpZF90c3NfZXhjZXB0aW9uX2VudHJ5KTsvKiBJbnZhbGlkIFRTUyAqLwpERUNMQVJFX0VYQ0VQVElPTigxMSwgc2VnX2ZhdWx0X2VudHJ5KTsgICAgICAgICAgICAvKiBTZWdtZW50IG5vdCBwcmVzZW50ICovCkRFQ0xBUkVfRVhDRVBUSU9OKDEyLCBzdGFja19mYXVsdF9lbnRyeSk7ICAgICAgICAgIC8qIFN0YWNrIG92ZXJmbG93ICovCkRFQ0xBUkVfRVhDRVBUSU9OKDEzLCBncGZfZW50cnkpOyAgICAgICAgICAgICAgICAgIC8qIEdQRiAqLwpERUNMQVJFX0VYQ0VQVElPTigxNCwgcGFnZV9mYXVsdF9lbnRyeSk7ICAgICAgICAgICAvKiBQRiAqLwpERUNMQVJFX0VYQ0VQVElPTigxNSwgdW5rbm93bl9leGNlcHRpb25fZW50cnkpOyAgICAvKiBSZXNlcnZlZCAqLwpERUNMQVJFX0VYQ0VQVElPTigxNiwgZnBfZXhjZXB0aW9uX2VudHJ5KTsgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCAqLwpERUNMQVJFX0VYQ0VQVElPTigxNywgYWxpZ25tZW50X2NoZWNrX2VudHJ5KTsgICAgICAvKiBhbGlnbm1lbnQgY2hlY2sgKi8KREVDTEFSRV9FWENFUFRJT04oMTgsIG1hY2hpbmVfY2hlY2tfZW50cnkpOyAgICAgICAgLyogbWFjaGluZSBjaGVjayAqLwpERUNMQVJFX0VYQ0VQVElPTigxOSwgdW5rbm93bl9leGNlcHRpb25fZW50cnkpOyAgICAvKiBSZXNlcnZlZCAqLwpERUNMQVJFX0VYQ0VQVElPTigyMCwgdW5rbm93bl9leGNlcHRpb25fZW50cnkpOyAgICAvKiBSZXNlcnZlZCAqLwpERUNMQVJFX0VYQ0VQVElPTigyMSwgdW5rbm93bl9leGNlcHRpb25fZW50cnkpOyAgICAvKiBSZXNlcnZlZCAqLwpERUNMQVJFX0VYQ0VQVElPTigyMiwgdW5rbm93bl9leGNlcHRpb25fZW50cnkpOyAgICAvKiBSZXNlcnZlZCAqLwpERUNMQVJFX0VYQ0VQVElPTigyMywgdW5rbm93bl9leGNlcHRpb25fZW50cnkpOyAgICAvKiBSZXNlcnZlZCAqLwpERUNMQVJFX0VYQ0VQVElPTigyNCwgdW5rbm93bl9leGNlcHRpb25fZW50cnkpOyAgICAvKiBSZXNlcnZlZCAqLwpERUNMQVJFX0VYQ0VQVElPTigyNSwgdW5rbm93bl9leGNlcHRpb25fZW50cnkpOyAgICAvKiBSZXNlcnZlZCAqLwpERUNMQVJFX0VYQ0VQVElPTigyNiwgdW5rbm93bl9leGNlcHRpb25fZW50cnkpOyAgICAvKiBSZXNlcnZlZCAqLwpERUNMQVJFX0VYQ0VQVElPTigyNywgdW5rbm93bl9leGNlcHRpb25fZW50cnkpOyAgICAvKiBSZXNlcnZlZCAqLwpERUNMQVJFX0VYQ0VQVElPTigyOCwgdW5rbm93bl9leGNlcHRpb25fZW50cnkpOyAgICAvKiBSZXNlcnZlZCAqLwpERUNMQVJFX0VYQ0VQVElPTigyOSwgdW5rbm93bl9leGNlcHRpb25fZW50cnkpOyAgICAvKiBSZXNlcnZlZCAqLwpERUNMQVJFX0VYQ0VQVElPTigzMCwgdW5rbm93bl9leGNlcHRpb25fZW50cnkpOyAgICAvKiBSZXNlcnZlZCAqLwpERUNMQVJFX0VYQ0VQVElPTigzMSwgdW5rbm93bl9leGNlcHRpb25fZW50cnkpOyAgICAvKiBSZXNlcnZlZCAqLwoKREVDTEFSRV9JTlRFUlJVUFQoMCk7CkRFQ0xBUkVfSU5URVJSVVBUKDEpOwpERUNMQVJFX0lOVEVSUlVQVCgzKTsKREVDTEFSRV9JTlRFUlJVUFQoNCk7CkRFQ0xBUkVfSU5URVJSVVBUKDUpOwpERUNMQVJFX0lOVEVSUlVQVCg2KTsKREVDTEFSRV9JTlRFUlJVUFQoNyk7CkRFQ0xBUkVfSU5URVJSVVBUKDgpOwpERUNMQVJFX0lOVEVSUlVQVCg5KTsKREVDTEFSRV9JTlRFUlJVUFQoMTApOwpERUNMQVJFX0lOVEVSUlVQVCgxMSk7CkRFQ0xBUkVfSU5URVJSVVBUKDEyKTsKREVDTEFSRV9JTlRFUlJVUFQoMTMpOwpERUNMQVJFX0lOVEVSUlVQVCgxNCk7CkRFQ0xBUkVfSU5URVJSVVBUKDE1KTsKCnZvaWQgX19hdHRyaWJ1dGVfXyAoKHJlZ3Bhcm0oMCkpKSBkZWZhdWx0X2lzcih2b2lkKTsKYXNtICgiZGVmYXVsdF9pc3I6IGlyZXRcbiIpOwoKdm9pZCBkaXNhYmxlX2lycShpbnQgaXJxKQp7CglpZiAoaXJxID49IE1BWF9JUlEpIHsKCQlyZXR1cm47Cgl9CglpcnFfdGFibGVbaXJxXS5zdGF0dXMgfD0gSVJRX0RJU0FCTEVEOwoKfQoKdm9pZCBlbmFibGVfaXJxKGludCBpcnEpCnsKCWlmIChpcnEgPj0gTUFYX0lSUSkgewoJCXJldHVybjsKCX0KCWlycV90YWJsZVtpcnFdLnN0YXR1cyAmPSB+SVJRX0RJU0FCTEVEOwp9CgovKiBtYXNrcyBvbmUgc3BlY2lmaWMgSVJRIGluIHRoZSBQSUMgKi8Kc3RhdGljIHZvaWQgdW5tYXNrX2lycShpbnQgaXJxKQp7CglpbnQgaW1yX3BvcnQ7CgoJaWYgKGlycSA+PSBNQVhfSVJRKSB7CgkJcmV0dXJuOwoJfQoJaWYgKGlycSA+IDcpIHsKCQlpbXJfcG9ydCA9IFNMQVZFX1BJQyArIElNUjsKCX0gZWxzZSB7CgkJaW1yX3BvcnQgPSBNQVNURVJfUElDICsgSU1SOwoJfQoKCW91dGIoaW5iKGltcl9wb3J0KSZ+KDE8PChpcnEmNykpLCBpbXJfcG9ydCk7Cn0KCgovKiB1bm1hc2tzIG9uZSBzcGVjaWZpYyBJUlEgaW4gdGhlIFBJQyAqLwpzdGF0aWMgdm9pZCBtYXNrX2lycShpbnQgaXJxKQp7CglpbnQgaW1yX3BvcnQ7CgoJaWYgKGlycSA+PSBNQVhfSVJRKSB7CgkJcmV0dXJuOwoJfQoJaWYgKGlycSA+IDcpIHsKCQlpbXJfcG9ydCA9IFNMQVZFX1BJQyArIElNUjsKCX0gZWxzZSB7CgkJaW1yX3BvcnQgPSBNQVNURVJfUElDICsgSU1SOwoJfQoKCW91dGIoaW5iKGltcl9wb3J0KXwoMTw8KGlycSY3KSksIGltcl9wb3J0KTsKfQoKCi8qIGlzc3VlIGEgU3BlY2lmaWMgRW5kIE9mIEludGVycnVwdCBpbnN0cnVjaXRvbiAqLwpzdGF0aWMgdm9pZCBzcGVjaWZpY19lb2koaW50IGlycSkKewoJLyogSWYgaXQgaXMgb24gdGhlIHNsYXZlIFBJQyB0aGlzIGhhdmUgdG8gYmUgcGVyZm9ybWVkIG9uCgkgKiBib3RoIHRoZSBtYXN0ZXIgYW5kIHRoZSBzbGF2ZSBQSUNzICovCglpZiAoaXJxID4gNykgewoJCW91dGIoT0NXMl9TRU9JfChpcnEmNyksIFNMQVZFX1BJQyArIE9DVzIpOwoJCWlycSA9IFNFT0lfSVIyOyAgICAgICAgICAgICAgIC8qIGFsc28gZG8gSVIyIG9uIG1hc3RlciAqLwoJfQoJb3V0YihPQ1cyX1NFT0l8aXJxLCBNQVNURVJfUElDICsgT0NXMik7Cn0KCnZvaWQgX19hdHRyaWJ1dGVfXyAoKHJlZ3Bhcm0oMCkpKSBkb19pcnEoaW50IGlycSkKewoKCW1hc2tfaXJxKGlycSk7CgoJaWYgKGlycV90YWJsZVtpcnFdLnN0YXR1cyAmIElSUV9ESVNBQkxFRCkgewoJCXVubWFza19pcnEoaXJxKTsKCQlzcGVjaWZpY19lb2koaXJxKTsKCQlyZXR1cm47Cgl9CgoKCWlmIChOVUxMICE9IGlycV90YWJsZVtpcnFdLmhhbmRsZXIpIHsKCQlpcnFfaGFuZGxlcl90ICpoYW5kbGVyOwoJCWZvciAoaGFuZGxlciA9IGlycV90YWJsZVtpcnFdLmhhbmRsZXI7CgkJICAgICBOVUxMIT0gaGFuZGxlcjsgaGFuZGxlciA9IGhhbmRsZXItPm5leHQpIHsKCQkJaGFuZGxlci0+aXNyX2Z1bmMoaGFuZGxlci0+aXNyX2RhdGEpOwoJCX0KCX0gZWxzZSB7CgkJaWYgKChpcnEgJiA3KSAhPSA3KSB7CgkJCXByaW50ZigiU3B1cmlvdXMgaXJxICVkXG4iLCBpcnEpOwoJCX0KCX0KCXVubWFza19pcnEoaXJxKTsKCXNwZWNpZmljX2VvaShpcnEpOwp9CgoKdm9pZCBfX2F0dHJpYnV0ZV9fICgocmVncGFybSgwKSkpIHVua25vd25fZXhjZXB0aW9uX2VudHJ5KGludCBjYXVzZSwgaW50IGlwLCBpbnQgc2VnKQp7CglwcmludGYoIlVua25vd24gRXhjZXB0aW9uICVkIGF0ICUwNHg6JTA4eFxuIiwgY2F1c2UsIHNlZywgaXApOwp9Cgp2b2lkIF9fYXR0cmlidXRlX18gKChyZWdwYXJtKDApKSkgZGl2aWRlX2V4Y2VwdGlvbl9lbnRyeShpbnQgY2F1c2UsIGludCBpcCwgaW50IHNlZykKewoJcHJpbnRmKCJEaXZpZGUgRXJyb3IgKERpdmlzaW9uIGJ5IHplcm8pIGF0ICUwNHg6JTA4eFxuIiwgc2VnLCBpcCk7Cgl3aGlsZSgxKTsKfQoKdm9pZCBfX2F0dHJpYnV0ZV9fICgocmVncGFybSgwKSkpIGRlYnVnX2V4Y2VwdGlvbl9lbnRyeShpbnQgY2F1c2UsIGludCBpcCwgaW50IHNlZykKewoJcHJpbnRmKCJEZWJ1ZyBJbnRlcnJ1cHQgKFNpbmdsZSBzdGVwKSBhdCAlMDR4OiUwOHhcbiIsIHNlZywgaXApOwp9Cgp2b2lkIF9fYXR0cmlidXRlX18gKChyZWdwYXJtKDApKSkgbm1pX2VudHJ5KGludCBjYXVzZSwgaW50IGlwLCBpbnQgc2VnKQp7CglwcmludGYoIk5NSSBJbnRlcnJ1cHQgYXQgJTA0eDolMDh4XG4iLCBzZWcsIGlwKTsKfQoKdm9pZCBfX2F0dHJpYnV0ZV9fICgocmVncGFybSgwKSkpIGludmFsaWRfaW5zdHJ1Y3Rpb25fZW50cnkoaW50IGNhdXNlLCBpbnQgaXAsIGludCBzZWcpCnsKCXByaW50ZigiSW52YWxpZCBJbnN0cnVjdGlvbiBhdCAlMDR4OiUwOHhcbiIsIHNlZywgaXApOwoJd2hpbGUoMSk7Cn0KCnZvaWQgX19hdHRyaWJ1dGVfXyAoKHJlZ3Bhcm0oMCkpKSBkb3VibGVfZmF1bHRfZW50cnkoaW50IGNhdXNlLCBpbnQgaXAsIGludCBzZWcpCnsKCXByaW50ZigiRG91YmxlIGZhdWx0IGF0ICUwNHg6JTA4eFxuIiwgc2VnLCBpcCk7Cgl3aGlsZSgxKTsKfQoKdm9pZCBfX2F0dHJpYnV0ZV9fICgocmVncGFybSgwKSkpIGludmFsaWRfdHNzX2V4Y2VwdGlvbl9lbnRyeShpbnQgY2F1c2UsIGludCBpcCwgaW50IHNlZykKewoJcHJpbnRmKCJJbnZhbGlkIFRTUyBhdCAlMDR4OiUwOHhcbiIsIHNlZywgaXApOwp9Cgp2b2lkIF9fYXR0cmlidXRlX18gKChyZWdwYXJtKDApKSkgc2VnX2ZhdWx0X2VudHJ5KGludCBjYXVzZSwgaW50IGlwLCBpbnQgc2VnKQp7CglwcmludGYoIlNlZ21lbnRhdGlvbiBmYXVsdCBhdCAlMDR4OiUwOHhcbiIsIHNlZywgaXApOwoJd2hpbGUoMSk7Cn0KCnZvaWQgX19hdHRyaWJ1dGVfXyAoKHJlZ3Bhcm0oMCkpKSBzdGFja19mYXVsdF9lbnRyeShpbnQgY2F1c2UsIGludCBpcCwgaW50IHNlZykKewoJcHJpbnRmKCJTdGFjayBmYXVsdCBhdCAlMDR4OiUwOHhcbiIsIHNlZywgaXApOwoJd2hpbGUoMSk7Cn0KCnZvaWQgX19hdHRyaWJ1dGVfXyAoKHJlZ3Bhcm0oMCkpKSBncGZfZW50cnkoaW50IGNhdXNlLCBpbnQgaXAsIGludCBzZWcpCnsKCXByaW50ZigiR2VuZXJhbCBwcm90ZWN0aW9uIGZhdWx0IGF0ICUwNHg6JTA4eFxuIiwgc2VnLCBpcCk7Cn0KCnZvaWQgX19hdHRyaWJ1dGVfXyAoKHJlZ3Bhcm0oMCkpKSBwYWdlX2ZhdWx0X2VudHJ5KGludCBjYXVzZSwgaW50IGlwLCBpbnQgc2VnKQp7CglwcmludGYoIlBhZ2UgZmF1bHQgYXQgJTA0eDolMDh4XG4iLCBzZWcsIGlwKTsKCXdoaWxlKDEpOwp9Cgp2b2lkIF9fYXR0cmlidXRlX18gKChyZWdwYXJtKDApKSkgZnBfZXhjZXB0aW9uX2VudHJ5KGludCBjYXVzZSwgaW50IGlwLCBpbnQgc2VnKQp7CglwcmludGYoIkZsb2F0aW5nIHBvaW50IGV4Y2VwdGlvbiBhdCAlMDR4OiUwOHhcbiIsIHNlZywgaXApOwp9Cgp2b2lkIF9fYXR0cmlidXRlX18gKChyZWdwYXJtKDApKSkgYWxpZ25tZW50X2NoZWNrX2VudHJ5KGludCBjYXVzZSwgaW50IGlwLCBpbnQgc2VnKQp7CglwcmludGYoIkFsaWdubWVudCBjaGVjayBhdCAlMDR4OiUwOHhcbiIsIHNlZywgaXApOwp9Cgp2b2lkIF9fYXR0cmlidXRlX18gKChyZWdwYXJtKDApKSkgbWFjaGluZV9jaGVja19lbnRyeShpbnQgY2F1c2UsIGludCBpcCwgaW50IHNlZykKewoJcHJpbnRmKCJNYWNoaW5lIGNoZWNrIGV4Y2VwdGlvbiBhdCAlMDR4OiUwOHhcbiIsIHNlZywgaXApOwp9CgoKdm9pZCBpcnFfaW5zdGFsbF9oYW5kbGVyKGludCBpbm8sIGludGVycnVwdF9oYW5kbGVyX3QgKmZ1bmMsIHZvaWQgKnBkYXRhKQp7CglpbnQgc3RhdHVzOwoKCWlmIChpbm8+TUFYX0lSUSkgewoJCXJldHVybjsKCX0KCglpZiAoTlVMTCAhPSBpcnFfdGFibGVbaW5vXS5oYW5kbGVyKSB7CgkJcmV0dXJuOwoJfQoKCXN0YXR1cyA9IGRpc2FibGVfaW50ZXJydXB0cygpOwoJaXJxX3RhYmxlW2lub10uaGFuZGxlciA9IG1hbGxvYyhzaXplb2YoaXJxX2hhbmRsZXJfdCkpOwoJaWYgKE5VTEwgPT0gaXJxX3RhYmxlW2lub10uaGFuZGxlcikgewoJCXJldHVybjsKCX0KCgltZW1zZXQoaXJxX3RhYmxlW2lub10uaGFuZGxlciwgMCwgc2l6ZW9mKGlycV9oYW5kbGVyX3QpKTsKCglpcnFfdGFibGVbaW5vXS5oYW5kbGVyLT5pc3JfZnVuYyA9IGZ1bmM7CglpcnFfdGFibGVbaW5vXS5oYW5kbGVyLT5pc3JfZGF0YSA9IHBkYXRhOwoJaWYgKHN0YXR1cykgewoJCWVuYWJsZV9pbnRlcnJ1cHRzKCk7Cgl9CgoJdW5tYXNrX2lycShpbm8pOwoKCXJldHVybjsKfQoKdm9pZCBpcnFfZnJlZV9oYW5kbGVyKGludCBpbm8pCnsKCWludCBzdGF0dXM7CglpZiAoaW5vPk1BWF9JUlEpIHsKCQlyZXR1cm47Cgl9CgoJc3RhdHVzID0gZGlzYWJsZV9pbnRlcnJ1cHRzKCk7CgltYXNrX2lycShpbm8pOwoJaWYgKE5VTEwgPT0gaXJxX3RhYmxlW2lub10uaGFuZGxlcikgewoJCXJldHVybjsKCX0KCWZyZWUoaXJxX3RhYmxlW2lub10uaGFuZGxlcik7CglpcnFfdGFibGVbaW5vXS5oYW5kbGVyPU5VTEw7CglpZiAoc3RhdHVzKSB7CgkJZW5hYmxlX2ludGVycnVwdHMoKTsKCX0KCXJldHVybjsKfQoKCmFzbSAoImlkdF9wdHI6XG4iCgkiLndvcmQJMHg4MDBcbiIgLyogc2l6ZSBvZiB0aGUgdGFibGUgOCoyNTYgYnl0ZXMgKi8KCSIubG9uZwlpZHRcbiIJIC8qIG9mZnNldCAqLwoJIi53b3JkCTB4MThcbiIpOy8qIGRhdGEgc2VnbWVudCAqLwoKdm9pZCBzZXRfdmVjdG9yKGludCBpbnRudW0sIHZvaWQgKnJvdXRpbmUpCnsKCWlkdFtpbnRudW1dLmJhc2VfaGlnaCA9ICh1MTYpKCh1MzIpKHJvdXRpbmUpPj4xNik7CglpZHRbaW50bnVtXS5iYXNlX2xvdyA9ICh1MTYpKCh1MzIpKHJvdXRpbmUpJjB4ZmZmZik7Cn0KCgppbnQgaW50ZXJydXB0X2luaXQodm9pZCkKewoJaW50IGk7CgoJLyogSnVzdCBpbiBjYXNlLi4uICovCglkaXNhYmxlX2ludGVycnVwdHMoKTsKCgkvKiBJbml0aWFsaXplIHRoZSBJRFQgYW5kIHN0dWZmICovCgoKCW1lbXNldChpcnFfdGFibGUsIDAsIHNpemVvZihpcnFfdGFibGUpKTsKCgkvKiBTZXR1cCB0aGUgSURUICovCglmb3IgKGk9MDtpPDI1NjtpKyspIHsKCQlpZHRbaV0uYWNjZXNzID0gMHg4ZTsKCQlpZHRbaV0ucmVzID0gMDsKCQlpZHRbaV0uc2VsZWN0b3IgPSAweDEwOwoJCXNldF92ZWN0b3IoaSwgZGVmYXVsdF9pc3IpOwoJfQoKCWFzbSAoImNzIGxpZHQgaWR0X3B0clxuIik7CgoJLyogU2V0dXAgZXhjZXB0aW9ucyAqLwoJc2V0X3ZlY3RvcigweDAwLCBleHBfMCk7CglzZXRfdmVjdG9yKDB4MDEsIGV4cF8xKTsKCXNldF92ZWN0b3IoMHgwMiwgZXhwXzIpOwoJc2V0X3ZlY3RvcigweDAzLCBleHBfMyk7CglzZXRfdmVjdG9yKDB4MDQsIGV4cF80KTsKCXNldF92ZWN0b3IoMHgwNSwgZXhwXzUpOwoJc2V0X3ZlY3RvcigweDA2LCBleHBfNik7CglzZXRfdmVjdG9yKDB4MDcsIGV4cF83KTsKCXNldF92ZWN0b3IoMHgwOCwgZXhwXzgpOwoJc2V0X3ZlY3RvcigweDA5LCBleHBfOSk7CglzZXRfdmVjdG9yKDB4MGEsIGV4cF8xMCk7CglzZXRfdmVjdG9yKDB4MGIsIGV4cF8xMSk7CglzZXRfdmVjdG9yKDB4MGMsIGV4cF8xMik7CglzZXRfdmVjdG9yKDB4MGQsIGV4cF8xMyk7CglzZXRfdmVjdG9yKDB4MGUsIGV4cF8xNCk7CglzZXRfdmVjdG9yKDB4MGYsIGV4cF8xNSk7CglzZXRfdmVjdG9yKDB4MTAsIGV4cF8xNik7CglzZXRfdmVjdG9yKDB4MTEsIGV4cF8xNyk7CglzZXRfdmVjdG9yKDB4MTIsIGV4cF8xOCk7CglzZXRfdmVjdG9yKDB4MTMsIGV4cF8xOSk7CglzZXRfdmVjdG9yKDB4MTQsIGV4cF8yMCk7CglzZXRfdmVjdG9yKDB4MTUsIGV4cF8yMSk7CglzZXRfdmVjdG9yKDB4MTYsIGV4cF8yMik7CglzZXRfdmVjdG9yKDB4MTcsIGV4cF8yMyk7CglzZXRfdmVjdG9yKDB4MTgsIGV4cF8yNCk7CglzZXRfdmVjdG9yKDB4MTksIGV4cF8yNSk7CglzZXRfdmVjdG9yKDB4MWEsIGV4cF8yNik7CglzZXRfdmVjdG9yKDB4MWIsIGV4cF8yNyk7CglzZXRfdmVjdG9yKDB4MWMsIGV4cF8yOCk7CglzZXRfdmVjdG9yKDB4MWQsIGV4cF8yOSk7CglzZXRfdmVjdG9yKDB4MWUsIGV4cF8zMCk7CglzZXRfdmVjdG9yKDB4MWYsIGV4cF8zMSk7CgoKCS8qIFNldHVwIGludGVycnVwdHMgKi8KCXNldF92ZWN0b3IoMHgyMCwgaXJxXzApOwoJc2V0X3ZlY3RvcigweDIxLCBpcnFfMSk7CglzZXRfdmVjdG9yKDB4MjMsIGlycV8zKTsKCXNldF92ZWN0b3IoMHgyNCwgaXJxXzQpOwoJc2V0X3ZlY3RvcigweDI1LCBpcnFfNSk7CglzZXRfdmVjdG9yKDB4MjYsIGlycV82KTsKCXNldF92ZWN0b3IoMHgyNywgaXJxXzcpOwoJc2V0X3ZlY3RvcigweDI4LCBpcnFfOCk7CglzZXRfdmVjdG9yKDB4MjksIGlycV85KTsKCXNldF92ZWN0b3IoMHgyYSwgaXJxXzEwKTsKCXNldF92ZWN0b3IoMHgyYiwgaXJxXzExKTsKCXNldF92ZWN0b3IoMHgyYywgaXJxXzEyKTsKCXNldF92ZWN0b3IoMHgyZCwgaXJxXzEzKTsKCXNldF92ZWN0b3IoMHgyZSwgaXJxXzE0KTsKCXNldF92ZWN0b3IoMHgyZiwgaXJxXzE1KTsKCS8qIHZlY3RvcnMgMHgzMC0weDNmIGFyZSByZXNlcnZlZCBmb3IgaXJxIDE2LTMxICovCgoKCS8qIE1hc2sgYWxsIGludGVycnVwdHMgKi8KCW91dGIoMHhmZiwgTUFTVEVSX1BJQyArIElNUik7CglvdXRiKDB4ZmYsIFNMQVZFX1BJQyArIElNUik7CgoJLyogTWFzdGVyIFBJQyAqLwoJb3V0YihJQ1cxX1NFTHxJQ1cxX0VJQ1c0LCBNQVNURVJfUElDICsgSUNXMSk7CglvdXRiKDB4MjAsIE1BU1RFUl9QSUMgKyBJQ1cyKTsgICAgICAgICAgLyogUGxhY2UgbWFzdGVyIFBJQyBpbnRlcnJ1cHRzIGF0IElOVDIwICovCglvdXRiKElSMiwgTUFTVEVSX1BJQyArIElDVzMpOwkJLyogSUNXMywgT25lIHNsZXZjIFBJQyBpcyBwcmVzZW50ICovCglvdXRiKElDVzRfUE0sIE1BU1RFUl9QSUMgKyBJQ1c0KTsKCglmb3IgKGk9MDtpPDg7aSsrKSB7CgkJb3V0YihPQ1cyX1NFT0l8aSwgTUFTVEVSX1BJQyArIE9DVzIpOwoJfQoKCS8qIFNsYXZlIFBJQyAqLwoJb3V0YihJQ1cxX1NFTHxJQ1cxX0VJQ1c0LCBTTEFWRV9QSUMgKyBJQ1cxKTsKCW91dGIoMHgyOCwgU0xBVkVfUElDICsgSUNXMik7CSAgICAgICAgLyogUGxhY2Ugc2xhdmUgUElDIGludGVycnVwdHMgYXQgSU5UMjggKi8KCW91dGIoMHgwMiwgU0xBVkVfUElDICsgSUNXMyk7CQkvKiBTbGF2ZSBJRCAqLwoJb3V0YihJQ1c0X1BNLCBTTEFWRV9QSUMgKyBJQ1c0KTsKCglmb3IgKGk9MDtpPDg7aSsrKSB7CgkJb3V0YihPQ1cyX1NFT0l8aSwgU0xBVkVfUElDICsgT0NXMik7Cgl9CgoKCS8qIGVuYWJsZSBjYXNjYWRlIGludGVycmVydXB0ICovCglvdXRiKDB4ZmIsIE1BU1RFUl9QSUMgKyBJTVIpOwoJb3V0YigweGZmLCBTTEFWRV9QSUMgKyBJTVIpOwoKCS8qIEl0IGlzIG5vdyBzYWZlIHRvIGVuYWJsZSBpbnRlcnJ1cHRzICovCgllbmFibGVfaW50ZXJydXB0cygpOwoKCXJldHVybiAwOwp9Cgp2b2lkIGVuYWJsZV9pbnRlcnJ1cHRzKHZvaWQpCnsKCWFzbSgic3RpXG4iKTsKfQoKaW50IGRpc2FibGVfaW50ZXJydXB0cyh2b2lkKQp7Cglsb25nIGZsYWdzOwoKCWFzbSB2b2xhdGlsZSAoInB1c2hmbCA7IHBvcGwgJTAgOyBjbGlcbiIgOiAiPWciIChmbGFncykgOiApOwoKCXJldHVybiAoZmxhZ3MmMHgyMDApOyAvKiBJRSBmbGFncyBpcyBiaXQgOSAqLwp9Cg==