LyoKICogdjRsLXRlc3Q6IFRlc3QgZW52aXJvbm1lbnQgZm9yIFZpZGVvIEZvciBMaW51eCBUd28gQVBJCiAqCiAqICA1IE1heSAyMDA5ICAwLjEgIEZpcnN0IHJlbGVhc2UKICoKICogV3JpdHRlbiBieSBN4XJ0b24gTultZXRoIDxubTEyN0BmcmVlbWFpbC5odT4KICogUmVsZWFzZWQgdW5kZXIgR1BMCiAqLwoKI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CiNpbmNsdWRlIDxmY250bC5oPgojaW5jbHVkZSA8dW5pc3RkLmg+CiNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KI2luY2x1ZGUgPGVycm5vLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KCiNpbmNsdWRlIDxsaW51eC92aWRlb2RldjIuaD4KI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CgojaW5jbHVkZSA8Q1VuaXQvQ1VuaXQuaD4KCiNpbmNsdWRlICJ2NGwyX3Rlc3QuaCIKI2luY2x1ZGUgInY0bDJfc2hvdy5oIgojaW5jbHVkZSAiZGV2X3ZpZGVvLmgiCiNpbmNsdWRlICJ2aWRlb19saW1pdHMuaCIKCiNpbmNsdWRlICJ0ZXN0X1ZJRElPQ19SRVFCVUZTLmgiCgpzdGF0aWMgdm9pZCBkb19WSURJT0NfUVVFUllCVUYoZW51bSB2NGwyX21lbW9yeSBtZW1vcnksCgkJZW51bSB2NGwyX2J1Zl90eXBlIHR5cGUsIF9fdTMyIGNvdW50LCBpbnQgZXhwZWN0ZWRfcmV0X3JlcSkgewoJaW50IHJldF9yZXEsIGVycm5vX3JlcTsKCWludCByZXRfcXVlcnksIGVycm5vX3F1ZXJ5OwoJc3RydWN0IHY0bDJfcmVxdWVzdGJ1ZmZlcnMgcmVxYnVmOwoJc3RydWN0IHY0bDJfYnVmZmVyIGJ1ZjsKCV9fdTMyIGk7Cgl1bnNpZ25lZCBpbnQgajsKCWNvbnN0IGVudW0gdjRsMl9idWZfdHlwZSBidWZmZXJfdHlwZXNbXSA9IHsKCQkwLAoJCVY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSwKCQlWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVCwKCQlWNEwyX0JVRl9UWVBFX1ZJREVPX09WRVJMQVksCgkJVjRMMl9CVUZfVFlQRV9WQklfQ0FQVFVSRSwKCQlWNEwyX0JVRl9UWVBFX1ZCSV9PVVRQVVQsCgkJVjRMMl9CVUZfVFlQRV9TTElDRURfVkJJX0NBUFRVUkUsCgkJVjRMMl9CVUZfVFlQRV9TTElDRURfVkJJX09VVFBVVCwKCQlWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVF9PVkVSTEFZLAoJCVY0TDJfQlVGX1RZUEVfUFJJVkFURS0xLAoJCVY0TDJfQlVGX1RZUEVfUFJJVkFURSwKCQlWNEwyX0JVRl9UWVBFX1BSSVZBVEUrMSwKCQlTMzJfTUFYLAoJCShfX3MzMikoKF9fdTMyKVMzMl9NQVgrMSksCgkJVTMyX01BWC0xLAoJCVUzMl9NQVgKCX07CgoJbWVtc2V0KCZyZXFidWYsIDAsIHNpemVvZihyZXFidWYpKTsKCXJlcWJ1Zi5jb3VudCA9IGNvdW50OwoJcmVxYnVmLnR5cGUgPSB0eXBlOwoJcmVxYnVmLm1lbW9yeSA9IG1lbW9yeTsKCglyZXRfcmVxID0gaW9jdGwoZ2V0X3ZpZGVvX2ZkKCksIFZJRElPQ19SRVFCVUZTLCAmcmVxYnVmKTsKCWVycm5vX3JlcSA9IGVycm5vOwoKCWlmIChleHBlY3RlZF9yZXRfcmVxID09IDApIHsKCQlDVV9BU1NFUlRfRVFVQUwocmV0X3JlcSwgMCk7Cgl9IGVsc2UgewoJCUNVX0FTU0VSVF9FUVVBTChyZXRfcmVxLCAtMSk7CgkJQ1VfQVNTRVJUX0VRVUFMKGVycm5vX3JlcSwgRUlOVkFMKTsKCX0KCglkcHJpbnRmKCJcdCVzOiV1OiBWSURJT0NfUkVRQlVGLCBjb3VudD0ldSwgdHlwZT0laSwgbWVtb3J5PSVpLCByZXRfcmVxPSVpLCBlcnJub19yZXE9JWlcbiIsCgkJX19GSUxFX18sIF9fTElORV9fLCBjb3VudCwgdHlwZSwgbWVtb3J5LCByZXRfcmVxLCBlcnJub19yZXEpOwoKCWlmIChyZXRfcmVxID09IDApIHsKCQlzaG93X3Y0bDJfcmVxdWVzdGJ1ZmZlcnMoJnJlcWJ1Zik7Cgl9CgoJaWYgKHJldF9yZXEgIT0gMCkgewoJCXJlcWJ1Zi5jb3VudCA9IDA7Cgl9CgoJZm9yIChpID0gMDsgaSA8IHJlcWJ1Zi5jb3VudDsgaSsrKSB7CgkJbWVtc2V0KCZidWYsIDB4ZmYsIHNpemVvZihidWYpKTsKCQlidWYudHlwZSA9IHR5cGU7CgkJYnVmLmluZGV4ID0gaTsKCgkJcmV0X3F1ZXJ5ID0gaW9jdGwoZ2V0X3ZpZGVvX2ZkKCksIFZJRElPQ19RVUVSWUJVRiwgJmJ1Zik7CgkJZXJybm9fcXVlcnkgPSBlcnJubzsKCgkJQ1VfQVNTRVJUX0VRVUFMKGJ1Zi5pbmRleCwgaSk7CgkJQ1VfQVNTRVJUX0VRVUFMKGJ1Zi50eXBlLCB0eXBlKTsKCQkvL0NVX0FTU0VSVF9FUVVBTChidWYuYnl0ZXN1c2VkLCA/Pz8pOwoJCUNVX0FTU0VSVF9FUVVBTChidWYuZmxhZ3MgJiB+KFY0TDJfQlVGX0ZMQUdfTUFQUEVEIHwgVjRMMl9CVUZfRkxBR19RVUVVRUQgfCBWNEwyX0JVRl9GTEFHX0RPTkUpLCAwKTsKCQkvL0NVX0FTU0VSVF9FUVVBTChidWYuZmllbGQsID8/Pyk7CgkJLy9DVV9BU1NFUlRfRVFVQUwoYnVmLnRpbWVzdGFtcC50dl9zZWMsID8/Pyk7CgkJLy9DVV9BU1NFUlRfRVFVQUwoYnVmLnRpbWVzdGFtcC50dl91c2VjLCA/Pz8pOwoJCS8vQ1VfQVNTRVJUX0VRVUFMKGJ1Zi50aW1lY29kZS50eXBlLCA/Pz8pOwoJCS8vQ1VfQVNTRVJUX0VRVUFMKGJ1Zi50aW1lY29kZS5mbGFncywgPz8/KTsKCQkvL0NVX0FTU0VSVF9FUVVBTChidWYudGltZWNvZGUuZnJhbWVzLCA/Pz8pOwoJCS8vQ1VfQVNTRVJUX0VRVUFMKGJ1Zi50aW1lY29kZS5zZWNvbmRzLCA/Pz8pOwoJCS8vQ1VfQVNTRVJUX0VRVUFMKGJ1Zi50aW1lY29kZS5taW51dGVzLCA/Pz8pOwoJCS8vQ1VfQVNTRVJUX0VRVUFMKGJ1Zi50aW1lY29kZS5ob3VycywgPz8/KTsKCQkvL0NVX0FTU0VSVF9FUVVBTChidWYudGltZWNvZGUudXNlcmJpdHNbMF0sID8/Pyk7CgkJLy9DVV9BU1NFUlRfRVFVQUwoYnVmLnRpbWVjb2RlLnVzZXJiaXRzWzFdLCA/Pz8pOwoJCS8vQ1VfQVNTRVJUX0VRVUFMKGJ1Zi50aW1lY29kZS51c2VyYml0c1syXSwgPz8/KTsKCQkvL0NVX0FTU0VSVF9FUVVBTChidWYudGltZWNvZGUudXNlcmJpdHNbM10sID8/Pyk7CgkJLy9DVV9BU1NFUlRfRVFVQUwoYnVmLnNlcXVlbmNlLCA/Pz8pOwoJCUNVX0FTU0VSVF9FUVVBTChidWYubWVtb3J5LCBtZW1vcnkpOwoJCS8vQ1VfQVNTRVJUX0VRVUFMKGJ1Zi5tLnVzZXJwdHIsID8/Pyk7CgkJLy9DVV9BU1NFUlRfRVFVQUwoYnVmLm0ub2Zmc2V0LCA/Pz8pOwoJCUNVX0FTU0VSVCgwIDwgYnVmLmxlbmd0aCk7CgkJLy9DVV9BU1NFUlRfRVFVQUwoYnVmLmlucHV0LCA/Pz8pOwoJCUNVX0FTU0VSVF9FUVVBTChidWYucmVzZXJ2ZWQsIDApOwoKCQlkcHJpbnRmKCJcdCVzOiV1OiBWSURJT0NfUVVFUllCVUYsIHR5cGU9JWksIGluZGV4PSV1LCByZXRfcXVlcnk9JWksIGVycm5vX3F1ZXJ5PSVpXG4iLAoJCQlfX0ZJTEVfXywgX19MSU5FX18sIGJ1Zi50eXBlLCBidWYuaW5kZXgsIHJldF9xdWVyeSwgZXJybm9fcXVlcnkpOwoJCWlmIChyZXRfcXVlcnkgPT0gMCkKCQkJc2hvd192NGwyX2J1ZmZlcigmYnVmKTsKCgl9CgoJLyogQ2hlY2sgZm9yIG5vdCBidWZmZXIgdHlwZXMgd2hpY2ggZG8gbm90IG1hdGNoIHRoZSBWSURJT0NfUkVRQlVGCgkgKiBidWZmZXIgdHlwZQoJICovCglmb3IgKGkgPSAwOyBpIDwgcmVxYnVmLmNvdW50OyBpKyspIHsKCQlmb3IgKGogPSAwOyBqIDwgc2l6ZW9mKGJ1ZmZlcl90eXBlcykvc2l6ZW9mKCpidWZmZXJfdHlwZXMpOyBqKyspIHsKCQkJaWYgKGJ1ZmZlcl90eXBlc1tqXSAhPSB0eXBlKSB7CgkJCQltZW1zZXQoJmJ1ZiwgMHhmZiwgc2l6ZW9mKGJ1ZikpOwoJCQkJYnVmLnR5cGUgPSBidWZmZXJfdHlwZXNbal07CgkJCQlidWYuaW5kZXggPSBpOwoKCQkJCXJldF9xdWVyeSA9IGlvY3RsKGdldF92aWRlb19mZCgpLCBWSURJT0NfUVVFUllCVUYsICZidWYpOwoJCQkJZXJybm9fcXVlcnkgPSBlcnJubzsKCgkJCQlDVV9BU1NFUlRfRVFVQUwocmV0X3F1ZXJ5LCAtMSk7CgkJCQlDVV9BU1NFUlRfRVFVQUwoZXJybm9fcXVlcnksIEVJTlZBTCk7CgoJCQkJZHByaW50ZigiXHQlczoldTogVklESU9DX1FVRVJZQlVGLCB0eXBlPSVpLCBpbmRleD0ldSwgcmV0X3F1ZXJ5PSVpLCBlcnJub19xdWVyeT0laVxuIiwKCQkJCQlfX0ZJTEVfXywgX19MSU5FX18sIGJ1Zi50eXBlLCBidWYuaW5kZXgsIHJldF9xdWVyeSwgZXJybm9fcXVlcnkpOwoJCQkJaWYgKHJldF9xdWVyeSA9PSAwKQoJCQkJCXNob3dfdjRsMl9idWZmZXIoJmJ1Zik7CgkJCX0KCQl9Cgl9CgoJbWVtc2V0KCZidWYsIDB4ZmYsIHNpemVvZihidWYpKTsKCWJ1Zi50eXBlID0gdHlwZTsKCWJ1Zi5pbmRleCA9IHJlcWJ1Zi5jb3VudDsKCglyZXRfcXVlcnkgPSBpb2N0bChnZXRfdmlkZW9fZmQoKSwgVklESU9DX1FVRVJZQlVGLCAmYnVmKTsKCWVycm5vX3F1ZXJ5ID0gZXJybm87CgoJZHByaW50ZigiXHQlczoldTogVklESU9DX1FVRVJZQlVGLCB0eXBlPSVpLCBpbmRleD0ldSwgcmV0X3F1ZXJ5PSVpLCBlcnJub19xdWVyeT0laVxuIiwKCQlfX0ZJTEVfXywgX19MSU5FX18sIGJ1Zi50eXBlLCBidWYuaW5kZXgsIHJldF9xdWVyeSwgZXJybm9fcXVlcnkpOwoKCUNVX0FTU0VSVF9FUVVBTChyZXRfcXVlcnksIC0xKTsKCUNVX0FTU0VSVF9FUVVBTChlcnJub19xdWVyeSwgRUlOVkFMKTsKCglpZiAocmVxYnVmLmNvdW50IDwgKF9fdTMyKVMxNl9NSU4pIHsKCQltZW1zZXQoJmJ1ZiwgMHhmZiwgc2l6ZW9mKGJ1ZikpOwoJCWJ1Zi50eXBlID0gdHlwZTsKCQlidWYuaW5kZXggPSAoX191MzIpUzE2X01JTjsKCgkJcmV0X3F1ZXJ5ID0gaW9jdGwoZ2V0X3ZpZGVvX2ZkKCksIFZJRElPQ19RVUVSWUJVRiwgJmJ1Zik7CgkJZXJybm9fcXVlcnkgPSBlcnJubzsKCgkJZHByaW50ZigiXHQlczoldTogVklESU9DX1FVRVJZQlVGLCB0eXBlPSVpLCBpbmRleD0ldSwgcmV0X3F1ZXJ5PSVpLCBlcnJub19xdWVyeT0laVxuIiwKCQkJX19GSUxFX18sIF9fTElORV9fLCBidWYudHlwZSwgYnVmLmluZGV4LCByZXRfcXVlcnksIGVycm5vX3F1ZXJ5KTsKCgkJQ1VfQVNTRVJUX0VRVUFMKHJldF9xdWVyeSwgLTEpOwoJCUNVX0FTU0VSVF9FUVVBTChlcnJub19xdWVyeSwgRUlOVkFMKTsKCX0KCglpZiAocmVxYnVmLmNvdW50IDwgKF9fdTMyKVMxNl9NQVgpIHsKCQltZW1zZXQoJmJ1ZiwgMHhmZiwgc2l6ZW9mKGJ1ZikpOwoJCWJ1Zi50eXBlID0gdHlwZTsKCQlidWYuaW5kZXggPSAoX191MzIpUzE2X01BWDsKCgkJcmV0X3F1ZXJ5ID0gaW9jdGwoZ2V0X3ZpZGVvX2ZkKCksIFZJRElPQ19RVUVSWUJVRiwgJmJ1Zik7CgkJZXJybm9fcXVlcnkgPSBlcnJubzsKCgkJZHByaW50ZigiXHQlczoldTogVklESU9DX1FVRVJZQlVGLCB0eXBlPSVpLCBpbmRleD0ldSwgcmV0X3F1ZXJ5PSVpLCBlcnJub19xdWVyeT0laVxuIiwKCQkJX19GSUxFX18sIF9fTElORV9fLCBidWYudHlwZSwgYnVmLmluZGV4LCByZXRfcXVlcnksIGVycm5vX3F1ZXJ5KTsKCgkJQ1VfQVNTRVJUX0VRVUFMKHJldF9xdWVyeSwgLTEpOwoJCUNVX0FTU0VSVF9FUVVBTChlcnJub19xdWVyeSwgRUlOVkFMKTsKCX0KCglpZiAocmVxYnVmLmNvdW50IDwgVTMyX01BWCkgewoJCW1lbXNldCgmYnVmLCAweGZmLCBzaXplb2YoYnVmKSk7CgkJYnVmLnR5cGUgPSB0eXBlOwoJCWJ1Zi5pbmRleCA9IFUzMl9NQVg7CgoJCXJldF9xdWVyeSA9IGlvY3RsKGdldF92aWRlb19mZCgpLCBWSURJT0NfUVVFUllCVUYsICZidWYpOwoJCWVycm5vX3F1ZXJ5ID0gZXJybm87CgoJCWRwcmludGYoIlx0JXM6JXU6IFZJRElPQ19RVUVSWUJVRiwgdHlwZT0laSwgaW5kZXg9JXUsIHJldF9xdWVyeT0laSwgZXJybm9fcXVlcnk9JWlcbiIsCgkJCV9fRklMRV9fLCBfX0xJTkVfXywgYnVmLnR5cGUsIGJ1Zi5pbmRleCwgcmV0X3F1ZXJ5LCBlcnJub19xdWVyeSk7CgoJCUNVX0FTU0VSVF9FUVVBTChyZXRfcXVlcnksIC0xKTsKCQlDVV9BU1NFUlRfRVFVQUwoZXJybm9fcXVlcnksIEVJTlZBTCk7Cgl9CgoJbWVtc2V0KCZyZXFidWYsIDAsIHNpemVvZihyZXFidWYpKTsKCXJlcWJ1Zi5jb3VudCA9IDA7CglyZXFidWYudHlwZSA9IHR5cGU7CglyZXFidWYubWVtb3J5ID0gVjRMMl9NRU1PUllfTU1BUDsKCglyZXRfcmVxID0gaW9jdGwoZ2V0X3ZpZGVvX2ZkKCksIFZJRElPQ19SRVFCVUZTLCAmcmVxYnVmKTsKCWVycm5vX3JlcSA9IGVycm5vOwoKCWRwcmludGYoIlx0JXM6JXU6IFZJRElPQ19SRVFCVUYsIGNvdW50PSV1LCByZXRfcmVxPSVpLCBlcnJub19yZXE9JWlcbiIsCgkJX19GSUxFX18sIF9fTElORV9fLCBjb3VudCwgcmV0X3JlcSwgZXJybm9fcmVxKTsKCglpZiAoZXhwZWN0ZWRfcmV0X3JlcSA9PSAwKSB7CgkJQ1VfQVNTRVJUX0VRVUFMKHJldF9yZXEsIDApOwoJfSBlbHNlIHsKCQlDVV9BU1NFUlRfRVFVQUwocmV0X3JlcSwgLTEpOwoJCUNVX0FTU0VSVF9FUVVBTChlcnJub19yZXEsIEVJTlZBTCk7Cgl9CglpZiAocmV0X3JlcSA9PSAwKSB7CgkJc2hvd192NGwyX3JlcXVlc3RidWZmZXJzKCZyZXFidWYpOwoJfQp9Cgp2b2lkIHRlc3RfVklESU9DX1FVRVJZQlVGX2NhcHR1cmVfbW1hcCgpIHsKCWludCByZXRfY2FwLCBlcnJub19jYXA7CglzdHJ1Y3QgdjRsMl9jYXBhYmlsaXR5IGNhcDsKCWludCBleHBlY3RlZF9yZXRfcmVxOwoKCW1lbXNldCgmY2FwLCAwLCBzaXplb2YoY2FwKSk7CgoJcmV0X2NhcCA9IGlvY3RsKGdldF92aWRlb19mZCgpLCBWSURJT0NfUVVFUllDQVAsICZjYXApOwoJZXJybm9fY2FwID0gZXJybm87CgoJaWYgKHJldF9jYXAgPT0gMCAmJgoJICAgIChjYXAuY2FwYWJpbGl0aWVzICYgVjRMMl9DQVBfU1RSRUFNSU5HKSAmJgoJICAgIChjYXAuY2FwYWJpbGl0aWVzICYgVjRMMl9DQVBfVklERU9fQ0FQVFVSRSkpIHsKCQlleHBlY3RlZF9yZXRfcmVxID0gMDsKCX0gZWxzZSB7CgkJZXhwZWN0ZWRfcmV0X3JlcSA9IC0xOwoJfQoKCWRvX1ZJRElPQ19RVUVSWUJVRihWNEwyX01FTU9SWV9NTUFQLCBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUsIDAsIGV4cGVjdGVkX3JldF9yZXEpOwoJZG9fVklESU9DX1FVRVJZQlVGKFY0TDJfTUVNT1JZX01NQVAsIFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSwgMSwgZXhwZWN0ZWRfcmV0X3JlcSk7Cglkb19WSURJT0NfUVVFUllCVUYoVjRMMl9NRU1PUllfTU1BUCwgVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFLCAyLCBleHBlY3RlZF9yZXRfcmVxKTsKCWRvX1ZJRElPQ19RVUVSWUJVRihWNEwyX01FTU9SWV9NTUFQLCBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUsIDMsIGV4cGVjdGVkX3JldF9yZXEpOwoJZG9fVklESU9DX1FVRVJZQlVGKFY0TDJfTUVNT1JZX01NQVAsIFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSwgNCwgZXhwZWN0ZWRfcmV0X3JlcSk7Cglkb19WSURJT0NfUVVFUllCVUYoVjRMMl9NRU1PUllfTU1BUCwgVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFLCAoX191MzIpUzE2X01JTiwgZXhwZWN0ZWRfcmV0X3JlcSk7Cglkb19WSURJT0NfUVVFUllCVUYoVjRMMl9NRU1PUllfTU1BUCwgVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFLCAoX191MzIpUzE2X01BWCwgZXhwZWN0ZWRfcmV0X3JlcSk7Cglkb19WSURJT0NfUVVFUllCVUYoVjRMMl9NRU1PUllfTU1BUCwgVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFLCBVMzJfTUFYLCBleHBlY3RlZF9yZXRfcmVxKTsKfQoKdm9pZCB0ZXN0X1ZJRElPQ19RVUVSWUJVRl9jYXB0dXJlX3VzZXJwdHIoKSB7CglpbnQgcmV0X2NhcCwgZXJybm9fY2FwOwoJaW50IHJldF9yZXEsIGVycm5vX3JlcTsKCXN0cnVjdCB2NGwyX2NhcGFiaWxpdHkgY2FwOwoJc3RydWN0IHY0bDJfcmVxdWVzdGJ1ZmZlcnMgcmVxYnVmOwoJaW50IGV4cGVjdGVkX3JldF9yZXE7CgoJbWVtc2V0KCZjYXAsIDAsIHNpemVvZihjYXApKTsKCglyZXRfY2FwID0gaW9jdGwoZ2V0X3ZpZGVvX2ZkKCksIFZJRElPQ19RVUVSWUNBUCwgJmNhcCk7CgllcnJub19jYXAgPSBlcnJubzsKCgltZW1zZXQoJnJlcWJ1ZiwgMCwgc2l6ZW9mKHJlcWJ1ZikpOwoJcmVxYnVmLmNvdW50ID0gMjsKCXJlcWJ1Zi50eXBlID0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFOwoJcmVxYnVmLm1lbW9yeSA9IFY0TDJfTUVNT1JZX1VTRVJQVFI7CgoJcmV0X3JlcSA9IGlvY3RsKGdldF92aWRlb19mZCgpLCBWSURJT0NfUkVRQlVGUywgJnJlcWJ1Zik7CgllcnJub19yZXEgPSBlcnJubzsKCglkcHJpbnRmKCJcdCVzOiV1OiBWSURJT0NfUkVRQlVGLCBjb3VudD0ldSwgcmV0X3JlcT0laSwgZXJybm9fcmVxPSVpXG4iLAoJCV9fRklMRV9fLCBfX0xJTkVfXywgcmVxYnVmLmNvdW50LCByZXRfcmVxLCBlcnJub19yZXEpOwoKCWlmIChyZXRfY2FwID09IDAgJiYKCSAgICAoY2FwLmNhcGFiaWxpdGllcyAmIFY0TDJfQ0FQX1NUUkVBTUlORykgJiYKCSAgICAoY2FwLmNhcGFiaWxpdGllcyAmIFY0TDJfQ0FQX1ZJREVPX0NBUFRVUkUpICYmCgkgICAgcmV0X3JlcSA9PSAwKSB7CgkJZXhwZWN0ZWRfcmV0X3JlcSA9IDA7Cgl9IGVsc2UgewoJCWV4cGVjdGVkX3JldF9yZXEgPSAtMTsKCX0KCglkb19WSURJT0NfUVVFUllCVUYoVjRMMl9NRU1PUllfVVNFUlBUUiwgVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFLCAwLCBleHBlY3RlZF9yZXRfcmVxKTsKCWRvX1ZJRElPQ19RVUVSWUJVRihWNEwyX01FTU9SWV9VU0VSUFRSLCBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUsIDEsIGV4cGVjdGVkX3JldF9yZXEpOwoJZG9fVklESU9DX1FVRVJZQlVGKFY0TDJfTUVNT1JZX1VTRVJQVFIsIFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSwgMiwgZXhwZWN0ZWRfcmV0X3JlcSk7Cglkb19WSURJT0NfUVVFUllCVUYoVjRMMl9NRU1PUllfVVNFUlBUUiwgVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFLCAzLCBleHBlY3RlZF9yZXRfcmVxKTsKCWRvX1ZJRElPQ19RVUVSWUJVRihWNEwyX01FTU9SWV9VU0VSUFRSLCBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUsIDQsIGV4cGVjdGVkX3JldF9yZXEpOwoJZG9fVklESU9DX1FVRVJZQlVGKFY0TDJfTUVNT1JZX1VTRVJQVFIsIFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSwgKF9fdTMyKVMxNl9NSU4sIGV4cGVjdGVkX3JldF9yZXEpOwoJZG9fVklESU9DX1FVRVJZQlVGKFY0TDJfTUVNT1JZX1VTRVJQVFIsIFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSwgKF9fdTMyKVMxNl9NQVgsIGV4cGVjdGVkX3JldF9yZXEpOwoJZG9fVklESU9DX1FVRVJZQlVGKFY0TDJfTUVNT1JZX1VTRVJQVFIsIFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSwgVTMyX01BWCwgZXhwZWN0ZWRfcmV0X3JlcSk7Cglkb19WSURJT0NfUVVFUllCVUYoVjRMMl9NRU1PUllfVVNFUlBUUiwgVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFLCAwLCBleHBlY3RlZF9yZXRfcmVxKTsKfQoKdm9pZCB0ZXN0X1ZJRElPQ19RVUVSWUJVRl9vdXRwdXRfbW1hcCgpIHsKCWludCByZXRfY2FwLCBlcnJub19jYXA7CglzdHJ1Y3QgdjRsMl9jYXBhYmlsaXR5IGNhcDsKCWludCBleHBlY3RlZF9yZXRfcmVxOwoKCW1lbXNldCgmY2FwLCAwLCBzaXplb2YoY2FwKSk7CgoJcmV0X2NhcCA9IGlvY3RsKGdldF92aWRlb19mZCgpLCBWSURJT0NfUVVFUllDQVAsICZjYXApOwoJZXJybm9fY2FwID0gZXJybm87CgoJaWYgKHJldF9jYXAgPT0gMCAmJgoJICAgIChjYXAuY2FwYWJpbGl0aWVzICYgVjRMMl9DQVBfU1RSRUFNSU5HKSAmJgoJICAgIChjYXAuY2FwYWJpbGl0aWVzICYgVjRMMl9DQVBfVklERU9fT1VUUFVUKSkgewoJCWV4cGVjdGVkX3JldF9yZXEgPSAwOwoJfSBlbHNlIHsKCQlleHBlY3RlZF9yZXRfcmVxID0gLTE7Cgl9CgoJZG9fVklESU9DX1FVRVJZQlVGKFY0TDJfTUVNT1JZX01NQVAsIFY0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVULCAwLCBleHBlY3RlZF9yZXRfcmVxKTsKCWRvX1ZJRElPQ19RVUVSWUJVRihWNEwyX01FTU9SWV9NTUFQLCBWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVCwgMSwgZXhwZWN0ZWRfcmV0X3JlcSk7Cglkb19WSURJT0NfUVVFUllCVUYoVjRMMl9NRU1PUllfTU1BUCwgVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVQsIDIsIGV4cGVjdGVkX3JldF9yZXEpOwoJZG9fVklESU9DX1FVRVJZQlVGKFY0TDJfTUVNT1JZX01NQVAsIFY0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVULCAzLCBleHBlY3RlZF9yZXRfcmVxKTsKCWRvX1ZJRElPQ19RVUVSWUJVRihWNEwyX01FTU9SWV9NTUFQLCBWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVCwgNCwgZXhwZWN0ZWRfcmV0X3JlcSk7Cglkb19WSURJT0NfUVVFUllCVUYoVjRMMl9NRU1PUllfTU1BUCwgVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVQsIChfX3UzMilTMTZfTUlOLCBleHBlY3RlZF9yZXRfcmVxKTsKCWRvX1ZJRElPQ19RVUVSWUJVRihWNEwyX01FTU9SWV9NTUFQLCBWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVCwgKF9fdTMyKVMxNl9NQVgsIGV4cGVjdGVkX3JldF9yZXEpOwoJZG9fVklESU9DX1FVRVJZQlVGKFY0TDJfTUVNT1JZX01NQVAsIFY0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVULCBVMzJfTUFYLCBleHBlY3RlZF9yZXRfcmVxKTsKCWRvX1ZJRElPQ19RVUVSWUJVRihWNEwyX01FTU9SWV9NTUFQLCBWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVCwgMCwgZXhwZWN0ZWRfcmV0X3JlcSk7Cn0KCnZvaWQgdGVzdF9WSURJT0NfUVVFUllCVUZfb3V0cHV0X3VzZXJwdHIoKSB7CglpbnQgcmV0X2NhcCwgZXJybm9fY2FwOwoJaW50IHJldF9yZXEsIGVycm5vX3JlcTsKCXN0cnVjdCB2NGwyX2NhcGFiaWxpdHkgY2FwOwoJc3RydWN0IHY0bDJfcmVxdWVzdGJ1ZmZlcnMgcmVxYnVmOwoJaW50IGV4cGVjdGVkX3JldF9yZXE7CgoJbWVtc2V0KCZjYXAsIDAsIHNpemVvZihjYXApKTsKCglyZXRfY2FwID0gaW9jdGwoZ2V0X3ZpZGVvX2ZkKCksIFZJRElPQ19RVUVSWUNBUCwgJmNhcCk7CgllcnJub19jYXAgPSBlcnJubzsKCgltZW1zZXQoJnJlcWJ1ZiwgMCwgc2l6ZW9mKHJlcWJ1ZikpOwoJcmVxYnVmLmNvdW50ID0gMjsKCXJlcWJ1Zi50eXBlID0gVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVQ7CglyZXFidWYubWVtb3J5ID0gVjRMMl9NRU1PUllfVVNFUlBUUjsKCglyZXRfcmVxID0gaW9jdGwoZ2V0X3ZpZGVvX2ZkKCksIFZJRElPQ19SRVFCVUZTLCAmcmVxYnVmKTsKCWVycm5vX3JlcSA9IGVycm5vOwoKCWRwcmludGYoIlx0JXM6JXU6IFZJRElPQ19SRVFCVUYsIGNvdW50PSV1LCByZXRfcmVxPSVpLCBlcnJub19yZXE9JWlcbiIsCgkJX19GSUxFX18sIF9fTElORV9fLCByZXFidWYuY291bnQsIHJldF9yZXEsIGVycm5vX3JlcSk7CgoJaWYgKHJldF9jYXAgPT0gMCAmJgoJICAgIChjYXAuY2FwYWJpbGl0aWVzICYgVjRMMl9DQVBfU1RSRUFNSU5HKSAmJgoJICAgIChjYXAuY2FwYWJpbGl0aWVzICYgVjRMMl9DQVBfVklERU9fT1VUUFVUKSAmJgoJICAgIHJldF9yZXEgPT0gMCkgewoJCWV4cGVjdGVkX3JldF9yZXEgPSAwOwoJfSBlbHNlIHsKCQlleHBlY3RlZF9yZXRfcmVxID0gLTE7Cgl9CgoJZG9fVklESU9DX1FVRVJZQlVGKFY0TDJfTUVNT1JZX1VTRVJQVFIsIFY0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVULCAwLCBleHBlY3RlZF9yZXRfcmVxKTsKCWRvX1ZJRElPQ19RVUVSWUJVRihWNEwyX01FTU9SWV9VU0VSUFRSLCBWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVCwgMSwgZXhwZWN0ZWRfcmV0X3JlcSk7Cglkb19WSURJT0NfUVVFUllCVUYoVjRMMl9NRU1PUllfVVNFUlBUUiwgVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVQsIDIsIGV4cGVjdGVkX3JldF9yZXEpOwoJZG9fVklESU9DX1FVRVJZQlVGKFY0TDJfTUVNT1JZX1VTRVJQVFIsIFY0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVULCAzLCBleHBlY3RlZF9yZXRfcmVxKTsKCWRvX1ZJRElPQ19RVUVSWUJVRihWNEwyX01FTU9SWV9VU0VSUFRSLCBWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVCwgNCwgZXhwZWN0ZWRfcmV0X3JlcSk7Cglkb19WSURJT0NfUVVFUllCVUYoVjRMMl9NRU1PUllfVVNFUlBUUiwgVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVQsIChfX3UzMilTMTZfTUlOLCBleHBlY3RlZF9yZXRfcmVxKTsKCWRvX1ZJRElPQ19RVUVSWUJVRihWNEwyX01FTU9SWV9VU0VSUFRSLCBWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVCwgKF9fdTMyKVMxNl9NQVgsIGV4cGVjdGVkX3JldF9yZXEpOwoJZG9fVklESU9DX1FVRVJZQlVGKFY0TDJfTUVNT1JZX1VTRVJQVFIsIFY0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVULCBVMzJfTUFYLCBleHBlY3RlZF9yZXRfcmVxKTsKCWRvX1ZJRElPQ19RVUVSWUJVRihWNEwyX01FTU9SWV9VU0VSUFRSLCBWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVCwgMCwgZXhwZWN0ZWRfcmV0X3JlcSk7Cn0KCnZvaWQgdGVzdF9WSURJT0NfUVVFUllCVUZfb3ZlcmxheV9jYXB0dXJlKCkgewoJZG9fVklESU9DX1FVRVJZQlVGKFY0TDJfTUVNT1JZX09WRVJMQVksIFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSwgMiwgLTEpOwp9Cgp2b2lkIHRlc3RfVklESU9DX1FVRVJZQlVGX292ZXJsYXlfb3V0cHV0KCkgewoJZG9fVklESU9DX1FVRVJZQlVGKFY0TDJfTUVNT1JZX09WRVJMQVksIFY0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVULCAyLCAtMSk7Cn0KCnZvaWQgdGVzdF9WSURJT0NfUVVFUllCVUZfaW52YWxpZF9tZW1vcnlfY2FwdHVyZSgpIHsKCWRvX1ZJRElPQ19RVUVSWUJVRihTSU5UX01JTiwgVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFLCAyLCAtMSk7Cglkb19WSURJT0NfUVVFUllCVUYoMCwgVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFLCAyLCAtMSk7Cglkb19WSURJT0NfUVVFUllCVUYoVjRMMl9NRU1PUllfT1ZFUkxBWSsxLCBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUsIDIsIC0xKTsKCWRvX1ZJRElPQ19RVUVSWUJVRihTSU5UX01BWCwgVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFLCAyLCAtMSk7Cn0KCnZvaWQgdGVzdF9WSURJT0NfUVVFUllCVUZfaW52YWxpZF9tZW1vcnlfb3V0cHV0KCkgewoJZG9fVklESU9DX1FVRVJZQlVGKFNJTlRfTUlOLCBWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVCwgMiwgLTEpOwoJZG9fVklESU9DX1FVRVJZQlVGKDAsIFY0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVULCAyLCAtMSk7Cglkb19WSURJT0NfUVVFUllCVUYoVjRMMl9NRU1PUllfT1ZFUkxBWSsxLCBWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVCwgMiwgLTEpOwoJZG9fVklESU9DX1FVRVJZQlVGKFNJTlRfTUFYLCBWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVCwgMiwgLTEpOwp9Cgp2b2lkIHRlc3RfVklESU9DX1FVRVJZQlVGX2ludmFsaWRfdHlwZV9tbWFwKCkgewoJZG9fVklESU9DX1FVRVJZQlVGKFY0TDJfTUVNT1JZX01NQVAsIDAsIDIsIC0xKTsKCWRvX1ZJRElPQ19RVUVSWUJVRihWNEwyX01FTU9SWV9NTUFQLCBWNEwyX0JVRl9UWVBFX1ZJREVPX09WRVJMQVksIDIsIC0xKTsKCWRvX1ZJRElPQ19RVUVSWUJVRihWNEwyX01FTU9SWV9NTUFQLCBWNEwyX0JVRl9UWVBFX1ZCSV9DQVBUVVJFLCAyLCAtMSk7Cglkb19WSURJT0NfUVVFUllCVUYoVjRMMl9NRU1PUllfTU1BUCwgVjRMMl9CVUZfVFlQRV9WQklfT1VUUFVULCAyLCAtMSk7Cglkb19WSURJT0NfUVVFUllCVUYoVjRMMl9NRU1PUllfTU1BUCwgVjRMMl9CVUZfVFlQRV9TTElDRURfVkJJX0NBUFRVUkUsIDIsIC0xKTsKCWRvX1ZJRElPQ19RVUVSWUJVRihWNEwyX01FTU9SWV9NTUFQLCBWNEwyX0JVRl9UWVBFX1NMSUNFRF9WQklfT1VUUFVULCAyLCAtMSk7Cglkb19WSURJT0NfUVVFUllCVUYoVjRMMl9NRU1PUllfTU1BUCwgVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVRfT1ZFUkxBWSwgMiwgLTEpOwoJZG9fVklESU9DX1FVRVJZQlVGKFY0TDJfTUVNT1JZX01NQVAsIFY0TDJfQlVGX1RZUEVfUFJJVkFURS0xLCAyLCAtMSk7Cglkb19WSURJT0NfUVVFUllCVUYoVjRMMl9NRU1PUllfTU1BUCwgVjRMMl9CVUZfVFlQRV9QUklWQVRFLCAyLCAtMSk7Cglkb19WSURJT0NfUVVFUllCVUYoVjRMMl9NRU1PUllfTU1BUCwgVjRMMl9CVUZfVFlQRV9QUklWQVRFKzEsIDIsIC0xKTsKCWRvX1ZJRElPQ19RVUVSWUJVRihWNEwyX01FTU9SWV9NTUFQLCBTMzJfTUFYLCAyLCAtMSk7Cglkb19WSURJT0NfUVVFUllCVUYoVjRMMl9NRU1PUllfTU1BUCwgKF9fczMyKSgoX191MzIpUzMyX01BWCsxKSwgMiwgLTEpOwoJZG9fVklESU9DX1FVRVJZQlVGKFY0TDJfTUVNT1JZX01NQVAsIFUzMl9NQVgtMSwgMiwgLTEpOwoJZG9fVklESU9DX1FVRVJZQlVGKFY0TDJfTUVNT1JZX01NQVAsIFUzMl9NQVgsIDIsIC0xKTsKfQoKdm9pZCB0ZXN0X1ZJRElPQ19RVUVSWUJVRl9pbnZhbGlkX3R5cGVfdXNlcnB0cigpIHsKCWRvX1ZJRElPQ19RVUVSWUJVRihWNEwyX01FTU9SWV9VU0VSUFRSLCAwLCAyLCAtMSk7Cglkb19WSURJT0NfUVVFUllCVUYoVjRMMl9NRU1PUllfVVNFUlBUUiwgVjRMMl9CVUZfVFlQRV9WSURFT19PVkVSTEFZLCAyLCAtMSk7Cglkb19WSURJT0NfUVVFUllCVUYoVjRMMl9NRU1PUllfVVNFUlBUUiwgVjRMMl9CVUZfVFlQRV9WQklfQ0FQVFVSRSwgMiwgLTEpOwoJZG9fVklESU9DX1FVRVJZQlVGKFY0TDJfTUVNT1JZX1VTRVJQVFIsIFY0TDJfQlVGX1RZUEVfVkJJX09VVFBVVCwgMiwgLTEpOwoJZG9fVklESU9DX1FVRVJZQlVGKFY0TDJfTUVNT1JZX1VTRVJQVFIsIFY0TDJfQlVGX1RZUEVfU0xJQ0VEX1ZCSV9DQVBUVVJFLCAyLCAtMSk7Cglkb19WSURJT0NfUVVFUllCVUYoVjRMMl9NRU1PUllfVVNFUlBUUiwgVjRMMl9CVUZfVFlQRV9TTElDRURfVkJJX09VVFBVVCwgMiwgLTEpOwoJZG9fVklESU9DX1FVRVJZQlVGKFY0TDJfTUVNT1JZX1VTRVJQVFIsIFY0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVUX09WRVJMQVksIDIsIC0xKTsKCWRvX1ZJRElPQ19RVUVSWUJVRihWNEwyX01FTU9SWV9VU0VSUFRSLCBWNEwyX0JVRl9UWVBFX1BSSVZBVEUtMSwgMiwgLTEpOwoJZG9fVklESU9DX1FVRVJZQlVGKFY0TDJfTUVNT1JZX1VTRVJQVFIsIFY0TDJfQlVGX1RZUEVfUFJJVkFURSwgMiwgLTEpOwoJZG9fVklESU9DX1FVRVJZQlVGKFY0TDJfTUVNT1JZX1VTRVJQVFIsIFY0TDJfQlVGX1RZUEVfUFJJVkFURSsxLCAyLCAtMSk7Cglkb19WSURJT0NfUVVFUllCVUYoVjRMMl9NRU1PUllfVVNFUlBUUiwgUzMyX01BWCwgMiwgLTEpOwoJZG9fVklESU9DX1FVRVJZQlVGKFY0TDJfTUVNT1JZX1VTRVJQVFIsIChfX3MzMikoKF9fdTMyKVMzMl9NQVgrMSksIDIsIC0xKTsKCWRvX1ZJRElPQ19RVUVSWUJVRihWNEwyX01FTU9SWV9VU0VSUFRSLCBVMzJfTUFYLTEsIDIsIC0xKTsKCWRvX1ZJRElPQ19RVUVSWUJVRihWNEwyX01FTU9SWV9VU0VSUFRSLCBVMzJfTUFYLCAyLCAtMSk7Cn0K