Ly8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQovLyBQRk0gTG9hZGVyIGFuZCBXcml0ZXIKLy8KLy8gRGVzaWduIGFuZCBpbXBsZW1lbnRhdGlvbiBieQovLyAtIEhlcnbpIERyb2xvbiAoZHJvbG9uQGluZm9uaWUuZnIpCi8vCi8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZyZWVJbWFnZSAzCi8vCi8vIENPVkVSRUQgQ09ERSBJUyBQUk9WSURFRCBVTkRFUiBUSElTIExJQ0VOU0UgT04gQU4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5UWQovLyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1NFRCBPUiBJTVBMSUVELCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgV0FSUkFOVElFUwovLyBUSEFUIFRIRSBDT1ZFUkVEIENPREUgSVMgRlJFRSBPRiBERUZFQ1RTLCBNRVJDSEFOVEFCTEUsIEZJVCBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKLy8gT1IgTk9OLUlORlJJTkdJTkcuIFRIRSBFTlRJUkUgUklTSyBBUyBUTyBUSEUgUVVBTElUWSBBTkQgUEVSRk9STUFOQ0UgT0YgVEhFIENPVkVSRUQKLy8gQ09ERSBJUyBXSVRIIFlPVS4gU0hPVUxEIEFOWSBDT1ZFUkVEIENPREUgUFJPVkUgREVGRUNUSVZFIElOIEFOWSBSRVNQRUNULCBZT1UgKE5PVAovLyBUSEUgSU5JVElBTCBERVZFTE9QRVIgT1IgQU5ZIE9USEVSIENPTlRSSUJVVE9SKSBBU1NVTUUgVEhFIENPU1QgT0YgQU5ZIE5FQ0VTU0FSWQovLyBTRVJWSUNJTkcsIFJFUEFJUiBPUiBDT1JSRUNUSU9OLiBUSElTIERJU0NMQUlNRVIgT0YgV0FSUkFOVFkgQ09OU1RJVFVURVMgQU4gRVNTRU5USUFMCi8vIFBBUlQgT0YgVEhJUyBMSUNFTlNFLiBOTyBVU0UgT0YgQU5ZIENPVkVSRUQgQ09ERSBJUyBBVVRIT1JJWkVEIEhFUkVVTkRFUiBFWENFUFQgVU5ERVIKLy8gVEhJUyBESVNDTEFJTUVSLgovLwovLyBVc2UgYXQgeW91ciBvd24gcmlzayEKLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKI2luY2x1ZGUgIkZyZWVJbWFnZS5oIgojaW5jbHVkZSAiVXRpbGl0aWVzLmgiCgovLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci8vIEludGVybmFsIGZ1bmN0aW9ucwovLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgovKiogbWF4aW11bSBzaXplIG9mIGEgbGluZSBpbiB0aGUgaGVhZGVyICovCiNkZWZpbmUgUEZNX01BWExJTkUJMjU2CgovKiogQmlnIGVuZGlhbiAvIExpdHRsZSBlbmRpYW4gZmxvYXQgY29udmVyc2lvbiAqLwojZGVmaW5lIFJFVkVSU0VCWVRFUyhzb3VyY2UsIGRlc3QpCQlcCnsJCQkJCQkJCQkJXAoJY2hhciAqaiA9IChjaGFyICopIHNvdXJjZTsJCQlcCgljaGFyICpkaiA9IChjaGFyICopIGRlc3Q7CQkJXAoJZGpbMF0gPSBqWzNdOwkJCQkJCVwKCWRqWzFdID0galsyXTsJCQkJCQlcCglkalsyXSA9IGpbMV07CQkJCQkJXAoJZGpbM10gPSBqWzBdOwkJCQkJCVwKfQoKLyoqCkdldCBhIGxpbmUgZnJvbSBhIEFTQ0lJIGlvIHN0cmVhbQoqLwpzdGF0aWMgQk9PTCAKcGZtX2dldF9saW5lKEZyZWVJbWFnZUlPICppbywgZmlfaGFuZGxlIGhhbmRsZSwgY2hhciAqYnVmZmVyLCBpbnQgbGVuZ3RoKSB7CglpbnQgaTsKCW1lbXNldChidWZmZXIsIDAsIGxlbmd0aCk7Cglmb3IoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewoJCWlmKCFpby0+cmVhZF9wcm9jKCZidWZmZXJbaV0sIDEsIDEsIGhhbmRsZSkpCgkJCXJldHVybiBGQUxTRTsKCQlpZihidWZmZXJbaV0gPT0gMHgwQSkKCQkJYnJlYWs7Cgl9CgkKCXJldHVybiAoaSA8IGxlbmd0aCkgPyBUUlVFIDogRkFMU0U7Cn0KCi8qKgpHZXQgYW4gaW50ZWdlciB2YWx1ZSBmcm9tIHRoZSBhY3R1YWwgcG9zaXRpb24gcG9pbnRlZCBieSBoYW5kbGUKKi8Kc3RhdGljIGludApwZm1fZ2V0X2ludChGcmVlSW1hZ2VJTyAqaW8sIGZpX2hhbmRsZSBoYW5kbGUpIHsKICAgIGNoYXIgYyA9IDA7CglCT09MIGJGaXJzdENoYXI7CgogICAgLy8gc2tpcCBmb3J3YXJkIHRvIHN0YXJ0IG9mIG5leHQgbnVtYmVyCgoJaWYoIWlvLT5yZWFkX3Byb2MoJmMsIDEsIDEsIGhhbmRsZSkpIHsKCQl0aHJvdyBGSV9NU0dfRVJST1JfUEFSU0lORzsKCX0KCiAgICB3aGlsZSAoMSkgewogICAgICAgIC8vIGVhdCBjb21tZW50cwoKICAgICAgICBpZiAoYyA9PSAnIycpIHsKCQkJLy8gaWYgd2UncmUgYXQgYSBjb21tZW50LCByZWFkIHRvIGVuZCBvZiBsaW5lCgogICAgICAgICAgICBiRmlyc3RDaGFyID0gVFJVRTsKCiAgICAgICAgICAgIHdoaWxlICgxKSB7CgkJCQlpZighaW8tPnJlYWRfcHJvYygmYywgMSwgMSwgaGFuZGxlKSkgewoJCQkJCXRocm93IEZJX01TR19FUlJPUl9QQVJTSU5HOwoJCQkJfQoKCQkJCWlmIChiRmlyc3RDaGFyICYmIGMgPT0gJyAnKSB7CgkJCQkJLy8gbG9vcCBvZmYgMSBzcCBhZnRlciAjCgkJCQkJYkZpcnN0Q2hhciA9IEZBTFNFOwoJCQkJfSBlbHNlIGlmIChjID09ICdcbicpIHsKCQkJCQlicmVhazsKCQkJCX0KCQkJfQoJCX0KCiAgICAgICAgaWYgKGMgPj0gJzAnICYmIGMgPD0nOScpIHsKCQkJLy8gd2UndmUgZm91bmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yCiAgICAgICAgICAgIGJyZWFrOwoJCX0KCgkJaWYoIWlvLT5yZWFkX3Byb2MoJmMsIDEsIDEsIGhhbmRsZSkpIHsKCQkJdGhyb3cgRklfTVNHX0VSUk9SX1BBUlNJTkc7CgkJfQogICAgfQoKICAgIC8vIHdlJ3JlIGF0IHRoZSBzdGFydCBvZiBhIG51bWJlciwgY29udGludWUgdW50aWwgd2UgaGl0IGEgbm9uLW51bWJlcgoKICAgIGludCBpID0gMDsKCiAgICB3aGlsZSAoMSkgewogICAgICAgIGkgPSAoaSAqIDEwKSArIChjIC0gJzAnKTsKCgkJaWYoIWlvLT5yZWFkX3Byb2MoJmMsIDEsIDEsIGhhbmRsZSkpIHsKCQkJdGhyb3cgRklfTVNHX0VSUk9SX1BBUlNJTkc7CgkJfQoKCQlpZiAoYyA8ICcwJyB8fCBjID4gJzknKSB7CgkJCWJyZWFrOwoJCX0KICAgIH0KCiAgICByZXR1cm4gaTsKfQoKLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQovLyBQbHVnaW4gSW50ZXJmYWNlCi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCnN0YXRpYyBpbnQgc19mb3JtYXRfaWQ7CgovLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci8vIFBsdWdpbiBJbXBsZW1lbnRhdGlvbgovLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpzdGF0aWMgY29uc3QgY2hhciAqIERMTF9DQUxMQ09OVgpGb3JtYXQoKSB7CglyZXR1cm4gIlBGTSI7Cn0KCnN0YXRpYyBjb25zdCBjaGFyICogRExMX0NBTExDT05WCkRlc2NyaXB0aW9uKCkgewoJcmV0dXJuICJQb3J0YWJsZSBmbG9hdG1hcCI7Cn0KCnN0YXRpYyBjb25zdCBjaGFyICogRExMX0NBTExDT05WCkV4dGVuc2lvbigpIHsKCXJldHVybiAicGZtIjsKfQoKc3RhdGljIGNvbnN0IGNoYXIgKiBETExfQ0FMTENPTlYKUmVnRXhwcigpIHsKCXJldHVybiBOVUxMOwp9CgpzdGF0aWMgY29uc3QgY2hhciAqIERMTF9DQUxMQ09OVgpNaW1lVHlwZSgpIHsKCXJldHVybiAiaW1hZ2UveC1wb3J0YWJsZS1mbG9hdG1hcCI7Cn0KCnN0YXRpYyBCT09MIERMTF9DQUxMQ09OVgpWYWxpZGF0ZShGcmVlSW1hZ2VJTyAqaW8sIGZpX2hhbmRsZSBoYW5kbGUpIHsKCUJZVEUgcGZtX2lkMVtdID0geyAweDUwLCAweDQ2IH07CglCWVRFIHBmbV9pZDJbXSA9IHsgMHg1MCwgMHg2NiB9OwoJQllURSBzaWduYXR1cmVbMl0gPSB7IDAsIDAgfTsKCglpby0+cmVhZF9wcm9jKHNpZ25hdHVyZSwgMSwgc2l6ZW9mKHBmbV9pZDEpLCBoYW5kbGUpOwoKCWlmIChtZW1jbXAocGZtX2lkMSwgc2lnbmF0dXJlLCBzaXplb2YocGZtX2lkMSkpID09IDApCgkJcmV0dXJuIFRSVUU7CgoJaWYgKG1lbWNtcChwZm1faWQyLCBzaWduYXR1cmUsIHNpemVvZihwZm1faWQyKSkgPT0gMCkKCQlyZXR1cm4gVFJVRTsKCglyZXR1cm4gRkFMU0U7Cn0KCnN0YXRpYyBCT09MIERMTF9DQUxMQ09OVgpTdXBwb3J0c0V4cG9ydERlcHRoKGludCBkZXB0aCkgewoJcmV0dXJuIEZBTFNFOwp9CgpzdGF0aWMgQk9PTCBETExfQ0FMTENPTlYgClN1cHBvcnRzRXhwb3J0VHlwZShGUkVFX0lNQUdFX1RZUEUgdHlwZSkgewoJcmV0dXJuICgKCQkodHlwZSA9PSBGSVRfRkxPQVQpIHx8CgkJKHR5cGUgPT0gRklUX1JHQkYpCgkpOwp9CgpzdGF0aWMgQk9PTCBETExfQ0FMTENPTlYKU3VwcG9ydHNOb1BpeGVscygpIHsKCXJldHVybiBUUlVFOwp9CgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpzdGF0aWMgRklCSVRNQVAgKiBETExfQ0FMTENPTlYKTG9hZChGcmVlSW1hZ2VJTyAqaW8sIGZpX2hhbmRsZSBoYW5kbGUsIGludCBwYWdlLCBpbnQgZmxhZ3MsIHZvaWQgKmRhdGEpIHsKCWNoYXIgbGluZV9idWZmZXJbUEZNX01BWExJTkVdOwoJY2hhciBpZF9vbmUgPSAwLCBpZF90d28gPSAwOwoJRklCSVRNQVAgKmRpYiA9IE5VTEw7CglmbG9hdCAqbGluZUJ1ZmZlciA9IE5VTEw7CgoJaWYgKCFoYW5kbGUpIHsKCQlyZXR1cm4gTlVMTDsKCX0KCglCT09MIGhlYWRlcl9vbmx5ID0gKGZsYWdzICYgRklGX0xPQURfTk9QSVhFTFMpID09IEZJRl9MT0FEX05PUElYRUxTOwoKCXRyeSB7CgkJRlJFRV9JTUFHRV9UWVBFIGltYWdlX3R5cGUgPSBGSVRfVU5LTk9XTjsKCgkJLy8gUmVhZCB0aGUgZmlyc3QgdHdvIGJ5dGVzIG9mIHRoZSBmaWxlIHRvIGRldGVybWluZSB0aGUgZmlsZSBmb3JtYXQKCQkvLyAiUEYiID0gY29sb3IgaW1hZ2UKCQkvLyAiUGYiID0gZ3JleXNjYWxlIGltYWdlCgoJCWlvLT5yZWFkX3Byb2MoJmlkX29uZSwgMSwgMSwgaGFuZGxlKTsKCQlpby0+cmVhZF9wcm9jKCZpZF90d28sIDEsIDEsIGhhbmRsZSk7CgoJCWlmKGlkX29uZSA9PSAnUCcpIHsKCQkJaWYoaWRfdHdvID09ICdGJykgewoJCQkJaW1hZ2VfdHlwZSA9IEZJVF9SR0JGOwoJCQl9IGVsc2UgaWYoaWRfdHdvID09ICdmJykgewoJCQkJaW1hZ2VfdHlwZSA9IEZJVF9GTE9BVDsKCQkJfQoJCX0KCQlpZihpbWFnZV90eXBlID09IEZJVF9VTktOT1dOKSB7CgkJCS8vIHNpZ25hdHVyZSBlcnJvcgoJCQl0aHJvdyBGSV9NU0dfRVJST1JfTUFHSUNfTlVNQkVSOwoJCX0KCgkJLy8gUmVhZCB0aGUgaGVhZGVyIGluZm9ybWF0aW9uOiB3aWR0aCwgaGVpZ2h0IGFuZCB0aGUgc2NhbGUgdmFsdWUKCQl1bnNpZ25lZCB3aWR0aCAgPSAodW5zaWduZWQpIHBmbV9nZXRfaW50KGlvLCBoYW5kbGUpOwoJCXVuc2lnbmVkIGhlaWdodCA9ICh1bnNpZ25lZCkgcGZtX2dldF9pbnQoaW8sIGhhbmRsZSk7CgkJZmxvYXQgc2NhbGVmYWN0b3IgPSAxOwoKCQlCT09MIGJSZXN1bHQgPSBwZm1fZ2V0X2xpbmUoaW8sIGhhbmRsZSwgbGluZV9idWZmZXIsIFBGTV9NQVhMSU5FKTsKCQlpZihiUmVzdWx0KSB7CgkJCWJSZXN1bHQgPSAoc3NjYW5mKGxpbmVfYnVmZmVyLCAiJWYiLCAmc2NhbGVmYWN0b3IpID09IDEpID8gVFJVRSA6IEZBTFNFOwoJCX0KCQlpZighYlJlc3VsdCkgewoJCQl0aHJvdyAiUmVhZCBlcnJvcjogaW52YWxpZCBQRk0gaGVhZGVyIjsKCQl9CgoJCS8vIENyZWF0ZSBhIG5ldyBESUIKCQlkaWIgPSBGcmVlSW1hZ2VfQWxsb2NhdGVIZWFkZXJUKGhlYWRlcl9vbmx5LCBpbWFnZV90eXBlLCB3aWR0aCwgaGVpZ2h0KTsKCQlpZiAoZGliID09IE5VTEwpIHsKCQkJdGhyb3cgRklfTVNHX0VSUk9SX0RJQl9NRU1PUlk7CgkJfQoKCQlpZihoZWFkZXJfb25seSkgewoJCQkvLyBoZWFkZXIgb25seSBtb2RlCgkJCXJldHVybiBkaWI7CgkJfQoKCQkvLyBSZWFkIHRoZSBpbWFnZS4uLgoKCQlpZihpbWFnZV90eXBlID09IEZJVF9SR0JGKSB7CgkJCWNvbnN0IHVuc2lnbmVkIGxpbmVXaWR0aCA9IDMgKiB3aWR0aDsKCQkJbGluZUJ1ZmZlciA9IChmbG9hdCopbWFsbG9jKGxpbmVXaWR0aCAqIHNpemVvZihmbG9hdCkpOwoJCQlpZighbGluZUJ1ZmZlcikgewoJCQkJdGhyb3cgRklfTVNHX0VSUk9SX01FTU9SWTsKCQkJfQoKCQkJZm9yICh1bnNpZ25lZCB5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7CQoJCQkJRklSR0JGICpiaXRzID0gKEZJUkdCRiopRnJlZUltYWdlX0dldFNjYW5MaW5lKGRpYiwgaGVpZ2h0IC0gMSAtIHkpOwoKCQkJCWlmKGlvLT5yZWFkX3Byb2MobGluZUJ1ZmZlciwgc2l6ZW9mKGZsb2F0KSwgbGluZVdpZHRoLCBoYW5kbGUpICE9IGxpbmVXaWR0aCkgewoJCQkJCXRocm93ICJSZWFkIGVycm9yIjsKCQkJCX0KCQkJCWZsb2F0ICpjaGFubmVsID0gbGluZUJ1ZmZlcjsKCQkJCWlmKHNjYWxlZmFjdG9yID4gMCkgewoJCQkJCS8vIE1TQgoJCQkJCWZvciAodW5zaWduZWQgeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7CgkJCQkJCVJFVkVSU0VCWVRFUyhjaGFubmVsKyssICZiaXRzW3hdLnJlZCk7CgkJCQkJCVJFVkVSU0VCWVRFUyhjaGFubmVsKyssICZiaXRzW3hdLmdyZWVuKTsKCQkJCQkJUkVWRVJTRUJZVEVTKGNoYW5uZWwrKywgJmJpdHNbeF0uYmx1ZSk7CgkJCQkJfQoJCQkJfSBlbHNlIHsKCQkJCQkvLyBMU0IJCQkJCQoJCQkJCWZvciAodW5zaWduZWQgeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7CgkJCQkJCWJpdHNbeF0ucmVkCQk9ICpjaGFubmVsKys7CgkJCQkJCWJpdHNbeF0uZ3JlZW4JPSAqY2hhbm5lbCsrOwoJCQkJCQliaXRzW3hdLmJsdWUJPSAqY2hhbm5lbCsrOwoJCQkJCX0KCQkJCX0KCQkJfQoKCQkJZnJlZShsaW5lQnVmZmVyKTsKCQkJbGluZUJ1ZmZlciA9IE5VTEw7CgoJCX0gZWxzZSBpZihpbWFnZV90eXBlID09IEZJVF9GTE9BVCkgewoJCQljb25zdCB1bnNpZ25lZCBsaW5lV2lkdGggPSB3aWR0aDsKCQkJbGluZUJ1ZmZlciA9IChmbG9hdCopbWFsbG9jKGxpbmVXaWR0aCAqIHNpemVvZihmbG9hdCkpOwoJCQlpZighbGluZUJ1ZmZlcikgewoJCQkJdGhyb3cgRklfTVNHX0VSUk9SX01FTU9SWTsKCQkJfQoKCQkJZm9yICh1bnNpZ25lZCB5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7CQoJCQkJZmxvYXQgKmJpdHMgPSAoZmxvYXQqKUZyZWVJbWFnZV9HZXRTY2FuTGluZShkaWIsIGhlaWdodCAtIDEgLSB5KTsKCgkJCQlpZihpby0+cmVhZF9wcm9jKGxpbmVCdWZmZXIsIHNpemVvZihmbG9hdCksIGxpbmVXaWR0aCwgaGFuZGxlKSAhPSBsaW5lV2lkdGgpIHsKCQkJCQl0aHJvdyAiUmVhZCBlcnJvciI7CgkJCQl9CgkJCQlmbG9hdCAqY2hhbm5lbCA9IGxpbmVCdWZmZXI7CgkJCQlpZihzY2FsZWZhY3RvciA+IDApIHsKCQkJCQkvLyBNU0IgLSBGaWxlIGlzIEJpZyBlbmRpYW4KCQkJCQlmb3IgKHVuc2lnbmVkIHggPSAwOyB4IDwgd2lkdGg7IHgrKykgewoJCQkJCQlSRVZFUlNFQllURVMoY2hhbm5lbCsrLCAmYml0c1t4XSk7CgkJCQkJfQoJCQkJfSBlbHNlIHsKCQkJCQkvLyBMU0IgLSBGaWxlIGlzIExpdHRsZSBFbmRpYW4KCQkJCQlmb3IgKHVuc2lnbmVkIHggPSAwOyB4IDwgd2lkdGg7IHgrKykgewoJCQkJCQliaXRzW3hdID0gKmNoYW5uZWwrKzsKCQkJCQl9CgkJCQl9CgkJCX0KCgkJCWZyZWUobGluZUJ1ZmZlcik7CgkJCWxpbmVCdWZmZXIgPSBOVUxMOwoJCX0KCQkKCQlyZXR1cm4gZGliOwoKCX0gY2F0Y2ggKGNvbnN0IGNoYXIgKnRleHQpICB7CgkJaWYobGluZUJ1ZmZlcikgZnJlZShsaW5lQnVmZmVyKTsKCQlpZihkaWIpIEZyZWVJbWFnZV9VbmxvYWQoZGliKTsKCgkJaWYoTlVMTCAhPSB0ZXh0KSB7CgkJCUZyZWVJbWFnZV9PdXRwdXRNZXNzYWdlUHJvYyhzX2Zvcm1hdF9pZCwgdGV4dCk7CgkJfQoKCQlyZXR1cm4gTlVMTDsKCX0KCn0KCnN0YXRpYyBCT09MIERMTF9DQUxMQ09OVgpTYXZlKEZyZWVJbWFnZUlPICppbywgRklCSVRNQVAgKmRpYiwgZmlfaGFuZGxlIGhhbmRsZSwgaW50IHBhZ2UsIGludCBmbGFncywgdm9pZCAqZGF0YSkgewoJaWYoIWRpYiB8fCAhaGFuZGxlKSByZXR1cm4gRkFMU0U7CgoJRlJFRV9JTUFHRV9UWVBFIGltYWdlX3R5cGUgPSBGcmVlSW1hZ2VfR2V0SW1hZ2VUeXBlKGRpYik7CglpZigoaW1hZ2VfdHlwZSAhPSBGSVRfUkdCRikgJiYgKGltYWdlX3R5cGUgIT0gRklUX0ZMT0FUKSkgewoJCXJldHVybiBGQUxTRTsKCX0KCgl1bnNpZ25lZCB3aWR0aCAgPSBGcmVlSW1hZ2VfR2V0V2lkdGgoZGliKTsKCXVuc2lnbmVkIGhlaWdodCA9IEZyZWVJbWFnZV9HZXRIZWlnaHQoZGliKTsKCXVuc2lnbmVkIGxpbmVXaWR0aCA9IEZyZWVJbWFnZV9HZXRMaW5lKGRpYik7CgkKCS8vIHNhdmUgaW1hZ2UgYXMgTGl0dGxlIEVuZGlhbgoJY29uc3QgZmxvYXQgc2NhbGVmYWN0b3IgPSAtMS4wRjsKCgljaGFyIGJ1ZmZlcltQRk1fTUFYTElORV07CS8vIHRlbXBvcmFyeSBidWZmZXIgd2hvc2Ugc2l6ZSBzaG91bGQgYmUgZW5vdWdoIGZvciB3aGF0IHdlIG5lZWQKCgkvLyBGaW5kIHRoZSBhcHByb3ByaWF0ZSBtYWdpYyBudW1iZXIgZm9yIHRoaXMgZmlsZSB0eXBlCgoJY2hhciBtYWdpYyA9IDA7CgoJc3dpdGNoKGltYWdlX3R5cGUpIHsKCQljYXNlIEZJVF9SR0JGOgoJCQltYWdpYyA9ICdGJzsJLy8gUkdCRgoJCQlicmVhazsJCgkJY2FzZSBGSVRfRkxPQVQ6CgkJCW1hZ2ljID0gJ2YnOwkvLyBmbG9hdCBncmV5c2NhbGUKCQkJYnJlYWs7CgkJZGVmYXVsdDoKCQkJcmV0dXJuIEZBTFNFOwoJfQoKCS8vIFdyaXRlIHRoZSBoZWFkZXIgaW5mbwoKCXNwcmludGYoYnVmZmVyLCAiUCVjXG4lZCAlZFxuJWZcbiIsIG1hZ2ljLCB3aWR0aCwgaGVpZ2h0LCBzY2FsZWZhY3Rvcik7Cglpby0+d3JpdGVfcHJvYygmYnVmZmVyLCAodW5zaWduZWQgaW50KXN0cmxlbihidWZmZXIpLCAxLCBoYW5kbGUpOwoKCS8vIFdyaXRlIHRoZSBpbWFnZSBkYXRhCglmb3IgKHVuc2lnbmVkIHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsJCgkJQllURSAqYml0cyA9IEZyZWVJbWFnZV9HZXRTY2FuTGluZShkaWIsIGhlaWdodCAtIDEgLSB5KTsKCQlpby0+d3JpdGVfcHJvYyhiaXRzLCAxLCBsaW5lV2lkdGgsIGhhbmRsZSk7Cgl9CgoJcmV0dXJuIFRSVUU7Cn0KCi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLy8gICBJbml0Ci8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCnZvaWQgRExMX0NBTExDT05WCkluaXRQRk0oUGx1Z2luICpwbHVnaW4sIGludCBmb3JtYXRfaWQpIHsKCXNfZm9ybWF0X2lkID0gZm9ybWF0X2lkOwoKCXBsdWdpbi0+Zm9ybWF0X3Byb2MgPSBGb3JtYXQ7CglwbHVnaW4tPmRlc2NyaXB0aW9uX3Byb2MgPSBEZXNjcmlwdGlvbjsKCXBsdWdpbi0+ZXh0ZW5zaW9uX3Byb2MgPSBFeHRlbnNpb247CglwbHVnaW4tPnJlZ2V4cHJfcHJvYyA9IFJlZ0V4cHI7CglwbHVnaW4tPm9wZW5fcHJvYyA9IE5VTEw7CglwbHVnaW4tPmNsb3NlX3Byb2MgPSBOVUxMOwoJcGx1Z2luLT5wYWdlY291bnRfcHJvYyA9IE5VTEw7CglwbHVnaW4tPnBhZ2VjYXBhYmlsaXR5X3Byb2MgPSBOVUxMOwoJcGx1Z2luLT5sb2FkX3Byb2MgPSBMb2FkOwoJcGx1Z2luLT5zYXZlX3Byb2MgPSBTYXZlOwoJcGx1Z2luLT52YWxpZGF0ZV9wcm9jID0gVmFsaWRhdGU7CglwbHVnaW4tPm1pbWVfcHJvYyA9IE1pbWVUeXBlOwoJcGx1Z2luLT5zdXBwb3J0c19leHBvcnRfYnBwX3Byb2MgPSBTdXBwb3J0c0V4cG9ydERlcHRoOwoJcGx1Z2luLT5zdXBwb3J0c19leHBvcnRfdHlwZV9wcm9jID0gU3VwcG9ydHNFeHBvcnRUeXBlOwoJcGx1Z2luLT5zdXBwb3J0c19pY2NfcHJvZmlsZXNfcHJvYyA9IE5VTEw7CglwbHVnaW4tPnN1cHBvcnRzX25vX3BpeGVsc19wcm9jID0gU3VwcG9ydHNOb1BpeGVsczsKfQo=